IMD 1.17: 10/06/2011 8:54:01 48k cp/m version 2.2 cbios version 2.9.20 for a disk jockey 2d/b @ f800 + fujitsu m20 multio console serial port 3 with cts protocol as lst: ssdd  ><<þÚÿÂ?ÿÖ!€”"ÿ2ÿOÍø!”"ÿDMÍø ÅÍ øÍøÁÒÿÂ-ÿÃ*ø!«" ÿÍ-ø¯2ÿ>2ÿ=2 ÿ!œ"ÿ!˜"ÿ!"ÿ! "+ÿÃÿÃ\˜ÃX˜ COPYRIGHT (C) 1979, DIGITAL RESEARCH •_ÃÅÍŒ•ÁÉ> Í’•> Ã’•> Ã’•Å͘•á~·È#åÍŒ•áì• Ã_ÃÍ2îœ<ÉÃÕ¯2íœÍœÃË•ÃÕÃÕÃÕÍœÃß•ÃÍ·ÉÃô•ÍœÃù•Ãô•ÃÕÃÿ ÃÍ–‡‡‡‡!2É:ïœ2ÉþaØþ{Ðæ_É:«œ·Ê––:>Ľ•¬œÍ˕ʖ–:»œ=2Ìœ¬œÍù•––•!€€ÍB™!ºœ6#5¬œÍÚ•Ê––:Ľ•!•ͬ•Í–ʧ–Íݖ˜ÍÝ–Í– •ÍÍ)–!•F#x·Êº–~Í0–wë–w!•"ˆ•É Í·ÈÍ·ÉÀÃ!«œ~·È6¯Í½•¬œÍï•:ïœÃ½•(˜!�¾ÂϘ#Âý–É͘•*Š•~þ Ê"—·Ê"—åÍŒ•á#×>?ÍŒ•͘•Íݖ˜·Èþ Ú —Èþ=Èþ_Èþ.Èþ:Èþ;Èþ<Èþ>ÈÉ·Èþ ÀÃO—…oÐ$É>!ÍœÍY—åå¯2ðœ*ˆ•ëÍO—ë"Š•ëá·Ê‰—Þ@Gþ:Ê�—:ïœwÖ—x2ðœpÍ0—ʹ—#þ*©—6?ë—w˜—Í0—ÊÀ—ï—#6 ¹—þ.Âé—Í0—Êé—#þ*ÂÙ—6?ÃÛ—wÂÈ—Í0—Êð—Ãß—#6 Âé—#6Âò—ë"ˆ•á #~þ? ˜ ˜x·ÉDIR ERA TYPESAVEREN USER"!˜yþÐΜ¾ÂO˜#Â<˜þ ÂT˜yÉ#ÂO˜ Ã3˜¯2•1«œÅyæ_Í–͸•2«œÁyæ2ïœÍ½•:•·Â˜˜1«œÍ˜•ÍЖÆAÍŒ•>>ÍŒ•Í9–€ÍØ–ÍЖ2ïœÍ^—Ä —:ðœ·Â¥›Í.˜!Á˜_~#foéw™š]š­š›Ž›¥›!óv"•!•éߘç•READ ERRORð˜Ã§•NO FILEÍ^—:ðœ·Â —!Μ ~þ Ê3™#Ö0þ Ò —Wxæà —x€Ú —€Ú —‚Ú —G ™É~þ  —# Â3™xÉ~#ÂB™É!€�ÍY—~ɯ2Íœ:ðœ·È=!Èý•:ðœ·È=!È:ïœÃ½•Í^—ÍT™!Μ~þ Â�™ 6?#ˆ™ÕÍé•Ìê˜Êš:îœæ`O> ÍK™ÚšÑ{ÕæõÂ̙͘•ÅÍЖÁÆAÍ’•>:Í’•Ãԙ͢•>:Í’•Í¢•xÍK™æþ Âù™ñõþÂ÷™> ÍK™æþ Êš> Í’•xþ Òšþ Âٙ͢•ÃÙ™ñ͖šÍ䕨™ÑÆœÍ^—þ ÂBšRšÍ§•Í9–!•5‚˜#~þY‚˜#"ˆ•ÍT™ÍœÍï•<Ìê˜Ã†œALL (Y/N)?Í^— —ÍT™ÍЕʧšÍ˜•!ñœ6ÿ!ñœ~þ€Ú‡šåÍþ•á š¯w4!€ÍY—~þʆœÍŒ•Í–†œÃtš=ʆœÍÙ˜Íf™Ã —Íø˜õÍ^— —ÍT™ÍœÕÍï•ÑÍ –Êûš¯2íœño&)|µÊñš+å!€åÍØ–͖͜ÑáÂûšÃԚ͜ÍÚ•<››Í§•ÍՖÆœNO SPACEÍ^— —:ðœõÍT™Íé•Ây›!͜ݜÍB™*ˆ•ëÍO—þ=Ê?›þ_Âs›ë#"ˆ•Í^—Âs›ñG!ðœ~·ÊY›¸pÂs›p¯2ÍœÍé•Êm›ÍœÍ–ÆœÍê˜Ã†œÍf™Ã —‚›Í§•ÆœFILE EXISTSÍø˜þÒ —_:Μþ Ê —Í–ÉœÍõ–:Μþ ÂÄ›:ðœ·Ê‰œ=2ïœÍ)–ͽ•ɜ֜þ  —ÕÍT™Ñ!ƒœÍ@™ÍЕÊkœ!åëÍØ–ÍœÍù•œပ}“|šÒqœÃá›á=ÂqœÍf™Í^—!ðœå~2Íœ>Í`—á~2Ýœ¯2íœ\!Íœ!ÍB™!•~·Ê>œþ Ê>œ#Ã0œ�~·ÊOœ#ÃCœx2€Í˜•ÍÕ–Í–Í1«œÍ)–ͽ•˜Íf™Ã —zœÍ§•ÆœBAD LOADCOMÍf™Í^—:ÎœÖ !ðœ¶Â —˜$$$ SUB"Ã�™�¥�«�±�ë"C ë{2Öª!"E 9" 1A ¯2àª2Þª!tªåyþ)ÐK!G�_^#V*C ëé«ÈŸ�žÎŸ««ÔŸíŸóŸøŸážþŸ~©ƒ©E©œ©¥©«©È©×©à©æ©ì©õ©þ©ª ªª,¢ªª&ª-ªAªGªMª©Sª  ›ª!Ê�Íå�þÊÉ!Õ�ô�!á�ô�!Ü�Íå�ÃBdos Err On : $Bad Sector$Select$File R/O$åÍÉž:B ÆA2Æ�º�ÍÓžÁÍÓž! ~6·Àà «Íû�ÍžØõOÍ�žñÉþ Èþ Èþ ÈþÈþ É: ·ÂEžÍ«æÈÍ «þÂBžÍ «þʯÉ2 >É:  ·ÂbžÅÍ#žÁÅÍ «ÁÅ:  ·Ä«Áy!  þÈ4þ Ð5~·ÈyþÂyž5Éþ À6ÉyÍžÒ�žõ^ÍHžñö@Oyþ ÂHž ÍHž:  æ–žÉͬž Í «à «#ÍHžÍÉž:  !  ¾Ð ÍHžÃ¹ž ÍHž ÃHž þ$ÈÅOÍ�žÁÃÓž:  2  *C N#åÅåÍû�æáÁþ ÊÁŸþ ÊÁŸþŸx·Êïž:  2  ÃpŸþÂ&Ÿx·Êïž~+éŸþÂ7ŸÅåÍÉž¯2  ÃñžþÂHŸå!  >–wáÃïžþÂ_Ÿá:  !  ¾Òáž5ͤžÃNŸþÂkŸÍ±žáÃážþ¦ŸÅͱžÁáåÅx·ÊŠŸ#NÅåÍžáÁÃxŸå:  ·Êñž!  –2  Í¤ž!  5™ŸÃñž#wÅåOÍžáÁ~þx½ŸþʹÚïžáp ÃHžÍžÃ Í«Ã y<ÊàŸ<ʫà «Í«·Ê‘ªÍ «Ã :à!qÉëMDÃÓžÍ#ž2E É>à! �^#Vëé Èw#ÃP :B OÍ«|µÈ^#V#"³ª##"µª##"·ª##ë"Ъ!¹ªÍO *»ªë!ÁªÍO *ƪ|!ݪ6ÿ·Ê� 6>ÿ·ÉÍ«¯*µªw#w*·ªw#wÉÍ'«Ã» Í*«·È! �ÃJ *êªÍê¡"åª"ìª!åªN#F*·ª^#V*µª~#foy“xšÒú å*Áª{•_zœWá+Ãä å*ÁªÚ¡y•xœÚ¡ëá#Ãú áÅÕåë*ΪDMÍ«Ñ*µªs#rÑ*·ªs#rÁy“OxšG*ЪëÍ0«MDÃ!«!êN:㪷 ÂE¡G>–O:⪠Ê\¡·ÃS¡€É*C  :ݪ·Êq¡n&É ^#VëÉÍ>¡OÍ^¡"åªÉ*åª}´É:ê*åª)=Â�¡"çª:ĪO:㪡µo"åªÉ*C  É*C ë!ÉÍ®¡~2ãªë~2áªÍ¦¡:Ū¦2âªÉÍ®¡:ÕªþÂÞ¡¯O:ãª�wë:áªwÉ È|·g}oÃë¡€*¹ª¯†# Âý¡É È)âÅ:B O!Í¢Áyµox´gÉ*­ª:B OÍê¡}æÉ!­ªN#FÍ ¢"­ª*Ȫ#ë*³ªs#rÉÍ^¢ ~Ð!�ÃJ Í¢È! �ÃJ *¹ª:骅oÐ$É*C ~ÉÍi¢6ÉÍi¢ö€wÉ*êªë*³ª{–#zžÉÍ¢Ør+sÉ{•ozœgÉÿ*ìªë*̪͕¢ÐÅÍ÷¡*½ªë*ìªÁ ÊÄ¢¾ÈÍ¢ÐÍ,¢ÉwÉÍœ¢Íà¢͸ ÃÚ¢Íà¢Í² !±ªÃã¢!¹ªN#FÃ$«*¹ªë*±ª€ÃO !êª~#¾À<É!ÿÿ"êªÉ*Ȫë*êª#"êªÍ•¢Ò£Ãþ¢:êªæ‡ £2骷ÀÅÍàÍÔ¢ÁÞ¢yæ<_WyæOx‡‡‡‡‡±OxæG*¿ª ~ÂV£ÉÕÍ5£æþÁ±Âd£wÉÍ^¢ÅÑ ÈÕ:ݪ·Êˆ£ÅåNÃŽ£ ÅN#Fåy°Ê�£*ƪ}‘|˜Ô\£á#ÁÃu£*ƪÍê¡#DM*¿ª6# x±Â±£*ʪë*¿ªs#rÍ¡ *³ª6#6Íþ¢ÿÍ£Íõ¢ÈÍ^¢>å¾ÊÒ£:A ¾Âö£#~Ö$Âö£=2E Ík£ÍŒ¢ÃÒ£:ԪàÅõ:Ū/Gy Oñ ‘æÁÉ>ÿ2Ôª!تq*C "ÙªÍþ¢Í¡ Í£Íõ¢Ê”¤*ÙªëþåÊJ¤ÕÍ¢ÑÒ”¤Í^¢:تOy·Êƒ¤þ?Ê|¤xþ Ê|¤þ Ês¤–æÂ-¤Ã|¤ÅNͤÁÂ-¤# ÃS¤:êªæ2E !Ôª~ЯwÉÍþ¢>ÿàÍT¢ ͤÍõ¢ÈÍD¢Í^¢6åÍk£ÍÆ¢Í-¤Ã¤¤PYy°ÊѤ ÕÅÍ5£Òì¤ÁÑ*ƪ{•zœÒô¤ÅÕBKÍ5£Òì¤ÑÁÃÀ¤<Íd£áÑÉy°ÂÀ¤!É Õ*C  ëÍ^¢ÁÍO ÍÃ ÃÆ¢ÍT¢ ͤ*C ~wÍõ¢ÈÍD¢ Í¥Í-¤Ã'¥ ͤÍõ¢È Í¥Í-¤Ã@¥Í¤Íõ¢Èͦ¡~õåÍ^¢ë*C  ÕÍO Íx¢Ñ! N!Fáñwy¾xÊ‹¥>Ú‹¥>€*C wÉ~#¶+Àw#w+ɯ2E 2êª2ëªÍ¢ÀÍi¢æ€ÀͤÍõ¢ÈÍ^¢ ë*C  :ݪ·Êè¥~·ÂÛ¥w·Âá¥~¾Â¦Ãý¥Í”¥ëÍ”¥ë¾Â¦#¾Â¦ # ÂÍ¥ìÿ ë ¾Ú¦w ë ~>ÿ2Ҫå!E 5ÉÍT¢*C å!¬ª"C Í¤Íõ¢á"C Èë!¯w# ÂF¦! wÍŒ¢Íý¤Ãx¢¯2Ҫ͢¥Íõ¢È*C  ~<æwʃ¦G:Ū !Òª¦ÊŽ¦Ã¬¦ 4~æʶ¦Í¤Íõ¢Â¬¦:Óª<ʶ¦Í$¦Íõ¢Ê¶¦Ã¯¦ÍZ¥Í»¡¯Ã Í Ãx¢>2Õª>ÿ2Ӫͻ¡:ãª!áª¾Úæ¦þ€Âû¦ÍZ¦¯2ãª:E ·Âû¦Íw¡Í„¡Êû¦ÍŠ¡ÍѠͲ Ãҡà>2Õª>2ÓªÍT¢*C ÍG¢Í»¡:ãªþ€Ò Íw¡Í„¡Ân§Í>¡2ת·Ê;§O Í^¡DM;¤}´ÂH§>à"åªë*C  :ݪ·:תÊd§Íd¢sÃl§O s#r:E ·ÀÅÍŠ¡:Õª==»§ÁÅy==»§å*¹ªWw#òŒ§Íà¢*çª"åªÅÍÑ Á͸ *åª:ĪG¥¸#š§á"åªÍÚ¢ÍÑ ÁÅ͸ Á:ãª!᪾ÚÒ§w4!õÍi¢æwñþ¨:Õªþ¨ÍÒ¡ÍZ¦!E ~·Âþ§=2ãª6ÃÒ¡¯2ÕªÅ*C ë!!~æõ~#~æO~æGñ#n,-.‹¨! w! y–ÂG¨!x–æÊ¨ÅÕÍ¢¥ÑÁ.:E <Ê„¨! q!pÍQ¥:E <¨ÁÅ. Ê„¨Í$¦.:E <Ê„¨Á¯Ã åÍi¢6ÀáÁ}2E Ãx¢ÿͨÌÁ¦Ȩ́ͨÉëN! ~æ€�O>ˆG~æ€G!~‡‡‡‡õ€Gõá}áµæÉ Í¤*C !år#r#rÍõ¢Ê ©Í^¢Í¥¨áå_y–#xž#{žÚ©s+p+qÍ-¤Ãä¨áÉ*C  Í¥¨!!q#p#wÉ*¯ª:B OÍê¡åëÍY áÌG }Ø*¯ªMDÍ ¢"¯ªÃ££:Öª!B ¾ÈwÃ!©>ÿ2Þª*C ~æ=2ÖªþÒu©:B 2ߪ~2àªæàwÍE©:A *C ¶wÉ>"à!"­ª"¯ª¯2B !€"±ªÍÚ¢Ã!©Ír¢ÍQ©ÃQ¥ÍQ©Ã¢¥ë~þ?Ê©ͦ¡~þ?Är¢ÍQ©Í¤Ãé¢*Ùª"C ÍQ©Í-¤Ãé¢ÍQ©Íœ¤Ã¤ÍQ©Ã¼¦ÍQ©Ãþ¦Ír¢ÍQ©Ã$¦ÍQ©Í¥Ã¤*¯ªÃ)ª:B Ã ë"±ªÃÚ¢*¿ªÃ)ª*­ªÃ)ªÍQ©Í;¥Ã¤*»ª"E É:ÖªþÿÂ;ª:A Ã æ2A ÉÍQ©Ã“¨ÍQ©Ãœ¨ÍQ©ÃÒ¨*C }/_|/*¯ª¤W}£_*­ªë"¯ª}£o|¢g"­ªÉ:Þª·Ê‘ª*C 6:ષʑªw:ߪ2ÖªÍE©* ù*E }DÉÍQ©>2ժ̧ͨÉå€Ã³Ãþ«Ãf«Ã;«ÃT«Ãu«Ã¢«Ã¥«ÃÁ¬Ã­Ãìõ¬Ã»¬Ãî­Ãç­ÃŽ«ÃȬÃø Ía®ÃA«::«öÓOÛMæÊH«ÛHæÉ::«öÓOÛMæ Ê[«yÓHÉ::«öÓOÛMæÈ>ÿÉ::«öÓOÛMæ Ê|«ÛNæÊ|«yÓHÉ::«öÓOÛMæHÈÛNæÈ>ÿÉà «Ã «!€Í»¬>Ã22!«"!�"¯2n¶2b®:O:ú«·ü«>ÊÞ«ý«>!•2•GÍ*¯:ú«·:û«Êó«Ú•Õ1>2ú«ÍøÍ øÚ ¬Í0ø>2"¬!”"=¬><<þÚ5¬Â`¬Ö!€”"=¬2"¬OÍø!”"=¬DMÍø ÅÍ øÍøÁÒ!¬ÂN¬Ã*øÍ ø  Í–¬¤ Í–¬¨!¤~# x±Â€¬¤ Í–¬Ã¨«ÕÍøÁÍøÅÍøÚ¬¬Í'øæ Ö ÁО¬Ã*ø`i"f¶É`i"B®Éy2i¶É:h¶þÒÿ¬ÕÅÍÆ­~·‘õúç¬ñÁÑë n&É ~æÊÞ¬ñÁ/€´gÉ`i#Éy2h¶þÒ·­{æž­:h¶þÒo­!"j¶>2i¶Íô®Ú·­Í'øæ õ!ß­_åÍÆ­ëÑÍ*¯å*ø#~îo&û~æF±Â_­†±ëÑñO ës#rÞ­Öͽ­y2s°Ía°~<ž­öüÓR>ÓPï!+|µÌ»­ÈÛPæ Â�­ÍP¯ÍÆ­ ~æ2ó­~æ21®ëÉ!É ÉÖØ ÿ­:h¶o&))))ö±å ~#foÑÉx°“°È°±y2Y®>¯2E®*f¶|æ€O|æg+Ê®·|g}oî#|±g"j¶!h¶l¶Ê,®¾#Ê®Íô®Ø:f¶=æo&)))))))f²ë!>§ÂO®Í(¯¯ÉëÍ(¯>2b®>=>2Y®À>§È!øã¯Í7¯ó¯2b®"Õ® Å:l¶þÚƒ®ÖO!3«?¯Í3¯:m¶§OÅ! øP¯Ì3¯Á! ø^¯Í3¯*n¶|æO!0ø‡¯Í3¯*n¶|æGM!ø�¯Í3¯f²!ø‚¯Í3¯ÍÁ>Ð7>ÿÈxþÂx®Å! øP¯Ì3¯ÁÃx®Ía®Øh¶!l¶Í*¯:E®§Ê¯:Y®==ÈÍÆ­~æ=È!ø®¯Í7¯Ãn®€w#Â*¯ÉÍ7¯é:l¶þØëÉyͽ­y2s°öüÓR>ÓPÉÍa°6ÛPæȯÃo¯Ía°^q{‘È?Úl¯/<Ão¯GÍl°æûÓRöÓRÂs¯Ãˆ¯`i"ȯÉÛPæʈ¯ÉyÍ¥¯Æ§Ì¡¯2Q°y2m°> ÉÖØ ç¯Í,°Ø¯ÓQ/ÓSÓS>ÓQͰدÓQ€!ÛSÛSÛSw#ÛSw#ÛSw#ÛSw#ÂίÉÍ,°Ø¯ÓQ*ȯ€~ÓS#~ÓS#~ÓS#~ÓS#Âï¯>ÓQͰØ> 7ȯÉÛPGæÊ°>ÓPÛPæ7ÀÛQæ7À¯ÉÛPæ 7À>ÓQÍl°ö ÓR:m°ÓSÍa°~ÓS§€ÊP°>ÓSxÓS>ÓP>ÓP¯É*s°ë!w°É>öîðÉÿ     %&'()*+, -. /0  12!"34#$!"#$1234%&'(5678 )*+,9:;<  -./0 12345678 !"#$%&'(9:;<=>?@)*+,-./0ò?À4òÀ <À 3@+À t4òÀ  hæÿð@x1ÿð@;€Wÿð@| ßÿÿÿ3 ßÿÿÿb3 ÿÿÿÃ3p¶;·ð¶p¶Æ·{·p¶Q¸¸p¶Ü¸‘¸p¶Æ±º¹p¶Ö±»ºp¶æ±•»»€ Morrow Designs 48K CP/M 2.2, Cbios rev 2.9.20 For a Disk Jockey 2D/B and a Fujitsu M20 hard disk. Multi I/O as console, CTS protocol serial printer as LST: ~#·ÈåOÍ «áó1¯2ú«2:«!üø3Í*¯>2ÍQ³Í¼³!f²Í³¯2h¶2!«"«Ã¨«::«öÓOÛHÛH¯ÓMÓI Y€À`@:0  >‡ÓKÛH_ÛIW>ÓK!a³{¾Â ³#z¾Ê¸³+## ”³*6«ë>‡ÓKzÓI{ÓH>ÓK¯ÓMÉ::«öÓO>€ÓK*8«|ÓI}ÓH>ÓKÛH¯ÓIÉÿåååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååMOVCPM COMhABOOT& ASM] ASM COM@BAD COM€hijklmBAUD COM!BAUD DOCBIOS ASM\BOOTHD ASMBOOTHD COM CBIOS& ASM€!"#$%&'(CBIOS& ASM€)*+,-./0CBIOS& ASM€12345678CBIOS& ASM€9:;<=>?@CBIOS& ASM€ABCDEFGHCBIOS& ASM^IJKLMNCBIOS ASMEOPQRSDDT COM&TUVDEBLOCK ASMOWXYZ[DISKDEF LIB1\]^_DUMP ASM!`abDUMP COMcED COM4defgBAD COMEnopq„BAD DOC%…†‡FORMATHDASM€rstuvwxyFORMATHDASMcz{|}~€FORMATHDCOM%�‚ƒVITALS BADˆFORMT# ASMPŒ�Ž��FORMT# COM ‘MBASIC COM€‰Š‹’“”•–MBASIC COM>—˜™šå1þýÍ(ü!w# Âü!þ".üÍ(üÃÅy2¬ü!þ".üÍAüÁÈ Ã(ü ÅÍQüÁÐÂDüÃNü͘üØ>ÓQÍ~üدÓQ€*.üÛSÛSÛSw#ÛSw#ÛSw#ÛSw#ÂiüÉÛPGæÊ~ü>ÓPÛPæ7ÀÛQæ7À¯ÉÛPæ 7À>ÓQ>üÓR¯ÓSÓS>ÓS>€ÓS>ÓP>ÓPÉüÃ\ÃX COPYRIGHT (C) 1979, DIGITAL RESEARCH _ÃÅÍŒÁÉ> Í’> Ã’> Ã’Å͘á~·È#åÍŒáì Ã_ÃÍ2î<ÉÃï2íÍÃËÃÃÃÃÃÃÍÃßÃÍ·ÉÃôÍÃùÃôÃÃÃÿ Ã͇‡‡‡!ï¶2É:ï2ÉþaØþ{Ðæ_É:«·Ê–:ï·>Ľ¬ÍËÊ–:»=2̬Íù–!€€ÍB!º6#5¬ÍÚÊ–:ï·Ä½!ͬÍÂʧÍÝÂÍÝÍ ÍÍ)!F#x·Êº~Í0wëw!"ˆÉ Í·ÈÍ·ÉÀÃ!«~·È6¯Í½¬Íï:ïý(!¾ÂHDFIRM ASM;›œ�žHTYP ASM€Ÿ ¡¢£¤¥¦HTYP ASMz§¨©ª«¬­®HTYP PRL¯°LOAD COM±INSTALL COM:²³´µINSTALL DOC#¶·¸MAKEPRL COM€¹º»¼½¾¿ÀMAKEPRL COM?ÁÂÃÄMAKEPRL DOCÅÆåMBASIC COM€ÇÈÉÊËÌÍÎåMBASIC COM>ÏÐÑÒNOTESHD DOCtÓÔÕÖרÙÚPIP COM:ÛÜÝÞPRL DOC ßåPUTBAD COM€àáâãäåæçåPUTBAD COM,èéêREGEN ASM|ëìíîïðñòREGEN COMóSINGLE ASMZôõö÷øùSINGLE COMúSTAT COM)ûüýSUBMIT COM þSYSGEN COM ÿXSUB COMååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååÃ,Copyright (C) Digital Research, 1979 1]þ Ê‘þ?Ê‘!þ Ê_·Ê_Ö0þ Òr)å))Á O Ã@|·Âr}þÚr.g))Ã¥{Ísà Invalid memory size$!$Ê¡~/w¾/wÊ”|æügå*"xáå|æ?¸>@G!‹>0w#w!Œ4~þ:ÚÏ60+4ÂÁ|Ís!N#FÅ! �x±Ê, Å å¾Â# Ê Ãð¯=Â!óv"x!u6͘!ëÃsá#ÁÃãáÁ+Œw+wx þ>Âj*x¾# Â@ÁáÅxÆG}‘o|˜g"zë! ÁÅ:mþ Ês À!ÿ"Ãx±Ê€ ~#ÃsÁå*zë!:mþ Ê• x±ÊÑõ Synchronization error$ {æÂÁã~#ão}oÒÍ„ÃÍÕÑ:mþ Êk€! ~·Â#Âßë*€ÿ DM! x±Ê w#ÃöÃ!N#F! D!]>0w#wÊ/!^4~þ:Ú60+4Ã*‹"c>Ísà Ready for "sysgen" or "save 00 cpm00.com"$*zé à Constructing 00K CP/M 2.2$Ï#ÂýÉ͘*Š~þ Ê"·Ê"åÍŒá#Ã>?͌͘ÍÝ·Èþ Ú Èþ=Èþ_Èþ.Èþ:Èþ;Èþ<Èþ>ÈÉ·Èþ ÀÃO…oÐ$É>!ÍÍYåå¯2ð*ˆëÍOë"Šëá·Ê‰Þ@Gþ:Ê�:ïwÖx2ðpÍ0ʹ#þ*©6?ëw˜Í0ÊÀï#6 ¹þ.ÂéÍ0Êé#þ*ÂÙ6?ÃÛwÂÈÍ0ÊðÃß#6 Âé#6Âòë"ˆá #~þ?  Âx·ÉDIR ERA TYPESAVEREN USER"!yþÐξÂO#Â<þ ÂTyÉ#ÂO Ã3¯21«Åyæ_Í͸2«Áyæ2ïͽ:·Â˜1«͘ÍÐÆAÍŒ>>ÍŒÍ9€ÍØÍÐ2ïÍ^Ä :ð·Â¥Í.!Á_~#foéw]­Ž¥!óv"!éßçREAD ERRORðçNO FILEÍ^:ð·Â !Î ~þ Ê3#Ö0þ Ò Wxæà x€Ú €Ú ‚Ú G ÂÉ~þ  # Â3xÉ~#ÂBÉ!€�ÍY~ɯ2Í:ð·È=!ï¾Èý:ð·È=!ï¾È:ïýÍ^ÍT!Î~þ Â� 6?#ˆÕÍéÌêÊ:îæ`O> ÍKÚÑ{ÕæõÂÌ͘ÅÍÐÁÆAÍ’>:Í’ÃÔÍ¢>:Í’Í¢xÍKæþ ÂùñõþÂ÷> ÍKæþ Ê> Í’xþ Òþ ÂÙÍ¢ÃÙñÍÂÂÍäØÑÆÍ^þ ÂBRͧÍ9!5‚#~þY‚#"ˆÍTÍÍï<ÌêÆALL (Y/N)?Í^ ÍTÍÐʧ͘!ñ6ÿ!ñ~þ€Ú‡åÍþá ¯w4!€ÍY~þʆ͌͆Ãt=ʆÍÙÍfà ÍøõÍ^ ÍTÍÕÍïÑÍ Êû¯2íño&)|µÊñ+å!€åÍØÍÍÑáÂûÃÔÍÍÚ<Âͧåú'>úͦÉÍÉÍÉ!«q:«æ_ÍÉ Í ÍÉ!­p+qÍ.*¬ë ÍÉ ÍÉ ÍÉ!¯q*¯&ëÍÉ!±p+q*°ëÍ2®É!³p+q*²ëÍ2®É!µp+q*´ëÍ2®ÉÍ2®É!·p+q*¶ëÍÉ!¹p+q*¸ëÍÉ!»p+q*ºëÍÉ!½p+q*¼ëÍ2®É!¿p+q*¾ëÍÕÆNO SPACEÍ^ :ðõÍTÍéÂy!ÍÝÍB*ˆëÍOþ=Ê?þ_Âsë#"ˆÍ^ÂsñG!ð~·ÊY¸pÂsp¯2ÍÍéÊmÍÍÆÍêÆÍfà ‚ͧÆFILE EXISTSÍøþÒ _:Îþ Ê ÍÉÍõ:Îþ ÂÄ:ð·Ê‰=2ïÍ)ͽÉÖþ  ÕÍTÑ!ƒÍ@ÍÐÊk!åëÍØÍÍùÂá€}“|šÒqÃáá=ÂqÍfÍ^!ðå~2Í>Í`á~2ݯ2í\!Í!ÍB!~·Ê>þ Ê>#Ã0�~·ÊO#ÃCx2€Í˜ÍÕÍÍ1«Í)ͽÂÍfà zͧÆBAD LOADCOMÍfÍ^:ÎÖ !ð¶Â Â$$$ SUB"Ù¥«±ë"C ë{2Ö!"E 9" 1A ¯2à2Þ!tåyþ)ÐK!G_^#V*C ëéÈ � Î Ô í ó ø á þ ~ƒEœ¥«È×àæìõþ , &-AGMS  ›!ÊÍåþÊÉ!Õô!áô!ÜÍåÃBdos Err On : $Bad Sector$Select$File R/O$åÍÉ :B ÆA2ƺÍÓ ÁÍÓ ! ~6·Àà ÍûÍ ØõOÍ� ñÉþ Èþ Èþ ÈþÈþ É: ·ÂE ÍæÈÍ þÂB Í þʯÉ2 >É: ·Âb ÅÍ# ÁÅÍ ÁÅ: ·ÄÁy! þÈ4þ Ð5~·ÈyþÂy 5Éþ À6ÉyÍ Ò� õ^ÍH ñö@Oyþ ÂH  ÍH : æ– Éͬ  Í à #ÍH ÍÉ : ! ¾Ð ÍH ù  ÍH  ÃH þ$ÈÅOÍ� ÁÃÓ : 2 *C N#åÅåÍûæáÁþ ÊÁ þ Ê2Õ>2ÓÍT *C ÍG Í» :ãþ€Ò Íw Í„ ÂnÍ> 2×·Ê;O Í^ DM;}´ÂH>à "åë*C  :Ý·:×ÊdÍd sÃlO s#r:E ·ÀÅÍŠ :Õ==»ÁÅy==»å*¹Ww#òŒÍà *ç"åÅÍÑ Á͸ *å:ÄG¥¸#šá"åÍÚ ÍÑ ÁÅ͸ Á:ã!á¾ÚÒw4!õÍi æwñþÂ:ÕþÂÍÒ ÍZ!E ~·Âþ=2ã6ÃÒ ¯2ÕÅ*C ë!!~æõ~#~æO~æGñ#n,-.‹! w! y–ÂG!x–æÊÅÕÍ¢ÑÁ.:E <Ê„! q!pÍQ:E <ÂÁÅ. Ê„Í$.:E <Ê„Á¯Ã åÍi 6ÀáÁ}2E Ãx ÿÍÌÁÉÍÌÉëN! ~æ€�O>ˆG~æ€G!~‡‡‡‡õ€Gõá}áµæÉ Í*C !år#r#rÍõ Ê Í^ Í¥áå_y–#xž#{žÚs+p+qÍ-ÃäáÉ*C  Í¥!!q#p#wÉ*¯:B OÍê åëÍY áÌG }Ø*¯MDÍ "¯ã:Ö!B ¾ÈwÃ!>ÿ2Þ*C ~æ=2ÖþÒu:B 2ß~2àæàwÍE:A *C ¶wÉ>"à !"­"¯¯2B !€"±ÍÚ Ã!Ír ÍQÃQÍQâë~þ?ÊÂͦ ~þ?Är ÍQÍÃé *Ù"C ÍQÍ-Ãé ÍQÍœÃÍQüÍQÃþÍr ÍQÃ$ÍQÍÃ*¯Ã):B à ë"±ÃÚ *¿Ã)*­Ã)ÍQÍ;Ã*»"E É:ÖþÿÂ;:A à æ2A ÉÍQÓÍQÜÍQÃÒ*C }/_|/*¯¤W}£_*­ë"¯}£o|¢g"­É:Þ·Ê‘*C 6:à·Ê‘w:ß2ÖÍE* ù*E }DÉÍQ>2ÕÍÌÉå€!üø3Í>2Í0Í›!BÍê¯2D!22¦!"è::öÓOÛHÛH¯ÓMÓI Y€À`@:0  >‡ÓKÛH_ÛIW>ÓK!@{¾Â#z¾Ê—+## Âs*6ë>‡ÓKzÓI{ÓH>ÓK¯ÓMÉ::öÓO>€ÓK*8|ÓI}ÓH>ÓKÛH¯ÓIÉÿÁ þ x·Êï : 2 Ãp þÂ& x·Êï ~+é þÂ7 ÅåÍÉ ¯2 Ãñ þÂH å! >–wáÃï þÂ_ á: ! ¾Òá 5ͤ ÃN þÂk ͱ áÃá þ¦ Åͱ ÁáåÅx·ÊŠ #NÅåÍ áÁÃx å: ·Êñ ! –2 ͤ ! 5™ Ãñ #wÅåOÍ áÁ~þx½ þʹÚï áp ÃH Í Ã Íà y<Êà <Êà Í·Ê‘Í Ã :à !qÉëMDÃÓ Í# 2E É>à ! ^#Vëé Èw#ÃP :B OÍ|µÈ^#V#"³##"µ##"·##ë"Ð!¹ÍO *»ë!ÁÍO *Æ|!Ý6ÿ·Ê� 6>ÿ·Éͯ*µw#w*·w#wÉÍ'û Í*·È! ÃJ *êÍê "å"ì!åN#F*·^#V*µ~#foy“xšÒú å*Á{•_zœWá+Ãä å*ÁÚ y•xœÚ ëá#Ãú áÅÕåë*ÎDMÍÑ*µs#rÑ*·s#rÁy“OxšG*ÐëÍ0MDÃ!!ÃN:ã· ÂE G>–O:â Ê\ ·ÃS €É*C  :Ý·Êq n&É ^#VëÉÍ> OÍ^ "åÉ*å}´É:Ã*å)=Â� "ç:ÄO:㡵o"åÉ*C  É*C ë!ÉÍ® ~2ãë~2áͦ :Ŧ2âÉÍ® :ÕþÂÞ ¯O:ã�wë:áwÉ È|·g}oÃë €*¹¯†# Âý É È)à Å:B O!Í Áyµox´gÉ*­:B OÍê }æÉ!­N#FÍ "­*È#ë*³s#rÉÍ^  ~Ð!ÃJ Í È! ÃJ *¹:é…oÐ$É*C ~ÉÍi 6ÉÍi ö€wÉ*êë*³{–#zžÉÍ Ør+sÉ{•ozœgÉÿ*ìë*ÌÍ• ÐÅÍ÷ *½ë*ìÁ ÊÄ ¾ÈÍ ÐÍ, ÉwÉÍœ Íà ͸ ÃÚ Íà Ͳ !±Ãã !¹N#FÃ$*¹ë*±€ÃO !ê~#¾À<É!ÿÃ÷ÃþÃfÃ;ÃTÃuâÃ¥ÃIËÃKÃ=ÃCÃÊÃÃÃŽÃPÃø Í=ÃA::öÓOÛMæÊHÛHæÉ::öÓOÛMæ Ê[yÓHÉ::öÓOÛMæÈ>ÿÉ::öÓOÛMæ Ê|ÛNæÊ|yÓHÉ::öÓOÛMæHÈÛNæÈ>ÿÉà à !€ÍC>Ã22!"!"¯2J!2>:O:ú·ü>ÊÞý>!2GÍ:ú·:ûÊóÚÃ1>2ú¯O!þå2I>õÍÍ:ñá<2-þ ʨ$$"¤åõ ÅÍŠÁÒÂ/v`i"B!É`i"Éy2E!É:D!þÚ‡ÕÅÍ¢~·‘õúoñÁÑë n&É ~æÊfñÁ/€´gÉ`i#Éy2D!þÒ“{æÂz:D!þÚMÖO>§Âø!ø>þ“###²Õ!âÿÍ>ÿ2ùû>Ð2üûÃó~ ÿ ÿ ÿ ÿ >2¦!"F!>2E!ÍÐÚ“Í'øæ õ!»_åÍ¢ëÑÍå*ø#~îo&û~æ"Â=bëÑñO ës#rÃzÍ™y2OÍ=~<ÂzöüÓR>ÓPï!+|µÌ—ÈÛPæ ÂiÍ,Í¢ ~æ2Ï~æ2 ëÉ!É ÉÖØ Û:D!o&))))Òå ~#foÑÉTo¤áy25>¯2!*B!|æ€O|æg+Êê·|g}oÃÜ#|±g"F!!D!H!ʾ#ÊùÍÐØ:B!=æo&)))))))Bë!>§Â+ͯÉëÍ>2>>=>25À>§È!ø¿Íó¯2>"± Å:H!þÚ_ÖO!3Í:I!§OÅ! ø,ÌÁ! ø:Í*J!|æO!0øcÍ*J!|æGM!ølÍB!ø^ÍÍÁ>Ð7>ÿÈxþÂTÅ! ø,ÌÁÃTÍ=ØD!!H!Í:!§Êø:5==ÈÍ¢~æ=È!øŠÍ$@B �B’�„ ’H’H II$�‚@ˆD€’I AˆBI€$"$‚H�$‚H�ˆ€@‚$�$I! ’H’*ª  $Hˆ@„@A „‚I $ˆD’!!$I"BI"I"@$’BˆIIH‰€$„’$ÿ"êÉ*Èë*ê#"êÍ• ÒÃþ :êæ‡ 2é·ÀÅÍà ÍÔ ÁÞ yæ<_WyæOx‡‡‡‡‡±OxæG*¿ ~ÂVÉÕÍ5æþÁ±ÂdwÉÍ^ ÅÑ ÈÕ:ݷʈÅåNÃŽ ÅN#Fåy°Ê�*Æ}‘|˜Ô\á#ÁÃu*ÆÍê #DM*¿6# x±Â±*Êë*¿s#rÍ¡ *³6#6Íþ ÿÍÍõ ÈÍ^ >å¾ÊÒ:A ¾Âö#~Ö$Âö=2E ÍkÍŒ ÃÒ:Ôà Åõ:Å/Gy Oñ ‘æÁÉ>ÿ2Ô!Øq*C "ÙÍþ Í¡ ÍÍõ Ê”*ÙëþåÊJÕÍ ÑÒ”Í^ :ØOy·Êƒþ?Ê|xþ Ê|þ Ês–æÂ-Ã|ÅNÍÁÂ-# ÃS:êæ2E !Ô~ЯwÉÍþ >ÿà ÍT  ÍÍõ ÈÍD Í^ 6åÍkÍÆ Í-äPYy°ÊÑ ÕÅÍ5ÒìÁÑ*Æ{•zœÒôÅÕBKÍ5ÒìÑÁÃÀ<ÍdáÑÉy°ÂÀ!É Õ*C ëÍ^ ÁÍO ÍÃ ÃÆ ÍT  Í*C ~wÍõ ÈÍD  ÍÍ-Ã' ÍÍõ È ÍÍ-Ã@ÍÍõ Èͦ ~õåÍ^ ë*C  ÕÍO Íx Ñ! N!Fáñwy¾xÊ‹>Ú‹>€*C wÉ~#¶+Àw#w+ɯ2E 2ê2ëÍ ÀÍi æ€ÀÍÍõ ÈÍ^ ë*C :Ý·Êè~·ÂÛw·Âá~¾ÂÃýÍ”ëÍ”ë¾Â#¾Â # ÂÍìÿ ë ¾Úw ë ~>ÿ2ÒÃ!E 5ÉÍT *C å!¬"C ÍÍõ á"C Èë!¯w# ÂF! wÍŒ ÍýÃx ¯2ÒÍ¢Íõ È*C  ~<æwʃG:Å !Ҧʎì 4~æʶÍÍõ ¬:Ó<ʶÍ$Íõ ʶïÍZÍ» ¯Ã Í Ãx >2Õ>ÿ2ÓÍ» :ã!á¾Úæþ€ÂûÍZ¯2ã:E ·ÂûÍw Í„ ÊûÍŠ ÍÑ Í² ÃÒ Ã >ÃJ€w#ÂÉÍé:H!þÐëÉyÍ™y2OöüÓR>ÓPÉÍ=6ÛPæȯÃKÍ=^q{‘È?ÚH/<ÃKGÍHæûÓRöÓRÂOÃd`i"¤ÉÛPæÊdÉyÍ�ƧÌ}2-y2I> ÉÖØ ÃÍدÓQ/ÓSÓS>ÓQÍîدÓQ€!ÛSÛSÛSw#ÛSw#ÛSw#ÛSw#ªÉÍدÓQ*¤€~ÓS#~ÓS#~ÓS#~ÓS#ÂË>ÓQÍîØ> 7ȯÉÛPGæÊî>ÓPÛPæ7ÀÛQæ7À¯ÉÛPæ 7À>ÓQÍHö ÓR:IÓSÍ=~ÓS§€Ê,>ÓSxÓS>ÓP>ÓP¯É*Oë!SÉ>öîðÉÿ     %&'()*+, -. /0  12!"34#$!"#$1234%&'(5678 )*+,9:;<  -./0 12345678 !"#$%&'(9:;<=>?@)*+,-./0ò?À4òÀ <À 3@+À t4òÀ  hæÿð@x1ÿð@;€Wÿð@| ßÿÿÿ3 ßÿÿÿb3 ÿÿÿÃ3L!¢È"Ì!L!²Ä#È"L!ÂE$Ä#L!�$E$L!%Ð$L!¦%[%L!1&æ%€ Morrow Designs 48K CP/M 2.2, Cbios rev 2.9.20 For a Disk Jockey 2D/B and a Fujitsu M20 hard disk. Multi I/O as console, CTS protocol serial printer as LST: ~#·ÈåOÍ áÃê1¯2ú2:’$‰$„ˆBB„’I$’@„BI!"$’‰$’„’„A D‚�I$’@’ ªˆA$€@ªªªªªªªªªª’$’�’$�@H! "!„$$"„’„ ’@B$!!‘!DH’$�$�‰"H �@@‘BHH„ˆ  !$$�A"D@‚�„ˆ "€ˆA" "€€BH‰A "‘ !’$� D‰ B �’I ‘ $� ˆ!„$$ €H‚@BD D$’ HI DIA!$$$ $" "€€$„€D ! $„ˆ" „’ $AB " BD„ˆD‘ $‘$’D�„’!"D’I$!$’BH„!"I‚B I‰$"D HD" " $"! �@H €�‚!BI „� " ‘’I  $’I$’I$’D’I$‘ !I$@"$"$‘! $’I$’I �@€ @€ ‚��‘"B@"A@" A!€@H@  $€ @H H€H ¢ @’ ‚BA$� H$’ @‘"BD‚�D H"$ !ˆH@€€@@@@@@@@"€H‚I � € * * 0 10 d80 9780 15 * * 0 11 e00 9800 5 * * 0 12 e80 9880 16 * * 0 13 f00 9900 6 * * 0 14 f80 9980 17 * * 0 15 1000 9a00 7 * * 0 16 1080 9a80 18 * * 0 17 1100 9b00 8 * * 0 18 1180 9b80 19 * * 0 19 1200 9c00 9 * * 0 20 1280 9c80 20 * * 0 21 1300 9d00 10 BDOS * * 0 22 1380 9d80 21 * * 0 23 1400 9e00 11 * * 0 24 1480 9e80 22 * * 0 25 1500 9f00 12 * * 0 26 1580 9f80 23 * * * * Track 1 is recorded in double density format. There are * * 1024 bytes per sector. * * * * 1 1 1600 a000 4 * * 1 2 1a00 a400 1 * * 1 3 1e00 a800 5 CBIOS (@ ab00h) * * 1 4 2200 ac00 2 * * 1 5 2600 b000 6 * * 1 6 2a00 b400 3 * * 1 7 2e00 b800 7 * * 1 8 3200 bc00 Unused * * * * Note that the interleave sequences for loading tracks 0 and 1 * * are different. This difference was designed so that the * * boot sequence could be done in 4 disk revolutions since the * * 2D Mod. B can not load consecutive sectors of* * ***************************************************************** first equ 1 ;0 = Floppies are A-D drives and ; Hard Disk are E-P ;1 = Hard Disks are A-L drives and ; Floppies are M-P maxhd equ 1 ;Set to number of hard disks maxflop equ 4 ;Set to number of floppies ***************************************************************** * * * The following equates are for the Diskus Hard disk if wanted. * * * ***************************************************************** if (maxhd ne 0) and first ;Want Hard Disk included ? hdorg equ 50h ;Hard Disk Controller hdstat equ hdorg ;Hard Disk Status hdcntl equ hdorg ;Hard Disk Control hddata equ hdorg+3 ;Hard Disk Data hdfunc equ hdorg+2 ;Hard Disk Function hdcmnd equ hdorg+1 ;Hard Disk Command hdreslt equ hdorg+1 ;Hard Disk Result retry equ 2 ;Retry bit of result tkz equ 1 ;Track zero bit of status opdone equ 2 ;Operaction done bit of status complt equ 4 ;Complete bit of status tmout eqåf of the disk. * * * * Three spare sectors (track 0, sectors 2 to 4) have been * * provided for a more advanced boot loader at a later date. * * * * * * Hard boot (M10, M20, M26): * * The cold boot loader (track 0, sector 1) is loaded into * * RAM at either 0100h or the 2DB's RAM depending on whether * * this loader is assembled with a 2DB or not. This cold * * boot loader will start loading the CCP from track 0, * * sector 2 and will finish up with the last part of the * * CBIOS on track 0 sector 21. * * * * track sector sysgen load order Name * * 0 1 900 fc00 1 Cold boot * * 0 2 b00 9500 3 CCP * * 0 3 d00 9700 4 * * 0 4 f00 9900 5 * * 0 5 1100 9b00 6 * * 0 6 1300 9d00 7 BDOS * * 0 7 1500 9f00 8 * * 0 8 1700 a100 9 * * 0 9 1900 a300 10 * * 0 10 1b00 a500 11 * * 0 11 1d00 a700 12 * * 0 12 1f00 a900 13 * * 0 13 2100 ab00 14 CBIOS * * 0 14 2300 ad00 15 * * 0 15 2500 af00 16 * * 0 16 2700 b1u 8 ;Time out bit of status wfault equ 10h ;Write fault bit of status drvrdy equ 20h ;Drive ready bit of status indx equ 40h ;Index bit of status pstep equ 4 ;Step bit of function nstep equ 0fbh ;Step bit mask of function hdrlen equ 4 ;Sector header length secln equ 512 ;Sector data length wenabl equ 0fh ;Write enable wreset equ 0bh ;Write reset of function scenbl equ 5 ;Controller control dskclk equ 7 ;Disk clock for control mdir equ 0f7h ;Direction mask for function null equ 0fch ;Null command idbuff equ 0 ;Initialize data command isbuff equ 8 ;Initialize header command rsect equ 1 ;Read sector command wsect equ 5 ;Write sector command endif ***************************************************************** * * * The following equates are for the Disk Jockey 2D/B if wanted. * * * ***************************************************************** if maxflop ne 0 origin equ 0f800h ;Orgin of DJ 2D Mod B PROM djram equ origin+400h ;Disk Jockey ***************************************************************** * * * CP/M vers 2.2 Cold Start Loader. * * * * The following routines will boot CP/M from the Disk * * Jockey 2D Rev. B, or from the Disk Jockey Hard disk * * controller. * * * * Floppy boot: * * The cold boot loader (track 0, sector 1) is loaded into * * RAM on the controller by the cold boot routine in the * * firmware. This cold boot loader will start loading the * * CCP from track 0, sector 5 and will finish up with the * * last part of the CBIOS on track 1 sector 7. * * * * During a warm boot sectors 1, 2, and part of 3 will be * * loaded from track 1. Track 0 loading is unaffected. * * * * track sector sysgen load order Name * * * * 0 1 900 ff00 1 Boot loader * * 0 2 980 Unused * * 0 3 a00 * * 0 4 a80 * * 0 5 b00 9500 2 CCP * * 0 6 b80 9580 13 * * 0 7 c00 9600 3 * * 0 8 c80 9680 14 * * 0 9 d00 9700 400 17 * * 0 17 2900 b300 18 * * 0 18 2b00 b500 19 * * 0 19 2d00 b700 20 * * 0 20 2f00 b900 2 Partial load * * 0 21 3000 Unused * * * * The warm boot load sequence starts at track 0, sector 2 * * and goes straight through to sector 12. There is still * * plenty of room left in this loader for more advanced * * things like sector interleaving although this is hardly * * necessary on a hard disk. * * * ***************************************************************** msize equ 48 ;Memory size of target CP/M bias equ (msize-20)*1024 ;Memory offset from 20k system ccp equ 2500h+bias ;Console command processor bios equ ccp+1600h ;CBIOS address cboot equ bios ;Cold boot address for CP/M loaddr equ ccp ;Load address for floppy retries equ 10 ;Maximum # of disk retries ***************************************************************** * * * The following equates set up the relationship between the * * 2D floppies and the Hard Disk Controllers. * 2D Mod B routines tkzero equ origin+9h ;Track 0 seek trkset equ origin+0ch ;Set track setsec equ origin+0fH ;Set sector setdma equ origin+12h ;Set DMA address dread equ origin+15h ;Read sector dmast equ origin+24h ;Get DMA address status equ origin+27h ;Disk status dskerr equ origin+2ah ;Flash error light setden equ origin+2dh ;Set density endif if first ;Define start address if hard disk if maxflop ne 0 boot equ djram ;If floppy is there then use its RAM else boot equ 0100h ;Otherwise start at 0100h endif else ;Define start address if floppy boot equ djram+0300h ;Upper quarter of floppy RAM endif offset equ 900h-boot ;DDT offset ***************************************************************** * * * Cold Boot loader for Discus M10, M20, or M26. * * * ***************************************************************** if first ;first = 1 is hard disk org boot boothd lxi sp,cstkhd ;Set up stack at end of this sector lxi b,1*100h+20 ;B = secz rtloop ret process in hdstat ;Wait for command to finish mov b,a ani opdone jz process mvi a,dskclk ;Turn on Disk Clock out hdcntl in hdstat ani tmout ;Timed out ? stc rnz in hdreslt ani retry ;Any retries ? stc rnz xra a ;No error exit ret hdprep in hdstat ;Is Drive ready ? ani drvrdy stc rnz mvi a,isbuff ;Initialize pointer to header buffer out hdcmnd mvi a,null out hdfunc ;Select drive A xra a out hddata ;Form head byte out hddata ;Form track byte mvi a,0 ;Form sector byte hdsec equ $-1 out hddata mvi a,80h ;Form Key out hddata mvi a,dskclk ;Turn on Disk clock out hdcntl mvi a,wenabl ;Write enable on out hdcntl ret org boothd+200h-2 cstkhd equ $ dw boothd else ;first = 0 is floppy disk ***************************************************************** * * * Cold boot loader for the Disk Jockey 2D Revision B controller * * * *************************************************************1*"Íà COPYRIGHT(C) 1978, DIGITAL RESEARCH ð ð Ãà á ÃÊ Ã4êÃÞü ÃÃ/ÃLÃ9ASMPRNHEXtor count, C = sector # call clodhd ;Load sector 20 into CCP lxi h,ccp+1e00h ;Destination of move lxi d,ccp ;Source of move mvi c,0 cmovhd ldax d ;Get a byte of source mov m,a ;Move it inx h ;Bump destination inx d ;Bump source dcr c ;All done with this page ? jnz cmovhd lxi h,ccp-200h ;Initial DMA address shld cdmahd lxi b,18*100h+2 ;B = sector count, C = sector # call clodhd jmp cboot ;Go to CP/M clodhd push b ;Save sector and count mov a,c sta hdsec lxi h,ccp-200h ;Get DMA address (self modifying) cdmahd equ $-2 ;Storage for previous DMA address lxi d,200h ;Offset to new DMA address dad d ;Add in offset, HL = new DMA address shld cdmahd ;Save new DMA address call crdhd ;Attempt a read pop b ;Recover sector number and count ; B = count, C = number dcr b ;Update sector count rz ;All done ? inr c jmp clodhd ;Continue reading ***************************************************************** * * * Rdhd does the actual r**** org boot t0boot mvi a,5-2 ;First sector - 2 newsec equ $-1 inr a ;Update sector # inr a cpi 27 ;Size of track in sectors + 1 trksiz equ $-1 jc nowrap ;Skip if not at end of track jnz t1boot ;Done with this track exit equ $-2 sui 27-6 ;Back up to sector 6 backup equ $-1 lxi h,loaddr-80h ;Memory address of sector - 100h nxtdma equ $-2 shld newdma nowrap sta newsec ;Save the updated sector # mov c,a call setsec ;Set up the sector lxi h,loaddr-100h ;Memory address of sector - 100h newdma equ $-2 lxi d,100h ;Update DMA address secsiz equ $-2 dad d nowrp shld newdma ;Save the updated DMA address mov b,h mov c,l call setdma ;Set up the new DMA address lxi b,retries*100h+0;Maximum # of errors, track # nxtrty equ $-2 fread push b call trkset ;Set up the proper track call dread ;Read the sector pop b jnc t0boot ;Continue if no error dcr b jnz fread ;Keep trying if error jmp dskerr ;Too many errors, flash the light t1boot lxi h,cboead from the controller, the DMA * * address and sector # have already been set up. * * * ***************************************************************** crdhd lxi b,retries*100h+1 ;Maximum # of attempts crhd push b ;Save error count call hdread ;Attempt the read pop b ;Restore the error count rnc ;Return if no error dcr b ;Update error count jnz crhd ;Try again if not to many errors jmp $ ;Dynamic error halt hdread call hdprep ;Prepare the sector header image rc ;Error exit mvi a,rsect ;Read sector command out hdcmnd call process ;Process the read rc ;Error exit xra a ;Pointer to data buffer out hdcmnd mvi b,secln/4 ;Number of bytes to read lhld cdmahd ;Get destination of data in hddata ;Two dummy data bytes in hddata rtloop in hddata ;Move four bytes mov m,a ;Byte one inx h in hddata ;Byte two mov m,a inx h in hddata ;Byte three mov m,a inx h in hddata ;Byte four mov m,a inx h dcr b ;Update byte count jnot ;We jump to cboot next time shld exit mvi c,1 ;Select double density call setden xra a ;First sector - 2 sta newsec mvi a,8 ;Size of (logical) track + 1 sta trksiz dcr a ;Number of sectors to back up sta backup lxi h,loaddr+0700h ;DMA start address for first revolution - 2048 shld newdma lxi h,loaddr+0300h ;DMA start address for second revolution - 2048 shld nxtdma lxi h,2048 ;Difference between DMA addresses shld secsiz lxi h,retries*100h+1;Maximum # of errors, track # shld nxtrty jmp t0boot ;Go load in track 1 endif end åååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå!4¾Èw_ÍÉ#~þ ʸ ÞAÉ:4É~ÍÞ~#þ ¼ > ÍÞÉ\ þ?Ê» w#ÂÒ É! ͼ Ã? ÍþÿÀ!¹ͼ ÃÍþ{•zœëÒA"Ë*Öë![N![ N#Fr+sëq#pˆþÚ/>G=#w#wÂ3¯#w#wÉ!JÍÃSYMBOL TABLE OVERFLOW æðG*Ö##~æ°wÉ*Ö##~æÉÍŽ*Ö_###ÉåÍÑs#rÉÍ^#VëÉÃ`ÃÃÄÔæ‚®½ 4 ½ÝïWm ()*+,-/ABCDEHLMDBDIDSDWEIIFINORSPACIADCADDADIANAANDANICMACMCCMPCPIDAADADDCRDCXENDEQUHLTINRINXJMPLDALXIMODMOVMVINOPNOTORAORGORIOUTPOPPSWRALRARRETRLCRRCRSTSBBSBISETSHLSHRSTASTCSUBSUIXORXRAXRICALLENDMLDAXLHLDPCHLPUSHSHLDSPHLSTAXXCHGXTHLENDIFMACROTITLE  PF FPóû!Û (Έ€Æ  2æ/?¸þ'  vÃ:P@<° ö!ÓÁÉ Ç˜Þ PP27�Ö (¨îÍ *éÅ"ùëã  NZZ NCC POPEP M ÿ¯x�»ÊÄ_åÕÅåBH!œÑ‰¾#¶ ¦ÁÑá{ÉÁÑáÚÀKÈCȯ<É:‰ÂþJÈÄþCÈÀþRÉ:ˆþÒ þÊòþ !‹6 s!оÂ#¾È Âø ɯ<É:ˆO=_ÕþÒZ!µF!©V#fjQ̓ÂEÑ!º^#Vo&)~#FÉÑÍÇÀÅÍÛxÁÀ·°Gy¿Éѯ<ÉàÃÃnÃ8ë!’~þڢͅ6~44O!� s#rÉõ!‘~þ Ú¿6Í…^4ñ!mw!wpÉ!’~·ÂÞÍ…!É55N!� N#fiÉÍÏëÍÏÉo&)^#fk*ù͆ÅÍ:5!9N#FÕ#^#V#~#foÍ"§[kb"¥[i`"£[ÑO‡ŸGÉVITALS.BAD CP/M bad sector fixer Revision 3 Í[!gåÍ–ñ!=åÍ–ñÃ"[Í[Í�Ã"[Í[õõõõÍp!øÿå͸áywx#wÍ;ÍÍò!øÿ~#foÍ![*à]åÍá3ñÙ Your choice: All done. 4) Quit bad sectors out of circulation. To create special CP/M files to take 3) Fixbad To manually add to the bad map. 2) Putbad To read the existing bad map on a drive. 1) Getbad Í[!´åÍ–ñ!©åÍ–ñ!|åÍ–ñ!zåÍ–ñ!oåÍ–ñ!KåÍ–ñ!IåÍ–ñ!>åÍ–ñ!åÍ–ñ!ñåÍ–ñ!ïåÍ–ñ!æåÍ–ñ!ØåÍ–ñ!ÖåÍ–ñ!ÆåÍ–ñ!¬[åÍò*ñ:¬[2è]:è]þ1ÂQ!4MDÃ"[:è]þ2Âa!0MDÃ"[:è]þ3Âq!A MDÃ"[:è]þ4»Í:5ûBADSPOTS Í[!å! å!N#FÅÍŠ6ñññ!~#fo6! å!å!~#fo#åÍ·;ñññ!~#fo ~ö€w!~#fo ~ö€wÃ"[Error writing directory Error reading directory Í[!nÿ9ù!nÿå*ä] Á~#~!öÿå!nÿ~#fo Á~#~!ôÿ—w#w!òÿ—w#w!òÿå!º]Á – #žÒ¨!ôÿ~#foå*¼]ãÁ å!öÿN#FÅ!pÿå!åÍ^ ññññy°Ê¾!åÍD ñþÃ"[!òÿ~Æw#~ÎwÃ^!ðÿå!pÿÁ}|!ðÿå!ðÿÁ • œÒ!ðÿ~#fo~O—GyþåÂôxþÊ@!ðÿ~Æ w#ÿÀ!)ͼ ÃÃÍþÿÀ!Ðͼ Ã:5Í¡ É:6þÈþÉ:6Í¡ É:7Í¡ É:\þ Ê» Í24!dÍ® 25Í® 27Í® 26!8ÍÍ Í( ʃ !YååÍÍ Í1 ÑÍ ÑÍ :7þÊž !zååÍÍ Í8 ÑÍ ÑÍ Ã!"›¯2D2X2#Í! 8Íé É!ãͼ Ãz¼À{½ÉÅÕå*›ÍÄ ÂÍ! !"›!�Åå8ÍáÁ·€Â €€w# Âþ Âç ÃþÒ+6# Â�*›å#"›á~áÑÁÉ!úͼ ÃÅG:6þÊQþxÂJÍÞÃQÕåÍSáÑÁÉ*�ë!Ÿwë#"�ë!ÍÄ ÀÍ1 !"�!ŸY~þÈÅÕ€€~# Â…ÑÕåÍáÑÁ·Â¡ÈÃz!ͼ ÃwÅÕåÍ´áÑÁÉ*Ÿ ë!¡ wë#"Ÿ ë!ÍÄ ÀÍ8 !"Ÿ !¡ zÃzÅÕå_ÍáÑÁÉOÍ4: þ È:6þÈyÍÞÉ:„! ·ÊG~Íë#x=Ã2„> Íë> Íë! >x6 #=Â'ÉG! ~þ ÀpÉÍ( ÊO*�}´ÊO>Í4Ã?:7þÊw:#·Ä¸*Ð"!͸*Ÿ }´Êw>ͪÃgÍ( ʆÍ1 YÍú :7þÊ—Í8 zÍú !<ͼ ÃCP/M ASSEMBLER - VER 2.0 NO SOURCE FILE PRESENT NO DIRECTORY SPACE SOURCE FILE NAME ERROR SOURCE FILE READ ERROR OUTPUT FILE WRITE ERROR CANNOT CLOSE FILES END OF ASSEMBLY ÅG:7þxʘÕõ!#~·Ê„þÚl͸Ä*Ðë*!O {½Â�z¼ÊŠ͸*Ð"!!#^4!$ñwÑÁÉõæͯñõæͯñ‚WÉÆ�'Î@'ê>:ͪ!#^¯Ww*!{Íš|Íš}Íš¯Íš{·Êè!$~#ÍšÂ߯’Íš> ͪ> ͪÉ鉒™Ÿ«¿ÆÐÙàìø…Íìz·Â'{þØÍ…>ɯ•o>œgÉÍìë"k!m6ů{_zW5áÈ>Î)D…*k•OxœGÅÒd ã!m?ÃFDM!¯xGyOÚ‚°ÈÃë)ëÃsÍìÍnÃÍ5ëÃÍ5ÃÍ·Ê)=âÍ·Êõ¯|g}oñ=îÍìÃÍìëÍ-ÃÂÍÏÍ-ÃÍÏ#ÃÓÍìz¤g{¥oÃÍìz´g{µoÃÍìz¬g{­oÓ:…þÀ:‰þ Èþ;Èþ,Èþ!ɯ2‘2’=2l!"ÉÍÂ]!‘~·ÊH5_!m~ÍôÃ0:’þÄ…: þ À*�"ÉÉ: þ Â:…þ‰:ˆ·Ì…þÔ…!‰^#=Ê…VëÃqþ”*†ÃqͦÂ1þÒ&þ O:lµ·Ì…>ÿ2ly÷ÂÅ:‘·ÊÞ_!w~¸ÚÞ!‘s!m~ÍôÁùÁyþ Â!‘~·Êü=w_!m~þ ÊÿÍ…¯ÃͰ>ÿ2lÃyþÊþÂPÍÍLÃnÍRæ>UÌÍX:l·Ì…¯2lÍ“ÍÃ*å>EÍáɯ2ÏÍCÍÍ!"ë "Ð"Ò"í Í:…þʼþÂÝ:‰þ*Â1Í Â|ÃRþÂ|ͦÊ0ÍFÍIÂþÍL:Ï·Ä× Ã ÍRþ Íã ÃR*ë }´ÄÝ *Ö"ë Í:…þ¿:‰þ:¿üþÂ×X!C^#fké[©ÀÞ@‡�§ÎÍ Í:…þÂŒ:ˆ=ÊŒG!‰ʆÅF#åÍH áÁÃvÍÛÍc*É|·ÄÑ EÍH Íùͺþ,Ê^Ã1Í Í¦ ÍÑë*Ò"Ò"ÐÃ1Í ÍÑåEÍH áDÍH Íùͺþ,ÊÃÃ1Í Í¦ : þ Â1ÍÑ: þ Âú"í > 2 Í~ÎwÃÍ!ôÿ~Æw#~Îw+å!nÿ~#foÁ – #žÚ®!ôÿ—w#w!öÿ~Æw#~Îwî! å!N#FÅ!ðÿN#FÅÍ·;ñññ!ôÿ~#foå*¼]ãÁ å!öÿN#FÅ!pÿå!åÍ^ ññññy°Ê�!éåÍD ñÃ"[Error writing directory Error reading directory Í[!jÿ9ù!jÿå*ä] Á~#~!tÿå!jÿ~#fo Á~#~!rÿ—w#w!pÿ—w#w!pÿå!º]Á – #žòT!rÿ~#foå*¼]ãÁ å!tÿN#FÅ!xÿå!åÍ^ ññññy°Êg!®åÍD ñÃgÃ"[!pÿ~Æw#~Îwà !øÿå!xÿÁ}|!øÿå!øÿÁ • œÒ£!øÿ~#fo~O—GyþåÂ�xþÂìÃÜ!rÿ~Æw#~Îw+å!jÿ~#foÁ – #žÚW!rÿ—w#w!tÿ~Æw#~ÎwÃW!øÿ~Æ w#~ÎwÃv! å!é]å!øÿN#FÅÍ#6ñññy°ÊI!øÿ~#fo6å!rÿ~#foå*¼]ãÁ å!tÿN#FÅ!xÿå!åÍ^ ññññy°ÊÜ!•åÍD ñÃÜ!lÿ—w#w!lÿ~Ö#~ÞòÜ!øÿ~#fo å!lÿ~#fo)ãÁ ~#¶ÂŽ!lÿ~Æw#~ÎwÃQ!øÿ~#fo å!lÿ~#fo)ãÁ :¾]–:¿]#žòÓ!øÿ~#fo å!lÿ~#fo)ãÁ ~#fo"¾]*È]"Æ]*²]ÅMD) )Áå*È]ãÁ :Æ]•:Ç]œÒ~!øÿ~#fo å!lÿ~#fo)ãÁ å*Æ]####Á ¾Â  #¾Â/!øÿN#FÅÍrñ*Æ]}Æo|Îg"Æ]ÃÙ%s: File contained bad sectors, probably corrupt Í[!¬[å!N#FÅÍ#ññ!¬[å!@åÍ/ññÃ"[Í[!N#FÅÍò>ñÅ!N#FÅ!åÍFñññÃ"[Í[!~#foÅMD) Áå*à]ãÁ ~O—Gi`å!~#foÅMD) Áå*à]ãÁ ~O—Gá}‘o|˜g"ö]!ö]Ã@Ã2ÃÀÍõþ Ê0þ Ê0:„þxÒ0_<2„! ñwÉñÉÍI2 2„> 2 Í>2„ɯ2ˆ2 É!ˆ~þ@Ú_6Í^4#: wÉ~þ$À¯wÉ: Ö0þ æÉÍqÀ: ÖAþæÉ: ÖAþæÉÍ‹ÀÍqÉ: þaØþ{Ðæ_2 ÉÍ 2 Ã-Éþ ÈþÈþ!ɯ2…ÍI: þ Êôþ;Êáþ*Âí: þ ÂíÍ­Í·ÊúÃáö þ ÂúÍ­ÃÇÍ‹Ê>Ã9ÍqÊ>Ã9: þ'Â!¯2 >Ã9þ Â7:Ï·Ä! 6 >2„>2…: 2 ·ÄQÍ­:…þÈþÄž! :…þÂlÍjÊ<Í–ÈÃ<þÂÍjÊ<Í|Â<: þOÊŠþQÂ�>ÖþH >2 ¯2 û: þB­>ôþD> ¸!ˆ52 !"†!ˆN#~#þAÒÒÖ0ÃÔÖ7åÅO! ¾Ô~*†ë!·Ê÷Òñë)ëÃè "†Áá ÂÆÉ: þ Êþ'Â<Í­þ'ÀÃ<õ>VÃ$õ>OÃ$ÅåÍáÁñÉõ:…þÄžñÉàÃ\ÞØÃëÃ`ÃrÃ�Ö![€¯w#w#Âb!"ÖÉ!ˆF¯#†Âvæ2[ÉG*Ö##~æð°wÉ*Ö##~æ<É*Ö}´ÉÍq!ˆ~þÚ¬6![^![^#fk"Ö͘ÈÍŽ!ˆ¾ÂáG#ë*Ö###¾Âá#ÂÕÉ*Ö^#Vëû!ˆ^*Ë"Öë*Í:…þÂ|:‰þ Â|ËÃÑÍã ÃÑÍ Ê|*ÒåÍÑ"ÒÍ Í© !6=á"ÒÃ1Í ÍÑ: þ Â1}Ú1Í:…þÂn:‰þ>BÌÊ‹ÃSþÂSͦÂSþÂSxþÂSÃÑÍã Ã1ÍÑ: þ Â1"Ò"ÐÍ Í¦ Ã1Í Ê|ÍRþÄÝ >ÍOÍÑåÍ áÍU!"ë Ã1Íã ÍÃ1Öþ!Ò|_!ë^#fké $8AP`ix�ˆ�ž¥ÍH ÍñÍüÍÍñÍüñÍòþ8Ê1æĽ yæ0°Ã®ÍH ÍñÍò°GÍÍç°Ã®Íò°ÍG ÍÍ ñÍH Í ñÍòæ(Ľ yæ°Ã®ÍH ÍñÍç°Ã®Íò°Ã®ÍòæĽ yæ0°Ã®Íò°Ã®ÍH Í ñÍG Í ÍùÃ1:…þÄÑ :‰þ,Èþ;Èþ ÄÑ ÉÅÍÍc*ÉÁÉÍÑ|·ÄÇ }ÉÍÝþÔÇ æÉÍçæ8OÉÍòæĽ yæ0°ÃG ÍÝÃG ÍÑÃt õÅ:…þÂ):‰þ,Ê.>CÍÁñÉÍ :…þÂ|:‰þ ÂJÍüþ;ÂrÍ Í:…þÂR:‰þ ʼþÊ‹þ!ʼÃRþ!ʼþÊ‹>SÍÃR{•ozœgÉ!Ï~4·Ê§Íͦ !6 ! Í*Ëë*ÔÍ„å*Íë*ÔÍ„\áÍiëÍ© !Ö·Êäw#ÃËH USE FACTOR !Í*í "ÐÃz¼À{½É*Ð"ÒÉ*ë "ÖÍIÉÍ È!"ë :Ï·Â1 ÍRõæÄÝ ñöÍO*ÒÍUÉÍRæÌ× ÍXë*ÒÍóÄ× ÉG:Ï·xÊl ÅÍ: þ *ÒÌ© :ï þÁÒl xÍ– *Ð#"ÐÉåEÍH áDÃH Æ0þ:ØÆÉÍ~ !ï ^4! wÉõæ͆ ñæÆ *Òë!ï å6zÕÍ– Ñ{Í– á4ÉõÅ>RÍÁñÉõå>VÍáñÉõ>DÃæ õ>PÃæ õ>LÃæ õ>NÍñÉ~#¶Ê *ö]MDÃ"[!~#foÅMD) Áå*à]ãÁ #~O—Gi`å!~#foÅMD) Áå*à]ãÁ #~O—Gá}‘o|˜g"ö]!ö]~#¶Ê` *ö]MDÃ"[!~#foÅMD) Áå*à]ãÁ ##~O—Gi`å!~#foÅMD) Áå*à]ãÁ ##~O—Gá}‘o|˜g"ö]*ö]MDÃ"[Í[!~#foÅMD) Áå*à]ãÁ ~2ø]!~#foÅMD) Áå*à]ãÁ #~2ù]!~#foÅMD) Áå*à]ãÁ ##~2ú]!~#foÅMD) Áå*à]ãÁ å!~#foÅMD) Áå*à]ãÁ Á~!~#foÅMD) Áå*à]ãÁ #å!~#foÅMD) Áå*à]ãÁ #Á~!~#foÅMD) Áå*à]ãÁ ##å!~#foÅMD) Áå*à]ãÁ ##Á~!~#foÅMD) Áå*à]ãÁ :ø]w!~#foÅMD) Áå*à]ãÁ #:ù]w!~#foÅMD) Áå*à]ãÁ ##:ú]wÃ"[Bad sector fixing done No free directory entries left Bad sector in CP/M directory (%u, %u, %u)Í[!Öÿ9ù!öÿå*ä] Á~#~!öÿ~#fo~#fo"^!å!öÿ~#fo##~O‡ŸG! åÍCVá"ý]*ý]å!€åÍ€Uá"^—2ÿ]2^!öÿ~#fo ~2^—2^*^))))))))"^!öÿ~#fo ~O—G:^±2^:^°2^!^~#¶Êü *^|æ€Ê/ *ÿ]#"ÿ]Ã/ —2°]2±]*à]"â]*â]~O—Gyþÿ xþÊ9 *°]#"°]*â]###"â]à *^)"^Ãà *à]å!« å!»å*°]åÍé6ññññ!å*°]åÍ 2ññi`"È]!È]~#¶Ân Í!*È]"Æ]*à]"â]*°]ÅMD) Áå*à]ãÁ :â]•:ã]œÒ· :«[·Ê *â]##~þ  *â]#5*â]#~æwà *Æ]å!È]Áy–Ox#žGÅ!åÍ Vá"²]ÍÇ*È]"Æ]—2^2^*²]ÅMD) )Áå*È]ãÁ :Æ]•:Ç]œÚ"*Èå!å!N#FÅ!~Æw#~ÎwáN#FÅÍhññññÃ4!\åÍFñÃë*}æøo|ægå!Áy¾ÂLx#¾ÊW!:åÍFñ*å* åͳññ* åÍñy2:O‡ŸGyþÿˆxþÿÊ¢*##åÍñyæøOxæGy°Êª!%åÍFñ*å* åͳññ!‡å*###åͳññ!$åá0~#~#~#~!0å—2829:2::2;!8å!(åÍÍWá##~2#~2*}æÿo|ægå*åͳññ*å!åÍs á}æÿo|ægå*#åͳññ!å*###åͳññ!åÍ ñ*åÍÓñ!åÍ ñ*åÍœñ!ÿåÍ ñ*åÍœñ!øåÍ ñ!õåÍ ñÍ× ÃÍÍÆ!õÿ9ù! å!N#FÅ!õÿåÍR ñññi`å!õÿãÁ 6!õÿåÍ ñÃÍÍÆõõõõ!å!N#FÅ!øÿåÍR ñññi`å!øÿãÁ 6!øÿåÍ ñÃÍÍÆ!~#fo~·Ê@!~#fo~O‡ŸGÅ!åÍ ññ!~Æw#~Îwà ÃÍ ÍÆ!N#FÅÍ ñ!CåÍ ñ!ÿÿåÍ× ñÃÍÍ' õõõõ!~#fo"D!~#fo"@!~#fo"B!øÿ>w‡Ÿ#w!òÿ:Dw:E#w!ôÿ>w‡Ÿ#w!@—–>#žÒÑ*D> ¾ò *D~þò !@—–>#žÒ%*D~þ-®!ôÿ>w‡Ÿ#w*D#"D:@Ö2@:AÞ2AÃ%:@Ö2@:AÞ2A*D#"Dó! ~þÂ3#~þÂÑ:@Ö:AÞÚÑ*D~þ0ÂÑ*D ~þAú{*D >Z¾ú{*D ~O‡ŸG! MDÇ*D ~O‡ŸGyþxÂ�xþÂÑ*D##"D:@Ö2@:AÞ2AÃÑ*D~þ+Â%*D#"D:@Ö2@:AÞ2AÃ%!@—–>#žÒ *D~þ0úƒ *D>9¾úƒ !öÿå*D~O‡ŸG!Ðÿ rrow Designs Inc.H–  Ã_ ÊéO!9~#fo|‡|g}o Â� ÃÅ åÅ!9~·ò® /<Ã_ ÊéO!9~#fo|·g}o º MD!9q#pÃéåÅ!å! 9~+¶Ê ~Òð ! 9N#Fá å! 9~‡w#~�w! 9~·w+~wÃ× Á!9q#pÃéÁá&Éå!Ûå!9ÍÌáÅO—GÉåÅ!9N#F!9~#fo ##– #ž +++ž #žÃÑ!9MD!9~#~#~#~— ø!9~‡w#~�w#~�w#~�w#~�w#~�w#~�w#~�w!9MD! 9 – #ž #ž #žÚx!9MD! 9 – #ž #ž #ž!94ÃxãÅÕë!ðÿ9ùëé!9ùÑÃé#~#~+++~#~É#~·òò—#–>#ž>+++ž>#žÉ~#~#~ #~É{æÊ$—–>#ž>#ž >#žÉÍÜ!9MD!9~#foÍ! 9MD!9~#foÍÍU!9N#F!9Í7ÃéÍÜ!9MD!9~#foÍ! 9MD!9~#foÍÍU!9N#F!9Í7ÃéÍÜ! 9MD!9~#fo#Íò!9MD!9~#fo#ÍòÍU!9N#Fkb9Í$ÃéÍÜÃÐåÅ!9~#foN#FÅ#N#FÅ! 9~#foN#FÅ#N#FÅ!åå!9~+¶+¶+¶Ê“~Òi!9MD!9 † #Ž #Ž #Ž!9~‡w#~�w#~�w#~�w!9~·w+~w+~w+~wÃ:!9N#F!9~#~á}|! 9ùÃéÁá&Éã}!Óå!9ÍÌÅÉ!9ëãéëùÑÉõ!9N#F###q#pÁ+++qÁáññÉ!9N#F#q#pÁáñÉMo]åÍá3ñ!Ý åÍ–ñÃ"[*â]###"â]Ãz !òÿå*â]##~O—GÅ*â]#~O—GÅ*â]~O—GÅÍõñññá:ùbw:úb#w:ûb#w:üb#w*Æ]å!òÿåáùbÍmW!ùbå:^‡Ÿ2c2c:^2c:^2c!cåÍ~XáÁ##~#~*Æ]##å!òÿåáùbÍmW!ùbå:^‡Ÿ2c2c:^2c:^2c!cåÍ·X:½]‡Ÿ2c2c:½]2c:¼]2c!cåÍ WáÁ##~#~*Æ]####å!òÿåáùbÍmW!ùbå!öÿ~#fo N#FÅ*^åÍÅVÁx‡Ÿ2c2cx2cy2c!cåÍÈZ—2c2c:^2c:^2c!cåÍ~XáÁ##~#~*Æ]å!öÿ~#fo Á – #žú !öÿ~#fo å*Æ]####Á – #žú *Æ]####å!ÿ]Á – #žòÙ*â]##~O—GÅ*â]#~O—GÅ*â]~O—GÅ!4 åÍ/ññññ! åÍ–ñà !È]:Æ]¾Âè:Ç]#¾Ê*Æ]þÿ å*Æ]####Á ¾Â #¾Ê *Æ]}Æo|Îg"Æ]à *^#"^Ãâ !ÖÿåÍ‹ñ!äÿå*^å!åÍ’VáÁ}!âÿå*^}æo—gÁ}—2^2^:^Ö:^ÞÒ€*²]ÅMD) )Áå*È]ãÁ :Æ]•:Ç]œÚ’!åÿ~·ÂÑ!åÿ6€ÃÑ*^)å!æÿãÁ å*Æ]####Á~#~!åÿå!^Á †*Æ]}Æo|Îg"Æ]*^#"^ÃW!åÿ~O—G>€‘>˜òí!åÿ~Ö€wÃÑ!ÖÿåÍñy°Â!õ åÍD ñÃÍ[!N#FÅ!å!N#FÅ!N#FÅÍ×)ññññÃ"[Í[!å!N#FÅ!å!Få͇ññññÃ"[Í[!å!N#FÅ!N#FÅ!å͇ññññÃ"[•sru+l\Í&[!÷ÿ9ù!~#fo" c! ~#fo" c!øÿ>w‡Ÿ#w* c" ^* ^~·ÊÛ* ^~þ%ÊÛ* ^#" ^ö* ^#" cÃ¥! ^: c–:c#žÒ* ^å! cÁy–Ox#žGÅ* cå!Á}|Ø *Bå!ôÿ~#¶Ê) !øÿN#F>‘O>˜GÃ0 !øÿN#Fáywx#w!@—–>#žÒ? *D~þAúe *D>Z¾úe *D~O‡ŸG! MDÃm *D~O‡ŸGyþlÂv xþÂ? *D#"DÃ? *D~þaúÝ *D>z¾òï ÃÝ !øÿå!øÿN#FÅ! N#FÅÍÑ áå!öÿ~#foãÁ Á}|:@Ö2@:AÞ2A*D#"DÃÑ*D~þAú *D>Z¾ú !öÿå*D~þAú *D>Z¾ú *D~O‡ŸG! MDà *D~O‡ŸG!©ÿ Á}|!öÿå! Á – #žú˜ à *Då!òÿÁy–Ox#žGÃ= Í' !~#fo"D*D"B!#~·ò¡ !—–>#žú¡ !~#fo>•o>œg"@*Bå*B#"Bá6-ì !~#fo"@!~#¶ÂÄ !> w‡Ÿ#wÃé !#~·òé !å!~#fo>•o>œgÁ}|!:@–:A#žÚ! !N#FÅ*@å!N#FÅÍ *BåÍR ñññ*B "B*Bå*@å!N#FÅÍ4 á0 Á}*B>9¾òL *B~Æ'w*Bå!DÁy–Ox#žGÃ= Í' !~#fo"D>2@‡Ÿ2A!:@–:A#žÒÊ *Då*D~þAú® *D>Z¾ú® *D~O‡ŸG! MDö *D~O‡ŸGáyw*@#"@*D#"DÃw !~#foMDÃ= ÍÆ!,~#¶Ê ! :,½Âñ :-¼Ê *,ÍÌi`",ÃÚ *.ÍÌà Í' *,"D!~#fo",*DMDÃ= Á!þÿ9ëå*Då*Bå*@åi`é!úÿùá"@á"Bá"DÑÉáÕÕÅåø!9~‡w#~�w#~�w#~�w+MD!9 –_ #žÚZ { !94ÃZ åÅÕ! 9~·ò¤ —+–w>#žw! 9N#Fx·ò¸ —‘O>˜GÍP ÁññÒÈ —‘O>˜G! 9q#pÑÃéåÅÕ! 9~·òê —+–w>#žw! 9N#Fx·òþ —‘O>˜GÍPå*ùÍ3ÅÍ× !9N#FÕ#^#V#~#foÍ"ükb"úi`"øÑO‡ŸGÉÍÆ!Òÿ9ù!Öÿ>€w>#w!Ôÿ>�w>#w!Òÿ:€w—#w!ÒÿN#FÅ!ÔÿN#FÅÍ_ ññ!Òÿ~#¶Ê»!ÖÿN#FÅ!Öÿ~Æw#~Îwáå!ÔÿN#FÅ!Ôÿ~Æw#~ÎwáÁ~!Òÿ~Öw#~ÞwÃq!ÖÿN#FÅ!Öÿ~Æw#~Îwá6!Øÿå!ÚÿÁ}|!ØÿN#FÅ!Øÿ~Æw#~Îwá2ywx#w!Öÿ>€w>#w!Öÿ~#fo~·ÊD!Öÿ~#fo~·Ê|!Öÿ~#fo> ¾ò®!Öÿ~#fo~þú|î!Øÿ~#fo>w‡Ÿ#w!Úÿå!Øÿ~#foå!ÚÿÁy•OxœGÅ!åÍ ÍÌññÃÍ!Öÿ~#fo~·ÊÉ!ØÿN#FÅ!Øÿ~Æw#~Îwáå!ÖÿÁ~#~ÃÉ!ÖÿN#FÅ!Öÿ~Æw#~Îwá6Ã!Öÿ~#fo> ¾ò !Öÿ~#fo~þò !Öÿ~Æw#~ÎwÃÉ baud. set to H, Serial port Multi I/O @ Can't find multi I/OBase must be on an 8 byte boundryDevice # out of range.Baud rate must be between 75-38400Usage: baud rate [device #] [base] .BAUD Version ÍÆ!~Æw#~Îw!¾åÍ ñ*åÍœñ!¼åÍ ñ*åÍœñ!¹åÍ ñ!~Ö#~Þò!–åÍFñ!>–>#žòˆ! å!å!å!N#FÅ!~Æw#~ÎwáN#FÅÍhññññy°Êà:ÖK:ÞÚà! å—2021:22:23!0åÍ+úà!>–>#žòë! å!å!å!N#FÅ!~Æw#~ÎwáN#FÅÍhññññ:Ö:Þú)!>–>#žòëÃ)!såÍFñÈ!>–>#žò4!å! ñÁñÒ —‘O>˜G! 9q#pÑÃéåÅÕ! 9N#FÍP Áññ! 9q#pÑÃéåÅÕ! 9N#FÍP ñÁñ! 9q#pÑÃéåÅ!9~·ò_ /<à ÊéO!9~#fo) Âk ÃÅ åÅ!9~·òƒ /<Ã_ ÊéO!9~#fo|‡|g}o Â� ÃÅ åÅ!9~·ò® /<Ã_ ÊéO!9~#fo|·g}o º MD!9q#pÃéåÅ!å! 9~+¶Ê ~Òð ! 9N#Fá å! 9~‡w#~�w! 9~·w+~wÃ× Á!9q#pÃéÁá&Éå!Ûå!9ÍÌáÅO—GÉåÅ!9N#F!9~#fo ##– #ž +++ž #žÃÑ!9MD!9~#~#~#~— ø!9~‡w#~�w#~�w#~�w#~�w#~�w#~�w#~�w!9MD! 9 – #ž #ž #žÚx!9MD! 9 – #ž #ž #ž!94ÃxãÅÕë!ðÿ9ùëé!9ùÑÃé#~#~+++~#~É#~·òò—#–>#ž>+++ž>#žÉ~#~#~ #~É{æÊ$—–>#ž>#ž >#žÉÍÜ!9MD!9~#foÍ! 9MD!9~#foÍÍU!9N#F!9Í7ÃéÍÜ!9MD!9~#foÍ! 9MD!9~#foÍÍU!9N#F!9Í7ÃéÍÜ! 9MD!9~#fo#Íò!9MD!9~#fo#ÍòÍU!9N#Fkb9Í$ÃéÍÜÃÐåÅ!9~#foN#FÅ#N#FÅ! 9~#foN#FÅ#N#FÅ!åå!9~+¶+¶+¶Ê“~Òi!9MD!9 † #Ž #Ž #Ž!9~‡w#~�w#~�w#~�w!9~·w+~w+~w+~wÃ:!9N#F!9~#~á}|! 9ùÃéÁá&Éã}!Óå!9ÍÌÅÉ!9ëãéëùÑÉõ!9N#F###q#pÁ+++qÁáññÉ!9N#F#q#pÁáñÉMo NAME baud - change serial baud rate on multi I/O SYNOPSIS baud baud-rate [device #] [multi I/O base] DESCRIPTION Baud is used to change the baud rate on a multi I/O or Decision I motherboard. Device # is the port number on the Multi I/O or decision motherboard in the range of one to three. Multi I/O base is the base address of the multi I/O. The default device # is one if not specified. The Multi I/O base is assumed to be 48. EXAMPLES To change serial port 1 on a multi I/O with a base of 48H to 9600 baud you would type: baud 9600 1 48 or baud 9600 To change the baud rate of the third serial port on multi I/O with a base of zero to 110 baud: baud 110 3 0 baud.doc 3/17/81 ldk eader paper tape reader in (result to reg-a) ; home move to track 00 ; ; (the following calls set-up the io parameter block for the ; mds, which is used to perform subsequent reads and writes) ; seldsk select disk given by reg-c (0,1,2...) ; settrk set track address (0,...76) for sub r/w ; setsec set sector address (1,...,26) ; setdma set subsequent dma address (initially 80h) ; ; read/write assume previous calls to set i/o parms ; read read track/sector to preset dma address ; write write track/sector from preset dma address ; ; jump vector for indiviual routines jmp boot wboote: jmp wboot jmp const jmp conin jmp conout jmp list jmp punch jmp reader jmp home jmp seldsk jmp settrk jmp setsec jmp setdma jmp read jmp write jmp listst ;list status jmp sectran ; maclib diskdef ;load the disk definition library disks 4 ;four disks diskdef 0,1,26,6,1024,243,64,64,offset diskdef 1,0 diskdef 2,0 diskdef 3,0 ; endef occurs at end of assembly ; ; end of conrror retries lxi b,cpmb ;set dma address to start of disk system call setdma mvi c,0 ;boot from drive 0 call seldsk mvi c,0 call settrk ;start with track 0 mvi c,2 ;start reading sector 2 call setsec ; ; read sectors, count nsects to zero pop b ;10-error count mvi b,nsects rdsec: ;read next sector push b ;save sector count call read jnz booterr ;retry if errors occur lhld iod ;increment dma address lxi d,128 ;sector size dad d ;incremented dma address in hl mov b,h mov c,l ;ready for call to set dma call setdma lda ios ;sector number just read cpi 26 ;read last sector? jc rd1 ; must be sector 26, zero and go to next track lda iot ;get track to register a inr a mov c,a ;ready for call call settrk xra a ;clear sector number rd1: inr a ;to next sector mov c,a ;ready for call call setsec pop b ;recall sector count dcr b ;done? jnz rdsec ; ; done with the load, reset default buffer address gocpm: ;(enter here from cold start boot) ; enable rsåtroller - independent code, the remaining subroutines ; are tailored to the particular operating environment, and must ; be altered for any system which differs from the intel mds. ; ; the following code assumes the mds monitor exists at 0f800h ; and uses the i/o subroutines within the monitor ; ; we also assume the mds system has four disk drives revrt equ 0fdh ;interrupt revert port intc equ 0fch ;interrupt mask port icon equ 0f3h ;interrupt control port inte equ 0111$1110b;enable rst 0(warm boot),rst 7 (mon) ; ; mds monitor equates mon80 equ 0f800h ;mds monitor rmon80 equ 0ff0fh ;restart mon80 (boot error) ci equ 0f803h ;console character to reg-a ri equ 0f806h ;reader in to reg-a co equ 0f809h ;console char from c to console out po equ 0f80ch ;punch char from c to punch device lo equ 0f80fh ;list from c to list device csts equ 0f812h ;console status 00/ff to register a ; ; disk ports and commands base equ 78h ;base of disk command io ports dstat equ base ;disk status (input) rtypt0 and rst7 di mvi a,12h ;initialize command out revrt xra a out intc ;cleared mvi a,inte ;rst0 and rst7 bits on out intc xra a out icon ;interrupt control ; ; set default buffer address to 80h lxi b,buff call setdma ; ; reset monitor entry points mvi a,jmp sta 0 lxi h,wboote shld 1 ;jmp wboot at location 00 sta 5 lxi h,bdos shld 6 ;jmp bdos at location 5 sta 7*8 ;jmp to mon80 (may have been changed) lxi h,mon80 shld 7*8+1 ; leave iobyte set ; previously selected disk was b, send parameter to cpm lda cdisk ;last logged disk number mov c,a ;send to ccp to log it in ei jmp cpmb ; ; error condition occurred, print message and retry booterr: pop b ;recall counts dcr c jz booter0 ; try again push b jmp wboot0 ; booter0: ; otherwise too many retries lxi h,bootmsg call prmsg jmp rmon80 ;mds hardware monitor ; bootmsg: db '?boot',0 ; ; const: ;console status to reg-a ; (exactly the same as mds call) jmp csts ; conin: ;console c; MDS-800 I/O Drivers for CP/M 2.0 ; (four drive single density version) ; ; Version 2.0 August, 1979 ; vers equ 20 ;version 2.0 ; ; Copyright (c) 1979 ; Digital Research ; Box 579, Pacific Grove ; California, 93950 ; org 4A00h ;base of bios in 20K system cpmb equ 3400h ;base of cpm CCP bdos equ 3C06H ;base of bdos in 20K system cpml equ $-cpmb ;length (in bytes) of cpm system nsects equ cpml/128;number of sectors to load offset equ 2 ;number of disk tracks used by cp/m cdisk equ 0004h ;address of last logged disk buff equ 0080h ;default buffer address retry equ 10 ;max retries on disk i/o before error ; ; perform following functions ; boot cold start ; wboot warm start (save i/o byte) ; (boot and wboot are the same for mds) ; const console status ; reg-a = 00 if no character ready ; reg-a = ff if character ready ; conin console character in (result in reg-a) ; conout console character out (char in reg-c) ; list list out (char in reg-c) ; punch punch out (char in reg-c) ; re equ base+1 ;result type (input) rbyte equ base+3 ;result byte (input) ; ilow equ base+1 ;iopb low address (output) ihigh equ base+2 ;iopb high address (output) ; readf equ 4h ;read function writf equ 6h ;write function recal equ 3h ;recalibrate drive iordy equ 4h ;i/o finished mask cr equ 0dh ;carriage return lf equ 0ah ;line feed ; signon: ;signon message: xxk cp/m vers y.y db cr,lf,lf db '20' ;sample memory size db 'k CP/M vers ' db vers/10+'0','.',vers mod 10+'0' db cr,lf,0 ; boot: ;print signon message and go to ccp ; (note: mds boot initialized iobyte at 0003h) lxi sp,buff+80h lxi h,signon call prmsg ;print message xra a ;clear accumulator sta cdisk ;set initially to disk a jmp gocpm ;go to cp/m ; ; wboot:; loader on track 0, sector 1, which will be skipped for warm ; read cp/m from disk - assuming there is a 128 byte cold start ; start. ; lxi sp,buff ;using dma - thus 80 thru ff ok for stack ; mvi c,retry ;max retries push b wboot0: ;enter here on e haracter to reg-a call ci ani 7fh ;remove parity bit ret ; conout: ;console character from c to console out jmp co ; list: ;list device out ; (exactly the same as mds call) jmp lo ; listst: ;return list status xra a ret ;always not ready ; punch: ;punch device out ; (exactly the same as mds call) jmp po ; reader: ;reader character in to reg-a ; (exactly the same as mds call) jmp ri ; home: ;move to home position ; treat as track 00 seek mvi c,0 jmp settrk ; seldsk: ;select disk given by register c lxi h,0000h ;return 0000 if error mov a,c cpi ndisks ;too large? rnc ;leave HL = 0000 ; ani 10b ;00 00 for drive 0,1 and 10 10 for 2,3 sta dbank ;to select drive bank mov a,c ;00, 01, 10, 11 ani 1b ;mds has 0,1 at 78, 2,3 at 88 ora a ;result 00? jz setdrive mvi a,00110000b ;selects drive 1 in bank setdrive: mov b,a ;save the function lxi h,iof ;io function mov a,m ani 11001111b ;mask out disk number ora b ;mask in new disk number mov m,aontroller mov a,b out ihigh ;high address jmp wait0 ;to wait for complete ; iodr1: ;drive bank 1 out ilow+10h ;88 for drive bank 10 mov a,b out ihigh+10h ; wait0: call instat ;wait for completion ani iordy ;ready? jz wait0 ; ; check io completion ok call intype ;must be io complete (00) unlinked ; 00 unlinked i/o complete, 01 linked i/o complete ; 10 disk status changed 11 (not used) cpi 10b ;ready status change? jz wready ; ; must be 00 in the accumulator ora a jnz werror ;some other condition, retry ; ; check i/o error bits call inbyte ral jc wready ;unit not ready rar ani 11111110b ;any other errors? jnz werror ; ; read or write is ok, accumulator contains zero ret ; wready: ;not ready, treat as error for now call inbyte ;clear result byte jmp trycount ; werror: ;return hardware malfunction (crc, track, seek, etc.) ; the mds controller has returned a bit in each position ; of the accumulator, corresponding to the conditions: ***************************************************************** * * * Hard Disk Boot program. * * For M26, M10, and M20. * * * ***************************************************************** org 100h revnum equ 13 IOADDR EQU 120Q CONTRL EQU IOADDR STATUS EQU IOADDR DATA EQU IOADDR+3 FUNCTN EQU IOADDR+2 COMMD EQU IOADDR+1 DREAD EQU 1 SECTOR EQU 1 OPDONE EQU 2 COMPLT EQU 4 HEADER EQU 10Q DRENBL EQU 5 DSKRUN EQU 7 READY EQU 40Q SYSTEM EQU 200Q STEPO EQU 370Q DRIVEA EQU 374Q jmp start ds 509 ;Room for the boot START MVI A,DRIVEA ;select OUT FUNCTN ; drive A MVI A,DRENBL ;turn on drive OUT CONTRL ; command register RLOOP IN STATUS ;test for ANI READY ;drive A ready JNZ RLOOP MVI A,DSKRUN ;enable the OUT CONTRL ; controller WAITZ IN STATUS ;test for heads RAR ; at track zero JNC SDONE MVI A,STEPO ;execute OUT FUNCTN ; the MVI A,DRIVEA ; step out OUT FUNCTN ; command WAITC IN STATUS ;wait  ;save it in iopb mov l,c mvi h,0 ;HL=disk number dad h ;*2 dad h ;*4 dad h ;*8 dad h ;*16 lxi d,dpbase dad d ;HL=disk header table address ret ; ; settrk: ;set track address given by c lxi h,iot mov m,c ret ; setsec: ;set sector number given by c lxi h,ios mov m,c ret sectran: ;translate sector bc using table at de mvi b,0 ;double precision sector number in BC xchg ;translate table address to HL dad b ;translate(sector) address mov a,m ;translated sector number to A sta ios mov l,a ;return sector number in L ret ; setdma: ;set dma address given by regs b,c mov l,c mov h,b shld iod ret ; read: ;read next disk record (assuming disk/trk/sec/dma set) mvi c,readf ;set to read function call setfunc call waitio ;perform read function ret ;may have error set in reg-a ; ; write: ;disk write function mvi c,writf call setfunc ;set to write function call waitio ret ;may have error set ; ; ; utility subroutines prmsg: ;print messag ; 0 - deleted data (accepted as ok above) ; 1 - crc error ; 2 - seek error ; 3 - address error (hardware malfunction) ; 4 - data over/under flow (hardware malfunction) ; 5 - write protect (treated as not ready) ; 6 - write error (hardware malfunction) ; 7 - not ready ; (accumulator bits are numbered 7 6 5 4 3 2 1 0) ; ; it may be useful to filter out the various conditions, ; but we will get a permanent error message if it is not ; recoverable. in any case, the not ready condition is ; treated as a separate condition for later improvement trycount: ; register c contains retry count, decrement 'til zero dcr c jnz rewait ;for another try ; ; cannot recover from error mvi a,1 ;error code ret ; ; intype, inbyte, instat read drive bank 00 or 10 intype: lda dbank ora a jnz intyp1 ;skip to bank 10 in rtype ret intyp1: in rtype+10h ;78 for 0,1 88 for 2,3 ret ; inbyte: lda dbank ora a jnz inbyt1 in rbyte ret inbyt1: in rbyte+10h ret ; instat: lda dbank ora a for ANI COMPLT ; the seek JZ WAITC ; to complete JMP WAITZ SDONE IN STATUS ;get an image MOV C,A ; of the status reg IWAIT1 IN STATUS ;wait for SUB C ; the index pulse JZ IWAIT1 ; to arrive IWAIT2 IN STATUS ;wait for the SUB C ; next index pulse JNZ IWAIT2 ;test for head settle iwait3 in status sub c jz iwait3 MVI A,HEADER ;reset the OUT COMMD ; buffer pointer XRA A ; to header area OUT DATA ;head 0 OUT DATA ;track 0 MVI A,SECTOR ;1 for CP/M OUT DATA ; or 30 for drivers MVI A,SYSTEM ;system key OUT DATA MVI A,DREAD ;issue a OUT COMMD ; read command WAITD IN STATUS ;wait for command ANI OPDONE ; to complete JZ WAITD IN DATA ;low order byte of MOV L,A ; bootstrap address MOV E,A IN DATA ;high order byte of MOV H,A ; bootstrap address MOV D,A LLOOP IN DATA ;load STAX D ; the INR E ; bootstrap JNZ LLOOP PCHL ;branch there e at h,l to 0 mov a,m ora a ;zero? rz ; more to print push h mov c,a call conout pop h inx h jmp prmsg ; setfunc: ; set function for next i/o (command in reg-c) lxi h,iof ;io function address mov a,m ;get it to accumulator for masking ani 11111000b ;remove previous command ora c ;set to new command mov m,a ;replaced in iopb ; the mds-800 controller req's disk bank bit in sector byte ; mask the bit from the current i/o function ani 00100000b ;mask the disk select bit lxi h,ios ;address the sector select byte ora m ;select proper disk bank mov m,a ;set disk select bit on/off ret ; waitio: mvi c,retry ;max retries before perm error rewait: ; start the i/o function and wait for completion call intype ;in rtype call inbyte ;clears the controller ; lda dbank ;set bank flags ora a ;zero if drive 0,1 and nz if 2,3 mvi a,iopb and 0ffh ;low address for iopb mvi b,iopb shr 8 ;high address for iopb jnz iodr1 ;drive bank 1? out ilow ;low address to c jnz insta1 in dstat ret insta1: in dstat+10h ret ; ; ; ; data areas (must be in ram) dbank: db 0 ;disk bank 00 if drive 0,1 ; 10 if drive 2,3 iopb: ;io parameter block db 80h ;normal i/o operation iof: db readf ;io function, initial read ion: db 1 ;number of sectors to read iot: db offset ;track number ios: db 1 ;sector number iod: dw buff ;io address ; ; ; define ram areas for bdos operation endef end åååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå Ã!4¾Èw_ÍÉ#~þ ʸ ÞAÉ:4É~ÍÞ~#þ ¼ > ÍÞÉ\ þ?Ê» w#ÂÒ É! ͼ Ã? ÍþÿÀ!¹ͼ ÃÍþÿÀ!)ͼ ÃÃÍþÿÀ!Ðͼ Ã:5Í¡ É:6þÈþÉ:6Í¡ É:7ÍÃ!4¾Èw_ÍÉ#~þ ʸ ÞAÉ:4É~ÍÞ~#þ ¼ > ÍÞÉ\ þ?Ê» w#ÂÒ É! ͼ Ã? ÍþÿÀ!¹ͼ ÃÍþÿÀ!)ͼ ÃÃÍþÿÀ!Ðͼ Ã:5Í¡ É:6þÈþÉ:6Í¡ É:7Í>üÓR>ÓPÛPæ Â>ÓPÛPÒ+>øÓR>üÓRÛPæÊ!ÃÛPOÛP‘Ê.ÛP‘Â4ÛP‘Ê:>ÓQ¯ÓSÓS>ÓS>€ÓS>ÓQÛPæÊUÛSo_ÛSgWÛSÂdéååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååision number 2.2 ***************************************************************** * The following equates define the console and printer * * environments. * ***************************************************************** ***************************************************************** * * * Define the console driver to be used. * * * * contyp is: 0 Nothing, used for patching to PROM's. * * 1 Provide for 128 bytes of patch space. * * 2 Multi I/O or Decision I driver. * * 3 2D/B driver. * * * ***************************************************************** contyp equ 2 ***************************************************************** * * * Define the printer driver to be used. * * * * lsttyp is: 0 Nothing, used for patching to PROM's. * * 1 Provide for 128 bytes of patch space. * * 2 Multi I/O serial, no protocol. * * 3 Multi I/O serial, CTS protocol. * * 4 Multi I/O serial, DSR protocol. * * 5 Multi I/O serial* splitting a disk to less then 2 or 3 parts would make * * partitions that are greater than 8 megabytes in length. * * * ***************************************************************** stdlog equ 0 ;Set to 0 to use standard logical disks if stdlog ne 0 logdsk equ stdlog ;Set to number of user selected else ; logical disks logdsk equ 3*m26+3*m20+2*m10 ;Default logical disks per drive endif fujitsu equ m20 or m10f mrev equ 26*m26+20*m20+10*m10 ;Hard disk type hdspt equ 32*m26+21*m20+21*m10 ;Sectors per track ***************************************************************** * * * The following equates relate the Morrow Designs 2D * * controller. If the controller is non standard (0F800H) * * only the ORIGIN equate need be changed. * * * ***************************************************************** if maxflop ne 0 ;Include Discus 2D ? origin equ 0F800H djram equ origin+400h ;Disk Jockey 2D RAM address djboot equ origin ;Disk Jockey 2Då, Xon / Xoff protocol. * * 6 Multi I/O parallel, Centronics. * * 7 Multi I/O parallel, Diablo HyType II. * * * * Note: The Decision board is functionally identical to the * * Multi I/O board for printer I/O. Selections 2 - 6 * * will work on the Decision I. * * * ***************************************************************** lsttyp equ 3 ***************************************************************** * * * The next equate determines if you have a Multi I/O Rev 3 * * or a Decision I mother board for parallel i/o. If are not * * using either of these boards then you need not worry about * * this equate. If you are using a Multi I/O rev. other than * * 3.x then you should set multr3 to 0. * * * ***************************************************************** multr3 equ 1 ;0 = Decision, 1 = Multi I/O if contyp eq 2 congrp equ 1 ;Cosole port (1 = p1, 2 = p2, 3 = p3) endif if lsttyp ge 2 lstgrp equ 3 ;Printer port (1 = p1, 2 = p initialization djcin equ origin+3h ;Disk Jockey 2D character input routine djcout equ origin+6h ;Disk Jockey 2D character output routine djhome equ origin+9h ;Disk Jockey 2D track zero seek djtrk equ origin+0ch ;Disk Jockey 2D track seek routine djsec equ origin+0fh ;Disk Jockey 2D set sector routine djdma equ origin+012h ;Disk Jockey 2D set DMA address djread equ origin+15h ;Disk Jockey 2D read routine djwrite equ origin+18h ;Disk Jockey 2D write routine djsel equ origin+1bh ;Disk Jockey 2D select drive routine djtstat equ origin+21h ;Disk Jockey 2D terminal status routine djstat equ origin+27h ;Disk Jockey 2D status routine djerr equ origin+2ah ;Disk Jockey 2D error, flash led djden equ origin+2dh ;Disk Jockey 2D set density routine djside equ origin+30h ;Disk Jockey 2D set side routine dblsid equ 8 ;Side bit from controller io equ origin+3f8h ;Start of I/O registers dreg equ io+1 cmdreg equ io+4 clrcmd equ 0d0h endif ********************************************************************************************************************************* * * * Cbios for CP/M Ver 2.2 for Disk Jockey 2D Mod. B * * controller. Handles diskettes with sector sizes of 128 * * bytes single density, 256, 512, 1024 bytes double * * density. There are conditional assemblies for the * * Diskus Hard Disk Controller. * * * * Note: The system diskette (drive A:) has to have 1024 * * byte sectors in order for the cold and warm boot * * loaders to work. Be sure to format all new * * system diskettes with 1024 byte sectors. The * * system diskette can be either single or double * * sided. The sector size on normal (non A: drive) * * diskettes can be 128, 256, or 1024 bytes in * * either single or double density. * * * * Software engineering, Morrow Designs 11/81 * * * ***************************************************************** title '*** Cbios For CP/M Ver. 2.2 ***' revnum equ 29 ;Cbios revision number 2.9 cpmrev equ 22 ;CP/M rev2, 3 = p3) endif ***************************************************************** * * * The following equates set up the relationship between the * * 2D floppies and the Hard Disk Controllers. * * * ***************************************************************** first equ 1 ;0 = Floppies are A,B,C,D drives and ; Hard Disk are E,F,G,H ;1 = Hard Disks are A,B,C,D drives and ; Floppies are E,F,G,H maxhd equ 1 ;Set to number of hard disks maxflop equ 4 ;Set to number of floppies M26 equ 0 ;Set only one of these variables M20 equ 1 M10F equ 0 M10M equ 0 m10 equ m10f or m10m ***************************************************************** * * * The next equate will set the number of logical disks on a * * physical hard disk drive. The user must set stdlog to a * * vaule greater than or equale to 2 for an m10 or 3 for an * * m20 or m26. The reason for this is that CP/M can not * * address more than 8 megabytes per logical disk and *  * * * * The following block will define cerain 2DB entry points in * * case the user is not actually using the 2DB's disks but is * * using the 2DB's console driver PROM. * * * ***************************************************************** if (maxflop eq 0) and (contyp eq 3) origin equ 0F800H djcin equ origin+3h ;Disk Jockey 2D character input routine djcout equ origin+6h ;Disk Jockey 2D character output routine djtstat equ origin+21h ;Disk Jockey 2D terminal status routine endif ***************************************************************** * * * The following equates are for the Diskus Hard disk wanted. * * * ***************************************************************** if maxhd ne 0 ;Want Hard Disk included ? hdorg equ 50h ;Hard Disk Controller origin hdstat equ hdorg ;Hard Disk Status hdcntl equ hdorg ;Hard Disk Control hddata equ hdorg+3 ;Hard Disk Data hdfunc equ hdorg+2 ;Hard Disk Function hdcmnd equ hdorg+1 ;Hard Disk Commddresses for group zero gzero equ 0 daisy0 equ mbase ;Daisy input ports daisy1 equ mbase+1 sensesw equ mbase+1 ;Sense switches if multr3 eq 0 ;Daisy output ports are different daisi0 equ mbase ; for Decision I and Multi I/O. daisi1 equ mbase+1 ;These two are the Decision I ports else daisi0 equ mbase+1 ; and these are the Multi I/O's. daisi1 equ mbase endif ; Define daisy 0 status input bits ribbon equ 01h ;End of ribbon paper equ 02h ;Paper out cover equ 04h ;Cover open pfrdy equ 08h ;Paper feed ready crrdy equ 10h ;Carriage ready pwrdy equ 20h ;Print wheel ready check equ 40h ;Printer check (error) ready equ 80h ;Printer ready ; Define daisy 0 status input bits for Diablo HyType II driver crstrd equ 1020h ;Carriage ready pfstrd equ 810h ;Paper feed ready pwstrd equ 2040h ;Print wheel ready ; Define daisy 0 output bits d9 equ 01h ;Data bit 9 d10 equ 02h ;Data bit 10 d11 equ 04h ;Data bit 11 d12 equ 08h ;Data bit 12 pfstb equ 10h ;Patries on disk i/o before error clear equ 'Z'-64 ;Clear screen on an ADM 3 anul equ 0 ;Null aetx equ 'C'-64 ;ETX character aack equ 'F'-64 ;ACK character abel equ 'G'-64 ;Bell abs equ 'H'-64 ;Back Space aht equ 'I'-64 ;Horizontal tab acr equ 'J'-64 ;Carriage return avt equ 'K'-64 ;Vertical tab aff equ 'L'-64 ;Form Feed alf equ 'M'-64 ;Line feed xon equ 'Q'-64 ;Xon character xoff equ 'S'-64 ;Xoff character aesc equ 1bh ;Escape character ars equ 1eh ;RS character aus equ 1fh ;US character asp equ ' ' ;Space adel equ 7fh ;Delete ***************************************************************** * * * The jump table below must remain in the same order, the * * routines may be changed, but the function executed must be * * the same. * * * ***************************************************************** org bios ;Cbios starting address jmp cboot ;Cold boot entry point wboote jmp wboot ;Warm boot entry point if contyp ne 0 const jmp cand hdreslt equ hdorg+1 ;Hard Disk Result retry equ 2 ;Retry bit of result tkzero equ 1 ;Track zero bit of status opdone equ 2 ;Operaction done bit of status complt equ 4 ;Complete bit of status tmout equ 8 ;Time out bit of status wfault equ 10h ;Write fault bit of status drvrdy equ 20h ;Drive ready bit of status index equ 40h ;Index bit of status pstep equ 4 ;Step bit of function nstep equ 0fbh ;Step bit mask of function hdrlen equ 4 ;Sector header length seclen equ 512 ;Sector data length wenabl equ 0fh ;Write enable wreset equ 0bh ;Write reset of function scenbl equ 5 ;Controller control dskclk equ 7 ;Disk clock for control mdir equ 0f7h ;Direction mask for function null equ 0fch ;Null command idbuff equ 0 ;Initialize data command isbuff equ 8 ;Initialize header command rsect equ 1 ;Read sector command wsect equ 5 ;Write sector command endif ***************************************************************** * * * The folowing equates will define thper feed strobe crstb equ 20h ;Carriage strobe pwstb equ 40h ;Print wheel strobe restore equ 80h ;Printer restore (Ribbon lift on Multi I/O) ; Define clock select bits rlift equ 40h ;Ribbon lift pselect equ 80h ;Select (Not used by Diablo) ; Define group select bits s0 equ 01h ;Group number (0-3) s1 equ 02h smask equ 03h bank equ 04h enint equ 08h restor equ 10h ;Printer restore on Multi I/O denable equ 20h ;Driver enable on Multi I/O ; Define special constants for the HyTyp II driver cperi equ 10 ;Default to 10 characters per inch lperi equ 6 ;Default lines per inch hinc equ 120 ;Horizontal increments per inch vinc equ 48 ;Vertical increments per inch numtabs equ 160 ;Number of horizontal tabs maxchrs equ 1024 ;Maximum number of printer characters to queue maxrgt equ 1584 ;Maximum carriage position dfrmln equ 110 ;Forms length times 10 autolf equ 0 ;Default to no Auto line feed. endif ***************************************************************stty ;Console status routine cin jmp ciflsh ;Console input cout jmp cotty ;Console output else jmp $ ;Console status routine PROM pointer cin jmp $ ;Console input PROM pointer cout jmp $ ;Console output PROM pointer endif if lsttyp ne 0 jmp list ;List device output else jmp cout ;List device output endif jmp punch ;Punch device output jmp reader ;Reader device input jmp home ;Home drive jmp setdrv ;Select disk jmp settrk ;Set track jmp setsec ;Set sector jmp setdma ;Set DMA address jmp read ;Read the disk jmp write ;Write the disk if lsttyp ne 0 jmp listst ;List device status else jmp $ ;List device status endif jmp sectran ;Sector translation if maxflop ne 0 djdrv jmp djsel ;Hookup for SINGLE.COM program else jmp donop endif ***************************************************************** * * * The following two words define the default baud rate for * * the console and the LST: devices. These words must e Decision I mother * * board I/O or the Multi I/O environments if needed. * * * ***************************************************************** multio equ (contyp eq 2) or (lsttyp ge 2) ;Multi I/O board used? if multio ;Define Multi I/O environment mbase equ 48h ;Base address of Multi I/O or Decision I grpsel equ mbase+7 ;Group select port dll equ mbase ;Divisor (lsb) dlm equ mbase+1 ;Divisor (msb) ier equ mbase+1 ;Interupt enable register clk equ mbase+2 ;WB14 printer select port lcr equ mbase+3 ;Line control register lsr equ mbase+5 ;Line status register msr equ mbase+6 rbr equ mbase ;Read data buffer thr equ mbase ;Tranmitter data buffer dlab equ 80h ;Divisor latch access bit thre equ 20h ;Status line THRE bit cts equ 10h ;Clear to send dsr equ 20h ;Data set ready dr equ 1 ;Line status DR bit wls0 equ 1 ;Word length select bit 0 wls1 equ 2 ;Word length select bit 1 for 8 bit word stb equ 4 ;Stop bit count - 2 stop bits ; Define multi I/O ports a** * * * CP/M system equates. If reconfiguration of the CP/M system * * is being done, the changes can be made to the following * * equates. * * * ***************************************************************** msize equ 48 ;Memory size of target CP/M bias equ (msize-20)*1024 ;Memory offset from 20k system ccp equ 2500h+bias ;Console command processor bdos equ ccp+800h ;BDOS address bios equ ccp+1600h ;Cbios address offsetc equ 2100h-bios ;Offset for sysgen cdisk equ 4 ;Address of last logged disk buff equ 80h ;Default buffer address tpa equ 100h ;Transient memory intioby equ 0 ;Initial IOBYTE iobyte equ 3 ;IOBYTE location wbot equ 0 ;Warm boot jump address entry equ 5 ;BDOS entry jump address ***************************************************************** * * * The following are internal Cbios equates. Most are misc. * * constants. * * * ***************************************************************** retries equ 10 ;Max re  * * immediatly follow the Cbios jump table so that the user * * can easly modify them and that they will also be used in * * the future by Morrow Designs software. * * * * The following is a list of possible baud rates and the * * value needed for the defcon or deflst words. * * * * Baud rate defcon Baud rate defcon * * 50 2304 2000 58 * * 75 1536 2400 48 * * 110 1047 3600 32 * * 134.5 857 4800 24 * * 150 768 7200 16 * * 300 384 9600 12 * * 600 192 19200 6 * * 1200 96 38400 3 * * 1800 64 56000 2 * * * ***************************************************************** defcon dw 12 ;Console baud rate deflst dw 12 ;Printer baud rate ***************************************************************** * * * The next byte is to make sure that the group select byte * * on the Mult I/O or Decsion I stays consistant throughout * * the Cbios. Only the group bits the****************** * * * contyp: 2 Multi I/O or Decision I console driver * * * ***************************************************************** if contyp eq 2 ***************************************************************** * * * Thió driveò oî colä booô wilì inspecô bitó 1-³ oæ thå senså * * switches® Iæ thå valuå founä ió iî thå rangå 0-¶ theî thå * * consolå bauä ratå wilì bå takeî froí thå ratå table® * * Otherwiså thå currenô divisoò latcè valuå wilì bå checked® * * Iæ thå divisoò seemó tï bå oë theî nï actioî wilì bå takeî * * aó faò aó thå bauä ratå settinç goes® Iæ thå divisoò ió noô * * oë theî thå bauä ratå wilì bå seô froí the DEFCON word * * which is found just below the regular Cbios jump table. Thå * * standarä divisoò tablå ió giveî below. * * * * Sense switch: 123 (0 = off, 1 = on) * * 000 = 110 * * 001 = 300 * * 010 = 1200 * * 011 = 2400 * * 100 = 4800 * * 101 = 9600 * * 110 = 19200 * ********************************************************* if contyp eq 3 cotty jmp djcout ;Console output citty jmp djcin ;Console input cstty call djtstat ;Console status mvi a,0ffh rz inr a ret endif ;2DB ***************************************************************** * * * LST: device driver routines. * * * * Routine used depends on the value of lsttyp. Possible * * lsttyp values are listed as follows: * * * * lsttyp is: 0 Nothing, used for patching to PROM's. * * 1 Provide for 128 bytes of patch space. * * 2 Multi I/O serial, no protocol. * Š* 3 Multi I/O serial, CTS protocol. * * 4 Multi I/O serial, DSR protocol. * * 5 Multi I/O serial, Xon / Xoff protocol. * * 6 Multi I/O parallel, Centronics. * * 7 Multi I/O parallel, Diablo HyType II. * * * ***************************************************************** ***************************************************************** * * * lsttyp: 1 Blank spamselves (bits 0 and 1) * * should be changed as you output to the group port. If * * you modify one of the other bits (such a driver-enable) * * then you should modify the same bit in the group byte * * provided. Example: * * * * ;Select console group * * lda group ;Get group byte * * ori congrp ;Select the console port * * out grpsel ;Select the group * * * * ;Modify a bit in the group byte * * lda group ;Get group byte * * ori bank ;Set the bank bit * * sta group ;Save new group setting * * ori group2 ;Select second serial port * * out grpsel ;Select the desired group * * * * Note: You should not set the group bits themselves in * * the group byte. * * * ***************************************************************** group db 0 ;Group byte ***************************************************************** * * * Console driver routines. * * * * Routine used depends on the value of contyp. Possi defcon = 9600 * * * * Note: If you are compiling with multr3 (a Multi I/O) then * * the switches will not be available so the baud rate * * will be taken from defcon. * * * ***************************************************************** ***************************************************************** * * * Duå tï itó length¬ thå tiniô routine driveò ió belowå thå * * cbooô routine. * * * ***************************************************************** ***************************************************************** * * * Read a character from the serial port. * * * ***************************************************************** citty lda group ;Get group byte ori congrp ;Select console out grpsel conin1 in lsr ;Read status register ani dr ;Wait till character ready jz conin1 in rbr ;Read character ani 7fh ;Strip parity ret ***************************************************************** * ce for printer driver * * * * Noteº Iæ thå useò planó tï utilizå thió spacå theî thå * * onå timå codå sucè aó liniô soulä bå placeä jusô belo÷ * * thå cbooô routine® Thió spacå (belowå cboot© ió recyleä * * foò uså aó á disë buffeò afteò cbooô ió done. * * * ***************************************************************** if lsttyp eq 1 linit equ $ ;Make it easy to find this place list equ $ listst equ $ ret ds 127 endif ;Blank space ***************************************************************** * * * lsttyp: 2 Serial printer, no protocol * * * * lsttyp: 3 Serial printer, CTS protocol * * * * lsttyp: 4 Serial printer, DSR protocol * * * * lsttyp: 5 Serial printer, Xon / Xoff protocol * * * ***************************************************************** if (lsttyp ge 2) and (lsttyp le 5) list lda group ;Get group byte ori lstgrp ;Select list device out grpsel ll in lsr ani thre ;Wait tble * * contyp values are listed as follows: * * * * contyp is: 0 Nothing, used for patching to PROM's. * * 1 Provide for 128 bytes of patch space. * * 2 Multi I/O or Decision I driver. * * 3 2D/B driver. * * * ***************************************************************** ciflsh call flush ;Flush disk buffers on input jmp citty ***************************************************************** * * * contyp: 1 Blank space for console driver * * * * Noteº Iæ thå useò planó tï utilizå thió spacå theî thå * * onå timå codå sucè aó tiniô soulä bå placeä jusô belo÷ * * thå cbooô routine® Thió spacå (belowå cboot© ió recyleä * * foò uså aó á disë buffeò afteò cbooô ió done. * * * ***************************************************************** if contyp eq 1 tinit equ $ ;Make it easy to find this place cotty equ $ Šcitty equ $ cstty equ $ ret ds 127 endif ;Blank space *********************************************** * * Output a character to serial port. * * * ***************************************************************** cotty lda group ;Get group byte ori congrp ;Select console out grpsel conout1 in lsr ;Read status ani thre ;Wait till transmitter buffer empty jz conout1 mov a,c ;Character is in (c) out thr ;Output to transmitter buffer ret Š ***************************************************************** * * * Return serial port status. Returns zero if character is not * * ready to be read. Else returns 255 if ready. * * * ***************************************************************** cstty lda group ;Get group byte ori congrp ;Select console out grpsel in lsr ;Read status register ani dr rz ;No charactter ready mvi a,0ffh ;Character ready ret endif ;Multi I/O or Decision I ***************************************************************** * * * contyp: 3 2DB console driver * * * ********* ill transmitter buffer empty jz ll ***************************************************************** * * * The CTS driveò ió useä foò á printeò witè hardware * * handshakinç (TÉ 810)® Iô shoulä bå connecteä tï the CTS * * inpuô oî thå lisô devicå seriaì port. * * * ***************************************************************** if lsttyp eq 3 ;CTS protocol in msr ani cts ;Wait till clear to send jz ll Š endif ***************************************************************** * * * The DSR driveò ió useä foò á printeò witè hardware * * handshakinç (TÉ 810)® Iô shoulä bå connecteä tï the DSR * * inpuô oî thå lisô devicå seriaì port. * * * ***************************************************************** if lsttyp eq 4 ;DSR protocol in msr ani dsr jz ll ;Wail till DSR comes up endif ***************************************************************** * * * Thå Xon/Xofæ driveò ió useä foò á printeò witè softwarå * * hands * 13 slct -> 4 /ribbon * * 14 /auto feed xt <- 1 /d10 * * 15 NC * * 16 0V <-> 2 GND * * 17 chassis gnd * * 18 NC * * 19 /strobe rtn <-> 8 GND * * 20 data1 rtn <-> 11 GND * * 21 data2 rtn <-> 14 GND * * 22 data3 rtn <-> 16 GND * * 23 data4 rtn <-> 18 GND * * 24 data5 rtn <-> 20 GND * * 25 data6 rtn <-> 22 GND * * 26 data7 rtn <-> 25 GND * * 27 data8 rtn <-> 38 GND * * 28 /acknlg rtn <-> 41 GND * * 29 busy rtn <-> 44 GND * * 30 pe rtn <-> 47 GND * * 31 /init <- 9 /d11 * * 32 /error -> 5 /cover * * 33 GND <-> 35 GND * * 34 NC * * 35 /slct in <- 10 /d12 * * 35 <-> 24 /Select * * * * IMPORTANT: For this interface to work /select (24) on the * * parallel conector must be tied to ground (35). * * * ***************************************************************** list lda group ;Get group byte out grpsel rl in daisy0 ;Wait till printer ready and selected ani ready+paper jz rl pl in daesc ars c set vmi * * aesc aus c set hmi * * * ***************************************************************** list lda group ;Set printer initialized flag ori denable sta group moö a,ã ;Geô thå characteò tï print ani 7fh ;Strip off parity rz cpi adel ;Ignore delete rz mov c,a ;Save character lda escflg lxi h,level0 ;Level zero characters ana a mov a,c ;Scan for char in A jz lookup ;Look up activity for this character lda escflg lxi h,level1 ;Single character escape sequences cpi aesc mov a,c ;Scan for char in A jz lookup ;Execute single level escape sequence lxi h,level2 ;Two character escape sequence lda escflg ***************************************************************** * Lookup scans the table pointed at by HL looking for a match * * of the character in register A. * ***************************************************************** lookup dcr m ;Test if end of table inr m jz gother ;Execute the default functionhakinç (Diablï 630). * * * ***************************************************************** if lsttyp eq 5 ;Xon / Xoff protocol xloop call listst ;Check printer status ora a jz xloop ;Loop if not ready endif mov a,c out thr ret listst lda group ;Get group byte ori lstgrp ;Select list device out grpsel in lsr ;Check if transmitter buffer empty ani thr rz ;Return not ready if lsttyp eq 3 ;CTS protocol in msr ani cts rz ;Return not ready if CTS is false endif if lsttyp eq 4 ;DSR protocol in msr ani dsr rz ;Return not ready if DSR is true endif if lsttyp eq 5 ;Xon / Xoff protocol mvi b,xon ;Last character recieved from printer lstflg equ $-1 in lsr ani dr ;Check for a character jz xskip ;No character present in rbr ;Get character Š ani 7fh mov b,a ;Save sta lstflg ;Kludge flag (last character recieved) xskip mov a,b sui xoff ;Check for Xoff char (control S) jnz xsdone ;Printer ready ret ;Printer aisy0 ;Test if out of paper ani ribbon jnz pl el in daisy0 ani cover jnz el mov a,c ;Move character into (a) out daisi1 ;Latch data mvi a,d11+d10+d9 ;Make sure strobe is high out daisi0 dcr a ;Pulse strobe low out daisi0 inr a out daisi0 Šack in daisy0 ;Wait till ready again ani ready jz ack ret listst lda group ;Get group byte out grpsel ;Select group zero in daisy0 ;Wait till printer ready and selected ani ready+paper rz in daisy0 ;Test if out of paper ani ribbon rz in daisy0 ani cover xri cover rz dcr a ret endif ;Centronics parallel if lsttyp eq 7 ;Diablo HyTyp II ***************************************************************** * Diablo 1610 simulator for the Morrow Designs / Thinker Toys * * Mult I/O board. The simulator makes the parallel Hytyp II * * look like a serial 1610. * ***************************************************************** ***************************************************************** cmp m ;Otherwise test for a match jz gother inx h ;Bump over character inx h ;Bump over function address inx h jmp lookup gother inx h ;Bump over character mov a,m ;Get low byte of function address inx h mov h,m ;Get high byte of function address mov l,a ;Form Address of function pchl ;Execute it Š***************************************************************** * Each of the following tables contains entries of the form: * * 1 byte character to match * * 2 bytes of address to execute * * terminated by a first byte of 0. * ***************************************************************** level0 db aesc dw doaesc ;Beginning of an escape sequence db aff dw doaff ;Form feed db aetx dw doaetx db aht dw doaht ;horizontal tab db alf dw doalf ;Line feed db asp dw doasp ;Space db abs dw doabs ;Back space db acr dw doacr ;Carriage return db 0 dw dochar ;Any other character level1 db '1' dw sethtab ;Set horizontal tab not ready xsdone equ $ ;Printer ready for data endif mvi a,0ffh ret ;Printer ready endif ;Multi I/O serial ***************************************************************** * * * lsttyp: 6 Centronics parallel printer driver. * * * ***************************************************************** if lsttyp eq 6 ***************************************************************** * * * Decision I Diablo parallel to Centronics parallel interface. * * * * The following cable must be made from the 50 pin Diablo * * conector to the 35 pin Centronics. * * * * Centronics Multi I/O * * pin signal pin signal * * 1 /strobe <- 46 /d9 * * 2 data1 <- 37 /d1 * * 3 data2 <- 36 /d2 * ª ´ data3 <- 3¹ /d3 * * 5 data4 <- 33 /d4 * * 6 data5 <- 40 /d5 * * 7 data6 <- 42 /d6 * * 8 data7 <- 43 /d7 * * 9 data8 <- 45 /d8 * Š* 10 /acknlg -> 12 /check * * 11 busy -> 28 /printer ready * * 12 pe -> 3 /paper *  * * * Thió routinå doeó alì oæ thå characteò decoding¬ escapå *� * sequenceó forward¬ backward¬ etc® Thå lisô oæ escapå *� * sequences¬ anä speciaì characteró recognizeä is: * * * * adel ignored * * anul ignored * * aack ignored (when received) * * abel ignored * * aff form feed * * aetx etx/ack handshake * * aht horizontal tab * * alf line feed * * asp space * * abs backspace * * acr carriage return * * aesc 0 ignored * * aesc 1 set tab stop at current print position * * aesc 2 clear all tab stops * * aesc 3 graphics mode on * * aesc 4 graphics mode off * * aesc 5 forward print * Š* aesc 6 backward print * * aesc 8 clear tab stop * * aesc 9 set left margin * * aesc A ignored * * aesc B ignored * * aesc D negative half line feed * * aesc U half line feed * * aesc alf negative line feed * * aesc aht c absolute horizontal tab * * aesc avt c absolute vertical tab * * db '2' dw clrall ;Clear all horizontal tabs db '3' dw setgrp ;Graphics mode db '4' dw clrgrp ;Clear graphics mode db '5' dw clrdir ;Forward printing db '6' dw setdir ;Backward printing db '8' dw clrhtab ;Clear horizontal tab db '9' dw setlmar ;Set left margin db '0' dw func1 ;No operation level 1 db 'A' dw func1 db 'B' dw func1 db 'a' dw func1 db 'b' dw func1 db 'D' dw neghlf ;Negative half line feed db 'U' Š dw poshlf ;Half line feed db alf dw neglf ;Negative line feed db aht dw settwo ;Two character escape sequence db avt dw settwo db ars dw settwo db aus dw settwo db 0 dw func1 level2 db aht dw abshtab ;Absolute horizontal tab db avt dw absvtab ;Absolute vertical tab db ars dw setvmi db aus dw sethmi db 0 dw func2 ***************************************************************** * The following routines execute escape sequences, etc. * ********************************************************Get current position xchg lhld dlhpos ;Get offset dad d shld lmar jmp func1 setvmi mov l,c ;Set the motion index mvi h,0 dcx h shld vmi jmp func2 sethmi mov l,c mvi h,0 dcx h shld hmi jmp func2 poshlf call hlfvmi ;Half line feed vmi call adjvp jmp func1 neghlf call hlfvmi ;Negative half line feed call neghl call adjvp jmp func1 hlfvmi lhld vmi ;Get vmi for full line feed divid2 mov a,h ;High byte ora a ;Clear the carry rar mov h,a mov a,l rar mov l,a ret abshtab mov e,c ;Absolute horizontal tab mvi d,0 dcx d ;Form 16 bit tab column call newdlh jmp func2 Šnewdlh lhld hmi call hltde ;Multiply by hmi xchg lhld hpos ;And subtract current horizontal position xchg call hlmde shld dlhpos ret absvtab mov e,c ;Absolute vertical tab mvi d,0 dcx d lhld vmi call hltde ;Multiply by vmi xchg lhld vpos ;And subtract the current vertical position xchg call hlmde shld dlvpos jmp func2 sethtab ca ***************************************************************** * Hlmde subtracts DE from HL and returns. * ***************************************************************** hlmde xchg call neghl xchg dad d ret ***************************************************************** * Hlcde compares HL with DE. On return the Z flag is set if * * they are equal, the Carry flag is set if HL is less than DE. * ***************************************************************** hlcde mov a,h cmp d rnz mov a,l cmp e ret ***************************************************************** * Divide the number in HL by the number in DE. Return the * * quotient in HL and the remainder in DE. * ***************************************************************** hldde mov a,d ;Start by negating DE and cma ; moving the left operand to BC mov b,a mov a,e cma mov c,a inx b mvi a,16 ;Repeat count in reg A lxi d,0 ;Initial remainder is zero div3 dcr a ;Test if done ********* settwo doaesc mov a,c ;Get the escape character sta escflg func0 ret doaetx ret doalf call lfvmi ;Get line feed vmi adjvp xchg lhld dlvpos ;Get vertical motion displacement dad d shld dlvpos ret lfvmi lda grhflg ana a lxi h,1 ;Only 1/48 if in graphics mode rnz lhld vmi ;Get vertical motion index ret neglf call lfvmi ;Get line feed vmi call neghl call adjvp jmp func1 Šdoasp call sphmi ;Get space horizontal motion spdir lda dirflg ;Forward or backwards ? ana a cnz neghl ;Negate HL adjhp xchg ;Adjust Horizontal position lhld dlhpos ;Get current adjustment dad d ;Update it shld dlhpos ;And save ret sphmi lda grhflg ;In graphics mode ? ana a lxi h,2 ;Only 1/60 if in graphics mode rnz lhld hmi ret doabs call sphmi ;Space increment call neghl ;Negative to start with jmp spdir ;Adjust backwards doacr xra a sta dirflg ;Forward printing sta grhflg ;No graphics mode lhld hpos ;Get current offset xchll tabcol ;Set horizontal tab orá í ;OÒ iî taâ stop mov m,a ; and save jmp func1 tabcol lhld hpos ;Compute address of current character col xchg lhld dlhpos dad d ;Get logical position xchg lhld hmi ;And divide by hmi to get character column xchg call hldde mtabp ;Make a tab pointer ;HL -> Tab column desired (1-160) ;HL <- address of tab stop ; A <- bit mask for tab stop lxi d,8 ;Number of stops per byte call hldde ;HL/DE -> HL, HL mod DE -> DE mov c,e ;Save inr c ;Make range (1-8) lxi d,tabstp ;Tab array dad d ;Make array pointer xra a stc mtab0 rar dcr c ;Bump bit counter jnz mtab0 ret clrhtab call tabcol ;Clear horizontal tab cma Š ana m ;Mask out tab stop mov m,a jmp func1 doaht lhld hpos ;Compute address of current character col xchg lhld dlhpos dad d ;Get logical position xchg lhld hmi ;And divide by hmi to get character column xchg call hldde tablop lxi d,numtabs inx h ;Start with next position cal rm ;All done ? dad h ;Shift right operand to the left xchg push psw ;Save carry dad h ;Shift left operand to the left Š pop psw jnc div1 ;Does it fit ? inx h div1 push h dad b jnc div2 xchg inx h xthl pop h jmp div3 div2 pop h xchg jmp div3 ***************************************************************** * Multiply the contents of HL by the contents of DE. * ***************************************************************** hltde mov c,l mov b,h lxi h,0 mult mov a,b ora c rz mov a,b ora a rar mov b,a mov a,c rar mov c,a cc dadde xchg dad h xchg jmp mult dadde dad d ret ***************************************************************** * The routines below actually interface to the printer, * * causing paper feed, carriage, and print wheel motion. * ***************************************************************** carrg lhld dlhpos ;Check for any accumulated motion mov a,h ora l rz lhld hpos ;Check for too g lhld lmar ;Get left margin call hlmde shld dlhpos ;Don't move yet though mvi a,autolf ;In Auto line feed mode ? ana a jnz doalf ;Do line feed also ret dochar mov l,c mvi h,0 call wheel ;Print the character in register C lda grhflg ana a lxi h,0 ;Don't move if in graphics mode jnz spdir lhld hmi jmp spdir clrall equ $ ;Clear all horizontal tabs lxi h,tabstp ;Beginning of tab stop array mvi d,tablen ;Size of tab array (bytes) notblp mvi m,80h ;Reset tabs (reset to 0 later) kludge equ $-1 ;Used on first reset (warmboot) inx h ;Next tab stop dcr d ;Update repeat count jnz notblp ;Continue zeroing func2 equ $ func1 xra a ;Clear escape sequence flag sta escflg ret setgrp mvi a,1 ;Set graphics mode on sta grhflg jmp func1 clrgrp xra a ;Turn graphics mode off Š sta grhflg jmp func1 clrdir xra a ;Forward print mode sta dirflg jmp func1 setdir mvi a,a ;Set backward printing mode sta dirflg jmp func1 setlmar lhld hpos ;l hlcde ;Compare position with number of tabs jnc tofar ;Past last tab push h ;Save col pointer call mtabp ;Generate tab pointer ana m ;Check out tab stop pop h ;Restore col pointer jz tablop ;Loop if stop not set xchg jmp newdlh ;Set new col position and return tofar lhld hpos ;Go all the way to the right xchg lxi h,maxrgt call hlmde shld dlhpos ret doaff lxi h,dfrmln ;Multiply forms length by 48 lxi d,48 call hltde lxi d,10 call hldde ;And divide it by 10 push h ;Save this result lhld vpos ;Get logical vertical position xchg lhld dlvpos dad d pop d push d ;Get copy of forms length call hldde ;HL mod DE xchg pop d xchg call hlmde xchg lhld dlvpos dad d shld dlvpos jmp papr Š***************************************************************** * Neghl forms the twos complement of HL. * ***************************************************************** neghl mov a,h cma mov h,a mov a,l cma mov l,a inx h ret much motion xchg lhld dlhpos dad d mov a,h ana a Š jp lftok lhld hpos call neghl shld dlhpos lftok lhld hpos xchg lhld dlhpos dad d lxi d,maxrgt call hlcde jc rgtok lhld hpos ;Otherwise move only to maxright xchg lxi h,maxrgt call hlmde shld dlhpos rgtok lhld hpos ;Update the horizontal position xchg lhld dlhpos dad d shld hpos lhld dlhpos ;check if required motion is to the left mov a,h ana a mvi c,0 jp posh call neghl mvi c,d11 posh xchg lxi h,0 shld dlhpos ;Reset the horizontal increment xchg mov a,l ani 1 jz nohhlf ;No half spaces mov a,c ori d12 mov c,a nohhlf call divid2 mov a,h ani d9+d10 ora c mov h,a lxi d,crstrd jmp cmnd papr lhld dlvpos ;Check for any paper motion mov a,h ora l rz ;No motion mov a,h ana a mvi c,0 jp posv call neghl Š mvi c,d11 posv mov a,h ani d9+d10 ora c mov h,a push h ;Save paper motion lhld vpos xchg lhld dlvpos ;Get logical position dad d  flag escflg db 0 ;Escape sequence in progress flag Štabstp ds numtabs/8+1 ;Tab stops bit array tablen equ numtabs/8+1 ;Length of tabs array endif ***************************************************************** * * * The following routines are used to make the reader and punch * * devices peform I/O through the console. The user may patch * * here for their particular devices. * * * ***************************************************************** punch jmp cout reader jmp cin ***************************************************************** * * * Gocpm is the entry point from cold boots, and warm boots. It * * initializes some of the locations in page 0, and sets up the * * initial DMA address (80h). * Š* * ***************************************************************** gocpm lxi h,buff ;Set up initial DMA address call setdma mvi a,(jmp) ;Initialize jump to warm boot sta wbot sta entry ;Initialize jump to BDOS lxi h,wbootcold boots. * * * ***************************************************************** wboot lxi sp,tpa ;Set up stack pointer mvi a,1 sta cwflg ;Set cold/warm boot flag if (maxhd ne 0) and first ;Supply Warm Boot from Hard Disk ? xra a mov c,a lxi h,ccp-200h ;Initial DMA address push h sta head mvi a,1 push psw ;Save first sector - 1 call hddrv ;Select drive A mvi c,0 call hdtrk ;Home the drive warmlod pop psw ;Restore sector pop h ;Restore DMA address inr a sta hdsectr cpi 12 ;Past BDOS ? jz gocpm ;Yes, all done inr h ;Update DMA address inr h shld hdadd push h push psw warmrd lxi b,retries*100h+0 ;Retry counter wrmread push b ;Save the retry count call hdread ;Read the sector Š pop b jnc warmlod ;Test for error dcr b ;Update the error count jnz wrmread ;Keep trying if not to many errors hlt ;Error halt db 0 ;Try not to screw up Decision CPU's endif *****************************************************************  push h ;Save for now lxi h,dfrmln ;Get default form length lxi d,48 call hltde ;Multiply by 48 lxi d,10 call hldde ;Divide by 10 pop d xchg call hldde ;Compute HL mod DE xchg shld vpos ;Save new vertical position lxi h,0 shld dlvpos ;Reset vertical motion pop h lxi d,pfstrd ;Paper feed strobe jmp cmnd wheel push h call carrg ;Position the carriage first call papr pop h lxi d,pwstrd cmnd lda group ;Get group byte out grpsel ;Select group zero cmnd0 in daisy0 ana d jz cmnd0 mov a,l ;Negate low data bits cma mov l,a mov a,h ani d9+d10+d11+d12 ;Mask in data bits only cma if multr3 ;Mask out ribbon lift bit on Multi I/O ani 0ffh-restore endif mov h,a mov a,l out daisi1 ;Output low bits mov a,h out daisi0 ;Output high bits xra e ;Slap strobe bits in out daisi0 mov a,h ;And drop strobes back down out daisi0 ret Š ***************************************************************** * New list device status routie ;Address in warm boot jump shld wbot+1 lxi h,bdos+6 ;Address in BDOS jump shld entry+1 xra a ;A <- 0 sta bufsec ;Disk Jockey buffer empty sta bufwrtn ;Set buffer not dirty flag lda cdisk ;Jump to CP/M with currently selected disk in C mov c,a lda cwflg ora a lxi d,coldbeg ;Beginning of initial command mvi a,coldend-coldbeg+1 ;Length of command jz cldcmnd lxi d,warmbeg mvi a,warmend-warmbeg+1 cldcmnd lxi h,ccp+8 ;Command buffer sta ccp+7 mov b,a call movlop lda cwflg ora a lda autoflg jz cldbot rar cldbot rar jc ccp jmp ccp+3 ;Enter CP/M cwflg db 0 ;Cold/warm boot flag ***************************************************************** * * * The following byte determines if an initial command is to be * * given to CP/M on warm or cold boots. The value of the byte is * * used to give the command to CP/M: * * * * 0 = never give command. * * 1 = give command on cold boots only. * * 2 = give the command on warm boots o * * * Floppy disk warm boot loader * * * ***************************************************************** if (maxflop ne 0) and not first ;Supply Warm Boot from 2D ? mvi c,0 call djsel ;Select drive A wrmfail call djhome ;Track 0, single density jc wrmfail ;Loop if error mvi c,0 ;Select side 0 call djside ;The next block of code re-initializes ; the warm boot loader for track 0. mvi a,5-2 ;Initialize the sector to read - 2 sta newsec lxi h,ccp-100h ;First revolution DMA - 100h shld newdma ;Load all of track 0 t0boot mvi a,5-2 ;First sector - 2 newsec equ $-1 inr a ;Update sector # inr a cpi 27 ;Size of track in sectors + 1 jc nowrap ;Skip if not at end of track jnz t1boot ;Done with this track sui 27-6 ;Back up to sector 6 lxi h,ccp-80h ;Memory address of sector - 100h shld newdma nowrap sta newsec ;Save the updated sector # mov c,a call djsec ;Set up the sector lxi h,ccp-100h ;Memory address of sector - 1ne. Returns 0ffh if the printer * * can except another character, otherwise it returns 0. * ***************************************************************** listst lda group ;Check printer initialized flag ani denable rz ;0 = printer not initialized lda group ;Get group byte out grpsel ;Select group zero lxi d,pwstrd in daisy0 ana d xra a rz cma ret ***************************************************************** * Dynamic data locations used by the simulator. * ***************************************************************** hmi dw 0 ;Horizontal motion index. Set by linit ; and escape sequences. vmi dw 0 ;Vertical motion index. Set by linit ; and escape sequences. vpos dw 0 ;Vertical position. Set by platen motion dlvpos dw 0 ;Delta vpos. Set by platen motion hpos dw 0 ;Horizontal position. Set by carriage motion dlhpos dw 0 ;Delta hpos. Set by carriage motion lmar dw 0 ;Left margin dirflg db 0 ;Direction flag grhflg db 0 ;Graphics modenly. * * 3 = give the command on warm and cold boots. * * * ***************************************************************** autoflg db 0 ;Auto command feature ***************************************************************** Š* * * If there is a command inserted here, it will be given if the * * auto feature is enabled. * * For Example: * * * * coldbeg db 'MBASIC MYPROG' * * coldend db 0 * * * * will execute microsoft basic, and mbasic will execute the * * "MYPROG" basic program. * * * ***************************************************************** coldbeg db '' ;Cold boot command goes here coldend db 0 warmbeg db '' ;Warm boot command goes here warmend db 0 ***************************************************************** * * * Wboot loads in all of CP/M except the Cbios, then initializes * * system parameters as in cold boot. See the Cold Boot Loader * * listing for exactly what happens during warm and 00h newdma equ $-2 lxi d,100h ;Update DMA address dad d nowrp shld newdma ;Save the updated DMA address mov b,h mov c,l call djdma ;Set up the new DMA address lxi b,retries*100h+0;Maximum # of errors, track # wrmfred push b call djtrk ;Set up the proper track call djread ;Read the sector pop b jnc t0boot ;Continue if no error dcr b jnz wrmfred ;Keep trying if error jmp djerr ;To many errors, flash the light ;Load track 1, sector 1, sector 3 (partial), sector 2 (1024 byte sectors) Š t1boot mvi c,1 ;Track 1 call djtrk lxi b,ccp+0b00h ;Address for sector 1 lxi d,10*100h+1 ;Retry count + sector 1 call wrmread lxi b,ccp+0f00h ;Address for sector 2 lxi d,10*100h+3 ;Retry count + sector 3 call wrmread lxi b,0300h ;Size of partial sector lxi d,ccp+1300h ;Address for sector 3 lxi h,ccp+0f00h ;Address of sector 3 wrmcpy mov a,m ;Get a byte and stax d ; save it. inx d ;Bump pointers inx h dcx b ;Bump counter mov a,b ;Check if done or * * * ***************************************************************** if (maxhd ne 0) and (maxflop ne 0) ;Both types ? sectran lda cpmdrv ;Get the Drive Number if first cpi maxhd*logdsk ;Over the # of hard disks ? jc tranhd else cpi maxflop ;Over the # of floppies ? jnc tranhd endif endif if (maxhd eq 0) or (maxflop eq 0) ;Just one type ? Šsectran equ $ endif if maxflop ne 0 ;Floppy translation tranfp inx b push d ;Save table address push b ;Save sector # call getdpb ;Get DPB address into HL mov a,m ;Get # of CP/M sectors/track ora a ;Clear cary rar ;Divide by two sub c push psw ;Save adjusted sector jm sidetwo sidea pop psw ;Discard adjusted sector pop b ;Restore sector requested pop d ;Restor address of xlt table sideone xchg ;hl <- &(translation table) dad b ;bc = offset into table mov l,m ;hl <- physical sector mvi h,0 ret sidetwo lxi b,15 ;Offset to side bit dad b mov a,m ani 8 ;Test for double s9, 0ffh, 9, 0ffh db 9, 0ffh, 9, 0ffh, 9, 0, 1, 0, 0, 0, 0, 0, 0, 0 djnext mvi a,1 ;Save 2D initialized flag sta flopflg endif if maxflop ne 0 flopok lxi h,1 ;Select sector 1 of track 1 shld truesec mvi a,1 sta cpmtrk call fill ;Flush buffer and refill jc zret ;Test for error return call djstat ;Get status on current drive ani 0ch ;Strip off unwanted bits push psw ;Used to select a DPB Š rar lxi h,xlts ;Table of XLT addresses mov e,a mvi d,0 dad d push h ;Save pointer to proper XLT call getdpb ;Get DPH pointer into DE xchg ; pop d mvi b,2 ;Number of bytes to move call movlop ;Move the address of XLT lxi d,8 ;Offset to DPB pointer dad d ;HL <- &DPH.DPB push h lhld origin+7 ;Get address of DJ terminal out routine inx h ;Bump to look at address of ; uart status location mov a,m xri 3 ;Adjust for proper rev DJ mov l,a mvi h,(origin+300h)/100h mov a,m ani dblsid ;Check double sided bit lxi d,dpb128s ;Base for single sidea c jnz wrmcpy ; if not, loop lxi b,ccp+0f00h ;Address for sector 2 lxi d,10*100h+2 ;Retry count + sector 2 call wrmread jmp gocpm ;All done, do last inits... wrmread push d call djdma ;Set DMA address pop b call djsec ;Set sector wrmfrd push b ;Save error count call djread ;Read a sector jc wrmerr ;Do retry stuff on error call djstat ;Sector size must be 1024 bytes ani 0ch ;Mask length bits sui 0ch ;Carry (error) will be set if < 0c0h wrmerr pop b ;Fetch retry count rnc ;Return if no error dcr b ;Bump error count jnz wrmfrd jmp djerr ;Error, flash the light endif ***************************************************************** * * * Setsec just saves the desired sector to seek to until an * * actual read or write is attempted. * * * ***************************************************************** setsec mov h,b Š mov l,c shld cpmsec donop ret ;Null SINGLE.COM hookup for no floppies **************************ided jz sidea ;Media is only single sided pop psw ;Retrieve adjusted sector pop b cma ;Make sector request positive inr a mov c,a ;Make new sector the requested sector pop d call sideone mvi a,80h ;Side two bit ora h ; and sector mov h,a ret endif if maxhd ne 0 ;Hard Disk translation routine tranhd mov h,b mov l,c inx h ret endif ***************************************************************** * * * Setdrv selects the next drive to be used in read/write * * operations. If the drive has never been selected before, a * * parameter table is created which correctly describes the * * diskette currently in the drive. Diskettes can be of four * * different sector sizes: * Š* 1) 128 bytes single density. * * 2) 256 bytes double density. * * 3) 512 bytes double density. * * 4) 1024 bytes double density. * * * ***************************************************************** setdrv mov a,c ;Save the drive # sta cpmdrv cpid DPB's jnz sideok lxi d,dpb128d ;Base of double sided DPB's sideok xchg ;HL <- DBP base, DE <- &DPH.DPB pop d ;Restore DE (pointer into DPH) pop psw ;Offset to correct DPB ral ral mov c,a mvi b,0 dad b xchg ;Put DPB address in DPH mov m,e inx h mov m,d endif if (maxhd ne 0) and (maxflop ne 0) jmp setdrv1 ;Skip over the Hard Disk select if not first subfp sui maxflop ;Adjust the drive # endif endif if maxhd ne 0 drvhd call divlog ;Divide by logical disks per drive mov a,c sta hddisk call drvptr mov a,m inr a jnz setdrv1 Š ori null ;Select drive out hdfunc mvi a,scenbl ;Enable the controller out hdcntl mvi c,239 ;Wait approx 2 minutes for Disk to ready lxi h,0 tdelay dcx h mov a,h ora l cz dcrc rz in hdstat ;Test if ready yet ani drvrdy jnz tdelay if not fujitsu lxi h,0 ;Time one revolution of the drive mvi c,index in hdstat ana c mov b,a ;Save current index level in B indx1 in hdstat ana c cmp b *************************************** * * * Setdma saves the DMA address for the data transfer. * * * ***************************************************************** setdma mov h,b ;hl <- bc mov l,c shld cpmdma ;CP/M dma address ret ***************************************************************** * * * Home is translated into a seek to track zero. * * * ***************************************************************** home mvi c,0 ;Track to seek to ***************************************************************** * * * Settrk saves the track # to seek to. Nothing is done at this * * point, everything is deffered until a read or write. * * * ***************************************************************** settrk mov a,c ;A <- track # sta cpmtrk ;CP/M track # ret ***************************************************************** * * * Sectran translates a logical sector # into a physical sector * * #.  maxflop+(maxhd*logdsk) ;Check for a valid drive # jnc zret ;Illegal drive # mov a,e ;Test if drive ever logged in before ani 1 jnz setdrv1 ;Bit 0 of E = 0 -> Never selected before if (maxhd ne 0) and (maxflop ne 0) ;Both types ? lda cpmdrv ;Get the Drive Number if first cpi maxhd*logdsk ;Over the # of hard disks ? jc drvhd sui maxhd*logdsk else cpi maxflop ;Over the # of floppies ? jnc subfp endif endif if (maxflop ne 0) and first mov c,a ;Save drive # mvi a,0 ;Have the floppies been accessed yet ? flopflg equ $-1 ana a jnz flopok mvi b,17 ;Floppies havn't been accessed lxi h,djboot ;Check if 2D controller is installed mvi a,(jmp) clopp cmp m jnz zret inx h inx h inx h dcr b jnz clopp lxi d,djinit ;Initialization sequence lxi h,origin+7e2h ;Load address mvi b,30 ;Byte count call movlop mvi a,0ffh ;Start 1791 sta dreg mvi a,clrcmd ;1791 reset sta cmdreg jmp djnext djinit db 0, 0, 0, 18h, 0, 0, 8, 0, 7eh, 0, 8, 0,  ;Loop util index level changes jz indx1 indx2 inx h in hdstat ;Start counting until index returns to ana c ; previous state cmp b jnz indx2 if m10 ;Memorex M10's have 40 ms head settle dad h endif if m26 ;Shugart M26's have 30 ms head settle xra a mov a,h rar mov d,a mov a,l rar mov e,a dad d endif shld settle ;Save the Count for timeout delay endif call hdhome endif setdrv1 call getdpb ;Get address of DPB in HL lxi b,15 ;Offset to sector size dad b mov a,m ;Get sector size ani 7h Š sta secsiz mov a,m rar rar rar rar ani 0fh sta secpsec xchg ;HL <- DPH ret zret lxi h,0 ;Seldrv error exit ret if maxhd ne 0 dcrc dcr c ;Conditional decrement C routine ret divlog mvi c,0 divlogx sui logdsk rc inr c jmp divlogx endif ***************************************************************** * * * Getdpb returns HL pointing to the DPB of the currently * * selected drive, DE pointing to DPH. * he sector from the disk that contains the * * desired CP/M sector. * * * ***************************************************************** read xra a ;Set the command type to read sta rdwr ;Save command type ***************************************************************** * * * Redwrt calculates the physical sector on the disk that * * contains the desired CP/M sector, then checks if it is the * * sector currently in the buffer. If no match is made, the * * buffer is flushed if necessary and the correct sector read * * from the disk. * * * ***************************************************************** redwrt mvi b,0 ;The 0 is modified to contain the log2 Šsecsiz equ $-1 ; of the physical sector size/128 ; on the currently selected disk. lhld cpmsec ;Get the desired CP/M sector # mov a,h ani 80h ;Save only the side bit mov c,a ;Remember the side mov a,h ani 7fh ;Forget the side bit mov h,a dcx h ;Temporary adjustment divloouffer outof call mover xra a ret into xchg ; call mover ;Move the data, HL = destination ; DE = source mvi a,1 sta bufwrtn ;Set buffer written into flag mvi a,0 ;Check for directory write writtyp equ $-1 dcr a mvi a,0 sta writtyp ;Set no directory write rnz ;No error exit ***************************************************************** * * * Flush writes the contents of the buffer out to the disk if * * it has ever been written into. * * * ***************************************************************** flush mvi a,0 ;The 0 is modified to reflect if ; the buffer has been written into bufwrtn equ $-1 ana a ;Test if written into rz ;Not written, all done if (maxhd ne 0) and (maxflop ne 0) lxi h,djwrite ;Write operation for Disk Jockey Š lxi d,hdwrite ;Write operation for Hard Disk call decide else if maxhd ne 0 lxi h,hdwrite endif if maxflop ne 0 lxi h,djwrite endif endif ******************************** * * ***************************************************************** getdpb lda cpmdrv mov l,a ;Form offset mvi h,0 dad h dad h dad h dad h lxi d,dpbase ;Base of DPH's dad d push h ;Save address of DPH lxi d,10 ;Offset to DPB dad d mov a,m ;Get low byte of DPB address inx h mov h,m ;Get low byte of DPB mov l,a pop d ret ***************************************************************** * * * Xlts is a table of address that point to each of the xlt * * tables for each sector size. * Š* * ***************************************************************** if maxflop ne 0 xlts dw xlt128 ;Xlt for 128 byte sectors dw xlt256 ;Xlt for 256 byte sectors dw xlt512 ;Xlt for 512 byte sectors dw xlt124 ;Xlt for 1024 byte sectors endif ***************************************************************** * * * Write routine moves data from memory into the buffer. If the * * desired CP/M sector is not contained in the disk bup dcr b ;Update repeat count jz divdone ora a mov a,h rar mov h,a mov a,l rar ;Divide the CP/M sector # by the size ; of the physical sectors mov l,a jmp divloop ; divdone inx h mov a,h ora c ;Restore the side bit mov h,a shld truesec ;Save the physical sector number lxi h,cpmdrv ;Pointer to desired drive,track, and sector lxi d,bufdrv ;Pointer to buffer drive,track, and sector mvi b,5 ;Count loop dtslop dcr b ;Test if done with compare jz move ;Yes, match. Go move the data ldax d ;Get a byte to compare cmp m ;Test for match inx h ;Bump pointers to next data item inx d jz dtslop ;Match, continue testing ***************************************************************** * * * Drive, track, and sector don't match, flush the buffer if * * necessary and then refill. * * * ***************************************************************** call fill ;Fill the buffer with correct physical sector rc ;No good, return with ********************************* * * * Prep prepares to read/write the disk. Retries are attempted. * * Upon entry, H&L must contain the read or write operation * * address. * * * ***************************************************************** prep di ;Reset interrupts xra a ;Reset buffer written flag sta bufwrtn shld retryop ;Set up the read/write operation mvi b,retries ;Maximum number of retries to attempt retrylp push b ;Save the retry count lda bufdrv ;Get drive number involved in the operation if (maxhd ne 0) and (maxflop ne 0) if first cpi maxhd*logdsk jc noadjst sui maxhd*logdsk else cpi maxflop jc noadjst sui maxflop endif noadjst mov c,a lxi h,djdrv ;Select drive lxi d,hddrv call decidgo else mov c,a if maxhd ne 0 call hddrv endif if maxflop ne 0 call djdrv ;Select the drive endif endif lda buftrk ana a ;Test for track zero mov c,a push b Š if (maxhd ne 0) and (maxflop ne 0) lxi h,djhomffer, the * * buffer is first flushed to the disk if it has ever been * * written into, then a read is performed into the buffer to get * * the desired sector. Once the correct sector is in memory, the * * buffer written indicator is set, so the buffer will be * * flushed, then the data is transferred into the buffer. * * * ***************************************************************** write mov a,c ;Save write command type sta writtyp mvi a,1 ;Set write command db (mvi) or (b*8) ;This "mvi b" instruction causes ; the following "xra a" to ; be skipped over. ***************************************************************** * * * Read routine to buffer data from the disk. If the sector * * requested from CP/M is in the buffer, then the data is simply * * transferreä froí thå buffeò tï thå desireä dma address. If * * the buffer does not contain the desired sector, the buffer is * * flushed to the disk if it has ever been written into, then * * filled with terror indication ***************************************************************** * * * Move has been modified to cause either a transfer into or out * * the buffer. * * * ***************************************************************** move lda cpmsec ;Get the CP/M sector to transfer Š dcr a ;Adjust to proper sector in buffer ani 0 ;Strip off high ordered bits secpsec equ $-1 ;The 0 is modified to represent the # of ; CP/M sectors per physical sectors mov l,a ;Put into HL mvi h,0 dad h ;Form offset into buffer dad h dad h dad h dad h dad h dad h lxi d,buffer ;Beginning address of buffer dad d ;Form beginning address of sectgr to transfer xchg ;DE = address in buffer lxi h,0 ;Get DMA address, the 0 is modified t/ ; contain the DMA address cpmdma equ $-2 mvi a,0 ;The zero gets modified to contain ; a zero if a read, or a 1 if write rdwr equ $-1 ana a ;Test which kind of operation jnz into ;Transfer data into the be lxi d,hdhome cz decidgo else if maxhd ne 0 cz hdhome endif if maxflop ne 0 cz djhome ;Home the drive if track 0 endif endif pop b ;Restore track # if (maxhd ne 0) and (maxflop ne 0) lxi h,djtrk lxi d,hdtrk call decidgo else if maxhd ne 0 call hdtrk endif if maxflop ne 0 call djtrk ;Seek to proper track endif endif lhld bufsec mov a,h ;Get sector involved in operation rlc ;Bit 0 of A equals side # ani 1 ;Strip off unnecessary bits mov c,a ;C <- side # if (maxhd ne 0) and (maxflop ne 0) lxi h,djside lxi d,hdside call decidgo else if maxhd ne 0 call hdside endif if maxflop ne 0 call djside ;Select the side endif endif lhld bufsec mov a,h ani 7fh ;Strip off side bit mov b,a ;C <- sector # mov c,l if (maxhd ne 0) and (maxflop ne 0) Š lxi h,djsec lxi d,hdsec call decidgo else if maxhd ne 0 call hdsec endif if maxflop ne 0 call djsec ;Select the side endif endif lxi b,buffer ;vlop ;Continue moving until done ret ***************************************************************** * * * Routines to decide which controller to use. * * * ***************************************************************** if (maxhd ne 0) and (maxflop ne 0) decidgo call decide ;which controller ? pchl endif if (maxhd ne 0) and (maxflop ne 0) decide lda bufdrv ;Get proper routine into H&L, based if first ; on currently selected drive cpi maxhd*logdsk rnc else cpi maxflop rc endif xchg ret endif ***************************************************************** * * * The following is the equivalent of the lowest level drivers * * for the Hard Disk. * * * ***************************************************************** if maxhd ne 0 hddrv mov a,c ;Select Hard Disk drive call divlog ;Get the physical drive # mov a,c sta hddisk ;Select the drive ori null out hdfunc mvi a,wenabl out hdcntl ret hdh rc xra a out hdcmnd lhld hdadd mvi b,seclen/4 wtloop mov a,m ;Move 4 bytes out hddata inx h mov a,m out hddata inx h mov a,m out hddata inx h mov a,m out hddata inx h dcr b jnz wtloop mvi a,wsect ;Issue write sector command out hdcmnd call process rc mvi a,wfault ana b stc rz xra a ret Šprocess in hdstat ;Wait for command to finish mov b,a ani opdone jz process mvi a,dskclk out hdcntl in hdstat ani tmout ;Timed out ? stc rnz in hdreslt ani retry ;Any retries ? stc rnz xra a ret hdprep in hdstat ani drvrdy stc rnz mvi a,isbuff ;Initialize pointer out hdcmnd call build ori 0ch out hdfunc lda head out hddata ;Form head byte call drvptr mov a,m ;Form track byte out hddata ana a mvi b,80h jz zkey mvi b,0 zkey mvi a,0 ;Form sector byte hdsectr equ $-1 out hddata mov a,b out hddata mvi a,dskclk out hdcntl mvi a,wenabl out hdcntl xra a ret drvptr lhld hddisk xchSet the DMA address if (maxhd ne 0) and (maxflop ne 0) lxi h,djdma lxi d,hddma call decidgo else if maxhd ne 0 call hddma endif if maxflop ne 0 call djdma ;Select the side endif endif call 0 ;Get operation address retryop equ $-2 pop b ;Restore the retry counter mvi a,0 ;No error exit status rnc ;Return no error dcr b ;Update the retry counter stc ;Assume retry count expired mvi a,0ffh ;Error return rz ;Return sad news mov a,b cpi retries/2 ;reseek after half retries done jnz retrylp ;Try again push b if (maxhd ne 0) and (maxflop ne 0) lxi h,djhome lxi d,hdhome cz decidgo else if maxhd ne 0 cz hdhome endif if maxflop ne 0 cz djhome ;Home the drive if track 0 endif endif pop b Š jmp retrylp ;Try again ***************************************************************** * * * Fill fills the buffer with a new sector from the disk. * * * **************************************************************ome call drvptr mvi m,0 ;Set track to zero in hdstat ;Test status ani tkzero ;At track zero ? Š rz ;Yes if not fujitsu stepo in hdstat ;Test status ani tkzero ;At track zero ? Š jz delay mvi a,1 stc call accok ;Take one step out jmp stepo else xra a jmp accok endif if not fujitsu delay lxi h,0 ;Get delay settle equ $-2 deloop dcx h ;Wait 20ms mov a,h ora l inx h dcx h jnz deloop ret endif hdtrk call drvptr ;Get pointer to current track mov e,m ;Get current track mov m,c ;Update the track mov a,e ;Need to seek at all ? sub c rz cmc ;Get carry into direction jc hdtrk2 cma inr a if fujitsu hdtrk2 jmp accok else hdtrk2 call accok jmp delay endif accok mov b,a ;Prep for build call build sloop ani nstep ;Get step pulse low out hdfunc ;Output low step line ori pstep ;Set step line high out hdfunc ;Output high step line dcr b ;Update repeat count jnz sloop ;Keep going the required # of tracks g mvi d,0 lxi h,drives dad d ret build mvi a,0 Šhead equ $-1 ral ral ral ral ori 0 hddisk equ $-1 xri 0f0h ret drives equ $ rept maxhd db 0ffh endm endif ***************************************************************** * * * Xlt tables (sector skew tables) for CP/M 2.0. These tables * * define the sector translation that occurs when mapping CP/M * * sectors to physical sectors on the disk. There is one skew * * table for each of the possible sector sizes. Currently the * * tables are located on track 0 sectors 6 and 8. They are * * loaded into memory in the Cbios ram by the cold boot routine. * * * ***************************************************************** if maxflop ne 0 xlt128 db 0 db 1,7,13,19,25 db 5,11,17,23 db 3,9,15,21 db 2,8,14,20,26 db 6,12,18,24 db 4,10,16,22 xlt256 db 0 db 1,2,19,20,37,38 db 3,4,21,22,39,40 db 5,6,23,24,41,42 db 7,8,25,26,43,44 db 9,10,27,28,45,46 db 11,12,29,30,47,48 db 13,14,3*** fill call flush ;Flush buffer first rc ;Check for error lxi d,cpmdrv ;Update the drive, track, and sector lxi h,bufdrv mvi b,4 ;Number of bytes to move call movlop ;Copy the data lda rdwr ana a jz fread lda writtyp dcr a dcr a rz call getdpb lxi d,15 dad d mov a,m ani 3 dcr a rz fread equ $ if (maxhd ne 0) and (maxflop ne 0) lxi h,djread lxi d,hdread call decide else if maxhd ne 0 lxi h,hdread endif if maxflop ne 0 lxi h,djread ;Select the side endif endif jmp prep ;Select drive, track, and sector. ; Then read the buffer ***************************************************************** * * * Mover moves 128 bytes of data. Source pointer in DE, Dest * * pointer in HL. * * * ***************************************************************** mover mvi b,128 ;Length of transfer movlop ldax d ;Get a bte of source Š mov m,a ;Move it inx d ;Bump pointers inx h dcr b ;Update counter jnz mojmp wsdone hddma mov h,b ;Save the DMA address Š mov l,c shld hdadd hdside equ $ ret wsdone in hdstat ;Wait for seek complete to finish ani complt jz wsdone ret if m26 hdsec mvi a,01fh ;For compatibility with Cbios rev 2.3, 2.4 ana c cz getspt sta hdsectr mvi a,0e0h ana c rlc rlc rlc sta head getspt mvi a,hdspt ret else hdsec mov a,c call divspt adi hdspt ana a cz getspt sta hdsectr mov a,c sta head getspt mvi a,hdspt dcr c ret divspt mvi c,0 divsptx sui hdspt rc inr c jmp divsptx endif hdread call hdprep rc xra a out hdcmnd cma out hddata out hddata mvi a,rsect ;Read sector command out hdcmnd call process Š rc xra a out hdcmnd mvi b,seclen/4 lxi h,0 hdadd equ $-2 in hddata in hddata rtloop in hddata ;Move four bytes mov m,a inx h in hddata mov m,a inx h in hddata mov m,a inx h in hddata mov m,a inx h dcr b jnz rtloop ret hdwrite call hdprep ;Prepare header 1,32,49,50 db 15,16,33,34,51,52 db 17,18,35,36 xlt512 db 0 db 1,2,3,4,17,18,19,20 db 33,34,35,36,49,50,51,52 db 5,6,7,8,21,22,23,24 db 37,38,39,40,53,54,55,56 db 9,10,11,12,25,26,27,28 db 41,42,43,44,57,58,59,60 db 13,14,15,16,29,30,31,32 Š db 45,46,47,48 xlt124 db 0 db 1,2,3,4,5,6,7,8 db 25,26,27,28,29,30,31,32 db 49,50,51,52,53,54,55,56 db 9,10,11,12,13,14,15,16 db 33,34,35,36,37,38,39,40 db 57,58,59,60,61,62,63,64 db 17,18,19,20,21,22,23,24 db 41,42,43,44,45,46,47,48 ***************************************************************** * * * Each of the following tables describes a diskette with the * * specified characteristics. * * * ***************************************************************** ***************************************************************** * * * The following DPB defines a diskette for 128 byte sectors, * * single density, and single sided. * * * ************************************************diskette for 128 byte sectors, * * single density, and double sided. * * * ***************************************************************** Šdpb128d dw 52 ;CP/M sectors/track db 4 ;BSH db 15 ;BLM db 1 ;EXM dw 242 ;DSM dw 127 ;DRM db 0c0h ;AL0 db 0 ;AL1 dw 32 ;CKS dw 2 ;OFF db 9h ***************************************************************** * * * The following DPB defines a diskette as 256 byte sectors, * * double density, and double sided. * * * ***************************************************************** dpb256d dw 104 ;CP/M sectors/track db 4 ;BSH db 15 ;BLM db 0 ;EXM dw 486 ;DSM dw 255 ;DRM db 0f0h ;AL0 db 0 ;AL1 dw 64 ;CKS dw 2 ;OFF db 1ah ***************************************************************** * * * The following DPB defines a diskette as 512 byte sectors, * * double density, and double sided. * * * ************************************************************al sector) -1) + ;log2(#bytes per sector/128) + 1 + ;8 if double sided. dpbhd2 dw 336 ;CP/M sectors/track db 5 ;BSH db 31 ;BLM db 1 ;EXM dw 1280 ;DSM dw 511 ;DRM db 0ffh ;AL0 db 0ffh ;AL1 dw 0 ;CKS dw 122 ;OFF db 33h ;16*((#cpm sectors/physical sector) -1) + ;log2(#bytes per sector/128) + 1 + ;8 if double sided. endif if m20 ne 0 dpbhd1 dw 672 ;CP/M sectors/track db 5 ;BSH db 31 ;BLM db 1 ;EXM dw 2015 ;DSM dw 511 ;DRM db 0ffh ;AL0 db 0ffh ;AL1 dw 0 ;CKS dw 1 ;OFF db 33h ;16*((#cpm sectors/physical sector) -1) + ;log2(#bytes per sector/128) + 1 + ;8 if double sided. dpbhd2 dw 672 ;CP/M sectors/track Š db 5 ;BSH db 31 ;BLM db 1 ;EXM dw 2015 ;DSM dw 511 ;DRM db 0ffh ;AL0 db 0ffh ;AL1 dw 0 ;CKS dw 98 ;OFF db 33h ;16*((#cpm sectors/physical sector) -1) + ;log2(#bytes per sector/128) + 1 + ;8 if double sided. dpbhd3 dw 672 ;CP/M sectors/track db 5 ;BSH db 31 ;BLM db 1***************** dpb128s dw 26 ;CP/M sectors/track db 3 ;BSH db 7 ;BLM db 0 ;EXM dw 242 ;DSM dw 63 ;DRM db 0c0h ;AL0 db 0 ;AL1 dw 16 ;CKS dw 2 ;OFF db 1h ;16*((#cpm sectors/physical sector) -1) + ;log2(#bytes per sector/128) + 1 + ;8 if double sided. ***************************************************************** * * * The following DPB defines a diskette for 256 byte sectors, * * double density, and single sided. * * * ***************************************************************** dpb256s dw 52 ;CP/M sectors/track db 4 ;BSH db 15 ;BLM db 0 ;EXM dw 242 ;DSM dw 127 ;DRM db 0c0h ;AL0 db 0 ;AL1 Š dw 32 ;CKS dw 2 ;OFF db 12h ;16*((#cpm sectors/physical sector) -1) + ;log2(#bytes per sector/128) + 1 + ;8 if double sided. ***************************************************************** * * * The following DPB defines a diskette as 512 byte sectors, * * double density, and single sided. ***** dpb512d dw 120 ;CP/M sectors/track db 4 ;BSH db 15 ;BLM db 0 ;EXM dw 561 ;DSM dw 255 ;DRM db 0f0h ;AL0 db 0 ;AL1 dw 64 ;CKS dw 2 ;OFF db 3bh ***************************************************************** * * * The following DPB defines a diskette as 1024 byte sectors, * * double density, and double sided. * * * Š***************************************************************** dp1024d dw 128 ;CP/M sectors/track db 4 ;BSH db 15 ;BLM db 0 ;EXM dw 599 ;DSM dw 255 ;DRM db 0f0h ;AL0 db 0 ;AL1 dw 64 ;CKS dw 2 ;OFF db 7ch endif ***************************************************************** * * * The following DPB's are for the standard format to be * * compatable with older versions of the Cbios. * * * ***************************************************************** if stdlog eq 0 ;Use standard format if maxhd ne 0 if m26 ne 0 dpbhd1 dw 1024 ;CP/M sectors/track db 5 ;BSH  ;EXM dw 1028 ;DSM dw 511 ;DRM db 0ffh ;AL0 db 0ffh ;AL1 dw 0 ;CKS dw 195 ;OFF db 33h ;16*((#cpm sectors/physical sector) -1) + ;log2(#bytes per sector/128) + 1 + ;8 if double sided. endif endif endif ***************************************************************** * * ª Thå followinç DPB'ó arå useä wheî thå useò selecteó thå * * numbeò oæ logicaì drives® Theså macroó dividå evenlù thå * * spacå peò logicaì drivå wherå thå standarä formaô trieó * * tï creatå thå leasô amounô oæ logicaì driveó witè thå * * mosô spacå peò logicaì drive. * * * ***************************************************************** if stdlog ne 0 mdpbhd macro l,d dpbhd&l dw secpt db bsh db blm db exm if ldsk ne 0 dw (totbls/logdsk) else dw (totbls/logdsk)-1 ;Reserved cpm track endif dw drm db al0 db al1 Š dw cks dw (tracks/logdsk)*&d+1 db slog endm if maxhd ne 0 if m10 ne 0 secpt equ 336 ;Sectors per track totbls equ 256 * * * ***************************************************************** dpb512s dw 60 ;CP/M sectors/track db 4 ;BSH db 15 ;BLM db 0 ;EXM dw 280 ;DSM dw 127 ;DRM db 0c0h ;AL0 db 0 ;AL1 dw 32 ;CKS dw 2 ;OFF db 33h ;16*((#cpm sectors/physical sector) -1) + ;log2(#bytes per sector/128) + 1 + ;8 if double sided. ***************************************************************** * * * The following DPB defines a diskette as 1024 byte sectors, * * double density, and single sided. * * * ***************************************************************** dp1024s dw 64 ;CP/M sectors/track db 4 ;BSH db 15 ;BLM db 0 ;EXM dw 299 ;DSM dw 127 ;DRM db 0c0h ;AL0 db 0 ;AL1 dw 32 ;CKS dw 2 ;OFF db 74h ;16*((#cpm sectors/physical sector) -1) + ;log2(#bytes per sector/128) + 1 + ;8 if double sided. ***************************************************************** * * * The following DPB defines a db 31 ;BLM db 1 ;EXM dw 1973 ;DSM dw 511 ;DRM db 0ffh ;AL0 db 0ffh ;AL1 dw 0 ;CKS dw 1 ;OFF db 33h ;16*((#cpm sectors/physical sector) -1) + ;log2(#bytes per sector/128) + 1 + ;8 if double sided. dpbhd2 dw 1024 ;CP/M sectors/track db 5 ;BSH db 31 ;BLM db 1 ;EXM dw 1973 ;DSM dw 511 ;DRM db 0ffh ;AL0 db 0ffh ;AL1 dw 0 ;CKS dw 64 ;OFF db 33h ;16*((#cpm sectors/physical sector) -1) + ;log2(#bytes per sector/128) + 1 + ;8 if double sided. dpbhd3 dw 1024 ;CP/M sectors/track db 5 ;BSH Š db 31 ;BLM db 1 ;EXM dw 1973 ;DSM dw 511 ;DRM db 0ffh ;AL0 db 0ffh ;AL1 dw 0 ;CKS dw 127 ;OFF db 33h ;16*((#cpm sectors/physical sector) -1) + ;log2(#bytes per sector/128) + 1 + ;8 if double sided. endif if m10 ne 0 dpbhd1 dw 336 ;CP/M sectors/track db 5 ;BSH db 31 ;BLM db 1 ;EXM dw 1269 ;DSM dw 511 ;DRM db 0ffh ;AL0 db 0ffh ;AL1 dw 0 ;CKS dw 1 ;OFF db 33h ;16*((#cpm sectors/physic2 ;Total blocks (4096 byte) tracks equ 244 ;Total tracks endif if m20 ne 0 secpt equ 672 totbls equ 5124 tracks equ 244 endif if m26 ne 0 secpt equ 1024 totbls equ 6464 tracks equ 202 endif bsh equ 5 blm equ 31 exm equ 1 drm equ 511 al0 equ 0ffh al1 equ 0ffh cks equ 0 slog equ 33h ldsk set 0 rept maxhd dpbdrv set 0 rept stdlog mdpbhd %ldsk,%dpbdrv ldsk set ldsk+1 dpbdrv set dpbdrv+1 endm endm endif endif ***************************************************************** * * * CP/M disk parameter headers, unitialized. * * * ***************************************************************** if stdlog eq 0 header macro nd,dpb dw 0 ;Translation table filled in later dw 0,0,0 ;Scratch Š dw dirbuf ;Directory buffer dw dpb ;DPB filled in later dw csv&nd ;Directory check vector dw alv&nd ;Allocation vector endm else header macro nd,dpb,dpno dw 0 ;Translation table filled in later dw 0,0,0 ;Scradif if (maxhd ne 0) and (maxflop ne 0) db ' and ' else db '.' endif if maxhd ne 0 if maxhd eq 1 db 'a ' endif if maxhd eq 2 db 'two ' endif if maxhd eq 3 db 'three ' endif if maxhd eq 4 db 'four ' endif if mrev eq 10 if fujitsu db 'Fujitsu ' else db 'Memorex ' Š endif db 'M10 ' endif if mrev eq 20 db 'Fujitsu M20 ' endif if mrev eq 26 db 'Shugart M26 ' endif db 'hard disk' if maxhd ne 1 db 's' endif db '.' endif db acr,alf if (contyp eq 0) or (contyp eq 1) db 'Nothing', acr, alf endif if contyp eq 2 if multr3 db 'Multi I/O' else db 'Decision I' endif endif if contyp eq 3 db '2D/B' endif db ' as console' if lsttyp ge 2 db ', ' if lsttyp eq 2 db 'serial' endif if lsttyp eq 3 db 'CTS protocol serial' endif if lsttyp eq 4 db 'DSR protocol serial' endif if lsttyp eq 5 db 'Xon/Xoff protocol serial' endif if lsttyp eq 6 db 'Centronics parallel' endif if lsttyp e***************** tinit lda group ;Get group byte ori congrp ;Select console device out grpsel in rbr ;Clear reciever buffers in rbr xra a out lsr ;Clear status out ier ;Set no interrupts if not multr3 ;Multi I/O has no sense switches lda group ;Get group byte out grpsel ;Select group zero to read sense switch in sensesw ;Get sense switch. ani 0e0h ;Mask in upper three bits rlc rlc rlc ;Move into lower 3 bits cpi 7 ;check for sense = 7 push psw ;Save value lda group ;Get group byte ori congrp ;Reselect serial port group out grpsel pop psw jz valid ;Do default rate lxi h,btab ;Pointer to baud rate table add a ;Table of words so double mov e,a ;Make a 16 bit number into (de) mvi d,0 dad d ;Get a pointer into baud rate table mov e,m ;Get lower byte of word inx h ;Point to high byte of word mov d,m ;Get upper byte. (de) now has divisor jmp setit ;Set baud rate. btab dw 1047 ;110 Baud 000 dw 384 ;300 001 dw 9tch dw dirbuf ;Directory buffer dw dpb&dpno ;DPB filled in later dw csv&nd ;Directory check vector dw alv&nd ;Allocation vector endm endif dpbase equ $ if stdlog eq 0 dn set 0 if first rept maxhd ;Generate Hard Disk DPH's followed header %dn,dpbhd1 ; by Floppy DPH's dn set dn+1 header %dn,dpbhd2 dn set dn+1 if (m26 ne 0) or (m20 ne 0) header %dn,dpbhd3 dn set dn+1 endif endm rept maxflop header %dn,0 dn set dn+1 endm else rept maxflop ;Generate Floppy DPH's followed by header %dn,0 ; Hard Disk DPH's dn set dn+1 endm rept maxhd header %dn,dpbhd1 dn set dn+1 header %dn,dpbhd2 dn set dn+1 if (m26 ne 0) or (m20 ne 0) header %dn,dpbhd3 dn set dn+1 endif endm endif endif Š if stdlog ne 0 if first dn set maxflop rept maxhd rept stdlog ;Generate Hard Disk DPH's followed header %dn,dpbhd,%(dn-maxflop) ;by Floppy DPH's dn set dn+1 endm endm dn set 0 ;Floppies always start at zero rept maxflop header %dn,0,0 dn setq 7 db 'Diablo HyType II parallel' endif db ' printer as LST:' else db '.' endif db acr, alf db 0 ;End of message ***************************************************************** Š* * * Utility routine to output the message pointed at by H&L, * * terminated with a null. * * * ***************************************************************** message mov a,m ;Get a character of the message inx h ;Bump text pointer ora a ;Test for end rz ;Return if done push h ;Save pointer to text mov c,a ;Output character in C call cout ;Output the character pop h ;Restore the pointer jmp message ;Continue until null reached ***************************************************************** * * * Cboot is the cold boot loader. All of CP/M has been loaded in * * when control is passed here. * * * ***************************************************************** cboot lxi sp,tpa ;Set up stack xra a ;Clear cold boot f6 ;1200 010 dw 48 ;2400 011 dw 24 ;4800 100 dw 12 ;9600 101 dw 6 ;19200 110 endif ***************************************************************** * * * Thå followinç ió á lisô oæ valiä bauä rates® Thå currenô * * bauä ratå ió checkeä oî colä boot® Iæ iô ió noô iî thå * * vtaâ tablå theî thå bauä ratå wilì bå seô froí thå defcoî * ª worä founä belo÷ thå Cbioó jumð table® Iæ thå useò * * happenó tï havå á weirä bauä ratå thaô ió noô iî thió * * tablå oò ió lookinç foò á waù tï savå spacå theî entrieó * * caî bå addeä oò deleteä froí thå table. * * * ***************************************************************** vtab dw 2304 ;50 baud dw 1536 ;75 dw 1047 ;110 dw 857 ;134.5 dw 768 ;150 dw 384 ;300 dw 192 ;600 dw 96 ;1200 dw 64 ;1800 dw 58 ;2000 dw 48 ;2400 dw 32 ;3600 dw 24 ;4800 dw 16 ;7200 dw 12 ;9600 dw 6 ;19200 svtab equ ($-vtab)/2 ;Length of the vtab table ***************************************** dn+1 endm else ;Generate floppies before hard disk dn set 0 rept maxflop header %dn,0,0 dn set dn+1 endm dn set maxflop rept maxhd rept stdlog header %dn,dpbhd,%(dn-maxflop) dn set dn+1 endm endm endif endif buffer equ $ ***************************************************************** * * * Signon message output during cold boot. * * * ***************************************************************** prompt db 80h, clear ;Clean buffer and screen db acr,alf,acr,alf,acr,alf db 'Morrow Designs ' Š db '0'+msize/10 ;CP/M memory size db '0'+(msize mod 10) db 'K CP/M ' ;CP/M version number db cpmrev/10+'0' db '.' db (cpmrev mod 10)+'0' db ', Cbios rev ' db revnum/10+'0','.' ;Cbios revision number db revnum mod 10+'0' if maxhd ne 0 db '.' db mrev/10+'0' db mrev mod 10+'0' endif if m10 if fujitsu db 'F' else db 'M' endif endif db acr,alf db 'For ' if maxflop ne 0 db 'a Disk Jockey 2D/B' enlag sta cwflg sta group ;Clear group select byte if maxflop ne 0 ;If 2D/B is there then make RAM copy lxi h,djram ; of the jump table. lxi d,origin mvi b,33h ;Size of jump table call movlop ;Copy table endif mvi a,intioby sta iobyte if contyp ne 0 ;Do not call tinit for PROM's call tinit ;Initialize the terminal endif if lsttyp ne 0 ;Do not call linit for PROM's call linit ;Initialize the list device endif lxi h,prompt ;Prep for sending signon message call message ;Send the prompt xra a ;Select disk A sta cpmdrv sta cdisk if (maxflop ne 0) and first sta flopflg endif Š lxi h,bios+3 ;Patch cold boot to warm code shld bios+1 jmp gocpm if contyp eq 2 ;Multi I/O, Decision I ***************************************************************** * * * Terminal initilization routine. This routine reads the sense * * switch on the WB-14 and sets the speed accordingly. * * * ************************************************************************ * * * Valiä checkó iæ thå divisoò latcè ió á reasonablå value® * * Iæ thå valuå seemó ofæ theî iô wilì geô thå defaulô bauä * * ratå froí defcoî anä jumð tï setit. * * * ***************************************************************** Š valid mvi a,dlab+wls0+wls1+stb out lcr ;Access divisor latch in dll ;Get lower divisor value mov e,a in dlm ;Get upper divisor value mov d,a mvi a,wls1+wls0+stb out lcr lxi h,vtab ;Valid baud rate table mvi c,svtab ;Length of the baud rate table vloop mov a,e cmp m ;Check low byte jnz vskip ;First byte is bad inx h mov a,d cmp m ;Check high byte jz done ;Baud rate is OK... Do cleanup dcx h vskip inx h ;Skip to next entry inx h dcr c ;Bump entry counter jnz vloop nvalid lhld defcon ;Get default baud rate xchg setit mvi a,dlab+wls1+wls0+stb ;Enable divisor access latch out lcr ;Set the baud rate in (de) mov a,d out dlm ;Set upper divisor mov a,e out dll ;Se ;Strobe restore bit low out daisi0 mvi a,10 ;Wait about 50uS dloop dcr a jnz dloop mvi a,0ffh ;Raise restore back up out daisi0 endif xra a out daisi1 ;Clear data buffers if multr3 ;Lift ribbon lda group ori denable out grpsel ;Re-enable the drivers mvi a,0ffh-restore ;Pull -ribbon lift down out daisi0 else mvi a,pselect ;Re-enable drivers and lift ribbon out clk endif linit9 lxi h,hinc/cperi shld hmi ;Save hmi = 120/(characters per inch) lxi h,vinc/lperi shld vmi ;Save vmi = 48/(lines per inch) lxi h,0 ;Other variables default to zero shld vpos shld dlvpos shld hpos shld dlhpos shld lmar call clrall ;Clear the TAB array xra a sta kludge ;Reset TAB clear byte sta dirflg sta grhflg ret endif db 0,0ffh,0 ds 512-($-buffer) ;Maximum size buffer for 512 byte sectors if maxflop ne 0 ds 512 ;Additional space for floppies 1k sectors endif **************************************************************; Skeletal CBIOS for first level of CP/M 2.0 alteration ; msize equ 20 ;cp/m version memory size in kilobytes ; ; "bias" is address offset from 3400H for memory systems ; than 16K (referred to as "b" throughout the text). ; bias equ (msize-20)*1024 ccp equ 3400H+bias ;base of ccp bdos equ ccp+806h ;base of bdos bios equ ccp+1600h ;base of bios cdisk equ 0004H ;current disk number 0=A,...,15=P iobyte equ 0003h ;intel i/o byte ; org bios ;origin of this program nsects equ ($-ccp)/128 ;warm start sector count ; ; jump vector for individual subroutines jmp boot ;cold start wboote: jmp wboot ;warm start jmp const ;console status jmp conin ;console character in jmp conout ;console character out jmp list ;list character out jmp punch ;punch character out jmp reader ;reader character out jmp home ;move head to home position jmp seldsk ;select disk jmp settrk ;set track number jmp setsec ;set sector number jmp setdma ;set dma address jmp read ;read disk jmp t lower divisor mvi a,wls1+wls0+stb out lcr done xra a ;Clear status register out lsr ret endif ;Multi I/O, Decision I if contyp eq 3 ;2D/B console initialization tinit call djtstat ;Clean input buffer rnz ;All empty call djcin jmp tinit endif ;2D/B console if (lsttyp ge 2) and (lsttyp le 5) ;Serial Multi I/O list drivers linit lda group ;Get group byte ori lstgrp ;Select list device out grpsel mvi a,dlab ;Access divisor latch out lcr lhld deflst ;Get LST: baud rate divisor mov a,h out dlm ;Set upper baud rate mov a,l out dll mvi a,stb+wls0+wls1 out lcr in rbr ;Clear input buffer xra a out ier ;No interupts ret endif if lsttyp eq 6 ;Multi I/O parallel, Centronics linit lda group ;Get group byte ori denable ;Set driver enable bit sta group out grpsel ;Select group zero with drivers enabled xra a out daisi1 ;Zero out data mvi a,d9+d10 ;Set strobe high, init low out daisi0 mvi a,10 ;Wait about 50uS*** * * * Cbios ram locations that don't need initialization. * * * ***************************************************************** cpmsec dw 0 ;CP/M sector # cpmdrv db 0 ;CP/M drive # cpmtrk db 0 ;CP/M track # truesec dw 0 ;Disk Jockey sector that contains CP/M sector bufdrv db 0 ;Drive that buffer belongs to buftrk db 0 ;Track that buffer belongs to bufsec dw 0 ;Sector that buffer belongs to dirbuf ds 128 ;Directory buffer alloc macro nd,al,cs alv&nd ds al csv&nd ds cs endm dn set 0 if stdlog eq 0 if not first rept maxflop alloc %dn,75,64 dn set dn+1 endm rept maxhd if m26 ne 0 alloc %dn,247,0 dn set dn+1 alloc %dn,247,0 dn set dn+1 alloc %dn,247,0 dn set dn+1 endif if m10 ne 0 alloc %dn,159,0 dn set dn+1 alloc %dn,161,0 dn set dn+1 Š endif if m20 ne 0 alloc %dn,252,0 dn set dn+1 alloc %dn,252,0 dn set dn+1 alloc %dn,129,0 dn set dn+1 endif endm else rept maxhd if m26 ne 0 alloc %dn,247,0 dn sewrite ;write disk jmp listst ;return list status jmp sectran ;sector translate ; ; fixed data tables for four-drive standard ; IBM-compatible 8" disks ; disk parameter header for disk 00 dpbase: dw trans,0000H dw 0000H,0000H dw dirbf,dpblk dw chk00,all00 ; disk parameter header for disk 01 dw trans,0000H dw 0000H,0000H dw dirbf,dpblk dw chk01,all01 ; disk parameter header for disk 02 dw trans,0000H dw 0000H,0000H dw dirbf,dpblk dw chk02,all02 ; disk parameter header for disk 03 dw trans,0000H dw 0000H,0000H dw dirbf,dpblk dw chk03,all03 ; ; sector translate vector trans: db 1,7,13,19 ;sectors 1,2,3,4 db 25,5,11,17 ;sectors 5,6,7,8 db 23,3,9,15 ;sectors 9,10,11,12 db 21,2,8,14 ;sectors 13,14,15,16 db 20,26,6,12 ;sectors 17,18,19,20 db 18,24,4,10 ;sectors 21,22,23,24 db 16,22 ;sectors 25,26 ; dpblk: ;disk parameter block, common to all disks dw 26 ;sectors per track db 3 ;block shift factor db 7 ;block mask db 0 ;null mask dw 242 ;dis for printer to initilize dloop dcr a jnz dloop mvi a,d11+d9+d10 out daisi0 ret endif if lsttyp eq 7 ;Diablo HyType II ***************************************************************** * * * Initializå Diablï HyTypå printer® Iæ thå printeò failó *� * tï initializå theî thå outpuô driveró wilì bå turneä ofæ *� * anä anù attemptó tï prinô wilì resulô iî redirectioî tï *� * thå console. * * * ***************************************************************** if multr3 ;Multi I/O initialization linit lda group ;Get group byte ori denable ;Add driver enable bit out grpsel ori restore ;Toggle restore high out grpsel mvi a,10 ;Hold line up for 50uS dloop dcr a jnz dloop lda group out grpsel ;Turn denable and restore off elså ;Mother board initialization linit lda group ;Get group byte out grpsel ;Select group zero mvi a,pselect+rlift ;Set select line active, rlift not active out clk mvi a,0ffh out daisi0 mvi a,0ffh-restoret dn+1 alloc %dn,247,0 dn set dn+1 alloc %dn,247,0 dn set dn+1 endif if m10 ne 0 alloc %dn,159,0 dn set dn+1 alloc %dn,161,0 dn set dn+1 endif if m20 ne 0 alloc %dn,252,0 dn set dn+1 alloc %dn,252,0 dn set dn+1 alloc %dn,129,0 dn set dn+1 endif endm rept maxflop alloc %dn,75,64 dn set dn+1 endm endif endif if stdlog ne 0 if maxhd ne 0 ;Make up hard disk allocation vectors dn set maxflop ;Hard disks always start after floppies rept maxhd rept stdlog alloc %dn,((totbls/logdsk)/8)+1,0 dn set dn+1 endm endm endif Š if maxflop ne 0 ;Make up floppy allocation vectors dn set 0 rept maxflop ;Floppies first alloc %dn,75,64 dn set dn+1 endm endif endif end ååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååk size-1 dw 63 ;directory max db 192 ;alloc 0 db 0 ;alloc 1 dw 16 ;check size dw 2 ;track offset ; ; end of fixed tables ; ; individual subroutines to perform each function boot: ;simplest case is to just perform parameter initialization xra a ;zero in the accum sta iobyte ;clear the iobyte sta cdisk ;select disk zero jmp gocpm ;initialize and go to cp/m ; wboot: ;simplest case is to read the disk until all sectors loaded lxi sp,80h ;use space below buffer for stack mvi c,0 ;select disk 0 call seldsk call home ;go to track 00 ; mvi b,nsects ;b counts # of sectors to load mvi c,0 ;c has the current track number mvi d,2 ;d has the next sector to read ; note that we begin by reading track 0, sector 2 since sector 1 ; contains the cold start loader, which is skipped in a warm start lxi h,ccp ;base of cp/m (initial load point) load1: ;load one more sector push b ;save sector count, current track push d ;save next sector to read push h ;save dma addrcter output from register c mov a,c ;get to accumulator ds 10h ;space for output routine ret ; list: ;list character from register c mov a,c ;character to register a ret ;null subroutine ; listst: ;return list status (0 if not ready, 1 if ready) xra a ;0 is always ok to return ret ; punch: ;punch character from register c mov a,c ;character to register a ret ;null subroutine ; ; reader: ;read character into register a from reader device mvi a,1ah ;enter end of file for now (replace later) ani 7fh ;remember to strip parity bit ret ; ; ; i/o drivers for the disk follow ; for now, we will simply store the parameters away for use ; in the read and write subroutines ; home: ;move to the track 00 position of current drive ; translate this call into a settrk call with parameter 00 mvi c,0 ;select track 0 call settrk ret ;we will move to 00 on first read/write ; seldsk: ;select disk given by register C lxi h,0000h ;error return code mov a,c sta diskno cpi 4 bytes for expansion dmaad: ds 2 ;direct memory address diskno: ds 1 ;disk number 0-15 ; ; scratch ram area for BDOS use begdat equ $ ;beginning of data area dirbf: ds 128 ;scratch directory area all00: ds 31 ;allocation vector 0 all01: ds 31 ;allocation vector 1 all02: ds 31 ;allocation vector 2 all03: ds 31 ;allocation vector 3 chk00: ds 16 ;check vector 0 chk01: ds 16 ;check vector 1 chk02: ds 16 ;check vector 2 chk03: ds 16 ;check vector 3 ; enddat equ $ ;end of data area datsiz equ $-begdat;size of data area end maad' (0-65535) ds 256 ;space reserved for I/O drivers mvi a,1 ;error condition ret ;replaced when filled-in ; ; the remainder of the CBIOS is reserved uninitialized ; data area, and does not need to be a part of the ; system memory image (the space must be available, ; however, between "begdat" and "enddat"). ; track: ds 2 ;two bytes for expansion sector: ds 2 ;two ess mov c,d ;get sector address to register c call setsec ;set sector address from register c pop b ;recall dma address to b,c push b ;replace on stack for later recall call setdma ;set dma address from b,c ; ; drive set to 0, track set, sector set, dma address set call read cpi 00h ;any errors? jnz wboot ;retry the entire boot if an error occurs ; ; no error, move to next sector pop h ;recall dma address lxi d,128 ;dma=dma+128 dad d ;new dma address is in h,l pop d ;recall sector address pop b ;recall number of sectors remaining, and current trk dcr b ;sectors=sectors-1 jz gocpm ;transfer to cp/m if all have been loaded ; ; more sectors remain to load, check for track change inr d mov a,d ;sector=27?, if so, change tracks cpi 27 jc load1 ;carry generated if sector<27 ; ; end of current track, go to next track mvi d,1 ;begin with first sector of next track inr c ;track=track+1 ; ; save register state, and change tracks push b push d push h call settr;must be between 0 and 3 rnc ;no carry if 4,5,... ; disk number is in the proper range ds 10 ;space for disk select ; compute proper disk parameter header address lda diskno mov l,a ;L=disk number 0,1,2,3 mvi h,0 ;high order zero dad h ;*2 dad h ;*4 dad h ;*8 dad h ;*16 (size of each header) lxi d,dpbase dad d ;HL=.dpbase(diskno*16) ret ; settrk: ;set track given by register c mov a,c sta track ds 10h ;space for track select ret ; setsec: ;set sector given by register c mov a,c sta sector ds 10h ;space for sector select ret ; sectran: ;translate the sector given by BC using the ;translate table given by DE xchg ;HL=.trans dad b ;HL=.trans(sector) mov l,m ;L = trans(sector) mvi h,0 ;HL= trans(sector) ret ;with value in HL ; setdma: ;set dma address given by registers b and c mov l,c ;low order address mov h,b ;high order address shld dmaad ;save the address ds 10h ;space for setting the dma address ret ; read: ;perform read operatioåk ;track address set from register c pop h pop d pop b jmp load1 ;for another sector ; ; end of load operation, set parameters and go to cp/m gocpm: mvi a,0c3h ;c3 is a jmp instruction sta 0 ;for jmp to wboot lxi h,wboote ;wboot entry point shld 1 ;set address field for jmp at 0 ; sta 5 ;for jmp to bdos lxi h,bdos ;bdos entry point shld 6 ;address field of jump at 5 to bdos ; lxi b,80h ;default dma address is 80h call setdma ; ei ;enable the interrupt system lda cdisk ;get current disk number mov c,a ;send to the ccp jmp ccp ;go to cp/m for further processing ; ; ; simple i/o handlers (must be filled in by user) ; in each case, the entry point is provided, with space reserved ; to insert your own code ; const: ;console status, return 0ffh if character ready, 00h if not ds 10h ;space for status subroutine mvi a,00h ret ; conin: ;console character into register a ds 10h ;space for input routine ani 7fh ;strip parity bit ret ; conout: ;console charan (usually this is similar to write ; so we will allow space to set up read command, then use ; common code in write) ds 10h ;set up read command jmp waitio ;to perform the actual i/o ; write: ;perform a write operation ds 10h ;set up write command ; waitio: ;enter here from read and write to perform the actual i/o ; operation. return a 00h in register a if the operation completes ; properly, and 01h if an error occurs during the read or write ; ; in this case, we have saved the disk number in 'diskno' (0,1) ; the track number in 'track' (0-76) ; the sector number in 'sector' (1-26) ; the dma address in 'dmaad' (0-65535) ds 256 ;space reserved for I/O drivers mvi a,1 ;error condition ret ;replaced when filled-in ; ; the remainder of the CBIOS is reserved uninitialized ; data area, and does not need to be a part of the ; system memory image (the space must be available, ; however, between "begdat" and "enddat"). ; track: ds 2 ;two bytes for expansion sector: ds 2 ;two ¶Ã=COPYRIGHT (C) 1978, DIGITAL RESEARCH DDT VERS 2.0$1ÅÅ0 ÍÁ!~=�WÕ!x±Êe ~#ÃXÑÁåbx±Ê‡ {æÂzã~#ão}oÒƒ„ÃiÑ.é*|ëÍgÉ> Ó>ÓÛÚ©Ã�ÛæÉ!ƒp+q*‚DMÍ¡:͆ ͆:_2„:`!„¾Úô!Þ:„¾Òí*„&ß N͆!„4ÂÌ!Þ6…ÍÍÃÃOÃ$+q+ÑÁp+qÕõyÍ�ñÉþ Èþ Èþ,Èþ ÈþÊ$É Í ÍÉÍŒþ ÊÍÊ9!z6 # ÂL!zwÍŒÍÊj# ÊÃX:zþ ÉÖ0þ ØÆùþØÃ͘=ÂëN#FyÉÍ}ÂÉæ8Éæ0Éë*zë{¾Â¯#z¾È+++ Â¥ ÉÕz¾ÂÊ#½ÑÉ#ÂÊøÿÑ · ÉÅÍ9Ê!`Í Â yÁÉÅÍ9Ê!rÍ·Â yÁÉÍñþÊÉÍñþÊþÀ=É!z{w# Â%þ Âw!PÍ Â yÍ“ÉÍõÍ}ñöÀÉ*w#"ÉÍŒþ Ê@þ.Ê@Í<Ê!¦EÍ·Â~ÃP !ÎÍ·Â’ÍPÍŒÃQ!æͷªÍPÍ}ÍQxÃQ!êÍ·ÂÆÍÛÍ“G@ÍÛ±°ÃQ! Í·ÂÜ yÍ“G€Ã¾!Í·Âô ÍÛÍ“±ÃQ!Í·ÂÍÛÍ“öÍQÍŒÃQ!.Í·Â6yþÚ#ÆGÍÍ™°ÍQæÏþÀà!2Í·ÂQÍŒþÒÍ“öÇÃQ!>Í·Âq ÂeÁÃgÅÍÍ™±ÃQ:zþJÂ�ÍEöËþC–ÍEöÍQyÍQxÃQþRÂÍöÀÃQ*Õë* {•zœÒ·*ùÉÑ~#" É<æþÚÈÆþÚÏÆÆAOÃGæðÆ�'Î@'OÍxæÆ�'Î@'OÃNÍ#Âõ ¥ Í× þ Â¥ ÅÍ Í Í¿ Ͱ ÍŠ ·Êþ=Â¥ Í` ÁxþÒS |·Â¥ }þÒ¥ ÍÝ gA>þÍM ¤Ag}ÍM ´ÃþÈÃM Âc |·Â¥ }!®wÃþåÍû Ñs#rÃþåÕÅ:[æÊŽ _!€~þÊ  ![4·Ã¡ \Í¢·Â  2[Ãy 7ÁÑáÉÍ >?ÍÁ Ãþ _Í¢!a"]É> åÕÅ_Í¢ÁÑáÉþÈþaØæ_Éå!`~·> Êî 5*]~#"]ÍÎ áÉþ Òú Æ0ÃÁ Æ7ÃÁ õæÍð ñæÃð > ÍÁ > ÃÁ ÅÕå Í¢æáÑÁÉë|Íÿ }Ãÿ þÒ: þ ÒÁ >.ÃÁ ë*Y}“o|šëÉþ Èþ,Èþ ÉÖ0þ ØÆùþØÃ¥ ë^#V#ëÉë!ÍS ))))µoÍ× ÍJ Âk ëÉs#r#å!P4áÉÍ× !P6#þ ÊÏ þ,¨ >€2Pë Íg Í þ ÊÏ Í× Íg Í þ ÊÏ Í× Íg Í þ Â¥ Pþ�Ê¥ ·Éå!½ XN!­~ëáÉÍÝ Êø Ãð æÉÖ!¸ _^ÿ!µÉÍû ^#VëÉ~ÍÁ xþÒ% Íí Íð Éõ>=ÍÁ ñÂ7 !®~Íÿ ÉÍ Í( É!­ Í ÅåÍ áÁ#xþ Ò` þÚF Í¿ ÃF Í¿ ÍõÕÅÍ� Ò€ *³" !6ÿÍé +"Y*³~Íÿ #Í? Ú© õÍ¿ ñ³Ê¥ ^#VëÍ( é ~Íÿ ÁÑñÉCZMEIABDHSPöôüúþ!"GÉó"±á+"³õ!9ñ1±åõÅÕ*³~þÿõå!I~6·Êþ =G#^#V#~xÃí áñÊ"#"³ë!¨N#FÍWÚ"Í *Dë>‚·7Ã…û*G|µÊH+"GÍ ÂH:F·ÂBÍÃ…Í> Ã…Í >*ÍÁ *³Í� Ò\" Í( *±"WÃþ !)~ #¾#Ê{ÂnZÉ*³F#åÍh!Cs!–^#Vëé²Ú²Ú¸ìþ   ÍÈÂ#ÍÓÃ#:¨»À:©ºÉÁá^#V#åÅþ*¯^#VÉÍÈÊçÁÅ>Ã%ÑÕÃ#xþÿÂö¯Ã'æ8_Ã#*±;***************************************************** ;* * ;* Sector Deblocking Algorithms for CP/M 2.0 * ;* * ;***************************************************** ; ; utility macro to compute sector mask smask macro hblk ;; compute log2(hblk), return @x as result ;; (2 ** @x = hblk on return) @y set hblk @x set 0 ;; count right shifts of @y until = 1 rept 8 if @y = 1 exitm endif ;; @y is not 1, shift right one position @y set @y shr 1 @x set @x + 1 endm endm ; ;***************************************************** ;* * ;* CP/M to host disk constants * ;* * ;***************************************************** blksiz equ 2048 ;CP/M allocation size hstsiz equ 512 ;host disk sector size hstspt equ 20 ;host disk sectors/trk hstblk equ hstsiz/1Ãzæ8É͇O!B NÍ#NÍ ÍÃÍæþ¾SÍPÃÍ.* |ÍÕ}ÍÕ ÍÍÉ!9":·Êq!ÿÿ"<Âq<2* ×ÍžÂ@!~·Êƒ5Ê@* Í¡Í. ÍÍÍ;Í£W!E¾Êý# ¡ ¾Êé# ¬¾ÊÎ# ·æÀþ@Ê´þ€Ê¥zæÇÖÊ–=Ê�=Ê|zæÀÊJzæÊ?ÖÊ4ÖÊ)ÖÊzæ zæO=!9 ÍóÍþŸ!6ÍóÃq!2ÍóÍÍÕÃqCÍÍ ÃÙJÍÍ ÃÙRÍÍ Ãq!zæÊ zæ=ÊnþÚaÖ‡‡O ÍóÍ$ÃqÍóÍ$,ÍÃÙ!ÍóÍ;,ÍÃô!Ù!ÍóÍ;Ãqzæ8O!î ÍóÃÅ!êÍóÍ;,Ízæ;Ãqy‡‡O!Î ÍóÍ£õÍ£Wñ_Í•Ãqy‡‡O!¦ Íóͣ͒Ãqy‡‡O!b ÍóÃq!vÍózÍ’ÃqÍ.?Í*ù!9"Í8"͉ÍZ*" Ã+*ùÉ'/7?vÉãéëóùûÆÎÓÖÛÞæîöþ"*2:ÃÍEI SPHLDI XCHGPCHLXTHLRET HLT CMC STC CMA DAA RAR RAL RRC RLC NOP CPI ORI XRI ANI SBI IN SUI OUT ACI ADI CALLJMP LDA STA LHLDSHLDMOV ADD ADC SUB SBB ANA XRA ORA CMP INR DCR MVI LXI STAXINX DAD LDAXDCX RST PSW POP PUSHNZZ NCC POPEP M B C D E H L M A B D H SP PSW ??= ÖÃÑâêÃÉ Ã° Ã× ÃÁ Ãÿ Ã' Ê Ã` à Éã"DãÃ*"¨!¢"!"¯2I!" "W"�"³!1±å!å++"±åå"G>Ã28!†"9:]þ Êþ!åç 1©ë;Â#øÃ#ÑÕÃ#ÍÓÁÅ>Ã%ÑÕÑÕ><7áÉÿÃÇÂÿÍÇÄÿÉÇÇÿéÇÇÆÏç"ÇÀ÷ÓT6*¾}æþÊ^!T4Í2 ÃGÍ Ͱ *hMͽGÍà:ËþÿÂÍÍ®µÍ+GÍGÅWÍ ëÍ+GÍUÉ!Í©>ÿÍ€+ë! �@!’!BH @@A‚BH B! "ˆBHI$$’BI$BI „$„’ ’HI ‚D$��„‘H��„„D$$ H „ B’!$D$ˆ"$’B$�’DA!AB�’I$„�’H B$�’I $’H’I$‘�H$‰! $’I $’I$„$�’’A !Aªªªªªª @’$’I$‰"!$’H$I$’I ’"! $�‘A$ˆ€’ � H„H��„AA"I @�‚$BH! $!D$�H‰€$ I$€$‰’DH@ˆH"B$�’‚HD’DH‚@�$""€A $@ D$B‚€€B H A$$�’BA€�B�"DH„ I$I "D H€@ @@€" ’@D"II!$’I A"UUUI$„$ D‰$$Ê"#"³ë!¨N#FÍWÚ"Í *Dë>‚·7Ã…û*G|µÊH+"GÍ ÂH:F·ÂBÍÃ…Í> Ã…Í >*ÍÁ *³Í� Ò\" Í( *±"WÃþ !)~ #¾#Ê{ÂnZÉ*³F#åÍh!Cs!–^#Vëé²Ú²Ú¸ìþ   ÍÈÂ#ÍÓÃ#:¨»À:©ºÉÁá^#V#åÅþ*¯^#VÉÍÈÊçÁÅ>Ã%ÑÕÃ#xþÿÂö¯Ã'æ8_Ã#*±28 ;CP/M sects/host buff cpmspt equ hstblk * hstspt ;CP/M sectors/track secmsk equ hstblk-1 ;sector mask smask hstblk ;compute sector mask secshf equ @x ;log2(hstblk) ; ;***************************************************** ;* * ;* BDOS constants on entry to write * ;* * ;***************************************************** wrall equ 0 ;write to allocated wrdir equ 1 ;write to directory wrual equ 2 ;write to unallocated ; ;***************************************************** ;* * ;* The BDOS entry points given below show the * ;* code which is relevant to deblocking only. * ;* * ;***************************************************** ; ; DISKDEF macro, or hand coded tables go here dpbase equ $ ;disk param block base ; boot: wboot: ;enter here on systemÍ� Ú !€"Í >-ÍÁ Ͱ Í× þ ÊþÖAÚ¥ þÒ¥ _!7^#Vëé~¥ ¥ Æ¥ \pÚ ¥ ¥ —Z ¥ ¥ ¥ ¥ – t ½ ¹ ¥ ¥ á ¥ ¥ åÕů2[\Í¢ÁÑáÉÍ� Ò¥ ÍŠ =Â¥ Í` " Í ÃþÍ� Ò¥ ÍŠ Ê»Í` " =Ê»Í` "=Â¥ ¯Ã½> 2ÍÃþÍŠ ÊåÍ` ÚÕ"Wæ=ÊåÍ` =Â¥ Ãð*W}æðo¿"YÍ Í Âþ*W"[Í( Í¿ ~Íÿ #Í? Ú}æÂ"W*[ëÍ¿ Í0 *W}“Â#|’Â#*WÍ? ÚþÃóÍŠ þÂ¥ Í` åÍ` åÍ` ÑÁÉ{‘z˜ÉÍA|·Â¥ ÍWÚþ}ÃdÍ ÍŠ Í` åÍ` åÍ` DMÑáóÊ¡Ú�"³æ=Ê¡Ͳ=Ê¡YPͲ1©ÑÁñáù*³å*±ûÉõÅ!I~4·ÊÍ#~#F#»ÂÍxºÂÍ~#s#r#w>ÿÁñÉÍŠ þÂ¥ Í` åÍ` ÑåÍ Í( Í¿ ᯕo>œgÍ( Ãþ¯2|2\Í×  !]w# Ê¥ Í× þ.Ê& þ  Ê0 6 #Ã& þ.ÂK !eÍ× þ ÊK w# Ê¥ Ã: ÊU 6 #ÃK 6ÃþÍAÍWÚþ w#Ã] !e~þHÀ#~þEÀ#~þXÉë*�}“|šëÉÍ{ Ð"�Éå!Í{ áÉÍŠ !ʦ =Â¥ Í` åÍkþÿÊ¥ Íj ÊÛ áå\Í¢á·Â@ €€w# ÂÍ Í… ú Ín þÊ¥ Þ:ÂÛ WáåÍ _Í õÍ ÁO {·Â `i"³Ã@ Í Í w#Â Í õÍ… ñÂ¥ ÃÛ ÅåÕÍn ÍS æðõÍn ÍS Á°GÑ‚WxáÁÉ Í¢!i ~·ÊT ÍÁ #ÃH Í *�Í( Í¿ *³Í( Ãþ NEXT PCÍŠ =Â¥ Í` Í åÍ( Í¿ á~åÍÿ Í¿ Ͱ Í× áþ ʵ þ.ÊþåÍ� =Â¥ Í` |·Â¥ }áw#Ã~ ¯Ã¿ >ÿ2FÍŠ !ÊØ =Â¥ Í` }´Ê¥ +"GÍ> Ã…Í× þ Âï Í> Ãþ !­ ¾Ê # Âõ Ãå boot to initialize xra a ;0 to accumulator sta hstact ;host buffer inactive sta unacnt ;clear unalloc count ret ; seldsk: ;select disk mov a,c ;selected disk number sta sekdsk ;seek disk number mov l,a ;disk number to HL mvi h,0 rept 4 ;multiply by 16 dad h endm lxi d,dpbase ;base of parm block dad d ;hl=.dpb(curdsk) ret ; settrk: ;set track given by registers BC mov h,b mov l,c shld sektrk ;track to seek ret ; setsec: ;set sector given by register c mov a,c sta seksec ;sector to seek ret ; setdma: ;set dma address given by BC mov h,b mov l,c shld dmaadr ret ; sectran: ;translate sector number BC mov h,b mov l,c ret ; ;***************************************************** ;* * ;* The READ entry point takes the place of * ;* the previous BIOS defintion for READ. * ;* * ;*************************************to accum sta unacnt ;unacnt = 0 inr a ;1 to accum sta rsflag ;rsflag = 1 ; ;***************************************************** ;* * ;* Common code for READ and WRITE follows * ;* * ;***************************************************** rwoper: ;enter here to perform the read/write xra a ;zero to accum sta erflag ;no errors (yet) lda seksec ;compute host sector rept secshf ora a ;carry = 0 rar ;shift right endm sta sekhst ;host sector to seek ; ; active host sector? lxi h,hstact ;host active flag mov a,m mvi m,1 ;always becomes 1 ora a ;was it already? jz filhst ;fill host if not ; ; host buffer active, same as seek buffer? lda sekdsk lxi h,hstdsk ;same disk? cmp m ;sekdsk = hstdsk? jnz nomatch ; ; same disk, same track? lxi h,hsttrk call sektrkcmp ;sektrk = hsttrk? jnz nomatch ; ; same disk, same track, same buffer? lda sekh * ;* WRITEHST performs the physical write to * ;* the host disk, READHST reads the physical * ;* disk. * ;* * ;***************************************************** writehst: ;hstdsk = host disk #, hsttrk = host track #, ;hstsec = host sect #. write "hstsiz" bytes ;from hstbuf and return error flag in erflag. ;return erflag non-zero if error ret ; readhst: ;hstdsk = host disk #, hsttrk = host track #, ;hstsec = host sect #. read "hstsiz" bytes ;into hstbuf and return error flag in erflag. ret ; ;***************************************************** ;* * ;* Unitialized RAM data areas * ;* * ;***************************************************** ; sekdsk: ds 1 ;seek disk number sektrk: ds 2 ;seek track number seksec: ds 1 ;seek sector number ; hstdsk: ds 1 ;h**************** read: ;read the selected CP/M sector xra a ;accum = 0 sta unacnt ;unacnt = 0 mvi a,1 sta readop ;read operation sta rsflag ;must read data mvi a,wrual sta wrtype ;treat as unalloc jmp rwoper ;to perform the read ; ;***************************************************** ;* * ;* The WRITE entry point takes the place of * ;* the previous BIOS defintion for WRITE. * ;* * ;***************************************************** write: ;write the selected CP/M sector xra a ;0 to accumulator sta readop ;not a read operation mov a,c ;write type in c sta wrtype cpi wrual ;write unallocated? jnz chkuna ;check for unalloc ; ; write to unallocated, set parameters mvi a,blksiz/128 ;next unalloc recs sta unacnt lda sekdsk ;disk to seek sta unadsk ;unadsk = sekdsk lhld sektrk shld unatrk ;unatrk = sectrk lda seksec sta unasec st lxi h,hstsec ;sekhst = hstsec? cmp m jz match ;skip if match ; nomatch: ;proper disk, but not correct sector lda hstwrt ;host written? ora a cnz writehst ;clear host buff ; filhst: ;may have to fill the host buffer lda sekdsk sta hstdsk lhld sektrk shld hsttrk lda sekhst sta hstsec lda rsflag ;need to read? ora a cnz readhst ;yes, if 1 xra a ;0 to accum sta hstwrt ;no pending write ; match: ;copy data to or from buffer lda seksec ;mask buffer number ani secmsk ;least signif bits mov l,a ;ready to shift mvi h,0 ;double count rept 7 ;shift left 7 dad h endm ; hl has relative host buffer address lxi d,hstbuf dad d ;hl = host address xchg ;now in DE lhld dmaadr ;get/put CP/M data mvi c,128 ;length of move lda readop ;which way? ora a jnz rwmove ;skip if read ; ; write operation, mark and switch direction mvi a,1 sta hstwrt ;hstwrt = 1 xchg ;source/dest swap ; rwmove: ;C initially 128, DE is source, HL ost disk number hsttrk: ds 2 ;host track number hstsec: ds 1 ;host sector number ; sekhst: ds 1 ;seek shr secshf hstact: ds 1 ;host active flag hstwrt: ds 1 ;host written flag ; unacnt: ds 1 ;unalloc rec cnt unadsk: ds 1 ;last unalloc disk unatrk: ds 2 ;last unalloc track unasec: ds 1 ;last unalloc sector ; erflag: ds 1 ;error reporting rsflag: ds 1 ;read sector flag readop: ds 1 ;1 if read operation wrtype: ds 1 ;write operation type dmaadr: ds 2 ;last dma address hstbuf: ds hstsiz ;host buffer ; ;***************************************************** ;* * ;* The ENDEF macro invocation goes here * ;* * ;***************************************************** end åååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå ;unasec = seksec ; chkuna: ;check for write to unallocated sector lda unacnt ;any unalloc remain? ora a jz alloc ;skip if not ; ; more unallocated records remain dcr a ;unacnt = unacnt-1 sta unacnt lda sekdsk ;same disk? lxi h,unadsk cmp m ;sekdsk = unadsk? jnz alloc ;skip if not ; ; disks are the same lxi h,unatrk call sektrkcmp ;sektrk = unatrk? jnz alloc ;skip if not ; ; tracks are the same lda seksec ;same sector? lxi h,unasec cmp m ;seksec = unasec? jnz alloc ;skip if not ; ; match, move to next sector for future ref inr m ;unasec = unasec+1 mov a,m ;end of track? cpi cpmspt ;count CP/M sectors jc noovf ;skip if no overflow ; ; overflow to next track mvi m,0 ;unasec = 0 lhld unatrk inx h shld unatrk ;unatrk = unatrk+1 ; noovf: ;match found, mark as unnecessary read xra a ;0 to accumulator sta rsflag ;rsflag = 0 jmp rwoper ;to perform the write ; alloc: ;not an unallocated record, requires pre-read xra a ;0 is dest ldax d ;source character inx d mov m,a ;to dest inx h dcr c ;loop 128 times jnz rwmove ; ; data has been moved to/from host buffer lda wrtype ;write type cpi wrdir ;to directory? lda erflag ;in case of errors rnz ;no further processing ; ; clear host buffer for directory write ora a ;errors? rnz ;skip if so xra a ;0 to accum sta hstwrt ;buffer written call writehst lda erflag ret ; ;***************************************************** ;* * ;* Utility subroutine for 16-bit compare * ;* * ;***************************************************** sektrkcmp: ;HL = .unatrk or .hsttrk, compare with sektrk xchg lxi h,sektrk ldax d ;low byte compare cmp m ;same? rnz ;return if not ; low bytes equal, test high 1s inx d inx h ldax d cmp m ;sets flags ret ; ;***************************************************** ;* ; CP/M 2.0 disk re-definition library ; ; Copyright (c) 1979 ; Digital Research ; Box 579 ; Pacific Grove, CA ; 93950 ; ; CP/M logical disk drives are defined using the ; macros given below, where the sequence of calls ; is: ; ; disks n ; diskdef parameter-list-0 ; diskdef parameter-list-1 ; ... ; diskdef parameter-list-n ; endef ; ; where n is the number of logical disk drives attached ; to the CP/M system, and parameter-list-i defines the ; characteristics of the ith drive (i=0,1,...,n-1) ; ; each parameter-list-i takes the form ; dn,fsc,lsc,[skf],bls,dks,dir,cks,ofs,[0] ; where ; dn is the disk number 0,1,...,n-1 ; fsc is the first sector number (usually 0 or 1) ; lsc is the last sector number on a track ; skf is optional "skew factor" for sector translate ; bls is the data block size (1024,2048,...,16384) ; dks is the disk size in bls increments (word) ; dir is the number of directory elements (word) ; cks is the number of dir elements to checksum ; ofs is the number of u als&fsc ;same allocation vector size css&dn equ css&fsc ;same checksum vector size xlt&dn equ xlt&fsc ;same translate table else secmax set lsc-(fsc) ;;sectors 0...secmax sectors set secmax+1;;number of sectors als&dn set (dks)/8 ;;size of allocation vector if ((dks) mod 8) ne 0 als&dn set als&dn+1 endif css&dn set (cks)/4 ;;number of checksum elements ;; generate the block shift value blkval set bls/128 ;;number of sectors/block blkshf set 0 ;;counts right 0's in blkval blkmsk set 0 ;;fills with 1's from right rept 16 ;;once for each bit position if blkval=1 exitm endif ;; otherwise, high order 1 not found yet blkshf set blkshf+1 blkmsk set (blkmsk shl 1) or 1 blkval set blkval/2 endm ;; generate the extent mask byte blkval set bls/1024 ;;number of kilobytes/block extmsk set 0 ;;fill from right with 1's rept 16 if blkval=1 exitm endif ;; otherwise more to shift extmsk set (extmsk shl 1) or 1 blkval set blkval/2 endm ;; may be double byte allocation if (dks)nddat equ $ datsiz equ $-begdat ;; db 0 at this point forces hex record endm ; = gcd(sectors,skew) neltst set sectors/gcdn ;; neltst is number of elements to generate ;; before we overlap previous elements nelts set neltst ;;counter xlt&dn equ $ ;translate table rept sectors ;;once for each sector if sectors < 256 ddb %nxtsec+(fsc) else ddw %nxtsec+(fsc) endif nxtsec set nxtsec+(skf) if nxtsec >= sectors nxtsec set nxtsec-sectors endif nelts set nelts-1 if nelts = 0 nxtbas set nxtbas+1 nxtsec set nxtbas nelts set neltst endif endm endif ;;end of nul fac test endif ;;end of nul bls test endm ; defds macro lab,space lab: ds space endm ; lds macro lb,dn,val defds lb&dn,%val&dn endm ; endef macro ;; generate the necessary ram data areas begdat equ $ dirbuf: ds 128 ;directory access buffer dsknxt set 0 rept ndisks ;;once for each disk lds alv,%dsknxt,als lds csv,%dsknxt,css dsknxt set dsknxt+1 endm etracks to skip (word) ; [0] is an optional 0 which forces 16K/directory entry ; ; for convenience, the form ; dn,dm ; defines disk dn as having the same characteristics as ; a previously defined disk dm. ; ; a standard four drive CP/M system is defined by ; disks 4 ; diskdef 0,1,26,6,1024,243,64,64,2 ; dsk set 0 ; rept 3 ; dsk set dsk+1 ; diskdef %dsk,0 ; endm ; endef ; ; the value of "begdat" at the end of assembly defines the ; beginning of the uninitialize ram area above the bios, ; while the value of "enddat" defines the next location ; following the end of the data area. the size of this ; area is given by the value of "datsiz" at the end of the ; assembly. note that the allocation vector will be quite ; large if a large disk size is defined with a small block ; size. ; dskhdr macro dn ;; define a single disk header list dpe&dn: dw xlt&dn,0000h ;translate table dw 0000h,0000h ;scratch area dw dirbuf,dpb&dn ;dir buff,parm block dw csv&dn,alv&dn ;check, alloc vec > 256 extmsk set (extmsk shr 1) endif ;; may be optional [0] in last position if not nul k16 extmsk set k16 endif ;; now generate directory reservation bit vector dirrem set dir ;;# remaining to process dirbks set bls/32 ;;number of entries per block dirblk set 0 ;;fill with 1's on each loop rept 16 if dirrem=0 exitm endif ;; not complete, iterate once again ;; shift right and add 1 high order bit dirblk set (dirblk shr 1) or 8000h if dirrem > dirbks dirrem set dirrem-dirbks else dirrem set 0 endif endm dpbhdr dn ;;generate equ $ ddw %sectors,<;sec per track> ddb %blkshf,<;block shift> ddb %blkmsk,<;block mask> ddb %extmsk,<;extnt mask> ddw %(dks)-1,<;disk size-1> ddw %(dir)-1,<;directory max> ddb %dirblk shr 8,<;alloc0> ddb %dirblk and 0ffh,<;alloc1> ddw %(cks)/4,<;check size> ddw %ofs,<;offset> ;; generate the translate table, if requested if nul skf xlt&dn equ 0 ;no xlate table else if skf = 0 xlt&dn equ 0 ;no xlate table else ;; generaåtors endm ; disks macro nd ;; define nd disks ndisks set nd ;;for later reference dpbase equ $ ;base of disk parameter blocks ;; generate the nd elements dsknxt set 0 rept nd dskhdr %dsknxt dsknxt set dsknxt+1 endm endm ; dpbhdr macro dn dpb&dn equ $ ;disk parm block endm ; ddb macro data,comment ;; define a db statement db data comment endm ; ddw macro data,comment ;; define a dw statement dw data comment endm ; gcd macro m,n ;; greatest common divisor of m,n ;; produces value gcdn as result ;; (used in sector translate table generation) gcdm set m ;;variable for m gcdn set n ;;variable for n gcdr set 0 ;;variable for r rept 65535 gcdx set gcdm/gcdn gcdr set gcdm - gcdx*gcdn if gcdr = 0 exitm endif gcdm set gcdn gcdn set gcdr endm endm ; diskdef macro dn,fsc,lsc,skf,bls,dks,dir,cks,ofs,k16 ;; generate the set statements for later tables if nul lsc ;; current disk dn same as previous fsc dpb&dn equ dpb&fsc ;equivalent parameters als&dn eqte the translate table nxtsec set 0 ;;next sector to fill nxtbas set 0 ;;moves by one on overflow gcd %sectors,skf ;; gcdn = gcd(sectors,skew) neltst set sectors/gcdn ;; neltst is number of elements to generate ;; before we overlap previous elements nelts set neltst ;;counter xlt&dn equ $ ;translate table rept sectors ;;once for each sector if sectors < 256 ddb %nxtsec+(fsc) else ddw %nxtsec+(fsc) endif nxtsec set nxtsec+(skf) if nxtsec >= sectors nxtsec set nxtsec-sectors endif nelts set nelts-1 if nelts = 0 nxtbas set nxtbas+1 nxtsec set nxtbas nelts set neltst endif endm endif ;;end of nul fac test endif ;;end of nul bls test endm ; defds macro lab,space lab: ds space endm ; lds macro lb,dn,val defds lb&dn,%val&dn endm ; endef macro ;; generate the necessary ram data areas begdat equ $ dirbuf: ds 128 ;directory access buffer dsknxt set 0 rept ndisks ;;once for each disk lds alv,%dsknxt,als lds csv,%dsknxt,css dsknxt set dsknxt+1 endm e; FILE DUMP PROGRAM, READS AN INPUT FILE AND PRINTS IN HEX ; ; COPYRIGHT (C) 1975, 1976, 1977, 1978 ; DIGITAL RESEARCH ; BOX 579, PACIFIC GROVE ; CALIFORNIA, 93950 ; ORG 100H BDOS EQU 0005H ;DOS ENTRY POINT CONS EQU 1 ;READ CONSOLE TYPEF EQU 2 ;TYPE FUNCTION PRINTF EQU 9 ;BUFFER PRINT ENTRY BRKF EQU 11 ;BREAK KEY FUNCTION (TRUE IF CHAR READY) OPENF EQU 15 ;FILE OPEN READF EQU 20 ;READ FUNCTION ; FCB EQU 5CH ;FILE CONTROL BLOCK ADDRESS BUFF EQU 80H ;INPUT DISK BUFFER ADDRESS ; ; NON GRAPHIC CHARACTERS CR EQU 0DH ;CARRIAGE RETURN LF EQU 0AH ;LINE FEED ; ; FILE CONTROL BLOCK DEFINITIONS FCBDN EQU FCB+0 ;DISK NAME FCBFN EQU FCB+1 ;FILE NAME FCBFT EQU FCB+9 ;DISK FILE TYPE (3 CHARACTERS) FCBRL EQU FCB+12 ;FILE'S CURRENT REEL NUMBER FCBRC EQU FCB+15 ;FILE'S RECORD COUNT (0 TO 128) FCBCR EQU FCB+32 ;CURRENT (NEXT) RECORD NUMBER (0 TO 127) FCBLN EQU FCB+33 ;FCB LENGTH ; ; SET UP STACK LXI H,0 DAD SP ; ENTRY STACK POINTER IN HL FROM THE CCP SHLD OLDSP ; SET SP TO LOCAL STACK AR ; READ ANOTHER BUFFER ; ; CALL DISKR ORA A ;ZERO VALUE IF READ OK JZ G0 ;FOR ANOTHER BYTE ; END OF DATA, RETURN WITH CARRY SET FOR EOF STC RET ; G0: ;READ THE BYTE AT BUFF+REG A MOV E,A ;LS BYTE OF BUFFER INDEX MVI D,0 ;DOUBLE PRECISION INDEX TO DE INR A ;INDEX=INDEX+1 STA IBP ;BACK TO MEMORY ; POINTER IS INCREMENTED ; SAVE THE CURRENT FILE ADDRESS LXI H,BUFF DAD D ; ABSOLUTE CHARACTER ADDRESS IS IN HL MOV A,M ; BYTE IS IN THE ACCUMULATOR ORA A ;RESET CARRY BIT RET ; SETUP: ;SET UP FILE ; OPEN THE FILE FOR INPUT XRA A ;ZERO TO ACCUM STA FCBCR ;CLEAR CURRENT RECORD ; LXI D,FCB MVI C,OPENF CALL BDOS ; 255 IN ACCUM IF OPEN ERROR RET ; DISKR: ;READ DISK FILE RECORD PUSH H! PUSH D! PUSH B LXI D,FCB MVI C,READF CALL BDOS POP B! POP D! POP H RET ; ; FIXED MESSAGE AREA SIGNON: DB 'FILE DUMP VERSION 1.4$' OPNMSG: DB CR,LF,'NO INPUT FILE PRESENT ON DISK$' ; VARIABLE AREA IBP: DS 2 ;INPUT BUFFER POINTER OLDSP: DS 2 ;ENTRY SP VALUE FROM CCP ;!9"1WÍÁþÿÂóÍœÃQ>€2!åÍ¢áÚQG}æÂDÍrÍYÚQ|Í�}Í�#> ÍexÍ�Ã#Ír*ùÉåÕÅ ÍÁÑáÉåÕÅ_ÍÁÑáÉ> Íe> ÍeÉæþ Ò‰Æ0ËÆ7ÍeÉõÍ}ñÍ}É ÍÉ:þ€Â³Íηʳ7É_<2!€~·É¯2|\ÍÉåÕÅ\ÍÁÑáÉFILE DUMP VERSION 1.4$ NO INPUT FILE PRESENT ON DISK$ê!õÅÕåYÍáÑÁñÉþ Èþ Èþ,Èþ ÈþÊ<É Í ÍÉÍ þ Ê*Í$ÊA!‹6 # ÂT!‹wÍ Í$Êr# Ê*Ã`:‹þ ÉÖ0þ ØÆùþØÃ*ÍAÊ*!‹ ~þ ʰÍxkb))))_ëyþ‘BK{ÉÍ…Â*É!6Ã6Ã!"Éæ8Éæ0Éë*‹ë{¾Âç#z¾È+++ ÂÝ ÉÕ‹¾Â#ÂõDDT COM&TUVDEBLOCK ASMOWXYZ[DISKDEF LIB1\]^_DUMP ASM!`abDUMP $$$ååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååEA (RESTORED AT FINIS) LXI SP,STKTOP ; READ AND PRINT SUCCESSIVE BUFFERS CALL SETUP ;SET UP INPUT FILE CPI 255 ;255 IF FILE NOT PRESENT JNZ OPENOK ;SKIP IF OPEN IS OK ; ; FILE NOT THERE, GIVE ERROR MESSAGE AND RETURN LXI D,OPNMSG CALL ERR JMP FINIS ;TO RETURN ; OPENOK: ;OPEN OPERATION OK, SET BUFFER INDEX TO END MVI A,80H STA IBP ;SET BUFFER POINTER TO 80H ; HL CONTAINS NEXT ADDRESS TO PRINT LXI H,0 ;START WITH 0000 ; GLOOP: PUSH H ;SAVE LINE POSITION CALL GNB POP H ;RECALL LINE POSITION JC FINIS ;CARRY SET BY GNB IF END FILE MOV B,A ; PRINT HEX VALUES ; CHECK FOR LINE FOLD MOV A,L ANI 0FH ;CHECK LOW 4 BITS JNZ NONUM ; PRINT LINE NUMBER CALL CRLF ; ; CHECK FOR BREAK KEY CALL BREAK ; ACCUM LSB = 1 IF CHARACTER READY RRC ;INTO CARRY JC FINIS ;DON'T PRINT ANY MORE ; MOV A,H CALL PHEX MOV A,L CALL PHEX NONUM: INX H ;TO NEXT LINE NUMBER MVI A,' ' CALL PCHAR MOV A,B CALL PHEX JMP GLOOP ; FINIS: ; END OF DUMP, RETURN TO CCP ; (NOTE  ; STACK AREA DS 64 ;RESERVE 32 LEVEL STACK STKTOP: ; END ARRY SET FOR EOF STC RET ; G0: ;READ THE BYTE AT BUFF+REG A MOV E,A ;LS BYTE OF BUFFER INDEX MVI D,0 ;DOUBLE PRECISION INDEX TO DE INR A ;INDEX=INDEX+1 STA IBP ;BACK TO MEMORY ; POINTER IS INCREMENTED ; SAVE THE CURRENT FILE ADDRESS LXI H,BUFF DAD D ; ABSOLUTE CHARACTER ADDRESS IS IN HL MOV A,M ; BYTE IS IN THE ACCUMULATOR ORA A ;RESET CARRY BIT RET ; SETUP: ;SET UP FILE ; OPEN THE FILE FOR INPUT XRA A ;ZERO TO ACCUM STA FCBCR ;CLEAR CURRENT RECORD ; LXI D,FCB MVI C,OPENF CALL BDOS ; 255 IN ACCUM IF OPEN ERROR RET ; DISKR: ;READ DISK FILE RECORD PUSH H! PUSH D! PUSH B LXI D,FCB MVI C,READF CALL BDOS POP B! POP D! POP H RET ; ; FIXED MESSAGE AREA SIGNON: DB 'FILE DUMP VERSION 1.4$' OPNMSG: DB CR,LF,'NO INPUT FILE PRESENT ON DISK$' ; VARIABLE AREA IBP: DS 2 ;INPUT BUFFER POINTER OLDSP: DS 2 ;ENTRY SP VALUE FROM CCP ;åTHAT A JMP TO 0000H REBOOTS) CALL CRLF LHLD OLDSP SPHL ; STACK POINTER CONTAINS CCP'S STACK LOCATION RET ;TO THE CCP ; ; ; SUBROUTINES ; BREAK: ;CHECK BREAK KEY (ACTUALLY ANY KEY WILL DO) PUSH H! PUSH D! PUSH B; ENVIRONMENT SAVED MVI C,BRKF CALL BDOS POP B! POP D! POP H; ENVIRONMENT RESTORED RET ; PCHAR: ;PRINT A CHARACTER PUSH H! PUSH D! PUSH B; SAVED MVI C,TYPEF MOV E,A CALL BDOS POP B! POP D! POP H; RESTORED RET ; CRLF: MVI A,CR CALL PCHAR MVI A,LF CALL PCHAR RET ; ; PNIB: ;PRINT NIBBLE IN REG A ANI 0FH ;LOW 4 BITS CPI 10 JNC P10 ; LESS THAN OR EQUAL TO 9 ADI '0' JMP PRN ; ; GREATER OR EQUAL TO 10 P10: ADI 'A' - 10 PRN: CALL PCHAR RET ; PHEX: ;PRINT HEX CHAR IN REG A PUSH PSW RRC RRC RRC RRC CALL PNIB ;PRINT NIBBLE POP PSW CALL PNIB RET ; ERR: ;PRINT ERROR MESSAGE ; D,E ADDRESSES MESSAGE ENDING WITH "$" MVI C,PRINTF ;PRINT BUFFER FUNCTION CALL BDOS RET ; ; GNB: ;GET NEXT BYTE LDA IBP CPI 80H JNZ G0 åÃÀ COPYRIGHT (C) 1979, DIGITAL RESEARCH DISK OR DIRECTORY FULL$FILE EXISTS, ERASE IT$NEW FILE$** FILE IS READ/ONLY **$"SYSTEM" FILE NOT ACCESSIBLE$BAK$$$BAK$$$-(Y/N)?$NO MEMORY$BREAK "$" AT $1mMÍò"m Í×+ë!8s~1m!f6²Í *MÍË ºÍú *!MÍË Íï 1m! 6!6! 6ÍÆ: 2EÍÕÒbͽ!e:d¾Ê\:æðõ:eæÁH±2Í Ãî HÍÕÒ†ͽ:e2!:d2e:!2dûÃî :!þI¬!Š: –ÖŸõ:ÖÖŸÁH¡2 Ò®ÍX:h2iÍÒ�:!þÊ�:!ÖÖŸõ:!ÖÖŸÁH±õ:!ÖÖŸÁH±Ò,!"! 6#~þÂÍï ÍFÃ)Í·ÍX:!þÂÍï ÍXÃ):i!h¾Ò)Í9 ÃÃe:!þÂÊ:h2jO>¹ÒF ÍL>!"ÍŸõ:i!j–ŸÁH¡Ò¼*"+M ~þ ʼͲ!f6!h6!"! 6ÍF!f6:h2k!i¾Ò :i2k:j2h:k!h¾Ò¶Í9 æ:h2j!!6:j2hÃe:!þ >"ÍúµÂáÃõͲ*"M ~2!OÍË :!þ Â*+"ëÍÉ:7Ò •Íe ÍÉ!p+q*DMÍ Íï Í É=Í? )Í É!p+q.å*DMFá -ÂL É*9"`!"b!h6!j6!|6.!=\ -Âx !e:d¾Ê¥ *eMÍç \ÍR :xþÿÊ¥ @Í *dMÍç \Í, :xþÿÂ× \Í• :xþÿÂË Í- VÍ Íï Ãù :eÒë _Í Íï Ãù :fÒù wÍ ”Í: =Íe !e:d¾Ê*eMÍç =Íe —Í: =Íe =Í• !]6:xþÿÂ>Í- !"É!76!¡6!µ6!66É*dMÍç ¶Í÷ ÉÍÓ*dMÍç !6:8!¾ÚÏ*`ë*;DMÍ÷ \Íu 2xþÊ»>!x¾Ò¨Í- *`ë*;6:82ÃÅ€*`"`:<2ÂwÍÓÉ!"`É9`ÍíÚéÍh*`ë*;~2þÊ*`#"`:É*eMÍç !bÍÓ+ë!s{þÿÂ!ÉÍf!6:!¾Úb*bë*^DMÍ÷ =Í… þÊNÍ- €*b"b:<2Â)ÍfÉ!"bÉ!q9bÍíÚ€Í*bë*^:w*b#"bÉ!q:6þ€Ú¶ÍZ•Í… þʱÍ- !66*6&¶ :w:6<26É!J6*b}æþÊê:J<2JÍmÃÐÍ=Í? :xþÿÂþÍ- šÍ: Í;*dMÍç .=\ -Â=ͨ Í;�Í: *eMÍç =ͨ É.M= -ÂCÉ!q:þÊYÉ*MÍË É!q:ÖaŸ/õ>z!–Ÿ/ÁH¡É!q*MÍaÒŽ:æ_É:É!q:Ò¥*MÍyÉ:É!p+q!'"!6>ÍúµÊ*ë*ͪ{2*ë*ͪ"*ë! ͪë":ÖÆÿŸ!¶Ò!*FMÍÕÒ8Íï *FMÍü   ÍÍó OÍy2FÍï :FþYÊ5Ã>É>É:!Ö02HO> ‘Ÿ/É!"Í;Òu*)))å*)Á å*H&Á "ÍÆÃPÉÍíÒ˜! 6Ííë+s#ré! 6Íí"ÉDM!>õ)ë—)ë�‘o|˜gÒà ñ=±É^#Vë) ÂÍÉ^#Vë|·g}o Â×É_{•ozœgÉi`N#F‘o˜gÉo&•oœgÉ_{–_z#žWëÉ H Â=ÂÉ LIBX$$$$$$$LIBÍ$:2É*ëÍo/ÒÃ×É*!MÍyõ:”<2”=O!s ÁHqÉ*ë*DMÍÉÍ·! 6: þÂe!"*""?Ãk*&"?*?+M ~2AÖ ÖŸõ:hÖÆÿŸÁH¡Ò�Íï *&"?(?ÍíÚÙ:Aþ ½Í8*#"ÍÄ Ò½Ã×*?M ~2AOÍË *?"?Ò•É!"É*"É*"ÉÍáÍÚÍ^: 2B! 6ÍÚÍF:B2 o(ÍíµÖŸõ>&ÍúµÖŸÁH±Ò6Í›Ã9ÍèÉ!C6>!C¾ÚaÍÄ ÒRÃõ>úÍ:C<2CÂ?É! 6!"É͇Í¢Ò�q"ÍíÚŠÍ›Ã�ÍÄÃqÉ!!6 ÍÙ!!6 ÍÙÉ!6*!MÍa2D*!MÍ’2!:D/!¶+wÉ!6Íe2!Í¢É!Eq!E:!–ÖŸõ:ŠÖÖŸÁH¡õ:ÖÖŸÁH¡É!Fq!!6Ãe*!MÍ› /Ò$^ÍL:!Æ@OÍL:!þ Â2Í‘Ãe:þÂb:!þ ÚL:h<2hÃb:!þ Âb:hæO>‘!h†wÍÙ:!þ ÂpÍX:!þ Â…!!6  ÍLÊ!!6ûô:!þʛ͑:! ¦Ò©Íï Ãî OÍüÒ¸û:!þR†!”6ÍGÍÒá>!”¾ÒÛÃ×ÍÃÈ!!6 :”ÖÖŸ2Ò.t– -Âý•Í? Ã>!”¾ÚÍÃ!6!“6sÍ, !”6€:xþÿÂB!6OÃõÍU2!þÊSÍÙÃB!G6:Òƒ!6:G¾Òƒ*G&¶ ~2!:G<2GÍÙÃ_Ãî QÍüÒ›=Íe Í Ãî Íb:!þ-®ÍÆ! 6:!þ#¿͇ÍÆÃüÍ;ÒÜÍJ:!þ:ÂÙ!!6LÍvÃü:!þ:ÂüÍÆÍJÍv: þÂü*#"ÍŽÒ! 6:!þBÂ)! >–w!"&*o"(ÍRÃî :!þCÂ:ÍeÍRÃî :!þDÂKÍeÍXÃî :!þKÂ\Í·ÍXÃî :!þLÂjÍ^Ãî :!þPšÍŽÒ‡! 6ÍÚÍF×Í¢Ò—ÍïÍ:ÇÃî :!þT¨ÍFÃî :!þU¾: ÖÖŸ2Ãî :!þVÂüÍŽÒî"$ÍíDMÍ©/ÍË *oDMÍ©Íï Ãù: ÖÖŸ2Ãî :!þ Â(:ÖÖŸõ:ÖÖŸÁH¡Ò%Í^ÍbÍFÃî : ÖÖŸõÍŽÁH±Òë :!þAÂy! 6*""&*o"(ÍRÍŽÒaÍnÍ¢ÒnÍÄÃa! 6ÍRÃè :!þF”ÍüÍ¢Ò‘Í ÄÃè :!þJ ÍüÍ$:2Í$Í¢Ò Í :=2:<2!¾ÒÝ*&Ÿ ~2!ÍÙü*""I*M*ëÍo/ÒöÃ×!:–"6:Æ0OÍË Ã ÍË ÃºÉ!p+q:/Ò(É*DMÍ©:ÍË  ÍË : ÒI ÍË ÃN*ÍË É*DMÍÉ:þÊaÉÍOÉ>!¾ÒºÍÄ ÒxÃ×!: ¾Ú¦> ÍúµÊ¡* +" >ÍãµÂ¡Ã×! 6: <2 =O! NÍ’É: ÒÉÍó OÍ’É: Ò! 6:hÖÖŸ!¦Òo$ÍíÚúÍÃýÍOÃ*ÍË Í¸ ! 6 ÍË !h6!Š: –ÖŸ2 Ò3* &‹ 6 : <2 =O!‹ NÍ’É*dMÍç €Í÷ É:”þ€ÚsÍGsÍu þÊn>É!”6:”<2”=O!€ NÍ’É!ÿÿ"É>ÍúµÖŸÉ!"ÉÍŽ/Ò´*+">É>É!": þÂß*#"*""*!".+",Ãñ*$"**o".!",!36:3Ò{.*ÍíµÆÿŸ22*,ë**"0M õ~Ö ÆÿŸÁH¡Ò3*0"*Ãý*+"*+">ÍãµÆÿŸ23:2/Òk!36,*Ííë+s#rÃx:3Òx*0"*Ãö: þ“**"&*"+"(á*$#"&**#"(É*"#""É*$#"$É*"+""É*$+"$É*#"É!4qM*"å*$å: þÂ*(yÚñ"$ááÉDMáÑ}‘|˜ÒC#~þ  å*#"áÃö*&DMáÑy“xšÒCþ Â1å*+"áõ:4Ò?ñw+ÃñÃÕ³â"$á""ÉÉÍÊÉÍÊÉÍ·ÍRÉ: þ—*$"("ÍíÒˆ!"&Ô"Íí"&ÃÃ*""&$mÍíÍýÚ¸*o"(ÃÃ*ë*$"(É$"ÍíÚÓÃíÍÚOÍ26þÂæÍ›É*"M :6wÍ¢:6þ ÂÍÂÉåÍú"&! 6ÍR*I""ëÃè :!ÖMÖŸõ:ÖÖŸÁH¡Ò| ! 6ÿ>ÍúµÂF Í›Íeõ: <2 O! ÁHqyþ Êd ÃF : 2! 6å*ëá#s#rÃè :!þNÂÝ ÍüÍ¢ÒÚ *ëÍo/Ò× ÍÄ Ò¦ ÃõÍáͶÍn! 6!"&ÍRÍè! 6o$ÍíÚÔ Ã×ÃŽ Ç Ãè :!þSÂ0 ÍüÍ$Í¢Ò- Í :2"Íúë+s#r!:¾Ò* *&Ÿ ~2!:<2ÍÙà Ãë Ãè :!þWÂ> ÍvÃè :!þX³ ÍZÍŽÒ\ ÍE•Íe ð :7/Òƒ ÍE!76•Íe •Í• :xþÿƒ Í- Í·*&"K(KÍíÚ° *KM NÍ”*K"KÒŒ Ãè :!þZÂÝ ÍŽÒÍ Íó þÂÍ ÃõÍ¢ÒÚ Í:ÃÍ Ãè :!þÊè ÃâÃî ÃâÃ'ûvÍÉ!gq:fÒ É*g&ëÍÉ!lq:lþ Ú$ !h4:lþ Â1 !h6*lMÍü É:hþÂB ÉÍ  Í Í !h55É!mq:mÖ ÖŸõ:hæO>‘ÁH¡2nyÒ} !m6 !o6:n!o¾Úš *mMÍ !o4‚ É!pq:pþ Úª >É:pÖ ÖŸõ:pÖ ÖŸÁH±õ:pÖ ÖŸÁH±É!qq*qMÍ› Úç ^ÍW :qÆ@2q*qMÍW É ÍË  ÍË É!sp+q*rë ÍÉ!up+qÍï *tDMÍú É!wp+q*vë ÍÉ!zp+q*yëÍ2xÉ!|p+q*{ëÍ2xÉ!~p+q*}ëÍ2xÉ!€p+q*ëÍÉ!‚p+q*�ëÍÉ!„p+q*ƒëÍÉ!†p+q*…ëÍ2xÉ!ˆp+q*‡ëÍÉ!‰6€‰Í É ÍÒÛ Í>É>ÉÍÉ! q* &ëÍÉ!p+q*ÃÄÉ!7q:Ò*7MÍ’É:7Éo$ÍíÚ+Í›Éͪ*$M ~28OÍm:8þ ÂIÍÂÉÃÉ͇Í¢Òu$oÍíqÍýÚoÍ›ÃrÍÃPÉ! 6!"&*$"(ÍRÍŽÒ”ÍMÍ¢Ò¡ÍÔ($ÍíÒµ! 6ÍRÉ͇ÍvÉͶÍÚ2!þÊÕ*!MÍmÃÀÍËÉ$"ÍíµÂéÃí*"M :!wÍ¢:!þ ÂÍÂÉÍe2!ÖÖŸõ:!Ö ÖŸõ: /ÁH¡ÁH±/ÉÍÒQ:!þ Â@!!6 ÍR!!6 :!þÂKÃâÍRÃ$É*&Ÿ :!w:<2þdÚnÃíÉ!:s+q*$";!>6:>/;oõÍíŸÁH¡Òç*;#"(";:92=*=&Ÿ å*(M Ñ–ÖŸ!:õ:=–ÖŸ2>/ÁH¡Òä:=<2=*(#"(æÀ:>Òø*(+"(ÍR:>É!6Í$:2É*ëÍo/ÒÃ×É*!MÍyõ:”<2”=O!s ÁHqÉ*ë*DMÍÉÍ·! 6: þÂe!"*""?Ãk*&"?*?+M ~2AÖ ÖŸõ:hÖÆÿŸÁH¡Ò�Íï *&"?(?ÍíÚÙ:Aþ ½Í8*#"ÍÄ Ò½Ã×*?M ~2AOÍË *?"?Ò•É!"É*"É*"ÉÍáÍÚÍ^: 2B! 6ÍÚÍF:B2 o(ÍíµÖŸõ>&ÍúµÖŸÁH±Ò6Í›Ã9ÍèÉ!C6>!C¾ÚaÍÄ ÒRÃõ>úÍ:C<2CÂ?É! 6!"É͇Í¢Ò�q"ÍíÚŠÍ›Ã�ÍÄÃqÉ!!6 ÍÙ!!6 ÍÙÉ!6*!MÍa2D*!MÍ’2!:D/!¶+wÉ!6Íe2!Í¢É!Eq!E:!–ÖŸõ:ŠÖÖŸÁH¡õ:ÖÖŸÁH¡É!FqN#FÅ!~#foÍ![ñññ* ^å* ^#" ^á~·Â(Ã<[* ^~þ-Â@!øÿ—w#w* ^#" ^* ^~þ0ÂR!õÿ60ÃX!õÿ6 !óÿ—w#w* ^~þ0ú¤* ^>9¾ú¤!óÿå* ^~O‡ŸG!óÿ~#foÅMD)) )Á Ðÿ Á}|* ^#" ^Ã`!ñÿ—w#w* ^~þ. !öÿ>w‡Ÿ#w* ^#" ^* ^~þ0ú* ^>9¾ú!ñÿå* ^~O‡ŸG!ñÿ~#foÅMD)) )Á Ðÿ Á}|* ^#" ^ÃÇ!öÿ—w#w>2^‡Ÿ2^* ^~O‡ŸG!wÃöZ—2^2^! å* c##N#FÅ+++N#FÅ!¬[" ^* ^åÍQ=ññññi`" ^!^~#¶Â¯* c####" c÷! å* cN#FÅ!¬[" ^* ^åÍ|<ñññi`" ^Ã\* c~#fo" ^* ^åÍò>ñi`" ^Ã\* c##" c!øÿ~#¶Ê!óÿ: ^–:^#žò!å!õÿå!N#FÅ!~#foÍ![ñññ!óÿ~Öw#~ÞwÃÁ! ^—–>#žò** ^å* ^å!N#FÅ!~#foÍ![ñññ!øÿ~#¶ÂÑ!óÿ: ^–:^#žòÑ!å!õÿå!N#FÅ!~#foÍ![ñññ!óÿ~Öw#~ÞwÃ4%5u %5u %5u track head sector : can't write writeenter a file name, otherwise press If you'd like a copy of that in a file, %5u %5u %5u track head sector No bad sectors Í[!öÿ9ù*à]~O—GyþÿÂLxþÂZ!$åÍ–ñÃ"[!åÍ–ñ!öÿ:à]w:á]#w!öÿ~#fo~O—Gyþÿ„xþÊÌ!öÿ~#fo##~O—GÅ!öÿ~#fo#~O—GÅ!öÿ~#fo~O—GÅ!åÍ/ññññ!öÿ~Æw#~ÎwÃo!×åÍ–ñ!ªåÍ–ñ!¬[åÍò*ñ:¬[·ÂîÃ"[!øÿå!¤å!¬[åÍ„%ññD) Áå*à]ãÁ Á • œÚ4!îÿ~Öw#~ÞwÃ4!îÿ~Æw#~Îwæ!îÿ~#fo6ÿÃ"[Badmap written Error writing badmap Í[!öÿ9ù!øÿ:à]w:á]#w!öÿ—w#w!öÿå!Ä]Á – #žÒÍ*Â]å!öÿ~#foãÁ å*À]å!øÿN#FÅ!åÍ^ ññññy°ÊØ!QåÍD ñÃØ!AåÍ–ñÃ"[!øÿ~Æ€w#~Îw!öÿ~Æw#~ÎwÄÍ[!~Öw#~Þw—2^2^:Ø]2^:Ù]2^!^å—2ùb2úb:Ú]2ûb:Û]2üb!ùbåÍßYñ!#~‡Ÿ2ùb2úb~2üb+~2ûb!ùbå!^åÍßYá~2 ^#~2!^#~2"^#~2#^! ^å!N#FÅ*Ú]åÍÅVÁ—2ùb2úby2ûbx2üb!ùbåÍ Wñ! ^å!#~‡Ÿ2ùb2úb~2üb+~2ûb!ùbåÍ Wñ! ^å*Ü]å!€åÍ VÁ—2ùb2úby2ûbx2üb!ùbåÍßYñ! ^ùbÍmWÃ"[Select error trying to access that drive! CP/M logical drive (a, b, etc.) Í[!úý9ù!åÍ–ñ!úýåÍò*ñ!úý~2$^:$^þAúƒ!$^>Z¾úƒ:$^O‡ŸG!a MD!¿ÿ MDÊ:$^O‡ŸGy2$^:$^O‡ŸGÅÍ4$ñy°ÊC:$^O‡ŸGi`Ÿÿ "´]!å!å!åÍ ñññi`"¸]!å*´]å!åÍS%ñññi`"ä]*ä] ~#fo"æ]!å*¸]å!åÍS%ñññ!å*¸]å!åÍ ñññ!ä]~#¶Ê9 *ä] ~#fo N#FÅ!åÍ€Uá"º]Ã"[!îåÍ–ñÃCÍ[!N#FÅÍ–ñ!åÍ:5ñÃ"[Í[õõõõ!å*´]å!åÍS%ñññ!å!N#FÅ!åÍS%ñññ!å! N#FÅ!!åÍS%ñññ!å!N#FÅ!$åÍS%ñññ!~#¶Âã !øÿå!å!å!'åÍS%ñññáywx#wÃ!!øÿå!å!å!*åÍS%ñññáywx#wfo" c! ~#fo" c!~#fo":^—2>^2?^! c:>^–:?^#žÒ )—2<^2=^! c:<^–:=^#žÒ²)*:^å* c ~Öw#~Þw+ú�)* cN#FÅ* c~Æw#~Îwá~O‡ŸGyæÿO—GÉ)* cåÍÐ-ñáyw* c ~#fo}æ0ÊÆ)ò)*>^MDÃ<[*>^#">^Ã")* c ~#fo}æ0ʨ)à)*:^#":^*<^#"<^Ã8)Í&[!~#fo" c!~#fo" c! ~#fo" c!~#fo"@^—2D^2E^! c:D^–:E^#žÒ†** c ~#fo}æ †*—2B^2C^! c:B^–:C^#žÒŽ** c ~#fo}æ ÂŽ** c ~Öw#~Þw+ú©** cN#FÅ* c~Æw#~Îwáå*@^Á~ÃÁ**D^MDÃ<[*D^#"D^à **B^#"B^*@^#"@^Ã4** cå*@^~O‡ŸGyæÿO—GÅ͉/ññ*@^~þ ˜** c ~#fo}æ@o|æg}´Ê˜** cå!ÿÿå͉/ññØ*Í&[!~#fo" c* c" c:o^Ö2o^:p^Þ2p^ú3+*m^å*m^#"m^á~O‡ŸGyæÿO—GÃ;+!m^åÍÐ-ñi`" c: cþÿÂM+: cþÿÊs+: cþ Â]+: cþÊs+* cå* c#" cá: cwÃ+* c6: cþÿÂ…+: cþÿ +! c: c¾Â—+: c#¾Â +Ã¥+* cMDÃ<[Í&[õõ!~#fo" c!~#fo" c!~#fo" c!öÿ: cw:c#w: cÖ2 c: cÞ2 c! c—–>#žòr,!øÿå* c ~Öw#~Þw+ú2,* cN#FÅ* c~Æw#~Îwá~O‡ŸGyæÿO—GÃ:,* cåÍÐ-ñáywx#w+~þÿÂK,#~þÿÊr,!öÿN#FÅ!öÿ~Æw#~Îwáå!øÿÁ~ þ ÂÛ+!öÿ~#fo6!øÿ~þÿŠ,#~þÿ¨,!öÿå! cÁ ¾ÂŸ, #¾Â¨,í,* cMDÃ<[Í&[!~#fo" c!}^å* cåÍ-ññ:^Ö2^:€^Þ2€^úï,*}^å*}^#"}^á6 Ãü,!}^å! å͉/ññ*ƒ^}áywx#w!øÿ~#¶Â%!•å!¬[å!åͰ>ñññÃÌ!øÿN#FÅ!�åÍ-ññ!öÿ:à]w:á]#w!öÿ~#fo~O—GyþÿÂXxþÊ©!öÿ~#fo##~O—GÅ!öÿ~#fo#~O—GÅ!öÿ~#fo~O—GÅ!så!øÿN#FÅÍQ! 9ù!öÿ~Æw#~ÎwÃC!øÿN#FÅÍM(ñÃ"[ Another bad sector ? New sector added track %u, head %u, sector %u, OK ? Sector Head: Track: Bad map full Í[*Ô]å*Ü]åÍÅV!åÍ Vá"^*à]"â]*â]~O—GyþÿÂ_xþÊn*â]###"â]ÃO*^ÅMD) Áå*à]ãÁ :â]•:ã]œÚ¤!"åÍ–ñ:â]Ö2â]:ã]Þ2ã]þ*Ö]å!åͲ"ññi`"^*Ø]å!åͲ"ññi`"^*Ú]å!åͲ"ññi`"^*â]:^w*â]#:^w*â]##:^w*â]##~O—GÅ*â]#~O—GÅ*â]~O—GÅ!áåÍ/ññññ!¬[åÍò*ñ:¬[2^:^þAúM!^>Z¾úM:^O‡ŸG!a MD!¿ÿ MDÃT:^O‡ŸGy2^:^þyÂq!ÏåÍ–ñ*â]###"â]!¬[å!¸åÍ£$ññ:¬[2^:^þAú«!^>Z¾ú«:^O‡ŸG!a MD!¿ÿ MDò:^O‡ŸGy2^:^þyÊn*â]6ÿÍgÃ"[spt = %u, dsm = %u Drive type not found M26m26readÍ[!öû9ù!øûå*ä] Á~#~!öûå!ûå*©[åÍ„%ññáywx#w!öû~#¶ÂH*©[åÍ:!ñÍ:5!öûN#FÅ!å!úýåͨ+ñññ!öûN#FÅ!å!úýåͨ+ñññ!öû~#fo ~#fo}æ0ÊÅ!ÝåÍ/ñ!øû~#fo N#FÅ!øû~#foN#FÅ!ÉåÍ/ñññ!åÍ:5ñÃ"[!úýåÍý!ñy°Â_!úý"^*^~·Ê÷*^~þ Ê]*^~þ ÂSÃ]!úý"^!ú!øÿ~#foMDÃ"[Out of memory Í[! !åÍD ñÃ"[: can't access Í[!å!*!å!N#FÅ!åͰ>ññññÃ"[Í[!~#fo~·Ê—!!~#fo> ¾ò‡!!~#fo~þú—!!~Æw#~ÎwÃ^!!~#fo> ¾òæ!!~#fo~þòæ!!N#FÅ!~Æw#~Îwáå!N#FÅ!~Æw#~ÎwáÁ~×!!~#fo6!~#foMDÃ"[Í[!~#fo~·Ê/"!~#fo> ¾ò5"!~#fo~þò5"Ã"[Ã"[!~Æw#~ÎwÃ"Í[õõõõ!øÿå!N#FÅÍò>ñÅÍÕ2ñáywx#w!øÿ~#¶Âv"Í!!å!N#FÅ!øÿN#FÅÍ<ñññ!øÿ~#foMDÃ"[Maximum value is %u Í[!úý9ù!N#FÅÍ–ñ!úýåÍò*ñ*s^}æ0ÊÛ"Í:5!úýåÍø8ñi`"%^!:%^–:&^#žÒ#*%^MDÃ"[!~#foÿÿ å!�"åÍ/ññú"Í&[!~#fo" c!~#fo" c>2'^:'^þÒi#* c :'^O—G ~O—GyæO—GÅÍõ#ñy2(^:(^þ ¢#>2'^:'^þÒ½#* c :'^O—G ~O—GyæO—GÅÍõ#ñy2(^:(^þ ÂÅ#ý#* cå* c#" cá:(^w:'^Æ2'^Ã8#* c6Ã<[:'^·ÂÚ#* cå* c#" cá6.* cå* c#" cá:(^w:'^Æ2'^Ãn#Í[!~ÖA#~ÞÚ*$!>Z–>#žÚ*$!N#F!a MD!¿ÿ MDÃ1$!N#FÃ"[Í[!å!~ÖA#~Þún$!>Z–>#žún$!N#F!a MD!¿ÿ MDÃu$!N#Fáywx#w!~Öa#~Þú�$!>p–>#žú�$à$Ã"[Í[!N#FÅÍ–ñ!N#FÅÍò*ñÃ"[Í[!öÿ9ù!~#fo~·Ê %!øÿå!Á~#~!öÿå!Á~#~!øÿ~#fo~·æ@o|æg}´Ê-!}^å!ÿÿå͉/ññÃ<[Í&[!~#fo" c!~#fo" c* cå* c#" cá~2 c‡Ÿ2 c! c~#¶Ê‚-* c ~Öw#~Þw+ú…-* cN#FÅ* c~Æw#~Îwá: cwØ-Ã<[* cå* c}æÿo—gå͉/ññ: cþ Â¥-: cþÂ5-* c ~#fo}æ@o|æg}´Ê5-* cå!ÿÿå͉/ññÃ5-Í&[!~#fo" c* c ~#fo}æÊ.* c ~#fo}æ0Ê.ÿÿÃ<[* c ~#¶Â.* cåÍæ0ñ* c ~#fo}æ@o|æg}´Ê….—2F^2G^:F^Ö:G^Þò….*F^å!åÍÅVás^ ~#fo}æ@o|æg}´Ê/*F^å!åÍÅVám^ å!ÿÿå͉/ññÃ/* c å* c ~#fo}æʤ.ç.Å* c N#FÅ* c N#FÅ͆@ñññáywx#w* cå* c Á~#~* c ~Öw#~Þw+ò/* c ~þÿÂ/#~þÿÂm/* c ~öwÃx/*F^#"F^Ã:.* c å* c ~#fo#MDx‡Ÿ2ùb2úbx2üby2ûb!ùbåÍ Wñ* cN#FÅ* c~Æw#~Îwá~O‡ŸGyæÿO—GÃ<[* c ~ö w* c —w#wÿÿÃ<[Í&[!~#fo" c!~#fo" c* c ~#fo}æÊÄ/* c ~#fo}æ ÊÌ/* cMDÃ<[* c ~#¶Âá/* cåÍæ0ñ* c~#foå* c Áy–Ox#žGi`"H^!H^~#¶ÊE0*H^å* c N#FÅ* c N#FÅÍFñññ!H^y¾Â10x#¾ÊE0* c ~ö wÿÿÃ<[* c å:I^‡Ÿ2ùb2úb:I^2üb:H^2ûb!ùbåÍ Wñ* cå* c Á~#~* c å* c ~#fo}æÊ�0à0áywx#w: cþÿ³0:cþÿÊÞ0* cN#FÅ* c~Æw#~Îwá: cw* c ~Öw#~Þw* cMDÃ<[Í&[!ðÿ9ù!~#fo" c* c ûå*^åÍ[!ññi`"^!úûåÍø8ñi`"Ê]!úûå*^åÍ[!ññi`"^!úûåÍø8ñi`"Ì]!úûå*^åÍ[!ññi`"^!úûåÍø8ñi`"Î]!úûå*^åÍ[!ññi`"^!úûåÍø8ñi`"Ð]!úûå*^åÍ[!ññi`"^!úûåÍø8ñi`"Ò]!úûå*^åÍ[!ññi`"^!úûåÍø8ñi`"Ô]!úûå*^åÍ[!ññi`"^!úûåÍø8ñi`"Ö]!úûå*^åÍ[!ññi`"^!úûåÍø8ñi`"Ø]!úûå*^åÍ[!ññi`"^!úûåÍø8ñi`"Ú]!úûå*^åÍ[!ññi`"^!úûåÍø8ñi`"Ü]*^~·ÂeÃ_*^#"^ÃÚ*^6Ã÷*^åÍE"ñi`"Þ]!øû~#foå!Ê]Á ¾Âˆ #¾Â_!øû~#fo å!Ì]Á ¾Â¥ #¾Â_*Þ]å!÷åÍÁ$ññy°ÂÌ*Þ]å!óåÍÁ$ññy°ÊÔ>2«[Ã"[>2«[ÃÑError reading badmap Í[!ìÿ9ù!ìÿå*ä] Á~#~!å*´]å!åÍS%ñññ*ä]N#FÅ!å!0åÍS%ñññi`"¼]!ðÿå*Ò]å*Ð]å*Î]åÍõñññá:ùbw:úb#w:ûb#w:üb#w!ôÿå!ìÿ~#foÁ~#~!ðÿåáùbÍmW!ùbå!ôÿ—2c2c~2c#~2c!cåÍ~Xá##~2À]#~2Á]!ðÿåáùbÍmW!ùbå!ôÿ—2c2c~2c#~2c!cåÍ·X:½]‡Ÿ2c2c:½]2c:¼]2c!cåÍ Wá##~2Â]#~2Ã]*Ô]å*Ü]åÍÅVá"¶]*¶]åÍÕ2ñi`"à]!à]~#¶Â,Í!*¶]å!€åÍ€Uá"Ä]!øÿ:à]w:á]#w!öÿ—w#w!öÿå!Ä]Á – #žÒ™*Â]å!öÿ~#foãÁ å*À]å!øÿN#FÅ!åÍ^ ññññy°ÊÙ!ÜåÍD ñÃÙ!îÿ:à]w:á]#w!îÿå*à]å*¶]ãÁ Á • œÒö!îÿ~#fo~O—GyþÿÂÓxþÂ$Ãö!øÿ~Æ€w#~Îw!öÿ~Æw#~ÎwÃP!îÿå*¶]ÅMÂ,%Ã"[Ã"[!øÿ~Æw#~Îw!öÿ~Æw#~ÎwÃö$!øÿ~#foå!öÿ~#foÁ ¾Ê%!~Æw#~ÎwÃÉ$Õ!9^#V#N#F#~#foå*+++{þÊt%þ0Ñõ̓%O‡ŸGñÑÀMDÉéÍ&[!~#fo" c!~#fo" cÍ &i`"+^!+^~#¶Â´%Ã<[* cå* cåÍ'ññi`")^:)^þÿÂÓ%:*^þÿÂÜ%Ã<[* cå*)^å*+^åÍÛ'ñññ*+^MDÃ<[Í&[!~#fo" c!~#fo" c!~#fo" c* cå* cåÍ'ññi`"-^:-^þÿÂ9&:.^þÿÂB&Ã<[* cåÍM(ñ* cå*-^å* cåÍÛ'ñññ* cMDÃ<[Í[Í &i`"/^!/^~#¶Â~&Ã"[!N#FÅ!N#FÅ*/^åÍÛ'ñññ*/^MDÃ"[Í[—22^23^>21^:1^þòï&:1^O‡ŸGÅ!åÍÅVás^ ~#fo}æÂ÷&:1^O‡ŸGÅ!åÍÅVám^ "2^Ã÷&*2^MDÃ"[:1^Æ21^ï&¸'rX'a9'wÒ'Í&[!~#fo" c!~#fo" c* c~O‡ŸG!'ÃöZ!å!å* cåÍ}Lñññi`"4^*4^MDÃ<[!å!å* cåÍQNñññi`"4^:4^þÿÂ|':5^þÿ–'!å!å* cåÍ}Lñññi`"4^!å!6^##N#FÅ+++N#FÅ*4^åÍl?ññññÃP'!å!å* cåÍQNñññi`"4^ÃP'!ÿÿ"4^ÃP'Í&[!ðÿ9ù!~#fo" c!~#fo" c!~#fo" c* c : cw: c#w* c —w#w* c —w#w* c å* c~þrÂA(ÃD(áywx#wÃ<[Í&[!~#fo" c* cå!ÿÿå͉/ññ* c N#FÅÍ÷Kñ* c ~æüw#~æÿw* c ~#fo}æÊË(* c ~#fo|æÊÎ(* c N#FÅÍù1ñ* c ~æÿw#~æýwÃÎ(Ã<[* c —w#w* c ~æ÷w#~æÿwÃË(Í&[!~#fo" c!~#~#¶ÂF1* c ~#fo}æÊo1* cå* c å!J^å* c ~#foãÁ Á}| á w #wÃù0!êÿå* c N#FÅÍ%?ññx·úÀ1* c #~öwÃÀ1* cå* c å!å!åÍ 2ññáywx#w+Á~#~ i`~#¶Â­1* c ~öwÃù0* c ~öw#~öwÃù0!å![^##N#FÅ+++N#FÅ* c N#FÅÍl?ññññx·òö1* c ~ö@wÃ<[Í[!N#FÅÍá3ñÃ"[Í&[!~#fo" c!~#fo" c* cå* cåÍÅVÁi`" c* cåÍÕ2ñi`" c* c" c! c~#¶ÂW2Ã<[* cå: cÖ2 c:cÞ2cá}´Ê‚2* cå* c#" cá6ÃW2* cMDÃ<[Í[!c^~#¶Â©2!_^"a^*a^"c^—2_^2`^*c^MDÃ"[Í&[!~#fo" c* c å!åÍ Vá#MDÃ<[Í&[!~#fo" c* cåͱ2ñi`"i^ÍŠ2i`"g^*g^##~#fo"e^*e^å!i^Á – #žÚS3*e^å!i^Á ¾Â&3 #¾Â�3*g^##å*e^##Á~#~ð3*e^"g^*e^##~#fo"e^Ã3!c^:e^¾Âb3:f^#¾Â>3!€åÍ"Eñi`"e^!e^~#¶ÂÂ3Ã<[*e^å!i^Á – #ž*e^å*e^~#fo))ãÁ "e^*e^:i^w:j^#w*g^"c^*e^####MDÃ<[*e^> w>#w*e^####åÍá3ñ*c^"e^Ã>3Í&[!~#fo" c! c~#¶Âû3Ã<[: cÖ2 c:cÞ2cÍŠ2i`"k^! c:k^–:l^#žÒˆ4*k^##: c–:c#žÒˆ4* c~#fo))å* cãÁ å*k^##Áy¾ÂR4x#¾ÂÈ4* cå*k^##~#foÁ † #Ž* c å*k^##~#fo##Á~#~ÃÜ4*k^##:k^–:l^#žÚ¹4! c:k^–:l^#žÚ34*k^##: c–:c#žÚ34*k^##~#fo"k^Ã4* c å*k^##Á~#~*k^~#fo))å*k^ãÁ å! cÁy¾Âù4x#¾Â#5*k^åññ* c " c* cå* cåÍ(Vá0 }2Ð_!Ð_>9¾Ò.=:Ð_Æ'2Ð_* cå* c#" cá:Ð_w* cå!Áy–Ox#žGÃ<[Í&[! ~#fo" c!~#fo" c:c·ò¿=* c>•o>œg" c!#~·ò¿=!å!åáùbÍmW!ùbåÍ�ZáÁ~#~#~#~* cå* c#" cá6-!ùbÍmW!ùbå:c‡Ÿ2c2c:c2c: c2c!cåÍòXá~2Ô_#~2Õ_#~2Ö_#~2×_!Ô_~#¶#¶#¶Ê2>* cå!Ô_##N#FÅ+++N#FÅ* cåÍQ=ññññ* c " c!ùbÍmW!ùbå:c‡Ÿ2c2c:c2c: c2c!cåÍ0Y>02c‡Ÿ2c2c2c!cåÍ Wá##~2Ó_!Ó_>9¾Ò�>:Ó_Æ'2Ó_* cå* c#" cá:Ó_w* cå!Áy–Ox#žGÃ<[Í&[!" c* c~#¶Êï>* cN#FÅÍò>ñÅ* cN#FÅ!N#FÅÍFñññ* c##" cú>Ã<[Í&[!~#fo" c* c~·Ê?* c#" cÃ?* cå!Áy–Ox#žGÃ<[Í[!å!Ø_##N#FÅ+++N#FÅ!N#FÅÍl?ññññx·òV?Ã"[ÿÿÃ"[@í?²?\@Í[!N#FÅÍÿMñi`"à_!à_~#¶Â�?ÿÿÃ"[*à_ ~þDÊ¢?ÿÿÃ"[! ~#foMD!\?ÃöZ!~2Ü_#~2Ý_#~2Þ_#~2ß_*à_#:Ü_w:Ý_#w:Þ_#w:ß_#w!~#foMDÃ"[*à_#åáùbÍmW!ùbå!åÍ Wá~2Ü_#~2Ý_#~2Þ_#~2ß_ÃÉ?*à_ åÍ=Mñx‡Ÿ2ùb2úbx2üby2ûb!ùbå!åÍ Wá~2Ü_#~2Ý_#~2Þ_#~2ß_ÃÉ?ÿÿÃ"[Æ@Æ@A¨AC=AT7AL7APADhBÍ[!ùþ9ù!N#FÅÍÿMñi`"ì_!~#¶Ê²@!ì_~#¶Â¸@ÿÿÃ"[*ì_~O‡ŸG!b@ÃöZ!~#fo"â_!~#foå!~#foãÁ "æ_*ì_ ~#¶Âû@Ãþ@y2ãÁ " `!`:`–2`:`#ž2`!~#fo#å—2ùb2úb:`2ûb:`2üb!ùbåÍ Wñ>2`Ã#H!€:`O—G}‘o|˜g"`!`:`–:`#žÒnI*`MDÃsI*`MDi`"`*`å* `å!zÿ:`O—G åÍ–Tñññ*`å!"åÍ ññy°ÊùHÿÿÃ"[!`~#¶ÊõI! `: `–:`#žÚæIÃõI* `å* `#" `á6 * `å* `#" `á:`wêI! `: `–:`#žÚŒH! `: `–: `#žÒ Jà Ji`"`!`~#¶Ê!J* `" `* `å!yÿ:`O—G Áy•OxœGi`"`!N#FÅÍ#Oñ:`Ö€:`ÞÒ‹J!ùþå!åÍ ññ*`å!!åÍ ññy°Ê·J!å!€å!ùþåÍTTñññ÷J!€"`!yÿå!åÍ ññ*`å!"åÍ ññy°ÊÿJÿÿÃ"[*`å!yÿ:`O—G å!ùþ:`O—G åÍ–Tñññ!ùþå!åÍ ññ*`å!"åÍ ññy°ÊÿJÿÿÃ"[!yÿ" `>2`!~#fo#å—2ùb2úb:`2ûb:`2üb!ùbåÍ Wñ!`~#¶ÊæI* `å* `#" `á6 !`~#¶ÂæIÃõI* `å!Áy–Ox#žGÃ"[Í[õõõõ!øÿ—w#w!øÿ~Ö#~ÞòŸK!øÿN#FÅÍ÷Kñ!øÿ~Æw#~ÎwÃuK!åÍ ñÃ"[Í[! åÍ ñy°ÂÄK—2`2`Ã"[*`#"`:`Ö:`ÞúôK!åÍ ñyþÂéKxþÂôK!åÍ ñÃ"[Í[!N#FÅÍÿMñi`"`!`~#¶ÂLÿÿÃ"[*` ~þDÂYL*`~·ÊYL*` å!åÍ ññi`"`:`·úoL!`>–>#žúoL*` 6!~#foMDÃ"[!>ÿw>ÿ#wÃYLÍ[!~#¶Ê¦L!~þ˜L#~þʦL!>w‡Ÿ#wÍŸOi`"`!`~#¶Â½LÿÿÃ"[*`å!N#FÅÍPññy°ÂÙLÿÿÃ"[*` ~þDÂM*` å!åÍ ññ*` å!* cÁ † #Ž*k^##å* c Á~#~Ã15*k^##: cw:c#w*k^"c^Ã<[Í&[!~#fo" c>2m_:m_þò 6:m_O‡ŸGÅ!åÍÅVám^ ~#foå:m_O‡ŸGÅ!åÍÅVáq^ Áy–Ox#žGi`"n_!n_~#¶Ê6:m_O‡ŸGÅ!åÍÅVás^ ~#fo}æÊ6:m_O‡ŸGÅ!åÍÅVáq^ ~#¶Ê6*n_å:m_O‡ŸGÅ!åÍÅVáq^ N#FÅ:m_O‡ŸGÅ!åÍÅVáu^ N#FÅÍFñññÃ6* cåÍfKñÃ<[:m_Æ2m_ÃM5Í&[!~#fo" c!~#fo" c!~#fo" c! c~#¶Êc6* cå* cÁ ¾Êi6Ã<[Ã<[: cÖ2 c: cÞ2 c* c#" c* c#" cÃG6Í&[!~#fo" c!~#foå!~#foãÁ " c!~#fo" c! c: c–:c#žÒÜ6* cå* c#" cá: cwú6!~#foMDÃ<[Í&[!~#fo" c!~#fo" c!~#fo" c!p_"Æ_*Æ_—w#w*Æ_##å* cÿÿ Á}|!p_:Æ_•:Ç_œÚa7*Æ_å*Æ_##Á – #žúd7:Æ_Ö2Æ_:Ç_Þ2Ç_Ã-7Ã<[*Æ_~#foÿÿ "À_*Æ_##~#fo"Ä_*Ä_"Â_!Â_:À_–:Á_#žò¿7*À_#"À_! å*Ä_å*À_å* cÍ![ñññx·ò:8*À_#"À_Ú7! å*Ä_å*À_å* cÍ![ñññ*À_å*Æ_Áy–Ox#žGÅ*Æ_##~#foå!À_Áy–Ox#žGá}‘|˜ò²8*Æ_####å*Æ_Á~#~*Æ_ å*À_ÿÿ Á}|*Æ_å*À_#Á}|Ãë8:Â_Ö2Â_:Ã_Þ2Ã_!Â_:À_–:Á_#žòŠ8! å*Ä_å*Â_å* cÍ![ñññ—‘>˜òŠ8:Â_Ö2Â_:Ã_Þ2Ã_ÃJ8!Â_:À_–:Á_#žò„7! å*Â_å*À_å* cÍ![ñññÄ7*Æ_####å*À_#Á}|*Æ_ å*Æ_##Á~#~*Æ_##å*À_ÿÿ Á}|*Æ_####"Æ_Ã-7Í[õõõõ!è_*ì_ ~O‡ŸG!n@ÃöZÿÿÃ"[!N#FÅ!N#FÅ*ì_åÍnBñññÃ"[Ã"[!æ_:â_–:ã_#žÒ’A!åÍ ñy2é_:è_·ÊtA:é_O—GyþÂnAxþ‡AÃ’A*â_å*â_#"â_á:é_wÃ=A:é_þ ÂtAÃ=A*â_å!Áy–Ox#žGÃ"[Ã’A!ùþ6ÿ!ùþå! åÍ ññ! å!åÍ ññ!ûþ"ä_!úþ~O—G!y–x#žÒïA!úþ~O—GÃöA!N#Fy2é_:é_·ÊB*ä_~O‡ŸGyþÂBxþÂAB>2é_!æ_:â_–:ã_#žÒ’A:é_·Â’A*â_å*â_#"â_á6 Ã’A*â_å*â_#"â_áå*ä_å*ä_#"ä_áÁ~:é_Ö2é_ÃúAÿÿÃ"[Í[!zÿ9ùͪK!~#fo"ð_!~#fo"ö_!~#fo "ü_!~#fo#åáùbÍmW!ùbå>2c‡Ÿ2c2c2c!cåÍ7Wá##~2õ_!~#fo ~#¶Ê4C!ö_~#¶ÊœD!N#FÅÍ#Oñ:ö_Ö€:÷_ÞÚ¾C:õ_·Â¾C!€"ú_*ð_å!åÍ ññ*ü_å!!åÍ ññy°Ê+DÜD—2ø_2ù_!úÿ"î_*î_"ò_!ö_~#¶ÊwD!î_:ò_¾Â`C:ó_#¾Â¯D!~#fo#å—2ùb2úb:ø_2ûb:ù_2üb!ùbåÍ Wñ—2ø_2ù_!N#FÅÍ#Oñ!zÿå!åÍ ññ*ü_å!!åÍ ññy°ÊÌDÃwD!zÿå!åÍ ññ*ü_å!!åÍ ññy°ÂœD!€:õ_O—G}‘o|˜g"ú_!ö_:ú_–:û_#žÒD*ú_MDà D*ö_MDi`"ú_*ú_å!zÿ:õ_O—G å*ð_åÍ–Tñññ*ð_å*ú_ãÁ "ð_!ú_:ö_–2ö_:÷_#ž2÷_!~#fo#å—2ùb2úb:ú_2ûb:û_2üb!ùbåÍ Wñ>2õ_ÃãB!~#fo#å—2ùb2úb:ø_2ûb:ù_2üb!ùbåÍ Wñ*ð_å!Áy–Ox#žGÃ"[*ò_~2ô_:ô_O‡ŸGyþÂÆDxþÂâDÃwD!zÿ:õ_O—G "ò_>2õ_ïD*ò_#"ò_*ø_#"ø_:ô_þ ÊHC:ô_·ÊHC*åÍ ññx·òMÿÿÃ"[*` 6!N#FÅ!N#FÅ!N#FÅÍQNñññÃ"[Í[!N#FÅ!#åÍ ññyþÿÂZMxþÿÂiM!!`ùbÍmWÃ"[!~#fo! MD 2ûb‡Ÿ2üb2úb2ùb!ùbå!~#fo" MD 2c‡Ÿ2c2c2c!cå!åÍ8YÍ¢Z!~#fo# MD 2c‡Ÿ2c2c2c!cå!åÍ8YÍ¢Z>‡Ÿ2c2c>2c>€2c!cåÍßYñÃ"[Í[!#~·úN!~Ö#~Þú NÃ"[!N#FÅ!,åÍÅVá9` "%`*%` ~·ÂINÃ"[*%`MDÃ"[Í[!~#¶ÊzN!~þÂlN#~þÊzN!>w‡Ÿ#wÍŸOi`"'`!'`~#¶Â‘NÿÿÃ"[*'`å!N#FÅÍPññy°Â­NÿÿÃ"[*'` ~þDÂßN*'` å!åÍ ññx·òßN*'` 6ÿÿÃ"[*'`å!Á~*'`#—w#w#w#w*'` å!Á~#~*'`9`}‘o|˜gå!,åÍ VáMDÃ"[Í[!~#fo#~2)`#~2*`#~2+`#~2,`!~#fo "-`*-`! å!)`å!åͧYáÁ##~*-`" å!)`å!åͧYáÁ##~*-`# å!)`å!åͧYáÁ##~Ã"[Í[õõõõ!øÿ9`ywx#w!øÿùb~‘#~˜ÒÒO!øÿ~#fo ~·ÂçO!øÿùb~‘#~˜Ú÷OÃ"[!øÿ~Æ,w#~ÎwòO!øÿ~#foMDÃ"[RDR:PTP:CON:LST:Í[!Úÿ9ù!~#¶ÊAP!~#fo~·ÊAP!~#¶ÂGPÃ"[!N#FÅÍTñi`"5`:5`Ö :6`ÞúkPÃ"[!Úÿ"/`!~#fo"1`*1`~·ÊÏP*/`~æw*/`å*1`~þaú³P*1`>z¾ú³P*1`~O‡ŸG!àÿ MDûP*1`~O‡ŸGáyw*/`#"/`*1`#"1`Ã}P*/`6!å!ÚÿÁ}|:5`þÂðP:6`þÂ'Q!~#fo###~þ å!øÿå!å!N#FÅÍ(9ññññ!øÿ~#foMDÃ"[Í[—2Î_2Ï_!~#fo—w#w! ~Ö#~ÞúZ9! >$–>#žò`9Ã"[! > –>#žú�9! ~#fo/ }2Ì_Ñ9! ~#fo6 }2Ì_!~#fo"È_!~#foå!~#foãÁ "Ê_*È_~þ ÊÅ9*È_~þ ÂÏ9*È_#"È_ó9*È_~þ-Ââ9>2Î_‡Ÿ2Ï_*È_~þ-Êô9*È_~þ+Âû9*È_#"È_! ~þ :#~þÂV:*È_~þ0ÂV:*È_#~þaÚ::*È_#>z¾Ú::*È_#~O—G!àÿ MDÃB:*È_#~O—GyþXÂK:xþÂV:*È_##"È_!Ê_:È_–:É_#žÒœ:*È_~þaÚ‡:*È_>z¾Ú‡:*È_~O—G!àÿ MDÃŽ:*È_~O—Gy2Í_!Í_:Ì_¾Ò®::Í_þLÂR;*È_#"È_ÃR;:Í_þ0Úô:!Í_>9¾Úô:!~#foå!~#foN#FÅ! N#FÅÍÅVá:Í_O—G Ðÿ Á}|ÃH;:Í_þaÚ;!Í_>z¾Ò;:Í_þAÚœ:!Í_>Z¾Úœ:!~#foå!~#foN#FÅ! N#FÅÍÅVá:Í_O—G Éÿ Á}|*È_#"È_ÃV:!Î_~#¶Ê~;!~#foå!~#fo~#fo>•o>œgÁ}|*È_å!Áy–Ox#žG!~‘#~˜Ò¤;!N#Fô;*È_å!Áy–Ox#žGÃ"[Í&[!~#fo" c!~#fo" c!~#fo" c* cå: cÖ2 c: cÞ2 cá}´Ê<* cå* c#" cáå* cå* c#" cáÁ~ÃÛ;Ã<[Í&[!~#fo" c!" c* c~#¶Êd<* c~#fo" c* c~·Êq<* cå* c#" cáå* cÁ~* c#" cÃ?<* c6* cMDÃ<[* c##" cÃ,<Í&[!~#fo" c!~#fo" c!~#fo" c: c·òØ<* c>•o>œg" c:c·òØ<* c>•o>œg" c* cå* c#" cá6-* cå* cåÍ Vá"Ñ_!Ñ_~#¶Ê =* cå*Ñ_å* cåÍ|<ñð_å*ð_#"ð_á:ô_w:ö_Ö2ö_:÷_Þ2÷_ÃHCÍ[!îÿ9ù!îÿ:þ_w:ÿ_#w!ðÿå*þ_å!~#foãÁ Á}|!òÿ:w:#w!öÿå!øÿÁ}|!ôÿ—w>#w!ÿÿå!þ_Áy–Ox#žG!y–x#žÒ˜EÃ"[!ðÿå!öÿÁ – #žÒéE!ðÿå!òÿÁ – #žÒéE!ôÿå!ðÿÁ – #žÒéE!ðÿ~#fo"þ_!îÿ~#foMDÃ"[Ã"[]F]FoFGTÿFL÷FP’FCuFDGJG 7G{GÍ[ͪK!~#¶ÊIF!N#FÅÍÿMñi`"`!`~#¶ÂOFÿÿÃ"[*`~O‡ŸG!ïEÃöZ*` ~O‡ŸG!ûEÃöZÿÿÃ"[!N#FÅ!N#FÅ*`åͱGñññÃ"[>2`!~#fo"`!~#foå!~#foãÁ "`*` ~#¶ÊG!`:`–:`#žÒ7G*`å*`#"`á~O‡ŸGÅ:`O‡ŸGÅÍ ññÃÆF>2`×F>2`×F!~#foMDÃ"[ÿÿÃ"[!`:`–:`#žÒ7G*`~O‡ŸG!FÃöZ*`å!Áy–Ox#žGÃ"[!:`¾ÂZG:`#¾ÊjG*`ÿÿ ~þ Ê{G! å:`O‡ŸGÅÍ ññ*`å*`#"`á~O‡ŸGÅ:`O‡ŸGÅÍ ññÃGÅI ªIªIªI ÓIÍ[!ùþ9ù!~#fo" `!~#fo"`!~#fo "`!~#fo#åáùbÍmW!ùbå>2c‡Ÿ2c2c2c!cåÍ7Wá##~2`!~#fo ~#¶ÊwH!`~#¶ÊSK!N#FÅÍ#Oñ:`Ö€:`ÞÚÃH:`·ÂÃH!€"`* `å!åÍ ññ*`å!"åÍ ññy°ÊùHÿÿÃ"[!yÿ:`O—G " `!ùÿ" `*`å:`Ö2`:`Þ2`á}´ÊSK* `å* `#" `á~2`:`O‡ŸG!�GÃöZ!zÿå!åÍ ññ*`å!!åÍ ññy°ÊEI!å!€å!zÿåÍTTñññÃEI* `å*`:Â'Q!På!N#FÅÍôTññy°Ê†Q>L25`‡Ÿ26`ÃìQ!~#fo 6D!~#fo "7`*7`6!~#fo#~þ:ÂR!~#fo~25`‡Ÿ26`:5`ÖA:6`ÞúOR!5`>P–>#žòURÃOR!På!N#FÅÍôTññy°Ê©Q>C25`‡Ÿ26`ÃìQ! På!N#FÅÍôTññy°ÊÌQ>P25`‡Ÿ26`ÃìQ!På!N#FÅÍôTññy°ÊR>T25`‡Ÿ26`!~#fo :5`wÃ"[!~#fo 6Ã"[*7`#"/`—25`26`:5`Ö:6`Þò´R!~#fo~·ÊsR!~#fo~þ.‹RÃsRÃ"[*7`å*5`Àÿ Á}!~Æw#~ÎwÃR*/`å*/`#"/`á6 *5`#"5`Ã$R*/`å*/`#"/`áå!N#FÅ!~Æw#~ÎwáÁ~Ã�R!~#fo~·ÊßR!~#fo~þ.ÊßR!~Æw#~ÎwôR!~#fo~þ.ÂúR!~Æw#~Îw—25`26`:5`Ö:6`Þò,S!~#fo~·Â\S*/`å*/`#"/`á6 ÂS*7` å*7` å*7` å*7` 6Á~á wÁ~Ã"[*/`å*/`#"/`áå!N#FÅ!~Æw#~ÎwáÁ~*5`#"5`ÃSÍ[!N#FÅ!~Öw#~Þwá}´ÊT!~#foå!~#fo~þAúåS!~#fo>Z¾úåS!~#fo~O‡ŸG! MDÃòS!~#fo~O‡ŸGáyw!~Æw#~ÎwÃ�SÃ"[Í[õõõõ!øÿå!Á~#~!øÿ~#fo~·Ê#žw! 9N#Fx·ò¬U—‘O>˜GÍDUÁññÒ¼U—‘O>˜G! 9q#pÑÃg[åÅÕ! 9~·òÞU—+–w>#žw! 9N#Fx·òòU—‘O>˜GÍDUñÁñÒV—‘O>˜G! 9q#pÑÃg[åÅÕ! 9N#FÍDUÁññ! 9q#pÑÃg[åÅÕ! 9N#FÍDUñÁñ! 9q#pÑÃg[åÅ!9~·òSV/<ÃwVÊg[O!9~#fo) Â_VùVåÅ!9~·òwV/<ÃSVÊg[O!9~#fo|‡|g}o ƒVùVåÅ!9~·ò¢V/<ÃSVÊg[O!9~#fo|·g}o ®VMD!9q#pÃg[åÅ!å! 9~+¶ÊþV~ÒäV! 9N#Fá å! 9~‡w#~�w! 9~·w+~wÃËVÁ!9q#pÃg[åÅ!9N#F!9~#fo ##† #Ž +++Ž #ŽÃg[åÅ!9N#F!9~#fo ¦ #¦ #¦ #¦Ãg[~#~#~#~#~#~#~#~É!9MD!9~#~#~#~— ø!9~‡w#~�w#~�w#~�w#~�w#~�w#~�w#~�w!9MD! 9 – #ž #ž #žÚŸW!9MD! 9 – #ž #ž #ž!94ßWãÅÕë!ðÿ9ùëé!9ùÑÃg[#~#~+++~#~É#~·òX—#–>#ž>+++ž>#žÉ~#~#~ #~É{æÊKX—–>#ž>#ž >#žÉÍX!9MD!9~#foÍ+X! 9MD!9~#foÍ+XÍ|W!9N#F!9Í^XÃXÍX!9MD!9~#foÍ+X! 9MD!9~#foÍ+XÍ|W!9N#F!9Í^XÃXÍX! 9MD!***************************************************************** * * * Formathd formats the Discus M26 or the Discus M10 hard disk * * drive. It write sector header information on the entire disk * * surface. When the formatting has been completed, a map is * * created on track 0, head 0, last two sectors of all the * * encountered bad sectors. Each entry of the map consists of * * the three bytes identifying the track, head, and sector that * * was bad. * * * * Written By Bobby Dale Gifford. * * 5/18/81 * * * ***************************************************************** title '*** Format Program for Discus M26 & M10 under CP/M 2.2 ***' revnum equ 22 ;Revision number x.x hdorg equ 050h ;Hard disk origin status equ hdorg ;Status register cntrol equ hdorg ;Control register data equ hdorg+3 ;Data register functn equ hdorg+2 ;Function register comnd equ hdorg+1 ;Command register result equ hdorg+1 ;Result register retry equ 2 retries e call pbuff call rbuff jz wboot cpi 'Y' jz skiphd cpi 'N' jnz preask call preform jmp skiphd dohead call headmap skiphd mvi a,2 sta phase lda much ani 2 cnz datamap ;Make the bad sector map lda much ani 4 cnz seeks lxi d,donmsg jmp exit continu lxi d,notyet jmp exit howmuch lxi d,muchmsg call pbuff call rbuff cpi acr jz wboot cpi '1' jc howmuch cpi '7'+1 jnc howmuch sui '0' sta much ret getphy lxi d,phnum call pbuff call rbuff cpi acr jz wboot cpi '1' jc getphy cpi '4'+1 jnc getphy sui '1' sta drive gettyp lxi d,drvtyp call pbuff call rbuff cpi acr jz wboot cpi 'A' jc gettyp cpi 'C'+1 jnc gettyp sui 'A' sta disktyp cpi 1 mvi a,hedm10 sta heads jz gtype mvi a,hedm20 sta heads ret gtype xra a sta sdelay lxi d,dtype call pbuff call rbuff cpi acr jz wboot cpi 'F' rz cpi 'M' jnz gtype mvi a,1 sta sdelay ret getlog lxi d,lognum call pbuff call rbuff cpi9~#fo#ÍX!9MD!9~#fo#ÍXÍ|W!9N#Fkb9ÍKXÃXÍXÃ÷XåÅ!9~·òHY/<Ã~YÊg[O!9~#fo##~‡w#~�w+++~�w#~�w ÂUYÃg[åÅ!9~·ò~Y/<ÃHYÊg[O!9~#fo##+~‡~w+~w###~w+~w ÂŒYÃg[åÅ!9~·ò·Y/<ÃHYÊg[O!9~#fo##+~·w+~w###~w+~w ÂÅYÃg[åÅ!9~#foN#FÅ#N#FÅ! 9~#foN#FÅ#N#FÅ!åå!9~+¶+¶+¶ÊaZ~Ò7Z!9MD!9 † #Ž #Ž #Ž!9~‡w#~�w#~�w#~�w!9~·w+~w+~w+~wÃZ!9N#F!9~#~á}|! 9ùÃg[å!9~#fo—##–w>#žw>+++žw>#žwáÉåÅ!9N#F!9~#fo ¶ #¶ #¶ #¶Ãg[åÅ!9N#F!9~#fo ##– #ž +++ž #žÃg[~#¶Â[#~#foéy#¾Â[x#¾Â[+++~#foé##ÃöZ!9ëãéëùÑÉÁ!þÿ9ëå* cå* cå* cåi`é!úÿùá" cá" cá" cÑÉõ!9N#F###q#pÁ+++qÁáññÉ!9N#F#q#pÁáñÉV2.1: copyright (c) 1979 by Whitesmiths, Ltd.2qu 20 ;Maximum error count tkzero equ 1 ;Track zero flag bit opdone equ 2 ;Operation complete flag bit complt equ 4 ;Complete flag bit tmout equ 8 ;Time out flag bit wfault equ 10h ;Write fault flag bit drvrdy equ 20h ;Drive ready flag bit index equ 40h ;Index hole flag bit halt equ 80h ;Halt flag bit cstrt equ 3 ;Command start drvmsk equ 3 ;Drive bit mask pstep equ 4 ;Positive step bit hdrlen equ 4 ;Header length in bytes seclen equ 512 ;Sector length in bytes wenabl equ 0fh ;Write enable cpuclk equ 0bh ;Cpu clock mask wreset equ 0bh ;Write fault reset mask scenbl equ 5 dskclk equ 7 ;Disk drive clock mask secm26 equ 32 ;Sector count for m26 secm10 equ 21 ;Sector count for m10 trkm26 equ 202 ;Tracks on an M26 trkm10 equ 244 ;Tracks on an M10 hedm26 equ 8 ;Heads on an M26 hedm10 equ 4 ;Heads on an M10 hedm20 equ 8 ;Heads on an M20 wprot equ 80h ;Write protect flag bit mdir equ 0f7h ;Direction mask nstep equ 0fbh ;Negative step mask null equ 0fch ;Null c acr jz wboot cpi '1' jc getlog push psw call phytyp mvi b,'3'+1 jz cmptrk1 lda heads cpi hedm20 mvi b,'2'+1 jnz cmptrk1 mvi b,'3'+1 cmptrk1 pop psw cmp b jnc getlog sui '1' mov e,a mvi d,0 call phytyp lxi h,trksm26 jz trksok lda heads cpi hedm20 lxi h,trksm10 jnz trksok lxi h,trksm20 trksok dad d mov a,m sta frsttrk inx h mov a,m sta lasttrk ret trksm26 db 0,64,127,203 trksm10 db 0,122,244 trksm20 db 0,98,195,244 headata lxi d,hdmsg call pbuff xra a sta nodata call rbuff cpi acr jz wboot cpi 'H' rz cpi 'D' jnz headata mvi a,1 sta nodata ret phytyp lda disktyp ana a ret ***************************************************************** * * * Prep makes sure the drive is up and running. * * * ***************************************************************** prep lda drive ;Select the drive ori null ;Nop sta dfnreg out functn mvi a,scenbl out cntrol mvi c,239 lxi h,0 ***** delay call phytyp cpi 2 rz ;If its an M20 it will do the settle delay cpi 1 jnz dodel lda sdelay ora a rz dodel lhld settle deloop dcx h mov a,h ora l inx h dcx h in status ;Waste a little extra time to get 33 ms jmp $+3 jnz deloop ret ***************************************************************** * * * Headmap scans sector headers, locating bad ones. Each bad * * header is entered into the bad sector map. * * * ***************************************************************** headmap lxi d,headmsg call pbuff call trkzro lxi h,0 shld buffer shld buffer+2 xra a sta head newhed mvi a,1 sta hedbuf1 sta sflg call zers lda head rlc rlc rlc rlc ani 70h cma ani 0fch mov b,a lda drive add b sta dfnreg out functn hedtst lxi h,hedbuf1 mvi a,1 call initfld call panic call indx lxi h,hedbuf1 call phytyp mvi b,secm26 jz wrtloop mvi b,secm10 wrtloop mvi c,hdrlen mvi a,isbuff oujnz zrolook lda errflg ana a mvi a,0 sta errflg lxi d,acralf jnz pbuff ret ***************************************************************** * * * Datamap locates bad sector data fields. * * * ***************************************************************** datamap lxi d,datmsg call pbuff call trkzro lxi h,0 shld buffer shld buffer+2 xra a sta head inr a sta buffer+2 nxthed call makbuf0 lda buffer+1 ana a mvi a,0 jnz zkey mvi a,80h zkey sta buffer+3 mvi a,1 sta datbuf1 sta sflg call zers samhed call panic lxi h,datbuf1 push h call phytyp mvi a,seclen/(secm26*hdrlen) jz goinit mvi a,seclen/(secm10*hdrlen) goinit call initfld pop h wrdlp lda buffer+2 xra m mov m,a mvi c,retries wagan push b push h call preprw pop h push h call wdata jnc wok pop h pop b dcr c jnz wagan push b push h lda buffer+2 ora a ral sui 4 call incerr wok pop h pop b lda buffer+2 xra m mov m,a c in status ani drvrdy jz measure lxi d,rdywait call pbuff tdelay in status ani drvrdy jz measure dcx h mov a,h ora l jnz tdelay dcr c jnz tdelay lxi d,rdymsg jmp exit ***************************************************************** * * * Measure measures the time in machine cycles for one * * revolution of the disk. * * * ***************************************************************** measure lxi h,0 ;Initialize the counter to 0 mvi c,index ;Index flag initialized in status ana c ;Get state of the index line now mov b,a ;Save state in B waitm1 in status ;Get state now ana c ;Mask off the index bit cmp b ;Same state ? jz waitm1 ;Wait for toggle waitm2 inx h ;Increment counter in status ;Wait for another toggle ana c ;Strip off index cmp b ;Has it toggled yet ? jnz waitm2 shld settle ;Save the counter in status ;Test status ani halt ;Test for halted lxi d,hltmsg jz exit mvi a,wenabl ;Write enable tt comnd wrout mov a,m inx h out data dcr c jnz wrout mvi a,whedr out comnd wrwait in status ani opdone jz wrwait dcr b jnz wrtloop lxi h,hedbuf2 call phytyp mvi b,secm26 jz rdloop mvi b,secm10 rdloop mvi a,rhedr out comnd rdwait in status ani opdone jz rdwait mvi a,isbuff out comnd mvi c,hdrlen in data in data rdin in data mov m,a inx h dcr c jnz rdin dcr b jnz rdloop in status ani wfault ;Check for write fault lxi d,wfmsg jz exit lxi h,hedbuf1 lxi d,hedbuf2 call phytyp mvi b,secm26*hdrlen jz comp mvi b,secm10*hdrlen comp ldax d cmp m cnz icheder inx h inx d dcr b jnz comp lxi h,hedbuf1 call newpat jnz hedtst call zrolok call makbuf0 call cformat call inchead jnz newhed call update call inctrk rz jmp newhed icheder push h push d lxi d,-hedbuf1 dad d mov a,l ani 0fch rar call incerr pop d pop h ret zrolok lxi h,errors call phytyp mvi b,secm26 jz zrolook mvi all skew jnz wrdlp rddlp mvi c,retries rdagan push b push h call preprw mvi a,rsect out comnd rddwat in status ani opdone jz rddwat in status ani tmout jnz rderr in result ani retry jnz rderr mvi a,idbuff out comnd in data in data lda buffer+2 mov b,a pop h push h in data xra b cmp m cnz secerr inr l in data cmp m cnz secerr inr l cmpdat in data cmp m cnz secerr inr l in data cmp m cnz secerr inr l jnz cmpdat pop h pop b rdok call skew jnz rddlp lxi h,datbuf1 call newpat jnz samhed call zrolok call inchead jnz nxthed call update call inctrk rz jmp nxthed rderr call secerr pop h pop b dcr c jnz rdagan jmp rdok secerr push h lda buffer+2 ora a ral sui 4 call incerr pop h ret skew lda buffer+2 inr a sta buffer+2 push psw call phytyp mvi b,secm26+1 jz skewsec mvi b,secm10+1 skewsec pop psw cmp b rc sub b inr a sta buffer+2 dcr a ret wdata mvi ahe drive out cntrol mvi a,dskclk out cntrol ;Change to Clock from drive mvi a,wenabl out cntrol ;Finish write enable toggle call delay ;Wait 20 ms in status ani wfault ;Check for write fault lxi d,wfmsg jz exit lxi h,mapbeg shld mappnt lxi b,400h noers mvi m,0ffh inx h dcx b mov a,b ora c jnz noers ***************************************************************** * * * Trkzro moves the disk heads to track 0. * * * ***************************************************************** trkzro in status ;Check for already at track 0 ani tkzero rz hloop lxi b,101h ;Command to mhead call mhead ;Move the head cwait in status ani complt ;Wait for seek complete jz cwait in status ani tkzero ;At track 0 yet ? jnz hloop ***************************************************************** * * * Delay uses the counter created by measure to wait for 20ms. * * * ************************************************************b,secm10 zrolook mov e,m inx h mov d,m inx h mov a,e ora d jz goodsec push b push d push h lxi h,1 call hlcde lxi d,softmsg jnc phs lxi d,hardmsg phs call pbuff lxi d,errmsg call pbuff pop h push h dcx h dcx h lxi d,-errors dad d mov a,l rar ani 1fh inr a inr a push psw call phytyp mvi b,secm26+1 jz maxsec mvi b,secm10+1 maxsec pop psw cmp b jnz nowrp mvi a,1 nowrp sta badsec lda buffer+1 call putadc lxi d,hedmsg call pbuff lda head call putadc lxi d,secmsg call pbuff lda badsec call putadc lxi d,rtymsg call pbuff pop h xthl push h call putdc lxi d,acralf call pbuff pop h push h lxi d,2 call hlcde lhld mappnt lxi d,-mapbeg dad d lxi d,seclen*2-3 call hlcde lxi d,fullmsg jnc exit lhld mappnt lda buffer+1 mov m,a inx h lda head mov m,a inx h lda badsec mov m,a inx h mvi m,0ffh shld mappnt mvi a,1 sta errflg wassft pop d pop h pop b goodsec dcr b  ,idbuff out comnd lxi b,seclen wdat mov a,m out data inx h dcr c jnz wdat dcr b jnz wdat wsame mvi a,wsect out comnd wdwait in status ani opdone jz wdwait in status ani tmout stc rnz in result ani retry stc rnz in status ani wfault stc rz cmc ret preprw mvi a,isbuff out comnd lxi h,buffer mvi b,hdrlen whed mov a,m out data inx h dcr b jnz whed ret ***************************************************************** * * * Update writes the bad sector map onto the drive. * * * ***************************************************************** update lhld mappnt mvi m,0ffh inx h lda buffer+1 mov m,a inx h mvi b,1 mov c,a push b lda tsttyp mov m,a inx h lda phase mov m,a inx h mvi m,0ffh lda buffer+2 push psw xra a sta buffer+1 lda disktyp ana a jz upm26 mvi a,1 upm26 sta head mvi a,80h sta buffer+3 call phytyp mvi a,secm26-1 jz updt1 mvi a,secm10-1 updt1 sta byp mvi b,secm26-1 jz cmp1x mvi b,secm10-1 cmp1x lda buffer+2 cmp b jc fmtskp jz fmtskp pop h fmtdat push h call preprw pop h push h call wsame fmtskp call skew pop h jnz fmttrk call inchead jnz mainl call inctrk lda buffer+1 mov b,a lda lasttrk cmp b jnz mainl ret ***************************************************************** * * * Inchead increments the head. * * * ***************************************************************** inchead lxi h,head ;Increment the head number inr m call phytyp mvi a,hedm26 jz cmphed lda heads ;Test if done with this head cmphed sub m rnz mov m,a ret ***************************************************************** * * * Inctrk increments the track, and then steps the heads out one.* * * ***************************************************************** inctrk lxi h,buffer+1 ;Track # call phytyp mvi a,trkm26 jz cmptrk mvi a,trkm10 cmptrk inr m ;Incra,trkm10-3 sekjrka sta reps sta last inr a inr a sta first mvi a,-1 sta dltalst sta dltafst jmp doseek seekmax xra a sta first sta dltafst sta dltalst sta reps call phytyp mvi a,trkm26-1 jz sekmax mvi a,trkm10-1 sekmax sta last jmp doseek seekfly mvi a,-1 sta dltafst inr a sta first inr a sta dltafst call phytyp mvi a,trkm26-1 jz sekfly mvi a,trkm10-1 sekfly sta last sta reps doseek call sek00 dosek call panic lda first mov c,a lda dltafst add c sta first call seekit lda last mov c,a lda dltalst add c sta last call seekit lda reps dcr a sta reps jnz dosek ret seekit mov b,a lda buffer+1 sub b push psw mov a,b sta buffer+1 pop psw mvi b,0 jc movin mvi b,1 cma inr a movin cma inr a mov c,a call seek mvi a,rhedr out comnd sekwait in status ani opdone jz sekwait mvi a,isbuff out comnd in data in data in data in data mov b,a lda buffer+1 cmp b rz push buffer+2 call seek call makbuf0 call preprw lxi h,mapbeg call wdata cc fail call phytyp mvi a,secm26 jz updt2 mvi a,secm10 updt2 sta buffer+2 call makbuf0 call preprw lxi h,mapbeg+seclen call wdata cc fail pop psw sta buffer+2 xra a sta head sta buffer sta buffer+3 pop b mvi b,0 mov a,c sta buffer+1 seek call mhead seekwt in status ani complt jz seekwt jmp delay fail lxi d,failmsg jmp pbuff ***************************************************************** * * * Indx waits until the index hole just passes by. * * * ***************************************************************** indx mvi c,index in status ana c mov b,a indxwt in status ana c cmp b jz indxwt ret logical call getphy call getlog call headata call prep lxi d,logmsg call pbuff call form lxi d,donmsg jmp exit ***************************************************************** * * * Format routine does the actual sectorement the track # cmp m ;All done ? rz call pdot nocr lxi b,1 ;Move out call seek ori 1 ret pdot lda quiet ana a rnz lxi d,astrk ;Print an astrisk call pbuff lda buffer+1 ani 3fh rnz lxi d,acralf jmp pbuff ***************************************************************** * * * Mhead moves the disk head the desired # of steps. Bit 0 of * * register B determines the directios, 1=out, 0=in. Register C * * determins the # of tracks to step. * * * ***************************************************************** mhead mov a,b ;Test direction ani 1 ral ;Move into direction bit ral ral mov b,a mov a,c ana a rz lda dfnreg ;Get current function register ani mdir ;Mask off the direction bit ora b ;Put in the direction bit mhloop ani nstep ;Mask off the step bit out functn ;Output the step bit low ori pstep ;Change the step bit high out functn ;Output the step bit high dcr c ;Update the # of steps to go jnz mh lxi d,sekmsg1 call pbuff lda buffer+1 call putadc lxi d,sekmsg2 call pbuff pop b mov a,b call putadc lxi d,sekmsg3 call pbuff sek00 call trkzro xra a sta buffer+1 ret ***************************************************************** * * * Cformat formats one track on the current head. * * * ***************************************************************** cformat mvi a,1 ;Initialize the sector count sta buffer+2 lda buffer+1 ana a mvi a,80h jz putkey xra a putkey sta buffer+3 call indx call phytyp mvi b,secm26 lxi d,skewm26 jz floop mvi b,secm10 lxi d,skewm10 floop lxi h,buffer+2 incsec ldax d mov m,a inx d dcx h ;Adjust the pointer to the sector header dcx h mvi a,isbuff ;Initialize the controller pointer out comnd ;Give the command mvi c,hdrlen ;Header length ldloop mov a,m ;Transfer the contents of the buffer to out data ; the controller inx h ;Bump pointer to next byte dcr c ;Update the counter header formatting on * * the entire disk. * * * ***************************************************************** fmtonly call getphy call headata call prep call preform lxi d,donmsg jmp exit preform lxi d,formmsg call pbuff lxi h,0 ;Zero the header information shld buffer shld buffer+2 call phytyp mvi a,trkm26 jz setlst mvi a,trkm10 setlst sta lasttrk xra a sta frsttrk form call trkzro xra a sta head lda frsttrk sta buffer+1 mov c,a mvi b,0 call seek lxi d,acralf call pbuff mvi a,idbuff out comnd mvi b,seclen/4 mvi a,0e5h file5 out data out data out data out data dcr b jnz file5 mainl call makbuf0 call cformat in status ani wfault ;Check for write fault lxi d,wfmsg jz exit fmttrk lda nodata ana a push h jz fmtskp pop h call phytyp jz fmm26 lda buffer cpi 1 jnz fmtdat jmp fmmon fmm26 lda buffer ana a jnz fmtdat fmmon lda buffer+1 ana a jnz fmtdat push h call phytloop ret ***************************************************************** * * * Seeks does track seek tests. * * * ***************************************************************** seeks lxi d,seekmsg call pbuff mvi a,10 sta sekcnt sklopa lda sekcnt dcr a sta sekcnt rz call pdot lxi h,seektbl sklopb mov e,m inx h mov d,m inx h mov a,e ora d jz sklopa push h xchg call dopchl pop h jmp sklopb dopchl pchl seektbl dw seekinc dw seekdec dw seekjrk dw seekfly dw seekmax dw 0 seekinc xra a sta first sta last sta dltafst inr a sta dltalst seekcom call phytyp mvi a,trkm26-1 jz sekcom mvi a,trkm10-1 sekcom sta reps jmp doseek seekdec call phytyp mvi a,trkm26-1 jz sekdec mvi a,trkm10-1 sekdec sta first sta last xra a sta dltafst dcr a sta dltalst jmp seekcom seekjrk xra a sta first inr a sta dltalst sta dltafst inr a sta last call phytyp mvi a,trkm26-3 jz sekjrka mvi ! jnz ldloop mvi a,whedr ;Write header command out comnd ;Issue the write header command bwait in status ;Wait for the write to complete ani opdone jz bwait dcr b ;Test for sector count equal to 0 jnz floop ret skewm26 db 22,12,2,23,13,3,24,14,4,25,15,5,26,16,6 db 27,17,7,28,18,8,29,19,9,30,20,10,31,21,11,32,1 skewm10 db 8,15,2,9,16,3,10,17,4,11 db 18,5,12,19,6,13,20,7,14,21,1 zers lxi h,errors call phytyp lxi b,secm26 jz zersx lxi b,secm10 zersx mvi m,0 inx h mvi m,0 inx h dcx b mov a,b ora c jnz zersx ret initfld sta cnt mov a,m push psw call phytyp mvi b,secm26 jz iniflx mvi b,secm10 iniflx pop psw inilp push psw push h lxi h,cnt mov d,m pop h inilop mvi c,hdrlen iniloop mov m,a inx h cma dcr c jnz iniloop inr a dcr d jnz inilop pop psw inr a dcr b jnz inilp ret makbuf0 lxi h,drive ;Get drive # mov a,m rlc rlc ;Move to left four bits rlc rlc mov b,a ;Save drive # in B lda head mp d rnz mov a,l cmp e ret putadc mov l,a mvi h,0 ***************************************************************** * * * Putdc prints the ascii decimal equivalent of the number in HL * * * ***************************************************************** putdc lxi b,-10 phl push d mov d,b mov e,b phllp dad b inx d jc phllp xthl xchg mov a,h ora l cnz phl pop h mvi a,'0' add l sub c pchar push h push b push d push psw mov e,a mvi c,2 call bdos pop psw pop d pop b pop h ret ***************************************************************** * * * Panic checks if a character has been hit on the console. * * If a character has been pressed, then panic acknowledges the * * fact and asks for an abort. * * * ***************************************************************** panic mvi c,11 call bdos ani 1 rz lxi d,panmsg call pbuff mvi c,1 call bdos call rbuff cpi 'Y' jz wboot lx Track $' sekmsg3 db '.',acr,alf,'$' unknown db acr,alf db 'Unknown Command.$' bdrvmsg db acr,alf db 'Bad Drive Number.$' funcmsg db acr,alf db 'Choose The Desired Function:' db acr,alf,atab db 'L = Format a Logical Drive.' db acr,alf,atab db 'F = Format an Entire Physical Drive.' db acr,alf,atab db 'C = Continue An Interupted Test.' db acr,alf,atab db 'D = Run a Diagnostic Test.' db acr,alf db 'Function (RETURN to Exit): $' notyet db acr,alf db 'Not Yet Implemented.$' drvtyp db acr,alf db 'Select The Drive Type:' db acr,alf,atab db 'A = Discus M26, 26 Megabyte Drive.' db acr,alf,atab db 'B = Discus M10, 10 Megabyte Drive.' db acr,alf,atab db 'C = Discus M20, 20 Megabyte Drive.' db acr,alf db 'Drive type (RETURN to Exit): $' dtype db acr, alf db 'Select drive type:' db acr, alf, atab db 'F = Fujitsu 2301' db acr, alf, atab db 'M = Memorex 101' db acr, alf db 'Type (RETURN to Exit): $' muchmsg db acr,alf db 'How Much of the Dia;Add in the head # sta buffer add b ani 7 ;Strip off the drive # rlc rlc rlc ;Head # in to four significant bits rlc cma ;Head # is negative logic ani 0fch ;Strip off the drive bits add m ;Add in this drive sta dfnreg ;Save the function register out functn ;Output the function ret incerr ani 3fh mov l,a mvi h,0 lxi d,errors dad d mov e,m inx h mov d,m inx d mov m,d dcx h mov m,e ret newpat lda tsttyp ana a mov a,m jz long short lda sflg ana a mvi a,0 sta sflg mov a,m jnz shortx mvi a,1 sta sflg mov a,m cma ral cma shortx cma dcr a long inr a mov m,a ana a ret ***************************************************************** * * * Pbuff is the CP/M print buffer command. * * * ***************************************************************** pbuff lda quiet ana a jz pbuffx push d lxi d,nulls call pbuffx pop d pbuffx mvi c,9 ;Print buffer command jmp bdos ;Go and entei d,acralf jmp pbuff ***************************************************************** * * * Messages output by the program. * * * ***************************************************************** prompt db 'Discus M26 and M10 Hard Disk Format Program Rev. ' db revnum/10+'0' db '.' db (revnum mod 10)+'0' db '$' phnum db acr,alf db 'Enter Physical Drive Number to be Tested or Formated ' db '(1 - 4, RETURN to exit): $' lognum db acr,alf db 'Enter Logical Drive Number to be Formated ' db '(1 - 3, RETURN to exit): $' hdmsg db acr,alf db 'Enter Amount of Formatting Desired:' db acr,alf,atab db 'H = Format Headers Only (Data Remains Intact).' db acr,alf,atab db 'D = Erase Data Field Also.' db acr,alf db 'Function: $' rdymsg db acr,alf db 'Drive is not ready.$' hltmsg db acr,alf db 'Controller not halted.$' wfmsg db acr,alf db 'Write fault on drive.$' astrk db '.$' hardmsg equ $ softmsg equ $ acralf db acr,alf,'$' rdywait dgnostic Do You Want to Run: ' db acr,alf,atab db '1 = Sector Header Field Test Only.' db acr,alf,atab db '2 = Sector Data Field Test Only.' db acr,alf,atab db '4 = Seek Mechanism Test Only.' db acr,alf db 'Choose the Diagnostic by Adding together the ' db 'Desired Options.' db acr,alf db 'Options (RETURN to Exit): $' prefmt db acr,alf db 'Has the Drive Been Preformated ? (Y or N, RETURN to Exit): $' nulls db 0,0,0,0,0,0,0,0,0,0,'$' insmsg db acr,alf db 'Press RETURN to return to CP/M: $' ***************************************************************** * * * Dynamic data locations. * * * ***************************************************************** quiet db 0 sdelay db 0 much db 0 sekcnt db 0 first db 0 last db 0 dltafst db 0 dltalst db 0 reps db 0 disktyp db 0 heads db 0 nodata db 0 frsttrk db 0 lasttrk db 0 settle dw 0 ;20ms time constant buffer ds hdrlen head db 0 dfnreg db 0fch errflg db 0 cnt db 0 badsec db 0 mappnt r the BDOS ***************************************************************** * * * Rbuff is the CP/M read buffer command. * * * ***************************************************************** rbuff lxi d,bufmax ;Beginning of buffer mvi c,10 ;Read console command call bdos ;Read and fill the buffer lda buflen ;Check for zero length ana a ;if zero the return with acr in A mvi a,acr rz lda bufdat ;Otherwise return with the character cpi 'a' ;Fold to upper case rc cpi 'z'+1 rnc sui 20h ;Perform the mapping to upper case ret bufmax db 10 ;Maximum length buflen db 0 ;Current length bufdat ds 10 ;Storage or read in data ***************************************************************** * * * Exit prints a message on the CP/M console then does a warm * * boot. * * * ***************************************************************** exit call pbuff lxi d,insmsg call pbuff call rbuff jmp wboot hlcde mov a,h cb acr,alf db 'Waiting for drive to become ready, could take ' db 'as long as 2 minutes.$' headmsg db acr,alf db 'Testing sector headers, will take about 30 minutes.' db acr,alf,'$' formmsg db acr,alf db 'Formatting the entire physical disk, ' db 'will take about 4 minutes.$' logmsg db acr,alf db 'Formatting a logical drive, will take about 1.5 minutes.$' errmsg db 'Sector Error, Track $' secmsg db ', Sector $' hedmsg db ', Head $' rtymsg db ', Error count $' donmsg db acr,alf db 'All Finished, Returning to CP/M.$' panmsg db acr,alf db 'Want to abort ? (Yes or No): $' datmsg db acr,alf db 'Testing sector data field, will take about 12-14 Hours.' db acr,alf,'$' failmsg db acr,alf db 'Error Writing Sector Map to Track Zero.$' fullmsg db acr,alf db 'Bad Sector Map Overflow.$' seekmsg db acr,alf db 'Testing Track Seek Mechanism, will take about 15 minutes.' db acr,alf,'$' sekmsg1 db acr,alf db 'Seek error, Looking For Track $' sekmsg2 db ', Found"dw 0 ;Pointer into map table drive db 0ffh ;If this location is NOT 0ffh then ; NO prompting will occur sflg db 0 tsttyp db 1 phase db 0 hedbuf1 ds secm26*hdrlen hedbuf2 ds secm10*hdrlen ds 100h-($ mod 100h) datbuf1 ds seclen mapbeg ds seclen*2 errors ds secm26*2 ds 30 stack equ $ end en Preformated ? (Y or N, RETURN to Exit): $' nulls db 0,0,0,0,0,0,0,0,0,0,'$' insmsg db acr,alf db 'Press RETURN to return to CP/M: $' ***************************************************************** * * * Dynamic data locations. * * * ***************************************************************** quiet db 0 sdelay db 0 much db 0 sekcnt db 0 first db 0 last db 0 dltafst db 0 dltalst db 0 reps db 0 disktyp db 0 heads db 0 nodata db 0 frsttrk db 0 lasttrk db 0 settle dw 0 ;20ms time constant buffer ds hdrlen head db 0 dfnreg db 0fch errflg db 0 cnt db 0 badsec db 0 mappnt ÑáÁÂR:ÿ§>2ÿ% Âö ÉœÍö Í!"ù"û¯2ý<2ûÍ¡ :ú§>Â?>€2ü>22ÍY Ío !åÍ‹>Ê^>Íu á:û®wÅåÍnáåÍ<ÒˆáÁ ÂiÅå:û·ÖÍÁ áÁ:û®wÍ ÂbÅåÍn>ÓQÛPæÊ ÛPæÂÛQæÂ>ÓQÛSÛS:ûGáåÛS¨¾Ä,ÛS¾Ä,ÛS¾Ä,ÛS¾Ä,ÂÒáÁÍ •!ÍÒ ÂMÍEÍÂ1Í€Í%ÈÃ1ÍáÁ —Ãåå:û·ÖÍÁ áÉ:û<2ûõÍ‹!Ê2ñ¸Ø�<2û=É>ÓQ~ÓS# ÂCÂC>ÓQÛPæÊSÛPæ7ÀÛQæ7ÀÛPæ7È?É>ÓQ!ù~ÓS#ÂwÉ*6ÿ#:úw#OÅ:w#:w#6ÿ:ûõ¯2ú:ò§Ê¬>2ý>€2üÍ‹>ʾ>2ûÍÍ¡ Ín!Í<ÜÍ‹> ÊÝ>2ûÍ¡ Ín!Í<Üñ2û¯2ý2ù2üÁy2úÍXÛPæÊÃ0ØÃö @ÛP¡GÛP¡¸ÊÉÍ¢Í ÍkÍ�è Íö ÍrYÃ1 Í¢ÍkÍ�ÍRYÃ1 ¦ Íö !"ù"ûÍ‹>ÊÊk>ô2ö¯2õͯ2ý:õ2úOÍ% Íö >ÓQ€>åÓSÓSÓSÓS“Í¡ ÍÙ ÛPæ Ê1 :ô§åÊöáÍ‹ÊÉ:ùþÂíÃÐ:ù§Âí:ú§ÂíåÍ‹Êâ:û¸ÚöÊöáåÍnáåÍOÍ á¯ÍŸÍ%:úG:ö¸ÂŸÉ!ý4Í‹>Ê!:ó–ÀwÉ!úÍ‹>ÊÊ2>ô4¾ÈÍAÍöÉ:é§À# Íö :úæ?À% Ãö xæGy§È:þæ÷°æûÓRöÓR ÂhÉÍö > 2ì:ì=2ìÈÍA!¡^#V#{²Ê€åëÍ áÃŽé­Ëæ2  ¯2í2î2ï<2ðÍ‹>ÉÊÅ>ó2ñÃO Í‹>ÉÊÕ>ó2í2î¯2ï=2ðû¯2í<2ð2ï<2îÍ‹>ÇÊÿ>ñ20, 20 Megabyte Drive. Drive type (RETURN to Exit): $ Select drive type: F = Fujitsu 2301 M = Memorex 101 Type (RETURN to Exit): $ How Much of the Diagnostic Do You Want to Run: 1 = Sector Header Field Test Only. 2 = Sector Data Field Test Only. 4 = Seek Mechanism Test Only. Choose the Diagnostic by Adding together the Desired Options. Options (RETURN to Exit): $ Has the Drive Been Preformated ? (Y or N, RETURN to Exit): $$ Press RETURN to return to CP/M: $st Oüÿund Track $. $ Unknown Command.$ Bad Drive Number.$ Choose The Desired Function: L = Format a Logical Drive. F = Format an Entire Physical Drive. C = Continue An Interupted Test. D = Run a Diagnostic Test. Function (RETURN to Exit): $ Not Yet Implemented.$ Select The Drive Type: A = Discus M26, 26 Megabyte Drive. B = Discus M10, 10 Megabyte Drive. C = Discus M2åñ2î<<2í>ÿ2ð2ïÃO ¯2í2ï2ð2ñÍ‹>ÉÊ, >ó2îÃO >ÿ2ï<2í<2ïÍ‹>ÉÊI >ó2î2ñÍÑ Ío :íO:ï�2íÍ| :îO:ð�2îÍ| :ñ=2ñÂR ÉG:ú�õx2úñÚ� /ÓQÛPæÊš >ÓQÛSÛSÛSÛSG:ú¸ÈÅ[Íö :úÍF |Íö ÁxÍF ‹Íö ͯ2úÉ>2û:ú§>€Êè ¯2üÍÍ‹ $ Êþ D !ûw++>ÓQ~ÓS#  >ÓQÛPæÊ Âþ É          !Í‹ Êh 6#6# x±Âh É2~õÍ‹ Ê„ ñõå!Váw#/ ÂŽ <ÂŒ ñ<Â… É!~G:ý2ù€æ/æü†2þÓRÉæ?o&^#Vr+sÉ:§~Êò :§>2~Âð >2~///= È:' þaØþ{ÐÖ É  Íö ÆÍö Í Ã|ºÀ}»Éo&öÿÕPX ÚO ãë|µÄL á>0…‘åÅÕõ_ÍñÑÁáÉ ÍæÈ|Íö ÍÍ þYÊ% Ãö Discus M26 and M10 Hard Disk Format Program Rev. 2.2$ Enter Physical Drive Number to be Tested or Formated (1 - 4, RETURN to exit): $ Enter Logical Drive Number to be Formated (1 - 3, RETURN to exit): $ Enter Amount of Formatting Desired: H = Format Headers Only (Data Remains Intact). D = Erase Data Field Also. Function: $ Drive is not ready.$ Controller nå1^� Íö ¶Íö Í þ ÊþCÊ~þDÊ.þFÊ@þLÊ%à ̈́͢Í�>2:ëæÂ`}Íö Í ÊþYÊcþNÂDÍRÃcÍQ>2:ëæÄ:ëæÄuYÃ1 wÃ1 ˆÍö Í þ Êþ1Ú„þ8Ò„Ö02ëÉÅ Íö Í þ Êþ1Ú¢þ5Ò¢Ö12ŽÍö Í þ ÊþAÚ¿þDÒ¿ÖA2òþ>2óÊì>2óɯ2ê5Íö Í þ ÊþFÈþMÂì>2êÉ Íö Í þ Êþ1Ú õÍ‹4Ê4:óþ3Â44ñ¸Ò Ö1_Í‹!`ÊU:óþ!dÂU!g~2õ#~2öÉ@ËzôbÃô\ Íö ¯2ôÍ þ ÊþHÈþDÂk>2ôÉ:ò§É:öü2þÓR>ÓPï!ÛPæ ÊÇ( Íö ÛPæ ÊÇ+|µÂ° °Ü Ã1 !@ÛP¡GÛP¡¸ÊÐ#ÛP¡¸Â×"÷ÛPæ€ò Ê1 >ÓP>ÓP>ÓPÍ0ÛPæ Ê1 !"6ÿ# x±ÂÛPæÈÍXÛPæÊ"ÛPæÂÍ‹þÈþÂ@:ê·È*÷+|µ#+ÛPÃMÂCÉn Íö Í!"ù"û¯2ý>22ÍY :ýæp/æüG:€2þÓR!>Íu Ío Í!Í‹ Ê£>ÓQ~#ÓS ©>ÓQÛPæʵ£!ˆÍ‹ ÊÍ>ÓQÛPæÊÑ>ÓQÛSÛSÛSw# ÂâÂÍÛPæ Ê1 !ˆÍ‹€ÊT¾Ä5#Â!ÍÒ ÂˆÍEÍ¡ ÍÙ ÍÂgÍ€Í%ÈÃgåÕøì}æüÍÁ ÑáÉ!Í‹ ÊR^#V#{²ÊÅÕå!Í@ % Òm% Íö #Íö áå++æ}æ<<õÍ‹!Ê�ñ¸Â–>2:úÍF BÍö :ýÍF 8Íö :ÍF JÍö áãåÍI % Íö áåÍ@ *êýÍ@ Ò1 *:úw#:ýw#:w#6ÿ">2ÿot halted.$ Write fault on drive.$.$ $ Waiting for drive to become ready, could take as long as 2 minutes.$ Testing sector headers, will take about 30 minutes. $ Formatting the entire physical disk, will take about 4 minutes.$ Formatting a logical drive, will take about 1.5 minutes.$Sector Error, Track $, Sector $, Head $, Error count $ All Finished, Returning to CP/M.$ Want to abort ? (Yes or No): $ Testing sector data field, will take about 12-14 Hours. $ Error Writing Sector Map to Track Zero.$ Bad Sector Map Overflow.$ Testing Track Seek Mechanism, will take about 15 minutes. $ Seek error, Looking For Track $, Found Track $. $ Unknown Command.$ Bad Drive Number.$ Choose The Desired Function: L = Format a Logical Drive. F = Format an Entire Physical Drive. C = Continue An Interupted Test. D = Run a Diagnostic Test. Function (RETURN to Exit): $ Not Yet Implemented.$ Select The Drive Type: A = Discus M26, 26 Megabyte Drive. B = Discus M10, 10 Megabyte Drive. C = Discus M2#cCCCch line in the vitals file consists of fields describing the type of drive and where the bad map information may be located. The first line of the vitals file is reserved for titling information. The fields are: cpmspt - The number of CP/M sectors per CP/M track cpmdsm - The disk size maximum (see DPH and DPB) mapcyl - The cylinder where the bad map lives maphed - The head where the bad map lives mapsec - The sector where the bad map lives maplen - The number of physical sectors the bad map occupies ncyls - The number of physical cylinders on the drive nheds - The number of physical heads on the drive nsecs - The number of physical sectors on the drive secsize- The physical sector size name - A short english description of the drive Following are more detailed descriptions of the sub-functions of the bad program. get Reads the bad map and displays the contents on the console. The format of the output is: track head sector .. Suppliers of Cpm should arrange for more informative error messages. It is impossible to patch a bad spot which lies in the area of a CP/M directory. The only possible way of dealing with this problem is to have the CP/M CBIOS handle the bad sector sparing. If a bad spot is already allocated to a file there an error message to that effect is issued. This means that the bad spot is still a potential hazard. The best way around this problem is to fix drives with no other files. ad, and then restore the disk. Alternatively, if you know the hard disk track, head, and sector number of the new bad spot, you can run putbad to add the new bad spot to the map and then run fixbad. BUGS It is very difficult to discover the track, head, and sector number of a bad spot when Cpm's only error message is "Bdos error on drive e: bad sector"JMP DMA DREAD JMP READ DWRITE JMP WRITE SELDRV JMP DRIVE TPANIC JMP CPAN TSTAT JMP TMSTAT DMAST JMP DMSTAT STATUS JMP DISKST DSKERR JMP LERROR SETDEN JMP DENFIX SETSID JMP SIDEFX DS 66Q BOOT LXI SP,TRACK+1 ;initialize SP CALL TIMOUT ;poc/reset timeout LXI H,1 PUSH H ;track 0, sector 1 MVI L,DCRINT ;set up the PUSH H ; side select MVI H,377Q ; and initial PUSH H ; drive PUSH H ; parameters PUSH H PUSH H LXI H,10Q ;initialize PUSH H ; tzflag & cdisk MVI L,176Q ;initialize PUSH H ; disk & drvsel MVI L,10Q ;initialize PUSH H ; hdflag & dsflag MVI H,30Q ;initialize PUSH H ; timer constant MVI A,177Q ;start 1791 STA DREG MVI A,CLRCMD ;1791 reset STA CMDREG LDHEAD XRA A ;load the head CALL HDCHK ; and test for JNC DOOROK ; drive ready MVI A,LIGHT ;turn on the STA DCREG ; error LED CALL TIMOUT ;timeout to JMP LDHEAD ; close drive door DOOROK MVI A,NOLITE ;turn off the STA DCREG .. for each entry in the bad map. You are asked if you'd like copy of the bad sectors list in a file. If you enter a file name, a file is produces containing this list. If you simply press return, no file is produced. put You are prompted for track, head, sector triplets in the form: track # head # sector # ... until you answer that you have no more sectors to enter. The updated bad map is then written back on to the disk. fix Reads a bad map from the specified drive and creates CP/M directory entries which effectively allocate the bad spot on the disk to the new file. The file is hidden form the user by placing it in user 15 and making it a system file with write protection. No attempt should be made to read or write the file. All such created files are given the name "BADSPOTS". You will be notified if one of your files contains a bad spot. The proper way to proceed in this case is to save as much of the file as possible ent error DCR A JP ISSUE MVI A,20Q PLEAVE STC ;error flag POP H LEAVE PUSH PSW ;save the status LDA DCREG ;control bits XRI LOAD ;toggle the STA DCMD ; head load bit LDA DRVSEL ;enable access to STA DREG ; the data register POP PSW ;recover the status RET PREP CALL HDLOAD ;load the head RC ;test for drive ready LDA TRKREG ;get old track INR A ;test for head CZ HENTRY ; not calibrated RC ;seek error? LXI H,TRKREG ;old track LDA TRACK ;new track CMP M ;test for head motion INX H ;advance to the INX H ; data register MOV M,A ;save new track MOV A,C ;turn off data reg STA DREG ; access control bit JZ TVERFY ;test for seek XRA A ;force a read STA HDFLAG ; header operation LDA DSTAT ;get the double ANI DSIDE ; sided flag STA DSFLAG ;save for status RAR ;shift for RAR ; 3/6 ms step RAR ; rate constant ADI SKCMD ;do a LXI H,0 ; seek CALL CENTRY ; operation JC SNAME bad -- bad spot utility program SYNOPSIS bad DESCRIPTION The hard disk format program "formathd" has an option to test the disk, leaving a map of any bad spots for future reference. (See formathd for the exact location and format of this map.) "bad" is a menu style utility program for dealing with this map and prohibiting CP/M file systems from accessing the bad locations. There are basically three seperate functions performed by "bad": 1) read and display the bad map contents, 2) add sectors to the bad map 3) read the bad map and write CP/M directory entries to allocate the bad spots to a CP/M file. All three bad functions work on CP/M logical drives, as opposed to physical drive units. When a drive is specified in a command the drive type is determined by examining the file "vitals.bad" on the currently logged drive. If the drive type can not be determined then an error is reported. Eaby copying into another file, then erase the original file, then press ^C to ensure the integrity of the in memery CP/M disk allocation bit-map. The hard disk is shipped from the factory with any necessary badspot files already installed. (Shugart and Memorex do not guarantee freedom from bad spots, although they do guarantee a certain maximum, and an error-free track 0.) So ordinarily, the hard disk user will not need these programs. If a new bad spot developes, there are two ways to proceed. The most time consuming is to back up the disk, run the formathd program, run fixbad, and then restore the disk. Alternatively, if you know the hard disk track, head, and sector number of the new bad spot, you can run putbad to add the new bad spot to the map and then run fixbad. BUGS It is very difficult to discover the track, head, and sector number of a bad spot when Cpm's only error message is "Bdos error on drive e: bad sector"$cpmspt cpmdsm mapcyl maphed mapsec maplen ncyls nheds nsecs secsize name (20) 336 1269 0 1 20 2 244 4 21 512 M10 Drive A 336 1280 0 1 20 2 244 4 21 512 M10 Drive B 672 2015 0 1 20 2 244 8 21 512 M20 Drive A or B 672 1028 0 1 20 2 244 8 21 512 M20 Drive C 672 2036 0 1 20 2 244 8 21 512 M20 Drive A or B 1024 1973 0 0 31 2 202 8 32 512 M26 Drive A, B, or C 1024 2015 0 0 31 2 202 8 32 512 M26 Drive A or B 1024 2047 0 0 31 2 202 8 32 512 M26 Drive C FORMT# ASMPŒ�Ž��FORMT# COM ‘åGETBAD COM€’“”•–—˜™åGETBAD COM šion callOverflowOut of memoryUndefined line numberSubscript out of rangeDuplicate DefinitionDivision by zeroIllegal directType mismatchOut of string spaceString too longString formula too complexCan't continueUndefined user functionNo RESUMERESUME without errorUnprintable errorMissing operandLine buffer overflow??FOR Without NEXT??WHILE without WENDWEND without WHILEFIELD overflowInternal errorBad file numberFile not foundBad file modeFile already open?Disk I/O errorFile already exists??Disk fullInput past endBad record numberBad file name?Direct statement in fileToo many filesp„P8£`þÿ@` :ÆÍY! ÍdÚ! ñõ~ÍYñ#=ÂáÃ%iæÊ޾Â%àþ&ÂOåÍáÍ[þH> ÂK> ÍYÕÅÍiÁÃÅ>: y°ÀÃã á+=2i ÁÑÍZÍY#ÍZÍEÒoþ:Ò‹þ0Òoþ.ÊoÃ%~þ Ò þ Ê þ Ê > õ:i <Ê©=Ãm+~þ ʬþ ʬþ ʬ#É>d2¥ Í‹9ÍÓCðÕë"§ ë:g õÍñåͬ!À ÍÀ(áÑÁåÍì"¡ !9ÍT  Õ+V+^##å*¡ ÍÍCáÑÂñÑù"± ÑëÍÇBå*¡ ãå*˜ãÍÓCÎÍdÊá Òá õÍñåòNÍz)ã~þÑÌS ÕåëÍ’(ÃqÍô)Í´(áÅÕ�QZ~þÑ>ÂrÍåÍô)Í´(ÍE(áÅÕOÍdGÅ+ÍÂÉ Íâ$Íåå*Ä "˜*§ ã‚Å3õõàE‚Å3åÍá·Ä\B"¯ ë!9"± ë~þ:Êå·ÂÉ #~#¶Ê… #^#Vë"˜:þ ·ÊäÕ>[ÍÖ@Í1>]ÍÖ@ÑëÍ ÕÈÖ�ÚþLÒâOë! N#FÅë#~þ:Ðþ ÊÒ†·Èþ Ú�þÂ#:l ·ÉþÊ`õ#2l ÖÒfÖõÒ>þþÂR~#"j &o"n >2m !Œñ·É~##"j +fÃCÍŽ*j Ã<2m ÕÅn ëGÍÍ(ëÁÑ"j ñ!Œ·Éþ Òþ0?<=É:l þÒ«þ Ú«*n ¨###^#VëÃ,:m 2g þÊÃ*n " *p " É!n Ãî(ÍEÉ ÅØÖAOGÍþóÂõÍÍEØÖAGÍx‘Ø<ã!Ê  s#=Âá~þ,ÀÍÃÔÍÍV ðÃã ~þ.ë*µ ëÊ+ÍþÊ3þ ë*n ëʯ2l +ÍÐåõ!˜ÍÍCÚdbk))ñÖ0_ëáÃCñáÉÊ7CþÊtþ šRÍ;C ÔÍÇBÍ(Áåå*˜ã>�õ3ÅØÅÍ(:l þ ëÈþÂÉ ëå*j ãÍî#å*˜ÍÍCáÜûÔøÒÌ > 2© áÍ,$`iÉÃã ÀÿÍP ù"± þ�Âã á"˜! ã>á:yHG+ͷȸÈ#þ"he sector MOV C,A ; size and setup MVI B,0 ; the table offset LXI H,STABLE ;sector table DAD B ;sector size pntr LDA SECTOR ;get the sector MOV B,A ; and save in B ADD M ;compare w/table MVI A,20Q ;error flag RC ;error return MOV A,B ;initialize 1791 STA SECREG ; sector register MVI A,40Q ;128 byte sector LXi h,505h SHLD ECOUNT SZLOOP DCR C ;reduce size count MOV B,A ;sector size to B RM ;return on minus RAL ;double the count ORA A ;clear the carry JMP SZLOOP STABLE DB 345Q ;26 sector diskettes DB 345Q ;26 sector diskettes DB 360Q ;15 sector diskettes DB 367Q ;8 sector diskettes HDLOAD LXI H,DISK ;new drv ptr MOV C,M ;save new drv in C INX H ;current drv ptr MOV E,M ;save old drv in E MOV M,C ;update current drv INX H ;home cmd flag MOV A,E ;test for CMP C ; drive change MOV A,M ;head load mask MVI M,HEAD ;update the mask JZ HDCHK ;no drive change? INX H ;addr of drive table PUSH H , in Ok Break!9~#þ´Âb  ÃT þ‚ÀN#F#å`iz³ëÊv ëÍÍCáÈ ÃT † Ãü *˜|¥<Ê— :» ·Âã ÃD=96543>7@?2C:Ãã *£ "˜   *˜"³ ¯2í 2ó |¥<Êù "µ  *± ÃÊò<ÊöÖŒÂõ¸ŠWÃõñÆÃ-Í‹9ÍÓCðë"§ ëÕ:g õÍñãG:g ¸xÊ=ͬ:g  þÚH åþÂ* å#^#V*šÍÍCÒs*Æ ÍÍCÑÒ{!˜ ÍÍCÒ{>ÑÍÆHëÍ£FÍÆHãÍÉ(ÑáÉþ¨ÂµÍÍÓC‰Í(z³Ê¢ÍöPYáÒÌë"¹ ëØ:» ·{È:Š_Ãù Íu ~Gþ�ÊÄÍÓC‰+K xÊíÍ)þ,ÀÃÅ» ·ÊØ <2Š~þƒÊóÍ(Àz³Â˜<Ã÷ÍÀ*· ë*³ "˜ëÀ~·Â #####ÃìÍu À·ÊÃã  ÕÊ=ÍëãÊ>ëÍÓC,ë*­ ëÊ=Í(ÂÉ ë|µÊ"­ 2ª á"« Áâ Í~þ,Ìþ‰ÊdÍÓCÏ+å͆(áÊ~ÍÈþÊ•þ Âí*n ÉÍì·ÈÍþ¢Â€€Ãl>2�áÍ Q+ÍÌ!BÊéþÙÊ÷>þÐÊeþÔÊeåþ,Ê%þ;ÊâÁÍåÍdÊÜÍ)1ÍÇF6 * 4ÍTFÂ* :�·Ê:�G<Ê:Œ·Ê†?Ò=¸Ã:�G<Ê:e ·Ê†?Ò=¸Ô!BÍ&Gáá(*” ÍTF~Â\:�·ÊI:ŽG<:ŒÊ\¸ÃV:‘G:e þÿÊ\¸Ô!BÒâÖÒ\/Ã×õÍÍV ñõþÔÊtz·ò|åÍTF›:�·:�Â�:�o<Ê›&Í ,ëáÍÓC)+ñÖÔåÊÆ(*” ÍTF~ÂÆ:�·ÊÃ:ŒÃÆ:e /ƒÚ×<ÊâÍ!B{=úâ ÍÖ@ÂÛáÍè¯2�ågo"”áÉÍÓC…þ#ʧQÍHLÍoÍ‹9Í;*ÕåÍ0KÑÁÚDÅÕÍÊFá>Ã-?Redo from start #~·ÊÉ þ"Â4ÃÚááÃN:¦ ·Âà Á!!Í#G*¯ ÉÍ Qå!a Ã;þ#ÊYÍHL™Åþ">2“>ÿ2ç ÀÍÈF~þ,Â�¯2ç ÍÓÍÓC;åÍ&GáÉå:ç ·Ê«>?ÍÖ@> ÍÖ@Í0KÁÚDů2¦ 6,ëáåÕÕ+>€2¥ Í͉:~+þ[ÊÖþ(Âý#ÍÊÉ þ"Ê4þ(ÊÙþ[ÊÚþ]Êùþ)ÂÚÂÚÍÃŒ]z)Ü)D¿žEìc†9@•gQæC}ÑîDœE‰ C…sD +À"]DÉ É ý”„ $ î|D}D‚DÄDã<Ó|"ù"ÉÌÏÒõXL{LñL{PìtM=$‡$·YºXTþZýZÙS›R\SZeX×Y{TzTšS¾YHIyIƒI|(€*g(À6Ý78½&+7y8919öJòÑÖH–F¤IâHòH¶"+IŠF�FËz)ô) *m*zQ}Q€QŽU@VXVaQdQgQ;LM‡°Õëý$Xq„š®¯í"9BLdhiUTÏ«NÄ÷BÓTÎSÃLOSÅÃONÔšLEAÒ’INÔSNÇDBÌVÉ+VÓ,VÄ-OÓ HR¤AL̶OMMOθHAIιELETŪATÁ„I͆EFSTÒ­EFINÔ®EFSNǯEFDB̰EƘLSÅ¢NÄ�RASŦDIÔ§RROÒ¨RÌÖRÒ×XÐ OÆ/QÖúOÒ‚IELÄÀILEÓÆÎÓRÅIØOTωO TωOSUÂ�EÔÁEX¤NPUÔ…Æ‹NSTÒÚNÔNÐMÐûNKEY¤ÝILÌÈPRINÔžLISÔŸPOÓEÔˆINűOAÄÄSEÔÉISÔ“OÇ OÃ0EÎEFT¤OÆ1ERGÅÅOÄüKI¤2KS¤3KD¤4ID¤EXÔƒULÌ–AMÅÇE×”OÔÕPEοUÔ�Î•ÒøCT¤PTIOκRINÔ‘UÔÂOKÅ™OÓEEËETURÎŽEAćUΊESTORÅŒEÍ�ESUMÅ©SEÔÊIGHT¤NÄENUͬESEÔÌANDOMIZÅ»TOÐ�WAÐ¥AVÅËPC¨ÔTEÐÑGÎQÒIÎ TR¤TRING¤ØPACE¤YSTEͽHEÎÏROΣROFƤAB¨ÐÏÎAÎ SINÇÙSÒÒAÌARPTÒÜIDTÈ¡AIÔ—HILÅ´ENĵRITÅ·OÒù«ò­óªô¯õÞöÜý§Û¾ï½ð¼ñyy||PF<2(z{ *z);*ô)&,,d-D.s)ˆ%…%'i')1+%+Q+„3)NEXT without FORSyntax errorRETURN without GOSUBOut of DATAIllegal funct¢CÁ{K2Š*¯ "· ë*³ |¥<Ê "¾ ë"À *¹ |µë!» Ê4 ¦Â4 5ëÃÀ¯wY2“ÍB!³{þDÒP þ2ÒR þÚU >(Ö_Íî#ÂU å*³ ã~þ?Âo á!³ÃP Í#GáþÿÍÍCÌ!BÊ»Y|¥<Ä1>ÁÍDA¯2“ÍMSÍB!E Í:ŠÖÌÕ*Ú > ÍÖ@Í(KÑÒÚ ¯2ª Ç ¯2ª Ãï *­ ÚÓ ÕùÿÍÍCÑÒÓ "« :b ·Ê¢ Ãâ>Í(KÚ¢ Í<=Ê¢ õÍ(ͬ~þ ̾(ÕÍÑñ"¯ ÒŠSÕÅÍe]Í·õë"µ ëÍøÚ;ñõÊÌ·ÅõåÍ5$áñÁÅÜ¢"ÑñÕʇÑ:ó ·Â\*v "› * ãÁå åͶBá" ëtÁÑå##s#r## w# y°Â}Ñͯ!€6"¤*”"¼ Í7C*¢"¤*¼ "”â *šëbk~#¶È###~·ÊÐþ Ò·þ Ú·ÍÍù#ës#rïÕÊëÑÍÕÊôÍÓCóúÿÄÂÉ ëÑãå*šDM~#¶+È##~#foÍÍC`i~#fo?È?ÐÃû¯2i 2h ;#~·Â=!@}‘O|˜G!"¯Éþ"Êyþ ÊO:h ·~Ê‚#õÍYñÖ:ÊaþJÂg>2h 2i ÖUÂ%õ~·ã|áÊ*¾ÊOõ~#ÍYÃmþ?>‘ÕÅÊHjÍZÍEÚ—åÌ;ÂÖÍÐ;>‰Ê¸Ó;ÂÖ>�ÁÃH·ÈOÍZ¹À#þGO TOUBáÍZå!ÖA‡O ^#Vá#åÍZOæÊd#¹Â<·òëyþ(Ê!þÓÊ!þÒÊ!ÍZþ.ÊÍâ!>Òdñ·úGÁÑö€õ>ÿÍY¯2i ñÍYÃ%á·ò=Ãê+õZO·Êi¹ÂMÃkŒ«¬ª§©Ö¢Š“Ÿ‰Ï�¯Â>2i ñÁÑþ¢õÌWñþ´Â„ÍY>òþÛÂ5õÍW>�ÍYñõÃ{~þ.ʧþ:Ò"þ0Ú":i ·~ÁÑúOÊÓþ.ÊO>ÍYÕÍ(ͬãë}ÍY|áÍYÃ%ÕÅ~ÍÑ.ͬÁÑå:g þÂÿ* |·>Âÿ}e.þ ÒÇÆÃÌõ%***************************************************************** * * * Disk format program for Disk Jockey 2D controller. * * 11/16/79 * * * ***************************************************************** title '*** Format Program for CP/M Ver. 2.0 ***' org 100h revnum equ 52 ;Revision # times 10 bdos equ 5 ;CP/M entry point wboot equ 0 origin equ 0F800H DISKIO EQU ORIGIN+3f8h DATREG EQU DISKIO+7 DRVSEL EQU DISKIO+1 CSTALL EQU DISKIO+3 CMDREG EQU DISKIO+4 DSIDE EQU 10Q UNLOADB EQU 17Q WTCMD EQU 364Q SICMD EQU 131Q IMMIRQ EQU 320Q UNLOADA EQU 30Q RESTOR EQU 11Q INDEX EQU 20Q TRKZRO EQU 4 intrqa equ 1 intrqb equ 4 lhsdenb equ 90dh lhddenb equ 80ch lhsdena equ 111h lhddena equ 10h acr equ 0dh alf equ 0ah START lxi sp,stack LHLD ORIGIN+7 ;adjust INX H ; the MOV A,M ; calling LXI H,STDVSL+1 ; routines LXI D,4 ; for MOV M,A ; different XRI 3 ; versions DAD D ; of the MOV M,A ; disk DAD D ; jockey a newsize add a jz findix mov l,a mvi h,0 DAD D MOV C,M INX H MOV B,M LXI H,SLIST CALL OVLAY LXI B,DDLIST LXI H,DLIST CALL OVLAY call model lxi b,lhddena jz loadd lxi b,lhddenb loadd mov a,b call stbits mov a,c call stbits FINDIX CALL INDEXP MVI H,1 TKSTEP mvi a,'*' call pchar LXI D,CMDREG MVI A,SICMD STAX D WSICMS LDAX D RAR JNC WSICMS WSICMD LDAX D RAR JC WSICMD CALL TRACK MOV H,D INR H MVI A,77 CMP H JNZ TKSTEP call unload lxi d,fmessg call pbuff call rbuff cpi 'F' jz crok jmp wboot SENDMP PUSH h ;save second half CALL pbuff ;send first half LDA LETTER ;print the CALL pchar ; letter POP d ;send the second pbuff mvi c,9 jmp bdos rbuff lxi d,inbufx mvi c,10 call bdos lda inbufx+1 ana a mvi a,acr rz lda inbuf cpi 'a' rc cpi 'z'+1 rnc sui 40q ret pchar push h push b push d push psw mov e,a mvi c,2 call bdos pop psw pop d pop b pop h ret inbufx  and data mark WTL9 MVI M,0FBH ;data mark LXI B,0e540H ;data & count OVLS2 EQU $-2 WTL10 MOV M,B ;write first DCR C ; quarter of JNZ WTL10 ; sector data MVI C,40H ;count OVLS3 EQU $-1 WTL11 MOV M,B ;write second DCR C ; quarter of JNZ WTL11 ; sector data MVI C,40H ;count OVLS4 EQU $-1 WTL12 MOV M,B ;write third DCR C ; quarter of JNZ WTL12 ; sector data MVI C,40H ;count OVLS5 EQU $-1 WTL13 MOV M,B ;write fourth DCR C ; quarter of JNZ WTL13 ; sector data MVI M,0F7H ;crc data bytes MVI A,27 ;last sector + 1 OVLS6 EQU $-1 LXI B,4E36H ;count & data OVLS7 EQU $-2 WTL14 MOV M,B ;data DCR C ; postamble JNZ WTL14 ; field CMP E ;last sector test JNZ SLOOP WTL15 MOV M,B ;fill data DCR C ; to index hole JNZ WTL15 WTL16 MOV M,B ;fill data DCR C ; to index hole JNZ WTL16 WTL17 MOV M,B ;fill data DCR C ; to index hole JNZ WTL17 RET OVLAY MOV A,M ;length of list PUSH H ;save list ptr LXI H,WTRACK ;overlay area XTHL ; recoMOV M,A ; controller LXI d,SMESSG ;print the CALL pbuff ; sign on message CROK LXI d,DMESSG ;echo the CR and CALL pbuff ; print drive select CALL rbuff ;wait for response CPI 'N' ; new parameter JZ CROK ; request STA LETTER ;save for exit SUI 'A' ;test for good JP NOTLOW ; drive select INPUTB LXI d,BMESSG ;print the bad CALL pbuff ; input message JMP CROK ; and wait for input NOTLOW CPI 4 ;test for drive JP INPUTB ; select too large STA DRVNO ;save drive no. fmtsiz lxi d,denmsg ;Select the sector size call pbuff call rbuff cpi 'N' jz CROK sui '1' ;Strip off ASCII bias jp sizchk sizerr lxi d,bmessg call pbuff jmp fmtsiz sizchk cpi 4 jnc sizerr sta newsize SENDI LXI d,IMESSG ;send out the LXI h,JMESSG ; diskette insert CALL SENDMP ; message GETIN2 CALL rbuff ;wait for response CPI 'N' ;test for new JZ CROK ; parameter request PROCED lxi d,acralf call pbuff LDA DRVNO ;get the drive no MOdb 10,0 inbuf db 0,0,0,0,0,0,0,0,0,0 STDVSL STA DISKIO+1 RET STBITS STA DISKIO+2 RET GTSTAT LDA DISKIO+2 RET model lda diskio-4 cpi (ret) ret unload call model mvi a,unloada jz stbits mvi a,unloadb jmp stbits gtindx call model mvi b,0 rz mvi b,index ret INDEXP call gtindx windxh call gtstat ANI INDEX xra b JZ windxh windxl call gtstat ani index xra b jnz windxl ret indxw call gtindx jmp windxl TABLE DW L128 DW L256 DW L512 DW L1024 TRACK lda select call stdvsl XRA A STA SIDENO CALL WTRACK call gtstat ANI DSIDE RNZ INR A STA SIDENO LDA SELECT ANI 357Q call stdvsl WIL call indxw XCHG WTRACK LXI D,DATREG ;1791 data reg MVI L,1 ;initialize sector reg LXI B,4e50H ;data & count OVLD1 EQU $-2 MVI A,WTCMD ;issue a write STA CMDREG ; track command XCHG ;adjust the registers WTL1 MOV M,B ;index mark DCR C ; preamble JNZ WTL1 ; field LXI B,0CH ;data & count OVLD2 EQU $-2 WTL2 MOV M,B ver pointer MVI D,0 OVLAY1 INX H ;increment pointer MOV E,M ;get offset XTHL ;exchange pointers DAD D ;add the offset PUSH PSW ;save length count LDAX B ;get replacement data MOV M,A ;do the replacement INX B ;next replacement data POP PSW ;recover length count DCR A ;decrement XTHL ;exchange pointers JNZ OVLAY1 POP H ;adjust stack RET * The lists below represents the distances * between successive locations of the WTRACK * routine that are to be overlaid in order * that the same routine will serve to format * different sized and density diskette * sector formats DLIST DB 18 ;length of list DB OVLD1-WTRACK DB 1 DB OVLD2-OVLD1-1 DB OVLD3-OVLD2 DB 1 DB 1 DB OVLD4-OVLD3-2 DB 1 DB OVLD5-OVLD4-1 DB OVLD6-OVLD5 DB 1 DB 1 DB OVLD7-OVLD6-2 DB 1 DB OVLD8-OVLD7-1 DB OVLD9-OVLD8 DB 1 DB 1 SLIST DB 9 ;list length DB OVLS1-WTRACK DB OVLS2-OVLS1 DB 1 DB OVLS3-OVLS2-1 DB OVLS4-OVLS3 DB OVLS5-OVLS4 DB OVLS6-OVLS5 DB OVLS7-OVLS6 V C,A MVI A,177Q ;drive select bits QLOOP RLC ;rotate select bits DCR C ; to proper drive JP QLOOP ; position ani 3fh STA SELECT ;save for TRACK routine call stdvsl call model lxi b,lhsdena jz prep lxi b,lhsdenb prep mov a,b call stbits mov a,c call stbits lxi h,cmdreg mvi m,immirq mvi a,40h wirqd dcr a jnz wirqd mov a,m rar jc notrdy ral ral jc notrdy lxi d,wmessg ral jc notrdyx LXI D,0 call gtindx IXLOOP call gtstat ani index xra b JNZ dorest DCX D MOV A,D ORA E JNZ IXLOOP NOTRDY LXI d,RMESSG ;not ready message notrdyx xchg LXI d,AMESSG ;drive message CALL SENDMP ;send error message call unload JMP SENDI ;back for more input dorest MVI M,RESTOR wrstrs mov a,m rar jnc wrstrs wrstrd MOV A,M rar jc wrstrd MOV A,M ANI TRKZRO JZ NOTRDY LXI B,SDLIST LXI H,DLIST CALL OVLAY LXI B,L128 LXI H,SLIST CALL OVLAY mvi a,'*' call pchar CALL INDEXP MVI H,0 CALL TRACK LXI D,TABLE ld;index mark DCR C ; zero leader JNZ WTL2 ; field OVLD3 MVI M,0F6H ;special double MVI M,0F6H ; density clock MVI M,0F6H ; and data mark WTL3 MVI M,0FCH ;index mark LXI B,4E32H ;data & count OVLD4 EQU $-2 WTL4 MOV M,B ;sector mark DCR C ; preamble JNZ WTL4 ; field SLOOP LXI B,0CH ;data & count OVLD5 EQU $-2 WTL5 MOV M,B ;sector mark DCR C ; zero leader JNZ WTL5 ; field OVLD6 MVI M,0F5H ;special double MVI M,0F5H ; density clock MVI M,0F5H ; and data mark WTL6 MVI M,0FEH ;sector mark MOV M,D ;track number MVI M,0 ;side number SIDENO EQU $-1 MOV M,E ;sector number MVI M,1 ;sector length OVLS1 EQU $-1 MVI M,0F7H ;crc data bytes INR E ;increment sector LXI B,4E16H ;data & count OVLD7 EQU $-2 WTL7 MOV M,B ;sector mark DCR C ; postamble JNZ WTL7 ; field LXI B,0CH ;data & count OVLD8 EQU $-2 WTL8 MOV M,B ;data mark DCR C ; zero leader JNZ WTL8 ; field OVLD9 MVI M,0F5H ;special double MVI M,0F5H ; density clock MVI M,0F5H ;& DB 1 * Overlay data for single density * formatted diskettes SDLIST DW 0FF28H DB 6 JMP WTL3 DW 0FF1AH DB 6 JMP WTL6 DW 0FF0BH DB 6 JMP WTL9 * Overlay data for double density * formatted diskettes DDLIST DW 4E50H DB 0CH MVI M,0F6H DB 36H DW 4E32H DB 0CH MVI M,0F5H DB 36H DW 4E16H DB 0CH MVI M,0F5H DB 36H * Overlay data for single density * 26 sectors/track 128 byte sectors L128 DB 0 DW 0e520H DB 20H DB 20H DB 20H DB 27 DW 0FF1BH * Overlay data for double density * 26 sectors/track 256 byte sectors L256 DB 1 DW 0e540H DB 40H DB 40H DB 40H DB 27 DW 4E36H * Overlay data for double density * 15 sectors/track 512 byte sectors L512 DB 2 DW 0e580H DB 80H DB 80H DB 80H DB 16 DW 4E6AH * Overlay data for double density * 8 sectors/track 1024 byte sectors L1024 DB 3 DW 0e500H DB 0 DB 0 DB 0 DB 9 DW 4E74H AMESSG db acr,alf db 'Drive $' RMESSG db ' Is Not Ready.$' WMESSG db ' Is Write Prto restart.$ Insert a Write Enabled Diskette in Drive $ Close the Drive Door and then Press RETURN: $ Function Complete. Type RETURN to return to CP/M, or F to Format another: $ Select a sector size: 1) 128 Byte Single density. 2) 256 Byte Double density. 3) 512 Byte Double Density. 4) 1024 Byte Double Density. Sector Size: $ $åååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå!þ _Ú!·úA!_þ.Ê!Íâ!Ò!¯Ã/!:æ ·Ê-!<Â-!> È>2æ {þ Ú=!þ Úí!Ãõ <~ÂJ!#~æ#þÛÂX! þ¢Ìk*þ´Âl!~#þò>´Êl!+åÅÕ!:G@ #T]~·Êu!#òy!~¸Âv!ëþÒÊ�!þÓyÑÁ_¢!:æ ·>2æ ÷!þ[®!¯2æ ÃÆ!:æ ·>ÿ2æ ÊÂ!> ÊXG{ÃÉ!~#_æÊXG³òÆ!þ¨ÂÞ!¯2æ áÃù ÍEÐþ0Øþ:?É+ÍÕÅõÍŽñ "Åþ Êo6þ Êr6*n Ã)1ÁÑ:l Oþ Ê"þ HÂ*">&È{È:m þÚ;"!Ê;"#~þ ̾(~#·Êm"È:m þÚA" Â^"þ.Êh"þDÊh"þEÂA"ÃA"{·Êv"È*j Ãù ÍØÅÍ5$ÁÑÅÅÍøÒ”"T]ãåÍÍCÒ!E Í#GÁ!‡ãë* ÍÍC¦"`i" ÉÍÛ"Í\]~ÃÕÍÑ"ÕÍ\]ÍÓC,Íu ÑÉÍåÍÛ"ëáÉz)ÅÍdø: þ�ÀÍE(øÍô)€‘È% ÅPXÊ/#þ,Ê#ÕÍBKÑÊ/#ÍÓC,ÍÊ/#ñÍÓC,ÕÍ(ÂÉ z³ÊëãëÅÍøÑÕÅÍø`iÑÍÍCëÚÑÁñåÕÃ[# Úëå!ùÿÍÍCáÚÕ^#Vz³ëÑÊn#~#¶+ëÂK#ÅÍ‘#ÁÑáÕ^#Vz³ÊŒ#ëãë#s#rë ëáÃu#† Åþö¯2© *š+#~#¶È#^#VÍ·Êš#O:© ·yÊ$þ¨ÂÔ#Íþ‰Â¦#Íþ¦#ÕÍ3z³ÂÝ#Ãý#þ£#ÕÍ3åÍø > Ú%$ÍB!$ÕÍ#GáÍ1ÁáåÅÍ1áÑ+ã#Undefined line þ Âÿ#ÕÍ3åë###N#F>!ü#å*j å+p+q+wáÉ:© ·ÈÃ’#ÍÓCBÍÓCAÍÓCSÍÓCE:Ç ·ÂÒ å*Ä ë*Æ ÍÍCÂÒ á~Ö0ÚÉ þÒÉ 2Æ <2Ç ÍÉ~·È̓$#Ãy$õÃ\AÊ”$ÍåÍz)ð$å!¸$Í#GÍ KÑÚDÕ#~ÍÑ.~·Â•$Íz)"j8ÍÏ7áÉRandom number seed (-32768 to 32767)Ãä$ë*˜"Ä ë+ÍÊ%þ¢Ê%þÏÂð$otected.$' BMESSG db acr,alf db 'Improper Response.$' DMESSG db acr,alf db 'Select Drive (A,B,C,or D): $' SMESSG db 'Disk Jockey 2D Disk Format program' db ' Revision ' db '0'+revnum/10,'.','0'+(revnum mod 10) db acr,alf db 'Type "^C" to return to CP/M, "N" to restart.$' IMESSG db acr,alf db 'Insert a Write Enabled Diskette in Drive $' JMESSG db acr,alf db 'Close the Drive Door and then Press RETURN: $' FMESSG db acr,alf db 'Function Complete.' db acr,alf db 'Type RETURN to return to CP/M, or F to Format another: $' denmsg db acr,alf db 'Select a sector size:' db acr,alf db ' 1) 128 Byte Single density.' db acr,alf db ' 2) 256 Byte Double density.' db acr,alf db ' 3) 512 Byte Double Density.' db acr,alf db ' 4) 1024 Byte Double Density.' db acr,alf db 'Sector Size: $' acralf db acr,alf,'$' letter db 0 drvno db 0 select db 0 newsize db 0 ds 50 stack equ $ end Êþ,ÂÉ ã~þ,ÂB>2 Íd: =ÂBåÍd̨Há+Íã~þ,Ê¿á+Í·áÂN6,ÃEå*È ö¯2¦ ãÃQÍÓC,Í‹9ãÕ~þ,Êc:¦ ·ÂÓö¯2¼ ÍTF—QÍdõ¢ÍWGþ"ÊŒ:¦ ·Wʉ:,+ÍËFñÆO:¼ ·Èyë!±ãÕÃ.Íñõ�ÅÚÑ.ÃÊ.+Íʽþ,ÂGã+ÍÂMÑ:¦ ·ëÂüCÕáÃéÍì·Âì#~#¶Êã #^#Vë"£ ëÍþ„ÂÓÃcÍÓCðÃÍÓC(+ÕÍÇBÍ“¯2 "¼ *¼ Á~"� þïØþòÚŽÖò_Â4:g þ{Ê[Hþ Ð!xVºÐÅÅzþʬþQÚºæþþzʺ! :g ÖÊá ·N#FÅú#N#FÅâ! N#F#ÅN#FÅÆKGÅãÅ*� ÃÖïÚÆþÒÆþªºWÚÉ "� ÍÃ�Íô)Í™(Ì6ÇÕÍz)ÑåuÇxþdÐÅÕd!BåÍdÂX* å\FÇÁy2h :g ¸ÂüþÊþÊgÒ+WxþÊ(zþÊOxþÊdzþÊá Òo!© N#FÑ* ÅÉÍ *Íô(á" á" ÁÑÍ©(Í *!•:h …oŒ•g~#foéxõÍô(ñ2g þÊ6á" Ã;Íô)ÁÑ!ŸÃAáÍ™(Í*Í´(á" á" ÃiåëÍ*áÍ™(Í*Ãg'ÍÊÞ ÚÑ.ÍEÒJþ Ú]<ÊÓ=þòÊ“þóÊ<þ"ÊÈFþÕÊOþ&Êiþ×ÂÖÍ:ŠåÍÕáÉþÖÂçÍå*³ Í,áÉþÜÂÍÍÓC(þ#ÂÍr åÍPQáÃ͉:ÍÓC)åë|µÊÍÜ)áÉþÒÊÛþÚÊËIþÝÊoBþØÊIþ…Ê'UþÓÊTÍþÍÓC)É}Í*¼ åÍk(áÉÍ‹9åë" ÍdÄî(áÉ~þaØþ{Ðæ_Éþ&Â(ÍÍ[þOÊ­þH¬#~Í[ÍEëÒ—þ:ÒÎÖ0ÚÎÞþGÒÎÖ7))))µoëÂ~ÃÛ +ÍëÒÎþ8ÒÉ Û Å)Ø)Ø)ØÁÖ0O ëíÍÜ)ëÉ#~Ö�þÂèåÍþ(áÂÌ7>OÅÍyþÒÍþÍÓC,Í;*·Â%#~#¶YÊã #^#Vë"Ä ëÍyþ~Ê.%þ´Êî$þµÂï$Âï$Éþ‚Êî$þƒÂï$ÈÍÊ%ë*˜å*Ä "˜ëÅÍ‹9Á+Í%Êc%ÍÓC,+8%ã"˜áÕÉõ: 2 ñõ¯2 ñÉ! 6Í·(È%Í·(Ít(x·È: ·Ê©(�Ò¢%/<ëÍ™(ëÍ©(ÁÑþÐõÍÖ(gñÍb&|·! òÉ%ÍB&Ò#ʈ0.͉&Ã#&¯�G~›_#~šW#~™OÜN&hc¯Gy·Â&JTeoxÖþàÂÝ%¯2 É|µ²Â&yÒû%OÃ&)zWy�Oòô%x\E·Ê#&! †wÒï%Êï%x! ·ü5&F#~怩Oé(ÀÀ À€4ÀÇ0~ƒ_#~ŠW#~‰OÉ! ~/w¯o�G}›_}šW}™OÉÖÚq&CZQÃd&Æ oz³°Â…&y-ÈOÒ{&Ë&¯-ÈyOzW{_xGÃ…&�š÷ƒ$cCƒuÍ�„©ƒ‚�â°Mƒ rƒô5ÍE(·êÍÐ&1€rÃ'Í´(>€2 ¨õÍ™(!›&ͧ7ÁáÍ™(ëÍ©(!¬&ͧ7ÁÑÍi'ñÍ™(ÍT(ÁÑÈ%ÍE(È.Í(y2<'ë"7'PX!Ú%å!%'åå! ~#·ÊY'åëWyÒ='ÕÑÎO|g}oxGæÊQ'xö GzÂ/'ëáÉCZQOÉÍ™(!®-ͦ(ÁÑÍE(Ê�0.ÿÍ(4Êg04Êg0+~2 '+~2œ'+~2˜'Aë¯OW_2£'åÅ}Öo|ÞgxÞG>Þ?Ò±'2£'ññ7ÒÁáy<=òÏ':£'æÀõx´µÊÊ'> á´Ã$&{_zWyO)xG:£'2£'y²³Â”'å! 5á”'Ãï%>ÿ.¯! N#®G.x·Ê'(}! ®€G¨xò&(Æ€wÊW'ÍÖ(w+ÉÍE(/á·áòï%Ãg0Í´(x·ÈÆÚ€0G͈%! 4ÀÀ0: ·È: þ/ŸÀ<Ɉ! Op#6€Ã×%͆(ðÍdúø+Êá ! ~î€wÉ͆(oŸgÃÜ)ÍdÊá òE(* |µÈ|ÃO(ë* ãå* ãåëÉÍ·(ë" `i" ëÉ! ^#V#N#F#É ÃÍ(ë:g Gw#ÂÍ(É! ~7w?##wy7O®É! È(Ãú(! É(Õ Íd1ž*ø#~!Êwîww®ÍŽ�ÍŽÍ“þNÊ2hÖAò:{ÍŽÃþò12iµÍŽÍ“þNÊÖ1ò^{ÍŽÃBþÒU2k !8̓Í“þNÊeÍŽ:iO> òƒæ?2jÍÉÍÕÊœ xÍÍyÍÍ!üû6Ð>@=«~ÚÕÚÕfÚØÍèÍÑæ¨Âåz³ÂÆWëN̓ÍÛÃf6 ~Òç~Úì~æÊÕ!éÍÑ*!üÍÑ>*Í®Íñ&Í :k‡ÊJo&N#F!üÍÑ!éÍÑÍÕÊB xÍÍyÍÍÍñ&>*Í®üû>YÒZÚ_Íb$>M¼ÂOÍÛgÍŽÍ“þFÊÃåÍŽ:hÍ®Ñ Ã½ Í:¾§> È:¿þaØþ{ÐÖ ÉåÅÕõ_ÍñÑÁáÉ 2ùûÉ2úûÉ:úûÉ:ôûþÉÉÍÕ>ÊÍ>ÃÍÍÕÈÉÍèÍÑæ¨ÊôÍÑæ¨ÂýÉÍèÃý*3<E:jÍɯ2uÍ8ÍÑæÀ<2u:jæïÍÉÍëÿû.PN>ô2üûëp ÂF p ÂN6ö6ö6ö6ü2Np Â^ p Âf6õ6õ6õ6þr6s66÷Np  p ‡6õ6õ6õ6û@åp —@p ž@p Â¥@p ¬6÷>6Np ¸»Âcp ÂÁp ÂÆp ÂËÉ~å!8ã#^ãõ wñ=ãÂÙáÉ  @ (ÿÃYÿÃq ÿÃ’PN 6ö62N 6õ6N 6õ6 å ÿ@å@@@6N€å€€€jNå tN Drive $ Is Not Ready.$ Is Write Protected.$ Improper Response.$ Select Drive (A,B,C,or D): $Disk Jockey 2D Disk Format program Revision 5.2 Type "^C" to return to CP/M, "N" ë* ãåëÍu ëãÃ)Í4ã}þ Ú þåÜô)áHÕ>2 Ÿ N#fiéþóÈþ-Èþ+ÈþòÈ+É<�Á ÆÿŸÍ(ÃaZÍÍz)}/o|/g" ÁÃ:g þÒqÖ·7ÉÖ·ÉxõÍz)ñÑþzÊ ,þ{ʨ+×ÅþF•{µo|²ÉþP {¥o|¢Éþ<«{­o|ªÉþ2¸{­/o|ª/É}/£/o|/¢/É}“o|šgÃ,:ŒÃÔ:e €2¥ Í‹9ëã:g õÕÍ"¼ á"� ñͬÍÇB!øÿ9ùÍ÷(:g õ*¼ ~þ)ÊËÍÓC,å*� ÍÓC,Ã�ñ2N ñ·Ê2g !9Íî(!9ùÑ.,·úâ:g …G:N O€þdÒõ}!P OÍÀÇÅÅÃ:*¼ Íå*� ÍÓC)>Õ"� :æ ÆõOÍÇBñO/€2¥ ¶OÃ�9þ~ÂÉ #~#þƒÊ`JÃÉ Íx 2ùÛÃÕÍb ÓÉÍb õ+ÍÊ ÍÓC,Íu ñWÛ«¢Ê ÉÃÉ þžÂ: ÍÍu 2�_ÍH 2ŽÉÍu 2�_ÍH 2‘ÉÖÒH Æ/<ƒÉÍÍåÍz)ëáz·ÉÍu 2 2 ÍÓC,Ãu ÍÍÍY Â+Í{É>2�ÁÍØÅÍe]!ÿÿ"˜áÑN#F#x±Ê‡ ÍTFÌQBÅN#F#ÅãëÍÍCÁÚ† ãåÅë"µ Í1á~þ ÊÍ > ÍÖ@Íæ !b ÍÜ Í!BÑ ~·ÈÍ¥B#ÃÜ b ÿ¯2æ Íe]Ãù #È~·Èþ Ú'Ø Éx·ÊE(!N(åÍE(yÈ! ®yøÍ )©É#x¾À+y¾À+z¾À+{–ÀááÉz¬|úO(ºÂ@)}“ÈÃP(! ÍÉ( ·ÊE(!N(åÍE(OÈ! ®yø#–Â)+Âf)ÁÉÍI)ÂN(ÉÍd* øÊá â™)Íô(! 6Íî(Í&,Íþ)Ü)Íy%: ·õæ2 : þ�ÒÛ ÍB*: ·Â½)ñëÃÂ)ñëòÈ)|/g}/oÃÜ)!Û å: þ�Òå)ÍB*ëÑ" >2g É€�Í)ÀajÃÛ)Ídàú*Êá Í´(Í6*x·ÈÍÖ(! FÃ#&* Í6*|U�ÃY(ÍdÐÊá ü*!" " >>Ãá)ÍdÈÃá GOW_·ÈåÍ´(ÍÖ(®güf*>˜�Íb&|Ü5&ÜN&áÉz£<À ÉÍdøÍE(ò€*Ít(Í€*Ãk(ÍdøÒ¦*Êá ÍÏ)! ~þ˜: Ð~ÍB*6˜{õyÍ×%ñÉ! ~þ�ÂÊ*O+~î€+¶¶*·!€ÂÉ*ÍÜ)à *y·Èþ¸ÐõÍ´(ÍÖ(®+6¸õ+qüú*: O! >¸�Í%-ñüÝ,¯2ÿ ñÐÑ,! ~5·#Êý*Éå!x±Ê"+>)ÚÖ;ë)ëÒ+ ÚÖ;=Â+ëáÉ|ŸGÍî+y˜Ã4+|ŸGåzŸˆ¬òÛ)ÅëÍ*ñáÍ™(ëÍ,ÃN0|µÊÜ)åÕÍâ+ÅDM!>)Ú‰+ë)ëÒq+ Ú‰+=Âc+ÁÑ|·ú�+ÑxÃê+ʚ+ëÁáÍ*áÍ™(Í*ÁÑÃ'x·ÁúÜ)ÕÍ*ÑÃt(|µÊÌ Íâ+ÅëÍî+DM!>õ·ÃË+õå ÒÊ+ñ7>á{_zW}o|gñ=ÂÁ+ëÁÕÃw+|ªGÍé+ë|·òÜ)¯O•oyœgÃÜ)* Íî+|ÀëÍ6*¯˜ÃY(Õͨ+¯‚g{oÍß)ñÃê+! ~î€w! ~·ÈG+N ·Êë(�ÒR,/<õ#åFwx+ ÂB,áF+Nñþ9ÐõÍÖ(! G>w2ÿ ñ! Í%-x·ò†,: 2ÿ Íú,ÒË,ë4ʈ0ÍQ-ÃË,>žÍü,! Ü-¯G: ·Âº,!ÿ Vwz# Ÿ,xÖþÀÂ’,Ãï%!ÿ ÍY-·ò²,x·ÊË,! †wÒï%È:ÿ ·üÝ,! ~æ€++®wÉ! 4À#Ââ,4ʈ0+6€É0 ! Ã->Ž! ¼ 6.#60Â5#HÉÂ56."¼ #HÉ À6,#ÉÕÍdâq5ÅåÍô(! 6Íî(Í&,¯ÍÏ*áÁ6> Í5ÅõåÕ/áå>žÍÿ,ÒK5á>ŽÍÿ,ëáp#ñÁ=ÂB5Åå! ͦ(Ã~5ÅåÍy%>ÍB*Í©(áÁ¯_6?Í5ÅõåÕÍ´(á/{–_#zžW#yžO++Ò’5ÍB&#Í©(ëáp#ñÁÚ„5>ÃÀ5Õe6>Í5ÅõåëN#FÅ#ãë* /}“o|šgÒÓ5" Ñáp#ñÁ=ÂÀ5Í5wÑÉù¢áÿŸ1©_c²þÿ¿É¶€¿É¶€Æ¤~�@zóZ rN ¥ÔèèvHä TÊš;áõ€–˜@B †''èd ¯GÂÅÍÛ"Á կʎ6)�)�)�)�·ÂŸ6y=ÊŸ6·Ê«6¯Æ0þ:Ú¨6Ư ʸ6ÊŠ6È6áÉ!t(ãéÍ™(! 6ͦ(ÃÏ6Íô)ÁÑ!r%å>2 ÍE(xÊ+7òè6·Ê—0·Êð%ÕÅyöÍ´(ò7õ: þ™Ú7ñÃ7ñÕÅÍ�*ÁÑõÍ)á|á" á" Ü»6Ìt(ÕÅͽ&ÁÑÍ'8�;ªÍ': þˆÒ`7þhÚr7Í™(Í�*Æ�ÁÑÊc7õÍ…%!{7ͧ7ÁJÃ'Í™(: ·òo7ññÃï%Ã~0�é(|ˆYtà—&wÄz^Pc|þu~r1€�Í™(•+ÕåÍ´(Í'áÍ™(~#ͦ(ñÁÑ=ÈÕÅõåÍ'áÍ·(å͈%áð7RÇO€Íå!—&ͦ(ÍÝ7áÃ6*ÍE(!H8ú>8!i8ͦ(!H8Ȇæw#‡‡O Í·(Í':G8<æþˆ2G8!i8‡‡O Í|%Í´({YîOO6€+F6€!F84~Ö«Â58w ÍÚ%!i8ÃÀ(w+w+wÃ85JÊ™9v˜"•³˜ ÝG˜SÑ™™ Ÿ˜e¼Í˜Öw>˜RÇO€h±Fh™é’iÑuh!ÿ8Í|%: þwØ: ·ò•8æ2 t(Õ"~ƒùÍ'Í™(Í�*ÁÑÍ…%Í)úÙ8€͈%€€͈%ÍE(ôt(͈%Ít(: ·õòæ8î€2 !9͘7ñð: î€2 Ƀù"~ÛA> ÍÖ@:ŒæÂAñÉñõÖ Ê3AÚ6A:�<:ŒÊ-Aå!�¾áÌMAþÿÊ6A<2ŒñõÅÕåOÍáÑÁñɯ2�:Œ·È> Í7A> Í7A¯2ŒÉ:“·ÂXGñÅõþÂ{A:e ·Ê�A=2e >îAþ Â�A> ÍÖ@:e æ€AñÁÉþ Ú®A:�G:e Ê¥A¸Ì!BþÿÊ®A<2e ñÁõñõÅÕåOÍáÑÁñÉÍTFÊõAÍÂWÐÅÕåÍMSáÑÁ:ó ·Â0P:ž·ÊçA! åÃ7CåÅÕ!E Í#GÑÁ¯áÉÅÕåÍáÑÁæþÀ:“·ÌAD/2“·ÊAD¯É:e ·ÈÃ!B6!a > ÍÖ@> ÍÖ@ÍTFÊ3B¯É:�·Ê?B¯2Œɯ2e :ˆ=Èõ¯ÍÖ@ñÃFBÅÕåÍáÑÁ·ÈÍõAþÌõA2‰þÌCDÃDÍåÍ™BƒBÍ·ÊŒBÍõAõÍ·Fñ_ÍøH!D " >2g áÉ:‰·Èõ¯2‰ñÉÍÖ@þ À> ÍÖ@Í+B> ÉÍëBÅãÁÍÍC~È +üBå*v  >Æ•o>ÿœgÚÝB9áØ*–++"± Ãã ÍÿBÐÅÕåÍgGáÑÁÍÿBÐÃåBÕë*› ÍÍCëÑÉ:ÄG!¤¯^#V#ÂCÍ T¯À*šÍ}D2ì 2ª 2© w#w#" *š+"§ :í ·ÂXC¯2Ç 2Æ !Ê 6#ÂQCÈ7!i8ÍÃ(!F8¯w#w#w¯2» og"¹ "À *v :ó ·ÂƒC"› ¯ÍæC* "Ä "Æ :í ·Ì TÁ*–++"± ##ù!z "x Ír%ÍDAÍé¯go"æ 2· "N "º "ä 2¥ åÅ*§ É|’À}“É~ã¾ÂãC#ã#~þ:Ðà ÃÉ ë*šÊûCëÍ(åÍø`iÑÒÌ+"È ëÉÀ<à DÀõÌ Tñ"¯ !z "x !öÿÁ*˜åõ}¤<Ê-D"¾ *¯ "À ¯2“ÍDAÍBñ!J Âb Æ >õÖÂOD2�2“>^ÍÖ@ñÆ@ÍÖ@Ã!B*À |µÊã ë*¾ ëë"˜ëÉÍu À<2ˆÉ>¯2þ ÉÍ‹9Õå!ö ÍÉ(*Ä ãÍdõÍÓC,Í‹9ñGÍd¸Âá ãëå*Ä ÍÍCÂÁDÑáãÕÍÉ(áö ÍÉ(áÉÃ>2¥ Í‹9ÂÁDå2¥ `i ·úØD ë*Æ ÍÍCÂåD `i"Æ á~þ,ÀÍÃÄD 2 -¯Ž# Â-É~/w!ÿ ¯Oyžw#Â-ÉqåÖÚ<-áåNsY+Â1-Ã'-Æ W¯áÈå~w+ÂF-Ã?-! ÃC-~w# Â[-ÉÍE(È: ·Êï%Íù'Í�.q·ÕÊ™-ÅGÜú,ÍQ-xÁ ‚-ÑÂy-Ñ,! Í--Ñ-ÍÌÌÌÌÌL} „: þAÒÆ-¢-! ÍÉ(Ãd-: ·òÖ-æ2 !t(åÍ. ! ÍÉ(Í.Í&, ! ÍÉ(>õÍ.Í".Í&,! Í3.ñ=Âó-Í.Í.! 5ÀÃï%! >5È=Â.ÉÑ>! N#F#Å=Â(.ÕÉÑ>! Áp+q+=Â9.ÕÉ: ·Ê”0: ·Êï%Íö'44ʈ0Í�.!7 qA>žÍñ,™?Út.>ŽÍñ,¯Ú: <=úÎ,! Í[-!0 ÍY-x·Âb.! 5Âb.Ãï%y2 +6 ~q+¨.ÉÍô(ë+~·ÈÆÚˆ0wåÍ&,á4ÀÈ0Íï%Í3*ö¯j%Åõ>2 ñëÿ`hÌÜ)ë~þ&Êiþ-õÊù.þ+Êù.+ÍÚà/þ.ʆ/þeÊ /þEÂ5/åÍþlÊ#/þLÊ#/þqÊ#/þQáÊ4/:g þÊN/>ÃN/~þ%Ê“/þ#ʤ/þ!Ê¥/þdÊN/þDÂe/·Í®/ÍÍ2ÍÚS0Âe/¯“_å{�_ô½/üÍ/Âi/áñåÌk(áÍdèå!W'åÍå)ÉÍd Âe/Ü®/Ãù.Íñå!W'å!z)åõÃe/·Í®/ÍÃe/åÕÅõÌô)ñÄ *ÁÑáÉÈõÍdõä.(ñì².ñ=ÉÕåõÍdõä^'ñì²-ñáÑ<ÉÕx‰GÅå~Ö0õÍdò0* Í ÍÍCÒ0T])))ñO |·ú0" áÁÑÃù.yõÍ*7Ò50t”$Í)ò20Í.(ñÍH0à 0Í**Ͳ.Íô(ñÍT(Í**Í&,à 0Í™(ÍT(ÁÑÈ%{þ Òb0ƒ†Ö0_úÃX/å! Ídâw0: Ãx0y®áÞ0ññ: Þ0ñ: /Þ0y×0: !b"œåÅÕõõ*¹ |µÂË0! ~·Ê¸0=ÂË04*œÍy$2e > ̓$> ̓$ñ!  1ÒØ01ÍÃ(ÍdÚê0! 1ÍÃ(*¹ |µ*œ ë"œÊ1ÍÍCÊI�û׆e&™‡X4#‡á]¥†ÛIƒÍ™(Í8ÁáÍ™(ëÍ©(Íy8Ãg'ÍE(ü»6üt(: þ�ÚN9�QYÍi'!‚%å!X9͘7!ÿ8É J×;xn„{þÁ/|t1š}„=Z}È‘~ä»L~lªª�+ÍÈÍÓC,}9Åö¯2f NÍEÚÉ ¯G2Å#~þ.Úã9ʵ9þ:Ò¯9þ0Òµ9ÍEÚã9GÅÿÅö€#~þ:ÒÍ9þ0Ò¼9ÍEÒ¼9þ.ʼ9xþ'ÒÉ Á2Å~þ&Òÿ9 :Õþ%Èþ$Èþ!Èþ#Èñyæ_å!‰ Vá+z2g Í:¥ =Ê’;ò):~Ö(Ê;Ö3Ê;¯2¥ å:· ·2´ Ê}:*æ è "µ ëÃc:o¹Â[::g ½Â[:¸Êå:&…ë*Æ ëÍÍCÊð;^#~#¹Â¸;:g »Â¸;~¸ÊÜ;#^^#V#˜;:f ·ÂÒ ñDMÊW'–Ê]< Ãã #:ž¹;#·Ê¾;+͸<þ;:g w#_ñÊ–ÍÕ*x " >2g ÍÉ(› ÍÍC"x á~ÀÃã #ÍÇFͨH͹(È ÍÖ@þ Ì+BÃ-G·ñõ*Æ ë*› /Oÿ #ÍÍCÚZG"› #ëñÉñÊã ¿õ>GÅ*v "› !å*Æ å!z ë*x ëÍÍCxGÂH!L "¸ *Ä "µ * ë*µ ëÍÍCʹG~###õÍš<ñþ²GÍH¯_ÕG*¸ ^#Vz³*Ä ÊÛGë"¸ ##^#V#ë"µ ëÕGÁë*Æ ëÍÍCÊ7H~#õ##ÍšD¸GáÂÖ1ñÁÑë" `i" ëÁÑÉÅ#~þ+ÊN2þ-Ê%2Ö0Ox‡‡€‡�GþÒN2#~·Â 2`ÁxþEÂC2y„þ áÒ÷1>€2 ÃS2|�þáÒ÷1Ã;2ÁáÃ÷1ñÁÑë" `i" ëÁÑÍ©(#þåÞWÍ\4õ: ·ò�2ñ‚Ë2ñ‚ú�2ºÒ�2ÖáõÍû460̾(Í"5+~þ0Êž2þ.ľ(ñÊÐ2õÍd>"�w#ñ6+òÁ26-/</Ö ÒÃ2Æ:#p#w#6ë! É#ÅþzÒQ3Úî3Íó4ÑzÖôÏ4ͺ5{·Ì(=ôÏ4åÍb1áÊ3p#6! #:¼ •’È~þ Ê 3þ*Ê 3+åõ3ÅÍþ-Èþ+Èþ$ÈÁþ0ÂI3#ÍÒI3++wñÊ?3Áà 3ñÊI3á6%ÉåÚõ3Êm36ÍC)ú{3áÁÍ)1+6%ɶÊÍ)òd3ÍE(Ä\4áÁú 3Å_x’“ôÏ4Íæ4Í"5³Äß4³Ä5ÑÃó2_y·ÄË/ƒú«3¯ÅõüÍ/ú­3Á{�Á_‚xúÉ3’“ôÏ4ÅÍæ4ÃÚ3ÍÏ4yÍ5O¯’“ÍÏ4ÅGOÍ"5Á±Âå3*¼ ƒ=ôÏ4PÃü2åÕÍ*ѯÊû3ÍE(7Ä\4áÁõy·õÄË/€OzæþŸW�O“õÅüÍ/ú4ÁñÅõú)4¯/<€<‚GÍ"5ñôØ4Í5ÁñÂL4Í(~þ.ľ("¼ ñÚS4ƒ�’ÅÍ®2ëÑÃü2Õ¯õÍdâ€4: þ‘Ò€4ñ5! ÍÉ(Íd-ñÖ õÃe4Ͳ4Ídê•4C‘ùOÍ)Û4ù5ÍC)ò®4ñ;/õÃ4ñÍÍ/õͲ4ñ·ÑÉÍdêÄ4t”ø#Í)ÃÊ46ÍC)áò¦4é·È=60#ÃÐ4Âß4ÈÍ560#=ÃÛ4{‚!ÌÖ@Ä1> ÍÖ@!b åÿ ~#·Â=áGÍõA·Ê"=Í[Ö0ÚA=þ ÒA=_z‚ƒWÃ"=å! =ãÂL=þØÊº>þOÊÉ>þÝÊ×>þðʨ=þ1Úg=Ö þ!Êì>þÊâ=þ#Ê»=þÊ>>þÊì=þÊ >þÊÚ>þ(Ê9>þʵ=þÊ6>þ>ÂÖ@ÁÑÍ!BÃè<~·ÈÍ¥B#¨=Éå!>ã7õÍõA_ñõÜ>~·Êà=Í¥BñõÜ�>Ú×=#~»ÂÅ=ÂÅ=ñÉÍÜ Í!BÁÃÿ<~·È>\Í¥B~·Ê>Í¥BÍ�>Âô=>\ÍÖ@É~·ÈÍõAþ Ò+>þ Ê+>þÊ+>þ Ê+>>ÍÖ@à >wÍ¥B# >É6Hÿͨ=ÍõAþÊq>þÊs>þ Ê×>þÈþÊs>þ Ê‘>þÊ‘>þ Ê‘>þ Ú>>þ_‘>>_Ê™>Í¥B+>>Õå ~·7ÊW'#~+w#Ã>õyþÿÚ¡>ñ>ÍÖ@Ã>>� Åëo&DM#͹BÁñwÍ¥B#Þ>x·È+>Í¥BÂÉ>Éx·È+~Í¥BÂÉ>ÉÍÜ Í!BÁÑz£\ÍÌ@ÍÖ@¯_WÍÌ@W~#þ!ÊŽ@þ#Ê¡?þ&ʉ@Êg@þ+>ÊH?+~#þ.ÊÀ?þ_Ê}@þ\Ê&?¾Â??þ$Êš?þ*Â??x#þÚ’?~þ$> ž?þ¯Æ#‚WÊö?~#þ.ÊË?þ#Ê¡?þ,Â×?zö@Wá?~þ#>.Â??# Êö?~#þ#ÊË?Õô?ÕT]þ^À¾À#¾À#¾À#xÖØÑÑG#ÊëÑz+æÂ@x·Ê@~Ö-Ê@þþÂ@>Æ‚WáñÊr@ÅÕÍÑÁÅåCx�þÒzö€Í*1Í#Gá+Í7ÊN@2¦ þ;ÊK@þ,ÂÉ ÍÁëáåõÕ~�#_~#fox·ÂE?Ãm@ÍÌ@ÍÖ@áñÂ?Ü!BãÍ«HáÃéÍÌ@~#ÍÖ@Ã_@Ã’@>ñÍÌ@áñÊr@ÅÍÍ;*ÁÅå* Axõx·ÄOIÍ&G* ñ·Ê5@–G> Ê5@ÍÖ@ÃÂ@õz·>+ÄÖ@ñÉõåÍTFÂfVá:�·Ê\AñõþÂü@:ŒÖÚø@2ŒñÃ7Aþ Â(ÍÍÓC(Íu ÕÍÓC,ÍÍÓC)ãåÍdÊ$IÍx Ã'IÍæHÑÍ0IÍx > õ{͹FGñÊüH*™ w#Â?IÃüHÍÁI¯ãO>åå~¸ÚXIxÅÍõÊíIñÍx ·ÊõÍÓC,ÍÍ;*ÍÓC,å* ãÍÍÓC)åÍ¥HëÁáñÅW'ÅÕÅõÕÍ«HÑñG=O¾>зxÈ~#F#fh ‘GÅÕãN#^#VáåÕžÂUJ ÊLJ#Â7JÑÑÁѯÉáÑÑÁx”�<ÉÁÑá#Â4JÃIJÍÓC(Í‹9Í;*åÕë#^#V*Æ ÍÍCÚ�J*šÍÍCÒ�JáåÍ£FáåÍÉ(áãÍÓC,Íu ·Êõ~ÍãJÕÍ÷åÍ¥HëáÁñGãå!W'ãy·È~�Ú<¹ÚÀJyH Õ#^#fk GÑëN#~#foëy·Èw# ÈÂØJÉÿþ)ÊñJÍÓC,Íu ÍÓC)ÉÍdÂKͨHÍgGë*Æ ë*› ÃÂ>?ÍÖ@> ÍÖ@Ã(KÍ¿AþÂzK6Ã8Kp¯2‰¯2æ Í¿AþÂoKÍ!B!ÿÿÃ=:’·>\2’ÂUKÊ'KÍÖ@+ÊiK~ÍÖ@ÃK+ÍÖ@ÂKÍÖ@Í!B!b õ¯2’ñOþÊAK:’·Ê�K>\ÍÖ@¯2’yþÊúKþÌCD7Èþ Ê;Lþ ÊúKþ ´KÊ(KÃúKþÌCDÊ(KþÂÒKÊ0KÍÖ@> ÍÖ@>ÃbKþÂÜK>#ÃiKþÂõKÅÕå6Í!B!b ÍÜ áÑÁÃKþ ÚKx·ÂLå*”|µá>ÊL!b Í(ë"˜Ã_yq#ÍÖ@Ö ÂK2e > ÍÖ@Í¿A·Ê,Lþ ÊKÃzK:æ ·ÊB¯w!a Éõ>2æ ñþ;À2æ Ã"¡ ÍÝ$ÍëÍÁL33ÂoL ù"± *˜å*¡ åÕáLÂÉ ëÍÁLÂëLù"± ë*˜ëë"Ä ë##^#V#~#fo"˜ëÍå͆(áʵL´AÅ3à*Ä "˜áÁÁà!9~#‚¹ÂÕL ÃÅL´¹Àå~#foÍÍCáÈ ÃÅLÃã >€2¥ Í‹9åëÍdÍîÁÜUáÉ> Èà UñáÁãëÂ!UÅx͹FÍýFÁãÅåÃÁTÍÍÓC$ÍÓC(Íu Õ~þ,ÂKUÍÍ*QþÊ  Í"Q¯õÍÓC)ñãõ}·Êå͹FëÁñõÊ…UÍ™BÂlUÍõAþÊ~Uw# Â^UñÍéÃýF*± ùÃDÍÂWÚ¬ ÃqUÍ6Qʦ þÊ  !' ~·ÊÃU þÊÃU#~·Â¸UÅ`iÍ}WÁÙU>€–O #~ÖÖŸÃ(PY!' ůwͱW:!ÍžZþÿÊ» =Ê� =ÂõUѯÍÚ <Ê» Á!% ^#Vr+sÉÍ9QÊ6VÅ PYÕþÂ,V!#Våå`i>ÃyV!' ~·ÄÌUÑͱWÍÁ)¯Â9VÉÍ6Qʦ þ!&ÂQV!® ~+nÃ×Í6Qʦ ! ~ÃÕáñåõ*”~þÊEþÊe\ñÕÅDMõ'~þ€åÌÉUá4N#ñõVþ pÊ�VÆàzˆw ñÁÑwáÉ+s#r#6€#6€áãDMå:·ÊÈV!" s#r#6à W! {zVºÊWÕõåÅ€ÍÑÕÍÑáñwÕÕÍÑ<ÂWÍ<Ê» ÁÑ!! {æwá: ·ÂWÍ}WáÉ!! ~þõ€!) ÕåÌ;WÍÉUÑáñÌ;WáÃéÅ€~#Â>WÁÉÅå*”~þÊ–\( ~·ÊhW+~#5–O ~·áÁÉ+~·ÊtWÍzWÂJW7áÁ>É*”ÕT]% N#F+q#p##å€#6 Â’WͱW: ÍžZ·>ªW>€áw+w·ÑÉÅÕå!(ëÍáÑÁÉÍHWØþ7?ÀÅå*”' 6#67áÁÉÍåÍ¥H~·Ê² õ#^#fk_þÚXN#~þ:ÊX++@ÊbXyæßÖ@ÚbXþÒbXþ #úRX~þ.Â0XÍ>Xñ7õÃX#ÂX¯2 ñáÉzþ ÊbXþÚbXÈ> Ã>XÊ7X> ÂWXÃ7Xò ÍÝWå€ÍþÍ<Ê£ !îþ w#Â…XáÍÓCAÍÓCSÍÝWå:þ!î¾ÂþÍ<¾ îÍáÉéÅÍåÍ¥H~·Ê  #N#F æßþOÊæXþIÊæXþR  áÍÓC,Õþ#ÌÍu ÍÓC,{·Ê¦ Ñ_Õ***************************************************************** * * * Low Level Hard Disk Drivers. The following routines are the * * lowest level drivers for the hard disk. * * * * Written By Bobby Dale Gifford. * * 12/8/80 * * * ***************************************************************** hdrev equ 13 ;Revision number maxhd equ 4 ;Maximum # of Hard Disk Drives mrev equ 20 ;Set to the type of hard disk (10, 20, 26) hdorg equ 50h ;Hard Disk Controller origin hdstat equ hdorg ;Hard Disk Status hdcntl equ hdorg ;Hard Disk Control hddata equ hdorg+3 ;Hard Disk Data hdfunc equ hdorg+2 ;Hard Disk Function hdcmnd equ hdorg+1 ;Hard Disk Command hdreslt equ hdorg+1 ;Hard Disk Result retry equ 2 ;Retry bit of result tkzero equ 1 ;Track zero bit of status opdone equ 2 ;Operaction done bit of status complt equ 4 ;Complete bit of status tmout equ 8 ;Time out bit of status wfault equ 10h ;Write fault bit of status drvrdy equ 20h ;Drive re(ÍÛ""æ  ÍÇBÑ!Àÿ9ùë +Í"§ Ê_MÍÓC(ÅÕÍ‹9ãs#r#ãÑÁ~þ,Â=M ÍÃ#MÍÓC)"§ >!‘á=Ê_MÑ=Ê_MÁ=Ê_MÅå!9DMáå!jMãå*æ ãÉ*± ù*§ à¯2í 2î ~݇M2í #+ÍÍ”Rå!"ô á+ÍÊNÍÓC,þ,ʸMÍåÍÛ""ô á+ÍÊNÍÓC,ª»ÊÛMÍÓCAÍÓCLÍÓCLÊNOÍÓC,»ÂÉ ·õ2î ÍÍØÅÍ5$ÁÑÅ`i"ñ ÍøÒNT]"ï áÍÍCÒñÂNO*˜å*š+#~#¶ÊÏN#^#Vë"˜ëÍ·ÊNþ:ÊN¸»Ê2¥ ͉:Ê¢Nxö€G¯Í’;>2¥ ÂhN~þ(ÂnNñþN~þ(Êá͉:z³Â�Nxö€GŠNÕŒ:Õ:g WÃ):z³ÊåBK!±Nå ·ú—N ö€É2¥ ~þ(ÂnNã Í–Ná+ÍÊ"Nþ(ÂÈNÍÍÓC)Ê"NÍÓC,ÃBNá"˜ë*Ä ë* ÍÍCÊ#OåN##~·õæw#Íš< ñÁúÛNÅÍO*Ä "Ä ëáÃÛNë*Æ ÍÍC Oy•_xœW `i"Æ Éë*Æ ëÍÍCÊNOå##~·õæw#Íš2ó :í ·ÂmS:Ä2ŸùR¯2ó 2í * DM*¸ "Ä *› #ë*è "› ÍÍCÂNP `i"Æ ë*ô ë*š+z³Ê ÍøÒÌ `iàÃìÍ Q+ÍÊÚPÍåÍdÊÊPÍ)1ÍÇF* #^#Vþ ªPr+s+5Í&Gá+ÍÊÚPþ;Ê¿PÍÓC,+Í>,ÍÖ@ÇP>"ÍÖ@Í&G>"ÍÖ@íPå*”|µÊQ~þÂQÍÂ\}“o|šgþÿÒQ> ÍÖ@+|Í9Q¯ ÑÅÕÍÝWÑÁÅõzÍÍZñ"§ Ú1Y{·Â1Y!~þ Â1Y6B#6A#6Sázõ"”å#þ w# Â>Y¯wwÑÕͱWáñõåþÂoYÕÍÑÍ<Ê» Ã…YÍ<Â…YÑñõÕþ£ ÃcYÑñÕ!%¯w#w#w#wá~þʨYþÂÉCÍzW*§ É) €p# ®YÃÉCÀÍ TÃÀåÍ TÍõ Íñ_ÍáÉÍÝWå€ÍþÕÍ<ÑÕõÊøYÍñÑÊ£ ÍáÉÂZå!þ6# Í–ZáÄÝW¯2 å!ÿÍ’Z!Í’Z€ÍþÍþÿÊ£ 懇‡‡‡O!�  ~#ÍÖ@yþÂgZ~þ ÊdZ>.ÍÖ@ ÂQZ:e Æ W:�ºÚ€Z> ÍÖ@ÍÖ@Ü!BþÍþÿÂAZáÉ~þ*À6?# –ZÉÕOÅÍÁÑõ!!4¶Z#4¶Z#4yþ"ÂËZñ·ÈþÊ» þ>È<ÉñÉþÀ+ÍÕ€ÊàZÅÍÁå*ê ÍÍCÚ!© s#r¯#wÂôZáÑÉö¯2u]Í*Qþ  Åå!­ ^#Vã~þ,Ì+ÍÂÉ ãz³Êµ +s#ráÁåÅ!° ¯w#w!© ~#foëÕå!€ÍÍCáÂT[Ã’[BK>ë!å)ãÒg[)#Ãh[)ãë)ëÒv[ ãÒu[#ã=Â][}æ_Á}la)ÚÒ�[#x·Â"o]áÁå!² "q]!) "s]áå!€}“o|šgÑÕÍÍCÚ¼[bk:u]·Ê\€ÍÍCÒÑ[åÍ \áÅDMë*s]ë*q]ÍX\"q]PYÁÍ\*o]#"o]á}“o|šg|µåŸ[ááÉåÍ \áÅDMë*q]ë*s]ÍX\ë"q]PYÁÃè[ö¯2 ÅÕåë*o]ë!« å~#foÍÍCás#rÂG\: ·ÊT\!T\åÅå!& äVáÑÁÉÅ~# x±ÂY\ÁÉñÕÅõDMÍÄ\Ê“\͹\!± ñwõ!( V6þ ÊŽ\ÆàzÎwñÁÑáÉø ÕÍÂ\Ê“\͹\!± ~·ÑáÁÉ!©Ã´\!° ^#VÉ!° s#rÉDMͱ\ÕÍ«\ëÑÍÍCÉÍ"§ Í’#Íè\>þ;SÍ"]ÃÉC *šë* ÍÍCÈ!X9}�o|Îgady bit of status index equ 40h ;Index bit of status pstep equ 4 ;Step bit of function nstep equ 0fbh ;Step bit mask of function hdrlen equ 4 ;Sector header length seclen equ 512 ;Sector data length wenabl equ 0fh ;Write enable wreset equ 0bh ;Write reset of function scenbl equ 5 ;Controller control dskclk equ 7 ;Disk clock for control mdir equ 0f7h ;Direction mask for function null equ 0fch ;Null command idbuff equ 0 ;Initialize data command isbuff equ 8 ;Initialize header command rsect equ 1 ;Read sector command wsect equ 5 ;Write sector command if mrev ne 26 seccnt equ 21 ;21 sectors per track for M10 and M20 else seccnt equ 32 ;32 for M26 endif org 100h lxi sp,stack mvi c,0 call setdrv call home lxi b,bxx call setdma loop mvi c,0 call settrk mvi c,0 call sethead mvi c,1 call setsec mvi c,80h call setkey call hdread nop mvi c,200 call settrk mvi c,0 call sethead mvi c,1 call setsec mvi c,0 call setkey call hdreadµÂùPáÍ!BÃéþ#ÀÅÍ*QÑ»ÊQþ  ÍÓC,PYë"”ëÉ+Íþ#ÌÍÍx _:Ļڦ å!¤N#F ·áÉÍ:Q!)þÂ^Q!² ëÉ>>>õͬñ͹F*™ Í÷(ÃüH>>>õÍ¥Hñ¾Ò<2g #~#foÃî(Íd� ,»QZûQÍ QÍ‹9Í;*éÅÕ¯W_õÅåÍÂWÚ¬ þ ÂÎQ¾Qþ"ÂãQG{þ,xÂãQPXÍÂWÚ1R!b ÿOzþ"yÊRþ åÊQRáþ ÂRO{þ,yÄŠRÍÂWÚ1Rþ ÂR{þ Ê+Rþ,> Ê+R·Ê+RºÊ1R»Ê1RÍŠRÍÂWÒèQåþ"ÊÿÍhVë* ë*šÍÍCÊMS~#ÕÍhVÑÃÉSV:ÄÂüSåÅõëSÕÅÉñÁ=òãSáÉÁá~þ,ÀÍÅ~þ#ÌÍu ãåóSÕéÕůÍÙSÁѯÉÍ*Qʦ Ö  ë!© ~#fo"æ !"o]|ë²ë Gë~þ,ÀÕÅÍr õÍÓCAÍÓCSÍ‹9Í;*ñÁãOÕå*o] "o]ë*æ ÍÍCÚ¸ áÑëq#s#ráÃ9Tö7õÍ‹9Í;*ÕÍ÷ÁãåÅÍ¥HFã~OÅåõ#^#V·ÊüT*šÍÍCÒ×T* ÍÍCÚ×TY*Æ ë*› ÍÍCÚUñyÍ2Ä!Ô^"Ÿ :Õ^·ÂÖ^<2Õ^!€~·"Ÿ ÊÖ^F#~+w##ÂD^+6"Ÿ !Í·ÊÖ^þ/Êx^+6""Ÿ #þ/Êx^Í·Âi^ÃÖ^6ÍÍZþSÊÂ^þMõÊ�^þFÂÉ ÍÍÓC:Ídñʯ^z·Â{þÒ2Äô^ë"v ë+ÍÊÖ^ÍÓC/Ã}^ÍÍÓC:Ídë"ê ëô^+*v +"v +å:Ä!Š]"¢¤2Ä<©ës#r#ë å*ê ² DMá=Âó^#"š"± Ñ{•ozœgÚÝB·|g}oÂ_|þÚ0_!{•ozœgÚÝB"v ë"–"› ù"± *šëÍëB}“o|šg++å!š_Í#GáÍ1!Ž_Í#G!#G"˜ Í!B! Ãv] Owned by Microsoft Bytes freeBASIC-80 Rev. 5.21 [CP/M Version] Copyright 1977-1981 (C) by Microsoft Created: 28-Jul-81 åååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå) nop jmp loop bxx ds 512 ds 50 stack equ $ setdrv jmp hddrv ;Select disk home jmp hdhome ;Recalibrate settrk jmp hdtrk ;Seek to specified track setsec jmp hdsec ;Prep for sector # setdma jmp hddma ;Prep for DMA address sethead jmp hdhead ;Set head # setkey jmp hdkey ;Set the key in next transfer read jmp hdread ;Read one sector write jmp hdwrite ;Write one sector dmastat jmp dmahd ;Return DMA address getstat jmp stathd ;Get drive status hddrv mvi a,3 ana c sta hddisk ori null ;Select drive out hdfunc mvi a,scenbl ;Enable the controller out hdcntl mvi c,239 ;Wait for Disk to ready ; 2 minutes for M26 ; 30 seconds for M10 & M20 lxi h,0 tdelay dcx h mov a,h ora l cz dcrc stc rz in hdstat ;Test if ready yet ani drvrdy jnz tdelay if mrev ne 20 ;M20 will do settle delay in hardware lhld settle mov a,h ora l rz lxi h,0 ;Time one revolution of the drive mvi c,index in hdstat ana c mov b,a ;Save current indadd ret wsdone in hdstat ;Wait for seek complete to finish ani complt jz wsdone lxi h,drives-1 ;Update all seek in progress flags mvi b,maxhd+1 wsup inx h inx h dcr b rz mov a,m ani 1 mov m,a jmp wsup hdsec xra a ora c stc rz mvi a,seccnt sub c rc mov a,c sta hdsectr ret hdhead mov a,c ani 7 ; 7 for M26 & M20, 3 for M10 sta head ret hdread call hdprep rc xra a out hdcmnd cma out hddata out hddata mvi a,rsect ;Read sector command out hdcmnd call process rc xra a out hdcmnd mvi b,seclen/4 lxi h,0 hdadd equ $-2 in hddata in hddata rtloop in hddata ;Move four bytes mov m,a inx h in hddata mov m,a inx h in hddata mov m,a inx h in hddata mov m,a inx h dcr b jnz rtloop ret hdwrite call hdprep ;Prepare header rc xra a out hdcmnd lhld hdadd mvi b,seclen/4 wtloop mov a,m ;Move 4 bytes out hddata inx h mov a,m out hddata inx h mov a,m out hddata inx h mov a,m ***************************************************************** * Diablo 1610 simulator for the Morrow Designs / Thinker Toys * * Mult I/O board. The simulator makes the parallel Hityp II * * look like a serial 1610. * * This interface is designed to work with the INSTALL.COM * * program which is available from Morrow Designs / Thinker * * Toys. For an explanation of how this works consult the * * INSTALL documentation. * * Bobby Dale Gifford. * * Revised 6/25/81 dmg * ***************************************************************** int equ 1 ; 1 for conditional assembly of interrupt driven code. ***************************************************************** * Special character equates. * ***************************************************************** acr equ 0dh ;Carriage Return alf equ 0ah ;Line feed aetx equ 3 ;ETX character aack equ 6 ;ACK character aesc equ 1bh ;Escape character abs equ 8 ;Back Space aht equ 9 ;Horizontal tab aff equ 0ch ;ex level in B indx1 in hdstat ana c cmp b ;Loop util index level changes jz indx1 indx2 inx h in hdstat ;Start counting until index returns to ana c ; previous state cmp b jnz indx2 shld settle ;Save the Count for timeout delay endif ret dcrc dcr c ;Conditional decrement C routine ret hdkey mov a,c sta nkey ret hdhome call drvptr mvi m,0 ;Set track to zero inx h ;Point to seek flag mvi m,1 ;Set not seeking, but must delay stepo in hdstat ;Test status ani tkzero ;At track zero ? rz if mrev ne 20 mvi a,1 stc call accok ;Take one step out call wsdone ;Wait for previous seek to finish jmp stepo else xra a ;Make (a) into zero will do 255 steps stc ;and on an m20 this will do a recalibrate jmp accok endif delay equ $ if mrev ne 20 lxi h,0 ;Get delay settle equ $-2 deloop dcx h ;Wait 20ms mov a,h ora l inx h dcx h jnz deloop endif lxi h,drives-1 mvi b,maxhd+1 delup inx h inx h dcr b rz movout hddata inx h dcr b jnz wtloop mvi a,wsect ;Issue write sector command out hdcmnd call process rc mvi a,wfault ana b stc rz xra a ret process in hdstat ;Wait for command to finish mov b,a ani opdone jz process mvi a,dskclk out hdcntl in hdstat ani tmout ;Timed out ? stc rnz in hdreslt ani retry ;Any retries ? stc rnz xra a ret hdprep in hdstat ani drvrdy stc rnz mvi a,isbuff ;Initialize pointer out hdcmnd call build ori 0ch out hdfunc lda head out hddata ;Form head byte call drvptr mov a,m ;Form track byte out hddata mvi a,0 ;Form sector byte hdsectr equ $-1 out hddata mvi a,0 nkey equ $-1 out hddata inx h ;Bump to seek flag mov a,m inr a ;Update the seek in progress flag push h cz wsdone pop h mov a,m dcr a ;Test for delay also cz delay mvi a,dskclk out hdcntl mvi a,wenabl out hdcntl xra a ret drvptr lhld hddisk xchg mvi d,0 lxi h,drives dad d dad d ret Form Feed abel equ 7 ;Bell asp equ 20h ;Space anul equ 0 ;Null adel equ 7fh ;Delete ars equ 1eh ;RS character aus equ 1fh ;US character avt equ 0bh ;Vertical tab ***************************************************************** * The following equates are for the Mult I/O board. * ***************************************************************** grp equ 7 ;Group select port offset clk equ 2 ;WB14 printer select port pic0 equ 4 ;Interrupt controller port 0 pic1 equ 5 ;Interrupt controller port 1 daisy0 equ 0 ;Daisy wheel port 0 daisy1 equ 1 ;Daisy wheel port 1 imask equ 40h ;Interrupt enable mask d4 equ 10h ;8259 data bit 4 ltim equ 8 ;Level triggered interrupt mode addi equ 4 ;Address interval sngl equ 2 ;Single 8259 eoi6 equ 66h ;End of interrupt 6 rstbit equ 080h ;Restore Bit data11 equ 4 ;Data bits on daisy port data12 equ 8 data910 equ 3 crstrd equ 1020h ;Carriage ready pfstrd equ 810h ;Paper feed ready pwstrd equ 2040h ;Print wheel ready cp a,m dcr a jnz delup mov m,a jmp delup hdtrk call drvptr ;Get pointer to current track mov e,m ;Get current track push h ;Save pointer to current track inr e ;Ever homed this drive ? cz hdhome pop h ;Restore track pointer mov e,m ;Get current track mov m,c ;Update the track mov a,e ;Need to seek at all ? sub c rz push psw ;Save # of steps inx h ;Point to the seek complete flag mov a,m ;Get current seek progress flag inr a ;Currently seeking ? push h ;Save seek flag pointer cz wsdone ;Wait if currently seeking pop h mvi m,0ffh ;Set seek in progress flag pop psw cmc ;Get carry into direction jc accok cma inr a accok mov b,a ;Prep for build call build sloop ani nstep ;Get step pulse low out hdfunc ;Output low step line ori pstep ;Set step line high out hdfunc ;Output high step line dcr b ;Update repeat count jnz sloop ;Keep going the required # of tracks ret hddma mov h,b ;Save the DMA address mov l,c shld hd build mvi a,0 head equ $-1 ral ral ral ral ori 0 hddisk equ $-1 xri 0f0h ret dmahd push h lhld hdadd mov b,h mov c,l pop h ret stathd in hdreslt ani 3 mov b,a in hdstat xri 31h ret drives dw 0ffffh dw 0ffffh dw 0ffffh dw 0ffffh end åååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå*eri equ 10 ;Default to 10 characters per inch lperi equ 6 ;Default lines per inch hinc equ 120 ;Horizontal increments per inch vinc equ 48 ;Vertical increments per inch numtabs equ 160 ;Number of horizontal tabs maxchrs equ 1024 ;Maximum number of printer characters to queue maxrgt equ 1584 ;Maximum carriage position ***************************************************************** * Below is a standard CP/M Cbios jump table as required by * * INSTALL. * ***************************************************************** jmp $ ;No change in the cold boot owboot: jmp nwboot ;New warm boot routine oconst: if int jmp nconst ;New console status else jmp $ ;No change endif oconin: if int jmp nconin ;New console input else jmp $ ;No change endif jmp $ ;No change in the console output olist: jmp nlist ;New list device output jmp $ ;No change in the punch device output jmp $ ;No change in the reader device output jmp $ ;No change in the homSet by platen motion hpos: dw 0 ;Horizontal position. Set by carriage motion dlhpos: dw 0 ;Delta hpos. Set by carriage motion lmar: dw 0 ;Left margin dirflg: db 0 ;Direction flag grhflg: db 0 ;Graphics mode flag escflg: db 0 ;Escape sequence in progress flag scstuf dw 80h ;Scan buffer data tabstp: ds numtabs ;Tab stops array ds 30 ;Stack space stack equ $ if int queue: ds maxchrs ;Circular Queue of printer characters quetop: dw queue ;Queue top pointer quebot: dw queue ;Queue bottom pointer hlsave: dw 0 ;Used by interrupt routine afsave: db 0 ;Used by interrupt routine hndflg: db 0 ;Handshake in progress flag etxflg: db 0 ;Used for ETX/ACK handshake ackxon: db 2 ;Default handshake is XON/XOFF ; Can be changed with -Hx. ; Possible handshakes are: ; 0 = none ; 1 = ETX/ACK ; 2 = XON/XOFF ; 3 = ETX/ACK through console * * The following data only needs to be included if the 8259 * has not been initialized. * dw 0,0,0,0 dw 0s jz nogd ;No digits call ok09 ;Check for 0-9 jc nogd add a ;Multiply by 10 mov b,a add a add a add b mov b,a call scan ;Get next character jz nogd ;No character call ok09 ;Check if 0-9 jc nogd ;No good add b ;Add into result mov l,a mvi h,0 ;Make it a 16 bit number ret nogd: stc ;Error return ret newc: call scan ;Change the default characters per inch rz cpi '1' ;Must be 10 or 12 jnz zret call scan rz ;Only one character cpi '0' mvi l,10 ;It was ten jz newcok cpi '2' mvi l,12 ;It was 12 jnz zret newcok: mvi h,0 ;Make 16 bit integer shld dspace jmp zret newl: call gettwo ;New lines per inch jc zret ;Error reading digits shld dlines jmp zret newa: call scan ;New auto line feed cpi '1' ;Must be 0 or 1 jz newaok cpi '0' jnz zret newaok: sui '0' ;Set the auto flag sta autolf jmp zret okhex: call ok09 ;Check first if 0-9 rnc ;Yes okaf: cpi 'A' ;Check if less than 'A' rc cpi 'F'+1 ;Chece routine osel: if int jmp nsel ;New seldsk routine else jmp $ ;No change endif jmp $ ;No change in the settrk jmp $ ;No change in the setsec jmp $ ;No change in the setdma ord: if int jmp nrd ;New read else jmp $ ;No change endif owr: if int jmp nwr ;New write else jmp $ ;No change endif olstst: jmp nlstst ;New list device status jmp $ ;No change in the sectran ***************************************************************** * The following routines are for handshaking with the printer * * they can be used directly or by the CBIOS of CP/M. * ***************************************************************** nop ;Marker rest: jmp restor ;Initialization procedure if int lst: jmp lstdev ;Printer character output ; character in reg C hndxof: jmp xonoff ;Printer busy test XON/XOFF ; returns with: ; A = 1 queue full ; A = 0 queue not full or empty ; A = 0ffh queue empty hndetx: jmp etxack ;ETX and AC,0,0,0 dw 0,0,0,0 dw 0,0,0,0 table: jmp noint ;No interrupt db 0 jmp noint db 0 jmp noint db 0 jmp noint db 0 jmp noint db 0 jmp noint db 0 jmp pwint db 0 jmp noint db 0 endif ***************************************************************** * New Boot routine, examine the command line put at 80H by * * install. * ***************************************************************** nwboot: mvi a,1 ;Is this a second warm boot ? wbflg equ $-1 ana a mvi a,0 ;Reset the warm boot flag sta wbflg jz owboot ;Don't reset if second warm boot jmp skpdsh cloop: call scan jz nomore cpi '-' ;Check for flag jnz cloop skpdsh: call scan jz nomore if int cpi 'H' ;New handshake routine -Hx cz newh endif cpi 'B' ;New I/O base -Bxx cz newb cpi 'F' ;New forms length -Fxx cz newf cpi 'C' ;New characters per inch -Cxx cz newc cpi 'L' ;New lines per inch -Lxx cz newl cpi 'A' ;New auto line feed -Ax cz newa jmp cloop k if greater than 'F' cmc rc sui 'A'+10 ;Make into binary ret ok09: cpi '0' ;Check for 0-9 rc ;Less than '0' cpi '9'+1 ;Check if greater than '9' cmc rc sui '0' ;Turn into binary ret ***************************************************************** * New select disk routine, disable interrupts. * ***************************************************************** if int nsel: di call osel ;Execute old disk select ei ret nrd: di ;Execute old disk read call ord ei ret nwr: di call owr ;Execute old disk write ei ret ***************************************************************** * New console status routine, used with ETX/ACK handshake. * ***************************************************************** nconst: lda ackxon cpi 3 jnz oconst call oconst ;Check old console status ana a rnz jmp hndetx ;Check ETX handshake ***************************************************************** * New console input routine, used K software handshake ; returns with: ; A = 0 No ACK to transmit ; A = 0ffh ACK transmitted endif ***************************************************************** * Dynamic data locations used by the simulator. * ***************************************************************** ; (made for electric pencil) base: db 48h ;Default Mult I/O board base address ; Can be changed with -bxx. dfrmln: dw 110 ;Default forms length 10 times the forms ; length switch. Can be changed ; with -fxx. dspace: dw cperi ;Default characters per inch. ; Can be changed with -cxx. dlines: dw lperi ;Default lines per inch. ; Can be changed with -lxx. autolf: db 0 ;Default to no Auto line feed. ; Can be changed with -ax. hmi: dw 0 ;Horizontal motion index. Set by RESTORE ; and escape sequences. vmi: dw 0 ;Vertical motion index. Set by RESTORE ; and escape sequences. vpos: dw 0 ;Vertical position. Set by platen motion dlvpos: dw 0 ;Delta vpos.  nomore: call rest ;Reset the printer jmp owboot ;Go to the warm boot scan: push h ;Return the next character in the command lhld scstuf ;Pointer to next char mov a,m ;Get next char ana a ;Test error return jz noupdt ;No update inx h ;Update pointer shld scstuf ;Save new pointer noupdt: pop h ;Restore registers ret if int newh: call scan ;End of command ? rz cpi '1' jc zret ;Invalid ? cpi '3'+1 jnc zret sui '0' sta ackxon ;Set new handshake option endif zret: mvi a,0 ret newb: call scan ;End of command ? rz call okhex ;Valid hex character ? jc zret ral ! ral ! ral ! ral mov b,a call scan rz call okhex ;Valid hex character ? jc zret ora b mov b,a ani 7 ;Check if divisible by 8 jnz zret mov a,b sta base ;New I/O base jmp zret newf: call gettwo ;New default forms length jc zret lxi d,10 ;Set to ten times the forms length call hltde shld dfrmln jmp zret gettwo: call scan ;Get two decimal digit+with ETX/ACK handshake. * ***************************************************************** nconin: lda ackxon ;Determine the type of handshake cpi 3 jnz oconin ;None, do old conin call oconst ana a jnz oconin call hndetx ana a mvi a,aack jz nconin ret endif ***************************************************************** * List is the New list device output. As implemented, it uses * * an XON/XOFF or ETX/ACK protocal. * ***************************************************************** nlist: if not int jmp diablo else lda ackxon dcr a jm lst dcr a jm lstetx dcr a jm lstxon jmp lst lstetx: push b ;Save the character call lst ;Print the character pop b mov a,c ;Check if it was a carriage return cpi acr rnz mvi c,aetx ;Send an ETX call lst wetx: call hndetx ;Check if ACK ana a rnz jmp wetx lstxon: push b ;Save char to print call hndxof ;Check XOFF cpi 1 ;Is it full ? cz wxoff pop b ;Recover char to pharacters in the printer queue. characters * * are removed from the queue by the print wheel interrupt * * service routine. * ***************************************************************** if int lstdev: di ;Disabled while manipulating queue lhld quebot ;Get pointer to next slot mov m,c ;Insert the character inx h ;Point to next slot shld quebot lxi d,queue+maxchrs ;Address of first byte beyond queue call hlcde ;Compare HL with DE jnz lstdon ;No match, don't wrap around lxi h,queue ;First address in queue shld quebot lstdon: call group0 lda base adi pic1 ;8259 mask register call input ;Get current mask contents ani 0ffh-imask ;Turn on print wheel interrupt mov b,a lda base adi pic1 call output ei ret endif ***************************************************************** * Restore routine. Restore should be executed to reset the * * printer into a known state, and initialize all the ram * * dynamic data locations. * ********************************************* notabs: lxi h,tabstp ;Beginning of tab stop array lxi d,numtabs ;Number of tab stops notblp: mvi m,0 ;Reset the tab inx h ;Next tab stop dcx d ;Update repeat count mov a,e ;Test for zero ora d jnz notblp ;Continue zeroing ret ***************************************************************** * Noint should never be executed. If it is then just die. * ***************************************************************** if int noint: jmp noint ;Die in jump self endif ***************************************************************** * Pwint is the interrupt service routine for the Hityp II. * * Remember: interrupts are disabled. * ***************************************************************** pwint: if int sta afsave ;Save the acumulator shld hlsave ;Save HL ral ;Get the carry into register A lxi h,0 dad sp ;Get the Stack pointer lxi sp,stack ;Set up new stack push h ;Save old stack pointer rint jmp lst wxoff: call hndxof ;Check XON cpi 0ffh jnz wxoff ret endif ***************************************************************** * New list device status routine. Returns 0ffh if the printer * * can except another character, otherwise it returns 0. * ***************************************************************** nlstst: if not int call group0 lxi d,pwstrd lda base call input ana d mvi a,0 rz cma ret else call hndxof ;Check # of characters in queue cpi 1 mvi a,0 rz ;Can not except another char cma ret ***************************************************************** * Xonoff status. Checks if there are any characters in the * * printers character queue. Returns with reg A = 1 if the * * character queue is within 10 characters of being full, or * * returns with reg A = 0ffh if the character queue is within * * 10 characters from being empty, otherwise returns 0. * * This can be used to implement the XON and XOFF protocal. * * Restore assumes that the 8259 interrupt controller on the * * Mult I/O board has already been initialized. * ***************************************************************** restor: if int di ;No interrupts lxi d,table lxi h,table mov a,l ani 0e0h ;Form 32 byte boundry mov l,a push h mvi c,32 sloop: ldax d mov m,a inx h inx d dcr c jnz sloop pop h call group0 mov a,l ori d4+ltim+addi+sngl mov b,a lda base adi pic0 call output mov b,h lda base adi pic1 call output mvi b,0ffh lda base adi pic1 call output * * End of 8259 initialization * endif select: call group0 lda base adi clk mvi b,80h ;Set select line active. call output lda base ;Get base I/O port mvi b,0ffh-rstbit ;Low bit on restore, others high call output ;Output data in register B lda base ;Base I/O port mvi b,-1 ;Output Restore bit high call output ;Output data in register B lhld dspace ;Characters per inch xchg ;DE = charactrar ;Restore the carry lda afsave ;Get original contents of acumulator push psw ;Save acc lhld hlsave ;Get original contents of HL push h ;Save HL push b ;Save BC push d ;Save DE call group0 ;Select group 0 lhld quebot ;Get bottom of queue xchg lhld quetop ;Get top of queue call hlcde ;Is there anything in the queue ? jz empty ;No, queue is empty mov c,m ;Get the next character inx h ;Bump queue pointer shld quetop ;Save the adjusted queue top lxi d,queue+maxchrs ;Address of byte past queue call hlcde ;Need to wrap ? jnz pwdon lxi h,queue ;Adjust queue top shld quetop pwdon: call diablo ;Process the character intret: call group0 mvi b,eoi6 ;End of interrupt service routine lda base adi pic0 call output pop d ;Restore DE pop b ;Restore BC pop h ;Get original HL pop psw ;Restore PSW shld hlsave ;Save HL pop h ;Get original SP sphl ;Restore original SP lhld hlsave ;Restore HL ei ;Turn interrupts back on ret  ***************************************************************** xonoff: call quesiz ;Get number of characters in queue xchg lxi h,maxchrs-10 call hlcde mvi a,1 rc lxi h,10 call hlcde mvi a,0 rc cma ret ***************************************************************** * ETX/ACK handshake routine. * ***************************************************************** etxack: di lda etxflg mov b,a xra a sta etxflg ei mov a,b ret ***************************************************************** * Quesiz returns the number of characters in the queue in HL. * ***************************************************************** quesiz: di lhld quetop ;Get pointer to top of queue xchg lhld quebot ;Get pointer to bottom of queue ei call hlcde ;Compare HL with DE jnc hlmde ;Subtract DE from HL xchg call hlmde xchg lxi h,maxchrs jmp hlmde endif ***************************************************************** * Lstdev just puts cers per inch lxi h,hinc ;HL = maximum increments per inch call hldde ;Divide Hl by DE shld hmi ;Save hmi = 120/(characters per inch) lhld dlines ;Lines per inch xchg ;DE = lines per inch lxi h,vinc ;HL = MAximum increments per inch call hldde ;Divide HL by DE shld vmi ;Save vmi = 48/(lines per inch) lxi h,0 ;Other variables default to zero shld vpos shld dlvpos shld hpos shld dlhpos shld lmar xra a sta dirflg sta grhflg if int sta escflg sta hndflg lxi h,queue ;Zero the command queue shld quetop shld quebot mvi b,eoi6 ;Specific end of interrupt 6 lda base adi pic0 call output lda base ;Get the interrupt mask bits adi pic1 call input ani 0ffh-imask ;Enable the daisy port interrupt mov b,a lda base adi pic1 call output ;Output the daisy port interrupt mask low ei ;Ok for interrupts now endif ***************************************************************** * Clear all tab stops. * ********************, ;Go back ***************************************************************** * Empty turns off the print wheel interrupt mask bit if the * * character queue is empty when an interrupt occurs. * ***************************************************************** empty: call paper ;Print any remaining motion call carrg call group0 lda base ;Base of Mult I/O adi pic1 ;Get the interrupt mask register call input ;Read the current mask ori imask ;Turn on the bit mov b,a ;Data into B lda base ;Put the mask back adi pic1 call output jmp intret ret endif ***************************************************************** * Diablo does all of the character decoding, escape sequences * * forward, backward, etc. The list of escape sequences, and * * special characters recognized is: * * adel ignored * * anul ignored * * aack ignored (when received) * * abel ignored * * aff form feed * * aetx etx/ack handshake * * aht horizontal tab * *  byte character to match * * 2 bytes of address to execute * * terminated by a first byte of 0. * ***************************************************************** level0: db aesc dw doaesc ;Beginning of an escape sequence db aff dw doaff ;Form feed db aetx dw doaetx db aht dw doaht ;horizontal tab db alf dw doalf ;Line feed db asp dw doasp ;Space db abs dw doabs ;Back space db acr dw doacr ;Carriage return db 0 dw dochar ;Any other character level1: db '1' dw sethtab ;Set horizontal tab db '2' dw clrall ;Clear all horizontal tabs db '3' dw setgrp ;Graphics mode db '4' dw clrgrp ;Clear graphics mode db '5' dw clrdir ;Forward printing db '6' dw setdir ;Backward printing db '8' dw clrhtab ;Clear horizontal tab db '9' dw setlmar ;Set left margin db '0' dw func1 ;No operation level 1 db 'A' dw func1 db 'B' dw func1 db 'a' dw func1 db 'b' dw func1 db 'D' dw neghlf ;Negative half line feed drizontal tabs func2: func1: xra a ;Clear escape sequence flag sta escflg ret setgrp: mvi a,1 ;Set graphics mode on sta grhflg jmp func1 clrgrp: xra a ;Turn graphics mode off sta grhflg jmp func1 clrdir: xra a ;Forward print mode sta dirflg jmp func1 setdir: mvi a,a ;Set backward printing mode sta dirflg jmp func1 setlmar: lhld hpos ;Get current position xchg lhld dlhpos ;Get offset dad d shld lmar jmp func1 setvmi: mov l,c ;Set the motion index mvi h,0 dcx h shld vmi jmp func2 sethmi: mov l,c mvi h,0 dcx h shld hmi jmp func2 poshlf: call hlfvmi ;Half line feed vmi call adjvp jmp func1 neghlf: call hlfvmi ;Negative half line feed call neghl call adjvp jmp func1 hlfvmi: lhld vmi ;Get vmi for full line feed divid2: mov a,h ;High byte ora a ;Clear the carry rar mov h,a mov a,l rar mov l,a ret abshtab: mov e,c ;Absolute horizontal tab mvi d,0 dcx d ;Form 16 bit tab column call newdlh jmpalf line feed * * asp space * * abs backspace * * acr carriage return * * aesc 0 ignored * * aesc 1 set tab stop at current print position * * aesc 2 clear all tab stops * * aesc 3 graphics mode on * * aesc 4 graphics mode off * * aesc 5 forward print * * aesc 6 backward print * * aesc 8 clear tab stop * * aesc 9 set left margin * * aesc A ignored * * aesc B ignored * * aesc D negative half line feed * * aesc U half line feed * * aesc alf negative line feed * * aesc aht c absolute horizontal tab * * aesc avt c absolute vertical tab * * aesc ars c set vmi * * aesc aus c set hmi * ***************************************************************** diablo: mov a,c ;Get the character to print ani 7fh ;Strip off parity rz cpi adel ;Ignore delete rz mov c,a ;Save character lda escflg lxi h,level0 ;Level zero characters ana a mov a,c ;Scan for char in A jz lookup ;Look up activity for this b 'U' dw poshlf ;Half line feed db alf dw neglf ;Negative line feed db aht dw settwo ;Two character escape sequence db avt dw settwo db ars dw settwo db aus dw settwo db 0 dw func1 level2: db aht dw abshtab ;Absolute horizontal tab db avt dw absvtab ;Absolute vertical tab db ars dw setvmi db aus dw sethmi db 0 dw func2 ***************************************************************** * The following routines execute escape sequences, etc. * ***************************************************************** settwo: doaesc: mov a,c ;Get the escape character sta escflg func0: ret doaetx: if int mvi a,0ffh ;Set the handshake flag sta etxflg endif ret doalf: call lfvmi ;Get line feed vmi adjvp: xchg lhld dlvpos ;Get vertical motion displacement dad d shld dlvpos ret lfvmi: lda grhflg ana a lxi h,1 ;Only 1/48 if in graphics mode rnz lhld vmi ;Get vertical motion index ret neglf: call lfvmi ;Get line feed vm func2 newdlh: lhld hmi call hltde ;Multiply by hmi xchg lhld hpos ;And subtract current horizontal position xchg call hlmde shld dlhpos ret absvtab: mov e,c ;Absolute vertical tab mvi d,0 dcx d lhld vmi call hltde ;Multiply by vmi xchg lhld vpos ;And subtract the current vertical position xchg call hlmde shld dlvpos jmp func2 sethtab: call tabcol ;Set horizontal tab mvi m,1 jmp func1 tabcol: lhld hpos ;Compute address of current character col xchg lhld dlhpos dad d ;Get logical position xchg lhld hmi ;And divide by hmi to get character column xchg call hldde lxi d,tabstp dad d ;Index into the tab stop array ret clrhtab: call tabcol ;Clear horizontal tab mvi m,0 jmp func1 doaht: call tabcol ;Get current tab column lxi d,tabstp+numtabs tablop: inx h ;Start with next position call hlcde jnc tofar ;Past last tab mov a,m ;Get value of current column ana a ;Test if it is set jz tablop lxi d,tabstp ;Subtracharacter lda escflg lxi h,level1 ;Single character escae sequences cpi aesc mov a,c ;Scan for char in A jz lookup ;Execute single level escape sequence lxi h,level2 ;Two character escape sequence lda escflg ***************************************************************** * Lookup scans the table pointed at by HL looking for a match * * of the character in register A. * ***************************************************************** lookup: dcr m ;Test if end of table inr m jz gother ;Execute the default function cmp m ;Otherwise test for a match jz gother inx h ;Bump over character inx h ;Bump over function address inx h jmp lookup gother: inx h ;Bump over character mov a,m ;Get low byte of function address inx h mov h,m ;Get high byte of function address mov l,a ;Form Address of function pchl ;Execute it ***************************************************************** * Each of the following tables contains entries of the form: * * 1i call neghl call adjvp jmp func1 doasp: call sphmi ;Get space horizontal motion spdir: lda dirflg ;Forward or backwards ? ana a cnz neghl ;Negate HL adjhp: xchg ;Adjust Horizontal position lhld dlhpos ;Get current adjustment dad d ;Update it shld dlhpos ;And save ret sphmi: lda grhflg ;In graphics mode ? ana a lxi h,2 ;Only 1/60 if in graphics mode rnz lhld hmi ret doabs: call sphmi ;Space increment call neghl ;Negative to start with jmp spdir ;Adjust backwards doacr: xra a sta dirflg ;Forward printing sta grhflg ;No graphics mode lhld hpos ;Get current offset xchg lhld lmar ;Get left margin call hlmde shld dlhpos ;Don't move yet though lda autolf ;In Auto line feed mode ? ana a jnz doalf ;Do line feed also ret dochar: mov l,c mvi h,0 call wheel ;Print the character in register C lda grhflg ana a lxi h,0 ;Don't move if in graphics mode jnz spdir lhld hmi jmp spdir clrall: call notabs ;Clear all ho-ct off array address call hlmde xchg jmp newdlh tofar: lhld hpos xchg lxi h,maxrgt call hlmde shld dlhpos ret doaff: lhld dfrmln ;Multiply forms length by 48 lxi d,48 call hltde lxi d,10 call hldde ;And divide it by 10 push h ;Save this result lhld vpos ;Get logical vertical position xchg lhld dlvpos dad d pop d push d ;Get copy of forms length call hldde ;HL mod DE xchg pop d xchg call hlmde xchg lhld dlvpos dad d shld dlvpos jmp paper group0: lda base adi grp mvi b,0 ***************************************************************** * Output the data in register B to the port in register A. * ***************************************************************** output: sta outnum ;Put port number in the instruction mov a,b ;Data to register A. out 0 ;Self modified to port number outnum equ $-1 ret ***************************************************************** * Input from the port in register A. * ************ c,a cc dadde xchg dad h xchg jmp mult dadde: dad d ret ***************************************************************** * The routines below actually interface to the printer, * * causing paper feed, carriage, and print wheel motion. * ***************************************************************** carrg: lhld dlhpos ;Check for any accumulated motion mov a,h ora l rz lhld hpos ;Check for to much motion xchg lhld dlhpos dad d mov a,h ana a jp lftok lhld hpos call neghl shld dlhpos lftok: lhld hpos xchg lhld dlhpos dad d lxi d,maxrgt call hlcde jc rgtok lhld hpos ;Otherwise move only to maxright xchg lxi h,maxrgt call hlmde shld dlhpos rgtok: lhld hpos ;Update the horizontal position xchg lhld dlhpos dad d shld hpos lhld dlhpos ;check if required motion is to the left mov a,h ana a mvi c,0 jp posh call neghl mvi c,data11 posh: xchg lxi h,0 shld dlhpos ;Reset the horizontal increment xchg mov a,l ý>ÃÃÃà à ÃÃÃÃÃÃÃ!Ã$Ã'Ã*à Ã0Ã2Hn €>§>2ÊÃ)ÍQÊKþ-ÂÍQÊKþBÌcþFÌŠþCÌÁþLÌäþAÌðÃÍ4Ãå*P~§Ê^#"PáÉ>ÉÍQÈÍÚ`GÍQÈÍÚ`°GæÂ`x27Ã`ÍœÚ` Í*"8Ã`ÍQÊ¿ÍÚ¿‡G‡‡€GÍQÊ¿ÍÚ¿€o&É7ÉÍQÈþ1Â`ÍQÈþ0. ÊÜþ2. Â`&":Ã`ÍœÚ`"<Ã`ÍQþ1Êýþ0Â`Ö02>Ã`ÍÐþAØþG?ØÖKÉþ0Øþ:?ØÖ0ÉÙÍÙ@ :7Íç¢>È/ÉÍÙ:7Æ€Íà:7Íà:7ÿÍà*:ë!xÍ"?*<ë!0Í"A!"C"E"G"I"K¯2M2N!R 6#{²ÂˆÉ͸ÍDÉyæÈþÈO:O!Ó§yʾ:O!îþyʾ!-:O54Ê;ÊÍ###þ#~#foé< «A � B f… Žª1\2À3È4Ð5×6Þ***************************************************** input: sta innum ;Put port number in the instruction in 0 ;Self modified port number innum equ $-1 ret ***************************************************************** * Neghl forms the twos complement of HL. * ***************************************************************** neghl: mov a,h cma mov h,a mov a,l cma mov l,a inx h ret ***************************************************************** * Hlmde subtracts DE from HL and returns. * ***************************************************************** hlmde: xchg call neghl xchg dad d ret ***************************************************************** * Hlcde compares HL with DE. On return the Z flag is set if * * they are equal, the Carry flag is set if HL is less than DE. * ***************************************************************** hlcde: mov a,h cmp d rnz mov a,l cmp e ret *********************************************ani 1 jz nohhlf ;No half spaces mov a,c ori data12 mov c,a nohhlf: call divid2 mov a,h ani data910 ora c mov h,a lxi d,crstrd jmp cmnd paper: lhld dlvpos ;Check for any paper motion mov a,h ora l rz ;No motion mov a,h ana a mvi c,0 jp posv call neghl mvi c,data11 posv: mov a,h ani data910 ora c mov h,a push h ;Save paper motion lhld vpos xchg lhld dlvpos ;Get logical position dad d push h ;Save for now lhld dfrmln ;Get default form length lxi d,48 call hltde ;Multiply by 48 lxi d,10 call hldde ;Divide by 10 pop d xchg call hldde ;Compute HL mod DE xchg shld vpos ;Save new vertical position lxi h,0 shld dlvpos ;Reset vertical motion pop h lxi d,pfstrd ;Paper feed strobe jmp cmnd wheel: push h call carrg ;Position the carriage first call paper pop h lxi d,pwstrd cmnd: call group0 lda base call input ana d jz cmnd mov a,l cma mov l,a mov a,h ani data910+data11+data12 cma mo8y9æ0ÃAÃBÃaÃbÃDU Z < <<<à ( DôþÃy2OÉÉÍNë*E"EÉ:N§!À*AÉÍNÍíÍEÃÃÍy:M§Äíë*I"IÉ:N§!À*?ÉÍyÍíÃi¯2M2N*Gë*KÍõ"I:>§ÂBÉi&Íþ:N§!Âi*?ÃiÍ‚¯2OÉ>2NÃï2NÃï2MÃÃ>2MÃÃ*Gë*I"KÃÃi&+"AÃÃi&+"?ÃÃÍÍEÃÃÍÍíÍEÃÃ*A|·g}oÉYÍ2ÃÃ*?Í*ë*GëÍõ"IÉY*AÍ*ë*CëÍõ"EÃÃÍd6ÃÃ*Gë*Ië*?ëÍRÉÍd6ÃÃÍdò#ÍüÒ�~§Ê‡RÍõëÃ2*Gë!0Íõ"IÉ*80Í* Íå*Cë*EÑÕÍëÑëÍõë*E"Eø:7Æ2åxÓÉ2ëÛÉ|/g}/o#ÉëÍíëÉ|ºÀ}»Éz/G{/O>=ø)ëõ)ñÒ#å Ò%ë#ãáÃáëÃMD!x±Èx·GyOÜBë)ëÃ/É*I|µÈ*Gë*I|§ò`*GÍí"I*Gë*I0ÍüÚ~*Gë!0Íõ"I*Gë*I"G*I|§ò˜Ííë!"Ië}æʪyöOÍ |æ±g à *E|µÈ|§òÊÍí|æ±gå*Cë*Eå*80Í* ÍÑëÍë"C!"Eáà åÍD͸á@ ÍÙ:7Íç¢Ê }/o|æ/g:7ÆEÍà:7DÍà|«G:7ÍàD:7Ãà$’I$’I"$�’„!$ˆDH�"I’I’@H’I!I � BB@’‚I"H‰A$"’I$’I$’I$’I$‘ˆ€‰$‘$IH� I" $$ˆ�$ $’II $D’!’$$‰DDAD� @€@B‚I"�$ˆ�$ "A‚H******************** * Divide the number in HL by the number in DE. Return the * * quotient in HL and the remainder in DE. * ***************************************************************** hldde: mov a,d ;Start by negating DE and cma ; moving the left operand to BC mov b,a mov a,e cma mov c,a inx b mvi a,16 ;Repeat count in reg A lxi d,0 ;Initial remainder is zero div3: dcr a ;Test if done rm ;All done ? dad h ;Shift right operand to the left xchg push psw ;Save carry dad h ;Shift left operand to the left pop psw jnc div1 ;Does it fit ? inx h div1: push h dad b jnc div2 xchg inx h xthl pop h jmp div3 div2: pop h xchg jmp div3 ***************************************************************** * Multiply the contents of HL by the contents of DE. * ***************************************************************** hltde: mov c,l mov b,h lxi h,0 mult: mov a,b ora c rz mov a,b ora a rar mov b,a mov a,c rar movv h,a lda base adi daisy1 mov b,l call output lda base mov b,h call output mov a,h xra e mov b,a lda base call output mov b,h lda base jmp output end åååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå.D‚D$À*?ÉÍyÍíÃi¯2M2N*Gë*KÍõ"I:>§ÂBÉi&Íþ:N§!Âi*?ÃiÍ‚¯2OÉ>2NÃï2NÃï2MÃÃ>2MÃÃ*Gë*I"KÃÃi&+"AÃÃi&+"?ÃÃÍÍEÃÃÍÍíÍEÃÃ*A|·g}oÉYÍ2ÃÃ*?Í*ë*GëÍõ"IÉY*AÍ*ë*CëÍõ"EÃÃÍd6ÃÃ*Gë*Ië*?ëÍRÉÍd6ÃÃÍdò#ÍüÒ�~§Ê‡RÍõëÃ2*Gë!0Íõ"IÉ*80Í* Íå*Cë*EÑÕÍëÑëÍõë*E"Eø:7Æ2åxÓÉ2ëÛÉ|/g}/o#ÉëÍíëÉ|ºÀ}»Éz/G{/O>=ø)ëõ)ñÒ#å Ò%ë#ãáÃáëÃMD!x±Èx·GyOÜBë)ëÃ/É*I|µÈ*Gë*I|§ò`*GÍí"I*Gë*I0ÍüÚ~*Gë!0Íõ"I*Gë*I"G*I|§ò˜Ííë!"Ië}æʪyöOÍ |æ±g à *E|µÈ|§òÊÍí|æ±gå*Cë*Eå*80Í* ÍÑëÍë"C!"Eáà åÍD͸á@ ÍÙ:7Íç¢Ê }/o|æ/g:7ÆEÍà:7DÍà|«G:7ÍàD:7Ãà$’I$’I"$�’„!$ˆDH�"I’I’@H’I!I � BB@’‚I"H‰A$"’I$’I$’I$’I$‘ˆ€‰$‘$IH� I" $$ˆ�$ $’II $D’!’$$‰DDAD� @€@B‚I"�$ˆ�$ "A‚H6ÍYþ:Ê Ã!2 6Í=21 þ á:1 : Írë+s#rÍ=õÍ=_ÁHÍL"4 " >6 ͪµÂS* "6 Í=23 :1 =21 þÿÊvÍ=OÍý* #" ÃY8  Í�Ò‰* +"8 Í.!2 †þÊž¨ÍRÍ€Ã* "4 4 = Í�ÒÂÍý* #" ç¹ÍR*6 DMÍ+ÈÍR*8 DMÍ+×ÍR*: DMÍ+æÍR*< MÍÍàÉ!? q=  Í�ÒKÍdÿ*= ë! ͸Òp!@ 6>!@ ¾ÚX*= }O!< å*@ &€ Ñw*= #"= !@ 4Â)!< 4\ÍïþÊmaÍdÃ* }O!< :? wÉlÍR*4 DMÍ+{ÍR* DMÍ+ŠÍRÍæ 4 Í�Òß*4 }æþ¿Íæ= 4 Í�< NÍ*4 #"4  ÍÐÃ¥ÍàÍ;ÉÍà*4 DMÍ+:ÍÐ ÍÐÉÍY2A Ö0O> ¹Ú:A Ö0É:A ÖAO>¹Ò&–ÍRÍ€:A ÖAÆ ÉÍü‡‡‡‡õÍüÁH±ÉÍ.2B !2 †w:B É!D s+q*C &Í�:D ÍÉÃÃÃÍÉÉÉë_ë…oŒgÉ_{µoz´gÉ^#Vë) Â�É_{•ozœgÉi`N#F‘o˜gÉo&•oœgÉ_{–_z#žWëÉåååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå#foãÁ å!öÿ~#foãÁ å!~#fo##Áy–x#žÒB !N#FÅ!åÍ<ññ! åÍ<ñÍ¢!ôÿ>w‡Ÿ#w!ôÿå!øÿ~#foå!öÿ~#foãÁ Á • œò !~#fo##~#foå!ôÿ~#foãÁ å!ôÿ~#fo}æÿo|ægÁ}!~#fo##~#foå!ôÿ~#foãÁ ~O‡ŸGyæÿOxæG!ôÿ~#fo}æÿo|ægy½ÂÛ x¼Êf !~#fo##~#foå!ôÿ~#foãÁ å!ååÍ<ññ! åÍ<ñÍ¢Ãf !øÿN#FÅ!~#fo##N#FÅ!~#foN#FÅͬñññ!øÿy¾ÂD x#¾Êv !N#FÅ!;åÍ<ññ! åÍ<ñÍ¢Ãv !ôÿ~Æw#~ÎwÃM !ôÿ>w‡Ÿ#w!ôÿå!øÿÁ – #žò !òÿå!øÿ~#foå!ôÿÁy–Ox#žG>‘>˜ò½ ÃÏ !øÿN#F!ôÿy–Ox#žGáywx#w!ðÿå!òÿN#FÅ!åÍýáÁ}|!òÿ~#fo}æo|æg}´Ê !ðÿ~Æw#~Îwà !~#fo##~#foå!øÿ~#foãÁ å!öÿ~#foãÁ }æÿo|æg}´Ê !~#fo##~#foå!øÿ~#foãÁ å!öÿ~#foãÁ ÿ }æo|æÿgMDÃÍ!ðÿN#FÅ!îþå!~#foN#FÅͬñññ!ðÿy¾Âª x#¾ÊÉ !N#FÅ!;åÍ<ññ! åÍ<ñÍ¢!îþå!òÿN#FÅ!~#fo##~#foå!ôÿ~#foãÁ å!~#fo##N#FÅÍA ññññ!ôÿ~Æw#~ÎwÃ� !~#fo##~#foå!øÿ~#foãÁ å!öÿ~#foãÁ MDÃÍÍÆ!÷ÿ9ù!ùÿå!N#FÅ!åÍýáÁ}!~#¶Ê» !÷ÿ>€w>#w!÷ÿ~#¶Ê¾ !~#¶Ê¾ ! ~#fo~O‡ŸG!÷ÿy¦Ox#¦Gy°ÊÎ !~#foå!ùÿÁ †ÃÎ ÃÍ! ~Æw#~ÎwÃa !÷ÿ#~‡~w+~w!~Æw#~Îw!~Öw#~ÞwÃv ÍÆ!îÿ9å*ùÍù â Memory may be corrupted. Error reading %s. Next Load address: %h. Invalid CBIOS format in %s. Invalid load address %s. Can not open %s. Odd number of arguments. Usage: install [-string] file1.prl address1 [ file2.prl address2 ...] Install Revision %i.%i ÍÆ!ìÿ9ù!öÿ>w‡Ÿ#w!ôÿ>w‡Ÿ#w* å! åÍ * å! åÍê!åÍ<ñññ!~#fo##~#fo~þ-Âý!~#fo##~Æw#~Îw!ðÿ>€w>#w!~#fo##~#fo~·Ê!!ðÿN#FÅ!ðÿ~Æw#~Îwáå!~#fo##N#FÅ!~#fo##~Æw#~ÎwáÁ~!ðÿ~#fo6á>2€!~þÂ#~þÂ>!ÏåÍ<ñÍ¢Ã>!~Æw#~Îw!~Öw#~ÞwÃ!~#fo}æo|æg}´Â^!´åÍ<ñÍ¢!ìÿ ywx#w!øÿ>w‡Ÿ#w!øÿå!Á – #žòí!ìÿ~#foå!å!å!øÿ~#fo)å!~#foãÁ N#FÅÍzñññáywx#w+#~·òZ!øÿ~#fo)å!~#foãÁ N#FÅ!¡åÍ<ññÍ¢ÃZ!ìÿywx#w!øÿ>w‡Ÿ#w!øÿå!Á – #žò!øÿ~#fo)å!~#foãÁ N#FÅ!ìÿN#FÅÍHññ!ìÿ~Æw#~Îw!øÿ~Æw#~ÎwÃ!ìÿ~#fo##å!øÿ~#fo)##å!~#foãÁ N#FÅÍpñáywx#w+~#¶ÊÐ!ìÿ~#fo##å!öÿ~#fo~#foú Á • œÚÐ!ìÿ~#fo##~#fo}æÿo|æg}´Ê÷!øÿ~#fo)##å!~#foãÁ N#FÅ!†åÍ<ññÍ¢!ìÿ~Æw#ù!ôÿ>€w>#w!îÿå!îÿÁ}|!îÿ~Öw#~ÞwÍ©!îÿN#FÅ!îÿ~Öw#~Þwá6!öÿå!ôÿN#FÅ!ôÿ~Æw#~Îwá~O‡ŸGyæÿOxæGáywx#w!öÿ—–>#žò¶ !öÿ—–>#žòJ!ôÿ~#fo~þ ÂJ!öÿ~Öw#~Þw!ôÿ~Æw#~ÎwÃ~ !ôÿå!îÿÁ}|!ôÿ~Öw#~Þw!òÿå!îÿ~#fo#Á}|!òÿå!ôÿÁ – #žÒÄ!ñÿå!ôÿ~#foÁ~!ôÿ~#foå!òÿ~#foÁ~!òÿ~#foå!ñÿÁ~!ôÿ~Öw#~Þw!òÿ~Æw#~ÎwÃæ !öÿ—–>#žò¦!ôÿ~#fo~þ ʦÍ©!îÿ~#foå!ôÿ~#foÁ~!îÿ~Öw#~Þw!ôÿ~Æw#~Îw!öÿ~Öw#~ÞwÃJÍ©!îÿN#FÅ!îÿ~Öw#~Þwá6Ãq !òÿå!îÿÁ~#~!ôÿå!ìÿÁ}|!îÿ~Öw#~Þw!øÿ>w‡Ÿ#w!òÿå!ôÿÁ – #žÒV!ôÿ~#fo~·Â™Í©Í©!îÿ~#foå!ôÿ~#fo#Á}|!îÿ~Öw#~Þw!øÿ~Æw#~ÎwÙͩͩ!îÿ~#foå!òÿ~#fo#Á}|!øÿ~Æw#~Îw!îÿN#FÅ!øÿN#FÅÍ1ññÃÍ!ôÿ~Öw#~ÞwÃûá;éÍÆ!ôÿ9ù!öÿå!Á~#~!N#FÅ!¦åÍÉá} ~þ ÂäÿÿÃÍ!øÿå!N#FÅ!¦åÍÉá| Á}|!ôÿå!øÿ~#fo$ Á~#~!öÿ—–>#žòv!ôÿ~#¶Â›!øÿ~#fo& å!åÍ~ññ!øÿN#FÅ!åÍ~ññy°Ê!~#foå!öÿÁy–Ox#žGÃÍ!øÿ~#fo$ å!ôÿÁ~#~!~#foMDÃÍ!ôÿå!öÿÁ – #žú!öÿN#FÅ!N#FÅ!øÿ~#fo& å!€å!ôÿÁy–Ox#žGá åͤñññ!ôÿå!öÿÁ – #ž!öÿ>w‡Ÿ#Ã@ COPYRIGHT (C) 1978, DIGITAL RESEARCH ERROR: $, LOAD ADDRESS $DISK READ$INVERTED LOAD ADDRESS$DISK WRITE$LOAD ADDRESS $ERROR ADDRESS $BYTES READ:$INVALID HEX DIGIT$CHECK SUM ERROR $FIRST ADDRESS $LAST ADDRESS $BYTES READ $RECORDS WRITTEN $HEXCANNOT OPEN SOURCE$COMNO MORE DIRECTORY SPACE$CANNOT CLOSE FILE$*çùÉ!9"ç!e ù!" !" \Å!éÍ"÷ÅòÍ"éÍŠ: þÿƒûÍdÅeÍ"\ÍÏ\Íÿ\ÍŠ: þÿ²ÍdÃÉÍä\Í�: þÿÂÉ)ÍdÍàÍ;É! q* &ëÍfÉ ÍÐ ÍÐÉ! q> ! ¾Ò: ÆAÖ OÍÐÃ: Æ0OÍÐÉ! q: æøOÍë: æOÍëÉ! p+q* |OÍ* }OÍÉ! p+q* ë ÍfÉ! p+qÍà* DMÍBÉ! p+q)ÍR* DMÍB1ÍB* DMÍ+Í;É! p+q* ëÍi2 É! p+q* ëÍi2 É! p+q* ëÍi2 ÉÍi2 É!" p+q*! ëÍfÉ!$ p+q*# ëÍiÉ!& p+q*% ëÍiÉ!( p+q*' ëÍi2 É!* p+q*) ëÍfÉ!/ s+p+q+ÑÁp+qÕ:/ =2/ þÿÊX*+ å*- Á w*+ #"+ *- #"- Ã1É* #" ÿÍ–Úr*   ~É!" ÿ! ͸ÚÚ×€* " ÒxÃÚéÍß20 þº€Å*   DM€Í"Ã×:0 þÊÈAÍd*   6!ÿ" Ç!" : É!"6 "8 ": }2< !"4 "= ! ~Îw!øÿ~Æw#~ÎwÃu!òÿå!~#fo##N#FÅ! åÍHññáywx#w!ðÿ:w:#w!ðÿå*3 Á • œÒž!ðÿ~#fo~O‡ŸGyæÿOxæGyþÃÂvxþÊ !~#fo##N#FÅ!håÍ<ññ! åÍ<ñÍ¢à !ðÿ:w:#w!îÿå!ôÿ~#fo~#foýÿ Á}|!ðÿå*3 Á • œÒ!îÿN#FÅ!ðÿN#FÅÍ1ññ!ðÿ~Æw#~Îw!îÿ~Æw#~ÎwÃÆ!ðÿ~Æw#~ÎwÃC!òÿN#FÅ!OåÍ<ññÃÍÍÆ!ùÿ9ù!ùÿå!~#foÁ~!~#foå!~#foÁ~!~#foå!ùÿÁ~ÃÍÍÆõõõõ!øÿ>w‡Ÿ#w!~#fo~·Ê×!~#fo~þ0úä!~#fo>9¾úä!øÿå!~#fo~O‡ŸG!øÿ~#fo)))) Ðÿ Á}|ÃÏ!øÿ~#foMDÃÍ!~#fo~þAú!~#fo>Z¾ú!~#fo~O‡ŸG! MDÃ#!~#fo~O‡ŸGyÖaxÞúß!~#fo~þAú^!~#fo>Z¾ú^!~#fo~O‡ŸG! MDÃk!~#fo~O‡ŸG>f‘>˜úß!øÿå!~#fo~þAú«!~#fo>Z¾ú«!~#fo~O‡ŸG! MDø!~#fo~O‡ŸG!øÿ~#fo)))) ©ÿ Á}|!~Æw#~ÎwÂÃÍCan not write in location %h. Insufficient memory to read %s. Invalid PRL file format in %s. ÍÆ!îþ9ù!å!îþå!~#foN#FÅͬñññyþÂtxþÊ“!N#FÅ!;åÍ<ññ! åÍ<ñÍ¢!îþ~O‡ŸGyæÿOxæGyþý­xþÊÌ!N#FÅ!'åÍ<ññ! åÍ<ñÍ¢!øÿå!ïþÁ~#~!öÿå!òþÁ~#~!~#fo##~#foå!øÿ~/wÃ!ôÿ>€w>#wÛ!ôÿN#FÅ!N#FÅ!øÿ~#fo& å!€å!ôÿÁy–Ox#žGá åͤñññ!öÿå!ôÿÁ – #ž!å!ôÿÁ † #Ž!ôÿ>w‡Ÿ#wÃÍÆ!òÿ9ù!øÿ>w‡Ÿ#w!òÿ|ywx#w!øÿ~Ö#~ÞòÔ!òÿ~#fo#~þ ÂÚ!~#fo~þ Â÷!~Æw#~ÎwöÿÿÃÍ!øÿ~Æw#~Îw!òÿ~Ʀw#~ÎwÙ!~#fo~·Â ÿÿÃÍ!~#fo#~þ:Ây!òÿ~#foå!~#fo~þaúT!~#fo>z¾úT!~#fo~O‡ŸG!àÿ MDÃa!~#fo~O‡ŸG!¿ÿ Á}!~Æw#~ÎwÃ!òÿ~#fo6!öÿå!Á~#~!ôÿå!òÿ~#fo#Á}|!ôÿå!òÿ~#fo Á • œÒ!öÿ~#fo~·Ê«!öÿ~#fo~þ.ÂÆ!öÿ~Æw#~Îw!ôÿå!òÿ~#fo Á • œÒ§!ôÿN#FÅ!ôÿ~Æw#~Îwá6 Ãé!òÿ~#fo å!òÿ~#fo 6Á~!òÿ~#fo! å!òÿ~#fo" å!òÿ~#fo# 6Á~á w!òÿ~#fo$ >w‡Ÿ#w!òÿN#FÅ!åÍ~ññyþÿ—xþÿÂ/!òÿ~#fo#6 ÿÿÃÍ!ôÿN#FÅ!ôÿ~Æw#~Îwá6 ç!ôÿN#FÅ!ôÿ~Æw#~Îwáå!öÿ~#fo~þaú!öÿ~#fo>z¾ú!öÿ~#fo~O‡ŸG!àÿ MDÃ!öÿ~#fo~O‡ŸGáyw!öÿ~Æw#~Îwç!øÿ~#foMDÃÍÍÆ!÷ÿ9ù!øÿå!Á}|!÷ÿå!N#FÅ!~Æw#~ÎwáÁ~ ·Ê–!÷ÿ~þ%Ê™!÷ÿ~O‡ŸGÅ!åÍ~ññÃSÃÍ!÷ÿå!N#FÅ!~Æw#~ÎwáÁ~ O‡ŸG!¬ï!øÿ~#fo#~·ò!-å!åÍ~ññ!øÿ~#foå!øÿ~#fo~#fo>•o>œgÁ}| –usOh)oÂdÂi™ååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååre approximately 3.5K bytes, (see FILES below), so you should construct a 44K Cpm, and type install -C M26.prl B000 (B000 is 44K in hex.) If you don't know how to move your Cpm downward see your system manual. The required program is usually called "movcpm". To install the Disk Jockey as drives L and M in a 44K Cpm (with at least 48K of memory), type install dj.prl B000 djram.prl E400 Here, dj.prl contains the Disk Jockey 2D drivers, B000 is the top of the 44K Cpm (the dj drivers require 3.25K), djram.prl is updated controller firmware to be loaded into the controller ram, and E400 is the address of the controller ram. (If you have a non-standard controller, use the controller address + 400 hex.) To install both the m26 and the Disk Jockey, you could first install one and then install the other on top of it (at the printed "new load address"). This would require 6.75K of memory above Cpm. As a better a! å!øÿN#FÅ!øÿ~Æw#~ÎwáN#FÅÍññÃSÃS!å!øÿN#FÅ!øÿ~Æw#~ÎwáN#FÅÍññÃS!å!øÿN#FÅ!øÿ~Æw#~ÎwáN#FÅÍññÃS!øÿN#FÅ!øÿ~Æw#~ÎwáN#FÅͯñÃSÃÍ!÷ÿ~O‡ŸGÅ!åÍ~ññÃSÍÆ!~#fo~·ÊÝ!~#fo~þ Âà! å!åÍ~ññÃàÃÍ!N#FÅ!~Æw#~Îwá~O‡ŸGÅ!åÍ~ññòÍÆõõõõ!å!Á – #žÚB!N#FÅ!N#FÅ!N#FÅÍÑÍññ!øÿå!N#FÅ!N#FÅÍÝáÁ}| Ö  ÞÚ‰!øÿ~#foA öÿ å!åÍ~ññß!øÿ~#fo0 å!åÍ~ññÃÍÍÆ*ÈÍÌÃÍ#~#¶#ÊÄ~¹#®~¸Â®+++~#foéåÅÕ!9N#F#^#V!x±Êðx·GyOÒêë)ëÃÚÑMD!9q#pÃoåÅ!9~·ÊoúÍ3|‡|g}oÂÃ'/<Í3)Â"MD!9q#pÃoG! 9~#foÉåÅ!9~·Êoò/<à åÅ!9~·ÊoúÍ3|·g}oÂaÃ'!9N#F#q#pÁáñÉÕ!9N#F#^#VÍ"Êë"ÌÅá"ÎÑO·>ò¢/GÉÕ!9N#F#^#V#~#foëÍ»ÑÉz³È w#û!9ëãéëùÑÉáÁãÕÍTÑÁåÅÉáÁãÕÍTëÑÁåÅÉáÁã|§úx§úÕÍTÑÁåÅÉÍDx§úÕÍTÑÁÍDåÅÉÍLÃÍLÃ÷áÁã|§ú7x§üLÕÍTëÑÁåÅÉÍDÍ(áÍDãåÉ|/g}/o#Éx/Gy/OÉx/Gy/O>=ø)ëõ)ñÒk#å Òwë#ãáÃ`áëÃ` NAME install -- integrate new device drivers into Cpm, Revision 1.3. SYNOPSIS install -string newbios address [ prlfile2 address2 ... ] DESCRIPTION Install integrates new device drivers into an existing Cpm 2 system. "Newbios" is a skeletal Cpm bios module in prl format (see the prl document) containing the new drivers. Install first loads newbios at the given address (usually the top of Cpm), then patches it into the existing bios by exchanging the addresses of the 17 jump vectors that begin each bios. If additional prlfiles are given, they are loaded at the requested addresses with no patching. Finally, install prints (top of newbios) + (newbios buffer size, if any) + 1 as the "new load address". Additional drivers can now be installed at this address. The flagged argument (-string) is copied to 80H and left there for examination by the newely installed "Newbios", or a NULL if no flagged argument is present. The bios modules provilternative, there is a combined driver package that requires only 5K of memory. To use it, configure a 43K Cpm (assuming 48K of memory, or use available memory - 5K), and type install M26+dj.prl AC00 djram.prl E400 FILES The provided files are: install.com Install program. install.doc This document. prl.doc Prl file format. M26.prl M26 drivers, require 3.5K, default to drives N,O, and P. dj.prl Dj drivers, require 3.25K, default to drives L and M. djram.prl Dj ramware. Load at controller address + 400 hex. M26+dj.prl Combined m26 and dj drivers, require 5K, default to drives L and M for the Disk Jockey, and N,O and P for the M26. M26+dj.asm Assembler source for M26.prl, dj.prl, and djram.prl. Requires the Digital Research assembler "mac", or "asm" plus hand editing of the macros. djram.asm Assembler source. BUGS Addresses must be specified in 4-digit hex (with no lead ded here (see below) use this as an initial drive specification. i.e. -c specifies that the newely installed bios should respond to drives C on. The Cpm system must be "standard": its bios must begin with the jump table defined in the "Cpm 2.0 Alteration Guide", and it must store the address of this table at location 1 in memory. A "skeletal" bios module begins with the same jump table, but may leave some of the required functions unimplimemted. The corresponding jump vectors are left as jump selfs. EXAMPLES To install the m26 hard disk as drives C, D, and E in a 48K Cpm (assuming that you have memory above 48K), execute install -C M26.prl C000 Here, M26.prl is the "skeletal bios" (provided with install) containing the m26 drivers, and C000 (hex for 48K) is the top of Cpm. If you only have 48K of memory in your system, you will first have to move your Cpm downward to make room. At this writing, the m26 drivers requi0ing 0 and no trailing H). Install should also accept octal and X-notation. When the DJ drivers are first accessed, they locate the controller by searching memory for a certain pattern in the controller rom. The search is done carefully, but nevertheless might clobber somebody's memory-mapped io. install.doc 8/26/80 bdg  M26.prl M26 drivers, require 3.5K, default to drives N,O, and P. dj.prl Dj drivers, require 3.25K, default to drives L and M. djram.prl Dj ramware. Load at controller address + 400 hex. M26+dj.prl Combined m26 and dj drivers, require 5K, default to drives L and M for the Disk Jockey, and N,O and P for the M26. M26+dj.asm Assembler source for M26.prl, dj.prl, and djram.prl. Requires the Digital Research assembler "mac", or "asm" plus hand editing of the macros. djram.asm Assembler source. BUGS Addresses must be specified in 4-digit hex (with no lead ñññÄ!ß~Æw#~ÎwÃ\!Dÿå!å!"ÿN#FÅÍD ñññ!4ÿå!å! ÿN#FÅÍD ñññ!ß>w‡Ÿ#w!ß~Ö#~Þ ò€!ßå!ß~#foãÁ 6!ß~Æw#~ÎwÃP!å!ßå!ÿN#FÅÍzEñññyþÿ xþÿ«!³å; ñ!Òÿå!òÿå!ôÿå!"ÿN#FÅÍ]ññññyþÿÂÒxþÿÊ!Tÿå!Îÿå!Ðÿå! ÿN#FÅÍ]ññññyþÿÂüxþÿÂá!4ÿå!˜å; ññÃá! ß~Æw#~Îw!ß~Æw#~Îw!#X##N#FÅ+++N#FÅ!ÿN#FÅÍrñññ! ßN#FÅ!ßå!ßN#FÅ!ßN#FÅ!ßN#FÅ!ÿN#FÅÍ£! 9ù!"ÿN#FÅÍÜ=ñ! ÿN#FÅÍÜ=ñ!ÿN#FÅÍÜ=ñ!$ÿå!]åÍ×ññ!ß~#foå!ßÁy–Ox#žGÅ!>åÍ×ññ!ÿÿåÍÀñ!åÍúFñÃnV!ôÿå!ÐÿÁ ¾Âô #¾Êÿ!†å; ñ!Îÿ~#foå!òÿÁy–Ox#žGyþÂxþÊ(!på; ñ!ß>w‡Ÿ#w!ßå!ôÿÁ – #žò«!ßå!òÿ~#foå!ß~#foãÁ }æo|ægÁ}|!ÿ>€w>#w!ßN#FÅ!ß~Öw#~Þwá—•>œò´!ÿå!ÿ~#fo|‡|g}oÁ}|Ãx!ÿå!òÿ~#foå!ß~#foãÁ å!åÍ8QáÁ}|!ß~#fo)å!TÿãÁ ~#foå!ß~#fo)å!ÒÿãÁ Áy–Ox#žGyþÂxþÂ3!ßå!ÿ~#foãÁ å!ÿÁ ¶ÃV!ßå!ÿ~#foãÁ å!ÿ~#fo}/o|/gÁ ¥! ßå!ÿÁ – #žòy! ßå!ÿÁ~#~!ßå!òÿ~#foå!ß~#foãÁ Á • œòº!ßå!òÿ~#foå!ß~#foãÁ Á}|!X##N#FÅ+++N#FÅ!ÿN#FÅ!ß~#fo)å!ÒÿãÁ N#FÅ!òÿ~#foå!ß~#foãÁ åÍ!~#foå!Áy–Ox#žG! Á|‡Ÿ|} !å!+X##N#FÅ+++N#FÅ!N#FÅÍ„)ññññx·òT!‘å; ñ!å!úþå!N#FÅÍzEñññyþÿÂtxþÿÂ!~å; ñ!å!òþ##N#FÅ+++N#FÅ!N#FÅÍ„)ññññx·ò°!iå; ñ!N#FÅ! N#FÅ!N#FÅÍzEñññyþÿÂ×xþÿÂâ!Rå; ñÃnVCan't read in seg %iCan't write out seg %iÍgV!ôÿ9ù!±\~#¶Â_!øÿ>w‡Ÿ#w!øÿ~Ö#~Þòó!/Xå!øÿ~#foãÁ 6!øÿ~Æw#~ÎwÃ0!øÿå!~#fo}æo|æügå!åÍQPáÁ}|!öÿå!~#fo}æÿo|ægÁ}|!øÿå!/\Á ¾Â° #¾Ê=*/\å! ##N#FÅ+++N#FÅ!N#FÅÍZññññyþÿÂàxþÿÂr*/\å!ýå; ññÃr!øÿ>w‡Ÿ#w!øÿ~Ö€#~Þò0!øÿ~#fo)1\ >w‡Ÿ#w!øÿ~Æw#~ÎwÃþ>2±\‡Ÿ2²\Ã_!/Xå!öÿ~#foãÁ å!Á~!:³\–:´\#žò!!~#fo"³\Ã!!øÿ~#fo)1\ ~#¶ÊÊ!øÿN#FÅ! ##N#FÅ+++N#FÅ!N#FÅÍ'ññññyþÿ¶xþÿÂç!øÿN#FÅ!èå; ññ!øÿ~#fo"/\*/\)1\ >w‡Ÿ#wÃ=!ôÿ>w‡Ÿ#w!ôÿ~Ö#~ÞòÊ!/Xå!ôÿ~#foãÁ 6!ôÿ~Æw#~ÎwÃòÃnVÍgV!å!##N#FÅ+++N#FÅ! N#FÅ!N#FÅÍ�! 9ùÃnVÍgV!å!##N#FÅ+++N#FÅ! N#FÅ!N#FÅÍ�! 9ùÃnVÍgV!öÿ9ù!öÿå!N#FÅ!åÍ–QÁx‡Ÿ2P`2Q`x2S`y2R`!P`å!åÍÚQáÁ~#~#~#~!å!öÿ##N#FÅ+++N#FÅ!N#FÅÍ„)ññññx·òå 9ù!ß~Æw#~ÎwÃ3ÍgV!~#fo~·Êƒ !~#fo~þ.ÂÛ ! ~þÂ@ #~þÊ !~#fo~·Ê !N#FÅ!~Æw#~Îwáå!N#FÅ!~Æw#~ÎwáÁ~ÃC !N#FÅ!~Æw#~Îwá6.!~#fo~·Ê, !N#FÅ!~Æw#~Îwáå!N#FÅ!~Æw#~ÎwáÁ~Û !N#FÅ!~Æw#~Îwáå!N#FÅ!~Æw#~ÎwáÁ~à !~#fo6! ~þÂ& #~þʃ ÃnV!~#fo6ÃnVÍgV!å!N#FÅ!~Æw#~Îw!N#FÅÍ80ñññy°ÊŽ !~#foÿÿ ~þ ” !~#foÿÿ 6ÃnVÿÿÃnV!~#foÿÿ ~þ Â< !~Öw#~ÞwÃ< Error: ÍgV!¶ åÍ×ñ! N#FÅ!N#FÅ!N#FÅ!N#FÅÍ×ññññ!ÿÿåÍÀñ!ÿÿåÍúFñÃnVUsage: makeprl [-s hex-no] [-o output] hex-file1 [hex-file2]ÍgV! åÍ×ñ!ÿÿåÍÀñ!þÿåÍúFñÃnVÍgVõõõõ!~#fo~þ:Êy ÿÿÃnV!~#fo ~þ0Â� !~#fo ~þ0Ê£ ÿÿÃnV!å!N#FÅ!å!~#fo#åÍ(ññññyþÂÍ xþÊÖ ÿÿÃnV!å!N#FÅ!å!~#fo###åÍ(ññññyþ xþÊ ÿÿÃnV!øÿ>w‡Ÿ#w!øÿå!~#foÁ – #žò~ !å!øÿ~#fo)å! ~#foãÁ å!å!øÿ~#fo) å!~#foãÁ åÍ(ññññyþÂu xþÊ£ ÿÿÃnV!~#fo#~þ0³ !~#fo##~þ0³ ÃnV!øÿ~Æw#~Îwà ÃnVCan't rewind '%p'file '%p' not at correct start addressUnexpected lasÿÿÃnV! >w‡Ÿ#w+~#¶Ê1!å!/Xå!N#FÅÍzEñññÃnV!å!/Xå!N#FÅÍ80ñññÃnVCan't write out memoryFlush can't seekÍgV!ôÿ9ù!ôÿå*/\å!åÍ–QÁx‡Ÿ2P`2Q`x2S`y2R`!P`å!åÍÚQáÁ~#~#~#~*³\#"³\!å!ôÿ##N#FÅ+++N#FÅ!N#FÅÍ„)ññññx·òð!aå; ñ*³\}æÿo|ægå!/Xå!N#FÅÍzEñññyþÿÂxþÿÂ"!Jå; ñÃnVÍìOõõõõ!~#fo"d`!~#fo"``!~#fo"b`!øÿ>w‡Ÿ#w!òÿ:d`w:e`#w!ôÿ>w‡Ÿ#w!``—–>#žÒ‘*d`> ¾òË*d`~þòË!``—–>#žÒå*d`~þ-Ân!ôÿ>w‡Ÿ#w*d`#"d`:``Ö2``:a`Þ2a`Ãå:``Ö2``:a`Þ2a`*d`#"d`Ãs! ~þÂó#~þ‘:``Ö:a`ÞÚ‘*d`~þ0‘*d` ~þAú;*d` >Z¾ú;*d` ~O‡ŸG! MDÃG*d` ~O‡ŸGyþxÂPxþ‘*d`##"d`:``Ö2``:a`Þ2a`Ñ*d`~þ+Âå*d`#"d`:``Ö2``:a`Þ2a`Ãå!``—–>#žÒÉ*d`~þ0úC*d`>9¾úC!öÿå*d`~O‡ŸG!Ðÿ Á}|ÃX*b`å!ôÿ~#¶Êé!øÿN#F>‘O>˜GÃð!øÿN#Fáywx#w!``—–>#žÒÿ*d`~þAú%*d`>Z¾ú%*d`~O‡ŸG! MDÃ-*d`~O‡ŸGyþlÂ6xþÂÿ*d`#"d`Ãÿ*d`~þaú�*d`>z¾ò¯Ã�!øÿå!øÿN#FÅ! N#FÅÍ–Qáå!öÿ~#foãÁ Á}|:``Ö2``:a`Þ2a`*d`#"d`Ñ*d`~þAúÉ*d`>Z¾úÉ!öÿå*d`~þAú×*d`>Z¾ú×*d`~O‡ŸG! MDÃß*d`~O‡ŸG!©ÿ Á}|!öÿå! Á – #žúXÃÉ**ùÍ0ÅÍúF!9N#FÕ#^#V#~#foÍ"Xkb"Xi`"XÑO‡ŸGÉpos£Load size is %h hex bytes longOutput file is %p Addresses don't matchSizes don't matchUnexpected last line in %pCan't make room for headerCan't create '%p'prlhx1hx1hx0Bad option -%acprlMAKEPRL Version %i.%i ÍgV!ß9ù!øÿ>w‡Ÿ#w!öÿ>w‡Ÿ#w!ß>w‡Ÿ#w! ß>w‡Ÿ#w!ß>w‡Ÿ#w!ß>w‡Ÿ#w!ß>w‡Ÿ#w!~Æw#~Îw!~Öw#~Þw!öÿN#FÅ!øÿN#FÅ!åÍ×ñññ!~#¶Â±Í@ !~#fo~#fo~þ-Âô!ßå!~#foÁ~#~!ß~Æw#~Îw+~#fo~O‡ŸG!2Ã[U!~þÂ#~þʽ!~þÂ#~þʽÍ@ ý!å!ßå!å!~Æw#~Îw+~#foN#FÅÍ(ññññ!~Öw#~Þw!~Öw#~Þw!~Æw#~Îwñ!å!$ÿå!~Æw#~Îw+~#foN#FÅÍ ñññ!ß>w‡Ÿ#wÃF!ß~#fo~O‡ŸGÅ!ðå; ññÃF!å!ìå!Dÿå!~#foN#FÅÍ ññññ!~þÂë#~þÂ!å!èå!4ÿå!~#foN#FÅÍ ññññÃ3!å!äå!4ÿå!~#fo##N#FÅÍ ññññ!ß~þÂA#~þÊ„!ßå!~#fo~#foÁ~‡Ÿ!ß~#fo~·Êé!ß~#fo~þ.Â!ß~#fo6Ã\!"ÿå!DÿåÍûñáywx#w! ÿå!4ÿåÍûñáywx#w!ÿå!å!å!$ÿåÍ$ñññáywx#w+~þÿÂÕ#~þÿÂ!$ÿå!Îå; ññÃ!àå!$ÿå!~#foN#FÅÍt line in hex file '%p'File '%p' not in hex formatCan't read '%p'ÍgV!†ÿ9ù!ªÿå!N#FÅÍ9 ññyþÿÂg xþÿÂ{ !N#FÅ!4 å; ññ!¨ÿå!†ÿå!¦ÿå!¨ÿå!ªÿåÍ^ ññññáywx#w+~þÿ¬ #~þÿÂÀ !N#FÅ! å; ññ!¨ÿ~þÂÎ #~þÂâ !N#FÅ!ò å; ññ!¦ÿå!Á ¾Âõ  #¾Ê !N#FÅ!Ë å; ññ!å!'X##N#FÅ+++N#FÅ!N#FÅÍ„)ññññx·òB!N#FÅ!¹ å; ññÃnVBad line in hex fileÍgV!¨ÿ9ù!¨ÿå!N#FÅÍ9 ññyþÿ€xþÿ‰ÿÿÃnV!øÿå! N#FÅ!N#FÅ!N#FÅ!¨ÿåÍ^ ññññáywx#w+~þÿÂÃ#~þÿÂÎ!Hå; ñ!øÿ~þÂÜ#~þÂåÿÿÃnVÃnVCan't open '%p'ÍgVõõõõ!øÿå!å!å!N#FÅÍ�ñññáywx#w+~þÿÂ.#~þÿÂE!N#FÅ!ëå; ññÃnV!øÿ~#foMDÃnVCan't write out bitmapSeek error in wrheadCan't write headerCan't rewind fileÍgV!òþ9ù!øþ>w‡Ÿ#w!øþ~Ö#~Þòæ!úþå!øþ~#foãÁ 6!øþ~Æw#~Îwö!öþå!úþÁ}|!öþN#FÅ!öþ~Æw#~Îwá6ý!öþN#FÅ!öþ~Æw#~Îwáå!~#foå!Áy–Ox#žGyæÿOxæGáyw!öþN#FÅ!öþ~Æw#~Îwáå!~#foå!Áy–Ox#žGÅ!åÍ8Qá}æÿo|ægÁ}!öþN#FÅ!öþ~Æw#~Îwá6!öþN#FÅ!öþ~Æw#~Îwáå! ~#fo}æÿo|ægÁ}!öþN#FÅ!öþ~Æw#~Îwáå! N#FÅ!åÍ8Qá}æÿo|ægÁ}!òþå!1d`å!òÿÁy–Ox#žGÃP can't write can't read ÍìO!ùþ9ù!tÿå!óþÁ}|!€"``!öÿå*``å*``#"``áÁ~‡Ÿ!öÿ—–>#žò”!öÿ—–>#žò*``> ¾ò,*``~þúÃ,!øÿ>w‡Ÿ#w!vÿ/ywx#w!óþ"b`!tÿ:b`¾ÂÂ:c`#¾ÊÙ*b`~þ<Âø!åÍÜ=ñ!å!å*b` åÍ�ñññy°Ê~!å!!å*b` å!#å!åÍù! 9ù!åÍúFñÃ~!öÿ—–>#žúCÔ!öÿ~Öw#~Þw*``#"``Ãr!öÿ—–>#žò¾*``> ¾ò¾*``~þò¾!tÿN#FÅ!tÿ~Æw#~Îwáå*``~þAúœ*``>Z¾úœ*``~O‡ŸG! MDä*``~O‡ŸGáyw!öÿ~Öw#~Þw*``#"``ÃC!tÿN#FÅ!tÿ~Æw#~Îwá6Ãe!vÿå!øÿN#FÅÍññÃP*b`#"b`ò*b`~þ>ÂV!åÍÜ=ñ!å!å*b` åÍ$ñññyþÂ(xþÊ~!å!å*b` å!å!åÍù! 9ù!åÍúFñÃ~!øÿN#FÅ!øÿ~Æw#~Îwá)å!vÿãÁ :b`w:c`#w*b`~·Êî*b`#"b`Ã~ÍgV!N#FÅ!~#¶Ê«îÅ!N#FÅÍ›9ñññÃnVÍgV!N#FÅ!µ\åÍc,ññÃnVÍgV!å!N#FÅ!µ\å!#.åÍîññññÃnVÍìO!"d`*d`~#¶Ê8*d`N#FÅÍL)ñÅ*d`N#FÅ!N#FÅÍzEñññ*d`##"d`ÃÃPÍìO!~#fo"d`!~#fo"``!~#fo"b`*d`~þnÊq*d`~þN¢*d`#"d`*``å*b`N#FÅ*b`~Æw#~Îwá~#foÁ}|*d`MDÃP*``>w‡Ÿ#w*d`~þ0úš*d`>9¾úš*``å*d`~O‡ŸG*``~#foÅMD)) )Á Ðÿ Á}|*d`#"d`ìÍìO!Øÿ9ù!~#fo"d#w!øÿå!öÿN#FÅ!öÿ~#fo#å!åÿåÍû<ñññá~�w#~ˆw>2``‡Ÿ2a`!öÿ:``–:a`#žòˆ%!:``–:a`#žÒˆ%*d`å*d`#"d`áå!åÿå*``ãÁ Á~*``#"``!øÿ~Öw#~ÞwÃ6%!—–>#žÒ&*d`å*d`#"d`á6.>2b`‡Ÿ2c`!:b`–:c`#žÒE&*``å*b`ãÁ å!öÿÁy–x#žòE&*d`å*d`#"d`áå!åÿå*``ãÁ Á~*``#"``*b`#"b`í%*d`å*d`#"d`á6e!øÿ#~·òm&*d`å*d`#"d`á6-!øÿå!øÿ~#fo>•o>œgÁ}|Ã{&!:b`–:c`#žÒ&*d`å*d`#"d`á60*b`#"b`ÃE&*d`å*d`#"d`á6+*d`å*d`#"d`áå!øÿN#FÅ! åÍQPá0 Á}*d`å*d`#"d`áå!øÿN#FÅ! å͘Pá0 Á}*d`å!Áy–Ox#žGÃPÍìO!ëÿ9ù!~#fo"d`!~#fo"b`!å!F`å;Kò8'*b`å*b`#"b`á6-!å!åáP`~Õ#~Â$'Ñ!P`åÍÆNÍOñ!åÿ"``!øÿå!å! >+F+NÅ=ÂR'*``åÍ94! 9ùáywx#w!öÿå!øÿ~#foå*d`ãÁ Á}|!öÿ>–>#žò '!öÿ>w‡Ÿ#w!øÿå!öÿN#FÅ!å!åÿåÍû<ñññá~�w#~ˆw!å!øÿÁ – #žò(!øÿ~#foå!Áy–Ox#žG*`` "``!øÿå!Á~#~!øÿ—–>#žú;(*b`å*b`#"b`á60!d`—–>#žò—(*b`å*b`#"b`á6.×(!øÿ—–>#žò(*b`å*b`#"b`áå*``å!åÿÁy•OxœGyÖxÞÒ�(*``å*``#"``á~O‡ŸGÄ(0áyw!øÿ~Öw#~ÞwÃ;(!øÿ#~·òÛ(!d`—–>#žòÛ(*b`å*b`#"b`á60!øÿ~Æw#~Îw:d`Ö2d`:e`Þ2e`×(!d`—–>#žò9)*b`å*b`#"b`áå*``å!åÿÁy•OåÍ ññ*d`! å*d`+ ~O‡ŸGáyw*d`" å*d`, Á}|*d`" ~#foå*d`+ ~O‡ŸGá 6 *``å*d`" N#FÅ*d`" ~Æw#~ÎwáÁ~*d`! 5*b`~O‡ŸGyæOxæGy°ÂÄ1*``#"``!~Öw#~ÞwÃt0*``å!å!åÍ ññáywÃ{1ÃP*``~þ Êt0*``~·Êt0*``~þÊŸ0*``~þ Âû1*``å!Áy–Ox#žGÃP*``#"``!~Öw#~ÞwÃt0ÿÿÃP*``å!Áy–Ox#žGÃP!—–>#žòt0*d`! ~·Êt0*``å*d`" ~#foÁ~*b`~O‡ŸGyæOxæGy°Â¾2*``#"``!~Öw#~Þw*d`! 5*d`" ~Æw#~Îw*d`$ å>‡Ÿ2P`2Q`>2S`>2R`!P`åÍÚQñÃ+2*``~O‡ŸG!$0Ã[U*``å!Áy–Ox#žGÃPÃ2Ã2Ã2*b` ~O‡ŸGyþÿÂý2xþÿÂ3!åÍúFñ*``#"``!~Öw#~ÞwÃ2ÍìO!~#fo"d`*d`"b`!#~·òs3!—–>#žús3!å!~#fo>•o>œgÁ}|*b`å*b`#"b`á6-!~#fo}æÿo|æÿg"``!~#¶Âž3!> w‡Ÿ#wÃÃ3!#~·òÃ3!å!~#fo>•o>œgÁ}|!:``–:a`#žÚû3!N#FÅ*``å!N#FÅÍÞP*b`åÍ3ñññ*b` "b`*b`å*``å!N#FÅÍùPá0 Á}*b`>9¾ò&4*b`~Æ'w*b`å!d`Áy–Ox#žGÃPÍìO!öÿ9ù!~#fo"d`>2``‡Ÿ2a`!#~·ò‡4!å!åáP`~Õ#~Âs4Ñ!P`åÍÆNÍOñ!å!`å;Kú5*N`ÿÿ "b`!b`—–>#žòÊ5!å*b`)))` å;Kú6!å!åáP`~Õ#~ÂÕ4Ñ!P`å*b`)))` åÍ@LÍOñ*``å!å*b``*d`"b`*b`~·Ê/*b`~þ%Ê/*b`#"b`Ã*b` "d`Ã!b`:d`–:e`#žÒh*b`å!d`Áy–Ox#žGÅ*d`å!N#FÅ!~#foÍmVñññ*b`å*b`#"b`á~·Â|ÃP!øÿ>w‡Ÿ#w!Õÿ6 *b`~þ-½!øÿ>w‡Ÿ#w!Õÿå*b`#"b`*b`Á~*b`#"b`Ãß*b`~þ+Âß!Õÿå*b`#"b`*b`Á~*b`#"b`! å!òÿå*b`åÍ;ñññi`"b`!ôÿ>w‡Ÿ#w*b`~þ.Â)! å!ôÿå*b` åÍ;ñññi`"b`*b`~þaÊM*b`~þhÊM*b`~þoÊM*b`~þuÂx!Ôÿå*b`å*b`#"b`áÁ~!Ôÿ~þhÂ�>2``‡Ÿ2a`õ!Ôÿ6Ãa!Ôÿ~þo˜>2``‡Ÿ2a`õ!Ôÿ~þu¯> 2``‡Ÿ2a`õ!öÿ"``*b`~þxÂÌ!öÿ>w‡Ÿ#wÃU*b`~þb¡!Òÿå! N#FÅ! ~Æw#~ÎwáÁ~#~!öÿå! N#FÅ! ~Æw#~Îwá~#foÁ}|!ôÿ~#¶ÊU!öÿå!öÿå!ôÿÁ – #žòH!öÿN#FÃO!ôÿN#Fáywx#w!øÿ~#¶ÊŸ#!öÿå!òÿÁ – #žòŸ#!å!Õÿå!N#FÅ!~#foÍmVñññ!òÿ~Öw#~ÞwÃ_*b`~þpÂ# !Òÿå! ~#foÁ~#~!öÿå! N#FÅ! ~Æw#~ÎwáN#FÅÍL)ñáywx#w!ôÿ~#¶ÊU!öÿå!öÿå!ôÿÁ – #žò !öÿN#Fà !ôÿN#Fáywx#wÃU*b`~þl› !Ôÿ~þaÂ!!îÿå! ~#foÁ~#~#~#~!öÿ>w‡Ÿ#w!öÿ~Öw#~Þw+#~·ún!!Öÿå!öÿ~#foãÁ å!îÿÁ##~!îÿå!åÍ$TñÃ] *b`~þf¢!!Òÿå!ÖÿÁ}|!öÿå!ôÿN#FÅ!å!ôÿÁy–Ox#žGÅ! ~#fo >+F+NÅ=Âß !ÖÿåÍÖ&!9ùáywx#w! åxœGyÖxÞÒ )*``å*``#"``á~O‡ŸGÃ#)0áyw:d`Ö2d`:e`Þ2e`ÃÛ(*b`å!Áy–Ox#žGÃPÍìO!~#fo"d`*d`"``*``~·Êr)*``#"``Ã`)*``å!d`Áy–Ox#žGÃPÍìOõ!N#FÅÍ´Fñi`"b`!b`~#¶Ê®)*b` ~·ò´)ÿÿÃP*b` ~#fo"``! ~#¶Âê)*``$ å!Á~#~#~#~á*! ~þÂø)#~þÂ**``$ å!åÍÚQñá*>2d`‡Ÿ2e`!å*d`å*b`åÍfJñññx·úT*!øÿå*`` Á~‡Ÿ*d`}Æ€o|Îg"d`Ã**``$ å*d`å!øÿ~#foãÁ MDx‡Ÿ2P`2Q`x2S`y2R`!P`å!åÍîS!åÍÚQáÁ~#~#~#~!~#foMDÃPÍìOõõ!~#fo"d`*d`"``!#~·ò+! —–>#žú+!å!åáP`~#~#~#~!P`åÍ•TáÁ~#~#~#~*``å*``#"``á6-! ~#¶Â4+! > w‡Ÿ#wÃY+! #~·òY+! å! ~#fo>•o>œgÁ}|!öÿå! Á#~‡Ÿ~+~ !#~·úŒ+!å!öÿåÍRúÕ+! N#FÅ!P`~#~#~#~!P`å!öÿåͨSá##N#FÅ+++N#FÅ*``åÍ®*ññññ*`` "``*``å!P`~#~#~#~!P`å!öÿåÍæS>02Z`‡Ÿ2[`2Y`2X`!X`åÍÚQáÁ##~*``>9¾ò',*``~Æ'w*``å!d`Áy–Ox#žGÃPwrite error write error bad putc call ÍìO!~#fo"d`!~#fo"``!d`~#¶ÂŸ,!å!T,å!åÍzEñññ!åÍúFñ:a`·úå,*d` ~Ö#~Þòý,*d` N#FÅ*d` ~Æw#~Îwáå*d` ãÁ :``wÃg-*d` —–>#žú“-*``MDÃP*d`ÿÿ åÍQáãÁ "``Ã6>2b`‡Ÿ2c`!:b`–:c`#žÒÝ6!~#¶ÊÝ6!ðÿå!åáP`~Õ#~ÂH5Ñ!P`å!`åͦMÍOñ!øÿå!ðÿåÍ­Oñ!å!ðÿåáP`~Õ#~Â�5Ñ!P`å!X`å!øÿN#FÅÍ UÍÛNÍOñ*d`å*d`#"d`áå!øÿ~#fo0 Á}*b`#"b`Ã5!å!`å;Kú!6!å!åáP`~Õ#~Âì5Ñ!P`å!`åÍ@LÍOñ*``#"``Ã5:b`Ö2b`:c`Þ2c`à4!åáP`~Õ#~Â/6Ñ!P`å!`åͦM!`å;Kò5*N`ÿÿ "b`!b`—–>#žò5!ðÿå*b`)))` åáP`~Õ#~Â|6Ñ!P`å!åͦMÍO!`å;KòÊ6!å!ðÿåÍOñ!å*b`ÿÿ åÍQá:``•2``:a`œ2a`:b`Ö2b`:c`Þ2c`ÃW6!:b`–:c`#žÒ7*d`å*d`#"d`á60*b`#"b`ÃÝ6*``MDÃPPONMLKJIHGFEDCBACONRDRPUNLSTÍìO>2d`‡Ÿ2e`!"_:d`–:e`#žÒk7*d`åÍÜ=ñ*d`#"d`ÃJ7:¿^O‡ŸGÅ!åÍ ññ*½^MDÃPÍìOõ!~#fo"d`!øÿÀ^ywx#w!øÿ~#fo~#¶Êè7*d`"b`!øÿ~#fo~#fo"``*b`å*``Á ¾Âþ7*``~·Êþ7*b`#"b`*``#"``ÃÂ7ÃP!øÿ~Æw#~Îwß7*b`å*``Á ¾Âî7!øÿ~#fo##~O‡ŸGÃPÍìO!~#fo"d`!~#fo"``>2b`‡Ÿ2c`*``~þ.Ê®8*``~·Ê®8:b`Ö:c`Þò¤8*b`å*b`#"b`áå*d` ãÁ å*``~þaú™8*``>z¾ú™8*``~O‡ŸG!àÿ MDá8*``~O‡ŸGáyw*``#"``Ã@8:b`Ö:c`Þò×8*b`å*b`#"b`áå*d` ãÁ 6 î8*``~þ.Âê8*``#"``Ãø8*``~·Êø8ÃP>2b`‡Ÿ2! ~#fo Á}|ÃU!Òÿå!ÖÿÁ}|!öÿå*``å! ~#fo##N#FÅ+++N#FÅ!ÖÿåÍ®*ññññáywx#w! å! ~#fo####Á}|ÃU!Òÿå!ÖÿÁ}|!öÿ>w‡Ÿ#w! å! ~#fo####Á}|ÃU*b`~þdÂ#"!Òÿå!ÖÿÁ}|!öÿå!ôÿ>–>#žòÓ!ÃÚ!!ôÿN#FÅ!å! ~#fo >+F+NÅ=Âí!!ÖÿåÍ>$!9ùáywx#w! å! ~#fo Á}|ÃU*b`~þcÊG"*b`~þsÊG"*b`~þiÊG"!Ôÿ~·Ê‰"!Ôÿ~þa¤"!Òÿå! N#FÅ! ~Æw#~ÎwáÁ}|*b`~þcÂë"!öÿ>w‡Ÿ#wÃq#!Òÿ:b`w:c`#w!öÿ>w‡Ÿ#wÃU!öÿå! N#FÅ! ~Æw#~ÎwáÁ~#~*b`~þcÂ@#!``—–>#žò@#!öÿ~æÿw#~æwÃ@#!öÿå!Òÿ~#foÁ~#~!Öÿå!öÿN#FÅ!åÍ8QáÁ}!×ÿå!öÿÁ~!Òÿå!ÖÿÁ}|!öÿ>w‡Ÿ#wÃq#!Òÿå!ÖÿÁ}|!öÿå*``å!öÿN#FÅ!ÖÿåÍ3ñññáywx#w*b`~þcÊU*b`~þsÊU*b`~þiÊU:b`Ö2b`:c`Þ2c`ÃU!öÿ—–>#žòÒ#!öÿN#FÅ!ÒÿN#FÅ!N#FÅ!~#foÍmVñññ!øÿ~#¶Â"!öÿå!òÿÁ – #žò"!å!Õÿå!N#FÅ!~#foÍmVñññ!òÿ~Öw#~ÞwÃÜ#ÍgV!N#FÅ!å!N#FÅÍ›9ñññÃnVÍìO!ëÿ9ù!~#fo"d`!å!F`å;Kò•$!å!åáP`~Õ#~Âs$Ñ!P`åÍÆNÍOñ*d`å*d`#"d`á6-!öÿå!~#foå!~#foãÁ Á}|!öÿ>–>#žòÍ$!öÿ>w‡Ÿ#w!øÿå!öÿ~#fo#å! >+F+NÅ=Âæ$!åÿåÍ94! 9ùáywx N#FÅ*d` å*d`N#FÅÍzEñññÅ*d` Áy¾Â.-x#¾ÊN-! å!G,å!åÍzEñññ!åÍúFñÃg-*d` >w‡Ÿ#w*d` :``w:``þ Ât-:a`þ‹-*d` ~þÿˆ-#~þÿÂå,*``MDÃP*d` N#FÅ*d` å*d`N#FÅÍzEñññÅ*d` Áy¾ÂÄ-x#¾Êä-! å!:,å!åÍzEñññ!åÍúFñÃP*d` >w‡Ÿ#w*``MDÃPwrite error write error bad putl call ÍìOõ!~#fo"d`!~#fo"``!d`~#¶Âc.!å!.å!åÍzEñññ!åÍúFñÃP!~#fo"b`!b`—–>#žò/!øÿå*d` å*d` ~#foãÁ Á}|!b`—–>#žò�/*d` ~Ö#~Þò�/!øÿN#FÅ!øÿ~Æw#~Îwáå*``å*``#"``áÁ~:b`Ö2b`:c`Þ2c`*d` ~Æw#~ÎwÛ.*d` ~þÿÂ/#~þÿÊî/*d` ~#¶Êî/*d` ~#foå*d` ãÁ ~þ Âî/*d` N#FÅ*d` å*d`N#FÅÍzEñññÅ*d` Áy¾Âo/x#¾Êû/! å!ú-å!åÍzEñññ!åÍúFñÃî/!b`—–>#žòn.!å*d` å*d`N#FÅÍzEñññyþ½/xþÊÝ/! å!.å!åÍzEñññ!åÍúFñÃn.*d` >w‡Ÿ#wÃn.!~#foMDÃP*d` >w‡Ÿ#wÃî/§1þÿÅ0ÿÿ¾122ÿÿ+2è2â2 ß2Ì23ÍìO!N#FÅÍ´Fñi`"b`!b`~#¶Â[0ÿÿÃP*b` ~#fo"d`!~#fo"``!—–>#žòŸ0*b` ~·ò²0*b` ~O‡ŸG! 0Ã[U*``å!Áy–Ox#žGÃP!å*b`åÍVGññ!0Ã[U!d`~#¶ÂÔ0ÃP*d`! ~·ÂP1*d`* 6}*d`* å! åÍ ññ! å!2c`*``~·Êg9:b`Ö:c`Þòg9*b`å*b`#"b`áå*d` ãÁ å*``~þaúR9*``>z¾úR9*``~O‡ŸG!àÿ MDÃZ9*``~O‡ŸGáyw*``#"``Ã9:b`Ö:c`Þò�9*b`å*b`#"b`áå*d` ãÁ 6 Ãg9*``~O‡ŸGÃPÍìO!ôÿ9ù!~#fo"d`:¿^þÂÇ9!å!åÍ ññy2¿^!öÿ>w‡Ÿ#w!öÿå!"_Á – #žÒ÷9!öÿ~#fo))Î_ ~·Â:!öÿå!"_Á – #žÚ:ÿÿÃP!öÿ~Æw#~ÎwÃÒ9!øÿå!öÿ~#fo))Î_ Á}|!øÿ~#fo6!!~#¶ÂX:!øÿ~#fo~öw!øÿ~#fo##>w‡Ÿ#w!îÿ:d`w:e`#w>2``‡Ÿ2a`*d`~þ:Êä:*d`~·Êä::``Ö:a`Þò;*``å*``#"``áå!ñÿãÁ å*d`~þaúÖ:*d`>z¾úÖ:*d`~O‡ŸG!àÿ MDÃÞ:*d`~O‡ŸGáywÃ;!ñÿå*``ãÁ 6*d`~þ:Ê;!îÿ~#fo"d`!øÿ~#fo#:¿^wÃT;*d`#"d`À:!øÿ~#fo#å!ñÿåÍ„7ñáyw~þÂM;!öÿN#FÅÍÜ=ñÿÿÃP*d`#"d`!øÿ~#fo#~·ò�;!øÿ~#fo#~O‡ŸGyþÿÂy;xþÿÂè;!~þŠ;#~þÂè;!å!ªåÍ‘?ññi`"b`!øÿ~#fo##:b`w:c`#w!ªå*b`åÍ|Kññ*b`( >ÿw>ÿ#w!øÿ~#fo#~·òõ;!öÿ~#foMDÃP!öÿ~#foMDÃP*d`å*b`åÍ8ññy°Ê‡Ÿ2P`2Q`>2S`>2R`!P`åÍÚQñ!~Öw#~Þw*``! 5þD*d`~O‡ŸGyæOxæGy°ÊmE*``! ~·ÊmE*``" ~#fo6*d`~öwÿC ÍìO!N#FÅÍ´Fñi`"b`!b`~#¶Â�EÿÿÃP*b`~O‡ŸGyæOxæGy°ÂÏE!N#FÅ!N#FÅ*b`åͦCñññÃP!~#fo"d`!—–>#žòF*d`"``!—–>#žò-F*d`~þ Ê-F*d`#"d`!~Öw#~ÞwÃíE*d`å!Áy–Ox#žGÃP*d`å!``Áy–Ox#žGÅ*``å*b`åͦCñññÅ*d`å!``Áy–Ox#žGá}¹ÂcF|¸ÊlFÿÿÃP!—–>#žòÚE!å!wEå*b`åͦCñññyþ”FxþÊ�FÿÿÃP*d`#"d`!~Öw#~ÞwÃÚEÍìO!~#fo"d`:e`·úæF!"_:d`–:e`#žÒæF*d`))Î_ ~·ÂìFÃP*d`))Î_ MDÃPÍgV!_~#¶Ê%G!.G:_½ÂG:_¼Ê%G*_ÍmVi`"_ÃýF* _ÍmVÃ%GÍìO*_"d`!~#fo"_*d`MDÃP8I2IIIÍìOõ!~#fo"d`*d` ~#fo"``!øÿå*``$ åáP`~#~#~#~!P`å!åÍ$TáÁ##~#~*``$ ##N#Fi`}æo|æg"b`*``! å!€å!b`Áy–Ox#žGáyw*``" å*``* å*b`ãÁ Á}|!~#¶ÂH!øÿå*``( Á ¾ÂH #¾ÂHÃP!å*d`åÍRIññx·úPH!N#FÅ!øÿN#FÅ*d`åÍfJñññx·òVHÿÿÃP*`` ~O‡ŸGÅ*`` ~O‡ŸGyæÿOxæGá}‘|˜ú…HÈHi`"b`!øÿå*``( Á ¾Â£H #¾Â®H*b`MDÃP*``( å!øÿÁ~#~!b`~#¶ÊáH!€å*``* åÍ|KññÃP*d` ~O‡ŸGÅ!åÍ ññ*``* å!N#FÍPñÁñ! 9q#pÑÃãWåÅ!9~·ò$Q/<ÃHQÊãWO!9~#fo) Â0QÊQåÅ!9~·òHQ/<Ã$QÊãWO!9~#fo|‡|g}o ÂTQÊQåÅ!9~·òsQ/<Ã$QÊãWO!9~#fo|·g}o ÂQMD!9q#pÃãWåÅ!å! 9~+¶ÊÏQ~ÒµQ! 9N#Fá å! 9~‡w#~�w! 9~·w+~wÜQÁ!9q#pÃãWåÅ!9N#F!9~#fo ##† #Ž +++Ž #ŽÃãWåÅ!9N#F!9~#fo ##– #ž +++ž #žÃËW!9MD!9~#~#~#~— ø!9~‡w#~�w#~�w#~�w#~�w#~�w#~�w#~�w!9MD! 9 – #ž #ž #žÚUR!9MD! 9 – #ž #ž #ž!94ÃURãÅÕë!ðÿ9ùëé!9ùÑÃãW#~#~+++~#~É#~·òÏR—#–>#ž>+++ž>#žÉ~#~#~ #~É{æÊS—–>#ž>#ž >#žÉ͹R!9MD!9~#foÍáR! 9MD!9~#foÍáRÍ2R!9N#F!9ÍSÃÆR͹R!9MD!9~#foÍáR! 9MD!9~#foÍáRÍ2R!9N#F!9ÍSÃÆR͹R! 9MD!9~#fo#ÍÏR!9MD!9~#fo#ÍÏRÍ2R!9N#Fkb9ÍSÃÆR͹RíSåÅ!9~·òþS/<Ã4TÊãWO!9~#fo##~‡w#~�w+++~�w#~�w  TÃãWåÅ!9~·ò4T/<ÃþSÊãWO!9~#fo##+~‡~w+~w###~w+~w ÂBTÃãWåÅ!9~·òmT/<ÃþSÊãWO!9~#fo##+~·w+~w###~w+~w Â{TÃãWå!9~#fo—##–w>#žw>+++žw>#žwáÉãÅÕMD!9ë!÷ÿ9ùÅ!N#F!÷ÿ>w#w#w#É#w#w!¨å!÷ÿåÍrVññ! N#F !öÿÕ#~~#fo"d`!#~·ú€=!å!Á – #žò€=*d`å!~#foãÁ ~þ5ú€=!~#foÿÿ "``:a`·ú†=*d`å*``ãÁ ~þ9ÂÈ=*d`å*``ãÁ 60:``Ö2``:a`Þ2a`ÃJ=ÃP:a`·ò€=*d`61!~#fo"``!``—–>#žòÖ=*d`å*``ãÁ 60:``Ö2``:a`Þ2a`Ã�=*d`å*``ãÁ 4Æ=ÃPÍìO!N#FÅÍ´Fñi`"d`!d`~#¶Âÿ=ÿÿÃP*d` ~#¶ÊŒ>*d`~O‡ŸGyæOxæGy°ÂŒ>!å*d`åÍRIññ*d`~O‡ŸGyæ OxæGy°Êj>*d` ~#fo ~æw*d` N#FÅ!åÍ ññ*d` å!å*d` N#FÅÍêAññáywx#w*d`6!~#foMDÃPÍìO!~#fo"d`!~#fo"``*d`å*``ãÁ "b`*b`å*d`~#foå!``Áy–Ox#žGáywx#w*b` å*d` Á~#~*d`å*``üÿ Á}|*b`MDÃPÍìO!~#fo"d`*d` ~#fo"``*d`å*d`~#foãÁ ####å!``Áy¾ÂK?x#¾Â{?*d`å*``~#fo####Á … Œ*d` å*`` Á~#~ÃPout of heap space ÍìO!N#FÅ!N#FÅÍÜ?ññi`"d`!d`~#¶Ê¿?*d`MDÃP!å!~?å!åÍzEñññ!åÍúFñÃPÍìOõõ!~#fo"d`:d`Ö:e`ÞÒÿ?Ã@*d`MDi`#}æþo|æÿg##"d`!_"``*``~#fo"b`!b`~#¶Êk@*b`~#fo####å!d`Áy–x#žÚ�@*b`å!d`Á – #žÒš@*``å*b` Á~#~ñ@:_þÂx@:_þÊÐ@:_·2_:_2_ÃÐ@*b` "``Ã@*``å*d`å*b`åÍž>ññáywx#w*b` å!Á~#~*b` MDÃP!øÿ>w‡Ÿ#w!d`:_–:_#žÚ$A!øÿå!öÿ:_w:_#w+N#FåÍ ññ*``å!åÍ ññi`"b`!€å!åÍ ññ*b`MD!JGÃ[UÃP!€å*``* åÍ|KññÃPÃPÍìO!~#fo"d`*d` ~#fo"``*d`~O‡ŸGyæOxæGy°Ê®I!å*``( N#FÅ*d`åÍfJñññyþÿÂ¥IxþÿÂúIÿÿÃP!~#¶Ê`J*d`~O‡ŸGyæOxæGy°Ê`J*d` ~O‡ŸGÅ!åÍ ññ*``å!åÍ ññ*d`~æÏwÃ`J*d` ~O‡ŸGÅ!åÍ ññ*``* å!åÍ ññ*``å!åÍ ññi`"b`!€å!åÍ ññ!b`~#¶ÊOJÿÿÃP*d`~æýw*d`~öwîIÃPÍìO!~#fo"d`*d` ~#fo"b`!N#FÅ!åÍ8Qá"``*b` ~O‡ŸG:``¹Â¬J:a`¸ÂÄJ*d`~O‡ŸGyæ OxæGy°Â[K*d` ~O‡ŸGÅ!åÍ ññ*d`~O‡ŸGyæOxæGy°ÊK*b`å!åÍ ññx·òKÿÿÃP*d`~æÏw*b` :``w*b`å!åÍ ññx·òTK!~#¶ÂTK*b`å!åÍ ññx·òTK*d`~öwÿÿÃP*d`~ö w*b` å!~#fo}æo|ægÁ}ÃPÍìO!~#fo"d`!~#fo"``:``Ö2``:a`Þ2a`:a`·ú»K*d`6*d`#"d`ÕKÃPåÅÕ! 9~#foN#Fx·òØK—‘O>€˜G!9~#fo^#Vz·òïK—“_>€šWxÆ€GzÆ€Wy“oxšÚLµÊ L>Ã5L>ÿÃ5L! 9N#F!9~#fo# ##¾Â:L +¾Â:L L—чÃËWÚLÃLåÅÕ!9ë!áÿ9ù!ëÿ6!N#FÅ!÷ÿåÍ]Wññy°ÂŠL! N#F ö>ÿ àM!ÿÿ~·òªL!÷ÿÕ·>#žw›LÑ!ëÿ4!ìÿq#p! N#F ·òÆLæ!ëÿ4 Å!îÿåÍ]Wññy°Ê My!ìÿ–Ox#žGyÆ€+wxÎ#w— !àÿ#w ÂóL!êÿ69!ÂûTÑëùÑÃãWͶTq#px‡Ÿ#w#wÃÚTͶTq#p—#w#wÃÚTͶT w #w #w #w‡ŸÃÚTͶT w #w #w #w—ÃÚT~#¶ÂgU#~#foéy#¾Â{Ux#¾Â|U+++~#foé##Ã[UåÅÕ!9ë!ìÿ9ù!N#FÅ!÷ÿåÍ]Wññy°ÊaV!ìÿq#p! N#FÅ!îÿåÍ]Wññy°ÂÌU!N#FÃKV!ìÿy–Ox#žGúîUy°ÊV+~�w#~ˆw!ÿÿÃùU—‘O>˜G!öÿÕ ~‡#+~wÂÿUÒ Vöw y°ÊVÃúUÑ!öÿMD!íÿÕ · #ŽwÂ)VÑ!ìÿN#FÅ!îÿåÍrVññ!îÿMD ! ~#fo+Õ #wÂXVÑëùÑÃãW!9ëãéëùÑÉÕ!9N#F! ~·ò˜Vi`+ ·>#žw‹VæV+¶Â¦VšVÃ[W! ~·ÊËV# ·+~w³V!9~Æw#~ÎwæV! ~·úòVi`+ ·#~�wÂÚV!9~Öw#~ÞwÃËV ·ò W—i`7#~ÎwÂþVæV!9~·ò"Wi`+—#wÂWÃ[WÊ5Wi`>ÿ#wÂ+W>²w! å!9z‡~áw+~ w++~ wÂOWÑÉÕ!å!9N#F!9^#V! ëÅ#~#~ ÂyWÁ—! ~#~WÒšWã+ã·Â©W WÃÅW>w+~ö€wã}·ÊÅWi`·>#žw¼WJñÑÉõ!9N#F###q#pÁ+++qÁáññÉ!9N#F#q#pÁáñÉcopyright (c) 1979 by Whitesmiths, Ltd.ÅÍ5Cñáywx#w+~#¶Â$A:_·2_:_2_ÃÛ@!øÿ~#¶ÂOA!øÿå!öÿ:d`w:e`#w+N#FÅÍ5Cñáywx#w!øÿ~#¶Â_AÃP!øÿ~#foå!öÿ~#foüÿ Á}|!_~#¶ÂŽA!øÿ~#fo"_!øÿ~#foå!öÿ~#foãÁ :_•:_œÒÄA!øÿ~#foå!öÿ~#foãÁ "_!å!øÿ~#fo##åÍêAññÃ@bad free call ÍìO!~#foþÿ "d`!~#¶Ê>B!_:d`–:e`#žÚ$B!_:d`–:e`#žÚKB!å!ÛAå!åÍzEñññ!åÍúFñ!~#foMDÃP!_~#¶ÂkB*d` >w‡Ÿ#w*d`"_Ã>B!_:d`–:e`#žÒ›B*d` :_w:_#w*d`"_*d`åÍ?ñÃ>B*_"``*`` ~#fo"b`!b`~#¶ÊÐB!d`:b`–:c`#žÒÐB*b`"``áB!b`~#¶Ê C*d` :b`w:c`#w*`` :d`w:e`#w*d`åÍ?ñ*``åÍ?ñÃ>B*d` >w‡Ÿ#w*`` :d`w:e`#w*``åÍ?ñÃ>BÍgVõõõõ!øÿ:_w:_#w*_å!~#foãÁ "_!øÿ:_•:_œÒxC!f`:_•:_œÒ‰C!øÿ~#fo"_ÃnV!øÿ~#foMDÃnVœDüÿ‡Dýÿ^Dÿÿ±DÍìO!~#fo"d`!~#fo"b`!—–>#žòD! åÍ ñyæOxæGy°ÊD!åÍ ñyþÂòCxþÂD!åÍúFñÃD*b`å!Áy–Ox#žGÃP*d` ~·ò1D*d` ~O‡ŸG!–CÃ[U*d` ~#fo"``!å*d`åÍVGññyþÿÂUDxþÿ¾DÿÿÃP*b`~O‡ŸGÅ!åÍ ññ!~Öw#~Þw*b`#"b`ÿC*b`~O‡ŸGÅ!åÍ ññÃpD*b`~O‡ŸGÅ!åÍ ññÃpD!~#foMDÃP!—–>#žò?E*``! ~·Ê?E*``" N#FÅ*``" ~Æw#~Îwáå*b`å*b`#"b`ááÿ·#~w ÂM!÷ÿMD!Õ +¾Â&MÂMÑÚGM!íÿMD!öÿÕ · #žÂ8MÑ!âÿ4! ·+~w ÂNM!êÿ5ÂÿL!ìÿN#FÅ!áÿåÍrVññ!ëÿ~æʈM!áÿ~#¶ÊˆM~ö€w! N#F !àÿÕ#~—MÑëùÑÃãWåÅÕ!9ë!áÿ9ù! N#F!ëÿ6 ·òÊMÆ€4 Å!îÿåÍ]Wññy°ÊÀN!ìÿq#p!N#FÅ!÷ÿåÍ]Wññy°Â N! N#F —&%ÂNÃÀN!ìÿ~�O#~ˆGyÖ€+wxÞ#w!àÿ— #w Â)N>8!êÿw!ÿÿ ~‡#+~w Â?N!õÿ~·òhN!àÿMD!öÿÕ · #ŽÂ^NÑ!íÿ·#~w ÂoN!êÿ5Â6N!ìÿN#FÅ!áÿåÍrVññ!ëÿ~·Ê¨N!áÿ~#¶Ê¨N~î€w! N#F !àÿÕ#~·NÑëùÑÃãWå!9~#fo~#¶ÊÙN~Æ€wáÉåÅÕ!9ë!øÿ9ù!N#F !÷ÿÕ #wÂ÷NÑ!ùÿ~Æ€w! N#FÅ!øÿåÍ€UëùÑÃãWåÅ!9N#F!9~#foÕ~#~Â4OÑÃãWãÅÕMD!9ë!÷ÿ9ùÅ!N#FÅ!÷ÿåÍ]Wññy°Ê¨OyÖ¨OxÞGòŽO!ÿÿÕ~‡#+~wÂ|OÑy°ÂrOèOy°Ê¨O!ùÿÕ·#~�w›OÑ ÃŽO! ÉÍ@ON#F!úÿ~#~ëùÑÃãWÍ@ON#F!ýÿ~+~ +~+~ ëùÑÃãWÍ@OMDóOÁ!þÿ9ëå*d`å*b`å*``åi`é!úÿùá"``á"b`á"d`ÑÉáÕÕÅåø!9~‡w#~�w#~�w#~�w+MD!9 –_ #žÚP{ !94ÃPåÅÕ! 9~·òiP—+–w>#žw! 9N#Fx·ò}P—‘O>˜GÍPÁññÒ�P—‘O>˜G! 9q#pÑÃãWåÅÕ! 9~·ò¯P—+–w>#žw! 9N#Fx·òÃP—‘O>˜GÍPñÁñÒÓP—‘O>˜G! 9q#pÑÃãWåÅÕ! 9N#FÍPÁññ! 9q#pÑÃãWåÅÕ! 93 have a type extension, '.hx0' and '.hx1' are added respectively. EXAMPLES To create a prl file of the hard disk i/o drivers you would first have to begin with the assembly language source. Assemble it at orgin 0 and rename the hex output (with a .'hx0' extenson say). Then you would have to assemble it again with an orgin of 100 hex (Consult your assembler manual on how to do this. With some assemblers you would have to reedit the source file and change the 'org' statement). After you have assembled the source with an orgin of 100 hex you could rename it with a '.hx1' extension. Now you are ready to use the makeprl program. This is an example of a typical way to do the above described procedure. The example assumes that the source is configured correctly. mac hd+dj ren hd+dj.hx0=hd+dj.hex mac hd+dj $+r ren hd+djÃ~]y)Û):DîÈE�£9WAÕzD«ú5DÅ9EŸ TC®¥D EË"‘Dì ì  ½š < ®D¯D´DòD=9ü‡"Dü"ûþyLœLM�P”M@$Š$³Y¹XT÷ZöZÚS¡RbSýYdXÓY|T{TœSºYjI›I¥I{(*f(ú6 8¬8Â&W7¦899N9K ëøH·FÆIIIÁ"MI«F±Fåy)ó)*l*€QƒQ†Q’UDV\VgQjQmQ;LM‡°Õëý$Xq„š®¯í"9BLdhiNÄ÷BÓTÎSÃUTÏ«LOSÅÃONÔšLEAÒ’INÔSNÇDBÌVÉ+VÓ,VÄ-OÓ HR¤AL̶OMMOθHAIιATÁ„I͆EFSTÒ­EFINÔ®EFSNǯEFDB̰EƘELETŪNÄ�LSÅ¢RASŦDIÔ§RROÒ¨RÌÖRÒ×XÐ OÆ/QÖúOÒ‚IELÄÀILEÓÆÎÓRÅIØOTωO TωOSUÂ�EÔÁEX¤NPUÔ…Æ‹NSTÒÚNÔNÐMÐûNKEY¤ÝILÌÈEÔˆINűOAÄÄSEÔÉPRINÔžLISÔŸPOÓISÔ“OÇ OÃ0EÎEFT¤OÆ1ERGÅÅOÄüKI¤2KS¤3KD¤4ID¤EXÔƒULÌ–AMÅÇE×”OÔÕUÔ�ΕPEÎ¿ÒøCT¤PTIOκUÔÂOKÅ™RINÔ‘OÓEEËEAćUΊESTORÅŒETURÎŽEÍ�ESUMÅ©SEÔÊIGHT¤NÄENUͬESEÔÌANDOMIZÅ»TOÐ�WAÐ¥AVÅËPC¨ÔTEÐÑGÎQÒIÎ TR¤TRING¤ØPACE¤YSTEͽROΣROFƤAB¨ÐÏÎHEÎÏAÎ SINÇÙSÒÒAÌARPTÒÜIDTÈ¡AIÔ—HILÅ´ENĵRITÅ·OÒù«ò­óªô¯õÞöÜý§Û¾ï½ð¼ñyy||PF<2(z{*y):*ó)%,,c-G.r)�%Š%'n')0+$+P+Ÿ2)NEXT without FORSyntax errorRETURN without GOSUBOut of DATAIllegal funct97ü57ý17þ-7ÿ+7)7'7%7#7!77777 7 7 7 7 7 7f`.G ÿ$_ ÿ ÿ€@ BÈCG@¾M ¼[É¿�u­Å+¨·påååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå.hx1=hd+dj.hex makeprl -o hd+dj.prl hd+dj.hx0 hd+dj.hx1 In the makeprl line it would not be required to specify the output or add type extensions because the program uses defaults. The makeprl line could be written. makeprl hd+dj hd+dj This form does the same as the first but is quicker to type. The specification for the -s option must be a four digit hex number. FILES makeprl.com Makeprl program makeprl.doc This document. makeprl.doc 3/17/81 ldk  of a typical way to do the above described procedure. The example assumes that the source is configured correctly. mac hd+dj ren hd+dj.hx0=hd+dj.hex mac hd+dj $+r ren hd+djion callOverflowOut of memoryUndefined line numberSubscript out of rangeDuplicate DefinitionDivision by zeroIllegal directType mismatchOut of string spaceString too longString formula too complexCan't continueUndefined user functionNo RESUMERESUME without errorUnprintable errorMissing operandLine buffer overflow??FOR Without NEXT??WHILE without WENDWEND without WHILEGraphics statement not implementedFIELD overflowInternal errorBad file numberFile not foundBad file modeFile already open?Disk I/O errorFile already exists??Disk fullInput past endBad record numberBad file name?Direct statement in fileToo many filesJJJJJJJJJJp„P8”`þÿ1` : NAME makeprl - make a prl file from absolute hex files SYNOPSIS makeprl [-s hex number] [-o output file] hex1 hex2 DESCRIPTION Makeprl is used to create prl files suitable for loading by the install program (see install.doc). The format for prl files can be found in prl.doc. The -s option is used for entering the reserved buffer space. (The reserved buffer space is entered as a 16 bit number in addresses 4 and 5 of the header, see prl.doc). The -o option is the output file specifier. If no output file is specified the name from hex1 is taken with '.prl' type extension added. If the output file does not have a type exentension, the default '.prl' is added. The next two arguments must be specified. The first argument is the hex file input with an orgin at 0. The second is the second hex file input with an orgin at 100 hex. If the hex files do not å4, in Ok Break!9~#þ´Â…  Ãw þ‚ÀN#F#åi`z³ëÊ™ ëÍDáÈ Ãw © à *»|¥<ʺ :Þ ·Â ÃMD=96543>7@?2C:à *Æ "»  ù"Ô þ� á"»!Íã>á:yHG+Í2·È¸È#þ"Ê<Ê֌¸ŠWÃñÆÃVͨ9ÍDðë"Ê ëÕ:Š õÍñãG:Š ¸xÊfÍÅ:Š ' þÚq# åþ¨*' å#^#V*½ÍDÒœ*é ÍDÑÒ¤!» ÍDÒ¤>ÑÍèHëÍÄFÍèHãÍÈ(ÑáÉþ¨ÂÞÍ2ÍD‰ÍZz³ÊËÍPYáÒõë"Ü ëØ:Þ ·{È:­_à ͋ ~Gþ�ÊíÍD‰+K xÊÍ[þ,ÀÃîÞ ·Êû <2­~þƒÊÍZÀz³ÂÆ<à Í2À*Ú ë*Ö "»ëÀ~·Â5#####ÃÍ‹ À·ÊJà  ÕÊfÍOëãÊgëÍD,ë*Ð ëÊfÍZÂì ë|µÊJ"Ð 2Í á"Î ÁÃÅ Í~þ,Ì2þ‰Ê�ÍDÏ+åÍ…(áʧÍ2ÈþÊÃþ Â*‘ ÉÍ·ÈÍ2þ¢Â©©Õ>2°ÃÊÍQ+Í2ÌQBÊþÙÊ"?þÐÊŽþÔÊŽåþ,ÊOþ;Ê ÁÍåÍÊÍc1ÍèF6 *' 4*·|µÂH*' :°·Ê/:²G<ÊH:¯·ÊH†?ÒE¸ÃE:³G<ÊH:ˆ ·ÊH†?ÒE=¸ÔQBÍGGáÃÊ*·|µ( ~Â…:°·Êr:±G<:¯Ê…¸Ã:´G:ˆ þÿÊ…¸ÔQBÒ ÖÒ…/ÃõÍ2Íl ñõþÔÊ�z·ò¥å*·|µÂÆ:°·:²»:³o<ÊÆ&Í ,ëáÍD)+ñÖÔåÊð*·|µ( ~Âð:°·Êí:¯Ãð:ˆ /ƒÚ<Ê ÍQB{=ú  Íÿ@ÂáÍ2Ãѯ2°ågo"·áÉÍD…þ#Ê­QÍiLÍ™ͨ9Í:*ÕåÍQKÑÁÚJDÅÕÍëFá>ÃV?Redo from start #~·Êì þ"Â^ÃûááÃx:É ·Âæ Á!KÍDG*Ò ÉÍQå!„ ÃRþ#ʃÍiLÃÅþ">2¶>ÿ2 ÀÍéF~þ,¹¯2 Í2ýÍD;åÍGGáÉå: ·ÊÕ>?Íÿ@> Íÿ@ÍQKÁÚJDÅ6,ëáåÕÕ+>€2È Í2ͨ9~+þ(Â#Í2Êì… ÿ¯2 ÍW]Ã!#È~·Èþ Ú"!þ _Ú6!·ú[!_þ.Ê6!Íí!Ò6!¯ÃI!: ·ÊG!<ÂG!> È>2 {þ ÚW!þ Úø!Ã!<~Âd!#~æ#þÛÂr! þ¢Ìj*åÅÕ!:G@ #T]~·Ê€!#ò„!~¸Â�!ëþÒÊš!þÓyÑÁ_­!: ·>2 ÃÂ!þ[¹!¯2 ÃÑ!: ·>ÿ2 ÊÍ!> ÊyG{ÃÔ!~#_æÊyG³òÑ!þ¨Âé!¯2 áÃ!Í2EÐþ0Øþ:?É+Í2ÕÅõ͸ñ"Åþ Ê©6þ ʬ6*‘ Ãc1ÁÑ:� Oþ Ê*"þ HÂ5">&È{È:� þÚF"!ÊF"#~þ ̽(~#·Êx"È:� þÚL" Âi"þ.Ês"þDÊs"þEÂL"ÃL"{·Ê�"È*� Ã!ÍûÅÍ8$ÁÑÅÅÍÒŸ"T]ãåÍDÒJ!h ÍDGÁ!ªãë*å ÍD±"`i"å ÉÍà"ÍN]~ÃïÍåÍà"ãÍN]ÍD,Í‹ ÑÉy)ÅÍø:* þ�À:) ·ø€‘Ã�% ÅPXÊ2#þ,Ê#ÕÍOBKÑÊ2#ÍD,ÍOÊ2#ñÍD,ÕÍZÂì z³ÊJëãëÅÍÑÕÅÍ`iÑÍDëÚJÑÁñåÕÃ^# ÚJëå!ùÿÍDáÚJÕ^{#V²ëÑÊq#~#¶+ëÂN#ÅÍ”#ÁÑáÕ^{#V²Ê�#ëãë#s#rë ëáÃx#© Åþö¯2Ì *½+#~#¶È#^#VÍ2·Ê�#O:Ì ·yÊ$þ¨Â×#Í2þ‰Â©#Í2þ©#ÕÍez³Âà#Ã$þ¦#ÕÍeåÍ > Ú($ÍDB!$ÕÍDGáÍT1ÁáåÅÍL1áÑ+æ#Undefined line þ ¦#ÕÍeåë###N#F>!ÿ#å*� å+p+q+wáÉ:Ì ·ÈÕ#ÍDBÍDAÍDSÍDE:ê ·Âõ å*ç ë*é ÍDÂõ á~Ö0Úì þÒì 2é <2ê Í2É~·È͆$#Ã|$õÆAÊ—$ÍåÍy)ó$å!»$ÍDGÍ.KÑÚJDÕ#~ÍÔ.~·Â˜$Íy)"—8Íü7áÉRandom number seed (-32768- to 32767)Ãé$ë*»"ç ë+Í2Ê%þ¢Ê% *»"Ö ¯2 2 |¥<Ê "Ø % *Ô ÃÖCÁ{K2­*Ò "Ú ë*Ö |¥<ÊB "á ë"ã *Ü |µë!Þ ÊW ¦ÂW 5ëÃí¯wY2¶ÍDB!³{þDÒs þ2Òu þ Úx >'Ö_Í#Âx å*Ö ã~þ?Â’ á!³Ãs ÍDGáþÿÍDÌQBÊ·Y|¥<ÄL1>ÁÍnA¯2¶ÍSSÍDB!h Í:­ÖÌ=!ÿÿ"»:Í ·Ê*Î åÍT1ÑÕÍ>*Úå > Íÿ@ÍIKÑÒý ¯2Í Ãª ¯2Í Ã*Ð Úö ÕùÿÍDÑÒö "Î :… ·ÊÅ Ã ?ÍIKÚÅ Í2<=ÊÅ õÍZÍÛ~þ ̽(ÕÍ;Ññ"Ò ÒŒSÕÅÍW]Í2·õë"Ø ëÍÚ^ñõÊõ·ÅõåÍ8$áñÁÅÜ­"ÑñÕʪÑ: ·Â*™ "¾ *å ãÁå åÍêBá"å ëtÁÑå##s#r#F w# y°Â ÑÍÒ!€6"Ç*·"ß ÍkC*Å"Ç*ß "·ÃÅ *½ëbk~#¶È###~·Êóþ ÒÚþ ÚÚÍ3Í2ÃÜ#ës#rÃÒÕÊÑÍOÕÊÍDóúÿÄOÂì ëÑãå*½DM~#¶+È##~#foÍD`i~#fo?È?Ðï2Œ 2‹ ;F~þ"Êjþ Ê@·Ês:‹ ·~Â@þ?>‘ÕÅÊ,jÍuÍ2EÚ€åºÅþGÀ#ÍuþOÀ#Íuþ À#Íu#þ Ê‹þSʦþTÀÍuþO>‰Ã´ÍuþUÀ#ÍuþB>�ÀÁÁÃ,áÍuå!ÖA‡O ^#Vá#åÍuOæÊ“#¹Â ·òÏyþ(ÊþÓÊþÒÊÍuþ.ÊÍí!>Ò“ñ·ú+ÁÑö€õ>ÿ͈¯2Œ ñ͈ÃHá·ò!ÃÎ+õ^ÅþŒÈþ«Èþ¬ÈþªÈþ§Èþ©ÈþÖÈþ¢ÈþŠÈþ“ÈþŸÈþ‰ÈþÏÈþ�Èñ¯Â>2Œ ñÁÑþ¢õ̆ñþÛÂõ͆>�͈ñõÃl~þ.Ê�þ:Ò þ0Ú :Œ ·~ÁÑú@ʼþ.Ê@>͈ÕÍZÍÛãë}͈|á͈ÃHÕÅ~ÍÔ.ÍÛÁÑå:Š þÂè*' |·>Âè}e.þ Ò°ÆõõÆ͈!' ÍÚû!# ñõ~͈ þ"Ê^þ(Êúþ)ÂûÂûÍ2Êþ,Âì ã~þ,Âl>2- Í{:- =ÂlåÍÌÊHá+Í2ã~þ,Êåá+Í2·áÂx6,Ã\å*ë ö¯2É ãÃhÍD,ͨ9ãÕ~þ,Êz:É ·Âîö¯2ß ë*·|µëÂ�QÍõ½Í2WGþ"ʧ:É ·Wʤ:,+ÍìFñÆO:ß ·Èyë!ÌãÕÃWÍ2ñõªÅÚÔ.ÃÍ.+Í2ÊØþ,Âqã+Í2ÂdÑ:É ·ëÂ0DÕáÃÍ·Â#~#¶Ê #^#Vë"Æ ëÍ2þ„ÂîÃzÍDðÃÍD(+ÕÍûBÍ®¯2, "ß *ß Á~"À þïØþòÚªÖò_ÂO:Š þ{Ê}Hþ Ð!xVºÐÅ0ÅzþÊÈþQÚÖæþþzÊÖ!' :Š ÖÊ ·N#FÅú›#N#FÅâ›#!# N#F#ÅN#FÅÆKGÅÿÅ*À à ÖïÚâþÒâþªºWÚì "À Í2ìÍó)͘(7ãÕÍy)Ñå�ãxþdÐÅÕd!]åÍÂs*' å~FãÁy2‹ :Š ¸ÂþÊ4þÊ‚ÒGWxþÊDzþÊkxþÊzþÊ ÒŠ!© N#FÑ*' ÅÉÍ*Íó(á"% á"# ÁÑͨ(Í*!•:‹ …oŒ•g~#foéÅÍó(ñ2Š þÊRá"' ÃWÍó)ÁÑ!ŸÃ]á͘(Í*ͳ(á") á"' ÄåëÍ*á͘(Í*Ãl'Í2Ê ÚÔ.Í2EÒeþ Ú¸<Êî=þòÊ®þóÊWþ"ÊéFþÕÊjþ&Ê„þ×ÂñÍ2:­åÍïáÉþÖÂÍ2å*Ö Í,áÉþÜÂ1Í2ÍD(þ#Â͈ åÍVQáÃ!ͨ9ÍD)åë|µÊJÍÛ)áÉþÒÊõþÚÊíIþÝÊ£BþØÊ"Iþ…Ê+UþÓÊnÍÍD)É}Í *ß åÍj(áÉͨ9åë"' ÍÄí(áÉ~þaØþ{Ðæ_Éþ&ÂZÍ2ÍvþOÊÈþHÂÇ#~ÍvÍ2EëÒ²þ:ÒéÖ0ÚéùþGÒéÖ7))))µoÊþ ëÙ+Í2ëÒéþ8Òì þ Å)Ø)Ø)ØÁÖ0O ëÃÈÍÛ)ëÉ#~Ö�þÂåÍ2þ(áÂùþÏÂõ$·Â%#~#¶YÊ #^#Vë"ç ëÍ2yþ~Ê3%þ´Êó$þµÂô$Âô$Éþ‚Êó$þƒÂô$ÈÍ2Ê%ë*»å*ç "»ëÅͨ9Á+Í2%Êh%ÍD,+=%ã"»áÕÉõ:, 2- ñõ¯2, ñÉ!G6Ͷ(Ã�%Ͷ(Ís(x·È:* ·Ê¨(�Ò§%/<ë͘(ëͨ(ÁÑþÐõÍÕ(gñÍg&|·!' òÎ%ÍG&Ò(Ê—0.ÍŽ&Ã(&¯�G~›_#~šW#~™OÜS&hc¯Gy·Â&JTeoxÖþàÂâ%¯2* É|µ²Â &yÒ&OÃ&)zWy�Oòù%x\E·Ê(&!* †wÒô%Êô%x!* ·ü:&F#~怩Oè(ÀÀ À€4ÀÖ0~ƒ_#~ŠW#~‰OÉ!+ ~/w¯o�G}›_}šW}™OÉÖÚv&CZQÃi&Æ oz³°ÂŠ&y-ÈOÒ€&Ã�&¯-ÈyOzW{_xGÊ&�š÷ƒ$cCƒuÍ�„©ƒ‚�â°Mƒ rƒô5ÍD(·êJÍÕ&1€rÃ'ͳ(>€2* ¨õ͘(! &ÍÔ7Áá͘(ëͨ(!±&ÍÔ7ÁÑÍn'ñ͘(ÍS(ÁÑÃ�%ÍD(È.Í(y2A'ë"<'PX!ß%å!*'åå!' ~#·Ê^'åëWyÒB'ÕÑÎO|g}oxGæÊV'xö GzÂ4'ëáÉCZQOÉ͘(!­-Í¥(ÁÑÍD(ÊŸ0.ÿÍ(44+~2Ÿ'+~2›'+~2—'Aë¯OW_2¢'åÅ}Öo|ÞgxÞG>Þ?Ò°'2¢'ññ7ÒÁáy<=òÎ':¢'æÀõx´µÊÉ'> á´Ã)&{_zWyO)xG:¢'2¢'y²³Â“'å!* 5á“'Ãô%>ÿ.¯!6 N#®G.x·Ê&(}!* ®€G¨xò%(Æ€wÊ\'ÍÕ(w+ÉÍD(/á·áòô%Ão0ͳ(x·ÈÆÚ�0GÍ�%!* 4ÀÃ�0:* ·È:) þ/ŸÀ<Ɉ!* Op#6€ÃÜ%Í…(ðÍú÷+Ê !) ~î€wÉÍ…(oŸgÃÛ)ÍÊ òD(*' |µÈ|ÃN(ë*' ãå*) ãåëÉͶ(ë"' `i") ëÉ!' ^#V#N#F#É' ÃÌ(ë:Š Gw#ÂÌ(É!) ~7w?##wy7O®É!0 Ç(Ãù(!0 È(Õ' Íñ#=ÂüáÃHiæʽ¾ÂÃÏþ&Â@åÍ2áÍvþH> Â4> ͈ÕÅÍ„Áî#õ͈ñÖ:ÊRþJÂX>2‹ 2Œ ÖUÂHõ~·ã|áÊs¾Ê@õ~#͈Ã^!@}‘O|˜G!E¯É>: y°Àà á+=2Œ ÁÑÍu͈#ÍuÍ2EÒžþ:Òºþ0Òžþ.ÊžÃH~þ ÒÏþ ÊÏþ ÊÏ> õ:Œ <ÊØ=Ã`+~þ ÊÛþ ÊÛþ ÊÛ#É>d2È Í¨9ÍDðÕë"Ê ë:Š õÍñåÍÅ!ã Í¿(áÑÁåÍ"Ä !9Íw ÑÂ? Õ+V+^##å*Ä ÍDá Ñù"Ô ëÍûBå*Ä ãå*»ãÍDÎÍÊ Ò õÍñåò{Íy)ã~þÑÌi ÕåëÍ‘(ÞÍó)ͳ(áÅÕ�QZ~þÑ>ŸÍåÍó)ͳ(ÍD(áÅÕOÍGÅ+Í2Âì Íç$Í2åå*ç "»*Ê ã‚Å3õõÃÊE‚Å3åÍá·Ä�B"Ò ë!9"Ô ë~þ:Ê·Âì #~#¶Ê¨ #^#Vë"»:! ·ÊÕ>[Íÿ@ÍT1>]Íÿ@ÑëÍ2ÍÕÈÖ�ÚAþLÒûOë! N#FÅë#~þ:Ðþ Ê2Ò°·Èþ Ú«þÂP:� ·ÉþÂ[*� Ã3õ#2� ÖÒ�ÖõÒqþþÂ…~#"� &o"‘ >2� !¶ñ·É~##"� +fÃv<2� ÕÅ‘ ëGÍÌ(ëÁÑ"� ñ!¶·Éþ Ò2þ0?<=É:� þÒØþ ÚØ*‘ ÂÒ###^#VëÍ,ÃU:� 2Š þÊò*‘ "' *“ ") ÃU!‘ Íí(ÃUÍ1Eì ÅØÖAOGÍ2þóÂ'Í2Í1EØÖAGÍ2x‘Ø<ã!í  s#=Â2á~þ,ÀÍ2ÃÍ2Íl ðà ~þ.ë*Ø ëÊ2+Í2þÊeþ ë*‘ ëÊ2+Í2Ðåõ!˜ÍDÚ’bk))ñÖ0_ëáÃqñáÉÊkCþÊ¢þ  RÍoCÍÃÂÍûBÍZÁåå*»ã>�õ3ÅÃÆÅÍZ:� þ ëÈëå*� ãÍ#å*»ÍDáÜÔÒõ > 2Ì áÍ/$`iÉà ÀÿÍs 7>OÅÍ2yþÒ*ÍÍD,Í:*ë*' ãåëÍ‹ ëãÃDÍOã}þ Ú;þåÜó)ácÕ>2, Ÿ N#fiéþóÈþ-Èþ+ÈþòÈ+É<�Á ÆÿŸÍ~(Ã|ZÍ Íy)}/o|/g"' ÁÃ0:Š þҌַ7ÉÖ·ÉÅÍy)ñÑþzÊ ,þ{ʧ+ñÅþF¯{µo|²ÉþPº{¥o|¢Éþ<ÂÅ{­o|ªÉþ2ÂÒ{­/o|ª/É}/£/o|/¢/É}“o|šgÃ,:¯Ãî:ˆ €2È Í¨9ëã:Š õÕÍ"ß á"À ñÍÅÍûB!øÿ9ùÍö(:Š õ*ß ~þ)ÊäÍD,å*À ÍD,Úñ2q ñ·Ê(2Š !9Íí(!9ùÑ.,·úû:Š …G:q O€þdÒJõ}!s OÍÙàÅÅÃc*ß Í2å*À ÍD)>Õ"À : ÆõOÍûBñO/€2È ¶Oí9þ~Âì #~þƒÂì #ÂJÍŽ 2 ÛÃïÍx ÓÉÍx õ+Í2Ê0 ÍD,Í‹ ÁÛ« Ê1 ÉÃì þžÂQ Í2Í‹ 2²Í^ 2±ÉÍ‹ 2³Í^ 2´ÉÖÒ^ Æ/<ƒÉÍ2ÍåÍy)ëáz·ÉÍ‹ 22 2 ÍD,Ë Í2ÍÍo ÂJ+Í2{É>2°ÁÍûÅÍW]!ÿÿ"»áÑN#F#x±Êª å*·|µáÌ…BÅN#F#ÅãëÍDÁÚ© ãåÅë"Ø ÍT1á~þ Êç > Íÿ@Í!!… Íö ÍQBç ~·ÈÍÙB#Ãö 5Ø# Éx·ÊD(!M(åÍD(yÈ!) ®yøÍ)©É#x¾À+y¾À+z¾À+{–ÀááÉz¬|úN(ºÂO(}“ÂO(É!0 ÍÈ(7 ·ÊD(!M(åÍD(OÈ!) ®yø#–Â)+Âe)ÁÉÍH)ÂM(ÉÍ*' øÊ â˜)Íó(!C6Íí(Í%,Íý)Û)Í~%:) ·õæ2) :* þ�Òþ ÍA*:* ·Â¼)ñëÃÁ)ñëòÇ)|/g}/oÃÛ)!þ å:* þ�Òä)ÍA*ëÑ"' >2Рɀ�Í)ÀajÃÚ)Íàú*Ê ͳ(Í5*x·ÈÍÕ(!& FÃ(&*' Í5*|U�ÃX(ÍÐÊ ü*!"# "% >>Ãà)ÍÈà GOW_·Èåͳ(ÍÕ(®güe*>˜�Íg&|Ü:&ÜS&áÉz£<À ÉÍøÍD(ò*Ís(Í*Ãj(ÍøÒ¥*Ê ÍÎ)!* ~þ˜:' Ð~ÍA*6˜{õyÍÜ%ñÉ!* ~þ�ÂÉ*O+~î€+¶µ*·!€ÂÈ*ÍÛ)Ã*y·Èþ¸Ðõͳ(ÍÕ(®+6¸õ+qüù*:) O!) >¸�Í$-ñüÜ,¯2" ñÐÃ�,!# ~5·#Êü*Éå!x±Ê!+>)Ú<ë)ëÒ+ Ú<=Â+ëáÉ|ŸGÍí+y˜Ã3+|ŸGåzŸˆ¬òÚ)ÅëÍ*ñá͘(ëÍ,ÃQ0|µÊÛ)åÕÍá+ÅDM!>)Úˆ+ë)ëÒp+ Úˆ+=Âb+ÁÑ|·ú€+ÑxÃé+ʙ+ëÁáÍ*á͘(Í*ÁÑÃ'x·ÁúÛ)ÕÍ*ÑÃs(|µÊï Íá+ÅëÍí+DM!>õ·ÃÊ+õå ÒÉ+ñ7>á{_zW}o|gñ=ÂÀ+ëÁÕÃv+|ªGÍè+ë|·òÛ)¯O•oyœgÃÛ)*' Íí+|ÀëÍ5*¯˜ÃX(Õͧ+¯‚g{oÍÞ)ñÃé+!6 ~î€w!7 ~·ÈG+N* ·Êê(�ÒQ,/<õ#åFwx+ ÂA,áF+Nñþ9ÐõÍÕ(!/ G>w2" ñ!6 Í$-:/ 2" x·ò…,Íù,ÒÊ,ë4Ê—0ÍP-ÃÊ,>žÍû,!+ Ü-¯G:) ·Â¹,!" Vwz# ž,xÖþÀ‘,Ãô%!" ÍX-·ò±,x·ÊÊ,!* †wÒô%È:" ·üÜ,!+ ~æ€++®wÉ!# 4À#Âá,4Ê—0+6€ÉS !0 Ã->Ž!0 #6ÍB)áòà4é·È=60#à 5Â5ÈÍH560#=Ã5{‚5#HÉÂT56."ß #HÉ À6,#ÉÕÍâ«5ÅåÍó(!C6Íí(Í%,¯ÍÎ*áÁS6> ÍH5ÅõåÕ/áå>žÍþ,Ò…5á>ŽÍþ,ëáp#ñÁ=Â|5Åå!# Í¥(ø5ÅåÍ~%>ÍA*ͨ(áÁ¯™6?ÍH5ÅõåÕͳ(á/{–_#zžW#yžO++ÒÌ5ÍG&#ͨ(ëáp#ñÁÚ¾5>Ãú5ÕŸ6>ÍH5ÅõåëN#FÅ#ãë*' /}“o|šgÒ 6"' Ñáp#ñÁ=Âú5ÍH5wÑÉù¢áÿŸ1©_c²þÿ¿É¶€¿É¶€Æ¤~�@zóZ rN ¥ÔèèvHä TÊš;áõ€–˜@B †''èd ¯GÂÅÍà"Á8 Õ¯ÊÈ6)�)�)�)�·ÂÙ6y=ÊÙ6·Êå6¯Æ0þ:Úâ6Ư Êò6ÊÄ6ÃÂ6áÉ!s(ãé͘(!G6Í¥(à 7Íó)ÁÑ!w%å>2, ÍD(xÊW7ò"7·ÊÅ0·Êõ%ÕÅyöͳ(ò?7ÕÅÍŒ*ÁÑõÍ)á|á") á"' Üõ6Ìs(ÕÅÍÂ&ÁÑÍ'8�;ªÍ':* þˆÒŒ7þhÚž7͘(ÍŒ*Æ�ÁÑÊ�7õÍŠ%!¨7ÍÔ7ÁJÃ'͘(:) ·ò›7ññÃô%Ã�0�ͨ(É|ˆYtà—&wÄz^Pc|þu~r1€�͘(”+Õåͳ(Í'á͘(~#Í¥(ñÁÑ=ÈÕÅõåÍ'áͶ(åÍ�%áÃÝ7RÇO€Í2å!œ&Í¥(Í 8áÃ5*ÍD(!u8úk8!–8Í¥(!u8Ȇæw#‡‡O Ͷ(Í':t8<æþˆ2t8!–8‡‡O Í�%ͳ({YîOO6€+F6€!s84~Ö«Âb8w Íß%!–8ÿ(w+w+wÃF85JÊ™9v˜"•³˜ ÝG˜SÑ™™ Ÿ˜e¼Í˜Öw>˜RÇO€h±Fh™é’iÑuh!9Í�%:* þwØ"~ƒùÍ'͘(ÍŒ*ÁÑÍŠ%Í)úö8€Í�%€€Í�%ÍD(ôs(Í�%Ís(:) ·õò9î€å*·|µÂjVá:°·Ê†AñõþÂ#A:¯=2¯ñÃaAþ Â7A> Íÿ@:¯æÂ(AñÉñõÖ Ê]AÚ`A:²<:¯ÊWAå!²¾áÌwAÊ`AþÿÊ`A<2¯ñõÅÕåOÍáÑÁñɯ2°:¯·È> ÍaA> ÍaA¯2¯É:¶·ÂyGñÅõþÂ¥A:ˆ ·Ê·A=2ˆ >ÃÛAþ ºA> Íÿ@:ˆ æªAñÁÉþ ÚÛA:³G:ˆ ÊÒA¸ÌQBÊÛAþÿÊÛA<2ˆ ñÁõñõÅÕåOÍáÑÁñÉå*·|µÊ$BÍÆWÒ\'ÅÕåÍSSáÑÁ: ·Â7P:Á·!ÍãÂkCãÅÕ!h ÍDGÑÁ¯áÉáÅÕåÍáÑÁæþÀ:¶·ÌuD/2¶·ÊuD¯É:ˆ ·ÈÃQB6!„ > Íÿ@> Íÿ@å*·|µáÊgB¯É:°·ÊsB¯2¯ɯ2ˆ :«=Èõ¯Íÿ@ñÃzBÅÕåÍáÑÁ·ÈÍ%BþÌ%B2¬þÌwDÃ5DÍ2åÍÍB·BÍ·ÊÀBÍ%BõÍØFñ_ÍI!g "' >2Š áÉ:¬·Èõ¯2¬ñÉÍÿ@þ À> Íÿ@Í[B> ÉÍCÅãÁÍD~È +ÃðBå*™  >Æ•o>ÿœÚCg9áØ*¹++"Ô Ã Í3CÐÅÕå͈GáÑÁÍ3CÐÃCÕë*¾ ÍDëÑÉ:çG!ǯ^#V#ÂGCÍT¯À*½ͯD2 2Í 2Ì w#w#"å *½+"Ê : ·ÂŒC¯2ê 2é !í 6#Â…Cõ7!–8ÍÂ(!s8¯w#w#w¯2Þ og"Ü "ã *™ : ·Â·C"¾ ¯ÍD*å "ç "é : ·ÌTÁ*¹++"Ô ##ù!� "› Íw%ÍnAͯgo" 2Ú "q "Ý " 2È åÅ*Ê É|’À}“É~ã¾ÂD#ã#~þ:ÐÃ7Ãì ë*½Ê/DëÍZåÍ`iÑÒõ+"ë ëÉÀ<Ã@DÀõÌTñ"Ò !� "› !öÿÁ*»åõ}¤<ÊaD"á *Ò "ã ¯2¶ÍnAÍDBñ!m Â… é >õÖƒD2°2¶>^Íÿ@ñÆ@Íÿ@ÃQB*ã |µÊ ë*á "»ëÉÍ‹ À<2«É>¯2! Éͨ9Õå! ÍÈ(*ç ãÍõÍD,ͨ9Á͸ ãëå*ç ÍDÂJÑáãÕÍÈ(á ÍÈ(áÉ>2È Í¨9ÂJå2È 2-¯Ž# Â-É~/w!" ¯Oyžw#Â-ÉqåÖÚ;-áåNsY+Â0-Ã&-Æ W¯áÈå~w+ÂE-Ã>-!) ÃB-~w# ÂZ-ÉÍD(È:7 ·Êô%Íø'Í .q·Õʘ-ÅGÜù,ÍP-xÁ Â�-ÑÂx-Ã�,!) Í,-Ã�-ÍÌÌÌÌÌL} „:* þAÒÅ-¡-!0 ÍÈ(Ãc-:) ·òÕ-æ2) !s(åÍ.# !0 ÍÈ(Í.Í%,# !0 ÍÈ(>õÍ.Í%.Í%,!6 Í6.ñ=Âò-Í.Í.Í.É!* 5ÀÃô%!7 >5È=Â.ÉÑ>!0 N#F#Å=Â+.ÕÉÑ>!7 Áp+q+=Â<.ÕÉ:7 ·Ê£0:* ·Êô%Íõ'44Ê—0Í .!Z qA>žÍð,™?Úw.>ŽÍð,¯Ú:) <=úÍ,!# ÍZ-!S ÍX-x·Âe.!* 5Âe.Ãô%y26 +Y ~q+«.ÉÍó(ë+~·ÈÆÚ—0wåÍ%,á4À×0Íô%Í2*ö¯o%Åõ>2, ñëÿ`hÌÛ)ë~þ&Ê„þ-õÊü.þ+Êü.+Í2Úã/þ.ʉ/þeÊ/þEÂ8/åÍ2þlÊ&/þLÊ&/þqÊ&/þQáÊ7/:Š þÊQ/>ÃQ/~þ%Ê–/þ#ʧ/þ!ʨ/þdÊQ/þDÂh/·Í±/Í2ÍMÍ2ÚV0Âh/¯“_å{�_ôÀ/üÐ/Âl/áñåÌj(áÍèå!\'åÍä)ÉÍ Âh/ܱ/Ãü.Í2ñå!\'å!y)åõÃh/·Í±/Í2Ãh/åÕÅõÌó)ñÄ*ÁÑáÉÈõÍõä-(ñìµ.ñ=ÉÕåõÍõäc'ñì±-ñáÑ<ÉÕx‰GÅå~Ö0õÍò0*' Í ÍDÒ0T])))ñO |·ú0"' áÁÑÃü.yõÍ*7Ò80t”$Í)ò50Í-(ñÍK0Ã0Í)*͵.Íó(ñÍS(Í)*Í%,Ã0͘(ÍS(ÁÑÃ�%{þ Òe0ƒ†Ö0_úÃ[/·ÃÌ0ñå!) Íâ0:6 À0y®áÃÌ0:+ Û0ñññ:) ÃÌ0ñ:+ /ÃÌ0yÃÅ0åÕ!# H1ÍÂ(:H12% ÍâÀ0:) ÃÃ0:6 Ñá!b"¿åÅÕõõ*Ü |µÂý0:, ·Êê0þÂý0>2, *¿Í|$2ˆ > ͆$> ͆$ñ!'2) !$9ÍÅ7ñð:) î€2) Ƀù"~ÛI�û׆e&™‡X4#‡á]¥†ÛIƒÍ˜(ͬ8Áá͘(ëͨ(ͦ8Ãl'ÍD(üõ6üs(:* þ�Úk9�QYÍn'!‡%å!u9ÍÅ7!9É J×;xn„{þÁ/|t1š}„=Z}È‘~ä»L~lªª�+Í2ÈÍD,š9Åö¯2‰ NÍ1EÚì ¯G2è#~þ.Ú:ÊÒ9þ:ÒÌ9þ0ÒÒ9Í2EÚ:GÅÿèö€#~þ:Òê9þ0ÒÙ9Í2EÒÙ9þ.ÊÙ9xþ'Òì Á2è~þ&Ò:*:Õþ%Èþ$Èþ!Èþ#Èñyæ_å!¬ Vá+z2Š Í2:È =ʽ;òF:~Ö(ÊA;Ö3ÊA;¯2È å:Ú ·2× Êš:*  "Ø ëÀ:o¹Âx::Š ½Âx:¸Ê;&…ë*é ëÍDÊ<^#~#¹Âã;:Š »Âã;~¸Ê<#^^#V#ÂÃ;:‰ ·Âõ ñDMÊ\'–ʈ< à #:è¾Âä;#·Êé;+Íã<Ãé;:Š w#_ñÊÁ<õBKëÚCÍC"é +6ÍDÂk<W*À ^ë) ë++s#r#ñÚ½Í]G!» åw#s#ráÉ+"Påÿ#~ ·ÊþFºÊþF¸ÂïFþ"Ì2åxþ,ÂG ÊG+~þ Ê Gáã#ëyÍÝF» >Õ*› "' >2Š ÍÈ(¾ ÍD"› á~Àà #ÍèFÍÊH͸(È Íÿ@þ Ì[BÃNG·ñõ*é ë*¾ /Oÿ #ÍDÚ{G"¾ #ëñÉñÊ ¿õ_GÅ*™ "¾ !å*é å!� ë*› ëÍD™GÂ4H!o "Û *ç "Ø *å ë*Ø ëÍDÊÚG~###õÍÅ<ñþÂÓGÍ5H¯_öG*Û ~#fo´ë*ç ÊýGë"Û ##^#V#ë"Ø ëöGÁë*é ëÍDÊYH~#õ##ÍÅD¸GáÂ2ñÁÑë"# `i"% ëÁÑÉÅ#~þ+ʈ2þ-Ê_2Ö0Ox‡‡€‡�GþÒˆ2#~·ÂF2`ÁxþEÂ}2y„þ áÒ12>€2. Ã�2|�þáÒ12Ãu2ÁáÃ12ñÁÑë"# `i"% ëÁÑͨ(#þåÞWÍ–4õ:. ·ò»2ñ‚ÃÅ2ñ‚úÉ2ºÒÉ2ÖáõÍ5560̽(Í\5+~þ0ÊØ2þ.Ľ(ñÊ 3õÍ>"�w#ñ6+òû26-/</Ö Òý2Æ:#p#w#6ë!9 É#ÅþzÒ‹3Ú(4Í-5ÑzÖô 5Íô5{·Ì(=ô 5åÍœ1áÊ@3p#6!8 #:ß •’È~þ ÊE3þ*ÊE3+åõY3ÅÍ2þ-Èþ+Èþ$ÈÁþ0ƒ3#Í2Òƒ3++wñÊy3ÁÃF3ñʃ3á6%ÉåÚ/4ʧ3K6ÍB)úµ3áÁÍc1+6%ɶÊÍ)òž3ÍD(Ä–4áÁúÚ3Å_x’“ô 5Í 5Í\5³Ä5³ÄH5ÑÃ-3_y·ÄÎ/ƒúå3¯ÅõüÐ/úç3Á{�Á_‚xú4’“ô 5ÅÍ 5Ã4Í 5yÍL5O¯’“Í 5ÅGOÍ\5Á±Â4*ß ƒ=ô 5PÃ63åÕÍ*ѯÊ54ÍD(7Ä–4áÁõy·õÄÎ/€OzæþŸW�O“õÅüÐ/úU4ÁñÅõúc4¯/<€<‚GÍ\5ñô5ÍH5Áñ†4Í(~þ.Ľ("ß ñÚ�4ƒ�’ÅÍè2ëÑÃ63Õ¯õÍâº4:* þ‘Òº4+6!0 ÍÈ(Íc-ñÖ õß4Íì4ÍêÏ4C‘ùOÍ)ÃÕ436ÍB)òè4ñÍÁ/õý4ñÍÐ/õÍì4ñ·ÑÉÍêþ4t”ø#Í)Ã5;2­*Ö ´¥<ëÈÃ=ÍOÀáë"Ø ëÍÒõ`i##N#F#ÅÍ!áå|¥<>!Ìÿ@ÄT1> Íÿ@!… åÿ ~#·ÂB=áGÍ%B·ÊM=ÍvÖ0Úl=þ Òl=_z‚ƒWÃM=å!K=ãÂw=þØÊå>þOÊô>þÝÊ?þðÊÓ=þ1Ú’=Ö þ!Ê?þÊ >þ#Êæ=þÊi>þÊ>þÊ4>þÊ?þ(Êd>þÊà=þÊa>þ>Âÿ@ÁÑÍQBÃ=~·ÈÍÙB#ÂÓ=Éå!.>ã7õÍ%B_ñõÜ.>~·Ê >ÍÙBñõܬ>Ú>#~»Âð=Âð=ñÉÍö ÍQBÁÃ*=~·È>\ÍÙB~·Ê.>ÍÙBͬ>Â>>\Íÿ@É~·ÈÍ%Bþ ÒV>þ ÊV>þÊV>þ ÊV>>Íÿ@Ã7>wÍÙB#Â4>É6HÿÍÓ=Í%BþÊœ>þÊž>þ Ê?þÈþÊž>þ ʼ>þʼ>þ ʼ>þ Úi>þ_¼>>_ÊÄ>ÍÙB+i>Õå ~·7Ê\'#~+w#î>õyþÿÚÌ>ñ>Íÿ@Ãi>� Åëo&DM#ÍíBÁñwÍÙB#ÃÉ>x·È+>ÍÙBÂô>Éx·È+~ÍÙBÂô>ÉÍö ÍQBÁÑz£\Íõ@Íÿ@¯_WÍõ@W~#þ!ʹ@þ#ÊÌ?þ&Ê´@Ê’@þ+>Ês?+~#þ.Êë?þ_ʨ@þ\ÊQ?¾Âj?þ$ÊÅ?þ*Âj?x#þÚ½?~þ$> ÂÉ?þ¯Æ#‚WÊ!@~#þ.Êö?þ#ÊÌ?þ,Â@zö@WÃÌ?~þ#>.Âj?# Ê!@~#þ#Êö?Õ@ÕT]þ^À¾À#¾À#¾À#xÖØÑÑG#ÊëÑz+æÂA@x·ÊA@~Ö-Ê<@þþÂA@>Æ‚WáñÊ�@ÅÕÍÑÁÅåCx�þÒJzö€Íd1ÍDGá+Í27Êy@2É þ;Êv@þ,Âì Í2ÁëáåõÕ~�#N#fi_x·Âp?Ø@Íõ@Íÿ@áñÂ3?ÜQBãÍÍHáÃÍõ@~#Íÿ@Ê@ÿý@>ñÍõ@áñÊ�@ÅÍÍ:*ÁÅå*' AÅÍqIÍGG*' ñ<Ê`@=–G> Ê`@Íÿ@Ãë@õz·>+Äÿ@ñÉõ6W~·ÉïÅÍüHÊJ#^#VÉÍØFÍŽ *¼ sÁÃGÍ2ÍD(Í‹ ÕÍD,ÍÍD)ãåÍÊFIÍŽ ÃIIÍIÑÍRIÍŽ > õ{ÍÚFGñÊI*¼ w#ÂaIÃIÍãI¯ãO>åå~¸ÚzIxÅÍ]GÁáå#F#fh DMÍÝFoͽHÑÍÎHÃGÍãIÑÕ�ÃnIë~ÍèIÊJÅÍKñãrIÅ=¾ÐO~‘»GØCÉÍüHÊï_#~#foåFrãÅ+Í2ÍÍ.ÁápÉëÍD)ÁÑÅCÉÍ2ÍÍ>õÊJñÍŽ ·ÊJõÍD,ÍÍ:*ÍD,å*' ãÍÍD)åÍÇHëÁáñÅ\'ÅïÅõÕÍÍHÑñG=O¾>зxÈ~#F#fh ‘GÅÕãN#^#VáåÕžÂwJ ÊnJ#ÂYJÑÑÁѯÉáÑÑÁx”�<ÉÁÑá#ÂVJÃkJÍD(ͨ9Í:*åÕë#^#V*é ÍDÚ¯J*½ÍDÒ¯JáåÍÄFáåÍÈ(áãÍD,Í‹ ·ÊJõ~ÍKÕÍåÍÇHëáÁñGãå!\'ãy·È~�ÚJ<¹ÚâJyH Õ#^#fk GÑëN#~#foëy·Èw# ÈÂúJÉÿþ)ÊKÍD,Í‹ ÍD)ÉÍÂ$KÍÊH͈G*é ë*¾ ÃÜ>?Íÿ@> Íÿ@ÃIKÍìAþ›K6ÃYKp¯2¬¯2 ÍìAþÂ�KÍQB!ÿÿÃ+=:µ·>\2µÂvKÊHKÍÿ@+ÊŠK~Íÿ@Ã;K+Íÿ@Â;KÍÿ@ÍQB!… õ¯2µñOþÊbK:µ·Ê±K>\Íÿ@¯2µyþÊLþÌwD7Èþ Ê\Lþ ÊLþ ÂÕKÊIKÃLþÌwDÊIKþÂóKÊQKÍÿ@> Íÿ@>ÃKþÂýK>#ÊKþÂLÅÕå6ÍQB!… Íö áÑÁÃ;Kþ Ú;Kx<Â9Lå*·|µá>Ê=L!… ÍZë"»ÃŽyq#Íÿ@Ö Â;K2ˆ > Íÿ@ÍìA·ÊMLþ Ê;KÛK: ·ÊLB¯w!„ Éõ>2 ñþ;À2 Ã2"Ä Íâ$Í2ëÍàL33Â�L ù"Ô *»å*Ä åÕÃÀLÂì ëÍàL Mù"Ô ë*»"ç ë##^#V#~#fo"»ëÍåÍ…(áÊÔL´AÅ3ÃÍ*ç "»áññÃÍ!9~#‚¹ÂôL ÃäL´¹ÀåN#F`iÍÁÁÁÁÜ UáÉ> Èà UñáÁãëÂ$UÅxÍÚFÍGÁãÅåõÃÁTÍ2ÍD$ÍD(Í‹ Õ~þ,ÂOUÍ2Í0QþÊà Í(Q¯õÍD)ñãõ}·ÊJåÍÚFëÁñõʉUÍÍBÂpUÍ%BþÊ‚Uw# ÂbUñÍÃG*Ô ùÃMDÍÆWÚÏ ÃuUÍ€–O #~ÖÖŸÃ~(PY!' ůw͵W:DÍ—ZþÿÊÞ =ÊÀ =ÂùUѯÍý <ÊÞ Á!% ^#Vr+sÉÍ?QÊ:VÅ PYÕþÂ0V!'Våå`i>Ã}V!' ~·ÄÐUÑ͵WÍÁ)¯Â=VÉÍÉ*·ÕT]% N#F+q#p##å€#6 –W͵W:CÍ—Z·>®W>€áw+w·ÑÉÅÕå!(ëÍáÑÁÉÍLWØþ7?ÀÅå*·' 6#67áÁÉÍåÍÇH~·ÊÕ õ#^#fk_þÚXN#~þ:ÊX++@ÊÕ yÖ@ÚÕ þÒÕ ! #úTX~þ.Â2XÍ@Xñ7õÃX#ÂX¯2-ñáÉzþ ÊÕ þÚÕ È> Ã@XÊ9X> ÂYXÃ9XÍáWå€Í!Í<ÊÆ !! w#„XáÍDAÍDSÍáWå:!!¾ÂJ!Í<Âá ÍáÉÅÍåÍÇH~·Êà #N#F æßþOÊåXþIÊåXþRÂà áÍD,Õþ#Ì2Í‹ ÍD,{·ÊÉ Ñ_ÕÍ.pl 63 .po 0 .he Notes on CP/M Ver. 2.2 With Discus M26, M10, and M20 .fo Page # Therå  arå severaì featureó oæ Morro÷ Designó versioî oæ CP/Í Ver®  2.² witè whicè useró accustomeä tï singlå densitù CP/Í oî ¸ incè driveó maù noô bå familiar®  Iî addition¬  somå explanatioî ió  requireä  foò  certaiî utilitù commandó  provideä  bù  Morro÷ Designs®  Theså  speciaì  featureó anä  utilitieó  arå  discusseä below. CBIOS Thå  CBIOS‚  supplieä  witè CP/Í Ver®  2.²  haó  somå  uniquå featureó  whicè  allo÷ useró tï easilù uså  floppù  disketteó  oæ differenô densitieó and/oò sectoò sizes®  Thå CBIOS‚ wilì reaä anä writå  disketteó formateä iî IBÍ 374° singlå densitù format¬  anä IBÍ systeí 3´ doublå densitù format®  Thå compatibilitù witè  IBÍ disketteó ió ONLÙ iî thå formattinç information¬  NOÔ iî thå filå structure®  Thió  meanó  thaô  thå Disë Jockeù 2Ä  caî  reaä  IBÍ diskettes¬ buô softwarå ió needeä tï reaä IBÍ files® Nï cDáÈ ÃäLà >€2È Í¨9åëÍÍí(Íy)"  ÍûBÑ!Àÿ9ùë +Í2"Ê ÊMÍD(ÅÕͨ9ãs#r#ãÑÁ~þ,Â]M Í2ÃCMÍD)"Ê >!‘á=ÊMÑ=ÊMÁ=ÊMÅå!9DMáå!ŠMãå* ãÉ*Ô ù*Ê Ãͯ2 2 ~ݧM2 #+Í2ÍšRå!" á+Í2Ê'NÍD,þ,ÊØMÍåÍà"" á+Í2Ê'NÍD,ª»ÊûMÍDAÍDLÍDLÊ\OÍD,»Âì ·õ2 Í2ÍûÅÍ8$ÁÑÅ`i" ÍÒ NT]" áÍDÒJñÂ\O*½+#~#¶ÊãN#^#Vë"»ëÍ2·Ê+Nþ:Ê;N¸»ÊXNÍ2Í+Ã;NÍ2Ê>Nå>2È Í¨9ʶNxö€G¯Í½;>2È Â„N~þ(ŠNñÃÒN~þ(ÊJáͨ9z³Â£Nxö€G:Š WÍF:z³ÊJåBK!ÅNå ·ú«N ö€É2È ~þ(ŠNã ͪNá+Í2Ê>Nþ(ÂÜNÍ2ÍD)Ê>NÍD,Ã^N*ç ë*å ÍDÊ2OåN##~·õæw#ÍÅ< ñÁúêNÅÍO*ç "ç ëáÃêNë*é ÍDÂOy•_xœW `i"é É*é ëÍDÊ\Oå##~·õæw#ÍÅ2 : ·ÂsS:ç2ÂÿR¯2 2 *å DM*Û "ç *¾ #ë* "¾ ÍDÂUP `i"é * |µë*½+ÊÍÍÒõ `iÃÍÃÍQ+Í2ÊàPÍåÍÊÐPÍc1ÍèF*' #^#Vþ °Pr+s+5ÍGGá+Í2ÊàPþ;ÊÅPÍD,+Í2>,Íÿ@Ã�P>"Íÿ@ÍGG>"Íÿ@óPå*·|µÊ Q~þ QÍ´\}“o|šgþÿÒ Q>?QÂÒ ÑzÅÕÍáWÑÁÅõ ÍÆZñ"Ê Ú2Y{·Â2Y!*~þ Â2Y6B#6A#6Sá"·å#! w# Â=Y66ÑÕ͵Wáå~þÂnYÕÍÑÍ<ÊÞ ÃƒYÍ<ƒYÑÕþÂÆ ÃbYÑÕ!%¯w#w#w#wá~þʤYþÂýCÍ~W*Ê É) €p# ªYÃýCÀÍTÃÀåÍTÍõ Íñ_ÍáÉÍáWå€Í!ÕÍ<ÑÕõÄñÑÊÆ ÍáÉ Zå!!6# Í�ZáÄáW¯2-å!"Í‹Z!*Í‹Z€Í!ÍþÿÊÆ 懇‡‡‡O!�  ~#Íÿ@yþÂ`Z~þ Ê]Z>.Íÿ@ ÂJZ:ˆ Æ W:³ºÚyZ> Íÿ@Íÿ@ÜQB!ÍþÿÂ:ZáÉ~þ*À6?# Â�ZÉÕOÅÍÁÑõ!!4¯Z#4¯Z#4yþ"ÂÄZñ·ÈþÊÞ þ>È<ÉñÉþÀ+Í2Õ€ÊÙZÅÍCÁå* ÍDÚJ!© s#r¯#wÂíZáÑÉö¯2g]Í0QþÂà Åå!­ ^#Vã~þ,ÌC+Í2Âì ã{²ÊØ +s#ráÁåÅ!° ¯w#w!© ~#foëÕå!€ÍDáÂM[Ë[BK>ë!å)ãÒ`[)#Ãa[)ãë)ëÒo[ ãÒn[#ã=ÂV[}æ_Á}la)ÚJÒ†[#x·ÂJ"a]áÁå!² "c]!) "e]áå!€}“o|šgÑÕÍDÚµ[bk:g]·Êù[€ÍDÒÊ[åÍ\áÅDM*e]ë*c]ÍM\"c]PYÁÍ\á}“o|šgµå*a]#"a]˜[ááÉåÍ\áÅDM*c]ë*e]ÍM\ë"c]PYÁÃà[ö¯2ÃÅÕå*a]ë!« å~#foÍDás#rÂ<\:÷ÊI\!I\åÅå!& èVáÑÁÉÅ~# x±ÂN\ÁÉñÕÅõDMͶ\ÊÛ Í«\!± ñwõ!( V6þ ʃ\ÆàzÎwñÁÑáÉÕÍ´\ÊÛ Í«\!± ~·ÑáÁÉ!©Ã¦\!° ^#VÉ!° s#rÉDMÍ£\ÕÍ�\ëÑÍDÉÍ2"Ê Í•#ÍÚ\>þÍÀSÍ]ÃýC *½ë*å ÍDÈ!u9}�o|Îg�®õ!$9}€o|Îghangå ió necessarù  withiî  thå CBIOS‚ tï allo÷ useró tï reaä and/oò  writå anù  oæ thå IBÍ standarä sectoò sizes®  Thå CBIOS‚  alsï  supportó singlå  anä doublå sideä drives®  Useró witè doublå sideä  driveó musô uså doublå sideä disketteó iî ordeò tï takå advantagå oæ thå builô  iî  doublå sideä features®  Iæ singlå sideä disketteó  arå useä iî á doublå sideä drive¬  thå singlå sideä parameteró oæ thå CBIOS‚  wilì  takå  precedencå oveò thå  doublå  sideä  parameteró (threå  milliseconä  seekó  anä  extendeä  storage)®   Thå  CBIOS‚ requireó  approximatelù  2Ë  oæ memorù abovå  thå  regulaò  CBIOS‚ supplieä bù Digitaì Research®  Thå sourcå foò thå CBIOS‚ ió iî thå filå 'CBIOS&.ASM'¬  anä thå sourcå foò thå COLÄ anä WARÍ bootó ió iî  thå filå 'ABOOT&.ASM'®  Thå disë parameteò headeró  anä  disë parameteò  blockó  requireä bù CP/Í arå hanä codeä iî thå  sourcå files®  Thå  filå 'DISKS.ASM§ containó macrï librarù  definitionó whicè caî bå substituteä foò thå hanä codeä Íÿ@+|µÂÿPáÍQBÃþ#ÀÅÍ0QÑ»Ê$QþÂà ÍD,ë`i"·ëÉ+Í2þ#Ì2ÍÍŽ _:ç»ÚÉ å!ÇN#F ·áÉÍ@Q!)þÂdQ!² ëÉ>>>õÍÅñÍÚF*¼ Íö(ÃI>>>õÍÇHñ¾ÒJ<#N#fi2Š Ãí(ͪ ,ÂÁQZÃÁQÍQͨ9Í:*ÅÕ;¯W_õÅåÍÆWÚÏ þ ÂÔQÂÄQþ"ÂéQG{þ,xÂéQPXÍÆWÚ7R!… ÿOzþ"yÊ"Rþ åÊWRáþ Â"RO{þ,yÄ�RÍÆWÚ7Rþ Â"R{þ Ê1Rþ,> Ê1R·Ê1RºÊ7R»Ê7RÍ�RÍÆWÒîQåþ"ÊBRþ ÂjRÍÆWÚjRþ ÊBRþ,ÊjRþ ÂbRÍÆWÚjRþ ÊjR*·( 4á6!„ {Ö Ê~RBÍìFáÉÍõÍ2ñõÜÔ.ñÔÍ.áÉ·Èw#ÀÁÃkR¯ÃýXö¯õÍšR:ç2Â+Í2ÊÄRÍD,ÍDRÂì ñ¯2çöñ2Á!€6"ÇÍUC:Â2ç*Å"Ç"·*»#|¥<ÂïR"»ÍÆWÚÅ þþÂS2 ÃS<Â�S*½ë*¾ ªÿ ÍDëÚ\SÍLWw#ÒS"å : ·Ä]ÍÎ##"å !ç~2Â6ÍkC:Â2ç: ·Â7P:Á·Êª ÃÍÍÍ VÃýCÍUCÃCÁÍšR+Í2ÊsSÍSSÃì ¯2ÁÍÆWÚÅ <Êà *·( 4ÃÅ å*·|µB áÃÍœR+Í2ʸSÍD,þPÊÃ\ÍDAß Í•#ÍW]>ÿÍlV*å ë*½ÍDÊSS~#ÕÍlVÑÃÊS V:çÂýSåÅõìSÕÅÉñÁ=òäSáÉÁá~þ,ÀÍ2Å~þ#Ì2Í‹ ãåôSÕéÕůÍÚSÁѯÉÍ0QÊÉ ÖÂà ë!© ~#fo" !"a]|ë²ë Gë~þ,ÀÕÅ͈ õÍDAÍDSͨ9Í:*ñÁãOÕå*a] "a]ë* ÍDÚÛ áÑëq#s#ráÃ:Tö7õͨ9Í:*ÕÍÁãåÅÍÇHFã~OÅåõ#^#V·ÊÿT*½ÍDÒØT*å ÍDÚØTY*é ë*¾ ÍDÚUñyÍ]GáÁãÕÅÍÇHÁÑãÅå#s#rõñá#^#VÁáÕ#^#VëÑy¸ÒíTG�OñÔ UÊU~#ÃôTÁñ®�  ] Âá\ Ãá\ *½ë*å ÍDÈ!$9}€o|Îg‘®õ!u9}�o|Îgñ®€ ÂE] Â] Ã]å*»|¥á<Àõ: ·ÂJñÉÍ>C*½+6*¹^~·Â Rê !0`ù¯2 "¹"Ô * ^#Vë"®B"‰B"Ïë##^#Vë")Bë##^#Vë"åAë##^#Vë"gA Í2B·!ÊÑ]!!""C!þÿ"»¯2¶2‡ 2 2 2­!"¯!€" !� "› ! "o *"™ >2ç!¸^"¹^:»^·Â¼^<2»^!€~·"¹^ʼ^F#~+w##Â+^+6"¹^!Í2·Ê¼^þ/Ê_^+6""¹^#þ/Ê_^Í2·ÂP^ü^6Í2þSʦ^þMõÊt^þFÂì Í2ÍD:ÍñÊ“^z·ÂJ{þÒJ2çØ^ë"™ ë+Í2ʼ^ÍD/Ãd^Í2ÍD:Íë" ëØ^+*™ åá+"™ +å:ç!|]"ÅÇ2ç<©ës#r#ë å* ² DMá=ÂÛ^#"½"Ô Ñ{•ozœgÚC·|g}oÂ_|þÚ_!{•ozœgÚC"™ ë"¹"¾ ù"Ô *½ëÍC}“o|šg++å!…_ÍDGáÍT1!y_ÍDG!DG"» ÍQB!¢ "Ãh] Owned by Microsoft Bytes freeBASIC-80 Rev. 5.2 [CP/M Version] Copyright 1977, 78, 79, 80 (C) by Microsoft Created: 14-Jul-80 åååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå7 versionó iæ desired. Thå  twï  fileó 'BIOS.COM§ anä 'CBIOS.COM§ arå  exampleó  oæ disë anä terminaì I/Ï routineó supplieä bù Digitaì Reasearch. MOVCPM Thå  'MOVCPM.COM§  featurå oæ CP/Í caî bå useä  tï  directlù relocatå thå COLÄ anä WARÍ booô programs¬  thå CBIOS‚ ¬  anä CP/M® Iæ modificationó arå donå tï anù oæ thå above¬  thå  'MOVCPM.COM§ prograí  wilì relocatå alì buô thå modifieä portions®  Follo÷ thå procedureó  oî  thå nexô pagå iæ anù oæ thå  abovå  programó  arå modified. Iæ á relocateä CP/Í prograí ió createä usinç thå command: movcpm xx thå relocateä CP/Í wilì begiî executing®  However¬  thå relocateä CP/Í  ió highlù unstable®  Iî particular¬  iæ á warí booô occurs¬ thå  systeí  maù noô rebooô properly®  Thió ió noô á buç  iî  thå Š'MOVCPM.COM§ program¬  buô ratheò á functioî oæ thå originaì  anä relocateä CP/M's®  Iô ió recommendeä thaô thå followinç procedurå bå useä instead: movcpm xx * sysgen cold boot  caî eraså  thå datá oî thå harä disë anä iô caî noô bå recovered®  Iæ Šyoõ havå tï formaô thå disë thinë abouô whaô ió oî thå harä  disë when you use the 'D' option for formating. Yoõ  shoulä takå notå thaô iæ youò floppieó havå beeä  addeä tï  youò  systeí viá thå INSTALÌ prograí oò thaô theù arå  driveó C:¬  D:¬  oò abovå theî thå CP/Í drivå numberó havå nothinç tï dï witè FORMT£ anä thaô drivå Á wilì alwayó bå thå firsô floppù disë drive. RECONFIGURING A SYSTEM Tï  reconfigurå thå CP/Í systeí foò youò particulaò hardwarå thå  'CBIOS&.ASM§  anä 'ABOOT&.ASM§ fileó shoulä bå  modifieä  tï meeô  youò  requirements®  Manù parameteró oæ thå  Cbioó  caî  bå modifieä bù changinç thå valuå oæ certaiî keù variableó whicè arå useä durinç thå assembly®  Foò examplå thå labeì MSIZÅ ió useä tï adjusô thå memorù sizå oæ thå reconfigureä CP/M¬  thå labeì FIRSÔ is used to specify the ordering of the disk drives, etc. Oncå thå 'CBIOS&.ASM§ anä 'ABOOT&.ASM§ fileóH. -Ediô thå 'ABOOT&.ASM§ file¬  makå surå thå followinç labeló have these values: MSIZE = 48 Specifies 48K of memory. FIRST = 1 Specifies Discus Hard Disk drive precedes the Disk Jockey 2D drives. MAXHD = 1 Specifies one Discus Hard Disk drive. MAXFFLOP 2 Specifies 2 Disk Jockey 2D drives. HDORG = 50H Discus Hard Disk I/O ports begin at 50H. ORIGIN = 0F800H Disk Jockey 2D begins at 0E000H. -Assemble the 'CBIOS&.ASM' file: A>MAC CBIOS& -Assemble the 'ABOOT&.ASM' file: A>MAC ABOOT& -Finä  thå valuå oæ thå labeì 'OFFSETB§ iî thå  'ABOOT&.PRN§ file. A>TYPE ABOOT&.PRN Watcè foò thå labeì 'OFFSETB§ tï bå printeä oî thå  console¬ record the value, 0D00 in this example. -Finä  thå valuå oæ thå labeì 'OFFSETC§ iî thå  'CBIOS&.PRN§ file. A>TYPE CBIOS&.P the system. This will insure that the newly relocated CP/M is stable. Foò useró witè thå Discuó Harä Disë System¬ thå 'MOVCPM.COM§ prograí relocateó thå CBIOS‚ anä BOOT‚ foò thå Harä Disë version¬ NOT‚ foò thå floppù version. ASSIGNING DENSITY Useró familiaò witè thå Lifeboat/Morro÷ Designó 2Ä CP/Í Ver® 1.´  whï  arå accustomeä tï usinç thå 'DENSITY.COM§ prograí  wilì appreciatå  thå  automatiã  determinatioî oæ  thå  densitù  oæ  á diskette®  Therå ió nï neeä tï inforí CP/Í Ver® 2.² aheaä oæ timå oæ thå densitù oæ á diskette®  Jusô inserô thå diskette¬ thå resô ió alì takeî carå of. Carå musô bå taken¬  however¬  wheî removinç oò replacinç á diskettå  whicè haó alreadù beeî accesseä bù CP/M®  Á disë  reseô operatioî shoulä bå performeä bù bù doinç á warí boot¬  oò makinç á  BDOÓ  calì  tï reseô thå disë systeí (seå thå  CP/Í  interfacå guide). Aó theså ne÷ featureó havå beeî addeä thå sizå oæ thå  Cbioó haó  growî tï thå poinô wherå thå v havå beeî editeä anä  reassembled¬   thå  followinç  procedurå  maù  bå  useä   tï incorporatå thå ne÷ driveró intï CP/M: -Typå  "TYPÅ ABOOT&.PRN"¬  watcè foò thå labeì "OFFSETB¢ iî thå listing¬ anä recorä itó value. -Typå "TYPÅ CBIOS&.PRN"¬  watcè foò thå labeì "OFFSETC¢ iî  thå listing¬ anä recorä itó value. -Typå  "MOVCPÍ xø *"¬  wherå xø representó thå memorù size¬  iî kilobytes¬ oæ thå desireä system. -Type "SAVE 47 CPMxx.COM", with xx as above. -Type "DDT CPMxx.COM", with xx as above. -Type "IABOOT&.HEX". -Type "ROFFSETB", with OFFSETB value from the step above. -Type "ICBIOS&.HEX" -Type  "ROFFSETC"¬with OFFSETC value from the steps above. -Type control C (^C) to return from DDT to CP/M. -Typå "SYSGEN". CP/Í wilì requesô thå namå oæ thå sourcå drive®  Answeò  bù pressinç  returî (aô thió poinô thå sourcå foò thå ne÷ systeí ió iî RAÍ memory¬ noô oî thå disë wherå yoõ wanô it). -Typå  thå destinatioî drive-- Á througè RN Watcè  foò thå labeì 'OFFSETC§ tï bå printeä oî thå console¬ record the value, 7600 in this example. Š -Relocate the CCP and BDOS parts of CP/M: A>MOVCPM 48 * -Save the system image on the disk: A>SAVE 47 CPM48.COM -Load the system image into memory with DDT: A>DDT CPM48.COM NEXT PC 3000 0100 -IABOOT&.HEX -R0D00 NEXT PC 3000 0000 -ICBIOS&.HEX -R7600 NEXT PC 3000 0000 -^C A> -Now, write the system image out to the disk: A>SYSGEN Answeò  thå firsô questioî askeä witè á return¬  thå systeí imagå ió  iî memory®  Answeò thå seconä questioî witè  thå  destinatioî drive for the new system. -Reset the system and do a COLD BOOT. SINGLE COMMAND Thå prograí 'SINGLE.COM§ ió oæ interesô mainlù tï thoså useró whï  havå onlù á singlå drersioî foò thå doublå  densitù controlleò caî nï longeò fiô oî thå firsô twï trackó iæ formatteä iî  singlå density®  Thió meanó thaô yoõ caî onlù booô uð witè á diskettå thaô haó beeî formatteä witè 102´ bytå sectors. FORMATTING A DISKETTE Thå commanä filå 'FORMT#.COM§ wilì format¬  oò initialize¬  á floppù diskettå iî anù IBÍ standarä format® Typinç FORMT# wilì  executå á prograí thaô wilì inquirå thå sectoò  sizeº  128¬ 256¬  512¬  oò 1024¬ tï bå formatted¬ anä thå drive-- A¬ B¬ C¬ oò D-- wherå thå initializatioî wilì takå place® Thå drivå specifieä reflectó  thå floppù driveó only¬  nothinç  else®  Sï  formattinç drivå  'A§ formató thå firsô floppù connecteä tï thå Disë  Jockeù 2D®  Formattinç  á  diskettå  wilì  automaticallù  writå  sectoò headeró foò thå selecteä sectoò size® Iæ iô ió desireä tï formaô thå harä disk¬ thå prograí 'FORMATHD.COM§ shoulä bå used. CAUTION Yoõ  musô uså cautioî witè thå FORMATHÄ prograí aó thióP®  Bå  carefuì  abouô whicè driveó (Harä Disë oò Floppy© arå driveó A, B¬ etc¬  aó thió step destroys the original CP/M on the destination drive. Š -Reset the system and do a COLD BOOT. Aó aî examplå oæ thå relocatioî procedure¬  thå followinç ió á samplå configuratioî foò á Cbioó witè 48Ë oæ memory¬  thå  Disë Jockeù 2Ä aô 0F800H¬ thå Discuó Harä Disë aô 50H¬ anä Disë Jockeù 2Ä I/O. -Ediô thå 'CBIOS&.ASM§ file¬  makå surå thå followinç labeló have these values: MSIZE = 48 Specifies 48K of memory. FIRST = 1 Specifies Discus Hard Disk drive precedes the Disk Jockey 2D drives. MAXHD = 1 Specifies one Discus Hard Disk drive. MAXFFLOP 2 Specifies 2 Disk Jockey 2D drives. IOTYPE = 3 Specifies Disk Jockey 2D I/O. HDORG = 50H Discus Hard Disk I/O ports begin at 50H. ORIGIN = 0F800H Disk Jockey 2D begins at 0F8008ivå system®  Itó purposå ió  tï  allo÷ theså useró tï copù CP/Í fileó betweeî diskettes® Useró witè duaì drivå   systemó   caî  perforí  sucè  copieó  fasteò   anä   morå convenientlù simplù bù usinç PIP. 'SINGLE§  operateó  bù interceptinç CP/Í calló tï disë  drivå selecô  routines®  Ratheò thaî selectinç á NE×  drive¬  'SINGLE§ promptó  thå useò tï placå aî "A¢ oò "B¢ diskettå intï  Drivå  A® Iî otheò words¬  'SINGLE§ turnó Drivå Á intï á logicaì duaì drivå system®  Thå  user¬  however¬  musô keeð tracë oæ whicè diskettå haó beeî designateä thå "A¢ diskettå anä whicè thå "B¢  diskette® Aó aî example¬  tï copù á filå froí drivå  tï drivå A¬  givå the command: Š SINGLE S tï  begiî  operatioî  iî  singlå modå (thå "S¢  argumenô  ió  foò Start)®   Thå  prograí  wilì  responä  thaô  'SINGLE§  haó   beeî installed¬  anä  returî  tï CP/M®  Anù operatioî  thaô  involveó changinç  driveó wilì no÷ resulô iî á prompô tï placå thå "A¢  oò "Brä caî reaä iô (thå DJ1Ä doeó noô utilizå thå  179± controlleò chip© buô thå Disë Jockeù 2Ä cannot. Essentially¬  thå  'REGEN§ prograí readó á completå tracë  oæ datá  anä  formaô  informatioî  intï  memory¬   filteró  ouô  thå formatting¬  re-formató  thå  tracë anä theî re-writeó thå  data® Thió  procesó  ió  repeateä untiì thå  wholå  diskettå  haó  beeî regenerated®  Thå  originaì  diskettå  ió botè  thå  sourcå  anä destinatioî diskette¬ anä musô thereforå bå writå enabled. Thå  finaì  resulô shoulä bå á singlå densitù  diskettå  thaô ió  readablå  botè oî thå machinå thaô originallù produceä iô  aó well as on the Disk Jockey 2D controller. Simplù typinç 'REGEN§ wilì invokå thió program® Iô haó enougè promptó tï explaiî itó use. FIRMB Thå  filå 'FIRMB.ASM§ containó thå firmwarå sourcå foò  Disë Jockeù  2Ä  Modeì  controller® BOOTHD Thå  prograí  'BOOTHD.COM§ containó á booô strað loadeò  foò � thå Discuó Harä Disë contÃÎÉÉ(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE) COPYRIGHT (C) 1979, DIGITAL RESEARCH, PIP VERS 1.5$$$ SUB =.:,<> _[]INPIRDPTRUR1UR2RDROUTLPTUL1PRNLSTPTPUP1UP2PUNTTYCRTUC1CONNULEOFDISK READ ERROR$DISK WRITE ERROR$VERIFY ERROR$NOT A CHARACTER SINK$READER STOPPING $NOT A CHARACTER SOURCE$ABORTED$BAD PARAMETER$INVALID USER NUMBER$RECORD TOO LONG$INVALID DIGIT$END OF FILE, CTL-Z?$CHECKSUM ERROR$CORRECT ERROR, TYPE RETURN OR CTL-Z$INVALID FORMAT$HEX$$$$NO DIRECTORY SPACE$NO FILE$COM$START NOT FOUND$QUIT NOT FOUND$CANNOT CLOSE DESTINATION FILE$DESTINATION IS R/O, DELETE (Y/N)?$**NOT DELETED**$$$$$$$NOT FOUND$COPYING -$REQUIRES CP/M 2.0 OR NEWER FOR OPERATION.$UNRECOGNIZED DESTINATION$CANNOT WRITE$INVALID PIP FORMAT$CANNOT READ$INVALID SEPARATOR$1ò€Å€ÌÍ :ÌÖÖŸ2¥ÍLë> Í„ÒýMÍ9ÍÍ ¢  diskettå  intï Drivå A®  Iî ouò example¬  thå "B¢  diskettå woulä  bå  thå onå witè thå filå whicè wå wisè tï copù  ontï  thå systeí diskette® Onå coulä no÷ type: PIP A:DEST.FILE=B:SOURCE.FILE[V] Dependinç  upoî thå lengtè oæ thå filå tï bå  transferred¬  á faiò  numbeò  oæ requestó tï placå thå "A¢ oò "B¢  diskettå  intï Drivå  Á  wilì  appeaò untiì thå copù ió  completed®  Aî  entirå systeí  disë coulä alsï bå backeä uð thió way®  Firsô  onå  woulä formaô thå destinatioî disk® Next¬ thå command: PIP A:=B:*.* woulä begiî thå copy® Thió procesó wilì takå manù manù swapó buô wilì  dï  thå job®  Thå numbeò oæ diskettå swapó dependó  oî  thå amounô oæ memorù whicè PIP haó tï use¬  anä oî thå amounô oæ datá tï bå transferred. Iî  general¬  anù CP/Í commanä whicè caî bå useä  iî  regulaò modå caî bå useä whilå iî singlå mode® Therå arå twï exceptions¬ however® Thå 'FORMT#.COM§ program¬ becauså iô makeó direcô calló tï Disroller® 'BOOTHD.COM§ coulä bå programmeä � intï  á PROÍ sï thaô yoõ coulä booô directlù ontï thå harä  diskó � withouô havinç tï botheò witè thå floppies. HDFIRM Thå  sourcå  foò á seô oæ lo÷ leveì driveró foò  thå  Discuó Harä Disë maù bå founä iî thå filå 'HDFIRM.ASM'®  Thå driveró maù bå   useä   bù  applicatioî  programó  whicè  musô  havå   direcô interactioî witè thå harä disk'ó hardware.  Thå  finaì  resulô shoulä bå á singlå densitù  diskettå  thaô ió  readablå  botè oî thå machinå thaô originallù produceä iô  aó well as on the Disk Jockey 2D controller. Simplù typinç 'REGEN§ wilì invokå thió program® Iô haó enougè promptó tï explaiî itó use. FIRMB Thå  filå 'FIRMB.ASM§ containó thå firmwarå sourcå foò  Disë Jockeù  2Ä  Modeì  controller® BOOTHD Thå  prograí  'BOOTHD.COM§ containó á booô strað loadeò  foò � thå Discuó Harä Disë cont2ÀÍ2ü1òÍ@:À2Á!o6+6+6!¦6#6!ó6#6þ:¥ÒG*ÍÍo Í.!N6ÿ:ÌþÂ^*üMÍ^Í!K6!6!¤6+6'Í :©þÂ�Ã$:©þÂÃ:”=2KÍ Í :©þʤÍ\:õÒ·\ÍîÍxÃÀ'ÍîͲÃÛ:©ÖÆÿŸ!õ¶ÒÖÍ\Í¢Í Í :©þÂ͈ÍÆ'Å!Í ÍßͲÃÛ:©þÂ$Í:¨þ ÊÃ$͈ͲÃÛ!N6ÿ'Í :©ÖŸ!õ¶ÒCwͯ !6:©þÂ^Í¢Íc!¨6ÿÃ{:¨ÖŸ/õ>!¨–Ÿ/ÁH±Ò{�ͯ :¨<2£þŠÍÏÍ :©ÖÆÿŸõ:¨Ö=ÆÿŸÁH±Ò®�ͯ !§6:§Ò¾:À2ÁÍ !6:©ÖÖŸõ:õ/ÁH¡Òí͈;!¨6ÿÃ:©ÖÆÿŸõ> !¨–Ÿ/õ>–ŸÁH¡ÁH±Ò°ͯ :^!¶w:¨<2¤:¨þÂ0ÍÏÃ}:¨þÂ@ÍEÃ}:¨ÖŸ!¦ÒS!W6:£þ Âz!]6:cþÂm!c6:_þÂz!_6ÍlÍÍ :©ÖÆÿŸõ:¨Ö,ÆÿŸõ:¨Ö ÆÿŸÁH¡ÁH±Ò°¼ͯ :¨Ö ÆÿŸ2§ó:£þÂÎÍEÍÏ:£þÂÛÍ1:¥2ÌÃûv!òq!òå*8éÉ!ûå*6é: É>úͦ>úͦÉÍÉÍÉ!«q:«æ_ÍÉ Í ÍÉ!­p+qÍ.*¬ë ÍÉ ÍÉ ÍÉ!¯q*¯&ëÍÉ!±p+q*°ëÍ2®É!³p+q*²ëÍ2®É!µp+q*´ëÍ2®ÉÍ2®É!·p+q*¶ëÍÉ!¹p+q*¸ëÍÉ!»p+q*ºëÍÉ!½p+q*¼ëÍ2®É!¿p+q*¾ëë Jockeù 2Ä firmware¬  wilì noô functioî properlù iî singlå mode¬ anä 'MOVCPM.COM§ becauså oæ memorù relocatioî problems. To exit single mode, type: SINGLE E Thió  wilì returî thå useò tï thå standarä CP/Í systeí  (Thå  "E¢ argumenô ió foò End)®  Typinç 'SINGLÅ E' wheî noô iî singlå modå wilì reporô aî erroò anä returî withouô anù changå beinç made¬ aó wilì typinç 'SINGLÅ S' iæ alreadù iî singlå mode. REGEN Thå  'REGEN.COM§  commanä  regenerateó  CP/Í  singlå  densitù disketteó  whicè havå beeî formatteä iî sucè á waù sï thaô iô  ió incompatiblå  witè  thå normaì operatioî oæ thå  179±  controlleò chið (IMSAÉ disketteó iî particulaò havå thió problem). Thå  'REGEN§  prograí ió designeä tï bå useä  witè  disketteó whicè  havå beeî formatteä incorrectly-- noô witè disketteó  thaô havå  beeî partiallù destroyed®  Thå besô symptoí oæ á  diskettå Šthaô  coulä  bå useä witè thå 'REGEN§ prograí ió  thaô  thå  Disë Jockeù  1Ä boaå9ÍÉ!Ãp+q*ÂëÍÉÿ ÍÉ!Äq*Ä&ë ÍÉ*ÀMÍ É*ÁMÍ É!Æp+q*Åë!ÍÉ!Èp+q*Çë"ÍÉ!Êp+q*Éë$ÍÉ!Ë6€Ë ÍÉ ÍÉ!kp+q*jëÍÉ> Ó>ÓÛÚª Þ ÛæÉ!qp+qÍ/ *pDMÍ9:Í Í:M2r:N!r¾Úø !Ì:r¾Òñ *r&Í NÍ!r4ÂÐ !Ì6:Í”:®þÿÊ :ͳÍ.ÃÉ!ws+p+q+ÑÁp+qÕ:w=2wþÿÊN *så*uÁ w*s#"s*u#"uÃ' É!"�*MÍ^Í7 !x6:û!x¾Ú¾ *�ë*DM͆ ÍÃ2yþÊ­ :yþÊ— ”ͯ *�"Ÿë*6:û2x÷ €*�"�!x4Âd !"�Í/ É!¡Íj}=2|þÿÂÛ É!"¡*KMÍ^'Í_ !z6:|!z¾Ú1 *¡Ê "}*}DM͆ 'ÍÓþÊ ¤ͯ €*¡"¡!z4Âó :eÒÉ !"¡€Í† !z6:|!z¾ÚÀ 'Í? ÖÖŸ2*H#"H!{6:{Ö€Ÿ!¦Ò¢ *{&€ :{¡åÍ4Ê Á –ÖŸ2!{4Ãm €*¡"¡:Ú¹ µͯ !z4ÂI 'ÍÓ2!"¡É!€q:€þ Úô !ó4>!S¾Òô :S!ó¾Òô É:2�*£M!Ý ^#Vëéÿ¡ÍŽÚ ÍÈ *¡Ê :€w*¡#"¡Ã Ã= Ã= Ã= Ã= Ã= Âͯ à *€MÍæÃ !6€Ãq à !6ÀÃq à !6€Ãq à *€&ëÍà !6à à !6 à à !60à à *€&ëÍà !6ÃÏ Ã !6ÃÏ Ã !6ÃÏ Ã *€&ëÍà . 1 4 7 : = F P [ f q  Š •   ® ¹÷:¨ÖSÖŸõ:¨ÖQÖŸÁH±ÒI:N<2ŸÍò2¨ÖÖŸõ:¨Ö ÖŸÁH±Ú@Ã"Íò2¨Ã�Íò2¨Ö02ŸO> ¹Òc!Ÿ6Ã�Íò2¨Ö02™O> ¹Ú�*Ÿ&ÍOå*™&Á ë!ŸsÃc*ž&P :Ÿw:žþ·>!Ÿ¾Ò±ͯ :Ÿ2ÁÃÂÍò2¨É:¨þ_ÂÎ!¨6=É!£6>'!£¾ÚéÍE!£4ÂÔÉ!©p+q*¨å0Í É!­r+s+p+q*¬~þ$Ê7*¬>¦*ªõ>¦ÁH¹Ê&>É*ª#"ª*¬#"¬Ã>ÉÍ 2¨:ÒR�ŸÍŽŸÉ:¨ÖÖŸÉ!¯6!œ6Í=2µþ:Ê™!œ6:µþ“HÍ9ÍþÂŽ>É!œ6Í-Ãe!µ6Í»2´þÂÇÍ=2´þʺÍ-é:¯ÒÄ>É>ÉÍÄ"·Í»2¶:´ÖÆÿŸ!¯¦Òð!´5Í»2³ÃÓͬ!µ†þÊ\ÍÍ-:¯Ò>É>É!±p+q:¯Ò,!¯6*°DMÍ9É:®Ò<!®6ÍÉ:¯ÒzÍ 2²þÂW!®6ÃD*œ&L :²w:œ<2œþOÚv*Í:²É>ÉÍ=2¹Ö0O> ¹Ú’:¹Ö0É:¹ÖAO>¹Ò¤:Í:¹ÖAÆ ÉÍ}‡‡‡‡õÍ}ÁH±Éͬ!µ†wÉÍ»O`iÍdåÍ»áÍVÉÍ[2ºO>¹Ú2:ºÖÖŸ!X¦Ú!»6:œ!»¾Ú:»=O!L NÍE!»4Âü ÍE ÍE:ºþÂ/ÉÃÚÍ.*œ&L 6$LÍ9kÍ9Í.ÍþÂXÉÃÚÉ�ͯ É*KMÍ^ž0Íý20Å¤Í :0æ20:1æ21¢Íê'ͳ'Íã:®þÿ²¥ͯ !G6!"¡É!ÿÿ"ŸÍ7 *MÍ^ÍnÍ/ :a/õ:ÁH¡Òì!®6ÿ:®þÿÂú¸ͯ !&6NAME prl -- "page reelocatable" format DESCRIPTION Prl ("page relocatable") is a file format for relocatable object code defined in the Mpm users manual. It begins with a 256 byte header: header[0] Octal 375. Not documented by Mpm. header[1 to 2] Program size (low byte first). header[3] Not documented by Mpm. header[4 to 5] Size of any required buffer space (low byte first). header[6 to 255] Currently unused, reserved by Mpm. Next comes "program-size" bytes of binary object code assembled at address 0. Finally comes a "bit map", one bit for each byte of code, beginning with the most significant bit of the map's first byte. A 1 bit indicates that the corresponding byte of code should be relocated by adding to it the most significant byte of the load address. The usual way to make a prl file is to assemble the source code twice, once at 0 and once at 100 hex. Then build the map by comparin Ä Ï :�2É!‚q:‚þ Ê" *‚MÍÐ Ãn :cþÂ4 *‚MÍÐ Ãn :ó2ƒ!c:ƒ¾ÚQ !c:ƒ–2ƒÃ: !ƒ:c–w>!ƒ¾Òn !ƒ5 ÍÐ ÃY :‚þ Â{ !ó6É!„q:„ÖÖŸ!l¦wÒ™  Í Ã¢ :„Æ0OÍ É!…q:…æøOÍ| :…æOÍ| É!†6:]ÖÖŸ2l:o†'2o:nÎ'2n:mÎ'2m*mMÍ£ *nMÍ£ *oMÍ£ :]þÂ:Í  Í Ã Í É*¡}æ2‰€ÿÍD"‡ÍÈ *‡Ê å*‰ëÍ *‰&"¡É!Šq:UÒY:Šþ ÂYÉ:¦Ò©:Šþ Ê©:_2‹þʘ:‹þ€!‹6<:ô<2ô!‹¾Ú˜!ô6 Í >!]¾Ò¤; !¦6:QÒÌ:ŠÖÖŸõ:£ÖÖŸÁH¡ÒÌÍÉ:Šþ ÂÙ!ô6*ŠMÍ :Šþ Âí!¦6É!Œq:ŒÖaŸ/õ>z!Œ–Ÿ/ÁH¡Ò:Œæ_2Œ:ŒÉ!�q:�ÖAŸ/õ>Z!�–Ÿ/ÁH¡Ò8:�ö 2�:�É:¤=O>¹Úm:W!Q¶õÍ} ÁH¡ÒmÍþÂd>É×Í9>É!�6:2Ž*¤M!E ^#Vëéý�ÍŽÚ—ÍO *�ë*~2�*�#"�ÃmÍó2�ÃmÍ– 2�Ãm!6ÃàÃm!6ÃàÃm!6 ÃàÃmÍæ2�ÃmÃÃÃÃÃÃÃÃéͯ Ãm!6Ã2Ãm!6Ã2Ãm!6Ã2Ãm!�6Í2�Ãmˆ­¶¿ÊÕàðóöùüÿ'2:Ž2:TÒ’:£2Ž!£6*�MÍE:Ž2£:�ÒÜ:Ò²:§<2§ÖÖŸ2�ý:�Ö ÖŸ2�:�ÒÜÍ} ÒÜÍþÂÖ>Éͯ :iÒë:�æ2�:dÒú*�MÍîÉ:[Ò ÀÍý2*ý"�É>!b¾Ò!Äͯ >!`¾Ò0Ôͯ É!¼q:¼ÒE:24ÃJ!46*¡}æþÊa!44ÍEÃJÍÍÈ *KMÍ^'Í�:®þÿ‚ãͯ ¤Íê!36'Ín:®þÿÊé:0Òã:fÚÕÍ9ÍOÍîþYÊÒ#Í9Í.3Íê'ͳÉÍ.:0æ20'Í 'ͳ'Å7Í 6Íê'ÍöÉ!ÿÍj>ÿÍA+ë!ûsÉ!Ê"@ÿÍ“Ú1!€"ÿÃ<*ýë*ÿ"ÿÍÉÊÍ“åÍnÊ "ÿáÍDÍn"ý"ÿÍÉ:¤ÖÆÿŸ!Q¦2½Ò‚Í:X!W¶Ò“ÍÚäÍ:Ú¤*¨MÍEÓ:½Ò±ÍÍ@ÉÍ@:O2MÍc;!¾6#6>!¿¾Ú)*¿&P ~þÊ":¿ÖÖŸõ:¿ÖÖŸÁH±õ:¿ÖÖŸÁH±õ:¿ÖÖŸÁH±õ:¿ÖÖŸÁH±Ú"!¾6!¿4ÂÉ:¾Ò_ÍÍjÚYÍO ÍjÒM*Ÿ"¡ÃS*ÿ"¡ÍÈ Ã3Í@ÃbÍl*¾MÍ1ÉÿÿŸÍ“µÆÿŸÉ!"À"ÄÍ7 *MÍ^€Í† \Í”!"Â:®ÖÿÆÿŸÀÂõÍŽŸÁH¡ÒÄ*Â#"ÂͧÃ�Í/ :®þÿÂå>ÄÍ›µÂá9ͯ Í.É*Â#"À:®æ‡‡‡‡‡_!€å'Í !'6!36'ÅÍ :1/!a¶ÒE*Ä#"Ä>ÍzµÂ?CÍ9ÍIͲÃ�ÉÍ.!Æ6> !ƾڇ*Æ&' ~2Çþ Ê€:Æþ Ây.Í*ÇMÍ!Æ4ÂQÉ>!”¾Ò›:”=2á:ü2É:öÒ¬Í\>!”¾Ò¿:”=2KÃÅ:ü2KÉ!À:Á¾ÊÑÉ!:K¾ÂÞÍ\ÉÍ:¨þ ÊíÍ\É!Ép+q͈ÍßÅ*Èg the bytes one-for-one, setting the corresponding bit to the difference. If two bytes differ by more than 1, then some non-relocatable construct has been used. BUGS The load address must be on a page boundry (multiple of 256). prl.doc 8/5/80 gf ruct has been used. BUGS The load address must be on a page boundry (multiple of 256). åååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå*�MÍÉ:�É>!ú¾Ò(:ú=2úþÂ%> É>É>!ø¾ÒF!ø5+N!Í ~2‘!÷4ÉÍ<2‘þÂT>É>!b¾Ò}*bMÍ­Òz:b2÷!b6:ù<2øé>!`¾Ò¥*`MÍ­Òž!`6!ú6> É:‘Éé:‘ÉÃ(É!’q:ù!’†wO!Í ~2“þÂÙ*’&Í :‘w>É!‘:“¾Âê!ù4Ãï!ù6>É:N<2N!̾Ú> É*N&Í NÍîÉÍò2¨þ ÂÃÉ!–p+q!õ6!©6+6 !ª6:ªþ ÒS:ªþ ÂM!¨6ÍgÃ8Í:N2M*¨MÍ8ÒpÍÁ!©6É!”6!—6>!—¾Ú•*—&P 6!—4Âz!ö6!ø6#6#6!ª6*¨MÍ8ÚÚ:ªþÚ¾É:¨þ*ÂÎ͇ÃÑÍgÍò2¨ê:¨þ:¿:”þÊëÉ:ªþÂ,Í¡ÖA<2”O>¹ÒÉÍ*¨MÍ8Ò):¨þ[Âͱ!N5!©6Éñ:ªþÊ5É!¡6ÿ#6>!¢¾Ú°! 6: <2 O>‘Ÿ/õ: !¡†O!T å* MÍ¡á–ÖŸÁH¡Ò~ÃK: þ¡!©6Íòþ[–ͱ!N5:¢2¨É:¡Æ2¡!¢4Â=É:¨þ[¼ͱÃ4:ªþÂÈÉ!ª6:¨þ.ÂÍò2¨OÍ8Ú:ªþ ÚìÉ:¨þ*Âü ͇ÃÿÍgÃÕ:¨þ[ ͱ!N5!©6:”þÂ%:ü<2”*•6 *• 6ÉÃ¥É!šq!›6> !›¾Úd*›&I :š¾Â]>É!›4ÂA>É:ª<2ªO*• :¨w:¨þ?†!õ6É!œq!¨6?!œ:ª¾Ò ÍgÃ�É!�q*�&ë*•~É!ö6:À2ÁÍò2¨:¨Ö ÖŸõ:¨Ö]ÖŸÁH±Úº:¨ÖA2žO>¹Ò:¨þ ÂúÍò2¨Ãͯ DM!Í ÍÆÉÍ :©ÖÖŸõ:¨Ö=ÖŸÁH¡Ú-Í\:N2OÉë_ë…oŒgÉ_{¥oz¤gÉ^#Vë)å))Á É_{µoz´gÉ^#Vë) ÂdÉ^#Vë|·g}o ÂnÉ_{•ozœgÉO{‘oz˜gÉi`N#F‘o˜gÉo&•oœgÉ H ©=¨Éåååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå:*ùÍÅÍ®?!9N#FÕ#^#V#~#foÍ"ÑPkb"ÏPi`"ÍPÑO‡ŸGÉÕ!9^#V#N#F#~#foå*+++{þÑõÍ]O‡ŸGñÑÀMDÉé>w‡Ÿ#w!†V—–>#žÒ& *ŠV> ¾ò` *ŠV~þò` !†V—–>#žÒz *ŠV~þ-Â!ôÿ>w‡Ÿ#w*ŠV#"ŠV:†VÖ2†V:‡VÞ2‡VÃz :†VÖ2†V:‡VÞ2‡V*ŠV#"ŠVà ! ~þˆ #~þÂ&:†VÖ:‡VÞÚ&*ŠV~þ0Â&*ŠV ~þAúÐ *ŠV >Z¾úÐ *ŠV ~O‡ŸG! MDÃÜ *ŠV ~O‡ŸGyþxÂå xþÂ&*ŠV##"ŠV:†VÖ2†V:‡VÞ2‡VÃ&*ŠV~þ+Âz *ŠV#"ŠV:†VÖ2†V:‡VÞ2‡VÃz !†V—–>#žÒ^*ŠV~þ0úØ*ŠV>9¾úØ!öÿå*ŠV~O‡ŸG!Ðÿ Á}|Ãí*ˆVå!ôÿ~#¶Ê~!øÿN#F>‘O>˜GÃ…!øÿN#Fáywx#w!†V—–>#žÒ”*ŠV~þAúº*ŠV>Z¾úº*ŠV~O‡ŸG! MDÃÂ*ŠV~O‡ŸGyþlÂËxþ”*ŠV#"ŠVÔ*ŠV~þaú2*ŠV>z¾òDÃ2!øÿå!øÿN#FÅ! N#FÅÍJJáå!öÿ~#foãÁ Á}|:†VÖ2†V:‡VÞ2‡V*ŠV#"ŠVÃ&*ŠV~þAú^*ŠV>Z¾ú^!öÿå*ŠV~þAúl*ŠV>Z¾úl*ŠV~O‡ŸG! MDÃt*ŠV~O‡ŸG!©ÿ Á}|!öÿå! Á – #žúíÃ^*ŠVå!òÿÁy–Ox#žGöHÍO!å!N#FÅ!å!.>åÍRññññÃ"OÍO!N#FÅ!N#FÅ!ÓPåÍ¿ ñññÃ"O can't write can't read Í H!ùþ9ù!tÿå!óþÁ}|!€"†V!öÿå*†Vå*†V#"†VáÁ~‡Ÿ!öÿ—–>#žòk!öÿ—–>#žòó*†V> ¾ò*†V~þúóÃ!øÿ>w‡Ÿ#w!vÿywx#w!óþ"ˆV!tÿ:ˆV¾Â™:‰V#¾Ê°*ˆV~þ<ÂÏ!åÍ�6ñ!å!å*ˆV åÍgñññy°ÊU!å!øå*ˆV å!úå!åÍÐ! 9ù!åÍ®?ñÃU!öÿ—–>#žú|ù*ˆV~þd‡!Òÿå!ÖÿÁ}|!öÿå!ôÿ>–>#žò7Ã>!ôÿN#FÅ!å! ~#fo >+F+NÅ=ÂQ!ÖÿåÍ¢!9ùáywx#w! å! ~#fo Á}|ù*ˆV~þcÊ«*ˆV~þsÊ«*ˆV~þiÊ«!Ôÿ~·Êí!Ôÿ~þaÂ!Òÿå! N#FÅ! ~Æw#~ÎwáÁ}|*ˆV~þcÂO!öÿ>w‡Ÿ#wÃÕ!Òÿ:ˆVw:‰V#w!öÿ>w‡Ÿ#wù!öÿå! N#FÅ! ~Æw#~ÎwáÁ~#~*ˆV~þc¤!†V—–>#žò¤!öÿ~æÿw#~æwä!öÿå!Òÿ~#foÁ~#~!Öÿå!öÿN#FÅ!åÍìIáÁ}!×ÿå!öÿÁ~!Òÿå!ÖÿÁ}|!öÿ>w‡Ÿ#wÃÕ!Òÿå!ÖÿÁ}|!öÿå*†Vå!öÿN#FÅ!ÖÿåÍÓ+ñññáywx#w*ˆV~þcʹ*ˆV~þsʹ*ˆV~þiʹ:ˆVÖ2ˆV:‰VÞ2‰Vù!öÿ—–>#žò6!öÿN#FÅ!ÒÿN#FÅ!N#FÅ!~#foÍ!Oñññ!øÿ~#¶Â†!öÿå!òÿÁ – #žò†!å!Õÿå!N#FÅ!~#foÍ!Oñññ!òÿ~Öw#~ÞwÃ@ÍO!N#FÅ!å!N#FÅÍO2ñññÃ"OÍ H!ëÿ9ù!~#fo"ŠV!å!lVåÍrDòù!å!åávV~Õ#~Â×Ñ!vVåÍzGÍÒGñ*ŠVå*ŠV#"ŠVá6-!öÿå!~#foå!~#foãÁ Á}|!öÿ>–>#žò1!öÿ>w‡Ÿ#w!øÿå!öÿ~#fo#å! >+F+NÅ=ÂJ!åÿåÍí,! 9ùáywx#w!øÿå!öÿN#FÅ!öÿ~#fo#å!åÿåͯ5ñññá~�w#~ˆw>2†V‡Ÿ2‡V!öÿ:†V–:‡V#žòì!:†V–:‡V#žÒì*ŠVå*ŠV#"ŠVáå!åÿå*†VãÁ Á~*†V#"†V!øÿ~Öw#~ÞwÚ!—–>#žÒe*ŠVå*ŠV Éyz{|}~€ó¡¢£¤¥¦§¨ó¡¢£¤¥¦§¨TOO MANY BAD SPOTS sectorheadtrackÍOõõõõ!N#FÅ!N#FÅÍsññi`"]*]åÍÅñy°ÂZÍ®?!å!ÿ##N#FÅ+++N#FÅ!åÍ8"ññññx·ò‹>2ý‡Ÿ2þÕ>2ý‡Ÿ2þ!øÿ^ywx#w!øÿ]~‘#~˜Òæ!øÿ~#foå*«####N#FÅ!å!#åÍ• ñññáyw~O‡ŸGyþÿÂãxþÿ !øÿ]~¹Âõ#~¸ÂŒ!åÍ®ñ!øÿ~Öw#~ÞwÃŒ!øÿ~Æw#~Îwá!øÿ~#fo#å*«##N#FÅ!å!åÍ• ñññáyw~O‡ŸGyþÿÂRxþÿÊæ!øÿ~#fo##å*«N#FÅ!å!åÍ• ñññáyw~O‡ŸGyþÿ†xþÿÂÃæ!øÿ~#fo6ÿͳÃ"Owrite error on badmap ÍO!ôÿ9ù*]å!åÍ ññ!å!åÍ2ññ!øÿ^ywx#w!öÿ>w‡Ÿ#w!öÿ~Ö#~ÞòG*« å!öÿ~#fo)ãÁ N#FÅ!!åÍ2ññ!øÿN#FÅ!$åÍ2ññ!*åÍ2ñy°ÊJ!œåͧñÍ®?ÃJÃ"O!øÿ~Æ€w#~Îw!öÿ~Æw#~ÎwÃ쌆¡ÍO!~#foMD!gÃNÃ"O!~#fo##N#FÅÍõ ñÃ"OÍŒ Ã"Odrive %ac is not a hard disk ÍOõõõõ!N#FÅ!åÍ ññ!åÍ ñ!øÿ:ÑPw:ÒP#w!i"«!«:«•:Ãk!öÿ~Öw#~Þw*†V#"†VÃI!öÿ—–>#žò•*†V> ¾ò•*†V~þò•!tÿN#FÅ!tÿ~Æw#~Îwáå*†V~þAús*†V>Z¾ús*†V~O‡ŸG! MDÃ{*†V~O‡ŸGáyw!öÿ~Öw#~Þw*†V#"†VÃ!tÿN#FÅ!tÿ~Æw#~Îwá6Ã<!vÿå!øÿN#FÅÍ)ññöH*ˆV#"ˆVÉ*ˆV~þ>Â-!åÍ�6ñ!å!å*ˆV åÍ‚ñññyþÂÿxþÊU!å!éå*ˆV å!ëå!åÍÐ! 9ù!åÍ®?ñÃU!øÿN#FÅ!øÿ~Æw#~Îwá)å!vÿãÁ :ˆVw:‰V#w*ˆV~·ÊÅ*ˆV#"ˆVÃUÍO!N#FÅ!~#¶Ê‚Ã…Å!N#FÅÍO2ñññÃ"OÍO!N#FÅ!ÛRåÍ%ññÃ"OÍO!å!N#FÅ!ÛRå!×&åÍRññññÃ"OÍ H!"ŠV*ŠV~#¶Ê*ŠVN#FÅÍ"ñÅ*ŠVN#FÅ!N#FÅÍ.>ñññ*ŠV##"ŠVÃÚöHÍ H!ÿÿ9ù!~#fo"ŠV!ùÿå!Á~!~#fo"ˆV*ˆV"†V!ŠV—–>#žÒr*†Vå!ùÿÁ ¾Ê…*ˆVå*ˆV#"ˆVáå*†VÁ~Ã…*ˆVå!Áy–Ox#žGöH:ŠVÖ2ŠV:‹VÞ2‹V*†V#"†VÃBÍ H!~#fo"ŠV!~#fo"†V!~#fo"ˆV*ŠV~þnÊÕ*ŠV~þNÂ*ŠV#"ŠV*†Vå*ˆVN#FÅ*ˆV~Æw#~Îwá~#foÁ}|*ŠVMDöH*†V>w‡Ÿ#w*ŠV~þ0úþ*ŠV>9¾úþ*†Vå*ŠV~O‡ŸG*†V~#foÅMD)) )Á Ðÿ Á}|*ŠV#"ŠVÃÍ H!Øÿ9ù!~#fo"ŠV*ŠV"ˆV*ˆV~·Ê“*ˆV~þ%Ê“*ˆV#"ˆVÃk*ˆV "ŠVÃe!ˆV:ŠV–:‹V#žÒÌ*ˆVå!ŠVÁy–Ox#žGÅ*ŠVå!N#FÅ!~#foÍ!Oñññ*ˆVå*ˆV#"ˆVá~·ÂàöH!øÿ>w‡Ÿ#w!Õÿ6 *ˆV~þ-Â!!øÿ>#"ŠVá6.>2ˆV‡Ÿ2‰V!:ˆV–:‰V#žÒ©*†Vå*ˆVãÁ å!öÿÁy–x#žò©*ŠVå*ŠV#"ŠVáå!åÿå*†VãÁ Á~*†V#"†V*ˆV#"ˆVÃ*ŠVå*ŠV#"ŠVá6e!øÿ#~·òÑ*ŠVå*ŠV#"ŠVá6-!øÿå!øÿ~#fo>•o>œgÁ}|Ãß!:ˆV–:‰V#žÒe*ŠVå*ŠV#"ŠVá60*ˆV#"ˆVé*ŠVå*ŠV#"ŠVá6+*ŠVå*ŠV#"ŠVáå!øÿN#FÅ! åÍIá0 Á}*ŠVå*ŠV#"ŠVáå!øÿN#FÅ! åÍLIá0 Á}*ŠVå!Áy–Ox#žGöHÍ H!ëÿ9ù!~#fo"ŠV!~#fo"ˆV!å!lVåÍrDòœ*ˆVå*ˆV#"ˆVá6-!å!åávV~Õ#~ˆÑ!vVåÍzGÍÒGñ!åÿ"†V!øÿå!å! >+F+NÅ=¶*†VåÍí,! 9ùáywx#w!öÿå!øÿ~#foå*ŠVãÁ Á}|!öÿ>–>#žò!öÿ>w‡Ÿ#w!øÿå!öÿN#FÅ!å!åÿåͯ5ñññá~�w#~ˆw!å!øÿÁ – #žòg!øÿ~#foå!Áy–Ox#žG*†V "†V!øÿå!Á~#~!øÿ—–>#žúŸ*ˆVå*ˆV#"ˆVá60!ŠV—–>#žòû*ˆVå*ˆV#"ˆVá6.Ãû!øÿ—–>#žò‚*ˆVå*ˆV#"ˆVáå*†Vå!åÿÁy•OxœGyÖxÞÒå*†Vå*†V#"†Vá~O‡ŸGÃè0áyw!øÿ~Öw#~Þwß!øÿ#~·ò? !ŠV—–>#žò? *ˆVå*ˆV#"ˆVá60!øÿ~Æw#~Îw:ŠVÖ2ŠV:‹VÞ2‹VÃû!ŠV—–>#žò� *ˆVå*ˆV#"ˆVáå*†Vå!åÿÁy•OxœGyÖxÞÒ„ *†Vå*†V#"†Vá~O‡ŸGÇ 0áyw:ŠVÖ2ŠV:‹VÞ2‹VÃ? *ˆVå!Áy–Ox#žGöHbad getl call Í H!~#fo"ŠV!~#fo"†V!ŠV~#¶Âû !å!° å!åÍ.>ñññ!åÍ®?ñ>2ˆV¬œÒK *«##~#fo#å*«N#FÅÍJJá))å!øÿ~#foÁy¾Â0 x#¾Âg !øÿ~#fo ~#¶Âg Ã"O!~#foA å!§åͧññÃ"O*«}Æo|Îg"«Ãønumberbad%p %p %p %i %p? ÍOõõõõ!ý~#¶Ê¾ !N#FÅ!� åÍ®ññ!ÿÿåÍ—ñ!øÿåÍC áywx#w+~þÿÂ× #~þÿÂà ÿÿÃ"O!øÿå!Á – #žú !å!øÿÁ – #žò6 !øÿN#FÅ!x å!N#FÅ! å!ƒ åÍ®! 9ù!ý~#¶Âœ Í®?!øÿ~#foMDÃ"OÍO!öÿ9ù!øÿå!På!­åÍÉññáywx#w!øÿå! å!øÿN#FÅ!­åÍñññáywx#w!øÿå! å!øÿN#FÅ!­åÍñññáywx#w!øÿ~#¶Âµ ÿÿÃ"O:­þ0úÆ !­>9¾òÌ ÿÿÃ"O! å!öÿå!øÿN#FÅ!­åͽ ññññ!öÿ~#foMDÃ"OÍO!~#fo#~·Ê !~#fo#~þ:Ê ÍŒ !~#fo~þaúJ !~#fo>p¾úJ !~#fo~O‡ŸG!Ÿÿ MDÃ"O!~#fo~þAú| !~#fo>P¾ú| !~#fo~O‡ŸG!¿ÿ MDÃ"OÍŒ Ã"O and sector numbers, in that order, one per line. and mapfile [if given] is a file of track, head, (default is e -- any drive on the hard disk will do), where mapdrive [if given] is a single letter a to p Use putbad [mapdrive] [w‡Ÿ#w!òÿ:ŠVw:‹V#w!ôÿw‡Ÿ#w!Õÿå*ˆV#"ˆV*ˆVÁ~*ˆV#"ˆVÃC*ˆV~þ+ÂC!Õÿå*ˆV#"ˆV*ˆVÁ~*ˆV#"ˆV! å!òÿå*ˆVåÍŸñññi`"ˆV!ôÿ>w‡Ÿ#w*ˆV~þ.Â�! å!ôÿå*ˆV åÍŸñññi`"ˆV*ˆV~þaʱ*ˆV~þhʱ*ˆV~þoʱ*ˆV~þuÂÜ!Ôÿå*ˆVå*ˆV#"ˆVáÁ~!Ôÿ~þhÂå>2†V‡Ÿ2‡VÃ!Ôÿ6ÃÅ!Ôÿ~þoÂü>2†V‡Ÿ2‡VÃ!Ôÿ~þuÂ> 2†V‡Ÿ2‡VÃ!öÿ"†V*ˆV~þxÂ0!öÿ>w‡Ÿ#wù*ˆV~þbÂ!Òÿå! N#FÅ! ~Æw#~ÎwáÁ~#~!öÿå! N#FÅ! ~Æw#~Îwá~#foÁ}|!ôÿ~#¶Ê¹!öÿå!öÿå!ôÿÁ – #žò¬!öÿN#Fó!ôÿN#Fáywx#w!øÿ~#¶Ê!öÿå!òÿÁ – #žò!å!Õÿå!N#FÅ!~#foÍ!Oñññ!òÿ~Öw#~ÞwÃÃ*ˆV~þp‡!Òÿå! ~#foÁ~#~!öÿå! N#FÅ! ~Æw#~ÎwáN#FÅÍ"ñáywx#w!ôÿ~#¶Ê¹!öÿå!öÿå!ôÿÁ – #žòw!öÿN#FÃ~!ôÿN#Fáywx#wù*ˆV~þlÂÿ!Ôÿ~þaÂy!îÿå! ~#foÁ~#~#~#~!öÿ>w‡Ÿ#w!öÿ~Öw#~Þw+#~·úÒ!Öÿå!öÿ~#foãÁ å!îÿÁ##~!îÿå!åÍØLñÃÁ*ˆV~þfÂ!Òÿå!ÖÿÁ}|!öÿå!ôÿN#FÅ!å!ôÿÁy–Ox#žGÅ! ~#fo >+F+NÅ=ÂC!ÖÿåÍ:!9ùáywx#w! å! ~#fo Á}|ù!Òÿå!ÖÿÁ}|!öÿå*†Vå! ~#fo##N#FÅ+++N#FÅ!ÖÿåÍb#ññññáywx#w! å! ~#fo####Á}|ù!Òÿå!ÖÿÁ}|!öÿ>w‡Ÿ#w! å! ~#fo####Á};‡Ÿ2‰V*ŠV ~#¶ÂM!*ŠV å!å*ŠV å*ŠV Á}| i`N#FÅ*ŠVN#FÅÍì(ñññáywx#w*ŠV —–>#žús!*ŠV >ÿw>ÿ#w*ˆVMDöH!:ˆV–:‰V#žÒÞ!*ŠV —–>#žòÞ!*ˆV#"ˆV*ŠV ~Öw#~Þw*†Vå*ŠV N#FÅ*ŠV ~Æw#~ÎwáÁ~*†V~þ Âö!*ˆVMDöH!:ˆV–:‰V#žÚ!*ˆVMDöH*†V#"†VÃs!Í H!~#fo"ŠV*ŠV"†V*†V~·Ê&"*†V#"†VÃ"*†Vå!ŠVÁy–Ox#žGöHÍ Hõ!N#FÅÍh?ñi`"ˆV!ˆV~#¶Êb"*ˆV ~·òh"ÿÿöH*ˆV ~#fo"†V! ~#¶Âž"*†V$ å!Á~#~#~#~ÃU#! ~þ¬"#~þÂÃ"*†V$ å!åÍŽJñÃU#>2ŠV‡Ÿ2‹V!å*ŠVå*ˆVåÍCñññx·ú#!øÿå*†V Á~‡Ÿ*ŠV}Æ€o|Îg"ŠVÃÍ"*†V$ å*ŠVå!øÿ~#foãÁ MDx‡Ÿ2vV2wVx2yVy2xV!vVå!åÍ¢L!åÍŽJáÁ~#~#~#~!~#foMDöHÍ Hõõ!~#fo"ŠV*ŠV"†V!#~·òÐ#! —–>#žúÐ#!å!åávV~#~#~#~!vVåÍIMáÁ~#~#~#~*†Vå*†V#"†Vá6-! ~#¶Âè#! > w‡Ÿ#wà $! #~·ò $! å! ~#fo>•o>œgÁ}|!öÿå! Á#~‡Ÿ~+~ !#~·ú@$!å!öÿåͼJú‰$! N#FÅ!vV~#~#~#~!vVå!öÿåÍ\Lá##N#FÅ+++N#FÅ*†VåÍb#ññññ*†V "†V*†Vå!vV~#~#~#~!vVå!öÿåÍšL>02€V‡Ÿ2�V2V2~V!~VåÍŽJáÁ##~*†V>9¾òÛ$*†V~Æ'w*†Vå!ŠVÁy–Ox#žGöHwrite error write>2†V‡Ÿ2‡V!#~·ò;-!å!åávV~Õ#~Â'-Ñ!vVåÍzGÍÒGñ!å!4VåÍrDúÅ-*tVÿÿ "ˆV!ˆV—–>#žò~.!å*ˆV)))4V åÍrDúÂ.!å!åávV~Õ#~‰-Ñ!vVå*ˆV)))4V åÍôDÍÒGñ*†Vå!å*ˆVÿÿ åÍÈIáãÁ "†VÃÂ.>2ˆV‡Ÿ2‰V!:ˆV–:‰V#žÒ‘/!~#¶Ê‘/!ðÿå!åávV~Õ#~Âü-Ñ!vVå!#žòÅ-!ðÿå*ˆV)))4V åávV~Õ#~Â0/Ñ!vVå!åÍZFÍÒG!4VåÍrDò~/!å!ðÿåÍÒGñ!å*ˆVÿÿ åÍÈIá:†V•2†V:‡Vœ2‡V:ˆVÖ2ˆV:‰VÞ2‰Và /!:ˆV–:‰V#žÒ¹/*ŠVå*ŠV#"ŠVá60*ˆV#"ˆVÑ/*†VMDöHPONMLKJIHGFEDCBACONRDRPUNLSTÍ H>2ŠV‡Ÿ2‹V!HU:ŠV–:‹V#žÒ0*ŠVåÍ�6ñ*ŠV#"ŠVÃþ/:åTO‡ŸGÅ!åÍ ññ*ãTMDöHÍ Hõ!~#fo"ŠV!øÿæTywx#w!øÿ~#fo~#¶Êœ0*ŠV"ˆV!øÿ~#fo~#fo"†V*ˆVå*†VÁ ¾Â²0*†V~·Ê²0*ˆV#"ˆV*†V#"†VÃv0öH!øÿ~Æw#~ÎwÃS0*ˆVå*†VÁ ¾Â¢0!øÿ~#fo##~O‡ŸGöHÍ H!~#fo"ŠV!~#fo"†V>2ˆV‡Ÿ2‰V*†V~þ.Êb1*†VÁ – #žÒN9*†Vå*ˆV Á~#~Ãe9::UþÂ,9:;UþÊ„9:;U·2;U::U2:UÄ9*ˆV "†VÃÎ8*†Vå*ŠVå*ˆVåÍR7ññáywx#w*ˆV å!Á~#~*ˆV MDöH!øÿ>w‡Ÿ#w!ŠV::U–:;U#žÚØ9!øÿå!öÿ::Uw:;U#w+N#FÅÍé;ñáywx#w+~#¶ÂØ9:;U·2;U::U2:UÃ�9!øÿ~#¶Â:!øÿå!öÿ:ŠVw:‹V#w+N#FÅÍé;ñáywx#w!øÿ~#¶Â:öH!øÿ~#foå!öÿ~#foüÿ Á}|!>U~#¶ÂB:!øÿ~#fo">U!øÿ~#foå!öÿ~#foãÁ :@U•:AUœÒx:!øÿ~#foå!öÿ~#foãÁ "@U!å!øÿ~#fo##åÍž:ññÃÈ8bad free call Í H!~#foþÿ "ŠV!~#¶Êò:!>U:ŠV–:‹V#žÚØ:!@U:ŠV–:‹V#žÚÿ:!å!�:å!åÍ.>ñññ!åÍ®?ñ!~#foMDöH!w‡Ÿ#w*ŠV"w‡Ÿ#w*†V :ŠVw:‹V#w*†VåÍÄ7ñÃò:ÍOõõõõ!øÿ:BUw:CU#w*BUå!~#foãÁ "BU!øÿ:BU•:CUœÒ,#žò´ñññ!åÍ®?ñ:‡V·ú™%*ŠV ~Ö#~Þò±%*ŠV N#FÅ*ŠV ~Æw#~Îwáå*ŠV ãÁ :†VwÃ&*ŠV —–>#žúG&*†VMDöH*ŠV N#FÅ*ŠV å*ŠVN#FÅÍ.>ñññÅ*ŠV Áy¾Ââ%x#¾Ê&! å!û$å!åÍ.>ñññ!åÍ®?ñÃ&*ŠV >w‡Ÿ#w*ŠV :†Vw:†Vþ Â(&:‡VþÂ?&*ŠV ~þÿÂ<&#~þÿ™%*†VMDöH*ŠV N#FÅ*ŠV å*ŠVN#FÅÍ.>ñññÅ*ŠV Áy¾Âx&x#¾Ê˜&! å!î$å!åÍ.>ñññ!åÍ®?ñöH*ŠV >w‡Ÿ#w*†VMDöHwrite error write error bad putl call Í Hõ!~#fo"ŠV!~#fo"†V!ŠV~#¶Â'!å!È&å!åÍ.>ñññ!åÍ®?ñöH!~#fo"ˆV!ˆV—–>#žòµ'!øÿå*ŠV å*ŠV ~#foãÁ Á}|!ˆV—–>#žòC(*ŠV ~Ö#~ÞòC(!øÿN#FÅ!øÿ~Æw#~Îwáå*†Vå*†V#"†VáÁ~:ˆVÖ2ˆV:‰VÞ2‰V*ŠV ~Æw#~ÎwÃO'*ŠV ~þÿÂÆ'#~þÿÊ¢(*ŠV ~#¶Ê¢(*ŠV ~#foå*ŠV ãÁ ~þ ¢(*ŠV N#FÅ*ŠV å*ŠVN#FÅÍ.>ñññÅ*ŠV Áy¾Â#(x#¾Ê¯(! å!®&å!åÍ.>ñññ!åÍ®?ñâ(!ˆV—–>#žò"'!å*ŠV å*ŠVN#FÅÍ.>ñññyþÂq(xþÊ‘(! å!»&å!åÍ.>ñññ!åÍ®?ñÃ"'*ŠV >w‡Ÿ#wÃ"'!~#foMDöH*ŠV >w‡Ÿ#wâ([*þÿy)ÿÿr*Ì*Æ*ÿÿß*œ+–+ “+€+¼+Í H!N#FÅÍh?ñi`"ˆV~·Êb1:ˆVÖ:‰VÞòX1*ˆVå*ˆV#"ˆVáå*ŠV ãÁ å*†V~þaúM1*†V>z¾úM1*†V~O‡ŸG!àÿ MDÃU1*†V~O‡ŸGáyw*†V#"†VÃô0:ˆVÖ:‰VÞò‹1*ˆVå*ˆV#"ˆVáå*ŠV ãÁ 6 Ãb1*†V~þ.ž1*†V#"†Vì1*†V~·Ê¬1öH>2ˆV‡Ÿ2‰V*†V~·Ê2:ˆVÖ:‰VÞò2*ˆVå*ˆV#"ˆVáå*ŠV ãÁ å*†V~þaú2*†V>z¾ú2*†V~O‡ŸG!àÿ MDÃ2*†V~O‡ŸGáyw*†V#"†Vö1:ˆVÖ:‰VÞòD2*ˆVå*ˆV#"ˆVáå*ŠV ãÁ 6 Ã2*†V~O‡ŸGöHÍ H!ôÿ9ù!~#fo"ŠV:åTþÂ{2!å!åÍ ññy2åT!öÿ>w‡Ÿ#w!öÿå!HUÁ – #žÒ«2!öÿ~#fo))ôU ~·ÂÃ2!öÿå!HUÁ – #žÚÓ2ÿÿöH!öÿ~Æw#~ÎwÆ2!øÿå!öÿ~#fo))ôU Á}|!øÿ~#fo6!!~#¶Â 3!øÿ~#fo~öw!øÿ~#fo##>w‡Ÿ#w!îÿ:ŠVw:‹V#w>2†V‡Ÿ2‡V*ŠV~þ:ʘ3*ŠV~·Ê˜3:†VÖ:‡VÞòÉ3*†Vå*†V#"†Váå!ñÿãÁ å*ŠV~þaúŠ3*ŠV>z¾úŠ3*ŠV~O‡ŸG!àÿ MDÃ’3*ŠV~O‡ŸGáywÃÉ3!ñÿå*†VãÁ 6*ŠV~þ:ÊÓ3!îÿ~#fo"ŠV!øÿ~#fo#:åTwÃ4*ŠV#"ŠVÃ43!øÿ~#fo#å!ñÿåÍ80ñáyw~þÂ4!öÿN#FÅÍ�6ñÿÿöH*ŠV#"ŠV!øÿ~#fo#~·òA4!øÿ~#fo#~O‡ŸGyþÿÂ-4xþÿœ4!~þÂ>4#~þœ4!å!ªåÍE8ññi`"ˆV!øÿ~#fo##:ˆVw:‰V#w!ªå*ˆVåÍ0Dññ*ˆV( >ÿw>ÿ#w!øÿ~#fo#~·ò©4!öÿ~#foMDöH!öÿ~#foMDöH*ŠVå*ˆVåÍÑ0ññy°ÊÍ4!öÿN#FÅÍ�6ñÿÿöH!øÿ~#fo#~O‡ŸGÅ!åÍ ññ!~#fo}æûo|æÿg}þÂþ4|þÂ%yþÿ =xþÿÂr=ÿÿöH*ˆV~O‡ŸGÅ!åÍ ññ!~Öw#~Þw*ˆV#"ˆVÃs<*ˆV~O‡ŸGÅ!åÍ ññÃ$=*ˆV~O‡ŸGÅ!åÍ ññÃ$=!~#foMDöH!—–>#žòó=*†V! ~·Êó=*†V" N#FÅ*†V" ~Æw#~Îwáå*ˆVå*ˆV#"ˆVáÁ~*†V$ å>‡Ÿ2vV2wV>2yV>2xV!vVåÍŽJñ!~Öw#~Þw*†V! 5Ãr=*ŠV~O‡ŸGyæOxæGy°Ê!>*†V! ~·Ê!>*†V" ~#fo6*ŠV~öwÃs< Í H!N#FÅÍh?ñi`"ˆV!ˆV~#¶ÂQ>ÿÿöH*ˆV~O‡ŸGyæOxæGy°Âƒ>!N#FÅ!N#FÅ*ˆVåÍZ<ñññöH!~#fo"ŠV!—–>#žòÎ>*ŠV"†V!—–>#žòá>*ŠV~þ Êá>*ŠV#"ŠV!~Öw#~Þwá>*ŠVå!Áy–Ox#žGöH*ŠVå!†VÁy–Ox#žGÅ*†Vå*ˆVåÍZ<ñññÅ*ŠVå!†VÁy–Ox#žGá}¹Â?|¸Ê ?ÿÿöH!—–>#žòŽ>!å!+>å*ˆVåÍZ<ñññyþÂH?xþÊQ?ÿÿöH*ŠV#"ŠV!~Öw#~ÞwÃŽ>Í H!~#fo"ŠV:‹V·úš?!HU:ŠV–:‹V#žÒš?*ŠV))ôU ~·Â ?öH*ŠV))ôU MDöHÍO!DU~#¶ÊÙ?!â?:DU½ÂÈ?:EU¼ÊÙ?*DUÍ!Oi`"DUñ?*FUÍ!OÃÙ?Í H*DU"ŠV!~#fo"DU*ŠVMDöHìAæAýAÍ Hõ!~#fo"ŠV*ŠV ~#fo"†V!øÿå*†V$ åávV~#~#~#~!vVå!åÍØLáÁ##~#~*†V$ ##N#Fi`}æo|æg"ˆV*†V! å!€å!ˆVÁy–Ox#žGáyw*†V" å*†V* å*ˆVãÁ Á}|!~#¶ÂÓ@!øÿå*†V( Á ¾ÂÊ@ #¾ÂÓ@öH!å*ŠVåÍBññx·úA!N#FÅ!øÿN#FÅ*ŠVåÍCñññx!ˆV~#¶Â)ÿÿöH*ˆV ~#fo"ŠV!~#fo"†V!—–>#žòS)*ˆV ~·òf)*ˆV ~O‡ŸG!À(ÃN*†Vå!Áy–Ox#žGöH!å*ˆVåÍ @ññ!Ì(ÃN!ŠV~#¶Âˆ)öH*ŠV! ~·Â**ŠV* 6}*ŠV* å! åÍ ññ! å!åÍ ññ*ŠV! å*ŠV+ ~O‡ŸGáyw*ŠV" å*ŠV, Á}|*ŠV" ~#foå*ŠV+ ~O‡ŸGá 6 *†Vå*ŠV" N#FÅ*ŠV" ~Æw#~ÎwáÁ~*ŠV! 5*ˆV~O‡ŸGyæOxæGy°Âx**†V#"†V!~Öw#~ÞwÃ()*†Vå!å!åÍ ññáywÃ/*öH*†V~þ Ê()*†V~·Ê()*†V~þÊS)*†V~þ ¯**†Vå!Áy–Ox#žGöH*†V#"†V!~Öw#~ÞwÃ()ÿÿöH*†Vå!Áy–Ox#žGöH!—–>#žò()*ŠV! ~·Ê()*†Vå*ŠV" ~#foÁ~*ˆV~O‡ŸGyæOxæGy°Âr+*†V#"†V!~Öw#~Þw*ŠV! 5*ŠV" ~Æw#~Îw*ŠV$ å>‡Ÿ2vV2wV>2yV>2xV!vVåÍŽJñÃß**†V~O‡ŸG!Ø(ÃN*†Vå!Áy–Ox#žGöHÃ3+Ã3+Ã3+*ˆV ~O‡ŸGyþÿ±+xþÿ¼+!åÍ®?ñ*†V#"†V!~Öw#~ÞwÃ3+Í H!~#fo"ŠV*ŠV"ˆV!#~·ò',!—–>#žú',!å!~#fo>•o>œgÁ}|*ˆVå*ˆV#"ˆVá6-!~#fo}æÿo|æÿg"†V!~#¶ÂR,!> w‡Ÿ#wÃw,!#~·òw,!å!~#fo>•o>œgÁ}|!:†V–:‡V#žÚ¯,!N#FÅ*†Vå!N#FÅÍ’I*ˆVåÍÓ+ñññ*ˆV "ˆV*ˆVå*†Vå!N#FÅÍ­Iá0 Á}*ˆV>9¾òÚ,*ˆV~Æ'w*ˆVå!ŠVÁy–Ox#žGöHÍ H!öÿ9ù!~#fo"ŠV5*ˆVå!åÍ ññx·òŒ5!öÿN#FÅÍ�6ñÿÿöH*ˆVå!åÍ ññ!~þÂ@5#~þÂ\5!öÿN#FÅÍ�6ñ!öÿ~#foMDöH*ˆVå!åÍ ññx·ò€5!öÿN#FÅÍ�6ñÿÿöH!øÿ~#fo~öw!ãT~#¶Â¢5!ñ/åÍâ?ñi`"ãT!öÿ~#foMDöHÍ H!~#fo"ŠV!#~·ú46!å!Á – #žò46*ŠVå!~#foãÁ ~þ5ú46!~#foÿÿ "†V:‡V·ú:6*ŠVå*†VãÁ ~þ9Â|6*ŠVå*†VãÁ 60:†VÖ2†V:‡VÞ2‡VÃþ5öH:‡V·ò46*ŠV61!~#fo"†V!†V—–>#žòŠ6*ŠVå*†VãÁ 60:†VÖ2†V:‡VÞ2‡VÃQ6*ŠVå*†VãÁ 4Ã:6öHÍ H!N#FÅÍh?ñi`"ŠV!ŠV~#¶Â³6ÿÿöH*ŠV ~#¶Ê@7*ŠV~O‡ŸGyæOxæGy°Â@7!å*ŠVåÍBññ*ŠV~O‡ŸGyæ OxæGy°Ê7*ŠV ~#fo ~æw*ŠV N#FÅ!åÍ ññ*ŠV å!å*ŠV N#FÅÍž:ññáywx#w*ŠV6!~#foMDöHÍ H!~#fo"ŠV!~#fo"†V*ŠVå*†VãÁ "ˆV*ˆVå*ŠV~#foå!†VÁy–Ox#žGáywx#w*ˆV å*ŠV Á~#~*ŠVå*†Vüÿ Á}|*ˆVMDöHÍ H!~#fo"ŠV*ŠV ~#fo"†V*ŠVå*ŠV~#foãÁ ####å!†VÁy¾Âÿ7x#¾Â/8*ŠVå*†V~#fo####Á … Œ*ŠV å*†V Á~#~öHout of heap space Í H!N#FÅ!N#FÅÍ�8ññi`"ŠV!ŠV~#¶Ês8*ŠVMDöH!å!28å!åÍ.>ñññ!åÍ®?ñöHÍ Hõõ!~#fo"ŠV:ŠVÖ:‹VÞÒ³8ø8*ŠVMDi`#}æþo|æÿg##"ŠV!€˜G!9~#fo^#Vz·ò£D—“_>€šWxÆ€GzÆ€Wy“oxšÚ¼DµÊÁD>ÃéD>ÿÃéD! 9N#F!9~#fo# ##¾ÂîD +¾ÂîDÂÔD—чÃPÚ¼D÷DåÅÕ!9ë!áÿ9###~w+~w ÂöL×PåÅ!9~·ò!M/<òLÊ—PO!9~#fo##+~·w+~w###~w+~w Â/M×På!9~#fo—##–w>#žw>+++žw>#žwáÉãÅÕMD!9ë!÷ÿ9ùÅ!N#F!÷ÿ>w#w#w#É#w#w!¨å!÷ÿåÍ&Oññ! N#F !öÿÕ#~¯MÑëùÑ×PÍjMq#px‡Ÿ#w#wÃŽMÍjMq#p—#w#wÃŽMÍjM w #w #w #w‡ŸÃŽMÍjM w #w #w #w—ÃŽM~#¶ÂN#~#foéy#¾Â/Nx#¾Â0N+++~#foé##ÃNåÅÕ!9ë!ìÿ9ù!N#FÅ!÷ÿåÍPññy°ÊO!ìÿq#p! N#FÅ!îÿåÍPññy°Â€N!N#FÃÿN!ìÿy–Ox#žGú¢Ny°ÊÏN+~�w#~ˆw!ÿÿíN—‘O>˜G!öÿÕ ~‡#+~w³NÒÁNöw y°ÊÎNîNÑ!öÿMD!íÿÕ · #ŽwÂÝNÑ!ìÿN#FÅ!îÿåÍ&Oññ!îÿMD ! ~#fo+Õ #w OÑëùÑ×P!9ëãéëùÑÉÕ!9N#F! ~·òLOi`+ ·>#žwÂ?OÃZO+¶ÂZOÂNOÃP! ~·ÊO# ·+~wÂgO!9~Æw#~ÎwÃZO! ~·ú¦Oi`+ ·#~�wÂŽO!9~Öw#~ÞwÃO ·ò¾O—i`7#~Îw²OÃZO!9~·òÖOi`+—#wÂÍOÃPÊéOi`>ÿ#wÂßO>²w! å!9z‡~áw+~ w++~ wÂPÑÉÕ!å!9N#F!9^#V! ëÅ#~#~ Â-PÁ—! ~#~WÒNPã+ã·Â]PÂTPÃyP>w+~ö€wã}·ÊyPi`·>#žwÂpPJñÑÉõ!9N#F###q#pÁ+++qÁáññÉ!9N#F#q#pÁáñÉ* * REGEN.ASM vers 1.1 september 30, 1980 * * By Bryan G. Moore * Design Technology * 4888-H Ronson Court * San Diego, CA 92111 * * Modified for all revision Disk Jockey 2D'S by Bobby Dale Gifford * 9/30/80 * * The program is used to correct the format on Single Density * IBM 3740 compatible diskettes. Attempts to use other diskettes * will probably result in an error message. * * vernum equ 11 ;Version number * 10 origin equ 0F800H bdos equ 5 ;CP/M entry point wboot equ 0 ;Warm boot diskio equ origin+3f8h datreg equ diskio+7 drvsel equ diskio+1 cstall equ diskio+3 cmdreg equ diskio+4 secreg equ diskio+6 trkreg equ diskio+5 sbegin equ origin+3deh ramins equ origin+7e2h dside equ 10Q unloadb equ 17Q sicmd equ 131Q immirq equ 320Q unloada equ 30Q restor equ 11Q rtcmd equ 0e4h wsec equ 0a0h rsec equ 80h index equ 20Q trkzro equ 4 intrqa equ 1 intrqb equ 4 lhsdenb equ 90dh lhddenb equ 80ch lhsdena equ 111h lhddena equ 10h acr equ 0dh alf equ 0ah org 100h ù!ëÿ6!N#FÅ!÷ÿåÍPññy°Â>E! N#F ö>ÿ ÃTF!ÿÿ~·ò^E!÷ÿÕ·>#žwÂOEÑ!ëÿ4!ìÿq#p! N#F ·òzEæ!ëÿ4 Å!îÿåÍPññy°ÊTFy!ìÿ–Ox#žGyÆ€+wxÎ#w— !àÿ#w §E!êÿ69!áÿ·#~w ºE!÷ÿMD!Õ +¾ÂÚEÂÏEÑÚûE!íÿMD!öÿÕ · #žÂìEÑ!âÿ4! ·+~w ÂF!êÿ5³E!ìÿN#FÅ!áÿåÍ&Oññ!ëÿ~æÊ8!êÿw!ÿÿ ~‡#+~w ÂóF!õÿ~·òG!àÿMD!öÿÕ · #ŽÂGÑ!íÿ·#~w Â#G!êÿ5ÂêF!ìÿN#FÅ!áÿåÍ&Oññ!ëÿ~·Ê\G!áÿ~#¶Ê\G~î€w! N#F !àÿÕ#~ÂkGÑëùÑ×På!9~#fo~#¶Ê�G~Æ€wáÉåÅÕ!9ë!øÿ9ù!N#F !÷ÿÕ #w«GÑ!ùÿ~Æ€w! N#FÅ!øÿåÍ4NëùÑ×PåÅ!9N#F!9~#foÕ~#~ÂèGÑ×PãÅÕMD!9ë!÷ÿ9ùÅ!N#FÅ!÷ÿåÍPññy°Ê\HyÖ¨OxÞGòBH!ÿÿÕ~‡#+~wÂ0HÑy°Â&HÃ\Hy°Ê\H!ùÿÕ·#~�wÂOHÑ ÃBH! ÉÍôGN#F!úÿ~#~ëùÑ×PÍôGN#F!ýÿ~+~ +~+~ ëùÑ×PÍôGMDÃgHÁ!þÿ9ëå*ŠVå*ˆVå*†Våi`é!úÿùá"†Vá"ˆVá"ŠVÑÉáÕÕÅåø!9~‡w#~�w#~�w#~�w+MD!9 –_ #žÚÓH{ !í/üé/ýå/þá/ÿß/Ý/Û/;CP/M Tpa begin lxi sp,stack ;Stack pointer lxi d,prompt ;Sign-on call pbuff ;To console lhld origin+7 ;Adjust the calling routines for different inx h ; revisions of the Disk Jockey mov a,m lxi h,stdvsl+1 lxi d,4 mov m,a xri 3 dad d mov m,a dad d mov m,a start lxi d,srcmsg ;Prompt the user to select drive call readdrv ;Get a drive designator sta sdisk ;Save source disk lxi d,dstmsg ;Prompt the user to select drive call readdrv ;Get drive designator sta ddisk ;Save destination disk mount lxi d,mntmsg ;Prompt the user to call prbuff ;Read console jnz start ;Ignore anything else regena lxi d,acralf call pbuff xra a ;Select source call select ;Select the drive lxi h,cmdreg mvi m,immirq ;Immediate interupt request mvi a,40h ;Simple delay wirqda dcr a jnz wirqda mov a,m ;Check ready rar jc notrdy ral ral jc notrdy lxi d,0 call gtindx ;Get polarity of index pulse call gtstat ;Test for double sided ani dside jnz ixlo94ÃÓHåÅÕ! 9~·òI—+–w>#žw! 9N#Fx·ò1I—‘O>˜GÍÉHÁññÒAI—‘O>˜G! 9q#pÑ×PåÅÕ! 9~·òcI—+–w>#žw! 9N#Fx·òwI—‘O>˜GÍÉHñÁñÒ‡I—‘O>˜G! 9q#pÑ×PåÅÕ! 9N#FÍÉHÁññ! 9q#pÑ×PåÅÕ! 9N#FÍÉHñÁñ! 9q#pÑ×PåÅ!9~·òØI/<ÃüIÊ—PO!9~#fo) ÂäIÃ>JåÅ!9~·òüI/<ÃØIÊ—PO!9~#fo|‡|g}o ÂJÃ>JåÅ!9~·ò'J/<ÃØIÊ—PO!9~#fo|·g}o Â3JMD!9q#p×PåÅ!å! 9~+¶ÊƒJ~ÒiJ! 9N#Fá å! 9~‡w#~�w! 9~·w+~wÃPJÁ!9q#p×PåÅ!9N#F!9~#fo ##† #Ž +++Ž #Ž×PåÅ!9N#F!9~#fo ##– #ž +++ž #žÃP!9MD!9~#~#~#~— ø!9~‡w#~�w#~�w#~�w#~�w#~�w#~�w#~�w!9MD! 9 – #ž #ž #žÚ K!9MD! 9 – #ž #ž #ž!94à KãÅÕë!ðÿ9ùëé!9ùÑ×P#~#~+++~#~É#~·òƒK—#–>#ž>+++ž>#žÉ~#~#~ #~É{æʵK—–>#ž>#ž >#žÉÍmK!9MD!9~#foÍ•K! 9MD!9~#foÍ•KÍæJ!9N#F!9ÍÈKÃzKÍmK!9MD!9~#foÍ•K! 9MD!9~#foÍ•KÍæJ!9N#F!9ÍÈKÃzKÍmK! 9MD!9~#fo#̓K!9MD!9~#fo#̓KÍæJ!9N#Fkb9͵KÃzKÍmKÃaLåÅ!9~·ò²L/<ÃèLÊ—PO!9~#fo##~‡w#~�w+++~�w#~�w ¿L×PåÅ!9~·òèL/<òLÊ—PO!9~#fo##+~‡~w+~wÙ/×/Õ/Ó/Ñ/Ï/Í/ Ë/ É/ Ç/ Å/ Ã/Á/ŒVâ? ÿJU ÿ ÿ€@ BÈCG@¾M ¼[É¿�u­Å+¨·påååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå=pa dblside lxi d,sglside ;No double sided diskettes jmp notrdyx ixlopa call gtstat ;Wait for index pulses ani index xra b jnz restora dcx d mov a,d ora a jnz ixlopa notrdy lxi d,rmessg ;Not ready message notrdyx xchg lxi d,amessg push h call pbuff ;Print drive message lda cdisk ana a lda sdisk jz notdrv lda ddisk notdrv adi 'A' ;And drive letter mov e,a mvi c,2 call bdos pop d call pbuff call unload ;Unload the heads jmp mount restora call restore regenb mvi a,1 ;Select destination call select ;Select the drive lxi h,cmdreg mvi m,immirq ;Immediate interupt request mvi a,40h ;Simple delay wirqdb dcr a jnz wirqdb mov a,m ;Check ready rar jc notrdy ral ral jc notrdy lxi d,wmessg ral jc notrdyx lxi d,0 call gtindx ;Get polarity of index pulse call gtstat ani dside ;Test for double sided diskette jz dblside ixlopb call gtstat ;Wait for index pulses ani index xra b jnz regen dcx d mov a,d ora a data jnz sc1 ;Error - continue search push d ;Save pointer to last CRC byte xchg ;Flip Data address into D,E lhld secix ;Get sector pointer index mov m,e ;Store the inx h ; new sector mov m,d ; data address inx h ;Point to next address storage shld secix ;Save sector index pop d ;Restore pointer to last CRC byte inx d ;Bump to next raw data byte lxi h,secno ;Point to the sector number inr m ; and bump to next sector mov a,m ;Get this number xchg ;Flip data pointer back to HL cpi 27 ;More sectors to go ? jc sloop ;Yes - jump lhld secix ;Get sector data address index dcx h ;To last high order mov d,m dcx h ;Low order mov e,m ;Load the start address lxi h,130 ;Sector length + CRC word dad d ;Compute last address used lxi d,-nbuf ;Negative of last track buffer address dad d ;Is sector data address out of bounds ? jc terr ;Yes - jump mvi a,1 call select ;Select destination drive mvi a,10 ;Reset some counters sta trcnt ;Reset track read error counte jmp wboot ;Ignore anything else * * Step to next track * tkstep lda sdisk mov b,a lda ddisk cmp b jz samedrv mvi a,'*' call pchar call takstep lda trkreg dcr a sta trkreg samedrv xra a call select call takstep jmp dloop takstep lxi d,cmdreg mvi a,sicmd stax d wsicms ldax d rar jnc wsicms wsicmd ldax d rar jc wsicmd ret * * Re-write error, track did not verify * Bump counter, then flag permanent error * rwerr lxi h,rwcnt ;Point to Track Verify Retry counter dcr m ;Decrement it jnz rewrt ;Go re-write if not expired lxi d,vmsg ;Permanent verify error * * Permanent error common routine * No error codes determined yet * Unload head, then abort * perr call pbuff ;Print the error message call unload lda trkreg ;Get current track number mvi l,'0'-1 ;L is one less than 0 per1 inr l ;Bump digit value sui 10 ;Hit tens digit count jnc per1 ;Loop til C = ASCII tens digit adi '0'+10 ;Restore + ASCII bias for units mov h,a ;Pljnz ixlopb jmp notrdy restore lxi h,cmdreg mvi m,restor ;Home to track 0 command wrstrs mov a,m rar ;Wait for busy jnc wrstrs wrstrd mov a,m rar ;Wait for not busy jc wrstrd mov a,m ani trkzro jz notrdy ret regen call restore xra a ;Initialize track number sta tkno ;Start with track 0 mvi a,10 ;Reset read retry sta trcnt ; counter to 10 dloop xra a call select call wnbusy ;Wait until not busy lxi d,datreg ;Pointer acts as Data Register lxi h,tkbuf ;Track buffer mvi c,24 ;C is page count mvi a,rtcmd ;Setup controller sta cmdreg datin ldax d ;Load a data byte mov m,a ;Store in memory inr l ;Bump pointer / counter jnz datin ;Get next byte inr h ;Bump high order dcr c ;Hit page count jnz datin ;Loop til track read in * * Scan track for Sector Address Mark (FE Hex) * Since this value is not always read properly using the Read * Track command, this search assumes the high four bits of the * Sector Address Mark are ones. * lxr sta rwcnt ;Reset the Re-Write counter rewrt lxi h,sectb ;Point to Sector Data address table shld secix ;Initialize index value mvi a,1 ;Initialize sector number sta secno twloop call wnbusy ;Wait for Controller Ready lda secno ;Fetch sector number sta secreg ;Send to controller lhld secix ;Get sector address index mov e,m ;Load the next dma address inx h mov d,m ;High order inx h shld secix ;Save for next loop lxi h,datreg;Controller data register mvi a,wsec ;Write Sector command sta cmdreg ;Start controller mvi c,128 ;Bytes in a sector wloop ldax d ;Get source byte from memory mov m,a ;Write the data to the controller inx d ;Next data byte dcr c ;Hit data byte count jnz wloop ;Loop until data written lxi h,secno ;Point to the sector number inr m ;Increment to next mov a,m ;Load the value cpi 27 ;More sectors to write ? jc twloop ;Yes - jump * * Read the track back. Ignore the data, but verify the CRC * status from the Disk Jockey 1791. * call wnbusace units digit mov a,l ;Get the tens digit cpi '0' ;Is it an ASCII 0 ? jnz per2 ;No - use it mvi l,' ' ;Else make it a space per2 shld tdsply ;Save track number display lxi d,retmsg ;Prompt to press return jmp done ;Treat as if done * * Track read error - decrement counter and try again * terr lxi h,trcnt ;Point to the track read counter dcr m ;Have we tried too many times ? jnz dloop ;No - try again lxi d,tmessg ;Track read message jmp perr ;Continue error routine * * Wait until drive not busy * wnbusy lda cmdreg ;Wait for controller to accomplish ani 1 jnz wnbusy ;Loop until it does ret ;Return when Ready * * Wait for index hole to go by * windex call gtindx windxh call gtstat ani index xra b jz windxh windxl call gtstat ani index xra b jnz windxl ret * * Search up to (B) bytes at HL for pattern represented * by (C). Assumes upper 4 bits are 1s. Exit to TERR if * byte not found. * searc mov a,m ;Load a byte ori 0f0h ;Turn oni h,sectb ;Initialize sector data pointer table shld secix ; to first sector lxi h,tkbuf ;Initial Track buffer pointer mvi a,1 ;Initial sector number (1) sta secno ;Save sector number sloop lxi b,0feh ;Give up after 256 bytes call searc ;Search for Sector Address mark lxi d,4 ;Field byte count call setcrc ;Evaluate CRC status inx h ;Offset to track number jnz sloop ;Error - Continue Sector mark search lda tkno ;Get current track cmp m ;Compare with memory image jnz terr ;Illegal track number inx h ;Next byte must be 0 mov a,m ;Is it a zero ? ora a jnz terr ;No - jump inx h ;Sector number lda secno ;Get current sector number cmp m ;Correct sector ? jnz terr ;No - jump inx h ;Next byte mov a,m ; must also be ora a ; a zero jnz terr ;Not a zero - jump inx h ;Skip CRC word inx h sc1 lxi b,0fbh ;Search pattern and retry call searc ;Search for mark lxi d,128 ;Sector length (including Data Mark) call setcrc ;Get the CRC status inx h ;Offset pointer to y ;Wait until not busy call windex ;Wait for index hole lxi h,datreg ;Data register pointer mvi a,1 ;Initialize the rtl1 sta secreg ; sector number mvi c,128 ;Bytes in a sector mvi a,rsec ;Read Sector command sta cmdreg ;Start controller rtloop mov a,m ;Read a byte dcr c ;Done this sector ? jnz rtloop ;No - Loop until sector is read call wnbusy ;Wait until not busy lda cmdreg ;Load controller status ani 9ch ;Extract Not Ready, Not Found, ; CRC Error, Lost Data jnz rwerr ;Go re-write if error lda secreg ;Load sector register inr a ;Next sector cpi 27 ;More sectors to do ? jc rtl1 ;Yes - Loop lxi h,tkno ;Point to Track number inr m ;Bump it mov a,m ;Get next track number cpi 77 ;Is re-formatting complete ? jc tkstep ;No - do next track call unload finish lxi d,fmessg ;Send completion done call prbuff ; message to console cpi 'R' ;More Re-formatting ? jz start ;Yes - jump exit xra a call selda call restore call unload > upper nibble mov m,a ;Save in memory cmp c ;Match ? rz ;Yes - Return inx h ;Bump data pointer dcr b ;Hit byte search count jnz searc ;Loop til search complete pop psw ;Clear stack jmp terr ;Go to error routine * * Checksum checker * Adapted from the Disk Jockey I Shugart Firmware * Performs the Cyclic Redundancy Check (CRC) * The polynomial is G(X) = X^16 + X^12 + X^5 + 1. * * Entry SETCRC - Pointer to data block in HL, * Field length (in bytes) - 1 in D,E * Verify checksum at end of block * Return with Z set if match * setcrc push h ;Save start address pointer xchg ;Flip start addr to DE dad d ;HL points to last byte xchg ;Swap back again crech lxi b,-1 ;Initial value per formula crechx push d ;Save terminating pointer mov a,m xra c mov d,a rrc rrc rrc rrc ani 0fh xra d mov e,a rrc rrc rrc mov d,a ani 1fh xra b mov c,a mov a,d ani 0e0h xra e mov b,a ;Update high order CRC word mov a,d rrc ani 0f0h xra c mov c,a ;S readdrv ;Invalid input ret * * Pbuff is the CP/M print buffer function * pbuff mvi c,9 jmp bdos pchar push h push b push d push psw mov e,a mvi c,2 call bdos pop psw pop d pop b pop h ret * * Rbuff is the CP/M read buffer function * prbuff call pbuff rbuff lxi d,inbuff mvi c,10 call bdos lda inbuff+1 ana a rz lda inbuff+2 cpi 'a' rc cpi 'z'+1 rnc sui ' ' ret inbuff db 10,10 ds 10 conin mvi c,1 call bdos ani 7fh cpi 3 jz finish ret stdvsl sta diskio+1 ret stbits sta diskio+2 ret gtstat lda diskio+2 ret unload call model mvi a,unloada jz stbits mvi a,unloadb jmp stbits * * Messages and data * prompt db acr,alf db 'Format correction program, VERS ' DB (VERNUM/10)+'0','.',(VERNUM MOD 10)+'0' DB acr,alf,'by Design Technology, San Diego, CA$' srcmsg db acr,alf db 'Select source drive A,B,C, or D (RETURN to exit): $' dstmsg db acr,alf db 'Select destination drive A,B,C or D (RETURN to exi1HîÍŒ*ø#~!Öwîww9Ív2ãnÍv2ä§Í ÂàÍŒ¯Í!üû6Ð>@=ÂG~ÚxÚxÍgÍÝæÂi^Ã{ÍÝæ¨Â¢z·ÂiFëUåÍŒ:å§:ãÊ�:äÆA_ÍÑÍŒÍáÃ-Íæ>Í!üû6Ð>@=±~ÚxÚx1Ú{ÍgÍÝæÊcÍÝæ¨Âüz·ÂÔÃx!üû6 ~Òë~Úð~æÊxÉÍæ¯2è> 2æ¯Íͧÿû! >ä2üûw,Â$ Â!ì"ê! >2éþÍÆÍÕ#Â5:è¾Âš#~·Âš#:é¾Âš#~·Âš##ûÍÆ€ÍÕ#ÂbÕë*ês#r#"êÑ!é4~ëþÚ5*ê+V+^!‚ßÚš>Í> 2æ2ç!ì"ê>2éͧ:é2þû*ê^#V#"ê!ÿû> 2üû€w ÂÒ!é4~þÚµͧͰ!ÿû>2þû€>€2üû~ Âøͧ:üûæœÂk:þû<þÚî!è4~þMÚ6ÍáïÍ þRʯÍFÍæÍáÃ:ãG:ä¸ÊP>*Í‘ÍZ:ýû=2ýû¯ÍÍZÃüû>YÒ`ÚeÉ!ç5ªyÍŒÍá:ýû./,Ö Ò€Æ:g}þ0‘. "G-Ã!!æ5ÂÕÃu:üûæ§ÉÍgÍÝæ¨Ê³ÍÝæ¨Â¼É~öðw¹È#ÂÆñÚåëëÿÿÕ~©Wæª_Wæ¨Ozæà«Gzæð©O#Ñz¼Ú ÂÜ{½ÒÜëá¹À¸ÉG:å¸ÊSx2å§:ãtÊ/:ä¢õ:ãG:ä¸õÌáñõÌŒñÌÈñO> òIæ?ÍÕÍpÊ_ xÍÙyÃÙÍpÈÉ:ôûþÉÉÕ͌ͣÑÊ)ÖAÚvþòvÉ ÃåÅÕõ_ÍñÑÁáÉÍŒ¼ Í:½§È:¾þaØþ{ÐÖ É æ¨Â¼É~öÍæþÊÉ2ùûÉ2úûÉ:úûÉÍp>ÊÙ>ÃÙ Format correctioave low order CRC word inx h ;Bump pointer to next data byte pop d ;Restore terminating pointer mov a,d ;Get high order cmp h ;Test for done CRECH jc crec1 ;Done - Test CRC and set flags jnz crechx ;Continue - next data byte mov a,e ;Get low order and cmp l ; test terminating pointer jnc crechx ;Loop if more bytes to scan crec1 xchg ;Swap CRC word pointer to D,E pop h ;Restore data start address pointer ldax d ;Test low order cmp c ;Clear Z flag if no match inx d ;Next byte rnz ;Done if error ldax d ;High order cmp b ;Set flags and ret ;Return * * Select selects the disk specified by drive A and * loads the head * select mov b,a ;Save in B lda cdisk ;Get currently selected disk cmp b jz loadhd mov a,b ;Recover request sta cdisk ;Update selected drive ana a lda sdisk ;Assume source lxi d,mntsrc ;Mount source message jz sselec ;Source select ? lda ddisk ;Not source, destination lxi d,mntdst ;Mount destination message st): $' mntmsg db acr,alf db 'Press RETURN to correct the format' db acr,alf,'on the above specified diskette: $' fmessg db acr,alf db 'Function Complete' db acr,alf db 'Type R to reformat another, RETURN to exit: $' wmessg db ' is Write Protected.$' rmessg db ' is Not Ready.$' amessg db acr,alf db 'Drive $' sglside db ' is not single sided.$' mntsrc db acr,alf db 'Insert source diskette, then press RETURN: $' mntdst db acr,alf db 'Insert destination diskette, then press RETURN: $' tmessg db acr,alf db 'Track read error' db acr,alf db 'Invalid CRC, Illegal Density, or' db acr,alf db 'Illegal track or sector sequence.$' retmsg db acr,alf db 'Error occured on Track: ' tdsply db ' .' db acr,alf db 'Type R to reformat another, RETURN to exit: $' vmsg db acr,alf db 'Diskette will not accept re-formatting.' db acr,alf db 'Permanent Verification Error and' db acr,alf db 'probable physical damage.$' acralf db acr,alf,'$' * * Data spacen program, VERS 1.1 by Design Technology, San Diego, CA$ Select source drive A,B,C, or D (RETURN to exit): $ Select destination drive A,B,C or D (RETURN to exit): $ Press RETURN to correct the format on the above specified diskette: $ Function Complete Type R to reformat another, RETURN to exit: $ is Write Protected.$ is Not Ready.$ Drive $ is not single sided.$ Insert source diskette, then press RETURN: $ Insert destination diskette, then press RETURN: $ Track read error Invalid CRC, Illegal Density, or Illegal track or sector sequence.$ Error occured on Track: . Type R to reformat another, RETURN to exit: $ Diskette will not accept re-formatting. Permanent Verification Error and probable physical damage.$ $ÿÿÿååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååselec push psw ;Save drive to select lda sdisk ;Get source drive mov b,a ;Save in B lda ddisk ;Get destination drive cmp b ;Same ? push psw cz unload pop psw push psw cz pbuff pop psw cz conin ;Print string, and read console pop psw ;Recover drive to select selda mov c,a mvi a,7fh ;Drive select bits qloop rlc ;Rotate select bits dcr c ; to proper drive position jp qloop ani 3fh call stdvsl loadhd call model lxi b,lhsdena jz selprep lxi b,lhsdenb selprep mov a,b call stbits mov a,c jmp stbits * * Get index level * gtindx call model mvi b,0 rz mvi b,index ret * * Get disk Jockey 2D model * model lda diskio-4 cpi (ret) ret * * Prompt the console for a drive, then read and verify the drive * selected * readdrv push d ;Save prompt call pbuff ;Send the prompt call rbuff ;Read the console character pop d ;Recover prompt jz exit sui 'A' ;Subtract ASCII bias jc readdrv ;Invalid input cpi 4 ;Upper limit jp * sdisk db 0ffh ddisk db 0ffh cdisk db 0ffh trcnt DS 1 ;Track read retry counter rwcnt DS 1 ;Re-write counter tkno DS 1 ;Track number secno DS 1 ;Sector number secix DS 2 ;Sector data pointer table pointer sectb ds 2*26 ;Space for sector address table ds 40 stack equ $ org (($+255)shr 8)shl 8 ;Must start on page tkbuf ds 1800H ;Lots of space for track buffer nbuf equ $-1 ;Last byte in track buffer storage area end åååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå? ***************************************************************** * * * Single Drive copy program. This program allows pip (or any * * other program) to copy or move data between diskettes by * * prompting for a disk change operation on drive A. Will allow * * back ups to be made with only one drive. * * * * Written for Thinker Toys by Bobby Dale Gifford. * * 12/17/79 * * * * The program SINGLE tricks CP/M into thinking there are * * two drives when in actuality only one drive is present in the * * system. To execute the program give the command: * * SINGLE S * * followed by a carriage return. The messge: * * SINGLE INSTALLED * * should appear, followed by the CP/M prompt. At this time, * * if an access to drive B is made, a prompt will appear * * requesting you to insert a diskette of the proper density * * into drive A. Type a return. CP/M will now access drive A * * thinking it is actually drive B. When CP/M return to drive * * A, another p * * Exit by printing an error message. No change made. * * * ***************************************************************** exit lxi d,what ;No change message exit1 call list ;Entry point for different message on exit jmp wboot ;Do a warm boot on exit ***************************************************************** * * * List a message on the CP/M console device. * * * ***************************************************************** list mvi c,9 ;Print buffer command jmp entry ;Enter CP/M ***************************************************************** * * * Insert the code for the new selection routine into the ram * * below the ccp. * * * ***************************************************************** insert lhld entry+1 ;Get pointer to base of BDOS lxi d,-(ccpsize+6+100h) dad d push h ;Save pointer to relocated single lxi d,heart ;Pointer to code to relocate lxi b,map ;Pointer to relocation map relrst byte of the jump cpi (jmp) ;Is it a jump opcode ? jnz exit1 ;Error if not inx h mov a,m ;Should point to newsel cpi newsel-heart jnz exit1 ;Error if not inx h ;Point to high byte of address mov d,m mvi e,5 ;Form address to controller page ldax d ;Get the byte of controller address mov m,a ;Reconstruct controller address dcx h mvi m,1bh ;Offset into controller rom to drive select lxi d,remmsg jmp exit1 ***************************************************************** * * * Unknown command error message. * * * ***************************************************************** what db acr,alf db 'Unknown command - NO change made.$' ***************************************************************** * * * Successful insertion message. * * * ***************************************************************** insmsg db acr,alf db 'Single installed.$' ***************************************************************** rompt will be given to you requesting that you * * reinsert the original drive A diskette. This procedure will * * continue until the command: * * SINGLE E * * is given followed by a carriage return. A message should * * appear saying: * * SINGLE REMOVED * * followed by the CP/M prompt. * * The program is intended to allow backing up diskettes * * for those users with only one drive. To back up a diskette * * follow these these procedures. * * * * 1) Execute SINGLE S. * * 2) Use PIP to copy all or a selected group of files * * (actually any program should run). * * 3) Follow the prompts for inserting diskettes ( Suggest * * you write protect the original diskette (Tab OFF)). * * 5) When the CP/M prompt reappears, ececute SINGLE E. * * * ***************************************************************** title '*** Single Drive Utility For CP/M Ver 2.2 ***' acr equ 0ah ;Carriage return alf equ 0dh ;Line feed wboot equ 0 ;CP/Mo ldax b ;Get a relocation byte ana a ;Test if byte needs relocated jm putjmp ;If minus then all done mov m,h ;Assume relocation jnz incre ;Move this byte directly ldax d mov m,a incre inx h ;Bump relocation address inx d ;Bump source inx b ;Bump relocation map jmp relo putjmp lhld wboot+1 ;Get pointer to CBIOS lxi d,seljmp ;Offset to drive select jump dad d ;Form pointer to drive select jump lxi d,badmsg ;Message pointer mov a,m ;Get the jump opcode cpi (jmp) ;Is it a jump instruction ? jnz exit1 ;Exit if not a jump inx h mov a,m ;Get first byte of jump address cpi 1bh ;Is it a jump with correct offset ? jnz exit1 inx h ;Get page address of controller mov a,m pop h ;Restore pointer to relocated code push h push psw ;Save page address of controller inx h lda entry+1 mov m,a ;Insert first byte of new bdos location inx h lda entry+2 mov m,a ;Insert second byte of new bdos location xra a sta entry+1 ;Modify entry to jump to * * * Seccessful removal message. * * * ***************************************************************** remmsg db acr,alf db 'Single removed.$' ***************************************************************** * * * Bad Cbios format message. * * * ***************************************************************** badmsg db acr,alf db 'Bad Cbios format found - NO change made.$' ***************************************************************** * * * Byte for byte map of code to relocate. A zero represents no * * relocation, a 1 represents a relocateable byte, and a 0ff * * represents the end of the map. * * * ***************************************************************** map db 0,0,0 ;jmp db 0,0,0 ;jmp db 0,0,0 ;jmp db 0,0,0 ;jmp db 0,0,0 ;jmp db 0,0,0 ;jmp db 0,0,1 ;lxi db 0,0,0 ;shld db 0,0 ;mvi db 0 ;mov db 0,0,1 ;sta db 0 ;cmp db 0 ;rz db 0,0,1 ;lxi db 0 ;ana db 0,0,1 ;jz  warm boot tpa equ 100h ;CP/M transient program area tbuff equ 80h ;Command line buffer ccpsize equ 800h ;Size of CP/M ccp aspc equ ' ' ;Space entry equ 5 ;CP/M BDOS entry location seljmp equ 30h ;Offset to jump to select drive ***************************************************************** * * * Main reconfiguration program. * * * ***************************************************************** org tpa start lda tbuff ;Check if any command given mov b,a ;Put counter in B lxi h,tbuff+1 ;Beginning of command line loop dcr b ;Check for end of command line jm exit ;If minus then error exit without change mov a,m ;Get charactor typed on command line inx h ;Bump scanning pointer cpi aspc ;Skip spaces jz loop ;Continue if space cpi 'S' ;Check for "Start" command jz insert ;Insert the code if true cpi 'E' ;Check for "End" command jz remove ;Remove the code if true ***************************************************************** * relocated code mov a,h sta entry+2 pop psw ;Restore controller page address lxi d,3 dad d mov m,a ;Form second jump (home) dad d mov m,a ;Form third jump (seek) dad d mov m,a ;Form fourth jump (status) lda wboot+2 ;Get page address of CBIOS dad d mov m,a ;Form fifth jump (oldinp) dad d mov m,a ;Form sixth jump (oldout) lhld wboot+1 ;Get pointer to CBIOS lxi d,seljmp+1 ;Offset to select drive jump dad d pop d ;Restore pointer to relocated code xchg lxi b,newsel-heart dad b xchg mov m,e inx h mov m,d lxi d,insmsg jmp list ***************************************************************** * * * Remove does the opposite of insert. It modifies the address * * to be in the original state. * * * ***************************************************************** remove lhld wboot+1 ;Pointer to CBIOS lxi d,seljmp ;Offset to select drive dad d ;Form offset to select drive lxi d,badmsg ;Assume error mov a,m ;Get the fi@db 0,0,1 ;lxi db 0,0,1 ;call db 0,0,1 ;call db 0,0,1 ;lxi db 0,0,1 ;call db 0,0,1 ;call db 0 ;push db 0,0,1 ;call db 0 ;pop db 0,0,1 ;lda db 0 ;ana db 0,0,1 ;lxi db 0,0,1 ;jz db 0,0,1 ;lxi db 0 ;mov db 0,0,1 ;lda db 0 ;ana db 0,0 ;mvi db 0,0,1 ;jz db 0,0 ;mvi db 0,0,1 ;jmp db 0 ;mov db 0 ;mov db 0 ;ana db 0 ;rz db 0 ;inx db 0 ;push db 0,0,1 ;call db 0 ;pop db 0,0,1 ;jmp db 0,0,0,0,0 db 0,0,0,0,0 db 0,0,0,0,0 db 0,0,0,0,0 db 0,0,0,0,0 db 0,0,0,0,0 db 0,0,0,0,0 db 0,0,0,0,0 db 0,0,0,0,0 db 0,0,0,0,0 db 0,0,0,0,0 db 0ffh ds 100h-($ mod 100h) ***************************************************************** * * * The rest of the program is relocated to execute with the * * current CP/M being executed under. * * * ***************************************************************** heart equ $ ;Beginning of code to relocate diff set tpa-$ oldbdos jmp 0 ;New jump to bd*********************************************** insamsg db acr,alf,acr,alf db 'Insert "A" (return) : ' db 0 insbmsg db acr,alf db 'Insert "B" (return) : ' db 0 crlf db acr,alf,0 end ååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååÃ3 Copyright (c) 1979, Digital Research????????????CON:RDR:PUN:LST:DEV:VAL:USR:DSK:TTY:CRT:BAT:UC1:TTY:PTR:UR1:UR2:TTY:PTP:UP1:UP2:TTY:CRT:LPT:UL1:R/OR/WSYSDIRR/O R/W SYS DIR ** Aborted **Active User :Active Files: Drive Characteristics65536: 128 Byte Record CapacityKilobyte Drive Capacity32 Byte Directory EntriesChecked Directory EntriesRecords/ ExtentRecords/ BlockSectors/ TrackReserved Tracks is Temp R/O Disk: d:=R/OSet Indicator: d:filename.typ $R/O $R/W $SYS $DIRDisk Status : DSK: d:DSK:User Status : USR:Iobyte Assign: =Bad DelimiterInvalid AssignmentBad Delimiter: Bytes Remaining On R/, Space: Invalid File Indicator** Too Many Files **File Not Found Size Recs Bytes Ext Acc65536 set to R/O Invalid Disk AssignmentWrong CP/M Version (Requires 2.0)!9"2!TùÍíþ ÒOÍÒË!]6:\ÖÖŸõ:]Ö ÖŸÁH¡ÒrÍ3 Ë:\þÊ€ÍË͇ /Ò‹ͺ *2ùÉ!"q*"&ëÍLÉ Í� Í�É Í�É!$p+q*#~þÊÑ*#NÍ�*##"#÷É!&p+qÍ *%DMͱÉ ÍOÉ ÍOÉ!(q*(&ëos home jmp 09h ;Controller track 0 seek seek jmp 0ch ;Controller seek routine status jmp 27h ;Controller status routine oldinp jmp 09h ;Jump installed oldout jmp 0ch ;Jump installed newsel lxi h,oldbdos+diff ;Insert new bdos jump in case of warm boot shld entry+1 mvi b,0 ;Get last selected drive olddrv equ $-1 mov a,c ;Put new drive into A sta olddrv+diff ;Update last selected drive cmp b ;Check if same drive rz ;Done if same lxi h,insamsg+diff ;Insert A message ana a ;Test for drive A jz next+diff ;Take jump if selecting A lxi h,insbmsg+diff ;Else get insert B message next call mesg+diff ;Print message call oldinp+diff ;Get response lxi h,crlf+diff ;Echo carriage return and line feed call mesg+diff call status+diff ;Get status of currently selected drive push b ;Save track call home+diff ;Home drive pop b ;Restore track lda olddrv+diff ;Get drive to select ana a ;Test for drive A lxi h,trkb+diff ;Point to place to save track for B jz next0+di:€G!�ú~#þ ÊþSÊ*þEÊŸÅÍ%à Ã*úöå: §úItÂCw#Ã8*0~þÃÂ#~þÂ#~áåõ#:w#:w¯2|2ñwww:ww*1Ñë ës#réÃ%*0~þÃÂ#~þÂ#Vw+6ýà Unknown command - NO change made.$ Single installed.$ Single removed.$ Bad Cbios format found - NO change made.$ÿNO change made.$ Single installed.$ SÃà à Ã'à à !"y2¸È!g§Ê*!‚ÍZÍ !›ÍZÍ ÅÍÁ:§!VÊK!Qq:§ÊÃNy§È#åÍáÃZ Insert "A" (return) : Insert "B" (return) : ååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååÍLÉ!*p+q*)ëÍO2'É!,p+q*+ëÍO2'ÉÍO2'ÉÍOÉ!.p+q*-ëÍLÉÍRÉÍRÉÍLÉÍRÉ\ÍLÉÍR"Éÿ ÍOÉ!/q*/&ë ÍLÉ!1p+q*0ë#ÍLÉÍ~*##N!ͽ€Íž"TÉ!Vq*VMÍöͳÉ!Xp+q!WÍÃë* >WåÍr#MáͲÉ!_p+q!`6>!`¾Ú6*`&ë*^å*`&Y ѾÊ/>É!`4 >É*]&€ ~þ ÂO!]4Ã9!a6:aþÒæ*]&€ ~2bO>¹Òz*bMÍëà Íë>!b–Ÿ/õ~Ö,ÖŸÁH±õ~Ö:ÖŸÁH±õ~Ö*ÖŸÁH±õ~Ö.ÖŸÁH±õ~Ö>ÖŸÁH±õ~Ö<ÖŸÁH±õ~Ö=ÖŸÁH±Òß*]&€ 6Ãã!]4ÃT!]4É!cq*a&Y :cw!a4É!gr+s+p+q!h6>fÍêµÊr*dë*fÍ!is*dëÍ�"dPY! Íë"f>ÍÓµÆÿŸ!h¦#õ~“ÖŸÁH¡ÒaÍ«Ão!h6:iÆ0OÍ�ÃÉ!mr+s+p+q*lTåÍZëás#r*lëÍâÚ¶*lëÍâë+s#r*jN#F+q#pÃŒÉ!nq!"o"q}2uo&"s* ësÍÝÚ:nÒñ*sDMÍÛ2u:uÚqoÍs*s"sÒÎ*oɹÍÒÉÇÍÒÍŠO ÍÕÍÒ!v6>!v¾ÚQ*v&w 6`i+4Â6Ï)ÍA*Í:'þÿÊ“:'懇‡‡‡O!Ï) ~2vþåÊ�:væO!w 6Í,Ã]!v6>!v¾ÚÂ*v&w ~Ò»*vM Í!v4˜ÉãÍÒÍ8ÆAOÍ�:Í�èͱ*##N!ͽ"—* N#F*—ëÍ "™ff ;Take jump if selecting drive A lxi h,trka+diff ;Place to save track for A next0 mov m,c ;Save track number lda olddrv+diff ;Get drive to select ana a ;Test for drive A trka equ $+1 ;Storage for track on drive A mvi c,0 ;Pick up track for A jz seek+diff ;If selecting A then take the jump trkb equ $+1 ;Pick up track for drive B mvi c,0 jmp seek+diff ;Seek to proper track ***************************************************************** * * * Mesg prints a message on the console. * * * ***************************************************************** mesg mov c,m ;Get char to print mov a,c ;Put copy into A ana a ;Test for end rz ;Return if done inx h ;Bump pointer to message push h ;Save pointer call oldout+diff ;Print the char pop h ;Restore the pointer jmp mesg+diff ;Continue printing ***************************************************************** * * * Messages output by the program. * * * ******************åA>ÍÓµÖŸ!—õÍøµÆÿŸÁH¡Ò% ÿÍÒÃ- *™DMÍÀ ͱÍ·DMÍÀ  ͱ* N#FÍÀ 9ͱ * ^#Vë))DMÍÀ Tͱ* ~�ÍêµÊ *�}Ò *ŸMÍÌÍÃ!�ÍÃë+s#r#4Ãè É!¢s+p+q!¤6!¦66:¢!¦¾Ú„ !¥6!£6>!£¾Úr *¤&ë* å*£&Y ѾÊi !¥6!¤4+4ÂA :¥Ò} :¦É!¦4Â- >É!ª6Í99Í 2§þ¨ :ªÖÆÿŸÉ!ª4:§þ :2©!¨6+6>!§¾Ú :§‡‡O!9 DMÍi ­ͱ:©æ‡‡!¨†O!Y DMÍi :¨Æ2¨:©æþ2©Í !§4 ÃF :§þ® ²ÍÒÈÍÒúÍÒÍÒ)ÍÒ!§6>!§¾Ú« Í :§‡‡O!9 DMÍi 8ͱ!¨6> !¨¾Ú¤ Ã… :¨Æ2¨Òk ä  Í�:§‡‡‡‡!¨†O!Y DMÍi Ãw !§4ÂC ÃF :§þ¿ Í>ÉÃF :§þÂÍ ÍÝ ÃF :§=2§‡‡‡‡2¨Í9:Yþ=Êï ;ÍÒ>ÉÍ9*¨&Y DMÍ =2¨þÿ IÍÒ>É!©6ü:§=2§þÿÊ8 :©2©:¨‡‡2¨Ã :©!¦!¨¶2Í9:Yþ ÂT >É:Yþ,Êe \ÍÒ>ÉÃŒ É!¬p+q*«~þ:ʉ *«NÍ�*«#"«Ão :Í�É!®p+q!'"±!°6>±ÍêµÊü *­ë*±Í{2¯*­ëÍ�"­PY! Íë"±>ÍÓµÖŸ!°¶+õ~“ÆÿŸÁH±Òù !°6:¯Æ0OÍ�à kÍ�ÉååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååÃöCOPYRIGHT (C) 1978, DIGITAL RESEARCH   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMN~# ÂzÉo&)))))))ÉÍþaØþ{Ðæ_É_Ã> Íœ> ÜåÍ¢á~·ÈåÍœá#ñ*'ëÍx: OÃëÃëÃë!Ãë$Ãë'*éÃÃ{¾À#z¾+ÉÍÄ|µÊá ^#Vë"'ÍúÊ0PÍúÊ0 ÍúÂK>N2)>2(å9Íxá)ÍxÃ\>2))Íx9ͽ! "$>ÿ2!!!4:(¾ÊõNÍÎ>ÿ2":)!"4¾Êá!"^!*FNÅÍÔÁy�̓ë*$DMÍܯ2&:&þ ÚÆ!šͱÍŽþ ÂäÍ¢Ã{<2&:#·Ê×ÍèÃÚÍâ·Ê{ê!"$>42))ͽÃgÉ1i!÷ͱ:]þ ÊT\Íõ<Â!òͬÃä¯2|Å\ÍðÁ·ÂK  ! åDMÍÜ\Íðá·Âš€Ã3! ͬÃä!ͬÍŽþ ÊšÖAþÚoÍñÃTÆA26ÖA2 Í¢!,ͱÍŽþ ÂäÍ¢¯2#Í!Áͱ!JͬÍŽþ ÊäÖAþÚµÍñÚÆA2†ÖA2 !wͬÍŽþ ÂäÍ¢!#6Í!ÁͱÚÍñ¯2 ÍÄÍ¢Ã!ÓìSYSGEN VER 2.2SOURCE DRIVE NAME (OR RETURN TO SKIP)SOURCE ON Í, THEN TYPE RETURNDESTINATION DRIVE NAME (OR RETURN TO REBOOT)DESTINATION ON , THEN TYPE RETURNPERMANENT ERROR, TYPE RETURN TO IGNOREFUNCTION COMPLETEINVALID DRIVE NAME (USE A - P)NO SOURCE FILEÍ ÉÍQ" Í8ÆAOÍ�jͱÉÍ·DMÍ� ÉmÍÒÍ Í ÉÍZ"³Íl"µ!·6>³ÍêµÊ¥ *³}Ò† *·MÍÌÍ �ͱ*µ}Òx OÍ�Ã} WÍ�„ͱÍ !³ÍÃë+s#r!µÍÃë+s#r#4ÃD Í É:\þʹ :\=OÍÌÉͳÍ© !6!Ì)6ÿÍlÒä :Ì)þÂÚ É:Ì)=2Ì)Ãð :]þ Âð Í& É!"¸}2\!h6?!j6?\Í:'þÿÊC:'懇‡‡‡Æ€o&"º)!Ë)6!"¾):Ë)/¸¾)õÍÝŸÁH¡Ò˜Í]!Æ)6> !Æ)¾ÚŽ*Æ)&ë*º)å*Æ)&ë*¼)Á ¾Êy!Æ)6 Ä:Æ)Ö ÖŸ2Ë):Æ)<2Æ)ÂM*¾)#"¾)Ã/:Ë)Ò©*¾)+"¾)Ã`*¸"¾)#"¸Í]!¸ÍøŸ*¼)ë!õÍøŸ/ÁH±Òí¥ÍÒ!"¾)!"¸Í]*¾)º) å*¾)ëás#r!Æ)6> !Æ)¾Ú.*Æ)&ë*º)å*Æ)&ë*¼)Á w:Æ)<2Æ)Â*¾)º) >w#6*¾)º) w#6*¾)º!) w#6*¾)º%) w#6*¾)º) N#F*¾)ź) Áq#p*¾)º%) å*º) ~ÑÍe å*º) å* ~á¦o&€ÍžÁ å*¾)º%) Áq#p!Ç)6* >ÿÍõÒÒ!Ç)6!Æ)6>!Æ)¾Ú=Ãñ:Ç)!Æ)†wÒ×Ã=*Æ)&ë*º)~2È):Ç)þÂ*Æ)& ë*º):È)¶2È):È)þÊ:*¾)º!) å*¾)º) ëÁÍsÃãÍ,à >¸ÍêµÂXºÍÒÃ\:Ì)þÿ“>!¸ÍõÒd!"À)>!À)ÍõÒd!"À)!"Ä)*¸++ë!Ä)ÍøÚa*Ä)¼) ^#Vë"¾)Í]*¼)"º)*Ä)º) ^#Vë"¾)Í]!Æ)6> !Æ)¾ÚT*Æ)&ë*º)~2É)å*Æ)&ë*¼)~2Ê)OѹÒ;*Ä)º) ^#Vë"Ãß copyright(c) 1977, digital research $Error On Line $SUBNo 'SUB' File Present$Disk Write Error$Command Buffer Overflow$Command Too Long$Parameter Error$Invalid Control Character$Directory Full$Cannot Close, Read/Only?$!9"ð!“ùÍÌÍŠÍþ͇É!Ýp+q*Üë ÍŠÉ!àp+q*ßëÍ�2ÞÉ!âp+q*áëÍ�2ÞÉ!äp+q*ãëÍŠÉ!æp+q*åëÍ�É!èp+q*çëÍ�É!êp+q*éëÍ�2ÞÉ!ïs+p+q+ÑÁp+qÕ:ï=2ïþÿʦ*ëå*íÁ w*ë#"ë*í#"íÃÉ!óp+q(Í÷+Í÷¶Í÷*òDMÍ÷*ðùÉ�ÅôÍp*€&ô 6:ÅeÍp\Í:ÞþÿÂ=ͧ!t6€É>!t¾Ò%\Í=þÊ >É!t6:t<2t=O!€ ~2uþ Âb:¸<2¸O>9¹Òb!¸60+~9¹Òb!·60+4:uÖaþÒt:uæ_2u:uÉ»ÍMþʉSͧÉ!v6!"v!|6:|Ò€!x6Í 2}ÖÆÿŸõ:}Ö ÆÿŸÁH¡Òk:}þ Êh:}þ$Â6Í 2}þ$Âæ*}MÍÄÃ3:}Ö02}O> ¹Òþ�ͧÃ3!z6Í­:}þÊ"!}5Í�ÒÃÍ­ÃÍ�Ò3*yMÍÄÃ"Ãh:}þ^ÂaÍ Öa2}O>¹ÒV�ͧÃ^:}É>É*z&ô ~þ ÂÃ!z4íÉ!{q*v#"vÿÍ™ÒÞdͧ*vv :{w:x<2xO>}¹Òý|ͧÉ» ON DISKSOURCE FILE INCOMPLETERN TO SKIP)SOURCE ON Í, ò?ÀååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååÂ)*Ä)¼) å*Ä)º) ãN#Fáq#p*Ä)¼) å*Â)ëás#r*À)#"À)!Æ)6 ÃJ:Ê)!É)¾ÒJ!Æ)6 :Æ)<2Æ)ÂÆ*Ä)"Ä)ÒˆÃq:ÒtÉÍÒÃwÍ Ðͱ!"À)¸À)ÍÝÒ�*À)º) ^#Vë"¾)Í]Í .å*¼)DM\á -°!\6:Òé\Í£:þÊÛæͱÃæ*}DM'ÍÍ«*¾)º%) N#F'ÍÍ«*¾)º!) N#F'ÍkÍ�Í«*¾)º) N#FèÍÍ«RÍ�/Í� *¼) ~ÒIOÍ�ÃNWÍ�Í«Í8ÆAOÍ�:Í� *¼) ~2È)Òt(Í�ÍÀ:È)Òƒ)Í�*À)#"À)ÃÍ& Ã\!"À)¸À)ÍÝÒ\ÍäÒ°ÍÉ*À)"¾)Í]Í ÍÀ*Ì)M! ^#Vëé *¼) >€¶*¼) wà *¼) >¦*¼) wà *¼) >€¶*¼) wà *¼) >¦*¼) wÃÏáó.å*¼)DM\á -Â+!\6Íuìͱ:Ì)‡‡O!™ DMͱ*À)#"À)ÙÉ*¾)))))Ï)"¼)É:mþ Âw>É.Yn -Â:YÖSÖŸõ:ZÖ ÖŸÁH¡Ò§!6>þÉ©Í 2Ì)þ½ŽÍÒ>É!Í)6> !Í)¾Ú*Í)&ë*¼)>¦2Î)þ Ê÷:Í)þ Âð.Í�*Î)MÍ�:Í)<2Í)ÂÅÉÍ9Í9:Yþ=Â/Í9õÍþÒ&Í© ÍcÃ,ùÍÒÃHÍ© 9Í þÂEÍÃÃHͺ ÉÃÃÃÍÉÉÉi`N#F�oˆgÉë_ë…oŒgÉë_ë¥o¤gÉDM!>õ)ë—)ë�‘o|˜gÒ˜ ñ=†ÉDM!>)ë)ëÒ­ =Â¥É~ ³É^#Vë) ½É^#Vë|·g}o ÂÇÉ_{•ozœgÉi`N#F‘o˜gÉo&•oœgÉ_{–_z#žWëÍ-!Û6»Í]:Þþÿ·ͧÍz2~þÊe:~2€O!� 6*~&‚ 6$>!~¾Ò_Íz*~&€ w!~5ÃBÍxûÍ:ÞþÿÂyÆͧÉ*v+"vv ~ÉÃÃÃÍÉÉÉ_{•ozœgÉ001 $$$$ SUBååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååB›É Extended Submit Vers 2.0, Copyright (c) 1979, Digital Research Extended Submit Already Present$Requires CP/M Version 2.0 or later$Å:þÊœ FÍÁÉ Íþ Ò° fÍÁÉ!~=ÖÁÅ�WÕ!x±ÊÎ ~#ÃÁÑÁåbx±Êð {æÂãã~#ão}oÒì„ÃÒÑ.é6:Íð:éþ!"*"!E"á"›éÃ1½ 5Í!€"™!E"*›é (xsub active)$áå|þÿÒyþ Ê�þÂë"™ëÃÍÉ*™ëÍÉÅÕÍ`ÑÁÍõÍiñÉõÍs<ÉÕ̓Ñ ÊÕ:·Ê=2õÍs!^#6 #6 #6$ Íá¾ÚÎ~O #w# ÂÑõ!6:=2·ÂñÍsÉ$$$ SUB *­å€€Í !€"­!¯4*­DMÍ‚eÍ/þÊ7 ¢Í«€*Ü"Ü!ª4Âå :•Ò1 :¬<2ª!"Ü:¯½Êš €Í‚eÍÝ!¯:q–2q:…2«eÍÊ:ªÖ€2ªO:«‘æ2…ä€ H$! A� ‚"!$"„"XSUB $$$åååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååCååååååååDååååååååEååååååååFååååååååGååååååååHååååååååIååååååååJååååååååKååååååååLåååååååå