IMD 1.17: 24/12/2010 11:57:25 v bios x3.094 4/4/83 Ã\ÎÃ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ÖàþÒîà: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ÕàÍÞÌÝÉå€Í!ßÃußà ãÃãÃÏæÃ·æÃ¿æÃöæÃ çÃçÃáãÃïãÃMåÃ[åÃ`åÃeåÃ~åÃçÂæÃ èÃþâîxáyázá{á|á}á~áá€á�á‚áƒá„á…á†áAUTOST 0123456789 [þŸâ9þ þ[þŸâIþ!þ,â@âRâvâ         !"#  (¸?À-?€R€ ›?À$ª?ÀñýåÍãýáÉÕýáýé1Ë:9á2¯2< 1ËÍÖåÍñ>õÍ›ç!èþ6éþí°>ÿ2ìþ€Í`å!Œè"÷ï>Ã22!á"!Ó"!páÁ:oá (~·( ÅËOí°Á>¸(Õ’ãÍšæÑ!Ë:OéNENCORE 59k CP/M vers 2.2 Rev X3.094 gG 1983 OSBORNE SOFTWARE TEST ONLY ÍÖå¯2èþ2êþ2áþÉÝåyþÒFä2âþ!â·Êä!â"þÍžäÂ.ä*þå ^#V2þ2ãþ*ôïÝuÝtáÝáÉ|äæ Vä:âþÆA2{ä2�äÍšæÝá!:æ‘À2É% Can't recognize diskette on drive ! Unformatted diskette on drive ÅÝ!þy·(Ý#Ý#ÝNÝF*ôïíBÁËC(|·Èþ0}þ 0¯ÉÍ-å XxËQ(Ë'ËY(Ë'Ë'Ýå!ŸâÝ! â¾( Ý#Ý#ö2õ"þ+y¾(ñ#êñ*þÝ~w#Ý~w Ý!þÝ~w#Ý~w¯ÝáÉ>ÉööíKùï:úïGÅ:âþ2úïÍñ:ùïOÑz2úï{2ùïÉy2áþ:ëþ±È¯2êþÉy2ÞþÉíCÛþɯ2êþÍæëí[Ûþ€í°È¯2èþöÉÅyþŸå:ãþþ>(>2êþ:áþ2ëþ:ßþ<!êþ~·Ê¾å5:þG:ìþ<¸Â¹å!ëþ4¯2ìþöÿÍæ*Ûþ€í°ÁÀ<2éþyþ(¯É:éþ·È¯2éþ:æþ2úï:åþ2ûï:äþ2ýï:çþ2ùï!ýï4Ãñ2Ýþ:ãþæGŒè:Þþ!€( ë0ë)æõ2àþÕ:èþ·(!äþàþ¾ #øÑ¯ÉÍÖåõ>2èþ:âþ2æþ2úï:áþ2åþ2ûï:àþ2äþ2ýï:ãþ2çþ2ùïñ :Ýþ·(ѯÉ!ýï4ÍñÑÉ:ìþ¹(¯2êþy2ßþi`{²Èn&É!¿æ!öæ·ÈGOÕÅ屿ÕéáÁÑðÉ!)çÃåæ:æÊ ñ!1çÃåæ:æ :bç·ÊñöÿÉ!!ç:ýæ_^#fké!]á~· 5Å#ëÍŸæÁ!AçÙ!1çÒ!)çË!9çÄIç èlèIçSçèoèSç ñèqè ñ˜çè[è˜ç ñ%èqè ñ:bç·ÊñöÿÉÝå!bç~·( Ý*YþÝ~4ÝáÉÍñþ€8öþŽ0#Ë'_Ý!>áÝÝnÝfÝ^ÝVíSYþíR}2bçÀ¯ÌöÿÉó:<á‡_!âç^#~ö@W>Ó!{Ó(>Ó!zÓ(¯Ó!>ÏÓ(>Ó!>ÿÓ(û¯Ó1Ó1Ó1Ó1>@Ó1:;áÓ1>'Ó1Ɉ áCƒâA Ћ}hE4# Û1æÈöÿÉÛ1æÈöÿÉÍ è(ûÛ0ÉÍè(ûyÓ0ÉÍè::á·Èæ > ¹ÀÍèÍèæþ ÷ÉÍ è·ÈÍèæþÀÍèæþ ÷É>Ó!>ÿÓ(Û/æÈöÿÉöÿɯÉÍ[è(ûó>Ó!yÓ(>Ó!>ýÓ(>ÿÓ(ûÉ IS IN ERROR RESET DEFAULT TO DRV A STO A,CDISK ;SET DEFAULT TO A RET DENERR: DB DENL DB CR,LF,'Can''t recognize diskette on drive ' DRV: DS 1 DENL: = *-DENERR-1 FORERR: DB FORL DB CR,LF,'Unformatted diskette on drive ' DRV1: DS 1 FORL: = *-FORERR-1 PAGE CHKSEL: ;Determines if new DPB should be established ;ENTRY ;C = disk selection value (0..15) ;E = BIT0 = 0 IF first call for this disk ;EXIT ;IX = address of drive sequence number ;Z status bit set, good return ;ZåååååååACT COMt VBIOS0 ASMVBIOS1 ASMVBIOS ASM€ !"VBIOS ASM€#$%&'()*+,-./012VBIOS ASM>3456789:VBIOSG DOC;åååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååÃàACT I 808x Copyright SORCIM Corp. 1981 S/N- 007,Version 3.5EEV SorcALL ASMFilenameHEXÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏFilenamePRNÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏ„?ÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏ1¹;ÍŸ41Š9Ã9!Ÿ42 Í£'6 #6 #6¯õÍŽ ©4!:Íf'*:;'*:;'ÍFñ<*ù9½ÚÃ9>T2œ9>2a$Ío*¨9|µÊLHÍÓ&*Î9ë*Ú9ë*Ò9Í(%ëb;'*Ì9ë*Î9Í(%! Í©ë"e:UÍÓ&*:†;'!HHÍF*‘|µÊ§ÍÜ&!õ"ÍF*e:|µÊá:Š9æ€Âá!B6 <Íf'ÍfÍ1*è9}´Êá3ÍÓ&!"ÍFÍ`$Í%>2ª9!ŒÍl$à Last error occurred on Page 123 Total LOST references were !?="Þ9*Ø9"Ò9¯2ô9go"¨9*¥9&"¦9>s2K¯2:2:ÍŽ ¯2œ92®92Ç92¼92Å92¡92°92æ92ç92Q:go"½9!e:"^:"±9*ö9":"ú9:ø92:Í5:¦9·úÄ=2¦9>2¢9òÄ2§9>T2œ9> 2K*Þ9ÍøÚüÃÑ1Š9ÍîÚÍ6Ú:�9·Ä4ÍH*:"þ9*ú9"ü9*î9¯¼ÂX!Ó.ÃX:£9·ÊÑÍ“ÃÑ*Þ9 "Þ9:¦9·ú¤:£9·Ìõ*¨9}´ÂüÃeG:£9·Â=< È!¹;~·Ê´$þ ÂP>__Í»$#ÃD> 2Ÿ4Íd"`:~ë·G&òvæG!˜.Í#%fh"c:2e:*ð9"nxþ(Êê:¼9·Â¶ xþ=ò– :£9·Â:ç9·ÂÑxþ(ü=:c:Gþú þ6ú)ÃÑ!K="â9! B6<Íf'ÍcÍGÍõ!B5"@5Í.">2£9>É2Ð2>22JÃì! :æ9·Ä­!$:¼9·Ä­ÉFUnterminated IF nest. IUnterminated MACRO definition. !Ò.~OæÈÍ#%~æwyæ<Í#%ÃJ*Î9ë*ä9 ~æßw# æœ~æ?ÊœÕåÍp ^#Vá#N#Fë ër+s Ñ Í9'ÒnÉ!µÍ­ÃÑ~2Ÿ4#ÃW$OToo many PROCs in program. *Ê9–?Í9'Øå "Ê9ë*à9 "à9Áy½Âöx¼Êý  Ãìë!e: Íf'·É:d:_ÍÄ ÃÑ:ç9·Â¶!"f:"µ:>(¸Ô=*ð9"n!%4:c:Í#%^#Vëé>SÃE>E2Ÿ4Ã\*^:›Å}!e:"^:2d::£9·Ê e::d:Íç !®9>¶wd:G::þÊ�!§4ú ÍW †ú :œ9æ Ê ÕÅÍ“!®9~æþwÁÑÃ�ÍnÃ>-2¤4Ã>OÃÔ>YÃÔ>SÃÔ>EÃÔ>A2Ÿ4Ã*n|·Êc~·ÂÈÃcÍ=Í…Úü"::s2:¯Í¨ Í:£9·Ê½:¼9·>YÂ:æ9·Ê>F2Ÿ4¯2ç92æ92¼9Í—!ÍTÃ.:í9·>PÊ?*ì9~2Ÿ4à Í’Ú |µÂ >P2Ÿ4à R::£9·ÂpͬÊÈÍ%ÃÑ·Ã ͬÊÈþ/ƒͺ:ù9þÒ¾Íp åëÍ%áÕÍÇÑÒ­!´Íf'!ù9~G?2:>€ÍN*nÍ»Êþ,ÂÈ#Ãþ!Ç94Â:£9·Ê¤>OÃÔÍvÚëÍÆ ÍÐÕͼ ÑðÍvÚ":"ú9:s2:2:ÍÐ> 2:åÃDÍvÚ"ú9:s2:ÍÐG::¸Â’ë*:Í9'> Ê”>#2:!­4wðÍv:ræ¡G:e:°ÍNÍÐ:ó9·*:ë°>L2Ÿ4ð!e:~"^:*ð92Í~ÍÃc!e:~"^:æ2®*ð92»ͬÍÃc!e:"^:ÍÍvÚ |·Â }þÚ >W2Ÿ4>2[:\ÍÄÂ> Í’"\:ÍÐ,ÍÄÊ ::*^:wÚ\>S2Ÿ4Ã\*ð9e:Í×'ÚÍ:£9· Âb ÍÔÃ*â9–?Í9'>OÚÔ "â9à *n~þ*!�9Œ9ʽ Íf'ͬþ-™ ͬÕ+Ð Í­Ñ>UÚÔN!œ9{¡_~±«wͬþ,Ê‹ ÃÆ ëÍN'*n#~·ÂÈÍTÃÑ L@ C D F G M RÍ’Ú:œ9æ@ÊëSÍÊ ÕÍ’ÑÚUÕÍ�ÑÍfÃÑ:œ9æ@ÊÍ�Í^ÃÑ!¢9F6€:£9·Â6 °úÑÃI :œ9æ@ÊI ÅÍ�Á!ª9~°w*ð9~þ>SÂÔ## <ÍS%ÃÑ*ð9Í©Ú\·Êœ õÍÄ¡ ë¹.Í­Ú­ ñ–­ #:¤9·Ê¦ ¾Êª ö€2¤9>CÃÔ>EÃÔ>SÃÔ~2¤9Ã*ð9#N#Û Íf'!ç Íf'!Ì ÍW$ÃáUnknown CPU: 'ÏÏÏÏÏÏÏÏÏÏÏÏ' Í“!§46'#å*ð9Í©·Ê OëÑÍf'à Ñ;'ÕÍÂø Ñ!) Í�'!Ÿ4>!–ôO$Í“ÃÑ' ¯2»92º9Ív}2¹9Ã| :¹9·ÊõÕåͤáÑñ=ÃD !¼94:e:·Â- *ì9Í?>LÚÔ͇ "¹9Í< ####>€Íñ*Î9##"·9ÃÍ'Ð!:Í¡':§92:*Ì9ëÍØ:*Ì9ë Íf'ë"Ì9úÿÉxþ #"·9Í5%Í*¹9~ö w##s#r*Î9##Íh'Ãþ%ÈÖ0øÂ+ Éþ Ò3 Æ‚ÉÖøþÐö€É~æ ÊG >@¶wÉå!:͆ëáØö€>¶wÉÍ× Í:£9·Ä“*½9#"½9Í *c3å ¯Íñá~æ ʪ(~öw##^#V*·9å·Ê  ú§ w#Ã’ ÑͤÃÑæO:»9=¹ÚÔ yå*Î9Í#%N#Fx±áÊÔ ·ÊÔ þ ÊÔ w#ÃÄ Ã’ *ì9"ê9|µÈ~·Èþ Èþ:Êô þ Êû #Ãà !"ê9É6!"ì9É*ê9"ì9!¿9"ê9ë*½9;'*Î9ë!ê9Íf'*ð9ëz³ÊV þ Â6 s#r#·ÊZ þ,Â; þ >ÂP Ã) s#r#"·9x2»9ÉO:æ9G·Êƒ ˆ =2æ9Ê} :ç9�¶2ç9Ã>FÃÔ:ç9·Ê´ �¶Ã} :e:·Âb !æ94:ç9·Â¶Ívëz³Â°Ín:£9·Ä“:æ92ç9ÃÑ*ú9"ú9*:":ÉåÕY*ü9"ü9*þ9"þ9ÑáÉ>LÃò >S2Ÿ4É!::ø9¾Èw:£9·ÊÄ {:Ãç :ù9OÅxÍ~ Íö :£9·Â2*:ë*:":":Í™ Áx¹ÚÉÍö Í(::2:> *ú9G:§9°2:":!"ò9*ì9|·ÈÍ?Úë *n~·Ê}þ:Ê}þ Äë Í1ÚÕ"ò9F::O¨æ@°y°wåë*:ë#::w#s#ráxæ Ê´xæ@´>¶w:£9·Èxæ>DÄò :Š9æÈ>€Ãñ:£9·Âý:[:O::G!d:y�ú÷O4QÍÕ JÃäx‘2:É:[:*\:·Èþ Ú ÖlMWÍ›%O::’_G͆%!:¶w{=ò@~6*^:w#"^:!d:4ÍÕ ::W{2:[: ’Ãýë!¬46^#ëþ':£9·ÄMë*ú9##ëÍ(%ë"f:É!§46=##ëþ'ÍÕ Í©Úêë·Ê�V=Ê�#^=Ê�>V2Ÿ4*^:s#r+ëÍêÂyÉÍÅÍÕ Íêõå*^:>A+¶wáñ¬ÉÍ©ÚáO·ÀG·ÈxÎÈ!Ÿ46VÉ*n+6É:d:�2d:*^::£9·ÂyÍ#%à Aw# Â"^:*n+~#þÉ:í9·Ê(Í=*ð9"nÉ*ú9¡4;'::ɹ;>~þ;7ʧþ*7ʧþ 7ʧ:¼9·Â¡ ÍÆÚ§'¸ÊÍ.þÊõþ!Êáþ_Êšþ;ÂŒ:²9·Â¯> ¾#„òþaÚ˜þ{Ò˜î #ÃV#ÍÆÒž#:²9·Ê²*³9"¯9þ ʵ>!¹;¾?É~ ·úÞþÊÞ¹Ðþ ÈþÈþ 7È·yÉ#:²9·Ê²Õë*±9ͤÑõ#N Íf'ÃV>Õ#ÍÆÚ"þ'Â#~þ'Â"#à ãx·Â)+páÃVÿ¹Ê9þ ÂB#ÍÆÒ0È+> É!"ì9"î9"ð9!ì9ë!¹;~þ Âp ~#þÈþ Âf}| ÈÃfåÅO!�~¹ÊŒ#·Â�7yÁáÉ,+-*/()><=^&[] : \Í(%ÈåÕ*¯9ë*³9Í9'ÔÕÁá+~ y°Â¹*·9ëÍ9'Òö"¯9¯2²9É*·9.:Ó9”þÚö„g"³9"¯9ëÉ:²9·Â *¯9ë*³9Í9'Ò ë"µ9>ÃaÍÕ*<<³4:¡9W~#æ2¡9þ Òþ ÊFþ Êþ ÊRþÊfÆÀ>Þ Ãzþ > Â: Ã"<<> `i"±9!³4¯2®9·Éz2¡9 ÅåÍÀá>=Í9'ÁÒ�ͪÂ> !\Íí#!�7É\\\ END Statement Missing Å!><å\Íý#6ëáyÁþÉ Í·ÈÍþÊÙ ÍÉ!âÍW$ÃáACT stopped by user. ë*Ê9ëÍ9'Ø"Þ9"à9\Õ Íf'áÍ»#ÚË$!VÍe%!VC Íf'>‚2a$!CÍ‚$Íf$!>="<<6·É Pass 1 - Reading D:FILENAME.EXT ;}; ÏÏÏÏÍ’Ø:ræ À>Uá*ð9"n|µÂ’7É*nͩڤþ?Ð>E2Ÿ4¯7goÉë!"t. "r!9"jz³>SÊëëͼÍþ2lþ ÊÇþÊþÊþÊKõ*h};Í9'Ê+~ÍfñõÅÍfñ¹úÍbÃâñÍMÃÇÍb*h};Í9' ÍÓõå*f;Í9'Âåáñ;·ÊAþÂ:þú@ë·2s"tÉÍb*hÍ9'Êå+~þÂH"h> 2lÃÇ!zÍ#%ªÍ9'ÚåF#NÉ   de~#þÊåþ ʼ+"n>2l!;"f!};"h6>2qÉ>E*jù2Ÿ4!"tt>2s7ÉͬÈþ0ú þ:úQþ:ÊzÍÚzþÂB~þG#ò4åþV#^áÂ6ZÃ6T]Í#%>¡2rxß›*n+Í­Úåë"në#~·ðæG:lþ xÈ+~·ò”!þ9þOʃ!:þPʃ!ü9þLʃÕ> 2r^#V#F>áßG·> ÈxÉ,\]/*ÿƒ$ÿ‡+�^^^&()=<> <= >= < > ~-‚ANDDEFEQGT GE HIGHLE LOWLT MODNE NOTORREVSHLSHRXOR+ÍÀ%>NÚç> 2r>#ß:põxö€2pÍÀ%Áx2pÃU+ðÍ­Ú’Í{Ú’#~ë"nÉ*n+Íç:s*n2s"nëÍ,> É*n|·ÈÍ»#"nÉ#~þ ʺþÉ*n+~¹È·À+"n¹ÉÕ*f;Í9'>OÊç+~2r+~+^+V"fëÑÉÍÓõ:ræþ2rñþ2sÈþú=Í#%~+fo>þ>2sÀ&ÉÍóëÍóëÉ:såõ*f<;Í9'>SÚçñÑr#s#w#:rw#"fÉG*h·;Í9'>SÚçp#"hÉ>2q*h};Í9'Òå+"h~þÒå!…Í#%Ã9nu‹ŸÏÚÃñý åd”)0ºÆ€<D··ÃåÍóÿÿÃÆÍ {­oz¬gÃ)Í {¥oz¤ÃËÍ {µoz´ÃËÍ#Ê÷!ÿÿÃ)Í#Êë!Ã)Í#Ê÷ÚëÃ÷Í#?ÃÍ#ÊëÚ÷ÃëÍ#?ÃÍ Ã9'ÍólÃ3Íó>2q¯ÃËÍó}lÃËÍó:rG> 2rxæ Âëxæ€Â÷> 2Ÿ4Ã÷Í ëÍÏÃ)Í Ã)Í ëÍ5%Ã)ÍóëÍ5%ëÃ)Í Í­%Ã)Í EÍ=%ëÃ)Í Í©ëÃ)ëz³Êå|µÊÃÕÍ5%Ú»Ñ PYÉÍ Í©Ã)ø)ÃÏ:*Î9ë Íf'ë:°9=¼Úö"Î9$"·9úþ É!ÿÍW$Ãá  Memory OVERFLOW Stopped ACT!ëÕÍ/ÁÒöq#p#ë É*Ò9Í(%:´9ºÐë"Ò9É:~Í%"n:¯::þ:Â`:Ç9·È¯É7Éå͆ÁÐ`iÍ?Ú�Í'Ú�ë!d3r+s+É7!`3ÉFxë!Ò.þHúœ!d0þRúœ!2ͰØæø2b:þ!?ÉëGN#x¾ÊÐÕyæ_yæƒ_ѯ¾Â°#7ÉÕ# yæÊã¾ÊÑÑ÷yÁ·ÉÍ?>EÚ¯2:2:Í1ÜÕ>¶w##^#VO:£9·ÊÕÅ#¯ÍñÁÑy2ræ€À>U72Ÿ4É*Ì9ë*Ð9Ã8*Î9ë*Ì9:åëëáÍ9'Êbå!ôÿ ®Â=åÅ# ¾ÂcÂSÁáÃhÁáÃ= þ:Â|:Ç9å ^»áÂ=ѯÉôÿ :~õ wåëôÿ ®Â“ÑÍ9'ʺÕåÅ# ¾ÂµÂ¥ÁáþÁáÃ�ñ7ÉÑñ¯Éë!�6ÃØ> …oÜD®ÂÐåÕ#¾Âñ ÂáÑáÃöÑáÃÐÍ9'7È·Éþ0Ú þ:Øþ?Úþ[Éþ$Êbþ#Êbþ.Êb·É~ÍýÒJ%# Â~ÍýÐ#Ã,Ÿ4ÃJ%ã~#ã…oÐ$ÉŸ4ÕÍf'ÍHáÃO$:£9·È@Õ!ª9~ö€wÉ*ª9z…¼Ò^:Ÿ4þ Ê|ÕÍ.Ñ> 2Ÿ4ÕÍ.ÑÂ�Ã5:œ9æ È:Ÿ4þ!?怰G:®9W:œ9Oæ@ÊÒ:ç9·ÊºyæÊÒzæÊÄ¡ÊÒzæÊΡÊÒ>@°Gzæ¡°GG·Ê&õzæÊü>+2¦4*µ9³4~#þ ÂïëÃ!³4> ¾#Â6 #6ñò#åõ2�*¨9#"¨9!Ÿ4ÍO$ñáÄH> 2³4Ã5!Ÿ4:žG~Â=> w#þ Â56 #6:Š9æ@ÀÍÞ!Ÿ4Í\!ª94É:Š9æÊl$ë*Ÿ9:ž9G·Ê…æw#xþ€ÂlÕÍœÑÃlx2ž9"Ÿ9É*Ÿ9:ž9q<þ€Â•!ŸzÍ8$Ò¸:Š9æóö@2Š9!ÄÍW$¯G2ž9!Ÿ"Ÿ9ÉList file write error. *ª9}¼Ø±ÍJ%:�·Ê !“±Íf'*‘½ÍÜ&*¬9"‘¯2�<2ª9*¬9#"¬9üÍÜ&!¯Í\! Ã\³4>Œ2¥$:Š9æ>ÂB>20Íú:02æ9Ÿ4:žOÍJ%>$!Ÿ4".Í%~·úéë*.ë> å ëæÊ„>sw#UÒšDÚšÚ›npëáåÍf'Õë*Ì9Í9'Ú¼ëÑÍAëÃÉá6m#6a#6c#6 ###".á6ÿ:Š9æÂo:æ9=2æ9ÂbÍñÃH:æ9!0¾Ð*.6 #ÃC*Î9ë!—?~þ:Êå ~áæ þÂ~ö€w Í9'ÒÉ*Î9DM !—?å~·òEx¼Â1}¹Â1áöÉÑÅÕåF¸ÚdÂ] Êd#ÃKáÑT]ÃfÑáÁåë Ã6 ^#V¯ogºëʉNs#FrYP+Ãy>‡!³4".2æ9ë|·Ê×^#VÕÍâ#~/·ò­#æoy&Íå&ë".á:æ9=2æ9æ•åÍñÍ5Ñ>Ë:æ9þÄñÃH#^å*.ëÍÜ&áÉO:£9·È:Š9æÈ:œ9æÈ::þ:Èþ?È:ª9æ±2@åÍ/Ò7áN#Fë:@+w:¬9+w+p+qër+sÉ*è9#"è9áÉ~#foþ' no ERRORs, 1234 Labels, h bytes not used. Program LWA = h. *Error page 999SYMBOL TABLE *Error page 999 SORCIM 808x Assembler ver 3.5E mm/dd/yy hh:mm Page 999 ë~ÍÃ'ëÉ:£9·Àë*:ëÍ9'Ð":ÉOi`) ))�6 É2:2:ÍŽ *:"ú9ÉÍp : Ãf'::Íp :ë Ãf'õ*:Í^ Í™ ñÍ~ *:àÍ^ "::Š9æÈ:‹9·Âw"ë*O::Q:Í#%Í9'ÈÍ!!*:"O:ÉG·ÈÕ_ÍÄ Ñ:Š9æÈ:‹9·Â<"Í#"Í" >¹Â!ÕÅy2Q:Í&!ÁÑÂ!y2Q:É:Q:·È ÅQ:€G!!:Í"Í"Í"Í#"Ñzþ ÂP!ë:N:ÍÃ'ë6 #6  :Ír!*O::Q:Í#%"O:¯2Q:2N:!):É*@5w#}þBÂ�!|þ6Â�!ÅÍÂ!Á!B5Âu!"@5É:Š9æÈ:‹9·Â·"Í!!>12':*:"O: Í(!*@5B5Íø!Õ!B5VÍ$ÒÝ!:Š9æý2Š9!ß!ÍW$ÑÉHex file write error. ëÕ €ÑÍ9'ÕÒü!Ñëp#Í9' "ÉÅO:N:‘2N:yÁÃW :Q:O!):Ã#%:Š9æÈ:‹9·Â—"É*O:xÍ#%"O:!µ:~#·Êf" ÊÃ#ÅåOogÕÍ5#Ão"ÅåÕ_Íj#ÑáÁÂI"É::Oë*O:Í9'Š":M:¹Èy2M:> ë"O:Ãá">Í\#!]Í#> *�6Íá"> *™6Íá"É::O>*:Íá":Y:þÊÓ"X:Ír!ž*@5B5Íø!ÃÂ!åÅõÍò"ñÍ\#ÁáÃ5#>¹Ð>?¹È:Z:¹Èy2Z:Å>Í\#ÁyÍp å~þ Ê##Â#ÕÍt#Áá^#åÅÍr#Á Â&#áÉyþ?þÚH#åÅÍú"ÁÃN#æÆå_PÍt#ÑÕÍr#á\Ãr#@³_Ãt#\åÍj#ÑÕÍt#Ñz·ÈKÍ›%O:Y:’Õ_G͆%!X:¶w{=ò #ëÍr!¯2X::Y:W{2Y:bÑz”WÃu#à YÃå ¯w# ÂÃ#ÑÕÍÃÚ#ëÕÍÑþÿ7È! ¯wÉëÍÉå€ÍÑÍÉÅÍD$ÕåÍáÑ·Â$€ Á Âý#·ÉÁ7ÉÅÍD$ÕåÍáÑ·Â$€ Á Â$·ÉÍD$Í·È7ÉåÕëÍÑáÉ:k$æþÈÍ`$Íl$Ãf$>2k$É>Ãb$:k$·Oò‚$æ2a$2k$O Í»$~þÈæ#þ ¡$Ù$ Í»$xæ“$> _xþUÒ¯$Í»$Ä$|Í»$ Í»$ åÅÍÁáÉ~·ÈOÍ´#É!Ø$ÕÍ`$Íë$Ãç ?? OPEN error - ÕÍl$Ñ!¹;6#Íe%¯!¹;Ãl$:Š9æÊ%VÍ:Š9æÈÍ�zÍÉ…oÐ$ÉMDy“_xšWØÀ{·Éz/W{/_Éx·ÈzW{_Ã=%>  ÂL%É~þ ÊJ%·ÊJ%# ÂS%É A·Ês%Æ@O:q#p#ëÍf'>.Ãf'x·yÈú”%·Â�%É·”%É!¤%Í#%~¡É?ÿÅBKë!x±Ê¾% ô%ÁÉÅåBJ~þ0Úá%þ:ÚÜ%þAÚá%þ[Òá% #ÃÇ%+Fãy·ÊR&:p·ú &x Ê &þBʯ&þNÊ&þQÊl&þHʆ& :pæþBʯ&þQÊl&þHʆ&yþúG&ÊA&þú;&Ê5&'ÍV&èÍV&dÍV& ÍV&ÍV&·áÁÉÁ7ÃN&~Ö0úQ&þ òQ&#·Èë =Âe&ëÉ~Ö0úR&þòR&³_ #ÊM&ë)))ëÃl&~þ0úR&þ:ú�&þAúR&þGòR&Öæ³_# ÊM&ë))))ëÆ&~Ö0úR&þòR&ë)µoë# ²&ÃM&ðØÍø&Í'üÍø&Í'œÿÍø&Í'öÿÍø&Í'}Æ0>02'É>0Õ]T< Úû&=kbÑÉG:'¸Â'> Éx>ÿ2'É0~æÆ0~æÆ0#ÈyÃ'z¼À{½Éx±È¾7À# ÃA'Í9'ÈÚh' ë ë+~ x±Â['Éx±È~# Ãh'x±È~þaÚ…'þ{Ò…'æß# Ãu'É~·È#Ã�'¾7À·È#Ö'z³Èq#ã'ÅO:½'=@I±' ®'ÁÉV|ÍÃ'}õÍÌ'ñæÆ�'Î@'ɯ2©(#~þ:+:\Âó'~æßÖ@Øþò8(##·Â(åÕͬ#Ñáæ<~þ>:7ÈÍ:(Øþ.Ê$(~þ.#Ê$(y·Ä^(!SÍ:(Ø Ä^(:©(·7Àx·É7É~þÈÍi(Ø#þ.Ê^(þ*ÂV(>?Ía(~#·É Â:(·ÉG>  Âa(xÉþ!Ú8(þ|Ê8(þ;Ê8(þ=Ê8(þ:Ê8(þ@Ê–(þ#Ê–(þ*Ê–(þ?›(2©(·Éþaò¢(·Éþ{ðÖ wÉ!d:6͹-¯2e:>I2Ÿ4Ã\Í..ÃÇ(Í>.Ãc¢3]ÍÁ-ÚCÍ¥-ÍM.Í.Ãc-¢3Í“-Ãc>Íd.Ãcle3Í“-ÃcmÃö( Ãã(me3Í“-Ãô(-¢3Í“-Í’"f:Ãcme3Í“-Ãg-à,Í..Í’ÍXÍx.Ãc>IÃó*͹-Í..e3MÍÁ-ÍM.>íÍ!.ÃcØ3ÍÁ-Ú°)Í¥-*¢-åØ3>)µOÍÁ-Üð ÍM.á"¢-Í.Ãcö3ÍÁ-Ú°)͹-Ø3-ÍÁ-Üð ÍM.>íÍ!.ÃcÍs-e3lÍÁ-Üð *n+~þÂÑ)͹-ÍM.ÃcÍs-”3@ÍÁ-ÚC*n"ð9e3\ÍÁ-Úü)Í¥-ÍM.Í.ÃcÍs-͹-Ãg-ö3ÍÁ-Ú*Í¥-ì3ÍÁ-ÒÄ(Ís-e3\ÍÁ-Úü)Í¥-ÍM.Í.ÃJ,Ø3ÍÁ-Új*:£-þʉ*úƒ*ü3 *¢-åÍÁ-á"¢-Ú°*Í¥-Í.ÃcÍs-ü3 ÍÁ-Ú×*Ø3ÍÁ-Òa*Íð Ã\Ís-Ís-ì3ÍÁ-Úƒ*:£-Öƒ*Ø3ÍÁ-Òa*Ã*Ís-Ís-ö3ÍÁ-Úƒ*ì3ÍÁ-Úƒ*:£-Öƒ*Ãa*Ís-Ís-Ø3@ÍÁ-Úƒ*͹-Í..Ãc>H2½+”3@ÍÁ-Ú++ü3 *nåÍÁ-áÚ+͹-ÍM.ÃcåÍs-á~þ[Ê.+"nÃ�,Ís-Ís-ö3ÍÁ-ÚM+ü3ÍÁ-ÚM+͹-ÃÄ(Ís-Ø3ÍÁ-Ú^+Ã,Ís-Ø3)ÍÁ-Ú€+͹-ÍM.>íÍ!.Í’"g:ÃcÍs-e3:½+OÍÁ-Ú§+ÍM.e3ÍÁ-ÚCÍ¥-Í.Ãc:½+Ú>Ís-Í’"f:Í�.Ó+H͹->íÍ!.ÃcØ3ÍÁ-Úá+:£-·Ìð ͹-ÃÄ(Ís-Ãô+>Íd.,ÍÄÂCe3\ÍÁ-ÚCÍ¥-ÍM.>ËÍ!.Í.ÃcØ3=ÍÁ-Ú*,Í¥-ÍM.Í’"f:ÃG,Ís-e3IÍÁ-ÚCÍ¥-ÍM.Í’"f:Í�.Í.ÍÄÂ>ÃcØ3=ÍÁ-Úl,Í¥-ÍM.Í.ÃcÍs-e3]ÍÁ-ÚCÍ¥-ÍM.Í.Ãcü3ÍÁ-Úš,Í¥-Í.ÃcÍs-͹-Í’"f:Ãc”3@ÍÁ-ÚÍ,™3ÍÁ-ÚÍ,͹-ÍM.>íÍ!.ÃcÍs-™3ÍÁ-Úô,͹-ÍM.>íÍ!.”3@ÍÁ-ÚCÃcÍs-Ø3 ÍÁ-Ú-Ø3ÍÁ-ÚCÍ¥-Í.ÃcÍs-e3mÍÁ-Ú;-ÍM.e3lÍÁ-Ú;-͹-ÍM.ÃcÍs-ì3ÍÁ-Ú>:£-·Ê>Ø3%ÍÁ-Ú>͹-ÍM.Í>.Ã8,Í’"f:Í�.Ãc!b:55Ê>*ð9"n*`:##"`:~2d:#~2e:ÉÍÁ-ÚCÍM.Í¥-Ã.¢-æʹ-!d:4·ò¹-4:£9·Àà Å*nÍ­ë"nëÁØy¦_æþÊb#Vë"¢-|·òô-Í’Íx.}2¤-]ÍÄÂCͬþ,ÈþÈþ=ÈÃý¢-æÈæ@öÝÍ!.·ð!g:Fw#pÉ*f:"g:*d:o"e::¤9æû>CÄò >$2±4É:¤9æý>CÄò >#Ã:.*¢-}æo|æ-Â^.!e:¶wÉõÍ’ÑØ¯¼Â†.z¥½Â†.Ã[.}|Ά.É|·È<È:Ÿ4þ À>V2Ÿ4ÉASMHEX080808085Z80 =+CADD› €€ÆADIˆÆCADCœJˆˆÎACIˆÎANA„ #ANDž æANIˆæASEG.ASSERT6BIT”@CALLŠÍCBIT”€CCŠÜCLC�·CMA�/CMC�?#CMPž¸þCMŠüCNZŠÄCNCŠÔCPEŠìCPOŠäCPDRŒ¹CPDŒ©CPIRŒ±CPI#Œ¡CPIˆþCPU3CPŠôCSEG.CZŠÌDAA�'DAD‚ DA&DBE%DB%DCE%‡DCR�DCX‚ DC%@#DEC˜ DI�óDJNZ‹DSEG.DS!DW&ECHO5EI�ûEJECT:ELSE=ENDM<endm<ENDIF=END(ENTRY,EQU+ERR;EXT-EXX�ÙBEXŸããëHLT�vIDENT0IF=IM0ŒFIM1ŒVIM2Œ^#INC˜INDRŒºINDŒªINIRŒ²INIŒ¢INR�INX‚IN,C�@INˆÛ#JMP éÃJNZŠÂJMŠúJCŠÚJNCŠÒJPEŠêJPOŠâJPŠòJZŠÊJRC‹8JRNC‹0JRNZ‹ JRZ‹(JR‹LDAX… LDAŠ:LDDRŒ¸LDDŒ¨LDIRŒ°LDIŒ #LDK—rLD– :í*KFÿLHLDŠ*LINK2LIST8"LK—LOC#LXI‰MACRO5MVI‡SMOVšWGù@(MSG9NEGŒDNOP�ORG"ORA„°ORIˆö"ORž°öOTDRŒ»OTIRŒ³OT,C�AOUTDŒ«OUTIŒ£OUTˆÓPAGE:PCHL�éPOP™ÁPROC$PUSH™ÅRAL�RAR�RC�ØREPT5RETIŒMRETNŒERET�ÉRIMŽ RLC#“RLC�RLDŒo"RL’RM�øRNC�ÐRNZ�ÀRPE�èRPO�àRP�ðRRC#“RRC�RRDŒgRR“RSTƒÇRZ�ÈSBB„˜CSBCœB˜˜ÞSBIT”ÀSBIˆÞSET+@SHLDŠ"SIMŽ0SLA“ SPACE7SPHL�ùSRA“(SRL“8STAX…STAŠ2STC�7sSTO•2Ù"Cp63SUB��ÖSUIˆÖTITLE1USE/VFD)XCHG�ë#XORž¨îXRA„¨XRIˆîXTHL�ã'*M%6[HL]6[IX¶[IYöB C D E H $L -AA?IR AFA6PSWA6SP!6IX$IYdBC B DE D HL$H$AFA6SP!6IX$IYdBC DE HL$[SP]!6[IX]$[IY]d[BC] [DE] [HL]$Ç(á(ì(ô() )%)-))0)3)¾+G)Ä(¾(ÿ(É+ô+ç+ñ*B),U,Ê(©,`)Œ)*!*8*†,6Kl#ÚĪ(ê÷[ žÃïºuX" F a ÃT Eæ w ë  2ÃÍ®8>2k$!"R:ͬ#<Æ@2‰7Ía5:žÆ2¥$:ŸÖ2«9ç͈8ë*à9ë!\å Íf'ë"Ê9"â9á:Š9æÊó4!Vͪ5:Š9æÊ5!zͪ5!AàÍf'!å~õ6!ÆÍl$ñ2å!T Íl$!’.Íû7:Š9æÄf$�6!=5$Ãh'*ABS *CODE *DATA !"ù5!€~·Ê 8#åO 6áù5͹8!?="à9Íl9Ú 8Í}6:Š9°2Š9Íl9Ø6Í­Ú8^#VëPYéåÍæ#áåÍÓ#ÚË$Ñ!\ Í?'Ø\!Ì5Íë$Ãç ?? Hex or Prn file name same as Input = ÷5ÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏ@RÁ6H=0ª6H=µ6LO7L=0Ý6L=CON:ì6L=LP:â6L=ù6Lâ6O7PS(7SLA7S=_7S\7R=0˜7R=S�7R=Fª7Rª7å!’.Íû7á\Í×'Ú8å\ÕV!•.Íé7Ñz! 7Íé7áÉ:Š9æý2Š9Ô5!•.VÍÐ7Ô5>2‹9!RE"•.>L2—.P!µ:Í¡'Ô5ÀÃ�5:Š9æ¿öï6>`2i$:Š9æ·Ã¯6! 7zÍÐ7:Š9æ¿öï6PRN;72�9Ô5;7ë"ö9Ô5:;7þd!x8Ò8þü¯72ŸÔ5P;7þÉ2Þ¯É`i+~þ=ÂÎ7#ÍÀ%Ú8{ÉÅÕÍû7áÑÕÍ×'ÑÐþ:È!d8Íë$ÃçåëYPÍf'áÍþ7ÉSÃf'!8Íl$Ãç!28Ã8!R8Ã8!d8Ã8Command input errorNO source file specified, ABORTMal-formed numberIll-formed filenamePS > 99SL < 60/!Í'> :!Í'!§8Íf'É Page *%"Ø9"Ò9ÉÕOÍD9ÍT9 ú.9}|:k9·Â9~þ Ê 9þ Ê 9þ,Ê 9þ;Ê 9þ|Ê.9þ Ê.9·Ê.9þaÚ 9þ{ò 9î w#ÃÙ86#ÃÁ8:k9–Ê(9~þ Ê.9·Ê.9#Ã96#ÃÙ86go~·Â<9ѯx·É~þ ÊO9þ ÂS9#ÃD9É~þ'Êd9þ"Êd9¯2k9É6#2k9Éù5Õë~#¾Ê‡9<+w#‡_^#VëѯÉ7ÑÉÀTTTTTTTTTTTTTTTTTŸ€=±9µ9hhhh?=—?—?—?Ò9€Ø9ÿ?=—?¿9 ÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏ:99999900ÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏ99 ?ÏÏÏÏÏÏ\:e:`:ÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏÏ prompt/command response JMP X30D2 ; end  ',*Ð7:Š9æ¿öï6PRN;72�9Ô5;7ë"ö9Ô5:;7þd!x8Ò8þü¯72ŸÔ5P;7þÉ2Þ¯É`i+~þ=ÂÎ7#ÍÀ%Ú8{ÉÅÕÍû7áÑÕÍ×'ÑÐþ:È!d8Íë$ÃçåëYPÍf'áÍþ7ÉSÃf'!8Íl$Ãç!28Ã8!R8Ã8!d8Ã8Command input errorNO source file specified, ABORTMal-formed numberIll-formed filenamePS > 99SL < 60/!Í'> :!Í'!§8Íf'É Page *%"Ø9"Ò9ÉÕOÍD9ÍT9 ú.9}|:k9·Â9~þ Ê 9þ Ê 9þ,Ê 9þ;Ê 9þ|Ê.9þ Ê.9·Ê.9þaÚ  CCP: = 0H LINK VBIOS.ASM åååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå CCP: = 100H LINK VBIOS.ASM åååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå;.Date: 4/4/83 ;.Author: DEB & RWC ;.Title: ENCORE CP/M 2.2 CBIOS Rev X3.094 ;.Comments: ALPHA ; +---------------+ ; | | ; | ENCORE CBIOS | ; | | ; +---------------+ ;X.0 FIXED BUG IN "FILL" BY ADDING CPMSEC TO HOLD THE CPM LOGICAL SECTOR PRIOR TO A READ OF WRITE ;X.1 ADDED SERIAL I/O (NON INTERRUPT) : deb ;X.2 ADDED CENTRONICS PRINTER : deb ;X.3 REMOVED IEEE : deb ; Changed location of buffer area for SETUP : deb ;X.4 REleaved stack usage in CHKSEL : deb ; Made SERIAL MODE byte soft : deb ;X.5 Changed CNST to call the rom : deb ; Removed LKEY : deb ;X.6 Added SISTAT (serial input status) to jump table : deb ; ROMJMP dosent setup the stack anymore : deb ; Made CRTOUT (console output) a direct rom call, COUT : deb ; Added CI & SKEY as direct rom calls : deb ; Made RWBOOT a direct rom call : deb ; Made SENDEN a direct rom call : deb ; Made RSEC & WSEC direct rom calls : deb ; Bios no longer uses ROMJMP :deb ; Fixed bad comment on DDXLTS : deb ;X.7 Made IMSG message ALWAYS come on : deb ; Shortened IMSG : deb ; Changed name to EXPRESS : deb ; Took out ESCH : deb ; Changed function key DEFINITIONS : deb ;X.8 Changed interface to rom : deb ; Made MOVCPM : DEB 3/24/83 ;X.9 Changed KEYINP to screen any key above 8Dh : deb ; Made CNST faster : deb ; Reorganized the disk section a little : deb ; Made CHKSEL a little faster : deb ; Added COPYRIGHT message : deb ; Made CONST go a little faster : deb ; Took out FINAL routine : deb ; Took the call to FLUSH out of the home routine : deb ; WBOOT calls FLUSH : deb ; Fixed bug if FILL : deb ; Changed error return in WRITE to return with HSTWRT reset : deb ; Made CONST go a little faster : deb ; Made CONOUT go a little faster : deb ; Made SELDSK go a little faster : deb ; Added SEC_TRK to SELDSK & WRITE to hold the number of sectors per track : deb ; Put the call to FLUSH back in the HOME routine : deb ; Final before ALPHA : deb ; Fixed IMSG for MOVCPM program : deb ; Made MOVCPM : DEB 4/1/83 ;X3.094 ALPHA : DEB MSIZE: = 56 ;CPM MEMORY SIZE ;THESE ARE NOT USED IN FINAL VERSION ;CCP: = 0BF00H ;location of ccp ;CCP = 100H ;CCP = 0H BIOS: = ccp+1600h ;LOCATION OF BIOS BDOS: = ccp+806h ;LOCATION OF BDOS MSG 'CCP = ',CCP MSG 'BDOS = ',BDOS-6 MSG 'BIOS = ',BIOS MSG 'DDT R = ',1F80H-BIOS LF = 0Ah ;^J = Line Feed CR = 0Dh ;^M = Carriage Return IOBYTE = 3 ;ADDRESS OF IOBYTE CDISK = 4 ;Current logged-in CPM disk DBUF = 80h ;Default disk buffer ;CP/M to host disk constants FPYSIB: = 2048/128 ;Sectors in floppy disk block (OCC single density block size = 2K) FPYDIB: = 1024/128 ;Sectors in floppy disk block (OCC double density block size = 1K) ;CP/M disk control block equates which define the disk types and maximum storage capability of each disk type. DSKS1: = 5 ;Single density ( 256), single sided. DSKD1: = 0Ch ;Double density (1024), single sided. XEROX: = 1 ;Single density ( 128), single sided. IBM: = 8 ;Double density ( 512), single sided. DEC: = 8 S1DSM: = ((40-3)*2*10)/FPYSIB D1DSM: = ((40-3)*8*5 )/FPYDIB XXDSM: = ((40-3)*1*18)/FPYDIB IBMDSM: = ((40-1)*4*8 )/FPYDIB DECDSM: = ((40-2)*4*9 )/FPYDIB ;BDOS constants on entry to write :WRALL: = 0 ;write to allocated WRDIR: = 1 ;write to directory WRUAL: = 2 ;write to unallocated PAGE ;TRANSFER RAM MEMORY LOCATIONS SEQ: = 0EFF4H ;(2) COUNTER (USED BY BIOS) DMADR: = 0EFF7H ;(2) DISK DMA ADDRESS SAVTYP = 0EFF9H ;(1) DISK TYPE SDISK: = 0EFFAH ;(1) DISK IN USE SAVTRK: = 0EFFBH ;(2) TRACK SAVSEC: = 0EFFDH ;(1) SECTOR VIDBUF: = 0FE00H ;FBA OF BUFFER IN VIDEO MEMORY ;ROM JUMP VECTORS ROMVEC = 0F100h ;Start of rom vector RWBOOT: = 0F100H ;WARM BOOT SKEY: = 0F103H ;KEYBOARD STATUS CI: = 0F106H ;CONSOLE INPUT COUT: = 0F109H ;CONSOLE OUTPUT RSEC: = 0F10FH ;READ A SECTOR WSEC: = 0F112H ;WRITE A SECTOR SENDEN: = 0F115H ;sense DENSITY ROUTINE PAGE ;8251 CONSTANCES SI.MRST = 0100_0000B ;Master reset in command mode SI.MOD = 11_10_11_10B ;MODE BYTE : 2 STOP BITS_PAR. EVEN/DISABLED_8 DATA BITS_16x SI.COM = 0010_0111B ;COMMAND BYTE SI.RRDY = 0000_0010B ;Receiver ready SI.TRDY = 0000_0001B ;Transmit ready ;8155 CONSTANCES ;CENTRONICS PP.ORDY = 0000_0100B ;1=BUSY, 0=READY FOR OUTPUT PP.SSTRB = 1111_1101B ;SET STROBE PP.CSTRB = 1111_1111B ;CLEAR STROBE ;I/O 8251 PORTS (registerS) SSTAT: = 31H ;STATUS & COMMAND register SDATA: = 30H ;DATA R/W register ;I/O 8155 PORTS PREGS: = 21H ;8155 register SELECTION PORT PDATA: = 28H ;8155 DATA TRANSFER PORT (OUTPUT) ;PADATA = 10H ;INPUT DATA FROM 8155 PORT A (DATA PORT) PBDATA: = 18H ;INPUT DATA FROM 8155 PORT B (STATUS PORT) PAGE ;Macro for generating Control Blocks for disk drives ;The format of these disk control blocks are as follows: ; 16 bits = -> translation table. ; 48 bits = Work area for CP/M. ; 16 bits = -> DIRBUF. ; 16 bits = -> Parameter block. ; 16 bits = -> check vector. ; 16 bits = -> allocation vector. NDSK: SET 0 ;Number of disk drives NOFDD: SET 0 ;Number of floppy disk drives ALVSZ: SET 0 ;Allocation vector size CSVSZ: SET 0 ;Check vector size DPHGEN MACRO TYPE,XLATE,DIRBUF,DPBADR NDSK: SET NDSK+1 DW %2 DW 0,0,0 DW %3 DW %4 DW CSV+CSVSZ DW ALV+ALVSZ NOFDD: SET NOFDD+1 CSVSZ: SET CSVSZ+(64/4) ALVSZ: SET ALVSZ+((D1DSM+7)/8) ENDM ;Macro for generating the Disk Parameter Blocks. ;Disk type definition blocks for each particular mode. ;The format of these areas is as follow: ; 8 bit = disk type code ; 16 bit = Sectors per track ; 8 bit = Block shift ; 8 bit = BS mask ; 8 bit = Extent mask ; 16 bit = Disk size/1024 - 1. ; 16 bit = Directory size. ; 16 bit = Allocation for directory. ; 16 bit = check area size. ; 16 bit = offset to first track. DPBGEN MACRO TYPE,SPT,BSH,BSM,EXM,DSM,DIRSIZ,ALVMSK,OFFSET DB %1 DW %2 DB %3,%4,%5 DW %6-1,%7-1,REV (%8) DW (%7+3)/4 DW %9 ENDM PAGE ;The following jump table defines the entry points into the CBIOS for use by CP/M and other external ; routines, therfore the order of these jump cannot be modified. The location of these jumps can only ; be modified by 400h locations, which is a restriction of MOVCPM. ORG BIOS JMP CBOOT ;Cold boot JMP WBOOT ;Warm boot JMP CONST ;Console status (input) JMP CONIN ;Console input JMP CONOUT ;Console output JMP LIST ;List output JMP PUNCH ;Punch output JMP READER ;Reader input JMP HOME ;Set track to zero JMP SELDSK ;Select disk unit JMP SETTRK ;Set track JMP SETSEC ;Set sector JMP SETDMA ;Set Disk Memory Address JMP READ ;Read from disk JMP WRITE ;Write onto disk JMP LISTST ;Return LST: device status JMP SECTRN ;Sector translation routine ;Extensions JMP SISTAT ;SERIAL IMPUT STATUS JMP ROMJMP ;JMP TO ROM PAGE ;This area is reserved data storage area for the set-up program to install printer drivers, function ; keys, auto boot command, iobyte value, and auto horizontal scroll flag IOBITE: DB 0 ;default to serial printer=40h ; parallel printer=80h PRNTER: DB 00h ;default to standard serial=0 ;Qume ETX/ACK =1 ;Diablo XON/XOFF =2 MODE: DB SI.MOD ;SERIAL PORT MODE BYTE (8251) BRATE: DB 16 ;default baud rate IS 19200 DB 0 ;UNUSED XLTBL: DW CNTRL0 ;Fixed length table DW CNTRL1 ;contains pointers DW CNTRL2 ;to strings DW CNTRL3 ;to decode DW CNTRL4 ;function keys DW CNTRL5 DW CNTRL6 DW CNTRL7 DW CNTRL8 DW CNTRL9 DW UP DW RIGHT DW DOWN DW LEFT DW EOTBL ;end of table address DB 0 ;UNUSED PINTFG: DB 0 ;Flag indicates if printer has been initialized DB 0 ;Length of string DS 16 ;Printer initialization string ACMD: DB 1 ;auto command = 0 ignore auto boot ; = 1 auto on cold boot ; = 2 auto on warm boot ; = 3 auto on both CAUTO: DB CAUTOL ;length of auto command here DB 'AUTOST ' ;auto command goes here CAUTOL: = *-CAUTO-1 CNTRL0: DB '0' ;Variable length table is placed here by set-up program, with xlttbl CNTRL1: DB '1' ;pointing to the entries CNTRL2: DB '2' CNTRL3: DB '3' CNTRL4: DB '4' CNTRL5: DB '5' CNTRL6: DB '6' CNTRL7: DB '7' CNTRL8: DB '8' CNTRL9: DB '9' UP: DB 'K'-40h ;Default values RIGHT: DB 'L'-40h ;for the cursor DOWN: DB 'J'-40h ;keys are standard LEFT: DB 'H'-40h ;values for CP/M EOTBL: = * ORG BIOS+256 ;space reseverd for function key decoding PAGE ;Control Blocks for disk drives DPBASE: DPHGEN DSKD1,DDXLTS,DIRBUF,DPBD1+1 ;Drive A: DPHGEN DSKD1,DDXLTS,DIRBUF,DPBD1+1 ;Drive B: PAGE XTAB: ;Translation table addresses DW DDXLTS ;Double density Osborne translation table address DW XLTS ;Single density Osborne DW XXXLTS ;Xerox translation table address DW IBMXLT ;IBM translation table address DW DECXLT ;DEC translation table address DW XTRXLT ;User defined translation table address DDXLTS: = 0 ;Translation table for DOUBLE DENSITY OSBORNE 1 to 1 XLTS: ;Translation table 2 to 1 DB 0, 1, 4, 5, 8, 9, 12,13, 16,17 DB 2, 3, 6, 7, 10,11, 14,15, 18,19 XXXLTS: ;XEROX TRANSLATION TABLE 5 to 1 DB 0, 5, 10, 15 DB 2, 7, 12, 17 DB 4, 9, 14 DB 1, 6, 11, 16 DB 3, 8, 13 IBMXLT: = 0 ;IBM TRANSLATION TABLE, No translation 1 to 1 DECXLT: ;DEC TRANSLATION TABLE 2 to 1 DB 0, 1, 2, 3, 8, 9,10,11, 16,17,18,19, 24,25,26,27, 32,33,34,35 DB 4, 5, 6, 7, 12,13,14,15, 20,21,22,23, 28,29,30,31 XTRXLT: DS 40 ;Space for user defined expansion PAGE PROC ;Disk type definition blocks for each particular mode. DPBSTART: ;Start of Disk parameter blocks, used by select disk routine DPBD1: ;Osborne Double density, single sided DPBGEN DSKD1,8*5 ,3, 7,0,D1DSM ,64,1100000000000000B,3 :DPBS1: ;Osborne Single density, single sided. DPBGEN DSKS1,2*10,4,15,1,S1DSM ,64,1000000000000000B,3 :DPBX0: DPBGEN XEROX,1*18,3, 7,0,XXDSM ,32,1000000000000000B,3 :DPBIBM: DPBGEN IBM ,4*8 ,3, 7,0,IBMDSM,64,1100000000000000B,1 :DPBDEC: DPBGEN DEC ,4*9 ,3, 7,0,DECDSM,64,1100000000000000B,2 :DPBXTR: DS 16 NUMDPB: = (*-DPBSTART)/10H PAGE ROMJMP: ;JMP TO ROM ;ENTRY ;E = LOW ORDER BYTE OF ROM JUMP ADDRESS PROC LDK D,high (ROMVEC) ;SET HIGH ORDER BYTE OF ROM JMP TABLE PUSH IY ;Save user IY ;CALL ROM CALL GOROM ;Go to ROM address (DE) and return to next instruction POP IY ;Restore user IY RET PAGE GOROM: ;This routine is used to simulate a CALL (DE) instruction ;ENTRY ;DE = ADDRESS TO CALL IN ROM ;NOTE ;USES IY PROC PUSH DE ;ROM jump address to IY POP IY JMP [IY] ;Go to ROM, ROM will RET to next instruction PAGE ;The CBOOT entry point gets control from the cold start loader and is responsible for the basic system ; initialization. This includes outputting a sign-on message and initializing the following page zero locations: ; 0,1,2: Set to the warmstart jump vector. ; 3: Set to the initial  IOBYTE value. ; 4: Default and logged on drive. ; 5,6,7: Set to a jump to BDOS. CBOOT: ;COLD BOOT FOR CPM LDK SP,CCP LD A,IOBITE ;get iobyte value STO A,IOBYTE ;Set I/O byte to default XRA A STO A,CDISK ;Set current drive to A INC A JR BCCP ;Do CP/M PAGE ;The WBOOT entry point gets control when a warm start occurs, a ^C from the console, a jump to BDOS ; (function 0), or a jump to location zero. The WBOOT routine reads the CCP and BDOS from the appropriate ; disk sectors. WBOOT must also re-initialize locations 0,1,2 and 5,6,7. The WBOOT routines exits with the ; C register set to the appropriate drive selection value. The exit address is to the CCP routine. WBOOT: ;WARM BOOT FOR CPM LDK SP,CCP CALL FLUSH ;CLEAN BUFFER CALL RWBOOT ;WARM BOOT IN ROM MVI A,2 ;indicate warm boot ; JMP BCCP ;FALL THROUGH TO BCCP PAGE BCCP: ;PERFORM BOOT FOR CPM ;ENTRY ;A = 01, if cold boot ;A = 02, if warm boot PROC PUSH AF ;Save entry ;RESET I/O CALL SIRST ;SETUP SERIAL I/O ;CLEAR BUFFERS LDK HL,CLRSTR STO 0,[HL] ;CLEAR 1ST BYTE LDK BC,CLRLNT ;length LDK DE,CLRSTR+1 LDIR ;OVER LAPPING MOVE(FILL) LDK A,0FFH STO A,UNASEC ;Set default data transfer address LDK BC,DBUF CALL SETDMA LDK HL,HSTBUF STO HL,DMADR ;set ROM DMA address ;Set-up low core pointer cells LDK A,0C3h ;Store jumps in low memory STO A,0 ;LOC 0 STO A,5 ;LOC 5 LDK HL,BIOS+3 ;LOC 0+1 STO HL,1 LDK HL,BDOS ;LOC 5+1 STO HL,6 ;PROCESS AUTOST LDK HL,CAUTO POP BC ;cold/warm indicator in b LDK DE,3 ;SET JMP IN CCP FOR NON COMMAND LINE LD A,ACMD AND B JRZ :1 ;CONT IF NO AUTOST REQUESTED LD A,[HL] ORA A JRZ :1 ;CONT IF AUTOST LENGTH IS 0 ;MOVE AUTOST COMMAND TO COMMAND LINE IN CCP PUSH BC ;HL = SOURCE (FIRST BYTE IS LENGTH) LDK DE,CCP+7 ;DE = DESTINATION LDK B,0 MOV C,A ;BC = LENGTH LDIR POP BC LDK DE,0 ;SET JMP IN CCP FOR COMMAND LINE ;CHECK FOR COLD BOOT :1: LDK A,2 CMP B JRZ :2 ;DON'T PRINT MESSAGE IF WBOOT ;PRINT SIGN-ON MESSAGE IF COLD BOOT PUSH DE LDK DE,IMSG CALL PRINT POP DE ;JMP TO CCP ;DE = OFFSET TO JMP :2: LDK HL,CCP ADD HL,DE LD A,CDISK MOV C,A JMP [HL] PAGE ;SIGN ON MESSAGE IMSG: DB IMSGL ;Length of signon message DB 'Z'-40h DB 'ENCORE' DB CR,LF DB MSIZE/10+'0',MSIZE mod 10 + '0' DB 'k CP/M vers 2.2' ;FOR MOVCPM (DON'T CHANGE!) DB ' Rev X3.094',CR,LF DB 1BH,'g' ;ON GRAPHIC MODE DB 'S'-40H ;COPYWRITE SYMBOL DB 1BH,'G' ;OFF GRAPHIC MODE DB ' 1983 OSBORNE SOFTWARE TEST ONLY' DB CR,LF IMSGL: = *-IMSG-1 PAGE HOME: ;This routine sets the track number to zero. CALL FLUSH ;FLUSH BUFFER XRA A STO A,HSTACT ;MAKE BUFFER INACTIVE STO A,UNACNT ;Clear sector count STO A,SEKTRK ;CLEAR TRACK TO 0 RET PAGE SELDSK: ;Selects disk drive for next transfer. ;ENTRY ;C = disk selection value (0..15). ;E and 1 = 0, first call for this disk. ;EXIT ;HL = 0, if drive not selectable. ;HL = DPH address if drive is selected. PROC PUSH IX ;Save user IX MOV A,C CPI NDSK JNC :2 ;If invalid drive number ;SETUP THE DPBASE INTO SAVDPH ;THIS ASSUMES A TWO DRIVE SYSTEM STO A,SEKDSK ;SAVE DRIVE NUMBER (0-1) LDK HL,DPBASE ;DRIVE A DPH ORA A JZ :4 ;IF THIS IS DRIVE A LDK HL,DPBASE + 16 ;DRIVE B DPH :4: STO HL,SAVDPH CALL CHKSEL ;Check to see if density needs to be determined JNZ :3 ;Unable to determine density, error return ;GET DISK PERM. BLOCK LD HL,SAVDPH PUSH HL ;HL=DPH LDK DE,10 ;form dpb address ADD HL,DE ;to get type LD E,[HL] INC HL LD D,[HL] ;dpb address in DE ;SET SEC_TRK LD A,[DE] ;GET STO A,SEC_TRK ;SET ;SET SEKTRP DEC DE LD A,[DE] ;get disk type STO A,SEKTYP ;and store value LD HL,SEQ ;Get current sequence count STO L,[IX+0] STO H,[IX+1] ;Store seq # in LASTA or LASTB POP HL ;HL=DPH POP IX  ;Restore user IX RET ;RETURN ;Select disk error handling :3: LDK DE,FORERR ANI 1 ;Is diskette unformatted? JRNZ :1 ;Yes LDK DE,DENERR ;No, get density error message :1: LD A,SEKDSK ADD A,'A' STO A,DRV ;Indicate drive in message STO A,DRV1 CALL PRINT ;Print appropriate message on console ;SELECT ERROR :2: POP IX ;Restore user IX ;IF DEFAULT DRIVE NOT IN ERROR RETURN TO DEFAULT LDK HL,0 LD A,CDISK ANI 0000_1111B ;STRIP USER NUMBER SUB C RNZ ;If default drive not in error ;IF DEFAULT DRIVE IS IN ERROR RESET DEFAULT TO DRV A STO A,CDISK ;SET DEFAULT TO A RET DENERR: DB DENL DB CR,LF,'Can''t recognize diskette on drive ' DRV: DS 1 DENL: = *-DENERR-1 FORERR: DB FORL DB CR,LF,'Unformatted diskette on drive ' DRV1: DS 1 FORL: = *-FORERR-1 PAGE CHKSEL: ;Determines if new DPB should be established ;ENTRY ;C = disk selection value (0..15) ;E = BIT0 = 0 IF first call for this disk ;EXIT ;IX = address of dri ve sequence number ;Z status bit set, good return ;Z status bit clear, error return PROC PUSH BC LDK IX,LASTA ;Get last count for selected drive MOV A,C ;Current drive to A - reg ORA A ;Is this drive A? JRZ :1 ;Yes, check sequence number INC IX ;No, form address for B INC IX :1: LD C,[IX+0] ;Get last sequence number for this drive LD B,[IX+1] LD HL,SEQ ;Get current sequence number SBC HL,BC ;Compare seq #'s POP BC BIT 0,E ;First call for this disk? JRZ GDEN ;Yes, fill in DPB MOV A,H ;No, check elapsed time ORA A ;elapsed time < 4 sec RZ ;Yes, good return CPI 02 JRNC GDEN ;IF 2 OR GREATER MOV A,L CPI 0A0H ;elapsed time > 6 sec JRNC GDEN ;YES XRA A RET PAGE GDEN: ;Fills in DPH with appropriate values after determining type and # of sectors ;ENTRY SEKDSK = DISK TO SELECT ;EXIT A = 0, ZERO FLAG SET .... GOOD RETURN ; A = -1, ZERO FLAG CLEAR .. ERROR RETURN ;USES ALL REGISTERS PROC CALL GETDEN JRNZ :5 ;Error, unformatted disk MOV A,B ;# of physical sectors into A BIT 2,C ;bits 2 & 3 of reg C indicate sector size JRZ :1 ;convert # psectors into # 128 byte sectors SLA A ;A=A*2 :1: BIT 3,C JRZ :2 SLA A SLA A ;A=A*4 or A=A*8 :2: PUSH IX ;SAVE IX LDK B,NUMDPB ;Number of DPB's to check for LDK HL,DPBSTART+1 ;get dpb address of # logical sectors LDK DE,16 ;next address LDK IX,XTAB ;first translation table address :LOOP: CMP [HL] ;compare # of logical sectors JRZ :3 ;match check for same type :LP1: INC IX ;no match increment translation table address INC IX ADD HL,DE ;also get next dpb DJNZ :LOOP ;have we checked all dbp's no go to loop JR :6 ;Yes, no match error return :3: PUSH AF ;here on match of # of logical sectors SHLD DPB ;save current dpb address DEC HL ;now check type MOV A,C ;value of type returned from getden CMP [HL] ;compare to dpb type JRZ :4 ;type is ok POP AF ;number of physical sectors into A reg INC HL ;type does not match JR :LP1 ;check next dpb :4: POP AF ;Restore stack LD HL,SAVDPH ;Get header address LD A,[IX+0] ;Get translation table address STO A,[HL] ;Store address in header INC HL LD A,[IX+1] STO A,[HL] LDK DE,9 ;Form address in header for DPB ADD HL,DE LDK IX,DPB ;Store DPB address in header LD A,[IX+0] STO A,[HL] INX HL LD A,[IX+1] STO A,[HL] XRA A ;Indicate good return :RET: POP IX RET ;Error return section :5: MVI A,1 ;Indicate unformatted disk Z-flag = clear, A = 1 RET :6: ORI 02 ;Indicate unrecognizable disk Z-flag = clear, A = 2 JR :RET PAGE GETDEN: ;Gets density of selected disk ;ENTRY ;SEKDSK = Current drive ;EXIT ;C = TYPE ; 7 6 5 4 3 2 1 0 ; | | | | | | | | ; Undef = 0 <---------+---+---+---+ | | | | ; Bytes/sector <----------------------+---+ | | ; Sides <-------------------------------------+ | ; Density <---------------------------------------+ ;B = # of physical sectors per track ;Z-bit = set IF good return ;Z-bit = RESET IF error return PROC ;SAVE VALUES IN "SDISK" & "SAVTYP" LD BC,SAVTYP ;C = SAVTYP LD A,SDISK MOV B,A ;B = SDISK PUSH BC ;SAVE ;SET DISK LD A,SEKDSK ;Disk to be select STO A,SDISK ;in SDISK (parameter to SENDEN) CALL SENDEN ;PUT "SAVTYP" IN REG C LD A,SAVTYP ;Exit TYPE parameter MOV C,A ;into C - Reg ;Restore caller's SAVTYP & SDISK POP DE ;RESTORE MOV A,D STO A,SDISK MOV A,E STO A,SAVTYP RET ;RETURN, flagS set by SENDEN PAGE SETTRK: ;Sets track number. The track number is saved for later use during a disk transfer operation. ;ENTRY ;BC = track number. ;TRACKS ARE < 255 SO USE ONLY C ;EXIT ;NONE MOV A,C STO A,SEKTRK ;Set track LD A,UNATRK ;GET ALLOCATED TRACK ORA C RZ ;RETURN If same track ;Clear unallocated block count XRA A ;A = 0 STO A,UNACNT ;Clear unallocated block count RET SETSEC: ;Set the sector for later use in the disk transfer. No actual disk operations are performed. ;ENTRY ;BC = sector number. MOV A,C STO A,CPMSEC ;SET CPM LOGICAL SECTOR # RET SETDMA: ;Sets Disk memory address for subsequent disk read or write routines. This address is saved in DMAADR ; until the disk transfer is performed. ;ENTRY ;BC = Disk memory address. ;EXIT ;NONE STO BC,DMAADR RET PAGE READ: ;READ a CP/M 128 byte sector. ;ENTRY ;NONE ;EXIT ;A = 0 IF OK ;A = 1 IF ERROR ;ZBIT = SET IF OK ;ZBIT = RESET IF ERROR PROC XRA A ;Set flag to force a read STO A,UNACNT ;Clear sector counter ;FILL BUFFER WITH DATA CALL FILL ;Fill buffer with data ;MOVE DATA FROM BUFFER TO DMA ADDRESS EX DE,HL ;HL = OFFSET IN BUFFER LD DE,DMAADR ;DESTINATION LDK BC,128 ;Move 128 bytes LDIR RZ ;RETURN If no errorS ;IF ERROR CLEAR HOST ACTIVE FLAG XRA A STO A,H STACT ;Clear host active (A = 0) ORI 1 ;Indicate error RET PAGE WRITE: ;WRITE the selected 128 byte CP/M sector. ;ENTRY ;C = 0, write to a previously allocated block. ;C = 1, write to the directory. ;C = 2, write to the first sector of unallocated data block. ;EXIT ;A = 0 IF OK ;A = 1 IF ERROR ;ZBIT = SET IF OK ;ZBIT = RESET IF ERROR PROC PUSH BC ;SAVE Write type ;CHECK WRITE TYPE MOV A,C CPI WRUAL JNZ :2 ;JMP IF NOT FIRST SECTOR OF UNALLOCATED BLOCK ;IF write to allocated LD A,SEKTYP CPI 5 ;Check for 2K block size LDK A,2048/128 JRZ :1 ;Type = Osborne single density (2K block size) LDK A,1024/128 ;Otherwise 1K block size :1: STO A,UNACNT LD A,SEKTRK STO A,UNATRK ;UNATRK = SEKTRK LD A,LOGSEC INC A JR :4 :2: LDK HL,UNACNT LD A,[hl] ORA A JZ :5 ;If no unallocated records DEC [hl] ;dec unalloc record count ;Get number of sectors per track LD A,SEC_TRK ;GET MOV B,A ;B=Number of sectors per track LD A,UNASEC ;Increment logical sector INC A CMP B JNZ :4 ;If not end of track LDK HL,UNATRK ;INCREMENT TRACK INC [HL] XRA A :4: STO A,UNASEC ORI 0FFH ;SET FLAG FOR READ NOT REQUIRED :5: CALL FILL ;FILL BUFFER WITH DATA ;MOVE DATA TO BUFFER FROM DMA ADDRESS ;DE = DESTINATION IN BUFFER LD HL,DMAADR ;HL = SOURCE OF INFO LDK BC,128 LDIR POP BC ;RESTORE Write type RNZ ;RETURN If any errors occurred IN FILL ;INDICATE BUFFER HAS DATA TO BE WRITTEN IN IT INC A ;A=1 STO A,HSTWRT ;HSTWRT = 1 ;CHECK WRITE TYPE MOV A,C ;GET WRITE TYPE CPI WRDIR ;WRITE to directory? JRZ FLUSH ;Force write of directory XRA A RET ;RETURN WITHOUT WRITE PAGE FLUSH: ;Writes buffer to disk. ;ENTRY ;NONE ;EXIT ;A = 0 IF OK ;A = 1 IF ERROR ;ZBIT = SET IF OK ;ZBIT = RESET IF ERROR PROC ;IS HOST ACTIVE FOR WRITE LD A,HSTWRT ORA A RZ ;RETURN If WRITE IS NOT REQUIRED ;SET PARM. XRA A STO A,HSTWRT ;MAKE WRITE INACTIVE LD A,HSTDSK ;Move disk STO A,SDISK LD A,HSTTRK STO A,SAVTRK LD A,HSTSEC STO A,SAVSEC LD A,HSTTYP STO A,SAVTYP ;WRITE LDK HL,SAVSEC INC [hl] ;ADD 1 TO SECTOR (FOR physical) LDK B,1 ;SET TO ONE SECTOR JMP WSEC ;WRITE IN ROM AND RETURN PAGE FILL: ;Fills host buffer with appropriate host sector. ;ENTRY ;A = 0, Read required ;A <> 0, READ NOT REQUIRED ;EXIT ;DE = HOST RECORD ADDRESS ;A = 0 IF OK ;A = 1 IF ERROR ;ZBIT = SET IF OK ;ZBIT = RESET IF ERROR PROC STO A,RDFLAG ;Save read flag LD A,SEKTYP RRC RRC ANI 03 MOV B,A LDK DE,HSTBUF ;initial offset LD A,CPMSEC ;Get CPM logical sector LDK HL,128 ;128 byte records JRZ :3 ;Jump when sector size <> 128, no deblocking necessary :1: EX DE,HL RRC JRNC :2 ;If low bit not set ADD HL,DE ;Add bias to offset :2: EX DE,HL ADD HL,HL ANI 07Fh ;Mask sector DJNZ :1 :3: STO A,SEKSEC ;physical sector - 1 PUSH DE ;SAVE OFFSETED ADDRESS IN BUFFER ;CHECK HSTACT LD A,HSTACT ;host active flag ORA A JRZ :6 ;If host buffer inactive ;CHECK IF DRIVE PARM. ARE THE SAME LDK HL,HSTSEC LDK DE,SEKSEC LDK B,SEKTYP-SEKSEC+1 :4: LD A,[DE] CMP [HL] JRNZ :5 ;If mis-match INC HL INC DE DJNZ :4 ;If all bytes not checked ;RETURN IF THEY ARE THE SAME POP DE ;RESTORE OFFSETED ADDRESS IN BUFFER XRA A ;INDICATE GOOD RET ;GOOD RETURN ;WRITE BUFFER IF MISMATCH :5: CALL FLUSH ;Flush host buffer ;SETUP ROM DRIVE PARAM. :6: PUSH AF ;SAVE FLAGS ;A=0 & ZBIT=1 IF FROM JMP LDK A,1 STO A,HSTACT ;MAKE HOST ACTIVE LD A,SEKDSK ;Move disk STO A,HSTDSK STO A,SDISK LD A,SEKTRK ;TRACK STO A,HSTTRK STO A,SAVTRK LD A,SEKSEC ;SECTOR STO A,HSTSEC STO A,SAVSEC LD A,SEKTYP ;TYPE STO A,HSTTYP STO A,SAVTYP POP AF ;RESTORE FLAGS JRNZ :RET ;IF ERROR IN FLUSH ;CHECK IF READ IS REQUIRED LD A,RDFLAG ORA A JRZ :7 ;If read required ;RETURN WITHOUT READ POP DE ;RESTORE OFFSETED ADDRESS IN BUFFER XRA A ;INDICATE GOOD RET ;GOOD RETURN ;READ THEN RETURN ;ADD 1 TO SECTOR (FOR physical) :7: LDK HL,SAVSEC INC [hl] ;update sector+1 LDK B,1 ;SET TO ONE SECTOR CALL RSEC ;READ IN ROM :RET: POP DE ;RESTORE OFFSETED ADDRESS IN BUFFER RET PAGE SECTRN: ;Translates sector number from logical to physical. ;ENTRY ;DE = 0, no translation required. ;DE = translation table address. ;BC = sector number to translate. ;EXIT ;HL = translated sector. PROC LDA UNASEC CMP C JRZ :1 ;IF SECTORS MATCH ;If sectors do not match Clear unallocated block count XRA A ;A = 0 STO A,UNACNT ;Clear unallocated block count ;SET SECTOR :1: MOV A,C STO A,LOGSEC MOV L,C MOV H,B MOV A,E ;Check if translation is required ORA D RZ ;None required, return ADD HL,DE ;Translation required MOV L,M MVI H,0 RET PAGE PRINT: ;Print message string to CONSOLE devic e ;ENTRY ;DE = ADDRESS TO PRINT ;EXIT ;DE = ADDRESS TO PRINT ;HL = ADDRESS OF CONOUT LDK HL,CONOUT JR STROUT ;PRINT STRING PSTR: ;Print message string to LIST device ;ENTRY ;DE = ADDRESS TO PRINT ;EXIT ;DE = ADDRESS TO PRINT ;HL = ADDRESS OF LIST LDK HL,LIST ; JR STROUT ;FALLS THROUGH TO STROUT PAGE STROUT: ;Print message FIST BYTE IS length ;ENTRY ;DE = ADDRESS TO PRINT (FIST BYTE IS length) ;HL = ADDRESS OF ROUTINE TO CALL ;EXIT ;DE = DE + length ;CHANGED ;ALL PROC ;GET length LD A,[DE] ;Get a length of print string ORA A RZ ;If zero then terminate MOV B,A ;Length to B reg ;PRINT CHARACTER LOOP :LOOP: INC DE LD A,[DE] ;Get character MOV C,A PUSH DE ;Save print string address PUSH BC ;Save loop counter PUSH HL ;Save output routine address ;CALL ROUTINE LDK DE,:1 PUSH DE ;Return address to stack JMP [HL] ;JMP TO ROUTINE :1: POP HL POP BC POP DE DJNZ :LOOP ;Print next character if not done RET PAGE ;The following routines will use the IOBYTE to transfer control to the appropriate device driver ;CONST NEED TO GO AS FAST AS POSSIBLE CONIN: ;Reads input character from device PROC LDK HL,PTR_CINP ;Table of input rtns LDK B,1 ;number of shifts required to align CONSOLE field JMP DISPCH ;Call appropriate rtn PAGE CONOUT: ;Puts output character to device ;C contains output character PROC ;SPECIAL CASE IF CONSOL OUTPUT IS TTY ;THIS IS FOR SPEED ONLY LD A,IOBYTE ANI 0000_0011B ;CHECK FOR TTY JZ COUT ;OUTPUT CHAR IN ROM AND RETURN ;ALL OTHER DEVICE OUTPUT (NOT TTY) LDK HL,PTR_COUT ;Table of output rtns LDK B,1 ;number of shifts required to align CONSOLE field JMP DISPCH ;Call appropriate rtn PAGE CONST: ;Returns console status PROC ;SPECIAL CASE IF CONSOL STATUS IS TTY ;THIS IS FOR SPEED ONLY LD A,IOBYTE ANI 0000_0011B ;CHECK FOR TTY JRNZ :1 ;IF NOT TTY STATUS ;IF TTY STATUS ;check if any translated keys are pending LD A,COUNT ORA A JZ SKEY ;JUMP TO ROM AND CHECK STATUS ;IF ANY ARE PENDING : RETURN FF ORI 0FFh RET ;ALL OTHER DEVICE STATUS :1: LDK HL,PTR_CSTAT ;Status table LDK B,1 ;number of shifts required to align CONSOLE field ;FALL THROUGH TO DISPCH PAGE DISPCH: ;On entry here reg B contains the left shift count required to align the iobyte field to bit 1 position. ; Reg HL contains address of select table. ;ENTRY ;B = LEFT SHIFT COUNT ;HL = ADDRESS OF SELECT TABLE PROC LD A,IOBYTE ;SHIFT IOBYTE FIELD :1: RAL DJNZ :1 ;GET OFFSET ANI 6 ;get select field*2 MOV E,A LDK D,0 ;DE = iobyte field * 2 ;ADD OFFSET TO HL DAD DE ;GET ADDRESS IN HL MOV E,[HL] Š INC HL MOV H,[HL] ;get the routine address MOV L,E ;into hl ;JMP TO ROUTINE JMP [HL] ;RETURN TO CALLING PROGRAM PAGE LIST: ;List device character output PROC LDK HL,PINTFG ;Get printer initialization flag LD A,[HL] ORA A JRNZ :1 ;Printer previously initialized DEC [HL] ;Non-zero value to PINTFG PUSH BC ;Save character INC HL EX HL,DE ;Get initialization string CALL PSTR ;and print it POP BC ;Restore character :1: LDK B,4 Š LDK HL,PTR_LIST ;table of list routines JR DISPCH PUNCH: ;Output to punch PROC LDK B,6 LDK HL,PTR_COUT ;Punch routines JR DISPCH READER: ;Reader input PROC LDK B,8 LDK HL,PTR_CINP ; reader routines JR DISPCH LISTST: ;Return the ready status for the list device. ;EXIT A = 0 (zero), list device is not ready to ; accept another character. ; A = FFh (255), list device is ready to accept ; a character. PROC LDK B,4 ;number of left shifts thru carry ;to align LIST field of IOBYTE LDK HL,PTR_LST ;list status routines JR DISPCH ;DO ROUTINE PAGE ;Dispatch Table PTR_CSTAT: ;INPUT STATUS DW CNST ; keyboard status DW SISTAT ; serial port input status DW PISTAT ; parallel input status DW CNST ; keyboard status PTR_CINP: ;INPUT CHARACTER DW KEYINP ; get input from keyboard DW SPINP ; serial port input DW PARINP ; parallel input DW KEYINP ; get input from keyboard PTR_COUT: ;OUTPUT CHARACTER DW COUT ; output character to crt DW SPOUT ; serial port output DW PAROUT ; parallel output DW COUT ; output character to crt PTR_LST: ;OUTPUT STATUS DW CRSTAT ; consol outut status DW SOSTAT ; serial output status DW POSTAT ; parallel output status DW CRSTAT ; consol outut status PTR_LIST: ;OUTPUT TO THE LIST DEVICE DW COUT DW PRTOUT DW PAROUT DW COUT PAGE CNST: ;This routine samples the Console INPUT status ;ENTRY ;NONE ;EXIT ;A = 0 (zero), means no character currently ready to read. ;A = FFh (255), means characteR currently ready to read. PROC ;check if any translated keys are pending LD A,COUNT ORA A JZ SKEY ;JUMP TO ROM AND CHECK STATUS ;IF ANY ARE PENDING : RETU RN FF ORI 0FFh RET PAGE KEYINP: ;Gets keystroke from ROM keyboard driver. Translates the codes 80h to 8fh as per table. ;EXIT ;A = CHARACTER ;This is self modify code do not change. See Roger Chapmen if any questions PROC PUSH IX ;Save user IX :1: LDK HL,COUNT LD A,[HL] ;get number of xlated keys ORA A JRZ :3 ;CONT. IF NO KEYS PENDING ;if keys pending then LD IX,XLTKEY ;get base address in IX reg LD A,[IX+0] ;simulate LD A,(IX+COUNT) COUNT: = *-1 ;to get next key from table INC [HL] ;increment count ;RETURN IS HERE :2: POP IX ;Restore user IX RET ;RETURN ;READ KEY FROM KEYBOARD (DONE BY ROM) :3: CALL CI ;When console has returned this code will check for function key and perform some translation CPI 80h ;function keys have value 80h-8dh JRC :2 ;RETURN IF LESS THAN 80H CPI 8Eh JRNC :4 ;JMP IF ABOVE 8DH SLA A ;do a shift to make pointer into table MOV E,A LDK D,0 LDK IX,XLTBL ADD IX,DE  LD L,[IX+0] LD H,[IX+1] LD E,[IX+2] LD D,[IX+3] STO DE,XLTKEY Š SBC HL,DE MOV A,L STO A,COUNT JR :1 ;LOOP ;PROCESS KEYS FROM 8E AND ABOVE :4: XRA A ;MAKE KEY A ZERO JR :2 ;RETURN PAGE CRSTAT: ;Returns status of crt. PROC ORI 0FFh ;crt is always ready RET PAGE ; +----------------+ ; | SERIAL SECTION | ; +----------------+ SIRST: ;Master reset 8251 ;ENTRY ;NONE ;EXIT ;NONE PROC DI ;SET BAUD RATE BY SETTING UP THE 8155'S TIMER ;GET RATE FROM TABLE LD A,BRATE ;GET BAUD RATE ADD A ;*2 MOV E,A LDK D,0 ;DE=OFFSET INTO TABLE LDK HL,BRATET ;FWA OF TABLE ADD HL,DE ;HL=OFFSETTED ADDRESS IN TABLE LD E,[HL] ;LSB INC HL LD A,[HL] ;MSB ;MAKE OUTPUT A SQUARE WAVE ORI 0100_0000B ;CONTINUOUS SQUARE WAVE MOV D,A ;SET BAUD RATE ;LSB LDK A,4 OUT PREGS ;SELECT REG MOV A,E OUT PDATA ;OUTPUT LOW BYTE ;MSB LDK A,5 OUT PREGS ;SELECT REG MOV A,D OUT PDATA ;OUTPUT HIGH BYTE ;START 8155'S TIMER XRA A OUT PREGS ;SELECT COMMAND REG LDK A,1100_1111B OUT PDATA ;DISABLE INTERRUPTS ON 8251 & ENABLE INTERNAL CLOCKS LDK A,3 OUT PREGS ;SELECT PORT 3 LDK A,1111_1111B OUT PDATA EI ;RESET 8251 XRA A OUT SSTAT OUT SSTAT OUT SSTAT OUT SSTAT LDK A,SI.MRST OUT SSTAT ;RESET CHIP ;SET MODE LD A,MODE OUT SSTAT ;SET COMMAND LDK A,SI.COM OUT SSTAT RET PAGE BRATET: ;BAUD RATE TRANSLATION TABLE DW 5000 ;50 0 DW 3333 ;75 1 DW 2273 ;110 2 DW 1859 ;134.5 3 DW 1667 ;150 4 DW 1250 ;200 5 DW 833 ;300 6 DW 416 ;600 7 DW 208 ;1200 8 DW 139 ;1800 9 DW 125 ;2000 10 DW 104 ;2400 11 DW 69 ;3600 12 DW 52 ;4800 13 DW 35 ;7200 14 DW 26 ;9600 15 DW 13 ;19200 16 PAGE SOSTAT: ;Gets status of output device attached to serial port ;ENTRY ;NONE ;EXIT ;A = 0, IF NOT READY ;A = 0FFh IF READY ;ZBIT = SET IF NOT READY FOR OUTPUT PROC  IN SSTAT ;GET SERIAL STATUS register ANI SI.TRDY RZ ;RETURN ORI 0FFH RET PAGE SISTAT: ;Gets status of input device attached to serial port ;EXIT ;ZBIT = SET IF NOT READY ;ZBIT = RESET IF READY PROC IN SSTAT ;GET SERIAL STATUS register ANI SI.RRDY RZ ;RETURN IF NOT READY ORI 0FFH ;MAKE READY RET PAGE SPINP: ;Inputs a character from the serial port ;ENTRY ;None ;EXIT ;A = character read PROC ;CHECK FOR CHARACTER CALL SISTAT ;GET INPUT STATUS JRZ SPINP ;LOOP IF NO CHARACTER ;READ CHARACTER IN SDATA ;get data RET PAGE SPOUT: ;Outputs character in reg c to the serial port ;ENTRY ;C = character to output ;EXIT ;NONE PROC CALL SOSTAT ;GET STATUS JRZ SPOUT ;LOOP MOV A,C OUT SDATA ;SEND CHARACTER RET PAGE PRTOUT: ;routine does printer protocols for serial (LST) output ;ENTRY ;C = CHARACTER TO PRINT ;EXIT ;NONE XON: = 11h XOFF: = 13h ETX: = 3 ACK: = 6 PROC  ;PRINT CHARACTER CALL SPOUT LD A,PRNTER ;CHECK FOR PROTOCOL ORA A RZ ;RETURN IF NO PROTOCOL ;CHECK FOR XON XOF ANI 2 JRNZ XONXOF ;IF XONXOF ;ETX ACK ;CHECK FOR END OF LINE LDK A,0Dh CMP C RNZ ;RETURN IN NOT END OF LINE ;SEND ETX LDK C,ETX CALL SPOUT ;WAIT FOR ACK :1: CALL SPINP ;GET CHARACTER ANI 7Fh ;mask out parity bit CPI ACK JRNZ :1 RET ;RETURN PAGE XONXOF: ;PERFORM XONXOF protocol ;ENTRY ;NONE ;EXIT ;NONE PROC ;CHECK IF CHARACTER THERE CALL SISTAT ORA A RZ ;RETURN IF NO CHARACTER RECEIVED ;CHECK FOR XOFF CALL SPINP ;GET CHARACTER ANI 7Fh ;mask out parity bit CPI XOFF RNZ ;RETURN IF NOT XOFF ;WAIT FOR XON :1: CALL SPINP ;GET CHARACTER ANI 7Fh ;mask out parity bit CPI XON JRNZ :1 RET ;RETURN AFTER XON PAGE *[ ] ; +---------------------------+ ; | CENTRONIX PRINTER SECTION | ; +---------------------------+ ;The Parallel port is actually the IEEE port driven with the centronix protocol. The bit assignements ; are as follows: ;A0-7 <=> data bus ;B0-4 = UNUSED (MUST BE 1) ;B5 <= 1, printer busy. 0, printer is ready. ;B6 => output strobe. Active = 0. ;B7 = UNUSED (MUST BE 1) ;This chip (the 8155) will be setup correctly by the "SIRST" routine which is called in the cpm boot section. ;In this section we are using two port of the 8155 on the I/O card. Both ports are bidirectional ports. ;This chip was designed for use with an 8085 so we do some wierd addressing. The chip has 6 registers ; (0-5) which are addressed through outputing the register number to port 21h. After the register has ; been so addressed we can read and write to it by outputing or inputing port 28h. Since the INTERRUPT ; routines may also address in this manner we must disable INTERRUPTs while we are doing this. ;ALWAYS disable INTERRUPTs while using the 8155 because the INTERRUPT routines may be changing the register ; assignments. PAGE POSTAT: ;CHECK IF the parallel (centronix) printer attached to the IEEE port IS READY TO RECEIVE A CHAR. ;NOTE ;AFTER RESET OUTPUTS OF ALL PORTS ARE HIGH ;ENTRY ;NONE ;EXIT ;A = 0 IF PRINTER NOT READY TO RECEIVE A CHARACTER ;A = FF IF PRINTER IS READY TO RECEIVE A CHARACTER ;MUST SAVE REG C PROC ;SETUP PORT 2 LDK A,2 OUT PREGS ;SELECT PORT 2 LDK A,PP.CSTRB ;SET TO INPUT OUT PDATA ;GET STATUS IN PBDATA CMA ;INVERT REG A ANI PP.ORDY RZ ;RETURN IF PRINTER NOT READY FOR OUTPUT ORI 0FFH RET PAGE PISTAT: ;gets status of the input device attached to the parallel port ;This routine is not used since there is no input device suported on the parallel port ;ENTRY ;NONE ;EXIT ;A = 0 IF NO DATA RECEIVED ;A = FF IF DATA WAS RECEIVED PROC ORI 0FFH ;ALWAYS GOOD RET PAGE PARINP: ;inputs a character from PArallel port. ;This routine is not used since there is no input device suported on the parallel port ;ENTRY ;NONE ;EXIT ;A = DATA (ALWAYS 0) PROC XRA A RET PAGE PAROUT: ;outputs the character in c to the IEEE port treating the port as a parallel port. ;ENTRY ;C = CHARACTER TO OUTPUT PROC ;CHECK OUTPUT STATUS CALL POSTAT ;MUST SAVE C JRZ PAROUT ;LOOP TILL OK TO OUTPUT ;OUTPUT DATA DI LDK A,1 OUT PREGS ;SELECT DATA PORT MOV A,C OUT PDATA ;SEND DATA ;SEND STROBE LDK A,2 OUT PREGS ;SELECT STATUS PORT LDK A,PP.SSTRB OUT PDATA ;set strobe LDK A,PP.CSTRB OUT PDATA ;clear strobe EI RET PAGE PROC :1: = * IF :1 > CCP + 1E00H .9 ERROR SYSTEM SIZE TOO LARGE ENDIF MSG 'SYSTEM SPACE AVAILABLE = ',1E00H - (:1 - CCP) HSTBUF: DS 1024 ;Host disk xfer buffer (MUST BE UNDER 0F000H) PAGE *NOTE* ;THIS AREA IS IN VIDEO MEMORY ORG VIDBUF ;FBA OF BUFFER LASTA: DS 4 ;# drives * 2 DPB: DS 2 SAVDPH: DS 2 SEC_TRK DS 1 ;SECTORS PER TRACK USED IN SELDSK & WRITE ALV: DS ALVSZ ;BUFFERS FOR BDOS CSV: DS CSVSZ XLTKEY: DS 2 DIRBUF: DS 128 ;Directory Buffer DMAADR: DS 2 ;CBIOS dma address RDFLAG: DS 1 ;Read flag CPMSEC: DS 1 ;TRANSLATED CPM Logical sector LOGSEC: DS 1 ;UNTRANSLATED CPM Logical sector SEKSEC: DS 1 ;THESE SEKTRK: DS 1 ;MUST SEKDSK: DS 1 ;BE SEKTYP: DS 1 ;IN ORDER HSTSEC: DS 1 ;THESE HSTTRK: DS 1 ;MUST HSTDSK: DS 1 ;BE HSTTYP: DS 1 ;IN ORDER *NOTE* ;THIS AREA IS ZEROED BY WARM BOOT CLRSTR: = * ;FIST ADDRESS TO CLEAR HSTACT: DS 1 ;host active flag HSTWRT: DS 1 ;Host written flag UNACNT: DS 1 ;Unalloc rec count UNATRK: DS 1 ;Track UNASEC: DS 1 ;Sector CLRLNT: = *-CLRSTR+1 ;length OF AREA TO CLEAR ; END *NOTE* ;THIS AREA IS IN VIDEO MEMORY ORG VIDBUF ;FBA OF BUFFER LASTA: DS 4 ;# drives * 2 DPB: DS 2 SAVDPH: DS 2 SEC_TRK DS 1 ;SECTORS PER TRACK USED IN SELDSK & WRITE ALV: DS ALVSZ ;BUFFERS FOR BDOS CSV: DS CSVSZ XLTKEY: DS 2 D Generation Procedure for ENCORE Basic I/O System(VBIOS) --------------------------------------------------------- 4/4/83 A. The following four files are needed on the current drive: 1. ACT.COM - Assembler file 2. VBIOS.ASM - Main source file 3. VBIOS0.ASM - Source file 0 4. VBIOS1.ASM - Source file 1 NOTEº Alsï needeä wilì bå VMOVCPÍ generatioî procedures/files B. Type "ACT VBIOS0 ". This command will generate following file: VBIOS0.HEX - Hex format file C. Type "ACT VBIOS1 ". This command will generate following file: VBIOS1.HEX - Hex format file D®  Transfeò  botè  oæ  thå  abovå  HEØ  fileó  tï  youò  MOVCPÍ � generation drive. No÷  follo÷ thå MOVCPÍ generation procedures, VMOVCPMG.DOC, tï completå VBIOS generation. ååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååååå ååååå!ååååå"ååååå#ååååå$ååååå%ååååå&ååååå'ååååå