M@*ìdÜTÌD¼ 4 ¬ $œŒ|ôlä\ÔLĈ ‰Ú‰¨Šv‹DŒ�à�®Ž|�J�‘æ‘´’‚“P”•앺–ˆ—V˜$™ò™ÀšŽ›\œ*�ø�Æž”Ÿb 0¡þ¡Ì¢š£h¤6¥¦Ò¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂü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§NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNpNNNNNNNý€Ë�™‚gƒ5„…Ñ…Ÿ†m‡;ˆ ‰×‰¥Šs‹AŒ�Ý�«Žy�G�‘㑱’“M”•é•·–…—S˜!™ï™½š‹›Yœ'�õ�Þ‘Ÿ_ -¡û¡É¢—£e¤3¥¦Ï¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ«©NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ îÄNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þθNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ!sNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ‹ÕNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ%a‹NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ+B„NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þþúNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ1NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ»—NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þW/NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þt NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ ž~NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ&4ØNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ,ÛNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þÍËNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ "NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þˆ¦NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þdNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þGNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ!­ONNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ'éNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ-è"NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þT\NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ wSNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ›ëNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ1MNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þÞ†NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ"øNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ(×NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ.½qNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þgmNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ DbNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ¨ÚNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ|NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þí·NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ#Ë-NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ)$æNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ/Ž@NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ2>NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ ÝõNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þý‰NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þBNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ¸äNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ$RºNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ*qµNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ0� NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNN�Î�›‚hƒ6„…Ò… †n‡<ˆ ‰Ö‰¤Šr‹@Œ�Û�©Žw�E�‘ᑯ’}“K”•啳–�—O˜™ë™¹š‡›Uœ#�ñ�¿žŽŸ\ +¡ø¡Æ¢”£b¤0¥þ¥Ë¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þENNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûHBIO300 Z80€ HBIO300 Z80€ HBIO305 Z80€HBIO305 Z80€ !ëÒÿNNNNNNNNNNNNNNNNN¡¡¡þ­ãNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHBIO310 Z80€¦§¨©ª«¬­HBIO310 Z80w®¯°±²³´µHBIO311 Z80€¶·¸¹º»¼½HBIO311 Z80€¾¿ÀÁÂÃÄÅTkÿ‰NNNNNNNNNNNNNNNN¡¡¡þ B(NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûFBIO306 Z80€STUVWXYZFBIO306 Z80€[\]^_`abFBIO306 Z80€cdefghijFBIO306 Z800klmz!ÿNNNNNNNNNNNNNNNN¡¡¡þbTNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ�ŸNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ'9NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ%ÍgNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûENTIAL CODE) LSTINC EQU FALSE ;LIST INCLUDE FILES HARDBT EQU TRUE ;HARD DISK BOOT (FALSE= FLOPPY BOOT) USEMON EQU TRUE ;USû=ÿnNNNNNNNNNNNNNNNNN¡¡¡þ+îhNNNNNNNNNNNNNNNNNNNNNN¡¡¡û3 OF HARD DISK PHYSICAL DRIVE 0 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; D SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 S„ÿ'NNNNNNNNNNNNNNNNN¡¡¡þRNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHBIO305 Z80n"#$%&'(BIOSFUNSDOC)*HBIO314 Z80€+,-./01uHBIO313 Z80€23456789TiÿãNNNNNNNNNNNNNNNNN¡¡¡þ½ÝNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHBIO311 Z80UÆÇÈÉÊËFBIO305 Z80€ÌÍÎÏÐÑÒÓFBIO305 Z80€ÔÕÖרÙÚÛFBIO305 Z80nÜÝÞßàáâœÿäNNNNNNNNNNNNNNNN¡¡¡þ{NNNNNNNNNNNNNNNNNNNNNNð¡¡¡ûBFTST C hnopqrstHBIO314 Z80€vwxyz{|}HBIO314 Z80€~€�‚ƒ„…HBIO314 Z80'†‡ˆ Ýÿ²NNNNNNNNNNNNNNNN¡¡¡þûÃNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þØÌNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ 2’NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ&˜4NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE MONITOR ROM I/O ROUTINES IF TRUE INTRPTS EQU TRUE ;ENABLE INTERRUPT PROCESSING WHISTLE INTCPTS EQU TRUE ;ENABLE SYSTEM CAL+–ÿþNNNNNNNNNNNNNNNNNN¡¡¡þ,wÿNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û ; E JADE 8" FLOPPY PHYSICAL DRIVE 0 ; F JADE 8" FLOPPY PHYSICAL DRIVE 1 ; G JADE 5" FLOPPY PHYSICAL DRIVE 0 ; H JADEèeÿrNNNNNNNNNNNNNNN¡¡¡þa'NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHBIO313 Z80€:;<=>?@AHBIO313 Z80€BCDEFGHIHBIO313 Z80&JKLHBIO315 Z80€MNOPQRSTœ½ÿðNNNNNNNNNNNNNNNNN¡¡¡þ ŽìNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFBIO313 Z80€ãäåæçèéêFBIO313 Z80€ëìíîïðñòFBIO313 Z80€óôõö÷øùúFBIO313 Z80/ûüýÝAÿÎNNNNNNNNNNNNNNNNN¡¡¡þ$JNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûHBIO302 Z80€Ž��‘’“”•HBIO302 Z80€–—˜™š›œ�HBIO302 Z80lžŸ ¡¢£¤FBIO301 Z80€¥¦§¨©ª«¬ÚÿHBIO309 Z80€?@ABCDEFHBIO309 Z80tGHIJKLMNHBIO300 Z80^OPQRŒ�Y_ÿÉNNNNNNNNNNNNNNNN¡¡¡þQeNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ¾®NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ$þVNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûAGS ; ;============================================================================ SHORT EQU TRUE ;SHORT BIOS (REMOVES UNESAµÿÂNNNNNNNNNNNNNNNN¡¡¡þ*ÝYNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; CPM ; DRIVE USAGE IF BOOT = 'H' ;HARD DISK BOOT CONFIG. ; A SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; B SIDE 2 & 7£ÿ|NNNNNNNNNNNNNNNN¡¡¡þ01áNNNNNNNNNNNNNNNNNNNNNN¡¡¡û PHYSICAL DRIVE 1 ENDIF IF BOOT = 5 ; G JADE 8" FLOPPY PHYSICAL DRIVE 0 ; H JADE 8" FLOPPY PHYSICAL DRIVE 1 ; As+ÿNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN8NNNNNNNý€Ë�š‚gƒ5„…Ñ…Ÿ†m‡;ˆ ‰×‰¤Šq‹@Œ�Ü�«Žy�G�‘ã‘°’“M”•é•·–…—S˜!™ï™½šŠ›Xœ&�ô�Áž�Ÿ\ *¡÷¡Å¢“£a¤.¥ü¥Ê¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ0uNNNNNNNNNNNNNNNNNNNNNN¡¡¡û JADE 5" FLOPPY PHYSICAL DRIVE 0 ; B JADE 5" FLOPPY PHYSICAL DRIVE 1 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; D S½VþrNNNNNNNNNNNNNNNN¡¡¡þšÓNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûORT BITS. ; ; 2.2.7 - 8 MAR 83 GRH ; ADDED CLOCK/CALENDAR DRIVER, SYSTEM CALL INTERCEPT, ; ILLEGAL SYSTEM CALL MESSAGE, CHAN\�ÿ_ŽNNNNNNNNNNNNNNNNN¡¡¡þ uNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûy ; ; 2.02 - 2 JUN 84 GRH ; Change floppy disk drivers to relate to ISASI control of JADE ; FDC. ; Change IOPB sector 5BÿINNNNNNNNNNNNNNNN¡¡¡þUdNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûoppy firmware support. ; Implemented disk drive driver tables and new function to return ; a ptr to a drive table. ; RemovedQ®þHNNNNNNNNNNNNNNNN¡¡¡þº¯NNNNNNNNNNNNNNNNNNNNNN¡¡¡û3C00H ;ADDRESS OF BDOS BIOS: EQU CPMBS + 4A00H ;ADDRESS OF BDOS BIOSR: EQU 1000H - BIOS ; PAGE0: EQU 0 ;START OF CP/M RAM €òþNNNNNNNNNNNNNNNNNN¡¡¡þ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOOT = 'H' LASTSEC EQU 46 + 1 ;LAST BOOT SECTOR ; STHD EQU 0 ;START LOGICAL DRIVE OF HARD DISK NDHD EQU 3 ;LAST LOGICAL DRÈüþNNNNNNNNNNNNNNNNN¡¡¡þ%úWNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûGICAL DRIVE OF HARD DISK NDHD EQU 3 ;LAST LOGICAL DRIVE OF HARD DISK ST8FD EQU 4 ;START LOGICAL DRIVE OF 8" FLOPPY ND8FD EQ}™þNNNNNNNNNNNNNNNNN¡¡¡þ+ÙXNNNNNNNNNNNNNNNNNNNNNN¡¡¡û;============================================================================ CALROM EQU 7 ;CALENDAR ROM SELECT # RDBENT EQU eþ9NNNNNNNNNNNNNNNN¡¡¡þe&NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 0 ; E SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; F SIDE 2 & 3 OF HARD DISK PHYSICAL K¯þNNNNNNNNNNNNNNNNNN¡¡¡þŠíNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûGED BIOS SIZE TO END ; OF INITIALIZED DATA AREA. RESTRUCTURE MODULES. ; ; 2.28 - 22 APR 83 GRH ; CHANGED DEFINITIONS TO ALJDþ‰NNNNNNNNNNNNNNNN¡¡¡þ KNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûvalue from physical sector (1..n) to logical ; sector value (0..n-1). This maintains more uniformity in ; parameter pass8rþüNNNNNNNNNNNNNNNNN¡¡¡þÌóNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û init of IOBYTE. ; Implemented 5" floppy driver. ; Implemented use of ROM primitives. ; Moved system down to 60k. ; VERSN E¥Ðþ$NNNNNNNNNNNNNNNN¡¡¡þïüNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûIOBYTE: EQU PAGE0 + 3 ;IOBYTE ADDR DEFDRV: EQU PAGE0 + 4 ;DEFAULT DRIVE PARAM ADDR DKPROM EQU PAGE0 + 40H ;DISK PRIMITIVES PROaþrNNNNNNNNNNNNNNNN¡¡¡þ ¢NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIVE OF HARD DISK ST8FD EQU 4 ;START LOGICAL DRIVE OF 8" FLOPPY ND8FD EQU 5 ;LAST LOGICAL DRIVE OF 8" FLOPPY ST5FD EQU 6 ;SÜJþÿNNNNNNNNNNNNNNNNN¡¡¡þ&¯NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûU 5 ;LAST LOGICAL DRIVE OF 8" FLOPPY ST5FD EQU 6 ;START LOGICAL DRIVE OF 5" FLOPPY ND5FD EQU 7 ;LAST LOGICAL DRIVE OF 5" FL[þNNNNNNNNNNNNNNNNNN¡¡¡þ,@ÏNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û0F800H ;READ CLOCK BUFFER ENTRY SETENT EQU RDBENT + 3 ;SET CLOCK ENTRY CALENT EQU RDBENT + 6 ;RETURN CALENDAR ENTRY TIMENT EÏEÿÈNNNNNNNNNNNNNNNN¡¡¡þVNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDRIVE 1 ENDIF ; ;************************************************************* ; REVISIONS: ; ; 2.2.0 - RELEASE ; PÚþ�NNNNNNNNNNNNNNNNN¡¡¡þ ¹ÜNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLOW BIG DIRECTORIES. ; DISALLOWED DRIVES C & D. ; ; 2.29 - 3 SEP 83 GRH ; Changed Rev # for blocked DCM. Enables IBM syste°ÿÿNNNNNNNNNNNNNNNN¡¡¡þzNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûing between hard disk & JADE floppy IOPBs. ; Vector I/O routines to monitor rom routines. ; ; 2.03 - 4 JUN 84 GRH ; Add be¾‹þNNNNNNNNNNNNNNNNN¡¡¡þÿÂNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûQU '00' ; ;**************************************************************************** SUBTTL SYSTEM DECLARATIONS ;=====mþrNNNNNNNNNNNNNNNN¡¡¡þÜÍNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûM # (STORED BY DKBOOT) DEFBFR EQU PAGE0 + 80H ;DEFAULT BUFFER TPA: EQU 100H ;============================================{êþNNNNNNNNNNNNNNNNN¡¡¡þ!6“NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûTART LOGICAL DRIVE OF 5" FLOPPY ND5FD EQU 7 ;LAST LOGICAL DRIVE OF 5" FLOPPY ENDIF IF BOOT = 8 LASTSEC EQU 45 ;LAST q°ÿzNNNNNNNNNNNNNNNN¡¡¡þ'œ5NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOPPY ENDIF ;============================================================================ ; ; THE FOLLOWING 2 PARAMETE2UþñNNNNNNNNNNNNNNNNN¡¡¡þ-sþNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûQU RDBENT + 9 ;RETURN TIME ENTRY DKPENT EQU RDBENT + 0CH ;DISK PRIMITIVES ENTRY ;=========================================ƒÜþ“NNNNNNNNNNNNNNNNN¡¡¡þÏ€NNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡û ; 2.2.3 - SWAPPED DCM & BIOS SECTORS ON DISK, ALLOWING A ; LARGER BIOS ALLOCATION ON THE DISK. ; ; 2.2.4 - ADDED NAKED T¶/ÿÈNNNNNNNNNNNNNNNN¡¡¡þ ì�NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûm 34 ; 256 bytes per sector disks to be read. ; ; 1.10 - 23 SEP 83 GRH ; Move clock-calendar routines to ROM. Add Interrup[^þÉNNNNNNNNNNNNNNNN¡¡¡þ7NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûlls & whistles again. ; Move to 61k system. ; ; 2.04 - 30 MAR 85 GRH ; Implemented hard disk drive 1 as C: & D:. ; ImplemsWþßNNNNNNNNNNNNNNNNN¡¡¡þª‘NNNNNNNNNNNNNNNNNNNNNN¡¡¡û======================================================================= ; ; DISK OPERATING SYSTEM ADDRESSES ; ;===========ýþNNNNNNNNNNNNNNNNN¡¡¡þEZNNNNNNNNNNNNNNNNNNNNNN¡¡¡û================================ ; ; OTHER DECLARATIONS ; ;=================================================================’`þNNNNNNNNNNNNNNNNN¡¡¡þ"cÀNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBOOT SECTOR ; STHD EQU 0 ;START LOGICAL DRIVE OF HARD DISK NDHD EQU 3 ;LAST LOGICAL DRIVE OF HARD DISK ST8FD EQU 4 ;STARTÊjþNNNNNNNNNNNNNNNNNN¡¡¡þ(Œ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRS MUST REFLECT THE MAX DISK SIZE & ; THE MAX DIRECTORY SIZE. ; ;============================================================äÚþßNNNNNNNNNNNNNNNN¡¡¡þ.&­NNNNNNNNNNNNNNNNNNNNNN¡¡¡û=================================== ; ; ASCII CHARS ; ;===================================================================== ~ÿòNNNNNNNNNNNNNNNNN¡¡¡þü±NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûERMINAL DRIVERS & IOBYTE IN ; ANTICIPATION OF THE MONITOR. ALSO, ALL REFERENCES ; REQUIRING THE I/O PROMS TO BOOT HAS Ùòþ!NNNNNNNNNNNNNNNN¡¡¡þ ß¾NNNNNNNNNNNNNNNNNNNNNN¡¡¡ût handler ; (Mode 2). Change Revision display of sign-on (separate CBIOS rev). ; ; 2.00 - 24 MAR 84 GRH ; Modify for hard Býþ NNNNNNNNNNNNNNNNN¡¡¡þ3NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûented the Logon function for the hard disk. ; Implemented user friendly disk error options: Abort, Retry, Ignore. ; Solved warrˆÿùNNNNNNNNNNNNNNNN¡¡¡þ™ NNNNNNNNNNNNNNNNNNNNNN¡¡¡û================================================================= NKSYS: EQU 60 ;SYSTEM SIZE IN K BYTES KBYTE: EQU 1024 CPMS“qÿòNNNNNNNNNNNNNNNNN¡¡¡þvkNNNNNNNNNNNNNNNNNNNNNN¡¡¡û=========== DEFIOB: EQU 80H ;INITIAL IOBYTE VALUE (LPT ON) DFDRV: EQU 0 ;INITIAL DEFAULT DRIVE SECSZ: EQU 128 NDRVS: EQU 8ûsþNNNNNNNNNNNNNNNN¡¡¡þ#PñNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LOGICAL DRIVE OF 8" FLOPPY ND8FD EQU 5 ;LAST LOGICAL DRIVE OF 8" FLOPPY ST5FD EQU 6 ;START LOGICAL DRIVE OF 5" FLOPPY ND5F …þBNNNNNNNNNNNNNNNN¡¡¡þ)¿:NNNNNNNNNNNNNNNNNNNNNN¡¡¡û================ ALLSIZ EQU 33 ;ALLOCATION BIT MAP SIZE (1 BYTE PER 8 CLUSTERS) CHKSIZ EQU 32 ;DIRECTORY CHECKSUMS ARRAY SIZ�ÔÿÂNNNNNNNNNNNNNNNN¡¡¡þ/œNNNNNNNNNNNNNNNNNNNNNN¡¡¡û======= LF: EQU 0AH CR: EQU 0DH CTRLZ: EQU 1AH ;==========================================================================ñ÷þNNNNNNNNNNNNNNNNN¡¡¡þ©âNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBEEN REMOVED. ; ; 2.2.5 - RECONFIGURE FOR 62K SYSTEM. ; ; 2.2.6 - 20 FEB 83 ; DOUBLE D REV C UPGRADE. CHANGE BOARD STATUS P�¿þINNNNNNNNNNNNNNNN¡¡¡þ F)NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûdisk ; ; 2.01 - 28 APR 84 GRH ; Change hard disk DPB to reflect half size directory, but keep ; allocation for 1k director�Cþ NNNNNNNNNNNNNNNN¡¡¡þfUNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûm boot hang problem by reseting host adapter if busy. ; ; 3.00 - 26 JAN 87 GRH ; Implemented new common IOPB code & Jade flDÿþNNNNNNNNNNNNNNNNN¡¡¡þ‰žNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûZ: EQU KBYTE * NKSYS CPMBS: EQU CPMSZ - (20 * KBYTE) ; CP/M BIAS VALUE CCP: EQU CPMBS + 3400H ;ADDR OF CCP BDOS: EQU CPMBS + hAþNNNNNNNNNNNNNNNNN¡¡¡þ#8NNNNNNNNNNNNNNNNNNNNNN¡¡¡û BTDIRS EQU 2 + 1 ;HARD DISK SYSTEM TRACKS DIRECTORY SECTOR BTCCPO EQU 3 ;OFFSET TO CCP ENTRY IN SYS TRKS DIRECTORY IF B™þœNNNNNNNNNNNNNNNN¡¡¡þ$ÉfNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD EQU 7 ;LAST LOGICAL DRIVE OF 5" FLOPPY ENDIF IF BOOT = 5 LASTSEC EQU 19 ;LAST BOOT SECTOR ; STHD EQU 0 ;START LO” ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ*êiNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE (1 BYTE PER DIR. SECTOR) ;============================================================================ ; ; ADDRESSES ; ¹›þöNNNNNNNNNNNNNNNNN¡¡¡þ0ÑNNNNNNNNNNNNNNNNNNNNNN¡¡¡û== ; ; INCLUDE JDDCONT.DEF ; INCLUDE COMIOPB.DEF ; INCLUDE JDDDISK.DEF ; INCLUDE MONBOARD.DEF ; INCLUDE IOBOARD.DEF ; INCzþ~NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN@NNNNNNNNN�Ï�ž‚kƒ9„…Õ…£†p‡=ˆ ‰Ú‰§Šu‹DŒ�à�¯Ž}�K�‘葵’„“R” •–Š—V˜%™ó™ÁšŽ›[œ)�ø�Åž“Ÿa 0¡ý¡Ë¢™£g¤5¥¦Ñ¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þqñNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûLUDE NAKEDT.DEF ; INCLUDE ISHA.DEF ; INCLUDE CLOCK.DEF ; ;==================================================================]ªÿÿNNNNNNNNNNNNNNNNN¡¡¡þÛWNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûRFLOW NXTSEC DL NXTSEC - #SECTORS ;; IF NXTSEC <= LOWEST ;CHECK FOR REPEAT NXTSEC DL LOWEST + 1 LOWEST DL NXTSEC END¼ÿÀþNNNNNNNNNNNNNNNNN¡¡¡þ 4œNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûISKWR ;PERFORM DISK WRITE JP LISTST ;RETURN LIST STATUS JP SECTRN ;TRANSLATE SECTOR JP RETDVRT ;RETURN DRIVER TABLE ADúòÿnNNNNNNNNNNNNNNNN¡¡¡þàNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSECTOR BUFFER STARTS HERE AFTER CRUNCHING COLD START ; CODE. THIS BUFFER IS USED BY THE CP/M DIRECTORY CHECK ROUTINES THAT ; Æÿ�NNNNNNNNNNNNNNNN¡¡¡þû+NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûO: LD HL,MSGSO CALL EDITOR ; ; MODIFY COLD START VECTOR TO WARM START ; LD HL,(BIOS+4) LD (BIOS+1),HL ; ; BOOT CCt›ÿüNNNNNNNNNNNNNNNNN¡¡¡þQ�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û- ; ; WARM REBOOT ENTRY LOADS CCP,BDOS FROM DISK & ; SETS UP VARIABLES ; ;-------------------------------------------------Û1ÿNNNNNNNNNNNNNNNNN¡¡¡þ%»ÓNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPTER TO CLEAR HANG OUT (HCMD),A XOR A,A OUT (HCMD),A ; EX (SP),HL ; DELAY FOR HOST ADAPTER TO CATCH UP EX (SP),HL ñ—ÿNNNNNNNNNNNNNNNNN¡¡¡þ+˜ÜNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûC,2 ;START WITH SECTOR #2 ENDIF LD B,0 CALL SETSEC ; ; READ CCP/BDOS ; WREAD: CALL DISKRD JR NZ,WEROR ;IF ERRORÙfÿòNNNNNNNNNNNNNNNN¡¡¡þ$¢NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û========== LIST OFF *INCLUDE JDDCONT.DEF *INCLUDE COMIOPB.DEF *INCLUDE JDDDISK.DEF *INCLUDE MONBOARD.DEF *INCLUDE IOBOARDFÿòNNNNNNNNNNNNNNNN¡¡¡þËiNNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡ûIF ENDIF ;; ENDM LIST ON ENDM SUBTTL BIOS CODE ORG BIOS ;-----------------------------------------------------÷cÿ NNNNNNNNNNNNNNNN¡¡¡þaÏNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûDR INDEXED BY C FUNC ;############################################################################ ; ; THESE BOOT PARAMS MU¡íÿNNNNNNNNNNNNNNNNNN¡¡¡þ�wNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û CHECK FOR DISK CHANGE. ; ;############################################################################ DIRBF: EQU $ ;BUFFERsÿHNNNNNNNNNNNNNNNN¡¡¡þ®xNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûP & BDOS ; JR WARM ;############################################################################ ; ; SIGN-ON MESSAGE _uÿÈNNNNNNNNNNNNNNNN¡¡¡þ D&NNNNNNNNNNNNNNNNNNNNNN¡¡¡û--------- WARM: IF INTRPTS ; ; SET INTERRUPT VECTOR TABLE BASE ; LD A,HIGH INTABL LD I,A ; ; SET INTERRUPT MODEPnÿÿNNNNNNNNNNNNNNNNN¡¡¡þ&î€NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; CALL HDXWT ; WHILE BUSY THEN WAIT NTHUNG: ENDIF ; ; LOG ON DRIVE TO INIT TABLES ; LD A,(DKPROM + 1) AND A,3 œOÿNNNNNNNNNNNNNNNNNN¡¡¡þ,KNNNNNNNNNNNNNNNNNNNNNN¡¡¡û THEN EXIT ; LD A,(BTSEC) ;IF LAST SECTOR THEN DONE CP A,LASTSEC JR NC,WZRPG ; INC A ;NEXT SECTOR LD (BTSEC),A ; ö£ÿ“NNNNNNNNNNNNNNNN¡¡¡þ“NNNNNNNNNNNNNNNNNNNNNN¡¡¡û.DEF *INCLUDE NAKEDT.DEF *INCLUDE ISHA.DEF *INCLUDE CLOCK.DEF LIST ON ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@'dÿHNNNNNNNNNNNNNNNNN¡¡¡þ øXNNNNNNNNNNNNNNNNNNNNNN¡¡¡û----------------------- ; ; BIOS JUMP VECTOR TABLE ; ;--------------------------------------------------------------------ôHÿ€NNNNNNNNNNNNNNNN¡¡¡þRþNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûST RESIDE AS DEFINED RIGHT BEFORE THE COLD ; INIT ROUTINE START AND MUST BE IN THE 1ST SECTOR. ; THESE 2 WORDS ARE REFERENCEÌçÿNNNNNNNNNNNNNNNNN¡¡¡þ¾FNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û BEGINNING ;---------------------------------------------------------------------------- ; ; INIT - COLD START ENTRY çVÿÎNNNNNNNNNNNNNNNNN¡¡¡þ�INNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ;############################################################################ MSGSO: DB CR,LF DB CPMSZ / (KBYTE * 10) + '0å°ÿNNNNNNNNNNNNNNNNN¡¡¡þ!wNNNNNNNNNNNNNNNNNNNNNN¡¡¡û TO 2 ; IM 2 ; ; ENABLE INTERRUPT VECTOR 7 ; IN A,(INTMSK) AND A,7FH OUT (INTMSK),A ; ; FINALLY ENABLE VECTOREÝóÿúNNNNNNNNNNNNNNNN¡¡¡þ'ݱNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;MODULO 4 LD C,A LD E,0 CALL SELDSK LD A,L ;IF ERROR THEN ABORT OR A,H JR Z,WEROR IF BOOT = 'H' ; ; READ B6#ÿ®NNNNNNNNNNNNNNNNN¡¡¡þ-2zNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD DE,SECSZ ;DMA := DMA + SECTOR SIZE LD HL,(BTDMA) ADD HL,DE LD (BTDMA),HL JR WREAD ; ; ; WARM BOOT ERROR, OUTPUTÎVÿçNNNNNNNNNNNNNNNNN¡¡¡þŽNNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE THE TRANSLATION TABLE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@/nÿ“NNNNNNNNNNNNNNNN¡¡¡þ ­ NNNNNNNNNNNNNNNNNNNNNN¡¡¡û-------- JP INIT1 ;COLD START ENTRY JP WARM ;RELOAD CCP/BDOS JP CNSCK ;GET CONSOLE STATUS JP CI ;CONSOLE INPUT JP æ\ÿNNNNNNNNNNNNNNNNNN¡¡¡þA³NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD BY THE BOOT CODE IN ; ORDER TO FIND THE LOAD ADDRESS FOR THE BIOS & IT'S LENGTH. ; ;######################################sOÿ@NNNNNNNNNNNNNNNNN¡¡¡þëNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFROM BOOT MUST SET ALL BIOS PARAMS ; ;---------------------------------------------------------------------------- INIT: ; êÌÿgNNNNNNNNNNNNNNNNN¡¡¡þÞNNNNNNNNNNNNNNNNNNNNNN¡¡¡û' DB (CPMSZ MOD (KBYTE * 10)) / KBYTE + '0' DB 'K CP/M-80 Vers 2.2',CR,LF DB 'M5b CBIOS Vers 3.' DM HIGH VERSN , LOW1zÿÂNNNNNNNNNNNNNNN¡¡¡þ""DNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD INTERRUPTS ; IN A,(MONSTS) OR A,MONIE OUT (MONSTS),A EI ENDIF ; ; SET TEMPORARY STACK ; LD SP,DEFBFR ; ; {qÿÉNNNNNNNNNNNNNNNNN¡¡¡þ(Í�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOOT DIRECTORY ; LD BC,DEFBFR CALL SETDMA LD BC,BTDIRS CALL SETSEC LD BC,0 ELSE LD BC,1 ENDIF CALL SETTR"–ÿ_NNNNNNNNNNNNNNNN¡¡¡þ.g)NNNNNNNNNNNNNNNNNNNNNN¡¡¡û MSG & HALT ; WEROR: LD HL,MSGLE ;OUTPUT ERROR MESSAGE CALL EDITOR HALT ; ; ; BOOT OK, INIT PAGE 0 ; WZRPG: ; ; ÿéÿ­NNNNNNNNNNNNNNNNN¡¡¡þ½5NNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@ GXLATE MACRO #SECTORS, #SKEW LIST OFF NXTSEC DL 1 ;;START WITH SECTOR 1 LOWEST DL 1 ;; REPT ÿ9NNNNNNNNNNNNNNNN¡¡¡þ ž:NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûCOC ;CONSOLE OUTPUT JP LO ;PRINTER OUTPUT JP PUNCH JP READER JP HOME ;HOME SELECTED DRIVE JP SELDSK ;SELECT DISK DãÿNNNNNNNNNNNNNNNN¡¡¡þr‚NNNNNNNNNNNNNNNNNNNNNN¡¡¡û###################################### BIOSSZ: DW BIOSND - BIOS ;BIOS MODULE SIZE IN BYTES BIOSST: DW BIOS ;BIOS MODULE LOAD çàÿþNNNNNNNNNNNNNNNN¡¡¡þØ$NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; SET TEMPORARY STACK ; LD SP,DEFBFR ;USE PAGE 0 FOR STACK ; ; MAKE SURE ROM IS ENABLED ; CALL GETMON ; ; INIT Dñ¨ÿNNNNNNNNNNNNNNNNNN¡¡¡þ7ïNNNNNNNNNNNNNNNNNNNNNN¡¡¡û VERSN,CR,LF IF $ > (DIRBF + SECSZ) CONMSG **** WARNING! COLD INIT CODE BIGGER THAN DIR BUFFER **** ELSE DS DIR·ÿÂNNNNNNNNNNNNNNNN¡¡¡þ#uNNNNNNNNNNNNNNNNNNNNNN¡¡¡û INSURE MONITOR ROM STILL ENABLED ; CALL GETMON ; IF BOOT = 'H' ; TEST ISHA HOST ADAPTER FOR A HUNG CONDITION AND CLÀ<ÿäNNNNNNNNNNNNNNNN¡¡¡þ)þ¾NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûK ; IF BOOT = 'H' CALL DISKRD JR NZ,WEROR ; ENDIF LD BC,CCP ;SET LOAD ADDR CALL SETDMA ; IF BOOT = 'H' y.ÿÂNNNNNNNNNNNNNNNN¡¡¡þ/TNNNNNNNNNNNNNNNNNNNNNN¡¡¡û INIT BIOS WARM START IN PAGE 0 ; LD A,0C3H LD HL,BIOS + 3 LD (PAGE0),A LD (PAGE0 + 1),HL ; ; INIT BDOS CALL VECTORÈÿÿÎNNNNNNNNNNNNNNNNN¡¡¡þèfNNNNNNNNNNNNNNNNNNNNNN¡¡¡û#SECTORS LIST ON DB NXTSEC LIST OFF NXTSEC DL NXTSEC + #SKEW ;ADD SKEW FACTOR ;; IF NXTSEC > #SECTORS ;CHECK FOR OVEºÿdNNNNNNNNNNNNNNNN¡¡¡þ ­NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRIVE JP SETTRK ;SET TRACK # JP SETSEC ;SET SECTOR # JP SETDMA ;SET TRANSFER ADDR JP DISKRD ;PERFORM DISK READ JP DˆÿùNNNNNNNNNNNNNNNN¡¡¡þ'ÑNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûADDR FOR SBD INIT1: JR INIT ;############################################################################ ; ; DIRECTORY Áƒÿ¾NNNNNNNNNNNNNNNNN¡¡¡þÈNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEFAULT DRIVE ; LD A,(DKPROM + 1) ;USE DRIVE # PASSED IN PAGE 0 AND A,3 LD (DEFDRV),A ; ; SEND SYSTEM SIGN-ON ; CLOGÙâÿÿNNNNNNNNNNNNNNNNN¡¡¡þb¼NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBF+SECSZ-$ ;FILL OUT DIRECTORY BUFFER TO 1 SECTOR SIZE ENDIF ;---------------------------------------------------------‰íÿNNNNNNNNNNNNNNNNNN¡¡¡þ$ˆâNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûEAR IF TRUE ; IN A,(HSTATUS) ;IF HOST ADAPTER BUSY THEN BIT HBUSYB,A JR Z,NTHUNG ; LD A,1 SHL HRESET ; RESET HOST ADA5lÿ“NNNNNNNNNNNNNNNNN¡¡¡þ*«íNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD A,(DEFBFR + BTCCPO) ;GET START OF CP/M IMAGE FROM DIRECTORY INC A ;MAKE SECTOR {0..N} -> {1..N+1} LD C,A ELSE LD Õ*ÿNNNNNNNNNNNNNNNNN¡¡¡þ0GUNNNNNNNNNNNNNNNNNNNNNN¡¡¡û IN PAGE 0 ; LD HL,BDOS + 6 LD (PAGE0 + 5),A LD (PAGE0 + 6),HL ; ; SET DEFAULT SECTOR BUFFER ; LD BC,DEFBFR CALLó}ÿüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNý€Ë�™‚gƒ5„…Ð…�†k‡8ˆ‰Ö‰¤Šq‹?Œ�Û�©Žw�E�‘à‘®’|“J”•䕲–€—N˜™é™·š…›Sœ �î�»ž‰ŸW &¡ó¡Á¢�£]¤+¥ù¥Æ¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þFÁNNNNNNNNNNNNNNNNNNNNNN¡¡¡û SETDMA ; IF INTCPTS ; ; PUT BDOS VECTOR INTO INTERCEPT CODE ; LD HL,(BDOS + 7) LD (BDOSV),HL ; ; NOW PUT INTERãêÿðNNNNNNNNNNNNNNNNN¡¡¡þìgNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++ DISKRD: LD A,DDRDS ;SELECT READ OP JR DISKOP ;+++++++++++++++´ÜþþNNNNNNNNNNNNNNNNN¡¡¡þ ¬NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûO),HL ; LD A,DDLOG JR DISKOP2 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CO2˜þ'NNNNNNNNNNNNNNNN¡¡¡þ#ÐNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûER RETURNS HERE ; DKOPRET: POP IY ; ; IF NO ERRORS THEN RETURN ZF ; RET Z ;IF NO_ERROR THEN RETURN ; ; PRINT ER·…ÿäNNNNNNNNNNNNNNNN¡¡¡þÌNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRN TO CALLER JR Z,DKOPLP ; ; ELSE IF ABORT THEN DO WARM BOOT ; CP A,'A' ;IF ABORT THEN RE-BOOT JP Z,0 ; ; ELSE I_;þ(NNNNNNNNNNNNNNNNN¡¡¡þf½NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LOGICAL DRIVE ; LD A,(BTDRV) ;IF EVEN THEN ADD 0 ELSE ADD 128 RRCA AND A,80H LD E,A ;COMPUTE SECTOR LD D,0 LD HLÖWþñNNNNNNNNNNNNNNNN¡¡¡þ%ŒãNNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************************* HDXWT: IN A,(HSTATUS) BIT HBUSYB,A RET Z JR HDXWT ;+++++++++++++++++++++#˜þ!NNNNNNNNNNNNNNNN¡¡¡þ+¯ìNNNNNNNNNNNNNNNNNNNNNN¡¡¡û FETCH DRIVER EXECUTION ADDRESS ; CALL RETDVRT ;DRIVE IS STILL IN C REGISTER LD (DVRTPTR),HL ; ; PREFETCH DRIVER EXEC+ãþHNNNNNNNNNNNNNNNNN¡¡¡þ’NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCEPT VECTOR INTO BDOS CODE ; LD HL,INTCPT LD (BDOS + 7),HL ; ; INITIALIZE CLOCK VECTORS IF CLOCK INSTALLED ; IN A,(Cd¦ÿÂNNNNNNNNNNNNNNNN¡¡¡þüYNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; WRITE A DISK SECTOR ; EXIT - A= 0: OK; /0: ERROR ; ;+++À³ÿÿNNNNNNNNNNNNNNNNN¡¡¡þVÿNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûMMON DISK I/O CODE ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ΣþöNNNNNNNNNNNNNNNNNN¡¡¡þºGNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûROR ; LD HL,DSKEM ;OUTPUT PREFIX CALL EDITOR ; LD DE,IOPB + PBSTATO ;POINT TO ERROR BYTE LD B,6 ;OUTPUT 6 BYTES DSKEAJÿîNNNNNNNNNNNNNNNN¡¡¡þ™HNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûF IGNORE THEN RETURN NO ERROR ; SUB A,'I' ;IF IGNORE THEN RETURN NO ERROR RET Z ; ; ELSE RETURN ERROR TO BDOS ; FDSK±’ÿÂNNNNNNNNNNNNNNNN¡¡¡þ sNNNNNNNNNNNNNNNNNNNNNN¡¡¡û,(IOPB + PBSECO) ADD HL,DE LD (IOPB + PBSECO),HL ; ; FINISH SETTING UP THE IOPB ; XPRIM: XOR A,A LD (IOPB + PBFLGO),ÕþNNNNNNNNNNNNNNNNN¡¡¡þ&Ù°NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SELECT DRIVE FUNCTION ; LOG-ON - SET DISK PARAMETER BLOCK ; ENTRJVþNNNNNNNNNNNNNNNNNN¡¡¡þ,6{NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUTION ADDRESS ; LD E,(HL) ;STORE ADDRESS INC HL LD D,(HL) INC HL LD (DVRXADR),DE ; ; FETCH FLAGS ; LD C,(HL) ›JÿòNNNNNNNNNNNNNNN¡¡¡þ £NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLKDAT) ;IF CLOCK NOT PRESENT THEN TURN OFF CLOCK DRIVE AND A,11000000B ;TEST UNUSED BUT DRIVEN BITS (1S IF NOT THERE) LD A,3qþBNNNNNNNNNNNNNNNN¡¡¡þ ÏhNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DISKWR: LD A,DDWRS ;SELECT WRITE OP JR DISKOP žuþNNNNNNNNNNNNNNNN¡¡¡þeÎNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++ DISKOP: ; ; SET UP IOPB ; LD HL,BTTRK LD DE,IOPB + PBTRKO LD BC,PBSTATO - PBTRKO LDIR ; DISKOP2: LD (IOPB +ÏþNNNNNNNNNNNNNNNNN¡¡¡þ‰vNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR1: LD A,(DE) ;FETCH ERROR BYTE PUSH DE ;SAVE REGS PUSH BC CALL PRHEX ;OUTPUT ERROR CODE ; LD C,' ' CALL COC ;  þNNNNNNNNNNNNNNNN¡¡¡þªyNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûER: LD HL,0 ;RETURN DPB_PTR = 0 FOR SELECT FUNCTION LD A,-1 ;RETURN -1 TO BDOS OR A,A RET ;++++++++++++++++++++++++e�þBNNNNNNNNNNNNNNNN¡¡¡þ!@'NNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡ûA ;NO FLAGS FOR NOW ; LD HL,SECSZ ;SET XFER COUNT LD (IOPB + PBST4O),HL ; ; EXECUTE THE PRIMITIVE IN ROM ; PUSH IX Îìÿ×NNNNNNNNNNNNNNNN¡¡¡þ'ê�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûY- C= DRIVE # ; E= 0 IF NEVER LOGGED BEFORE ; EXIT - HL= PTR TO DPT OR 0 FOR ERROR ; ;+++++++++++++++++++++++++++++++++++++a¸þNNNNNNNNNNNNNNNNN¡¡¡þ-JNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; COMPUTE DISK PARAMETER TABLE ADDRESS ; LD HL,(BTDRV) LD H,0 ADD HL,HL ;DISK # * 16 ADD HL,HL ADD HL,HL ADDÒëþýNNNNNNNNNNNNNNNNN¡¡¡þ¹4NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û8H ;COND. JR (ON) JR Z,CLKON ; LD A,18H ;UNCOND. JR (OFF) (CAUSES JUMP TO ILLEGAL) ; CLKON: LD (INHCLK),A ; ENDIF !÷ÿòNNNNNNNNNNNNNNNN¡¡¡þ š;NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; LOGON DISK FUNCTION ; EXIT - A= 0: OK;ŽSþBNNNNNNNNNNNNNNNN¡¡¡þvƒNNNNNNNNNNNNNNNNNNNNNN¡¡¡û PBCMDO),A ; ; DOUBLE CHECK DRIVE VALIDITY ; LD A,(BTDRV) CP A,NDRVS ;IF RANGE ERROR THEN ABORT JR NC,FDSKER ; ; ŒNÿÿNNNNNNNNNNNNNNNNN¡¡¡þÜ%NNNNNNNNNNNNNNNNNNNNNN¡¡¡û POP BC ;RESTORE REGS POP DE INC DE ;NEXT ERROR BYTE DJNZ DSKER1 ;IF NOT DONE THEN LOOP ; LD HL,DSKEB ;OUTPUT ERROR¿ÿñNNNNNNNNNNNNNNNNN¡¡¡þ3îNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; HARD DISK DRIVER ; ENTRY- IY= DRIVER TABLE PTR ; EXIT - A= 0: OK; /œmþÉNNNNNNNNNNNNNNNN¡¡¡þ"tNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD IX,IOPB ;PASS PTR TO IOPB LD HL,DKPENT ;PRIMITIVE ENTRY LD A,(DKPROM) ;FETCH PROM # CALL EXROM ;EXECUTE THE PRIMITI|<ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ(ú¿NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û+++++++++++++++++++++++++++++++++++++++ SELDSK: LD HL,0 ;ASSUME ERROR ; ; CHECK FOR LEGAL DRIVE ; LD A,C ;SET DRIVE # ±×þüNNNNNNNNNNNNNNNN¡¡¡þ.PNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û HL,HL LD DE,D0DPH ADD HL,DE ; ; IF NO LOGON REQUEST THEN RETURN WITH TABLE PTR ; LD A,(LOGRQ) ;IF NOT_1ST_LOG_ON THE%Ôþ�NNNNNNNNNNNNNNNNN¡¡¡þŠNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ; PASS DEFAULT DISK TO CCP ; LD A,(DEFDRV) LD C,A JP CCP SUBTTL DISK ROUTINES ;++++++++++++++++++++++++++++++++IFþÉNNNNNNNNNNNNNNNN¡¡¡þ © NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DISKLOG: LD HL,DEFBFR ;SET UP Dò¸þ$NNNNNNNNNNNNNNNNN¡¡¡þE²NNNNNNNNNNNNNNNNNNNNNN¡¡¡û FETCH DRIVER VECTOR & EXECUTE DISK DRIVER ; DKOPLP: PUSH IY ;SAVE IY LD IY,(DVRTPTR) ;FETCH TABLE BASE ; LD HL,DKOPRE¿dþüNNNNNNNNNNNNNNNN¡¡¡þïNNNNNNNNNNNNNNNNNNNNNN¡¡¡û MESSAGE CALL EDITOR ; ; GET USER RESPONSE ; CALL CI ;GET USER RESPONSE ; PUSH AF ;SAVE CHAR LD C,A ;ECHO CHAR  nþ²NNNNNNNNNNNNNNNNN¡¡¡þßNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ HDEXEC: ; ; CONVERGE LOGICAL DRIË«þÉNNNNNNNNNNNNNNNN¡¡¡þ#&ENNNNNNNNNNNNNNNNNNNNNN¡¡¡ûVE POP IX ; ; RETURN THE COMMAND RESULTS STATUS ; LD A,(IOPB + PBSTATO) OR A,A RET ;**************************ñ©ÿÂNNNNNNNNNNNNNNNN¡¡¡þ)ÉŽNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û CP NDRVS ;IF NOT 0..(NUMBER_OF_DRIVES -1) THEN ERROR RET NC ; ; STORE DRIVE # FOR FUTURE USE ; LD (BTDRV),A ;STORE Dã�þãNNNNNNNNNNNNNNNNN¡¡¡þ/c(NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûN RETURN TABLE PTR CPL OR A,C ;OR IF LOGON INHIBIT SET THEN RETURN AND 1 RET Z ; ; ELSE LOG DRIVE ; LD (DTPTR),HLÕ¤þNNNNNNNNNNNNNNNNN¡¡¡þßVNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++ ; ; READ A DISK SECTOR ; EXIT - A= 0: OK; /0: ERROR ; ;+++++++++++++++++++++§sþœNNNNNNNNNNNNNNNN¡¡¡þ 0�NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûMA FOR DESCRIPTOR SECTOR LD (IOPB + PBDMAO),HL XOR A,A LD (IOPB + PBDMAXO),A ; LD HL,1 ;SET SECTOR LD (IOPB + PBSEC þ NNNNNNNNNNNNNNNN¡¡¡þáNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT ;PUT RETURN ADDRESS ON STACK PUSH HL ; LD HL,(DVRXADR) ;FETCH DRIVER ADDRESS PREFETCHED FROM TABLE JP (HL) ; ; DRIVdsÿðNNNNNNNNNNNNNNNNN¡¡¡þÿ*NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û CALL COC POP AF ; AND A,5FH ;INSURE UPPER CASE ; ; IF RETRY THEN RETURN TO CALLER ; CP A,'R' ;IF RETRY THEN RETUÿÀNNNNNNNNNNNNNNNNN¡¡¡þUŒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûVE TO PHYSICAL DRIVE ; LD A,(IY + DVRPDRV) ;0,1: DRV 0, 2,3: DRV 1 LD (IOPB + PBDRVO),A ; ; OFFSET LOGICAL ADDRESS WITH�•ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ$¿ÒNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û************************************************** ; ; WAIT FOR ISHA NOT BUSY PROCEDURE ; ;*********************************¤ÿÂNNNNNNNNNNNNNNNN¡¡¡þ*œÝNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRIVE # ; ; SAVE LOGON REQUEST FLAG ; LD A,E ;SET LOG REQUEST VECTOR LD (LOGRQ),A ; ; COMPUTE DISK TABLE PTR ; ; Ó9ÿùNNNNNNNNNNNNNNNN¡¡¡þ0peNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;SAVE DRIVE TABLE PTR ; ; 1ST ATTEMPT TO READ ID SECTOR ; XOR A,A ;INIT FLAG BYTE UNTIL FIRMWARE REVISED LD (IOPB + PôOþNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN8NNNNNNNNN�Î��‚jƒ8„…Ô…¢†p‡>ˆ ‰Ú‰§Št‹CŒ�ß�®Ž|�L�‘葵’„“R” •í•»–‰—W˜%™ó™Áš�›]œ*�ø�Æž”Ÿb 0¡ý¡Ë¢™£g¤4¥¦Ð¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ ÜNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBST2O),A ; CALL DISKLOG JP NZ,FDSKER ; ; IF NO ID SECTOR THEN USE DEFAULTS ; LD A,(IOPB + PBST2O) CP A,-2 ;0: NO ƒ&ÿùNNNNNNNNNNNNNNNN¡¡¡þŠzNNNNNNNNNNNNNNNNNNNNNN¡¡¡û,(DVRTPTR) LD DE,DVRFLG ADD HL,DE EX DE,HL POP HL LD BC,DVRSIZ - DVRFLG LDIR ; ; RETURN DRIVE TABLE PTR ; LD 3‰ÿ€þNNNNNNNNNNNNNNNNN¡¡¡þ e±NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR SEL2 ;**************************************************************************** ; ; SET 3740 SECTOR TRANSLATION ;õ‘ÿòNNNNNNNNNNNNNNNN¡¡¡þEÍNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DPBAD: LD HL,(DTPTR) ;FETCH BASE ADDR LD DE,10 ;ADD OFFSETQšÿHNNNNNNNNNNNNNNNN¡¡¡þªNNNNNNNNNNNNNNNNNNNNNN¡¡¡û SET SECTOR ; ENTRY- BC= SECTOR # ; ;**************************************************************************** SETSEC: öãÿPNNNNNNNNNNNNNNNNN¡¡¡þ NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++ SECTRN: LD A,D ;IF TABLE ADDR = 0 THEN NO TRANSLATION OR E JR Z,NOTRAN ; EX DE,HL ADD HL,BC LD L,(HL) ; Lg2ÿÿNNNNNNNNNNNNNNNNN¡¡¡þ%êþNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD A,(IY + DVRPDRV) LD (IOPB + PBDRVO),A ; ; IF LOGON THEN SKIP SIDE SELECT BECAUSE SECTOR DATA MAY NOT BE VALID ; LD Tòÿ“NNNNNNNNNNNNNNNNN¡¡¡þ+ÉñNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN DRIVER TABLE PTR FUNCTION ; ENTRY- C= DRIVE # ; EXIT - HL= DRIVER ¨’ÿÂNNNNNNNNNNNNNNNN¡¡¡þu�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûID, -1: JADE ID, -2: EXTENDED ID JR NZ,LGDEF ; ; DISKETTE CONTAINS ID. XFER ID SECTOR DATA ; CALL TRNONE ;ASSUME NO TR[ÍÿNNNNNNNNNNNNNNNNNN¡¡¡þšDNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHL,(DTPTR) XOR A,A RET ; ; ; SELECT PROPER DEFAULT TABLES ; LGDEF: LD A,(BTDRV) IF STHD <> 0 CP A,STHD JR C,LJŒÿDNNNNNNNNNNNNNNNN¡¡¡þ0âNNNNNNNNNNNNNNNNNNNNNN¡¡¡û EXIT - DE, HL= ? ; ;**************************************************************************** TR5: LD DE,SD5TRAN JR SET~ÿüNNNNNNNNNNNNNNNNN¡¡¡þÜZNNNNNNNNNNNNNNNNNNNNNN¡¡¡û OF DPB PTR ADD HL,DE LD E,(HL) ;FETCH DPB PTR INC HL LD D,(HL) RET ;*******************************************ËÿINNNNNNNNNNNNNNNN¡¡¡þÿUNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLD (BTSEC),BC RET ;**************************************************************************** ; ; SET TRANSFER ADDR %RÿùNNNNNNNNNNNNNNNN¡¡¡þ  NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD H,0 RET ; ; NOTRAN: LD HL,1 ADD HL,BC RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++YÿÿNNNNNNNNNNNNNNNNN¡¡¡þ&¿­NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA,(IOPB + PBCMDO) SUB A,DDLOG JR Z,FD8X1 ; ; SELECT SIDE ; LD A,(IOPB + PBTRKO) CP A,1 LD A,(IOPB + PBSECO) JR ßôÿNNNNNNNNNNNNNNNNNN¡¡¡þ,PfNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTABLE BASE PTR ; A, C= 0 ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ RETDVRT: LD HL,D®xÿ'NNNNNNNNNNNNNNNN¡¡¡þF¾NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûANSLATION ; ; TEST FOR SECTOR XLATION ; LD A,(DEFBFR + IDFLGO) AND A,[1 SHL DFDTDB] OR [1 SHL DFHARDB] JR NZ,NOX ; ðÿnNNNNNNNNNNNNNNNNN¡¡¡þ ©uNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûGCKFD ENDIF CP A,NDHD + 1 JR NC,LGCKFD ; ; HARD DISK DEFAULTS ; CALL TRNONE ; NO XLATE LD HL,HDPBK ; ; COUÿ7ÎNNNNNNNNNNNNNNNN¡¡¡þÓNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTR ; TR8: TR3740: LD DE,SDTRAN ; SETTR LD HL,(DTPTR) LD (HL),E INC HL LD (HL),D RET ;*************************¥tÿþNNNNNNNNNNNNNNNNNN¡¡¡þïkNNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************************* ; ; HOME DRIVE - TREAT AS SEEK TRK 0 ; EXIT - BC= 0 ; ;********************************â×ÿrNNNNNNNNNNNNNNNN¡¡¡þÌdNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ENTRY- BC= ADDRESS ; EXIT - A= 0 ; ;**************************************************************************** SETDMA: LÍ­ÿ�NNNNNNNNNNNNNNNNN¡¡¡þ!&:NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++ ; ; JADE 5" FLOPPY DISK DRIVER FUNCTION ; ENTRY- IY= DRIVER TABLE PTR ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++Q¾ÿÿNNNNNNNNNNNNNNNN¡¡¡þ'ŒœNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûC,FD8X20 JR Z,FD8X21 ; ; DATA TRACKS ; LD C,(IY + DVRDSPT) ; ; COMMON SIDE SELECT CODE ; FD8X2: INC C SUB A,C þIÿþNNNNNNNNNNNNNNNNN¡¡¡þ-cWNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûVR0 ;START AT 1ST TABLE ; ; TEST FOR DONE ; RETDVL: LD A,C OR A,A RET Z ; ; COMPUTE NEXT TABLE ENTRY ; LD A,DVt>ÿÈNNNNNNNNNNNNNNNNN¡¡¡þß)NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; SELECT SIZE OF XLATE TABLE ; LD A,(DEFBFR + IDSPTDO) CP A,26 JR NZ,LGNT8X ; ; SELECT 8" XLATE TABLE ; CALL TR8�ÿÈNNNNNNNNNNNNNNNN¡¡¡þ ü&NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûMMON CODE ; SEL2: PUSH HL CALL DPBAD ; USE DEFAULT TABLE POP HL LD BC,DPBSZ LDIR JR SEL1 ; ; CHECK FOR 8" FLOP,@ÿdNNNNNNNNNNNNNNNN¡¡¡þžNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*************************************************** ; ; SET NO SECTOR TRANSLATION ; EXIT - HL, DE= ? ; ;*******************ö~ÿ_NNNNNNNNNNNNNNNNN¡¡¡þº8NNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************************** HOME: LD BC,0 ;**************************************************************�&ÿþNNNNNNNNNNNNNNNNN¡¡¡þUóNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD (BTDMA),BC XOR A,A LD (BTDMAX),A RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ²ÿÿNNNNNNNNNNNNNNNNN¡¡¡þ"siNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ FD5EXEC: ;+++++++++++++++++++++++++++++++++++++++++++++++4yÿÎNNNNNNNNNNNNNNNNN¡¡¡þ(œ¢NNNNNNNNNNNNNNNNNNNNNN¡¡¡û JR C,SPTOK ; INC A ;MUST START AT 1 LD (IOPB + PBSECO),A ; ; SELECT SIDE 1 ; LD A,80H FD8X1: LD (IOPB + PBSECO + H-ÿÿþNNNNNNNNNNNNNNNN¡¡¡þ.6NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRSIZ ADD A,L LD L,A LD A,0 ADC A,H LD H,A DEC C JR RETDVL SUBTTL NON-DISK PROCEDURES ;***********************¼ÜÿùNNNNNNNNNNNNNNNNN¡¡¡þìNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û JR NOX ; ; SELECT 5" XLATE TABLE ; LGNT8X: CALL TR5 ; NOX: CALL DPBAD ;GET ADDR OF DPB & MOVE DOWN DISK INFO TO IT ß{ÿîNNNNNNNNNNNNNNNNN¡¡¡þ ÏNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPY DEFAULTS ; LGCKFD: IF ST8FD <> 0 CP A,ST8FD JR C,LGCKFD5 ENDIF CP A,ND8FD + 1 JR NC,LGCKFD5 ; ; USE 8" tÕÿäNNNNNNNNNNNNNNNNN¡¡¡þ#¯NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û********************************************************* TRNONE: LD DE,0 JR SETTR ;++++++++++++++++++++++++++++++++++++IÖÿùNNNNNNNNNNNNNNNN¡¡¡þ‰ NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û************** ; ; SET TRACK # ; ENTRY- BC= TRACK # ; ;********************************************************************ÿRNNNNNNNNNNNNNNNNN¡¡¡þfÂNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; SECTOR TRANSLATION FUNCTION ; ENTRY- DE= 0: NO XLATE, ELSE PTR TO XLATE TABLE ; BC= SECTOR # TO XLATE ; EXIT - HL= XLAë•ÿœNNNNNNNNNNNNNNNN¡¡¡þ#@XNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++ ; ; JADE 8" FLOPPY DISK DRIVER FUNCTION ; ENTRY- IY= DRIVER TABLE PTR ; EXIT - A= 0: OK; /0: E[ÿBNNNNNNNNNNNNNNNN¡¡¡þ)¯“NNNNNNNNNNNNNNNNNNNNNN¡¡¡û1),A ; ; EXECUTE THE IOPB ; JP XPRIM ; ; ; TRACK 0 ; FD8X20: LD C,(IY + DVR0SPT) JP FD8X2 ; ; ; TRACK 1 ; îÿáNNNNNNNNNNNNNNNN¡¡¡þ/5NNNNNNNNNNNNNNNNNNNNNN¡¡¡û***************************************************** ; ; OUTPUT HEX DATA TO CONSOLE SUBR ; ENTRY- A= DATA ; EXIT - A, C= ? w4ÿ¿NNNNNNNNNNNNNNNNN¡¡¡þ¹KNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û LD HL,DEFBFR + IDSPTO LD BC,DPBSZ LDIR ; LD HL,DEFBFR + IDFLGO ; ; XFER DISK PHYSICAL DATA ; SEL1: PUSH HL LD HLgÃÿÈNNNNNNNNNNNNNNNN¡¡¡þ V€NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFLOPPY DEFAULTS ; CALL TR8 LD HL,SD8PBK JR SEL2 ; ; USE 5" FLOPPY DEFAULTS ; LGCKFD5: CALL TR5 LD HL,SD5PBK JŽ{ÿ NNNNNNNNNNNNNNNN¡¡¡þvüNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++ ; ; GET DRIVE PARAMETER BLOCK ADDR ; EXIT - DE= DPB PTR ; HL= ? ; ;+++++++++++ÿÿNNNNNNNNNNNNNNNNN¡¡¡þ™7NNNNNNNNNNNNNNNNNNNNNN¡¡¡û******** SETTRK: LD (BTTRK),BC RET ;**************************************************************************** ; ;ìÿÿNNNNNNNNNNNNNNNNN¡¡¡þ3‘NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûTED SECTOR OR (BC) + 1 ; BC= UNCHANGED ; A, DE= ? ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ÎÿÂNNNNNNNNNNNNNNNN¡¡¡þ$ÙÏNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ FD8EXEC: ; ; SET PHYSICAL DRIVE ; ;áÿyNNNNNNNNNNNNNNNN¡¡¡þ*úÀNNNNNNNNNNNNNNNNNNNNNN¡¡¡û FD8X21: LD C,(IY + DVR1SPT) JP FD8X2 ; ; ; SECTORS OK ; SPTOK: XOR A,A JP FD8X1 ;++++++++++++++++++++++++++++++"GÿúNNNNNNNNNNNNNNNNN¡¡¡þ0xNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ;**************************************************************************** PRHEX: CALL PRDIG ;DO HIGH NIBBLE ; PRDIG:®Kÿ|NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNý€Ë�š‚gƒ5„…Ñ…ž†k‡8ˆ‰Ô‰¡Šo‹=Œ �Ù�¨Žv�D�‘ß‘­’|“J”•啳–�—N˜™ë™¹š‡›Uœ"�ñ�¾ž‹ŸY (¡õ¡Â¢�£_¤,¥û¥É¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þìNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û RLCA ;POSITION NIBBLE INTO LOW 4 BITS RLCA RLCA RLCA ; PUSH AF ;SAVE DATA ; AND A,0FH ;MASK OFF OTHER NIBBLE ¾þþNNNNNNNNNNNNNNNNN¡¡¡þ½JNNNNNNNNNNNNNNNNNNNNNN¡¡¡û BOOT RTN ; ; THE FOLLOWING CONDITIONAL JUMP IS MODIFIED TO AN UNCONDITIONAL JUMP BY ; THE WARM BOOT ROUTINE IF THE CLOCK/CÌ0ÿàþNNNNNNNNNNNNNNNNN¡¡¡þ R�NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++ ; ; CDOS RETURN VERSION FUNCTION ; MAKES CLOCK/CALENDAR WORK. ; EXIT - B= 1 ý^ÿ^NNNNNNNNNNNNNNNN¡¡¡þrýNNNNNNNNNNNNNNNNNNNNNNÿ€¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ CLKTIM: LD HL,TIMENT JR CLK1 ;+++++++++++ÌþNNNNNNNNNNNNNNNNN¡¡¡þ�6NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûF ;**************************************************************************** ; ; EXECUTE ROM ROUTINE ; ENTRY- HL= ENTœ:þbNNNNNNNNNNNNNNNNN¡¡¡þ7�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ CI: IF USEMON CALL GETMON ;SWITCH IN MONITOR¯Íþ`NNNNNNNNNNNNNNNNN¡¡¡þ%ÝÎNNNNNNNNNNNNNNNNNNNNNN¡¡¡û**** ; ; CONSOLE OUTPUT ; ENTRY- C= CHAR TO OUTPUT ; ;*********************************************************************Auþ!NNNNNNNNNNNNNNNN¡¡¡þ+þÁNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û++++++++++++++++++++++++++++++++++++++++++ READER: LD A,CTRLZ ;FAKE EOF ;************************************************�]þäNNNNNNNNNNNNNNNN¡¡¡þB¿NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûADD A,90H ;CONVERT TO ASCII DAA ADC A,40H DAA ; LD C,A ;STORE CHAR CALL COC ; POP AF ;DATA RET IF INTC²þ„NNNNNNNNNNNNNNNN¡¡¡þ­tNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûALENDAR BOARD IS NOT PRESENT ; IF NOT MODIFIED, THEN IT IS ALLWAYS FALSE (NOP). ; INHCLK: JR C,ILLEGC ; ; NOW CHECK FOR E9SÿÂNNNNNNNNNNNNNNNN¡¡¡þÒNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ RETVER: LD B,1 RET SUBTTL CLOCK ROUTINEË�þxNNNNNNNNNNNNNNNNNN¡¡¡þëjNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; READ CLOCK TIME FUNCTION 93H ; ENTRY- DE= PTR TO 13 BYT@¦þ“NNNNNNNNNNNNNNNN¡¡¡þÈeNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûRY ADDRESS ; A= ROM # ; EXIT - ? ; ;**************************************************************************** EXROM: ì-þ$NNNNNNNNNNNNNNNN¡¡¡þ ";NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ROM JP 0F803H ;USE MONITOR ELSE CALL CNSCK ;IF NO CHAR RDY THEN WAIT JR Z,CI IN A,(NTD) ;ELSE RETURN CHAR RET 4¬þôNNNNNNNNNNNNNNNNN¡¡¡þ&ˆ�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û******* COC: IF USEMON CALL GETMON JP 0F809H ELSE CALL NTOST ;IF BUSY THEN WAIT OR A,A JR Z,COC LD A,C ˵þÿNNNNNNNNNNNNNNNNNN¡¡¡þ,gVNNNNNNNNNNNNNNNNNNNNNN¡¡¡û**************************** ; ; PUNCH DRIVER ; ENTRY- C= CHAR TO OUTPUT ; ;***********************************************õðþ$NNNNNNNNNNNNNNNN¡¡¡þqŽNNNNNNNNNNNNNNNNNNNNNNð¡¡¡ûPTS SUBTTL ADDITIONAL FUNCTIONS TO SUPPORT CDOS PROGRAMS ;*******************************************************************w ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ žENNNNNNNNNNNNNNNNNNNNNN¡¡¡ûXTENDED CALLS ; CP A,8DH ;IF RETURN VERSION THEN RETURN IT JR Z,RETVER ; CP A,90H ;IF NOT CLOCK THEN ERR JR C,ILLEGCCþNNNNNNNNNNNNNNNNN¡¡¡þ4ãNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûS ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN CALENDAR FUNCTION 90H ; EXIT - A=ö?þNNNNNNNNNNNNNNNNN¡¡¡þØ[NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE BUFFER FOR CLOCK DATA ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ CLKRDC: LD C,E ;SE•ôÿáNNNNNNNNNNNNNNNN¡¡¡þûTNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAND A,ROMSMK ;MASK OUT UNUSED BITS OUT (ROMSEL),A ; PUSH HL ;SAVE ROM ENTRY VECTOR ; LD HL,EXROMR ;PUT RETURN ADDR ON SÒIþ NNNNNNNNNNNNNNNNN¡¡¡þ! NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ENDIF ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN CONSOLE STATUS ; EXITçþ|NNNNNNNNNNNNNNNN¡¡¡þ'»¬NNNNNNNNNNNNNNNNNNNNNN¡¡¡û OUT (NTD),A RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN CONSOLE OUTPU¦×þNNNNNNNNNNNNNNNNN¡¡¡þ-TgNNNNNNNNNNNNNNNNNNNNNN¡¡¡û***************************** PUNCH: RET ;**************************************************************************** ; wþ$NNNNNNNNNNNNNNNNN¡¡¡þèNNNNNNNNNNNNNNNNNNNNNN¡¡¡û******** ; ; SYSTEM CALL INTERCEPT ROUTINE CHECKS FOR ILLEGAL BDOS CALLS & ; PRINTS MESSAGE IF ILLEGAL. ALSO IMPLEMENTS CDOS›þ$NNNNNNNNNNNNNNNN¡¡¡þ ËNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; JR Z,CLKCAL ;IF CALENDAR THEN GET IT ; CP A,92H JR C,CLKSET ;IF SET FUNCTION THEN SET CLOCK ; JR Z,CLKTIM ;IF TIMEJþBNNNNNNNNNNNNNNNN¡¡¡þ'®NNNNNNNNNNNNNNNNNNNNNN¡¡¡û DAY ; B= MONTH ; C= YEAR ; L= DAY OF WEEK ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Aþ`NNNNNNNNNNNNNNNNN¡¡¡þ�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT UP PARAMETERS LD B,D LD HL,RDBENT JR CLK2 ;************************************************************************ ÇÿSNNNNNNNNNNNNNNNNN¡¡¡þbÃNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTACK EX (SP),HL ;SWAP RETURN ADDRESS WITH ROM ENTRY VECTOR JP (HL) ;EXECUTE ROM ; ; ROM PROCEDURE RETURNS HERE ; EXRgþNNNNNNNNNNNNNNN¡¡¡þ"DYNNNNNNNNNNNNNNNNNNNNNN¡¡¡û - A= 0: NOT READY ; FFH: CHAR READY ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ CNS/ÂÿÉNNNNNNNNNNNNNNNNN¡¡¡þ(«’NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT READY STATUS ; EXIT - A= 0: BUSY, FFH: READY ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++÷|þ¿ŽNNNNNNNNNNNNNNNN¡¡¡þ.4NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; PRINTER DRIVER ; ENTRY- C= CHAR TO OUTPUT ; ;**************************************************************************** v‚þHNNNNNNNNNNNNNNNNN¡¡¡þÛ(NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û CLOCK/CALENDAR ; SYSTEM CALLS FOR ASMB. ; ;*************************************************************************** INTÿòNNNNNNNNNNNNNNNN¡¡¡þ ø'NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û THEN GET IT ; CP A,93H JR Z,CLKRDC ;IF READ CLOCK THEN GET IT ; ; ILLEGAL SYSTEM CALL ; ILLEGC: LD HL,ISCMSG ;OUTPUT ž]þNNNNNNNNNNNNNNNNNN¡¡¡þŸNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++ CLKCAL: LD HL,CALENT ;ROM ENTRY POINT ; CLK1: LD BC,CLKBFR ;READ CLOCK JR CLK2 ;+++++++++++++++++++++++++++++++++®‡þ NNNNNNNNNNNNNNNN¡¡¡þ¾9NNNNNNNNNNNNNNNNNNNNNN¡¡¡û**** ; ; CLOCK SET FUNCTION 91H ; ENTRY- DE= CLOCK IMAGE BUFR PTR (13 BYTES LONG) ; ;**************************************êÞþNNNNNNNNNNNNNNNNNN¡¡¡þQòNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOMR: PUSH AF ;SAVE RETURN VALUE CALL GETMON ;RESELECT MONITOR ROM ; POP AF ;RETURN VALUE RET SUBTTL CHAR I/O ROUTöÂþNNNNNNNNNNNNNNNN¡¡¡þ#whNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCK: IF USEMON CALL GETMON JP 0F812H ELSE IN A,(NTS) ;IF DATA NOT READY THEN RETURN 0 AND A,1 SHL NTRDY TTOST1:¡TÿòNNNNNNNNNNNNNNNN¡¡¡þ)˜£NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+ NTOST: IN A,(NTS) CPL ;REVERSE SENSE AND A,1 SHL NTBSY JR TTOST1 ENDIF ;++++++++++++++++++++++++++++++++++++–jÿÂNNNNNNNNNNNNNNNN¡¡¡þ/2NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LO: IF USEMON CALL GETMON JP 0F80FH ELSE CALL LISTST ;IF BUSY THEN WAIT JR Z,LO ; LD A,C ;OUTPUT CHAR SE¦Xþ'NNNNNNNNNNNNNNNNNN¡¡¡þŽ{NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCPT: LD A,C ;CHECK CALL VALIDITY CP A,41 ;IF <= 40 THEN OK ; BDOSV EQU $ + 1 JP C,BDOS + 11H ;THIS ADDR MODIFIED BY WARM‰yþ„NNNNNNNNNNNNNNNN¡¡¡þ a°NNNNNNNNNNNNNNNNNNNNNNð¡¡¡ûWARNING CALL EDITOR XOR A,A ;BC = HL = A = 0 LD L,A LD H,A LD C,A LD B,A RET ;++++++++++++++++++++++++++++++.^þBNNNNNNNNNNNNNNNN¡¡¡þAÌNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN TIME FUNCTION 92H ; EXIT - A= SECONDS ; B= MINITS ; C= HOURS ; ;�ãÿàNNNNNNNNNNNNNNNNN¡¡¡þ®NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************** CLKSET: LD C,E ;SET UP PARAMETERS LD B,D LD HL,SETENT CLK2: LD A,CALROM ENDI)þNNNNNNNNNNNNNNNNN¡¡¡þ¡NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CONSOLE INPUT ; EXIT - A= CHAR ; ;+^‚þNNNNNNNNNNNNNNNN¡¡¡þ$îÿNNNNNNNNNNNNNNNNNNNNNN¡¡¡û RET Z LD A,-1 ;ELSE RETURN -1 RET ENDIF ;************************************************************************žˆþ$NNNNNNNNNNNNNNNNN¡¡¡þ*ÍðNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û++++++++++++++++++++++++++++++++++++++++ ; ; READER DRIVER - DUMMY ; EXIT - A= CTRL-Z ; ;++++++++++++++++++++++++++++++++++{¥þNNNNNNNNNNNNNNNNN¡¡¡þ0!HNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT 7,A OUT (CENTOUT),A ; RES 7,A ;OUTPUT LOW TRUE STROBE OUT (CENTOUT),A SET 7,A OUT (CENTOUT),A RET ENDIF ;zÿòNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�Í�›‚hƒ6„…Ñ…Ÿ†n‡<ˆ ‰Ø‰¥Šs‹AŒ�Þ�¬Žz�I�‘æ‘´’‚“P”•í•»–‰—W˜%™ò™Àš�›]œ+�ù�Çž•Ÿb 0¡þ¡Í¢š£h¤6¥¦Ñ¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þVhNNNNNNNNNNNNNNNNNNNNNN¡¡¡û TITLE CUSTOMIZED BIOS FOR M5B LIST NOCOND ;============================================================================ ; þ^ÿrNNNNNNNNNNNNNNNN¡¡¡þüÎNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûY, 20H: 5" FLOPPY DEBUG EQU FALSE ;TRUE TO DUMP THE IOPB DATA TO PRINTER FORM ;******************************************ÿòNNNNNNNNNNNNNNNN¡¡¡þ NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û PHYSICAL DRIVE 1 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; D SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 0 ; E SIDE 0 ŠóÿBNNNNNNNNNNNNNNNN¡¡¡þ3yNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LARGER BIOS ALLOCATION ON THE DISK. ; ; 2.2.4 - ADDED NAKED TERMINAL DRIVERS & IOBYTE IN ; ANTICIPATION OF THE MONITOR. bLÿ!NNNNNNNNNNNNNNNNN¡¡¡þܲNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEP 83 GRH ; Move clock-calendar routines to ROM. Add Interrupt handler ; (Mode 2). Change Revision display of sign-on (separËsÿNNNNNNNNNNNNNNNN¡¡¡þvNNNNNNNNNNNNNNNNNNNNNN¡¡¡û 85 GRH ; Implemented hard disk drive 1 as C: & D:. ; Implemented the Logon function for the hard disk. ; Implemented user %uÿÈNNNNNNNNNNNNNNNN¡¡¡þ%œJNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOGON to specify the ID sector & track. At same time, fix bug ; which did not specify the logon track. ; ; 3.02 7 JUL 88 GÿòNNNNNNNNNNNNNNNNN¡¡¡þ+¿ENNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************************** SUBTTL SYSTEM DECLARATIONS ;========================================================== ÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ;NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ASSEMBLY PARAMETERS ; ;============================================================================ FALSE EQU 0 TRUE EQU N¯7ÿ'NNNNNNNNNNNNNNNNN¡¡¡þìðNNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************************** ; ; CUSTOMIZED BIOS FOR M5B ; (c) 1981 GRH Electronics, CUPERTINO, CA ; ;********** ŸÿòNNNNNNNNNNNNNNNN¡¡¡þFVNNNNNNNNNNNNNNNNNNNNNN¡¡¡û& 1 OF HARD DISK PHYSICAL DRIVE 1 ; F SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ENDIF IF BOOT = 20H ; A JADE 5" FLOØxÿÉNNNNNNNNNNNNNNNNN¡¡¡þªîNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûALSO, ALL REFERENCES ; REQUIRING THE I/O PROMS TO BOOT HAS BEEN REMOVED. ; ; 2.2.5 - RECONFIGURE FOR 62K SYSTEM. ; ; 2.ë ÿ NNNNNNNNNNNNNNNN¡¡¡þ‰áNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûate CBIOS rev). ; ; 2.00 - 24 MAR 84 GRH ; Modify for hard disk ; ; 2.01 - 28 APR 84 GRH ; Change hard disk DPB to ref‡cÿÉNNNNNNNNNNNNNNNNN¡¡¡þ c¿NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûfriendly disk error options: Abort, Retry, Ignore. ; Solved warm boot hang problem by reseting host adapter if busy. ; ; 3.00lÿòNNNNNNNNNNNNNNNN¡¡¡þ&ÉNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRH ; Add '?' to include file names. ; Change hard disk system tracks directory reference to new format. ; Correct bug in driv’zÿÈNNNNNNNNNNNNNNNNN¡¡¡þ,&ÒNNNNNNNNNNNNNNNNNNNNNN¡¡¡û================== ; ; INCLUDE JDDCONT.DEF ; INCLUDE COMIOPB.DEF ; INCLUDE DISKS.DEF ; INCLUDE MONBOARD.DEF ; INCLUDE ZMON|0ÿNNNNNNNNNNNNNNNNNN¡¡¡þ0 NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOT FALSE ;============================================================================ ; ; CONDITIONAL ASSEMBLY FLAGS ; ;žÿ NNNNNNNNNNNNNNNNN¡¡¡þ ßÁNNNNNNNNNNNNNNNNNNNNNN¡¡¡û****************************************************************** ; ; CONFIGURATION: ; ; CPM ; DRIVE USAGE IF BOOT = 1ÔPÿîNNNNNNNNNNNNNNNN¡¡¡þugNNNNNNNNNNNNNNNNNNNNNN¡¡¡û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¡¡¡þ™ßNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û2.6 - 20 FEB 83 ; DOUBLE D REV C UPGRADE. CHANGE BOARD STATUS PORT BITS. ; ; 2.2.7 - 8 MAR 83 GRH ; ADDED CLOCK/CALENDAR DRI»9ÿÎNNNNNNNNNNNNNNNNNN¡¡¡þºÐNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûlect half size directory, but keep ; allocation for 1k directory ; ; 2.02 - 2 JUN 84 GRH ; Change floppy disk drivers to r ‰ÿáNNNNNNNNNNNNNNNNN¡¡¡þ!PŽNNNNNNNNNNNNNNNNNNNNNN¡¡¡û - 26 JAN 87 GRH ; Implemented new common IOPB code & Jade floppy firmware support. ; Implemented disk drive driver tables a:&ÿçNNNNNNNNNNNNNNNN¡¡¡þ'ú(NNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡ûers which caused retry to fail. (sector remained ; corrupted) ; Stubbed out new Clock routines for present. ; ; 3.03 31 JUÿµÿáNNNNNNNNNNNNNNNN¡¡¡þ-ãNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûROM.DEF ; INCLUDE DKBTROM.DEF ; INCLUDE NAKEDT.DEF ; INCLUDE ISHA.DEF ; INCLUDE CLOKROM.DEF ; ;===========================½ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ©�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û============================================================================ SHORT EQU FALSE ;SHORT BIOS (REMOVES UNESENTIAL C‘•ÿäNNNNNNNNNNNNNNNNN¡¡¡þ Š’NNNNNNNNNNNNNNNNNNNNNN¡¡¡û0H ;HARD DISK BOOT CONFIG. ; A SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; B SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 0 ; SÿÎNNNNNNNNNNNNNNNNN¡¡¡þf*NNNNNNNNNNNNNNNNNNNNNN¡¡¡û 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 ; ,ÃÿÉNNNNNNNNNNNNNNNN¡¡¡þÌŒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûVER, SYSTEM CALL INTERCEPT, ; ILLEGAL SYSTEM CALL MESSAGE, CHANGED BIOS SIZE TO END ; OF INITIALIZED DATA AREA. RESTRUCTURE MOž¸ÿnNNNNNNNNNNNNNNNNN¡¡¡þ#GNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûelate to ISASI control of JADE ; FDC. ; Change IOPB sector value from physical sector (1..n) to logical ; sector value Üäÿ$NNNNNNNNNNNNNNNNN¡¡¡þ"ÝNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûnd new function to return ; a ptr to a drive table. ; Removed init of IOBYTE. ; Implemented 5" floppy driver. ; ImplementedbèÿäNNNNNNNNNNNNNNNNN¡¡¡þ(êNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL 88 GRH ; Unstub Clock routines. ; ; 3.04 6 AUG 88 GRH ; Remove floppy side select from BIOS & move to controller. ; I fÿrNNNNNNNNNNNNNNN¡¡¡þ.@°NNNNNNNNNNNNNNNNNNNNNN¡¡¡û================================================= LIST OFF *INCLUDE JDDCONT.DEF *INCLUDE COMIOPB.DEF *INCLUDE DISKS.DEF *I4BÿrNNNNNNNNNNNNNNNNN¡¡¡þš¬NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûODE) LSTINC EQU FALSE ;LIST INCLUDE FILES USEMON EQU TRUE ;USE MONITOR ROM I/O ROUTINES IF TRUE INTRPTS EQU TRUE ;ENABLE IÝÈþNNNNNNNNNNNNNNNNNNN¡¡¡þ ¹£NNNNNNNNNNNNNNNNNNNNNN¡¡¡û C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; D SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ; E JADE 8" FLOPPY PHYSICAL DRIVEÚrÿòNNNNNNNNNNNNNNNNN¡¡¡þUNNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡û G JADE 8" FLOPPY PHYSICAL DRIVE 0 ; H JADE 8" FLOPPY PHYSICAL DRIVE 1 ENDIF ; ;***************************************ŒeþNNNNNNNNNNNNNNNNN¡¡¡þÿ½NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDULES. ; ; 2.28 - 22 APR 83 GRH ; CHANGED DEFINITIONS TO ALLOW BIG DIRECTORIES. ; DISALLOWED DRIVES C & D. ; ; 2.29 - 3 ÊËÿòNNNNNNNNNNNNNNNNN¡¡¡þvNNNNNNNNNNNNNNNNNNNNNN¡¡¡û(0..n-1). This maintains more uniformity in ; parameter passing between hard disk & JADE floppy IOPBs. ; Vector I/O routineGÝÿÎNNNNNNNNNNNNNNNNN¡¡¡þ#6ìNNNNNNNNNNNNNNNNNNNNNN¡¡¡û use of ROM primitives. ; Moved system down to 60k. ; ; 3.01 26 JUN 88 GRH ; Remove 5" floppy support. Implement in CP/M-86vÿòNNNNNNNNNNNNNNNNN¡¡¡þ)Ù'NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûmplement new ID sector format. ; Implement CP/M 3.0 DPB structure in preparation for deblocking. ; ; 3.05 11-3-88 GRH ; Cho÷ÿrNNNNNNNNNNNNNNNN¡¡¡þ/s�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNCLUDE MONBOARD.DEF *INCLUDE ZMONROM.DEF *INCLUDE DKBTROM.DEF *INCLUDE NAKEDT.DEF *INCLUDE ISHA.DEF *INCLUDE CLOKROM.DEF *Sÿ„NNNNNNNNNNNNNNNN¡¡¡þÏÿNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNTERRUPT PROCESSING WHISTLE INTCPTS EQU TRUE ;ENABLE SYSTEM CALL INTERCEPT WHISTLE BOOT EQU 10H ;10H: HARD DISK, 3: 8" FLOPP/ÿ!NNNNNNNNNNNNNNNN¡¡¡þ 4NNNNNNNNNNNNNNNNNNNNNN¡¡¡û 0 ; F JADE 8" FLOPPY PHYSICAL DRIVE 1 ENDIF IF BOOT = 3 ; A JADE 8" FLOPPY PHYSICAL DRIVE 0 ; B JADE 8" FLOPPY¨ÿùNNNNNNNNNNNNNNNNN¡¡¡þHNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û********************** ; REVISIONS: ; ; 2.2.0 - RELEASE ; ; 2.2.3 - SWAPPED DCM & BIOS SECTORS ON DISK, ALLOWING A ; Ô#ÿrNNNNNNNNNNNNNNNN¡¡¡þïƒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSEP 83 GRH ; Changed Rev # for blocked DCM. Enables IBM system 34 ; 256 bytes per sector disks to be read. ; ; 1.10 - 23 SÇÿÈNNNNNNNNNNNNNNNN¡¡¡þE%NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûs to monitor rom routines. ; ; 2.03 - 4 JUN 84 GRH ; Add bells & whistles again. ; Move to 61k system. ; ; 2.04 - 30 MAR=uÿrNNNNNNNNNNNNNNNNN¡¡¡þ$¯{NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û BIOS. ; Change single function to return drive table ptr into a BIOS function ; call using restart instruction. ; Change LÞˆÿÂNNNNNNNNNNNNNNNNN¡¡¡þ*ŒtNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûange included data to update IOPB.PBSTAT to new configuration. ; VERSN EQU 305 ; ;******************************************²þrNNNNNNNNNNNNNNNN¡¡¡þ0`ÌNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLIST ON ;============================================================================ ; ; DISK OPERATING SYSTEM ADDRESS_0ÿäNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÎNNNNNý€Ê�˜‚fƒ4„…Ï…�†k‡8ˆ‰Ô‰¡Šo‹=Œ �Ù�¨Žu�D�‘à‘­’|“J”•畵–ƒ—Q˜™ì™ºš‰›Wœ$�ò�ÀžŽŸ[ )¡ö¡Å¢’£`¤.¥ü¥É¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þaXNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûES ; ;============================================================================ NKSYS: EQU 60 ;SYSTEM SIZE IN K BYTES KBÛþNNNNNNNNNNNNNNNN¡¡¡þËþNNNNNNNNNNNNNNNNNNNNNN¡¡¡û================================================= ; ; OTHER DECLARATIONS ; ;================================================vÿùNNNNNNNNNNNNNNNN¡¡¡þ $5NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ASCII CHARS ; ;============================================================================ LF: EQU 0AH CR: EQU 0DH CTRLý«ÿÂNNNNNNNNNNNNNNNN¡¡¡þINNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; INITIALIZE VERSION TEXT IN RAM MACRO ; ;@@@@@@@@@@@@@@@@@@@@i»þ„NNNNNNNNNNNNNNNNN¡¡¡þë‚NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNSOLE INPUT JP COC ;CONSOLE OUTPUT JP LO ;PRINTER OUTPUT JP PUNCH JP READER JP HOME ;HOME SELECTED DRIVE JP SELDS¦ÌþBNNNNNNNNNNNNNNNN¡¡¡þA$NNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡û#################################### BIOSSZ: DW BIOSND - BIOS ;BIOS MODULE SIZE IN BYTES BIOSST: DW BIOS ;BIOS MODULE LOAD ADÒþ$NNNNNNNNNNNNNNNN¡¡¡þ%«zNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û------------------- INIT: ; ; SET TEMPORARY STACK ; LD SP,DEFBFR ;USE PAGE 0 FOR STACK ; ; MAKE SURE ROM IS ENABLED ÈÖþrNNNNNNNNNNNNNNNNN¡¡¡þ+ˆuNNNNNNNNNNNNNNNNNNNNNN¡¡¡û Vers ' PVERS VERSN DM CR,LF IF $ > (DIRBF + SECSZ) CONMSG **** WARNING! COLD INIT CODE BIGGER THAN DIR BUFFER *òÿÂNNNNNNNNNNNNNNNNN¡¡¡þ4 NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûYTE: EQU 1024 CPMSZ: EQU KBYTE * NKSYS CPMBS: EQU CPMSZ - (20 * KBYTE) ; CP/M BIAS VALUE CCP: EQU CPMBS + 3400H ;ADDR OF CCP µ7ÿÂNNNNNNNNNNNNNNNN¡¡¡þÛÀNNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡û============================ SECSZ: EQU 128 NDRVS: EQU 6 IF BOOT = 10H ; ; 8" HARD DISK BOOT DATA ; STHD EQU 0 ;STAtþNNNNNNNNNNNNNNNN¡¡¡þqfNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûZ: EQU 1AH ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE THE TRANSLATION TAB+þÉNNNNNNNNNNNNNNNNN¡¡¡þ�ÞNNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ PVERS MACRO #VERS DD DL #VERS IF DD > 9999 DB (DD / 10000) + '0óWþNNNNNNNNNNNNNNNN¡¡¡þ¾ÑNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûK ;SELECT DISK DRIVE JP SETTRK ;SET TRACK # JP SETSEC ;SET SECTOR # JP SETDMA ;SET TRANSFER ADDR JP DISKRD ;PERFORM Ïþ9NNNNNNNNNNNNNNNNN¡¡¡þ T�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDR FOR SBD ; ; CONTINUE ON WITH INIT ; INIT1: JR INIT ;##############################################################œAþ9NNNNNNNNNNNNNNNN¡¡¡þ&þ)NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û ; CALL GETMON ; ; INIT DEFAULT DRIVE ; LD A,(DK_PROM + 1) ;USE DRIVE # PASSED IN PAGE 0 AND A,3 LD (DEFDRV),A ; ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ,âNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û*** ELSE DS DIRBF+SECSZ-$ ;FILL OUT DIRECTORY BUFFER TO 1 SECTOR SIZE ENDIF ;------------------------------------{ðÿÎNNNNNNNNNNNNNNNNN¡¡¡þ:NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û BDOS: EQU CPMBS + 3C00H ;ADDRESS OF BDOS BIOS: EQU CPMBS + 4A00H ;ADDRESS OF BDOS BIOSR: EQU 1000H - BIOS ; ; PAGE 0 LOCAv˜þNNNNNNNNNNNNNNNNNNN¡¡¡þ èñNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRT LOGICAL DRIVE OF HARD DISK NDHD EQU 3 ;LAST LOGICAL DRIVE OF HARD DISK ST8FD EQU 4 ;START LOGICAL DRIVE OF 8" FLOPPY ND8›¼ÿÈNNNNNNNNNNNNNNNN¡¡¡þBWNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ GXLATE MACRO #SECTORS, #SKEW LIST ÷¥þ'NNNNNNNNNNNNNNNNN¡¡¡þ®ïNNNNNNNNNNNNNNNNNNNNNN¡¡¡û' DD DL DD % 10000 ENDIF IF DD > 999 DB (DD / 1000) + '0' DD DL DD % 1000 ENDIF DB (DD / 100) + '0' DB '.' :aþ„NNNNNNNNNNNNNNNNN¡¡¡þ�àNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DISK READ JP DISKWR ;PERFORM DISK WRITE JP LISTST ;RETURN LIST STATUS JP SECTRN ;TRANSLATE SECTOR JP BIOFUNC ;EXECUõÐþINNNNNNNNNNNNNNNNN¡¡¡þ!g¾NNNNNNNNNNNNNNNNNNNNNN¡¡¡û############## ; ; DIRECTORY SECTOR BUFFER STARTS HERE AFTER CRUNCHING COLD START ; CODE. THIS BUFFER IS USED BY THE CP/M DIþNNNNNNNNNNNNNNNNN¡¡¡þ'ÍNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; SEND SYSTEM SIGN-ON ; CLOGO: LD HL,MSGSO CALL EDITOR ; ; MODIFY COLD START VECTOR TO WARM START ; LD HL,(BIOS+4) EÿÎNNNNNNNNNNNNNNNNN¡¡¡þ-"ÓNNNNNNNNNNNNNNNNNNNNNN¡¡¡û---------------------- ; ; WARM REBOOT ENTRY LOADS CCP,BDOS FROM DISK & ; SETS UP VARIABLES ; ;----------------------------Ù‹ÿíNNNNNNNNNNNNNNNNN¡¡¡þž­NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTIONS ; PAGE0: EQU 0 ;START OF CP/M RAM IOBYTE: EQU PAGE0 + 3 ;IOBYTE ADDR DEFDRV: EQU PAGE0 + 4 ;DEFAULT DRIVE PARAM ADDR F’þ�NNNNNNNNNNNNNNNNN¡¡¡þ ½¢NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFD EQU 5 ;LAST LOGICAL DRIVE OF 8" FLOPPY ENDIF IF BOOT = 3 ; ; 8" FLOPPY BOOT DATA ; STHD EQU 2 ;START LOGICAL ÓêÿîNNNNNNNNNNNNNNNNN¡¡¡þQNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOFF NXTSEC DL 1 ;;START WITH SECTOR 1 LOWEST DL 1 ;; REPT #SECTORS LIST ON DB NXTSEC LIST OFF NXTSEC DL NXTSEC + #SlÿdNNNNNNNNNNNNNNNN¡¡¡þû¼NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û DB ((DD % 100) / 10) + '0' DB (DD % 10) + '0' ENDM SUBTTL BIOS CODE ORG BIOS ;------------------------------------« ÿÈNNNNNNNNNNNNNNNNN¡¡¡þwNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûTE FUNCTION CALL ;############################################################################ ; ; THESE BOOT PARAMS MUSTxzÿÂNNNNNNNNNNNNNNNNN¡¡¡þ"2íNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRECTORY CHECK ROUTINES THAT ; CHECK FOR DISK CHANGE. ; ;####################################################################>\ÿòNNNNNNNNNNNNNNNNN¡¡¡þ(Ý&NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD (BIOS+1),HL ; ; BOOT CCP & BDOS ; JR WARM ;####################################################################¼ÀþrNNNNNNNNNNNNNNN¡¡¡þ.w€NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û------------------------------ WARM: IF INTRPTS ; ; SET INTERRUPT VECTOR TABLE BASE ; LD A,HIGH INTABL LD I,A ; ; _þNNNNNNNNNNNNNNNNN¡¡¡þ­œNNNNNNNNNNNNNNNNNNNNNN¡¡¡û BDOSJV EQU PAGE0 + 5 ;BDOS SYSTEM CALL ENTRY DEFBFR EQU PAGE0 + 80H ;DEFAULT BUFFER ; ; BIOS FUNCTION CALL RESTART VECTOR ž þ'NNNNNNNNNNNNNNNNNN¡¡¡þ Ž“NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDRIVE OF HARD DISK NDHD EQU 5 ;LAST LOGICAL DRIVE OF HARD DISK ST8FD EQU 0 ;START LOGICAL DRIVE OF 8" FLOPPY ND8FD EQU 1 ;=DþNNNNNNNNNNNNNNNNN¡¡¡þb+NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûKEW ;ADD SKEW FACTOR ;; IF NXTSEC > #SECTORS ;CHECK FOR OVERFLOW NXTSEC DL NXTSEC - #SECTORS ;; IF NXTSEC <= LOWEST ;cþBNNNNNNNNNNNNNNN¡¡¡þÈ�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û---------------------------------------- ; ; BIOS JUMP VECTOR TABLE ; ;---------------------------------------------------òþ'NNNNNNNNNNNNNNNNN¡¡¡þ'FNNNNNNNNNNNNNNNNNNNNNN¡¡¡û RESIDE AS DEFINED RIGHT BEFORE THE COLD INIT ; ROUTINE START AND MUST BE IN THE 1ST SECTOR. THESE 2 WORDS ARE REFERENCED ; *øþrNNNNNNNNNNNNNNNN¡¡¡þ#ÜNNNNNNNNNNNNNNNNNNNNNN¡¡¡û######## DIRBF: EQU $ ;BUFFER BEGINNING ;---------------------------------------------------------------------------- ; ÇÿòNNNNNNNNNNNNNNNNN¡¡¡þ)îNNNNNNNNNNNNNNNNNNNNNN¡¡¡û######## ; ; SIGN-ON MESSAGE ; ;############################################################################ MSGSO: DB CR,LÞþ9NNNNNNNNNNNNNNNN¡¡¡þ/D±NNNNNNNNNNNNNNNNNNNNNN¡¡¡û SET INTERRUPT MODE TO 2 ; IM 2 ; ; ENABLE INTERRUPT VECTOR 7 ; IN A,(M2_IMASK) AND A,7FH OUT (M2_IMASK),A ; ;»1ÿÂNNNNNNNNNNNNNNNN¡¡¡þøÏNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; BFUNRST EQU 28H BFUNRSV EQU PAGE0 + BFUNRST BFUNRSI EQU 0C7H + BFUNRST ; TPA: EQU 100H ;===========================ž�ÿÂNNNNNNNNNNNNNNNN¡¡¡þ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLAST LOGICAL DRIVE OF 8" FLOPPY ENDIF ;============================================================================ ; ÄAþHNNNNNNNNNNNNNNNNNN¡¡¡þ7xNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCHECK FOR REPEAT NXTSEC DL LOWEST + 1 LOWEST DL NXTSEC ENDIF ENDIF ;; ENDM LIST ON ENDM ;@@@@@@@@@@@@@@@@@=þ„NNNNNNNNNNNNNNNN¡¡¡þسNNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡û------------------------- JP INIT1 ;COLD START ENTRY JP WARM ;RELOAD CCP/BDOS JP CNSCK ;GET CONSOLE STATUS JP CI ;CO�°þ$NNNNNNNNNNNNNNNN¡¡¡þrNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBY THE BOOT CODE IN ORDER TO FIND THE LOAD ADDRESS FOR THE BIOS & IT'S ; LENGTH. ; ;########################################vçþ9NNNNNNNNNNNNNNNNN¡¡¡þ$˜KNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; INIT - COLD START ENTRY FROM BOOT MUST SET ALL BIOS PARAMS ; ;---------------------------------------------------------ö¿þ9NNNNNNNNNNNNNNNNN¡¡¡þ*»DNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûF DB CPMSZ / (KBYTE * 10) + '0' DB (CPMSZ MOD (KBYTE * 10)) / KBYTE + '0' DB 'K CP/M-80 Vers 2.2',CR,LF DB 'M5b CBIOS Òþ NNNNNNNNNNNNNNNN¡¡¡þ0WüNNNNNNNNNNNNNNNNNNNNNN¡¡¡û FINALLY ENABLE VECTORED INTERRUPTS ; IN A,(M2_STAT) OR A,M2_IEN OUT (M2_STAT),A EI ENDIF ; ; SET TEMPORARY STõ›þ$NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�Î�œ‚jƒ9„…Ô…¢†p‡>ˆ ‰Ú‰§Šv‹CŒ�ß�­Ž{�I�‘呲’€“N”•ê•·–…—S˜!™î™¼š‹›Yœ&�õ�ž�Ÿ] +¡ø¡Ç¢”£b¤0¥þ¥Ë¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þÍ´NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûACK ; LD SP,DEFBFR ; ; INSURE MONITOR ROM STILL ENABLED ; CALL GETMON ; IF BOOT = 10H ; TEST ISHA HOST ADAPTER5 ÿòNNNNNNNNNNNNNNNN¡¡¡þgNNNNNNNNNNNNNNNNNNNNNN¡¡¡û A,(DEFBFR) CP A,86H JR C,WEROR ; ; SET UP TO LOAD CCP/BDOS ; LD HL,(DEFBFR + BD_SBDSS) ;PREFETCH BDOS TRK/SECTOR PdjþBNNNNNNNNNNNNNNNN¡¡¡þ ˆÙNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD ; ; ELSE DONE READING SYSTEM ; JP WZRPG ; ; ; ELSE SET UP & READ BDOS ; RDBDOS: POP HL ;RESTORE BDOS TRK/SECTORó»ÿœNNNNNNNNNNNNNNNN¡¡¡þ¨¥NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûINTCPTS ; ; PUT BDOS VECTOR INTO INTERCEPT CODE ; LD HL,(BDOS + 7) LD (BDOSV),HL ; ; NOW PUT INTERCEPT VECTOR INTO ÈÿBNNNNNNNNNNNNNNNNN¡¡¡þGnNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DISKRD: LD A,PB_READC ;SELECT READ OP JP DISKOP ;‹ÅÿyNNNNNNNNNNNNNNNN¡¡¡þíÈNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUPPORTED DRIVE REQUESTED THEN RETURN 0 (ERROR) ; LD A,C CP A,NDRVS RET NC ; ; STORE DRIVE # FOR FUTURE USE ; LD (B(ÊÿHNNNNNNNNNNNNNNNN¡¡¡þ%–NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDRIVE ; LD (DTPTR),HL ;SAVE DRIVE TABLE PTR ; ; ATTEMPT TO READ ID SECTOR ; XOR A,A ;INIT FLAG BYTE UNTIL FIRMWARE RE=ÿäNNNNNNNNNNNNNNNNN¡¡¡þ+$™NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûO ; SEL1: PUSH HL LD HL,(DVRTPTR) LD DE,DVRFLG ADD HL,DE EX DE,HL POP HL LD BC,DVRSIZ - DVRFLG LDIR ; ; RETUE®ÿ!NNNNNNNNNNNNNNNNN¡¡¡þ˜çNNNNNNNNNNNNNNNNNNNNNN¡¡¡û FOR A HUNG CONDITION AND CLEAR IF TRUE ; IN A,(ISH_STATUS) ;IF HOST ADAPTER BUSY THEN BIT ISH_BSYB,A JR Z,NTHUNG ; LD‘‹ÿçNNNNNNNNNNNNNNNNN¡¡¡þw,NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUSH HL ; LD HL,(DEFBFR + BD_SCCPS) ;FETCH CCP TRK/SECTOR LD C,L LD B,0 CALL SETSEC ; LD C,H CALL SETTRK ; LD BCIˆÿdNNNNNNNNNNNNNNNN¡¡¡þÝŠNNNNNNNNNNNNNNNNNNNNNN¡¡¡û FROM DIRECTORY LD C,L LD B,A ;A STILL CONTAINS 0 CALL SETSEC ; LD C,H CALL SETTRK ; JR WREAD ; ; ; WARM BOO½ ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ12NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûBDOS CODE ; LD HL,INTCPT LD (BDOS + 7),HL ; ; INITIALIZE CLOCK VECTORS IF CLOCK INSTALLED ; LD C,CLK_F7 ;TEST FOR BOÀÿòNNNNNNNNNNNNNNNN¡¡¡þ=NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; WRITE A DISK SECTOR ; EXIT - A= 0: OK; /0: EèÊÿÉNNNNNNNNNNNNNNNNN¡¡¡þ øcNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûTDRV),A ; ; SAVE LOGON REQUEST FLAG ; LD A,E LD (LOGRQ),A ; ; COMPUTE DISK DRIVER TABLE PTR ; CALL RETDVRT ;DRI|RÿòNNNNNNNNNNNNNNNN¡¡¡þ&RÅNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûVISED LD (IOPB + PB_ST2O),A ; CALL DISKLOG JP NZ,FDSKER ; ; IF NO ID SECTOR THEN USE DEFAULTS ; LD A,(IOPB + PB_ST8ÿäNNNNNNNNNNNNNNNNN¡¡¡þ,½NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRN DRIVE TABLE PTR ; LD HL,(DTPTR) XOR A,A RET ; ; ; IF NOT HARD DISK THEN GO DO FLOPPY TEST ; LGDEF: LD A,(BTDRV)ÏþÿÈNNNNNNNNNNNNNNNNN¡¡¡þ«ÖNNNNNNNNNNNNNNNNNNNNNN¡¡¡û A,PB_CLRC LD (IOPB + PB_CMDO),A CALL XPRIM ; NTHUNG: ENDIF ; ; LOG ON DRIVE TO INIT TABLES ; LD A,(DK_PROM + 1K¡ÿyNNNNNNNNNNNNNNNNN¡¡¡þ DNNNNNNNNNNNNNNNNNNNNNN¡¡¡û,CCP CALL SETDMA ; ; READ CCP/BDOS ; WREAD: CALL DISKRD JR NZ,WEROR ;IF ERROR THEN EXIT ; ; NEXT SECTOR ; LD HL™æÿÎNNNNNNNNNNNNNNNN¡¡¡þî»NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT ERROR, OUTPUT MSG & HALT ; WEROR: LD HL,MSGLE ;OUTPUT ERROR MESSAGE CALL EDITOR HALT ; ; ; BOOT OK, INIT PAGE 0 ; HyÿNNNNNNNNNNNNNNNNN¡¡¡þNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûARD PRESENT CALL CLK1 ; ; IF CLOCK PRESENT THEN TURN ON CLOCK DRIVE ; OR A,A LD A,38H ;COND. JR (ON) JR NZ,CLKON ûÿ9NNNNNNNNNNNNNNNNN¡¡¡þ! NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DISKWR: LD A,PB_WRITC ;SELECT WRITE OPÞ–ÿrNNNNNNNNNNNNNNNNN¡¡¡þ!ËRNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûVE IS STILL IN C REGISTER LD (DVRTPTR),HL ; ; PREFETCH DRIVER EXECUTION ADDRESS FROM TABLE ; LD E,(HL) ;STORE ADDRESS 'úÿ!NNNNNNNNNNNNNNN¡¡¡þ'aôNNNNNNNNNNNNNNNNNNNNNN¡¡¡û2O) CP A,-2 ;0: NO ID, -1: JADE ID, -2: EXTENDED ID JR NZ,LGDEF ; ; ELSE XFER ID SECTOR DATA TO TABLES ; CALL TRNONE¢þBNNNNNNNNNNNNNNNN¡¡¡þ-Ž?NNNNNNNNNNNNNNNNNNNNNN¡¡¡û IF STHD <> 0 CP A,STHD JR C,LGCKFD ENDIF CP A,NDHD + 1 JR NC,LGCKFD ; ; ELSE USE HARD DISK DEFAULTS ; CA=Üÿ'NNNNNNNNNNNNNNNNN¡¡¡þ2ANNNNNNNNNNNNNNNNNNNNNN¡¡¡û) AND A,3 ;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 DIœWÿHNNNNNNNNNNNNNNNNN¡¡¡þ NNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û,BTSEC INC (HL) ; LD DE,SECSZ ;DMA := DMA + SECTOR SIZE LD HL,(BTDMA) ADD HL,DE LD (BTDMA),HL ; ; IF NOT INTO BDOBÿÎNNNNNNNNNNNNNNNNN¡¡¡þýöNNNNNNNNNNNNNNNNNNNNNN¡¡¡û WZRPG: ; ; INIT BIOS WARM START IN PAGE 0 ; LD A,0C3H LD HL,BIOS + 3 LD (PAGE0),A LD (PAGE0 + 1),HL ; ; INIT B¬-ÿäNNNNNNNNNNNNNNNN¡¡¡þWPNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ; ELSE TURN OFF CLOCK DRIVE ; LD A,18H ;UNCOND. JR (OFF) (CAUSES JUMP TO ILLEGAL) ; CLKON: LD (INHCLK),A ; ENDIF âËÿíNNNNNNNNNNNNNNNNN¡¡¡þ¸›NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û JP DISKOP ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SELECT DRIVE FUNCTION ; LÈÐÿòNNNNNNNNNNNNNNNNN¡¡¡þ"žNNNNNNNNNNNNNNNNNNNNNN¡¡¡û INC HL LD D,(HL) INC HL LD (DVRXADR),DE ; ; FETCH FLAGS ; LD C,(HL) ; ; COMPUTE DISK PARAMETER TABLE ADDRESS Ž2ÿäNNNNNNNNNNNNNNNNN¡¡¡þ(qÊNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;ASSUME NO TRANSLATION ; ; IF HARD DISK OR DOUBLE DENSITY THEN NO TRANSLATION ; LD A,(DEFBFR + ID_FLGO) AND A,[1 SHL B£ÿrNNNNNNNNNNNNNNN¡¡¡þ.ÛlNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûLL TRNONE ; NO XLATE LD HL,HDPBK ; ; XFER DATA TO TABLES ; SEL2: PUSH HL CALL DPBAD ; USE DEFAULT TABLE POP HL À®ÿäNNNNNNNNNNNNNNNNN¡¡¡þpNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûRECTORY ; LD BC,DEFBFR ;SET XFER ADDRESS (USE DEFAULT BUFFER) CALL SETDMA ; LD BC,BD_SEC ;SET DIRECTORY SECTOR CALL TŒÿ'NNNNNNNNNNNNNNNNNN¡¡¡þ "NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS THEN READ NEXT SECTOR ; LD DE,BDOS XOR A,A SBC HL,DE JR C,WREAD ; ; ELSE IF AT BEGINNING OF BDOS THEN SET UP NEW DeÿòNNNNNNNNNNNNNNNNN¡¡¡þÎÇNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDOS CALL VECTOR IN PAGE 0 ; LD HL,BDOS + 6 LD (BDOSJV),A LD (BDOSJV + 1),HL ; ; INIT BIOS CALL VECTOR IN PAGE 0 ; gÿ!NNNNNNNNNNNNNNN¡¡¡þdaNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; PASS DEFAULT DISK TO CCP ; LD A,(DEFDRV) LD C,A JP CCP SUBTTL BIOS DISK FUNCTION ROUTINES ;+++++++++++++++++ Èÿ'NNNNNNNNNNNNNNNNN¡¡¡þ‹ªNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOG-ON - SET DISK PARAMETER BLOCK ; ENTRY- C= DRIVE # ; E= 0 IF NEW SELECT ; EXIT - HL= PTR TO DPT OR 0 FOR ERROR ; ;++++++UÁÿNNNNNNNNNNNNNNNN¡¡¡þ#­0NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; 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 NÉnÿNNNNNNNNNNNNNNNNN¡¡¡þ)BûNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDF_DTDB] OR [1 SHL DF_HARDB] ; ; ELSE SET TRANSLATION ; CALL Z,TR8 ; ; XFER DISK DATA TO DPB ; NOX: CALL DPBAD ;Go§ÿrNNNNNNNNNNNNNNNN¡¡¡þ/è]NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD BC,DPBSZ LDIR JR SEL1 ; ; ; USE 8" FLOPPY DEFAULTS ; LGCKFD: CALL TR8 LD HL,SD8PBK JR SEL2 ;************ß~þBNNNNNNNNNNNNNNNN¡¡¡þT#NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSETSEC ; LD BC,0 ;SET TRACK TO 0 CALL SETTRK ; CALL DISKRD JR NZ,WEROR ; ; CHECK FOR VALID BOOT DIRECTORY ; LDà-ÿáNNNNNNNNNNNNNNNN¡¡¡þ »èNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûTRACK & SECTOR ; JR Z,RDBDOS ; ; ELSE IF NOT AT BIOS THEN READ NEXT SECTOR ; LD DE,BIOS - BDOS SBC HL,DE JP C,WREA©ÁÿNNNNNNNNNNNNNNNNNNN¡¡¡þ›”NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLD HL,BIOFUNC LD (BFUNRSV),A LD (BFUNRSV + 1),HL ; ; SET DEFAULT SECTOR BUFFER ; LD BC,DEFBFR CALL SETDMA ; IF ŽÿòNNNNNNNNNNNNNNNN¡¡¡þt_NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; READ A DISK SECTOR ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++mÿäNNNNNNNNNNNNNNNN¡¡¡þÞùNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ SELDSK: ; ; ASSUME ERROR ; LD HL,0 ; ; IF UNStdÿNNNNNNNNNNNNNNNNN¡¡¡þ$4§NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOT FIRST SELECT OR LOGON INHIBITED THEN RETURN TABLE PTR ; LD A,(LOGRQ) OR A,C CPL AND A,1 RET Z ; ; ELSE LOG ON ¦–ÿÂNNNNNNNNNNNNNNNNN¡¡¡þ*¨NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûET ADDR OF DPB LD HL,DEFBFR + ID_SPTO LD BC,DPBSZ LDIR ; ; XFER DISK PHYSICAL DATA TO TABLE ; LD HL,DEFBFR + ID_FLGØÉÿrNNNNNNNNNNNNNNNN¡¡¡þ0ûNNNNNNNNNNNNNNNNNNNNNN¡¡¡û**************************************************************** ; ; HOME DRIVE - TREAT AS SEEK TRK 0 ; EXIT - BC= 0 ; ;*µÍþHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÎNNNNNNý€Ë�˜‚eƒ4„…Ï…�†l‡9ˆ‰Õ‰¢Šp‹>Œ �Ù�¨Žu�C�‘ß‘¬’{“I”•æ•´–‚—P˜™ë™¹šˆ›Vœ$�ó�Àž�Ÿ\ )¡÷¡Æ¢“£a¤/¥ý¥Ê¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þú„NNNNNNNNNNNNNNNNNNNNNN¡¡¡û*************************************************************************** HOME: LD BC,0 ;*******************************šqþNNNNNNNNNNNNNNNNNN¡¡¡þP"NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û******************** SETDMA: LD (BTDMA),BC XOR A,A LD (BTDMAX),A RET ;++++++++++++++++++++++++++++++++++++++++++++++Jþ!NNNNNNNNNNNNNNNN¡¡¡þ ¿éNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûC RET SUBTTL DISK SUPPORT ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; µ2þNNNNNNNNNNNNNNNN¡¡¡þŸ•NNNNNNNNNNNNNNNNNNNNNN¡¡¡û CODE ; ENTRY- A= IOPB COMMAND ; EXIT - A= 0: OK; /0: ERROR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++D„þrNNNNNNNNNNNNNNNNN¡¡¡þp^NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD A,(DE) ;FETCH BYTE PUSH DE ;SAVE REGS PUSH BC CALL PRHEX ;OUTPUT ERROR CODE ; LD C,' ' CALL COC ; POP BC ;RE3ìÿòNNNNNNNNNNNNNNNN¡¡¡þÚøNNNNNNNNNNNNNNNNNNNNNN¡¡¡û;RETURN DPB_PTR = 0 FOR SELECT FUNCTION LD A,-1 ;RETURN -1 TO BDOS OR A,A RET ;*************************************5þ$NNNNNNNNNNNNNNNN¡¡¡þ%0¦NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++ ; ; RETURN DRIVE PARAMETER BLOCK ADDR FUNCTION ; EXIT - DE= DPB PTR ; HL= ? ; ;++++++++++++++++++++++++++++áÿÂNNNNNNNNNNNNNNNNN¡¡¡þ+©NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûH LOGICAL DRIVE ; LD A,(BTDRV) ;IF EVEN THEN ADD 0 ELSE ADD 128 RRCA AND A,80H LD E,A ;COMPUTE SECTOR LD D,0 LD Hëþ'NNNNNNNNNNNNNNNNNN¡¡¡þ¯×NNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************************************* ; ; SET TRACK # ; ENTRY- BC= TRACK # ; ;*************************************½Lþ9NNNNNNNNNNNNNNNN¡¡¡þ@NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++ ; ; SECTOR TRANSLATION FUNCTION ; ENTRY- DE= 0: NO XLATE, ELSE PTR TO XLATE TABLE ; BC= SECT(¿þÉNNNNNNNNNNNNNNNN¡¡¡þêºNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLOGON DISK FUNCTION ; EXIT - A= 0: OK; /0: ERROR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Q×þ$NNNNNNNNNNNNNNNNN¡¡¡þNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++ DISKOP: ; ; SET UP IOPB ; LD HL,BTTRK LD DE,IOPB + PB_TRKO LD BC,PB_BCNTO - PB_TRKO LDIR ; DISKO€ÔÿÂNNNNNNNNNNNNNNNN¡¡¡þ% NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSTORE REGS POP DE INC DE ;NEXT ERROR BYTE DJNZ DSKER1 ;IF NOT DONE THEN LOOP ; LD HL,DSKEB ;OUTPUT ERROR MESSAGE CAaþ NNNNNNNNNNNNNNNNN¡¡¡þ ÏSNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*************************************** ; ; SET 3740 SECTOR TRANSLATION PROCEDURE ; ENTRY- (DTPTR)= MUST BE PTR TO DTP ; EXI•ýþrNNNNNNNNNNNNNNNN¡¡¡þ&eõNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++ DPBAD: LD HL,(DTPTR) ;FETCH BASE ADDR LD DE,10 ;ADD OFFSET OF DPB PTR ADDÛ§ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ,Š>NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûL,(IOPB + PB_SECO) ; PUSH HL ;SAVE SECTOR TO RESTORE LATER ; ADD HL,DE LD (IOPB + PB_SECO),HL ; ; EXECUTE IOPB ; ÙÿáNNNNNNNNNNNNNNNN¡¡¡þœæNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û*************************************** SETTRK: LD (BTTRK),BC RET ;***************************************************±/þNNNNNNNNNNNNNNNNNN¡¡¡þ s-NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOR # TO XLATE ; EXIT - HL= XLATED SECTOR OR (BC) + 1 ; BC= UNCHANGED ; A, DE= ? ; ;++++++++++++++++++++++++++++++++++++++†�þNNNNNNNNNNNNNNNN¡¡¡þÙ‹NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û+++ DISKLOG: ; ; SET DESCRIPTOR SECTOR XFER ADDRESS TO DEFAULT BUFFER ; LD HL,DEFBFR LD (IOPB + PB_DMAO),HL XOR A,A ždÿ^NNNNNNNNNNNNNNNNN¡¡¡þ53NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûP2: LD (IOPB + PB_CMDO),A ; ; FETCH DRIVER VECTOR & EXECUTE DISK DRIVER ; DKOPLP: PUSH IY ;SAVE IY LD IY,(DVRTPTR) ö/ÿÂNNNNNNNNNNNNNNNNN¡¡¡þNNNNNNNNNNNNNNNNNNNNNN¡¡¡û######## ; ; BIOS FUNCTION TABLE ; ;############################################################################ BFUNTBL: ÜÿÈNNNNNNNNNNNNNNNNN¡¡¡þG†NNNNNNNNNNNNNNNNNNNNNN¡¡¡û DRIVER TABLE BASE PTR ; A, C= 0 ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; BIOµ³ÿrNNNNNNNNNNNNNNNN¡¡¡þd‰NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++ EXIOPB: ; ; SET UP FOR CALL ; LD HL,DK_DSKX LD A,(DK_PROM) CALL EXROM ; ; FETCH & RETURN RESULT STATUS ; *ÿòNNNNNNNNNNNNNNNNN¡¡¡þ Ž×NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOC ; ; RETURN DATA ; POP AF RET ;*************************************************************************** ; ;ƒØÿùNNNNNNNNNNNNNNNN¡¡¡þ&$qNNNNNNNNNNNNNNNNNNNNNN¡¡¡û11H ;THIS ADDR MODIFIED BY WARM BOOT RTN ; ; THE FOLLOWING CONDITIONAL JUMP IS MODIFIED TO AN UNCONDITIONAL JUMP BY ; THE W {ÿINNNNNNNNNNNNNNNNN¡¡¡þ,˺NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUT FUNCTION # ; POP HL LD A,L CALL PRHEX ; ; OUTPUT NEW LINE ; CALL CRLF ; ; RETURN NULLS ; XOR A,A ;BC = Y6ÿ!NNNNNNNNNNNNNNNN¡¡¡þÝbNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPPY DRIVER ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; JADE 8" FLOPPY DISK DRIKYÿÂNNNNNNNNNNNNNNNNN¡¡¡þ 2©NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûSPATCHER ; EXIT - A= -1: ERROR, 0: OK ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ BIOFUNÖÿçNNNNNNNNNNNNNNNN¡¡¡þ˜NNNNNNNNNNNNNNNNNNNNNN¡¡¡û DW RETVERS ;0:RETURN VERSION # DW RETDVRTF ;1:RETURN DISK PHYSICAL CONFIGURATION TABLE PTR DW EXIOPB ;2:EXECUTE THE IOPB ­‚ÿíNNNNNNNNNNNNNNNNN¡¡¡þt·NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS CALL ENTRY (E= DRIVE #) ; RETDVRTF: LD C,E ; RETDVRT: LD HL,DVR0 ;START AT 1ST TABLE ; ; IF DRIVE == 0 THEN ALREA;pÿáNNNNNNNNNNNNNNNNN¡¡¡þW¸NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLD A,(IX + PB_STATO) OR A,A ;TEST RESULT FOR RETURN RET SUBTTL NON-DISK PROCEDURES ;*******************************TÿòNNNNNNNNNNNNNNNNN¡¡¡þ!½æNNNNNNNNNNNNNNNNNNNNNN¡¡¡û NEWLINE PROCEDURE ; ;*************************************************************************** CRLF: LD C,CR CALL COC 'ïÿçNNNNNNNNNNNNNNNN¡¡¡þ'@NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûARM BOOT ROUTINE IF THE CLOCK/CALENDAR BOARD IS NOT PRESENT ; IF NOT MODIFIED, THEN IT IS ALLWAYS FALSE (NOP). ; INHCLK: JR .¨þNNNNNNNNNNNNNNNNNN¡¡¡þ-ø‹NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHL = A = 0 LD L,A LD H,A LD C,A LD B,A RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++,ÿäNNNNNNNNNNNNNNNNN¡¡¡þDõNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûVER FUNCTION ; ENTRY- IY= DRIVER TABLE PTR ; EXIT - A= 0: OK; /0: ERROR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++4!ÿ“NNNNNNNNNNNNNNNNN¡¡¡þ gúNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûC: ; ; IF FUNCTION # NOT IN TABLE THEN RETURN -1 ; LD A,C CP A,MAXFUNCS LD A,-1 RET NC ; ; ELSE COMPUTE TABLE E¿ÔÿçNNNNNNNNNNNNNNNNN¡¡¡þ‹BNNNNNNNNNNNNNNNNNNNNNN¡¡¡û MAXFUNCS EQU ($ - BFUNTBL) / 2 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN xÿäNNNNNNNNNNNNNNNN¡¡¡þ!äNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDY THERE ; LD A,C OR A,A RET Z ; ; ELSE IF ILLEGAL DRIVE THEN RETURN ERROR ; CP A,NDRVS JR C,RETDV2 ; OR A,A �éÿçNNNNNNNNNNNNNNNNN¡¡¡þÎ/NNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************************************* ; ; OUTPUT HEX DATA TO CONSOLE SUBR ; ENTRY- A= DATA ; EXIT - A, C= ? ; ;***$@ÿùNNNNNNNNNNNNNNNNN¡¡¡þ"èµNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLD C,LF JP COC IF INTCPTS SUBTTL ADDITIONAL FUNCTIONS TO SUPPORT CDOS PROGRAMS ;************************************‰bÿÉNNNNNNNNNNNNNNNNN¡¡¡þ(~NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûC,ILLEGC ; ; NOW CHECK FOR EXTENDED CALLS ; CP A,8DH ;IF RETURN VERSION THEN RETURN IT JR Z,RETCVER ; CP A,90H ;IF ß�ÿrNNNNNNNNNNNNNNN¡¡¡þ.­ØNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++ ; ; CDOS RETURN VERSION FUNCTION ; MAKES CLOCK/CALENDAR WORK. ; EXIT - B= 1 ; ;++++++++++++++++++++++++++++++++++ÝOÿNNNNNNNNNNNNNNNNN¡¡¡þwÄNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++ FD8EXEC: ; ; CONVERT LOGICAL DRIVE TO PHYSICAL DRIVE ; LD A,(IY + DVRPDRV) LD (IOPB + PB_DãÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ TËNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûNTRY ; PUSH HL ;SAVE POSSIBLE DATA ; LD HL,BFUNTBL LD A,C ADD A,A ADD A,L LD L,A LD A,0 ADC A,H LD H,A ; ûÞÿäNNNNNNNNNNNNNNNNN¡¡¡þ¸sNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBIOS VERSION # ; EXIT - HL= VERSION # IN BINARY {0.00,..655.35} ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++“ÌÿáNNNNNNNNNNNNNNN¡¡¡þÕNNNNNNNNNNNNNNNNNNNNNN¡¡¡û RET ; ; ; ELSE COMPUTE TABLE PTR ; RETDV2: LD B,C LD DE,DVRSIZ ; RETDVL: ADD HL,DE DJNZ RETDVL ; ; RETURN NO |ÔÿÈNNNNNNNNNNNNNNNNN¡¡¡þýNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************************************* PRHEX: ; ; PROCESS HIGH NIBBLE 1ST ; CALL PRDIÔÿòNNNNNNNNNNNNNNNN¡¡¡þ#Û„NNNNNNNNNNNNNNNNNNNNNN¡¡¡û*************************************** ; ; SYSTEM CALL INTERCEPT ROUTINE CHECKS FOR ILLEGAL BDOS CALLS & ; PRINTS MESSAGE I+CÿrNNNNNNNNNNNNNNNNN¡¡¡þ)4ONNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNOT CLOCK THEN ERR JR C,ILLEGC ; JR Z,CLKCAL ;IF CALENDAR THEN GET IT ; CP A,92H JR C,CLKSET ;IF SET FUNCTION THEN SETÀÏÿÂNNNNNNNNNNNNNNNN¡¡¡þ/žéNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++ RETCVER: LD B,1 RET SUBTTL CLOCK ROUTINES ;++++++++++++++++++++++++++++++++ºÿ!NNNNNNNNNNNNNNNN¡¡¡þ"—NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûRVO),A ; ; FETCH SECTOR DATA ; LD HL,(IOPB + PB_SECO) PUSH HL ;SAVE FOR XPRIM RESTORE ; ; ; EXECUTE THE IOPB ; ƒmÿ�NNNNNNNNNNNNNNNNN¡¡¡þ Í\NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; EXECUTE TABLE ADDRESS ; LD A,(HL) INC HL LD H,(HL) LD L,A ; EX (SP),HL ;PUT CALLER'S DATA IN HL, FUNCTION ADDR óÿîNNNNNNNNNNNNNNNNNN¡¡¡þí NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++ RETVERS: LD HL,VERSN XOR A,A ;RETURN NO ERROR RET ;++++++++++++++++++++++++++++++++++++++++++++G–ÿrNNNNNNNNNNNNNNNN¡¡¡þëNNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡ûERROR ; XOR A,A RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE IOPB FË`ÿäNNNNNNNNNNNNNNNN¡¡¡þ¨MNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûG ; ; SWAP HIGH & LOW NIBBLES ; PRDIG: RLCA RLCA RLCA RLCA ; ; SAVE DATA FOR RETURN ; PUSH AF ; ; CONVERT¸¼ÿÂNNNNNNNNNNNNNNNNN¡¡¡þ$BNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûF ILLEGAL. ALSO IMPLEMENTS CDOS CLOCK/CALENDAR ; SYSTEM CALLS FOR ASMB. ; ;*************************************************Ä{ÿrNNNNNNNNNNNNNNNNN¡¡¡þ*aNNNNNNNNNNNNNNNNNNNNNN¡¡¡û CLOCK ; JR Z,CLKTIM ;IF TIME THEN GET IT ; CP A,93H JR Z,CLKRDC ;IF READ CLOCK THEN GET IT ; ; ILLEGAL SYSTEM CALL «ÞÿäNNNNNNNNNNNNNNNN¡¡¡þ0�¤NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN CALENDAR FUNCTION 90H ; EXIT - A= DAY ; B= MONTH ; C= YEAR ; L=UÑÿHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHNNNNNNý€Ê�˜‚eƒ4„…Ï…�†k‡8ˆ‰Ó‰ Šn‹;Œ �Ö�¤Žr�@�‘Ü‘©’w“E”•ᕯ–}—K˜™æ™´šƒ›Qœ�î�»žŠŸW %¡ó¡Â¢�£]¤+¥ù¥Æ¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þŒ0NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û DAY OF WEEK ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ CLKCAL: LD HL,CLK_CAL ;ROM ENT‡¢ÿòNNNNNNNNNNNNNNNN¡¡¡þ&–NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************* ; ; CLOCK SET FUNCTION 91H ; ENTRY- DE= CLOCK IMAGE BUFR PTR (13 BYTES LONG) ; ;*****************Å¡ÿÂNNNNNNNNNNNNNNNN¡¡¡þ É]NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûROM ; ; ROM PROCEDURE RETURNS HERE ; EXROMR: PUSH AF ;SAVE RETURN VALUE CALL GETMON ;RESELECT MONITOR ROM ; POP AF þœNNNNNNNNNNNNNNNN¡¡¡þé!NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++ CNSCK: IF USEMON CALL GETMON JP MR_CONSTS ELSE IN A,(NT_STAT) ;IF Da—þBNNNNNNNNNNNNNNNNN¡¡¡þêNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ NTOST: IN A,(NT_STAT) CPL ;REVERSE SENSE AND A,1 SHL üüþrNNNNNNNNNNNNNNNN¡¡¡þ¬LNNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡û*********************************************************************** LO: IF USEMON CALL GETMON JP MR_LSTOUT ELSEë€ÿçNNNNNNNNNNNNNNNN¡¡¡þ%FNNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************* ; ; MESSAGE EDITOR ; ENTRY- HL= TEXT PTR (BIT 7= 1: TERMINATOR) ; EXIT - REGS= ? ; ;******?fþ„NNNNNNNNNNNNNNNNN¡¡¡þ+eNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSAV),A CALL GETMON ; ; PRINT PROMPT ; LD HL,ITMSG IQCONT: CALL EDITOR ; LD HL,IQMSG ;QUERY USER CALL EDITOR ; ;K^þ!NNNNNNNNNNNNNNNNN¡¡¡þÙcNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRY POINT JR CLK2 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN TIME FUNCTIONŽþNNNNNNNNNNNNNNNN¡¡¡þ6¨NNNNNNNNNNNNNNNNNNNNNN¡¡¡û*********************************************************** CLKSET: LD C,CLK_F2 ; CLK1: LD HL,CLK_FUN ; CLK2: LD A,CLK_RO§;þNNNNNNNNNNNNNNNN¡¡¡þœNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;RETURN VALUE RET SUBTTL CHAR I/O ROUTINES ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++>þINNNNNNNNNNNNNNNNN¡¡¡þp¶NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûATA NOT READY THEN RETURN 0 AND A,1 SHL NT_READY TTOST1: RET Z LD A,-1 ;ELSE RETURN -1 RET ENDIF ;*************žþ9NNNNNNNNNNNNNNNN¡¡¡þS¹NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûNT_BUSY JR TTOST1 ENDIF ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; READER DR‘ÄÿòNNNNNNNNNNNNNNNNN¡¡¡þ ¹çNNNNNNNNNNNNNNNNNNNNNN¡¡¡û RET ENDIF ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN LIST DEVICE STAQ¨þ9NNNNNNNNNNNNNNNN¡¡¡þ&ANNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************************************************************** EDITOR: LD C,(HL) ;MESSAGE EDIT LOOP PUSH HL ;SAVE PH­þHNNNNNNNNNNNNNNNNN¡¡¡þ,üŠNNNNNNNNNNNNNNNNNNNNNN¡¡¡û GET & ECHO USER INPUT ; CALL CI ; PUSH AF LD C,A CALL COC POP AF ; ; IF OPTION IS CTRL-C THEN WARM BOOT ; &¢þBNNNNNNNNNNNNNNNN¡¡¡þêRNNNNNNNNNNNNNNNNNNNNNN¡¡¡û 92H ; EXIT - A= SECONDS ; B= MINITS ; C= HOURS ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++åþ!NNNNNNNNNNNNNNNNN¡¡¡þ ™NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûM ; ; FALL INTO ROM EXECUTER ; ENDIF ;****************************************************************************CFþNNNNNNNNNNNNNNNNN¡¡¡þ¯?NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û+ ; ; CONSOLE INPUT ; EXIT - A= CHAR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ CI: �(ÿ³NNNNNNNNNNNNNNNNN¡¡¡þC‡NNNNNNNNNNNNNNNNNNNNNN¡¡¡û*************************************************************** ; ; CONSOLE OUTPUT ; ENTRY- C= CHAR TO OUTPUT ; ;**********]þBNNNNNNNNNNNNNNNNN¡¡¡þ`ˆNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIVER - DUMMY ; EXIT - A= CTRL-Z ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ READER: LD Ažôþ NNNNNNNNNNNNNNNNN¡¡¡þ!ŠÖNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTUS ; EXIT - A= 0: BUSY, FFH:READY ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ LISTST: ÊÄþ!NNNNNNNNNNNNNNN¡¡¡þ' pNNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡ûTR RES 7,C ;CLEAR BIT 7 FOR OUTPUT CALL COC ; POP HL BIT 7,(HL) ;IF BIT 7 SET THEN RETURN RET NZ ; INC HL ;ELSEûIþ!NNNNNNNNNNNNNNNN¡¡¡þ-Ï»NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCP A,3 ;IF CTRL-C THEN WARM BOOT JP Z,PAGE0 ; ; IF OPTION IS YES THEN WARM BOOT ; AND A,5FH ;IGNORE CASE ; CP A,'YðþäNNNNNNNNNNNNNNNNN¡¡¡þsÅNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++ CLKTIM: LD HL,CLK_TIM JR CLK2 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ;Sþ$NNNNNNNNNNNNNNNNN¡¡¡þ PÊNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; EXECUTE ROM ROUTINE ; ENTRY- HL= ENTRY ADDRESS ; A= ROM # ; EXIT - ? ; ;*******************************************ÐÿáNNNNNNNNNNNNNNNN¡¡¡þ¼rNNNNNNNNNNNNNNNNNNNNNN¡¡¡û IF USEMON CALL GETMON ;SWITCH IN MONITOR ROM JP MR_CONIN ;USE MONITOR ELSE CALL CNSCK ;IF NO CHAR RDY THEN WAIT ›xþINNNNNNNNNNNNNNNN¡¡¡þÔNNNNNNNNNNNNNNNNNNNNNN¡¡¡û****************************************************************** COC: IF USEMON CALL GETMON JP MR_CONOUT ELSE Cržþ�NNNNNNNNNNNNNNNNN¡¡¡þùNNNNNNNNNNNNNNNNNNNNNN¡¡¡û,CTRLZ ;FAKE EOF ;**************************************************************************** ; ; PUNCH DRIVER ; ENTRYG’ÿòNNNNNNNNNNNNNNNNN¡¡¡þ"ß…NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û IF USEMON CALL GETMON JP MR_LSTSTS ELSE LD A,-1 RET ENDIF ;*********************************************™¤þNNNNNNNNNNNNNNNNN¡¡¡þ(0NNNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡û PRINT NEXT CHAR JR EDITOR IF INTRPTS SUBTTL INTERRUPTS ;-------------------------------------------------------------Â3ÿòNNNNNNNNNNNNNNN¡¡¡þ.šèNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û' JP Z,PAGE0 ; ; IF OPTION IS INTERRUPT THEN EXECUTE RESTART 7 ; CP A,'I' JR NZ,ITRAP1 ; POP BC ;RESTORE REGS 1STŠiþ NNNNNNNNNNNNNNNNN¡¡¡þ@ôNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; READ CLOCK TIME FUNCTION 93H ; ENTRY- DE= PTR TO 13 BYTE BUFFER FOR CLOCK DATA ; ;+++++++++++++++++++++++++++++++++++++++¿¨ÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ cûNNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************************* EXROM: AND A,M2_RSMK ;MASK OUT UNUSED BITS OUT (M2_RSEL),A ; PUSH HL ;SAVE ROM ENTRY ¡¨ÿäNNNNNNNNNNNNNNNNN¡¡¡þ�CNNNNNNNNNNNNNNNNNNNNNN¡¡¡û JR Z,CI IN A,(NT_DATA) ;ELSE RETURN CHAR RET ENDIF ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ø°þNNNNNNNNNNNNNNNNN¡¡¡þ%åNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûALL NTOST ;IF BUSY THEN WAIT OR A,A JR Z,COC LD A,C OUT (NT_DATA),A RET ;+++++++++++++++++++++++++++++++++++++,cÿÈNNNNNNNNNNNNNNNNN¡¡¡þÊ.NNNNNNNNNNNNNNNNNNNNNN¡¡¡û- C= CHAR TO OUTPUT ; ;**************************************************************************** PUNCH: RET ;********‡mþBNNNNNNNNNNNNNNNN¡¡¡þ#ì´NNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************* ; ; GET MONITOR PROM SUBR ; EXIT - A= ? ; ;************************************************­}þäNNNNNNNNNNNNNNNNN¡¡¡þ)NNNNNNNNNNNNNNNNNNNNNN¡¡¡û--------------- ; ; USER INTERRUPT ; ;---------------------------------------------------------------------------- ITRAP: TþBNNNNNNNNNNNNNNNN¡¡¡þ/©ÙNNNNNNNNNNNNNNNNNNNNNN¡¡¡û POP HL POP AF JP 0038H ; ; IF OPTION IS MONITOR THEN EXECUTE MONITOR TRAP ; ITRAP1: CP A,'M' JR NZ,ITRAPR ; POíÜþ9NNNNNNNNNNNNNNNN¡¡¡þ§NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++ CLKRDC: LD C,CLK_F1 JR CLK1 ;***************************************************ç¯ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ úlNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûVECTOR ; LD HL,EXROMR ;PUT RETURN ADDR ON STACK EX (SP),HL ;SWAP RETURN ADDRESS WITH ROM ENTRY VECTOR JP (HL) ;EXECUTE sþ!NNNNNNNNNNNNNNNNN¡¡¡þÚNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û++++++++++++++ ; ; RETURN CONSOLE STATUS ; EXIT - A= 0: NOT READY ; FFH: CHAR READY ; ;+++++++++++++++++++++++++++++++ä¨þ NNNNNNNNNNNNNNNN¡¡¡þ5ÛNNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡û+++++++++++++++++++++++++++++++++++++++ ; ; RETURN CONSOLE OUTPUT READY STATUS ; EXIT - A= 0: BUSY, FFH: READY ; ;+++++++++Òìÿ“NNNNNNNNNNNNNNNN¡¡¡þŸ}NNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************************************************** ; ; PRINTER DRIVER ; ENTRY- C= CHAR TO OUTPUT ; ;*****fKÿÂNNNNNNNNNNNNNNNNN¡¡¡þ$u#NNNNNNNNNNNNNNNNNNNNNN¡¡¡û**************************** GETMON: LD A,MR_RNUM OUT (M2_RSEL),A RET ;*********************************************(pþBNNNNNNNNNNNNNNNNN¡¡¡þ*V,NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ; SAVE REGS FIRST ; PUSH AF PUSH HL PUSH BC ; ; SAVE CURRENT ROM & GET MONITOR ROM ; IN A,(M2_RSEL) LD (ROMAMÿòNNNNNNNNNNNNNNNN¡¡¡þ0º”NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûP BC POP HL POP AF JP 0F824H ; ; ELSE RESTORE REGS & RETURN ; ITRAPR: LD A,(ROMSAV) ;RESTORE ROM # OUT (M2_RSEL)SÜþ$NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÎNNNNNNNN�Î�›‚iƒ7„…Ò… †n‡;ˆ‰Ö‰£Šq‹>Œ �Û�ªŽx�F�‘â‘°’~“L”•é•·–…—S˜!™î™¼š‹›Yœ&�õ�Þ‘Ÿ^ ,¡û¡Ê¢—£e¤3¥¦Î¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þoîNNNNNNNNNNNNNNNNNNNNNN¡¡¡û,A ; POP BC POP HL POP AF EI ;RE-ENABLE INTERRUPTS RET ;------------------------------------------------------ ÿòNNNNNNNNNNNNNNNN¡¡¡þÅHNNNNNNNNNNNNNNNNNNNNNN¡¡¡û################################################### ; ; COMMON I/O PARAMETER BLOCK ; ;######################################ÅÔÿyNNNNNNNNNNNNNNNN¡¡¡þ *ƒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS 1 DVRDTYP DS 1 ;RESERVED FOR DISK TYPE DVRCYLS DS 2 ;DISK CYLINDERS DVRHDS DS 1 ;HEADS ; ; DEFINE THE STRUCTURE SIZE ;XÿÎNNNNNNNNNNNNNNNNN¡¡¡þ ÿNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûYPE DW #CY ;;CYLS DB #HD ;;HEADS LIST OFF ENDM DVR0: IF BOOT = 10H ALLDRV HDEXEC,4,60H,32,1,32,1,32,1,10H,256,4nùÿÂNNNNNNNNNNNNNNNNN¡¡¡þå4NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAULT 8" FLOPPY DISK PARAMETER BLOCK ; IBM 3740 SINGLE DENSITY FORMAT ; ;#####################################################ÃÿòNNNNNNNNNNNNNNNN¡¡¡þO’NNNNNNNNNNNNNNNNNNNNNN¡¡¡û###################################################### HDPBK: DW 128 ;SECTORS PER TRACK (LOGICAL) (SPT) DB 5 ;BLOCK SHIFT FþÿgNNNNNNNNNNNNNNNN¡¡¡þ%¥ÌNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE BOUNDARY ; IF $ AND 0FFH DS 100H - ($ AND 0FFH) ENDIF INTABL: REPT 7 ;1ST 7 ARE UNSUPPORTED LIST OFF DW ILLINT zÌÿrNNNNNNNNNNNNNNNNN¡¡¡þ+†ÃNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û###################################################### ; ; DRIVE PARAMETER HEADER AREA ; 1 PER DRIVE ; ;###################ª—ÿÂNNNNNNNNNNNNNNNNN¡¡¡þ:½NNNNNNNNNNNNNNNNNNNNNN¡¡¡û---------------------- ; ; UNSUPPORTED INTERRUPT ; ;------------------------------------------------------------------------pŽÿÂNNNNNNNNNNNNNNNN¡¡¡þÕvNNNNNNNNNNNNNNNNNNNNNN¡¡¡û###################################### IOPB: REPT PB_SIZE LIST OFF DB 0 LIST ON ENDM ;############################£êÿÉNNNNNNNNNNNNNNNN¡¡¡þÐNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DVRSIZ DS 0 ENDM ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; MACRO TO DEFINE THE mÞÿäNNNNNNNNNNNNNNNNN¡¡¡þ“hNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û ALLDRV HDEXEC,4,60H,32,1,32,1,32,1,10H,256,4 ALLDRV HDEXEC,5,60H,32,1,32,1,32,1,10H,256,4 ALLDRV HDEXEC,5,60H,32,1,32,1,3ÇÜÿ„NNNNNNNNNNNNNNNN¡¡¡þ°gNNNNNNNNNNNNNNNNNNNNNN¡¡¡û####################### SD8PBK: DW 26 ;SECTORS PER TRACK DB 3 ;BLOCK SHIFT FACTOR DB 7 ;BLOCK MASK DB 0 ;NULL MASK ½6ÿòNNNNNNNNNNNNNNNNN¡¡¡þ Z9NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûACTOR (BSH) DB 31 ;BLOCK MASK (BLM) DB 1 ;NULL MASK (EXM) DW 1015 ;DISK SIZE (CLUSTERS -1) (DSM) DW 1152 / 2 ;DI*íÿòNNNNNNNNNNNNNNNN¡¡¡þ&ðŸNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LIST ON ENDM ; DW ITRAP ;INT 8 IS USER INTERRUPT ENDIF ;########################################################^æÿHNNNNNNNNNNNNNNNNN¡¡¡þ,TNNNNNNNNNNNNNNNNNNNNNN¡¡¡û######################################################### ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@õ»ÿNNNNNNNNNNNNNNNNNN¡¡¡þ ŒNNNNNNNNNNNNNNNNNNNNNN¡¡¡û---- ILLINT: PUSH AF ;SAVE ALL 8080 REGS PUSH HL PUSH BC LD HL,ILLIM ;NOTIFY USER OF INT JR IQCONT SUBTTL INIT­ÿîNNNNNNNNNNNNNNNNNN¡¡¡þ æGNNNNNNNNNNNNNNNNNNNNNN¡¡¡û################################################ ; ; DISK DRIVER TABLES ; ;#################################################]ÿçNNNNNNNNNNNNNNNN¡¡¡þLáNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDRIVER TABLE RECORD ; ENTRY- #DADD= DRIVER ADDRESS ; #PD= PHYSICAL DRIVE # ; #FG= DRIVE FLAGS (IDFLGO) ; #S0= TRK 0 SPT ÍÿùNNNNNNNNNNNNNNNN¡¡¡þ YNNNNNNNNNNNNNNNNNNNNNN¡¡¡û2,1,10H,256,4 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,1 ENDIF IF BOOT = 3 ®ÿòNNNNNNNNNNNNNNNNN¡¡¡þƒVNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDW 242 ;DISK SIZE -1 DW 63 ;DIRECTORY MAX DB 11000000B ;ALLOC 0 DB 0 ;ALLOC 1 DW 16 ;CHECK SIZE DW 2 ;TRACK OFFSE›EÿòNNNNNNNNNNNNNNNNN¡¡¡þ!iNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRECTORY MAX (DRM) DB 0FFH ;ALLOCATION 0 (AL0) DB 10000000B ;ALLOCATION 1 (AL1) DW 0 ;CHECK SIZE (CKS) DW 2 ;TM­ÿÈNNNNNNNNNNNNNNNN¡¡¡þ'îNNNNNNNNNNNNNNNNNNNNNN¡¡¡û#################### ; ; MESSAGES ; ;############################################################################ MSGLE: Dgÿ!NNNNNNNNNNNNNNNN¡¡¡þ-,eNNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@ ; ; GENERATE A DISK PARAMETER TABLE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@–üÿäNNNNNNNNNNNNNNNNN¡¡¡þ�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIALIZED DATA ;############################################################################ ; ; 3740 SECTOR TRANSLATION TABLE 4àþHNNNNNNNNNNNNNNNNN¡¡¡þ ³NNNNNNNNNNNNNNNNNNNNNN¡¡¡û########################### STRUCT 0 DVRADD DS 2 ;START ADDRESS OF DISK DRIVER DVRFG DS 1 ;FLAGS (BIT 0= 1: INHIBIT LOGON) F_ÿBNNNNNNNNNNNNNNNN¡¡¡þ_¬NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; #Z0= TRK 0 SIZE ; #S1= TRK 1 SPT ; #Z1= TRK 1 SIZE ; #SD= DATA TRKS SPT ; #ZD= DATA TRKS SIZE ; ;@@@@@@@@@@@@@@@@@@1ÎÿdNNNNNNNNNNNNNNNN¡¡¡þõ NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û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,1 ALLDRV HDEXEC,4,60H,32,1,32,1,32,1,10H,256½ƒÿÈNNNNNNNNNNNNNNNNN¡¡¡þÁNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT DB 0 ;PHYSICAL RECORD SHIFT FACTOR DB 0 ;PHYSICAL RECORD MASK ; ; DEFAULT DISK PHYSICAL PARAMETERS ; DB 0 ;FLAGS#çÿùNNNNNNNNNNNNNNNNN¡¡¡þ"<[NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRACK OFFSET (OFF) ; ; ; DB 01100000B ;FLAGS 256 BPS, HARD, SSSD DB 32,1,32,1,32,1 ;32 SPT, 256 BPS DB 10H ;TYPE DWªÿ$NNNNNNNNNNNNNNNNN¡¡¡þ(Ó�NNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡ûDM CR,LF,'LOAD ERROR' ; DSKEM: DB CR,LF,'Disk Error Status:' DM CR,LF,'CM DR TL TH SL SH FG AL AH AX CL CH ST S1 S2 S3',CR,L^‘ÿòNNNNNNNNNNNNNNN¡¡¡þ.y6NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û@@@@@@@@@ ALLDPH: MACRO #D LIST ON D#D(DD)DPH: ;DRIVE PARAMETER HEADER FOR DRIVE #D(DD) DW 0 ;;SECTOR TRAN TBL (OR 0 IFÿ…ÿäNNNNNNNNNNNNNNNNN¡¡¡þ£*NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; **** CP/M SINGLE DENSITY **** ; ;############################################################################ SDTRAN: GXLAÔÀÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ €%NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDVRPDRV DS 1 ;PHYSICAL DRIVE ; ; THE FOLLOWING MAY BE BROUGHT OFF DISK DESCRIPTOR OR FROM DEFAULT TABLES ; DVRFLG DS 1 ;DI‘#ÿINNNNNNNNNNNNNNNNN¡¡¡þl�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ALLDRV MACRO #DADD,#PD,#FG,#S0,#Z0,#S1,#Z1,#SD,#ZD,#DT,#CY,#HD L@¼ÿáNNNNNNNNNNNNNNN¡¡¡þÆ;NNNNNNNNNNNNNNNNNNNNNN¡¡¡û,4 ALLDRV HDEXEC,4,60H,32,1,32,1,32,1,10H,256,4 ALLDRV HDEXEC,5,60H,32,1,32,1,32,1,10H,256,4 ALLDRV HDEXEC,5,60H,32,1,32,1¯sÿíNNNNNNNNNNNNNNNNN¡¡¡þ)ðNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DB 26,0,26,0,26,0 ;SECTORS PER TRACK, SECTOR SIZE (128) DB 0 ;TYPE DW 77 ;CYLS DB 1 ;HEADS ;###################ðìÿNNNNNNNNNNNNNNNN¡¡¡þ#jNNNNNNNNNNNNNNNNNNNNNN¡¡¡û 256 ;CYLS DB 4 ;HEADS ;############################################################################ ; ; MODE 2 INTER¸ôÿNNNNNNNNNNNNNNNNN¡¡¡þ)à¡NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûF DSKEB: DM CR,LF,'Abort, Ignore, Retry, (BDOS) - ' ; IF INTCPTS ISCMSG: DM CR,LF,'ILL SYS CALL, #= ' ENDIF IF INº?ÿrNNNNNNNNNNNNNNNN¡¡¡þ/JNNNNNNNNNNNNNNNNNNNNNN¡¡¡û NO XLATE) DW 0 ;;SCRATCH AREA DW 0 ;;" DW 0 ;;" DW DIRBF ;;DIRECTORY BUFFER PTR DW D#D(DD)DPB ;;DRIVE PARAMETER B<Öÿ9NNNNNNNNNNNNNNNN¡¡¡þöyNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTE 26,6 ; DB 1,7,13,19,25,5,11,17,23,3,9,15 ; DB 21,2,8,14,20,26,6,12,18,24,4,10 ; DB 16,22 ;#########################šCÿÎNNNNNNNNNNNNNNNNN¡¡¡þ ²NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSK FLAGS DVR0SPT DS 1 ;TRK 0 SECTORS PER TRK DVR0SZ DS 1 ;TRK 0 SECTOR SIZE DVR1SPT DS 1 DVR1SZ DS 1 DVRDSPT DS 1 DVRDSZ D$šÿçNNNNNNNNNNNNNNNNNN¡¡¡þ9ÎNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIST ON DW #DADD DB 0 ;;LOGON INHIBIT FLAG (LOGON ENABLED) DB #PD DB #FG DB #S0,#Z0,#S1,#Z1,#SD,#ZD DB #DT ;;DISK TÊ‹ÿ NNNNNNNNNNNNNNNN¡¡¡þÖNNNNNNNNNNNNNNNNNNNNNN¡¡¡û,32,1,10H,256,4 ENDIF LIST ON ;############################################################################ ; ; DEFTÿ“NNNNNNNNNNNNNNNN¡¡¡þ|£NNNNNNNNNNNNNNNNNNNNNN¡¡¡û######################################################### ; ; DEFAULT 8" HARD DISK PARAMETER BLOCK ; ;######################t”ÿrNNNNNNNNNNNNNNNNN¡¡¡þ$–ýNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRUPT VECTOR TABLE ; ;############################################################################ ; ; START ON AN EVEN PAGázÿ„NNNNNNNNNNNNNNNNN¡¡¡þ*µòNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTRPTS ITMSG DM CR,LF,'User' ILLIM DM CR,LF,'Ill.' IQMSG DM ' Int. Abort? (Y/N/I/M) - ' ENDIF ;######################IÜÿrNNNNNNNNNNNNNNNN¡¡¡þ0YJNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLK PTR IF ((DD - 1) <= NDHD) AND ((DD - 1) >= STHD) DW 0 ;;NO CHECKS ON HARD DISK ELSE DW D#D(DD)CHK ;;DRIVE DISK CTLÿ“NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN$NNNNNNý€Ê�˜‚fƒ4„…Ï…�†k‡8ˆ‰Ô‰¡Šo‹=Œ �Ù�§Žt�C�‘ß‘­’{“H”•䕲–�—O˜™ë™¹šˆ›Vœ$�ó�Áž�Ÿ^ ,¡ú¡È¢•£c¤1¥þ¥Ì¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þXÞNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûHECKSUMS ARRAY PTR ENDIF DW D#D(DD)ALL ;;DRIVE CLUSTER ALLOCATION BIT MAP PTR LIST OFF ENDM ; ; DEFINE THE DATA ;¸`ÿÂNNNNNNNNNNNNNNNN¡¡¡þòxNNNNNNNNNNNNNNNNNNNNNN¡¡¡û############################# ; ; VARIABLES ; ;########################################################################### oþNNNNNNNNNNNNNNNN¡¡¡þ ³NNNNNNNNNNNNNNNNNNNNNN¡¡¡û #D LIST ON IF ((DD - 1) >= STHD) AND ((DD - 1) <= NDHD) D#D(DD)ALL: DS 127 ;ALLOCATION BIT MAP FOR 8" HARD DRIVE #D(DD) ÉÀÿÂNNNNNNNNNNNNNNNN¡¡¡þ=ÏNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûY CLUSTER SIZE ; 1K= 3, 2K= 4, 4K= 5, 8K= 6, 16K= 7 DPBBLM DS 1 ;BLM- BLOCK MASK ; 1K = 7, 2K= 15, 4K= 31, 8K= 63, 16K=¢OÿÂNNNNNNNNNNNNNNNNN¡¡¡þÒNNNNNNNNNNNNNNNNNNNNNN¡¡¡û/SEC ; 0: 128, 1: 256, 2: 512, 3: 1024 DPBPHM DS 1 ;PHM- PHYSICAL RECORD MASK BASED ON BYTES/SEC ; 0: 128, 1: 256, 3: 5aÙÿòNNNNNNNNNNNNNNNN¡¡¡þx¢NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ%’üNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û FUNCTION DEFINITIONS Thå M5â BIOÓ functionó allo÷ programó tï modifù BIOÓ privatå � datá  withouô knowinç wherÚÏÿ�NNNNNNNNNNNNNNNNN¡¡¡þ+±óNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û  -1¬  thå � functioî  ió  noô implementeä (illegal© Iæ thå erroò codå  ió  -² � theî onå oò morå argumentó arå iî error. ³øÿçNNNNNNNNNNNNNNNNN¡¡¡þ �NNNNNNNNNNNNNNNNNNNNNN¡¡¡û DD DL 1 REPT NDRVS LIST OFF ALLDPH 0123456789ABCDEF DD DL DD + 1 LIST ON ENDM ; ; LAST OF INITIALIZED CODE REÌ×þNNNNNNNNNNNNNNNN¡¡¡þâFNNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡û# DTPTR: DS 2 ;DRIVE TABLE PTR LOGRQ: DS 1 ;LOG ON REQUEST REG. DVRTPTR DS 2 ;DRIVE DRIVER TABLE BASE ADDRESS PTR DVRXADR DS«ôÿÉNNNNNNNNNNNNNNNN¡¡¡þHàNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ENDIF IF ((DD - 1) >= ST8FD) AND ((DD - 1) <= ND8FD) D#D(DD)ALL: DS 57 ;ALLOCATION BIT MAP FOR 8" DRIVE #D(DD) D#D(DD)í¥ÿäNNNNNNNNNNNNNNNNN¡¡¡þ¤XNNNNNNNNNNNNNNNNNNNNNN¡¡¡û 127 DPBEXM DS 1 ;EXM- EXTENT MASK ; DSM < 256 : 1K= 0, 2K= 1, 4K= 3, 8K= 7, 16K= 15 ; DSM > 255 : 2K= 0, 4K= 1, 8K= 3,œ¯þ!NNNNNNNNNNNNNNNN¡¡¡þ‡WNNNNNNNNNNNNNNNNNNNNNN¡¡¡û12, 7: 1024 DPBSZ DS 0 ENDM ; ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERA�êþNNNNNNNNNNNNNNNNN¡¡¡þ m NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ&ǯNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûå thå datá ió locateä withiî thå  BIOS® � Theså  functionó  arå accesseä viá thå RESTARÔ 28È vectoò iî  lo÷ � memorù (0028H)®  T,GÿÂNNNNNNNNNNNNNNNN¡¡¡þ,(dNNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡ûNo. Description  0 Return BIOS Version Number Entry- A= 0 Exit - HL= Version Number in hundredth«ÆÿäNNNNNNNNNNNNNNNN¡¡¡þ>¼NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAD FROM DISK ; BIOSND EQU $ SUBTTL UNINITIALIZED DATA AREA ;#############################################################ÝÿÂNNNNNNNNNNNNNNNNN¡¡¡þ ÑwNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û 2 ;DRIVE DRIVER EXECUTION ADDRESS ROMSAV DS 1 ;ROM SWAP SAVE OF ORIGINAL ROM ;###########################################g»ÿîNNNNNNNNNNNNNNNN¡¡¡þ{ÑNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCHK DS 32 ;DIRECTORY CHECKSUMS STORAGE (1 BYTE PER SECTOR) ENDIF LIST OFF ENDM ; ; RESERVE THE DATA SPACE ; DD ºiÿçNNNNNNNNNNNNNNNNN¡¡¡þ—iNNNNNNNNNNNNNNNNNNNNNN¡¡¡û 16K= 7 DPBDSM DS 2 ;DSM- DRIVE STORAGE SIZE (IN CLUSTERS) ; INT(((#_TRACKS - OFF) * SPT * BYTES PER SECTOR) / CLUSTER SIZE)Ïiþ9NNNNNNNNNNNNNNNNN¡¡¡þ´fNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTE THE DPB FOR DRIVE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ALLDPB: MACRO #D ÍþBNNNNNNNNNNNNNNNNN¡¡¡þ!^8NNNNNNNNNNNNNNNNNNNNNN¡¡¡û M5b BIOS v3.16 FUNCTIONS INTERFACE SPECIFICA…zÿ�NNNNNNNNNNNNNNNNN¡¡¡þ'ôžNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûhió vectoò ió initializeä tï á Jumð instructioî � bù thå BIOÓ Warí Booô code® Thå functionó arå useä bù puttinç thå � functioî  Q4ÿÉNNNNNNNNNNNNNNNN¡¡¡þ-UNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûs {0.00 to 655.35} 1 Return Monitor Drive Number for CP/M Drive Number Entry- A= 1 C= CP/M driv}ÿ!NNNNNNNNNNNNNNNN¡¡¡þ§+NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û############### ; ; THE FOLLOWING DATA MUST RESIDE IN THIS ORDER TO MATCH THE IOPB DATA ; ;################################LÿÈNNNNNNNNNNNNNNNNN¡¡¡þ „$NNNNNNNNNNNNNNNNNNNNNN¡¡¡û################################# ; ; DRIVE ALLOCATION AREAS ; ;##########################################################ÀÀþHNNNNNNNNNNNNNNNNN¡¡¡þhœNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDL 1 REPT NDRVS LIST OFF ALLDAL 0123456789ABCDEF DD DL DD + 1 LIST ON ENDM ;####################################íÝþNNNNNNNNNNNNNNNN¡¡¡þÂ:NNNNNNNNNNNNNNNNNNNNNN¡¡¡û -1 DPBDRM DS 2 ;DRM- DIRECTORY SIZE -1 DPBAL0 DS 2 ;AL0,1- DIRECTORY ALLOCATION ; 1 MSB PER DIRECTORY CLUSTER ALLOCATED -„ÿïNNNNNNNNNNNNNNNNN¡¡¡þ-ñNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LIST ON D#D(DD)DPB: DS DPBSZ ;ALLOCATION FOR DRIVE #D(DD) LIST OFF ENDM ; ; RESERVE THE DATA SPACE ; DD DL 1 REPTµÎþNNNNNNNNNNNNNNNNN¡¡¡þ" kNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTION May 1,1992 REV. NC ë ÿ NNNNNNNNNNNNNNNNN¡¡¡þ(ä NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûnumbeò iî thå A-register¬  anù otheò requireä argumentó � iî  thå specifieä registers¬  anä executinç eitheò á RESTARÔ  28È � in4…ÿaNNNNNNNNNNNNNNNN¡¡¡þ.NNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûe number {0..15} Exit - A= {0..254}: Monitor drive number -2: Drive error BC,DE,HLí7ÿ�NNNNNNNNNNNNNNNNN¡¡¡þ”NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û############################################# BTDRV: DS 1 ;DRIVE # BTTRK DS 2 ;TRACK # BTSEC DS 2 ;SECTOR # BTFLG DS 1 ;RESEßÇÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ ·NNNNNNNNNNNNNNNNNNNNNN¡¡¡û################## ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; MACRO TO DEFINE THE DR7 þ$NNNNNNNNNNNNNNNNN¡¡¡þ[­NNNNNNNNNNNNNNNNNNNNNN¡¡¡û######################################## ; ; RESERVE DRIVE PARAMETER BLOCKS ; ;###########################################–/ÿÎNNNNNNNNNNNNNNNN¡¡¡þñ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDPBCKS DS 2 ;CKS- # DIRECTORY SECTORS CHECKED ; (DRM +1) / 4 DPBOFF DS 2 ;OFF- # RESERVED TRACKS (USUALLY 2) ; ; ADDITI þINNNNNNNNNNNNNNNNN¡¡¡þÀNNNNNNNNNNNNNNNNNNNNNN¡¡¡û NDRVS LIST OFF ALLDPB 0123456789ABCDEF DD DL DD + 1 LIST ON ENDM IF (($ - 8000H) > 07800H) OR ($ < 8000H) COúÿÂNNNNNNNNNNNNNNNN¡¡¡þ#8ZNNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡û GRH Enterprises 1129 Stonylake Ct Sunnyvale, CA .PA Š.J�ÿHNNNNNNNNNNNNNNNNN¡¡¡þ)בNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûstructioî  oò Callinç (executing© thå locatioî  aô  0028H®  Alì � functionó returî á valuå iî thå A-registeò anä flags® Iæ thå ZêÿäNNNNNNNNNNNNNNNNN¡¡¡þ/}7NNNNNNNNNNNNNNNNNNNNNN¡¡¡û= ? 2 Disable Logon Entry- A= 2 C= CP/M drive number {0..15} Exit - A= 0: Ok, /0: Ille·`ÿòNNNNNNNNNNNNNNNN¡¡¡þÁINNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRVED FOR FLAGS BTDMA DS 2 ;DMA ADDRESS BTDMAX DS 1 ;DMA EXTENDED ADDRESS ;###############################################Õ‹þ'NNNNNNNNNNNNNNNNN¡¡¡þ .‚NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIVE ALLOCATION & CHECKSUMS AREA ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ALLDAL: MACRO·ÿáNNNNNNNNNNNNNNNNN¡¡¡þþNNNNNNNNNNNNNNNNNNNNNN¡¡¡û################################# STRUCT 0 DPBSPT DS 2 ;SPT- SECTORS/TRACK DPBBSH DS 1 ;BSH- BLOCK SHIFT FACTOR DETERMINED B;ÿòNNNNNNNNNNNNNNNN¡¡¡þá5NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûONAL CP/M 3.0 DATA (ALSO COULD BE USED BY CP/M 2.2 DEBLOCKING) ; DPBPSH DS 1 ;PSH- PHYSICAL RECORD SHIFT FACTOR BASED ON BYTESø»þ$NNNNNNNNNNNNNNNN¡¡¡þK“NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNMSG **** BIOS TOO BIG, USE MOVCPM & RE-ADJUST! **** ENDIF END ÖþNNNNNNNNNNNNNNNNN¡¡¡þ$¡ÍNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHE REVISION HISTORY REV DATE COMMENT NC 5-1-92 Initial release. .PA Š.HE k›þ!NNNNNNNNNNNNNNNN¡¡¡þ*‚ÂNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûerï � flaç ió set¬  theî nï erroò haó occured»  iæ cleared¬ theî thå A-� registeò  containó aî erroò code®  Iæ thå erroò codå ióIæÿ“NNNNNNNNNNNNNNNNN¡¡¡þ0nzNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûgal drive BC,DE,HL= ? 3 Enable Logon Entry- A= 3 C= CP/M drive number {0..15} мÿ“NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNnNNNNNNNN�Î�œ‚jƒ7„…Ò… †m‡;ˆ ‰Ø‰¥Št‹BŒ�Ý�«Žy�H�‘味’€“N”•í•»–‰—W˜%™ò™ÀšŽ›]œ+�ù�Çž•Ÿc 1¡ÿ¡Í¢›£h¤6¥¦Ò¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ ZNNNNNNNNNNNNNNNNNNNNNN¡¡¡û Exit - A= 0: Ok, /0: Illegal drive BC,DE,HL= ? 4 Set Disk Format Entry- A= 4 ?ŸÿHNNNNNNNNNNNNNNNNN¡¡¡þ ³üNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFile Control Block */ struct fcb *srch_fst(), *srch_nxt(), f_cb, *fcb_ptr; /* farcall registers */ struct regs šÿáNNNNNNNNNNNNNNNNN¡¡¡þ \7NNNNNNNNNNNNNNNNNNNNNN¡¡¡û { puts("\nInsufficient Memory...Aborting!"); exit(1); } (BYTE *) fmt_buf = ((BYTE *) fov_file) + 5976)�ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ |KNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNO, CA ; ;**************************************************************************** ; ; CONFIGURATION: ; ; CPM ; DRIVE„ÿÂNNNNNNNNNNNNNNNN¡¡¡þ “€NNNNNNNNNNNNNNNNNNNNNN¡¡¡û20H ; A JADE 5" FLOPPY PHYSICAL DRIVE 0 ; B JADE 5" FLOPPY PHYSICAL DRIVE 1 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE ‰íÿINNNNNNNNNNNNNNNNN¡¡¡þ 9&NNNNNNNNNNNNNNNNNNNNNN¡¡¡û system down to 60k. ; 3.01 26 JUN 88 GRH ; Remove 5" floppy support. Implement in CP/M-86 BIOS. ; Change single function to4pÿrNNNNNNNNNNNNNNNN¡¡¡þ %ÓxNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCP/M 3.0 DPB structure in preparation for deblocking. ; 3.05 11-3-88 GRH ; Change included data to update IOPB.PBSTAT to new¾•ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ +ðwNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûrupted PB_FLG. ; 3.08 2-22-91 GRH ; Remove references to THIS_BNK & use monitor function #7 instead. ; Add track-head shift6ÿ!NNNNNNNNNNNNNNNN¡¡¡þ L NNNNNNNNNNNNNNNNNNNNNN¡¡¡û C= CP/M drive number {0..15} E:HL= Disk descriptor sector image ptr Exit - A= 0: Ok, /0: Illegal 'ÿmNNNNNNNNNNNNNNNNN¡¡¡þ £ÂNNNNNNNNNNNNNNNNNNNNNN¡¡¡û cpui, cpuo; /**************************************************************************** main program *****šéÿòNNNNNNNNNNNNNNNN¡¡¡þ  dNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; /* Allocate format overlay buffer */ /* Top of command loop */ while (TRUE) { /**** Display Options */ printfÿŽNNNNNNNNNNNNNNNNNN¡¡¡þ åÜNNNNNNNNNNNNNNNNNNNNNN¡¡¡û USAGE IF BOOT = 10H ;HARD DISK BOOT CONFIG. ; A SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; B SIDE 2 & 3 OF HARD DISKôvÿ NNNNNNNNNNNNNNNN¡¡¡þ ÆÓNNNNNNNNNNNNNNNNNNNNNN¡¡¡û0 ; D SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 0 ; E SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; F SIDE 2 & 3 OF HARD DISK;CÿrNNNNNNNNNNNNNNNNN¡¡¡þ ,�NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û return drive table ptr into a BIOS function ; call using restart instruction. ; Change LOGON to specify the ID sector & traM ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ &†+NNNNNNNNNNNNNNNNNNNNNN¡¡¡û configuration. ; 3.06 1-28-89 GRH ; Revised primitive calling procedures to use the monitor rom function ; rather than sw½GÿBNNNNNNNNNNNNNNNN¡¡¡þ ,iàNNNNNNNNNNNNNNNNNNNNNN¡¡¡û factor to DPBs for future use. ; 3.09 5-15-91 GRH ; Change 8" floppy side select to track bit 0. Move calculation from ; �×ÿäNNNNNNNNNNNNNNNN¡¡¡þ 8NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûdrive BC,DE,HL= ? )MÿÎNNNNNNNNNNNNNNNNN¡¡¡þ �óNNNNNNNNNNNNNNNNNNNNNN¡¡¡û***********************************************************************/ main () { /* Display signon */ printf(signon); “‘ÿ$NNNNNNNNNNNNNNNNN¡¡¡þ :UNNNNNNNNNNNNNNNNNNNNNN¡¡¡û("\n\n\ Command Options:\n\ 0 Display BIOS Version\n\ 1 Display monitor drive number assigned to CP/M drive\n\ 2 DisabįÿòNNNNNNNNNNNNNNNNNN¡¡¡þ ÖíNNNNNNNNNNNNNNNNNNNNNN¡¡¡û PHYSICAL DRIVE 0 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; D SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ; E JADE 8"é¼ÿNNNNNNNNNNNNNNNNNN¡¡¡þ õâNNNNNNNNNNNNNNNNNNNNNN¡¡¡û PHYSICAL DRIVE 1 ; G JADE 8" FLOPPY PHYSICAL DRIVE 0 ; H JADE 8" FLOPPY PHYSICAL DRIVE 1 ENDIF ; ;*****************u9ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ !¼NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûck. At same time, fix bug ; which did not specify the logon track. ; 3.02 7 JUL 88 GRH ; Add '?' to include file names. _^ÿóNNNNNNNNNNNNNNNNN¡¡¡þ 'µNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûapping Roms itself. ; 3.07 11-25-90 GRH ; Modify for Ver. 1.22 Monitor. ; Fix bug in 8" Hard Disk table which benignly (at ð!ÿäNNNNNNNNNNNNNNNN¡¡¡þ -ZÑNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDCM8 to CBIOS. ; Remove IOPB ptr passing in IX redundancy. ; Change DPB track-head shift factor to Sector Offset like track ;lDÿÂNNNNNNNNNNNNNNNN¡¡¡þ æ¯NNNNNNNNNNNNNNNNNNNNNN¡¡¡û } *fmt_buf, /* Ptr to the structure */ *fov_p; /* Format overlay file data ptrs */ struct { BYTE fil_name[11]; bÜÿnNNNNNNNNNNNNNNNNNN¡¡¡þ Å NNNNNNNNNNNNNNNNNNNNNN¡¡¡û /* Initialize data */ cpui.AF = (MF_GBNK) << 8; /* get current bank # */ farcall( (WORD) MR_FUN, 0, &cpui, &cpui); ëÿòNNNNNNNNNNNNNNNNNN¡¡¡þ )NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûle dynamic format selection (LOGON)\n\ 3 Enable dynamic format selection\n\ 4 Set disk format\n\ \n\ ^C Exit to DOS\n\ ÿ­NNNNNNNNNNNNNNNNN¡¡¡þ ƒ¾NNNNNNNNNNNNNNNNNNNNNN¡¡¡û FLOPPY PHYSICAL DRIVE 0 ; F JADE 8" FLOPPY PHYSICAL DRIVE 1 ENDIF IF BOOT = 3 ; A JADE 8" FLOPPY PHYSICAL DRIVE 0À„ÿ“NNNNNNNNNNNNNNNNN¡¡¡þ luNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*********************************************************** ; ; REVISION HISTORY: ; ; 3.00 - 26 JAN 87 GRH ; Implementeè£ÿBNNNNNNNNNNNNNNNN¡¡¡þ "JïNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; Change hard disk system tracks directory reference to new format. ; Correct bug in drivers which caused retry to fail. (sectož—ÿrNNNNNNNNNNNNNNNNN¡¡¡þ (¥$NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûcurrent level) ; caused the drive table to have bad data (default table was missing ; the 2 deblocking extension bytes). ; zÇÿáNNNNNNNNNNNNNNNN¡¡¡þ .‚NNNNNNNNNNNNNNNNNNNNNN¡¡¡û offset. Disk partitioning will add this value to sector word. It ; will be stored in the ID sector data to be dynamic. ; 3.­…ÿHNNNNNNNNNNNNNNNNN¡¡¡þ ÕžNNNNNNNNNNNNNNNNNNNNNN¡¡¡û/* FCB filename */ char fil_txt[]; /* File text description */ } *fov_file, /* Base ptr to array */ *fov_ptr[64]; /* Pojÿ“NNNNNNNNNNNNNNNNN¡¡¡þ ö‘NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û this_bnk = cpui.AF >> 8; /* drive = -1; Assume no controller */ cmd_blk.pb_sts = -1; /* Force error if not access_¶ÿNNNNNNNNNNNNNNNNNN¡¡¡þ )NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û TITLE CUSTOMIZED BIOS FOR M5B LIST NOCOND BOOT EQU 10H ;10H: HARD DISK, 3: 8" FLOPPY, 20H: 5" FLOPPY ;********************R[ÿÿNNNNNNNNNNNNNNNNN¡¡¡þ °�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; B JADE 8" FLOPPY PHYSICAL DRIVE 1 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; D SIDE 2 & 3 OF HARD DISK PHYSICAL �PþrNNNNNNNNNNNNNNNN¡¡¡þ _DNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûd new common IOPB code & Jade floppy firmware support. ; Implemented disk drive driver tables and new function to return ; a Ø8ÿÂNNNNNNNNNNNNNNNN¡¡¡þ #yÞNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûr remained ; corrupted) ; Stubbed out new Clock routines for present. ; 3.03 31 JUL 88 GRH ; Unstub Clock routines. ; 3¼�ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ )–NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûImplement data xfer inhibit schemes with PB_FLG & PB_BCNT. ; Add pick-up of THIS_BNK data in all iopb cases. ; Remove clock bu‘èÿäNNNNNNNNNNNNNNNNN¡¡¡þ /<³NNNNNNNNNNNNNNNNNNNNNN¡¡¡û10 5-20-91 GRH ; Change LOGON to attempt to recover from old disks better, using ; DCM8301 version controller firmware. ; kþrNNNNNNNNNNNNNNNN¡¡¡þ €ÍNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûtrs to each file data */ BYTE *file_bp; /* Ptr into array */ unsigned int max_files; /* max files found */ /* CP/M šÿNNNNNNNNNNNNNNNNN¡¡¡þ oNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûed */ /* Allocate heap buffer */ file_bp = fov_file = malloc(7000); /* Allocate Filename buffer */ if (fov_file == 0)IÿÂNNNNNNNNNNNNNNNNN¡¡¡þ OzNNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************************************** ; ; CUSTOMIZED BIOS FOR M5B ; (c) 1981 GRH Electronics, CUPERTIÅ5ÿòNNNNNNNNNNNNNNNNN¡¡¡þ  ±NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûDRIVE 0 ; E SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; F SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ENDIF IF BOOT = oºÿùNNNNNNNNNNNNNNNN¡¡¡þ  NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûptr to a drive table. ; Removed init of IOBYTE. ; Implemented 5" floppy driver. ; Implemented use of ROM primitives. ; MovedGÿÉNNNNNNNNNNNNNNNNN¡¡¡þ $àINNNNNNNNNNNNNNNNNNNNNN¡¡¡û.04 6 AUG 88 GRH ; Remove floppy side select from BIOS & move to controller. ; Implement new ID sector format. ; Implement §þNNNNNNNNNNNNNNNNNN¡¡¡þ *ÃFNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûffer set/read system calls. ; 12-5-90 GRH ; Remove IX IOPB ptr passing to disk drivers. ; 1-13-91 GRH ; Fix bug which cor½|ÿ“NNNNNNNNNNNNNNNNN¡¡¡þ 0/þNNNNNNNNNNNNNNNNNNNNNN¡¡¡û3.11 9-2-91 GRH ; Add redlines & change for M5ZMON v.2.00. ; 3.12 9-11-91 GRH ; Add deblocking code. ; 9-17-91 GRH AdTtÿäNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN$NNNNNNý€Ë�˜‚fƒ3„…Ï…�†l‡;ˆ‰Õ‰£Šq‹>Œ �Ú�¨Žv�C�‘ß‘­’{“J”•敳–‚—P˜™ì™»š‰›Xœ&�ô�Áž�Ÿ^ ,¡ù¡Æ¢”£a¤/¥ý¥Ë¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ .jNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûd r/ls & move to 59k system. ; 9-19-91 GRH Fix bug which destroyed my root directories! ; BUF_RD was writing. ; Patch ù¸ÿHNNNNNNNNNNNNNNNNN¡¡¡þ „ÌNNNNNNNNNNNNNNNNNNNNNN¡¡¡û================== ; ; ASSEMBLY PARAMETERS ; ;============================================================================ ¡ÿòNNNNNNNNNNNNNNNN¡¡¡þ  kNNNNNNNNNNNNNNNNNNNNNN¡¡¡û BDIR.DEF *INCLUDE B:M5ZF2.DEF LIST ON ;=========================================================================3RÿîNNNNNNNNNNNNNNNNN¡¡¡þ K{NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûTACK FRAME PTR DK_BDRV EQU 0041H ;BOOT DRIVE # FROM PROM DEFBFR EQU PAGE0 + 80H ;DEFAULT BUFFER ; ; BIOS FUNCTION CALL RE=AÿrNNNNNNNNNNNNNNNN¡¡¡þ ¤°NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûIVE OF HARD DISK NDHD EQU 5 ;LAST LOGICAL DRIVE OF HARD DISK ST8FD EQU 0 ;START LOGICAL DRIVE OF 8" FLOPPY ND8FD EQU 1 ;LAð¿ÿäNNNNNNNNNNNNNNNNN¡¡¡þ NNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE THE TRANSLATION TABLE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@'üþrNNNNNNNNNNNNNNNN¡¡¡þ %äHNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS MACRO #VERS DD DL #VERS IF DD > 9999 DB (DD / 10000) + '0' DD DL DD % 10000 ENDIF IF DD > 999 DB (DD / 1000)Q¨ÿçNNNNNNNNNNNNNNNNN¡¡¡þ +ÇGNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;SET SECTOR # JP SETDMA ;SET TRANSFER ADDR JP DISKRD ;PERFORM DISK READ JP DISKWR ;PERFORM DISK WRITE JP LISTST ;RŸ(ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ {9NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûproblems with partitioning until 20MB drive installed. ; Fix TPA corruption by LOGON problem by using ROMBNK sector buffer foË’ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ ”òNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û; FALSE EQU 0 TRUE EQU NOT FALSE ;============================================================================ ; ; COND¤œÿäNNNNNNNNNNNNNNNN¡¡¡þ >TNNNNNNNNNNNNNNNNNNNNNN¡¡¡û=== ; ; DISK OPERATING SYSTEM ADDRESSES ; ;============================================================================ ;=%ÿòNNNNNNNNNNNNNNNN¡¡¡þ ÒìNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSTART VECTOR ; BFUNRST EQU 28H BFUNRSV EQU PAGE0 + BFUNRST BFUNRSI EQU 0C7H + BFUNRST ;================================•#þrNNNNNNNNNNNNNNNN¡¡¡þ ñãNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûST LOGICAL DRIVE OF 8" FLOPPY ENDIF ;============================================================================ ; ;I'ÿòNNNNNNNNNNNNNNNNN¡¡¡þ  ½NNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@@@ ; GXLATE MACRO #SECTORS, #SKEW LIST OFF NXTSEC DL 1 ;;START WITH SECTOR 1 LOWEST DL 1 ;; REPT #S»ÿáNNNNNNNNNNNNNNNN¡¡¡þ &±NNNNNNNNNNNNNNNNNNNNNN¡¡¡û + '0' DD DL DD % 1000 ENDIF DB (DD / 100) + '0' DB '.' DB ((DD % 100) / 10) + '0' DB (DD % 10) + '0' ENDM ^Íÿ„NNNNNNNNNNNNNNNN¡¡¡þ ,^ÐNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûETURN LIST STATUS JP SECTRN ;TRANSLATE SECTOR JP BIOFUNC ;EXECUTE FUNCTION CALL ;####################################\�þNNNNNNNNNNNNNNNN¡¡¡þ HNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûr ; ID sector read. ; 9-20-91 GRH Fold in redlines. ; 10-21-91 GRH Fix bugs ; 10-22-91 GRH Fix bugs ; 10-23-91 ³·ÿ�NNNNNNNNNNNNNNNNN¡¡¡þ  §ÃNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûITIONAL ASSEMBLY FLAGS ; ;============================================================================ ; INTCPTS EQU TRUE ;šÝÿíNNNNNNNNNNNNNNNNN¡¡¡þ  eNNNNNNNNNNNNNNNNNNNNNN¡¡¡û SYS EQU 2 ;CP/M VERSION {2,3} ; NKSYS: EQU 59 ;SYSTEM SIZE IN K BYTES KBYTE: EQU 1024 CPMSZ: EQU KBYTE * NKSYS CPMBS: EëäÿBNNNNNNNNNNNNNNNN¡¡¡þ áÝNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û============================================ ; ; OTHER DECLARATIONS ; ;=====================================================%ÿNNNNNNNNNNNNNNNNNN¡¡¡þ ÂÒNNNNNNNNNNNNNNNNNNNNNN¡¡¡û BDOS CONSTANTS ON ENTRY TO WRITE ; ;============================================================================ ; W"gþNNNNNNNNNNNNNNNNNN¡¡¡þ !(ŒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSECTORS LIST ON DB NXTSEC LIST OFF NXTSEC DL NXTSEC + #SKEW ;ADD SKEW FACTOR ;; IF NXTSEC > #SECTORS ;CHECK FOR OVERƒÿoNNNNNNNNNNNNNNNNN¡¡¡þ '‚*NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSUBTTL BIOS CODE ORG BIOS ;---------------------------------------------------------------------------- ; ; BIOS JUMP VECÀ"ÿäNNNNNNNNNNNNNNNN¡¡¡þ -máNNNNNNNNNNNNNNNNNNNNNN¡¡¡û######################################## ; ; THE FOLLOWING BOOT DATA MUST RESIDE AS DEFINED RIGHT BEFORE THE COLD ; INIT ROUTMþNNNNNNNNNNNNNNNNNN¡¡¡þ ÑŸNNNNNNNNNNNNNNNNNNNNNN¡¡¡û GRH Fix bugs ; 3.13 1-15-92 GRH ; Change hard disk translation to Monitor disks 4 & 5 from 6 & 7. ; ; 3.14 2-9-92 GRHìÿBNNNNNNNNNNNNNNNN¡¡¡þ  ò�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûENABLE SYSTEM CALL INTERCEPT WHISTLE ;============================================================================ ; ; IN\þrNNNNNNNNNNNNNNNNN¡¡¡þ (NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûQU CPMSZ - (20 * KBYTE) ;CP/M BIAS VALUE CCP: EQU CPMBS + 3400H ;ADDR OF CCP BDOS: EQU CPMBS + 3C00H ;ADDRESS OF BDOS BIOSdþBNNNNNNNNNNNNNNNN¡¡¡þ ´ŽNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û======================= ; SECSZ: EQU 128 NDRVS: EQU 6 IF BOOT = 10H ; ; 8" HARD DISK BOOT DATA ; STHD EQU 0 ;START…ïÿ'NNNNNNNNNNNNNNNNN¡¡¡þ [ENNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRALL EQU 0 ;WRITE TO ALLOCATED WRDIR EQU 1 ;WRITE TO DIRECTORY WRUAL EQU 2 ;WRITE TO UNALLOCATED ;=======================Ÿ¥ÿÜNNNNNNNNNNNNNNNN¡¡¡þ "}ßNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûFLOW NXTSEC DL NXTSEC - #SECTORS ;; IF NXTSEC <= LOWEST ;CHECK FOR REPEAT NXTSEC DL LOWEST + 1 LOWEST DL NXTSEC ENDIÍÿäNNNNNNNNNNNNNNNNN¡¡¡þ (’NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTOR TABLE ; ;---------------------------------------------------------------------------- ; JP INIT1 ;COLD START ENTRY J¬—ÿ®NNNNNNNNNNNNNNNNN¡¡¡þ .8²NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûINE START AND MUST BE IN THE 1ST SECTOR. THESE 2 WORDS ARE ; REFERENCED BY THE BOOT LOADER CODE IN ORDER TO DETERMINE THE LOAD ÖƒÿÈNNNNNNNNNNNNNNNNN¡¡¡þ â®NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; Add additional floppy disk allocation size for 1.22Mb disks. ; VERSN EQU 314 ; ;****************************************Bôþ$NNNNNNNNNNNNNNNNN¡¡¡þ  Á¡NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCLUDE COMIOPB3.DEF ; INCLUDE DISKS3.DEF ; INCLUDE BDIR.DEF ; INCLUDE M5ZF2.DEF ; ;========================þ)ÿòNNNNNNNNNNNNNNNNN¡¡¡þ -NNNNNNNNNNNNNNNNNNNNNN¡¡¡û: EQU CPMBS + 4A00H ;ADDRESS OF BDOS BIOSR: EQU 1000H - BIOS ; ; PAGE 0 LOCATIONS ; PAGE0: EQU 0 ;START OF CP/M RAM DE™@þ~NNNNNNNNNNNNNNNNN¡¡¡þ ‡¿NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û LOGICAL DRIVE OF HARD DISK NDHD EQU 3 ;LAST LOGICAL DRIVE OF HARD DISK ST8FD EQU 4 ;START LOGICAL DRIVE OF 8" FLOPPY ND8FD…ÿrNNNNNNNNNNNNNNNN¡¡¡þ htNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û===================================================== ; ; ASCII CHARS ; ;===================================================V-ÿáNNNNNNNNNNNNNNNN¡¡¡þ #NîNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûF ENDIF ;; ENDM LIST ON ENDM ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ;sòþ$NNNNNNNNNNNNNNNNN¡¡¡þ )¡%NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûP WARM ;RELOAD CCP/BDOS JP CNSCK ;GET CONSOLE STATUS JP CI ;CONSOLE INPUT JP COC ;CONSOLE OUTPUT JP LO ;PRINTER OUT1{ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ / ƒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûADDRESS ; AND LENGTH OF THE BIOS. ; ;############################################################################ ; DB 0 fgÿäNNNNNNNNNNNNNNNN¡¡¡þ ·ýNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************ SUBTTL SYSTEM DECLARATIONS ;==========================================================SÿBNNNNNNNNNNNNNNNN¡¡¡þ  X6NNNNNNNNNNNNNNNNNNNNNN¡¡¡û==================================================== ; LIST OFF *INCLUDE COMIOPB3.DEF *INCLUDE DISKS3.DEF *INCLUDE ýÓÿœNNNNNNNNNNNNNNNN¡¡¡þ xJNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFDRV: EQU PAGE0 + 4 ;DEFAULT DRIVE PARAM ADDR BDOSJV EQU PAGE0 + 5 ;BDOS SYSTEM CALL ENTRY THIS_STK EQU PAGE0 + 1CH ;CURRENT Sº-ÿäNNNNNNNNNNNNNNNNN¡¡¡þ —�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û EQU 5 ;LAST LOGICAL DRIVE OF 8" FLOPPY ENDIF IF BOOT = 3 ; ; 8" FLOPPY BOOT DATA ; STHD EQU 2 ;START LOGICAL DRžþBNNNNNNNNNNNNNNNN¡¡¡þ ='NNNNNNNNNNNNNNNNNNNNNN¡¡¡û========================= ; LF: EQU 0AH CR: EQU 0DH CTRLZ: EQU 1AH ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@àkÿÈNNNNNNNNNNNNNNNNN¡¡¡þ $×yNNNNNNNNNNNNNNNNNNNNNN¡¡¡û INITIALIZE VERSION TEXT IN RAM MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; PVEREøÿáNNNNNNNNNNNNNNNN¡¡¡þ *ôvNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPUT JP PUNCH JP READER JP HOME ;HOME SELECTED DRIVE JP SELDSK ;SELECT DISK DRIVE JP SETTRK ;SET TRACK # JP SETSEC (DIRBF + SECSZ) CONMSG **** WARNING! COLD INIT CODE BIGGER THAN DIR BUFFER **** ELSE DS DIRBF+SECSZ-$ ;FI7!þBNNNNNNNNNNNNNNNN¡¡¡þ M1NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û LD E,0 CALL SELDSK LD A,L ;IF ERROR THEN ABORT OR A,H JR Z,WEROR ; ; READ BOOT DIRECTORY ; LD BC,DEFBFR ;SEs»ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ n>NNNNNNNNNNNNNNNNNNNNNN¡¡¡û128 ;DMA += SECTOR SIZE LD HL,(CPM_DMA) ADD HL,DE LD (CPM_DMA),HL ; ; IF NOT INTO BDOS THEN READ NEXT SECTOR ; LD ³ÿNNNNNNNNNNNNNNNNNN¡¡¡þ !„`NNNNNNNNNNNNNNNNNNNNNN¡¡¡û TITLE CUSTOMIZED BIOS FOR M5B LIST NOCOND BOOT EQU 10H ;10H: HARD DISK, 3: 8" FLOPPY, 20H: 5" FLOPPY ;********************R[ÿNNNNNNNNNNNNNNNNN¡¡¡þ '.ÆNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û ; B JADE 8" FLOPPY PHYSICAL DRIVE 1 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; D SIDE 2 & 3 OF HARD DISK PHYSICAL �PþNNNNNNNNNNNNNNNN¡¡¡þ -Á NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûd new common IOPB code & Jade floppy firmware support. ; Implemented disk drive driver tables and new function to return ; a Ø8ÿÂNNNNNNNNNNNNNNNN¡¡¡þ }sNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDIRBF: EQU $ ;BUFFER BEGINNING ;---------------------------------------------------------------------------- ; ; INITø3ÿ„NNNNNNNNNNNNNNNN¡¡¡þ ^|NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNT CALL XMROM ; ; IF CLOCK PRESENT THEN TURN ON CLOCK DRIVE ; OR A,A LD A,38H ;COND. JR (ON) JR Z,CLKON ; ; ELCÊÿäNNNNNNNNNNNNNNNNN¡¡¡þ ²ÄNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûLL OUT DIRECTORY BUFFER TO 1 SECTOR SIZE ENDIF ;---------------------------------------------------------- ; ; WARM Rº\þBNNNNNNNNNNNNNNNN¡¡¡þ bNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûT XFER ADDRESS (USE DEFAULT BUFFER) CALL SETDMA ; LD BC,BD_SEC ;SET DIRECTORY SECTOR CALL SETSEC ; LD BC,0 ;SET TRACKm|ÿHNNNNNNNNNNNNNNNNN¡¡¡þ ÷©NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûDE,BDOS XOR A,A SBC HL,DE JR C,WREAD ; ; ELSE IF AT BEGINNING OF BDOS THEN SET UP NEW TRACK & SECTOR ; JR Z,RDBDOS ½UÿÂNNNNNNNNNNNNNNNN¡¡¡þ "Ñ3NNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************************************** ; ; CUSTOMIZED BIOS FOR M5B ; (c) 1981 GRH Electronics, CUPERTIÅ5ÿäNNNNNNNNNNNNNNNNN¡¡¡þ (>øNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDRIVE 0 ; E SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; F SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ENDIF IF BOOT = oºÿ\NNNNNNNNNNNNNNNN¡¡¡þ .”^NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûptr to a drive table. ; Removed init of IOBYTE. ; Implemented 5" floppy driver. ; Implemented use of ROM primitives. ; MovedGÿÈNNNNNNNNNNNNNNNNN¡¡¡þ NBNNNNNNNNNNNNNNNNNNNNNN¡¡¡û - COLD START ENTRY FROM BOOT MUST SET ALL BIOS PARAMS ; ;-------------------------------------------------------------------QÿINNNNNNNNNNNNNNNNN¡¡¡þ mMNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûSE TURN OFF CLOCK DRIVE ; LD A,18H ;UNCOND. JR (OFF) (CAUSES JUMP TO ILLEGAL) ; CLKON: LD (INHCLK),A ; ; BOOT CCP & BDk@ÿòNNNNNNNNNNNNNNNNN¡¡¡þ �õNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûEBOOT ENTRY LOADS CCP,BDOS FROM DISK & ; SETS UP VARIABLES ; ;---------------------------------------------------------- ; AªÿþNNNNNNNNNNNNNNNNN¡¡¡þ +SNNNNNNNNNNNNNNNNNNNNNN¡¡¡û TO 0 CALL SETTRK ; CALL DISKRD JR NZ,WEROR ; ; CHECK FOR VALID BOOT DIRECTORY ; LD A,(DEFBFR) CP A,86H JR C,W½}ÿ NNNNNNNNNNNNNNNN¡¡¡þ ĘNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; ELSE IF NOT AT BIOS THEN READ NEXT SECTOR ; LD DE,BIOS - BDOS SBC HL,DE JP C,WREAD ; ; ELSE DONE READING SYSTšÛÿrNNNNNNNNNNNNNNNN¡¡¡þ #âNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNO, CA ; ;**************************************************************************** ; ; CONFIGURATION: ; ; CPM ; DRIVE„ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ ) ÉNNNNNNNNNNNNNNNNNNNNNN¡¡¡û20H ; A JADE 5" FLOPPY PHYSICAL DRIVE 0 ; B JADE 5" FLOPPY PHYSICAL DRIVE 1 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE ‰íÿäNNNNNNNNNNNNNNNNN¡¡¡þ /§oNNNNNNNNNNNNNNNNNNNNNN¡¡¡û system down to 60k. ; 3.01 26 JUN 88 GRH ; Remove 5" floppy support. Implement in CP/M-86 BIOS. ; Change single function to4pÿòNNNNNNNNNNNNNNNN¡¡¡þ NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û--------- ; INIT: ; ; SET TEMPORARY STACK ; DI LD SP,DEFBFR ;USE PAGE 0 FOR STACK LD (THIS_STK),SP EI ; ; INI@zÿ9NNNNNNNNNNNNNNNN¡¡¡þ ôÚNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOS ; JR WARM ;############################################################################ ; ; SIGN-ON MESSAGE ; ;###çþBNNNNNNNNNNNNNNNN¡¡¡þ Ô¦NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûWARM: ; ; SET TEMPORARY STACK ; DI LD SP,DEFBFR LD (THIS_STK),SP EI ; ; INIT OUR STUFF ; XOR A,A LD (BUF_A tÿòNNNNNNNNNNNNNNNNN¡¡¡þ ;mNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEROR ; ; SET UP TO LOAD CCP/BDOS ; LD HL,(DEFBFR + BD_SBDSS) ;PREFETCH BDOS TRK/SECTOR PUSH HL ; LD HL,(DEFBFR + BD_¼ÿBNNNNNNNNNNNNNNNN¡¡¡þ ‘ËNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûEM ; JR WZRPG ; ; ; ELSE SET UP & READ BDOS ; RDBDOS: POP HL ;RESTORE BDOS TRK/SECTOR FROM DIRECTORY LD C,L LD B,?ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ ${•NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û USAGE IF BOOT = 10H ;HARD DISK BOOT CONFIG. ; A SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; B SIDE 2 & 3 OF HARD DISKôvÿÎNNNNNNNNNNNNNNNNN¡¡¡þ *XšNNNNNNNNNNNNNNNNNNNNNN¡¡¡û0 ; D SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 0 ; E SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; F SIDE 2 & 3 OF HARD DISK;Cÿ$NNNNNNNNNNNNNNNNN¡¡¡þ 0´"NNNNNNNNNNNNNNNNNNNNNN¡¡¡û return drive table ptr into a BIOS function ; call using restart instruction. ; Change LOGON to specify the ID sector & traM ÿÉNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNnNNNNNý€Ë�™‚gƒ5„…Ñ…Ÿ†m‡;ˆ‰Ö‰£Šr‹?Œ �Û�ªŽx�E�‘â‘°’~“L”•ç•´–‚—O˜™ê™¸š†›Uœ"�ð�¾ž�Ÿ[ )¡ö¡Ã¢‘£^¤-¥ú¥É¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ µ¶NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûck. At same time, fix bug ; which did not specify the logon track. ; 3.02 7 JUL 88 GRH ; Add '?' to include file names. _^ÿíNNNNNNNNNNNNNNNNN¡¡¡þ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûapping Roms itself. ; 3.07 11-25-90 GRH ; Modify for Ver. 1.22 Monitor. ; Fix bug in 8" Hard Disk table which benignly (at ð!þrNNNNNNNNNNNNNNNN¡¡¡þ  ðÛNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDCM8 to CBIOS. ; Remove IOPB ptr passing in IX redundancy. ; Change DPB track-head shift factor to Sector Offset like track ;lDÿœNNNNNNNNNNNNNNNN¡¡¡þ ЧNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûbuffer for ; ID sector read. ; 9-20-91 GRH Fold in redlines. ; 10-21-91 GRH Fix bugs ; 10-22-91 GRH Fix bugs ; (+ÿòNNNNNNNNNNNNNNNN¡¡¡þ ?lNNNNNNNNNNNNNNNNNNNNNN¡¡¡û============================ ; INTCPTS EQU TRUE ;ENABLE SYSTEM CALL INTERCEPT WHISTLE ;=================================þåÿHNNNNNNNNNNNNNNNNN¡¡¡þ •ÊNNNNNNNNNNNNNNNNNNNNNN¡¡¡û KBYTE: EQU 1024 CPMSZ: EQU KBYTE * NKSYS CPMBS: EQU CPMSZ - (20 * KBYTE) ;CP/M BIAS VALUE CCP: EQU CPMBS + 3400H ;ADDR OF {cþ NNNNNNNNNNNNNNNN¡¡¡þ %”NNNNNNNNNNNNNNNNNNNNNN¡¡¡û=========================================================================== ; SECSZ: EQU 128 NDRVS: EQU 6 IF BOOT = 10H Äÿ�NNNNNNNNNNNNNNNNN¡¡¡þ +\›NNNNNNNNNNNNNNNNNNNNNN¡¡¡û============================================== ; WRALL EQU 0 ;WRITE TO ALLOCATED WRDIR EQU 1 ;WRITE TO DIRECTORY WRUAL EQU 2µÉÿÎNNNNNNNNNNNNNNNNN¡¡¡þ àåNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; Change hard disk system tracks directory reference to new format. ; Correct bug in drivers which caused retry to fail. (sectož—ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ .NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûcurrent level) ; caused the drive table to have bad data (default table was missing ; the 2 deblocking extension bytes). ; zÇÿíNNNNNNNNNNNNNNNN¡¡¡þ ¥ˆNNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡û offset. Disk partitioning will add this value to sector word. It ; will be stored in the ID sector data to be dynamic. ; ;”‹ÿ NNNNNNNNNNNNNNNN¡¡¡þ I0NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û10-23-91 GRH Fix bugs ; ; 3.13 1-15-92 GRH ; Change hard disk translation to Monitor disks 4 & 5 from 6 & 7. ; VERSN E}ÿÂNNNNNNNNNNNNNNNN¡¡¡þ j?NNNNNNNNNNNNNNNNNNNNNN¡¡¡û=========================================== ; ; INCLUDE COMIOPB3.DEF ; INCLUDE DISKS3.DEF ; INCLUDE BDIR.DEF ; ¢PÿäNNNNNNNNNNNNNNNNN¡¡¡þ  €aNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCCP BDOS: EQU CPMBS + 3C00H ;ADDRESS OF BDOS BIOS: EQU CPMBS + 4A00H ;ADDRESS OF BDOS BIOSR: EQU 1000H - BIOS ; ; PAGE š†þ!NNNNNNNNNNNNNNNN¡¡¡þ &*ÇNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ; 8" HARD DISK BOOT DATA ; STHD EQU 0 ;START LOGICAL DRIVE OF HARD DISK NDHD EQU 3 ;LAST LOGICAL DRIVE OF HARD DISK SùBÿòNNNNNNNNNNNNNNNN¡¡¡þ ,Å NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û ;WRITE TO UNALLOCATED ;============================================================================ ; ; ASCII CHARS ; KÿäNNNNNNNNNNNNNNNN¡¡¡þ ÓÔNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûr remained ; corrupted) ; Stubbed out new Clock routines for present. ; 3.03 31 JUL 88 GRH ; Unstub Clock routines. ; 3¼�ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ  <NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûImplement data xfer inhibit schemes with PB_FLG & PB_BCNT. ; Add pick-up of THIS_BNK data in all iopb cases. ; Remove clock bu‘èÿ$NNNNNNNNNNNNNNNNN¡¡¡þ –¹NNNNNNNNNNNNNNNNNNNNNNð¡¡¡û 3.10 5-20-91 GRH ; Change LOGON to attempt to recover from old disks better, using ; DCM8301 version controller firmware. „ ÿyNNNNNNNNNNNNNNNN¡¡¡þ zNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûQU 313 ; ;**************************************************************************** SUBTTL SYSTEM DECLARATIONS ;======ÜŸÿNNNNNNNNNNNNNNNNNN¡¡¡þ YNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûINCLUDE M5ZF2.DEF ; ;============================================================================ ; LIST OFF *INCLUDEœÁÿNNNNNNNNNNNNNNNNN¡¡¡þ !³PNNNNNNNNNNNNNNNNNNNNNN¡¡¡û0 LOCATIONS ; PAGE0: EQU 0 ;START OF CP/M RAM DEFDRV: EQU PAGE0 + 4 ;DEFAULT DRIVE PARAM ADDR BDOSJV EQU PAGE0 + 5 ;BDOS SYž©ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ 'öNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûT8FD EQU 4 ;START LOGICAL DRIVE OF 8" FLOPPY ND8FD EQU 5 ;LAST LOGICAL DRIVE OF 8" FLOPPY ENDIF IF BOOT = 3 ; ; 8\§ÿÉNNNNNNNNNNNNNNNN¡¡¡þ -ö=NNNNNNNNNNNNNNNNNNNNNN¡¡¡û;============================================================================ ; LF: EQU 0AH CR: EQU 0DH CTRLZ: EQU 1AH ÐÈÿÎNNNNNNNNNNNNNNNNN¡¡¡þ JCNNNNNNNNNNNNNNNNNNNNNN¡¡¡û.04 6 AUG 88 GRH ; Remove floppy side select from BIOS & move to controller. ; Implement new ID sector format. ; Implement §ÿBNNNNNNNNNNNNNNNN¡¡¡þ  iLNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûffer set/read system calls. ; 12-5-90 GRH ; Remove IX IOPB ptr passing to disk drivers. ; 1-13-91 GRH ; Fix bug which cor½|ÿ NNNNNNNNNNNNNNNNN¡¡¡þ …ôNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; 3.11 9-2-91 GRH ; Add redlines & change for M5ZMON v.2.00. ; ; 3.12 9-11-91 GRH ; Add deblocking code. ; 9-17-91 |‹ÿùNNNNNNNNNNNNNNNN¡¡¡þ /RNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û====================================================================== ; ; ASSEMBLY PARAMETERS ; ;==========================“‡ÿ�NNNNNNNNNNNNNNNNN¡¡¡þ À™NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û COMIOPB3.DEF *INCLUDE DISKS3.DEF *INCLUDE BDIR.DEF *INCLUDE M5ZF2.DEF LIST ON ;=====================ÿòNNNNNNNNNNNNNNNN¡¡¡þ "æNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûSTEM CALL ENTRY THIS_STK EQU PAGE0 + 1CH ;CURRENT STACK FRAME PTR DK_BDRV EQU 0041H ;BOOT DRIVE # FROM PROM DEFBFR EQU PAGE0mqÿÉNNNNNNNNNNNNNNNNN¡¡¡þ ( ÈNNNNNNNNNNNNNNNNNNNNNN¡¡¡û" FLOPPY BOOT DATA ; STHD EQU 2 ;START LOGICAL DRIVE OF HARD DISK NDHD EQU 5 ;LAST LOGICAL DRIVE OF HARD DISK ST8FD EQU 0 �«ÿáNNNNNNNNNNNNNNNN¡¡¡þ .£nNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE THE TRANSLATION TABLE MACRO ; ;@@ñþ'NNNNNNNNNNNNNNNNN¡¡¡þ yrNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCP/M 3.0 DPB structure in preparation for deblocking. ; 3.05 11-3-88 GRH ; Change included data to update IOPB.PBSTAT to new¾•ÿHNNNNNNNNNNNNNNNNN¡¡¡þ  Z}NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûrupted PB_FLG. ; 3.08 2-22-91 GRH ; Remove references to THIS_BNK & use monitor function #7 instead. ; Add track-head shift6þrNNNNNNNNNNNNNNNNN¡¡¡þ ¶ÅNNNNNNNNNNNNNNNNNNNNNN¡¡¡û GRH Add r/ls & move to 59k system. ; 9-19-91 GRH Fix bug which destroyed my root directories! ; BUF_RD was writing. ;[ÿôNNNNNNNNNNNNNNNN¡¡¡þ cNNNNNNNNNNNNNNNNNNNNNN¡¡¡û================================================== ; FALSE EQU 0 TRUE EQU NOT FALSE ;===================================ÙœÿòNNNNNNNNNNNNNNNN¡¡¡þ ó¨NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û======================================================= ; ; DISK OPERATING SYSTEM ADDRESSES ; ;===========================â†ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ #Õ2NNNNNNNNNNNNNNNNNNNNNN¡¡¡û + 80H ;DEFAULT BUFFER ; ; BIOS FUNCTION CALL RESTART VECTOR ; BFUNRST EQU 28H BFUNRSV EQU PAGE0 + BFUNRST BFUNRSI EQU 0rÿäNNNNNNNNNNNNNNNNN¡¡¡þ ):ùNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;START LOGICAL DRIVE OF 8" FLOPPY ND8FD EQU 1 ;LAST LOGICAL DRIVE OF 8" FLOPPY ENDIF ;==============================­ÿINNNNNNNNNNNNNNNNN¡¡¡þ /�_NNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; GXLATE MACRO #SECTORS, #SKEW LIST OFF NXTSEC DXÿòNNNNNNNNNNNNNNNN¡¡¡þ ,!NNNNNNNNNNNNNNNNNNNNNN¡¡¡û configuration. ; 3.06 1-28-89 GRH ; Revised primitive calling procedures to use the monitor rom function ; rather than sw½GÿÂNNNNNNNNNNNNNNNN¡¡¡þ  ÃêNNNNNNNNNNNNNNNNNNNNNN¡¡¡û factor to DPBs for future use. ; 3.09 5-15-91 GRH ; Change 8" floppy side select to track bit 0. Move calculation from ; �×ÿÂNNNNNNNNNNNNNNNN¡¡¡þ ã–NNNNNNNNNNNNNNNNNNNNNN¡¡¡û Patch problems with partitioning until 20MB drive installed. ; Fix TPA corruption by LOGON problem by using ROMBNK sector LµþNNNNNNNNNNNNNNNNN¡¡¡þ  ]NNNNNNNNNNNNNNNNNNNNNN¡¡¡û========================================= ; ; CONDITIONAL ASSEMBLY FLAGS ; ;================================================ļþrNNNNNNNNNNNNNNNN¡¡¡þ ¦ûNNNNNNNNNNNNNNNNNNNNNN¡¡¡û================================================= ; SYS EQU 2 ;CP/M VERSION {2,3} ; NKSYS: EQU 59 ;SYSTEM SIZE IN K BYTES XÿÎNNNNNNNNNNNNNNNNN¡¡¡þ $L¥NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûC7H + BFUNRST ;============================================================================ ; ; OTHER DECLARATIONS ; ;=ï”ÿÂNNNNNNNNNNNNNNNN¡¡¡þ *oªNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û============================================== ; ; BDOS CONSTANTS ON ENTRY TO WRITE ; ;==============================NÿÉNNNNNNNNNNNNNNNNN¡¡¡þ 0ƒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL 1 ;;START WITH SECTOR 1 LOWEST DL 1 ;; REPT #SECTORS LIST ON DB NXTSEC LIST OFF NXTSEC DL NXTSEC + #SKEW ;ADD SKEW]ôÿINNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN^NNNNNNNN�Î�œ‚iƒ7„…Ò… †n‡<ˆ ‰×‰¤Šs‹AŒ�Ü�«Žy�G�‘㑱’“L”•ç•´–‚—O˜™ë™¹š‡›Uœ"�ï�¼žŠŸX %¡ò¡¿¢�£Z¤(¥ö¥Ä¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ ô2NNNNNNNNNNNNNNNNNNNNNN¡¡¡û FACTOR ;; IF NXTSEC > #SECTORS ;CHECK FOR OVERFLOW NXTSEC DL NXTSEC - #SECTORS ;; IF NXTSEC <= LOWEST ;CHECK FOR REP�þHNNNNNNNNNNNNNNNNN¡¡¡þ ^”NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û------------------------------ ; ; BIOS JUMP VECTOR TABLE ; ;-------------------------------------------------------------èºÿäNNNNNNNNNNNNNNNN¡¡¡þ ±_NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûRESIDE AS DEFINED RIGHT BEFORE THE COLD ; INIT ROUTINE START AND MUST BE IN THE 1ST SECTOR. THESE 2 WORDS ARE ; REFERENCED BY ÕÿÂNNNNNNNNNNNNNNNN¡¡¡þ ‘#NNNNNNNNNNNNNNNNNNNNNN¡¡¡û############################################### ; DIRBF: EQU $ ;BUFFER BEGINNING ;--------------------------------------Y�þrNNNNNNNNNNNNNNNN¡¡¡þ ~èNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCK INSTALLED ; LD A,MF_CSYN ;TEST FOR BOARD PRESENT CALL XMROM ; ; IF CLOCK PRESENT THEN TURN ON CLOCK DRIVE ; OR A,­Ýÿ“NNNNNNNNNNNNNNNNN¡¡¡þ ÔNNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTHAN DIR BUFFER **** ELSE DS DIRBF+SECSZ-$ ;FILL OUT DIRECTORY BUFFER TO 1 SECTOR SIZE ENDIF ;-------------------"°ÿòNNNNNNNNNNNNNNNN¡¡¡þ %>NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; READ BOOT DIRECTORY ; LD BC,DEFBFR ;SET XFER ADDRESS (USE DEFAULT BUFFER) CALL SETDMA ; LD BC,BD_SEC ;SET DIRußÿHNNNNNNNNNNNNNNNNN¡¡¡þ +NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; IF NOT INTO BDOS THEN READ NEXT SECTOR ; LD DE,BDOS XOR A,A SBC HL,DE JR C,WREAD ; ; ELSE IF AT BEGINNING OF BÔÿNNNNNNNNNNNNNNNNN¡¡¡þ ¡aNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEAT NXTSEC DL LOWEST + 1 LOWEST DL NXTSEC ENDIF ENDIF ;; ENDM LIST ON ENDM ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@yYÿòNNNNNNNNNNNNNNNNN¡¡¡þ NªNNNNNNNNNNNNNNNNNNNNNN¡¡¡û--------------- ; JP INIT1 ;COLD START ENTRY JP WARM ;RELOAD CCP/BDOS JP CNSCK ;GET CONSOLE STATUS JP CI ;CONSOLE IH¦ÿHNNNNNNNNNNNNNNNN¡¡¡þ ä NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTHE BOOT LOADER CODE IN ORDER TO DETERMINE THE LOAD ADDRESS ; AND LENGTH OF THE BIOS. ; ;####################################c ÿrNNNNNNNNNNNNNNNN¡¡¡þ ´NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û-------------------------------------- ; ; INIT - COLD START ENTRY FROM BOOT MUST SET ALL BIOS PARAMS ; ;---------------°ÿòNNNNNNNNNNNNNNNN¡¡¡þ +»NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA LD A,38H ;COND. JR (ON) JR Z,CLKON ; ; ELSE TURN OFF CLOCK DRIVE ; LD A,18H ;UNCOND. JR (OFF) (CAUSES JUMP TO ILLQïÿäNNNNNNNNNNNNNNNNN¡¡¡þ ÁåNNNNNNNNNNNNNNNNNNNNNN¡¡¡û--------------------------------------- ; ; WARM REBOOT ENTRY LOADS CCP,BDOS FROM DISK & ; SETS UP VARIABLES ; ;-----------™ÂþBNNNNNNNNNNNNNNNN¡¡¡þ &kCNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûECTORY SECTOR CALL SETSEC ; LD BC,0 ;SET TRACK TO 0 CALL SETTRK ; CALL DISKRD JR NZ,WEROR ; ; CHECK FOR VALID B7•ÿòNNNNNNNNNNNNNNNN¡¡¡þ ,„ˆNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDOS THEN SET UP NEW TRACK & SECTOR ; JR Z,RDBDOS ; ; ELSE IF NOT AT BIOS THEN READ NEXT SECTOR ; LD DE,BIOS - BDOS S îÿÉNNNNNNNNNNNNNNNN¡¡¡þ ’PNNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; INITIALIZE VERSION TEXT IN RAM MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@œÿÿ'NNNNNNNNNNNNNNNNN¡¡¡þ }›NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûNPUT JP COC ;CONSOLE OUTPUT JP LO ;PRINTER OUTPUT JP PUNCH JP READER JP HOME ;HOME SELECTED DRIVE JP SELDSK ;SEL XÿäNNNNNNNNNNNNNNNNN¡¡¡þ ×=NNNNNNNNNNNNNNNNNNNNNN¡¡¡û######################################## ; DB 0 ;Z80 CPU DB 0 ;SPARE BIOSSZ: DW BIOSND - BIOS ;BIOS MODULE SIZE IN BYTES¿ñÿÂNNNNNNNNNNNNNNNN¡¡¡þ ;…NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û------------------------------------------------------------- ; INIT: ; ; SET TEMPORARY STACK ; DI LD SP,DEFBFR ;USE ~„ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ ŠNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûEGAL) ; CLKON: LD (INHCLK),A ; ; BOOT CCP & BDOS ; JR WARM ;######################################################J6ÿ®NNNNNNNNNNNNNNNNN¡¡¡þ !òÔNNNNNNNNNNNNNNNNNNNNNN¡¡¡û----------------------------------------------- ; WARM: ; ; SET TEMPORARY STACK ; DI LD SP,DEFBFR LD (THIS_STK),SP z”ÿHNNNNNNNNNNNNNNNNN¡¡¡þ 'XrNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOOT DIRECTORY ; LD A,(DEFBFR) CP A,86H JR C,WEROR ; ; SET UP TO LOAD CCP/BDOS ; LD HL,(DEFBFR + BD_SBDSS) ;PREFETC0ÿäNNNNNNNNNNNNNNNN¡¡¡þ -·¹NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBC HL,DE JP C,WREAD ; ; ELSE DONE READING SYSTEM ; JR WZRPG ; ; ; ELSE SET UP & READ BDOS ; RDBDOS: POP HL ;RES�ÿÂNNNNNNNNNNNNNNNN¡¡¡þ  ÇNNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; PVERS MACRO #VERS DD DL #VERS IF DD > 9999 DB (DD / 10000) + '0' DD DL D?¦ÿBNNNNNNNNNNNNNNNN¡¡¡þ (ÈNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûECT DISK DRIVE JP SETTRK ;SET TRACK # JP SETSEC ;SET SECTOR # JP SETDMA ;SET TRANSFER ADDR JP DISKRD ;PERFORM DISK R÷ÓÿäNNNNNNNNNNNNNNNNN¡¡¡þ ÄpNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û BIOSST: DW BIOS ;BIOS MODULE LOAD ADDR FOR SBD ; ; CONTINUE ON WITH INIT ; INIT1: JR INIT ;#######################%¦ÿÂNNNNNNNNNNNNNNNN¡¡¡þ nÖNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPAGE 0 FOR STACK LD (THIS_STK),SP EI ; ; INIT DEFAULT DRIVE ; LD A,(DK_BDRV) ;USE DRIVE # PASSED IN PAGE 0 AND A,3 ô9ÿHNNNNNNNNNNNNNNNNN¡¡¡þ �NNNNNNNNNNNNNNNNNNNNNN¡¡¡û###################### ; ; SIGN-ON MESSAGE ; ;############################################################################ $ÆÿrNNNNNNNNNNNNNNNN¡¡¡þ "§‡NNNNNNNNNNNNNNNNNNNNNN¡¡¡û EI ; ; INIT OUR STUFF ; XOR A,A LD (BUF_ACT),A ;ASSUME NO DATA IN BUFFER ; LD (UNA_CNT),A ;CLEAR UNALLOCATED SECTOîàÿäNNNNNNNNNNNNNNNNN¡¡¡þ (HLNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûH BDOS TRK/SECTOR PUSH HL ; LD HL,(DEFBFR + BD_SCCPS) ;FETCH CCP TRK/SECTOR LD C,L LD B,0 CALL SETSEC ; LD C,H CJþBNNNNNNNNNNNNNNNN¡¡¡þ .âêNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTORE BDOS TRK/SECTOR FROM DIRECTORY LD C,L LD B,A ;A STILL CONTAINS 0 CALL SETSEC ; LD C,H CALL SETTRK ; JR WREAD$ÿ“NNNNNNNNNNNNNNNNN¡¡¡þ 8öNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD % 10000 ENDIF IF DD > 999 DB (DD / 1000) + '0' DD DL DD % 1000 ENDIF DB (DD / 100) + '0' DB '.' DB ((DD %FlÿäNNNNNNNNNNNNNNNNN¡¡¡þ ùNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEAD JP DISKWR ;PERFORM DISK WRITE JP LISTST ;RETURN LIST STATUS JP SECTRN ;TRANSLATE SECTOR JP BIOFUNC ;EXECUTE FUNCN“ÿrNNNNNNNNNNNNNNNNN¡¡¡þ ÷ANNNNNNNNNNNNNNNNNNNNNN¡¡¡û##################################################### ; ; DIRECTORY SECTOR BUFFER STARTS HERE AFTER CRUNCHING COLD START ; C4ÿlNNNNNNNNNNNNNNNN¡¡¡þ ]çNNNNNNNNNNNNNNNNNNNNNNð¡¡¡û LD (DEFDRV),A ; ; SEND SYSTEM SIGN-ON ; LD HL,MSGSO CALL EDITOR ; ; MODIFY COLD START VECTOR TO WARM START ; LÌ_ÿrNNNNNNNNNNNNNNNN¡¡¡þ ²,NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û; MSGSO: DB CR,LF DB CPMSZ / (KBYTE * 10) + '0' DB (CPMSZ MOD (KBYTE * 10)) / KBYTE + '0' DB 'K CP/M-80 Vers 2.2',CR,LF b,ÿ¢NNNNNNNNNNNNNNNN¡¡¡þ #”¶NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR COUNT ; LD (BUF_MOD),A ;CLEAN BUFFER ; LD HL,BLKBUF ;INIT BUFFER PTR LD (BUF_DMA),HL ; ; LOG ON DRIVE TO INIT TABL;lÿNNNNNNNNNNNNNNNNN¡¡¡þ ){}NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûALL SETTRK ; LD BC,CCP CALL SETDMA ; ; READ CCP/BDOS ; WREAD: CALL DISKRD JR NZ,WEROR ;IF ERROR THEN EXIT ; ; Nµ]ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ /ÑÛNNNNNNNNNNNNNNNNNNNNNNð¡¡¡û ; ; ; WARM BOOT ERROR, OUTPUT MSG & GO TO DEBUGGER ; WEROR: LD HL,MSGLE ;OUTPUT ERROR MESSAGE CALL EDITOR CALL MR_BRÖ´ÿòNNNNNNNNNNNNNNNN¡¡¡þ m¥NNNNNNNNNNNNNNNNNNNNNN¡¡¡û 100) / 10) + '0' DB (DD % 10) + '0' ENDM SUBTTL BIOS CODE ORG BIOS ;----------------------------------------------Þ@ÿ„NNNNNNNNNNNNNNNN¡¡¡þ ‚nNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTION CALL ;############################################################################ ; ; THE FOLLOWING BOOT DATA MUST ~õÿ9NNNNNNNNNNNNNNNN¡¡¡þ ¢NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûODE. THIS BUFFER IS USED BY THE CP/M DIRECTORY CHECK ROUTINES THAT ; CHECK FOR DISK CHANGE. ; ;#############################úéÿdNNNNNNNNNNNNNNNNN¡¡¡þ MÙNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûD HL,(BIOS+4) LD (BIOS+1),HL ; ; INIT OUR STUFF ; CALL GETBNK LD (BUF_DMAB),A ; ; INITIALIZE CLOCK VECTORS IF CLO¦íÿ„NNNNNNNNNNNNNNNN¡¡¡þ çNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DB 'M5b CBIOS Vers ' PVERS VERSN DM CR,LF IF $ > (DIRBF + SECSZ) CONMSG **** WARNING! COLD INIT CODE BIGGER jˆþHNNNNNNNNNNNNNNNNN¡¡¡þ $ !NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûES ; LD A,(DK_BDRV) AND A,3 ;MODULO 4 LD C,A LD E,0 CALL SELDSK LD A,L ;IF ERROR THEN ABORT OR A,H JR Z,WEROR­»ÿîNNNNNNNNNNNNNNNNN¡¡¡þ *..NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEXT SECTOR ; LD HL,CPM_SEC INC (HL) ; LD DE,128 ;DMA += SECTOR SIZE LD HL,(CPM_DMA) ADD HL,DE LD (CPM_DMA),HL ; ìAÿÉNNNNNNNNNNNNNNNNN¡¡¡þ 0–NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûK HALT ; ; ; BOOT OK, INIT PAGE 0 ; WZRPG: ; ; INIT BIOS WARM START IN PAGE 0 ; LD A,0C3H LD HL,BIOS + 3 LD (òÿ$NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN$NNNNNNý€Ë�™‚hƒ6„…Ò… †o‡=ˆ ‰Ù‰¦Št‹AŒ�Ý�¬Ž{�I�‘味’€“N”•é•¶–„—Q˜ ™ï™½š‹›Zœ(�ö�Þ‘Ÿ_ -¡ú¡Ç¢•£b¤0¥ý¥Ë¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ ÃNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û(PAGE0),A LD (PAGE0 + 1),HL ; ; INIT BDOS CALL VECTOR IN PAGE 0 ; LD HL,BDOS + 6 LD (BDOSJV),A LD (BDOSJV + 1),HL —þ$NNNNNNNNNNNNNNNNN¡¡¡þ i¤NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++ ; DISKRD: ; ; SET UP DATA TABLE PTRS ; PUSH IX LD IX,(CUR_DDT) ; PUSH I�<ÿÂNNNNNNNNNNNNNNNN¡¡¡þ  †oNNNNNNNNNNNNNNNNNNNNNN¡¡¡û 0: WRITE TO ALLOCATED BLOCK (UPDATE) ; 1: WRITE TO DIRECTORY BLOCK (ALLWAYS WRITE) ; 2: WRITE TO UNALLOCATED BLOCK (NO ­´þNNNNNNNNNNNNNNNNNN¡¡¡þ ¦NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCK ; LD A,(IY + DPB_BLM) ;CUR_DPB.DPBBLM + 1 ::= (BLKSIZ/128) INC A LD (UNA_CNT),A ; ; SET DISK TO SEEK ; LD A,(CP„ÿrNNNNNNNNNNNNNNNN¡¡¡þ IØNNNNNNNNNNNNNNNNNNNNNN¡¡¡û NEXT SECTOR FOR FUTURE REF ; EX DE,HL ;UNASEC += 1 INC HL LD (UNA_SEC),HL ; ; IF PAST LAST SECTOR ON TRACK THEN USE9äÿíNNNNNNNNNNNNNNNNN¡¡¡þ ã~NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûRS ; XOR A,A LD (IOPB + PB_STATO),A ; ; COMPUTE BUFFER SECTOR ; LD HL,(CPM_SEC) DEC HL ;CONVERT PHYSICAL SECTOR ƒ;þ NNNNNNNNNNNNNNNN¡¡¡þ % NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNZ,NOMATCH ; LD HL,(BUF_TRK) ;SAME TRACK? LD DE,(CPM_TRK) SBC HL,DE JR NZ,NOMATCH ; LD DE,(BUF_PSEC) ;SAME SECTOR? DÿNNNNNNNNNNNNNNNNNN¡¡¡þ +*/NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûALCULATE INDEX INTO BUFFER DEC HL ;CONVERT TO LOGICAL SECTOR (0..N-1) LD A,L ; AND A,(IY + DPB_PHM) ;USE PHYSICAL RECO*7ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ –QNNNNNNNNNNNNNNNNNNNNNNð¡¡¡û; ; INIT BIOS CALL VECTOR IN PAGE 0 ; LD HL,BIOFUNC LD (BFUNRSV),A LD (BFUNRSV + 1),HL ; ; SET DEFAULT SECTOR BUFF`½ÿmNNNNNNNNNNNNNNNNN¡¡¡þ yšNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûY LD IY,(CUR_DPB) ; ; IF NOT BLOCKED THEN USE CPM READ ; LD A,(IY + DPB_PSH) ;0= 128-BYTE SECTORS OR A,A JP Z,DISKRª\ÿäNNNNNNNNNNNNNNNN¡¡¡þ Ó -> BITS <14..8> LD H,A ; LD A,0 ;BIT 0 -> BIT 7 RRA LD L,A ; ; HL |¾ÿäNNNNNNNNNNNNNNNN¡¡¡þ ¥`NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûER ; LD BC,DEFBFR CALL SETDMA ; IF INTCPTS ; ; PUT BDOS VECTOR INTO INTERCEPT CODE ; LD HL,(BDOS + 7) LD (BDOS¸ïÿNNNNNNNNNNNNNNNNNN¡¡¡þ  J«NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDN ; ; READS DON'T NEED ALLOCATION ; XOR A,A LD (UNA_CNT),A ; ; READ_OPERATION_FLAG = TRUE (1) ; INC A LD (REAwßÿÈNNNNNNNNNNNNNNNNN¡¡¡þ à NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOOT WRITE PROTECTION ; XOR A,A LD (WR_PROT),A ; ; SET PTRS TO DISK DATA ; PUSH IX LD IX,(CUR_DDT) ; PUSH IY LŽEþ9NNNNNNNNNNNNNNNN¡¡¡þ  µNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCPM_SEC) LD (UNA_SEC),HL ; ; IF NO UNALLOCATED SECTORS REMAIN THEN PREREAD ; CHKUNA: LD A,(UNA_CNT) OR A,A JP Z,ALLO^ÿáNNNNNNNNNNNNNNNN¡¡¡þ /ºNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD (UNA_SEC),HL ; LD HL,(UNA_TRK) ;TRACK++ INC HL LD (UNA_TRK),HL ; NOOVF: ; ; MATCH FOUND, MARK AS UNNECESSARY REEÜÿÎNNNNNNNNNNNNNNNNN¡¡¡þ !ÅäNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûF ;IF ALREADY 0 THEN SECTOR SIZE IS 128 ; SECSHFLP: SRL H ;ELSE SHIFT OVER TO PHYSICAL SECTOR RR L DEC A JP NZ,SECSiÿgNNNNNNNNNNNNNNNNN¡¡¡þ 'oBNNNNNNNNNNNNNNNNNNNNNNð¡¡¡ûNG NEW ONE ; CALL BUF_FLSH ;CLEAR HOST BUFF ; JR NZ,RW_RET ;IF ERROR THEN ABORT ; FILHST: ; ; READ THE SECTOR BUFFER¾^ÿ“NNNNNNNNNNNNNNNN¡¡¡þ -€‰NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHAS RELATIVE HOST BUFFER ADDRESS ; LD DE,BLKBUF ADD HL,DE ;HL = HOST ADDRESS ; LD DE,(CPM_DMA) ;GET/PUT CP/M DATA LD —ÁþBNNNNNNNNNNNNNNNN¡¡¡þ <÷NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûV),HL ; ; NOW PUT INTERCEPT VECTOR INTO BDOS CODE ; LD HL,INTCPT LD (BDOS + 7),HL ENDIF ; ; PASS DEFAULT DISK TOç©ÿœNNNNNNNNNNNNNNNN¡¡¡þ  øNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDOP),A ; ; PRE-READ_OF_DATA_FLAG = TRUE ; LD (RSFLAG),A ; ; TREAT AS UNALLOCATED BLOCK ; LD A,WRUAL LD (WRTYPE),»WÿòNNNNNNNNNNNNNNNNN¡¡¡þ ó@NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD IY,(CUR_DPB) ; ; IF NOT BLOCKED THEN USE CPM WRITE ; LD A,(IY + DPB_PSH) ;0= 128-BYTE SECTORS OR A,A JP Z,DISKWRN <‰þBNNNNNNNNNNNNNNNN¡¡¡þ YæNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûC ; ; ELSE MORE UNALLOCATED RECORDS REMAIN, COUNT-- ; DEC A LD (UNA_CNT),A ; ; IF REQUESTED SECTOR != UNALLOCATED SÎ8ÿHNNNNNNNNNNNNNNNNN¡¡¡þ ¶-NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAD ; XOR A,A ;PREREAD FLAG = FALSE LD (RSFLAG),A JP RWOPER ; ; ; NORMAL NON-BLOCKED WRITE ; DISKWRN: CALL CPM_WuèÿùNNNNNNNNNNNNNNNN¡¡¡þ "�·NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHFLP ; NOSECSHF: INC HL ;SET BACK TO PHYSICAL SECTOR LD (BUF_PSEC),HL ;BUFFER PHYSICAL SECTOR TO ACCESS ; ; IF BUFFERŸ*ÿäNNNNNNNNNNNNNNNNN¡¡¡þ (|NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; LD A,(CPM_DSK) ;BUFFER SECTOR = PHYSICAL SECTOR LD (BUF_DSK),A ; LD HL,(CPM_TRK) LD (BUF_TRK),HL ; LD HL,(BUF_PSBÃþ®NNNNNNNNNNNNNNNNN¡¡¡þ .ÕÚNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûBC,128 ;LENGTH OF MOVE ; LD A,(READOP) ;WHICH WAY? OR A,A JP NZ,RWMOVE ;SKIP IF READ ; ; WRITE OPERATION, MARK AND SðÁÿÈNNNNNNNNNNNNNNNNN¡¡¡þ ÆNNNNNNNNNNNNNNNNNNNNNN¡¡¡û CCP ; LD A,(DEFDRV) LD C,A JP CCP SUBTTL BIOS DISK FUNCTION ROUTINES ;+++++++++++++++++++++++++++++++++++++++++++=bÿ“NNNNNNNNNNNNNNNNN¡¡¡þ  ,ÉNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûA ; JP RWOPER ;TO PERFORM THE READ ; ; ; NORMAL NON-BLOCKED READ ; DISKRDN: CALL CPM_RD JP RW_RET ;*********?¬þ NNNNNNNNNNNNNNNNN¡¡¡þ ÀqNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ; READ_OP_FLAG = FALSE ; XOR A,A LD (READOP),A ; ; SAVE WRITE TYPE ; LD A,C LD (WRTYPE),A ; ; IF 1ST WRIT±‰þ|NNNNNNNNNNNNNNNN¡¡¡þ j×NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûECTOR THEN PURGE ; LD A,(CPM_DSK) ;SAME DISK? LD HL,UNA_DSK CP A,(HL) JR NZ,ALLOC ; LD HL,(UNA_TRK) ;SAME TRACK? L°;ÿäNNNNNNNNNNNNNNNN¡¡¡þ …NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR JP RW_RET ; ; ; NOT AN UNALLOCATED RECORD, REQUIRES PRE-READ ; ALLOC: XOR A,A ;COUNT = 0 LD (UNA_CNT),A ; INC‘¡ÿBNNNNNNNNNNNNNNNN¡¡¡þ #£†NNNNNNNNNNNNNNNNNNNNNN¡¡¡û == EMPTY THEN READ THE PHYSICAL SECTOR ; LD HL,BUF_ACT LD A,(HL) ; LD (HL),1 ;BUFFER = ACTIVE IN ANY CASE ; OR A,A f-ÿäNNNNNNNNNNNNNNNNN¡¡¡þ )LMNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEC) LD (BUF_SEC),HL ; ; IF REQUIRED TO READ THEN READ ; LD A,(RSFLAG) ;NEED TO READ? OR A,A CALL NZ,BUF_RD ;YES, uÿ¬NNNNNNNNNNNNNNNNN¡¡¡þ /æëNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûWITCH DIRECTION ; LD A,1 ;BUFFER = DIRTY LD (BUF_MOD),A ; ; SAVE BUFFER DATA PTRS FOR LATER FLUSHES ; LD (BUF_DDT),”‘ÿäNNNNNNNNNNNNNNNN¡¡¡þ Z•NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û+++++++++++++++++++++++++++++++++ ; ; READ A DISK SECTOR ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++++++++++++++++++++� ÿÂNNNNNNNNNNNNNNNN¡¡¡þ  µ^NNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************************************************* ; ; WRITE DISK SECTOR FUNCTION ; ENTRY- C= WRITE TYPE: ;3«ÿÂNNNNNNNNNNNNNNNN¡¡¡þ •"NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûE TO UNALLOCATED (NEW, UNUSED) BLOCK THEN SET PARAMETERS ; CP A,WRUAL JP NZ,CHKUNA ; ; COUNT = NUMBER_OF_SECTORS_IN_BLOŠáþ NNNNNNNNNNNNNNNNN¡¡¡þ zéNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD DE,(CPM_TRK) SBC HL,DE JR NZ,ALLOC ; LD HL,(CPM_SEC) LD DE,(UNA_SEC) SBC HL,DE JR NZ,ALLOC ; ; MATCH, MOVE TO¤(þBNNNNNNNNNNNNNNNN¡¡¡þ ÐONNNNNNNNNNNNNNNNNNNNNN¡¡¡û A ;PREREAD FLAG = TRUE LD (RSFLAG),A ; ; ; ; COMMON CODE FOR READ AND WRITE FOLLOWS ; RWOPER: ; ; ASSUME NO ERROHJÿçNNNNNNNNNNNNNNNNN¡¡¡þ $:NNNNNNNNNNNNNNNNNNNNNN¡¡¡û JR Z,FILHST ; ; HOST BUFFER ACTIVE, SAME AS SEEK BUFFER? ; LD A,(CPM_DSK) LD HL,BUF_DSK ;SAME DISK? CP A,(HL) JR ewþ!NNNNNNNNNNNNNNNN¡¡¡þ *NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûIF 1 ; ; BUFFER = CLEAN ; XOR A,A LD (BUF_MOD),A ; MATCH: ; ; COPY DATA TO OR FROM BUFFER ; LD HL,(CPM_SEC) ;C€íÿäNNNNNNNNNNNNNNNNN¡¡¡þ 0õ¦NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIX LD (BUF_DPB),IY ; EX DE,HL ;SOURCE/DEST SWAP ; RWMOVE: ; ; BC INITIALLY 128, DE IS SOURCE, HL IS DEST ; LDIR ³ÿÉNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÈNNNNNNNNN�Î�œ‚jƒ7„…Ó…¢†o‡=ˆ ‰Ø‰¥Šs‹AŒ�Ý�«Žy�G�‘⑱’~“L”•蕵–ƒ—Q˜™í™»š‰›Xœ&�ô�ž�Ÿ^ ,¡ú¡Ç¢•£b¤0¥ý¥Ë¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ ¥NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û; ; DATA HAS BEEN MOVED TO/FROM HOST BUFFER, IF NOT DIRECTORY THEN DELAY WRITE ; LD A,(WRTYPE) ;IF NOT DIRECTORY THEN DELòRÿÉNNNNNNNNNNNNNNNNN¡¡¡þ ¹NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSEC)= SECTOR # TO WRITE TO ; (CPM_DMA)= XFER ADDRESS ; IX= DDT PTR ; IY= DPB PTR ; EXIT - (IOPB.PB_STATO)= 0: OK, /0: ERRëéÿrNNNNNNNNNNNNNNNN¡¡¡þ àrNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûT) LD IY,(CUR_DPB) ; ; EXECUTE READ SECTOR ; CALL CPM_RD ; ; RESTORE PTRS & RETURN ; POP IY POP IX RET ¯ÿ®NNNNNNNNNNNNNNNNN¡¡¡þ ÀNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************* ; ; SET UP IOPB FOR EXECUTION ; ENTRY- HL= PTR TO IOPB IMAGE TRACK DATA ; IX= DDT PTR ; IY= DPB PTR ; (SPx¸þBNNNNNNNNNNNNNNNN¡¡¡þ /ÅNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û************************** ; BUF_FLSH: ; ; IF UNMODIFIED THEN RETURN ; LD A,(BUF_MOD) OR A,A RET Z ; ; ELSE SET/ãÿÉNNNNNNNNNNNNNNNNN¡¡¡þ …cNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************************ ; BUF_WR: ; LD HL,LL_WRIT JP BUF_RW ;******************¦JÿäNNNNNNNNNNNNNNNN¡¡¡þ %o=NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûR BLOCK ; ENTRY- C= DRIVE # ; E= 0 IF NEW SELECT ; EXIT - HL= PTR TO DPT OR 0 FOR ERROR ; ;+++++++++++++++++++++++++++++++`ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ +L2NNNNNNNNNNNNNNNNNNNNNN¡¡¡û,(HL) INC HL LD D,(HL) LD (CUR_DPH),DE EX DE,HL ;PUT DPH PTR IN HL FOR RETURN ; ; IF NOT FIRST SELECT OR LOGON INHIŽ¿ÿ!NNNNNNNNNNNNNNNN¡¡¡þ ðLNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûAY WRITE CP A,WRDIR LD A,(IOPB + PB_STATO) ;RETURN ANY ERRORS ANYWAY JR NZ,RW_RET ; ; IF ERROR THEN ABORT ; OR A,A mTÿHNNNNNNNNNNNNNNNNN¡¡¡þ ‡NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOR ; ;**************************************************************************** ; CPM_WR: ; LD HL,LL_WRIT JP CPM_RW ÔtÿçNNNNNNNNNNNNNNNN¡¡¡þ µ!NNNNNNNNNNNNNNNNNNNNNN¡¡¡û;**************************************************************************** ; ; CPM_RD PERFORMS THE PHYSICAL READ FROM THE DàÑÿ NNNNNNNNNNNNNNNN¡¡¡þ Y™NNNNNNNNNNNNNNNNNNNNNN¡¡¡û)= ADDRESS {LL_READ, LLWRIT} OF EXECUTOR ; ;**************************************************************************** ; R( ÿrNNNNNNNNNNNNNNNN¡¡¡þ z–NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û PTRS TO BUFFER DATA ; PUSH IX PUSH IY LD IX,(BUF_DDT) LD IY,(BUF_DPB) ; ; WRITE THE BUFFER DATA ; CALL BUF_WR š‚ÿòNNNNNNNNNNNNNNNNN¡¡¡þ �ÈNNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************************************************** ; ; RDBUF PERFORMS THE PHYSICAL READ FROM THE HOST DISK INTO BLKBUFýÿÎNNNNNNNNNNNNNNNNN¡¡¡þ &:nNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++ ; SELDSK: ; ; STORE DRIVE # FOR FUTURE USE ; LD A,C LD (CPM_DSK),A ; ÁöÿòNNNNNNNNNNNNNNNN¡¡¡þ ,Õ¥NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBITED THEN RETURN TABLE PTR ; LD A,(LOGRQ) ;0: LOGON, 1:INHIBIT OR A,C ;0: NORMAL, 1: INHIBIT CPL AND A,1 RET Z ; ŒÌÿòNNNNNNNNNNNNNNNN¡¡¡þ Ã}NNNNNNNNNNNNNNNNNNNNNN¡¡¡û JR NZ,RW_RET ; ; NO ERROR/DIRECTORY WRITE ; XOR A,A ;BUFFER = CLEAN LD (BUF_MOD),A ; CALL BUF_WR ;WRITE TO DIS`ÿ“NNNNNNNNNNNNNNNNN¡¡¡þ ,¶NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;**************************************************************************** ; ; CPM_RD2 PERFORMS THE PHYSICAL READ FROM‘yþ NNNNNNNNNNNNNNNNN¡¡¡þ †NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûISK INTO CPM_DMA. ; ENTRY- (CPM_DSK)= DISK # TO READ FROM ; (CPM_TRK)= TRACK # TO READ FROM ; (CPM_SEC)= SECTOR # TO READ F¡‡ÿùNNNNNNNNNNNNNNNN¡¡¡þ j¨NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD_WR: LD DE,IOPB + PB_TRKO LD BC,PB_BCNTO - PB_TRKO LDIR ; ; EXECUTE LOW LEVEL READ OR WRITE (ON STACK) ; RET ;*LˆÿBNNNNNNNNNNNNNNNN¡¡¡þ I§NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ; RESTORE THE PTRS ; POP IY POP IX ; ; IF ERROR THEN RETURN IT ; OR A,A RET NZ ; ; ELSE CLEAN BUFFER ; ¢�ÿœNNNNNNNNNNNNNNNN¡¡¡þ !£ùNNNNNNNNNNNNNNNNNNNNNN¡¡¡û. ; ENTRY- (BUF_DSK)= DISK # TO READ FROM ; (BUF_TRK)= TRACK # TO READ FROM ; (BUF_SEC)= SECTOR # TO READ FROM ; IX= DDT WÿoNNNNNNNNNNNNNNNNN¡¡¡þ ' _NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; SAVE LOGON REQUEST FLAG ; LD A,E LD (LOGRQ),A ; ; COMPUTE DISK DRIVER TABLE PTR ; CALL RETDVRT ;DRIVE IS STILL D ÿHNNNNNNNNNNNNNNNN¡¡¡þ -æ”NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ELSE LOG ON DRIVE ; PUSH IX ;SAVE REGS PUSH IY ; LD IX,(CUR_DDT) ;SET REGS LD IY,(CUR_DPB) ; ; ATTEMPT TO REAäÈÿ„NNNNNNNNNNNNNNNN¡¡¡þ ZêNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûK ; LD A,(IOPB + PB_STATO) ;RETURN ANY ERRORS ; ; DONE, RESTORE & RETURN ; RW_RET: OR A,A ;SET RESULT STATUS FLAG POP©ÿÂNNNNNNNNNNNNNNNN¡¡¡þ yåNNNNNNNNNNNNNNNNNNNNNN¡¡¡û THE DISK INTO CPM_DMA, ; WITHOUT BLOCKING. ; ENTRY- (CPM_DSK)= DISK # TO READ FROM ; (CPM_TRK)= TRACK # TO READ FROM ; (Cæ±ÿùNNNNNNNNNNNNNNNNN¡¡¡þ •]NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûROM ; (CPM_DMA)= XFER ADDRESS ; IX= DDT PTR ; IY= DPB PTR ; EXIT - (IOPB.PB_STATO)= 0: OK, /0: ERROR ; ;***************Ø ÿáNNNNNNNNNNNNNNNN¡¡¡þ ?ûNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û*************************************************************************** ; ; BUF_FLSH FLUSHES THE BUFFER DATA IF MODIFIED “_ÿäNNNNNNNNNNNNNNNNN¡¡¡þ Ð0NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD (BUF_MOD),A RET ;**************************************************************************** ; ; BUF_WR PERFORMS TðÿBNNNNNNNNNNNNNNNN¡¡¡þ "öªNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPTR ; IY= DPB PTR ; EXIT - (IOPB.PB_STATO)= 0: OK, /0: ERROR ; ;***********************************************************qÿäNNNNNNNNNNNNNNNNN¡¡¡þ (aNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIN C REGISTER ; ; IF DRIVE ERROR THEN RETURN (HL= 0) ; RET NZ ; ; ELSE SAVE PTR ; LD (CUR_DDT),HL ; ; FETCH FL‡nÿáNNNNNNNNNNNNNNNN¡¡¡þ .³ÇNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûD ID SECTOR ; CALL BUF_FLSH ;FLUSH BUFFER 1ST JR NZ,LOGERR ; CALL DISKLOG JR NZ,LOGERR ; ; IF NO ID SECTOR THEN US�³þHNNNNNNNNNNNNNNNNN¡¡¡þ iÛNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û IY POP IX ; RET ;**************************************************************************** ; ; CPM_WR PERFORMS T‡ÌÿÈNNNNNNNNNNNNNNNNN¡¡¡þ JÔNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPM_SEC)= SECTOR # TO READ FROM ; (CPM_DMA)= XFER ADDRESS ; EXIT - (IOPB.PB_STATO)= 0: OK, /0: ERROR ; ;********************ê5ÿäNNNNNNNNNNNNNNNNN¡¡¡þ ¦lNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************************* ; CPM_RD: ; LD HL,LL_READ ; ; COMMON CODE ; CPM_RW: PUS òÿrNNNNNNNNNNNNNNNN¡¡¡þ  ÊNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ENTRY- (BUF_DSK)= DISK # TO WRITE TO ; (BUF_TRK)= TRACK # TO WRITE TO ; (BUF_PSEC)= SECTOR # TO WRITE TO ; (BUF_DDT)= DD0'ÿäNNNNNNNNNNNNNNNN¡¡¡þ ãNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHE PHYSICAL WRITE FROM BLKBUF TO THE HOST DISK. ; ENTRY- (BUF_DSK)= DISK # TO WRITE TO ; (BUF_TRK)= TRACK # TO WRITE TO ; (ªÿNNNNNNNNNNNNNNNN¡¡¡þ #Å›NNNNNNNNNNNNNNNNNNNNNN¡¡¡û***************** ; BUF_RD: ; LD HL,LL_READ ; ; COMMON CODE ; BUF_RW: PUSH HL LD HL,BUF_TRK JP RD_WR ;++++++0ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ )*PNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAGS ; INC HL ;EXE +1 INC HL ;FLGS LD C,(HL) ; ; FETCH DISK PARAMETER BLOCK ADDRESS ; INC HL ;DRV INC HL ;DPBNœÿòNNNNNNNNNNNNNNNNN¡¡¡þ /€öNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE DEFAULT DPB ; (NOTE: CONTROLLER HAS SET IT'S DISK DEFAULTS IN DEFBFR IN ALL CASES) ; LD A,(IOPB + PB_ST2O) CP A,-1 ;-1:+æÿ„NNNNNNNNNNNNNNNN¡¡¡þ <ˆNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHE PHYSICAL WRITE FROM CPM_DMA TO THE DISK. ; ENTRY- (CPM_DSK)= DISK # TO WRITE TO ; (CPM_TRK)= TRACK # TO WRITE TO ; (CPM_2MÿBNNNNNNNNNNNNNNNN¡¡¡þ ÓCNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û******************************************************** ; CPM_RD2: ; ; SET UP PTRS ; PUSH IX PUSH IY LD IX,(CUR_DD[ÿ!NNNNNNNNNNNNNNNN¡¡¡þ ó?NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûH HL LD HL,CPM_TRK ; ; FALL INTO COMMON XFER CODE ; ;***************************************************************«˜ÿòNNNNNNNNNNNNNNNNN¡¡¡þ ôNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT PTR ; (BUF_DPB)= DPB PTR ; EXIT - (IOPB.PB_STATO)= 0: OK, /0: ERROR ; ;**************************************************_àÿÂNNNNNNNNNNNNNNNN¡¡¡þ ¶RNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBUF_SEC)= SECTOR # TO WRITE TO ; IX= DDT PTR ; IY= DPB PTR ; EXIT - (IOPB.PB_STATO)= 0: OK, /0: ERROR ; ;****************tÿ�NNNNNNNNNNNNNNNNN¡¡¡þ $\ NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SELECT DRIVE FUNCTION ; LOG-ON - SET DISK PARAMETEcþBNNNNNNNNNNNNNNNN¡¡¡þ *NNNNNNNNNNNNNNNNNNNNNN¡¡¡û_PTR LD E,(HL) INC HL LD D,(HL) LD (CUR_DPB),DE ; ; FETCH DISK PARAMETER HEADER ADDRESS ; INC HL ;DPH PTR LD EOùÿHNNNNNNNNNNNNNNNNN¡¡¡þ 0“»NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNONE, 0:JADE, 1:DESCRIPTOR, 2: EXTENDED, ; 3: PARTITIONED, ID JR Z,LGDEF ; ; ELSE IF OLD FORMATS THEN PAD DPB DATA ã.ÿHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÎNNNNNý€Ë�™‚fƒ4„…Ð…Ÿ†m‡;ˆ ‰×‰¤Šr‹?Œ �Û�ªŽx�F�‘㑱’“L”•é•¶–„—R˜ ™î™¼šŠ›Xœ&�ô�ž‘Ÿ` .¡û¡É¢˜£e¤3¥¦Ï¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ ’/NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û; CP A,3 JR NC,IDOK ; LD HL,BLKBUF + ID_PSHO ;FILL DATA WITH 0S LD B,ID_FLGO - ID_PSHO ; PADIDL: LD (HL),0 INC HL šÒÿ“NNNNNNNNNNNNNNNNN¡¡¡þ 8‰NNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡û; LGDEF: BIT 4,(IX + DDT_FLG) JR Z,LGCKFD ; ; ELSE USE HARD DISK DEFAULTS ; CALL TRNONE ; NO XLATE LD HL,HDPBK ; mcþrNNNNNNNNNNNNNNNN¡¡¡þ  ×BNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; ; ELSE PURGE BUFFER ; LD (BUF_ACT),A ; HOME2: ; ; JUST SET TRACK TO 0 ; LD BC,0 ; ; FALL INTO SET TRACK ;£þ!NNNNNNNNNNNNNNNN¡¡¡þ ÷>NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û******************************************************************** ; SETDMA: LD (CPM_DMA),BC ; LD A,(BUF_DMAB) ;FETCH BANˆ°ÿòNNNNNNNNNNNNNNNN¡¡¡þ õNNNNNNNNNNNNNNNNNNNNNN¡¡¡û RET ; ; ; CONVERT FROM CP/M'S LOGICAL SECTOR {0..N-1} TO PHYSICAL SECTOR {1..N} ; NOTRAN: LD HL,1 ADD HL,BC RETÆ4þHNNNNNNNNNNNNNNNNN¡¡¡þ ²SNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; LL_READ: ; ; ENABLE UPLOAD ; XOR A,A LD (IOPB + PaÿòNNNNNNNNNNNNNNNN¡¡¡þ %X NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTOR {0:128, 1:256, 2:512, 3:1024} LD HL,128 ;START WITH 128 BYTES ; AND A,3 ;LIMIT TO 1024-BYTE SECTORS ; JR Z,LL_WR2 ³§ÿçNNNNNNNNNNNNNNNNN¡¡¡þ +{NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+ PB_SECO),HL ; ; SET PHYSICAL DRIVE ; LL_DO: LD A,(IX + DDT_DRV) LD (IOPB + PB_DRVO),A ; ; FETCH DRIVER VECTOR & EXŽüÿçNNNNNNNNNNNNNNNNN¡¡¡þ Ç|NNNNNNNNNNNNNNNNNNNNNN¡¡¡û DJNZ PADIDL ; ; ELSE XFER ID SECTOR DATA TO TABLES ; IDOK: CALL TRNONE ;ASSUME NO TRANSLATION ; ; IF HARD DISK OR DO€€ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ (·NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; XFER DATA TO TABLES ; SEL2: LD DE,(CUR_DPB) ; USE DEFAULT TABLE LD BC,DPB_SZ LDIR ; LD A,(HL) ;HEADS VALUE JR �¢ÿ“NNNNNNNNNNNNNNNN¡¡¡þ ‚NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;**************************************************************************** ; ; SET TRACK # ; ENTRY- BC= TRACK # ; �þrNNNNNNNNNNNNNNNN¡¡¡þ n©NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûK ADDRESS SET BY COLD START LD (CPM_DMAB),A ; ; DONE ; RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++%þrNNNNNNNNNNNNNNNN¡¡¡þ M¦NNNNNNNNNNNNNNNNNNNNNN¡¡¡û SUBTTL DISK SUPPORT ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; LOGON DT¾ÿdNNNNNNNNNNNNNNNNN¡¡¡þ  §øNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûB_FLGO),A ; ; DISABLE DOWNLOAD ; LD HL,0 LD (IOPB + PB_BCNTO),HL ; ; PASS READ SECTOR COMMAND ; LD A,PB_READC -ÿBNNNNNNNNNNNNNNNN¡¡¡þ & ^NNNNNNNNNNNNNNNNNNNNNN¡¡¡û;IF SHIFT_FACTOR == 0 THEN DONE ; LL_WR3: ADD HL,HL ;DOUBLE COUNT DEC A JP NZ,LL_WR3 ; LL_WR2: LD (IOPB + PB_BCNTO),HL #ÇÿùNNNNNNNNNNNNNNNN¡¡¡þ ,â•NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûECUTE DISK DRIVER ; LL_OPLP: LD HL,LL_OPRET ;PUT RETURN ADDRESS ON STACK PUSH HL ; LD L,(IX + DDT_EXE) ;FETCH DRIVER A¬­ÿÉNNNNNNNNNNNNNNNN¡¡¡þ ôMNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûUBLE DENSITY THEN NO TRANSLATION ; LD A,(BLKBUF + ID_FLGO) AND A,[1 SHL DF_DTDB] OR [1 SHL DF_HARDB] ; ; ELSE SET TRANSòÿNNNNNNNNNNNNNNNNN¡¡¡þ  †NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSEL1 ; ; ; USE 8" FLOPPY DEFAULTS ; LGCKFD: CALL TR8 LD HL,SD8PBK JR SEL2 ; ; ERROR EXIT ; LOGERR: LD HL,0 ; F÷ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ ± NNNNNNNNNNNNNNNNNNNNNN¡¡¡û;**************************************************************************** ; SETTRK: LD (CPM_TRK),BC RET ;********€ûþ9NNNNNNNNNNNNNNNN¡¡¡þ ]˜NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++ ; ; SECTOR TRANSLATION FUNCTION ; ENTRY- DE= 0: NO XLATE, ELSE PTR TO XLATE TABLE ; BC= SECTOR # TO é ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ ~—NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûISK FUNCTION ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ªþNNNNNNNNNNNNNNNNNN¡¡¡þ !”ÉNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûJP LL_RW ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; LOW LEVEL WRITE ; ENTRY- IX= h¡ÿ�NNNNNNNNNNNNNNNNN¡¡¡þ '>oNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; PASS WRITE COMMAND ; LD A,PB_WRITC ; ; FALL INTO COMMON CODE ; ;+++++++++++++++++++++++++++++++++++++++++++�ÿÉNNNNNNNNNNNNNNNN¡¡¡þ -ѤNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDDRESS FROM TABLE LD H,(IX + DDT_EXE + 1) JP (HL) ; ; DRIVER RETURNS HERE ; LL_OPRET: ; ; IF NO ERRORS THEN RETURN’wÿœNNNNNNNNNNNNNNNN¡¡¡þ mÚNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûLATION ; CALL Z,TR8 ; ; XFER DISK DATA TO DPB ; LD DE,(CUR_DPB) ;GET ADDR OF DPB LD HL,BLKBUF + ID_SPTO LD BC,DPB˜þBNNNNNNNNNNNNNNNN¡¡¡þ  NÕNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; DONE ; LGDONE: POP IY ;RESTORE REGS POP IX RET ;*****************************************************************ü1ÿòNNNNNNNNNNNNNNNNN¡¡¡þ ¢mNNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************************************************** ; ; SET SECTOR ; ENTRY- BC= SECTOR # ; ;**************1‡þ9NNNNNNNNNNNNNNNN¡¡¡þ ËNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûXLATE ; EXIT - HL= XLATED SECTOR OR BC + 1 ; BC= UNCHANGED ; A, DE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++$ÿ�NNNNNNNNNNNNNNNNN¡¡¡þ çNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DISKLOG: ; ; SET UP READ IOPB ; LD A,(BUF_DMAB) LD (LOGIOPB + PB_DMAXO),A ; LD HL,LOGIOPB LD DE,IOPB LD BC,PB_S¦ÿòNNNNNNNNNNNNNNNN¡¡¡þ "ÁšNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDDT PTR ; IY= DPB PTR ; EXIT - IOPB.PB_STATO, A= STATUS ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++!ÊÿäNNNNNNNNNNNNNNNNN¡¡¡þ (.QNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++ ; ; COMMON IOPB EXECUTER ; ENTRY- A= COMMAND ; IX= DRIVE TABLE PTR ; IY= DPB PTR ; ;+2UÿÎNNNNNNNNNNNNNNNNN¡¡¡þ .„÷NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ZF ; RET Z ;IF NO_ERROR THEN RETURN ; ; PRINT ERROR ; IOPBDMP: LD A,(BUF_DMAB) ;SET BANK LD E,A ; LD HL,IOPB šÿ“NNNNNNNNNNNNNNNNN¡¡¡þ ^ëNNNNNNNNNNNNNNNNNNNNNN¡¡¡û_SZ LDIR ; ; XFER DISK PHYSICAL DATA TO TABLE ; LD A,(BLKBUF + ID_HEADS) ; SEL1: LD (IX + DDT_HDS),A ; ; RETURN Dóÿ“NNNNNNNNNNNNNNNNN¡¡¡þ  }äNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û*********** ; ; HOME DRIVE - TREAT AS SEEK TRK 0 ; EXIT - BC= 0 ; ;******************************************************ŠÙÿòNNNNNNNNNNNNNNNNN¡¡¡þ ‘\NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************************** ; SETSEC: LD (CPM_SEC),BC RET ;***********************¯VÿìNNNNNNNNNNNNNNNN¡¡¡þ ;úNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++ ; SECTRN: ; ; IF NO TRANSLATION THEN RETURN SECTOR++ ; LD A,D ;IF TABLE ADDR = 0 THEN NO TÁÑÿrNNNNNNNNNNNNNNNN¡¡¡þ Ô1NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTATO LDIR ; ; EXECUTE WITHOUT COMPENSATION ; JR LL_DO ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++¡<ÿBNNNNNNNNNNNNNNNN¡¡¡þ #ò«NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++ ; LL_WRIT: ; ; IF STILL PROTECTED THEN ERROR ; LD A,(WR_PROT) OR A,A JR NZ,DO_ERR ; ; INHIBIT UPLO׃ÿäNNNNNNNNNNNNNNNNN¡¡¡þ )`NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; LL_RW: LD (IOPB + PB_CMDO),A ; ; OFFSET SECTýFÿ“NNNNNNNNNNNNNNNNN¡¡¡þ /·ÆNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLD A,MF_DIOB ;USE DISPLAY IOPB DATA FUNCTION CALL XMROM ; ; QUERY USER FOR OPTION ; LD HL,DSKEB CALL EDITOR ; ; GÜ£þrNNNNNNNNNNNNNNNN¡¡¡þ  ¸NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRIVE TABLE PTR ; LD HL,(CUR_DPH) XOR A,A ;RETURN NO-ERROR JR LGDONE ; ; ; IF NOT HARD DISK THEN GO DO FLOPPY TEST ,’ÿœNNNNNNNNNNNNNNNN¡¡¡þ  äsNNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************** ; HOME: ; ; IF PENDING WRITE (BUFFER DIRTY) THEN IGNORE ; LD A,(BUF_MOD) OR A,A JR NZ,HOME2 ,šÿNNNNNNNNNNNNNNNN¡¡¡þ ÄNNNNNNNNNNNNNNNNNNNNNN¡¡¡û***************************************************** ; ; SET TRANSFER ADDR ; ENTRY- BC= ADDRESS ; EXIT - A= ? ; ;********œ:ÿäNNNNNNNNNNNNNNNNN¡¡¡þ +ÄNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRANSLATION OR A,E JP Z,NOTRAN ; ; ELSE CALCULATE NEW SECTOR FROM TABLE ; EX DE,HL ADD HL,BC LD L,(HL) ; LD H,0Ê€ÿ„NNNNNNNNNNNNNNNN¡¡¡þ �bNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++ ; ; LOW LEVEL READ ; ENTRY- IX= DDT PTR ; IY= DPB PTR ; EXIT - IOPB.PB_STATO, A= STATUS ; ;+++++++++++dIÿÎNNNNNNNNNNNNNNNNN¡¡¡þ $kÿHNNNNNNNNNNNNNNNNN¡¡¡þ ó×NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNTBL: DW RETVERS ;0:RETURN VERSION # DW RETDVRTF ;1:RETURN DISK PHYSICAL CONFIGURATION TABLE PTR MAXFUNCS EQU ($ - BFUNTBLtÿòNNNNNNNNNNNNNNNN¡¡¡þ %‰NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++ ; RETDVRTF: ; ; ADJUST REGISTER ; LD C,E ; ; FALL INTO LOCAL ENTRY ; ;++++++++++++++++++++++++++++++++++++ÿ'NNNNNNNNNNNNNNNNN¡¡¡þ +:†NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûBUF_DMAB) LD E,A ; ; RETURN NO ERROR ; XOR A,A RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++UÿnNNNNNNNNNNNNNNNNN¡¡¡þ †øNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR Z,LL_OPLP ; ; ELSE IF ABORT THEN DO WARM BOOT ; CP A,'A' ;IF ABORT THEN RE-BOOT JP Z,0 ; ; ELSE IF DEBUGGER THENÀ,ÿ'NNNNNNNNNNNNNNNNN¡¡¡þ i3NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD (HL),E INC HL LD (HL),D RET ;**************************************************************************** ; ;j ÿÈNNNNNNNNNNNNNNNN¡¡¡þ ÕNNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡ûRESULTS STATUS ; LD A,(IOPB + PB_STATO) OR A,A RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++šðþrNNNNNNNNNNNNNNNN¡¡¡þ /-NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûROM TRACK BIT 0 ; LD HL,(IOPB + PB_TRKO) PUSH HL ;SAVE ORIGINAL DATA ; LD A,(IOPB + PB_SECO + 1) ADD A,A ;BIT 15 -Ô9ÿ NNNNNNNNNNNNNNNN¡¡¡þ  "NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOFUNC: ; ; IF FUNCTION # NOT IN TABLE THEN RETURN -1 ; LD A,C CP A,MAXFUNCS LD A,-1 RET NC ; ; ELSE COMPUTE TABà ÿòNNNNNNNNNNNNNNNNN¡¡¡þ æ|NNNNNNNNNNNNNNNNNNNNNN¡¡¡û) / 2 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN BIOS VERSION # FUNCTION #0¼lÿBNNNNNNNNNNNNNNNN¡¡¡þ &LÚNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++ ; ; RETURN DRIVER TABLE PTR FUNCTION ; ENTRY- C= DRIVE # ; EXIT - E:HL= DRIVER TABL7ÿùNNNNNNNNNNNNNNNN¡¡¡þ ,£NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++ ; ; GET BANK NUMBER FUNCTION ; EXIT - A= BANK # ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++"Jÿ NNNNNNNNNNNNNNNN¡¡¡þ µÉNNNNNNNNNNNNNNNNNNNNNN¡¡¡û EXECUTE IT ; CP A,'M' JP Z,MR_BRK ; ; ELSE IF IGNORE THEN RETURN NO ERROR ; SUB A,'I' ;IF IGNORE THEN RETURN NO ER”¨ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ ZNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û SET NO SECTOR TRANSLATION PROCEDURE ; EXIT - HL, DE= ? ; ;******************************************************************¼áÿÈNNNNNNNNNNNNNNNNN¡¡¡þ ð¤NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++ ; ; HARD DISK DRIVER FUNCTION ; ENTRY- IX= DRIVER TABLE PTR ; EXIT - A= 0: OK; /0: ERROR ; ;+++++++++++++++++«—þrNNNNNNNNNNNNNNNN¡¡¡þ NNNNNNNNNNNNNNNNNNNNNN¡¡¡û> BIT_BUCKET ; SRL H RR L RRA ;TRK BIT 0 -> SECTOR BIT 15 LD (IOPB + PB_SECO + 1),A ; LD (IOPB + PB_TRKO),HL ;TRA”7ÿBNNNNNNNNNNNNNNNN¡¡¡þ ?NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûLE ENTRY ; PUSH HL ;SAVE POSSIBLE DATA ; LD HL,BFUNTBL LD A,C ADD A,A ADD A,L LD L,A LD A,0 ADC A,H LD H,A ÁÞÿnNNNNNNNNNNNNNNNNN¡¡¡þ !ÕMNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; EXIT - HL= VERSION # IN BINARY {0.00,..655.35} ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++–]ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ 'ëNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE BASE PTR ; NZ= ILLEGAL DRIVE (HL= 0) ; A, B, C= ? ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++à ÿÉNNNNNNNNNNNNNNNN¡¡¡þ -� NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++ ; GETBNK: LD A,MF_GBNK JP MR_FUN SUBTTL NON-DISK PROCEDURES ;*******************************Hþÿ„NNNNNNNNNNNNNNNN¡¡¡þ ,^NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûROR RET Z ; ; ELSE RETURN ERROR TO BDOS ; LD A,-1 ;RETURN -1 TO BDOS OR A,A RET ; ; ; DISPLAY WRITE PROTECT E£­ÿÂNNNNNNNNNNNNNNNN¡¡¡þ QNNNNNNNNNNNNNNNNNNNNNN¡¡¡û********** ; TRNONE: LD DE,0 JR SETTR SUBTTL HARD DISK ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++lˆÿùNNNNNNNNNNNNNNNNN¡¡¡þ ãéNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; HDEXEC: EQU XPRIM SUBTTL JADE FLOPPY DRIVER ROUTINES ;+++ÔkÿBNNNNNNNNNNNNNNNN¡¡¡þ IONNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCK = RESIDUAL ; ; EXECUTE THE IOPB ; CALL XPRIM ; ; RESTORE THE MODIFIED IOPB SO RETRY WILL WORK ; POP HL ;TRACKÓÿíNNNNNNNNNNNNNNNNN¡¡¡þ ¦„NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û ; ; EXECUTE TABLE ADDRESS ; LD A,(HL) INC HL LD H,(HL) LD L,A ; EX (SP),HL ;PUT CALLER'S DATA IN HL, FUNCTION AóÿNNNNNNNNNNNNNNNN¡¡¡þ "€NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++ ; RETVERS: LD HL,VERSN XOR A,A ;RETURN NO ERROR RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++ŸöÿäNNNNNNNNNNNNNNNNN¡¡¡þ (oÕNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û+++++++++ ; RETDVRT: ; ; ASSUME DRIVE 0 ; LD HL,DDT_0 ;START AT 1ST TABLE ; ; IF DRIVE == 0 THEN ALREADY THERE ; üãþNNNNNNNNNNNNNNNNNN¡¡¡þ .ÅsNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û******************************************** ; ; NEWLINE PROCEDURE ; ;******************************************************ʾÿ“NNNNNNNNNNNNNNNNN¡¡¡þ oNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRROR MESSAGE ; DO_ERR: LD HL,WP_ERM CALL EDITOR JR IOPBDMP ;*********************************************************ñ:ÿ“NNNNNNNNNNNNNNNNN¡¡¡þ <`NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û++++++++++++++++++++++++ ; ; EXECUTE THE IOPB PRIMITIVE ; EXIT - A= 0: OK, /0: ERROR ; ;+++++++++++++++++++++++++++++++++++^yÿäNNNNNNNNNNNNNNNNN¡¡¡þ ÐØNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; JADE 8" FLOPPY DISK DRIVER FUNCTION ; ENTRY- IY�æÿüNNNNNNNNNNNNNNNN¡¡¡þ z~NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD (IOPB + PB_TRKO),HL ; LD HL,IOPB + PB_SECO +1 ;CLEAR BIT 15 RES 7,(HL) ; ; DONE ; RET SUBTTL BIOS FUNCTIhÿòNNNNNNNNNNNNNNNN¡¡¡þ •µNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDDR ON RET ; STACK, EXECUTE FUNCTION ADDRESS ON STACK ;################################################################MÖÿáNNNNNNNNNNNNNNNN¡¡¡þ #³/NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++ ; ; RETURN DRIVER TABLE PTR FUNCTION #1 ; ENTRY- E= DRIVE # ; EXIT - E:HL= DRIVER TABLE BASE PTR ; Nà÷ÿ­NNNNNNNNNNNNNNNNN¡¡¡þ )\äNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD A,C OR A,A RET Z ; ; ELSE IF ILLEGAL DRIVE THEN RETURN ERROR ; CP A,NDRVS JR C,RETDV2 ; LD HL,0 OR A,A ;SlÿÉNNNNNNNNNNNNNNNNN¡¡¡þ /öBNNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************* ; CRLF: LD C,CR CALL COC LD C,LF JP COC IF INTCPTS SUBTTL ADDITIONAL FUNCTIONS TO SUPPORT�€ÿ NNNNNNNNNNNNNNNN¡¡¡þ JœÿrNNNNNNNNNNNNNNNN¡¡¡þ ÷ÖNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; ;**************************************************************************** ; LO: LD A,MF_LO JP XMROM ;+++++++íÿ'NNNNNNNNNNNNNNNNN¡¡¡þ $ˆNNNNNNNNNNNNNNNNNNNNNN¡¡¡û################################ ; ; 3740 SECTOR TRANSLATION TABLE ; **** CP/M SINGLE DENSITY **** ; ;#####################ݽÿ�NNNNNNNNNNNNNNNNN¡¡¡þ *>‡NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLOGON ; 1..3 PARTITION # {0,..7} ; 4 1: HARD DISK DRIVE ; DDT_DRV DS 1 ;PHYSICAL DRIVE # DDT_DPB DS 2 ;DPB ADDRES`-þ$NNNNNNNNNNNNNNNNN¡¡¡þ 0Ò?NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûO #DADD,#PD,#FLG,#DPB,#DPH,#HDS,#SOF DW #DADD ;DRIVER EXECUTION ADDR DB #FLG ;FLAGS DB #PD ;MONITOR PHYSICAL DRIVE # ®þNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�NNNNNNNNN�Î�œ‚iƒ6„…Ñ…Ÿ†m‡;ˆ ‰Ö‰£Šq‹>Œ �Ú�¨Žv�C�‘ß‘­’z“H”•䕱–€—N˜™ê™¸š†›Tœ!�ï�¼žŠŸX &¡ô¡Á¢�£\¤+¥ù¥Ç¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þHwNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûDW #DPB ;DISK PARAMETER BLOCK PTR DW #DPH ;DISK PARAMETER HEADER PTR DB #HDS ;HEADS DW #SOF ;SECTOR OFFSET ; ENDM ÂÿíNNNNNNNNNNNNNNNNN¡¡¡þâÑNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEC,5,12H,D5DPB,D5DPH,4,8000H ENDIF ;############################################################################ ; ; ™ÖÿrNNNNNNNNNNNNNNNN¡¡¡þ NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;DISK SIZE -1 DW 63 ;DIRECTORY MAX DB 11000000B ;ALLOC 0 DB 0 ;ALLOC 1 DW 16 ;CHECK SIZE DW 2 ;TRACK OFFSET DBÕRÿœNNNNNNNNNNNNNNNN¡¡¡þ-fNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û;ALLOCATION 1 (AL1) DW 0 ;CHECK SIZE (CKS) DW 2 ;TRACK OFFSET (OFF) DB 1 ;PHYSICAL RECORD SHIFT FACTOR (PSH) DBÓšÿùNNNNNNNNNNNNNNNN¡¡¡þ­NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û IF NO XLATE) DW 0 ;;SCRATCH AREA DW 0 ;;" DW 0 ;;" DW DIRBF ;;DIRECTORY BUFFER PTR DW D#D(DD)DPB ;;DRIVE PARAMETEénÿÉNNNNNNNNNNNNNNNNN¡¡¡þh NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDW BLKBUF ;DMA DB 0 ;BANK DW 0 ;COUNT ; WR_PROT DB -1 ;/0: WRITE PROTECTION ENABLED ; ; LAST OF INITIALIZED CODE RâWÿNNNNNNNNNNNNNNNN¡¡¡þ%‚UNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDS 1 ;FLAGS BUF_DMA DS 2 BUF_DMAB DS 1 ;BANK # ; ; ; BLOCKING BUFFER MAINTENANCE ; BUF_PSEC DS 2 ;BUFFER PHYSICAL SECTO�‹ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ+¡ZNNNNNNNNNNNNNNNNNNNNNN¡¡¡û: DS 2 ;LAST UNALLOC SECTOR ;############################################################################ ; ; VARIABLES-³ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ$NNNNNNNNNNNNNNNNNNNNNN¡¡¡û IF BOOT = 10H ; A DDT_0: ALLDRV HDEXEC,4,10H,D0DPB,D0DPH,4,0 ; B DDT_1: ALLDRV HDEXEC,4,12H,D1DPB,D1DPH,4,8000H ; Á¸ÿÈNNNNNNNNNNNNNNNNN¡¡¡þòïNNNNNNNNNNNNNNNNNNNNNN¡¡¡û MESSAGES ; ;############################################################################ ; MSGLE: DM CR,LF,'LOAD ERROR' ;Ì;ÿNNNNNNNNNNNNNNNN¡¡¡þXINNNNNNNNNNNNNNNNNNNNNN¡¡¡û 0 ;PHYSICAL RECORD SHIFT FACTOR DB 0 ;PHYSICAL RECORD MASK DW 0 ;LOGICAL DRIVE SECTOR OFFSET ; ; DEFAULT DISK PHYSIC{©ÿòNNNNNNNNNNNNNNNN¡¡¡þ´ñNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û 1 ;PHYSICAL RECORD MASK (PRM) DW 0 ;LOGICAL DRIVE SECTOR OFFSET (SOF) ; ; ; DB 4 ;HEADS ;######################a9ÿrNNNNNNNNNNNNNNNN¡¡¡þ—þNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûR BLK PTR IF ((DD - 1) <= NDHD) AND ((DD - 1) >= STHD) DW 0 ;;NO CHECKS ON HARD DISK ELSE DW D#D(DD)CHK ;;DRIVE DISz8ÿäNNNNNNNNNNNNNNNNN¡¡¡þ } NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEAD FROM DISK ; BIOSND EQU $ SUBTTL UNINITIALIZED DATA AREA ;############################################################˜ŽþBNNNNNNNNNNNNNNNN¡¡¡þ&×NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR BUF_ACT DS 1 ;0: BUFFER FLUSHED, /0: DATA IN BUFFER BUF_MOD DS 1 ;0: BUFFER CLEAN, /0: BUFFER DIRTY (MODIFIED) ; BUF_DDT DjÿùNNNNNNNNNNNNNNNN¡¡¡þ,8ÍNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ;############################################################################ ; CUR_DPB DS 2 ;DRIVE TABLE PTR CUR_DDT DS<šÿòNNNNNNNNNNNNNNNN¡¡¡þ.NNNNNNNNNNNNNNNNNNNNNN¡¡¡û C DDT_2: ALLDRV HDEXEC,5,10H,D2DPB,D2DPH,4,0 ; D DDT_3: ALLDRV HDEXEC,5,12H,D3DPB,D3DPH,4,8000H ; E DDT_4: ALLDRV FD8ž5þHNNNNNNNNNNNNNNNNN¡¡¡þ ÁÞNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DSKEB: DM CR,LF,'Abort, Ignore, Retry, (BDOS) - ' ; WP_ERM: DM CR,LF,'W-PROT Error!' ; IF INTCPTS ISCMSG: DM CR,LF,'ILÿNNNNNNNNNNNNNNNNN¡¡¡þkxNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAL PARAMETERS ; DB 1 ;HEADS ;############################################################################ ; ; DEFAULT,‹ÿùNNNNNNNNNNNNNNNN¡¡¡þ‡ÀNNNNNNNNNNNNNNNNNNNNNN¡¡¡û###################################################### ; ; DRIVE PARAMETER HEADER AREA ; 1 PER DRIVE ; ;###################ª—ÿáNNNNNNNNNNNNNNNN¡¡¡þ¤ÏNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûK CHECKSUMS ARRAY PTR ENDIF DW D#D(DD)ALL ;;DRIVE CLUSTER ALLOCATION BIT MAP PTR LIST OFF ENDM ; ; DEFINE THE DATAayÿçNNNNNNNNNNNNNNNNN¡¡¡þ!N‘NNNNNNNNNNNNNNNNNNNNNN¡¡¡û################ ; ; THE FOLLOWING DATA MUST RESIDE IN THIS ORDER TO MATCH THE IOPB DATA ; ;##############################*‘ÿHNNNNNNNNNNNNNNNNN¡¡¡þ'ä7NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS 2 ;BUFFER DDT PTR BUF_DPB DS 2 ;BUFFER DPB PTR ; RSFLAG: DS 1 ;0: NO PREREAD REQ'D, /0: PREREAD REQ'D READOP: DS 1 ;0: WRILµÿäNNNNNNNNNNNNNNNN¡¡¡þ- üNNNNNNNNNNNNNNNNNNNNNN¡¡¡û 2 ;DRIVE DRIVER TABLE BASE ADDRESS PTR CUR_DPH DS 2 ;DPH PTR ; LOGRQ: DS 1 ;LOG ON REQUEST REG. ;######################� ÿÂNNNNNNNNNNNNNNNN¡¡¡þ·‚NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEXEC,0,0,D4DPB,D4DPH,1,0 ; F DDT_5: ALLDRV FD8EXEC,1,0,D5DPB,D5DPH,1,0 ENDIF IF BOOT = 3 ; A DDT_0: ALLDRV FD8EXi/ÿBNNNNNNNNNNNNNNNN¡¡¡þ ”�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL SYS CALL, #= ' ENDIF ;############################################################################ ; ; DEFAULT 8" F܃ÿùNNNNNNNNNNNNNNNNN¡¡¡þx5NNNNNNNNNNNNNNNNNNNNNN¡¡¡û 8" HARD DISK PARAMETER BLOCK ; ;############################################################################ ; HDPBK: DW 12¹‘þBNNNNNNNNNNNNNNNN¡¡¡þÒ“NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û######################################################### ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@õ»ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ=XNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; DD DL 1 REPT NDRVS LIST OFF ALLDPH 0123456789ABCDEF DD DL DD + 1 LIST ON ENDM ;############################0ÿòNNNNNNNNNNNNNNNN¡¡¡þ"ÂNNNNNNNNNNNNNNNNNNNNNN¡¡¡û############################################## ; ; CP/M IOPB OVERLAY ; CPM_DSK DS 1 ;LOGICAL DRIVE CPM_TRK DS 2 ;LOGICAL ’Îÿ$NNNNNNNNNNNNNNNNN¡¡¡þ(ô NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûTE OPERATION, 1: READ OPERATION WRTYPE: DS 1 ;WRITE OPERATION TYPE FROM BDOS: ; 0: WRITE TO ALLOCATED (USED) BLOCK (PREREADHhÿBNNNNNNNNNNNNNNNN¡¡¡þ.^¯NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û###################################################### ; ; DRIVE ALLOCATION AREAS ; ;#####################################�úÿHNNNNNNNNNNNNNNNNN¡¡¡þ„³NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûEC,0,0,D0DPB,D0DPH,1,0 ; B DDT_1: ALLDRV FD8EXEC,1,0,D1DPB,D1DPH,1,0 ; C DDT_2: ALLDRV HDEXEC,4,10H,D2DPB,D2DPH,4,0 ; U«ÿäNNNNNNNNNNNNNNNNN¡¡¡þ §¼NNNNNNNNNNNNNNNNNNNNN!ö¡¡¡ûLOPPY DISK PARAMETER BLOCK ; IBM 3740 SINGLE DENSITY FORMAT ; ;##############################################################.ÿINNNNNNNNNNNNNNNNN¡¡¡þKNNNNNNNNNNNNNNNNNNNNNN¡¡¡û8 ;SECTORS PER TRACK (LOGICAL) (SPT) DB 5 ;BLOCK SHIFT FACTOR (BSH) DB 31 ;BLOCK MASK (BLM) DB 1 ;NULL MASK (EXM)�iÿâNNNNNNNNNNNNNNNN¡¡¡þá¢NNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡û@@@@@@@@@@@ ; ; GENERATE A DISK PARAMETER TABLE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@–üþrNNNNNNNNNNNNNNNN¡¡¡þiNNNNNNNNNNNNNNNNNNNNNN¡¡¡û################################################ ; ; LOGON IOPB OVERLAY ; ;#################################################8ÜÿÂNNNNNNNNNNNNNNNN¡¡¡þ#(óNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTRACK NUMBER CPM_SEC DS 2 ;LOGICAL SECTOR NUMBER DS 1 ;FLAGS CPM_DMA DS 2 ;XFER ADDR CPM_DMAB DS 1 ;XFER BANK ; ; ; BU”³ÿäNNNNNNNNNNNNNNNNN¡¡¡þ)Ç8NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û) ; 1: WRITE TO DIRECTORY (PREREAD & WRITE) ; 2: WRITE TO UNALLOCATED (UNUSED) BLOCK (NO ; PREREAD REQ'D) ; ; UNAMÎÿlNNNNNNNNNNNNNNNNN¡¡¡þ/mžNNNNNNNNNNNNNNNNNNNNNN¡¡¡û####################################### ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; b–ÿrNNNNNNNNNNNNNNNN¡¡¡þÑàNNNNNNNNNNNNNNNNNNNNNN¡¡¡û D DDT_3: ALLDRV HDEXEC,4,12H,D3DPB,D3DPH,4,8000H ; E DDT_4: ALLDRV HDEXEC,5,10H,D4DPB,D4DPH,4,0 ; F DDT_5: ALLDRV HDEXÖÿÎNNNNNNNNNNNNNNNNN¡¡¡þ >+NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û############## ; SD8PBK: DW 26 ;SECTORS PER TRACK DB 3 ;BLOCK SHIFT FACTOR DB 7 ;BLOCK MASK DB 0 ;NULL MASK DW 242üÿ!NNNNNNNNNNNNNNNN¡¡¡þWNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DW 1015 ;DISK SIZE (CLUSTERS -1) (DSM) DW 1152 / 2 ;DIRECTORY MAX (DRM) DB 0FFH ;ALLOCATION 0 (AL0) DB 10000000B #�ÿòNNNNNNNNNNNNNNNNN¡¡¡þñœNNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@ ; ALLDPH: MACRO #D LIST ON D#D(DD)DPH: ;DRIVE PARAMETER HEADER FOR DRIVE #D(DD) DW 0 ;;SECTOR TRAN TBL (OR 0>nÿòNNNNNNNNNNNNNNNN¡¡¡þ[:NNNNNNNNNNNNNNNNNNNNNN¡¡¡û########################### ; LOGIOPB: DB PB_LOGC ;COMMAND DB 0 ;DRIVE DW 0 ;TRACK DW ID_SECT ;SECTOR DB 0 ;FLAGS ÜüÿNNNNNNNNNNNNNNNNN¡¡¡þ$±dNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFFER IOPB OVERLAY ; BUF_DSK DS 1 ;BUFFER DISK NUMBER BUF_TRK DS 2 ;BUFFER TRACK NUMBER BUF_SEC DS 2 ;BUFFER SECTOR NUMBER H*ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ*’kNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û_CNT: DS 1 ;# SECTORS REMAINING IN BLOCK (CLUSTER) UNA_DSK: DS 1 ;LAST UNALLOC DISK UNA_TRK: DS 2 ;LAST UNALLOC TRACK UNA_SECpÿÉNNNNNNNNNNNNNNNNN¡¡¡þ0~ÓNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûMACRO TO DEFINE THE DRIVE ALLOCATION & CHECKSUMS AREA ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ZáþHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNý€Ë�˜‚eƒ2„…Î…œ†j‡8ˆ‰Ó‰ Šn‹<Œ �Ø�§Žu�C�‘Þ‘¬’z“H”•ã•°–—M˜™ê™¸š†›Tœ"�ò�ÀžŽŸ] +¡ø¡Æ¢”£b¤0¥þ¥Ì¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þGNNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@ ; ; ALL = (DSM / 8) + 1 ; CHK = DPB.CKS ; ALLDAL: MACRO #D LIST ON IF ((DD - 1) >= STHD) AND ((DD - 1) <= NDHð¶ÿÉNNNNNNNNNNNNNNNNN¡¡¡þÕáNNNNNNNNNNNNNNNNNNNNNN¡¡¡û2 ;SPT- SECTORS/TRACK DPB_BSH DS 1 ;BSH- BLOCK SHIFT FACTOR DETERMINED BY CLUSTER SIZE ; 1K= 3, 2K= 4, 4K= 5, 8K= 6, 16K= 7šúÿòNNNNNNNNNNNNNNNN¡¡¡þ :*NNNNNNNNNNNNNNNNNNNNNN¡¡¡û.2 DEBLOCKING) ; DPB_PSH DS 1 ;PSH- PHYSICAL RECORD SHIFT FACTOR BASED ON BYTES/SEC ; 0: 128, 1: 256, 2: 512, 3: 1024 DPB%þ!NNNNNNNNNNNNNNNN¡¡¡þVNNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ALLDPB: MACRO #D LIST ON D#D(DD)DPB: DS DPB_SZ ;ALLOCATION FOR DRIVE #D(DD) e…þrNNNNNNNNNNNNNNNN¡¡¡þõ�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ_;NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ%µeNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûARD DISK PHYSICAL DRIVE 0 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; D SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ; E2ðÿÈNNNNNNNNNNNNNNNNN¡¡¡þ+–jNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûARD DISK PHYSICAL DRIVE 1 ; G JADE 8" FLOPPY PHYSICAL DRIVE 0 ; H JADE 8" FLOPPY PHYSICAL DRIVE 1 ENDIF ; ;*********õÿîNNNNNNNNNNNNNNNNN¡¡¡þ*NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûD) D#D(DD)ALL: DS 128 ;ALLOCATION BIT MAP FOR 8" HARD DRIVE #D(DD) ENDIF IF ((DD - 1) >= ST8FD) AND ((DD - 1) <= ND8FD)ŒSÿHNNNNNNNNNNNNNNNNN¡¡¡þÅßNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DPB_BLM DS 1 ;BLM- BLOCK MASK ; 1K = 7, 2K= 15, 4K= 31, 8K= 63, 16K= 127 DPB_EXM DS 1 ;EXM- EXTENT MASK ; DSM < 256 :ЫÿÈNNNNNNNNNNNNNNNN¡¡¡þoyNNNNNNNNNNNNNNNNNNNNNN¡¡¡û_PHM DS 1 ;PHM- PHYSICAL RECORD MASK BASED ON BYTES/SEC ; 0: 128, 1: 256, 3: 512, 7: 1024 ; ; ADDITIONAL DISK PARTITIONI šÿòNNNNNNNNNNNNNNNN¡¡¡þƒÁNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LIST OFF ENDM ; ; RESERVE THE DATA SPACE ; DD DL 1 REPT NDRVS LIST OFF ALLDPB 0123456789ABCDEF DD DL DD + 1 LInåþrNNNNNNNNNNNNNNNN¡¡¡þ ÎNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ J�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ&à6NNNNNNNNNNNNNNNNNNNNNN¡¡¡û JADE 8" FLOPPY PHYSICAL DRIVE 0 ; F JADE 8" FLOPPY PHYSICAL DRIVE 1 ENDIF IF BOOT = 3 ; A JADE 8" FLOPPY PHYSICALhŸÿòNNNNNNNNNNNNNNNN¡¡¡þ,ýNNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************************************************* ; ; REVISION HISTORY: ; ; 3.00 - 26 JAN 87 GRH ; Im4ŸþrNNNNNNNNNNNNNNNN¡¡¡þ%NNNNNNNNNNNNNNNNNNNNNN¡¡¡û D#D(DD)ALL: DS 57 ;ALLOCATION BIT MAP FOR 8" DRIVE #D(DD) D#D(DD)CHK DS 32 ;DIRECTORY CHECKSUMS STORAGE (1 BYTE PER SECTORéÛþHNNNNNNNNNNNNNNNNN¡¡¡þ öîNNNNNNNNNNNNNNNNNNNNNN¡¡¡û 1K= 0, 2K= 1, 4K= 3, 8K= 7, 16K= 15 ; DSM > 255 : 2K= 0, 4K= 1, 8K= 3, 16K= 7 DPB_DSM DS 2 ;DSM- DRIVE STORAGE SIZE (IN CL�¼þ'NNNNNNNNNNNNNNNNN¡¡¡þ\HNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNG DATA FOR THE LOGICAL DRIVE SELECTION. ; PARTITIONING BY TRACKS ARE IMPLIMENTED THRU BDOS USING DPBOFF ABOVE. ; PARTITIONINGÉSþ NNNNNNNNNNNNNNNN¡¡¡þ°ðNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûST ON ENDM ; ; BLOCKING BUFFER ; BLKBUF: DS 1024 ;HOST BUFFER IF (($ - 8000H) > 07700H) OR ($ < 8000H) CONMSsÿáNNNNNNNNNNNNNNNN¡¡¡þ“ÿNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ!y¡NNNNNNNNNNNNNNNNNNNNNN¡¡¡û TITLE CUSTOMIZED BIOS FOR M5B LIST NOCOND BOOT EQU 10H ;10H: SA1004, 11H: PYX27, 3: 8" FLOPPY, 20H: 5" FLOPPY ;************“ßÿéNNNNNNNNNNNNNNNNN¡¡¡þ'ÓNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û DRIVE 0 ; B JADE 8" FLOPPY PHYSICAL DRIVE 1 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; D SIDE 2 & 3 OF HARD DISK P„’þHNNNNNNNNNNNNNNNN¡¡¡þ-<ÌNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûplemented new common IOPB code & Jade floppy firmware support. ; Implemented disk drive driver tables and new function to retur½:ÿNNNNNNNNNNNNNNNN¡¡¡þ€²NNNNNNNNNNNNNNNNNNNNNN¡¡¡û) ENDIF LIST OFF ENDM ; ; RESERVE THE DATA SPACE ; DD DL 1 REPT NDRVS LIST OFF ALLDAL 0123456789ABCDEF DD DçÿáNNNNNNNNNNNNNNNN¡¡¡þ £½NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUSTERS) ; INT(((#_TRACKS - OFF) * SPT * BYTES PER SECTOR) / CLUSTER SIZE) -1 DPB_DRM DS 2 ;DRM- DIRECTORY SIZE -1 DPB_AL0 D)ÿÂNNNNNNNNNNNNNNNNN¡¡¡þONNNNNNNNNNNNNNNNNNNNNN¡¡¡û BY HEADS ARE IMPLIMENTED BY USING THE FOLLOWING DATA. ; (HEAD BITS ARE INCLUDED IN SECTOR WORD UPPER BITS) ; DPB_SECO DS 2n­ÿáNNNNNNNNNNNNNNNN¡¡¡þå£NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûG **** BIOS TOO BIG, USE MOVCPM & RE-ADJUST! **** ENDIF END ÆËÿçNNNNNNNNNNNNNNNNN¡¡¡þ hNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ",òNNNNNNNNNNNNNNNNNNNNNN¡¡¡û**************************************************************** ; ; CUSTOMIZED BIOS FOR M5B ; (c) 1981 GRH Electronics,ÁzÿäNNNNNNNNNNNNNNNNN¡¡¡þ(Ã9NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHYSICAL DRIVE 0 ; E SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; F SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ENDIF IFÃEþ'NNNNNNNNNNNNNNNNN¡¡¡þ.iŸNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûn ; a ptr to a drive table. ; Removed init of IOBYTE. ; Implemented 5" floppy driver. ; Implemented use of ROM primitives. ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ³ƒNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûL DD + 1 LIST ON ENDM ;############################################################################ ; ; RESERVE DRI¹bþHNNNNNNNNNNNNNNNNN¡¡¡þ �ŒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS 2 ;AL0,1- DIRECTORY ALLOCATION ; 1 MSB PER DIRECTORY CLUSTER ALLOCATED DPB_CKS DS 2 ;CKS- # DIRECTORY SECTORS CHECKED D‹ÿdNNNNNNNNNNNNNNNNN¡¡¡þ|4NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;SOF- SECTOR OFFSET (FOR LOGICAL DRIVE) ; 0: NONE, 1..65535: OFFSET DPB_SZ DS 0 ENDM ; ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@ÛxÿþNNNNNNNNNNNNNNNNN¡¡¡þÖ’NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ENDIF END ‰÷ÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ9YNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ#ÃNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û CUPERTINO, CA ; ;**************************************************************************** ; ; CONFIGURATION: ; ; CPM rWþINNNNNNNNNNNNNNNNN¡¡¡þ)ðNNNNNNNNNNNNNNNNNNNNNN¡¡¡û BOOT = 20H ; A JADE 5" FLOPPY PHYSICAL DRIVE 0 ; B JADE 5" FLOPPY PHYSICAL DRIVE 1 ; C SIDE 0 & 1 OF HARD DISK PHYSICAÉþ$NNNNNNNNNNNNNNNNN¡¡¡þ/Z®NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; Moved system down to 60k. ; 3.01 26 JUN 88 GRH ; Remove 5" floppy support. Implement in CP/M-86 BIOS. ; Change single funé±þ NNNNNNNNNNNNNNNN¡¡¡þæÐNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûVE PARAMETER BLOCKS ; ;############################################################################ ; STRUCT 0 DPB_SPT DS Û\ÿÂNNNNNNNNNNNNNNNN¡¡¡þ NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; (DRM +1) / 4 DPB_OFF DS 2 ;OFF- # RESERVED TRACKS (USUALLY 2) ; ; ADDITIONAL CP/M 3.0 DATA (ALSO COULD BE USED BY CP/M 2kÿáNNNNNNNNNNNNNNNN¡¡¡þ)gNNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE THE DPB FOR DRIVE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@»VÿäNNNNNNNNNNNNNNNNN¡¡¡þƬNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þl NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ$†TNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; DRIVE USAGE IF BOOT = 10H ;HARD DISK BOOT CONFIG. ; A SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; B SIDE 2 & 3 OF HÝùÿ^NNNNNNNNNNNNNNNNN¡¡¡þ*¥[NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL DRIVE 0 ; D SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 0 ; E SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; F SIDE 2 & 3 OF HÝàÿäNNNNNNNNNNNNNNNNN¡¡¡þ0IãNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûction to return drive table ptr into a BIOS function ; call using restart instruction. ; Change LOGON to specify the ID sect,ãÿHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN^NNNNNNNN�Î�œ‚iƒ7„…Ò… †m‡<ˆ ‰×‰¤Šr‹?Œ �Û�©Žx�F�‘ᑯ’|“J”•啳–�—O˜™ì™ºšˆ›Wœ%�ó�Àž�Ÿ] +¡ø¡Ç¢•£b¤0¥þ¥Ì¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>ÃNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûor & track. At same time, fix bug ; which did not specify the logon track. ; 3.02 7 JUL 88 GRH ; Add '?' to include file ˜ÙÿäNNNNNNNNNNNNNNNNN¡¡¡þ”eNNNNNNNNNNNNNNNNNNNNNN¡¡¡û than swapping Roms itself. ; 3.07 11-25-90 GRH ; Modify for Ver. 1.22 Monitor. ; Fix bug in 8" Hard Disk table which benig@fÿrNNNNNNNNNNNNNNNN¡¡¡þ {®NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûrom ; DCM8 to CBIOS. ; Remove IOPB ptr passing in IX redundancy. ; Change DPB track-head shift factor to Sector Offset like cÿBNNNNNNNNNNNNNNNN¡¡¡þ[ÒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûuffer for ; ID sector read. ; 9-20-91 GRH Fold in redlines. ; 10-21-91 GRH Fix bugs ; 10-22-91 GRH Fix bugs ; 1ÒëÿäNNNNNNNNNNNNNNNN¡¡¡þ´NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;============================================================================ ; ; CONDITIONAL ASSEMBLY FLAGS ; ;=========7¶ÿoNNNNNNNNNNNNNNNNN¡¡¡þ¿NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRESSES ; ;============================================================================ ; SYS EQU 2 ;CP/M VERSION {2,3} ; NÑŠÿòNNNNNNNNNNNNNNNN¡¡¡þ%ôáNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNRSV EQU PAGE0 + BFUNRST BFUNRSI EQU 0C7H + BFUNRST ;=====================================================================»uÿçNNNNNNNNNNNNNNNNN¡¡¡þ+×îNNNNNNNNNNNNNNNNNNNNNN¡¡¡û;E DSK_5 EQU 10H ;F NDRVS: EQU 6 ENDIF IF BOOT = 11H ; ; 5.25" PYX-27 BOOT ; DSK_0 EQU 11H ;A DSK_1 EQU 10H ;B <ÂþBNNNNNNNNNNNNNNNN¡¡¡þk�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûnames. ; Change hard disk system tracks directory reference to new format. ; Correct bug in drivers which caused retry to failÛ,þHNNNNNNNNNNNNNNNNN¡¡¡þ„[NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûnly (at current level) ; caused the drive table to have bad data (default table was missing ; the 2 deblocking extension bytû·ÿ'NNNNNNNNNNNNNNNN¡¡¡þ.ýNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûtrack ; offset. Disk partitioning will add this value to sector word. It ; will be stored in the ID sector data to be dynamišÿÂNNNNNNNNNNNNNNNN¡¡¡þÂENNNNNNNNNNNNNNNNNNNNNN¡¡¡û0-23-91 GRH Fix bugs ; 3.13 1-15-92 GRH ; Change hard disk translation to Monitor disks 4 & 5 from 6 & 7. ; ; 3.14 2-9-¦½ÿ9NNNNNNNNNNNNNNNN¡¡¡þáJNNNNNNNNNNNNNNNNNNNNNN¡¡¡û=================================================================== ; INTCPTS EQU TRUE ;ENABLE SYSTEM CALL INTERCEPT WHISTLE áÿrNNNNNNNNNNNNNNNNN¡¡¡þ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûKSYS: EQU 59 ;SYSTEM SIZE IN K BYTES KBYTE: EQU 1024 CPMSZ: EQU KBYTE * NKSYS CPMBS: EQU CPMSZ - (20 * KBYTE) ;CP/M BIAS Vu˜ÿœNNNNNNNNNNNNNNNN¡¡¡þ&¡²NNNNNNNNNNNNNNNNNNNNNN¡¡¡û======= ; ; OTHER DECLARATIONS ; ;============================================================================ ; SKTSZ EQUrÁÿ9NNNNNNNNNNNNNNNN¡¡¡þ,NyNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DSK_2 EQU 10H ;C DSK_3 EQU 0H ;D DSK_4 EQU 0 ;E NDRVS: EQU 5 ENDIF ;===============================================êÚÿòNNNNNNNNNNNNNNNN¡¡¡þX¡NNNNNNNNNNNNNNNNNNNNNN¡¡¡û. (sector remained ; corrupted) ; Stubbed out new Clock routines for present. ; 3.03 31 JUL 88 GRH ; Unstub Clock routineéÿÈNNNNNNNNNNNNNNNNN¡¡¡þ ·jNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûes). ; Implement data xfer inhibit schemes with PB_FLG & PB_BCNT. ; Add pick-up of THIS_BNK data in all iopb cases. ; Remove çòÿ'NNNNNNNNNNNNNNNNN¡¡¡þÌNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûc. ; 3.10 5-20-91 GRH ; Change LOGON to attempt to recover from old disks better, using ; DCM8301 version controller firmw¢Oþ NNNNNNNNNNNNNNNN¡¡¡þñtNNNNNNNNNNNNNNNNNNNNNN¡¡¡û92 GRH ; Add additional floppy disk allocation size for 1.22Mb disks. ; ; 3.15 3-17-92 GRH ; Add dynamic sector skew tabÉâÿáNNNNNNNNNNNNNNNN¡¡¡þÒ{NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ;============================================================================ ; ; INCLUDE COMIOPB3.DEF ; INCLUDE Dÿ=ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ!8%NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûALUE CCP: EQU CPMBS + 3400H ;ADDR OF CCP BDOS: EQU CPMBS + 3C00H ;ADDRESS OF BDOS BIOS: EQU CPMBS + 4A00H ;ADDRESS OF BDOS˜æÿÈNNNNNNNNNNNNNNNNN¡¡¡þ'’ƒNNNNNNNNNNNNNNNNNNNNNN¡¡¡û 26 ;SKEW TABLE SIZE IF BOOT = 10H ; ; 8" HARD DISK BOOT DATA ; DSK_0 EQU 10H ;A DSK_1 EQU 10H ;B DSK_2 EQU 10H ;C bŽÿäNNNNNNNNNNNNNNNN¡¡¡þ-}HNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û============================= ; ; BDOS CONSTANTS ON ENTRY TO WRITE ; ;===============================================<�þ9NNNNNNNNNNNNNNNN¡¡¡þÁ6NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûes. ; 3.04 6 AUG 88 GRH ; Remove floppy side select from BIOS & move to controller. ; Implement new ID sector format. ; ImêàÿNNNNNNNNNNNNNNNN¡¡¡þ â9NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûclock buffer set/read system calls. ; 12-5-90 GRH ; Remove IX IOPB ptr passing to disk drivers. ; 1-13-91 GRH ; Fix bug wFbÿBNNNNNNNNNNNNNNNNN¡¡¡þ�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûare. ; 3.11 9-2-91 GRH ; Add redlines & change for M5ZMON v.2.00. ; 3.12 9-11-91 GRH ; Add deblocking code. ; 9-17-91 m¡ÿÂNNNNNNNNNNNNNNNN¡¡¡þ¤'NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûle selection to login code. ; VERSN EQU 315 ; ;**************************************************************************** äwÿÈNNNNNNNNNNNNNNNNN¡¡¡þKìNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûISKS3.DEF ; INCLUDE BDIR.DEF ; INCLUDE M5ZF2.DEF ; ;=============================================================g•ÿrNNNNNNNNNNNNNNNN¡¡¡þ"mvNNNNNNNNNNNNNNNNNNNNNN¡¡¡û BIOSR: EQU 1000H - BIOS ; ; PAGE 0 LOCATIONS ; PAGE0: EQU 0 ;START OF CP/M RAM DEFDRV: EQU PAGE0 + 4 ;DEFAULT DRIVE PAˆTÿÉNNNNNNNNNNNNNNNNN¡¡¡þ(‚½NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûDSK_3 EQU 10H ;D DSK_4 EQU 0 ;E DSK_5 EQU 0 ;F NDRVS: EQU 6 ENDIF IF BOOT = 3 ; ; 8" FLOPPY BOOT DATA ; DSK_0 EוÿÎNNNNNNNNNNNNNNNNN¡¡¡þ.(NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û============================= ; WRALL EQU 0 ;WRITE TO ALLOCATED WRDIR EQU 1 ;WRITE TO DIRECTORY WRUAL EQU 2 ;WRITE TO UNALLOÐÿHNNNNNNNNNNNNNNNNN¡¡¡þòNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûplement CP/M 3.0 DPB structure in preparation for deblocking. ; 3.05 11-3-88 GRH ; Change included data to update IOPB.PBSTAíÝÿÈNNNNNNNNNNNNNNNNN¡¡¡þ ÑNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûhich corrupted PB_FLG. ; 3.08 2-22-91 GRH ; Remove references to THIS_BNK & use monitor function #7 instead. ; Add track-heP’ÿINNNNNNNNNNNNNNNNN¡¡¡þ=°NNNNNNNNNNNNNNNNNNNNNN¡¡¡û GRH Add r/ls & move to 59k system. ; 9-19-91 GRH Fix bug which destroyed my root directories! ; BUF_RD was writing. ; C®ÿyNNNNNNNNNNNNNNNN¡¡¡þ—NNNNNNNNNNNNNNNNNNNNNN¡¡¡û SUBTTL SYSTEM DECLARATIONS ;============================================================================ ; ; ASSEMBLY PARÆüþrNNNNNNNNNNNNNNNN¡¡¡þxÝNNNNNNNNNNNNNNNNNNNNNN¡¡¡û=============== ; LIST OFF *INCLUDE COMIOPB3.DEF *INCLUDE DISKS3.DEF *INCLUDE BDIR.DEF *INCLUDE B:M5ZF2.DEÞ”ÿáNNNNNNNNNNNNNNNN¡¡¡þ#^GNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRAM ADDR BDOSJV EQU PAGE0 + 5 ;BDOS SYSTEM CALL ENTRY THIS_STK EQU PAGE0 + 1CH ;CURRENT STACK FRAME PTR DK_BDRV EQU 0041H ;BU;ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ)±ŒNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûQU 0H ;A DSK_1 EQU 0H ;B DSK_2 EQU 10H ;C DSK_3 EQU 10H ;D DSK_4 EQU 10H ;E DSK_5 EQU 10H ;F NDRVS: EQU 6 ENDIF IF~Cÿ$NNNNNNNNNNNNNNNNN¡¡¡þ/*NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûCATED ;============================================================================ ; ; ASCII CHARS ; ;================>þ NNNNNNNNNNNNNNNN¡¡¡þ§TNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT to new configuration. ; 3.06 1-28-89 GRH ; Revised primitive calling procedures to use the monitor rom function ; rather¾SÿáNNNNNNNNNNNNNNNN¡¡¡þ HŸNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûad shift factor to DPBs for future use. ; 3.09 5-15-91 GRH ; Change 8" floppy side select to track bit 0. Move calculation f¡?ÿÎNNNNNNNNNNNNNNNNN¡¡¡þhãNNNNNNNNNNNNNNNNNNNNNN¡¡¡û Patch problems with partitioning until 20MB drive installed. ; Fix TPA corruption by LOGON problem by using ROMBNK sector b&`ÿdNNNNNNNNNNNNNNNNN¡¡¡þ‡(NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAMETERS ; ;============================================================================ ; FALSE EQU 0 TRUE EQU NOT FALSE šoÿdNNNNNNNNNNNNNNNN¡¡¡þ-ŽNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûF LIST ON ;============================================================================ ; ; DISK OPERATING SYSTEM ADDªxÿÎNNNNNNNNNNNNNNNNN¡¡¡þ$ÇÐNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOOT DRIVE # FROM PROM DEFBFR EQU PAGE0 + 80H ;DEFAULT BUFFER ; ; BIOS FUNCTION CALL RESTART VECTOR ; BFUNRST EQU 28H BFUÃ(ÿîNNNNNNNNNNNNNNNNN¡¡¡þ*äßNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û BOOT = 20H ; ; 5.25" FLOPPY BOOT ; DSK_0 EQU 20H ;A DSK_1 EQU 20H ;B DSK_2 EQU 20H ;C DSK_3 EQU 20H ;D DSK_4 EQU 10H ÒØÿmNNNNNNNNNNNNNNNNN¡¡¡þ0gNNNNNNNNNNNNNNNNNNNNNN¡¡¡û============================================================ ; LF: EQU 0AH CR: EQU 0DH CTRLZ: EQU 1AH ;@@@@@@@@@@@@@@@@Á‰ÿÈNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNý€Ë�˜‚eƒ3„…Î…œ†i‡7ˆ‰Ò‰ŸŠm‹;Œ�Ö�¤Žs�A�‘Ü‘ª’x“F”•╯–~—L˜™è™¶š„›Rœ �î�»ž‰ŸW %¡ò¡Á¢�£\¤+¥ø¥Æ¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ óNNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE THE TRANSLATION TABLE MACRO ; ;@@@@@@@@@@@@@@@@@@@°@ÿäNNNNNNNNNNNNNNNNN¡¡¡þ£UNNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@ ; PVERS MACRO #VERS DD DL #VERS IF DD > 9999 DB (DD / 10000) + '0' DD DL DD % 10000 END×3þBNNNNNNNNNNNNNNNN¡¡¡þ LžNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûJP SETTRK ;SET TRACK # JP SETSEC ;SET SECTOR # JP SETDMA ;SET TRANSFER ADDR JP DISKRD ;PERFORM DISK READ JP DISKWR S‹ÿœNNNNNNNNNNNNNNNN¡¡¡þlâNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;BIOS MODULE LOAD ADDR FOR SBD ; ; CONTINUE ON WITH INIT ; INIT1: JR INIT ;########################################´LÿòNNNNNNNNNNNNNNNN¡¡¡þƒ)NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD (THIS_STK),SP EI ; ; INIT DEFAULT DRIVE ; LD A,(DK_BDRV) ;USE DRIVE # PASSED IN PAGE 0 AND A,3 LD (DEFDRV),A €2ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ)�NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û##### ; ; SIGN-ON MESSAGE ; ;############################################################################ ; MSGSO: DB CR,LgQÿòNNNNNNNNNNNNNNNN¡¡¡þ%ÃÑNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD (THIS_STK),SP EI ; ; INIT OUR STUFF ; XOR A,A LD (BUF_ACT),A ;ASSUME NO DATA IN BUFFER ; LD (UNA_CNT),A ;CLEAR U�pþNNNNNNNNNNNNNNNNNN¡¡¡þ+àÞNNNNNNNNNNNNNNNNNNNNNN¡¡¡û_SBDSS) ;PREFETCH BDOS TRK/SECTOR PUSH HL ; LD HL,(DEFBFR + BD_SCCPS) ;FETCH CCP TRK/SECTOR LD C,L LD B,0 CALL SETSECõîþBNNNNNNNNNNNNNNNN¡¡¡þ\ NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; GXLATE MACRO #SECTORS, #SKEW LIST OFF NXTSEC DL 1 ;;START WITHPÄþHNNNNNNNNNNNNNNNNN¡¡¡þ³kNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIF IF DD > 999 DB (DD / 1000) + '0' DD DL DD % 1000 ENDIF DB (DD / 100) + '0' DB '.' DB ((DD % 100) / 10) + '0'$èÿäNNNNNNNNNNNNNNNN¡¡¡þÍNNNNNNNNNNNNNNNNNNNNNN¡¡¡û;PERFORM DISK WRITE JP LISTST ;RETURN LIST STATUS JP SECTRN ;TRANSLATE SECTOR JP BIOFUNC ;EXECUTE FUNCTION CALL ;#rÒÿ„NNNNNNNNNNNNNNNN¡¡¡þõuNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û#################################### ; ; DIRECTORY SECTOR BUFFER STARTS HERE AFTER CRUNCHING COLD START ; CODE. THIS BUFFER ®éþ9NNNNNNNNNNNNNNNN¡¡¡þÖzNNNNNNNNNNNNNNNNNNNNN!ö¡¡¡û; ; SEND SYSTEM SIGN-ON ; LD HL,MSGSO CALL EDITOR ; ; MODIFY COLD START VECTOR TO WARM START ; LD HL,(BIOS+4) L9*ÿòNNNNNNNNNNNNNNNNN¡¡¡þ <$NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûF DB CPMSZ / (KBYTE * 10) + '0' DB (CPMSZ MOD (KBYTE * 10)) / KBYTE + '0' DB 'K CP/M-80 Vers 2.2',CR,LF DB 'M5b CBIOS ÒþNNNNNNNNNNNNNNNNNN¡¡¡þ&–‚NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNALLOCATED SECTOR COUNT ; LD (BUF_MOD),A ;CLEAN BUFFER ; LD HL,BLKBUF ;INIT BUFFER PTR LD (BUF_DMA),HL ; ; LOG ON DR�ÿáNNNNNNNNNNNNNNNN¡¡¡þ,yINNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; LD C,H CALL SETTRK ; LD BC,CCP CALL SETDMA ; ; READ CCP/BDOS ; WREAD: CALL DISKRD JR NZ,WEROR ;IF ERROR THEgÐþrNNNNNNNNNNNNNNNN¡¡¡þo‘NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û SECTOR 1 LOWEST DL 1 ;; REPT #SECTORS LIST ON DB NXTSEC LIST OFF NXTSEC DL NXTSEC + #SKEW ;ADD SKEW FACTOR ;; I&ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ €ZNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DB (DD % 10) + '0' ENDM SUBTTL BIOS CODE ORG BIOS ;---------------------------------------------------------------UËÿ�NNNNNNNNNNNNNNNNN¡¡¡þ*üNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û########################################################################### ; ; THE FOLLOWING BOOT DATA MUST RESIDE AS DEFINEDG$þ NNNNNNNNNNNNNNNN¡¡¡þÆDNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûIS USED BY THE CP/M DIRECTORY CHECK ROUTINES THAT ; CHECK FOR DISK CHANGE. ; ;##############################################rËÿBNNNNNNNNNNNNNNNN¡¡¡þåKNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûD (BIOS+1),HL ; ; INIT OUR STUFF ; CALL GETBNK LD (BUF_DMAB),A ; ; INITIALIZE CLOCK VECTORS IF CLOCK INSTALLED ; ÝÿÎNNNNNNNNNNNNNNNNN¡¡¡þ!NNNNNNNNNNNNNNNNNNNNNN¡¡¡û Vers ' PVERS VERSN DM CR,LF IF $ > (DIRBF + 128) CONMSG **** WARNING! COLD INIT CODE BIGGER THAN DIR BUFFER ***ÍÿÈNNNNNNNNNNNNNNNNN¡¡¡þ'¥³NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIVE TO INIT TABLES ; LD A,(DK_BDRV) AND A,3 ;MODULO 4 LD C,A LD E,0 CALL SELDSK LD A,L ;IF ERROR THEN ABORT OR ¡"ÿÈNNNNNNNNNNNNNNNN¡¡¡þ-JxNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûN EXIT ; ; NEXT SECTOR ; LD HL,CPM_SEC INC (HL) ; LD DE,128 ;DMA += SECTOR SIZE LD HL,(CPM_DMA) ADD HL,DE LD ªÿ²NNNNNNNNNNNNNNNN¡¡¡þöNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûF NXTSEC > #SECTORS ;CHECK FOR OVERFLOW NXTSEC DL NXTSEC - #SECTORS ;; IF NXTSEC <= LOWEST ;CHECK FOR REPEAT NXTSEC DL LOtˆÿáNNNNNNNNNNNNNNNN¡¡¡þ Õ NNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------- ; ; BIOS JUMP VECTOR TABLE ; ;---------------------------------------------------------------------------- 9¾ÿ9NNNNNNNNNNNNNNNNN¡¡¡þ9±NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û RIGHT BEFORE THE COLD ; INIT ROUTINE START AND MUST BE IN THE 1ST SECTOR. THESE 2 WORDS ARE ; REFERENCED BY THE BOOT LOADER C¼HÿÂNNNNNNNNNNNNNNNN¡¡¡þ“NNNNNNNNNNNNNNNNNNNNNN¡¡¡û############################## ; DIRBF: EQU $ ;BUFFER BEGINNING ;-------------------------------------------------------óÿHNNNNNNNNNNNNNNNNN¡¡¡þ|ÜNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD A,MF_CSYN ;TEST FOR BOARD PRESENT CALL XMROM ; ; IF CLOCK PRESENT THEN TURN ON CLOCK DRIVE ; OR A,A LD A,38H ;COÐ[þrNNNNNNNNNNNNNNNN¡¡¡þ"ZFNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û* ELSE DS DIRBF + 128 - $ ;FILL OUT DIRECTORY BUFFER TO 1 SECTOR SIZE ENDIF ;------------------------------------]ÿNNNNNNNNNNNNNNNNN¡¡¡þ(µ�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA,H JR Z,WEROR ; ; READ BOOT DIRECTORY ; LD BC,DEFBFR ;SET XFER ADDRESS (USE DEFAULT BUFFER) CALL SETDMA ; LD BC,ÿNNNNNNNNNNNNNNNNNN¡¡¡þ.+NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û(CPM_DMA),HL ; ; IF NOT INTO BDOS THEN READ NEXT SECTOR ; LD DE,BDOS XOR A,A SBC HL,DE JR C,WREAD ; ; ELSE IF Aµ{þHNNNNNNNNNNNNNNNNN¡¡¡þÅ7NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûWEST + 1 LOWEST DL NXTSEC ENDIF ENDIF ;; ENDM LIST ON ENDM ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@¶þHNNNNNNNNNNNNNNNNN¡¡¡þ æ8NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û; JP INIT1 ;COLD START ENTRY JP WARM ;RELOAD CCP/BDOS JP CNSCK ;GET CONSOLE STATUS JP CI ;CONSOLE INPUT JP COC ;C'ÇÿÉNNNNNNNNNNNNNNNNN¡¡¡þ €NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûODE IN ORDER TO DETERMINE THE LOAD ADDRESS ; AND LENGTH OF THE BIOS. ; ;#####################################################}ŠþNNNNNNNNNNNNNNNN¡¡¡þ &NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û--------------------- ; ; INIT - COLD START ENTRY FROM BOOT MUST SET ALL BIOS PARAMS ; ;--------------------------------¦–ÿòNNNNNNNNNNNNNNNN¡¡¡þOíNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûND. JR (ON) JR Z,CLKON ; ; ELSE TURN OFF CLOCK DRIVE ; LD A,18H ;UNCOND. JR (OFF) (CAUSES JUMP TO ILLEGAL) ; CLKON:  ÃÿáNNNNNNNNNNNNNNNN¡¡¡þ#iwNNNNNNNNNNNNNNNNNNNNNN¡¡¡û---------------------------------------- ; ; WARM REBOOT ENTRY LOADS CCP,BDOS FROM DISK & SETS UP VARIABLES ; ;-------------"ÿINNNNNNNNNNNNNNNNN¡¡¡þ)†¼NNNNNNNNNNNNNNNNNNNNNN¡¡¡û,BD_SEC ;SET DIRECTORY SECTOR CALL SETSEC ; LD BC,0 ;SET TRACK TO 0 CALL SETTRK ; CALL DISKRD JR NZ,WEROR ; ; C°€ÿNNNNNNNNNNNNNNNNN¡¡¡þ/,NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT BEGINNING OF BDOS THEN SET UP NEW TRACK & SECTOR ; JR Z,RDBDOS ; ; ELSE IF NOT AT BIOS THEN READ NEXT SECTOR ; LD DEMçþrNNNNNNNNNNNNNNNN¡¡¡þ�dNNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; INITIALIZE VERSION TEXT IN RAM MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@÷gÿBNNNNNNNNNNNNNNNN¡¡¡þ ¯NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûONSOLE OUTPUT JP LO ;PRINTER OUTPUT JP PUNCH JP READER JP HOME ;HOME SELECTED DRIVE JP SELDSK ;SELECT DISK DRIVE «=þNNNNNNNNNNNNNNNNNN¡¡¡þ_ÓNNNNNNNNNNNNNNNNNNNNNN¡¡¡û####################### ; DB 0 ;Z80 CPU DB 0 ;SPARE BIOSSZ: DW BIOSND - BIOS ;BIOS MODULE SIZE IN BYTES BIOSST: DW BIOS†ÿäNNNNNNNNNNNNNNNNN¡¡¡þ°NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û-------------------------------------------- ; INIT: ; ; SET TEMPORARY STACK ; DI LD SP,DEFBFR ;USE PAGE 0 FOR STACK *ÍÿòNNNNNNNNNNNNNNNN¡¡¡þ¾NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLD (INHCLK),A ; ; BOOT CCP & BDOS ; JR WARM ;#######################################################################Ö¾ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ$ðàNNNNNNNNNNNNNNNNNNNNNN¡¡¡û--------------------------------------------------------------- ; WARM: ; ; SET TEMPORARY STACK ; DI LD SP,DEFBFR L‘µÿ\NNNNNNNNNNNNNNNN¡¡¡þ*ÓïNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûHECK FOR VALID BOOT DIRECTORY ; LD A,(DEFBFR) CP A,86H JR C,WEROR ; ; SET UP TO LOAD CCP/BDOS ; LD HL,(DEFBFR + BDasÿÈNNNNNNNNNNNNNNNNN¡¡¡þ0?WNNNNNNNNNNNNNNNNNNNNNN¡¡¡û,BIOS - BDOS SBC HL,DE JP C,WREAD ; ; ELSE DONE READING SYSTEM ; JR WZRPG ; ; ; ELSE SET UP & READ BDOS ; RDBD�”þ'NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÎNNNNNNNN�Î�›‚hƒ6„…Ò…¡†o‡=ˆ ‰Ø‰¥Šs‹@Œ�Û�ªŽx�F�‘â‘°’~“L”•è•¶–„—R˜ ™î™¼šŠ›Yœ&�ó�Áž�Ÿ^ ,¡ú¡Ç¢•£b¤0¥þ¥Ì¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þñŠNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOS: POP HL ;RESTORE BDOS TRK/SECTOR FROM DIRECTORY LD C,L LD B,A ;A STILL CONTAINS 0 CALL SETSEC ; LD C,H CALL SETTdFÿäNNNNNNNNNNNNNNNNN¡¡¡þ[,NNNNNNNNNNNNNNNNNNNNNN¡¡¡û + 7) LD (BDOSV),HL ; ; NOW PUT INTERCEPT VECTOR INTO BDOS CODE ; LD HL,INTCPT LD (BDOS + 7),HL ENDIF ; ; PASSíýþrNNNNNNNNNNNNNNNN¡¡¡þ ´çNNNNNNNNNNNNNNNNNNNNNN¡¡¡û INC A LD (READOP),A ; ; PRE-READ_OF_DATA_FLAG = TRUE ; LD (RSFLAG),A ; ; TREAT AS UNALLOCATED BLOCK ; LD A,WRUA«³ÿœNNNNNNNNNNNNNNNN¡¡¡þ”›NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; PUSH IY LD IY,(CUR_DPB) ; ; IF NOT BLOCKED THEN USE CPM WRITE ; LD A,(IY + DPB_PSH) ;0= 128-BYTE SECTORS OR A,A 9¸þrNNNNNNNNNNNNNNNN¡¡¡þ{PNNNNNNNNNNNNNNNNNNNNNN¡¡¡û A,A JP Z,ALLOC ; ; ELSE MORE UNALLOCATED RECORDS REMAIN, COUNT-- ; DEC A LD (UNA_CNT),A ; ; IF REQUESTED SECTOR Ô-ÿ“NNNNNNNNNNNNNNNNN¡¡¡þÑöNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS UNNECESSARY READ ; XOR A,A ;PREREAD FLAG = FALSE LD (RSFLAG),A JP RWOPER ; ; ; NORMAL NON-BLOCKED WRITE ; DISKWr!þrNNNNNNNNNNNNNNNN¡¡¡þ%;¨NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûC A JP NZ,SECSHFLP ; NOSECSHF: INC HL ;SET BACK TO PHYSICAL SECTOR LD (BUF_PSEC),HL ;BUFFER PHYSICAL SECTOR TO ACCESS è{þHNNNNNNNNNNNNNNNNN¡¡¡þ+§NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûHE SECTOR BUFFER ; LD A,(CPM_DSK) ;BUFFER SECTOR = PHYSICAL SECTOR LD (BUF_DSK),A ; LD HL,(CPM_TRK) LD (BUF_TRK),HL ;å²ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ¤ÙNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRK ; JR WREAD ; ; ; WARM BOOT ERROR, OUTPUT MSG & GO TO DEBUGGER ; WEROR: LD HL,MSGLE ;OUTPUT ERROR MESSAGE CALL EDI¶èÿÉNNNNNNNNNNNNNNNNN¡¡¡þKNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DEFAULT DISK TO CCP ; LD A,(DEFDRV) LD C,A JP CCP SUBTTL BIOS DISK FUNCTION ROUTINES ;+++++++++++++++++++++++++++ÿÈNNNNNNNNNNNNNNNN¡¡¡þá´NNNNNNNNNNNNNNNNNNNNNNð¡¡¡ûL LD (WRTYPE),A ; JP RWOPER ;TO PERFORM THE READ ; ; ; NORMAL NON-BLOCKED READ ; DISKRDN: CALL CPM_RD JP RW_RETúáÿùNNNNNNNNNNNNNNNN¡¡¡þ NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û JP Z,DISKWRN ; ; READ_OP_FLAG = FALSE ; XOR A,A LD (READOP),A ; ; SAVE WRITE TYPE ; LD A,C LD (WRTYPE),A ; ë¡ÿòNNNNNNNNNNNNNNNN¡¡¡þ.NNNNNNNNNNNNNNNNNNNNNN¡¡¡û!= UNALLOCATED SECTOR THEN PURGE ; LD A,(CPM_DSK) ;SAME DISK? LD HL,UNA_DSK CP A,(HL) JR NZ,ALLOC ; LD HL,(UNA_TRK) Ÿ2ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ Ä]NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRN: CALL CPM_WR JP RW_RET ; ; ; NOT AN UNALLOCATED RECORD, REQUIRES PRE-READ ; ALLOC: XOR A,A ;COUNT = 0 LD (UNA#ÿNNNNNNNNNNNNNNNN¡¡¡þ&nûNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ; IF BUFFER == EMPTY THEN READ THE PHYSICAL SECTOR ; LD HL,BUF_ACT LD A,(HL) ; LD (HL),1 ;BUFFER = ACTIVE IN ANY CDÿòNNNNNNNNNNNNNNNN¡¡¡þ,�0NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD HL,(BUF_PSEC) LD (BUF_SEC),HL ; ; IF REQUIRED TO READ THEN READ ; LD A,(RSFLAG) ;NEED TO READ? OR A,A CALL N¥ÊÿäNNNNNNNNNNNNNNNN¡¡¡þ—èNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTOR CALL MR_BRK HALT ; ; ; BOOT OK, INIT PAGE 0 ; WZRPG: ; ; INIT BIOS WARM START IN PAGE 0 ; LD A,0C3H LD HZ‹þNNNNNNNNNNNNNNNNN¡¡¡þ x#NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++ ; ; READ A DISK SECTOR ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++++‘tÿHNNNNNNNNNNNNNNNNN¡¡¡þÒ…NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;**************************************************************************** ; ; WRITE DISK SECTOR FUNCTION ; ENTRY- C˜ÄþrNNNNNNNNNNNNNNNN¡¡¡þ>=NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; IF 1ST WRITE TO UNALLOCATED (NEW, UNUSED) BLOCK THEN SET PARAMETERS ; CP A,WRUAL JP NZ,CHKUNA ; ; COUNT = NUMBER_OÁÿÎNNNNNNNNNNNNNNNNN¡¡¡þ2NNNNNNNNNNNNNNNNNNNNNN¡¡¡û;SAME TRACK? LD DE,(CPM_TRK) SBC HL,DE JR NZ,ALLOC ; LD HL,(CPM_SEC) LD DE,(UNA_SEC) SBC HL,DE JR NZ,ALLOC ; ; §ÓÿÎNNNNNNNNNNNNNNNNN¡¡¡þ!÷lNNNNNNNNNNNNNNNNNNNNNN¡¡¡û_CNT),A ; INC A ;PREREAD FLAG = TRUE LD (RSFLAG),A ; ; ; ; COMMON CODE FOR READ AND WRITE FOLLOWS ; RWOPER: ; ; gÿ“NNNNNNNNNNNNNNNNN¡¡¡þ']ÊNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûASE ; OR A,A JR Z,FILHST ; ; HOST BUFFER ACTIVE, SAME AS SEEK BUFFER? ; LD A,(CPM_DSK) LD HL,BUF_DSK ;SAME DISK? =‹ÿäNNNNNNNNNNNNNNNN¡¡¡þ-²NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûZ,BUF_RD ;YES, IF 1 ; ; BUFFER = CLEAN ; XOR A,A LD (BUF_MOD),A ; MATCH: ; ; COPY DATA TO OR FROM BUFFER ; LD;>ÿNNNNNNNNNNNNNNNN¡¡¡þNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL,BIOS + 3 LD (PAGE0),A LD (PAGE0 + 1),HL ; ; INIT BDOS CALL VECTOR IN PAGE 0 ; LD HL,BDOS + 6 LD (BDOSJV),A LD (>µÿÎNNNNNNNNNNNNNNNNN¡¡¡þ -pNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; DISKRD: ; ; SET UP DATA TABLE PTRS ; PUSH IX LD IX,(CUR_¥wÿÂNNNNNNNNNNNNNNNNN¡¡¡þÁÈNNNNNNNNNNNNNNNNNNNNNN¡¡¡û= WRITE TYPE: ; 0: WRITE TO ALLOCATED BLOCK (UPDATE) ; 1: WRITE TO DIRECTORY BLOCK (ALLWAYS WRITE) ; 2: WRITE TO UNALLO£ƒÿùNNNNNNNNNNNNNNNN¡¡¡þknNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûF_SECTORS_IN_BLOCK ; LD A,(IY + DPB_BLM) ;CUR_DPB.DPBBLM + 1 ::= (BLKSIZ/128) INC A LD (UNA_CNT),A ; ; SET DISK TO SE9eÿçNNNNNNNNNNNNNNNNN¡¡¡þ„¥NNNNNNNNNNNNNNNNNNNNNN¡¡¡û MATCH, MOVE TO NEXT SECTOR FOR FUTURE REF ; EX DE,HL ;UNASEC += 1 INC HL LD (UNA_SEC),HL ; ; IF PAST LAST SECTOR Oî{ÿòNNNNNNNNNNNNNNNN¡¡¡þ"¢?NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ASSUME NO ERRORS ; XOR A,A LD (IOPB + PB_STATO),A ; ; COMPUTE BUFFER SECTOR ; LD HL,(CPM_SEC) DEC HL ;CONVERT *ËÿNNNNNNNNNNNNNNNNN¡¡¡þ(MôNNNNNNNNNNNNNNNNNNNNNN¡¡¡û CP A,(HL) JR NZ,NOMATCH ; LD HL,(BUF_TRK) ;SAME TRACK? LD DE,(CPM_TRK) SBC HL,DE JR NZ,NOMATCH ; LD DE,(BUF_PSEC)#´ÿNNNNNNNNNNNNNNNNNN¡¡¡þ.çRNNNNNNNNNNNNNNNNNNNNNN¡¡¡û HL,(CPM_SEC) ;CALCULATE INDEX INTO BUFFER DEC HL ;CONVERT TO LOGICAL SECTOR (0..N-1) LD A,L ; AND A,(IY + DPB_PHM) ;UUØÿäNNNNNNNNNNNNNNNNN¡¡¡þ=NNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBDOSJV + 1),HL ; ; INIT BIOS CALL VECTOR IN PAGE 0 ; LD HL,BIOFUNC LD (BFUNRSV),A LD (BFUNRSV + 1),HL ; ; SET DEFª}ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ ANNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDDT) ; PUSH IY LD IY,(CUR_DPB) ; ; IF NOT BLOCKED THEN USE CPM READ ; LD A,(IY + DPB_PSH) ;0= 128-BYTE SECTORS OR k[ÿÉNNNNNNNNNNNNNNNNN¡¡¡þòùNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCATED BLOCK (NO NEED TO PRE-READ) ; ;**************************************************************************** ; DISKWR: êžÿüNNNNNNNNNNNNNNNN¡¡¡þX_NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEK ; LD A,(CPM_DSK) LD (UNA_DSK),A ; ; SET TRACK TO SEEK ; LD HL,(CPM_TRK) LD (UNA_TRK),HL ; ; SET SECTOR TO SÄâÿ„NNNNNNNNNNNNNNNN¡¡¡þ·”NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûN TRACK THEN USE 1ST SECTOR OF NEXT TRACK ; LD E,(IY + DPB_SPT) LD D,(IY + DPB_SPT +1) SBC HL,DE JP C,NOOVF ; LD HL, -> BITS <14..8> LD H,A ; LD A,0 ;BIT 0 -> BIT 7 RRA LDÍ;ÿäNNNNNNNNNNNNNNNN¡¡¡þhNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûAULT SECTOR BUFFER ; LD BC,DEFBFR CALL SETDMA ; IF INTCPTS ; ; PUT BDOS VECTOR INTO INTERCEPT CODE ; LD HL,(BDOSþ©þNNNNNNNNNNNNNNNNNN¡¡¡þ ‡ÖNNNNNNNNNNNNNNNNNNNNNNð¡¡¡ûA,A JP Z,DISKRDN ; ; READS DON'T NEED ALLOCATION ; XOR A,A LD (UNA_CNT),A ; ; READ_OPERATION_FLAG = TRUE (1) ; ¶ªÿBNNNNNNNNNNNNNNNN¡¡¡þ§ªNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; REMOVE BOOT WRITE PROTECTION ; XOR A,A LD (WR_PROT),A ; ; SET PTRS TO DISK DATA ; PUSH IX LD IX,(CUR_DDT) ÖÿdNNNNNNNNNNNNNNNNN¡¡¡þHaNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûEEK ; LD HL,(CPM_SEC) LD (UNA_SEC),HL ; ; IF NO UNALLOCATED SECTORS REMAIN THEN PREREAD ; CHKUNA: LD A,(UNA_CNT) ORÑûþrNNNNNNNNNNNNNNNN¡¡¡þâÇNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û0 ;SECTOR = 1 LD (UNA_SEC),HL ; LD HL,(UNA_TRK) ;TRACK++ INC HL LD (UNA_TRK),HL ; NOOVF: ; ; MATCH FOUND, MARK A»bÿÈNNNNNNNNNNNNNNNNN¡¡¡þ$™NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûS JP Z,NOSECSHF ;IF ALREADY 0 THEN SECTOR SIZE IS 128 ; SECSHFLP: SRL H ;ELSE SHIFT OVER TO PHYSICAL SECTOR RR L DE¸ÒÿçNNNNNNNNNNNNNNNNN¡¡¡þ*+–NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOUT BEFORE READING NEW ONE ; CALL BUF_FLSH ;CLEAR HOST BUFF ; JR NZ,RW_RET ;IF ERROR THEN ABORT ; FILHST: ; ; READ TÿNNNNNNNNNNNNNNNNN¡¡¡þ0Ç.NNNNNNNNNNNNNNNNNNNNNN¡¡¡û L,A ; ; HL HAS RELATIVE HOST BUFFER ADDRESS ; LD DE,BLKBUF ADD HL,DE ;HL = HOST ADDRESS ; LD DE,(CPM_DMA) ;GET/PUTÔáÿ$NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÈNNNNNNý€Ë�˜‚eƒ2„…Î…œ†j‡9ˆ‰Ô‰¡Šo‹<Œ �×�¦Žt�B�‘ß‘­’z“G”•╯–}—J˜™æ™´š‚›Qœ�ì�¹žˆŸV $¡ò¡¿¢Ž£[¤)¥÷¥Å¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þƺNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û CP/M DATA LD BC,128 ;LENGTH OF MOVE ; LD A,(READOP) ;WHICH WAY? OR A,A JP NZ,RWMOVE ;SKIP IF READ ; ; WRITE OPERAIþHNNNNNNNNNNNNNNNNN¡¡¡þlNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û ;WRITE TO DISK ; LD A,(IOPB + PB_STATO) ;RETURN ANY ERRORS ; ; DONE, RESTORE & RETURN ; RW_RET: OR A,A ;SET RESULT S6lÿùNNNNNNNNNNNNNNNN¡¡¡þ ƒ×NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûYSICAL READ FROM THE DISK INTO CPM_DMA, ; WITHOUT BLOCKING. ; ENTRY- (CPM_DSK)= DISK # TO READ FROM ; (CPM_TRK)= TRACK # TO ~ÿÂNNNNNNNNNNNNNNNN¡¡¡þ£«NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCTOR # TO READ FROM ; (CPM_DMA)= XFER ADDRESS ; IX= DDT PTR ; IY= DPB PTR ; EXIT - (IOPB.PB_STATO)= 0: OK, /0: ERROR ; ò¿ÿÂNNNNNNNNNNNNNNNN¡¡¡þL`NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; RET ;**************************************************************************** ; ; BUF_FLSH FLUSHES THE BUFFER DA#+ÿ“NNNNNNNNNNNNNNNNN¡¡¡þæÆNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLEAN BUFFER ; LD (BUF_MOD),A RET ;**************************************************************************** ; ; B>jÿòNNNNNNNNNNNNNNNN¡¡¡þ% ˜NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûROM ; IX= DDT PTR ; IY= DPB PTR ; EXIT - (IOPB.PB_STATO)= 0: OK, /0: ERROR ; ;*******************************************Ò˜þ'NNNNNNNNNNNNNNNNN¡¡¡þ+/—NNNNNNNNNNNNNNNNNNNNNN¡¡¡û;DRIVE IS STILL IN C REGISTER ; ; IF DRIVE ERROR THEN RETURN (HL= 0) ; RET NZ ; ; ELSE SAVE PTR ; LD (CUR_DDT),HL d¹ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ“éNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTION, MARK AND SWITCH DIRECTION ; LD A,1 ;BUFFER = DIRTY LD (BUF_MOD),A ; ; SAVE BUFFER DATA PTRS FOR LATER FLUSHES ;‰þ'NNNNNNNNNNNNNNNNN¡¡¡þ|"NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTATUS FLAG POP IY POP IX ; RET ;**************************************************************************** ; ; CÈÿäNNNNNNNNNNNNNNNN¡¡¡þÖ„NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûREAD FROM ; (CPM_SEC)= SECTOR # TO READ FROM ; (CPM_DMA)= XFER ADDRESS ; EXIT - (IOPB.PB_STATO)= 0: OK, /0: ERROR ; ;****sÚþrNNNNNNNNNNNNNNNN¡¡¡þ:NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD (IY + DPB_SKT),0 ;ASSUME NO SKEW ; ; ATTEMPT TO READ ID SECTOR ; CALL BUF_FLSH ;FLUSH BUFFER 1ST JR NZ,LOGERR ; CA‰ÿdNNNNNNNNNNNNNNNNN¡¡¡þ-˜NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFLOPPY THEN ASSUME 3740 TRANSLATION ; LD A,(BLKBUF + ID_FLGO) AND A,[1 SHL DF_DTDB] OR [1 SHL DF_HARDB] CALL Z,TR8 ; ; /PÿrNNNNNNNNNNNNNNNN¡¡¡þ ÂSNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIX + DDT_HDS),A ; ; RETURN DRIVE TABLE PTR ; LD HL,(CUR_DPH) XOR A,A ;RETURN NO-ERROR JR LGDONE ; ; ; NO ID SEC·ÅþNNNNNNNNNNNNNNNNNN¡¡¡þâ/NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û TRK 0 ; EXIT - BC= 0 ; ;**************************************************************************** ; HOME: ; ; IF PE«)þrNNNNNNNNNNNNNNNN¡¡¡þ äNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û**************** ; SETSEC: LD (CPM_SEC),BC RET ;*********************************************************************p;ÿdNNNNNNNNNNNNNNNNN¡¡¡þ§BNNNNNNNNNNNNNNNNNNNNNN¡¡¡û IF NO TRANSLATION THEN RETURN SECTOR++ ; LD A,D ;IF TABLE ADDR = 0 THEN NO TRANSLATION OR A,E JP Z,NOTRAN ; ; ELSEò‘ÿòNNNNNNNNNNNNNNNN¡¡¡þ%MNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûDIR ; ; EXECUTE WITHOUT COMPENSATION ; JR LL_DO ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++!ÿNNNNNNNNNNNNNNNNN¡¡¡þ+nNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++ ; LL_WRIT: ; ; IF STILL PROTECTED THEN ERROR ; LD A,(WR_PROT) OR A,A JR NZ,DO_ERR ; ; INHIBIT UPLOAD ; 'PÿBNNNNNNNNNNNNNNNN¡¡¡þÒmNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLL DISKLOG JR NZ,LOGERR ; ; IF NO ID SECTOR THEN USE DEFAULT DPB ; (NOTE: CONTROLLER HAS SET IT'S DISK DEFAULTS IN DEFBFR^þHNNNNNNNNNNNNNNNNN¡¡¡þ=¦NNNNNNNNNNNNNNNNNNNNNN¡¡¡û IF NO DYNAMIC SKEW TABLE SPECIFIED THEN TRANSLATION IS DONE ; LD A,(BLKBUF + ID_SKWO) LD (IY + DPB_SKT),A ;IF 0 THEN DISARÄþHNNNNNNNNNNNNNNNN¡¡¡þ—NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTOR, USE DEFAULT DATA ; LGDEF: ; ; IF NOT HARD DISK THEN GO DO FLOPPY TEST ; BIT DDT_HDB,(IX + DDT_FLG) JR Z,LGCKFD !WþBNNNNNNNNNNNNNNNN¡¡¡þ{¸NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNDING WRITE (BUFFER DIRTY) THEN IGNORE ; LD A,(BUF_MOD) OR A,A JR NZ,HOME2 ; ; ELSE PURGE BUFFER ; LD (BUF_ACT),A ©ÉÿòNNNNNNNNNNNNNNNN¡¡¡þX·NNNNNNNNNNNNNNNNNNNNNN¡¡¡û******* ; ; SET TRANSFER ADDR ; ENTRY- BC= ADDRESS ; EXIT - A= ? ; ;******************************************************cÿ¤NNNNNNNNNNNNNNNNN¡¡¡þ ²éNNNNNNNNNNNNNNNNNNNNNN¡¡¡û CALCULATE NEW SECTOR FROM TABLE ; EX DE,HL ADD HL,BC LD L,(HL) ; LD H,0 RET ; ; ; CONVERT FROM CP/M'S LOGICAL î¡ÿÂNNNNNNNNNNNNNNNN¡¡¡þ&ONNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û+++++++++ ; ; LOW LEVEL READ ; ENTRY- IX= DDT PTR ; IY= DPB PTR ; EXIT - IOPB.PB_STATO, A= STATUS ; ;+++++++++++++++++++ð.ÿòNNNNNNNNNNNNNNNN¡¡¡þ,÷„NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûLD A,1 SHL PB_INHX LD (IOPB + PB_FLGO),A ; ; CALCULATE DOWNLOAD BYTE COUNT ; LD A,(IY + DPB_PSH) ;USE SHIFT FACTOR {0:1“ÏÿòNNNNNNNNNNNNNNNN¡¡¡þá\NNNNNNNNNNNNNNNNNNNNNN¡¡¡û IN ALL CASES) ; ID SECTOR TYPES ARE: ; -1: NONE 0: OLD JADE DD ; 2: EXTENDED 3: PARTITIONED, 0-FILLED ; LD A,(IOPB + ‰LÿÈNNNNNNNNNNNNNNNNN¡¡¡þ —NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBLES SKEW ADDITION OR A,A JR Z,NO_SKW ; ; ELSE VALID SKEW TABLE ON DISK, TRANSFER TO SKEW BUFFER ; LD HL,BLKBUF ;CALC›ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ¤1NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û; ; ELSE USE HARD DISK DEFAULTS ; CALL TRNONE ; NO XLATE LD HL,HDPBK ; ; XFER DATA TO TABLES ; SEL2: LD DE,(CUR_:âÿrNNNNNNNNNNNNNNNN¡¡¡þH‰NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; HOME2: ; ; JUST SET TRACK TO 0 ; LD BC,0 ; ; FALL INTO SET TRACK ; ;***************************************¶"ÿNNNNNNNNNNNNNNNNNN¡¡¡þk†NNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************** ; SETDMA: LD (CPM_DMA),BC ; LD A,(BUF_DMAB) ;FETCH BANK ADDRESS SET BY COLD START LD (CPM_DMAB),A J¤ÿÂNNNNNNNNNNNNNNNN¡¡¡þ!�ØNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSECTOR {0..N-1} TO PHYSICAL SECTOR {1..N} ; NOTRAN: LD HL,1 ADD HL,BC RET SUBTTL DISK SUPPORT ROUTINES ;++++++++½6ÿgNNNNNNNNNNNNNNNNN¡¡¡þ'+~NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; LL_READ: ; ; ENABLE UPLOAD ; XOR A,A LD (IOPB + PB_FLGO),*Jÿ'NNNNNNNNNNNNNNNN¡¡¡þ-ĵNNNNNNNNNNNNNNNNNNNNNN¡¡¡û28, 1:256, 2:512, 3:1024} LD HL,128 ;START WITH 128 BYTES ; AND A,3 ;LIMIT TO 1024-BYTE SECTORS ; JR Z,LL_WR2 ;IF SHIFä°þBNNNNNNNNNNNNNNNN¡¡¡þxËNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPB_ST2O) CP A,-1 JR Z,LGDEF ; ; ELSE IF TYPE == 3 THEN OK ; CP A,3 JR NC,TYPE3_ID ; ; ELSE PAD UNINITIALIZED DA™ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ [ÄNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûULATE PTR TO TABLE LD E,A LD D,0 ADD HL,DE ; EX DE,HL ;CALCULATE BUFFER PTR LD HL,(CUR_DPB) LD BC,DPB_SKT ADD HLɰÿÂNNNNNNNNNNNNNNNNN¡¡¡þ·|NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDPB) ; USE DEFAULT TABLE LD BC,DPB_SZ LDIR ; LD A,(HL) ;HEADS VALUE JR SEL1 ; ; ; USE 8" FLOPPY DEFAULTS ; LGCqDþ9NNNNNNNNNNNNNNNN¡¡¡þÚNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************* ; ; SET TRACK # ; ENTRY- BC= TRACK # ; ;*********************************************Å=ÿ'NNNNNNNNNNNNNNNNN¡¡¡þòNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; DONE ; RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SECTOR TRANSLATIOd¡ÿNNNNNNNNNNNNNNNN¡¡¡þ"Ô‹NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; LOGON DISK FUNCTION ; ENTRY- IX= DDT PTR ; IY= DPBàYÿäNNNNNNNNNNNNNNNNN¡¡¡þ(;@NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûA ; ; DISABLE DOWNLOAD ; LD HL,0 LD (IOPB + PB_BCNTO),HL ; ; PASS READ SECTOR COMMAND ; LD A,PB_READC JP LL_RWÇþNNNNNNNNNNNNNNNNNN¡¡¡þ.‘æNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT_FACTOR == 0 THEN DONE ; LL_WR3: ADD HL,HL ;DOUBLE COUNT DEC A JP NZ,LL_WR3 ; LL_WR2: LD (IOPB + PB_BCNTO),HL ; ; úPþHNNNNNNNNNNNNNNNNN¡¡¡þKúNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûTA TO 0 ; LD HL,BLKBUF + ID_PSHO ;FILL DATA WITH 0S LD B,ID_FLGO - ID_PSHO ; PADIDL: LD (HL),0 INC HL DJNZ PADIDL ; Ö¨ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ hõNNNNNNNNNNNNNNNNNNNNNN¡¡¡û,BC EX DE,HL ; LD BC,SKTSZ LDIR ; NO_SKW: ; ; XFER DISK DATA TO DPB ; LD DE,(CUR_DPB) ;GET ADDR OF DPB LD HL,ÿ8ÿNNNNNNNNNNNNNNNNN¡¡¡þ„MNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûKFD: CALL TR8 LD HL,SD8PBK JR SEL2 ; ; ERROR EXIT ; LOGERR: LD HL,0 ; ; DONE ; LGDONE: POP IY ;RESTORE REGS POìÿüNNNNNNNNNNNNNNNN¡¡¡þ.ëNNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************* ; SETTRK: LD (CPM_TRK),BC RET ;******************************************************áqÿùNNNNNNNNNNNNNNNN¡¡¡þÁ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûN FUNCTION ; ENTRY- DE= 0: NO XLATE, ELSE PTR TO XLATE TABLE ; BC= SECTOR # TO XLATE ; EXIT - HL= XLATED SECTOR OR BC + 1 ;¢öÿÎNNNNNNNNNNNNNNNNN¡¡¡þ#çºNNNNNNNNNNNNNNNNNNNNNN¡¡¡û PTR ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; DISKLOGð%ÿ¯NNNNNNNNNNNNNNNNN¡¡¡þ)qNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; LOW LEVEL WRITE ; ENTRY- IX= DDT PTR jŽþ$NNNNNNNNNNNNNNNNN¡¡¡þ/¢×NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPASS WRITE COMMAND ; LD A,PB_WRITC ; ; FALL INTO COMMON CODE ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++D[ÿ NNNNNNNNNNNNNNNN¡¡¡þ©NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; PROCESS TYPE-3 ID SECTOR ; TYPE3_ID: ; ; ASSUME NO TRANSLATION AS DEFAULT ; CALL TRNONE ; ; IF SINGLE-DENSITY ÕŸÿÎNNNNNNNNNNNNNNNNN¡¡¡þ ñbNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBLKBUF + ID_SPTO LD BC,DPB_SZ - 1 LDIR ; ; XFER DISK PHYSICAL DATA TO TABLE ; LD A,(BLKBUF + ID_HEADS) ; SEL1: LD (È»ÿNNNNNNNNNNNNNNNN¡¡¡þÑNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûP IX RET ;**************************************************************************** ; ; HOME DRIVE - TREAT AS SEEK@úÿòNNNNNNNNNNNNNNNNN¡¡¡þ>ÕNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û********************** ; ; SET SECTOR ; ENTRY- BC= SECTOR # ; ;************************************************************ìÿ NNNNNNNNNNNNNNNN¡¡¡þ”sNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û BC= UNCHANGED ; A, DE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; SECTRN: ; ;š7ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ$~-NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û: ; ; SET UP READ IOPB ; LD A,(BUF_DMAB) LD (LOGIOPB + PB_DMAXO),A ; LD HL,LOGIOPB LD DE,IOPB LD BC,PB_STATO L©HþNNNNNNNNNNNNNNNNNN¡¡¡þ*]"NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; IY= DPB PTR ; EXIT - IOPB.PB_STATO, A= STATUS ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++†ÉÿäNNNNNNNNNNNNNNNNN¡¡¡þ0±šNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++ ; ; COMMON IOPB EXECUTER ; ENTRY- A= COMMAND ; IX= DRIVE TABLE PTR ; IY= DPB PTR ; ;+++++++++Þ‘ÿNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNý€Ë�˜‚fƒ3„…Î…œ†i‡7ˆ‰Ò‰ŸŠm‹;Œ�Õ�¤Žr�?�‘Ü‘«’y“G”•╯–~—K˜™è™·š…›Sœ!�ï�¼žŠŸY '¡õ¡Ã¢‘£^¤-¥û¥É¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ°NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; LL_RW: LD (IOPB + PB_CMDO),A ; ; OFFSET SECTOR ; ʹÿÉNNNNNNNNNNNNNNNNN¡¡¡þ¨NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûDIOB ;USE DISPLAY IOPB DATA FUNCTION CALL XMROM ; ; QUERY USER FOR OPTION ; LD HL,DSKEB CALL EDITOR ; ; GET USER ‘àþ9NNNNNNNNNNNNNNNN¡¡¡þ õcNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûSAGE ; DO_ERR: LD HL,WP_ERM CALL EDITOR JR IOPBDMP ;*****************************************************************ZžÿÎNNNNNNNNNNNNNNNNN¡¡¡þÕNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++ ; ; EXECUTE THE IOPB PRIMITIVE ; EXIT - A= 0: OK, /0: ERROR ; ;+++++++++++++++++++++++++++++++++++++++++++~ÿáNNNNNNNNNNNNNNNN¡¡¡þ:ÔNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; JADE 8" FLOPPY DISK DRIVER FUNCTION ; ENTRY- IY= DRIVERÍáÿäNNNNNNNNNNNNNNNNN¡¡¡þ�rNNNNNNNNNNNNNNNNNNNNNN¡¡¡û POP HL LD DE,DPB_SKT ADD HL,DE ; LD DE,(IOPB + PB_SECO) ;SAVE CURRENT SECTOR FOR RESTORATION PUSH DE ; LD A,(IY + ]�ÿòNNNNNNNNNNNNNNNN¡¡¡þ%z,NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûTION DISPATCHER ; ENTRY- C= FUNCTION # ; EXIT - A= -1: ERROR, 0: OK ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++S!þNNNNNNNNNNNNNNNNNN¡¡¡þ+Y#NNNNNNNNNNNNNNNNNNNNNN¡¡¡û################################### ; ; BIOS FUNCTION TABLE ; ;#############################################################yzÿBNNNNNNNNNNNNNNNN¡¡¡þå]NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLD HL,(IOPB + PB_SECO) LD A,L ADD A,(IX + DDT_SOF) LD L,A LD A,H ADC A,(IX + DDT_SOF + 1) LD H,A LD (IOPB + PB_SECS—ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ –NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRESPONSE ; CALL CI ;GET USER RESPONSE ; PUSH AF ;SAVE CHAR LD C,A ;ECHO CHAR CALL COC CALL CRLF ;NEW LINE POP 2Ãþ$NNNNNNNNNNNNNNNN¡¡¡þ 0NNNNNNNNNNNNNNNNNNNNNN¡¡¡û*********** ; ; SET 3740 SECTOR TRANSLATION PROCEDURE ; ENTRY- (CUR_DPH)= MUST BE PTR TO DPH ; EXIT - DE, HL= ? ; ;*******�[ÿrNNNNNNNNNNNNNNNN¡¡¡þLˆNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û+++++++++++++++++++++++++++++++++ ; XPRIM: ; ; EXECUTE THE PRIMITIVE IN ROM ; LD A,(BUF_DMAB) ;PRESET IOPB BANK LD E,gnþrNNNNNNNNNNNNNNNN¡¡¡þo‡NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û TABLE PTR ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; F# ÿ“NNNNNNNNNNNNNNNNN¡¡¡þ …ÙNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDPB_SKT) ;IF 1ST ENTRY == 0 THEN NONE OR A,A ; (ILLEGAL SECTOR) JR Z,NOSKEW ; DEC DE ;ELSE USE SECTOR TO INDEX INTO ½¯ÿùNNNNNNNNNNNNNNNN¡¡¡þ&/NNNNNNNNNNNNNNNNNNNNNNð¡¡¡û+++++++++++++++++++++++ ; BIOFUNC: ; ; SELECT FUNCTION ; LD A,C CP A,1 JR C,RETVERS ; JR Z,RETDVRTF ; ; ERRO3$þBNNNNNNNNNNNNNNNN¡¡¡þ,À´NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û############### ; BFUNTBL: DW RETVERS ;0:RETURN VERSION # DW RETDVRTF ;1:RETURN DISK PHYSICAL CONFIGURATION TABLE PTR MA� ÿòNNNNNNNNNNNNNNNN¡¡¡þÖlNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûO),HL ; ; SET PHYSICAL DRIVE ; LL_DO: LD A,(IX + DDT_DRV) LD (IOPB + PB_DRVO),A ; ; FETCH DRIVER VECTOR & EXECUTE DIU¶ÿNNNNNNNNNNNNNNNNNN¡¡¡þ 9§NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAF ; AND A,5FH ;INSURE UPPER CASE ; ; IF RETRY THEN TRY AGAIN ; CP A,'R' ;IF RETRY THEN RETURN TO CALLER JR Z,LL_O„ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ“NNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************************************************************* ; TR8: LD DE,SDTRAN ; SETTR: LD HL,(CUR_DPH) LD (H3ªþrNNNNNNNNNNNNNNNN¡¡¡þ¹NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA ; LD HL,IOPB CALL MR_XIOB ;EXECUTE THE FUNCTION ; OR A,A ;FUNCTION ERR? RET NZ ; ; RETURN THE COMMAND RESULTS ‚ºþNNNNNNNNNNNNNNNNNN¡¡¡þ\¶NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD8EXEC: ; ; SELECT SIDE FROM TRACK BIT 0 ; LD HL,(IOPB + PB_TRKO) ;FETCH CURRENT TRACK PUSH HL ;SAVE CURRENT TRACK FOÿªþHNNNNNNNNNNNNNNNNN¡¡¡þ!¶èNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTABLE LD D,0 ADD HL,DE LD A,(HL) ;FETCH TRANSLATED SECTOR # FROM TABLE LD (IOPB + PB_SECO),A ; NOSKEW: ; ; EXECUciÿùNNNNNNNNNNNNNNNNN¡¡¡þ'NNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûR ; LD A,-1 RET IF 0 ; ; IF FUNCTION # NOT IN TABLE THEN RETURN -1 ; LD A,C CP A,MAXFUNCS LD A,-1 RET NC §Cÿ�NNNNNNNNNNNNNNNN¡¡¡þ-ó…NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûXFUNCS EQU ($ - BFUNTBL) / 2 ENDIF ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; (ƒÿrNNNNNNNNNNNNNNNN¡¡¡þOûNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûSK DRIVER ; LL_OPLP: LD HL,LL_OPRET ;PUT RETURN ADDRESS ON STACK PUSH HL ; LD L,(IX + DDT_EXE) ;FETCH DRIVER ADDRESS FÿÜÿÂNNNNNNNNNNNNNNNN¡¡¡þ lôNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûPLP ; ; ELSE IF ABORT THEN DO WARM BOOT ; CP A,'A' ;IF ABORT THEN RE-BOOT JP Z,0 ; ; ELSE IF DEBUGGER THEN EXECUTEšéþBNNNNNNNNNNNNNNNNN¡¡¡þ€LNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûL),E INC HL LD (HL),D RET ;**************************************************************************** ; ; SET NO ¬ÆþBNNNNNNNNNNNNNNNN¡¡¡þ*êNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSTATUS ; LD A,(IOPB + PB_STATO) OR A,A RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++†}ÿ�NNNNNNNNNNNNNNNNN¡¡¡þÅ!NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûR RESTORATION ; LD A,(IX + DDT_HDS) ;IF HEADS == 1 THEN SKIP MODIFICATION DEC A JR Z,FD8SNGL ; LD A,(IOPB + PB_SECO + °öþrNNNNNNNNNNNNNNNN¡¡¡þ"ã»NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTE THE IOPB ; CALL XPRIM ; ; RESTORE THE MODIFIED IOPB SO RETRY WILL WORK ; POP HL ;RESTORE ORIGINAL SECTOR RES 7,õ†ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ( pNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ; ELSE COMPUTE TABLE ENTRY ; PUSH HL ;SAVE POSSIBLE DATA ; LD HL,BFUNTBL LD A,C ADD A,A ADD A,L LD L,A LD 1¬ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ.¦ÖNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûRETURN BIOS VERSION # FUNCTION #0 ; EXIT - HL= VERSION # IN BINARY {0.00,..655.35} ; ;+++++++++++++++++++++++++++++++++++++++ ÕÿdNNNNNNNNNNNNNNNNN¡¡¡þ|ÊNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûROM TABLE LD H,(IX + DDT_EXE + 1) JP (HL) ; ; DRIVER RETURNS HERE ; LL_OPRET: ; ; IF NO ERRORS THEN RETURN ZF ; RìþHNNNNNNNNNNNNNNNNN¡¡¡þ _ÅNNNNNNNNNNNNNNNNNNNNNN¡¡¡û IT ; CP A,'M' JP Z,MR_BRK ; ; ELSE IF IGNORE THEN RETURN NO ERROR ; SUB A,'I' ;IF IGNORE THEN RETURN NO ERROR REžáþ$NNNNNNNNNNNNNNNNN¡¡¡þ³}NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSECTOR TRANSLATION PROCEDURE ; EXIT - HL, DE= ? ; ;***************************************************************************þNNNNNNNNNNNNNNNN¡¡¡þÛNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û++++ ; ; HARD DISK DRIVER FUNCTION ; ENTRY- IX= DRIVER TABLE PTR ; EXIT - A= 0: OK; /0: ERROR ; ;+++++++++++++++++++++++++Q[þ NNNNNNNNNNNNNNNN¡¡¡þöNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û1) ADD A,A ;BIT 15 -> BIT_BUCKET ; SRL H RR L RRA ;TRK BIT 0 -> SECTOR BIT 15 LD (IOPB + PB_SECO + 1),A ; LD ÉÐÿÂNNNNNNNNNNNNNNNN¡¡¡þ#ЊNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûH ;CLEAR SIDE BIT 1ST LD (IOPB + PB_SECO),HL ; POP HL ;RESTORE ORIGINAL TRACK LD (IOPB + PB_TRKO),HL ; ; DONE ; O¼ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ)?ANNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA,0 ADC A,H LD H,A ; ; EXECUTE TABLE ADDRESS ; LD A,(HL) INC HL LD H,(HL) LD L,A ; EX (SP),HL ;PUT CALLER'S®»ÿ“NNNNNNNNNNNNNNNNN¡¡¡þ/•çNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++ ; RETVERS: LD HL,VERSN XOR A,A ;RETURN NO ERROR RET ;++++++++++++++++++++++SÅÿòNNNNNNNNNNNNNNNN¡¡¡þ)™NNNNNNNNNNNNNNNNNNNNNN¡¡¡û RET Z ;IF NO_ERROR THEN RETURN ; ; PRINT ERROR ; IOPBDMP: LD A,(BUF_DMAB) ;SET BANK LD E,A ; LD HL,IOPB LD A,MF_B‘ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ ÆRNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûT Z ; ; ELSE RETURN ERROR TO BDOS ; LD A,-1 ;RETURN -1 TO BDOS OR A,A RET ; ; ; DISPLAY WRITE PROTECT ERROR MES†(ÿáNNNNNNNNNNNNNNNN¡¡¡þæ.NNNNNNNNNNNNNNNNNNNNNN¡¡¡û** ; TRNONE: LD DE,0 JR SETTR SUBTTL HARD DISK ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++qÿäNNNNNNNNNNNNNNNNN¡¡¡þ åNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++ ; HDEXEC: EQU XPRIM SUBTTL JADE FLOPPY DRIVER ROUTINES ;+++++++++++EfþBNNNNNNNNNNNNNNNN¡¡¡þ£CNNNNNNNNNNNNNNNNNNNNNN¡¡¡û(IOPB + PB_TRKO),HL ;TRACK = RESIDUAL ; ; IF SKEW ENABLED THEN TRANSLATE IT ; FD8SNGL: PUSH IY ;CALCULATE PTR TO TABLE RÿÈNNNNNNNNNNNNNNNNN¡¡¡þ$INNNNNNNNNNNNNNNNNNNNNN¡¡¡û RET SUBTTL BIOS FUNCTION CALLS ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; FUNCÆÿçNNNNNNNNNNNNNNNNN¡¡¡þ*jNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DATA IN HL, FUNCTION ADDR ON RET ; STACK, EXECUTE FUNCTION ADDRESS ON STACK ;#########################################öNÿÉNNNNNNNNNNNNNNNNN¡¡¡þ0†ªNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN DRIVER TABLE PTR FUNCTION #1 ; ENTRY- E= DRIVE # ; EXIT - ,ÿÈNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÈNNNNNNNNN�Î�›‚hƒ6„…Ò… †n‡=ˆ ‰Ù‰¦Št‹AŒ�Û�©Žw�E�‘㑱’“M”•蕵–ƒ—P˜™í™¼šŠ›Xœ%�ó�ÀžŽŸ\ *¡ø¡Å¢“£`¤.¥ü¥Ê¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þâNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûE:HL= DRIVER TABLE BASE PTR ; NZ= ILLEGAL DRIVE REQUESTED (HL=0) ; A, B, C= ? ; ;+++++++++++++++++++++++++++++++++++++++++2QÿdNNNNNNNNNNNNNNNNN¡¡¡þ¶DNNNNNNNNNNNNNNNNNNNNNN¡¡¡û,RETDV2 ; LD HL,0 OR A,A ;SET NZ RET ; ; ; ELSE COMPUTE TABLE PTR ; RETDV2: LD B,C LD DE,DDT_SIZ ; RETDVL: AD;ÿNNNNNNNNNNNNNNNN¡¡¡þ Y�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL ADDITIONAL FUNCTIONS TO SUPPORT CDOS PROGRAMS ;*************************************************************************** ;·ÿÂNNNNNNNNNNNNNNNN¡¡¡þyóNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLS ; CP A,8DH ;IF RETURN VERSION THEN RETURN IT JR Z,RETCVER ; CP A,90H ;IF NOT CLOCK THEN ERR JR C,ILLEGC ; JR Z~åÿrNNNNNNNNNNNNNNNN¡¡¡þ–8NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++ ; RETCVER: LD B,1 RET SUBTTL CLOCK ROUTINES ;+++++++++++++++++++++++++++++++++++++++++–PÿÉNNNNNNNNNNNNNNNNN¡¡¡þ<žNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR ROM EXECUTER ; ENTRY- A= FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; XMRá†ÿ„NNNNNNNNNNNNNNNN¡¡¡þ%ÖÀNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; CONSOLE OUTPUT ; ENTRY- C= CHAR TO OUTPUT ; ;****************************************************************************ŸÝþNNNNNNNNNNNNNNNNNN¡¡¡þ+õÏNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRIVER ; ENTRY- C= CHAR TO OUTPUT ; ;**************************************************************************** ; LO: LDSiÿ9NNNNNNNNNNNNNNNN¡¡¡þI±NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++ ; RETDVRTF: ; ; ADJUST REGISTER ; LD C,E ; ; FALL INTO LOCAL ENTRY ; ;+++sÿNNNNNNNNNNNNNNNNNN¡¡¡þ¦zNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD HL,DE DJNZ RETDVL ; LD A,(BUF_DMAB) LD E,A ; ; RETURN NO ERROR ; XOR A,A RET ;+++++++++++++++++++++++++++ÖµÿÈNNNNNNNNNNNNNNNN¡¡¡þ ÜNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; SYSTEM CALL INTERCEPT ROUTINE CHECKS FOR ILLEGAL BDOS CALLS & ; PRINTS MESSAGE IF ILLEGAL. ALSO IMPLEMENTS CDOS CLOCK/CALEVóÿùNNNNNNNNNNNNNNNN¡¡¡þàdNNNNNNNNNNNNNNNNNNNNNN¡¡¡û,CLKCAL ;IF CALENDAR THEN GET IT ; CP A,92H JR Z,CLKTIM ;IF TIME THEN GET IT ; ; ILLEGAL SYSTEM CALL ; ILLEGC: PUSH BCvPÿòNNNNNNNNNNNNNNNN¡¡¡þÃkNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++ ; ; RETURN CALENDAR FUNCTION 90H ; EXIT - A= DAY ; B= MONTH ; C= YEAR ; L= DAY OF W ÿNNNNNNNNNNNNNNNNN¡¡¡þ )5NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOM: EQU MR_FUN SUBTTL CHAR I/O ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ÿBNNNNNNNNNNNNNNNN¡¡¡þ&ƒ“NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; COC: LD A,MF_CO JP XMROM ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; READE�©ÿùNNNNNNNNNNNNNNNN¡¡¡þ,lXNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û A,MF_LO JP XMROM ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN LIST DEVICE 0gÿòNNNNNNNNNNNNNNNN¡¡¡þz€NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN DRIVER TABLE PTR FUNCTION ; ENTRY- C= DRj¡ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ •KNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++ ; ; GET BANK NUMBER FUNCTION ; EXIT - A= BANK # ; ;++++++++++++++++++++++µ‚ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ?íNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNDAR ; SYSTEM CALLS FOR ASMB. ; ;*************************************************************************** INTCPT: LD A,CQ±ÿòNNNNNNNNNNNNNNNN¡¡¡þÓUNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;SAVE FUNCTION # ; ; OUTPUT WARNING MESSAGE ; LD HL,ISCMSG ;OUTPUT WARNING CALL EDITOR ; ; OUTPUT FUNCTION # ; å²ÿÎNNNNNNNNNNNNNNNNN¡¡¡þðZNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEEK ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKCAL: LD A,MF_GCAL JP XMROM CKÿNNNNNNNNNNNNNNNNNN¡¡¡þ!NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; CONSOLE INPUT ; EXIT - A= CHAR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CI: LK¼ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ'°¢NNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡ûR DRIVER - DUMMY ; EXIT - A= CTRL-Z ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; READE@+ÿçNNNNNNNNNNNNNNNN¡¡¡þ-_iNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSTATUS ; EXIT - A= 0: BUSY, FFH:READY ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; LISM ÿNNNNNNNNNNNNNNNN¡¡¡þãNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIVE # ; EXIT - E:HL= DRIVER TABLE BASE PTR ; NZ= ILLEGAL DRIVE (HL= 0) ; A, B, C= ? ; ;++++++++++++++++++++++++++++++++++nHÿ!NNNNNNNNNNNNNNNN¡¡¡þ ÀNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; GETBNK: LD A,MF_GBNK JP MR_FUN SUBTTL NON-DISK PROCEDURES xgÿ9NNNNNNNNNNNNNNNNN¡¡¡þ, NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ;CHECK CALL VALIDITY CP A,41 ;IF <= 40 THEN OK ; BDOSV EQU $ + 1 JP C,BDOS + 11H ;THIS ADDR MODIFIED BY WARM BOOT RTN ÍKÿÂNNNNNNNNNNNNNNNN¡¡¡þ†NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û POP BC LD A,MF_PHXB CALL XMROM ; ; OUTPUT NEW LINE ; CALL CRLF ; ; RETURN NULLS ; XOR A,A ;BC = HL = A = 0 Ü„ÿÎNNNNNNNNNNNNNNNNN¡¡¡þiÍNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN TIME FUNCTION 92H ; EXIT - A= SECONçµÿ„NNNNNNNNNNNNNNNN¡¡¡þ"OWNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD A,MF_CI JP XMROM ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN CONSOLE STA³ÿòNNNNNNNNNNNNNNNNN¡¡¡þ( œNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR: LD A,CTRLZ ;FAKE EOF ; ; FALL INTO PUNCH RETURN ; ;***************************************************************Õ�ÿ�NNNNNNNNNNNNNNNNN¡¡¡þ. :NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTST: LD A,MF_LOS JP XMROM ;**************************************************************************** ; ; MESSAGE E±[þHNNNNNNNNNNNNNNNNN¡¡¡þÐ&NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++ ; RETDVRT: ; ; ASSUME DRIVE 0 ; LD HL,DDT_0 ;START AT 1ST TABLE ; ; IF DÏ&ÿNNNNNNNNNNNNNNNNNN¡¡¡þ ó)NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û ;*************************************************************************** ; ; NEWLINE PROCEDURE ; ;*********************îÿINNNNNNNNNNNNNNNNN¡¡¡þ‘NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ; THE FOLLOWING CONDITIONAL JUMP IS MODIFIED TO AN UNCONDITIONAL JUMP BY ; THE WARM BOOT ROUTINE IF THE CLOCK/CALENDAR BOA5ÿüNNNNNNNNNNNNNNNN¡¡¡þµ7NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û LD L,A LD H,A LD C,A LD B,A RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ËæÿÂNNNNNNNNNNNNNNNN¡¡¡þZüNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDS ; B= MINUTES ; C= HOURS ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKTIM: L€ëÿÂNNNNNNNNNNNNNNNN¡¡¡þ#|fNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTUS ; EXIT - A= 0: NOT READY ; FFH: CHAR READY ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ÁSÿHNNNNNNNNNNNNNNNNN¡¡¡þ)“­NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û************* ; ; PUNCH DRIVER ; ENTRY- C= CHAR TO OUTPUT ; ;**************************************************************1àÿ“NNNNNNNNNNNNNNNNN¡¡¡þ/9 NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDITOR ; ENTRY- HL= TEXT PTR (BIT 7= 1: TERMINATOR) ; EXIT - REGS= ? ; ;*****************************************************«nÿòNNNNNNNNNNNNNNNN¡¡¡þ…uNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRIVE == 0 THEN ALREADY THERE ; LD A,C OR A,A RET Z ; ; ELSE IF ILLEGAL DRIVE THEN RETURN ERROR ; CP A,NDRVS JR C×<ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ j¾NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û****************************************************** ; CRLF: LD C,CR CALL COC LD C,LF JP COC IF INTCPTS SUBTTö}ÿÂNNNNNNNNNNNNNNNN¡¡¡þJÂNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûRD IS NOT PRESENT ; IF NOT MODIFIED, THEN IT IS ALLWAYS FALSE (NOP). ; INHCLK: JR C,ILLEGC ; ; NOW CHECK FOR EXTENDED CALÑ�ÿNNNNNNNNNNNNNNNNN¡¡¡þ¥ NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; CDOS RETURN VERSION FUNCTION ; MAKES CLOCK/CALENDAR WORK. ; EXIT - B= 1 ; ;++++++++++++++++++++++++++++++++++++++++++++++ NÿòNNNNNNNNNNNNNNNN¡¡¡þ¯NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûD A,MF_GTIM JP XMROM ENDIF ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; MONITO¥¦ÿ�NNNNNNNNNNNNNNNNN¡¡¡þ$åñNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++ ; CNSCK: LD A,MF_CIS JP XMROM ;**************************************************************************** ;ÌÿÎNNNNNNNNNNNNNNNNN¡¡¡þ*ÆþNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************** ; PUNCH: RET ;**************************************************************************** ; ; PRINTER D÷ÿäNNNNNNNNNNNNNNNNN¡¡¡þ0*FNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*********************** ; EDITOR: CALL GETBNK LD E,A LD A,MF_PUTS JP XMROM SUBTTL INITIALIZED DATA ;###########ß+þHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÎNNNNNý€Ë�™‚fƒ4„…Ï…œ†j‡8ˆ‰Ó‰ Šn‹<Œ �×�¥Žs�@�‘Þ‘­’z“H”•ã•°–~—K˜™ç™¶š„›Rœ �î�¼ž‹ŸY '¡õ¡Ã¢‘£^¤,¥ú¥È¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ+ÒNNNNNNNNNNNNNNNNNNNNNN¡¡¡û################################################################# ; ; 3740 SECTOR TRANSLATION TABLE ; **** CP/M SINGLE DENSITL±ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ�tNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûAGS BIT DEF. ; 0 1: INHIBIT LOGON ; 1..3 PARTITION # {0,..7} DDT_HDB EQU 4 ;1: HARD DISK DRIVE ; DDT_DRV DS 1 ;PK­þ NNNNNNNNNNNNNNNN¡¡¡þ n¿NNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@ ; ALLDRV MACRO #DADD,#PD,#FLG,#DPB,#DPH,#HDS,#SOF DW #DADD ;DRIVER EXECUTION ADDR DB #FLG ;FLA$fÿùNNNNNNNNNNNNNNNN¡¡¡þNÃNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DDT_2: ALLDRV HDEXEC,4,10H,D2DPB,D2DPH,4,0 ; D DDT_4: ALLDRV FD8EXEC,0,0,D4DPB,D4DPH,1,0 ; E DDT_5: ALLDRV FD8EXEC,1,0r­þ9NNNNNNNNNNNNNNNN¡¡¡þ¡NNNNNNNNNNNNNNNNNNNNNN¡¡¡û_ERM: DM CR,LF,'W-PROT Error!' ; IF INTCPTS ISCMSG: DM CR,LF,'ILL SYS CALL, #= ' ENDIF ;#########################²þNNNNNNNNNNNNNNNNN¡¡¡þ ®NNNNNNNNNNNNNNNNNNNNNN¡¡¡û########################################################################## ; ; DEFAULT 8" HARD DISK PARAMETER BLOCK ; ;#####®ëÿòNNNNNNNNNNNNNNNN¡¡¡þ%áðNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û################################ ; ; DRIVE PARAMETER HEADER AREA ; 1 PER DRIVE ; ;#########################################&ÿœNNNNNNNNNNNNNNNN¡¡¡þ+ÂÿNNNNNNNNNNNNNNNNNNNNNN¡¡¡û D#D(DD)ALL ;;DRIVE CLUSTER ALLOCATION BIT MAP PTR LIST OFF ENDM ; ; DEFINE THE DATA ; DD DL 1 REPT NDRVS LIST OFFÑÝþBNNNNNNNNNNNNNNNN¡¡¡þ~�NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûY **** ; ;############################################################################ ; SDTRAN: GXLATE 26,6 ;#########Ç´ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ‘JNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûHYSICAL DRIVE # DDT_DPB DS 2 ;DPB ADDRESS FOR THIS DRIVE DDT_DPH DS 2 ;DPH ADDRESS FOR THIS DRIVE ; ; THE FOLLOWING MAY BE(ûþNNNNNNNNNNNNNNNN¡¡¡þ;ìNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûGS DB #PD ;MONITOR PHYSICAL DRIVE # DW #DPB ;DISK PARAMETER BLOCK PTR DW #DPH ;DISK PARAMETER HEADER PTR DB #HDS ;HE:ÿÂNNNNNNNNNNNNNNNN¡¡¡þ×TNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û,D5DPB,D5DPH,1,0 ENDIF IF BOOT = 3 ; A DDT_0: ALLDRV FD8EXEC,0,0,D0DPB,D0DPH,1,0 ; B DDT_1: ALLDRV FD8EXEC,1,0,Dgpÿ„NNNNNNNNNNNNNNNN¡¡¡þô[NNNNNNNNNNNNNNNNNNNNNN¡¡¡û################################################### ; ; DEFAULT 8" FLOPPY DISK PARAMETER BLOCK ; IBM 3740 SINGLE DENSITY FORM£mÿNNNNNNNNNNNNNNNNN¡¡¡þ NNNNNNNNNNNNNNNNNNNNNN¡¡¡û####################################################################### ; HDPBK: DW 128 ;SECTORS PER TRACK (LOGICAL) (SPT) 86ÿNNNNNNNNNNNNNNNN¡¡¡þ&´£NNNNNNNNNNNNNNNNNNNNNN¡¡¡û################################### ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENE—öþBNNNNNNNNNNNNNNNN¡¡¡þ,[hNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ALLDPH 0123456789ABCDEF DD DL DD + 1 LIST ON ENDM ;################################################################¦ÿ¤NNNNNNNNNNNNNNNN¡¡¡þM°NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û################################################################### ; ; COMMON I/O PARAMETER BLOCK ; ;######################ÔŽþHNNNNNNNNNNNNNNNNN¡¡¡þ ¢{NNNNNNNNNNNNNNNNNNNNNN¡¡¡û BROUGHT OFF DISK DESCRIPTOR OR FROM DEFAULT TABLES ; DDT_HDS DS 1 ;HEADS DDT_SOF DS 2 ;SECTOR OFFSET ; ; DEFINE THE STRUI—ÿ�NNNNNNNNNNNNNNNNN¡¡¡þÝNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûADS DW #SOF ;SECTOR OFFSET ; ENDM IF BOOT = 10H ; A DDT_0: ALLDRV HDEXEC,4,10H,D0DPB,D0DPH,4,0 ; B DDT_1: ALsîÿòNNNNNNNNNNNNNNNN¡¡¡þäeNNNNNNNNNNNNNNNNNNNNNN¡¡¡û1DPB,D1DPH,1,0 ; C DDT_2: ALLDRV HDEXEC,4,10H,D2DPB,D2DPH,4,0 ; D DDT_3: ALLDRV HDEXEC,4,12H,D3DPB,D3DPH,4,8000H ; E AÂÿÎNNNNNNNNNNNNNNNNN¡¡¡þÇjNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAT ; ;############################################################################ ; SD8PBK: DW 26 ;SECTORS PER TRACK DB ‹—þ'NNNNNNNNNNNNNNNNN¡¡¡þ!-4NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDB 5 ;BLOCK SHIFT FACTOR (BSH) DB 31 ;BLOCK MASK (BLM) DB 1 ;NULL MASK (EXM) DW 1015 ;DISK SIZE (CLUSTERS -1) (DSsÆÿNNNNNNNNNNNNNNNNN¡¡¡þ'‡’NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûRATE A DISK PARAMETER TABLE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ALLDPH: â°ÿ“NNNNNNNNNNNNNNNN¡¡¡þ-hYNNNNNNNNNNNNNNNNNNNNNN¡¡¡û############ ; ; LOGON IOPB OVERLAY ; ;############################################################################ ; LOGI>.ÿÂNNNNNNNNNNNNNNNN¡¡¡þÔ'NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û###################################################### ; IOPB: REPT PB_SIZE LIST OFF DB 0 LIST ON ENDM ;#########0ÿœNNNNNNNNNNNNNNNN¡¡¡þ ÷(NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCTURE SIZE ; DDT_SIZ DS 0 ENDM ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; MACRËÿ9NNNNNNNNNNNNNNNNN¡¡¡þ�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLDRV HDEXEC,4,12H,D1DPB,D1DPH,4,8000H ; C DDT_2: ALLDRV HDEXEC,5,10H,D2DPB,D2DPH,4,0 ; D DDT_3: ALLDRV HDEXEC,5,12H,D3DP¢^þBNNNNNNNNNNNNNNNN¡¡¡þ±6NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û DDT_4: ALLDRV HDEXEC,5,10H,D4DPB,D4DPH,4,0 ; F DDT_5: ALLDRV HDEXEC,5,12H,D5DPB,D5DPH,4,8000H ENDIF ;#############þNNNNNNNNNNNNNNNNNN¡¡¡þ^ýNNNNNNNNNNNNNNNNNNNNNN¡¡¡û3 ;BLOCK SHIFT FACTOR DB 7 ;BLOCK MASK DB 0 ;NULL MASK DW 242 ;DISK SIZE -1 DW 63 ;DIRECTORY MAX DB 11000000B ;ALèzþ NNNNNNNNNNNNNNNN¡¡¡þ"xgNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûM) DW 1152 / 2 ;DIRECTORY MAX (DRM) DB 0FFH ;ALLOCATION 0 (AL0) DB 10000000B ;ALLOCATION 1 (AL1) DW 0 ;CHECK SIZËÀþ$NNNNNNNNNNNNNNNNN¡¡¡þ(—¬NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûMACRO #D LIST ON D#D(DD)DPH: ;DRIVE PARAMETER HEADER FOR DRIVE #D(DD) DW 0 ;;SECTOR TRAN TBL (OR 0 IF NO XLATE) DW 0 ÄÑÿÎNNNNNNNNNNNNNNNNN¡¡¡þ.= NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOPB: DB PB_LOGC ;COMMAND DB 0 ;DRIVE DW 0 ;TRACK DW ID_SECT ;SECTOR DB 0 ;FLAGS DW BLKBUF ;DMA DB 0 ;BANK DW 0 ;…�ÿNNNNNNNNNNNNNNNNNN¡¡¡þçNNNNNNNNNNNNNNNNNNNNNN¡¡¡û################################################################### ; ; DISK DRIVER TABLES (DDT) ; ;########################Ç*ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ ÄNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûO TO DEFINE THE DRIVER TABLE RECORD ; ENTRY- #DADD= DRIVER ADDRESS ; #PD= PHYSICAL DRIVE # ; #FLG= DRIVE FLAGS ; #DPB= DP‹±þdNNNNNNNNNNNNNNNNN¡¡¡þ(¡NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûB,D3DPH,4,8000H ; E DDT_4: ALLDRV FD8EXEC,0,0,D4DPB,D4DPH,1,0 ; F DDT_5: ALLDRV FD8EXEC,1,0,D5DPB,D5DPH,1,0 ENDIF ¡«ÿbNNNNNNNNNNNNNNNN¡¡¡þ‚NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û############################################################### ; ; MESSAGES ; ;##########################################¶.ÿ„NNNNNNNNNNNNNNNN¡¡¡þmÌNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLOC 0 DB 0 ;ALLOC 1 DW 16 ;CHECK SIZE DW 2 ;TRACK OFFSET DB 0 ;PHYSICAL RECORD SHIFT FACTOR DB 0 ;PHYSICAL RECORD®3þBNNNNNNNNNNNNNNNN¡¡¡þ#KVNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE (CKS) DW 2 ;TRACK OFFSET (OFF) DB 1 ;PHYSICAL RECORD SHIFT FACTOR (PSH) DB 1 ;PHYSICAL RECORD MASK (PRM) DW 0 v¼þ$NNNNNNNNNNNNNNNNN¡¡¡þ)¤�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û;;SCRATCH AREA DW 0 ;;" DW 0 ;;" DW DIRBF ;;DIRECTORY BUFFER PTR DW D#D(DD)DPB ;;DRIVE PARAMETER BLK PTR IF (DSK_�ÓÿòNNNNNNNNNNNNNNNNN¡¡¡þ/;NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCOUNT ; WR_PROT DB -1 ;/0: WRITE PROTECTION ENABLED ; ; LAST OF INITIALIZED CODE READ FROM DISK ; BIOSND EQU $ S9ðÿòNNNNNNNNNNNNNNNN¡¡¡þ²ENNNNNNNNNNNNNNNNNNNNNN¡¡¡û#################################################### ; STRUCT 0 DDT_EXE DS 2 ;START ADDRESS OF DISK DRIVER DDT_FLG DS 1 ;FL¹2þBNNNNNNNNNNNNNNNN¡¡¡þ ]ŽNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûB ADDRESS ; #DPH= DPH ADDRESS ; #HDS= HEADS ; #SOF= SECTOR OFFSET ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@R1þBNNNNNNNNNNNNNNNN¡¡¡þ}òNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û IF BOOT = 11H ; A DDT_0: ALLDRV HDEXEC,6,10H,D0DPB,D0DPH,4,0 ; B DDT_1: ALLDRV HDEXEC,6,12H,D1DPB,D1DPH,4,8000H ; C@lÿäNNNNNNNNNNNNNNNNN¡¡¡þ’9NNNNNNNNNNNNNNNNNNNNNN¡¡¡û################################## ; MSGLE: DM CR,LF,'LOAD ERROR' ; DSKEB: DM CR,LF,'Abort, Ignore, Retry, (BDOS) - ' ; WPOþrNNNNNNNNNNNNNNNN¡¡¡þ8ŸNNNNNNNNNNNNNNNNNNNNNN¡¡¡û MASK DW 0 ;LOGICAL DRIVE SECTOR OFFSET DB 0 ;SKEW = 0 ; ; DEFAULT DISK PHYSICAL PARAMETERS ; DB 1 ;HEADS ;##¼ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ$ÒÁNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;LOGICAL DRIVE SECTOR OFFSET (SOF) DB 0 ;SKEW = 0 ; ; ; DB 4 ;HEADS ;############################################žgþNNNNNNNNNNNNNNNNNN¡¡¡þ*ñÎNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û#D(DD) AND 0F0H) = 10H DW 0 ;;NO CHECKS ON HARD DISK ELSE DW D#D(DD)CHK ;;DRIVE DISK CHECKSUMS ARRAY PTR ENDIF DW¹ÿ¯NNNNNNNNNNNNNNNNN¡¡¡þ0vNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûUBTTL UNINITIALIZED DATA AREA ;############################################################################ ; ; THE FOLLOWIÀNÿÈNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÈNNNNNNNNN�Ï�œ‚iƒ7„…Ò… †m‡<ˆ ‰×‰¤Šr‹@Œ�Û�ªŽx�F�‘㑱’“M”•é•¶–„—R˜!™ï™½š‹›Yœ'�õ�Þ’Ÿ` .¡ü¡Ê¢˜£e¤4¥¦Ð¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þjVNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNG DATA MUST RESIDE IN THIS ORDER TO MATCH THE IOPB DATA ; ;##################################################################ÿÉNNNNNNNNNNNNNNNNN¡¡¡þÀðNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûUFFER DPB PTR ; RSFLAG: DS 1 ;0: NO PREREAD REQ'D, /0: PREREAD REQ'D READOP: DS 1 ;0: WRITE OPERATION, 1: READ OPERATION WRTÚÿòNNNNNNNNNNNNNNNN¡¡¡þ /;NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPTR CUR_DPH DS 2 ;DPH PTR ; LOGRQ: DS 1 ;LOG ON REQUEST REG. ;##########################################################¤®ÿÂNNNNNNNNNNNNNNNN¡¡¡þGNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û_#D(DD) AND 0F0H) = 0 D#D(DD)ALL: DS 75 ;ALLOCATION BIT MAP FOR 8" FLOPPY DRIVE #D(DD) D#D(DD)CHK DS 64 ;DIRECTORY CHECKSUM+°ÿòNNNNNNNNNNNNNNNN¡¡¡þàŒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûXTENT MASK ; DSM < 256 : 1K= 0, 2K= 1, 4K= 3, 8K= 7, 16K= 15 ; DSM > 255 : 2K= 0, 4K= 1, 8K= 3, 16K= 7 DPB_DSM DS 2 ;DSJ‡ÿ“NNNNNNNNNNNNNNNNN¡¡¡þJ*NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ADDITIONAL DISK PARTITIONING DATA FOR THE LOGICAL DRIVE SELECTION. ; PARTITIONING BY TRACKS ARE IMPLIMENTED THRU BDOS USING D8”ÿÂNNNNNNNNNNNNNNNN¡¡¡þ% tNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûAL DRIVE 0 ; B SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 0 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; D SIDE 2 & 3 OF €¢ÿNNNNNNNNNNNNNNNNNN¡¡¡þ+ƒ{NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAL DRIVE 1 ; F SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ; G JADE 8" FLOPPY PHYSICAL DRIVE 0 ; H JADE 8" FLOPPY PHYSICAL8ÿùNNNNNNNNNNNNNNNN¡¡¡þ?NNNNNNNNNNNNNNNNNNNNNN¡¡¡û########## ; ; CP/M IOPB OVERLAY ; CPM_DSK DS 1 ;LOGICAL DRIVE CPM_TRK DS 2 ;LOGICAL TRACK NUMBER CPM_SEC DS 2 ;LOGICAL §þHNNNNNNNNNNNNNNNNN¡¡¡þÐÎNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûYPE: DS 1 ;WRITE OPERATION TYPE FROM BDOS: ; 0: WRITE TO ALLOCATED (USED) BLOCK (PREREAD) ; 1: WRITE TO DIRECTORY (PRERE+KÿÉNNNNNNNNNNNNNNNN¡¡¡þzhNNNNNNNNNNNNNNNNNNNNNN¡¡¡û################## ; ; DRIVE ALLOCATION AREAS ; ;#########################################################################¥oÿ9NNNNNNNNNNNNNNNN¡¡¡þ–ÐNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS STORAGE (1 BYTE PER SECTOR) ENDIF LIST OFF ENDM ; ; RESERVE THE DATA SPACE ; DD DL 1 REPT NDRVS LIST OFF AÏÿrNNNNNNNNNNNNNNNN¡¡¡þµßNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûM- DRIVE STORAGE SIZE (IN CLUSTERS) ; INT(((#_TRACKS - OFF) * SPT * BYTES PER SECTOR) / CLUSTER SIZE) -1 DPB_DRM DS 2 ;DRM- ·3ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ _�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPBOFF ABOVE. ; PARTITIONING BY HEADS ARE IMPLIMENTED BY USING THE FOLLOWING DATA. ; (HEAD BITS ARE INCLUDED IN SECTOR WORD UÇ5ÿÂNNNNNNNNNNNNNNNN¡¡¡þ&õ'NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHARD DISK PHYSICAL DRIVE 1 ; E JADE 8" FLOPPY PHYSICAL DRIVE 0 ; F JADE 8" FLOPPY PHYSICAL DRIVE 1 ENDIF IF BOOT =ÕÂÿÂNNNNNNNNNNNNNNNN¡¡¡þ,ìNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DRIVE 1 ENDIF ; ;************************************************************* ; ; REVISION HISTORY: ; ; 3.00 - 26 ì§ÿâNNNNNNNNNNNNNNNN¡¡¡þ 4NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSECTOR NUMBER DS 1 ;FLAGS CPM_DMA DS 2 ;XFER ADDR CPM_DMAB DS 1 ;XFER BANK ; ; ; BUFFER IOPB OVERLAY ; BUF_DSK DS 1 ; «ÿNNNNNNNNNNNNNNNNNN¡¡¡þ ãÿNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûAD & WRITE) ; 2: WRITE TO UNALLOCATED (UNUSED) BLOCK (NO ; PREREAD REQ'D) ; ; UNA_CNT: DS 1 ;# SECTORS REMAINING IN B«ÿ�NNNNNNNNNNNNNNNNN¡¡¡þIYNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û### ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; MACRO TO DEFINE THE DRIVE ALLOCATIONËZÿrNNNNNNNNNNNNNNNN¡¡¡þ¥áNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûLLDAL 0123456789ABCDEF DD DL DD + 1 LIST ON ENDM ;####################################################################ƧÿçNNNNNNNNNNNNNNNNN¡¡¡þ†îNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDIRECTORY SIZE -1 DPB_AL0 DS 2 ;AL0,1- DIRECTORY ALLOCATION ; 1 MSB PER DIRECTORY CLUSTER ALLOCATED DPB_CKS DS 2 ;CKS- # DŠŽÿçNNNNNNNNNNNNNNNNN¡¡¡þ!l°NNNNNNNNNNNNNNNNNNNNNN¡¡¡û TITLE CUSTOMIZED BIOS FOR M5B LIST NOCOND BOOT EQU 3H ;10H: HARD DISK, 3: 8" FLOPPY, 20H: 5" FLOPPY ;*********************ðÿÿ�NNNNNNNNNNNNNNNNN¡¡¡þ'ÆNNNNNNNNNNNNNNNNNNNNNN¡¡¡û 3 ; A JADE 8" FLOPPY PHYSICAL DRIVE 0 ; B JADE 8" FLOPPY PHYSICAL DRIVE 1 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0É›ÿÎNNNNNNNNNNNNNNNN¡¡¡þ-)ÝNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûJAN 87 GRH ; Implemented new common IOPB code & Jade floppy firmware support. ; Implemented disk drive driver tables and new' ÿ9NNNNNNNNNNNNNNNN¡¡¡þ•£NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûBUFFER DISK NUMBER BUF_TRK DS 2 ;BUFFER TRACK NUMBER BUF_SEC DS 2 ;BUFFER SECTOR NUMBER DS 1 ;FLAGS BUF_DMA DS 2 BUF_DMAB &=ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ ¶¬NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLOCK (CLUSTER) UNA_DSK: DS 1 ;LAST UNALLOC DISK UNA_TRK: DS 2 ;LAST UNALLOC TRACK UNA_SEC: DS 2 ;LAST UNALLOC SECTOR ;##˜ùÿùNNNNNNNNNNNNNNNNN¡¡¡þZNNNNNNNNNNNNNNNNNNNNNN¡¡¡û & CHECKSUMS AREA ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; ALL = (DSM / 8) + 1 ; #SECTORS ;CHECK FOR OVERFLOW NXTSEC DL NXTSEC - #SECTORS ;; IF NXTSEC <= LOWEST ;CHECK FOR REPEAT NôþHNNNNNNNNNNNNNNNNN¡¡¡þ�ãNNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------------ ; ; BIOS JUMP VECTOR TABLE ; ;-------------------------------------------------------------------#'ÿÈNNNNNNNNNNNNNNNN¡¡¡þ+ENNNNNNNNNNNNNNNNNNNNNN¡¡¡û AS DEFINED RIGHT BEFORE THE COLD ; INIT ROUTINE START AND MUST BE IN THE 1ST SECTOR. THESE 2 WORDS ARE ; REFERENCED BY THE BO¡OÿÂNNNNNNNNNNNNNNNN¡¡¡þÇýNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û#################################################### ; DIRBF: EQU $ ;BUFFER BEGINNING ;---------------------------------fLÿòNNNNNNNNNNNNNNNN¡¡¡þäòNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûFY COLD START VECTOR TO WARM START ; LD HL,(BIOS+4) LD (BIOS+1),HL ; ; INIT OUR STUFF ; CALL GETBNK LD (BUF_DMAB),Ó$ÿäNNNNNNNNNNNNNNNNN¡¡¡þ ¬NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûE + '0' DB 'K CP/M-80 Vers 2.2',CR,LF DB 'M5b CBIOS Vers ' PVERS VERSN DM CR,LF IF $ > (DIRBF + SECSZ) CONZÿÎNNNNNNNNNNNNNNNNN¡¡¡þ&¤ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDMA),HL ; ; LOG ON DRIVE TO INIT TABLES ; LD A,(BTARG) AND A,3 ;MODULO 4 LD C,A LD E,0 CALL SELDSK LD A,L ;IF˜ÿ9NNNNNNNNNNNNNNNN¡¡¡þ,KÁNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD D,(HL) LD (IOPB + PB_SECO),DE ; INC HL ;FETCH SEGMENT SECTOR COUNT LD A,(HL) LD (SECCNT),A ; INC HL ;SAVE C[Rÿ„NNNNNNNNNNNNNNNN¡¡¡þ]NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûXTSEC DL LOWEST + 1 LOWEST DL NXTSEC ENDIF ENDIF ;; ENDM LIST ON ENDM ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@)®ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ ²ÒNNNNNNNNNNNNNNNNNNNNNN¡¡¡û--------- ; JP INIT1 ;COLD START ENTRY JP WARM ;RELOAD CCP/BDOS JP CNSCK ;GET CONSOLE STATUS JP CI ;CONSOLE INPUT 36ÿNNNNNNNNNNNNNNNNN¡¡¡þtNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOT LOADER CODE IN ORDER TO DETERMINE THE LOAD ADDRESS ; AND LENGTH OF THE BIOS. ; ;##########################################rÿòNNNNNNNNNNNNNNNN¡¡¡þôÌNNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------------------------------- ; ; INIT - COLD START ENTRY FROM BOOT MUST SET ALL BIOS PARAMS ; ;----------m˜ÿçNNNNNNNNNNNNNNNNN¡¡¡þ×ÃNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA ; ; INITIALIZE CLOCK VECTORS IF CLOCK INSTALLED ; LD A,MF_CSYN ;TEST FOR BOARD PRESENT CALL XMROM ; ; IF CLOCK PR_ôÿ�NNNNNNNNNNNNNNNNN¡¡¡þ!=�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûMSG **** WARNING! COLD INIT CODE BIGGER THAN DIR BUFFER **** ELSE DS DIRBF+SECSZ-$ ;FILL OUT DIRECTORY BUFFER TO 1 SECTOR6ïÿ§NNNNNNNNNNNNNNNNN¡¡¡þ'—;NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ERROR THEN ABORT OR A,H JR Z,W_EROR ; ; SETUP IOPB ; LD A,PB_READC LD (IOPB + PB_CMDO),A ; LD A,(BTARG) LD (I*äÿçNNNNNNNNNNNNNNNN¡¡¡þ-xðNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûURRENT DATA PTR LD (LDRPTR),HL ; ; READ SYSTEM ; W_READ: CALL XPRIM LD A,2 JR NZ,W_EROR ;IF ERROR THEN EXIT ; ; ëÿùNNNNNNNNNNNNNNNN¡¡¡þÄŽNNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; INITIALIZE VERSION TEXT IN RAM MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@r<ÿ�NNNNNNNNNNNNNNNNN¡¡¡þ ç�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û JP COC ;CONSOLE OUTPUT JP LO ;PRINTER OUTPUT JP PUNCH JP READER JP HOME ;HOME SELECTED DRIVE JP SELDSK ;SELECT DIQ¦ÿÂNNNNNNNNNNNNNNNNN¡¡¡þ 9NNNNNNNNNNNNNNNNNNNNNN¡¡¡û################################## ; DB 0 ;CPU TYPE (Z80 CPU) DB 0 ;SPARE BIOSSZ: DW BIOSND - BIOS ;BIOS MODULE SIZE IN ( ÿùNNNNNNNNNNNNNNNN¡¡¡þ¡ŸNNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------------------------------------------------------ ; INIT: ; ; SET TEMPORARY STACK ; DI LD SP,DEFBFR ;óþNNNNNNNNNNNNNNNNNN¡¡¡þNTNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûESENT THEN TURN ON CLOCK DRIVE ; OR A,A LD A,38H ;COND. JR (ON) JR Z,CLKON ; ; ELSE TURN OFF CLOCK DRIVE ; LD A,1ÐRþ NNNNNNNNNNNNNNNN¡¡¡þ"hÎNNNNNNNNNNNNNNNNNNNNNN¡¡¡û SIZE ENDIF ;---------------------------------------------------------- ; ; WARM REBOOT ENTRY LOADS CCP,BDOS FROM DISÿòNNNNNNNNNNNNNNNNN¡¡¡þ(‡NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOPB + PB_DRVO),A ; XOR A,A LD (IOPB + PB_FLGO),A ; LD HL,0 LD (IOPB + PB_BCNTO),HL ; LD HL,CCP LD (IOPB + PB_DMAOÁÿÎNNNNNNNNNNNNNNNNN¡¡¡þ.-£NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNEXT SECTOR ; LD HL,(IOPB + PB_SECO) INC HL LD (IOPB + PB_SECO),HL ; LD DE,(IOPB + PB_BCNTO) ;DMA += SECTOR SIZE LD¢ÿNNNNNNNNNNNNNNNNN¡¡¡þ÷¿NNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; PVERS MACRO #VERS DD DL #VERS IF DD > 9999 DB (DD / 10000) + '0' DD DL DD % 10ÄÄÿÎNNNNNNNNNNNNNNNNN¡¡¡þ Ô°NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSK DRIVE JP SETTRK ;SET TRACK # JP SETSEC ;SET SECTOR # JP SETDMA ;SET TRANSFER ADDR JP DISKRD ;PERFORM DISK READ ÛÿÉNNNNNNNNNNNNNNNNN¡¡¡þ8NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBYTES BIOSST: DW BIOS ;BIOS MODULE LOAD ADDR FOR SBD ; ; CONTINUE ON WITH INIT ; INIT1: JR INIT ;##################ö×ÿþNNNNNNNNNNNNNNNNN¡¡¡þ’®NNNNNNNNNNNNNNNNNNNNNN¡¡¡û;USE PAGE 0 FOR STACK LD (THIS_STK),SP EI ; ; UPLOAD BOOT DIRECTORY DATA FOR WARM BOOT ; LD HL,0080H LD A,(HL) ;IF:zÿyNNNNNNNNNNNNNNNN¡¡¡þ}eNNNNNNNNNNNNNNNNNNNNNN¡¡¡û8H ;UNCOND. JR (OFF) (CAUSES JUMP TO ILLEGAL) ; CLKON: LD (INHCLK),A ; ; BOOT CCP & BDOS ; JR WARM ;#############8êÿÂNNNNNNNNNNNNNNNN¡¡¡þ#[ÿNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûK & ; SETS UP VARIABLES ; ;---------------------------------------------------------- ; WARM: ; ; SET TEMPORARY STACK ¥ÜÿÈNNNNNNNNNNNNNNNNN¡¡¡þ)´4NNNNNNNNNNNNNNNNNNNNNN¡¡¡û),HL ; ; IF NO SYSTEM THEN ERROR ; LD HL,BT_DATA LD A,(HL) ;FETCH SEGMENT COUNT OR A,A LD A,1 JR Z,W_EROR ; ; ÷�þHNNNNNNNNNNNNNNNNN¡¡¡þ/’NNNNNNNNNNNNNNNNNNNNNN¡¡¡û HL,(IOPB + PB_DMAO) ADD HL,DE LD (IOPB + PB_DMAO),HL ; ; IF INTO BIOS THEN EXIT ; LD A,H CP A,HIGH BIOS JR NC,WZ  ÿòNNNNNNNNNNNNNNNN¡¡¡þ¢ìNNNNNNNNNNNNNNNNNNNNNN¡¡¡û000 ENDIF IF DD > 999 DB (DD / 1000) + '0' DD DL DD % 1000 ENDIF DB (DD / 100) + '0' DB '.' DB ((DD % 100) ©àÿáNNNNNNNNNNNNNNNN¡¡¡þ M'NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûJP DISKWR ;PERFORM DISK WRITE JP LISTST ;RETURN LIST STATUS JP SECTRN ;TRANSLATE SECTOR JP BIOFUNC ;EXECUTE FUNCTION C&�þBNNNNNNNNNNNNNNNN¡¡¡þm[NNNNNNNNNNNNNNNNNNNNNN¡¡¡û########################################################## ; ; DIRECTORY SECTOR BUFFER STARTS HERE AFTER CRUNCHING COLD START ÏWÿÉNNNNNNNNNNNNNNNNN¡¡¡þ‚�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û > MAX THEN ERROR CP A,6 JP NC,W_EROR ; LD DE,BT_DATA LD BC,BD_SIZE LDIR ; ; INIT DEFAULT DRIVE ; LD A,(BTARG)‡.ÿrNNNNNNNNNNNNNNNN¡¡¡þ(6NNNNNNNNNNNNNNNNNNNNN!ö¡¡¡û############################################################### ; ; SIGN-ON MESSAGE ; ;#####################################'ÖÿçNNNNNNNNNNNNNNNNN¡¡¡þ$ÂhNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; DI LD SP,DEFBFR LD (THIS_STK),SP EI ; ; INIT OUR STUFF ; XOR A,A LD (BUF_ACT),A ;ASSUME NO DATA IN BUFFER ; ü8ÿçNNNNNNNNNNNNNNNNN¡¡¡þ*ágNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ELSE USE DATA TO LOAD SYSTEM ; LD A,(HL) LD (SEGCNT),A ; INC HL ;POINT TO TRACK ; ; TOP OF SEGMENT LOOP ; W_NXŦþINNNNNNNNNNNNNNNNN¡¡¡þ0 ßNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûRPG ; ; ELSE IF SEGMENT_SECTOR_COUNT != EXHAUSTED THEN READ_NEXT_SECTOR ; LD A,(SECCNT) DEC A LD (SECCNT),A JR NZ,WF.þHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNý€Ë�™‚fƒ4„…Ñ…Ÿ†m‡<ˆ ‰Ø‰¥Šs‹@Œ�Û�ªŽy�F�‘䑲’€“N”•ê•·–„—Q˜ ™î™½š‹›Yœ'�õ�ž‘Ÿ_ -¡û¡É¢—£d¤2¥¦Î¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ KNNNNNNNNNNNNNNNNNNNNNN¡¡¡û_READ ; ; ELSE IF SEGMENTS == COMPLETE THEN DONE ; LD A,(SEGCNT) DEC A LD (SEGCNT),A JP Z,WZRPG ; ; ELSE DO NEXkéþNNNNNNNNNNNNNNNNN¡¡¡þ¦íNNNNNNNNNNNNNNNNNNNNNN¡¡¡û JR C,W_LOK ; LD A,L CP A,LOW BIOS LD A,3 JR NZ,W_EROR ; W_LOK: ; ; INIT BIOS WARM START IN PAGE 0 ; LD A,0ÿäNNNNNNNNNNNNNNNN¡¡¡þ I&NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; READ A DISK SECTOR ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++mÿòNNNNNNNNNNNNNNNN¡¡¡þiZNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û JP RW_RET ;**************************************************************************** ; ; WRITE DISK SECTOR FUNCTION ÅþrNNNNNNNNNNNNNNNN¡¡¡þ†‘NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûYPE),A ; ; IF 1ST WRITE TO UNALLOCATED (NEW, UNUSED) BLOCK THEN SET PARAMETERS ; CP A,WRUAL JP NZ,CHKUNA ; ; COUNT èÂþ$NNNNNNNNNNNNNNNNN¡¡¡þ,7NNNNNNNNNNNNNNNNNNNNNN¡¡¡û(UNA_TRK) ;SAME TRACK? LD DE,(CPM_TRK) SBC HL,DE JR NZ,ALLOC ; LD HL,(CPM_SEC) LD DE,(UNA_SEC) SBC HL,DE JR NZ,ALZ ÿòNNNNNNNNNNNNNNNN¡¡¡þ%ÆiNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û LD (UNA_CNT),A ; INC A ;PREREAD FLAG = TRUE LD (RSFLAG),A ; ; ; ; COMMON CODE FOR READ AND WRITE FOLLOWS ; RWOPÿ€ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ+åfNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE IN ANY CASE ; OR A,A JR Z,FILHST ; ; HOST BUFFER ACTIVE, SAME AS SEEK BUFFER? ; LD A,(CPM_DSK) LD HL,BUF_DSK ;SAVþBNNNNNNNNNNNNNNNN¡¡¡þYNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT SEGMENT ; LD HL,(LDRPTR) JR W_NXTSEG ; ; ; WARM BOOT ERROR, OUTPUT MSG & GO TO DEBUGGER ; ENTRY- A= ERROR CODE: ; ëžÿçNNNNNNNNNNNNNNNNN¡¡¡þ¶ÓNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûC3H LD HL,BIOS + 3 LD (PAGE0),A LD (PAGE0 + 1),HL ; ; INIT BDOS CALL VECTOR IN PAGE 0 ; LD HL,BDOS + 6 LD (BDOSJV}Xþ$NNNNNNNNNNNNNNNN¡¡¡þuNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; DISKRD: ; ; SET UP DATA TABLE PTRS ; PUSH IX Lq§ÿÂNNNNNNNNNNNNNNNN¡¡¡þðÍNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ENTRY- C= WRITE TYPE: ; 0: WRITE TO ALLOCATED BLOCK (UPDATE) ; 1: WRITE TO DIRECTORY BLOCK (ALLWAYS WRITE) ; 2: WRITE¬²ÿòNNNNNNNNNNNNNNNN¡¡¡þÓÂNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û= NUMBER_OF_SECTORS_IN_BLOCK ; LD A,(IY + DPB_BLM) ;CUR_DPB.DPBBLM + 1 ::= (BLKSIZ/128) INC A LD (UNA_CNT),A ; ; SET Š™ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ 9œNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûLOC ; ; MATCH, MOVE TO NEXT SECTOR FOR FUTURE REF ; EX DE,HL ;UNASEC += 1 INC HL LD (UNA_SEC),HL ; ; IF PAST LASrRÿ„NNNNNNNNNNNNNNNN¡¡¡þ&“:NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûER: ; ; ASSUME NO ERRORS ; XOR A,A LD (IOPB + PB_STATO),A ; ; COMPUTE BUFFER SECTOR ; LD HL,(CPM_SEC) DEC HL ú‹þBNNNNNNNNNNNNNNNN¡¡¡þ,|ñNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûME DISK? CP A,(HL) JR NZ,NOMATCH ; LD HL,(BUF_TRK) ;SAME TRACK? LD DE,(CPM_TRK) SBC HL,DE JR NZ,NOMATCH ; LD DE,ßäþ NNNNNNNNNNNNNNNN¡¡¡þj)NNNNNNNNNNNNNNNNNNNNNN¡¡¡û 0: SELECT DISK ERROR ; 1: NO SYSTEM SEGMENTS IN BOOT DIRECTORY ; 2: READ ERROR ; 3: BIOS OVERWRITTEN ; 4,5: SPARESçBÿÎNNNNNNNNNNNNNNNNN¡¡¡þ …âNNNNNNNNNNNNNNNNNNNNNN¡¡¡û),A LD (BDOSJV + 1),HL ; ; INIT BIOS CALL VECTOR IN PAGE 0 ; LD HL,BIOFUNC LD (BFUNRSV),A LD (BFUNRSV + 1),HL ; ;xÝþ'NNNNNNNNNNNNNNNNN¡¡¡þ/DNNNNNNNNNNNNNNNNNNNNNNð¡¡¡ûD IX,(CUR_DDT) ; PUSH IY LD IY,(CUR_DPB) ; ; IF NOT BLOCKED THEN USE CPM READ ; LD A,(IY + DPB_PSH) ;0= 128-BYTE SECæÌþrNNNNNNNNNNNNNNNN¡¡¡þÃüNNNNNNNNNNNNNNNNNNNNNN¡¡¡û TO UNALLOCATED BLOCK (NO NEED TO PRE-READ) ; ;**************************************************************************** ;ÜÖÿÎNNNNNNNNNNNNNNNNN¡¡¡þàóNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDISK TO SEEK ; LD A,(CPM_DSK) LD (UNA_DSK),A ; ; SET TRACK TO SEEK ; LD HL,(CPM_TRK) LD (UNA_TRK),HL ; ; SET SÜÙÿ[NNNNNNNNNNNNNNNNN¡¡¡þ! ­NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT SECTOR ON TRACK THEN USE 1ST SECTOR OF NEXT TRACK ; LD E,(IY + DPB_SPT) LD D,(IY + DPB_SPT +1) SBC HL,DE JP C,NOOVF ~šÿ“NNNNNNNNNNNNNNNNN¡¡¡þ'  NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;CONVERT PHYSICAL SECTOR TO LOGICAL ; LD A,(IY + DPB_PSH) ;USE PHYSICAL SHIFT FACTOR (CP/M 3.X) AND A,3 ;LIMIT TO 1024 B}FÿíNNNNNNNNNNNNNNNN¡¡¡þ-OÀNNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡û(BUF_PSEC) ;SAME SECTOR? LD HL,(BUF_SEC) SBC HL,DE JR Z,MATCH ;SKIP IF MATCH ; NOMATCH: ; ; IF BUFFER == DIRTY THENf1ÿÂNNNNNNNNNNNNNNNN¡¡¡þó¾NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; 6..255: SEGMENT COUNT (TOO MANY SEGMENTS) ; W_EROR: PUSH AF ;SAVE ERROR CODE ; LD HL,MSGLE ;OUTPUT ERROR MESSAGE CÍeÿÂNNNNNNNNNNNNNNNN¡¡¡þ бNNNNNNNNNNNNNNNNNNNNNN¡¡¡û SET DEFAULT SECTOR BUFFER ; LD BC,DEFBFR CALL SETDMA ; IF INTCPTS ; ; PUT BDOS VECTOR INTO INTERCEPT CODE ; L>ÕÿòNNNNNNNNNNNNNNNNN¡¡¡þ< NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTORS OR A,A JP Z,DISKRDN ; ; READS DON'T NEED ALLOCATION ; XOR A,A LD (UNA_CNT),A ; ; READ_OPERATION_FLAG = TRU2CÿrNNNNNNNNNNNNNNNN¡¡¡þ–¯NNNNNNNNNNNNNNNNNNNNNN¡¡¡û DISKWR: ; ; REMOVE BOOT WRITE PROTECTION ; XOR A,A LD (WR_PROT),A ; ; SET PTRS TO DISK DATA ; PUSH IX LD IX,Ò§ÿáNNNNNNNNNNNNNNNN¡¡¡þydNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûECTOR TO SEEK ; LD HL,(CPM_SEC) LD (UNA_SEC),HL ; ; IF NO UNALLOCATED SECTORS REMAIN THEN PREREAD ; CHKUNA: LD A,(UNA‰^ÿNNNNNNNNNNNNNNNN¡¡¡þ"_þNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; LD HL,0 ;SECTOR = 1 LD (UNA_SEC),HL ; LD HL,(UNA_TRK) ;TRACK++ INC HL LD (UNA_TRK),HL ; NOOVF: ; ; MATCH FOUXþ$NNNNNNNNNNNNNNNNN¡¡¡þ(°5NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûYTE SECTORS JP Z,NOSECSHF ;IF ALREADY 0 THEN SECTOR SIZE IS 128 ; SECSHFLP: SRL H ;ELSE SHIFT OVER TO PHYSICAL SECTOR Í_ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ.“NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û WRITE IT OUT BEFORE READING NEW ONE ; CALL BUF_FLSH ;CLEAR HOST BUFF ; JR NZ,RW_RET ;IF ERROR THEN ABORT ; FILHST: ; `ÂÿçNNNNNNNNNNNNNNNNN¡¡¡þÀ�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûALL EDITOR ; ; DISPLAY ERROR CODE ; POP AF LD C,A LD A,MF_PHXB CALL MR_FUN ; ; EXECUTE DEBUGGER ; CALL MR_BR-ÿgNNNNNNNNNNNNNNNNN¡¡¡þ ã€NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûD HL,(BDOS + 7) LD (BDOSV),HL ; ; NOW PUT INTERCEPT VECTOR INTO BDOS CODE ; LD HL,INTCPT LD (BDOS + 7),HL ENDIF ;·QÿNNNNNNNNNNNNNNNNN¡¡¡þ8NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûE (1) ; INC A LD (READOP),A ; ; PRE-READ_OF_DATA_FLAG = TRUE ; LD (RSFLAG),A ; ; TREAT AS UNALLOCATED BLOCK ; eôÿöNNNNNNNNNNNNNNNNN¡¡¡þ¥žNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û(CUR_DDT) ; PUSH IY LD IY,(CUR_DPB) ; ; IF NOT BLOCKED THEN USE CPM WRITE ; LD A,(IY + DPB_PSH) ;0= 128-BYTE SECTORSé�ÿ„NNNNNNNNNNNNNNNN¡¡¡þJUNNNNNNNNNNNNNNNNNNNNNNð¡¡¡û_CNT) OR A,A JP Z,ALLOC ; ; ELSE MORE UNALLOCATED RECORDS REMAIN, COUNT-- ; DEC A LD (UNA_CNT),A ; ; IF REQUESTòþBNNNNNNNNNNNNNNNN¡¡¡þ#lÏNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûND, MARK AS UNNECESSARY READ ; XOR A,A ;PREREAD FLAG = FALSE LD (RSFLAG),A JP RWOPER ; ; ; NORMAL NON-BLOCKED WRITE;äÿÈNNNNNNNNNNNNNNNNN¡¡¡þ)ƒNNNNNNNNNNNNNNNNNNNNNN¡¡¡û RR L DEC A JP NZ,SECSHFLP ; NOSECSHF: INC HL ;SET BACK TO PHYSICAL SECTOR LD (BUF_PSEC),HL ;BUFFER PHYSICAL SECTOR T¸éÿÉNNNNNNNNNNNNNNNNN¡¡¡þ/)¢NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; READ THE SECTOR BUFFER ; LD A,(CPM_DSK) ;BUFFER SECTOR = PHYSICAL SECTOR LD (BUF_DSK),A ; LD HL,(CPM_TRK) LD (BUF_ý7ÿùNNNNNNNNNNNNNNNN¡¡¡þ•ÜNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûK HALT ; ; ; BOOT OK, INIT PAGE 0 ; WZRPG: ; ; IF FRONT OF BIOS OVERWRITTEN THEN ERROR ; LD A,H CP A,HIGH BIOSàÿNNNNNNNNNNNNNNNNNN¡¡¡þ zNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; PASS DEFAULT DISK TO CCP ; LD A,(DEFDRV) LD C,A JP CCP SUBTTL BIOS DISK FUNCTION ROUTINES ;+++++++++++++++++J�ÿÂNNNNNNNNNNNNNNNN¡¡¡þZkNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD A,WRUAL LD (WRTYPE),A ; JP RWOPER ;TO PERFORM THE READ ; ; ; NORMAL NON-BLOCKED READ ; DISKRDN: CALL CPM_RD 9ðþINNNNNNNNNNNNNNNNN¡¡¡þµ NNNNNNNNNNNNNNNNNNNNNN¡¡¡û OR A,A JP Z,DISKWRN ; ; READ_OP_FLAG = FALSE ; XOR A,A LD (READOP),A ; ; SAVE WRITE TYPE ; LD A,C LD (WRTNõþrNNNNNNNNNNNNNNNN¡¡¡þNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûED SECTOR != UNALLOCATED SECTOR THEN PURGE ; LD A,(CPM_DSK) ;SAME DISK? LD HL,UNA_DSK CP A,(HL) JR NZ,ALLOC ; LD HL,½YÿÈNNNNNNNNNNNNNNNNN¡¡¡þ$õXNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; DISKWRN: CALL CPM_WR JP RW_RET ; ; ; NOT AN UNALLOCATED RECORD, REQUIRES PRE-READ ; ALLOC: XOR A,A ;COUNT = 0)Æþ'NNNNNNNNNNNNNNNNN¡¡¡þ*ÖWNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûO ACCESS ; ; IF BUFFER == EMPTY THEN READ THE PHYSICAL SECTOR ; LD HL,BUF_ACT LD A,(HL) ; LD (HL),1 ;BUFFER = ACTIVulþINNNNNNNNNNNNNNNNN¡¡¡þ0:ïNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûTRK),HL ; LD HL,(BUF_PSEC) LD (BUF_SEC),HL ; ; IF REQUIRED TO READ THEN READ ; LD A,(RSFLAG) ;NEED TO READ? OR A,fþHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÈNNNNNNNNN�Î�œ‚iƒ6„…Ñ…ž†k‡9ˆ‰Õ‰¢Šp‹=Œ �Ø�§Žv�D�‘ᑯ’}“K”•敳–€—M˜™é™¸š†›Uœ"�ð�½žŒŸZ (¡õ¡Â¢�£]¤+¥ù¥Ç¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þMÏNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûA CALL NZ,BUF_RD ;YES, IF 1 ; ; BUFFER = CLEAN ; XOR A,A LD (BUF_MOD),A ; MATCH: ; ; COPY DATA TO OR FROM BUFF‰ÿ[NNNNNNNNNNNNNNNNN¡¡¡þçiNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFLUSHES ; LD (BUF_DDT),IX LD (BUF_DPB),IY ; EX DE,HL ;SOURCE/DEST SWAP ; RWMOVE: ; ; BC INITIALLY 128, DE IS SOURåAÿòNNNNNNNNNNNNNNNN¡¡¡þ ¢NNNNNNNNNNNNNNNNNNNNNN¡¡¡û** ; ; CPM_WR PERFORMS THE PHYSICAL WRITE FROM CPM_DMA TO THE DISK. ; ENTRY- (CPM_DSK)= DISK # TO WRITE TO ; (CPM_TRK)= TRA|ÿÂNNNNNNNNNNNNNNNN¡¡¡þ(ÞNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ;**************************************************************************** ; CPM_RD2: ; ; SET UP PTRS ; PUSH IXÔäÿ„NNNNNNNNNNNNNNNN¡¡¡þÇNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûOMMON CODE ; CPM_RW: PUSH HL LD HL,CPM_TRK ; ; FALL INTO COMMON XFER CODE ; ;*************************************WµÿÉNNNNNNNNNNNNNNNNN¡¡¡þm³NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûWRITE TO ; (BUF_DDT)= DDT PTR ; (BUF_DPB)= DPB PTR ; EXIT - (IOPB.PB_STATO)= 0: OK, /0: ERROR ; ;************************# ÿòNNNNNNNNNNNNNNNN¡¡¡þ%‡íNNNNNNNNNNNNNNNNNNNNNN¡¡¡û TRACK # TO WRITE TO ; (BUF_SEC)= SECTOR # TO WRITE TO ; IX= DDT PTR ; IY= DPB PTR ; EXIT - (IOPB.PB_STATO)= 0: OK, /0: EXÌþ!NNNNNNNNNNNNNNNN¡¡¡þ+¤âNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRK JP RD_WR ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SELECT DRIVE FUNCTION ; É*ÿÂNNNNNNNNNNNNNNNN¡¡¡þœNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûER ; LD HL,(CPM_SEC) ;CALCULATE INDEX INTO BUFFER DEC HL ;CONVERT TO LOGICAL SECTOR (0..N-1) LD A,L ; AND A,(IY + DPBLÿÈNNNNNNNNNNNNNNNNN¡¡¡þ÷WNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCE, HL IS DEST ; LDIR ; ; DATA HAS BEEN MOVED TO/FROM HOST BUFFER, IF NOT DIRECTORY THEN DELAY WRITE ; LD A,(WRTYPE) ­PÿäNNNNNNNNNNNNNNNN¡¡¡þ]ñNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCK # TO WRITE TO ; (CPM_SEC)= SECTOR # TO WRITE TO ; (CPM_DMA)= XFER ADDRESS ; IX= DDT PTR ; IY= DPB PTR ; EXIT - (IOPBd¼ÿÂNNNNNNNNNNNNNNNN¡¡¡þ±INNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û PUSH IY LD IX,(CUR_DDT) LD IY,(CUR_DPB) ; ; EXECUTE READ SECTOR ; CALL CPM_RD ; ; RESTORE PTRS & RETURN ; Påbÿ NNNNNNNNNNNNNNNN¡¡¡þ’FNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*************************************** ; ; SET UP IOPB FOR EXECUTION ; ENTRY- HL= PTR TO IOPB IMAGE TRACK DATA ; IX= DDT PGPÿäNNNNNNNNNNNNNNNNN¡¡¡þ xNNNNNNNNNNNNNNNNNNNNNN¡¡¡û**************************************************** ; BUF_FLSH: ; ; IF UNMODIFIED THEN RETURN ; LD A,(BUF_MOD) OR A,²ÿáNNNNNNNNNNNNNNNN¡¡¡þ&Ò¾NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRROR ; ;**************************************************************************** ; BUF_WR: ; LD HL,LL_WRIT JP BUF_RT¶ÿáNNNNNNNNNNNNNNNN¡¡¡þ,=uNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLOG-ON - SET DISK PARAMETER BLOCK ; ENTRY- C= DRIVE # ; E= 0 IF NEW SELECT ; EXIT - HL= PTR TO DPT OR 0 FOR ERROR ; ;+++++µãÿòNNNNNNNNNNNNNNNN¡¡¡þ+­NNNNNNNNNNNNNNNNNNNNNN¡¡¡û_PHM) ;USE PHYSICAL RECORD MASK DATA (CP/M 3.X) ; RRA ;BITS <7..1> -> BITS <14..8> LD H,A ; LD A,0 ;BIT 0 -> BIT 7 õÿÎNNNNNNNNNNNNNNNNN¡¡¡þ ÄfNNNNNNNNNNNNNNNNNNNNNN¡¡¡û;IF NOT DIRECTORY THEN DELAY WRITE CP A,WRDIR LD A,(IOPB + PB_STATO) ;RETURN ANY ERRORS ANYWAY JR NZ,RW_RET ; ; IF ERR'‡ÿÎNNNNNNNNNNNNNNNNN¡¡¡þnÀNNNNNNNNNNNNNNNNNNNNNN¡¡¡û.PB_STATO)= 0: OK, /0: ERROR ; ;**************************************************************************** ; CPM_WR: ; ÛÒÿrNNNNNNNNNNNNNNNN¡¡¡þ‚xNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûOP IY POP IX RET ;**************************************************************************** ; ; CPM_RD PERFORMS TH!·ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ¡wNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTR ; IY= DPB PTR ; (SP)= ADDRESS {LL_READ, LLWRIT} OF EXECUTOR ; ;********************************************************WGÿçNNNNNNNNNNNNNNNNN¡¡¡þ!K)NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA RET Z ; ; ELSE SET PTRS TO BUFFER DATA ; PUSH IX PUSH IY LD IX,(BUF_DDT) LD IY,(BUF_DPB) ; ; WRITE THE BUFF€ªÿNNNNNNNNNNNNNNNNN¡¡¡þ'á�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûW ;**************************************************************************** ; ; RDBUF PERFORMS THE PHYSICAL READ FROMY¶ÿçNNNNNNNNNNNNNNNN¡¡¡þ-DNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; SELDSK: ; ; STORE DRIVE # FOR FUTURE USE ; LD�ÿòNNNNNNNNNNNNNNNN¡¡¡þ²:NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û RRA LD L,A ; ; HL HAS RELATIVE HOST BUFFER ADDRESS ; LD DE,BLKBUF ADD HL,DE ;HL = HOST ADDRESS ; LD DE,(CPM_DMAAfÿ!NNNNNNNNNNNNNNNN¡¡¡þ ‘5NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOR THEN ABORT ; OR A,A JR NZ,RW_RET ; ; NO ERROR/DIRECTORY WRITE ; XOR A,A ;BUFFER = CLEAN LD (BUF_MOD),A ; C¢žÿòNNNNNNNNNNNNNNNNN¡¡¡þ}�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLD HL,LL_WRIT JP CPM_RW ;**************************************************************************** ; ; CPM_RD2 PERFOtMþrNNNNNNNNNNNNNNNN¡¡¡þ×+NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE PHYSICAL READ FROM THE DISK INTO CPM_DMA. ; ENTRY- (CPM_DSK)= DISK # TO READ FROM ; (CPM_TRK)= TRACK # TO READ FROM ; (CPÿáNNNNNNNNNNNNNNNN¡¡¡þ8àNNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************** ; RD_WR: LD DE,IOPB + PB_TRKO LD BC,PB_BCNTO - PB_TRKO LDIR ; ; EXECUTE LOW LEVEL READ OR WRITE (s™ÿ NNNNNNNNNNNNNNNN¡¡¡þ"zNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûER DATA ; CALL BUF_WR ; ; RESTORE THE PTRS ; POP IY POP IX ; ; IF ERROR THEN RETURN IT ; OR A,A RET NZ ; ænÿäNNNNNNNNNNNNNNNNN¡¡¡þ(ñ±NNNNNNNNNNNNNNNNNNNNNN¡¡¡û THE HOST DISK INTO BLKBUF. ; ENTRY- (BUF_DSK)= DISK # TO READ FROM ; (BUF_TRK)= TRACK # TO READ FROM ; (BUF_SEC)= SECTOR #m5ÿ^NNNNNNNNNNNNNNNNN¡¡¡þ.[NNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡û A,C LD (CPM_DSK),A ; ; SAVE LOGON REQUEST FLAG ; LD A,E LD (LOGRQ),A ; ; COMPUTE DISK DRIVER TABLE PTR ; CALL¨âþHNNNNNNNNNNNNNNNNN¡¡¡þ� NNNNNNNNNNNNNNNNNNNNNN¡¡¡û) ;GET/PUT CP/M DATA LD BC,128 ;LENGTH OF MOVE ; LD A,(READOP) ;WHICH WAY? OR A,A JP NZ,RWMOVE ;SKIP IF READ ; ; WJÿçNNNNNNNNNNNNNNNNN¡¡¡þ ¢NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûALL BUF_WR ;WRITE TO DISK ; LD A,(IOPB + PB_STATO) ;RETURN ANY ERRORS ; ; DONE, RESTORE & RETURN ; RW_RET: OR A,A ;SE ÿNNNNNNNNNNNNNNNNN¡¡¡þN¼NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRMS THE PHYSICAL READ FROM THE DISK INTO CPM_DMA, ; WITHOUT BLOCKING. ; ENTRY- (CPM_DSK)= DISK # TO READ FROM ; (CPM_TRK)= TÛãÿNNNNNNNNNNNNNNNN¡¡¡þäNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûM_SEC)= SECTOR # TO READ FROM ; (CPM_DMA)= XFER ADDRESS ; IX= DDT PTR ; IY= DPB PTR ; EXIT - (IOPB.PB_STATO)= 0: OK, /0: À ÿ9NNNNNNNNNNNNNNNN¡¡¡þ ÑNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûON STACK) ; RET ;**************************************************************************** ; ; BUF_FLSH FLUSHES THEI�ÿÂNNNNNNNNNNNNNNNN¡¡¡þ#-KNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û; ELSE CLEAN BUFFER ; LD (BUF_MOD),A RET ;**************************************************************************š¾ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ)€NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û TO READ FROM ; IX= DDT PTR ; IY= DPB PTR ; EXIT - (IOPB.PB_STATO)= 0: OK, /0: ERROR ; ;*********************************áaÿHNNNNNNNNNNNNNNNNN¡¡¡þ/h&NNNNNNNNNNNNNNNNNNNNNN¡¡¡û RETDVRT ;DRIVE IS STILL IN C REGISTER ; ; IF DRIVE ERROR THEN RETURN (HL= 0) ; RET NZ ; ; ELSE SAVE PTR ; LD (CUÛEÿrNNNNNNNNNNNNNNNN¡¡¡þÔXNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRITE OPERATION, MARK AND SWITCH DIRECTION ; LD A,1 ;BUFFER = DIRTY LD (BUF_MOD),A ; ; SAVE BUFFER DATA PTRS FOR LATER ] ÿáNNNNNNNNNNNNNNNN¡¡¡þ ;“NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûT RESULT STATUS FLAG POP IY POP IX ; RET ;**************************************************************************ÐõÿÂNNNNNNNNNNNNNNNN¡¡¡þïNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRACK # TO READ FROM ; (CPM_SEC)= SECTOR # TO READ FROM ; (CPM_DMA)= XFER ADDRESS ; EXIT - (IOPB.PB_STATO)= 0: OK, /0: ERROR»lÿäNNNNNNNNNNNNNNNNN¡¡¡þô$NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûERROR ; ;**************************************************************************** ; CPM_RD: ; LD HL,LL_READ ; ; CÊŸþrNNNNNNNNNNNNNNNN¡¡¡þ^‚NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û BUFFER DATA IF MODIFIED ; ENTRY- (BUF_DSK)= DISK # TO WRITE TO ; (BUF_TRK)= TRACK # TO WRITE TO ; (BUF_PSEC)= SECTOR # TO .ØÿÈNNNNNNNNNNNNNNNNN¡¡¡þ$´ÜNNNNNNNNNNNNNNNNNNNNNN¡¡¡û** ; ; BUF_WR PERFORMS THE PHYSICAL WRITE FROM BLKBUF TO THE HOST DISK. ; ENTRY- (BUF_DSK)= DISK # TO WRITE TO ; (BUF_TRK)=ù8ÿ�NNNNNNNNNNNNNNNNN¡¡¡þ*—ÓNNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************************* ; BUF_RD: ; LD HL,LL_READ ; ; COMMON CODE ; BUF_RW: PUSH HL LD HL,BUF_TîñÿäNNNNNNNNNNNNNNNNN¡¡¡þ0{kNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûR_DDT),HL ; ; FETCH FLAGS ; INC HL ;EXE +1 INC HL ;FLGS LD C,(HL) ; ; FETCH DISK PARAMETER BLOCK ADDRESS ; I;gþ'NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNý€Ë�™‚gƒ4„…Ð…ž†l‡:ˆ‰Ô‰¡Šo‹<Œ �×�¦Žt�B�‘Þ‘¬’y“G”•䕲–�—O˜™ë™¹š‡›Uœ#�ñ�¾ž�Ÿ[ )¡÷¡Å¢“£`¤.¥ü¥Ê¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þzÿNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNC HL ;DRV INC HL ;DPB_PTR LD E,(HL) INC HL LD D,(HL) LD (CUR_DPB),DE ; ; FETCH DISK PARAMETER HEADER ADDRESS ;€ÛÿÉNNNNNNNNNNNNNNNNN¡¡¡þÐYNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+ PB_ST2O) CP A,-1 ;-1:NONE, 0:JADE, 1:DESCRIPTOR, 2: EXTENDED, ; 3: PARTITIONED, ID JR Z,LGDEF ; ; ELSE IF OLD F‡òÿòNNNNNNNNNNNNNNNN¡¡¡þ ?’NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDT_HDS),A ; ; RETURN DRIVE TABLE PTR ; LD HL,(CUR_DPH) XOR A,A ;RETURN NO-ERROR JR LGDONE ; ; ; IF NOT HARD DISùdÿùNNNNNNNNNNNNNNNN¡¡¡þîNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û************************************************ ; HOME: ; ; IF PENDING WRITE (BUFFER DIRTY) THEN IGNORE ; LD A,(BUF_MOšþBNNNNNNNNNNNNNNNN¡¡¡þð%NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;**************************************************************************** ; ; SET TRANSFER ADDR ; ENTRY- BC= ADDRESS ;½(ÿäNNNNNNNNNNNNNNNNN¡¡¡þZƒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûF TABLE ADDR = 0 THEN NO TRANSLATION OR A,E JP Z,NOTRAN ; ; ELSE CALCULATE NEW SECTOR FROM TABLE ; EX DE,HL ADD HL,¯ ÿòNNNNNNNNNNNNNNNN¡¡¡þ%°ÝNNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡û+++++++++++++++++++++++++++++++++++++++++++ ; ; LOW LEVEL READ ; ENTRY- IX= DDT PTR ; IY= DPB PTR ; EXIT - IOPB.PB_STATO, pµþBNNNNNNNNNNNNNNNN¡¡¡þ+“ÒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûO_ERR ; ; INHIBIT UPLOAD ; LD A,1 SHL PB_INHX LD (IOPB + PB_FLGO),A ; ; CALCULATE DOWNLOAD BYTE COUNT ; LD A,(IYV1ÿùNNNNNNNNNNNNNNNN¡¡¡þ/¬NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û INC HL ;DPH PTR LD E,(HL) INC HL LD D,(HL) LD (CUR_DPH),DE EX DE,HL ;PUT DPH PTR IN HL FOR RETURN ; ; IF NOT Súÿ�NNNNNNNNNNNNNNNNN¡¡¡þÀgNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûORMATS THEN PAD DPB DATA ; CP A,3 JR NC,IDOK ; LD HL,BLKBUF + ID_PSHO ;FILL DATA WITH 0S LD B,ID_FLGO - ID_PSHO ; PAÑcþ$NNNNNNNNNNNNNNNN¡¡¡þjÁNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûK THEN GO DO FLOPPY TEST ; LGDEF: BIT 4,(IX + DDT_FLG) JR Z,LGCKFD ; ; ELSE USE HARD DISK DEFAULTS ; CALL TRNONE ; ÿâÿrNNNNNNNNNNNNNNNN¡¡¡þ†yNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD) OR A,A JR NZ,HOME2 ; ; ELSE PURGE BUFFER ; LD (BUF_ACT),A ; HOME2: ; ; JUST SET TRACK TO 0 ; LD BC,0 ; oAÿòNNNNNNNNNNNNNNNN¡¡¡þ¥vNNNNNNNNNNNNNNNNNNNNNN¡¡¡û EXIT - A= ? ; ;**************************************************************************** ; SETDMA: LD (CPM_DMA),BC ; ì7ÿäNNNNNNNNNNNNNNNNN¡¡¡þ O(NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBC LD L,(HL) ; LD H,0 RET ; ; ; CONVERT FROM CP/M'S LOGICAL SECTOR {0..N-1} TO PHYSICAL SECTOR {1..N} ; NOTRAN:IÛþ!NNNNNNNNNNNNNNNN¡¡¡þ&åŽNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûA= STATUS ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; LL_READ: ; ; ENABLE UPLOAD ô¾þ!NNNNNNNNNNNNNNNN¡¡¡þ, ENNNNNNNNNNNNNNNNNNNNNN¡¡¡û + DPB_PSH) ;USE SHIFT FACTOR {0:128, 1:256, 2:512, 3:1024} LD HL,128 ;START WITH 128 BYTES ; AND A,3 ;LIMIT TO 1024-BYTE}{ÿNNNNNNNNNNNNNNNN¡¡¡þ�NNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡ûFIRST SELECT OR LOGON INHIBITED THEN RETURN TABLE PTR ; LD A,(LOGRQ) ;0: LOGON, 1:INHIBIT OR A,C ;0: NORMAL, 1: INHIBIT ñþNNNNNNNNNNNNNNNNNN¡¡¡þ óVNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDIDL: LD (HL),0 INC HL DJNZ PADIDL ; ; ELSE XFER ID SECTOR DATA TO TABLES ; IDOK: CALL TRNONE ;ASSUME NO TRANSLATION —øÿÎNNNNNNNNNNNNNNNNN¡¡¡þYðNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûNO XLATE LD HL,HDPBK ; ; XFER DATA TO TABLES ; SEL2: LD DE,(CUR_DPB) ; USE DEFAULT TABLE LD BC,DPB_SZ LDIR ; LD ;þ NNNNNNNNNNNNNNNN¡¡¡þµHNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; FALL INTO SET TRACK ; ;**************************************************************************** ; ; SET TRACK # ¤šþNNNNNNNNNNNNNNNNNN¡¡¡þ–GNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûLD A,(BUF_DMAB) ;FETCH BANK ADDRESS SET BY COLD START LD (CPM_DMAB),A ; ; DONE ; RET ;++++++++++++++++++++++++++++äTÿÎNNNNNNNNNNNNNNNNN¡¡¡þ!|NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD HL,1 ADD HL,BC RET SUBTTL DISK SUPPORT ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ð³ÿçNNNNNNNNNNNNNNNNN¡¡¡þ'Ö¿NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û; XOR A,A LD (IOPB + PB_FLGO),A ; ; DISABLE DOWNLOAD ; LD HL,0 LD (IOPB + PB_BCNTO),HL ; ; PASS READ SECTOR COMƒªÿÈNNNNNNNNNNNNNNNN¡¡¡þ-9tNNNNNNNNNNNNNNNNNNNNNN¡¡¡û SECTORS ; JR Z,LL_WR2 ;IF SHIFT_FACTOR == 0 THEN DONE ; LL_WR3: ADD HL,HL ;DOUBLE COUNT DEC A JP NZ,LL_WR3 ; LL_WR2ÇÛÿÂNNNNNNNNNNNNNNNN¡¡¡þ… NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCPL AND A,1 RET Z ; ; ELSE LOG ON DRIVE ; PUSH IX ;SAVE REGS PUSH IY ; LD IX,(CUR_DDT) ;SET REGS LD IY,(CUR_D˜·ÿœNNNNNNNNNNNNNNNN¡¡¡þ ¦NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; IF HARD DISK OR DOUBLE DENSITY THEN NO TRANSLATION ; LD A,(BLKBUF + ID_FLGO) AND A,[1 SHL DF_DTDB] OR [1 SHL DF_HAR2ÎþrNNNNNNNNNNNNNNNNN¡¡¡þJ½NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA,(HL) ;HEADS VALUE JR SEL1 ; ; ; USE 8" FLOPPY DEFAULTS ; LGCKFD: CALL TR8 LD HL,SD8PBK JR SEL2 ; ; ERROR EXI¡éÿùNNNNNNNNNNNNNNNN¡¡¡þàNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ENTRY- BC= TRACK # ; ;**************************************************************************** ; SETTRK: LD (CPM_TRófÿÎNNNNNNNNNNNNNNNNN¡¡¡þÐNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SECTOR TRANSLATION FUNCTION ; ENTRY- DE= 0: NO XLATE, ELSE PTR TO XLATE IEþrNNNNNNNNNNNNNNNN¡¡¡þ")JNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++ ; ; LOGON DISK FUNCTION ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++ú7ÿäNNNNNNNNNNNNNNNNN¡¡¡þ(Æ�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûMAND ; LD A,PB_READC JP LL_RW ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; LOW 'ëÿ®NNNNNNNNNNNNNNNNN¡¡¡þ.l'NNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡û: LD (IOPB + PB_BCNTO),HL ; ; PASS WRITE COMMAND ; LD A,PB_WRITC ; ; FALL INTO COMMON CODE ; ;+++++++++++++++++ Ñÿ!NNNNNNNNNNNNNNNN¡¡¡þ¶;NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûPB) ; ; ATTEMPT TO READ ID SECTOR ; CALL BUF_FLSH ;FLUSH BUFFER 1ST JR NZ,LOGERR ; CALL DISKLOG JR NZ,LOGERR ; ;·&þNNNNNNNNNNNNNNNNNN¡¡¡þ •4NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDB] ; ; ELSE SET TRANSLATION ; CALL Z,TR8 ; ; XFER DISK DATA TO DPB ; LD DE,(CUR_DPB) ;GET ADDR OF DPB LD HL,BL•ÁÿäNNNNNNNNNNNNNNNNN¡¡¡þyŒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT ; LOGERR: LD HL,0 ; ; DONE ; LGDONE: POP IY ;RESTORE REGS POP IX RET ;***************************************ΑÿþNNNNNNNNNNNNNNNNN¡¡¡þÓ*NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûK),BC RET ;**************************************************************************** ; ; SET SECTOR ; ENTRY- BC= SE’pÿòNNNNNNNNNNNNNNNN¡¡¡þ<áNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTABLE ; BC= SECTOR # TO XLATE ; EXIT - HL= XLATED SECTOR OR BC + 1 ; BC= UNCHANGED ; A, DE= ? ; ;++++++++++++++++++++++®¸ÿÂNNNNNNNNNNNNNNNN¡¡¡þ#{NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++ ; DISKLOG: ; ; SET UP READ IOPB ; LD A,(BUF_DMAB) LD (LOGIOPB + PB_DMAXO),A ; LD HL,LOGIOPBqIÿÈNNNNNNNNNNNNNNNNN¡¡¡þ)õ°NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLEVEL WRITE ; ENTRY- IX= DDT PTR ; IY= DPB PTR ; EXIT - IOPB.PB_STATO, A= STATUS ; ;++++++++++++++++++++++++++++++++++++++ þINNNNNNNNNNNNNNNNN¡¡¡þ/_NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; COMMON IOPB EXECUTER ; ENTRY- A= COMMAND ; IX= DRIVE TABLE þrNNNNNNNNNNNNNNNN¡¡¡þãhNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û IF NO ID SECTOR THEN USE DEFAULT DPB ; (NOTE: CONTROLLER HAS SET IT'S DISK DEFAULTS IN DEFBFR IN ALL CASES) ; LD A,(IOPB ß–þNNNNNNNNNNNNNNNNNN¡¡¡þ £NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûKBUF + ID_SPTO LD BC,DPB_SZ LDIR ; ; XFER DISK PHYSICAL DATA TO TABLE ; LD A,(BLKBUF + ID_HEADS) ; SEL1: LD (IX + DºþBNNNNNNNNNNNNNNNN¡¡¡þ,ßNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************* ; ; HOME DRIVE - TREAT AS SEEK TRK 0 ; EXIT - BC= 0 ; ;**************************** ÿÉNNNNNNNNNNNNNNNNN¡¡¡þÃNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCTOR # ; ;**************************************************************************** ; SETSEC: LD (CPM_SEC),BC RET î—ÿòNNNNNNNNNNNNNNNN¡¡¡þi²NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; SECTRN: ; ; IF NO TRANSLATION THEN RETURN SECTOR++ ; LD A,D ;IYlÿÈNNNNNNNNNNNNNNNNN¡¡¡þ$ƒìNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD DE,IOPB LD BC,PB_STATO LDIR ; ; EXECUTE WITHOUT COMPENSATION ; JR LL_DO ;+++++++++++++++++++++++++++++++++Í6ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ* ãNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++ ; LL_WRIT: ; ; IF STILL PROTECTED THEN ERROR ; LD A,(WR_PROT) OR A,A JR NZ,D‹Wÿ“NNNNNNNNNNNNNNNNN¡¡¡þ0L[NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPTR ; IY= DPB PTR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; LL_RW: LD (IOPB + PB_CŒPÿÉNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÈNNNNNNNNN�Î�›‚hƒ6„…Ñ…ž†k‡:ˆ‰Ö‰£Šq‹>Œ �Ù�§Žu�B�‘à‘®’{“I”•啳–€—M˜™é™¸š†›Tœ"�ð�¾žŒŸZ (¡õ¡Ã¢’£_¤-¥û¥É¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þÖNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûMDO),A ; ; OFFSET SECTOR ; LD HL,(IOPB + PB_SECO) LD A,L ADD A,(IX + DDT_SOF) LD L,A LD A,H ADC A,(IX + DDT_SOFƒßÿäNNNNNNNNNNNNNNNNN¡¡¡þ|µNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûEB CALL EDITOR ; ; GET USER RESPONSE ; CALL CI ;GET USER RESPONSE ; PUSH AF ;SAVE CHAR LD C,A ;ECHO CHAR CALLÿäNNNNNNNNNNNNNNNN¡¡¡þ “~NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û********************************************* ; ; SET 3740 SECTOR TRANSLATION PROCEDURE ; ENTRY- (CUR_DPH)= MUST BE PTR TO DP�Rþ9NNNNNNNNNNNNNNNN¡¡¡þ³NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; XPRIM: ; ; EXECUTE THE PRIMITIVE IN ROM ; LD A,(B+‘þrNNNNNNNNNNNNNNNN¡¡¡þ\ÉNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIVER FUNCTION ; ENTRY- IY= DRIVER TABLE PTR ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++£ÿINNNNNNNNNNNNNNNNN¡¡¡þöoNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûT SUBTTL BIOS FUNCTION CALLS ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; FUNCTION›ÿäNNNNNNNNNNNNNNNN¡¡¡þ%1NNNNNNNNNNNNNNNNNNNNNN¡¡¡û###################################### ; ; BIOS FUNCTION TABLE ; ;##########################################################J ÿ!NNNNNNNNNNNNNNNN¡¡¡þ+?>NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRIVER TABLE BASE PTR ; NZ= ILLEGAL DRIVE REQUESTED (HL=0) ; A, B, C= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++W†þBNNNNNNNNNNNNNNNN¡¡¡þƒ@NNNNNNNNNNNNNNNNNNNNNN¡¡¡û + 1) LD H,A LD (IOPB + PB_SECO),HL ; ; SET PHYSICAL DRIVE ; LL_DO: LD A,(IX + DDT_DRV) LD (IOPB + PB_DRVO),A ; ; hÿäNNNNNNNNNNNNNNNNN¡¡¡þl‹NNNNNNNNNNNNNNNNNNNNNN¡¡¡û COC CALL CRLF ;NEW LINE POP AF ; AND A,5FH ;INSURE UPPER CASE ; ; IF RETRY THEN TRY AGAIN ; CP A,'R' ;IF RETRY�XÿdNNNNNNNNNNNNNNNN¡¡¡þÆ-NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûH ; EXIT - DE, HL= ? ; ;**************************************************************************** ; TR8: LD DE,SDTRAN TºþBNNNNNNNNNNNNNNNN¡¡¡þ*•NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUF_DMAB) ;PRESET IOPB BANK LD E,A ; LD HL,IOPB CALL MR_XIOB ;EXECUTE THE FUNCTION ; OR A,A ;FUNCTION ERR? RET NZ \ ÿäNNNNNNNNNNNNNNNN¡¡¡þ šNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û++++++++++++++++++++++++++++ ; FD8EXEC: ; ; IF HEADS == 1 THEN EXECUTE IOPB ; LD A,(IX + DDT_HDS) DEC A JP Z,XPRIM ÓöÿINNNNNNNNNNNNNNNNN¡¡¡þ ãÄNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DISPATCHER ; ENTRY- C= FUNCTION # ; EXIT - A= -1: ERROR, 0: OK ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++™¢ÿaNNNNNNNNNNNNNNNN¡¡¡þ&IbNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û################## ; BFUNTBL: DW RETVERS ;0:RETURN VERSION # DW RETDVRTF ;1:RETURN DISK PHYSICAL CONFIGURATION TABLE PTR "ÉÿÂNNNNNNNNNNNNNNNN¡¡¡þ,¦©NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++ ; RETDVRTF: ; ; ADJUST REGISTER ; LD C,E ; ; FALL INTO LOCAL ENTRY ; ;++++++++++„ÿòNNNNNNNNNNNNNNNN¡¡¡þ°qNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û FETCH DRIVER VECTOR & EXECUTE DISK DRIVER ; LL_OPLP: LD HL,LL_OPRET ;PUT RETURN ADDRESS ON STACK PUSH HL ; LD L,(IX ÈÿœNNNNNNNNNNNNNNNN¡¡¡þ _ºNNNNNNNNNNNNNNNNNNNNNN¡¡¡û THEN RETURN TO CALLER JR Z,LL_OPLP ; ; ELSE IF ABORT THEN DO WARM BOOT ; CP A,'A' ;IF ABORT THEN RE-BOOT JP Z,0 ; 3ÿÎNNNNNNNNNNNNNNNNN¡¡¡þõNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; SETTR: LD HL,(CUR_DPH) LD (HL),E INC HL LD (HL),D RET ;********************************************************ÀRÿùNNNNNNNNNNNNNNNN¡¡¡þ¤NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ; RETURN THE COMMAND RESULTS STATUS ; LD A,(IOPB + PB_STATO) OR A,A RET ;++++++++++++++++++++++++++++++++++++++9ÈÿçNNNNNNNNNNNNNNNNN¡¡¡þ:«NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; ELSE SELECT SIDE FROM TRACK BIT 0 ; LD HL,(IOPB + PB_TRKO) PUSH HL ;SAVE ORIGINAL DATA ; LD A,(IOPB + PB_SECO tþ'NNNNNNNNNNNNNNNNN¡¡¡þ!ÐõNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++ ; BIOFUNC: ; ; IF FUNCTION # NOT IN TABLE THEN RETURN -1 ; LD A,C CP A,MAXFUNCS LD A,-1 RET Nê+ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ'zSNNNNNNNNNNNNNNNNNNNNNN¡¡¡û MAXFUNCS EQU ($ - BFUNTBL) / 2 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN xþHNNNNNNNNNNNNNNNN¡¡¡þ-•˜NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN DRIVER TABLE PTR FUNCTION ; ENTRY- C= DRIVE # CWÿBNNNNNNNNNNNNNNNN¡¡¡þ)æNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+ DDT_EXE) ;FETCH DRIVER ADDRESS FROM TABLE LD H,(IX + DDT_EXE + 1) JP (HL) ; ; DRIVER RETURNS HERE ; LL_OPRET: ; ; .þNNNNNNNNNNNNNNNNNN¡¡¡þ éNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; ELSE IF DEBUGGER THEN EXECUTE IT ; CP A,'M' JP Z,MR_BRK ; ; ELSE IF IGNORE THEN RETURN NO ERROR ; SUB A,'I' ;IriÿÂNNNNNNNNNNNNNNNNN¡¡¡þæQNNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************** ; ; SET NO SECTOR TRANSLATION PROCEDURE ; EXIT - HL, DE= ? ; ;****************************************,VÿòNNNNNNNNNNNNNNNN¡¡¡þL÷NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++ ; ; HARD DISK DRIVER FUNCTION ; ENTRY- IX= DRIVER TABLE PTR ; EXIT - A= 0: OK; /0: ER»mÿNNNNNNNNNNNNNNNN¡¡¡þ£ BIT_BUCKET ; SRL H RR L RRA ;TRK BIT 0 -> SECTOR BIT 15 LD (IOPB + PB_SECO + 1),A ; L±�ÿäNNNNNNNNNNNNNNNN¡¡¡þ"…¦NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûC ; ; ELSE COMPUTE TABLE ENTRY ; PUSH HL ;SAVE POSSIBLE DATA ; LD HL,BFUNTBL LD A,C ADD A,A ADD A,L LD L,A X—ÿòNNNNNNNNNNNNNNNNN¡¡¡þ(jmNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûBIOS VERSION # FUNCTION #0 ; EXIT - HL= VERSION # IN BINARY {0.00,..655.35} ; ;++++++++++++++++++++++++++++++++++++++++++++++.ÿ�NNNNNNNNNNNNNNNNN¡¡¡þ.ÀËNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; EXIT - E:HL= DRIVER TABLE BASE PTR ; NZ= ILLEGAL DRIVE (HL= 0) ; A, B, C= ? ; ;+++++++++++++++++++++++++++++++++++++++++­ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ×NNNNNNNNNNNNNNNNNNNNNN¡¡¡û IF NO ERRORS THEN RETURN ZF ; RET Z ;IF NO_ERROR THEN RETURN ; ; PRINT ERROR ; IOPBDMP: LD A,(BUF_DMAB) ;SET BANK ÏÓÿNNNNNNNNNNNNNNNNN¡¡¡þ 9ØNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûF IGNORE THEN RETURN NO ERROR RET Z ; ; ELSE RETURN ERROR TO BDOS ; LD A,-1 ;RETURN -1 TO BDOS OR A,A RET ; ; ;ëÿäNNNNNNNNNNNNNNNNN¡¡¡þÕ`NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************ ; TRNONE: LD DE,0 JR SETTR SUBTTL HARD DISK ROUTINES ;++++++++++++++++++++++++++½.ÿþNNNNNNNNNNNNNNNNN¡¡¡þÆNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; HDEXEC: EQU XPRIM SUBTTL JADE FLpQÿÂNNNNNNNNNNNNNNNN¡¡¡þ� NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD (IOPB + PB_TRKO),HL ;TRACK = RESIDUAL ; ; EXECUTE THE IOPB ; CALL XPRIM ; ; RESTORE THE MODIFIED IOPB SO RETRY WILLÖïÿœNNNNNNNNNNNNNNNN¡¡¡þ#¶—NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û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),HL ;PUT CALLEÍóÿHNNNNNNNNNNNNNNNNN¡¡¡þ)Y\NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++ ; RETVERS: LD HL,VERSN XOR A,A ;RETURN NO ERROR RET ;+++++++++++++++++++++++++++++I@ÿNNNNNNNNNNNNNNNNN¡¡¡þ/óúNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++ ; RETDVRT: ; ; ASSUME DRIVE 0 ; LD HL,DDT_0 ;START AT 1ST TABLE ; ; IF DRIVE ==U#ÿ„NNNNNNNNNNNNNNNN¡¡¡þO„NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û LD E,A ; LD HL,IOPB LD A,MF_DIOB ;USE DISPLAY IOPB DATA FUNCTION CALL XMROM ; ; QUERY USER FOR OPTION ; LD HL,DSKJÿáNNNNNNNNNNNNNNNN¡¡¡þ  ONNNNNNNNNNNNNNNNNNNNNN¡¡¡û DISPLAY WRITE PROTECT ERROR MESSAGE ; DO_ERR: LD HL,WP_ERM CALL EDITOR JR IOPBDMP ;*******************************ù]ÿÂNNNNNNNNNNNNNNNN¡¡¡þ€3NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE IOPB PRIMITIVE ; EXIT - A= 0: OK, /0: ERROR ; ;+++++++++`ÿÉNNNNNNNNNNNNNNNNN¡¡¡þoøNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûOPPY DRIVER ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; JADE 8" FLOPPY DISK DRáðÿòNNNNNNNNNNNNNNNN¡¡¡þÅ^NNNNNNNNNNNNNNNNNNNNNN¡¡¡û WORK ; POP HL ;TRACK LD (IOPB + PB_TRKO),HL ; LD HL,IOPB + PB_SECO +1 ;CLEAR BIT 15 RES 7,(HL) ; ; DONE ; REÝÿÈNNNNNNNNNNNNNNNNN¡¡¡þ$/NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR'S DATA IN HL, FUNCTION ADDR ON RET ; STACK, EXECUTE FUNCTION ADDRESS ON STACK ;######################################íDþNNNNNNNNNNNNNNNNNN¡¡¡þ* NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN DRIVER TABLE PTR FUNCTION #1 ; ENTRY- E= DRIVE # ; EXIT - E:HL= DhÏÿ$NNNNNNNNNNNNNNNNN¡¡¡þ0à·NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û 0 THEN ALREADY THERE ; LD A,C OR A,A RET Z ; ; ELSE IF ILLEGAL DRIVE THEN RETURN ERROR ; CP A,NDRVS JR C,RETDV2S)ÿÈNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNrNNNNNNý€Ë�™‚fƒ3„…Ð…ž†l‡:ˆ‰Õ‰¢Šp‹=Œ �Ø�¦Žt�B�‘ß‘­’{“H”•䕱–€—N˜™ê™¹š‡›Uœ#�ð�½žŒŸZ (¡ö¡Ä¢’£_¤-¥û¥É¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þá#NNNNNNNNNNNNNNNNNNNNNNð¡¡¡û ; LD HL,0 OR A,A ;SET NZ RET ; ; ; ELSE COMPUTE TABLE PTR ; RETDV2: LD B,C LD DE,DDT_SIZ ; RETDVL: ADD HL,DEe\ÿäNNNNNNNNNNNNNNNNN¡¡¡þK…NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIONAL FUNCTIONS TO SUPPORT CDOS PROGRAMS ;*************************************************************************** ; ; SYSä{ÿÉNNNNNNNNNNNNNNNN¡¡¡þ ¤NNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û CP A,8DH ;IF RETURN VERSION THEN RETURN IT JR Z,RETCVER ; CP A,90H ;IF NOT CLOCK THEN ERR JR C,ILLEGC ; JR Z,CLKCAL|yÿ9NNNNNNNNNNNNNNNN¡¡¡þ„2NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û+++++++++++++++++++++++ ; RETCVER: LD B,1 RET SUBTTL CLOCK ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++ËWÿÂNNNNNNNNNNNNNNNN¡¡¡þkùNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûXECUTER ; ENTRY- A= FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; XMROM: EQUY(ÿäNNNNNNNNNNNNNNNNN¡¡¡þÁ_NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSOLE OUTPUT ; ENTRY- C= CHAR TO OUTPUT ; ;**************************************************************************** ; COQ�þ NNNNNNNNNNNNNNNN¡¡¡þ%+NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ENTRY- C= CHAR TO OUTPUT ; ;**************************************************************************** ; LO: LD A,MF_LYíþ!NNNNNNNNNNNNNNNN¡¡¡þ+NNNNNNNNNNNNNNNNNNNNNN¡¡¡û########################################################## ; ; 3740 SECTOR TRANSLATION TABLE ; **** CP/M SINGLE DENSITY **** ¥ ÿ„NNNNNNNNNNNNNNNN¡¡¡þ´pNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DJNZ RETDVL ; LD A,(BUF_DMAB) LD E,A ; ; RETURN NO ERROR ; XOR A,A RET ;++++++++++++++++++++++++++++++++++ÃÁÿÈNNNNNNNNNNNNNNNNN¡¡¡þ[»NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTEM CALL INTERCEPT ROUTINE CHECKS FOR ILLEGAL BDOS CALLS & ; PRINTS MESSAGE IF ILLEGAL. ALSO IMPLEMENTS CDOS CLOCK/CALENDAR ;õ­ÿÉNNNNNNNNNNNNNNNN¡¡¡þñNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;IF CALENDAR THEN GET IT ; CP A,92H JR Z,CLKTIM ;IF TIME THEN GET IT ; ; ILLEGAL SYSTEM CALL ; ILLEGC: PUSH BC ;SAVEÊäÿòNNNNNNNNNNNNNNNN¡¡¡þ¥NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++ ; ; RETURN CALENDAR FUNCTION 90H ; EXIT - A= DAY ; B= MONTH ; C= YEAR ; L= DAY OF WEEK ; R+ÿdNNNNNNNNNNNNNNNN¡¡¡þ>ªNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û MR_FUN SUBTTL CHAR I/O ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CONS·KÿäNNNNNNNNNNNNNNNNN¡¡¡þ ÔôNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûC: LD A,MF_CO JP XMROM ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; READER DRIVEzkþBNNNNNNNNNNNNNNNN¡¡¡þ&~RNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûO JP XMROM ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN LIST DEVICE STATUS ihÿîNNNNNNNNNNNNNNNNN¡¡¡þ,‘™NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ;############################################################################ ; SDTRAN: GXLATE 26,6 ;################L§ÿòNNNNNNNNNNNNNNNN¡¡¡þ‡ANNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û++++++++++++++++++++++++++++++++++++++++++ ; ; GET BANK NUMBER FUNCTION ; EXIT - A= BANK # ; ;+++++++++++++++++++++++++++++R×ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ hŠNNNNNNNNNNNNNNNNNNNNNN¡¡¡û SYSTEM CALLS FOR ASMB. ; ;*************************************************************************** INTCPT: LD A,C ;CHECP?ÿçNNNNNNNNNNNNNNNNN¡¡¡þÂ,NNNNNNNNNNNNNNNNNNNNNN¡¡¡û FUNCTION # ; ; OUTPUT WARNING MESSAGE ; LD HL,ISCMSG ;OUTPUT WARNING CALL EDITOR ; ; OUTPUT FUNCTION # ; POP BC5ÿòNNNNNNNNNNNNNNNN¡¡¡þ.”NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKCAL: LD A,MF_GCAL JP XMROM ;+++++ÜÌÿÎNNNNNNNNNNNNNNNNN¡¡¡þ ›NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOLE INPUT ; EXIT - A= CHAR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CI: LD A,MF_V–ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ!çÅNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR - DUMMY ; EXIT - A= CTRL-Z ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; READER: LD AMSÿÎNNNNNNNNNNNNNNNNN¡¡¡þ'McNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; EXIT - A= 0: BUSY, FFH:READY ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; LISTST: �tÿçNNNNNNNNNNNNNNNN¡¡¡þ-¢¨NNNNNNNNNNNNNNNNNNNNNN¡¡¡û############################################################ ; ; COMMON I/O PARAMETER BLOCK ; ;#############################CaþBNNNNNNNNNNNNNNNN¡¡¡þÖNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++ ; GETBNK: LD A,MF_GBNK JP MR_FUN SUBTTL NON-DISK PROCEDURES ;*****'þ!NNNNNNNNNNNNNNNN¡¡¡þ =ÙNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûK CALL VALIDITY CP A,41 ;IF <= 40 THEN OK ; BDOSV EQU $ + 1 JP C,BDOS + 11H ;THIS ADDR MODIFIED BY WARM BOOT RTN ; ; TQ?ÿòNNNNNNNNNNNNNNNNN¡¡¡þÑaNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD A,MF_PHXB CALL XMROM ; ; OUTPUT NEW LINE ; CALL CRLF ; ; RETURN NULLS ; XOR A,A ;BC = HL = A = 0 LD L,A6ÌþrNNNNNNNNNNNNNNNN¡¡¡þ{ÇNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN TIME FUNCTION 92H ; EXIT - A= SECONDS ; ÑÿÎNNNNNNNNNNNNNNNNN¡¡¡þ” NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCI JP XMROM ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN CONSOLE STATUS ; %]ÿyNNNNNNNNNNNNNNNN¡¡¡þ"²–NNNNNNNNNNNNNNNNNNNNNN¡¡¡û,CTRLZ ;FAKE EOF ; ; FALL INTO PUNCH RETURN ; ;**********************************************************************¬EþrNNNNNNNNNNNNNNNNN¡¡¡þ(]]NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûLD A,MF_LOS JP XMROM ;**************************************************************************** ; ; MESSAGE EDITOR ¹ÿçNNNNNNNNNNNNNNNNN¡¡¡þ.÷ûNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û############################################### ; IOPB: REPT PB_SIZE LIST OFF DB 0 LIST ON ENDM ;################_þNNNNNNNNNNNNNNNNNN¡¡¡þ-çNNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************************************************************** ; ; NEWLINE PROCEDURE ; ;****************************…ÿçNNNNNNNNNNNNNNNNN¡¡¡þ èNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûHE FOLLOWING CONDITIONAL JUMP IS MODIFIED TO AN UNCONDITIONAL JUMP BY ; THE WARM BOOT ROUTINE IF THE CLOCK/CALENDAR BOARD IS N+µÿäNNNNNNNNNNNNNNNNN¡¡¡þâPNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û LD H,A LD C,A LD B,A RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CDOS ³lÿÇNNNNNNNNNNNNNNNNN¡¡¡þHöNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûB= MINUTES ; C= HOURS ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKTIM: LD A,MF_×vÿrNNNNNNNNNNNNNNNN¡¡¡þ§=NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûEXIT - A= 0: NOT READY ; FFH: CHAR READY ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ VµÿùNNNNNNNNNNNNNNNN¡¡¡þ#�§NNNNNNNNNNNNNNNNNNNNNN¡¡¡û****** ; ; PUNCH DRIVER ; ENTRY- C= CHAR TO OUTPUT ; ;*********************************************************************"�ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ)nlNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û; ENTRY- HL= TEXT PTR (BIT 7= 1: TERMINATOR) ; EXIT - REGS= ? ; ;************************************************************O[ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ/ÄÊNNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡û############################################################ ; ; DISK DRIVER TABLES (DDT) ; ;###############################Kÿ„NNNNNNNNNNNNNNNN¡¡¡þx´NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û*********************************************** ; CRLF: LD C,CR CALL COC LD C,LF JP COC IF INTCPTS SUBTTL ADDITk ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ —NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOT PRESENT ; IF NOT MODIFIED, THEN IT IS ALLWAYS FALSE (NOP). ; INHCLK: JR C,ILLEGC ; ; NOW CHECK FOR EXTENDED CALLS ; ïÿÂNNNNNNNNNNNNNNNN¡¡¡þ·NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûRETURN VERSION FUNCTION ; MAKES CLOCK/CALENDAR WORK. ; EXIT - B= 1 ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++[®þHNNNNNNNNNNNNNNNNN¡¡¡þXÈNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûGTIM JP XMROM ENDIF ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; MONITOR ROM EZ(þrNNNNNNNNNNNNNNNN¡¡¡þònNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û ; CNSCK: LD A,MF_CIS JP XMROM ;**************************************************************************** ; ; CON@‡þHNNNNNNNNNNNNNNNNN¡¡¡þ$0NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û******* ; PUNCH: RET ;**************************************************************************** ; ; PRINTER DRIVER }]ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ*;?NNNNNNNNNNNNNNNNNNNNNN¡¡¡û**************** ; EDITOR: CALL GETBNK LD E,A LD A,MF_PUTS JP XMROM SUBTTL INITIALIZED DATA ;##################øqþ$NNNNNNNNNNNNNNNNN¡¡¡þ0ׇNNNNNNNNNNNNNNNNNNNNNN¡¡¡û############################################# ; STRUCT 0 DDT_EXE DS 2 ;START ADDRESS OF DISK DRIVER DDT_FLG DS 1 ;FLAGS BIRÔÿçNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN&NNNNNNNNN�Ï�œ‚iƒ6„…Ñ…ž†k‡9ˆ‰Ó‰ Šn‹;Œ �×�¥Žr�@�‘Ü‘ª’w“E”•á•®–}—K˜™ç™µšƒ›Qœ�ì�¹ž‡ŸU "¡ñ¡¾¢�£Z¤(¥ö¥Ä¦nNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ §NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûT DEF. ; 0 1: INHIBIT LOGON ; 1..3 PARTITION # {0,..7} ; 4 1: HARD DISK DRIVE ; DDT_DRV DS 1 ;PHYSICAL DRIVE #Ñéÿ¬NNNNNNNNNNNNNNNNN¡¡¡þ NNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@ ; ALLDRV MACRO #DADD,#PD,#FLG,#DPB,#DPH,#HDS,#SOF DW #DADD ;DRIVER EXECUTION ADDR DB #FLG ;FLAGS DB #PD ;M-{ÿäNNNNNNNNNNNNNNNN¡¡¡þ åÊNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û6,10H,D2DPB,D2DPH,4,0 ; D DDT_3: ALLDRV HDEXEC,6,12H,D3DPB,D3DPH,4,8000H ; E DDT_4: ALLDRV HDEXEC,7,10H,D4DPB,D4DPH,4,0 j*ÿNNNNNNNNNNNNNNNN¡¡¡þŶNNNNNNNNNNNNNNNNNNNNNN¡¡¡û########################################## ; SD8PBK: DW 26 ;SECTORS PER TRACK DB 3 ;BLOCK SHIFT FACTOR DB 7 ;BLOCK MASKy±ÿÂNNNNNNNNNNNNNNNN¡¡¡þ*}NNNNNNNNNNNNNNNNNNNNNN¡¡¡û) DB 1 ;NULL MASK (EXM) DW 1015 ;DISK SIZE (CLUSTERS -1) (DSM) DW 1152 / 2 ;DIRECTORY MAX (DRM) DB 0FFH ;ALLOCATIDÿINNNNNNNNNNNNNNNNN¡¡¡þ€ÛNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ALLDPH: MACRO #D LIST ON D#D(DD)DPH: ;DRIVE PARAMETER HEADER FOR DRIVE #D(DD) D²ÿòNNNNNNNNNNNNNNNN¡¡¡þ%j…NNNNNNNNNNNNNNNNNNNNNN¡¡¡û####################################################### ; LOGIOPB: DB PB_LOGC ;COMMAND DB 0 ;DRIVE DW 0 ;TRACK DW ID_SlÿœNNNNNNNNNNNNNNNN¡¡¡þ+IŠNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS 1 ;XFER BANK ; ; ; BUFFER IOPB OVERLAY ; BUF_DSK DS 1 ;BUFFER DISK NUMBER BUF_TRK DS 2 ;BUFFER TRACK NUMBER BUF_SEC DIÿÂNNNNNNNNNNNNNNNN¡¡¡þõôNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û DDT_DPB DS 2 ;DPB ADDRESS FOR THIS DRIVE DDT_DPH DS 2 ;DPH ADDRESS FOR THIS DRIVE ; ; THE FOLLOWING MAY BE BROUGHT OFF DI¿³þHNNNNNNNNNNNNNNNNN¡¡¡þ?NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûONITOR PHYSICAL DRIVE # DW #DPB ;DISK PARAMETER BLOCK PTR DW #DPH ;DISK PARAMETER HEADER PTR DB #HDS ;HEADS DW #SOF �ÚþHNNNNNNNNNNNNNNNN¡¡¡þ°™NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; F DDT_5: ALLDRV HDEXEC,7,12H,D5DPB,D5DPH,4,8000H ENDIF ;#########################################################Œ5ÿòNNNNNNNNNNNNNNNN¡¡¡þ\!NNNNNNNNNNNNNNNNNNNNNN¡¡¡û DB 0 ;NULL MASK DW 242 ;DISK SIZE -1 DW 63 ;DIRECTORY MAX DB 11000000B ;ALLOC 0 DB 0 ;ALLOC 1 DW 16 ;CHECK SIZ1ÿNNNNNNNNNNNNNNNN¡¡¡þ.NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûON 0 (AL0) DB 10000000B ;ALLOCATION 1 (AL1) DW 0 ;CHECK SIZE (CKS) DW 2 ;TRACK OFFSET (OFF) DB 1 ;PHYSICAL REHâÿNNNNNNNNNNNNNNNNN¡¡¡þ •pNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûW 0 ;;SECTOR TRAN TBL (OR 0 IF NO XLATE) DW 0 ;;SCRATCH AREA DW 0 ;;" DW 0 ;;" DW DIRBF ;;DIRECTORY BUFFER PTR DWæ2ÿaNNNNNNNNNNNNNNNN¡¡¡þ&?ÖNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûECT ;SECTOR DB 0 ;FLAGS DW BLKBUF ;DMA DB 0 ;BANK DW 0 ;COUNT ; WR_PROT DB -1 ;/0: WRITE PROTECTION ENABLED ; ; XÿÎNNNNNNNNNNNNNNNNN¡¡¡þ,ÐNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS 2 ;BUFFER SECTOR NUMBER DS 1 ;FLAGS BUF_DMA DS 2 BUF_DMAB DS 1 ;BANK # ; ; ; BLOCKING BUFFER MAINTENANCE ; BUF_PSECœúþ NNNNNNNNNNNNNNNN¡¡¡þÆÅNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûSK DESCRIPTOR OR FROM DEFAULT TABLES ; DDT_HDS DS 1 ;HEADS DDT_SOF DS 2 ;SECTOR OFFSET ; ; DEFINE THE STRUCTURE SIZE ; s ÿNNNNNNNNNNNNNNNNNN¡¡¡þ )NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û;SECTOR OFFSET ; ENDM IF BOOT = 10H ; A DDT_0: ALLDRV HDEXEC,6,10H,D0DPB,D0DPH,4,0 ; B DDT_1: ALLDRV HDEXEC,6,1Í‘ÿNNNNNNNNNNNNNNNN¡¡¡þƒ¨NNNNNNNNNNNNNNNNNNNNNN¡¡¡û################### ; ; MESSAGES ; ;############################################################################ ; MSGLEfÀÿòNNNNNNNNNNNNNNNN¡¡¡þoNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE DW 2 ;TRACK OFFSET DB 0 ;PHYSICAL RECORD SHIFT FACTOR DB 0 ;PHYSICAL RECORD MASK DW 0 ;LOGICAL DRIVE SECTOR OFFSET(ÄÿçNNNNNNNNNNNNNNNNN¡¡¡þLNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCORD SHIFT FACTOR (PSH) DB 1 ;PHYSICAL RECORD MASK (PRM) DW 0 ;LOGICAL DRIVE SECTOR OFFSET (SOF) ; ; ; DB 4 ;HEADS ÐÿÎNNNNNNNNNNNNNNNNN¡¡¡þ!¦ANNNNNNNNNNNNNNNNNNNNNN¡¡¡û D#D(DD)DPB ;;DRIVE PARAMETER BLK PTR IF ((DD - 1) <= NDHD) AND ((DD - 1) >= STHD) DW 0 ;;NO CHECKS ON HARD DISK ELSE=1ÿçNNNNNNNNNNNNNNNNN¡¡¡þ' çNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LAST OF INITIALIZED CODE READ FROM DISK ; BIOSND EQU $ SUBTTL UNINITIALIZED DATA AREA ;################################�þ'NNNNNNNNNNNNNNNN¡¡¡þ-ã,NNNNNNNNNNNNNNNNNNNNNN¡¡¡û DS 2 ;BUFFER PHYSICAL SECTOR BUF_ACT DS 1 ;0: BUFFER FLUSHED, /0: DATA IN BUFFER BUF_MOD DS 1 ;0: BUFFER CLEAN, /0: BUFFER DItÓÿùNNNNNNNNNNNNNNNN¡¡¡þ_RNNNNNNNNNNNNNNNNNNNNNNð¡¡¡ûDDT_SIZ DS 0 ENDM ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; MACRO TO DEFINE THEY þNNNNNNNNNNNNNNNNNN¡¡¡þ |]NNNNNNNNNNNNNNNNNNNNNN¡¡¡û2H,D1DPB,D1DPH,4,8000H ; C DDT_2: ALLDRV HDEXEC,7,10H,D2DPB,D2DPH,4,0 ; D DDT_3: ALLDRV HDEXEC,7,12H,D3DPB,D3DPH,4,8000HûþBNNNNNNNNNNNNNNNNN¡¡¡þ�åNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û: DM CR,LF,'LOAD ERROR: ' ; DSKEB: DM CR,LF,'Abort, Ignore, Retry, (BDOS) - ' ; WP_ERM: DM CR,LF,'W-PROT Error!' ; IF IÔ±þ9NNNNNNNNNNNNNNNN¡¡¡þ:CNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; DEFAULT DISK PHYSICAL PARAMETERS ; DB 1 ;HEADS ;##############################################################@þNNNNNNNNNNNNNNNNNN¡¡¡þÕˆNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;############################################################################ ; ; DRIVE PARAMETER HEADER AREA ; 1 PER DR´mÿNNNNNNNNNNNNNNNN¡¡¡þ"óNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DW D#D(DD)CHK ;;DRIVE DISK CHECKSUMS ARRAY PTR ENDIF DW D#D(DD)ALL ;;DRIVE CLUSTER ALLOCATION BIT MAP PTR LIST OFF ¹©ÿòNNNNNNNNNNNNNNNNN¡¡¡þ(ÙNNNNNNNNNNNNNNNNNNNNNN¡¡¡û############################################ ; ; THE FOLLOWING DATA MUST RESIDE IN THIS ORDER TO MATCH THE IOPB DATA ; ;##•ÿNNNNNNNNNNNNNNNNNN¡¡¡þ.¶NNNNNNNNNNNNNNNNNNNNN!ö¡¡¡ûRTY (MODIFIED) ; BUF_DDT DS 2 ;BUFFER DDT PTR BUF_DPB DS 2 ;BUFFER DPB PTR ; RSFLAG: DS 1 ;0: NO PREREAD REQ'D, /0: PREREADBÿ'NNNNNNNNNNNNNNNNN¡¡¡þlcNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DRIVER TABLE RECORD ; ENTRY- #DADD= DRIVER ADDRESS ; #PD= PHYSICAL DRIVE # ; #FLG= DRIVE FLAGS ; #DPB= DPB ADDRESS ; #zÿÎNNNNNNNNNNNNNNNNN¡¡¡þ OlNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; E DDT_4: ALLDRV FD8EXEC,0,0,D4DPB,D4DPH,1,0 ; F DDT_5: ALLDRV FD8EXEC,1,0,D5DPB,D5DPH,1,0 ENDIF IF BOOT = 3 ŒWÿINNNNNNNNNNNNNNNNN¡¡¡þ£ÔNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûNTCPTS ISCMSG: DM CR,LF,'ILL SYS CALL, #= ' ENDIF ;###################################################################�IÿüNNNNNNNNNNNNNNNN¡¡¡þ rNNNNNNNNNNNNNNNNNNNNNN¡¡¡û############## ; ; DEFAULT 8" HARD DISK PARAMETER BLOCK ; ;#################################################################‚ ÿòNNNNNNNNNNNNNNNN¡¡¡þæ¹NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIVE ; ;############################################################################ ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@—œÿBNNNNNNNNNNNNNNNN¡¡¡þ#À#NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûENDM ; ; DEFINE THE DATA ; DD DL 1 REPT NDRVS LIST OFF ALLDPH 0123456789ABCDEF DD DL DD + 1 LIST ON ENDM ;N¼ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ)/èNNNNNNNNNNNNNNNNNNNNNN¡¡¡û########################################################################## ; ; CP/M IOPB OVERLAY ; CPM_DSK DS 1 ;LOGICAL D„ÿINNNNNNNNNNNNNNNNN¡¡¡þ/…NNNNNNNNNNNNNNNNNNNNNNN¡¡¡û REQ'D READOP: DS 1 ;0: WRITE OPERATION, 1: READ OPERATION WRTYPE: DS 1 ;WRITE OPERATION TYPE FROM BDOS: ; 0: WRITE TO ALL× ÿ9NNNNNNNNNNNNNNNN¡¡¡þ90NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDPH= DPH ADDRESS ; #HDS= HEADS ; #SOF= SECTOR OFFSET ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@€�þNNNNNNNNNNNNNNNNNN¡¡¡þ ÖûNNNNNNNNNNNNNNNNNNNNNNð¡¡¡û; A DDT_0: ALLDRV FD8EXEC,0,0,D0DPB,D0DPH,1,0 ; B DDT_1: ALLDRV FD8EXEC,1,0,D1DPB,D1DPH,1,0 ; C DDT_2: ALLDRV HDEXEC,ÎþBNNNNNNNNNNNNNNNN¡¡¡þö‡NNNNNNNNNNNNNNNNNNNNNN¡¡¡û######### ; ; DEFAULT 8" FLOPPY DISK PARAMETER BLOCK ; IBM 3740 SINGLE DENSITY FORMAT ; ;##################################1øÿäNNNNNNNNNNNNNNNNN¡¡¡þLNNNNNNNNNNNNNNNNNNNNNN¡¡¡û########### ; HDPBK: DW 128 ;SECTORS PER TRACK (LOGICAL) (SPT) DB 5 ;BLOCK SHIFT FACTOR (BSH) DB 31 ;BLOCK MASK (BLMÒáÿòNNNNNNNNNNNNNNNN¡¡¡þ³êNNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE A DISK PARAMETER TABLE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@HÅÿgNNNNNNNNNNNNNNNNN¡¡¡þ$Y´NNNNNNNNNNNNNNNNNNNNNN¡¡¡û############################################################################ ; ; LOGON IOPB OVERLAY ; ;#####################.ÀÿÎNNNNNNNNNNNNNNNNN¡¡¡þ*z»NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRIVE CPM_TRK DS 2 ;LOGICAL TRACK NUMBER CPM_SEC DS 2 ;LOGICAL SECTOR NUMBER DS 1 ;FLAGS CPM_DMA DS 2 ;XFER ADDR CPM_DMAB D"BÿÈNNNNNNNNNNNNNNNNN¡¡¡þ0–NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOCATED (USED) BLOCK (PREREAD) ; 1: WRITE TO DIRECTORY (PREREAD & WRITE) ; 2: WRITE TO UNALLOCATED (UNUSED) BLOCK (NO ; ÿÈNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNþ€Í�š‚hƒ5„…Ð…ž†l‡:ˆ‰Õ‰¢Šp‹=Œ �×�¥Žt�A�‘Ý‘«’y“G”•䕱–—M˜™é™¸š†›Tœ!�ï�¼ž‹ŸY '¡õ¡Ã¢’£_¤-¥û¥Ê¦nNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ——NNNNNNNNNNNNNNNNNNNNNN¡¡¡û PREREAD REQ'D) ; ; UNA_CNT: DS 1 ;# SECTORS REMAINING IN BLOCK (CLUSTER) UNA_DSK: DS 1 ;LAST UNALLOC DISK UNA_TRK: DS 2 ôÈÿÈNNNNNNNNNNNNNNNNN¡¡¡þ=1NNNNNNNNNNNNNNNNNNNNNN¡¡¡û########################################################### ; ; DRIVE ALLOCATION AREAS ; ;################################�šÿÉNNNNNNNNNNNNNNNN¡¡¡þ ÒúNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûECTOR) ENDIF LIST OFF ENDM ; ; RESERVE THE DATA SPACE ; DD DL 1 REPT NDRVS LIST OFF ALLDAL 0123456789ABCDEF 9„ÿòNNNNNNNNNNNNNNNN¡¡¡þò†NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIN CLUSTERS) ; INT(((#_TRACKS - OFF) * SPT * BYTES PER SECTOR) / CLUSTER SIZE) -1 DPB_DRM DS 2 ;DRM- DIRECTORY SIZE -1 DPB_m|ÿ„NNNNNNNNNNNNNNNN¡¡¡þMNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûONING BY HEADS ARE IMPLIMENTED BY USING THE FOLLOWING DATA. ; (HEAD BITS ARE INCLUDED IN SECTOR WORD UPPER BITS) ; DPB_SECOiÿäNNNNNNNNNNNNNNNNN¡¡¡þ·ëNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCONMSG **** BIOS TOO BIG, USE MOVCPM & RE-ADJUST! **** ENDIF END ]TþrNNNNNNNNNNNNNNNN¡¡¡þ%]µNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûARD DISK PHYSICAL DRIVE 0 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; D SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ; E2ðÿáNNNNNNNNNNNNNNNN¡¡¡þ+~ºNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûARD DISK PHYSICAL DRIVE 1 ; G JADE 8" FLOPPY PHYSICAL DRIVE 0 ; H JADE 8" FLOPPY PHYSICAL DRIVE 1 ENDIF ; ;*********õÿòNNNNNNNNNNNNNNNN¡¡¡þÂÄNNNNNNNNNNNNNNNNNNNNNN¡¡¡û;LAST UNALLOC TRACK UNA_SEC: DS 2 ;LAST UNALLOC SECTOR ;##################################################################^�þ$NNNNNNNNNNNNNNNNN¡¡¡þ-NNNNNNNNNNNNNNNNNNNNNN¡¡¡û############################################ ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ §ÀÿäNNNNNNNNNNNNNNNN¡¡¡þ‡©NNNNNNNNNNNNNNNNNNNNNNð¡¡¡û DD DL DD + 1 LIST ON ENDM ;############################################################################ ; ; RESERVǵÿòNNNNNNNNNNNNNNNN¡¡¡þkNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAL0 DS 2 ;AL0,1- DIRECTORY ALLOCATION ; 1 MSB PER DIRECTORY CLUSTER ALLOCATED DPB_CKS DS 2 ;CKS- # DIRECTORY SECTORS CHECKEØšþdNNNNNNNNNNNNNNNN¡¡¡þHNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DS 2 ;SOF- SECTOR OFFSET (FOR LOGICAL DRIVE) ; 0: NONE, 1..65535: OFFSET DPB_SZ DS 0 ENDM ; ; ;@@@@@@@@@@@@@@@@@@@@@@nÿINNNNNNNNNNNNNNNNN¡¡¡þ ¢@NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPBOFF ABOVE. ; PARTITIONING BY HEADS ARE IMPLIMENTED BY USING THE FOLLOWING DATA. ; (HEAD BITS ARE INCLUDED IN SECTOR WORD UÇ5þBNNNNNNNNNNNNNNNN¡¡¡þ&æNNNNNNNNNNNNNNNNNNNNNN¡¡¡û JADE 8" FLOPPY PHYSICAL DRIVE 0 ; F JADE 8" FLOPPY PHYSICAL DRIVE 1 ENDIF IF BOOT = 3 ; A JADE 8" FLOPPY PHYSICALhŸþ!NNNNNNNNNNNNNNNN¡¡¡þ,ç-NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û******************************************************************* ; ; REVISION HISTORY: ; ; 3.00 - 26 JAN 87 GRH ; Im4ŸÿòNNNNNNNNNNNNNNNN¡¡¡þñõNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û########## ; ; VARIABLES ; ;############################################################################ ; CUR_DPB DS 2 æþNNNNNNNNNNNNNNNNNN¡¡¡þ >NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ; MACRO TO DEFINE THE DRIVE ALLOCATION & CHECKSUMS AREA ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@� þ'NNNNNNNNNNNNNNNNN¡¡¡þ´˜NNNNNNNNNNNNNNNNNNNNNNð¡¡¡ûE DRIVE PARAMETER BLOCKS ; ;############################################################################ ; STRUCT 0 DPB_SPÉÂÿùNNNNNNNNNNNNNNNN¡¡¡þX NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD ; (DRM +1) / 4 DPB_OFF DS 2 ;OFF- # RESERVED TRACKS (USUALLY 2) ; ; ADDITIONAL CP/M 3.0 DATA (ALSO COULD BE USED BY Có%ÿ�NNNNNNNNNNNNNNNNN¡¡¡þ{/NNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE THE DPB FOR DRIVE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@x•ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ!‘qNNNNNNNNNNNNNNNNNNNNNN¡¡¡û TITLE CUSTOMIZED BIOS FOR M5B LIST NOCOND BOOT EQU 10H ;10H: SA1004, 11H: PYX27, 3: 8" FLOPPY, 20H: 5" FLOPPY ;************“ßÿéNNNNNNNNNNNNNNNNN¡¡¡þ';×NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û DRIVE 0 ; B JADE 8" FLOPPY PHYSICAL DRIVE 1 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; D SIDE 2 & 3 OF HARD DISK P„’þHNNNNNNNNNNNNNNNN¡¡¡þ-ÔNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûplemented new common IOPB code & Jade floppy firmware support. ; Implemented disk drive driver tables and new function to retur½:þBNNNNNNNNNNNNNNNN¡¡¡þhbNNNNNNNNNNNNNNNNNNNNNN¡¡¡û;DRIVE TABLE PTR CUR_DDT DS 2 ;DRIVE DRIVER TABLE BASE ADDRESS PTR CUR_DPH DS 2 ;DPH PTR ; LOGRQ: DS 1 ;LOG ON REQUEST REG. ЃÿÎNNNNNNNNNNNNNNNNN¡¡¡þ KmNNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@ ; ; ALL = (DSM / 8) + 1 ; CHK = DPB.CKS ; ALLDAL: MACRO #D LIST ON IF ((DD - 1) >= STHD) AND ((DD - 1) = ST8FD) AND ((DD - 1) <= N^,þrNNNNNNNNNNNNNNNNN¡¡¡þ”äNNNNNNNNNNNNNNNNNNNNNN¡¡¡û6K= 7 DPB_BLM DS 1 ;BLM- BLOCK MASK ; 1K = 7, 2K= 15, 4K= 31, 8K= 63, 16K= 127 DPB_EXM DS 1 ;EXM- EXTENT MASK ; DSM < –ÿaNNNNNNNNNNNNNNNN¡¡¡þ>BNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DPB_PHM DS 1 ;PHM- PHYSICAL RECORD MASK BASED ON BYTES/SEC ; 0: 128, 1: 256, 3: 512, 7: 1024 ; ; ADDITIONAL DISK PARTIV›þrNNNNNNNNNNNNNNNN¡¡¡þщNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûDD) LIST OFF ENDM ; ; RESERVE THE DATA SPACE ; DD DL 1 REPT NDRVS LIST OFF ALLDPB 0123456789ABCDEF DD DL DD + 1ÀvÿÂNNNNNNNNNNNNNNNN¡¡¡þ#÷NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û CUPERTINO, CA ; ;**************************************************************************** ; ; CONFIGURATION: ; ; CPM rWþHNNNNNNNNNNNNNNNNN¡¡¡þ)ØNNNNNNNNNNNNNNNNNNNNNN¡¡¡û BOOT = 20H ; A JADE 5" FLOPPY PHYSICAL DRIVE 0 ; B JADE 5" FLOPPY PHYSICAL DRIVE 1 ; C SIDE 0 & 1 OF HARD DISK PHYSICAÉÿÉNNNNNNNNNNNNNNNNN¡¡¡þ/²~NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; Moved system down to 60k. ; 3.01 26 JUN 88 GRH ; Remove 5" floppy support. Implement in CP/M-86 BIOS. ; Change single funé±ÿùNNNNNNNNNNNNNNNN¡¡¡þNNNNNNNNNNNNNNNNNNNNNN¡¡¡û1 ;NUMBER OF BOOT DIRECTORY SEGMENTS SECCNT DS 1 ;SEGMENT SECTOR COUNT LDRPTR DS 2 ;SYSTEM DATA PTR ;#################êƒþNNNNNNNNNNNNNNNNNN¡¡¡þ áËNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD8FD) D#D(DD)ALL: DS 57 ;ALLOCATION BIT MAP FOR 8" DRIVE #D(DD) D#D(DD)CHK DS 32 ;DIRECTORY CHECKSUMS STORAGE (1 BYTE PER SU§ÿrNNNNNNNNNNNNNNNN¡¡¡þÁ·NNNNNNNNNNNNNNNNNNNNNN¡¡¡û256 : 1K= 0, 2K= 1, 4K= 3, 8K= 7, 16K= 15 ; DSM > 255 : 2K= 0, 4K= 1, 8K= 3, 16K= 7 DPB_DSM DS 2 ;DSM- DRIVE STORAGE SIZE (’ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ.|NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTIONING DATA FOR THE LOGICAL DRIVE SELECTION. ; PARTITIONING BY TRACKS ARE IMPLIMENTED THRU BDOS USING DPBOFF ABOVE. ; PARTITI^ÿòNNNNNNNNNNNNNNNN¡¡¡þ„ÚNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LIST ON ENDM ; ; BLOCKING BUFFER ; BLKBUF: DS 1024 ;HOST BUFFER IF (($ - 8000H) > 07700H) OR ($ < 8000H) žÎÿäNNNNNNNNNNNNNNNNN¡¡¡þ$n„NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; DRIVE USAGE IF BOOT = 10H ;HARD DISK BOOT CONFIG. ; A SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; B SIDE 2 & 3 OF HÝùÿNNNNNNNNNNNNNNNNNN¡¡¡þ*M‹NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL DRIVE 0 ; D SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 0 ; E SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; F SIDE 2 & 3 OF HÝàÿ[NNNNNNNNNNNNNNNNN¡¡¡þ0¡3NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûction to return drive table ptr into a BIOS function ; call using restart instruction. ; Change LOGON to specify the ID sect,ãþNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÈNNNNNNNNN�Ï��‚jƒ8„…Ó…¡†n‡<ˆ ‰×‰¤Šr‹@Œ�Ü�ªŽx�E�‘â‘°’}“J”•敳–�—O˜™ë™ºšˆ›Vœ#�ñ�¾ž�Ÿ[ )¡ö¡Ä¢’£_¤-¥û¥É¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þtINNNNNNNNNNNNNNNNNNNNNN¡¡¡ûor & track. At same time, fix bug ; which did not specify the logon track. ; 3.02 7 JUL 88 GRH ; Add '?' to include file ˜ÙÿdNNNNNNNNNNNNNNNNN¡¡¡þÞïNNNNNNNNNNNNNNNNNNNNNN¡¡¡û than swapping Roms itself. ; 3.07 11-25-90 GRH ; Modify for Ver. 1.22 Monitor. ; Fix bug in 8" Hard Disk table which benig@fÿäNNNNNNNNNNNNNNNN¡¡¡þ 1$NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûrom ; DCM8 to CBIOS. ; Remove IOPB ptr passing in IX redundancy. ; Change DPB track-head shift factor to Sector Offset like cþBNNNNNNNNNNNNNNNN¡¡¡þXNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûuffer for ; ID sector read. ; 9-20-91 GRH Fold in redlines. ; 10-21-91 GRH Fix bugs ; 10-22-91 GRH Fix bugs ; 1ÒëþBNNNNNNNNNNNNNNNN¡¡¡þþ“NNNNNNNNNNNNNNNNNNNNNN¡¡¡û======================================= ; FALSE EQU 0 TRUE EQU NOT FALSE ;==============================================¡!ÿNNNNNNNNNNNNNNNNN¡¡¡þT5NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û============================================ ; ; DISK OPERATING SYSTEM ADDRESSES ; ;======================================„Eþ NNNNNNNNNNNNNNNN¡¡¡þ%¾kNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAULT BUFFER ; ; BIOS FUNCTION CALL RESTART VECTOR ; BFUNRST EQU 28H BFUNRSV EQU PAGE0 + BFUNRST BFUNRSI EQU 0C7H + BFUNR€ÿœNNNNNNNNNNNNNNNN¡¡¡þ+�dNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûU 20H ;A DSK_1 EQU 20H ;B DSK_2 EQU 20H ;C DSK_3 EQU 20H ;D DSK_4 EQU 10H ;E DSK_5 EQU 10H ;F NDRVS: EQU 6 ENDIF I›SÿùNNNNNNNNNNNNNNNN¡¡¡þ!NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûnames. ; Change hard disk system tracks directory reference to new format. ; Correct bug in drivers which caused retry to failÛ,þ$NNNNNNNNNNNNNNNNN¡¡¡þÎÑNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûnly (at current level) ; caused the drive table to have bad data (default table was missing ; the 2 deblocking extension bytû·þ$NNNNNNNNNNNNNNNN¡¡¡þdwNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûtrack ; offset. Disk partitioning will add this value to sector word. It ; will be stored in the ID sector data to be dynamišÿòNNNNNNNNNNNNNNNN¡¡¡þˆÏNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û0-23-91 GRH Fix bugs ; 3.13 1-15-92 GRH ; Change hard disk translation to Monitor disks 4 & 5 from 6 & 7. ; 3.14 2-9-92 pàÿäNNNNNNNNNNNNNNNN¡¡¡þ«ÀNNNNNNNNNNNNNNNNNNNNNN¡¡¡û============================== ; ; CONDITIONAL ASSEMBLY FLAGS ; ;===========================================================æ‘ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ AžNNNNNNNNNNNNNNNNNNNNNN¡¡¡û====================================== ; SYS EQU 2 ;CP/M VERSION {2,3} ; NKSYS: EQU 59 ;SYSTEM SIZE IN K BYTES KBYTE: EQUyâÿÎNNNNNNNNNNNNNNNNN¡¡¡þ&ë8NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûST ;============================================================================ ; ; OTHER DECLARATIONS ; ;============ò3ÿnNNNNNNNNNNNNNNNNN¡¡¡þ,óNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûF BOOT = 11H ; ; 5.25" PYX-27 BOOT ; DSK_0 EQU 11H ;A DSK_1 EQU 10H ;B DSK_2 EQU 10H ;C DSK_3 EQU 0H ;D DSK_4 EQU 0 ;EôÿÿùNNNNNNNNNNNNNNNN¡¡¡þ+NNNNNNNNNNNNNNNNNNNNNN¡¡¡û. (sector remained ; corrupted) ; Stubbed out new Clock routines for present. ; 3.03 31 JUL 88 GRH ; Unstub Clock routineéþ!NNNNNNNNNNNNNNNN¡¡¡þ ýàNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûes). ; Implement data xfer inhibit schemes with PB_FLG & PB_BCNT. ; Add pick-up of THIS_BNK data in all iopb cases. ; Remove çòÿÎNNNNNNNNNNNNNNNNN¡¡¡þWFNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûc. ; 3.10 5-20-91 GRH ; Change LOGON to attempt to recover from old disks better, using ; DCM8301 version controller firmw¢OÿÂNNNNNNNNNNNNNNNN¡¡¡þ»þNNNNNNNNNNNNNNNNNNNNNN¡¡¡û GRH ; Add additional floppy disk allocation size for 1.22Mb disks. ; ; 3.15 3-17-92 GRH ; Add dynamic sector skew table ®¾ÿçNNNNNNNNNNNNNNNNN¡¡¡þ˜ñNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û================= ; INTCPTS EQU TRUE ;ENABLE SYSTEM CALL INTERCEPT WHISTLE ;============================================ØiÿÎNNNNNNNNNNNNNNNNN¡¡¡þ!r¯NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û 1024 CPMSZ: EQU KBYTE * NKSYS CPMBS: EQU CPMSZ - (20 * KBYTE) ;CP/M BIAS VALUE CCP: EQU CPMBS + 3400H ;ADDR OF CCP BDOS: –ªÿÎNNNNNNNNNNNNNNNNN¡¡¡þ'Ø NNNNNNNNNNNNNNNNNNNNNN¡¡¡û================================================================ ; SKTSZ EQU 26 ;SKEW TABLE SIZE IF BOOT = 10H ; ; 8" £ÖþNNNNNNNNNNNNNNNN¡¡¡þ-7ÂNNNNNNNNNNNNNNNNNNNNNN¡¡¡û NDRVS: EQU 5 ENDIF ;============================================================================ ; ; BDOS CO Œÿ„NNNNNNNNNNNNNNNN¡¡¡þ‹¼NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûes. ; 3.04 6 AUG 88 GRH ; Remove floppy side select from BIOS & move to controller. ; Implement new ID sector format. ; ImêàÿÎNNNNNNNNNNNNNNNNN¡¡¡þ ¨³NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûclock buffer set/read system calls. ; 12-5-90 GRH ; Remove IX IOPB ptr passing to disk drivers. ; 1-13-91 GRH ; Fix bug wFbÿùNNNNNNNNNNNNNNNNN¡¡¡þD NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûare. ; 3.11 9-2-91 GRH ; Add redlines & change for M5ZMON v.2.00. ; 3.12 9-11-91 GRH ; Add deblocking code. ; 9-17-91 m¡ÿùNNNNNNNNNNNNNNNN¡¡¡þî­NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûselection to login code. ; ; 3.16 5-1-92 GRH ; Add bios functions to allow 'fix'ing the disk format. ; VERSN EQU 316 ; ŸÿnNNNNNNNNNNNNNNNNN¡¡¡þfNNNNNNNNNNNNNNNNNNNNNN¡¡¡û================================ ; ; INCLUDE COMIOPB3.DEF ; INCLUDE DISKS3.DEF ; INCLUDE BDIR.DEF ; INCLUDE ½½ÿòNNNNNNNNNNNNNNNN¡¡¡þ"'üNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEQU CPMBS + 3C00H ;ADDRESS OF BDOS BIOS: EQU CPMBS + 4A00H ;ADDRESS OF BDOS BIOSR: EQU 1000H - BIOS ; ; PAGE 0 LOCATIONS¤ÿ„NNNNNNNNNNNNNNNNN¡¡¡þ(È7NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHARD DISK BOOT DATA ; DSK_0 EQU 10H ;A DSK_1 EQU 10H ;B DSK_2 EQU 10H ;C DSK_3 EQU 10H ;D DSK_4 EQU 0 ;E DSK_5 EQU 0 ;F ·3ÿ�NNNNNNNNNNNNNNNNN¡¡¡þ.b‘NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNSTANTS ON ENTRY TO WRITE ; ;============================================================================ ; WRALL EQU 0 ;WRI{ðÿgNNNNNNNNNNNNNNNNN¡¡¡þ¸�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûplement CP/M 3.0 DPB structure in preparation for deblocking. ; 3.05 11-3-88 GRH ; Change included data to update IOPB.PBSTAíÝÿøNNNNNNNNNNNNNNNNN¡¡¡þ ›‚NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûhich corrupted PB_FLG. ; 3.08 2-22-91 GRH ; Remove references to THIS_BNK & use monitor function #7 instead. ; Add track-heP’ÿdNNNNNNNNNNNNNNNNN¡¡¡þw:NNNNNNNNNNNNNNNNNNNNNN¡¡¡û GRH Add r/ls & move to 59k system. ; 9-19-91 GRH Fix bug which destroyed my root directories! ; BUF_RD was writing. ; C®ÿñNNNNNNNNNNNNNNNN¡¡¡þÝœNNNNNNNNNNNNNNNNNNNNNN¡¡¡û;**************************************************************************** SUBTTL SYSTEM DECLARATIONS ;=================’ÃÿùNNNNNNNNNNNNNNNN¡¡¡þ2WNNNNNNNNNNNNNNNNNNNNNN¡¡¡û M5ZF2.DEF ; ;============================================================================ ; LIST OFF *INCLUDE COMIOPB34hÿyNNNNNNNNNNNNNNNN¡¡¡þ#ÍNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; PAGE0: EQU 0 ;START OF CP/M RAM DEFDRV: EQU PAGE0 + 4 ;DEFAULT DRIVE PARAM ADDR BDOSJV EQU PAGE0 + 5 ;BDOS SYSTEM CALL E—ûÿ�NNNNNNNNNNNNNNNNN¡¡¡þ)ûNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNDRVS: EQU 6 ENDIF IF BOOT = 3 ; ; 8" FLOPPY BOOT DATA ; DSK_0 EQU 0H ;A DSK_1 EQU 0H ;B DSK_2 EQU 10H ;C DSK_3ÚÝÿ“NNNNNNNNNNNNNNNNN¡¡¡þ/Q NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûTE TO ALLOCATED WRDIR EQU 1 ;WRITE TO DIRECTORY WRUAL EQU 2 ;WRITE TO UNALLOCATED ;======================================Y·ÿòNNNNNNNNNNNNNNNN¡¡¡þíÞNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT to new configuration. ; 3.06 1-28-89 GRH ; Revised primitive calling procedures to use the monitor rom function ; rather¾Sÿ!NNNNNNNNNNNNNNNN¡¡¡þ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûad shift factor to DPBs for future use. ; 3.09 5-15-91 GRH ; Change 8" floppy side select to track bit 0. Move calculation f¡?ÿÂNNNNNNNNNNNNNNNN¡¡¡þ"iNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û Patch problems with partitioning until 20MB drive installed. ; Fix TPA corruption by LOGON problem by using ROMBNK sector b&`ÿÉNNNNNNNNNNNNNNNNN¡¡¡þÍ¢NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û=========================================================== ; ; ASSEMBLY PARAMETERS ; ;=====================================ˆÛþBNNNNNNNNNNNNNNNN¡¡¡þgNNNNNNNNNNNNNNNNNNNNNN¡¡¡û.DEF *INCLUDE DISKS3.DEF *INCLUDE BDIR.DEF *INCLUDE B:M5ZF2.DEF LIST ON ;================================T«ÿHNNNNNNNNNNNNNNNNN¡¡¡þ$�ZNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûNTRY THIS_STK EQU PAGE0 + 1CH ;CURRENT STACK FRAME PTR DK_BDRV EQU 0041H ;BOOT DRIVE # FROM PROM DEFBFR EQU PAGE0 + 80H ;DEF¨ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ*®UNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û EQU 10H ;D DSK_4 EQU 10H ;E DSK_5 EQU 10H ;F NDRVS: EQU 6 ENDIF IF BOOT = 20H ; ; 5.25" FLOPPY BOOT ; DSK_0 EQQ£ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ0BíNNNNNNNNNNNNNNNNNNNNNN¡¡¡û====================================== ; ; ASCII CHARS ; ;==================================================================�wÿïNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÎNNNNNþ€Í�›‚iƒ7„…Ó… †m‡;ˆ‰Õ‰¢Šq‹>Œ �Ú�©Žx�E�‘â‘°’~“K”•æ•´–‚—O˜™ì™»š‰›Xœ&�ô�Áž�Ÿ^ +¡ù¡Ç¢•£b¤0¥þ¥Ì¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þCyNNNNNNNNNNNNNNNNNNNNNN¡¡¡û========== ; LF: EQU 0AH CR: EQU 0DH CTRLZ: EQU 1AH ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ (ÿ“NNNNNNNNNNNNNNNNN¡¡¡þéßNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSION TEXT IN RAM MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; PVERS MACRO #VERS ¶‚þdNNNNNNNNNNNNNNNN¡¡¡þ NNNNNNNNNNNNNNNNNNNNNN¡¡¡û JP READER JP HOME ;HOME SELECTED DRIVE JP SELDSK ;SELECT DISK DRIVE JP SETTRK ;SET TRACK # JP SETSEC ;SET SECTOR #â³þBNNNNNNNNNNNNNNNN¡¡¡þ&hNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;SPARE BIOSSZ: DW BIOSND - BIOS ;BIOS MODULE SIZE IN BYTES BIOSST: DW BIOS ;BIOS MODULE LOAD ADDR FOR SBD ; ; CONTINUE ÒÿÂNNNNNNNNNNNNNNNN¡¡¡þÉ£NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNIT: ; ; SET TEMPORARY STACK ; DI LD SP,DEFBFR ;USE PAGE 0 FOR STACK LD (THIS_STK),SP EI ; ; INIT DEFAULT DRIVEÿòNNNNNNNNNNNNNNNNN¡¡¡þcNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;############################################################################ ; ; SIGN-ON MESSAGE ; ;#################N~ÿòNNNNNNNNNNNNNNNN¡¡¡þ%‰[NNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------- ; WARM: ; ; SET TEMPORARY STACK ; DI LD SP,DEFBFR LD (THIS_STK),SP EI ; ; INIT OUR STUFF ; X0�ÿÂNNNNNNNNNNNNNNNN¡¡¡þ+ªTNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û CP A,86H JR C,WEROR ; ; SET UP TO LOAD CCP/BDOS ; LD HL,(DEFBFR + BD_SBDSS) ;PREFETCH BDOS TRK/SECTOR PUSH HL ; LJùþ9NNNNNNNNNNNNNNNN¡¡¡þ*NNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@ ; ; GENERATE THE TRANSLATION TABLE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@¹¡þHNNNNNNNNNNNNNNNNN¡¡¡þùáNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDD DL #VERS IF DD > 9999 DB (DD / 10000) + '0' DD DL DD % 10000 ENDIF IF DD > 999 DB (DD / 1000) + '0' DD DL D¡ŸÿÈNNNNNNNNNNNNNNNN¡¡¡þSGNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û JP SETDMA ;SET TRANSFER ADDR JP DISKRD ;PERFORM DISK READ JP DISKWR ;PERFORM DISK WRITE JP LISTST ;RETURN LIST STAT³‚þrNNNNNNNNNNNNNNNN¡¡¡þ¿ÿNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûON WITH INIT ; INIT1: JR INIT ;############################################################################ ; ; DIRECTOd0ÿdNNNNNNNNNNNNNNNN¡¡¡þœðNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; LD A,(DK_BDRV) ;USE DRIVE # PASSED IN PAGE 0 AND A,3 LD (DEFDRV),A ; ; SEND SYSTEM SIGN-ON ; LD HL,MSGSO CALL¸ðÿÉNNNNNNNNNNNNNNNNN¡¡¡þ v®NNNNNNNNNNNNNNNNNNNNNN¡¡¡û########################################################### ; MSGSO: DB CR,LF DB CPMSZ / (KBYTE * 10) + '0' DB (CPMSZ MOD ÂÿBNNNNNNNNNNNNNNNN¡¡¡þ&ÜNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOR A,A LD (BUF_ACT),A ;ASSUME NO DATA IN BUFFER ; LD (UNA_CNT),A ;CLEAR UNALLOCATED SECTOR COUNT ; LD (BUF_MOD),A ;CLEANy5ÿÂNNNNNNNNNNNNNNNN¡¡¡þ,3ÃNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û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[ÿäNNNNNNNNNNNNNNNN¡¡¡þ%NNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@ ; GXLATE MACRO #SECTORS, #SKEW LIST OFF NXTSEC DL 1 ;;START WITH SECTOR 1 LOWEST DL 1 ;; REPT #SECTORS LIST 93þNNNNNNNNNNNNNNNNNN¡¡¡þ ÊÐNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD % 1000 ENDIF DB (DD / 100) + '0' DB '.' DB ((DD % 100) / 10) + '0' DB (DD % 10) + '0' ENDM SUBTTL BIOS COD<ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ`vNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûUS JP SECTRN ;TRANSLATE SECTOR JP BIOFUNC ;EXECUTE FUNCTION CALL ;###################################################3þBNNNNNNNNNNNNNNNN¡¡¡þŒÎNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRY SECTOR BUFFER STARTS HERE AFTER CRUNCHING COLD START ; CODE. THIS BUFFER IS USED BY THE CP/M DIRECTORY CHECK ROUTINES THAT áBþ'NNNNNNNNNNNNNNNNN¡¡¡þ¯ÁNNNNNNNNNNNNNNNNNNNNNN¡¡¡û EDITOR ; ; MODIFY COLD START VECTOR TO WARM START ; LD HL,(BIOS+4) LD (BIOS+1),HL ; ; INIT OUR STUFF ; CALL GET< ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ!EŸNNNNNNNNNNNNNNNNNNNNNN¡¡¡û(KBYTE * 10)) / KBYTE + '0' DB 'K CP/M-80 Vers 2.2',CR,LF DB 'M5b CBIOS Vers ' PVERS VERSN DM CR,LF IF $ > (…ÐþNNNNNNNNNNNNNNNNNN¡¡¡þ'ï9NNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡û BUFFER ; LD HL,BLKBUF ;INIT BUFFER PTR LD (BUF_DMA),HL ; ; LOG ON DRIVE TO INIT TABLES ; LD A,(DK_BDRV) AND A,3 ÛöÿçNNNNNNNNNNNNNNNN¡¡¡þ-òNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûETDMA ; ; READ CCP/BDOS ; WREAD: CALL DISKRD JR NZ,WEROR ;IF ERROR THEN EXIT ; ; NEXT SECTOR ; LD HL,CPM_SEC IN¤zÿÂNNNNNNNNNNNNNNNN¡¡¡þ¼ŒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûON DB NXTSEC LIST OFF NXTSEC DL NXTSEC + #SKEW ;ADD SKEW FACTOR ;; IF NXTSEC > #SECTORS ;CHECK FOR OVERFLOW NXTSEC DLÊþ!NNNNNNNNNNNNNNNN¡¡¡þ ŸƒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE ORG BIOS ;---------------------------------------------------------------------------- ; ; BIOS JUMP VECTOR TABLE ; ;i¡þ NNNNNNNNNNNNNNNNN¡¡¡þs;NNNNNNNNNNNNNNNNNNNNNN¡¡¡û######################### ; ; THE FOLLOWING BOOT DATA MUST RESIDE AS DEFINED RIGHT BEFORE THE COLD ; INIT ROUTINE START AND M¼iþ NNNNNNNNNNNNNNNN¡¡¡þÙ�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; CHECK FOR DISK CHANGE. ; ;############################################################################ ; DIRBF: EQU $ ;èoþNNNNNNNNNNNNNNNNNN¡¡¡þ6VNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBNK LD (BUF_DMAB),A ; ; INITIALIZE CLOCK VECTORS IF CLOCK INSTALLED ; LD A,MF_CSYN ;TEST FOR BOARD PRESENT CALL XMROMîjÿNNNNNNNNNNNNNNNN¡¡¡þ"ÌNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûDIRBF + 128) CONMSG **** WARNING! COLD INIT CODE BIGGER THAN DIR BUFFER **** ELSE DS DIRBF + 128 - $ ;FILL OUT DIRECTORP“þrNNNNNNNNNNNNNNNNN¡¡¡þ(ÿNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û;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¡¡¡þ.U¡NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûC (HL) ; LD DE,128 ;DMA += SECTOR SIZE LD HL,(CPM_DMA) ADD HL,DE LD (CPM_DMA),HL ; ; IF NOT INTO BDOS THEN READ NE‡$þNNNNNNNNNNNNNNNNNN¡¡¡þ�½NNNNNNNNNNNNNNNNNNNNNN¡¡¡û NXTSEC - #SECTORS ;; IF NXTSEC <= LOWEST ;CHECK FOR REPEAT NXTSEC DL LOWEST + 1 LOWEST DL NXTSEC ENDIF ENDIF ;;þ'NNNNNNNNNNNNNNNNN¡¡¡þ ¬²NNNNNNNNNNNNNNNNNNNNNN¡¡¡û---------------------------------------------------------------------------- ; JP INIT1 ;COLD START ENTRY JP WARM ;RELOAD9Óþ NNNNNNNNNNNNNNNNN¡¡¡þ@ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUST BE IN THE 1ST SECTOR. THESE 2 WORDS ARE ; REFERENCED BY THE BOOT LOADER CODE IN ORDER TO DETERMINE THE LOAD ADDRESS ; AND ¤ÿþNNNNNNNNNNNNNNNNN¡¡¡þê¬NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûBUFFER BEGINNING ;---------------------------------------------------------------------------- ; ; INIT - COLD START òêÿäNNNNNNNNNNNNNNNN¡¡¡þgNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û ; ; IF CLOCK PRESENT THEN TURN ON CLOCK DRIVE ; OR A,A LD A,38H ;COND. JR (ON) JR Z,CLKON ; ; ELSE TURN OFF CLO÷þrNNNNNNNNNNNNNNNN¡¡¡þ##ýNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûY BUFFER TO 1 SECTOR SIZE ENDIF ;---------------------------------------------------------------------------- ; ; WARëÿÎNNNNNNNNNNNNNNNNN¡¡¡þ)Ì6NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û LD BC,DEFBFR ;SET XFER ADDRESS (USE DEFAULT BUFFER) CALL SETDMA ; LD BC,BD_SEC ;SET DIRECTORY SECTOR CALL SETSEC ; Lv—ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ/f�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûXT SECTOR ; LD DE,BDOS XOR A,A SBC HL,DE JR C,WREAD ; ; ELSE IF AT BEGINNING OF BDOS THEN SET UP NEW TRACK & SECTOREoÿÂNNNNNNNNNNNNNNNN¡¡¡þÚîNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ENDM LIST ON ENDM ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; INITIALIZE VERò$þNNNNNNNNNNNNNNNNNN¡¡¡þ 5%NNNNNNNNNNNNNNNNNNNNNN¡¡¡û CCP/BDOS JP CNSCK ;GET CONSOLE STATUS JP CI ;CONSOLE INPUT JP COC ;CONSOLE OUTPUT JP LO ;PRINTER OUTPUT JP PUNCH zÌþBNNNNNNNNNNNNNNNN¡¡¡þYNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûLENGTH OF THE BIOS. ; ;############################################################################ ; DB 0 ;Z80 CPU DB 0’êÿINNNNNNNNNNNNNNNNN¡¡¡þú’NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûENTRY FROM BOOT MUST SET ALL BIOS PARAMS ; ;---------------------------------------------------------------------------- ; I7þBNNNNNNNNNNNNNNNN¡¡¡þP4NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCK DRIVE ; LD A,18H ;UNCOND. JR (OFF) (CAUSES JUMP TO ILLEGAL) ; CLKON: LD (INHCLK),A ; ; BOOT CCP & BDOS ; JR WARMP0ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ$ºjNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûM REBOOT ENTRY LOADS CCP,BDOS FROM DISK & SETS UP VARIABLES ; ;---------------------------------------------------------------´ûÿ^NNNNNNNNNNNNNNNNN¡¡¡þ*™eNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD BC,0 ;SET TRACK TO 0 CALL SETTRK ; CALL DISKRD JR NZ,WEROR ; ; CHECK FOR VALID BOOT DIRECTORY ; LD A,(DEFBFR) Çhÿ“NNNNNNNNNNNNNNNNN¡¡¡þ0uÝNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; JR Z,RDBDOS ; ; ELSE IF NOT AT BIOS THEN READ NEXT SECTOR ; LD DE,BIOS - BDOS SBC HL,DE JP C,WREAD ; ; ELSE¿þ'NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÎNNNNNNNN�Ï�œ‚iƒ6„…Ñ…Ÿ†m‡;ˆ‰Ö‰£Šq‹>Œ �Ú�©Žw�E�‘ᑯ’}“J”•敳–�—O˜™ê™¹š‡›Uœ"�ð�¾ž�Ÿ[ )¡÷¡Ä¢’£_¤-¥ü¥Ë¦žNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þýNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DONE READING SYSTEM ; JR WZRPG ; ; ; ELSE SET UP & READ BDOS ; RDBDOS: POP HL ;RESTORE BDOS TRK/SECTOR FROM DIRECTORà+ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ¨[NNNNNNNNNNNNNNNNNNNNNNð¡¡¡û ; IF INTCPTS ; ; PUT BDOS VECTOR INTO INTERCEPT CODE ; LD HL,(BDOS + 7) LD (BDOSV),HL ; ; NOW PUT INTERCEPT VEZêþNNNNNNNNNNNNNNNN¡¡¡þ G�NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûTION ; XOR A,A LD (UNA_CNT),A ; ; READ_OPERATION_FLAG = TRUE (1) ; INC A LD (READOP),A ; ; PRE-READ_OF_DATA_FL„wÿNNNNNNNNNNNNNNNN¡¡¡þgìNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD (WR_PROT),A ; ; SET PTRS TO DISK DATA ; PUSH IX LD IX,(CUR_DDT) ; PUSH IY LD IY,(CUR_DPB) ; ; IF NOT BLOCsÿBNNNNNNNNNNNNNNNN¡¡¡þˆ'NNNNNNNNNNNNNNNNNNNNNN¡¡¡û IF NO UNALLOCATED SECTORS REMAIN THEN PREREAD ; CHKUNA: LD A,(UNA_CNT) OR A,A JP Z,ALLOC ; ; ELSE MORE UNALLOCATED RE:ÿäNNNNNNNNNNNNNNNNN¡¡¡þ"�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRK) ;TRACK++ INC HL LD (UNA_TRK),HL ; NOOVF: ; ; MATCH FOUND, MARK AS UNNECESSARY READ ; XOR A,A ;PREREAD FLAG = FþdNNNNNNNNNNNNNNNN¡¡¡þ%ÈßNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIS 128 ; SECSHFLP: SRL H ;ELSE SHIFT OVER TO PHYSICAL SECTOR RR L DEC A JP NZ,SECSHFLP ; NOSECSHF: INC HL ;SET :ÿÂNNNNNNNNNNNNNNNN¡¡¡þ+ëÐNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAR HOST BUFF ; JR NZ,RW_RET ;IF ERROR THEN ABORT ; FILHST: ; ; READ THE SECTOR BUFFER ; LD A,(CPM_DSK) ;BUFFER SECTOj¼ÿÎNNNNNNNNNNNNNNNNN¡¡¡þW®NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûY LD C,L LD B,A ;A STILL CONTAINS 0 CALL SETSEC ; LD C,H CALL SETTRK ; JR WREAD ; ; ; WARM BOOT ERROR, OUTPU±¡ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ¸eNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCTOR INTO BDOS CODE ; LD HL,INTCPT LD (BDOS + 7),HL ENDIF ; ; PASS DEFAULT DISK TO CCP ; LD A,(DEFDRV) LD C,A ã þNNNNNNNNNNNNNNNN¡¡¡þÃNNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡ûAG = TRUE ; LD (RSFLAG),A ; ; TREAT AS UNALLOCATED BLOCK ; LD A,WRUAL LD (WRTYPE),A ; JP RWOPER ;TO PERFORM THE €ÐÿòNNNNNNNNNNNNNNNN¡¡¡þþ{NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûKED THEN USE CPM WRITE ; LD A,(IY + DPB_PSH) ;0= 128-BYTE SECTORS OR A,A JP Z,DISKWRN ; ; READ_OP_FLAG = FALSE ; X&þ NNNNNNNNNNNNNNNN¡¡¡þÝtNNNNNNNNNNNNNNNNNNNNN!ô¡¡¡ûCORDS REMAIN, COUNT-- ; DEC A LD (UNA_CNT),A ; ; IF REQUESTED SECTOR != UNALLOCATED SECTOR THEN PURGE ; LD A,(CPM_DSŸÿHNNNNNNNNNNNNNNNNN¡¡¡þ 7*NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûALSE LD (RSFLAG),A JP RWOPER ; ; ; NORMAL NON-BLOCKED WRITE ; DISKWRN: CALL CPM_WR JP RW_RET ; ; ; NOT AN UN¥ÿáNNNNNNNNNNNNNNNN¡¡¡þ&�ŒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBACK TO PHYSICAL SECTOR LD (BUF_PSEC),HL ;BUFFER PHYSICAL SECTOR TO ACCESS ; ; IF BUFFER == EMPTY THEN READ THE PHYSICAL SRFÿÂNNNNNNNNNNNNNNNN¡¡¡þ,rGNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR = PHYSICAL SECTOR LD (BUF_DSK),A ; LD HL,(CPM_TRK) LD (BUF_TRK),HL ; LD HL,(BUF_PSEC) LD (BUF_SEC),HL ; ; IF RéÿäNNNNNNNNNNNNNNNN¡¡¡þdŸNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT MSG & GO TO DEBUGGER ; WEROR: LD HL,MSGLE ;OUTPUT ERROR MESSAGE CALL EDITOR CALL MR_BRK HALT ; ; ; BOOT OK, INIT TÿÎNNNNNNNNNNNNNNNNN¡¡¡þ ‹TNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û JP CCP SUBTTL BIOS DISK FUNCTION ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ÛèÿNNNNNNNNNNNNNNNNNN¡¡¡þ!òNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûREAD ; ; ; NORMAL NON-BLOCKED READ ; DISKRDN: CALL CPM_RD JP RW_RET ;*******************************************JÐÿ NNNNNNNNNNNNNNNN¡¡¡þÍJNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOR A,A LD (READOP),A ; ; SAVE WRITE TYPE ; LD A,C LD (WRTYPE),A ; ; IF 1ST WRITE TO UNALLOCATED (NEW, UNUSED) BLO«ÿÈNNNNNNNNNNNNNNNNN¡¡¡þîENNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûK) ;SAME DISK? LD HL,UNA_DSK CP A,(HL) JR NZ,ALLOC ; LD HL,(UNA_TRK) ;SAME TRACK? LD DE,(CPM_TRK) SBC HL,DE JR NZ¡�ÿ�NNNNNNNNNNNNNNNNN¡¡¡þ!NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûALLOCATED RECORD, REQUIRES PRE-READ ; ALLOC: XOR A,A ;COUNT = 0 LD (UNA_CNT),A ; INC A ;PREREAD FLAG = TRUE LD (RSFA=ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ'®½NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûECTOR ; LD HL,BUF_ACT LD A,(HL) ; LD (HL),1 ;BUFFER = ACTIVE IN ANY CASE ; OR A,A JR Z,FILHST ; ; HOST BUFFER Q†ÿÈNNNNNNNNNNNNNNNN¡¡¡þ-AvNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEQUIRED TO READ THEN READ ; LD A,(RSFLAG) ;NEED TO READ? OR A,A CALL NZ,BUF_RD ;YES, IF 1 ; ; BUFFER = CLEAN ; Xs•ÿÂNNNNNNNNNNNNNNNN¡¡¡þýNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûPAGE 0 ; WZRPG: ; ; INIT BIOS WARM START IN PAGE 0 ; LD A,0C3H LD HL,BIOS + 3 LD (PAGE0),A LD (PAGE0 + 1),HL ; DyþNNNNNNNNNNNNNNNNNN¡¡¡þ ÞNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; ; READ A DISK SECTOR ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++¥šþrNNNNNNNNNNNNNNNNN¡¡¡þ2¿NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û********************************* ; ; WRITE DISK SECTOR FUNCTION ; ENTRY- C= WRITE TYPE: ; 0: WRITE TO ALLOCATED BLOCK (UP¥þ NNNNNNNNNNNNNNNN¡¡¡þ˜NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCK THEN SET PARAMETERS ; CP A,WRUAL JP NZ,CHKUNA ; ; COUNT = NUMBER_OF_SECTORS_IN_BLOCK ; LD A,(IY + DPB_BLM) ;CUR_Dò þNNNNNNNNNNNNNNNNNN¡¡¡þwÒNNNNNNNNNNNNNNNNNNNNNN¡¡¡û,ALLOC ; LD HL,(CPM_SEC) LD DE,(UNA_SEC) SBC HL,DE JR NZ,ALLOC ; ; MATCH, MOVE TO NEXT SECTOR FOR FUTURE REF ; E€ìÿNNNNNNNNNNNNNNNN¡¡¡þ"QHNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLAG),A ; ; ; ; COMMON CODE FOR READ AND WRITE FOLLOWS ; RWOPER: ; ; ASSUME NO ERRORS ; XOR A,A LD (IOPB + PB_STJéÿòNNNNNNNNNNNNNNNNN¡¡¡þ(¾ƒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûACTIVE, SAME AS SEEK BUFFER? ; LD A,(CPM_DSK) LD HL,BUF_DSK ;SAME DISK? CP A,(HL) JR NZ,NOMATCH ; LD HL,(BUF_TRK) ;S`ÿáNNNNNNNNNNNNNNNN¡¡¡þ.%NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOR A,A LD (BUF_MOD),A ; MATCH: ; ; COPY DATA TO OR FROM BUFFER ; LD HL,(CPM_SEC) ;CALCULATE INDEX INTO BUFFER DEC H�lÿHNNNNNNNNNNNNNNNNN¡¡¡þÎ9NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; INIT BDOS CALL VECTOR IN PAGE 0 ; LD HL,BDOS + 6 LD (BDOSJV),A LD (BDOSJV + 1),HL ; ; INIT BIOS CALL VECTOR IN PA©ÿNNNNNNNNNNNNNNNNNN¡¡¡þ í6NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û++++++++ ; DISKRD: ; ; SET UP DATA TABLE PTRS ; PUSH IX LD IX,(CUR_DDT) ; PUSH IY LD IY,(CUR_DPB) ; ; IF NOT¿‚þrNNNNNNNNNNNNNNNNN¡¡¡þŽNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDATE) ; 1: WRITE TO DIRECTORY BLOCK (ALLWAYS WRITE) ; 2: WRITE TO UNALLOCATED BLOCK (NO NEED TO PRE-READ) ; ;***********'cÿüNNNNNNNNNNNNNNNN¡¡¡þ«(NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPB.DPBBLM + 1 ::= (BLKSIZ/128) INC A LD (UNA_CNT),A ; ; SET DISK TO SEEK ; LD A,(CPM_DSK) LD (UNA_DSK),A ; ; SE ÿùNNNNNNNNNNNNNNNN¡¡¡þDãNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûX DE,HL ;UNASEC += 1 INC HL LD (UNA_SEC),HL ; ; IF PAST LAST SECTOR ON TRACK THEN USE 1ST SECTOR OF NEXT TRACK ; LD 9’ÿÂNNNNNNNNNNNNNNNN¡¡¡þ#byNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûATO),A ; ; COMPUTE BUFFER SECTOR ; LD HL,(CPM_SEC) DEC HL ;CONVERT PHYSICAL SECTOR TO LOGICAL ; LD A,(IY + DPB_PSHéNþHNNNNNNNNNNNNNNNNN¡¡¡þ)�²NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAME TRACK? LD DE,(CPM_TRK) SBC HL,DE JR NZ,NOMATCH ; LD DE,(BUF_PSEC) ;SAME SECTOR? LD HL,(BUF_SEC) SBC HL,DE JR 6dþINNNNNNNNNNNNNNNNN¡¡¡þ/'NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL ;CONVERT TO LOGICAL SECTOR (0..N-1) LD A,L ; AND A,(IY + DPB_PHM) ;USE PHYSICAL RECORD MASK DATA (CP/M 3.X) ; RRA æmþ NNNNNNNNNNNNNNNN¡¡¡þ›jNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûGE 0 ; LD HL,BIOFUNC LD (BFUNRSV),A LD (BFUNRSV + 1),HL ; ; SET DEFAULT SECTOR BUFFER ; LD BC,DEFBFR CALL SETDMAcÙÿœNNNNNNNNNNNNNNNN¡¡¡þ t¡NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û BLOCKED THEN USE CPM READ ; LD A,(IY + DPB_PSH) ;0= 128-BYTE SECTORS OR A,A JP Z,DISKRDN ; ; READS DON'T NEED ALLOCAràÿ9NNNNNNNNNNNNNNNN¡¡¡þTÝNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û***************************************************************** ; DISKWR: ; ; REMOVE BOOT WRITE PROTECTION ; XOR A,A Ï,ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ»NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT TRACK TO SEEK ; LD HL,(CPM_TRK) LD (UNA_TRK),HL ; ; SET SECTOR TO SEEK ; LD HL,(CPM_SEC) LD (UNA_SEC),HL ; ; ~þBNNNNNNNNNNNNNNNN¡¡¡þ°NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûE,(IY + DPB_SPT) LD D,(IY + DPB_SPT +1) SBC HL,DE JP C,NOOVF ; LD HL,0 ;SECTOR = 1 LD (UNA_SEC),HL ; LD HL,(UNA_TšÿdNNNNNNNNNNNNNNNNN¡¡¡þ$ûîNNNNNNNNNNNNNNNNNNNNNN¡¡¡û) ;USE PHYSICAL SHIFT FACTOR (CP/M 3.X) AND A,3 ;LIMIT TO 1024 BYTE SECTORS JP Z,NOSECSHF ;IF ALREADY 0 THEN SECTOR SIZE PþNNNNNNNNNNNNNNNNNN¡¡¡þ*ØáNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûZ,MATCH ;SKIP IF MATCH ; NOMATCH: ; ; IF BUFFER == DIRTY THEN WRITE IT OUT BEFORE READING NEW ONE ; CALL BUF_FLSH ;CLE¦Yÿ“NNNNNNNNNNNNNNNNN¡¡¡þ04YNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;BITS <7..1> -> BITS <14..8> LD H,A ; LD A,0 ;BIT 0 -> BIT 7 RRA LD L,A ; ; HL HAS RELATIVE HOST BUFFER ADDRESS ‚sÿÈNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÈNNNNNNþ€Ì�™‚fƒ4„…Ï…�†j‡8ˆ‰Ó‰ Šn‹<Œ �×�¥Žs�@�‘Ý‘«’x“E”•à•­–z—G˜™ä™²š€›Nœ�é�¶ž…ŸS  ¡í¡º¢ˆ£U¤#¥ñ¥¿¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ5ÍNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; LD DE,BLKBUF ADD HL,DE ;HL = HOST ADDRESS ; LD DE,(CPM_DMA) ;GET/PUT CP/M DATA LD BC,128 ;LENGTH OF MOVE ; LD A,?ÙÿÈNNNNNNNNNNNNNNNNN¡¡¡þŸkNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRECTORY WRITE ; XOR A,A ;BUFFER = CLEAN LD (BUF_MOD),A ; CALL BUF_WR ;WRITE TO DISK ; LD A,(IOPB + PB_STATO) ;RETÿäNNNNNNNNNNNNNNNN¡¡¡þ p NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************ ; ; CPM_RD2 PERFORMS THE PHYSICAL READ FROM THE DISK INTO CPM_DMA, ; WITHOUTBdÿ„NNNNNNNNNNNNNNNN¡¡¡þPÜNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSK)= DISK # TO READ FROM ; (CPM_TRK)= TRACK # TO READ FROM ; (CPM_SEC)= SECTOR # TO READ FROM ; (CPM_DMA)= XFER ADDRESS ;,:ÿÂNNNNNNNNNNNNNNNN¡¡¡þ¿NNNNNNNNNNNNNNNNNNNNNN¡¡¡û,PB_BCNTO - PB_TRKO LDIR ; ; EXECUTE LOW LEVEL READ OR WRITE (ON STACK) ; RET ;***********************************ýþNNNNNNNNNNNNNNNNN¡¡¡þ±NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûY POP IX ; ; IF ERROR THEN RETURN IT ; OR A,A RET NZ ; ; ELSE CLEAN BUFFER ; LD (BUF_MOD),A RET ;******†šÿòNNNNNNNNNNNNNNNN¡¡¡þ%ÿïNNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡ûEAD FROM ; (BUF_TRK)= TRACK # TO READ FROM ; (BUF_SEC)= SECTOR # TO READ FROM ; IX= DDT PTR ; IY= DPB PTR ; EXIT - (IOPöÛþBNNNNNNNNNNNNNNNN¡¡¡þ+ÜàNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûD A,E LD (LOGRQ),A ; ; COMPUTE DISK DRIVER TABLE PTR ; CALL RETDVRT ;DRIVE IS STILL IN C REGISTER ; ; IF DRIVE ERR7‡þBNNNNNNNNNNNNNNNN¡¡¡þ`žNNNNNNNNNNNNNNNNNNNNNN¡¡¡û(READOP) ;WHICH WAY? OR A,A JP NZ,RWMOVE ;SKIP IF READ ; ; WRITE OPERATION, MARK AND SWITCH DIRECTION ; LD A,1 ;BUFF‹�ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ�UNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûURN ANY ERRORS ; ; DONE, RESTORE & RETURN ; RW_RET: OR A,A ;SET RESULT STATUS FLAG POP IY POP IX ; RET ;******ª"ÿÉNNNNNNNNNNNNNNNN¡¡¡þ%óNNNNNNNNNNNNNNNNNNNNNN¡¡¡û BLOCKING. ; ENTRY- (CPM_DSK)= DISK # TO READ FROM ; (CPM_TRK)= TRACK # TO READ FROM ; (CPM_SEC)= SECTOR # TO READ FROM ; d»þrNNNNNNNNNNNNNNNN¡¡¡þÉKNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û IX= DDT PTR ; IY= DPB PTR ; EXIT - (IOPB.PB_STATO)= 0: OK, /0: ERROR ; ;*************************************************.|ÿ¤NNNNNNNNNNNNNNNN¡¡¡þêDNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û***************************************** ; ; BUF_FLSH FLUSHES THE BUFFER DATA IF MODIFIED ; ENTRY- (BUF_DSK)= DISK # TO WRIT[úÿÉNNNNNNNNNNNNNNNNN¡¡¡þ NNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************************************************************** ; ; BUF_WR PERFORMS THE PHYSICAL WRITE FROM BLKBUF TO T \þNNNNNNNNNNNNNNNNNN¡¡¡þ&ª¼NNNNNNNNNNNNNNNNNNNNN!ô¡¡¡ûB.PB_STATO)= 0: OK, /0: ERROR ; ;**************************************************************************** ; BUF_RD: ; Ç}ÿùNNNNNNNNNNNNNNNN¡¡¡þ,EwNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOR THEN RETURN (HL= 0) ; RET NZ ; ; ELSE SAVE PTR ; LD (CUR_DDT),HL ; ; FETCH FLAGS ; INC HL ;EXE +1 INC HL zÜÿòNNNNNNNNNNNNNNNN¡¡¡þS¯NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûER = DIRTY LD (BUF_MOD),A ; ; SAVE BUFFER DATA PTRS FOR LATER FLUSHES ; LD (BUF_DDT),IX LD (BUF_DPB),IY ; EX DE,HLròÿÎNNNNNNNNNNNNNNNNN¡¡¡þ ¼dNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û********************************************************************** ; ; CPM_WR PERFORMS THE PHYSICAL WRITE FROM CPM_DMA TO TÿëNNNNNNNNNNNNNNNNN¡¡¡þÂNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û (CPM_DMA)= XFER ADDRESS ; EXIT - (IOPB.PB_STATO)= 0: OK, /0: ERROR ; ;******************************************************›ÿÂNNNNNNNNNNNNNNNN¡¡¡þúzNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*************************** ; CPM_RD: ; LD HL,LL_READ ; ; COMMON CODE ; CPM_RW: PUSH HL LD HL,CPM_TRK ; ; FALL Ò]ÿÈNNNNNNNNNNNNNNNNN¡¡¡þÙuNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûE TO ; (BUF_TRK)= TRACK # TO WRITE TO ; (BUF_PSEC)= SECTOR # TO WRITE TO ; (BUF_DDT)= DDT PTR ; (BUF_DPB)= DPB PTR ; EXgôÿÎNNNNNNNNNNNNNNNNN¡¡¡þ!3+NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHE HOST DISK. ; ENTRY- (BUF_DSK)= DISK # TO WRITE TO ; (BUF_TRK)= TRACK # TO WRITE TO ; (BUF_SEC)= SECTOR # TO WRITE TO ; |³þNNNNNNNNNNNNNNNNNN¡¡¡þ'™�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD HL,LL_READ ; ; COMMON CODE ; BUF_RW: PUSH HL LD HL,BUF_TRK JP RD_WR ;++++++++++++++++++++++++++++++++++++++++Í�ÿÈNNNNNNNNNNNNNNNN¡¡¡þ-vFNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ;FLGS LD C,(HL) ; ; FETCH DISK PARAMETER BLOCK ADDRESS ; INC HL ;DRV INC HL ;DPB_PTR LD E,(HL) INC HL LD D,(@ÿBNNNNNNNNNNNNNNNN¡¡¡þÊ8NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;SOURCE/DEST SWAP ; RWMOVE: ; ; BC INITIALLY 128, DE IS SOURCE, HL IS DEST ; LDIR ; ; DATA HAS BEEN MOVED TO/FROMÐÍÿÂNNNNNNNNNNNNNNNN¡¡¡þ é7NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTHE DISK. ; ENTRY- (CPM_DSK)= DISK # TO WRITE TO ; (CPM_TRK)= TRACK # TO WRITE TO ; (CPM_SEC)= SECTOR # TO WRITE TO ; (CPÞ°þ NNNNNNNNNNNNNNNNN¡¡¡þ�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************** ; CPM_RD2: ; ; SET UP PTRS ; PUSH IX PUSH IY LD IX,(CUR_DDT) LD IY,(CUR_DPB) ; ; EXECUÉûþ NNNNNNNNNNNNNNNN¡¡¡þ¯)NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûINTO COMMON XFER CODE ; ;**************************************************************************** ; ; SET UP IOPB FOk:ÿœNNNNNNNNNNNNNNNN¡¡¡þ@âNNNNNNNNNNNNNNNNNNNNNNð¡¡¡ûIT - (IOPB.PB_STATO)= 0: OK, /0: ERROR ; ;**************************************************************************** ; BUF‹ÿùNNNNNNNNNNNNNNNN¡¡¡þ"fxNNNNNNNNNNNNNNNNNNNNNN¡¡¡û IX= DDT PTR ; IY= DPB PTR ; EXIT - (IOPB.PB_STATO)= 0: OK, /0: ERROR ; ;**************************************************jHÿòNNNNNNNNNNNNNNNNN¡¡¡þ(‰³NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û++++++++++++++++++++++++++++++++++++ ; ; SELECT DRIVE FUNCTION ; LOG-ON - SET DISK PARAMETER BLOCK ; ENTRY- C= DRIVE # ; Eb2ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ.#NNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡ûHL) LD (CUR_DPB),DE ; ; FETCH DISK PARAMETER HEADER ADDRESS ; INC HL ;DPH PTR LD E,(HL) INC HL LD D,(HL) LD (C„þ!NNNNNNNNNNNNNNNN¡¡¡þù NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û HOST BUFFER, IF NOT DIRECTORY THEN DELAY WRITE ; LD A,(WRTYPE) ;IF NOT DIRECTORY THEN DELAY WRITE CP A,WRDIR LD A,(IOPB9,ÿïNNNNNNNNNNNNNNNNN¡¡¡þ ÚNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûM_DMA)= XFER ADDRESS ; IX= DDT PTR ; IY= DPB PTR ; EXIT - (IOPB.PB_STATO)= 0: OK, /0: ERROR ; ;**************************‡âÿrNNNNNNNNNNNNNNNNN¡¡¡þ6¾NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTE READ SECTOR ; CALL CPM_RD ; ; RESTORE PTRS & RETURN ; POP IY POP IX RET ;*********************************E¹ÿzNNNNNNNNNNNNNNNNN¡¡¡þœNNNNNNNNNNNNNNNNNNNNNNð¡¡¡ûR EXECUTION ; ENTRY- HL= PTR TO IOPB IMAGE TRACK DATA ; IX= DDT PTR ; IY= DPB PTR ; (SP)= ADDRESS {LL_READ, LLWRIT} OF EX”’þrNNNNNNNNNNNNNNNN¡¡¡þsÓNNNNNNNNNNNNNNNNNNNNNN¡¡¡û_FLSH: ; ; IF UNMODIFIED THEN RETURN ; LD A,(BUF_MOD) OR A,A RET Z ; ; ELSE SET PTRS TO BUFFER DATA ; PUSH IX †¾ÿùNNNNNNNNNNNNNNNN¡¡¡þ#UINNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û************************** ; BUF_WR: ; LD HL,LL_WRIT JP BUF_RW ;****************************************************éqÿçNNNNNNNNNNNNNNNNN¡¡¡þ)º‚NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û= 0 IF NEW SELECT ; EXIT - HL= PTR TO DPT OR 0 FOR ERROR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++‡†ÿäNNNNNNNNNNNNNNNNN¡¡¡þ/$NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUR_DPH),DE EX DE,HL ;PUT DPH PTR IN HL FOR RETURN ; ; IF NOT FIRST SELECT OR LOGON INHIBITED THEN RETURN TABLE PTR ; L}$ÿ„NNNNNNNNNNNNNNNN¡¡¡þ¬ZNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û + PB_STATO) ;RETURN ANY ERRORS ANYWAY JR NZ,RW_RET ; ; IF ERROR THEN ABORT ; OR A,A JR NZ,RW_RET ; ; NO ERROR/DIX,ÿÂNNNNNNNNNNNNNNNN¡¡¡þ C‘NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û************************************************** ; CPM_WR: ; LD HL,LL_WRIT JP CPM_RW ;****************************2Åÿ„NNNNNNNNNNNNNNNN¡¡¡þcíNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û******************************************* ; ; CPM_RD PERFORMS THE PHYSICAL READ FROM THE DISK INTO CPM_DMA. ; ENTRY- (CPM_D�ÿäNNNNNNNNNNNNNNNNN¡¡¡þŒ&NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûECUTOR ; ;**************************************************************************** ; RD_WR: LD DE,IOPB + PB_TRKO LD BC�ÿÂNNNNNNNNNNNNNNNN¡¡¡þ&€NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û PUSH IY LD IX,(BUF_DDT) LD IY,(BUF_DPB) ; ; WRITE THE BUFFER DATA ; CALL BUF_WR ; ; RESTORE THE PTRS ; POP I³dÿ“NNNNNNNNNNNNNNNNN¡¡¡þ$ÌÞNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û************************ ; ; RDBUF PERFORMS THE PHYSICAL READ FROM THE HOST DISK INTO BLKBUF. ; ENTRY- (BUF_DSK)= DISK # TO RÕþHNNNNNNNNNNNNNNNNN¡¡¡þ*ïÑNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û+++++++++++ ; SELDSK: ; ; STORE DRIVE # FOR FUTURE USE ; LD A,C LD (CPM_DSK),A ; ; SAVE LOGON REQUEST FLAG ; L™,þ$NNNNNNNNNNNNNNNNN¡¡¡þ0iNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD A,(LOGRQ) ;0: LOGON, 1:INHIBIT OR A,C ;0: NORMAL, 1: INHIBIT CPL AND A,1 RET Z ; ; ELSE LOG ON DRIVE ; PUSH IXhFþHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÎNNNNNNNN�Ï�œ‚iƒ7„…Ò…Ÿ†l‡;ˆ‰Ö‰£Šq‹?Œ �Ù�¦Žt�B�‘Þ‘¬’y“F”•á•®–}—J˜™å™´š‚›Pœ�ì�¹žˆŸV $¡ñ¡¿¢�£Z¤)¥ö¥Å¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ™!NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;SAVE REGS PUSH IY ; LD IX,(CUR_DDT) ;SET REGS LD IY,(CUR_DPB) ; LD (IY + DPB_SKT),0 ;ASSUME NO SKEW ; ; ATTEMPT®¾ÿ“NNNNNNNNNNNNNNNNN¡¡¡þ3‡NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û ASSUME NO TRANSLATION AS DEFAULT ; CALL TRNONE ; ; IF SINGLE-DENSITY FLOPPY THEN ASSUME 3740 TRANSLATION ; LD A,(BLK˜�ÿäNNNNNNNNNNNNNNNN¡¡¡þ ÜLNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û XFER DISK PHYSICAL DATA TO TABLE ; LD A,(BLKBUF + ID_HEADS) ; SEL1: LD (IX + DDT_HDS),A ; ; RETURN DRIVE TABLE PTR ; [VÿBNNNNNNNNNNNNNNNN¡¡¡þü0NNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************************* ; ; HOME DRIVE - TREAT AS SEEK TRK 0 ; EXIT - BC= 0 ; ;**********************r`ÿBNNNNNNNNNNNNNNNN¡¡¡þûNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûBC= SECTOR # ; ;**************************************************************************** ; SETSEC: LD (CPM_SEC),BC RûZÿINNNNNNNNNNNNNNNNN¡¡¡þ¹]NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; SECTRN: ; ; IF NO TRANSLATION THEN RETURN SECTOR++ ; LD «ÀÿNNNNNNNNNNNNNNNN¡¡¡þ%SNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLD (LOGIOPB + PB_DMAXO),A ; LD HL,LOGIOPB LD DE,IOPB LD BC,PB_STATO LDIR ; ; EXECUTE WITHOUT COMPENSATION ; JR L÷ÿBNNNNNNNNNNNNNNNN¡¡¡þ+p NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; LL_WRIT: ; ; IF STILL PROTECTED THEN …3ÿÂNNNNNNNNNNNNNNNN¡¡¡þÌrNNNNNNNNNNNNNNNNNNNNNN¡¡¡û TO READ ID SECTOR ; CALL BUF_FLSH ;FLUSH BUFFER 1ST JR NZ,LOGERR ; CALL DISKLOG JR NZ,LOGERR ; ; IF NO ID SECTOR *Mÿ“NNNNNNNNNNNNNNNNN¡¡¡þ#¹NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBUF + ID_FLGO) AND A,[1 SHL DF_DTDB] OR [1 SHL DF_HARDB] CALL Z,TR8 ; ; IF NO DYNAMIC SKEW TABLE SPECIFIED THEN TRANSLATVðÿÉNNNNNNNNNNNNNNNN¡¡¡þ‰NNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡û LD HL,(CUR_DPH) XOR A,A ;RETURN NO-ERROR JR LGDONE ; ; ; NO ID SECTOR, USE DEFAULT DATA ; LGDEF: ; ; IF NOT HA…ÿòNNNNNNNNNNNNNNNN¡¡¡þe§NNNNNNNNNNNNNNNNNNNNNN¡¡¡û****************************************************** ; HOME: ; ; IF PENDING WRITE (BUFFER DIRTY) THEN IGNORE ; LD A,(õœÿòNNNNNNNNNNNNNNNN¡¡¡þF¨NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûET ;**************************************************************************** ; ; SET TRANSFER ADDR ; ENTRY- BC= ADDRÇ0ÿäNNNNNNNNNNNNNNNNN¡¡¡þ ¬öNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûA,D ;IF TABLE ADDR = 0 THEN NO TRANSLATION OR A,E JP Z,NOTRAN ; ; ELSE CALCULATE NEW SECTOR FROM TABLE ; EX DE,HL A~@ÿ�NNNNNNNNNNNNNNNNN¡¡¡þ&PNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL_DO ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; LOW LEVEL READ ; ENTRY- IX= DDT P¾"ÿBNNNNNNNNNNNNNNNN¡¡¡þ,é›NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûERROR ; LD A,(WR_PROT) OR A,A JR NZ,DO_ERR ; ; INHIBIT UPLOAD ; LD A,1 SHL PB_INHX LD (IOPB + PB_FLGO),A ; ; I®ÿòNNNNNNNNNNNNNNNN¡¡¡þÿCNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTHEN USE DEFAULT DPB ; (NOTE: CONTROLLER HAS SET IT'S DISK DEFAULTS IN DEFBFR IN ALL CASES) ; ID SECTOR TYPES ARE: ; -1: NON#ÆÿáNNNNNNNNNNNNNNNN¡¡¡þ ˆNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûION IS DONE ; LD A,(BLKBUF + ID_SKWO) LD (IY + DPB_SKT),A ;IF 0 THEN DISABLES SKEW ADDITION OR A,A JR Z,NO_SKW ; ; j~ÿNNNNNNNNNNNNNNNNNN¡¡¡þº.NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRD DISK THEN GO DO FLOPPY TEST ; BIT DDT_HDB,(IX + DDT_FLG) JR Z,LGCKFD ; ; ELSE USE HARD DISK DEFAULTS ; CALL TRNONM�ÿùNNNNNNNNNNNNNNNN¡¡¡þV–NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBUF_MOD) OR A,A JR NZ,HOME2 ; ; ELSE PURGE BUFFER ; LD (BUF_ACT),A ; HOME2: ; ; JUST SET TRACK TO 0 ; LD BC,‚hÿ�NNNNNNNNNNNNNNNNN¡¡¡þu™NNNNNNNNNNNNNNNNNNNNNNþ€¡¡¡ûESS ; EXIT - A= ? ; ;**************************************************************************** ; SETDMA: LD (CPM_DMA),BCŒÐÿœNNNNNNNNNNNNNNNN¡¡¡þ!ŸÇNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDD HL,BC LD L,(HL) ; LD H,0 RET ; ; ; CONVERT FROM CP/M'S LOGICAL SECTOR {0..N-1} TO PHYSICAL SECTOR {1..N} ; N­ÍþHNNNNNNNNNNNNNNNNN¡¡¡þ'5aNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûTR ; IY= DPB PTR ; EXIT - IOPB.PB_STATO, A= STATUS ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++˜ÿ“NNNNNNNNNNNNNNNN¡¡¡þ-ÚªNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û CALCULATE DOWNLOAD BYTE COUNT ; LD A,(IY + DPB_PSH) ;USE SHIFT FACTOR {0:128, 1:256, 2:512, 3:1024} LD HL,128 ;START WITHî\ÿÂNNNNNNNNNNNNNNNN¡¡¡þfÔNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûE 0: OLD JADE DD ; 2: EXTENDED 3: PARTITIONED, 0-FILLED ; LD A,(IOPB + PB_ST2O) CP A,-1 JR Z,LGDEF ; ; ELSE IF TY8¦ÿáNNNNNNNNNNNNNNNN¡¡¡þ EÛNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûELSE VALID SKEW TABLE ON DISK, TRANSFER TO SKEW BUFFER ; LD HL,BLKBUF ;CALCULATE PTR TO TABLE LD E,A LD D,0 ADD HL,DE 1ÿ„NNNNNNNNNNNNNNNNN¡¡¡þ©cNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûE ; NO XLATE LD HL,HDPBK ; ; XFER DATA TO TABLES ; SEL2: LD DE,(CUR_DPB) ; USE DEFAULT TABLE LD BC,DPB_SZ LDIR ;|YÿrNNNNNNNNNNNNNNNN¡¡¡þÅNNNNNNNNNNNNNNNNNNNNNN¡¡¡û0 ; ; FALL INTO SET TRACK ; ;**************************************************************************** ; ; SET TRêñÿNNNNNNNNNNNNNNNNNN¡¡¡þìNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; LD A,(BUF_DMAB) ;FETCH BANK ADDRESS SET BY COLD START LD (CPM_DMAB),A ; ; DONE ; RET ;++++++++++++++++++++++1XÿÂNNNNNNNNNNNNNNNN¡¡¡þ"Ê”NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûOTRAN: LD HL,1 ADD HL,BC RET SUBTTL DISK SUPPORT ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++À+ÿäNNNNNNNNNNNNNNNNN¡¡¡þ(%_NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++ ; LL_READ: ; ; ENABLE UPLOAD ; XOR A,A LD (IOPB + PB_FLGO),A ; ; DISABLE DOWNLOAD ; LD HL,0 LD (IOPBqºþBNNNNNNNNNNNNNNNN¡¡¡þ.�ùNNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡û 128 BYTES ; AND A,3 ;LIMIT TO 1024-BYTE SECTORS ; JR Z,LL_WR2 ;IF SHIFT_FACTOR == 0 THEN DONE ; LL_WR3: ADD HL,HL ;DOÈCÿNNNNNNNNNNNNNNNNNN¡¡¡þUåNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPE == 3 THEN OK ; CP A,3 JR NC,TYPE3_ID ; ; ELSE PAD UNINITIALIZED DATA TO 0 ; LD HL,BLKBUF + ID_PSHO ;FILL DATA WITp ÿ�NNNNNNNNNNNNNNNNN¡¡¡þ vêNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; EX DE,HL ;CALCULATE BUFFER PTR LD HL,(CUR_DPB) LD BC,DPB_SKT ADD HL,BC EX DE,HL ; LD BC,SKTSZ LDIR ; NO_SKW:£Ôÿ NNNNNNNNNNNNNNNNN¡¡¡þšRNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD A,(HL) ;HEADS VALUE JR SEL1 ; ; ; USE 8" FLOPPY DEFAULTS ; LGCKFD: CALL TR8 LD HL,SD8PBK JR SEL2 ; ; ERRr+ÿþNNNNNNNNNNNNNNNNN¡¡¡þ0ôNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûACK # ; ENTRY- BC= TRACK # ; ;**************************************************************************** ; SETTRK: LD (ÊÓÿ NNNNNNNNNNNNNNNN¡¡¡þß?NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SECTOR TRANSLATION FUNCTION ; ENTRY- DE= 0: NO XLATE, ELSE PTR TO 2DþBNNNNNNNNNNNNNNNN¡¡¡þ#ù¥NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++ ; ; LOGON DISK FUNCTION ; ENTRY- IX= DDT PTR ; IY= DPB PTR ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++ðÿäNNNNNNNNNNNNNNNNN¡¡¡þ)nNNNNNNNNNNNNNNNNNNNNNN¡¡¡û + PB_BCNTO),HL ; ; PASS READ SECTOR COMMAND ; LD A,PB_READC JP LL_RW ;+++++++++++++++++++++++++++++++++++++++++++€UÿäNNNNNNNNNNNNNNNNN¡¡¡þ/¼ÈNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUBLE COUNT DEC A JP NZ,LL_WR3 ; LL_WR2: LD (IOPB + PB_BCNTO),HL ; ; PASS WRITE COMMAND ; LD A,PB_WRITC ; ; FALL¬”ÿòNNNNNNNNNNNNNNNN¡¡¡þ¶NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûH 0S LD B,ID_FLGO - ID_PSHO ; PADIDL: LD (HL),0 INC HL DJNZ PADIDL ; ; PROCESS TYPE-3 ID SECTOR ; TYPE3_ID: ; ; ûÿáNNNNNNNNNNNNNNNN¡¡¡þ ï}NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; XFER DISK DATA TO DPB ; LD DE,(CUR_DPB) ;GET ADDR OF DPB LD HL,BLKBUF + ID_SPTO LD BC,DPB_SZ - 1 LDIR ; ; ßœÿ„NNNNNNNNNNNNNNNN¡¡¡þÏNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOR EXIT ; LOGERR: LD HL,0 ; ; DONE ; LGDONE: POP IY ;RESTORE REGS POP IX RET ;*********************************ÿ$NNNNNNNNNNNNNNNNN¡¡¡þ ÊNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCPM_TRK),BC RET ;**************************************************************************** ; ; SET SECTOR ; ENTRY- n!ÿNNNNNNNNNNNNNNNN¡¡¡þŠlNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûXLATE TABLE ; BC= SECTOR # TO XLATE ; EXIT - HL= XLATED SECTOR OR BC + 1 ; BC= UNCHANGED ; A, DE= ? ; ;++++++++++++++++VÊÿ“NNNNNNNNNNNNNNNNN¡¡¡þ$`2NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; DISKLOG: ; ; SET UP READ IOPB ; LD A,(BUF_DMAB) ’2ÿáNNNNNNNNNNNNNNNN¡¡¡þ*C=NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++ ; ; LOW LEVEL WRITE ; ENTRY- IX= DDT PTR ; IY= DPB PTR ; EXIT - IOPB.PB_STATO, A= STATUSà{ÿçNNNNNNNNNNNNNNNNN¡¡¡þ0¯…NNNNNNNNNNNNNNNNNNNNNN¡¡¡û INTO COMMON CODE ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; COMMON IOPB EXECUT5 ÿHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNäNNNNNNþ€Ì�š‚gƒ5„…Ð…ž†k‡9ˆ‰Õ‰¢Šp‹>Œ �Ø�¦Žt�B�‘Þ‘¬’z“H”•䕲–€—M˜™é™·š…›Sœ!�ï�½žŒŸZ (¡õ¡Ã¢‘£_¤-¥û¥É¦ÎNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ®NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûER ; ENTRY- A= COMMAND ; IX= DRIVE TABLE PTR ; IY= DPB PTR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ $ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ·NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR ; IOPBDMP: LD A,(BUF_DMAB) ;SET BANK LD E,A ; LD HL,IOPB LD A,MF_DIOB ;USE DISPLAY IOPB DATA FUNCTION CALL XMROM fÿNNNNNNNNNNNNNNNN¡¡¡þ ë|NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;RETURN -1 TO BDOS OR A,A RET ; ; ; DISPLAY WRITE PROTECT ERROR MESSAGE ; DO_ERR: LD HL,WP_ERM CALL EDITOR JR IÌLþBNNNNNNNNNNNNNNNN¡¡¡þËNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD DISK ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE IOPB PRIMITIVE ñ®ÿBNNNNNNNNNNNNNNNN¡¡¡þ$ËNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+ ; HDEXEC: EQU XPRIM SUBTTL JADE FLOPPY DRIVER ROUTINES ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++¨Pÿ“NNNNNNNNNNNNNNNNN¡¡¡þŽmNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûKEW ENABLED THEN TRANSLATE IT ; FD8SNGL: PUSH IY ;CALCULATE PTR TO TABLE POP HL LD DE,DPB_SKT ADD HL,DE ; LD DE,(IÛÿäNNNNNNNNNNNNNNNN¡¡¡þ%d3NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; FUNCTION DISPATCHER ; ENTRY- A= FUNCTION # ; EXIT - v�ÿÂNNNNNNNNNNNNNNNN¡¡¡þ+GNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLD HL,(IOPB + PB_TRKO) ;FETCH CURRENT TRACK PUSH HL ;SAVE CURRENT TRACK FOR RESTORATION ; LD A,(IX + DDT_HDS) ;IF HEADS =™§þ|NNNNNNNNNNNNNNNN¡¡¡þ"ý¤NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûANSLATED SECTOR # FROM TABLE LD (IOPB + PB_SECO),A ; NOSKEW: ; ; EXECUTE THE IOPB ; CALL XPRIM ; ; RESTORE THE MOdÿ NNNNNNNNNNNNNNNNN¡¡¡þ(oNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û,-1 RET ; BF_OK: ; ; ELSE COMPUTE TABLE ENTRY ; PUSH HL ;SAVE POSSIBLE DATA ; LD HL,BFUNTBL ADD A,A ADD A,L |˜ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ.¸ÉNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûTBL) / 2 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN BIOS VERSION # - FUNCTI-”ÿ\NNNNNNNNNNNNNNNN¡¡¡þbÕNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRN ADDRESS ON STACK PUSH HL ; LD L,(IX + DDT_EXE) ;FETCH DRIVER ADDRESS FROM TABLE LD H,(IX + DDT_EXE + 1) JP (HL) ; ¤ðÿçNNNNNNNNNNNNNNNNN¡¡¡þ AÚNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûP A,'A' ;IF ABORT THEN RE-BOOT JP Z,0 ; ; ELSE IF DEBUGGER THEN EXECUTE IT ; CP A,'M' JP Z,MR_BRK ; ; ELSE IF IGâþrNNNNNNNNNNNNNNNNN¡¡¡þ­bNNNNNNNNNNNNNNNNNNNNNN¡¡¡û**************************************************************** ; ; SET NO SECTOR TRANSLATION PROCEDURE ; EXIT - HL, DE= ? ´ þNNNNNNNNNNNNNNNNN¡¡¡þÄNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; HARD DISK DRIVER FUNCTION ; ENTRY- IX=3ÕÿòNNNNNNNNNNNNNNNN¡¡¡þèNNNNNNNNNNNNNNNNNNNNNN¡¡¡û= 1 THEN SKIP MODIFICATION DEC A JR Z,FD8SNGL ; LD A,(IOPB + PB_SECO + 1) ADD A,A ;BIT 15 -> BIT_BUCKET ; SRL H ʲÿ„NNNNNNNNNNNNNNNN¡¡¡þ#ΕNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDIFIED IOPB SO RETRY WILL WORK ; POP HL ;RESTORE ORIGINAL SECTOR RES 7,H ;CLEAR SIDE BIT 1ST LD (IOPB + PB_SECO),HL ›èÿHNNNNNNNNNNNNNNNNN¡¡¡þ)!^NNNNNNNNNNNNNNNNNNNNNN¡¡¡û 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),HL z8ÿNNNNNNNNNNNNNNNNN¡¡¡þ/‹øNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûON #0 ; EXIT - HL= VERSION # IN BINARY {0.00,..655.35} ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ÆNþ9NNNNNNNNNNNNNNNN¡¡¡þ7†NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; DRIVER RETURNS HERE ; LL_OPRET: ; ; IF NO ERRORS THEN RETURN ZF ; RET Z ;IF NO_ERROR THEN RETURN ; ; PRINT ERROé†ÿœNNNNNNNNNNNNNNNN¡¡¡þ ØMNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNORE THEN RETURN NO ERROR ; SUB A,'I' ;IF IGNORE THEN RETURN NO ERROR RET Z ; ; ELSE RETURN ERROR TO BDOS ; LD A,-1©{ÿÂNNNNNNNNNNNNNNNN¡¡¡þø1NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ;**************************************************************************** ; TRNONE: LD DE,0 JR SETTR SUBTTL HARÝhÿ¯NNNNNNNNNNNNNNNNN¡¡¡þúNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DRIVER TABLE PTR ; EXIT - A= 0: OK; /0: ERROR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++JaÿÂNNNNNNNNNNNNNNNN¡¡¡þ½\NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûRR L RRA ;TRK BIT 0 -> SECTOR BIT 15 LD (IOPB + PB_SECO + 1),A ; LD (IOPB + PB_TRKO),HL ;TRACK = RESIDUAL ; ; IF Sü°ÿ“NNNNNNNNNNNNNNNNN¡¡¡þ$WNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; POP HL ;RESTORE ORIGINAL TRACK LD (IOPB + PB_TRKO),HL ; ; DONE ; RET SUBTTL BIOS FUNCTION CALLS ;+++++++++ ÍþNNNNNNNNNNNNNNNNNN¡¡¡þ*t NNNNNNNNNNNNNNNNNNNNN!ô¡¡¡û;PUT CALLER'S DATA IN HL, FUNCTION ADDR ON RET ; STACK, EXECUTE FUNCTION ADDRESS ON STACK ;############################v©ÿäNNNNNNNNNNNNNNNNN¡¡¡þ0˜µNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++ ; BF_RVERS: ; ; RETURN VERSION ; LD HL,VERSN ; ; RETURN NO ERROR ; XOR A,A RET ;+++++++++++++++¨–þHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�Ï��‚kƒ9„…Ô…¡†n‡<ˆ ‰×‰¤Šr‹?Œ �Ú�©Žw�E�‘â‘°’}“J”•啲–€—M˜™è™·š…›Sœ!�ï�¼ž‹ŸY '¡ô¡Á¢�£]¤,¥ú¥È¦žNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þï•NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN MONITOR DRIVE # - FUNCTION #1 ; ENTRY- C= CP/M DRIVEµôÿÈNNNNNNNNNNNNNNNNN¡¡¡þE3NNNNNNNNNNNNNNNNNNNNNN¡¡¡û 0: OK, /0: ERROR ; BC,DE,HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; BF_DLOG:‚gÿìNNNNNNNNNNNNNNNN¡¡¡þ ªøNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ELSE ENABLE LOGON ; LD DE,DDT_FLG ;OFFSET TO FLAGS ADD HL,DE RES 0,(HL) ; ; RETURN NO ERROR ; XOR A,A RET .ÿ„NNNNNNNNNNNNNNNN¡¡¡þŠ„NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûF LOGON DID IT ; EX DE,HL ;HL=SRC LD DE,BLKBUF ;DEST LD BC,128 ;MUST BE IN 1ST 128 BYTES LDIR ; ; IF ID-TYPE NOT Pÿ„NNNNNNNNNNNNNNNN¡¡¡þeONNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û+++++++++++++++++++++ ; RETDVRT: ; ; ASSUME DRIVE 0 ; LD HL,DDT_0 ;START AT 1ST TABLE ; ; IF DRIVE == 0 THEN ALREADÖ$ÿÉNNNNNNNNNNNNNNNNN¡¡¡þÏéNNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************************************** ; ; NEWLINE PROCEDURE ; ;******************************************v þ NNNNNNNNNNNNNNNN¡¡¡þ%%·NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûONDITIONAL JUMP IS MODIFIED TO AN UNCONDITIONAL JUMP BY ; THE WARM BOOT ROUTINE IF THE CLOCK/CALENDAR BOARD IS NOT PRESENT ; û¼ÿBNNNNNNNNNNNNNNNN¡¡¡þ+¸NNNNNNNNNNNNNNNNNNNNNN¡¡¡û C,A LD B,A RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CDOS RETURN VERSIONÒ8ÿáNNNNNNNNNNNNNNNN¡¡¡þºÆNNNNNNNNNNNNNNNNNNNNNN¡¡¡û # {0..15} ; EXIT - A= {0..253}: MONITOR DRIVE # ; -2: DRIVE ERROR ; BC,DE,HL= ? ; ;++++++++++++++++++++++++++++++++++[3ÿINNNNNNNNNNNNNNNNN¡¡¡þU NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; FETCH TABLE PTR ; CALL RETDVRT ; ; IF ILLEGAL DRIVE THEN RETURN ERROR ; JR NZ,ARGERR ; ; ELSE SET LOGON D�ÿNNNNNNNNNNNNNNNN¡¡¡þÿ«NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SET DISK FORMAT - FUNCTION #4 ; ENTRY- CŽÿòNNNNNNNNNNNNNNNN¡¡¡þNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û3 THEN ERROR ; LD A,(BLKBUF + 1FH) ;FETCH TYPE SUB A,'3' RET C ; ; SET DATA USING LOGON CODE ; LD HL,BF_SRET ;FAKED`ÿ NNNNNNNNNNNNNNNN¡¡¡þ0NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûY THERE ; LD A,C OR A,A RET Z ; ; ELSE IF ILLEGAL DRIVE THEN RETURN ERROR ; CP A,NDRVS JR C,RETDV2 ; LD HL,0 .óÿdNNNNNNNNNNNNNNNNN¡¡¡þ ÚBNNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************************* ; CRLF: LD C,CR CALL COC LD C,LF JP COC IF INTCPTS SUBTTL ADDITIONAL FUNCTIONtOÿáNNNNNNNNNNNNNNNN¡¡¡þ&päNNNNNNNNNNNNNNNNNNNNNN¡¡¡û IF NOT MODIFIED, THEN IT IS ALLWAYS FALSE (NOP). ; INHCLK: JR C,ILLEGC ; ; NOW CHECK FOR EXTENDED CALLS ; CP A,8DH ;IF;2ÿyNNNNNNNNNNNNNNNN¡¡¡þ,Ÿ/NNNNNNNNNNNNNNNNNNNNNNð¡¡¡û FUNCTION ; MAKES CLOCK/CALENDAR WORK. ; EXIT - B= 1 ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ bÿNNNNNNNNNNNNNNNN¡¡¡þ‰÷NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++ ; BF_RDRV: ; ; FETCH TABLE PTR ; CALL RETDVRT ; ; IF ILLEGAL DRIVE THEN gƒþNNNNNNNNNNNNNNNNNN¡¡¡þ fÿ$NNNNNNNNNNNNNNNNN¡¡¡þøÙNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR TABLE RECORD ; ENTRY- #DADD= DRIVER ADDRESS ; #PD= PHYSICAL DRIVE # ; #FLG= DRIVE FLAGS ; #DPB= DPB ADDRESS ; #DPH= D·ÃÿäNNNNNNNNNNNNNNNN¡¡¡þ%‡NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE DDT_4: ALLDRV FD8EXEC,0,0,D4DPB,D4DPH,1,0 ; F DDT_5: ALLDRV FD8EXEC,1,0,D5DPB,D5DPH,1,0 ENDIF IF BOOT = 11H ; äÿáNNNNNNNNNNNNNNNN¡¡¡þ+1ˆNNNNNNNNNNNNNNNNNNNNNN¡¡¡û########################################## ; ; MESSAGES ; ;###############################################################{þ9NNNNNNNNNNNNNNNN¡¡¡þ�öNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûM ENDIF ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; MONITOR ROM EXECUTER ; ENTTîÿ$NNNNNNNNNNNNNNNNN¡¡¡þb=NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD A,MF_CIS JP XMROM ;**************************************************************************** ; ; CONSOLE OUTPUT ;gQÿ$NNNNNNNNNNNNNNNN¡¡¡þÈ›NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNCH: RET ;**************************************************************************** ; ; PRINTER DRIVER ; ENTRY- C= CHÅWþrNNNNNNNNNNNNNNNN¡¡¡þ$#NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û** ; EDITOR: CALL GETBNK LD E,A LD A,MF_PUTS JP XMROM SUBTTL INITIALIZED DATA ;################################YdþrNNNNNNNNNNNNNNNN¡¡¡þ,NNNNNNNNNNNNNNNNNNNNNN¡¡¡û############################### ; STRUCT 0 DDT_EXE DS 2 ;START ADDRESS OF DISK DRIVER DDT_FLG DS 1 ;FLAGS BIT DEF. ; 0ê®ÿdNNNNNNNNNNNNNNNNN¡¡¡þ írNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPH ADDRESS ; #HDS= HEADS ; #SOF= SECTOR OFFSET ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@›6ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ&GÔNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA DDT_0: ALLDRV HDEXEC,6,10H,D0DPB,D0DPH,4,0 ; B DDT_1: ALLDRV HDEXEC,6,12H,D1DPB,D1DPH,4,8000H ; C DDT_2: ALLDRV HDEXEÁöÿÂNNNNNNNNNNNNNNNN¡¡¡þ,¨NNNNNNNNNNNNNNNNNNNNNN¡¡¡û############# ; MSGLE: DM CR,LF,'LOAD ERROR' ; DSKEB: DM CR,LF,'Abort, Ignore, Retry, (BDOS) - ' ; WP_ERM: DM CR,LF,'W-PROãqÿNNNNNNNNNNNNNNNN¡¡¡þ¾ÇNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRY- A= FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; XMROM: EQU MR_FUN 3¢þBNNNNNNNNNNNNNNNN¡¡¡þ Q NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ENTRY- C= CHAR TO OUTPUT ; ;**************************************************************************** ; COC: LD A,MF_CݽÿÈNNNNNNNNNNNNNNNNN¡¡¡þûªNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAR TO OUTPUT ; ;**************************************************************************** ; LO: LD A,MF_LO JP XMROM `%þBNNNNNNNNNNNNNNNN¡¡¡þNNNNNNNNNNNNNNNNNNNNNN¡¡¡û############################################ ; ; 3740 SECTOR TRANSLATION TABLE ; **** CP/M SINGLE DENSITY **** ; ;#########J^þNNNNNNNNNNNNNNNNNN¡¡¡þ4NNNNNNNNNNNNNNNNNNNNNN¡¡¡û 1: INHIBIT LOGON ; 1..3 PARTITION # {0,..7} DDT_HDB EQU 4 ;1: HARD DISK DRIVE ; DDT_DRV DS 1 ;PHYSICAL DRIVE # DDT_¿�þNNNNNNNNNNNNNNNNNN¡¡¡þ!ÞCNNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@ ; ALLDRV MACRO #DADD,#PD,#FLG,#DPB,#DPH,#HDS,#SOF DW #DADD ;DRIVER EXECUTION ADDR DB #FLG ;FLAGS DB #PD ;MONITOR#ÔÿÎNNNNNNNNNNNNNNNNN¡¡¡þ'tåNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûC,4,10H,D2DPB,D2DPH,4,0 ; D DDT_4: ALLDRV FD8EXEC,0,0,D4DPB,D4DPH,1,0 ; E DDT_5: ALLDRV FD8EXEC,1,0,D5DPB,D5DPH,1,0 ¤9ÿHNNNNNNNNNNNNNNNN¡¡¡þ-›.NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûT Error!' ; IF INTCPTS ISCMSG: DM CR,LF,'ILL SYS CALL, #= ' ENDIF ;##############################################ŠÂÿÂNNNNNNNNNNNNNNNN¡¡¡þ'PNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSUBTTL CHAR I/O ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CONSOLE INPUT ; E·\ÿœNNNNNNNNNNNNNNNN¡¡¡þ _NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûO JP XMROM ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; READER DRIVER - DUMMY ; E:„ÿòNNNNNNNNNNNNNNNNN¡¡¡þèçNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN LIST DEVICE STATUS ; EXIT - A= 0ï¹þ NNNNNNNNNNNNNNNN¡¡¡þBANNNNNNNNNNNNNNNNNNNNNN¡¡¡û################################################################### ; SDTRAN: GXLATE 26,6 ;##############################ÿGÿîNNNNNNNNNNNNNNNNN¡¡¡þ­ŠNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDPB DS 2 ;DPB ADDRESS FOR THIS DRIVE DDT_DPH DS 2 ;DPH ADDRESS FOR THIS DRIVE ; ; THE FOLLOWING MAY BE BROUGHT OFF DISK DES„ÿyNNNNNNNNNNNNNNNN¡¡¡þ"‹NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û PHYSICAL DRIVE # DW #DPB ;DISK PARAMETER BLOCK PTR DW #DPH ;DISK PARAMETER HEADER PTR DB #HDS ;HEADS DW #SOF ;SECTOÿäNNNNNNNNNNNNNNNNN¡¡¡þ(dÛNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûENDIF IF BOOT = 3 ; A DDT_0: ALLDRV FD8EXEC,0,0,D0DPB,D0DPH,1,0 ; B DDT_1: ALLDRV FD8EXEC,1,0,D1DPB,D1DPH,1,0 ; CøÿaNNNNNNNNNNNNNNNN¡¡¡þ.Î}NNNNNNNNNNNNNNNNNNNNNN¡¡¡û############################## ; ; DEFAULT 8" FLOPPY DISK PARAMETER BLOCK ; IBM 3740 SINGLE DENSITY FORMAT ; ;#############V²ÿœNNNNNNNNNNNNNNNN¡¡¡þaNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûXIT - A= CHAR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CI: LD A,MF_CI JP XMROM ÿdþ'NNNNNNNNNNNNNNNNN¡¡¡þ 7nNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûXIT - A= CTRL-Z ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; READER: LD A,CTRLZ ;FAKE 8ÒþrNNNNNNNNNNNNNNNNN¡¡¡þÛÖNNNNNNNNNNNNNNNNNNNNNN¡¡¡û: BUSY, FFH:READY ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; LISTST: LD A,MF_LOS Ø,ÿþNNNNNNNNNNNNNNNNN¡¡¡þqpNNNNNNNNNNNNNNNNNNNNNNð¡¡¡û############################################## ; ; COMMON I/O PARAMETER BLOCK ; ;###########################################jYÿòNNNNNNNNNNNNNNNN¡¡¡þž»NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCRIPTOR OR FROM DEFAULT TABLES ; DDT_HDS DS 1 ;HEADS DDT_SOF DS 2 ;SECTOR OFFSET ; ; DEFINE THE STRUCTURE SIZE ; DDT_SI¸ÒÿÂNNNNNNNNNNNNNNNN¡¡¡þ#¸!NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûR OFFSET ; ENDM IF BOOT = 10H ; A DDT_0: ALLDRV HDEXEC,4,10H,D0DPB,D0DPH,4,0 ; B DDT_1: ALLDRV HDEXEC,4,12H,D1Dr ÿäNNNNNNNNNNNNNNNNN¡¡¡þ)WêNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DDT_2: ALLDRV HDEXEC,4,10H,D2DPB,D2DPH,4,0 ; D DDT_3: ALLDRV HDEXEC,4,12H,D3DPB,D3DPH,4,8000H ; E DDT_4: ALLDRV HDEXECÿäNNNNNNNNNNNNNNNNN¡¡¡þ/ýLNNNNNNNNNNNNNNNNNNNNNN¡¡¡û############################################################### ; SD8PBK: DW 26 ;SECTORS PER TRACK DB 3 ;BLOCK SHIFT FACTOå¿ÿ„NNNNNNNNNNNNNNNN¡¡¡þA2NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN CONSOLE STATUS ; EXIT - A= 0: Næ¤þ9NNNNNNNNNNNNNNNN¡¡¡þ ®ùNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEOF ; ; FALL INTO PUNCH RETURN ; ;**************************************************************************** ; ; PÐýþ9NNNNNNNNNNNNNNNN¡¡¡þŽ…NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûJP XMROM ;**************************************************************************** ; ; MESSAGE EDITOR ; ENTRY- HL= T]DÿíNNNNNNNNNNNNNNNNN¡¡¡þaNNNNNNNNNNNNNNNNNNNNNNN¡¡¡û################################# ; IOPB: REPT PB_SIZE LIST OFF DB 0 LIST ON ENDM ;##############################Gÿ9NNNNNNNNNNNNNNNN¡¡¡þËèNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûZ DS 0 ENDM ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; MACRO TO DEFINE THE DRIVE~Pÿ'NNNNNNNNNNNNNNNNN¡¡¡þ$!¶NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPB,D1DPH,4,8000H ; C DDT_2: ALLDRV HDEXEC,5,10H,D2DPB,D2DPH,4,0 ; D DDT_3: ALLDRV HDEXEC,5,12H,D3DPB,D3DPH,4,8000H ; ªÿœNNNNNNNNNNNNNNNN¡¡¡þ*¹NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û,5,10H,D4DPB,D4DPH,4,0 ; F DDT_5: ALLDRV HDEXEC,5,12H,D5DPB,D5DPH,4,8000H ENDIF ;##################################.iÿÈNNNNNNNNNNNNNNNNN¡¡¡þ0îNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR DB 7 ;BLOCK MASK DB 0 ;NULL MASK DW 242 ;DISK SIZE -1 DW 63 ;DIRECTORY MAX DB 11000000B ;ALLOC 0 DB 0 ;ALLOC ü¤ÿ“NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÎNNNNNNNN�Ï��‚jƒ8„…Ô…¡†n‡<ˆ ‰Ö‰£Šq‹?Œ �Û�¨Žv�D�‘à‘®’{“I”•啲–�—N˜™é™¸š‡›Vœ#�ñ�¿ž�Ÿ[ (¡õ¡Â¢�£^¤,¥ù¥Ç¦ÎNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ¾¸NNNNNNNNNNNNNNNNNNNNNN¡¡¡û1 DW 16 ;CHECK SIZE DW 2 ;TRACK OFFSET DB 0 ;PHYSICAL RECORD SHIFT FACTOR DB 0 ;PHYSICAL RECORD MASK DW 0 ;LOGICAÏÿÈNNNNNNNNNNNNNNNNN¡¡¡þNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûACK OFFSET (OFF) DB 1 ;PHYSICAL RECORD SHIFT FACTOR (PSH) DB 1 ;PHYSICAL RECORD MASK (PRM) DW 0 ;LOGICAL DRIVE SECTO@pÿÉNNNNNNNNNNNNNNNN¡¡¡þ ûÕNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;;" DW 0 ;;" DW DIRBF ;;DIRECTORY BUFFER PTR DW D#D(DD)DPB ;;DRIVE PARAMETER BLK PTR IF (DSK_#D(DD) AND 0F0H) = 10›ÿNNNNNNNNNNNNNNNN¡¡¡þÛ©NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûB -1 ;/0: WRITE PROTECTION ENABLED ; ; LAST OF INITIALIZED CODE READ FROM DISK ; BIOSND EQU $ SUBTTL UNINITIALIZED D¼nÿrNNNNNNNNNNNNNNNN¡¡¡þ4bNNNNNNNNNNNNNNNNNNNNNN¡¡¡û BLOCKING BUFFER MAINTENANCE ; BUF_PSEC DS 2 ;BUFFER PHYSICAL SECTOR BUF_ACT DS 1 ;0: BUFFER FLUSHED, /0: DATA IN BUFFER BÿÈNNNNNNNNNNNNNNNNN¡¡¡þžÄNNNNNNNNNNNNNNNNNNNNNN¡¡¡û##################################################### ; ; VARIABLES ; ;###################################################ÅOÿÉNNNNNNNNNNNNNNNN¡¡¡þ%tšNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûODE) LSTINC EQU FALSE ;LIST INCLUDE FILES USEMON EQU TRUE ;USE MONITOR ROM I/O ROUTINES IF TRUE INTRPTS EQU TRUE ;ENABLE IÝÈÿNNNNNNNNNNNNNNNN¡¡¡þ+W•NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; D SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ; E JADE 8" FLOPPY PHYSICAL DRIVEÚrÿÂNNNNNNNNNNNNNNNN¡¡¡þëëNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL DRIVE SECTOR OFFSET DB 0 ;SKEW = 0 ; ; DEFAULT DISK PHYSICAL PARAMETERS ; DB 1 ;HEADS ;#######################×3ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR OFFSET (SOF) DB 0 ;SKEW = 0 ; ; ; DB 4 ;HEADS ;#################################################################Š)ÿINNNNNNNNNNNNNNNN¡¡¡þ®†NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûH DW 0 ;;NO CHECKS ON HARD DISK ELSE DW D#D(DD)CHK ;;DRIVE DISK CHECKSUMS ARRAY PTR ENDIF DW D#D(DD)ALL ;;DRIVE C‚ØÿrNNNNNNNNNNNNNNNN¡¡¡þB>NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûATA AREA ;############################################################################ ; ; THE FOLLOWING DATA MUST RESIDE IPÌÿrNNNNNNNNNNNNNNNN¡¡¡þa1NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUF_MOD DS 1 ;0: BUFFER CLEAN, /0: BUFFER DIRTY (MODIFIED) ; BUF_DDT DS 2 ;BUFFER DDT PTR BUF_DPB DS 2 ;BUFFER DPB PTR ; RSF�&ÿòNNNNNNNNNNNNNNNNN¡¡¡þ ‹oNNNNNNNNNNNNNNNNNNNNNN¡¡¡û######################### ; CUR_DPB DS 2 ;DRIVE TABLE PTR CUR_DDT DS 2 ;DRIVE DRIVER TABLE BASE ADDRESS PTR CUR_DPH DS 2 ;DPºÐÿ�NNNNNNNNNNNNNNNNN¡¡¡þ&!ÉNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNTERRUPT PROCESSING WHISTLE INTCPTS EQU TRUE ;ENABLE SYSTEM CALL INTERCEPT WHISTLE BOOT EQU 10H ;10H: HARD DISK, 3: 8" FLOPP/ÿrNNNNNNNNNNNNNNNN¡¡¡þ,ÎNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û 0 ; F JADE 8" FLOPPY PHYSICAL DRIVE 1 ENDIF IF BOOT = 3 ; A JADE 8" FLOPPY PHYSICAL DRIVE 0 ; B JADE 8" FLOPPY¨ÿäNNNNNNNNNNNNNNNN¡¡¡þØÚNNNNNNNNNNNNNNNNNNNNNN¡¡¡û##################################################### ; ; DEFAULT 8" HARD DISK PARAMETER BLOCK ; ;##########################VÿáNNNNNNNNNNNNNNNN¡¡¡þ 7NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û########### ; ; DRIVE PARAMETER HEADER AREA ; 1 PER DRIVE ; ;##############################################################(ÿçNNNNNNNNNNNNNNNNN¡¡¡þ�·NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLUSTER ALLOCATION BIT MAP PTR LIST OFF ENDM ; ; DEFINE THE DATA ; DD DL 1 REPT NDRVS LIST OFF ALLDPH 0123456789A/ÞÿrNNNNNNNNNNNNNNNN¡¡¡þqNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûN THIS ORDER TO MATCH THE IOPB DATA ; ;############################################################################ ; ; CPaCÿáNNNNNNNNNNNNNNNN¡¡¡þRNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLAG: DS 1 ;0: NO PREREAD REQ'D, /0: PREREAD REQ'D READOP: DS 1 ;0: WRITE OPERATION, 1: READ OPERATION WRTYPE: DS 1 ;WRITE OPERëeþBNNNNNNNNNNNNNNNN¡¡¡þ!¸^NNNNNNNNNNNNNNNNNNNNNN¡¡¡û TITLE CUSTOMIZED BIOS FOR M5B LIST NOCOND ;============================================================================ ; þ^ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ'øNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûY, 20H: 5" FLOPPY DEBUG EQU FALSE ;TRUE TO DUMP THE IOPB DATA TO PRINTER FORM ;******************************************ÿÉNNNNNNNNNNNNNNNN¡¡¡þ-ý3NNNNNNNNNNNNNNNNNNNNNN¡¡¡û PHYSICAL DRIVE 1 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; D SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 0 ; E SIDE 0 ŠóÿÎNNNNNNNNNNNNNNNNN¡¡¡þAMNNNNNNNNNNNNNNNNNNNNNN¡¡¡û################################################## ; HDPBK: DW 128 ;SECTORS PER TRACK (LOGICAL) (SPT) DB 5 ;BLOCK SHIFT FAÆÿÎNNNNNNNNNNNNNNNNN¡¡¡þ bBNNNNNNNNNNNNNNNNNNNNNN¡¡¡û############## ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE A DISK PARAMETER Xÿ„NNNNNNNNNNNNNNNNN¡¡¡þŽúNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûBCDEF DD DL DD + 1 LIST ON ENDM ;############################################################################ ; ; LO÷ÿ„NNNNNNNNNNNNNNNN¡¡¡þ$\NNNNNNNNNNNNNNNNNNNNNN¡¡¡û/M IOPB OVERLAY ; CPM_DSK DS 1 ;LOGICAL DRIVE CPM_TRK DS 2 ;LOGICAL TRACK NUMBER CPM_SEC DS 2 ;LOGICAL SECTOR NUMBER DS 1 Ù»ÿÈNNNNNNNNNNNNNNNNN¡¡¡þË—NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûATION TYPE FROM BDOS: ; 0: WRITE TO ALLOCATED (USED) BLOCK (PREREAD) ; 1: WRITE TO DIRECTORY (PREREAD & WRITE) ; 2: ¢ÇÿòNNNNNNNNNNNNNNNN¡¡¡þ"í NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û; ASSEMBLY PARAMETERS ; ;============================================================================ FALSE EQU 0 TRUE EQU N¯7ÿNNNNNNNNNNNNNNNNN¡¡¡þ(ÆNNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************************** ; ; CUSTOMIZED BIOS FOR M5B ; (c) 1981 GRH Electronics, CUPERTINO, CA ; ;********** ŸÿBNNNNNNNNNNNNNNNN¡¡¡þ.¨`NNNNNNNNNNNNNNNNNNNNNN¡¡¡û& 1 OF HARD DISK PHYSICAL DRIVE 1 ; F SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ENDIF IF BOOT = 20H ; A JADE 5" FLOØxÿÈNNNNNNNNNNNNNNNNN¡¡¡þr|NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCTOR (BSH) DB 31 ;BLOCK MASK (BLM) DB 1 ;NULL MASK (EXM) DW 1015 ;DISK SIZE (CLUSTERS -1) (DSM) DW 1152 / 2 ;DIRŒÇÿ'NNNNNNNNNNNNNNNNN¡¡¡þ QsNNNNNNNNNNNNNNNNNNNNNN¡¡¡û TABLE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ALLDPH: MACRO #D LIST ON D$«ÿòNNNNNNNNNNNNNNNNN¡¡¡þ½ËNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûGON IOPB OVERLAY ; ;############################################################################ ; LOGIOPB: DB PB_LOGC ;CO!]ÿñNNNNNNNNNNNNNNNN¡¡¡þmNNNNNNNNNNNNNNNNNNNNNN¡¡¡û;FLAGS CPM_DMA DS 2 ;XFER ADDR CPM_DMAB DS 1 ;XFER BANK ; ; ; BUFFER IOPB OVERLAY ; BUF_DSK DS 1 ;BUFFER DISK NUMBER BÌÿòNNNNNNNNNNNNNNNN¡¡¡þø¦NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûWRITE TO UNALLOCATED (UNUSED) BLOCK (NO ; PREREAD REQ'D) ; ; UNA_CNT: DS 1 ;# SECTORS REMAINING IN BLOCK (CLUSTER) UNA_Dþ±ÿùNNNNNNNNNNNNNNNN¡¡¡þ#Þ (DIRBF + SECSZ) CONMSG **** ‚ÿÂNNNNNNNNNNNNNNNN¡¡¡þ+!!NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûERRUPTS ; IN A,(M2_STAT) OR A,M2_IEN OUT (M2_STAT),A EI ENDIF ; ; LOG ON DRIVE TO INIT TABLES ; LD A,(DK_BDRV©TÿÂNNNNNNNNNNNNNNNN¡¡¡þ�_NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; MR_RNUM EQU 0 ;INTERIM DEFINITION FOR INTERRUPT ROM SWAP ; SECSZ: EQU 128 NDRVS: EQU 6 IF BOOT = 10H ; ; 8" HARD7"ÿ“NNNNNNNNNNNNNNNNN¡¡¡þr”NNNNNNNNNNNNNNNNNNNNNN¡¡¡û==== ; LF: EQU 0AH CR: EQU 0DH CTRLZ: EQU 1AH ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@²�ÿ$NNNNNNNNNNNNNNNN¡¡¡þØ2NNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡ûEXT IN RAM MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; PVERS MACRO #VERS DD DL ÿòNNNNNNNNNNNNNNNN¡¡¡þ4ŠNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEADER JP HOME ;HOME SELECTED DRIVE JP SELDSK ;SELECT DISK DRIVE JP SETTRK ;SET TRACK # JP SETSEC ;SET SECTOR # JP ®ÆÿäNNNNNNNNNNNNNNNN¡¡¡þ…NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûRE BIOSSZ: DW BIOSND - BIOS ;BIOS MODULE SIZE IN BYTES BIOSST: DW BIOS ;BIOS MODULE LOAD ADDR FOR SBD ; ; CONTINUE ON WITÿéÿNNNNNNNNNNNNNNNNN¡¡¡þ ýÛNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ; SET TEMPORARY STACK ; LD SP,DEFBFR ;USE PAGE 0 FOR STACK ; ; INIT DEFAULT DRIVE ; LD A,(DK_BDRV) ;USE DRIVE # P‚¶ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ&W}NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûWARNING! COLD INIT CODE BIGGER THAN DIR BUFFER **** ELSE DS DIRBF+SECSZ-$ ;FILL OUT DIRECTORY BUFFER TO 1 SECTOR SIZE ¬+ÿÂNNNNNNNNNNNNNNNN¡¡¡þ,¸¶NNNNNNNNNNNNNNNNNNNNNN¡¡¡û) AND A,3 ;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 DIœWÿùNNNNNNNNNNNNNNNN¡¡¡þ®nNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û DISK BOOT DATA ; STHD EQU 0 ;START LOGICAL DRIVE OF HARD DISK NDHD EQU 3 ;LAST LOGICAL DRIVE OF HARD DISK ST8FD EQU 4 ;S˜ÕÿœNNNNNNNNNNNNNNNN¡¡¡þ A¥NNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@ ; ; GENERATE THE TRANSLATION TABLE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@Þ¯ÿHNNNNNNNNNNNNNNNNN¡¡¡þëNNNNNNNNNNNNNNNNNNNNNN¡¡¡û#VERS IF DD > 9999 DB (DD / 10000) + '0' DD DL DD % 10000 ENDIF IF DD > 999 DB (DD / 1000) + '0' DD DL DD % 10”ÿ9NNNNNNNNNNNNNNNN¡¡¡þ»NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSETDMA ;SET TRANSFER ADDR JP DISKRD ;PERFORM DISK READ JP DISKWR ;PERFORM DISK WRITE JP LISTST ;RETURN LIST STATUS J5ÓÿNNNNNNNNNNNNNNNN¡¡¡þ$´NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûH INIT ; INIT1: JR INIT ;############################################################################ ; ; DIRECTORY SECÅõÿœNNNNNNNNNNNNNNNN¡¡¡þ!ÎêNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûASSED IN PAGE 0 AND A,3 LD (DEFDRV),A ; ; SEND SYSTEM SIGN-ON ; CLOGO: LD HL,MSGSO CALL EDITOR ; ; MODIFY COLD S®�ÿNNNNNNNNNNNNNNNNNN¡¡¡þ'dLNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ENDIF ;---------------------------------------------------------- ; ; WARM REBOOT ENTRY LOADS CCP,BDOS FROM DISK & ; SE4¼þHNNNNNNNNNNNNNNNN¡¡¡þ-‹‡NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRECTORY ; LD BC,DEFBFR ;SET XFER ADDRESS (USE DEFAULT BUFFER) CALL SETDMA ; LD BC,BD_SEC ;SET DIRECTORY SECTOR CALL TŒÿùNNNNNNNNNNNNNNNN¡¡¡þ7ùNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTART LOGICAL DRIVE OF 8" FLOPPY ND8FD EQU 5 ;LAST LOGICAL DRIVE OF 8" FLOPPY ENDIF IF BOOT = 3 ; ; 8" FLOPPY BOOT ËÿNNNNNNNNNNNNNNNN¡¡¡þ öNNNNNNNNNNNNNNNNNNNNNN¡¡¡û@ ; GXLATE MACRO #SECTORS, #SKEW LIST OFF NXTSEC DL 1 ;;START WITH SECTOR 1 LOWEST DL 1 ;; REPT #SECTORS LIST ON D‹ÿòNNNNNNNNNNNNNNNNN¡¡¡þøNNNNNNNNNNNNNNNNNNNNNNN¡¡¡û00 ENDIF DB (DD / 100) + '0' DB '.' DB ((DD % 100) / 10) + '0' DB (DD % 10) + '0' ENDM SUBTTL BIOS CODE ORæƒÿrNNNNNNNNNNNNNNNN¡¡¡þRèNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûP SECTRN ;TRANSLATE SECTOR JP BIOFUNC ;EXECUTE FUNCTION CALL ;#########################################################$‚ÿHNNNNNNNNNNNNNNNNN¡¡¡þ½#NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTOR BUFFER STARTS HERE AFTER CRUNCHING COLD START ; CODE. THIS BUFFER IS USED BY THE CP/M DIRECTORY CHECK ROUTINES THAT ; CHÔÑÿùNNNNNNNNNNNNNNNN¡¡¡þ"›¹NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûTART VECTOR TO WARM START ; LD HL,(BIOS+4) LD (BIOS+1),HL ; ; BOOT CCP & BDOS ; JR WARM ;######################.ÿòNNNNNNNNNNNNNNNNN¡¡¡þ(trNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûTS UP VARIABLES ; ;---------------------------------------------------------- ; WARM: ; ; SET TEMPORARY STACK ; LD SPUcþBNNNNNNNNNNNNNNNN¡¡¡þ.ÞÔNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSETSEC ; LD BC,0 ;SET TRACK TO 0 CALL SETTRK ; CALL DISKRD JR NZ,WEROR ; ; CHECK FOR VALID BOOT DIRECTORY ; LDà-ÿ'NNNNNNNNNNNNNNNNN¡¡¡þÈNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDATA ; STHD EQU 2 ;START LOGICAL DRIVE OF HARD DISK NDHD EQU 5 ;LAST LOGICAL DRIVE OF HARD DISK ST8FD EQU 0 ;START LOGICA¢ØÿÈNNNNNNNNNNNNNNNNN¡¡¡þ 'ÇNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûB NXTSEC LIST OFF NXTSEC DL NXTSEC + #SKEW ;ADD SKEW FACTOR ;; IF NXTSEC > #SECTORS ;CHECK FOR OVERFLOW NXTSEC DL NXTSEåÿrNNNNNNNNNNNNNNNNN¡¡¡þËNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûG BIOS ;---------------------------------------------------------------------------- ; ; BIOS JUMP VECTOR TABLE ; ;------{ ÿþNNNNNNNNNNNNNNNNN¡¡¡þaÙNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û################### ; ; THE FOLLOWING BOOT DATA MUST RESIDE AS DEFINED RIGHT BEFORE THE COLD ; INIT ROUTINE START AND MUST BE :ÿNNNNNNNNNNNNNNNN¡¡¡þŽNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûECK FOR DISK CHANGE. ; ;############################################################################ ; DIRBF: EQU $ ;BUFFERÁTÿrNNNNNNNNNNNNNNNN¡¡¡þ#¨ˆNNNNNNNNNNNNNNNNNNNNNN¡¡¡û###################################################### ; ; SIGN-ON MESSAGE ; ;##############################################Ý[ÿíNNNNNNNNNNNNNNNNN¡¡¡þ)GCNNNNNNNNNNNNNNNNNNNNNN¡¡¡û,DEFBFR IF INTRPTS ; ; SET INTERRUPT VECTOR TABLE BASE ; LD A,HIGH INTABL LD I,A ; ; SET INTERRUPT MODE TO 2 ; „vÿ NNNNNNNNNNNNNNNNN¡¡¡þ/íåNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û A,(DEFBFR) CP A,86H JR C,WEROR ; ; SET UP TO LOAD CCP/BDOS ; LD HL,(DEFBFR + BD_SBDSS) ;PREFETCH BDOS TRK/SECTOR PdjÿÂNNNNNNNNNNNNNNNN¡¡¡þQ›NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL DRIVE OF 8" FLOPPY ND8FD EQU 1 ;LAST LOGICAL DRIVE OF 8" FLOPPY ENDIF ;============================================Q!ÿÂNNNNNNNNNNNNNNNN¡¡¡þ ¾PNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûC - #SECTORS ;; IF NXTSEC <= LOWEST ;CHECK FOR REPEAT NXTSEC DL LOWEST + 1 LOWEST DL NXTSEC ENDIF ENDIF ;; ENDßœÿ„NNNNNNNNNNNNNNNN¡¡¡þž,NNNNNNNNNNNNNNNNNNNNNN¡¡¡û---------------------------------------------------------------------- ; JP INIT1 ;COLD START ENTRY JP WARM ;RELOAD CCP/Bq^ÿäNNNNNNNNNNNNNNNNN¡¡¡þqçNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û IN THE 1ST SECTOR. THESE 2 WORDS ARE ; REFERENCED BY THE BOOT LOADER CODE IN ORDER TO DETERMINE THE LOAD ADDRESS ; AND LENGTHÓ°ÿ9NNNNNNNNNNNNNNNN¡¡¡þÛANNNNNNNNNNNNNNNNNNNNNN¡¡¡û BEGINNING ;---------------------------------------------------------------------------- ; ; INIT - COLD START ENTRY çVÿÈNNNNNNNNNNNNNNNNN¡¡¡þ$1NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û############################## ; MSGSO: DB CR,LF DB CPMSZ / (KBYTE * 10) + '0' DB (CPMSZ MOD (KBYTE * 10)) / KBYTE + '0' Ç÷ÿœNNNNNNNNNNNNNNNN¡¡¡þ*NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û IM 2 ; ; ENABLE INTERRUPT VECTOR 7 ; IN A,(M2_IMASK) AND A,7FH OUT (M2_IMASK),A ; ; FINALLY ENABLE VECTORED INT,úÿ'NNNNNNNNNNNNNNNNN¡¡¡þ0þ¨NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUSH HL ; LD HL,(DEFBFR + BD_SCCPS) ;FETCH CCP TRK/SECTOR LD C,L LD B,0 CALL SETSEC ; LD C,H CALL SETTRK ; LD BCIˆþNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�NNNNNNþ€Ì�™‚gƒ4„…Ð…�†j‡8ˆ‰Ó‰ Šn‹<Œ �Ø�§Žu�C�‘ß‘¬’z“G”•ã•°–—L˜™é™·š…›Sœ �í�ºž‰ŸW $¡ñ¡¿¢�£[¤)¥÷¥Å¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þÿ 0 CP A,STHD JR C,LGCKFD ENDIF CP A,NDHD + 1 ÐÿÿÈNNNNNNNNNNNNNNNNN¡¡¡þ0ɘNNNNNNNNNNNNNNNNNNNNNN¡¡¡û********* ; ; SET TRACK # ; ENTRY- BC= TRACK # ; ;*************************************************************************-@þHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN^NNNNNNNN�Ï�œ‚iƒ7„…Ó… †m‡<ˆ ‰×‰¤Šr‹?Œ �Û�©Žw�E�‘ᑯ’}“J”•啲–€—M˜™è™¶š„›Sœ �î�¼ž‹ŸY &¡ó¡Á¢�£\¤*¥÷¥Å¦nNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þSÐNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*** ; SETTRK: LD (BTTRK),BC RET ;**************************************************************************** ; ; Sd§ÿ“NNNNNNNNNNNNNNNNN¡¡¡þùvNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; BC= SECTOR # TO XLATE ; EXIT - HL= XLATED SECTOR OR BC + 1 ; BC= UNCHANGED ; A, DE= ? ; ;+++++++++++++++++++++++++++++cÿäNNNNNNNNNNNNNNNN¡¡¡þ ½NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++ ; DISKLOG: ; ; SET DESCRIPTOR SECTOR XFER ADDRESS TO DEFAULT BUFFER ; LD HL,DEFBFR LD (IOPB + PB_DMAO·ÍÿNNNNNNNNNNNNNNNN¡¡¡þ6ÁNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++ ; DISKOP: ; ; SET UP IOPB ; LD HL,BTTRK LD DE,IOPB + PB_TRKO LD BC,PB_BCNTO - PB_TRKO LÿNNNNNNNNNNNNNNNN¡¡¡þÙ NNNNNNNNNNNNNNNNNNNNNN¡¡¡û GET USER RESPONSE ; CALL CI ;GET USER RESPONSE ; PUSH AF ;SAVE CHAR LD C,A ;ECHO CHAR CALL COC POP AF ; AND ¶ÿÉNNNNNNNNNNNNNNNNN¡¡¡þs¬NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;**************************************************************************** ; TR8: TR3740: LD DE,SDTRAN ; SETTR: LD HL,ž]ÿäNNNNNNNNNNNNNNNN¡¡¡þ%™òNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD E,(HL) ;FETCH DPB PTR INC HL LD D,(HL) RET SUBTTL HARD DISK ROUTINES ;+++++++++++++++++++++++++++++++++++++++¯·ÿÂNNNNNNNNNNNNNNNN¡¡¡þ+ºýNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûLL XPRIM ; ; RESTORE SECTOR ; POP HL LD (IOPB + PB_SECO),HL ; ; DONE ; RET ;+++++++++++++++++++++++++++++†ÔÿùNNNNNNNNNNNNNNNN¡¡¡þƒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûET SECTOR ; ENTRY- BC= SECTOR # ; ;**************************************************************************** ; SETSEC: C‡ÿ“NNNNNNNNNNNNNNNNN¡¡¡þéHNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++ ; SECTRN: ; ; IF NO TRANSLATION THEN RETURN SECTOR++ ; LD A,D ;IF TABLEÚ_ÿÈNNNNNNNNNNNNNNNN¡¡¡þCîNNNNNNNNNNNNNNNNNNNNNN¡¡¡û),HL CALL GETBNK LD (IOPB + PB_DMAXO),A ; ; SET DESCRIPTOR SECTOR SECTOR ; LD HL,ID_SECT LD (IOPB + PB_SECO),HL ; ?OÿòNNNNNNNNNNNNNNNN¡¡¡þ¯VNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDIR ; DISKOP2: LD (IOPB + PB_CMDO),A ; ; FETCH DRIVER VECTOR & EXECUTE DISK DRIVER ; DKOPLP: PUSH IY ;SAVE IY LD ×LÿòNNNNNNNNNNNNNNNN¡¡¡þŒYNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûA,5FH ;INSURE UPPER CASE ; ; IF RETRY THEN RETURN TO CALLER ; CP A,'R' ;IF RETRY THEN RETURN TO CALLER JR Z,DKOPLP ;ZäþrNNNNNNNNNNNNNNNNN¡¡¡þ fNNNNNNNNNNNNNNNNNNNNNN¡¡¡û(DTPTR) LD (HL),E INC HL LD (HL),D RET ;***************************************************************************.šÿ!NNNNNNNNNNNNNNNN¡¡¡þ&Ì¡NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++ ; ; HARD DISK DRIVER FUNCTION ; ENTRY- IY= DRIVER TABLE PTR ; EXIT - A= 0: OK; /0: ERRHyÿáNNNNNNNNNNNNNNNN¡¡¡þ,#jNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE IOPB PRIMITIVE ; EXIT - A= 0: OK, /0: ERROR ; ;++++++++++++7¡ÿrNNNNNNNNNNNNNNNN¡¡¡þ5²NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD (BTSEC),BC RET ;**************************************************************************** ; ; SET TRANSFER ADDR Q˜ÿaNNNNNNNNNNNNNNNN¡¡¡þ ÚyNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ADDR = 0 THEN NO TRANSLATION OR A,E JP Z,NOTRAN ; ; ELSE CALCULATE NEW SECTOR FROM TABLE ; EX DE,HL ADD HL,BC LD’ÓÿHNNNNNNNNNNNNNNNNN¡¡¡þpßNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; SET DESCRIPTOR SECTOR TRACK ; LD L,H ;H == 0 FROM LAST OPERATION (HL= 0) LD (IOPB + PB_TRKO),HL ; ; ENABLE UPLOADSïÿùNNNNNNNNNNNNNNNN¡¡¡þœgNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIY,(DVRTPTR) ;FETCH TABLE BASE ; LD HL,DKOPRET ;PUT RETURN ADDRESS ON STACK PUSH HL ; LD HL,(DVRXADR) ;FETCH DRIVER ADDRPnÿÂNNNNNNNNNNNNNNNN¡¡¡þ¿hNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ELSE IF ABORT THEN DO WARM BOOT ; CP A,'A' ;IF ABORT THEN RE-BOOT JP Z,0 ; ; ELSE IF IGNORE THEN RETURN NO ERROR¶áÿÂNNNNNNNNNNNNNNNN¡¡¡þ!U6NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û* ; ; SET NO SECTOR TRANSLATION PROCEDURE ; EXIT - HL, DE= ? ; ;***********************************************************ƒœÿÎNNNNNNNNNNNNNNNNN¡¡¡þ'ÿ�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; HDEXEC: ; ; CONVERT LOGICAL DRIVE TcæÿÈNNNNNNNNNNNNNNNN¡¡¡þ-[NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; XPRIM: ; ; SET BANK ADDRESS TO THIS BANK FOR NOW ; C¤$ÿÂNNNNNNNNNNNNNNNN¡¡¡þ¬%NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ENTRY- BC= ADDRESS ; EXIT - A= ? ; ;**************************************************************************** ; SETDM]ŽÿáNNNNNNNNNNNNNNNN¡¡¡þ �*NNNNNNNNNNNNNNNNNNNNNN¡¡¡û L,(HL) ; LD H,0 RET ; ; ; CONVERT FROM CP/M'S LOGICAL SECTOR {0..N-1} TO PHYSICAL SECTOR {1..N} ; NOTRAN: LD HL, ŒþrNNNNNNNNNNNNNNNNN¡¡¡þc’NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; LD A,L ;L= 0 LD (IOPB + PB_FLGO),A ; ; DISABLE DOWNLOAD ; LD (IOPB + PB_BCNTO),HL ; ; PASS COMMAND TO EXECUTbŸÿùNNNNNNNNNNNNNNNN¡¡¡þÉ4NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûESS PREFETCHED FROM TABLE JP (HL) ; ; DRIVER RETURNS HERE ; DKOPRET: POP IY ; ; IF NO ERRORS THEN RETURN ZF ; R›ãÿ“NNNNNNNNNNNNNNNNN¡¡¡þ&ÿNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; SUB A,'I' ;IF IGNORE THEN RETURN NO ERROR RET Z ; ; ELSE RETURN ERROR TO BDOS ; FDSKER: LD HL,0 ;RETURN DPB_PTR 4»ÿBNNNNNNNNNNNNNNNN¡¡¡þ"eNNNNNNNNNNNNNNNNNNNNNN¡¡¡û***************** ; TRNONE: LD DE,0 JR SETTR ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++^>ÿäNNNNNNNNNNNNNNNNN¡¡¡þ(ï®NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûO PHYSICAL DRIVE ; LD A,(IY + DVRPDRV) ;0,1: DRV 0, 2,3: DRV 1 LD (IOPB + PB_DRVO),A ; ; OFFSET LOGICAL ADDRESS WITH LO…¹ÿÂNNNNNNNNNNNNNNNN¡¡¡þ.ENNNNNNNNNNNNNNNNNNNNN!ô¡¡¡ûALL GETBNK LD E,A ;PRESET IOPB BANK LD (IOPB + PB_DMAXO),A ; ; EXECUTE THE PRIMITIVE IN ROM ; LD HL,IOPB ;BANKED COÜŠÿNNNNNNNNNNNNNNNNNN¡¡¡þŸNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûA: LD (BTDMA),BC CALL GETBNK ;FETCH BANK ADDRESS FROM MONITOR LD (BTDMAX),A RET ;+++++++++++++++++++++++++++++++++++¸£ÿNNNNNNNNNNNNNNNNN¡¡¡þ ¼NNNNNNNNNNNNNNNNNNNNNN¡¡¡û1 ADD HL,BC RET SUBTTL DISK SUPPORT ROUTINES ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++•²ÿäNNNNNNNNNNNNNNNNN¡¡¡þP£NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOR ; LD A,PB_LOGC JR DISKOP2 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; COMMOŠBÿüNNNNNNNNNNNNNNNN¡¡¡þúNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûET Z ;IF NO_ERROR THEN RETURN ; ; PRINT ERROR ; CALL GETBNK ;SETUP BANK FOR FUTURE COMPATABILITY LD E,A LD HL,IOPB sÿäNNNNNNNNNNNNNNNN¡¡¡þÎNNNNNNNNNNNNNNNNNNNNNN¡¡¡û= 0 FOR SELECT FUNCTION LD A,-1 ;RETURN -1 TO BDOS OR A,A RET ;*****************************************************R¬ÿ„NNNNNNNNNNNNNNNN¡¡¡þ#3TNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++ ; ; RETURN DRIVE PARAMETER BLOCK ADDR FUNCTION ; EXIT - DE= DPB PTR ; HL= ? ; ;++++++++++++++++++++++++++++++++++++++*ÿíNNNNNNNNNNNNNNNNN¡¡¡þ)ÜŸNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûGICAL DRIVE ; LD A,(BTDRV) ;IF EVEN THEN ADD 0 ELSE ADD 128 RRCA AND A,80H LD E,A ;COMPUTE SECTOR LD D,0 LD HL,(I;ÿ¤NNNNNNNNNNNNNNNNN¡¡¡þ/v9NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûMPATABILITY LD DE,(THIS_BNK) LD A,MF_XIOB ;SET MONITOR FUNCTION # CALL XMROM ;EXECUTE THE FUNCTION ; OR A,A ;FUNCTION2.ÿùNNNNNNNNNNNNNNNN¡¡¡þÊGNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++ ; ; SECTOR TRANSLATION FUNCTION ; ENTRY- DE= 0: NO XLATE, ELSE PTR TO XLATE TABLE /ñÿÂNNNNNNNNNNNNNNNN¡¡¡þ %ŒNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++ ; ; LOGON DISK FUNCTION ; EXIT - A= 0: OK; /0: ERROR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++½ÿùNNNNNNNNNNNNNNNN¡¡¡þðNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûN DISK I/O CODE ; ENTRY- A= IOPB COMMAND ; EXIT - A= 0: OK; /0: ERROR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++¼QÿäNNNNNNNNNNNNNNNNN¡¡¡þê;NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD A,MF_DIOB ;USE DISPLAY IOPB DATA FUNCTION CALL XMROM ; ; QUERY USER FOR OPTION ; LD HL,DSKEB CALL EDITOR ; ; uCÿyNNNNNNNNNNNNNNNN¡¡¡þ@�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û*********************** ; ; SET 3740 SECTOR TRANSLATION PROCEDURE ; ENTRY- (DTPTR)= MUST BE PTR TO DTP ; EXIT - DE, HL= ? ;—�ÿ'NNNNNNNNNNNNNNNNN¡¡¡þ$ªÃNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++ ; DPBAD: LD HL,(DTPTR) ;FETCH BASE ADDR LD DE,10 ;ADD OFFSET OF DPB PTR ADD HL,DE gZÿÂNNNNNNNNNNNNNNNN¡¡¡þ*‰ÌNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOPB + PB_SECO) ; PUSH HL ;SAVE SECTOR TO RESTORE LATER ; ADD HL,DE LD (IOPB + PB_SECO),HL ; ; EXECUTE IOPB ; CAÈñÿNNNNNNNNNNNNNNNNN¡¡¡þ0etNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ERR? RET NZ ; ; RETURN THE COMMAND RESULTS STATUS ; LD A,(IOPB + PB_STATO) OR A,A RET SUBTTL JADE FLOPPY DRIyðÿçNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNnNNNNþ€Ì�š‚hƒ5„…Ñ…ž†k‡9ˆ‰Ô‰¡Šo‹=Œ �Ø�¦Žt�B�‘ß‘¬’z“G”•ã•°–~—K˜™ç™µšƒ›Qœ�ë�¸ž‡ŸU "¡ï¡½¢‹£X¤'¥ô¥Â¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þdàNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûVER ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; JADE 8" FLOPPY DISK DRIVER FUNARþHNNNNNNNNNNNNNNNNN¡¡¡þÎFNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTO SECTOR BIT 15 LD (IOPB + PB_SECO +1),A ; LD (IOPB + PB_TRKO),HL ;STORE SHIFTED TRACK ; ; EXECUTE THE IOPB ; CALL rþÿòNNNNNNNNNNNNNNNN¡¡¡þ !�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûADD A,A ADD A,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,¶lÿÎNNNNNNNNNNNNNNNNN¡¡¡þñNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; RETVERS: LD HL,VERSN XOR A,A ;RETURN Nø ÿÂNNNNNNNNNNNNNNNN¡¡¡þî:NNNNNNNNNNNNNNNNNNNNNN¡¡¡û DE,DVRSIZ ; RETDVL: ADD HL,DE DJNZ RETDVL ; ; RETURN NO ERROR ; XOR A,A RET ;++++++++++++++++++++++++++++++++¯rÿHNNNNNNNNNNNNNNNNN¡¡¡þDœNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++ ; ; GET BANK NUMBER FUNCTION ; EXIT - A= BANK # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++dcÿÉNNNNNNNNNNNNNNNN¡¡¡þ%®ÂNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL FUNCTIONS TO SUPPORT CDOS PROGRAMS ;*************************************************************************** ; ; SYSTEM ð@ÿBNNNNNNNNNNNNNNNN¡¡¡þ+�ÍNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA,8DH ;IF RETURN VERSION THEN RETURN IT JR Z,RETCVER ; CP A,90H ;IF NOT CLOCK THEN ERR JR C,ILLEGC ; JR Z,CLKCAL ;IF~þBNNNNNNNNNNNNNNNN¡¡¡þ1³NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCTION ; ENTRY- IY= DRIVER TABLE PTR ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++$ÿÈNNNNNNNNNNNNNNNNN¡¡¡þÞxNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûXPRIM ; ; RESTORE THE MODIFIED IOPB SO RETRY WILL WORK ; POP HL ;TRACK LD (IOPB + PB_TRKO),HL ; LD HL,IOPB + PB_SEÇ«ÿNNNNNNNNNNNNNNNNN¡¡¡þtÞNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA ; EX (SP),HL ;PUT CALLER'S DATA IN HL, FUNCTION ADDR ON RET ; STACK, EXECUTE FUNCTION ADDRESS ON STACK ;#########I1ÿäNNNNNNNNNNNNNNNN¡¡¡þ˜fNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûO ERROR RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN DRIVER TABLE PTR ÃlþNNNNNNNNNNNNNNNN¡¡¡þ»iNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE IOPB FUNCTION ; ENTRY- IX= IOPB PTR ; EXIT - A= 0: OK ; ;++++++++οÿòNNNNNNNNNNNNNNNNN¡¡¡þ Q7NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++ ; GETBNK: LD A,MF_GBNK JP MR_FUN SUBTTL NON-DISK PROCEDURES ;**************************************ì>ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ&û‘NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCALL INTERCEPT ROUTINE CHECKS FOR ILLEGAL BDOS CALLS & ; PRINTS MESSAGE IF ILLEGAL. ALSO IMPLEMENTS CDOS CLOCK/CALENDAR ; SY®>ÿœNNNNNNNNNNNNNNNN¡¡¡þ,ZNNNNNNNNNNNNNNNNNNNNNN¡¡¡û CALENDAR THEN GET IT ; CP A,92H JR Z,CLKTIM ;IF TIME THEN GET IT ; ; ILLEGAL SYSTEM CALL ; ILLEGC: PUSH BC ;SAVE FUN°ŸÿNNNNNNNNNNNNNNNN¡¡¡þ‚NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û++++++++++++++++++++ ; FD8EXEC: ; ; CONVERT LOGICAL DRIVE TO PHYSICAL DRIVE ; LD A,(IY + DVRPDRV) LD (IOPB + PB_DRVO)×þNNNNNNNNNNNNNNNNNN¡¡¡þ íINNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCO +1 ;CLEAR BIT 15 RES 7,(HL) ; ; DONE ; RET SUBTTL BIOS FUNCTION CALLS ;++++++++++++++++++++++++++++++++++++++–èþHNNNNNNNNNNNNNNNNN¡¡¡þGïNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û################################################################### ; ; BIOS FUNCTION TABLE ; ;#############################j±ÿùNNNNNNNNNNNNNNNN¡¡¡þ«WNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFUNCTION ; ENTRY- C= DRIVE # (E FOR FUNCTION CALL) ; EXIT - HL= DRIVER TABLE BASE PTR ; A, C= 0 ; ;+++++++++++++++++++++++§þNNNNNNNNNNNNNNNNNN¡¡¡þˆXNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; EXIOPB: ; ; SET UP FOR CALL ; CALL GETBNK ;E= IôßþBNNNNNNNNNNNNNNNN¡¡¡þ!bNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************** ; ; OUTPUT HEX DATA TO CONSOLE SUBR ; ENTRY- A= DATA ; EXIT - A, C= ? ; ;**********�yÿBNNNNNNNNNNNNNNNN¡¡¡þ'È NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSTEM CALLS FOR ASMB. ; ;*************************************************************************** INTCPT: LD A,C ;CHECK CAšðþHNNNNNNNNNNNNNNNN¡¡¡þ-'kNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûCTION # ; ; OUTPUT WARNING MESSAGE ; LD HL,ISCMSG ;OUTPUT WARNING CALL EDITOR ; ; OUTPUT FUNCTION # ; POP HL LþÿÂNNNNNNNNNNNNNNNN¡¡¡þ›NNNNNNNNNNNNNNNNNNNNNN¡¡¡û,A ; ; IF HEADS == 1 THEN EXECUTE IOPB ; LD A,(IY + DVRHDS) DEC A JP Z,XPRIM ; ; ELSE SELECT SIDE FROM TRACK BIT ƒåÿNNNNNNNNNNNNNNNN¡¡¡þ ¸NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++ ; ; FUNCTION DISPATCHER ; EXIT - A= -1: ERROR, 0: OK ; ;++++++++++++++++++++++++++++ßÿòNNNNNNNNNNNNNNNNN¡¡¡þT¢NNNNNNNNNNNNNNNNNNNNNN¡¡¡û############################################### ; BFUNTBL: DW RETVERS ;0:RETURN VERSION # DW RETDVRTF ;1:RETURN DISK PHYSM=ÿNNNNNNNNNNNNNNNN¡¡¡þþNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; BIOS CALL ENTRY (E= DRIVE #) ; RETDVRTF: LD C,E ; RETDVRT: BÌÿÈNNNNNNNNNNNNNNNNN¡¡¡þÏNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûOPB PTR IS IN THIS BANK LD E,A PUSH IX ;MAKE HL = IX FOR NOW POP HL ; LD A,MF_XIOB ;MONITOR FUNCTION # (DISK FUNCTION)#÷ÿÂNNNNNNNNNNNNNNNN¡¡¡þ"7UNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û****************************************************************** ; PRHEX: LD C,A LD A,MF_PHXB JP XMROM ;********* ÈÿäNNNNNNNNNNNNNNNNN¡¡¡þ(ØžNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLL VALIDITY CP A,41 ;IF <= 40 THEN OK ; BDOSV EQU $ + 1 JP C,BDOS + 11H ;THIS ADDR MODIFIED BY WARM BOOT RTN ; ; THE FO¡ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ.r8NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûD A,L CALL PRHEX ; ; OUTPUT NEW LINE ; CALL CRLF ; ; RETURN NULLS ; XOR A,A ;BC = HL = A = 0 LD L,A LD H,A G>ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ¨$NNNNNNNNNNNNNNNNNNNNNN¡¡¡û0 ; LD HL,(IOPB + PB_TRKO) PUSH HL ;SAVE FOR ERROR RESTORE ; LD A,(IOPB + PB_SECO +1) ;FETCH SIDE SELECT BYTE ADD A,J‡ÿgNNNNNNNNNNNNNNNNN¡¡¡þ ‹+NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++ ; BIOFUNC: ; ; IF FUNCTION # NOT IN TABLE THEN RETURN -1 ; LD A,C CPBbÿäNNNNNNNNNNNNNNNNN¡¡¡þg“NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûICAL CONFIGURATION TABLE PTR DW EXIOPB ;2:EXECUTE THE IOPB MAXFUNCS EQU ($ - BFUNTBL) / 2 ;++++++++++++++++++++++++++++R”ÿùNNNNNNNNNNNNNNNN¡¡¡þÍ5NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD HL,DVR0 ;START AT 1ST TABLE ; ; IF DRIVE == 0 THEN ALREADY THERE ; LD A,C OR A,A RET Z ; ; ELSE IF ILLEGAL D°vÿäNNNNNNNNNNNNNNNN¡¡¡þ"þNNNNNNNNNNNNNNNNNNNNNNð¡¡¡û CALL XMROM ;EXECUTE MONITOR FUNCTION ; OR A,A ;FUNCTION ERROR? RET NZ ; ; FETCH & RETURN RESULT STATUS ; LD A,(nüÿòNNNNNNNNNNNNNNNN¡¡¡þ#dNNNNNNNNNNNNNNNNNNNNNN¡¡¡û****************************************************************** ; ; NEWLINE PROCEDURE ; ;********************************Ö«þHNNNNNNNNNNNNNNNNN¡¡¡þ)ë¯NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOLLOWING CONDITIONAL JUMP IS MODIFIED TO AN UNCONDITIONAL JUMP BY ; THE WARM BOOT ROUTINE IF THE CLOCK/CALENDAR BOARD IS NOT P 4ÿdNNNNNNNNNNNNNNNNN¡¡¡þ/A NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD C,A LD B,A RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CDOS RETURN VERh ÿrNNNNNNNNNNNNNNNN¡¡¡þýwNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA ;SHIFT OUT BIT 7 ; SRL H ;SHIFT TRACK HIGH BYTE RR L ;ROTATE BIT 8 TO 7 AND 0 TO CF RRA ;ROTATE TRACK BIT 0 INÓØÿœNNNNNNNNNNNNNNNN¡¡¡þ ¼NNNNNNNNNNNNNNNNNNNNNN¡¡¡û A,MAXFUNCS LD A,-1 RET NC ; ; ELSE COMPUTE TABLE ENTRY ; PUSH HL ;SAVE POSSIBLE DATA ; LD HL,BFUNTBL LD A,C R+ÿáNNNNNNNNNNNNNNNN¡¡¡þ2ÀNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN BIOS VERSION # ; EXIT - HL= VERSION # IN BINARY {0.00,..655.35} K<ÿ NNNNNNNNNNNNNNNNN¡¡¡þÝ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRIVE THEN RETURN ERROR ; CP A,NDRVS JR C,RETDV2 ; OR A,A RET ; ; ; ELSE COMPUTE TABLE PTR ; RETDV2: LD B,C LD¦½ÿœNNNNNNNNNNNNNNNN¡¡¡þw­NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIX + PB_STATO) OR A,A ;TEST RESULT FOR RETURN RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++‚lþHNNNNNNNNNNNNNNNNN¡¡¡þ$�óNNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************************* ; CRLF: LD C,CR CALL COC LD C,LF JP COC IF INTCPTS SUBTTL ADDITIONAë?þ!NNNNNNNNNNNNNNNN¡¡¡þ*¾üNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûRESENT ; IF NOT MODIFIED, THEN IT IS ALLWAYS FALSE (NOP). ; INHCLK: JR C,ILLEGC ; ; NOW CHECK FOR EXTENDED CALLS ; CP cÝÿÈNNNNNNNNNNNNNNNNN¡¡¡þ0RDNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSION FUNCTION ; MAKES CLOCK/CALENDAR WORK. ; EXIT - B= 1 ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Æ7ÿüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN^NNNNNNNN�Ï�œ‚iƒ6„…Ò… †m‡<ˆ ‰Ø‰¥Šs‹AŒ�Ý�¬Ž{�I�‘䑲’“L”•ç•´–‚—P˜™í™¼šŠ›Yœ&�ô�ž‘Ÿ_ -¡ú¡È¢–£c¤1¥þ¥Ì¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ%dNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++ ; RETCVER: LD B,1 RET SUBTTL CLOCK ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ûéÿÉNNNNNNNNNNNNNNNNN¡¡¡þ�ÂNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ENTRY- A= FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; XMROM: ; ; SWITNÅÿNNNNNNNNNNNNNNNN¡¡¡þ ` NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++ ; CNSCK: LD A,MF_CIS JR XMROM ;*************************************9½ÿÂNNNNNNNNNNNNNNNN¡¡¡þ@uNNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************************************** ; PUNCH: RET ;**************************************************¸hÿùNNNNNNNNNNNNNNNN¡¡¡þ¯¾NNNNNNNNNNNNNNNNNNNNNN¡¡¡û***************************************************************** ; EDITOR: CALL GETBNK LD E,A LD A,MF_PUTS JR XMROM ü&þ$NNNNNNNNNNNNNNNNN¡¡¡þNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLL MR_FUN POP AF ; ; IF OPTION IS CTRL-C THEN WARM BOOT ; CP A,3 ;IF CTRL-C THEN WARM BOOT JP Z,PAGE0 ; ; IF OPTjÿäNNNNNNNNNNNNNNNN¡¡¡þ%ïFNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; UNSUPPORTED INTERRUPT ; ;---------------------------------------------------------------------------- ; ILLINT: PUSH™WÿyNNNNNNNNNNNNNNNN¡¡¡þ+ÌINNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û ;############################################################################ ; ; DISK DRIVER TABLES ; ;##############qÿÂNNNNNNNNNNNNNNNN¡¡¡þp7NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++ ; ; RETURN CALENDAR FUNCTION 90H ; EXIT - A= DAY ; B= MONTH ; C= YEAR ; L= DAY OF WEEK ; ;++++++++µ8ÿHNNNNNNNNNNNNNNNNN¡¡¡þŸüNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCH TO LOCAL (LARGER) STACK ; LD (SPSAV),SP LD SP,LSTACK ; ; EXECUTE THE FUNCTION ; CALL MR_FUN ;EXECUTE MONITOR FUNðÿoNNNNNNNNNNNNNNNN¡¡¡þ5ZNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*************************************** ; ; CONSOLE OUTPUT ; ENTRY- C= CHAR TO OUTPUT ; ;**********************************ÌÿòNNNNNNNNNNNNNNNN¡¡¡þÙâNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************** ; ; PRINTER DRIVER ; ENTRY- C= CHAR TO OUTPUT ; ;***********************************************­¤þrNNNNNNNNNNNNNNNN¡¡¡þúíNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û IF INTRPTS SUBTTL INTERRUPTS ;---------------------------------------------------------------------------- ; ; USER INT�EÿäNNNNNNNNNNNNNNNNN¡¡¡þ ³NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûION IS YES THEN WARM BOOT ; AND A,5FH ;IGNORE CASE ; CP A,'Y' JP Z,PAGE0 ; ; IF OPTION IS INTERRUPT THEN EXECUTE RE{±ÿNNNNNNNNNNNNNNNNNN¡¡¡þ&ºNNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡û AF ;SAVE ALL 8080 REGS PUSH HL PUSH BC PUSH DE LD HL,ILLIM ;NOTIFY USER OF INT JR IQCONT SUBTTL INITIALIZED DAù¯ÿùNNNNNNNNNNNNNNNN¡¡¡þ,UÞNNNNNNNNNNNNNNNNNNNNNN¡¡¡û############################################################## ; STRUCT 0 DVRADD DS 2 ;START ADDRESS OF DISK DRIVER DVRFG DgÇÿdNNNNNNNNNNNNNNNN¡¡¡þCNNNNNNNNNNNNNNNNNNNNNNð¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKCAL: LD A,MF_GCAL JR XMROM ;+++++++++++++++»ÿNNNNNNNNNNNNNNNNNN¡¡¡þ ¬ÍNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCTION ; ; RESTORE THE STACK ; LD SP,(SPSAV) RET SUBTTL CHAR I/O ROUTINES ;++++++++++++++++++++++++++++++++++++++�ÿÈNNNNNNNNNNNNNNNNN¡¡¡þkNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û****************************************** ; COC: LD A,MF_CO JR XMROM ;++++++++++++++++++++++++++++++++++++++++++++++�¥ÿùNNNNNNNNNNNNNNNN¡¡¡þêÓNNNNNNNNNNNNNNNNNNNNNN¡¡¡û***************************** ; LO: LD A,MF_LO JR XMROM ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}ÔÿœNNNNNNNNNNNNNNNN¡¡¡þÉÜNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûERRUPT ; ;---------------------------------------------------------------------------- ; ITRAP: ; ; SAVE REGS FIRST ; È{ÿBNNNNNNNNNNNNNNNN¡¡¡þ!#‚NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûSTART 7 ; CP A,'I' JR NZ,ITRAP1 ; POP DE POP BC ;RESTORE REGS 1ST POP HL POP AF JP 0038H ; ; ; IF OPTION I‚þNNNNNNNNNNNNNNNNNN¡¡¡þ'‰$NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTA ;############################################################################ ; ; 3740 SECTOR TRANSLATION TABLE ; **** CP$\ÿÉNNNNNNNNNNNNNNNN¡¡¡þ-fïNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûS 1 ;FLAGS (BIT 0= 1: INHIBIT LOGON) DVRPDRV DS 1 ;PHYSICAL DRIVE ;DVRLDRV DS 1 ;LOGICAL DRIVE {0..N-1} ; ; THE FOLLOWING ŠÓÿáNNNNNNNNNNNNNNNN¡¡¡þÚ‘NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN TIME FUNCTION 92H ; EXIT - A= SECONDS ; B= MINUTESŽFÿÂNNNNNNNNNNNNNNNN¡¡¡þ ùžNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++ ; ; CONSOLE INPUT ; EXIT - A= CHAR ; ;++++++++++++++++++++++++++++++++++++++++++++++þ¯þrNNNNNNNNNNNNNNNNN¡¡¡þ&NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++ ; ; READER DRIVER - DUMMY ; EXIT - A= CTRL-Z ; ;++++++++++++++++++++++++++++++++++++++++++++`HþrNNNNNNNNNNNNNNNN¡¡¡þ¿€NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û++++++++++++++++ ; ; RETURN LIST DEVICE STATUS ; EXIT - A= 0: BUSY, FFH:READY ; ;++++++++++++++++++++++++++++++++++++++++++™ÿ'NNNNNNNNNNNNNNNNN¡¡¡þPKNNNNNNNNNNNNNNNNNNNNNN¡¡¡û PUSH AF PUSH HL PUSH BC PUSH DE ; ; SAVE CURRENT ROM & GET MONITOR ROM ; IN A,(M2_RSEL) LD (ROMSAV),A LD A,MR_¢sÿrNNNNNNNNNNNNNNNN¡¡¡þ"vÑNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS MONITOR THEN EXECUTE MONITOR BREAKPOINT ; ITRAP1: CP A,'M' JR NZ,ITRAPR ; POP DE POP BC POP HL POP AF JP 0008H jhÿ$NNNNNNNNNNNNNNNNN¡¡¡þ(™NNNNNNNNNNNNNNNNNNNNNN¡¡¡û/M SINGLE DENSITY **** ; ;############################################################################ ; SDTRAN: GXLATE 26,6¥ÿùNNNNNNNNNNNNNNNN¡¡¡þ.3¼NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûMAY BE BROUGHT OFF DISK DESCRIPTOR OR FROM DEFAULT TABLES ; DVRFLG DS 1 ;DISK FLAGS DVR0SPT DS 1 ;TRK 0 SECTORS PER TRK DVR0®ÿçNNNNNNNNNNNNNNNNN¡¡¡þé NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û ; C= HOURS ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKTIM: LD A,MF_GTIM JR H�ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ ʯNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++ ; CI: LD A,MF_CI JR XMROM ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ©ÿäNNNNNNNNNNNNNNNNN¡¡¡þ&NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û++++++++++++++++++++++++++++++++ ; READER: LD A,CTRLZ ;FAKE EOF ; ; FALL INTO PUNCH RETURN ; ;*********************\ÿÄNNNNNNNNNNNNNNNN¡¡¡þŒ±NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û++++++++++++++++++++++++++++++++++ ; LISTST: LD A,MF_LOS JR XMROM ;**************************************************×þdNNNNNNNNNNNNNNNN¡¡¡þczNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRNUM OUT (M2_RSEL),A ; ; PRINT PROMPT ; LD HL,ITMSG IQCONT: LD A,MF_PUTS CALL MR_FUN ; LD HL,IQMSG ;QUERY USER !%ÿyNNNNNNNNNNNNNNNN¡¡¡þ#EàNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; ; ELSE RESTORE REGS & RETURN ; ITRAPR: LD A,(ROMSAV) ;RESTORE ROM # OUT (M2_RSEL),A ; POP DE POP BC POP HL¤ÿíNNNNNNNNNNNNNNNNN¡¡¡þ)ª+NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;############################################################################ ; ; COMMON I/O PARAMETER BLOCK ; ;######2ÿNNNNNNNNNNNNNNNNN¡¡¡þ/�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSZ DS 1 ;TRK 0 SECTOR SIZE DVR1SPT DS 1 DVR1SZ DS 1 DVRDSPT DS 1 DVRDSZ DS 1 DVRDTYP DS 1 ;RESERVED FOR DISK TYPE DVRCYLS Úÿ9NNNNNNNNNNNNNNNN¡¡¡þ¼óNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûXMROM ENDIF ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; MONITOR ROM EXECUTER ;•úÿáNNNNNNNNNNNNNNNN¡¡¡þ S8NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++ ; ; RETURN CONSOLE STATUS ; EXIT - A= 0: NOT READY ; FFH: CHAR READY ; ;++++++++++++++++++++++++++++;YþBNNNNNNNNNNNNNNNN¡¡¡þsDNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û******************************************************* ; ; PUNCH DRIVER ; ENTRY- C= CHAR TO OUTPUT ; ;********************…›ÿäNNNNNNNNNNNNNNNNN¡¡¡þœ�NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û************************** ; ; MESSAGE EDITOR ; ENTRY- HL= TEXT PTR (BIT 7= 1: TERMINATOR) ; EXIT - REGS= ? ; ;***********þBNNNNNNNNNNNNNNNN¡¡¡þ6)NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD A,MF_PUTS CALL MR_FUN ; ; GET & ECHO USER INPUT ; LD A,MF_CI CALL MR_FUN ; PUSH AF LD C,A LD A,MF_CO CAB þHNNNNNNNNNNNNNNNNN¡¡¡þ$ÜwNNNNNNNNNNNNNNNNNNNNNN¡¡¡û POP AF EI ;RE-ENABLE INTERRUPTS RET ;---------------------------------------------------------------------------- ÚÓÿBNNNNNNNNNNNNNNNN¡¡¡þ*ÿxNNNNNNNNNNNNNNNNNNNNNN¡¡¡û###################################################################### ; IOPB: REPT PB_SIZE LIST OFF DB 0 LIST ON ENDMQÃþHNNNNNNNNNNNNNNNNN¡¡¡þ0ÀNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDS 2 ;DISK CYLINDERS DVRHDS DS 1 ;HEADS ; ; DEFINE THE STRUCTURE SIZE ; DVRSIZ DS 0 ENDM ;@@@@@@@@@@@@@@@@@@@@@@@@ ÿÈNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN NNNNNþ€Ì�š‚hƒ6„…Ò… †m‡;ˆ‰Ö‰£Šq‹?Œ �Û�©Žw�D�‘ß‘­’{“H”•ã•°–~—L˜™ç™µšƒ›Qœ�ë�¸ž‡ŸU "¡ð¡½¢‹£X¤'¥ô¥Â¦^NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þTNNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; MACRO TO DEFINE THE DRIVER TABLE RECORD ; ENTRY- #DADD= DRIVER ADDRE&þHNNNNNNNNNNNNNNNNN¡¡¡þ¸òNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LIST OFF ENDM IF BOOT = 10H DVR0: ;A ALLDRV HDEXEC,4,60H,32,1,32,1,32,1,10H,256,4 DVR1: ;B ALLDRV HDEXEC,4,60H,3@ïÿòNNNNNNNNNNNNNNNN¡¡¡þ W9NNNNNNNNNNNNNNNNNNNNNN¡¡¡û################################################################## ; ; DEFAULT 8" FLOPPY DISK PARAMETER BLOCK ; IBM 3740 SINGŽ!þNNNNNNNNNNNNNNNNNN¡¡¡þwENNNNNNNNNNNNNNNNNNNNNN¡¡¡û############################################# ; ; DEFAULT 8" HARD DISK PARAMETER BLOCK ; ;##################################[™ÿÂNNNNNNNNNNNNNNNN¡¡¡þ˜ŽNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DB 4 ;HEADS ;############################################################################ ; ; MODE 2 INTERRUPT VECTOR Tv þHNNNNNNNNNNNNNNNNN¡¡¡þ2(NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûDIF IF INTRPTS ITMSG DM CR,LF,'User' ILLIM DM CR,LF,'Ill.' IQMSG DM ' Int. Abort? (Y/N/I/M) - ' ENDIF ;#########þ=þINNNNNNNNNNNNNNNN¡¡¡þ%ØvNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRIVE PARAMETER BLK PTR IF ((DD - 1) <= NDHD) AND ((DD - 1) >= STHD) DW 0 ;;NO CHECKS ON HARD DISK ELSE DW D#D(DD)CHé´þBNNNNNNNNNNNNNNNN¡¡¡þ+ûyNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û# BTFLG DS 1 ;RESERVED FOR FLAGS BTDMA DS 2 ;DMA ADDRESS BTDMAX DS 1 ;DMA EXTENDED ADDRESS ;############################^þBNNNNNNNNNNNNNNNN¡¡¡þGNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûSS ; #PD= PHYSICAL DRIVE # ; #FG= DRIVE FLAGS (IDFLGO) ; #S0= TRK 0 SPT ; #Z0= TRK 0 SIZE ; #S1= TRK 1 SPT ; #Z1= TRº!þHNNNNNNNNNNNNNNNNN¡¡¡þ¨ÌNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û2,1,32,1,32,1,10H,256,4 DVR2: ;C ALLDRV HDEXEC,5,60H,32,1,32,1,32,1,10H,256,4 DVR3: ;D ALLDRV HDEXEC,5,60H,32,1,32,1,32,1,‘ÎÿçNNNNNNNNNNNNNNNN¡¡¡þjNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLE DENSITY FORMAT ; ;############################################################################ ; SD8PBK: DW 26 ;SECTORS ¤¶ÿäNNNNNNNNNNNNNNNN¡¡¡þîÒNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û########################################## ; HDPBK: DW 128 ;SECTORS PER TRACK (LOGICAL) (SPT) DB 5 ;BLOCK SHIFT FACTOR (B•ÿÿòNNNNNNNNNNNNNNNN¡¡¡þÍÝNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûABLE ; ;############################################################################ ; ; START ON AN EVEN PAGE BOUNDARY ;øMþrNNNNNNNNNNNNNNNNN¡¡¡þ 'ƒNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û################################################################### ; ; DRIVE PARAMETER HEADER AREA ; 1 PER DRIVE ; ;######!*ÿçNNNNNNNNNNNNNNNNN¡¡¡þ&�%NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûK ;;DRIVE DISK CHECKSUMS ARRAY PTR ENDIF DW D#D(DD)ALL ;;DRIVE CLUSTER ALLOCATION BIT MAP PTR LIST OFF ENDM ; ; DEëÿœNNNNNNNNNNNNNNNN¡¡¡þ,bîNNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡û################################################ ; ; VARIABLES ; ;########################################################²ÙþNNNNNNNNNNNNNNNN¡¡¡þt6NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûK 1 SIZE ; #SD= DATA TRKS SPT ; #ZD= DATA TRKS SIZE ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@Î.ÿNNNNNNNNNNNNNNNN¡¡¡þ ›ýNNNNNNNNNNNNNNNNNNNNNN¡¡¡û10H,256,4 DVR4: ;E ALLDRV FD8EXEC,0,0,26,0,26,0,26,0,0,77,1 DVR5: ;F ALLDRV FD8EXEC,1,0,26,0,26,0,26,0,0,77,1 ENDIF ­µþHNNNNNNNNNNNNNNNNN¡¡¡þ1[NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPER TRACK DB 3 ;BLOCK SHIFT FACTOR DB 7 ;BLOCK MASK DB 0 ;NULL MASK DW 242 ;DISK SIZE -1 DW 63 ;DIRECTORY MAX D�HÿrNNNNNNNNNNNNNNNN¡¡¡þÝãNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSH) DB 31 ;BLOCK MASK (BLM) DB 1 ;NULL MASK (EXM) DW 1015 ;DISK SIZE (CLUSTERS -1) (DSM) DW 1152 / 2 ;DIRECTORY MûÿÎNNNNNNNNNNNNNNNNN¡¡¡þþìNNNNNNNNNNNNNNNNNNNNNN¡¡¡û IF $ AND 0FFH DS 100H - ($ AND 0FFH) ENDIF INTABL: REPT 7 ;1ST 7 ARE UNSUPPORTED LIST OFF DW ILLINT LIST ON E#VÿœNNNNNNNNNNNNNNNN¡¡¡þ!²NNNNNNNNNNNNNNNNNNNNNN¡¡¡û###################################################################### ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@±ÃÿœNNNNNNNNNNNNNNNN¡¡¡þ'¾NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFINE THE DATA ; DD DL 1 REPT NDRVS LIST OFF ALLDPH 0123456789ABCDEF DD DL DD + 1 LIST ON ENDM ; ; LAST OF INIkñþHNNNNNNNNNNNNNNNN¡¡¡þ-QßNNNNNNNNNNNNNNNNNNNNNN¡¡¡û#################### ; DTPTR: DS 2 ;DRIVE TABLE PTR LOGRQ: DS 1 ;LOG ON REQUEST REG. DVRTPTR DS 2 ;DRIVE DRIVER TABLE BASE A:ÿ¢NNNNNNNNNNNNNNNN¡¡¡þí¡NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û@@@@@@@@@ ; ALLDRV MACRO #DADD,#PD,#FG,#S0,#Z0,#S1,#Z1,#SD,#ZD,#DT,#CY,#HD LIST ON DW #DADD ;DRIVER EXECUTION ADDR DB 0v˜ÿÂNNNNNNNNNNNNNNNN¡¡¡þ ήNNNNNNNNNNNNNNNNNNNNNN¡¡¡û IF BOOT = 3 DVR0: ;A ALLDRV FD8EXEC,0,0,26,0,26,0,26,0,0,77,1 DVR1: ;B ALLDRV FD8EXEC,1,0,26,0,26,0,26,0,0,77,1 DVR2: ;V´ÿòNNNNNNNNNNNNNNNNN¡¡¡þ"NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûB 11000000B ;ALLOC 0 DB 0 ;ALLOC 1 DW 16 ;CHECK SIZE DW 2 ;TRACK OFFSET DB 0 ;PHYSICAL RECORD SHIFT FACTOR DB 0 ;Ó;ÿ9NNNNNNNNNNNNNNNN¡¡¡þˆ°NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûAX (DRM) DB 0FFH ;ALLOCATION 0 (AL0) DB 10000000B ;ALLOCATION 1 (AL1) DW 0 ;CHECK SIZE (CKS) DW 2 ;TRACK OFFSç+ÿÈNNNNNNNNNNNNNNNNN¡¡¡þg{NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûNDM ; DW ITRAP ;INT 8 IS USER INTERRUPT ENDIF ;#####################################################################öéþ9NNNNNNNNNNNNNNNN¡¡¡þ"AáNNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE A DISK PARAMETER TABLE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@š\ÿäNNNNNNNNNNNNNNNNN¡¡¡þ(®*NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTIALIZED CODE READ FROM DISK ; BIOSND EQU $ SUBTTL UNINITIALIZED DATA AREA ;############################################# ¹ÿBNNNNNNNNNNNNNNNN¡¡¡þ.ŒNNNNNNNNNNNNNNNNNNNNN!à¡¡¡ûDDRESS PTR DVRXADR DS 2 ;DRIVE DRIVER EXECUTION ADDRESS SECOFF DS 2 ;LOGICAL DRIVE SECTOR OFFSET (ADD TO SECTOR) ; ROMSAV EQ&ÿçNNNNNNNNNNNNNNNNN¡¡¡þÞ�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;LOGON INHIBIT FLAG (LOGON ENABLED) DB #PD ;MONITOR PHYSICAL DRIVE # DB #FG ;DISK FLAGS DB #S0,#Z0 ;T0 SECTORS, SIZE —ôþHNNNNNNNNNNNNNNNNN¡¡¡þ ýŸNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûC ALLDRV HDEXEC,4,60H,32,1,32,1,32,1,10H,256,4 DVR3: ;D ALLDRV HDEXEC,4,60H,32,1,32,1,32,1,10H,256,4 DVR4: ;E ALLDRV HDEû2ÿNNNNNNNNNNNNNNNNN¡¡¡þ'NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPHYSICAL RECORD MASK DW 0 ;LOGICAL DRIVE SECTOR OFFSET ; ; DEFAULT DISK PHYSICAL PARAMETERS ; DB 0 ;FLAGS DB 26,0,2;¤ÿâNNNNNNNNNNNNNNNN¡¡¡þ»�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûET (OFF) DB 1 ;PHYSICAL RECORD SHIFT FACTOR (PSH) DB 1 ;PHYSICAL RECORD MASK (PRM) DW 0 ;LOGICAL DRIVE SECTOR OFFSETŒ*þNNNNNNNNNNNNNNNN¡¡¡þTJNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û####### ; ; MESSAGES ; ;############################################################################ ; MSGLE: DM CR,LF,'à/ÿùNNNNNNNNNNNNNNNN¡¡¡þ#rÐNNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@@@ ; ALLDPH: MACRO #D LIST ON D#D(DD)DPH: ;DRIVE PARAMETER HEADER FOR DRIVE #D(DD) DW 0 ;;SECTOR TÿþþHNNNNNNNNNNNNNNNNN¡¡¡þ)�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û############################### ; ; THE FOLLOWING DATA MUST RESIDE IN THIS ORDER TO MATCH THE IOPB DATA ; ;###############¾\þdNNNNNNNNNNNNNNNNN¡¡¡þ/7½NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûU 0048H ;DS 1 ;ROM SWAP SAVE OF ORIGINAL ROM SPSAV DS 2 ;USER SP SAVE WHILE USING LOCAL STACK DS 64 ;LOCAL STACK (32 ENTRIES)EþrNNNNNNNNNNNNNNNN¡¡¡þ‹ÃNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DB #S1,#Z1 ;T1 SECTORS, SIZE DB #SD,#ZD ;DATA TRKS SECTORS, SIZE DB #DT ;DISK TYPE DW #CY ;CYLS DB #HD ;HEADS ; èÿùNNNNNNNNNNNNNNNN¡¡¡þ dNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûXEC,5,60H,32,1,32,1,32,1,10H,256,4 DVR5: ;F ALLDRV HDEXEC,5,60H,32,1,32,1,32,1,10H,256,4 ENDIF LIST ON ;##########¤oÿœNNNNNNNNNNNNNNNN¡¡¡þDtNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û6,0,26,0 ;SECTORS PER TRACK, SECTOR SIZE (128) DB 0 ;TYPE DW 77 ;CYLS DB 1 ;HEADS ;###############################IyÿòNNNNNNNNNNNNNNNNN¡¡¡þ«¿NNNNNNNNNNNNNNNNNNNNNN¡¡¡û (SOF) ; ; ; DB 01100000B ;FLAGS 256 BPS, HARD, SSSD DB 32,1,32,1,32,1 ;32 SPT, 256 BPS DB 10H ;TYPE DW 256 ;CYLS '’ÿBNNNNNNNNNNNNNNNN¡¡¡þNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLOAD ERROR' ; DSKEB: DM CR,LF,'Abort, Ignore, Retry, (BDOS) - ' ; IF INTCPTS ISCMSG: DM CR,LF,'ILL SYS CALL, #= ' EN:˜ÿgNNNNNNNNNNNNNNNNN¡¡¡þ$ëGNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRAN TBL (OR 0 IF NO XLATE) DW 0 ;;SCRATCH AREA DW 0 ;;" DW 0 ;;" DW DIRBF ;;DIRECTORY BUFFER PTR DW D#D(DD)DPB ;;D‹?ÿÂNNNNNNNNNNNNNNNN¡¡¡þ*ÈHNNNNNNNNNNNNNNNNNNNNNN¡¡¡û############################################################# ; BTDRV: DS 1 ;DRIVE # BTTRK DS 2 ;TRACK # BTSEC DS 2 ;SECTOR ßFÿçNNNNNNNNNNNNNNNNN¡¡¡þ0$ðNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LSTACK EQU $ ;############################################################################ ; ; DRIVE ALLOCATION AREAS™RþHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÎNNNNNNNN�Ï�œ‚iƒ6„…Ô…¢†o‡=ˆ ‰Ù‰¦Šv‹DŒ�à�®Ž|�J�‘瑵’‚“O”•ê•·–†—T˜"™ï™¾šŒ›Zœ'�õ�ž‘Ÿ_ -¡ú¡Ç¢•£c¤2¥¦Î¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ ÝcNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; ;############################################################################ ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@•ÿ$NNNNNNNNNNNNNNNNN¡¡¡þ wÅNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL DD + 1 LIST ON ENDM ;############################################################################ ; ; RESERVE DRI¹bÿäNNNNNNNNNNNNNNNN¡¡¡þ ˜NNNNNNNNNNNNNNNNNNNNNN¡¡¡û0,1- DIRECTORY ALLOCATION ; 1 MSB PER DIRECTORY CLUSTER ALLOCATED DPBCKS DS 2 ;CKS- # DIRECTORY SECTORS CHECKED ; (DRM CãÿBNNNNNNNNNNNNNNNN¡¡¡þ ¸rNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û OFFSET (FOR LOGICAL DRIVE) ; 0: NONE, 1..65535: OFFSET DPBSZ DS 0 ENDM ; ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@g™ÿ„NNNNNNNNNNNNNNNN¡¡¡þ W¹NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û############################################## ; ; DISK DRIVER TABLES (DDT) ; ;#############################################à>ÿNNNNNNNNNNNNNNNNNN¡¡¡þ ýNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR TABLE RECORD ; ENTRY- #DADD= DRIVER ADDRESS ; #PD= PHYSICAL DRIVE # ; #FLG= DRIVE FLAGS ; #DPB= DPB ADDRESS ; #DPH= D·Ãÿ„NNNNNNNNNNNNNNNNN¡¡¡þ %ANNNNNNNNNNNNNNNNNNNNNN¡¡¡ûODE) LSTINC EQU FALSE ;LIST INCLUDE FILES USEMON EQU TRUE ;USE MONITOR ROM I/O ROUTINES IF TRUE INTRPTS EQU TRUE ;ENABLE IÝÈÿÎNNNNNNNNNNNNNNNNN¡¡¡þ +4NNNNNNNNNNNNNNNNNNNNNNN¡¡¡û C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; D SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ; E JADE 8" FLOPPY PHYSICAL DRIVEÚrþBNNNNNNNNNNNNNNNN¡¡¡þ ˆ0NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; MACRO TO DEFINE THE DRIVE ALLOCATION & CHECKSUMS AREA ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@£[ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ gûNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûVE PARAMETER BLOCKS ; ;############################################################################ ; STRUCT 0 DPBSPT DS 2×%ÿÈNNNNNNNNNNNNNNNN¡¡¡þ Í]NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+1) / 4 DPBOFF DS 2 ;OFF- # RESERVED TRACKS (USUALLY 2) ; ; ADDITIONAL CP/M 3.0 DATA (ALSO COULD BE USED BY CP/M 2.2 DEBLOCRàÿòNNNNNNNNNNNNNNNN¡¡¡þ !åNNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE THE DPB FOR DRIVE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@˜*ÿNNNNNNNNNNNNNNNN¡¡¡þ êNNNNNNNNNNNNNNNNNNNNNN¡¡¡û############################### ; STRUCT 0 DDT_EXE DS 2 ;START ADDRESS OF DISK DRIVER DDT_FLG DS 1 ;FLAGS BIT DEF. ; 0ê®ÿçNNNNNNNNNNNNNNNNNNN¡¡¡þ è´NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPH ADDRESS ; #HDS= HEADS ; #SOF= SECTOR OFFSET ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@›6ÿçNNNNNNNNNNNNNNNNN¡¡¡þ &BNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNTERRUPT PROCESSING WHISTLE INTCPTS EQU TRUE ;ENABLE SYSTEM CALL INTERCEPT WHISTLE BOOT EQU 10H ;10H: HARD DISK, 3: 8" FLOPP/ÿùNNNNNNNNNNNNNNNN¡¡¡þ ,­ÙNNNNNNNNNNNNNNNNNNNNNN¡¡¡û 0 ; F JADE 8" FLOPPY PHYSICAL DRIVE 1 ENDIF IF BOOT = 3 ; A JADE 8" FLOPPY PHYSICAL DRIVE 0 ; B JADE 8" FLOPPY¨ÿNNNNNNNNNNNNNNNN¡¡¡þ »NNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ALLDAL: MACRO #D LIST ON IF ((DD - 1) >= STHD) AND ((DD - 1) <= NDHi{ÿaNNNNNNNNNNNNNNNN¡¡¡þ TÊNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ;SPT- SECTORS/TRACK DPBBSH DS 1 ;BSH- BLOCK SHIFT FACTOR DETERMINED BY CLUSTER SIZE ; 1K= 3, 2K= 4, 4K= 5, 8K= 6, 16K= 7 Ç¡ÿHNNNNNNNNNNNNNNNNN¡¡¡þ þlNNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡ûKING) ; DPBPSH DS 1 ;PSH- PHYSICAL RECORD SHIFT FACTOR BASED ON BYTES/SEC ; 0: 128, 1: 256, 2: 512, 3: 1024 DPBPHM DS 1 ;xåÿùNNNNNNNNNNNNNNNN¡¡¡þ ÔNNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ALLDPB: MACRO #D LIST ON D#D(DD)DPB: DS DPBSZ ;ALLOCATION FOR DRIVE #D(DD) LIST OFF ENDÎîÿBNNNNNNNNNNNNNNNN¡¡¡þ 1ÛNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û 1: INHIBIT LOGON ; 1..3 PARTITION # {0,..7} DDT_HDB EQU 4 ;1: HARD DISK DRIVE ; DDT_DRV DS 1 ;PHYSICAL DRIVE # DDT_¿�ÿNNNNNNNNNNNNNNNNNNN¡¡¡þ !Û…NNNNNNNNNNNNNNNNNNNNNN¡¡¡û TITLE CUSTOMIZED BIOS FOR M5B LIST NOCOND ;============================================================================ ; þ^ÿùNNNNNNNNNNNNNNNNN¡¡¡þ 'q#NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûY, 20H: 5" FLOPPY DEBUG EQU FALSE ;TRUE TO DUMP THE IOPB DATA TO PRINTER FORM ;******************************************þINNNNNNNNNNNNNNNN¡¡¡þ -žèNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û PHYSICAL DRIVE 1 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; D SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 0 ; E SIDE 0 Šóÿ!NNNNNNNNNNNNNNNN¡¡¡þ "–NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD) D#D(DD)ALL: DS 127 ;ALLOCATION BIT MAP FOR 8" HARD DRIVE #D(DD) ENDIF IF ((DD - 1) >= ST8FD) AND ((DD - 1) <= ND8FD)–4ÿNNNNNNNNNNNNNNNN¡¡¡þ ™NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDPBBLM DS 1 ;BLM- BLOCK MASK ; 1K = 7, 2K= 15, 4K= 31, 8K= 63, 16K= 127 DPBEXM DS 1 ;EXM- EXTENT MASK ; DSM < 256 : 1K=%þrNNNNNNNNNNNNNNNNN¡¡¡þ í!NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPHM- PHYSICAL RECORD MASK BASED ON BYTES/SEC ; 0: 128, 1: 256, 3: 512, 7: 1024 ; ; ADDITIONAL DISK PARTITIONING DATA FORä·ÿòNNNNNNNNNNNNNNNN¡¡¡þ G‡NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûM ; ; RESERVE THE DATA SPACE ; DD DL 1 REPT NDRVS LIST OFF ALLDPB 0123456789ABCDEF DD DL DD + 1 LIST ON ENDM “ ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ ¨LNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDPB DS 2 ;DPB ADDRESS FOR THIS DRIVE DDT_DPH DS 2 ;DPH ADDRESS FOR THIS DRIVE ; ; THE FOLLOWING MAY BE BROUGHT OFF DISK DES„ÿnNNNNNNNNNNNNNNNNN¡¡¡þ "ŽÖNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ASSEMBLY PARAMETERS ; ;============================================================================ FALSE EQU 0 TRUE EQU N¯7ÿòNNNNNNNNNNNNNNNNN¡¡¡þ (aNNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************************** ; ; CUSTOMIZED BIOS FOR M5B ; (c) 1981 GRH Electronics, CUPERTINO, CA ; ;********** ŸÿÂNNNNNNNNNNNNNNNN¡¡¡þ .Ë»NNNNNNNNNNNNNNNNNNNNNN¡¡¡û& 1 OF HARD DISK PHYSICAL DRIVE 1 ; F SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ENDIF IF BOOT = 20H ; A JADE 5" FLOØxÿçNNNNNNNNNNNNNNNNN¡¡¡þ §NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û D#D(DD)ALL: DS 57 ;ALLOCATION BIT MAP FOR 8" DRIVE #D(DD) D#D(DD)CHK DS 32 ;DIRECTORY CHECKSUMS STORAGE (1 BYTE PER SECTORéÛÿ�NNNNNNNNNNNNNNNNN¡¡¡þ 2¨NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û 0, 2K= 1, 4K= 3, 8K= 7, 16K= 15 ; DSM > 255 : 2K= 0, 4K= 1, 8K= 3, 16K= 7 DPBDSM DS 2 ;DSM- DRIVE STORAGE SIZE (IN CLUSTER:)ÿäNNNNNNNNNNNNNNNNN¡¡¡þ ÞNNNNNNNNNNNNNNNNNNNNNN¡¡¡û THE LOGICAL DRIVE SELECTION. ; PARTITIONING BY TRACKS ARE IMPLIMENTED THRU BDOS USING DPBOFF ABOVE. ; PARTITIONING BY HEADS A¯BÿNNNNNNNNNNNNNNNN¡¡¡þ t¶NNNNNNNNNNNNNNNNNNNNNN¡¡¡û IF (($ - 8000H) > 07700H) OR ($ < 8000H) CONMSG **** BIOS TOO BIG, USE MOVCPM & RE-ADJUST! **** ENDIF END _9ÿINNNNNNNNNNNNNNNN¡¡¡þ ›}NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCRIPTOR OR FROM DEFAULT TABLES ; DDT_HDS DS 1 ;HEADS DDT_SOF DS 2 ;SECTOR OFFSET ; ; DEFINE THE STRUCTURE SIZE ; DDT_SI¸ÒÿBNNNNNNNNNNNNNNNN¡¡¡þ #½çNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOT FALSE ;============================================================================ ; ; CONDITIONAL ASSEMBLY FLAGS ; ;žÿÉNNNNNNNNNNNNNNNNN¡¡¡þ )R,NNNNNNNNNNNNNNNNNNNNNN¡¡¡û****************************************************************** ; ; CONFIGURATION: ; ; CPM ; DRIVE USAGE IF BOOT = 1ÔPÿäNNNNNNNNNNNNNNNNN¡¡¡þ /øŠ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~þrNNNNNNNNNNNNNNNN¡¡¡þ DôNNNNNNNNNNNNNNNNNNNNNN¡¡¡û) ENDIF LIST OFF ENDM ; ; RESERVE THE DATA SPACE ; DD DL 1 REPT NDRVS LIST OFF ALLDAL 0123456789ABCDEF DD DçÿÂNNNNNNNNNNNNNNNN¡¡¡þ «?NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS) ; INT(((#_TRACKS - OFF) * SPT * BYTES PER SECTOR) / CLUSTER SIZE) -1 DPBDRM DS 2 ;DRM- DIRECTORY SIZE -1 DPBAL0 DS 2 ;AL¡ÔÿÂNNNNNNNNNNNNNNNN¡¡¡þ ‹CNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRE IMPLIMENTED BY USING THE FOLLOWING DATA. ; (HEAD BITS ARE INCLUDED IN SECTOR WORD UPPER BITS) ; DPBSOF DS 2 ;SOF- SECTORc»ÿdNNNNNNNNNNNNNNNNN¡¡¡þ dˆNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û################################# ; IOPB: REPT PB_SIZE LIST OFF DB 0 LIST ON ENDM ;##############################GÿœNNNNNNNNNNNNNNNNN¡¡¡þ Î.NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûZ DS 0 ENDM ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; MACRO TO DEFINE THE DRIVE~PÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ $$pNNNNNNNNNNNNNNNNNNNNNN¡¡¡û============================================================================ SHORT EQU FALSE ;SHORT BIOS (REMOVES UNESENTIAL C‘•ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ *NNNNNNNNNNNNNNNNNNNNNN¡¡¡û0H ;HARD DISK BOOT CONFIG. ; A SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; B SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 0 ; Sÿ“NNNNNNNNNNNNNNNNN¡¡¡þ 0ëÇNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û 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 ; ,ÃÿÈNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÈNNNNNþ€Í�›‚hƒ6„…Ñ…Ÿ†m‡;ˆ‰Õ‰¢Šp‹>Œ �Ù�¨Žv�D�‘ᑯ’}“K”•敳–�—O˜™ë™¹š‡›Uœ#�ñ�¾žŒŸZ (¡õ¡Ã¢‘£^¤,¥ù¥Ç¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ êSNNNNNNNNNNNNNNNNNNNNNN¡¡¡û G JADE 8" FLOPPY PHYSICAL DRIVE 0 ; H JADE 8" FLOPPY PHYSICAL DRIVE 1 ENDIF ; ;***************************************ŒeÿÈNNNNNNNNNNNNNNNNN¡¡¡þ @õNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûdid not specify the logon track. ; 3.02 7 JUL 88 GRH ; Add '?' to include file names. ; Change hard disk system tracks direäTþrNNNNNNNNNNNNNNNN¡¡¡þ  ¯>NNNNNNNNNNNNNNNNNNNNNN¡¡¡û GRH ; Modify for Ver. 1.22 Monitor. ; Fix bug in 8" Hard Disk table which benignly (at current level) ; caused the drive tÀ¼ÿœNNNNNNNNNNNNNNNN¡¡¡þ �BNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûsing in IX redundancy. ; Change DPB track-head shift factor to Sector Offset like track ; offset. Disk partitioning will add ¼°ÿ„NNNNNNNNNNNNNNNN¡¡¡þ `‰NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û00.DEF ; ;============================================================================ ; LIST OFF *INCLUDE JDDCONT3.DEF îþHNNNNNNNNNNNNNNNNN¡¡¡þ Ê/NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCATIONS ; PAGE0: EQU 0 ;START OF CP/M RAM IOBYTE: EQU PAGE0 + 3 ;IOBYTE ADDR DEFDRV: EQU PAGE0 + 4 ;DEFAULT DRIVE PARAM ADDwÿdNNNNNNNNNNNNNNNN¡¡¡þ % qNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûISK BOOT DATA ; STHD EQU 0 ;START LOGICAL DRIVE OF HARD DISK NDHD EQU 3 ;LAST LOGICAL DRIVE OF HARD DISK ST8FD EQU 4 ;STAtÔþNNNNNNNNNNNNNNNNNN¡¡¡þ +~NNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@ ; ; GENERATE THE TRANSLATION TABLE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ‘ þNNNNNNNNNNNNNNNNNN¡¡¡þ ¿NNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************** ; ; REVISION HISTORY: ; ; 3.00 - 26 JAN 87 GRH ; Implemented new common IOPB code & Jade floppy -ŸÿÈNNNNNNNNNNNNNNNNN¡¡¡þ PËNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûctory reference to new format. ; Correct bug in drivers which caused retry to fail. (sector remained ; corrupted) ; Stubbed“ÆÿçNNNNNNNNNNNNNNNN¡¡¡þ úmNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûable to have bad data (default table was missing ; the 2 deblocking extension bytes). ; Implement data xfer inhibit schemes wdàÿdNNNNNNNNNNNNNNNN¡¡¡þ ÕNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûthis value to sector word. It ; will be stored in the ID sector data to be dynamic. ; ; 3.10 5-20-91 GRH ; Change LOGON tžÁÿòNNNNNNNNNNNNNNNN¡¡¡þ 5ÚNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û *INCLUDE COMIOPB3.DEF *INCLUDE DISKS3.DEF *INCLUDE BDIR.DEF *INCLUDE ISHA.DEF *INCLUDE B:M5ZF200.DEF LýÿäNNNNNNNNNNNNNNNNN¡¡¡þ  ß„NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR BDOSJV EQU PAGE0 + 5 ;BDOS SYSTEM CALL ENTRY THIS_STK EQU PAGE0 + 1CH ;CURRENT STACK FRAME PTR DK_BDRV EQU 0041H ;BOOT DRIµðþNNNNNNNNNNNNNNNNNN¡¡¡þ &u"NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRT LOGICAL DRIVE OF 8" FLOPPY ND8FD EQU 5 ;LAST LOGICAL DRIVE OF 8" FLOPPY ENDIF IF BOOT = 3 ; ; 8" FLOPPY BOOT DAG ÿ9NNNNNNNNNNNNNNNN¡¡¡þ ,šéNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û ; GXLATE MACRO #SECTORS, #SKEW LIST OFF NXTSEC DL 1 ;;START WITH SECTOR 1 LOWEST DL 1 ;; REPT #SECTORS LIST ON DB J|ÿdNNNNNNNNNNNNNNNN¡¡¡þ Œ1NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûfirmware support. ; Implemented disk drive driver tables and new function to return ; a ptr to a drive table. ; Removed init¥!þNNNNNNNNNNNNNNNNNN¡¡¡þ  cúNNNNNNNNNNNNNNNNNNNNNN¡¡¡û out new Clock routines for present. ; 3.03 31 JUL 88 GRH ; Unstub Clock routines. ; 3.04 6 AUG 88 GRH ; Remove floppy sÉÿÈNNNNNNNNNNNNNNNNN¡¡¡þ É\NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûith PB_FLG & PB_BCNT. ; Add pick-up of THIS_BNK data in all iopb cases. ; Remove clock buffer set/read system calls. ; 12-5-9߉ÿùNNNNNNNNNNNNNNNN¡¡¡þ %äNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûo attempt to recover from old disks better, using ; DCM8301 version controller firmware. ; ; 3.11 9-2-91 GRH ; Add redlinÇâÿÎNNNNNNNNNNNNNNNNN¡¡¡þ ëNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIST ON ;============================================================================ ; ; DISK OPERATING SYSTEM ADDRESSEWÍþNNNNNNNNNNNNNNNNNN¡¡¡þ !ìµNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûVE # FROM PROM DEFBFR EQU PAGE0 + 80H ;DEFAULT BUFFER ; ; BIOS FUNCTION CALL RESTART VECTOR ; BFUNRST EQU 28H BFUNRSV EQ‰+þNNNNNNNNNNNNNNNNNN¡¡¡þ 'FNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûTA ; STHD EQU 2 ;START LOGICAL DRIVE OF HARD DISK NDHD EQU 5 ;LAST LOGICAL DRIVE OF HARD DISK ST8FD EQU 0 ;START LOGICAL ÂþHNNNNNNNNNNNNNNNN¡¡¡þ -©ØNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNXTSEC LIST OFF NXTSEC DL NXTSEC + #SKEW ;ADD SKEW FACTOR ;; IF NXTSEC > #SECTORS ;CHECK FOR OVERFLOW NXTSEC DL NXTSEC Ÿÿ„NNNNNNNNNNNNNNNN¡¡¡þ ¦NNNNNNNNNNNNNNNNNNNNNN¡¡¡û of IOBYTE. ; Implemented 5" floppy driver. ; Implemented use of ROM primitives. ; Moved system down to 60k. ; 3.01 26 JUN [WÿœNNNNNNNNNNNNNNNN¡¡¡þ  6©NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûide select from BIOS & move to controller. ; Implement new ID sector format. ; Implement CP/M 3.0 DPB structure in preparationó_ÿòNNNNNNNNNNNNNNNNN¡¡¡þ ÚNNNNNNNNNNNNNNNNNNNNNN¡¡¡û0 GRH ; Remove IX IOPB ptr passing to disk drivers. ; 1-13-91 GRH ; Fix bug which corrupted PB_FLG. ; 3.08 2-22-91 GRH Rðþ9NNNNNNNNNNNNNNNN¡¡¡þ p·NNNNNNNNNNNNNNNNNNNNN!à¡¡¡ûes & change for M5ZMON v.2.00. ; VERSN EQU 311 ; ;**************************************************************************øxÿ�NNNNNNNNNNNNNNNNN¡¡¡þ Ÿ|NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS ; ;============================================================================ ; NKSYS: EQU 60 ;SYSTEM SIZE IN K BYTES PYÿòNNNNNNNNNNNNNNNN¡¡¡þ "¹æNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûU PAGE0 + BFUNRST BFUNRSI EQU 0C7H + BFUNRST ; TPA: EQU 100H ;==========================================================ï’ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ (V-NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDRIVE OF 8" FLOPPY ND8FD EQU 1 ;LAST LOGICAL DRIVE OF 8" FLOPPY ENDIF ;==============================================ØkÿáNNNNNNNNNNNNNNNN¡¡¡þ .ü‹NNNNNNNNNNNNNNNNNNNNNN¡¡¡û- #SECTORS ;; IF NXTSEC <= LOWEST ;CHECK FOR REPEAT NXTSEC DL LOWEST + 1 LOWEST DL NXTSEC ENDIF ENDIF ;; ENDM äþ$NNNNNNNNNNNNNNNNN¡¡¡þ &—NNNNNNNNNNNNNNNNNNNNNN¡¡¡û88 GRH ; Remove 5" floppy support. Implement in CP/M-86 BIOS. ; Change single function to return drive table ptr into a BIOS f»àÿHNNNNNNNNNNNNNNNNN¡¡¡þ  ˜NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û for deblocking. ; 3.05 11-3-88 GRH ; Change included data to update IOPB.PBSTAT to new configuration. ; 3.06 1-28-89 GRH9øÿäNNNNNNNNNNNNNNNNN¡¡¡þ é NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; Remove references to THIS_BNK & use monitor function #7 instead. ; Add track-head shift factor to DPBs for future use. ; 3.’ÔÿùNNNNNNNNNNNNNNNN¡¡¡þ C†NNNNNNNNNNNNNNNNNNNNNNÿ€¡¡¡û** SUBTTL SYSTEM DECLARATIONS ;============================================================================ ; ; INCLUDE^cÿdNNNNNNNNNNNNNNNN¡¡¡þ ¬MNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûKBYTE: EQU 1024 CPMSZ: EQU KBYTE * NKSYS CPMBS: EQU CPMSZ - (20 * KBYTE) ; CP/M BIAS VALUE CCP: EQU CPMBS + 3400H ;ADDR OF CC5EÿÂNNNNNNNNNNNNNNNN¡¡¡þ #Š×NNNNNNNNNNNNNNNNNNNNNN¡¡¡û================== ; ; OTHER DECLARATIONS ; ;============================================================================ ;ð�ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ )eNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û============================== ; ; ASCII CHARS ; ;==========================================================================l ÿ­NNNNNNNNNNNNNNNNN¡¡¡þ /ϺNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û LIST ON ENDM ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; INITIALIZE VERSION TEX–$þNNNNNNNNNNNNNNNN¡¡¡þ sÄNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûunction ; call using restart instruction. ; Change LOGON to specify the ID sector & track. At same time, fix bug ; which `lÿÂNNNNNNNNNNNNNNNN¡¡¡þ  œNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; Revised primitive calling procedures to use the monitor rom function ; rather than swapping Roms itself. ; 3.07 11-25-90 bñÿÂNNNNNNNNNNNNNNNN¡¡¡þ ¼sNNNNNNNNNNNNNNNNNNNNNN¡¡¡û09 5-15-91 GRH ; Change 8" floppy side select to track bit 0. Move calculation from ; DCM8 to CBIOS. ; Remove IOPB ptr paskÇÿòNNNNNNNNNNNNNNNNN¡¡¡þ S¸NNNNNNNNNNNNNNNNNNNNNN¡¡¡û JDDCONT3.DEF ; INCLUDE COMIOPB3.DEF ; INCLUDE DISKS3.DEF ; INCLUDE BDIR.DEF ; INCLUDE ISHA.DEF ; INCLUDE B:M5ZF2­þBNNNNNNNNNNNNNNNN¡¡¡þ ùNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûP BDOS: EQU CPMBS + 3C00H ;ADDRESS OF BDOS BIOS: EQU CPMBS + 4A00H ;ADDRESS OF BDOS BIOSR: EQU 1000H - BIOS ; ; PAGE 0 LOÖÖÿçNNNNNNNNNNNNNNNNN¡¡¡þ $@NNNNNNNNNNNNNNNNNNNNNN¡¡¡û MR_RNUM EQU 0 ;INTERIM DEFINITION FOR INTERRUPT ROM SWAP ; SECSZ: EQU 128 NDRVS: EQU 6 IF BOOT = 10H ; ; 8" HARD D]fÿáNNNNNNNNNNNNNNNN¡¡¡þ *0ONNNNNNNNNNNNNNNNNNNNNN¡¡¡û== ; LF: EQU 0AH CR: EQU 0DH CTRLZ: EQU 1AH ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@9�ÿ“NNNNNNNNNNNNNNNNN¡¡¡þ 0Ü÷NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT IN RAM MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; PVERS MACRO #VERS DD DL #VÑ^ÿÉNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÎNNNNNNNN�Ï�œ‚jƒ7„…Ò… †m‡<ˆ ‰×‰¤Šr‹?Œ �Ù�¨Žv�D�‘à‘¯’}“K”•æ•´–‚—O˜™ê™¸š†›Tœ!�ï�½žŒŸZ '¡ô¡Á¢�£\¤*¥÷¥Å¦ÎNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ!«×NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûERS IF DD > 9999 DB (DD / 10000) + '0' DD DL DD % 10000 ENDIF IF DD > 999 DB (DD / 1000) + '0' DD DL DD % 1000ÓÝÿÉNNNNNNNNNNNNNNNNN¡¡¡þ!qNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTDMA ;SET TRANSFER ADDR JP DISKRD ;PERFORM DISK READ JP DISKWR ;PERFORM DISK WRITE JP LISTST ;RETURN LIST STATUS JP Ò:ÿrNNNNNNNNNNNNNNNN¡¡¡þ! îºNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûINIT ; INIT1: JR INIT ;############################################################################ ; ; DIRECTORY SECTOþÌþBNNNNNNNNNNNNNNNN¡¡¡þ!ÎÆNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û A,(DK_BDRV) ;USE DRIVE # PASSED IN PAGE 0 AND A,3 LD (DEFDRV),A ; ; SEND SYSTEM SIGN-ON ; CLOGO: LD HL,MSGSO CALL Ev¦ÿNNNNNNNNNNNNNNNN¡¡¡þ!! NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûBUFFER TO 1 SECTOR SIZE ENDIF ;---------------------------------------------------------- ; ; WARM REBOOT ENTRY LOADSÁ^ÿäNNNNNNNNNNNNNNNNN¡¡¡þ!‹«NNNNNNNNNNNNNNNNNNNNNN¡¡¡û) CP A,86H JR C,WEROR ; ; SET UP TO LOAD CCP/BDOS ; LD HL,(DEFBFR + BD_SBDSS) ;PREFETCH BDOS TRK/SECTOR PUSH HL ; ÏÿòNNNNNNNNNNNNNNNN¡¡¡þ!%aõNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûJP C,WREAD ; ; ELSE DONE READING SYSTEM ; JP WZRPG ; ; ; ELSE SET UP & READ BDOS ; RDBDOS: POP HL ;RESTORE BDOS T‚vþNNNNNNNNNNNNNNNNNN¡¡¡þ!+BúNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; IF INTCPTS ; ; PUT BDOS VECTOR INTO INTERCEPT CODE ; LD HL,(BDOS + 7) LD (BDOSV),HL ; ; NOW PUT INTERCEPT VECä8þBNNNNNNNNNNNNNNNN¡¡¡þ!þ„NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ENDIF DB (DD / 100) + '0' DB '.' DB ((DD % 100) / 10) + '0' DB (DD % 10) + '0' ENDM SUBTTL BIOS CODE ORG Ö³þNNNNNNNNNNNNNNNNNN¡¡¡þ!ONNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSECTRN ;TRANSLATE SECTOR JP BIOFUNC ;EXECUTE FUNCTION CALL ;###########################################################…hþNNNNNNNNNNNNNNNNN¡¡¡þ!»éNNNNNNNNNNNNNNNNNNNNNNð¡¡¡ûR BUFFER STARTS HERE AFTER CRUNCHING COLD START ; CODE. THIS BUFFER IS USED BY THE CP/M DIRECTORY CHECK ROUTINES THAT ; CHEC~tÿNNNNNNNNNNNNNNNN¡¡¡þ!WQNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDITOR ; ; MODIFY COLD START VECTOR TO WARM START ; LD HL,(BIOS+4) LD (BIOS+1),HL ; ; BOOT CCP & BDOS ; JR WARM æâÿ²NNNNNNNNNNNNNNNN¡¡¡þ!t^NNNNNNNNNNNNNNNNNNNNNN¡¡¡û CCP,BDOS FROM DISK & ; SETS UP VARIABLES ; ;---------------------------------------------------------- ; WARM: ; ; SETWŠÿrNNNNNNNNNNNNNNNNN¡¡¡þ! žNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD HL,(DEFBFR + BD_SCCPS) ;FETCH CCP TRK/SECTOR LD C,L LD B,0 CALL SETSEC ; LD C,H CALL SETTRK ; LD BC,CCP CAL©ÿNNNNNNNNNNNNNNNN¡¡¡þ!&4¦NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRK/SECTOR FROM DIRECTORY LD C,L LD B,A ;A STILL CONTAINS 0 CALL SETSEC ; LD C,H CALL SETTRK ; JR WREAD ; ; ; ©WÿÂNNNNNNNNNNNNNNNN¡¡¡þ!,ÛmNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûTOR INTO BDOS CODE ; LD HL,INTCPT LD (BDOS + 7),HL ; ; INITIALIZE CLOCK VECTORS IF CLOCK INSTALLED ; LD A,MF_CSYN ;T�—ÿäNNNNNNNNNNNNNNNN¡¡¡þ!͵NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBIOS ;---------------------------------------------------------------------------- ; ; BIOS JUMP VECTOR TABLE ; ;--------QÿgNNNNNNNNNNNNNNNNN¡¡¡þ! "~NNNNNNNNNNNNNNNNNNNNNN¡¡¡û################# ; ; THE FOLLOWING BOOT DATA MUST RESIDE AS DEFINED RIGHT BEFORE THE COLD ; INIT ROUTINE START AND MUST BE Iõ½ÿÒNNNNNNNNNNNNNNNNN¡¡¡þ!ˆØNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûK FOR DISK CHANGE. ; ;############################################################################ ; DIRBF: EQU $ ;BUFFER B»ÿùNNNNNNNNNNNNNNNN¡¡¡þ!d`NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;############################################################################ ; ; SIGN-ON MESSAGE ; ;###################›ÊÿÂNNNNNNNNNNNNNNNN¡¡¡þ!GoNNNNNNNNNNNNNNNNNNNNNN¡¡¡û TEMPORARY STACK ; DI LD SP,DEFBFR LD (THIS_STK),SP EI ; ; LOG ON DRIVE TO INIT TABLES ; LD A,(DK_BDRV) AND A,>´þBNNNNNNNNNNNNNNNN¡¡¡þ!!­1NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL SETDMA ; ; READ CCP/BDOS ; WREAD: CALL DISKRD JR NZ,WEROR ;IF ERROR THEN EXIT ; ; NEXT SECTOR ; LD HL,BTSEC I7lÿÎNNNNNNNNNNNNNNNNN¡¡¡þ!'—NNNNNNNNNNNNNNNNNNNNNN¡¡¡û WARM BOOT ERROR, OUTPUT MSG & HALT ; WEROR: LD HL,MSGLE ;OUTPUT ERROR MESSAGE CALL EDITOR HALT ; ; ; BOOT OK, INIT P~<ÿ“NNNNNNNNNNNNNNNN¡¡¡þ!-è\NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEST FOR BOARD PRESENT CALL XMROM ; ; IF CLOCK PRESENT THEN TURN ON CLOCK DRIVE ; OR A,A LD A,38H ;COND. JR (ON) JRýÿ9NNNNNNNNNNNNNNNN¡¡¡þ!T"NNNNNNNNNNNNNNNNNNNNNN¡¡¡û-------------------------------------------------------------------- ; JP INIT1 ;COLD START ENTRY JP WARM ;RELOAD CCP/BDOZçÿÂNNNNNNNNNNNNNNNN¡¡¡þ! w-NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûN THE 1ST SECTOR. THESE 2 WORDS ARE ; REFERENCED BY THE BOOT LOADER CODE IN ORDER TO DETERMINE THE LOAD ADDRESS ; AND LENGTH Oö\ÿäNNNNNNNNNNNNNNNNN¡¡¡þ!›•NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEGINNING ;---------------------------------------------------------------------------- ; ; INIT - COLD START ENTRY FR<ÿrNNNNNNNNNNNNNNNN¡¡¡þ!13NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û######################################################### ; MSGSO: DB CR,LF DB CPMSZ / (KBYTE * 10) + '0' DB (CPMSZ MOD (KˆÙÿÉNNNNNNNNNNNNNNNNN¡¡¡þ!ÞøNNNNNNNNNNNNNNNNNNNNNN¡¡¡û3 ;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 ;m³ÿBNNNNNNNNNNNNNNNN¡¡¡þ!"øbNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûNC (HL) ; LD DE,(IOPB + PB_BCNTO) ;SECSZ ;DMA := DMA + SECTOR SIZE LD HL,(BTDMA) ADD HL,DE LD (BTDMA),HL ; ; IF NOT7ºÿdNNNNNNNNNNNNNNNNN¡¡¡þ!(©NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAGE 0 ; WZRPG: ; ; INIT BIOS WARM START IN PAGE 0 ; LD A,0C3H LD HL,BIOS + 3 LD (PAGE0),A LD (PAGE0 + 1),HL ; ;ÿNNNNNNNNNNNNNNNN¡¡¡þ!.½NNNNNNNNNNNNNNNNNNNNN!ö¡¡¡û Z,CLKON ; ; ELSE TURN OFF CLOCK DRIVE ; LD A,18H ;UNCOND. JR (OFF) (CAUSES JUMP TO ILLEGAL) ; CLKON: LD (INHCLK),A ;„FÿçNNNNNNNNNNNNNNNNN¡¡¡þ!gNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS JP CNSCK ;GET CONSOLE STATUS JP CI ;CONSOLE INPUT JP COC ;CONSOLE OUTPUT JP LO ;PRINTER OUTPUT JP PUNCH JP REAHEÿHNNNNNNNNNNNNNNNNN¡¡¡þ! DNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûF THE BIOS. ; ;############################################################################ ; DB 0 ;Z80 CPU DB 0 ;SPAREâùÿdNNNNNNNNNNNNNNNNN¡¡¡þ!¨¤NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûOM BOOT MUST SET ALL BIOS PARAMS ; ;---------------------------------------------------------------------------- ; INIT: ; ¶BÿùNNNNNNNNNNNNNNNN¡¡¡þ!NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBYTE * 10)) / KBYTE + '0' DB 'K CP/M-80 Vers 2.2',CR,LF DB 'M5b CBIOS Vers ' PVERS VERSN DM CR,LF IF $ > (DIÈ0ÿNNNNNNNNNNNNNNNN¡¡¡þ!íÉNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD BC,DEFBFR ;SET XFER ADDRESS (USE DEFAULT BUFFER) CALL SETDMA ; LD BC,BD_SEC ;SET DIRECTORY SECTOR CALL SETSEC ; T{þrNNNNNNNNNNNNNNNN¡¡¡þ!#ËSNNNNNNNNNNNNNNNNNNNNNN¡¡¡û INTO BDOS THEN READ NEXT SECTOR ; LD DE,BDOS XOR A,A SBC HL,DE JR C,WREAD ; ; ELSE IF AT BEGINNING OF BDOS THEN SEá“ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ!)$˜NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û INIT BDOS CALL VECTOR IN PAGE 0 ; LD HL,BDOS + 6 LD (BDOSJV),A LD (BDOSJV + 1),HL ; ; INIT BIOS CALL VECTOR IN PAGj.ÿ$NNNNNNNNNNNNNNNNN¡¡¡þ!/Ž>NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ENDIF ; ; PASS DEFAULT DISK TO CCP ; LD A,(DEFDRV) LD C,A JP CCP SUBTTL BIOS DISK FUNCTION ROUTINES ;+++++Ò«ÿòNNNNNNNNNNNNNNNN¡¡¡þ!2@NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDER JP HOME ;HOME SELECTED DRIVE JP SELDSK ;SELECT DISK DRIVE JP SETTRK ;SET TRACK # JP SETSEC ;SET SECTOR # JP SEöOÿ!NNNNNNNNNNNNNNNN¡¡¡þ! Ý‹NNNNNNNNNNNNNNNNNNNNNN¡¡¡û BIOSSZ: DW BIOSND - BIOS ;BIOS MODULE SIZE IN BYTES BIOSST: DW BIOS ;BIOS MODULE LOAD ADDR FOR SBD ; ; CONTINUE ON WITH .¸ÿáNNNNNNNNNNNNNNNN¡¡¡þ!ý÷NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; SET TEMPORARY STACK ; DI LD SP,DEFBFR ;USE PAGE 0 FOR STACK LD (THIS_STK),SP EI ; ; INIT DEFAULT DRIVE ; LDëþrNNNNNNNNNNNNNNNNN¡¡¡þ! 0 CP A,STHD JR C,LGCKFD ENDIF CP A,NDHD + 1 JR NC,“,ÿäNNNNNNNNNNNNNNNNN¡¡¡þ! ©0NNNNNNNNNNNNNNNNNNNNNN¡¡¡û* ; ; SET TRACK # ; ENTRY- BC= TRACK # ; ;**************************************************************************** ; À ÿ�NNNNNNNNNNNNNNNNN¡¡¡þ!&–NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++ ; ; SECTOR TRANSLATION FUNCTION ; ENTRY- DE= 0: NO XLATE, ELSE PTR TO XLATE TABLE ; BC= SƒvÿÂNNNNNNNNNNNNNNNN¡¡¡þ!,ì]NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; LOGON DISK FUNCTION ; EXIT - A= 0: OK; /0: ERROR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++¹×ÿNNNNNNNNNNNNNNNN¡¡¡þ!ú…NNNNNNNNNNNNNNNNNNNNNN¡¡¡û PASS READ COMMAND ; LD A,PB_READC ;SELECT READ OP JP DISKOP ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++2½ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ! NNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; SELDSK: ; ; ASSUME ERROR ; LD HL,0 ; ; —âÿ“NNNNNNNNNNNNNNNNN¡¡¡þ!¿èNNNNNNNNNNNNNNNNNNNNNN¡¡¡û IF NOT FIRST SELECT OR LOGON INHIBITED THEN RETURN TABLE PTR ; LD A,(LOGRQ) OR A,C CPL AND A,1 RET Z ; ; ELSE (Öÿ9NNNNNNNNNNNNNNNN¡¡¡þ!SPNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFER ID SECTOR DATA TO TABLES ; IDOK: CALL TRNONE ;ASSUME NO TRANSLATION ; ; IF HARD DISK OR DOUBLE DENSITY THEN NO TRANSLÉ~ÿ!NNNNNNNNNNNNNNNN¡¡¡þ!p_NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLGCKFD ; ; ELSE USE HARD DISK DEFAULTS ; CALL TRNONE ; NO XLATE LD HL,HDPBK ; ; XFER DATA TO TABLES ; SEL2: PUSuÿBNNNNNNNNNNNNNNNN¡¡¡þ!!šNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSETTRK: LD (BTTRK),BC RET ;**************************************************************************** ; ; SET SECTO™ ÿNNNNNNNNNNNNNNNNNN¡¡¡þ!'0§NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûECTOR # TO XLATE ; EXIT - HL= XLATED SECTOR OR BC + 1 ; BC= UNCHANGED ; A, DE= ? ; ;+++++++++++++++++++++++++++++++++++++NÇþHNNNNNNNNNNNNNNNN¡¡¡þ!-ßlNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++ ; DISKLOG: ; ; SET DESCRIPTOR SECTOR XFER ADDRESS TO DEFAULT BUFFER ; LD HL,DEFBFR LD (IOPB + PB_DMAO),HL C1˜ÿùNNNNNNNNNNNNNNNN¡¡¡þ!cNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++ ; ; WRITE A DISK SECTOR ; EXIT - A= 0: OK; /0: ERROR ; ;+++++++++++++++++++++++++++++++++++++++++++++íÞÿNNNNNNNNNNNNNNNN¡¡¡þ! @NNNNNNNNNNNNNNNNNNNNNN¡¡¡û IF UNSUPPORTED DRIVE REQUESTED THEN RETURN 0 (ERROR) ; LD A,C CP A,NDRVS RET NC ; ; STORE DRIVE # FOR FUTURE USE ; 3¿ÿòNNNNNNNNNNNNNNNNN¡¡¡þ!¬¥NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLOG ON DRIVE ; LD (DTPTR),HL ;SAVE DRIVE TABLE PTR ; ; ATTEMPT TO READ ID SECTOR ; XOR A,A ;INIT FLAG BYTE UNTIL FIRMÁ_ÿÂNNNNNNNNNNNNNNNN¡¡¡þ!NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûATION ; LD A,(DEFBFR + ID_FLGO) AND A,[1 SHL DF_DTDB] OR [1 SHL DF_HARDB] ; ; ELSE SET TRANSLATION ; CALL Z,TR8 ; ÂïÿÈNNNNNNNNNNNNNNNNN¡¡¡þ!éÈNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûH HL CALL DPBAD ; USE DEFAULT TABLE POP HL LD BC,DPBSZ LDIR JR SEL1 ; ; ; USE 8" FLOPPY DEFAULTS ; LGCKFD: CA£ÿrNNNNNNNNNNNNNNNN¡¡¡þ!"ÏRNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR ; ENTRY- BC= SECTOR # ; ;**************************************************************************** ; SETSEC: LD (BTS*ÿINNNNNNNNNNNNNNNNN¡¡¡þ!( ™NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++ ; SECTRN: ; ; IF NO TRANSLATION THEN RETURN SECTOR++ ; LD A,D ;IF TABLE ADDR = j´ÿáNNNNNNNNNNNNNNNN¡¡¡þ!.Š?NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûALL GETBNK LD (IOPB + PB_DMAXO),A ; ; SET DESCRIPTOR SECTOR SECTOR ; LD HL,ID_SECT LD (IOPB + PB_SECO),HL ; ; SETí ÿçNNNNNNNNNNNNNNNNN¡¡¡þ!P#NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++ ; DISKWR: ; ; DISABLE UPLOAD (READ DATA) ; LD A,1 SHL PB_INHX LD (BTFLG),A ; ; ENþÏþHNNNNNNNNNNNNNNNNN¡¡¡þ! s,NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD (BTDRV),A ; ; SAVE LOGON REQUEST FLAG ; LD A,E LD (LOGRQ),A ; ; COMPUTE DISK DRIVER TABLE PTR ; CALL RETDVR»ýÿINNNNNNNNNNNNNNNNN¡¡¡þ!Ÿ”NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûWARE REVISED LD (IOPB + PB_ST2O),A ; CALL DISKLOG JP NZ,FDSKER ; ; IF NO ID SECTOR THEN USE DEFAULT DPB ; (NOTE: CON„jþdNNNNNNNNNNNNNNNN¡¡¡þ!52NNNNNNNNNNNNNNNNNNNNNNð¡¡¡û; XFER DISK DATA TO DPB ; NOX: CALL DPBAD ;GET ADDR OF DPB LD HL,DEFBFR + ID_SPTO LD BC,DPBSZ LDIR ; ; XFER DISKÑÿINNNNNNNNNNNNNNNN¡¡¡þ!ÚùNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLL TR8 LD HL,SD8PBK JR SEL2 ;**************************************************************************** ; ; HOME s‘ÿNNNNNNNNNNNNNNNN¡¡¡þ!#ücNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûEC),BC RET ;**************************************************************************** ; ; SET TRANSFER ADDR ; ENTRY4’ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ!)¨NNNNNNNNNNNNNNNNNNNNNN¡¡¡û0 THEN NO TRANSLATION OR A,E JP Z,NOTRAN ; ; ELSE CALCULATE NEW SECTOR FROM TABLE ; EX DE,HL ADD HL,BC LD L,(HL) •¥ÿ NNNNNNNNNNNNNNNNN¡¡¡þ!/¹NNNNNNNNNNNNNNNNNNNNNN¡¡¡û DESCRIPTOR SECTOR TRACK ; LD L,H ;H == 0 FROM LAST OPERATION (HL= 0) LD (IOPB + PB_TRKO),HL ; ; ENABLE UPLOAD ; LDÿ›ÿòNNNNNNNNNNNNNNNN¡¡¡þ!pNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûABLE DOWNLOAD (WRITE DATA) ; LD HL,SECSZ LD (IOPB + PB_BCNTO),HL ; ; PASS WRITE COMMAND ; LD A,PB_WRITC ;SELECT WRIT,ùÿÂNNNNNNNNNNNNNNNN¡¡¡þ! ê»NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûT ;DRIVE IS STILL IN C REGISTER LD (DVRTPTR),HL ; ; PREFETCH DRIVER EXECUTION ADDRESS FROM TABLE ; LD E,(HL) ;STORE AdDÿÎNNNNNNNNNNNNNNNNN¡¡¡þ!ÊÇNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTROLLER HAS SET IT'S DISK DEFAULTS IN DEFBFR IN ALL CASES) ; LD A,(IOPB + PB_ST2O) CP A,-1 ;-1:NONE, 0:JADE, 1:DESCRIPTOR,eFÿòNNNNNNNNNNNNNNNNN¡¡¡þ!% NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û PHYSICAL DATA TO TABLE ; LD HL,DEFBFR + ID_FLGO ; SEL1: PUSH HL LD HL,(DVRTPTR) LD DE,DVRFLG ADD HL,DE EX DE,HL &ªÿÂNNNNNNNNNNNNNNNN¡¡¡þ!�ªNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDRIVE - TREAT AS SEEK TRK 0 ; EXIT - BC= 0 ; ;**************************************************************************** ;:@ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ!$eôNNNNNNNNNNNNNNNNNNNNNN¡¡¡û- BC= ADDRESS ; EXIT - A= ? ; ;**************************************************************************** ; SETDMA: LD (BhbþBNNNNNNNNNNNNNNNN¡¡¡þ!*FûNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û ; LD H,0 RET ; ; ; CONVERT FROM CP/M'S LOGICAL SECTOR {0..N-1} TO PHYSICAL SECTOR {1..N} ; NOTRAN: LD HL,1 ADD ‚xÿçNNNNNNNNNNNNNNNNN¡¡¡þ!0ªCNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û A,L ;L= 0 LD (IOPB + PB_FLGO),A ; ; DISABLE DOWNLOAD ; LD (IOPB + PB_BCNTO),HL ; ; PASS COMMAND TO EXECUTOR ; ‚¦ÿÈNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÎNNNNNNNN�Ï�œ‚iƒ7„…Ó…¡†n‡=ˆ ‰Ø‰¥Šs‹@Œ �Ú�©Žw�D�‘Þ‘¬’y“F”•á•®–|—I˜™ä™³š�›Oœ�é�¶ž…ŸS !¡î¡»¢‰£V¤$¥ò¥À¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ"0 NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLD A,PB_LOGC JR DISKOP2 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; COMMON DISK IûÈÿÉNNNNNNNNNNNNNNNNN¡¡¡þ"š­NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIF NO_ERROR THEN RETURN ; ; PRINT ERROR ; CALL GETBNK ;SETUP BANK FOR FUTURE COMPATABILITY LD E,A LD HL,IOPB LD A,mçÿòNNNNNNNNNNNNNNNN¡¡¡þ" ufNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSELECT FUNCTION LD A,-1 ;RETURN -1 TO BDOS OR A,A RET ;*************************************************************ZÿþBNNNNNNNNNNNNNNNN¡¡¡þ"UNNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡û; RETURN DRIVE PARAMETER BLOCK ADDR FUNCTION ; EXIT - DE= DPB PTR ; HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++–RÿdNNNNNNNNNNNNNNNN¡¡¡þ"ºÑNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûIVE ; LD A,(BTDRV) ;IF EVEN THEN ADD 0 ELSE ADD 128 RRCA AND A,80H LD E,A ;COMPUTE SECTOR LD D,0 LD HL,(IOPB + PBšÿHNNNNNNNNNNNNNNNNN¡¡¡þ"wNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûITY LD A,MF_XIOB ;SET MONITOR FUNCTION # CALL XMROM ;EXECUTE THE FUNCTION ; OR A,A ;FUNCTION ERR? RET NZ ; ; RETUÅ”ÿÉNNNNNNNNNNNNNNNN¡¡¡þ"%ú)NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûO) PUSH HL ;SAVE FOR ERROR RESTORE ; LD A,(IOPB + PB_SECO +1) ;FETCH SIDE SELECT BYTE ADD A,A ;SHIFT OUT BIT 7 ; S‚<ÿNNNNNNNNNNNNNNNN¡¡¡þ"+Ù&NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++ ; BIOFUNC: ; ; IF FUNCTION # NOT IN TABLE THEN RETURN -1 ; LD A,C CP A,þþBNNNNNNNNNNNNNNNN¡¡¡þ"eXNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û/O CODE ; ENTRY- A= IOPB COMMAND ; EXIT - A= 0: OK; /0: ERROR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++~¬ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ"Š“NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûMF_DIOB ;USE DISPLAY IOPB DATA FUNCTION CALL XMROM ; ; QUERY USER FOR OPTION ; LD HL,DSKEB CALL EDITOR ; ; GET USmXÿHNNNNNNNNNNNNNNNN¡¡¡þ" 5NNNNNNNNNNNNNNNNNNNNNN¡¡¡û*************** ; ; SET 3740 SECTOR TRANSLATION PROCEDURE ; ENTRY- (DTPTR)= MUST BE PTR TO DTP ; EXIT - DE, HL= ? ; ;*****±ŽÿòNNNNNNNNNNNNNNNN¡¡¡þ"Ì�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++ ; DPBAD: LD HL,(DTPTR) ;FETCH BASE ADDR LD DE,10 ;ADD OFFSET OF DPB PTR ADD HL,DE LD E,(ýÈÿ9NNNNNNNNNNNNNNNN¡¡¡þ"ï‚NNNNNNNNNNNNNNNNNNNNNN¡¡¡û_SECO) ; PUSH HL ;SAVE SECTOR TO RESTORE LATER ; ADD HL,DE LD (IOPB + PB_SECO),HL ; ; EXECUTE IOPB ; CALL XPRIMS þrNNNNNNNNNNNNNNNNN¡¡¡þ" ÜNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûRN THE COMMAND RESULTS STATUS ; LD A,(IOPB + PB_STATO) OR A,A RET SUBTTL JADE FLOPPY DRIVER ROUTINES ;++++++++++++ÞnÿáNNNNNNNNNNNNNNNN¡¡¡þ"&¯zNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRL H ;SHIFT TRACK HIGH BYTE RR L ;ROTATE BIT 8 TO 7 AND 0 TO CF RRA ;ROTATE TRACK BIT 0 INTO SECTOR BIT 15 LD (IOPBŠ“ÿùNNNNNNNNNNNNNNNN¡¡¡þ",@±NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûMAXFUNCS LD A,-1 RET NC ; ; ELSE COMPUTE TABLE ENTRY ; PUSH HL ;SAVE POSSIBLE DATA ; LD HL,BFUNTBL LD A,C ADD‹´ÿdNNNNNNNNNNNNNNNN¡¡¡þ"ViNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++ ; DISKOP: ; ; SET UP IOPB ; LD HL,BTTRK LD DE,IOPB + PB_TRKO LD BC,PB_BCNTO - PB_TRKO LDIR ; $ÖþNNNNNNNNNNNNNNNNNN¡¡¡þ" ¹¢NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûER RESPONSE ; CALL CI ;GET USER RESPONSE ; PUSH AF ;SAVE CHAR LD C,A ;ECHO CHAR CALL COC POP AF ; AND A,5FH ;—7ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ"NNNNNNNNNNNNNNNNNNNNNN¡¡¡û*********************************************************************** ; TR8: TR3740: LD DE,SDTRAN ; SETTR: LD HL,(DTPTR) RÿòNNNNNNNNNNNNNNNN¡¡¡þ"ÿ¼NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHL) ;FETCH DPB PTR INC HL LD D,(HL) RET SUBTTL HARD DISK ROUTINES ;+++++++++++++++++++++++++++++++++++++++++++++++¢VþBNNNNNNNNNNNNNNNN¡¡¡þ"ܳNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; RESTORE SECTOR ; POP HL LD (IOPB + PB_SECO),HL ; ; DONE ; RET ;+++++++++++++++++++++++++++++++++++++¸6ÿœNNNNNNNNNNNNNNNN¡¡¡þ"!6íNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; JADE 8" FLOPPY DISK DRIVER FUNCTION ; ENTRY- IY= DRIVER IþHNNNNNNNNNNNNNNNNN¡¡¡þ"'œKNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û + PB_SECO +1),A ; LD (IOPB + PB_TRKO),HL ;STORE SHIFTED TRACK ; ; EXECUTE THE IOPB ; CALL XPRIM ; ; RESTORE THE MëÿÉNNNNNNNNNNNNNNNN¡¡¡þ"-s€NNNNNNNNNNNNNNNNNNNNNN¡¡¡û A,A ADD A,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 m1ÿ!NNNNNNNNNNNNNNNN¡¡¡þ"ÏþNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDISKOP2: LD (IOPB + PB_CMDO),A ; ; FETCH DRIVER VECTOR & EXECUTE DISK DRIVER ; DKOPLP: PUSH IY ;SAVE IY LD IY,(DVRTˆUÿáNNNNNNNNNNNNNNNN¡¡¡þ" ìñNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûINSURE UPPER CASE ; ; IF RETRY THEN RETURN TO CALLER ; CP A,'R' ;IF RETRY THEN RETURN TO CALLER JR Z,DKOPLP ; ; EL´Ôÿ NNNNNNNNNNNNNNNNN¡¡¡þ"INNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û LD (HL),E INC HL LD (HL),D RET ;**************************************************************************** ; ; ÚåÿòNNNNNNNNNNNNNNNN¡¡¡þ"ªïNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û+++++++++++++++++++++++++++++ ; ; HARD DISK DRIVER FUNCTION ; ENTRY- IY= DRIVER TABLE PTR ; EXIT - A= 0: OK; /0: ERROR ; ;ü/ÿNNNNNNNNNNNNNNNNN¡¡¡þ"E$NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û+++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE IOPB PRIMITIVE ; EXIT - A= 0: OK, /0: ERROR ; ;++++++++++++++++++++xqþrNNNNNNNNNNNNNNNN¡¡¡þ""c¾NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTABLE PTR ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; FDn)ÿ$NNNNNNNNNNNNNNNNN¡¡¡þ"(ŒuNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûODIFIED IOPB SO RETRY WILL WORK ; POP HL ;TRACK LD (IOPB + PB_TRKO),HL ; LD HL,IOPB + PB_SECO +1 ;CLEAR BIT 15 RES 7–ÿBNNNNNNNNNNNNNNNN¡¡¡þ".&ÓNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; EX (SP),HL ;PUT CALLER'S DATA IN HL, FUNCTION ADDR ON RET ; STACK, EXECUTE FUNCTION ADDRESS ON STACK ;############ Gÿ'NNNNNNNNNNNNNNNNN¡¡¡þ"üÏNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûPTR) ;FETCH TABLE BASE ; LD HL,DKOPRET ;PUT RETURN ADDRESS ON STACK PUSH HL ; LD HL,(DVRXADR) ;FETCH DRIVER ADDRESS PREF”ÿNNNNNNNNNNNNNNNNNN¡¡¡þ" ßÀNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSE IF ABORT THEN DO WARM BOOT ; CP A,'A' ;IF ABORT THEN RE-BOOT JP Z,0 ; ; ELSE IF IGNORE THEN RETURN NO ERROR ; SU„ ÿdNNNNNNNNNNNNNNNNN¡¡¡þ"3xNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSET NO SECTOR TRANSLATION PROCEDURE ; EXIT - HL, DE= ? ; ;*******************************************************************T³ÿâNNNNNNNNNNNNNNNN¡¡¡þ"™ÞNNNNNNNNNNNNNNNNNNNNNNð¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; HDEXEC: ; ; CONVERT LOGICAL DRIVE TO PHYSIC8„ÿrNNNNNNNNNNNNNNNN¡¡¡þ"vNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; XPRIM: ; ; SET BANK ADDRESS TO THIS BANK FOR NOW ; CALL GETB¼ùÿBNNNNNNNNNNNNNNNN¡¡¡þ"#P�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û8EXEC: ; ; CONVERT LOGICAL DRIVE TO PHYSICAL DRIVE ; LD A,(IY + DVRPDRV) LD (IOPB + PB_DRVO),A ; ; IF HEADS == 1 THgÉÿíNNNNNNNNNNNNNNNNN¡¡¡þ")¿DNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û,(HL) ; ; DONE ; RET SUBTTL BIOS FUNCTION CALLS ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++µÿINNNNNNNNNNNNNNNNN¡¡¡þ"/âNNNNNNNNNNNNNNNNNNNNNN¡¡¡û################################################################ ; ; BIOS FUNCTION TABLE ; ;################################ÔfÿòNNNNNNNNNNNNNNNN¡¡¡þ"©œNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûETCHED FROM TABLE JP (HL) ; ; DRIVER RETURNS HERE ; DKOPRET: POP IY ; ; IF NO ERRORS THEN RETURN ZF ; RET Z ;r`ÿÂNNNNNNNNNNNNNNNN¡¡¡þ" FWNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûB A,'I' ;IF IGNORE THEN RETURN NO ERROR RET Z ; ; ELSE RETURN ERROR TO BDOS ; FDSKER: LD HL,0 ;RETURN DPB_PTR = 0 FOR õÿyNNNNNNNNNNNNNNNN¡¡¡þ"f+NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û********* ; TRNONE: LD DE,0 JR SETTR ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ´�ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ"‰àNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAL DRIVE ; LD A,(IY + DVRPDRV) ;0,1: DRV 0, 2,3: DRV 1 LD (IOPB + PB_DRVO),A ; ; OFFSET LOGICAL ADDRESS WITH LOGICAL DRð[ÿòNNNNNNNNNNNNNNNN¡¡¡þ"#FNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNK LD E,A ;PRESET IOPB BANK LD (IOPB + PB_DMAXO),A ; ; EXECUTE THE PRIMITIVE IN ROM ; LD HL,IOPB ;BANKED COMPATABILÅEþNNNNNNNNNNNNNNNNN¡¡¡þ"$ÉNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûEN EXECUTE IOPB ; LD A,(IY + DVRHDS) DEC A JP Z,XPRIM ; ; ELSE SELECT SIDE FROM TRACK BIT 0 ; LD HL,(IOPB + PB_TRKDJÿîNNNNNNNNNNNNNNNNN¡¡¡þ"*êNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û+++++++++++ ; ; FUNCTION DISPATCHER ; ENTRY- C= FUNCTION # ; EXIT - A= -1: ERROR, 0: OK ; ;+++++++++++++++++++++++++++++++\ ÿ$NNNNNNNNNNNNNNNNN¡¡¡þ"0¯NNNNNNNNNNNNNNNNNNNNNN¡¡¡û############################################ ; BFUNTBL: DW RETVERS ;0:RETURN VERSION # DW RETDVRTF ;1:RETURN DISK PHYSICA’¡ÿ“NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÈNNNNNþ€Ì�™‚gƒ5„…Ð…Ÿ†m‡;ˆ ‰×‰¤Šs‹AŒ�Û�ªŽx�F�‘㑱’“M”•蕵–„—Q˜™î™½š‹›Yœ&�ô�Áž�Ÿ^ ,¡ù¡Æ¢”£a¤/¥ü¥Ë¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ";NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL CONFIGURATION TABLE PTR DW EXIOPB ;2:EXECUTE THE IOPB MAXFUNCS EQU ($ - BFUNTBL) / 2 ;+++++++++++++++++++++++++++++++(AÿÈNNNNNNNNNNNNNNNNN¡¡¡þ"­�NNNNNNNNNNNNNNNNNNNNNNð¡¡¡ûSTART AT 1ST TABLE ; ; IF DRIVE == 0 THEN ALREADY THERE ; LD A,C OR A,A RET Z ; ; ELSE IF ILLEGAL DRIVE THEN RETUOŸÿòNNNNNNNNNNNNNNNN¡¡¡þ" BVNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCTION # (DISK FUNCTION) CALL XMROM ;EXECUTE MONITOR FUNCTION POP HL ; OR A,A ;FUNCTION ERROR? RET NZ ; ; FETCH & 5ÿÂNNNNNNNNNNNNNNNN¡¡¡þ"b*NNNNNNNNNNNNNNNNNNNNNN¡¡¡û*************************************** ; PRHEX: LD C,A LD A,MF_PHXB JP XMROM ;************************************7ÿrNNNNNNNNNNNNNNNN¡¡¡þ"�áNNNNNNNNNNNNNNNNNNNNNN¡¡¡û<= 40 THEN OK ; BDOSV EQU $ + 1 JP C,BDOS + 11H ;THIS ADDR MODIFIED BY WARM BOOT RTN ; ; THE FOLLOWING CONDITIONAL JUMP Iù¥ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ"'GNNNNNNNNNNNNNNNNNNNNNN¡¡¡û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 RET Ç¥þNNNNNNNNNNNNNNNN¡¡¡þ"%ÍNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++ ; ; RETURN TIME FUNCTION 92H ; EXIT - A= SECONDS ; B= MINUTES ; C= HOURS ; ;++++++++(YþNNNNNNNNNNNNNNNNNN¡¡¡þ"+îNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN CONSOLE STATUS ; EXIT - A= 0: NOT READY ; FFH: CHéÛþBNNNNNNNNNNNNNNNN¡¡¡þ"RhNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN BIOS VERSION # ; EXIT - HL= VERSION # IN BINARY {0.00,..655.35} ; ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ"½£NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRN ERROR ; CP A,NDRVS JR C,RETDV2 ; OR A,A RET ; ; ; ELSE COMPUTE TABLE PTR ; RETDV2: LD B,C LD DE,DVRSIZ ; Öÿ�NNNNNNNNNNNNNNNN¡¡¡þ"NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRETURN RESULT STATUS ; LD A,PB_STATO ;FETCH STATUS ADD A,L LD L,A LD A,0 ADC A,H LD H,A LD A,(HL) ; OR A,A ;T3þNNNNNNNNNNNNNNNN¡¡¡þ"û½NNNNNNNNNNNNNNNNNNNNNN¡¡¡û*************************************** ; ; NEWLINE PROCEDURE ; ;***********************************************************,ÐÿòNNNNNNNNNNNNNNNN¡¡¡þ"زNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS MODIFIED TO AN UNCONDITIONAL JUMP BY ; THE WARM BOOT ROUTINE IF THE CLOCK/CALENDAR BOARD IS NOT PRESENT ; IF NOT MODIFIED,»*ÿòNNNNNNNNNNNNNNNNN¡¡¡þ" 2ìNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CDOS RETURN VERSION FUNCTION ; MAKES CLO#eÿNNNNNNNNNNNNNNNNNN¡¡¡þ"&˜JNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKTIM: LD A,MF_GTIM JP XMROM ENDIF ;+++++o ÿòNNNNNNNNNNNNNNNN¡¡¡þ",w�NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûAR READY ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CNSCK: LD A,MF_CIS JP XMROM xÿ¤NNNNNNNNNNNNNNNN¡¡¡þ"aYNNNNNNNNNNNNNNNNNNNNNN¡¡¡û;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; RETVERS: LD HL,VERSN XOR A,A ;RETURN NO E~ÿçNNNNNNNNNNNNNNNNN¡¡¡þ" Ž’NNNNNNNNNNNNNNNNNNNNNN¡¡¡û RETDVL: ADD HL,DE DJNZ RETDVL ; PUSH HL CALL GETBNK LD E,A POP HL ; ; RETURN NO ERROR ; XOR A,A RET ;+ëþHNNNNNNNNNNNNNNNNN¡¡¡þ"$4NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûEST RESULT FOR RETURN RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; GET BANK NU¡yÿòNNNNNNNNNNNNNNNN¡¡¡þ"ÈŒNNNNNNNNNNNNNNNNNNNNNN¡¡¡û**************** ; CRLF: LD C,CR CALL COC LD C,LF JP COC IF INTCPTS SUBTTL ADDITIONAL FUNCTIONS TO SUPPORT CDOSç\þNNNNNNNNNNNNNNNNNN¡¡¡þ"ëƒNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û THEN IT IS ALLWAYS FALSE (NOP). ; INHCLK: JR C,ILLEGC ; ; NOW CHECK FOR EXTENDED CALLS ; CP A,8DH ;IF RETURN VERSION Tâ,þNNNNNNNNNNNNNNNNNN¡¡¡þ"!ÝNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCK/CALENDAR WORK. ; EXIT - B= 1 ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; RETCVER: ÝëþNNNNNNNNNNNNNNNNNN¡¡¡þ"'«{NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; MONITOR ROM EXECUTER ; ENTRY- A= FUNCTION # ; ;†ÿíNNNNNNNNNNNNNNNN¡¡¡þ"-D°NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;**************************************************************************** ; ; CONSOLE OUTPUT ; ENTRY- C= CHAR TO OUTP'rþ9NNNNNNNNNNNNNNNN¡¡¡þ"øÎNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRROR RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN DRIVER TABLE PTR FUN �ÿÂNNNNNNNNNNNNNNNN¡¡¡þ" ÛÁNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE IOPB FUNCTION ; ENTRY- HL= IOPB PTR $ÿ NNNNNNNNNNNNNNNNN¡¡¡þ"7yNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûMBER FUNCTION ; EXIT - A= BANK # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; GETBNK: Ž#ÿùNNNNNNNNNNNNNNNN¡¡¡þ"�ßNNNNNNNNNNNNNNNNNNNNNN¡¡¡û PROGRAMS ;*************************************************************************** ; ; SYSTEM CALL INTERCEPT ROUTINE CHEC#oÿçNNNNNNNNNNNNNNNNN¡¡¡þ"rNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHEN RETURN IT JR Z,RETCVER ; CP A,90H ;IF NOT CLOCK THEN ERR JR C,ILLEGC ; JR Z,CLKCAL ;IF CALENDAR THEN GET IT ; ;ÙÿüNNNNNNNNNNNNNNNN¡¡¡þ""TŽNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD B,1 RET SUBTTL CLOCK ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; REd‰ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ"(»ENNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; XMROM: EQU MR_FUN SUBTTL CHAR I/O ROUTINES�ÿîNNNNNNNNNNNNNNNNN¡¡¡þ".ãNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUT ; ;**************************************************************************** ; COC: LD A,MF_CO JP XMROM ;++++S'þHNNNNNNNNNNNNNNNNN¡¡¡þ"ËÿNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCTION ; ENTRY- E= DRIVE # ; EXIT - E:HL= DRIVER TABLE BASE PTR ; A, C= 0 ; B= ? ; ;+++++++++++++++++++++++++++++++++++++ìþHNNNNNNNNNNNNNNNNN¡¡¡þ" èðNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; EXIT - A= 0: OK ; HL= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; EXIOPB: ; ; QÿòNNNNNNNNNNNNNNNNN¡¡¡þ"HNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD A,MF_GBNK JP MR_FUN SUBTTL NON-DISK PROCEDURES ;*****************************************************************Ó{ÿâNNNNNNNNNNNNNNNN¡¡¡þ"®îNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûKS FOR ILLEGAL BDOS CALLS & ; PRINTS MESSAGE IF ILLEGAL. ALSO IMPLEMENTS CDOS CLOCK/CALENDAR ; SYSTEM CALLS FOR ASMB. ; ;*iÿÉNNNNNNNNNNNNNNNN¡¡¡þ"A%NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCP A,92H JR Z,CLKTIM ;IF TIME THEN GET IT ; ; ILLEGAL SYSTEM CALL ; ILLEGC: PUSH BC ;SAVE FUNCTION # ; ; OUTPUT WARNœQþBNNNNNNNNNNNNNNNN¡¡¡þ"#g¿NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTURN CALENDAR FUNCTION 90H ; EXIT - A= DAY ; B= MONTH ; C= YEAR ; L= DAY OF WEEK ; ;+++++++++++++++++++++++++++++++++++‘=ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ")ˆtNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CONSOLE INPUT ; EXIT - A= CHAR ; ;++++(—þINNNNNNNNNNNNNNNNN¡¡¡þ"/"ÒNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; READER DRIVER - DUMMY ; EXIT - A= CTRL-Z ; ;++?âÿòNNNNNNNNNNNNNNNN¡¡¡þ"ž¬NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û+++++++++++++++++++++++++++++++++++++++ ; ; BIOS CALL ENTRY (E= DRIVE #) ; RETDVRTF: LD C,E ; RETDVRT: LD HL,DVR0 ;ù¿ÿùNNNNNNNNNNNNNNNN¡¡¡þ" qgNNNNNNNNNNNNNNNNNNNNNN¡¡¡û SET UP FOR CALL ; PUSH HL ;SAVE PTR ; CALL GETBNK ;E= IOPB PTR IS IN THIS BANK LD E,A ; LD A,MF_XIOB ;MONITOR FUN¥áÿÂNNNNNNNNNNNNNNNN¡¡¡þ"QNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*********** ; ; OUTPUT HEX DATA TO CONSOLE SUBR ; ENTRY- A= DATA ; EXIT - A, C= ? ; ;*************************************_mÿNNNNNNNNNNNNNNNNN¡¡¡þ"¾ÐNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************************************** INTCPT: LD A,C ;CHECK CALL VALIDITY CP A,41 ;IF ùÌÿBNNNNNNNNNNNNNNNN¡¡¡þ"vNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûING MESSAGE ; LD HL,ISCMSG ;OUTPUT WARNING CALL EDITOR ; ; OUTPUT FUNCTION # ; POP HL LD A,L CALL PRHEX ; ; #àÿNNNNNNNNNNNNNNNNN¡¡¡þ"$þ(NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++ ; CLKCAL: LD A,MF_GCAL JP XMROM ;++++++++++++++++++++++++++++++++++++++++++McÿáNNNNNNNNNNNNNNNN¡¡¡þ"*Ý'NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CI: LD A,MF_CI JP XMROM ;+++++++++++++++++μÿÈNNNNNNNNNNNNNNNNN¡¡¡þ"01ŸNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; READER: LD A,CTRLZ ;FAKE EOF ; ; FALL INTO PÈ ÿÈNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÈNNNNNNNNN�Ï�œ‚iƒ7„…Ó… †m‡<ˆ ‰Ø‰¦Št‹BŒ�Ý�¬Ž{�H�‘㑱’~“L”•ç•´–ƒ—P˜™í™»š‰›Wœ$�ò�¿ž�Ÿ[ (¡õ¡Â¢�£]¤+¥ø¥Æ¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ#F¿NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûUNCH RETURN ; ;**************************************************************************** ; ; PUNCH DRIVER ; ENTRY- Cø ÿNNNNNNNNNNNNNNNNN¡¡¡þ#ìNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û******************************************************************** ; ; MESSAGE EDITOR ; ENTRY- HL= TEXT PTR (BIT 7= 1: TERMqêÿrNNNNNNNNNNNNNNNN¡¡¡þ# ÒNNNNNNNNNNNNNNNNNNNNNN¡¡¡û########## ; IOPB: REPT PB_SIZE LIST OFF DB 0 LIST ON ENDM ;#####################################################1ÄÿyNNNNNNNNNNNNNNNN¡¡¡þ##®NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûRS DVRHDS DS 1 ;HEADS ; ; DEFINE THE STRUCTURE SIZE ; DVRSIZ DS 0 ENDM ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@!Áÿ¤NNNNNNNNNNNNNNNN¡¡¡þ#ÌeNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSECTORS, SIZE DB #SD,#ZD ;DATA TRKS SECTORS, SIZE DB #DT ;DISK TYPE DW #CY ;CYLS DB #HD ;HEADS ; LIST OFF ENDM ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ#fÃNNNNNNNNNNNNNNNNNNNNNN¡¡¡û1,32,1,10H,256,4 DVR5: ;F ALLDRV HDEXEC,5,60H,32,1,32,1,32,1,10H,256,4 ENDIF LIST ON ;############################êHÿäNNNNNNNNNNNNNNNN¡¡¡þ#%Œ�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNULL MASK DW 242 ;DISK SIZE -1 DW 63 ;DIRECTORY MAX DB 11000000B ;ALLOC 0 DB 0 ;ALLOC 1 DW 16 ;CHECK SIZE DW 2 ’âÿœNNNNNNNNNNNNNNNN¡¡¡þ#+¯’NNNNNNNNNNNNNNNNNNNNNN¡¡¡û15 ;DISK SIZE (CLUSTERS -1) (DSM) DW 1152 / 2 ;DIRECTORY MAX (DRM) DB 0FFH ;ALLOCATION 0 (AL0) DB 10000000B ;ALLOCAT†5ÿùNNNNNNNNNNNNNNNN¡¡¡þ#ìNNNNNNNNNNNNNNNNNNNNNN¡¡¡û= CHAR TO OUTPUT ; ;**************************************************************************** ; PUNCH: RET ;********›ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ#ü'NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûINATOR) ; EXIT - REGS= ? ; ;**************************************************************************** ; EDITOR: CALL GçúþHNNNNNNNNNNNNNNNN¡¡¡þ#V�NNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡û####################### ; ; DISK DRIVER TABLES ; ;##########################################################################UéÿòNNNNNNNNNNNNNNNN¡¡¡þ#º9NNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; MACRO TO DEFINE THE DRIVER TABLE RECORD ; ENTRY- #DADD= DRIVER ADDRESS ; #PD= PHYSICͪÿ„NNNNNNNNNNNNNNNN¡¡¡þ#™6NNNNNNNNNNNNNNNNNNNNNN¡¡¡û IF BOOT = 10H DVR0: ;A ALLDRV HDEXEC,4,60H,32,1,32,1,32,1,10H,256,4 DVR1: ;B ALLDRV HDEXEC,4,60H,32,1,32,1,32,1,10H, øÿòNNNNNNNNNNNNNNNNN¡¡¡þ# shNNNNNNNNNNNNNNNNNNNNNN¡¡¡û################################################ ; ; MESSAGES ; ;#########################################################‹‘þNNNNNNNNNNNNNNNNN¡¡¡þ#&ÙÎNNNNNNNNNNNNNNNNNNNNNN¡¡¡û;TRACK OFFSET DB 0 ;PHYSICAL RECORD SHIFT FACTOR DB 0 ;PHYSICAL RECORD MASK DW 0 ;LOGICAL DRIVE SECTOR OFFSET ; ; D·ÞÿùNNNNNNNNNNNNNNNN¡¡¡þ#,6NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûION 1 (AL1) DW 0 ;CHECK SIZE (CKS) DW 2 ;TRACK OFFSET (OFF) DB 1 ;PHYSICAL RECORD SHIFT FACTOR (PSH) DB 1 ;PHY�,ÿäNNNNNNNNNNNNNNNN¡¡¡þ# ÝNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û******************************************************************** ; ; PRINTER DRIVER ; ENTRY- C= CHAR TO OUTPUT ; ;*****fKÿ�NNNNNNNNNNNNNNNNN¡¡¡þ# ÏNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûETBNK LD E,A LD A,MF_PUTS JP XMROM SUBTTL INITIALIZED DATA ;#######################################################÷ÐÿÈNNNNNNNNNNNNNNNNN¡¡¡þ#e°NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û## ; STRUCT 0 DVRADD DS 2 ;START ADDRESS OF DISK DRIVER DVRFG DS 1 ;FLAGS (BIT 0= 1: INHIBIT LOGON) DVRPDRV DS 1 ;PHYSICALQHÿùNNNNNNNNNNNNNNNN¡¡¡þ#‰NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAL DRIVE # ; #FG= DRIVE FLAGS (IDFLGO) ; #S0= TRK 0 SPT ; #Z0= TRK 0 SIZE ; #S1= TRK 1 SPT ; #Z1= TRK 1 SIZE ; #SD= ´þBNNNNNNNNNNNNNNNN¡¡¡þ#ªNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û256,4 DVR2: ;C ALLDRV HDEXEC,5,60H,32,1,32,1,32,1,10H,256,4 DVR3: ;D ALLDRV HDEXEC,5,60H,32,1,32,1,32,1,10H,256,4 DVR4: ;k¬þ!NNNNNNNNNNNNNNNN¡¡¡þ#!@YNNNNNNNNNNNNNNNNNNNNNN¡¡¡û################### ; MSGLE: DM CR,LF,'LOAD ERROR' ; DSKEB: DM CR,LF,'Abort, Ignore, Retry, (BDOS) - ' ; IF INTCPTS ISoÿóNNNNNNNNNNNNNNNNN¡¡¡þ#'êÿNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûEFAULT DISK PHYSICAL PARAMETERS ; DB 0 ;FLAGS DB 26,0,26,0,26,0 ;SECTORS PER TRACK, SECTOR SIZE (128) DB 0 ;TYPE DW 73ÿINNNNNNNNNNNNNNNN¡¡¡þ#-4NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSICAL RECORD MASK (PRM) DW 0 ;LOGICAL DRIVE SECTOR OFFSET (SOF) ; ; ; DB 01100000B ;FLAGS 256 BPS, HARD, SSSD DB 32,1ê»ÿœNNNNNNNNNNNNNNNN¡¡¡þ#¹JNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û*********************************************************************** ; LO: LD A,MF_LO JP XMROM ;++++++++++++++++++à(ÿÂNNNNNNNNNNNNNNNN¡¡¡þ# šENNNNNNNNNNNNNNNNNNNNNN¡¡¡û##################### ; ; 3740 SECTOR TRANSLATION TABLE ; **** CP/M SINGLE DENSITY **** ; ;################################£ÿdNNNNNNNNNNNNNNNNN¡¡¡þ#výNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DRIVE # ; ; THE FOLLOWING MAY BE BROUGHT OFF DISK DESCRIPTOR OR FROM DEFAULT TABLES ; DVRFLG DS 1 ;DISK FLAGS DVR0SPT DS8oÿòNNNNNNNNNNNNNNNN¡¡¡þ#Ü[NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDATA TRKS SPT ; #ZD= DATA TRKS SIZE ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ALLD—9ÿçNNNNNNNNNNNNNNNNN¡¡¡þ#3�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE ALLDRV FD8EXEC,0,0,26,0,26,0,26,0,0,77,1 DVR5: ;F ALLDRV FD8EXEC,1,0,26,0,26,0,26,0,0,77,1 ENDIF IF BOOT = 3 DVRPþrNNNNNNNNNNNNNNNN¡¡¡þ#" NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCMSG: DM CR,LF,'ILL SYS CALL, #= ' ENDIF ;############################################################################ P²ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ#(úÁNNNNNNNNNNNNNNNNNNNNNN¡¡¡û7 ;CYLS DB 1 ;HEADS ;############################################################################ ; ; DEFAULT 8" HARDÃÞÿÂNNNNNNNNNNNNNNNN¡¡¡þ#.PgNNNNNNNNNNNNNNNNNNNNNN¡¡¡û,32,1,32,1 ;32 SPT, 256 BPS DB 10H ;TYPE DW 256 ;CYLS DB 4 ;HEADS ;###############################################GBÿçNNNNNNNNNNNNNNNNN¡¡¡þ#Š{NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN LIST DEVICE STATUS ; EXIT - A= 0: BUSY, FFH:READY ; ;—ËþHNNNNNNNNNNNNNNNNN¡¡¡þ# ©tNNNNNNNNNNNNNNNNNNNNNN¡¡¡û############################################ ; SDTRAN: GXLATE 26,6 ;#####################################################±“ÿäNNNNNNNNNNNNNNNNN¡¡¡þ#EÌNNNNNNNNNNNNNNNNNNNNNN¡¡¡û 1 ;TRK 0 SECTORS PER TRK DVR0SZ DS 1 ;TRK 0 SECTOR SIZE DVR1SPT DS 1 ;TRK 1 SECTORS PER TRK DVR1SZ DS 1 ;TRK 1 SECTOR SIZE ¿dÿùNNNNNNNNNNNNNNNN¡¡¡þ#ïjNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRV MACRO #DADD,#PD,#FG,#S0,#Z0,#S1,#Z1,#SD,#ZD,#DT,#CY,#HD LIST ON DW #DADD ;DRIVER EXECUTION ADDR DB 0 ;LOGON INHIBIT FúøÿòNNNNNNNNNNNNNNNN¡¡¡þ#¡NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û0: ;A ALLDRV FD8EXEC,0,0,26,0,26,0,26,0,0,77,1 DVR1: ;B ALLDRV FD8EXEC,1,0,26,0,26,0,26,0,0,77,1 DVR2: ;C ALLDRV HDEXEC,9cÿBNNNNNNNNNNNNNNNN¡¡¡þ##&;NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; DEFAULT 8" FLOPPY DISK PARAMETER BLOCK ; IBM 3740 SINGLE DENSITY FORMAT ; ;############################################ëSÿÉNNNNNNNNNNNNNNNNN¡¡¡þ#)ÉðNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û DISK PARAMETER BLOCK ; ;############################################################################ ; HDPBK: DW 128 ;SECTÏÓþINNNNNNNNNNNNNNNNN¡¡¡þ#/cVNNNNNNNNNNNNNNNNNNNNNNð¡¡¡û############################# ; ; DRIVE PARAMETER HEADER AREA ; 1 PER DRIVE ; ;############################################ÏCÿòNNNNNNNNNNNNNNNN¡¡¡þ#ß(NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; LISTST: LD A,MF_LOS JP XMROM ;********qÏþBNNNNNNNNNNNNNNNN¡¡¡þ# 0ãNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û####################### ; ; COMMON I/O PARAMETER BLOCK ; ;##################################################################lfþBNNNNNNNNNNNNNNNN¡¡¡þ#ŸNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDVRDSPT DS 1 ;DATA TRKS SECTORS PER TRK DVRDSZ DS 1 ;DATA TRKS SECTOR SIZE DVRDTYP DS 1 ;DISK TYPE DVRCYLS DS 2 ;DISK CYLINDETÿÉNNNNNNNNNNNNNNNNN¡¡¡þ#ÿTNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLAG (LOGON ENABLED) DB #PD ;MONITOR PHYSICAL DRIVE # DB #FG ;DISK FLAGS DB #S0,#Z0 ;T0 SECTORS, SIZE DB #S1,#Z1 ;T1 úœÿòNNNNNNNNNNNNNNNN¡¡¡þ#UòNNNNNNNNNNNNNNNNNNNNNN¡¡¡û4,60H,32,1,32,1,32,1,10H,256,4 DVR3: ;D ALLDRV HDEXEC,4,60H,32,1,32,1,32,1,10H,256,4 DVR4: ;E ALLDRV HDEXEC,5,60H,32,1,32,vÇþNNNNNNNNNNNNNNNNNN¡¡¡þ#$¿¬NNNNNNNNNNNNNNNNNNNNNN¡¡¡û################################ ; SD8PBK: DW 26 ;SECTORS PER TRACK DB 3 ;BLOCK SHIFT FACTOR DB 7 ;BLOCK MASK DB 0 ;*ÿNNNNNNNNNNNNNNNN¡¡¡þ#*œ£NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûORS PER TRACK (LOGICAL) (SPT) DB 5 ;BLOCK SHIFT FACTOR (BSH) DB 31 ;BLOCK MASK (BLM) DB 1 ;NULL MASK (EXM) DW 10“ÁÿÉNNNNNNNNNNNNNNNNN¡¡¡þ#0pNNNNNNNNNNNNNNNNNNNNNN¡¡¡û################################ ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATm>ÿÈNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÈNNNNNþ€Ì�š‚gƒ5„…Ð…�†k‡9ˆ‰Ô‰¡Šo‹=Œ �Ù�§Žu�B�‘ß‘­’|“J”•敳–�—N˜™ê™¹š‡›Uœ"�ð�½žŒŸZ )¡ö¡Ä¢’£_¤-¥ú¥É¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ#q�NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûE A DISK PARAMETER TABLE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ALLDPH: MACÙÿÉNNNNNNNNNNNNNNNNN¡¡¡þ#Û)NNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡ûD EQU $ SUBTTL UNINITIALIZED DATA AREA ;############################################################################ ; ; ± ÿòNNNNNNNNNNNNNNNN¡¡¡þ# 4âNNNNNNNNNNNNNNNNNNNNNN¡¡¡û EXECUTION ADDRESS SECOFF DS 2 ;LOGICAL DRIVE SECTOR OFFSET (ADD TO SECTOR) ;#############################################ϸþBNNNNNNNNNNNNNNNN¡¡¡þ#žNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD)CHK DS 32 ;DIRECTORY CHECKSUMS STORAGE (1 BYTE PER SECTOR) ENDIF LIST OFF ENDM ; ; RESERVE THE DATA SPACE ; DfþrNNNNNNNNNNNNNNNN¡¡¡þ#ûUNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûK= 3, 16K= 7 DPBDSM DS 2 ;DSM- DRIVE STORAGE SIZE (IN CLUSTERS) ; INT(((#_TRACKS - OFF) * SPT * BYTES PER SECTOR) / CLUSTER þÿçNNNNNNNNNNNNNNNNN¡¡¡þ#QóNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûENTED THRU BDOS USING DPBOFF ABOVE. ; PARTITIONING BY HEADS ARE IMPLIMENTED BY USING THE FOLLOWING DATA. ; (HEAD BITS ARE IN ½þINNNNNNNNNNNNNNNN¡¡¡þ#%»­NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTOO BIG, USE MOVCPM & RE-ADJUST! **** ENDIF END âÇÿaNNNNNNNNNNNNNNNN¡¡¡þ#+˜¢NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûERRUPT ; ;---------------------------------------------------------------------------- ; ITRAP: ; ; SAVE REGS FIRST ; È{ÿùNNNNNNNNNNNNNNNNN¡¡¡þ#$ÜNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRO #D LIST ON D#D(DD)DPH: ;DRIVE PARAMETER HEADER FOR DRIVE #D(DD) DW 0 ;;SECTOR TRAN TBL (OR 0 IF NO XLATE) DW 0 ;;S|ìÿÈNNNNNNNNNNNNNNNNN¡¡¡þ#ËNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û THE FOLLOWING DATA MUST RESIDE IN THIS ORDER TO MATCH THE IOPB DATA ; ;#####################################################èMÿÈNNNNNNNNNNNNNNNN¡¡¡þ#a±NNNNNNNNNNNNNNNNNNNNNNð¡¡¡û############################### ; ; DRIVE ALLOCATION AREAS ; ;############################################################ÚÈþrNNNNNNNNNNNNNNNN¡¡¡þ#� NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD DL 1 REPT NDRVS LIST OFF ALLDAL 0123456789ABCDEF DD DL DD + 1 LIST ON ENDM ;##################################‹VþrNNNNNNNNNNNNNNNN¡¡¡þ#®NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSIZE) -1 DPBDRM DS 2 ;DRM- DIRECTORY SIZE -1 DPBAL0 DS 2 ;AL0,1- DIRECTORY ALLOCATION ; 1 MSB PER DIRECTORY CLUSTER ALLOCAeÿòNNNNNNNNNNNNNNNNN¡¡¡þ# DXNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCLUDED IN SECTOR WORD UPPER BITS) ; DPBSOF DS 2 ;SOF- SECTOR OFFSET (FOR LOGICAL DRIVE) ; 0: NONE, 1..65535: OFFSET DPBSZ.MÿÎNNNNNNNNNNNNNNNNN¡¡¡þ#&îþNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++ ; ; RETURN LIST DEVICE STATUS ; EXIT - A= 0: BUSY, FFH:READY ; ;++++++++++++++++++++++++++++++++++++++++++™ÿ®NNNNNNNNNNNNNNNNNN¡¡¡þ#,5NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û PUSH AF PUSH HL PUSH BC PUSH DE ; ; SAVE CURRENT ROM & GET MONITOR ROM ; IN A,(M2_RSEL) LD (ROMSAV),A LD A,MR_¢sÿNNNNNNNNNNNNNNNN¡¡¡þ#íNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCRATCH AREA DW 0 ;;" DW 0 ;;" DW DIRBF ;;DIRECTORY BUFFER PTR DW D#D(DD)DPB ;;DRIVE PARAMETER BLK PTR IF ((DD - 1õþNNNNNNNNNNNNNNNNNN¡¡¡þ# ø&NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û####################### ; BTDRV: DS 1 ;DRIVE # BTTRK DS 2 ;TRACK # BTSEC DS 2 ;SECTOR # BTFLG DS 1 ;RESERVED FOR FLAGS BTD:CþNNNNNNNNNNNNNNNNNN¡¡¡þ#R€NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û################ ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; MACRO TO DEFINE THE DRIm0ÿ NNNNNNNNNNNNNNNN¡¡¡þ#¾8NNNNNNNNNNNNNNNNNNNNNN¡¡¡û########################################## ; ; RESERVE DRIVE PARAMETER BLOCKS ; ;#########################################wþBNNNNNNNNNNNNNNNN¡¡¡þ#�7NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTED DPBCKS DS 2 ;CKS- # DIRECTORY SECTORS CHECKED ; (DRM +1) / 4 DPBOFF DS 2 ;OFF- # RESERVED TRACKS (USUALLY 2) ; ; A jÿÎNNNNNNNNNNNNNNNNN¡¡¡þ#!wiNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DS 0 ENDM ; ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE THE DPB FOR DRIòûÿNNNNNNNNNNNNNNNNN¡¡¡þ#'ÝÏNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++ ; LISTST: LD A,MF_LOS JR XMROM ;**************************************************×ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ#-2NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûRNUM OUT (M2_RSEL),A ; ; PRINT PROMPT ; LD HL,ITMSG IQCONT: LD A,MF_PUTS CALL MR_FUN ; LD HL,IQMSG ;QUERY USER !%ÿòNNNNNNNNNNNNNNNNN¡¡¡þ#ŽzNNNNNNNNNNNNNNNNNNNNNN¡¡¡û) <= NDHD) AND ((DD - 1) >= STHD) DW 0 ;;NO CHECKS ON HARD DISK ELSE DW D#D(DD)CHK ;;DRIVE DISK CHECKSUMS ARRAY PTR NúÿBNNNNNNNNNNNNNNNN¡¡¡þ# ­uNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûMA DS 2 ;DMA ADDRESS BTDMAX DS 1 ;DMA EXTENDED ADDRESS ;##################################################################}€ÿNNNNNNNNNNNNNNNNN¡¡¡þ#AÍNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûVE ALLOCATION & CHECKSUMS AREA ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ALLDAL: MAC^ÿÂNNNNNNNNNNNNNNNN¡¡¡þ#ëkNNNNNNNNNNNNNNNNNNNNNN¡¡¡û################################### ; STRUCT 0 DPBSPT DS 2 ;SPT- SECTORS/TRACK DPBBSH DS 1 ;BSH- BLOCK SHIFT FACTOR DETERMI9ÊÿçNNNNNNNNNNNNNNNNN¡¡¡þ# NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDDITIONAL CP/M 3.0 DATA (ALSO COULD BE USED BY CP/M 2.2 DEBLOCKING) ; DPBPSH DS 1 ;PSH- PHYSICAL RECORD SHIFT FACTOR BASED ON xÿòNNNNNNNNNNNNNNNN¡¡¡þ#"":NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûVE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ALLDPB: MACRO #D LIST ON D#D(DscÿHNNNNNNNNNNNNNNNNN¡¡¡þ#(ÍñNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************** ; ; MESSAGE EDITOR ; ENTRY- HL= TEXT PTR (BIT 7= 1: TERMINATOR) ; EXIT - REGS= ? ; ;***********ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ#.gWNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD A,MF_PUTS CALL MR_FUN ; ; GET & ECHO USER INPUT ; LD A,MF_CI CALL MR_FUN ; PUSH AF LD C,A LD A,MF_CO CAB ÿrNNNNNNNNNNNNNNNNNN¡¡¡þ#½KNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ENDIF DW D#D(DD)ALL ;;DRIVE CLUSTER ALLOCATION BIT MAP PTR LIST OFF ENDM ; ; DEFINE THE DATA ; DD DL 1 REPT NDRVS»µþHNNNNNNNNNNNNNNNNN¡¡¡þ# žDNNNNNNNNNNNNNNNNNNNNNN¡¡¡û########## ; ; VARIABLES ; ;############################################################################ ; DTPTR: DS 2 ;*·þINNNNNNNNNNNNNNNNN¡¡¡þ#rüNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRO #D LIST ON IF ((DD - 1) >= STHD) AND ((DD - 1) <= NDHD) D#D(DD)ALL: DS 127 ;ALLOCATION BIT MAP FOR 8" HARD DRIVE #D(DD;¿ÿüNNNNNNNNNNNNNNNN¡¡¡þ#ØZNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNED BY CLUSTER SIZE ; 1K= 3, 2K= 4, 4K= 5, 8K= 6, 16K= 7 DPBBLM DS 1 ;BLM- BLOCK MASK ; 1K = 7, 2K= 15, 4K= 31, 8K= 63,&×þ NNNNNNNNNNNNNNNN¡¡¡þ#7‘NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBYTES/SEC ; 0: 128, 1: 256, 2: 512, 3: 1024 DPBPHM DS 1 ;PHM- PHYSICAL RECORD MASK BASED ON BYTES/SEC ; 0: 128, 1: 256,ÏlÿáNNNNNNNNNNNNNNNN¡¡¡þ## NNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡ûD)DPB: DS DPBSZ ;ALLOCATION FOR DRIVE #D(DD) LIST OFF ENDM ; ; RESERVE THE DATA SPACE ; DD DL 1 REPT NDRVS LIST Oi±þINNNNNNNNNNNNNNNNN¡¡¡þ#)þÀNNNNNNNNNNNNNNNNNNNNNN¡¡¡û***************************************************************** ; EDITOR: CALL GETBNK LD E,A LD A,MF_PUTS JR XMROM ü&ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ#/TfNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûLL MR_FUN POP AF ; ; IF OPTION IS CTRL-C THEN WARM BOOT ; CP A,3 ;IF CTRL-C THEN WARM BOOT JP Z,PAGE0 ; ; IF OPTjÿrNNNNNNNNNNNNNNNNN¡¡¡þ#èNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LIST OFF ALLDPH 0123456789ABCDEF DD DL DD + 1 LIST ON ENDM ; ; LAST OF INITIALIZED CODE READ FROM DISK ; BIOSN9�ÿNNNNNNNNNNNNNNNN¡¡¡þ# ÓNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDRIVE TABLE PTR LOGRQ: DS 1 ;LOG ON REQUEST REG. DVRTPTR DS 2 ;DRIVE DRIVER TABLE BASE ADDRESS PTR DVRXADR DS 2 ;DRIVE DRIVERš;þBNNNNNNNNNNNNNNNN¡¡¡þ#'¯NNNNNNNNNNNNNNNNNNNNNN¡¡¡û) ENDIF IF ((DD - 1) >= ST8FD) AND ((DD - 1) <= ND8FD) D#D(DD)ALL: DS 57 ;ALLOCATION BIT MAP FOR 8" DRIVE #D(DD) D#D(DÓÿäNNNNNNNNNNNNNNNNN¡¡¡þ#ÈdNNNNNNNNNNNNNNNNNNNNNN¡¡¡û 16K= 127 DPBEXM DS 1 ;EXM- EXTENT MASK ; DSM < 256 : 1K= 0, 2K= 1, 4K= 3, 8K= 7, 16K= 15 ; DSM > 255 : 2K= 0, 4K= 1, 8OÎÿòNNNNNNNNNNNNNNNN¡¡¡þ#bÂNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û 3: 512, 7: 1024 ; ; ADDITIONAL DISK PARTITIONING DATA FOR THE LOGICAL DRIVE SELECTION. ; PARTITIONING BY TRACKS ARE IMPLIM/+þNNNNNNNNNNNNNNNNNN¡¡¡þ#$ˆœNNNNNNNNNNNNNNNNNNNNNNþ€¡¡¡ûFF ALLDPB 0123456789ABCDEF DD DL DD + 1 LIST ON ENDM IF (($ - 8000H) > 07700H) OR ($ < 8000H) CONMSG **** BIOS íþBNNNNNNNNNNNNNNNN¡¡¡þ#*«“NNNNNNNNNNNNNNNNNNNNNN¡¡¡û IF INTRPTS SUBTTL INTERRUPTS ;---------------------------------------------------------------------------- ; ; USER INT�EÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ#0G+NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûION IS YES THEN WARM BOOT ; AND A,5FH ;IGNORE CASE ; CP A,'Y' JP Z,PAGE0 ; ; IF OPTION IS INTERRUPT THEN EXECUTE RE{±ÿÂNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÌNNNNNNNNN�Ñ�ž‚kƒ8„…Ó…¡†n‡<ˆ ‰Ø‰¥Šs‹@Œ �Ú�©Žw�D�‘ß‘­’z“G”•╯–~—K˜™ç™¶š„›Rœ �î�»žŠŸX &¡ô¡Á¢�£\¤*¥ø¥Ç¦ NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ$’NNNNNNNNNNNNNNNNNNNNNN¡¡¡û TITLE CUSTOMIZED BIOS FOR M5B LIST NOCOND ;============================================================================ ; þ^ÿäNNNNNNNNNNNNNNNNN¡¡¡þ$½4NNNNNNNNNNNNNNNNNNNNNN¡¡¡û 20H: 5" FLOPPY DEBUG EQU FALSE ;TRUE TO DUMP THE IOPB DATA TO PRINTER FORM ;********************************************à/þrNNNNNNNNNNNNNNNN¡¡¡þ$ RÿNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHYSICAL DRIVE 1 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; D SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 0 ; E SIDE 0 & ÃâÿáNNNNNNNNNNNNNNNN¡¡¡þ$rƒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûARGER BIOS ALLOCATION ON THE DISK. ; ; 2.2.4 - ADDED NAKED TERMINAL DRIVERS & IOBYTE IN ; ANTICIPATION OF THE MONITOR. ALœÿNNNNNNNNNNNNNNNN¡¡¡þ$�HNNNNNNNNNNNNNNNNNNNNNN¡¡¡û 83 GRH ; Move clock-calendar routines to ROM. Add Interrupt handler ; (Mode 2). Change Revision display of sign-on (separatÙCÿÉNNNNNNNNNNNNNNNNN¡¡¡þ$7îNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û5 GRH ; Implemented hard disk drive 1 as C: & D:. ; Implemented the Logon function for the hard disk. ; Implemented user fr?¥ÿrNNNNNNNNNNNNNNNN¡¡¡þ$%ݰNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûON to specify the ID sector & track. At same time, fix bug ; which did not specify the logon track. ; ; 3.02 7 JUL 88 GRH^ÿçNNNNNNNNNNNNNNNNN¡¡¡þ$+þ¿NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û******************************** SUBTTL SYSTEM DECLARATIONS ;============================================================­ãÿáNNNNNNNNNNNNNNNN¡¡¡þ$BÁNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ASSEMBLY PARAMETERS ; ;============================================================================ FALSE EQU 0 TRUE EQU N¯7ÿ�NNNNNNNNNNNNNNNNN¡¡¡þ$­ NNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************** ; ; CUSTOMIZED BIOS FOR M5B ; (c) 1981 GRH Electronics, CUPERTINO, CA ; ;************QÓÿNNNNNNNNNNNNNNNN¡¡¡þ$¬NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û1 OF HARD DISK PHYSICAL DRIVE 1 ; F SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ENDIF IF BOOT = 20H ; A JADE 5" FLOPP±ÿäNNNNNNNNNNNNNNNN¡¡¡þ$ëNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûSO, ALL REFERENCES ; REQUIRING THE I/O PROMS TO BOOT HAS BEEN REMOVED. ; ; 2.2.5 - RECONFIGURE FOR 62K SYSTEM. ; ; 2.2. °þrNNNNNNNNNNNNNNNN¡¡¡þ$ÈNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûe CBIOS rev). ; ; 2.00 - 24 MAR 84 GRH ; Modify for hard disk ; ; 2.01 - 28 APR 84 GRH ; Change hard disk DPB to refleõ÷ÿòNNNNNNNNNNNNNNNNN¡¡¡þ$ "ENNNNNNNNNNNNNNNNNNNNNN¡¡¡ûiendly disk error options: Abort, Retry, Ignore. ; Solved warm boot hang problem by reseting host adapter if busy. ; ; 3.00 -h=ÿœNNNNNNNNNNNNNNNN¡¡¡þ$&ˆãNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; Add '?' to include file names. ; Change hard disk system tracks directory reference to new format. ; Correct bug in driver ÷ÿ9NNNNNNNNNNNNNNNN¡¡¡þ$,g(NNNNNNNNNNNNNNNNNNNNNN¡¡¡û================ ; ; INCLUDE JDDCONT.DEF ; INCLUDE COMIOPB.DEF ; INCLUDE DISKS.DEF ; INCLUDE MONBOARD.DEF ; INCLUDE ZMONRO/ÏÿNNNNNNNNNNNNNNNN¡¡¡þ$qðNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOT FALSE ;============================================================================ ; ; CONDITIONAL ASSEMBLY FLAGS ; ;žþHNNNNNNNNNNNNNNNNN¡¡¡þ$ ž;NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û**************************************************************** ; ; CONFIGURATION: ; ; CPM ; DRIVE USAGE IF BOOT = 10H±ÿäNNNNNNNNNNNNNNNNN¡¡¡þ$4�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûY PHYSICAL DRIVE 0 ; B JADE 5" FLOPPY PHYSICAL DRIVE 1 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; D SIDE 2 & 3 OF HßÓÿùNNNNNNNNNNNNNNNN¡¡¡þ$Ø%NNNNNNNNNNNNNNNNNNNNNN¡¡¡û6 - 20 FEB 83 ; DOUBLE D REV C UPGRADE. CHANGE BOARD STATUS PORT BITS. ; ; 2.2.7 - 8 MAR 83 GRH ; ADDED CLOCK/CALENDAR DRIVEðÿœNNNNNNNNNNNNNNNN¡¡¡þ$û*NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûct half size directory, but keep ; allocation for 1k directory ; ; 2.02 - 2 JUN 84 GRH ; Change floppy disk drivers to relhmÿáNNNNNNNNNNNNNNNN¡¡¡þ$!tNNNNNNNNNNNNNNNNNNNNNN¡¡¡û 26 JAN 87 GRH ; Implemented new common IOPB code & Jade floppy firmware support. ; Implemented disk drive driver tables andäÿNNNNNNNNNNNNNNNNN¡¡¡þ$'»ÒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûs which caused retry to fail. (sector remained ; corrupted) ; Stubbed out new Clock routines for present. ; ; 3.03 31 JUL á7ÿ“NNNNNNNNNNNNNNNN¡¡¡þ$-TNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûM.DEF ; INCLUDE DKBTROM.DEF ; INCLUDE NAKEDT.DEF ; INCLUDE ISHA.DEF ; INCLUDE CLOKROM.DEF ; ;=============================ttÿyNNNNNNNNNNNNNNNN¡¡¡þ$ègNNNNNNNNNNNNNNNNNNNNNN¡¡¡û============================================================================ SHORT EQU FALSE ;SHORT BIOS (REMOVES UNESENTIAL C‘•þBNNNNNNNNNNNNNNNN¡¡¡þ$ ËhNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;HARD DISK BOOT CONFIG. ; A SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; B SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 0 ; CÇ9ÿ NNNNNNNNNNNNNNNNN¡¡¡þ$'ÐNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûARD DISK PHYSICAL DRIVE 0 ; E SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; F SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ; G ¤þrNNNNNNNNNNNNNNNN¡¡¡þ$�vNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR, SYSTEM CALL INTERCEPT, ; ILLEGAL SYSTEM CALL MESSAGE, CHANGED BIOS SIZE TO END ; OF INITIALIZED DATA AREA. RESTRUCTURE MODU¡>ÿNNNNNNNNNNNNNNNNN¡¡¡þ$b½NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûate to ISASI control of JADE ; FDC. ; Change IOPB sector value from physical sector (1..n) to logical ; sector value (0c¹ÿòNNNNNNNNNNNNNNNN¡¡¡þ$"D'NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û new function to return ; a ptr to a drive table. ; Removed init of IOBYTE. ; Implemented 5" floppy driver. ; Implemented us•ÿäNNNNNNNNNNNNNNNNN¡¡¡þ$(«ìNNNNNNNNNNNNNNNNNNNNNN¡¡¡û88 GRH ; Unstub Clock routines. ; ; 3.04 6 AUG 88 GRH ; Remove floppy side select from BIOS & move to controller. ; ImpLöþNNNNNNNNNNNNNNNNNN¡¡¡þ$.JNNNNNNNNNNNNNNNNNNNNNN¡¡¡û=============================================== LIST OFF *INCLUDE JDDCONT.DEF *INCLUDE COMIOPB.DEF *INCLUDE DISKS.DEF *INCríÿÉNNNNNNNNNNNNNNNNN¡¡¡þ$ÛVNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûODE) LSTINC EQU FALSE ;LIST INCLUDE FILES USEMON EQU TRUE ;USE MONITOR ROM I/O ROUTINES IF TRUE INTRPTS EQU TRUE ;ENABLE IÝÈþHNNNNNNNNNNNNNNNNN¡¡¡þ$ øYNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; D SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ; E JADE 8" FLOPPY PHYSICAL DRIVE 0ð½ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ$áNNNNNNNNNNNNNNNNNNNNNN¡¡¡û JADE 8" FLOPPY PHYSICAL DRIVE 0 ; H JADE 8" FLOPPY PHYSICAL DRIVE 1 ENDIF ; ;*****************************************±.ÿùNNNNNNNNNNNNNNNN¡¡¡þ$¾GNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLES. ; ; 2.28 - 22 APR 83 GRH ; CHANGED DEFINITIONS TO ALLOW BIG DIRECTORIES. ; DISALLOWED DRIVES C & D. ; ; 2.29 - 3 SEɦÿòNNNNNNNNNNNNNNNN¡¡¡þ$QŒNNNNNNNNNNNNNNNNNNNNNN¡¡¡û..n-1). This maintains more uniformity in ; parameter passing between hard disk & JADE floppy IOPBs. ; Vector I/O routines {ÊÿÂNNNNNNNNNNNNNNNN¡¡¡þ$#wNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûse of ROM primitives. ; Moved system down to 60k. ; ; 3.01 26 JUN 88 GRH ; Remove 5" floppy support. Implement in CP/M-86 B7@þHNNNNNNNNNNNNNNNNN¡¡¡þ$)˜ÝNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûlement new ID sector format. ; Implement CP/M 3.0 DPB structure in preparation for deblocking. ; ; 3.05 11-3-88 GRH ; ChanÿäNNNNNNNNNNNNNNNNN¡¡¡þ$/2{NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLUDE MONBOARD.DEF *INCLUDE ZMONROM.DEF *INCLUDE DKBTROM.DEF *INCLUDE NAKEDT.DEF *INCLUDE ISHA.DEF *INCLUDE CLOKROM.DEF LI—«ÿäNNNNNNNNNNNNNNNN¡¡¡þ$ŽNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNTERRUPT PROCESSING WHISTLE INTCPTS EQU TRUE ;ENABLE SYSTEM CALL INTERCEPT WHISTLE BOOT EQU 3 ;10H: HARD DISK, 3: 8" FLOPPY,¯ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ$ aÎNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û ; F JADE 8" FLOPPY PHYSICAL DRIVE 1 ENDIF IF BOOT = 3 ; A JADE 8" FLOPPY PHYSICAL DRIVE 0 ; B JADE 8" FLOPPY PØÕÿÜNNNNNNNNNNNNNNNN¡¡¡þ$A²NNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************** ; REVISIONS: ; ; 2.2.0 - RELEASE ; ; 2.2.3 - SWAPPED DCM & BIOS SECTORS ON DISK, ALLOWING A ; L²ÿ NNNNNNNNNNNNNNNNN¡¡¡þ$®yNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûP 83 GRH ; Changed Rev # for blocked DCM. Enables IBM system 34 ; 256 bytes per sector disks to be read. ; ; 1.10 - 23 SEP(¤ÿÂNNNNNNNNNNNNNNNN¡¡¡þ$ßNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûto monitor rom routines. ; ; 2.03 - 4 JUN 84 GRH ; Add bells & whistles again. ; Move to 61k system. ; ; 2.04 - 30 MAR 8m|ÿHNNNNNNNNNNNNNNNNN¡¡¡þ$$î�NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûIOS. ; Change single function to return drive table ptr into a BIOS function ; call using restart instruction. ; Change LOGQ³þNNNNNNNNNNNNNNNNNN¡¡¡þ$*ÍŽNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûge included data to update IOPB.PBSTAT to new configuration. ; VERSN EQU 305 ; ;********************************************W·ÿ“NNNNNNNNNNNNNNNNN¡¡¡þ$0!6NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûST ON ;============================================================================ ; ; DISK OPERATING SYSTEM ADDRESSES´%ÿìNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNæNNNNNþ€Ì�™‚gƒ4„…Ï…�†j‡9ˆ‰Ô‰¡Šo‹<Œ �×�¦Žt�A�‘Ü‘ª’w“E”•à•­–{—H˜™ã™±š›Mœ�è�µžƒŸQ ¡í¡»¢‰£V¤$¥ò¥À¦^NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ$ ¢NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ;============================================================================ NKSYS: EQU 60 ;SYSTEM SIZE IN K BYTES KBYT†YþINNNNNNNNNNNNNNNNN¡¡¡þ$ŠNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û=============================================== ; ; OTHER DECLARATIONS ; ;==================================================á#ÿòNNNNNNNNNNNNNNNN¡¡¡þ$ eÏNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ASCII CHARS ; ;============================================================================ LF: EQU 0AH CR: EQU 0DH CTRLZ:Ü“ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ$E³NNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; INITIALIZE VERSION TEXT IN RAM MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@ÝKÿùNNNNNNNNNNNNNNNN¡¡¡þ$ªxNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOLE INPUT JP COC ;CONSOLE OUTPUT JP LO ;PRINTER OUTPUT JP PUNCH JP READER JP HOME ;HOME SELECTED DRIVE JP SELDSK 5ˆÿäNNNNNNNNNNNNNNNNN¡¡¡þ$ÞNNNNNNNNNNNNNNNNNNNNNN¡¡¡û################################## BIOSSZ: DW BIOSND - BIOS ;BIOS MODULE SIZE IN BYTES BIOSST: DW BIOS ;BIOS MODULE LOAD ADDR—ÿòNNNNNNNNNNNNNNNN¡¡¡þ$%ê€NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û----------------- INIT: ; ; SET TEMPORARY STACK ; LD SP,DEFBFR ;USE PAGE 0 FOR STACK ; ; MAKE SURE ROM IS ENABLED ;þ"ÿçNNNNNNNNNNNNNNNNN¡¡¡þ$+É�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûVers ' PVERS VERSN DM CR,LF IF $ > (DIRBF + SECSZ) CONMSG **** WARNING! COLD INIT CODE BIGGER THAN DIR BUFFER ***E*þBNNNNNNNNNNNNNNNN¡¡¡þ$uñNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE: EQU 1024 CPMSZ: EQU KBYTE * NKSYS CPMBS: EQU CPMSZ - (20 * KBYTE) ; CP/M BIAS VALUE CCP: EQU CPMBS + 3400H ;ADDR OF CCP BrýþNNNNNNNNNNNNNNNNNN¡¡¡þ$š:NNNNNNNNNNNNNNNNNNNNNN¡¡¡û========================== SECSZ: EQU 128 NDRVS: EQU 6 IF BOOT = 10H ; ; 8" HARD DISK BOOT DATA ; STHD EQU 0 ;STARTÒ¡þNNNNNNNNNNNNNNNNN¡¡¡þ$0œNNNNNNNNNNNNNNNNNNNNNN¡¡¡û EQU 1AH ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE THE TRANSLATION TABLE\ÌÿäNNNNNNNNNNNNNNNN¡¡¡þ$Ü$NNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ PVERS MACRO #VERS DD DL #VERS IF DD > 9999 DB (DD / 10000) + '0' ÿòNNNNNNNNNNNNNNNN¡¡¡þ$ÿ+NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;SELECT DISK DRIVE JP SETTRK ;SET TRACK # JP SETSEC ;SET SECTOR # JP SETDMA ;SET TRANSFER ADDR JP DISKRD ;PERFORM D;^ÿäNNNNNNNNNNNNNNNNN¡¡¡þ$ uNNNNNNNNNNNNNNNNNNNNNN¡¡¡û FOR SBD ; ; CONTINUE ON WITH INIT ; INIT1: JR INIT ;################################################################Ù¥ÿÂNNNNNNNNNNNNNNNN¡¡¡þ$&¿ÓNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û CALL GETMON ; ; INIT DEFAULT DRIVE ; LD A,(DK_PROM + 1) ;USE DRIVE # PASSED IN PAGE 0 AND A,3 LD (DEFDRV),A ; ; jþrNNNNNNNNNNNNNNNN¡¡¡þ$,PNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û* ELSE DS DIRBF+SECSZ-$ ;FILL OUT DIRECTORY BUFFER TO 1 SECTOR SIZE ENDIF ;--------------------------------------ì7ÿòNNNNNNNNNNNNNNNN¡¡¡þ$FÀNNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡ûDOS: EQU CPMBS + 3C00H ;ADDRESS OF BDOS BIOS: EQU CPMBS + 4A00H ;ADDRESS OF BDOS BIOSR: EQU 1000H - BIOS ; ; PAGE 0 LOCATIn þHNNNNNNNNNNNNNNNNN¡¡¡þ$ © NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LOGICAL DRIVE OF HARD DISK NDHD EQU 3 ;LAST LOGICAL DRIVE OF HARD DISK ST8FD EQU 4 ;START LOGICAL DRIVE OF 8" FLOPPY ND8FD…þHNNNNNNNNNNNNNNNNN¡¡¡þ$­NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ GXLATE MACRO #SECTORS, #SKEW LIST OF"¤ÿòNNNNNNNNNNNNNNNN¡¡¡þ$ïNNNNNNNNNNNNNNNNNNNNNNð¡¡¡û DD DL DD % 10000 ENDIF IF DD > 999 DB (DD / 1000) + '0' DD DL DD % 1000 ENDIF DB (DD / 100) + '0' DB '.' DN6ÿÂNNNNNNNNNNNNNNNN¡¡¡þ$ÌNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûISK READ JP DISKWR ;PERFORM DISK WRITE JP LISTST ;RETURN LIST STATUS JP SECTRN ;TRANSLATE SECTOR JP BIOFUNC ;EXECUTEƒÿçNNNNNNNNNNNNNNNNN¡¡¡þ$!&DNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û############ ; ; DIRECTORY SECTOR BUFFER STARTS HERE AFTER CRUNCHING COLD START ; CODE. THIS BUFFER IS USED BY THE CP/M DIRE:GÿÈNNNNNNNNNNNNNNNNN¡¡¡þ$'ŒâNNNNNNNNNNNNNNNNNNNNNN¡¡¡û SEND SYSTEM SIGN-ON ; CLOGO: LD HL,MSGSO CALL EDITOR ; ; MODIFY COLD START VECTOR TO WARM START ; LD HL,(BIOS+4) ²jÿÉNNNNNNNNNNNNNNNN¡¡¡þ$-c)NNNNNNNNNNNNNNNNNNNNNN¡¡¡û-------------------- ; ; WARM REBOOT ENTRY LOADS CCP,BDOS FROM DISK & ; SETS UP VARIABLES ; ;------------------------------¨¾ÿNNNNNNNNNNNNNNNN¡¡¡þ$ßWNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûONS ; PAGE0: EQU 0 ;START OF CP/M RAM IOBYTE: EQU PAGE0 + 3 ;IOBYTE ADDR DEFDRV: EQU PAGE0 + 4 ;DEFAULT DRIVE PARAM ADDR BÓþrNNNNNNNNNNNNNNNN¡¡¡þ$ üXNNNNNNNNNNNNNNNNNNNNNN¡¡¡û EQU 5 ;LAST LOGICAL DRIVE OF 8" FLOPPY ENDIF IF BOOT = 3 ; ; 8" FLOPPY BOOT DATA ; STHD EQU 2 ;START LOGICAL DRžÿòNNNNNNNNNNNNNNNNN¡¡¡þ$àNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûF NXTSEC DL 1 ;;START WITH SECTOR 1 LOWEST DL 1 ;; REPT #SECTORS LIST ON DB NXTSEC LIST OFF NXTSEC DL NXTSEC + #SKEBÎÿùNNNNNNNNNNNNNNNN¡¡¡þ$ºFNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûB ((DD % 100) / 10) + '0' DB (DD % 10) + '0' ENDM SUBTTL BIOS CODE ORG BIOS ;--------------------------------------ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ$U�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û FUNCTION CALL ;############################################################################ ; ; THESE BOOT PARAMS MUST R&ÿòNNNNNNNNNNNNNNNN¡¡¡þ$"sNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCTORY CHECK ROUTINES THAT ; CHECK FOR DISK CHANGE. ; ;######################################################################ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ$(œÜNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLD (BIOS+1),HL ; ; BOOT CCP & BDOS ; JR WARM ;######################################################################ƒùÿNNNNNNNNNNNNNNNN¡¡¡þ$.6zNNNNNNNNNNNNNNNNNNNNNN¡¡¡û---------------------------- WARM: IF INTRPTS ; ; SET INTERRUPT VECTOR TABLE BASE ; LD A,HIGH INTABL LD I,A ; ; ÄÂþHNNNNNNNNNNNNNNNNN¡¡¡þ$ìfNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDOSJV EQU PAGE0 + 5 ;BDOS SYSTEM CALL ENTRY DEFBFR EQU PAGE0 + 80H ;DEFAULT BUFFER ; ; BIOS FUNCTION CALL RESTART VECTOR ;3ÿäNNNNNNNNNNNNNNNNN¡¡¡þ$ ÏiNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûIVE OF HARD DISK NDHD EQU 5 ;LAST LOGICAL DRIVE OF HARD DISK ST8FD EQU 0 ;START LOGICAL DRIVE OF 8" FLOPPY ND8FD EQU 1 ;LAð¿ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ$#ÑNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûW ;ADD SKEW FACTOR ;; IF NXTSEC > #SECTORS ;CHECK FOR OVERFLOW NXTSEC DL NXTSEC - #SECTORS ;; IF NXTSEC <= LOWEST ;CH•ZþNNNNNNNNNNNNNNNN¡¡¡þ$‰wNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û-------------------------------------- ; ; BIOS JUMP VECTOR TABLE ; ;-----------------------------------------------------½ìÿÉNNNNNNNNNNNNNNNN¡¡¡þ$f¼NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûESIDE AS DEFINED RIGHT BEFORE THE COLD INIT ; ROUTINE START AND MUST BE IN THE 1ST SECTOR. THESE 2 WORDS ARE REFERENCED ; BY*QþBNNNNNNNNNNNNNNNN¡¡¡þ$#@&NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û###### DIRBF: EQU $ ;BUFFER BEGINNING ;---------------------------------------------------------------------------- ; ;˜ÿÿÉNNNNNNNNNNNNNNNNN¡¡¡þ$)¯íNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û###### ; ; SIGN-ON MESSAGE ; ;############################################################################ MSGSO: DB CR,LF blÿlNNNNNNNNNNNNNNNNN¡¡¡þ$/KNNNNNNNNNNNNNNNNNNNNNN¡¡¡û SET INTERRUPT MODE TO 2 ; IM 2 ; ; ENABLE INTERRUPT VECTOR 7 ; IN A,(M2_IMASK) AND A,7FH OUT (M2_IMASK),A ; ; )öþ NNNNNNNNNNNNNNNN¡¡¡þ$¹5NNNNNNNNNNNNNNNNNNNNNN¡¡¡û BFUNRST EQU 28H BFUNRSV EQU PAGE0 + BFUNRST BFUNRSI EQU 0C7H + BFUNRST ; TPA: EQU 100H ;=============================çˆþBNNNNNNNNNNNNNNNN¡¡¡þ$ VþNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûST LOGICAL DRIVE OF 8" FLOPPY ENDIF ;============================================================================ ; ;I'þNNNNNNNNNNNNNNNNNN¡¡¡þ$v‚NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûECK FOR REPEAT NXTSEC DL LOWEST + 1 LOWEST DL NXTSEC ENDIF ENDIF ;; ENDM LIST ON ENDM ;@@@@@@@@@@@@@@@@@@@ߣÿ¤NNNNNNNNNNNNNNNNN¡¡¡þ$™INNNNNNNNNNNNNNNNNNNNNN¡¡¡û----------------------- JP INIT1 ;COLD START ENTRY JP WARM ;RELOAD CCP/BDOS JP CNSCK ;GET CONSOLE STATUS JP CI ;CONSYòþBNNNNNNNNNNNNNNNN¡¡¡þ$3ïNNNNNNNNNNNNNNNNNNNNNN¡¡¡û THE BOOT CODE IN ORDER TO FIND THE LOAD ADDRESS FOR THE BIOS & IT'S ; LENGTH. ; ;##########################################ÒþHNNNNNNNNNNNNNNNNN¡¡¡þ$$Ù±NNNNNNNNNNNNNNNNNNNNNN¡¡¡û INIT - COLD START ENTRY FROM BOOT MUST SET ALL BIOS PARAMS ; ;-----------------------------------------------------------¡ÄÿÎNNNNNNNNNNNNNNNNN¡¡¡þ$*ú¾NNNNNNNNNNNNNNNNNNNNNN¡¡¡û DB CPMSZ / (KBYTE * 10) + '0' DB (CPMSZ MOD (KBYTE * 10)) / KBYTE + '0' DB 'K CP/M-80 Vers 2.2',CR,LF DB 'M5b CBIOS {Kÿ$NNNNNNNNNNNNNNNNN¡¡¡þ$0NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û FINALLY ENABLE VECTORED INTERRUPTS ; IN A,(M2_STAT) OR A,M2_IEN OUT (M2_STAT),A EI ENDIF ; ; SET TEMPORARY STACwKÿ“NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÎNNNNNNNN�Ï��‚kƒ9„…Õ…¤†q‡?ˆ ‰Ú‰§Šu‹BŒ�Ü�«Žy�F�‘ᑯ’|“J”•啲–€—M˜™è™¶š„›Sœ �î�¼ž‹ŸY '¡ô¡Á¢�£\¤+¥ø¥Æ¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ%a&NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûK ; LD SP,DEFBFR ; ; INSURE MONITOR ROM STILL ENABLED ; CALL GETMON ; IF BOOT = 10H ; TEST ISHA HOST ADAPTER F9?þ NNNNNNNNNNNNNNNNN¡¡¡þ%Ë€NNNNNNNNNNNNNNNNNNNNNN¡¡¡û,(DEFBFR) CP A,86H JR C,WEROR ; ; SET UP TO LOAD CCP/BDOS ; LD HL,(DEFBFR + BD_SBDSS) ;PREFETCH BDOS TRK/SECTOR PUSùµÿ NNNNNNNNNNNNNNNN¡¡¡þ% $KNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; ELSE DONE READING SYSTEM ; JP WZRPG ; ; ; ELSE SET UP & READ BDOS ; RDBDOS: POP HL ;RESTORE BDOS TRK/SECTOR FòÿÂNNNNNNNNNNNNNNNN¡¡¡þ%7NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTCPTS ; ; PUT BDOS VECTOR INTO INTERCEPT CODE ; LD HL,(BDOS + 7) LD (BDOSV),HL ; ; NOW PUT INTERCEPT VECTOR INTO BD.6ÿòNNNNNNNNNNNNNNNN¡¡¡þ%ëüNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DISKRD: LD A,PB_READC ;SELECT READ OP JP DISKOP ;++ÈþHNNNNNNNNNNNNNNNNN¡¡¡þ%AZNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPORTED DRIVE REQUESTED THEN RETURN 0 (ERROR) ; LD A,C CP A,NDRVS RET NC ; ; STORE DRIVE # FOR FUTURE USE ; LD (BTDyÿòNNNNNNNNNNNNNNNN¡¡¡þ%%«NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIVE ; LD (DTPTR),HL ;SAVE DRIVE TABLE PTR ; ; ATTEMPT TO READ ID SECTOR ; XOR A,A ;INIT FLAG BYTE UNTIL FIRMWARE REVIíÀÿNNNNNNNNNNNNNNNNNN¡¡¡þ%+ˆ NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; SEL1: PUSH HL LD HL,(DVRTPTR) LD DE,DVRFLG ADD HL,DE EX DE,HL POP HL LD BC,DVRSIZ - DVRFLG LDIR ; ; RETURN1�ÿÂNNNNNNNNNNNNNNNN¡¡¡þ%4uNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûOR A HUNG CONDITION AND CLEAR IF TRUE ; IN A,(ISH_STATUS) ;IF HOST ADAPTER BUSY THEN BIT ISH_BSYB,A JR Z,NTHUNG ; LD A`bÿçNNNNNNNNNNNNNNNNN¡¡¡þ%Û¾NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûH HL ; LD HL,(DEFBFR + BD_SCCPS) ;FETCH CCP TRK/SECTOR LD C,L LD B,0 CALL SETSEC ; LD C,H CALL SETTRK ; LD BC,CäþÿçNNNNNNNNNNNNNNNN¡¡¡þ%qNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûROM DIRECTORY LD C,L LD B,A ;A STILL CONTAINS 0 CALL SETSEC ; LD C,H CALL SETTRK ; JR WREAD ; ; ; WARM BOOT –GÿòNNNNNNNNNNNNNNNN¡¡¡þ%� NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOS CODE ; LD HL,INTCPT LD (BDOS + 7),HL ; ; INITIALIZE CLOCK VECTORS IF CLOCK INSTALLED ; LD C,CLK_F7 ;TEST FOR BOAR*Çÿ„NNNNNNNNNNNNNNNN¡¡¡þ%¾¯NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; WRITE A DISK SECTOR ; EXIT - A= 0: OK; /0: ERR:çÿdNNNNNNNNNNNNNNNNN¡¡¡þ% TñNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûRV),A ; ; SAVE LOGON REQUEST FLAG ; LD A,E LD (LOGRQ),A ; ; COMPUTE DISK DRIVER TABLE PTR ; CALL RETDVRT ;DRIVE�ZÿœNNNNNNNNNNNNNNNN¡¡¡þ%&þWNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSED LD (IOPB + PB_ST2O),A ; CALL DISKLOG JP NZ,FDSKER ; ; IF NO ID SECTOR THEN USE DEFAULTS ; LD A,(IOPB + PB_ST2O?rÿ9NNNNNNNNNNNNNNNN¡¡¡þ%,œNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DRIVE TABLE PTR ; LD HL,(DTPTR) XOR A,A RET ; ; ; IF NOT HARD DISK THEN GO DO FLOPPY TEST ; LGDEF: LD A,(BTDRV) ÂÿòNNNNNNNNNNNNNNNN¡¡¡þ%DNNNNNNNNNNNNNNNNNNNNNN¡¡¡û,PB_CLRC LD (IOPB + PB_CMDO),A CALL XPRIM ; NTHUNG: ENDIF ; ; LOG ON DRIVE TO INIT TABLES ; LD A,(DK_PROM + 1) qEÿ�NNNNNNNNNNNNNNNNN¡¡¡þ% è�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCP CALL SETDMA ; ; READ CCP/BDOS ; WREAD: CALL DISKRD JR NZ,WEROR ;IF ERROR THEN EXIT ; ; NEXT SECTOR ; LD HL,BÚ¼ÿHNNNNNNNNNNNNNNNNN¡¡¡þ%B)NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûERROR, OUTPUT MSG & HALT ; WEROR: LD HL,MSGLE ;OUTPUT ERROR MESSAGE CALL EDITOR HALT ; ; ; BOOT OK, INIT PAGE 0 ; W¯„ÿ„NNNNNNNNNNNNNNNN¡¡¡þ%®‘NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD PRESENT CALL CLK1 ; ; IF CLOCK PRESENT THEN TURN ON CLOCK DRIVE ; OR A,A LD A,38H ;COND. JR (ON) JR NZ,CLKON ; îÿáNNNNNNNNNNNNNNNN¡¡¡þ%�žNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûOR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DISKWR: LD A,PB_WRITC ;SELECT WRITE OP <4ÿçNNNNNNNNNNNNNNNNN¡¡¡þ%!gÀNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û IS STILL IN C REGISTER LD (DVRTPTR),HL ; ; PREFETCH DRIVER EXECUTION ADDRESS FROM TABLE ; LD E,(HL) ;STORE ADDRESS Ø—ÿçNNNNNNNNNNNNNNNNN¡¡¡þ%'ÍfNNNNNNNNNNNNNNNNNNNNNNð¡¡¡û) CP A,-2 ;0: NO ID, -1: JADE ID, -2: EXTENDED ID JR NZ,LGDEF ; ; ELSE XFER ID SECTOR DATA TO TABLES ; CALL TRNONE ¨%ÿÈNNNNNNNNNNNNNNNN¡¡¡þ%-"­NNNNNNNNNNNNNNNNNNNNNN¡¡¡û IF STHD <> 0 CP A,STHD JR C,LGCKFD ENDIF CP A,NDHD + 1 JR NC,LGCKFD ; ; ELSE USE HARD DISK DEFAULTS ; CALLÕ5þBNNNNNNNNNNNNNNNN¡¡¡þ%žÓNNNNNNNNNNNNNNNNNNNNNN¡¡¡û AND A,3 ;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 DIREŒÿÂNNNNNNNNNNNNNNNN¡¡¡þ% ½ÜNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTSEC INC (HL) ; LD DE,SECSZ ;DMA := DMA + SECTOR SIZE LD HL,(BTDMA) ADD HL,DE LD (BTDMA),HL ; ; IF NOT INTO BDOS oéÿdNNNNNNNNNNNNNNNNN¡¡¡þ%QdNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûZRPG: ; ; INIT BIOS WARM START IN PAGE 0 ; LD A,0C3H LD HL,BIOS + 3 LD (PAGE0),A LD (PAGE0 + 1),HL ; ; INIT BDO²ÃÿòNNNNNNNNNNNNNNNN¡¡¡þ%ûÂNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ELSE TURN OFF CLOCK DRIVE ; LD A,18H ;UNCOND. JR (OFF) (CAUSES JUMP TO ILLEGAL) ; CLKON: LD (INHCLK),A ; ENDIF ;Î2ÿNNNNNNNNNNNNNNNNN¡¡¡þ% NNNNNNNNNNNNNNNNNNNNNN¡¡¡û JP DISKOP ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SELECT DRIVE FUNCTION ; LOGµÿäNNNNNNNNNNNNNNNN¡¡¡þ%"2“NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûINC HL LD D,(HL) INC HL LD (DVRXADR),DE ; ; FETCH FLAGS ; LD C,(HL) ; ; COMPUTE DISK PARAMETER TABLE ADDRESS ;ÿNNNNNNNNNNNNNNNNN¡¡¡þ%(ÝXNNNNNNNNNNNNNNNNNNNNNN¡¡¡û;ASSUME NO TRANSLATION ; ; IF HARD DISK OR DOUBLE DENSITY THEN NO TRANSLATION ; LD A,(DEFBFR + ID_FLGO) AND A,[1 SHL DF§ÒÿáNNNNNNNNNNNNNNNN¡¡¡þ%.wþNNNNNNNNNNNNNNNNNNNNNN¡¡¡û TRNONE ; NO XLATE LD HL,HDPBK ; ; XFER DATA TO TABLES ; SEL2: PUSH HL CALL DPBAD ; USE DEFAULT TABLE POP HL L˜ïþHNNNNNNNNNNNNNNNNN¡¡¡þ%­âNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûCTORY ; LD BC,DEFBFR ;SET XFER ADDRESS (USE DEFAULT BUFFER) CALL SETDMA ; LD BC,BD_SEC ;SET DIRECTORY SECTOR CALL SE0µÿ“NNNNNNNNNNNNNNNNN¡¡¡þ% ŽíNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTHEN READ NEXT SECTOR ; LD DE,BDOS XOR A,A SBC HL,DE JR C,WREAD ; ; ELSE IF AT BEGINNING OF BDOS THEN SET UP NEW TR4ÉÿÉNNNNNNNNNNNNNNNNN¡¡¡þ%bUNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS CALL VECTOR IN PAGE 0 ; LD HL,BDOS + 6 LD (BDOSJV),A LD (BDOSJV + 1),HL ; ; INIT BIOS CALL VECTOR IN PAGE 0 ; LDN"ÿþNNNNNNNNNNNNNNNN¡¡¡þ%ÈóNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; PASS DEFAULT DISK TO CCP ; LD A,(DEFDRV) LD C,A JP CCP SUBTTL BIOS DISK FUNCTION ROUTINES ;+++++++++++++++++++™ÞÿòNNNNNNNNNNNNNNNN¡¡¡þ%'8NNNNNNNNNNNNNNNNNNNNNN¡¡¡û-ON - SET DISK PARAMETER BLOCK ; ENTRY- C= DRIVE # ; E= 0 IF NEW SELECT ; EXIT - HL= PTR TO DPT OR 0 FOR ERROR ; ;++++++++„ÿNNNNNNNNNNNNNNNNNN¡¡¡þ%#¢NNNNNNNNNNNNNNNNNNNNNN¡¡¡û 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 NOTíÅÿdNNNNNNNNNNNNNNNNN¡¡¡þ%)îiNNNNNNNNNNNNNNNNNNNNNN¡¡¡û_DTDB] OR [1 SHL DF_HARDB] ; ; ELSE SET TRANSLATION ; CALL Z,TR8 ; ; XFER DISK DATA TO DPB ; NOX: CALL DPBAD ;GET)ÿìNNNNNNNNNNNNNNNNN¡¡¡þ%/DÏNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD BC,DPBSZ LDIR JR SEL1 ; ; ; USE 8" FLOPPY DEFAULTS ; LGCKFD: CALL TR8 LD HL,SD8PBK JR SEL2 ;**************ÔÀÿòNNNNNNNNNNNNNNNN¡¡¡þ%ø±NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTSEC ; LD BC,0 ;SET TRACK TO 0 CALL SETTRK ; CALL DISKRD JR NZ,WEROR ; ; CHECK FOR VALID BOOT DIRECTORY ; LD AKÒÿ9NNNNNNNNNNNNNNNN¡¡¡þ% zNNNNNNNNNNNNNNNNNNNNNNð¡¡¡ûACK & SECTOR ; JR Z,RDBDOS ; ; ELSE IF NOT AT BIOS THEN READ NEXT SECTOR ; LD DE,BIOS - BDOS SBC HL,DE JP C,WREAD �FþBNNNNNNNNNNNNNNNN¡¡¡þ%7NNNNNNNNNNNNNNNNNNNNNN¡¡¡û HL,BIOFUNC LD (BFUNRSV),A LD (BFUNRSV + 1),HL ; ; SET DEFAULT SECTOR BUFFER ; LD BC,DEFBFR CALL SETDMA ; IF INŸÿäNNNNNNNNNNNNNNNNN¡¡¡þ%ØÍNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; READ A DISK SECTOR ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++N¡ÿ„NNNNNNNNNNNNNNNN¡¡¡þ%rkNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ SELDSK: ; ; ASSUME ERROR ; LD HL,0 ; ; IF UNSUPŠ�þ'NNNNNNNNNNNNNNNNN¡¡¡þ%$˜5NNNNNNNNNNNNNNNNNNNNNN¡¡¡û FIRST SELECT OR LOGON INHIBITED THEN RETURN TABLE PTR ; LD A,(LOGRQ) OR A,C CPL AND A,1 RET Z ; ; ELSE LOG ON DRãÿÂNNNNNNNNNNNNNNNN¡¡¡þ%*»:NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ADDR OF DPB LD HL,DEFBFR + ID_SPTO LD BC,DPBSZ LDIR ; ; XFER DISK PHYSICAL DATA TO TABLE ; LD HL,DEFBFR + ID_FLGO ˜IþHNNNNNNNNNNNNNNNNN¡¡¡þ%0W‚NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************************** ; ; HOME DRIVE - TREAT AS SEEK TRK 0 ; EXIT - BC= 0 ; ;***×âÿ“NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÈNNNNNþ€Ì�™‚fƒ4„…Ð…ž†k‡9ˆ‰Ô‰¡Šo‹<Œ �×�¥Žs�A�‘Ý‘«’x“F”•á•®–|—I˜™ä™³š‚›Pœ�ì�¹ž‡ŸV $¡ñ¡¾¢Œ£Y¤(¥ö¥Ä¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ%VNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************************************* HOME: LD BC,0 ;*********************************§mÿINNNNNNNNNNNNNNNNN¡¡¡þ%ü°NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û****************** SETDMA: LD (BTDMA),BC XOR A,A LD (BTDMAX),A RET ;++++++++++++++++++++++++++++++++++++++++++++++++ä[ÿòNNNNNNNNNNNNNNNN¡¡¡þ% {NNNNNNNNNNNNNNNNNNNNNN¡¡¡û RET SUBTTL DISK SUPPORT ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; LOú?ÿÂNNNNNNNNNNNNNNNN¡¡¡þ%3NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûODE ; ENTRY- A= IOPB COMMAND ; EXIT - A= 0: OK; /0: ERROR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++; þrNNNNNNNNNNNNNNNN¡¡¡þ%ÜÌNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA,(DE) ;FETCH BYTE PUSH DE ;SAVE REGS PUSH BC CALL PRHEX ;OUTPUT ERROR CODE ; LD C,' ' CALL COC ; POP BC ;RESTzÁÿ$NNNNNNNNNNNNNNNNN¡¡¡þ%vjNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûETURN DPB_PTR = 0 FOR SELECT FUNCTION LD A,-1 ;RETURN -1 TO BDOS OR A,A RET ;*************************************** –þrNNNNNNNNNNNNNNNN¡¡¡þ%%œ4NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û+++++++++++ ; ; RETURN DRIVE PARAMETER BLOCK ADDR FUNCTION ; EXIT - DE= DPB PTR ; HL= ? ; ;++++++++++++++++++++++++++++++KöþNNNNNNNNNNNNNNNNNN¡¡¡þ%+¿;NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLOGICAL DRIVE ; LD A,(BTDRV) ;IF EVEN THEN ADD 0 ELSE ADD 128 RRCA AND A,80H LD E,A ;COMPUTE SECTOR LD D,0 LD HL,a=ÿÂNNNNNNNNNNNNNNNN¡¡¡þ%ENNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************************* ; ; SET TRACK # ; ENTRY- BC= TRACK # ; ;***************************************ßâÿ�NNNNNNNNNNNNNNNNN¡¡¡þ%ìŽNNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡û++++++++++++++++++++++++++++ ; ; SECTOR TRANSLATION FUNCTION ; ENTRY- DE= 0: NO XLATE, ELSE PTR TO XLATE TABLE ; BC= SECTORw®ÿ®NNNNNNNNNNNNNNNN¡¡¡þ%F(NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûGON DISK FUNCTION ; EXIT - A= 0: OK; /0: ERROR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++{Cÿ„NNNNNNNNNNNNNNNN¡¡¡þ%ª�NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û+++++++++++++ DISKOP: ; ; SET UP IOPB ; LD HL,BTTRK LD DE,IOPB + PB_TRKO LD BC,PB_BCNTO - PB_TRKO LDIR ; DISKOP2A_þrNNNNNNNNNNNNNNNN¡¡¡þ%‰ŸNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûORE REGS POP DE INC DE ;NEXT ERROR BYTE DJNZ DSKER1 ;IF NOT DONE THEN LOOP ; LD HL,DSKEB ;OUTPUT ERROR MESSAGE CALLÎ9ÿäNNNNNNNNNNNNNNNNN¡¡¡þ% cÁNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************* ; ; SET 3740 SECTOR TRANSLATION PROCEDURE ; ENTRY- (DTPTR)= MUST BE PTR TO DTP ; EXIT mKþBNNNNNNNNNNNNNNNN¡¡¡þ%&ÉgNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++ DPBAD: LD HL,(DTPTR) ;FETCH BASE ADDR LD DE,10 ;ADD OFFSET OF DPB PTR ADD H¶ÿrNNNNNNNNNNNNNNNN¡¡¡þ%,&¬NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û(IOPB + PB_SECO) ; PUSH HL ;SAVE SECTOR TO RESTORE LATER ; ADD HL,DE LD (IOPB + PB_SECO),HL ; ; EXECUTE IOPB ; knÿòNNNNNNNNNNNNNNNN¡¡¡þ%0tNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************* SETTRK: LD (BTTRK),BC RET ;*****************************************************ÆJþHNNNNNNNNNNNNNNNNN¡¡¡þ% ß¿NNNNNNNNNNNNNNNNNNNNNN¡¡¡û # TO XLATE ; EXIT - HL= XLATED SECTOR OR (BC) + 1 ; BC= UNCHANGED ; A, DE= ? ; ;++++++++++++++++++++++++++++++++++++++++>cÿgNNNNNNNNNNNNNNNNN¡¡¡þ%uNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û+ DISKLOG: ; ; SET DESCRIPTOR SECTOR XFER ADDRESS TO DEFAULT BUFFER ; LD HL,DEFBFR LD (IOPB + PB_DMAO),HL XOR A,A  ´ÿäNNNNNNNNNNNNNNNN¡¡¡þ%™¡NNNNNNNNNNNNNNNNNNNNNN¡¡¡û: LD (IOPB + PB_CMDO),A ; ; FETCH DRIVER VECTOR & EXECUTE DISK DRIVER ; DKOPLP: PUSH IY ;SAVE IY LD IY,(DVRTPTR) ;F82ÿœNNNNNNNNNNNNNNNN¡¡¡þ%º®NNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡û EDITOR ; ; GET USER RESPONSE ; CALL CI ;GET USER RESPONSE ; PUSH AF ;SAVE CHAR LD C,A ;ECHO CHAR CALL COC PO‰€þNNNNNNNNNNNNNNNNNN¡¡¡þ%!PðNNNNNNNNNNNNNNNNNNNNNN¡¡¡û- DE, HL= ? ; ;**************************************************************************** TR8: TR3740: LD DE,SDTRAN ; SE7‰ÿùNNNNNNNNNNNNNNNNN¡¡¡þ%'úVNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL,DE LD E,(HL) ;FETCH DPB PTR INC HL LD D,(HL) RET SUBTTL HARD DISK ROUTINES ;++++++++++++++++++++++++++++++++++T>ÿÉNNNNNNNNNNNNNNNN¡¡¡þ%-�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCALL XPRIM ; ; RESTORE SECTOR ; POP HL LD (IOPB + PB_SECO),HL ; ; DONE ; RET ;+++++++++++++++++++++++++++µ¶ÿrNNNNNNNNNNNNNNNN¡¡¡þ%©ãNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*********************** ; ; SET SECTOR ; ENTRY- BC= SECTOR # ; ;***********************************************************ÏÿÂNNNNNNNNNNNNNNNN¡¡¡þ% ŠìNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++ SECTRN: ; ; IF NO TRANSLATION THEN RETURN SECTOR++ ; LD A,D ;IF TABLE ADDR = 0 THENé½þrNNNNNNNNNNNNNNNNN¡¡¡þ%fTNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLD (IOPB + PB_DMAXO),A ; ; SET DESCRIPTOR SECTOR SECTOR ; LD HL,ID_SECT LD (IOPB + PB_SECO),HL ; ; SET DESCRIPTOR SÃÅþBNNNNNNNNNNNNNNNN¡¡¡þ%ÌòNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûETCH TABLE BASE ; LD HL,DKOPRET ;PUT RETURN ADDRESS ON STACK PUSH HL ; LD HL,(DVRXADR) ;FETCH DRIVER ADDRESS PREFETCHED x<ÿ�NNNNNNNNNNNNNNNNN¡¡¡þ%#9NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûP AF ; AND A,5FH ;INSURE UPPER CASE ; ; IF RETRY THEN RETURN TO CALLER ; CP A,'R' ;IF RETRY THEN RETURN TO CALLER -êÿòNNNNNNNNNNNNNNNN¡¡¡þ%"£NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTTR: LD HL,(DTPTR) LD (HL),E INC HL LD (HL),D RET ;****************************************************************hÿ“NNNNNNNNNNNNNNNNN¡¡¡þ%(êhNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++ ; ; HARD DISK DRIVER FUNCTION ; ENTRY- IY= DRIVER TABLE PTR ; EXIT - A= 0: OK; /0±ÿ!NNNNNNNNNNNNNNNN¡¡¡þ%.@ÎNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE IOPB PRIMITIVE ; EXIT - A= 0: OK, /0: ERROR ; ;++++++++++AöÿÈNNNNNNNNNNNNNNNNN¡¡¡þ%šÒNNNNNNNNNNNNNNNNNNNNNN¡¡¡û***************** SETSEC: LD (BTSEC),BC RET ;*************************************************************************ÔbÿçNNNNNNNNNNNNNNNNN¡¡¡þ% ¹ÝNNNNNNNNNNNNNNNNNNNNNN¡¡¡û NO TRANSLATION OR A,E JP Z,NOTRAN ; ; ELSE CALCULATE NEW SECTOR FROM TABLE ; EX DE,HL ADD HL,BC LD L,(HL) ; L Aÿ$NNNNNNNNNNNNNNNNN¡¡¡þ%UeNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûECTOR TRACK ; LD L,H ;H == 0 FROM LAST OPERATION (HL= 0) LD (IOPB + PB_TRKO),HL ; ; PASS COMMAND TO EXECUTOR ; LD A4…ÿòNNNNNNNNNNNNNNNN¡¡¡þ%ÿÃNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFROM TABLE JP (HL) ; ; DRIVER RETURNS HERE ; DKOPRET: POP IY ; ; IF NO ERRORS THEN RETURN ZF ; RET Z ;IF NO_EÞíþNNNNNNNNNNNNNNNN¡¡¡þ%NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûJR Z,DKOPLP ; ; ELSE IF ABORT THEN DO WARM BOOT ; CP A,'A' ;IF ABORT THEN RE-BOOT JP Z,0 ; ; ELSE IF IGNORE THEN RaPÿÂNNNNNNNNNNNNNNNN¡¡¡þ%#6’NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************ ; ; SET NO SECTOR TRANSLATION PROCEDURE ; EXIT - HL, DE= ? ; ;************************************************†îþHNNNNNNNNNNNNNNNNN¡¡¡þ%)ÙYNNNNNNNNNNNNNNNNNNNNNN¡¡¡û: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ HDEXEC: ; ; CONVERT LOGICAL DRIVET¸ÿäNNNNNNNNNNNNNNNNN¡¡¡þ%/sÿNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ XPRIM: ; ; SET FLAGS TO NONE FOR NOW ; XOR A,A LD (´3ÿòNNNNNNNNNNNNNNNN¡¡¡þ%Ï�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û*** ; ; SET TRANSFER ADDR ; ENTRY- BC= ADDRESS ; EXIT - A= 0 ; ;**********************************************************ü"þBNNNNNNNNNNNNNNNN¡¡¡þ% JNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD H,0 RET ; ; ; CONVERT FROM CP/M'S LOGICAL SECTOR {0..N-1} TO PHYSICAL SECTOR {1..N} ; NOTRAN: LD HL,1 ADD HL,BC ¾êÿNNNNNNNNNNNNNNNN¡¡¡þ%6NNNNNNNNNNNNNNNNNNNNNN¡¡¡û,PB_LOGC JR DISKOP2 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; COMMON DISK I/O C#ÌÿÉNNNNNNNNNNNNNNNNN¡¡¡þ%ïýNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûRROR THEN RETURN ; ; PRINT ERROR ; LD HL,DSKEM ;OUTPUT PREFIX CALL EDITOR ; LD DE,IOPB LD B,PB_SIZE DSKER1: LD õãþrNNNNNNNNNNNNNNNN¡¡¡þ%E[NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûETURN NO ERROR ; SUB A,'I' ;IF IGNORE THEN RETURN NO ERROR RET Z ; ; ELSE RETURN ERROR TO BDOS ; FDSKER: LD HL,0 ;RIÝÿÎNNNNNNNNNNNNNNNNN¡¡¡þ%$¯NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û**************************** TRNONE: LD DE,0 JR SETTR ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++‘ŸÿÎNNNNNNNNNNNNNNNNN¡¡¡þ%*Œ NNNNNNNNNNNNNNNNNNNNNN¡¡¡û TO PHYSICAL DRIVE ; LD A,(IY + DVRPDRV) ;0,1: DRV 0, 2,3: DRV 1 LD (IOPB + PB_DRVO),A ; ; OFFSET LOGICAL ADDRESS WITH ç¾ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ%0`²NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûIOPB + PB_FLGO),A ; ; SET XFER COUNT ; LD HL,SECSZ LD (IOPB + PB_BCNTO),HL ; ; EXECUTE THE PRIMITIVE IN ROM ; PUàƒþHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN&NNNNNNNNN�Ð��‚jƒ7„…Ò… †m‡;ˆ‰Õ‰¢Šq‹>Œ �Ø�¦Žt�B�‘ß‘­’{“I”•䕱–€—N˜™ë™ºšˆ›Wœ$�ò�ÀžŽŸ] +¡ø¡Å¢“£`¤.¥ü¥Ê¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ&úúNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSH IX LD IX,IOPB ;PASS PTR TO IOPB LD HL,DK_DSKX ;PRIMITIVE ENTRY LD A,(DK_PROM) ;FETCH PROM # CALL EXROM ;EXECUTE THEñÏÿÉNNNNNNNNNNNNNNNNN¡¡¡þ&P\NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCALL XPRIM ; ; RESTORE THE MODIFIED SECTOR SO RETRY WILL WORK ; POP HL LD (IOPB + PB_SECO),HL ; ; DONE ; RET °þÿòNNNNNNNNNNNNNNNN¡¡¡þ& ¿—NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û RET ; STACK, EXECUTE FUNCTION ADDRESS ON STACK ;######################################################################V¦ÿ9NNNNNNNNNNNNNNNN¡¡¡þ&ŸëNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û++++++++++++++++++++++++++++++ ; ; RETURN DRIVER TABLE PTR FUNCTION ; ENTRY- C= DRIVE # (E FOR FUNCTION CALL) ; EXIT - HL= DFÿ NNNNNNNNNNNNNNNN¡¡¡þ&p NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCTION ; ENTRY- IX= IOPB PTR ; EXIT - A= 0: OK ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++îÕÿHNNNNNNNNNNNNNNNNN¡¡¡þ&Ú†NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûO ASCII USING DAA TRICK ; AND A,0FH ADD A,90H DAA ADC A,40H DAA ; ; OUTPUT CHAR TO CONSOLE ; LD C,A CALL COCQAþrNNNNNNNNNNNNNNNN¡¡¡þ&%0ØNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û************************ INTCPT: LD A,C ;CHECK CALL VALIDITY CP A,41 ;IF <= 40 THEN OK ; BDOSV EQU $ + 1 JP C,BDOS + 11U²ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ&+×NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ILLEGC: PUSH BC ;SAVE FUNCTION # ; ; OUTPUT WARNING MESSAGE ; LD HL,ISCMSG ;OUTPUT WARNING CALL EDITOR ; ; OUTPUTœŽÿáNNNNNNNNNNNNNNNN¡¡¡þ&¯©NNNNNNNNNNNNNNNNNNNNNN¡¡¡û PRIMITIVE POP IX ; ; RETURN THE COMMAND RESULTS STATUS ; LD A,(IOPB + PB_STATO) OR A,A RET SUBTTL JADE FLOPP˜oÿÎNNNNNNNNNNNNNNNNN¡¡¡þ&@bNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û SUBTTL BIOS FUNCTION CALLS ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; FUNCTION DISP*:ÿçNNNNNNNNNNNNNNNN¡¡¡þ&êÄNNNNNNNNNNNNNNNNNNNNNN¡¡¡û###### ; ; BIOS FUNCTION TABLE ; ;############################################################################ BFUNTBL: DÐ0þrNNNNNNNNNNNNNNNN¡¡¡þ&|NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRIVER TABLE BASE PTR ; A, C= 0 ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; BIOS íÿòNNNNNNNNNNNNNNNN¡¡¡þ&%sNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+ EXIOPB: ; ; SET UP FOR CALL ; LD HL,DK_DSKX LD A,(DK_PROM) CALL EXROM ; ; FETCH & RETURN RESULT STATUS ; LD<ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ& Ï-NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; RETURN DATA ; POP AF RET ;*************************************************************************** ; ; N?åÿÂNNNNNNNNNNNNNNNN¡¡¡þ&&e‹NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûH ;THIS ADDR MODIFIED BY WARM BOOT RTN ; ; THE FOLLOWING CONDITIONAL JUMP IS MODIFIED TO AN UNCONDITIONAL JUMP BY ; THE WAR®ºþrNNNNNNNNNNNNNNNN¡¡¡þ&,Š@NNNNNNNNNNNNNNNNNNNNNN¡¡¡û FUNCTION # ; POP HL LD A,L CALL PRHEX ; ; OUTPUT NEW LINE ; CALL CRLF ; ; RETURN NULLS ; XOR A,A ;BC = HLxÿòNNNNNNNNNNNNNNNN¡¡¡þ&œ˜NNNNNNNNNNNNNNNNNNNNNNð¡¡¡ûY DRIVER ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; JADE 8" FLOPPY DISK DRIVE¾ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ& sSNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûATCHER ; EXIT - A= -1: ERROR, 0: OK ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ BIOFUNC:Ì…ÿdNNNNNNNNNNNNNNNNN¡¡¡þ&ÙõNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûW RETVERS ;0:RETURN VERSION # DW RETDVRTF ;1:RETURN DISK PHYSICAL CONFIGURATION TABLE PTR DW EXIOPB ;2:EXECUTE THE IOPB M)6ÿrNNNNNNNNNNNNNNNN¡¡¡þ&5MNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCALL ENTRY (E= DRIVE #) ; RETDVRTF: LD C,E ; RETDVRT: LD HL,DVR0 ;START AT 1ST TABLE ; ; IF DRIVE == 0 THEN ALREADYÜ"ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ&BNNNNNNNNNNNNNNNNNNNNNN¡¡¡û A,(IX + PB_STATO) OR A,A ;TEST RESULT FOR RETURN RET SUBTTL NON-DISK PROCEDURES ;*********************************3uÿÎNNNNNNNNNNNNNNNNN¡¡¡þ&!üNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEWLINE PROCEDURE ; ;*************************************************************************** CRLF: LD C,CR CALL COC LDœ"þHNNNNNNNNNNNNNNNNN¡¡¡þ&'VºNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûM BOOT ROUTINE IF THE CLOCK/CALENDAR BOARD IS NOT PRESENT ; IF NOT MODIFIED, THEN IT IS ALLWAYS FALSE (NOP). ; INHCLK: JR C, ‹ÿÈNNNNNNNNNNNNNNNN¡¡¡þ&-¹qNNNNNNNNNNNNNNNNNNNNNN¡¡¡û = A = 0 LD L,A LD H,A LD C,A LD B,A RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++!rÿùNNNNNNNNNNNNNNNN¡¡¡þ&NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR FUNCTION ; ENTRY- IY= DRIVER TABLE PTR ; EXIT - A= 0: OK; /0: ERROR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++ÅVÿÂNNNNNNNNNNNNNNNN¡¡¡þ& &NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; ; IF FUNCTION # NOT IN TABLE THEN RETURN -1 ; LD A,C CP A,MAXFUNCS LD A,-1 RET NC ; ; ELSE COMPUTE TABLE ENT-°ÿ NNNNNNNNNNNNNNNNN¡¡¡þ&ʸNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAXFUNCS EQU ($ - BFUNTBL) / 2 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN BIcÆÿ„NNNNNNNNNNNNNNNN¡¡¡þ&`NNNNNNNNNNNNNNNNNNNNNN¡¡¡û THERE ; LD A,C OR A,A RET Z ; ; ELSE IF ILLEGAL DRIVE THEN RETURN ERROR ; CP A,NDRVS JR C,RETDV2 ; OR A,A ~ÅÿÎNNNNNNNNNNNNNNNNN¡¡¡þ&�ÕNNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************************* ; ; OUTPUT HEX DATA TO CONSOLE SUBR ; ENTRY- A= DATA ; EXIT - A, C= ? ; ;*****¼þNNNNNNNNNNNNNNNN¡¡¡þ&"©ONNNNNNNNNNNNNNNNNNNNNN¡¡¡û C,LF JP COC IF INTCPTS SUBTTL ADDITIONAL FUNCTIONS TO SUPPORT CDOS PROGRAMS ;**************************************ÏWÿlNNNNNNNNNNNNNNNNN¡¡¡þ&(F„NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûILLEGC ; ; NOW CHECK FOR EXTENDED CALLS ; CP A,8DH ;IF RETURN VERSION THEN RETURN IT JR Z,RETCVER ; CP A,90H ;IF NOµäÿçNNNNNNNNNNNNNNNNN¡¡¡þ&.ì"NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++ ; ; CDOS RETURN VERSION FUNCTION ; MAKES CLOCK/CALENDAR WORK. ; EXIT - B= 1 ; ;++++++++++++++++++++++++++++++++++++\ÕÿINNNNNNNNNNNNNNNNN¡¡¡þ&6>NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û+++++++++++++++++++++++++ FD8EXEC: ; ; CONVERT LOGICAL DRIVE TO PHYSICAL DRIVE ; LD A,(IY + DVRPDRV) LD (IOPB + PB_DRV¾YÿNNNNNNNNNNNNNNNNN¡¡¡þ& 1NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRY ; PUSH HL ;SAVE POSSIBLE DATA ; LD HL,BFUNTBL LD A,C ADD A,A ADD A,L LD L,A LD A,0 ADC A,H LD H,A ; ; BëÿäNNNNNNNNNNNNNNNNN¡¡¡þ&ù‰NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOS VERSION # ; EXIT - HL= VERSION # IN BINARY {0.00,..655.35} ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ÿ%ÿyNNNNNNNNNNNNNNNN¡¡¡þ&S/NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRET ; ; ; ELSE COMPUTE TABLE PTR ; RETDV2: LD B,C LD DE,DVRSIZ ; RETDVL: ADD HL,DE DJNZ RETDVL ; ; RETURN NO ER"ÿ NNNNNNNNNNNNNNNN¡¡¡þ&¼äNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*********************************************************************** PRHEX: ; ; PROCESS HIGH NIBBLE 1ST ; CALL PRDIG P5ÿNNNNNNNNNNNNNNNNNN¡¡¡þ&#š~NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************* ; ; SYSTEM CALL INTERCEPT ROUTINE CHECKS FOR ILLEGAL BDOS CALLS & ; PRINTS MESSAGE IF sMÿHNNNNNNNNNNNNNNNNN¡¡¡þ&)uµNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT CLOCK THEN ERR JR C,ILLEGC ; JR Z,CLKCAL ;IF CALENDAR THEN GET IT ; CP A,92H JR C,CLKSET ;IF SET FUNCTION THEN SET C¹ÿþHNNNNNNNNNNNNNNNNN¡¡¡þ&/ßNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++ RETCVER: LD B,1 RET SUBTTL CLOCK ROUTINES ;++++++++++++++++++++++++++++++++++WÿÉNNNNNNNNNNNNNNNN¡¡¡þ&cmNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûO),A ; ; FETCH SECTOR DATA ; LD HL,(IOPB + PB_SECO) PUSH HL ;SAVE FOR XPRIM RESTORE ; ; ; EXECUTE THE IOPB ; h»ÿÂNNNNNNNNNNNNNNNN¡¡¡þ& Œ¦NNNNNNNNNNNNNNNNNNNNNNð¡¡¡û EXECUTE TABLE ADDRESS ; LD A,(HL) INC HL LD H,(HL) LD L,A ; EX (SP),HL ;PUT CALLER'S DATA IN HL, FUNCTION ADDR ONê>þBNNNNNNNNNNNNNNNN¡¡¡þ&¬ÚNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++ RETVERS: LD HL,VERSN XOR A,A ;RETURN NO ERROR RET ;++++++++++++++++++++++++++++++++++++++++++++++ñ¡þrNNNNNNNNNNNNNNNNN¡¡¡þ&CNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûROR ; XOR A,A RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE IOPB FUNȯÿòNNNNNNNNNNNNNNNN¡¡¡þ&é·NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; SWAP HIGH & LOW NIBBLES ; PRDIG: RLCA RLCA RLCA RLCA ; ; SAVE DATA FOR RETURN ; PUSH AF ; ; CONVERT T‡.ÿ'NNNNNNNNNNNNNNNNN¡¡¡þ&$éNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûILLEGAL. ALSO IMPLEMENTS CDOS CLOCK/CALENDAR ; SYSTEM CALLS FOR ASMB. ; ;***************************************************KþÿçNNNNNNNNNNNNNNNNN¡¡¡þ&* æNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLOCK ; JR Z,CLKTIM ;IF TIME THEN GET IT ; CP A,93H JR Z,CLKRDC ;IF READ CLOCK THEN GET IT ; ; ILLEGAL SYSTEM CALL ; ‡ÄÿäNNNNNNNNNNNNNNNNN¡¡¡þ&0Ì^NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN CALENDAR FUNCTION 90H ; EXIT - A= DAY ; B= MONTH ; C= YEAR ; L= Dí ÿäNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNþ€Ì�™‚fƒ4„…Ð…Ÿ†l‡:ˆ‰Ö‰£Šq‹>Œ �Ù�§Žu�B�‘Þ‘¬’z“H”•ã•°–—L˜™è™·š…›Sœ �î�»ž‰ŸW %¡ò¡À¢Ž£[¤)¥÷¥Å¦ÞNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ&ÍÊNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûAY OF WEEK ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ CLKCAL: LD HL,CLK_CAL ;ROM ENTRYPvÿìNNNNNNNNNNNNNNNNN¡¡¡þ&glNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*********************** ; ; CLOCK SET FUNCTION 91H ; ENTRY- DE= CLOCK IMAGE BUFR PTR (13 BYTES LONG) ; ;*******************r‘ÿdNNNNNNNNNNNNNNNN¡¡¡þ& ˆ§NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûM ; ; ROM PROCEDURE RETURNS HERE ; EXROMR: PUSH AF ;SAVE RETURN VALUE CALL GETMON ;RESELECT MONITOR ROM ; POP AF ;ædÿrNNNNNNNNNNNNNNNN¡¡¡þ&¨ÛNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++ CNSCK: IF USEMON CALL GETMON JP MR_CONSTS ELSE IN A,(NT_STAT) ;IF DAT&YÿäNNNNNNNNNNNNNNNN¡¡¡þ&GNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ NTOST: IN A,(NT_STAT) CPL ;REVERSE SENSE AND A,1 SHL NT…þINNNNNNNNNNNNNNNNN¡¡¡þ&í¶NNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************************************************************* LO: IF USEMON CALL GETMON JP MR_LSTOUT ELSE Ø(þrNNNNNNNNNNNNNNNN¡¡¡þ&%èNNNNNNNNNNNNNNNNNNNNNN¡¡¡û***************************** ; ; MESSAGE EDITOR ; ENTRY- HL= TEXT PTR (BIT 7= 1: TERMINATOR) ; EXIT - REGS= ? ; ;********'0ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ&+$çNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûV),A CALL GETMON ; ; PRINT PROMPT ; LD HL,ITMSG IQCONT: CALL EDITOR ; LD HL,IQMSG ;QUERY USER CALL EDITOR ; ; ß·ÿÂNNNNNNNNNNNNNNNN¡¡¡þ&˜™NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û POINT JR CLK2 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN TIME FUNCTION 9 <ÿçNNNNNNNNNNNNNNNNN¡¡¡þ&wRNNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************************************************* CLKSET: LD C,CLK_F2 ; CLK1: LD HL,CLK_FUN ; CLK2: LD A,CLK_ROM ûÿÈNNNNNNNNNNNNNNNN¡¡¡þ&ÝôNNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡ûRETURN VALUE RET SUBTTL CHAR I/O ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2$ÿòNNNNNNNNNNNNNNNN¡¡¡þ&1LNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA NOT READY THEN RETURN 0 AND A,1 SHL NT_READY TTOST1: RET Z LD A,-1 ;ELSE RETURN -1 RET ENDIF ;***************’CÿòNNNNNNNNNNNNNNNN¡¡¡þ&CNNNNNNNNNNNNNNNNNNNNNN¡¡¡û_BUSY JR TTOST1 ENDIF ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; READER DRIVeþ$NNNNNNNNNNNNNNNNN¡¡¡þ& øNNNNNNNNNNNNNNNNNNNNNN¡¡¡û RET ENDIF ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN LIST DEVICE STATU¬£ÿ„NNNNNNNNNNNNNNNN¡¡¡þ&&R»NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û******************************************************************** EDITOR: LD C,(HL) ;MESSAGE EDIT LOOP PUSH HL ;SAVE PTR þrNNNNNNNNNNNNNNNN¡¡¡þ&,½pNNNNNNNNNNNNNNNNNNNNNN¡¡¡û GET & ECHO USER INPUT ; CALL CI ; PUSH AF LD C,A CALL COC POP AF ; ; IF OPTION IS CTRL-C THEN WARM BOOT ; CPÔuÿòNNNNNNNNNNNNNNNN¡¡¡þ&«¨NNNNNNNNNNNNNNNNNNNNNN¡¡¡û2H ; EXIT - A= SECONDS ; B= MINITS ; C= HOURS ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Z/ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ& DcNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; FALL INTO ROM EXECUTER ; ENDIF ;**************************************************************************** ºÇÿäNNNNNNNNNNNNNNNNN¡¡¡þ&îÅNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; CONSOLE INPUT ; EXIT - A= CHAR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ CI: LdÿòNNNNNNNNNNNNNNNN¡¡¡þ&}NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************************* ; ; CONSOLE OUTPUT ; ENTRY- C= CHAR TO OUTPUT ; ;************FþNNNNNNNNNNNNNNNNNN¡¡¡þ&!rNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûER - DUMMY ; EXIT - A= CTRL-Z ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ READER: LD A,CèCÿÈNNNNNNNNNNNNNNNNN¡¡¡þ&!Ë,NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS ; EXIT - A= 0: BUSY, FFH:READY ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ LISTST: !ZÿäNNNNNNNNNNNNNNNNN¡¡¡þ&'aŠNNNNNNNNNNNNNNNNNNNNNN¡¡¡û RES 7,C ;CLEAR BIT 7 FOR OUTPUT CALL COC ; POP HL BIT 7,(HL) ;IF BIT 7 SET THEN RETURN RET NZ ; INC HL ;ELSE P©­ÿ“NNNNNNNNNNNNNNNN¡¡¡þ&-ŽANNNNNNNNNNNNNNNNNNNNNN¡¡¡û A,3 ;IF CTRL-C THEN WARM BOOT JP Z,PAGE0 ; ; IF OPTION IS YES THEN WARM BOOT ; AND A,5FH ;IGNORE CASE ; CP A,'Y' TiÿòNNNNNNNNNNNNNNNN¡¡¡þ&2?NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++ CLKTIM: LD HL,CLK_TIM JR CLK2 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; îÿùNNNNNNNNNNNNNNNN¡¡¡þ& 0NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ; EXECUTE ROM ROUTINE ; ENTRY- HL= ENTRY ADDRESS ; A= ROM # ; EXIT - ? ; ;*********************************************@FÿÉNNNNNNNNNNNNNNNNN¡¡¡þ&ýˆNNNNNNNNNNNNNNNNNNNNNN¡¡¡û IF USEMON CALL GETMON ;SWITCH IN MONITOR ROM JP MR_CONIN ;USE MONITOR ELSE CALL CNSCK ;IF NO CHAR RDY THEN WAIT J‡oÿrNNNNNNNNNNNNNNNN¡¡¡þ&W.NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û**************************************************************** COC: IF USEMON CALL GETMON JP MR_CONOUT ELSE CALéþNNNNNNNNNNNNNNNNNN¡¡¡þ&¸åNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTRLZ ;FAKE EOF ;**************************************************************************** ; ; PUNCH DRIVER ; ENTRY- þrNNNNNNNNNNNNNNNN¡¡¡þ&"žNNNNNNNNNNNNNNNNNNNNNN¡¡¡û IF USEMON CALL GETMON JP MR_LSTSTS ELSE LD A,-1 RET ENDIF ;***********************************************ÔïÿäNNNNNNNNNNNNNNNNN¡¡¡þ&(q´NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûRINT NEXT CHAR JR EDITOR IF INTRPTS SUBTTL INTERRUPTS ;---------------------------------------------------------------“œÿ�NNNNNNNNNNNNNNNNN¡¡¡þ&.ÛNNNNNNNNNNNNNNNNNNNNNN¡¡¡û JP Z,PAGE0 ; ; IF OPTION IS INTERRUPT THEN EXECUTE RESTART 7 ; CP A,'I' JR NZ,ITRAP1 ; POP BC ;RESTORE REGS 1ST ´ýÿÈNNNNNNNNNNNNNNNNN¡¡¡þ&NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; READ CLOCK TIME FUNCTION 93H ; ENTRY- DE= PTR TO 13 BYTE BUFFER FOR CLOCK DATA ; ;+++++++++++++++++++++++++++++++++++++++++ ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ& "NNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************* EXROM: AND A,M2_RSMK ;MASK OUT UNUSED BITS OUT (M2_RSEL),A ; PUSH HL ;SAVE ROM ENTRY VEô+ÿòNNNNNNNNNNNNNNNNN¡¡¡þ&ιNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR Z,CI IN A,(NT_DATA) ;ELSE RETURN CHAR RET ENDIF ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++æ9þ9NNNNNNNNNNNNNNNN¡¡¡þ&dNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL NTOST ;IF BUSY THEN WAIT OR A,A JR Z,COC LD A,C OUT (NT_DATA),A RET ;+++++++++++++++++++++++++++++++++++++++¾šþrNNNNNNNNNNNNNNNN¡¡¡þ&‹ÔNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûC= CHAR TO OUTPUT ; ;**************************************************************************** PUNCH: RET ;**********•ÜþBNNNNNNNNNNNNNNNN¡¡¡þ&#­NNNNNNNNNNNNNNNNNNNNNNNð¡¡¡û***************************** ; ; GET MONITOR PROM SUBR ; EXIT - A= ? ; ;**************************************************úãþHNNNNNNNNNNNNNNNNN¡¡¡þ&)B…NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û------------- ; ; USER INTERRUPT ; ;---------------------------------------------------------------------------- ITRAP: ; ÆxÿÈNNNNNNNNNNNNNNNNN¡¡¡þ&/è#NNNNNNNNNNNNNNNNNNNNNN¡¡¡û POP HL POP AF JP 0038H ; ; IF OPTION IS MONITOR THEN EXECUTE MONITOR TRAP ; ITRAP1: CP A,'M' JR NZ,ITRAPR ; POP žmÿäNNNNNNNNNNNNNNNN¡¡¡þ&T]NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++ CLKRDC: LD C,CLK_F1 JR CLK1 ;*****************************************************hµÿÂNNNNNNNNNNNNNNNN¡¡¡þ& »–NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCTOR ; LD HL,EXROMR ;PUT RETURN ADDR ON STACK EX (SP),HL ;SWAP RETURN ADDRESS WITH ROM ENTRY VECTOR JP (HL) ;EXECUTE ROX÷ÿùNNNNNNNNNNNNNNNN¡¡¡þ&›êNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++ ; ; RETURN CONSOLE STATUS ; EXIT - A= 0: NOT READY ; FFH: CHAR READY ; ;+++++++++++++++++++++++++++++++++nþINNNNNNNNNNNNNNNNN¡¡¡þ&t!NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++ ; ; RETURN CONSOLE OUTPUT READY STATUS ; EXIT - A= 0: BUSY, FFH: READY ; ;+++++++++++ÉbþNNNNNNNNNNNNNNNN¡¡¡þ&Þ‡NNNNNNNNNNNNNNNNNNNNNNð¡¡¡û****************************************************************** ; ; PRINTER DRIVER ; ENTRY- C= CHAR TO OUTPUT ; ;*******fØÿ“NNNNNNNNNNNNNNNNN¡¡¡þ&$4ÙNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û************************** GETMON: LD A,MR_RNUM OUT (M2_RSEL),A RET ;***********************************************Ï#ÿçNNNNNNNNNNNNNNNNN¡¡¡þ&*ÖNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; SAVE REGS FIRST ; PUSH AF PUSH HL PUSH BC ; ; SAVE CURRENT ROM & GET MONITOR ROM ; IN A,(M2_RSEL) LD (ROMSA«ÿNNNNNNNNNNNNNNNNN¡¡¡þ&0ûnNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBC POP HL POP AF JP 0F824H ; ; ELSE RESTORE REGS & RETURN ; ITRAPR: LD A,(ROMSAV) ;RESTORE ROM # OUT (M2_RSEL),AóGÿäNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN&NNNNNNNNN�Ð��‚jƒ8„…Ó…¡†n‡<ˆ ‰Ø‰¥Šs‹@Œ�Û�©Žx�F�‘ᑯ’}“K”•敳–�—N˜™ê™¸š†›Uœ"�ð�½ž‹ŸY '¡ô¡Â¢�£]¤+¥ù¥Ç¦žNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ'ŒNNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; POP BC POP HL POP AF EI ;RE-ENABLE INTERRUPTS RET ;--------------------------------------------------------u+þINNNNNNNNNNNNNNNNN¡¡¡þ'&èNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û################################################# ; ; COMMON I/O PARAMETER BLOCK ; ;########################################wˆþ NNNNNNNNNNNNNNNN¡¡¡þ' É#NNNNNNNNNNNNNNNNNNNNNN¡¡¡û1 DVRDTYP DS 1 ;RESERVED FOR DISK TYPE DVRCYLS DS 2 ;DISK CYLINDERS DVRHDS DS 1 ;HEADS ; ; DEFINE THE STRUCTURE SIZE ; @ ÿÂNNNNNNNNNNNNNNNN¡¡¡þ'é_NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE DW #CY ;;CYLS DB #HD ;;HEADS LIST OFF ENDM DVR0: IF BOOT = 10H ALLDRV HDEXEC,4,60H,32,1,32,1,32,1,10H,256,4 ÿdNNNNNNNNNNNNNNNN¡¡¡þ'”NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLT 8" FLOPPY DISK PARAMETER BLOCK ; IBM 3740 SINGLE DENSITY FORMAT ; ;#######################################################ÀÿäNNNNNNNNNNNNNNNNN¡¡¡þ'¬2NNNNNNNNNNNNNNNNNNNNNN¡¡¡û#################################################### HDPBK: DW 128 ;SECTORS PER TRACK (LOGICAL) (SPT) DB 5 ;BLOCK SHIFT FAC—‹ÿòNNNNNNNNNNNNNNNN¡¡¡þ'%FlNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBOUNDARY ; IF $ AND 0FFH DS 100H - ($ AND 0FFH) ENDIF INTABL: REPT 7 ;1ST 7 ARE UNSUPPORTED LIST OFF DW ILLINT U¹ÿNNNNNNNNNNNNNNNNN¡¡¡þ'+ecNNNNNNNNNNNNNNNNNNNNNN¡¡¡û#################################################### ; ; DRIVE PARAMETER HEADER AREA ; 1 PER DRIVE ; ;#####################;ÿœNNNNNNNNNNNNNNNN¡¡¡þ'ÙNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û-------------------- ; ; UNSUPPORTED INTERRUPT ; ;--------------------------------------------------------------------------_ýÿçNNNNNNNNNNNNNNNNN¡¡¡þ'6ÖNNNNNNNNNNNNNNNNNNNNNN¡¡¡û#################################### IOPB: REPT PB_SIZE LIST OFF DB 0 LIST ON ENDM ;##############################™ÿçNNNNNNNNNNNNNNNN¡¡¡þ'œpNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDVRSIZ DS 0 ENDM ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; MACRO TO DEFINE THE DR�žÿrNNNNNNNNNNNNNNNN¡¡¡þ'pÈNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ALLDRV HDEXEC,4,60H,32,1,32,1,32,1,10H,256,4 ALLDRV HDEXEC,5,60H,32,1,32,1,32,1,10H,256,4 ALLDRV HDEXEC,5,60H,32,1,32,1,32,nÏþ NNNNNNNNNNNNNNNN¡¡¡þ'SÇNNNNNNNNNNNNNNNNNNNNNN¡¡¡û##################### SD8PBK: DW 26 ;SECTORS PER TRACK DB 3 ;BLOCK SHIFT FACTOR DB 7 ;BLOCK MASK DB 0 ;NULL MASK DW‡ºÿINNNNNNNNNNNNNNNNN¡¡¡þ' ¹™NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTOR (BSH) DB 31 ;BLOCK MASK (BLM) DB 1 ;NULL MASK (EXM) DW 1015 ;DISK SIZE (CLUSTERS -1) (DSM) DW 1152 / 2 ;DIRE|ËÿáNNNNNNNNNNNNNNNN¡¡¡þ'&?NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûLIST ON ENDM ; DW ITRAP ;INT 8 IS USER INTERRUPT ENDIF ;##########################################################±�ÿNNNNNNNNNNNNNNNN¡¡¡þ',üôNNNNNNNNNNNNNNNNNNNNNN¡¡¡û####################################################### ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@íèÿòNNNNNNNNNNNNNNNN¡¡¡þ'ê,NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û-- ILLINT: PUSH AF ;SAVE ALL 8080 REGS PUSH HL PUSH BC LD HL,ILLIM ;NOTIFY USER OF INT JR IQCONT SUBTTL INITIAõ¹ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ' çNNNNNNNNNNNNNNNNNNNNNN¡¡¡û############################################## ; ; DISK DRIVER TABLES ; ;###################################################žˆÿgNNNNNNNNNNNNNNNNN¡¡¡þ'¯ANNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIVER TABLE RECORD ; ENTRY- #DADD= DRIVER ADDRESS ; #PD= PHYSICAL DRIVE # ; #FG= DRIVE FLAGS (IDFLGO) ; #S0= TRK 0 SPT ; òÿrNNNNNNNNNNNNNNNN¡¡¡þ'CùNNNNNNNNNNNNNNNNNNNNNN¡¡¡û1,10H,256,4 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,1 ENDIF IF BOOT = 3 AL%ÿáNNNNNNNNNNNNNNNN¡¡¡þ'`öNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û 242 ;DISK SIZE -1 DW 63 ;DIRECTORY MAX DB 11000000B ;ALLOC 0 DB 0 ;ALLOC 1 DW 16 ;CHECK SIZE DW 2 ;TRACK OFFSET ¹ÃÿÎNNNNNNNNNNNNNNNNN¡¡¡þ'!ЍNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûCTORY MAX (DRM) DB 0FFH ;ALLOCATION 0 (AL0) DB 10000000B ;ALLOCATION 1 (AL1) DW 0 ;CHECK SIZE (CKS) DW 2 ;TRAΨÿNNNNNNNNNNNNNNNNN¡¡¡þ'' NNNNNNNNNNNNNNNNNNNNNN¡¡¡û################## ; ; MESSAGES ; ;############################################################################ MSGLE: DM×LÿÈNNNNNNNNNNNNNNNN¡¡¡þ'-ÏÅNNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@ ; ; GENERATE A DISK PARAMETER TABLE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@æ—ÿÂNNNNNNNNNNNNNNNN¡¡¡þ's»NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLIZED DATA ;############################################################################ ; ; 3740 SECTOR TRANSLATION TABLE ;Ä®ÿÂNNNNNNNNNNNNNNNN¡¡¡þ' P´NNNNNNNNNNNNNNNNNNNNNN¡¡¡û######################### STRUCT 0 DVRADD DS 2 ;START ADDRESS OF DISK DRIVER DVRFG DS 1 ;FLAGS (BIT 0= 1: INHIBIT LOGON) DV¥/ÿrNNNNNNNNNNNNNNNNN¡¡¡þ'¼ NNNNNNNNNNNNNNNNNNNNNN¡¡¡û #Z0= TRK 0 SIZE ; #S1= TRK 1 SPT ; #Z1= TRK 1 SIZE ; #SD= DATA TRKS SPT ; #ZD= DATA TRKS SIZE ; ;@@@@@@@@@@@@@@@@@@@@(ôþNNNNNNNNNNNNNNNN¡¡¡þ'ªNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLDRV FD8EXEC,0,0,26,0,26,0,26,0,0,77,1 ALLDRV FD8EXEC,1,0,26,0,26,0,26,0,0,77,1 ALLDRV HDEXEC,4,60H,32,1,32,1,32,1,10H,256,4'ÿaNNNNNNNNNNNNNNNN¡¡¡þ'ùaNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û DB 0 ;PHYSICAL RECORD SHIFT FACTOR DB 0 ;PHYSICAL RECORD MASK ; ; DEFAULT DISK PHYSICAL PARAMETERS ; DB 0 ;FLAGS ý¤þ NNNNNNNNNNNNNNNN¡¡¡þ'"ßûNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCK OFFSET (OFF) ; ; ; DB 01100000B ;FLAGS 256 BPS, HARD, SSSD DB 32,1,32,1,32,1 ;32 SPT, 256 BPS DB 10H ;TYPE DW 2±³ÿäNNNNNNNNNNNNNNNNN¡¡¡þ'(00NNNNNNNNNNNNNNNNNNNNNN¡¡¡û CR,LF,'LOAD ERROR' ; DSKEM: DB CR,LF,'Disk Error Status:' DM CR,LF,'CM DR TL TH SL SH FG AL AH AX CL CH ST S1 S2 S3',CR,LF +VþNNNNNNNNNNNNNNNNNN¡¡¡þ'.š–NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û@@@@@@@ ALLDPH: MACRO #D LIST ON D#D(DD)DPH: ;DRIVE PARAMETER HEADER FOR DRIVE #D(DD) DW 0 ;;SECTOR TRAN TBL (OR 0 IF NRþHNNNNNNNNNNNNNNNNN¡¡¡þ'@ŠNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û **** CP/M SINGLE DENSITY **** ; ;############################################################################ SDTRAN: GXLATEWþ§NNNNNNNNNNNNNNNNN¡¡¡þ' c…NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRPDRV DS 1 ;PHYSICAL DRIVE ; ; THE FOLLOWING MAY BE BROUGHT OFF DISK DESCRIPTOR OR FROM DEFAULT TABLES ; DVRFLG DS 1 ;DISKÝÿ$NNNNNNNNNNNNNNNNN¡¡¡þ'�=NNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ALLDRV MACRO #DADD,#PD,#FG,#S0,#Z0,#S1,#Z1,#SD,#ZD,#DT,#CY,#HD LIS‰ÿâNNNNNNNNNNNNNNNN¡¡¡þ'%›NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ALLDRV HDEXEC,4,60H,32,1,32,1,32,1,10H,256,4 ALLDRV HDEXEC,5,60H,32,1,32,1,32,1,10H,256,4 ALLDRV HDEXEC,5,60H,32,1,32,1,3ÇÜÿòNNNNNNNNNNNNNNNN¡¡¡þ'ÊPNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DB 26,0,26,0,26,0 ;SECTORS PER TRACK, SECTOR SIZE (128) DB 0 ;TYPE DW 77 ;CYLS DB 1 ;HEADS ;#####################3ÿáNNNNNNNNNNNNNNNN¡¡¡þ'#ìÊNNNNNNNNNNNNNNNNNNNNNN¡¡¡û56 ;CYLS DB 4 ;HEADS ;############################################################################ ; ; MODE 2 INTERRUæÌÿ“NNNNNNNNNNNNNNNNN¡¡¡þ')NNNNNNNNNNNNNNNNNNNNNN¡¡¡û DSKEB: DM CR,LF,'Abort, Ignore, Retry, (BDOS) - ' ; IF INTCPTS ISCMSG: DM CR,LF,'ILL SYS CALL, #= ' ENDIF IF INTRIiÿHNNNNNNNNNNNNNNNNN¡¡¡þ'/©§NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûO XLATE) DW 0 ;;SCRATCH AREA DW 0 ;;" DW 0 ;;" DW DIRBF ;;DIRECTORY BUFFER PTR DW D#D(DD)DPB ;;DRIVE PARAMETER BLKt’ÿäNNNNNNNNNNNNNNNN¡¡¡þ'ÙNNNNNNNNNNNNNNNNNNNNNN¡¡¡û 26,6 ; DB 1,7,13,19,25,5,11,17,23,3,9,15 ; DB 21,2,8,14,20,26,6,12,18,24,4,10 ; DB 16,22 ;###########################ôiþBNNNNNNNNNNNNNNNN¡¡¡þ' úNNNNNNNNNNNNNNNNNNNNNN¡¡¡û FLAGS DVR0SPT DS 1 ;TRK 0 SECTORS PER TRK DVR0SZ DS 1 ;TRK 0 SECTOR SIZE DVR1SPT DS 1 DVR1SZ DS 1 DVRDSPT DS 1 DVRDSZ DS %ÿœNNNNNNNNNNNNNNNN¡¡¡þ'ÚnNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT ON DW #DADD DB 0 ;;LOGON INHIBIT FLAG (LOGON ENABLED) DB #PD DB #FG DB #S0,#Z0,#S1,#Z1,#SD,#ZD DB #DT ;;DISK TYP�©ÿ¤NNNNNNNNNNNNNNNNN¡¡¡þ'5¥NNNNNNNNNNNNNNNNNNNNNN¡¡¡û2,1,10H,256,4 ENDIF LIST ON ;############################################################################ ; ; DEFAU9ÎþrNNNNNNNNNNNNNNNN¡¡¡þ'ŸNNNNNNNNNNNNNNNNNNNNNN¡¡¡û####################################################### ; ; DEFAULT 8" HARD DISK PARAMETER BLOCK ; ;########################pþNNNNNNNNNNNNNNNNNN¡¡¡þ'$u]NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPT VECTOR TABLE ; ;############################################################################ ; ; START ON AN EVEN PAGE ”‘þNNNNNNNNNNNNNNNNNN¡¡¡þ'*VRNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPTS ITMSG DM CR,LF,'User' ILLIM DM CR,LF,'Ill.' IQMSG DM ' Int. Abort? (Y/N/I/M) - ' ENDIF ;########################yÿÉNNNNNNNNNNNNNNNNN¡¡¡þ'0ºêNNNNNNNNNNNNNNNNNNNNNN¡¡¡û PTR IF ((DD - 1) <= NDHD) AND ((DD - 1) >= STHD) DW 0 ;;NO CHECKS ON HARD DISK ELSE DW D#D(DD)CHK ;;DRIVE DISK CHE¾™ÿÈNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNþ€Ì�š‚gƒ5„…Ó… †m‡;ˆ‰Ö‰£Šq‹?Œ �Ú�©Žw�E�‘à‘®’{“I”•䕱–—L˜™è™·š…›Sœ �î�»žŠŸX &¡ó¡Á¢�£\¤*¥ø¥Æ¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ'»~NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCKSUMS ARRAY PTR ENDIF DW D#D(DD)ALL ;;DRIVE CLUSTER ALLOCATION BIT MAP PTR LIST OFF ENDM ; ; DEFINE THE DATA ; ÂOÿÉNNNNNNNNNNNNNNNNN¡¡¡þ'ØNNNNNNNNNNNNNNNNNNNNNN¡¡¡û########################### ; ; VARIABLES ; ;############################################################################ ;iþdNNNNNNNNNNNNNNNN¡¡¡þ' þNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD LIST ON IF ((DD - 1) >= STHD) AND ((DD - 1) <= NDHD) D#D(DD)ALL: DS 127 ;ALLOCATION BIT MAP FOR 8" HARD DRIVE #D(DD) kÿùNNNNNNNNNNNNNNNN¡¡¡þ'ÞoNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCLUSTER SIZE ; 1K= 3, 2K= 4, 4K= 5, 8K= 6, 16K= 7 DPBBLM DS 1 ;BLM- BLOCK MASK ; 1K = 7, 2K= 15, 4K= 31, 8K= 63, 16K= 1ä«þ NNNNNNNNNNNNNNNN¡¡¡þ'1¤NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEC ; 0: 128, 1: 256, 2: 512, 3: 1024 DPBPHM DS 1 ;PHM- PHYSICAL RECORD MASK BASED ON BYTES/SEC ; 0: 128, 1: 256, 3: 5125�ÿ“NNNNNNNNNNNNNNNNN¡¡¡þ'›NNNNNNNNNNNNNNNNNNNNNN¡¡¡û## ; STRUCT 0 DVRADD DS 2 ;START ADDRESS OF DISK DRIVER DVRFG DS 1 ;FLAGS (BIT 0= 1: INHIBIT LOGON) DVRPDRV DS 1 ;PHYSICALQHÿ9NNNNNNNNNNNNNNNNN¡¡¡þ'%q\NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAL DRIVE 0 ; B SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 0 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; D SIDE 2 & 3 OF €¢ÿáNNNNNNNNNNNNNNNN¡¡¡þ'+RSNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAL DRIVE 1 ; F SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ; G JADE 8" FLOPPY PHYSICAL DRIVE 0 ; H JADE 8" FLOPPY PHYSICAL8þ NNNNNNNNNNNNNNNN¡¡¡þ'î-NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDD DL 1 REPT NDRVS LIST OFF ALLDPH 0123456789ABCDEF DD DL DD + 1 LIST ON ENDM ; ; LAST OF INITIALIZED CODE READ³úÿçNNNNNNNNNNNNNNNNN¡¡¡þ'æNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û DTPTR: DS 2 ;DRIVE TABLE PTR LOGRQ: DS 1 ;LOG ON REQUEST REG. DVRTPTR DS 2 ;DRIVE DRIVER TABLE BASE ADDRESS PTR DVRXADR DS 2>·ÿHNNNNNNNNNNNNNNNN¡¡¡þ'«@NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ENDIF IF ((DD - 1) >= ST8FD) AND ((DD - 1) <= ND8FD) D#D(DD)ALL: DS 57 ;ALLOCATION BIT MAP FOR 8" DRIVE #D(DD) D#D(DD)CHz7ÿùNNNNNNNNNNNNNNNN¡¡¡þ'GøNNNNNNNNNNNNNNNNNNNNNN¡¡¡û27 DPBEXM DS 1 ;EXM- EXTENT MASK ; DSM < 256 : 1K= 0, 2K= 1, 4K= 3, 8K= 7, 16K= 15 ; DSM > 255 : 2K= 0, 4K= 1, 8K= 3, 1¿ÈÿùNNNNNNNNNNNNNNNN¡¡¡þ'd÷NNNNNNNNNNNNNNNNNNNNNN¡¡¡û, 7: 1024 DPBSZ DS 0 ENDM ; ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATEãçÿINNNNNNNNNNNNNNNNN¡¡¡þ' Ž©NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û DRIVE # ; ; THE FOLLOWING MAY BE BROUGHT OFF DISK DESCRIPTOR OR FROM DEFAULT TABLES ; DVRFLG DS 1 ;DISK FLAGS DVR0SPT DS8oÿÎNNNNNNNNNNNNNNNNN¡¡¡þ'&$NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHARD DISK PHYSICAL DRIVE 1 ; E JADE 8" FLOPPY PHYSICAL DRIVE 0 ; F JADE 8" FLOPPY PHYSICAL DRIVE 1 ENDIF IF BOOT =ÕÂþBNNNNNNNNNNNNNNNN¡¡¡þ',ËÄNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û DRIVE 1 ENDIF ; ;************************************************************* ; ; REVISION HISTORY: ; ; 3.00 - 26 ì§þrNNNNNNNNNNNNNNNN¡¡¡þ'ÝNNNNNNNNNNNNNNNNNNNNNN¡¡¡û FROM DISK ; BIOSND EQU $ SUBTTL UNINITIALIZED DATA AREA ;###############################################################-sÿÈNNNNNNNNNNNNNNNNN¡¡¡þ' 2×NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;DRIVE DRIVER EXECUTION ADDRESS ROMSAV DS 1 ;ROM SWAP SAVE OF ORIGINAL ROM ;#############################################ÇþHNNNNNNNNNNNNNNNNN¡¡¡þ'˜qNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûK DS 32 ;DIRECTORY CHECKSUMS STORAGE (1 BYTE PER SECTOR) ENDIF LIST OFF ENDM ; ; RESERVE THE DATA SPACE ; DD DL:/þ NNNNNNNNNNNNNNNN¡¡¡þ'tÉNNNNNNNNNNNNNNNNNNNNNN¡¡¡û6K= 7 DPBDSM DS 2 ;DSM- DRIVE STORAGE SIZE (IN CLUSTERS) ; INT(((#_TRACKS - OFF) * SPT * BYTES PER SECTOR) / CLUSTER SIZE) -ŽÿœNNNNNNNNNNNNNNNN¡¡¡þ'WÆNNNNNNNNNNNNNNNNNNNNNN¡¡¡û THE DPB FOR DRIVE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ALLDPB: MACRO #D LŽLþNNNNNNNNNNNNNNNNNN¡¡¡þ'!½˜NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û TITLE CUSTOMIZED BIOS FOR M5B LIST NOCOND BOOT EQU 3H ;10H: HARD DISK, 3: 8" FLOPPY, 20H: 5" FLOPPY ;*********************ðÿÿóNNNNNNNNNNNNNNNNN¡¡¡þ''>NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û 3 ; A JADE 8" FLOPPY PHYSICAL DRIVE 0 ; B JADE 8" FLOPPY PHYSICAL DRIVE 1 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0É›þHNNNNNNNNNNNNNNNN¡¡¡þ'-øõNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûJAN 87 GRH ; Implemented new common IOPB code & Jade floppy firmware support. ; Implemented disk drive driver tables and new' þBNNNNNNNNNNNNNNNN¡¡¡þ'D‹NNNNNNNNNNNNNNNNNNNNNN¡¡¡û############# ; ; THE FOLLOWING DATA MUST RESIDE IN THIS ORDER TO MATCH THE IOPB DATA ; ;#################################Ï-þBNNNNNNNNNNNNNNNN¡¡¡þ' g„NNNNNNNNNNNNNNNNNNNNNN¡¡¡û############################### ; ; DRIVE ALLOCATION AREAS ; ;############################################################ÚÈþrNNNNNNNNNNNNNNNNN¡¡¡þ'‹ 07800H) OR ($ < 8000H) CONMy;þBNNNNNNNNNNNNNNNN¡¡¡þ'#ÛúNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûprises, SUNNYVALE, CA ; ; AUTHOR: Girvin Herr ; ;***************************************************************************'Œÿ$NNNNNNNNNNNNNNNNN¡¡¡þ')41NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûPHYSICAL DRIVE 1 ENDIF IF BOOT = 20H ; A JADE 5" FLOPPY PHYSICAL DRIVE 0 ; B JADE 5" FLOPPY PHYSICAL DRIVE 1 ; þINNNNNNNNNNNNNNNNN¡¡¡þ'/ž—NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûf ROM primitives. ; Moved system down to 60k. ; 3.01 26 JUN 88 GRH ; Remove 5" floppy support. Implement in CP/M-86 BIOS. ;:þrNNNNNNNNNNNNNNNN¡¡¡þ'"éNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûED FOR FLAGS BTDMA DS 2 ;DMA ADDRESS BTDMAX DS 1 ;DMA EXTENDED ADDRESS ;#################################################hþBNNNNNNNNNNNNNNNN¡¡¡þ' Í"NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE ALLOCATION & CHECKSUMS AREA ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ALLDAL: MACRO #´oÿÂNNNNNNNNNNNNNNNN¡¡¡þ'í^NNNNNNNNNNNNNNNNNNNNNN¡¡¡û############################### STRUCT 0 DPBSPT DS 2 ;SPT- SECTORS/TRACK DPBBSH DS 1 ;BSH- BLOCK SHIFT FACTOR DETERMINED BY ˜Vÿ$NNNNNNNNNNNNNNNNN¡¡¡þ'•NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAL CP/M 3.0 DATA (ALSO COULD BE USED BY CP/M 2.2 DEBLOCKING) ; DPBPSH DS 1 ;PSH- PHYSICAL RECORD SHIFT FACTOR BASED ON BYTES/S’±ÿòNNNNNNNNNNNNNNNN¡¡¡þ'¨3NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSG **** BIOS TOO BIG, USE MOVCPM & RE-ADJUST! **** ENDIF END kþHNNNNNNNNNNNNNNNNN¡¡¡þ'$BmNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û* ; ; CONFIGURATION: ; ; CPM ; DRIVE USAGE IF BOOT = 10H ;HARD DISK BOOT CONFIG. ; A SIDE 0 & 1 OF HARD DISK PHYSICäùÿNNNNNNNNNNNNNNNNN¡¡¡þ'*abNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûC SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; D SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 0 ; E SIDE 0 & 1 OF HARD DISK PHYSICT¯þINNNNNNNNNNNNNNNNN¡¡¡þ'0�ÚNNNNNNNNNNNNNNNNNNNNNN¡¡¡û Change single function to return drive table ptr into a BIOS function ; call using restart instruction. ; Change LOGON to s• ÿçNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�NNNNNNNNN�Ð��‚jƒ7„…Ò… †m‡;ˆ‰Ö‰£Šq‹>Œ �Ù�¨Žv�D�‘á‘®’{“I”•䕱–—L˜™è™¶š„›Rœ�í�ºžˆŸV #¡ñ¡¿¢�£Z¤)¥÷¥Å¦nNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ(X NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûpecify the ID sector & track. At same time, fix bug ; which did not specify the logon track. ; 3.02 7 JUL 88 GRH ; Add '?TjÿINNNNNNNNNNNNNNNNN¡¡¡þ(òNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûunction ; rather than swapping Roms itself. ; 3.07 11-25-90 GRH ; Modify for Ver. 1.22 Monitor. ; Fix bug in 8" Hard Disk@Ÿþ NNNNNNNNNNNNNNNN¡¡¡þ( ÍNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûMove calculation from ; DCM8 to CBIOS. ; Remove IOPB ptr passing in IX redundancy. ; Change DPB track-head shift factor to SÖ�ÿÂNNNNNNNNNNNNNNNN¡¡¡þ(=±NNNNNNNNNNNNNNNNNNNNNNð¡¡¡ûem by using ROMBNK sector buffer for ; ID sector read. ; 9-20-91 GRH Fold in redlines. ; 10-21-91 GRH Fix bugs ; 10“ùÿòNNNNNNNNNNNNNNNN¡¡¡þ(ÒzNNNNNNNNNNNNNNNNNNNNNN¡¡¡û================================================================== ; INTCPTS EQU TRUE ;ENABLE SYSTEM CALL INTERCEPT WHISTLE ÌÑÿ$NNNNNNNNNNNNNNNNN¡¡¡þ(xÜNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSYS: EQU 59 ;SYSTEM SIZE IN K BYTES KBYTE: EQU 1024 CPMSZ: EQU KBYTE * NKSYS CPMBS: EQU CPMSZ - (20 * KBYTE) ;CP/M BIAS VAº€þrNNNNNNNNNNNNNNNN¡¡¡þ(%’‚NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBFUNRST ;============================================================================ ; ; OTHER DECLARATIONS ; ;=======„ÃÿNNNNNNNNNNNNNNNNNN¡¡¡þ(+±�NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û======================================== ; ; BDOS CONSTANTS ON ENTRY TO WRITE ; ;====================================ô¯ÿ„NNNNNNNNNNNNNNNN¡¡¡þ( óNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û' to include file names. ; Change hard disk system tracks directory reference to new format. ; Correct bug in drivers which ca5ÀÿÈNNNNNNNNNNNNNNNNN¡¡¡þ(â8NNNNNNNNNNNNNNNNNNNNNN¡¡¡û table which benignly (at current level) ; caused the drive table to have bad data (default table was missing ; the 2 debloc×ÿÈNNNNNNNNNNNNNNNN¡¡¡þ(HžNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûector Offset like track ; offset. Disk partitioning will add this value to sector word. It ; will be stored in the ID sectora¤ÿÂNNNNNNNNNNNNNNNN¡¡¡þ(¤&NNNNNNNNNNNNNNNNNNNNNN¡¡¡û-22-91 GRH Fix bugs ; 10-23-91 GRH Fix bugs ; 10-24-91 GRH Fix bugs ; ; 3.13 1-4-92 GRH ; Change boot code to usÈ¡ÿòNNNNNNNNNNNNNNNN¡¡¡þ(‡)NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ;============================================================================ ; ; INCLUDE COMIOPB3.DEF ; INCLUDE DI÷ÜÿNNNNNNNNNNNNNNNNN¡¡¡þ( mwNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLUE CCP: EQU CPMBS + 3400H ;ADDR OF CCP BDOS: EQU CPMBS + 3C00H ;ADDRESS OF BDOS BIOS: EQU CPMBS + 4A00H ;ADDRESS OF BDOS «DÿœNNNNNNNNNNNNNNNN¡¡¡þ(&ÇÑNNNNNNNNNNNNNNNNNNNNNN¡¡¡û===================================================================== ; SECSZ: EQU 128 NDRVS: EQU 6 IF BOOT = 10H ; ; l ÿÂNNNNNNNNNNNNNNNN¡¡¡þ(,(NNNNNNNNNNNNNNNNNNNNNN¡¡¡û======================================== ; WRALL EQU 0 ;WRITE TO ALLOCATED WRDIR EQU 1 ;WRITE TO DIRECTORY WRUAL EQU 2 ;WRIT̽ÿòNNNNNNNNNNNNNNNN¡¡¡þ(>ÂNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûused retry to fail. (sector remained ; corrupted) ; Stubbed out new Clock routines for present. ; 3.03 31 JUL 88 GRH ; U«úþNNNNNNNNNNNNNNNNNN¡¡¡þ( Ñ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûking extension bytes). ; Implement data xfer inhibit schemes with PB_FLG & PB_BCNT. ; Add pick-up of THIS_BNK data in all iopb¾ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ({¯NNNNNNNNNNNNNNNNNNNNNN¡¡¡û data to be dynamic. ; ; 3.10 5-20-91 GRH ; Change LOGON to attempt to recover from old disks better, using ; DCM8301 veržÿùNNNNNNNNNNNNNNNN¡¡¡þ(—NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûe type 0 boot directories. ; VERSN EQU 312 ; ;**************************************************************************** 4 ÿNNNNNNNNNNNNNNNN¡¡¡þ(´NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSKS3.DEF ; INCLUDE BDIR.DEF ; INCLUDE M5ZF2.DEF ; ;==============================================================WÿÎNNNNNNNNNNNNNNNNN¡¡¡þ(!^FNNNNNNNNNNNNNNNNNNNNNN¡¡¡û BIOSR: EQU 1000H - BIOS ; ; PAGE 0 LOCATIONS ; PAGE0: EQU 0 ;START OF CP/M RAM DEFDRV: EQU PAGE0 + 4 ;DEFAULT DRIVE PAR³ÿNNNNNNNNNNNNNNNN¡¡¡þ('ôàNNNNNNNNNNNNNNNNNNNNNN¡¡¡û 8" HARD DISK BOOT DATA ; STHD EQU 0 ;START LOGICAL DRIVE OF HARD DISK NDHD EQU 3 ;LAST LOGICAL DRIVE OF HARD DISK ST8FD E%ðþ'NNNNNNNNNNNNNNNN¡¡¡þ(-+NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE TO UNALLOCATED ;============================================================================ ; ; ASCII CHARS ; ;=====ΨþrNNNNNNNNNNNNNNNN¡¡¡þ(§UNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûnstub Clock routines. ; 3.04 6 AUG 88 GRH ; Remove floppy side select from BIOS & move to controller. ; Implement new ID se ÿáNNNNNNNNNNNNNNNN¡¡¡þ( „ZNNNNNNNNNNNNNNNNNNNNNN¡¡¡û cases. ; Remove clock buffer set/read system calls. ; 12-5-90 GRH ; Remove IX IOPB ptr passing to disk drivers. ; 1-13-91 a¸ÿÂNNNNNNNNNNNNNNNNN¡¡¡þ(hâNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûsion controller firmware. ; ; 3.11 9-2-91 GRH ; Add redlines & change for M5ZMON v.2.00. ; ; 3.12 9-11-91 GRH ; Add deùÐÿòNNNNNNNNNNNNNNNN¡¡¡þ(ÂDNNNNNNNNNNNNNNNNNNNNNN¡¡¡û SUBTTL SYSTEM DECLARATIONS ;============================================================================ ; ; ASSEMBLY PARA®þNNNNNNNNNNNNNNNNN¡¡¡þ(-�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û============== ; LIST OFF *INCLUDE COMIOPB3.DEF *INCLUDE DISKS3.DEF *INCLUDE BDIR.DEF *INCLUDE M5ZF2.DEFµ¯ÿòNNNNNNNNNNNNNNNN¡¡¡þ(" NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAM ADDR BDOSJV EQU PAGE0 + 5 ;BDOS SYSTEM CALL ENTRY THIS_STK EQU PAGE0 + 1CH ;CURRENT STACK FRAME PTR ; ; BIOS DATA ; ‰ˆÿòNNNNNNNNNNNNNNNNN¡¡¡þ((äÞNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûQU 4 ;START LOGICAL DRIVE OF 8" FLOPPY ND8FD EQU 5 ;LAST LOGICAL DRIVE OF 8" FLOPPY ENDIF IF BOOT = 3 ; ; 8" FLOPécÿçNNNNNNNNNNNNNNNNN¡¡¡þ(.NxNNNNNNNNNNNNNNNNNNNNNN¡¡¡û======================================================================= ; LF: EQU 0AH CR: EQU 0DH CTRLZ: EQU 1AH ;@@@@@0SÿäNNNNNNNNNNNNNNNNN¡¡¡þ(”dNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûctor format. ; Implement CP/M 3.0 DPB structure in preparation for deblocking. ; 3.05 11-3-88 GRH ; Change included data toþNNNNNNNNNNNNNNNNNN¡¡¡þ( ·kNNNNNNNNNNNNNNNNNNNNNN¡¡¡û GRH ; Fix bug which corrupted PB_FLG. ; 3.08 2-22-91 GRH ; Remove references to THIS_BNK & use monitor function #7 insteaqWÿ“NNNNNNNNNNNNNNNNN¡¡¡þ([ÓNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûblocking code. ; 9-17-91 GRH Add r/ls & move to 59k system. ; 9-19-91 GRH Fix bug which destroyed my root directories! ¹Wÿ NNNNNNNNNNNNNNNN¡¡¡þ(ñuNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûMETERS ; ;============================================================================ ; FALSE EQU 0 TRUE EQU NOT FALSE ráþ9NNNNNNNNNNNNNNNN¡¡¡þ(¾NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LIST ON ;============================================================================ ; ; DISK OPERATING SYSTEM ADDR®ÿaNNNNNNNNNNNNNNNN¡¡¡þ(#8$NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûORG PAGE0 + 40H BTARG DS 2 ;BOOT ARGUMENT SYSPTR DS 2 ;BOOT DIRECTORY SYSTEM LOAD DATA OFFSET PTR ; DEFBFR EQU PAGE0 + 80HÑqÿÈNNNNNNNNNNNNNNNNN¡¡¡þ()×ïNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûPY BOOT DATA ; STHD EQU 2 ;START LOGICAL DRIVE OF HARD DISK NDHD EQU 5 ;LAST LOGICAL DRIVE OF HARD DISK ST8FD EQU 0 ;STAR¤ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ(/}INNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE THE TRANSLATION TABLE MACRO ; ;@@@@@@@@iÿäNNNNNNNNNNNNNNNN¡¡¡þ(Á7NNNNNNNNNNNNNNNNNNNNNN¡¡¡û update IOPB.PBSTAT to new configuration. ; 3.06 1-28-89 GRH ; Revised primitive calling procedures to use the monitor rom fÍŽÿÎNNNNNNNNNNNNNNNNN¡¡¡þ( .üNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûd. ; Add track-head shift factor to DPBs for future use. ; 3.09 5-15-91 GRH ; Change 8" floppy side select to track bit 0. µóÿœNNNNNNNNNNNNNNNN¡¡¡þ(€NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; BUF_RD was writing. ; Patch problems with partitioning until 20MB drive installed. ; Fix TPA corruption by LOGON probliëÿdNNNNNNNNNNNNNNNNN¡¡¡þ(áKNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;============================================================================ ; ; CONDITIONAL ASSEMBLY FLAGS ; ;==========‹þrNNNNNNNNNNNNNNNN¡¡¡þ(KíNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûESSES ; ;============================================================================ ; SYS EQU 2 ;CP/M VERSION {2,3} ; NK2uþNNNNNNNNNNNNNNNNNN¡¡¡þ($¡³NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;DEFAULT BUFFER ; ; BIOS FUNCTION CALL RESTART VECTOR ; BFUNRST EQU 28H BFUNRSV EQU PAGE0 + BFUNRST BFUNRSI EQU 0C7H + LåþNNNNNNNNNNNNNNNNNN¡¡¡þ(*‚¼NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT LOGICAL DRIVE OF 8" FLOPPY ND8FD EQU 1 ;LAST LOGICAL DRIVE OF 8" FLOPPY ENDIF ;====================================Þûÿ$NNNNNNNNNNNNNNNNN¡¡¡þ(0nNNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; GXLATE MACRO #SECTORS, #SKEW LIST OFF NXTSEC DL 1 ;­yÿ�NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÈNNNNNþ€Í�›‚hƒ6„…Ò…Ÿ†l‡:ˆ‰Õ‰¢Šq‹>Œ �Ù�§Žu�C�‘Þ‘¬’y“F”•╯–}—J˜™æ™´š‚›Pœ�ê�·ž…ŸS  ¡î¡»¢‰£V¤%¥ó¥Á¦nNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ(o�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û;START WITH SECTOR 1 LOWEST DL 1 ;; REPT #SECTORS LIST ON DB NXTSEC LIST OFF NXTSEC DL NXTSEC + #SKEW ;ADD SKEW FACTOÇEÿÉNNNNNNNNNNNNNNNNN¡¡¡þ(Å6NNNNNNNNNNNNNNNNNNNNNN¡¡¡û/ 10) + '0' DB (DD % 10) + '0' ENDM SUBTTL BIOS CODE ORG BIOS ;----------------------------------------------------­ÛÿäNNNNNNNNNNNNNNNN¡¡¡þ( *ýNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûALL ;############################################################################ ; ; THE FOLLOWING BOOT DATA MUST RESIDE¦›þBNNNNNNNNNNNNNNNN¡¡¡þ( �NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; CODE. THIS BUFFER IS USED BY THE CP/M DIRECTORY CHECK ROUTINES THAT ; CHECK FOR DISK CHANGE. ; ;########################lŸþrNNNNNNNNNNNNNNNN¡¡¡þ(åJNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFAULT DRIVE ; LD A,(BTARG) ;USE DRIVE # PASSED IN PAGE 0 AND A,3 LD (DEFDRV),A ; ; SEND SYSTEM SIGN-ON ; LD HL,MSGóÿÉNNNNNNNNNNNNNNNNN¡¡¡þ(OìNNNNNNNNNNNNNNNNNNNNNN¡¡¡û#################################################################### ; MSGSO: DB CR,LF DB CPMSZ / (KBYTE * 10) + '0' DB (C¯°þrNNNNNNNNNNNNNNNN¡¡¡þ(%¥²NNNNNNNNNNNNNNNNNNNNNN¡¡¡û;ASSUME NO DATA IN BUFFER ; LD (UNA_CNT),A ;CLEAR UNALLOCATED SECTOR COUNT ; LD (BUF_MOD),A ;CLEAN BUFFER ; LD HL,BLKBU<ÿ!NNNNNNNNNNNNNNNN¡¡¡þ(+†½NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTOP OF SEGMENT LOOP ; W_NXTSEG: LD E,(HL) ;FETCH TRACK INC HL LD D,(HL) LD (IOPB + PB_TRKO),DE ; INC HL ;FETCH ãhþrNNNNNNNNNNNNNNNN¡¡¡þ(:ÃNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûR ;; IF NXTSEC > #SECTORS ;CHECK FOR OVERFLOW NXTSEC DL NXTSEC - #SECTORS ;; IF NXTSEC <= LOWEST ;CHECK FOR REPEAT NôÿÎNNNNNNNNNNNNNNNNN¡¡¡þ(ÕNNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------------ ; ; BIOS JUMP VECTOR TABLE ; ;-------------------------------------------------------------------#'þHNNNNNNNNNNNNNNNN¡¡¡þ(®NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û AS DEFINED RIGHT BEFORE THE COLD ; INIT ROUTINE START AND MUST BE IN THE 1ST SECTOR. THESE 2 WORDS ARE ; REFERENCED BY THE BO¡Oÿ„NNNNNNNNNNNNNNNN¡¡¡þ(“NNNNNNNNNNNNNNNNNNNNNN¡¡¡û#################################################### ; DIRBF: EQU $ ;BUFFER BEGINNING ;---------------------------------fLÿ„NNNNNNNNNNNNNNNN¡¡¡þ(°NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSO CALL EDITOR ; ; MODIFY COLD START VECTOR TO WARM START ; LD HL,(BIOS+4) LD (BIOS+1),HL ; ; INIT OUR STUFF ; ¨@ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ( ZGNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPMSZ MOD (KBYTE * 10)) / KBYTE + '0' DB 'K CP/M-80 Vers 2.2',CR,LF DB 'M5b CBIOS Vers ' PVERS VERSN DM CR,LF ŠÔÿÂNNNNNNNNNNNNNNNN¡¡¡þ(&ðáNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûF ;INIT BUFFER PTR LD (BUF_DMA),HL ; ; LOG ON DRIVE TO INIT TABLES ; LD A,(BTARG) AND A,3 ;MODULO 4 LD C,A LD E,y‹þBNNNNNNNNNNNNNNNN¡¡¡þ(,*NNNNNNNNNNNNNNNNNNNNNNð¡¡¡ûSECTOR LD E,(HL) INC HL LD D,(HL) LD (IOPB + PB_SECO),DE ; INC HL ;FETCH SEGMENT SECTOR COUNT LD A,(HL) LD (SEC)ÿòNNNNNNNNNNNNNNNN¡¡¡þ( òNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûXTSEC DL LOWEST + 1 LOWEST DL NXTSEC ENDIF ENDIF ;; ENDM LIST ON ENDM ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@)®ÿHNNNNNNNNNNNNNNNNN¡¡¡þ( æ9NNNNNNNNNNNNNNNNNNNNNN¡¡¡û--------- ; JP INIT1 ;COLD START ENTRY JP WARM ;RELOAD CCP/BDOS JP CNSCK ;GET CONSOLE STATUS JP CI ;CONSOLE INPUT 36ÿçNNNNNNNNNNNNNNNNN¡¡¡þ(LŸNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOT LOADER CODE IN ORDER TO DETERMINE THE LOAD ADDRESS ; AND LENGTH OF THE BIOS. ; ;##########################################rþrNNNNNNNNNNNNNNNN¡¡¡þ( 'NNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------------------------------- ; ; INIT - COLD START ENTRY FROM BOOT MUST SET ALL BIOS PARAMS ; ;----------m˜ÿÂNNNNNNNNNNNNNNNN¡¡¡þ(ƒ(NNNNNNNNNNNNNNNNNNNNNN¡¡¡û CALL GETBNK LD (BUF_DMAB),A ; ; INITIALIZE CLOCK VECTORS IF CLOCK INSTALLED ; LD A,MF_CSYN ;TEST FOR BOARD PRESENT CXÎÿ¢NNNNNNNNNNNNNNNN¡¡¡þ(!ivNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û IF $ > (DIRBF + SECSZ) CONMSG **** WARNING! COLD INIT CODE BIGGER THAN DIR BUFFER **** ELSE DS DIRBF+SECSZ-$ ;FILL OUT`ÿÿ�NNNNNNNNNNNNNNNNN¡¡¡þ('ÃÐNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û0 CALL SELDSK LD A,L ;IF ERROR THEN ABORT OR A,H JR Z,W_EROR ; ; SETUP IOPB ; LD A,PB_READC LD (IOPB + PB_CMDOˆ†þ'NNNNNNNNNNNNNNNN¡¡¡þ(-,NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCNT),A ; INC HL ;SAVE CURRENT DATA PTR LD (LDRPTR),HL ; ; READ SYSTEM ; W_READ: CALL XPRIM LD A,2 JR NZ,W_EROR q[ÿòNNNNNNNNNNNNNNNN¡¡¡þ(�eNNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; INITIALIZE VERSION TEXT IN RAM MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@r<ÿÂNNNNNNNNNNNNNNNN¡¡¡þ( ³jNNNNNNNNNNNNNNNNNNNNNN¡¡¡û JP COC ;CONSOLE OUTPUT JP LO ;PRINTER OUTPUT JP PUNCH JP READER JP HOME ;HOME SELECTED DRIVE JP SELDSK ;SELECT DIQ¦ÿ„NNNNNNNNNNNNNNNNN¡¡¡þ(_ÒNNNNNNNNNNNNNNNNNNNNNN¡¡¡û################################## ; DB 0 ;CPU TYPE (Z80 CPU) DB 0 ;SPARE BIOSSZ: DW BIOSND - BIOS ;BIOS MODULE SIZE IN ( ÿÂNNNNNNNNNNNNNNNN¡¡¡þ(õtNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û------------------------------------------------------------------ ; INIT: ; ; SET TEMPORARY STACK ; DI LD SP,DEFBFR ;óÿçNNNNNNNNNNNNNNNNN¡¡¡þ(¿NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûALL XMROM ; ; IF CLOCK PRESENT THEN TURN ON CLOCK DRIVE ; OR A,A LD A,38H ;COND. JR (ON) JR Z,CLKON ; ; ELSE TUR;«ÿòNNNNNNNNNNNNNNNN¡¡¡þ("<%NNNNNNNNNNNNNNNNNNNNNN¡¡¡û DIRECTORY BUFFER TO 1 SECTOR SIZE ENDIF ;---------------------------------------------------------- ; ; WARM REBOOT ¢`ÿòNNNNNNNNNNNNNNNNN¡¡¡þ((ÓîNNNNNNNNNNNNNNNNNNNNNN¡¡¡û),A ; LD A,(BTARG) LD (IOPB + PB_DRVO),A ; XOR A,A LD (IOPB +PB_FLGO),A ; LD HL,0 LD (IOPB + PB_BCNTO),HL ; LDíôþ§NNNNNNNNNNNNNNNNN¡¡¡þ(.yHNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û;IF ERROR THEN EXIT ; ; NEXT SECTOR ; LD HL,(IOPB + PB_SECO) INC HL LD (IOPB + PB_SECO),HL ; LD DE,(IOPB + PB_BCNTX"ÿ'NNNNNNNNNNNNNNNNN¡¡¡þ(£TNNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; PVERS MACRO #VERS DD DL #VERS IF DD > 9999 DB (DD / 10000) + '0' DD DL DD % 10ÄÄÿ�NNNNNNNNNNNNNNNNN¡¡¡þ( €[NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûSK DRIVE JP SETTRK ;SET TRACK # JP SETSEC ;SET SECTOR # JP SETDMA ;SET TRANSFER ADDR JP DISKRD ;PERFORM DISK READ ÛþHNNNNNNNNNNNNNNNNN¡¡¡þ(lãNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBYTES BIOSST: DW BIOS ;BIOS MODULE LOAD ADDR FOR SBD ; ; CONTINUE ON WITH INIT ; INIT1: JR INIT ;##################ö×ÿüNNNNNNNNNNNNNNNN¡¡¡þ(ÆENNNNNNNNNNNNNNNNNNNNNN¡¡¡û;USE PAGE 0 FOR STACK LD (THIS_STK),SP EI ; ; UPLOAD BOOT DIRECTORY DATA FOR WARM BOOT ; LD DE,(SYSPTR) LD HL,0080H³LÿäNNNNNNNNNNNNNNNN¡¡¡þ()ŽNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûN OFF CLOCK DRIVE ; LD A,18H ;UNCOND. JR (OFF) (CAUSES JUMP TO ILLEGAL) ; CLKON: LD (INHCLK),A ; ; BOOT CCP & BDOS ; ¹—ÿNNNNNNNNNNNNNNNN¡¡¡þ(#NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûENTRY LOADS CCP,BDOS FROM DISK & ; SETS UP VARIABLES ; ;---------------------------------------------------------- ; WARM: ÆÿÈNNNNNNNNNNNNNNNNN¡¡¡þ()àßNNNNNNNNNNNNNNNNNNNNNN¡¡¡û HL,CCP LD (IOPB + PB_DMAO),HL ; ; IF NO SYSTEM THEN ERROR ; LD HL,BT_DATA LD A,(HL) ;FETCH SEGMENT COUNT OR A,A ’]ÿäNNNNNNNNNNNNNNNNN¡¡¡þ(/JyNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûO) ;DMA += SECTOR SIZE LD HL,(IOPB + PB_DMAO) ADD HL,DE LD (IOPB + PB_DMAO),HL ; ; IF INTO BIOS THEN EXIT ; LD A,HPJÿ„NNNNNNNNNNNNNNNN¡¡¡þ(öNNNNNNNNNNNNNNNNNNNNNN¡¡¡û000 ENDIF IF DD > 999 DB (DD / 1000) + '0' DD DL DD % 1000 ENDIF DB (DD / 100) + '0' DB '.' DB ((DD % 100) ©àÿáNNNNNNNNNNNNNNNN¡¡¡þ( ÌNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûJP DISKWR ;PERFORM DISK WRITE JP LISTST ;RETURN LIST STATUS JP SECTRN ;TRANSLATE SECTOR JP BIOFUNC ;EXECUTE FUNCTION C&�ÿNNNNNNNNNNNNNNNN¡¡¡þ(9°NNNNNNNNNNNNNNNNNNNNNN¡¡¡û########################################################## ; ; DIRECTORY SECTOR BUFFER STARTS HERE AFTER CRUNCHING COLD START ÏWÿäNNNNNNNNNNNNNNNNN¡¡¡þ(Ö{NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ADD HL,DE LD A,(HL) ;IF > MAX THEN ERROR CP A,6 JP NC,W_EROR ; LD DE,BT_DATA LD BC,BD_SIZE LDIR ; ; INIT DEa?ÿÂNNNNNNNNNNNNNNNN¡¡¡þ(|ÝNNNNNNNNNNNNNNNNNNNNNN¡¡¡û JR WARM ;############################################################################ ; ; SIGN-ON MESSAGE ; ;########aÿÈNNNNNNNNNNNNNNNNN¡¡¡þ($–ƒNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; ; SET TEMPORARY STACK ; DI LD SP,DEFBFR LD (THIS_STK),SP EI ; ; INIT OUR STUFF ; XOR A,A LD (BUF_ACT),A ’âþNNNNNNNNNNNNNNNNN¡¡¡þ(*µŒNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD A,1 JR Z,W_EROR ; ; ELSE USE DATA TO LOAD SYSTEM ; LD A,(HL) LD (SEGCNT),A ; INC HL ;POINT TO TRACK ; ; ¾#þ$NNNNNNNNNNNNNNNNN¡¡¡þ(0Y4NNNNNNNNNNNNNNNNNNNNNN¡¡¡û CP A,HIGH BIOS JR NC,WZRPG ; ; ELSE IF SEGMENT_SECTOR_COUNT != EXHAUSTED THEN READ_NEXT_SECTOR ; LD A,(SECCNT) DEC@þNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�Ï�œ‚jƒ8„…Ô…¢†o‡>ˆ ‰Ú‰§Šu‹BŒ�Þ�­Ž{�H�‘㑱’~“K”•ç•´–‚—O˜™ë™¹š‡›Uœ"�ð�¾žŒŸZ (¡ö¡Ä¢’£_¤-¥û¥É¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ).NNNNNNNNNNNNNNNNNNNNNN¡¡¡û A LD (SECCNT),A JR NZ,W_READ ; ; ELSE IF SEGMENTS == COMPLETE THEN DONE ; LD A,(SEGCNT) DEC A LD (SEGCNT),A JP-¢ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ)„²NNNNNNNNNNNNNNNNNNNNNNð¡¡¡û ; LD A,H CP A,HIGH BIOS JR C,W_LOK ; LD A,L CP A,LOW BIOS LD A,3 JR NZ,W_EROR ; W_LOK: ; ; INIT BIOS WARMölÿäNNNNNNNNNNNNNNNN¡¡¡þ) kyNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; READ A DISK SECTOR ; EXIT - A= 0:¿úþNNNNNNNNNNNNNNNN¡¡¡þ)KNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; DISKRDN: CALL CPM_RD JP RW_RET ;**************************************************************************** ; ; (]ÿNNNNNNNNNNNNNNNN¡¡¡þ)¤ÎNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE TYPE ; LD A,C LD (WRTYPE),A ; ; IF 1ST WRITE TO UNALLOCATED (NEW, UNUSED) BLOCK THEN SET PARAMETERS ; CP A,WRUAL V+þHNNNNNNNNNNNNNNNNN¡¡¡þ)hNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûL) JR NZ,ALLOC ; LD HL,(UNA_TRK) ;SAME TRACK? LD DE,(CPM_TRK) SBC HL,DE JR NZ,ALLOC ; LD HL,(CPM_SEC) LD DE,(UNA,kþ NNNNNNNNNNNNNNNN¡¡¡þ)%ä6NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûALLOC: XOR A,A ;COUNT = 0 LD (UNA_CNT),A ; INC A ;PREREAD FLAG = TRUE LD (RSFLAG),A ; ; ; ; COMMON CODE FOR REAq”ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ)+Ç9NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD (HL),1 ;BUFFER = ACTIVE IN ANY CASE ; OR A,A JR Z,FILHST ; ; HOST BUFFER ACTIVE, SAME AS SEEK BUFFER? ; LD A,(P÷ÿÂNNNNNNNNNNNNNNNN¡¡¡þ){GNNNNNNNNNNNNNNNNNNNNNN¡¡¡û Z,WZRPG ; ; ELSE DO NEXT SEGMENT ; LD HL,(LDRPTR) JR W_NXTSEG ; ; ; WARM BOOT ERROR, OUTPUT MSG & GO TO DEBUGGER ƒºþNNNNNNNNNNNNNNNNNN¡¡¡þ)”ŒNNNNNNNNNNNNNNNNNNNNNN¡¡¡û START IN PAGE 0 ; LD A,0C3H LD HL,BIOS + 3 LD (PAGE0),A LD (PAGE0 + 1),HL ; ; INIT BDOS CALL VECTOR IN PAGE 0 ; óÄÿÈNNNNNNNNNNNNNNNN¡¡¡þ)>*NNNNNNNNNNNNNNNNNNNNNN¡¡¡û OK; /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; DISKRD: ; ; SET UP DATA9Dÿ„NNNNNNNNNNNNNNNN¡¡¡þ)Ò’NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûWRITE DISK SECTOR FUNCTION ; ENTRY- C= WRITE TYPE: ; 0: WRITE TO ALLOCATED BLOCK (UPDATE) ; 1: WRITE TO DIRECTORY BLOCK (w¶ÿòNNNNNNNNNNNNNNNN¡¡¡þ)ñ�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û JP NZ,CHKUNA ; ; COUNT = NUMBER_OF_SECTORS_IN_BLOCK ; LD A,(IY + DPB_BLM) ;CUR_DPB.DPBBLM + 1 ::= (BLKSIZ/128) INC A ƒ1ÿäNNNNNNNNNNNNNNNNN¡¡¡þ) ÃNNNNNNNNNNNNNNNNNNNNNN¡¡¡û_SEC) SBC HL,DE JR NZ,ALLOC ; ; MATCH, MOVE TO NEXT SECTOR FOR FUTURE REF ; EX DE,HL ;UNASEC += 1 INC HL LD (UNAÿáNNNNNNNNNNNNNNNN¡¡¡þ)&±eNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD AND WRITE FOLLOWS ; RWOPER: ; ; ASSUME NO ERRORS ; XOR A,A LD (IOPB + PB_STATO),A ; ; COMPUTE BUFFER SECTOR ; =AþBNNNNNNNNNNNNNNNN¡¡¡þ),^®NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCPM_DSK) LD HL,BUF_DSK ;SAME DISK? CP A,(HL) JR NZ,NOMATCH ; LD HL,(BUF_TRK) ;SAME TRACK? LD DE,(CPM_TRK) SBC HL,DEчÿdNNNNNNNNNNNNNNNN¡¡¡þ)HvNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; ENTRY- A= ERROR CODE: ; 0: SELECT DISK ERROR ; 1: NO SYSTEM SEGMENTS IN BOOT DIRECTORY ; 2: READ ERROR ; 3: BIOS ÏŠþNNNNNNNNNNNNNNNNNN¡¡¡þ) §½NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û LD HL,BDOS + 6 LD (BDOSJV),A LD (BDOSJV + 1),HL ; ; INIT BIOS CALL VECTOR IN PAGE 0 ; LD HL,BIOFUNC LD (BFUNRSV),AnþNNNNNNNNNNNNNNNNN¡¡¡þ) NNNNNNNNNNNNNNNNNNNNNNð¡¡¡û TABLE PTRS ; PUSH IX LD IX,(CUR_DDT) ; PUSH IY LD IY,(CUR_DPB) ; ; IF NOT BLOCKED THEN USE CPM READ ; LD A,(IY± þrNNNNNNNNNNNNNNNN¡¡¡þ)á£NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûALLWAYS WRITE) ; 2: WRITE TO UNALLOCATED BLOCK (NO NEED TO PRE-READ) ; ;***************************************************¤*ÿNNNNNNNNNNNNNNNN¡¡¡þ)¬NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD (UNA_CNT),A ; ; SET DISK TO SEEK ; LD A,(CPM_DSK) LD (UNA_DSK),A ; ; SET TRACK TO SEEK ; LD HL,(CPM_TRK) L`þNNNNNNNNNNNNNNNNNN¡¡¡þ)!(òNNNNNNNNNNNNNNNNNNNNNN¡¡¡û_SEC),HL ; ; IF PAST LAST SECTOR ON TRACK THEN USE 1ST SECTOR OF NEXT TRACK ; LD E,(IY + DPB_SPT) LD D,(IY + DPB_SPT +1?œþ0NNNNNNNNNNNNNNNNN¡¡¡þ)'‚TNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD HL,(CPM_SEC) DEC HL ;CONVERT PHYSICAL SECTOR TO LOGICAL ; LD A,(IY + DPB_PSH) ;USE PHYSICAL SHIFT FACTOR (CP/M 3.X) Æ+þHNNNNNNNNNNNNNNNN¡¡¡þ)-mŸNNNNNNNNNNNNNNNNNNNNNN¡¡¡û JR NZ,NOMATCH ; LD DE,(BUF_PSEC) ;SAME SECTOR? LD HL,(BUF_SEC) SBC HL,DE JR Z,MATCH ;SKIP IF MATCH ; NOMATCH: ; ÞÿÂNNNNNNNNNNNNNNNN¡¡¡þ)ÑáNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOVERWRITTEN ; 4,5: SPARES ; 6..255: SEGMENT COUNT (TOO MANY SEGMENTS) ; W_EROR: PUSH AF ;SAVE ERROR CODE ; LD HL,MSGeNþNNNNNNNNNNNNNNNNNN¡¡¡þ) òîNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û LD (BFUNRSV + 1),HL ; ; SET DEFAULT SECTOR BUFFER ; LD BC,DEFBFR CALL SETDMA ; IF INTCPTS ; ; PUT BDOS VECTO3æþBNNNNNNNNNNNNNNNNN¡¡¡þ)VNNNNNNNNNNNNNNNNNNNNNN¡¡¡û + DPB_PSH) ;0= 128-BYTE SECTORS OR A,A JP Z,DISKRDN ; ; READS DON'T NEED ALLOCATION ; XOR A,A LD (UNA_CNT),A ; ;#QÿòNNNNNNNNNNNNNNNN¡¡¡þ)´ðNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************* ; DISKWR: ; ; REMOVE BOOT WRITE PROTECTION ; XOR A,A LD (WR_PROT),A ; ; SET PTRS TO DISoÅÿçNNNNNNNNNNNNNNNNN¡¡¡þ)[;NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD (UNA_TRK),HL ; ; SET SECTOR TO SEEK ; LD HL,(CPM_SEC) LD (UNA_SEC),HL ; ; IF NO UNALLOCATED SECTORS REMAIN THEN PN[ÿòNNNNNNNNNNNNNNNN¡¡¡þ)"}¡NNNNNNNNNNNNNNNNNNNNNN¡¡¡û) SBC HL,DE JP C,NOOVF ; LD HL,0 ;SECTOR = 1 LD (UNA_SEC),HL ; LD HL,(UNA_TRK) ;TRACK++ INC HL LD (UNA_TRK),HL u´ÿäNNNNNNNNNNNNNNNNN¡¡¡þ)(’jNNNNNNNNNNNNNNNNNNNNNN¡¡¡û AND A,3 ;LIMIT TO 1024 BYTE SECTORS JP Z,NOSECSHF ;IF ALREADY 0 THEN SECTOR SIZE IS 128 ; SECSHFLP: SRL H ;ELSE SHIK”ÿáNNNNNNNNNNNNNNNN¡¡¡þ).8ÌNNNNNNNNNNNNNNNNNNNNN!ö¡¡¡û ; IF BUFFER == DIRTY THEN WRITE IT OUT BEFORE READING NEW ONE ; CALL BUF_FLSH ;CLEAR HOST BUFF ; JR NZ,RW_RET ;IF ERROR4 ÿ�NNNNNNNNNNNNNNNNN¡¡¡þ)âÐNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLE ;OUTPUT ERROR MESSAGE CALL EDITOR ; ; DISPLAY ERROR CODE ; POP AF LD C,A LD A,MF_PHXB CALL MR_FUN ; ; EXEC{ þ!NNNNNNNNNNNNNNNN¡¡¡þ) ÁßNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR INTO INTERCEPT CODE ; LD HL,(BDOS + 7) LD (BDOSV),HL ; ; NOW PUT INTERCEPT VECTOR INTO BDOS CODE ; LD HL,INTCPT ‹PþHNNNNNNNNNNNNNNNNN¡¡¡þ)-gNNNNNNNNNNNNNNNNNNNNNN¡¡¡û READ_OPERATION_FLAG = TRUE (1) ; INC A LD (READOP),A ; ; PRE-READ_OF_DATA_FLAG = TRUE ; LD (RSFLAG),A ; ; TRE/ðÿùNNNNNNNNNNNNNNNN¡¡¡þ)‡ÁNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûK DATA ; PUSH IX LD IX,(CUR_DDT) ; PUSH IY LD IY,(CUR_DPB) ; ; IF NOT BLOCKED THEN USE CPM WRITE ; LD A,(IY + DÿùNNNNNNNNNNNNNNNN¡¡¡þ)h NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûREREAD ; CHKUNA: LD A,(UNA_CNT) OR A,A JP Z,ALLOC ; ; ELSE MORE UNALLOCATED RECORDS REMAIN, COUNT-- ; DEC A LD (UØÁÿáNNNNNNNNNNNNNNNN¡¡¡þ)#N�NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; NOOVF: ; ; MATCH FOUND, MARK AS UNNECESSARY READ ; XOR A,A ;PREREAD FLAG = FALSE LD (RSFLAG),A JP RWOPER ; ; yNÿíNNNNNNNNNNNNNNNNN¡¡¡þ))¡[NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFT OVER TO PHYSICAL SECTOR RR L DEC A JP NZ,SECSHFLP ; NOSECSHF: INC HL ;SET BACK TO PHYSICAL SECTOR LD (BUF_PSEC),5µÿ NNNNNNNNNNNNNNNNN¡¡¡þ)/ ýNNNNNNNNNNNNNNNNNNNNNN¡¡¡û THEN ABORT ; FILHST: ; ; READ THE SECTOR BUFFER ; LD A,(CPM_DSK) ;BUFFER SECTOR = PHYSICAL SECTOR LD (BUF_DSK),A ; lFÿòNNNNNNNNNNNNNNNN¡¡¡þ)·ƒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUTE DEBUGGER ; CALL MR_BRK HALT ; ; ; BOOT OK, INIT PAGE 0 ; WZRPG: ; ; IF FRONT OF BIOS OVERWRITTEN THEN ERROR  ÿNNNNNNNNNNNNNNNNNN¡¡¡þ) XHNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLD (BDOS + 7),HL ENDIF ; ; PASS DEFAULT DISK TO CCP ; LD A,(DEFDRV) LD C,A JP CCP SUBTTL BIOS DISK FUNCTION ÿBNNNNNNNNNNNNNNNN¡¡¡þ)x4NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAT AS UNALLOCATED BLOCK ; LD A,WRUAL LD (WRTYPE),A ; JP RWOPER ;TO PERFORM THE READ ; ; ; NORMAL NON-BLOCKED READ &öþNNNNNNNNNNNNNNNNN¡¡¡þ)—ÿNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPB_PSH) ;0= 128-BYTE SECTORS OR A,A JP Z,DISKWRN ; ; READ_OP_FLAG = FALSE ; XOR A,A LD (READOP),A ; ; SAVE WRIT£‡ÿòNNNNNNNNNNNNNNNN¡¡¡þ)=YNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNA_CNT),A ; ; IF REQUESTED SECTOR != UNALLOCATED SECTOR THEN PURGE ; LD A,(CPM_DSK) ;SAME DISK? LD HL,UNA_DSK CP A,(HSþNNNNNNNNNNNNNNNNNN¡¡¡þ)$×NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; NORMAL NON-BLOCKED WRITE ; DISKWRN: CALL CPM_WR JP RW_RET ; ; ; NOT AN UNALLOCATED RECORD, REQUIRES PRE-READ ; ê4þNNNNNNNNNNNNNNNNN¡¡¡þ)*ôNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûHL ;BUFFER PHYSICAL SECTOR TO ACCESS ; ; IF BUFFER == EMPTY THEN READ THE PHYSICAL SECTOR ; LD HL,BUF_ACT LD A,(HL) ; '2ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ)0°NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD HL,(CPM_TRK) LD (BUF_TRK),HL ; LD HL,(BUF_PSEC) LD (BUF_SEC),HL ; ; IF REQUIRED TO READ THEN READ ; LD A,(RSFâþgNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNäNNNNNþ€Ì�š‚hƒ6„…Ò…Ÿ†l‡:ˆ‰Õ‰¢Šp‹>Œ �Ù�¨Žv�D�‘ᑯ’|“I”•啲–€—N˜™ê™¹š‡›Uœ"�ð�½žŒŸZ '¡ô¡Â¢�£]¤,¥ú¥È¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ)$NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLAG) ;NEED TO READ? OR A,A CALL NZ,BUF_RD ;YES, IF 1 ; ; BUFFER = CLEAN ; XOR A,A LD (BUF_MOD),A ; MATCH: ; ;ÙAÿÉNNNNNNNNNNNNNNNNN¡¡¡þ)³‚NNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡û BUFFER DATA PTRS FOR LATER FLUSHES ; LD (BUF_DDT),IX LD (BUF_DPB),IY ; EX DE,HL ;SOURCE/DEST SWAP ; RWMOVE: ; ; jhÿÉNNNNNNNNNNNNNNNN¡¡¡þ) \INNNNNNNNNNNNNNNNNNNNNN¡¡¡û****************************** ; ; CPM_WR PERFORMS THE PHYSICAL WRITE FROM CPM_DMA TO THE DISK. ; ENTRY- (CPM_DSK)= DISK # TOa!ÿòNNNNNNNNNNNNNNNN¡¡¡þ)|5NNNNNNNNNNNNNNNNNNNNNN¡¡¡û.PB_STATO)= 0: OK, /0: ERROR ; ;**************************************************************************** ; CPM_RD2: ; †yÿòNNNNNNNNNNNNNNNN¡¡¡þ)“þNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; LD HL,LL_READ ; ; COMMON CODE ; CPM_RW: PUSH HL LD HL,CPM_TRK ; ; FALL INTO COMMON XFER CODE ; ;*********IÿäNNNNNNNNNNNNNNNNN¡¡¡þ)9XNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; (BUF_PSEC)= SECTOR # TO WRITE TO ; (BUF_DDT)= DDT PTR ; (BUF_DPB)= DPB PTR ; EXIT - (IOPB.PB_STATO)= 0: OK, /0: ERROR E¯ÿòNNNNNNNNNNNNNNNN¡¡¡þ)%ÓNNNNNNNNNNNNNNNNNNNNNN¡¡¡û# TO WRITE TO ; (BUF_TRK)= TRACK # TO WRITE TO ; (BUF_SEC)= SECTOR # TO WRITE TO ; IX= DDT PTR ; IY= DPB PTR ; EXIT - (øïþBNNNNNNNNNNNNNNNN¡¡¡þ)+ð NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûUF_RW: PUSH HL LD HL,BUF_TRK JP RD_WR ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ûªþrNNNNNNNNNNNNNNNN¡¡¡þ)LwNNNNNNNNNNNNNNNNNNNNNN¡¡¡û COPY DATA TO OR FROM BUFFER ; LD HL,(CPM_SEC) ;CALCULATE INDEX INTO BUFFER DEC HL ;CONVERT TO LOGICAL SECTOR (0..N-1) ÿçNNNNNNNNNNNNNNNNN¡¡¡þ)£¼NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûBC INITIALLY 128, DE IS SOURCE, HL IS DEST ; LDIR ; ; DATA HAS BEEN MOVED TO/FROM HOST BUFFER, IF NOT DIRECTORY THEN DELAQšÿÉNNNNNNNNNNNNNNNN¡¡¡þ) NNNNNNNNNNNNNNNNNNNNNN¡¡¡û WRITE TO ; (CPM_TRK)= TRACK # TO WRITE TO ; (CPM_SEC)= SECTOR # TO WRITE TO ; (CPM_DMA)= XFER ADDRESS ; IX= DDT PTR ; ÏHþBNNNNNNNNNNNNNNNN¡¡¡þ)å¢NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; SET UP PTRS ; PUSH IX PUSH IY LD IX,(CUR_DDT) LD IY,(CUR_DPB) ; ; EXECUTE READ SECTOR ; CALL CPM_RD ; ; ‹ðÿ„NNNNNNNNNNNNNNNN¡¡¡þ)Æ­NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û******************************************************************* ; ; SET UP IOPB FOR EXECUTION ; ENTRY- HL= PTR TO IOPB IMü|ÿINNNNNNNNNNNNNNNNN¡¡¡þ) ,óNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ;**************************************************************************** ; BUF_FLSH: ; ; IF UNMODIFIED THEN RETURNX¹þNNNNNNNNNNNNNNNNN¡¡¡þ)&†UNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIOPB.PB_STATO)= 0: OK, /0: ERROR ; ;**************************************************************************** ; BUF_WR: ýþ!NNNNNNNNNNNNNNNN¡¡¡þ),ižNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; SELECT DRIVE FUNCTION ; LOG-ON - SET DISK PARAMETER BLOCK ; ENTRY- C= DRIVE # ; E= 0 IF NEW SELECT ; EXIT - HL= PTR TO D'æÿNNNNNNNNNNNNNNNN¡¡¡þ)FNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD A,L ; AND A,(IY + DPB_PHM) ;USE PHYSICAL RECORD MASK DATA (CP/M 3.X) ; RRA ;BITS <7..1> -> BITS <14..8> LD H,A 6 ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ) ��NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûY WRITE ; LD A,(WRTYPE) ;IF NOT DIRECTORY THEN DELAY WRITE CP A,WRDIR LD A,(IOPB + PB_STATO) ;RETURN ANY ERRORS ANYWAY õCÿÎNNNNNNNNNNNNNNNNN¡¡¡þ):+NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û IY= DPB PTR ; EXIT - (IOPB.PB_STATO)= 0: OK, /0: ERROR ; ;******************************************************************¡nÿäNNNNNNNNNNNNNNNN¡¡¡þ)Ö“NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRESTORE PTRS & RETURN ; POP IY POP IX RET ;*************************************************************************3šÿœNNNNNNNNNNNNNNNN¡¡¡þ)õœNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAGE TRACK DATA ; IX= DDT PTR ; IY= DPB PTR ; (SP)= ADDRESS {LL_READ, LLWRIT} OF EXECUTOR ; ;****************************ŽÿÿÎNNNNNNNNNNNNNNNNN¡¡¡þ)!ÂNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; LD A,(BUF_MOD) OR A,A RET Z ; ; ELSE SET PTRS TO BUFFER DATA ; PUSH IX PUSH IY LD IX,(BUF_DDT) LD IY,(BUF¾Hÿ�NNNNNNNNNNNNNNNNN¡¡¡þ)'µdNNNNNNNNNNNNNNNNNNNNNNð¡¡¡û; LD HL,LL_WRIT JP BUF_RW ;**************************************************************************** ; ; RDBUF PER?�ÿÈNNNNNNNNNNNNNNNN¡¡¡þ)-Z¯NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPT OR 0 FOR ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; SELDSK: ; ; STORE DRå3ÿNNNNNNNNNNNNNNNN¡¡¡þ)æÑNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; LD A,0 ;BIT 0 -> BIT 7 RRA LD L,A ; ; HL HAS RELATIVE HOST BUFFER ADDRESS ; LD DE,BLKBUF ADD HL,DE ;HL = HOSTÛ·þNNNNNNNNNNNNNNNNNN¡¡¡þ) ÅÞNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û JR NZ,RW_RET ; ; IF ERROR THEN ABORT ; OR A,A JR NZ,RW_RET ; ; NO ERROR/DIRECTORY WRITE ; XOR A,A ;BUFFER = CÒ&þ9NNNNNNNNNNNNNNNNN¡¡¡þ))fNNNNNNNNNNNNNNNNNNNNNN¡¡¡û********** ; CPM_WR: ; LD HL,LL_WRIT JP CPM_RW ;********************************************************************ÑpÿNNNNNNNNNNNNNNNN¡¡¡þ)ƒÀNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û*** ; ; CPM_RD PERFORMS THE PHYSICAL READ FROM THE DISK INTO CPM_DMA. ; ENTRY- (CPM_DSK)= DISK # TO READ FROM ; (CPM_TRK)= ñÿÎNNNNNNNNNNNNNNNNN¡¡¡þ)l NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************ ; RD_WR: LD DE,IOPB + PB_TRKO LD BC,PB_BCNTO - PB_TRKO LDIR ; ; EXECUâÿ²NNNNNNNNNNNNNNNN¡¡¡þ)"J‘NNNNNNNNNNNNNNNNNNNNNN¡¡¡û_DPB) ; ; WRITE THE BUFFER DATA ; CALL BUF_WR ; ; RESTORE THE PTRS ; POP IY POP IX ; ; IF ERROR THEN RETURN ÔÿNNNNNNNNNNNNNNNNN¡¡¡þ)(¥ZNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFORMS THE PHYSICAL READ FROM THE HOST DISK INTO BLKBUF. ; ENTRY- (BUF_DSK)= DISK # TO READ FROM ; (BUF_TRK)= TRACK # TO READ YëÿÎNNNNNNNNNNNNNNNNN¡¡¡þ).üNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûIVE # FOR FUTURE USE ; LD A,C LD (CPM_DSK),A ; ; SAVE LOGON REQUEST FLAG ; LD A,E LD (LOGRQ),A ; ; COMPUTE DISùÅþNNNNNNNNNNNNNNNNNN¡¡¡þ)ÕàNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ADDRESS ; LD DE,(CPM_DMA) ;GET/PUT CP/M DATA LD BC,128 ;LENGTH OF MOVE ; LD A,(READOP) ;WHICH WAY? OR A,A JP NZ,RW×Sÿ�NNNNNNNNNNNNNNNNN¡¡¡þ) öïNNNNNNNNNNNNNNNNNNNNN!ô¡¡¡ûLEAN LD (BUF_MOD),A ; CALL BUF_WR ;WRITE TO DISK ; LD A,(IOPB + PB_STATO) ;RETURN ANY ERRORS ; ; DONE, RESTORE & RØ�þINNNNNNNNNNNNNNNNN¡¡¡þ)WNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û******** ; ; CPM_RD2 PERFORMS THE PHYSICAL READ FROM THE DISK INTO CPM_DMA, ; WITHOUT BLOCKING. ; ENTRY- (CPM_DSK)= DISK # TÀMÿüNNNNNNNNNNNNNNNN¡¡¡þ)°ñNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTRACK # TO READ FROM ; (CPM_SEC)= SECTOR # TO READ FROM ; (CPM_DMA)= XFER ADDRESS ; IX= DDT PTR ; IY= DPB PTR ; EXIT - »ÿÿòNNNNNNNNNNNNNNNN¡¡¡þ)_:NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûTE LOW LEVEL READ OR WRITE (ON STACK) ; RET ;***************************************************************************„ÒÿÂNNNNNNNNNNNNNNNN¡¡¡þ)#y NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIT ; OR A,A RET NZ ; ; ELSE CLEAN BUFFER ; LD (BUF_MOD),A RET ;**********************************************"ÿ“NNNNNNNNNNNNNNNNN¡¡¡þ))–kNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFROM ; (BUF_SEC)= SECTOR # TO READ FROM ; IX= DDT PTR ; IY= DPB PTR ; EXIT - (IOPB.PB_STATO)= 0: OK, /0: ERROR ; ;*****` ÿäNNNNNNNNNNNNNNNNN¡¡¡þ)/<ÍNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûK DRIVER TABLE PTR ; CALL RETDVRT ;DRIVE IS STILL IN C REGISTER ; ; IF DRIVE ERROR THEN RETURN (HL= 0) ; RET NZ ; ;ú¢ÿNNNNNNNNNNNNNNNN¡¡¡þ)€³NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûMOVE ;SKIP IF READ ; ; WRITE OPERATION, MARK AND SWITCH DIRECTION ; LD A,1 ;BUFFER = DIRTY LD (BUF_MOD),A ; ; SAVEäXÿœNNNNNNNNNNNNNNNN¡¡¡þ) oxNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûETURN ; RW_RET: OR A,A ;SET RESULT STATUS FLAG POP IY POP IX ; RET ;**********************************************X'þBNNNNNNNNNNNNNNNN¡¡¡þ)ONNNNNNNNNNNNNNNNNNNNNN¡¡¡ûO READ FROM ; (CPM_TRK)= TRACK # TO READ FROM ; (CPM_SEC)= SECTOR # TO READ FROM ; (CPM_DMA)= XFER ADDRESS ; EXIT - (IOPBºyÿ“NNNNNNNNNNNNNNNNN¡¡¡þ) ÏNNNNNNNNNNNNNNNNNNNNNN¡¡¡û(IOPB.PB_STATO)= 0: OK, /0: ERROR ; ;**************************************************************************** ; CPM_RD: XGþ NNNNNNNNNNNNNNNN¡¡¡þ) iNNNNNNNNNNNNNNNNNNNNNN¡¡¡û* ; ; BUF_FLSH FLUSHES THE BUFFER DATA IF MODIFIED ; ENTRY- (BUF_DSK)= DISK # TO WRITE TO ; (BUF_TRK)= TRACK # TO WRITE TO "8ÿNNNNNNNNNNNNNNNNN¡¡¡þ)$à7NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û****************************** ; ; BUF_WR PERFORMS THE PHYSICAL WRITE FROM BLKBUF TO THE HOST DISK. ; ENTRY- (BUF_DSK)= DISK v¯ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ)*Ã8NNNNNNNNNNNNNNNNNNNNNN¡¡¡û*********************************************************************** ; BUF_RD: ; LD HL,LL_READ ; ; COMMON CODE ; BÇ�ÿINNNNNNNNNNNNNNNNN¡¡¡þ)0/€NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ELSE SAVE PTR ; LD (CUR_DDT),HL ; ; FETCH FLAGS ; INC HL ;EXE +1 INC HL ;FLGS LD C,(HL) ; ; FETCH DISK PAûJþNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÎNNNNNNNN�Ð��‚jƒ7„…Ò… †m‡;ˆ ‰Ö‰£Šq‹>Œ �Ú�¨Žv�C�‘ß‘­’{“H”•䕱–€—M˜™ê™¹š‡›Uœ"�ð�½ž‹ŸY &¡ó¡À¢Ž£\¤+¥ù¥Ç¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ*µÈNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRAMETER BLOCK ADDRESS ; INC HL ;DRV INC HL ;DPB_PTR LD E,(HL) INC HL LD D,(HL) LD (CUR_DPB),DE ; ; FETCH DISK8[ÿäNNNNNNNNNNNNNNNNN¡¡¡þ*nNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ALL CASES) ; LD A,(IOPB + PB_ST2O) CP A,-1 ;-1:NONE, 0:JADE, 1:DESCRIPTOR, 2: EXTENDED, ; 3: PARTITIONED, ID JR Z¸„ÿÉNNNNNNNNNNNNNNNN¡¡¡þ* ð¥NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û_HEADS) ; SEL1: LD (IX + DDT_HDS),A ; ; RETURN DRIVE TABLE PTR ; LD HL,(CUR_DPH) XOR A,A ;RETURN NO-ERROR JR LGDON<¹þrNNNNNNNNNNNNNNNN¡¡¡þ*ÐÙNNNNNNNNNNNNNNNNNNNNNN¡¡¡û**************************************************************************** ; HOME: ; ; IF PENDING WRITE (BUFFER DIRTY) T]õþrNNNNNNNNNNNNNNNN¡¡¡þ*?NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD (CPM_SEC),BC RET ;**************************************************************************** ; ; SET TRANSFER A“8ÿlNNNNNNNNNNNNNNNNN¡¡¡þ*•´NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûTURN SECTOR++ ; LD A,D ;IF TABLE ADDR = 0 THEN NO TRANSLATION OR A,E JP Z,NOTRAN ; ; ELSE CALCULATE NEW SECTOR FROM TAÿÿòNNNNNNNNNNNNNNNN¡¡¡þ*%êNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; LOW LEVEL READ ; ENTRY- IX= DDT PTR ; IY= DPB Pî‡þNNNNNNNNNNNNNNNNNN¡¡¡þ*+\åNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û(WR_PROT) OR A,A JR NZ,DO_ERR ; ; INHIBIT UPLOAD ; LD A,1 SHL PB_INHX LD (IOPB + PB_FLGO),A ; ; CALCULATE DOWNL²OÿùNNNNNNNNNNNNNNNN¡¡¡þ*à›NNNNNNNNNNNNNNNNNNNNNN¡¡¡û PARAMETER HEADER ADDRESS ; INC HL ;DPH PTR LD E,(HL) INC HL LD D,(HL) LD (CUR_DPH),DE EX DE,HL ;PUT DPH PTR IN H€Xÿ“NNNNNNNNNNNNNNNNN¡¡¡þ*PNNNNNNNNNNNNNNNNNNNNNN¡¡¡û,LGDEF ; ; ELSE IF OLD FORMATS THEN PAD DPB DATA ; CP A,3 JR NC,IDOK ; LD HL,BLKBUF + ID_PSHO ;FILL DATA WITH 0S LÁêÿ“NNNNNNNNNNNNNNNN¡¡¡þ*¥öNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE ; ; ; IF NOT HARD DISK THEN GO DO FLOPPY TEST ; LGDEF: BIT 4,(IX + DDT_FLG) JR Z,LGCKFD ; ; ELSE USE HARD DISK DE ÿùNNNNNNNNNNNNNNNN¡¡¡þ*INNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHEN IGNORE ; LD A,(BUF_MOD) OR A,A JR NZ,HOME2 ; ; ELSE PURGE BUFFER ; LD (BUF_ACT),A ; HOME2: ; ; JUST SET ´ÿòNNNNNNNNNNNNNNNN¡¡¡þ*jANNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûDDR ; ENTRY- BC= ADDRESS ; EXIT - A= ? ; ;**************************************************************************** ; SˆÿÉNNNNNNNNNNNNNNNNN¡¡¡þ* €NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûABLE ; 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 ÷ÓÿBNNNNNNNNNNNNNNNN¡¡¡þ*&*¹NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTR ; EXIT - IOPB.PB_STATO, A= STATUS ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; LL_R3ëÿœNNNNNNNNNNNNNNNN¡¡¡þ*,ÅrNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOAD BYTE COUNT ; LD A,(IY + DPB_PSH) ;USE SHIFT FACTOR {0:128, 1:256, 2:512, 3:1024} LD HL,128 ;START WITH 128 BYTES ; êÿòNNNNNNNNNNNNNNNN¡¡¡þ*ÓªNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL FOR RETURN ; ; IF NOT FIRST SELECT OR LOGON INHIBITED THEN RETURN TABLE PTR ; LD A,(LOGRQ) ;0: LOGON, 1:INHIBIT OR A,ß{ÿBNNNNNNNNNNNNNNNN¡¡¡þ* BIT_BUCKET ; SRL H RR L RRA ;TRK BIT 0 -> SECTOR BIT 15 LD (ïMÿrNNNNNNNNNNNNNNNN¡¡¡þ*"ÑMNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA,MAXFUNCS LD A,-1 RET NC ; ; ELSE COMPUTE TABLE ENTRY ; PUSH HL ;SAVE POSSIBLE DATA ; LD HL,BFUNTBL LD A,C A_žÿòNNNNNNNNNNNNNNNNN¡¡¡þ*(>†NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++ ; ; RETURN BIOS VERSION # FUNCTION #0 ; EXIT - HL= VERSION # IN BINARY {0.00,..655.35} ; ;++++++++++++++++++È3ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ*.” NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCTION ; ENTRY- C= DRIVE # ; EXIT - E:HL= DRIVER TABLE BASE PTR ; NZ= ILLEGAL DRIVE (HL= 0) ; A, B, C= ? ; ;+++++++++++++‘;ÿ®NNNNNNNNNNNNNNNNN¡¡¡þ*NNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUTPUT FUNCTION # ; POP BC LD A,MF_PHXB CALL XMROM ; ; OUTPUT NEW LINE ; CALL CRLF ; ; RETURN NULLS ; XOR A,°!ÿòNNNNNNNNNNNNNNNN¡¡¡þ+Y˜NNNNNNNNNNNNNNNNNNNNNN¡¡¡û_GCAL JP XMROM ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN TIME FUNCTION 9³ÎÿáNNNNNNNNNNNNNNNN¡¡¡þ+¶SNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++ ; CI: LD A,MF_CI JP XMROM ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; —"þNNNNNNNNNNNNNNNN¡¡¡þ+"�ÉNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++ ; READER: LD A,CTRLZ ;FAKE EOF ; ; FALL INTO PUNCH RETURN ; ;******************************************…šÿäNNNNNNNNNNNNNNNNN¡¡¡þ+(NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++ ; LISTST: LD A,MF_LOS JP XMROM ;***********************************************************************ÿNNNNNNNNNNNNNNNNNN¡¡¡þ+.Õ¤NNNNNNNNNNNNNNNNNNNNNN¡¡¡û########################################################################### ; IOPB: REPT PB_SIZE LIST OFF DB 0 LIST ON Õ�ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ+¸NNNNNNNNNNNNNNNNNNNNNN¡¡¡û NON-DISK PROCEDURES ;*************************************************************************** ; ; NEWLINE PROCEDURE ; ;Rdÿ'NNNNNNNNNNNNNNNNN¡¡¡þ+ ,·NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûED BY WARM BOOT RTN ; ; THE FOLLOWING CONDITIONAL JUMP IS MODIFIED TO AN UNCONDITIONAL JUMP BY ; THE WARM BOOT ROUTINE IF TßçÿNNNNNNNNNNNNNNNNN¡¡¡þ+ÀNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA ;BC = HL = A = 0 LD L,A LD H,A LD C,A LD B,A RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++À\þlNNNNNNNNNNNNNNNN¡¡¡þ+j©NNNNNNNNNNNNNNNNNNNNNN¡¡¡û2H ; EXIT - A= SECONDS ; B= MINUTES ; C= HOURS ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++`=þrNNNNNNNNNNNNNNNN¡¡¡þ+…bNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; RETURN CONSOLE STATUS ; EXIT - A= 0: NOT READY ; FFH: CHAR READY ; ;+++++++++++++++++++++++++++++++++++++++++++++++++ þBNNNNNNNNNNNNNNNN¡¡¡þ+#£øNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û********************************** ; ; PUNCH DRIVER ; ENTRY- C= CHAR TO OUTPUT ; ;*****************************************š‚ÿNNNNNNNNNNNNNNNNN¡¡¡þ+)L3NNNNNNNNNNNNNNNNNNNNNN¡¡¡û***** ; ; MESSAGE EDITOR ; ENTRY- HL= TEXT PTR (BIT 7= 1: TERMINATOR) ; EXIT - REGS= ? ; ;********************************QñþHNNNNNNNNNNNNNNNNN¡¡¡þ+/æ•NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ENDM ;############################################################################ ; ; DISK DRIVER TABLES (DDT) ; ;###Û¼ÿòNNNNNNNNNNNNNNNN¡¡¡þ+ZëNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*************************************************************************** ; CRLF: LD C,CR CALL COC LD C,LF JP COC *ñÿœNNNNNNNNNNNNNNNN¡¡¡þ+ µ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHE CLOCK/CALENDAR BOARD IS NOT PRESENT ; IF NOT MODIFIED, THEN IT IS ALLWAYS FALSE (NOP). ; INHCLK: JR C,ILLEGC ; ; NOW C-ùþrNNNNNNNNNNNNNNNN¡¡¡þ+•\NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++ ; ; CDOS RETURN VERSION FUNCTION ; MAKES CLOCK/CALENDAR WORK. ; EXIT - B= 1 ; ;+++++++++++++++++++++++++Ä�þINNNNNNNNNNNNNNNNN¡¡¡þ+z—NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++ ; CLKTIM: LD A,MF_GTIM JP XMROM ENDIF ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++‡Èÿ„NNNNNNNNNNNNNNNN¡¡¡þ+Ð1NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++ ; CNSCK: LD A,MF_CIS JP XMROM ;**********************************************************eíþHNNNNNNNNNNNNNNNNN¡¡¡þ+$:oNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*********************************** ; PUNCH: RET ;***********************************************************************PyÿÈNNNNNNNNNNNNNNNNN¡¡¡þ+*`NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û******************************************** ; EDITOR: CALL GETBNK LD E,A LD A,MF_PUTS JP XMROM SUBTTL INITIALIZþ‰ÿ$NNNNNNNNNNNNNNNNN¡¡¡þ+0õØNNNNNNNNNNNNNNNNNNNNNN¡¡¡û######################################################################### ; STRUCT 0 DDT_EXE DS 2 ;START ADDRESS OF DISK DRIDOÿÈNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�NNNNNþ€Ì�š‚gƒ5„…Ñ…Ÿ†l‡:ˆ‰Õ‰¢Šp‹=Œ �Ø�§Žu�C�‘à‘®’|“I”•啲–€—M˜™é™¸š†›Uœ#�ñ�¿ž�Ÿ[ (¡õ¡Â¢�£]¤+¥ù¥Ç¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ+ôLNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûVER DDT_FLG DS 1 ;FLAGS BIT DEF. ; 0 1: INHIBIT LOGON ; 1..3 PARTITION # {0,..7} ; 4 1: HARD DISK DRIVE ; DDÖ¤ÿäNNNNNNNNNNNNNNNNN¡¡¡þ+^êNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ALLDRV MACRO #DADD,#PD,#FLG,#DPB,#DPH,#HDS,#SOF DW #DADD ;DRIVER EXECUTION ADDR K;þ$NNNNNNNNNNNNNNNN¡¡¡þ+ ±!NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; C DDT_2: ALLDRV HDEXEC,6,10H,D2DPB,D2DPH,4,0 ; D DDT_3: ALLDRV HDEXEC,6,12H,D3DPB,D3DPH,4,8000H ; E DDT_4: ALLDRV HU­ÿòNNNNNNNNNNNNNNNN¡¡¡þ+‘]NNNNNNNNNNNNNNNNNNNNNN¡¡¡û###################################################################### ; SD8PBK: DW 26 ;SECTORS PER TRACK DB 3 ;BLOCK SHIFúbÿäNNNNNNNNNNNNNNNN¡¡¡þ+~–NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û DB 31 ;BLOCK MASK (BLM) DB 1 ;NULL MASK (EXM) DW 1015 ;DISK SIZE (CLUSTERS -1) (DSM) DW 1152 / 2 ;DIRECTORY MAX —þINNNNNNNNNNNNNNNNN¡¡¡þ+Ô0NNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ALLDPH: MACRO #D LIST ON D#D(DD)DPH: ;DRIVE PARAMETERˆÞÿòNNNNNNNNNNNNNNNN¡¡¡þ+%>nNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûY ; ;############################################################################ ; LOGIOPB: DB PB_LOGC ;COMMAND DB 0 ;D·ÿáNNNNNNNNNNNNNNNN¡¡¡þ++aNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DS 2 ;XFER ADDR CPM_DMAB DS 1 ;XFER BANK ; ; ; BUFFER IOPB OVERLAY ; BUF_DSK DS 1 ;BUFFER DISK NUMBER BUF_TRK DS 2 ;BUm?þrNNNNNNNNNNNNNNNN¡¡¡þ+¡NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT_DRV DS 1 ;PHYSICAL DRIVE # DDT_DPB DS 2 ;DPB ADDRESS FOR THIS DRIVE DDT_DPH DS 2 ;DPH ADDRESS FOR THIS DRIVE ; ; THE FOLÖéþHNNNNNNNNNNNNNNNNN¡¡¡þ+NÔNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDB #FLG ;FLAGS DB #PD ;MONITOR PHYSICAL DRIVE # DW #DPB ;DISK PARAMETER BLOCK PTR DW #DPH ;DISK PARAMETER HEADER PTR ÇëÿÉNNNNNNNNNNNNNNNN¡¡¡þ+ärNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDEXEC,7,10H,D4DPB,D4DPH,4,0 ; F DDT_5: ALLDRV HDEXEC,7,12H,D5DPB,D5DPH,4,8000H ENDIF ;#############################aÿ„NNNNNNNNNNNNNNNN¡¡¡þ+ÊNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûT 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½þ NNNNNNNNNNNNNNNN¡¡¡þ++ÅNNNNNNNNNNNNNNNNNNNNNN¡¡¡û (DRM) DB 0FFH ;ALLOCATION 0 (AL0) DB 10000000B ;ALLOCATION 1 (AL1) DW 0 ;CHECK SIZE (CKS) DW 2 ;TRACK OFFSET ?’ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ+ Á›NNNNNNNNNNNNNNNNNNNNNN¡¡¡û HEADER FOR DRIVE #D(DD) DW 0 ;;SECTOR TRAN TBL (OR 0 IF NO XLATE) DW 0 ;;SCRATCH AREA DW 0 ;;" DW 0 ;;" DW DIRBF %»ÿÂNNNNNNNNNNNNNNNN¡¡¡þ+&k=NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûRIVE DW 0 ;TRACK DW ID_SECT ;SECTOR DB 0 ;FLAGS DW BLKBUF ;DMA DB 0 ;BANK DW 0 ;COUNT ; WR_PROT DB -1 ;/0: WRITE*»ÿNNNNNNNNNNNNNNNN¡¡¡þ+,„öNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFFER TRACK NUMBER BUF_SEC DS 2 ;BUFFER SECTOR NUMBER DS 1 ;FLAGS BUF_DMA DS 2 BUF_DMAB DS 1 ;BANK # ; ; ; BLOCKING BUFå6ÿrNNNNNNNNNNNNNNNN¡¡¡þ+’.NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLOWING MAY BE BROUGHT OFF DISK DESCRIPTOR OR FROM DEFAULT TABLES ; DDT_HDS DS 1 ;HEADS DDT_SOF DS 2 ;SECTOR OFFSET ; ; DE)ƒÿÎNNNNNNNNNNNNNNNNN¡¡¡þ+ }åNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û DB #HDS ;HEADS DW #SOF ;SECTOR OFFSET ; ENDM IF BOOT = 10H ; A DDT_0: ALLDRV HDEXEC,6,10H,D0DPB,D0DPH,4,0 ; bdÿgNNNNNNNNNNNNNNNNN¡¡¡þ+×CNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û############################################### ; ; MESSAGES ; ;##########################################################†‡ÿ„NNNNNNNNNNNNNNNN¡¡¡þ+;ûNNNNNNNNNNNNNNNNNNNNNN¡¡¡û;ALLOC 1 DW 16 ;CHECK SIZE DW 2 ;TRACK OFFSET DB 0 ;PHYSICAL RECORD SHIFT FACTOR DB 0 ;PHYSICAL RECORD MASK DW 0 ÿÙþNNNNNNNNNNNNNNNNNN¡¡¡þ+ôNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û (OFF) DB 1 ;PHYSICAL RECORD SHIFT FACTOR (PSH) DB 1 ;PHYSICAL RECORD MASK (PRM) DW 0 ;LOGICAL DRIVE SECTOR OFFSET (SæþNNNNNNNNNNNNNNNNNN¡¡¡þ+!òªNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;;DIRECTORY BUFFER PTR DW D#D(DD)DPB ;;DRIVE PARAMETER BLK PTR IF ((DD - 1) <= NDHD) AND ((DD - 1) >= STHD) DW 0 ;;NO N@þNNNNNNNNNNNNNNNNNN¡¡¡þ+'X NNNNNNNNNNNNNNNNNNNNNN¡¡¡û PROTECTION ENABLED ; ; LAST OF INITIALIZED CODE READ FROM DISK ; BIOSND EQU $ SUBTTL UNINITIALIZED DATA AREA ;####ÕÃÿÈNNNNNNNNNNNNNNNN¡¡¡þ+-·ÇNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûFER MAINTENANCE ; BUF_PSEC DS 2 ;BUFFER PHYSICAL SECTOR BUF_ACT DS 1 ;0: BUFFER FLUSHED, /0: DATA IN BUFFER BUF_MOD DS 1 ;0:÷ÞÿÂNNNNNNNNNNNNNNNN¡¡¡þ+ ¹NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFINE THE STRUCTURE SIZE ; DDT_SIZ DS 0 ENDM ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ê0þNNNNNNNNNNNNNNNNNN¡¡¡þ+ (¶NNNNNNNNNNNNNNNNNNNNNN¡¡¡û B DDT_1: ALLDRV HDEXEC,6,12H,D1DPB,D1DPH,4,8000H ; C DDT_2: ALLDRV HDEXEC,7,10H,D2DPB,D2DPH,4,0 ; D DDT_3: ALLDRV HDEX§Šÿ NNNNNNNNNNNNNNNNN¡¡¡þ+ÄNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û################## ; MSGLE: DM CR,LF,'LOAD ERROR: ' ; DSKEB: DM CR,LF,'Abort, Ignore, Retry, (BDOS) - ' ; WP_ERM: DM CR,LF|ÿäNNNNNNNNNNNNNNNN¡¡¡þ+n¨NNNNNNNNNNNNNNNNNNNNNN¡¡¡û;LOGICAL DRIVE SECTOR OFFSET ; ; DEFAULT DISK PHYSICAL PARAMETERS ; DB 1 ;HEADS ;##################################f­ÿÂNNNNNNNNNNNNNNNN¡¡¡þ+�cNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOF) ; ; ; DB 4 ;HEADS ;############################################################################ ; ; DRIVE PARAMë0ÿdNNNNNNNNNNNNNNNN¡¡¡þ+"§ùNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCHECKS ON HARD DISK ELSE DW D#D(DD)CHK ;;DRIVE DISK CHECKSUMS ARRAY PTR ENDIF DW D#D(DD)ALL ;;DRIVE CLUSTER ALLOCATI©ÿòNNNNNNNNNNNNNNNNN¡¡¡þ+(H2NNNNNNNNNNNNNNNNNNNNNN¡¡¡û######################################################################## ; ; THE FOLLOWING DATA MUST RESIDE IN THIS ORDER TO„›ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ+.â”NNNNNNNNNNNNNNNNNNNNNN¡¡¡û BUFFER CLEAN, /0: BUFFER DIRTY (MODIFIED) ; BUF_DDT DS 2 ;BUFFER DDT PTR BUF_DPB DS 2 ;BUFFER DPB PTR ; RSFLAG: DS 1 ;0: N ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ+8ˆNNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@ ; ; MACRO TO DEFINE THE DRIVER TABLE RECORD ; ENTRY- #DADD= DRIVER ADDRESS ; #PD= PHYSICAL DRIVE # ; #FLG= DRIVE FLAGS”9ÿ�NNNNNNNNNNNNNNNNN¡¡¡þ+ ‡NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEC,7,12H,D3DPB,D3DPH,4,8000H ; E DDT_4: ALLDRV FD8EXEC,0,0,D4DPB,D4DPH,1,0 ; F DDT_5: ALLDRV FD8EXEC,1,0,D5DPB,D5DPH,1,0þ NNNNNNNNNNNNNNNNN¡¡¡þ+÷?NNNNNNNNNNNNNNNNNNNNNN¡¡¡û,'W-PROT Error!' ; IF INTCPTS ISCMSG: DM CR,LF,'ILL SYS CALL, #= ' ENDIF ;#######################################ŠVþNNNNNNNNNNNNNNNNN¡¡¡þ+]™NNNNNNNNNNNNNNNNNNNNNN¡¡¡û########################################## ; ; DEFAULT 8" HARD DISK PARAMETER BLOCK ; ;#####################################©¼þrNNNNNNNNNNNNNNNN¡¡¡þ+²RNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûETER HEADER AREA ; 1 PER DRIVE ; ;############################################################################ ; ;@@@@@@@@@pÎþrNNNNNNNNNNNNNNNN¡¡¡þ+#”ÈNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûON BIT MAP PTR LIST OFF ENDM ; ; DEFINE THE DATA ; DD DL 1 REPT NDRVS LIST OFF ALLDPH 0123456789ABCDEF DD DL DDì¬ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ+){NNNNNNNNNNNNNNNNNNNNNN¡¡¡û MATCH THE IOPB DATA ; ;############################################################################ ; ; CP/M IOPB OVERLAY¢þHNNNNNNNNNNNNNNNNN¡¡¡þ+/Ñ¥NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûO PREREAD REQ'D, /0: PREREAD REQ'D READOP: DS 1 ;0: WRITE OPERATION, 1: READ OPERATION WRTYPE: DS 1 ;WRITE OPERATION TYPE FROMWÿ„NNNNNNNNNNNNNNNN¡¡¡þ+mÛNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û ; #DPB= DPB ADDRESS ; #DPH= DPH ADDRESS ; #HDS= HEADS ; #SOF= SECTOR OFFSET ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@BÿÂNNNNNNNNNNNNNNNN¡¡¡þ+ ‚NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û ENDIF IF BOOT = 3 ; A DDT_0: ALLDRV FD8EXEC,0,0,D0DPB,D0DPH,1,0 ; B DDT_1: ALLDRV FD8EXEC,1,0,D1DPB,D1DPH,1,0 ªÊþ9NNNNNNNNNNNNNNNN¡¡¡þ+¢lNNNNNNNNNNNNNNNNNNNNNN¡¡¡û##################################### ; ; DEFAULT 8" FLOPPY DISK PARAMETER BLOCK ; IBM 3740 SINGLE DENSITY FORMAT ; ;######L|þHNNNNNNNNNNNNNNNNN¡¡¡þ+M§NNNNNNNNNNNNNNNNNNNNNN¡¡¡û####################################### ; HDPBK: DW 128 ;SECTORS PER TRACK (LOGICAL) (SPT) DB 5 ;BLOCK SHIFT FACTOR (BSH)›TÿäNNNNNNNNNNNNNNNN¡¡¡þ+çNNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE A DISK PARAMETER TABLE MACRO ; ;@@@@@@@@@@@S6þHNNNNNNNNNNNNNNNNN¡¡¡þ+$ _NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û + 1 LIST ON ENDM ;############################################################################ ; ; LOGON IOPB OVERLAØsþHNNNNNNNNNNNNNNNNN¡¡¡þ+*.PNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; CPM_DSK DS 1 ;LOGICAL DRIVE CPM_TRK DS 2 ;LOGICAL TRACK NUMBER CPM_SEC DS 2 ;LOGICAL SECTOR NUMBER DS 1 ;FLAGS CPM_DMAvØþíNNNNNNNNNNNNNNNNN¡¡¡þ+0ÂèNNNNNNNNNNNNNNNNNNNNNN¡¡¡û BDOS: ; 0: WRITE TO ALLOCATED (USED) BLOCK (PREREAD) ; 1: WRITE TO DIRECTORY (PREREAD & WRITE) ; 2: WRITE TO UNALLO€…ÿÎNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�Ð��‚jƒ7„…Ò… †m‡;ˆ‰Ö‰£Šq‹?Œ �Û�¨Žv�D�‘ᑯ’}“J”•敳–�—O˜™ê™¹šˆ›Wœ$�ò�Àž�Ÿ[ *¡ø¡Æ¢”£a¤0¥þ¥Ë¦ŽNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ,’QNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûCATED (UNUSED) BLOCK (NO ; PREREAD REQ'D) ; ; UNA_CNT: DS 1 ;# SECTORS REMAINING IN BLOCK (CLUSTER) UNA_DSK: DS 1 ;LAST „mþ“NNNNNNNNNNNNNNNNN¡¡¡þ,8÷NNNNNNNNNNNNNNNNNNNNNNð¡¡¡û PTR ;############################################################################ ; ; DRIVE ALLOCATION AREAS ; ;####ÑäÿÉNNNNNNNNNNNNNNNN¡¡¡þ, × 07700H) OR ($ < 8000H) CONMSG **** BIOS TOO BIG, USE MOVCPM & RE-ADJUST! **** ENDIF END Ãñþ NNNNNNNNNNNNNNNN¡¡¡þ,%XsNNNNNNNNNNNNNNNNNNNNNN¡¡¡û FUNCTION DEFINITIONS Thå M5â BIOÓ functionó allo÷ programó tï modifù BIOÓ privatå � datá  withouô knowinç wherÚÏþáNNNNNNNNNNNNNNNNN¡¡¡þ,+{|NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û  -1¬  thå � functioî  ió  noô implementeä (illegal© Iæ thå erroò codå  ió  -² � theî onå oò morå argumentó arå iî error. ³øþNNNNNNNNNNNNNNNN¡¡¡þ,ÇNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUNALLOC DISK UNA_TRK: DS 2 ;LAST UNALLOC TRACK UNA_SEC: DS 2 ;LAST UNALLOC SECTOR ;###################################### ÉÿÈNNNNNNNNNNNNNNNNN¡¡¡þ,(ÉNNNNNNNNNNNNNNNNNNNNNN¡¡¡û######################################################################## ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@´¬þ$NNNNNNNNNNNNNNNN¡¡¡þ,‚oNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûF ALLDAL 0123456789ABCDEF DD DL DD + 1 LIST ON ENDM ;###############################################################ß þ9NNNNNNNNNNNNNNNN¡¡¡þ,n×NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûDRM- DIRECTORY SIZE -1 DPB_AL0 DS 2 ;AL0,1- DIRECTORY ALLOCATION ; 1 MSB PER DIRECTORY CLUSTER ALLOCATED DPB_CKS DS 2 ;CKS+þNNNNNNNNNNNNNNNN¡¡¡þ,MØNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûORD UPPER BITS) ; DPB_SECO DS 2 ;SOF- SECTOR OFFSET (FOR LOGICAL DRIVE) ; 0: NONE, 1..65535: OFFSET DPB_SZ DS 0 ENDM ;(VÿäNNNNNNNNNNNNNNNNN¡¡¡þ, §†NNNNNNNNNNNNNNNNNNNNNN¡¡¡û 1 REPT NDRVS LIST OFF ALLDAL 0123456789ABCDEF DD DL DD + 1 LIST ON ENDM ;######################################îÈþ'NNNNNNNNNNNNNNNNN¡¡¡þ,& NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûå thå datá ió locateä withiî thå  BIOS® � Theså  functionó  arå accesseä viá thå RESTARÔ 28È vectoò iî  lo÷ � memorù (0028H)®  T,GþNNNNNNNNNNNNNNNNN¡¡¡þ,,âëNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNo. Description  0 Return BIOS Version Number Entry- A= 0 Exit - HL= Version Number in hundredth«Æþ NNNNNNNNNNNNNNNN¡¡¡þ,ô3NNNNNNNNNNNNNNNNNNNNNN¡¡¡û###################################### ; ; VARIABLES ; ;##################################################################\2þ!NNNNNNNNNNNNNNNN¡¡¡þ, øNNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; MACRO TO DEFINE THE DRIVE ALLOCATION & CHECKSUMS AREA ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@$dþœNNNNNNNNNNNNNNNN¡¡¡þ,±^NNNNNNNNNNNNNNNNNNNNNN¡¡¡û############# ; ; RESERVE DRIVE PARAMETER BLOCKS ; ;######################################################################φÿòNNNNNNNNNNNNNNNN¡¡¡þ,]æNNNNNNNNNNNNNNNNNNNNNN¡¡¡û- # DIRECTORY SECTORS CHECKED ; (DRM +1) / 4 DPB_OFF DS 2 ;OFF- # RESERVED TRACKS (USUALLY 2) ; ; ADDITIONAL CP/M 3.0 DéíÿÎNNNNNNNNNNNNNNNNN¡¡¡þ,~éNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE THE DPB FOR DRIVE MACRO ; ;@™“ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ,!”·NNNNNNNNNNNNNNNNNNNNNN¡¡¡û M5b BIOS v3.16 FUNCTIONS INTERFACE SPECIFICA…zÿçNNNNNNNNNNNNNNNN¡¡¡þ,'>NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûhió vectoò ió initializeä tï á Jumð instructioî � bù thå BIOÓ Warí Booô code® Thå functionó arå useä bù puttinç thå � functioî  Q4þNNNNNNNNNNNNNNNNN¡¡¡þ,-ÑÚNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûs {0.00 to 655.35} 1 Return Monitor Drive Number for CP/M Drive Number Entry- A= 1 C= CP/M driv}þBNNNNNNNNNNNNNNNN¡¡¡þ,m¤NNNNNNNNNNNNNNNNNNNNNN¡¡¡û########## ; CUR_DPB DS 2 ;DRIVE TABLE PTR CUR_DDT DS 2 ;DRIVE DRIVER TABLE BASE ADDRESS PTR CUR_DPH DS 2 ;DPH PTR ; LOGRQ`4þNNNNNNNNNNNNNNNNNN¡¡¡þ, N«NNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; ALL = (DSM / 8) + 1 ; CHK = DPB.CKS ; ALLDAL: MACRO #D LIST ON IF ((DD -UîÿÂNNNNNNNNNNNNNNNNN¡¡¡þ,¢NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û###### ; STRUCT 0 DPB_SPT DS 2 ;SPT- SECTORS/TRACK DPB_BSH DS 1 ;BSH- BLOCK SHIFT FACTOR DETERMINED BY CLUSTER SIZE ; 1êþNNNNNNNNNNNNNNNN¡¡¡þ,µNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûATA (ALSO COULD BE USED BY CP/M 2.2 DEBLOCKING) ; DPB_PSH DS 1 ;PSH- PHYSICAL RECORD SHIFT FACTOR BASED ON BYTES/SEC ; 0: AÿÎNNNNNNNNNNNNNNNNN¡¡¡þ,ç~NNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ALLDPB: MACRO #D LIST ON D#D(DD)DPB: DS DPB_SQþrNNNNNNNNNNNNNNNN¡¡¡þ,"ÁäNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTION May 1,1992 REV. NC ë þNNNNNNNNNNNNNNNNN¡¡¡þ,(./NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûnumbeò iî thå A-register¬  anù otheò requireä argumentó � iî  thå specifieä registers¬  anä executinç eitheò á RESTARÔ  28È � in4…þœNNNNNNNNNNNNNNNN¡¡¡þ,.„‰NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûe number {0..15} Exit - A= {0..254}: Monitor drive number -2: Drive error BC,DE,HLí7þNNNNNNNNNNNNNNNNNN¡¡¡þ,^•NNNNNNNNNNNNNNNNNNNNNN¡¡¡û: DS 1 ;LOG ON REQUEST REG. ; ; BOOT DATA ; BD_SIZE EQU 16 ;MAX SIZE OF SYSTEM BOOT DATA BT_DATA DS BD_SIZE ;BOOT DIREC²ÀþNNNNNNNNNNNNNNNNNN¡¡¡þ, }šNNNNNNNNNNNNNNNNNNNNNN¡¡¡û 1) >= STHD) AND ((DD - 1) <= NDHD) D#D(DD)ALL: DS 128 ;ALLOCATION BIT MAP FOR 8" HARD DRIVE #D(DD) ENDIF IF ((DD - 1) RÐÿÉNNNNNNNNNNNNNNNNN¡¡¡þ,‘"NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûK= 3, 2K= 4, 4K= 5, 8K= 6, 16K= 7 DPB_BLM DS 1 ;BLM- BLOCK MASK ; 1K = 7, 2K= 15, 4K= 31, 8K= 63, 16K= 127 DPB_EXM DS 1 ;E1ÁþÙNNNNNNNNNNNNNNNN¡¡¡þ,;„NNNNNNNNNNNNNNNNNNNNNN¡¡¡û128, 1: 256, 2: 512, 3: 1024 DPB_PHM DS 1 ;PHM- PHYSICAL RECORD MASK BASED ON BYTES/SEC ; 0: 128, 1: 256, 3: 512, 7: 1024 $ÞþrNNNNNNNNNNNNNNNN¡¡¡þ,ÔONNNNNNNNNNNNNNNNNNNNNN¡¡¡ûZ ;ALLOCATION FOR DRIVE #D(DD) LIST OFF ENDM ; ; RESERVE THE DATA SPACE ; DD DL 1 REPT NDRVS LIST OFF ALLDPB 01”þ„NNNNNNNNNNNNNNNN¡¡¡þ,#òÕNNNNNNNNNNNNNNNNNNNNNN¡¡¡û GRH Enterprises 1129 Stonylake Ct Sunnyvale, CA .PA Š.J�þ NNNNNNNNNNNNNNNN¡¡¡þ,)NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûstructioî  oò Callinç (executing© thå locatioî  aô  0028H®  Alì � functionó returî á valuå iî thå A-registeò anä flags® Iæ thå ZêþœNNNNNNNNNNNNNNNN¡¡¡þ,/·¸NNNNNNNNNNNNNNNNNNNNNN¡¡¡û= ? 2 Disable Logon Entry- A= 2 C= CP/M drive number {0..15} Exit - A= 0: Ok, /0: Ille·`ÿÿŽNNNNNNNNNNNNNNNNN¡¡¡þ, ÆNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTORY SYSTEM DATA SEGCNT DS 1 ;NUMBER OF BOOT DIRECTORY SEGMENTS SECCNT DS 1 ;SEGMENT SECTOR COUNT LDRPTR DS 2 ;SYSTEM DATA#QþNNNNNNNNNNNNNNNNNN¡¡¡þ, ä NNNNNNNNNNNNNNNNNNNNNN¡¡¡û>= ST8FD) AND ((DD - 1) <= ND8FD) D#D(DD)ALL: DS 57 ;ALLOCATION BIT MAP FOR 8" DRIVE #D(DD) D#D(DD)CHK DS 32 ;DIRECTORY CHEþÿòNNNNNNNNNNNNNNNN¡¡¡þ,ÄqNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûXM- EXTENT MASK ; DSM < 256 : 1K= 0, 2K= 1, 4K= 3, 8K= 7, 16K= 15 ; DSM > 255 : 2K= 0, 4K= 1, 8K= 3, 16K= 7 DPB_DSM DS ##þNNNNNNNNNNNNNNNNN¡¡¡þ,+ºNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ; ADDITIONAL DISK PARTITIONING DATA FOR THE LOGICAL DRIVE SELECTION. ; PARTITIONING BY TRACKS ARE IMPLIMENTED THRU BDOS USQ@þNNNNNNNNNNNNNNNN¡¡¡þ,�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û23456789ABCDEF DD DL DD + 1 LIST ON ENDM ; ; BLOCKING BUFFER ; BLKBUF: DS 1024 ;HOST BUFFER IF (($ - 8000H)ïùþHNNNNNNNNNNNNNNNNN¡¡¡þ,$kBNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHE REVISION HISTORY REV DATE COMMENT NC 5-1-92 Initial release. .PA Š.HE k›ÿóNNNNNNNNNNNNNNNNN¡¡¡þ,*HMNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûerï � flaç ió set¬  theî nï erroò haó occured»  iæ cleared¬ theî thå A-� registeò  containó aî erroò code®  Iæ thå erroò codå ióIæÿÈNNNNNNNNNNNNNNNN¡¡¡þ,0¤õNNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡ûgal drive BC,DE,HL= ? 3 Enable Logon Entry- A= 3 C= CP/M drive number {0..15} мþéNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN$NNNNNþ€Ì�™‚gƒ5„…Ð…ž†k‡8ˆ‰Ô‰¡Šo‹<Œ �×�¥Žs�A�‘Ý‘«’y“F”•╯–}—K˜™ç™µš‚›Qœ�ë�¸ž‡ŸU "¡ð¡½¢Œ£Y¤'¥õ¥Ã¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ,¥aNNNNNNNNNNNNNNNNNNNNNN¡¡¡û Exit - A= 0: Ok, /0: Illegal drive BC,DE,HL= ? 4 Set Disk Format Entry- A= 4 ?ŸþHNNNNNNNNNNNNNNNNN¡¡¡þ,ÇNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLES. ; ; 2.28 - 22 APR 83 GRH ; CHANGED DEFINITIONS TO ALLOW BIG DIRECTORIES. ; DISALLOWED DRIVES C & D. ; ; 2.29 - 3 SEɦþ$NNNNNNNNNNNNNNNN¡¡¡þ, à NNNNNNNNNNNNNNNNNNNNNN¡¡¡û..n-1). This maintains more uniformity in ; parameter passing between hard disk & JADE floppy IOPBs. ; Vector I/O routines {Êþ NNNNNNNNNNNNNNNN¡¡¡þ,ÀpNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûse of ROM primitives. ; Moved system down to 60k. ; ; 3.01 26 JUN 88 GRH ; Remove 5" floppy support. Implement in CP/M-86 B7@þ NNNNNNNNNNNNNNNN¡¡¡þ,/»NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDIR.DEF ; ;============================================================================ LIST OFF *INCLUDE JDDCONT.DEF *INC·ÙþÉNNNNNNNNNNNNNNNNN¡¡¡þ,…NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûR: EQU 1000H - BIOS ; ; PAGE 0 LOCATIONS ; PAGE0: EQU 0 ;START OF CP/M RAM IOBYTE: EQU PAGE0 + 3 ;IOBYTE ADDR DEFDRV: E þ„NNNNNNNNNNNNNNNN¡¡¡þ,%oCNNNNNNNNNNNNNNNNNNNNNN¡¡¡û NDHD EQU 3 ;LAST LOGICAL DRIVE OF HARD DISK ST8FD EQU 4 ;START LOGICAL DRIVE OF 8" FLOPPY ND8FD EQU 5 ;LAST LOGICAL DRIVE XþNNNNNNNNNNNNNNNNNN¡¡¡þ,+LLNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û CALENDAR ENTRY TIMENT EQU RDBENT + 9 ;RETURN TIME ENTRY DKPENT EQU RDBENT + 0CH ;DISK PRIMITIVES ENTRY ;================#þBNNNNNNNNNNNNNNNN¡¡¡þ,ð2NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û C= CP/M drive number {0..15} E:HL= Disk descriptor sector image ptr Exit - A= 0: Ok, /0: Illegal 'þ“NNNNNNNNNNNNNNNN¡¡¡þ,ùNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûP 83 GRH ; Changed Rev # for blocked DCM. Enables IBM system 34 ; 256 bytes per sector disks to be read. ; ; 1.10 - 23 SEP(¤þNNNNNNNNNNNNNNNN¡¡¡þ,µ_NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûto monitor rom routines. ; ; 2.03 - 4 JUN 84 GRH ; Add bells & whistles again. ; Move to 61k system. ; ; 2.04 - 30 MAR 8m|ÿÂNNNNNNNNNNNNNNNN¡¡¡þ,YçNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIOS. ; Change single function to return drive table ptr into a BIOS function ; call using restart instruction. ; Change LOGQ³þ NNNNNNNNNNNNNNNN¡¡¡þ,zèNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLUDE COMIOPB.DEF *INCLUDE JDDDISK.DEF *INCLUDE MONBOARD.DEF *INCLUDE IOBOARD.DEF *INCLUDE NAKEDT.DEF *INCLUDE ISHA.DEF *INèþþNNNNNNNNNNNNNNNNN¡¡¡þ, �¶NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûQU PAGE0 + 4 ;DEFAULT DRIVE PARAM ADDR DKPROM EQU PAGE0 + 40H ;DISK PRIMITIVES PROM # (STORED BY DKBOOT) DEFBFR EQU PAGE0 + 80qÍþBNNNNNNNNNNNNNNNN¡¡¡þ,&:NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOF 8" FLOPPY ENDIF IF BOOT = 3 ; ; 8" FLOPPY BOOT DATA ; LASTSEC EQU 45 ;LAST BOOT SECTOR ; STHD EQU 0 ;START ±7ÿDNNNNNNNNNNNNNNNN¡¡¡þ,,ÕÛNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û============================================================ ; ; ASCII CHARS ; ;============================================Áµþ NNNNNNNNNNNNNNNN¡¡¡þ,ÃNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûdrive BC,DE,HL= ? )MÿÎNNNNNNNNNNNNNNNNN¡¡¡þ, ,ÈNNNNNNNNNNNNNNNNNNNNNN¡¡¡û 83 GRH ; Move clock-calendar routines to ROM. Add Interrupt handler ; (Mode 2). Change Revision display of sign-on (separatÙCþ�NNNNNNNNNNNNNNNNN¡¡¡þ,†nNNNNNNNNNNNNNNNNNNNNNN¡¡¡û5 GRH ; Implemented hard disk drive 1 as C: & D:. ; Implemented the Logon function for the hard disk. ; Implemented user fr?¥þNNNNNNNNNNNNNNNN¡¡¡þ,jÖNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûON to specify the ID sector & track. At same time, fix bug ; which did not specify the logon track. ; VERSN EQU '01' ; ;*–!ÿ!NNNNNNNNNNNNNNNN¡¡¡þ,IÙNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCLUDE CLOCK.DEF *INCLUDE SYSDIR.DEF LIST ON ;===========================================================================Ã7þ�NNNNNNNNNNNNNNNNN¡¡¡þ,!£‡NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûH ;DEFAULT BUFFER ; ; BIOS FUNCTION CALL RESTART VECTOR ; BFUNRST EQU 28H BFUNRSV EQU PAGE0 + BFUNRST BFUNRSI EQU 0C7H +z¸ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ,' !NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLOGICAL DRIVE OF HARD DISK NDHD EQU 3 ;LAST LOGICAL DRIVE OF HARD DISK ST8FD EQU 4 ;START LOGICAL DRIVE OF 8" FLOPPY ND8FD +lþHNNNNNNNNNNNNNNNN¡¡¡þ,-æêNNNNNNNNNNNNNNNNNNNNNN¡¡¡û================================ LF: EQU 0AH CR: EQU 0DH CTRLZ: EQU 1AH ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@  ÿÂNNNNNNNNNNNNNNNN¡¡¡þ,Z”NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûSO, ALL REFERENCES ; REQUIRING THE I/O PROMS TO BOOT HAS BEEN REMOVED. ; ; 2.2.5 - RECONFIGURE FOR 62K SYSTEM. ; ; 2.2. °þ�NNNNNNNNNNNNNNNNN¡¡¡þ, y›NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûe CBIOS rev). ; ; 2.00 - 24 MAR 84 GRH ; Modify for hard disk ; ; 2.01 - 28 APR 84 GRH ; Change hard disk DPB to refleõ÷þrNNNNNNNNNNNNNNNNN¡¡¡þ,•#NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûiendly disk error options: Abort, Retry, Ignore. ; Solved warm boot hang problem by reseting host adapter if busy. ; ; 3.00 -h=ÿòNNNNNNNNNNNNNNNN¡¡¡þ,?…NNNNNNNNNNNNNNNNNNNNNN¡¡¡û*************************************************************************** SUBTTL SYSTEM DECLARATIONS ;=================CÇþBNNNNNNNNNNNNNNNN¡¡¡þ,ÐNNNNNNNNNNNNNNNNNNNNNNN¡¡¡û= ; ; DISK OPERATING SYSTEM ADDRESSES ; ;============================================================================ NKS ÿdNNNNNNNNNNNNNNNN¡¡¡þ,"öÔNNNNNNNNNNNNNNNNNNNNNN¡¡¡û BFUNRST ; TPA: EQU 100H ;============================================================================ ; ; OTHER DECLARù?þ NNNNNNNNNNNNNNNNN¡¡¡þ,(NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEQU 5 ;LAST LOGICAL DRIVE OF 8" FLOPPY ENDIF ;========================================================================]¯þNNNNNNNNNNNNNNNNN¡¡¡þ,.³¹NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE THE TRANSLATION TABLE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@/nþ�NNNNNNNNNNNNNNNNN¡¡¡þ,i¥NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û6 - 20 FEB 83 ; DOUBLE D REV C UPGRADE. CHANGE BOARD STATUS PORT BITS. ; ; 2.2.7 - 8 MAR 83 GRH ; ADDED CLOCK/CALENDAR DRIVEðÿNNNNNNNNNNNNNNNN¡¡¡þ, JªNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûct half size directory, but keep ; allocation for 1k directory ; ; 2.02 - 2 JUN 84 GRH ; Change floppy disk drivers to relhmÿÉNNNNNNNNNNNNNNNNN¡¡¡þ,¦NNNNNNNNNNNNNNNNNNNNNN¡¡¡û 26 JAN 87 GRH ; Implemented new common IOPB code & Jade floppy firmware support. ; Implemented disk drive driver tables andäþNNNNNNNNNNNNNNNN¡¡¡þ, ´NNNNNNNNNNNNNNNNNNNNNNð¡¡¡û=========================================================== ; ; INCLUDE JDDCONT.DEF ; INCLUDE COMIOPB.DEF ; INCLUDE JDDDISK.ôÿÂNNNNNNNNNNNNNNNN¡¡¡þ,ãNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûYS: EQU 60 ;SYSTEM SIZE IN K BYTES KBYTE: EQU 1024 CPMSZ: EQU KBYTE * NKSYS CPMBS: EQU CPMSZ - (20 * KBYTE) ; CP/M BIAS VALU]þ9NNNNNNNNNNNNNNNN¡¡¡þ,#ÅåNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûATIONS ; ;============================================================================ SECSZ: EQU 128 NDRVS: EQU 6 IF BOÜÿÈNNNNNNNNNNNNNNNNN¡¡¡þ,)*.NNNNNNNNNNNNNNNNNNNNNN¡¡¡û==== ; ; ADDRESSES ; ;============================================================================ CALROM EQU 7 ;CALENDAR 'ÿ'NNNNNNNNNNNNNNNNN¡¡¡þ,/€ˆNNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@ GXLATE MACRO #SECTORS, #SKEW LIST OFF NXTSEC DL 1 ;;START WITH SECTOR 1 LOWEST DL 1 ;; REPT þ NNNNNNNNNNNNNNNN¡¡¡þ,<öNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR, SYSTEM CALL INTERCEPT, ; ILLEGAL SYSTEM CALL MESSAGE, CHANGED BIOS SIZE TO END ; OF INITIALIZED DATA AREA. RESTRUCTURE MODU¡>þ!NNNNNNNNNNNNNNNN¡¡¡þ, Ó=NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûate to ISASI control of JADE ; FDC. ; Change IOPB sector value from physical sector (1..n) to logical ; sector value (0c¹þBNNNNNNNNNNNNNNNN¡¡¡þ,óANNNNNNNNNNNNNNNNNNNNNN¡¡¡û new function to return ; a ptr to a drive table. ; Removed init of IOBYTE. ; Implemented 5" floppy driver. ; Implemented us•þ“NNNNNNNNNNNNNNNNN¡¡¡þ,ŠNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDEF ; INCLUDE MONBOARD.DEF ; INCLUDE IOBOARD.DEF ; INCLUDE NAKEDT.DEF ; INCLUDE ISHA.DEF ; INCLUDE CLOCK.DEF ; INCLUDE SYSNõþrNNNNNNNNNNNNNNNN¡¡¡þ,¶,NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûE CCP: EQU CPMBS + 3400H ;ADDR OF CCP BDOS: EQU CPMBS + 3C00H ;ADDRESS OF BDOS BIOS: EQU CPMBS + 4A00H ;ADDRESS OF BDOS BIOSë½þHNNNNNNNNNNNNNNNNN¡¡¡þ,$\rNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOT = 10H ; ; 8" HARD DISK BOOT DATA ; LASTSEC EQU 47 ;LAST BOOT SECTOR ; STHD EQU 0 ;START LOGICAL DRIVE OF HARD DISK þ�NNNNNNNNNNNNNNNNN¡¡¡þ,*}NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûROM SELECT # RDBENT EQU 0F800H ;READ CLOCK BUFFER ENTRY SETENT EQU RDBENT + 3 ;SET CLOCK ENTRY CALENT EQU RDBENT + 6 ;RETURN§ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ,0“ÅNNNNNNNNNNNNNNNNNNNNNN¡¡¡û#SECTORS LIST ON DB NXTSEC LIST OFF NXTSEC DL NXTSEC + #SKEW ;ADD SKEW FACTOR ;; IF NXTSEC > #SECTORS ;CHECK FOR OVEºÿÈNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNN�Ð�ž‚kƒ8„…Ó…¡†n‡=ˆ ‰Ø‰¥Šs‹@Œ�Ü�«Žy�F�‘⑯’}“J”•敳–‚—O˜™ë™ºšˆ›Vœ#�ñ�¿žŽŸ\ )¡ö¡Ã¢‘£^¤,¥ú¥È¦nNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ-äåNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûRFLOW NXTSEC DL NXTSEC - #SECTORS ;; IF NXTSEC <= LOWEST ;CHECK FOR REPEAT NXTSEC DL LOWEST + 1 LOWEST DL NXTSEC END¼þ·NNNNNNNNNNNNNNNNN¡¡¡þ-NCNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûISKWR ;PERFORM DISK WRITE JP LISTST ;RETURN LIST STATUS JP SECTRN ;TRANSLATE SECTOR JP BIOFUNC ;EXECUTE FUNCTION CALL \‘þ$NNNNNNNNNNNNNNNN¡¡¡þ- ¡ˆNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûHERE AFTER CRUNCHING COLD START ; CODE. THIS BUFFER IS USED BY THE CP/M DIRECTORY CHECK ROUTINES THAT ; CHECK FOR DISK CHANG`þBNNNNNNNNNNNNNNNN¡¡¡þ-�ôNNNNNNNNNNNNNNNNNNNNNN¡¡¡û EDITOR ; ; MODIFY COLD START VECTOR TO WARM START ; LD HL,(BIOS+4) LD (BIOS+1),HL ; ; BOOT CCP & BDOS ; JR WARM»ÿÂNNNNNNNNNNNNNNNN¡¡¡þ-n?NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNTRY LOADS CCP,BDOS FROM DISK & ; SETS UP VARIABLES ; ;---------------------------------------------------------- WARM: II¤þ NNNNNNNNNNNNNNNNN¡¡¡þ-Ä™NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûG: ENDIF ; ; LOG ON DRIVE TO INIT TABLES ; LD A,(DKPROM + 1) AND A,3 ;MODULO 4 LD C,A LD E,0 CALL SELDSK L©þ„NNNNNNNNNNNNNNNN¡¡¡þ-%.ÇNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL DISKRD JR NZ,WEROR ;IF ERROR THEN EXIT ; ; NEXT SECTOR ; LD HL,BTSEC INC (HL) ; LD DE,SECSZ ;DMA := DMA + SECTOR:fþNNNNNNNNNNNNNNNNNN¡¡¡þ-+ ÈNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ; BOOT OK, INIT PAGE 0 ; WZRPG: ; ; INIT BIOS WARM START IN PAGE 0 ; LD A,0C3H LD HL,BIOS + 3 LD (PAGE0),A L˜¨þBNNNNNNNNNNNNNNNN¡¡¡þ-±¶NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIF ENDIF ;; ENDM LIST ON ENDM SUBTTL BIOS CODE ORG BIOS ;-----------------------------------------------------÷cþ'NNNNNNNNNNNNNNNNN¡¡¡þ-^}NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;############################################################################ ; ; THESE BOOT PARAMS MUST RESIDE AS DEFINED tþNNNNNNNNNNNNNNNN¡¡¡þ-ôÛNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE. ; ;############################################################################ DIRBF: EQU $ ;BUFFER BEGINNING ;----+Pþ„NNNNNNNNNNNNNNNN¡¡¡þ-cNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û ;############################################################################ ; ; SIGN-ON MESSAGE ; ;#################N~þÉNNNNNNNNNNNNNNNN¡¡¡þ-;lNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûF INTRPTS ; ; SET INTERRUPT VECTOR TABLE BASE ; LD A,HIGH INTABL LD I,A ; ; SET INTERRUPT MODE TO 2 ; IM 2 ; ;˜[þ“NNNNNNNNNNNNNNNNN¡¡¡þ- Ñ2NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûD A,L ;IF ERROR THEN ABORT OR A,H JR Z,WEROR ; ; READ BOOT DIRECTORY ; LD BC,DEFBFR ;SET XFER ADDRESS (USE DEFAULTRîþNNNNNNNNNNNNNNNN¡¡¡þ-&{”NNNNNNNNNNNNNNNNNNNNNN¡¡¡û SIZE LD HL,(BTDMA) ADD HL,DE LD (BTDMA),HL ; ; IF NOT INTO BDOS THEN READ NEXT SECTOR ; LD DE,BDOS XOR A,A SBCÕÀþœNNNNNNNNNNNNNNNN¡¡¡þ-,”_NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD (PAGE0 + 1),HL ; ; INIT BDOS CALL VECTOR IN PAGE 0 ; LD HL,BDOS + 6 LD (PAGE0 + 5),A LD (PAGE0 + 6),HL ; ; INIThþNNNNNNNNNNNNNNNN¡¡¡þ-‚‡NNNNNNNNNNNNNNNNNNNNNN¡¡¡û----------------------- ; ; BIOS JUMP VECTOR TABLE ; ;--------------------------------------------------------------------ôHþNNNNNNNNNNNNNNNNN¡¡¡þ- mLNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRIGHT BEFORE THE COLD ; INIT ROUTINE START AND MUST BE IN THE 1ST SECTOR. ; THESE 2 WORDS ARE REFERENCED BY THE BOOT CODE IN_€þNNNNNNNNNNNNNNNNN¡¡¡þ-ÇêNNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------------------------------------------------------------ ; ; INIT - COLD START ENTRY FROM BOOT MUST SET ALã%ÿÂNNNNNNNNNNNNNNNN¡¡¡þ-+RNNNNNNNNNNNNNNNNNNNNNN¡¡¡û########################################################### MSGSO: DB CR,LF DB CPMSZ / (KBYTE * 10) + '0' DB (CPMSZ MOD (KBcdþ�NNNNNNNNNNNNNNNNN¡¡¡þ-]NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ENABLE INTERRUPT VECTOR 7 ; IN A,(INTMSK) AND A,7FH OUT (INTMSK),A ; ; FINALLY ENABLE VECTORED INTERRUPTS ; IN ?þ�NNNNNNNNNNNNNNNNN¡¡¡þ-!âNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û BUFFER) CALL SETDMA ; LD BC,?DIRSEC ;SET DIRECTORY SECTOR CALL SETSEC ; LD BC,0 ;SET TRACK TO 0 CALL SETTRK ; CeþNNNNNNNNNNNNNNNN¡¡¡þ-'H¥NNNNNNNNNNNNNNNNNNNNNN¡¡¡û HL,DE JR C,WREAD ; ; ELSE IF AT BEGINNING OF BDOS THEN SET UP NEW TRACK & SECTOR ; JR Z,RDBDOS ; ; ELSE IF AT BIOSsMÿÎNNNNNNNNNNNNNNNN¡¡¡þ--§nNNNNNNNNNNNNNNNNNNNNNN¡¡¡û BIOS CALL VECTOR IN PAGE 0 ; LD HL,BIOFUNC LD (BFUNRSV),A LD (BFUNRSV + 1),HL ; ; SET DEFAULT SECTOR BUFFER ; LD ‹CÿòNNNNNNNNNNNNNNNN¡¡¡þ-NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û-------- JP INIT1 ;COLD START ENTRY JP WARM ;RELOAD CCP/BDOS JP CNSCK ;GET CONSOLE STATUS JP CI ;CONSOLE INPUT JP æ\þBNNNNNNNNNNNNNNNN¡¡¡þ- 8NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ORDER TO FIND THE LOAD ADDRESS FOR THE BIOS & IT'S LENGTH. ; ;###########################################################3æÿòNNNNNNNNNNNNNNNNN¡¡¡þ-Ô§NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûL BIOS PARAMS ; ;---------------------------------------------------------------------------- INIT: ; ; SET TEMPORARY STAö8þ NNNNNNNNNNNNNNNN¡¡¡þ-~NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûYTE * 10)) / KBYTE + '0' DB 'K CP/M-80 Vers 2.2',CR,LF DB 'M5b CBIOS Vers 3.' DM HIGH VERSN , LOW VERSN,CR,LF +þNNNNNNNNNNNNNNNNNN¡¡¡þ-‘ÊNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA,(MONSTS) OR A,MONIE OUT (MONSTS),A EI ENDIF ; ; SET TEMPORARY STACK ; LD SP,DEFBFR ; ; INSURE MONITOR ROM ¥!þ„NNNNNNNNNNNNNNNN¡¡¡þ-"·PNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûALL DISKRD JR NZ,WEROR ; ; CHECK FOR VALID BOOT DIRECTORY ; LD A,(DEFBFR) CP A,?NEWDIR JR C,WEROR ; ; SET UP TOÖþ NNNNNNNNNNNNNNNNN¡¡¡þ-(X›NNNNNNNNNNNNNNNNNNNNNN¡¡¡û THEN DONE ; LD DE,BIOS - BDOS SBC HL,DE JR NC,WZRPG ; ; ELSE READ NEXT SECTOR ; JP WREAD ; ; ELSE SET UP & REý�þNNNNNNNNNNNNNNNNN¡¡¡þ-.ò=NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBC,DEFBFR CALL SETDMA ; IF INTCPTS ; ; PUT BDOS VECTOR INTO INTERCEPT CODE ; LD HL,(BDOS + 7) LD (BDOSV),HL ; ;€§þHNNNNNNNNNNNNNNNNN¡¡¡þ-(!NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCOC ;CONSOLE OUTPUT JP LO ;PRINTER OUTPUT JP PUNCH JP READER JP HOME ;HOME SELECTED DRIVE JP SELDSK ;SELECT DISK Dãþ�NNNNNNNNNNNNNNNNN¡¡¡þ- .NNNNNNNNNNNNNNNNNNNNNN¡¡¡û################# BIOSSZ: DW BIOSND - BIOS ;BIOS MODULE SIZE IN BYTES BIOSST: DW BIOS ;BIOS MODULE LOAD ADDR FOR SBD INIT1: 6°ÿäNNNNNNNNNNNNNNNNN¡¡¡þ-ç–NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCK ; LD SP,DEFBFR ;USE PAGE 0 FOR STACK ; ; MAKE SURE ROM IS ENABLED ; CALL GETMON ; ; INIT DEFAULT DRIVE ; LD 4žþaNNNNNNNNNNNNNNNN¡¡¡þ-M0NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûIF $ > (DIRBF + SECSZ) CONMSG **** WARNING! COLD INIT CODE BIGGER THAN DIR BUFFER **** ELSE DS DIRBF+SECSZ-$ ;FILL OUT ϬÿòNNNNNNNNNNNNNNNN¡¡¡þ-¢ûNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûSTILL ENABLED ; CALL GETMON ; IF BOOT = 10H ; TEST ISHA HOST ADAPTER FOR A HUNG CONDITION AND CLEAR IF TRUE ; IN A †ÿòNNNNNNNNNNNNNNNN¡¡¡þ-#„aNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LOAD CCP/BDOS ; LD HL,(DEFBFR + ?DSBDSS) ;PREFETCH BDOS TRK/SECTOR PUSH HL ; LD HL,(DEFBFR + ?DSCCPS) ;FETCH CCP TRK/SEþNNNNNNNNNNNNNNNNNN¡¡¡þ-)kªNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAD BDOS ; RDBDOS: POP HL ;RESTORE BDOS TRK/SECTOR FROM DIRECTORY LD C,L LD B,A CALL SETSEC ; LD C,H CALL SETTRK ;þ$NNNNNNNNNNNNNNNNN¡¡¡þ-/Á NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û NOW PUT INTERCEPT VECTOR INTO BDOS CODE ; LD HL,INTCPT LD (BDOS + 7),HL ; ; INITIALIZE CLOCK VECTORS IF CLOCK INSTALµÀÿòNNNNNNNNNNNNNNNN¡¡¡þ-}rNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûRIVE JP SETTRK ;SET TRACK # JP SETSEC ;SET SECTOR # JP SETDMA ;SET TRANSFER ADDR JP DISKRD ;PERFORM DISK READ JP DˆþNNNNNNNNNNNNNNNN¡¡¡þ- ’¹NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûJR INIT ;############################################################################ ; ; DIRECTORY SECTOR BUFFER STARTS w þ9NNNNNNNNNNNNNNNN¡¡¡þ-²ÅNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA,(DKPROM + 1) ;USE DRIVE # PASSED IN PAGE 0 AND A,3 LD (DEFDRV),A ; ; SEND SYSTEM SIGN-ON ; CLOGO: LD HL,MSGSO CALL[þNNNNNNNNNNNNNNNNN¡¡¡þ-]NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDIRECTORY BUFFER TO 1 SECTOR SIZE ENDIF ;---------------------------------------------------------- ; ; WARM REBOOT E•¡þBNNNNNNNNNNNNNNNN¡¡¡þ-÷¨NNNNNNNNNNNNNNNNNNNNN!ô¡¡¡û,(HSTATUS) ;IF HOST ADAPTER BUSY THEN BIT HBUSYB,A JR Z,NTHUNG ; LD A,DDCLR LD (IOPB + PBCMDO),A CALL XPRIM ; NTHUNRnþÉNNNNNNNNNNNNNNNNN¡¡¡þ-$öNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCTOR LD C,L LD B,0 CALL SETSEC ; LD C,H CALL SETTRK ; LD BC,CCP CALL SETDMA ; ; READ CCP/BDOS ; WREAD: CAL3ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ-*>ùNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û JR WREAD ; ; ; WARM BOOT ERROR, OUTPUT MSG & HALT ; WEROR: LD HL,MSGLE ;OUTPUT ERROR MESSAGE CALL EDITOR HALT ; = þ'NNNNNNNNNNNNNNNNN¡¡¡þ-0ÒANNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLED ; IN A,(CLKDAT) ;IF CLOCK NOT PRESENT THEN TURN OFF CLOCK DRIVE AND A,11000000B ;TEST UNUSED BUT DRIVEN BITS (1S IF NOTö§þNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNnNNNNþ€Í�›‚iƒ7„…Ò…Ÿ†l‡:ˆ‰Õ‰¢Šp‹=Œ �Ù�¨Žv�D�‘à‘­’{“H”•䕱–—L˜™è™¶š„›Rœ �í�ºž‰ŸW $¡ñ¡¾¢Œ£Y¤'¥õ¥Ä¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ-ÓÕNNNNNNNNNNNNNNNNNNNNNN¡¡¡û THERE) LD A,38H ;COND. JR (ON) JR Z,CLKON ; LD A,18H ;UNCOND. JR (OFF) (CAUSES JUMP TO ILLEGAL) ; CLKON: LD (INHCLK)®CþHNNNNNNNNNNNNNNNNN¡¡¡þ-ysNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCT WRITE OP JP DISKOP ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SELECT DRIVE FUiÖÿÉNNNNNNNNNNNNNNNN¡¡¡þ- –¸NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRE ADDRESS INC HL LD D,(HL) INC HL LD (DVRXADR),DE ; ; FETCH FLAGS ; LD C,(HL) ; ; COMPUTE DISK PARAMETER TAB]ŽÿòNNNNNNNNNNNNNNNN¡¡¡þ-¶ÄNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLL TRNONE ;ASSUME NO TRANSLATION ; ; IF HARD DISK OR DOUBLE DENSITY THEN NO TRANSLATION ; LD A,(DEFBFR + IDFLGO) AND Aþ7þ„NNNNNNNNNNNNNNNN¡¡¡þ-YNNNNNNNNNNNNNNNNNNNNNN¡¡¡û CALL TRNONE ; NO XLATE LD HL,HDPBK ; ; XFER DATA TO TABLES ; SEL2: PUSH HL CALL DPBAD ; USE DEFAULT TABLE POP ª´þNNNNNNNNNNNNNNNNN¡¡¡þ-ó©NNNNNNNNNNNNNNNNNNNNNN¡¡¡û***************************** ; ; SET SECTOR ; ENTRY- BC= SECTOR # ; ;*****************************************************á^þäNNNNNNNNNNNNNNNN¡¡¡þ-%÷NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û++++++++++++++++++++++++++++++++++++++++++ SECTRN: ; ; IF NO TRANSLATION THEN RETURN SECTOR++ ; LD A,D ;IF TABLE ADDR = ÅYþBNNNNNNNNNNNNNNNN¡¡¡þ-+:øNNNNNNNNNNNNNNNNNNNNNN¡¡¡û,A LD (IOPB + PBDMAXO),A ; ; SET DESCRIPTOR SECTOR SECTOR ; LD HL,2 LD (IOPB + PBSECO),HL ; ; SET DESCRIPTOR SECTg7þ„NNNNNNNNNNNNNNNN¡¡¡þ-††NNNNNNNNNNNNNNNNNNNNNN¡¡¡û,A ; ENDIF ; ; PASS DEFAULT DISK TO CCP ; LD A,(DEFDRV) LD C,A JP CCP SUBTTL BIOS DISK FUNCTION ROUTINES ;++"þÿÈNNNNNNNNNNNNNNNNN¡¡¡þ-iMNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNCTION ; LOG-ON - SET DISK PARAMETER BLOCK ; ENTRY- C= DRIVE # ; E= 0 IF NEW SELECT ; EXIT - HL= PTR TO DPT OR 0 FOR ERROR ë/ÿÈNNNNNNNNNNNNNNNN¡¡¡þ-ÃëNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLE ADDRESS ; 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 X^þ NNNNNNNNNNNNNNNN¡¡¡þ-/SNNNNNNNNNNNNNNNNNNNNNN¡¡¡û,[1 SHL DFDTDB] OR [1 SHL DFHARDB] ; ; ELSE SET TRANSLATION ; CALL Z,TR8 ; ; XFER DISK DATA TO DPB ; NOX: CALL DPBA¹ÚÿòNNNNNNNNNNNNNNNN¡¡¡þ- \NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHL LD BC,DPBSZ LDIR JR SEL1 ; ; ; USE 8" FLOPPY DEFAULTS ; LGCKFD: CALL TR8 LD HL,SD8PBK JR SEL2 ;********ÈçÿäNNNNNNNNNNNNNNNNN¡¡¡þ- æNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*********************** SETSEC: LD (BTSEC),BC RET ;*******************************************************************+[þNNNNNNNNNNNNNNNN¡¡¡þ-&L¤NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û0 THEN NO TRANSLATION OR A,E JP Z,NOTRAN ; ; ELSE CALCULATE NEW SECTOR FROM TABLE ; EX DE,HL ADD HL,BC LD L,(HL) •¥ÿÂNNNNNNNNNNNNNNNN¡¡¡þ-,£oNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOR TRACK ; LD L,H ;H == 0 FROM LAST OPERATION (HL= 0) LD (IOPB + PBTRKO),HL ; ; PASS COMMAND TO EXECUTOR ; LD A,DDL¤¯þ NNNNNNNNNNNNNNNN¡¡¡þ-µ·NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; READ A DISK SECTOR ; EXIT - A= 0: OK; /0: ERROb,ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ- Z|NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ SELDSK: ; ; ASSUME ERROR ; LD HL,0 ; ?þdNNNNNNNNNNNNNNNNN¡¡¡þ-ðÚNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ; IF NOT FIRST SELECT OR LOGON INHIBITED THEN RETURN TABLE PTR ; LD A,(LOGRQ) CPL OR A,C AND A,1 RET Z ; ; EGzÿÂNNNNNNNNNNNNNNNN¡¡¡þ-bNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD ;GET ADDR OF DPB LD HL,DEFBFR + IDSPTO LD BC,DPBSZ LDIR ; ; XFER DISK PHYSICAL DATA TO TABLE ; LD HL,DEFBFR + IPþNNNNNNNNNNNNNNNNNN¡¡¡þ-?mNNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************************************************** ; ; HOME DRIVE - TREAT AS SEEK TRK 0 ; EXIT - BC= 0 ;T3þ!NNNNNNNNNNNNNNNN¡¡¡þ-!Õ3NNNNNNNNNNNNNNNNNNNNNN¡¡¡û********* ; ; SET TRANSFER ADDR ; ENTRY- BC= ADDRESS ; EXIT - A= 0 ; ;****************************************************jÆþœNNNNNNNNNNNNNNNN¡¡¡þ-'•NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; LD H,0 RET ; ; ; CONVERT FROM CP/M'S LOGICAL SECTOR {0..N-1} TO PHYSICAL SECTOR {1..N} ; NOTRAN: LD HL,1 ADD ‚xþ'NNNNNNNNNNNNNNNN¡¡¡þ--�^NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûOG JR DISKOP2 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; COMMON DISK I/O CODE =mþNNNNNNNNNNNNNNNN¡¡¡þ-, NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DISKRD: LD A,DDRDS ;SELECT READ OP JP \…ÿÂNNNNNNNNNNNNNNNN¡¡¡þ- /NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; IF UNSUPPORTED DRIVE REQUESTED THEN RETURN 0 (ERROR) ; LD A,C CP A,NDRVS RET NC ; ; STORE DRIVE # FOR FUTURE USEµeþÉNNNNNNNNNNNNNNNNN¡¡¡þ-ã—NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLSE LOG ON DRIVE ; LD (DTPTR),HL ;SAVE DRIVE TABLE PTR ; ; ATTEMPT TO READ ID SECTOR ; XOR A,A ;INIT FLAG BYTE UNTIL 3žþdNNNNNNNNNNNNNNNN¡¡¡þ-I1NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDFLGO ; SEL1: PUSH HL LD HL,(DVRTPTR) LD DE,DVRFLG ADD HL,DE EX DE,HL POP HL LD BC,DVRSIZ - DVRFLG LDIR ; ; j«ÿ\NNNNNNNNNNNNNNNN¡¡¡þ-¦úNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;**************************************************************************** HOME: LD BC,0 ;***************************À]ÿÂNNNNNNNNNNNNNNNN¡¡¡þ-"€`NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û************************ SETDMA: LD (BTDMA),BC XOR A,A LD (BTDMAX),A RET ;++++++++++++++++++++++++++++++++++++++++++©hþ„NNNNNNNNNNNNNNNNN¡¡¡þ-(o«NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHL,BC RET SUBTTL DISK SUPPORT ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ;F¤þNNNNNNNNNNNNNNNNNN¡¡¡þ-.Å NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DISKOP: ; ; cÃþNNNNNNNNNNNNNNNNNN¡¡¡þ-NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDISKOP ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; WRITE A DISK SECTOR ; EXIT - A=º]þ'NNNNNNNNNNNNNNNNN¡¡¡þ- <NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û ; LD (BTDRV),A ; ; SAVE LOGON REQUEST FLAG ; LD A,E LD (LOGRQ),A ; ; COMPUTE DISK DRIVER TABLE PTR ; CALL RE²ÃÿäNNNNNNNNNNNNNNNNN¡¡¡þ-ЦNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûFIRMWARE REVISED LD (IOPB + PBST2O),A ; CALL DISKLOG JP NZ,FDSKER ; ; IF NO ID SECTOR THEN USE DEFAULTS ; LD A,(IOõ¼ÿàNNNNNNNNNNNNNNNNN¡¡¡þ-zNNNNNNNNNNNNNNNNNNNNNNð¡¡¡ûRETURN DRIVE TABLE PTR ; LD HL,(DTPTR) XOR A,A RET ; ; ; IF NOT HARD DISK THEN GO DO FLOPPY TEST ; LGDEF: LD A,(BT™þrNNNNNNNNNNNNNNNN¡¡¡þ-•ËNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************* ; ; SET TRACK # ; ENTRY- BC= TRACK # ; ;*********************************þ9NNNNNNNNNNNNNNNN¡¡¡þ-#³QNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++ ; ; SECTOR TRANSLATION FUNCTION ; ENTRY- DE= 0: NO XLATE, ELSE PTR TO XLATE TABLE ; BC= ó²þ�NNNNNNNNNNNNNNNNN¡¡¡þ-)\šNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; LOGON DISK FUNCTION ; EXIT - A= 0: OK; /0: ERROR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++¹×þ$NNNNNNNNNNNNNNNNN¡¡¡þ-/öNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDRV) IF STHD <> 0 CP A,STHD JR C,LGCKFD ENDIF CP A,NDHD + 1 JR NC,LGCKFD ; ; ELSE USE HARD DISK DEFAULTS ; Õ þ„NNNNNNNNNNNNNNNN¡¡¡þ-À˜NNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************************* SETTRK: LD (BTTRK),BC RET ;***********************************************^Žþ“NNNNNNNNNNNNNNNNN¡¡¡þ-$*ÆNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSECTOR # TO XLATE ; EXIT - HL= XLATED SECTOR OR (BC) + 1 ; BC= UNCHANGED ; A, DE= ? ; ;++++++++++++++++++++++++++++++++++ÙuþNNNNNNNNNNNNNNNNNN¡¡¡þ-* ÉNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++ DISKLOG: ; ; SET DESCRIPTOR SECTOR XFER ADDRESS TO DEFAULT BUFFER ; LD HL,DEFBFR LD (IOPB + PBDMAO),HL XOR AK�ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ-0åqNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFETCH DRIVER VECTOR & EXECUTE DISK DRIVER ; DKOPLP: PUSH IY ;SAVE IY LD IY,(DVRTPTR) ;FETCH TABLE BASE ; LD HL,DKOPRETP-þ�NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNnNNNNNNN�Ð��‚jƒ8„…Ô…¡†n‡<ˆ ‰Ø‰¥Šs‹AŒ�Þ�­Ž{�I�‘ç‘´’‚“O”•땸–†—T˜"™ñ™¿š�›\œ)�÷�Äž“Ÿa .¡û¡È¢—£e¤3¥¦Ð¦ŽNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ.9NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;PUT RETURN ADDRESS ON STACK PUSH HL ; LD HL,(DVRXADR) ;FETCH DRIVER ADDRESS PREFETCHED FROM TABLE JP (HL) ; ; DRIVEkßÿÈNNNNNNNNNNNNNNNNN¡¡¡þ.ÕŸNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUPPER CASE ; ; IF RETRY THEN RETURN TO CALLER ; CP A,'R' ;IF RETRY THEN RETURN TO CALLER JR Z,DKOPLP ; ; ELSE IF AþÉNNNNNNNNNNNNNNNN¡¡¡þ. :TNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE INC HL LD (HL),D RET ;**************************************************************************** ; ; SET NO SECå‹þBNNNNNNNNNNNNNNNN¡¡¡þ.(NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++ ; ; HARD DISK DRIVER FUNCTION ; ENTRY- IY= DRIVER TABLE PTR ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++Πÿ9NNNNNNNNNNNNNNNN¡¡¡þ.õãNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD HL,DKPENT ;PRIMITIVE ENTRY LD A,(DKPROM) ;FETCH PROM # CALL EXROM ;EXECUTE THE PRIMITIVE POP IX ; ; RETURN THE ‹þINNNNNNNNNNNNNNNNN¡¡¡þ._ENNNNNNNNNNNNNNNNNNNNNN¡¡¡û + PBTRKO) CP A,1 LD A,(IOPB + PBSECO) JR C,FD8X20 JR Z,FD8X21 ; ; DATA TRACKS ; LD C,(IY + DVRDSPT) ; ; COMM¯¬þNNNNNNNNNNNNNNNN¡¡¡þ.%µNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCTION # NOT IN TABLE THEN RETURN -1 ; LD HL,BFUNTBL LD A,C CP A,MAXFUNCS LD A,-1 RET NC ; ; ELSE COMPUTE TABLE EN€éþBNNNNNNNNNNNNNNNN¡¡¡þ.+–NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û) / 2 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN BIOS VERSION # ; EXIT - Hy&þrNNNNNNNNNNNNNNNN¡¡¡þ.*jNNNNNNNNNNNNNNNNNNNNN!ô¡¡¡ûR RETURNS HERE ; DKOPRET: POP IY ; ; IF NO ERRORS THEN RETURN ZF ; RET Z ;IF NO_ERROR THEN RETURN ; ; PRINT ERRm?ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ.Å¡NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBORT THEN DO WARM BOOT ; CP A,'A' ;IF ABORT THEN RE-BOOT JP Z,0 ; ; ELSE IF IGNORE THEN RETURN NO ERROR ; SUB A,'I'²5ÿÈNNNNNNNNNNNNNNNN¡¡¡þ.oNNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡ûTOR TRANSLATION PROCEDURE ; EXIT - HL, DE= ? ; ;**************************************************************************** ¼îþ NNNNNNNNNNNNNNNN¡¡¡þ.ƒ¿NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ HDEXEC: ; ; CONVERT LOGICAL DRIVE TO PHYSICAL DRIVE ; LD A,e…þäNNNNNNNNNNNNNNNN¡¡¡þ. °NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCOMMAND RESULTS STATUS ; LD A,(IOPB + PBSTATO) OR A,A RET SUBTTL JADE FLOPPY DRIVER ROUTINES ;++++++++++++++++++++‹3þNNNNNNNNNNNNNNNNN¡¡¡þ. JîNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûON SIDE SELECT CODE ; FD8X2: INC C SUB A,C JR C,SPTOK ; INC A ;MUST START AT 1 LD (IOPB + PBSECO),A ; ; SELECT SU€þNNNNNNNNNNNNNNNNN¡¡¡þ.&àHNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTRY ; PUSH HL ;SAVE POSSIBLE DATA ; LD HL,BFUNTBL LD A,C ADD A,A ADD A,L LD L,A LD A,0 ADC A,H LD H,A ; ;¾ ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ.,ƒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL= VERSION # IN BINARY {0.00,..655.35} ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ RETVERãRþòNNNNNNNNNNNNNNNN¡¡¡þ.[NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOR ; LD HL,DSKEM ;OUTPUT PREFIX CALL EDITOR ; LD DE,IOPB LD B,IOPBSZ DSKER1: LD A,(DE) ;FETCH ERROR BYTE PUSH DEÜÐÿÎNNNNNNNNNNNNNNNNN¡¡¡þ. ö�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;IF IGNORE THEN RETURN NO ERROR RET Z ; ; ELSE RETURN ERROR TO BDOS ; FDSKER: LD HL,0 ;RETURN DPB_PTR = 0 FOR SELECT áþNNNNNNNNNNNNNNNNNN¡¡¡þ.\6NNNNNNNNNNNNNNNNNNNNNN¡¡¡û TRNONE: LD DE,0 JR SETTR ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN DRIV‘:þ9NNNNNNNNNNNNNNNN¡¡¡þ.°ŽNNNNNNNNNNNNNNNNNNNNNN¡¡¡û(IY + DVRPDRV) ;0,1: DRV 0, 2,3: DRV 1 LD (IOPB + PBDRVO),A ; ; OFFSET LOGICAL ADDRESS WITH LOGICAL DRIVE ; LD A,(BTDRV—þÿÎNNNNNNNNNNNNNNNNN¡¡¡þ.“�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; JADE 8" FLOPPY DISK DRIVER FUNCTION ; ENTRY- IY= DRIVER TABLE PT†ZÿÎNNNNNNNNNNNNNNNNN¡¡¡þ.!yßNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIDE 1 ; LD A,80H FD8X1: LD (IOPB + PBSECO + 1),A ; ; EXECUTE THE IOPB ; JP XPRIM ; ; ; TRACK 0 ; FD8X20: LD C,j1þ!NNNNNNNNNNNNNNNN¡¡¡þ.'ÓyNNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡û EXECUTE TABLE ADDRESS ; LD A,(HL) INC HL LD H,(HL) LD L,A ; EX (SP),HL ;PUT CALLER'S DATA IN HL, FUNCTION ADDR OÑàþNNNNNNNNNNNNNNNNN¡¡¡þ.-<²NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS: LD HL,300 + (LOW VERSN) + ((HIGH VERSN) * 10) XOR A,A ;RETURN NO ERROR RET ;++++++++++++++++++++++++++++++++++++ÝJþ9NNNNNNNNNNNNNNNN¡¡¡þ.€ÌNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û ;SAVE REGS PUSH BC CALL PRHEX ;OUTPUT ERROR CODE ; LD C,' ' CALL COC ; POP BC ;RESTORE REGS POP DE INC DE ;ëþNNNNNNNNNNNNNNNNN¡¡¡þ. £ÃNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFUNCTION LD A,-1 ;RETURN -1 TO BDOS OR A,A RET ;********************************************************************™ÿòNNNNNNNNNNNNNNNNN¡¡¡þ.O{NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE PARAMETER BLOCK ADDR FUNCTION ; EXIT - DE= DPB PTR ; HL= ? ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ÏFþrNNNNNNNNNNNNNNNN¡¡¡þ.åÝNNNNNNNNNNNNNNNNNNNNNN¡¡¡û) ;IF EVEN THEN ADD 0 ELSE ADD 128 RRCA AND A,80H LD E,A ;COMPUTE SECTOR LD D,0 LD HL,(IOPB + PBSECO) ADD HL,DE ²ÜÿÎNNNNNNNNNNNNNNNNN¡¡¡þ. NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ FD8EXEC: ; ÔÿòNNNNNNNNNNNNNNNN¡¡¡þ.",ŒNNNNNNNNNNNNNNNNNNNNNN¡¡¡û(IY + DVR0SPT) JP FD8X2 ; ; ; TRACK 1 ; FD8X21: LD C,(IY + DVR1SPT) JP FD8X2 ; ; ; SECTORS OK ; SPTOK: XOR A,AŸ¨ÿòNNNNNNNNNNNNNNNNN¡¡¡þ.(ÃGNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûN RET ; STACK, EXECUTE FUNCTION ADDRESS ON STACK ;#####################################################################‹þNNNNNNNNNNNNNNNNNN¡¡¡þ..iáNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++ ; ; RETURN DRIVER TABLE PTR FUNCTION ; ENTRY- C= DRIVE # ; EXIT - HL= DRIVER TABLE  þ�NNNNNNNNNNNNNNNNN¡¡¡þ.³ýNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNEXT ERROR BYTE DJNZ DSKER1 ;IF NOT DONE THEN LOOP ; LD HL,DSKEB ;OUTPUT ERROR MESSAGE CALL EDITOR ; ; GET USER RESP»«ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ. �òNNNNNNNNNNNNNNNNNNNNNN¡¡¡û******** ; ; SET 3740 SECTOR TRANSLATION PROCEDURE ; ENTRY- (DTPTR)= MUST BE PTR TO DTP ; EXIT - DE, HL= ? ; ;************VÏþNNNNNNNNNNNNNNNNN¡¡¡þ.|JNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++ DPBAD: LD HL,(DTPTR) ;FETCH BASE ADDR LD DE,10 ;ADD OFFSET OF DPB PTR ADD HL,DE LD E,(HL) ;FETCH DPB y þNNNNNNNNNNNNNNNN¡¡¡þ.ÖìNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLD (IOPB + PBSECO),HL ; ; FINISH SETTING UP THE IOPB ; XPRIM: XOR A,A LD (IOPB + PBFLGO),A ;NO FLAGS FOR NOW ; LD HL,rùÿòNNNNNNNNNNNNNNNN¡¡¡þ.9'NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û; CONVERT LOGICAL DRIVE TO PHYSICAL DRIVE ; LD A,(IY + DVRPDRV) LD (IOPB + PBDRVO),A ; ; IF LOGON THEN SKIP SIDE SELE#¢þ„NNNNNNNNNNNNNNNN¡¡¡þ.#½NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û JP FD8X1 SUBTTL BIOS FUNCTION CALLS ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; •|ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ.)ðvNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û####### ; ; BIOS FUNCTION TABLE ; ;############################################################################ BFUNTBL: ¾½þNNNNNNNNNNNNNNNNN¡¡¡þ./ZÐNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBASE PTR ; A, C= 0 ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ RETDVRT: LD HL,DVR0 ;2þ„NNNNNNNNNNNNNNNN¡¡¡þ.æ®NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûONSE ; CALL CI ;GET USER RESPONSE ; PUSH AF ;SAVE CHAR LD C,A ;ECHO CHAR CALL COC POP AF ; AND A,5FH ;INSURE ®•þ!NNNNNNNNNNNNNNNN¡¡¡þ. eNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û**************************************************************** TR8: TR3740: LD DE,SDTRAN ; SETTR: LD HL,(DTPTR) LD (HL),Ë™þ„NNNNNNNNNNNNNNNN¡¡¡þ.)NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPTR INC HL LD D,(HL) RET SUBTTL HARD DISK ROUTINES ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Uâþ$NNNNNNNNNNNNNNNNN¡¡¡þ.ÆÒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSECSZ ;SET XFER COUNT LD (IOPB + PBST4O),HL ; ; EXECUTE THE PRIMITIVE IN ROM ; PUSH IX LD IX,IOPB ;PASS PTR TO IOPBO§þ„NNNNNNNNNNNNNNNN¡¡¡þ.ltNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûCT BECAUSE SECTOR DATA MAY NOT BE VALID ; LD A,(IOPB + PBCMDO) SUB A,DDLOG JR Z,FD8X1 ; ; SELECT SIDE ; LD A,(IOPB±ÓþHNNNNNNNNNNNNNNNNN¡¡¡þ.$†*NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; FUNCTION DISPATCHER ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ BIOFUNC: ; ; IF FUN�¸ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ.*¥%NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDW RETVERS ;RETURN VERSION # DW RETDVRT ;RETURN DISK PHYSICAL CONFIGURATION TABLE PTR DW EXIOPB MAXFUNCS EQU ($ - BFUNTBLÐ…þ�NNNNNNNNNNNNNNNNN¡¡¡þ.0I�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSTART AT 1ST TABLE ; ; TEST FOR DONE ; RETDVL: LD A,C OR A,A RET Z ; ; COMPUTE NEXT TABLE ENTRY ; LD A,DVRSIZ ®7þœNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN$NNNNNþ€Ì�™‚fƒ4„…Ï…�†j‡9ˆ‰Ô‰¡Šo‹<Œ �×�¥Žt�A�‘Þ‘¬’z“G”•ã•°–~—K˜™æ™µšƒ›Qœ�ë�¸ž‡ŸU "¡ï¡½¢‹£X¤&¥ô¥Â¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ.H NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ADD A,L LD L,A LD A,0 ADC A,H LD H,A DEC C JP RETDVL ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++uSþINNNNNNNNNNNNNNNNN¡¡¡þ.â¯NNNNNNNNNNNNNNNNNNNNNN¡¡¡û***************************************************** PRHEX: ; ; PROCESS HIGH NIBBLE 1ST ; CALL PRDIG ; ; SWAP HIGH t'þ NNNNNNNNNNNNNNNN¡¡¡þ. dNNNNNNNNNNNNNNNNNNNNNN¡¡¡û****************************** INTCPT: LD A,C ;CHECK CALL VALIDITY CP A,41 ;IF <= 40 THEN OK ; BDOSV EQU $ + 1 JP C,BDO:¬ÿòNNNNNNNNNNNNNNNN¡¡¡þ.-NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLL ; ILLEGC: LD HL,ISCMSG ;OUTPUT WARNING CALL EDITOR XOR A,A ;BC = HL = A = 0 LD L,A LD H,A LD C,A LD B,A RET ÈÜþ9NNNNNNNNNNNNNNNN¡¡¡þ.ÂÓNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN TIME FUNCTION 92H ; EXIT - A= S¸:þINNNNNNNNNNNNNNNNN¡¡¡þ.huNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û;**************************************************************************** CLKSET: LD C,E ;SET UP PARAMETERS LD B,D L³/þäNNNNNNNNNNNNNNNN¡¡¡þ.%‚+NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûN VALUE RET SUBTTL CHAR I/O ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ;§1þNNNNNNNNNNNNNNNN¡¡¡þ.+¡$NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûN RETURN 0 AND A,1 SHL NTRDY TTOST1: RET Z LD A,-1 ;ELSE RETURN -1 RET ENDIF ;*********************************§2ÿÂNNNNNNNNNNNNNNNN¡¡¡þ.ZNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++ ; ; EXECUTE IOPB FUNCTION ; ENTRY- DE= IOPB PTR ; EXIT - A= 0: OK ; ;++++++++++++++++++++++++++++++++�Öþ�NNNNNNNNNNNNNNNNN¡¡¡þ.ò‘NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û& LOW NIBBLES ; PRDIG: RLCA RLCA RLCA RLCA ; ; SAVE DATA FOR RETURN ; PUSH AF ; ; CONVERT TO ASCII USING DAA þwÿÈNNNNNNNNNNNNNNNN¡¡¡þ.X7NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS + 11H ;THIS ADDR MODIFIED BY WARM BOOT RTN ; ; THE FOLLOWING CONDITIONAL JUMP IS MODIFIED TO AN UNCONDITIONAL JUMP BY ; T—Cþ NNNNNNNNNNNNNNNN¡¡¡þ.´�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CDOS RETURN VERSION FUNCTION ; MAKES G ÿäNNNNNNNNNNNNNNNN¡¡¡þ.—€NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûECONDS ; B= MINITS ; C= HOURS ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ CLKTIM: L#°ÿINNNNNNNNNNNNNNNNN¡¡¡þ. }ÞNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD HL,SETENT CLK2: LD A,CALROM ENDIF ;**************************************************************************** ; ½"ÿ\NNNNNNNNNNNNNNNN¡¡¡þ.&×xNNNNNNNNNNNNNNNNNNNNNNð¡¡¡û CONSOLE INPUT ; EXIT - A= CHAR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ CI: IF U¡hþBNNNNNNNNNNNNNNNN¡¡¡þ.,8³NNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************************* ; ; CONSOLE OUTPUT ; ENTRY- C= CHAR TO OUTPUT ; ;*******************************¦þdNNNNNNNNNNNNNNNN¡¡¡þ..kNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û++++++++++++++++++++++++++++++++++++++++++++ EXIOPB: ; ; SAVE REG ; PUSH IX ; ; SET UP FOR CALL ; PUSH DE POP IòÿÎNNNNNNNNNNNNNNNNN¡¡¡þ. Á NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTRICK ; AND A,0FH ADD A,90H DAA ADC A,40H DAA ; ; OUTPUT CHAR TO CONSOLE ; LD C,A CALL COC ; ; RETURN DAdCþ�NNNNNNNNNNNNNNNNN¡¡¡þ.kNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHE WARM BOOT ROUTINE IF THE CLOCK/CALENDAR BOARD IS NOT PRESENT ; IF NOT MODIFIED, THEN IT IS ALLWAYS FALSE (NOP). ; INHCLK:ˆ þ9NNNNNNNNNNNNNNNN¡¡¡þ.‡¾NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCLOCK/CALENDAR WORK. ; EXIT - B= 1 ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ RETCVER: VÿÎNNNNNNNNNNNNNNNNN¡¡¡þ.¤±NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD HL,TIMENT JR CLK1 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; READ CLOCK TIME F”ÑÿÎNNNNNNNNNNNNNNNNN¡¡¡þ.!NïNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; EXECUTE ROM ROUTINE ; ENTRY- HL= ENTRY ADDRESS ; A= ROM # ; EXIT - ? ; ;************************************************Š×þœNNNNNNNNNNNNNNNN¡¡¡þ.'äINNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSEMON CALL GETMON ;SWITCH IN MONITOR ROM JP 0F803H ;USE MONITOR ELSE CALL CNSCK ;IF NO CHAR RDY THEN WAIT JR Z,CI;þ'NNNNNNNNNNNNNNNN¡¡¡þ.- ‚NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û********************************************** COC: IF USEMON CALL GETMON JP 0F809H ELSE CALL NTOST ;IF BUSY THET4þœNNNNNNNNNNNNNNNN¡¡¡þ.·üNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûX LD HL,DKPENT LD A,(DKPROM) CALL EXROM ; ; FETCH & RETURN RESULT STATUS ; LD A,(IX+PBSTATO) POP IX ;RESTORE REG³Eþ!NNNNNNNNNNNNNNNN¡¡¡þ. ”óNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûTA ; POP AF RET IF INTCPTS SUBTTL ADDITIONAL FUNCTIONS TO SUPPORT CDOS PROGRAMS ;********************************”Fþ„NNNNNNNNNNNNNNNNN¡¡¡þ.xKNNNNNNNNNNNNNNNNNNNNNN¡¡¡û JR C,ILLEGC ; ; NOW CHECK FOR EXTENDED CALLS ; CP A,8DH ;IF RETURN VERSION THEN RETURN IT JR Z,RETCVER ; CP A,90H gþrNNNNNNNNNNNNNNNN¡¡¡þ.ÒíNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD B,1 RET SUBTTL CLOCK ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; REd‰ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ.=&NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUNCTION 93H ; ENTRY- DE= PTR TO 13 BYTE BUFFER FOR CLOCK DATA ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++È‹þBNNNNNNNNNNNNNNNN¡¡¡þ."¼NNNNNNNNNNNNNNNNNNNNNN¡¡¡û**************************** EXROM: AND A,ROMSMK ;MASK OUT UNUSED BITS OUT (ROMSEL),A ; PUSH HL ;SAVE ROM ENTRY VECTOR ƒäÿòNNNNNNNNNNNNNNNNN¡¡¡þ.(ôwNNNNNNNNNNNNNNNNNNNNNN¡¡¡û IN A,(NTD) ;ELSE RETURN CHAR RET ENDIF ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++“þ!NNNNNNNNNNNNNNNN¡¡¡þ..^ÑNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûN WAIT OR A,A JR Z,COC LD A,C OUT (NTD),A RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++,�ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ.„ÍNNNNNNNNNNNNNNNNNNNNNN¡¡¡û OR A,A ;TEST RESULT FOR RETURN RET SUBTTL NON-DISK PROCEDURES ;***************************************************ÄøþNNNNNNNNNNNNNNNNNN¡¡¡þ. §ÂNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û******************************************* ; ; SYSTEM CALL INTERCEPT ROUTINE CHECKS FOR ILLEGAL BDOS CALLS & ; PRINTS MESSA-Sþ$NNNNNNNNNNNNNNNNN¡¡¡þ.KzNNNNNNNNNNNNNNNNNNNNNN¡¡¡û;IF NOT CLOCK THEN ERR JR C,ILLEGC ; JR Z,CLKCAL ;IF CALENDAR THEN GET IT ; CP A,92H JR C,CLKSET ;IF SET FUNCTION THENÚ�þBNNNNNNNNNNNNNNNN¡¡¡þ.áÜNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûTURN CALENDAR FUNCTION 90H ; EXIT - A= DAY ; B= MONTH ; C= YEAR ; L= DAY OF WEEK ; ;+++++++++++++++++++++++++++++++++++‘=þ NNNNNNNNNNNNNNNN¡¡¡þ.NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++ CLKRDC: LD C,E ;SET UP PARAMETERS LD B,D LD HL,RDBENT JR CLK2 ;*********************************œæþ„NNNNNNNNNNNNNNNN¡¡¡þ.#(�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; LD HL,EXROMR ;PUT RETURN ADDR ON STACK EX (SP),HL ;SWAP RETURN ADDRESS WITH ROM ENTRY VECTOR JP (HL) ;EXECUTE ROM ; 'þ�NNNNNNNNNNNNNNNNN¡¡¡þ.)ÇFNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++ ; ; RETURN CONSOLE STATUS ; EXIT - A= 0: NOT READY ; FFH: CHAR READY ; ;++++++++++++++++++++++++++++++++++++++++++ê¬þ$NNNNNNNNNNNNNNNNN¡¡¡þ./màNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++ ; ; RETURN CONSOLE OUTPUT READY STATUS ; EXIT - A= 0: BUSY, FFH: READY ; ;++++++++++++++++++++++++++++++++++++3>ÿòNNNNNNNNNNNNNNNN¡¡¡þ.ÑžNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************* ; ; OUTPUT HEX DATA TO CONSOLE SUBR ; ENTRY- A= DATA ; EXIT - A, C= ? ; ;***********************c@þ!NNNNNNNNNNNNNNNN¡¡¡þ. >UNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûGE IF ILLEGAL. ALSO IMPLEMENTS CDOS CLOCK/CALENDAR ; SYSTEM CALLS FOR ASMB. ; ;*********************************************#þœNNNNNNNNNNNNNNNN¡¡¡þ.)NNNNNNNNNNNNNNNNNNNNNN¡¡¡û SET CLOCK ; JR Z,CLKTIM ;IF TIME THEN GET IT ; CP A,93H JR Z,CLKRDC ;IF READ CLOCK THEN GET IT ; ; ILLEGAL SYSTEM CA„®þÉNNNNNNNNNNNNNNNNN¡¡¡þ.ñâNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++ CLKCAL: LD HL,CALENT ;ROM ENTRY POINT ; CLK1: LD BC,CLKBFR ;READ CLOCK JR CLK2 ˜þNNNNNNNNNNNNNNNN¡¡¡þ.[DNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û******************************************* ; ; CLOCK SET FUNCTION 91H ; ENTRY- DE= CLOCK IMAGE BUFR PTR (13 BYTES LONG) ; ÈÿÈNNNNNNNNNNNNNNNNN¡¡¡þ.$±NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ROM PROCEDURE RETURNS HERE ; EXROMR: PUSH AF ;SAVE RETURN VALUE CALL GETMON ;RESELECT MONITOR ROM ; POP AF ;RETUR¡¥þNNNNNNNNNNNNNNNNNN¡¡¡þ.*’NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û++++++++++++++++++++++++++++++++++ CNSCK: IF USEMON CALL GETMON JP 0F812H ELSE IN A,(NTS) ;IF DATA NOT READY THE"ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ.0~­NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++ NTOST: IN A,(NTS) CPL ;REVERSE SENSE AND A,1 SHL NTBSY JR TTOST1 ENDIF ÒAÿüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN^NNNNNNN�Ñ�ž‚kƒ8„…Ô…¡†n‡=ˆ ‰Ø‰¥Šs‹AŒ�Ü�«Žy�G�‘䑲’€“M”•é•¶–„—R˜!™ï™¾šŒ›[œ(�ö�Þ’Ÿ` -¡û¡É¢—£d¤3¥¦Ï¦žNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ/ �NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; READER DRIVER - DUMMY ; EXIT - A= CTRL-Z @þoNNNNNNNNNNNNNNNNN¡¡¡þ/£+NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û JR Z,LO ; LD A,C ;OUTPUT CHAR SET 7,A OUT (CENTOUT),A ; RES 7,A ;OUTPUT LOW TRUE STROBE OUT (CENTOUT),A SET 7,Aþ®þÉNNNNNNNNNNNNNNNN¡¡¡þ/ LàNNNNNNNNNNNNNNNNNNNNNN¡¡¡û****************************** GETMON: LD A,XMONROM OUT (ROMSEL),A RET ;********************************************lâÿÂNNNNNNNNNNNNNNNN¡¡¡þ/lœNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; SAVE REGS FIRST ; PUSH AF PUSH HL PUSH BC ; ; SAVE CURRENT ROM & GET MONITOR ROM ; IN A,(ROMSEL) LD (ROM›EþBNNNNNNNNNNNNNNNN¡¡¡þ/ƒWNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûE REGS & RETURN ; ITRAPR: LD A,(ROMSAV) ;RESTORE ROM # OUT (ROMSEL),A ; POP BC POP HL POP AF EI ;RE-ENABLE INTE€ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ/)ñNNNNNNNNNNNNNNNNNNNNNN¡¡¡û,2,8,14,20,26,6,12,18,24,4,10 ; DB 16,22 ;############################################################################ ; C>þ NNNNNNNNNNNNNNNN¡¡¡þ/%ïNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûDISK TYPE DVRFLG DS 1 ;DISK FLAGS DVR0SPT DS 1 ;TRK 0 SECTORS PER TRK DVR0SZ DS 1 ;TRK 0 SECTOR SIZE DVR1SPT DS 1 DVR1SZ DS¶þBNNNNNNNNNNNNNNNN¡¡¡þ/+à NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û;;DISK TYPE DB #FG DB #S0,#Z0,#S1,#Z1,#SD,#ZD LIST OFF ENDM DVR0: IF BOOT = 10H ALLDRV HDEXEC,4,60H,64,1,64,1,6h†þ„NNNNNNNNNNNNNNNN¡¡¡þ/\ÞNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ READER: LD A,CTRLZ ;FAKE EOF ;*********²èþNNNNNNNNNNNNNNNNN¡¡¡þ/³NNNNNNNNNNNNNNNNNNNNNN¡¡¡û OUT (CENTOUT),A RET ENDIF ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETU ÍþNNNNNNNNNNNNNNNN¡¡¡þ/³NNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************** ; ; MESSAGE EDITOR ; ENTRY- HL= TEXT PTR (BIT 7= 1: TERMINATOR) ; EXIT - REGS= ? ; ;***** ™ÿòNNNNNNNNNNNNNNNN¡¡¡þ/õ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSAV),A CALL GETMON ; ; PRINT PROMPT ; LD HL,ITMSG IQCONT: CALL EDITOR ; LD HL,IQMSG ;QUERY USER CALL EDITOR ; ]OþNNNNNNNNNNNNNNNN¡¡¡þ/ÖNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûRRUPTS RET ;---------------------------------------------------------------------------- ; ; UNSUPPORTED INTERRUPT ; ‚þNNNNNNNNNNNNNNNNN¡¡¡þ/ ‰ÿÂNNNNNNNNNNNNNNNN¡¡¡þ/ ÑNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û********************************* ; ; GET MONITOR PROM SUBR ; EXIT - A= ? ; ;**********************************************’áþrNNNNNNNNNNNNNNNN¡¡¡þ/_­NNNNNNNNNNNNNNNNNNNNNN¡¡¡û---------------- ; ; USER INTERRUPT ; ;---------------------------------------------------------------------------- ITRAP: ‘ þ$NNNNNNNNNNNNNNNNN¡¡¡þ/°fNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûITOR THEN EXECUTE MONITOR TRAP ; ITRAP1: CP A,'M' JR NZ,ITRAPR ; POP BC POP HL POP AF JP 0F824H ; ; ELSE RESTORDßþ9NNNNNNNNNNNNNNNN¡¡¡þ/ÀNNNNNNNNNNNNNNNNNNNNNN¡¡¡û########################################################### SDTRAN: GXLATE 26,6 ; DB 1,7,13,19,25,5,11,17,23,3,9,15 ; DB 21ˆaþ“NNNNNNNNNNNNNNNNN¡¡¡þ/$ðžNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;PHYSICAL DRIVE ; ; THE FOLLOWING MAY BE BROUGHT OFF DISK DESCRIPTOR OR FROM DEFAULT TABLES ; DVRDTYP DS 1 ;RESERVED FOR ½NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û######################################################## SD8PBK: DW 26 ;SECTORS PER TRACK DB 3 ;BLOCK SHIFT FACTOR DB 7 Y~ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ/”NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;DISK SIZE (CLUSTERS -1) (DSM) DW 1152 / 2 ;DIRECTORY MAX (DRM) DB 0FFH ;ALLOCATION 0 (AL0) DB 10000000B ;ALLOCATION¾ÿäNNNNNNNNNNNNNNNN¡¡¡þ/ {ÐNNNNNNNNNNNNNNNNNNNNNN¡¡¡û###################### ; ; MESSAGES ; ;############################################################################ MSGLEVÁþrNNNNNNNNNNNNNNNN¡¡¡þ/[¬NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ALLDPH: MACRO #D LIST ON D#D(DD)DPH: ;DRIVEÑ!þrNNNNNNNNNNNNNNNN¡¡¡þ/´gNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;############################################################################ ; ; THE FOLLOWING DATA MUST RESIDE IN THIS ORÀOÿÉNNNNNNNNNNNNNNNNN¡¡¡þ/ÁNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTCPTS ; ; CLOCK BUFFER ; CLKBFR DS 13 ENDIF ;####################################################################°ÁþrNNNNNNNNNNNNNNNN¡¡¡þ/%ôŸNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûHECKSUMS STORAGE (1 BYTE PER SECTOR) ENDIF LIST OFF ENDM ; ; RESERVE THE DATA SPACE ; DD DL 1 REPT NDRVS LIST hTþ!NNNNNNNNNNNNNNNN¡¡¡þ/+×�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û- DRIVE STORAGE SIZE (IN CLUSTERS) ; INT(((#_TRACKS - OFF) * SPT * BYTES PER SECTOR) / CLUSTER SIZE) -1 DPBDRM DS 2 ;DRM- DI%-þBNNNNNNNNNNNNNNNN¡¡¡þ/kîNNNNNNNNNNNNNNNNNNNNNN¡¡¡û;BLOCK MASK DB 0 ;NULL MASK DW 242 ;DISK SIZE -1 DW 63 ;DIRECTORY MAX DB 11000000B ;ALLOC 0 DB 0 ;ALLOC 1 DW 16 #nþHNNNNNNNNNNNNNNNNN¡¡¡þ/„%NNNNNNNNNNNNNNNNNNNNNN¡¡¡û 1 (AL1) DW 0 ;CHECK SIZE (CKS) DW 2 ;TRACK OFFSET (OFF) ; ; ; DB 01100000B ;FLAGS 256 BPS, HARD, SSSD DB 64,G�þNNNNNNNNNNNNNNNN¡¡¡þ/.ƒNNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡û: DM CR,LF,'LOAD ERROR' DSKEM: DM CR,LF,'Disk Error Status:',CR,LF DSKEB: DB 'H',CR,LF DM 'Abort, Ignore, Retry, (BDOS) - ' Á=ÿòNNNNNNNNNNNNNNNN¡¡¡þ/Â;NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û PARAMETER HEADER FOR DRIVE #D(DD) DW 0 ;SECTOR TRAN TBL (OR 0 IF NO XLATE) DW 0 ;SCRATCH AREA DW 0 ;" DW 0 ;" DW [¹ÿòNNNNNNNNNNNNNNNN¡¡¡þ/á4NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDER ; ;############################################################################ BTDRV: DS 1 ;DRIVE # BTTRK DS 2 ;TRACK #‚¤þNNNNNNNNNNNNNNNNN¡¡¡þ/ jNNNNNNNNNNNNNNNNNNNNNN¡¡¡û######## ; ; DRIVE ALLOCATION AREAS ; ;############################################################################ ;@@©þœNNNNNNNNNNNNNNNN¡¡¡þ/&¡ÌNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOFF ALLDAL 0123456789ABCDEF DD DL DD + 1 LIST ON ENDM ;#############################################################{Åþ„NNNNNNNNNNNNNNNN¡¡¡þ/,NNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRECTORY SIZE -1 DPBAL0 DS 2 ;AL0,1- DIRECTORY ALLOCATION ; 1 MSB PER DIRECTORY CLUSTER ALLOCATED DPBCKS DS 2 ;CKS- # DIRECÏtÿäNNNNNNNNNNNNNNNN¡¡¡þ/XßNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ;CHECK SIZE DW 2 ;TRACK OFFSET ; ; DEFAULT DISK PHYSICAL PARAMETERS ; DB 0 ;FLAGS DB 26,0,26,0,26,0 ;SECTORS PER T­¬ÿÂNNNNNNNNNNNNNNNN¡¡¡þ/ ·NNNNNNNNNNNNNNNNNNNNNN¡¡¡û1,64,1,64,1 ;64 SPT, 256 BPS ;############################################################################ ; ; MODE 2 INTx�þNNNNNNNNNNNNNNNNN¡¡¡þ/²NNNNNNNNNNNNNNNNNNNNNN¡¡¡û IF INTCPTS ISCMSG: DM CR,LF,'ILL SYS CALL',CR,LF ENDIF IF INTRPTS ITMSG DM CR,LF,'User' ILLIM DM CR,LF,'Ill.' IQ?Ýþ9NNNNNNNNNNNNNNNN¡¡¡þ/ñ NNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡ûDIRBF ;DIRECTORY BUFFER PTR DW D#D(DD)DPB ;DRIVE PARAMETER BLK PTR IF ((DD - 1) <= NDHD) AND ((DD - 1) >= STHD) DW 0 Í*þ�NNNNNNNNNNNNNNNNN¡¡¡þ/ÒNNNNNNNNNNNNNNNNNNNNNN¡¡¡û BTSEC DS 2 ;SECTOR # BTFLG DS 1 ;RESERVED FOR FLAGS BTDMA DS 2 ;DMA ADDRESS BTDMAX DS 1 ;DMA EXTENDED ADDRESS ;#######‚›ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ/!8[NNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; MACRO TO DEFINE THE DRIVE ALLOCATION & CHECKSUM"óÿaNNNNNNNNNNNNNNNN¡¡¡þ/'’ýNNNNNNNNNNNNNNNNNNNNNN¡¡¡û############### ; ; RESERVE DRIVE PARAMETER BLOCKS ; ;####################################################################¢ þHNNNNNNNNNNNNNNNN¡¡¡þ/-}6NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTORY SECTORS CHECKED ; (DRM +1) / 4 DPBOFF DS 2 ;OFF- # RESERVED TRACKS (USUALLY 2) DPBSZ DS 0 ENDM ; ; ;@@@@@@@@@@@@¸´þNNNNNNNNNNNNNNNN¡¡¡þ/ÁHNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRACK, SECTOR SIZE (128) ;############################################################################ ; ; DEFAULT 8" HARDéîþœNNNNNNNNNNNNNNNN¡¡¡þ/ âGNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûERRUPT VECTOR TABLE ; ;############################################################################ ; ; START ON AN EVEN PAyþ NNNNNNNNNNNNNNNNN¡¡¡þ/ÿNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûMSG DM ' Int. Abort? (Y/N) - ' ENDIF ;############################################################################ ; ÌðþrNNNNNNNNNNNNNNNN¡¡¡þ/¤YNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û;NO CHECKS ON HARD DISK ELSE DW D#D(DD)CHK ;DRIVE DISK CHECKSUMS ARRAY PTR ENDIF DW D#D(DD)ALL ;DRIVE CLUSTER ALLO ÈþœNNNNNNNNNNNNNNNN¡¡¡þ/K’NNNNNNNNNNNNNNNNNNNNNN¡¡¡û##################################################################### ; ; VARIABLES ; ;################################### öþ NNNNNNNNNNNNNNNN¡¡¡þ/"mNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS AREA ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ALLDAL: MACRO #D LIST ON IF ((DDfÿòNNNNNNNNNNNNNNNNN¡¡¡þ/(‚ÃNNNNNNNNNNNNNNNNNNNNNN¡¡¡û######## STRUCT 0 DPBSPT DS 2 ;SPT- SECTORS/TRACK DPBBSH DS 1 ;BSH- BLOCK SHIFT FACTOR DETERMINED BY CLUSTER SIZE ; 1K= k¦þœNNNNNNNNNNNNNNNN¡¡¡þ/.(eNNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE THE DPB FOR DRIVE MACRO ; ;@@@@@@@@@@@@@@@@@@@þNNNNNNNNNNNNNNNNNN¡¡¡þ/òyNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DISK PARAMETER BLOCK ; ;############################################################################ HDPBK: DW 128 ;SECTORSBXþNNNNNNNNNNNNNNNNN¡¡¡þ/ ÑvNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûAGE BOUNDARY ; IF $ AND 0FFH DS 100H - ($ AND 0FFH) ENDIF INTABL: REPT 7 ;1ST 7 ARE UNSUPPORTED LIST OFF DW ILLINßùþÉNNNNNNNNNNNNNNNNN¡¡¡þ/=ÎNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; DRIVE PARAMETER HEADER AREA ; 1 PER DRIVE ; ;############################################################################  ëþ�NNNNNNNNNNNNNNNN¡¡¡þ/—hNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCATION BIT MAP PTR LIST OFF ENDM ; ; DEFINE THE DATA ; DD DL 1 REPT NDRVS LIST OFF ALLDPH 0123456789ABCDEF DD DÌþrNNNNNNNNNNNNNNNN¡¡¡þ/x£NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û######################################### DTPTR: DS 2 ;DRIVE TABLE PTR LOGRQ: DS 1 ;LOG ON REQUEST REG. DVRTPTR DS 2 ;DRIVE D» þ„NNNNNNNNNNNNNNNN¡¡¡þ/#^9NNNNNNNNNNNNNNNNNNNNNN¡¡¡û - 1) >= STHD) AND ((DD - 1) <= NDHD) D#D(DD)ALL: DS 127 ;ALLOCATION BIT MAP FOR 8" HARD DRIVE #D(DD) ENDIF IF ((DD - 1ùÁþHNNNNNNNNNNNNNNNNN¡¡¡þ/)±òNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û3, 2K= 4, 4K= 5, 8K= 6, 16K= 7 DPBBLM DS 1 ;BLM- BLOCK MASK ; 1K = 7, 2K= 15, 4K= 31, 8K= 63, 16K= 127 DPBEXM DS 1 ;EXM- E£Ðþ$NNNNNNNNNNNNNNNNN¡¡¡þ//TNNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ALLDPB: MACRO #D LIST ON D#D(DD)DPB: DS DPBSZ ;ALLOCATION FOR DRIªRÿòNNNNNNNNNNNNNNNN¡¡¡þ/§*NNNNNNNNNNNNNNNNNNNNNN¡¡¡û PER TRACK (LOGICAL) (SPT) DB 5 ;BLOCK SHIFT FACTOR (BSH) DB 31 ;BLOCK MASK (BLM) DB 1 ;NULL MASK (EXM) DW 1015 ˆHÿÂNNNNNNNNNNNNNNNN¡¡¡þ/ HáNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT LIST ON ENDM ; DW ITRAP ;INT 8 IS USER INTERRUPT ENDIF ;######################################################ààþ9NNNNNNNNNNNNNNNN¡¡¡þ/h�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE A DISK PARAMETER TABLE MACRO ; }Gþ$NNNNNNNNNNNNNNNNN¡¡¡þ/‡VNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL DD + 1 LIST ON ENDM ; ; LAST OF INITIALIZED CODE READ FROM DISK ; BIOSND EQU $ SUBTTL UNINITIALIZED DATA AREA :Mþ„NNNNNNNNNNNNNNNN¡¡¡þ/-ðNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRIVER TABLE BASE ADDRESS PTR DVRXADR DS 2 ;DRIVE DRIVER EXECUTION ADDRESS ROMSAV DS 1 ;ROM SWAP SAVE OF ORIGINAL ROM IF IN±åþNNNNNNNNNNNNNNNNN¡¡¡þ/$Ç®NNNNNNNNNNNNNNNNNNNNNN¡¡¡û) >= ST8FD) AND ((DD - 1) <= ND8FD) D#D(DD)ALL: DS 57 ;ALLOCATION BIT MAP FOR 8" DRIVE #D(DD) D#D(DD)CHK DS 32 ;DIRECTORY CdÿÎNNNNNNNNNNNNNNNNN¡¡¡þ/*ä¡NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûXTENT MASK ; DSM < 256 : 1K= 0, 2K= 1, 4K= 3, 8K= 7, 16K= 15 ; DSM > 255 : 2K= 0, 4K= 1, 8K= 3, 16K= 7 DPBDSM DS 2 ;DSM̼þ$NNNNNNNNNNNNNNNNN¡¡¡þ/0NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûVE #D(DD) LIST OFF ENDM ; ; RESERVE THE DATA SPACE ; DD DL 1 REPT NDRVS LIST OFF ALLDPB 0123456789ABCDEF DD DL EþHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN$NNNNNNNN�Ð�ž‚lƒ:„ …Ö…£†p‡>ˆ ‰Ú‰§Šu‹CŒ�Þ�­Ž{�J�‘æ‘´’‚“O”•앺–ˆ—V˜$™ñ™¿š�›\œ)�÷�Äž“Ÿa .¡ü¡Ê¢˜£e¤4¥¦Ï¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ0ÆÄNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDD + 1 LIST ON ENDM IF (($ - 8000H) > 07800H) OR ($ < 8000H) CONMSG **** BIOS TOO BIG, USE MOVCPM & RE-ADJUST! ***€{þHNNNNNNNNNNNNNNNNN¡¡¡þ0lbNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; RETURN LIST DEVICE STATUS ; EXIT - A= 0: BUSY, FFH:READY ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++¹ÿÂNNNNNNNNNNNNNNNNN¡¡¡þ0 ƒ©NNNNNNNNNNNNNNNNNNNNNN¡¡¡û 26,6 ;############################################################################ ; ; COMMON I/O PARAMETER BLOCK ; ;#—Õþ'NNNNNNNNNNNNNNNNN¡¡¡þ0£ÕNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNO, CA ; ;**************************************************************************** ; ; CONFIGURATION: ; ; CPM ; DRIVE„þ9NNNNNNNNNNNNNNNN¡¡¡þ0LNNNNNNNNNNNNNNNNNNNNNN¡¡¡û20H ; A JADE 5" FLOPPY PHYSICAL DRIVE 0 ; B JADE 5" FLOPPY PHYSICAL DRIVE 1 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE ‰íþ$NNNNNNNNNNNNNNNNN¡¡¡þ0æ¸NNNNNNNNNNNNNNNNNNNNNN¡¡¡û 60k. ; 3.01 26 JUN 88 GRH ; Remove 5" floppy support. Implement in CP/M-86 BIOS. ; Change single function to return drive tà1þ NNNNNNNNNNNNNNNN¡¡¡þ0% æNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûructure in preparation for deblocking. ; 3.05 11-3-88 GRH ; Change included data to update IOPB.PBSTAT to new configuration.÷ËÿÂNNNNNNNNNNNNNNNN¡¡¡þ0+/éNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; 3.08 2-22-91 GRH ; Remove references to THIS_BNK & use monitor function #7 instead. ; Add track-head shift factor to DPBs�ØÿÂNNNNNNNNNNNNNNNN¡¡¡þ0“—NNNNNNNNNNNNNNNNNNNNNN¡¡¡û* ENDIF END :yþ$NNNNNNNNNNNNNNNNN¡¡¡þ0|\NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û+++++++++++++ ; LISTST: LD A,MF_LOS JP XMROM ;***********************************************************************ÿùNNNNNNNNNNNNNNNN¡¡¡þ0ÖúNNNNNNNNNNNNNNNNNNNNNN¡¡¡û########################################################################### ; IOPB: REPT PB_SIZE LIST OFF DB 0 LIST ON Õ�þNNNNNNNNNNNNNNNNNN¡¡¡þ0:BNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û USAGE IF BOOT = 10H ;HARD DISK BOOT CONFIG. ; A SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; B SIDE 2 & 3 OF HARD DISKôvþ NNNNNNNNNNNNNNNN¡¡¡þ0MNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û0 ; D SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 0 ; E SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; F SIDE 2 & 3 OF HARD DISK;CþäNNNNNNNNNNNNNNNNN¡¡¡þ0 óNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûable ptr into a BIOS function ; call using restart instruction. ; Change LOGON to specify the ID sector & track. At same timBÿÎNNNNNNNNNNNNNNNNN¡¡¡þ0&YµNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; 3.06 1-28-89 GRH ; Revised primitive calling procedures to use the monitor rom function ; rather than swapping Roms itsàoÿÂNNNNNNNNNNNNNNNN¡¡¡þ0,¶~NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û for future use. ; 3.09 5-15-91 GRH ; Change 8" floppy side select to track bit 0. Move calculation from ; DCM8 to CBIOS. Çíþ NNNNNNNNNNNNNNNN¡¡¡þ0 ¦NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û********************************** ; ; PUNCH DRIVER ; ENTRY- C= CHAR TO OUTPUT ; ;*****************************************š‚ÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ0 OmNNNNNNNNNNNNNNNNNNNNNN¡¡¡û***** ; ; MESSAGE EDITOR ; ENTRY- HL= TEXT PTR (BIT 7= 1: TERMINATOR) ; EXIT - REGS= ? ; ;********************************QñÿäNNNNNNNNNNNNNNNNN¡¡¡þ0åËNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ENDM ;############################################################################ ; ; DISK DRIVER TABLES (DDT) ; ;###Û¼ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ0 sNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û PHYSICAL DRIVE 0 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; D SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ; E JADE 8"é¼þNNNNNNNNNNNNNNNNNN¡¡¡þ0*|NNNNNNNNNNNNNNNNNNNNNN¡¡¡û PHYSICAL DRIVE 1 ; G JADE 8" FLOPPY PHYSICAL DRIVE 0 ; H JADE 8" FLOPPY PHYSICAL DRIVE 1 ENDIF ; ;*****************u9þNNNNNNNNNNNNNNNN¡¡¡þ0!À"NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûe, fix bug ; which did not specify the logon track. ; 3.02 7 JUL 88 GRH ; Add '?' to include file names. ; Change hard dþ�þNNNNNNNNNNNNNNNNN¡¡¡þ0'j„NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûelf. ; 3.07 11-25-90 GRH ; Modify for Ver. 1.22 Monitor. ; Fix bug in 8" Hard Disk table which benignly (at current level) µþHNNNNNNNNNNNNNNNN¡¡¡þ0-…ONNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û ; Remove IOPB ptr passing in IX redundancy. ; Change DPB track-head shift factor to Sector Offset like track ; offset. Disk 0.þ!NNNNNNNNNNNNNNNN¡¡¡þ091NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û*********************************** ; PUNCH: RET ;***********************************************************************PyþNNNNNNNNNNNNNNNNN¡¡¡þ0 >NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û******************************************** ; EDITOR: CALL GETBNK LD E,A LD A,MF_PUTS JP XMROM SUBTTL INITIALIZþ‰ÿäNNNNNNNNNNNNNNNNNN¡¡¡þ0ö†NNNNNNNNNNNNNNNNNNNNNN¡¡¡û######################################################################### ; STRUCT 0 DDT_EXE DS 2 ;START ADDRESS OF DISK DRIDOÿÎNNNNNNNNNNNNNNNNN¡¡¡þ0\ NNNNNNNNNNNNNNNNNNNNNN¡¡¡û FLOPPY PHYSICAL DRIVE 0 ; F JADE 8" FLOPPY PHYSICAL DRIVE 1 ENDIF IF BOOT = 3 ; A JADE 8" FLOPPY PHYSICAL DRIVE 0À„þ'NNNNNNNNNNNNNNNNN¡¡¡þ0³ëNNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************************** ; ; REVISION HISTORY: ; ; 3.00 - 26 JAN 87 GRH ; Implemented new common IO‚þNNNNNNNNNNNNNNNN¡¡¡þ0"•qNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûisk system tracks directory reference to new format. ; Correct bug in drivers which caused retry to fail. (sector remained ; ËàþNNNNNNNNNNNNNNNNN¡¡¡þ0(zºNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; caused the drive table to have bad data (default table was missing ; the 2 deblocking extension bytes). ; Implement data ‡wþBNNNNNNNNNNNNNNNN¡¡¡þ0.ÐNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûpartitioning will add this value to sector word. It ; will be stored in the ID sector data to be dynamic. ; ; 3.10 5-20-91 OþNNNNNNNNNNNNNNNN¡¡¡þ0 NNNNNNNNNNNNNNNNNNNNNN¡¡¡û***** ; ; PRINTER DRIVER ; ENTRY- C= CHAR TO OUTPUT ; ;********************************************************************ÐþNNNNNNNNNNNNNNNNN¡¡¡þ0 )NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûED DATA ;############################################################################ ; ; 3740 SECTOR TRANSLATION TABLE ; **)ÿäNNNNNNNNNNNNNNNNNN¡¡¡þ0Å·NNNNNNNNNNNNNNNNNNNNNN¡¡¡û TITLE CUSTOMIZED BIOS FOR M5B LIST NOCOND BOOT EQU 10H ;10H: HARD DISK, 3: 8" FLOPPY, 20H: 5" FLOPPY ;********************R[þ!NNNNNNNNNNNNNNNN¡¡¡þ0oNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; B JADE 8" FLOPPY PHYSICAL DRIVE 1 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; D SIDE 2 & 3 OF HARD DISK PHYSICAL �Pþ NNNNNNNNNNNNNNNN¡¡¡þ0€ÚNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûPB code & Jade floppy firmware support. ; Implemented disk drive driver tables and new function to return ; a ptr to a drive ÃþBNNNNNNNNNNNNNNNN¡¡¡þ0#¦@NNNNNNNNNNNNNNNNNNNNNN¡¡¡û corrupted) ; Stubbed out new Clock routines for present. ; 3.03 31 JUL 88 GRH ; Unstub Clock routines. ; 3.04 6 AUG 88 ´,þ$NNNNNNNNNNNNNNNNN¡¡¡þ0)I‹NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûxfer inhibit schemes with PB_FLG & PB_BCNT. ; Add pick-up of THIS_BNK data in all iopb cases. ; Remove clock buffer set/read sJ«þNNNNNNNNNNNNNNNNN¡¡¡þ0/ã-NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û GRH ; Change LOGON to attempt to recover from old disks better, using ; DCM8301 version controller firmware. ; ; 3.11 9-2-‡¶ÿÂNNNNNNNNNNNNNNNN¡¡¡þ0_SNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û******** ; LO: LD A,MF_LO JP XMROM ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Ç~ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ0 °˜NNNNNNNNNNNNNNNNNNNNNN¡¡¡û** CP/M SINGLE DENSITY **** ; ;############################################################################ ; SDTRAN: GXLATEjÿòNNNNNNNNNNNNNNNNN¡¡¡þ0�äNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û******************************************************** ; ; CUSTOMIZED BIOS FOR M5B ; (c) 1981 GRH Electronics, CUPERTIÅ5þ“NNNNNNNNNNNNNNNNN¡¡¡þ0/NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDRIVE 0 ; E SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; F SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ENDIF IF BOOT = oºþBNNNNNNNNNNNNNNNN¡¡¡þ0Õ‰NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûtable. ; Removed init of IOBYTE. ; Implemented 5" floppy driver. ; Implemented use of ROM primitives. ; Moved system down toùuþHNNNNNNNNNNNNNNNNN¡¡¡þ0$?×NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûGRH ; Remove floppy side select from BIOS & move to controller. ; Implement new ID sector format. ; Implement CP/M 3.0 DPB st$þ!NNNNNNNNNNNNNNNN¡¡¡þ0*ØNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûystem calls. ; 12-5-90 GRH ; Remove IX IOPB ptr passing to disk drivers. ; 1-13-91 GRH ; Fix bug which corrupted PB_FLG. †„þNNNNNNNNNNNNNNNNN¡¡¡þ00ð`NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û91 GRH ; Add redlines & change for M5ZMON v.2.00. ; ; 3.12 9-11-91 GRH ; Add deblocking code. ; 9-17-91 GRH Add r/ls\íþ�NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNþ€Ì�š‚gƒ5„…Ð…ž†k‡9ˆ‰Ô‰¡Šo‹=Œ �×�¥Žs�A�‘Ü‘ª’x“E”•á•®–|—I˜™ä™²š€›Oœ�ê�·ž†ŸT !¡î¡¼¢Š£W¤&¥ó¥Â¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ0ñôNNNNNNNNNNNNNNNNNNNNNN¡¡¡û & move to 59k system. ; 9-19-91 GRH Fix bug which destroyed my root directories! ; BUF_RD was writing. ; Patch proble ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ0[RNNNNNNNNNNNNNNNNNNNNNN¡¡¡û============================================================== ; ; CONDITIONAL ASSEMBLY FLAGS ; ;===========================3þNNNNNNNNNNNNNNNN¡¡¡þ0 ´™NNNNNNNNNNNNNNNNNNNNNN¡¡¡û====================================================================== ; SYS EQU 2 ;CP/M VERSION {2,3} ; NKSYS: EQU 59 ;SY‘þ9NNNNNNNNNNNNNNNN¡¡¡þ0”åNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFUNRST BFUNRSI EQU 0C7H + BFUNRST ;============================================================================ ; ; OTHEÆhÿòNNNNNNNNNNNNNNNN¡¡¡þ0{.NNNNNNNNNNNNNNNNNNNNNN¡¡¡û=================================================================== ; ; BDOS CONSTANTS ON ENTRY TO WRITE ; ;=========ÞXÿÈNNNNNNNNNNNNNNNNN¡¡¡þ0шNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û LIST OFF NXTSEC DL 1 ;;START WITH SECTOR 1 LOWEST DL 1 ;; REPT #SECTORS LIST ON DB NXTSEC LIST OFF NXTSEC DL NXT¨þNNNNNNNNNNNNNNNN¡¡¡þ0%;ÖNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û DB '.' DB ((DD % 100) / 10) + '0' DB (DD % 10) + '0' ENDM SUBTTL BIOS CODE ORG BIOS ;-------------------------ÊÿÂNNNNNNNNNNNNNNNN¡¡¡þ0+ÙNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIOFUNC ;EXECUTE FUNCTION CALL ;############################################################################ ; ; THE FOLL@­þ„NNNNNNNNNNNNNNNN¡¡¡þ0¤§NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûms with partitioning until 20MB drive installed. ; Fix TPA corruption by LOGON problem by using ROMBNK sector buffer for ; ‘þNNNNNNNNNNNNNNNNN¡¡¡þ0KlNNNNNNNNNNNNNNNNNNNNNN¡¡¡û================================================= ; INTCPTS EQU TRUE ;ENABLE SYSTEM CALL INTERCEPT WHISTLE ;============Yþ“NNNNNNNNNNNNNNNN¡¡¡þ0áÊNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûSTEM SIZE IN K BYTES KBYTE: EQU 1024 CPMSZ: EQU KBYTE * NKSYS CPMBS: EQU CPMSZ - (20 * KBYTE) ;CP/M BIAS VALUE CCP: EQU CPMÛÿòNNNNNNNNNNNNNNNN¡¡¡þ0 rNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR DECLARATIONS ; ;============================================================================ ; SECSZ: EQU 128 NDRVS: EQU <þ NNNNNNNNNNNNNNNN¡¡¡þ0.}NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û=================================================================== ; WRALL EQU 0 ;WRITE TO ALLOCATED WRDIR EQU 1 ;WRITE TO Da€þdNNNNNNNNNNNNNNNNN¡¡¡þ0 Ä#NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSEC + #SKEW ;ADD SKEW FACTOR ;; IF NXTSEC > #SECTORS ;CHECK FOR OVERFLOW NXTSEC DL NXTSEC - #SECTORS ;; IF NXTSEC <= ‰äþ�NNNNNNNNNNNNNNNNN¡¡¡þ0&n…NNNNNNNNNNNNNNNNNNNNNN¡¡¡û--------------------------------------------------- ; ; BIOS JUMP VECTOR TABLE ; ;----------------------------------------ÛºþœNNNNNNNNNNNNNNNN¡¡¡þ0,�NNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOWING BOOT DATA MUST RESIDE AS DEFINED RIGHT BEFORE THE COLD ; INIT ROUTINE START AND MUST BE IN THE 1ST SECTOR. THESE 2 WORDS BÕþ NNNNNNNNNNNNNNNN¡¡¡þ0—–NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ID sector read. ; 9-20-91 GRH Fold in redlines. ; 10-21-91 GRH Fix bugs ; 10-22-91 GRH Fix bugs ; 10-23-91 GRH ¼þBNNNNNNNNNNNNNNNN¡¡¡þ0 x]NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û================================================================ ; ; INCLUDE COMIOPB3.DEF ; INCLUDE DISKS3.DEF ; INCLU4‚þNNNNNNNNNNNNNNNNNN¡¡¡þ0ÒûNNNNNNNNNNNNNNNNNNNNNNð¡¡¡ûBS + 3400H ;ADDR OF CCP BDOS: EQU CPMBS + 3C00H ;ADDRESS OF BDOS BIOS: EQU CPMBS + 4A00H ;ADDRESS OF BDOS BIOSR: EQU 1000HÎëþrNNNNNNNNNNNNNNNN¡¡¡þ0>CNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û6 IF BOOT = 10H ; ; 8" HARD DISK BOOT DATA ; STHD EQU 0 ;START LOGICAL DRIVE OF HARD DISK NDHD EQU 3 ;LAST LOGICAL V›ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ0LNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûIRECTORY WRUAL EQU 2 ;WRITE TO UNALLOCATED ;============================================================================ ïÿþœNNNNNNNNNNNNNNNN¡¡¡þ0!÷NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLOWEST ;CHECK FOR REPEAT NXTSEC DL LOWEST + 1 LOWEST DL NXTSEC ENDIF ENDIF ;; ENDM LIST ON ENDM ;@@@@@@@@@nÖþNNNNNNNNNNNNNNNNN¡¡¡þ0']´NNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------------------------ ; JP INIT1 ;COLD START ENTRY JP WARM ;RELOAD CCP/BDOS JP CNSCK ;GET CONSOLE STATU¹yÿÞNNNNNNNNNNNNNNNN¡¡¡þ0-²NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûARE ; REFERENCED BY THE BOOT LOADER CODE IN ORDER TO DETERMINE THE LOAD ADDRESS ; AND LENGTH OF THE BIOS. ; ;###############ö—þNNNNNNNNNNNNNNNN¡¡¡þ0NNNNNNNNNNNNNNNNNNNNNN¡¡¡û Fix bugs ; VERSN EQU 312 ; ;**************************************************************************** SUBTTL SYSTEM À þNNNNNNNNNNNNNNNNN¡¡¡þ0 -NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDE BDIR.DEF ; INCLUDE M5ZF2.DEF ; ;============================================================================ ;ˆ¡þ NNNNNNNNNNNNNNNNN¡¡¡þ0Á¶NNNNNNNNNNNNNNNNNNNNNN¡¡¡û - BIOS ; ; PAGE 0 LOCATIONS ; PAGE0: EQU 0 ;START OF CP/M RAM DEFDRV: EQU PAGE0 + 4 ;DEFAULT DRIVE PARAM ADDR BDOSJV E#UÿòNNNNNNNNNNNNNNNN¡¡¡þ0kNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDRIVE OF HARD DISK ST8FD EQU 4 ;START LOGICAL DRIVE OF 8" FLOPPY ND8FD EQU 5 ;LAST LOGICAL DRIVE OF 8" FLOPPY ENDIF öÿÎNNNNNNNNNNNNNNNNN¡¡¡þ0„ÛNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û; ; ASCII CHARS ; ;============================================================================ ; LF: EQU 0AH CR: EQU 0DH –‹þ9NNNNNNNNNNNNNNNN¡¡¡þ0"¢ANNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; INITIALIZE VERSION TEXT IN RAM MACRO ; ;@@@@@@@@@@@@A¯ÿäNNNNNNNNNNNNNNNNN¡¡¡þ0(MŠNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS JP CI ;CONSOLE INPUT JP COC ;CONSOLE OUTPUT JP LO ;PRINTER OUTPUT JP PUNCH JP READER JP HOME ;HOME SELECTED DRÓSþœNNNNNNNNNNNNNNNN¡¡¡þ0.ç,NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û############################################################# ; DB 0 ;Z80 CPU DB 0 ;SPARE BIOSSZ: DW BIOSND - BIOS ;BIOSò6þNNNNNNNNNNNNNNNNNN¡¡¡þ0=0NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDECLARATIONS ;============================================================================ ; ; ASSEMBLY PARAMETERS ; ;=====ú“þ�NNNNNNNNNNNNNNNNN¡¡¡þ0 ?NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û LIST OFF *INCLUDE COMIOPB3.DEF *INCLUDE DISKS3.DEF *INCLUDE BDIR.DEF *INCLUDE M5ZF2.DEF LIST ON ;FþNNNNNNNNNNNNNNNNN¡¡¡þ0ò‡NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûQU PAGE0 + 5 ;BDOS SYSTEM CALL ENTRY THIS_STK EQU PAGE0 + 1CH ;CURRENT STACK FRAME PTR DK_BDRV EQU 0041H ;BOOT DRIVE # FROM P[ôþNNNNNNNNNNNNNNNN¡¡¡þ0X!NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûIF BOOT = 3 ; ; 8" FLOPPY BOOT DATA ; STHD EQU 2 ;START LOGICAL DRIVE OF HARD DISK NDHD EQU 5 ;LAST LOGICAL DRIVE OF HA6“þäNNNNNNNNNNNNNNNN¡¡¡þ0·êNNNNNNNNNNNNNNNNNNNNNN¡¡¡û CTRLZ: EQU 1AH ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE THE TRANSLATIO€ñÿÂNNNNNNNNNNNNNNNN¡¡¡þ0#‘pNNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; PVERS MACRO #VERS DD DL #VERS IF DD > 9999 DB (DD / Àøþ“NNNNNNNNNNNNNNNNN¡¡¡þ0)~»NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIVE JP SELDSK ;SELECT DISK DRIVE JP SETTRK ;SET TRACK # JP SETSEC ;SET SECTOR # JP SETDMA ;SET TRANSFER ADDR JP DIÌþäNNNNNNNNNNNNNNNNN¡¡¡þ0/ÔNNNNNNNNNNNNNNNNNNNNNN¡¡¡û MODULE SIZE IN BYTES BIOSST: DW BIOS ;BIOS MODULE LOAD ADDR FOR SBD ; ; CONTINUE ON WITH INIT ; INIT1: JR INIT ;##Jƒþ9NNNNNNNNNNNNNNNN¡¡¡þ0hcNNNNNNNNNNNNNNNNNNNNNN¡¡¡û======================================================================= ; FALSE EQU 0 TRUE EQU NOT FALSE ;==============qžÿÂNNNNNNNNNNNNNNNN¡¡¡þ0 ‡¨NNNNNNNNNNNNNNNNNNNNNN¡¡¡û============================================================================ ; ; DISK OPERATING SYSTEM ADDRESSES ; ;======˜þDNNNNNNNNNNNNNNNN¡¡¡þ0§ÔNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûROM DEFBFR EQU PAGE0 + 80H ;DEFAULT BUFFER ; ; BIOS FUNCTION CALL RESTART VECTOR ; BFUNRST EQU 28H BFUNRSV EQU PAGE0 + BªÒþ³NNNNNNNNNNNNNNNNN¡¡¡þ0HNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRD DISK ST8FD EQU 0 ;START LOGICAL DRIVE OF 8" FLOPPY ND8FD EQU 1 ;LAST LOGICAL DRIVE OF 8" FLOPPY ENDIF ;=========Ɉþ9NNNNNNNNNNNNNNNN¡¡¡þ0â¹NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûN TABLE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; GXLATE MACRO #SECTORS, #SKEWDÐþ'NNNNNNNNNNNNNNNNN¡¡¡þ0$çNNNNNNNNNNNNNNNNNNNNNN¡¡¡û10000) + '0' DD DL DD % 10000 ENDIF IF DD > 999 DB (DD / 1000) + '0' DD DL DD % 1000 ENDIF DB (DD / 100) + '0'µÌþ!NNNNNNNNNNNNNNNN¡¡¡þ0*+èNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSKRD ;PERFORM DISK READ JP DISKWR ;PERFORM DISK WRITE JP LISTST ;RETURN LIST STATUS JP SECTRN ;TRANSLATE SECTOR JP B 6þNNNNNNNNNNNNNNNNN¡¡¡þ00ÇPNNNNNNNNNNNNNNNNNNNNNN¡¡¡û########################################################################## ; ; DIRECTORY SECTOR BUFFER STARTS HERE AFTER CRUNC“êþ�NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNHNNNNNNNNN�Ð�ž‚kƒ9„…Ö…¤†q‡?ˆ ‰Û‰¨Šv‹CŒ�Ý�ªŽx�F�‘â‘°’}“J”•啲–€—M˜™è™¶š„›Rœ�í�ºžˆŸV #¡ñ¡¾¢Œ£Y¤(¥ö¥Ä¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ1°pNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHING COLD START ; CODE. THIS BUFFER IS USED BY THE CP/M DIRECTORY CHECK ROUTINES THAT ; CHECK FOR DISK CHANGE. ; ;########´Þþ“NNNNNNNNNNNNNNNNN¡¡¡þ1ÖNNNNNNNNNNNNNNNNNNNNNNþ€¡¡¡û TO WARM START ; LD HL,(BIOS+4) LD (BIOS+1),HL ; ; INIT OUR STUFF ; CALL GETBNK LD (BUF_DMAB),A ; ; INITIALIZElþHNNNNNNNNNNNNNNNN¡¡¡þ1 õNNNNNNNNNNNNNNNNNNNNNN¡¡¡û-80 Vers 2.2',CR,LF DB 'M5b CBIOS Vers ' PVERS VERSN DM CR,LF IF $ > (DIRBF + SECSZ) CONMSG **** WARNING! C[íþ9NNNNNNNNNNNNNNNN¡¡¡þ1ÕaNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûON DRIVE TO INIT TABLES ; LD A,(DK_BDRV) AND A,3 ;MODULO 4 LD C,A LD E,0 CALL SELDSK LD A,L ;IF ERROR THEN ABORT »ÿòNNNNNNNNNNNNNNNN¡¡¡þ1:ªNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR THEN EXIT ; ; NEXT SECTOR ; LD HL,CPM_SEC INC (HL) ; LD DE,128 ;DMA += SECTOR SIZE LD HL,(CPM_DMA) ADD HL,DE R×þINNNNNNNNNNNNNNNNN¡¡¡þ1� NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL EDITOR CALL MR_BRK HALT ; ; ; BOOT OK, INIT PAGE 0 ; WZRPG: ; ; INIT BIOS WARM START IN PAGE 0 ; LD A,0C3H ”òþNNNNNNNNNNNNNNNN¡¡¡þ1%zRNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; READ A DISK SECTOR ; EXIT - A= 0: OK; /0: ERROR ; ;+++++++++++++M8þNNNNNNNNNNNNNNNN¡¡¡þ1+Y]NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûW_RET ;**************************************************************************** ; ; WRITE DISK SECTOR FUNCTION ; ENTÒ§þNNNNNNNNNNNNNNNN¡¡¡þ1å#NNNNNNNNNNNNNNNNNNNNNN¡¡¡û#################################################################### ; DIRBF: EQU $ ;BUFFER BEGINNING ;-----------------h•þNNNNNNNNNNNNNNNNN¡¡¡þ1 èNNNNNNNNNNNNNNNNNNNNNN¡¡¡û CLOCK VECTORS IF CLOCK INSTALLED ; LD A,MF_CSYN ;TEST FOR BOARD PRESENT CALL XMROM ; ; IF CLOCK PRESENT THEN TURN ON CÿDþ$NNNNNNNNNNNNNNNN¡¡¡þ1 NNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOLD INIT CODE BIGGER THAN DIR BUFFER **** ELSE DS DIRBF+SECSZ-$ ;FILL OUT DIRECTORY BUFFER TO 1 SECTOR SIZE ENDIF ¶þrNNNNNNNNNNNNNNNN¡¡¡þ1LöNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û OR A,H JR Z,WEROR ; ; READ BOOT DIRECTORY ; LD BC,DEFBFR ;SET XFER ADDRESS (USE DEFAULT BUFFER) CALL SETDMA ; ìâþrNNNNNNNNNNNNNNNN¡¡¡þ1oùNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD (CPM_DMA),HL ; ; IF NOT INTO BDOS THEN READ NEXT SECTOR ; LD DE,BDOS XOR A,A SBC HL,DE JR C,WREAD ; ; ELSE¶êþ NNNNNNNNNNNNNNNNN¡¡¡þ1 …§NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD HL,BIOS + 3 LD (PAGE0),A LD (PAGE0 + 1),HL ; ; INIT BDOS CALL VECTOR IN PAGE 0 ; LD HL,BDOS + 6 LD (BDOSJV),A Ô�þ!NNNNNNNNNNNNNNNN¡¡¡þ1&/NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; DISKRD: ; ; SET UP DATA TABLE PTRS ; PUSH IX LD IX,z%þ„NNNNNNNNNNNNNNNN¡¡¡þ1,ÀÊNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûRY- C= WRITE TYPE: ; 0: WRITE TO ALLOCATED BLOCK (UPDATE) ; 1: WRITE TO DIRECTORY BLOCK (ALLWAYS WRITE) ; 2: WRITE TO U@}þdNNNNNNNNNNNNNNNN¡¡¡þ1ÖNNNNNNNNNNNNNNNNNNNNNN¡¡¡û----------------------------------------------------------- ; ; INIT - COLD START ENTRY FROM BOOT MUST SET ALL BIOS PARAMS(‹ÿ\NNNNNNNNNNNNNNNN¡¡¡þ1 9ÙNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLOCK DRIVE ; OR A,A LD A,38H ;COND. JR (ON) JR Z,CLKON ; ; ELSE TURN OFF CLOCK DRIVE ; LD A,18H ;UNCOND. JR (OFFÝtþNNNNNNNNNNNNNNNNNN¡¡¡þ1“NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ;---------------------------------------------------------- ; ; WARM REBOOT ENTRY LOADS CCP,BDOS FROM DISK & ; SETS UP VARIAþ9NNNNNNNNNNNNNNNN¡¡¡þ1ÇNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLD BC,BD_SEC ;SET DIRECTORY SECTOR CALL SETSEC ; LD BC,0 ;SET TRACK TO 0 CALL SETTRK ; CALL DISKRD JR NZ,WEROR ; YQþNNNNNNNNNNNNNNNNNN¡¡¡þ1\ÈNNNNNNNNNNNNNNNNNNNNNN¡¡¡û IF AT BEGINNING OF BDOS THEN SET UP NEW TRACK & SECTOR ; JR Z,RDBDOS ; ; ELSE IF NOT AT BIOS THEN READ NEXT SECTOR ; ÕTþNNNNNNNNNNNNNNNN¡¡¡þ1!¶–NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û LD (BDOSJV + 1),HL ; ; INIT BIOS CALL VECTOR IN PAGE 0 ; LD HL,BIOFUNC LD (BFUNRSV),A LD (BFUNRSV + 1),HL ; ; SEp�þ�NNNNNNNNNNNNNNNNN¡¡¡þ1'0NNNNNNNNNNNNNNNNNNNNNN¡¡¡û(CUR_DDT) ; PUSH IY LD IY,(CUR_DPB) ; ; IF NOT BLOCKED THEN USE CPM READ ; LD A,(IY + DPB_PSH) ;0= 128-BYTE SECTORS šþ$NNNNNNNNNNNNNNNN¡¡¡þ1-óûNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNALLOCATED BLOCK (NO NEED TO PRE-READ) ; ;**************************************************************************** ; DIS­žþBNNNNNNNNNNNNNNNN¡¡¡þ1O…NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ;---------------------------------------------------------------------------- ; INIT: ; ; SET TEMPORARY STACK ; DI¢³þ!NNNNNNNNNNNNNNNN¡¡¡þ1 lŠNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û) (CAUSES JUMP TO ILLEGAL) ; CLKON: LD (INHCLK),A ; ; BOOT CCP & BDOS ; JR WARM ;#################################2¦þ NNNNNNNNNNNNNNNNN¡¡¡þ1€2NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBLES ; ;---------------------------------------------------------- ; WARM: ; ; SET TEMPORARY STACK ; DI LD SP,DEFBF$þ NNNNNNNNNNNNNNNN¡¡¡þ1*”NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; CHECK FOR VALID BOOT DIRECTORY ; LD A,(DEFBFR) CP A,86H JR C,WEROR ; ; SET UP TO LOAD CCP/BDOS ; LD HL,(DEFBFRógþNNNNNNNNNNNNNNNNNN¡¡¡þ1Å_NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLD DE,BIOS - BDOS SBC HL,DE JP C,WREAD ; ; ELSE DONE READING SYSTEM ; JR WZRPG ; ; ; ELSE SET UP & READ BDOS ; ]oþ„NNNNNNNNNNNNNNNN¡¡¡þ1"ãÅNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT DEFAULT SECTOR BUFFER ; LD BC,DEFBFR CALL SETDMA ; IF INTCPTS ; ; PUT BDOS VECTOR INTO INTERCEPT CODE ; LD HL,ƒ€ÿäNNNNNNNNNNNNNNNNN¡¡¡þ1( NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û OR A,A JP Z,DISKRDN ; ; READS DON'T NEED ALLOCATION ; XOR A,A LD (UNA_CNT),A ; ; READ_OPERATION_FLAG = TRUE (1)6DÿÂNNNNNNNNNNNNNNNN¡¡¡þ1.¦¨NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûKWR: ; ; REMOVE BOOT WRITE PROTECTION ; XOR A,A LD (WR_PROT),A ; ; SET PTRS TO DISK DATA ; PUSH IX LD IX,(CUR_ pþNNNNNNNNNNNNNNNNNN¡¡¡þ1|´NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD SP,DEFBFR ;USE PAGE 0 FOR STACK LD (THIS_STK),SP EI ; ; INIT DEFAULT DRIVE ; LD A,(DK_BDRV) ;USE DRIVE # PASSEDPþNNNNNNNNNNNNNNNNN¡¡¡þ1 _»NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û########################################### ; ; SIGN-ON MESSAGE ; ;#########################################################Á?þrNNNNNNNNNNNNNNNNN¡¡¡þ1³NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR LD (THIS_STK),SP EI ; ; INIT OUR STUFF ; XOR A,A LD (BUF_ACT),A ;ASSUME NO DATA IN BUFFER ; LD (UNA_CNT),A ;CLe'þ,NNNNNNNNNNNNNNNN¡¡¡þ1¥NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û + BD_SBDSS) ;PREFETCH BDOS TRK/SECTOR PUSH HL ; LD HL,(DEFBFR + BD_SCCPS) ;FETCH CCP TRK/SECTOR LD C,L LD B,0 CALL SX@þrNNNNNNNNNNNNNNNN¡¡¡þ1önNNNNNNNNNNNNNNNNNNNNNN¡¡¡û RDBDOS: POP HL ;RESTORE BDOS TRK/SECTOR FROM DIRECTORY LD C,L LD B,A ;A STILL CONTAINS 0 CALL SETSEC ; LD C,H CALL~ÀÿÂNNNNNNNNNNNNNNNN¡¡¡þ1#ÐôNNNNNNNNNNNNNNNNNNNNNNð¡¡¡û(BDOS + 7) LD (BDOSV),HL ; ; NOW PUT INTERCEPT VECTOR INTO BDOS CODE ; LD HL,INTCPT LD (BDOS + 7),HL ENDIF ; ; ‘þ“NNNNNNNNNNNNNNNNN¡¡¡þ1)??NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; INC A LD (READOP),A ; ; PRE-READ_OF_DATA_FLAG = TRUE ; LD (RSFLAG),A ; ; TREAT AS UNALLOCATED BLOCK ; LD AûÂþäNNNNNNNNNNNNNNNNN¡¡¡þ1/•™NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDDT) ; PUSH IY LD IY,(CUR_DPB) ; ; IF NOT BLOCKED THEN USE CPM WRITE ; LD A,(IY + DPB_PSH) ;0= 128-BYTE SECTORS ORï™þrNNNNNNNNNNNNNNNN¡¡¡þ1)çNNNNNNNNNNNNNNNNNNNNNN¡¡¡û IN PAGE 0 AND A,3 LD (DEFDRV),A ; ; SEND SYSTEM SIGN-ON ; LD HL,MSGSO CALL EDITOR ; ; MODIFY COLD START VECTORoKþBNNNNNNNNNNNNNNNN¡¡¡þ1 Æ,NNNNNNNNNNNNNNNNNNNNNN¡¡¡û################### ; MSGSO: DB CR,LF DB CPMSZ / (KBYTE * 10) + '0' DB (CPMSZ MOD (KBYTE * 10)) / KBYTE + '0' DB 'K CP/MÇþ NNNNNNNNNNNNNNNN¡¡¡þ1æPNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûEAR UNALLOCATED SECTOR COUNT ; LD (BUF_MOD),A ;CLEAN BUFFER ; LD HL,BLKBUF ;INIT BUFFER PTR LD (BUF_DMA),HL ; ; LOG •5þ$NNNNNNNNNNNNNNNNN¡¡¡þ1 ›NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûETSEC ; LD C,H CALL SETTRK ; LD BC,CCP CALL SETDMA ; ; READ CCP/BDOS ; WREAD: CALL DISKRD JR NZ,WEROR ;IF ERROl}ÿÂNNNNNNNNNNNNNNNN¡¡¡þ1£=NNNNNNNNNNNNNNNNNNNNNN¡¡¡û SETTRK ; JR WREAD ; ; ; WARM BOOT ERROR, OUTPUT MSG & GO TO DEBUGGER ; WEROR: LD HL,MSGLE ;OUTPUT ERROR MESSAGE CALs™þ$NNNNNNNNNNNNNNNNN¡¡¡þ1$IcNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û PASS DEFAULT DISK TO CCP ; LD A,(DEFDRV) LD C,A JP CCP SUBTTL BIOS DISK FUNCTION ROUTINES ;++++++++++++++++++++++ÿ,þNNNNNNNNNNNNNNNNNN¡¡¡þ1*jlNNNNNNNNNNNNNNNNNNNNNN¡¡¡û,WRUAL LD (WRTYPE),A ; JP RWOPER ;TO PERFORM THE READ ; ; ; NORMAL NON-BLOCKED READ ; DISKRDN: CALL CPM_RD JP R‹ôþ'NNNNNNNNNNNNNNNNN¡¡¡þ10†ÔNNNNNNNNNNNNNNNNNNNNNN¡¡¡û A,A JP Z,DISKWRN ; ; READ_OP_FLAG = FALSE ; XOR A,A LD (READOP),A ; ; SAVE WRITE TYPE ; LD A,C LD (WRTYPE),bþHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÎNNNNþ€Ì�š‚gƒ5„…Ð…�†k‡9ˆ‰Ó‰ Šn‹;Œ�Õ�£Žq�>� ‘Ù‘§’t“A”•Ý•ª–x—E˜™á™¯š}›Kœ�æ�³ž�ŸO ¡ê¡·¢…£S¤!¥î¥¼¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ1‡@NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA ; ; IF 1ST WRITE TO UNALLOCATED (NEW, UNUSED) BLOCK THEN SET PARAMETERS ; CP A,WRUAL JP NZ,CHKUNA ; ; COUNT = NUM¢þNNNNNNNNNNNNNNNNN¡¡¡þ1-æNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTRK) ;SAME TRACK? LD DE,(CPM_TRK) SBC HL,DE JR NZ,ALLOC ; LD HL,(CPM_SEC) LD DE,(UNA_SEC) SBC HL,DE JR NZ,ALLOC úuþNNNNNNNNNNNNNNNN¡¡¡þ1 Â-NNNNNNNNNNNNNNNNNNNNNN¡¡¡û (UNA_CNT),A ; INC A ;PREREAD FLAG = TRUE LD (RSFLAG),A ; ; ; ; COMMON CODE FOR READ AND WRITE FOLLOWS ; RWOPER: ªÿòNNNNNNNNNNNNNNNN¡¡¡þ1âQNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûANY CASE ; OR A,A JR Z,FILHST ; ; HOST BUFFER ACTIVE, SAME AS SEEK BUFFER? ; LD A,(CPM_DSK) LD HL,BUF_DSK ;SAME DIA¥þäNNNNNNNNNNNNNNNN¡¡¡þ1 šNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûALL NZ,BUF_RD ;YES, IF 1 ; ; BUFFER = CLEAN ; XOR A,A LD (BUF_MOD),A ; MATCH: ; ; COPY DATA TO OR FROM BUFFER ;R;þHNNNNNNNNNNNNNNNNN¡¡¡þ1§ -> BITS <14..8> LD H,A ; LD A,0 ;BIT 0 -> BIT 7 RRA'Kþ!NNNNNNNNNNNNNNNN¡¡¡þ1!�¦NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOT DIRECTORY THEN DELAY WRITE CP A,WRDIR LD A,(IOPB + PB_STATO) ;RETURN ANY ERRORS ANYWAY JR NZ,RW_RET ; ; IF ERROR THHlþNNNNNNNNNNNNNNNNNN¡¡¡þ1'+NNNNNNNNNNNNNNNNNNNNNNð¡¡¡ûTATO)= 0: OK, /0: ERROR ; ;**************************************************************************** ; CPM_WR: ; LD HLЀþ“NNNNNNNNNNNNNNNN¡¡¡þ1-ÄËNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û POP IX RET ;**************************************************************************** ; ; CPM_RD PERFORMS THE PHY£�þ!NNNNNNNNNNNNNNNN¡¡¡þ1xµNNNNNNNNNNNNNNNNNNNNNN¡¡¡û TO SEEK ; LD HL,(CPM_SEC) LD (UNA_SEC),HL ; ; IF NO UNALLOCATED SECTORS REMAIN THEN PREREAD ; CHKUNA: LD A,(UNA_CNT)�þNNNNNNNNNNNNNNNNNN¡¡¡þ1 [ºNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD HL,0 ;SECTOR = 1 LD (UNA_SEC),HL ; LD HL,(UNA_TRK) ;TRACK++ INC HL LD (UNA_TRK),HL ; NOOVF: ; ; MATCH FOUND, M« þäNNNNNNNNNNNNNNNNN¡¡¡þ1·NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûECTORS JP Z,NOSECSHF ;IF ALREADY 0 THEN SECTOR SIZE IS 128 ; SECSHFLP: SRL H ;ELSE SHIFT OVER TO PHYSICAL SECTOR RR LÈÀþNNNNNNNNNNNNNNNN¡¡¡þ1¤NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE IT OUT BEFORE READING NEW ONE ; CALL BUF_FLSH ;CLEAR HOST BUFF ; JR NZ,RW_RET ;IF ERROR THEN ABORT ; FILHST: ; ; RÅnþNNNNNNNNNNNNNNNN¡¡¡þ1òoNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD L,A ; ; HL HAS RELATIVE HOST BUFFER ADDRESS ; LD DE,BLKBUF ADD HL,DE ;HL = HOST ADDRESS ; LD DE,(CPM_DMA) ;GE„pÿäNNNNNNNNNNNNNNNN¡¡¡þ1"ÔõNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEN ABORT ; OR A,A JR NZ,RW_RET ; ; NO ERROR/DIRECTORY WRITE ; XOR A,A ;BUFFER = CLEAN LD (BUF_MOD),A ; CALL B9“ÿ[NNNNNNNNNNNNNNNNN¡¡¡þ1(;>NNNNNNNNNNNNNNNNNNNNNN¡¡¡û,LL_WRIT JP CPM_RW ;**************************************************************************** ; ; CPM_RD2 PERFORMS T¯¿þ!NNNNNNNNNNNNNNNN¡¡¡þ1.‘˜NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûSICAL READ FROM THE DISK INTO CPM_DMA. ; ENTRY- (CPM_DSK)= DISK # TO READ FROM ; (CPM_TRK)= TRACK # TO READ FROM ; (CPM_SECr#ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ1K„NNNNNNNNNNNNNNNNNNNNNN¡¡¡û OR A,A JP Z,ALLOC ; ; ELSE MORE UNALLOCATED RECORDS REMAIN, COUNT-- ; DEC A LD (UNA_CNT),A ; ; IF REQUESTED SE§þgNNNNNNNNNNNNNNNNN¡¡¡þ1 h‹NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûARK AS UNNECESSARY READ ; XOR A,A ;PREREAD FLAG = FALSE LD (RSFLAG),A JP RWOPER ; ; ; NORMAL NON-BLOCKED WRITE ; �þ NNNNNNNNNNNNNNNNN¡¡¡þ1„3NNNNNNNNNNNNNNNNNNNNNN¡¡¡û DEC A JP NZ,SECSHFLP ; NOSECSHF: INC HL ;SET BACK TO PHYSICAL SECTOR LD (BUF_PSEC),HL ;BUFFER PHYSICAL SECTOR TO ACC9íþüNNNNNNNNNNNNNNNN¡¡¡þ1.•NNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡ûEAD THE SECTOR BUFFER ; LD A,(CPM_DSK) ;BUFFER SECTOR = PHYSICAL SECTOR LD (BUF_DSK),A ; LD HL,(CPM_TRK) LD (BUF_TRK),Æ®ÿòNNNNNNNNNNNNNNNN¡¡¡þ1Á^NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT/PUT CP/M DATA LD BC,128 ;LENGTH OF MOVE ; LD A,(READOP) ;WHICH WAY? OR A,A JP NZ,RWMOVE ;SKIP IF READ ; ; WRITE tVþœNNNNNNNNNNNNNNNN¡¡¡þ1#çÄNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUF_WR ;WRITE TO DISK ; LD A,(IOPB + PB_STATO) ;RETURN ANY ERRORS ; ; DONE, RESTORE & RETURN ; RW_RET: OR A,A ;SET RES'NÿÉNNNNNNNNNNNNNNNNN¡¡¡þ1)NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHE PHYSICAL READ FROM THE DISK INTO CPM_DMA, ; WITHOUT BLOCKING. ; ENTRY- (CPM_DSK)= DISK # TO READ FROM ; (CPM_TRK)= TRACK â>ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ1/¢©NNNNNNNNNNNNNNNNNNNNNN¡¡¡û)= SECTOR # TO READ FROM ; (CPM_DMA)= XFER ADDRESS ; IX= DDT PTR ; IY= DPB PTR ; EXIT - (IOPB.PB_STATO)= 0: OK, /0: ERRORDÇþ NNNNNNNNNNNNNNNN¡¡¡þ1×NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûCTOR != UNALLOCATED SECTOR THEN PURGE ; LD A,(CPM_DSK) ;SAME DISK? LD HL,UNA_DSK CP A,(HL) JR NZ,ALLOC ; LD HL,(UNA_•dþ¹NNNNNNNNNNNNNNNN¡¡¡þ1 ñNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDISKWRN: CALL CPM_WR JP RW_RET ; ; ; NOT AN UNALLOCATED RECORD, REQUIRES PRE-READ ; ALLOC: XOR A,A ;COUNT = 0 LD» þ9NNNNNNNNNNNNNNNN¡¡¡þ1Ñ`NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûESS ; ; IF BUFFER == EMPTY THEN READ THE PHYSICAL SECTOR ; LD HL,BUF_ACT LD A,(HL) ; LD (HL),1 ;BUFFER = ACTIVE IN 2äþ$NNNNNNNNNNNNNNNNN¡¡¡þ1>«NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHL ; LD HL,(BUF_PSEC) LD (BUF_SEC),HL ; ; IF REQUIRED TO READ THEN READ ; LD A,(RSFLAG) ;NEED TO READ? OR A,A C/ÿòNNNNNNNNNNNNNNNN¡¡¡þ1” NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûOPERATION, MARK AND SWITCH DIRECTION ; LD A,1 ;BUFFER = DIRTY LD (BUF_MOD),A ; ; SAVE BUFFER DATA PTRS FOR LATER FLUSHš`þHNNNNNNNNNNNNNNNNN¡¡¡þ1$~SNNNNNNNNNNNNNNNNNNNNNNþ€¡¡¡ûULT STATUS FLAG POP IY POP IX ; RET ;**************************************************************************** ;¯ËþBNNNNNNNNNNNNNNNN¡¡¡þ1*]\NNNNNNNNNNNNNNNNNNNNNN¡¡¡û# TO READ FROM ; (CPM_SEC)= SECTOR # TO READ FROM ; (CPM_DMA)= XFER ADDRESS ; EXIT - (IOPB.PB_STATO)= 0: OK, /0: ERROR ; ›ýþ“NNNNNNNNNNNNNNNNN¡¡¡þ10±äNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ;**************************************************************************** ; CPM_RD: ; LD HL,LL_READ ; ; COMMONGþ$NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÎNNNNNNN�Ð�ž‚lƒ9„…Ô…¢†o‡=ˆ ‰Ø‰¥Šs‹AŒ�Ü�«Žy�G�‘â‘°’~“K”•敳–�—N˜™é™·š…›Sœ!�ï�½ž‹ŸY '¡ô¡Á¢�£\¤*¥÷¥Å¦ŽNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ2+¬NNNNNNNNNNNNNNNNNNNNNN¡¡¡û CODE ; CPM_RW: PUSH HL LD HL,CPM_TRK ; ; FALL INTO COMMON XFER CODE ; ;******************************************<þ�NNNNNNNNNNNNNNNNN¡¡¡þ2� NNNNNNNNNNNNNNNNNNNNNN¡¡¡û TO ; (BUF_DDT)= DDT PTR ; (BUF_DPB)= DPB PTR ; EXIT - (IOPB.PB_STATO)= 0: OK, /0: ERROR ; ;*****************************—ÿÈNNNNNNNNNNNNNNNN¡¡¡þ2 nÁNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûK # TO WRITE TO ; (BUF_SEC)= SECTOR # TO WRITE TO ; IX= DDT PTR ; IY= DPB PTR ; EXIT - (IOPB.PB_STATO)= 0: OK, /0: ERROR >mþ„NNNNNNNNNNNNNNNN¡¡¡þ2N½NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûJP RD_WR ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SELECT DRIVE FUNCTION ; LOG-Oˆ“ÿÂNNNNNNNNNNNNNNNN¡¡¡þ2¡vNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ;DRV INC HL ;DPB_PTR LD E,(HL) INC HL LD D,(HL) LD (CUR_DPB),DE ; ; FETCH DISK PARAMETER HEADER ADDRESS ; IN*þÉNNNNNNNNNNNNNNNNN¡¡¡þ2 ÐNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûST2O) CP A,-1 ;-1:NONE, 0:JADE, 1:DESCRIPTOR, 2: EXTENDED, ; 3: PARTITIONED, ID JR Z,LGDEF ; ; ELSE IF OLD FORMAT±hþNNNNNNNNNNNNNNNN¡¡¡þ2%áŽNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS),A ; ; RETURN DRIVE TABLE PTR ; LD HL,(CUR_DPH) XOR A,A ;RETURN NO-ERROR JR LGDONE ; ; ; IF NOT HARD DISK THE¶çþ9NNNNNNNNNNNNNNNN¡¡¡þ2+Â�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************************* ; HOME: ; ; IF PENDING WRITE (BUFFER DIRTY) THEN IGNORE ; LD A,(BUF_MOD) Û7þBNNNNNNNNNNNNNNNN¡¡¡þ2~ÿNNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************************** ; ; SET UP IOPB FOR EXECUTION ; ENTRY- HL= PTR TO IOPB IMAGE TRACK DATA ; IX= DDT PTR ;òþ“NNNNNNNNNNNNNNNNN¡¡¡þ2‘4NNNNNNNNNNNNNNNNNNNNNN¡¡¡û*********************************************** ; BUF_FLSH: ; ; IF UNMODIFIED THEN RETURN ; LD A,(BUF_MOD) OR A,A REÐÿÈNNNNNNNNNNNNNNNN¡¡¡þ2;’NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; ;**************************************************************************** ; BUF_WR: ; LD HL,LL_WRIT JP BUF_RW ÿdNNNNNNNNNNNNNNNN¡¡¡þ2×*NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûN - SET DISK PARAMETER BLOCK ; ENTRY- C= DRIVE # ; E= 0 IF NEW SELECT ; EXIT - HL= PTR TO DPT OR 0 FOR ERROR ; ;++++++++++å5þ NNNNNNNNNNNNNNNN¡¡¡þ2ô%NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûC HL ;DPH PTR LD E,(HL) INC HL LD D,(HL) LD (CUR_DPH),DE EX DE,HL ;PUT DPH PTR IN HL FOR RETURN ; ; IF NOT FIRST:œþNNNNNNNNNNNNNNNNN¡¡¡þ2 {NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûS THEN PAD DPB DATA ; CP A,3 JR NC,IDOK ; LD HL,BLKBUF + ID_PSHO ;FILL DATA WITH 0S LD B,ID_FLGO - ID_PSHO ; PADIDL:´¡ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ2&´ÝNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûN GO DO FLOPPY TEST ; LGDEF: BIT 4,(IX + DDT_FLG) JR Z,LGCKFD ; ; ELSE USE HARD DISK DEFAULTS ; CALL TRNONE ; NO XL§\þBNNNNNNNNNNNNNNNN¡¡¡þ2,[NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûOR A,A JR NZ,HOME2 ; ; ELSE PURGE BUFFER ; LD (BUF_ACT),A ; HOME2: ; ; JUST SET TRACK TO 0 ; LD BC,0 ; ; F&ÃþNNNNNNNNNNNNNNNN¡¡¡þ2MÎNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û IY= DPB PTR ; (SP)= ADDRESS {LL_READ, LLWRIT} OF EXECUTOR ; ;*************************************************************ˆ þNNNNNNNNNNNNNNNNNN¡¡¡þ2 ¢NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûET Z ; ; ELSE SET PTRS TO BUFFER DATA ; PUSH IX PUSH IY LD IX,(BUF_DDT) LD IY,(BUF_DPB) ; ; WRITE THE BUFFER DA*‰þNNNNNNNNNNNNNNNNN¡¡¡þ2£NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ;**************************************************************************** ; ; RDBUF PERFORMS THE PHYSICAL READ FROM THE OFþ9NNNNNNNNNNNNNNNN¡¡¡þ2äNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; SELDSK: ; ; STORE DRIVE # FOR FUTURE USE ; LD A,C üšÿÎNNNNNNNNNNNNNNNNN¡¡¡þ2ÇNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û SELECT OR LOGON INHIBITED THEN RETURN TABLE PTR ; LD A,(LOGRQ) ;0: LOGON, 1:INHIBIT OR A,C ;0: NORMAL, 1: INHIBIT CPL 0Pþ!NNNNNNNNNNNNNNNN¡¡¡þ2!-JNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û LD (HL),0 INC HL DJNZ PADIDL ; ; ELSE XFER ID SECTOR DATA TO TABLES ; IDOK: CALL TRNONE ;ASSUME NO TRANSLATION ; ;¬þNNNNNNNNNNNNNNNNN¡¡¡þ2'‡ìNNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡ûATE LD HL,HDPBK ; ; XFER DATA TO TABLES ; SEL2: LD DE,(CUR_DPB) ; USE DEFAULT TABLE LD BC,DPB_SZ LDIR ; LD A,(HLtþHNNNNNNNNNNNNNNNN¡¡¡þ2-h'NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûALL INTO SET TRACK ; ;**************************************************************************** ; ; SET TRACK # ; EN-~þNNNNNNNNNNNNNNNN¡¡¡þ2ÔYNNNNNNNNNNNNNNNNNNNNNNð¡¡¡û*************** ; RD_WR: LD DE,IOPB + PB_TRKO LD BC,PB_BCNTO - PB_TRKO LDIR ; ; EXECUTE LOW LEVEL READ OR WRITE (ON ST�þ9NNNNNNNNNNNNNNNN¡¡¡þ2 ÷VNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTA ; CALL BUF_WR ; ; RESTORE THE PTRS ; POP IY POP IX ; ; IF ERROR THEN RETURN IT ; OR A,A RET NZ ; ; EOÍþ NNNNNNNNNNNNNNNNN¡¡¡þ2îNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHOST DISK INTO BLKBUF. ; ENTRY- (BUF_DSK)= DISK # TO READ FROM ; (BUF_TRK)= TRACK # TO READ FROM ; (BUF_SEC)= SECTOR # TO R6lþ NNNNNNNNNNNNNNNN¡¡¡þ2±HNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD (CPM_DSK),A ; ; SAVE LOGON REQUEST FLAG ; LD A,E LD (LOGRQ),A ; ; COMPUTE DISK DRIVER TABLE PTR ; CALL RETD7:ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ2^ƒNNNNNNNNNNNNNNNNNNNNNN¡¡¡û AND A,1 RET Z ; ; ELSE LOG ON DRIVE ; PUSH IX ;SAVE REGS PUSH IY ; LD IX,(CUR_DDT) ;SET REGS LD IY,(CUR_DPB) bQÿÂNNNNNNNNNNNNNNNN¡¡¡þ2"xNNNNNNNNNNNNNNNNNNNNNN¡¡¡û IF HARD DISK OR DOUBLE DENSITY THEN NO TRANSLATION ; LD A,(BLKBUF + ID_FLGO) AND A,[1 SHL DF_DTDB] OR [1 SHL DF_HARDB] «þ NNNNNNNNNNNNNNNNN¡¡¡þ2(—ÒNNNNNNNNNNNNNNNNNNNNNN¡¡¡û) ;HEADS VALUE JR SEL1 ; ; ; USE 8" FLOPPY DEFAULTS ; LGCKFD: CALL TR8 LD HL,SD8PBK JR SEL2 ; ; ERROR EXIT ; E®ÿÂNNNNNNNNNNNNNNNN¡¡¡þ2.=tNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTRY- BC= TRACK # ; ;**************************************************************************** ; SETTRK: LD (CPM_TRK),BCáþNNNNNNNNNNNNNNNNN¡¡¡þ2çhNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûACK) ; RET ;**************************************************************************** ; ; BUF_FLSH FLUSHES THE BUFFÏbþNNNNNNNNNNNNNNNNN¡¡¡þ2 ÄgNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLSE CLEAN BUFFER ; LD (BUF_MOD),A RET ;**************************************************************************** ;Â-ÿòNNNNNNNNNNNNNNNNN¡¡¡þ2(ßNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEAD FROM ; IX= DDT PTR ; IY= DPB PTR ; EXIT - (IOPB.PB_STATO)= 0: OK, /0: ERROR ; ;**************************************É”þNNNNNNNNNNNNNNNNN¡¡¡þ2‚yNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûVRT ;DRIVE IS STILL IN C REGISTER ; ; IF DRIVE ERROR THEN RETURN (HL= 0) ; RET NZ ; ; ELSE SAVE PTR ; LD (CUR_DDTó�þ NNNNNNNNNNNNNNNN¡¡¡þ2m²NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û; ; ATTEMPT TO READ ID SECTOR ; CALL BUF_FLSH ;FLUSH BUFFER 1ST JR NZ,LOGERR ; CALL DISKLOG JR NZ,LOGERR ; ; IF_PþrNNNNNNNNNNNNNNNN¡¡¡þ2#K(NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ; ELSE SET TRANSLATION ; CALL Z,TR8 ; ; XFER DISK DATA TO DPB ; LD DE,(CUR_DPB) ;GET ADDR OF DPB LD HL,BLKBUF ;"þHNNNNNNNNNNNNNNNNN¡¡¡þ2)¤ãNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LOGERR: LD HL,0 ; ; DONE ; LGDONE: POP IY ;RESTORE REGS POP IX RET ;********************************************}þ NNNNNNNNNNNNNNNNN¡¡¡þ2/ENNNNNNNNNNNNNNNNNNNNNN¡¡¡û RET ;**************************************************************************** ; ; SET SECTOR ; ENTRY- BC= SECTOR ïCÿòNNNNNNNNNNNNNNNN¡¡¡þ2²;NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûER DATA IF MODIFIED ; ENTRY- (BUF_DSK)= DISK # TO WRITE TO ; (BUF_TRK)= TRACK # TO WRITE TO ; (BUF_PSEC)= SECTOR # TO WRITE4ÁþBNNNNNNNNNNNNNNNN¡¡¡þ2 ]ðNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; BUF_WR PERFORMS THE PHYSICAL WRITE FROM BLKBUF TO THE HOST DISK. ; ENTRY- (BUF_DSK)= DISK # TO WRITE TO ; (BUF_TRK)= TRAC}®þ NNNNNNNNNNNNNNNN¡¡¡þ2}ŒNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û************************************** ; BUF_RD: ; LD HL,LL_READ ; ; COMMON CODE ; BUF_RW: PUSH HL LD HL,BUF_TRK 6lþNNNNNNNNNNNNNNNNN¡¡¡þ2’GNNNNNNNNNNNNNNNNNNNNNN¡¡¡û),HL ; ; FETCH FLAGS ; INC HL ;EXE +1 INC HL ;FLGS LD C,(HL) ; ; FETCH DISK PARAMETER BLOCK ADDRESS ; INC HLYBþrNNNNNNNNNNNNNNNN¡¡¡þ28áNNNNNNNNNNNNNNNNNNNNNN¡¡¡û NO ID SECTOR THEN USE DEFAULT DPB ; (NOTE: CONTROLLER HAS SET IT'S DISK DEFAULTS IN DEFBFR IN ALL CASES) ; LD A,(IOPB + PB_Œ©þNNNNNNNNNNNNNNNNN¡¡¡þ2$Ò¿NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û+ ID_SPTO LD BC,DPB_SZ LDIR ; ; XFER DISK PHYSICAL DATA TO TABLE ; LD A,(BLKBUF + ID_HEADS) ; SEL1: LD (IX + DDT_HDúþ!NNNNNNNNNNNNNNNN¡¡¡þ2*ñ°NNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************** ; ; HOME DRIVE - TREAT AS SEEK TRK 0 ; EXIT - BC= 0 ; ;*********************************=#þ'NNNNNNNNNNNNNNNNN¡¡¡þ20NNNNNNNNNNNNNNNNNNNNNN¡¡¡û# ; ;**************************************************************************** ; SETSEC: LD (CPM_SEC),BC RET ;**¾6þNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN8NNNNþ€Ì�™‚fƒ3„…Î…›†h‡6ˆ‰Ð‰�Šk‹9Œ�Ô�¢Žp�=� ‘Ø‘¦’t“A”•Ü•©–x—E˜™à™¯š}›Kœ�å�²ž�ŸO ¡ê¡¸¢†£S¤!¥î¥¼¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ2œNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************************************** ; ; SET TRANSFER ADDR ; ENTRY- BC= ADDRESS ; EXITºbÿÈNNNNNNNNNNNNNNNNN¡¡¡þ2¶:NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûLE ADDR = 0 THEN NO TRANSLATION OR A,E JP Z,NOTRAN ; ; ELSE CALCULATE NEW SECTOR FROM TABLE ; EX DE,HL ADD HL,BC o þ NNNNNNNNNNNNNNNN¡¡¡þ2 YñNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++ ; ; LOW LEVEL READ ; ENTRY- IX= DDT PTR ; IY= DPB PTR ; EXIT - IOPB.PB_STATO, A= STÅkÿÂNNNNNNNNNNNNNNNN¡¡¡þ2y�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; INHIBIT UPLOAD ; LD A,1 SHL PB_INHX LD (IOPB + PB_FLGO),A ; ; CALCULATE DOWNLOAD BYTE COUNT ; LD A,(IY + DPuèÿòNNNNNNNNNNNNNNNN¡¡¡þ2–FNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA ; ; OFFSET SECTOR ; LD HL,(IOPB + PB_SECO) LD A,L ADD A,(IX + DDT_SOF) LD L,A LD A,H ADC A,(IX + DDT_SOF + 1)!›þNNNNNNNNNNNNNNNNN¡¡¡þ2<àNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCALL EDITOR ; ; GET USER RESPONSE ; CALL CI ;GET USER RESPONSE ; PUSH AF ;SAVE CHAR LD C,A ;ECHO CHAR CALL COC ïµþNNNNNNNNNNNNNNNN¡¡¡þ2%Ö¾NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û**************************************** ; ; SET 3740 SECTOR TRANSLATION PROCEDURE ; ENTRY- (CUR_DPH)= MUST BE PTR TO DPH ; WþNNNNNNNNNNNNNNNN¡¡¡þ2+õ±NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; XPRIM: ; ; EXECUTE THE PRIMITIVE IN ROM ; LD A,(BUF_DMýêþœNNNNNNNNNNNNNNNN¡¡¡þ2IÏNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û - A= ? ; ;**************************************************************************** ; SETDMA: LD (CPM_DMA),BC ; LD A,·þHNNNNNNNNNNNNNNNNN¡¡¡þ2¦NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLD L,(HL) ; LD H,0 RET ; ; ; CONVERT FROM CP/M'S LOGICAL SECTOR {0..N-1} TO PHYSICAL SECTOR {1..N} ; NOTRAN: LD HˆþNNNNNNNNNNNNNNNN¡¡¡þ2 ¢NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûATUS ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; LL_READ: ; ; ENABLE UPLOAD ; Xh–þäNNNNNNNNNNNNNNNN¡¡¡þ2àNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûB_PSH) ;USE SHIFT FACTOR {0:128, 1:256, 2:512, 3:1024} LD HL,128 ;START WITH 128 BYTES ; AND A,3 ;LIMIT TO 1024-BYTE SECTçÌþ NNNNNNNNNNNNNNNN¡¡¡þ2ÃNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û LD H,A LD (IOPB + PB_SECO),HL ; ; SET PHYSICAL DRIVE ; LL_DO: LD A,(IX + DDT_DRV) LD (IOPB + PB_DRVO),A ; ; FET×4þdNNNNNNNNNNNNNNNNN¡¡¡þ2 )KNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û CALL CRLF ;NEW LINE POP AF ; AND A,5FH ;INSURE UPPER CASE ; ; IF RETRY THEN TRY AGAIN ; CP A,'R' ;IF RETRY THEN‹�ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ2&ƒíNNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡ûEXIT - DE, HL= ? ; ;**************************************************************************** ; TR8: LD DE,SDTRAN ; SXýþNNNNNNNNNNNNNNNN¡¡¡þ2,l&NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûAB) ;PRESET IOPB BANK LD E,A ; LD HL,IOPB CALL MR_XIOB ;EXECUTE THE FUNCTION ; OR A,A ;FUNCTION ERR? RET NZ ; ; ŸÙþNNNNNNNNNNNNNNNN¡¡¡þ2zþNNNNNNNNNNNNNNNNNNNNNN¡¡¡û(BUF_DMAB) ;FETCH BANK ADDRESS SET BY COLD START LD (CPM_DMAB),A ; ; DONE ; RET ;+++++++++++++++++++++++++++++++++É,þ¼NNNNNNNNNNNNNNNN¡¡¡þ2 •5NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL,1 ADD HL,BC RET SUBTTL DISK SUPPORT ROUTINES ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++°àþ'NNNNNNNNNNNNNNNNN¡¡¡þ2?“NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOR A,A LD (IOPB + PB_FLGO),A ; ; DISABLE DOWNLOAD ; LD HL,0 LD (IOPB + PB_BCNTO),HL ; ; PASS READ SECTOR COMMAND ‘ ÿòNNNNNNNNNNNNNNNN¡¡¡þ2Ó+NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûORS ; JR Z,LL_WR2 ;IF SHIFT_FACTOR == 0 THEN DONE ; LL_WR3: ADD HL,HL ;DOUBLE COUNT DEC A JP NZ,LL_WR3 ; LL_WR2: LD h¨ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ2ð$NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûCH DRIVER VECTOR & EXECUTE DISK DRIVER ; LL_OPLP: LD HL,LL_OPRET ;PUT RETURN ADDRESS ON STACK PUSH HL ; LD L,(IX + DDT¦ŒþœNNNNNNNNNNNNNNNN¡¡¡þ2!zNNNNNNNNNNNNNNNNNNNNNN¡¡¡û RETURN TO CALLER JR Z,LL_OPLP ; ; ELSE IF ABORT THEN DO WARM BOOT ; CP A,'A' ;IF ABORT THEN RE-BOOT JP Z,0 ; ; åßÿÂNNNNNNNNNNNNNNNN¡¡¡þ2'°ÜNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûETTR: LD HL,(CUR_DPH) LD (HL),E INC HL LD (HL),D RET ;*************************************************************¶þ“NNNNNNNNNNNNNNNN¡¡¡þ2-_NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û RETURN THE COMMAND RESULTS STATUS ; LD A,(IOPB + PB_STATO) OR A,A RET ;+++++++++++++++++++++++++++++++++++++++++++lïþœNNNNNNNNNNNNNNNN¡¡¡þ2ãiNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++ ; ; SECTOR TRANSLATION FUNCTION ; ENTRY- DE= 0: NO XLATE, ELSE PTR TO XLATE TABLE0¨þ!NNNNNNNNNNNNNNNN¡¡¡þ2 ÀfNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++ ; ; LOGON DISK FUNCTION ; EXIT - A= 0: OK; /0: ERROR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ pþrNNNNNNNNNNNNNNNNN¡¡¡þ2,ÞNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; LD A,PB_READC JP LL_RW ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; LOW LEVEL˜ÅÿòNNNNNNNNNNNNNNNN¡¡¡þ2†xNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û(IOPB + PB_BCNTO),HL ; ; PASS WRITE COMMAND ; LD A,PB_WRITC ; ; FALL INTO COMMON CODE ; ;++++++++++++++++++++++b7þNNNNNNNNNNNNNNNNN¡¡¡þ2i³NNNNNNNNNNNNNNNNNNNNNN¡¡¡û_EXE) ;FETCH DRIVER ADDRESS FROM TABLE LD H,(IX + DDT_EXE + 1) JP (HL) ; ; DRIVER RETURNS HERE ; LL_OPRET: ; ; IF ¯ÿòNNNNNNNNNNNNNNNN¡¡¡þ2"O)NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûELSE IF DEBUGGER THEN EXECUTE IT ; CP A,'M' JP Z,MR_BRK ; ; ELSE IF IGNORE THEN RETURN NO ERROR ; SUB A,'I' ;IF IGN…þÉNNNNNNNNNNNNNNNNN¡¡¡þ2( âNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*************** ; ; SET NO SECTOR TRANSLATION PROCEDURE ; EXIT - HL, DE= ? ; ;*********************************************Ûpþ!NNNNNNNNNNNNNNNN¡¡¡þ2. DNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++ ; ; HARD DISK DRIVER FUNCTION ; ENTRY- IX= DRIVER TABLE PTR ; EXIT - A= 0: OK; /0: ERROR RšÿÎNNNNNNNNNNNNNNNNN¡¡¡þ2ÐXNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; BC= SECTOR # TO XLATE ; EXIT - HL= XLATED SECTOR OR BC + 1 ; BC= UNCHANGED ; A, DE= ? ; ;+++++++++++++++++++++++++++oPþ'NNNNNNNNNNNNNNNNN¡¡¡þ2 óWNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++ ; DISKLOG: ; ; SET UP READ IOPB ; LD A,(BUF_DMAB) LD (LOGIOPB + PB_DMAXO),A ; LD HL,LOGIOPB LDAéþNNNNNNNNNNNNNNNNN¡¡¡þ2ïNNNNNNNNNNNNNNNNNNNNNN¡¡¡û WRITE ; ENTRY- IX= DDT PTR ; IY= DPB PTR ; EXIT - IOPB.PB_STATO, A= STATUS ; ;+++++++++++++++++++++++++++++++++++++++++++… þBNNNNNNNNNNNNNNNN¡¡¡þ2µINNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; COMMON IOPB EXECUTER ; ENTRY- A= COMMAND ; IX= DRIVE TABLE PTR 78þäNNNNNNNNNNNNNNNN¡¡¡þ2Z‚NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûNO ERRORS THEN RETURN ZF ; RET Z ;IF NO_ERROR THEN RETURN ; ; PRINT ERROR ; IOPBDMP: LD A,(BUF_DMAB) ;SET BANK LD E¡ßþ9NNNNNNNNNNNNNNNN¡¡¡þ2#|NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûORE THEN RETURN NO ERROR RET Z ; ; ELSE RETURN ERROR TO BDOS ; LD A,-1 ;RETURN -1 TO BDOS OR A,A RET ; ; ; DIÉ)þNNNNNNNNNNNNNNNNN¡¡¡þ2)“ÓNNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************* ; TRNONE: LD DE,0 JR SETTR SUBTTL HARD DISK ROUTINES ;+++++++++++++++++++++++++++++++XØþ$NNNNNNNNNNNNNNNNN¡¡¡þ2/9uNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; HDEXEC: EQU XPRIM SUBTTL JADE FLOPPY Hðþ NNNNNNNNNNNNNNNN¡¡¡þ2… NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++ ; SECTRN: ; ; IF NO TRANSLATION THEN RETURN SECTOR++ ; LD A,D ;IF TABh þNNNNNNNNNNNNNNNN¡¡¡þ2 jÀNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DE,IOPB LD BC,PB_STATO LDIR ; ; EXECUTE WITHOUT COMPENSATION ; JR LL_DO ;++++++++++++++++++++++++++++++++++++++©þBNNNNNNNNNNNNNNNN¡¡¡þ2J¼NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û+++++++++++++++++++++++++++++++++ ; LL_WRIT: ; ; IF STILL PROTECTED THEN ERROR ; LD A,(WR_PROT) OR A,A JR NZ,DO_ERR'>þNNNNNNNNNNNNNNNNN¡¡¡þ2¥wNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; IY= DPB PTR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; LL_RW: LD (IOPB + PB_CMDO),ópÿÂNNNNNNNNNNNNNNNN¡¡¡þ2ÑNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û,A ; LD HL,IOPB LD A,MF_DIOB ;USE DISPLAY IOPB DATA FUNCTION CALL XMROM ; ; QUERY USER FOR OPTION ; LD HL,DSKEB ŠþHNNNNNNNNNNNNNNNNN¡¡¡þ2$å�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSPLAY WRITE PROTECT ERROR MESSAGE ; DO_ERR: LD HL,WP_ERM CALL EDITOR JR IOPBDMP ;************************************µ7þ!NNNNNNNNNNNNNNNN¡¡¡þ2*Æ€NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE IOPB PRIMITIVE ; EXIT - A= 0: OK, /0: ERROR ; ;++++++++++++++¿LþHNNNNNNNNNNNNNNNNN¡¡¡þ20*8NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûDRIVER ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; JADE 8" FLOPPY DISK DRIVER ÄÎþ$NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNN�Ñ�Ÿ‚lƒ9„…Ô…£†p‡?ˆ ‰Ù‰¦Št‹BŒ�Ý�¬Žz�H�‘㑲’€“M”•蕵–„—Q˜™í™»š‰›Wœ$�ò�¿ž�Ÿ[ (¡õ¡Â¢�£]¤+¥ø¥Ç¦nNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ3]NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFUNCTION ; ENTRY- IY= DRIVER TABLE PTR ; EXIT - A= 0: OK; /0: ERROR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++@þHNNNNNNNNNNNNNNNNN¡¡¡þ3÷¾NNNNNNNNNNNNNNNNNNNNNN¡¡¡û SUBTTL BIOS FUNCTION CALLS ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; FUNCTION DISP*:ÿÉNNNNNNNNNNNNNNNN¡¡¡þ3 uNNNNNNNNNNNNNNNNNNNNNN¡¡¡û################################# ; ; BIOS FUNCTION TABLE ; ;###############################################################xÌÿÂNNNNNNNNNNNNNNNN¡¡¡þ38 NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û TABLE BASE PTR ; NZ= ILLEGAL DRIVE REQUESTED (HL=0) ; A, B, C= ? ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++ë<þ9NNNNNNNNNNNNNNNN¡¡¡þ3×ÂNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD HL,0 OR A,A ;SET NZ RET ; ; ; ELSE COMPUTE TABLE PTR ; RETDV2: LD B,C LD DE,DDT_SIZ ; RETDVL: ADD HL,DE DJçÿÉNNNNNNNNNNNNNNNNN¡¡¡þ3}dNNNNNNNNNNNNNNNNNNNNNNð¡¡¡û FUNCTIONS TO SUPPORT CDOS PROGRAMS ;*************************************************************************** ; ; SYSTEM CþÉNNNNNNNNNNNNNNNN¡¡¡þ3%—:NNNNNNNNNNNNNNNNNNNNNN¡¡¡û,8DH ;IF RETURN VERSION THEN RETURN IT JR Z,RETCVER ; CP A,90H ;IF NOT CLOCK THEN ERR JR C,ILLEGC ; JR Z,CLKCAL ;IF ¤üþNNNNNNNNNNNNNNNNN¡¡¡þ3+´5NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++ ; RETCVER: LD B,1 RET SUBTTL CLOCK ROUTINES ;+++++++++++++++++++++++++++++++++++++++++++++++++++++óþNNNNNNNNNNNNNNNN¡¡¡þ3KNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++ ; FD8EXEC: ; ; IF HEADS == 1 THEN EXECUTE IOPB ; LD A,(IX + DDT_HDS) DEC A JP Z,XPRIM ; ;Ãjþ“NNNNNNNNNNNNNNNNN¡¡¡þ3ç€NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûATCHER ; ENTRY- C= FUNCTION # ; EXIT - A= -1: ERROR, 0: OK ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ðÖþgNNNNNNNNNNNNNNNN¡¡¡þ3M&NNNNNNNNNNNNNNNNNNNNNN¡¡¡û############# ; BFUNTBL: DW RETVERS ;0:RETURN VERSION # DW RETDVRTF ;1:RETURN DISK PHYSICAL CONFIGURATION TABLE PTR MAXFRKþäNNNNNNNNNNNNNNNN¡¡¡þ3¡žNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û+++++++++++++++++++++++ ; RETDVRTF: ; ; ADJUST REGISTER ; LD C,E ; ; FALL INTO LOCAL ENTRY ; ;+++++++++++++++~&þ NNNNNNNNNNNNNNNN¡¡¡þ3‚‘NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNZ RETDVL ; LD A,(BUF_DMAB) LD E,A ; ; RETURN NO ERROR ; XOR A,A RET ;+++++++++++++++++++++++++++++++++++++++6�þÉNNNNNNNNNNNNNNNNN¡¡¡þ3 hÏNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûALL INTERCEPT ROUTINE CHECKS FOR ILLEGAL BDOS CALLS & ; PRINTS MESSAGE IF ILLEGAL. ALSO IMPLEMENTS CDOS CLOCK/CALENDAR ; SYSóþNNNNNNNNNNNNNNNNNN¡¡¡þ3&ÂiNNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡ûCALENDAR THEN GET IT ; CP A,92H JR Z,CLKTIM ;IF TIME THEN GET IT ; ; ILLEGAL SYSTEM CALL ; ILLEGC: PUSH BC ;SAVE FUNC8þ„NNNNNNNNNNNNNNNN¡¡¡þ3,-¢NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û+++++++++++++++++++++++ ; ; RETURN CALENDAR FUNCTION 90H ; EXIT - A= DAY ; B= MONTH ; C= YEAR ; L= DAY OF WEEK ; ;+++ÉîþdNNNNNNNNNNNNNNNN¡¡¡þ3;zNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ELSE SELECT SIDE FROM TRACK BIT 0 ; LD HL,(IOPB + PB_TRKO) PUSH HL ;SAVE ORIGINAL DATA ; LD A,(IOPB + PB_SECO + 1) «|þNNNNNNNNNNNNNNNNNN¡¡¡þ3 Ô±NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++ ; BIOFUNC: ; ; IF FUNCTION # NOT IN TABLE THEN RETURN -1 ; LD A,C CP A,MAXFUNCS LD A,-1 RET NC ; ¡¸ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ3~NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUNCS EQU ($ - BFUNTBL) / 2 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN BIOS ŽþBNNNNNNNNNNNNNNNN¡¡¡þ3’¯NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN DRIVER TABLE PTR FUNCTION ; ENTRY- C= DRIVE # ; EXIœÿÎNNNNNNNNNNNNNNNNN¡¡¡þ3± NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û+++++++++++++++++++++++++++++++++++++ ; ; GET BANK NUMBER FUNCTION ; EXIT - A= BANK # ; ;++++++++++++++++++++++++++++++++++ ÓÿNNNNNNNNNNNNNNNN¡¡¡þ3![þNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTEM CALLS FOR ASMB. ; ;*************************************************************************** INTCPT: LD A,C ;CHECK CAL÷ÆÿÎNNNNNNNNNNNNNNNNN¡¡¡þ3'ñXNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûTION # ; ; OUTPUT WARNING MESSAGE ; LD HL,ISCMSG ;OUTPUT WARNING CALL EDITOR ; ; OUTPUT FUNCTION # ; POP BC LDÑrþ$NNNNNNNNNNNNNNNN¡¡¡þ3-“NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKCAL: LD A,MF_GCAL JP XMROM ;++++++++++HHþœNNNNNNNNNNNNNNNN¡¡¡þ3¢íNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ADD A,A ;BIT 15 -> BIT_BUCKET ; SRL H RR L RRA ;TRK BIT 0 -> SECTOR BIT 15 LD (IOPB + PB_SECO + 1),A ; LD (IOøþBNNNNNNNNNNNNNNNN¡¡¡þ3 �âNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ELSE COMPUTE TABLE ENTRY ; PUSH HL ;SAVE POSSIBLE DATA ; LD HL,BFUNTBL LD A,C ADD A,A ADD A,L LD L,A LD A,!çþ NNNNNNNNNNNNNNNNN¡¡¡þ3mZNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûVERSION # FUNCTION #0 ; EXIT - HL= VERSION # IN BINARY {0.00,..655.35} ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++ý‹þ NNNNNNNNNNNNNNNN¡¡¡þ3ÇüNNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡ûT - E:HL= DRIVER TABLE BASE PTR ; NZ= ILLEGAL DRIVE (HL= 0) ; A, B, C= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++š™þNNNNNNNNNNNNNNNNN¡¡¡þ3(7NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++ ; GETBNK: LD A,MF_GBNK JP MR_FUN SUBTTL NON-DISK PROCEDURES ;**********âiþNNNNNNNNNNNNNNNN¡¡¡þ3"­NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûL VALIDITY CP A,41 ;IF <= 40 THEN OK ; BDOSV EQU $ + 1 JP C,BDOS + 11H ;THIS ADDR MODIFIED BY WARM BOOT RTN ; ; THE FOu¶þ NNNNNNNNNNNNNNNNN¡¡¡þ3(áfNNNNNNNNNNNNNNNNNNNNNN¡¡¡û A,MF_PHXB CALL XMROM ; ; OUTPUT NEW LINE ; CALL CRLF ; ; RETURN NULLS ; XOR A,A ;BC = HL = A = 0 LD L,A LD]þ9NNNNNNNNNNNNNNNN¡¡¡þ3.KÀNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN TIME FUNCTION 92H ; EXIT - A= SECONDS ; B= MI‹yþNNNNNNNNNNNNNNNNNN¡¡¡þ3‘ÜNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûPB + PB_TRKO),HL ;TRACK = RESIDUAL ; ; EXECUTE THE IOPB ; CALL XPRIM ; ; RESTORE THE MODIFIED IOPB SO RETRY WILL WORKn þ�NNNNNNNNNNNNNNNNN¡¡¡þ3 ²ÓNNNNNNNNNNNNNNNNNNNNNN¡¡¡û0 ADC A,H LD H,A ; ; EXECUTE TABLE ADDRESS ; LD A,(HL) INC HL LD H,(HL) LD L,A ; EX (SP),HL ;PUT CALLER'S DmÿòNNNNNNNNNNNNNNNNN¡¡¡þ3^kNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++ ; RETVERS: LD HL,VERSN XOR A,A ;RETURN NO ERROR RET ;++++++++++++++++++++++++++++++++++ßÄÿüNNNNNNNNNNNNNNNN¡¡¡þ3ôÍNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++ ; RETDVRT: ; ; ASSUME DRIVE 0 ; LD HL,DDT_0 ;START AT 1ST TABLE ; ; IF DRIVE == 0 THϯÿòNNNNNNNNNNNNNNNN¡¡¡þ3NNNNNNNNNNNNNNNNNNNNNN¡¡¡û***************************************************************** ; ; NEWLINE PROCEDURE ; ;*********************************7ôþ9NNNNNNNNNNNNNNNN¡¡¡þ3#=œNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLLOWING CONDITIONAL JUMP IS MODIFIED TO AN UNCONDITIONAL JUMP BY ; THE WARM BOOT ROUTINE IF THE CLOCK/CALENDAR BOARD IS NOT PRP%þINNNNNNNNNNNNNNNNN¡¡¡þ3)ÒWNNNNNNNNNNNNNNNNNNNNNN¡¡¡û H,A LD C,A LD B,A RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CDOS RETUR«´þ NNNNNNNNNNNNNNNNN¡¡¡þ3/xñNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNUTES ; C= HOURS ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKTIM: LD A,MF_GTIM ‚‘ÿòNNNNNNNNNNNNNNNN¡¡¡þ3Ä�NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; POP HL ;TRACK LD (IOPB + PB_TRKO),HL ; LD HL,IOPB + PB_SECO +1 ;CLEAR BIT 15 RES 7,(HL) ; ; DONE ; RET ñOþœNNNNNNNNNNNNNNNN¡¡¡þ3 +DNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûATA IN HL, FUNCTION ADDR ON RET ; STACK, EXECUTE FUNCTION ADDRESS ON STACK ;###########################################³ ÿòNNNNNNNNNNNNNNNN¡¡¡þ3 8NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN DRIVER TABLE PTR FUNCTION #1 ; ENTRY- E= DRIVE # ; EXIT - E:HL= DRIVER(uþ$NNNNNNNNNNNNNNNNN¡¡¡þ3äóNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEN ALREADY THERE ; LD A,C OR A,A RET Z ; ; ELSE IF ILLEGAL DRIVE THEN RETURN ERROR ; CP A,NDRVS JR C,RETDV2 ; º}þ„NNNNNNNNNNNNNNNN¡¡¡þ3NUNNNNNNNNNNNNNNNNNNNNNN¡¡¡û****************************************** ; CRLF: LD C,CR CALL COC LD C,LF JP COC IF INTCPTS SUBTTL ADDITIONALHjþHNNNNNNNNNNNNNNNNN¡¡¡þ3$¤ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûESENT ; IF NOT MODIFIED, THEN IT IS ALLWAYS FALSE (NOP). ; INHCLK: JR C,ILLEGC ; ; NOW CHECK FOR EXTENDED CALLS ; CP AC¦þ!NNNNNNNNNNNNNNNN¡¡¡þ3*‡NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûN VERSION FUNCTION ; MAKES CLOCK/CALENDAR WORK. ; EXIT - B= 1 ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ÀÿÈNNNNNNNNNNNNNNNNN¡¡¡þ30k¼NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û JP XMROM ENDIF ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; MONITOR ROM EXECUTãúþHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÎNNNþ€Í�š‚hƒ6„…Ñ…ž†k‡9ˆ‰Õ‰¢Šp‹>Œ �Ø�¥Žs�A�‘Ü‘ª’x“E”•à•­–|—J˜™å™³š�›Pœ�ë�¸ž†ŸT !¡ï¡¼¢Š£W¤%¥ò¥À¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ3j(NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûER ; ENTRY- A= FUNCTION # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; XMROM: EQU MR_Fè½þNNNNNNNNNNNNNNNNN¡¡¡þ3ÀŽNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOUTPUT ; ENTRY- C= CHAR TO OUTPUT ; ;**************************************************************************** ; COC: üàþNNNNNNNNNNNNNNNN¡¡¡þ3 /ENNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRY- C= CHAR TO OUTPUT ; ;**************************************************************************** ; LO: LD A,MF_LO J®=þ„NNNNNNNNNNNNNNNN¡¡¡þ39NNNNNNNNNNNNNNNNNNNNNN¡¡¡û##################################################### ; ; 3740 SECTOR TRANSLATION TABLE ; **** CP/M SINGLE DENSITY **** ; ;w-þ NNNNNNNNNNNNNNNN¡¡¡þ3àòNNNNNNNNNNNNNNNNNNNNNN¡¡¡û. ; 0 1: INHIBIT LOGON ; 1..3 PARTITION # {0,..7} ; 4 1: HARD DISK DRIVE ; DDT_DRV DS 1 ;PHYSICAL DRIVE # DDT%aþ�NNNNNNNNNNNNNNNNN¡¡¡þ3JTNNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@ ; ALLDRV MACRO #DADD,#PD,#FLG,#DPB,#DPH,#HDS,#SOF DW #DADD ;DRIVER EXECUTION ADDR DB #FLG ;FLAGS DB #PD ;MONITOÌéþ$NNNNNNNNNNNNNNNN¡¡¡þ3%  NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û,D2DPB,D2DPH,4,0 ; D DDT_3: ALLDRV HDEXEC,4,12H,D3DPB,D3DPH,4,8000H ; E DDT_4: ALLDRV HDEXEC,7,10H,D4DPB,D4DPH,4,0 ; `üþ9NNNNNNNNNNNNNNNN¡¡¡þ3+ƒNNNNNNNNNNNNNNNNNNNNNN¡¡¡û################################### ; SD8PBK: DW 26 ;SECTORS PER TRACK DB 3 ;BLOCK SHIFT FACTOR DB 7 ;BLOCK MASK DB 0†¾þ!NNNNNNNNNNNNNNNN¡¡¡þ3?{NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUN SUBTTL CHAR I/O ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CONSOLE IJ_þ“NNNNNNNNNNNNNNNNN¡¡¡þ3аNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLD A,MF_CO JP XMROM ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; READER DRIVER - D-IÿÈNNNNNNNNNNNNNNNN¡¡¡þ3zNNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡ûP XMROM ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN LIST DEVICE STATUS ; EXý'ÿäNNNNNNNNNNNNNNNN¡¡¡þ3–®NNNNNNNNNNNNNNNNNNNNNN¡¡¡û############################################################################ ; SDTRAN: GXLATE 26,6 ;#####################Ñ\ÿòNNNNNNNNNNNNNNNN¡¡¡þ3µ¡NNNNNNNNNNNNNNNNNNNNNN¡¡¡û_DPB DS 2 ;DPB ADDRESS FOR THIS DRIVE DDT_DPH DS 2 ;DPH ADDRESS FOR THIS DRIVE ; ; THE FOLLOWING MAY BE BROUGHT OFF DISK DE9þ NNNNNNNNNNNNNNNNN¡¡¡þ3 _ÿNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR PHYSICAL DRIVE # DW #DPB ;DISK PARAMETER BLOCK PTR DW #DPH ;DISK PARAMETER HEADER PTR DB #HDS ;HEADS DW #SOF ;SECT»-þNNNNNNNNNNNNNNNNN¡¡¡þ3&õYNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûF DDT_5: ALLDRV HDEXEC,7,12H,D5DPB,D5DPH,4,8000H ENDIF ;##############################################################Èþþ9NNNNNNNNNNNNNNNN¡¡¡þ3,’NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;NULL MASK DW 242 ;DISK SIZE -1 DW 63 ;DIRECTORY MAX DB 11000000B ;ALLOC 0 DB 0 ;ALLOC 1 DW 16 ;CHECK SIZE DW rÎþNNNNNNNNNNNNNNNN¡¡¡þ3 JNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNPUT ; EXIT - A= CHAR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CI: LD A,MF_CI Ö,þœNNNNNNNNNNNNNNNN¡¡¡þ3 ã�NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûUMMY ; EXIT - A= CTRL-Z ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; READER: LD A,CTRLi<þ'NNNNNNNNNNNNNNNNN¡¡¡þ3I'NNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡ûIT - A= 0: BUSY, FFH:READY ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; LISTST: LD A,?þ9NNNNNNNNNNNNNNNN¡¡¡þ3¥ŸNNNNNNNNNNNNNNNNNNNNNN¡¡¡û####################################################### ; ; COMMON I/O PARAMETER BLOCK ; ;##################################Șþ!NNNNNNNNNNNNNNNN¡¡¡þ3†�NNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡ûSCRIPTOR OR FROM DEFAULT TABLES ; DDT_HDS DS 1 ;HEADS DDT_SOF DS 2 ;SECTOR OFFSET ; ; DEFINE THE STRUCTURE SIZE ; DDT_Síþ9NNNNNNNNNNNNNNNN¡¡¡þ3!lÎNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOR OFFSET ; ENDM IF BOOT = 10H ; A DDT_0: ALLDRV HDEXEC,6,10H,D0DPB,D0DPH,4,0 ; B DDT_1: ALLDRV HDEXEC,6,12H,D1løÿÎNNNNNNNNNNNNNNNNN¡¡¡þ3'ÆhNNNNNNNNNNNNNNNNNNNNNN¡¡¡û############## ; ; MESSAGES ; ;############################################################################ ; MSGLE: DM ?ŒþHNNNNNNNNNNNNNNNN¡¡¡þ3-)£NNNNNNNNNNNNNNNNNNNNNN¡¡¡û2 ;TRACK OFFSET DB 0 ;PHYSICAL RECORD SHIFT FACTOR DB 0 ;PHYSICAL RECORD MASK DW 0 ;LOGICAL DRIVE SECTOR OFFSET ; ; Êßþ!NNNNNNNNNNNNNNNN¡¡¡þ3•ÝNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûJP XMROM ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN CONSOLE STATUS ; EXIT  þNNNNNNNNNNNNNNNN¡¡¡þ3 ¶ÒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûZ ;FAKE EOF ; ; FALL INTO PUNCH RETURN ; ;***************************************************************************êKþ NNNNNNNNNNNNNNNNN¡¡¡þ3ZjNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûMF_LOS JP XMROM ;**************************************************************************** ; ; MESSAGE EDITOR ; ENTÀ¬ÿòNNNNNNNNNNNNNNNN¡¡¡þ3ðÌNNNNNNNNNNNNNNNNNNNNNN¡¡¡û########################################## ; IOPB: REPT PB_SIZE LIST OFF DB 0 LIST ON ENDM ;#####################óSÿÎNNNNNNNNNNNNNNNNN¡¡¡þ3NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIZ DS 0 ENDM ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; MACRO TO DEFINE THE DRIV™MÿòNNNNNNNNNNNNNNNN¡¡¡þ3"9�NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûDPB,D1DPH,4,8000H ; C DDT_2: ALLDRV HDEXEC,7,10H,D2DPB,D2DPH,4,0 ; D DDT_3: ALLDRV HDEXEC,7,12H,D3DPB,D3DPH,4,8000H ; [þINNNNNNNNNNNNNNNNN¡¡¡þ3(ÖVNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCR,LF,'LOAD ERROR' ; DSKEB: DM CR,LF,'Abort, Ignore, Retry, (BDOS) - ' ; WP_ERM: DM CR,LF,'W-PROT Error!' ; IF INTCPTS ÿÂNNNNNNNNNNNNNNNN¡¡¡þ3.|ðNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DEFAULT DISK PHYSICAL PARAMETERS ; DB 1 ;HEADS ;#####################################################################³ØÿÎNNNNNNNNNNNNNNNNN¡¡¡þ3¦ìNNNNNNNNNNNNNNNNNNNNNN¡¡¡û- A= 0: NOT READY ; FFH: CHAR READY ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; C .þHNNNNNNNNNNNNNNNNN¡¡¡þ3 …ãNNNNNNNNNNNNNNNNNNNNNN¡¡¡û* ; ; PUNCH DRIVER ; ENTRY- C= CHAR TO OUTPUT ; ;**************************************************************************¢ÄþNNNNNNNNNNNNNNNNN¡¡¡þ3i[NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRY- HL= TEXT PTR (BIT 7= 1: TERMINATOR) ; EXIT - REGS= ? ; ;*****************************************************************T—þ= STHD)¼Øþ!NNNNNNNNNNNNNNNN¡¡¡þ4&“DNNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡ûSTRUCT 0 DPB_SPT DS 2 ;SPT- SECTORS/TRACK DPB_BSH DS 1 ;BSH- BLOCK SHIFT FACTOR DETERMINED BY CLUSTER SIZE ; 1K= 3, 2K= 4,‹µþrNNNNNNNNNNNNNNNN¡¡¡þ4,|�NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûULD BE USED BY CP/M 2.2 DEBLOCKING) ; DPB_PSH DS 1 ;PSH- PHYSICAL RECORD SHIFT FACTOR BASED ON BYTES/SEC ; 0: 128, 1: 256,¤³þ NNNNNNNNNNNNNNNN¡¡¡þ4jWNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIFT FACTOR (PSH) DB 1 ;PHYSICAL RECORD MASK (PRM) DW 0 ;LOGICAL DRIVE SECTOR OFFSET (SOF) ; ; ; DB 4 ;HEADS ;#ø×ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ4 …œNNNNNNNNNNNNNNNNNNNNNNð¡¡¡û)DPB ;;DRIVE PARAMETER BLK PTR IF ((DD - 1) <= NDHD) AND ((DD - 1) >= STHD) DW 0 ;;NO CHECKS ON HARD DISK ELSE DW Dxmþ'NNNNNNNNNNNNNNNNN¡¡¡þ4/:NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOF INITIALIZED CODE READ FROM DISK ; BIOSND EQU $ SUBTTL UNINITIALIZED DATA AREA ;#######################################ŸBþNNNNNNNNNNNNNNNN¡¡¡þ4ÂNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûBUFFER PHYSICAL SECTOR BUF_ACT DS 1 ;0: BUFFER FLUSHED, /0: DATA IN BUFFER BUF_MOD DS 1 ;0: BUFFER CLEAN, /0: BUFFER DIRTY (MOx?þœNNNNNNNNNNNNNNNN¡¡¡þ4à�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û### ; ; VARIABLES ; ;############################################################################ ; CUR_DPB DS 2 ;DRIVE |þœNNNNNNNNNNNNNNNN¡¡¡þ4! ÓNNNNNNNNNNNNNNNNNNNNNN¡¡¡û AND ((DD - 1) <= NDHD) D#D(DD)ALL: DS 128 ;ALLOCATION BIT MAP FOR 8" HARD DRIVE #D(DD) ENDIF IF ((DD - 1) >= ST8FD) AN ´þNNNNNNNNNNNNNNNNN¡¡¡þ4' uNNNNNNNNNNNNNNNNNNNNNN¡¡¡û 4K= 5, 8K= 6, 16K= 7 DPB_BLM DS 1 ;BLM- BLOCK MASK ; 1K = 7, 2K= 15, 4K= 31, 8K= 63, 16K= 127 DPB_EXM DS 1 ;EXM- EXTENT M°�þHNNNNNNNNNNNNNNNN¡¡¡þ4-O¾NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û 2: 512, 3: 1024 DPB_PHM DS 1 ;PHM- PHYSICAL RECORD MASK BASED ON BYTES/SEC ; 0: 128, 1: 256, 3: 512, 7: 1024 ; ; ADDIT‰tþBNNNNNNNNNNNNNNNN¡¡¡þ4óÀNNNNNNNNNNNNNNNNNNNNNN¡¡¡û########################################################################### ; ; DRIVE PARAMETER HEADER AREA ; 1 PER DRIVE ; ð¦ÿÂNNNNNNNNNNNNNNNN¡¡¡þ4 ÐÏNNNNNNNNNNNNNNNNNNNNNN¡¡¡û#D(DD)CHK ;;DRIVE DISK CHECKSUMS ARRAY PTR ENDIF DW D#D(DD)ALL ;;DRIVE CLUSTER ALLOCATION BIT MAP PTR LIST OFF ENDM ;·UþNNNNNNNNNNNNNNNNN¡¡¡þ4 255 : 2K= 0, 4K= 1, 8K= 3, 16K= 7 DPB_DSM DS 2 ;DSM- DRIVv\ÿNNNNNNNNNNNNNNNN¡¡¡þ4.íNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIONAL DISK PARTITIONING DATA FOR THE LOGICAL DRIVE SELECTION. ; PARTITIONING BY TRACKS ARE IMPLIMENTED THRU BDOS USING DPBOFF A”*ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ4ÀñNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;############################################################################ ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@5;þHNNNNNNNNNNNNNNNNN¡¡¡þ4 ãþNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; DEFINE THE DATA ; DD DL 1 REPT NDRVS LIST OFF ALLDPH 0123456789ABCDEF DD DL DD + 1 LIST ON ENDM ;#######9&ÿòNNNNNNNNNNNNNNNNN¡¡¡þ4FNNNNNNNNNNNNNNNNNNNNNN¡¡¡û################################################################### ; ; CP/M IOPB OVERLAY ; CPM_DSK DS 1 ;LOGICAL DRIVE C­TþNNNNNNNNNNNNNNNN¡¡¡þ4¥àNNNNNNNNNNNNNNNNNNNNNN¡¡¡û READOP: DS 1 ;0: WRITE OPERATION, 1: READ OPERATION WRTYPE: DS 1 ;WRITE OPERATION TYPE FROM BDOS: ; 0: WRITE TO ALLOCATED ¬þNNNNNNNNNNNNNNNN¡¡¡þ4J+NNNNNNNNNNNNNNNNNNNNNN¡¡¡û########################################################################### ; ; DRIVE ALLOCATION AREAS ; ;################‡`þrNNNNNNNNNNNNNNNN¡¡¡þ4#l±NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûGE (1 BYTE PER SECTOR) ENDIF LIST OFF ENDM ; ; RESERVE THE DATA SPACE ; DD DL 1 REPT NDRVS LIST OFF ALLDAL 0Éàþ'NNNNNNNNNNNNNNNNN¡¡¡þ4)ƒzNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûE STORAGE SIZE (IN CLUSTERS) ; INT(((#_TRACKS - OFF) * SPT * BYTES PER SECTOR) / CLUSTER SIZE) -1 DPB_DRM DS 2 ;DRM- DIRECTO"OÿÉNNNNNNNNNNNNNNNNN¡¡¡þ4/)ÜNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBOVE. ; PARTITIONING BY HEADS ARE IMPLIMENTED BY USING THE FOLLOWING DATA. ; (HEAD BITS ARE INCLUDED IN SECTOR WORD UPPER BI~ºÿòNNNNNNNNNNNNNNNN¡¡¡þ4•¢NNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE A DISK PARAMETER TABLE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@«”þrNNNNNNNNNNNNNNNN¡¡¡þ4 ziNNNNNNNNNNNNNNNNNNNNNN¡¡¡û##################################################################### ; ; LOGON IOPB OVERLAY ; ;############################uþ NNNNNNNNNNNNNNNN¡¡¡þ4ZNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPM_TRK DS 2 ;LOGICAL TRACK NUMBER CPM_SEC DS 2 ;LOGICAL SECTOR NUMBER DS 1 ;FLAGS CPM_DMA DS 2 ;XFER ADDR CPM_DMAB DS 1 ;XF*þNNNNNNNNNNNNNNNNN¡¡¡þ4µÞNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û(USED) BLOCK (PREREAD) ; 1: WRITE TO DIRECTORY (PREREAD & WRITE) ; 2: WRITE TO UNALLOCATED (UNUSED) BLOCK (NO ; PRERÝ�ÿÂNNNNNNNNNNNNNNNN¡¡¡þ4xNNNNNNNNNNNNNNNNNNNNNN¡¡¡û############################################################ ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@4þ“NNNNNNNNNNNNNNNNN¡¡¡þ4$õ&NNNNNNNNNNNNNNNNNNNNNN¡¡¡û123456789ABCDEF DD DL DD + 1 LIST ON ENDM ;###########################################################################‹|þNNNNNNNNNNNNNNNNN¡¡¡þ4*Ö)NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûRY SIZE -1 DPB_AL0 DS 2 ;AL0,1- DIRECTORY ALLOCATION ; 1 MSB PER DIRECTORY CLUSTER ALLOCATED DPB_CKS DS 2 ;CKS- # DIRECTORðþ$NNNNNNNNNNNNNNNNN¡¡¡þ40:‘NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûTS) ; DPB_SECO DS 2 ;SOF- SECTOR OFFSET (FOR LOGICAL DRIVE) ; 0: NONE, 1..65535: OFFSET DPB_SZ DS 0 ENDM ; ; ;@@@@@@¨BÿÈNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN^NNNþ€Ì�›‚iƒ6„…Ó… †m‡<ˆ ‰Ø‰¥Šs‹AŒ�Ü�«Žy�I�‘ã‘°’~“K”•è•¶–„—Q˜™ì™ºšˆ›Wœ$�ò�ÀžŽŸ\ )¡÷¡Å¢“£`¤.¥û¥É¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ4;NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE THE DPB FOR DRIVE MACRO ; ;@@@@@@@@@@@@@™þ�NNNNNNNNNNNNNNNNN¡¡¡þ4‘£NNNNNNNNNNNNNNNNNNNNNN¡¡¡û############### ; ; RESERVE DRIVE PARAMETER BLOCKS ; ;####################################################################¢ þ�NNNNNNNNNNNNNNNNNN¡¡¡þ4 ~hNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûTORY SECTORS CHECKED ; (DRM +1) / 4 DPBOFF DS 2 ;OFF- # RESERVED TRACKS (USUALLY 2) DPBSZ DS 0 ENDM ; ; ;@@@@@@@@@@@@¸´ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ4^NNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************** ; REVISIONS: ; ; 1.0 - ; ORIGINAL ; ; 1.1 - 3 MAR 87 GRH ; CP/M 2.X deblocking based on CP/M 3.'"þ¹NNNNNNNNNNNNNNNN¡¡¡þ4±ßNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRK ; CALCULATE FROM: ; ;HSTBLK EQU HSTSIZ/128 ;CP/M SECTORS IN SECTOR BUFFER ; CALCULATE FROM: CUR_DPB.DPBPHM + 1 ; ;CPMSÿÈNNNNNNNNNNNNNNNNN¡¡¡þ4yNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************ ;* * ;* THE BDOS ENTRY POINTS GIVEN BELOW SHOW THE 4$þÉNNNNNNNNNNNNNNNN¡¡¡þ4%ñ'NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û= DISK # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ SELDSK: ; ; SAVE DISK # AS REQUE’@þ9NNNNNNNNNNNNNNNN¡¡¡þ4+Ò(NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û+ ; ; HOME THE SELECTED DISK ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ HOME: ; ; ÚþœNNNNNNNNNNNNNNNN¡¡¡þ4nVNNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ALLDPB: MACRO #D LIST ON D#D(DD)DPB: DS DPB_SZ ;ALLOCATI¼~þHNNNNNNNNNNNNNNNNN¡¡¡þ4��NNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡û######## STRUCT 0 DPBSPT DS 2 ;SPT- SECTORS/TRACK DPBBSH DS 1 ;BSH- BLOCK SHIFT FACTOR DETERMINED BY CLUSTER SIZE ; 1K= k¦ÿÉNNNNNNNNNNNNNNNN¡¡¡þ4+;NNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE THE DPB FOR DRIVE MACRO ; ;@@@@@@@@@@@@@@@@@@@ÿ„NNNNNNNNNNNNNNNNN¡¡¡þ4ǃNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûx Data structures (dynamic). ; ;**************************************************************************** ;=========== ¾ÿòNNNNNNNNNNNNNNNN¡¡¡þ4äŒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPT EQU HSTBLK * HSTSPT ;CP/M SECTORS/TRACK ; CALCULATE FROM: CUR_DPB.DPBSPT ; ;SECMSK EQU HSTBLK-1 ;SECTOR MASK ; CALCULATE ¹ÿòNNNNNNNNNNNNNNNNN¡¡¡þ4 ÒNNNNNNNNNNNNNNNNNNNNNN¡¡¡û * ;* CODE WHICH IS RELEVANT TO DEBLOCKING ONLY. * ;* * ;**********B©þNNNNNNNNNNNNNNNNNN¡¡¡þ4&¤tNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSTED DISK ; LD A,C LD (SEKDSK),A ; ; LOOK UP DISK PTR IN TABLE ; LD HL,DRV_TBL ;BASE ADD A,A ;WORD PTRS ADD A,L&ÿÂNNNNNNNNNNNNNNNN¡¡¡þ4,K¿NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û IF PENDING WRITE (BUFFER DIRTY) THEN IGNORE ; LD A,(HSTWRT) OR A,A RET NZ ; ; ELSE PURGE BUFFER ; LD (HSTACT),A $þdNNNNNNNNNNNNNNNN¡¡¡þ4]gNNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡ûON FOR DRIVE #D(DD) LIST OFF ENDM ; ; RESERVE THE DATA SPACE ; DD DL 1 REPT NDRVS LIST OFF ALLDPB 0123456789ABCD1}þNNNNNNNNNNNNNNNNNN¡¡¡þ4 ²¬NNNNNNNNNNNNNNNNNNNNNN¡¡¡û3, 2K= 4, 4K= 5, 8K= 6, 16K= 7 DPBBLM DS 1 ;BLM- BLOCK MASK ; 1K = 7, 2K= 15, 4K= 31, 8K= 63, 16K= 127 DPBEXM DS 1 ;EXM- E£ÐÿòNNNNNNNNNNNNNNNNN¡¡¡þ4 NNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ALLDPB: MACRO #D LIST ON D#D(DD)DPB: DS DPBSZ ;ALLOCATION FOR DRIªRþ NNNNNNNNNNNNNNNNNN¡¡¡þ4ô²NNNNNNNNNNNNNNNNNNNNNN¡¡¡û========================================== ;* * ;* CP/M TO HOST DISK÷ÿÂNNNNNNNNNNNNNNNN¡¡¡þ4×½NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFROM: CUR_DPB.DPBPHM ; ;SECSHF EQU @X ;LOG2(HSTBLK) ; CALCULATE FROM: CUR_DPB.DPBPSH ;=================================Ñ\þBNNNNNNNNNNNNNNNN¡¡¡þ4!=ãNNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************************* ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ xÝþ!NNNNNNNNNNNNNNNN¡¡¡þ4'—ENNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD L,A LD A,0 ADC A,H LD H,A LD A,(HL) ;FETCH PTR INC HL LD H,(HL) LD L,A LD (CUR_DPH),HL ; ; FETCH DPB òîÿ[NNNNNNNNNNNNNNNN¡¡¡þ4-xŽNNNNNNNNNNNNNNNNNNNNNN¡¡¡û;A= 0 AT THIS POINT RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SET TRACK GrÿÂNNNNNNNNNNNNNNNN¡¡¡þ4ÄðNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEF DD DL DD + 1 LIST ON ENDM ; ; BLOCKING BUFFER ; BLKBUF: DS 1024 ;HOST BUFFER IF (($ - 8000H) > 07700H) O>WÿòNNNNNNNNNNNNNNNN¡¡¡þ4 çÿNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûXTENT MASK ; DSM < 256 : 1K= 0, 2K= 1, 4K= 3, 8K= 7, 16K= 15 ; DSM > 255 : 2K= 0, 4K= 1, 8K= 3, 16K= 7 DPBDSM DS 2 ;DSM̼ÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ4 GNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûVE #D(DD) LIST OFF ENDM ; ; RESERVE THE DATA SPACE ; DD DL 1 REPT NDRVS LIST OFF ALLDPB 0123456789ABCDEF DD DL EÿÈNNNNNNNNNNNNNNNNN¡¡¡þ4¡áNNNNNNNNNNNNNNNNNNNNNN¡¡¡û CONSTANTS * ;* * ;===========================================ξÿÈNNNNNNNNNNNNNNNNN¡¡¡þ4N*NNNNNNNNNNNNNNNNNNNNNN¡¡¡û==================== ;* * ;* BDOS CONSTANTS ON ENTRY TO WRITE ¦ÕÿÂNNNNNNNNNNNNNNNN¡¡¡þ4"h°NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ; ENTER HERE ON SYSTEM BOOT TO INITIALIZE ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++)nþNNNNNNNNNNNNNNNNN¡¡¡þ4(‡{NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûPTR ; PUSH IX ;SAVE IX 1ST PUSH HL POP IX ; LD L,(IX+DPHDPBO) LD H,(IX+DPHDPBO + 1) LD (CUR_DPB),HL ; ; FETCHÄUþBNNNNNNNNNNNNNNNN¡¡¡þ4.-ÝNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûIVEN BY REGISTERS BC ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ SETTRK: ; ; STORE TR°‡þNNNNNNNNNNNNNNNNNN¡¡¡þ4÷ÁNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR ($ < 8000H) CONMSG **** BIOS TOO BIG, USE MOVCPM & RE-ADJUST! **** ENDIF END ºSÿHNNNNNNNNNNNNNNNNN¡¡¡þ4 ÔÎNNNNNNNNNNNNNNNNNNNNNN¡¡¡û- DRIVE STORAGE SIZE (IN CLUSTERS) ; INT(((#_TRACKS - OFF) * SPT * BYTES PER SECTOR) / CLUSTER SIZE) -1 DPBDRM DS 2 ;DRM- DI%-ÿÉNNNNNNNNNNNNNNNNNN¡¡¡þ48vNNNNNNNNNNNNNNNNNNNNNN¡¡¡û;***************************************************** ;* * ;* SECTOR DäœþNNNNNNNNNNNNNNNN¡¡¡þ4’ÐNNNNNNNNNNNNNNNNNNNNNN¡¡¡û========== ;BLKSIZ ;CP/M ALLOCATION BLOCK SIZE (IN BYTES, 1K,2K,4K,8K,16K) ; CALCULATE FROM: 0400H SHL (CUR_DPB.DPBBSH - 3) pßþÉNNNNNNNNNNNNNNNN¡¡¡þ4}NNNNNNNNNNNNNNNNNNNNNN¡¡¡û * ;* * ;===================================================== WRALL EQU Kïþ9NNNNNNNNNNNNNNNN¡¡¡þ4#[�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û BOOT: WBOOT: ; ; ASSUME NO DATA IN BUFFER ; XOR A,A LD (HSTACT),A ; ; CLEAR UNALLOCATED SECTOR COUNT ; LD (UNš„þNNNNNNNNNNNNNNNNN¡¡¡þ4)´JNNNNNNNNNNNNNNNNNNNNNN¡¡¡û CURRENT BUFFER CONTROL BLOCK PTR ; LD L,(IX+ DPHDTABO) LD H,(IX+ DPHDTABO + 1) LD (CUR_BCB),HL ; ; RESTORE & RETURN •¯þ[NNNNNNNNNNNNNNNNN¡¡¡þ4/ìNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûACK # ; LD (SEKTRK),BC RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SET SC5þrNNNNNNNNNNNNNNNN¡¡¡þ4¢’NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûOFF ALLDAL 0123456789ABCDEF DD DL DD + 1 LIST ON ENDM ;#############################################################{ÅÿÎNNNNNNNNNNNNNNNNN¡¡¡þ4 MYNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRECTORY SIZE -1 DPBAL0 DS 2 ;AL0,1- DIRECTORY ALLOCATION ; 1 MSB PER DIRECTORY CLUSTER ALLOCATED DPBCKS DS 2 ;CKS- # DIRECÏtþ9NNNNNNNNNNNNNNNNN¡¡¡þ4m%NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûEBLOCKING ALGORITHMS FOR CP/M 2.0 * ;* * ;*******************************c^þäNNNNNNNNNNNNNNNNN¡¡¡þ4‚îNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ;HSTSIZ ;PHYSICAL DISK SECTOR SIZE ; CALCULATE FROM: 0080H SHL CUR_DPB.DPBPSH ; ;HSTSPT EQU 64 ;PHYSICAL DISK SECTORS/T�þBNNNNNNNNNNNNNNNN¡¡¡þ4(HNNNNNNNNNNNNNNNNNNNNNN¡¡¡û0 ;WRITE TO ALLOCATED WRDIR EQU 1 ;WRITE TO DIRECTORY WRUAL EQU 2 ;WRITE TO UNALLOCATED ;*****************************C±þ�NNNNNNNNNNNNNNNNN¡¡¡þ4$ÂNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûACNT),A RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SELECT DISK ; ENTRY- Cý1þBNNNNNNNNNNNNNNNN¡¡¡þ4*áNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûDPH PTR ; POP IX ; LD HL,(CUR_DPH) RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Ýÿ^NNNNNNNNNNNNNNNNN¡¡¡þ40 ¡NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûECTOR GIVEN BY REGISTER BC ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ SETSEC: LD (SEKñ.þ$NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNnNNNNNNN�Ð��‚jƒ7„…Ò…¡†n‡<ˆ ‰×‰¤Šr‹?Œ �Ú�©Žw�D�‘ß‘­’z“G”•╯–~—K˜™æ™´š‚›Qœ�í�ºž‰ŸW $¡ñ¡¾¢Œ£Y¤(¥ö¥Ä¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ5z�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSEC),BC ;SECTOR TO SEEK RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SET DM:«ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ5Ð'NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTAKES THE PLACE OF * ;* THE PREVIOUS BIOS DEFINTION FOR READ. * ;* ®†þINNNNNNNNNNNNNNNN¡¡¡þ5 ?ìNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û; 1: WRITE TO DIRECTORY BLOCK (ALLWAYS WRITE) ; 2: WRITE TO UNALLOCATED BLOCK (NO NEED TO PRE-READ) ; ;******************I þœNNNNNNNNNNNNNNNN¡¡¡þ5�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD (UNASEC),HL ; ; IF NO UNALLOCATED SECTORS REMAIN THEN PREREAD ; CHKUNA: LD A,(UNACNT) OR A,A JP Z,ALLOC ; ; ÔÿÂNNNNNNNNNNNNNNNN¡¡¡þ5ð[NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û LD HL,(UNATRK) ;TRACK++ INC HL LD (UNATRK),HL ; NOOVF: ; ; MATCH FOUND, MARK AS UNNECESSARY READ ; XOR A,A ;PRE�þ$NNNNNNNNNNNNNNNNN¡¡¡þ5ZýNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûOSECSHF: INC BC ;SET BACK TO PHYSICAL SECTOR LD (SEKHST),BC ;BUFFER SECTOR TO SEEK ; ; IF BUFFER EMPTY THEN READ THE PHV)þNNNNNNNNNNNNNNNN¡¡¡þ5%°£NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL SECTOR LD (HSTDSK),A ; LD HL,(SEKTRK) LD (HSTTRK),HL ; LD HL,(SEKHST) LD (HSTSEC),HL ; ; IF REQUIRED TO READ TlÿÎNNNNNNNNNNNNNNNNN¡¡¡þ5+“¬NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOR A,A JP NZ,RWMOVE ;SKIP IF READ ; ; WRITE OPERATION, MARK AND SWITCH DIRECTION ; LD A,1 ;BUFFER = DIRTY LD (HSTWRTG4þ!NNNNNNNNNNNNNNNN¡¡¡þ5/ÒNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûA ADDRESS GIVEN BY BC ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ SETDMA: LD (DMAADR),Bô£þ“NNNNNNNNNNNNNNNNN¡¡¡þ5ÀNNNNNNNNNNNNNNNNNNNNNN¡¡¡û * ;* READ THE SELECTED CP/M SECTOR * ;***************************************************** READ: ; ; SET UP D,>þHNNNNNNNNNNNNNNNN¡¡¡þ5j¿NNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************************************************** WRITE: ; ; SET PTR TO DISK DATA ; PUSH IX LD IX,(CUR_DPB) †¥þ NNNNNNNNNNNNNNNN¡¡¡þ5†NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûELSE MORE UNALLOCATED RECORDS REMAIN, COUNT-- ; DEC A LD (UNACNT),A ; ; IF REQUESTED SECTOR != UNALLOCATED SECTOR THEN ’NþrNNNNNNNNNNNNNNNN¡¡¡þ5¥NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûREAD FLAG = FALSE LD (RSFLAG),A JP RWOPER ; ; ; NOT AN UNALLOCATED RECORD, REQUIRES PRE-READ ; ALLOC: XOR A,A ;COU‹¥þ NNNNNNNNNNNNNNNNN¡¡¡þ5 OVNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûYSICAL SECTOR ; LD HL,HSTACT LD A,(HL) ; LD (HL),1 ;BUFFER FULL IN ANY CASE ; OR A,A JP Z,FILHST ; ; HOST BUFFº�þœNNNNNNNNNNNNNNNN¡¡¡þ5&åðNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûHEN READ ; LD A,(RSFLAG) ;NEED TO READ? OR A,A CALL NZ,READHST ;YES, IF 1 ; ; BUFFER = CLEAN ; XOR A,A LD (HST»þ„NNNNNNNNNNNNNNNN¡¡¡þ5, ;NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û),A ; EX DE,HL ;SOURCE/DEST SWAP ; RWMOVE: ; ; BC INITIALLY 128, DE IS SOURCE, HL IS DEST ; LDIR ; ; DATA HAS Bm”þNNNNNNNNNNNNNNNN¡¡¡þ5ãNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûC ; ; ASSUME BANK 0 FOR NOW ; XOR A,A LD (DMABNK),A RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++Š·þNNNNNNNNNNNNNNNNNN¡¡¡þ5 ó(NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûATA TABLE PTR ; PUSH IX LD IX,(CUR_DPB) ; ; READ_OPERATION_FLAG = TRUE (1) ; LD A,1 LD (READOP),A ; ; PRE-READÂ:þHNNNNNNNNNNNNNNNNN¡¡¡þ5YŽNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ; READ_OP_FLAG = FALSE ; XOR A,A LD (READOP),A ; ; SAVE WRITE TYPE ; LD A,C LD (WRTYPE),A ; ; IF 1ST WRIT±‰þ9NNNNNNNNNNNNNNNN¡¡¡þ5µ6NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûPURGE ; LD A,(SEKDSK) ;SAME DISK? LD HL,UNADSK CP A,(HL) JP NZ,ALLOC ; LD HL,(UNATRK) ;SAME TRACK? LD DE,(SECTRK) ×eþNNNNNNNNNNNNNNNNNN¡¡¡þ5–9NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNT = 0 LD (UNACNT),A ; INC A ;PREREAD FLAG = TRUE LD (RSFLAG),A ; ; ; ; COMMON CODE FOR READ AND WRITE FOLLOWS ; MÿÂNNNNNNNNNNNNNNNN¡¡¡þ5!|gNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûER ACTIVE, SAME AS SEEK BUFFER? ; LD A,(SEKDSK) LD HL,HSTDSK ;SAME DISK? CP A,(HL) JP NZ,NOMATCH ; LD HL,(HSTTRK) ;Sû þNNNNNNNNNNNNNNNNNN¡¡¡þ5'ÖÁNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûWRT),A ; MATCH: ; ; COPY DATA TO OR FROM BUFFER ; LD HL,(SEKSEC) ;CALCULATE INDEX INTO BUFFER DEC HL ;CONVERT TO LOG4þ$NNNNNNNNNNNNNNNN¡¡¡þ5-9 NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûEEN MOVED TO/FROM HOST BUFFER, IF NOT DIRECTORY THEN DELAY WRITE ; LD A,(WRTYPE) ;IF NOT DIRECTORY THEN DELAY WRITE CP A,WRBþBNNNNNNNNNNNNNNNN¡¡¡þ5…tNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++ ; ; TRANSLATE SECTOR NUMBER BC ; ENTRY- BC= LOGICAL SECTOR ; EXIT - HL= PHYSICAL SECTOR ; ;+++++++¨SþBNNNNNNNNNNNNNNNN¡¡¡þ5 ¦{NNNNNNNNNNNNNNNNNNNNNN¡¡¡û_OF_DATA_FLAG = TRUE ; LD (RSFLAG),A ; ; TREAT AS UNALLOCATED BLOCK ; LD A,WRUAL LD (WRTYPE),A ; JP RWOPER ;TO PíeÿINNNNNNNNNNNNNNNNN¡¡¡þ5JÃNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE TO UNALLOCATED (NEW, UNUSED) BLOCK THEN SET PARAMETERS ; CP A,WRUAL JP NZ,CHKUNA ; ; COUNT = NUMBER_OF_SECTORS_IN_BLOŠáÿòNNNNNNNNNNNNNNNN¡¡¡þ5àeNNNNNNNNNNNNNNNNNNNNNN¡¡¡û SBC HL,DE JP NZ,ALLOC ; LD HL,(SEKSEC) LD DE,(UNASEC) SBC HL,DE JP NZ,ALLOC ; ; MATCH, MOVE TO NEXT SECTOR FOR ˜™þ'NNNNNNNNNNNNNNNNN¡¡¡þ5®NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û RWOPER: ; ; ASSUME NO ERRORS ; XOR A,A LD (ERFLAG),A ; ; COMPUTE BUFFER SECTOR ; LD BC,(SEKSEC) DEC BC ;CON>UÿòNNNNNNNNNNNNNNNN¡¡¡þ5")4NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûAME TRACK? LD DE,(SEKTRK) SBC HL,DE JP NZ,NOMATCH ; LD DE,(SEKHST) ;SAME SECTOR? LD HL,(HSTSEC) SBC HL,DE JP Z,MAä2ÿäNNNNNNNNNNNNNNNNN¡¡¡þ5(ÆÿNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûICAL SECTOR (0..N-1) LD A,L ; AND A,(IX+ DPBPHM) ;USE PHYSICAL RECORD MASK DATA (CP/M 3.X) ; RRA ;BITS <7..1> -> BITS k}ÿNNNNNNNNNNNNNNNN¡¡¡þ5.lYNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûDIR LD A,(ERFLAG) ;RETURN ANY ERRORS ANYWAY JR NZ,RW_RET ; ; IF ERROR THEN ABORT ; OR A,A RET NZ ; ; NO ERROR/DuaþHNNNNNNNNNNNNNNNNN¡¡¡þ5¶ENNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ SECTRAN: LD H,B LD L,C INC HL RET ;*******éYÿÈNNNNNNNNNNNNNNNNN¡¡¡þ5 •JNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûERFORM THE READ ;**************************************************************************** ; ; THE WRITE ENTRY POINT T§þ NNNNNNNNNNNNNNNNN¡¡¡þ5yòNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCK ; LD A,(IX+ DPBBLM) ;CUR_DPB.DPBBLM + 1 ::= (BLKSIZ/128) INC A LD (UNACNT),A ; ; SET DISK TO SEEK ; LD A,(SEKDS `þNNNNNNNNNNNNNNNN¡¡¡þ5ÓTNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFUTURE REF ; INC HL ;UNASEC = UNASEC+1 LD (UNASEC),HL ; ; IF PAST LAST SECTOR ON TRACK THEN USE 1ST SECTOR OF NEXT TRAÛ!þäNNNNNNNNNNNNNNNN¡¡¡þ5<ŸNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûVERT PHYSICAL SECTOR TO LOGICAL ; LD A,(IX+ DPBPSH) ;USE PHYSICAL SHIFT FACTOR (CP/M 3.X) OR A,A ;IF ALREADY 0 THEN SECTQ4þ9NNNNNNNNNNNNNNNN¡¡¡þ5#NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTCH ;SKIP IF MATCH ; NOMATCH: ; ; IF CURRENT BUFFER DIRTY THEN WRITE IT OUT BEFORE READING NEW ONE ; LD A,(HSTWRT) O™®ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ5)õÎNNNNNNNNNNNNNNNNNNNNNN¡¡¡û<14..8> LD H,A ; LD A,0 ;BIT 0 -> BIT 7 RRA LD L,A ; ; HL HAS RELATIVE HOST BUFFER ADDRESS ; LD DE,HSTBUF ADD ]þÉNNNNNNNNNNNNNNNNN¡¡¡þ5/_hNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIRECTORY WRITE ; XOR A,A ;BUFFER = CLEAN LD (HSTWRT),A ; CALL WRITEHST ;WRITE TO DISK ; LD A,(ERFLAG) ;RETURN ANY ER€ þäNNNNNNNNNNNNNNNN¡¡¡þ5ãNNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡û********************************************** ;* * ;* THE READ ENTRY POINT [ûþ9NNNNNNNNNNNNNNNN¡¡¡þ5 ÝNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûAKES THE PLACE OF THE PREVIOUS BIOS DEFINTION ; FOR WRITE. ; ENTRY- C= WRITE TYPE: ; 0: WRITE TO ALLOCATED BLOCK (UPDATE) Eóþ9NNNNNNNNNNNNNNNN¡¡¡þ5,¡NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûK) LD (UNADSK),A ; ; SET TRACK TO SEEK ; LD HL,(SEKTRK) LD (UNATRK),HL ; ; SET SECTOR TO SEEK ; LD HL,(SEKSEC)èHþ NNNNNNNNNNNNNNNNN¡¡¡þ5ÃjNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCK ; LD E,(IX+ DPBSPT) LD D,(IX+ DPBSPT +1) INC DE SBC HL,DE JP C,NOOVF ; LD HL,1 ;SECTOR = 1 LD (UNASEC),HL ;!ÿþNNNNNNNNNNNNNNNN¡¡¡þ5iÌNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOR SIZE IS 128 JR Z,NOSECSHF ; SECSHFLP: SRL B ;ELSE SHIFT OVER TO PHYSICAL SECTOR RR C DEC A JR NZ,SECSHFLP ; N��þHNNNNNNNNNNNNNNNNN¡¡¡þ5$ƒ’NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR A,A CALL NZ,WRITEHST ;CLEAR HOST BUFF ; FILHST: ; ; READ THE SECTOR BUFFER ; LD A,(SEKDSK) ;BUFFER SECTOR = PHYSICAÕ²ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ5* �NNNNNNNNNNNNNNNNNNNNNN¡¡¡û HL,DE ;HL = HOST ADDRESS ; LD DE,(DMAADR) ;GET/PUT CP/M DATA LD BC,128 ;LENGTH OF MOVE ; LD A,(READOP) ;WHICH WAY? þ“NNNNNNNNNNNNNNNNN¡¡¡þ50L%NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRORS ; ; DONE, RESTORE & RETURN ; RW_RET: POP IX ; RET ;********************************************************·kþ$NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÎNNNþ€Ì�š‚gƒ5„…Ò… †n‡<ˆ ‰×‰¥Št‹BŒ�Þ�¬Žz�H�‘æ‘´’‚“P”•땸–†—T˜"™ï™½š‹›Yœ&�ô�ž‘Ÿ^ ,¡ù¡Ç¢–£e¤4¥¦Ð¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ5M±NNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************** ; ; WRITEHST PERFORMS THE PHYSICAL WRITE FROM HSTBUF TO THE HOST DISK. ; ENTRY- (HSTDSK)= DISK # TO WRITO•þ�NNNNNNNNNNNNNNNNN¡¡¡þ5çNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************************ ; ; UNITIALIZED RAM DATA AREAS ; ;*****************************ôÜþäNNNNNNNNNNNNNNNN¡¡¡þ5 ÜNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûINING IN BLOCK (CLUSTER) UNADSK: DS 1 ;LAST UNALLOC DISK UNATRK: DS 2 ;LAST UNALLOC TRACK UNASEC: DS 2 ;LAST UNALLOC SECTOxtÿÂNNNNNNNNNNNNNNNN¡¡¡þ5( NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û----------------------------------------------------------- ; ; INIT - COLD START ENTRY FROM BOOT MUST SET ALL BIOS PARAMS(‹ÿ„NNNNNNNNNNNNNNNNN¡¡¡þ5ÇkNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLOCK DRIVE ; OR A,A LD A,38H ;COND. JR (ON) JR Z,CLKON ; ; ELSE TURN OFF CLOCK DRIVE ; LD A,18H ;UNCOND. JR (OFFÝtÿüNNNNNNNNNNNNNNNNN¡¡¡þ5mÍNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ;---------------------------------------------------------- ; ; WARM REBOOT ENTRY LOADS CCP,BDOS FROM DISK & ; SETS UP VARIAþäNNNNNNNNNNNNNNNNN¡¡¡þ5%‡“NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûODE) LSTINC EQU FALSE ;LIST INCLUDE FILES USEMON EQU TRUE ;USE MONITOR ROM I/O ROUTINES IF TRUE INTRPTS EQU TRUE ;ENABLE IÝÈþNNNNNNNNNNNNNNNNN¡¡¡þ5+¤œNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; D SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ; E JADE 8" FLOPPY PHYSICAL DRIVEÚrþ°NNNNNNNNNNNNNNNNN¡¡¡þ5âNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE TO ; (HSTTRK)= TRACK # TO WRITE TO ; (HSTSEC)= SECTOR # TO WRITE TO ; EXIT - (ERFLAG)= 0: OK, /0: ERROR ; ;************›²þHNNNNNNNNNNNNNNNNN¡¡¡þ5÷)NNNNNNNNNNNNNNNNNNNNNN¡¡¡û*********************************************** ; ; THE FOLLOWING ITEMS ARE SET BY THE BIOS FUNCTIONS ; SEKDSK: DS 1 ;LOG•¶þ'NNNNNNNNNNNNNNNN¡¡¡þ5]�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR ; ; ERFLAG: DS 1 ;ERROR REPORTING 0: OK, /0: ERROR RSFLAG: DS 1 ;0: NO PREREAD REQ'D, /0: PREREAD REQ'D READOP: DS 1 ;‹@þNNNNNNNNNNNNNNNN¡¡¡þ5±7NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û ; ;---------------------------------------------------------------------------- ; INIT: ; ; SET TEMPORARY STACK ; DI¢³ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ5’8NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û) (CAUSES JUMP TO ILLEGAL) ; CLKON: LD (INHCLK),A ; ; BOOT CCP & BDOS ; JR WARM ;#################################2¦þ!NNNNNNNNNNNNNNNNNN¡¡¡þ5 xfNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBLES ; ;---------------------------------------------------------- ; WARM: ; ; SET TEMPORARY STACK ; DI LD SP,DEFBF$þNNNNNNNNNNNNNNNNNN¡¡¡þ5&ÒÀNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNTERRUPT PROCESSING WHISTLE INTCPTS EQU TRUE ;ENABLE SYSTEM CALL INTERCEPT WHISTLE BOOT EQU 10H ;10H: HARD DISK, 3: 8" FLOPP/þNNNNNNNNNNNNNNNNN¡¡¡þ5,= NNNNNNNNNNNNNNNNNNNNNN¡¡¡û 0 ; F JADE 8" FLOPPY PHYSICAL DRIVE 1 ENDIF IF BOOT = 3 ; A JADE 8" FLOPPY PHYSICAL DRIVE 0 ; B JADE 8" FLOPPY¨þöNNNNNNNNNNNNNNNNN¡¡¡þ5+ÓNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û**************************************************************** WRITEHST: ; RET ;*************************************•}þ�NNNNNNNNNNNNNNNNN¡¡¡þ5 ÄNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûICAL DRIVE SEKTRK: DS 2 ;LOGICAL TRACK NUMBER SEKSEC: DS 2 ;LOGICAL SECTOR NUMBER ; ; THE FOLLOWING ARE SET BY THE BUFFEÃÞþ$NNNNNNNNNNNNNNNNN¡¡¡þ5n¾NNNNNNNNNNNNNNNNNNNNNN¡¡¡û0: WRITE OPERATION, 1: READ OPERATION WRTYPE: DS 1 ;WRITE OPERATION TYPE FROM BDOS: ; 0: WRITE TO ALLOCATED (USED) BLOCK ¸òþ„NNNNNNNNNNNNNNNN¡¡¡þ5‚NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD SP,DEFBFR ;USE PAGE 0 FOR STACK LD (THIS_STK),SP EI ; ; INIT DEFAULT DRIVE ; LD A,(DK_BDRV) ;USE DRIVE # PASSEDPþ NNNNNNNNNNNNNNNNN¡¡¡þ5¡ NNNNNNNNNNNNNNNNNNNNNN¡¡¡û########################################### ; ; SIGN-ON MESSAGE ; ;#########################################################Á?þHNNNNNNNNNNNNNNNNNN¡¡¡þ5!KWNNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡û TITLE CUSTOMIZED BIOS FOR M5B LIST NOCOND ;============================================================================ ; þ^þäNNNNNNNNNNNNNNNN¡¡¡þ5'áñNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûY, 20H: 5" FLOPPY DEBUG EQU FALSE ;TRUE TO DUMP THE IOPB DATA TO PRINTER FORM ;******************************************þBNNNNNNNNNNNNNNNN¡¡¡þ5-:NNNNNNNNNNNNNNNNNNNNNN¡¡¡û PHYSICAL DRIVE 1 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; D SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 0 ; E SIDE 0 ŠóþNNNNNNNNNNNNNNNNN¡¡¡þ5²DNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û*************************************** ; ; READHST PERFORMS THE PHYSICAL READ FROM THE HOST DISK INTO HSTBUF. ; ENTRY- (HSTDäþ„NNNNNNNNNNNNNNNN¡¡¡þ5 ‘KNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR READ/WRITE ; HSTDSK: DS 1 ;BUFFER DISK NUMBER HSTTRK: DS 2 ;BUFFER TRACK NUMBER HSTSEC: DS 2 ;BUFFER SECTOR NUMBER ; y¶ÿäNNNNNNNNNNNNNNNNN¡¡¡þ5}óNNNNNNNNNNNNNNNNNNNNNN¡¡¡û(PREREAD) ; 1: WRITE TO DIRECTORY (PREREAD & WRITE) ; 2: WRITE TO UNALLOCATED (UNUSED) BLOCK (NO ; PREREAD REQ'D)¦6þrNNNNNNNNNNNNNNNN¡¡¡þ5×UNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û IN PAGE 0 AND A,3 LD (DEFDRV),A ; ; SEND SYSTEM SIGN-ON ; LD HL,MSGSO CALL EDITOR ; ; MODIFY COLD START VECTORoKÿòNNNNNNNNNNNNNNNNN¡¡¡þ58žNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û################### ; MSGSO: DB CR,LF DB CPMSZ / (KBYTE * 10) + '0' DB (CPMSZ MOD (KBYTE * 10)) / KBYTE + '0' DB 'K CP/MÇÿdNNNNNNNNNNNNNNNN¡¡¡þ5"NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ASSEMBLY PARAMETERS ; ;============================================================================ FALSE EQU 0 TRUE EQU N¯7þ NNNNNNNNNNNNNNNN¡¡¡þ5(ñÏNNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************************** ; ; CUSTOMIZED BIOS FOR M5B ; (c) 1981 GRH Electronics, CUPERTINO, CA ; ;********** Ÿþ“NNNNNNNNNNNNNNNN¡¡¡þ5.[iNNNNNNNNNNNNNNNNNNNNNN¡¡¡û& 1 OF HARD DISK PHYSICAL DRIVE 1 ; F SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ENDIF IF BOOT = 20H ; A JADE 5" FLOØxþBNNNNNNNNNNNNNNNNN¡¡¡þ5�uNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSK)= DISK # TO READ FROM ; (HSTTRK)= TRACK # TO READ FROM ; (HSTSEC)= SECTOR # TO READ FROM ; EXIT - (ERFLAG)= 0: OK, /0: E³"þHNNNNNNNNNNNNNNNNN¡¡¡þ5 ¢zNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û; SEKHST: DS 2 ;PHYSICAL SECTOR TO XFER ; HSTACT: DS 1 ;0: BUFFER FLUSHED, /0: DATA IN BUFFER HSTWRT: DS 1 ;0: BUFFER CLEÈñþäNNNNNNNNNNNNNNNNN¡¡¡þ5NÂNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DMAADR: DS 2 ;LAST DMA ADDRESS DMABNK DS 1 ;LAST DMA BANK ; HSTBUF: DS 1024 ;HOST BUFFER }þNNNNNNNNNNNNNNNN¡¡¡þ5ädNNNNNNNNNNNNNNNNNNNNNN¡¡¡û TO WARM START ; LD HL,(BIOS+4) LD (BIOS+1),HL ; ; INIT OUR STUFF ; CALL GETBNK LD (BUF_DMAB),A ; ; INITIALIZElþœNNNNNNNNNNNNNNNNN¡¡¡þ5 ¯NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û-80 Vers 2.2',CR,LF DB 'M5b CBIOS Vers ' PVERS VERSN DM CR,LF IF $ > (DIRBF + SECSZ) CONMSG **** WARNING! C[íþ�NNNNNNNNNNNNNNNNN¡¡¡þ5#-5NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOT FALSE ;============================================================================ ; ; CONDITIONAL ASSEMBLY FLAGS ; ;žþ�NNNNNNNNNNNNNNNNNN¡¡¡þ5)ÂþNNNNNNNNNNNNNNNNNNNNNN¡¡¡û****************************************************************** ; ; CONFIGURATION: ; ; CPM ; DRIVE USAGE IF BOOT = 1ÔPþ°NNNNNNNNNNNNNNNN¡¡¡þ5/hXNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û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~þœNNNNNNNNNNNNNNNN¡¡¡þ5Ô&NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûRROR ; ;**************************************************************************** READHST: ; RET ;****************ORÿòNNNNNNNNNNNNNNNN¡¡¡þ5 ;íNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAN, /0: BUFFER DIRTY (MODIFIED) ; ; THE FOLLOWING USED BY THE UNALLOCATED BLOCK ALGORITHMS ; UNACNT: DS 1 ;# SECTORS REMA*ºÿÂNNNNNNNNNNNNNNNN¡¡¡þ5‘NNNNNNNNNNNNNNNNNNNNNN¡¡¡û#################################################################### ; DIRBF: EQU $ ;BUFFER BEGINNING ;-----------------h•þ>NNNNNNNNNNNNNNNNNN¡¡¡þ5ôZNNNNNNNNNNNNNNNNNNNNNN¡¡¡û CLOCK VECTORS IF CLOCK INSTALLED ; LD A,MF_CSYN ;TEST FOR BOARD PRESENT CALL XMROM ; ; IF CLOCK PRESENT THEN TURN ON CÿDÿÂNNNNNNNNNNNNNNNNN¡¡¡þ5^üNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOLD INIT CODE BIGGER THAN DIR BUFFER **** ELSE DS DIRBF+SECSZ-$ ;FILL OUT DIRECTORY BUFFER TO 1 SECTOR SIZE ENDIF ¶þNNNNNNNNNNNNNNNNNN¡¡¡þ5$´¢NNNNNNNNNNNNNNNNNNNNNN¡¡¡û============================================================================ SHORT EQU FALSE ;SHORT BIOS (REMOVES UNESENTIAL C‘•ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ5*—­NNNNNNNNNNNNNNNNNNNNNN¡¡¡û0H ;HARD DISK BOOT CONFIG. ; A SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; B SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 0 ; Sþ�NNNNNNNNNNNNNNNNN¡¡¡þ50{NNNNNNNNNNNNNNNNNNNNNN¡¡¡û 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 ; ,ÃþmNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN8NNNNNNNN�Ñ� ‚nƒ<„ …×…¥†s‡@ˆ‰Û‰©Šw‹DŒ�à�®Ž|�K�‘ç‘´’‚“P”•앹–ˆ—V˜$™ñ™ÀšŽ›\œ)�÷�Åž“Ÿ` /¡ý¡Ë¢™£g¤5¥¦Ñ¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6á]NNNNNNNNNNNNNNNNNNNNNNð¡¡¡û G JADE 8" FLOPPY PHYSICAL DRIVE 0 ; H JADE 8" FLOPPY PHYSICAL DRIVE 1 ENDIF ; ;***************************************ŒeþNNNNNNNNNNNNNNNN¡¡¡þ6KûNNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡û- 22 APR 83 GRH ; CHANGED DEFINITIONS TO ALLOW BIG DIRECTORIES. ; DISALLOWED DRIVES C & D. ; 2.29 - 3 SEP 83 GRH ; ChangÀjÿÎNNNNNNNNNNNNNNNNN¡¡¡þ6 ¤0NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûformity in ; parameter passing between hard disk & JADE floppy IOPBs. ; Vector I/O routines to monitor rom routines. ; 2.0û°þNNNNNNNNNNNNNNNNN¡¡¡þ6„LNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûwn to 60k. ; 3.01 26 JUN 88 GRH ; Remove 5" floppy support. Implement in CP/M-86 BIOS. ; Change single function to return drÆ+þÉNNNNNNNNNNNNNNNNN¡¡¡þ6k‡NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPB structure in preparation for deblocking. ; 3.05 11-3-88 GRH ; Change included data to update IOPB.PBSTAT to new configura�?þNNNNNNNNNNNNNNNN¡¡¡þ6Á!NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFLG. ; 3.08 2-22-91 GRH ; Remove references to THIS_BNK & use monitor function #7 instead. ; Add track-head shift factor toM(þNNNNNNNNNNNNNNNNN¡¡¡þ6%+NNNNNNNNNNNNNNNNNNNNN!ô¡¡¡û INCLUDE DISKS3.DEF ; INCLUDE MONBOARD.DEF ; INCLUDE ISHA.DEF ; INCLUDE B:M5ZF101.DEF ; ;============================7‰þrNNNNNNNNNNNNNNNNN¡¡¡þ6+pNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS: EQU CPMBS + 4A00H ;ADDRESS OF BDOS BIOSR: EQU 1000H - BIOS ; ; PAGE 0 LOCATIONS ; PAGE0: EQU 0 ;START OF CP/M RAM IO©ØÿÈNNNNNNNNNNNNNNNNN¡¡¡þ6´NNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************** ; REVISIONS: ; ; 2.2.0 - RELEASE ; 2.2.3 - SWAPPED DCM & BIOS SECTORS ON DISK, ALLOWING A ; LA‹žþ!NNNNNNNNNNNNNNNN¡¡¡þ6[ÅNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûed Rev # for blocked DCM. Enables IBM system 34 ; 256 bytes per sector disks to be read. ; 1.10 - 23 SEP 83 GRH ; Move clocxþ$NNNNNNNNNNNNNNNN¡¡¡þ6ñcNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û3 - 4 JUN 84 GRH ; Add bells & whistles again. ; Move to 61k system. ; 2.04 - 30 MAR 85 GRH ; Implemented hard disk drivìÚþBNNNNNNNNNNNNNNNN¡¡¡þ6ÛNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûive table ptr into a BIOS function ; call using restart instruction. ; Change LOGON to specify the ID sector & track. At sam*ÒþNNNNNNNNNNNNNNNNN¡¡¡þ6>ÔNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûtion. ; 3.06 1-28-89 GRH ; Revised primitive calling procedures to use the monitor rom function ; rather than swapping RomÔþXNNNNNNNNNNNNNNNNN¡¡¡þ6 ÔŠNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û DPBs for future use. ; ; 3.09 5-15-91 GRH ; Change 8" floppy side select to track bit 0. Move calculation from ; DCM8 toþBNNNNNNNNNNNNNNN¡¡¡þ6&~,NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û================================================ ; LIST OFF *INCLUDE JDDCONT.DEF *INCLUDE COMIOPB3.DEF *INCLUDE DISKÄþ NNNNNNNNNNNNNNNNN¡¡¡þ6,‘çNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBYTE: EQU PAGE0 + 3 ;IOBYTE ADDR DEFDRV: EQU PAGE0 + 4 ;DEFAULT DRIVE PARAM ADDR BDOSJV EQU PAGE0 + 5 ;BDOS SYSTEM CALL ENTRY HþNNNNNNNNNNNNNNNNN¡¡¡þ6‡?NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûRGER BIOS ALLOCATION ON THE DISK. ; 2.2.4 - ADDED NAKED TERMINAL DRIVERS & IOBYTE IN ; ANTICIPATION OF THE MONITOR. ALSO, Äþ'NNNNNNNNNNNNNNNNN¡¡¡þ6 hôNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûk-calendar routines to ROM. Add Interrupt handler ; (Mode 2). Change Revision display of sign-on (separate CBIOS rev). ; 2.00 xÝþ­NNNNNNNNNNNNNNNN¡¡¡þ6ÂRNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûe 1 as C: & D:. ; Implemented the Logon function for the hard disk. ; Implemented user friendly disk error options: Abort, Ret¢zþNNNNNNNNNNNNNNNNNNN¡¡¡þ6.êNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûe time, fix bug ; which did not specify the logon track. ; 3.02 7 JUL 88 GRH ; Add '?' to include file names. ; Change h þNNNNNNNNNNNNNNNNN¡¡¡þ6 åNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûs itself. ; 3.07 11-25-90 GRH ; Modify for Ver. 1.22 Monitor. ; Fix bug in 8" Hard Disk table which benignly (at current leô¬ÿINNNNNNNNNNNNNNNNN¡¡¡þ6!ç»NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û CBIOS. ; Remove IOPB ptr passing in IX redundancy. ; Change DPB track-head shift factor to Sector Offset like track ; offse þþ NNNNNNNNNNNNNNNN¡¡¡þ6'MNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS3.DEF *INCLUDE MONBOARD.DEF *INCLUDE ISHA.DEF *INCLUDE B:M5ZF101.DEF LIST ON ;===================================˜éþrNNNNNNNNNNNNNNNN¡¡¡þ6-¢ÖNNNNNNNNNNNNNNNNNNNNNN¡¡¡û THIS_BNK EQU PAGE0 + 001BH ;BANK # OF THE CURRENT BANK DK_BDRV EQU 0041H ;BOOT DRIVE # FROM PROM DEFBFR EQU PAGE0 + 80H ;DEF·jþ'NNNNNNNNNNNNNNNNN¡¡¡þ6¨NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûALL REFERENCES ; REQUIRING THE I/O PROMS TO BOOT HAS BEEN REMOVED. ; 2.2.5 - RECONFIGURE FOR 62K SYSTEM. ; 2.2.6 - 20 FEB‘[þrNNNNNNNNNNNNNNNNN¡¡¡þ6 =§NNNNNNNNNNNNNNNNNNNNNN¡¡¡û- 24 MAR 84 GRH ; Modify for hard disk ; 2.01 - 28 APR 84 GRH ; Change hard disk DPB to reflect half size directory, but Ž4þNNNNNNNNNNNNNNNN¡¡¡þ6ÑNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûry, Ignore. ; Solved warm boot hang problem by reseting host adapter if busy. ; 3.00 - 26 JAN 87 GRH ; Implemented new commš þ“NNNNNNNNNNNNNNNN¡¡¡þ6{¹NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûard disk system tracks directory reference to new format. ; Correct bug in drivers which caused retry to fail. (sector remained['þNNNNNNNNNNNNNNNNNNN¡¡¡þ6”rNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûvel) ; caused the drive table to have bad data (default table was missing ; the 2 deblocking extension bytes). ; Implement ™þNNNNNNNNNNNNNNNNN¡¡¡þ6"²èNNNNNNNNNNNNNNNNNNNNNN¡¡¡ût. Disk partitioning will add this value to sector word. It ; will be stored in the ID sector data to be dynamic. ; VERSN EQ#hþ„NNNNNNNNNNNNNNNN¡¡¡þ6(]#NNNNNNNNNNNNNNNNNNNNNN¡¡¡û========================================= ; ; DISK OPERATING SYSTEM ADDRESSES ; ;=========================================ôþäNNNNNNNNNNNNNNNN¡¡¡þ6.÷…NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAULT BUFFER ; ; BIOS FUNCTION CALL RESTART VECTOR ; BFUNRST EQU 28H BFUNRSV EQU PAGE0 + BFUNRST BFUNRSI EQU 0C7H + BFUNR€þNNNNNNNNNNNNNNNNNN¡¡¡þ6-™NNNNNNNNNNNNNNNNNNNNNN¡¡¡û 83 ; DOUBLE D REV C UPGRADE. CHANGE BOARD STATUS PORT BITS. ; 2.2.7 - 8 MAR 83 GRH ; ADDED CLOCK/CALENDAR DRIVER, SYSTEM CAL ÑþNNNNNNNNNNNNNNNNNN¡¡¡þ6 –NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûkeep ; allocation for 1k directory ; 2.02 - 2 JUN 84 GRH ; Change floppy disk drivers to relate to ISASI control of JADE ;AÿòNNNNNNNNNNNNNNNNN¡¡¡þ6â.NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûon IOPB code & Jade floppy firmware support. ; Implemented disk drive driver tables and new function to return ; a ptr to a dmþ'NNNNNNNNNNNNNNNN¡¡¡þ6HˆNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; corrupted) ; Stubbed out new Clock routines for present. ; 3.03 31 JUL 88 GRH ; Unstub Clock routines. ; 3.04 6 AUG ž¬þNNNNNNNNNNNNNNNN¡¡¡þ6§CNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûdata xfer inhibit schemes with PB_FLG & PB_BCNT. ; Add pick-up of THIS_BNK data in all iopb cases. ; Remove clock buffer set/rwèþ“NNNNNNNNNNNNNNNNN¡¡¡þ6#�ÙNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûU 309 ; ;**************************************************************************** SUBTTL SYSTEM DECLARATIONS ;=====§âþœNNNNNNNNNNNNNNNNN¡¡¡þ6)nNNNNNNNNNNNNNNNNNNNNNN¡¡¡û=================================== ; NKSYS: EQU 60 ;SYSTEM SIZE IN K BYTES KBYTE: EQU 1024 CPMSZ: EQU KBYTE * NKSYS CPMBS£�þNNNNNNNNNNNNNNN¡¡¡þ6/Ä´NNNNNNNNNNNNNNNNNNNNNNð¡¡¡ûST ; TPA: EQU 100H ;============================================================================ ; ; OTHER DECLARATIONSrðþNNNNNNNNNNNNNNNNN¡¡¡þ6xÊNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL INTERCEPT, ; ILLEGAL SYSTEM CALL MESSAGE, CHANGED BIOS SIZE TO END ; OF INITIALIZED DATA AREA. RESTRUCTURE MODULES. ; 2.28 kíþ}NNNNNNNNNNNNNNNNN¡¡¡þ6 —NNNNNNNNNNNNNNNNNNNNNN¡¡¡û FDC. ; Change IOPB sector value from physical sector (1..n) to logical ; sector value (0..n-1). This maintains more uniŰÿÈNNNNNNNNNNNNNNNNN¡¡¡þ6·}NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûrive table. ; Removed init of IOBYTE. ; Implemented 5" floppy driver. ; Implemented use of ROM primitives. ; Moved system do×4þrNNNNNNNNNNNNNNNN¡¡¡þ6X¶NNNNNNNNNNNNNNNNNNNNNN¡¡¡û88 GRH ; Remove floppy side select from BIOS & move to controller. ; Implement new ID sector format. ; Implement CP/M 3.0 DyðþNNNNNNNNNNNNNNNNN¡¡¡þ6òNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûead system calls. ; 12-5-90 GRH ; Remove IX IOPB ptr passing to disk drivers. ; 1-13-91 GRH ; Fix bug which corrupted PB_9¾þNNNNNNNNNNNNNNNNN¡¡¡þ6$NNNNNNNNNNNNNNNNNNNNNNN¡¡¡û======================================================================= ; ; INCLUDE JDDCONT.DEF ; INCLUDE COMIOPB3.DEF ;�ÒþINNNNNNNNNNNNNNNNN¡¡¡þ6*;ANNNNNNNNNNNNNNNNNNNNN!ô¡¡¡û: EQU CPMSZ - (20 * KBYTE) ; CP/M BIAS VALUE CCP: EQU CPMBS + 3400H ;ADDR OF CCP BDOS: EQU CPMBS + 3C00H ;ADDRESS OF BDOS BIOvêþNNNNNNNNNNNNNNNNN¡¡¡þ60×ùNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ;============================================================================ ; MR_RNUM EQU 0 ;INTERIM DEFINITION FOR IN0…þINNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN8NNNNþ€Ë�š‚hƒ6„…Ñ…Ÿ†m‡;ˆ‰Ö‰¤Šr‹>Œ �Ú�¨Žv�D�‘á‘®’|“J”•啳–‚—P˜™ê™¹š‡›Uœ!�ï�½ž�ŸZ (¡ö¡Ä¢‘£_¤-¥û¥É¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ6ÖmNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûTERRUPT ROM SWAP ; SECSZ: EQU 128 NDRVS: EQU 6 IF BOOT = 10H ; ; 8" HARD DISK BOOT DATA ; STHD EQU 0 ;START LOGICAéRþNNNNNNNNNNNNNNNN¡¡¡þ6|ËNNNNNNNNNNNNNNNNNNNNNN¡¡¡û 1AH ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE THE TRANSLATION TABLE MACµLþ�NNNNNNNNNNNNNNNNN¡¡¡þ6 “NNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; PVERS MACRO #VERS DD DL #VERS IF DD > 9999 DB (DD / 10000) + '0dþìNNNNNNNNNNNNNNNNN¡¡¡þ6³|NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLDSK ;SELECT DISK DRIVE JP SETTRK ;SET TRACK # JP SETSEC ;SET SECTOR # JP SETDMA ;SET TRANSFER ADDR JP DISKRD ;PERF'3þ$NNNNNNNNNNNNNNNNN¡¡¡þ6\·NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûE IN BYTES BIOSST: DW BIOS ;BIOS MODULE LOAD ADDR FOR SBD ; ; CONTINUE ON WITH INIT ; INIT1: JR INIT ;#############¡ÀþäNNNNNNNNNNNNNNNN¡¡¡þ6öNNNNNNNNNNNNNNNNNNNNNN¡¡¡û;USE PAGE 0 FOR STACK ; ; INIT DEFAULT DRIVE ; LD A,(DK_BDRV) ;USE DRIVE # PASSED IN PAGE 0 AND A,3 LD (DEFDRV),A ; ª¡ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ6%ONNNNNNNNNNNNNNNNNNNNNN¡¡¡ûER **** ELSE DS DIRBF+SECSZ-$ ;FILL OUT DIRECTORY BUFFER TO 1 SECTOR SIZE ENDIF ;--------------------------------äùþNNNNNNNNNNNNNNNNN¡¡¡þ6+?@NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLL SELDSK LD A,L ;IF ERROR THEN ABORT OR A,H JR Z,WEROR ; ; READ BOOT DIRECTORY ; LD BC,DEFBFR ;SET XFER ADDRESSÍÕþHNNNNNNNNNNNNNNNNN¡¡¡þ6ƒ>NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL DRIVE OF HARD DISK NDHD EQU 3 ;LAST LOGICAL DRIVE OF HARD DISK ST8FD EQU 4 ;START LOGICAL DRIVE OF 8" FLOPPY ND8FD EQU 5 ÖþNNNNNNNNNNNNNNNN¡¡¡þ6lõNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; GXLATE MACRO #SECTORS, #SKEW LIST OFFdzþ·NNNNNNNNNNNNNNNN¡¡¡þ6ÆSNNNNNNNNNNNNNNNNNNNNNN¡¡¡û' DD DL DD % 10000 ENDIF IF DD > 999 DB (DD / 1000) + '0' DD DL DD % 1000 ENDIF DB (DD / 100) + '0' DB '.' :aþ¼NNNNNNNNNNNNNNNN¡¡¡þ6*ëNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûORM DISK READ JP DISKWR ;PERFORM DISK WRITE JP LISTST ;RETURN LIST STATUS JP SECTRN ;TRANSLATE SECTOR JP BIOFUNC ;EX8íþçNNNNNNNNNNNNNNNNN¡¡¡þ6 äNNNNNNNNNNNNNNNNNNNNNN¡¡¡û############################################################### ; ; DIRECTORY SECTOR BUFFER STARTS HERE AFTER CRUNCHING COLD S’Úþ“NNNNNNNNNNNNNNNNN¡¡¡þ6 ãºNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; SEND SYSTEM SIGN-ON ; CLOGO: LD HL,MSGSO CALL EDITOR ; ; MODIFY COLD START VECTOR TO WARM START ; LD HL,(BIOS+4) Jþ!NNNNNNNNNNNNNNN¡¡¡þ6&INNNNNNNNNNNNNNNNNNNNNN¡¡¡û-------------------------- ; ; WARM REBOOT ENTRY LOADS CCP,BDOS FROM DISK & ; SETS UP VARIABLES ; ;------------------------òâþ„NNNNNNNNNNNNNNNNN¡¡¡þ6,¦×NNNNNNNNNNNNNNNNNNNNNN¡¡¡û (USE DEFAULT BUFFER) CALL SETDMA ; LD BC,BD_SEC ;SET DIRECTORY SECTOR CALL SETSEC ; LD BC,0 ;SET TRACK TO 0 CALL S€'þþNNNNNNNNNNNNNNNNN¡¡¡þ6°NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;LAST LOGICAL DRIVE OF 8" FLOPPY ENDIF IF BOOT = 3 ; ; 8" FLOPPY BOOT DATA ; STHD EQU 2 ;START LOGICAL DRIVE OF §sþ�NNNNNNNNNNNNNNNNN¡¡¡þ6 _ÄNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û NXTSEC DL 1 ;;START WITH SECTOR 1 LOWEST DL 1 ;; REPT #SECTORS LIST ON DB NXTSEC LIST OFF NXTSEC DL NXTSEC + #SKEW’-þ$NNNNNNNNNNNNNNNN¡¡¡þ6õbNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DB ((DD % 100) / 10) + '0' DB (DD % 10) + '0' ENDM SUBTTL BIOS CODE ORG BIOS ;------------------------------------« þ9NNNNNNNNNNNNNNNNN¡¡¡þ6ÚNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûECUTE FUNCTION CALL ;############################################################################ ; ; THE FOLLOWING BOOT QþHNNNNNNNNNNNNNNNNN¡¡¡þ6:ÕNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTART ; CODE. THIS BUFFER IS USED BY THE CP/M DIRECTORY CHECK ROUTINES THAT ; CHECK FOR DISK CHANGE. ; ;###################žqþ$NNNNNNNNNNNNNNNNN¡¡¡þ6!ЋNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û LD (BIOS+1),HL ; ; BOOT CCP & BDOS ; JR WARM ;###################################################################Í-þrNNNNNNNNNNNNNNNN¡¡¡þ6'z-NNNNNNNNNNNNNNNNNNNNNN¡¡¡û---------------------------------- ; WARM: ; ; SET TEMPORARY STACK ; LD SP,DEFBFR IF INTRPTS ; ; SET INTERRUPT V„ þäNNNNNNNNNNNNNNNN¡¡¡þ6-•æNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûETTRK ; CALL DISKRD JR NZ,WEROR ; ; CHECK FOR VALID BOOT DIRECTORY ; LD A,(DEFBFR) CP A,86H JR C,WEROR ; ; S1ØþNNNNNNNNNNNNNNNNNN¡¡¡þ6)˜NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHARD DISK NDHD EQU 5 ;LAST LOGICAL DRIVE OF HARD DISK ST8FD EQU 0 ;START LOGICAL DRIVE OF 8" FLOPPY ND8FD EQU 1 ;LAST LOGIAqþ„NNNNNNNNNNNNNNNNN¡¡¡þ6 —NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ;ADD SKEW FACTOR ;; IF NXTSEC > #SECTORS ;CHECK FOR OVERFLOW NXTSEC DL NXTSEC - #SECTORS ;; IF NXTSEC <= LOWEST ;CHEæìþÉNNNNNNNNNNNNNNNN¡¡¡þ6æ/NNNNNNNNNNNNNNNNNNNNNN¡¡¡û---------------------------------------- ; ; BIOS JUMP VECTOR TABLE ; ;---------------------------------------------------òþNNNNNNNNNNNNNNNN¡¡¡þ6L‰NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûDATA MUST RESIDE AS DEFINED RIGHT BEFORE THE COLD ; INIT ROUTINE START AND MUST BE IN THE 1ST SECTOR. THESE 2 WORDS ARE ; REFETWþÈNNNNNNNNNNNNNNNNNN¡¡¡þ6£BNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û######################################################### ; DIRBF: EQU $ ;BUFFER BEGINNING ;----------------------------÷þ€NNNNNNNNNNNNNNNNN¡¡¡þ6"…ØNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û######### ; ; SIGN-ON MESSAGE ; ;############################################################################ ; MSGSO: DB �}þäNNNNNNNNNNNNNNNN¡¡¡þ6(jNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûECTOR TABLE BASE ; LD A,HIGH INTABL LD I,A ; ; SET INTERRUPT MODE TO 2 ; IM 2 ; ; ENABLE INTERRUPT VECTOR 7 ; –þäNNNNNNNNNNNNNNNN¡¡¡þ6.ÀµNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûET UP TO LOAD CCP/BDOS ; LD HL,(DEFBFR + BD_SBDSS) ;PREFETCH BDOS TRK/SECTOR PUSH HL ; LD HL,(DEFBFR + BD_SCCPS) ;FETCH ðþ'NNNNNNNNNNNNNNNNNN¡¡¡þ6©NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCAL DRIVE OF 8" FLOPPY ENDIF ;============================================================================ ; ; ASCII öäþ·NNNNNNNNNNNNNNNNN¡¡¡þ6 9¦NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûCK FOR REPEAT NXTSEC DL LOWEST + 1 LOWEST DL NXTSEC ENDIF ENDIF ;; ENDM LIST ON ENDM ;@@@@@@@@@@@@@@@@@@@@”âþNNNNNNNNNNNNNNNNN¡¡¡þ6ÕNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û------------------------- ; JP INIT1 ;COLD START ENTRY JP WARM ;RELOAD CCP/BDOS JP CNSCK ;GET CONSOLE STATUS JP CI ëlþaNNNNNNNNNNNNNNN¡¡¡þ6¸NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRENCED BY THE BOOT LOADER CODE IN ORDER TO DETERMINE THE LOAD ADDRESS ; AND LENGTH OF THE BIOS. ; ;##########################ï\þ9NNNNNNNNNNNNNNNN¡¡¡þ6�sNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û------------------------------------------------ ; ; INIT - COLD START ENTRY FROM BOOT MUST SET ALL BIOS PARAMS ; ;-----–ªþÓNNNNNNNNNNNNNNNNN¡¡¡þ6#¶éNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCR,LF DB CPMSZ / (KBYTE * 10) + '0' DB (CPMSZ MOD (KBYTE * 10)) / KBYTE + '0' DB 'K CP/M-80 Vers 2.2',CR,LF DB 'M5b CBIaþNNNNNNNNNNNNNNNNNN¡¡¡þ6)Y"NNNNNNNNNNNNNNNNNNNNNN¡¡¡û IN A,(M2_IMASK) AND A,7FH OUT (M2_IMASK),A ; ; FINALLY ENABLE VECTORED INTERRUPTS ; IN A,(M2_STAT) OR A,M2_IEN O €þ!NNNNNNNNNNNNNNN¡¡¡þ6/ó„NNNNNNNNNNNNNNNNNNNNNNð¡¡¡ûCCP TRK/SECTOR LD C,L LD B,0 CALL SETSEC ; LD C,H CALL SETTRK ; LD BC,CCP CALL SETDMA ; ; READ CCP/BDOS ; ”zþNNNNNNNNNNNNNNNN¡¡¡þ6OúNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCHARS ; ;============================================================================ ; LF: EQU 0AH CR: EQU 0DH CTRLZ: EQU<þ“NNNNNNNNNNNNNNNNN¡¡¡þ6  1NNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; INITIALIZE VERSION TEXT IN RAM MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@±·þ'NNNNNNNNNNNNNNNNN¡¡¡þ6€MNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û;CONSOLE INPUT JP COC ;CONSOLE OUTPUT JP LO ;PRINTER OUTPUT JP PUNCH JP READER JP HOME ;HOME SELECTED DRIVE JP SEEOþNNNNNNNNNNNNNNNN¡¡¡þ6o†NNNNNNNNNNNNNNNNNNNNNN¡¡¡û################################################## ; DB 0 ;Z80 CPU DB 0 ;SPARE BIOSSZ: DW BIOSND - BIOS ;BIOS MODULE SIZ [þäNNNNNNNNNNNNNNNNN¡¡¡þ6Å NNNNNNNNNNNNNNNNNNNNNN¡¡¡û----------------------------------------------------------------------- ; INIT: ; ; SET TEMPORARY STACK ; LD SP,DEFBFR ÜjþäNNNNNNNNNNNNNNNNN¡¡¡þ6$/~NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOS Vers ' PVERS VERSN DM CR,LF IF $ > (DIRBF + SECSZ) CONMSG **** WARNING! COLD INIT CODE BIGGER THAN DIR BUFFêÿÈNNNNNNNNNNNNNNNNN¡¡¡þ6* qNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûUT (M2_STAT),A EI ENDIF ; ; LOG ON DRIVE TO INIT TABLES ; LD A,(DK_BDRV) AND A,3 ;MODULO 4 LD C,A LD E,0 CA1þ�NNNNNNNNNNNNNNNNN¡¡¡þ60àÉNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûWREAD: CALL DISKRD JR NZ,WEROR ;IF ERROR THEN EXIT ; ; NEXT SECTOR ; LD HL,BTSEC INC (HL) ; LD DE,(IOPB + PB_BCNTOÎþ³NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN†NNNNNNNN�Ð�Ÿ‚mƒ;„ …×…¥†s‡@ˆ ‰Û‰©Šw‹DŒ�à�¯Ž}�L�‘é‘·’„“R” •핺–‰—W˜$™ñ™ÀšŽ›\œ)�÷�Æž”Ÿb 1¡ÿ¡Í¢›£j¤8¥¦Ô¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ7—éNNNNNNNNNNNNNNNNNNNNNN¡¡¡û) ;SECSZ ;DMA := DMA + SECTOR SIZE LD HL,(BTDMA) ADD HL,DE LD (BTDMA),HL ; ; IF NOT INTO BDOS THEN READ NEXT SECTOR ;¯?þHNNNNNNNNNNNNNNNN¡¡¡þ7=ONNNNNNNNNNNNNNNNNNNNNN¡¡¡ûWARM START IN PAGE 0 ; LD A,0C3H LD HL,BIOS + 3 LD (PAGE0),A LD (PAGE0 + 1),HL ; ; INIT BDOS CALL VECTOR IN PAGE 0 e¶ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ7 Ò„NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûK DRIVE ; LD A,18H ;UNCOND. JR (OFF) (CAUSES JUMP TO ILLEGAL) ; CLKON: LD (INHCLK),A ; ENDIF ; ; PASS DEFAULT DISKˆ&ÿ~NNNNNNNNNNNNNNNNN¡¡¡þ7òøNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûISK SECTOR ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; DõþNNNNNNNNNNNNNNNNN¡¡¡þ73NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRETURN 0 (ERROR) ; LD A,C CP A,NDRVS RET NC ; ; STORE DRIVE # FOR FUTURE USE ; LD (BTDRV),A ; ; SAVE LOGON REQõþ NNNNNNNNNNNNNNNN¡¡¡þ7·•NNNNNNNNNNNNNNNNNNNNNN¡¡¡û DRIVE TABLE PTR ; ; ATTEMPT TO READ ID SECTOR ; XOR A,A ;INIT FLAG BYTE UNTIL FIRMWARE REVISED LD (IOPB + PB_ST2O),A z?ÿçNNNNNNNNNNNNNNNNN¡¡¡þ7%]ËNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûVRTPTR) LD DE,DVRFLG ADD HL,DE EX DE,HL POP HL LD BC,DVRSIZ - DVRFLG LDIR ; ; RETURN DRIVE TABLE PTR ; LD HL,Ÿ•þ$NNNNNNNNNNNNNNNNN¡¡¡þ7+~ÄNNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************************************* ; HOME: LD BC,0 ; ; FALL INTO SET TRACK ; ;***************************÷þNNNNNNNNNNNNNNNNNN¡¡¡þ7ºNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD DE,BDOS XOR A,A SBC HL,DE JR C,WREAD ; ; ELSE IF AT BEGINNING OF BDOS THEN SET UP NEW TRACK & SECTOR ; JR Z,R ÿÂNNNNNNNNNNNNNNNN¡¡¡þ7-qNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; LD HL,BDOS + 6 LD (BDOSJV),A LD (BDOSJV + 1),HL ; ; INIT BIOS CALL VECTOR IN PAGE 0 ; LD HL,BIOFUNC LD (BFUNRS*%þ®NNNNNNNNNNNNNNNN¡¡¡þ7‡×NNNNNNNNNNNNNNNNNNNNNN¡¡¡û TO CCP ; LD A,(DEFDRV) LD C,A JP CCP SUBTTL BIOS DISK FUNCTION ROUTINES ;++++++++++++++++++++++++++++++++++++++++++£wþNNNNNNNNNNNNNNNN¡¡¡þ7koNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûISKWR: ; ; DISABLE UPLOAD (READ DATA) ; LD A,1 SHL PB_INHX LD (BTFLG),A ; ; ENABLE DOWNLOAD (WRITE DATA) ; LD HL_Îþ“NNNNNNNNNNNNNNNNN¡¡¡þ7H`NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûUEST FLAG ; LD A,E LD (LOGRQ),A ; ; COMPUTE DISK DRIVER TABLE PTR ; CALL RETDVRT ;DRIVE IS STILL IN C REGISTER LDTˆþINNNNNNNNNNNNNNNNN¡¡¡þ7 ¢>NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; CALL DISKLOG JP NZ,FDSKER ; ; IF NO ID SECTOR THEN USE DEFAULTS ; LD A,(IOPB + PB_ST2O) CP A,-2 ;0: NO ID, -1: Àýþ!NNNNNNNNNNNNNNN¡¡¡þ7&˜NNNNNNNNNNNNNNNNNNNNNN¡¡¡û(DTPTR) XOR A,A RET ; ; ; IF NOT HARD DISK THEN GO DO FLOPPY TEST ; LGDEF: LD A,(BTDRV) IF STHD <> 0 CP A,STHD PþNNNNNNNNNNNNNNNNN¡¡¡þ7,çSNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************* ; ; SET TRACK # ; ENTRY- BC= TRACK # ; ;*********************************þyNNNNNNNNNNNNNNNNN¡¡¡þ7ñ‹NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDBDOS ; ; ELSE IF NOT AT BIOS THEN READ NEXT SECTOR ; LD DE,BIOS - BDOS SBC HL,DE JP C,WREAD ; ; ELSE DONE READIN4¡þ�NNNNNNNNNNNNNNNNN¡¡¡þ7 @NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûV),A LD (BFUNRSV + 1),HL ; ; SET DEFAULT SECTOR BUFFER ; LD BC,DEFBFR CALL SETDMA ; IF INTCPTS ; ; PUT BDOS V†5þINNNNNNNNNNNNNNNN¡¡¡þ7´æNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++ ; ; READ A DISK SECTOR ; EXIT - A= 0: OK; /0: ERROR ; ;+++++++++++++++++++++++++++++++++² þNNNNNNNNNNNNNNNNNN¡¡¡þ7X^NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û,SECSZ LD (IOPB + PB_BCNTO),HL ; ; PASS WRITE COMMAND ; LD A,PB_WRITC ;SELECT WRITE OP JP DISKOP ;++++++++++++++ŸþNNNNNNNNNNNNNNNNN¡¡¡þ7{QNNNNNNNNNNNNNNNNNNNNNN¡¡¡û (DVRTPTR),HL ; ; PREFETCH DRIVER EXECUTION ADDRESS FROM TABLE ; LD E,(HL) ;STORE ADDRESS INC HL LD D,(HL) INC HL ˆ‚þHNNNNNNNNNNNNNNNNN¡¡¡þ7!‘NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûJADE ID, -2: EXTENDED ID JR NZ,LGDEF ; ; ELSE XFER ID SECTOR DATA TO TABLES ; CALL TRNONE ;ASSUME NO TRANSLATION ; ;YbþNNNNNNNNNNNNNNNN¡¡¡þ7';©NNNNNNNNNNNNNNNNNNNNNN¡¡¡û JR C,LGCKFD ENDIF CP A,NDHD + 1 JR NC,LGCKFD ; ; ELSE USE HARD DISK DEFAULTS ; CALL TRNONE ; NO XLATE LD HLœþ NNNNNNNNNNNNNNNN¡¡¡þ7-ÔbNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û******************************************* ; SETTRK: LD (BTTRK),BC RET ;********************************************àFþNNNNNNNNNNNNNNNNN¡¡¡þ7hNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûG SYSTEM ; JP WZRPG ; ; ; ELSE SET UP & READ BDOS ; RDBDOS: POP HL ;RESTORE BDOS TRK/SECTOR FROM DIRECTORY LD C,L ð2þBNNNNNNNNNNNNNNNNN¡¡¡þ7 KNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûECTOR INTO INTERCEPT CODE ; LD HL,(BDOS + 7) LD (BDOSV),HL ; ; NOW PUT INTERCEPT VECTOR INTO BDOS CODE ; LD HL,INTCPå þdNNNNNNNNNNNNNNNN¡¡¡þ7§«NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++ ; DISKRD: ; ; ENABLE UPLOAD (READ DATA) ; XOR A,A LD (BTFLG),A ; ; DI2§þINNNNNNNNNNNNNNNN¡¡¡þ7 NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SELECT DRIVE FUNCTION ; LOG-ON - SET DISK PARAMETER BLOCK ªuþ×NNNNNNNNNNNNNNNNNN¡¡¡þ7âÆNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD (DVRXADR),DE ; ; FETCH FLAGS ; LD C,(HL) ; ; COMPUTE DISK PARAMETER TABLE ADDRESS ; LD HL,(BTDRV) LD H,0 ÎÈþNNNNNNNNNNNNNNNNN¡¡¡þ7"Ä\NNNNNNNNNNNNNNNNNNNNNN¡¡¡û IF HARD DISK OR DOUBLE DENSITY THEN NO TRANSLATION ; LD A,(DEFBFR + ID_FLGO) AND A,[1 SHL DF_DTDB] OR [1 SHL DF_HARDB] ìþNNNNNNNNNNNNNNNN¡¡¡þ7(+—NNNNNNNNNNNNNNNNNNNNNN¡¡¡û,HDPBK ; ; XFER DATA TO TABLES ; SEL2: PUSH HL CALL DPBAD ; USE DEFAULT TABLE POP HL LD BC,DPBSZ LDIR JR SEL1 ÀXÿòNNNNNNNNNNNNNNNN¡¡¡þ7.�1NNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************** ; ; SET SECTOR ; ENTRY- BC= SECTOR # ; ;**************************************************R$þNNNNNNNNNNNNNNNNNNN¡¡¡þ7[-NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û LD B,A ;A STILL CONTAINS 0 CALL SETSEC ; LD C,H CALL SETTRK ; JR WREAD ; ; ; WARM BOOT ERROR, OUTPUT MSG & HALT þNNNNNNNNNNNNNNNNN¡¡¡þ7 x"NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûT LD (BDOS + 7),HL ; ; INITIALIZE CLOCK VECTORS IF CLOCK INSTALLED ; LD A,MF_CSYN ;TEST FOR BOARD PRESENT CALL XMROM PZþNNNNNNNNNNNNNNNNN¡¡¡þ7”šNNNNNNNNNNNNNNNNNNNNNNð¡¡¡ûSABLE DOWNLOAD (WRITE DATA) ; LD (IOPB + PB_BCNTO),A LD (IOPB + PB_BCNTO + 1),A ; ; PASS READ COMMAND ; LD A,PB_READžþ�NNNNNNNNNNNNNNNN¡¡¡þ7>¾þ$NNNNNNNNNNNNNNNNN¡¡¡þ7_,NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; SECTRN: ; ; IF NO TRANSLATION TH>ÙþäNNNNNNNNNNNNNNNNN¡¡¡þ7 |#NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR ; LD HL,DEFBFR LD (IOPB + PB_DMAO),HL CALL GETBNK LD (IOPB + PB_DMAXO),A ; ; SET DESCRIPTOR SECTOR SECTOR ; LDJÍþ NNNNNNNNNNNNNNNN¡¡¡þ7�›NNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡û+ PB_TRKO LD BC,PB_BCNTO - PB_TRKO LDIR ; DISKOP2: LD (IOPB + PB_CMDO),A ; ; FETCH DRIVER VECTOR & EXECUTE DISK DRIVŸ?þ NNNNNNNNNNNNNNNN¡¡¡þ7:=NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û;ECHO CHAR CALL COC POP AF ; AND A,5FH ;INSURE UPPER CASE ; ; IF RETRY THEN RETURN TO CALLER ; CP A,'R' ;IF RETRœþÄNNNNNNNNNNNNNNNNNN¡¡¡þ7ÕöNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û TR3740: LD DE,SDTRAN ; SETTR: LD HL,(DTPTR) LD (HL),E INC HL LD (HL),D RET ;***********************************•ÿñNNNNNNNNNNNNNNNNN¡¡¡þ7"ólNNNNNNNNNNNNNNNNNNNNNN¡¡¡û;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; HARD DISK DRIVER FUNCTION ; ENTRY- IY= DRIVÚrþ NNNNNNNNNNNNNNNN¡¡¡þ7(§NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE IOPB PRIMITIVE ; EXITcPþÉNNNNNNNNNNNNNNNN¡¡¡þ7.¶NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++ ; ; JADE 8" FLOPPY DISK DRIVER FUNCTION ; ENTRY- IY= DRIVER TABLE PTR ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++tçþ¹NNNNNNNNNNNNNNNNN¡¡¡þ7lNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEN RETURN SECTOR++ ; LD A,D ;IF TABLE ADDR = 0 THEN NO TRANSLATION OR A,E JP Z,NOTRAN ; ; ELSE CALCULATE NEW SECTOR F§bþNNNNNNNNNNNNNNNNN¡¡¡þ7 ONNNNNNNNNNNNNNNNNNNNNN¡¡¡û HL,ID_SECT LD (IOPB + PB_SECO),HL ; ; SET DESCRIPTOR SECTOR TRACK ; LD L,H ;H == 0 FROM LAST OPERATION (HL= 0) LD (¾XþäNNNNNNNNNNNNNNNNN¡¡¡þ7£ªNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûER ; DKOPLP: PUSH IY ;SAVE IY LD IY,(DVRTPTR) ;FETCH TABLE BASE ; LD HL,DKOPRET ;PUT RETURN ADDRESS ON STACK PUSH HL€ñþNNNNNNNNNNNNNNN¡¡¡þ7 NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûY 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 ; A«þ9NNNNNNNNNNNNNNNN¡¡¡þ7æÇNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û***************************************** ; ; SET NO SECTOR TRANSLATION PROCEDURE ; EXIT - HL, DE= ? ; ;*******************&ØÿóNNNNNNNNNNNNNNNNN¡¡¡þ7#À]NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûER TABLE PTR ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; BÆþNNNNNNNNNNNNNNNNNN¡¡¡þ7)/–NNNNNNNNNNNNNNNNNNNNNN¡¡¡û - A= 0: OK, /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; XPRIM: ; ; SET �þ'NNNNNNNNNNNNNNNN¡¡¡þ7/…0NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; FD8EXEC: ; ; CONVERT LOGICAL DRIVE TO PHYSICAL DRIVE ; Lù–þNNNNNNNNNNNNNNNNNN¡¡¡þ79NNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûROM 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 PHYS™çþÉNNNNNNNNNNNNNNNNN¡¡¡þ7 Ö…NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIOPB + PB_TRKO),HL ; ; ENABLE UPLOAD ; LD A,L ;L= 0 LD (IOPB + PB_FLGO),A ; ; DISABLE DOWNLOAD ; LD (IOPB + PB_¿þNNNNNNNNNNNNNNNNN¡¡¡þ7öùNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; LD HL,(DVRXADR) ;FETCH DRIVER ADDRESS PREFETCHED FROM TABLE JP (HL) ; ; DRIVER RETURNS HERE ; DKOPRET: POP IY ;MþNNNNNNNNNNNNNNNN¡¡¡þ72NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ELSE IF IGNORE THEN RETURN NO ERROR ; SUB A,'I' ;IF IGNORE THEN RETURN NO ERROR RET Z ; ; ELSE RETURN ERROR TO BD@ÞþÉNNNNNNNNNNNNNNNNN¡¡¡þ7³”NNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************************************************* ; TRNONE: LD DE,0 JR SETTR ;+++++++++++++++++++++++++++++++++ÜûþNNNNNNNNNNNNNNNNN¡¡¡þ7$YÊNNNNNNNNNNNNNNNNNNNNNN¡¡¡û HDEXEC: ; ; CONVERT LOGICAL DRIVE TO PHYSICAL DRIVE ; LD A,(IY + DVRPDRV) ;0,1: DRV 0, 2,3: DRV 1 LD (IOPB + PB_DRVO),eSþ�NNNNNNNNNNNNNNNNN¡¡¡þ7*zÅNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBANK ADDRESS TO THIS BANK FOR NOW ; CALL GETBNK LD E,A ;PRESET IOPB BANK LD (IOPB + PB_DMAXO),A ; ; EXECUTE THE PRIMëÚþ!NNNNNNNNNNNNNNNN¡¡¡þ70–}NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD A,(IY + DVRPDRV) LD (IOPB + PB_DRVO),A ; ; IF HEADS == 1 THEN EXECUTE IOPB ; LD A,(IY + DVRHDS) DEC A JP Z,XPRIM xóþ$NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN8NNNNNNNN�Ñ� ‚nƒ<„ …×…¥†s‡Aˆ‰Ý‰«Šy‹GŒ�ã�±Ž~�L�‘葵’ƒ“Q” •핺–‰—V˜#™ð™¾š‹›Yœ&�ô�ž‘Ÿ^ ,¡ú¡È¢•£c¤1¥ÿ¥Í¦žNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ8CNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; ELSE SELECT SIDE FROM TRACK BIT 0 ; LD HL,(IOPB + PB_TRKO) PUSH HL ;SAVE FOR ERROR RESTORE ; LD A,(IOPB + PB_S§þNNNNNNNNNNNNNNNN¡¡¡þ8é¡NNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡û 0: OK ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; BIOFUNC: ; ; IF FUNCTION # NOT RúþHNNNNNNNNNNNNNNNNN¡¡¡þ8 jNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSION # DW RETDVRTF ;1:RETURN DISK PHYSICAL CONFIGURATION TABLE PTR DW EXIOPB ;2:EXECUTE THE IOPB MAXFUNCS EQU ($ - BFUNTBLö þrNNNNNNNNNNNNNNNNN¡¡¡þ8&NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û#) ; RETDVRTF: LD C,E ; RETDVRT: LD HL,DVR0 ;START AT 1ST TABLE ; ; IF DRIVE == 0 THEN ALREADY THERE ; LD A,C I¶þNNNNNNNNNNNNNNNNN¡¡¡þ8ÉÝNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûXIOB ;MONITOR FUNCTION # (DISK FUNCTION) CALL XMROM ;EXECUTE MONITOR FUNCTION ; OR A,A ;FUNCTION ERROR? RET NZ ; ; µ•þINNNNNNNNNNNNNNNN¡¡¡þ8c{NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û LD A,MF_PHXB JP XMROM ;*************************************************************************** ; ; NEWLINE PROCEDUd˜þNNNNNNNNNNNNNNNNN¡¡¡þ8%‰%NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR MODIFIED BY WARM BOOT RTN ; ; THE FOLLOWING CONDITIONAL JUMP IS MODIFIED TO AN UNCONDITIONAL JUMP BY ; THE WARM BOOT ROUTaÈþHNNNNNNNNNNNNNNNNN¡¡¡þ8+ª*NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûA,A ;BC = HL = A = 0 LD L,A LD H,A LD C,A LD B,A RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++'uþHNNNNNNNNNNNNNNNNN¡¡¡þ8TNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûECO +1) ;FETCH SIDE SELECT BYTE ADD A,A ;SHIFT OUT BIT 7 ; SRL H ;SHIFT TRACK HIGH BYTE RR L ;ROTATE BIT 8 TO 7 AND¯£þNNNNNNNNNNNNNNNNNN¡¡¡þ8ùŸNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIN TABLE THEN RETURN -1 ; LD A,C CP A,MAXFUNCS LD A,-1 RET NC ; ; ELSE COMPUTE TABLE ENTRY ; PUSH HL ;SAVE POSSy™þ¯NNNNNNNNNNNNNNNN¡¡¡þ8S9NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û) / 2 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN BIOS VERSION # ; EXIT - Hy&ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ8¿�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOR A,A RET Z ; ; ELSE IF ILLEGAL DRIVE THEN RETURN ERROR ; CP A,NDRVS JR C,RETDV2 ; OR A,A RET ; ; ; ELSE C©|þdNNNNNNNNNNNNNNNNN¡¡¡þ8œŽNNNNNNNNNNNNNNNNNNNNN!ô¡¡¡ûFETCH & RETURN RESULT STATUS ; LD A,(IX + PB_STATO) OR A,A ;TEST RESULT FOR RETURN RET ;+++++++++++++++++++++++++++‹þ NNNNNNNNNNNNNNNNN¡¡¡þ8 vÐNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRE ; ;*************************************************************************** ; CRLF: LD C,CR CALL COC LD C,LF JP xØþ�NNNNNNNNNNNNNNNN¡¡¡þ8&ÜvNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûINE IF THE CLOCK/CALENDAR BOARD IS NOT PRESENT ; IF NOT MODIFIED, THEN IT IS ALLWAYS FALSE (NOP). ; INHCLK: JR C,ILLEGC ; ·<ÿÂNNNNNNNNNNNNNNNNN¡¡¡þ8,3½NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û++++++++++++++++++ ; ; CDOS RETURN VERSION FUNCTION ; MAKES CLOCK/CALENDAR WORK. ; EXIT - B= 1 ; ;+++++++++++++++++++++++W¦þNNNNNNNNNNNNNNNNN¡¡¡þ8%eNNNNNNNNNNNNNNNNNNNNNN¡¡¡û 0 TO CF RRA ;ROTATE TRACK BIT 0 INTO SECTOR BIT 15 LD (IOPB + PB_SECO +1),A ; LD (IOPB + PB_TRKO),HL ;STORE SHIFTED TvþNNNNNNNNNNNNNNNNN¡¡¡þ8 Ê®NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIBLE DATA ; LD HL,BFUNTBL LD A,C ADD A,A ADD A,L LD L,A LD A,0 ADC A,H LD H,A ; ; EXECUTE TABLE ADDRESS ; šþINNNNNNNNNNNNNNNN¡¡¡þ8`NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL= VERSION # IN BINARY {0.00,..655.35} ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; RETŒŠÿÂNNNNNNNNNNNNNNNNN¡¡¡þ8Œ°NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOMPUTE TABLE PTR ; RETDV2: LD B,C LD DE,DVRSIZ ; RETDVL: ADD HL,DE DJNZ RETDVL ; ; RETURN NO ERROR ; XOR A,A REt|þHNNNNNNNNNNNNNNNNN¡¡¡þ8¯¿NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++ ; ; GET BANK NUMBER FUNCTION ; EXIT - A= BANK # ; ;++++++++++++++++++++++µ‚þNNNNNNNNNNNNNNNNN¡¡¡þ8!EáNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûCOC IF INTCPTS SUBTTL ADDITIONAL FUNCTIONS TO SUPPORT CDOS PROGRAMS ;*************************************************`}þäNNNNNNNNNNNNNNNN¡¡¡þ8'ïGNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; NOW CHECK FOR EXTENDED CALLS ; CP A,8DH ;IF RETURN VERSION THEN RETURN IT JR Z,RETCVER ; CP A,90H ;IF NOT CLOCK THE†Wþ9NNNNNNNNNNNNNNNN¡¡¡þ8-ŒNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++ ; RETCVER: LD B,1 RET SUBTTL CLOCK ROUTINES ;++++++++++++++++++ºôþdNNNNNNNNNNNNNNNNN¡¡¡þ8¼òNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRACK ; ; EXECUTE THE IOPB ; CALL XPRIM ; ; RESTORE THE MODIFIED IOPB SO RETRY WILL WORK ; POP HL ;TRACK LD (IO}´ÿþNNNNNNNNNNNNNNNNNN¡¡¡þ8 ŸýNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û LD A,(HL) INC HL LD H,(HL) LD L,A ; EX (SP),HL ;PUT CALLER'S DATA IN HL, FUNCTION ADDR ON RET ; STACK, EXECUTE FÓÿòNNNNNNNNNNNNNNNN¡¡¡þ8sENNNNNNNNNNNNNNNNNNNNNN¡¡¡ûVERS: LD HL,VERSN XOR A,A ;RETURN NO ERROR RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++vRþNNNNNNNNNNNNNNNN¡¡¡þ8ÙãNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûT ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE IOPB FUNCTION ; ENTRY- IX= I~áþNNNNNNNNNNNNNNNNNN¡¡¡þ86(NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; GETBNK: LD A,MF_GBNK JP MR_FUN SUBTTL NON-DISK PROCEDURES xgþ�NNNNNNNNNNNNNNNN¡¡¡þ8"²NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************** ; ; SYSTEM CALL INTERCEPT ROUTINE CHECKS FOR ILLEGAL BDOS CALLS & ; PRINTS MESSAGE IF ILLEGAL. ALËþNNNNNNNNNNNNNNNN¡¡¡þ8(ÿyNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûN ERR JR C,ILLEGC ; JR Z,CLKCAL ;IF CALENDAR THEN GET IT ; CP A,92H JR Z,CLKTIM ;IF TIME THEN GET IT ; ; ILLEGAL SY=•þ NNNNNNNNNNNNNNNN¡¡¡þ8.UßNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN CALENDAR FUNCTION 90H ; EXIT - A= DAY ; B= MONTH ; ¯…þdNNNNNNNNNNNNNNNNN¡¡¡þ8�ÃNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûPB + PB_TRKO),HL ; LD HL,IOPB + PB_SECO +1 ;CLEAR BIT 15 RES 7,(HL) ; ; DONE ; RET SUBTTL BIOS FUNCTION CALLS rþ!NNNNNNNNNNNNNNNN¡¡¡þ8 ¬ÌNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUNCTION ADDRESS ON STACK ;############################################################################ ; ; BIOS FUNCTION .þNNNNNNNNNNNNNNNNN¡¡¡þ8@tNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û+++++++++ ; ; RETURN DRIVER TABLE PTR FUNCTION ; ENTRY- C= DRIVE # (E FOR FUNCTION CALL) ; EXIT - HL= DRIVER TABLE BASE PTR ®þNNNNNNNNNNNNNNNN¡¡¡þ8êÒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOPB PTR ; EXIT - A= 0: OK ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; EXIOPB: ; ; z÷þ'NNNNNNNNNNNNNNNNN¡¡¡þ8NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;**************************************************************************** ; ; OUTPUT HEX DATA TO CONSOLE SUBR ; ENTRY- A¿"ÿþNNNNNNNNNNNNNNNNN¡¡¡þ8##ƒNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûSO IMPLEMENTS CDOS CLOCK/CALENDAR ; SYSTEM CALLS FOR ASMB. ; ;**************************************************************oþHNNNNNNNNNNNNNNNNNN¡¡¡þ8)ÌHNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSTEM CALL ; ILLEGC: PUSH BC ;SAVE FUNCTION # ; ; OUTPUT WARNING MESSAGE ; LD HL,ISCMSG ;OUTPUT WARNING CALL EDITOR 8˜þNNNNNNNNNNNNNNNN¡¡¡þ8/fîNNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡ûC= YEAR ; L= DAY OF WEEK ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CLKCAL: LD A,KÄþ!NNNNNNNNNNNNNNNN¡¡¡þ8Ú�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; FUNCTION DISPATCHER ; EXIT - A= -1: ERROR,åYþNNNNNNNNNNNNNNNNN¡¡¡þ8 5[NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûTABLE ; ;############################################################################ ; BFUNTBL: DW RETVERS ;0:RETURN VER}âþNNNNNNNNNNNNNNNNN¡¡¡þ8'NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; A, C= 0 ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; BIOS CALL ENTRY (E= DRIVE ¨þNNNNNNNNNNNNNNNN¡¡¡þ8úìNNNNNNNNNNNNNNNNNNNNNN¡¡¡û SET UP FOR CALL ; CALL GETBNK ;E= IOPB PTR IS IN THIS BANK LD E,A PUSH IX ;MAKE HL = IX FOR NOW POP HL ; LD A,MF_±µþHNNNNNNNNNNNNNNNNN¡¡¡þ8PJNNNNNNNNNNNNNNNNNNNNNN¡¡¡û= DATA ; EXIT - A, C= ? ; ;**************************************************************************** ; PRHEX: LD C,A ¤Šþ¯NNNNNNNNNNNNNNNNN¡¡¡þ8$ºNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************* INTCPT: LD A,C ;CHECK CALL VALIDITY CP A,41 ;IF <= 40 THEN OK ; BDOSV EQU $ + 1 JP C,BDOS + 11H ;THIS ADDcOþ'NNNNNNNNNNNNNNNNN¡¡¡þ8*™NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ; OUTPUT FUNCTION # ; POP HL LD A,L CALL PRHEX ; ; OUTPUT NEW LINE ; CALL CRLF ; ; RETURN NULLS ; XOR ' þHNNNNNNNNNNNNNNNNN¡¡¡þ80u£NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûMF_GCAL JR XMROM ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN TIME FUNCTION4‡þNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN8NNNNþ€Ì�›‚iƒ7„…Ó…¡†o‡<ˆ ‰Ø‰¦Št‹AŒ�Þ�¬Žz�H�‘味’�“O”•ꕸ–‡—U˜#™ð™¾šŒ›Zœ(�ö�Äž’Ÿ_ -¡û¡É¢–£d¤2¥¦Ï¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ8t7NNNNNNNNNNNNNNNNNNNNNN¡¡¡û 92H ; EXIT - A= SECONDS ; B= MINUTES ; C= HOURS ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++°þ'NNNNNNNNNNNNNNNN¡¡¡þ8Þ‘NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CI: LD A,MF_CI JR XMROM ;+++++++++++++++++++ÞþNNNNNNNNNNNNNNNNN¡¡¡þ8 1ZNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; READER: LD A,CTRLZ ;FAKE EOF ; ; FALL INTO PUN¯gþŒNNNNNNNNNNNNNNNNN¡¡¡þ8&NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; LISTST: LD A,MF_LOS JR XMROM ;**********ØXþÉNNNNNNNNNNNNNNNNN¡¡¡þ8þíNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûN A,(M2_RSEL) LD (ROMSAV),A LD A,MR_RNUM OUT (M2_RSEL),A ; ; PRINT PROMPT ; LD HL,ITMSG IQCONT: LD A,MF_PUTS CºÌþÉNNNNNNNNNNNNNNNN¡¡¡þ8TKNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE POP BC POP HL POP AF JP 0008H ; ; ; ELSE RESTORE REGS & RETURN ; ITRAPR: LD A,(ROMSAV) ;RESTORE ROM # OUT (¢­þNNNNNNNNNNNNNNNNN¡¡¡þ8%¾NNNNNNNNNNNNNNNNNNNNNN¡¡¡û################ ; SDTRAN: GXLATE 26,6 ;############################################################################ ; ëKþNNNNNNNNNNNNNNNNN¡¡¡þ8+�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûVR0SPT DS 1 ;TRK 0 SECTORS PER TRK DVR0SZ DS 1 ;TRK 0 SECTOR SIZE DVR1SPT DS 1 DVR1SZ DS 1 DVRDSPT DS 1 DVRDSZ DS 1 DVRDTYc™þNNNNNNNNNNNNNNNNN¡¡¡þ8!dNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û+++++++ ; CLKTIM: LD A,MF_GTIM JR XMROM ENDIF ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++³#þNNNNNNNNNNNNNNNN¡¡¡þ8ίNNNNNNNNNNNNNNNNNNNNNNþ€¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN CONSOLE STATUS ; EXIT - A= 0: NOT READY ; FFH: CHAR]æþNNNNNNNNNNNNNNNN¡¡¡þ8d NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCH RETURN ; ;**************************************************************************** ; ; PUNCH DRIVER ; ENTRY- C= „šþ¼NNNNNNNNNNNNNNNN¡¡¡þ8ˆ±NNNNNNNNNNNNNNNNNNNNNN¡¡¡û****************************************************************** ; ; MESSAGE EDITOR ; ENTRY- HL= TEXT PTR (BIT 7= 1: TERMIN+¬þNNNNNNNNNNNNNNNNNN¡¡¡þ8«¾NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûALL MR_FUN ; LD HL,IQMSG ;QUERY USER LD A,MF_PUTS CALL MR_FUN ; ; GET & ECHO USER INPUT ; LD A,MF_CI CALL MR_FUNQPþNNNNNNNNNNNNNNNNN¡¡¡þ8 AàNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûM2_RSEL),A ; POP DE POP BC POP HL POP AF EI ;RE-ENABLE INTERRUPTS RET ;-------------------------------------šÆþœNNNNNNNNNNNNNNN¡¡¡þ8&ëFNNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡û; COMMON I/O PARAMETER BLOCK ; ;############################################################################ ; IOPB: REPT PB«’þrNNNNNNNNNNNNNNNNN¡¡¡þ8,�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûP DS 1 ;RESERVED FOR DISK TYPE DVRCYLS DS 2 ;DISK CYLINDERS DVRHDS DS 1 ;HEADS ; ; DEFINE THE STRUCTURE SIZE ; DVRSIZ DSŸyþÿNNNNNNNNNNNNNNNNN¡¡¡þ8UNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++ ; ; MONITOR ROM EXECUTER ; ENTRY- A= FUNCTION # ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++S½þNNNNNNNNNNNNNNNNN¡¡¡þ8 ýžNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û READY ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; CNSCK: LD A,MF_CIS JR XMROM ÄsþÉNNNNNNNNNNNNNNNN¡¡¡þ8W8NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûCHAR TO OUTPUT ; ;**************************************************************************** ; PUNCH: RET ;**********ˆªþœNNNNNNNNNNNNNNNNN¡¡¡þ8»€NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûATOR) ; EXIT - REGS= ? ; ;**************************************************************************** ; EDITOR: CALL GET�þNNNNNNNNNNNNNNNNN¡¡¡þ8˜�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; PUSH AF LD C,A LD A,MF_CO CALL MR_FUN POP AF ; ; IF OPTION IS CTRL-C THEN WARM BOOT ; CP A,3 ;IF CTRL-C TH¸þNNNNNNNNNNNNNNNNN¡¡¡þ8!rÑNNNNNNNNNNNNNNNNNNNNNN¡¡¡û--------------------------------------- ; ; UNSUPPORTED INTERRUPT ; ;-------------------------------------------------------|þäNNNNNNNNNNNNNNNN¡¡¡þ8'ØwNNNNNNNNNNNNNNNNNNNNNN¡¡¡û_SIZE LIST OFF DB 0 LIST ON ENDM ;############################################################################ ; ™`þrNNNNNNNNNNNNNNNN¡¡¡þ8-7¼NNNNNNNNNNNNNNNNNNNNNN¡¡¡û 0 ENDM ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; MACRO TO DEFINE THE DRIVER TA´)þgNNNNNNNNNNNNNNNNN¡¡¡þ8‹ÂNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++ ; XMROM: ; ; SWITCH TO LOCAL (LARGER) STACK ; LD (SPSAV),SP LD SP,LSTACK ; ; EXECUTE THE FUNCTIOaÙþ NNNNNNNNNNNNNNNNN¡¡¡þ8 ¨ÍNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;**************************************************************************** ; ; CONSOLE OUTPUT ; ENTRY- C= CHAR TO OUTPUTG{þÉNNNNNNNNNNNNNNNN¡¡¡þ8DuNNNNNNNNNNNNNNNNNNNNNN¡¡¡û****************************************************************** ; ; PRINTER DRIVER ; ENTRY- C= CHAR TO OUTPUT ; ;*******fØþNNNNNNNNNNNNNNNN¡¡¡þ8îÓNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBNK LD E,A LD A,MF_PUTS JR XMROM IF INTRPTS SUBTTL INTERRUPTS ;---------------------------------------------------sþNNNNNNNNNNNNNNNNNN¡¡¡þ8NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEN WARM BOOT JP Z,PAGE0 ; ; IF OPTION IS YES THEN WARM BOOT ; AND A,5FH ;IGNORE CASE ; CP A,'Y' JP Z,PAGE0 ; ; $�þäNNNNNNNNNNNNNNNNN¡¡¡þ8"'‚NNNNNNNNNNNNNNNNNNNNNN¡¡¡û--------------------- ; ILLINT: PUSH AF ;SAVE ALL 8080 REGS PUSH HL PUSH BC PUSH DE LD HL,ILLIM ;NOTIFY USER OF INT þNNNNNNNNNNNNNNNN¡¡¡þ8(ÈINNNNNNNNNNNNNNNNNNNNNN¡¡¡û; DISK DRIVER TABLES ; ;############################################################################ ; STRUCT 0 DVRADD DS ‚·þ NNNNNNNNNNNNNNNN¡¡¡þ8.bïNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûBLE RECORD ; ENTRY- #DADD= DRIVER ADDRESS ; #PD= PHYSICAL DRIVE # ; #FG= DRIVE FLAGS (IDFLGO) ; #S0= TRK 0 SPT ; #Z0= TòšþBNNNNNNNNNNNNNNNNN¡¡¡þ8¸óNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûN ; CALL MR_FUN ;EXECUTE MONITOR FUNCTION ; ; RESTORE THE STACK ; LD SP,(SPSAV) RET SUBTTL CHAR I/O ROUTINES 5ƒþ·NNNNNNNNNNNNNNNNN¡¡¡þ8 ›üNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ;**************************************************************************** ; COC: LD A,MF_CO JR XMROM ;++++++ÓýþNNNNNNNNNNNNNNNNN¡¡¡þ8wDNNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************************************************************* ; LO: LD A,MF_LO JR XMROM ;++++++++++++++++++++€XþNNNNNNNNNNNNNNNN¡¡¡þ8ÝâNNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------------- ; ; USER INTERRUPT ; ;----------------------------------------------------------------------------û\þ¼NNNNNNNNNNNNNNNN¡¡¡þ82)NNNNNNNNNNNNNNNNNNNNNN¡¡¡û IF OPTION IS INTERRUPT THEN EXECUTE RESTART 7 ; CP A,'I' JR NZ,ITRAP1 ; POP DE POP BC ;RESTORE REGS 1ST POP HL Ò&þHNNNNNNNNNNNNNNNNN¡¡¡þ8#³NNNNNNNNNNNNNNNNNNNNNN¡¡¡û JR IQCONT SUBTTL INITIALIZED DATA ;############################################################################ ; ; "Õþ¼NNNNNNNNNNNNNNNNN¡¡¡þ8)ûxNNNNNNNNNNNNNNNNNNNNNN¡¡¡û2 ;START ADDRESS OF DISK DRIVER DVRFG DS 1 ;FLAGS (BIT 0= 1: INHIBIT LOGON) DVRPDRV DS 1 ;PHYSICAL DRIVE ;DVRLDRV DS 1 ;LOGIC."þ!NNNNNNNNNNNNNNN¡¡¡þ8/QÞNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRK 0 SIZE ; #S1= TRK 1 SPT ; #Z1= TRK 1 SIZE ; #SD= DATA TRKS SPT ; #ZD= DATA TRKS SIZE ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@P.þÂNNNNNNNNNNNNNNNN¡¡¡þ8í NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CONSOLE INPUT ; EXIT - A= CHAR ; ;++++++·BþóNNNNNNNNNNNNNNNNN¡¡¡þ8 kNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; READER DRIVER - DUMMY ; EXIT - A= CTRL-Z ; ;++++NBþHNNNNNNNNNNNNNNNNN¡¡¡þ8"NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN LIST DEVICE STATUS ; EXIT - A= 0: BUSY, FFH:READY ; ;++oÞþ NNNNNNNNNNNNNNNN¡¡¡þ8ÍÜNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ITRAP: ; ; SAVE REGS FIRST ; PUSH AF PUSH HL PUSH BC PUSH DE ; ; SAVE CURRENT ROM & GET MONITOR ROM ; IæœþNNNNNNNNNNNNNNNNN¡¡¡þ8gzNNNNNNNNNNNNNNNNNNNNN!ô¡¡¡ûPOP AF JP 0038H ; ; ; IF OPTION IS MONITOR THEN EXECUTE MONITOR BREAKPOINT ; ITRAP1: CP A,'M' JR NZ,ITRAPR ; POP DåþäNNNNNNNNNNNNNNNNN¡¡¡þ8$�$NNNNNNNNNNNNNNNNNNNNNN¡¡¡û3740 SECTOR TRANSLATION TABLE ; **** CP/M SINGLE DENSITY **** ; ;############################################################PþNNNNNNNNNNNNNNNNN¡¡¡þ8*®+NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAL DRIVE {0..N-1} ; ; THE FOLLOWING MAY BE BROUGHT OFF DISK DESCRIPTOR OR FROM DEFAULT TABLES ; DVRFLG DS 1 ;DISK FLAGS Dƒ]þNNNNNNNNNNNNNNNNN¡¡¡þ80B“NNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ALLDRV MACRO #DADD,#PD,#FG,#S0,#Z0,#S1,#Z1,#SD,#ZD,#DT,#CY,#HD LIST ON ƒvþNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNnNNNNNNN�Ñ�Ÿ‚mƒ;„…Ö…¤†r‡?ˆ ‰Ú‰¨Šv‹BŒ�Þ�­Ž{�I�‘味’€“O”•ꕸ–‡—V˜#™ñ™Àš�›[œ)�ø�Æž•Ÿb 1¡ÿ¡Í¢›£i¤7¥¦Ó¦ÎNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ95³NNNNNNNNNNNNNNNNNNNNNN¡¡¡û DW #DADD ;DRIVER EXECUTION ADDR DB 0 ;LOGON INHIBIT FLAG (LOGON ENABLED) DB #PD ;MONITOR PHYSICAL DRIVE # DB #FG ;DIS®þINNNNNNNNNNNNNNNN¡¡¡þ9ŸNNNNNNNNNNNNNNNNNNNNNN¡¡¡û8EXEC,1,0,26,0,26,0,26,0,0,77,1 DVR2: ;C ALLDRV HDEXEC,4,60H,32,1,32,1,32,1,10H,256,4 DVR3: ;D ALLDRV HDEXEC,4,60H,32,1,32g™þ'NNNNNNNNNNNNNNNNN¡¡¡þ9 pÞNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ;PHYSICAL RECORD SHIFT FACTOR DB 0 ;PHYSICAL RECORD MASK DW 0 ;LOGICAL DRIVE SECTOR OFFSET ; ; DEFAULT DISK PHYSICAL ÌÑþNNNNNNNNNNNNNNNNN¡¡¡þ9P¢NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;CHECK SIZE (CKS) DW 2 ;TRACK OFFSET (OFF) DB 1 ;PHYSICAL RECORD SHIFT FACTOR (PSH) DB 1 ;PHYSICAL RECORD MASK (Pxþ“NNNNNNNNNNNNNNNNN¡¡¡þ9¿iNNNNNNNNNNNNNNNNNNNNNN¡¡¡û############################################### ; ; MESSAGES ; ;##########################################################†‡þNNNNNNNNNNNNNNNN¡¡¡þ9ÏNNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ALLDPH: MACRO #D LIST ON D#D(DD)DPH: ;DRIVE PARAMETER HE�þNNNNNNNNNNNNNNNNN¡¡¡þ9%ÿ‘NNNNNNNNNNNNNNNNNNNNNN¡¡¡û####################################################################### ; ; THE FOLLOWING DATA MUST RESIDE IN THIS ORDER TO M þNNNNNNNNNNNNNNNNN¡¡¡þ9+ÜžNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTOR OFFSET (ADD TO SECTOR) ; ROMSAV EQU 0048H ;DS 1 ;ROM SWAP SAVE OF ORIGINAL ROM SPSAV DS 2 ;USER SP SAVE WHILE USING LOCAL€›þNNNNNNNNNNNNNNNNN¡¡¡þ9`àNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûK FLAGS DB #S0,#Z0 ;T0 SECTORS, SIZE DB #S1,#Z1 ;T1 SECTORS, SIZE DB #SD,#ZD ;DATA TRKS SECTORS, SIZE DB #DT ;DISK TwqþNNNNNNNNNNNNNNNN¡¡¡þ9�+NNNNNNNNNNNNNNNNNNNNNN¡¡¡û,1,32,1,10H,256,4 DVR4: ;E ALLDRV HDEXEC,5,60H,32,1,32,1,32,1,10H,256,4 DVR5: ;F ALLDRV HDEXEC,5,60H,32,1,32,1,32,1,10H,25~hþgNNNNNNNNNNNNNNNN¡¡¡þ9%�NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûPARAMETERS ; DB 0 ;FLAGS DB 26,0,26,0,26,0 ;SECTORS PER TRACK, SECTOR SIZE (128) DB 0 ;TYPE DW 77 ;CYLS DB 1 ;HEAÜrÿÈNNNNNNNNNNNNNNNNN¡¡¡þ9É5NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRM) DW 0 ;LOGICAL DRIVE SECTOR OFFSET (SOF) ; ; ; DB 01100000B ;FLAGS 256 BPS, HARD, SSSD DB 32,1,32,1,32,1 ;32 SPT, 2?AþHNNNNNNNNNNNNNNNNN¡¡¡þ9ê:NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û################## ; MSGLE: DM CR,LF,'LOAD ERROR' ; DSKEB: DM CR,LF,'Abort, Ignore, Retry, (BDOS) - ' ; IF INTCPTS ISCÆ‹þNNNNNNNNNNNNNNNNN¡¡¡þ9 dNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûADER FOR DRIVE #D(DD) DW 0 ;;SECTOR TRAN TBL (OR 0 IF NO XLATE) DW 0 ;;SCRATCH AREA DW 0 ;;" DW 0 ;;" DW DIRBF ;;íþBNNNNNNNNNNNNNNN¡¡¡þ9&ªÂNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûMATCH THE IOPB DATA ; ;############################################################################ ; BTDRV: DS 1 ;DRIVE # Œ·þNNNNNNNNNNNNNNNNN¡¡¡þ9,E NNNNNNNNNNNNNNNNNNNNNN¡¡¡û STACK DS 64 ;LOCAL STACK (32 ENTRIES) LSTACK EQU $ ;###################################################################îþÿNNNNNNNNNNNNNNNNN¡¡¡þ9SÑNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûYPE DW #CY ;CYLS DB #HD ;HEADS ; LIST OFF ENDM IF BOOT = 10H DVR0: ;A ALLDRV HDEXEC,4,60H,32,1,32,1,32,1,10HGþNNNNNNNNNNNNNNNNN¡¡¡þ9 ¼NNNNNNNNNNNNNNNNNNNNNN¡¡¡û6,4 ENDIF LIST ON ;############################################################################ ; ; DEFAULT 8" FLOP¹˜þINNNNNNNNNNNNNNNN¡¡¡þ9¼NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûDS ;############################################################################ ; ; DEFAULT 8" HARD DISK PARAMETER BLOCK]ÙþNNNNNNNNNNNNNNNNN¡¡¡þ9úNNNNNNNNNNNNNNNNNNNNNN¡¡¡û56 BPS DB 10H ;TYPE DW 256 ;CYLS DB 4 ;HEADS ;####################################################################C¹þNNNNNNNNNNNNNNNNN¡¡¡þ9Ù NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûMSG: DM CR,LF,'ILL SYS CALL, #= ' ENDIF IF INTRPTS ITMSG DM CR,LF,'User' ILLIM DM CR,LF,'Ill.' IQMSG DM ' Int. Abort?¸NþINNNNNNNNNNNNNNNNN¡¡¡þ9!3UNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûDIRECTORY BUFFER PTR DW D#D(DD)DPB ;;DRIVE PARAMETER BLK PTR IF ((DD - 1) <= NDHD) AND ((DD - 1) >= STHD) DW 0 ;;NO CHE�þNNNNNNNNNNNNNNNN¡¡¡þ9'™óNNNNNNNNNNNNNNNNNNNNNNð¡¡¡ûBTTRK DS 2 ;TRACK # BTSEC DS 2 ;SECTOR # BTFLG DS 1 ;RESERVED FOR FLAGS BTDMA DS 2 ;DMA ADDRESS BTDMAX DS 1 ;DMA EXTENDED ADVrþrNNNNNNNNNNNNNNNN¡¡¡þ9-v8NNNNNNNNNNNNNNNNNNNNNN¡¡¡û######### ; ; DRIVE ALLOCATION AREAS ; ;############################################################################ ; ;]þ�NNNNNNNNNNNNNNNNN¡¡¡þ9ÊFNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û,256,4 DVR1: ;B ALLDRV HDEXEC,4,60H,32,1,32,1,32,1,10H,256,4 DVR2: ;C ALLDRV HDEXEC,5,60H,32,1,32,1,32,1,10H,256,4 DVR3: Êeþ9NNNNNNNNNNNNNNNNN¡¡¡þ9 éINNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPY DISK PARAMETER BLOCK ; IBM 3740 SINGLE DENSITY FORMAT ; ;#################################################################ûÈþdNNNNNNNNNNNNNNNN¡¡¡þ9ñNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ;############################################################################ ; HDPBK: DW 128 ;SECTORS PER TRACK (LOGICABÿÉNNNNNNNNNNNNNNNN¡¡¡þ9¯WNNNNNNNNNNNNNNNNNNNNN!ô¡¡¡û######## ; ; MODE 2 INTERRUPT VECTOR TABLE ; ;############################################################################ ÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ9@œNNNNNNNNNNNNNNNNNNNNNN¡¡¡û (Y/N/I/M) - ' ENDIF ;############################################################################ ; ; DRIVE PARAMETEw¢þNNNNNNNNNNNNNNNNN¡¡¡þ9"fNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûCKS ON HARD DISK ELSE DW D#D(DD)CHK ;;DRIVE DISK CHECKSUMS ARRAY PTR ENDIF DW D#D(DD)ALL ;;DRIVE CLUSTER ALLOCATION {7þNNNNNNNNNNNNNNNN¡¡¡þ9(‰ÍNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDRESS ;############################################################################ ; ; VARIABLES ; ;################³ŸþNNNNNNNNNNNNNNNN¡¡¡þ9.#kNNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; MACRO TO DEFINE THE DRIVE ALLOCATION & CHECKSˆþNNNNNNNNNNNNNNNNNNN¡¡¡þ9ùwNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û;D ALLDRV HDEXEC,5,60H,32,1,32,1,32,1,10H,256,4 DVR4: ;E ALLDRV FD8EXEC,0,0,26,0,26,0,26,0,0,77,1 DVR5: ;F ALLDRV FD8EXEºžþ!NNNNNNNNNNNNNNNN¡¡¡þ9 ÚxNNNNNNNNNNNNNNNNNNNNNN¡¡¡û########### ; SD8PBK: DW 26 ;SECTORS PER TRACK DB 3 ;BLOCK SHIFT FACTOR DB 7 ;BLOCK MASK DB 0 ;NULL MASK DW 242 ;9Œþ­NNNNNNNNNNNNNNNNN¡¡¡þ96ÀNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL) (SPT) DB 5 ;BLOCK SHIFT FACTOR (BSH) DB 31 ;BLOCK MASK (BLM) DB 1 ;NULL MASK (EXM) DW 1015 ;DISK SIZE (CLUST¢ÊþNNNNNNNNNNNNNNNN¡¡¡þ9œfNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ; START ON AN EVEN PAGE BOUNDARY ; IF $ AND 0FFH DS 100H - ($ AND 0FFH) ENDIF INTABL: REPT 7 ;1ST 7 ARE UNSUPPORy]þHNNNNNNNNNNNNNNNNN¡¡¡þ9s­NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR HEADER AREA ; 1 PER DRIVE ; ;############################################################################ ; ;@@@@@@@@@@@@œÊÿHNNNNNNNNNNNNNNNNN¡¡¡þ9#U7NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBIT MAP PTR LIST OFF ENDM ; ; DEFINE THE DATA ; DD DL 1 REPT NDRVS LIST OFF ALLDPH 0123456789ABCDEF DD DL DD + æwþNNNNNNNNNNNNNNNNNNN¡¡¡þ9)ºüNNNNNNNNNNNNNNNNNNNNNN¡¡¡û############################################################ ; DTPTR: DS 2 ;DRIVE TABLE PTR LOGRQ: DS 1 ;LOG ON REQUEST REG. í’þBNNNNNNNNNNNNNNN¡¡¡þ9/ZNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUMS AREA ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ALLDAL: MACRO #D LIST ON IFÆþNNNNNNNNNNNNNNNNN¡¡¡þ9¬$NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûC,1,0,26,0,26,0,26,0,0,77,1 ENDIF IF BOOT = 3 DVR0: ;A ALLDRV FD8EXEC,0,0,26,0,26,0,26,0,0,77,1 DVR1: ;B ALLDRV FD´þþNNNNNNNNNNNNNNNNN¡¡¡þ9 CïNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDISK SIZE -1 DW 63 ;DIRECTORY MAX DB 11000000B ;ALLOC 0 DB 0 ;ALLOC 1 DW 16 ;CHECK SIZE DW 2 ;TRACK OFFSET DB 0 }1þNNNNNNNNNNNNNNNNN¡¡¡þ9c“NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûERS -1) (DSM) DW 1152 / 2 ;DIRECTORY MAX (DRM) DB 0FFH ;ALLOCATION 0 (AL0) DB 10000000B ;ALLOCATION 1 (AL1) DW 0 ^þ NNNNNNNNNNNNNNNN¡¡¡þ9ŒXNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTED LIST OFF DW ILLINT LIST ON ENDM ; DW ITRAP ;INT 8 IS USER INTERRUPT ENDIF ;#############################*þNNNNNNNNNNNNNNNNN¡¡¡þ9&þNNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE A DISK PARAMETER TABLE MACRO ; ;@@@@@@@@@@@@@@Þþ NNNNNNNNNNNNNNNNN¡¡¡þ9$Ì NNNNNNNNNNNNNNNNNNNNNN¡¡¡û1 LIST ON ENDM ; ; LAST OF INITIALIZED CODE READ FROM DISK ; BIOSND EQU $ SUBTTL UNINITIALIZED DATA AREA ;##### þHNNNNNNNNNNNNNNNNN¡¡¡þ9*ï¯NNNNNNNNNNNNNNNNNNNNN!ô¡¡¡û DVRTPTR DS 2 ;DRIVE DRIVER TABLE BASE ADDRESS PTR DVRXADR DS 2 ;DRIVE DRIVER EXECUTION ADDRESS SECOFF DS 2 ;LOGICAL DRIVE SECú@þHNNNNNNNNNNNNNNNNN¡¡¡þ90NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ((DD - 1) >= STHD) AND ((DD - 1) <= NDHD) D#D(DD)ALL: DS 127 ;ALLOCATION BIT MAP FOR 8" HARD DRIVE #D(DD) ENDIF IF ((D¢ÙþHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNnNNNþ€Ì�›‚iƒ7„…Ô…¡†p‡=ˆ ‰Ù‰§Šv‹CŒ�Þ�¬Žy�H�‘æ‘´’‚“P”•땸–†—T˜"™ï™½š‹›Yœ&�õ�Þ‘Ÿ` /¡ý¡Ë¢™£g¤6¥¦Ð¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ9ƒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD - 1) >= ST8FD) AND ((DD - 1) <= ND8FD) D#D(DD)ALL: DS 57 ;ALLOCATION BIT MAP FOR 8" DRIVE #D(DD) D#D(DD)CHK DS 32 ;DIRECTƒþNNNNNNNNNNNNNNNN¡¡¡þ9¨%NNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡û ;EXM- EXTENT MASK ; DSM < 256 : 1K= 0, 2K= 1, 4K= 3, 8K= 7, 16K= 15 ; DSM > 255 : 2K= 0, 4K= 1, 8K= 3, 16K= 7 DPBDSM DîþNNNNNNNNNNNNNNNNN¡¡¡þ9 GîNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ADDITIONAL DISK PARTITIONING DATA FOR THE LOGICAL DRIVE SELECTION. ; PARTITIONING BY TRACKS ARE IMPLIMENTED THRU BDOS USING ?�þNNNNNNNNNNNNNNNNN¡¡¡þ9g’NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûABCDEF DD DL DD + 1 LIST ON ENDM IF (($ - 8000H) > 07700H) OR ($ < 8000H) CONMSG **** BIOS TOO BIG, USE MOVCPM & Óþ“NNNNNNNNNNNNNNNNN¡¡¡þ9ˆYNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûATA TABLE PTR ; PUSH IX LD IX,(CUR_DPB) ; ; READ_OPERATION_FLAG = TRUE (1) ; LD A,1 LD (READOP),A ; ; PRE-READÂ:ÿæNNNNNNNNNNNNNNNNNN¡¡¡þ9"ÿNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ; READ_OP_FLAG = FALSE ; XOR A,A LD (READOP),A ; ; SAVE WRITE TYPE ; LD A,C LD (WRTYPE),A ; ; IF 1ST WRIT±‰ÿÂNNNNNNNNNNNNNNNNN¡¡¡þ9%È¡NNNNNNNNNNNNNNNNNNNNNN¡¡¡û GET MONITOR PROM SUBR ; EXIT - A= ? ; ;**************************************************************************** GETMON:Alþ!NNNNNNNNNNNNNNNN¡¡¡þ9+ë®NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ;---------------------------------------------------------------------------- ITRAP: ; ; SAVE REGS FIRST ; PUSH AF f‹þ�NNNNNNNNNNNNNNNNN¡¡¡þ9WÐNNNNNNNNNNNNNNNNNNNNN!ô¡¡¡ûORY CHECKSUMS STORAGE (1 BYTE PER SECTOR) ENDIF LIST OFF ENDM ; ; RESERVE THE DATA SPACE ; DD DL 1 REPT NDRVS øÆþNNNNNNNNNNNNNNNN¡¡¡þ9¸NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS 2 ;DSM- DRIVE STORAGE SIZE (IN CLUSTERS) ; INT(((#_TRACKS - OFF) * SPT * BYTES PER SECTOR) / CLUSTER SIZE) -1 DPBDRM DS 2 0êþ·NNNNNNNNNNNNNNNN¡¡¡þ9½NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDPBOFF ABOVE. ; PARTITIONING BY HEADS ARE IMPLIMENTED BY USING THE FOLLOWING DATA. ; (HEAD BITS ARE INCLUDED IN SECTOR WORD lþ'NNNNNNNNNNNNNNNNN¡¡¡þ9þNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRE-ADJUST! **** ENDIF END Žþ§NNNNNNNNNNNNNNNNN¡¡¡þ9Ý NNNNNNNNNNNNNNNNNNNNNN¡¡¡û_OF_DATA_FLAG = TRUE ; LD (RSFLAG),A ; ; TREAT AS UNALLOCATED BLOCK ; LD A,WRUAL LD (WRTYPE),A ; JP RWOPER ;TO PíeÿòNNNNNNNNNNNNNNNNNN¡¡¡þ9 7TNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE TO UNALLOCATED (NEW, UNUSED) BLOCK THEN SET PARAMETERS ; CP A,WRUAL JP NZ,CHKUNA ; ; COUNT = NUMBER_OF_SECTORS_IN_BLOŠáÿÂNNNNNNNNNNNNNNNN¡¡¡þ9&�òNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD A,XMONROM OUT (ROMSEL),A RET ;**************************************************************************** ; ; ‘=þNNNNNNNNNNNNNNNNNN¡¡¡þ9,r9NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPUSH HL PUSH BC ; ; SAVE CURRENT ROM & GET MONITOR ROM ; IN A,(ROMSEL) LD (ROMSAV),A CALL GETMON ; ; PRINT PROMÿ²þNNNNNNNNNNNNNNN¡¡¡þ9dáNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLIST OFF ALLDAL 0123456789ABCDEF DD DL DD + 1 LIST ON ENDM ;########################################################ŽxþNNNNNNNNNNNNNNNNN¡¡¡þ9 ‹*NNNNNNNNNNNNNNNNNNNNNN¡¡¡û;DRM- DIRECTORY SIZE -1 DPBAL0 DS 2 ;AL0,1- DIRECTORY ALLOCATION ; 1 MSB PER DIRECTORY CLUSTER ALLOCATED DPBCKS DS 2 ;CKS-'þNNNNNNNNNNNNNNNN¡¡¡þ9!ŒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUPPER BITS) ; DPBSOF DS 2 ;SOF- SECTOR OFFSET (FOR LOGICAL DRIVE) ; 0: NONE, 1..65535: OFFSET DPBSZ DS 0 ENDM ; ; ;@À�þNNNNNNNNNNNNNNNNN¡¡¡þ9Í4NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ SECTRAN: LD H,B LD L,C INC HL RET ;*******éYþNNNNNNNNNNNNNNNNN¡¡¡þ9î;NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûERFORM THE READ ;**************************************************************************** ; ; THE WRITE ENTRY POINT T§ÿäNNNNNNNNNNNNNNNNNN¡¡¡þ9!eNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN LIST DEVICE STATUS ; EXIT - A= 0: B�ºþNNNNNNNNNNNNNNNN¡¡¡þ9'®ÃNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûMESSAGE EDITOR ; ENTRY- HL= TEXT PTR (BIT 7= 1: TERMINATOR) ; EXIT - REGS= ? ; ;********************************************”}þrNNNNNNNNNNNNNNNNN¡¡¡þ9-ANNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPT ; LD HL,ITMSG IQCONT: CALL EDITOR ; LD HL,IQMSG ;QUERY USER CALL EDITOR ; CALL CI ;GET USER OPTION ; ; IF OP¿VþNNNNNNNNNNNNNNNNN¡¡¡þ9ývNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û#################### ; ; RESERVE DRIVE PARAMETER BLOCKS ; ;###############################################################nùþNNNNNNNNNNNNNNNNN¡¡¡þ9 ÞyNNNNNNNNNNNNNNNNNNNNNN¡¡¡û # DIRECTORY SECTORS CHECKED ; (DRM +1) / 4 DPBOFF DS 2 ;OFF- # RESERVED TRACKS (USUALLY 2) ; ; ADDITIONAL CP/M 3.0 DATË®þNNNNNNNNNNNNNNNN¡¡¡þ92ÁNNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE THE DPB FOR DRIVE MACRO ; ;@@@@@@@@‹óþäNNNNNNNNNNNNNNNN¡¡¡þ9˜gNNNNNNNNNNNNNNNNNNNNN!ô¡¡¡û********************************************** ;* * ;* THE READ ENTRY POINT [ûþrNNNNNNNNNNNNNNNNN¡¡¡þ9w¬NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAKES THE PLACE OF THE PREVIOUS BIOS DEFINTION ; FOR WRITE. ; ENTRY- C= WRITE TYPE: ; 0: WRITE TO ALLOCATED BLOCK (UPDATE) Eóþ NNNNNNNNNNNNNNNN¡¡¡þ9"Q6NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUSY, FFH:READY ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ LISTST: IF USEMON CALL G£Oþ$NNNNNNNNNNNNNNNNN¡¡¡þ9(¾ýNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û******************************** EDITOR: LD C,(HL) ;MESSAGE EDIT LOOP PUSH HL ;SAVE PTR RES 7,C ;CLEAR BIT 7 FOR OUTPUT O^þ!NNNNNNNNNNNNNNNN¡¡¡þ9.[NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTION 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 ; AÕLþNNNNNNNNNNNNNNNNN¡¡¡þ9ÎGNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û############# ; STRUCT 0 DPBSPT DS 2 ;SPT- SECTORS/TRACK DPBBSH DS 1 ;BSH- BLOCK SHIFT FACTOR DETERMINED BY CLUSTER SIZE 4Ðþ$NNNNNNNNNNNNNNNNN¡¡¡þ9 íHNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA (ALSO COULD BE USED BY CP/M 2.2 DEBLOCKING) ; DPBPSH DS 1 ;PSH- PHYSICAL RECORD SHIFT FACTOR BASED ON BYTES/SEC ; 0: 128A»þ³NNNNNNNNNNNNNNNNN¡¡¡þ9ðNNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ALLDPB: MACRO #D LIST ON D#D(DD)DPB: DS DPBSZ ;ALLO%�þNNNNNNNNNNNNNNN¡¡¡þ9«VNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTAKES THE PLACE OF * ;* THE PREVIOUS BIOS DEFINTION FOR READ. * ;* ®†ÿ!NNNNNNNNNNNNNNNNN¡¡¡þ9D�NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û; 1: WRITE TO DIRECTORY BLOCK (ALLWAYS WRITE) ; 2: WRITE TO UNALLOCATED BLOCK (NO NEED TO PRE-READ) ; ;******************I þ'NNNNNNNNNNNNNNNNN¡¡¡þ9#bNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûETMON JP 0F827H ELSE IN A,(CENTS) ;IF BUSY THEN RETURN 0 CPL ;INVERT THE SENSE AND A,1 SHL CENTBSY RET Z LD 2þBNNNNNNNNNNNNNNNN¡¡¡þ9)�ÌNNNNNNNNNNNNNNNNNNNNNN¡¡¡û CALL COC ; POP HL BIT 7,(HL) ;IF BIT 7 SET THEN RETURN RET NZ ; INC HL ;ELSE PRINT NEXT CHAR JR EDITOR IF I#`þ“NNNNNNNNNNNNNNNNN¡¡¡þ9/'jNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûND A,5FH ;IGNORE CASE ; CP A,'Y' JP Z,PAGE0 ; ; IF OPTION IS INTERRUPT THEN EXECUTE RESTART 7 ; CP A,'I' JR NZ,ITMõþ÷NNNNNNNNNNNNNNNNNN¡¡¡þ9›NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; 1K= 3, 2K= 4, 4K= 5, 8K= 6, 16K= 7 DPBBLM DS 1 ;BLM- BLOCK MASK ; 1K = 7, 2K= 15, 4K= 31, 8K= 63, 16K= 127 DPBEXM DS 1ÐÄþNNNNNNNNNNNNNNNNN¡¡¡þ9 tßNNNNNNNNNNNNNNNNNNNNNN¡¡¡û, 1: 256, 2: 512, 3: 1024 DPBPHM DS 1 ;PHM- PHYSICAL RECORD MASK BASED ON BYTES/SEC ; 0: 128, 1: 256, 3: 512, 7: 1024 ; ;SfþNNNNNNNNNNNNNNNNN¡¡¡þ9T£NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCATION FOR DRIVE #D(DD) LIST OFF ENDM ; ; RESERVE THE DATA SPACE ; DD DL 1 REPT NDRVS LIST OFF ALLDPB 0123456789¡þ NNNNNNNNNNNNNNNN¡¡¡þ9»hNNNNNNNNNNNNNNNNNNNNNN¡¡¡û * ;* READ THE SELECTED CP/M SECTOR * ;***************************************************** READ: ; ; SET UP D,>ÿÂNNNNNNNNNNNNNNNNN¡¡¡þ9ÎNNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************************************************** WRITE: ; ; SET PTR TO DISK DATA ; PUSH IX LD IX,(CUR_DPB) †¥ÿóNNNNNNNNNNNNNNNNNN¡¡¡þ9$û�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA,0FFH ;ELSE RETURN -1 RET ENDIF ;**************************************************************************** ; ;š¶þœNNNNNNNNNNNNNNNN¡¡¡þ9*ØŸNNNNNNNNNNNNNNNNNNNNN!ö¡¡¡ûNTRPTS SUBTTL INTERRUPTS ;---------------------------------------------------------------------------- ; ; USER INTERRUPT `pþNNNNNNNNNNNNNNNN¡¡¡þ904'NNNNNNNNNNNNNNNNNNNNNNð¡¡¡ûRAP1 ; POP BC ;RESTORE REGS 1ST POP HL POP AF JP 0038H ; ; IF OPTION IS MONITOR THEN EXECUTE MONITOR TRAP ; ITRA‹¦þNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN^NNNNNNN�Ï�ž‚lƒ:„…Ö…¤†s‡Aˆ‰Ü‰ªŠx‹FŒ�ã�±Ž�N�‘é‘·’†“T”"•𕾖Œ—Y˜'™ô™Âš‘›_œ-�û�Èž–Ÿd 2¡ÿ¡Ì¢š£h¤5¥¦Ñ¦ÎNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ:®oNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûP1: CP A,'M' JR NZ,ITRAPR ; POP BC POP HL POP AF JP 0F824H ; ; ELSE RESTORE REGS & RETURN ; ITRAPR: LD A,(ROM·�þNNNNNNNNNNNNNNNN¡¡¡þ:ÉNNNNNNNNNNNNNNNNNNNNNN¡¡¡û#################### SDTRAN: GXLATE 26,6 ; DB 1,7,13,19,25,5,11,17,23,3,9,15 ; DB 21,2,8,14,20,26,6,12,18,24,4,10 ; DB 16,]DþNNNNNNNNNNNNNNNNNN¡¡¡þ: ëNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDS 1 ;TRK 0 SECTORS PER TRK DVR0SZ DS 1 ;TRK 0 SECTOR SIZE DVR1SPT DS 1 DVR1SZ DS 1 DVRDSPT DS 1 DVRDSZ DS 1 DVRSIZ DS 0 bþNNNNNNNNNNNNNNNN¡¡¡þ:Ë~NNNNNNNNNNNNNNNNNNNNNN¡¡¡û,1 ALLDRV HDEXEC,5,60H,64,1,64,1,64,1 ALLDRV HDEXEC,5,60H,64,1,64,1,64,1 ALLDRV FD5EXEC,8,0,16,0,16,0,16,0 ALLDRV FD5EXEýrþNNNNNNNNNNNNNNNN¡¡¡þ:$µNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDB 3 ;BLOCK SHIFT FACTOR DB 7 ;BLOCK MASK DB 0 ;NULL MASK DW 242 ;DISK SIZE -1 DW 63 ;DIRECTORY MAX DB 11000000B °5þ¹NNNNNNNNNNNNNNNN¡¡¡þ:ŽNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DW 3 ;TRACK OFFSET ; ; DEFAULT DISK PHYSICAL PARAMETERS ; DB 0 ;FLAGS DB 16,0,16,0,16,0 ;SECTORS PER TRACK, SECTORƒ«þNNNNNNNNNNNNNNNNN¡¡¡þ:%dMNNNNNNNNNNNNNNNNNNNNNN¡¡¡û;64 SPT, 256 BPS ;############################################################################ ; ; MODE 2 INTERRUPT VECTOv7þINNNNNNNNNNNNNNNNN¡¡¡þ:+GBNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSCMSG: DM CR,LF,'ILL SYS CALL',CR,LF ENDIF IF INTRPTS ITMSG DM CR,LF,'User' ILLIM DM CR,LF,'Ill.' IQMSG DM ' Int. Abo%˜þNNNNNNNNNNNNNNNNNN¡¡¡þ:û§þ9NNNNNNNNNNNNNNNN¡¡¡þ;RNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û0) + '0' DD DL DD % 10000 ENDIF IF DD > 999 DB (DD / 1000) + '0' DD DL DD % 1000 ENDIF DB (DD / 100) + '0' DjýþINNNNNNNNNNNNNNNNN¡¡¡þ;ø§NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPERFORM DISK READ JP DISKWR ;PERFORM DISK WRITE JP LISTST ;RETURN LIST STATUS JP SECTRN ;TRANSLATE SECTOR JP BIOFUNC õþ„NNNNNNNNNNNNNNNN¡¡¡þ;%ùNNNNNNNNNNNNNNNNNNNNNN¡¡¡û##################### ; ; DIRECTORY SECTOR BUFFER STARTS HERE AFTER CRUNCHING COLD START ; CODE. THIS BUFFER IS USED BY THE ÎoþHNNNNNNNNNNNNNNNNN¡¡¡þ;+1öNNNNNNNNNNNNNNNNNNNNNN¡¡¡û,A ; ; INIT DEBLOCKING DATA ; XOR A,A ;ASSUME NO DATA IN BUFFER LD (HST_ACT),A ; LD (UNA_CNT),A ;CLEAR UNALLOCATED WäþNNNNNNNNNNNNNNNN¡¡¡þ;�ˆNNNNNNNNNNNNNNNNNNNNNN¡¡¡û======================== LIST OFF *INCLUDE JDDCONT.DEF *INCLUDE COMIOPB.DEF *INCLUDE DISKS.DEF *INCLUDE MONBOARD.DEF *INC¶3þ$NNNNNNNNNNNNNNNNN¡¡¡þ;bCNNNNNNNNNNNNNNNNNNNNNN¡¡¡û 0 LOCATIONS ; PAGE0: EQU 0 ;START OF CP/M RAM IOBYTE: EQU PAGE0 + 3 ;IOBYTE ADDR DEFDRV: EQU PAGE0 + 4 ;DEFAULT DRIVE PARA²þ“NNNNNNNNNNNNNNNN¡¡¡þ;ÈåNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPY ND8FD EQU 5 ;LAST LOGICAL DRIVE OF 8" FLOPPY ENDIF IF BOOT = 3 ; ; 8" FLOPPY BOOT DATA ; STHD EQU 2 ;START L„þþNNNNNNNNNNNNNNNN¡¡¡þ;$]NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LIST OFF NXTSEC DL 1 ;;START WITH SECTOR 1 LOWEST DL 1 ;; REPT #SECTORS LIST ON DB NXTSEC LIST OFF NXTSEC DL NXTS¼IþœNNNNNNNNNNNNNNNN¡¡¡þ;RNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûB '.' DB ((DD % 100) / 10) + '0' DB (DD % 10) + '0' ENDM SUBTTL BIOS CODE ORG BIOS ;-----------------------------Ê„þrNNNNNNNNNNNNNNNNN¡¡¡þ; í NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ;EXECUTE FUNCTION CALL ;############################################################################ ; ; THESE BOOT PARA =ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ;&GªNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûCP/M DIRECTORY CHECK ROUTINES THAT ; CHECK FOR DISK CHANGE. ; ;#############################################################š+ÿÂNNNNNNNNNNNNNNNN¡¡¡þ;,¨aNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSECTOR COUNT ; ; SEND SYSTEM SIGN-ON ; CLOGO: LD HL,MSGSO CALL EDITOR ; ; MODIFY COLD START VECTOR TO WARM START ; 4ìÿÂNNNNNNNNNNNNNNNN¡¡¡þ;¾¹NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLUDE ZMONROM.DEF *INCLUDE DKBTROM.DEF *INCLUDE NAKEDT.DEF *INCLUDE ISHA.DEF *INCLUDE CLOKROM.DEF LIST ON ;===========Þ&þ NNNNNNNNNNNNNNNNN¡¡¡þ; QrNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûM ADDR BDOSJV EQU PAGE0 + 5 ;BDOS SYSTEM CALL ENTRY DEFBFR EQU PAGE0 + 80H ;DEFAULT BUFFER ; ; BIOS FUNCTION CALL RESTART f‹þ'NNNNNNNNNNNNNNNNN¡¡¡þ;ûÔNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOGICAL DRIVE OF HARD DISK NDHD EQU 5 ;LAST LOGICAL DRIVE OF HARD DISK ST8FD EQU 0 ;START LOGICAL DRIVE OF 8" FLOPPY ND8FD E·þBNNNNNNNNNNNNNNNN¡¡¡þ;lNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûEC + #SKEW ;ADD SKEW FACTOR ;; IF NXTSEC > #SECTORS ;CHECK FOR OVERFLOW NXTSEC DL NXTSEC - #SECTORS ;; IF NXTSEC <= LÁ”þNNNNNNNNNNNNNNNNNN¡¡¡þ;4cNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û----------------------------------------------- ; ; BIOS JUMP VECTOR TABLE ; ;--------------------------------------------êÝþ'NNNNNNNNNNNNNNNNN¡¡¡þ;!Þ=NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûMS MUST RESIDE AS DEFINED RIGHT BEFORE THE COLD INIT ; ROUTINE START AND MUST BE IN THE 1ST SECTOR. THESE 2 WORDS ARE REFERENC=²þNNNNNNNNNNNNNNNNN¡¡¡þ;'t›NNNNNNNNNNNNNNNNNNNNNN¡¡¡û############### DIRBF: EQU $ ;BUFFER BEGINNING ;-------------------------------------------------------------------------ó‡þ“NNNNNNNNNNNNNNNN¡¡¡þ;-›PNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD HL,(BIOS+4) LD (BIOS+1),HL ; ; BOOT CCP & BDOS ; JR WARM ;###################################################´çþ9NNNNNNNNNNNNNNNN¡¡¡þ;'.NNNNNNNNNNNNNNNNNNNNNN¡¡¡û================================================================= ; ; DISK OPERATING SYSTEM ADDRESSES ; ;=================ªaþœNNNNNNNNNNNNNNNN¡¡¡þ; !NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûVECTOR ; BFUNRST EQU 28H BFUNRSV EQU PAGE0 + BFUNRST BFUNRSI EQU 0C7H + BFUNRST ; TPA: EQU 100H ;====================-¥ÿÂNNNNNNNNNNNNNNNNN¡¡¡þ;è™NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûQU 1 ;LAST LOGICAL DRIVE OF 8" FLOPPY ENDIF ;=========================================================================pŒÿÂNNNNNNNNNNNNNNNN¡¡¡þ;B?NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOWEST ;CHECK FOR REPEAT NXTSEC DL LOWEST + 1 LOWEST DL NXTSEC ENDIF ENDIF ;; ENDM LIST ON ENDM ;@@@@@@@@@@Çþ“NNNNNNNNNNNNNNNNN¡¡¡þ;­ôNNNNNNNNNNNNNNNNNNNNNN¡¡¡û-------------------------------- JP INIT1 ;COLD START ENTRY JP WARM ;RELOAD CCP/BDOS JP CNSCK ;GET CONSOLE STATUS JP >åþNNNNNNNNNNNNNNNN¡¡¡þ;"‹nNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûED ; BY THE BOOT CODE IN ORDER TO FIND THE LOAD ADDRESS FOR THE BIOS & IT'S ; LENGTH. ; ;#################################bÛþ NNNNNNNNNNNNNNNNN¡¡¡þ;(d¥NNNNNNNNNNNNNNNNNNNNNN¡¡¡û--- ; ; INIT - COLD START ENTRY FROM BOOT MUST SET ALL BIOS PARAMS ; ;--------------------------------------------------5 þNNNNNNNNNNNNNNNNN¡¡¡þ;.ÎNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û######################### ; ; SIGN-ON MESSAGE ; ;###########################################################################GþÉNNNNNNNNNNNNNNNNN¡¡¡þ;NNNNNNNNNNNNNNNNNNNNNN¡¡¡û=========================================================== OP_SYS EQU 2 ;CP/M VERSION ; NKSYS: EQU 60 ;SYSTEM SIZE IN K BY8ØÿÈNNNNNNNNNNNNNNNNN¡¡¡þ; 7NNNNNNNNNNNNNNNNNNNNNN¡¡¡û======================================================== ; ; OTHER DECLARATIONS ; ;=========================================p„þ NNNNNNNNNNNNNNNNN¡¡¡þ;Û¨NNNNNNNNNNNNNNNNNNNNNN¡¡¡û=== ; ; ASCII CHARS ; ;============================================================================ LF: EQU 0AH CR: EQU 0Dø?þœNNNNNNNNNNNNNNNN¡¡¡þ;qNNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; INITIALIZE VERSION TEXT IN RAM MACRO ; ;@@@@@@@@@@@@@‚þ9NNNNNNNNNNNNNNNN¡¡¡þ;žÅNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCI ;CONSOLE INPUT JP COC ;CONSOLE OUTPUT JP LO ;PRINTER OUTPUT JP PUNCH JP READER JP HOME ;HOME SELECTED DRIVE Jf|þNNNNNNNNNNNNNNNNNN¡¡¡þ;#¸_NNNNNNNNNNNNNNNNNNNNNN¡¡¡û########################################### BIOSSZ: DW BIOSND - BIOS ;BIOS MODULE SIZE IN BYTES BIOSST: DW BIOS ;BIOS MODULE  þÉNNNNNNNNNNNNNNNNN¡¡¡þ;)W”NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û-------------------------- INIT: ; ; SET TEMPORARY STACK ; LD SP,DEFBFR ;USE PAGE 0 FOR STACK ; ; MAKE SURE ROM IS EbõÿINNNNNNNNNNNNNNNNN¡¡¡þ;/ý2NNNNNNNNNNNNNNNNNNNNNN¡¡¡û# MSGSO: DB CR,LF DB CPMSZ / (KBYTE * 10) + '0' DB (CPMSZ MOD (KBYTE * 10)) / KBYTE + '0' DB 'K CP/M-80 Vers 2.2',CR,LF yþNNNNNNNNNNNNNNNN¡¡¡þ;ALNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûTES KBYTE: EQU 1024 CPMSZ: EQU KBYTE * NKSYS CPMBS: EQU CPMSZ - (20 * KBYTE) ; CP/M BIAS VALUE CCP: EQU CPMBS + 3400H ;ADDR œþ!NNNNNNNNNNNNNNNN¡¡¡þ; ®‡NNNNNNNNNNNNNNNNNNNNNN¡¡¡û=================================== SECSZ: EQU 128 NDRVS: EQU 6 IF BOOT = 10H ; ; 8" HARD DISK BOOT DATA ; STHD EQU O¨þNNNNNNNNNNNNNNNNNN¡¡¡þ;ŽûNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûH CTRLZ: EQU 1AH ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE THE TRANSLAT7!þNNNNNNNNNNNNNNNNN¡¡¡þ;a0NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ PVERS MACRO #VERS DD DL #VERS IF DD > 9999 DB (DD / 1000.›ÿòNNNNNNNNNNNNNNNN¡¡¡þ;Ë–NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûP SELDSK ;SELECT DISK DRIVE JP SETTRK ;SET TRACK # JP SETSEC ;SET SECTOR # JP SETDMA ;SET TRANSFER ADDR JP DISKRD ;îjþNNNNNNNNNNNNNNNNN¡¡¡þ;$!ÈNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLOAD ADDR FOR SBD ; ; CONTINUE ON WITH INIT ; INIT1: JR INIT ;#######################################################O…ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ;*ÇNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNABLED ; CALL GETMON ; ; INIT DEFAULT DRIVE ; LD A,(DK_PROM + 1) ;USE DRIVE # PASSED IN PAGE 0 AND A,3 LD (DEFDRV)Jþ NNNNNNNNNNNNNNNNN¡¡¡þ;0îNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DB 'M5b CBIOS Vers ' PVERS VERSN DM CR,LF IF $ > (DIRBF + SECSZ) CONMSG **** WARNING! COLD INIT CODE BIGGER jˆþINNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN8NNNNþ€Ì�™‚gƒ5„…Ñ…Ÿ†m‡;ˆ‰Õ‰¢Šp‹=Œ �Ù�¦Žt�B�‘ß‘­’{“H”•䕱–—M˜™é™·š…›Sœ �í�ºžˆŸV #¡ñ¡À¢Ž£[¤)¥÷¥Å¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ;ïëNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTHAN DIR BUFFER **** ELSE DS DIRBF+SECSZ-$ ;FILL OUT DIRECTORY BUFFER TO 1 SECTOR SIZE ENDIF ;-------------------"°þNNNNNNNNNNNNNNNNN¡¡¡þ;EMNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûISHA HOST ADAPTER FOR A HUNG CONDITION AND CLEAR IF TRUE ; IN A,(ISH_STATUS) ;IF HOST ADAPTER BUSY THEN BIT ISH_BSYB,A JRM§þNNNNNNNNNNNNNNNN¡¡¡þ; ª†NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOS TRK/SECTOR PUSH HL ; LD HL,(DEFBFR + BD_SCCPS) ;FETCH CCP TRK/SECTOR LD C,L LD B,0 CALL SETSEC ; LD C,H CALL δþBNNNNNNNNNNNNNNNN¡¡¡þ;ŠúNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û RDBDOS: POP HL ;RESTORE BDOS TRK/SECTOR FROM DIRECTORY LD C,L LD B,A ;A STILL CONTAINS 0 CALL SETSEC ; LD C,H CALL~Àþ„NNNNNNNNNNNNNNNN¡¡¡þ;e1NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHL ; ; NOW PUT INTERCEPT VECTOR INTO BDOS CODE ; LD HL,INTCPT LD (BDOS + 7),HL ; ; INITIALIZE CLOCK VECTORS IF CLOC#ÎÿäNNNNNNNNNNNNNNNNN¡¡¡þ;Ï—NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE= 0 IF NEW SELECT ; EXIT - HL= PTR TO DPT OR 0 FOR ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++^ìþœNNNNNNNNNNNNNNNN¡¡¡þ;%%ÉNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCUR_WR),HL ; LD L,(IX+ DPHRDO) LD H,(IX+ DPHRDO +1) LD (CUR_RD),HL ; LD L,(IX+ DPHSOFO) LD H,(IX+ DPHSOFO +1) LD (óþHNNNNNNNNNNNNNNNNN¡¡¡þ;+ÆNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFER ID SECTOR DATA TO TABLES ; LD HL,DEFBFR + ID_SPTO ; ; XFER DISK DATA TO DPB ; LG_XDPB: LD DE,(CUR_DPB) ;GET ADDò—þNNNNNNNNNNNNNNNN¡¡¡þ;º¸NNNNNNNNNNNNNNNNNNNNNN¡¡¡û--------------------------------------- ; ; WARM REBOOT ENTRY LOADS CCP,BDOS FROM DISK & ; SETS UP VARIABLES ; ;-----------™Âþ'NNNNNNNNNNNNNNNNN¡¡¡þ;UsNNNNNNNNNNNNNNNNNNNNNN¡¡¡û Z,NTHUNG ; LD A,PB_CLRC LD (IOPB + PB_CMDO),A CALL XPRIM ; NTHUNG: ENDIF ; ; LOG ON DRIVE TO INIT TABLES ; WþNNNNNNNNNNNNNNNN¡¡¡þ;ÿÕNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûSETTRK ; LD BC,CCP CALL SETDMA ; ; READ CCP/BDOS ; WREAD: CALL DISKRD JR NZ,WEROR ;IF ERROR THEN EXIT ; ; NEXT AþDNNNNNNNNNNNNNNNN¡¡¡þ;mNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û SETTRK ; JR WREAD ; ; ; WARM BOOT ERROR, OUTPUT MSG & HALT ; WEROR: LD HL,MSGLE ;OUTPUT ERROR MESSAGE CALL EDITOR ×Vþ9NNNNNNNNNNNNNNNN¡¡¡þ;0bNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûK INSTALLED ; LD C,CLK_F7 ;TEST FOR BOARD PRESENT CALL CLK1 ; ; IF CLOCK PRESENT THEN TURN ON CLOCK DRIVE ; OR A,A ŠyþdNNNNNNNNNNNNNNNNN¡¡¡þ; Ú 3 THEN SET TO 0 (NO DEBLOCK) ; DEC HL ;SKEW DEC HL ;PHM DEC HL ;PSH L±ƒþNNNNNNNNNNNNNNNN¡¡¡þ;‰‰NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û----------------------------------------------- WARM: IF INTRPTS ; ; SET INTERRUPT VECTOR TABLE BASE ; LD A,HIGH INTAªøþ!NNNNNNNNNNNNNNNN¡¡¡þ; fBNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLD A,(DK_PROM + 1) AND A,3 ;MODULO 4 LD C,A LD E,0 CALL SELDSK LD A,L ;IF ERROR THEN ABORT OR A,H JR Z,WEROR ; ºvþ NNNNNNNNNNNNNNNNN¡¡¡þ;ÌäNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSECTOR ; LD HL,(SEK_SEC) INC HL LD (SEK_SEC),HL ; LD DE,SECSZ ;DMA := DMA + SECTOR SIZE LD HL,(DMA_ADR) ADD HL,DE ‚UþNNNNNNNNNNNNNNNN¡¡¡þ; \NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û HALT ; ; ; BOOT OK, INIT PAGE 0 ; WZRPG: ; ; INIT BIOS WARM START IN PAGE 0 ; LD A,0C3H LD HL,BIOS + 3 LD (PA¦tþ�NNNNNNNNNNNNNNNNN¡¡¡þ;SNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD A,38H ;COND. JR (ON) JR NZ,CLKON ; ; ELSE TURN OFF CLOCK DRIVE ; LD A,18H ;UNCOND. JR (OFF) (CAUSES JUMP TO ILLEG#Äþ'NNNNNNNNNNNNNNNNN¡¡¡þ;!é NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û CP A,NDRVS RET NC ; ; STORE DRIVE # FOR FUTURE USE ; LD (SEK_DSK),A ; ; LOOK UP DRIVE IN TABLES ; ADD A,A LÖ\ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ;'C«NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; LD A,E LD (LOGRQ),A ; ; FETCH DISK PARAMETER HEADER TABLE ADDRESS ; LD HL,(CUR_DPH) ; ; IF NOT FIRST SELECT ORájþINNNNNNNNNNNNNNNN¡¡¡þ;-¬`NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD A,(HL) CP A,4 JR C,PSHOK ; LD (HL),0 ;PSH = 0 INC HL ;PHM = 0 LD (HL),0 INC HL ;SKEW = 0 LD (HL),0 JR DPBS']ÿÂNNNNNNNNNNNNNNNN¡¡¡þ;NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBL LD I,A ; ; SET INTERRUPT MODE TO 2 ; IM 2 ; ; ENABLE INTERRUPT VECTOR 7 ; IN A,(M2_IMASK) AND A,7FH OUT (ÊÝþNNNNNNNNNNNNNNNNNN¡¡¡þ; 3NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; READ BOOT DIRECTORY ; LD BC,DEFBFR ;SET XFER ADDRESS (USE DEFAULT BUFFER) CALL SETDMA ; LD BC,BD_SEC ;SET DIRECTO" ÿÂNNNNNNNNNNNNNNNNN¡¡¡þ;ß©NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD (DMA_ADR),HL ; ; IF NOT INTO BDOS THEN READ NEXT SECTOR ; LD DE,BDOS XOR A,A SBC HL,DE JR C,WREAD ; ; ELSEÝþBNNNNNNNNNNNNNNNN¡¡¡þ;uNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûGE0),A LD (PAGE0 + 1),HL ; ; INIT BDOS CALL VECTOR IN PAGE 0 ; LD HL,BDOS + 6 LD (BDOSJV),A LD (BDOSJV + 1),HL ; nÝÿÈNNNNNNNNNNNNNNNNN¡¡¡þ;šÄNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAL) ; CLKON: LD (INHCLK),A ; ENDIF ; ; PASS DEFAULT DISK TO CCP ; LD A,(DEFDRV) LD C,A JP CCP IF P_DISK½ˆþrNNNNNNNNNNNNNNNN¡¡¡þ;"¼^NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD HL,DRV_PTRS 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 LD (CUR_DPH),HL ; ; ³OþNNNNNNNNNNNNNNNNN¡¡¡þ;(S•NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LOGON INHIBITED THEN RETURN TABLE PTR ; CPL AND A,1 RET Z ; ; ELSE LOG ON DRIVE ; ; ATTEMPT TO READ ID SECTOR ;Ó½þ�NNNNNNNNNNNNNNNNN¡¡¡þ;.ù3NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûET ; PSHOK: ; FETCH SKEW INDEX ; INC HL ;PHM INC HL ;SKEW ; DPBSET: LD A,(HL) ; ; CALCULATE SKEW TABLE TO USE Õ?þHNNNNNNNNNNNNNNNNN¡¡¡þ;#/NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûM2_IMASK),A ; ; FINALLY ENABLE VECTORED INTERRUPTS ; IN A,(M2_STAT) OR A,M2_IEN OUT (M2_STAT),A EI ENDIF ; ; ß¶þ“NNNNNNNNNNNNNNNNN¡¡¡þ; NNNNNNNNNNNNNNNNNNNNN!ö¡¡¡ûRY SECTOR CALL SETSEC ; LD BC,0 ;SET TRACK TO 0 CALL SETTRK ; CALL DISKRD JR NZ,WEROR ; ; CHECK FOR VALID BOOT C�ÿäNNNNNNNNNNNNNNNNN¡¡¡þ;ì˜NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û IF AT BEGINNING OF BDOS THEN SET UP NEW TRACK & SECTOR ; JR Z,RDBDOS ; ; ELSE IF NOT AT BIOS THEN READ NEXT SECTOR ; ÕTÿÂNNNNNNNNNNNNNNNN¡¡¡þ;F>NNNNNNNNNNNNNNNNNNNNNNð¡¡¡û; INIT BIOS CALL VECTOR IN PAGE 0 ; LD HL,BIOFUNC LD (BFUNRSV),A LD (BFUNRSV + 1),HL ; ; SET DEFAULT SECTOR BUFFER ¡ÿòNNNNNNNNNNNNNNNN¡¡¡þ;©õNNNNNNNNNNNNNNNNNNNNNN¡¡¡û OR P_ALL LIST ON ELSE LIST OFF ENDIF SUBTTL BIOS DISK FUNCTION ROUTINES ;+++++++++++++++++++++++++++++++++++++++_<þœNNNNNNNNNNNNNNNN¡¡¡þ;#�oNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û FETCH OTHER PTRS ; PUSH IX ;SAVE CURRENT IX PUSH HL POP IX ; LD L,(IX+ DPHDPBO) LD H,(IX+ DPHDPBO +1) LD (CUR_DPÞ0þNNNNNNNNNNNNNNNNN¡¡¡þ;)`¤NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û XOR A,A ;INIT FLAG BYTE UNTIL FIRMWARE REVISED LD (IOPB + PB_ST2O),A ; CALL DISKLOG JP NZ,FDSKER ; ; IF NO ID SECP›þINNNNNNNNNNNNNNNNN¡¡¡þ;/ÊNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; OR A,A ;IF 0 THEN NO XLATION JR NZ,LG_X1 ; LG_NOX: LD HL,0 ; LG_X: LD (CUR_XLAT),HL JR LG_DONE ; ; ; IF SKEW ÞWþ„NNNNNNNNNNNNNNNN¡¡¡þ;v|NNNNNNNNNNNNNNNNNNNNNN¡¡¡û SET TEMPORARY STACK ; LD SP,DEFBFR ; ; INSURE MONITOR ROM STILL ENABLED ; CALL GETMON ; IF BOOT = 10H ; TEST wÿÎNNNNNNNNNNNNNNNNN¡¡¡þ; ™·NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDIRECTORY ; LD A,(DEFBFR) CP A,86H JR C,WEROR ; ; SET UP TO LOAD CCP/BDOS ; LD HL,(DEFBFR + BD_SBDSS) ;PREFETCH BD-aþNNNNNNNNNNNNNNNNN¡¡¡þ;¹ËNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLD DE,BIOS - BDOS SBC HL,DE JP C,WREAD ; ; ELSE DONE READING SYSTEM ; JP WZRPG ; ; ; ELSE SET UP & READ BDOS ; ¼þ NNNNNNNNNNNNNNNNN¡¡¡þ;VNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û ; LD BC,DEFBFR CALL SETDMA ; IF INTCPTS ; ; PUT BDOS VECTOR INTO INTERCEPT CODE ; LD HL,(BDOS + 7) LD (BDOSV),Þ™þ„NNNNNNNNNNNNNNNN¡¡¡þ;ü¦NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++ ; ; SELECT DRIVE FUNCTION ; LOG-ON - SET DISK PARAMETER BLOCK ; ENTRY- C= DRIVE # ; - ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ;$øNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûB),HL ; LD L,(IX+ DPHDTABO) LD H,(IX+ DPHDTABO +1) LD (CUR_BCB),HL ; LD L,(IX+ DPHWRTO) LD H,(IX+ DPHWRTO +1) LD (ùÿ'NNNNNNNNNNNNNNNNN¡¡¡þ;*5÷NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTOR THEN USE DEFAULTS ; LD A,(IOPB + PB_ST2O) CP A,-2 ;0: NO ID, -1: JADE ID, -2: EXTENDED ID JR NZ,LGDEF ; ; ELSE XÔþÉNNNNNNNNNNNNNNNNN¡¡¡þ;0ÙONNNNNNNNNNNNNNNNNNNNNN¡¡¡û> LAST THEN NONE ; LG_X1: CP A,4 JR C,LG_NOX ; ; ELSE IF SKEW == 1 THEN IBM 3740 FORMAT ; LD HL,X3740 CP A,2 JR Cöþ“NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNnNNNNNNN�Ñ�Ÿ‚lƒ:„…Õ…¤†r‡@ˆ‰Ü‰©Šx‹EŒ�à�¯Ž}�K�‘瑵’‚“P”•땸–†—S˜!™ï™½š‹›Zœ'�õ�Þ‘Ÿ_ -¡û¡Ê¢˜£e¤3¥¦Ï¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ<‰öNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûC,LG_X ; ; ELSE IF SKEW == 2 THEN IBM 3740 DOUBLE SIDED ; LD HL,X3740D JR Z,LG_X ; ; ELSE IF SKEW == 3 THEN CCS SIN13þNNNNNNNNNNNNNNNNN¡¡¡þ<#PNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûK 0 ; EXIT - BC= 0 ; ;**************************************************************************** HOME: ; ; IF PENDING 04ÿòNNNNNNNNNNNNNNNN¡¡¡þ< Ì›NNNNNNNNNNNNNNNNNNNNNN¡¡¡û***************************************** ; ; SET TRANSFER ADDR ; ENTRY- BC= ADDRESS ; EXIT - A= 0 ; ;********************(±þœNNNNNNNNNNNNNNNN¡¡¡þ<ìçNNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************************* DISKRD: ; ; IF SECTOR SIZE == 128 THEN USE UNBLOCKED ROUTINES & SAVE BUFFER ; ÆŠþ„NNNNNNNNNNNNNNNN¡¡¡þ<,NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û TO DIRECTORY BLOCK (ALLWAYS WRITE) WR_UAL EQU 2 ;WRITE TO UNALLOCATED BLOCK (NO NEED TO PRE-READ) ; ;***********************‡qþÉNNNNNNNNNNNNNNNNN¡¡¡þ<©ŠNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; LD A,(SEK_DSK) LD (UNA_DSK),A ; ; SET TRACK TO SEEK ; LD HL,(SEK_TRK) LD (UNA_TRK),HL ; ; SET SECTOR TO SEE=þ9NNNNNNNNNNNNNNNN¡¡¡þ<%CÔNNNNNNNNNNNNNNNNNNNNNN¡¡¡û THEN USE 1ST SECTOR OF NEXT TRACK ; LD E,(IX+ DPBSPTO) LD D,(IX+ DPBSPTO +1) SBC HL,DE JP C,NOOVF ; LD HL,0 ;SECTOcbÿÈNNNNNNNNNNNNNNNNN¡¡¡þ<+`ÛNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û28 JR Z,NOSECSHF ; SECSHFLP: SRL B ;ELSE SHIFT OVER TO PHYSICAL SECTOR RR C DEC A JR NZ,SECSHFLP ; NOSECSHF: Lê-þNNNNNNNNNNNNNNNNNN¡¡¡þ<Ü¥NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûGLE SIDED ; LD HL,XCCS CP A,4 JR C,LG_X ; ; ELSE IF SKEW == 4 THEN CCS DOUBLE SIDED ; LD HL,XCCSD JR LG_X ; ; M‡þ“NNNNNNNNNNNNNNNNN¡¡¡þ<3nNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûWRITE (BUFFER DIRTY) THEN IGNORE ; LD A,(HST_WRT) OR A,A RET NZ ; ; ELSE PURGE BUFFER ; LD (HST_ACT),A RET *·þ·NNNNNNNNNNNNNNNN¡¡¡þ<™ÈNNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************************************** SETDMA: LD (DMA_ADR),BC XOR A,A LD (DMA_BNK),A RET ;+++++++UàþNNNNNNNNNNNNNNNN¡¡¡þ<upNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD HL,(CUR_DPB) LD DE,DPBPSHO ADD HL,DE LD A,(HL) OR A,A JP Z,UB_READ ; ; SET UP DATA TABLE PTR ; PUSH IX LÝÿùNNNNNNNNNNNNNNNN¡¡¡þ<VNNNNNNNNNNNNNNNNNNNNNN¡¡¡û***************************************************** DISKWR: ; ; IF SECTOR SIZE == 128 THEN USE UNBLOCKED ROUTINES ; LDï1ÿäNNNNNNNNNNNNNNNNN¡¡¡þ< ¼!NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûK ; LD HL,(SEK_SEC) LD (UNA_SEC),HL ; ; IF NO UNALLOCATED SECTORS REMAIN THEN PREREAD ; CHKUNA: LD A,(UNA_CNT) OR AMæþ!NNNNNNNNNNNNNNNN¡¡¡þ<&‡NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR = #1 LD (UNA_SEC),HL ; LD HL,(UNA_TRK) ;TRACK++ INC HL LD (UNA_TRK),HL ; NOOVF: ; ; MATCH FOUND, MARK AS UNNECEøÀþBNNNNNNNNNNNNNNNN¡¡¡þ<,ùLNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûD (SEK_HST),BC ;BUFFER SECTOR TO SEEK ; ; IF BUFFER EMPTY THEN READ THE PHYSICAL SECTOR ; LD HL,HST_ACT LD A,(HL) ; ðkÿòNNNNNNNNNNNNNNNN¡¡¡þ<ï”NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; RETURN DRIVE TABLE PTR ; LG_DONE: LD HL,(CUR_DPH) XOR A,A RET ; ; ; SELECT DEFAULT DPB FROM TABLES BASED ON DR— þ$NNNNNNNNNNNNNNNNN¡¡¡þ< _NNNNNNNNNNNNNNNNNNNNNN¡¡¡û;**************************************************************************** ; ; SET TRACK # ; ENTRY- BC= TRACK # ; ;***** ÆþNNNNNNNNNNNNNNNNN¡¡¡þ<ªùNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SECTOR TRANSLATION BDOS FUNCTION DOES NOTHING IN DEB´4þ9NNNNNNNNNNNNNNNN¡¡¡þ<FANNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD IX,(CUR_DPB) ; ; READ_OPERATION_FLAG = TRUE (1) ; LD A,1 LD (READ_OP),A ; ; PRE-READ_OF_DATA_FLAG = TRUE ; LD õpþHNNNNNNNNNNNNNNNNN¡¡¡þ<eNNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û HL,(CUR_DPB) LD DE,DPBPSHO ADD HL,DE LD A,(HL) OR A,A JP Z,UB_WRITE ; ; SET PTR TO DISK DATA ; PUSH IX LD IX¨áþNNNNNNNNNNNNNNNNN¡¡¡þ<!�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û,A JP Z,ALLOC ; ; ELSE MORE UNALLOCATED RECORDS REMAIN, COUNT-- ; DEC A LD (UNA_CNT),A ; ; IF REQUESTED SECTOR !=–nþINNNNNNNNNNNNNNNNN¡¡¡þ<'%¶NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSSARY READ ; XOR A,A ;PREREAD FLAG = FALSE LD (RS_FLAG),A JP RWOPER ; ; ; NOT AN UNALLOCATED RECORD, REQUIRES PRE-Rõ±ÿÈNNNNNNNNNNNNNNNN¡¡¡þ<-Ê}NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLD (HL),1 ;BUFFER FULL IN ANY CASE ; OR A,A JP Z,FILHST ; ; HOST BUFFER ACTIVE, SAME AS SEEK BUFFER? ; LD A,(SEK_DS%ýþ9NNNNNNNNNNNNNNNN¡¡¡þ<vNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûIVE TYPE ; LGDEF: LD HL,(CUR_DPH) DEC HL ;POINT TO DRIVE TYPE BYTE ; ; IF HARD DISK THEN USE HARD DISK TABLE ; LD A,ONþœNNNNNNNNNNNNNNNN¡¡¡þ< U NNNNNNNNNNNNNNNNNNNNNN¡¡¡û*********************************************************************** SETTRK: LD (SEK_TRK),BC RET ;*****************j¤ÿÂNNNNNNNNNNNNNNNNN¡¡¡þ<¹´NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûLOCKING MODE ; ENTRY- BC= SECTOR # TO XLATE ; EXIT - HL= BC ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++à.þBNNNNNNNNNNNNNNNN¡¡¡þ<NNNNNNNNNNNNNNNNNNNNNN¡¡¡û(RS_FLAG),A ; ; TREAT AS UNALLOCATED BLOCK ; LD A,WR_UAL LD (WR_TYPE),A ; JP RWOPER ;TO PERFORM THE READ ;****o¥þNNNNNNNNNNNNNNNNN¡¡¡þ<üÙNNNNNNNNNNNNNNNNNNNNNN¡¡¡û,(CUR_DPB) ; ; READ_OP_FLAG = FALSE ; XOR A,A LD (READ_OP),A ; ; SAVE WRITE TYPE ; LD A,C LD (WR_TYPE),A ; ;†wþdNNNNNNNNNNNNNNNN¡¡¡þ<"ÚCNNNNNNNNNNNNNNNNNNNNNN¡¡¡û UNALLOCATED SECTOR THEN PURGE ; LD A,(SEK_DSK) ;SAME DISK? LD HL,UNA_DSK CP A,(HL) JP NZ,ALLOC ; LD HL,(UNA_TRK) ;SdµþNNNNNNNNNNNNNNNNN¡¡¡þ<(5ˆNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûEAD ; ALLOC: XOR A,A ;COUNT = 0 LD (UNA_CNT),A ; INC A ;PREREAD FLAG = TRUE LD (RS_FLAG),A ; ; ; ; COMMON COD¸|ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ<.Ÿ.NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûK) LD HL,HST_DSK ;SAME DISK? CP A,(HL) JP NZ,NOMATCH ; LD HL,(HST_TRK) ;SAME TRACK? LD DE,(SEK_TRK) SBC HL,DE JP �ßþ NNNNNNNNNNNNNNNNN¡¡¡þ<E2NNNNNNNNNNNNNNNNNNNNNN¡¡¡û(HL) CP A,10H JR C,LG_DEFF ; LD HL,HDPBK JR LG_XDPB ; ; ; USE 8" FLOPPY DEFAULTS ; LG_DEFF: LD HL,SD8PBK JR ±ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ< f=NNNNNNNNNNNNNNNNNNNNNN¡¡¡û*********************************************************** ; ; SET SECTOR ; ENTRY- BC= SECTOR # ; ;***********************TúþdNNNNNNNNNNNNNNNNN¡¡¡þ<Š…NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++ SECTRN: LD H,B LD L,C RET ;*************************************************************************Õ›þNNNNNNNNNNNNNNNN¡¡¡þ< #NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************************************ ; ; THE WRITE ENTRY POINT TAKES THE PLACE OF THE PREV—Kþ9NNNNNNNNNNNNNNNN¡¡¡þ<ÏèNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û IF 1ST WRITE TO UNALLOCATED (NEW, UNUSED) BLOCK THEN SET PARAMETERS ; CP A,WR_UAL JP NZ,CHKUNA ; ; COUNT = NUMBER_OFFþNNNNNNNNNNNNNNNNNN¡¡¡þ<#érNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûAME TRACK? LD DE,(SEK_TRK) SBC HL,DE JP NZ,ALLOC ; LD HL,(SEK_SEC) LD DE,(UNA_SEC) SBC HL,DE JP NZ,ALLOC ; ; à–þÉNNNNNNNNNNNNNNNNN¡¡¡þ<)¹NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE FOR READ AND WRITE FOLLOWS ; RWOPER: ; ; ASSUME NO ERRORS ; XOR A,A LD (ER_FLAG),A ; ; COMPUTE BUFFER SECTOR ;ñÛþÉNNNNNNNNNNNNNNNNN¡¡¡þ</¬NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûNZ,NOMATCH ; LD DE,(SEK_HST) ;SAME SECTOR? LD HL,(HST_SEC) SBC HL,DE JP Z,MATCH ;SKIP IF MATCH ; NOMATCH: ; ; IF�þNNNNNNNNNNNNNNNN¡¡¡þ<aNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûLG_XDPB ;**************************************************************************** ; ; HOME DRIVE - TREAT AS SEEK TRL°ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ< ÿªNNNNNNNNNNNNNNNNNNNNNN¡¡¡û***************************************************** SETSEC: LD (SEK_SEC),BC RET ;***********************************p0þNNNNNNNNNNNNNNNNNN¡¡¡þ<ßÖNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*** ; ; THE READ FUNCTION READS THE REQUESTED SECTOR ; EXIT - A= 0: OK, /0: ERROR CODE ; ;*********************************(MþNNNNNNNNNNNNNNNNN¡¡¡þ<0NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIOUS BIOS DEFINTION ; FOR WRITE. ; ENTRY- C= WRITE TYPE: WR_ALL EQU 0 ;WRITE TO ALLOCATED BLOCK (UPDATE) WR_DIR EQU 1 ;WRITEã;þ„NNNNNNNNNNNNNNNN¡¡¡þ<š»NNNNNNNNNNNNNNNNNNNNNN¡¡¡û_SECTORS_IN_BLOCK ; LD A,(IX+ DPBBLMO) ;CUR_DPB.DPBBLM + 1 ::= (BLKSIZ/128) INC A LD (UNA_CNT),A ; ; SET DISK TO SEEKÓ.þHNNNNNNNNNNNNNNNNN¡¡¡þ<$påNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûMATCH, MOVE TO NEXT SECTOR FOR FUTURE REF ; INC HL ;UNASEC = UNASEC+1 LD (UNA_SEC),HL ; ; IF PAST LAST SECTOR ON TRACKµñÿÈNNNNNNNNNNNNNNNNN¡¡¡þ<*SêNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD BC,(SEK_SEC) ; LD A,(IX+ DPBPSHO) ;USE PHYSICAL SHIFT FACTOR (CP/M 3.X) OR A,A ;IF ALREADY 0 THEN SECTOR SIZE IS 1=Ùþ NNNNNNNNNNNNNNNNN¡¡¡þ<0¿RNNNNNNNNNNNNNNNNNNNNNN¡¡¡û CURRENT BUFFER DIRTY THEN WRITE IT OUT BEFORE READING NEW ONE ; LD A,(HST_WRT) OR A,A CALL NZ,WRITEHST ;CLEAR HOST BUFF dþINNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN8NNNNÿ€Î�›‚hƒ5„…Ð…ž†k‡9ˆ‰Ó‰ Šn‹;Œ�Ö�¤Žr�@�‘Ü‘ª’x“E”•à•­–{—H˜™ä™²š€›Nœ�é�·ž†ŸT "¡ð¡½¢‹£X¤'¥õ¥Ã¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ<¾ÆNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; FILHST: ; ; READ THE SECTOR BUFFER ; LD A,(SEK_DSK) ;BUFFER SECTOR = PHYSICAL SECTOR LD (HST_DSK),A ; LD HL,(SEK_Íþ$NNNNNNNNNNNNNNNNN¡¡¡þ<`NNNNNNNNNNNNNNNNNNNNNN¡¡¡û8 ;LENGTH OF MOVE ; LD A,(READ_OP) ;WHICH WAY? OR A,A JP NZ,RWMOVE ;SKIP IF READ ; ; WRITE OPERATION, MARK AND SWITC±þrNNNNNNNNNNNNNNNN¡¡¡þ< û«NNNNNNNNNNNNNNNNNNNNNN¡¡¡û SUBTTL DISK SUPPORT ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; UNBLOCKED R+�þ9NNNNNNNNNNNNNNNN¡¡¡þ<Û×NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûXFER ADDRESS TO DATA ; LD HL,(DMA_ADR) LD (IOPB + PB_DMAO),HL LD A,(DMA_BNK) LD (IOPB + PB_DMAXO),A ; ; EXECUTE THEUKþ„NNNNNNNNNNNNNNNN¡¡¡þ<4NNNNNNNNNNNNNNNNNNNNNN¡¡¡û(IOPB + PB_DMAXO),A ; ; SET DESCRIPTOR SECTOR SECTOR ; LD HL,ID_SECT LD (IOPB + PB_SECO),HL ; ; SET DESCRIPTOR SECTksþNNNNNNNNNNNNNNNNN¡¡¡þ<žºNNNNNNNNNNNNNNNNNNNNNN¡¡¡û_DMAXO),A ; LD A,PB_READC ;SELECT READ OP JP DISKOP ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++!ûþBNNNNNNNNNNNNNNNN¡¡¡þ<%täNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DISKOP: ; ; SÄþHNNNNNNNNNNNNNNNNN¡¡¡þ<+WëNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûWR: H8_RD: H8_WR: EX_IOPB ; ; EXECUTE DISK DRIVER ; DKOPLP: ; ; EXECUTE THE PRIMITIVE IN ROM ; PUSH IX LD IX,Iïþ¼NNNNNNNNNNNNNNNN¡¡¡þ<ë•NNNNNNNNNNNNNNNNNNNNNN¡¡¡û_TRK) LD (HST_TRK),HL ; LD HL,(SEK_HST) LD (HST_SEC),HL ; ; IF REQUIRED TO READ THEN READ ; LD A,(RS_FLAG) ;NEED ÏLþHNNNNNNNNNNNNNNNNN¡¡¡þ<^NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûH DIRECTION ; LD A,1 ;BUFFER = DIRTY LD (HST_WRT),A ; EX DE,HL ;SOURCE/DEST SWAP ; RWMOVE: ; ; BC INITIALLY 128,ÌâþNNNNNNNNNNNNNNNN¡¡¡þ<®øNNNNNNNNNNNNNNNNNNNNN!ö¡¡¡ûEAD FUNCTION ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ UB_READ: ; ; SET COMMAND TO †þ!NNNNNNNNNNNNNNNN¡¡¡þ<B@NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û IOPB ; JP EX_IOPB ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; UNBLOCKED WRITE FÄÝþNNNNNNNNNNNNNNNN¡¡¡þ<aONNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOR TRACK ; LD L,H ;H == 0 FROM LAST OPERATION (HL= 0) LD (IOPB + PB_TRKO),HL ; ; PASS COMMAND TO EXECUTOR ; LD A,PB þ NNNNNNNNNNNNNNNNN¡¡¡þ< ‹NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++ ; ; WRITE A DISK SECTOR FROM SECTOR DEBLOCKING BUFFER FUNCTION ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++E?þœNNNNNNNNNNNNNNNN¡¡¡þ<&!·NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûET IOPB COMMAND ; LD (IOPB + PB_CMDO),A ; ; DRIVE ; LD A,(CUR_DRV) LD (IOPB + PB_DRVO),A ; ; TRACK ; LD HL,(H•€þ9NNNNNNNNNNNNNNNN¡¡¡þ<,Î|NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOPB ;PASS PTR TO IOPB LD HL,DK_DSKX ;PRIMITIVE ENTRY LD A,(DK_PROM) ;FETCH PROM # CALL EXROM ;EXECUTE THE PRIMITIVE PO«”þrNNNNNNNNNNNNNNNN¡¡¡þ<ؤNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTO READ? OR A,A CALL NZ,READHST ;YES, IF 1 ; ; BUFFER = CLEAN ; XOR A,A LD (HST_WRT),A ; MATCH: ; ; COPY DAT’Yþ$NNNNNNNNNNNNNNNNN¡¡¡þ< 7oNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û DE IS SOURCE, HL IS DEST ; LDIR ; ; DATA HAS BEEN MOVED TO/FROM HOST BUFFER, IF NOT DIRECTORY THEN DELAY WRITE ; LD A\þ NNNNNNNNNNNNNNNNN¡¡¡þ<�ÉNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûREAD ; LD A,PB_READC ; ; COMMON UNBUFFERED R/W ; UB_COMM: LD (IOPB + PB_CMDO),A ; ; SET DRIVE ; LD A,(CUR_DRV) þNNNNNNNNNNNNNNNN¡¡¡þ<qqNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUNCTION ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ UB_WRITE: ; ; SET COMMAND TO WRITÁ’ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ<R~NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û_LOGC LD (IOPB + PB_CMDO),A ; ; EXECUTE THE IOPB ; JP EX_IOPB ;+++++++++++++++++++++++++++++++++++++++++++++++++++ÙþHNNNNNNNNNNNNNNNNN¡¡¡þ<!¸ NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ WRITEHST: ; ; SET PTR TO EXECUTION ROUTINE ; LD HL,(CUR_WR)¤×þNNNNNNNNNNNNNNNNN¡¡¡þ<'†NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûST_TRK) LD (IOPB + PB_TRKO),HL ; ; SECTOR ; LD BC,(HST_SEC) ;XLATE POSSIBLE LD DE,(CUR_XLAT) CALL SEC_TRN ; LD +úÿäNNNNNNNNNNNNNNNN¡¡¡þ<-ýMNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûP IX ; ; IF NO ERRORS THEN RETURN THE COMMAND RESULTS STATUS ; LD A,(IOPB + PB_STATO) OR A,A RET Z ; ; PRINT ERRO�•þœNNNNNNNNNNNNNNNN¡¡¡þ<A3NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA TO OR FROM BUFFER ; LD HL,(SEK_SEC) ;CALCULATE INDEX INTO BUFFER LD A,L ; AND A,(IX+ DPBPHMO) ;USE PHYSICAL RECORD MASéjþ!NNNNNNNNNNNNNNNN¡¡¡þ< b -> BITS <14..8> LD H,A ; LD A,0 ;BIT 0 -> BIT 7 RRA LD L,A ; ; HL HAS RE“6ÿÉNNNNNNNNNNNNNNNNN¡¡¡þ< Q NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ERROR THEN ABORT ; OR A,A RET NZ ; ; NO ERROR/DIRECTORY WRITE ; XOR A,A ;BUFFER = CLEAN LD (HST_WRT),A ; CALLú‰þ NNNNNNNNNNNNNNNNN¡¡¡þ<½µNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR SECTOR SECTOR ; LD BC,(SEK_SEC) ;MUST TRANSLATE LD DE,(CUR_XLAT) CALL SEC_TRN LD (IOPB + PB_SECO),HL ; ; NO FLAG þ¢NNNNNNNNNNNNNNNN¡¡¡þ<NNNNNNNNNNNNNNNNNNNNNN¡¡¡û DISK FUNCTION ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ T©þBNNNNNNNNNNNNNNNN¡¡¡þ<øØNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ READHST: ; ; SET PTR TO EXECUTION ROUTINE ; LD�þNNNNNNNNNNNNNNNNN¡¡¡þ<#ÞBNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD A,PB_WRITC ;SELECT WRITE OP ; ; FALL INTO COMMON DISK I/O ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++wœþNNNNNNNNNNNNNNNNN¡¡¡þ<)1‰NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE IOPB FUNCTION ; ENTRY- IOPB ALL SETI\þNNNNNNNNNNNNNNNNN¡¡¡þ</›/NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE REGS PUSH BC CALL PRHEX ;OUTPUT ERROR CODE ; LD C,' ' CALL COC ; POP BC ;RESTORE REGS POP DE INC DE ;NEXT EÕÝþrNNNNNNNNNNNNNNNN¡¡¡þ<'QNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLATIVE HOST BUFFER ADDRESS ; LD DE,HST_BUF ADD HL,DE ;HL = HOST ADDRESS ; LD DE,(DMA_ADR) ;GET/PUT CP/M DATA LD BC,12þÅþœNNNNNNNNNNNNNNNN¡¡¡þ< ÈšNNNNNNNNNNNNNNNNNNNNNN¡¡¡û WRITEHST ;WRITE TO DISK ; LD A,(ER_FLAG) ;RETURN ANY ERRORS ; ; DONE, RESTORE & RETURN ; RW_RET: POP IX ; RET ~þ!NNNNNNNNNNNNNNNN¡¡¡þ<èæNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS ; XOR A,A LD (IOPB + PB_FLGO),A ; ; 128 BYTES ; LD HL,128 LD (IOPB + PB_BCNTO),HL ; ; SET DESCRIPTOR SECTOR  þNNNNNNNNNNNNNNNNN¡¡¡þ<-NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDISKLOG: ; ; SET DESCRIPTOR SECTOR XFER ADDRESS TO DEFAULT BUFFER ; LD HL,DEFBFR LD (IOPB + PB_DMAO),HL XOR A,A LD ¯5þrNNNNNNNNNNNNNNNN¡¡¡þ<­‹NNNNNNNNNNNNNNNNNNNNNN¡¡¡û HL,(CUR_RD) PUSH HL ; ; SET DMA TO SECTOR BUFFER ; LD HL,HST_BUF LD (IOPB + PB_DMAO),HL ; XOR A,A LD (IOPB + PBpšÿÈNNNNNNNNNNNNNNNNN¡¡¡þ<$GÕNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++ ; ; COMMON DISK I/O CODE ; ENTRY- A= IOPB COMMAND ; (SP)= DRIVER ADDRESS ; (IOPB.PB_DMA= SET ;ç,þHNNNNNNNNNNNNNNNNN¡¡¡þ<*dÚNNNNNNNNNNNNNNNNNNNNNN¡¡¡û UP ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ F8_RD: F8_aÚþ NNNNNNNNNNNNNNNNN¡¡¡þ<0ˆbNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRROR BYTE DJNZ DSKER1 ;IF NOT DONE THEN LOOP ; LD HL,DSKEB ;OUTPUT ERROR MESSAGE CALL EDITOR ; ; GET USER RESPONSE t‰þINNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN^NNNNNNN�Ñ�Ÿ‚lƒ:„…Õ…£†p‡>ˆ ‰Ø‰¥Šs‹AŒ�Þ�¬Žz�H�‘味’�“N”•é•·–…—S˜!™ï™½š‹›Yœ&�ô�ž�Ÿ^ ,¡ù¡Æ¢”£a¤/¥ý¥Ë¦žNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ=ÿBNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; CALL CI ; PUSH AF ;SAVE CHAR LD C,A ;ECHO CHAR CALL COC POP AF ; AND A,5FH ;INSURE UPPER CASE ; ; IF RETRйþÉNNNNNNNNNNNNNNNNN¡¡¡þ=UäNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++ SEC_TRN: ; ; IF NO TRANSLATION THEN RETURN SECTOR++ ; LD A,D ;IF TABLE ADDR = 0 THEN NO Tú¶þ NNNNNNNNNNNNNNNN¡¡¡þ= º/NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûC CP A,MAXFUNCS LD A,-1 RET NC ; ; ELSE COMPUTE TABLE ENTRY ; PUSH HL ;SAVE POSSIBLE DATA ; LD HL,BFUNTBL LD ÖÌþœNNNNNNNNNNNNNNNN¡¡¡þ=šSNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN BIOS VERSION # ; EXIT - HL= VERSION # IN BINARY {0.00,..655.35$ïþ¹NNNNNNNNNNNNNNNN¡¡¡þ=u˜NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBASE OF TABLE LD D,0 ;ADD OFFSET TWICE FOR WORD PTRS ADD HL,DE ADD HL,DE ; LD E,(HL) ;FETCH DPH PTR INC HL LD D,(¾ÿäNNNNNNNNNNNNNNNNN¡¡¡þ=ß>NNNNNNNNNNNNNNNNNNNNNN¡¡¡û TO CONSOLE SUBR ; ENTRY- A= DATA ; EXIT - A, C= ? ; ;**********************************************************************Ë0þNNNNNNNNNNNNNNNN¡¡¡þ=%5`NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûN ELSE LIST OFF ENDIF SUBTTL ADDITIONAL FUNCTIONS TO SUPPORT CDOS PROGRAMS ;***************************************ðÐþHNNNNNNNNNNNNNNNNN¡¡¡þ=+oNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLLEGC ; ; NOW CHECK FOR EXTENDED CALLS ; CP A,8DH ;IF RETURN VERSION THEN RETURN IT JR Z,RETCVER ; CP A,90H ;IF NOT0®þ!NNNNNNNNNNNNNNNN¡¡¡þ=ªNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûY THEN RETURN TO CALLER ; CP A,'R' JR Z,DKOPLP ; ; ELSE IF ABORT THEN DO WARM BOOT ; CP A,'A' JP Z,0 ; ; ELSE Ã]þ$NNNNNNNNNNNNNNNNN¡¡¡þ=EÚNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûRANSLATION OR A,E JP Z,NOTRAN ; ; ELSE CALCULATE NEW SECTOR FROM TABLE ; EX DE,HL ADD HL,BC LD L,(HL) ; LD H,0Ê€þ“NNNNNNNNNNNNNNNN¡¡¡þ=ï|NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûA,C ADD A,A ADD A,L LD L,A LD A,0 ADC A,H LD H,A ; ; EXECUTE TABLE ADDRESS ; LD A,(HL) INC HL LD H,(HL) UÿÂNNNNNNNNNNNNNNNN¡¡¡þ=ÄNNNNNNNNNNNNNNNNNNNNNN¡¡¡û} ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ RETVERS: LD HL,VERSN XOR A,A ;RETURN NÁ\þNNNNNNNNNNNNNNNN¡¡¡þ= ËNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûHL) ; EX DE,HL ;RETURN IN HL ; ; RETURN NO ERROR ; XOR A,A RET ;++++++++++++++++++++++++++++++++++++++++++++++ª7þNNNNNNNNNNNNNNNNN¡¡¡þ= Ê•NNNNNNNNNNNNNNNNNNNNNN¡¡¡û****** PRHEX: ; ; PROCESS HIGH NIBBLE 1ST ; CALL PRDIG ; ; SWAP HIGH & LOW NIBBLES ; PRDIG: RLCA RLCA RLCA RȘþNNNNNNNNNNNNNNNNN¡¡¡þ=&`3NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************ ; ; SYSTEM CALL INTERCEPT ROUTINE CHECKS FOR ILLEGAL BDOS CALLS & ; PRINTS MESSAGE IF Ih~þNNNNNNNNNNNNNNNNN¡¡¡þ=,�øNNNNNNNNNNNNNNNNNNNNNN¡¡¡û CLOCK THEN ERR JR C,ILLEGC ; JR Z,CLKCAL ;IF CALENDAR THEN GET IT ; CP A,92H JR C,CLKSET ;IF SET FUNCTION THEN SET CLl&ÿòNNNNNNNNNNNNNNNN¡¡¡þ=™ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIF IGNORE THEN RETURN NO ERROR ; SUB A,'I' RET Z ; ; ELSE RETURN ERROR TO BDOS ; FDSKER: LD HL,0 ;RETURN DPB_PTR = 0þÜþNNNNNNNNNNNNNNNNN¡¡¡þ= vëNNNNNNNNNNNNNNNNNNNNNN¡¡¡û RET ; ; ; CONVERT FROM CP/M'S LOGICAL SECTOR {0..N-1} TO PHYSICAL SECTOR {1..N} ; NOTRAN: LD HL,1 ADD HL,BC RETÆ4þHNNNNNNNNNNNNNNNNN¡¡¡þ=ÜMNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD L,A ; EX (SP),HL ;PUT CALLER'S DATA IN HL, FUNCTION ADDR ON RET ; STACK, EXECUTE FUNCTION ADDRESS ON STACK ;###½«þBNNNNNNNNNNNNNNNN¡¡¡þ=0õNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûO ERROR RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN DRIVER TABLE PTR ÃlÿÎNNNNNNNNNNNNNNNNN¡¡¡þ=úNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++ ; ; EXECUTE IOPB FUNCTION ; ENTRY- IX= IOPB PTR ; EXIT - A= 0: OK ; ;++++++++++++++++++++++âþ'NNNNNNNNNNNNNNNNN¡¡¡þ=!ù¤NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLCA ; ; SAVE DATA FOR RETURN ; PUSH AF ; ; CONVERT TO ASCII USING DAA TRICK ; AND A,0FH ADD A,90H DAA ADC A,&xÿÈNNNNNNNNNNNNNNNNN¡¡¡þ='SNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLLEGAL. ALSO IMPLEMENTS CDOS CLOCK/CALENDAR ; SYSTEM CALLS FOR ASMB. ; ;****************************************************»&ÿÈNNNNNNNNNNNNNNNN¡¡¡þ=-¼ÉNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOCK ; JR Z,CLKTIM ;IF TIME THEN GET IT ; CP A,93H JR Z,CLKRDC ;IF READ CLOCK THEN GET IT ; ; ILLEGAL SYSTEM CALL ; P“þ„NNNNNNNNNNNNNNNN¡¡¡þ=·NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û FOR SELECT FUNCTION LD A,-1 ;RETURN -1 TO BDOS OR A,A RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++¢þœNNNNNNNNNNNNNNNN¡¡¡þ= #¸NNNNNNNNNNNNNNNNNNNNNN¡¡¡û IF P_BFUN OR P_ALL LIST ON ELSE LIST OFF ENDIF SUBTTL BIOS FUNCTION CALLS ;+++++++++++++++++++++++++++++6kÿòNNNNNNNNNNNNNNNNN¡¡¡þ=ÏNNNNNNNNNNNNNNNNNNNNNN¡¡¡û######################################################################### ; ; BIOS FUNCTION TABLE ; ;####################### 0þINNNNNNNNNNNNNNNNN¡¡¡þ=e¦NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFUNCTION ; ENTRY- C= DRIVE # (E FOR FUNCTION CALL) ; EXIT - HL= DRIVER TABLE BASE PTR ; A, C= 0 ; ;+++++++++++++++++++++++§þ“NNNNNNNNNNNNNNNNN¡¡¡þ=ŠmNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++ EXIOPB: ; ; SET UP FOR CALL ; LD HL,DK_DSKX LD A,(DK_PROM) CAÎþNNNNNNNNNNNNNNNN¡¡¡þ="¬÷NNNNNNNNNNNNNNNNNNNNNN¡¡¡û40H DAA ; ; OUTPUT CHAR TO CONSOLE ; LD C,A CALL COC ; ; RETURN DATA ; POP AF RET ;********************ÿòNNNNNNNNNNNNNNNNN¡¡¡þ=(CþBNNNNNNNNNNNNNNNN¡¡¡þ="›ÇNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*********************************************************************** ; ; PRINTER DRIVER ; ENTRY- C= CHAR TO OUTPUT ; ;**¯õÿòNNNNNNNNNNNNNNNNN¡¡¡þ=(t NNNNNNNNNNNNNNNNNNNNNN¡¡¡û***************************************** GETMON: LD A,MR_RNUM OUT (M2_RSEL),A RET ;********************************§-þ'NNNNNNNNNNNNNNNNN¡¡¡þ=.ÞªNNNNNNNNNNNNNNNNNNNNNN¡¡¡û----------------------------------------------------------------- ITRAP: ; ; SAVE REGS FIRST ; PUSH AF PUSH HL PUSH ÁSþHNNNNNNNNNNNNNNNNN¡¡¡þ=¶NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û+++++++++++++++++++++++++ CLKCAL: LD HL,CLK_CAL ;ROM ENTRY POINT JR CLK2 ;++++++++++++++++++++++++++++++++++++++++++++MÅþNNNNNNNNNNNNNNNNN¡¡¡þ= '¹NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCLOCK IMAGE BUFR PTR (13 BYTES LONG) ; ;**************************************************************************** CLKSET: DþdNNNNNNNNNNNNNNNNN¡¡¡þ=ËNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ;SAVE RETURN VALUE CALL GETMON ;RESELECT MONITOR ROM ; POP AF ;RETURN VALUE RET IF P_CHAR OR P_ALL LIST ON X¶þ¼NNNNNNNNNNNNNNNN¡¡¡þ=a§NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++ CNSCK: IF USEMON CALL GETMON JP MR_CONSTS ELSE IN A,(NT_STAT) ;IþBNNNNNNNNNNNNNNNN¡¡¡þ=ŽlNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ NTOST: IN A,(NT_STAT) CPL ;REVERSE SENSE AND A,1 Sá þœNNNNNNNNNNNNNNNN¡¡¡þ=#¨öNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************************************** LO: IF USEMON CALL GETMON JP MR_LSTOUT EàÿÈNNNNNNNNNNNNNNNNN¡¡¡þ=)G=NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û******************************************** ; ; MESSAGE EDITOR ; ENTRY- HL= TEXT PTR (BIT 7= 1: TERMINATOR) ; EXIT - REGS= ±)þNNNNNNNNNNNNNNNNN¡¡¡þ=/í›NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBC ; ; SAVE CURRENT ROM & GET MONITOR ROM ; IN A,(M2_RSEL) LD (ROMSAV),A CALL GETMON ; ; PRINT PROMPT ; LD HL, `þ9NNNNNNNNNNNNNNNN¡¡¡þ=QåNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++ ; ; RETURN TIME FUNCTION 92H ; EXIT - A= SECONDS ; B= MINITS ; C= HOURS ; ;+++++++++++¢gþNNNNNNNNNNNNNNNNN¡¡¡þ= ¾.NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD C,CLK_F2 ; CLK1: LD HL,CLK_FUN ; CLK2: LD A,CLK_ROM ; ; FALL INTO ROM EXECUTER ; ENDIF LIST ON ;******* çþNNNNNNNNNNNNNNNNN¡¡¡þ=žRNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ELSE LIST OFF ENDIF SUBTTL CHAR I/O ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++0�þdNNNNNNNNNNNNNNNNN¡¡¡þ=q™NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûF DATA NOT READY THEN RETURN 0 AND A,1 SHL NT_READY TTOST1: RET Z LD A,-1 ;ELSE RETURN -1 RET ENDIF ;**********÷‰þBNNNNNNNNNNNNNNNN¡¡¡þ=Û?NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûHL NT_BUSY JR TTOST1 ENDIF ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; READEROþ“NNNNNNNNNNNNNNNNN¡¡¡þ=$1aNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLSE RET ENDIF ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN LIST DEVICE oþHNNNNNNNNNNNNNNNNN¡¡¡þ=*nNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û? ; ;**************************************************************************** EDITOR: LD C,(HL) ;MESSAGE EDIT LOOP PUS­�þ NNNNNNNNNNNNNNNNN¡¡¡þ=0þÖNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûITMSG IQCONT: CALL EDITOR ; LD HL,IQMSG ;QUERY USER CALL EDITOR ; ; GET & ECHO USER INPUT ; CALL CI ; PUSH AF ›þ$NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNnNNNNNNN�Ñ�Ÿ‚mƒ:„…Õ…£†p‡?ˆ ‰Ù‰¦Št‹AŒ�Ý�¬Žz�H�‘䑲’€“M”•é•¶–…—S˜!™ï™½šŒ›[œ)�÷�Æž•Ÿc 0¡ÿ¡Í¢›£h¤6¥¦Ò¦nNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>džNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLD C,A CALL COC POP AF ; ; IF OPTION IS CTRL-C THEN WARM BOOT ; CP A,3 ;IF CTRL-C THEN WARM BOOT JP Z,PAGE0 ; ; è"þ NNNNNNNNNNNNNNNNN¡¡¡þ>Î8NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;---------------------------------------------------------------------------- ILLINT: PUSH AF ;SAVE ALL 8080 REGS PUSH H]¡þNNNNNNNNNNNNNNNN¡¡¡þ> !óNNNNNNNNNNNNNNNNNNNNNN¡¡¡û################ IOPB: REPT PB_SIZE LIST OFF DB 0 LIST ON ENDM ;##################################################ÁfþBNNNNNNNNNNNNNNNN¡¡¡þ>�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û;############################################################################ HDPBK: DW 128 ;SECTORS PER TRACK (LOGICAL) (SPT)Cåþ„NNNNNNNNNNNNNNNN¡¡¡þ>îDNNNNNNNNNNNNNNNNNNNNNN¡¡¡û############################# ; ; START ON AN EVEN PAGE BOUNDARY ; IF $ AND 0FFH DS 100H - ($ AND 0FFH) ENDIF INTABLTþ$NNNNNNNNNNNNNNNNN¡¡¡þ>DâNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûITMSG DM CR,LF,'User' ILLIM DM CR,LF,'Ill.' IQMSG DM ' Int. Abort? (Y/N/I/M) - ' ENDIF IF P_DISK OR P_ALL LIST Ox'þ9NNNNNNNNNNNNNNNN¡¡¡þ>%®¼NNNNNNNNNNNNNNNNNNNNNN¡¡¡û######################## ; ; DPH STRUCTURE ; STRUCT -12 ; ; EXTENDED DPH DATA ; DPHSOFO DS 2 ;SECTOR OFFSET FOR THIñÁþHNNNNNNNNNNNNNNNNN¡¡¡þ>+�³NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûF OP_SYS = 3 DS 3 ;ADDITIONAL SCRATCH DPHMFO DS 1 ;MEDIA FLAG DPHDPBO DS 2 ;ADDRESS OF DPB DPHCSVO DS 2 ;ADDRESS OF DIRECTO5þNNNNNNNNNNNNNNNN¡¡¡þ>1ÍNNNNNNNNNNNNNNNNNNNNNN¡¡¡û IF OPTION IS YES THEN WARM BOOT ; AND A,5FH ;IGNORE CASE ; CP A,'Y' JP Z,PAGE0 ; ; IF OPTION IS INTERRUPT THEN EXþ$NNNNNNNNNNNNNNNNN¡¡¡þ>ÞNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL PUSH BC LD HL,ILLIM ;NOTIFY USER OF INT JR IQCONT SUBTTL INITIALIZED DATA IF P_DISK OR P_ALL LIST ON ELSQXþNNNNNNNNNNNNNNNN¡¡¡þ>t NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û########################## ; ; DEFAULT 8" FLOPPY DISK PARAMETER BLOCK ; IBM 3740 SINGLE DENSITY FORMAT ; ;#################àþœNNNNNNNNNNNNNNNN¡¡¡þ>˜NNNNNNNNNNNNNNNNNNNNNN¡¡¡û DB 5 ;BLOCK SHIFT FACTOR (BSH) DB 31 ;BLOCK MASK (BLM) DB 1 ;NULL MASK (EXM) DW 1015 ;DISK SIZE (CLUSTERS -1) pñþBNNNNNNNNNNNNNNNN¡¡¡þ>»NNNNNNNNNNNNNNNNNNNNNN¡¡¡û: REPT 7 ;1ST 7 ARE UNSUPPORTED LIST OFF DW ILLINT LIST ON ENDM IF P_INT OR P_ALL LIST ON ELSE LIST OFF ôçÿäNNNNNNNNNNNNNNNNN¡¡¡þ> QINNNNNNNNNNNNNNNNNNNNNN¡¡¡ûN ELSE LIST OFF ENDIF ;############################################################################ ; ; DRIVE DATA ê¸þ!NNNNNNNNNNNNNNNN¡¡¡þ>&ûïNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS DRIVE DPHWRTO DS 2 ;ADDRESS OF SECTOR WRITE DRIVER DPHRDO DS 2 ;ADDRESS OF SECTOR READ DRIVER DPHLOGO DS 2 ;ADDRESS OF LOGI·ØÿÂNNNNNNNNNNNNNNNN¡¡¡þ>,$NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRY CHECKSUMS BUFFER DPHALVO DS 2 ;ADDRESS OF CLUSTER ALLOCATION BIT MAP BUFFER DPHDIRBO DS 2 ;ADDRESS OF DIRECTORY BUFFER DPHLšÿòNNNNNNNNNNNNNNNN¡¡¡þ>üNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûECUTE RESTART 7 ; CP A,'I' JR NZ,ITRAP1 ; POP BC ;RESTORE REGS 1ST POP HL POP AF JP 0038H ; ; IF OPTION IS MOÇ'ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ> í7NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûE LIST OFF ENDIF ;############################################################################ ; ; 3740 SECTOR TRANSLAT¥ÔþHNNNNNNNNNNNNNNNNN¡¡¡þ>G‘NNNNNNNNNNNNNNNNNNNNNN¡¡¡û########################################################### SD8PBK: DW 26 ;SECTORS PER TRACK DB 3 ;BLOCK SHIFT FACTOR DB üèþ9NNNNNNNNNNNNNNNN¡¡¡þ>«)NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û(DSM) DW 1152 / 2 ;DIRECTORY MAX (DRM) DB 0FFH ;ALLOCATION 0 (AL0) DB 10000000B ;ALLOCATION 1 (AL1) DW 0 ;CHECK ºhþNNNNNNNNNNNNNNNNN¡¡¡þ>ˆ&NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ENDIF ; DW ITRAP ;INT 8 IS USER INTERRUPT LIST ON ;###############################################################'ÅÿÈNNNNNNNNNNNNNNNNN¡¡¡þ>!bxNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûSTRUCTURES POINTER TABLE ; ;############################################################################ DRV_PTRS: ; ALL_DPÕÿÈNNNNNNNNNNNNNNNNN¡¡¡þ>'ÈÞNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûN DRIVER (NOT USED AT THIS TIME) DPHINO DS 2 ;ADDRESS OF INIT DRIVER DPHDRVO DS 1 ;PHYSICAL DRIVE # ASSOCIATED WITH THIS LOGIC¡}þHNNNNNNNNNNNNNNNN¡¡¡þ>-'NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDTABO DS 2 ;ADDRESS OF DATA BUFFER CONTROL BLOCK DPHHSHO DS 2 ;ADDRESS OF DIRECTORY HASH TABLE BUFFER DPHHBNKO DS 1 ;BANK # OFVRþœNNNNNNNNNNNNNNNN¡¡¡þ>›kNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNITOR THEN EXECUTE MONITOR TRAP ; ITRAP1: CP A,'M' JR NZ,ITRAPR ; POP BC POP HL POP AF JP 0F824H ; ; ELSE RESTO*þNNNNNNNNNNNNNNNNN¡¡¡þ> ¸dNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûION TABLE ; **** CP/M SINGLE DENSITY **** ; ;############################################################################ X3ÍŠþBNNNNNNNNNNNNNNNNN¡¡¡þ>TÜNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û7 ;BLOCK MASK DB 0 ;NULL MASK DW 242 ;DISK SIZE -1 DW 63 ;DIRECTORY MAX DB 11000000B ;ALLOC 0 DB 0 ;ALLOC 1 DW -eþBNNNNNNNNNNNNNNNN¡¡¡þ>þzNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSIZE (CKS) DW 2 ;TRACK OFFSET (OFF) DB 0 ;PHYSICAL RECORD SHIFT FACTOR (PSH) DB 0 ;PHYSICAL RECORD MASK (PHM) DB>üþ^NNNNNNNNNNNNNNNNN¡¡¡þ>±NNNNNNNNNNNNNNNNNNNNNN¡¡¡û############# ; ; MESSAGES ; ;############################################################################ MSGLE: DM CR,L[þNNNNNNNNNNNNNNNN¡¡¡þ>"7+NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHP MACRO #D LIST ON DW D#D(DD)DPH LIST OFF ENDM ; DD DL 1 ; REPT NDRVS ALL_DPHP 0123456789ABCDEF DD DL DD +1 E“þ NNNNNNNNNNNNNNNNN¡¡¡þ>(ØàNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûAL DRIVE DPHTYPO DS 1 ;DRIVE TYPE BYTE ; ; REQUIRED (NORMAL) DPH DATA ; DPHXLTO DS 2 ;ADDRESS OF SECTOR TRANSLATION TABLEÇþ'NNNNNNNNNNNNNNNNN¡¡¡þ>.rFNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DIRECTORY HASH TABLE BUFFER ENDIF ; DPHSIZE EQU -DPHSOFO + $ ENDM ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@í$þ“NNNNNNNNNNNNNNNNN¡¡¡þ>¨ZNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRE REGS & RETURN ; ITRAPR: LD A,(ROMSAV) ;RESTORE ROM # OUT (M2_RSEL),A ; POP BC POP HL POP AF EI ;RE-ENABLE INÒoþNNNNNNNNNNNNNNNNN¡¡¡þ> ‹UNNNNNNNNNNNNNNNNNNNNNN¡¡¡û740: GXLATE 26,6 X3740D: GXLATE 26,6 XCCS: GXLATE 8,3 XCCSD: GXLATE 8,3 ;###############################################¹¯þNNNNNNNNNNNNNNNNN¡¡¡þ>gíNNNNNNNNNNNNNNNNNNNNNN¡¡¡û16 ;CHECK SIZE DW 2 ;TRACK OFFSET DB 0 ;PHYSICAL RECORD SHIFT FACTOR DB 0 ;PHYSICAL RECORD MASK DB 1 ;SKEW INDEX ÿÚþNNNNNNNNNNNNNNNNN¡¡¡þ>ÍKNNNNNNNNNNNNNNNNNNNNNN¡¡¡û 0 ;SKEW INDEX (NONE) IF P_INT OR P_ALL LIST ON ELSE LIST OFF ENDIF ;#####################################ÓuþNNNNNNNNNNNNNNNN¡¡¡þ>"€NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûF,'LOAD ERROR' ; DSKEM: DB CR,LF,'Disk Error Status:' DM CR,LF,'CM DR TL TH SL SH FG AL AH AX CL CH ST S1 S2 S3',CR,LF DSKEðøþNNNNNNNNNNNNNNNNN¡¡¡þ>#NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNDM IF P_DISK OR P_ALL LIST ON ELSE LIST OFF ENDIF ;#######################################################�SþINNNNNNNNNNNNNNNNN¡¡¡þ>)ëÑNNNNNNNNNNNNNNNNNNNNNN¡¡¡û (0 FOR DEBLOCKING) DS 6 ;SCRATCH IF OP_SYS = 2 DPHDIRBO DS 2 ;ADDRESS OF DIRECTORY BUFFER DPHDPBO DS 2 ;ADDRESS OF DPB aÃÿòNNNNNNNNNNNNNNNNN¡¡¡þ>/AwNNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE A DISK PARAMETER TABLE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ïøþ„NNNNNNNNNNNNNNNN¡¡¡þ>ý NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTERRUPTS RET ;---------------------------------------------------------------------------- ; ; UNSUPPORTED INTERRUPT ;#ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ> ÂNNNNNNNNNNNNNNNNNNNNNN¡¡¡û############################# ; ; COMMON I/O PARAMETER BLOCK ; ;############################################################’þNNNNNNNNNNNNNNNNNN¡¡¡þ>2¾NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;############################################################################ ; ; DEFAULT 8" HARD DISK PARAMETER BLOCK ; NIÿòNNNNNNNNNNNNNNNNN¡¡¡þ>ÝuNNNNNNNNNNNNNNNNNNNNNN¡¡¡û####################################### ; ; MODE 2 INTERRUPT VECTOR TABLE ; ;###############################################HþNNNNNNNNNNNNNNNN¡¡¡þ>wÓNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûB: DM CR,LF,'Abort, Ignore, Retry, (BDOS) - ' ; IF INTCPTS ISCMSG: DM CR,LF,'ILL SYS CALL, #= ' ENDIF IF INTRPTS "ÆþNNNNNNNNNNNNNNNNN¡¡¡þ>$��NNNNNNNNNNNNNNNNNNNNNN¡¡¡û##################### ; ; DRIVE PARAMETER HEADER AREA ; 1 PER DRIVE ; ;####################################################YÇþNNNNNNNNNNNNNNNNN¡¡¡þ>*¾‚NNNNNNNNNNNNNNNNNNNNNN¡¡¡û DPHCSVO DS 2 ;ADDRESS OF DIRECTORY CHECKSUMS BUFFER DPHALVO DS 2 ;ADDRESS OF CLUSTER ALLOCATION BIT MAP BUFFER ENDIF I�|þÉNNNNNNNNNNNNNNNNN¡¡¡þ>0R:NNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@ ALLDPH: MACRO #N,#SOFF,#WD,#RD,#LD,#ID,#PD,#DT,#CKS LIST ON DW #SOFF ;;SECTOR OFFSET DW #WD -þ$NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNBNNNNþ€Ì�š‚gƒ5„…Ñ…Ÿ†l‡:ˆ‰Ö‰£Šq‹>Œ �Ú�¨Žv�D�‘à‘®’{“I”•䕱–—L˜™è™¶š„›Rœ �î�»ž‰ŸW $¡ó¡Á¢�£\¤*¥ø¥Æ¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ>S®NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;;WRITE DRVR DW #RD ;;READ DRVR DW #LD ;;LOGIN DRVR DW #ID ;;INIT DRVR DB #PD ;;PHYSICAL DRIVE # DB #DT D#NDPH: „÷þINNNNNNNNNNNNNNNNN¡¡¡þ>ùNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûALLDPH 0,0,H8_WR,H8_RD,0,0,4,10H,0 ALLDPH 1,80H,H8_WR,H8_RD,0,0,4,10H,0 ALLDPH 2,0,H8_WR,H8_RD,0,0,5,10H,0 ALLDPH 3,80H,H8Ý}þ NNNNNNNNNNNNNNNN¡¡¡þ> ÃNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û###################################################### ; ; THE FOLLOWING ITEMS ARE SET BY THE BIOS FUNCTIONS ; SEK_DSK: DSržþ„NNNNNNNNNNNNNNNN¡¡¡þ>6¿NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRACK UNA_SEC: DS 2 ;LAST UNALLOC SECTOR ; ; ER_FLAG: DS 1 ;ERROR REPORTING 0: OK, /0: ERROR RS_FLAG: DS 1 ;0: NO PREREXþÿòNNNNNNNNNNNNNNNN¡¡¡þ>ÙtNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPTR CUR_XLAT DS 2 ;XLATION TABLE PTR (0: NONE) CUR_SOFF DS 2 ;SECTOR OFFSET FOR DRIVE CUR_DRV DS 1 ;CURRENT PHYSICAL DRIVE # Ã�þNNNNNNNNNNNNNNNNN¡¡¡þ>sÒNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;ALLOCATION BIT MAP FOR 8" DRIVE #D(DD) D#D(DD)CHK DS 32 ;DIRECTORY CHECKSUMS STORAGE (1 BYTE PER SECTOR) ENDIF LIST nõþ¹NNNNNNNNNNNNNNNN¡¡¡þ>%™ŒNNNNNNNNNNNNNNNNNNNNNN¡¡¡û8K= 7, 16K= 15 ; DSM > 255 : 2K= 0, 4K= 1, 8K= 3, 16K= 7 DPBDSMO DS 2 ;DSM- DRIVE STORAGE SIZE (IN CLUSTERS) ; INT(((#_TÎ6þNNNNNNNNNNNNNNNNN¡¡¡þ>+ºƒNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûEED THIS BYTE ; DPBSKWO DS 1 ;SKW- SKEW INDEX ; 0: NONE, 1:3740, 2:DS3740, 3:CCS1K, 4:DSCCS1K ; DPBSZ DS 0 ENDM ; ; Êåþ!NNNNNNNNNNNNNNNN¡¡¡þ>ýNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;;DRIVE PARAMETER HEADER FOR DRIVE #D(DD) DW 0 ;;SECTOR TRAN TBL (OR 0 IF NO XLATE) DW 0,0,0 ;;SCRATCH AREA DW DIRBF xþHNNNNNNNNNNNNNNNNN¡¡¡þ>é6NNNNNNNNNNNNNNNNNNNNNN¡¡¡û_WR,H8_RD,0,0,5,10H,0 ALLDPH 4,0,F8_WR,F8_RD,0,0,0,0,D4CHK ALLDPH 5,0,F8_WR,F8_RD,0,0,1,0,D5CHK ELSE IF BOOT < 30H 2=þNNNNNNNNNNNNNNNN¡¡¡þ>C�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û 1 ;LOGICAL DRIVE SEK_TRK: DS 2 ;LOGICAL TRACK NUMBER SEK_SEC: DS 2 ;LOGICAL SECTOR NUMBER ; ; THE FOLLOWING ARE SET CÚþ¼NNNNNNNNNNNNNNNN¡¡¡þ>¯(NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûAD REQ'D, /0: PREREAD REQ'D READ_OP: DS 1 ;0: WRITE OPERATION, 1: READ OPERATION WR_TYPE: DS 1 ;WRITE OPERATION TYPE FROM BDOˆþ„NNNNNNNNNNNNNNNN¡¡¡þ>Œ'NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;############################################################################ ; ; DRIVE ALLOCATION AREAS ; ;#########²ôþÉNNNNNNNNNNNNNNNNN¡¡¡þ> fyNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOFF ENDM ; ; RESERVE THE DATA SPACE ; DD DL 1 REPT NDRVS LIST OFF ALLDAL 0123456789ABCDEF DD DL DD + 1 LIST ON _þœNNNNNNNNNNNNNNNN¡¡¡þ>&ÌßNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRACKS - OFF) * SPT * BYTES PER SECTOR) / CLUSTER SIZE) -1 DPBDRMO DS 2 ;DRM- DIRECTORY SIZE -1 DPBAL0O DS 2 ;AL0,1- DIRECTORY ?ÈþœNNNNNNNNNNNNNNNN¡¡¡þ>,#NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE THE DPB FOR DRIVE MACRO ; ;@@@@@ZRþ9NNNNNNNNNNNNNNNN¡¡¡þ>5ÌNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ;;DIRECTORY BUFFER PTR DW D#DDPB ;;DRIVE PARAMETER BLK PTR DW #CKS ;;NO CHECKS ON HARD DISK DW D#DALL ;;DRIVE CLUSTER /þ$NNNNNNNNNNNNNNNNN¡¡¡þ> ÚNNNNNNNNNNNNNNNNNNNNNN¡¡¡û;5" FLOPPY BOOT ALLDPH 0,0,F8_WR,F8_RD,0,0,0,0,D0CHK ALLDPH 1,0,F8_WR,F8_RD,0,0,1,0,D1CHK ALLDPH 2,0,H8_WR,H8_RD,0,0,4,10H4›ÿóNNNNNNNNNNNNNNNNN¡¡¡þ>p¡NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBY THE BUFFER READ/WRITE ; HST_DSK: DS 1 ;BUFFER DISK NUMBER HST_TRK: DS 2 ;BUFFER TRACK NUMBER HST_SEC: DS 2 ;BUFFER SECØkþNNNNNNNNNNNNNNNN¡¡¡þ>œNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOS: ; 0: WRITE TO ALLOCATED (USED) BLOCK (PREREAD) ; 1: WRITE TO DIRECTORY (PREREAD & WRITE) ; 2: WRITE TO UNALLOÎ3ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ>¿NNNNNNNNNNNNNNNNNNNNNN¡¡¡û################################################################### ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@�¶þHNNNNNNNNNNNNNNNNN¡¡¡þ>!UHNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ENDM ;############################################################################ ; ; RESERVE DRIVE PARAMETER BLOCKS=þ^NNNNNNNNNNNNNNNNN¡¡¡þ>'ÿîNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûALLOCATION ; 1 MSB PER DIRECTORY CLUSTER ALLOCATED DPBCKSO DS 2 ;CKS- # DIRECTORY SECTORS CHECKED ; (DRM +1) / 4 DPBOF}þ$NNNNNNNNNNNNNNNN¡¡¡þ>-%NNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ALLDPB: MACRO #D LIST ON D#D(DD)DPB: DS DPBSZ ;ALLOÃAþ9NNNNNNNNNNNNNNNN¡¡¡þ>¬[NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûALLOCATION BIT MAP PTR LIST OFF ENDM ; ; DEFINE THE DATA ; IF BOOT < 10H ;8" FLOPPY BOOT ALLDPH 0,0,F8_WR,F8_RNþNNNNNNNNNNNNNNNN¡¡¡þ> �TNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û,0 ALLDPH 3,80H,H8_WR,H8_RD,0,0,4,10H,0 ALLDPH 4,0,H8_WR,H8_RD,0,0,5,10H,0 ALLDPH 5,80H,H8_WR,H8_RD,0,0,5,10H,0 ENDIF ªíÿòNNNNNNNNNNNNNNNNN¡¡¡þ>cìNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûTOR NUMBER ; ; SEK_HST: DS 2 ;PHYSICAL SECTOR TO XFER ; ; FLAGS ; HST_ACT: DS 1 ;0: BUFFER FLUSHED, /0: DATA IN BUF2þNNNNNNNNNNNNNNNN¡¡¡þ>ÉJNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCATED (UNUSED) BLOCK (NO ; PREREAD REQ'D) DMA_ADR: DS 2 ;LAST DMA ADDRESS DMA_BNK DS 1 ;LAST DMA BANK ; HST_BUF: DS 1U¿þ�NNNNNNNNNNNNNNNNN¡¡¡þ>&�NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û@@@@@@@@@@@@@@@@@@@@ ; ; MACRO TO DEFINE THE DRIVE ALLOCATION & CHECKSUMS AREA ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@N§þBNNNNNNNNNNNNNNNN¡¡¡þ>"NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ;############################################################################ STRUCT 0 DPBSPTO DS 2 ;SPT- SECTORS/TRACK à¹þ NNNNNNNNNNNNNNNNN¡¡¡þ>(ïÐNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûFO DS 2 ;OFF- # RESERVED TRACKS (USUALLY 2) ; ; ADDITIONAL CP/M 3.0 DATA (ALSO COULD BE USED BY CP/M 2.2 DEBLOCKING) ; DPBH�þNNNNNNNNNNNNNNNNN¡¡¡þ>.EvNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCATION FOR DRIVE #D(DD) LIST OFF ENDM ; ; RESERVE THE DATA SPACE ; DD DL 1 REPT NDRVS LIST OFF ALLDPB 0123456789¡þ'NNNNNNNNNNNNNNNNN¡¡¡þ>ŸjNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD,0,0,0,0,D0CHK ALLDPH 1,0,F8_WR,F8_RD,0,0,1,0,D1CHK ALLDPH 2,0,H8_WR,H8_RD,0,0,4,10H,0 ALLDPH 3,80H,H8_WR,H8_RD,0,0,4,10Hv~ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ> ¼eNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ENDIF ENDIF LIST ON ; ; LAST OF INITIALIZED CODE READ FROM DISK ; BIOSND EQU $ SUBTTL UNINITIALIZED DATA A"©þNNNNNNNNNNNNNNNNN¡¡¡þ>PÝNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFER HST_WRT: DS 1 ;0: BUFFER CLEAN, /0: BUFFER DIRTY (MODIFIED) ; ; THE FOLLOWING USED BY THE UNALLOCATED BLOCK ALGORITHËFþ!NNNNNNNNNNNNNNNN¡¡¡þ>ú{NNNNNNNNNNNNNNNNNNNNNN¡¡¡û024 ;HOST BUFFER LOGRQ: DS 1 ;LOG ON REQUEST REG. ROMSAV DS 1 ;ROM SWAP SAVE OF ORIGINAL ROM ; ; CURRENT DRIVE DATA ¢�þBNNNNNNNNNNNNNNNN¡¡¡þ>°NNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ALLDAL: MACRO #D LIST ON IF ((DD - 1) >= STHD) AND ((DD - 1) <= NDHD) D#D(DD)ALL: DS êµþœNNNNNNNNNNNNNNNN¡¡¡þ>#3*NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û DPBBSHO DS 1 ;BSH- BLOCK SHIFT FACTOR DETERMINED BY CLUSTER SIZE ; 1K= 3, 2K= 4, 4K= 5, 8K= 6, 16K= 7 DPBBLMO DS 1 ;BLM- B¶˜þ“NNNNNNNNNNNNNNNNN¡¡¡þ>)ÜáNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûPSHO DS 1 ;PSH- PHYSICAL RECORD SHIFT FACTOR BASED ON BYTES/SEC ; 0: 128, 1: 256, 2: 512, 3: 1024 DPBPHMO DS 1 ;PHM- PHYSIC9ÿäNNNNNNNNNNNNNNNNN¡¡¡þ>/vGNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûABCDEF DD DL DD + 1 LIST ON ENDM IF $ >= 0F800H CONMSG **** BIOS TOO BIG, USE MOVCPM & RE-ADJUST! **** ENDIF fhþBNNNNNNNNNNNNNNNN¡¡¡þ>Ê9NNNNNNNNNNNNNNNNNNNNNN¡¡¡û,0 ALLDPH 4,0,H8_WR,H8_RD,0,0,5,10H,0 ALLDPH 5,80H,H8_WR,H8_RD,0,0,5,10H,0 ELSE IF BOOT < 20H ;8" HARD DISK BOOT ëýþNNNNNNNNNNNNNNNNNN¡¡¡þ> %òNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûREA ;############################################################################ ; ; VARIABLES ; ;######################ãÌþNNNNNNNNNNNNNNNNNN¡¡¡þ>ŽNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûMS ; UNA_CNT: DS 1 ;# SECTORS REMAINING IN BLOCK (CLUSTER) UNA_DSK: DS 1 ;LAST UNALLOC DISK UNA_TRK: DS 2 ;LAST UNALLOC T·Šþ NNNNNNNNNNNNNNNNN¡¡¡þ>êENNNNNNNNNNNNNNNNNNNNNN¡¡¡û; CUR_DPH DS 2 ;DPH PTR CUR_DPB DS 2 ;DPB PTR CUR_BCB DS 2 ;BCB PTR CUR_RD DS 2 ;READ DRIVER PTR CUR_WR DS 2 ;WRITE DRIVER Hþ„NNNNNNNNNNNNNNNN¡¡¡þ>@ãNNNNNNNNNNNNNNNNNNNNNN¡¡¡û127 ;ALLOCATION BIT MAP FOR 8" HARD DRIVE #D(DD) ENDIF IF ((DD - 1) >= ST8FD) AND ((DD - 1) <= ND8FD) D#D(DD)ALL: DS 57kþHNNNNNNNNNNNNNNNNN¡¡¡þ>$ª½NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLOCK MASK ; 1K = 7, 2K= 15, 4K= 31, 8K= 63, 16K= 127 DPBEXMO DS 1 ;EXM- EXTENT MASK ; DSM < 256 : 1K= 0, 2K= 1, 4K= 3, ÃSþNNNNNNNNNNNNNNNNN¡¡¡þ>*‰²NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAL RECORD MASK BASED ON BYTES/SEC ; 0: 128, 1: 256, 3: 512, 7: 1024 ; ; ADDITIONAL UNIQUE DATA. HOPE CP/M 4.X DOES NOT NLþNNNNNNNNNNNNNNNNN¡¡¡þ>0e NNNNNNNNNNNNNNNNNNNNNNþ€¡¡¡û END ͨþHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNnNNNNNNN�Ñ�Ÿ‚lƒ9„…Õ…£†q‡@ˆ‰Û‰¨Šv‹DŒ�ß�®Ž|�I�‘æ‘´’�“N”•ê•·–…—S˜!™ï™½š‹›Yœ&�ô�Þ’Ÿ` -¡û¡É¢—£d¤2¥¦Î¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?*NNNNNNNNNNNNNNNNNNNNNN¡¡¡û/**************************************************************************** M5b BIOS Function Call Utility ************_€ÿùNNNNNNNNNNNNNNNNN¡¡¡þ?¸ŒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûfdptr, *bytptr, *temp_p, /* Temporary ptr */ *cbptr; /* Ptr to command block array elements */ char *gets(), /* TeØJÿòNNNNNNNNNNNNNNNN¡¡¡þ? WGNNNNNNNNNNNNNNNNNNNNNN¡¡¡û */ BYTE pb_dmax;/* Unused dma extended address */ /* Argument in, Return value out */ WORD pb_bcnt; /* Xfer count */ /* RÐþ!NNNNNNNNNNNNNNNN¡¡¡þ?w;NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û/ WORD fov_fmt; /* Format table ptr */ WORD fov_fsz; /* Format section byte count */ WORD fov_prt; /* Controller port # */»@þNNNNNNNNNNNNNNNN¡¡¡þ?˜ðNNNNNNNNNNNNNNNNNNNNNN¡¡¡û***********************************************************************/ main () { /* Display signon */ printf(signon); “‘þNNNNNNNNNNNNNNNNN¡¡¡þ?2VNNNNNNNNNNNNNNNNNNNNNN¡¡¡û("\n\n\ Command Options:\n\ 0 Display BIOS Version\n\ 1 Display monitor drive number assigned to CP/M drive\n\ 2 DisabįþNNNNNNNNNNNNNNNN¡¡¡þ?%ØNNNNNNNNNNNNNNNNNNNNNN¡¡¡û break; case '2': /* disable logon */ if ( (cpui.BC = get_drv()) < 0) break; cpui.AF = 2 << 8; bf_exec(~¢ÿÎNNNNNNNNNNNNNNNNN¡¡¡þ?+ûNNNNNNNNNNNNNNNNNNNNNN¡¡¡û fcb_ptr = srch_fst(); if (fcb_ptr == -1) { printf("\nNo Format Overlays Found... Aborting!"); M—þ9NNNNNNNNNNNNNNNN¡¡¡þ?GyNNNNNNNNNNNNNNNNNNNNNN¡¡¡û***************************************************************** Known bugs: ***************************************’UþNNNNNNNNNNNNNNNNN¡¡¡þ?¨²NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûll cc that this is a char ptr */ *toupper(), *cptr, /* User command text ptr */ tbuf[80]; /* Input buffer */ WORD ½Íþ“NNNNNNNNNNNNNNNN¡¡¡þ?NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûeturn values */ BYTE pb_sts; /* Command result status */ BYTE pb_st1; /* fdc status if pb_mod == 0x1f */ BYTE pb_st2; /* r’þœNNNNNNNNNNNNNNNN¡¡¡þ?î¬NNNNNNNNNNNNNNNNNNNNNN¡¡¡û } *fmt_buf, /* Ptr to the structure */ *fov_p; /* Format overlay file data ptrs */ struct { BYTE fil_name[11]; bÜþ9NNNNNNNNNNNNNNNN¡¡¡þ?Í£NNNNNNNNNNNNNNNNNNNNNN¡¡¡û /* Initialize data */ cpui.AF = (MF_GBNK) << 8; /* get current bank # */ farcall( (WORD) MR_FUN, 0, &cpui, &cpui); ëþNNNNNNNNNNNNNNNNN¡¡¡þ? 'ýNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûle dynamic format selection (LOGON)\n\ 3 Enable dynamic format selection\n\ 4 Set disk format\n\ \n\ ^C Exit to DOS\n\ þNNNNNNNNNNNNNNNNN¡¡¡þ?&�[NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û); break; case '3': /* enable logon */ if ( (cpui.BC = get_drv()) < 0) break; cpui.AF = 3 << 8; "þNNNNNNNNNNNNNNNNNN¡¡¡þ?,b�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û exit(1); } for (i = 0; i < 64 && fcb_ptr != -1; i++, file_bp += 11) { movmem( (txþyNNNNNNNNNNNNNNNN¡¡¡þ?tHNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************** Revision History: 0.0 - 10-31-90 grh First cut. Extracted from Format.c v2.01b.ÈáÿÈNNNNNNNNNNNNNNNNN¡¡¡þ? ›ƒNNNNNNNNNNNNNNNNNNNNNN¡¡¡û a, n_ents, /* Number of format track table entries */ *fmt_tblp, /* Format table ptr */ *trk_fmtp, /* Track format data QÉþgNNNNNNNNNNNNNNNNN¡¡¡þ?1%NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûeturned value #1 */ BYTE pb_st3; /* returned value #2 */ } cmd_blk, liopb; #define pb_fnskb 0x01 /* Inhibit implied seek flÇäþ„NNNNNNNNNNNNNNNN¡¡¡þ?Ý�NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û/* FCB filename */ char fil_txt[]; /* File text description */ } *fov_file, /* Base ptr to array */ *fov_ptr[64]; /* PojÿÎNNNNNNNNNNNNNNNNN¡¡¡þ?þ’NNNNNNNNNNNNNNNNNNNNNN¡¡¡û this_bnk = cpui.AF >> 8; /* drive = -1; Assume no controller */ cmd_blk.pb_sts = -1; /* Force error if not access_¶þNNNNNNNNNNNNNNNNNN¡¡¡þ?!ÌNNNNNNNNNNNNNNNNNNNNNN¡¡¡û \n\ Enter Command # - "); /**** Fetch command */ gets(tbuf); switch (tbuf[0]) { case '0': /* disæ&þ�NNNNNNNNNNNNNNNNN¡¡¡þ?'¾jNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û bf_exec(); break; case '4': /* set disk format */ /******* Request drive for overlays */ f_cþ�NNNNNNNNNNNNNNNN¡¡¡þ?-Q¡NNNNNNNNNNNNNNNNNNNNNN¡¡¡û(BYTE *) fcb_ptr) + 1, file_bp, 11); fov_ptr[i] = file_bp; fcb_ptr = srch_nxt(); } XÔþBNNNNNNNNNNNNNNNN¡¡¡þ?íßNNNNNNNNNNNNNNNNNNNNNN¡¡¡û */ #define signon "\nM5b BIOS Function Test Utility Vers. 0.0\n" /*************************************************ÍöÿÎNNNNNNNNNNNNNNNNN¡¡¡þ? ÎÐNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûptr */ fmt_len; /* Length of format table */ int i, d, j, temp, c; unsigned int utemp, cnt; FILE *iñ*ÿÂNNNNNNNNNNNNNNNNN¡¡¡þ?"hNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûag mask */ #define pb_fmtd 0x20 /* Format drive option */ #define pb_inhx 0x40 /* Inhibit data xfer to host flag mask */ #def#þœNNNNNNNNNNNNNNNN¡¡¡þ?ˆÎNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûtrs to each file data */ BYTE *file_bp; /* Ptr into array */ unsigned int max_files; /* max files found */ /* CP/M šþ$NNNNNNNNNNNNNNNNN¡¡¡þ?gNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûed */ /* Allocate heap buffer */ file_bp = fov_file = malloc(7000); /* Allocate Filename buffer */ if (fov_file == 0)IþNNNNNNNNNNNNNNNN¡¡¡þ?"AŸNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûplay BIOS version */ cpui.AF = 0; if (bf_exec() < 0) break; printf("\nBIOS Version = %d.%2d\n", cpui.HL / 100, cpui.HÍ9ÿòNNNNNNNNNNNNNNNNN¡¡¡þ?(®TNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûb.f_driv = 0; /* assume default */ printf("\n\ Enter drive letter containing format database files {A..P} - "); þ'NNNNNNNNNNNNNNNNN¡¡¡þ?.òNNNNNNNNNNNNNNNNNNNNNN¡¡¡û max_files = i; if (i < 63) fov_ptr[i] = -1; for (i = 0; i < max_files; i++ ) { if ( get_,þ“NNNNNNNNNNNNNNNNN¡¡¡þ?ÞîNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û***************************/ #include stdio.h #include ctype.h #include io.h #include farcall.h #include b:m5zf200.h ã™ÿÈNNNNNNNNNNNNNNNNN¡¡¡þ? ýáNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûnfile, *fopen(); /* IOPB definitions */ struct cb { /* Arguments */ BYTE pb_cmd; /* command */ BYTE pb_drv; /* d…ÄþNNNNNNNNNNNNNNNNN¡¡¡þ?YNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûine pb_fnrb 0x80 /* Inhibit retries flag mask */ /* Format overlay header data */ struct { WORD fov_txt; /* Text ptrnþœNNNNNNNNNNNNNNNN¡¡¡þ?»ÿNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFile Control Block */ struct fcb *srch_fst(), *srch_nxt(), f_cb, *fcb_ptr; /* farcall registers */ struct regs šÿÂNNNNNNNNNNNNNNNN¡¡¡þ?T4NNNNNNNNNNNNNNNNNNNNNN¡¡¡û { puts("\nInsufficient Memory...Aborting!"); exit(1); } (BYTE *) fmt_buf = ((BYTE *) fov_file) + 5976)�þNNNNNNNNNNNNNNNNNN¡¡¡þ?#r®NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL % 100); break; case '1': /* display monitor drive # */ if ( (cpui.BC = get_drv()) < 0) break; c(\þ“NNNNNNNNNNNNNNNNN¡¡¡þ?)�eNNNNNNNNNNNNNNNNNNNNNN¡¡¡û gets(tbuf); if ( *tbuf != '\0') f_cb.f_driv = ( toupper( *tbuf) - 'A' + 1); /******* Read directory */ D„þ NNNNNNNNNNNNNNNNN¡¡¡þ?/7ÃNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûfov( &f_cb, fov_ptr[i] ) != 0) { printf("\nOverlay read error... aborting!"); exit(1); } /********¬°þ„NNNNNNNNNNNNNNNN¡¡¡þ?‹½NNNNNNNNNNNNNNNNNNNNNN¡¡¡û BYTE this_bnk, /* Location of our memory bank */ fbuf[1024], /* Format data buffer */ sbuf[1024], /* Sector buffer */ *ˆ¥þ'NNNNNNNNNNNNNNNNN¡¡¡þ? dvNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûrive */ WORD pb_trk; /* track */ WORD pb_sec; /* sector */ BYTE pb_flags; /* flags */ WORD pb_dma; /* Unused dma addressÖþNNNNNNNNNNNNNNNNNN¡¡¡þ?D NNNNNNNNNNNNNNNNNNNNNN¡¡¡û */ WORD fov_tsz; /* Byte count of text */ WORD fov_idp; /* ID Sector image ptr */ WORD fov_ids; /* ID Sector byte count *uRþNNNNNNNNNNNNNNNNN¡¡¡þ?«ÁNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û cpui, cpuo; /**************************************************************************** main program *****šéþrNNNNNNNNNNNNNNNN¡¡¡þ?gNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; /* Allocate format overlay buffer */ /* Top of command loop */ while (TRUE) { /**** Display Options */ printfÿÈNNNNNNNNNNNNNNNNN¡¡¡þ?$ë9NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûpui.AF = 1 << 8; if (bf_exec() < 0 ) break; printf("\nMonitor Drive for this CP/M drive = %u\n", cpui.AF >> 8); o†þNNNNNNNNNNNNNNNNN¡¡¡þ?*È6NNNNNNNNNNNNNNNNNNNNNN¡¡¡û for (i = 0, cptr = &f_cb.f_name[0]; i < 8; i++) *cptr++ = '?'; *cptr++ = 'F'; *cptr++ = 'O'; *cptr = 'V'; äMþNNNNNNNNNNNNNNNNN¡¡¡þ?0$ŽNNNNNNNNNNNNNNNNNNNNNN¡¡¡û** Insert text */ cnt = fmt_buf -> fov_tsz; file_bp = ((BYTE *) fov_ptr[i]) + 11; movmem(†XþHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN8NNNNþ€Ì�™‚fƒ3„…Î…œ†i‡7ˆ‰Ñ‰ŸŠm‹:Œ�Õ�¤Žr�@�‘Ü‘ª’x“F”•á•®–}—K˜™ç™µšƒ›Qœ�ì�¹ž‡ŸV $¡ò¡À¢Ž£[¤)¥÷¥Å¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ?%NNNNNNNNNNNNNNNNNNNNNN¡¡¡û file_bp, &file_bp[cnt], 5975 - cnt - (file_bp - ((BYTE *) fov_file) ) ); bytptr = fmt_buf; mo†þNNNNNNNNNNNNNNNNN¡¡¡þ?�¼NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSet changed flag */ } } } /******* Display formats */ for (i = j = 0; i < max_filH7þ NNNNNNNNNNNNNNNN¡¡¡þ? `wNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûif (*cptr == '\0') putchar(' '); else putchar(*cptr); } printf(" - %s", &fov_ptr[i] -> fil_tx¡üþ„NNNNNNNNNNNNNNNN¡¡¡þ?@ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûfunction arguments */ cpui.BC = get_drv(); /* drive # */ cpui.DE = this_bnk; cpui.HL = &sbuf; /* ID sectÂYþrNNNNNNNNNNNNNNNN¡¡¡þ?¯ÀNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û************************/ int get_fov(f_cb, fnp) struct fcb *f_cb; BYTE *fnp; { int i, rv; BYTE *bp; /* InsertpoþäNNNNNNNNNNNNNNNNN¡¡¡þ?fNNNNNNNNNNNNNNNNNNNNNN¡¡¡û***********************************/ get_drv() { /* Stay in loop until valid data given */ while (TRUE) { /**** RequešfþNNNNNNNNNNNNNNNN¡¡¡þ?%ï8NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û*****************************************************/ dmp_fcb(f_cb) struct fcb *f_cb; { int i; char *cp; printf(ËÐþNNNNNNNNNNNNNNNNNN¡¡¡þ?+Ì7NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûffer ptr to directory segment */ bdos( SETDMA, Wrkbuf); /* Search the directory */ r = bdos( SRCHFL, &f_cb); reAÂþœNNNNNNNNNNNNNNNN¡¡¡þ?pINNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûvmem( &bytptr[fmt_buf -> fov_txt], file_bp, cnt); /********** Adjust ptrs */ for (j = i + 1; j < max_files; j++)ÉJþ�NNNNNNNNNNNNNNNNN¡¡¡þ?Ÿ‚NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûes; i++, j++) { if (j == 0) printf("\n\033E\ -------------------------- Format Directory -----------------------òâþNNNNNNNNNNNNNNNN¡¡¡þ?5$NNNNNNNNNNNNNNNNNNNNNN¡¡¡ût ); } printf("\nEnter selection - "); gets(tbuf); temp = atoi(tbuf); /******* GotcTþBNNNNNNNNNNNNNNNN¡¡¡þ?ÙœNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûor buffer */ cpui.AF = 4 << 8; printf("\nID at %04x", &sbuf); temp = bf_exec(); if (temp != 0 && temp > I¡þrNNNNNNNNNNNNNNNN¡¡¡þ?ú“NNNNNNNNNNNNNNNNNNNNNN¡¡¡û file name */ movmem(fnp, f_cb -> f_name, 11); /* Init fcb */ f_cb->f_ext = f_cb->f_resv[0] = f_cb->f_resv[1] = f_cb->f9}þINNNNNNNNNNNNNNNNN¡¡¡þ? ÍNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûst drive data */ printf("\nEnter CP/M Drive {A..P} (X: abort) - "); gets(tbuf); tbuf[0] = toupper(tbuf[0]);[šþNNNNNNNNNNNNNNNN¡¡¡þ?&ºkNNNNNNNNNNNNNNNNNNNNNN¡¡¡û"\n%2x ", f_cb -> f_driv ); for (i = 0, cp = &f_cb -> f_name; i < 8; i++, cp++ ) { if (*cp == '\0') putchar(' '); Ù›þœNNNNNNNNNNNNNNNN¡¡¡þ?,U NNNNNNNNNNNNNNNNNNNNNNþ€¡¡¡ûturn (r < 4) ? (Wrkbuf + (r << 5 )) : -1; } /**************************************************************************Höþ9NNNNNNNNNNNNNNNN¡¡¡þ?CxNNNNNNNNNNNNNNNNNNNNNN¡¡¡û { fov_ptr[j] = ((BYTE *) fov_ptr[j]) + cnt; } } /******* Sort the files */ for (d =ŠEÿÈNNNNNNNNNNNNNNNNN¡¡¡þ? ¬³NNNNNNNNNNNNNNNNNNNNNN¡¡¡û-----"); if (j == 20) { printf("\n\n\ Space for additional, '-' to back up, # to select - "); 4kÿÈNNNNNNNNNNNNNNNNN¡¡¡þ?NNNNNNNNNNNNNNNNNNNNNN¡¡¡û selection, read format overlay */ if (get_fov(&f_cb, fov_ptr[temp - 1 ]) != 0) { printf("Cannot read overlay...[¡ÿòNNNNNNNNNNNNNNNN¡¡¡þ?ê­NNNNNNNNNNNNNNNNNNNNNN¡¡¡û0) printf("\nError - %x", temp); break; /******* Unrecognized command */ default: printf("ComòYÿÎNNNNNNNNNNNNNNNNN¡¡¡þ?É¢NNNNNNNNNNNNNNNNNNNNNN¡¡¡û_rc = f_cb->f_cr = 0; /* Open the fcb */ rv = bdos(OPNFIL, f_cb); if (rv == 0xff) return rv; /* Read the file */ ˆ–þHNNNNNNNNNNNNNNNNN¡¡¡þ?!#üNNNNNNNNNNNNNNNNNNNNNN¡¡¡û /**** If abort requested then return -1 */ if (tbuf[0] == 'X') return -1; /**** Else if valid drive letter then dþgNNNNNNNNNNNNNNNNN¡¡¡þ?'‰ZNNNNNNNNNNNNNNNNNNNNNN¡¡¡û else putchar(*cp); } putchar('.'); for ( ; i < 11; i++, cp++ ) { if (*cp == '\0') putchar(' '); ïðþNNNNNNNNNNNNNNNN¡¡¡þ?-f‘NNNNNNNNNNNNNNNNNNNNNN¡¡¡û** Search for next directory match Assumes f_cb has proper search name Returns ptr to directory fcb data (-1 = not found@†þNNNNNNNNNNNNNNNN¡¡¡þ?ÚïNNNNNNNNNNNNNNNNNNNNNN¡¡¡û TRUE; d == TRUE; ) { d = FALSE; /* Assume sorted */ for (i = 0; i < (max_files - 1); i++) { Ã5þ!NNNNNNNNNNNNNNNN¡¡¡þ? ùàNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û c = getchar(); if (c == '-') { j -= 20; i -= 20; } else if (c == ' ')iÝÿÂNNNNNNNNNNNNNNNNN¡¡¡þ?XNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûaborting!"); exit(1); } /******* Transfer ID sector data to sector buffer */ setmem(&sbuf, 1024, 0); fdptr ECþNNNNNNNNNNNNNNNN¡¡¡þ?¿þNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûmand Not Implemented! Try again."); break; } } /* Done. */ exit(0); } /************þ'NNNNNNNNNNNNNNNNN¡¡¡þ?P5NNNNNNNNNNNNNNNNNNNNNN¡¡¡û for (bp = fmt_buf, rv = 0, i = 1024; i > 0 && rv == 0; i -= 128, bp += 128 ) { bdos( SETDMA, bp); rv = bdosûàÿÂNNNNNNNNNNNNNNNN¡¡¡þ?"v¯NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûreturn it's numeric value */ if (tbuf[0] >= 'A' && tbuf[0] <= 'P') return tbuf[0] - 'A'; /**** Else display error meæÀÿòNNNNNNNNNNNNNNNNN¡¡¡þ?(™dNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û else putchar(*cp); } } /**************************************************************************** §ùÿÈNNNNNNNNNNNNNNNNN¡¡¡þ?.3ÂNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û) ****************************************************************************/ struct fcb *srch_nxt() { int r; /* ö_þ$NNNNNNNNNNNNNNNNN¡¡¡þ?éÞNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûtemp = strncmp( fov_ptr[i], fov_ptr[i+1], 8); /* Test for sort */ if (temp > 0) { /* If larger first then swap */ ½þ^NNNNNNNNNNNNNNNNN¡¡¡þ? ÊÑNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û { j = 0; } else { ungetc( c, "stdin"); break; } }DkþNNNNNNNNNNNNNNNNN¡¡¡þ?&iNNNNNNNNNNNNNNNNNNNNNN¡¡¡û= fmt_buf; cnt = fmt_buf -> fov_idp; if ((fmt_buf -> fov_ids) > 1024) { printf("\nFormat ID sector data size error:( Îþ fil_name; d < 8; d++, cptr++) {  þNNNNNNNNNNNNNNNNN¡¡¡þ?s:NNNNNNNNNNNNNNNNNNNNNN¡¡¡û%d)! Aborting!", fmt_buf -> fov_ids); break; } movmem(&fdptr[cnt], sbuf, fmt_buf -> fov_ids); /******* Set •Aþ NNNNNNNNNNNNNNNNN¡¡¡þ?œñNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûo use arg2= ptr to filename from directory Returns 0: ok, /0: error ****************************************************Z�þ„NNNNNNNNNNNNNNNN¡¡¡þ?6WNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û Get the CP/M drive from user exit - -1: abort 0..15: drive number = A..P *****************************************Ì þHNNNNNNNNNNNNNNNNN¡¡¡þ?$Ü NNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************************* Dump the fcb file data Assumes f_cb has proper name ***********************—™þNNNNNNNNNNNNNNNNN¡¡¡þ?*ÿNNNNNNNNNNNNNNNNNNNNNN¡¡¡û***************************************************************************/ struct fcb *srch_fst() { int r; /* Set bu9þNNNNNNNNNNNNNNNNN¡¡¡þ?0¾NNNNNNNNNNNNNNNNNNNNNN¡¡¡û return (r < 4) ? (Wrkbuf + (r << 5 )) : -1; } /********************************************************************sªþ“NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNpNNNNNNNN�Ò� ‚nƒ<„ …×…¥†s‡Aˆ‰Ý‰ªŠx‹EŒ�á�¯Ž}�L�‘è‘¶’„“Q”•–Š—W˜%™ó™Âš�›_œ-�û�Éž—Ÿe 3¡¢Ð¢ž£k¤:¥¦Ö¦¾NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@„±NNNNNNNNNNNNNNNNNNNNNN¡¡¡û******** Execute the BIOS function exit - TRUE: abort FALSE: no error any_other: error **************************ÆÉþNNNNNNNNNNNNNNNNN¡¡¡þ@.NNNNNNNNNNNNNNNNNNNNNN¡¡¡û***/ dmp_cdb() { cpui.AF = (MF_DIOB) << 8; cpui.DE = this_bnk; cpui.HL = &cmd_blk; farcall( (WORDØ4þNNNNNNNNNNNNNNNN¡¡¡þ@ ÁÜNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCI ;CONSOLE INPUT JP COC ;CONSOLE OUTPUT JP LO ;PRINTER OUTPUT JP PUNCH JP READER JP HOME ;HOME SELECTED DRIVE Jf|þÛNNNNNNNNNNNNNNNNN¡¡¡þ@á NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOFUNC LD (BFUNRSV),A LD (BFUNRSV + 1),HL ; ; SET DEFAULT SECTOR BUFFER ; LD BC,DEFBFR CALL SETDMA ; IF INTCPTS �eþ9NNNNNNNNNNNNNNNN¡¡¡þ@kNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCPM READ ; LD A,(IY + DPB_PSH) ;0= 128-BYTE SECTORS OR A,A JP Z,DISKRDN ; ; READS DON'T NEED ALLOCATION ; XOR A,A ­þ NNNNNNNNNNNNNNNNN¡¡¡þ@¤ÍNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*********************************************** ; DISKWR: ; ; REMOVE BOOT WRITE PROTECTION ; XOR A,A LD (WR_PROT),A êþ„NNNNNNNNNNNNNNNN¡¡¡þ@%N“NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD HL,(CPM_TRK) LD (UNA_TRK),HL ; ; SET SECTOR TO SEEK ; LD HL,(CPM_SEC) LD (UNA_SEC),HL ; ; IF NO UNALLOCATED´Ðþ�NNNNNNNNNNNNNNNNN¡¡¡þ@+mœNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD D,(IY + DPB_SPT +1) SBC HL,DE JP C,NOOVF ; LD HL,0 ;SECTOR = 1 LD (UNA_SEC),HL ; LD HL,(UNA_TRK) ;TRACK++ INCþNNNNNNNNNNNNNNNN¡¡¡þ@ÑâNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û**************************************************/ int bf_exec() { int i; /* Execute the command */ farcall( (WORD)ÉÄþNNNNNNNNNNNNNNNNN¡¡¡þ@>)NNNNNNNNNNNNNNNNNNNNNN¡¡¡û) MR_FUN, this_bnk, &cpui, &cpui); } ïÅþNNNNNNNNNNNNNNNN¡¡¡þ@”�NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûP SELDSK ;SELECT DISK DRIVE JP SETTRK ;SET TRACK # JP SETSEC ;SET SECTOR # JP SETDMA ;SET TRANSFER ADDR JP DISKRD ;îjþNNNNNNNNNNNNNNNNNN¡¡¡þ@x7NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; PUT BDOS VECTOR INTO INTERCEPT CODE ; LD HL,(BDOS + 7) LD (BDOSV),HL ; ; NOW PUT INTERCEPT VECTOR INTO BDOS CODoþrNNNNNNNNNNNNNNNN¡¡¡þ@[8NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD (UNA_CNT),A ; ; READ_OPERATION_FLAG = TRUE (1) ; INC A LD (READOP),A ; ; PRE-READ_OF_DATA_FLAG = TRUE ; LD §{þÉNNNNNNNNNNNNNNNNN¡¡¡þ@ ±fNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û; ; SET PTRS TO DISK DATA ; PUSH IX LD IX,(CUR_DDT) ; PUSH IY LD IY,(CUR_DPB) ; ; IF NOT BLOCKED THEN USE CPM WDCþœNNNNNNNNNNNNNNNN¡¡¡þ@&ÀNNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡û SECTORS REMAIN THEN PREREAD ; CHKUNA: LD A,(UNA_CNT) OR A,A JP Z,ALLOC ; ; ELSE MORE UNALLOCATED RECORDS REMAIN, COUN›�þNNNNNNNNNNNNNNNNN¡¡¡þ@,ô NNNNNNNNNNNNNNNNNNNNNN¡¡¡û HL LD (UNA_TRK),HL ; NOOVF: ; ; MATCH FOUND, MARK AS UNNECESSARY READ ; XOR A,A ;PREREAD FLAG = FALSE LD (RSFLAG)Ä-þ‚NNNNNNNNNNNNNNNN¡¡¡þ@âÓNNNNNNNNNNNNNNNNNNNNNNð¡¡¡û 0x0028, this_bnk, &cpui, &cpui); /* if error then display it */ switch (cpui.AF >> 8) { case 255: printfØÐþ^NNNNNNNNNNNNNNNNN¡¡¡þ@ NNNNNNNNNNNNNNNNNNNNNN¡¡¡û0) + '0' DD DL DD % 10000 ENDIF IF DD > 999 DB (DD / 1000) + '0' DD DL DD % 1000 ENDIF DB (DD / 100) + '0' Djýþ$NNNNNNNNNNNNNNNNN¡¡¡þ@§¾NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPERFORM DISK READ JP DISKWR ;PERFORM DISK WRITE JP LISTST ;RETURN LIST STATUS JP SECTRN ;TRANSLATE SECTOR JP BIOFUNC õþdNNNNNNNNNNNNNNNNNN¡¡¡þ@KNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE ; LD HL,INTCPT LD (BDOS + 7),HL ENDIF ; ; PASS DEFAULT DISK TO CCP ; LD A,(DEFDRV) LD C,A JP CCP SUBTaˆþHNNNNNNNNNNNNNNNNN¡¡¡þ@h NNNNNNNNNNNNNNNNNNNNNN¡¡¡û(RSFLAG),A ; ; TREAT AS UNALLOCATED BLOCK ; LD A,WRUAL LD (WRTYPE),A ; JP RWOPER ;TO PERFORM THE READ ; ; ; NO@@þHNNNNNNNNNNNNNNNNN¡¡¡þ@!‚WNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûRITE ; LD A,(IY + DPB_PSH) ;0= 128-BYTE SECTORS OR A,A JP Z,DISKWRN ; ; READ_OP_FLAG = FALSE ; XOR A,A LD (READO ÍþNNNNNNNNNNNNNNNNN¡¡¡þ@'(ñNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT-- ; DEC A LD (UNA_CNT),A ; ; IF REQUESTED SECTOR != UNALLOCATED SECTOR THEN PURGE ; LD A,(CPM_DSK) ;SAME DISK? LfþHNNNNNNNNNNNNNNNN¡¡¡þ@-Ç:NNNNNNNNNNNNNNNNNNNNNN¡¡¡û,A JP RWOPER ; ; ; NORMAL NON-BLOCKED WRITE ; DISKWRN: CALL CPM_WR JP RW_RET ; ; ; NOT AN UNALLOCATED RECORD, Uþ9NNNNNNNNNNNNNNNN¡¡¡þ@{DNNNNNNNNNNNNNNNNNNNNNN¡¡¡û("Illegal Function!"); return -1; case 254: printf("Argument Out of Range Error!"); return -2; f¨þ!NNNNNNNNNNNNNNNN¡¡¡þ@ XKNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûB '.' DB ((DD % 100) / 10) + '0' DB (DD % 10) + '0' ENDM SUBTTL BIOS CODE ORG BIOS ;-----------------------------Ê„ÿòNNNNNNNNNNNNNNNNNN¡¡¡þ@´óNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;EXECUTE FUNCTION CALL ;############################################################################ ; ; THESE BOOT PARA =þINNNNNNNNNNNNNNNNN¡¡¡þ@UNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûTL BIOS DISK FUNCTION ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; READ A DISK jÿÿÎNNNNNNNNNNNNNNNNN¡¡¡þ@ñžNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRMAL NON-BLOCKED READ ; DISKRDN: CALL CPM_RD JP RW_RET ;*************************************************************r¯þNNNNNNNNNNNNNNNN¡¡¡þ@"×NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûP),A ; ; SAVE WRITE TYPE ; LD A,C LD (WRTYPE),A ; ; IF 1ST WRITE TO UNALLOCATED (NEW, UNUSED) BLOCK THEN SET PARAMEþNNNNNNNNNNNNNNNNN¡¡¡þ@(8ÏNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD HL,UNA_DSK CP A,(HL) JR NZ,ALLOC ; LD HL,(UNA_TRK) ;SAME TRACK? LD DE,(CPM_TRK) SBC HL,DE JR NZ,ALLOC ; LD HL,zÅþNNNNNNNNNNNNNNNNN¡¡¡þ@.’iNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûREQUIRES PRE-READ ; ALLOC: XOR A,A ;COUNT = 0 LD (UNA_CNT),A ; INC A ;PREREAD FLAG = TRUE LD (RSFLAG),A ; ; ; ;˜Áþ“NNNNNNNNNNNNNNNNN¡¡¡þ@HuNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û default: return cpui.AF >> 8; break; } } /**************************************************´SþNNNNNNNNNNNNNNNNN¡¡¡þ@ kzNNNNNNNNNNNNNNNNNNNNNN¡¡¡û----------------------------------------------- ; ; BIOS JUMP VECTOR TABLE ; ;--------------------------------------------êÝÿÈNNNNNNNNNNNNNNNNNN¡¡¡þ@‡ÂNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; INIT BIOS WARM START IN PAGE 0 ; LD A,0C3H LD HL,BIOS + 3 LD (PAGE0),A LD (PAGE0 + 1),HL ; ; INIT BDOS CALLBþ¿NNNNNNNNNNNNNNNNN¡¡¡þ@-dNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûSECTOR ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; DISKR:þBNNNNNNNNNNNNNNNN¡¡¡þ@¯NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û*************** ; ; WRITE DISK SECTOR FUNCTION ; ENTRY- C= WRITE TYPE: ; 0: WRITE TO ALLOCATED BLOCK (UPDATE) ; 1: WRITØ^þNNNNNNNNNNNNNNNNNN¡¡¡þ@#ä5NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûTERS ; CP A,WRUAL JP NZ,CHKUNA ; ; COUNT = NUMBER_OF_SECTORS_IN_BLOCK ; LD A,(IY + DPB_BLM) ;CUR_DPB.DPBBLM + 1 ::= ©RþNNNNNNNNNNNNNNNNN¡¡¡þ@) þNNNNNNNNNNNNNNNNNNNNNN¡¡¡û(CPM_SEC) LD DE,(UNA_SEC) SBC HL,DE JR NZ,ALLOC ; ; MATCH, MOVE TO NEXT SECTOR FOR FUTURE REF ; EX DE,HL ;UNASEC +ŸþNNNNNNNNNNNNNNNNN¡¡¡þ@/¡XNNNNNNNNNNNNNNNNNNNNNN¡¡¡û COMMON CODE FOR READ AND WRITE FOLLOWS ; RWOPER: ; ; ASSUME NO ERRORS ; XOR A,A LD (IOPB + PB_STATO),A ; ; COMÈþyNNNNNNNNNNNNNNNN¡¡¡þ@&NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************** Dump command block *************************************************************************‡hþNNNNNNNNNNNNNNNNNN¡¡¡þ@ òíNNNNNNNNNNNNNNNNNNNNNN¡¡¡û-------------------------------- JP INIT1 ;COLD START ENTRY JP WARM ;RELOAD CCP/BDOS JP CNSCK ;GET CONSOLE STATUS JP >åÿÎNNNNNNNNNNNNNNNNNN¡¡¡þ@Ò‘NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û VECTOR IN PAGE 0 ; LD HL,BDOS + 6 LD (BDOSJV),A LD (BDOSJV + 1),HL ; ; INIT BIOS CALL VECTOR IN PAGE 0 ; LD HL,BI?ŒþNNNNNNNNNNNNNNNNN¡¡¡þ@=ZNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD: ; ; SET UP DATA TABLE PTRS ; PUSH IX LD IX,(CUR_DDT) ; PUSH IY LD IY,(CUR_DPB) ; ; IF NOT BLOCKED THEN USE ýtþBNNNNNNNNNNNNNNNN¡¡¡þ@—üNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE TO DIRECTORY BLOCK (ALLWAYS WRITE) ; 2: WRITE TO UNALLOCATED BLOCK (NO NEED TO PRE-READ) ; ;*****************************u{þ“NNNNNNNNNNNNNNNNN¡¡¡þ@$}¢NNNNNNNNNNNNNNNNNNNNNN¡¡¡û(BLKSIZ/128) INC A LD (UNA_CNT),A ; ; SET DISK TO SEEK ; LD A,(CPM_DSK) LD (UNA_DSK),A ; ; SET TRACK TO SEEK ;‘þHNNNNNNNNNNNNNNNNN¡¡¡þ@*^­NNNNNNNNNNNNNNNNNNNNNN¡¡¡û= 1 INC HL LD (UNA_SEC),HL ; ; IF PAST LAST SECTOR ON TRACK THEN USE 1ST SECTOR OF NEXT TRACK ; LD E,(IY + DPB_SPT) ý´þ$NNNNNNNNNNNNNNNNN¡¡¡þ@0²NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPUTE BUFFER SECTOR ; LD HL,(CPM_SEC) DEC HL ;CONVERT PHYSICAL SECTOR TO LOGICAL ; LD A,(IY + DPB_PSH) ;USE PHYSICAL SHÖ%þNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNþ€Ì�™‚fƒ4„…Ï…�†j‡8ˆ‰Ò‰ŸŠm‹:Œ�Ô�¢Žp�>� ‘Ú‘¨’v“D”•ß•¬–z—G˜™ã™²š€›Nœ�é�¶ž„ŸR ¡í¡»¢‰£V¤$¥ò¥À¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þ@³�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIFT FACTOR (CP/M 3.X) AND A,3 ;LIMIT TO 1024 BYTE SECTORS JP Z,NOSECSHF ;IF ALREADY 0 THEN SECTOR SIZE IS 128 ; SECSHFLqÔþdNNNNNNNNNNNNNNNNN¡¡¡þ@'NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûMATCH ; NOMATCH: ; ; IF BUFFER == DIRTY THEN WRITE IT OUT BEFORE READING NEW ONE ; CALL BUF_FLSH ;CLEAR HOST BUFF ; Îþ NNNNNNNNNNNNNNNN¡¡¡þ@ öìNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûITS <14..8> LD H,A ; LD A,0 ;BIT 0 -> BIT 7 RRA LD L,A ; ; HL HAS RELATIVE HOST BUFFER ADDRESS ; LD DE,BLKBUF †¾þNNNNNNNNNNNNNNNN¡¡¡þ@Ö�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRN ANY ERRORS ANYWAY JR NZ,RW_RET ; ; IF ERROR THEN ABORT ; OR A,A JR NZ,RW_RET ; ; NO ERROR/DIRECTORY WRITE ; ;±þ9NNNNNNNNNNNNNNNN¡¡¡þ@9[NNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************** ; CPM_WR: ; LD HL,LL_WRIT JP CPM_RW ;**********************************************dÉþNNNNNNNNNNNNNNNNN¡¡¡þ@“ýNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************* ; ; CPM_RD PERFORMS THE PHYSICAL READ FROM THE DISK INTO CPM_DMA. ; ENTRY- (CPM_DSK)= DISK # TO REA%ÿÂNNNNNNNNNNNNNNNN¡¡¡þ@%y£NNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************************************************************** ; RD_WR: LD DE,IOPB + PB_TRKO LD BC,PB_BCNTO - PB_TRK[þ'NNNNNNNNNNNNNNNNN¡¡¡þ@+Z¬NNNNNNNNNNNNNNNNNNNNNN¡¡¡û(BUF_DDT) LD IY,(BUF_DPB) ; ; WRITE THE BUFFER DATA ; CALL BUF_WR ; ; RESTORE THE PTRS ; POP IY POP IX ; ; åãþNNNNNNNNNNNNNNNN¡¡¡þ@æÒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûP: SRL H ;ELSE SHIFT OVER TO PHYSICAL SECTOR RR L DEC A JP NZ,SECSHFLP ; NOSECSHF: INC HL ;SET BACK TO PHYSICAL ShãþHNNNNNNNNNNNNNNNNN¡¡¡þ@ NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûJR NZ,RW_RET ;IF ERROR THEN ABORT ; FILHST: ; ; READ THE SECTOR BUFFER ; LD A,(CPM_DSK) ;BUFFER SECTOR = PHYSICAL SECTOè)þNNNNNNNNNNNNNNNN¡¡¡þ@£¿NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û ADD HL,DE ;HL = HOST ADDRESS ; LD DE,(CPM_DMA) ;GET/PUT CP/M DATA LD BC,128 ;LENGTH OF MOVE ; LD A,(READOP) ;WHICH WA âþ„NNNNNNNNNNNNNNNN¡¡¡þ@ONNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û XOR A,A ;BUFFER = CLEAN LD (BUF_MOD),A ; CALL BUF_WR ;WRITE TO DISK ; LD A,(IOPB + PB_STATO) ;RETURN ANY ERRORS ; þNNNNNNNNNNNNNNNN¡¡¡þ@lNNNNNNNNNNNNNNNNNNNNN!ö¡¡¡û****************************** ; ; CPM_RD2 PERFORMS THE PHYSICAL READ FROM THE DISK INTO CPM_DMA, ; WITHOUT BLOCKING. ; ENTR9þ$NNNNNNNNNNNNNNNNN¡¡¡þ@ †VNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûD FROM ; (CPM_TRK)= TRACK # TO READ FROM ; (CPM_SEC)= SECTOR # TO READ FROM ; (CPM_DMA)= XFER ADDRESS ; IX= DDT PTR ; Fçþ!NNNNNNNNNNNNNNNN¡¡¡þ@&,ðNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûO LDIR ; ; EXECUTE LOW LEVEL READ OR WRITE (ON STACK) ; RET ;*****************************************************Q þ!NNNNNNNNNNNNNNNN¡¡¡þ@,Ã;NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û IF ERROR THEN RETURN IT ; OR A,A RET NZ ; ; ELSE CLEAN BUFFER ; LD (BUF_MOD),A RET ;************************•òþNNNNNNNNNNNNNNNN¡¡¡þ@ÕãNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûECTOR LD (BUF_PSEC),HL ;BUFFER PHYSICAL SECTOR TO ACCESS ; ; IF BUFFER == EMPTY THEN READ THE PHYSICAL SECTOR ; LD HL,BL†þNNNNNNNNNNNNNNNNN¡¡¡þ@ :(NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR LD (BUF_DSK),A ; LD HL,(CPM_TRK) LD (BUF_TRK),HL ; LD HL,(BUF_PSEC) LD (BUF_SEC),HL ; ; IF REQUIRED TO READ TH—þ$NNNNNNNNNNNNNNNNN¡¡¡þ@�ŽNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûY? OR A,A JP NZ,RWMOVE ;SKIP IF READ ; ; WRITE OPERATION, MARK AND SWITCH DIRECTION ; LD A,1 ;BUFFER = DIRTY LD (B=>þNNNNNNNNNNNNNNNN¡¡¡þ@|6NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; DONE, RESTORE & RETURN ; RW_RET: OR A,A ;SET RESULT STATUS FLAG POP IY POP IX ; RET ;************************–þNNNNNNNNNNNNNNNNN¡¡¡þ@_9NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûY- (CPM_DSK)= DISK # TO READ FROM ; (CPM_TRK)= TRACK # TO READ FROM ; (CPM_SEC)= SECTOR # TO READ FROM ; (CPM_DMA)= XFER A¡‰þNNNNNNNNNNNNNNNNN¡¡¡þ@!µgNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûIY= DPB PTR ; EXIT - (IOPB.PB_STATO)= 0: OK, /0: ERROR ; ;*******************************************************************/þNNNNNNNNNNNNNNNNN¡¡¡þ@'ÁNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*********************** ; ; BUF_FLSH FLUSHES THE BUFFER DATA IF MODIFIED ; ENTRY- (BUF_DSK)= DISK # TO WRITE TO ; (BUF_TRK)©€þNNNNNNNNNNNNNNNN¡¡¡þ@-ð NNNNNNNNNNNNNNNNNNNNNN¡¡¡û**************************************************** ; ; BUF_WR PERFORMS THE PHYSICAL WRITE FROM BLKBUF TO THE HOST DISK. ; E'¨þNNNNNNNNNNNNNNNN¡¡¡þ@LtNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûUF_ACT LD A,(HL) ; LD (HL),1 ;BUFFER = ACTIVE IN ANY CASE ; OR A,A JR Z,FILHST ; ; HOST BUFFER ACTIVE, SAME AS SEº�þNNNNNNNNNNNNNNNN¡¡¡þ@ o{NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEN READ ; LD A,(RSFLAG) ;NEED TO READ? OR A,A CALL NZ,BUF_RD ;YES, IF 1 ; ; BUFFER = CLEAN ; XOR A,A LD (BUF_M)Xþ9NNNNNNNNNNNNNNNNN¡¡¡þ@ƒÃNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUF_MOD),A ; ; SAVE BUFFER DATA PTRS FOR LATER FLUSHES ; LD (BUF_DDT),IX LD (BUF_DPB),IY ; EX DE,HL ;SOURCE/DEST SWAt*þNNNNNNNNNNNNNNNN¡¡¡þ@)eNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û**************************************************** ; ; CPM_WR PERFORMS THE PHYSICAL WRITE FROM CPM_DMA TO THE DISK. ; ENTRY?WþNNNNNNNNNNNNNNNNNN¡¡¡þ@Æ®NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDDRESS ; EXIT - (IOPB.PB_STATO)= 0: OK, /0: ERROR ; ;************************************************************************PÑþBNNNNNNNNNNNNNNNN¡¡¡þ@"à4NNNNNNNNNNNNNNNNNNNNNN¡¡¡û********* ; CPM_RD: ; LD HL,LL_READ ; ; COMMON CODE ; CPM_RW: PUSH HL LD HL,CPM_TRK ; ; FALL INTO COMMON XFER Cvþ„NNNNNNNNNNNNNNNNN¡¡¡þ@(ÿNNNNNNNNNNNNNNNNNNNNNN¡¡¡û= TRACK # TO WRITE TO ; (BUF_PSEC)= SECTOR # TO WRITE TO ; (BUF_DDT)= DDT PTR ; (BUF_DPB)= DPB PTR ; EXIT - (IOPB.PB_STATª«þ^NNNNNNNNNNNNNNNNN¡¡¡þ@.¥YNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNTRY- (BUF_DSK)= DISK # TO WRITE TO ; (BUF_TRK)= TRACK # TO WRITE TO ; (BUF_SEC)= SECTOR # TO WRITE TO ; IX= DDT PTR ; I±MÿÈNNNNNNNNNNNNNNNNN¡¡¡þ@ENNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEK BUFFER? ; LD A,(CPM_DSK) LD HL,BUF_DSK ;SAME DISK? CP A,(HL) JR NZ,NOMATCH ; LD HL,(BUF_TRK) ;SAME TRACK? LD DEâøÿÈNNNNNNNNNNNNNNNNN¡¡¡þ@ \JNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûOD),A ; MATCH: ; ; COPY DATA TO OR FROM BUFFER ; LD HL,(CPM_SEC) ;CALCULATE INDEX INTO BUFFER DEC HL ;CONVERT TO LOG£!þäNNNNNNNNNNNNNNNNN¡¡¡þ@°òNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûP ; RWMOVE: ; ; BC INITIALLY 128, DE IS SOURCE, HL IS DEST ; LDIR ; ; DATA HAS BEEN MOVED TO/FROM HOST BUFFER, IF N ¬ÿüNNNNNNNNNNNNNNNN¡¡¡þ@TNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û- (CPM_DSK)= DISK # TO WRITE TO ; (CPM_TRK)= TRACK # TO WRITE TO ; (CPM_SEC)= SECTOR # TO WRITE TO ; (CPM_DMA)= XFER ADDREˆeþNNNNNNNNNNNNNNNN¡¡¡þ@õŸNNNNNNNNNNNNNNNNNNNNNN¡¡¡û**** ; CPM_RD2: ; ; SET UP PTRS ; PUSH IX PUSH IY LD IX,(CUR_DDT) LD IY,(CUR_DPB) ; ; EXECUTE READ SECTOR ; :þþyNNNNNNNNNNNNNNNN¡¡¡þ@#ÓNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûODE ; ;**************************************************************************** ; ; SET UP IOPB FOR EXECUTION ; ENT¬ þ·NNNNNNNNNNNNNNNNN¡¡¡þ@)<ÎNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûO)= 0: OK, /0: ERROR ; ;**************************************************************************** ; BUF_FLSH: ; ; IF Ä$þÉNNNNNNNNNNNNNNNNN¡¡¡þ@/–hNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûY= DPB PTR ; EXIT - (IOPB.PB_STATO)= 0: OK, /0: ERROR ; ;********************************************************************°þBNNNNNNNNNNNNNNNN¡¡¡þ@*NNNNNNNNNNNNNNNNNNNNNN¡¡¡û,(CPM_TRK) SBC HL,DE JR NZ,NOMATCH ; LD DE,(BUF_PSEC) ;SAME SECTOR? LD HL,(BUF_SEC) SBC HL,DE JR Z,MATCH ;SKIP IF `eþNNNNNNNNNNNNNNNNN¡¡¡þ@ ÅÝNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûICAL SECTOR (0..N-1) LD A,L ; AND A,(IY + DPB_PHM) ;USE PHYSICAL RECORD MASK DATA (CP/M 3.X) ; RRA ;BITS <7..1> -> B�Áþ�NNNNNNNNNNNNNNNNN¡¡¡þ@å¡NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOT DIRECTORY THEN DELAY WRITE ; LD A,(WRTYPE) ;IF NOT DIRECTORY THEN DELAY WRITE CP A,WRDIR LD A,(IOPB + PB_STATO) ;RETU 1þ NNNNNNNNNNNNNNNNN¡¡¡þ@ jNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSS ; IX= DDT PTR ; IY= DPB PTR ; EXIT - (IOPB.PB_STATO)= 0: OK, /0: ERROR ; ;********************************************&hþBNNNNNNNNNNNNNNNN¡¡¡þ@ ÌNNNNNNNNNNNNNNNNNNNNNN¡¡¡û CALL CPM_RD ; ; RESTORE PTRS & RETURN ; POP IY POP IX RET ;***************************************************X®þ$NNNNNNNNNNNNNNNNN¡¡¡þ@$J’NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRY- HL= PTR TO IOPB IMAGE TRACK DATA ; IX= DDT PTR ; IY= DPB PTR ; (SP)= ADDRESS {LL_READ, LLWRIT} OF EXECUTOR ; ;******uÇþ'NNNNNNNNNNNNNNNNN¡¡¡þ@*i�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUNMODIFIED THEN RETURN ; LD A,(BUF_MOD) OR A,A RET Z ; ; ELSE SET PTRS TO BUFFER DATA ; PUSH IX PUSH IY LD IX,?uþ$NNNNNNNNNNNNNNNNN¡¡¡þ@0…%NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û******** ; BUF_WR: ; LD HL,LL_WRIT JP BUF_RW ;**********************************************************************ê(þ^NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN†NNNNNNNN�Ñ�Ÿ‚lƒ:„…Õ…£†p‡>ˆ ‰Ù‰§Šu‹CŒ�Þ�­Ž{�H�‘䑲’“M”•é•¶–„—Q˜™í™¼šŠ›Yœ'�õ�ž�Ÿ^ +¡ù¡Ç¢•£b¤1¥ÿ¥Í¦ÎNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þAòNNNNNNNNNNNNNNNNNNNNNN¡¡¡û****** ; ; RDBUF PERFORMS THE PHYSICAL READ FROM THE HOST DISK INTO BLKBUF. ; ENTRY- (BUF_DSK)= DISK # TO READ FROM ; (BUF_ùþNNNNNNNNNNNNNNNNN¡¡¡þAX£NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLDSK: ; ; STORE DRIVE # FOR FUTURE USE ; LD A,C LD (CPM_DSK),A ; ; SAVE LOGON REQUEST FLAG ; LD A,E LD (LOGRQ) :þNNNNNNNNNNNNNNNN¡¡¡þA ·hNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûGON, 1:INHIBIT OR A,C ;0: NORMAL, 1: INHIBIT CPL AND A,1 RET Z ; ; ELSE LOG ON DRIVE ; PUSH IX ;SAVE REGS PUS óþNNNNNNNNNNNNNNNN¡¡¡þA—NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLES ; IDOK: CALL TRNONE ;ASSUME NO TRANSLATION ; ; IF HARD DISK OR DOUBLE DENSITY THEN NO TRANSLATION ; LD A,(BLKBUF +ßÀþ9NNNNNNNNNNNNNNNN¡¡¡þAxßNNNNNNNNNNNNNNNNNNNNNN¡¡¡û USE DEFAULT TABLE LD BC,DPB_SZ LDIR ; LD A,(HL) ;HEADS VALUE JR SEL1 ; ; ; USE 8" FLOPPY DEFAULTS ; LGCKFD: C ‚þNNNNNNNNNNNNNNNNN¡¡¡þAÒyNNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************* ; ; SET TRACK # ; ENTRY- BC= TRACK # ; ;***************************************************  þ9NNNNNNNNNNNNNNNN¡¡¡þA%8'NNNNNNNNNNNNNNNNNNNNNN¡¡¡û DONE ; RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SECTOR TRANSLATION FUNCœþNNNNNNNNNNNNNNNNN¡¡¡þA+(NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; LOGON DISK FUNCTION ; EXIT - A= 0: OK; /0: ERROR ; ;++++lûþœNNNNNNNNNNNNNNNN¡¡¡þA§VNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTRK)= TRACK # TO READ FROM ; (BUF_SEC)= SECTOR # TO READ FROM ; IX= DDT PTR ; IY= DPB PTR ; EXIT - (IOPB.PB_STATO)= 0: OK}ÞþgNNNNNNNNNNNNNNNNN¡¡¡þAH�NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û,A ; ; COMPUTE DISK DRIVER TABLE PTR ; CALL RETDVRT ;DRIVE IS STILL IN C REGISTER ; ; IF DRIVE ERROR THEN RETURN (HLÿ£þNNNNNNNNNNNNNNNN¡¡¡þAâ;NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûH IY ; LD IX,(CUR_DDT) ;SET REGS LD IY,(CUR_DPB) ; ; ATTEMPT TO READ ID SECTOR ; CALL BUF_FLSH ;FLUSH BUFFER 1ST JÚvþNNNNNNNNNNNNNNNN¡¡¡þAƒNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ID_FLGO) AND A,[1 SHL DF_DTDB] OR [1 SHL DF_HARDB] ; ; ELSE SET TRANSLATION ; CALL Z,TR8 ; ; XFER DISK DATA TO DPB¢‹þäNNNNNNNNNNNNNNNN¡¡¡þA-ŒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûALL TR8 LD HL,SD8PBK JR SEL2 ; ; ERROR EXIT ; LOGERR: LD HL,0 ; ; DONE ; LGDONE: POP IY ;RESTORE REGS POP IX rDþNNNNNNNNNNNNNNNNN¡¡¡þA ÇÒNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************* ; SETTRK: LD (CPM_TRK),BC RET ;************************************************************¢JþNNNNNNNNNNNNNNNN¡¡¡þA&mtNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûTION ; ENTRY- DE= 0: NO XLATE, ELSE PTR TO XLATE TABLE ; BC= SECTOR # TO XLATE ; EXIT - HL= XLATED SECTOR OR BC + 1 ; BC= |wþNNNNNNNNNNNNNNNNNN¡¡¡þA,‚¿NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; DISKLOG: ; ; SET UP READ IOPB ; LD A,(BUF_DM¹êþNNNNNNNNNNNNNNNN¡¡¡þA”gNNNNNNNNNNNNNNNNNNNNNN¡¡¡û, /0: ERROR ; ;**************************************************************************** ; BUF_RD: ; LD HL,LL_READ ; WþNNNNNNNNNNNNNNNNN¡¡¡þA {¬NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û= 0) ; RET NZ ; ; ELSE SAVE PTR ; LD (CUR_DDT),HL ; ; FETCH FLAGS ; INC HL ;EXE +1 INC HL ;FLGS LD C,(HL)­+þ'NNNNNNNNNNNNNNNNN¡¡¡þAÑ NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûR NZ,LOGERR ; CALL DISKLOG JR NZ,LOGERR ; ; IF NO ID SECTOR THEN USE DEFAULT DPB ; (NOTE: CONTROLLER HAS SET IT'S DISKe)þNNNNNNNNNNNNNNNN¡¡¡þA=²NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; LD DE,(CUR_DPB) ;GET ADDR OF DPB LD HL,BLKBUF + ID_SPTO LD BC,DPB_SZ LDIR ; ; XFER DISK PHYSICAL DATA TO TABLE \ðþ'NNNNNNNNNNNNNNNNN¡¡¡þA½NNNNNNNNNNNNNNNNNNNNNN¡¡¡û RET ;**************************************************************************** ; ; HOME DRIVE - TREAT AS SEEK TRK 0ò,þ'NNNNNNNNNNNNNNNNN¡¡¡þA!ôãNNNNNNNNNNNNNNNNNNNNNN¡¡¡û**************** ; ; SET SECTOR ; ENTRY- BC= SECTOR # ; ;******************************************************************|äþHNNNNNNNNNNNNNNNNN¡¡¡þA'^ENNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUNCHANGED ; A, DE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; SECTRN: ; ; IF ²×þHNNNNNNNNNNNNNNNN¡¡¡þA-±ŽNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAB) LD (LOGIOPB + PB_DMAXO),A ; LD HL,LOGIOPB LD DE,IOPB LD BC,PB_STATO LDIR ; ; EXECUTE WITHOUT COMPENSATION ; Ewþ„NNNNNNNNNNNNNNNN¡¡¡þA ðNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; COMMON CODE ; BUF_RW: PUSH HL LD HL,BUF_TRK JP RD_WR ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++û]þNNNNNNNNNNNNNNNNNN¡¡¡þA .ÿNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; FETCH DISK PARAMETER BLOCK ADDRESS ; INC HL ;DRV INC HL ;DPB_PTR LD E,(HL) INC HL LD D,(HL) LD (CUR_DPB)û þBNNNNNNNNNNNNNNNNN¡¡¡þAÂGNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DEFAULTS IN DEFBFR IN ALL CASES) ; LD A,(IOPB + PB_ST2O) CP A,-1 ;-1:NONE, 0:JADE, 1:DESCRIPTOR, 2: EXTENDED, ; 3: tÚþ9NNNNNNNNNNNNNNNN¡¡¡þAháNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; LD A,(BLKBUF + ID_HEADS) ; SEL1: LD (IX + DDT_HDS),A ; ; RETURN DRIVE TABLE PTR ; LD HL,(CUR_DPH) XOR A,A ;RETU5øÿÈNNNNNNNNNNNNNNNNN¡¡¡þA‡*NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; EXIT - BC= 0 ; ;**************************************************************************** ; HOME: ; ; IF PENDING ;ôþNNNNNNNNNNNNNNNN¡¡¡þA"¡°NNNNNNNNNNNNNNNNNNNNNN¡¡¡û********** ; SETSEC: LD (CPM_SEC),BC RET ;***************************************************************************~ˆþrNNNNNNNNNNNNNNNNN¡¡¡þA(N{NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNO TRANSLATION THEN RETURN SECTOR++ ; LD A,D ;IF TABLE ADDR = 0 THEN NO TRANSLATION OR A,E JP Z,NOTRAN ; ; ELSE CALCU“þNNNNNNNNNNNNNNNNN¡¡¡þA.äÝNNNNNNNNNNNNNNNNNNNNNN¡¡¡û JR LL_DO ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; LOW LEVEL READ ; ENTRY- IX=“•þHNNNNNNNNNNNNNNNNN¡¡¡þA>ÁNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++ ; ; SELECT DRIVE FUNCTION ; LOG-ON - SET DISK PARAMETER BLOCK ; ENTRY- C= DRIVE # ; E= 0 IF NEW SELECT îÚþ�NNNNNNNNNNNNNNNNN¡¡¡þA ÎNNNNNNNNNNNNNNNNNNNNNN¡¡¡û,DE ; ; FETCH DISK PARAMETER HEADER ADDRESS ; INC HL ;DPH PTR LD E,(HL) INC HL LD D,(HL) LD (CUR_DPH),DE EX DEÚþNNNNNNNNNNNNNNNNN¡¡¡þAñvNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPARTITIONED, ID JR Z,LGDEF ; ; ELSE IF OLD FORMATS THEN PAD DPB DATA ; CP A,3 JR NC,IDOK ; LD HL,BLKBUF + ID_PSHO 6gþNNNNNNNNNNNNNNNNN¡¡¡þA[ÐNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûRN NO-ERROR JR LGDONE ; ; ; IF NOT HARD DISK THEN GO DO FLOPPY TEST ; LGDEF: BIT 4,(IX + DDT_FLG) JR Z,LGCKFD ; ; Ÿ²ÿrNNNNNNNNNNNNNNNN¡¡¡þA´NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûWRITE (BUFFER DIRTY) THEN IGNORE ; LD A,(BUF_MOD) OR A,A JR NZ,HOME2 ; ; ELSE PURGE BUFFER ; LD (BUF_ACT),A ; HO‘×þNNNNNNNNNNNNNNNN¡¡¡þA#’�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û* ; ; SET TRANSFER ADDR ; ENTRY- BC= ADDRESS ; EXIT - A= ? ; ;************************************************************½Ïþ·NNNNNNNNNNNNNNNNN¡¡¡þA)}JNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûLATE NEW SECTOR FROM TABLE ; EX DE,HL ADD HL,BC LD L,(HL) ; LD H,0 RET ; ; ; CONVERT FROM CP/M'S LOGICAL SECTORç“þNNNNNNNNNNNNNNNNN¡¡¡þA/×ìNNNNNNNNNNNNNNNNNNNNNNð¡¡¡û DDT PTR ; IY= DPB PTR ; EXIT - IOPB.PB_STATO, A= STATUS ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Çeþ9NNNNNNNNNNNNNNNN¡¡¡þAk’NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; EXIT - HL= PTR TO DPT OR 0 FOR ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; SE+þNNNNNNNNNNNNNNNNN¡¡¡þA „YNNNNNNNNNNNNNNNNNNNNNN¡¡¡û,HL ;PUT DPH PTR IN HL FOR RETURN ; ; IF NOT FIRST SELECT OR LOGON INHIBITED THEN RETURN TABLE PTR ; LD A,(LOGRQ) ;0: LOÒþNNNNNNNNNNNNNNNN¡¡¡þA¤%NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û;FILL DATA WITH 0S LD B,ID_FLGO - ID_PSHO ; PADIDL: LD (HL),0 INC HL DJNZ PADIDL ; ; ELSE XFER ID SECTOR DATA TO TABâVþNNNNNNNNNNNNNNNNN¡¡¡þAKîNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ELSE USE HARD DISK DEFAULTS ; CALL TRNONE ; NO XLATE LD HL,HDPBK ; ; XFER DATA TO TABLES ; SEL2: LD DE,(CUR_DPB) ;ò£þBNNNNNNNNNNNNNNNN¡¡¡þAáHNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûME2: ; ; JUST SET TRACK TO 0 ; LD BC,0 ; ; FALL INTO SET TRACK ; ;*********************************************2ïþNNNNNNNNNNNNNNNNN¡¡¡þA$ NNNNNNNNNNNNNNNNNNNNNN¡¡¡û**************** ; SETDMA: LD (CPM_DMA),BC ; LD A,(BUF_DMAB) ;FETCH BANK ADDRESS SET BY COLD START LD (CPM_DMAB),A ; ; ~ÛþNNNNNNNNNNNNNNNNN¡¡¡þA*(NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û {0..N-1} TO PHYSICAL SECTOR {1..N} ; NOTRAN: LD HL,1 ADD HL,BC RET SUBTTL DISK SUPPORT ROUTINES ;++++++++++++++˜`þNNNNNNNNNNNNNNNNN¡¡¡þA0Ä¡NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û+++++++++++++ ; LL_READ: ; ; ENABLE UPLOAD ; XOR A,A LD (IOPB + PB_FLGO),A ; ; DISABLE DOWNLOAD ; LD HL,0 LDÍëþNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÎNNNþ€Ì�™‚fƒ4„…Ð…�†k‡9ˆ‰Õ‰¢Šq‹?Œ �Ú�¨Žv�C�‘ß‘­’{“I”•啳–�—N˜™ë™ºšˆ›Vœ$�ò�ÀžŽŸ\ )¡÷¡Ä¢’£_¤-¥û¥É¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þAÅ5NNNNNNNNNNNNNNNNNNNNNN¡¡¡û (IOPB + PB_BCNTO),HL ; ; PASS READ SECTOR COMMAND ; LD A,PB_READC JP LL_RW ;+++++++++++++++++++++++++++++++++++++©gþ NNNNNNNNNNNNNNNNN¡¡¡þAo“NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL ;DOUBLE COUNT DEC A JP NZ,LL_WR3 ; LL_WR2: LD (IOPB + PB_BCNTO),HL ; ; PASS WRITE COMMAND ; LD A,PB_WRITC ; ; '#þNNNNNNNNNNNNNNNN¡¡¡þA €XNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT RETURN ADDRESS ON STACK PUSH HL ; LD L,(IX + DDT_EXE) ;FETCH DRIVER ADDRESS FROM TABLE LD H,(IX + DDT_EXE + 1) JP (HLÇ,þ„NNNNNNNNNNNNNNNN¡¡¡þA $NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; CP A,'A' ;IF ABORT THEN RE-BOOT JP Z,0 ; ; ELSE IF DEBUGGER THEN EXECUTE IT ; CP A,'M' JP Z,MR_BRK ; ; ELSEù1þNNNNNNNNNNNNNNNN¡¡¡þAOïNNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************************************************************** ; ; SET NO SECTOR TRANSLATION PROCEDURE ; EXIT - HL, DþNNNNNNNNNNNNNNNNN¡¡¡þAåINNNNNNNNNNNNNNNNNNNNNN¡¡¡û RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; HARD DISK DRIVER FUNCTION ; ENTRo!þ„NNNNNNNNNNNNNNNN¡¡¡þA%NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL ;SAVE ORIGINAL DATA ; LD A,(IOPB + PB_SECO + 1) ADD A,A ;BIT 15 -> BIT_BUCKET ; SRL H RR L RRA ;TRK BIT 0 -ëlþ!NNNNNNNNNNNNNNNN¡¡¡þA+,NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûN -1 ; LD A,C CP A,MAXFUNCS LD A,-1 RET NC ; ; ELSE COMPUTE TABLE ENTRY ; PUSH HL ;SAVE POSSIBLE DATA ; LD H¨6þNNNNNNNNNNNNNNNN¡¡¡þA�fNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++ ; ; LOW LEVEL WRITE ; ENTRY- IX= DDT PTR ; IY= DPB PTR ; EXIT - IOPB.PB_STATO, A= )šþ$NNNNNNNNNNNNNNNNN¡¡¡þA­NNNNNNNNNNNNNNNNNNNNNN¡¡¡û FALL INTO COMMON CODE ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; COMMON IOPB 7ßþINNNNNNNNNNNNNNNN¡¡¡þAÕ NNNNNNNNNNNNNNNNNNNNNN¡¡¡û) ; ; DRIVER RETURNS HERE ; LL_OPRET: ; ; IF NO ERRORS THEN RETURN ZF ; RET Z ;IF NO_ERROR THEN RETURN ; ; PRIN PÿÂNNNNNNNNNNNNNNNN¡¡¡þA9³NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û IF IGNORE THEN RETURN NO ERROR ; SUB A,'I' ;IF IGNORE THEN RETURN NO ERROR RET Z ; ; ELSE RETURN ERROR TO BDOS ; L\,ÿòNNNNNNNNNNNNNNNN¡¡¡þA¼NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE= ? ; ;**************************************************************************** ; TRNONE: LD DE,0 JR SETTR SUBTµ§þNNNNNNNNNNNNNNNNN¡¡¡þA ðâNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûY- IX= DRIVER TABLE PTR ; EXIT - A= 0: OK; /0: ERROR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ÂþHNNNNNNNNNNNNNNNNN¡¡¡þA&ZDNNNNNNNNNNNNNNNNNNNNNN¡¡¡û> SECTOR BIT 15 LD (IOPB + PB_SECO + 1),A ; LD (IOPB + PB_TRKO),HL ;TRACK = RESIDUAL ; ; EXECUTE THE IOPB ; CALL XPR]RþNNNNNNNNNNNNNNNNN¡¡¡þA,µ�NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûL,BFUNTBL LD A,C ADD A,A ADD A,L LD L,A LD A,0 ADC A,H LD H,A ; ; EXECUTE TABLE ADDRESS ; LD A,(HL) INC H¾CþrNNNNNNNNNNNNNNNN¡¡¡þA£WNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSTATUS ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; LL_WRIT: ; ; IF STILL PROTECTED1þNNNNNNNNNNNNNNNNN¡¡¡þA LœNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEXECUTER ; ENTRY- A= COMMAND ; IX= DRIVE TABLE PTR ; IY= DPB PTR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++ =þHNNNNNNNNNNNNNNNNN¡¡¡þAæ:NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT ERROR ; IOPBDMP: LD A,(BUF_DMAB) ;SET BANK LD E,A ; LD HL,IOPB LD A,MF_DIOB ;USE DISPLAY IOPB DATA FUNCTION CALL §<þNNNNNNNNNNNNNNNN¡¡¡þA ‚NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD A,-1 ;RETURN -1 TO BDOS OR A,A RET ; ; ; DISPLAY WRITE PROTECT ERROR MESSAGE ; DO_ERR: LD HL,WP_ERM CALL EDITOR )þNNNNNNNNNNNNNNNNNN¡¡¡þA)�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTL HARD DISK ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE THE IOPB PRIM“þNNNNNNNNNNNNNNNNN¡¡¡þA!ÃÓNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++ ; HDEXEC: EQU XPRIM SUBTTL JADE FLOPPY DRIVER ROUTINES ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++öºþNNNNNNNNNNNNNNNNNN¡¡¡þA'iuNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIM ; ; RESTORE THE MODIFIED IOPB SO RETRY WILL WORK ; POP HL ;TRACK LD (IOPB + PB_TRKO),HL ; LD HL,IOPB + PB_SECO dîþ'NNNNNNNNNNNNNNNN¡¡¡þA-†¾NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL LD H,(HL) LD L,A ; EX (SP),HL ;PUT CALLER'S DATA IN HL, FUNCTION ADDR ON RET ; STACK, EXECUTE FUNCTION ADDRESS ON VÿÂNNNNNNNNNNNNNNNN¡¡¡þA:ÀNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û THEN ERROR ; LD A,(WR_PROT) OR A,A JR NZ,DO_ERR ; ; INHIBIT UPLOAD ; LD A,1 SHL PB_INHX LD (IOPB + PB_FLGO),A CðþNNNNNNNNNNNNNNNNN¡¡¡þA ÏNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û+++++++++++++++++++++++ ; LL_RW: LD (IOPB + PB_CMDO),A ; ; OFFSET SECTOR ; LD HL,(IOPB + PB_SECO) LD A,L ADD A,(IX –þNNNNNNNNNNNNNNNNN¡¡¡þAõwNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûXMROM ; ; QUERY USER FOR OPTION ; LD HL,DSKEB CALL EDITOR ; ; GET USER RESPONSE ; CALL CI ;GET USER RESPONSE ;DþrNNNNNNNNNNNNNNNN¡¡¡þA_ÑNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û JR IOPBDMP ;**************************************************************************** ; ; SET 3740 SECTOR TRANSLATIO™`þNNNNNNNNNNNNNNNNN¡¡¡þA°NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûITIVE ; EXIT - A= 0: OK, /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; XPRIM:Õ0þDNNNNNNNNNNNNNNNN¡¡¡þA"–€NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++ ; ; JADE 8" FLOPPY DISK DRIVER FUNCTION ; ENTRY- IY= DRIVER TABLE PTR ; EXIT - A= 0: OK; /0: ERROR ; ç…þrNNNNNNNNNNNNNNNNN¡¡¡þA(yKNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+1 ;CLEAR BIT 15 RES 7,(HL) ; ; DONE ; RET SUBTTL BIOS FUNCTION CALLS ;+++++++++++++++++++++++++++++++++++++++++ÛþNNNNNNNNNNNNNNNNN¡¡¡þA.ÓíNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSTACK ;############################################################################ ; ; BIOS FUNCTION TABLE ; ;########¥5þNNNNNNNNNNNNNNNNN¡¡¡þA ñNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ; CALCULATE DOWNLOAD BYTE COUNT ; LD A,(IY + DPB_PSH) ;USE SHIFT FACTOR {0:128, 1:256, 2:512, 3:1024} LD HL,128 ;STAR¿[þNNNNNNNNNNNNNNNNN¡¡¡þA *þNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+ DDT_SOF) LD L,A LD A,H ADC A,(IX + DDT_SOF + 1) LD H,A LD (IOPB + PB_SECO),HL ; ; SET PHYSICAL DRIVE ; LL_DO: ×wþ NNNNNNNNNNNNNNNNN¡¡¡þAÆFNNNNNNNNNNNNNNNNNNNNNN¡¡¡û PUSH AF ;SAVE CHAR LD C,A ;ECHO CHAR CALL COC CALL CRLF ;NEW LINE POP AF ; AND A,5FH ;INSURE UPPER CASE ; ; ©vþNNNNNNNNNNNNNNNNN¡¡¡þAlàNNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡ûN PROCEDURE ; ENTRY- (CUR_DPH)= MUST BE PTR TO DPH ; EXIT - DE, HL= ? ; ;***************************************************)Ïþ„NNNNNNNNNNNNNNNN¡¡¡þAƒ+NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; EXECUTE THE PRIMITIVE IN ROM ; LD A,(BUF_DMAB) ;PRESET IOPB BANK LD E,A ; LD HL,IOPB CALL MR_XIOB ;EXECUTE TmþBNNNNNNNNNNNNNNNN¡¡¡þA#¥±NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; FD8EXEC: ; ; IF HEADS == 1 THEN EXECUTE I“MþNNNNNNNNNNNNNNNNN¡¡¡þA)JzNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û+++++++++++++++++++++++++++++++++++ ; ; FUNCTION DISPATCHER ; ENTRY- C= FUNCTION # ; EXIT - A= -1: ERROR, 0: OK ; ;+++++++è´þNNNNNNNNNNNNNNNNN¡¡¡þA/àÜNNNNNNNNNNNNNNNNNNNNNN¡¡¡û#################################################################### ; BFUNTBL: DW RETVERS ;0:RETURN VERSION # DW RETDVRTž þ!NNNNNNNNNNNNNNNN¡¡¡þA\¢NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT WITH 128 BYTES ; AND A,3 ;LIMIT TO 1024-BYTE SECTORS ; JR Z,LL_WR2 ;IF SHIFT_FACTOR == 0 THEN DONE ; LL_WR3: ADD HL,HžÕÿÎNNNNNNNNNNNNNNNNN¡¡¡þA ³iNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLD A,(IX + DDT_DRV) LD (IOPB + PB_DRVO),A ; ; FETCH DRIVER VECTOR & EXECUTE DISK DRIVER ; LL_OPLP: LD HL,LL_OPRET ;PUæ\þœNNNNNNNNNNNNNNNN¡¡¡þA“NNNNNNNNNNNNNNNNNNNNNN¡¡¡û IF RETRY THEN TRY AGAIN ; CP A,'R' ;IF RETRY THEN RETURN TO CALLER JR Z,LL_OPLP ; ; ELSE IF ABORT THEN DO WARM BOOT %æþINNNNNNNNNNNNNNNNN¡¡¡þA|ÞNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************* ; TR8: LD DE,SDTRAN ; SETTR: LD HL,(CUR_DPH) LD (HL),E INC HL LD (HL),D RET ;******š*þ„NNNNNNNNNNNNNNNN¡¡¡þAÖxNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHE FUNCTION ; OR A,A ;FUNCTION ERR? RET NZ ; ; RETURN THE COMMAND RESULTS STATUS ; LD A,(IOPB + PB_STATO) OR A,A (þHNNNNNNNNNNNNNNNNN¡¡¡þA$<&NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOPB ; LD A,(IX + DDT_HDS) DEC A JP Z,XPRIM ; ; ELSE SELECT SIDE FROM TRACK BIT 0 ; LD HL,(IOPB + PB_TRKO) PUSH H˜�þNNNNNNNNNNNNNNNNN¡¡¡þA*)NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; BIOFUNC: ; ; IF FUNCTION # NOT IN TABLE THEN RETURÔ1þ“NNNNNNNNNNNNNNNNN¡¡¡þA0ó‘NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûF ;1:RETURN DISK PHYSICAL CONFIGURATION TABLE PTR MAXFUNCS EQU ($ - BFUNTBL) / 2 ;++++++++++++++++++++++++++++++++++++++++ïTþ'NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN8NNNNNNNN�Ñ�ž‚kƒ8„…Ó…¢†o‡=ˆ ‰×‰¤Šr‹@Œ�Û�©Žw�E�‘ᑯ’|“J”•敳–�—O˜™ì™»š‰›Xœ&�ô�Áž�Ÿ] *¡ø¡Æ¢•£b¤0¥þ¥Ì¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þBiÙNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++ ; ; RETURN BIOS VERSION # FUNCTION #0 ; EXIT - HL= VERSION # IN BINARY {0.00,..655.35} ¡þNNNNNNNNNNNNNNNNN¡¡¡þBÃNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûN DRIVER TABLE PTR FUNCTION ; ENTRY- C= DRIVE # ; EXIT - E:HL= DRIVER TABLE BASE PTR ; NZ= ILLEGAL DRIVE (HL= 0) ; A, B, CçÏþNNNNNNNNNNNNNNNN¡¡¡þB ,´NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûXIT - A= BANK # ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; GETBNK: LD A,MF_GBNK JëþNNNNNNNNNNNNNNNN¡¡¡þB ÈNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*************************** INTCPT: LD A,C ;CHECK CALL VALIDITY CP A,41 ;IF <= 40 THEN OK ; BDOSV EQU $ + 1 JP C,BDOS +øÖþBNNNNNNNNNNNNNNNN¡¡¡þBãNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û CALL EDITOR ; ; OUTPUT FUNCTION # ; POP BC LD A,MF_PHXB CALL XMROM ; ; OUTPUT NEW LINE ; CALL CRLF ; ; REŒKþ NNNNNNNNNNNNNNNNN¡¡¡þBI¥NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; CLKCAL: LD A,MF_GCAL JP XMROM ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; ÙþNNNNNNNNNNNNNNNN¡¡¡þB%£ûNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++ ; CI: LD A,MF_CI JP XMROM ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++òÍþNNNNNNNNNNNNNNNNNN¡¡¡þB+€ôNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û+++++++++++++++++++++++++++++++++ ; READER: LD A,CTRLZ ;FAKE EOF ; ; FALL INTO PUNCH RETURN ; ;********************K¤þ!NNNNNNNNNNNNNNNN¡¡¡þB<ŠNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; RETVERS: LD HL,VERSN XOR A,A ;RETURN Nø þ$NNNNNNNNNNNNNNNNN¡¡¡þBÓANNNNNNNNNNNNNNNNNNNNNN¡¡¡û= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; RETDVRT: ; ; ASSUME DRIVE 0 ; LïUþNNNNNNNNNNNNNNNN¡¡¡þByçNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûP MR_FUN SUBTTL NON-DISK PROCEDURES ;*************************************************************************** ; ; NÇþBNNNNNNNNNNNNNNNN¡¡¡þB•_NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û 11H ;THIS ADDR MODIFIED BY WARM BOOT RTN ; ; THE FOLLOWING CONDITIONAL JUMP IS MODIFIED TO AN UNCONDITIONAL JUMP BY ; THE #KÿòNNNNNNNNNNNNNNNN¡¡¡þB¶PNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTURN NULLS ; XOR A,A ;BC = HL = A = 0 LD L,A LD H,A LD C,A LD B,A RET ;++++++++++++++++++++++++++++++++++++++é8þ­NNNNNNNNNNNNNNNNN¡¡¡þB \NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRETURN TIME FUNCTION 92H ; EXIT - A= SECONDS ; B= MINUTES ; C= HOURS ; ;+++++++++++++++++++++++++++++++++++++++++++++++++ÊúþNNNNNNNNNNNNNNNNN¡¡¡þB&ö¨NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û++++++++++++++++++ ; ; RETURN CONSOLE STATUS ; EXIT - A= 0: NOT READY ; FFH: CHAR READY ; ;+++++++++++++++++++++++++++HãþNNNNNNNNNNNNNNNNNN¡¡¡þB,cNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û******************************************************** ; ; PUNCH DRIVER ; ENTRY- C= CHAR TO OUTPUT ; ;*******************QøþrNNNNNNNNNNNNNNNN¡¡¡þB»NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûO ERROR RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN DRIVER TABLE PTR Ãlþ'NNNNNNNNNNNNNNNNN¡¡¡þB àpNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD HL,DDT_0 ;START AT 1ST TABLE ; ; IF DRIVE == 0 THEN ALREADY THERE ; LD A,C OR A,A RET Z ; ; ELSE IF ILLEGAL DRI�ÚþNNNNNNNNNNNNNNNNN¡¡¡þBJÖNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEWLINE PROCEDURE ; ;*************************************************************************** ; CRLF: LD C,CR CALL COC ßVþ„NNNNNNNNNNNNNNNN¡¡¡þB¦nNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûWARM BOOT ROUTINE IF THE CLOCK/CALENDAR BOARD IS NOT PRESENT ; IF NOT MODIFIED, THEN IT IS ALLWAYS FALSE (NOP). ; INHCLK: JRÊþNNNNNNNNNNNNNNNNN¡¡¡þB…aNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û++++++++++++++++++++++++++++++++++++++ ; ; CDOS RETURN VERSION FUNCTION ; MAKES CLOCK/CALENDAR WORK. ; EXIT - B= 1 ; ;+++MFþ'NNNNNNNNNNNNNNNNN¡¡¡þB!o?NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û+++++++++++++++++++++++++++ ; CLKTIM: LD A,MF_GTIM JP XMROM ENDIF ;++++++++++++++++++++++++++++++++++++++++++++++Hþ^NNNNNNNNNNNNNNNNN¡¡¡þB'Å™NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++ ; CNSCK: LD A,MF_CIS JP XMROM ;************************************AþNNNNNNNNNNNNNNNN¡¡¡þB-*RNNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************************************************* ; PUNCH: RET ;*************************************************ËçþBNNNNNNNNNNNNNNNN¡¡¡þB–,NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFUNCTION #1 ; ENTRY- E= DRIVE # ; EXIT - E:HL= DRIVER TABLE BASE PTR ; NZ= ILLEGAL DRIVE REQUESTED (HL=0) ; A, B, C= ? ; üÜþNNNNNNNNNNNNNNNNN¡¡¡þB µ#NNNNNNNNNNNNNNNNNNNNN!ô¡¡¡ûVE THEN RETURN ERROR ; CP A,NDRVS JR C,RETDV2 ; LD HL,0 OR A,A ;SET NZ RET ; ; ; ELSE COMPUTE TABLE PTR ; REEþNNNNNNNNNNNNNNNNN¡¡¡þBY›NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û LD C,LF JP COC IF INTCPTS SUBTTL ADDITIONAL FUNCTIONS TO SUPPORT CDOS PROGRAMS ;***********************************B2þ9NNNNNNNNNNNNNNNN¡¡¡þBó=NNNNNNNNNNNNNNNNNNNNNN¡¡¡û C,ILLEGC ; ; NOW CHECK FOR EXTENDED CALLS ; CP A,8DH ;IF RETURN VERSION THEN RETURN IT JR Z,RETCVER ; CP A,90H ;IFV—þ�NNNNNNNNNNNNNNNNN¡¡¡þBöNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; RETCVER: LD B,1 RET SUBTTL CLOCK ROUTINES DøþrNNNNNNNNNNNNNNNN¡¡¡þB":lNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++ ; ; MONITOR ROM EXECUTER ; ENTRY- A= FUNCTION # ; ;+++++++++++++++++++++++++++++++++++++++++Œþ NNNNNNNNNNNNNNNNN¡¡¡þB(Õ§NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û**************************************** ; ; CONSOLE OUTPUT ; ENTRY- C= CHAR TO OUTPUT ; ;*********************************í þNNNNNNNNNNNNNNNNN¡¡¡þB.NNNNNNNNNNNNNNNNNNNNNN¡¡¡û*************************** ; ; PRINTER DRIVER ; ENTRY- C= CHAR TO OUTPUT ; ;**********************************************ƒ;þ^NNNNNNNNNNNNNNNNN¡¡¡þB¥NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; RETDVRTF: ; ; ADJUST REGISTER ; LD C,EXÉþ�NNNNNNNNNNNNNNNNN¡¡¡þB †NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTDV2: LD B,C LD DE,DDT_SIZ ; RETDVL: ADD HL,DE DJNZ RETDVL ; LD A,(BUF_DMAB) LD E,A ; ; RETURN NO ERROR ; XOR bUþNNNNNNNNNNNNNNNNN¡¡¡þBjªNNNNNNNNNNNNNNNNNNNNNN¡¡¡û**************************************** ; ; SYSTEM CALL INTERCEPT ROUTINE CHECKS FOR ILLEGAL BDOS CALLS & ; PRINTS MESSAGE çÍþ>NNNNNNNNNNNNNNNNN¡¡¡þBÀ NNNNNNNNNNNNNNNNNNNNNN¡¡¡û NOT CLOCK THEN ERR JR C,ILLEGC ; JR Z,CLKCAL ;IF CALENDAR THEN GET IT ; CP A,92H JR Z,CLKTIM ;IF TIME THEN GET IT ; ›þ„NNNNNNNNNNNNNNNN¡¡¡þB/ÇNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN CALENDAR FUNCTION 90H ; EXIT - A= Dô;þ!NNNNNNNNNNNNNNNN¡¡¡þB# ]NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++ ; XMROM: EQU MR_FUN SUBTTL CHAR I/O ROUTINES ;+++++++++++++++++++++++++++++++++++++XLþNNNNNNNNNNNNNNNNN¡¡¡þB)æ–NNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************************* ; COC: LD A,MF_CO JP XMROM ;+++++++++++++++++++++++++++++++++++++++++++++ûžþäNNNNNNNNNNNNNNNNN¡¡¡þB/L0NNNNNNNNNNNNNNNNNNNNNN¡¡¡û****************************** ; LO: LD A,MF_LO JP XMROM ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++í„þNNNNNNNNNNNNNNNN¡¡¡þBðNNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; ; FALL INTO LOCAL ENTRY ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURoyþNNNNNNNNNNNNNNNNNN¡¡¡þB …NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA,A RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; GET BANK NUMBER FUNCTION ; ExÝþ9NNNNNNNNNNNNNNNN¡¡¡þB?ùNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIF ILLEGAL. ALSO IMPLEMENTS CDOS CLOCK/CALENDAR ; SYSTEM CALLS FOR ASMB. ; ;************************************************¹NþNNNNNNNNNNNNNNNNN¡¡¡þBÐ2NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ILLEGAL SYSTEM CALL ; ILLEGC: PUSH BC ;SAVE FUNCTION # ; ; OUTPUT WARNING MESSAGE ; LD HL,ISCMSG ;OUTPUT WARNING Šþ9NNNNNNNNNNNNNNNN¡¡¡þBz”NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûAY ; B= MONTH ; C= YEAR ; L= DAY OF WEEK ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Y†þNNNNNNNNNNNNNNNNN¡¡¡þB$�ÊNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++ ; ; CONSOLE INPUT ; EXIT - A= CHAR ; ;+++++++++++++++++++++++++++++++++++++++++++++}@þ'NNNNNNNNNNNNNNNNN¡¡¡þB*³ÅNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++ ; ; READER DRIVER - DUMMY ; EXIT - A= CTRL-Z ; ;+++++++++++++++++++++++++++++++++++++++++++z®þINNNNNNNNNNNNNNNNN¡¡¡þB0_}NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û+++++++++++++++++ ; ; RETURN LIST DEVICE STATUS ; EXIT - A= 0: BUSY, FFH:READY ; ;+++++++++++++++++++++++++++++++++++++++++„ÛþHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN8NNNÿ€Í�›‚hƒ5„…Ð…ž†l‡:ˆ‰Õ‰¢Šp‹>Œ �Ø�¦Žt�A�‘Ý‘«’y“F”•ã•°–~—K˜™ç™¶š„›Rœ �í�ºž‰ŸW %¡ó¡À¢Ž£[¤*¥ø¥Æ¦žNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þB^éNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++ ; LISTST: LD A,MF_LOS JP XMROM ;*************************************************ùþNNNNNNNNNNNNNNNNN¡¡¡þBôONNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPARAMETER BLOCK ; ;############################################################################ ; IOPB: REPT PB_SIZE LIST 8þNNNNNNNNNNNNNNNN¡¡¡þB „NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCTOR OFFSET ; ; DEFINE THE STRUCTURE SIZE ; DDT_SIZ DS 0 ENDM ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@úÙþNNNNNNNNNNNNNNNN¡¡¡þB;øNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûH,D0DPB,D0DPH,4,0 ; B DDT_1: ALLDRV HDEXEC,4,12H,D1DPB,D1DPH,4,8000H ; C DDT_2: ALLDRV HDEXEC,5,10H,D2DPB,D2DPH,4,0 ; ƒ}þBNNNNNNNNNNNNNNNN¡¡¡þBÔ3NNNNNNNNNNNNNNNNNNNNNN¡¡¡û######################################## ; MSGLE: DM CR,LF,'LOAD ERROR' ; DSKEB: DM CR,LF,'Abort, Ignore, Retry, (BDOS) - ' ϾþNNNNNNNNNNNNNNNNN¡¡¡þB~•NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûRECORD MASK DW 0 ;LOGICAL DRIVE SECTOR OFFSET ; ; DEFAULT DISK PHYSICAL PARAMETERS ; DB 1 ;HEADS ;##############áþBNNNNNNNNNNNNNNNN¡¡¡þB%”ËNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûIVE SECTOR OFFSET (SOF) ; ; ; DB 4 ;HEADS ;##########################################################################ž-þNNNNNNNNNNNNNNNNNN¡¡¡þB+·ÄNNNNNNNNNNNNNNNNNNNNNN¡¡¡û STHD) DW 0 ;;NO CHECKS ON HARD DISK ELSE DW D#D(DD)CHK ;;DRIVE DISK CHECKSUMS ARRAY PTR ENDIF DW D#D(DD)ALL ;;DR§ÿÂNNNNNNNNNNNNNNNN¡¡¡þB ºNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*************************** ; ; MESSAGE EDITOR ; ENTRY- HL= TEXT PTR (BIT 7= 1: TERMINATOR) ; EXIT - REGS= ? ; ;**********—Ùþ$NNNNNNNNNNNNNNNNN¡¡¡þBäqNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOFF DB 0 LIST ON ENDM ;############################################################################ ; ; DISK DRIVERêþ$NNNNNNNNNNNNNNNN¡¡¡þBN×NNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@ ; ; MACRO TO DEFINE THE DRIVER TABLE RECORD ; ENTRY- #DADD= DRIVER ADDRESS ; #PD= PHYSICAL DRIVE #†þNNNNNNNNNNNNNNNN¡¡¡þB¢oNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û D DDT_3: ALLDRV HDEXEC,5,12H,D3DPB,D3DPH,4,8000H ; E DDT_4: ALLDRV FD8EXEC,0,0,D4DPB,D4DPH,1,0 ; F DDT_5: ALLDRV FD8EXYþrNNNNNNNNNNNNNNNN¡¡¡þB�`NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; WP_ERM: DM CR,LF,'W-PROT Error!' ; IF INTCPTS ISCMSG: DM CR,LF,'ILL SYS CALL, #= ' ENDIF ;###################NÄþNNNNNNNNNNNNNNNNN¡¡¡þB k>NNNNNNNNNNNNNNNNNNNNNN¡¡¡û############################################################## ; ; DEFAULT 8" HARD DISK PARAMETER BLOCK ; ;#################6ËÿÎNNNNNNNNNNNNNNNNN¡¡¡þB&Á˜NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û## ; ; DRIVE PARAMETER HEADER AREA ; 1 PER DRIVE ; ;#######################################################################ß"þœNNNNNNNNNNNNNNNN¡¡¡þB,.SNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûIVE CLUSTER ALLOCATION BIT MAP PTR LIST OFF ENDM ; ; DEFINE THE DATA ; DD DL 1 REPT NDRVS LIST OFF ALLDPH 012345´ôþrNNNNNNNNNNNNNNNN¡¡¡þB8‹NNNNNNNNNNNNNNNNNNNNNN¡¡¡û****************************************************************** ; EDITOR: CALL GETBNK LD E,A LD A,MF_PUTS JP XMROM âôþaNNNNNNNNNNNNNNNN¡¡¡þB ×@NNNNNNNNNNNNNNNNNNNNNN¡¡¡û TABLES (DDT) ; ;############################################################################ ; STRUCT 0 DDT_EXE DS 2 ;STAd7þNNNNNNNNNNNNNNNNN¡¡¡þB}æNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û ; #FLG= DRIVE FLAGS ; #DPB= DPB ADDRESS ; #DPH= DPH ADDRESS ; #HDS= HEADS ; #SOF= SECTOR OFFSET ; ;@@@@@@@@@@@@@@@@á^þBNNNNNNNNNNNNNNNN¡¡¡þB‘^NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEC,1,0,D5DPB,D5DPH,1,0 ENDIF IF BOOT = 3 ; A DDT_0: ALLDRV FD8EXEC,0,0,D0DPB,D0DPH,1,0 ; B DDT_1: ALLDRV FD8EXECL�þNNNNNNNNNNNNNNNNN¡¡¡þB²QNNNNNNNNNNNNNNNNNNNNNN¡¡¡û######################################################### ; ; DEFAULT 8" FLOPPY DISK PARAMETER BLOCK ; IBM 3740 SINGLE DENSIT)þ�NNNNNNNNNNNNNNNNN¡¡¡þB!XNNNNNNNNNNNNNNNNNNNNNN¡¡¡û########################################################### ; HDPBK: DW 128 ;SECTORS PER TRACK (LOGICAL) (SPT) DB 5 ;BLOCKldþNNNNNNNNNNNNNNNNN¡¡¡þB'ò©NNNNNNNNNNNNNNNNNNNNNN¡¡¡û##### ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE A DISK PARAMETER TABLE MAZAþHNNNNNNNNNNNNNNNN¡¡¡þB-bNNNNNNNNNNNNNNNNNNNNNN¡¡¡û6789ABCDEF DD DL DD + 1 LIST ON ENDM ;############################################################################ ; ;ßþyNNNNNNNNNNNNNNNN¡¡¡þB¡NNNNNNNNNNNNNNNNNNNNNN¡¡¡û SUBTTL INITIALIZED DATA ;############################################################################ ; ; 3740 SECTOR T8ÍþNNNNNNNNNNNNNNNNNN¡¡¡þB ‚NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRT ADDRESS OF DISK DRIVER DDT_FLG DS 1 ;FLAGS BIT DEF. ; 0 1: INHIBIT LOGON ; 1..3 PARTITION # {0,..7} ; 4 1: HARDïßþrNNNNNNNNNNNNNNNNN¡¡¡þBn«NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ALLDRV MACRO #DADD,#PD,#FLG,#DPB,#DPH,#HDS,#SOF DW #DADD ;DR/eþrNNNNNNNNNNNNNNNN¡¡¡þBÄ NNNNNNNNNNNNNNNNNNNNNN¡¡¡û,1,0,D1DPB,D1DPH,1,0 ; C DDT_2: ALLDRV HDEXEC,4,10H,D2DPB,D2DPH,4,0 ; D DDT_3: ALLDRV HDEXEC,4,12H,D3DPB,D3DPH,4,8000H ¹þNNNNNNNNNNNNNNNNN¡¡¡þB+ÆNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûY FORMAT ; ;############################################################################ ; SD8PBK: DW 26 ;SECTORS PER TRACKTÕÿÂNNNNNNNNNNNNNNNN¡¡¡þB" \NNNNNNNNNNNNNNNNNNNNNN¡¡¡û SHIFT FACTOR (BSH) DB 31 ;BLOCK MASK (BLM) DB 1 ;NULL MASK (EXM) DW 1015 ;DISK SIZE (CLUSTERS -1) (DSM) DW 1152Cþ„NNNNNNNNNNNNNNNNN¡¡¡þB(â—NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ALLDPH: MACRO #D LIST ON D#D(DD)DPHL’þ�NNNNNNNNNNNNNNNNN¡¡¡þB.H1NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; LOGON IOPB OVERLAY ; ;############################################################################ ; LOGIOPB: DB PB_LOGØÔþNNNNNNNNNNNNNNNNN¡¡¡þB’-NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRANSLATION TABLE ; **** CP/M SINGLE DENSITY **** ; ;#########################################################################tçþgNNNNNNNNNNNNNNNNN¡¡¡þB ±"NNNNNNNNNNNNNNNNNNNNNN¡¡¡û DISK DRIVE ; DDT_DRV DS 1 ;PHYSICAL DRIVE # DDT_DPB DS 2 ;DPB ADDRESS FOR THIS DRIVE DDT_DPH DS 2 ;DPH ADDRESS FOR THISËCþrNNNNNNNNNNNNNNNNN¡¡¡þB]šNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIVER EXECUTION ADDR DB #FLG ;FLAGS DB #PD ;MONITOR PHYSICAL DRIVE # DW #DPB ;DISK PARAMETER BLOCK PTR DW #DPH ;DISK þNNNNNNNNNNNNNNNNN¡¡¡þB÷mNNNNNNNNNNNNNNNNNNNNNN¡¡¡û / 2 ;DIRECTORY MAX (DRM) DB 0FFH ;ALLOCATION 0 (AL0) DB 10000000B ;ALLOCATION 1 (AL1) DW 0 ;CHECK SIZE (CKS) ×4þNNNNNNNNNNNNNNNNN¡¡¡þB)ѦNNNNNNNNNNNNNNNNNNNNNN¡¡¡û: ;DRIVE PARAMETER HEADER FOR DRIVE #D(DD) DW 0 ;;SECTOR TRAN TBL (OR 0 IF NO XLATE) DW 0 ;;SCRATCH AREA DW 0 ;;" D…þNNNNNNNNNNNNNNNNN¡¡¡þB/{NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûC ;COMMAND DB 0 ;DRIVE DW 0 ;TRACK DW ID_SECT ;SECTOR DB 0 ;FLAGS DW BLKBUF ;DMA DB 0 ;BANK DW 0 ;COUNT ; WR_P€þ„NNNNNNNNNNNNNNNN¡¡¡þBÇ~NNNNNNNNNNNNNNNNNNNNNN¡¡¡û### ; SDTRAN: GXLATE 26,6 ;############################################################################ ; ; COMMON I/O äþNNNNNNNNNNNNNNNNN¡¡¡þB (µNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û DRIVE ; ; THE FOLLOWING MAY BE BROUGHT OFF DISK DESCRIPTOR OR FROM DEFAULT TABLES ; DDT_HDS DS 1 ;HEADS DDT_SOF DS 2 ;SE:‘þNNNNNNNNNNNNNNNN¡¡¡þBÉNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûPARAMETER HEADER PTR DB #HDS ;HEADS DW #SOF ;SECTOR OFFSET ; ENDM IF BOOT = 10H ; A DDT_0: ALLDRV HDEXEC,4,10‘5þ NNNNNNNNNNNNNNNNN¡¡¡þBçNNNNNNNNNNNNNNNNNNNNNN¡¡¡û##################################################################### ; ; MESSAGES ; ;####################################éþNNNNNNNNNNNNNNNN¡¡¡þBM¤NNNNNNNNNNNNNNNNNNNNNN¡¡¡û0B ;ALLOC 0 DB 0 ;ALLOC 1 DW 16 ;CHECK SIZE DW 2 ;TRACK OFFSET DB 0 ;PHYSICAL RECORD SHIFT FACTOR DB 0 ;PHYSICAL ×üþ·NNNNNNNNNNNNNNNNN¡¡¡þB$§úNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDW 2 ;TRACK OFFSET (OFF) DB 1 ;PHYSICAL RECORD SHIFT FACTOR (PSH) DB 1 ;PHYSICAL RECORD MASK (PRM) DW 0 ;LOGICAL DRÃ`þ“NNNNNNNNNNNNNNNNN¡¡¡þB*„õNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûW 0 ;;" DW DIRBF ;;DIRECTORY BUFFER PTR DW D#D(DD)DPB ;;DRIVE PARAMETER BLK PTR IF ((DD - 1) <= NDHD) AND ((DD - 1) >=(±þINNNNNNNNNNNNNNNNN¡¡¡þB0hMNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûROT DB -1 ;/0: WRITE PROTECTION ENABLED ; ; LAST OF INITIALIZED CODE READ FROM DISK ; BIOSND EQU $ SUBTTL UNINITIALI þ$NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN8NNNNNNNN�Ñ�ž‚kƒ8„…Ó… †n‡<ˆ ‰×‰¤Šr‹@Œ�Û�©Žw�D�‘à‘®’{“I”•啲–€—M˜™é™¸š†›Tœ"�ð�½žŒŸZ )¡ö¡Ã¢‘£^¤,¥ú¥È¦ÎNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þCmNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûZED DATA AREA ;############################################################################ ; ; THE FOLLOWING DATA MUST RES�+þNNNNNNNNNNNNNNNNN¡¡¡þCµËNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûER BUF_MOD DS 1 ;0: BUFFER CLEAN, /0: BUFFER DIRTY (MODIFIED) ; BUF_DDT DS 2 ;BUFFER DDT PTR BUF_DPB DS 2 ;BUFFER DPB PTR ;‚ÖþINNNNNNNNNNNNNNNN¡¡¡þC ZNNNNNNNNNNNNNNNNNNNNNN¡¡¡û############################## ; CUR_DPB DS 2 ;DRIVE TABLE PTR CUR_DDT DS 2 ;DRIVE DRIVER TABLE BASE ADDRESS PTR CUR_DPH DS HþBNNNNNNNNNNNNNNNN¡¡¡þCz|NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûRD DRIVE #D(DD) ENDIF IF ((DD - 1) >= ST8FD) AND ((DD - 1) <= ND8FD) D#D(DD)ALL: DS 75 ;ALLOCATION BIT MAP FOR 8" DRIVE·þœNNNNNNNNNNNNNNNN¡¡¡þC•·NNNNNNNNNNNNNNNNNNNNNN¡¡¡û, 4K= 31, 8K= 63, 16K= 127 DPB_EXM DS 1 ;EXM- EXTENT MASK ; DSM < 256 : 1K= 0, 2K= 1, 4K= 3, 8K= 7, 16K= 15 ; DSM > 255w½þ NNNNNNNNNNNNNNNNN¡¡¡þC?NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSEC ; 0: 128, 1: 256, 3: 512, 7: 1024 ; ; ADDITIONAL DISK PARTITIONING DATA FOR THE LOGICAL DRIVE SELECTION. ; PARTITIO%ÜþrNNNNNNNNNNNNNNNN¡¡¡þC%ÕONNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDD DL 1 REPT NDRVS LIST OFF ALLDPB 0123456789ABCDEF DD DL DD + 1 LIST ON ENDM ; ; BLOCKING BUFFER ; BLKBUF: DS1þBNNNNNNNNNNNNNNNN¡¡¡þC+ö@NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ENDIF ENDIF LIST ON ; ; LAST OF INITIALIZED CODE READ FROM DISK ; BIOSND EQU $ SUBTTL UNINITIALIZED DATA A"©þrNNNNNNNNNNNNNNNNN¡¡¡þCJ>NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIDE IN THIS ORDER TO MATCH THE IOPB DATA ; ;############################################################################ ; ;XTÿÉNNNNNNNNNNNNNNNNN¡¡¡þC¥õNNNNNNNNNNNNNNNNNNNNNN¡¡¡û RSFLAG: DS 1 ;0: NO PREREAD REQ'D, /0: PREREAD REQ'D READOP: DS 1 ;0: WRITE OPERATION, 1: READ OPERATION WRTYPE: DS 1 ;WRITE}þNNNNNNNNNNNNNNNN¡¡¡þCSNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û2 ;DPH PTR ; LOGRQ: DS 1 ;LOG ON REQUEST REG. ;##########################################################################wžþ„NNNNNNNNNNNNNNNN¡¡¡þCãëNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û #D(DD) D#D(DD)CHK DS 32 ;DIRECTORY CHECKSUMS STORAGE (1 BYTE PER SECTOR) ENDIF LIST OFF ENDM ; ; RESERVE THE DA;OþNNNNNNNNNNNNNNNN¡¡¡þCÀäNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û : 2K= 0, 4K= 1, 8K= 3, 16K= 7 DPB_DSM DS 2 ;DSM- DRIVE STORAGE SIZE (IN CLUSTERS) ; INT(((#_TRACKS - OFF) * SPT * BYTES PERð£þNNNNNNNNNNNNNNNNN¡¡¡þC *ºNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNING BY TRACKS ARE IMPLIMENTED THRU BDOS USING DPBOFF ABOVE. ; PARTITIONING BY HEADS ARE IMPLIMENTED BY USING THE FOLLOWING DATÔóþNNNNNNNNNNNNNNNNNN¡¡¡þC&€NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û 1024 ;HOST BUFFER IF (($ - 8000H) > 07700H) OR ($ < 8000H) CONMSG **** BIOS TOO BIG, USE MOVCPM & RE-ADJUST! **** ã×þNNNNNNNNNNNNNNNNN¡¡¡þC,o×NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûREA ;############################################################################ ; ; VARIABLES ; ;######################ãÌþrNNNNNNNNNNNNNNNN¡¡¡þCyNNNNNNNNNNNNNNNNNNNNNN¡¡¡û CP/M IOPB OVERLAY ; CPM_DSK DS 1 ;LOGICAL DRIVE CPM_TRK DS 2 ;LOGICAL TRACK NUMBER CPM_SEC DS 2 ;LOGICAL SECTOR NUMBER ªlþNNNNNNNNNNNNNNNNN¡¡¡þC –ÄNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û OPERATION TYPE FROM BDOS: ; 0: WRITE TO ALLOCATED (USED) BLOCK (PREREAD) ; 1: WRITE TO DIRECTORY (PREREAD & WRITE) ; õýþHNNNNNNNNNNNNNNNNN¡¡¡þCþNNNNNNNNNNNNNNNNN¡¡¡þC(£NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û_WR,H8_RD,0,0,5,10H,0 ALLDPH 4,0,F8_WR,F8_RD,0,0,0,0,D4CHK ALLDPH 5,0,F8_WR,F8_RD,0,0,1,0,D5CHK ELSE IF BOOT < 30H 2=þNNNNNNNNNNNNNNNNNN¡¡¡þC. µNNNNNNNNNNNNNNNNNNNNNN¡¡¡û 1 ;LOGICAL DRIVE SEK_TRK: DS 2 ;LOGICAL TRACK NUMBER SEK_SEC: DS 2 ;LOGICAL SECTOR NUMBER ; ; THE FOLLOWING ARE SET CÚþdNNNNNNNNNNNNNNNNNN¡¡¡þCÓ©NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûER BUF_TRK DS 2 ;BUFFER TRACK NUMBER BUF_SEC DS 2 ;BUFFER SECTOR NUMBER DS 1 ;FLAGS BUF_DMA DS 2 BUF_DMAB DS 1 ;BANK # ; [ŒþNNNNNNNNNNNNNNNNN¡¡¡þC ð¦NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUNA_DSK: DS 1 ;LAST UNALLOC DISK UNA_TRK: DS 2 ;LAST UNALLOC TRACK UNA_SEC: DS 2 ;LAST UNALLOC SECTOR ;##################êEþ NNNNNNNNNNNNNNNNN¡¡¡þCNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; ALL = (DSM / 8) + 1 ; CHK = DPB.CKS ú8þNNNNNNNNNNNNNNNNNN¡¡¡þC¶¸NNNNNNNNNNNNNNNNNNNNNN¡¡¡û################################################# ; STRUCT 0 DPB_SPT DS 2 ;SPT- SECTORS/TRACK DPB_BSH DS 1 ;BSH- BLOCK SHIFC\þ9NNNNNNNNNNNNNNNN¡¡¡þCYsNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS (USUALLY 2) ; ; ADDITIONAL CP/M 3.0 DATA (ALSO COULD BE USED BY CP/M 2.2 DEBLOCKING) ; DPB_PSH DS 1 ;PSH- PHYSICAL RECOR#ÿÂNNNNNNNNNNNNNNNN¡¡¡þC#éNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; GENERATE THE DPB FOR DRIVE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ALLDP‡�þ$NNNNNNNNNNNNNNNNN¡¡¡þC)�"NNNNNNNNNNNNNNNNNNNNNN¡¡¡û;5" FLOPPY BOOT ALLDPH 0,0,F8_WR,F8_RD,0,0,0,0,D0CHK ALLDPH 1,0,F8_WR,F8_RD,0,0,1,0,D1CHK ALLDPH 2,0,H8_WR,H8_RD,0,0,4,10H4›þ NNNNNNNNNNNNNNNNN¡¡¡þC/:„NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBY THE BUFFER READ/WRITE ; HST_DSK: DS 1 ;BUFFER DISK NUMBER HST_TRK: DS 2 ;BUFFER TRACK NUMBER HST_SEC: DS 2 ;BUFFER SECØkÿÎNNNNNNNNNNNNNNNNNN¡¡¡þC†úNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; BLOCKING BUFFER MAINTENANCE ; BUF_PSEC DS 2 ;BUFFER PHYSICAL SECTOR BUF_ACT DS 1 ;0: BUFFER FLUSHED, /0: DATA IN BUFF’;þ!NNNNNNNNNNNNNNNN¡¡¡þC i1NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û########################################################## ; ; VARIABLES ; ;##############################################ý‹þNNNNNNNNNNNNNNNN¡¡¡þCIMNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ALLDAL: MACRO #D LIST ON IF ((DD - 1) >= STHD) AND ((DD - 1) <= NDHD) D#D(DD)ALL: DS 128 ;ALLOCATION BIT MAP FOR 8" HA‰þNNNNNNNNNNNNNNNNN¡¡¡þC¦†NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT FACTOR DETERMINED BY CLUSTER SIZE ; 1K= 3, 2K= 4, 4K= 5, 8K= 6, 16K= 7 DPB_BLM DS 1 ;BLM- BLOCK MASK ; 1K = 7, 2K= 15)ËþBNNNNNNNNNNNNNNNN¡¡¡þC NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD SHIFT FACTOR BASED ON BYTES/SEC ; 0: 128, 1: 256, 2: 512, 3: 1024 DPB_PHM DS 1 ;PHM- PHYSICAL RECORD MASK BASED ON BYTES/&»þINNNNNNNNNNNNNNNNN¡¡¡þC$æ~NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûB: MACRO #D LIST ON D#D(DD)DPB: DS DPB_SZ ;ALLOCATION FOR DRIVE #D(DD) LIST OFF ENDM ; ; RESERVE THE DATA SPACE ; 4þ�NNNNNNNNNNNNNNNNN¡¡¡þC*ÅqNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û,0 ALLDPH 3,80H,H8_WR,H8_RD,0,0,4,10H,0 ALLDPH 4,0,H8_WR,H8_RD,0,0,5,10H,0 ALLDPH 5,80H,H8_WR,H8_RD,0,0,5,10H,0 ENDIF ªíþNNNNNNNNNNNNNNNNN¡¡¡þC0)ÉNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTOR NUMBER ; ; SEK_HST: DS 2 ;PHYSICAL SECTOR TO XFER ; ; FLAGS ; HST_ACT: DS 1 ;0: BUFFER FLUSHED, /0: DATA IN BUF2ÿòNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN8NNNÿ€Í�›‚iƒ6„…Ò…Ÿ†l‡:ˆ‰Ö‰£Šq‹?Œ �Û�©Žw�F�‘â‘°’}“K”•è•¶–„—Q˜™í™»š‰›Xœ&�ó�ÀžŽŸ\ *¡ø¡Ç¢–£c¤1¥ÿ¥Í¦ÞNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þC(]NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPPER BITS) ; DPB_SECO DS 2 ;SOF- SECTOR OFFSET (FOR LOGICAL DRIVE) ; 0: NONE, 1..65535: OFFSET DPB_SKT DS 1 ;SKEW TABLE SßGþNNNNNNNNNNNNNNNNN¡¡¡þC‚ûNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûH) > 075FFH) CONMSG **** BIOS TOO BIG, USE MOVCPM & RE-ADJUST! **** ENDIF END Ç«þNNNNNNNNNNNNNNNN¡¡¡þC m0NNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ALLDAL: MACRO #D LIST ON IF ((DD - 1) >= STHD) AND ((DD - 1) <= NDHD) D#D(DD)ALL: DS êµÿÈNNNNNNNNNNNNNNNNN¡¡¡þCMLNNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; MACRO TO DEFINE THE DRIVE ALLOCATION & CHECKSUMS AREA ; zþ9NNNNNNNNNNNNNNNN¡¡¡þC¢‡NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûF DD DL DD + 1 LIST ON ENDM ;############################################################################ ; ; RESEW.þINNNNNNNNNNNNNNNNN¡¡¡þC!NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûB_AL0 DS 2 ;AL0,1- DIRECTORY ALLOCATION ; 1 MSB PER DIRECTORY CLUSTER ALLOCATED DPB_CKS DS 2 ;CKS- # DIRECTORY SECTORS CHEC@ˆþäNNNNNNNNNNNNNNNN¡¡¡þC%âNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûCO DS 2 ;SOF- SECTOR OFFSET (FOR LOGICAL DRIVE) ; 0: NONE, 1..65535: OFFSET DPB_SKT DS 1 ;SKEW TABLE STARTS HERE, IF USED, C�þBNNNNNNNNNNNNNNNN¡¡¡þC+ÁpNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û **** BIOS TOO BIG, USE MOVCPM & RE-ADJUST! **** ENDIF END é³þ!NNNNNNNNNNNNNNNN¡¡¡þC}NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTARTS HERE, IF USED, ELSE 0 ; DPB_SZ DS 0 ENDM ; ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@µ‹þHNNNNNNNNNNNNNNNNN¡¡¡þC’ÅNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û; CUR_DPH DS 2 ;DPH PTR CUR_DPB DS 2 ;DPB PTR CUR_BCB DS 2 ;BCB PTR CUR_RD DS 2 ;READ DRIVER PTR CUR_WR DS 2 ;WRITE DRIVER Hþ„NNNNNNNNNNNNNNNN¡¡¡þC8cNNNNNNNNNNNNNNNNNNNNNN¡¡¡û127 ;ALLOCATION BIT MAP FOR 8" HARD DRIVE #D(DD) ENDIF IF ((DD - 1) >= ST8FD) AND ((DD - 1) <= ND8FD) D#D(DD)ALL: DS 57kÿÈNNNNNNNNNNNNNNNNNN¡¡¡þCÔÛNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; ALL = (DSM / 8) + 1 ; CHK = DPB.CKS ; AL’qþrNNNNNNNNNNNNNNNN¡¡¡þC÷ÔNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRVE DRIVE PARAMETER BLOCKS ; ;############################################################################ ; STRUCT 0 DPB_§Çþ NNNNNNNNNNNNNNNNN¡¡¡þC ŠNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûKED ; (DRM +1) / 4 DPB_OFF DS 2 ;OFF- # RESERVED TRACKS (USUALLY 2) ; ; ADDITIONAL CP/M 3.0 DATA (ALSO COULD BE USED BY'ÝþNNNNNNNNNNNNNNNNNN¡¡¡þC&·,NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûELSE 0 ; DPB_SZ DS 0 ENDM ; ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATC×þBNNNNNNNNNNNNNNNN¡¡¡þC,XçNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þCN?NNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@ ; ; GENERATE THE DPB FOR DRIVE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@eKþNNNNNNNNNNNNNNNNN¡¡¡þC ¡ôNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPTR CUR_XLAT DS 2 ;XLATION TABLE PTR (0: NONE) CUR_SOFF DS 2 ;SECTOR OFFSET FOR DRIVE CUR_DRV DS 1 ;CURRENT PHYSICAL DRIVE # Ã�þ$NNNNNNNNNNNNNNNNN¡¡¡þC RNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ;ALLOCATION BIT MAP FOR 8" DRIVE #D(DD) D#D(DD)CHK DS 32 ;DIRECTORY CHECKSUMS STORAGE (1 BYTE PER SECTOR) ENDIF LIST nõþäNNNNNNNNNNNNNNNNNN¡¡¡þCçêNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLDAL: MACRO #D LIST ON IF DSK_#D(DD) = 10H D#D(DD)ALL: DS 128 ;ALLOCATION BIT MAP FOR 4MB HARD DRIVE #D(DD) ENDIF ƒÜþNNNNNNNNNNNNNNNNN¡¡¡þCÄåNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSPT DS 2 ;SPT- SECTORS/TRACK DPB_BSH DS 1 ;BSH- BLOCK SHIFT FACTOR DETERMINED BY CLUSTER SIZE ; 1K= 3, 2K= 4, 4K= 5, 8K= 6,Ÿtþ!NNNNNNNNNNNNNNNN¡¡¡þC!.»NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û CP/M 2.2 DEBLOCKING) ; DPB_PSH DS 1 ;PSH- PHYSICAL RECORD SHIFT FACTOR BASED ON BYTES/SEC ; 0: 128, 1: 256, 2: 512, 3: 10?þNNNNNNNNNNNNNNNNNN¡¡¡þC'„NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûE THE DPB FOR DRIVE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ALLDPB: MACRO #D_óþHNNNNNNNNNNNNNNNN¡¡¡þC-kÖNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þCרNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ALLDPB: MACRO #D LIST ON D#D(DD)DPB: DS DPB_SZ ;ALLOCATION FOR DRIVE #D(DD) IF (DSK_#D(DD) < 10H) OR (DSK_#D(DD) >iÉþNNNNNNNNNNNNNNNNNN¡¡¡þC ô§NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;############################################################################ ; ; DRIVE ALLOCATION AREAS ; ;#########²ôþÉNNNNNNNNNNNNNNNNNN¡¡¡þCNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOFF ENDM ; ; RESERVE THE DATA SPACE ; DD DL 1 REPT NDRVS LIST OFF ALLDAL 0123456789ABCDEF DD DL DD + 1 LIST ON _ÿÈNNNNNNNNNNNNNNNNN¡¡¡þC²¹NNNNNNNNNNNNNNNNNNNNNN¡¡¡û IF DSK_#D(DD) = 11H D#D(DD)ALL: DS 256 ;ALLOCATION BIT MAP FOR 8MB HARD DISK #D(DD) ENDIF IF (DSK_#D(DD) AND 0F0H) = 0˜ªþ\NNNNNNNNNNNNNNNN¡¡¡þC]rNNNNNNNNNNNNNNNNNNNNNN¡¡¡û 16K= 7 DPB_BLM DS 1 ;BLM- BLOCK MASK ; 1K = 7, 2K= 15, 4K= 31, 8K= 63, 16K= 127 DPB_EXM DS 1 ;EXM- EXTENT MASK ; DSM ©œþ9NNNNNNNNNNNNNNNN¡¡¡þC"{èNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û24 DPB_PHM DS 1 ;PHM- PHYSICAL RECORD MASK BASED ON BYTES/SEC ; 0: 128, 1: 256, 3: 512, 7: 1024 ; ; ADDITIONAL DISK PAR´¶ÿòNNNNNNNNNNNNNNNNN¡¡¡þC(”#NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LIST ON D#D(DD)DPB: DS DPB_SZ ;ALLOCATION FOR DRIVE #D(DD) IF (DSK_#D(DD) < 10H) OR (DSK_#D(DD) >= 20H) DS SKTSZ - 1ö–þNNNNNNNNNNNNNNNNNN¡¡¡þC.>…NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þCä™NNNNNNNNNNNNNNNNNNNNNN¡¡¡û= 20H) DS SKTSZ - 1 ENDIF LIST OFF ENDM ; ; RESERVE THE DATA SPACE ; DD DL 1 REPT NDRVS LIST OFF ALLDPB 01ûþNNNNNNNNNNNNNNNNNN¡¡¡þC Ç–NNNNNNNNNNNNNNNNNNNNNN¡¡¡û################################################################### ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@�¶þNNNNNNNNNNNNNNNNNN¡¡¡þC+.NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûH PTR ; LOGRQ: DS 1 ;LOG ON REQUEST REG. ;############################################################################ ;/þNNNNNNNNNNNNNNNNN¡¡¡þC�ˆNNNNNNNNNNNNNNNNNNNNNN¡¡¡û D#D(DD)ALL: DS 75 ;ALLOCATION BIT MAP FOR 8" FLOPPY DRIVE #D(DD) D#D(DD)CHK DS 64 ;DIRECTORY CHECKSUMS STORAGE (1 BYTE PER,þ9NNNNNNNNNNNNNNNN¡¡¡þCnCNNNNNNNNNNNNNNNNNNNNNN¡¡¡û< 256 : 1K= 0, 2K= 1, 4K= 3, 8K= 7, 16K= 15 ; DSM > 255 : 2K= 0, 4K= 1, 8K= 3, 16K= 7 DPB_DSM DS 2 ;DSM- DRIVE STORAGE SIZEøˆþNNNNNNNNNNNNNNNN¡¡¡þC#HÙNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTITIONING DATA FOR THE LOGICAL DRIVE SELECTION. ; PARTITIONING BY TRACKS ARE IMPLIMENTED THRU BDOS USING DPBOFF ABOVE. ; PARTI;æþNNNNNNNNNNNNNNNNN¡¡¡þC)§NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ENDIF LIST OFF ENDM ; ; RESERVE THE DATA SPACE ; DD DL 1 REPT NDRVS LIST OFF ALLDPB 0123456789ABCDEF DD DL¾•þ$NNNNNNNNNNNNNNNNN¡¡¡þC/ ´NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þC±ÊNNNNNNNNNNNNNNNNNNNNNN¡¡¡û23456789ABCDEF DD DL DD + 1 LIST ON ENDM ; ; BLOCKING BUFFER ; BLKBUF: DS 1024 ;HOST BUFFER IF (($ AND 07FFFT™þNNNNNNNNNNNNNNNNN¡¡¡þC ^NNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@ ; ; MACRO TO DEFINE THE DRIVE ALLOCATION & CHECKSUMS AREA ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@N§þNNNNNNNNNNNNNNNNN¡¡¡þC~}NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; DRIVE ALLOCATION AREAS ; ;############################################################################ ; ;@@@@@@@@@@@@9þHNNNNNNNNNNNNNNNNN¡¡¡þC‘¶NNNNNNNNNNNNNNNNNNNNNN¡¡¡û SECTOR) ENDIF LIST OFF ENDM ; ; RESERVE THE DATA SPACE ; DD DL 1 REPT NDRVS LIST OFF ALLDAL 0123456789ABCDEû×þNNNNNNNNNNNNNNNN¡¡¡þC;NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û (IN CLUSTERS) ; INT(((#_TRACKS - OFF) * SPT * BYTES PER SECTOR) / CLUSTER SIZE) -1 DPB_DRM DS 2 ;DRM- DIRECTORY SIZE -1 DP'RþNNNNNNNNNNNNNNNNN¡¡¡þC$ÑNNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTIONING BY HEADS ARE IMPLIMENTED BY USING THE FOLLOWING DATA. ; (HEAD BITS ARE INCLUDED IN SECTOR WORD UPPER BITS) ; DPB_SEgÙþ\NNNNNNNNNNNNNNNN¡¡¡þC*òANNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û DD + 1 LIST ON ENDM ; ; BLOCKING BUFFER ; BLKBUF: DS 1024 ;HOST BUFFER IF (($ AND 07FFFH) > 075FFH) CONMSGxþ“NNNNNNNNNNNNNNNNN¡¡¡þC0ùNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN8NNNNNNNN�Ñ� ‚mƒ;„ …Ø…¦†s‡@ˆ‰Ý‰ªŠx‹FŒ�â�°Ž~�L�‘葵’ƒ“Q”•땺–ˆ—T˜"™ñ™¿šŒ›Zœ'�ö�Äž‘Ÿ` .¡û¡È¢–£d¤1¥ÿ¥Í¦nNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þDN@NNNNNNNNNNNNNNNNNNNNNN¡¡¡û BUFFER PTR DW D#D(DD)DPB ;DRIVE PARAMETER BLK PTR IF ((DD - 1) <= NDHD) AND ((DD - 1) >= STHD) DW 0 ;NO CHECKS ON HAR³ðþNNNNNNNNNNNNNNNNNN¡¡¡þDäæNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûST REG. DVRTPTR DS 2 ;DRIVE DRIVER TABLE BASE ADDRESS PTR DVRXADR DS 2 ;DRIVE DRIVER EXECUTION ADDRESS IF INTCPTS ;##l“þdNNNNNNNNNNNNNNNNNN¡¡¡þD -NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û@@@@@@@@@@@@@@@@@@@@@@ ALLDAL: MACRO #D LIST ON IF ((DD - 1) >= STHD) AND ((DD - 1) <= NDHD) D#D(DD)ALL: DS 127 ;ALLOCATþINNNNNNNNNNNNNNNN¡¡¡þD+QNNNNNNNNNNNNNNNNNNNNNN¡¡¡û########### ; ; RESERVE DRIVE PARAMETER BLOCKS ; ;########################################################################âôþNNNNNNNNNNNNNNNNN¡¡¡þDÄšNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û SECTORS CHECKED ; (DRM +1) / 4 DPBOFF DS 2 ;OFF- # RESERVED TRACKS (USUALLY 2) DPBSZ DS 0 ENDM ; ; ;@@@@@@@@@@@@@@@@¢þHNNNNNNNNNNNNNNNNN¡¡¡þDn= ST8FD) AND ((DD - 1) <= ND8FD) D#D(DD)ALL: DS 57 ;ALLOCATION9þNNNNNNNNNNNNNNNNNN¡¡¡þD²ÆNNNNNNNNNNNNNNNNNNNNNN¡¡¡û#### STRUCT 0 DPBSPT DS 2 ;SPT- SECTORS/TRACK DPBBSH DS 1 ;BSH- BLOCK SHIFT FACTOR DETERMINED BY CLUSTER SIZE ; 1K= 3, 2 þINNNNNNNNNNNNNNNN¡¡¡þD‘ÉNNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE THE DPB FOR DRIVE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@W=þHNNNNNNNNNNNNNNNN¡¡¡þD {—NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ENDIF LD A,(DEFDRV) ;PASS IN DEFAULT DISK TO CCP LD C,A JP CCP SUBTTL DISK ROUTINES ;+++++++++++++++++++++++++++++@þœNNNNNNNNNNNNNNNNN¡¡¡þD&Ñ1NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNTERRUPT PROCESSING WHISTLE INTCPTS EQU TRUE ;ENABLE SYSTEM CALL INTERCEPT WHISTLE BOOT EQU 10H ;10H: HARD DISK, 3: 8" FLOPP/þ�NNNNNNNNNNNNNNNNNN¡¡¡þD,>úNNNNNNNNNNNNNNNNNNNNNN¡¡¡û 0 ; F JADE 8" FLOPPY PHYSICAL DRIVE 1 ENDIF IF BOOT = 3 ; A JADE 8" FLOPPY PHYSICAL DRIVE 0 ; B JADE 8" FLOPPY¨þNNNNNNNNNNNNNNNN¡¡¡þD("NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR LIST OFF ENDM ; ; DEFINE THE DATA ; DD DL 1 REPT NDRVS LIST OFF ALLDPH 0123456789ABCDEF DD DL DD + 1 LIST Oñ¡þHNNNNNNNNNNNNNNNNN¡¡¡þD ÇéNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û############################################### CLKBFR DS 13 ENDIF ROMSAV DS 1 ;ROM SWAP SAVE OF ORIGINAL ROM ;######ãZþNNNNNNNNNNNNNNNNN¡¡¡þDmONNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û BIT MAP FOR 8" DRIVE #D(DD) D#D(DD)CHK DS 32 ;DIRECTORY CHECKSUMS STORAGE (1 BYTE PER SECTOR) ENDIF IF ((DD - 1) >=óØþ NNNNNNNNNNNNNNNNN¡¡¡þD�÷NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûK= 4, 4K= 5, 8K= 6, 16K= 7 DPBBLM DS 1 ;BLM- BLOCK MASK ; 1K = 7, 2K= 15, 4K= 31, 8K= 63, 16K= 127 DPBEXM DS 1 ;EXM- EXTENšþrNNNNNNNNNNNNNNNN¡¡¡þD¢øNNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ALLDPB: MACRO #D LIST ON D#D(DD)DPB: DS DPBSZ ;ALLOCATION FOR DRIVE #vdþdNNNNNNNNNNNNNNNNN¡¡¡þD!H¦NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û TITLE CUSTOMIZED BIOS FOR M5B LIST NOCOND ;============================================================================ ; þ^þrNNNNNNNNNNNNNNNN¡¡¡þD'âNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûY, 20H: 5" FLOPPY DEBUG EQU FALSE ;TRUE TO DUMP THE IOPB DATA TO PRINTER FORM ;******************************************þéNNNNNNNNNNNNNNNNN¡¡¡þD- ËNNNNNNNNNNNNNNNNNNNNNN¡¡¡û PHYSICAL DRIVE 1 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; D SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 0 ; E SIDE 0 ŠóþNNNNNNNNNNNNNNNNN¡¡¡þD±µNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûN ENDM ; ; LAST OF INITIALIZED CODE READ FROM DISK ; BIOSND EQU $ SUBTTL UNINITIALIZED DATA AREA ; ; THE REMAINIkþ'NNNNNNNNNNNNNNNN¡¡¡þD ’ºNNNNNNNNNNNNNNNNNNNNNN¡¡¡û###################################################################### ; ; DRIVE ALLOCATION AREAS ; ;#####################’þrNNNNNNNNNNNNNNNN¡¡¡þD~NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ST5FD) AND ((DD - 1) <= ND5FD) D#D(DD)ALL: DS 35 ;ALLOCATION BIT MAP FOR 5" DRIVE #D(DD) D#D(DD)CHK DS 32 ;DIRECTORY CHECKq¹þNNNNNNNNNNNNNNNNNN¡¡¡þDÔ¤NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT MASK ; DSM < 256 : 1K= 0, 2K= 1, 4K= 3, 8K= 7, 16K= 15 ; DSM > 255 : 2K= 0, 4K= 1, 8K= 3, 16K= 7 DPBDSM DS 2 ;DSM- DR¯èþNNNNNNNNNNNNNNNNN¡¡¡þD;oNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD(DD) LIST OFF ENDM ; ; RESERVE THE DATA SPACE ; DD DL 1 REPT NDRVS LIST OFF ALLDPB 0123456789ABCDEF DD DL DD +Aþ9NNNNNNNNNNNNNNN¡¡¡þD"õNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ASSEMBLY PARAMETERS ; ;============================================================================ FALSE EQU 0 TRUE EQU N¯7þ'NNNNNNNNNNNNNNNNN¡¡¡þD(ò>NNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************************** ; ; CUSTOMIZED BIOS FOR M5B ; (c) 1981 GRH Electronics, CUPERTINO, CA ; ;********** Ÿþ'NNNNNNNNNNNNNNNNN¡¡¡þD.X˜NNNNNNNNNNNNNNNNNNNNNN¡¡¡û& 1 OF HARD DISK PHYSICAL DRIVE 1 ; F SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ENDIF IF BOOT = 20H ; A JADE 5" FLOØxþrNNNNNNNNNNNNNNNNN¡¡¡þD‚„NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNG AREA DOES NOT HAVE TO ; BELONG ON THE DISK. ; BTDRV: DS 1 ;DRIVE # BTTRK DS 2 ;TRACK # BTSEC DS 2 ;SECTOR # BTFLG DSý þBNNNNNNNNNNNNNNNN¡¡¡þD ¡‹NNNNNNNNNNNNNNNNNNNNNN¡¡¡û####################################################### ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@uþgNNNNNNNNNNNNNNNNN¡¡¡þDM3NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSUMS STORAGE (1 BYTE PER SECTOR) ENDIF LIST OFF ENDM ; ; RESERVE THE DATA SPACE ; DD DL 1 REPT NDRVS LIST OFF À¯þ$NNNNNNNNNNNNNNNN¡¡¡þDç•NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIVE STORAGE SIZE (IN CLUSTERS) ; INT(((#_TRACKS - OFF) * SPT * BYTES PER SECTOR) / CLUSTER SIZE) -1 DPBDRM DS 2 ;DRM- DIRECTŽ«þ'NNNNNNNNNNNNNNNNNN¡¡¡þD^NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û 1 LIST ON ENDM IF (($ - 8000H) > 07800H) OR ($ < 8000H) CONMSG **** BIOS TOO BIG, USE MOVCPM & RE-ADJUST! **** HTþNNNNNNNNNNNNNNNNN¡¡¡þD#.ÄNNNNNNNNNNNNNNNNNNNNNNð¡¡¡ûOT FALSE ;============================================================================ ; ; CONDITIONAL ASSEMBLY FLAGS ; ;žþBNNNNNNNNNNNNNNNN¡¡¡þD)ÁNNNNNNNNNNNNNNNNNNNNNN¡¡¡û****************************************************************** ; ; CONFIGURATION: ; ; CPM ; DRIVE USAGE IF BOOT = 1ÔPþNNNNNNNNNNNNNNNNN¡¡¡þD/k©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~þaNNNNNNNNNNNNNNNNN¡¡¡þD××NNNNNNNNNNNNNNNNNNNNNN¡¡¡û 1 ;FLAG BTDMA DS 2 ;DMA ADDRESS BTDMAX DS 1 ;DMA EXTENDED ADDRESS ; DTPTR: DS 2 ;DRIVE TABLE PTR LOGRQ: DS 1 ;LOG ON REQUEîéþNNNNNNNNNNNNNNNN¡¡¡þD 8NNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@ ; ; MACRO TO DEFINE THE DRIVE ALLOCATION & CHECKSUMS AREA ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@QðþrNNNNNNNNNNNNNNNN¡¡¡þD`NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ALLDAL 0123456789ABCDEF DD DL DD + 1 LIST ON ENDM ;#################################################################¡þNNNNNNNNNNNNNNNNN¡¡¡þD÷«NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûORY SIZE -1 DPBAL0 DS 2 ;AL0,1- DIRECTORY ALLOCATION ; 1 MSB PER DIRECTORY CLUSTER ALLOCATED DPBCKS DS 2 ;CKS- # DIRECTORY•þ$NNNNNNNNNNNNNNNNN¡¡¡þD] NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ENDIF END ‰÷þNNNNNNNNNNNNNNNN¡¡¡þD$·SNNNNNNNNNNNNNNNNNNNNNN¡¡¡û============================================================================ SHORT EQU FALSE ;SHORT BIOS (REMOVES UNESENTIAL C‘•þNNNNNNNNNNNNNNNNN¡¡¡þD*”\NNNNNNNNNNNNNNNNNNNNNN¡¡¡û0H ;HARD DISK BOOT CONFIG. ; A SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; B SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 0 ; SþNNNNNNNNNNNNNNNNN¡¡¡þD0xäNNNNNNNNNNNNNNNNNNNNNN¡¡¡û 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 ; ,Ãþ!NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN8NNNÿ€Î��‚jƒ8„…Ô…¢†o‡<ˆ ‰Ø‰¥Šr‹AŒ�Ý�¬Žz�H�‘䑲’�“O”•镸–†—S˜"™ð™¾š‹›Yœ'�ö�Äž‘Ÿ_ .¡û¡É¢—£e¤2¥¦Î¦ÞNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þDypNNNNNNNNNNNNNNNNNNNNNN¡¡¡û G JADE 8" FLOPPY PHYSICAL DRIVE 0 ; H JADE 8" FLOPPY PHYSICAL DRIVE 1 ENDIF ; ;***************************************ŒeþNNNNNNNNNNNNNNNNN¡¡¡þDÓÖNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDULES. ; ; 2.28 - 22 APR 83 GRH ; CHANGED DEFINITIONS TO ALLOW BIG DIRECTORIES. ; DISALLOWED DRIVES C & D. ; ; 2.29 - 3 ÊËþ„NNNNNNNNNNNNNNNNNN¡¡¡þD <NNNNNNNNNNNNNNNNNNNNNN¡¡¡û(0..n-1). This maintains more uniformity in ; parameter passing between hard disk & JADE floppy IOPBs. ; Vector I/O routineGÝþÉNNNNNNNNNNNNNNNN¡¡¡þDaNNNNNNNNNNNNNNNNNNNNNN¡¡¡û use of ROM primitives. ; Moved system down to 60k. ; ; 3.01 26 JUN 88 GRH ; Remove 5" floppy support. Implement in CP/M-86vþ�NNNNNNNNNNNNNNNN¡¡¡þDóªNNNNNNNNNNNNNNNNNNNNNN¡¡¡û==================== ; ; INCLUDE JDDCONT.DEF ; INCLUDE COMIOPB.DEF ; INCLUDE DISKS.DEF ; INCLUDE MONBOARD.DEF ; INCLUDE ZMË;þ“NNNNNNNNNNNNNNNNN¡¡¡þDY NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûKBYTE: EQU 1024 CPMSZ: EQU KBYTE * NKSYS CPMBS: EQU CPMSZ - (20 * KBYTE) ; CP/M BIAS VALUE CCP: EQU CPMBS + 3400H ;ADDR OF CC5EþNNNNNNNNNNNNNNNNN¡¡¡þD%³RNNNNNNNNNNNNNNNNNNNNNN¡¡¡û============================== SECSZ: EQU 128 NDRVS: EQU 6 IF BOOT = 10H ; ; 8" HARD DISK BOOT DATA ; STHD EQU 0 ;SÆ·þHNNNNNNNNNNNNNNNNN¡¡¡þD+�]NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRLZ: EQU 1AH ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE THE TRANSLATION Tã@þ NNNNNNNNNNNNNNNN¡¡¡þD,#NNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************** ; REVISIONS: ; ; 2.2.0 - RELEASE ; ; 2.2.3 - SWAPPED DCM & BIOS SECTORS ON DISK, ALLOWING A ; Ô#þ„NNNNNNNNNNNNNNNN¡¡¡þDÃèNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûSEP 83 GRH ; Changed Rev # for blocked DCM. Enables IBM system 34 ; 256 bytes per sector disks to be read. ; ; 1.10 - 23 SÇþBNNNNNNNNNNNNNNNN¡¡¡þDiNNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûs to monitor rom routines. ; ; 2.03 - 4 JUN 84 GRH ; Add bells & whistles again. ; Move to 61k system. ; ; 2.04 - 30 MAR=uþNNNNNNNNNNNNNNNNNN¡¡¡þD…öNNNNNNNNNNNNNNNNNNNNNN¡¡¡û BIOS. ; Change single function to return drive table ptr into a BIOS function ; call using restart instruction. ; Change LÞˆþ$NNNNNNNNNNNNNNNN¡¡¡þD¦ùNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûONROM.DEF ; INCLUDE DKBTROM.DEF ; INCLUDE NAKEDT.DEF ; INCLUDE ISHA.DEF ; INCLUDE CLOKROM.DEF ; ;=========================5 þNNNNNNNNNNNNNNNN¡¡¡þD L§NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûP BDOS: EQU CPMBS + 3C00H ;ADDRESS OF BDOS BIOS: EQU CPMBS + 4A00H ;ADDRESS OF BDOS BIOSR: EQU 1000H - BIOS ; ; PAGE 0 LOÖÖþ“NNNNNNNNNNNNNNNNN¡¡¡þD&æNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTART LOGICAL DRIVE OF HARD DISK NDHD EQU 3 ;LAST LOGICAL DRIVE OF HARD DISK ST8FD EQU 4 ;START LOGICAL DRIVE OF 8" FLOPPY N6(þNNNNNNNNNNNNNNNNNN¡¡¡þD, ÊNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûABLE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ GXLATE MACRO #SECTORS, #SKEW LIS¯6þNNNNNNNNNNNNNNNN¡¡¡þDNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LARGER BIOS ALLOCATION ON THE DISK. ; ; 2.2.4 - ADDED NAKED TERMINAL DRIVERS & IOBYTE IN ; ANTICIPATION OF THE MONITOR. bLþNNNNNNNNNNNNNNNNN¡¡¡þD ðÙNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûEP 83 GRH ; Move clock-calendar routines to ROM. Add Interrupt handler ; (Mode 2). Change Revision display of sign-on (separËsþNNNNNNNNNNNNNNNNN¡¡¡þDZNNNNNNNNNNNNNNNNNNNNNN¡¡¡û 85 GRH ; Implemented hard disk drive 1 as C: & D:. ; Implemented the Logon function for the hard disk. ; Implemented user %uþ NNNNNNNNNNNNNNNNN¡¡¡þD¶ÇNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOGON to specify the ID sector & track. At same time, fix bug ; which did not specify the logon track. ; ; 3.02 7 JUL 88 Gþ!NNNNNNNNNNNNNNNN¡¡¡þD•ÈNNNNNNNNNNNNNNNNNNNNNN¡¡¡û=================================================== LIST OFF *INCLUDE JDDCONT.DEF *INCLUDE COMIOPB.DEF *INCLUDE DISKS.DEF øþINNNNNNNNNNNNNNNNN¡¡¡þD!–NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCATIONS ; PAGE0: EQU 0 ;START OF CP/M RAM IOBYTE: EQU PAGE0 + 3 ;IOBYTE ADDR DEFDRV: EQU PAGE0 + 4 ;DEFAULT DRIVE PARAM ADDwþrNNNNNNNNNNNNNNNN¡¡¡þD'Õ0NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD8FD EQU 5 ;LAST LOGICAL DRIVE OF 8" FLOPPY ENDIF IF BOOT = 3 ; ; 8" FLOPPY BOOT DATA ; STHD EQU 2 ;START LOGICAïtþNNNNNNNNNNNNNNNNN¡¡¡þD-:ûNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûT OFF NXTSEC DL 1 ;;START WITH SECTOR 1 LOWEST DL 1 ;; REPT #SECTORS LIST ON DB NXTSEC LIST OFF NXTSEC DL NXTSEC + ¤Öþ“NNNNNNNNNNNNNNNNN¡¡¡þD†…NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûALSO, ALL REFERENCES ; REQUIRING THE I/O PROMS TO BOOT HAS BEEN REMOVED. ; ; 2.2.5 - RECONFIGURE FOR 62K SYSTEM. ; ; 2.ë þÉNNNNNNNNNNNNNNNN¡¡¡þD ¥ŠNNNNNNNNNNNNNNNNNNNNN!ö¡¡¡ûate CBIOS rev). ; ; 2.00 - 24 MAR 84 GRH ; Modify for hard disk ; ; 2.01 - 28 APR 84 GRH ; Change hard disk DPB to ref‡cþ„NNNNNNNNNNNNNNNN¡¡¡þDI2NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûfriendly disk error options: Abort, Retry, Ignore. ; Solved warm boot hang problem by reseting host adapter if busy. ; ; 3.00lþNNNNNNNNNNNNNNNNNN¡¡¡þDã”NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRH ; Add '?' to include file names. ; Change hard disk system tracks directory reference to new format. ; Correct bug in driv’zþÉNNNNNNNNNNNNNNNNN¡¡¡þD _NNNNNNNNNNNNNNNNNNNNNN¡¡¡û*INCLUDE MONBOARD.DEF *INCLUDE ZMONROM.DEF *INCLUDE DKBTROM.DEF *INCLUDE NAKEDT.DEF *INCLUDE ISHA.DEF *INCLUDE CLOKROM.DEF "þœNNNNNNNNNNNNNNN¡¡¡þD"*ÅNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR BDOSJV EQU PAGE0 + 5 ;BDOS SYSTEM CALL ENTRY DEFBFR EQU PAGE0 + 80H ;DEFAULT BUFFER ; ; BIOS FUNCTION CALL RESTART VECTOuKþNNNNNNNNNNNNNNNNN¡¡¡þD(ÅNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL DRIVE OF HARD DISK NDHD EQU 5 ;LAST LOGICAL DRIVE OF HARD DISK ST8FD EQU 0 ;START LOGICAL DRIVE OF 8" FLOPPY ND8FD EQU 1 á5þNNNNNNNNNNNNNNNNN¡¡¡þD.o¨NNNNNNNNNNNNNNNNNNNNNN¡¡¡û#SKEW ;ADD SKEW FACTOR ;; IF NXTSEC > #SECTORS ;CHECK FOR OVERFLOW NXTSEC DL NXTSEC - #SECTORS ;; IF NXTSEC <= LOWEST_oþ NNNNNNNNNNNNNNNNN¡¡¡þDµ´NNNNNNNNNNNNNNNNNNNNNN¡¡¡û2.6 - 20 FEB 83 ; DOUBLE D REV C UPGRADE. CHANGE BOARD STATUS PORT BITS. ; ; 2.2.7 - 8 MAR 83 GRH ; ADDED CLOCK/CALENDAR DRI»9þNNNNNNNNNNNNNNNN¡¡¡þD –»NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûlect half size directory, but keep ; allocation for 1k directory ; ; 2.02 - 2 JUN 84 GRH ; Change floppy disk drivers to r ‰þNNNNNNNNNNNNNNNNN¡¡¡þDzNNNNNNNNNNNNNNNNNNNNNN¡¡¡û - 26 JAN 87 GRH ; Implemented new common IOPB code & Jade floppy firmware support. ; Implemented disk drive driver tables a:&þrNNNNNNNNNNNNNNNN¡¡¡þDÐ¥NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûers which caused retry to fail. (sector remained ; corrupted) ; VERSN EQU 302 ; ;****************************************”Bþ'NNNNNNNNNNNNNNNNNN¡¡¡þD?nNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LIST ON ;============================================================================ ; ; DISK OPERATING SYSTEM ADDREºIþÎNNNNNNNNNNNNNNNNN¡¡¡þD#ôNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR ; BFUNRST EQU 28H BFUNRSV EQU PAGE0 + BFUNRST BFUNRSI EQU 0C7H + BFUNRST ; TPA: EQU 100H ;=========================Ð0þäNNNNNNNNNNNNNNNN¡¡¡þD)ö?NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;LAST LOGICAL DRIVE OF 8" FLOPPY ENDIF ;============================================================================ W4þNNNNNNNNNNNNNNNN¡¡¡þD/\™NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ;CHECK FOR REPEAT NXTSEC DL LOWEST + 1 LOWEST DL NXTSEC ENDIF ENDIF ;; ENDM LIST ON ENDM ;@@@@@@@@@@@@@@@A7þNNNNNNNNNNNNNNNNNN¡¡¡þDàçNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûVER, SYSTEM CALL INTERCEPT, ; ILLEGAL SYSTEM CALL MESSAGE, CHANGED BIOS SIZE TO END ; OF INITIALIZED DATA AREA. RESTRUCTURE MOž¸þyNNNNNNNNNNNNNNNN¡¡¡þD ,NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûelate to ISASI control of JADE ; FDC. ; Change IOPB sector value from physical sector (1..n) to logical ; sector value ÜäþœNNNNNNNNNNNNNNNN¡¡¡þD/PNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûnd new function to return ; a ptr to a drive table. ; Removed init of IOBYTE. ; Implemented 5" floppy driver. ; Implementedbèþ$NNNNNNNNNNNNNNNNN¡¡¡þDÀ›NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************ SUBTTL SYSTEM DECLARATIONS ;======================================================== þ°NNNNNNNNNNNNNNNNN¡¡¡þDj=NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûSSES ; ;============================================================================ NKSYS: EQU 60 ;SYSTEM SIZE IN K BYTES p{þ!NNNNNNNNNNNNNNNN¡¡¡þD$€cNNNNNNNNNNNNNNNNNNNNNN¡¡¡û=================================================== ; ; OTHER DECLARATIONS ; ;==============================================.þNNNNNNNNNNNNNNNNN¡¡¡þD*£lNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ; ASCII CHARS ; ;============================================================================ LF: EQU 0AH CR: EQU 0DH CT�HþgNNNNNNNNNNNNNNNNN¡¡¡þD0OÔNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; INITIALIZE VERSION TEXT IN RAM MACRO ; ;@@@@@@@@@@@@@@@@@@�ùþ9NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN8NNNNNNNN�Ñ�Ÿ‚lƒ:„…Ö…£†q‡>ˆ ‰Û‰©Šw‹FŒ�á�¯Ž}�K�‘瑵’ƒ“Q”•앺–ˆ—V˜$™ò™ÀšŽ›\œ)�ø�Åž’Ÿ` /¡ü¡Ê¢˜£f¤4¥¦Ï¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þE8ôNNNNNNNNNNNNNNNNNNNNN!ö¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ PVERS MACRO #VERS DD DL #VERS IF DD > 9999 DB (DD / 10000) + V…þ'NNNNNNNNNNNNNNNNN¡¡¡þE’RNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDSK ;SELECT DISK DRIVE JP SETTRK ;SET TRACK # JP SETSEC ;SET SECTOR # JP SETDMA ;SET TRANSFER ADDR JP DISKRD ;PERFO þNNNNNNNNNNNNNNNNN¡¡¡þE }™NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûADDR FOR SBD ; ; CONTINUE ON WITH INIT ; INIT1: JR INIT ;############################################################¥ŽþNNNNNNNNNNNNNNNN¡¡¡þE]åNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD ; CALL GETMON ; ; INIT DEFAULT DRIVE ; LD A,(?DKPROM + 1) ;USE DRIVE # PASSED IN PAGE 0 AND A,3 LD (DEFDRV),A ;awþ­NNNNNNNNNNNNNNNN¡¡¡þE².NNNNNNNNNNNNNNNNNNNNNN¡¡¡û **** ELSE DS DIRBF+SECSZ-$ ;FILL OUT DIRECTORY BUFFER TO 1 SECTOR SIZE ENDIF ;----------------------------------ÒþdNNNNNNNNNNNNNNNNN¡¡¡þEˆNNNNNNNNNNNNNNNNNNNNNN¡¡¡û FOR A HUNG CONDITION AND CLEAR IF TRUE ; IN A,(?HSTATUS) ;IF HOST ADAPTER BUSY THEN BIT ?HBUSYB,A JR Z,NTHUNG ; LD A,–þNNNNNNNNNNNNNNNNN¡¡¡þE%òÖNNNNNNNNNNNNNNNNNNNNNN¡¡¡û HL ; LD HL,(DEFBFR + ?BDSCCPS) ;FETCH CCP TRK/SECTOR LD C,L LD B,0 CALL SETSEC ; LD C,H CALL SETTRK ; LD BC,CCµ8þdNNNNNNNNNNNNNNNN¡¡¡þE+ÑÙNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOM DIRECTORY LD C,L LD B,A ;A STILL CONTAINS 0 CALL SETSEC ; LD C,H CALL SETTRK ; JR WREAD ; ; ; WARM BOOT E&˜þNNNNNNNNNNNNNNNN¡¡¡þEm§NNNNNNNNNNNNNNNNNNNNNN¡¡¡û'0' DD DL DD % 10000 ENDIF IF DD > 999 DB (DD / 1000) + '0' DD DL DD % 1000 ENDIF DB (DD / 100) + '0' DB '.'Æ þNNNNNNNNNNNNNNNN¡¡¡þE‚lNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRM DISK READ JP DISKWR ;PERFORM DISK WRITE JP LISTST ;RETURN LIST STATUS JP SECTRN ;TRANSLATE SECTOR JP BIOFUNC ;EXEÍ�þ·NNNNNNNNNNNNNNNNN¡¡¡þE(ÊNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û################ ; ; DIRECTORY SECTOR BUFFER STARTS HERE AFTER CRUNCHING COLD START ; CODE. THIS BUFFER IS USED BY THE CP/M Ä:þNNNNNNNNNNNNNNNNNN¡¡¡þEÄrNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; SEND SYSTEM SIGN-ON ; CLOGO: LD HL,MSGSO CALL EDITOR ; ; MODIFY COLD START VECTOR TO WARM START ; LD HL,(BIOS+4!þNNNNNNNNNNNNNNNNN¡¡¡þEç}NNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------------ ; ; WARM REBOOT ENTRY LOADS CCP,BDOS FROM DISK & ; SETS UP VARIABLES ; ;--------------------------�-þNNNNNNNNNNNNNNNN¡¡¡þE #NNNNNNNNNNNNNNNNNNNNNN¡¡¡û?DDCLR LD (IOPB + ?PBCMDO),A CALL XPRIM ; NTHUNG: ENDIF ; ; LOG ON DRIVE TO INIT TABLES ; LD A,(?DKPROM + 1) gîþNNNNNNNNNNNNNNNNN¡¡¡þE&§…NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûP CALL SETDMA ; ; READ CCP/BDOS ; WREAD: CALL DISKRD JR NZ,WEROR ;IF ERROR THEN EXIT ; ; NEXT SECTOR ; LD HL,BT?èþrNNNNNNNNNNNNNNNNNN¡¡¡þE,HNNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûRROR, OUTPUT MSG & HALT ; WEROR: LD HL,MSGLE ;OUTPUT ERROR MESSAGE CALL EDITOR HALT ; ; ; BOOT OK, INIT PAGE 0 ; WZ~þ!NNNNNNNNNNNNNNN¡¡¡þE^–NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û DB ((DD % 100) / 10) + '0' DB (DD % 10) + '0' ENDM SUBTTL BIOS CODE ORG BIOS ;----------------------------------|þ„NNNNNNNNNNNNNNNN¡¡¡þE ±]NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCUTE FUNCTION CALL ;############################################################################ ; ; THESE BOOT PARAMS MU>¬þNNNNNNNNNNNNNNNN¡¡¡þEûNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDIRECTORY CHECK ROUTINES THAT ; CHECK FOR DISK CHANGE. ; ;##################################################################ß&þNNNNNNNNNNNNNNNNN¡¡¡þE÷CNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û) LD (BIOS+1),HL ; ; BOOT CCP & BDOS ; JR WARM ;##################################################################Ž@þXNNNNNNNNNNNNNNNNN¡¡¡þEÔLNNNNNNNNNNNNNNNNNNNNNN¡¡¡û-------------------------------- WARM: IF INTRPTS ; ; SET INTERRUPT VECTOR TABLE BASE ; LD A,HIGH INTABL LD I,A ; íþHNNNNNNNNNNNNNNNNN¡¡¡þE!>NNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡ûAND A,3 ;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 DIRECT«•þ¤NNNNNNNNNNNNNNNN¡¡¡þE'”´NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSEC INC (HL) ; LD DE,SECSZ ;DMA := DMA + SECTOR SIZE LD HL,(BTDMA) ADD HL,DE LD (BTDMA),HL ; ; IF NOT INTO BDOS TB¤þ NNNNNNNNNNNNNNNNN¡¡¡þE-{NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRPG: ; ; INIT BIOS WARM START IN PAGE 0 ; LD A,0C3H LD HL,BIOS + 3 LD (PAGE0),A LD (PAGE0 + 1),HL ; ; INIT BDOSpþrNNNNNNNNNNNNNNNNN¡¡¡þEÇNNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------------------------------ ; ; BIOS JUMP VECTOR TABLE ; ;-------------------------------------------------èmþ NNNNNNNNNNNNNNNN¡¡¡þE äNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûST RESIDE AS DEFINED RIGHT BEFORE THE COLD INIT ; ROUTINE START AND MUST BE IN THE 1ST SECTOR. THESE 2 WORDS ARE REFERENCED ;ëþNNNNNNNNNNNNNNNNNN¡¡¡þE¶NNNNNNNNNNNNNNNNNNNNNN¡¡¡û########## DIRBF: EQU $ ;BUFFER BEGINNING ;---------------------------------------------------------------------------- £„þrNNNNNNNNNNNNNNNNN¡¡¡þE¢NNNNNNNNNNNNNNNNNNNNNN¡¡¡û########## ; ; SIGN-ON MESSAGE ; ;############################################################################ MSGSO: DB CRˆþgNNNNNNNNNNNNNNNNN¡¡¡þEMÛNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; SET INTERRUPT MODE TO 2 ; IM 2 ; ; ENABLE INTERRUPT VECTOR 7 ; IN A,(?INTMSK) AND A,7FH OUT (?INTMSK),A ; ;ìbþNNNNNNNNNNNNNNNN¡¡¡þE"kANNNNNNNNNNNNNNNNNNNNNN¡¡¡ûORY ; LD BC,DEFBFR ;SET XFER ADDRESS (USE DEFAULT BUFFER) CALL SETDMA ; LD BC,?BTDIRS ;SET DIRECTORY SECTOR CALL SET,iþ NNNNNNNNNNNNNNNNN¡¡¡þE(„ŠNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûHEN READ NEXT SECTOR ; LD DE,BDOS XOR A,A SBC HL,DE JR C,WREAD ; ; ELSE IF AT BEGINNING OF BDOS THEN SET UP NEW TRAË®þNNNNNNNNNNNNNNNNN¡¡¡þE..,NNNNNNNNNNNNNNNNNNNNNN¡¡¡û CALL VECTOR IN PAGE 0 ; LD HL,BDOS + 6 LD (BDOSJV),A LD (BDOSJV + 1),HL ; ; INIT BIOS CALL VECTOR IN PAGE 0 ; LD ¶^þHNNNNNNNNNNNNNNNNN¡¡¡þEô0NNNNNNNNNNNNNNNNNNNNNN¡¡¡û--------------------------- JP INIT1 ;COLD START ENTRY JP WARM ;RELOAD CCP/BDOS JP CNSCK ;GET CONSOLE STATUS JP CI ;X'þINNNNNNNNNNNNNNNN¡¡¡þE ×?NNNNNNNNNNNNNNNNNNNNNN¡¡¡û BY THE BOOT CODE IN ORDER TO FIND THE LOAD ADDRESS FOR THE BIOS & IT'S ; LENGTH. ; ;######################################×�þ“NNNNNNNNNNNNNNNNN¡¡¡þE;‡NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û; ; INIT - COLD START ENTRY FROM BOOT MUST SET ALL BIOS PARAMS ; ;-------------------------------------------------------Œ+þNNNNNNNNNNNNNNNN¡¡¡þE‘!NNNNNNNNNNNNNNNNNNNNNN¡¡¡û,LF DB CPMSZ / (KBYTE * 10) + '0' DB (CPMSZ MOD (KBYTE * 10)) / KBYTE + '0' DB 'K CP/M-80 Vers 2.2',CR,LF DB 'M5b CBIOSÆSþNNNNNNNNNNNNNNNNNN¡¡¡þE~êNNNNNNNNNNNNNNNNNNNNNN¡¡¡û FINALLY ENABLE VECTORED INTERRUPTS ; IN A,(?MONSTS) OR A,?MONIE OUT (?MONSTS),A EI ENDIF ; ; SET TEMPORARY ST ;þ NNNNNNNNNNNNNNNN¡¡¡þE#XpNNNNNNNNNNNNNNNNNNNNNNð¡¡¡ûSEC ; LD BC,0 ;SET TRACK TO 0 CALL SETTRK ; CALL DISKRD JR NZ,WEROR ; ; CHECK FOR VALID BOOT DIRECTORY ; LD A,âÝþNNNNNNNNNNNNNNNN¡¡¡þE)·»NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûCK & SECTOR ; JR Z,RDBDOS ; ; ELSE IF NOT AT BIOS THEN READ NEXT SECTOR ; LD DE,BIOS - BDOS SBC HL,DE JP C,WREAD +þINNNNNNNNNNNNNNNNN¡¡¡þE/NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHL,BIOFUNC LD (BFUNRSV),A LD (BFUNRSV + 1),HL ; ; SET DEFAULT SECTOR BUFFER ; LD BC,DEFBFR CALL SETDMA ; IF INTñïþdNNNNNNNNNNNNNNNNNN¡¡¡þE¡cNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCONSOLE INPUT JP COC ;CONSOLE OUTPUT JP LO ;PRINTER OUTPUT JP PUNCH JP READER JP HOME ;HOME SELECTED DRIVE JP SELfþ!NNNNNNNNNNNNNNNN¡¡¡þE N¨NNNNNNNNNNNNNNNNNNNNNN¡¡¡û###################################### BIOSSZ: DW BIOSND - BIOS ;BIOS MODULE SIZE IN BYTES BIOSST: DW BIOS ;BIOS MODULE LOAD çàþ NNNNNNNNNNNNNNNN¡¡¡þEnÔNNNNNNNNNNNNNNNNNNNNNN¡¡¡û--------------------- INIT: ; ; SET TEMPORARY STACK ; LD SP,DEFBFR ;USE PAGE 0 FOR STACK ; ; MAKE SURE ROM IS ENABLEùþNNNNNNNNNNNNNNNN¡¡¡þE�NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û Vers ' PVERS VERSN DM CR,LF IF $ > (DIRBF + SECSZ) CONMSG **** WARNING! COLD INIT CODE BIGGER THAN DIR BUFFER`+þNNNNNNNNNNNNNNNNN¡¡¡þE+¹NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûACK ; LD SP,DEFBFR ; ; INSURE MONITOR ROM STILL ENABLED ; CALL GETMON ; IF BOOT = 10H ; TEST ISHA HOST ADAPTER5 þNNNNNNNNNNNNNNNNN¡¡¡þE$ÁçNNNNNNNNNNNNNNNNNNNNNN¡¡¡û(DEFBFR) CP A,86H JR C,WEROR ; ; SET UP TO LOAD CCP/BDOS ; LD HL,(DEFBFR + ?BDSBDSS) ;PREFETCH BDOS TRK/SECTOR PUSHEÕþNNNNNNNNNNNNNNNNN¡¡¡þE*âèNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û; ; ELSE DONE READING SYSTEM ; JP WZRPG ; ; ; ELSE SET UP & READ BDOS ; RDBDOS: POP HL ;RESTORE BDOS TRK/SECTOR FRª+þNNNNNNNNNNNNNNNN¡¡¡þE0PNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCPTS ; ; PUT BDOS VECTOR INTO INTERCEPT CODE ; LD HL,(BDOS + 7) LD (BDOSV),HL ; ; NOW PUT INTERCEPT VECTOR INTO BDOfþrNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÎNNÿ€Í�›‚hƒ6„…Ò… †n‡<ˆ ‰Ø‰¥Šs‹AŒ�Ý�«Žz�I�‘䑱’“M”•è•¶–„—Q˜™í™»š‰›Wœ%�ó�ÁžŽŸ\ +¡ø¡Å¢“£a¤.¥ü¥Ê¦ÞNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þEÄNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS CODE ; LD HL,INTCPT LD (BDOS + 7),HL ; ; INITIALIZE CLOCK VECTORS IF CLOCK INSTALLED ; ; LD C,?CLKF7 ;TEST FOR BOARëþ„NNNNNNNNNNNNNNNN¡¡¡þE¥bNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; WRITE A DISK SECTOR ; EXIT - A= 0: OK; /0: ERROR ; ;+++·Gþ¹NNNNNNNNNNNNNNNNN¡¡¡þE J©NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û SAVE LOGON REQUEST FLAG ; LD A,E LD (LOGRQ),A ; ; COMPUTE DISK DRIVER TABLE PTR ; CALL RETDVRT ;DRIVE IS STILL IN Ê�þrNNNNNNNNNNNNNNNN¡¡¡þEjÕNNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡ûB + ?PBST2O),A ; CALL DISKLOG JP NZ,FDSKER ; ; IF NO ID SECTOR THEN USE DEFAULTS ; LD A,(IOPB + ?PBST2O) CP A,-2 ˆšþNNNNNNNNNNNNNNNN¡¡¡þE…NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPTR ; LD HL,(DTPTR) XOR A,A RET ; ; ; IF NOT HARD DISK THEN GO DO FLOPPY TEST ; LGDEF: LD A,(BTDRV) IF STHD <>~þHNNNNNNNNNNNNNNNNN¡¡¡þE/¸NNNNNNNNNNNNNNNNNNNNNN¡¡¡û****************************** ; ; SET TRACK # ; ENTRY- BC= TRACK # ; ;****************************************************&$þNNNNNNNNNNNNNNNNN¡¡¡þE%ÅæNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û+++++++++++++++ ; ; SECTOR TRANSLATION FUNCTION ; ENTRY- DE= 0: NO XLATE, ELSE PTR TO XLATE TABLE ; BC= SECTOR # TO XLATE NYþ·NNNNNNNNNNNNNNNNN¡¡¡þE+æéNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTION ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DISKLOG: CºþrNNNNNNNNNNNNNNNN¡¡¡þEZ—NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD PRESENT ; CALL CLK1 ; ; IF CLOCK PRESENT THEN TURN ON CLOCK DRIVE ; ; LD A,38H ;COND. JR (ON) ; JR CLKON ; ; ELSE((þ·NNNNNNNNNNNNNNNNN¡¡¡þEµ\NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DISKWR: LD A,?DDWRS ;SELECT WRITE OP JP DISKOP œ,þ¼NNNNNNNNNNNNNNNN¡¡¡þEúNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûC REGISTER LD (DVRTPTR),HL ; ; PREFETCH DRIVER EXECUTION ADDRESS FROM TABLE ; LD E,(HL) ;STORE ADDRESS INC HL LD DÜûþ NNNNNNNNNNNNNNNNN¡¡¡þEóBNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û;0: NO ID, -1: JADE ID, -2: EXTENDED ID JR NZ,LGDEF ; ; ELSE XFER ID SECTOR DATA TO TABLES ; CALL TRNONE ;ASSUME NO TR‰¢þ NNNNNNNNNNNNNNNN¡¡¡þEÐMNNNNNNNNNNNNNNNNNNNNNN¡¡¡û 0 CP A,STHD JR C,LGCKFD ENDIF CP A,NDHD + 1 JR NC,LGCKFD ; ; ELSE USE HARD DISK DEFAULTS ; CALL TRNONE ; N£qþäNNNNNNNNNNNNNNNN¡¡¡þE :NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û************************ SETTRK: LD (BTTRK),BC RET ;******************************************************************¡þNNNNNNNNNNNNNNNNN¡¡¡þE&�µNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; EXIT - HL= XLATED SECTOR OR (BC) + 1 ; BC= UNCHANGED ; A, DE= ? ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++ mþNNNNNNNNNNNNNNNNNN¡¡¡þE,~NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û; ; SET DESCRIPTOR SECTOR XFER ADDRESS TO DEFAULT BUFFER ; LD HL,DEFBFR LD (IOPB + ?PBDMAO),HL XOR A,A LD (IOPB + ?PûþHNNNNNNNNNNNNNNNN¡¡¡þEi¦NNNNNNNNNNNNNNNNNNNNNN¡¡¡û TURN OFF CLOCK DRIVE ; LD A,18H ;UNCOND. JR (OFF) (CAUSES JUMP TO ILLEGAL) ; CLKON: LD (INHCLK),A ; ENDIF ; ; PAS©ÏþäNNNNNNNNNNNNNNNN¡¡¡þE †mNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SELECT DRIVE FUNCTION ; LOG-ON - SET DIS îþ$NNNNNNNNNNNNNNNNN¡¡¡þE,ËNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û,(HL) INC HL LD (DVRXADR),DE ; ; FETCH FLAGS ; LD C,(HL) ; ; COMPUTE DISK PARAMETER TABLE ADDRESS ; LD HL,(BTDúÃþ“NNNNNNNNNNNNNNNNNN¡¡¡þEÀsNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûANSLATION ; ; IF HARD DISK OR DOUBLE DENSITY THEN NO TRANSLATION ; LD A,(DEFBFR + ?IDFLGO) AND A,[1 SHL ?DFDTDB] OR [1 t¼þ„NNNNNNNNNNNNNNNN¡¡¡þEã|NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûO XLATE LD HL,HDPBK ; ; XFER DATA TO TABLES ; SEL2: PUSH HL CALL DPBAD ; USE DEFAULT TABLE POP HL LD BC,DPBSZ Ø"þNNNNNNNNNNNNNNNNN¡¡¡þE! "NNNNNNNNNNNNNNNNNNNNNN¡¡¡û********** ; ; SET SECTOR ; ENTRY- BC= SECTOR # ; ;************************************************************************'pþ„NNNNNNNNNNNNNNNN¡¡¡þE'£„NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++ SECTRN: ; ; IF NO TRANSLATION THEN RETURN SECTOR++ ; LD A,D ;IF TABLE ADDR = 0 THEN NO TRANSLATIÛ—þHNNNNNNNNNNNNNNNNN¡¡¡þE-LONNNNNNNNNNNNNNNNNNNNN!ô¡¡¡ûBDMAXO),A ; ; SET DESCRIPTOR SECTOR SECTOR ; LD HL,?IDSECT LD (IOPB + ?PBSECO),HL ; ; SET DESCRIPTOR SECTOR TRACK T_þ“NNNNNNNNNNNNNNNNN¡¡¡þEð1NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS DEFAULT DISK TO CCP ; LD A,(DEFDRV) LD C,A JP CCP SUBTTL BIOS DISK FUNCTION ROUTINES ;++++++++++++++++++++++++++++φþäNNNNNNNNNNNNNNNN¡¡¡þE Ó>NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûK PARAMETER BLOCK ; ENTRY- C= DRIVE # ; E= 0 IF NEW SELECT ; EXIT - HL= PTR TO DPT OR 0 FOR ERROR ; ;+++++++++++++++++++++©¢þ NNNNNNNNNNNNNNNN¡¡¡þE?†NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûRV) LD H,0 ADD HL,HL ;DISK # * 16 ADD HL,HL ADD HL,HL ADD HL,HL LD DE,D0DPH ADD HL,DE ; ; IF NOT FIRST SELECTx0þ$NNNNNNNNNNNNNNNNN¡¡¡þE• NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSHL ?DFHARDB] ; ; ELSE SET TRANSLATION ; CALL Z,TR8 ; ; XFER DISK DATA TO DPB ; NOX: CALL DPBAD ;GET ADDR OF DPB dþ„NNNNNNNNNNNNNNNNN¡¡¡þEzëNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLDIR JR SEL1 ; ; ; USE 8" FLOPPY DEFAULTS ; LGCKFD: CALL TR8 LD HL,SD8PBK JR SEL2 ;***************************�šþÂNNNNNNNNNNNNNNN¡¡¡þE"\qNNNNNNNNNNNNNNNNNNNNNN¡¡¡û**** SETSEC: LD (BTSEC),BC RET ;**************************************************************************** ; ; SET2áþÈNNNNNNNNNNNNNNNNN¡¡¡þE(³ºNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûON OR A,E JP Z,NOTRAN ; ; ELSE CALCULATE NEW SECTOR FROM TABLE ; EX DE,HL ADD HL,BC LD L,(HL) ; LD H,0 RET þ NNNNNNNNNNNNNNNNN¡¡¡þE.NNNNNNNNNNNNNNNNNNNNNN¡¡¡û; LD L,H ;H == 0 FROM LAST OPERATION (HL= 0) LD (IOPB + ?PBTRKO),HL ; ; PASS COMMAND TO EXECUTOR ; LD A,?DDLOG JR œ±þ‰NNNNNNNNNNNNNNNNN¡¡¡þEÃNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++ ; ; READ A DISK SECTOR ; EXIT - A= 0: OK; /0: ERROR ; ;+++++++++++++++++++ö þNNNNNNNNNNNNNNNN¡¡¡þE àNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++ SELDSK: ; ; ASSUME ERROR ; LD HL,0 ; ; IF UNSUPPORTED DRIVE ã¢þrNNNNNNNNNNNNNNNNN¡¡¡þE ·NNNNNNNNNNNNNNNNNNNNNN¡¡¡û OR LOGON INHIBITED THEN RETURN TABLE PTR ; LD A,(LOGRQ) OR A,C CPL AND A,1 RET Z ; ; ELSE LOG ON DRIVE ; LD (uãþÉNNNNNNNNNNNNNNNN¡¡¡þE¦NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD HL,DEFBFR + ?IDSPTO LD BC,DPBSZ LDIR ; ; XFER DISK PHYSICAL DATA TO TABLE ; LD HL,DEFBFR + ?IDFLGO ; SEL1: PUS›ìþ!NNNNNNNNNNNNNNNNN¡¡¡þEIÚNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************* ; ; HOME DRIVE - TREAT AS SEEK TRK 0 ; EXIT - BC= 0 ; ;****************-~þNNNNNNNNNNNNNNNNN¡¡¡þE#o@NNNNNNNNNNNNNNNNNNNNNN¡¡¡û TRANSFER ADDR ; ENTRY- BC= ADDRESS ; EXIT - A= 0 ; ;***********************************************************************+þòNNNNNNNNNNNNNNNN¡¡¡þE)€‹NNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡û; ; ; CONVERT FROM CP/M'S LOGICAL SECTOR {0..N-1} TO PHYSICAL SECTOR {1..N} ; NOTRAN: LD HL,1 ADD HL,BC RET Sx/þNNNNNNNNNNNNNNNN¡¡¡þE/*-NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûDISKOP2 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; COMMON DISK I/O CODE ; ENTRY- m¸þ“NNNNNNNNNNNNNNNNNN¡¡¡þE–SNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DISKRD: LD A,?DDRDS ;SELECT READ OP JP DISKOP ;+++++++++++++Ô-þNNNNNNNNNNNNNNNN¡¡¡þE y˜NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûREQUESTED THEN RETURN 0 (ERROR) ; LD A,C CP A,NDRVS RET NC ; ; STORE DRIVE # FOR FUTURE USE ; LD (BTDRV),A ; ; z�þ“NNNNNNNNNNNNNNNN¡¡¡þEYäNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDTPTR),HL ;SAVE DRIVE TABLE PTR ; ; ATTEMPT TO READ ID SECTOR ; XOR A,A ;INIT FLAG BYTE UNTIL FIRMWARE REVISED LD (IOP6þ NNNNNNNNNNNNNNNNN¡¡¡þE¶/NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûH HL LD HL,(DVRTPTR) LD DE,DVRFLG ADD HL,DE EX DE,HL POP HL LD BC,DVRSIZ - DVRFLG LDIR ; ; RETURN DRIVE TABLE ž•þNNNNNNNNNNNNNNNNN¡¡¡þE‰NNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************************ HOME: LD BC,0 ;**********************************************õ0þNNNNNNNNNNNNNNNN¡¡¡þE$ö×NNNNNNNNNNNNNNNNNNNNNN¡¡¡û***** SETDMA: LD (BTDMA),BC XOR A,A LD (BTDMAX),A RET ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Zeþ¤NNNNNNNNNNNNNNNNN¡¡¡þE*ÕØNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUBTTL DISK SUPPORT ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; LOGON DISK FUNC·þgNNNNNNNNNNNNNNNNN¡¡¡þE09`NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA= IOPB COMMAND ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ç–þ„NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN8NNNNNNNN�Ò�¡‚oƒ=„ …Ù…¦†s‡@ˆ‰Ý‰ªŠw‹FŒ�â�±Ž~�L�‘é‘·’…“S”!•–‹—Y˜'™õ™Ãš‘›_œ-�ü�Éž—Ÿf 5¡¢Ð¢�£k¤9¥¦Ô¦æNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þF£(NNNNNNNNNNNNNNNNNNNNNN¡¡¡û DISKOP: ; ; SET UP IOPB ; LD HL,BTTRK LD DE,IOPB + ?PBTRKO LD BC,?PBSTATO - ?PBTRKO LDIR ; DISKOP2: LD (IOPB + þ“NNNNNNNNNNNNNNNNN¡¡¡þF ŽNNNNNNNNNNNNNNNNNNNNNN¡¡¡û POP DE INC DE ;NEXT ERROR BYTE DJNZ DSKER1 ;IF NOT DONE THEN LOOP ; LD HL,DSKEB ;OUTPUT ERROR MESSAGE CALL EDITOR êùþNNNNNNNNNNNNNNNNNNN¡¡¡þF æENNNNNNNNNNNNNNNNNNNNNN¡¡¡û***************************** ; ; SET 3740 SECTOR TRANSLATION PROCEDURE ; ENTRY- (DTPTR)= MUST BE PTR TO DTP ; EXIT - DE, HL¹þ^NNNNNNNNNNNNNNNN¡¡¡þFÆ9NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û++++++++++++++++++++++++++++++++++++++ DPBAD: LD HL,(DTPTR) ;FETCH BASE ADDR LD DE,10 ;ADD OFFSET OF DPB PTR ADD HL,DE L‹Ÿþ NNNNNNNNNNNNNNNN¡¡¡þF)òNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û?PBSECO) ; PUSH HL ;SAVE SECTOR TO RESTORE LATER ; ADD HL,DE LD (IOPB + ?PBSECO),HL ; ; EXECUTE IOPB ; CALL XPRúþNNNNNNNNNNNNNNNNN¡¡¡þFƒTNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û POP IX ; ; RETURN THE COMMAND RESULTS STATUS ; LD A,(IOPB + ?PBSTATO) OR A,A RET SUBTTL JADE FLOPPY DRIVER RO§çþINNNNNNNNNNNNNNNNN¡¡¡þF%i NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; BREAK; DEFAULT: /* DATA TRACKS */ } ; LD C,(IY + DVRDSPT) ; ; IF SECTOR < SECTORS_PER_TRACK THEN SIDE = 0 ; FD( þrNNNNNNNNNNNNNNNN¡¡¡þF+JNNNNNNNNNNNNNNNNNNNNNNð¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++ ; ; FUNCTION DISPATCHER ; EXIT - A= -1: ERROR, 0: OK ; ;+++++++++++++++++++zþrNNNNNNNNNNNNNNNN¡¡¡þFö{NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ?PBCMDO),A ; ; FETCH DRIVER VECTOR & EXECUTE DISK DRIVER ; DKOPLP: PUSH IY ;SAVE IY LD IY,(DVRTPTR) ;FETCH TABLE BAS©—þNNNNNNNNNNNNNNNN¡¡¡þF°NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; GET USER RESPONSE ; CALL CI ;GET USER RESPONSE ; PUSH AF ;SAVE CHAR LD C,A ;ECHO CHAR CALL COC POP AF ; ¹þNNNNNNNNNNNNNNNNN¡¡¡þF³NNNNNNNNNNNNNNNNNNNNNN¡¡¡û= ? ; ;**************************************************************************** TR8: TR3740: LD DE,SDTRAN ; SETTR: LD ¹ìþNNNNNNNNNNNNNNNNNN¡¡¡þF_®NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD E,(HL) ;FETCH DPB PTR INC HL LD D,(HL) RET SUBTTL HARD DISK ROUTINES ;++++++++++++++++++++++++++++++++++++++++++²¡þNNNNNNNNNNNNNNNN¡¡¡þF|¡NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûIM ; ; RESTORE SECTOR ; POP HL LD (IOPB + ?PBSECO),HL ; ; DONE ; RET ;+++++++++++++++++++++++++++++++++++\ìþNNNNNNNNNNNNNNNN¡¡¡þF –ÿNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; JADE 8" FLOPPY DISK DRIVER FUNCTION &ªþ NNNNNNNNNNNNNNNNN¡¡¡þF&¾NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; BIOS CALL ENTRY (E= DRIVE #) ; RETDVRTF: LD C,E ; RETDVRT: BÌþNNNNNNNNNNNNNNNNN¡¡¡þF ÑuNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûALL ; PUSH DE POP IX LD HL,?DSKX LD A,(?DKPROM) CALL EXROM ; ; FETCH & RETURN RESULT STATUS ; LD A,(IX + ?PBSTí®þNNNNNNNNNNNNNNNN¡¡¡þFñ NNNNNNNNNNNNNNNNNNNNNN¡¡¡û CALL COC ; ; RETURN DATA ; POP AF RET ;**************************************************************************.}þ„NNNNNNNNNNNNNNNN¡¡¡þFÂNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBDOS + 11H ;THIS ADDR MODIFIED BY WARM BOOT RTN ; ; THE FOLLOWING CONDITIONAL JUMP IS MODIFIED TO AN UNCONDITIONAL JUMP BY ;µòþNNNNNNNNNNNNNNNNN¡¡¡þF´dNNNNNNNNNNNNNNNNNNNNNN¡¡¡û OUTPUT FUNCTION # ; POP HL LD A,L CALL PRHEX ; ; OUTPUT NEW LINE ; CALL CRLF ; ; RETURN NULLS ; XOR A,A ï*þ'NNNNNNNNNNNNNNNNN¡¡¡þF%^:NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûROM ENTRY POINT JR CLK2 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN TIME FàJþœNNNNNNNNNNNNNNNN¡¡¡þF+}5NNNNNNNNNNNNNNNNNNNNNN¡¡¡û****************************************************************** CLKSET: LD C,?CLKF2 ; CLK1: LD HL,?CLKFUN ; CLK2: LD AfjþNNNNNNNNNNNNNNNNN¡¡¡þFÁKNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHYSICAL CONFIGURATION TABLE PTR DW EXIOPB ;2:EXECUTE THE IOPB MAXFUNCS EQU ($ - BFUNTBL) / 2 ;+++++++++++++++++++++++++xáþ·NNNNNNNNNNNNNNNNN¡¡¡þF.€NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD HL,DVR0 ;START AT 1ST TABLE ; ; IF DRIVE == 0 THEN ALREADY THERE ; LD A,C OR A,A RET Z ; ; ELSE IF ILLEGAL D°vþNNNNNNNNNNNNNNNNNN¡¡¡þF„&NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûATO) POP IX ;RESTORE REG OR A,A ;TEST RESULT FOR RETURN RET SUBTTL NON-DISK PROCEDURES ;************************ºýþ NNNNNNNNNNNNNNNNN¡¡¡þFhžNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û* ; ; NEWLINE PROCEDURE ; ;*************************************************************************** CRLF: LD C,CR CALLüÃþœNNNNNNNNNNNNNNN¡¡¡þFK‘NNNNNNNNNNNNNNNNNNNNNN¡¡¡û THE WARM BOOT ROUTINE IF THE CLOCK/CALENDAR BOARD IS NOT PRESENT ; IF NOT MODIFIED, THEN IT IS ALLWAYS FALSE (NOP). ; INHCœþNNNNNNNNNNNNNNNN¡¡¡þF ¡ÏNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;BC = HL = A = 0 LD L,A LD H,A LD C,A LD B,A RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++®ƒþBNNNNNNNNNNNNNNNNN¡¡¡þF& iNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUNCTION 92H ; EXIT - A= SECONDS ; B= MINITS ; C= HOURS ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ÚJþ·NNNNNNNNNNNNNNNNNN¡¡¡þF,ä¢NNNNNNNNNNNNNNNNNNNNNN¡¡¡û,?CLKROM ; ; FALL INTO ROM EXECUTER ; ENDIF ;*********************************************************************ü}þNNNNNNNNNNNNNNN¡¡¡þFòzNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN BIOS VERSION # ; EXIT - HL= VERSION # IN BINARY {0.00,..655.35$ïþNNNNNNNNNNNNNNNN¡¡¡þF ±NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûRIVE THEN RETURN ERROR ; CP A,NDRVS JR C,RETDV2 ; OR A,A RET ; ; ; ELSE COMPUTE TABLE PTR ; RETDV2: LD B,C LD¦½þ$NNNNNNNNNNNNNNNNN¡¡¡þF·NNNNNNNNNNNNNNNNNNNNNN¡¡¡û**************************************************** ; ; OUTPUT HEX DATA TO CONSOLE SUBR ; ENTRY- A= DATA ; EXIT - A, C= ? )]þ·NNNNNNNNNNNNNNNNNN¡¡¡þF[¯NNNNNNNNNNNNNNNNNNNNNN¡¡¡û COC LD C,LF JP COC IF INTCPTS SUBTTL ADDITIONAL FUNCTIONS TO SUPPORT CDOS PROGRAMS ;*****************************Þ&þNNNNNNNNNNNNNNNNN¡¡¡þFx NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLK: JR C,ILLEGC ; ; NOW CHECK FOR EXTENDED CALLS ; CP A,8DH ;IF RETURN VERSION THEN RETURN IT JR Z,RETCVER ; CP A,90_þ„NNNNNNNNNNNNNNNN¡¡¡þF!’þNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++ ; ; CDOS RETURN VERSION FUNCTION ; MAKES CLOCK/CALENDAR WORK. ; EXIT - B= 1 ; ;+++++++++++++++++++++++++++ݼþHNNNNNNNNNNNNNNNN¡¡¡þF'8XNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++ CLKTIM: LD HL,?CLKTIM JR CLK2 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++�þþ9NNNNNNNNNNNNNNNNN¡¡¡þF-דNNNNNNNNNNNNNNNNNNNNNN¡¡¡û******* ; ; EXECUTE ROM ROUTINE ; ENTRY- HL= ENTRY ADDRESS ; A= ROM # ; EXIT - ? ; ;************************************á/þ!NNNNNNNNNNNNNNNNN¡¡¡þFkíNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û} ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ RETVERS: LD HL,VERSN XOR A,A ;RETURN NÁ\þNNNNNNNNNNNNNNNN¡¡¡þF HâNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DE,DVRSIZ ; RETDVL: ADD HL,DE DJNZ RETDVL ; ; RETURN NO ERROR ; XOR A,A RET ;++++++++++++++++++++++++++++++++¯rþäNNNNNNNNNNNNNNNN¡¡¡þF¤ZNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ;**************************************************************************** PRHEX: ; ; PROCESS HIGH NIBBLE 1ST ; CAÛ¡þNNNNNNNNNNNNNNNNN¡¡¡þFüNNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************************************** ; ; SYSTEM CALL INTERCEPT ROUTINE CHECKS FOR ILLEGAL BDOS CALLS & ; PRINTS MEUéþäNNNNNNNNNNNNNNNNN¡¡¡þFá7NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûH ;IF NOT CLOCK THEN ERR JR C,ILLEGC ; JR Z,CLKCAL ;IF CALENDAR THEN GET IT ; CP A,92H JR C,CLKSET ;IF SET FUNCTION TÿiþÉNNNNNNNNNNNNNNNN¡¡¡þF"Ç­NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++ RETCVER: LD B,1 RET SUBTTL CLOCK ROUTINES ;+++++++++++++++++++++++++ùÊþÉNNNNNNNNNNNNNNNNN¡¡¡þF((fNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++ ; ; READ CLOCK TIME FUNCTION 93H ; ENTRY- DE= PTR TO 13 BYTE BUFFER FOR CLOCK DATA ; ;++++++++++++++++++++++++++++++++1uþNNNNNNNNNNNNNNNN¡¡¡þF.‚ÀNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û**************************************** EXROM: AND A,?ROMSMK ;MASK OUT UNUSED BITS OUT (?ROMSEL),A ; PUSH HL ;SAVE ROM‚ˆþÈNNNNNNNNNNNNNNNNN¡¡¡þFXÜNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûO ERROR RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN DRIVER TABLE PTR ÃlþyNNNNNNNNNNNNNNNN¡¡¡þF {ÓNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE IOPB FUNCTION ; ENTRY- DE= IOPB PTR ; EXIT - A= 0: OK ; ;++++++++Ò¶þNNNNNNNNNNNNNNNNN¡¡¡þF—kNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûLL PRDIG ; ; SWAP HIGH & LOW NIBBLES ; PRDIG: RLCA RLCA RLCA RLCA ; ; SAVE DATA FOR RETURN ; PUSH AF ; ; r™þyNNNNNNNNNNNNNNNN¡¡¡þF=ÍNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSSAGE IF ILLEGAL. ALSO IMPLEMENTS CDOS CLOCK/CALENDAR ; SYSTEM CALLS FOR ASMB. ; ;******************************************"ÄþNNNNNNNNNNNNNNNNN¡¡¡þFÒNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûHEN SET CLOCK ; JR Z,CLKTIM ;IF TIME THEN GET IT ; CP A,93H JR Z,CLKRDC ;IF READ CLOCK THEN GET IT ; ; ILLEGAL SYSTEMkWþNNNNNNNNNNNNNNNN¡¡¡þF#ôœNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN CALENDAR FUNCTION 90H ; EXIT - A= DAY ; B= MONTH ; C= YEAR!¦þNNNNNNNNNNNNNNNN¡¡¡þF)WNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++ CLKRDC: LD C,?CLKF1 JR CLK1 ;********************************************1öþNNNNNNNNNNNNNNNNN¡¡¡þF/±ñNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ENTRY VECTOR ; LD HL,EXROMR ;PUT RETURN ADDR ON STACK EX (SP),HL ;SWAP RETURN ADDRESS WITH ROM ENTRY VECTOR JP (HL) ;E²(þ“NNNNNNNNNNNNNNNNNN¡¡¡þF �NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFUNCTION ; ENTRY- C= DRIVE # (E FOR FUNCTION CALL) ; EXIT - HL= DRIVER TABLE BASE PTR ; A, C= 0 ; ;+++++++++++++++++++++++§þNNNNNNNNNNNNNNNN¡¡¡þF âDNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ EXIOPB: ; ; SAVE REG ; PUSH IX ; ; SET UP FOR CÆ1þ'NNNNNNNNNNNNNNNN¡¡¡þFÂ8NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCONVERT TO ASCII USING DAA TRICK ; AND A,0FH ADD A,90H DAA ADC A,40H DAA ; ; OUTPUT CHAR TO CONSOLE ; LD C,A j×þ“NNNNNNNNNNNNNNNNN¡¡¡þF-óNNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************************* INTCPT: LD A,C ;CHECK CALL VALIDITY CP A,41 ;IF <= 40 THEN OK ; BDOSV EQU $ + 1 JP C,•Gþ¹NNNNNNNNNNNNNNNNN¡¡¡þF‡UNNNNNNNNNNNNNNNNNNNNNN¡¡¡û CALL ; ILLEGC: PUSH BC ;SAVE FUNCTION # ; ; OUTPUT WARNING MESSAGE ; LD HL,ISCMSG ;OUTPUT WARNING CALL EDITOR ; ;™Œþ“NNNNNNNNNNNNNNNNN¡¡¡þF$m NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; L= DAY OF WEEK ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ CLKCAL: LD HL,?CLKCAL ;ê¢þ¹NNNNNNNNNNNNNNNN¡¡¡þF*NNNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************** ; ; CLOCK SET FUNCTION 91H ; ENTRY- DE= CLOCK IMAGE BUFR PTR (13 BYTES LONG) ; ;**********ü/þNNNNNNNNNNNNNNNN¡¡¡þF0¢¼NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûXECUTE ROM ; ; ROM PROCEDURE RETURNS HERE ; EXROMR: PUSH AF ;SAVE RETURN VALUE CALL GETMON ;RESELECT MONITOR ROM ; jXþNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN8NNNNNNNN�Ñ� ‚mƒ;„…Ö…¤†r‡@ˆ‰Ü‰©Šv‹DŒ�à�­Ž{�J�‘呲’€“N”•è•¶–„—Q˜™ë™¹š‡›Uœ#�ñ�¿ž�Ÿ\ +¡ø¡Æ¢”£b¤0¥ý¥Ë¦'ÎNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þGÕœNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPOP AF ;RETURN VALUE RET SUBTTL CHAR I/O ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Y®þNNNNNNNNNNNNNNNN¡¡¡þG:NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA NOT READY THEN RETURN 0 AND A,1 SHL ?NTRDY TTOST1: RET Z LD A,-1 ;ELSE RETURN -1 RET ENDIF ;*****************«�þNNNNNNNNNNNNNNNNNN¡¡¡þG �ñNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTTOST1 ENDIF ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; READER DRIVER - DUMMY °ýþ!NNNNNNNNNNNNNNNN¡¡¡þG°�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûF ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN LIST DEVICE STATUS ; EXIT - AL³þ NNNNNNNNNNNNNNNN¡¡¡þG_FNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û****************************************************** EDITOR: LD C,(HL) ;MESSAGE EDIT LOOP PUSH HL ;SAVE PTR RES 7,C ;C´þ!NNNNNNNNNNNNNNNN¡¡¡þGõàNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûER INPUT ; CALL CI ; PUSH AF LD C,A CALL COC POP AF ; ; IF OPTION IS CTRL-C THEN WARM BOOT ; CP A,3 ;IF CTRL­>þ�NNNNNNNNNNNNNNNNN¡¡¡þG%¾NNNNNNNNNNNNNNNNNNNNNN¡¡¡û------ ; ; UNSUPPORTED INTERRUPT ; ;---------------------------------------------------------------------------- ILLINT: ÔþHNNNNNNNNNNNNNNNNN¡¡¡þG+<±NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û###################### IOPB: REPT ?IOPBSZ LIST OFF DB 0 LIST ON ENDM ;############################################SôþNNNNNNNNNNNNNNNNN¡¡¡þG€ÏNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++ ; ; CONSOLE INPUT ; EXIT - A= CHAR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++O¥þHNNNNNNNNNNNNNNNNN¡¡¡þGoNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*********************************************************** ; ; CONSOLE OUTPUT ; ENTRY- C= CHAR TO OUTPUT ; ;************** ¨þrNNNNNNNNNNNNNNNN¡¡¡þGÅ¢NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; EXIT - A= CTRL-Z ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ READER: LD A,CTRLZ ;FAKEÎuþNNNNNNNNNNNNNNNNN¡¡¡þG)NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û= 0: BUSY, FFH:READY ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ LISTST: IF USEMON Ñ¡þNNNNNNNNNNNNNNNN¡¡¡þG NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLEAR BIT 7 FOR OUTPUT CALL COC ; POP HL BIT 7,(HL) ;IF BIT 7 SET THEN RETURN RET NZ ; INC HL ;ELSE PRINT NEXT CHARÖxþBNNNNNNNNNNNNNNNN¡¡¡þG àKNNNNNNNNNNNNNNNNNNNNNN¡¡¡û-C THEN WARM BOOT JP Z,PAGE0 ; ; IF OPTION IS YES THEN WARM BOOT ; AND A,5FH ;IGNORE CASE ; CP A,'Y' JP Z,PAGE0 oþrNNNNNNNNNNNNNNNNN¡¡¡þG&JíNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPUSH AF ;SAVE ALL 8080 REGS PUSH HL PUSH BC LD HL,ILLIM ;NOTIFY USER OF INT JR IQCONT SUBTTL INITIALIZED DATA ;#i-þNNNNNNNNNNNNNNNNNNN¡¡¡þG,¥&NNNNNNNNNNNNNNNNNNNNNN¡¡¡û################################ ; ; DISK DRIVER TABLES ; ;#################################################################1áþNNNNNNNNNNNNNNN¡¡¡þG³þNNNNNNNNNNNNNNNNNNNNNN¡¡¡û CI: IF USEMON CALL GETMON ;SWITCH IN MONITOR ROM JP ?CONIN ;USE MONITOR ELSE CALL CNSCK ;IF NO CHAR RDY THEN Õ1þNNNNNNNNNNNNNNNN¡¡¡þG \5NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û************************************************************** COC: IF USEMON CALL GETMON JP ?CONOUT ELSE CALL NTÕ‚þrNNNNNNNNNNNNNNNNN¡¡¡þGö“NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û EOF ;**************************************************************************** ; ; PUNCH DRIVER ; ENTRY- C= CHAR TO (qþNNNNNNNNNNNNNNNNNNN¡¡¡þG+NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCALL GETMON JP ?LSTSTS ELSE LD A,-1 RET ENDIF ;**************************************************************þNNNNNNNNNNNNNNNN¡¡¡þG9$NNNNNNNNNNNNNNNNNNNNNN¡¡¡û JR EDITOR IF INTRPTS SUBTTL INTERRUPTS ;---------------------------------------------------------------------------- x³þNNNNNNNNNNNNNNNN¡¡¡þG!ÓzNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; ; IF OPTION IS INTERRUPT THEN EXECUTE RESTART 7 ; CP A,'I' JR NZ,ITRAP1 ; POP BC ;RESTORE REGS 1ST POP HL POP “þdNNNNNNNNNNNNNNNN¡¡¡þG'yÜNNNNNNNNNNNNNNNNNNNNNN¡¡¡û########################################################################### ; ; 3740 SECTOR TRANSLATION TABLE ; **** CP/M SIN þBNNNNNNNNNNNNNNNNN¡¡¡þG-–NNNNNNNNNNNNNNNNNNNNNN¡¡¡û########### STRUCT 0 DVRADD DS 2 ;START ADDRESS OF DISK DRIVER DVRFG DS 1 ;FLAGS (B0= INHIBIT LOGON) DVRPDRV DS 1 ;PHYSICAL¯þdNNNNNNNNNNNNNNNNN¡¡¡þG*iNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûWAIT JR Z,CI IN A,(?NTD) ;ELSE RETURN CHAR RET ENDIF ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++¥/þ NNNNNNNNNNNNNNNN¡¡¡þG fNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûOST ;IF BUSY THEN WAIT OR A,A JR Z,COC LD A,C OUT (?NTD),A RET ;++++++++++++++++++++++++++++++++++++++++++++++ÊyþíNNNNNNNNNNNNNNNN¡¡¡þGåÞNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOUTPUT ; ;**************************************************************************** PUNCH: RET ;********************* „þrNNNNNNNNNNNNNNNNN¡¡¡þGOxNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************** ; ; GET MONITOR PROM SUBR ; EXIT - A= ? ; ;*****************************************************************%fþ!NNNNNNNNNNNNNNNNN¡¡¡þG ³NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û ; ; USER INTERRUPT ; ;---------------------------------------------------------------------------- ITRAP: ; ; SAVE REGSÉ÷þ[NNNNNNNNNNNNNNNN¡¡¡þG"†)NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAF JP 0038H ; ; IF OPTION IS MONITOR THEN EXECUTE MONITOR TRAP ; ITRAP1: CP A,'M' JR NZ,ITRAPR ; POP BC POP HL |xþBNNNNNNNNNNNNNNNN¡¡¡þG(iâNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûGLE DENSITY **** ; ;############################################################################ SDTRAN: GXLATE 26,6 ; DB ¯^þNNNNNNNNNNNNNNNN¡¡¡þG.ÃDNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û DRIVE ; ; THE FOLLOWING MAY BE BROUGHT OFF DISK DESCRIPTOR OR FROM DEFAULT TABLES ; DVRFLG DS 1 ;DISK FLAGS DVR0SPT DS 1^òþINNNNNNNNNNNNNNNNN¡¡¡þGXNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++ ; ; RETURN CONSOLE STATUS ; EXIT - A= 0: NOT READY ; FFH: CHAR READY ; ;++++++++++++++++++++++++++++;Yþ!NNNNNNNNNNNNNNNN¡¡¡þG :WNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++ ; ; RETURN CONSOLE OUTPUT READY STATUS ; EXIT - A= 0: BUSY, FFH: READY ; ;++++++++++++++++++åþrNNNNNNNNNNNNNNNNN¡¡¡þGÖïNNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************************************* ; ; PRINTER DRIVER ; ENTRY- C= CHAR TO OUTPUT ; ;******************:½þdNNNNNNNNNNNNNNNN¡¡¡þG|INNNNNNNNNNNNNNNNNNNNNN¡¡¡û*********** GETMON: LD A,?XMONROM OUT (?ROMSEL),A RET ;*************************************************************}þdNNNNNNNNNNNNNNNNN¡¡¡þG“‚NNNNNNNNNNNNNNNNNNNNNN¡¡¡û FIRST ; PUSH AF PUSH HL PUSH BC ; ; SAVE CURRENT ROM & GET MONITOR ROM ; IN A,(?ROMSEL) LD (ROMSAV),A CALL GEþrNNNNNNNNNNNNNNNN¡¡¡þG#µNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûPOP AF JP 0F824H ; ; ELSE RESTORE REGS & RETURN ; ITRAPR: LD A,(ROMSAV) ;RESTORE ROM # OUT (?ROMSEL),A ; POP BC /õþ'NNNNNNNNNNNNNNNNN¡¡¡þG)ZÓNNNNNNNNNNNNNNNNNNNNNN¡¡¡û1,7,13,19,25,5,11,17,23,3,9,15 ; DB 21,2,8,14,20,26,6,12,18,24,4,10 ; DB 16,22 ;#########################################WæþNNNNNNNNNNNNNNNNN¡¡¡þG/ðuNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;TRK 0 SECTORS PER TRK DVR0SZ DS 1 ;TRK 0 SECTOR SIZE DVR1SPT DS 1 DVR1SZ DS 1 DVRDSPT DS 1 DVRDSZ DS 1 DVRDTYP DS 1 ;RESj2þHNNNNNNNNNNNNNNNNNN¡¡¡þGL NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++ CNSCK: IF USEMON CALL GETMON JP ?CONSTS ELSE IN A,(?NTS) ;IF DATŽÒþINNNNNNNNNNNNNNNN¡¡¡þG £ÀNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ NTOST: IN A,(?NTS) CPL ;REVERSE SENSE AND A,1 SHL ?NTBSY JR Ï(þ$NNNNNNNNNNNNNNNN¡¡¡þGƒ¼NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û********************************************************** LO: IF USEMON CALL GETMON JP ?LSTOUT ELSE RET ENDIþþINNNNNNNNNNNNNNNNN¡¡¡þGlwNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*************** ; ; MESSAGE EDITOR ; ENTRY- HL= TEXT PTR (BIT 7= 1: TERMINATOR) ; EXIT - REGS= ? ; ;**********************è{þNNNNNNNNNNNNNNNNN¡¡¡þGÆÑNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTMON ; ; PRINT PROMPT ; LD HL,ITMSG IQCONT: CALL EDITOR ; LD HL,IQMSG ;QUERY USER CALL EDITOR ; ; GET & ECHO US¤þNNNNNNNNNNNNNNNNN¡¡¡þG$,�NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û POP HL POP AF EI ;RE-ENABLE INTERRUPTS RET ;----------------------------------------------------------------------7fþrNNNNNNNNNNNNNNNN¡¡¡þG*€NNNNNNNNNNNNNNNNNNNNNN¡¡¡û################################### ; ; COMMON I/O PARAMETER BLOCK ; ;######################################################@åþNNNNNNNNNNNNNNNNNN¡¡¡þG0ã8NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûERVED FOR DISK TYPE ; ; DEFINE THE STRUCTURE SIZE ; DVRSIZ DS 0 ENDM ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@þNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN8NNNÿ€Í�œ‚iƒ7„…Ó…¡†n‡;ˆ‰Ö‰£Šp‹?Œ�Û�©Žw�E�‘ᑯ’}“K”•å•´–‚—N˜™ê™¸š†›Tœ"�ð�¾žŒŸZ )¡ö¡Ä¢’£`¤-¥û¥É¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þGâ¬NNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; MACRO TO DEFINE THE DRIVER TABLE RECORD ; ENTRY- #DADD= DRIVER ADDRESS ; #PD= PHYSICAL DR·þœNNNNNNNNNNNNNNNN¡¡¡þGH NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û0,0,26,0,26,0,26,0 ALLDRV FD8EXEC,1,0,26,0,26,0,26,0 ENDIF IF BOOT = 3 ALLDRV FD8EXEC,0,0,26,0,26,0,26,0 ALLDRV FDòŸþ NNNNNNNNNNNNNNNNNN¡¡¡þG §ÁNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûECK SIZE DW 2 ;TRACK OFFSET ; ; DEFAULT DISK PHYSICAL PARAMETERS ; DB 0 ;FLAGS DB 26,0,26,0,26,0 ;SECTORS PER TRACK¹tþ9NNNNNNNNNNNNNNNN¡¡¡þG‡½NNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡û,1,64,1 ;64 SPT, 256 BPS ;############################################################################ ; ; MODE 2 INTERRUëÛþ·NNNNNNNNNNNNNNNN¡¡¡þGhvNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DSKEB: DM CR,LF,'Abort, Ignore, Retry, (BDOS) - ' ; IF INTCPTS ISCMSG: DM CR,LF,'ILL SYS CALL, #= ' ENDIF IF INTRIiþÎNNNNNNNNNNNNNNNNN¡¡¡þGÂÐNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûO XLATE) DW 0 ;;SCRATCH AREA DW 0 ;;" DW 0 ;;" DW DIRBF ;;DIRECTORY BUFFER PTR DW D#D(DD)DPB ;;DRIVE PARAMETER BLKt’þ9NNNNNNNNNNNNNNNNN¡¡¡þG%(ŽNNNNNNNNNNNNNNNNNNNNNN¡¡¡û#################### BTDRV: DS 1 ;DRIVE # BTTRK DS 2 ;TRACK # BTSEC DS 2 ;SECTOR # BTFLG DS 1 ;RESERVED FOR FLAGS BTDMA DS ˜ôþNNNNNNNNNNNNNNNNN¡¡¡þG+ �NNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; MACRO TO DEFINE THE DRIVE ALLOCATION & CHECKSUM"óþœNNNNNNNNNNNNNNNN¡¡¡þG·ÿNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIVE # ; #FG= DRIVE FLAGS (IDFLGO) ; #S0= TRK 0 SPT ; #Z0= TRK 0 SIZE ; #S1= TRK 1 SPT ; #Z1= TRK 1 SIZE ; #SD= DATA HòþNNNNNNNNNNNNNNNN¡¡¡þGX4NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û8EXEC,1,0,26,0,26,0,26,0 ALLDRV HDEXEC,4,60H,64,1,64,1,64,1 ALLDRV HDEXEC,4,60H,64,1,64,1,64,1 ALLDRV HDEXEC,5,60H,64,1,64:¹þ NNNNNNNNNNNNNNNN¡¡¡þGò’NNNNNNNNNNNNNNNNNNNNNN¡¡¡û, SECTOR SIZE (128) ;############################################################################ ; ; DEFAULT 8" HARD DIS,¸þœNNNNNNNNNNNNNNNNN¡¡¡þG*NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPT VECTOR TABLE ; ;############################################################################ ; ; START ON AN EVEN PAGE ”‘þÉNNNNNNNNNNNNNNNN¡¡¡þG=%NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPTS ITMSG DM CR,LF,'User' ILLIM DM CR,LF,'Ill.' IQMSG DM ' Int. Abort? (Y/N/I/M) - ' ENDIF ;########################yþòNNNNNNNNNNNNNNNN¡¡¡þG ×{NNNNNNNNNNNNNNNNNNNNNN¡¡¡û PTR IF ((DD - 1) <= NDHD) AND ((DD - 1) >= STHD) DW 0 ;;NO CHECKS ON HARD DISK ELSE DW D#D(DD)CHK ;;DRIVE DISK CHE¾™þÈNNNNNNNNNNNNNNNNN¡¡¡þG&}ÝNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û2 ;DMA ADDRESS BTDMAX DS 1 ;DMA EXTENDED ADDRESS ;########################################################################¿ÒþNNNNNNNNNNNNNNNNNN¡¡¡þG,’NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS AREA ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ALLDAL: MACRO #D LIST ON IF ((DDfþ“NNNNNNNNNNNNNNNN¡¡¡þG„ÎNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTRKS SPT ; #ZD= DATA TRKS SIZE ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ALLDRV MACK þ�NNNNNNNNNNNNNNNNN¡¡¡þG kNNNNNNNNNNNNNNNNNNNNNN¡¡¡û,1,64,1 ALLDRV HDEXEC,5,60H,64,1,64,1,64,1 ENDIF LIST ON ;#########################################################ý.þNNNNNNNNNNNNNNNNN¡¡¡þGÁ£NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûK PARAMETER BLOCK ; ;############################################################################ HDPBK: DW 128 ;SECTORS PER(™þNNNNNNNNNNNNNNNNN¡¡¡þG-NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBOUNDARY ; IF $ AND 0FFH DS 100H - ($ AND 0FFH) ENDIF INTABL: REPT 7 ;1ST 7 ARE UNSUPPORTED LIST OFF DW ILLINT U¹þNNNNNNNNNNNNNNNN¡¡¡þGNNNNNNNNNNNNNNNNNNNNNN¡¡¡û#################################################### ; ; DRIVE PARAMETER HEADER AREA ; 1 PER DRIVE ; ;#####################;þNNNNNNNNNNNNNNNNN¡¡¡þG!äJNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCKSUMS ARRAY PTR ENDIF DW D#D(DD)ALL ;;DRIVE CLUSTER ALLOCATION BIT MAP PTR LIST OFF ENDM ; ; DEFINE THE DATA ; ÂOþrNNNNNNNNNNNNNNNN¡¡¡þG'NìNNNNNNNNNNNNNNNNNNNNNN¡¡¡û#### ; ; VARIABLES ; ;############################################################################ DTPTR: DS 2 ;DRIVE TABÀâþNNNNNNNNNNNNNNNNN¡¡¡þG-¡'NNNNNNNNNNNNNNNNNNNNNN¡¡¡û - 1) >= STHD) AND ((DD - 1) <= NDHD) D#D(DD)ALL: DS 127 ;ALLOCATION BIT MAP FOR 8" HARD DRIVE #D(DD) ENDIF IF ((DD - 1ùÁþNNNNNNNNNNNNNNNNN¡¡¡þGYNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRO #DADD,#PD,#FG,#S0,#Z0,#S1,#Z1,#SD,#ZD LIST ON DW #DADD DB 0 ;;LOGON INHIBIT FLAG (LOGON ENABLED) DB #PD DB #FG DþÌþ�NNNNNNNNNNNNNNNN¡¡¡þG >VNNNNNNNNNNNNNNNNNNNNNN¡¡¡û################### ; ; DEFAULT 8" FLOPPY DISK PARAMETER BLOCK ; IBM 3740 SINGLE DENSITY FORMAT ; ;########################ÌþäNNNNNNNNNNNNNNNN¡¡¡þGÒîNNNNNNNNNNNNNNNNNNNNNN¡¡¡û TRACK (LOGICAL) (SPT) DB 5 ;BLOCK SHIFT FACTOR (BSH) DB 31 ;BLOCK MASK (BLM) DB 1 ;NULL MASK (EXM) DW 1015 ;DI=þNNNNNNNNNNNNNNNNNN¡¡¡þGxHNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLIST ON ENDM ; DW ITRAP ;INT 8 IS USER INTERRUPT ENDIF ;##########################################################±�þ„NNNNNNNNNNNNNNNNN¡¡¡þG—ƒNNNNNNNNNNNNNNNNNNNNNN¡¡¡û####################################################### ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@íèþœNNNNNNNNNNNNNNN¡¡¡þG"±NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDD DL 1 REPT NDRVS LIST OFF ALLDPH 0123456789ABCDEF DD DL DD + 1 LIST ON ENDM ; ; LAST OF INITIALIZED CODE READ³úþNNNNNNNNNNNNNNNNN¡¡¡þG(^ÒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLE PTR LOGRQ: DS 1 ;LOG ON REQUEST REG. DVRTPTR DS 2 ;DRIVE DRIVER TABLE BASE ADDRESS PTR DVRXADR DS 2 ;DRIVE DRIVER EXECUTIOé‘þ NNNNNNNNNNNNNNNNN¡¡¡þG.ôtNNNNNNNNNNNNNNNNNNNNNN¡¡¡û) >= ST8FD) AND ((DD - 1) <= ND8FD) D#D(DD)ALL: DS 57 ;ALLOCATION BIT MAP FOR 8" DRIVE #D(DD) D#D(DD)CHK DS 32 ;DIRECTORY CdþÂNNNNNNNNNNNNNNNNN¡¡¡þG.hNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûB #S0,#Z0,#S1,#Z1,#SD,#ZD DB 0 ;;DISK TYPE LIST OFF ENDM DVR0: IF BOOT = 10H ALLDRV HDEXEC,4,60H,64,1,64,1,64,1 a‹þ�NNNNNNNNNNNNNNNNN¡¡¡þG gNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û#################################################### SD8PBK: DW 26 ;SECTORS PER TRACK DB 3 ;BLOCK SHIFT FACTOR DB 7 ;BLOãoþ·NNNNNNNNNNNNNNNNN¡¡¡þGáßNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSK SIZE (CLUSTERS -1) (DSM) DW 1152 / 2 ;DIRECTORY MAX (DRM) DB 0FFH ;ALLOCATION 0 (AL0) DB 10000000B ;ALLOCATION 1 gþ$NNNNNNNNNNNNNNNN¡¡¡þGKyNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û################## ; ; MESSAGES ; ;############################################################################ MSGLE: DM×LþœNNNNNNNNNNNNNNNNN¡¡¡þG¤²NNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@ ; ; GENERATE A DISK PARAMETER TABLE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@æ—þNNNNNNNNNNNNNNNNN¡¡¡þG#‚(NNNNNNNNNNNNNNNNNNNNNN¡¡¡û FROM DISK ; BIOSND EQU $ SUBTTL UNINITIALIZED DATA AREA ;###############################################################-sþÂNNNNNNNNNNNNNNNN¡¡¡þG)mãNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûN ADDRESS ROMSAV DS 1 ;ROM SWAP SAVE OF ORIGINAL ROM ;#####################################################################þ„NNNNNNNNNNNNNNNN¡¡¡þG/ÇENNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHECKSUMS STORAGE (1 BYTE PER SECTOR) ENDIF LIST OFF ENDM ; ; RESERVE THE DATA SPACE ; DD DL 1 REPT NDRVS LIST hTþNNNNNNNNNNNNNNNNNN¡¡¡þG{;NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ALLDRV HDEXEC,4,60H,64,1,64,1,64,1 ALLDRV HDEXEC,5,60H,64,1,64,1,64,1 ALLDRV HDEXEC,5,60H,64,1,64,1,64,1 ALLDRV FD8EXEC,gðþNNNNNNNNNNNNNNNN¡¡¡þG ”ðNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCK MASK DB 0 ;NULL MASK DW 242 ;DISK SIZE -1 DW 63 ;DIRECTORY MAX DB 11000000B ;ALLOC 0 DB 0 ;ALLOC 1 DW 16 ;CH¢¬þ NNNNNNNNNNNNNNNN¡¡¡þG´ŒNNNNNNNNNNNNNNNNNNNNNN¡¡¡û (AL1) DW 0 ;CHECK SIZE (CKS) DW 2 ;TRACK OFFSET (OFF) ; ; ; DB 01100000B ;FLAGS 256 BPS, HARD, SSSD DB 64,1,64h–þNNNNNNNNNNNNNNNNN¡¡¡þG[GNNNNNNNNNNNNNNNNNNNNNN¡¡¡û CR,LF,'LOAD ERROR' ; DSKEM: DB CR,LF,'Disk Error Status:' DM CR,LF,'CM DR TL TH SL SH FG AL AH AX ST S1 S2 S3 S4 S5',CR,LF õõþNNNNNNNNNNNNNNNNN¡¡¡þGñáNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û@@@@@@@ ALLDPH: MACRO #D LIST ON D#D(DD)DPH: ;DRIVE PARAMETER HEADER FOR DRIVE #D(DD) DW 0 ;;SECTOR TRAN TBL (OR 0 IF NRþÂNNNNNNNNNNNNNNNN¡¡¡þG$¿NNNNNNNNNNNNNNNNNNNNNN¡¡¡û############# ; ; THE FOLLOWING DATA MUST RESIDE IN THIS ORDER ; ;########################################################È`þ¼NNNNNNNNNNNNNNNN¡¡¡þG*8°NNNNNNNNNNNNNNNNNNNNNN¡¡¡û######## ; ; DRIVE ALLOCATION AREAS ; ;############################################################################ ;@@©þ'NNNNNNNNNNNNNNNNN¡¡¡þG0ÔNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOFF ALLDAL 0123456789ABCDEF DD DL DD + 1 LIST ON ENDM ;#############################################################{ÅþœNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN8NNNNNNNN�Ò�¡‚oƒ=„ …Ù…¦†s‡@ˆ‰Ü‰¨Šu‹CŒ�ß�­Ž{�I�‘味’‚“P”•땹–‡—U˜#™ð™¾š‹›Yœ&�ô�ÁžŽŸ] ,¡ù¡Ç¢”£b¤0¥þ¥Ë¦ÎNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þHrNNNNNNNNNNNNNNNNNNNNNN¡¡¡û############### ; ; RESERVE DRIVE PARAMETER BLOCKS ; ;####################################################################¢ þHNNNNNNNNNNNNNNNNN¡¡¡þH«ÔNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTORY SECTORS CHECKED ; (DRM +1) / 4 DPBOFF DS 2 ;OFF- # RESERVED TRACKS (USUALLY 2) DPBSZ DS 0 ENDM ; ; ;@@@@@@@@@@@@¸´þHNNNNNNNNNNNNNNNNNN¡¡¡þH DNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þHdcNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOT FALSE ;============================================================================ ; ; CONDITIONAL ASSEMBLY FLAGS ; ;žþ NNNNNNNNNNNNNNNN¡¡¡þH‹¨NNNNNNNNNNNNNNNNNNNNNN¡¡¡û**************************************************************** ; ; CONFIGURATION: ; ; CPM ; DRIVE USAGE IF BOOT = 10H±þdNNNNNNNNNNNNNNNNN¡¡¡þH!NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûY PHYSICAL DRIVE 0 ; B JADE 5" FLOPPY PHYSICAL DRIVE 1 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; D SIDE 2 & 3 OF HßÓþ$NNNNNNNNNNNNNNNNN¡¡¡þH%ËPNNNNNNNNNNNNNNNNNNNNNN¡¡¡û6 - 20 FEB 83 ; DOUBLE D REV C UPGRADE. CHANGE BOARD STATUS PORT BITS. ; ; 2.2.7 - 8 MAR 83 GRH ; ADDED CLOCK/CALENDAR DRIVEðþrNNNNNNNNNNNNNNNN¡¡¡þH+è_NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûct half size directory, but keep ; allocation for 1k directory ; ; 2.02 - 2 JUN 84 GRH ; Change floppy disk drivers to relhmþ\NNNNNNNNNNNNNNNN¡¡¡þHT!NNNNNNNNNNNNNNNNNNNNNN¡¡¡û######## STRUCT 0 DPBSPT DS 2 ;SPT- SECTORS/TRACK DPBBSH DS 1 ;BSH- BLOCK SHIFT FACTOR DETERMINED BY CLUSTER SIZE ; 1K= k¦þNNNNNNNNNNNNNNNN¡¡¡þH»êNNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE THE DPB FOR DRIVE MACRO ; ;@@@@@@@@@@@@@@@@@@@þNNNNNNNNNNNNNNNNN¡¡¡þHLNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þHýôNNNNNNNNNNNNNNNNNNNNNN¡¡¡û============================================================================ SHORT EQU FALSE ;SHORT BIOS (REMOVES UNESENTIAL C‘•þBNNNNNNNNNNNNNNN¡¡¡þHÞûNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û ;HARD DISK BOOT CONFIG. ; A SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; B SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 0 ; CÇ9þNNNNNNNNNNNNNNNN¡¡¡þH 4¥NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûARD DISK PHYSICAL DRIVE 0 ; E SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; F SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ; G ¤þNNNNNNNNNNNNNNNNN¡¡¡þH&žNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR, SYSTEM CALL INTERCEPT, ; ILLEGAL SYSTEM CALL MESSAGE, CHANGED BIOS SIZE TO END ; OF INITIALIZED DATA AREA. RESTRUCTURE MODU¡>þNNNNNNNNNNNNNNNNNN¡¡¡þH,qÈNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûate to ISASI control of JADE ; FDC. ; Change IOPB sector value from physical sector (1..n) to logical ; sector value (0c¹þNNNNNNNNNNNNNNN¡¡¡þHgNNNNNNNNNNNNNNNNNNNNNN¡¡¡û3, 2K= 4, 4K= 5, 8K= 6, 16K= 7 DPBBLM DS 1 ;BLM- BLOCK MASK ; 1K = 7, 2K= 15, 4K= 31, 8K= 63, 16K= 127 DPBEXM DS 1 ;EXM- E£ÐþNNNNNNNNNNNNNNNNN¡¡¡þH ˆÛNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ALLDPB: MACRO #D LIST ON D#D(DD)DPB: DS DPBSZ ;ALLOCATION FOR DRIªRþNNNNNNNNNNNNNNNNN¡¡¡þH"}NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þHÎÅNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûODE) LSTINC EQU FALSE ;LIST INCLUDE FILES USEMON EQU TRUE ;USE MONITOR ROM I/O ROUTINES IF TRUE INTRPTS EQU TRUE ;ENABLE IÝÈþ'NNNNNNNNNNNNNNNNN¡¡¡þHíÊNNNNNNNNNNNNNNNNNNNNNN¡¡¡û SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 1 ; D SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ; E JADE 8" FLOPPY PHYSICAL DRIVE 0ð½þNNNNNNNNNNNNNNNNN¡¡¡þH!”NNNNNNNNNNNNNNNNNNNNNN¡¡¡û JADE 8" FLOPPY PHYSICAL DRIVE 0 ; H JADE 8" FLOPPY PHYSICAL DRIVE 1 ENDIF ; ;*****************************************±.þNNNNNNNNNNNNNNNN¡¡¡þH'­2NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûLES. ; ; 2.28 - 22 APR 83 GRH ; CHANGED DEFINITIONS TO ALLOW BIG DIRECTORIES. ; DISALLOWED DRIVES C & D. ; ; 2.29 - 3 SEɦþNNNNNNNNNNNNNNNNN¡¡¡þH-BùNNNNNNNNNNNNNNNNNNNNNN¡¡¡û..n-1). This maintains more uniformity in ; parameter passing between hard disk & JADE floppy IOPBs. ; Vector I/O routines {ÊþBNNNNNNNNNNNNNNNNN¡¡¡þHþ‡NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûXTENT MASK ; DSM < 256 : 1K= 0, 2K= 1, 4K= 3, 8K= 7, 16K= 15 ; DSM > 255 : 2K= 0, 4K= 1, 8K= 3, 16K= 7 DPBDSM DS 2 ;DSM̼þINNNNNNNNNNNNNNNN¡¡¡þH ݈NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûVE #D(DD) LIST OFF ENDM ; ; RESERVE THE DATA SPACE ; DD DL 1 REPT NDRVS LIST OFF ALLDPB 0123456789ABCDEF DD DL EþNNNNNNNNNNNNNNNNNN¡¡¡þH10NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þH›–NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNTERRUPT PROCESSING WHISTLE INTCPTS EQU TRUE ;ENABLE SYSTEM CALL INTERCEPT WHISTLE BOOT EQU 3 ;10H: HARD DISK, 3: 8" FLOPPY,¯þNNNNNNNNNNNNNNNNN¡¡¡þHt]NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; F JADE 8" FLOPPY PHYSICAL DRIVE 1 ENDIF IF BOOT = 3 ; A JADE 8" FLOPPY PHYSICAL DRIVE 0 ; B JADE 8" FLOPPY PØÕþHNNNNNNNNNNNNNNNN¡¡¡þH"RÇNNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************** ; REVISIONS: ; ; 2.2.0 - RELEASE ; ; 2.2.3 - SWAPPED DCM & BIOS SECTORS ON DISK, ALLOWING A ; L²þrNNNNNNNNNNNNNNNNN¡¡¡þH(½ NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûP 83 GRH ; Changed Rev # for blocked DCM. Enables IBM system 34 ; 256 bytes per sector disks to be read. ; ; 1.10 - 23 SEP(¤þ!NNNNNNNNNNNNNNNN¡¡¡þH.ªNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûto monitor rom routines. ; ; 2.03 - 4 JUN 84 GRH ; Add bells & whistles again. ; Move to 61k system. ; ; 2.04 - 30 MAR 8m|þNNNNNNNNNNNNNNNNN¡¡¡þHͶNNNNNNNNNNNNNNNNNNNNNN¡¡¡û- DRIVE STORAGE SIZE (IN CLUSTERS) ; INT(((#_TRACKS - OFF) * SPT * BYTES PER SECTOR) / CLUSTER SIZE) -1 DPBDRM DS 2 ;DRM- DI%-þNNNNNNNNNNNNNNNN¡¡¡þH î¹NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûDD + 1 LIST ON ENDM IF (($ - 8000H) > 07800H) OR ($ < 8000H) CONMSG **** BIOS TOO BIG, USE MOVCPM & RE-ADJUST! ***€{þNNNNNNNNNNNNNNNNNN¡¡¡þHNNNNNNNNNNNNNNNNNNNNNN¡¡¡û TITLE CUSTOMIZED BIOS FOR M5B LIST NOCOND ;============================================================================ ; þ^þBNNNNNNNNNNNNNNNN¡¡¡þH¨§NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û 20H: 5" FLOPPY DEBUG EQU FALSE ;TRUE TO DUMP THE IOPB DATA TO PRINTER FORM ;********************************************à/þ!NNNNNNNNNNNNNNNNN¡¡¡þHGlNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûHYSICAL DRIVE 1 ; C SIDE 0 & 1 OF HARD DISK PHYSICAL DRIVE 0 ; D SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 0 ; E SIDE 0 & ÃâþNNNNNNNNNNNNNNNN¡¡¡þH#aöNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûARGER BIOS ALLOCATION ON THE DISK. ; ; 2.2.4 - ADDED NAKED TERMINAL DRIVERS & IOBYTE IN ; ANTICIPATION OF THE MONITOR. ALœþrNNNNNNNNNNNNNNNN¡¡¡þH)Ž=NNNNNNNNNNNNNNNNNNNNNN¡¡¡û 83 GRH ; Move clock-calendar routines to ROM. Add Interrupt handler ; (Mode 2). Change Revision display of sign-on (separatÙCþ$NNNNNNNNNNNNNNNNN¡¡¡þH/$›NNNNNNNNNNNNNNNNNNNNNN¡¡¡û5 GRH ; Implemented hard disk drive 1 as C: & D:. ; Implemented the Logon function for the hard disk. ; Implemented user fr?¥þ NNNNNNNNNNNNNNNNNN¡¡¡þH˜åNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRECTORY SIZE -1 DPBAL0 DS 2 ;AL0,1- DIRECTORY ALLOCATION ; 1 MSB PER DIRECTORY CLUSTER ALLOCATED DPBCKS DS 2 ;CKS- # DIRECÏtþBNNNNNNNNNNNNNNNN¡¡¡þH w.NNNNNNNNNNNNNNNNNNNNNN¡¡¡û* ENDIF END :yþNNNNNNNNNNNNNNNN¡¡¡þHWRNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û; ASSEMBLY PARAMETERS ; ;============================================================================ FALSE EQU 0 TRUE EQU N¯7þ!NNNNNNNNNNNNNNNN¡¡¡þH¸™NNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************** ; ; CUSTOMIZED BIOS FOR M5B ; (c) 1981 GRH Electronics, CUPERTINO, CA ; ;************QÓþ9NNNNNNNNNNNNNNNNN¡¡¡þH?NNNNNNNNNNNNNNNNNNNNNN¡¡¡û1 OF HARD DISK PHYSICAL DRIVE 1 ; F SIDE 2 & 3 OF HARD DISK PHYSICAL DRIVE 1 ENDIF IF BOOT = 20H ; A JADE 5" FLOPP±þdNNNNNNNNNNNNNNNNN¡¡¡þH$øaNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSO, ALL REFERENCES ; REQUIRING THE I/O PROMS TO BOOT HAS BEEN REMOVED. ; ; 2.2.5 - RECONFIGURE FOR 62K SYSTEM. ; ; 2.2. °þNNNNNNNNNNNNNNNNNN¡¡¡þH*ÛnNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûe CBIOS rev). ; ; 2.00 - 24 MAR 84 GRH ; Modify for hard disk ; ; 2.01 - 28 APR 84 GRH ; Change hard disk DPB to refleõ÷þNNNNNNNNNNNNNNNN¡¡¡þH07ÖNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûiendly disk error options: Abort, Retry, Ignore. ; Solved warm boot hang problem by reseting host adapter if busy. ; ; 3.00 -h=þ9NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÿ€Ì�š‚gƒ4„…Ð…�†k‡9ˆ‰Ô‰¡Šn‹<Œ �Ø�¥Žs�B�‘Ý‘ª’x“F”•ᕯ–}—J˜™å™³š€›Nœ�é�¶ž…ŸS "¡ï¡½¢‹£Y¤'¥õ¥Â¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þH6BNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û 26 JAN 87 GRH ; Implemented new common IOPB code & Jade floppy firmware support. ; Implemented disk drive driver tables andäþNNNNNNNNNNNNNNNN¡¡¡þHœäNNNNNNNNNNNNNNNNNNNNNN¡¡¡û========================================================== ; ; INCLUDE JDDCONT.DEF ; INCLUDE COMIOPB.DEF ; INCLUDE JDDDISK.DÓ�þNNNNNNNNNNNNNNNNN¡¡¡þH s/NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS: EQU 60 ;SYSTEM SIZE IN K BYTES KBYTE: EQU 1024 CPMSZ: EQU KBYTE * NKSYS CPMBS: EQU CPMSZ - (20 * KBYTE) ; CP/M BIAS VALUEàKþNNNNNNNNNNNNNNNN¡¡¡þHSSNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û========================== ; ; OTHER DECLARATIONS ; ;=======================================================================èuþòNNNNNNNNNNNNNNNN¡¡¡þH¼˜NNNNNNNNNNNNNNNNNNNNNN¡¡¡û================================================= ; ; ADDRESSES ; ;=========================================================âøþNNNNNNNNNNNNNNNNN¡¡¡þH>NNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ GXLATE MACRO #SECTORS, #SKEW LIST OFF NXTSEC DL 1 ;K¨þÎNNNNNNNNNNNNNNNNN¡¡¡þH%ü`NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ENDIF IF DD > 999 DB (DD / 1000) + '0' DD DL DD % 1000 ENDIF DB (DD / 100) + '0' DB '.' DB ((DD % 100) / 1ø#þœNNNNNNNNNNNNNNNN¡¡¡þH+ßoNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûKWR ;PERFORM DISK WRITE JP LISTST ;RETURN LIST STATUS JP SECTRN ;TRANSLATE SECTOR JP BIOFUNC ;EXECUTE FUNCTION CALL L+þHNNNNNNNNNNNNNNNNN¡¡¡þHcNNNNNNNNNNNNNNNNNNNNNN¡¡¡û new function to return ; a ptr to a drive table. ; Removed init of IOBYTE. ; Implemented 5" floppy driver. ; Implemented us•þNNNNNNNNNNNNNNNNN¡¡¡þHŒÚNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûEF ; INCLUDE MONBOARD.DEF ; INCLUDE IOBOARD.DEF ; INCLUDE NAKEDT.DEF ; INCLUDE ISHA.DEF ; INCLUDE CLOCK.DEF ; INCLUDE SYSD'þœNNNNNNNNNNNNNNNN¡¡¡þH&|NNNNNNNNNNNNNNNNNNNNNN¡¡¡û CCP: EQU CPMBS + 3400H ;ADDR OF CCP BDOS: EQU CPMBS + 3C00H ;ADDRESS OF BDOS BIOS: EQU CPMBS + 4A00H ;ADDRESS OF BDOS BIOSRÎFþ$NNNNNNNNNNNNNNNNN¡¡¡þHÊÄNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û===== SECSZ: EQU 128 NDRVS: EQU 6 IF BOOT = 10H ; ; 8" HARD DISK BOOT DATA ; LASTSEC EQU 47 ;LAST BOOT SECTOR ; SÇfþNNNNNNNNNNNNNNNN¡¡¡þHéËNNNNNNNNNNNNNNNNNNNNNN¡¡¡û=================== CALROM EQU 7 ;CALENDAR ROM SELECT # RDBENT EQU 0F800H ;READ CLOCK BUFFER ENTRY SETENT EQU RDBENT + 3 ;SîXþBNNNNNNNNNNNNNNNN¡¡¡þH •NNNNNNNNNNNNNNNNNNNNNN¡¡¡û;START WITH SECTOR 1 LOWEST DL 1 ;; REPT #SECTORS LIST ON DB NXTSEC LIST OFF NXTSEC DL NXTSEC + #SKEW ;ADD SKEW FACTOÇEþ¹NNNNNNNNNNNNNNNNN¡¡¡þH&©3NNNNNNNNNNNNNNNNNNNNNN¡¡¡û0) + '0' DB (DD % 10) + '0' ENDM SUBTTL BIOS CODE ORG BIOS ;-------------------------------------------------------‘;þNNNNNNNNNNNNNNNNNN¡¡¡þH,FøNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;############################################################################ ; ; THESE BOOT PARAMS MUST RESIDE AS DEFINED tþrNNNNNNNNNNNNNNN¡¡¡þHP NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûse of ROM primitives. ; Moved system down to 60k. ; ; 3.01 26 JUN 88 GRH ; Remove 5" floppy support. Implement in CP/M-86 B7@þ„NNNNNNNNNNNNNNNN¡¡¡þH ¿ëNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIR.DEF ; ;============================================================================ LIST OFF *INCLUDE JDDCONT.DEF *INCLô;þ NNNNNNNNNNNNNNNNN¡¡¡þHMNNNNNNNNNNNNNNNNNNNNNN¡¡¡û: EQU 1000H - BIOS ; ; PAGE 0 LOCATIONS ; PAGE0: EQU 0 ;START OF CP/M RAM IOBYTE: EQU PAGE0 + 3 ;IOBYTE ADDR DEFDRV: EQþNNNNNNNNNNNNNNNNNN¡¡¡þHùõNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTHD EQU 0 ;START LOGICAL DRIVE OF HARD DISK NDHD EQU 3 ;LAST LOGICAL DRIVE OF HARD DISK ST8FD EQU 4 ;START LOGICAL DRIVE OFë þNNNNNNNNNNNNNNNN¡¡¡þHÚúNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûET CLOCK ENTRY CALENT EQU RDBENT + 6 ;RETURN CALENDAR ENTRY TIMENT EQU RDBENT + 9 ;RETURN TIME ENTRY DKPENT EQU RDBENT + 0CH  Wþ¹NNNNNNNNNNNNNNNN¡¡¡þH!0¤NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûR ;; IF NXTSEC > #SECTORS ;CHECK FOR OVERFLOW NXTSEC DL NXTSEC - #SECTORS ;; IF NXTSEC <= LOWEST ;CHECK FOR REPEAT Nôþ“NNNNNNNNNNNNNNNN¡¡¡þH'šNNNNNNNNNNNNNNNNNNNNNN¡¡¡û--------------------- ; ; BIOS JUMP VECTOR TABLE ; ;----------------------------------------------------------------------1+þNNNNNNNNNNNNNNNNN¡¡¡þH-uÉNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRIGHT BEFORE THE COLD INIT ; ROUTINE START AND MUST BE IN THE 1ST SECTOR. THESE 2 WORDS ARE REFERENCED ; BY THE BOOT CODE IN£÷þNNNNNNNNNNNNNNNNN¡¡¡þHÉ·NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIOS. ; Change single function to return drive table ptr into a BIOS function ; call using restart instruction. ; Change LOGQ³þäNNNNNNNNNNNNNNNN¡¡¡þH ê¸NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUDE COMIOPB.DEF *INCLUDE JDDDISK.DEF *INCLUDE MONBOARD.DEF *INCLUDE IOBOARD.DEF *INCLUDE NAKEDT.DEF *INCLUDE ISHA.DEF *INC.7þNNNNNNNNNNNNNNNN¡¡¡þHNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûU PAGE0 + 4 ;DEFAULT DRIVE PARAM ADDR BDOSJV EQU PAGE0 + 5 ;BDOS SYSTEM CALL ENTRY DKPROM EQU PAGE0 + 40H ;DISK PRIMITIVES PROÄ-þäNNNNNNNNNNNNNNNNN¡¡¡þH¬¦NNNNNNNNNNNNNNNNNNNNNN¡¡¡û 8" FLOPPY ND8FD EQU 5 ;LAST LOGICAL DRIVE OF 8" FLOPPY ENDIF IF BOOT = 3 ; ; 8" FLOPPY BOOT DATA ; LASTSEC EQU êŸþ„NNNNNNNNNNNNNNNNN¡¡¡þHCmNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û;DISK PRIMITIVES ENTRY ;============================================================================ ; ; ASCII CHARS ; >þÉNNNNNNNNNNNNNNNN¡¡¡þH"e÷NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûXTSEC DL LOWEST + 1 LOWEST DL NXTSEC ENDIF ENDIF ;; ENDM LIST ON ENDM ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@)®þNNNNNNNNNNNNNNNNN¡¡¡þH(ŠþÉNNNNNNNNNNNNNNNN¡¡¡þH @NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; DISK OPERATING SYSTEM ADDRESSES ; ;============================================================================ NKSYÃþoNNNNNNNNNNNNNNNN¡¡¡þH`bNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUNRSV EQU PAGE0 + BFUNRST BFUNRSI EQU 0C7H + BFUNRST ; TPA: EQU 100H ;==================================================JîþNNNNNNNNNNNNNNNNN¡¡¡þH�©NNNNNNNNNNNNNNNNNNNNNN¡¡¡û 0 ;START LOGICAL DRIVE OF 8" FLOPPY ND8FD EQU 1 ;LAST LOGICAL DRIVE OF 8" FLOPPY ENDIF ;===========================ŸåþNNNNNNNNNNNNNNNNN¡¡¡þH%NNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE THE TRANSLATION TABLE MACRO ; ;@@@@@JÙþNNNNNNNNNNNNNNNNN¡¡¡þH$ÏQNNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ PVERS MACRO #VERS DD DL #VERS IF DD > 9999 DB (DD / 10000) + '0' DD DL DD % 10000´Ìþ NNNNNNNNNNNNNNNN¡¡¡þH*ì^NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûVE JP SETTRK ;SET TRACK # JP SETSEC ;SET SECTOR # JP SETDMA ;SET TRANSFER ADDR JP DISKRD ;PERFORM DISK READ JP DISþNNNNNNNNNNNNNNNN¡¡¡þH0æNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCONTINUE ON WITH INIT ; INIT1: JR INIT ;############################################################################ ; êåþ�NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN�Ñ� ‚mƒ:„…Õ…£†p‡>ˆ ‰Ú‰§Št‹BŒ�ß�®Ž|�J�‘呲’€“N”•è•¶–„—R˜ ™î™¼š‰›Wœ$�ò�ÀžŽŸ[ )¡ö¡Ã¢‘£_¤,¥ú¥È¦žNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þIwÆNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; DIRECTORY SECTOR BUFFER STARTS HERE AFTER CRUNCHING COLD START ; CODE. THIS BUFFER IS USED BY THE CP/M DIRECTORY CHECK ROUTIü„þBNNNNNNNNNNNNNNNN¡¡¡þIÝ`NNNNNNNNNNNNNNNNNNNNNN¡¡¡û-ON ; CLOGO: LD HL,MSGSO CALL EDITOR ; ; MODIFY COLD START VECTOR TO WARM START ; LD HL,(BIOS+4) LD (BIOS+1),HL ; IþNNNNNNNNNNNNNNNNNN¡¡¡þI 2«NNNNNNNNNNNNNNNNNNNNNN¡¡¡û-- ; ; WARM REBOOT ENTRY LOADS CCP,BDOS FROM DISK & ; SETS UP VARIABLES ; ;------------------------------------------------“þNNNNNNNNNNNNNNNN¡¡¡þI×NNNNNNNNNNNNNNNNNNNNNN¡¡¡û CALL XPRIM ; NTHUNG: ENDIF ; ; LOG ON DRIVE TO INIT TABLES ; LD A,(DKPROM + 1) AND A,3 ;MODULO 4 LD C,A LDÀ(þ$NNNNNNNNNNNNNNNN¡¡¡þIýNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCP/BDOS ; WREAD: CALL DISKRD JR NZ,WEROR ;IF ERROR THEN EXIT ; ; NEXT SECTOR ; LD HL,BTSEC INC (HL) ; LD DE,SECS?þ!NNNNNNNNNNNNNNNN¡¡¡þIWºNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûROR: LD HL,MSGLE ;OUTPUT ERROR MESSAGE CALL EDITOR HALT ; ; ; BOOT OK, INIT PAGE 0 ; WZRPG: ; ; INIT BIOS WARM ST5!þdNNNNNNNNNNNNNNNNN¡¡¡þI%½äNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRIVE AND A,11000000B ;TEST UNUSED BUT DRIVEN BITS (1S IF NOT THERE) LD A,38H ;COND. JR (ON) JR Z,CLKON ; LD A,18H ;UNÀþHNNNNNNNNNNNNNNNNN¡¡¡þI+žëNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++ DISKWR: LD A,DDWRS ;SELECT WRITE OP JP DISKOP ;++++++++++++++++++++++++++++++++++++�þ!NNNNNNNNNNNNNNNN¡¡¡þI"•NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNES THAT ; CHECK FOR DISK CHANGE. ; ;############################################################################ DIRBF: EQ]ÇþNNNNNNNNNNNNNNNNNN¡¡¡þIÍ^NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; BOOT CCP & BDOS ; JR WARM ;############################################################################ ; ; SIGN-Ç@þ­NNNNNNNNNNNNNNNN¡¡¡þIgøNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û---------- WARM: IF INTRPTS ; ; SET INTERRUPT VECTOR TABLE BASE ; LD A,HIGH INTABL LD I,A ; ; SET INTERRUPT MOD£ÿþrNNNNNNNNNNNNNNNNN¡¡¡þI‹@NNNNNNNNNNNNNNNNNNNNNN¡¡¡û E,0 CALL SELDSK LD A,L ;IF ERROR THEN ABORT OR A,H JR Z,WEROR ; ; READ BOOT DIRECTORY ; LD BC,DEFBFR ;SET XFE§þINNNNNNNNNNNNNNNN¡¡¡þI¨ONNNNNNNNNNNNNNNNNNNNNN¡¡¡ûZ ;DMA := DMA + SECTOR SIZE LD HL,(BTDMA) ADD HL,DE LD (BTDMA),HL ; ; IF NOT INTO BDOS THEN READ NEXT SECTOR ; LD Dr�þ9NNNNNNNNNNNNNNNN¡¡¡þI BNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûART IN PAGE 0 ; LD A,0C3H LD HL,BIOS + 3 LD (PAGE0),A LD (PAGE0 + 1),HL ; ; INIT BDOS CALL VECTOR IN PAGE 0 ; LD÷FþHNNNNNNNNNNNNNNNNN¡¡¡þI&è·NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCOND. JR (OFF) (CAUSES JUMP TO ILLEGAL) ; CLKON: LD (INHCLK),A ; ENDIF ; ; PASS DEFAULT DISK TO CCP ; LD A,(DEFDRV)ÝþNNNNNNNNNNNNNNNNNN¡¡¡þI,|NNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++ ; ; SELECT DRIVE FUNCTION ; LOG-ON - SET DISK PARAMETER BLOCK ; ENTRY- C= DRIVE # jîþNNNNNNNNNNNNNNNN¡¡¡þI¤NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûU $ ;BUFFER BEGINNING ;---------------------------------------------------------------------------- ; ; INIT - COLD ©ïþNNNNNNNNNNNNNNNNN¡¡¡þI þoNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûON MESSAGE ; ;############################################################################ MSGSO: DB CR,LF DB CPMSZ / (KBYTɤþNNNNNNNNNNNNNNNNN¡¡¡þITÉNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE TO 2 ; IM 2 ; ; ENABLE INTERRUPT VECTOR 7 ; IN A,(INTMSK) AND A,7FH OUT (INTMSK),A ; ; FINALLY ENABLE VECTORèüþBNNNNNNNNNNNNNNNNN¡¡¡þI¸qNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR ADDRESS (USE DEFAULT BUFFER) CALL SETDMA ; LD BC,?DIRSEC ;SET DIRECTORY SECTOR CALL SETSEC ; LD BC,0 ;SET TRACK TO bVþrNNNNNNNNNNNNNNNN¡¡¡þI›~NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE,BDOS XOR A,A SBC HL,DE JR C,WREAD ; ; ELSE IF AT BEGINNING OF BDOS THEN SET UP NEW TRACK & SECTOR ; JR Z,RDBDOS ñsþNNNNNNNNNNNNNNNNNN¡¡¡þI!q NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û HL,BDOS + 6 LD (BDOSJV),A LD (BDOSJV + 1),HL ; ; INIT BIOS CALL VECTOR IN PAGE 0 ; LD HL,BIOFUNC LD (BFUNRSV),A ; þNNNNNNNNNNNNNNNN¡¡¡þI'Û†NNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD C,A JP CCP SUBTTL BIOS DISK FUNCTION ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++PôþrNNNNNNNNNNNNNNNNN¡¡¡þI-4MNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; E= 0 IF NEW SELECT ; EXIT - HL= PTR TO DPT OR 0 FOR ERROR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#½þNNNNNNNNNNNNNNNNN¡¡¡þIˆ3NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSTART ENTRY FROM BOOT MUST SET ALL BIOS PARAMS ; ;----------------------------------------------------------------------------± þHNNNNNNNNNNNNNNNN¡¡¡þI « (DIRBF + SECSZ) CONMSG **** WARNING! COLD INIT CODE BIGGER THAN DIR BUFFER **** ELSE DS DI‹þINNNNNNNNNNNNNNNNN¡¡¡þItµNNNNNNNNNNNNNNNNNNNNNN¡¡¡û INSURE MONITOR ROM STILL ENABLED ; CALL GETMON ; IF BOOT = 10H ; TEST ISHA HOST ADAPTER FOR A HUNG CONDITION AND C°Éþ[NNNNNNNNNNNNNNNN¡¡¡þIÞNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûEROR ; ; SET UP TO LOAD CCP/BDOS ; LD HL,(DEFBFR + ?DSBDSS) ;PREFETCH BDOS TRK/SECTOR PUSH HL ; LD HL,(DEFBFR + ?DSCšQþ9NNNNNNNNNNNNNNNNN¡¡¡þI1ØNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûM ; JP WZRPG ; ; ; ELSE SET UP & READ BDOS ; RDBDOS: POP HL ;RESTORE BDOS TRK/SECTOR FROM DIRECTORY LD C,L LD B,AßTþîNNNNNNNNNNNNNNNNN¡¡¡þI#BNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNTO INTERCEPT CODE ; LD HL,(BDOS + 7) LD (BDOSV),HL ; ; NOW PUT INTERCEPT VECTOR INTO BDOS CODE ; LD HL,INTCPT LD U©þNNNNNNNNNNNNNNNNNN¡¡¡þI)ø‰NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++ DISKRD: LD A,DDRDS ;SELECT READ OP JP DISKOP ;+++++++++++++++++++++++++++++++++++++++++++++++++++++XþNNNNNNNNNNNNNNNN¡¡¡þI/R/NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA,C CP A,NDRVS RET NC ; ; STORE DRIVE # FOR FUTURE USE ; LD (BTDRV),A ; ; SAVE LOGON REQUEST FLAG ; LD A,E Lƒ%þNNNNNNNNNNNNNNNNN¡¡¡þIîQNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; INIT DEFAULT DRIVE ; LD A,(DKPROM + 1) ;USE DRIVE # PASSED IN PAGE 0 AND A,3 LD (DEFDRV),A ; ; SEND SYSTEM SIGN`þ$NNNNNNNNNNNNNNNN¡¡¡þI šNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRBF+SECSZ-$ ;FILL OUT DIRECTORY BUFFER TO 1 SECTOR SIZE ENDIF ;--------------------------------------------------------&¢þNNNNNNNNNNNNNNNN¡¡¡þI!æNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûLEAR IF TRUE ; IN A,(HSTATUS) ;IF HOST ADAPTER BUSY THEN BIT HBUSYB,A JR Z,NTHUNG ; LD A,DDCLR LD (IOPB + PBCMDO),A 9ÃþNNNNNNNNNNNNNNNNN¡¡¡þIÎ-NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûCPS) ;FETCH CCP TRK/SECTOR LD C,L LD B,0 CALL SETSEC ; LD C,H CALL SETTRK ; LD BC,CCP CALL SETDMA ; ; READ C9þINNNNNNNNNNNNNNNNN¡¡¡þId‹NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;A STILL CONTAINS 0 CALL SETSEC ; LD C,H CALL SETTRK ; JR WREAD ; ; ; WARM BOOT ERROR, OUTPUT MSG & HALT ; WE¡ÏþNNNNNNNNNNNNNNNN¡¡¡þI$ŽÕNNNNNNNNNNNNNNNNNNNNNN¡¡¡û(BDOS + 7),HL ; ; INITIALIZE CLOCK VECTORS IF CLOCK INSTALLED ; IN A,(CLKDAT) ;IF CLOCK NOT PRESENT THEN TURN OFF CLOCK D-”þBNNNNNNNNNNNNNNNN¡¡¡þI*­ÚNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++ ; ; WRITE A DISK SECTOR ; EXIT - A= 0: OK; /0: ERROR ; ;+++++++++++++++++++++++++++++++++++++++++++YóþìNNNNNNNNNNNNNNNNN¡¡¡þI0AbNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD (LOGRQ),A ; ; COMPUTE DISK DRIVER TABLE PTR ; CALL RETDVRT ;DRIVE IS STILL IN C REGISTER LD (DVRTPTR),HL ; ; PRE)CþNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÎNNÿ€Ì�›‚hƒ5„…Ð…ž†l‡:ˆ‰Õ‰¢Šo‹=Œ �Ù�§Žu�D�‘Þ‘¬’z“H”•㕱–—M˜™è™¶š„›Rœ�í�ºžˆŸV %¡ò¡À¢Ž£\¤*¥÷¥Å¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þI@öNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFETCH DRIVER EXECUTION ADDRESS FROM TABLE ; LD E,(HL) ;STORE ADDRESS INC HL LD D,(HL) INC HL LD (DVRXADR),DE ; ; �mþ¹NNNNNNNNNNNNNNNN¡¡¡þIêPNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûJR NZ,LGDEF ; ; ELSE XFER ID SECTOR DATA TO TABLES ; CALL TRNONE ;ASSUME NO TRANSLATION ; ; IF HARD DISK OR DOUBLE D,LþNNNNNNNNNNNNNNNNNN¡¡¡þI ›NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDHD + 1 JR NC,LGCKFD ; ; ELSE USE HARD DISK DEFAULTS ; CALL TRNONE ; NO XLATE LD HL,HDPBK ; ; XFER DATA TO TABLü}þNNNNNNNNNNNNNNNN¡¡¡þI%çNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûBC RET ;**************************************************************************** ; ; SET SECTOR ; ENTRY- BC= SECTO˾þNNNNNNNNNNNNNNNN¡¡¡þIÊ,NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûUNCHANGED ; A, DE= ? ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ SECTRN: ; ; IF NO ~¥þNNNNNNNNNNNNNNNNNN¡¡¡þI`ŠNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFAULT BUFFER ; LD HL,DEFBFR LD (IOPB + PBDMAO),HL XOR A,A LD (IOPB + PBDMAXO),A ; ; SET DESCRIPTOR SECTOR SECTOR ;]þ¼NNNNNNNNNNNNNNNN¡¡¡þI%ŠÔNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûSAVE IY LD IY,(DVRTPTR) ;FETCH TABLE BASE ; LD HL,DKOPRET ;PUT RETURN ADDRESS ON STACK PUSH HL ; LD HL,(DVRXADR) ;FETC½€þ�NNNNNNNNNNNNNNNNN¡¡¡þI+©ÛNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD C,A ;ECHO CHAR CALL COC POP AF ; AND A,5FH ;INSURE UPPER CASE ; ; IF RETRY THEN RETURN TO CALLER ; CP A,'R' ;…þNNNNNNNNNNNNNNNNN¡¡¡þI¥NNNNNNNNNNNNNNNNNNNNNN¡¡¡û FETCH FLAGS ; LD C,(HL) ; ; COMPUTE DISK PARAMETER TABLE ADDRESS ; LD HL,(BTDRV) LD H,0 ADD HL,HL ;DISK # * 16 ëþ“NNNNNNNNNNNNNNNNN¡¡¡þIúnNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûENSITY THEN NO TRANSLATION ; LD A,(DEFBFR + IDFLGO) AND A,[1 SHL DFDTDB] OR [1 SHL DFHARDB] ; ; ELSE SET TRANSLATION ;±7þNNNNNNNNNNNNNNNN¡¡¡þIPÈNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûES ; SEL2: PUSH HL CALL DPBAD ; USE DEFAULT TABLE POP HL LD BC,DPBSZ LDIR JR SEL1 ; ; ; USE 8" FLOPPY DEFAULT²þäNNNNNNNNNNNNNNNNN¡¡¡þI¼pNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûR # ; ;**************************************************************************** SETSEC: LD (BTSEC),BC RET ;*****§fþÎNNNNNNNNNNNNNNNN¡¡¡þIŸNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTRANSLATION THEN RETURN SECTOR++ ; LD A,D ;IF TABLE ADDR = 0 THEN NO TRANSLATION OR A,E JP Z,NOTRAN ; ; ELSE CALCULATw$þNNNNNNNNNNNNNNNN¡¡¡þI u!NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û LD HL,2 LD (IOPB + PBSECO),HL ; ; SET DESCRIPTOR SECTOR TRACK ; LD L,H ;H == 0 FROM LAST OPERATION (HL= 0) LD (IO6þ„NNNNNNNNNNNNNNNNN¡¡¡þI&߇NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûH DRIVER ADDRESS PREFETCHED FROM TABLE JP (HL) ; ; DRIVER RETURNS HERE ; DKOPRET: POP IY ; ; IF NO ERRORS THEN RET‘]þ°NNNNNNNNNNNNNNNNNN¡¡¡þI,0LNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIF RETRY THEN RETURN TO CALLER JR Z,DKOPLP ; ; ELSE IF ABORT THEN DO WARM BOOT ; CP A,'A' ;IF ABORT THEN RE-BOOT JP ÎRþNNNNNNNNNNNNNNN¡¡¡þI&”NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ADD HL,HL ADD HL,HL ADD HL,HL LD DE,D0DPH ADD HL,DE ; ; IF NOT FIRST SELECT OR LOGON INHIBITED THEN RETURN TABLE PT÷~þ9NNNNNNNNNNNNNNNN¡¡¡þI É_NNNNNNNNNNNNNNNNNNNNNN¡¡¡û CALL Z,TR8 ; ; XFER DISK DATA TO DPB ; NOX: CALL DPBAD ;GET ADDR OF DPB LD HL,DEFBFR + IDSPTO LD BC,DPBSZ LDIR á¯þ NNNNNNNNNNNNNNNNN¡¡¡þIcùNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS ; LGCKFD: CALL TR8 LD HL,SD8PBK JR SEL2 ;**************************************************************************X´þNNNNNNNNNNNNNNNNNN¡¡¡þI�ANNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û*********************************************************************** ; ; SET TRANSFER ADDR ; ENTRY- BC= ADDRESS ; EXIT - óþ!NNNNNNNNNNNNNNNN¡¡¡þI¬NNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûE NEW SECTOR FROM TABLE ; EX DE,HL ADD HL,BC LD L,(HL) ; LD H,0 RET ; ; ; CONVERT FROM CP/M'S LOGICAL SECTOR {0:þyNNNNNNNNNNNNNNNN¡¡¡þI!FNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPB + PBTRKO),HL ; ; PASS COMMAND TO EXECUTOR ; LD A,DDLOG JR DISKOP2 ;++++++++++++++++++++++++++++++++++++++++++++›þNNNNNNNNNNNNNNNN¡¡¡þI'ì¶NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûURN ZF ; RET Z ;IF NO_ERROR THEN RETURN ; ; PRINT ERROR ; LD HL,DSKEM ;OUTPUT PREFIX CALL EDITOR ; LD DE,IOPB NYþNNNNNNNNNNNNNNNNN¡¡¡þI-}NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûZ,0 ; ; ELSE IF IGNORE THEN RETURN NO ERROR ; SUB A,'I' ;IF IGNORE THEN RETURN NO ERROR RET Z ; ; ELSE RETURN ERROÈÚþ NNNNNNNNNNNNNNNNN¡¡¡þI¿NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR ; LD A,(LOGRQ) OR A,C CPL AND A,1 RET Z ; ; ELSE LOG ON DRIVE ; LD (DTPTR),HL ;SAVE DRIVE TABLE PTR ; ; ¿ þ NNNNNNNNNNNNNNNN¡¡¡þI œ NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ; XFER DISK PHYSICAL DATA TO TABLE ; LD HL,DEFBFR + IDFLGO ; SEL1: PUSH HL LD HL,(DVRTPTR) LD DE,DVRFLG ADD HL,ÙöþäNNNNNNNNNNNNNNNN¡¡¡þIp´NNNNNNNNNNNNNNNNNNNNNN¡¡¡û** ; ; HOME DRIVE - TREAT AS SEEK TRK 0 ; EXIT - BC= 0 ; ;***************************************************************N„þ„NNNNNNNNNNNNNNNNN¡¡¡þIÚNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûA= 0 ; ;**************************************************************************** SETDMA: LD (BTDMA),BC XOR A,A LD (BTî!þNNNNNNNNNNNNNNNNN¡¡¡þI5ÙNNNNNNNNNNNNNNNNNNNNNN¡¡¡û..N-1} TO PHYSICAL SECTOR {1..N} ; NOTRAN: LD HL,1 ADD HL,BC RET SUBTTL DISK SUPPORT ROUTINES ;+++++++++++++++++m*þ·NNNNNNNNNNNNNNNN¡¡¡þI"CNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++ ; ; COMMON DISK I/O CODE ; EXIT - A= 0: OK; /0: ERROR ; ;+++++++++++++++++++++++++++++++…¡þNNNNNNNNNNNNNNNNN¡¡¡þI(üˆNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD B,IOPBSZ DSKER1: LD A,(DE) ;FETCH ERROR BYTE PUSH DE ;SAVE REGS PUSH BC CALL PRHEX ;OUTPUT ERROR CODE ; LD C,+ºþNNNNNNNNNNNNNNNN¡¡¡þI.V.NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûR TO BDOS ; FDSKER: LD HL,0 ;RETURN DPB_PTR = 0 FOR SELECT FUNCTION LD A,-1 ;RETURN -1 TO BDOS OR A,A RET ;******X®þNNNNNNNNNNNNNNNNN¡¡¡þIŒ2NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûATTEMPT TO READ ID SECTOR ; XOR A,A ;INIT FLAG BYTE UNTIL FIRMWARE REVISED LD (IOPB + PBST2O),A ; CALL DISKLOG JP NZ,{•þ„NNNNNNNNNNNNNNNN¡¡¡þI ¯=NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDE EX DE,HL POP HL LD BC,DVRSIZ - DVRFLG LDIR ; ; RETURN DRIVE TABLE PTR ; LD HL,(DTPTR) XOR A,A RET ; ; ;ŒÍþ„NNNNNNNNNNNNNNNNN¡¡¡þIC…NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û************* HOME: LD BC,0 ;**************************************************************************** ; ; SET TRACK ;ËþNNNNNNNNNNNNNNNN¡¡¡þIé#NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDMAX),A RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; SECTOR TRANSLATION FUNCTI*þäNNNNNNNNNNNNNNNNN¡¡¡þIèNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; LOGON DISK FUNCTION ; EXIT - A= 0: OK; /0: ERROR ; ;+++++++DêþÉNNNNNNNNNNNNNNNN¡¡¡þI# rNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++ DISKOP: ; ; SET UP IOPB ; LD HL,BTTRK LD DE,IOPB + PBTRKO LD BC,PBSTATw„þNNNNNNNNNNNNNNNN¡¡¡þI)ϹNNNNNNNNNNNNNNNNNNNNNN¡¡¡û' ' CALL COC ; POP BC ;RESTORE REGS POP DE INC DE ;NEXT ERROR BYTE DJNZ DSKER1 ;IF NOT DONE THEN LOOP ; LD HL,D�ãþ“NNNNNNNNNNNNNNNNN¡¡¡þI/eNNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************************************************************** ; ; SET 3740 SECTOR TRANSLATION PROCEDURE ; ENTRY- (DTÛ)þ�NNNNNNNNNNNNNNNNNN¡¡¡þIÙaNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûFDSKER ; ; IF NO ID SECTOR THEN USE DEFAULTS ; LD A,(IOPB + PBST2O) CP A,-2 ;0: NO ID, -1: JADE ID, -2: EXTENDED ID ÷þlNNNNNNNNNNNNNNNN¡¡¡þI 6ªNNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡û IF NOT HARD DISK THEN GO DO FLOPPY TEST ; LGDEF: LD A,(BTDRV) IF STHD <> 0 CP A,STHD JR C,LGCKFD ENDIF CP A,NßþNNNNNNNNNNNNNNNN¡¡¡þIÖNNNNNNNNNNNNNNNNNNNNNN¡¡¡û# ; ENTRY- BC= TRACK # ; ;**************************************************************************** SETTRK: LD (BTTRK),½õþ·NNNNNNNNNNNNNNNNN¡¡¡þIùNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûON ; ENTRY- DE= 0: NO XLATE, ELSE PTR TO XLATE TABLE ; BC= SECTOR # TO XLATE ; EXIT - HL= XLATED SECTOR OR (BC) + 1 ; BC= ´þ„NNNNNNNNNNNNNNNNN¡¡¡þIS»NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DISKLOG: ; ; SET DESCRIPTOR SECTOR XFER ADDRESS TO DEbþNNNNNNNNNNNNNNNNN¡¡¡þI$¹åNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûO - PBTRKO LDIR ; DISKOP2: LD (IOPB + PBCMDO),A ; ; FETCH DRIVER VECTOR & EXECUTE DISK DRIVER ; DKOPLP: PUSH IY ;‘;þ¹NNNNNNNNNNNNNNNN¡¡¡þI*šêNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûSKEB ;OUTPUT ERROR MESSAGE CALL EDITOR ; ; GET USER RESPONSE ; CALL CI ;GET USER RESPONSE ; PUSH AF ;SAVE CHAR L®þNNNNNNNNNNNNNNNN¡¡¡þI0vRNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûPTR)= MUST BE PTR TO DTP ; EXIT - DE, HL= ? ; ;**************************************************************************** G»þ'NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN8NNNNNNNN�Ñ� ‚mƒ;„…Ö…¤†q‡>ˆ ‰Ú‰§Šu‹CŒ�Þ�­Ž{�I�‘呲’€“N”•镸–†—S˜!™ï™½š‹›Yœ'�õ�ž�Ÿ^ ,¡ù¡Ç¢•£c¤0¥þ¥Ì¦öNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þJìNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûTR8: TR3740: LD DE,SDTRAN ; SETTR: LD HL,(DTPTR) LD (HL),E INC HL LD (HL),D RET ;*******************************·CþBNNNNNNNNNNNNNNNN¡¡¡þJF¼NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; HARD DISK DRIVER FUNCTION ; ENTRY- IY= DRIVER�=þINNNNNNNNNNNNNNNNNN¡¡¡þJ ©wNNNNNNNNNNNNNNNNNNNNNN¡¡¡û PRIMITIVE IN ROM ; PUSH IX LD IX,IOPB ;PASS PTR TO IOPB LD HL,DKPENT ;PRIMITIVE ENTRY LD A,(DKPROM) ;FETCH PROM # C oþNNNNNNNNNNNNNNNN¡¡¡þJ‰ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûX21 ; ; DATA TRACKS ; LD C,(IY + DVRDSPT) ; ; COMMON SIDE SELECT CODE ; FD8X2: INC C SUB A,C JP C,SPTOK ; INº(þHNNNNNNNNNNNNNNNN¡¡¡þJfÀNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; LD A,C CP A,MAXFUNCS LD A,-1 RET NC ; ; ELSE COMPUTE TABLE ENTRY ; PUSH HL ;SAVE POSSIBLE DATA ; LD HL,BFUN©ïþNNNNNNNNNNNNNNNN¡¡¡þJÌfNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN BIOS VERSION # ; EXIT - HL= VERSION # IN BINARY {0.00Ðãþ NNNNNNNNNNNNNNNNN¡¡¡þJ%&8NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûILLEGAL DRIVE THEN RETURN ERROR ; CP A,NDRVS JR C,RETDV2 ; OR A,A RET ; ; ; ELSE COMPUTE TABLE PTR ; RETDV2: LDëÉþdNNNNNNNNNNNNNNNNN¡¡¡þJ+7NNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************************************************** ; ; OUTPUT HEX DATA TO CONSOLE SUBR ; ENTRY- A= DATA ; EXIT - A, SŸþ!NNNNNNNNNNNNNNNN¡¡¡þJ¹INNNNNNNNNNNNNNNNNNNNNN¡¡¡û********************************************* ; ; SET NO SECTOR TRANSLATION PROCEDURE ; EXIT - HL, DE= ? ; ;***************åþBNNNNNNNNNNNNNNNN¡¡¡þJV‚NNNNNNNNNNNNNNNNNNNNNN¡¡¡û TABLE PTR ; EXIT - A= 0: OK; /0: ERROR ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ HDEX—’þdNNNNNNNNNNNNNNNN¡¡¡þJü$NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûALL EXROM ;EXECUTE THE PRIMITIVE POP IX ; ; RETURN THE COMMAND RESULTS STATUS ; LD A,(IOPB + PBSTATO) OR A,A RET KþNNNNNNNNNNNNNNNNN¡¡¡þJœNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûC A ;MUST START AT 1 LD (IOPB + PBSECO),A ; ; SELECT SIDE 1 ; LD A,80H FD8X1: LD (IOPB + PBSECO + 1),A ; ; EXECUTöþNNNNNNNNNNNNNNNN¡¡¡þJ3“NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTBL LD A,C ADD A,A ADD A,L LD L,A LD A,0 ADC A,H LD H,A ; ; EXECUTE TABLE ADDRESS ; LD A,(HL) INC HL LD þBNNNNNNNNNNNNNNNN¡¡¡þJ ÙÍNNNNNNNNNNNNNNNNNNNNNN¡¡¡û,..655.35} ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ RETVERS: LD HL,VERSN XOR A,A æ¿þ“NNNNNNNNNNNNNNNNN¡¡¡þJ&skNNNNNNNNNNNNNNNNNNNNNN¡¡¡û B,C LD DE,DVRSIZ ; RETDVL: ADD HL,DE DJNZ RETDVL ; ; RETURN NO ERROR ; XOR A,A RET ;+++++++++++++++++++++++!öþNNNNNNNNNNNNNNNNN¡¡¡þJ,œ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûC= ? ; ;**************************************************************************** PRHEX: ; ; PROCESS HIGH NIBBLE 1ST ­åþHNNNNNNNNNNNNNNNN¡¡¡þJŠxNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************************* TRNONE: LD DE,0 JR SETTR ;++++++++++++++++++++++++++++++++\¸þNNNNNNNNNNNNNNNNN¡¡¡þJ e³NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûEC: ; ; CONVERT LOGICAL DRIVE TO PHYSICAL DRIVE ; LD A,(IY + DVRPDRV) ;0,1: DRV 0, 2,3: DRV 1 LD (IOPB + PBDRVO),A ; VþNNNNNNNNNNNNNNNNN¡¡¡þJÏNNNNNNNNNNNNNNNNNNNNNN¡¡¡û SUBTTL JADE FLOPPY DRIVER ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; JADa�þ9NNNNNNNNNNNNNNNNN¡¡¡þJ#­NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE THE IOPB ; JP XPRIM ; ; ; TRACK 0 ; FD8X20: LD C,(IY + DVR0SPT) JP FD8X2 ; ; ; TRACK 1 ; FD8X21: LD C,(IY +“£þdNNNNNNNNNNNNNNNN¡¡¡þJ¢NNNNNNNNNNNNNNNNNNNNNN¡¡¡û H,(HL) LD L,A ; EX (SP),HL ;PUT CALLER'S DATA IN HL, FUNCTION ADDR ON RET ; STACK, EXECUTE FUNCTION ADDRESS ON STACK ¥°þ!NNNNNNNNNNNNNNNN¡¡¡þJ!êüNNNNNNNNNNNNNNNNNNNNNN¡¡¡û;RETURN NO ERROR RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN DRIVER T�þ!NNNNNNNNNNNNNNNN¡¡¡þJ'@ZNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; EXECUTE IOPB FUNCTION ; ENTRY- DE= IOPB PTR ; EXIT - A= 0: OK ; Œ;þ!NNNNNNNNNNNNNNNNN¡¡¡þJ-¯‘NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û; CALL PRDIG ; ; SWAP HIGH & LOW NIBBLES ; PRDIG: RLCA RLCA RLCA RLCA ; ; SAVE DATA FOR RETURN ; PUSH AF ;¦qþgNNNNNNNNNNNNNNNNN¡¡¡þJïNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN DRIVE PARAMETER BLOCK ADDR FUNCTION ; EXIT - DE= DPB PTR ; HL= ? ;îSþHNNNNNNNNNNNNNNNN¡¡¡þJ 0àNNNNNNNNNNNNNNNNNNNNNN¡¡¡û; OFFSET LOGICAL ADDRESS WITH LOGICAL DRIVE ; LD A,(BTDRV) ;IF EVEN THEN ADD 0 ELSE ADD 128 RRCA AND A,80H LD E,A ;þ NNNNNNNNNNNNNNNN¡¡¡þJÜXNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE 8" FLOPPY DISK DRIVER FUNCTION ; ENTRY- IY= DRIVER TABLE PTR ; EXIT - A= 0: OK; /0: ERROR ; ;+++++++++++++++++++++++++++++wþNNNNNNNNNNNNNNNNNN¡¡¡þJvþNNNNNNNNNNNNNNNNNNNNNN¡¡¡û DVR1SPT) JP FD8X2 ; ; ; SECTORS OK ; SPTOK: XOR A,A JP FD8X1 SUBTTL BIOS FUNCTION CALLS ;++++++++++++++++++++uãþBNNNNNNNNNNNNNNNNN¡¡¡þJ™5NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;############################################################################ ; ; BIOS FUNCTION TABLE ; ;##############=ÿþNNNNNNNNNNNNNNNN¡¡¡þJ"¿¯NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûABLE PTR FUNCTION ; ENTRY- C= DRIVE # (E FOR FUNCTION CALL) ; EXIT - HL= DRIVER TABLE BASE PTR ; A, C= 0 ; ;++++++++++++++ XþBNNNNNNNNNNNNNNNN¡¡¡þJ(PdNNNNNNNNNNNNNNNNNNNNNN¡¡¡û;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ EXIOPB: ; ; SAVE REG ; PUSH IX ; ; SETj°þNNNNNNNNNNNNNNNNNN¡¡¡þJ.úÂNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; CONVERT TO ASCII USING DAA TRICK ; AND A,0FH ADD A,90H DAA ADC A,40H DAA ; ; OUTPUT CHAR TO CONSOLE ; LD¿Úþ9NNNNNNNNNNNNNNNNN¡¡¡þJ ÞNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ DPBAD: LD HL,(DTPTR) ;FETCH BASE ADDR LD DE,1mþoNNNNNNNNNNNNNNNNN¡¡¡þJ ÑNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCOMPUTE SECTOR LD D,0 LD HL,(IOPB + PBSECO) ADD HL,DE LD (IOPB + PBSECO),HL ; ; FINISH SETTING UP THE IOPB ; XPRIMOÝþdNNNNNNNNNNNNNNNNN¡¡¡þJïiNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++ FD8EXEC: ; ; CONVERT LOGICAL DRIVE TO PHYSICAL DRIVE ; LD A,(IY + DVRPDRŽxþNNNNNNNNNNNNNNNN¡¡¡þJEÏNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; FUNCTION DISPATCHER ; EXIT - A= -1: ERROR, 0: OK ; ;++++++++++|äþNNNNNNNNNNNNNNNNN¡¡¡þJªNNNNNNNNNNNNNNNNNNNNNN¡¡¡û############################################################## BFUNTBL: DW RETVERS ;0:RETURN VERSION # DW RETDVRTF ;1:RETU@ÕþyNNNNNNNNNNNNNNNN¡¡¡þJ#ŒžNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; BIOS CALL ENTRY (E= DRIVE #) ; RETDVRTF: LD C,E ; R½øþNNNNNNNNNNNNNNNNNN¡¡¡þJ)cUNNNNNNNNNNNNNNNNNNNNNN¡¡¡û UP FOR CALL ; PUSH DE POP IX LD HL,DKPENT LD A,(DKPROM) CALL EXROM ; ; FETCH & RETURN RESULT STATUS ; LD A,(IjþNNNNNNNNNNNNNNNNNN¡¡¡þJ/ÉóNNNNNNNNNNNNNNNNNNNNNN¡¡¡û C,A CALL COC ; ; RETURN DATA ; POP AF RET IF INTCPTS SUBTTL ADDITIONAL FUNCTIONS TO SUPPORT CDOS PROGRAMS l»þ!NNNNNNNNNNNNNNNNN¡¡¡þJu�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û0 ;ADD OFFSET OF DPB PTR ADD HL,DE LD E,(HL) ;FETCH DPB PTR INC HL LD D,(HL) RET SUBTTL HARD DISK ROUTINES ;+Ü™þ¯NNNNNNNNNNNNNNNN¡¡¡þJ šFNNNNNNNNNNNNNNNNNNNNNN¡¡¡û: XOR A,A LD (IOPB + PBFLGO),A ;NO FLAGS FOR NOW ; LD HL,SECSZ ;SET XFER COUNT LD (IOPB + PBST4O),HL ; ; EXECUTE THE­ÅþNNNNNNNNNNNNNNNN¡¡¡þJº:NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûV) LD (IOPB + PBDRVO),A ; ; SELECT SIDE ; LD A,(IOPB + PBTRKO) CP A,1 LD A,(IOPB + PBSECO) JR C,FD8X20 JR Z,FD8jþ NNNNNNNNNNNNNNNNN¡¡¡þJUñNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ BIOFUNC: ; ; IF FUNCTION # NOT IN TABLE THEN RETURN -1 oDþNNNNNNNNNNNNNNNNN¡¡¡þJÿWNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûRN DISK PHYSICAL CONFIGURATION TABLE PTR DW EXIOPB ;2:EXECUTE THE IOPB MAXFUNCS EQU ($ - BFUNTBL) / 2 ;++++++++++++++++±NþNNNNNNNNNNNNNNNN¡¡¡þJ$ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûETDVRT: LD HL,DVR0 ;START AT 1ST TABLE ; ; IF DRIVE == 0 THEN ALREADY THERE ; LD A,C OR A,A RET Z ; ; ELSE IF �þNNNNNNNNNNNNNNNNNN¡¡¡þJ*6NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûX+PBSTATO) POP IX ;RESTORE REG OR A,A ;TEST RESULT FOR RETURN RET SUBTTL NON-DISK PROCEDURES ;******************ÂþgNNNNNNNNNNNNNNNNN¡¡¡þJ0Ú¾NNNNNNNNNNNNNNNNNNNNNN¡¡¡û;*************************************************************************** ; ; SYSTEM CALL INTERCEPT ROUTINE CHECKS FOR ILLEŽvþNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN@NNNÿ€Î��‚jƒ8„…Ô…¢†o‡<ˆ ‰Ø‰¥Šr‹@Œ�Ý�«Žy�G�‘㑱’“M”•è•·–…—R˜ ™î™¼š‰›Wœ%�ô�ž�Ÿ^ ,¡ù¡Ç¢•£d¤2¥ÿ¥Í¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þJÛ*NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûGAL BDOS CALLS & ; PRINTS MESSAGE IF ILLEGAL. ALSO IMPLEMENTS CDOS CLOCK/CALENDAR ; SYSTEM CALLS FOR ASMB. ; ;************¤œþNNNNNNNNNNNNNNNNN¡¡¡þJqŒNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûJR C,CLKSET ;IF SET FUNCTION THEN SET CLOCK ; JR Z,CLKTIM ;IF TIME THEN GET IT ; CP A,93H JR Z,CLKRDC ;IF READ CLOCK THEQþNNNNNNNNNNNNNNNNNN¡¡¡þJ žGNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ CLKCAL: LD HL,CALENT ;ROM ENTRY POINT ; CLK1: LD—™þNNNNNNNNNNNNNNNN¡¡¡þJ¾;NNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡û**************************************************************************** ; ; CLOCK SET FUNCTION 91H ; ENTRY- DE= CLOCK IMæqþNNNNNNNNNNNNNNNN¡¡¡þJQðNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûECTOR JP (HL) ;EXECUTE ROM ; ; ROM PROCEDURE RETURNS HERE ; EXROMR: PUSH AF ;SAVE RETURN VALUE CALL GETMON ;RESELECT´þNNNNNNNNNNNNNNNNN¡¡¡þJûVNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ CNSCK: IF USEMON CALL GETMON JP 0F812H ELSE I-ßþ¹NNNNNNNNNNNNNNNNN¡¡¡þJ%NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ NTOST: IN A,(NTS) CPL ;REVERSE SENSE AND A,1 SHªèþlNNNNNNNNNNNNNNNNN¡¡¡þJ+2NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û*********************************************************************** LO: IF USEMON CALL GETMON JP 0F80FH ELSE ^þNNNNNNNNNNNNNNNN¡¡¡þJŽyNNNNNNNNNNNNNNNNNNNNNN¡¡¡û*************************************************************** INTCPT: LD A,C ;CHECK CALL VALIDITY CP A,41 ;IF <= 40 THEN ÁþNNNNNNNNNNNNNNNN¡¡¡þJa²NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûN GET IT ; ; ILLEGAL SYSTEM CALL ; ILLEGC: LD HL,ISCMSG ;OUTPUT WARNING CALL EDITOR XOR A,A ;BC = HL = A = 0 LD L,A –äþ¹NNNNNNNNNNNNNNNN¡¡¡þJËNNNNNNNNNNNNNNNNNNNNNN¡¡¡û BC,CLKBFR ;READ CLOCK JR CLK2 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN¾ þNNNNNNNNNNNNNNNNNNN¡¡¡þJ'¬NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûAGE BUFR PTR (13 BYTES LONG) ; ;**************************************************************************** CLKSET: LD C,E˜þNNNNNNNNNNNNNNNN¡¡¡þJ£NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûT MONITOR ROM ; POP AF ;RETURN VALUE RET SUBTTL CHAR I/O ROUTINES ;+++++++++++++++++++++++++++++++++++++++++++++++++íˆþNNNNNNNNNNNNNNNN¡¡¡þJ îýNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûN A,(NTS) ;IF DATA NOT READY THEN RETURN 0 AND A,1 SHL NTRDY TTOST1: RET Z LD A,-1 ;ELSE RETURN -1 RET ENDIF ;ÆþNNNNNNNNNNNNNNNNN¡¡¡þJ&D[NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûL NTBSY JR TTOST1 ENDIF ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; READER DRKÞþ“NNNNNNNNNNNNNNNNNN¡¡¡þJ,«�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûCALL LISTST ;IF BUSY THEN WAIT JR Z,LO ; LD A,C ;OUTPUT CHAR SET 7,A OUT (CENTOUT),A ; RES 7,A ;OUTPUT LOW TRUE S’ þ�NNNNNNNNNNNNNNNN¡¡¡þJ½HNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûOK ; BDOSV EQU $ + 1 JP C,BDOS + 11H ;THIS ADDR MODIFIED BY WARM BOOT RTN ; ; THE FOLLOWING CONDITIONAL JUMP IS MODIFIED ­þNNNNNNNNNNNNNNNNN¡¡¡þJ RƒNNNNNNNNNNNNNNNNNNNNNN¡¡¡û LD H,A LD C,A LD B,A RET ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ; CDOS R /þNNNNNNNNNNNNNNNNN¡¡¡þJø%NNNNNNNNNNNNNNNNNNNNNN¡¡¡û TIME FUNCTION 92H ; EXIT - A= SECONDS ; B= MINITS ; C= HOURS ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++ÏMþäNNNNNNNNNNNNNNNNN¡¡¡þJ�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;SET UP PARAMETERS LD B,D LD HL,SETENT CLK2: LD A,CALROM ENDIF ;************************************************LøþNNNNNNNNNNNNNNNNN¡¡¡þJ7’NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û+++++++++++++++++++++++++++ ; ; CONSOLE INPUT ; EXIT - A= CHAR ; ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++¡Vþ NNNNNNNNNNNNNNNNN¡¡¡þJ!ÝÌNNNNNNNNNNNNNNNNNNNNNN¡¡¡û**************************************************************************** ; ; CONSOLE OUTPUT ; ENTRY- C= CHAR TO OUTPUT ;äxþ¹NNNNNNNNNNNNNNNN¡¡¡þJ'wjNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûIVER - DUMMY ; EXIT - A= CTRL-Z ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ READER: LD AžôþdNNNNNNNNNNNNNNNNN¡¡¡þJ-˜¡NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTROBE OUT (CENTOUT),A SET 7,A OUT (CENTOUT),A RET ENDIF ;++++++++++++++++++++++++++++++++++++++++++++++++++++++¹ñþ°NNNNNNNNNNNNNNNNN¡¡¡þJ$ßNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTO AN UNCONDITIONAL JUMP BY ; THE WARM BOOT ROUTINE IF THE CLOCK/CALENDAR BOARD IS NOT PRESENT ; IF NOT MODIFIED, THEN IT IS§IþNNNNNNNNNNNNNNNN¡¡¡þJ ÐNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûETURN VERSION FUNCTION ; MAKES CLOCK/CALENDAR WORK. ; EXIT - B= 1 ; ;++++++++++++++++++++++++++++++++++++++++++++++++++++++JþœNNNNNNNNNNNNNNNN¡¡¡þJëhNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û++++++++++++++++++++ CLKTIM: LD HL,TIMENT JR CLK1 ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++i˜þNNNNNNNNNNNNNNNNNNN¡¡¡þJAÎNNNNNNNNNNNNNNNNNNNNNN¡¡¡û**************************** ; ; EXECUTE ROM ROUTINE ; ENTRY- HL= ENTRY ADDRESS ; A= ROM # ; EXIT - ? ; ;***************P#þ·NNNNNNNNNNNNNNNNN¡¡¡þJ®NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++ CI: IF USEMON CALL GETMON ;SWITCH IN MONITOR ROM JP 0F803H ;USE MONITOR ELSE CALL CNSCK ;IyœþyNNNNNNNNNNNNNNN¡¡¡þJ"ˆŸNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;**************************************************************************** COC: IF USEMON CALL GETMON JP 0F809H ²Xþ�NNNNNNNNNNNNNNNNN¡¡¡þJ(gTNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û,CTRLZ ;FAKE EOF ;**************************************************************************** ; ; PUNCH DRIVER ; ENTRYG’þÉNNNNNNNNNNNNNNNNN¡¡¡þJ.ÍòNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++ ; ; RETURN LIST DEVICE STATUS ; EXIT - A= 0: BUSY, FFH:READY ; ;++++++++++++++++++++++++++++++++++++eÛþNNNNNNNNNNNNNNNNN¡¡¡þJîNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û ALLWAYS FALSE (NOP). ; INHCLK: JR C,ILLEGC ; ; NOW CHECK FOR EXTENDED CALLS ; CP A,8DH ;IF RETURN VERSION THEN RETURN –çþ„NNNNNNNNNNNNNNNN¡¡¡þJ 4áNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++ RETCVER: LD B,1 RET SUBTTL CLOCK ROUTINES ;++++++++++++++++++++++++++++++++++++++++++++++++++++<·þÎNNNNNNNNNNNNNNNNN¡¡¡þJØYNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++ ; ; READ CLOCK TIME FUNCTION 93H ; ENTRY- DE= PTR TO 13 BYTE BUFFER FOR CLOCK DATA ; ;+++++++++++++++++++++++++++!þäNNNNNNNNNNNNNNNN¡¡¡þJrÿNNNNNNNNNNNNNNNNNNNNNN¡¡¡û************************************************************* EXROM: AND A,ROMSMK ;MASK OUT UNUSED BITS OUT (ROMSEL),A ; NCþ°NNNNNNNNNNNNNNNNNN¡¡¡þJ�4NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûF NO CHAR RDY THEN WAIT JR Z,CI IN A,(NTD) ;ELSE RETURN CHAR RET ENDIF ;++++++++++++++++++++++++++++++++++++++++ìüþNNNNNNNNNNNNNNNNN¡¡¡þJ#»®NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ELSE CALL NTOST ;IF BUSY THEN WAIT OR A,A JR Z,COC LD A,C OUT (NTD),A RET ;+++++++++++++++++++++++++++++++Æ7þÎNNNNNNNNNNNNNNNNN¡¡¡þJ)TeNNNNNNNNNNNNNNNNNNNNNN¡¡¡û- C= CHAR TO OUTPUT ; ;**************************************************************************** PUNCH: RET ;********‡mþ!NNNNNNNNNNNNNNNN¡¡¡þJ/þÃNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++++++ LISTST: IF USEMON CALL GETMON JP 0F827H ELSE IN A,(CENTS) ;IF BUSY THEN !~þNNNNNNNNNNNNNNNNN¡¡¡þJB½NNNNNNNNNNNNNNNNNNNNNN¡¡¡û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 ù­þòNNNNNNNNNNNNNNNN¡¡¡þJ ­vNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++ ; ; RETURN CALENDAR FUNCTION 90H ; EXIT - A= DAY ; B= MONTH ; C= YEAR ; L= DAY OF WEEK ; ;++kþœNNNNNNNNNNNNNNNN¡¡¡þJ� NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++++++ CLKRDC: LD C,E ;SET UP PARAMETERS LD B,D LD HL,RDBENT JR CLK2 ;gµþNNNNNNNNNNNNNNNNN¡¡¡þJbÁNNNNNNNNNNNNNNNNNNNNNN¡¡¡û PUSH HL ;SAVE ROM ENTRY VECTOR ; LD HL,EXROMR ;PUT RETURN ADDR ON STACK EX (SP),HL ;SWAP RETURN ADDRESS WITH ROM ENTRY Vñ.þ�NNNNNNNNNNNNNNNNN¡¡¡þJÈgNNNNNNNNNNNNNNNNNNNNNN¡¡¡û++++++++++++++++++++++++++++++++++++ ; ; RETURN CONSOLE STATUS ; EXIT - A= 0: NOT READY ; FFH: CHAR READY ; ;+++++++++|íþ�NNNNNNNNNNNNNNNNN¡¡¡þJ$"9NNNNNNNNNNNNNNNNNNNNNN¡¡¡û+++++++++++++++++++++++++++++++++++++++++++++ ; ; RETURN CONSOLE OUTPUT READY STATUS ; EXIT - A= 0: BUSY, FFH: READY ; ;+++lþNNNNNNNNNNNNNNNN¡¡¡þJ*6NNNNNNNNNNNNNNNNNNNNNN¡¡¡û******************************************************************** ; ; PRINTER DRIVER ; ENTRY- C= CHAR TO OUTPUT ; ;*****fKþ°NNNNNNNNNNNNNNNNN¡¡¡þJ0íŽNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRETURN 0 CPL ;INVERT THE SENSE AND A,1 SHL CENTBSY RET Z LD A,0FFH ;ELSE RETURN -1 RET ENDIF ;**********sþœNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN8NNNNNNNN�Ò�¡‚nƒ<„ …Ø…¦†s‡@ˆ ‰Ü‰©Šv‹EŒ�á�¯Ž}�L�‘葵’ƒ“Q”•땺–ˆ—V˜$™ò™Àš�›[œ(�÷�Äž’Ÿ` /¡ü¡Ê¢˜£f¤4¥¦Ð¦�NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þKš®NNNNNNNNNNNNNNNNNNNNNN¡¡¡û****************************************************************** ; ; GET MONITOR PROM SUBR ; EXIT - A= ? ; ;*************¤ÒþNNNNNNNNNNNNNNNNN¡¡¡þK0NNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------------------------------------- ; ; USER INTERRUPT ; ;----------------------------------------------------Ò,þNNNNNNNNNNNNNNNNNN¡¡¡þK ßÃNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûP1 ; POP BC ;RESTORE REGS 1ST POP HL POP AF JP 0038H ; ; IF OPTION IS MONITOR THEN EXECUTE MONITOR TRAP ; ITRAP1(þNNNNNNNNNNNNNNNN¡¡¡þKÿ¿NNNNNNNNNNNNNNNNNNNNNNÿ¡¡¡û; 3740 SECTOR TRANSLATION TABLE ; **** CP/M SINGLE DENSITY **** ; ;##########################################################r¯þHNNNNNNNNNNNNNNNN¡¡¡þKtNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDVRFG DS 1 ;FLAGS (B0= INHIBIT LOGON) DVRPDRV DS 1 ;PHYSICAL DRIVE ; ; THE FOLLOWING MAY BE BROUGHT OFF DISK DESCRIPTOR OR 2þNNNNNNNNNNNNNNNNN¡¡¡þKºÒNNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ALLDRV MACRO #DADD,#PD,#FG,#S0,#Z0,#S1,#Z1,#SD,#ZD LIST ON DW #DADD DB Üuþ9NNNNNNNNNNNNNNNNN¡¡¡þK%PŒNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;############################################################################ ; ; DEFAULT 8" FLOPPY DISK PARAMETER BLOCK ;„•þNNNNNNNNNNNNNNNNNN¡¡¡þK+sƒNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û################################ HDPBK: DW 128 ;SECTORS PER TRACK (LOGICAL) (SPT) DB 5 ;BLOCK SHIFT FACTOR (BSH) DB 31 }ïþrNNNNNNNNNNNNNNNN¡¡¡þKÏýNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û*************************************************************** GETMON: LD A,XMONROM OUT (ROMSEL),A RET ;***********·þ NNNNNNNNNNNNNNNN¡¡¡þK 6NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û------------------------ ITRAP: ; ; SAVE REGS FIRST ; PUSH AF PUSH HL PUSH BC ; ; SAVE CURRENT ROM & GET MONITORÙþNNNNNNNNNNNNNNNN¡¡¡þKŠ�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û: CP A,'M' JR NZ,ITRAPR ; POP BC POP HL POP AF JP 0F824H ; ; ELSE RESTORE REGS & RETURN ; ITRAPR: LD A,(ROMSALþNNNNNNNNNNNNNNNNNNN¡¡¡þKf(NNNNNNNNNNNNNNNNNNNNNN¡¡¡û################## SDTRAN: GXLATE 26,6 ; DB 1,7,13,19,25,5,11,17,23,3,9,15 ; DB 21,2,8,14,20,26,6,12,18,24,4,10 ; DB 16,22W!þNNNNNNNNNNNNNNNN¡¡¡þKE'NNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûFROM DEFAULT TABLES ; DVRFLG DS 1 ;DISK FLAGS DVR0SPT DS 1 ;TRK 0 SECTORS PER TRK DVR0SZ DS 1 ;TRK 0 SECTOR SIZE DVR1SPT DSËþINNNNNNNNNNNNNNNN¡¡¡þK ¯yNNNNNNNNNNNNNNNNNNNNNN¡¡¡û0 ;;LOGON INHIBIT FLAG (LOGON ENABLED) DB #PD DB #FG DB #S0,#Z0,#S1,#Z1,#SD,#ZD DB 0 ;;DISK TYPE LIST OFF ENDM ¡oþNNNNNNNNNNNNNNNNN¡¡¡þK&ßNNNNNNNNNNNNNNNNNNNNNN¡¡¡û IBM 3740 SINGLE DENSITY FORMAT ; ;############################################################################ SD8PBK: DW 26$gþrNNNNNNNNNNNNNNNNNN¡¡¡þK,êNNNNNNNNNNNNNNNNNNNNNN¡¡¡û;BLOCK MASK (BLM) DB 1 ;NULL MASK (EXM) DW 1015 ;DISK SIZE (CLUSTERS -1) (DSM) DW 1152 / 2 ;DIRECTORY MAX (DRM) ¢.þHNNNNNNNNNNNNNNNN¡¡¡þKüÌNNNNNNNNNNNNNNNNNNNNNN¡¡¡û***************************************************************** ; ; MESSAGE EDITOR ; ENTRY- HL= TEXT PTR (BIT 7= 1: TERMINAÓ‹þHNNNNNNNNNNNNNNNNN¡¡¡þK NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ROM ; IN A,(ROMSEL) LD (ROMSAV),A CALL GETMON ; ; PRINT PROMPT ; LD HL,ITMSG IQCONT: CALL EDITOR ; LD HL,IQMSôìþgNNNNNNNNNNNNNNNNN¡¡¡þK¹¡NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûV) ;RESTORE ROM # OUT (ROMSEL),A ; POP BC POP HL POP AF EI ;RE-ENABLE INTERRUPTS RET ;----------------------|çþdNNNNNNNNNNNNNNNNN¡¡¡þKUNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ;############################################################################ ; ; COMMON I/O PARAMETER BLOCK ; ;######2þNNNNNNNNNNNNNNNNNN¡¡¡þKvNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û 1 DVR1SZ DS 1 DVRDSPT DS 1 DVRDSZ DS 1 DVRDTYP DS 1 ;RESERVED FOR DISK TYPE ; ; DEFINE THE STRUCTURE SIZE ; DVRSIZ DS>ìþìNNNNNNNNNNNNNNNNN¡¡¡þK!œHNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDVR0: IF BOOT = 10H ALLDRV HDEXEC,4,60H,64,1,64,1,64,1 ALLDRV HDEXEC,4,60H,64,1,64,1,64,1 ALLDRV HDEXEC,5,60H,64,1,64,„%þ NNNNNNNNNNNNNNNN¡¡¡þK'6îNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û ;SECTORS PER TRACK DB 3 ;BLOCK SHIFT FACTOR DB 7 ;BLOCK MASK DB 0 ;NULL MASK DW 242 ;DISK SIZE -1 DW 63 ;DIRECT¡þHNNNNNNNNNNNNNNNNN¡¡¡þK-Ù%NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûDB 0FFH ;ALLOCATION 0 (AL0) DB 10000000B ;ALLOCATION 1 (AL1) DW 0 ;CHECK SIZE (CKS) DW 2 ;TRACK OFFSET (OFF) ;4hþNNNNNNNNNNNNNNNNN¡¡¡þKe[NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTOR) ; EXIT - REGS= ? ; ;**************************************************************************** EDITOR: LD C,(HL) ;ME‘òþNNNNNNNNNNNNNNNN¡¡¡þK FTNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûG ;QUERY USER CALL EDITOR ; ; GET & ECHO USER INPUT ; CALL CI ; PUSH AF LD C,A CALL COC POP AF ; ; IF OPTIîþ\NNNNNNNNNNNNNNNN¡¡¡þKªìNNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------------------------------------------ ; ; UNSUPPORTED INTERRUPT ; ;----------------------------------------ëCþNNNNNNNNNNNNNNNNNNN¡¡¡þKJNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û###################################################################### IOPB: REPT 16 ;;HARD DISK IOPB LIST OFF DB 0 LIST¯¿þNNNNNNNNNNNNNNNNN¡¡¡þKï�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û 0 ENDM ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; MACRO TO DEFINE THE DRIVER TABLÉÐþNNNNNNNNNNNNNNNN¡¡¡þK"ÉNNNNNNNNNNNNNNNNNNNNNN¡¡¡û1,64,1 ALLDRV HDEXEC,5,60H,64,1,64,1,64,1 ALLDRV FD8EXEC,0,0,26,0,26,0,26,0 ALLDRV FD8EXEC,1,0,26,0,26,0,26,0 ENDIF tQþINNNNNNNNNNNNNNNNN¡¡¡þK(&ÐNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûORY MAX DB 11000000B ;ALLOC 0 DB 0 ;ALLOC 1 DW 16 ;CHECK SIZE DW 2 ;TRACK OFFSET ; ; DEFAULT DISK PHYSICAL PARAME)bþNNNNNNNNNNNNNNNNN¡¡¡þK.ŒvNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ; ; DB 01100000B ;FLAGS 256 BPS, HARD, SSSD DB 64,1,64,1,64,1 ;64 SPT, 256 BPS ;####################################´ÿþHNNNNNNNNNNNNNNNNN¡¡¡þKVjNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûSSAGE EDIT LOOP PUSH HL ;SAVE PTR RES 7,C ;CLEAR BIT 7 FOR OUTPUT CALL COC ; POP HL BIT 7,(HL) ;IF BIT 7 SET THEN ìŒþNNNNNNNNNNNNNNNN¡¡¡þK ueNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûON 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 ; ANDVþNNNNNNNNNNNNNNNNN¡¡¡þK™ÝNNNNNNNNNNNNNNNNNNNNNN¡¡¡û------------------------------------ ILLINT: PUSH AF ;SAVE ALL 8080 REGS PUSH HL PUSH BC LD HL,ILLIM ;NOTIFY USER OF IAÛþrNNNNNNNNNNNNNNNN¡¡¡þK3{NNNNNNNNNNNNNNNNNNNNNN¡¡¡û ON ENDM ;############################################################################ ; ; DISK DRIVER TABLES ; ;####\Œþ'NNNNNNNNNNNNNNNNNN¡¡¡þKܰNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûE RECORD ; ENTRY- #DADD= DRIVER ADDRESS ; #PD= PHYSICAL DRIVE # ; #FG= DRIVE FLAGS (IDFLGO) ; #S0= TRK 0 SPT ; #Z0= TRKÎ}þBNNNNNNNNNNNNNNNN¡¡¡þK#ú*NNNNNNNNNNNNNNNNNNNNNN¡¡¡û IF BOOT = 3 ALLDRV FD8EXEC,0,0,26,0,26,0,26,0 ALLDRV FD8EXEC,1,0,26,0,26,0,26,0 ALLDRV HDEXEC,4,60H,64,1,64,1,64,1 ALL�#þ NNNNNNNNNNNNNNNN¡¡¡þK)áNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTERS ; DB 0 ;FLAGS DB 26,0,26,0,26,0 ;SECTORS PER TRACK, SECTOR SIZE (128) ;#########################################Þ…þNNNNNNNNNNNNNNNN¡¡¡þK/¿GNNNNNNNNNNNNNNNNNNNNNN¡¡¡û######################################## ; ; MODE 2 INTERRUPT VECTOR TABLE ; ;##############################################¦òþINNNNNNNNNNNNNNNNNN¡¡¡þK9NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûRETURN RET NZ ; INC HL ;ELSE PRINT NEXT CHAR JR EDITOR IF INTRPTS SUBTTL INTERRUPTS ;---------------------------ÿLþBNNNNNNNNNNNNNNNN¡¡¡þK ìòNNNNNNNNNNNNNNNNNNNNNN¡¡¡û A,5FH ;IGNORE CASE ; CP A,'Y' JP Z,PAGE0 ; ; IF OPTION IS INTERRUPT THEN EXECUTE RESTART 7 ; CP A,'I' JR NZ,ITRAñ¯þBNNNNNNNNNNNNNNNN¡¡¡þKÌŽNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNT JR IQCONT SUBTTL INITIALIZED DATA ;############################################################################ ; ƒùþNNNNNNNNNNNNNNNNNN¡¡¡þK#ENNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û######################################################################## STRUCT 0 DVRADD DS 2 ;START ADDRESS OF DISK DRIVER PHþHNNNNNNNNNNNNNNNNN¡¡¡þK‰ãNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û 0 SIZE ; #S1= TRK 1 SPT ; #Z1= TRK 1 SIZE ; #SD= DATA TRKS SPT ; #ZD= DATA TRKS SIZE ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@~¿þNNNNNNNNNNNNNNNNN¡¡¡þK$c½NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûDRV HDEXEC,4,60H,64,1,64,1,64,1 ALLDRV HDEXEC,5,60H,64,1,64,1,64,1 ALLDRV HDEXEC,5,60H,64,1,64,1,64,1 ENDIF LIST ON bþNNNNNNNNNNNNNNNNN¡¡¡þK*@²NNNNNNNNNNNNNNNNNNNNNN¡¡¡û################################### ; ; DEFAULT 8" HARD DISK PARAMETER BLOCK ; ;############################################‰ÆþNNNNNNNNNNNNNNNNN¡¡¡þK0¬ NNNNNNNNNNNNNNNNNNNNNN¡¡¡û############################## ; ; START ON AN EVEN PAGE BOUNDARY ; IF $ AND 0FFH DS 100H - ($ AND 0FFH) ENDIF INTABÚ”þyNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNpNNNÿ€Ì�›‚hƒ6„…Ò…Ÿ†m‡;ˆ ‰×‰¤Šq‹?Œ�Ü�ªŽx�G�‘䑱’“M”•è•¶–„—Q˜™ì™ºš‡›Uœ"�ð�¾ž‹ŸY '¡ô¡Â¢�£^¤,¥ú¥È¦nNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þK­žNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûL: REPT 7 ;1ST 7 ARE UNSUPPORTED LIST OFF DW ILLINT LIST ON ENDM ; DW ITRAP ;INT 8 IS USER INTERRUPT ENDIF §þ¼NNNNNNNNNNNNNNNN¡¡¡þK8NNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûARAMETER HEADER AREA ; 1 PER DRIVE ; ;############################################################################ ; ;@@@@@âµþNNNNNNNNNNNNNNNNNNN¡¡¡þK èóNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûION BIT MAP PTR LIST OFF ENDM ; ; DEFINE THE DATA ; DD DL 1 REPT NDRVS LIST OFF ALLDPH 0123456789ABCDEF DD DL Dãþ NNNNNNNNNNNNNNNN¡¡¡þKÈ�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û###################################### DTPTR: DS 2 ;DRIVE TABLE PTR LOGRQ: DS 1 ;LOG ON REQUEST REG. DVRTPTR DS 2 ;DRIVE DRIV“kþ NNNNNNNNNNNNNNNN¡¡¡þK'DNNNNNNNNNNNNNNNNNNNNNN¡¡¡û1) >= STHD) AND ((DD - 1) <= NDHD) D#D(DD)ALL: DS 127 ;ALLOCATION BIT MAP FOR 8" HARD DRIVE #D(DD) ENDIF IF ((DD - 1) >­þÉNNNNNNNNNNNNNNNNN¡¡¡þK�âNNNNNNNNNNNNNNNNNNNNNN¡¡¡û2K= 4, 4K= 5, 8K= 6, 16K= 7 DPBBLM DS 1 ;BLM- BLOCK MASK ; 1K = 7, 2K= 15, 4K= 31, 8K= 63, 16K= 127 DPBEXM DS 1 ;EXM- EXTE[þ�NNNNNNNNNNNNNNNNN¡¡¡þK%g¼NNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ALLDPB: MACRO #D LIST ON D#D(DD)DPB: DS DPBSZ ;ALLOCATION FOR DRIVE ªþNNNNNNNNNNNNNNNN¡¡¡þK+D³NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þKøÍNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û ;############################################################################ ; ; MESSAGES ; ;##########################Ç þNNNNNNNNNNNNNNNNN¡¡¡þKNNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE A DISK PARAMETER TABLE MACRO ; ;@@@@@@@§aþ�NNNNNNNNNNNNNNNNN¡¡¡þK½ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûD + 1 LIST ON ENDM ; ; LAST OF INITIALIZED CODE READ FROM DISK ; BIOSND EQU $ SUBTTL UNINITIALIZED DATA AREA ;#èÙþ„NNNNNNNNNNNNNNNNN¡¡¡þKQNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûER TABLE BASE ADDRESS PTR DVRXADR DS 2 ;DRIVE DRIVER EXECUTION ADDRESS ROMSAV DS 1 ;ROM SWAP SAVE OF ORIGINAL ROM IF INTCPç’þÎNNNNNNNNNNNNNNNN¡¡¡þKrNNNNNNNNNNNNNNNNNNNNNN¡¡¡û= ST8FD) AND ((DD - 1) <= ND8FD) D#D(DD)ALL: DS 57 ;ALLOCATION BIT MAP FOR 8" DRIVE #D(DD) D#D(DD)CHK DS 32 ;DIRECTORY CHEC ÞþNNNNNNNNNNNNNNNN¡¡¡þK ˜INNNNNNNNNNNNNNNNNNNNNN¡¡¡ûNT MASK ; DSM < 256 : 1K= 0, 2K= 1, 4K= 3, 8K= 7, 16K= 15 ; DSM > 255 : 2K= 0, 4K= 1, 8K= 3, 16K= 7 DPBDSM DS 2 ;DSM- DðƒþNNNNNNNNNNNNNNNNN¡¡¡þK&2ïNNNNNNNNNNNNNNNNNNNNNN¡¡¡û#D(DD) LIST OFF ENDM ; ; RESERVE THE DATA SPACE ; DD DL 1 REPT NDRVS LIST OFF ALLDPB 0123456789ABCDEF DD DL DD …uþ“NNNNNNNNNNNNNNNNNN¡¡¡þK,Ý$NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þKËüNNNNNNNNNNNNNNNNNNNNNN¡¡¡û################################################## MSGLE: DM CR,LF,'LOAD ERROR' ; DSKEM: DB CR,LF,'Disk Error Status:' DM C‹°þNNNNNNNNNNNNNNNN¡¡¡þK $7NNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ALLDPH: MACRO #D LIST ON D#D(DD)DPH: ;DRIVE PARAMETEã£þ�NNNNNNNNNNNNNNNNN¡¡¡þKŽ‘NNNNNNNNNNNNNNNNNNNNNN¡¡¡û########################################################################### ; ; THE FOLLOWING DATA MUST RESIDE IN THIS ORDERÛ¤þNNNNNNNNNNNNNNNNNNN¡¡¡þKb)NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTS ; ; CLOCK BUFFER ; CLKBFR DS 13 ENDIF ;#######################################################################Ä þNNNNNNNNNNNNNNNNN¡¡¡þKA&NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûKSUMS STORAGE (1 BYTE PER SECTOR) ENDIF LIST OFF ENDM ; ; RESERVE THE DATA SPACE ; DD DL 1 REPT NDRVS LIST OFFú þ�NNNNNNNNNNNNNNNNN¡¡¡þK!«xNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûRIVE STORAGE SIZE (IN CLUSTERS) ; INT(((#_TRACKS - OFF) * SPT * BYTES PER SECTOR) / CLUSTER SIZE) -1 DPBDRM DS 2 ;DRM- DIRECÑÕþNNNNNNNNNNNNNNNN¡¡¡þK'ÞNNNNNNNNNNNNNNNNNNNNNN¡¡¡û+ 1 LIST ON ENDM IF (($ - 8000H) > 07800H) OR ($ < 8000H) CONMSG **** BIOS TOO BIG, USE MOVCPM & RE-ADJUST! **** äUþ„NNNNNNNNNNNNNNNNN¡¡¡þK-îNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þKRkNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR,LF,'CM DR TL TH SL SH FG AL AH AX ST S1 S2 S3 S4 S5',CR,LF DSKEB: DM CR,LF,'Abort, Ignore, Retry, (BDOS) - ' ; IF INTCPTˆòþ NNNNNNNNNNNNNNNN¡¡¡þK qdNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûR HEADER FOR DRIVE #D(DD) DW 0 ;;SECTOR TRAN TBL (OR 0 IF NO XLATE) DW 0 ;;SCRATCH AREA DW 0 ;;" DW 0 ;;" DW DIRBF�|þNNNNNNNNNNNNNNNN¡¡¡þK�ÜNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ; ;############################################################################ BTDRV: DS 1 ;DRIVE # BTTRK DS 2 ;TRACK # B“ZþòNNNNNNNNNNNNNNNNN¡¡¡þK7zNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡û##### ; ; DRIVE ALLOCATION AREAS ; ;############################################################################ ;@@@@@î þäNNNNNNNNNNNNNNNNN¡¡¡þKرNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡û ALLDAL 0123456789ABCDEF DD DL DD + 1 LIST ON ENDM ;################################################################*þÉNNNNNNNNNNNNNNNN¡¡¡þK"þ+NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTORY SIZE -1 DPBAL0 DS 2 ;AL0,1- DIRECTORY ALLOCATION ; 1 MSB PER DIRECTORY CLUSTER ALLOCATED DPBCKS DS 2 ;CKS- # DIRECTORr±þmNNNNNNNNNNNNNNNNN¡¡¡þK(àNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ENDIF END bþNNNNNNNNNNNNNNNN¡¡¡þK.»FNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þKaZNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûS ISCMSG: DM CR,LF,'ILL SYS CALL',CR,LF ENDIF IF INTRPTS ITMSG DM CR,LF,'User' ILLIM DM CR,LF,'Ill.' IQMSG DM ' Int.<ùþòNNNNNNNNNNNNNNNN¡¡¡þK BUNNNNNNNNNNNNNNNNNNNNNN¡¡¡û ;;DIRECTORY BUFFER PTR DW D#D(DD)DPB ;;DRIVE PARAMETER BLK PTR IF ((DD - 1) <= NDHD) AND ((DD - 1) >= STHD) DW 0 ;;NO,ÙþÉNNNNNNNNNNNNNNNNN¡¡¡þK®íNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûTSEC DS 2 ;SECTOR # BTFLG DS 1 ;RESERVED FOR FLAGS BTDMA DS 2 ;DMA ADDRESS BTDMAX DS 1 ;DMA EXTENDED ADDRESS ;##########•Wþ„NNNNNNNNNNNNNNNN¡¡¡þKKNNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; MACRO TO DEFINE THE DRIVE ALLOCATION & CHECKSUMS AÙ¶þòNNNNNNNNNNNNNNNNN¡¡¡þKë€NNNNNNNNNNNNNNNNNNNNNN¡¡¡û############ ; ; RESERVE DRIVE PARAMETER BLOCKS ; ;#######################################################################™ÇþrNNNNNNNNNNNNNNNN¡¡¡þK#ÍNNNNNNNNNNNNNNNNNNNNN!þ¡¡¡ûY SECTORS CHECKED ; (DRM +1) / 4 DPBOFF DS 2 ;OFF- # RESERVED TRACKS (USUALLY 2) DPBSZ DS 0 ENDM ; ; ;@@@@@@@@@@@@@@@�mþyNNNNNNNNNNNNNNNN¡¡¡þK)"ÑNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þK/ˆwNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þK4 NNNNNNNNNNNNNNNNNNNNNN¡¡¡û Abort? (Y/N/I/M) - ' ENDIF ;############################################################################ ; ; DRIVE PIÑþœNNNNNNNNNNNNNNNN¡¡¡þK ÛÂNNNNNNNNNNNNNNNNNNNNNN¡¡¡û CHECKS ON HARD DISK ELSE DW D#D(DD)CHK ;;DRIVE DISK CHECKSUMS ARRAY PTR ENDIF DW D#D(DD)ALL ;;DRIVE CLUSTER ALLOCAT¦zþ‰NNNNNNNNNNNNNNNN¡¡¡þKû¾NNNNNNNNNNNNNNNNNNNNNN¡¡¡û################################################################## ; ; VARIABLES ; ;######################################ìfþNNNNNNNNNNNNNNNNN¡¡¡þKuNNNNNNNNNNNNNNNNNNNNN!ð¡¡¡ûREA ; ;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ALLDAL: MACRO #D LIST ON IF ((DD - >îþ„NNNNNNNNNNNNNNNNN¡¡¡þK¾ÓNNNNNNNNNNNNNNNNNNNNNN¡¡¡û##### STRUCT 0 DPBSPT DS 2 ;SPT- SECTORS/TRACK DPBBSH DS 1 ;BSH- BLOCK SHIFT FACTOR DETERMINED BY CLUSTER SIZE ; 1K= 3, Œþ“NNNNNNNNNNNNNNNNN¡¡¡þK$T�NNNNNNNNNNNNNNNNNNNNNN¡¡¡û@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ; ; GENERATE THE DPB FOR DRIVE MACRO ; ;@@@@@@@@@@@@@@@@@@@@@@þNNNNNNNNNNNNNNNN¡¡¡þK*w‚NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þK0›:NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN8NNNNNNNN�Ñ�Ÿ‚mƒ;„ …×…¥†s‡Aˆ‰Ý‰«Šy‹GŒ�ã�±Ž�M�‘é‘·’…“S”!•–‹—Y˜'™õ™Ãš‘›_œ-�û�Éž—Ÿe 3¡¢Ï¢�£k¤9¥¦Õ¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL˃NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þLa%NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL ŽîNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL®’NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þLAYNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þLëÿNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL%¡NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL+"®NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þLžÐNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þLqNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þLÛ½NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL7NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL þTNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL&TòNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL,»9NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL­áNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL B*NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þLèŒNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL4NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL';NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL!ÍeNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL'gÃNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL-ˆNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL4vNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL yNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þLûÁNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þLQgNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL¾¬NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL"˜6NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL(wýNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL.Ý[NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þLGNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL $HNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þLÈðNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þLbVNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL��NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL#«NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL)DÌNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL/îjNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þLRNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL ½ßNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL�£NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þLrhNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þLØÎNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL$2�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL*ŸNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL0ý'NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN8NNNþ€Ì�š‚hƒ6„…Ò… †n‡<ˆ ‰Ø‰¦Št‹BŒ�Þ�¬Žz�H�‘䑲’€“N”•ꕸ–†—T˜"™ð™¾šŒ›Zœ(�ö�Äž’Ÿ` .¡ü¡Ê¢˜£f¤4¥¦Ð¦NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNÂÂÂüNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þLü³NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þLVNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL ¹ÞNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL™¢NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þLviNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þLÜÏNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL%6‘NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL+žNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL©àNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þLF+NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þLì�NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL5NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL#:NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL ÉdNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL&cÂNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL,Œ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þLšÑNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL uNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þLß¼NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL3NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL!úUNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL'PóNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL-¿8NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þLFNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL INNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þLÌñNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þLfWNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL‰œNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL"¯NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL(@ÍNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL.êkNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL0wNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL xNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þLÿÀNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þLUfNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þLº­NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL#œ7NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL)süNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL/ÙZNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þLe$NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL ŠïNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þLª“NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þLEXNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þLïþNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL$ NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL*&¯NNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNN¡¡¡þL0ÊNNNNNNNNNNNNNNNNNNNNNN¡¡¡ûååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååb§NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN