IMD 1.17: 17/01/2010 8:18:44 cpm 2.2 california computer systems distribution diskette  >Ó@:JGæ!ø(!ôNxæ@(+¨G:Q…o~2D!ÿ+HxÓ4> Ó0Û40ûÛ0æ˜ Ä{Ó2Û3xö€Ó4>ˆÓ0#Û3wÛ40÷+Û0æœ ¦|ºÒB{¹ Ø:DO:JGÓ4>]» Ã\/ÃX/RLOCBIOS COPYRIGHT (C) 1979, DIGITAL RESEARCH ,_ÃÅÍŒ,ÁÉ> Í’,> Ã’,> Ã’,Å͘,á~·È#åÍŒ,áì, Ã_ÃÍ2î3<ÉÃÃ,¯2í3Í3ÃË,ÃÃ,ÃÃ,ÃÃ,Í3Ãß,ÃÍ·ÉÃô,Í3Ãù,Ãô,ÃÃ,Ãÿ ÃÍ-‡‡‡‡!ï3¶2É:ï32ÉþaØþ{Ðæ_É:«3·Ê–-:ï3·>Ľ,¬3ÍË,Ê–-:»3=2Ì3¬3Íù,–-,!€€ÍB0!º36#5¬3ÍÚ,Ê–-:ï3·Ä½,!,ͬ,ÍÂ-ʧ-ÍÝ-Â/ÍÝ-Í- ,ÍÍ)-!,F#x·Êº-~Í0-wë-w!,"ˆ,É Í·ÈÍ·ÉÀÃ!«3~·È6¯Í½,¬3Íï,:ï3ý,(/!4¾ÂÏ/#Âý-É͘,*Š,~þ Ê".·Ê".åÍŒ,á#Ã.>?ÍŒ,͘,ÍÝ-Â/·Èþ Ú .Èþ=Èþ_Èþ.Èþ:Èþ;Èþ<Èþ>ÈÉ·Èþ ÀÃO.…oÐ$É>!Í3ÍY.åå¯2ð3*ˆ,ëÍO.ë"Š,ëá·Ê‰.Þ@Gþ:Ê�.:ï3wÖ.x2ð3pÍ0.ʹ.#þ*©.6?ë.w˜.Í0.ÊÀ.ï.#6 ¹.þ.Âé.Í0.Êé.#þ*ÂÙ.6?ÃÛ.wÂÈ.Í0.Êð.Ãß.#6 Âé.#6Âò.ë"ˆ,á #~þ? / Â/x·ÉDIR ERA TYPESAVEREN USER³z!/yþÐÎ3¾ÂO/#Â>ÍŒ,Í9-€ÍØ-ÍÐ-2ï3Í^.Ä .:ð3·Â¥2Í./!Á/_~#foéw01]1­12Ž2¥2!óv",!,éß/ç,READ ERRORð/ç,NO FILEÍ^.:ð3·Â .!Î3 ~þ Ê30#Ö0þ Ò .Wxæà .x€Ú .€Ú .‚Ú .G Â0É~þ  .# Â30xÉ~#ÂB0É!€�ÍY.~ɯ2Í3:ð3·È=!ï3¾Èý,:ð3·È=!ï3¾È:ï3ý,Í^.ÍT0!Î3~þ Â�0 6?#ˆ0ÕÍé,Ìê/Ê1:î3æ`O> ÍK0Ú1Ñ{ÕæõÂÌ0͘,ÅÍÐ-ÁÆAÍ’,>:Í’,ÃÔ0Í¢,>:Í’,Í¢,xÍK0æþ Âù0ñõþÂ÷0> ÍK0æþ Ê1> Í’,xþ Ò1þ ÂÙ0Í¢,ÃÙ0ñÍÂ-Â1Íä,Ø0ÑÆ3Í^.þ ÂB1R1ͧ,Í9-!,5‚/#~þY‚/#"ˆ,ÍT0Í3Íï,<Ìê/Æ3ALL (Y/N)?Í^. .ÍT0ÍÐ,ʧ1͘,!ñ36ÿ!ñ3~þ€Ú‡1åÍþ,á 1¯w4!€ÍY.~þʆ3ÍŒ,ÍÂ-†3Ãt1=ʆ3ÍÙ/Íf0à .Íø/õÍ^. .ÍT0Í3ÕÍï,ÑÍ -Êû1¯2í3ño&)|µÊñ1+å!€åÍØ-Í3Í-ÑáÂû1ÃÔ1Í3ÍÚ,<Â22ͧ,ÍÕ-Æ3NO SPACEÍ^. .:ð3õÍT0Íé,Ây2!Í3Ý3ÍB0*ˆ,ëÍO.þ=Ê?2þ_Âs2ë#"ˆ,Í^.Âs2ñG!ð3~·ÊY2¸pÂs2p¯2Í3Íé,Êm2Í3Í-Æ3Íê/Æ3Íf0à .‚2ͧ,Æ3FILE EXISTSÍø/þÒ ._:Î3þ Ê .Í-É3Íõ-:Î3þ ÂÄ2:ð3·Ê‰3=2ï3Í)-ͽ,É3Ö3þ  .ÕÍT0Ñ!ƒ3Í@0ÍÐ,Êk3!åëÍØ-Í3Íù,Â3á€,}“|šÒq3Ãá2á=Âq3Íf0Í^.!ð3å~2Í3>Í`.á~2Ý3¯2í3\!Í3!ÍB0!,~·Ê>3þ Ê>3#Ã03�~·ÊO3#ÃC3x2€Í˜,ÍÕ-Í-Í1«3Í)-ͽ,Â/Íf0à .z3ͧ,Æ3BAD LOADCOMÍf0Í^.:Î3Ö !ð3¶Â .Â/$$$ SUB³zÃ4™4¥4«4±4ë"C7ë{2ÖA!"E79"71A7¯2àA2ÞA!tAåyþ)ÐK!G4_^#V*C7ëéBÈ6�5Î6BBÔ6í6ó6ø6á5þ6~@ƒ@E@œ@¥@«@È@×@à@æ@ì@õ@þ@A AA,9AA&A-AAAGAMA@SA77›A!Ê4Íå4þÊÉ!Õ4ô4!á4ô4!Ü4Íå4ÃBdos Err On : $Bad Sector$Select$File R/O$åÍÉ5:B7ÆA2Æ4º4ÍÓ5ÁÍÓ5!7~6·Àà BÍû4Í5ØõOÍ�5ñÉþ Èþ Èþ ÈþÈþ É:7·ÂE5ÍBæÈÍ BþÂB5Í BþʯÉ27>É: 7·Âb5ÅÍ#5ÁÅÍ BÁÅ: 7·ÄBÁy! 7þÈ4þ Ð5~·ÈyþÂy55Éþ À6ÉyÍ5Ò�5õ^ÍH5ñö@Oyþ ÂH5 ÍH5: 7æ–5Éͬ5 Í Bà B#ÍH5ÍÉ5: 7! 7¾Ð ÍH5ù5 ÍH5 ÃH5 þ$ÈÅOÍ�5ÁÃÓ5: 72 7*C7N#åÅåÍû4æáÁþ ÊÁ6þ ÊÁ6þÂ6x·Êï5: 72 7Ãp6þÂ&6x·Êï5~+é6þÂ76ÅåÍÉ5¯2 7Ãñ5þÂH6å! 7>–wáÃï5þÂ_6á: 7! 7¾Òá55ͤ5ÃN6þÂk6ͱ5áÃá5þ¦6Åͱ5ÁáåÅx·ÊŠ6#NÅåÍ5áÁÃx6å: 7·Êñ5! 7–2 7ͤ5! 75™6Ãñ5#wÅåOÍ5áÁ~þx½6þʹÚï5áp ÃH5Í5Ã7ÍBÃ7y<Êà6<ÊBà BÍB·Ê‘AÍ BÃ7:Ã7!qÉëMDÃÓ5Í#52E7É>Ã7! 4^#Vëé Èw#ÃP7:B7OÍB|µÈ^#V#"³A##"µA##"·A##ë"ÐA!¹AÍO7*»Aë!ÁAÍO7*ÆA|!ÝA6ÿ·Ê�76>ÿ·ÉÍB¯*µAw#w*·Aw#wÉÍ'Bû7Í*B·È! 4ÃJ7*êAÍê8"åA"ìA!åAN#F*·A^#V*µA~#foy“xšÒú7å*ÁA{•_zœWá+Ãä7å*ÁAÚ8y•xœÚ8ëá#Ãú7áÅÕåë*ÎADMÍBÑ*µAs#rÑ*·As#rÁy“OxšG*ÐAëÍ0BMDÃ!B!ÃAN:ãA· ÂE8G>–O:âA Ê\8·ÃS8€É*C7 :ÝA·Êq8n&É ^#VëÉÍ>8OÍ^8 "åAÉ*åA}´É:ÃA*åA)=Â�8"çA:ÄAO:ãA¡µo"åAÉ*C7 É*C7ë!ÉÍ®8~2ãAë~2áAͦ8:ÅA¦2âAÉÍ®8:ÕAþÂÞ8¯O:ãA�wë:áAwÉ È|·g}oÃë8€*¹A¯†# Âý8É È)Ã9Å:B7O!Í9Áyµox´gÉ*­A:B7OÍê8}æÉ!­AN#FÍ 9"­A*ÈA#ë*³As#rÉÍ^9 ~Ð!4ÃJ7Í9È! 4ÃJ7*¹A:éA…oÐ$É*C7~ÉÍi96ÉÍi9ö€wÉ*êAë*³A{–#zžÉÍ9Ør+sÉ{•ozœgÉÿ*ìAë*ÌAÍ•9ÐÅÍ÷8*½Aë*ìAÁ ÊÄ9¾ÈÍ9ÐÍ,9ÉwÉÍœ9Íà9͸7ÃÚ9Íà9Ͳ7!±AÃã9!¹AN#FÃ$B*¹Aë*±A€ÃO7!êA~#¾À<É!ÿÿ"êAÉ*ÈAë*êA#"êAÍ•9Ò:Ãþ9:êA懠:2éA·ÀÅÍÃ7ÍÔ9ÁÞ9yæ<_WyæOx‡‡‡‡‡±OxæG*¿A ~ÂV:ÉÕÍ5:æþÁ±Âd:wÉÍ^9ÅÑ ÈÕ:ÝA·Êˆ:ÅåNÃŽ: ÅN#Fåy°Ê�:*ÆA}‘|˜Ô\:á#ÁÃu:*ÆAÍê8#DM*¿A6# x±Â±:*ÊAë*¿As#rÍ¡7*³A6#6Íþ9ÿÍ:Íõ9ÈÍ^9>å¾ÊÒ::A7¾Âö:#~Ö$Âö:=2E7Ík:ÍŒ9ÃÒ::ÔAÃ7Åõ:ÅA/Gy Oñ ‘æÁÉ>ÿ2ÔA!ØAq*C7"ÙAÍþ9Í¡7Í:Íõ9Ê”;*ÙAëþåÊJ;ÕÍ9ÑÒ”;Í^9:ØAOy·Êƒ;þ?Ê|;xþ Ê|;þ Ês;–æÂ-;Ã|;ÅNÍ;ÁÂ-;# ÃS;:êAæ2E7!ÔA~ЯwÉÍþ9>ÿÃ7ÍT9 Í;Íõ9ÈÍD9Í^96åÍk:ÍÆ9Í-;ä;PYy°ÊÑ; ÕÅÍ5:Òì;ÁÑ*ÆA{•zœÒô;ÅÕBKÍ5:Òì;ÑÁÃÀ;<Íd:áÑÉy°ÂÀ;!É Õ*C7 ëÍ^9ÁÍO7ÍÃ7ÃÆ9ÍT9 Í;*C7~wÍõ9ÈÍD9 Í<Í-;Ã'< Í;Íõ9È Í<Í-;Ã@<Í;Íõ9Èͦ8~õåÍ^9ë*C7 ÕÍO7Íx9Ñ! N!Fáñwy¾xÊ‹<>Ú‹<>€*C7wÉ~#¶+Àw#w+ɯ2E72êA2ëAÍ9ÀÍi9æ€ÀÍ;Íõ9ÈÍ^9 ë*C7 :ÝA·Êè<~·ÂÛÿ2ÒAÃ2ÕA>ÿ2ÓAÍ»8:ãA!áA¾Úæ=þ€Âû=ÍZ=¯2ãA:E7·Âû=Íw8Í„8Êû=ÍŠ8ÍÑ7Ͳ7ÃÒ8Ã7>2ÕA>2ÓAÍT9*C7ÍG9Í»8:ãAþ€Ò7Íw8Í„8Ân>Í>82×A·Ê;>O Í^8DM;;}´ÂH>>Ã7"åAë*C7 :ÝA·:×AÊd>Íd9sÃl>O s#r:E7·ÀÅÍŠ8:ÕA==»>ÁÅy==»>å*¹AWw#òŒ>Íà9*çA"åAÅÍÑ7Á͸7*åA:ÄAG¥¸#š>á"åAÍÚ9ÍÑ7ÁÅ͸7Á:ãA!áA¾ÚÒ>w4!,õÍi9æwñþÂ?:ÕAþÂ?ÍÒ8ÍZ=!E7~·Âþ>=2ãA6ÃÒ8¯2ÕAÅ*C7ë!!~æõ~#~æO~æGñ#n,-.‹?! w! y–ÂG?!x–æÊ?ÅÕÍ¢<ÑÁ.:E7<Ê„?! q!pÍQ<:E7<Â?ÁÅ. Ê„?Í$=.:E7<Ê„?Á¯Ã7åÍi96ÀáÁ}2E7Ãx9ÿÍ?ÌÁ=ÉÍ?Ì>ÉëN! ~æ€�O>ˆG~æ€G!~‡‡‡‡õ€Gõá}áµæÉ Í;*C7!år#r#rÍõ9Ê @Í^9Í¥?áå_y–#xž#{žÚ@s+p+qÍ-;Ãä?áÉ*C7 Í¥?!!q#p#wÉ*¯A:B7OÍê8åëÍY7áÌG7}Ø*¯AMDÍ 9"¯Aã::ÖA!B7¾ÈwÃ!@>ÿ2ÞA*C7~æ=2ÖAþÒu@:B72ßA~2àAæàwÍE@:A7*C7¶wÉ>"Ã7!"­A"¯A¯2B7!€"±AÍÚ9Ã!@Ír9ÍQ@ÃQ<ÍQ@â<ë~þ?ÊÂ@ͦ8~þ?Är9ÍQ@Í;Ãé9*ÙA"C7ÍQ@Í-;Ãé9ÍQ@Íœ;Ã;ÍQ@ü=ÍQ@Ãþ=Ír9ÍQ@Ã$=ÍQ@Í<Ã;*¯AÃ)A:B7Ã7ë"±AÃÚ9*¿AÃ)A*­AÃ)AÍQ@Í;<Ã;*»A"E7É:ÖAþÿÂ;A:A7Ã7æ2A7ÉÍQ@Ó?ÍQ@Ü?ÍQ@ÃÒ?*C7}/_|/*¯A¤W}£_*­Aë"¯A}£o|¢g"­AÉ:ÞA·Ê‘A*C76:àA·Ê‘Aw:ßA2ÖAÍE@*7ù*E7}DÉÍQ@>2ÕAÍ?Ì>Éå€ÃãBÃhBÃ3BÃ;BÃNBÃNBÃNBÃ;BËCÃCÃpCÃuCÃ…CíCîCÃFBÃCÛ%æÈÆþÉÛ%Ò;BÛ æÉÛ%æ ÈÆ¿ÉÍFBÊNByÓ É ÂmB!¬DÍ�CÍ BÍ�C1€ ¯go"@!Ð"B! Ew#Â~BÅOÍCÁ:Jæ–B!,"LÅÍ­CÁ·ÂXB"L:B¸Ú·B:A<2A¯<2B|þBÚœB>Ã22!B"!4"!€"Lû:OÃ,Û4æ@ÂC>Ó$>ƒÓ#>Ó!> Ó >Ó#¯Ó!Ó%!ºDÍ�C!"ÃÁB!y2@þÐo))))ë!ÍDåy‡!E_~·2J·ÂmCë,"IÅÕÍFDáÁ+:Fw#:JwæBEÊXCEáåw#wÕ Ñw#wáyÉy2AÉ>Ð2Cy2BÉë n&Éi`"LÉ—2AÉÍ CÅNÍ B#yÒ”CÁÉå!©CÍ“CáÉ €>¯2K ÅÍ DÌÂCÁÈ´CÉ_:K·{ÊÞCÓ02HÛ3w# ÂÐCÍûCæœÉö Ó02H~Ó3# ÂåCÃûC:F°2HÓ0Û4ÒûCÛ02GæüÉÍFDÄðCø:BÓ2Û1O:A¹Ê)DÓ3ÍòCæ˜À€ÍpDÛ4æ >Ê8D¯Æˆ*L€¿ÉXÍòC*I|½È€ÍpDÍDøå!N>ÄÍËCáÀÛ2Ó1·ÊAD~2I¯É!J~·ÂžD:@G¯7ÂDö wÓ4ÍðCøÛ>Ò›D>¶w>2FÛ3~濱Ó4:CÓÉCANNOT BOOÔ Š20k CP/M vers 2.2 ŠgEcFçEgEsFFgEƒF%FgE“FDF(EEò?À     UEFEG?À     MOVCPM COMP RLOCBIOSCOM PIP COM:SUBMIT COM åå­6Éͤê INPUT FILE NOT PRESENT$0ͤê INVALID RELOCATION BASE$Sͤê BAD INPUT RECORD$oͤêMISSING FILE NAMECCBIOS ASM€rstuvwxyz{|}~€�CCBIOS ASMt‚ƒ„…†‡ˆ‰Š‹Œ�Ž��DISKDEF LIB1‘’“”•–—åååååååååååååååååååååååååååååååå=Â!óv"z!w6͈!ëÃuá#ÁÃãáÁ+Žw+wz þ>ÂZÁáÅxÆ G}‘o|˜g"|ë! ÁÅ:mþ Êc Ãp!ÿ"Ãx±Êp ~#ÃcÁå*|ë!:mþ ÊXSUB COMED COM4 ASM COM@!"#$%&'(DDT COM&)*+,-åå$ŠͤêCANNOT CREATE OUTPUT FILE$ ÍÉÃ^ÿ"&CPM COM=stuvwyz{=h¹å… x±ÊÀä SYNCRONIZATION ERROR$ {æ°ã~#ão}oÒ¼„üÃ…Ñ*z¾ÂZ# ÂÉ:mþ Êm€! ~·Â #Âáë*€ÿ DM! x±Ê  wLOAD COM./STAT COM)012345SYSGEN COM6DUMP COM7å幹޸æ&Î;&©qå#ÃøÃ!N#F! D!_>0w#wÊ1!`4~þ:Ú60+4Ã*�"e@Íuà READY FOR "SYSGEN" OR "SAVE 00 CPM00.COM"$*|é ÃÔ\ CCSYSGENCOM 89CCSINIT COM :;DUMP ASM!<=>?@BIOS ASM`ABCDEFGHIJKLÃ,COPYRIGHT (C) DIGITAL RESEARCH, 1979 1]þ Ê‘þ?Ê‘!þ Ê_·Ê_Ö0þ Òr)å))Á O Ã@|·Âr}þÚr.g))Ã¥{Íuà INVååCONSTRUCTING 32k CP/M vers 2.2$ê BAD HEX DIGIT$€Í:]þ Êf:mþ Êf!´lw#ÂÒ´ÕÍÑÍþÿÊ�¯2Ô\ÍþÿÊ!CBIOS ASMEMNOPQRSTUDEBLOCK ASMPVWXYZ[\]^_STDBIOS ASMu`abcdefghijklmnCCBOOT ASMopqALID MEMORY SIZE$!$Ê¡~/w¾/wÊ”|æügå*"záå|æ?¸>@G!�>0w#w!Ž4~þ:ÚÏ60+4ÂÁ~Íu!N#FÅ! �x±Ê, Åå¾Â# Ê Ãð¯ Gþ:Ê�:ïwÖx2ðpÍ0ʹ#þ*©6?ëw˜Í0ÊÀï#6 ¹þ.ÂéÍ0Êé#þ*ÂÙ6?ÃÛwÂÈÍ0ÊðÃß#6 Âé#6Âòë"ˆá _ÃÅÍŒÁÉ> Í’> Ã’> Ã’Å͘á~·È#åÍŒáì Ã_ÃÍ2î<ÉÃï2íÍÃËÃÃÃÃÃÃÍÃßÃÍ·ÉÃôÍá=ÂqÍfÍ^!ðå~2Í>Í`á~2ݯ2í\!Í!ÍB!~·Ê>þ Ê>#Ã0�~·ÊO#ÃCx2€Í˜ÍÕÍÍ1«Í)ͽÂÍfà zͧÆBAD LOÉ!³p+q*²ëÍ2®É!µp+q*´ëÍ2®ÉÍ2®É!·p+q*¶ëÍÉ!¹p+q*¸ëÍÉ!»p+q*ºëÍÉ!½p+q*¼ëÍ2®É!¿p+q*¾ëÒþ ÂÙÍ¢ÃÙñÍÂÂÍäØÑÆÍ^þ ÂBRͧÍ9!5‚#~þY‚#"ˆÍTÍÍï<ÌêÆALL (Y/N)?Í^ ÍTÍÐʧ͘!ñ6ÿ!ñ~þ€Ú‡åÍþ#~þ?  Âx·ÉDIR ERA TYPESAVEREN USER³z!yþÐξÂO#Â<þ ÂTyÉ#ÂO Ã3¯21«Åyæ_Í͸2«Áyæ2ïͽ:·ÂÃùÃôÃÃÃÿ Ã͇‡‡‡!ï¶2É:ï2ÉþaØþ{Ðæ_É:«·Ê–:ï·>Ľ¬ÍËÊ–:»=2̬Íù–!€€ÍB!º6#5¬ÍÚÊ–:ïADCOMÍfÍ^:ÎÖ !ð¶Â Â$$$ SUBá ¯w4!€ÍY~þʆ͌͆Ãt=ʆÍÙÍfà ÍøõÍ^ ÍTÍÕÍïÑÍ Êû¯2íño&)|µÊñ+å!€åÍØÍÍÑáÂûÃÔÍÍÚ<Âͧ˜1«͘ÍÐÆAÍŒ>>ÍŒÍ9€ÍØÍÐ2ïÍ^Ä :ð·Â¥Í.!Á_~#foéw]­Ž¥!óv"!éßçREAD ERRORðçNO FILEÍ^:ð·Â·Ä½!ͬÍÂʧÍÝÂÍÝÍ ÍÍ)!F#x·Êº~Í0wëw!"ˆÉ Í·ÈÍ·ÉÀÃ!«~·È6¯Í½¬Íï:ïý(!¾Â³zÙ¥«±ë"C ë{2Ö!"E 9" 1A ¯2à2Þ!tåyþ)ÐK!G_^#V*C ëéÈ � Î Ô í ó ø á þ ~ƒEœ¥«È×àæìõþ ,>Ó@:JGæ!ø(!ôNxæ@(+¨G:Q…o~2D!ÿÿxÓ4> Ó0Û40ûÛ0æ˜ Ä{Ó2Û3xö€Ó4>ˆÓ0#Û3wÛ40÷+Û0æœ ¦|ºÒ{¹ Ø:DO:JGÓ4>]» ÍÕÆNO SPACEÍ^ :ðõÍTÍéÂy!ÍÝÍB*ˆëÍOþ=Ê?þ_Âsë#"ˆÍ^ÂsñG!ð~·ÊY¸pÂsp¯2ÍÍéÊmÍÍÆÍêÆÍfà ‚ͧà !8 !Î ~þ Ê3#Ö0þ Ò Wxæà x€Ú €Ú ‚Ú G ÂÉ~þ  # Â3xÉ~#ÂBÉ!€�ÍY~ɯ2Í:ð·È=!ï¾Èý:ð·È=!ï¾È:ïýÍ^ÍT!ÎÏ#ÂýÉ͘*Š~þ Ê"·Ê"åÍŒá#Ã>?͌͘ÍÝ·Èþ Ú Èþ=Èþ_Èþ.Èþ:Èþ;Èþ<Èþ>ÈÉ·Èþ ÀÃO…oÐ$É>!ÍÍYåå¯2ð*ˆëÍOë"Šëá·Ê‰Þ@ &-AGMS  ›!ÊÍåþÊÉ!Õô!áô!ÜÍåÃBdos Err On : $Bad Sector$Select$File R/O$åÍÉ :B ÆA2ƺÍÓ ÁÍÓ ! ~6Ã\ÃXRLOCBIOS COPYRIGHT (C) 1979, DIGITAL RESEARCH †FILE EXISTSÍøþÒ _:Îþ Ê ÍÉÍõ:Îþ ÂÄ:ð·Ê‰=2ïÍ)ͽÉÖþ  ÕÍTÑ!ƒÍ@ÍÐÊk!åëÍØÍÍùÂá€}“|šÒqÃáú>úͦÉÍÉÍÉ!«q:«æ_ÍÉ Í ÍÉ!­p+qÍ.*¬ë ÍÉ ÍÉ ÍÉ!¯q*¯&ëÍÉ!±p+q*°ëÍ2®~þ Â� 6?#ˆÕÍéÌêÊ:îæ`O> ÍKÚÑ{ÕæõÂÌ͘ÅÍÐÁÆAÍ’>:Í’ÃÔÍ¢>:Í’Í¢xÍKæþ ÂùñõþÂ÷> ÍKæþ Ê> Í’xþ  ·Àà ÍûÍ ØõOÍ� ñÉþ Èþ Èþ ÈþÈþ É: ·ÂE ÍæÈÍ þÂB Í þʯÉ2 >É: ·Âb ÅÍ# ÁÅÍ ÁÅ: ·ÄÁy! þÈ4þ Ð5~·ÈyþÂy 5Éþ À6ÉyÃS:êæ2E !Ô~ЯwÉÍþ >ÿà ÍT  ÍÍõ ÈÍD Í^ 6åÍkÍÆ Í-äPYy°ÊÑ ÕÅÍ5ÒìÁÑ*Æ{•zœÒôÅÕBKÍ5ÒìÑÁÃÀ<ÍdáÑÉy°ÂÀ!Éêë*³{–#zžÉÍ Ør+sÉ{•ozœgÉÿ*ìë*ÌÍ• ÐÅÍ÷ *½ë*ìÁ ÊÄ ¾ÈÍ ÐÍ, ÉwÉÍœ Íà ͸ ÃÚ Íà Ͳ !±Ãã !¹N#FÃ$*¹ë*±€ÃO !ê~#¾À<É!ÿ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É>"O *»ë!ÁÍO *Æ|!Ý6ÿ·Ê� 6>ÿ·Éͯ*µw#w*·w#wÉÍ'û Í*·È! ÃJ *êÍê "å"ì!åN#F*·^#V*µ~#foy“xšÒú å*Á{•_zœWá+Ãä å*ÁÚ2Õ>2ÓÍT *C ÍG Í» :ãþ€Ò Íw Í„ ÂnÍ> 2×·Ê;O Í^ DM;}´ÂH>à "åë*C  :Ý·:×ÊdÍd sÃlO s#r:E ·ÀÅÍŠ :Õ==»ÁÍ Ò� õ^ÍH ñö@Oyþ ÂH  ÍH : æ– Éͬ  Í à #ÍH ÍÉ : ! ¾Ð ÍH ù  ÍH  ÃH þ$ÈÅOÍ� ÁÃÓ : 2 *C N#åÅåÍûæáÁþ ÊÁ þ Ê Õ*C ëÍ^ ÁÍO ÍÃ ÃÆ ÍT  Í*C ~wÍõ ÈÍD  ÍÍ-Ã' ÍÍõ È ÍÍ-Ã@ÍÍõ Èͦ ~õåÍ^ ë*C  ÕÍO Íx Ñ! N!Fáñwy¾ÿ"êÉ*Èë*ê#"êÍ• ÒÃþ :êæ‡ 2é·ÀÅÍà ÍÔ ÁÞ yæ<_WyæOx‡‡‡‡‡±OxæG*¿ ~ÂVÉÕÍ5æþÁ±ÂdwÉÍ^ ÅÑ ÈÕ:ݷʈà !"­"¯¯2B !€"±ÍÚ Ã!Ír ÍQÃQÍQâë~þ?ÊÂͦ ~þ?Är ÍQÍÃé *Ù"C ÍQÍ-Ãé ÍQÍœÃÍQüÍQÃþÍr ÍQÃ$ÍQÍÃ*¯ y•xœÚ ëá#Ãú áÅÕåë*ÎDMÍÑ*µs#rÑ*·s#rÁy“OxšG*ÐëÍ0MDÃ!!ÃN:ã· ÂE G>–O:â Ê\ ·ÃS €É*C  :Ý·Êq n&É ^#VëÉÍ> OÍ^ Åy==»å*¹Ww#òŒÍà *ç"åÅÍÑ Á͸ *å:ÄG¥¸#šá"åÍÚ ÍÑ ÁÅ͸ Á:ã!á¾ÚÒw4!õÍi æwñþÂ:ÕþÂÍÒ ÍZ!E ~·Âþ=2ã6Á þ x·Êï : 2 Ãp þÂ& x·Êï ~+é þÂ7 ÅåÍÉ ¯2 Ãñ þÂH å! >–wáÃï þÂ_ á: ! ¾Òá 5ͤ ÃN þÂk ͱ áÃá þ¦ Åͱ ÁáåÅx·ÊŠ #NxÊ‹>Ú‹>€*C wÉ~#¶+Àw#w+ɯ2E 2ê2ëÍ ÀÍi æ€ÀÍÍõ ÈÍ^ ë*C :Ý·Êè~·ÂÛw·Âá~¾ÂÃýÍ”ëÍ”ë¾Â#¾Â # ÅåNÃŽ ÅN#Fåy°Ê�*Æ}‘|˜Ô\á#ÁÃu*ÆÍê #DM*¿6# x±Â±*Êë*¿s#rÍ¡ *³6#6Íþ ÿÍÍõ ÈÍ^ >å¾ÊÒ:A ¾Âö#~Ö$Âö=2E ÍkÍŒ ÃÒÃ):B à ë"±ÃÚ *¿Ã)*­Ã)ÍQÍ;Ã*»"E É:ÖþÿÂ;:A à æ2A ÉÍQÓÍQÜÍQÃÒ*C }/_|/*¯¤W}£_*­ë"¯}£o|¢g"­É:Þ·Ê‘*C 6"åÉ*å}´É:Ã*å)=Â� "ç:ÄO:㡵o"åÉ*C  É*C ë!ÉÍ® ~2ãë~2áͦ :Ŧ2âÉÍ® :ÕþÂÞ ¯O:ã�wë:áwÉ È|·g}oÃë €*¹¯†# ÃÒ ¯2ÕÅ*C ë!!~æõ~#~æO~æGñ#n,-.‹! w! y–ÂG!x–æÊÅÕÍ¢ÑÁ.:E <Ê„! q!pÍQ:E <ÂÁÅ. Ê„Í$.:E <Ê„ÁÅåÍ áÁÃx å: ·Êñ ! –2 ͤ ! 5™ Ãñ #wÅåOÍ áÁ~þx½ þʹÚï áp ÃH Í Ã Íà y<Êà <Êà Í·Ê‘Í Ã :à !qÉëMDÃÓ Í#ÂÍìÿ ë ¾Úw ë ~>ÿ2ÒÃ!E 5ÉÍT *C å!¬"C ÍÍõ á"C Èë!¯w# ÂF! wÍŒ ÍýÃx ¯2ÒÍ¢Íõ È*C  ~<æwʃG:Å !Ҧʎ:Ôà Åõ:Å/Gy Oñ ‘æÁÉ>ÿ2Ô!Øq*C "ÙÍþ Í¡ ÍÍõ Ê”*ÙëþåÊJÕÍ ÑÒ”Í^ :ØOy·Êƒþ?Ê|xþ Ê|þ Ês–æÂ-Ã|ÅNÍÁÂ-# :à·Ê‘w:ß2ÖÍE* ù*E }DÉÍQ>2ÕÍÌÉå€Âý É È)à Å:B O!Í Áyµox´gÉ*­:B OÍê }æÉ!­N#FÍ "­*È#ë*³s#rÉÍ^  ~Ð!ÃJ Í È! ÃJ *¹:é…oÐ$É*C ~ÉÍi 6ÉÍi ö€wÉ*¯Ã åÍi 6ÀáÁ}2E Ãx ÿÍÌÁÉÍÌÉëN! ~æ€�O>ˆG~æ€G!~‡‡‡‡õ€Gõá}áµæÉ Í*C !år#r#rÍõ Ê Í^ Í¥áå_y–#xž#{žÚ 2E É>à ! ^#Vëé Èw#ÃP :B OÍ|µÈ^#V#"³##"µ##"·##ë"Ð!¹Íì 4~æʶÍÍõ ¬:Ó<ʶÍ$Íõ ʶïÍZÍ» ¯Ã Í Ãx >2Õ>ÿ2ÓÍ» :ã!á¾Úæþ€ÂûÍZ¯2ã:E ·ÂûÍw Í„ ÊûÍŠ ÍÑ Í² ÃÒ Ã > ÃãÃhÃ3Ã;ÃNÃNÃNÃ;ËÃÃpÃuÃ…íîÃFÃÛ%æÈÆþÉÛ%Ò;Û æÉÛ%æ ÈÆ¿ÉÍFÊNyÓ É Âm!¬Í�Í Í�1€ ¯go"@!Ð"B! w#�@@‘BHH„ˆ  !$$�A"D@‚�„ˆ "€ˆA" "€€BH‰A "‘ !’$� D‰ B �’I ‘ $� ˆ!„$$ €H‚@BD D$!'_~·2³¹ë,"I*@ãå*Bãåy2@>Ð2CÅÕÍMá+:Fw#:J2³Gw#:QwO!"xæʈ!.Ûæ@ˆ!·xæ@Ê’ ò’ëáãåw#wÕ Ñw#wáÁÂö wÓ4ÍðøÛ>Ò›>¶w>2FÛ3~濱Ó4:CÓÉCANNOT BOOÔ Š20k CP/M vers 2.2 Šgcçgsgƒ%ÃHCOPYRIGHT (C) 1980 CALIFORNIA COMPUTER SYSTEMS. ALL RIGHTS RESERVED.1H*.å+~/w¾/w¡$ÂTáåë!ÐÅ~# x±ÂlÁ!Ð ÑåzÞgÂ~ÅOÍÁ:Jæ–!"LÅÍ­Á·ÂX"L:B¸Ú·:A<2A¯<2B|þÚœ>Ã22!"!"!€"Lû:OÃÛ4æ@Â>Ó$>ƒÓ#>Ó!> Ó >Ó#¯Ó’ HI DIA!$$$ $" "€€$„€D ! $„ˆ" „’ $AB " BD„ˆD‘ $‘$’D�„’!"D’I$!$’BH„!"I‚B I‰$"D HD@$@B �B’�„ ’H’H II$�‚@ˆD€’I AˆBI€$"$‚H�$‚H�ˆã"Báã"@áyÉy2¯Éyæ=2²y>ÐÒÑ>�2±ÉÕ:®_P‡ƒ_!(VÕy2½·òéÑá¾Úø€–ÅB_V#ÿ –Òÿ#¯†ò–�’Ò ‚o<2¾¯gú#7�)ÃÁ¡µ<°oÉi`"´Ég“D(ò?À     UFG?À    .6ã~#ãoÒ�„ x±Ê{æÊ„}Ȭ ÍÃÿÿINSUFFICIENT RAM FOR DEBLOCKED BIOS$ÃéÃCÃÒÃ>ïÿÃ+ÃÃ0ÃüÃÁÃ*Ã5Ã@Ã!Ó%!ºÍ�!"ÃÁ!y2@þÐo))))ë!Íåy‡!_~·2J·Âmë,"IÅÕÍFáÁ+:Fw#:JwæBÊXáåw#wÕ Ñw#wáyÉy2AÉ>Ð2Cy2BÉë" " $"! �@H €�‚!BI „� " ‘’I  $’I$’I$’D’I$‘ !I$@"$"$‘! $’I$’I €�I€�€@ @€@‚$�$I! ’H’*ª  $Hˆ@„@A „‚I $ˆD’!!$I"BI"I"@$’BˆIIH‰€$„’$’$‰$„ˆBB„’I$’@„BI!"$’‰$’—2¯É>2Â2ÁÃ}¯2Áy2ÂþÂhÍ\*°"º*®"¸}ÍM<2¼!¼¯¾Ê�5Í\¸Í{ʯ2¼<2À¯2¿!¶¶6Ê¥Í\@Í{ÊÎ:··Ä Í\z2Q*®"ÃÕ ÂH!ÅÍDÍ ÍD1€ ¯go"@!Ð"B !&w#ÂYÅOÍÁ!"LÛæÊvÅÍŠÁ·Â3"L:B¸Ú®:A<2AÛæÊ­:Jæ@­:Q=ú­ Ê­¯<2 n&Éi`"LÉ—2AÉÍ ÅNÍ #yÒ”ÁÉå!©Í“áÉ €>¯2K ÅÍ ÌÂÁÈ´É_:K·{ÊÞÓ02HÛ3w# ÂÐÍûæœÉö Ó02H~Ó3# ÂåÃû:F°2HÓ0Û4Òû€@€I! €  €�@((((€„’„A D‚�I$’@’ ªˆA$€@ªªªªªªªªªª’$’�’$�@H! "!„$$"„’„ ’@B$!!‘!DH’$�$�‰"H @*°"B:³2J:À·ÄŠ!¿¶w¯2·*P¯�%7òÒ*²¥!Û€ =òâë*´:Á·Â÷ë<2·w# Â÷:Â=:¿À·À2·Í‹!¿¶wÉ:®ÍM:½<ë¾Ò?!õÿ^#VOÍÕB>”æüÂv>Ã22!"!"!["L!€"´û¯2¶:®2OÃÛ4æ@ >Ó$>ƒÓ#>Ó!> Ó >Ó#¯Ó!Ó%!ÓÍD!"úy2®!þÐo))))ë!æåy‡�Û02GæüÉÍFÄðø:BÓ2Û1O:A¹Ê)Ó3Íòæ˜À€ÍpÛ4æ >Ê8¯Æˆ*L€¿ÉXÍò*I|½È€ÍpÍøå!N>ÄÍËáÀÛ2Ó1·ÊA~2I¯É!J~·Âž:@G¯7 &Ðò8&�:¾oÃF!¹4!Ð"º¯Ã‚!à=òS^#VÉ:®_‡ƒ_!(VÕ:²·òo<2°ÑÉ!®–À#€É>¯2K ÅÍþÌŸÁÈ‘É_:K·{ÊÇ2HÓ0Û3wå$’I$’I"I ‚B€ @ €B@� H@$$DESTINATION IS R/O, DELETE (Y/N)?$**NOT DELETED**$$$$$$$NOT FOUND$COPYING -$REQUIRES CP/M 2.0 OR NEWER FOR OPERATION.$UNRECOGNI+À Ž� ¬#¬Ûêù `ဠhò€ x?‹€ €?•€ 00 £F¦U© COPYRIGHT (C) 1979, DIGITAL RESEARCH, PIP VERS 1.5$$$ SUB =.:,<> _[]INPIRDPTRUR1UR2RDROUTLPTUL1PRNLSTPTPUP1UP2PU#Û3w#Û3w#Û3w#­ÍðæœÉö 2HÓ0~Ó3#~Ó3#~Ó3#~Ó3#ÂÎÃð:F°2HÓ0Û4ÒðÛ02GæüÉÍMÄåø:BÓ2Û1O:A¹ÊÓ3Íçæ˜À€ÍƒÛ4æ >Ê-¯Æˆ*å €� ‚ I $‘!Hˆ�H$‰ ‰"$BDA$„"@‰„€ �H� €   @UUU@ZED DESTINATION$CANNOT WRITE$INVALID PIP FORMAT$CANNOT READ$INVALID SEPARATOR$1ò€Å€ÌÍ :ÌÖÖŸ2¥ÍLë> Í„ÒýMÍ9ÍÍ U¬d s£‚¦‘©‘G?ÀO?À??Às?À$G?€(O?€  :NTTYCRTUC1CONNULEOFDISK READ ERROR$DISK WRITE ERROR$VERIFY ERROR$NOT A CHARACTER SINK$READER STOPPING $NOT A CHARACTER SOURCE$LOÛ1·Ê<:QG>‡ò?Gy¿ÉXÍç*I|½È€ÍƒÍöøå!N>ÄͨáÊt>@¾Ø¶wÃMÛ2Ó1þÚH~2I¯É!J~·Â±:@G¯7Â’ö wÓ4ÍåøÛ>Ò®>¶w>2Få ªªª UUUT@B@BHHI !$‚A H€@2ÀÍ2ü1òÍ@:À2Á!o6+6+6!¦6#6!ó6#6þ:¥ÒG*ÍÍo Í.!N6ÿ:ÌþÂ^*üMÍ^Í!K6!6!¤6+6'Í :©þÂ�Ã$æʤþú]Â]:æÀʤþ€ú]Ê]Ã]:æÊ‹þú]Â]:æ Ê‹þú]Ê]Ã]:æÊ“þú]Â]:æ Ê“þú]Ê]Ã]:æÀÊœþ€ú]Ê]Ã]:æ0ABORTED$BAD PARAMETER$INVALID USER NUMBER$RECORD TOO LONG$INVALID DIGIT$END OF FILE, CTL-Z?$CHECKSUM ERROR$CORRECT ERROR, TYPE RÛ1·Û3~¼濱Ó4:CÓÉCANNOT BOOÔ Š48k CP/M Vers 2.2 ŠÃÛCÃûiÃ�Ã;µÃÎÉÉ(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)å:©þÂÃ:”=2KÍ Í :©þʤÍ\:õÒ·\ÍîÍxÃÀ'ÍîͲÃÛ:©ÖÆÿŸ!õ¶ÒÖÍ\Í¢Í Í :©þÂ͈ÍÆ'Å!Í ÍßÍʤþ ú]Ê]Ã]ÍõæÉÍTÅNͯ#yÒHÁÉå!‡ÍGáɯ2!gÃzI/O ASGT ERROR Š!€ÍDÃRST ERÒ €Û%æÈÆþÉÛ%Ò“Û ÉÛ%æ ÈÆ¿ÉÍœʤyÓ ÉETURN OR CTL-Z$INVALID FORMAT$HEX$$$$NO DIRECTORY SPACE$NO FILE$COM$START NOT FOUND$QUIT NOT FOUND$CANNOT CLOSE DESTINATION FILERa p#pŽ� ¬ò?À‹?€ •?€0Ã?€4ò?€<‹€ @(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE)(INP:/OUT:SPACE) ²ÃÛ:©þÂ$Í:¨þ ÊÃ$͈ͲÃÛ!N6ÿ'Í :©ÖŸ!õ¶ÒCwͯ !6:©þÂ^Í¢Íc!¨6ÿÃ{:¨ÖŸ/õ>!¨–Ÿ/ÁH±Ò{�ͯ :¨<26à à !6 à à !60à à *€&ëÍà !6ÃÏ Ã !6ÃÏ Ã !6ÃÏ Ã *€&ëÍà . 1 4 7 : = F P [ f q  Š •   ® ¹2yþÊ­ :yþÊ— ”ͯ *�"Ÿë*6:û2x÷ €*�"�!x4Âd !"�Í/ É!¡Íj}=2|þÿÂÛ É!"¡*KMÍ^'Í_ !z6:|!z¾Ú1 *¡*�MÍÉ:�É>!ú¾Ò(:ú=2úþÂ%> É>É>!ø¾ÒF!ø5+N!Í ~2‘!÷4ÉÍ<2‘þÂT>É>!b¾Ò}*bMÍ­Òz:b2÷!b6:ù<2øé>!É!³p+q*²ëÍ2®É!µp+q*´ëÍ2®ÉÍ2®É!·p+q*¶ëÍÉ!¹p+q*¸ëÍÉ!»p+q*ºëÍÉ!½p+q*¼ëÍ2®É!¿p+q*¾ëŸ/ÁH¡Ò:Œæ_2Œ:ŒÉ!�q:�ÖAŸ/õ>Z!�–Ÿ/ÁH¡Ò8:�ö 2�:�É:¤=O>¹Úm:W!Q¶õÍ} ÁH¡ÒmÍþÂd>É×Í9>É!�6:2Ž*¤M!E£þŠÍÏÍ :©ÖÆÿŸõ:¨Ö=ÆÿŸÁH±Ò®�ͯ !§6:§Ò¾:À2ÁÍ !6:©ÖÖŸõ:õ/ÁH¡Òí͈;!¨6ÿÃ:©ÖÆÿŸõ> !¨–Ÿ/õ> Ä Ï :�2É!‚q:‚þ Ê" *‚MÍÐ Ãn :cþÂ4 *‚MÍÐ Ãn :ó2ƒ!c:ƒ¾ÚQ !c:ƒ–2ƒÃ: !ƒ:c–w>!ƒ¾Òn !ƒ5 ÍÐ ÃY :‚þ Â{ !ó6É!„qÊ "}*}DM͆ 'ÍÓþÊ ¤ͯ €*¡"¡!z4Âó :eÒÉ !"¡€Í† !z6:|!z¾ÚÀ 'Í? ÖÖŸ2*H#"H!{6:{Ö€Ÿ!¦Ò¢ *{&`¾Ò¥*`MÍ­Òž!`6!ú6> É:‘Éé:‘ÉÃ(É!’q:ù!’†wO!Í ~2“þÂÙ*’&Í :‘w>É!‘:“¾Âê!ù4Ãï!ù6>É:N<2N!̾ÚÍÉ!Ãp+q*ÂëÍÉÿ ÍÉ!Äq*Ä&ë ÍÉ*ÀMÍ É*ÁMÍ É!Æp+q*Åë!ÍÉ!Èp+q*Çë"ÍÉ!Êp+q*Éë$ÍÉ!Ë6€Ë ÍÉ ^#Vëéý�ÍŽÚ—ÍO *�ë*~2�*�#"�ÃmÍó2�ÃmÍ– 2�Ãm!6ÃàÃm!6ÃàÃm!6 ÃàÃmÍæ2�ÃmÃÃÃÃÃÖŸÁH¡ÁH±Ò°ͯ :^!¶w:¨<2¤:¨þÂ0ÍÏÃ}:¨þÂ@ÍEÃ}:¨ÖŸ!¦ÒS!W6:£þ Âz!]6:cþÂm!c6:_þÂz!_6ÍlÍ:„ÖÖŸ!l¦wÒ™  Í Ã¢ :„Æ0OÍ É!…q:…æøOÍ| :…æOÍ| É!†6:]ÖÖŸ2l:o†'2o:nÎ'2n:mÎ'2m*mMÍ£ *nMÍ£ *oMÍ£ :]€ :{¡åÍ4Ê Á –ÖŸ2!{4Ãm €*¡"¡:Ú¹ µͯ !z4ÂI 'ÍÓ2!"¡É!€q:€þ Úô !ó4>!S¾Òô :S!ó¾Òô É:2�*£M> É*N&Í NÍîÉÍò2¨þ ÂÃÉ!–p+q!õ6!©6+6 !ª6:ªþ ÒS:ªþ ÂM!¨6ÍgÃ8Í:N2M*¨MÍ8ÒpÍÁ!©6É!”6!—6>!—¾ ÍÉ!kp+q*jëÍÉ> Ó>ÓÛÚª Þ ÛæÉ!qp+qÍ/ *pDMÍ9:Í Í:M2r:N!r¾Úø !Ì:r¾Òñ *r&Í NÍ!r4ÂÐ !Ì6:ÃÃéͯ Ãm!6Ã2Ãm!6Ã2Ãm!6Ã2Ãm!�6Í2�Ãmˆ­¶¿ÊÕàðóöùüÿ'2:Ž2:TÒ’:£2ŽÍ :©ÖÆÿŸõ:¨Ö,ÆÿŸõ:¨Ö ÆÿŸÁH¡ÁH±Ò°¼ͯ :¨Ö ÆÿŸ2§ó:£þÂÎÍEÍÏ:£þÂÛÍ1:¥2ÌÃûv!òq!òå*8éÉ!ûå*6é: É>þÂ:Í  Í Ã Í É*¡}æ2‰€ÿÍD"‡ÍÈ *‡Ê å*‰ëÍ *‰&"¡É!Šq:UÒY:Šþ ÂYÉ:¦Ò©:Šþ Ê©:_2‹þʘ:‹þ€!‹6<!Ý ^#Vëéÿ¡ÍŽÚ ÍÈ *¡Ê :€w*¡#"¡Ã Ã= Ã= Ã= Ã= Ã= Âͯ à *€MÍæÃ !6€Ãq à !6ÀÃq à !6€Ãq à *€&ëÍà !Ú•*—&P 6!—4Âz!ö6!ø6#6#6!ª6*¨MÍ8ÚÚ:ªþÚ¾É:¨þ*ÂÎ͇ÃÑÍgÍò2¨ê:¨þ:¿:”þÊëÉ:ªþÂ,Í¡ÖA<2”O>Í”:®þÿÊ :ͳÍ.ÃÉ!ws+p+q+ÑÁp+qÕ:w=2wþÿÊN *så*uÁ w*s#"s*u#"uÃ' É!"�*MÍ^Í7 !x6:û!x¾Ú¾ *�ë*DM͆ ÍÃ!£6*�MÍE:Ž2£:�ÒÜ:Ò²:§<2§ÖÖŸ2�ý:�Ö ÖŸ2�:�ÒÜÍ} ÒÜÍþÂÖ>Éͯ :iÒë:�æ2�:dÒú*�MÍîÉ:[Ò úͦ>úͦÉÍÉÍÉ!«q:«æ_ÍÉ Í ÍÉ!­p+qÍ.*¬ë ÍÉ ÍÉ ÍÉ!¯q*¯&ëÍÉ!±p+q*°ëÍ2®:ô<2ô!‹¾Ú˜!ô6 Í >!]¾Ò¤; !¦6:QÒÌ:ŠÖÖŸõ:£ÖÖŸÁH¡ÒÌÍÉ:Šþ ÂÙ!ô6*ŠMÍ :Šþ Âí!¦6É!Œq:ŒÖaŸ/õ>z!Œ– ¹ÒÉÍ*¨MÍ8Ò):¨þ[Âͱ!N5!©6Éñ:ªþÊ5É!¡6ÿ#6>!¢¾Ú°! 6: <2 O>‘Ÿ/õ: !¡†O!T å* MÍ¡á–ÖŸÁH¡Ò~ÃK: ¯ ¤Íê!36'Ín:®þÿÊé:0Òã:fÚÕÍ9ÍOÍîþYÊÒ#Í9Í.3Íê'ͳÉÍ.:0æ20'Í 'ͳ'Å7Í 6Íê'Íö2¹Ö0O> ¹Ú’:¹Ö0É:¹ÖAO>¹Ò¤:Í:¹ÖAÆ ÉÍ}‡‡‡‡õÍ}ÁH±Éͬ!µ†wÉÍ»O`iÍdåÍ»áÍVÉÍ[2ºO>¹Ú2:ºÖÖŸ!X¦Ú!»6:œ!å&Á ë!ŸsÃc*ž&P :Ÿw:žþ·>!Ÿ¾Ò±ͯ :Ÿ2ÁÃÂÍò2¨É:¨þ_ÂÎ!¨6=É!£6>'!£¾ÚéÍE!£4ÂÔÉ!©p+q*¨å0Í É!­'Í !'6!36'ÅÍ :1/!a¶ÒE*Ä#"Ä>ÍzµÂ?CÍ9ÍIͲÃ�ÉÍ.!Æ6> !ƾڇ*Æ&' ~2Çþ Ê€:Æþ Ây.Í*ÇMÍþ¡!©6Íòþ[–ͱ!N5:¢2¨É:¡Æ2¡!¢4Â=É:¨þ[¼ͱÃ4:ªþÂÈÉ!ª6:¨þ.ÂÍò2¨OÍ8Ú:ªþ ÚìÉ:¨þ*Âü ͇ÃÿÍgÃÉ!ÿÍj>ÿÍA+ë!ûsÉ!Ê"@ÿÍ“Ú1!€"ÿÃ<*ýë*ÿ"ÿÍÉÊÍ“åÍnÊ "ÿáÍDÍn"ý"ÿÍÉ:¤ÖÆÿŸ!Q¦2½Ò‚Í»¾Ú:»=O!L NÍE!»4Âü ÍE ÍE:ºþÂ/ÉÃÚÍ.*œ&L 6$LÍ9kÍ9Í.ÍþÂXÉÃÚÉ�ͯ É*KMÍ^ž0Íý20ŤÍår+s+p+q*¬~þ$Ê7*¬>¦*ªõ>¦ÁH¹Ê&>É*ª#"ª*¬#"¬Ã>ÉÍ 2¨:ÒR�ŸÍŽŸÉ:¨ÖÖŸÉ!¯6!œ6Í=2µþ:Ê™!œ6:µþ“H!Æ4ÂQÉ>!”¾Ò›:”=2á:ü2É:öÒ¬Í\>!”¾Ò¿:”=2KÃÅ:ü2KÉ!À:Á¾ÊÑÉ!:K¾ÂÞÍ\ÉÍ:¨þ ÊíÍ\É!Ép+q͈ÍßÅ*ÈÕ:¨þ[ ͱ!N5!©6:”þÂ%:ü<2”*•6 *• 6ÉÃ¥É!šq!›6> !›¾Úd*›&I :š¾Â]>É!›4ÂA>É:ª<2ªO*• :¨w:¨þ?†:X!W¶Ò“ÍÚäÍ:Ú¤*¨MÍEÓ:½Ò±ÍÍ@ÉÍ@:O2MÍc;!¾6#6>!¿¾Ú)*¿&P ~þÊ":¿ÖÖŸõ:¿ÖÖŸÁH±õ:¿ÖÖŸÁH :0æ20:1æ21¢Íê'ͳ'Íã:®þÿ²¥ͯ !G6!"¡É!ÿÿ"ŸÍ7 *MÍ^ÍnÍ/ :a/õ:ÁH¡Òì!®6ÿ:®þÿÂú¸ͯ !&6åÍ9ÍþÂŽ>É!œ6Í-Ãe!µ6Í»2´þÂÇÍ=2´þʺÍ-é:¯ÒÄ>É>ÉÍÄ"·Í»2¶:´ÖÆÿŸ!¯¦Òð!´5Í»2³ÃÓͬ!µ†þÊ\ÍDM!Í ÍÆÉÍ :©ÖÖŸõ:¨Ö=ÖŸÁH¡Ú-Í\:N2OÉë_ë…oŒgÉ_{¥oz¤gÉ^#Vë)å))Á É_{µoz´gÉ^#Vë) ÂdÉ^#Vë|·g}o ÂnÉ_{•o!õ6É!œq!¨6?!œ:ª¾Ò ÍgÃ�É!�q*�&ë*•~É!ö6:À2ÁÍò2¨:¨Ö ÖŸõ:¨Ö]ÖŸÁH±Úº:¨ÖA2žO>¹Ò:¨þ ÂúÍò2¨Ãͯ ±õ:¿ÖÖŸÁH±õ:¿ÖÖŸÁH±Ú"!¾6!¿4ÂÉ:¾Ò_ÍÍjÚYÍO ÍjÒM*Ÿ"¡ÃS*ÿ"¡ÍÈ Ã3Í@ÃbÍl*¾MÍ1ÉÿÿŸÍ“µÆÿŸÉ!"À"ÄÀÍý2*ý"�É>!b¾Ò!Äͯ >!`¾Ò0Ôͯ É!¼q:¼ÒE:24ÃJ!46*¡}æþÊa!44ÍEÃJÍÍÈ *KMÍ^'Í�:®þÿ‚ãÍåÍ-:¯Ò>É>É!±p+q:¯Ò,!¯6*°DMÍ9É:®Ò<!®6ÍÉ:¯ÒzÍ 2²þÂW!®6ÃD*œ&L :²w:œ<2œþOÚv*Í:²É>ÉÍ=zœgÉO{‘oz˜gÉi`N#F‘o˜gÉo&•oœgÉ H ©=¨É÷:¨ÖSÖŸõ:¨ÖQÖŸÁH±ÒI:N<2ŸÍò2¨ÖÖŸõ:¨Ö ÖŸÁH±Ú@Ã"Íò2¨Ã�Íò2¨Ö02ŸO> ¹Òc!Ÿ6Ã�Íò2¨Ö02™O> ¹Ú�*Ÿ&ÍOå*™Í7 *MÍ^€Í† \Í”!"Â:®ÖÿÆÿŸÀÂõÍŽŸÁH¡ÒÄ*Â#"ÂͧÃ�Í/ :®þÿÂå>ÄÍ›µÂá9ͯ Í.É*Â#"À:®æ‡‡‡‡‡_!€å  ååÉ*z&ô ~2yÖ ÖŸõ:yÖÖŸÁH±Úª!z4>É>É*z&ô ~þ ÂÃ!z4íÉ!{q*v#"vÿÍ™ÒÞdͧ*vv :{w:x<2xO>}¹Òý|ͧÉ»2%·Â Í‹É*-"Ã*$$$ SUBqÕ:(=2(þÿÊN *$å*&Á w*$#"$*&#"&Ã' É!"N*´MÍ^Í7 !)6:¬!)¾Ú¾ *Në*²DM͆ ·ÍÃï=2ïþÿʦ*ëå*íÁ w*ë#"ë*í#"íÃÉ!óp+q(Í÷+Í÷¶Í÷*òDMÍ÷*ðùÉ�ÅôÍp*€&ô 6:ÅeÍp\Í:ÞþÿÂ=¼ÃW Extended Submit Vers 2.0Xsub Already Present$Requires CP/M Version 2.0 or later$Å:þÂy*###۾ƒ# ÊyÃk ÍååÍ-!Û6»Í]:Þþÿ·ͧÍz2~þÊe:~2€O!� 6*~&‚ 6$>!~¾Ò_Íz*~&€ w!~5ÃBÍxûÍ:ÞþÿÂyÆͧÉ*v+"v2*þÊ­ :*þÊ— ”ͯ *N"Pë*²6:¬2)÷ €*N"N!)€ €$@€BA$! A� ‚"!$"„"ͧ!t6€É>!t¾Ò%\Í=þÊ >É!t6:t<2t=O!€ ~2uþ Âb:¸<2¸O>9¹Òb!¸60+~9¹Òb!·60+4:uÖaþÒt:uæ_2u:uÉ»ÍMþÁÉ Íþ Ò— 4ÍÁÉ!~=ÖÁÅ�WÕ!x±Êµ ~#èÑÁåbx±Ê× {æÂÊã~#ão}oÒÓ„ùÑ.éxsubbÉ!np+q*mëÍ2_É!pp+q*oëÃß copyright(c) 1977, digital research $Error On Line $SUBNo 'SUB' File Present$Disk Write Error$Command Buffer Overflow$Commåv ~ÉÃÃÃÍÉÉÉ_{•ozœgÉ001 $$$$ SUBåʉSͧÉ!v6!"v!|6:|Ò€!x6Í 2}ÖÆÿŸõ:}Ö ÆÿŸÁH¡Òk:}þ Êh:}þ$Â6Í 2}þ$Âæ*}MÍÄÃ3:}Ö02}O> ¹Òþ�ͧÃ3!zà ÉÃ]xsub*"-!/"*"+!"á"¼éÃÉ1Þ MÍ*!€"ºÍ�!"*¼é (xsub active)$áå|þÿÒ*yþ Ê¥þÂ*ë"ºëÃ*7Í*and Too Long$Parameter Error$Invalid Control Character$Directory Full$Cannot Close, Read/Only?$!9"ð!“ùÍÌÍŠÍþ͇É!Ýp+q*Üååå6Í­:}þÊ"!}5Í�ÒÃÍ­ÃÍ�Ò3*yMÍÄÃ"Ãh:}þ^ÂaÍ Öa2}O>¹ÒV�ͧÃ^:}!”¾ÒÛÃ×ÍÃÈ!!6 :”ÖÖŸ2Ò.t– *rë ÍÉ!up+qÍï *tDMÍú É!wp+q*vë ÍÉ!zp+q*yëÍ2xÉ!|p+q*{ëÍ2xÉ!~p+q*}ëÍ2xÉ!€p+q*ëÍÉ!‚p+q*�ëûÃî :!þI¬!Š: –ÖŸõ:ÖÖŸÁH¡2 Ò®ÍX:h2iÍÒ�:!þÊ�:!ÖÖŸõ:!ÖÖŸÁH±õ:!ÖÖŸÁH±Ò,!"! 6#~þÂÍï ÍFÃë+s#r!:¾Ò* *&Ÿ ~2!:<2ÍÙà Ãë Ãè :!þWÂ> ÍvÃè :!þX³ ÍZÍŽÒ\ ÍE•Íe ð :7/Òƒ ÍE!76•Íe •Í• :xþÿƒ FILE NOT ACCESSIBLE$BAK$$$BAK$$$-(Y/N)?$NO MEMORY$BREAK "$" AT $1mMÍò"m Í×+ë!8s~!”¾ÚÍÃ!6!“6sÍ, !”6€:xþÿÂB!6OÃõÍU2!þÊSÍÙÃB!G6:Òƒ!6:G¾Òƒ*G&¶ ~2!:G<2GÍÙÍÉ!„p+q*ƒëÍÉ!†p+q*…ëÍ2xÉ!ˆp+q*‡ëÍÉ!‰6€‰Í É ÍÒÛ Í>É>ÉÍÉ! q* &ëÍÉ!p+q*)Í·ÍX:!þÂÍï ÍXÃ):i!h¾Ò)Í9 ÃÃe:!þÂÊ:h2jO>¹ÒF ÍL>!"ÍŸõ:i!j–ŸÁH¡Ò¼*"+M ~þ ʼͲ!f6!h6!"Í- Í·*&"K(KÍíÚ° *KM NÍ”*K"KÒŒ Ãè :!þZÂÝ ÍŽÒÍ Íó þÂÍ ÃõÍ¢ÒÚ Í:ÃÍ Ãè :!þÊè ÃâÃî ÃâÃ'ûvÍÉ!gq9mÍí+ë+s#r!9ÍÓë+s#r9Íí";9;Íí"^*mM 6*m+"o!oÍÓë#s#r!6!f6!6:]Ö ÖŸõ:mÖ ÆÿŸÁH±Ò}Í- :\ÍüÍ¢Ò‘Í ÄÃè :!þJ ÍüÍ$:2Í$Í¢Ò Í :=2:<2!¾ÒÝ*&Ÿ ~2!ÍÙü*""I*M*ëÍo/ÒöÃ×!:–"Ã_Ãî QÍüÒ›=Íe Í Ãî Íb:!þ-®ÍÆ! 6:!þ#¿͇ÍÆÃüÍ;ÒÜÍJ:!þ:ÂÙ!!6LÍvÃü:!þ:ÂüÍÆÍJÍv: þÂü*#"ÍŽëÍÉ:7Ò •Íe ÍÉ!p+q*DMÍ Íï Í É=Í? )Í É!p+q.å*DMFá -ÂL É*9"`!"b!h6!j6!|6.!=\ -Âx ! 6ÍF!f6:h2k!i¾Ò :i2k:j2h:k!h¾Ò¶Í9 æ:h2j!!6:j2hÃe:!þ >"ÍúµÂáÃõͲ*"M ~2!OÍË :!þ Â*+":fÒ É*g&ëÍÉ!lq:lþ Ú$ !h4:lþ Â1 !h6*lMÍü É:hþÂB ÉÍ  Í Í !h55É!mq:mÖ ÖŸõ:hæO>‘ÁH¡2nyÒ} !m6 !o2dþ‘ÍÞ 2dÃ�:d=2d!\6:l2eþ±:d2eø:e=2eÍEÍU !M6 !""*o"$!h6Ã1m!6#Ãõ1m!6?Ãõ1m!6>1m!f6²Íú"&! 6ÍR*I""ëÃè :!ÖMÖŸõ:ÖÖŸÁH¡Ò| ! 6ÿ>ÍúµÂF Í›Íeõ: <2 O! ÁHqyþ Êd ÃF : 2! 6å*ëá#s#rÃè :!þÒ! 6:!þBÂ)! >–w!"&*o"(ÍRÃî :!þCÂ:ÍeÍRÃî :!þDÂKÍeÍXÃî :!þKÂ\Í·ÍXÃî :!þLÂjÍ^Ãî :!þPšÍŽÒ‡! 6ÍÚ!e:d¾Ê¥ *eMÍç \ÍR :xþÿÊ¥ @Í *dMÍç \Í, :xþÿÂ× \Í• :xþÿÂË Í- VÍ Íï Ãù :eÒë _Í Íï Ãù :fÒù wÍ ”Í: !!6Ãe*!MÍ› /Ò$^ÍL:!Æ@OÍL:!þ Â2Í‘Ãe:þÂb:!þ ÚL:h<2hÃb:!þ Âb:hæO>‘!h†wÍÙ:!þ ÂpÍX:!þ Â…!!6  Í6:n!o¾Úš *mMÍ !o4‚ É!pq:pþ Úª >É:pÖ ÖŸõ:pÖ ÖŸÁH±õ:pÖ ÖŸÁH±É!qq*qMÍ› Úç ^ÍW :qÆ@2q*qMÍW É ÍË  ÍË É!sp+qÍ *MÍË ºÍú *!MÍË Íï 1m! 6!6! 6ÍÆ: 2EÍÕÒbͽ!e:d¾Ê\:æðõ:eæÁH±2Í Ãî HÍÕÒ†ͽ:e2!:d2e:!2dNÂÝ ÍüÍ¢ÒÚ *ëÍo/Ò× ÍÄ Ò¦ ÃõÍáͶÍn! 6!"&ÍRÍè! 6o$ÍíÚÔ Ã×ÃŽ Ç Ãè :!þSÂ0 ÍüÍ$Í¢Ò- Í :2"Íú  =Íe !e:d¾Ê*eMÍç =Íe —Í: =Íe =Í• !]6:xþÿÂ>Í- !"É!76!¡6!µ6!66É*dMÍç ¶Í÷ ÉÍÓ*dMÍç !6:8!¾ÚÏ"&Ô"Íí"&ÃÃ*""&$mÍíÍýÚ¸*o"(ÃÃ*ë*$"(É$"ÍíÚÓÃíÍÚOÍ26þÂæÍ›É*"M :6wÍ¢:6þ ÂÍÂÉ NÍ’É!ÿÿ"É>ÍúµÖŸÉ!"ÉÍŽ/Ò´*+">É>É!": þÂß*#"*""*!".+",Ãñ*$"**o".!",!36:3Ò{.*FMÍÕÒ8Íï *FMÍü   ÍÍó OÍy2FÍï :FþYÊ5Ã>É>É:!Ö02HO> ‘Ÿ/É!"Í;Òu*)))å*)Á å*H&Á "ÍÆÃPÉÍíÒMÍaÒŽ:æ_É:É!q:Ò¥*MÍyÉ:É!p+q!'"!6>ÍúµÊ*ë*ͪ{2*ë*ͪ"*ë! ͪë":ÖÆÿŸ!¶Ò!Í$:2É*ëÍo/ÒÃ×É*!MÍyõ:”<2”=O!s ÁHqÉ*ë*DMÍÉÍ·! 6: þÂe!"*""?Ãk*&"?*?+M ~2AÖ ÖŸõ:h*`ë*;DMÍ÷ \Íu 2xþÊ»>!x¾Ò¨Í- *`ë*;6:82ÃÅ€*`"`:<2ÂwÍÓÉ!"`É9`ÍíÚéÍh*`ë*;~2þÊ*`#"`ÃÄÉ!7q:Ò*7MÍ’É:7Éo$ÍíÚ+Í›Éͪ*$M ~28OÍm:8þ ÂIÍÂÉÃÉ͇Í¢Òu$oÍíqÍýÚoÍ›ÃrÍÃPÉ! 6!"&*ÍíµÆÿŸ22*,ë**"0M õ~Ö ÆÿŸÁH¡Ò3*0"*Ãý*+"*+">ÍãµÆÿŸ23:2/Òk!36,*Ííë+s#rÃx:3Òx*0"*Ãö: þ˜! 6Ííë+s#ré! 6Íí"ÉDM!>õ)ë—)ë�‘o|˜gÒà ñ=±É^#Vë) ÂÍÉ^#Vë|·g}o Â×É_{•ozœgÉi`N#F‘o˜gÉo&•o6:Æ0OÍË Ã ÍË ÃºÉ!p+q:/Ò(É*DMÍ©:ÍË  ÍË : ÒI ÍË ÃN*ÍË É*DMÍÉ:þÊaÉÍOÉ>!¾ÒºÍÄ ÒxÃ×!: ¾ÚÖÆÿŸÁH¡Ò�Íï *&"?(?ÍíÚÙ:Aþ ½Í8*#"ÍÄ Ò½Ã×*?M ~2AOÍË *?"?Ò•É!"É*"É*"ÉÍáÍÚÍ^: 2B! :É*eMÍç !bÍÓ+ë!s{þÿÂ!ÉÍf!6:!¾Úb*bë*^DMÍ÷ =Í… þÊNÍ- €*b"b:<2Â)ÍfÉ!"bÉ!q9bÍíÚ€Í*$"(ÍRÍŽÒ”ÍMÍ¢Ò¡ÍÔ($ÍíÒµ! 6ÍRÉ͇ÍvÉͶÍÚ2!þÊÕ*!MÍmÃÀÍËÉ$"ÍíµÂéÃí*"M :!wÍ¢:!þ ÂÍ“**"&*"+"(á*$#"&**#"(É*"#""É*$#"$É*"+""É*$+"$É*#"É!4qM*"å*$å: þÂ*(yÚñ"$ááÉDMáÑ}‘|˜ÒC#~þœgÉ_{–_z#žWëÉ H Â=ÂÉ LIB¦> ÍúµÊ¡* +" >ÍãµÂ¡Ã×! 6: <2 =O! NÍ’É: ÒÉÍó OÍ’É: Ò! 6:hÖÖŸ!¦Òo$ÍíÚúÍÃýÍOÃ6ÍÚÍF:B2 o(ÍíµÖŸõ>&ÍúµÖŸÁH±Ò6Í›Ã9ÍèÉ!C6>!C¾ÚaÍÄ ÒRÃõ>úÍ:C<2CÂ?É! 6!"É͇Í¢Ò�q"Íí*bë*^:w*b#"bÉ!q:6þ€Ú¶ÍZ•Í… þʱÍ- !66*6&¶ :w:6<26É!J6*b}æþÊê:J<2JÍmÃÐÍ=Í? :xþÿÂþÍ- šÂÉÍe2!ÖÖŸõ:!Ö ÖŸõ: /ÁH¡ÁH±/ÉÍÒQ:!þ Â@!!6 ÍR!!6 :!þÂKÃâÍRÃ$É*&Ÿ :!w:<2þdÚnÃíÉ!:s+q*$";!>6  å*#"áÃö*&DMáÑy“xšÒCþ Â1å*+"áõ:4Ò?ñw+ÃñÃÕ³â"$á""ÉÉÍÊÉÍÊÉÍ·ÍRÉ: þ—*$"("ÍíÒˆ!X$$$$$$$LIB*ÍË Í¸ ! 6 ÍË !h6!Š: –ÖŸ2 Ò3* &‹ 6 : <2 =O!‹ NÍ’É*dMÍç €Í÷ É:”þ€ÚsÍGsÍu þÊn>É!”6:”<2”=O!€ÚŠÍ›Ã�ÍÄÃqÉ!!6 ÍÙ!!6 ÍÙÉ!6*!MÍa2D*!MÍ’2!:D/!¶+wÉ!6Íe2!Í¢É!Eq!E:!–ÖŸõ:ŠÖÖŸÁH¡õ:ÖÖŸÁH¡É!FqÍ: Í;*dMÍç .=\ -Â=ͨ Í;�Í: *eMÍç =ͨ É.M= -ÂCÉ!q:þÊYÉ*MÍË É!q:ÖaŸ/õ>z!–Ÿ/ÁH¡É!q*:>/;oõÍíŸÁH¡Òç*;#"(";:92=*=&Ÿ å*(M Ñ–ÖŸ!:õ:=–ÖŸ2>/ÁH¡Òä:=<2=*(#"(æÀ:>Òø*(+"(ÍR:>É!6  åð ð åÃà á ÃÊ Ã4êÃÞü ÃÃ/ÃLÃ9ASMPRNåHEXå1*"Íà COPYRIGHT(C) 1978, DIGITAL RESEARCH   þOÊŠþQÂ�>ÖþH >2 ¯2 û: þB­>ôþD> ¸!ˆ52 !"†!ˆN#~#þAÒÒÖ0ÃÔÖ7åÅO! ¾Ô~*†ë!·Ê÷Òñë)ëÃè "†Áá ÂÆ͸*Ð"!!#^4!$ñwÑÁÉõæͯñõæͯñ‚WÉÆ�'Î@'ê>:ͪ!#^¯Ww*!{Íš|Íš}Íš¯Íš{·Êè!$~#ÍšÂ߯’Íš> ͪ> ͪÉ?¸þ'  vÃ:P@<° ö!ÓÁÉ Ç˜Þ PP27�Ö (¨îÍ *éÅ"ùëã  NZZ NCC POPEP€€~# Â…ÑÕåÍáÑÁ·Â¡ÈÃz!ͼ ÃwÅÕåÍ´áÑÁÉ*Ÿ ë!¡ wë#"Ÿ ë!ÍÄ ÀÍ8 !"Ÿ !¡ zÃzÅÕå_ÍáÑÁÉOÍ4: þ È:6þÈyÍÞÉ{•zœëÒA"Ë*Öë![N![ N#Fr+sëq#pˆþÚ/>G=#w#wÂ3¯#w#wÉ!JÍÃSYMBOL TABLE OVERFLOW æðG*Ö##~æ°wÉ*Ö##~æÉÍ!4¾Èw_ÍÉ#~þ ʸ ÞAÉ:4É~ÍÞ~#þ ¼ > ÍÞÉ\ þ?Ê» w#ÂÒ É! ͼ Ã? ÍþÿÀ!¹ͼ ÃÍþÉ: þ Êþ'Â<Í­þ'ÀÃ<õ>VÃ$õ>OÃ$ÅåÍáÁñÉõ:…þÄžñÉàÃ\ÞØÃëÃ`ÃrÃ�ÖÃ@Ã2ÃÀÍõþ Ê0þ Ê0:„þxÒ0_<2„! ñwÉñÉÍI2 2„> 2 Í>2„ɯ2ˆ2 É!ˆ~þ@Ú_6Í^4#: wÉ~þ$À¯wÉ: Ö0þ æÉÍqÀ M ÿ¯x�»ÊÄ_åÕÅåBH!œÑ‰¾#¶ ¦ÁÑá{ÉÁÑáÚÀKÈCȯ<É:‰ÂþJÈÄþCÈÀþRÉ:ˆþÒ þÊòþ !‹6 s!оÂ:„! ·ÊG~Íë#x=Ã2„> Íë> Íë! >x6 #=Â'ÉG! ~þ ÀpÉÍ( ÊO*�}´ÊO>Í4Ã?:7þÊw:#·Ä¸*Ð"!͸*Ÿ }´Êw>ͪÃgÍ( ʆÍ1 Ž*Ö_###ÉåÍÑs#rÉÍ^#VëÉÃ`ÃÃÄÔæ‚®½ 4 ½ÝïWm ()*+,-/ABCDEHLMDBDIDSDWEIIFINORSPACIADCADDADIANAANDANICMACMÿÀ!)ͼ ÃÃÍþÿÀ!Ðͼ Ã:5Í¡ É:6þÈþÉ:6Í¡ É:7Í¡ É:\þ Ê» Í24!dÍ® 25Í® 27Í® 26!8ÍÍ Í( ʃ !YååÍÍ Í1 ÑÍ Ñ: ÖAþæÉ: ÖAþæÉÍ‹ÀÍqÉ: þaØþ{Ðæ_2 ÉÍ 2 Ã-Éþ ÈþÈþ!ɯ2…ÍI: þ Êôþ;Êáþ*Âí: þ ÂíÍ­Í·ÊúÃáö þ ÂúÍ­ÃÇÍ‹Ê#¾È Âø ɯ<É:ˆO=_ÕþÒZ!µF!©V#fjQ̓ÂEÑ!º^#Vo&)~#FÉÑÍÇÀÅÍÛxÁÀ·°Gy¿Éѯ<ÉàÃÃnÃ8YÍú :7þÊ—Í8 zÍú !<ͼ ÃCP/M ASSEMBLER - VER 2.0 NO SOURCE FILE PRESENT NO DIRECTORY SPACE SOURCE FILE NAME ERROR SOURCECCMPCPIDAADADDCRDCXENDEQUHLTINRINXJMPLDALXIMODMOVMVINOPNOTORAORGORIOUTPOPPSWRALRARRETRLCRRCRSTSBBSBISETSHLSHRSTASTCSUBSUIXORXRAXÍ :7þÊž !zååÍÍ Í8 ÑÍ ÑÍ Ã!"›¯2D2X2#Í! 8Íé É!ãͼ Ãz¼À{½ÉÅÕå*›ÍÄ ÂÍ! !"›!�Åå8ÍáÁ·€Â €€w![€¯w#w#Âb!"ÖÉ!ˆF¯#†Âvæ2[>Ã9ÍqÊ>Ã9: þ'Â!¯2 >Ã9þ Â7:Ï·Ä! 6 >2„>2…: 2 ·ÄQÍ­:…þÈþÄž! :…þÂlÍjÊ<Í–ÈÃ<þÂÍjÊ<Í|Â<: ë!’~þڢͅ6~44O!� s#rÉõ!‘~þ Ú¿6Í…^4ñ!mw!wpÉ!’~·ÂÞÍ…!É55N!� N#fiÉÍÏëÍÏÉo&)^#fk FILE READ ERROR OUTPUT FILE WRITE ERROR CANNOT CLOSE FILES END OF ASSEMBLY ÅG:7þxʘÕõ!#~·Ê„þÚl͸Ä*Ðë*!O {½Â�z¼ÊŠRICALLENDMLDAXLHLDPCHLPUSHSHLDSPHLSTAXXCHGXTHLENDIFMACROTITLE  PF FPóû!Û (Έ€Æ  2æ/# Âþ Âç ÃþÒ+6# Â�*›å#"›á~áÑÁÉ!úͼ ÃÅG:6þÊQþxÂJÍÞÃQÕåÍSáÑÁÉ*�ë!Ÿwë#"�ë!ÍÄ ÀÍ1 !"�!ŸY~þÈÅÕÉG*Ö##~æð°wÉ*Ö##~æ<É*Ö}´ÉÍq!ˆ~þÚ¬6![^![^#fk"Ö͘ÈÍŽ!ˆ¾ÂáG#ë*Ö###¾Âá#ÂÕÉ*Ö^#Vëû!ˆ^*Ë"Öë*Í é‰’™Ÿ«¿ÆÐÙàìø…Íìz·Â'{þØÍ…>ɯ•o>œgÉÍìë"k!m6ů{_zW5áÈ>Î)D…*k•OxœGÅÒd ã!m?ÃFDM!¯xGyOÚ‚°ÈÃÃR{•ozœgÉ!Ï~4·Ê§Íͦ !6 ! Í*Ëë*ÔÍ„å*Íë*ÔÍ„\áÍiëÍ© !Ö·Êäw#ÃËH USE FACTOR !Í*í "ÐÃz¼À{½É*Ð"ÒÉÂSÃÑÍã Ã1ÍÑ: þ Â1"Ò"ÐÍ Í¦ Ã1Í Ê|ÍRþÄÝ >ÍOÍÑåÍ áÍU!"ë Ã1Íã ÍÃ1Öþ!Ò|_!ë^#fké $8AP`ix�ÛÍ“öÍQÍŒÃQ!.Í·Â6yþÚ#ÆGÍÍ™°ÍQæÏþÀà!2Í·ÂQÍŒþÒÍ“öÇÃQ!>Í·Âq ÂeÁÃgÅÍÍ™±ÃQ:zþJÂ�ÍEöËÃ*å>EÍáɯ2ÏÍCÍÍ!"ë "Ð"Ò"í Í:…þʼþÂÝ:‰þ*Â1Í Â|ÃRþÂ|ͦÊ0ÍFÍIÂþÍL:Ï·Ä× Ã ÍRÃÃOÃ$*sëÍõyÍ�ñÉþ Èþ Èþ,Èþ ÈþÊ$É Í ÍÉÍŒþ ÊÍÊ9!z6 # ÂL!zwÍŒÍÊj# ÊÃX:zþ ÉÖ0þ ØÆùþØÃ͘ƒë)ëÃsÍìÍnÃÍ5ëÃÍ5ÃÍ·Ê)=âÍ·Êõ¯|g}oñ=îÍìÃÍìëÍ-ÃÂÍÏÍ-ÃÍÏ#ÃÓÍìz¤g{¥oÃÍìz´g{µoÃÍìz¬g{­*ë "ÖÍIÉÍ È!"ë :Ï·Â1 ÍRõæÄÝ ñöÍO*ÒÍUÉÍRæÌ× ÍXë*ÒÍóÄ× ÉG:Ï·xÊl ÅÍ: þ *ÒÌ© :ï þÁÒl xÍ– *Ð#"ÐÉåEÍH áDÃH Æ0ˆ�ž¥ÍH ÍñÍüÍÍñÍüñÍòþ8Ê1æĽ yæ0°Ã®ÍH ÍñÍò°GÍÍç°Ã®Íò°ÍG ÍÍ ñÍH Í ñÍòæ(Ľ yæ°Ã®ÍH ÍñþC–ÍEöÍQyÍQxÃQþRÂÍöÀÃQ*Õë* {•zœÒ·*ùÉÑ~#" É<æþÚÈÆþÚÏÆÆAOÃGæðÆ�'Î@'OÍxæÆ�'Î@'OÃNÍ#Âõ þ Íã ÃR*ë }´ÄÝ *Ö"ë Í:…þ¿:‰þ:¿üþÂ×X!C^#fké[©ÀÞ@‡�§ÎÍ Í:…þÂŒ:ˆ=ÊŒG!‰ʆÅF#åÍH=ÂëN#FyÉÍ}ÂÉæ8Éæ0Éë*zë{¾Â¯#z¾È+++ Â¥ ÉÕz¾ÂÊ#½ÑÉ#ÂÊøÿÑ · ÉÅÍ9Ê!`Í Â yÁÉÅÍ9Ê!rÍ·oÓ:…þÀ:‰þ Èþ;Èþ,Èþ!ɯ2‘2’=2l!"ÉÍÂ]!‘~·ÊH5_!m~ÍôÃ0:’þÄ…: þ À*�"ÉÉ: þ Â:…þ‰:ˆ·Ì…þÔ…!‰^#þ:ØÆÉÍ~ !ï ^4! wÉõæ͆ ñæÆ *Òë!ï å6zÕÍ– Ñ{Í– á4ÉõÅ>RÍÁñÉõå>VÍáñÉõ>DÃæ õ>PÃæ õ>LÃæ õ>NÍñÉÍç°Ã®Íò°Ã®ÍòæĽ yæ0°Ã®Íò°Ã®ÍH Í ñÍG Í ÍùÃ1:…þÄÑ :‰þ,Èþ;Èþ ÄÑ ÉÅÍÍc*ÉÁÉÍÑ|·ÄÇ }ÉÍÝþÔÇ æÉÍçæ8OÉÍòæÃzæ8É͇O!B NÍ#NÍ ÍÃÍæþ¾SÍPÃÍ.* |ÍÕ}ÍÕ ÍÍÉ!9":·Êq!ÿÿ"<Âq<2* ×ÍžÂ@!~·Êƒ5 áÁÃvÍÛÍc*É|·ÄÑ EÍH Íùͺþ,Ê^Ã1Í Í¦ ÍÑë*Ò"Ò"ÐÃ1Í ÍÑåEÍH áDÍH Íùͺþ,ÊÃÃ1Í Í¦ : þ Â1ÍÑ: þ Âú"í > 2 Í yÁÉÍñþÊÉÍñþÊþÀ=É!z{w# Â%þ Âw!PÍ Â yÍ“ÉÍõÍ}ñöÀÉ*w#"ÉÍŒþ Ê@þ.Ê@Í<Ê!¦EÍ·Â~ÃP =Ê…VëÃqþ”*†ÃqͦÂ1þÒ&þ O:lµ·Ì…>ÿ2ly÷ÂÅ:‘·ÊÞ_!w~¸ÚÞ!‘s!m~ÍôÁùÁyþ Â!‘~·Êü=w_!m~þ ÊÿÍ…¯¼Ã=COPYRIGHT (C) 1980, DIGITAL RESEARCH DDT VERS 2.2$1ÅÅ0 ÍÁ!~=�WÕ!x±Êe ~#ÃXÑÁåbx±Ê‡ {æÂzã~#ão}oÒƒĽ yæ0°ÃG ÍÝÃG ÍÑÃt õÅ:…þÂ):‰þ,Ê.>CÍÁñÉÍ :…þÂ|:‰þ ÂJÍüþ;ÂrÍ Í:…þÂR:‰þ ʼþÊ‹þ!ʼÃRþ!ʼþÊ‹>SÍÊ@* Í¡Í. ÍÍÍ;Í£W!E¾Êý# ¡ ¾Êé# ¬¾ÊÎ# ·æÀþ@Ê´þ€Ê¥zæÇÖÊ–=Ê�=Ê|zæÀÊJzæÊ?ÖÊ4ÖÊ)ÖÊzæ zæ:…þÂ|:‰þ Â|ËÃÑÍã ÃÑÍ Ê|*ÒåÍÑ"ÒÍ Í© !6=á"ÒÃ1Í ÍÑ: þ Â1}Ú1Í:…þÂn:‰þ>BÌÊ‹ÃSþÂSͦÂSþÂSxþ!ÎÍ·Â’ÍPÍŒÃQ!æͷªÍPÍ}ÍQxÃQ!êÍ·ÂÆÍÛÍ“G@ÍÛ±°ÃQ! Í·ÂÜ yÍ“G€Ã¾!Í·Âô ÍÛÍ“±ÃQ!Í·ÂÍÃͰ>ÿ2lÃyþÊþÂPÍÍLÃnÍRæ>UÌÍX:l·Ì…¯2l͓̈́ÃiÑ.éÍ2_É!fp+q*eëÍ2_ÉÍ2_É!hp+q*gëÍÉ!jp+q*iëÍÉ!lp+q*këÍÉ!np+q*mëÍ2_É!pp+q*oë O=!9 ÍóÍþŸ!6ÍóÃq!2ÍóÍÍÕÃqCÍÍ ÃÙJÍÍ ÃÙRÍÍ Ãq!zæÊ zæ=ÊnþÚaÖ‡‡O ÍóÍ$ÃqÍóÍ$,ÍÃÙ!Í Íf Í åÍ. ÍÅ á~åÍ ÍŠͶ ÍÝ áþ Ê» þ.ÊþåÍ“ =« Íf |·Â« }áw#Ä ¯ÃÅ >ÿ2LÍ� !ÊÞ =« Íf }´Ê« +"MÍD Ã…ÍÝ þ Âõ ÍD Ãþ !³ ¾Ê # DMÑáóÊ¡Ú�"¹æ=Ê¡Ͳ=Ê¡YPͲ1¯ÑÁñáù*¹å*·ûÉõÅ!O~4·ÊÍ#~#F#»ÂÍxºÂÍ~#s#r#w>ÿÁñÉÍ� þ« Íf åÍf ÑåÍ Í. ÍŠᯕo>œgÍ.Ã)*·ëÍÄÂ)þÃ)ÑÕÃ)ÍÙÁÅ>Ã+ÑÕÑÕ><7áÉÿÃÇÂÿÍÇÄÿÉÇÇÿéÇÇÆÏç"ÇÀ÷ÓÍ9Í.ÍþÂYÉÃÛÉ�ͯ É* MÍ^žáÍý2¶áÅUâêÃÏ Ã¶ ÃÝ ÃÇ Ã Ã- Ã� Ãf à Éã"JãÃ*"¨!¢"!"¯2O!" "]"‡"¹!1·å!å++"·åå"M>Ã28!†"9:]þ Êþ!åí 1¯ÉÖ!¾ _^ÿ!»ÉÍ ^#VëÉ~ÍÇ xþÒ+ Íó Íö Éõ>=ÍÇ ñÂ= !´~Í ÉÍ Í. É!³ Í ÅåÍ áÁ#xþ Òf þÚL ÍÅ ÃL ÍÅ Í…õÕÅÍ“ Ò† *¹" !6ÿóÍ;,ÍÃô!Ù!ÍóÍ;Ãqzæ8O!î ÍóÃÅ!êÍóÍ;,Ízæ;Ãqy‡‡O!Î ÍóÍ£õÍ£Wñ_Í•Ãqy‡‡O!¦ Íóͣ͒Ãqy‡‡ Âû ë ÍÝ þ « ÅÍ Í ÍŠͶ Í� ·Êþ=« Íf ÁxþÒY |·Â« }þÒ« Íã gA>þÍS ¤Ag}ÍS ´ÃþÈÃS Âi |·Â« }!´wÃþåÍ Ñs#rÃþåÕÅ:[æÊ”  Ãþ¯2|2\ÍÝ  !]w# Ê« ÍÝ þ.Ê& þ  Ê0 6 #Ã& þ.ÂK !eÍÝ þ ÊK w# Ê« Ã: ÊU 6 #ÃK 6ÃþÍAÍWÚþ w#Ã] !e~æþHÀ#~æþEÀ#~æþXÍ :áæ2á:âæ2â¢ÍêØͳØÍã:_þÿ³¥ͯ !ø6! �@!’!BH @@A‚BH B! "ˆBHI$$’BI$BI „$„’ ’HI Í“ Ú !€"Í >-ÍÇ Í¶ ÍÝ þ ÊþÖAÚ« þÒ« _!7^#Vëé~« « Æ« \pÚ « « —Z « « « « œ z à ¿ « « ç « « åÕů2[\Í¢ÁÑáÉÍ“Íï +"_*¹~Í #ÍE Ú¯ õÍÅ ñ³Ê« ^#VëÍ. ï ~Í ÁÑñÉCZMEIABDHSPöôüúþ!"MÉó"·á+"¹õ!9ñ1·åõÅÕ*¹~þÿõå!O~6·Ê=G#^#V#~O!b ÍóÃq!vÍózÍ’ÃqÍ.?Í*ù!9"Í8"͉ÍZ*" Ã+*ùÉ'/7?vÉãéëóùûÆÎÓÖÛÞæîöþ"*2:ÃÍEI SPHLDI XCHGPCHLXTHLRE_!€~þʦ ![4·Ã§ \Í¢·Â¦ 2[à 7ÁÑáÉÍ >?ÍÇ Ãþ eÍ¢!g"cÉ> åÕÅ_Í¢ÁÑáÉþÈþaØæ_Éå!f~·> Êô 5*c~#"cÍÔ áÉþ Ò Æ0ÃÇ Éë*‡}“|šëÉÍ� Ð"‡Éå!Í� áÉÍ� !ʬ =« Íf åÍkþÿÊ« Íj Êá áå\Í¢á·ÂF €€w# ÂÓ Í‹ ÃÀ Ít þÊ« Þ:Âá WáåÍ& _Í& õÍ& ÁO {‚D$��„‘H��„„D$$ H „ B’!$D$ˆ"$’B$�’DA!AB�’I$„�’H B$�’I $’H’I$‘�H$‰! $’I  Ò« Í� =« Íf " Í ÃþÍ“ Ò« Í� Ê»Íf " =Ê»Íf "=« ¯Ã½> 2ÍÃþÍ� ÊåÍf ÚÕ"]æ=ÊåÍf =« Ãð*]}æðo¿"_Í Í Âþ*]"xÃó áñÊ(#"¹ë!¨N#FÍWÚ(ÍÈ *Jë>‚·7Ã…û*M|µÊN+"MÍ ÂN:L·ÂHÍ…Ã…ÍD Ã…ÍÈ >*ÍÇ *¹Í“ Òb" Í. *·"]Ãþ !/~ #¾#Ê�ÂtT 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 ANÆ7ÃÇ õæÍö ñæÃö > ÍÇ > ÃÇ ÅÕå Í¢æáÑÁÉë|Í }à þÒ@ þ ÒÇ >.ÃÇ ë*_}“o|šëÉþ Èþ,Èþ ÉÖ0þ ØÆùþØÃ« ë^#V#ëÉë!ÍY ))))µoÍÝ ÍP ·Â `i"¹ÃF Í& Í& w# Í& õÍ‹ ñ« Ãá ÅåÕÍt ÍY æðõÍt ÍY Á°GÑ‚WxáÁÉ Í¢!o ~·ÊZ ÍÇ #ÃN Í *‡Í. ÍÅ *¹Í. Ãþ NEXT PCÍ� =«$’I$„$�’’A !Aªªªªªª @’$’I$‰"!$’H$I$’I ’"! $�‘A$ˆ€’ � H„H��„AA"I @BB‘ „$�„’A"aÍ. ÍÅ ~Í #ÍE Ú}æÂ"]*aëÍÅ Í6 *]}“Â#|’Â#*]ÍE ÚþÃóÍ� þ« Íf åÍf åÍf ÑÁÉ{‘z˜ÉÍA|·Â« ÍWÚþ}ÃdÍ Í� Íf åÍf åÍfZÉ*¹F#åÍn!Is!œ^#Vëé¸à¸à¾ò&&##&ÍÎÂ)ÍÙÃ):¨»À:©ºÉÁá^#V#åÅÃÄ*µ^#VÉÍÎÊíÁÅ>Ã+ÑÕÃ)xþÿÂü¯Ã-æ8_A 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 ??= M!EÂq ëÉs#r#å!V4áÉÍÝ !V6#þ ÊÕ þ,® >€2Vñ Ím Í… þ ÊÕ ÍÝ Ím Í… þ ÊÕ ÍÝ Ím Í… þ « Vþ�Ê« ·Éå!à XN!³~ëáÉÍã Êþ Ãö æ $�$$I$’’$H!!! ‰’BH" !I B  �ˆˆ$$���!BD!€ $!�’BI D@‰"€!$�I$$H‰�"!�ˆ‚I‰* +"8 Í.!2 †þÊž¨ÍRÍ€Ã* "4 4 = Í�ÒÂÍý* #" ç¹ÍR*6 DMÍ+ÈÍR*8 DMÍ+×ÍR*: DMÍ+æÍR*< MÍÍàÉ!?  DMÍ+Í;É! p+q* ëÍi2 É! p+q* ëÍi2 É! p+q* ëÍi2 ÉÍi2 É!" p+q*! ëÍfÉ!$ p+q*# ëÍiÉ!& p+q*% ëÍiÉ!5536: 128 Byte Record CapacityKilobyte Drive Capacity32 Byte Directory EntriesChecked Directory EntriesRecords/ ExtentR ADDRESS $BYTES READ:$INVALID HEX DIGIT$CHECK SUM ERROR $FIRST ADDRESS $LAST ADDRESS $BYTES READ $RECORDS WRITTEN $HEXCANNOå‰$I$„’I$�ˆUUU$’�$A$�� q=  Í�ÒKÍdÿ*= ë! ͸Òp!@ 6>!@ ¾ÚX*= }O!< å*@ &€ Ñw*= #"= !@ 4Â)!< 4\ÍïþÊmaÍdÃ* }O!< :? wÉ( p+q*' ëÍi2 É!* p+q*) ëÍfÉ!/ s+p+q+ÑÁp+qÕ:/ =2/ þÿÊX*+ å*- Á w*+ #"+ *- #"- Ã1É* #" ÿÍ–Úr*   ~É!" ÿ! ͸ecords/ BlockSectors/ TrackReserved Tracks is Temp R/O Disk: d:=R/OSet Indicator: d:filename.typ $R/O $R/W $SYS $DIRDisk ST OPEN SOURCE$COMNO MORE DIRECTORY SPACE$CANNOT CLOSE FILE$*çùÉ!9"ç!e ù!" !" \Å!éÍ"÷ÅòÍ"éÍŠ: þÿƒûåålÍR*4 DMÍ+{ÍR* DMÍ+ŠÍRÍæ 4 Í�Òß*4 }æþ¿Íæ= 4 Í�< NÍ*4 #"4  ÍÐÃ¥ÍàÍ;ÉÍà*4 DMÍ+:ÍÐ ÍÐÉÍY2ÚÚ×€* " ÒxÃÚéÍß20 þº€Å*   DM€Í"Ã×:0 þÊÈAÍd*   6!ÿ" Ç!" : É!"6 "8 ": }2< !"4 "= ! tatus : DSK: d:DSK:User Status : USR:Iobyte Assign: =Bad DelimiterInvalid AssignmentBad Delimiter: Bytes Remaining On ÍdÅeÍ"\ÍÏ\Íÿ\ÍŠ: þÿ²ÍdÃÉÍä\Í�: þÿÂÉ)ÍdÍàÍ;É! q* &ëÍfÉ ÍÐ ÍÐÉ! q> ! ¾Ò: ÆAÖ OÃ3 Copyright (c) 1979, Digital Research????????????CON:RDR:PUN:LST:DEV:VAL:USR:DSK:TTY:CRT:BAT:UC1:TTY:PTR:UR1:UR2:TTY:PTPåA Ö0O> ¹Ú:A Ö0É:A ÖAO>¹Ò&–ÍRÍ€:A ÖAÆ ÉÍü‡‡‡‡õÍüÁH±ÉÍ.2B !2 †w:B É!D s+q*C &Í�:D ÍÉÃÃÃÍÉÉÉë_ë…oŒgÉ_6ÍYþ:Ê Ã!2 6Í=21 þ á:1 : Írë+s#rÍ=õÍ=_ÁHÍL"4 " >6 ͪµÂS* "6 Í=23 :1 =21 þÿÊvÍ=OÍý* #" ÃY8  Í�ÒR/, Space: Invalid File Indicator** Too Many Files **File Not Found Size Recs Bytes Ext Acc65536 set to R/O InvalidÍÐÃ: Æ0OÍÐÉ! q: æøOÍë: æOÍëÉ! p+q* |OÍ* }OÍÉ! p+q* ë ÍfÉ! p+qÍà* DMÍBÉ! p+q)ÍR* DMÍB1ÍB*:UP1:UP2:TTY:CRT:LPT:UL1:R/OR/WSYSDIRR/O R/W SYS DIR ** Aborted **Active User :Active Files: Drive Characteristics6Ã@ COPYRIGHT (C) 1978, DIGITAL RESEARCH ERROR: $, LOAD ADDRESS $DISK READ$INVERTED LOAD ADDRESS$DISK WRITE$LOAD ADDRESS $ERROR{µoz´gÉ^#Vë) Â�É_{•ozœgÉi`N#F‘o˜gÉo&•oœgÉ_{–_z#žWëÉ  Disk AssignmentWrong CP/M Version (Requires 2.0)!9"2!TùÍíþ ÒOÍÒË!]6:\ÖÖŸõ:]Ö ÖŸÁH¡ÒrÍ3 Ë:\þÊ€ÍË4Â- >É!ª6Í99Í 2§þ¨ :ªÖÆÿŸÉ!ª4:§þ :2©!¨6+6>!§¾Ú :§‡‡O!9 DMÍi ­ͱ:©æ‡‡!¨†O!Y DMÍi :¨Æ2¨væO!w 6Í,Ã]!v6>!v¾ÚÂ*v&w ~Ò»*vM Í!v4˜ÉãÍÒÍ8ÆAOÍ�:Í�èͱ*##N!ͽ"—* N#F*—ëÍ "™)6> !Æ)¾Ú.*Æ)&ë*º)å*Æ)&ë*¼)Á w:Æ)<2Æ)Â*¾)º) >w#6*¾)º) w#6*¾)º!) w#6*¾)º%) w#6*¾)º) N#F*¾)ź) Áq#p*¾)º%)!b–Ÿ/õ~Ö,ÖŸÁH±õ~Ö:ÖŸÁH±õ~Ö*ÖŸÁH±õ~Ö.ÖŸÁH±õ~Ö>ÖŸÁH±õ~Ö<ÖŸÁH±õ~Ö=ÖŸÁH±Òß*]&€ 6Ãã!]4ÃT!]4É!cq*a&Y :cw!a4Í ÉÍQ" Í8ÆAOÍ�jͱÉÍ·DMÍ� ÉmÍÒÍ Í ÉÍZ"³Íl"µ!·6>³ÍêµÊ¥ *³}Ò† *·MÍÌÍ �ͱ*µ}Òx OÍ�Ã} WÍ�„͇ /Ò‹ͺ *2ùÉ!"q*"&ëÍLÉ Í� Í�É Í�É!$p+q*#~þÊÑ*#NÍ�*##"#÷É!&p+qÍ *%DMͱÉ ÍOÉ ÍOÉ!(q*(&ë:©æþ2©Í !§4 ÃF :§þ® ²ÍÒÈÍÒúÍÒÍÒ)ÍÒ!§6>!§¾Ú« Í :§‡‡O!9 DMÍi 8ͱ!¨6> !¨¾Ú¤ Ã… :¨Æ2¨Ò>ÍÓµÖŸ!—õÍøµÆÿŸÁH¡Ò% ÿÍÒÃ- *™DMÍÀ ͱÍ·DMÍÀ  ͱ* N#FÍÀ 9ͱ * ^#Vë))DMÍÀ Tͱ* ~ÿÍõÒÒ!Ç)6!Æ)6>!Æ)¾Ú=Ãñ:Ç)!Æ)†wÒ×Ã=*Æ)&ë*º)~2È):É!gr+s+p+q!h6>fÍêµÊr*dë*fÍ!is*dëÍ�"dPY! Íë"f>ÍÓµÆÿŸ!h¦#õ~“ÖŸÁH¡ÒaÍ«Ão!h6:iÆ0OÍ�ÃÉ!mr+s+p+q*lͱÍ !³ÍÃë+s#r!µÍÃë+s#r#4ÃD Í É:\þʹ :\=OÍÌÉͳÍ© !6!Ì)6ÿÍlÒä :Ì)þÂÚ É:Ì)=2Ì)Ãð :]þ Âð Í& É!"¸}2\!h6?!ÍLÉ!*p+q*)ëÍO2'É!,p+q*+ëÍO2'ÉÍO2'ÉÍOÉ!.p+q*-ëÍLÉÍRÉÍRÉÍLÉÍRÉ\ÍLÉk ä  Í�:§‡‡‡‡!¨†O!Y DMÍi Ãw !§4ÂC ÃF :§þ¿ Í>ÉÃF :§þÂÍ ÍÝ ÃF :§=2§‡‡‡‡2¨Í9:Yþ=Êï ;ÍÒ>ÉÍ9*¨&Y DMÍDMÍÀ oͱ*—DMÍÀ ͱ*N#FÍÀ Žͱ * N#FÍÀ �ͱÍ É!œp+qÍ *›DM'Í:Í�Í«ÉÍZ"�!Ÿ6>�ÍêµÊ *�}Ò *ŸMÇ)þÂ*Æ)& ë*º):È)¶2È):È)þÊ:*¾)º!) å*¾)º) ëÁÍsÃãÍ,à >¸ÍêµÂXºÍÒÃ\:Ì)þÿ“>!¸ÍõÒd!"À)>!À)ÍõÒd!"TåÍZëás#r*lëÍâÚ¶*lëÍâë+s#r*jN#F+q#pÃŒÉ!nq!"o"q}2uo&"s* ësÍÝÚ:nÒñ*sDMÍÛ2u:uÚqoÍsj6?\Í:'þÿÊC:'懇‡‡‡Æ€o&"º)!Ë)6!"¾):Ë)/¸¾)õÍÝŸÁH¡Ò˜Í]!Æ)6> !Æ)¾ÚŽ*Æ)&ë*º)å*Æ)&ë*¼)Á ¾Êy!Æ)6 Ä:Æ)Ö ÖÍR"Éÿ ÍOÉ!/q*/&ë ÍLÉ!1p+q*0ë#ÍLÉÍ~*##N!ͽ€Íž"TÉ!Vq*VMÍöͳÉ!Xp+q!WÍÃë* >WåÍr#MáͲÉ!_ =2¨þÿ IÍÒ>É!©6ü:§=2§þÿÊ8 :©2©:¨‡‡2¨Ã :©!¦!¨¶2Í9:Yþ ÂT >É:Yþ,Êe \ÍÒ>ÉÃŒ É!¬p+q*«~þ:ʉ *«NÍ�*ÍÌÍÃ!�ÍÃë+s#r#4Ãè É!¢s+p+q!¤6!¦66:¢!¦¾Ú„ !¥6!£6>!£¾Úr *¤&ë* å*£&Y ѾÊi !¥6!¤4+4ÂA :¥Ò} :¦É!¦À)!"Ä)*¸++ë!Ä)ÍøÚa*Ä)¼) ^#Vë"¾)Í]*¼)"º)*Ä)º) ^#Vë"¾)Í]!Æ)6> !Æ)¾ÚT*Æ)&ë*º)~2É)å*Æ)&ë*¼)~2Ê)OѹÒ;*Ä)º) ^#Vë"*s"sÒÎ*oɹÍÒÉÇÍÒÍŠO ÍÕÍÒ!v6>!v¾ÚQ*v&w 6`i+4Â6Ï)ÍA*Í:'þÿÊ“:'懇‡‡‡O!Ï) ~2vþåÊ�:Ÿ2Ë):Æ)<2Æ)ÂM*¾)#"¾)Ã/:Ë)Ò©*¾)+"¾)Ã`*¸"¾)#"¸Í]!¸ÍøŸ*¼)ë!õÍøŸ/ÁH±Òí¥ÍÒ!"¾)!"¸Í]*¾)º) å*¾)ëás#r!Æp+q!`6>!`¾Ú6*`&ë*^å*`&Y ѾÊ/>É!`4 >É*]&€ ~þ ÂO!]4Ã9!a6:aþÒæ*]&€ ~2bO>¹Òz*bMÍëà Íë>«#"«Ão :Í�É!®p+q!'"±!°6>±ÍêµÊü *­ë*±Í{2¯*­ëÍ�"­PY! Íë"±>ÍÓµÖŸ!°¶+õ~“ÆÿŸÁH±Òù !°6:¯Æ0OÍ�à kÍ� Â)*Ä)¼) å*Ä)º) ãN#Fáq#p*Ä)¼) å*Â)ëás#r*À)#"À)!Æ)6 ÃJ:Ê)!É)¾ÒJ!Æ)6 :Æ)<2Æ)ÂÆ*Ä)"Ä)ÒˆÃq:ÒtÉÍÒÃwÍ Ðͱ!åå ON Í, THEN TYPE RETURNPERMANENT ERROR, TYPE RETURN TO IGNOREFUNCTION COMPLETEINVALID DRIVE NAME (USE A, B, C, OR D)NO SOURC-Â:YÖSÖŸõ:ZÖ ÖŸÁH¡Ò§!6>þÉ©Í 2Ì)þ½ŽÍÒ>É!Í)6> !Í)¾Ú*Í)&ë*¼)>¦2Î)þ Ê÷:Í)þ Âð.Í�*Î)MÍ�:Í)<2Í)ÂÅ:)!¨4¾Êf!¨^!*FNÅÍ·Áy�Íjë*ªDMÍ¿¯2¬:¬þ ÚK!ÍšÍuþ ÂcÍŠÃ<2¬:©·Ê\ÍÏÃ_ÍÇ·ÊÃ/:)Íjë*ª"ªÃìÉ1Í!uÍš"À)¸À)ÍÝÒ�*À)º) ^#Vë"¾)Í]Í .å*¼)DM\á -°!\6:Òé\Í£:þÊÛæͱÃæ*}DM'ÍÍ«*¾)º%) N#F'ÍÍ«*¾)ååE FILE ON DISKSOURCE FILE INCOMPLETE¯Íá!?Ã]ÉÍ9Í9:Yþ=Â/Í9õÍþÒ&Í© ÍcÃ,ùÍÒÃHÍ© 9Í þÂEÍÃÃHͺ ÉÃÃÃÍÉÉÉi`N#F�oˆgÉë_ë…oŒgÉë_ë¥o¤gÉD:]þ ÊÖ\ÍÜ<œ!xÍ•Ãc¯2|Å\Í×Á·ÂÍ ¢! åDMÍ¿\Í×á·Â€õ!�Í•Ãc!„Í•Íuþ ÊÖAþÚñÍnÃÖÆA2´ÖAͦÍŠ!ªº!) N#F'ÍkÍ�Í«*¾)º) N#FèÍÍ«RÍ�/Í� *¼) ~ÒIOÍ�ÃNWÍ�Í«Í8ÆAOÍ�:Í� *¼) ~2È)Òt(Í�ÍÀ:È)Òƒ)åå!9"1WÍÁþÿÂóÍœÃQ>€2!åÍ¢áÚQG}æÂDÍrÍYÚQ|Í�}Í�#> ÍexÍ�Ã#Ír*ùÉåÕÅ ÍÁÑáÉåÕÅ_ÍÁÑáÉ> Íe> ÍeÉæþM!>õ)ë—)ë�‘o|˜gÒ˜ ñ=†ÉDM!>)ë)ëÒ­ =Â¥É~ ³É^#Vë) ½É^#Vë|·g}o ÂÇÉ_{•ozœgÉi`N#F‘o˜gÉo&•oœgÉ_{–_z#žWëÍšÍuþ ÂcÍŠ¯2©Íá!?Íš!ÈÍ•Íuþ ÊcÖAþÚ7ÍnÃÆA2ÖAͦ!õÍ•Íuþ ÂcÍŠ!©6ÍáÃÐÍšÃ>ͦÍŠÃ!QÍ•ÉSYSGEN VER Í�*À)#"À)ÃÍ& Ã\!"À)¸À)ÍÝÒ\ÍäÒ°ÍÉ*À)"¾)Í]Í ÍÀ*Ì)M! ^#Vëé *¼) >€¶*¼) wà *¼) >¦*¼) wà *¼) >€¶*¼)ÃxCOPYRIGHT (C) 1978, DIGITAL RESEARCH  o&)))))))ÉÍþaØþ{Ðå Ò‰Æ0ËÆ7ÍeÉõÍ}ñÍ}É ÍÉ:þ€Â³Íηʳ7É_<2!€~·É¯2|\ÍÉåÕÅ\ÍÁÑáÉFILE DUMP VERSION 1.4$ NO INPUT FIÉ2.0SOURCE DRIVE NAME (OR RETURN TO SKIP)SOURCE ON , THEN TYPE RETURNDESTINATION DRIVE NAME (OR RETURN TO REBOOT)DESTINATION wà *¼) >¦*¼) wÃÏáó.å*¼)DM\á -Â+!\6Íuìͱ:Ì)‡‡O!™ DMͱ*À)#"À)ÙÉ*¾)))))Ï)"¼)É:mþ Âw>É.Yn æ_É_ÍÉ> ̓> ̓ÉåÍŠá~·Èå̓á#ÚO*é*é*é*!é*$é*'éÃÃ! "ª>ÿ2§!§4:(¾ÊwNͯ>ÿ2¨ LE PRESENT ON DISK$ê!õÅÕåYÍáÑÁñÉþ Èþ Èþ,Èþ ÈþÊ<É Í ÍÉÍ þ Ê*Í$ÊA!‹6 # ÂT!‹wÍ Í$Êr# Ê*Ã`:‹þ ÉÖ0þ ØÆùþ*ÔÛ4æ >Ê�¯Æˆ_:Öö€WÛ1·zŸæ¿Ó4¯{2ÚÉÍìÍõÍÖñþ É!PÍì:âÓ4:CÓ:ãÓ1 ÍûÍv> ÍÝ> åÕÅ_ÍÁÑáÉ~·ÈÍÝ#Ãì CCS SYST ***WARNING: POSSIBLE LOST DATA*** !É!±ÍìÃÌ DISK I/O ERROR ON <: G¯2×7ÂÑö 2ÖGÓ4> 2ÚÓ0Û4ÒåÛ02ÛÛ3!"ØÛÐ!"1móÛæ> Â>0GÛæ@°GÛ4æ°2HÛ12I! Í{!DÍ¥æ_2ÖAÚ*þÒ*2@!ÝÍ¥Ö0ÚBþÒB2!mÍ¥æ_ÖDÊhÖÂU<2A!¢Í{ÍÔÚk2BÍx!ŽååØÃ*ÍAÊ*!‹ ~þ ʰÍxkb))))_ëyþ‘BK{ÉÍ…Â*É!6Ã6Ã!"Éæ8Éæ0Éë*‹ë{¾Âç#z¾È+++ ÂÝ ÉÕ‹¾Â#ÂõEM GENERATION PROGRAM VERSION 1.0 COPYRIGHT 1980 CALIFORNIA COMPUTER SYSTEMS INSUFFICIENT MEMORY SPACE - NEED 24K SOURCØ>°2ÖÓ4>ÐÓ>=ÂÛ0·ð!"ͧÈý DRIVE NOT READY (TYPE CR WHEN READY). :Ù±Ó02ÚÛ4ÒTÛ02ÛÉ ÅÍö„Ó0Û3w#Û3w#Û3w#Û3w#ÂkÍÍ¥Ö0Ú}þÒ}2C!XÍ¥æ_2GþYµ!.Í{ÍÔÚ 2KÍx:G þY!QÊÒ 0þNÂ�>M2K:A=xÊÝö@2gGÅÍhÁy2=Íë^#V#ë">ë^#V:C<#=Â1€óÛæ> Â>0GÛæ °GÛ4æ°2âÛ12ã!#"¦!öÍì!yͧÊÒ2Å2ªæ_GÖAÚ1þÒ1ÍÊ:ÖÞ:Ú·! ͧ½ÍÖ!"Ò! "ÔÍ`·Â¨"Ô:Ó!ååE DRIVE: DESTINATION DRIVE: SOURCE ON , THEN TYPE RETURNDESTINATION TæœÁÈ Âb>É ÅÍö¶Æ 2ÚÓ0~Ó3#~Ó3#~Ó3#~Ó3#Â�ÍTæüÁÊÁ Â�>É ÅÍnÓ0Û3®³_#Û3®³_#Û3®³_#Û3®³_#ÂËÍTæœÁ³È ÂÃ>É:ÖO:×¹ÊSý~<Êâëwõÿ:Kw:B<Ê,¾Òâ=Ê,Ó3:=öÍëÛ12%>ÐÓ¯2Lå#mÍ>20å#Í:%:L:0:CÍ:C<å!@)=ÂnDMá~ x±Âv#ؾÚÅ:Ò<þÚžþÒÌG:ÖæÂÌx2Ò:ßëG!É:Öæ´!Í#ò´:Öæ@ÊÂ+~¯<2ÓÃr*Ô"¦!Šͧʽ2Å2ªæ_GÖAÚÒþÒÒÍÊ!¾Íì!¦ͧ½åååyÓ4Û0æ€À!Üyö€Ó4>Ä2ÚÓ0Û3w#Û3w#ÂÍTæüÊ<yæ@À>@±O2ÖÃ:ÜÓ1·y2×ÂSÅXÍKÁÃÓ4:ÓÓ2Û1O:Ò¹ÊnÓ3ÍKæ˜À!Û1·Êz:ß)=òzEÍ:0<á¾ÂC+:>“O:?šG~ x±Â™Íá:G:L�ʺ>�Ó>Ã4:B<Â*:=öXÍë:%<¾Â,¯2C2B<2A:Gõ!ÿÍ{ÃUÓ0Û4ÒíÛ02;æ˜È!õÃVÍÖ!"Ò! "ÔÍ�·Â¨"Ô:Ó!ؾÚb:Ò<þÚ;þÒiG:ÖæÂix2Ò:ßëG!É:ÖæÂQ!Í#òQ:Öæ@Ê_+~¯<2ÓÃ*¦ë*Ô}“|šòÌ!€ÍìÃÌååå Í  ÂÉF#~# É:gö€GÛ3Íh*>“ù DM!91mÑ>ôÓ0{Ó3 zÑÓ3Â4Â4ùÛ4ÒEÛ02;ædÈ!ùÿí°!ýÍÃ:@O ¯7 Âo°Ó4É!D~§ÈÍ– 579, PACIFIC GROVE ; CALIFORNIA, 93950 ; ORG 100H BDOS EQU 0005H ;DOS ENTRY POINT CONS EQU 1 ;READ CONSOLE TYPEF EQU 2 ;åJMP FINIS ;TO RETURN ; OPENOK: ;OPEN OPERATION OK, SET BUFFER INDEX TO END MVI A,80H STA IBP ;SET BUFFER POINTER TO 80H ;þ÷ÿÿûå÷ÿMPN öü2N õþ÷N õûå÷6N#ÿÿÿÿÿþ÷ÿÿûå÷ ÿ#NNNNNõþ÷N õûå÷NSEEKINIT BRC 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#Ã{õÍŽñæÆ�'Î@'åÕÅ_ÍÁÑáÉÍ{ÍÏõÍxñþ À:HÓ4:CÓ:IÓ12A ÍûÍvÃÍÏþ ʳþ*O>ÿÈyÖ0Øþ?Øþ ÚöÖþ Ø€GÅÍÏÁOþ TYPE FUNCTION PRINTF EQU 9 ;BUFFER PRINT ENTRY BRKF EQU 11 ;BREAK KEY FUNCTION (TRUE IF CHAR READY) OPENF EQU 15 ;FILE OPEN å HL CONTAINS NEXT ADDRESS TO PRINT LXI H,0 ;START WITH 0000 ; GLOOP: PUSH H ;SAVE LINE POSITION CALL GNB POP H ;RECALL ERROR: DRIVE ; SIDE €; TRACK €; SECTOR €; STATUS-€  LENGTH ; ; SET UP STACK LXI H,0 DAD SP ; ENTRY STACK POINTER IN HL FROM THE CCP SHLD OLDSP ; SET SP TO LOCAL STACK ARxÈGyÃå#~#Í…~§Èþ€Ê Í–#à CCS DISK FORMATTER PROGRAM V2.0 WHICH DRIVE (A-D)? IS IT A MINI (Y/N)? SINGLE OR DOUBLE DEREADF EQU 20 ;READ FUNCTION ; FCB EQU 5CH ;FILE CONTROL BLOCK ADDRESS BUFF EQU 80H ;INPUT DISK BUFFER ADDRESS ; ; NON GRAPHå 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åEA (RESTORED AT FINIS) LXI SP,STKTOP ; READ AND PRINT SUCCESSIVE BUFFERS CALL SETUP ;SET UP INPUT FILE CPI 255 ;255 IF FINSITY (S/D)? SECTOR SIZE (0-3)? TRACK NUMBER (0-4C OR *)? IS THE DISKETTE MOUNTED (Y/N)? SINGLE OR DOUBLE SIDED (0 OR 1)? BIC CHARACTERS CR EQU 0DH ;CARRIAGE RETURN LF EQU 0AH ;LINE FEED ; ; FILE CONTROL BLOCK DEFINITIONS FCBDN EQU FCB+0 ;DISK NA; FILE DUMP PROGRAM, READS AN INPUT FILE AND PRINTS IN HEX ; ; COPYRIGHT (C) 1975, 1976, 1977, 1978 ; DIGITAL RESEARCH ; BOX ;CHECK LOW 4 BITS JNZ NONUM ; PRINT LINE NUMBER CALL CRLF ; ; CHECK FOR BREAK KEY CALL BREAK ; ACCUM LSB = 1 IF CHARAåLE NOT PRESENT JNZ OPENOK ;SKIP IF OPEN IS OK ; ; FILE NOT THERE, GIVE ERROR MESSAGE AND RETURN LXI D,OPNMSG CALL ERR AD TRACK OR SECTOR SIZE/DENSITY SELECTION: NUMBER OF TRACKS (23, 28, OR 46)? ç¾ ÿÑßÿ é|ÿ�0�ÿMÿÿüÿME FCBFN EQU FCB+1 ;FILE NAME FCBFT EQU FCB+9 ;DISK FILE TYPE (3 CHARACTERS) FCBRL EQU FCB+12 ;FILE'S CURRENT REEL NUMBER FC CTER READY RRC ;INTO CARRY JC FINIS ;DON'T PRINT ANY MORE ; MOV A,H CALL PHEX MOV A,L CALL PHEX NONUM: INX H ;T,BUFF DAD D ; ABSOLUTE CHARACTER ADDRESS IS IN HL MOV A,M ; BYTE IS IN THE ACCUMULATOR ORA A ;RESET CARRY BIT RET ; ENDING WITH "$" MVI C,PRINTF ;PRINT BUFFER FUNCTION CALL BDOS RET ; ; GNB: ;GET NEXT BYTE LDA IBP CPI 80H JNZ G0 å 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 PC ; STACK AREA DS 64 ;RESERVE 32 LEVEL STACK STKTOP: ; END O NEXT LINE NUMBER MVI A,' ' CALL PCHAR MOV A,B CALL PHEX JMP GLOOP ; FINIS: ; END OF DUMP, RETURN TO CCP ; (NOTE SETUP: ;SET UP FILE ; OPEN THE FILE FOR INPUT XRA A ;ZERO TO ACCUM STA FCBCR ;CLEAR CURRENT RECORD ; LXI D,FCB MVI C, ; READ ANOTHER BUFFER ; ; CALL DISKR ORA A ;ZERO VALUE IF READ OK JZ G0 ;FOR ANOTHER BYTE ; END OF DATA, RETURN WITH CåHAR RET ; ; PNIB: ;PRINT NIBBLE IN REG A ANI 0FH ;LOW 4 BITS CPI 10 JNC P10 ; LESS THAN OR EQUAL TO 9 ADI '0' JMåTHAT A JMP TO 0000H REBOOTS) CALL CRLF LHLD OLDSP SPHL ; STACK POINTER CONTAINS CCP'S STACK LOCATION RET ;TO THE CCP OPENF CALL BDOS ; 255 IN ACCUM IF OPEN ERROR RET ; DISKR: ;READ DISK FILE RECORD PUSH H! PUSH D! PUSH B LXI D,FCB MARRY 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åP PRN ; ; GREATER OR EQUAL TO 10 P10: ADI 'A' - 10 PRN: CALL PCHAR RET ; PHEX: ;PRINT HEX CHAR IN REG A PUSH PSW RRCå; ; ; SUBROUTINES ; BREAK: ;CHECK BREAK KEY (ACTUALLY ANY KEY WILL DO) PUSH H! PUSH D! PUSH B; ENVIRONMENT SAVED MVI C,BVI C,READF CALL BDOS POP B! POP D! POP H RET ; ; FIXED MESSAGE AREA SIGNON: DB 'FILE DUMP VERSION 1.4$' OPNMSG: DB CR, INDEX TO DE INR A ;INDEX=INDEX+1 STA IBP ;BACK TO MEMORY ; POINTER IS INCREMENTED ; SAVE THE CURRENT FILE ADDRESS LXI Hå RRC RRC RRC CALL PNIB ;PRINT NIBBLE POP PSW CALL PNIB RET ; ERR: ;PRINT ERROR MESSAGE ; D,E ADDRESSES MESSAGE åRKF CALL BDOS POP B! POP D! POP H; ENVIRONMENT RESTORED RET ; PCHAR: ;PRINT A CHARACTER PUSH H! PUSH D! PUSH B; SAVED LF,'NO INPUT FILE PRESENT ON DISK$' ; VARIABLE AREA IBP: DS 2 ;INPUT BUFFER POINTER OLDSP: DS 2 ;ENTRY SP VALUE FROM CCP ; ; MDS-800 I/O Drivers for CP/M 2.2 ; (four drive single density version) ; ; Version 2.2 February, 1980 ; vers equ 22 ;versd/write ; setdma set subsequent dma address (initially 80h) ; ; (read and write assume previous calls to set up the io parameter in (result in reg-a) ; conout console character out (char in reg-c) ; list list out (char in reg-c) ; punch punch out (chequ 0f3h ;interrupt control port inte equ 0111$1110b ;enable rst 0(warm boot), rst 7 (monitor) ; ; mds monitor equates mon80of cpm system nsects equ cpml/128 ;number of sectors to load offset equ 2 ;number of disk tracks used by cp/m cdisk equ 0004hkdef 2,0 diskdef 3,0 ; endef occurs at end of assembly ; ; end of controller - independent code, the remaining subroutines ion 2.2 ; ; Copyright (c) 1980 ; Digital Research ; Box 579, Pacific Grove ; California, 93950 ; ; true equ 0ffffh ;valuters) ; read read track/sector to preset dma address ; write write track/sector from preset dma address ; ; jump vector for ar in reg-c) ; reader paper tape reader in (result to reg-a) ; home move to track 00 ; ; (the following calls set-up the io  equ 0f800h ;mds monitor rmon80 equ 0ff0fh ;restart mon80 (boot error) ci equ 0f803h ;console character to reg-a ri equ 0f806 ;address of last logged disk on warm start buff equ 0080h ;default buffer address retry equ 10 ;max retries on disk i/o befor ; are tailored to the particular operating environment, and must ; be altered for any system which differs from the intel mds.e of "true" false equ not true ;"false" test equ false ;true if test bios ; if test bias equ 03400h ;base of CCP in test sindiviual routines jmp boot wboote: jmp wboot jmp const jmp conin jmp conout jmp list jmp punch jmp reader jmp parameter block for the ; mds, which is used to perform subsequent reads and writes) ; seldsk select disk given by reg-c (0,1,h ;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 ee error ; ; perform following functions ; boot cold start ; wboot warm start (save i/o byte) ; (boot and wboot are the same ; ; the following code assumes the mds monitor exists at 0f800h ; and uses the i/o subroutines within the monitor ; ; we aystem endif if not test bias equ 0000h ;generate relocatable cp/m system endif ; patch equ 1600h ; org patch cpmb ehome jmp seldsk jmp settrk jmp setsec jmp setdma jmp read jmp write jmp listst ;list status jmp sectran ; mac2...) ; settrk set track address (0,...76) for subsequent read/write ; setsec set sector address (1,...,26) for subsequent reaqu 0f80fh ;list from c to list device csts equ 0f812h ;console status 00/ff to register a ; ; disk ports and commands base e for mds) ; const console status ; reg-a = 00 if no character ready ; reg-a = ff if character ready ; conin console characlso assume the mds system has four disk drives revrt equ 0fdh ;interrupt revert port intc equ 0fch ;interrupt mask port icon qu $-patch ;base of cpm console processor bdos equ 806h+cpmb ;basic dos (resident portion) cpml equ $-cpmb ;length (in bytes) lib diskdef ;load the disk definition library disks 4 ;four disks diskdef 0,1,26,6,1024,243,64,64,offset diskdef 1,0 dis qu 78h ;base of disk command io ports dstat equ base ;disk status (input) rtype equ base+1 ;result type (input) rbyte equ basmented 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 2tries push b wboot0: ;enter here on error retries lxi b,cpmb ;set dma address to start of disk system call setdma mvi cged disk number mov c,a ;send to ccp to log it in ei jmp cpmb ; ; error condition occurred, print message and retry booers mod 10+'0' db cr,lf,0 ; boot: ;print signon message and go to ccp ; (note: mds boot initialized iobyte at 0003h) lxi  mvi a,inte ;rst0 and rst7 bits on out intc xra a out icon ;interrupt control ; ; set default buffer address to 80h e+3 ;result byte (input) ; ilow equ base+1 ;iopb low address (output) ihigh equ base+2 ;iopb high address (output) ; readf 6 ;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,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 terr: pop b ;recall counts dcr c jz booter0 ; try again push b jmp wboot0 ; booter0: ; otherwise too many retries sp,buff+80h lxi h,signon call prmsg ;print message xra a ;clear accumulator sta cdisk ;set initially to disk a jmp goclxi b,buff call setdma ; ; reset monitor entry points mvi a,jmp sta 0 lxi h,wboote shld 1 ;jmp wboot at location 00 equ 4h ;read function writf equ 6h ;write function recal equ 3h ;recalibrate drive iordy equ 4h ;i/o finished mask cr equ 0d,a ;ready for call call settrk xra a ;clear sector number rd1: inr a ;to next sector mov c,a ;ready for call call setse ; ; read sectors, count nsects to zero pop b ;10-error count mvi b,nsects rdsec: ;read next sector push b ;save sector  lxi h,bootmsg call prmsg jmp rmon80 ;mds hardware monitor ; bootmsg: db '?boot',0 ; ; const: ;console status to regpm ;go to cp/m ; ; wboot:; loader on track 0, sector 1, which will be skipped for warm ; read cp/m from disk - assuming the sta 5 lxi h,bdos shld 6 ;jmp bdos at location 5 if not test sta 7*8 ;jmp to mon80 (may have been changed by ddt) lxih ;carriage return lf equ 0ah ;line feed ; signon: ;signon message: xxk cp/m vers y.y db cr,lf,lf if test db '32' ;32k c pop b ;recall sector count dcr b ;done? jnz rdsec ; ; done with the load, reset default buffer address gocpm: ;(entercount call read jnz booterr ;retry if errors occur lhld iod ;increment dma address lxi d,128 ;sector size dad d ;incre-a ; (exactly the same as mds call) jmp csts ; conin: ;console character to reg-a call ci ani 7fh ;remove parity bit re is a 128 byte cold start ; start. ; lxi sp,buff ;using dma - thus 80 thru ff available for stack ; mvi c,retry ;max re h,mon80 shld 7*8+1 endif ; leave iobyte set ; previously selected disk was b, send parameter to cpm lda cdisk ;last logexample bios endif if not test db '00' ;memory size filled by relocator endif db 'k CP/M vers ' db vers/10+'0','.',v here from cold start boot) ; enable rst0 and rst7 di mvi a,12h ;initialize command out revrt xra a out intc ;cleared ret ; conout: ;console character from c to console out jmp co ; list: ;list device out ; (exactly the same as mds call) suming disk/trk/sec/dma set) mvi c,readf ;set to read function call setfunc call waitio ;perform read function ret ;may 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 secbank ;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 ; 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 setd ;set to new command mov m,a ;replaced in iopb ; the mds-800 controller requires disk bank bit in sector byte ; mask the bit jmp lo ; listst: ;return list status xra a ret ;always not ready ; punch: ;punch device out ; (exactly the same as  have error set in reg-a ; ; write: ;disk write function mvi c,writf call setfunc ;set to write function call waitio tran: ;translate sector bc using table at de mvi b,0 ;double precision sector number in BC xchg ;translate table addresshigh address for iopb jnz iodr1 ;drive bank 1? out ilow ;low address to controller mov a,b out ihigh ;high address jmrive mvi a,00110000b ;selects drive 1 in bank setdrive: mov b,a ;save the function lxi h,iof ;io function mov a,m ani from the current i/o function ani 00100000b ;mask the disk select bit lxi h,ios ;address the sector select byte ora m ;mds call) jmp po ; reader: ;reader character in to reg-a ; (exactly the same as mds call) jmp ri ; home: ;move to home ret ;may have error set ; ; ; utility subroutines prmsg: ;print message at h,l to 0 mov a,m ora a ;zero? rz ; more t to HL dad b ;translate(sector) address mov a,m ;translated sector number to A sta ios mov l,a ;return sector number in p wait0 ;to wait for complete ; iodr1: ;drive bank 1 out ilow+10h ;88 for drive bank 10 mov a,b out ihigh+10h ; wait0 11001111b ;mask out disk number ora b ;mask in new disk number mov m,a ;save it in iopb mov l,c mvi h,0 ;HL=disk numberselect proper disk bank mov m,a ;set disk select bit on/off ret ; waitio: mvi c,retry ;max retries before perm error rposition ; treat as track 00 seek mvi c,0 jmp settrk ; seldsk: ;select disk given by register c lxi h,0000h ;return 000o print push h mov c,a call conout pop h inx h jmp prmsg ; setfunc: ; set function for next i/o (command in reg-cL ret ; setdma: ;set dma address given by regs b,c mov l,c mov h,b shld iod ret ; read: ;read next disk record (as: call instat ;wait for completion ani iordy ;ready? jz wait0 ; ; check io completion ok call intype ;must be io comp dad h ;*2 dad h ;*4 dad h ;*8 dad h ;*16 lxi d,dpbase dad d ;HL=disk header table address ret ; ; settrk: ;setewait: ; start the i/o function and wait for completion call intype ;in rtype call inbyte ;clears the controller ; lda d0 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 drive 2,3 ) lxi h,iof ;io function address mov a,m ;get it to accumulator for masking ani 11111000b ;remove previous command ora c lete (00) unlinked ; 00 unlinked i/o complete, 01 linked i/o complete (not used) ; 10 disk status changed 11 (not uselda dbank ora a jnz inbyt1 in rbyte ret inbyt1: in rbyte+10h ret ; instat: lda dbank ora a jnz insta1 in dstat a permanent error message if it is not ; recoverable. in any case, the not ready condition is ; treated as a separate condirt sector count ; ; jump vector for individual subroutines jmp boot ;cold start wboote: jmp wboot ;warm start jmp constmds controller has returned a bit in each position ; of the accumulator, corresponding to the conditions: ; 0 - deleted data (; Skeletal CBIOS for first level of CP/M 2.0 alteration ; msize equ 20 ;cp/m version memory size in kilobytes ; ; "bias" is d) cpi 10b ;ready status change? jz wready ; ; must be 00 in the accumulator ora a jnz werror ;some other condition,t ret insta1: in dstat+10h ret ; ; ; ; data areas (must be in ram) dbank: db 0 ;disk bank 00 if drive 0,1 ; 10 tion for later improvement trycount: ; register c contains retry count, decrement 'til zero dcr c jnz rewait ;for another  ;console status jmp conin ;console character in jmp conout ;console character out jmp list ;list character out jmp accepted as ok above) ; 1 - crc error ; 2 - seek error ; 3 - address error (hardware malfunction) ; 4 - data over/under flowaddress offset from 3400H for memory systems ; than 16K (referred to as "b" throughout the text). ; bias equ (msize-20)*1024  retry ; ; check i/o error bits call inbyte ral jc wready ;unit not ready rar ani 11111110b ;any other errors? (deif drive 2,3 iopb: ;io parameter block db 80h ;normal i/o operation iof: db readf ;io function, initial read ion: db 1 ;numtry ; ; cannot recover from error mvi a,1 ;error code ret ; ; intype, inbyte, instat read drive bank 00 or 10 intype: lpunch ;punch character out jmp reader ;reader character out jmp home ;move head to home position jmp seldsk ;select di (hardware malfunction) ; 5 - write protect (treated as not ready) ; 6 - write error (hardware malfunction) ; 7 - not ready  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 dileted data ok) jnz werror ; ; read or write is ok, accumulator contains zero ret ; wready: ;not ready, treat as error fober of sectors to read iot: db offset ;track number ios: db 1 ;sector number iod: dw buff ;io address ; ; ; define ram areda 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: sk jmp settrk ;set track number jmp setsec ;set sector number jmp setdma ;set dma address jmp read ;read disk jmp ; (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 gesk number 0=A,...,15=P iobyte equ 0003h ;intel i/o byte ; org bios ;origin of this program nsects equ ($-ccp)/128 ;warm star now call inbyte ;clear result byte jmp trycount ; werror: ;return hardware malfunction (crc, track, seek, etc.) ; the as for bdos operation endef end  write ;write disk jmp listst ;return list status jmp sectran ;sector translate ; ; fixed data tables for four-drive stahas 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 ed tables ; ; individual subroutines to perform each function boot: ;simplest case is to just perform parameter initializatioacks cpi 27 jc load1 ;carry generated if sector<27 ; ; end of current track, go to next track mvi d,1 ;begin with first 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, set, dma address set call read cpi 00h ;any errors? jnz wboot ;retry the entire boot if an error occurs ; ; no error, mndard ; IBM-compatible 8" disks ; disk parameter header for disk 00 dpbase: dw trans,0000H dw 0000H,0000H dw dirbf,dpblk sector 1 ; contains the cold start loader, which is skipped in a warm start lxi h,ccp ;base of cp/m (initial load point) lon xra a ;zero in the accum sta iobyte ;clear the iobyte sta cdisk ;select disk zero jmp gocpm ;initialize and go to sector of next track inr c ;track=track+1 ; ; save register state, and change tracks push b push d push h call settr26,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, cove 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 secto dw chk00,all00 ; disk parameter header for disk 01 dw trans,0000H dw 0000H,0000H dw dirbf,dpblk dw chk01,all01 ; disad1: ;load one more sector push b ;save sector count, current track push d ;save next sector to read push h ;save dma addrcp/m ; wboot: ;simplest case is to read the disk until all sectors loaded lxi sp,80h ;use space below buffer for stack mvk ;track address set from register c pop h pop d pop b jmp load1 ;for another sector ; ; end of load operation, set paommon to all disks dw 26 ;sectors per track db 3 ;block shift factor db 7 ;block mask db 0 ;null mask dw 242 ;disr address pop b ;recall number of sectors remaining, and current trk dcr b ;sectors=sectors-1 jz gocpm ;transfer to cp/m ik parameter header for disk 02 dw trans,0000H dw 0000H,0000H dw dirbf,dpblk dw chk02,all02 ; disk parameter header for ess mov c,d ;get sector address to register c call setsec ;set sector address from register c pop b ;recall dma address toi 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 rameters 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 poink size-1 dw 63 ;directory max db 192 ;alloc 0 db 0 ;alloc 1 dw 16 ;check size dw 2 ;track offset ; ; end of fixf all have been loaded ; ; more sectors remain to load, check for track change inr d mov a,d ;sector=27?, if so, change trdisk 03 dw trans,0000H dw 0000H,0000H dw dirbf,dpblk dw chk03,all03 ; ; sector translate vector trans: db 1,7,13,19 ; 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 t 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 ofn first read/write ; seldsk: ;select disk given by register C lxi h,0000h ;error return code mov a,c sta diskno cpi 4 t ;null subroutine ; ; reader: ;read character into register a from reader device mvi a,1ah ;enter end of file for now (ren (usually this is similar to write ; so we will allow space to set up read command, then use ; common code in write) ds 10hconsole character into register a ds 10h ;space for input routine ani 7fh ;strip parity bit ret ; conout: ;console charac mov a,c sta sector ds 10h ;space for sector select ret ; sectran: ;translate the sector given by BC using the ;t jump at 5 to bdos ; lxi b,80h ;default dma address is 80h call setdma ; ei ;enable the interrupt system lda cdisk ;g;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 ; complace later) ani 7fh ;remember to strip parity bit ret ; ; ; i/o drivers for the disk follow ; for now, we will simply s ;set up read command jmp waitio ;to perform the actual i/o ; write: ;perform a write operation ds 10h ;set up write commacter output from register c mov a,c ;get to accumulator ds 10h ;space for output routine ret ; list: ;list character froranslate table given by DE xchg ;HL=.trans dad b ;HL=.trans(sector) mov l,m ;L = trans(sector) mvi h,0 ;HL= trans(sectoet current disk number mov c,a ;send to the ccp jmp ccp ;go to cp/m for further processing ; ; ; simple i/o handlers (muspute 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 tore the parameters away for use ; in the read and write subroutines ; home: ;move to the track 00 position of current drive nd ; waitio: ;enter here from read and write to perform the actual i/o ; operation. return a 00h in register a if the operam register c mov a,c ;character to register a ret ;null subroutine ; listst: ;return list status (0 if not ready, 1 if rer) ret ;with value in HL ; setdma: ;set dma address given by registers b and c mov l,c ;low order address mov h,b ;hight be filled in by user) ; in each case, the entry point is provided, with space reserved ; to insert your own code ; const:  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 t ; translate this call into a settrk call with parameter 00 mvi c,0 ;select track 0 call settrk ret ;we will move to 00 otion completes ; properly, and 01h if an error occurs during the read or write ; ; in this case, we have saved the disk numbeady) xra a ;0 is always ok to return ret ; punch: ;punch character from register c mov a,c ;character to register a re order address shld dmaad ;save the address ds 10h ;space for setting the dma address ret ; read: ;perform read operatio;console status, return 0ffh if character ready, 00h if not ds 10h ;space for status subroutine mvi a,00h ret ; conin: ;rack given by register c mov a,c sta track ds 10h ;space for track select ret ; setsec: ;set sector given by register  r in 'diskno' (0,1) ; the track number in 'track' (0-76) ; the sector number in 'sector' (1-26) ; the dma address in 'deblocking Algorithms for CP/M 2.0 * ;* * ;*******************************å * ;* BDOS constants on entry to write * ;* dat equ $ ;beginning of data area dirbf: ds 128 ;scratch directory area all00: ds 31 ;allocation vector 0 all01: ds 31 ;alloc * ;* * ;***************************************************** blksiz equmaad' (0-65535) ds 256 ;space reserved for I/O drivers mvi a,1 ;error condition ret ;replaced when filled-in ; ; the re********************** ; ; utility macro to compute sector mask smask macro hblk ;; compute log2(hblk), return @x as result å * ;***************************************************** wrall equ 0 ;write to allocated wrdir equ 1 ;write ation vector 1 all02: ds 31 ;allocation vector 2 all03: ds 31 ;allocation vector 3 chk00: ds 16 ;check vector 0 chk01: ds 16 2048 ;CP/M allocation size hstsiz equ 512 ;host disk sector size hstspt equ 20 ;host disk sectors/trk hstblk equ hstsiz/1mainder of the CBIOS is reserved uninitialized ; data area, and does not need to be a part of the ; system memory image (the s ;; (2 ** @x = hblk on return) @y set hblk @x set 0 ;; count right shifts of @y until = 1 rept 8 if @y = 1 exitm endiåto directory wrual equ 2 ;write to unallocated ; ;***************************************************** ;*  ;check vector 1 chk02: ds 16 ;check vector 2 chk03: ds 16 ;check vector 3 ; enddat equ $ ;end of data area datsiz equ $-be28 ;CP/M sects/host buff cpmspt equ hstblk * hstspt ;CP/M sectors/track secmsk equ hstblk-1 ;sector mask smask hstblk ;comppace must be available, ; however, between "begdat" and "enddat"). ; track: ds 2 ;two bytes for expansion sector: ds 2 ;two f ;; @y is not 1, shift right one position @y set @y shr 1 @x set @x + 1 endm endm ; ;*********************************;***************************************************** ;* * ;* Sector D * ;* The BDOS entry points given below show the * ;* code which is relevant to deblocgdat;size of data area end ute sector mask secshf equ @x ;log2(hstblk) ; ;***************************************************** ;* bytes for expansion dmaad: ds 2 ;direct memory address diskno: ds 1 ;disk number 0-15 ; ; scratch ram area for BDOS use beg******************** ;* * ;* CP/M to host disk constants  king only. * ;* * ;*****************************************************  ;***************************************************** ;* * ;* The WRITE en************************** ;* * ;* The READ entry point takes the place of jnz alloc ;skip if not ; ; tracks are the same lda seksec ;same sector? lxi h,unasec cmp m ;seksec = unasec? jnz al 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) kdsk ;disk to seek sta unadsk ;unadsk = sekdsk lhld sektrk shld unatrk ;unatrk = sectrk lda seksec sta unasec ;una; ; DISKDEF macro, or hand coded tables go here dpbase equ $ ;disk param block base ; boot: wboot: ;enter here on systemtry point takes the place of * ;* the previous BIOS defintion for WRITE. * ;*  * ;* the previous BIOS defintion for READ. * ;* * ;*************loc ;skip if not ; ; match, move to next sector for future ref inr m ;unasec = unasec+1 mov a,m ;end of track? cpi cpret ; settrk: ;set track given by registers BC mov h,b mov l,c shld sektrk ;track to seek ret ; setsec: ;set sesec = seksec ; chkuna: ;check for write to unallocated sector lda unacnt ;any unalloc remain? ora a jz alloc ;skip i boot to initialize xra a ;0 to accumulator sta hstact ;host buffer inactive sta unacnt ;clear unalloc count ret ;  * ;***************************************************** write: ;write the selected CP/M sector xra a ;0 to a**************************************** read: ;read the selected CP/M sector xra a sta unacnt mvi a,1 sta readop ;rmspt ;count CP/M sectors jc noovf ;skip if no overflow ; ; overflow to next track mvi m,0 ;unasec = 0 lhld unatrk ictor given by register c mov a,c sta seksec ;sector to seek ret ; setdma: ;set dma address given by BC mov h,b mf not ; ; more unallocated records remain dcr a ;unacnt = unacnt-1 sta unacnt lda sekdsk ;same disk? lxi h,unadsk home: ;home the selected disk home: lda hstwrt ;check for pending write ora a jnz homed sta hstact ;clear host activeccumulator sta readop ;not a read operation mov a,c ;write type in c sta wrtype cpi wrual ;write unallocated? jnz cead operation sta rsflag ;must read data mvi a,wrual sta wrtype ;treat as unalloc jmp rwoper ;to perform the read ; nx h shld unatrk ;unatrk = unatrk+1 ; noovf: ;match found, mark as unnecessary read xra a ;0 to accumulator sta rsflov l,c shld dmaadr ret ; sectran: ;translate sector number BC mov h,b mov l,c ret ; ;***************************cmp m ;sekdsk = unadsk? jnz alloc ;skip if not ; ; disks are the same lxi h,unatrk call sektrkcmp ;sektrk = unatrk?  flag homed: ret ; seldsk: ;select disk mov a,c ;selected disk number sta sekdsk ;seek disk number mov l,a ;diskhkuna ;check for unalloc ; ; write to unallocated, set parameters mvi a,blksiz/128 ;next unalloc recs sta unacnt lda se ag ;rsflag = 0 jmp rwoper ;to perform the write ; alloc: ;not an unallocated record, requires pre-read xra a ;0 to ac secmsk ;least signif bits mov l,a ;ready to shift mvi h,0 ;double count rept 7 ;shift left 7 dad h endm ; hl haslxi h,hstsec ;sekhst = hstsec? cmp m jz match ;skip if match ; nomatch: ;proper disk, but not correct sector lda hstw * ;***************************************************** sektrkcmp: ;HL = .unatrk or .hsttrk, compare with a a ;carry = 0 rar ;shift right endm sta sekhst ;host sector to seek ; ; active host sector? lxi h,hstact ;host aced to/from host buffer lda wrtype ;write type cpi wrdir ;to directory? lda erflag ;in case of errors rnz ;no furthecum sta unacnt ;unacnt = 0 inr a ;1 to accum sta rsflag ;rsflag = 1 ; ;********************************************** relative host buffer address lxi d,hstbuf dad d ;hl = host address xchg ;now in DE lhld dmaadr ;get/put CP/M data rt ;host written? ora a cnz writehst ;clear host buff ; filhst: ;may have to fill the host buffer lda sekdsk sta hssektrk xchg lxi h,sektrk ldax d ;low byte compare cmp m ;same? rnz ;return if not ; low bytes equal, test high 1stive flag mov a,m mvi m,1 ;always becomes 1 ora a ;was it already? jz filhst ;fill host if not ; ; host buffer actir processing ; ; clear host buffer for directory write ora a ;errors? rnz ;skip if so xra a ;0 to accum sta hstwrt******* ;* * ;* Common code for READ and WRITE follows * ;*  mvi c,128 ;length of move lda readop ;which way? ora a jnz rwmove ;skip if read ; ; write operation, mark and switchtdsk lhld sektrk shld hsttrk lda sekhst sta hstsec lda rsflag ;need to read? ora a cnz readhst ;yes, if 1 xra  inx d inx h ldax d cmp m ;sets flags ret ; ;***************************************************** ;* ve, same as seek buffer? lda sekdsk lxi h,hstdsk ;same disk? cmp m ;sekdsk = hstdsk? jnz nomatch ; ; same disk, same  ;buffer written call writehst lda erflag ret ; ;***************************************************** ;*  * ;***************************************************** rwoper: ;enter here to per direction mvi a,1 sta hstwrt ;hstwrt = 1 xchg ;source/dest swap ; rwmove: ;C initially 128, DE is source, HL is dea ;0 to accum sta hstwrt ;no pending write ; match: ;copy data to or from buffer lda seksec ;mask buffer number ani * ;* WRITEHST performs the physical write to * ;* the host disk, READHST reads the ptrack? lxi h,hsttrk call sektrkcmp ;sektrk = hsttrk? jnz nomatch ; ; same disk, same track, same buffer? lda sekhst  * ;* Utility subroutine for 16-bit compare * ;* form the read/write xra a ;zero to accum sta erflag ;no errors (yet) lda seksec ;compute host sector rept secshf orst ldax d ;source character inx d mov m,a ;to dest inx h dcr c ;loop 128 times jnz rwmove ; ; data has been mov hysical * ;* disk. * ;* * ;*********************************************************************** end rk: ds 2 ;last unalloc track unasec: ds 1 ;last unalloc sector ; erflag: ds 1 ;error reporting rsflag: ds 1 ;read sectorS: ; ; BAUD RATE SBAUD ; 110 1047 ; 134.5 857 ; 150 768 ; 300 384 ; 600 192 ; 1200 96 ; 1800 64 ; 2000 58areas * ;* * ;***************************************************** ;TA: EQU 20H ;SERIAL DATA PORT SINTEN: EQU SDATA+1 ;SERIAL INTERRUPT ENABLE PORT SIDENT: EQU SDATA+2 ;SERIAL INTERRUPT IDENTIFI***************** writehst: ;hstdsk = host disk #, hsttrk = host track #, ;hstsec = host sect #. write "hstsiz" bytes ;fr; MODIFIED FOR AUTO-BOOT 8 SEPT 80 ; ; 1 JUL 80 ; TITLE 'CCS 2422 STANDARD BIOS FOR CP/M 2.2' PAGE 56 ; ; THIS BIOS IS  flag readop: ds 1 ;1 if read operation wrtype: ds 1 ;write operation type dmaadr: ds 2 ;last dma address hstbuf: ds hsts ; 2400 48 ; 3600 32 ; 4800 24 ; 7200 16 ; 9600 12 ; 19200 6 ; 38400 3 ; 56000 2 ; SBAUD: EQU 12 ; DSTAT EQU sekdsk: ds 1 ;seek disk number sektrk: ds 2 ;seek track number seksec: ds 1 ;seek sector number ; hstdsk: ds 1 ;host dCATION PORT SLCTRL: EQU SDATA+3 ;SERIAL LINE CONTROL PORT SMDMCT: EQU SDATA+4 ;SERIAL MODEM CONTROL PORT SLSTAT: EQU SDATA+5 om hstbuf and return error flag in erflag. ;return erflag non-zero if error ret ; readhst: ;hstdsk = host disk #, hsttrkSET UP FOR STANDARD 128 BYTE SECTORS ONLY ; ;"BIAS" IS ADDRESS OFFSET FROM 2C00H FOR MEMORY SYSTEMS ;THAN 20K (REFERRED TO ASiz ;host buffer ; ;***************************************************** ;*  30H ;DISK STATUS PORT DCMMD EQU DSTAT ;DISK COMMAND PORT DTRCK EQU DSTAT+1 ;DISK TRACK PORT DSCTR EQU DSTAT+2 ;DISK SECTOR Pisk number hsttrk: ds 2 ;host track number hstsec: ds 1 ;host sector number ; sekhst: ds 1 ;seek shr secshf hstact: ds 1;SERIAL LINE STATUS PORT SMDMST: EQU SDATA+6 ;SERIAL MODEM STATUS PORT ; ; WHEN THE AUTO-BOOT JUMPER IS ENABLED, THE 2810 ; = host track #, ;hstsec = host sect #. read "hstsiz" bytes ;into hstbuf and return error flag in erflag. ret ; ;******* "B" THROUGHOUT THE TEXT). ; VERS: EQU 22 ;CP/M VERSION NUMBER MSIZE: EQU 20 ;CP/M VERSION MEMORY SIZE IN KILOBYTES BIAS: EQ * ;* The ENDEF macro invocation goes here * ;* * ;******************ORT DDATA EQU DSTAT+3 ;DISK DATA PORT DFLAG EQU DSTAT+4 ;DISK FLAF PORT DCTRL EQU DSTAT+4 ;DISK CONTROL PORT BCTRL EQU 4 ;DI ;host active flag hstwrt: ds 1 ;host written flag ; unacnt: ds 1 ;unalloc rec cnt unadsk: ds 1 ;last unalloc disk unat SERIAL PORT WILL BE INITIALIZED TO 9600 BAUD. ; TO SELECT A DIFFERENT BAUD RATE, CHANGE SBAUD ; TO ONE OF THE FOLLOWING VALUE********************************************** ;* * ;* Unitialized RAM data U (MSIZE-20)*1024 CCP: EQU 2C00H+BIAS ;BASE OF CCP BDOS: EQU CCP+806H ;BASE OF BDOS BIOS: EQU CCP+1600H ;BASE OF BIOS ; SDA  SK STATUS/CONTROL PORT 2 ; STEP5: EQU 3 ;MINI STEP RATE STEP8: EQU 2 ;MAXI STEP RATE ; WBOOTV: EQU 0 ;VECTOR FOR WARM RESTADATA READY BIT INTO CARRY JNC TTYIN ;LOOP UNTIL DATA IS IN IN SDATA ;READ THE DATA ANI 7FH ;STRIP OFF THE PARITY BIT RETMP SETTRK ;SET TRACK NUMBER JMP SETSEC ;SET SECTOR NUMBER JMP SETDMA ;SET DMA ADDRESS JMP DREAD ;READ DISK JMP DWRITE ;WK XRA A LOAD3: INR A STA SECTOR MOV A,H CPI BIOS/256 ;SEE IF DONE WITH WARM BOOT JC LOAD2 ;JUMP IF MORE TO GO ; ;EQU 4BH DMAAD: EQU 4CH ;HOST BUFFER ADDRESS IDSV: EQU 4EH ;DISK ID SAVE AREA TBUF: EQU 80H ; ORG BIOS ;ORIGIN OF THIS PROGRO LXI H,0D002H ;SET THE SIDE AND SECTOR SHLD SECTOR MVI B,8 ;ZERO OUT PRMTBL LXI H,PRMTBL LOAD1A: MOV M,A INX H DCRT CR: EQU 0DH ;ASCII CARRIAGE RETURN LF: EQU 0AH ;ASCII LINE FEED IOBYTE: EQU 3 ;ADDRESS OF I/O CONTROL BYTE CDISK: EQU 4  ; TTOST: IN SLSTAT ;GET 8250 LINE STATUS ANI 20H ;ISOLATE TX BUFFER EMPTY BIT RZ ;RETURN IF NOT EMPTY ADI 0BFH ;FLAG TRITE DISK JMP TTOST ;RETURN LIST STATUS JMP SECTRAN ;SECTOR TRANSLATE ; ;INDIVIDUAL SUBROUTINES TO PERFORM EACH FUNCTION ND OF LOAD OPERATION, SET PARAMETERS AND GO TO CP/M BOOT0: MVI A,JMP ;GET A JUMP OP CODE STA WBOOTV ;RESET THE JUMP VECTORS AM ; ;JUMP VECTOR FOR INDIVIDUAL SUBROUTINES JMP BOOT ;COLD START WBOOTE: JMP WBOOT ;WARM START CSTAT: JMP TTST ;CONSOLE SR B JNZ LOAD1A PUSH B MOV C,A CALL SELDSK POP B LDA CUNIT ;GET THE SELBITS ANI 10H ;SEE IF A MINI MVI B,26 ;SET BDOSV: EQU 5 ; DISKNO: EQU 40H ;ACTIVE DISK NUMBER TRACK: EQU DISKNO+1 SECTOR: EQU TRACK+1 SIDE: EQU SECTOR+1 ;SIDE SELECTHE EMPTY STATE RET ; TTYOUT: CALL TTOST ;GET 8250 LINE STATUS JZ TTYOUT ;WAIT UNTIL ONE OF THE REGISTERS EMPTIES MOV A,C; ; I/O DRIVERS FOR THE 8250 ASYNC COMM ELEMENT ; TTST: IN SLSTAT ;GET 8250 LINE STATUS ANI 1 ;SEE IF RECEIVE DATA AVAILABL STA BDOSV LXI H,WBOOTE SHLD WBOOTV+1 LXI H,BDOS SHLD BDOSV+1 LXI H,TBUF ;SET UP DEFAULT BUFFER ADDRESS SHLD DMAAD TATUS CONIN: JMP TTYIN ;CONSOLE CHARACTER IN CONO: JMP TTYOUT ;CONSOLE CHARACTER OUT JMP TTYOUT ;LIST CHARACTER OUT JMP TT8" SECTORS PER TRACK JNZ LOAD1B ;JUMP IF 8" MVI B,18 ; ELSE, SET MINI SECTORS PER TRACK LOAD1B: LXI H,CCP SHLD DMAAD LO HOLD AREA SPT: EQU SIDE+1 ;SECTORS PER TRACK HOLD TWOSID: EQU SPT+1 ;SINGLE/DOUBLE SIDED SWITCH HOLD STPRAT: EQU 46H ;STEP R ;MOVE THE DATA OVER OUT SDATA ;OUTPUT THE DATA RET ; ; RETRY: DCR C JNZ LOAD1 LXI H,BOTMSG CALL PRTWD CALL CONINE RZ ;RETURN IF NOT ADI 0FEH ;FLAG THAT DATA IS AVAILABLE RET ; TTYIN: IN SLSTAT ;GET 8250 LINE STATUS RAR ;MOVE RX  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 FURTYOUT ;PUNCH CHARACTER OUT JMP TTYIN ;READER CHARACTER OUT JMP HOME ;MOVE HEAD TO HOME POSITION JMP SELDSK ;SELECT DISK JAD2: PUSH B CALL DREAD POP B ORA A JNZ RETRY SHLD DMAAD LDA SECTOR CMP B JC LOAD3 LDA TRACK INR A STA TRACATE SAVE AREA STATUS: EQU 47H CMND: EQU STATUS+1 LUNIT: EQU 49H ;LAST USED DRIVE CUNIT: EQU LUNIT+1 ;CURRENT DRIVE RWFLG: E CALL PRTWD WBOOT: LXI SP,80H MVI C,10 ;# OF RETRIES LOAD1: XRA A MOV H,A ;SET THE UNIT AND TRACK MOV L,A SHLD DISKN! HER PROCESSING ; BOOT: IN DCTRL ;SEE IF AUTO-BOOT IN PROGRESS ANI 40H JNZ BOOTA MVI A,0FH ;TURN OFF THE HAND-SHAKE LINESNI JZ SETUP1 ;JUMP IF MINI LXI D,SELTBL ; ELSE, SET THE 8" TABLE ADDRESS SETUP1: POP H PUSH H ;GET, RESAVE DP BLOCK POIA STA CUNIT ORA A JNZ SET4 ;JUMP IF ALREADY ESTABLISHED XCHG ;ELSE, ESTABLISH NEW DISK INR L ;INSURE LUNIT<>CUNIT S ; THE STRING MUST BE TERMINATED BY BIT 7 SET IN THE ; LAST CHARACTER OF THE STRING. THE STRING WILL START ; A NEW LINE (EP =A DISKNO CPI 4 ;MUST BE BETWEEN 0 AND 3 RNC ;NO CARRY IF 4,5,... ;DISK NUMBER IS IN THE PROPER RANGE ;COMPUTE PROPER DISK ; ;TRANSLATE THE SECTOR GIVEN BY BC USING THE ;TRANSLATE TABLE GIVEN BY DE SECTRAN: XCHG ;HL=.TRANS DAD B ;HL=.TRANS(SE OUT SMDMCT MVI A,83H ;ACCESS THE BAUD RATE DIVISOR REG OUT SLCTRL MVI A,SBAUD/256 ;SET THE DIVISOR HIGH BYTE OUT SINNTER LDAX D ;MOVE THE TABLE ENTRIES MOV M,A INX D INX H LDAX D MOV M,A INX D PUSH D ;SAVE IT FOR A MOMENT LXI HLD LUNIT ; TO FORCE A READ ADDRESS PUSH B PUSH D ;SAVE THE REGISTERS CALL IDRD ;FIND OUT WHAT IS OUT THERE POP H ;REGE PRTWD) OR CONTINUE ON THE SAME ; LINE (EP = PRTWA) ; PRTWD: CALL CRLF ;START A NEW LINE PRTWA: PUSH B ;SAVE (B,C) PRTA: MO PARAMETER HEADER ADDRESS SELDSK1: MOV L,A ;L=DISK NUMBER 0,1,2,3 DAD H ;*2 DAD H ;*4 DAD H ;*8 DAD H ;*16 (SIZE OF EACTOR) MOV L,M ;L = TRANS(SECTOR) MVI H,0 ;HL= TRANS(SECTOR) RET ;WITH VALUE IN HL ; ;SET DMA ADDRESS GIVEN BY REGISTERSTEN MVI A,SBAUD MOD 256 ;SET THE DIVISOR LOW BYTE OUT SDATA MVI A,3 OUT SLCTRL ;SET NORMAL OPERATING CONDITIONS XRA AD,9 DAD D ;OFFSET THE POINTER POP D ;REGET TABLE ADDRESS LDAX D ;MOVE THE TABLE ENTRIES MOV M,A INX D INX H LDAX DT SELECT TABLE ADDRESS POP B DCX H ;POINT TO STEP RATE LDA STPRAT ;SET THE STEP RATE MOV M,A ;SAVE THE STEP RATE INX HV C,M ;GET NEXT CHARACTER FROM MEMORY CALL CONO ;OUTPUT IT INX H ;INCREMENT MEMORY POINTER MOV A,C RLC ;TEST FOR BIT 7 CH HEADER) XCHG LXI H,DPBASE DAD D ;HL=.DPBASE(DISKNO*16) ; CKSET: PUSH H ;SAVE (H,L) MOV A,C ;REGET UNIT ADD A ;OFF B AND C SETDMA: MOV L,C ;LOW ORDER ADDRESS MOV H,B ;HIGH ORDER ADDRESS SHLD DMAAD ;SAVE THE ADDRESS RET ; ;MOVE TO THE ;SET THE HAND-SHAKE LINES OUT SINTEN OUT SLSTAT BOOTA: LXI H,LOGMSG ;SIGN ON TO THE SYSTEM CALL PRTWD LXI H,0 ;SET IO MOV M,A SET4: POP H MOV A,C RET ; ;SET TRACK GIVEN BY REGISTER C SETTRK: MOV A,C STA TRACK RET ; ;SET SECTOR GI LDA CUNIT ;GET THE SELBITS MOV M,A ;SET THE TABLE ANI 10H ;ISOLATE THE MINI DRIVE BIT LXI D,MSELTB ;SET ADDRESS FOR MIDELIMITER JNC PRTA ;NO DELIMITER, GO DO NEXT CHARACTER PRTB: POP B ;RESTORE (B,C) RET ; ; ROUTINE CRLF GENERATES A CARRIASET INTO TABLE LXI H,PRMTBL+1 ;POINT TO SELBITS MOV E,A DAD D ;OFFSET THE TABLE POINTER MOV A,M ;GET THE SELBITS ORA  TRACK 00 POSITION OF CURRENT DRIVE HOME: SUB A STA TRACK RET ; ; ROUTINE PRTWD PRINTS AN ASCII STRING ONTO THE CONSOLE. BYTE, CDISK SHLD IOBYTE JMP BOOT0 ; ; ;SELECT DISK GIVEN BY REGISTER C SELDSK: LXI H,0 ;ERROR RETURN CODE MOV A,C STVEN BY REGISTER C SETSEC: MVI A,0D0H ;SET UP SIDE SELECT BITS STA SIDE ;SET THE SIDE SELECT BITS MOV A,C STA SECTOR RET" GE RETURN, LINE FEED ; SEQUENCE ON THE CURRENT CONSOLE TO START A NEW LINE ; IT INCLUDES TWO NULL CHARACTERS FOR TTY TYPE ; DI 9CH ;ISOLATE READ ERROR BITS RET ; WRDAT: ORI 20H ;ADD WRITE COMMAND OUT DCMMD ;DISK COMMAND PORT STA CMND WRT1: MOV  BIOS. ; ; DREAD: DB 3EH ;SIM. MVI A INSTR DWRITE: XRA A ;SET WRITE FLAG STA RWFLG ;SAVE IT FOR LATER USE MVI B,10 ;NUMB READ SECTOR COMMAND LHLD DMAAD ;GET THE DMA ADDRESS MVI C,80H ;SET SECTOR BYTE COUNT RDWRT2: CMP A ;CLEAR THE FLAGS RET RED DATA IS TRANSFERRED, THE DESIRED ; TRACK IS SEEKED OUT, THE DESIRED SECTOR AND SIDE IS ; SET, THEN THE ACTUAL DATA TRANSFE SECTOR OUT DSCTR ;DISK SECTOR PORT IN DTRCK ;DISK TRACK PORT MOV C,A ;SAVE IT LDA TRACK ;GET DESIRED TRACK CMP C JZEVICES FOR THE HEAD MOVEMENT TIME. ; CRLF: PUSH H ;SAVE THE CONTENTS OF (H,L) CRLFA: LXI H,CRMSG ;ADDRESS OF CR,LF MESSAGE A,M ;GET THE DATA OUT DDATA INX H ;BUMP THE MEMORY POINTER DCR C ;LOOP CONTROL JNZ WRT1 JMP EOJ ; EOJB: MVI B,8 ;BASER OF RETRIES AGN: PUSH B CALL SEEK CZ RDWR READ3: POP B RZ DCR B JNZ AGN RET ; RDWR: MOV E,A ;SAVE COMMAND LD ; IDRD5: MVI B,58H ;BUILD A STEP-IN COMMAND CALL EOJA IDRD: LHLD LUNIT MOV A,H ;GET THE CUNIT VALUE CMP L ;SEE IF SAME R. ; ; UP TO TEN TRIES WILL BE ATTEMPTED BEFORE THE DATA ; TRANSFER IS ABORTED. ON RETURN TO THE CALLING ; ROUTINE, THE A R RDWRT ;JUMP IF NO SEEK NEEDED OUT DDATA ;SET THE SEEK TRACK MVI B,1CH ;BUILD THE SEEK COMMAND CALL EOJA ;DO THE SEEK ANCALL PRTWA ; OUTPUT IT POP H ;RESTORE (H,L) RET CRMSG: DB CR,LF,0,80H ; ; ; THE FOLLOWING ROUTINES DO THE PRIMITIVE DISIS OF RESTORE COMMAND EOJA: LDA STPRAT ;GET THE STEP RATE BITS ORA B ;ADD ON THE COMMAND STA CMND OUT DCMMD ;DO THE COMMAA RWFLG ORA A MOV A,E ;REGET THE COMMAND JZ WRDAT ;WRITE IF ZERO RDAT: OUT DCMMD ;DISK COMMAND PORT STA CMND READ1: INAS LUNIT RZ ;RETURN IF SO IDRD1: MVI C,80H ;SET THE AUTO-WAIT BIT CALL SETUP CALL EOJ1 ;INSURE A DRIVE IS THERE RM ;EEGISTER WILL CONTAIN A ZERO IF THE ; OPERATION WAS SUCCESSFUL, OR NON-ZERO IF NOT ; SUCCESSFUL. THE FLAG REGISTER WILL NOT NEI 98H ;SEEK ERROR MASK RNZ ;DONE IF SEEK ERROR RDWRT: MVI C,80H ;AUTO-WAIT BIT CALL SETUP IN DFLAG ;DISK FLAG PORT ANIK ACCESSES. ; IN ALL CASES, ONE SECTOR OF DATA IS TRANSFERRED. ; IF THE DISK HAS NOT BEEN PREVIOUSLY ACCESSED, ; THESE ROUTINND EOJ: IN DFLAG ;DISK FLAG PORT RAR JNC EOJ EOJ1: IN DSTAT ;GET THE DISK STATUS STA STATUS ANI 0FCH RET ; SEEK: C DDATA ;GET THE DATA MOV M,A ;STORE IT INX H ;INCREMENT THE MEMORY POINTER DCR C ;LOOP CONTROL JNZ READ1 CALL EOJ ANRROR IF NOT PUSH H ;SAVE POINTER LXI H,IDSV ;SET UP TO READ ADDRESS MVI C,6 ;READ 6 BYTES OF HEADER MVI A,0C4H ;READ ADDCESSARILY ; CORRESPOND WITH THE A REGISTER CONTENT. ; ; THESE ROUTINES ARE CP/M COMPATABLE, AND MAY BE USED ; AS PART OF THE 20H ;SEE IF HEAD IS LOADED MVI A,4 JZ RDWRT1 ;JUMP IF NOT XRA A ;ELSE, RESET THE HEAD LOAD FLAG RDWRT1: ADI 88H ;BUILD AES WILL AUTOMATICALLY DETERMINE THE ; DISK TYPE (8" OR 5"), SINGLE OR DOUBLE DENSITY, ; AND SECTOR SIZE. ; ; BEFORE THE DESIALL IDRD ;INSURE HEADER HAS BEEN READ CNZ EOJB ;RESTORE THE DRIVE IF ERROR RM ;DONE IF NO DRIVE SEEK1: LDA SECTOR ;SET THE# RESS COMMAND CALL RDAT POP H ;RESTORE POINTER RNZ ;DONE IF ERROR ; IDRD2: IN DSCTR ;GET THE TRACK NUMBER OUT DTRCK ;S DW 0,0 DW DIRBF,0 DW CHK01,ALL01 ;DISK PARAMETER HEADER FOR DISK 02 DW 0,0 DW 0,0 DW DIRBF,0 DW CHK02,ALL02 ;DISFH ;INSURE DDEN IS RESET SU1: ORA C ;ADD ON AUTOWAIT BIT OUT DCTRL ;OUTPUT THE SELBITS LDA SIDE ;SET THE SIDE SELECT OUT RVED UNINITIALIZED ;DATA AREA, AND DOES NOT NEED TO BE A PART OF THE ;SYSTEM MEMORY IMAGE (THE SPACE MUST BE AVAILABLE, ;HOWEFT BIT INTO POSITION DCR B JNZ SET1 ;LOOP TIL BIT IS IN POSITION ORI 20H ;ADD ON MOTOR ON BIT MOV M,A ;SAVE IT OUT DCT: 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 ; MSELTB: DW T5S0,DP5S0 DPET THE TRACK REGISTER ORA A ;INSURE NOT ON TRACK 0 JZ IDRD5 ;JUMP IF NOT OKAY MOV A,M ;REGET SELBITS STA LUNIT ;UPDATE LK PARAMETER HEADER FOR DISK 03 DW 0,0 DW 0,0 DW DIRBF,0 DW CHK03,ALL03 ; ;PARAMETER TABLE FOR DRIVE-UNIQUE CONSTANTS BCTRL RET ; BOTMSG: DB 7,'CANNOT BOO','T'+80H,0DH,8AH LOGMSG: DB MSIZE/10+'0',MSIZE MOD 10 + '0' DB 'k CP/M vers ' DB VVER, BETWEEN "BEGDAT" AND "ENDDAT"). ; ; ;SCRATCH RAM AREA FOR BDOS USE BEGDAT EQU $ ;BEGINNING OF DATA AREA DIRBF: DS 128 RL ;SELECT THE DRIVE CALL EOJB ;RESTORE THE DRIVE RM ;DONE IF DRIVE NOT READY IN BCTRL ;READ THE MINI TRK00 BIT RAR ;I5S0: DW 18 ;SECTORS PER TRACK DB 3 ;BLOCK SHIFT FACTOR DB 7 ;BLOCK MASK DB 0 ;EXTENT MASK DW 71 ;BLOCKS PER DISKETTE DAST USED UNIT XRA A ;RESET ERROR FLAGS RET ; ;SET UP DRIVE NUMBER SETUP: LXI H,CUNIT ;SEE IF DRIVE HAS BEEN ACTIVE MOV PRMTBL: DB 0,0 ;DRIVE 0 STEP RATE, SELECT BYTES DB 0,0 ; 1 DB 0,0 ; 2 DB 0,0 ; 3 ; SELTBL: DW T8S0,DP8S0 ERS/10+'0','.',VERS MOD 10+'0' DB 0DH,8AH ; ; ;FIXED DATA TABLES FOR FOUR-DRIVE STANDARD ;IBM-COMPATIBLE 8" DISKS ;DISK P;SCRATCH DIRECTORY AREA ALL00: DS 31 ;ALLOCATION VECTOR 0 ALL01: DS 31 ;ALLOCATION VECTOR 1 ALL02: DS 31 ;ALLOCATION VECTOR 2SOLATE IT MVI A,STEP5 ;MINI STEP RATE BITS JNC SET2 ;JUMP IF MINI DRIVE MVI A,10H ;ELSE, ADD ON MAXI BIT ORA M MOV M,AW 63 ;# DIRECTORY ENTRIES DB 192 ;ALLOC 0 DB 0 ;ALLOC 1 DW 16 ;DIR CHECK VECTOR SIZE DW 3 ;SYSTEM TRACK OFFSET T5S0: DBA,M ;GET THE SELBITS ORA A ;SEE IF SET UP YET JNZ SU0 ;YES, SKIP INIT CODE ; SETIT: LDA DISKNO ;GET THE DESIRED DRIVE MO DP8S0: DW 26 ;SECTORS PER TRACK DB 3 ;BLOCK SHIFT FACTOR DB 7 ;BLOCK MASK DB 0 ;EXTENT MASK DW 242 ;BLOCKS PER DISKETTEARAMETER HEADER FOR DISK 00 DPBASE: DW 0,0 DW 0,0 DW DIRBF,0 DW CHK00,ALL00 ;DISK PARAMETER HEADER FOR DISK 01 DW 0,0  ALL03: DS 31 ;ALLOCATION VECTOR 3 CHK00: DS 16 ;CHECK VECTOR 0 CHK01: DS 16 ;CHECK VECTOR 1 CHK02: DS 16 ;CHECK VECTOR 2 C MVI A,STEP8 ;SET MAXI STEP RATE SET2: STA STPRAT SU0: IN DDATA ;CLEAR THE STATUS BITS MOV A,M ;REGET THE SELBITS ANI 0B 1,5,9,13,17 DB 3,7,11,15 DB 2,6,10,14,18 DB 4,8,12,16 ; ;END OF FIXED TABLES ; ; ;THE REMAINDER OF THE CBIOS IS RESEV B,A ;SAVE IN WORK REGISTER INR B ;PREPARE TO CONVERT TO SELBITS XRA A ;ZERO TO A STC ;DRIVE SELECT BIT SET1: RAL ;SHI DW 63 ;# DIRECTORY ENTRIES DB 192 ;ALLOC 0 DB 0 ;ALLOC 1 DW 16 ;DIR CHECK VECTOR SIZE DW 2 ;SYSTEM TRACK OFFSET T8S0$ HK03: DS 16 ;CHECK VECTOR 3 ; ENDDAT EQU $ ;END OF DATA AREA DATSIZ EQU $-BEGDAT;SIZE OF DATA AREA ; END  ADD L ;OFFSET THE POINTER MOV L,A MOV A,M ;GET THE CORRECT SECTORS PER TRACK STA SPT ;SAVE IT LXI H,CCP-1 ;GET THE CP; START: MVI A,1 ;TURN OFF THE SHADOW ROM OUT BANK LDA CUNIT ;GET THE SELECT BITS MOV B,A ANI 10H ;SEE IF IT IS A MINI EXT TRACK MOV C,A ;SET THE CORRECT SPT LDA CUNIT MOV B,A ;RESET THE SELBIT OUT DCTRL MVI A,STEPI ;GET A STEP IN COMMANE 56 MACLIB Z80 ; ; THIS BOOT LOADER WILL LOAD THE CP/M SYSTEM IN FROM THE SYSTEM TRACKS ; OF AN 8" DISK. IT IS INDEPENDENDCMD LOAD5: INX H ;INCREMENT THE POINTER IN DDATA ;GET THE DATA MOV M,A ;STORE IT IN DCTRL ;SEE IF INTRQ RELEASED THE WAIå/M LOAD ADDRESS LXI D,(BIOS+600H)+2 ;STOP PAGE ADDRESS, START SECTOR MOV A,B ;REGET THE SELBITS OUT DCTRL MVI A,RSTOR ; LXI H,MTBL ;ADDRESS OF MINI SECTORS PER TRACK JRZ LOAD2 ;JUMP IF MINI DRIVE LXI H,TBL ;ADDRESS OF 8" SECTORS PER TRACK LOD MVI E,1 ;RESET SECTOR COUNTER JR LOAD0 ;GO DO THE STEP IN ; TBL: DB 26,15,8,4 ;8" SECTORS PER TRACK TABLE MTBL: DB 18,T OF SECTOR SIZE OR DENSITY. ; ORG 80H ; MSIZE: EQU 20 ;MEMORY SIZE IN KILOBYTES BIAS: EQU (MSIZE-20)*1024 CCP: EQU 2C00HT RAR ;CHECK FOR INTRQ JRNC LOAD5 ;JUMP IF VALID DATA DCX H ;ADJUST THE MEMORY POINTER IN DSTAT ;CHECK THE STATUS ANIåHOME THE DISK LOAD0: OUT DCMD LOAD1: IN DCTRL ;WAIT TIL DONE RAR JRNC LOAD1 IN DSTAT ;GET THE STATUS ANI 98H ;MASK FORAD2: MOV C,M ;GET THE TRACK 00 SPT MOV A,B ;REGET THE SELBITS ANI 40H ;SEE IF DOUBLE DENSITY JRZ LOAD3 ;JUMP IF NOT DCX 10,5,2 ;5" SECTORS PER TRACK TABLE +BIAS BIOS: EQU CCP+1600H ;BASE OF BIOS ; SPT: EQU 44H CUNIT: EQU 4AH IDSV EQU 4EH ; ; DCMD: EQU 30H DSTAT: EQU DCMD D 9CH ;MASK FOR READ ERRORS JRNZ START ;TRY AGAIN IF ERROR MOV A,H ;SEE IF ALL IN CMP D JNC BIOS ;JUMP IF SO MOV A,E ;Nå ERRORS JRNZ START ;TRY AGAIN IF ERRORS LOAD4: MOV A,E ;GET THE START SECTOR OUT DSCTR IN DDATA ;CLEAR ANY BOGUS STATUS BH ; ELSE, ADJUST POINTER FOR DDEN SPT LOAD3: XRA B ;BUILD TRACK 00 SELBITS MOV B,A ;SAVE IN (B) LDA IDSV+3 ;GET SECTOR SIZEåSCTR: EQU DCMD+2 DDATA: EQU DCMD+3 DCTRL: EQU DCMD+4 ; BANK: EQU 40H ; ; RSTOR: EQU 0DH RDSEC: EQU 88H STEPI: EQU 5DH O, CHECK FOR TRACK OVERFLOW INR E ;INCREMENT SECTOR POINTER CMP C JRNZ LOAD4 ;JUMP IF NO OVERFLOW LDA SPT ;ELSE, GO TO N; ;CP/M 2.2 BOOT FOR CCS 2442 MULTIMODE DISK CONTROLLER ; TITLE 'CCS 2422 MULTIMODE DISK CONTROLLER BOOT FOR CP/M 2.2' PAGITS MOV A,B ;GET THE SELECT BITS ORI 80H ;SET THE AUTO-WAIT BIT OUT DCTRL MVI A,RDSEC ;START THE TRACK READ GOING OUT % å047 ; 134.5 857 ; 150 768 ; 300 384 ; 600 192 ; 1200 96 ; 1800 64 ; 2000 58 ; 2400 48 ; 3600 32 ; 4800 24 ;UPT ENABLE PORT SIDENT: EQU SDATA+2 ;SERIAL INTERRUPT IDENTIFICATION PORT SLCTRL: EQU SDATA+3 ;SERIAL LINE CONTROL PORT SMDMCSTBUF: EQU 4CH ;HOST BUFFER ADDRESS IDSV: EQU 4EH ;SECTOR ID SAVE AREA TBUF: EQU 80H TPA: EQU 100H ; ORG BIOS ;ORIGIN OF T 56 ; ; ; THIS BIOS IS SET UP FOR AUTO SELECT OF DISK CHAR ; ;"BIAS" IS ADDRESS OFFSET FROM 2C00H FOR MEMORY SYSTEMS ;THAN1 WRUAL: EQU 2 ; ; CR: EQU 0DH ;ASCII CARRIAGE RETURN LF: EQU 0AH ;ASCII LINE FEED IOBYTE: EQU 3 ;ADDRESS OF I/O CONTROL Bå 7200 16 ; 9600 12 ; 19200 6 ; 38400 3 ; 56000 2 ; SBAUD: EQU 12 ;9600 BAUD DIVISOR FOR 2810 ; DSTAT EQU 30H ;DISK T: EQU SDATA+4 ;SERIAL MODEM CONTROL PORT SLSTAT: EQU SDATA+5 ;SERIAL LINE STATUS PORT SMDMST: EQU SDATA+6 ;SERIAL MODEM STATUHIS PROGRAM ; ;JUMP VECTOR FOR INDIVIDUAL SUBROUTINES JMP BOOT ;COLD START WBOOTE: JMP WBOOT ;WARM START CSTAT: JMP CONST  20K (REFERRED TO AS "B" THROUGHOUT THE TEXT). ; VERS: EQU 22 ;CP/M VERSION NUMBER MSIZE: EQU 20 ;CP/M VERSION MEMORY SIZE INYTE ; DISKNO: EQU 40H ;ACTIVE DISK NUMBER TRACK: EQU DISKNO+1 SECTOR: EQU TRACK+1 SIDE: EQU SECTOR+1 ;SIDE SELECT HOLD ARE; ; 17 JUL 80 ; ; MODIFIED FOR UNALLOCATED WRITE CORRECTIONS 8 SEP 80 ; MODIFIED FOR AUTO-BOOT OPERATION 7 SEP 80 ; MODIFIESTATUS PORT DCMMD EQU DSTAT ;DISK COMMAND PORT DTRCK EQU DSTAT+1 ;DISK TRACK PORT DSCTR EQU DSTAT+2 ;DISK SECTOR PORT DDATA S PORT ; ; WHEN THE AUTO-BOOT JUMPER IS ENABLED, THE 2810 ; SERIAL PORT WILL BE INITIALIZED TO 9600 BAUD. ; TO SELECT A DI;CONSOLE STATUS CONIN: JMP CONI ;CONSOLE CHARACTER IN CONO: JMP CONOUT ;CONSOLE CHARACTER OUT JMP LIST ;LIST CHARACTER OUT  KILOBYTES BIAS: EQU (MSIZE-20)*1024 CCP: EQU 2C00H+BIAS ;BASE OF CCP BDOS: EQU CCP+806H ;BASE OF BDOS BIOS: EQU CCP+1600H ;A SPT: EQU SIDE+1 ;SECTORS PER TRACK HOLD TWOSID: EQU SPT+1 ;SINGLE/DOUBLE SIDED SWITCH HOLD STPRAT: EQU 46H ;STEP RATE SAVE D FOR COMPUTED SKEW FACTORS 7 SEP 80 ; MODIFIED FOR WARM BOOTS FROM MINIS 14 AUG 80 ; MODIFIED FOR PROPER DEFAULT DISK RESTORAEQU DSTAT+3 ;DISK DATA PORT DFLAG EQU DSTAT+4 ;DISK FLAF PORT DCTRL EQU DSTAT+4 ;DISK CONTROL PORT BCTRL: EQU 4 ;DISK STATUS FFERENT BAUD RATE, CHANGE SBAUD ; TO ONE OF THE FOLLOWING VALUES: ; ; BAUD RATE SBAUD ; 50 2304 ; 75 1536 ; 110 1 JMP PUNCH ;PUNCH CHARACTER OUT JMP READER ;READER CHARACTER OUT JMP HOME ;MOVE HEAD TO HOME POSITION JMP SELDSK ;SELECT DBASE OF BIOS WBOOTV: EQU 0 CDISK: EQU 4 BDOSV: EQU 5 ; SDATA: EQU 20H ;SERIAL DATA PORT SINTEN: EQU SDATA+1 ;SERIAL INTERRAREA STATUS: EQU 47H CMND: EQU STATUS+1 LUNIT: EQU 49H ;LAST USED DRIVE CUNIT: EQU LUNIT+1 ;CURRENT DRIVE RWFLG: EQU 4BH HL ON WARM BOOT 12 AUG 80 ; MODIFIED FOR 2 MHZ 8080 OPERATION 12 AUG 80 ; TITLE 'CCS 2422 DEBLOCKED BIOS FOR CP/M 2.2' PAGE2 PORT ; STEP5: EQU 3 ;MINI DISK STEP RATE STEP8: EQU 2 ;8" DISK STEP RATE ; ;DEBLOCK PARAMETERS WRALL: EQU 0 WRDIR: EQU & ISK JMP SETTRK ;SET TRACK NUMBER JMP SETSEC ;SET SECTOR NUMBER JMP SETDMA ;SET DMA ADDRESS JMP READ ;READ DISK JMP WRIE SHLD WBOOTV+1 LXI H,BDOS SHLD BDOSV+1 LXI H,DBUF ;SET UP BUFFER ADDRESS SHLD HSTBUF LXI H,80H ;DEFAULT DMA ADDRESS ;CURRENT VALUE OK IF DDEN SET LDA IDSV+3 ;GET SECTOR SIZE INDICATOR DCR A ;SEE WHICH SIZE JM LOAD2A ;JUMP IF 128 BYTE SEC1: MOV L,A ;L=DISK NUMBER 0,1,2,3 DAD H ;*2 DAD H ;*4 DAD H ;*8 DAD H ;*16 (SIZE OF EACH HEADER) XCHG LXI H,DPBASE A POP B LXI H,CCP SHLD HSTBUF IN BCTRL ;SET # OF SECTORS FOR TRK00 ANI 2 ;ISOLATE MINI/MAXI BIT MVI B,26 ;HOLD THE SUT SDATA ;SET DIVISOR LOW BYTE MVI A,3 ;SET 8250 LINE CONTROL OUT SLCTRL XRA A ;SET HANDSHAKE LINES ACTIVE OUT SINTEN TE ;WRITE DISK JMP LISTST ;RETURN LIST STATUS JMP SECTRAN ;SECTOR TRANSLATE ; ;INDIVIDUAL SUBROUTINES TO PERFORM EACH FUNC IS 80H SHLD DMAAD EI ;ENABLE THE INTERRUPT SYSTEM XRA A ;SET UP DEBLOCK STA HSTACT ;HOST NOT ACTIVE LDA SEKDSK ;GET TORS MVI B,10 ;SPT FOR 256 BYTE SECTORS JZ LOAD2A MVI B,5 ;SPT FOR 512 BYTE SECTORS LOAD2A: XRA A LOAD3: INR A STA SEC DAD D ;HL=.DPBASE(DISKNO*16) ; CKSET: PUSH H ;SAVE (H,L) MOV A,C ;REGET UNIT ADD A ;OFFSET INTO TABLE ADD C ; * 3 LXPT IN (B) JZ LOAD2 ;JUMP IF 8" MVI B,18 ;SET MINI SPT LOAD2: PUSH B CALL DREAD POP B ORA A JNZ RETRY SHLD HSTBUF OUT SLSTAT BOOTA: LXI H,LOGMSG ;SIGN ON TO THE SYSTEM CALL PRTWD LXI H,0 SHLD IOBYTE ;SET IOBYTE, CDISK JMP BOOT0 ; TION ; ; RETRY: DCR C JNZ LOAD1 LXI H,BOTMSG CALL PRTWD CALL CONIN CALL PRTWD WBOOT: LXI SP,TBUF MVI C,10 ;# OF OLD DEFAULT DRIVE STA CDISK MOV C,A ;SEND TO THE CCP JMP CCP+3 ;GO TO CPM ; BOOT: IN DCTRL ;SEE IF AUTO-BOOT IN PROGRESSTOR MVI A,BIOS/256 SUB H ;SEE IF ENOUGH LOADED IN ANI 0FCH JNZ LOAD2 ;JUMP IF MORE NEEDED ; ;END OF LOAD OPERATION, SEI H,PRMTBL+1 ;POINT TO SELBITS MOV E,A DAD D ;OFFSET THE TABLE POINTER MOV A,M ;GET THE SELBITS ORA A STA SEKSEL JN LDA SECTOR CMP B ;SEE IF READY TO STEP IN JC LOAD3 LDA TRACK INR A STA TRACK IN BCTRL ;SET THE NEW SPT VALUE ANI; ;SELECT DISK GIVEN BY REGISTER C SELDSK: MOV A,C STA SEKDSK SELDSKA: LXI H,0 ;ERROR RETURN CODE CPI 4 ;MUST BE BETWEENRETRIES LOAD1: XRA A MOV H,A ;SET THE UNIT AND TRACK MOV L,A SHLD DISKNO LXI H,0D002H ;SET THE SIDE AND SECTOR SHLD  ANI 40H ;ISOLATE THE BOOT BIT JNZ BOOTA ;JUMP IF NOT AUTO-BOOT MVI A,0FH ;SET MODEM CONTROL REGISTER OUT SMDMCT MVI AT PARAMETERS AND GO TO CP/M BOOT0: MVI A,JMP ;GET A JUMP OP CODE STA WBOOTV ;RESET THE JUMP VECTORS STA BDOSV LXI H,WBOOTZ SET4 ;JUMP IF ALREADY ESTABLISHED XCHG ;ELSE, ESTABLISH NEW DISK INR L ;INSURE LUNIT<>CUNIT SHLD LUNIT ; TO FORCE A RE 2 ;SEE IF MINI OR MAXI JZ LOAD2A ;CURRENT VALUE GOOD FOR MAXI, JUMP LDA CUNIT ;SEE IF DOUBLE DENSITY ANI 40H JNZ LOAD2A 0 AND 3 RNC ;NO CARRY IF 4,5,... ;DISK NUMBER IS IN THE PROPER RANGE ;COMPUTE PROPER DISK PARAMETER HEADER ADDRESS SELDSKSECTOR MVI B,12 ;ZERO OUT PRMTBL LXI H,PRMTBL LOAD1A: MOV M,A INX H DCR B JNZ LOAD1A PUSH B MOV C,A CALL SELDSK,83H ;SET BAUD RATE DIVISOR ACCESS OUT SLCTRL MVI A,SBAUD/256 ;SET DIVISOR HIGH BYTE OUT SINTEN MVI A,SBAUD MOD 256 O' AD ADDRESS LHLD DISKNO ;FIRST, SAVE CURRENT DISK ASSIGNMENTS XTHL ;SAVE IN THE STACK PUSH H LHLD SECTOR XTHL PUSH HSECTOR POP H XTHL SHLD DISKNO SET4: POP H MOV A,C RET ; ;SET TRACK GIVEN BY REGISTER C SETTRK: MOV A,C STA SEKTRENTRIES DAD D DAD D DAD D SETUP3: DAD D ;OFFSET TABLE ADDRESS DCR C JP SETUP3 SET3: XCHG ;SAVE THE POINTER POP H  C,0FFH ;GET A -1 SECT2: INR C ;BUILD SECTOR OFFSET IN (C) SUB M JNC SECT2 ;LOOP TIL OFFSET IS BUILT INX H ;POINT TO SKEW ;ALSO SAVE IN REGISTER LXI D,4 ;ADDRESS TABLE ENTRY OFFSET LXI H,MSELTBL-4 ;MINI TABLE ADDRESS MOV A,B ;REGET THE SELBITADD E MOV E,A ;TABLE OFFSET NOW IN (D,E) LXI H,PRMTBL+2 DAD D MOV D,M ;SECTOR SIZE NOW IN (D) PUSH D ;SAVE FOR LATER U MOV A,C ;REGET DESIRED UNIT STA DISKNO ;SET NEW DISK NUMBER MVI A,0D0H ;SELECT SIDE 0 OF NEW DISK STA SIDE PUSH B PK RET ; ;SET SECTOR GIVEN BY REGISTER C SETSEC: MOV A,C ANI 7FH ;STRIP OFF SIDE INDICATOR DCR A STA SEKSEC MOV A,C  XTHL PUSH H ;GET, RESAVE DP BLOCK POINTER LDAX D ;MOVE THE TABLE ENTRIES MOV M,A INX D INX H LDAX D MOV M,A IN FACTOR XRA A ; AND GET A ZERO SECT3: ADD M ;BUILD THE SKEWED SECTOR NUMBER DCR E JP SECT3 SUB M ADD C ;ADD ON THE OFS ANI 10H ;ISOLATE THE MINI DRIVE BIT JZ SETUP1 ;JUMP IF MINI LXI H,SELTBL-4 ; ELSE, SET THE 8" TABLE ADDRESS IN BCTRLSE MOV A,C ;GET THE DESIRED SECTOR STA CPMSEC RAL SECT0: ORA A ;CONVERT TO PHYSICAL SECTOR NUMBER RAR DCR D JP SECTUSH D ;SAVE THE REGISTERS CALL IDRD ;FIND OUT WHAT IS OUT THERE POP H ;REGET SELECT TABLE ADDRESS DCX H ;POINT TO STEP RAT;REGET SECTOR NUMBER RAL ;ISOLATE SIDE BIT MVI A,0D0H ;SET UP SIDE SELECT BITS JNC SETSEC1 MVI A,90H ;SELECT SIDE 1 SEX D PUSH D ;SAVE IT FOR A MOMENT LXI D,9 DAD D ;OFFSET THE POINTER POP D ;REGET TABLE ADDRESS LDAX D ;MOVE THE TABLE EFSET SECT4: SUB D ;INSURE NUMBER IS IN RANGE JNC SECT4 ADD D SECT5: MOV L,A ;MOVE SKEWED NUMBER OVER TO (L) INR A ;SET P ;CHECK FOR DOUBLE SIDED DISK ANI 40H ;ISOLATE TWO-SIDED BIT JNZ SETUP1 ;JUMP IF SINGLE-SIDED LXI H,SELTBLA-4 SETUP1: MOV0 POP D POP H ;REGET TABLE ADDRESS CMP M ;SEE IF SIDE 1 JC SECT1 ;JUMP IF SIDE 0 MVI B,80H ;FLAG BIT FOR SIDE 1 SUB E LDA STPRAT ;SET THE STEP RATE MOV M,A ;SAVE THE STEP RATE INX H LDA CUNIT ;GET THE SELBITS STA SEKSEL MOV B,A ;SAVTSEC1: STA SEKSID ;SET THE SIDE SELECT BITS RET ; ;TRANSLATE THE SECTOR GIVEN BY BC USING THE ;TRANSLATE TABLE GIVEN BY DE NTRIES MOV M,A INX D INX H LDAX D MOV M,A POP H ;RESTORE THE CURRENT DRIVE POP B ;RESTORE REGISTERS XTHL SHLD YHS SECTOR FOR ANTIC. LOGIC STA NXTSCT XRA A ;CONVERT PHYSICAL TO LOGICAL SECTOR MOV H,A SECT6: DCR B JM SECT7 ;JUMP IF A,B ;CHECK FOR DOUBLE DENSITY ANI 40H ;ISOLATE THE BIT JZ SETUP3 ;JUMP IF SINGLE-DENSITY DAD D ;OFFSET TO DOUBLE DENSITY M SECT1: PUSH B MOV B,D ;SAVE SECTOR SIZE IN (B) MOV E,A ;SET UP TO BUILD SKEW MOV D,M ;GET THE SKEW FACTOR INX H MVIE THE SELBITS MOV M,A ;SET THE TABLE INX H ;POINT TO SECTOR SIZE ENTRY LDA IDSV+3 ;SET THE SECTOR SIZE MOV M,A MOV C,A SECTRAN: PUSH D ;SAVE THE TABLE ADDRESS LDA SEKDSK ;FIND THE SECTOR SIZE MOV E,A MOV D,B ;GET A ZERO FROM (B) ADD A (  DONE STC ADC A ;BUILD THE MASK DAD H ;OFFSET THE SECTOR NUMBER JMP SECT6 SECT7: POP B ANA C ;STRIP OUT THE SUB-SECTOMVI M,1 ;MARK IT ACTIVE FOR NEXT TIME JZ FILHST ;FILL THE HOST BUFFER IF EMPTY ; CALL PHYSEC ;SET THE PHYSICAL SECTOR NUMBELOCK STA UNACNT ;SAVE THE SECTOR COUNT ; CHKUNA: LXI H,UNACNT ;SEE IF ANY UNALLOCATED SPACE AVAILABLE XRA A CMP M JZ  D ;GET A BYTE MOV M,A ;PUT IT INX D INX H DCR C ;LOOP CONTROL JNZ RWMOVE ; LDA WRTYPE ;GET WRITE TYPE DCR A ;SEEWRITE OPERATION STA READOP MOV A,C ;WRITE TYPE FROM CP/M STA WRTYPE CPI WRUAL ;SEE IF UNALLOCATED JNZ CHKUNA ;JUMP IF  SIZE XRA A ;GET A ZERO MATCH1: ADC A ;BUILD SECTOR MASK DCR H STC JP MATCH1 ;LOOP TIL MASK IS BUILT LHLD SEKSEC ANR ORA L ;ADD IT TO THE SKEWED SECTOR INR A ORA B ;ADD ON THE SIDE SELECT BIT MOV L,A RET ; ; ;SET DMA ADDRESS GIVENR LXI D,DISKNO CALL COMP ;COMPARE THE UNITS JZ MATCH ; NOMATCH: LDA HSTWRT ;SEE IF HOST WRITTEN ORA A CNZ DWRITA ;PUALLOC1 ;JUMP IF NOT DCR M ;ELSE, USE SOME OF IT CALL PHYSEC ;SET THE PHYSICAL SECTOR NUMBER LXI D,UNADSK CALL COMP ;COMP IF DIRECTORY ENTRY LDA ERFLAG ;GET THE ERROR FLAG RNZ ;DONE IF NOT DIRECTORY ENTRY ; ORA A ;SEE IF ANY ERRORS RNZ ;RNOT ; ; UNALLOCATED WRITE, SET PARAMETERS CALL PHYSEC ;CONVERT TO PHYSICAL SECTOR LHLD SEKHST ;SET PHYSICAL SECTOR AND SIDA L ;FIND THE RELATIVE SECTOR LXI H,DBUF-80H ;BUILD ADDRESS FOR CPM SECTOR LXI B,80H ;# BYTES IN LOGICAL SECTOR MATCH2: DAD BY REGISTERS B AND C SETDMA: MOV L,C ;LOW ORDER ADDRESS MOV H,B ;HIGH ORDER ADDRESS SHLD DMAAD ;SAVE THE ADDRESS RET ; RGE THE BUFFER IF NEED BE FILHST: CALL PHYSEC MOV A,D STA IDSV+3 LHLD SEKDSK ;SET UP TO FILL THE BUFFER SHLD DISKNO LARE THE UNITS JZ NXTSEC ;GO DO THE WRITE ; ALLOC: XRA A ;ALLOCATED WRITE REQUIRES PREREAD STA UNACNT ALLOC1: INR A ALLOCETURN IF SO STA HSTWRT ;RESET HOST WRITTEN DWRITA: CALL DWRITE ;UPDATE THE DIRECTORY LXI H,ERFLAG ORA M ;GET THE ERROR INE SHLD UNASEC LHLD SEKDSK ;GET THE DISK NUMBER SHLD UNADSK ;SAVE IT FOR UNALLOCATED WRITE MOV A,L CALL DPFND ;GET DP T B DCR A JP MATCH2 XCHG ;BUFFER ADDRESS TO (D,E) LHLD DMAAD ;GET DMA ADDRESS LDA READOP ;SEE IF READ OR WRITE ORA A ;MOVE TO THE TRACK 00 POSITION OF CURRENT DRIVE HOME: SUB A STA SEKTRK RET ; ;DEBLOCK ROUTINES ; READ: MVI A,WRUAL ;TRHLD SEKHST ;GET THE SECTOR, SIDE SELECT SHLD SECTOR ;SET THEM LDA SEKSEL STA CUNIT LDA RSFLAG ORA A CNZ DREAD ;FILL 2: STA RSFLAG ; RWOPER: XRA A ;GET A ZERO STA ERFLAG ;RESET THE ERROR FLAG ; LXI H,HSTACT ;SEE IF HOST ACTIVE ORA M DICATIONS MOV M,A ;STORE THE ERROR FLAGS RET ; ; UNALLOCATED WRITE NEXT SECTOR ANTICIPATION LOGIC ; NXTSEC: LDA SEKDSK ;ABLE ADDRESS INX D ;OFFSET TO THE BLOCK MASK INX D INX D LDAX D ;GET THE BLOCK MASK INR A ;(A) = LOGICAL SECTORS PER B JNZ RWMOVE ;POINTERS OK IF READ ; XCHG ;ELSE, SWAP THEM INR A ; AND MARK WRITE OPERATION STA HSTWRT ; RWMOVE: LDAXEAT READ AS UNALLOCATED STA WRTYPE STA READOP ;SET A READ OPERATION JMP ALLOC ;GO DO THE READ ; WRITE: XRA A ;FLAG AS A IT IF NEED BE LXI H,ERFLAG ORA M MOV M,A XRA A ;RESET PENDING WRITE FLAG STA HSTWRT ; MATCH: LHLD IDSV+2 ;GET SECTOR) FIND ADDRESS OF DP TABLE CALL DPFND LDA CPMSEC ;GET LAST LOGICAL SECTOR NUMBER INR A XCHG ;DP TABLE ADDRESS TO (H,L)  DISK ACCESSES. ; IN ALL CASES, ONE SECTOR OF DATA IS TRANSFERRED. ; IF THE DISK HAS NOT BEEN PREVIOUSLY ACCESSED, ; THESE ROGET BASE ADDRESS DAD D ;POINT TO SECTOR SIZE MOV D,M ;GET THE SECTOR SIZE PUSH D LDA SEKSEC ;GET THE LOGICAL SECTOR NUMB: IN DDATA ;READ THE DATA MOV M,A ;PUT INTO BUFFER INX H ;INCREMENT MEMORY POINTER IN DDATA ;READ THE DATA MOV M,A ;PUT  SHLD UNASEC ;SET THE NEXT SIDE, SECTOR XRA A ;GET A ZERO JMP ALLOC2 ;GO BACK TO MAINSTREAM ; ; FIND ADDRESS OF DISK PARAMT NECESSARILY ; CORRESPOND WITH THE A REGISTER CONTENT. ; ; THESE ROUTINES ARE CP/M COMPATABLE, AND MAY BE USED ; AS PART OFCMP M ;SEE IF OVERFLOW JNC NXTSC2 ;JUMP IF SO LXI H,-11 ;SAME TRACK, NOW SEE WHICH SIDE/SECTOR DAD D MOV E,M ;GET ADDRESUTINES WILL AUTOMATICALLY DETERMINE THE ; DISK TYPE (8" OR 5"), SINGLE OR DOUBLE DENSITY, ; AND SECTOR SIZE. ; ; BEFORE THE ER RAL PHYSC1: ORA A ;RESET THE CARRY BIT RAR ;CONVERT TO PHYSICAL SECTOR DCR D JP PHYSC1 INR A ;(A) NOW HAS PHYSICAINTO BUFFER INX H ;INCREMENT MEMORY POINTER IN DDATA ;READ THE DATA MOV M,A ;PUT INTO BUFFER INX H ;INCREMENT MEMORY POIETER TABLE ; DPFND: LXI H,DPBASE-6 ;DEVELOP ADDRESS OF DPTABLE LXI D,16 DPFND1: DAD D DCR A JP DPFND1 MOV E,M ;PULL  THE BIOS. ; ; DREAD: DB 3EH ;SIM. MVI A INSTR DWRITE: XRA A ;SET WRITE FLAG STA RWFLG ;SAVE IT FOR LATER USE MVI B,10 ;S OF SKEW TABLE INX H MOV D,M MOV C,A ;SET UP TO CALL SECTRAN MVI B,0 CALL SECTRAN ;TRANSLATE THE SECTOR MVI H,0D0H DESIRED DATA IS TRANSFERRED, THE DESIRED ; TRACK IS SEEKED OUT, THE DESIRED SECTOR AND SIDE IS ; SET, THEN THE ACTUAL DATA TRAL SECTOR # STA SEKHST ;SET IT POP D RET ; ;COMPARE THE UNITS COMP: LXI H,SEKDSK MVI B,4 COMP1: LDAX D SUB M RNZ NTER IN DDATA ;READ THE DATA MOV M,A ;PUT INTO BUFFER INX H ;INCREMENT MEMORY POINTER DCR B JNZ READ1 CALL EOJ ANIUP THE ADDRESS INX H MOV D,M RET ; ; LOGICAL TO PHYSICAL SECTOR TRANSLATION ROUTINE PHYSEC: LDA SEKDSK ;GET THE LOGICALNUMBER OF RETRIES AGN: PUSH B CALL SEEK CZ RDWR READ3: POP B RZ DCR B JNZ AGN RET ; RDWR: MOV E,A ;SAVE COMMAND ;SIDE 0 SELECT JP NXTSC1 ;JUMP IF SIDE 0 MVI H,090H ;ELSE, SET SIDE 1 NXTSC1: LDA NXTSCT ;GET THE NEXT PHYSICAL SECTOR MONSFER. ; ; UP TO TEN TRIES WILL BE ATTEMPTED BEFORE THE DATA ; TRANSFER IS ABORTED. ON RETURN TO THE CALLING ; ROUTINE, THE ;DONE IF NO COMPARE INX H ;POINT TO SEKTRK INX D DCR B JNZ COMP1 RET ; ; ; THE FOLLOWING ROUTINES DO THE PRIMITIVE 9CH ;ISOLATE READ ERROR BITS RET ; WRDAT: ORI 20H ;ADD WRITE COMMAND STA CMND OUT DCMMD ;DISK COMMAND PORT WRT1: MOV A SECTOR NUMBER MOV E,A ;SAVE IT MVI D,0 ADD A ;MULTIPLY BY 3 ADD E MOV E,A ;TABLE OFFSET NOW BUILT LXI H,PRMTBL+2 ; LDA RWFLG ORA A MOV A,E ;REGET THE COMMAND JZ WRDAT ;WRITE IF ZERO RDAT: STA CMND OUT DCMMD ;DISK COMMAND PORT READ1V L,A ;SET THE SECTOR JMP NXTSC3 ; NXTSC2: LXI H,UNATRK ;SET FOR NEXT TRACK INR M LXI H,0D001H ;SIDE 0 SECTOR 1 NXTSC3: A REGISTER WILL CONTAIN A ZERO IF THE ; OPERATION WAS SUCCESSFUL, OR NON-ZERO IF NOT ; SUCCESSFUL. THE FLAG REGISTER WILL NO* ,M ;GET DATA FROM BUFFER OUT DDATA ;OUTPUT IT INX H ;ADVANCE MEMORY POINTER MOV A,M ;GET DATA FROM BUFFER OUT DDATA ;OUTI B,58H ;BUILD A STEP-IN COMMAND CALL EOJA IDRD: LHLD LUNIT MOV A,H ;GET THE CUNIT VALUE CMP L ;SEE IF SAME AS LUNIT RZRT ANI 20H ;SEE IF HEAD IS LOADED MVI A,4 JZ RDWRT1 ;JUMP IF NOT XRA A ;ELSE, RESET THE HEAD LOAD FLAG RDWRT1: ADI 88H O POSITION DCR B JNZ SET1 ;LOOP TIL BIT IS IN POSITION ORI 20H ;ADD ON MOTOR ON BIT MOV M,A ;SAVE IT OUT DCTRL ;SELECT SEEK: CALL IDRD ;INSURE HEADER HAS BEEN READ CNZ EOJB ;RESTORE THE DRIVE IF ERROR RM ;DONE IF NO DRIVE SEEK1: LDA SECTOR ACK REGISTER CPI 2 ;INSURE NOT ON TRACK 0 OR 1 JC IDRD5 ;JUMP IF SO MOV A,M ;REGET SELBITS STA LUNIT ;UPDATE LAST USED UPUT IT INX H ;ADVANCE MEMORY POINTER MOV A,M ;GET DATA FROM BUFFER OUT DDATA ;OUTPUT IT INX H ;ADVANCE MEMORY POINTER  ;RETURN IF SO IDRD1: MVI C,80H ;SET THE AUTO-WAIT BIT CALL SETUP CALL EOJ1 ;INSURE A DRIVE IS THERE RM ;ERROR IF NOT ;BUILD A READ SECTOR COMMAND LHLD HSTBUF ;GET THE DMA ADDRESS MOV C,A ;SAVE THE COMMAND IN C IN DTRCK ;SEE IF ON TRACK 0  THE DRIVE CALL EOJB ;RESTORE THE DRIVE RM ;DONE IF DRIVE NOT READY IN BCTRL ;READ THE MINI TRK00 BIT RAR ;ISOLATE IT ;SET THE SECTOR OUT DSCTR ;DISK SECTOR PORT IN DTRCK ;DISK TRACK PORT MOV C,A ;SAVE IT LDA TRACK ;GET DESIRED TRACK CMNIT XRA A ;RESET ERROR FLAGS RET ; ;SET UP DRIVE NUMBER SETUP: LXI H,CUNIT ;SEE IF DRIVE HAS BEEN ACTIVE MOV A,M ;GET TMOV A,M ;GET DATA FROM BUFFER OUT DDATA ;OUTPUT IT INX H ;ADVANCE MEMORY POINTER DCR B JNZ WRT1 JMP EOJ ; EOJB: MVI  PUSH H ;SAVE POINTER LXI H,IDSV ;SET UP TO READ ADDRESS MVI B,2 ;SET UP TO READ 6(8) BYTES OF DATA MVI A,0C4H ;READ ADDRE ORA A JZ RDWRT3 ;SET SECTOR SIZE = 0 LDA IDSV+3 ;GET THE SECTOR SIZE RDWRT3: MOV B,A ;PUT IN B FOR LOOP CONTROL MVI A,10 MVI A,STEP5 ;MINI STEP RATE BITS JNC SET2 ;JUMP IF MINI DRIVE MVI A,10H ;ELSE, ADD ON MAXI BIT ORA M MOV M,A MVI A,SP C JZ RDWRT ;JUMP IF NO SEEK NEEDED OUT DDATA ;SET THE SEEK TRACK MVI B,1CH ;BUILD THE SEEK COMMAND CALL EOJA ;DO THE SHE SELBITS ORA A ;SEE IF SET UP YET JNZ SU0 ;YES, SKIP INIT CODE ; SETIT: LDA DISKNO ;GET THE DESIRED DRIVE MOV B,A ;SAVB,8 ;BASIS OF RESTORE COMMAND EOJA: LDA STPRAT ;GET THE STEP RATE BITS ORA B ;ADD ON THE COMMAND STA CMND OUT DCMMD ;DO TSS COMMAND CALL RDAT POP H ;RESTORE POINTER JZ IDRD2 ;JUMP IF GOOD READ MVI A,40H ;SEE IF DDEN IS SET CMP M RC ;TAKH ;SECTOR BASE LENGTH RDWRT0: ADD A DCR B JP RDWRT0 MOV B,A MOV A,C RDWRT2: CMP A ;CLEAR THE FLAGS RET ; IDRD5: MVTEP8 ;SET MAXI STEP RATE SET2: STA STPRAT SU0: IN DTRCK ;ELSE, SEE IF TRACK ZERO ORA A IN DDATA ;CLEAR OUT ANY JUNK MOV EEK ANI 98H ;SEEK ERROR MASK RNZ ;DONE IF SEEK ERROR RDWRT: MVI C,80H ;AUTO-WAIT BIT CALL SETUP IN DFLAG ;DISK FLAG POE IN WORK REGISTER INR B ;PREPARE TO CONVERT TO SELBITS XRA A ;ZERO TO A STC ;DRIVE SELECT BIT SET1: RAL ;SHIFT BIT INTHE COMMAND EOJ: IN DFLAG ;DISK FLAG PORT RAR JNC EOJ EOJ1: IN DSTAT ;GET THE DISK STATUS STA STATUS ANI 0FCH RET ; E THE ERROR IF SO ORA M ;ELSE, TRY DDEN MOV M,A JMP IDRD ; IDRD2: IN DSCTR ;GET THE TRACK NUMBER OUT DTRCK ;SET THE TR+ A,M ;REGET THE SELBITS JNZ SU1 ANI 0BFH ;INSURE DDEN IS RESET SU1: ORA C ;ADD ON AUTOWAIT BIT OUT DCTRL ;OUTPUT THE SELBI MASK DB 1 ;EXTENT MASK DW 149 ;BLOCKS PER DISKETTE DW 63 ;# DIRCTORY ENTRIES DB 128 ;ALLOC 0 DB 0 ;ALLOC 1 DW 16 ;DB 7 ;BLOCK MASK DB 0 ;EXTENT MASK DW 242 ;BLOCKS PER DISKETTE DW 63 ;# DIRCTORY ENTRIES DB 192 ;ALLOC 0 DB 0 ;ALLOC 1 R SIZE DW 2 ;SYSTEM TRACK OFFSET ; SELTBLA: DW T826,DP8D1 DW T815,DP8D2 DW T88,DP8D3 DW T84,DP8D3 DW T848,DP8D0A DW 0,0 DW DIRBF,0 DW CHK02,ALL02 ;DISK PARAMETER HEADER FOR DISK 03 DW 0,0 DW 0,0 DW DIRBF,0 DW CHK03,ALL03 ; ;PAR VECTOR SIZE DW 2 ;SYSTEM TRACK OFFSET DP8D2: DW 60 ;SECTORS PER TRACK DB 5 ;BLOCK SHIFT FACTOR DB 31 ;BLOCK MASK DB 3 TS LDA SIDE ;SET THE SIDE SELECT OUT BCTRL RET ; BOTMSG: DB 7,'CANNOT BOO','T'+80H,0DH,8AH LOGMSG: DB MSIZE/10+'0',MSIZIR CHECK VECTOR SIZE DW 2 ;SYSTEM TRACK OFFSET DP8D0: DW 48 ;SECTORS PER TRACK DB 4 ;BLOCK SHIFT FACTOR DB 15 ;BLOCK MASK DW 16 ;DIR CHECK VECTOR SIZE DW 2 ;SYSTEM TRACK OFFSET DP8S1: DW 30 ;SECTORS PER TRACK DB 4 ;BLOCK SHIFT FACTOR DB 15 ;W T826,DP8D1A DW T815,DP8D2A DW T88,DP8D3A ; DP8D0A: DW 96 ;SECTORS PER TRACK DB 5 ;BLOCK SHIFT FACTOR DB 31 ;BLOCK MAAMETER TABLE FOR DRIVE-UNIQUE CONSTANTS PRMTBL: DB 0,0,0 ;DRIV 0 STP RAT, SLCT BYTS, SCTR SZ DB 0,0,0 ; 1 DB 0,0,0 ; ;EXTENT MASK DW 139 ;BLOCKS PER DISKETTE DW 127 ;# DIRECTORY ENTRIES DB 128 ;ALLOC 0 DB 0 ;ALLOC 1 DW 32 ;DIR CHECK VEE MOD 10 + '0' DB 'k CP/M Vers ' DB VERS/10+'0','.',VERS MOD 10+'0' DB 0DH,8AH ; ; ;FIXED DATA TABLES FOR FOUR-DRIVE ST DB 1 ;EXTENT MASK DW 195 ;BLOCKS PER DISKETTE DW 63 ;# DIRECTORY ENTRIES DB 128 ;ALLOC 0 DB 0 ;ALLOC 1 DW 16 ;DIR CBLOCK MASK DB 1 ;EXTENT MASK DW 139 ;BLOCKS PER DISKETTE DW 63 ;# DIRCTORY ENTRIES DB 128 ;ALLOC 0 DB 0 ;ALLOC 1 DW SK DB 3 ;EXTENT MASK DW 225 ;BLOCKS PER DISKETTE DW 127 ;# DIRECTORY ENTRIES DB 128 ;ALLOC 0 DB 0 ;ALLOC 1 DW 32 ;DI 2 DB 0,0,0 ; 3 ; ;SECTOR TRANSLATE VECTOR ; SELTBL: DW T826,DP8S0 DW T815,DP8S1 DW T88,DP8S2 DW T84,DP8S2 CTOR SIZE DW 2 ;SYSTEM TRACK OFFSET DP8D3: DW 64 ;SECTORS PER TRACK DB 4 ;BLOCK SHIFT FACTOR DB 15 ;BLOCK MASK DB 0 ;EXANDARD ;IBM-COMPATIBLE 8" DISKS ;DISK PARAMETER HEADER FOR DISK 00 DPBASE: DW 0,0 DW 0,0 DW DIRBF,0 DW CHK00,ALL00 ;DIHECK VECTOR SIZE DW 2 ;SYSTEM TRACK OFFSET DP8D1: DW 52 ;SECTORS PER TRACK DB 4 ;BLOCK SHIFT FACTOR DB 15 ;BLOCK MASK D16 ;DIR CHECK VECTOR SIZE DW 2 ;SYSTEM TRACK OFFSET DP8S2: DW 32 ;SECTORS PER TRACK DB 4 ;BLOCK SHIFT FACTOR DB 15 ;BLOCKR CHECK VECTOR SIZE DW 2 ;SYSTEM TRACK OFFSET DP8D1A: DW 104 ;SECTORS PER TRACK DB 5 ;BLOCK SHIFT FACTOR DB 31 ;BLOCK MAS DW T848,DP8D0 DW T826,DP8D1 DW T815,DP8D2 DW T88,DP8D3 ; DP8S0: DW 26 ;SECTORS PER TRACK DB 3 ;BLOCK SHIFT FACTOR DTENT MASK DW 299 ;BLOCKS PER DISKETTE DW 127 ;# DIRECTORY ENTRIES DB 192 ;ALLOC 0 DB 0 ;ALLOC 1 DW 32 ;DIR CHECK VECTOSK PARAMETER HEADER FOR DISK 01 DW 0,0 DW 0,0 DW DIRBF,0 DW CHK01,ALL01 ;DISK PARAMETER HEADER FOR DISK 02 DW 0,0 DB 1 ;EXTENT MASK DW 242 ;BLOCKS PER DISKETTE DW 63 ;# DIRECTORY ENTRIES DB 128 ;ALLOC 0 DB 0 ;ALLOC 1 DW 16 ;DIR CHECK, K DB 3 ;EXTENT MASK DW 242 ;BLOCKS PER DISKETTE DW 127 ;# DIRECTORY ENTRIES DB 128 ;ALLOC 0 DB 0 ;ALLOC 1 DW 32 ;DIR29 ;SECTORS PER TRACK DB 3 ;BLOCK SHIFT FACTOR DB 7 ;BLOCK MASK DB 0 ;EXTENT MASK DW 115 ;BLOCKS PER DISKETTE DW 63 ;# DP5S1: DW 20 ;SECTORS PER TRACK DB 3 ;BLOCK SHIFT FACTOR DB 7 ;BLOCK MASK DB 0 ;EXTENT MASK DW 79 ;BLOCKS PER DISKETTE1 ACTIVE ; CSTS: LDA IOBYTE ANI 3 ;ISOLATE CONSOLE ASGT JZ TTST ;TTY ACTIVE CPI 2 JM CRTST ;CRT ACTIVE JNZ CUST1 ;USHECK VECTOR SIZE DW 2 ;SYSTEM TRACK OFFSET ; T848 DB 48,48,1 T826 DB 26,13,6 T815 DB 15,15,4 T88 DB 8,8,3 T84 DB 4,2,2  ENTRIES DB 128 ;ALLOC 0 DB 0 ;ALLOC 1 DW 16 ;DIR CHECK VECTOR SIZE DW 3 ;SYSTEM TRACK OFFSET T529 DB 29,29,7 T518 DB  CHECK VECTOR SIZE DW 2 ;SYSTEM TRACK OFFSET DP8D2A: DW 120 ;SECTORS PER TRACK DB 6 ;BLOCK SHIFT FACTOR DB 63 ;BLOCK MASK DIRECTORY ENTRIES DB 192 ;ALLOC 0 DB 0 ;ALLOC 1 DW 16 ;DIR CHECK VECTOR SIZE DW 3 ;SYSTEM TRACK OFFSET DP5D1: DW 36 ;S DW 63 ;# DIRECTORY ENTRIES DB 192 ;ALLOC 0 DB 0 ;ALLOC 1 DW 16 ;DIR CHECK VECTOR SIZE DW 3 ;SYSTEM TRACK OFFSET DP5SER CONSOLE 1 ACTIVE ; BATST: LDA IOBYTE ANI 0CH ;ISOLATE BATCH ASGT JZ TTST ;TTY ACTIVE CPI 8 JM PTRST ;PAPER TAPE REA; MSELTBL: DW T518,DP5S0 DW T510,DP5S1 DW T55,DP5S1 DW T52,DP5S3 DW T529,DP5D0 DW T518,DP5D1 DW T510,DP5D2 DW T5518,9,4 T510 DB 10,10,3 T55 DB 5,5,2 T52 DB 2,2,1 ; ;END OF FIXED TABLES ; ; CO: LDA IOBYTE ANI 3 ;ISOLATE CONSOLE ASGT DB 7 ;EXTENT MASK DW 139 ;BLOCKS PER DISKETTE DW 127 ;# DIRECTORY ENTRIES DB 128 ;ALLOC 0 DB 0 ;ALLOC 1 DW 32 ;DIR ECTORS PER TRACK DB 4 ;BLOCK SHIFT FACTOR DB 15 ;BLOCK MASK DB 1 ;EXTENT MASK DW 71 ;BLOCKS PER DISKETTE DW 63 ;# DIRE3: DW 16 ;SECTORS PER TRACK DB 3 ;BLOCK SHIFT FACTOR DB 7 ;BLOCK MASK DB 0 ;EXTENT MASK DW 63 ;BLOCKS PER DISKETTE DW DER ACTIVE JZ RUST1 ;USER READER 1 ACTIVE JMP RUST2 ;USER READER 2 ACTIVE ; CI: LDA IOBYTE ANI 3 ;ISOLATE CONSOLE ASGT ,DP5D2 DP5S0: DW 18 ;SECTORS PER TRACK DB 3 ;BLOCK SHIFT FACTOR DB 7 ;BLOCK MASK DB 0 ;EXTENT MASK DW 71 ;BLOCKS PER DI JZ TTYOUT ;VB1 ACTIVE CPI 2 JM CRTOUT ;CRT ACTIVE JNZ CUSO1 ;USER CONSOLE 1 ACTIVE ; LO: LDA IOBYTE ANI 0C0H ;ISOLACHECK VECTOR SIZE DW 2 ;SYSTEM TRACK OFFSET DP8D3A: DW 128 ;SECTORS PER TRACK DB 6 ;BLOCK SHIFT FACTOR DB 63 ;BLOCK MASK CTORY ENTRIES DB 128 ;ALLOC 0 DB 0 ;ALLOC 1 DW 16 ;DIR CHECK VECTOR SIZE DW 3 ;SYSTEM TRACK OFFSET DP5D2: DW 40 ;SECTOR63 ;# DIRECTORY ENTRIES DB 192 ;ALLOC 0 DB 0 ;ALLOC 1 DW 16 ;DIR CHECK VECTOR SIZE DW 3 ;SYSTEM TRACK OFFSET DP5D0: DW  JZ TTYIN ;KBD ACTIVE CPI 2 JM CRTIN ;CRT ACTIVE JNZ CUSI1 ;USER CONSOLE 1 ACTIVE ; RI: LDA IOBYTE ANI 0CH ;ISOLATE BASKETTE DW 63 ;# DIRECTORY ENTRIES DB 192 ;ALLOC 0 DB 0 ;ALLOC 1 DW 16 ;DIR CHECK VECTOR SIZE DW 3 ;SYSTEM TRACK OFFSETTE LIST ASGT JZ TTYOUT ;VB1 ACTIVE CPI 80H JM CRTOUT ;CRT ACTIVE JZ LPRT ;LINE PRINTER ACTIVE JMP LUSE1 ;USER PRINTER  DB 7 ;EXTENT MASK DW 149 ;BLOCKS PER DISKETTE DW 127 ;# DIRECTORY ENTRIES DB 128 ;ALLOC 0 DB 0 ;ALLOC 1 DW 32 ;DIR CS PER TRACK DB 4 ;BLOCK SHIFT FACTOR DB 15 ;BLOCK MASK DB 1 ;EXTENT MASK DW 79 ;BLOCKS PER DISKETTE DW 63 ;# DIRECTORY- TCH ASGT JZ TTYRDR ;TTY ACTIVE CPI 8 JM PTRIN ;PAPER TAPE READER ACTIVE JZ RUSI1 ;USER READER 1 ACTIVE JMP RUSI2 ;USER RESTART ERROR MSG COMERR: CALL PRTWD ;PRINT IT ON NEW LINE JMP WBOOTV ;GO TO WARM BOOT ; RSTMSG: DB 'RST ER','R'+80H CRMS ; ROUTINE CRLF GENERATES A CARRIAGE RETURN, LINE FEED ; SEQUENCE ON THE CURRENT CONSOLE TO START A NEW LINE ; IT INCLUDES TWIGNED HIGH SPEED PUNCH HSPST: EQU IOER ;UNASSIGNED HIGH SPEED PUNCH STATUS PUSO1: EQU IOER ;UNASSIGNED USER PUNCH 1 PUST1: EQTS AN ASCII STRING ONTO THE CONSOLE. ; THE STRING MUST BE TERMINATED BY BIT 7 SET IN THE ; LAST CHARACTER OF THE STRING. THE RET ; TTYOUT: CALL TTOST ;GET 8250 LINE STATUS JZ TTYOUT ;WAIT UNTIL ONE OF THE REGISTERS EMPTIES MOV A,C ;MOVE THE DATA O READER 2 ACTIVE ; LSTAT: LDA IOBYTE ANI 0C0H ;ISOLATE THE LIST DEVICE ASSIGNMENT JZ TTOST CPI 80H JM HSPST JZ PUST1G: DB CR,LF,0,80H ; ; I/O DRIVERS FOR THE 8250 ASYNC COMM ELEMENT ; TTST: IN SLSTAT ;GET 8250 LINE STATUS ANI 1 ;SEE IF REO NULL CHARACTERS FOR TTY TYPE ; DEVICES FOR THE HEAD MOVEMENT TIME. ; CRLF: PUSH H ;SAVE THE CONTENTS OF (H,L) CRLFA: LXI HU IOER ;UNASSIGNED USER PUNCH 1 STATUS PUSO2: EQU IOER ;UNASSIGNED USER PUNCH 2 PUST2: EQU IOER ;UNASSIGNED USER PUNCH 2 STATUSTRING WILL START ; A NEW LINE (EP = PRTWD) OR CONTINUE ON THE SAME ; LINE (EP = PRTWA) ; PRTWD: CALL CRLF ;START A NEW LINEVER OUT SDATA ;OUTPUT THE DATA RET ; ; EQUATES FOR ADDITIONAL CONSOLE DEVICES ; CRTIN: EQU IOER CRTOUT: EQU IOER CRTST JMP PUST2 ; PO: LDA IOBYTE ANI 30H ;ISOLATE PUNCH ASGT JZ TTPNCH ;TTY ACTIVE CPI 20H JM HSP ;HIGH SPEED PUNCH ACTIVCEIVE DATA AVAILABLE RZ ;RETURN IF NOT ADI 0FEH ;FLAG THAT DATA IS AVAILABLE RET ; TTYIN: IN SLSTAT ;GET 8250 LINE STAT,CRMSG ;ADDRESS OF CR,LF MESSAGE CALL PRTWA ; OUTPUT IT POP H ;RESTORE (H,L) RET IOER: XRA A ;RESET IOBYTE STA 3 LXIS ; ; EQUATES FOR ADDITIONAL LIST DEVICES ; LPRT: EQU IOER ;UNASSIGNED LINE PRINTER LUSE1: EQU IOER ;LIST DEVICE 1 = CRT  PRTWA: PUSH B ;SAVE (B,C) PRTA: MOV C,M ;GET NEXT CHARACTER FROM MEMORY CALL CO ;OUTPUT IT INX H ;INCREMENT MEMORY POINTE: EQU IOER CUSI1: EQU IOER ;UNASSIGNED USER CONSOLE (INPTUT) CUSO1: EQU IOER ;UNASSIGNED USER CONSOLE (OUPTUT) CUST1: EQU IOEE JZ PUSO1 ;USER PUNCH 1 ACTIVE JMP PUSO2 ;USER PUNCH 2 ACTIVE ; ; ROUTINE CONI READS THE CONSOLE AND STRIPS OFF THE ASCIIUS RAR ;MOVE RX DATA READY BIT INTO CARRY JNC TTYIN ;LOOP UNTIL DATA IS IN IN SDATA ;READ THE DATA RET ; TTOST: IN SL H,IOMSG ;ADDRESS OF IO ERROR MESSAGE JMP COMERR IOMSG: DB 'I/O ASGT ERROR',CR,LF+80H ; RSTER: LXI H,RSTMSG ;GET ADDRESS OF; ; EQUATES FOR ADDITIONAL PAPER TAPE READER DEVICES ; TTYRDR: EQU TTYIN ;UNASSIGNED TELETYPE PAPER TAPE READER PTRIN: EQU R MOV A,C RLC ;TEST FOR BIT 7 DELIMITER JNC PRTA ;NO DELIMITER, GO DO NEXT CHARACTER PRTB: POP B ;RESTORE (B,C) RET ;R ; ; EQUATES FOR ADDITIONAL PAPER TAPE PUNCH DEVICES ; TTPNCH: EQU TTYOUT ;UNASSIGNED TELETYPE PUNCH HSP: EQU IOER ;UNASS ; PARITY BIT. ; CONI: CALL CI ;GET THE NEXT CHARACTER ANI 7FH ;STRIP OFF THE PARITY BIT RTS: RET ; ; ROUTINE PRTWD PRINSTAT ;GET 8250 LINE STATUS ANI 20H ;ISOLATE TX BUFFER EMPTY BIT RZ ;RETURN IF NOT EMPTY ADI 0BFH ;FLAG THE EMPTY STATE . IOER ;UNASSIGNED HIGH SPEED PAPER TAPE READER PTRST: EQU IOER ;UNASSIGNED HS PTR STATUS RUSI1: EQU IOER ;UNASSIGNED PAPER TAPEå: DS 32 ;CHECK VECTOR 2 CHK03: DS 32 ;CHECK VECTOR 3 ; DBUF: DS 1024 ;DISK BUFFER ; ENDDAT EQU $ ;END OF DATA AREA DATSIZ ew factor" for sector translate ; bls is the data block size (1024,2048,...,16384) ; dks is the disk size in bls increments (wDMAAD: DS 2 ;DIRECT MEMORY ADDRESS ; ; HSTACT: DS 1 HSTWRT: DS 1 ; UNADSK: DS 1 UNATRK: DS 1 UNASEC: DS 1 UNASID: DS 1 def parameter-list-0 ; diskdef parameter-list-1 ; ... ; diskdef parameter-list-n ; endef ; ; where n is the number of logi READER 1 RUST1: EQU IOER ;UNASSIGNED PAPER TAPE READER 1 (STATUS) RUSI2: EQU IOER ;UNASSIGNED PAPER TAPE READER 2 RUST2: EQUåEQU $-BEGDAT;SIZE OF DATA AREA ; CONST: EQU CSTS CONOUT: EQU CO LIST: EQU LO PUNCH: EQU PO READER: EQU RI LISTST: EQU LSTord) ; dir is the number of directory elements (word) ; cks is the number of dir elements to checksum ; ofs is the number of  UNACNT: DS 1 CPMSEC: DS 1 NXTSCT: DS 1 ; ERFLAG: DS 1 RSFLAG: DS 1 READOP: DS 1 WRTYPE: DS 1 ; ;SCRATCH RAM AREA FOR Bcal disk drives attached ; to the CP/M system, and parameter-list-i defines the ; characteristics of the ith drive (i=0,1,..., IOER ;UNASSIGNED PAPER TAPE READER 2 (STATUS) ; SEKDSK: DB 0 SEKTRK: DS 1 SEKHST: DS 1 SEKSID: DS 1 SEKSEC: DS 1 SEKSEL:åAT END tracks to skip (word) ; [0] is an optional 0 which forces 16K/directory entry ; ; for convenience, the form ; dn,dm ; defiDOS USE ; DIRBF: DS 128 ;SCRATCH DIRECTORY AREA ALL00: DS 38 ;ALLOCATION VECTOR 0 ALL01: DS 38 ;ALLOCATION VECTOR 1 ALL02: 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 DS 1 ; ;THE REMAINDER OF THE CCBIOS IS RESERVED UNINITIALIZED ;DATA AREA, AND DOES NOT NEED TO BE A PART OF THE ;SYSTEM MEM; CP/M 2.0 disk re-definition library ; ; Copyright (c) 1979 ; Digital Research ; Box 579 ; Pacific Grove, CA ; 93950 ; ånes disk dn as having the same characteristics as ; a previously defined disk dm. ; ; a standard four drive CP/M system is deDS 38 ;ALLOCATION VECTOR 2 ALL03: DS 38 ;ALLOCATION VECTOR 3 CHK00: DS 32 ;CHECK VECTOR 0 CHK01: DS 32 ;CHECK VECTOR 1 CHK02,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 "skORY IMAGE (THE SPACE MUST BE AVAILABLE, ;HOWEVER, BETWEEN "BEGDAT" AND "ENDDAT"). ; BEGDAT EQU $ ;BEGINNING OF DATA AREA ; ; CP/M logical disk drives are defined using the ; macros given below, where the sequence of calls ; is: ; ; disks n ; disk/ fined 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 nts for later tables if nul lsc ;; current disk dn same as previous fsc dpb&dn equ dpb&fsc ;equivalent parameters als&dn eqmacro data,comment ;; define a dw statement dw data comment endm ; gcd macro m,n ;; greatest common divisor of m,n ;;  > 256 extmsk set (extmsk shr 1) endif ;; may be optional [0] in last position if not nul k16 extmsk set k16 endif ;; 00h ;translate table dw 0000h,0000h ;scratch area dw dirbuf,dpb&dn ;dir buff,parm block dw csv&dn,alv&dn ;check, alloc veclls with 1's from right rept 16 ;;once for each bit position if blkval=1 exitm endif ;; otherwise, high order 1 not fou ; endef ; ; the value of "begdat" at the end of assembly defines the ; beginning of the uninitialize ram area above the biou als&fsc ;same allocation vector size css&dn equ css&fsc ;same checksum vector size xlt&dn equ xlt&fsc ;same translate table produces value gcdn as result ;; (used in sector translate table generation) gcdm set m ;;variable for m gcdn set n ;;variablnow generate directory reservation bit vector dirrem set dir ;;# remaining to process dirbks set bls/32 ;;number of entries petors endm ; disks macro nd ;; define nd disks ndisks set nd ;;for later reference dpbase equ $ ;base of disk parameter blnd yet blkshf set blkshf+1 blkmsk set (blkmsk shl 1) or 1 blkval set blkval/2 endm ;; generate the extent mask byte blkvas, ; while the value of "enddat" defines the next location ; following the end of the data area. the size of this ; area is  else secmax set lsc-(fsc) ;;sectors 0...secmax sectors set secmax+1;;number of sectors als&dn set (dks)/8 ;;size of allocate for n gcdr set 0 ;;variable for r rept 65535 gcdx set gcdm/gcdn gcdr set gcdm - gcdx*gcdn if gcdr = 0 exitm endif r block dirblk set 0 ;;fill with 1's on each loop rept 16 if dirrem=0 exitm endif ;; not complete, iterate once again ocks ;; generate the nd elements dsknxt set 0 rept nd dskhdr %dsknxt dsknxt set dsknxt+1 endm endm ; dpbhdr macro dl set bls/1024 ;;number of kilobytes/block extmsk set 0 ;;fill from right with 1's rept 16 if blkval=1 exitm endif ;; given by the value of "datsiz" at the end of the ; assembly. note that the allocation vector will be quite ; large if a largeion vector if ((dks) mod 8) ne 0 als&dn set als&dn+1 endif css&dn set (cks)/4 ;;number of checksum elements ;; generate tgcdm set gcdn gcdn set gcdr endm endm ; diskdef macro dn,fsc,lsc,skf,bls,dks,dir,cks,ofs,k16 ;; generate the set stateme ;; shift right and add 1 high order bit dirblk set (dirblk shr 1) or 8000h if dirrem > dirbks dirrem set dirrem-dirbks eln dpb&dn equ $ ;disk parm block endm ; ddb macro data,comment ;; define a db statement db data comment endm ; ddw otherwise more to shift extmsk set (extmsk shl 1) or 1 blkval set blkval/2 endm ;; may be double byte allocation if (dks) disk size is defined with a small block ; size. ; dskhdr macro dn ;; define a single disk header list dpe&dn: dw xlt&dn,00he block shift value blkval set bls/128 ;;number of sectors/block blkshf set 0 ;;counts right 0's in blkval blkmsk set 0 ;;fi0 se dirrem set 0 endif endm dpbhdr dn ;;generate equ $ ddw %sectors,<;sec per track> ddb %blkshf,<;block shift> ddb å fac test endif ;;end of nul bls test endm ; defds macro lab,space lab: ds space endm ; lds macro lb,dn,val defds lå= gcd(sectors,skew) neltst set sectors/gcdn ;; neltst is number of elements to generate ;; before we overlap previous elementå%blkmsk,<;block mask> ddb %extmsk,<;extnt mask> ddw %(dks)-1,<;disk size-1> ddw %(dir)-1,<;directory max> ddb %dirblk shåb&dn,%val&dn endm ; endef macro ;; generate the necessary ram data areas begdat equ $ dirbuf: ds 128 ;directory access buås nelts set neltst ;;counter xlt&dn equ $ ;translate table rept sectors ;;once for each sector if sectors < 256 ddb %nxår 8,<;alloc0> ddb %dirblk and 0ffh,<;alloc1> ddw %(cks)/4,<;check size> ddw %ofs,<;offset> ;; generate the translate tablåffer dsknxt set 0 rept ndisks ;;once for each disk lds alv,%dsknxt,als lds csv,%dsknxt,css dsknxt set dsknxt+1 endm eåtsec+(fsc) else ddw %nxtsec+(fsc) endif nxtsec set nxtsec+(skf) if nxtsec >= sectors nxtsec set nxtsec-sectors endifåe, 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ånddat equ $ datsiz equ $-begdat ;; db 0 at this point forces hex record endm ; å nelts set nelts-1 if nelts = 0 nxtbas set nxtbas+1 nxtsec set nxtbas nelts set neltst endif endm endif ;;end of nulåte the translate table nxtsec set 0 ;;next sector to fill nxtbas set 0 ;;moves by one on overflow gcd %sectors,skf ;; gcdn å1 åååååååååååååååååååååååååå2 åååååååååååååååååååååååååå3 åååååååååååååååååååååååååå4 åååååååååååååååååååååååååå5 åååååååååååååååååååååååååå6 åååååååååååååååååååååååååå7 åååååååååååååååååååååååååå8 åååååååååååååååååååååååååå9 åååååååååååååååååååååååååå: åååååååååååååååååååååååååå; åååååååååååååååååååååååååå< åååååååååååååååååååååååååå= åååååååååååååååååååååååååå> åååååååååååååååååååååååååå? åååååååååååååååååååååååååå@ ååååååååååååååååååååååååååA ååååååååååååååååååååååååååB ååååååååååååååååååååååååååC ååååååååååååååååååååååååååD ååååååååååååååååååååååååååE ååååååååååååååååååååååååååF ååååååååååååååååååååååååååG ååååååååååååååååååååååååååH ååååååååååååååååååååååååååI ååååååååååååååååååååååååååJ ååååååååååååååååååååååååååK ååååååååååååååååååååååååååL åååååååååååååååååååååååååå