IMD 1.16: 16/08/2007 16:33:31 user group 76-90  M68UGL4 0201081177MIDDLETON \lx€ˆ˜ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿMDOSOV0 SY\òDIR CMðòMDOSOV4 SYˆòUG90S SAôÅMDOS SYòUG78S SAÅUG86S SAÈÅMDOSOV6 SY˜òUG80AS SAÅMDOSOV1 SYlòUG88S SATÅUG80BS SAÜÅUG83S SA@ÅMDOSOV3 SY€òMDOSER SY åUG79S SA¼ÅUG87S SA0ÅBACKUP CM°òUG81AS SAèÅUG81CS SAÅUG82AS SAÅMDOSOV5 SYòCOPY CMÔrUG77S SAtÅUG81DS SA ÅUG82BS SA(ÅUG85S SA|ÅMDOSOV2 SYxòUG84S LOÒUG89S LXÅUG76S SAÅUG81BS SAðÅUG82CS SA4ÅUG84S SAhÅUG89S SA˜Å|½èu½ëÀΠ¦u—æ+.ĦHYHY‹É×—¦wæv—׿z¦{67îx߆S6†è6~èm†?— ~èS@€?@Ù0201£ÿ €CN0 LP0 DK0MDOSER SY 0¦æÀ‚Îÿ¡&á'LŒÿ/&ñ0®431¯5¦X%;Á€$*÷DÎzîÿU0¦6¦æî2½T06ç3ç3Ä„ï6;Æ!½b~ÍþnWþn·¹oùõ»ûáä£Ô%(4]_fo|…™Ù  ¿³µýb¯±¿\lr„…†¢£¤´ÁÕÛáAD÷½¿"ggggÍ}üý*26…'Ɔ}ÿO&Æ*†760Ʀ6 Z&ùþÿünþnî§#Z&õ9 î¡&Z&ó90îî¦0îl&l90îl&l9† §Z&ú9A%6‹¥290%6‹Æ2%„9«§$l9@«§%j96hiJ&ù296dfJ&ù29ÿ$Œ®&ÁP+ÆO?'ÿ&Î ?% ¦æî?.' 9Á 'ïÆ? ?6 ¶üô…' 29…'ú¶üõ„'÷ ä ¶üõ¶üõ9O½ð¶üô…'ù9ö*Äß÷* Æ ŒÆÿ$ á&ûÿ&Î ?$~Îæ Ê ç æ¦0ç§æ¦9Æ ŒÆÿI á&ûÿKÎE?$Ú~Î0¦æ9ÿ ö ¶ 90§ç90æ§çæ¦ç§~÷_0§ç h0«6Šû§é¤§29_?&?.06§2§ç C0 6Šû§â Ù0á&¡9ÿ ñ &± 90gf90hi9† 440æçJ&ø0榧 ç ¦æ6¦290¦ æ §ç† æç J&ø110 Þ†€…OÎèi †€…OÎèÿIÄ×Î߯670îæ¦îß×—½$–1'24'.8'*9'& 320îÖç$…€'90¦æ€Âî§çÆ? ?0j'ÕæÎ‚Á&Ö–?.Y$½èu V×—½èx~9Ö–?*ÎÑ?/%éÆ†Ñ ã÷6¶Š€·29þÿÿúŽÿŠ~èþÿúŒ*' Œ'Žÿн ¾ Îfÿÿ¶Š€·Î ÿ½è"½èu½èS|½èu~ûDK9LPFCRSCP`CNmHRzr –Á€¦1€ *Q€{e€ W T Q NS¦*"¦ª' ¦"æ!¡â$½%3l&lî æ &¦ª&¦ §¦§îçl&l¦"æ!¡â$E0î11n0î~†‚Œ†AÿoèÄ' æÅ 'Å' ÆŒÆ ç9Ä?„À§Äþæ ë¦"æ!  â' Æ ŒÆŒÆ ç 9&ð†€¥' ¦æ â+æ¦æÿÂÿ+Ùæ â&æ +ÍÄ|Ë$~)æ ¶6¶6î?240?31111½ö¶ç§†þ6L6î¦*5i¦+`32P@$Z«é€7Â3$O_§ç† ?(?!I% ¦Š§~C~+„|‹_?3?*67) â*0l&ll&l¶ö‹€É¡&˜á&”11~&0î 0îîî9î¦æë§ç Ä|Ë?3?+?$à§ç~Cî?2Í6¦æ ÄHYHY0«É1674î½æ ¦0+?Œ?31111§¦ æ§ç¦æ¡ â +§ æç l&l 9    }¦* |ÿS½ð6]3&l½ð f0îîî9~è~  U Rz )&}ÿ* †V· )H†7F $9ц § 1Îÿ ' ¶üôG$÷öüõÄ 9 9†W· )}ÿ*†7 ¶üý„_·üô† 0î11n†~ù϶üý„?·üô†½ð}ÿ&¯­ ÛW~ K~ e~ ‚~ ‚~˜Á & }ÿ*Î]À &ý9 µ|ÿb}ÿ*²†0°†¬† ¨†¤ÿb}ÿ*“˜†9½ðÆOZ&û ‚ËÆ2O„Z&û† ½ð§ Ï    ½ëÌ$0îî ½ëÀ0î11nÄ&~ „÷  V$ý]&óæÄ×½èu0î ö Ä!' m&†§ Y½ Ì‹HHH0î§ ì0'l >0î¦ö Ä!„ø°'‹ ]'~ ˆ†]&¡&ö Ä'~ €} &~ Œ~ $§_½  ¦„HHHHî?(ÿ †ÿ¡&÷ ÿ  •m&~ ö Á&þ ÿ 0îÿ Î Æ?ö Á'B_9Á &Æ ?'¦æ0î¤ ¨ &äè& Æ~ ÿ 0îÿ Æ Î ?'~ ö ÄD'¦~ ”þ ÆÀå '~ œÆ†ÿ?0îÆ½  îÿ 0î†ÿ§§?"$Æ ? ?ö ¶ ç§~ ”ö Ä!'~ „&\0îö ' çþ ÿ 0îö Á@'o o ooo?!]'Á'?Á';Æ ? ?_Bÿ þ ÿ Î Æ?Æ0î*ö Á'~ ”Æ 9Æ úÆ öÆ òÆ îÆ êÆ æÆ âÿ ÷ æ¦îÿ „øDDD · Î } &? ?þ 9Æ ÷  _÷ · æÀ%*_¶ ù Yz &äVFFFFÄÁ#ÀÁ "GY9÷JîÿOÄ' V$ý]'~ RöJÄ(&ööJ*Åx&íÅ'éÆ0·`¶J…@&"?$ Á&~ cÆ ? ?†¤ &~ g¦ „&õ½ sþTîxÿV½ øöV¶WþX?)ÿXþV½ ª$~ kþXöJÄ'†?(ÿZ½ Ì%çöJÄ' þZ_?]&ÖöJÄ'böJÅ&8Å'þ\ þO½ “ÿK½5½ Õ}a&ŽÿŠ ¾Z¶KöL76¶^ö_76~èmþ\ÿÿþVÿÿþZÿÿ½'½5ÎÿÿúÎðó ´½ Õ½èm¶VöW0î§ç¶\ö]§çÖÁ0&_9 9Æ0î¶O§¶P§ 9Æ íÆ éÆ åÆ ᦠæ îÿT·R÷Sö`ÎQ?þTîzÿ\9?$þV?/$11 ÏþX?&?/%ó9aöJÅ8& Å'ö¶ ö¶|a?-9ö ¶ ?.90î¶`—þRßþT¦u‹„ø—îvßþVß9þTîv'# ÿXÎX†?þT¦u'‹„øJ»Y·Y$|X911~ gÎÿoŒÿc' ö9öJ*þÿÿúþÿÿø½'9èS>ÿ7÷=Á#IÎ9½ÎÿœÿnÎÿÜÿ pþ{'½ËÎj?'Á &þÿœ¼9&íþlÆçÎÿž Î=ÿ7·Æÿ Î_HY?)îö=?#ÿ3ÎÿÆ çÆ*ççÿ5þ7ö='>Á&æ¦Îܽ–Š0·êÖ–Îð½þ3¦'_\'0þ5§ÿ5þ3ÿ3 á}>&Ü|>¦ÎPm'С&æ~o ïÿ3¦Î?m'¶¡'Æ?' ò|4&|3æîÿi½h ˜þ5†§Î *­ Îÿ½ð$½ð! 9þ5ÿ;þ7ÿ9ÆÎ9?þ;†.§ÿ;ÆÎ9?þ7æþ;†:§çÿ5þ9ÿ79þ7ÿ9þ5»6·6$|5¶:Á&ö9½9½9þ7¦9·:G»8·8$|7 Å0î ÿ7~Æ626 §2§9DDDD„‹09#‹90 †1Æ3í8 "#$ % &  ' ( )*+,-. ÀINVALID MESSAGE \3 AT \8UNIF. I/O ERROR-STATUS=\3 AT \8PROM I/O ERROR-STATUS=\3 AT XXXX ON DRIVE X-PSN XXXX0MDOSOV SYÿÿÿÿÿÿÿÿÿÿÿÿÿÿÃÿsý~Õö/ ~Þö1 ~çö3 ~ðö5ÿg0¦€§¦‚§¦Î_…\€$û÷u¦H·„·Îæ¦÷·¶6ÎõÆ@?% 2·0æî ~ù†V— ½èS          ½6½6½6½6½6½6½6½6½6½6­ ì~Á  ½>½>½>½>½>  ½F½F Îÿ{ÿ‡966Î~966Î&~A66Î+~I66Î-~Q229 ½N¿ vÎ ‚†M§¡'ù ÿ þÿúÿþÿøÿÎ*ÿÿúÎúÿÿø¾ †/ηü|üÿ xÎõÆ?%(æ ¦ þ x§çŒ&ßÎ z?Î Æ?Î z?¾ v9†V— ½èSµ@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ € ÃÃ~á~á½6½6½6½6½6½6½6½6ÿPæ÷Oî'ƆнÉ$~Í ÿRÎR†?þR Î ÿRþÿWþPî ';½ îÿYZ†9þR ÿ]Î]†?_þ]½É$~ÕþY½ã?'ÿ_ÿg Îÿ_ ÿgÎÿUöOÎT?þ_'~¶ÿa½Š&.%,þ_ÿeÎÿ[½¹%½Š& % þ[ÿ[ ë½È ½È~ë½¹$È~ëÿcab½Š%'þPÆå &Îÿ_~xþaÿa¼R'½¹$Ö Ûþa&~ÑöR¶S?&½É$ þPî&éþaÿRþPm &m 'Æå ' þg¼c'~Ñþcÿ_þRÿ[½Šêçþ_ÿ_þ[ ÿ[&éöOÎT?þPî &þWÆ€O?ZþWçþc?1?1ÿU ÿUöOÎT?þWm+ øÿ]þc¼g'KþRÿ[_† ½É$÷[·\¶\?,ÿRþcÿY?)ÿcö\þY½õþ]ç§ÿ] îÿgþR&¸~=þ] ÿ]î½ã÷[† & þ]ÿ] –·a_þR?&½É$¶S·a¶aþR?,ÿRþc?(ÿcö[ûaþY½õþ]ç§~ÍÎÿÿÿeþWÿYîög¶h½É&^þg½ãXXZþe?'ÿ_½bÊ€þ]ç§öOÎT?þPî &öU¶VþPç § _9þPög¶hç§öe¶fç§ö_¶`ç § Û½ãXXþe?'ÿeþY~FÆ 9Æ úÆ öÆ òÆ îÆ êÿPæ÷OþÿWþPî &~ɽÆtÎmÿkþWÿiÎi?þPîŒÿÿ'~ÒþPæ÷]ÄøTTTÁ-Á#~ÙU÷VöOÎT?ö]ÄXXXXþW?'¦ÿ'~ÝÆ€þWO?þPî ÿUöOÎT?þPo o Îmm*~ÿ]ÎÿUöOÎT?þ]î* öOÎT?~½ã÷Rÿ_½Š%Säçþ_ÿ_öRZ÷R&æþ]ÿ] Á?0?0ÿ[þWÿ]þ]î*~ͽãR÷Sÿ_þRö[¶\½É%R?.÷[·\þ]ÿ]þ[&ǽþPæ¦Ê€þ]ç§ÿ]þWƆt?)¼]' þ]oo äöOÎT?þY~{½öSð\¶\þ_?(½õþYç§þ_ö\½õþ]ç§ÿ]~ö_¶`νÉ$9 þW?( å9ÄTFVFVD6YYYO FZ,ü29þ_ÿ_Ɔÿ½É9þ[öa¶b½É$ þ[ÿaþeÿc9½bÄ|WW\7½bÄ?%39ZXX7½bÄ?%3O?*9þ]öW¶X?-½bÎm?)ÿY9ƆнÉ$11~ÉÿUöOÎT?þWÆm+ \Á: /õ11~ÉÁ'÷9@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@€ Ãý6½6~ï~ù~W~@~u~o~r90îî¦90êç9½S0oƽp]'Á'd*&ÆàÖ.&PÆ‚½p]' *&ÆÊÀ:&† 0î?ÆÁ½p† 0î?£0æ90î î¦;' ' 0î l&lî¦9Æu ¼#'zÆ€½é ‘„?6½BÅ€& 'õÅ@'?$ @?%Ä?0îî]'§Z0½T¡?%äŠ0 äÄ?')760á'î î?0¦î ?23*& ½B?$ù?$õ†*190î6?29ƽé0î†?ƈ½p~6Á'-þ ¶ öÿ?-?&0 5?&þ?) ö ¶ ?/%(ö¶?/$!ö¶ ÿ0m& ¶‹öÉç§_ŒÆŒÆ2W9¦ …@&-„ $*¦?%$¦ ?%þÿ;î'?/'þ; ì~ ~~þ;î'ðÿ=þ;îŒDK&~þ=¦J0îæ Ä%Zþ=]'† ?(Z ÷ÿ=î'»þ=oo¦…€' 0¦æþ=§ç¶>ö=0î§ ç¦ Š@§ ¦„?Ч Æ0¦îç9ÆŒÆŒÆ í0îæ Äþ=¦·?¦ $ à † ?(z?&ð Ù~Å6¦ …@'¦…'¦ „¿§ ?2îoo?3oo Æ ÆŒÆ 2ç9ÆŒÆÿŒÆÿì÷'~»… '~¾„&~¾ñ|ñ¦„·ï'''~Á¦…&ñ榧çîô¦…'|ôþìæ ¦ Áÿ&ÿ&o o î …'sôîÿê­ì$~Äþ즄?Š@§}î&~¶ï'~ó}î*~–ðþì¦æî½É%mæþìl&lÁ &}ô/%}ñ& |ð†±ð&Ͻ¨ 0}ñ& }ð'7½¨%"3¶ï&¶î' Á & ½÷ ¶ò·ò½~$~µ~(óƽ~$6~µ¶ï&%}î' þìîæÁ '!}ô,þìŒ &æ Å '  $~µ½÷%ø~Ê}î&|ó ¶ï&ôöòP½~9ó}ô.Æ ½~%Æ ½~% }ô.ƽ~9ÆE}î+ ÆH}î'ÆDó½~$~µòO}î+þìæ¦î ?.]'~Çÿ$ùL»ò·òó}î&|ó ¶ï'ô½~%B}î*~Ï~}ó'7ÄðTTTT½˜3% Äþê½ã9Ê0Á:%Ë9öððÊ€ó ÉþìæŒÆŒÆ ŒÆ ŒÆŒÖŒÆÁ' 7þê­ì3þìç]' 9€Xÿÿ~~½>½>½>Æ _÷Bÿ@îÿ>þ@Æå'~/†¤&~1† ¥&÷½a$~<CIþ@æ¦ç§}B&†¤'''~8~}Eþ>†D¥'|Dþ@æÁ - ÁZ.½k$~<½%_ Æ÷F½€$~@}D'ZÁ& ½÷'ÝM&ZJþ@ç§C?%æ½k$Å~<Á&½ê~CÁ&(½ê%êþ@îÿGþ@æ¦þG?/'™æÿG½k%É åÎLá'…¶S¡&ôÁ &8þ@îç}D'}F&½ñ ½ê$~<}I'~@}C'~I½Uþ@o_9½6'Á&|I]*Ä'÷GÆ ½zG' ô½~–½€$~@}B'ÁH' ½6' ÁE&|I ÁD'½à ÖJ}B&tþ@†¤&i†·E½Ë%¾½Ø÷K&~Q}I'Á&ô}B'Á&ëzK' ½Ë%—½ؽ î½Ë%нØ}J&̽€%äÁ &÷þ@æ¦á&¡'m&jj~;†ÿ •0îç] 9ÆÆ ½U ïÆ ÷Æ ó}B&Æ êÆ æÆ âÆ Þ7þ>î­@39þ>î­@9þ@†@ª„§þ>î­ @9þ@†€ª„¿ é½€%%½à"$1111~QXXXX÷¶½€% ½à%æû¶ 9À0%Ëé% Ë*Ë%Ë 9}E+½€9½‹9¶J·J97Á &½a39Æ ½k%Æ ½k9þ@æ¦î?/9þ@æ¦î}E&M&ZJ½É97½%3ç½bþ@ç§9†·C39þ>†¥9 ÿ € ÿÿ½>½>~~X~ØÿN†¥'~Bæ¦ ÷P·Q†¤&þPî­ NþN†ª§o_9þP†¥'ᆥ' þN† ¥'~ÄþN†¤''&¼?8'¸~:þN†@¥' Dæ ¦ Áÿ&ÿ'8æ¦&]'/î?/')þNæ!¦"î?/%o ÷þN† ª§?†ß¤§]'~:þNoo†¥&~,î Œÿÿ&QþN†À¥'~F¦·Ræ îÿV„øDDD-#~JT·UÎS?öRÄXXXXþV?'†ÿÆ?þNæ ÎS?þNÆ ?'?"%~,0îç] 9Æ ôÆ ðÆ ìîÆå&0îo_90î?&\æÄøTTTÁ-RÁ# LÔ÷Õæ þÿÖÎÓ?0îæÄXXXXþÖ?'æÁÿ''ÿÔ0îÆ ?'ÿÖÎÔ6Æ ?20î?90îç 9Æ õÆ ñÄ&~Ï÷îÿ ¦·0îîÿ Ä' „æÄ&Ûþ Æ?$~Ó½ìÿöÄ'Mþ ¦ æ„Äÿ· ÷þ ¦ æ·÷„Äÿ± '~Ûñ&øöÄ&þ¶ö§ ç öÎ?_9Æþ ?%~×þ öÄ' ¶ö§ çÆ ?'ÿþ ?'ÿÎÆ?öÎ?þÆ ½ßþ Æ@?%!öÎ?þ†ÿ¡&ƽß~eÆ 9Æ úÆ öÆ ò†ÿ?öÎ?9¦îÿ„HHHH?(ÄøVVV÷9"€(ss~y½FÿrÆå&~#†@¥ &~'“îÿtþr†¥'¦„'~Kþt†€¥&.~+½Wo_9þt†¥'þr†?¤§†¤'&~~|“ àþt† ¥&~/½aþt†¥&~þrÆ ?'Æ?$Á'Æ ? ?þr†¤&~~3þr†¤' †€¥'~G†÷¤§oo†ÿ§ § §§ooîÿwþræ îÿyÎv?þyæ*~7¦þrç §þyÆ:m+Z&÷~7æ¦Äþrç§~¶}“'~¶½W?6'~øm 'Æ ?'ÿwþrîÿyÆ Îw?&þrîÿwþrÆ ?'ÿyÆÎw?~¶þrî¦ þr§?'üÁ 'øÁ '¦ «þt†@¥&~/½aþr¦„§„&þt†¥&† †þræÄø6§2''& þtÆå&~KþtÆå&~’þrÆ ?'Æ?$Á&~;Á&~?Á&~CÆ ? ?þr†ª§~C' ''~K}“'~¶þrîÿþrîÿ‘þrÆ ?'?$þrç§?%Æ?'?$þrç§½W?7ö¶ç§ö‘¶’ç§m&~¹†ª§~þt†¥&~+†`¤`&½a~0îç] 9Æ ôÆ ðÆ ìÆ èÆ äÆ àÆ ÜÆ ØÆ ÔÆ ÐÆ ÌÆ ÈÆ Äþr†ï¤§9þtî­r$11~O9$€Xss½F~y~‘A‘ƒ¨§ö:@ ÿÿ€°°#÷vQ "01040177"/ ) :1 0,LXO=ROMDIAG:1 1 XO=PUTRC:1 ,MAP:1,ABS:1,OVLY:1,FINI:1 sEND CHAIN¶HHHHC„ð´'Æ1~w? $Æ0 õþŸÿ|þ“ ÿ“΂æÊ ç?'Æ ×þ|ÿŸ½ç? %ÑΧ¦@'C\&ÿ|0æî$§ ']'Z ñ¶„·0¦¦î9Æ)~wÿ~þ|¦ÿ|þ~9¦*'..'*½WJ'tC'fL'_ÿ€½^S&~Êÿ‚½^T'%Æ2 ¹6ö~'Χ? 2.&4ÎŽ? ? $~©½ð #6¶·“ö¶ô€´þ‚?/  ½ä2~Ѷ„·~ óÿ‚|½äþ§Œ@L&õΧ½W¼‚&ê Ò¶ö´€ôº~ú·÷ ¸O †6΂æÄßç?&%2M' ¶~&Χ? þ|ÿ|þ€ÿxÎw_?Χ9Á &4¶'Æ3~w¶+Æ4 ô¶ƒŠ·ƒÎÿÿÿ΂?& ?&΄? ~y~ÇÆ?'ÿ|þ|ÿ|Î|6½Ž2&þ~9Æ ? þÿŒÎ‚???ooÆ0+( # €+ .‹ ÿ|7Æxy~Z&÷»·3Z&Ò9&€pýý~ Î!_Æ?έoßþ_Î!Z?þ!]îÿ!0¼&%þ!]î ÿ!3¼&Îÿ!_Î!Œÿ!aÆÎ!_?' †RŒ†I— ½èS úÆ? ¶ÿ'~ †U~ HÎ ¦ …@'ÎE¦ …@' þ{'3Îj? ,Î ?%È?%ÄÆêçÎE?%·?%³Îj?%¬?%¨Î!*? †=·3ήÆO? ? _÷3÷¶„·έßþÿ!6Î!:ÿ!8†0§§ÎCMÿ!CÎ!6?]&*þ!6ßþÆÎ!:?Á'†Á'†Á'†Á'† ? ~ Î!S? Æ€?#¶Š€·~  MDOS . !f!åWHAT?!f!cý½N @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ (€ 0BCOMMANDSYNTAXERROR 05NAMEREQUIRED 06\0DOESNOTEXIST 08\0DUPLICATEFILENAME 1BFILENAMENOTFOUND 1ADUPLICATEFILENAME 0DOPTIONCONFLICT 30CHAINABORTED--BREAKKEY 31CHAINABORTED--SYSTEMERRORSTATUSWORD 1CFILEISDELETEPROTECTED 24DEVICENOTREADYAT\8 0EINVALIDTYPEOFOBJECTFILE 0FINVALIDLOADADDRESS 13INVALIDFILETYPE 1ECONFLICTINGFILETYPES 1F\0HASINVALIDFILETYPE 27INVALIDDATATRANSFERTYPEAT\8 22DEVICEALREADYRESERVEDAT\8 23DEVICENOTRESERVEDAT\8 25FILENOTOPENORALREADYOPENAT\8 26ENDOFFILEAT\8 29BUFFEROVERFLOWAT\8 2ACHECKSUMERRORAT\8 15LOGICALSECTORNUMBEROUTOFRANGE 07ILLEGALFILENAME 2BFILEISWRITEPROTECTEDAT\8 20\0ISWRITEPROTECTED 09NOSUCHDEVICE 04ILLEGALDRIVENUMBER 12INVALIDEXECUTIONADDRESS 0AINVALIDDEVICE 11INVALIDRIB 1DTOOMANYSOURCEFILES 16ILLEGALSTART/ENDSPECIFICATIONS 17ILLEGALPAGEFORMAT 14FILEEXHAUSTEDBEFORELINEFOUND 28ENDOFMEDIAAT\8 18ILLEGALLINENUMBERORRANGE 19LINENUMBERENTEREDBEFORESOURCEFILE 02DIRECTORYSPACEFULL 03DISKSPACEFULL 10NOTENOUGHSEGMENTDESCRIPTORSPACE 2CINVALIDDIRECTORYENTRYNO.AT\8 2DCANNOTDE-ALLOCATEALLSPACE-DIRECTORYENTRYEXISTSAT\8 2ERECORDLENGTHTOOLONGAT\8 0CINTERNALSYSTEMERRORAT\8 21INVALIDSCALL 2FCHAINOVERLAYCANNOTBEFOUNDORLOADED 32CHAINABORTED--ILLEGALOPERATOR 33CHAINABORTED--UNDEFINEDLABEL 34CHAINABORTED--PREMATUREENDOFFILE @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ,€ h! $0200 _"¤"·"¾g"°"È)1#  "u_"Œ"Ž"ç SYNTAX ERRORSYSTEM SECTOR COPY/VERIFY ERRORDIRECTORY READ/WRITE ERRORSOURCE FILE COPY ERROROBJECT FILE CREATION COPY ERRORCANNOT DELETE DUPLICATE NAMEDRIVE 1 SCRATCH? APPEND TO DRIVE 1?DISK NAME: DATE(MMDDYY): USER NAME: NO FILES TO COPYDELETE FILE NOS.: NEW NAME: STARTING TO COPY FILESINSUFFICIENT MEMORYENTER FILE COPY SELECTION COMMANDS: SAVE (S), DELETE (D), PRINT (P), QUIT (Q), NO MORE (CR)S, D, P, Q, (CR):.  NOT FOUND .SECTOR  OFFSET DR0- DR1-COPYING . - DUPLICATION: IS IT TO BE COPIED? NOT COPIEDCOPYINGMDOS SY OV0OV1OV2OV3OV4OV5OV6ER Ž ˆÎ OÆ?Þþ¦ 'ù '$;&ñ¦ßYÎ$С' Œ$ú&ô :î­ÞY â11–!+Î!a&Î!s½.ôÎ Æ? ¦Y'?O—)L—1–!.~$ú~&úÆ ? ~/þ–!&õJ—!9–!&íL ö–!&æ† î†š — 9†€ ÷|%9|#†—(9|&9|"9|$9–'&»z'ÆÎ#ÿ ¹Î ¹~-+–'&¦|'Æ Î"ù é $z $:A$‚C$ŠD$‘I$•L$™N$¡R${S$¥U$©V$sY$­Z$Âþ–$&΀½-öß9ß7ß/ßQþßMÆ??$„€HYI—O×PÞO}!*DV—O×P„DVF›NÙM×S—T_†?/"f–!+½. Îß*Îß,½&(Îß*Îß,½&(%>ÞMßQ|-Æ7½&(3%.Z&ö–$'-Îß*ÞOß,κÖ,–-?-$?)ß,ÎßY½&(ÞY&è~/î~/ä~/ÖÖO–PTFTF—[—\ÎßYß*Îß,Þ9¦ÆHZ&ü—;Æ×?Î$Zÿ%ÊÎ$“ÿ%ÌÎ%ÊÆ?†.·$›þ$bÿ$œ9Ö++Î$Zÿ%ÊÎ%Üÿ%ÌÎ%Ê?&–,*O J'þ$b¼%ä ¶$b±%ä9Î%Òÿ%ÊÎ$¡ÿ%ÌÎ%ÊÆ?Æ.¶$fÎ$¡H%çŒ$¦&õ¶$f„ª§9–!…&? 9z-&†<—-Æ?49?2Î%æ† Z'§ ø†§Î%æ?5?390 $Å%DDRIVE : DISK I.D. : . !WDSCN0 *NO SDW'S* NO DIRECTORY ENTRY FOUND TOTAL NUMBER OF SECTORS : /$ TOTAL DIRECTORY ENTRIES SHOWN : /$ NO TERMINATOR FOUND IN FILE'S R.I.B. ]'/l&lÿ&êþ&ꦄ #‹‹0m&jjî§þ&ê Z&Ýþ&ê96†dfJ&ù29]&~'„l&l÷'—ÿ'™Î'…ÿ'”†·'˜þ'™¦æÎ'oîà¢%Î'l ñë©Î'67¦‹0æ 'Z&ü§32Î'l&ll&lj ,Ãïî¦Î'î m&jjî§Î'l&lj&Þþ'™O9'èd †«Š§‹Æ$†0§ Z&ì9@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@  A€8''Î'’½ð$Î'œ½ð'Îÿ ½ðÎ'’½ð'Î'¨½ð'Îÿ ½ðÎ'—½ð'Îÿ½ð½ð!½ð&ù½ð!Îÿ½ðƆB½ð-†F½ð½ð*þÿ ¼ÿ 'ÿÿ þÿÿÿZ&Û Î½ð!½ð&ù~ðù7†þÿ æ6†NY$†P½ð2J&ñ39MEM TAPE BEGIN ADDR END ADDR /îÎßnΠƽ-+½èi$½/U&öÞ*Ö,–-?)ß*tn9ÎßnÎ ¡Æ½-+½è$½/U%&ìÞ2Ö4–5?)ß2tn9½/þ–1'4'7-9#Ca½/þ–o',Þ œp&&zo&)Ö 'B€S00B00004D415448202020204A S11E1000A6042A04BD108139DF08BD108B96039A049A0526077F0007BD11D00C S11E101B3996072703BD10C2BD10D4250C96072719BD10C2BD105020119607FE S11E103626100D7600037600047600057C0006DE08397F0007BD105020F596FB S11E1051032B1586194A27187A0006290C7800057900047900032AED394F97B4 S11E106C0397049705868097067F000739A6042A04BD100839730007BD100894 S11E108773000739A603910627122D117400037600047600057C000691062635 S11E10A2F039E600D700E601D701E602D7027400007600017600024C9106265D S11E10BDF2CE0000394F90059705860092049704860092039703399605AB02AE S11E10D897059604A90197049603A9009703399605A00297059604A2019704B8 S11E10F39603A20097033996009703960197049602970539A6042A03730007B0 S11E110EBD11715FD700D701D702C6187400037600047600052412A6029B02D7 S11E11299702A60199019701A60099009700760000760001760002760003760B S11E114400047600055A26D7A6039B062926970696002B11790003790002793E S11E115F00017900007A0006290FBD10FA9603270839960326023131397E108D S11E117A6AA6042A03730007BD11715FD700D701D702C619BD10E72406BD10EB S11E1195D40C20010D7900027900017900005A27107800057900047900032494 S11E11B0DDBD10E720E3240C7600007600017600027C00069606A00329AE97C8 S11E11CB06BD10FA39A6009703A6019704A6029705A6039706399603A70096E4 S11E11E604A7019605A7029606A70339BD1171CE000BBD11E1CE000FBD11E128 S11E1201770012BD1182BD10087A0006CE0013BD11E1CE000FBD10817F00075F S11E121CD606CE0013BD11D0C1EC2E0139CE000FBD11E1CE000BBD11D0CE0072 S11E12371320CA9607970C7F0007CE12F4BD1081960727F9BD1008CE12F8BD8C S11E1252108196072705BD10082024BD108196072702201BBD10819607270B9E S11E126DBD100886FF980C970C2009BD108186FF980C970C7F0007CE000FBD5E S11E128811E1BD110E7F0007CE0013BD11E1CE12F0BD1081CE0013BD110ECEBA S11E12A312ECBD1008CE0013BD110ECE12E8BD1081CE0013BD110ECE12E4BD48 S11E12BE1008CE0013BD110ECE12E0BD1081CE000FBD110E730007CE12E0BD7E S11E12D9118296079707399845401ACB070017A26C0013F780000DDC00000747 S11E12F4C90FDA03C90FDA01730007CE12F8BD1008BD123A39CE0017BD11E176 S11C130FBD12FCCE001BBD11E1CE0017BD11D0BD123ACE001BBD11823960 S9030000FC S00D00005547383041532020534186 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TG€U NAM MATH ROUTINES - 7/19/76 OPT O OPT S ORG $0600 **** * * PROG  RAM NAME: FIX * * * FUNCTION: TO CHANGE A FLOATING POINT * VALUE TO INTEGER. * * CALLING SEQUENCE: * * JSR FIX * FDB ARG1 ADDRESS OF ARG1 * FDB ARG2 ADDRESS OF ARG2 * --- RETURN LOCATION * * WHERE: * ARG1 = ADDRESS OF FLOATING POINT VALUE * BYTE 0 BIT 7 = SIGN OF FRACTION * BIT 6-0 = EXPONENT (2'S COMP) * BYTE 1-3 = FRACTION * * ARG2 = ADDRESS OF RETURNED INTEGER VALUE * BYTE 0 = MSB * BYTE 1 = LSB * IF FLOATING POINT VALUE GREATER THAN 32767, * RESULTS UNPREDICTABLE. * * PROGRAMMER: D. W. CAWELTI * * STACK SIZE: 9 BYTES * * STACK DESCRIPTION: * BYTE 0 = MULTIPLER SIGN (BIT 7) * 1 = MULTIPLER (FLOATING POINT) * 2 = INTEGER MSB * 3 = INTEGER LSB * 4 = * * 5 = FRACTION (FLOATING POINT) * 6 = * * 7 = RETURN LOCATION MSB *  8 = " " LSB * * RV DATE BY REASON FOR CHANGE * -- -------- --- ------------------ * 00 06/08/76 DWC INITIAL RELEASE * **** * FIX TSX GET LOC OF STACK IN X  LDX 0,X GET ADDR. OF CALLING SEQ. LDX 0,X GET ADDR. OF ARG1 LDA A 3,X GET LSB OF FRACTION PSH A  LDA A 2,X PSH A LDA A 1,X GET MSB OF FRACTION PSH A CLR A CLEAR 2 BYTE INTEGER VALUE  PSH A PSH A LDA A 0,X GET EXPONENT AND A #$7F AND OUT EXPONENT SIGN PSH A LDA A 0,X GET EXPONENT AGAIN AND SAVE PSH A FOR SIGN. TSX GET NEW LOC. OF STACK * FIX1 NOP  LDA A 1,X CHECK IF MULTIPLER LT 1 AND A #$40 BNE FIX6 LDA A 1,X GET MULTIPLER AND CHECK FOR  BEQ FIX4 ZERO. LDA A #4 SHIFT LEFT 4 BITS FIX2 ASL 6,X FLOATING POINT FRACTION ROL 5,X INTO INTEGER VALUE. ROL 4,X ROL 3,X ROL 2,X DEC A BNE FIX2 DEC 1,X BRA FIX1 FIX4 NOP LDA A 4,X GET FRACTION - CHECK IF GT BPL FIX5 .5 (ROUND OFF) INC 3,X GREATER THAN .5 - ADD ONE BNE FIX5 TO INTEGER INC 2,X FIX5 NOP LDA A 0,X GET MULTIPLER SIGN BPL FIX6 CHECK IF NEG. LDA A 3,X YES - COMPLIMENT INTEGER COM A LDA B 2,X COM B STA A 3,X STA B 2,X INC 3,X BNE FIX6 INC 2,X FIX6 NOP LDX 7,X USE STACK POINTER TO GET TO LDX 2,X ADDR OF RESULT. PUL A PUL A PUL A STA A 0,X STORE MS BYTE OF INTEGER PUL A STA A 1,X PUL A CLEAN STACK PUL A PUL A TSX GET LOC OF STACK IN X LDX 0,X GET RETURN LOCATION INS INS JMP 4,X RETURN TO CALLER. PAGE **** * * PROGRAM NAME: FLO  AT * * FUNCTION: TO CHANGE A INTEGER VALUE TO * FLOATING POINT. * * CALLING SEQUENCE: * * JSR FLOAT * FDB ARG1 ADDRESS OF ARG1 * FDB ARG2  ADDRESS OF ARG2 * --- RETURN LOCATION * * WHERE: * * ARG1 = ADDRESS OF INTEGER VALUE(16 BIT 2'S COMP) * BYTE 0 = MS BYTE * BYTE 1 = LS BYTE * * ARG2 = ADDRESS OF RETURNED FLOATING POINT NO * BYTE 0 BIT 7 = SIGN OF FRACTION *  BIT 6-0 = EXPONENT (2'S COMP) * BYTE 1-3 = FRACTION * * PROGRAMMER: D. W. CAWELTI * * STACK SIZE: 9 BYTES * * STACK DESCRIPTION: * BYTE 0 = INTEGER SIGN (BIT 7) * 1 = MULTIPLER (FLOATING POINT) * 2 = INTEGER MS BYTE * 3 = INTEGER LS BYTE * 4 = * * 5 = FRACTION (FLOATING POINT) * 6 = * *  7 = RETURN LOCATION MS BYTE * 8 = RETURN LOCATION LS BYTE * * RV DATE BY REASON FOR CHANGE * -- -------- --- ------------------------------- * 00 06/08/76 DWC INITIAL RELEASE * *** * FLOAT TSX GET LOC OF STACK IN X LDX 0,X GET ADDR. OF CALLING SEQ. LDX 0,X GET ADDR OF ARG1 CLR A PSH A ZERO 3 BYTES IN STACK FOR PSH A FRACTION PSH A LDA A 1,X GET INTEGER VALUE PSH A BYTE 1 (LS BYTE) LDA A 0,X GET INTEGER VALUE PSH A CLR B PSH B ZERO FLOATING POINT MULTIPLER PSH A SAVE INTEGER VALUE SIGN BIT 7 TSX GET NEW LOC. OF STACK * LDA A 0,X CHECK IF SIGN NEG. BPL FLOAT1 LDA A 3,X YES - COMPLEMENT AND ADD 1 TO COM A MAKE 2' COMPLEMENT POSITIVE NUMBER STA A 3,X LDA A 2,X COM A STA A 2,X INC 3,X BNE FLOAT1 INC 2,X FLOAT1 NOP LDA A 2,X TEST IF INTEGER VALUE ZERO EOR A 3,X BEQ FLOAT3  LDA A #4 FLOAT2 LSR 2,X MOVE LS BYTE OF INTEGER ROR 3,X TO MOST LEFT BYTE OF ROR 4,X FRACTION. ROR 5,X  ROR 6,X DEC A CHECK IF 4 BITS MOVED BNE FLOAT2 INC 1,X INCREMENT MULTIPLER BRA FLOAT1 FLOAT3 NOP LDA A 0,X GET INTEGER SIGN BPL FLOAT4 CHECK IF NEG. LDA A 1,X YES - SET BIT 7 TO A 1 ORA A #$80 STA A 1,X FLOAT4 NOP LDX 7,X USE STACK POINTER TO GET TO LDX 2,X ADDR OF RESULT PUL A CLEAR STACK IF SIGN PUL A MULTIPLER VALUE STA A 0,X PUL A CLEAR STACK INTEGER VALUE PUL A PUL A GET FLOATING POINT FRACTION STA A 1,X PUL A STA A 2,X PUL A  STA A 3,X TSX GET LOC OF STACK IN X LDX 0,X GET RETURN LOCATION INS CLEAN STACK INS  JMP 4,X RETURN TO CALLER SPC 1 PAGE * **** * * PROGRAM NAME: SQRT *  * FUNCTION: TO CALCULATE SQUARE ROOT VALUE * OF A FLOATING POINT VALUE. * * CALLING SEQUENCE: * * JSR SQRT * FDB ARG1 ADDR OF VALUE TO BE SQRT ROOTED *  FDB ARG2 ADDR OF ANSWER * --- RETURN LOCATION * * NEG.VALUE CAUSES UNPREDICTABLE * RESULTS. ZERO VALUE ALSO CAUSES * UNPREDICTABLE RESULTS. * * PROGRAMMER: D. W. CAWELTI * * STACK SIZE: 3 BYTES * * STACK DESCRIPTION: * * BYTE 0 = COUNTER * 1 = RETURN LOCATION MS BYTE * 2 = RETURN LOCATION LS BYTE * * RV DATE BY REASON FOR CHANGE * -- -------- --- ----------------------------------- * 00 06/24/76 DWC INITIAL RELEASE * **** * PAGE FPADD EQU $0B00 FPSUB EQU $0B02 FPMULT EQU $0B04 FPDIV EQU $0B06 SQR EQU $05F9 SQRT TEMP STORAGE SQRTP EQU $05FC SQRT TEMP STORAGE SPC 4 SQRT TSX GET LOC OF STACK IN X CLR A CLEAR COUNTER PSH A  LDX 0,X GET ADDR OF CALLING SEQUENCE LDX 0,X GET ADDR OF VALUE LDA A 0,X GET VALUE TO BE LDA B 1,X SQRT ROOTED AND STORE STA A SQR IN LOW CORE SQR ADDRESS. STA B SQR+1 LDA A 2,X LDA B 3,X  STA A SQR+2 STA B SQR+3 TSX GET NEW LOC. OF STACK SQRT1 NOP JSR FPSUB CHECK IF SQR LT 1.0 FDB SQR FDB ONE FDB SQRTP SPC 1 LDA A SQRTP CHECK IF BIT 7 SET BMI SQRT6  JSR FPDIV SQR = SQR/2.0 FDB TWO FDB SQR FDB SQR SPC 1 TSX INC 0,X INCR COUNTER BRA SQRT1 SPC 1 SQRT6 NOP JSR FPADD SQRTP = SQR + 2.1372553 FDB SQR FDB V1 FDB SQRTP SPC 1 JSR FPDIV SQRTP = 4.8375280 / SQRTP FDB SQRTP FDB V2 FDB SQRTP SPC 1 JSR FPSUB SQRTP = 2.5416391 - SQRTP FDB V3 FDB SQRTP FDB SQRTP SPC 1  JSR FPDIV SQR = SQR/SQRTP FDB SQRTP FDB SQR FDB SQR SPC 1 JSR FPADD SQRTP = SQR + SQRTP FDB SQR FDB SQRTP FDB SQRTP SPC 1 JSR FPDIV SQR = SQRTP/2.0 FDB TWO  FDB SQRTP FDB SQR SPC 1 SQRT7 TSX GET STACK ADDRESS LDA A 0,X GET COUNTER LSR A CHECK IF COUNTER EVEN BCC SQRT8 JSR FPMULT NO - SQR = SQR*1.41421356 FDB SQR FDB V4 FDB SQR SPC 1 TSX DEC 0,X DECR COUNTER SPC 1 SQRT8 LDA A 0,X GET COUNTER BEQ SQRT10 ASR 0,X COUNTER = COUNTER/2 SQRT9 DEC 0,X DECR COUNTER JSR FPMULT SQR = SQR*2.0 FDB SQR  FDB TWO FDB SQR SPC 1 TSX TST 0,X BNE SQRT9 SPC 1 SQRT10 NOP  LDX 1,X GET ADDR OF CALLING SEQ. LDX 2,X GET ADDR OF ANSWER LDA A SQR GET SQRT ROOT VALUE LDA B SQR +1 STA A 0,X STORE IN ANS ADDRESS STA B 1,X LDA A SQR+2 LDA B SQR+3 STA A 2,X STA B 3,X SPC 1 RET NOP PUL A CLEAN STACK TSX LDX 0,X GET RETURN LOC INS DECR STACK POINTER INS JMP 4,X RETURN TO CALLER SPC 4 ONE FDB $0110 FLOATING POINT 1.0 FDB $0000 TWO FDB $0120 FLOATING POINT 2.0 FDB $0000 V1 FDB $0122 FLOATING POINT 2.1372553  FDB $3232 V2 FDB $014D FLOATING POINT 4.8375280 FDB $6684 V3 FDB $0128 FLOATING POINT 2.5416391 FDB $AA8D V4 FDB $0116 FLOATING POINT 1.41421356 FDB $A09E SPC 1 END  END END END @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@]€ NAM BINAT * * TESTPROGRAM FOR BINA ON THE EXORCISER * ************************************* * * 1. LOAD AND SET A BREAKPOINT AT NOP /13F/ * 2. START AT PC = $100 * 3. SET VALUE INTO A , BASE INTO B AND * # OF CHAR. INTO ADDR. 10F USING MAID * 4. THE RESULT WILL BE PRINTED AUTOMATICALLY * 5. REPEAT FROM 3. * ORG $100 OPT O,NOG BRA BINAT RMB 10 STACK AREA STCK RMB 1 FDB BUFTS POINTER TO BUFFER CHARNR FCB 8 DEFAULT # OF CHAR. MSG FCC /RESULT FROM BINA BUFFER ==> / SPC 3 BUFTS RMB $10 SPC 3 BINAT LDS #STCK NOP BREAKPOINT,SET A,B AND CHARNR JSR BINA SPC 1 LDX #MSG JSR $FA33 EXBUG RESULT-PRINTOUT BRA BINAT SPC 3 ORG $200 PAGE * NAM BINA SPC 2 ************************************************ * REENTRANT SUBROUTINE TO CONVERT ONE BYTE * * BINARY VALUE TO ASCII CHARACTERS IN ANY BASE * ************************************************ * * * JANOS JARAI , MARCH 1977 * * * CALLING SEQUENCE: * ENTER # OF CHARACTERS INTO STACK * POINTER TO BUFFER INTO STACK * BINARY VALUE INTO A * BASE /RADIX OF CONV./ INTO B * * NOTE : # OF CHARACTERS IS NORMALLY...FOR BASE * 8 2 * 3 8 *  3 10 * 2 16 * * RESULTS: CHARACTERS + EOT IN THE BUFFER * REGISTERS ARE NOT SAVED * CLEAN THE STACK AFTER IT ! * (POINTER & # OF CHAR. ARE UNCHANGED) * SPC 1 BINA PSHB SAVE BASE TSX LDAB 5,X SET CHAR. COUNTER PSHB SPC 1 DEX ADDB 5,X CALCULATE END OF BUFFER +1 STAB 5,X BCC EOTXT INC 4,X SPC 2 * THE STACK LOOKS LIKE: +0....CHAR. COUNTER * +1....BASE *  +2....RETURN ADDR. HIGH * +3....RETURN ADDR. LOW * +4....BUFFER POINTER HIGH * +5....BUFFER POINTER LOW * +6....# OF CHAR. SPC 1 PAGE EOTXT LDX 4,X  EOT AT THE END OF BUFFER LDAB #4 STAB X SPC 1 TSX GB LDAB 1,X GET BASE JSR DIV8 DIVIDE VALUE BY BASE SPC 1 CMPB #9 IS IT A # OR A CHAR.? BLE DECI ADDB #'A-$A ASCII BIAS BRA TS DECI ADDB #'0 SPC 1 TS TSX TST 5,X BUILD NEXT ADDRESS BNE LO DEC 4,X LO DEC 5,X SPC 1 LDX 4,X GET BUFFER POINTER STAB X CHAR. INTO BUFFER TSX DEC X ALL CHARACTERS ?  BGT GB SPC 1 OKBINA INS CLEAN STACK INS SPC 1 RTS PAGE * NAM DIV8 * * REENTRANT SUBROUTINE FOR INTEGER DIVISION * ***************************************** * * * JANOS JARAI , MARCH 1977 * * CALLING: DIVIDEND IN A , DIVISOR IN B * RESULTS: QUOTIENT IS RETURNED IN A * REMAINDER IN B * X IS DESTROYED * SPC 2 DIV8 PSHB SAVE DIVISOR LDAB #8 SET BIT COUNTER PSHB CLRB TSX SPC 1 BIT ASLA GET ONE BIT ROLB CMPB 1,X B-DIV.= ? BLT ADJ SPC 1 SUBB 1,X B-DIV.=REMAINDER INCA A WILL BE QUOTIENT ADJ DEC X ADJUST BIT COUNTER BGT BIT OKDIV INS OK, CLEAN STACK INS SPC 1 RTS SPC 5 * NAM END SPC 2 END (d€( NAM LPNT -- MEMORY DUMP TO LINE PRINTER TTL MEMORY DUMP TO LINE PRINTER OPT LLEN=80,CREF,SYM ORG $3700 ********************************************************* * * J-SIBIGTROTH, EAGLE SIGNAL CORP. * 8004 CAMERON ROAD * AUSTIN, TEXAS 78753 * (512) 837-8300 7:30 AM - 4:15 PM * *  ASSEMBLED 3-18-77 * * PROGRAM TO DUMP MEMORY TO LINE PRINTER * OPERATES LIKE EXBUG 1.2 "PRNT" BUT OUTPUTS TO PRINTER * TO START PROGRAM USE MAID TO GO TO LPNT * (IN THIS CASE $3700) * * BY VARYING DATA CONSTANTS THE PROGRAM CAN BE * ALTERED TO ACCOMODATE DIFFERANCES IN PRINTERS. (SEE THE * COMPLETE EXPLANATION AT THE BOTTOM OF THIS LISTING). * *************************************************************** LPNT JSR BEGEND INSPECT/ALTER RANGE JSR EXECQ "EXEC" PROMPT LDX BEGAD BEG ADDRESS FROM BEGEND SUBROUTINE STX WRKHI WORKING DOUBLE BYTE [WRKHI,WRKLO] LDAA WRKLO LOW ORDER BYTE OF BEG ADDR ANDA #$F0 JUSTIFY LINE TO $XXX0 STAA WRKLO NEWPG LDAA NLINES # OF PRINTING LINES/PAGE STAA LNCNT LINE COUNTER LDAB LNSBFR PREPARE TO SKIP LNSBFR LINES JSR SKPS INSERT LINE FEEDS TO TOP OF PAGE SKPLN JSR PCRLF BLOCK SEPERATION (COUNTS AS LINE) NXTLN LDX #WRKHI BEG ADDR OF LINE TO PRNT JSR PNT2B PRINT BEG ADDR (SP) LDAA #$20 ASCII SPACE JSR OUTCH TRANSMIT CHAR TO PRINTER BUFFER LDX WRKHI X PNTS TO FIRST BYTE IN LINE LDAB #$10 LOOP1 COUNTER LOOP1 JSR PNT1B PRINT MEM BYTE & INC X-REG DECB DECREMENT LOOP COUNTER BNE LOOP1 CONTINUE TILL XXX0-XXXF PRINTED LDAA #$20 ASCII SPACE JSR OUTCH JSR OUTCH LDAB #$10 LOOP2 COUNTER LDX WRKHI RESET X-REG TO BEGINNING OF LINE LOOP2 LDAA 0,X GET BYTE PNTED TO BY X ANDA #$7F MASK PARITY CMPA #$20 * CHECK FOR ASCII BLT NOTASC * PRINTABLE CHAR CMPA #$61 * BET WEEN $20 & $61 BLT PNTCHR * ;ELSE DEFAULT A PERIOD NOTASC LDAA #'. ASCII PERIOD PNTCHR JSR OUTCH TRANSMIT CHAR TO PRINTER BUFFER INX POINT TO NEXT MEM BYTE DECB DECREMENT LOOP COUNTER BNE LOOP2 CONTINUE FOR 16 BYTE BLOCK STX WRKHI WRK NOW HAS BEG ADDR OF NEXT LINE DEC LNCNT DECREMENT PRINTED LINES COUNTER JSR PCRLF CAUSES LINE IN BUFFER TO PRINT CPX #0 WAS LAST BLOCK $FFF0-$FFFF ? BEQ LPNT IF IT WAS STOP LDAA ENDAD MS BYTE OF END ADDRESS LDAB ENDAD+1 LS BYTE OF END ADDRESS SUBB WRKLO * 16 BIT SUBTRACT SBCA WRKHI * ENDAD - WRKHI,WRKLO BCC AROUN1 TEST FOR ENDAD EXCEEDED JMP LPNT OPERATION COMPLETE SO STOP AROUN1 TST LNCNT CHECK FOR END OF PRINTER PAGE BNE CONTIN IF NOT CONTINUE LDAA NLINES STAA LNCNT REINITIALIZE LINE COUNTER LDAB LNSAFT PREPARE TO SKIP LNSAFT LINES BSR SKPS INSERT LINE FEEDS TO END OF PAGE JMP NEWPG START A NEW PRINTER PAGE CONTIN TST WRKLO CHECK FOR END OF 256 BYTE BLOCK BNE NXTLN IF NOT PRINT NEXT LINE DEC LNCNT ADJUST FOR SKIPPED LINE JMP SKPLN END OF A BLOCK SO SKIP EXTRA LINE * * *<<<<<<<<<>>>>>>>>>* * BEGEND EQU $F787 INSPECT/ALTER BEG & END ADDR EXECQ EQU $F70C "EXEC" PROMPT CHEXL EQU $F9B8 CONVERT LEFT NIBBLE TO ASCII CHEXR EQU $F9BC CONVERT RIGHT NIBBLE TO ASCII * *<<<<<<<<<>>>>>>>>>* * OUTCH EQU $EAB0 OUTPUT A-REG TO LINE PRINTER * *<<<<<<<<<>>>>>>>>>* * *+++++PCRLF - TRANSMIT (CR)(LF) TO PRINTER+++++* PCRLF LDAA #$0D (CR) JSR OUTCH LDAA #$0A (LF) JMP OUTCH THE RTS IN OUTCH WILL CAUSE RETURN * *+++++PNT2B;1B - CONV & DUMP WHAT'S POINTED TO BY X+++++* PNT2B BSR PNTBY PNT1B BSR PNTBY LDAA #$20 (SP) JMP OUTCH PRINT SPACE & RETURN * *+++++PNTBY - USED IN PNT1B & PNT2B+++++* PNTBY LDAA 0,X JSR CHEXL CONVERT LEFT NIBBLE JSR OUTCH PRINT IT LDAA 0,X JSR CHEXR CONVERT RIGHT NIBBLE INX MAKES X-REG POINT TO NEXT BYTE JMP OUTCH PRINT AND RETURN * *+++++SKPS - INSERT LINE FEEDS (# IN B-REG)+++++* SKPS JSR PCRLF DECB BNE SKPS CONTINUE TILL B LINES SKIPPED RTS * * *<<<<<<<<<>>>>>>>>>* * BEGAD EQU $FF0A BEG ADDRESS (2 BYTES) ENDAD EQU $FF0C END ADDRESS (2 BYTES) * *<<<<<<<<<>>>>>>>>>* * *+++ THE FOLLOWING THREE DATA CONSTANTS ARE SET FOR A *+++ CENTRONICS 101A LINE PRINTER WITH 66 LINES PER *+++ PAGE. THE NO. OF LINES SKIPPED BEFORE & AFTER *+++ PRINTING ARE CHOSEN SO THE TOP OF PAGE REMAINS *+++ THE SAME FOR ALTERNATE CALLS TO "PLIST" *+++ AND THIS ROUTINE. *+++ IT MAY BE NECESSARY TO ADJUST THEM TO *+++ ACCOMODATE A DIFFERENT SYSTEM. *+++ IF SO...NLINES+LNSBFR+LNSAFT+1 = LINES PER PAGE *+++ THE "+1" IS TO COMPENSATE FOR "SKPLN JSR PCRLF" *+++ WHICH IS EXECUTED AT THE TOP OF EACH NEW PAGE. * NLINES FCB 57 # OF PRINTING LINES LNSBFR FCB 3 # OF LINES TO TOP OF NEW PAGE LNSAFT FCB 5 # OF LINES TO FILL OUT PAGE * **<<<<<<<<<>>>>>>>>>* * WRKHI FCB 0 UPPER BYTE OF WORKING DOUBLE BYTE WRKLO FCB 0 LOWER BYTE OF WORKING DOUBLE BYTE LNCNT FCB 0 LINE COUNTER * ****************************************************************** * END  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@|o|@¯?* *SPECIALOPTION--TURNOFFTHELISTING * OPTNOLIST PAGE * *MDOSVERSION2.0--SYSTEMEQUATEFILE--MARCH9,1977 * SPC3 * *DEFINEMULTI-SECTOR/SINGLESECTORI/O * MULTSEQU0.0=>SINGLESECTOR,1=>MULTIPLESECTOR SPC3 * *SKIP2…MACRO * *THEGENERATEDBYTEISA"COMPAREINDEXIMMEDIATE". *THEEXECUTIONOFTHEBYTEWILLCHANGETHECONDITIONCODESONLY. *NOREGISTERSAREAFFECTED.‚THUS,AONEBYTEINSTRUCTION *ISFORMEDTHATSKIPSFORWARDTWOBYTES. * SKIP2MACR FCB$8C. ENDM * *SKIP1…MACRO * *THESAMECONCEPTASTHE"SKIP2"MACROISUSED,EXCEPTTHAT *A"BITTESTACCUMULATORAIMMEDIATE"OPCODEISGENERATED. * SKIP1MACR FCB$85 ENDM * *SCALL…MACRO„(SYSTEMFUNCTIONCALL) * SCALLMACR IFEQNARG-1 SWI FCB\0!.%01111111 ENDC * IFNENARG-1 FAIL*UNDEFINEDSWICALLARGUMENT* ENDC ENDM * *UCALL…MACRO„(USERFUNCTIONCALL) * UCALLMACR IFEQNARG-1 SWI FCB\0!+%10000000 ENDC * IFNENARG-1 SCALL ENDC ENDM * *SEQ…MACRO†(NUMBERINGSEQUENTIALEQUATES) * SEQMACR IFNENARG \0EQU*. ENDC ORG*+1. ENDM PAGE * *SYSTEM…FUNCTION…DEFINITIONS * * *SETLOCATIONCOUNTTO0FORTHEEQUATEDEFINITIONS * .$SAVSET*.SAVEOLDLOCATIONCOUNT ORG$0. * * * SEQ.RESRV.RESERVEADEVICE SEQ.RELES.RELEASEADEVICE SEQ.OPEN.OPENAFILE SEQ.CLOSE.CLOSEAFILE SEQ.GETRC.READARECORD SEQ.PUTRC.WRITEARECORD SEQ.REWND.POSITIONTOBEGINNINGOFFILE SEQ.GETLS.READLOGICALSECTOR SEQ.PUTLS.WRITELOGICALSECTOR SEQ.KEYIN.CONSOLEINPUT SEQ.DSPLY.CONSOLEOUTPUT(TERMW/CR) SEQ.DSPLX.CONSOLEOUTPUT(TERMW/EOT) SEQ.DSPLZ.CONSOLEOUTPUT(TERMW/EOT,NOCR/LFATEND) SEQ.CKBRK.CHECKCONSOLEFORBREAKKEY SEQ.DREAD.EROMDISKREAD SEQ.DWRIT.EROMDISKWRITE SEQ.MOVE.MOVEASTRING SEQ.CMPAR.COMPARESTRINGS SEQ.STCHB.STOREBLANKS SEQ.STCHR.STORECHARACTERS SEQ.ALPHA.CHECKALPHABETICCHARACTER SEQ.NUMD.CHECKDECIMALDIGIT SEQ.ADDAM.INCREMENTMEMORY(DOUBLEBYTE)BYA SEQ.SUBAM.DECREMENTMEMORY(DOUBLEBYTE)BYA SEQ.MMA.MULTIPLY(SHIFTLEFT)MEMORYBYA(COUNT) SEQ.DMA.DIVIDE(SHIFTRIGHT)MEMORYBYA(COUNT) SEQ.MDENT.ENTERMDOSWITHOUTRELOADING SEQ.LOAD.LOADAFILEFROMDISK SEQ.DIRSM.DIRECTORYSEARCHANDMODIFY SEQ.PFNAM.PROCESSFILENAME SEQ.ALUSM.ALLOCATEUSERMEMORY SEQ.CHANG.CHANGENAME/ATTRIBUTES SEQ.MDERR.MDOSERRORMESSAGEHANDLER SEQ.ALLOC.ALLOCATEDISKSPACE SEQ.DEALC.RETURNDISKSPACE SEQ.EWORD.SETERRORSTATUSWORDFORCHAIN SEQ.TXBA.TRANSFERXTOB,A SEQ.TBAX.TRANSFERB,ATOX SEQ.XBAX.EXCHANGEB,AANDX SEQ.ADBX.ADDBTOX SEQ.ADAX.ADDATOX SEQ.ADBAX.ADDB,ATOX SEQ.ADXBA.ADDXTOB,A SEQ.SUBX.SUBTRACTBFROMX SEQ.SUAX.SUBTRACTAFROMX SEQ.SUBAX.SUBTRACTB,AFROMX SEQ.SUXBA.SUBTRACTXFROMB,A SEQ.CPBAX.CO MPAREB,ATOX SEQ.ASRX.SHIFTXRIGHT(ARITHMETIC) SEQ.ASLX.SHIFTXLEFT(ARITHMETIC/LOGICAL) SEQ.PSHX.PUSHXONSTACK SEQ.PULX.PULLXFROMSTACK SEQ.PRINT.PRINT-TERMINATEWITHCR SEQ.PRINX.PRINT-TERMINATEWITHEOT SEQ.GETFD.READFDR SEQ.PUTFD.WRITEFDR SEQ.PUTEF.WRITEEOF SEQ.EREAD.DISKREADW/ERRRETN SEQ.EWRIT.DISKWRITEW/ERRRETN IFNEMULTS SEQ.MREAD.MULTIPLESECTORREAD SEQ.MWRIT.MULTIPLESECTORWRITE SEQ.MERED.MULTIPLESECTORREADW/ERRRETURN SEQ.MEWRT.MULTIPLESECTORWRITEW/ERRRETURN ENDC IFEQMULTS SEQ SEQ SEQ SEQ ENDC SEQ.BOOT.RELOADMDOS * ORG.$SAV.RESTORELOCATIONCOUNTER PAGE * *ASCII…CONTROL…CHARACATERS * NULLEQU0.NULL SOHEQU1.STARTOFHEADING STXEQU2.STARTOFTEXT ETXEQU3.ENDOFTEXT EOTEQU4.ENDOFTRANSMISSION ENQEQU5.ENQUIRY(WRU-WHOAREYOU) ACKEQU6.ACKNOWLEDGE BELEQU7.BELL BSEQU8.BACKSPACE HTEQU9.HORIZONTALTAB LFEQU$A.LINEFEED VTEQU$B.VERTICALTAB FFEQU$C.FORMFEED CREQU$D.CARRIAGERETURN SOEQU$E.SHIFTOUT SIEQU$F.SHIFTIN DLEEQU$10.DATALINKESCAPE DC1EQU$11.DEVICECONTROL1 DC2EQU$12.DEVICECONTROL2 DC3EQU$13.DEVICECONTROL4 DC4EQU$14.DEVICECONTROL4 NAKEQU$15.NEGATIVEACKNOWLEDGE SYNEQU$16.SYNCHRONOUSIDLE ETBEQU$17.ENDOFTRANSMISSIONBLOCK CANEQU$18.CANCEL EMEQU$19.ENDOFMEDIUM SUBEQU$1A.SUBSTITUTE ESCEQU$1B.ESCAPE FSEQU$1C.FILESEPARATOR GSEQU$1D.GROUPSEPARATOR RSEQU$1E.RECORDSEPARATOR USEQU$1F.UNITSEPARATOR SPACEEQU$20.SPACE(WORDSEPARATOR) RUBOUTEQU$7F.DELETE(RUBOUT) * *SPECIAL…CHARACTER…EQUATES * SUFDLMEQU'..SUFFIXDELIMETER OPTDLMEQU';.OPTIONSDELIMETER DRVDLMEQU':.LOGICALDRIVERDELIMETER DEVDLMEQU'#.GENERICDEVICENAMEDELIMETER FAMDLMEQU'*.FAMILYNAME/SUFFIXDELIMETER E$FATLEQU1!<7.FATALERRORBIT PAGE * *MDOS…SECTOR…EQUATES * SC$DIDEQU0.DISKIDPHYSICALSECTORNUMBER SC$CATEQU1.CLUSTERALLOCATIONTABLEPHSYICALSECTORNUMBER SC$LOKEQU2.LOCKOUTCLUSTERTABLEPHYSICALSECTORNUMBER SC$DIREQU3.DIRECTORYSTARTPHYSICALSECTORNUMBER SC$DREEQU$16.DIRECTORYENDPHYSICALSECTORNUMBER SC$BBEQU$17.BOOTBLOCKPHYSICALSECTORNUMBER SC$DOSEQU$18.OPERATINGSYSTEMPHSYICALSECTORNUMBER(RIBADDRESS) SC$SIZEQU128.SECTORSIZEINBYTES SC$TRKEQU26.NUMBEROFSECTORS/TRACK SC$CLSEQU4.NUMBEROFSECTORS/CLUSTER SC$MAXEQU2000.MAXIMUMNO.OFUSABLESECTORS DFCLS$EQU32.DEFAULTNO.OFCLUSTERS * *DISK„ID…SECTOR…OFFSETS * DID$IDEQU0.OFFSETTODISKID(8BYTES) DID$VNEQU8.OFFSETTOVERSIONNUMBER(2BYTES) DID$RNEQU10.OFFSETTOREVISIONNUMBER(2BYTES) DID$DTEQU12.OFFSETTODATE(6BYTES) DID$NMEQU18.OFFSETTOUSERNAME(20BYTES) DID$RBEQU38.OFFSETTORIBADDRS.(20BYTES) * *DIRECTORY…ENTRY†OFFSETS * DIR$NMEQU0.OFFSETTONAME(8BYTES) DIR$SXEQU8.OFFSETTOSUFFIX(2BYTES) DIR$RBEQU10.OFFSETTORIBADDRESS(2BYTES) DIR$ATEQU12.OFFSETOFATTRIBUTES(2BYTES) DIR$NUEQU14.OFFSETTONOTUSEDAREA(2BYTES) * *R.I.B.…BINARY…FILE…OFFSETS * RIB$LBEQU117.NUMBEROFBYTESINLASTSECTOR RIB$SLEQU118 .NUMBEROFSECTORSTOLOAD RIB$LAEQU120.MEMORYLOADADDRESS RIB$SAEQU122.STARTEXECUTIONADDRESS RIB$OTEQU124.OVERLAYTABLEPOINTER RIB$SZEQU126.SIZEOFPROGRAMAREA PAGE * *UNIFIED…I/O†CONTROL…BLOCK† * *•OFFSETS * * IOCSTAEQU0.ERRORSTATUS IOCDTTEQU1.DATATRANSFERTYPE IOCDBPEQU2.DATABUFFERPOINTER IOCDBSEQU4.DATABUFFERSTARTADDRESS IOCDBEEQU6.DATABUFFERENDADDRESS IOCGDWEQU8.GENERICDEVICETYPE/CONTROLDESCRIPTORADDRESS IOCLUNEQU10.LOGICALUNITNUMBER IOCNAMEQU11.FILENAME IOCMLSEQU11.MAXIMUMREFERENCEDLOGICALSECTORNUMBER IOCSDWEQU13.CURRENTSEGMENTDESCRIPTORWORD IOCSLSEQU15.1STLOGICALSECTOROFCURRENTSEGMENT IOCLSNEQU17.CURRENTLOGICALSECTORNUMBER IOCSUFEQU19.FILENAMESUFFIX IOCEOFEQU19.LOGICALENDOFFILE IOCRIBEQU21.PHYSICALDISKADDRESSOFR.I.B. IOCFDFEQU23.FILEDESCRIPTORFLAGS IOCDENEQU27.DIRECTORYENTRYNUMBER IOCSBPEQU29.SECTORBUFFERPOINTER/INITIALALLOCATION IOCSBSEQU31.SECTORBUFFERSTARTADDRESS IOCSBEEQU33.SECTORBUFFERENDADDRESS IOCSBIEQU35.SECTORBUFFERINTERNALPTR IOCBLNEQUIOCSBI+2-IOCSTA.IOCBLENGTH * *UNIFIED…I/O…ERROR…STATUSES * .$SAVSET*.REMEMBERTHECURRENTLOCATIONCOUNTER ORG$0.RESETITTOZEROTOUSETHESEQMACRO * SEQI$NOER.NOERRORS,NORMALRETURN SEQI$NODV.NOSUCHDEVICE SEQI$RESV.DEVICERESERVEDALREADY SEQI$NORV.DEVICENOTRESERVED SEQI$NRDY.DEVICENOTREADY SEQI$IVDV.INVALIDDEVICE SEQI$DUPE.DUPLICATEFILENAME SEQI$NONM.FILENAMENOTFOUND SEQI$CLOS.FILENAMENOTOPEN/ORFILENOTCLOSED SEQI$EOF.ENDOFFILE SEQI$FTYP.INVALIDFILETYPE SEQI$DTYP.INVALIDDATATRANSFERTYPE SEQI$EOM.ENDOFMEDIA SEQI$BUFO.BUFFEROVERFLOW SEQI$CKSM.CHECKSUMERROR SEQI$WRIT.FILEISWRITEPROTECTED SEQI$DELT.FILEISDELETEPROTECTED SEQI$RANG.LOGICALSECTORNUMBEROUTOFRANGE SEQI$FSPC.NODISKFILESPACEAVAILABLE SEQI$DSPC.NODIRECTORYSPACEAVAILABLE SEQI$SSPC.NOSEGMENTDESCRIPTORSPACEAVAILABLE SEQI$IDEN.INVALIDDIR.ENTRYNO. SEQI$RIB.INVALIDRIB SEQI$DEAL.CAN'TDEALLOCATEALLSPACE SEQI$RECL.BINARYRECORDLENGTHTOOLRGE * ORG.$SAV.RESTORETHELOCATIONCOUNTER * PAGE * *MDOS…INTERNAL†VARIABLE * *‡AND†LOCATION†EQUATES * MDOS$EQU$100.STARTOFMDOSASECT CBUFL$EQU80.COMMANDBUFFERLENGTH CBUFF$EQUMDOS$-CBUFL$-2.COMMANDBUFFERLOCATION CBUFP$EQUCBUFF$+CBUFL$.COMMANDBUFFERSCANPOINTER VERS$$EQUMDOS$.VERSION# REVS$$EQUVERS$$+2.REVISION# KYI$SVEQUREVS$$+2.SAVEAREAFORKEYIN$VECTOR ENDOS$EQUKYI$SV+2.ENDOFMDOS ENDUS$EQUENDOS$+2.ENDOFUSERPROGRAMAREA ENDSY$EQUENDUS$+2.ENDOFSYSTEM(MDOS)RAM RIBBA$EQUENDSY$+4.RIBBUFFERADDRESS ENDRV$EQURIBBA$+2.ENDOFMDOSROMVARIABLES GDBA$EQUENDRV$+2.GENERICDEVICETABLEADDRESS SYERR$EQUGDBA$+2.SYSTEMERRORSTATUSWORD SWI$SVEQUSYERR$+2.SWIVECTORSAVEAREA SWI$UVEQUSWI$SV+2.SWIUSERVECTOR IRQ$UVEQUSWI$UV+2.IRQUSERVECTOR IRQ$SVEQUIRQ$UV+2.IRQVECTORSAVEAREA CHFLG$EQUIRQ$SV+2.CHAINFUNCTIONFLAGWORD SYIOCBEQUCHFLG$+2.SYSTEMCONSOLE‚IOCB SYPOCBEQUSYIOCB+IOCBLN.SYSTEMPRINTERIOCB SYEOCBEQUSYPOCB+IOCBLN. ERRMSGFILE PAGE * *LOGICALƒUNITƒNUMBER--BITƒDEFINITION * LU$RESEQU%01000000.IOCBRESERVEDFLAG * *IOCDTT„--…BIT…DEFINITIONS * DT$OPPEQU%00000000.OPENUPDATE/INPUT DT$OPIEQU%00000001.OPENINPUTMODE DT$OPOEQU%00000010.OPENOUTPUTMODE DT$OPUEQU%00000011.OPENUPDATEMODE DT$NFFEQU%00000100.NON-FILEFORMATI/OFLAG DT$TRUEQU%00001000.TRUNCATEFLAG DT$CLSEQU%00010000.FILEOPEN/CLOSEFLAG DT$SIOEQU%00100000.SECTORI/OFLAG DT$OUTEQU%01000000.OUTPUTTRANSFERTYPE DT$INPEQU%10000000.INPUTTRANSFERTYPE * *IOCFDF„--„BIT…DEFINITIONS * FD$FMUEQU%00000000.USERDEFINEDFORMAT(SECTORI/OONLY) FD$FMDEQU%00000001.DEFAULTOBJECTREC'DFORMAT(DEVICEDEPENDENT) FD$FMLEQU%00000010.BINARYLOADFORMAT--ABSOLUTEMEMORYIMAGE FD$FMBEQU%00000011.BINARYRECORDFORMAT--RASMOUTPUT,RLOADINPUT FD$FMREQU%00000100.BINARYLOADFORMAT--RELOCATABLEMEMORYIMAGE FD$FMAEQU%00000101.ASCIIRECORDFORMAT--INCLUDESEXORCISORLOADF FD$FMCEQU%00000111.ASCI-CONVERTED-BINARYRECORDFORMAT FD$CMPEQU%00001000.SPACECOMPRESSIONFLAG FD$CONEQU%00010000.CONTIGUOUSALLOCATIONFLAG FD$SYSEQU%00100000.SYSTEMFILEATTRIBUTE FD$DELEQU%01000000.DELETEPROTECTIONATTRIBUTE FD$WRTEQU%10000000.WRITEPROTECTIONATTRIBUTE * *UNIFIED„I/O„CONTROL…DESCRIPTOR * *’BLOCK…OFFSETS * CDBIOCEQU0.ADDRESSOFIOCB CDBSDAEQU2.SOFTWAREDRIVERADDRESS CDBHADEQU4.HARDWAREADDRESS CDBDDFEQU6.DEVICEDESCRIPTORFLAGS CDBVDTEQU7.VALIDDATATYPE CDBDDAEQU8.DEVICEDEPENDENTAREA CDBWSTEQU10.WORKINGSTORAGE * *CDBDDF„--„BIT„DEFINITIONS * DD$FMCEQU%00000001.ASCII-CONVERTED-BINARYISDEFAULTOBJECTRECORD DD$LOGEQU%00000010.LOGICALSECTORI/OFLAG DD$CNSEQU%00000100.CONSOLEFLAG DD$RWDEQU%00001000.REWINDFLAG DD$OCFEQU%00010000.OPEN/CLOSEFLAG DD$INPEQU%00100000.INPUTDEVICEFLAG DD$OUTEQU%01000000.OUTPUTDEVICEFLAG DD$RESEQU%10000000.RESERVABLEDEVICEFLAG * *CDBVDT„--…BIT„DEFINITIONS * VD$BINEQU%00000100.BINARYOBJECTFLAG VD$GDBEQU%00001000.TEMPGDBPOINTERFLAG VD$SDAEQU%00010000.TEMPSDAPOINTERFLAG VD$NFFEQU%10000000.NON-FILEFORMATFLAG * *DEVICE„DRIVER…ENTRY„OFFSETS * DV$ONEQU0.DEVICEONOFFSET DV$OFFEQU3.DEVICEOFFOFFSET DV$INTEQU6.DEVICEINTIALIZATIONOFFSET DV$TRMEQU9.DEVICETERMINATIONOFFSET DV$IOEQU12.DEVICECHARACTERINPUT/OUTPUTOFFSET PAGE * *DISK…EROM†EQUATES * CURDRVEQU0.CURRENTDRIVENUMBER STRSCTEQU1.STARTINGPHYSICALSECTORNUMBER NUMSCTEQU3.NUMBEROFSECTORSTOOPERATEUPON LSCTLNEQU5.NUMBEROFBYTESTOBEREADFROMLASTSECTOR CURADREQU6.MEMORYADDRESSFORDISKTRANSFER FDSTATEQU8.DISKTRANSFERSTATUS SCTCNTEQU11.SECTORCOUNTUSEDINDETERMININGERRORS PGMDRVEQU$1D.DRIVEFROMWHICHLASTPROGRAMWASLOADED PGMPSNEQU$1E.PHYSICALSECTORNUMBEROFRIBOFLASTLOADPROGRAM * *EROM„ENTRY„POINTS * OSLOADEQU$E800.BOOTSTRAPTHEOPERATINGSYSTEM FDINITEQU$E822.INITIALIZETHEDISK'SPIAANDSSDA CHKERREQU$E853.CHECKANDPRINTERRORFROMFDSTAT PRNTEREQU$E85A.PRINTERRORFROMFDSTAT READSCEQU$E869.RE ADSECTOR(S) READPSEQU$E86D.READPARTIALSECTOR RDCRCEQU$E86F.READANDCHECKFORCRC RWTESTEQU$E872.WRITE/READTEST RESTOREQU$E875.MOVEHEADTOTRACK0 SEEKEQU$E878.POSITIONHEADTOTRACKOF"STRSCT" WRTESTEQU$E87B.WRITETEST WRDDAMEQU$E87E.WRITEDELETEDDATAMARK WRVERFEQU$E881.WRITEANDVERIFYCRC WRITSCEQU$E884.WRITESECTOR(S) * *EROM…ERROR…EQUATES * ER$CRCEQU'1.DATACRCERROR ER$WRTEQU'2.WRITEPROTECTEDDISK ER$RDYEQU'3.DISKNOTREADY ER$MRKEQU'4.DELETEDDATAMARKENCOUNTERED ER$TIMEQU'5.TIMEOUT ER$DADEQU'6.INVALIDDISKADDRESS ER$SEKEQU'7.SEEKERROR ER$DMAEQU'8.DATAADDRESSMARKERROR ER$ACREQU'9.ADDRESSMARKCRCERROR * *MISCELLANEOUS…EROM…EQUATES * RETRY$EQU5.RETRYCOUNTFORDISKREAD/WRITEERRORS * *LINE„PRINTER…EROM…EQUATES * LPINITEQU$EBC0.INITPRINTERPIA LISTEQU$EBCC.PRINTCONTENTSOF'A' LDATAEQU$EBE4.PRINTSTRING,CR/LF LDATA1EQU$EBF2.PRINTSTRING,NOCR/LF PAGE * *EXBUG…EQUATES…FOR…MDOS * INCHNPEQU$F015.INPUTCHARACTER(NOPARITY) OUTCHEQU$F018.OUTPUTONECHARACTER PCRLFEQU$F021.PRINTLF/CR PDATAEQU$F024.PRINTSTRING SBIT$EQU$FCFD.BIT7INDICATESIRQOCCURRED(IFCLEARED) BRKPT$EQU$FF1F.MAID'SBREAKPOINTTABLE(8FDB'S) BKPIN$EQU$FF4F.EXBUGBREAKPOINTSINMEMORY(FROMCONTINUECMD) AECHOEQU$FF53.INPUTCHARACTERECHOFLAG(0=>ECHO) IRQ$VCEQU$FFF8.IRQVECTOR SWI$VCEQU$FFFA.SWIVECTOR NMI$VCEQU$FFFC.NMIVECTOR XSTAK$EQU$FF8A.EXBUGSTACK MAID$EQU$F0F3.MAIDENTRYPOINT XREG$PEQU$FF16.MAIDP-REG. XREG$XEQU$FF18.MAIDX-REG. XREG$AEQU$FF1A.MAIDA-REG. XREG$BEQU$FF1B.MAIDB-REG. XREG$CEQU$FF1C.MAIDC-REG. XREG$SEQU$FF1D.MAIDS-REG. BRKPE$EQU$FF63.ENDOFMAIDBREAKPOINTTABLE CNACI$EQU$FCF4.CONSOLEACIA * *SPECIALMACROFORTHECENTRONIXPRINTERSTOPRINTTITLES * TITLEMACR TTL\0 ENDM OPTLIST * *SPECIALOPTION--TURNONTHELISTING * TITLE(MDOS-EDOSFILECOPY) PAGE NAMMECOPY IDNTMDOSTOEDOSFILECOPYCOMMAND--APRIL27,1977 XDEFMECOP$ PAGE *ŽCOMMANDDESCRIPTION *Ž------------------- * *COMMANDNAME:‚MECOPY *------------ * *PURPOSE: *------- *‡THE"MECOPY"COMMANDALLOWSFILESFROMANMDOSDISKETTETOBE *COPIEDTOANDCATALOGUEDONANEDOS2.XDISKETTE.‚ONLYSINGLEFILES *CANBECOPIED. * *FORMAT: *------ * *ˆMECOPY[.][,] * *‡WHEREISAVALIDMDOSCOMMANDLINEDELIMETER,IS *THENAMEOFANASCII,MDOSFILEONDRIVEZERO,ISTHESUFFIX *OFTHEMDOSFILE(DEFAULTEDTO".SA"IFNOTSUPPLIED),AND *ISTHENAMEOFTHEEDOSFILETOBECREATEDONDRIVEONE. * *‡IFISNOTSPECIFIEDONTHECOMMANDLINE,THENTHE *FIRSTFIVECHARACTERSOFTHEMDOSFILENAMEWILLBEUSEDFORTHEEDOSFILE. * * *‡NOTE:‚ONLYASCIIFILESCANBECOPIEDFROMTHEMDOSDISK. *ŽTHEMDOSDISKMUSTBEDRIVEZERO.‚THEREFORE, *ŽTHEEDOSDISKMUSTBEDRIVEONE. * *ACTION: *------- * *‡THEWILLBESEARCHEDFORONDRIVEZERO.‚IFTHESPECIFIED *ISNOTFOUND,THENTHEMESSAGE: * *“FILENAMENOTFOUND * *WILLBEDISPLAYED.‚IFISFOUNDONDRIVEZERO,THEN *WILLBESEARCHEDFORINTHEEDOSDIRECTORYONDRIVEONE.‚IF *IS FOUNDTOEXISTONDRIVEONE,THENTHEMESSAGE: * *“DUPLICATEFILENAME * *WILLBEDISPLAYED.‚IFISNOTFOUNDINTHEDRIVEONE *DIRECTORY,THENANENTRYFORWILLBECREATED.‚THEMESSAGE: * *’DIRECTORYSPACEFULL * *MAYBEDISPLAYEDIFTHEDIRECTORYONDRIVEONE(EDOS)HAS *NOAVAILABLEENTRIESFORTHENEWFILE. * *IFTHEISNOTSPECIFIEDONTHECOMMANDLINE,THEMESSAGE: * *‘NAMEREQUIRED * *WILLBEDISPLAYED.‚AND,IFEITHERTHEOFTHECONTAIN *ADEVICEORFAMILYINDICATOR,THENTHEMESSAGE: * *ILLEGALFILENAME * *WILLBEDISPLAYED. * *‡IFTHEFILEISNOTANASCIIFILE,THENTHEMESSAGE: * *ŽINVALIDFILETYPE * *WILLBEDISPLAYED. * *‡DURINGNORMALCOPYING,COMPRESSEDSPACESWILLBEAUTOMATICALLY *EXPANDED,ANDCARRIAGERETURNSWILLBEFOLLOWEDWITH *ALINEFEED-NULLCHARACTERPAIR.‚THUS,THERESULTANTEDOSFILESIZEWILL *MOSTLIKELYBELARGERTHANTHEMDOSFILESIZE.‚THISWILLNOTALWAYS *BETHECASE,SINCETHEMDOSFILEWILLPROBABLYHAVEITSLASTCLUSTERONLY *PARTIALLYFILLED. * * *‡IF,DURINGTHEFILECOPY,DISKSPACEISEXHAUSTEDONTHEEDOSDISKETTE, *THEMESSAGE: * *DISKSPACEFULL * *WILLBEDISPLAYED. * *†AFTERTHECOPYISCOMPLETED,THEEDOSDIRECTORYPOINTERFORTHE *NEXTAVAILABLEDISKSECTORWILLBEUPDATED.‚THEN,THEMDOSCOMMAND *INTERPRETERWILLBEGIVENCONROL. * *†THEBREAKKEYCANBEUSEDTOABORTTHECOPYPROCESSATANYPOINT. PAGE * *MACROTOGENERATEAUSERSUPPLIEDARGUMENTORADEFAULT *„ARGUMENTFORAGIVENASSEMBLERDIRECTIVE.‚THEDEFAULT *„ARGUMENTISUSEDIFTHEUSERSUPPLIEDPARAMETERISNULL. * *„\0=ASSEMBLERDIRECTIVE(REQUIRED) *„\1=OPERANDPREFIXMODIFIER(OPTIONAL) *„\2=DEFAULTVALUE(REQUIRED) *„\3=USERSUPPLIEDVALUE(REQUIRED) *„\4=OPERANDSUFFIXMODIFIER(OPTIONAL) *„\5=COMMENTFORBOTHUSER/DEFAULTVALUE(OPTIONAL) *„\6=COMMENTMODIFIERFORDEFAULTVALUE(OPTIONAL) * IFNULLMACR IFNC,\3 \0\1\3\4.\5 ENDC IFC,\3 \0\1\2\4.\5--DEFAULT=\6 ENDC ENDM PAGE * *MACROTOINITIALIZEANIOCB * *ARGUMENT‚NAME‚REQ/OPT‚DEFAULT *-------------------------------- *„\0ƒIOCBLABEL‚R†--- *„\1ƒIOCDTT†O†DT$OPI *„\2ƒIOCDBS†O†0 *„\3ƒIOCDBE†O†0 *„\4ƒIOCGDT†O†"DK" *„\5ƒIOCLUN†O†"0" *„\6ƒIOCNAM†O†SPACES *„\7ƒIOCSUF†O†"SA" *„\8ƒIOCFDF†O†FD$FMA *„\9ƒIOCSBS†O†0 *‰IOCSBEIOCSBS+127 * * *„\AƒCANBEUSEDTOLIST/NOLISTMACROCALLSTOIFNULL * *‰\A=MCWILLTURNONPRINTINGMACROCALLSWITHINTHEIOCBMACRO. *ŒANYTHINGELSEWILLSUPPRESSPRINTINGOFEMBEDDEDMACRO *ŒCALLS. * * * *THEIOCBMACROREQUIRESTHEIFNULLMACRO * PAGE IOCBMACR IFEQNARG FAIL**PARAMETERSREQUIRED** ENDC * IFNCMC,\A OPTNOMC ENDC * IFNC,\0 \0EQU*.STARTOF\0IOCB ENDC * IFC,\0 \.0EQU*.STARTOFNAMELESS\.0IOCB ENDC * FCB0.IOCSTA IFNULLFCB,,DT$OPI,(\1),(+DT$CLS),(IOCDTT:CLOSED+),INPUT FDB0.IOCDBP IFNULLFDB,,0,(\2),,IOCDBS,0 IFNULLFDB,,0,(\3),,IOCDBE,0 IFNULLFCC,(2,),DK,(\4),,IOCGDT,DK IFNULLFCB,('0+),0,(\5),,IOCLUN,0 IFNULLFCC,(8,),(ˆ),(\6),,IOCNAM,SPACES IFNULLFCC,(2,),SA,(\7),,IOCSUF,SA FDB0.IOCRIB IFNULLFDB,,FD$FMA,(\8),(!<8),IOCFDF,ASCII FDB0.RESERVED FDB0.IOCDEN FDB0.IOCSBP IFNULLFDB,,0,(\9),,IOCSBS,0 IFNULLFDB,,0,(\9),(+SC$SIZ-1),IOCSBE,(0+127) FDB0.IOCSBI * IFNCMC,\A OPTMC ENDC * ENDM PAGE * *ED OSDIRECTORYANDSYSTEMEQUATES * NAMEEQU0.NAMEOFFSET ATTREQU5.ATTRIBUTEOFFSET TRACKEQU6.TRACKOFFSET SECTOREQU7.SECTOROFFSET SIZEEQU8.FILESIZEOFFSET ENTSIZEQU11.DIRECTORYENTRYSIZE DIRSIZEQU110.OFFSETTO11THENTRYINDIRECTORYSECTOR DIRSTREQU4.STARTINGDIRECTORYSECTOR(USING1-26NUMBERING) DIRMAXEQU26.ENDINGDIRECTORYSECTOR(USING1-26NUMBERING) ENDATTEQU-1.ENDOFDIRECTORYATTRIBUTE DELATTEQU$80.DELETEDDIRECTORYENTRYATTRIBUTE NAMSIZEQU5.EDOSFILENAMELENGTH LSTTRKEQU$4C.LASTTRACKONEDOSDISK * *ERRORMESSAGENUMBEREQUATES * MEER0EQU0.UNIFIEDI/OERROR MEER4EQU4.ILLEGALDRIVENUMBER MEER5EQU5.NAMEREQUIRED MEER7EQU7.ILLEGALFILENAME MEER19EQU19.INVALIDFILETYPE PAGE * *MACRODEFINITIONSFOR16BITARITHMETICANDLOAD/STOREOPERATIONS * LDBAXMACR LDAB\0,X.\1 LDAA\0+1,X.\2 ENDM * STBAXMACR STAB\0,X.\1 STAA\0+1,X.\2 ENDM * LDBAMACR LDAB\0.\1 LDAA\0+1.\2 ENDM * STBAMACR STAB\0.\1 STAA\0+1.\2 ENDM * ADBAMACR ADDA\0.\1 ADCB#0. ENDM * *DEFINEAMACROTOBEUSEDFORALONG-BRANCH * GOTOMACR IFCEQ,\1 BNE\.0 ENDC IFCNE,\1 BEQ\.0 ENDC IFCCC,\1 BCS\.0 ENDC IFCCS,\1 BCC\.0 ENDC JMP\0 \.0EQU*. ENDM PAGE * *DEFINEAMACROTOCONSTRUCTTHEEDOSSECTORTABLEMAP * *ENTERWITHSECTORNUMBER1-26(INDEXEDFROMSTARTOFTABLE-1) *ANDEXTRACTTHEMAPPEDSECTORNUMBER1-26. * * ESCTBMACR OPTNOMEX \.0SET1. RPT7,\.0 RPT7,\.0 RPT7,\.0 RPT5,\.0 OPTMEX ENDM * RPTMACR .TMPSET\0. OPTMEX FCB\1.\.1 OPTNOMEX \1SET\1+9. IFGT\1-26 \1SET\1-26 ENDC .TMPSET.TMP-1. IFGT.TMP RPT.TMP,\1 ENDC ENDM PAGE * *DATASECTION * DSCT * *MECOPYVERSION/REVISIONNUMBERS * FCC"0100". * *EDOSOPENTEMPORARYSTORAGE * EDO.SXFDB0.IOCBADDRESSSAVEAREA EDO.MVFDB0.MOVEPACKET FDB0. EDO.DEFCC"*****".EDOSDUMMYDIRECTORYENTRY FCBENDATT,LSTTRK,SC$TRK-2,0,0,0 * *DIRECTORYSEARCHTEMPORARYWORKAREA * EDI.SXFDB0.IOCBADDRESSSAVEAREA EDI.PKFCB0.PHYSICALSECTROI/OPACKET FDB0.PSN(MAPPED) FDB0.BUFFER FDB0.TRACK,SECTOR(NOTMAPPED) EDI.CMFDB0.COMPAREPAKET FDB0. * *EDOSPHYSICALI/OTEMPORARYSTORAGE * EDR.SXFDB0.I/OPACKETADDRESSSAVEAREA * *PUTRECORDTEMPORARYSTORAGE * PUT.SXFDB0.IOCBADDRESSSAVEAREA * *GET/PUTEDOSLOGICALSECTORTEMPORARYSTORAGE * GET.SXFDB0.IOCBADDRESSSAVEAREA GET.PKFCB0.I/OPACKET FDB0.PSN FDB0.BUFFER FDB0.TRACK,SECTOR * *EDOSCLOSETEMPORARYSTORAGE * EDC.SXFDB0.IOCBADDRESSSAVEAREA PAGE * *DEFINETHEEDOSSECTORMAPPINGTABLE * SCTTBLESCTB PAGE * *DEFINETHEIOCB'S * IOCBMDOSIO,,IREC,IRECE,,,,,,IBUFF * IOCBEDOSIO,DT$OPO,,,,1,,(‚),,OBUFF PAGE * *DEFINETHESECTORBUFFERS * IBUFFBSZSC$SIZ. * OBUFFBSZSC$SIZ. * *DEFINETHERECORDBUFFERS * IRECBSZ132. IRECEEQU*. * *DEFINETHEPFNAMPACKETS * EDPFNFDB0. FDBEDOSIO+IOCLUN * MDPFNFDB0. FDBMDOSIO+IOCLUN * *DEFINESTACKAREA * BSZ100 STACKEQU*. PAGE * *PROGRAMSECTION * PSCT * *START‚OFMAINCONTROLLOOP * MECOP$EQU*. LDS#STACK.INITTHESTACKPOINTER JSRSCANCL.GETNAMESFROMCOMMANDLINE BNEMEXIT.NE=>ERROR * JSRCHKDRV.VERIFYDRIVENUMBERS BNEMEXIT.NE=>ERROR * LDX#MDOS IO.IOCBADDRESS JSRMDOPEN.OPENTHEMDOSFILE--INPUT BNEMEXIT0.NE=>ERROR * SCALL.CKBRK.SEEIFTHEOPERATORWANTSTOQUIT BCSMEXIT.CS=>YES * LDX#EDOSIO.IOCBADDRESS JSREDOPEN.OPENTHEEDOSFILE--OUTPUT BNEMEXIT0.NE=>ERROR * MEC010JSRGETRC.READANMDOSRECORD BCSMEC030.CS=>ENDOFFILE JSRPUTRC.WRITETHERECORDTOEDOSFILE BCSMEXIT0.CS=>ERROR SCALL.CKBRK.SEEIFOPERATORWANTSTOQUIT BCCMEC010.CC=>NO,CONTINUE * *CLOSETHEFILES * MEC030LDX#EDOSIO. JSREDCLOS.CLOSETHEOUTPUTFILE BNEMEXIT0.NE=>ERROR LDX#MDOSIO. JSRMDCLOS.CLOSETHEINPUTFILE BEQMEND.EQ=>NORMALEXIT * *ERROREXIT * MEXIT0LDAB#MEER0.UNIFIEDI/OERROR MEXITSCALL.MDERR.‚DISPLAYTHEERRORMESSAGE * *NORMALEND * MENDSCALL.MDENT.RETURNTOMDOSCOMMANDLININTERPRETER PAGE * *SCANTHEMDOSCOMMANDLINEFORTHEINPUTANDOUTPUTFILENAMES * *EXIT:Z=1IFNORMAL *‡Z=0IFERROR * * SCANCLEQU*. LDXCBUFP$.GETTHECOMMANDLINEBUFFERPOINTER STXMDPFN. LDX#MDPFN.POINTTOTHEPACKET SCALL.PFNAM.EXTRACTTHEMDOSFILENAME TSTB. BNESCANE.NE=>ERROROCCURRED * LDXMDPFN.SAVECOMMANDLINESCANPOINTER STXEDPFN.INTOEDOSFILENAMEPACKET * *USETHEMDOSFILENAMEASADEFAULT * LDX#MDOSIO+IOCNAM STXMDPFN. LDX#EDOSIO+IOCNAM STXMDPFN+2. LDAB#NAMSIZ. LDX#MDPFN.MOVEPACKET SCALL.MOVE * LDX#EDPFN. SCALL.PFNAM.EXTRACTTHEEDOSFILENAME ANDB#$7F.STRIPOFFNULLFILENAME(OK) BNESCANE1.NE=>ERROROCCURRED SCANXRTS.EXIT * SCANEASLB.CHECKFORNULLFILENAME LDAB#MEER5. BCSSCANX.CS=>NAMEREQUIRED SCANE1LDAB#MEER7.ILLEGALFILENAME BRASCANX PAGE * *CHECKFORVALIDDRIVEASSIGNMENT:‚EDOS=1,MDOS=0 * *EXIT:Z=1IFNORMAL *‡Z=0IFERROR * * CHKDRVEQU*. LDAAMDOSIO+IOCLUN CMPA#'0. BNECHKDE.NE=>WRONGASSIGNMENT LDAAEDOSIO+IOCLUN CMPA#'1. BNECHKDE.NE=>WRONGASSIGNMENT CHKDRXRTS.EXIT * CHKDELDAB#MEER4.ILLEGALDRIVENUMBER BRACHKDRX. PAGE * *RESERVEANDOPENTHEMDOSINPUTFILE * *EXIT:Z=1,C=0IFNORMAL *‡Z=0,C=1IFERROR * * MDOPENEQU*. SCALL.RESRV. BCSMDOPEX.CS=>ERROR SCALL.OPEN. BCSMDOPEX.CS=>ERROR LDAAIOCFDF,X.CHECKTHEATTRIBUTETYPE ANDA#7.ISOLATEFILETYPEBITS CMPA#FD$FMA.ITMUSTBEASCII BNEMDOPE1.NE=>ERROR CLRB. MDOPEYSTABIOCSTA,X. MDOPEXRTS.EXIT * MDOPE1LDAB#I$FTYP.INVALIDFILETYPE BRAMDOPEY. PAGE * *OPENTHEEDOSFILEONTHEOUTPUTDIRVE * *X=IOCBADDRESS *…IOCNAM,IOCDTT,IOCLUNREQUIRED * *UPONEXITING:IOCLSN=TRACK,SECTOROFFILE *IOCDEN=TRACK,SECTOROFDIRECTORYSECTOR *IOCDEN-2=OFFSETINTOSECTORBUFFEROFDIRECTORYENTRY *IOCRIB=TRACK,SECTOROFFILE *IOCMLS=0 * *ŽZ=1IFNORMAL *ŽZ=0IFERROR * * * EDOPENEQU*. STXEDO.SX.SAVEIOCBADDRESS LDBAXIOCGDW,(CHECKDEVICETYPE) CMPB#'D. GOTOEDOE10,NE.NE=>ILLEGALDEVICE CMPA#'K. GOTOEDOE10,NE.NE=>ILLEGALDEVICE LDAAIOCDTT,X. BITA#DT$CLS. GOTOEDOE20,EQ.EQ=>FILEALREADYOPEN ANDA#3.SAVEOPENTYPE CMPA#DT$OPO. BEQEDO200.EQ=>OPENFOROUTPUTONLY CMPA#DT$OPI. GOTOEDOE20,NE.NE=>ILLEGALOPENTYPE * *OPENFILEFORINPUTONLY * EDO100JSREDIRSM.SEARCHFORFILENAMEONEDOSDIRECTORY GOTOEDOE30,NE.NE=> FILENAMENOTFOUND EDO110LDAAIOCDTT,X. ANDA#$FF-DT$CLS.TURNOFFTHECLOSEDBIT STAAIOCDTT,X. LDBAXIOCSBS STBAXIOCSBP,(INITBUFFERPOINTER) CLRIOCMLS,X.ZEROMAXLSN CLRIOCMLS+1,X. LDBAXIOCRIB,(GETTRACK,SECTOROFFILE) STBAXIOCLSN,(SETFIRSTTRACK,SECTOR) CLRB.SETNORMALEXIT EDO199STABIOCSTA,X.SETTHERETURNSTATUS RTS.EXIT PAGE * *OPENFILEFOROUTPUTONLY * EDO200JSREDIRSM.SEARCHFORFILENAMEONEDOSDIRECTORY GOTOEDOE40,EQ.EQ=>DUPLICATEFILENAME LDBAXIOCDEN,(PICKUPDIRECTORYSECTOR) STBAXIOCLSN,(SETUPLSNTOACCESSDIRECTORY) LDXIOCSBP,X.GETADDRESSOFLASENTRYINDIRECTORY LDAAATTR,X. CMPA#ENDATT.ITMUSTBEADELETEDONETOBETHELASTONE GOTOEDOE50,NE.NE=>NODIRECTORYSPACE LDAA#SC$TRK-1.CALC#SECTORSLEFT STAASIZE+1,X. LDAA#LSTTRK. SUBATRACK,X.#TRACKSLEFT-1 STAASIZE,X. CLRB. EDO210ADDASIZE,X.TIMES26SECTORS/TRACK ADCB#0. DECSIZE+1,X. BNEEDO210. ADBA#SC$TRK-2,(PLUSMAX#SECTORSONLASTTRACK) SUBASECTOR,X.MINUSSECTORSUSEDINCURRENTTRACK SBCB#0. BNEEDO220.NE=>STILLROOMLEFTONDISK TSTA. BNEEDO220.NE=>STILLROOMLEFT JMPEDOE60.EQ=>DISKSPACEFULL * EDO220ADBA#1.CORRECTFILESIZEFORDIRECTORY STBAXSIZE,(PUTCORRECTSIZEINTODIRECTORYENTRY) LDBAXTRACK,TRACK,SECTOR STXEDO.MV+2.INITTHEMOVEPACKETDESTINATIONADDRESS LDXEDO.SX.POINTTOIOCB STBAXIOCRIB,TRACK,SECTOR LDAA#IOCNAM. SCALL.ADAX. STXEDO.MV.SETSOURCEADDRESSINMOVEPACKET LDX#EDO.MV. LDAB#NAMSIZ. SCALL.MOVE.PUTTHENAMEINTOTHEDIRECTORYENTRY * *CREATETHEDUMMYDIRECTORYENTRYFOREDOSDIRECTORY * LDXEDO.SX.POINTTOIOCB LDBAXIOCSBS.ISTHEREROOMFORDUMMYENTRYINTHISSECTOR? ADBA#DIRSIZ. CMPAIOCSBP+1,X. BNEEDO250.NE=>YES,THERE'SROOM CMPBIOCSBP,X. BNEEDO250. * *THEREISNOROOMFORTHEDUMMYENTRYINTHECURRENTSECTOR. *WRITEOUTTHECURRENTSECTORFIRSTANDTRYTOPUTENTRYINTONEXT *SECTOR. * JSRPUTELS.PUTOUTCURRENTEDOSSECTOR INCIOCLSN+1,X.BUMPTHESECTORNUMBERBY1 LDAAIOCLSN+1,X. CMPA#DIRMAX+1.ISITPASTTHEENDOFTHEDIRECTORY? BEQEDO280.EQ=>YES,DON'TPUTDUMMYENTRYOUT * *ZEROFILLTHECURRENTSECTORBUFFERBEFORECREATINGNEWDUMMYENTRY * LDXIOCSBS,X.POINTTOSTARTOFBUFFER LDAB#SC$SIZ. CLRA. SCALL.STCHR. LDXEDO.SX.POINTBACKTOIOCB BRAEDO260. * *UPDATETHECURRENTBUFFERPOINTERTOTHENEXTENTRYINTHESECTOR * EDO250LDBAXIOCSBP. ADBA#ENTSIZ. STBAXIOCSBP. EDO260LDXIOCSBP,X.POINTTOTHENEWDIRECTORYENTRY STXEDO.MV+2.SETUPDESTINATIONPOINTEROFMOVEPACKET LDX#EDO.DE.GETADDRESSOFDUMMYENTRYINMEMORY STXEDO.MV.SETUPSOURCEPOINTEROFMOVEPACKET LDAB#ENTSIZ. LDX#EDO.MV.POINTTO‚THEMOVEPACKET SCALL.MOVE.MOVETHEDUMMYENTRYINTOTHECURRENTBUFFER LDXEDO.SX.POINTTOIOCB JSRPUTELS.WRITEOUTCURRENTSECTOR EDO280LDXEDO.SX.POINTTOIOCB JMPEDO110.GOSETFILEOPENANDEXIT PAGE * *EDOSOPENERRORHANDLER * EDOE10LDAB#I$IVDV.INVALIDDEVICE SKIP2 * EDOE20LDAB#I$CLOS.FILEALREADYOPEN SKIP2 * EDOE30LDAB#I$NONM.FILENAMENOTFOUND SKIP2 * EDOE40LDAB#I$DUPE.DUPLICATEFILENAME SKIP2 * EDOE50LDAB#I$DSPC.DIRECTORYSPACEFULL SKIP2 * EDOE60LDAB #I$FSPC.DISKSPACEFULL * LDXEDO.SX.POINTTOIOCB SEC.SETERROREXITSTATUS JMPEDO199.SETSTATUSANDEXIT PAGE * *SEARCHFORFILENAMEINEDOSDIRECTORY * *ENTRY:X=IOCBADDRESS * *EXIT:Z=1=>NAMEFOUNDINDIRECTORY *‡Z=0=>NAMENOTFOUNDINDIRECTORY * *ˆIOCRIB=TRACK,SECTOROFFILE,IFFOUND *ˆIOCDEN=TRACK,SECTOROFDIRECTORYSECTOR *†IOCDEN-2=OFFSETINTOSECTORBUFFEROFDIRECTORYENTRY * * EDIRSMEQU*. STXEDI.SX.SAVEIOCBADDRESS LDAA#DIRSTR.INITEDOSDIRECTORYSECTOR EDI005CLREDI.PK+5.TRACK0 STAAEDI.PK+6.SAVEDIRSECTORNUMBER LDBAXIOCSBS. STBAXIOCSBP,(INITBUFFERPOINTER) STBAEDI.PK+3,(INITBUFFERPOINTER) LDABIOCLUN,X. ANDB#3.ISOLATEDRIVENUMBER LDX#EDI.PK. JSREDREAD.READANEDOSDIRECTORYSECTOR * EDI010LDXEDI.SX.POINTTOIOCB LDXIOCSBP,X.POINTTODIRECTORYSECTOR LDAAATTR,X. CMPA#ENDATT.CHECKFORENDOFDIRECTORTY BEQEDI100.EQ=>ENTRYNOTFOUND CMPA#DELATT.CHECKFORDELETEDENTRY BEQEDI020.EQ=>SKIPDELETEDENTRY STXEDI.CM.SETUPCOMPAREPARAMETERSFORNAME LDXEDI.SX.POINTTOIOCB LDAB#IOCNAM. SCALL.ADBX.POINTTONAME STXEDI.CM+2. LDAB#NAMSIZ. LDX#EDI.CM.POINTTOTHEPARAMETERPACKET SCALL.CMPAR.COMPARENAMES BEQEDI200.EQ=>FILENAMEFOUND * *CURRENTDIRECTORYENTRYDOESNOTMATCH * EDI020LDXEDI.SX.POINTTOIOCB LDBAXIOCSBS,(GETBUFFERPOINTER) ADBA#DIRSIZ. CMPAIOCSBP+1,X.CHECKFORENDOFSECTOR BNEEDI030.NE=>STILLMORETOCHECK CMPBIOCSBP,X. BEQEDI040.EQ=>ENDOFTHISSECTOR * EDI030LDBAXIOCSBP,(UPDATEPOINTERTONEXTENTRY) ADBA#ENTSIZ. STBAXIOCSBP. BRAEDI010.KEEPLOOKING * *THEENDOFTHECURRENTSECTORWASFOUNDWITHOUTAMATCH. *SETUPTOREADTHENEXTSECTOR,IFNOTATTHEEND *OFTHEDIRECTORYALREADY. * EDI040LDAAEDI.PK+6.GETDIRECTORYSECTOR# INCA. CMPA#DIRMAX+1.ATEND? BNEEDI005.NE=>MORETOSCAN * *THEREQUESTEDDIRECTORYENTRYWASNOTFOUND * EDI100LDAB#I$NONM. BRAEDI210. * *THEREQUESTEDDIRECTORYENTRYWASFOUND * *SAVETRACK,SECTOR,ETC. * EDI200CLRB.SETNORMALRETURNSTATUS EDI210LDXEDI.SX.POINTTOIOCB STABIOCSTA,X.SETTHERETURNSTATUS LDXIOCSBP,X.POINTTODIRECTORYENTRY LDBAXTRACK,TRACK,SECTOR LDXEDI.SX.POINTTOIOCB STBAXIOCRIB,(SAVERIBADDRESS) LDBAEDI.PK+5,TRACK,SECTOROFDIRECTORYENTRY STBAXIOCDEN,TRACK,SECTOR LDBAXIOCSBP,(GETCURRENTBUFFERPOINTER) SUBAIOCSBS+1,X.CALCOFFSETOFCURRENTDIRECTORYENTRY SBCBIOCSBS,X. STBAXIOCDEN-2,(SAVEOFFSETOFDEN) LDABIOCSTA,X.SETRETURNSTATUS RTS.EXIT PAGE * *EDOSPHYSICALSECTORI/OROUTINE * * *B=DRIVE *X=I/OPACKETADDRESS *‰FDB0.STATUS *‰FDB0.PSN(CHANGEDBYROUTINE) *‰FDB0.BUFFER *‰FDB0.TRACK,SECTOR(UNMAPPED)SECTORIS1-26 * EDWRITEQU*. LDAA#1.SETUPWRITETYPE SKIP1. * EDREADEQU*. CLRA.SETUPREADTYPE PSHB.SAVEDRIVE PSHA.SAVEI/OTYPE STXEDR.SX.SAVEI/OPACKETADDRESS LDBAX5,TRACK,SECTOR * *SINCEINDEX(SECTORNUMBER)ISINRANGE1-26,OFFSETBASE *ADDRESSOFTABLEBY1 * LDX#SCTTBL-1.POINTTOEDOSSECTORMAPTABLE SCALL.ADAX.INDEXINTOTABLE LDAAX.GETMAPPEDSECTORNUMBER DECA.MAKESECTORNUMBERRELATIVETO0 JSRTS2PSN.CONVERTTRACKSECTOR(MAPPED)INTOPHYSICALSECTOR# LDXEDR .SX.RESTOREPACKETPOINTER STBAX1,PSN<8,PSN PULA.RESTOREI/OTYPE PULB.RESTOREDRIVENUMBER TSTA. BNEEDR010.NE=>WRITEOPERATION SCALL.DREAD.READASECTOR EDR005RTS.EXIT * EDR010SCALL.DWRIT.WRITEASECTOR BRAEDR005. PAGE * *READARECORDFROMTHEINPUT(MDOS)FILE * *EXIT:Z=1IFNORMAL *‡Z=0IFERROR * * GETRCEQU*. LDX#IREC.INITTHEDATABUFFERPOINTERS STXMDOSIO+IOCDBS. LDX#IRECE. STXMDOSIO+IOCDBE. LDX#MDOSIO.POINTTOTHEIOCB SCALL.GETRC.READARECORD BEQGETRCX.EQ=>NORMALRETURN CMPB#I$EOF.CHECKFORENDOFFILE BEQGETRCY.EQ=>GOODERROREXIT LDAB#MEER0.UNIFIEDI/OERROR SCALL.MDERR. LDABSYERR$+1.RESTOREERRORTYPE GETRCYSEC.SETERROREXIT GETRCXRTS. PAGE * *WRITEARECORDFROMTHEINPUTRECORDBUFFERINTOTHEOUTPUTFILE * * *EXIT:Z=1IFNORMAL *‡Z=0IFERROR * * PUTRCEQU*. LDXMDOSIO+IOCDBP.GETENDOFCURRENTRECORD STXMDOSIO+IOCDBE.SETENDOFCURRENTRECORD LDXMDOSIO+IOCDBS.GETSTARTOFCURRENTRECORD STXMDOSIO+IOCDBP.SETSTARTOFCURRENTRECORD * PUT010LDX#MDOSIO.POINTTOOUTPUTIOCB JSRPUT100.GETONEINPUTBYTE GOTOPUT300,CS.CS=>NOMOREDATAINRECORD LDX#EDOSIO.POINTTOOUTPUTIOCB PSHA.SAVEBYTETOBEOUTPUT JSRPUT200.PUTOUTONEBYTE PULA.RESTORETHEOUTPUTBYTE GOTOPUTE10,NE.NE=>RANOUTOFDISKSPACE CMPA#CR.WASITACARRIAGERETURN? BNEPUT010.NE=>NO,KEEPPUTTINGOTHERCHARACTERS LDAA#LF.EQ=>YES,SUPPLYLINEFEEDANDNULLFOREDOSFILE JSRPUT200. GOTOPUTE10,NE. LDAA#NULL. JSRPUT200. GOTOPUTE10,NE. BRAPUT010. PAGE * *GETABYTEFROMTHEINPUTBUFFER * *X=IOCBADDRESS * *A=‚RETURNEDBYTE * PUT100LDBAXIOCDBE.CHECKIOCDBP>IOCDBE SUBAIOCDBP+1,X. SBCBIOCDBP,X. BCSPUT190.CS=>ENDOFLINEENCOUNTERED STXPUT.SX.SAVEIOCBADDRESS LDXIOCDBP,X.POINTTOTHEBYTETOGET LDAAX.GETIT LDXPUT.SX.RESTOREIOCBADDRESS INCIOCDBP+1,X.BUMPPOINTER BNEPUT180. INCIOCDBP,X. PUT180CLC.SETNORMALEXIT PUT190RTS.EXIT PAGE * *PUTABYTEINTOTHEOUTPUTBUFFFER * *A=BYTE *X=IOCB * PUT200STXPUT.SX.SAVEIOCBADDRESS LDXIOCSBP,X.GETBUFFERPOINTER STAAX.STORETHEBYTE LDXPUT.SX.RESTOREIOCBPOINTER INCIOCSBP+1,X.BUMPPOINTERBY1 BNEPUT210. INCIOCSBP,X. PUT210LDBAXIOCSBP. SUBAIOCSBE+1,X.CHECKIOCSBP>IOCSBE SBCBIOCSBE,X. BCSPUT290.CS=>OK,NOTFULLYET TSTA.CHECKFORLASTBYTE BEQPUT290.EQ=>OK,ONEMOREBYTETOFILL * *THECURRENTSECTORBUFFERISFULL. *OUTPUTTHESECTORANDRESETTHEPOINTERS * JSRPUTELS.WRITEOUTTHESECTOR LDBAXIOCMLS. ADBA#1. STBAXIOCMLS.BUMPMAXLSN(SIZE) LDBAXIOCLSN,TRACK,SECTOR JSRINTRSC.INCREMENTTRACK,SECTORBY1 BNEPUT299.NE=>DISKSPACEFULL STBAXIOCLSN,TRACK,SECTOR LDBAXIOCSBS STBAXIOCSBP,(RESETBUFFERPOINTER) PUT290CLRB PUT299STABIOCSTA,X. RTS PAGE * *PUTRECORDERRORHANDLER * PUTE10LDAB#I$FSPC.NODISKSPACELEFT SEC.SETERROREXITSTATUS BRAPUT399. * *NORMALEXIT * PUT300CLRB. PUT399LDXPUT.SX.POINTTOIOCB STABIOCSTA,X. RTS. PAGE * *INCREMENTTRACKSECTORINB,A * *EXITZ=1IFOKEXIT *†Z=0IFDISKSPACEEXCEEDED * * INTRSCEQU*. INCA.BUMPSECTORNUMBER CMPB#LSTTRK.CHECKFORLASTTRACK BEQ INT060. CMPA#SC$TRK+1.CHECKIFMAXSECTOREXCEEDEDYET BNEINT080.NE=>NOTYET BRAINT070. * INT060CMPA#SC$TRK-2+1.LASTTRACKHASFEWERSECTORS BNEINT080. INT070INCB.BUMPTRACKNUMBER LDAA#1.RESETSECTORNUMBER CMPB#LSTTRK+1.CHECKFORENDOFDISK BEQINTE10.EQ=>OUTOFSPACE INT080PSHA.SAVEA CLRA.SETZ=1FORGOODEXIT INT090PULA.RESTOREA RTS.EXIT * *ERROREXIT * INTE10PSHA.SAVEA LDAA#1.SETZ=0FORBADEXIT BRAINT090. PAGE * *CONVERTTRACKSECTORTOPHYSICALSECTORNUMBER * *ENTRY:B=TRACK *ˆA=SECTOR * *EXIT:B,A=PSN * TS2PSNEQU*. SCALL.PSHX.SAVEX PSHA.SAVESECTORNUMBER TBA. CLRB.B,A=16BITTRACKNUMBER * *MULTIPLYTRACKTIMES26 * *26X=16X+8X+2X * ASLA. ROLB.TRACK*2 PSHA.SAVETRACK*2 PSHB. ASLA. ROLB.TRACK*4 ASLA. ROLB.TRACK*8 PSHA.SAVETRACK*8 PSHB. ASLA. ROLB.TRACK*16 TSX. ADDA1,X. ADCBX.TRACK*16+TRACK*8=TRACK*24 ADDA3,X. ADCB2,X.TRACK*24+TRACK*2=TRACK*26 ADDA4,X.ADDINSECTORNUMBER ADCB#0. INS.RESTORESTACK INS. INS. INS. INS. SCALL.PULX.RESTOREX RTS. PAGE * *CLOSEANDRELEASETHEMDOSFILE * *EXIT:Z=1IFNORMAL *‡Z=0IFERROR * * MDCLOSSCALL.CLOSE. BNEMDC005.NE=>ERROROCCURRED SCALL.RELES. MDC005RTS.EXIT PAGE * *READ/WRITETHECURRENTSECTORINIOCLSNOFANIOCB * * PUTELSLDAA#1.SETTHEWRITETYPE SKIP1 * GETELSCLRA.SETTHEREADTYPE PSHA.SAVETHEI/OTYPE STXGET.SX.SAVETHEIOCBADDRESS LDBAXIOCSBS,(GETTHEBUFFERPOINTERRESET) STBAXIOCSBP STBAGET.PK+3,(INITPHYSICALI/OPACKETBUFFER) LDABIOCLUN,X. ANDB#3.ISOLATETHEDRIVENUMBER PSHB.SAVEDRIVENUMBER LDBAXIOCLSN,TRACK,SECTOR LDX#GET.PK.POINTTOTHEI/OPACKET STBAX5,TRACK,SECTOR PULB.RESTOREDRIVENUMBER PULA.RESTORETHEI/OTYPE TSTA. BEQGET010.EQ=>READ JSREDWRIT.WRITETHESECTOR BRAGET020 * GET010JSREDREAD.READTHESECTOR GET020LDXGET.SX.RESTORETHEIOCBPOINTER RTS.EXIT PAGE * *CLOSETHEEDOSFILE * *X=IOCBADDRESS * * *EXITZ=1IFNORMAL *†Z=0IFERROR * EDCLOSEQU*. STXEDC.SX.SAVETHEIOCBADDRESS LDAAIOCDTT,X. BITA#DT$CLS. GOTOEDCE10,NE.NE=>ALREADYCLOSED ANDA#3. CMPA#DT$OPI.CHECKOPENTYPE GOTOEDC200,EQ.EQ=>INPUTCLOSE,JUSTEXIT CMPA#DT$OPO. GOTOEDCE20,NE.NE=>ILLEGALOPENMODE * *FILLTHELASTSECTORWITHNULLS * LDBAXIOCSBE. SUBAIOCSBP+1,X. SBCBIOCSBP,X. ADBA#1.CALCLENGTHOFUNUSEDBUFFERAREA CMPA#SC$SIZ. BEQEDC050.EQ=>NOTHINGTOFILLIFEMPTYBUFFER LDXIOCSBP,X.GETBUFFERPOINTER TAB.SETLENGTH CLRA.SETNULL SCALL.STCHR.FILLTHEBUFFER LDXEDC.SX.POINTTOIOCB JSRPUTELS.WRITEOUTCURRENTSECTOR INCIOCMLS+1,X. BNEEDC050. INCIOCMLS,X. EDC050LDBAXIOCLSN,(SAVEEOFOFFILE) STBAXIOCSBI LDBAXIOCDEN,(GETDIRECTORYENTRYTRACK/SECTOR) STBAXIOCLSN JSRGETELS.READINTHEDIRECTORYSECTOR LDBAXIOCDEN-2,(GETBUFFEROFFSET) LDXIOCSBP,X.GETSTARTOFBUFFER SCALL.ADXBA. LDXEDC.SX.POINTTOIOCB STBAXIOCSBP,(SAVEPOINTERTODIRECTORYENTRY) LDBAXIOCMLS,(GETSIZE) LDXIOCSBP,X.POINTTODIRECTORYENTRY ADBA#1,(ADJUSTFORDIRECTORYITEM) STBAXSIZE,(SETSIZEINTOENTRY) CLRATTR,X.SETATTRIBU TETO0 LDXEDC.SX.POINTBACKTOIOCB LDAAIOCDEN-2+1,X.CHECKIFTHISISLASTENTRYINSECTOR CMPA#DIRSIZ. BNEEDC100.NE=>NO JSRPUTELS.EQ=>YES,WRITEOUTSECTOR LDAAIOCLSN+1,X.GETDIRECTORYSECTORNUMBER CMPA#DIRMAX.ATEND? BEQEDC200.EQ=>YES,DON'THAVETOPUTOUTDUMMYENTRY INCIOCLSN+1,X.BUMPSECTORNUMBER JSRGETELS.READINSECTORWITHDUMMYENTRYINIT BRAEDC110. * EDC100LDBAXIOCSBP ADBA#ENTSIZ,(POINTTONEXTENTRYINBUFFER) STBAXIOCSBP * EDC110LDXIOCSBP,X.POINTTOENDINGENTRY LDAAATTR,X.CHECKTOSEEITREALLYISENDINGENTRY CMPA#ENDATT. BNEEDCE30.NE=>NOENDPOINTERINDIRECTORY LDXEDC.SX.POINTTOIOCB LDBAXIOCSBI,(GETLASTUSEDTRACK,SECTOR) JSRINTRSC.BUMPITBYONE BNEEDCE40.NE=>NOMOREDISKSPACE LDXIOCSBP,X.POINTTOENTRYAGAIN STBAXTRACK LDXEDC.SX.POINTTOIOCB JSRPUTELS.WRITEOUTDIRECTORYSECTOR * *NORMALEXIT * EDC200CLRB. EDC299LDXEDC.SX.POINTTOIOCB STABIOCSTA,X.SETEXITSTATUS RTS. * *ERRORHANDLERFOREDOSCLOSE * EDCE10LDAB#I$CLOS.FILENOTOPEN SKIP2 * EDCE20LDAB#I$DTYP.ILLEGALOPENMODE SKIP2 * EDCE30LDAB#I$IDEN.MISSINGENDINGDIRECTORY(DUMMY)ENTRY SKIP2 * EDCE40LDAB#I$FSPC.NOMOREDISKSPACE?? SEC. BRAEDC299. PAGE ENDMECOP$ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@|ÀXà€Ú0010 NAM HPPRM 0020 SPC 1 0025 OPT O,NOG 0030 *HP INTERFACE PROGRAM--PART 1 0040 SPC 1 0050 * INTERFACE PROGRAM FOR HP2644A CRT 0060 * PROVIDES SO CASSETTES WORK WITH EXBUG 0070 * HP PROGRAM MODIFIED BY W.C.WRAY 0080 * THIS IS IO PORTION TO WORK WITH MOTOROLA 0090 * CORESIDENT ASSEMBLER AND EDITOR VER.1.3 0100 * HP PRINTER IS ASSUMED BUT CAN BE BYPASSED 0110 SPC 2 0120 * EQUATES 0130 SPC 1 0140 ASTART EQU $304 ASSEMBLER ENTRY 0150 ESTART EQU $1610 EDITOR ENTRY 0160 EXBUG EQU $F564 EXBUG ENTRY 0170 OUTCH EQU $F018 EXBUG OUTCH ROUTINE 0180 PAPER EQU $EB02 EDOS READER INIT ROUTINE 0190 INXPTP EQU $EB04 EDOS PROM READER ROUTINE 0200 SPC 3 0210 NECHO EQU $00F3 0220 AECHO EQU $FF53 0230 RCEMT EQU $00F0 0240 RCGCPT EQU $00F1 0250 SPC 3 0260 ORG $0100 0270 JMP ASTART ASSEMBLER ENTRY 0280 JMP ESTART EDITOR ENTRY 0290 JMP INXTO INITIALIZE I/O 0300 JMP POC PUNCH OUTPUT CHAR 0310 JMP PUNDAT PUNCH OUTPUT RECORD 0320 JMP RIC READER INPUT - CHARACTER 0330 JMP RIR READER INPUT - RECORD 0340 JMP CO CONSOLE OUTPUT 0350 JMP CI CONSOLE INPUT - NO ECHO 0360 JMP CIE CONSOLE INPUT - ECHO 0370 XDATA JMP DDATA DISPLAY CR/LF DATA STRING 0380 JMP DDAT1 DISPLAY DATA STRING 0390 XCRLF JMP LCRLF OUTP UT CR/LF W/HANDSHAKE 0400 JMP LEAD INITIALIZE CASSETTE FOR INPUT 0410 JMP PNCHON 0420 JMP PUNOFF 0430 JMP EXBUG EXBUG ENTRY 0440 JMP HPDATA PRINT ASSEMBLY HEADING & CR/LF 0450 JMP HPDAT1 PRINT ASSEMBLY LINE 0460 JMP * 0470 JMP PAPER PAPER TAPE READER ENTRY 0480 SPC 2 0471 ORG $1AD2 00472 *INHIBIT EDIT TRAILER 0473 NOP 0474 NOP 0475 NOP 0476 SPC 1 0477 ORG $9B7 0478 FCB $20 STOP EXCESS L/F'S IN ASM 1.3 0479 SPC 1 0490 ORG $E000 0491 SPC 1 0492 JMP XBUG ENTRY FOR XBUG TAPE FUNCTIONS 0493 SPC 1 0500 *INPUT CHARACTER FM CONSOLE 0510 SPC 2 0520 CI INC NECHO NO ECHO ENTRY 0530 CIE TST NECHO ECHO ENTRY 0540 BEQ CII 0550 INC AECHO 0560 CII JSR HINCH FETCH CHARACTER 0570 CLR NECHO CLR ECHO FLAG 0580 RTS  0590 SPC 3 0600 SPC 2 0610 *OUTPUT CHARACTER FROM CONSOLE 0620 SPC 1 0630 CO CMPA #$0009 TAB??? 0640 BNE CO1 NO, CONTINUE 0650 LDAA #$0020 YES, CHANGE TO SPACE 0660 CO1 CMPA #$000D CARRIAGE RETURN??? 0670  BNE CO2 NO, CONTINUE 0680 JMP XCRLF YES, TERMINATE LINE 0690 CO2 JSR OUTCH OUTPUT CHARACTER 0700  RTS 0710 SPC 2 0720 *I/O INITIALIZATION 0730 *SET INTERRUPT MASK 0740 SPC 2 0750 INXTO CLR RCEMT SET BUFFER EMPTY FLAG 0760 CLR CRFLG CLEAR OUTPUT FLAG 0770 CLR CONFLG CLEAR CONDITION FLAG 0780 CLR  SRCFLG CLEAR SOURCE FLG 0790 CLR DESTFG CLEAR LAST USED DEVICE FLG 0800 CLR PUNFLG CLR CASSETTE FLAG 0810 CLR LEDFLG CLR LEADER SWITCH FLAG 0820 SPC 1 0830 LDA A #4 0840 STA A FAILFG SET # OF TRYS 0850 SPC 1 0860 INX03 LDX #PRMPT1 PROMPT USER FOR 0870 JSR DDATA SOURCE DEVICE 0880 JSR HINCH FETCH RESPONSE 0890 CMP A #'X "X"? 0900 BEQ EXIT 0910 CMPA #$0050 PAPER TAPE?? 0920 BEQ INX01 YES, INITIALIZE IT 0930 CMPA #$004C LEFT CASSETTE?? 0940 BNE INX02 NO 0950 INC SRCFLG YES, INZ CASSETTE DEVICE FLAG 0960 LDAA #$0032 0970 BRA IO1 0980 SPC 3 0990 INX02 CMPA #$0052 RIGHT CASSETTE?? 1000 BNE INX03 NO, REPROMPT USER 1010 LDA A #$2 1020 STA A SRCFLG 1030 LDAA #$0031 YES, INZ CASSETTE DEVICE FLAG 1040 BRA IO1 1050 SPC  3 1060 INX01 JSR INXPTP INITIALIZE PAPER TAPE 1070 LDAA #$0004 1080 STAA SRCFLG 1090 INX06 LDX  #PRMPT2 PROMPT USER FOR 1100 JSR XDATA DESTINATION CASSETTE 1110 JSR HINCH FETCH RESPONSE 1120 CMP A #'X "X"? 1130 BNE *+5 1140 EXIT JMP EXBUG 1150 CMPA #$004C LEFT CASSETTE 1160 BNE INX05 NO 1170 LDAA #$0031 1180 BRA IO1 1190 SPC 3 1200 INX05 CMPA #$0052 RIGHT CASSETTE 1210 BNE INX06 NO, REPROMPT USER 1220 LDAA #$0032 YES, INITIALIZE 1230 IO1 STAA CASDEV 1240 JMP IO2 GO TO SECTION 2 1250 SPC 3  1260 *READ RECORD - CHARACTER ORIENTED 1270 SPC 2 1280 RIC TST RCEMT BUFFER EMPTY?? 1290 BNE RIR19 NO, FETCH NEXT CHAR 1300 BRA RIR READ RECORD 1310 SPC 2 1320 *READ RECORD - RECORD ORIENTED 1330 SPC 2 1340 R IR LDX #$02B7 FILL BUFFER W/ CR'S 1350 LDAA #$000D 1360 RIR71 STAA 0,X 1370 INX 1380 CPX  #$02FF 1390 BNE RIR71 1400 TST CONFLG CURRENT OUTPUT DONE?? 1410 BEQ RIR10 YES, CONTINUE 1420 JSR TERMIN NO, TERMINATE 1430 RIR10 LDAA SRCFLG CHECK SOURCE 1440 CMPA #$0004 = PAPER TAPE? 1450  BEQ RIR20 YES 1460 ADDA #$0030 1470 CMPA DESTFG SOURCE DEVICE = LAST 1480 BEQ RIR11 DEVICE CODE?? 1490 LDX #CMDSTG NO, CONDITION 2644 1500 JSR OSTRNG 1510 LDAA CASDEV FETCH CURRENT CASSETTE DEST DEV # 1520 CMPA #$0031 1530 BNE RIR40 1540 INCA 1550 BRA RIR41 1560 RIR40 CMPA #$0032 1570 BNE * 1580 DECA 1590 RIR41 JSR OUTCH 1600 STAA DESTFG UPDATE DEVICE FLAG 1610 LDAA #$0053 1620 JSR OUTCH 1630 RIR11 LDX #CMD3 SEND NEXT RECORD FM 2644 1640 JSR OSTRNG 1650 LDX #$02B7 INZ INDEX TO START OF BUFFER 1660 RIR15 INC AECHO FETCH CHARACTER 1670 JSR HINCH 1680 STAA  0,X SAVE CHARACTER 1690 CMPA #$000D CHAR = CR?? 1700 BEQ RIR14 YES, RETURN 1710 CMPA #$001E 1720  BNE RIR16 1730 LDAA #$001A 1740 STAA 0,X 1750 JSR HINCH 1760 BRA RIR14 1770 RIR16 CPX #$02FE BUFFER FULL 1780 BEQ RIR15 YES, IGNORE REMAINING RECORD 1790 INX 1800 BRA  RIR15 FETCH NEXT CHAR 1810 SPC 2 1820 RIR14 INC RCEMT EXIT ROUTINE - SET BUFF NOT MT 1830 LDX #$02B7 INZ INDEX TO BUFF START 1840 STX RCGCPT AND SAVE 1850 SPC 2 1860 RIR19 LDX RCGCPT RESTORE INDEX 1870 LDAA 0,X FETCH CURRENT DATA 1880 INX UPDATE POINTER 1890 STX RCGCPT 1900 CMPA #$001A END OF SOURCE?? 1910 BEQ RIR33 YES, EXIT 1920 CMPA #$000D END OF RECORD?? 1930 BEQ RIR33 YES, EXIT 1940  JSR CHECK 1950 BCS RIR19 1960 RTS 1970 SPC 3 1980 RIR33 CLR RCEMT SET BUFFER EMPTY 1990 RTS AND RETURN 2000 SPC 3 2010 SPC 2 2020 *PAPER TAPE SOURCE DRIVER 2030 SPC 2 2040 RIR20 LDX #$02B7 INZ INDEX TO BUFF START 2050 RIR22 JSR PAPER FETCH CHAR 2060 BCS RIR21 TIME OUT - ABORT!!! 2070 JSR CHECK 2080 BCS RIR22 2090 STAA 0,X SAVE CHAR 2100 CMPA #$000D CHAR = CR? 2110 BEQ RIR14 YES, EXIT 2120 CPX #$02FE BUFFER FULL?? 2130 BEQ RIR22 YES, IGNORE REMAINING RECORD 2140 INX NO, BUMP STORAGE POINTER 2150 BRA RIR22 2160 SPC 1 2170 RIR21 LDAA #$001A MARK END OF SOURCE 2180 STAA 0,X 2190 BRA RIR14 2200 SPC 3 2210 *WRITE CHARACTER TO CASSETTE 2220 SPC 1 2230 POC BSR PNCHON 2240 CMPA #$000A LINE FEED? 2250 BEQ POC2 YES, DON'T PRINT 2260 JSR OUTCH NO, OUTPUT CHARACTER 2270 CMPA #$000D CARRIAGE RETURN? 2280 BNE POC2 NO, CONTINUE 2290 JSR LFEED YES, TERMINATE LINE 2300 POC2 RTS 2310 SPC 3 2320 SPC 2 2330 *CASSETTE TURN ON 2340   SPC 2 2350 PNCHON TST PUNFLG 2360 BNE PNCH1 2370 PSHA 2380 LDX #START 2390 JSR  PUNDAT 2400 PULA 2410 PNCH1 RTS 2420 SPC 3 2430 SPC 2 2440 *CASSETTE OFF 2450 SPC 2 2460 PUNOFF TST PUNFLG 2470 BEQ PUNFF1 2480 JSR TERMIN 2490 PUNFF1 RTS 2500 SPC 3 2610 * THIS IS PART 2 OF PROGRAM 0120 SPC 2 0130 *HP OP SYSTEM TO INTERFACE HP2644A TO EXORCISER 0140 *WRITTEN BY HP MODIFIED BY W.C. WRAY 0150 *PROGRAM MUST BE IN ROM OR RAM AT $E000 0160 *RAM REQUIRED AT $DC00 0170 *WORKS WITH EXBUG 1.1 ONLY 0180 *TYPED BY TINA BURNSIDE 0190 SPC 3 0200 PDATA EQU $F024 0210 PDATA1 EQU $F027 0220 INCHNP EQU $F015 0230 G121 EQU $F015 " INCHNP " 0240 G141 EQU $F0F3 " MAID " 0250 G161 EQU $F015 " INCHNP " 0260 G164 EQU $F009 " CHEXL " 0270 G165 EQU $F00C " CHEXR " 0280 G169 EQU $F93F " RDBY7 " 0290 ACIAS EQU $FCF4 ACIA STATUS 0300 CRLF EQU $F021 EXBUGS CRLF ROUTINE 0310 ACIAD EQU $FCF5 ACIA DATA REG 0330 SPC 3 0340 LEDFLG EQU $F4 0350 E101 EQU $00F4 0360 E107 EQU $FF53 0370 E110 EQU $FF5A 0380 E112 EQU $FF8D 0390 E114 EQU $FF8E 0400 E119 EQU $FF8B 0410 SPC 1 0460 * PART 2 OF INITIALIZATION 0470 SPC 1 0480 IO2 LDA A $46 GET PASS NUMBER 0490 CMP A #0 PASS 1 ? 0500 BEQ TAPE YES-SKIP PTR MSG 0510 SPC 1 0520 LDX #PTRMSG 0530 JSR PDATA PRINT "PRINTER ? (Y OR N) 0540 LDX #0 0550 DEX DELAY 0560 BNE *-1 0570 SPC 1 0580 IN JSR INXCH GET CHARACTER 0590 CMP A #'N 0600 BEQ NPTR 0610 CMP A #'Y 0620 BNE IN 0630 SPC 1 0640 * SET UP "LEAD" ROUTINE TO RECORD AT BEG OR END 0650 SPC 1 0660 TAPE LDX #TPMSG 0670 JSR PDATA PRNT #APPEND OR START AT BEG" 0680 LDX #0 0690 DEX 0700 BNE *-1 0710 SPC 1 0720 IN1 JSR INXCH GET CHAR 0730 CMP A #'B 0740 BEQ CHNG 0750 CMP A #'A 0760 BNE IN1 0770 SPC 1 0780  LDA A #$CE 0790 STA A LEAD5 0800 LDX #CMDSTG 0810 STX LEAD5+1 0820 LDX #CMD6 0830 BRA CHNG1 0840 SPC 1 0850 CHNG LDA A #$7E 0860 STA A LEAD5 0870 LDX #LEAD6 0880 STX LEAD5+1 0890 LDX #CMD7 0900 CHNG1 STX LEAD4+1 0910 RTS 0920 SPC 1 0930 NPTR LDX $11F 0940 STX $134 0950 LDX #DDAT1 0960 STX $137 0970 BRA TAPE 0980 SPC 3 0990 SPC 1 1000 * OCHAR ROUTINE 1010 SPC 2 1020 OCHAR EQU * 1030 G104 PSH B 1040 OCHAR1 LDA B ACIAS 1050 BIT B #2 1060 BEQ OCHAR1 1070 STA A ACIAD 1080 PUL B 1090 RTS 1100 SPC 3 1110 * LEAD SUBROUTINE 1120 SPC 2 1130 * MODIFIED TO FIND END OF DATA ON DESTINATION 1140 * CASSETTE AND MARK END OF PREVIOUS FILE 1150 SPC 1 1160 LEAD EQU * 1170 TST E100 * CURRENT LINE TERMINATED ?? 1180 BEQ G100 YES, CONTINUE 1190 JSR G101 NO, TERMINATE LINE 1200 G100 TST E101 1210 BNE G102 1220 LEAD3 LDX #CMDSTG * FIND END OF DATA MSG 1230 JSR G103  1240 LDAA E102 = DEVICE (L OR R) 1250 JSR G104 1260 LEAD4 LDX #CMD6 "LOCATE END OF DATA" MSG 1270  JSR G103 1280 JSR G105 1290 LEAD5 LDX #CMDSTG * MARK FILE MSG 1300 JSR G103 1310 LDAA ! E102 = CASSETTE (1 OR 2) 1320 JSR G104 1330 LDX #CMD5 "RECORD FILE MARK" MSG 1340 JSR G103 1350 JSR G105 DC1 & LOOK FOR RESPONSE 1360 LEAD6 INC E101 1370 RTS 1380 SPC 3 1390 G102 LDX #CMDSTG ESC,&,P 1400 JSR G103 1410 LDAA E102 = L OR R CASSETTE (?) 1420 JSR G104 1430 LEAD7 LDX #CMD4 "END OF DATA MARK" MSG 1440 JSR G103 1450 JSR G105 DC1 & LOOK FOR RESPONSE 1460 CLR E101 1470 RTS 1480 SPC 3 1490 * DATA OUTPUT ROUTINES 1500 SPC 2 1510 HPDATA EQU * 1520 G145 INC E103 * CR/LF DATA STRING ENTRY 1530 BRA G106 - FOR DISPLAY & LP 1540 SPC 1 1550 HPDAT1 EQU *  1560 G146 CLR E103 * DATA STRING ENTRY 1570 G106 LDAB #$000C * DISPLAY & LP INITIALIZATION 1580 BRA G107 1590 SPC 3 1600 DDATA EQU * 1610 G125 INC E103 * CR/LF DATA STRING ENTRY 1620 BRA G108 1630 DDAT1 CLR  E103 1640 G108 LDAB #$0004 1650 BRA G107 1660 SPC 2 1670 PUNDAT EQU * 1680 CLR E103 *WRITE TO CASSETTE ENTRY 1690 LDAA E102 1700 TAB 1710 SUBB #$0030 1720 INC E104 1730 SPC 2  1740 * OUTPUT COMMON 1750 SPC 2 1760 G107 CMPB E105 * NEW DEVICE CODE? 1770 BNE G109 1780 G118 TST E103 1790 BEQ G110 1800 SPC 1 1810 * DATA OUTPUT PRECEDED BY CR/LF 1820 SPC 1 1830 TST E100 *CURRENT LINE DONE? 1840 BEQ G111 1850 BSR G101 1860 G111 BSR G112 1870 BRA G113 1880 G110 TST  E100 1890 BNE G103 1900 G113 JSR G114 1910 BRA G103 1920 SPC 1 1930 * DEVICE CODE CHANGE ROUTINE 1940 SPC 1 1950 G109 TST E100 * CURRENT LINE DONE? 1960 BEQ G115 1970 BSR G101 1980 G115 STX E106 1990 LDX #CMDSTG 2000 BSR G103 2010 STAB E105 2020 LDAA #$0030 2030 G116 INCA 2040 RORB 2050 BCC G116 2060 JSR G104 2070 TSTB 2080 BEQ  G117 2090 PSHA 2100 LDAA #$0064 2110 JSR G104 2120 PULA 2130 BRA G116 2140 G117 LDAA #$0044 2150 JSR G104 2160 LDX E106 2170 BRA G118 2180 SPC 3 2190 * OUTPUT STRING 2200 SPC 3 2210 OSTRNG EQU * 2220 G103 LDAA 0,X 2230 CMPA #$0004 2240 BEQ G119 2250 JSR G104 2260 INX 2270 CMPA #$000A 2280 BNE G103 2290 BSR G105 2300  LDAA 0,X 2310 CMPA #$0004 2320 BEQ G119 2330 TSTA 2340 BEQ G119 2350 JSR G114 2360 BRA G103 2370 G119 RTS 2380 SPC 3 2390 * CR/LF OUTPUT 2400 SPC 3 2410 LCRLF EQU * 2420 G112 TST E100 LINE ENDED? 2430 BEQ G120 YES 2440 BSR G101 NO, DO SO 2450 G120 JSR G114 2460 TERMIN EQU * 2470 G101 LDAA #$000D 2480 JSR G104 2490 SPC 1 2500 LFEED EQU * 2510 LDAA #$000A 2520 LFEED1 EQU * 2530 JSR G104 2540 ANSWER EQU * 2550 G105 LDAA #$0011 DC1 FOR HANDSHAKE 2560 JS" R G104 2570 INC E107 FETCH RESPONSE 2580 JSR G121 2590 CMPA #$0053 GOOD DATA? 2600 G122 BNE FAIL ERROR -PRINT MSG 2610 INC E107 2620 JSR G121 2630 CLR E100 2640 CLR E103 2650 CLR E104 2660 RTS 2670 SPC 3 2680 FAIL JSR INCHNP 2690 DEC FAILFG 2700 BEQ REPO 2710 STX SAVX2 2720 LDX #CMDSTG 2730 JSR OSTRNG 2740 LDA A CASDEV GET DEVICE # 2750 JSR OCHAR 2760 LDA A #$5E 2770 JSR OCHAR OUTPUT "^" 2780 LDA A #$11 2790 JSR OCHAR OUTPUT DC1 2800 SPC 1 2810 STX SAVEX3 2820 LDX #ERRMSG GET POINTER 2830 STATUS LDA B #8 SET # OF CHARS 2840 LOOP JSR INCHNP 2850 STA A 0,X 2860 INX 2870 DEC B 2880 BNE LOOP 2890 LDX SAVEX3 RESTORE X 2900 LDA A ERRMSG+7 GET STATUS 2910 BIT A #2 END OF VALID DATA ? 2920 BEQ *+3 NO-REWIND & TRY AGAIN 2930 RTS YES RESUME 2940 JSR CRLF 2950 LDX #CMDSTG ESC & P 2960 JSR OSTRNG 2970 LDA A CASDEV 2980 JSR OCHAR 2990 LDX #CMD8 3000 JSR OSTRNG REWIND CART 3010 JSR ANSWER SEND DC1 & FETCH RESPONSE 3020 SPC 1 3030 JMP LEAD3 TRY AGAIN 3040 SPC 1 3050 REPO LDX #RPMSG GET REPOSITION MSG 3060 JSR PDATA 3070 LDX #0 3080 DEX 3090 BNE *-1 DELAY 3100 IN3 JSR INXCH GET CHAR 3110 CMP A #'C 3120 BNE IN3 3130 LDX SAVX2 RESTORE X 3140 LDA A #4 3150 STA A FAILFG RESET FOR 4 NEW TRYS 3160 JMP LEAD3 3170 SPC 3 3180 * CONDITION 2644 FOR NEW DATA STRING 3190 SPC 3  3200 G114 STX E106 3210 LDX #WRITE 3220 JSR G103 3230 INC E100 CONDITION FLG SET 3240 TST E104 3250 BNE G123 3260 LDX #SPACE 3270 JSR G103 3280 G123 LDX E106 3290 RTS 3300 SPC 3 3310 HINCH EQU * 3320 G126 TST E100 3330 BEQ G124 3340 JSR G101 3350 G124 JSR G121 3360 RTS 3370 SPC 3 3380 * MOTLOD LOAD,VERF,SRCH 3390 SPC 1 3400 * LOAD MOTOROLA FORMATTED OBJECT FILE FROM HP-2644A 3410 * CASSETTE. PERFORMS LOAD, SEARCH & VERIFY, AFTER 3420 * EXBUG FORMAT... 3430 SPC 3 3440 XBUG CLR E100 3450 CLR E102 3460 CLR E108 3470 CLR E103 3480 CLR E109 3490 CLR E105 3500 SPC 2 3510 G129 LDX #PRMP0 SRCE CASS (L OR R)? 3520 JSR G125  3530 JSR INXCH 3540 CMPA #$004C 3550 BNE G127 3560 LDAA #$0031 3570 STAA E108 3580 BRA G128 3590 G127 CMPA #$0052 3600 BNE G129 3610 LDAA #$0032 3620 STAA E108 3630 G128 LDX #PRMP1 SRCH (S), LOAD (L), OR VERF (V)?? 3640 JSR G125 3650 JSR INXCH 3660 CMPA #$0053 STARTS TAPE AT BEG (REWINDS) 3670 BEQ G130 3680 CMPA #$004C 3690 BEQ G131 3700 CMPA #$0056 3710 BNE G128 3720 SPC 2 3730 * VERIFY MODE 3740 SPC 2 3750 G140 LDAA #$0001 3760 STAA E110 3770  CLR E109 3780 BRA G132 3790 SPC 2 3800 * LOAD MODE 3810 SPC 2 3820 G131 CLR E110 3830 BRA G132 3840 SPC 2 3850 * SEARCH MODE 3860 SPC 2 3870 G130 LDAA #$00FF 3880 STAA E110 3890 LDX ## CMDSTG 3900 JSR G103 3910 LDAA E108 3920 JSR G104 3930 LDX #RWND 3940 JSR G103 3950 JSR G105 3960 SPC 1 3970 * LOADER COMMON 3980 SPC 1 3990 G132 JSR G133 4000 LDAA E111 4010 BEQ G134 4020 TST E110 4030 BMI G132 4040 JSR G135 4050 LDAA E111 4060 CMPA #$0001 4070 BEQ G136 4080 CMPA #$0009 4090 BNE G132 4100 BRA G128 4110 SPC 1 4120 * PRINT HEADER RECORD 4130 SPC 1 4140 G134 LDAA E112 4150 LDX #$FF8D 4160 G138 INX 4170 DECA 4180 BNE G138 4190 LDAA #$000D 4200 STAA 0,X 4210 LDAA #$000A 4220 STAA 1,X 4230 LDAA #$0004 4240 STAA 2,X 4250 LDX #$FF90 4260 JSR G125 4270  SPC 1 4280 TST E110 CHECK MODE 4290 BMI G137 SRCH MODE 4300 BRA G132 GET NEXT RECORD 4310 SPC 3 4320 * PROMPT USER FOR CONT, LOAD OR VERIFY 4330 * OR X FOR MAID 4340 SPC 1 4350 G137 LDX #PRMP2 CONT (C), LOAD (L), OR VERF (V)? 4360 JSR G125 4370 JSR INXCH 4380 CMPA #$0043 4390 BEQ G139 4400 CMPA #$004C 4410 BEQ G131 4420 CMPA #$0056 4430 BEQ G136 4440 CMPA #$0058 4450 BNE G137 4460  JMP G141 GO TO MAID 4470 SPC 1 4480 * SKIP 4490 SPC 1 4500 G139 LDX #CMDSTG CMDSTG 4510 JSR G103 4520 LDAA E108 GET SRCFLG 4530 JSR G104 OUTPUT IT 4540 LDX #CMDSKP CMDSKP 4550 JSR G103  4560 JSR G105 ANSWER 4570 LDAA #$00FF SET TW=FF=SEARCH 4580 STAA E110 4590 BRA G132 4600 SPC 1 4610 * DATA RECORD INPUT 4620 SPC 1 4630 G136 LDAA E112 ADJ BYTE COUNT 4640 SUBA #$0003 4650 STAA E112 4660 LDX #$FF90 4670 STX E113 4680 LDX E114 4690 G149 STX E115 SAVE STORE ADDR 4700  LDX E113 FETCH BYTE ADDR 4710 LDAA 0,X 4720 INX 4730 STX E113 4740 LDX  E115 4750 TST E110 4760 BEQ G142 LOAD MODE 4770 SPC 1 4780 * VERIFY MODE 4790 SPC 1 4800 CMPA 0,X 4810 BEQ G143 4820 PSHA 4830 STX E115 4840 TST E109 4850 BNE  G144 4860 INC E109 4870 LDX #$FB6B "ADDR/MEM/TAPE" 4880 JSR PDATA 4890 JSR $F021 4900 G144 LDX #START 4910 JSR $F027 4920 LDX #OPENCL 4930 JSR G147 4940 LDX E115 4950  JSR G148 4960 TSX 4970 JSR G148 4980 PULA 4990 JSR $F021 5000 LDX E115 5010 SPC 1 5020 G143 INX 5030 DEC E112 5040 BNE G149 5050 JMP G132 5060 SPC 1 5070 * LOADING 5080 SPC 1 5090 G142 STAA 0,X 5100 CMPA 0,X 5110 BEQ G143 5120 SPC 1 5130 * MEMORY DID NOT CHANGE 5140 SPC 1 5150 LDX #$FB5A "NO CHANGE" 5160 JSR G125 5170 JSR  G101 5180 JMP G141 5190 SPC 1 5200 * READ RECORD FROM CASSETTE 5210 SPC 1 5220 * LOAD RECORD FROM 2644A$  CASSETTE. CONDITION 5230 * MESSAGE MUST BE MODIFIED TO SPECIFY SOURCE 5240 * CASSETTE (LEFT OR RIGHT). DEFAULT CASSETTE 5250 * IS LEFT. STORES RECORD IN EXBUG BUFFER 5260 SPC 1 5270 * DESTROYS INDEX, A AND B REGISTERS 5280 SPC 1 5290 G133 CLR E111 * CLEAR CONTROL FLAG 5300 TST E100 5310 BEQ G150 5320 JSR G101 5330 G150 LDX  #CMDSTG COMMAND 2644 TO OUTPUT 5340 JSR G103 NEXT RECORD, W/O HNDSHK 5350 LDAA E108 5360 JSR G104 5370 SUBA #$0030 5380 STAA E105 5390 LDX #READ 5400 JSR G103 5410 JSR G151  5420 TST E116 5430 BEQ G152 5440 G153 BRA G153 IF TEMP NOT = 0 5450 G152 LDAA E117 5460 STAA E118 5470 LDAA #$0011 5480 JSR G104 5490 G155 INC E107 5500 JSR G121 FETCH CHARACTER... 5510 DEC E118 5520 BEQ G154 5530 CMPA #$0053 5540 BNE G155 5550 LDX #$FF8D INZ INDEX TO EXBUG BUFFER 5560 INC E107 FETCH SECOND CHAR 5570 JSR G121 5580 DEC E118 5590  BEQ G154 5600 CMPA #$0030 INSURE 2ND CHAR LEGAL 5610 BEQ G156 5620 CMPA #$0031 5630 BEQ G156 5640 CMPA #$0039 5650 BNE G155 5660 G156 SUBA #$0030 5670 STAA E111 SET CONTROL FLAG  5680 CLR E119 5690 JSR G157 5700 STAA 0,X 5710 STAA E120 5720 ADDA E119 5730 STAA E119 5740 INX 5750 G159 JSR G157 LOAD RECORD LOOP 5760 TST E120 5770 BEQ G158 5780 STAA 0,X 5790 ADDA E119 5800 STAA E119 5810 DEC E120 5820 CPX  #$FFD5 5830 BEQ G158 5840 INX 5850 G158 TST E118 5860 BNE G159 5870 INC E119 5880 G154 RTS 5890 SPC 3 5900 * VERIFY CHECKSUM 5910 SPC 1 5920 * DUPLICATES EXBUG "LADCK" EXCEPT FOR 5930 * REREADING OF RECORD 5940 SPC 1 5950 G135 TST E119 5960 BEQ G160 5970 SPC 1 5980 G163 LDX #$FB65 5990 JSR G125 6000 LDX #$FF8E 6010 BSR G147 6020 JSR G121 6030 CMP A #'X 6040 BNE *+5 6050 JMP EXBUG 6060 CMPA #$0052 6070 BNE G162 6080 LDX #$C43E 6090 JSR G103 6100 JMP G155 6110 SPC 1 6120 G162 CMPA #$0043 6130 BNE G163 6140 LDAA #$00FF 6150 G160 RTS 6160 SPC 3 6170 G166 LDAA 0,X 6180 JSR G164 6190 JSR G104 6200 LDAA 0,X 6210 JSR G165 6220 JSR G104 6230 INX 6240 RTS 6250 SPC  3 6260 G148 BSR G166 6270 LDAA #$0020 6280 JSR G104 6290 RTS 6300 SPC 3  6310 G147 BSR G166 6320 BSR G148 6330 RTS 6340 SPC 3 6350 CHECK EQU * 6360 CLC 6370 STX E106 6380 LDX #NCHAR 6390 G168 CMPA 0,X 6400 BEQ G167 6410  INX 6420 CPX #ENCHAR 6430 BNE G168 6440 LDX E106 6450 CLC 6460 %  RTS 6470 SPC 3 6480 G167 SEC 6490 LDX E106 6500 RTS 6510 SPC 3 6520 SPC 1 6530 * READ BYTE 6540 SPC 1 6550 G157 JSR G169 6560 DEC E118 6570 BEQ  G170 6580 ASLA 6590 ASLA 6600 ASLA 6610 ASLA 6620 TAB  6630 JSR G169 6640 ABA 6650 DEC E118 6660 G170 RTS 6670 SPC 3  6680 * HANDSHAKE 2644 FOR READ MODE 6690 SPC 1 6700 G171 INC E107 6710 JSR G121 6720 ANDA #$000F 6730 ASLA 6740 ASLA 6750 ASLA 6760 ASLA 6770 TAB 6780 INC E107 6790 JSR G121 6800 ANDA #$000F 6810 ABA 6820 RTS 6830 SPC 3 6840 G151 BSR G171 6850 STAA E116 6860 BSR G171 6870 STAA E117 6880  INC E107 6890 JSR G121 6900 RTS 6910 SPC 3 6920 INXCH JSR INCHNP GET CHAR 6930 CMP A #'X "X"? 6940 BNE *+5 6950 JMP EXBUG YES-RETURN TO EXBUG 6960 RTS NO 6970 SPC 3 6980 * MESSAGE LOCKER  6990 SPC 1 7000 CMDSTG FCB $1B,$26,$70,$4 7010 WRITE FCB $1B,$26,$70,$57,4 7020 CMDSKP FCB $75,$2B,$31,$70,$32,$43,4 7030 SPACE FCB $20,$20,$20,$20,4 7040 PRMP0 FCC "SRCE CASS (L OR R)" 7050 FCB $D,$A,4 7060 PRMP1 FCC "SRCH (S), LOAD (L) OR VERF (V)??" 7070 FCB $D,$A,4 7080 PRMP2 FCC "CONT (C), LOAD (L) OR VERF (V)??" 7090 FCB $D,$A,4 7100 READ FCB $73,$32,$52,$11,4 7110 COND2 FCB $1B,$26,$70,$31,$52,$11,4 7120 RWND FCB $75,$30,$43 7130 START FCB 4 7140 PRMPT1 FCC " SOURCE : PAPER (P), LEFT CASS (L), RIGHT CASS (R) ?" 7150 FCB $D,$A,4 7160 PRMPT2 FCC "DEST CASS (L OR R) ??" 7170 FCB $D,$A,4 7180 PTRMSG FCC "HP PRINTER ? (Y OR N)" 7190 FCB 4 7200 SPC 1 7210 TPMSG FCC "APPEND OBJ OR START AT BEG OF TAPE (A ORB)" 7220 FCB 4 7230 SPC 1 7240 RPMSG FCC "REPOSITION CASS & TYPE C" 7250 FCB 4 7260 SPC 1 7270 CMD6 FCB $75,$33,$43,4 7280 CMD5 FCB $75,$35,$43,4 7290 CMD2 FCB $1B,$26,$70,$57,4 7300 CMD3 FCB $1B,$26,$70,$52,$11,4 7310 CMD4 FCB $75,$36,$43,4 7320 CMD7 FCB $75,$31,$70,$32,$43,4 7330 CMD8 FCB $75,$30,$43,4 7340 SPC 3 7350 *CHARACTERS STRIPPED FROM INPUT 7360 *NULL,RUBOUT,LINE FEED,DC1,DC2,DC3,DC4 7370 NCHAR FCB 0,$7F,$A,$11,$12,$13,$14 7380 ENCHAR EQU * 7400 SPC 1 7401 ORG $DC00 7402 * FLAGS 7410 SPC 2 7420 E100 EQU * 7430 CONFLG RMB 1 7440 E105 EQU * 7450 DESTFG RMB 1 7460 E102 EQU * 7470 CASDEV RMB 1 7480 E106 EQU * 7490 SAVEX RMB 2 7500 E103 EQU * 7510 CRFLG RMB 1 7520 E109 EQU * 7530 HDRFLG RMB 1 7540 MODE RMB 1 7550 E108 EQU * 7560 SRCFLG RMB 1 7570 E115 EQU * 7580 OPENCL RMB 2 7590 E113 EQU *  7600 TEMPA RMB 2 7610 E116 EQU * 7620 TEMP RMB 1 7630 E117 EQU * 7640 RMB 1 7650 E111 EQU * 7660 TYPE RMB 1 7670 E104 EQU * 7680 PUNFLG RMB 1 7690 E118 EQU * 7700 COUNTR RMB 1 7710 E120 EQU * 7720 BCOUNT RMB 1 7730 SAVX2 RMB 2  7740 FAILFG RMB 1 7750 SAVEX3 RMB 2 7760 ERRMSG RMB 8 SAVE DEVICE STTATUS 7770 SPC 3 7780 END 7790 & ÷€NAMHPLOADER OPTO *‚THISLOADERWILLLOAD‚THEHPINTERFACE *‚PROGRAMFROMTHEHPDATACARTRIDGE SPC1 *W.C.WRAY3/12/77 SPC1 INCHNPEQU$F015 OUTCHEQU$F018 EXBUGEQU$F564 SPC1 SPC1 ORG$12 SPC1 BYTECTRMB1 CKSMRMB1 XHIRMB1 XLOWRMB1 ORG$E789 SPC1 LOADLDAA#$11 JSROUTCH JSRINCHNP CMPA#'S BNELOAD JSRINCHNP CMPA#'9 BNE*+5 XBGJMPEXBUG CMPA#'1 BNELOAD CLRCKSM BSRBYTE SUBA#2 STAABYTECT SPC1 *BUILDADDRESS SPC1 BSRBADDR SPC1 *STOREDATA SPC1 LOAD1BSRBYTE DECBYTECT BEQLOAD15 STAA0,X CMPA0,X BNELOAD19 INX BRALOAD1 SPC1 *DOESCKSMCK? SPC1 LOAD15INCCKSM BEQLOAD LOAD19LDAA#'? JSROUTCH SPC1 *BUILDADDRESS SPC1 BADDRBSRBYTE STAAXHI BSRBYTE STAAXLOW LDXXHI RTS SPC1 *ƒINPUTBYTE(TWOCHARACTERS) SPC1 BYTEBSRINHEX BYTE2ASLA ASLA ASLA ASLA TAB BSRINHEX ABA TAB ADDBCKSM STABCKSM RTS SPC1 *INPUTHEXCHARACTER INHEXJSRINCHNP INHEX2SUBA#$30 BMIXBG CMPA#$9 BLEIN1HG CMPA#$11 BMIXBG CMPA#$16 BGTXBG SUBA#7 IN1HGRTS SPC1 END CMPA#$16 BGTXBG SUBA#7 IN1HGRTS SPC1 END ! @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ú€NAMVIEW OPTO ORG$F9F *MODTOEDOSTOLIMITLINESPRINTEDBYCDIRORCLIST *NUMBERISENTERED0-FTOPRINTMORE *MERGEWITHEDOSTOUSE *FORUSEWITHEXBUG *WRITTENBYJOHNCONNERSFONDDULACWISC. *MODIFIEDBYW.C.WRAY8/12/6 SPC3 AECHOEQU$FF53EXBUGSECHOFLG CBCDHXEQU$F006 INCHNPEQU$F015 OUTCHEQU$F018 SPC2 LINESPSHA PSHB DECCOUNT BNEPCR LDAAAECHO PSHA INCAECHO GTHXJSRINCHNP JSRCBCDHX BMIGTHX STAACOUNT PULA STAAAECHO PCRPULB PULA RTS SPC3 OUTCHXCMPA#$A BNEOUT1 BSRLINES OUT1JMPOUTCH SPC2 COUNTFCB8 ORG$6AD FDBOUTCHX SPC2 ORG$808 FDBOUTCHX SPC2 ORG$20 JMP$26 SPC1 ORG$26 LDAA#5 STAACOUNT JMP$15F SPC1 END @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ü€ NAMSAVE *PROGRAMTOMOVEMEMORYTODISC *FORUSEWITHEXBUGANDEDOS2.2 *PGMISLOADEDOVERCTAPEROUTINE *EDOSISTHENREENTERED(AT20;G) *COMMANDIS(SAVE,FILENAME) *W.C.WRAY7/3/76 SPC1 OPTO,NOG SPC2 PDATA1EQU$F027 BEGAEQU$FF0A ENDAEQU$FF0C TWEQU$FF5A MCONTEQU$FF58 TEMPEQU$FF07 BEGENDEQU$F003 SPC1 XWRTEQU$E80C ORG$219 SPC1 FCC"SAVE" SPC2 ORG$A37 SPC3 MOVEJSRBEGEND SPC3 *OUTPUTMEMORYINMOTOROLAOBJECTFORM SPC2 MOVE1LDXBEGA STXTW MOVE2LDAAENDA+1 SUBATW+1 LDABENDA SBCBTW BNEMOVE3 CMPA#32 BCSMOVE4 MOVE3LDAA#31 MOVE4ADDA#4 STAAMCONTFRAMECOUNT SUBA#3'  STAATEMPBYTECOUNT SPC3 *OUTPUTS1MESSAGE SPC2 LDX#S1MSG JSRPDATA3 CLRBZEROCKSM SPC3 *OUTPUTFRAMECOUNT SPC2 LDX#MCONT BSRMOVE6 *OUTPUTADDRESS LDX#TW BSRMOVE6 BSRMOVE6 *OUTPUTDATA LDXTW MOVE7BSRMOVE6ONEBYTE(2FRAMES) DECTEMPDECBYTECOUNT BNEMOVE7 STXTW COMB PSHB TSX BSRMOVE6OUTPUTCKSM PULB LDXTW DEX CPXENDA BNEMOVE2 LDX#S9MSG BSRPDATA3 RTS SPC3 *WRITE2HEXCHAR-UPDATECKSMSPC2 MOVE6ADDBX SPC1 OUT2HLDAAX BSROUTHL LDAAXGETBYTEAGAIN INX BRAOUTHRRHEX+‚RTS SPC3 OUTHLLSRA LSRA LSRA LSRA SPC2 OUTHRANDA#$F ADDA#$30 CMPA#$39 BLSXWRT2 ADDA#7 SPC1 XWRT2JMPXWRT1 SPC1 S1MSGFCB$D,$A,0,'S,'1,4 SPC1 S9MSGFCB$D,$A,0,'S,'9,'0,'3,'0,'0,'0,'0,'F,'C,$D,4 SPC1 PDATA4BSRXWRT1 INX PDATA3LDAAX CMPA#4 BNEPDATA4 RTS SPC3 XWRT1STXSVX PSHB JSRXWRT PULB LDXSVX RTS SPC1 SVXRMB2 END @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ €  NAM SAVLST OPT O *MOD TO ASSEMBLER TO SAVE LISTING ON DISC *FOR USE WITH EDOS 2.2 ONLY *ASSEMBLER 1.2A ONLY *ENTER PASS 5 TO IMPLEMENT *MERGE THIS PGM WITH ASSEMBLER (AT END) *NO OBJECT PRODUCED-USE PASS 4 *W.C.WRAY 7/20/76 SPC 3 CO EQU $115 NOPRNT EQU $3F PDATA1 EQU $F027 SAVX2 EQU $1E POR EQU $19D NOPNCH EQU $3E SPC 2 ORG $988 SPC 1 JMP PATCH1 ORG $9B3 FDB ENDPTH FCB 1,1,1,$20 ORG $73 FDB STRLBL ORG $8F9 FDB STRLBL ORG $12E1 FDB ENDPTH SPC 1 ORG $1628 SPC 2 PATCH1 CMP A #'4 PASS 4? BEQ PT2 YES SET FLAG AND EXIT LDX #POR GET DISC WRITE ROUTINE ADDR STX $137 SWITCH ROUTINES TO LIST ON DISC LDX #PDATA1 STX $10D LDX #CO STX $10A LDX #ZDATA STX $134 SPC 2 LDA A #'5 INC NOPNCH INHIBIT OBJECT OUTPUT PT3 JSR CO PRINT PASS NO. JMP $98E RETURN TO DISC ASSEMBLER SPC 2 PT2 INC NOPRNT SET FLAG BRA PT3 SPC 2 ZDATA BSR ZCRLF ZDATA1 JMP POR SPC 2 ZCRLF STX SAVX2 LDX #CRLF BSR ZDATA1 LDX SAVX2 RTS SPC 2 CRLF FCB $D,$A,4 ENDPTH FCC "A " FDB $FFFF FCC "B " FDB $FFFF FCC "X " FDB $FFFF SPC 2 STRLBL EQU * END @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ € NAM XGENPTCH * PATCH TO FIX XGEN TO LOAD FROM FILE * REQUIRES MEMORY AT $1080.-FOR EDOS 2.2 * FOLLOW COMMAND WITH FILENAME * USE SDGEN TO SAVE DIRECTORY-CXGEN TO CLR IT * [CXGEN,TVDS] OR [SDGEN,TVDS] FOR EXAMPLE * W C WRAY 8/8/6 SPC 1 OPT O SPC 1 ORG $FC9 FOLLOWS VIEW SPC 1 PATCHX JSR $31D JSR $4E9 FIND INPUT FILE PTRS TST A (  BEQ *+5 JMP $69D PRINT "NO SUCH FILE" JSR $D1D READ FILE AND MERGE TO DISC JMP $A0E NDPTCH LDA A #3 STA A $156 JMP $A28 SPC 1 SDGEN LDA A #$FF STA A FLG SET DIR FLG BRA *+5 CXGEN CLR FLG JMP $9FA CONTINUE DPTCH TST FLG BEQ NDPTCH RTS SPC 1 FLG RMB 1 SPC 1 ORG $A0B JMP PATCHX SPC 1 ORG $243 FCB $53,$44 SPC 1 ORG $248 FDB SDGEN SPC 1 ORG $241 FDB CXGEN SPC 1 ORG $A23 JMP DPTCH SPC 1 END @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ € 10ƒNAMPROM 01*CONVERTSWEATHERFORDFORMATTEDPROMTAPESTO 02*BINARY‚FORDATAI/OPROMPROGRAMMER 03*WEATHERFORDFORMATIS 04*W00000100111111101010011000011011000 05*W00811100001000011101001100011100100 06*OR 07*W00011000011010110010001100000000000 08*W00411110000001100111111100011000011 11ƒOPTO,S 12OUTCHEQU$F9DC 13INCHNPEQU$FAA0 14AECHOEQU$FF53 15MTTYSOEQU$FCF4 16ƒORG$1000 20STARTJSRPNON 25ƒJSRPNLDR 30ƒJSRREADON 35L1ƒJSRREADP 40‚CMPA#'W 45‚BNEL1 50L2‚JSRREADP 55‚CMPA#$20 60‚BNEL2 65‚LDAA#$FF 70‚JSROUTCH 75LOOPCLRB 85L4‚JSRREAD 90‚CMPA#$31 95‚BEQL3 100‚CMPA#$30 105‚BEQL7 125‚JSRPUN 130‚CMPA#$20 135‚BEQLOOP 140‚CMPA#$0D 145‚BNEL1 150L5‚JSRREAD 155ƒCMPA#'W 160ƒBNEL5 165L6‚JSRREAD 170ƒCMPA#$20 175ƒBNEL6 180ƒBRALOOP 185L3‚ASLB 186ƒINCB 190ƒBRAL4 191L7ƒASLB 192…BRAL4 195PNON‚PSHA 196…LDAA#$12‚TURNPUNCHON 200ƒJSROUTCH 205ƒPULA 206†RTS 210PNLDR‚LDAB#$19‚PUNCHLEADER 215PNULL‚CLRA 220ƒJSROUTCH 225ƒDECB 230‚BNEPNULL 235‚RTS 240READON‚LDAA#$55‚TURNREADERON 245ƒSTAAMTTYSO 250ƒLDAA#$11 255ƒJSROUTCH 260„RTS 265READ‚SECƒREAD1CHAR,NOPUNCH 270ƒROLAECHO‚SETNONECHOFLAG 275READP‚JSRINCHNP 280„CMPA#$7F 285ƒBEQREADP‚IGNORERUBOUTS 290ƒRTS 295PUN‚PSHAƒPUNCHBINARY 300ƒTBA 301…JSROUTCH 310ƒCMPA#$14 312ƒPULA 315ƒBNEPUN1 320ƒJMPPNON‚BINARYCHARTURNEDPUNCHOFF 325PUN1RTS 330‚END @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ €10 NAM PROMD 15 * PUNCHES BINARY FORMATTED TAPE FOR DATA I/O 16 * PROM PROGRAMMER FROM CODE IN RAM 20 OPT O,S 25)  OUTCH EQU $F9DC 30 BEGA EQU $FF0A 35 ENDA EQU $FF0C 40 BEGEND EQU $F789 45 ORG $10 50 START JSR BEGEND GET BEGINNING AND END ADDRESSES 55 JSR PNON TURN PUNCH ON 60 JSR PNLDR 61 JSR PNLDR PUNCH LEADER 65 LDA A #$FF 70 JSR OUTCH OUTPUT A RUBOUT 75 LDX BEGA 80 LOOP LDA A X 85 JSR PUN 90 INX 95 CPX ENDA 100 BNE LOOP 101 LDA A X 105 JSR PUN 110 JSR PNLDR 115 JMP START 120 PNON LDA A #$12 TURN PUNCH ON 125 JSR OUTCH 130 RTS 135 PNLDR LDA B #$3F PUNCH LEADER 140 P1 CLR A 145 JSR OUTCH 150 DEC B 155 BNE P1 160 RTS 165 PUN JSR OUTCH PUNCH BINARY 170 CMP A #$14 175 BEQ PNON 180 RTS 185 END 190 MON@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ €10 NAM PROME 11 * NEGATIVE LOGIC VERSION -- 0'S ARE PUNCHED AS HOLES 15 * PUNCHES BINARY FORMATTED TAPE FOR DATA I/O 16 * PROM PROGRAMMER FROM CODE IN RAM 20 OPT O,S 25 OUTCH EQU $F9DC 30 BEGA EQU $FF0A 35 ENDA EQU $FF0C 40 BEGEND EQU $F789 45 ORG $10 50 START JSR BEGEND GET BEGINNING AND END ADDRESSES 55 JSR PNON TURN PUNCH ON 60 JSR PNLDR 61 JSR PNLDR PUNCH LEADER 65 LDA A #$FF 70 JSR OUTCH OUTPUT A RUBOUT 75 LDX BEGA 80 LOOP LDA A X 81 COM A 85 JSR PUN 90 INX 95 CPX ENDA 100 BNE LOOP 101 LDA A X 102 COM A 105 JSR PUN 110 JSR PNLDR 115 JMP START 120 PNON LDA A #$12 TURN PUNCH ON 125 JSR OUTCH 130 RTS  135 PNLDR LDA B #$3F PUNCH LEADER 140 P1 CLR A 145 JSR OUTCH 150 DEC B 155 BNE P1 160 RTS 165 PUN JSR OUTCH PUNCH BINARY 170 CMP A #$14 175 BEQ PNON 180 RTS 185 END 190 MON@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%€%‚NAMMEMOVE *M.MEITIN *MOTOROLAINC * *THISPROGRAMREASSEMBLESABLOCKOFCODEFROM *ONELOCATIONINMEMORYTOANOTHERWITHOUTTHE *NEEDTOREASSEMBLESOURCEPROGRAMSWHICHARE *OFTENUNAVAILABLE. *OPTIONALLYTHEPROGRAMCAN‚MOVETHE *BLOCKWITHOUTALTERATIONSOTHAT‚ITSMEMORY *SPACECANBETEMPORARILYCLEAREDFOROTHERUSE *WITHOUTLOSSOFCODE. * *FEATURES: * *IFA* TTEMPTMADETOWRITEINTOROMORNONEXISTENT *MEMORY,ANERRORMESSAGEGENERATED * *THISPROGRAMCANALSOREASSEMBLEITSELF *ATADIFFERENTLOCATION *ITBEGINSAT$2000 *ANDENDSAT$22C9WITHTABLESBEGINNINGAT$2191. * *PROGRAMHASBEENWRITTENFOREXBUG1.2 *FORUSEWITH‚EXBUG1.1SIMPLYCHANGEFOLLOWING *LOCATIONSFROM61TO64ORSOURCESTATEMENT *BADDREQU$F964;2011,201F,202D,20BA * *OPERATION: * *1.ATTHEAPPROPRIATEPROMT,ENTERTHECURRENT *„BEGINNINGANDENDINGLOCATIONSOFTHEENTIRE *…PROGRAMINCLUDINGTHETABLES/DATA/MESSAGESETC. * *2.ENTER‚NEWBEGINLOCATION *„PROGRAMWILLCALC.ANDPRINTNEWENDLOCATION. * *3.ENTEROPTIONTOREASSEMBLE(R)ORMOVE(M) *„IFREASSEMBLEOPTIONCHOSEN,PROGRAMREQUESTS *„BEGINADDRESSOFTABLES/DATAETC.IFNONETHEN *„ENTERTHEOLDENDLOCATION.PURPOSEISTOMOVE *„TABLES/DATAETCASUNALTEREDBLOCK. * *4.NOTE:PROGRAMASSUMESCODINGISINACONTINUOUS *„BLOCKUPTOTHETABLESWHENINTHEREASSEMBLE *„MODE.IFCODEDSECTIONISFRAGMENTEDWITHDATAINSERTED *„INBETWEENCODEDSECTION,THENRELOCATIONMUST *„BEPERFORMEDINSEGMENTSSOTHATDATAISNOT *„INTERPRETEDASCODEORVICEVERSA * OPTO OPTS OPTNOG ORG$2000 LDX#MSG1 JSRPDATA STRTLDX#MSG2 JSRPDATA‚FORMOLDBOUNDS LDX#OBEG JSRBADDR BMISTRT OLOCLDX#MSG9 JSRPDATA LDX#OEND JSRBADDR BMIOLOC NLOCLDX#MSG3‚NEWBEGINADDR JSRPDATA LDX#NBEG JSRBADDR BMINLOC LDAANBEG LDABNBEG+1 SUBBOBEG+1 SBCAOBEG STAAOFSET STABOFSET+1 LDAAOEND‚CALCNEWENDADDR LDABOEND+1 SUBBOBEG+1 SBCAOBEG ADDBNBEG+1 ADCANBEG STAANEND STABNEND+1 LDX#MSG4‚PRINTNEWEND JSRPDATA LDX#NEND JSROUT4HS MODELDX#MSG5‚REASSEMBLE/MOVE? JSRPDATA JSRINCH CMPA#$52‚R? BEQRELOC‚ CMPA#$4D‚M? BNEMODE STSADDR5‚SAVESTACK LDSOBEG DES LDXNBEG MOVPULA‚MOVEBLOCK STAA0,X CMPA0,X BNEMEMER INX CPXNEND BNEMOV PULA STAA0,X CMPA0,X BNEMEMER LDSADDR5‚RESTORESTACK CONTLDX#MSG6 JSRPDATA‚CONTINUE? JSRINCH CMPA#$59‚Y? BEQSTRT1 CMPA#$4E‚N? BNECONT JMPEXBUG STRT1JMPSTRT RELOCLDX#MSG7‚BEGTABLES? JSRPDATA LDX#BSYT JSRBADDR BMIRELOC LDXBSYT DEX ‚STXBSYT LDAABSYT‚NEWBEGSYMTABLE LDABBSYT+1 SUBBOBEG+1 SBCAOBEG ADDBNBEG+1 ADCANBEG STAANBSYT STABNBSYT+1 STSADDR5‚SAVESTACK LDSOBEG DES LDXNBEG RELOC2CPXNBSYT‚ENDCODESECT? BEQMOVTAB PULA STAA0,X CMPA0,X‚VERIFY BEQDECODE MEMERSTXXMOV LDSADDR5 LDX#MSG8‚MEMFAILEDAT JSRPDATA LDX#XMOV JSROUT4HS JMPSTRT DECODEINX CPXNBSYT BEQMOVTAB CMPA#$5F BGTNSB‚NOTSINGLEBYTEINST. CMPA#$30 BLTTST2 JMPRELOC2‚1BYTE MOVTABJMPMOV TST2CMPA#$1B BGTPDUAL‚2BYTEREL? JMPRELOC2 NSBSTXXMOV‚SAVEXFORSRCH LDX#OPTAB‚SRCH3BYTETABLE LDAB#$FF SRCHCMPA0,X BEQTBOP CMPB0,X‚ENDTABLE? BEQDUAL‚2BYTEBYDEFAULT INX JMPSRCH DUALLDXXMOV PDUALPULA STAA0,X CMPA0,X BNEMEMER INX JMPRELOC2 TBOPLDXXMOV‚ABSOLUTE? PULA PULB DES DES SUBBOBEG+1 SBCAOBEG BLTNOALT‚ABSOLUTE PULA PULB DES DES SUBBOEND+1 SBCAOEND BGTNOALT‚ABSOLUTE PULA PULB‚NOTABSCALLOFSET ADDBOFSET+1‚&MOVE ADCAOFSET STAA0,X CMPA0,X BNEMFAIL INX CPXNBSYT BEQMOVTAB STAB0,X CMPB0,X BNEMFAIL INX JMPREL+ OC2 MFAILJMPMEMER NOALTPULA‚ABSOLUTE-MOVENO STAA0,X‚CHANGE CMPA0,X BNEMFAIL INX PULA STAA0,X CMPA0,X INX JMPRELOC2 PDATAEQU$F024 EXBUGEQU$F564 BEGENDEQU$F003 BADDREQU$F961 OUT4HSEQU$F01E BEGAEQU$FF0A ENDAEQU$FF0C OBEGFDB0 OENDFDB0 NBEGFDB0 NENDFDB0 OFSETFDB0 INCHEQU$F015 ADDR5FDB0 BSYTFDB0 NBSYTFDB0 XMOVFDB0 MSG1FCB$0A,$0D FCCƒ/*********PROGRAMCODEREASSEMBLER*****/ FCB$0D,$0A,$0A,$04 MSG2FCC/OLDBEGINADDR?/‚ FCB$04 MSG3FCC/NEWBEGINADDR?/ FCB$04 MSG4FCC/NEWENDADDRIS/ FCB$04,$0A,$04 MSG5FCC/REASSEMBLE(R)ORTEMPMOVE(M)?/ FCB$04 MSG6FCC/CONTINUEYES(Y)ORNO(N)?/ FCB$04 MSG7FCC/ENTERBEGTABLES-DATA/ FCB$0D,$0A FCC/IFNONEENTEROLDENDADDR/ FCB$04 MSG8FCC/MEMORYFAILEDAT/ FCB$04 MSG9FCC/OLDENDADDR?/ FCB$04 OPTABFCB$70,$73,$74,$76,$77,$78,$79 FCB$7A,$7C,$7D,$7E,$7F,$8C,$8E FCB$B0,$B1,$B2,$B4,$B5,$B6,$B7 FCB$B8,$B9,$BA,$BC,$BB,$BD,$BE,$BF FCB$CE,$F0,$F1,$F2,$F4,$F5,$F6 FCB$F7,$F8,$F9,$FA,$FB,$FE,$FF END MON @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@€NAMPNGEN OPTO,NOM *PRINTS/PUNCHESMEMORYCONTENTSIN *ƒBPNPNPNPNFFORMATFORINPUTTO *ƒPROMPROGRAMMER.‚ALLOWSINPUT *ƒOFUSERCOMMENTSBEFOREBEGINNING, *ƒEOTCHARACTER($04)TOCONTINUE. *ƒUSERMUSTMANUALLYTURNPUNCHON *ƒANDOFF,ANDGENERATELEADER/TRAILER. *ƒPROGRAMWAITSFOREOTCHARACTERFROM *ƒTTYKEYBOARDBEFORERETURNINGTOMAID. * PDATAEQU‚$F024‚EQUATESFOREXBUGROUTINES PDATA1EQU‚$F027‚ INADDREQU‚$F00F PCRLFEQU‚$F021 INCHNPEQU‚$F015 OUT4HSEQU‚$F01E OUTCHEQU‚$F018 PSPACEEQU‚$F02A RENTEREQU‚$F0F9 BEGAREQU$FF0A ENDAREQU$FF0C BEGATEQU$FF0E‚TAPECURRENTADDRESS †ORG$2700 †LDX#MMEM‚ADDROFMESSAGE(MEM) †JSRPDATA‚PRINTMESSAGE †LDX#MBEG‚ADDROFMESSAGE(BEGINADDR) †JSRPDATA1 †LDX#BEGAR‚PLACETOSTOREINPUTADDR JSRINADDRWAITFORINPUT,STOREADDR LDX#MMEMADDROFMESSAGE JSRPDATA1 LDX#MENDADDROFMESSAGE(ENDADDR) JSRPDATA1 LDX#ENDARPLACETOSTOREFINALADDR. JSRINADDRGETADDR LDX#MTAPE JSRPDATA1 LDX#BEGAT JSRINADDR*GOTDATA&TAPELOCATIONS JSRPCRLF TITLEJSRINCHNPHEADERLOOP CMPA#4=EOT BNETITLE NLINEJSRPCRLFNEWLINE LDX#BEGATPRINT JSROUT4HSTAPEADDRESS LDAB#4BYTECOUNTER ONELDAA#'BPREFIXCHAR JSROUTCH BSRPNOUTPRINTBITPATTERN LDAA#'FSUFFIXCHAR JSROUTCH JSRPSPACE LDXBEGARCURRENTMEMORYADDR CPXENDARFINALMEMORYADDR BEQQUIT INX STXBEGARUPDATECURRENTMEMORYADDR LDXBEGATCURRENTTAPEADDR INX STXBEGATUPDATEIT DECBUPDATEBYTECOUNT(4/LINE) BNEONE BRANLINE QUITJSRPCRLF TRAILJSRINCHNPWAITFORUSERTOSTOP CMPA#4 BNETRAILTAPEPUNCHANDTYPEEOTCHAR JMPRENTERGOBACKTOMAID PNOUTPSHB LDAA#88BITS/BYTE LDXBEGAR LDABXACCB=CURRENTBYTE LOOPPSHA LDAA#'N ROLBSHIFTBITINTOCARRY BCCOUTNOCARRYMEANSBITWAS0 LDAA#'P OUTJSROUTCHPRINTIT PULA DECA BNELOOPUNTILDONE8BITS PULB RTS MMEMFCC4,MEM FCB, 4EOT MTAPEFCC5,TAPE MBEGFCC11,BEGINADDR FCB4EOT MENDFCC9,ENDADDR FCB4EOT END @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@I€I10‚NAMNIM 20‚OPTO,S,NOG 30‚SPC2 40************************************** 50*NIMGAMEPROGRAMMERD.J.MCCARROLL* 60************************************** 70* 80*THISPROGRAMPLAYSAGAMEOFNIMAGAINST 90*AHUMANOPPONENTONATELETYPE. 100*THEGAMECONSISTSOF3ROWSOFX'SWITH 110*3,5,7,X'STOROWSA,BANDCRESPECTIVLY. 120*THEOBJECTOFTHEGAMEISTOLEAVEYOUR 130*OPPONENTWITHTHELASTX.EACHOFTHETWO 140*PLAYERSALTERNATELYREMOVESANUMBEROFX'S 150*FROMTHEROWS.EACHPLAYERMUSTTAKEAT 160*LEASTONEXONATURN,ANDHECANONLY 170*TAKEX'SFROMONEROWATATIME. 180* 190*THEALGORITHYMTHEMPUUSESISTHIS: 200* 210*‚1)THEGAMEISBROKENDOWNINTOTHREE 220*…SECTIONS 230*†A)EARLYGAME 240*†B)MIDGAME-ALLROWSHAVEONEOR 250*‰LESSXLEFT 260*†C)ENDGAME-ONLYONEXISLEFT 270*‚2)THENUMBEROFX'SINEACHROWISINBIN. 280*‚3)THE"GOAL"MOVESINEARLYGAMEARE 290*…THOSEMOVESTHATLEAVETHERESULTOF 295*…THEEXCLUSIVE"OR"OFALLCOLUMNS 300*†EQUALTOZERO 310*‚4)THE"GOAL"MOVESINMIDGAMEARE 320*…THOSEMOVESTHATLEAVETHERESULTOF 330*…THEEXCLUSIVE"OR"OFALLCOLUMNSEQUAL 340*…TOONE 350* 360*BYANALYSISOFSTATEMENTS3AND4ABOVE 370*ITCANBESEENTHATIFTHEMPUMOVES 380*FIRSTITCANNOTLOSE;BECAUSETHE 390*STATEMENTSWILLBEMADETRUEBYTHEMPU 400*ANDANYFURTHERMOVESWILLMAKETHEMFALSE 410* 420*TOMAKETHEGAMEMOREINTERESTING,THE 430*MPUCOMMENTSWHENTYPINGERRORSARE 440*MADEORWHENITWINS. 450*ALLGOALMOVESARESTOREDONALISTAND 460*ONEISPICKEDATRANDOMBYTHEMACHINE. 470*IFTHEREARENOGOALSOLUTIONS(WHENTHE 480*HUMANISWINNING)THEMPURANDOMLY 490*DECREMENTSAROW.THEREFORETHEMACHINE 500*DOESNOTNECCESSARILY 510*PLAYTHESAMEGAMETWICE. 200‚PAGE 210*DATASTORAGETABLE* 220‚SPC1 230TEMPRMB1TEMPORARYSCRATCH 240CCOLRMB1CCOLUMNXCOUNT 250BCOLRMB1BCOLUMNXCUONTER 260ACOLRMB1ACOLUMNXCOUNTER 270ERRORRMB1ERRORCOUNTER 280MYMOVERMB1WHOMOVES 285LOSESRMB1LOSSCOUNTER 286RANDOMRMB2RANDOMNUMBER 287ULOSRMB2DECIMALLOSSCOUNT 286GOALRMB3GOALS 290‚SPC1 290STATEQU$FCF4EXBUGTTYSTATUS 295TTYIOEQU$FCF5EXBUGTTYI/O 300OUCHEQU$F018EXBUGOUTPUTROUTINE 330‚ORG$2000 340*PROGRAMEXECUTEDSTARTINGHERE* 350‚SPC1 354‚LDS#$100 355‚CLRLOSES 355‚CLRULOS 360‚LDX#MSG1RULESREQUEST 370‚JSRPRNT 380‚JSRINEE 390‚CMPA#'Y 400‚BNESTARTIF"Y"RESPONCETYPERULES 410‚LDX#MSG2RULES 420‚JSRPRNT 430‚SPC1 440STARTEQU* 450‚SPC1 460*SETUPTHEBOARD* 470‚SPC1 480‚LDAA#7 490‚STAACCOL7X'SINC 500‚LDAA#5 510‚STAABCOL5- X'SINB 520‚LDAA#3 530‚STAAACOL3X'SINA 535‚JSRBOARDOUTPUTTHEBOARD 540‚SPC1 550‚CLRMYMOVEINITIALIZEMOVEPOINTER 580‚SPC1 590*ASKWHOGOESFIRSTANDRESPONDACCORDINGLY 600‚SPC1 610‚LDX#MSG3WHOMOVES1ST? 620‚JSRPRNT 630RESPONJSRINEE 640‚CMPA#'Y 650‚BEQBEGINYESYOUMOVE1ST 660‚CMPA#'N 670‚BEQBEGIN1NOIMOVE1ST 680‚LDX#MSG4ERRORINPUT 690‚JSRPRNT 700‚BRARESPON 710‚SPC1 720BEGIN1COMMYMOVEREVERSEMOVEPOINTER 730BEGINLDAAACOLTESTFORENDGAME 740‚ADDABCOL 750‚ADDACCOL 760‚CMPA#1 770‚BNEMYTEST 780‚JMPENDGAMEENDED 790MYTESTTSTMYMOVEFINDOUTWHO'SMOVEITIS 800‚BEQIMOVE 810‚JMPUMOVE 800‚SPC1 801*TTYINPUTROUTINEANDRANDOM#GEN.* 802‚SPC1 803INEELDAARANDOM+1 804‚INCA 805‚CMPA#3 806‚BNENZERO 807‚CLRA 808NZEROSTAARANDOM+1 809‚LDAASTAT 810‚BITA#1 820‚BEQINEE 825‚CLRRANDOM 830‚LDAATTYIO 840‚ANDA#$7F 850‚JSROUCH 860‚RTS 820‚SPC1 830*MOVEDECISIONROUTINE* 840‚SPC1 850IMOVELDX#MSG5PRINTMYMOVE 860‚JSRPRNT 870‚LDAAACOL 880‚EORABCOL 890‚EORACCOL 900‚STAATEMPFIND"MAGIC"NUMBER 910‚BNEWINIFNOT0ANDNOTMIDGAME 920‚BSRTESTIWILLWINTHEGAME 930‚BCCWIN 940‚SPC1 950*FUDGEAMOVEIFLOSING* 960‚SPC1 970‚LDAA#1 980‚STAATEMP‚FORCE1XREMOVAL 990‚SPC1 1000WINLDX#4FINDGOALSOLUTIONS 1010‚LDAA#$FF 1020‚STAAGOALZEROOLDGOALS 1030‚STAAGOAL+1 1040‚STAAGOAL+2 1050NEXTDEX 1060‚BEQPICK1 1070‚LDAAXFINDAGOAL 1080‚EORATEMP 1090‚CMPAX 1100‚BGENEXT 1110‚STAAGOAL-1,XSTORETHEGOALONLIST 1120‚BRANEXT 1130‚SPC1 1140PICK1LDXRANDOMPICKAGOALATRANDOM 1150‚INX 1165‚INX 1166NXTDEX 1170‚LDAAGOAL-1,XISTHISAGOAL? 1180‚CMPA#$FF 1190‚BNEGOLFNDIFTRUEYES 1200‚CPX#$1 1210‚BNENXTIFFALSEGOALNOTINRANGE 1220‚LDX#4OFRANDOMPOINTERSOFINDANYGOAL 1230NXT1DEX 1240‚BEQFUDGE1 1250‚LDAAGOAL-1,X 1260‚CMPA#$FF 1270‚BEQNXT1 1280‚SPC1 1290GOLFNDSTAAXSTOREGOALONBOARD 1300‚BSRTEST 1310‚BCSFUDGETHISGOALOKIFTRUE 1320‚TSTXMODIFYGOAL 1330‚BNECLRCLEARIFNONZERO 1340‚INCXSETTOONEIFISZERO 1350FUDGEJMPTABLE 1360CLRJMPCLEAR 1370‚SPC1 1380FUDGE1LDXRANDOMPICKARANDOMFUGDEDMOVE 1390‚INX 1400NXT2DEX 1410‚BEQFUDGE2IFTRUEOUTOFRAND.RANGE 1420‚LDAAX 1430‚BEQNXT2IFTRUECOLUMNALREADYZERO 1440‚DECX 1450‚JMPTABLE 1460FUDGE2LDX#4 1470‚BRANXT2 1230‚SPC1 1240TESTLDAAACOLTESTFORMIDGAME 1250‚ORAABCOL(ALLCOLUMNS1ORLESS) 1260‚ORAACCOL 1270‚BITA#$FE 1280‚BNEISMID 1290‚CLC 1300‚RTS 1310ISMIDSEC 1320‚RTS 1330‚SPC1 1340ENDLDAAMYMOVEFINDOUTWHOLOST 1350‚BNEULOSE 1360‚LDX#MSG6 1370ENDDJSRPRNT 1380‚JMPSTART 1381ULOSE‚LDAAULOS 1382‚ADDA#1 1383‚DAA 1384‚TAB 1380‚STAAULOS 1385‚ANDA#$0F 1386‚ORAA#$30 1387‚STAALOSCNT+1 1388‚LSRB 1389‚LSRB 1390‚LSRB 1391‚LSRB 1392‚ORAB#$30 1393‚STABLOSCNT 1390‚LDAALOSESGETLOSSCOUNT 400‚INCA 410‚STAALOSES 420‚LDX#LOSMSG 430SRCHINX 440‚INX 445‚CPX#MAXLOS 446‚BNESRCH1 447‚LDX#LASTL 448‚BRALLOSS 450SRCH1DECA 460‚BNESRCH 470LLOSSLDXXGETLOSSMESSAGE 480‚BRAENDD 1410‚SPC1 1420*INPUTTHEPLAYERSMOVE* 1430‚SPC1 1440UMOVELDX#MSG8PRINTYOURMOVE 1450‚JSRPRNT 1460‚LDX#4 1470‚JSRINEE 1480‚EORA#$40 1490LOOKDEXACCEPTA,B,CONLY 1500‚BEQWRONG 1510‚DECASETXTO1,2,3ACCORDINGLY 1520‚BNELOOK 1530‚JSRINEEGETSECONDINPUTCHAR. 1540‚EO. RA#$30ACCEPTNUMBERSONLY 1550‚BEQWRONGEXCLUDING0 1560‚CMPA#8AND8,9 1570‚BPLWRONG 1580‚TABSAVENO.INACCB 1590‚LDAAXGETCOLUMNTOBECHANGED 1600‚SBASUBTRACTNO. 1610‚BPLMOVIT 1620WRONGINCERROR 1635‚LDAAERROR 1640‚LDX#ERMSG 1650SEARCHINX 1660‚INX 1665‚CPX#MAXERR 1666‚BNESERCH1 1667‚BRASEARCH-3 1670SERCH1DECA 1680‚BNESEARCH 1690‚LDXXFINDNEXTERRORMESSAGE 1700‚JSRPRNTPRINTERRORMESSAGE 1710‚BRAUMOVE 1720‚SPC1 1720CLEARCLRA 1721MOVITSTAAXMAKEMOVE 1722TABLEBSRBOARD 1723‚JMPBEGIN1 1724‚SPC1 1730BOARDLDX#1PRINTOUTTHEBOARD 1740‚BSRRET 1750‚LDX#3 1760‚LDAA#'A 1770LOOPSTAATEMP 1780‚JSROUCH 1790‚LDAA#$20SPACE 1800‚JSROUCH 1810‚LDAA#'X 1820‚LDABX 1830LOOP1BEQRET 1840‚JSROUCH 1850‚DECB 1860‚BRALOOP1 1870RETLDAA#$0DCR 1880‚JSROUCH 1890‚JSROUCH 1900‚LDAA#$0ALINEFEED 1910‚JSROUCH 1920‚LDAATEMP 1930‚INCA 1940‚DEX 1950‚BNELOOP 1960‚RTS 1970‚SPC1 1971PRNTLDAA#$0D 1972‚JSROUCHPRINTCRLNFEED 1973‚JSROUCH 1974‚LDAA#$0A 1975‚JSROUCH 1976‚JSROUCH 1980PRNT1LDAAXPRINTOUTMESSAGEPOINTEDATBYX 1990‚CMPA#$1BUNTILESCFOUND 2000‚BEQDONE 2010‚JSROUCH 2020‚INX 2030‚BRAPRNT1 2040DONERTS 2050‚PAGE 2060*LISTOFMESSAGES* 2070‚SPC11 2080MSG1FCC/DOYOUWANTTHERULES?TYPE"Y"FORYES,"N"FORNO./ 2090‚FCB$1B 2100MSG2FCC/THERULESAREASFOLLOWS:/ 2110‚FDB$0D0D,$0A0A 2120‚FCC/1)YOUMAYTAKEANYNUMBEROFX'SFROMACOLUMN/ 2130‚FDB$0D0D,$0A0A 2140‚FCC/2)YOUMUSTTAKEATLEASTONEXEACHTURN/ 2150‚FDB$0D0D,$0A0A 2160‚FCC/3)YOUCANONLYTAKEX'SFROMONECOLUMNATATIME/ 2170‚FDB$0D0D,$0A0A 2175‚FCC/4)TAKEX'SBYTYPINGINTHECOLUMNLETTER/ 2176‚FCB$0D,$0D,$0A 2177‚FCC/ƒTHENTHENUMBEROFX'SYOUWISHTOREMOVE/ 2178‚FDB$0D0D,$0A0A 2180‚FCC/THEOBJECTOFTHEGAMEISTOLEAVEMEWITHTHELASTX/ 2190‚FDB$0D0D,$0A0A 2195‚FCC/THEBOARDLOOKSLIKETHIS:/ 2196‚FDB$0D0D,$0A1B 2200MSG3FCC/DOYOUWANTMETOGOFIRST?"Y"=YES,"N"=NO./ 2210‚FDB$201B 2230MSG4FCC/ISAID"Y"OR"N",PIMPLEBRAIN!/ 2240‚FCB$1B 2250MSG5FCC/MYMOVE/ 2260‚FDB$0A1B 2265MSG8FCC/YOURMOVE‚/ 1266‚FCB$1B 1270MSG6FCC/YOUWIN;YOUMUSTBELUCKY!/ 1280‚FCB$1B 2270‚PAGE 1000*TABLEOFERRORMESSAGES* 1010‚SPC1 1020ERMSGEQU*-2 1030‚FDBMSG10 1040‚FDBMSG11 1050‚FDBMSG12 1060MAXERREQU* 1070‚SPC1 1080*TABLEOFLOSSMESSAGES* 1090‚SPC1 1100LOSMSGEQU*-2 1110‚FDBMSG20 1120‚FDBMSG21 1130‚FDBMSG22 1131‚FDBMSG23 1132‚FDBMSG24 1133‚FDBMSG25 1134LASTLFDBMSG26 1140MAXLOSEQU* 1150‚SPC1 1160*LISTOFERRORMESSAGES* 1170‚SPC1 1180MSG10FCC/YOUCAN'TDOTHAT,TURKEY!/ 1190‚FDB$0A1B 1200MSG11FCC/HOWDOYOUEXPECTTOWINIFYOUCANTEVENTYPE?/ 1210‚FDB$0A1B 1220MSG12FCC/YOUKNOWYOURPRETTYBRIGHTFORADIMBULB!/ 1225‚FDB$0A1B 1230‚SPC1 1240*LISTOFLOSSMESSAGES* 1250‚SPC1 1270MSG20FCC/YOULOSE,TOAD!/ 1280‚FDB$0A1B 1290MSG21FCC/KEEPTRYING;MAYBEYOU'LLGETLUCKY!/ 1300‚FDB$0A1B 1310MSG22FCC/BOY!ISUREAMGLADI'MNOTBUYINGTHEPAPER!/ 1320‚FDB$0A1B 1330MSG23FCC/WHATYOUNEEDISAPOWERFAILURE!/ 1340‚FDB$0A1B 1350MSG24FCC/I'VEPLAYEDDUMMIESBEFORE,BUTYOUTAKETHECAKE!/ 1360‚FDB$0A1B 1370MSG25FCC/MAYBEYOURBETTERATTICTACTOE!/ 1380‚FDB$0A1B 1390MSG26FCC/YOUHAVENOWLOST/ 1400LOSCNTRMB2DECIMALLOS/ SFIGURES 1410‚FCC/GAMES/ 1420‚FDB$0A1B 1340‚END åe2€f NAM CWMK OPT OT,S,NOG ***************************************************************** * MORSE CODE/ASCII SEND/RECEIVE PROGRAM * FOR THE MOTOROLA 6800 MICROPROCESSOR * WRITTEN BY: * DON L. JACKSON - W7KGU * JIM BAINTER - WA7VKZ * VERSION 2.0 - FOR USE ON MOTOROLA * DESIGN EVALUATION KIT (MIKBUG). **************************************************************** * I/O HARDWARE CONFIGURATION: * PIA ADDRESS - $8008 * CA1 - INTERRUPT TIMING FOR XMIT CODE, * 2-50 HZ. * PA0 - T/R SWITCH, 0=TX, 1=RCV * PA7 - RECEIVE CODE INPUT * PB0 - CODE OUT * PB1 - TRANSMIT LAMP * PB2 - RECEIVE LAMP * ACIA ADDRESS - $8010 ***************************************************************** CVCX RMB 2 INDEX REG CONVERT STORE SAVEX RMB 2 COUNT RMB 1 RESMSK RMB 1 COSTA RESET MASK BUFLAG RMB 1 B7=1 DATA IN BUFFER * B6=1 CRLF TO PRINTER CHCNT RMB 1 CHAR. COUNTER FM KB COSTA RMB 1 CODE OUTPUT STATUS *B7 DIT FLAG,B6 DAH FLAG,B5 ELEMENT SPACE FLAG *B4 WORD SPACE FLAG,B3 CHAR. SPACE FLAG LETYPE RMB 1 LAST ELEM TYPE DOT=0 DASH>0 HLETIM RMB 1 HALF LAST ELEM TIME TLETIM RMB 1 TWICE LAST ELEM TIME SPEEDK RMB 1 SPEED CONSTANT RCHAR RMB 1 CHAR BEING RECEIVED LDATIM RMB 1 LAST DASH TIME TQLDAT RMB 1 3/4 LAST DASH TIME TLDAT RMB 1 TWICE LAST DASH TIME KDTIM RMB 1 KEYDOWN INTERVAL TIME KUTIM RMB 1 KEYUP INTERVAL TIME CHCTR RMB 1 REC. CHARACTER COUNTER RECX RMB 2 REC. INDEX REG. TO ACCA. P1 RMB 2 REC. BUFFER POINTER P2 RMB 2 REC. BUFFER POINTER BUFBOT RMB 101 XMIT BUFFER BOTTOM BUFTOP RMB 1 XMIT BUFFER TOP ORG $A04A BBOT RMB 9 BOTTOM OF RCV BUFFER BTOP RMB 1 TOP OF RCV BUFFER ORG $8008 PIAAD RMB 1 PIAAC RMB 1 PIABD RMB 1 PIABC RMB 1 ORG $8010 ACIAC RMB 1 ACIAD RMB 1 STACK EQU $A07F IRQVEC EQU $A000 SPC 1 ORG $0400 * KN BK AR SK ACK  CODE FCB 0,$B4,$8B,$54,$16,0,$14,0 * ERR SP FCB 1,0,0,0,0,$21,0,0 FCB 0,0,0,0,0,0,0,0 *  AS FCB 0,0,0,$44,0,0,0,0 * SP " ' RTAB FCB $21,0,$4A,0,0,0,0,$7A *  ( ) , - . / FCB $B6,$B2,0,0,$CE,$86,$56,$94 * 0 1 2 3 4 5 6 7 FCB $FC,$7C,$3C,$1C,$0C,4,$84,$C4 * 8 9 : ; BT(=) ? FCB $E4,$F4,$E2,$AA,0,$8C,0,$32 *  A B C D E F G FCB 0,$60,$88,$A8,$90,$40,$28,$D0 * H I J K L M N O FCB $08,$20,$78,$B0,$48,$E0,$A0,$F0 * P Q R S T U V W FCB $68,$D8,$50,$10,$C0,$30,$18,$70 *  X Y Z FCB $98,$B8,$C8 SPC 1 ***RESTART ROUTINE*** RESRT LDX #$7F CLR RAM 1-7F L1 CLR 0,X DEX BNE0  L1 LDX #$0F01 STX SPEEDK INZ SPEED CONS & RCHAR LDAA #$80 STAA BUFTOP INZ BUFTOP LDX #BTOP INZ BUFFER POINTERS STX P1 DEX STX P2 LDX #CODE STX CVCX INZ CVCX LDX #BUFTOP STX SAVEX LDX #POLL INZ IRQ VECTOR IN MIKBUG STX IRQVEC LDX #PIAAD CLR 1,X CLR PIAAC CLR 3,X CLR PIABC LDS #$0007 CA1=+ & ALLOWED STS 0,X (PIAAD & PIAAC) LDS #$FF34 STS 2,X (PIABD & PIABC) LDA A 0,X CLR IRQA FLAGS LDA A 2,X CLR IRQB FLAGS  LDA A #3 STA A 8,X RESET ACIA LDA A #$81 7 DATA, EVEN PARITY, 2 STOP STA A 8,X INZ ACIAC LDS #STACK INZ STACK POINTER BSR SCRLF PRINT CR/LF LDX #MSG1 BSR SCS PRINT MSG1 CLI CLEAR INTERRUPT FLAG SPC 1 *** EXECUTIVE PROGRAM *** EXEC LDAA BUFLAG CHECK FOR CRLF ASLA BPL EX2 NO CRLF BSR SCRLF LDAA BUFLAG ANDA #$BF ZERO B6 IN BUFLAG STAA BUFLAG EX2 LDAA CHCNT CMPA #65 BLS EX1 LDX SAVEX 66 CHAR FM KB LDAA 0,X CMPA #$21 LOOK FOR WORD SPACE BNE EX1 NO WORD SPACE BSR SCRLF CR/LF TO PRINTER CLR CHCNT EX1 WAI BRA EXEC  SPC 1 ***SUBR TO SEND CR/LF OR CHAR STRING TO PRINTER*** SCRLF LDX #CRLF SCS LDAA 0,X CMPA #4 BEQ RTSR END OF CHAR STRING SCR1 LDAB ACIAC BITB #2 TST FOR TX REG. EMPTY BEQ SCR1 NOT EMPTY STAA ACIAD SEND CHAR TO PRINTER  INX BRA SCS RTSR RTS SPC 1 ***IRQ INTERRUPT ROUTINE*** POLL LDAB PIAAC SAVE INTR. FLAGS. LDAA PIAAD ROR A BCS RECM REC MODE POLL1 TST B CHECK FOR TX INTR. BMI POLL2 (CA1) YES LDA B ACIAC CHECK ACIA RDRF ROR B  BCS COMMR1 RTI SPC 1 RECM LDAA BUFLAG BMI POLL1 DATA IN TX BUFFER RECI JMP REC GO TO REC ROUTINE SPC 1 POLL2 LDA B PIABD ORA B #2 XMIT LAMP ON ANDB #$FB REC LAMP OFF STA B PIABD LDA A COSTA GET CODE OUTPUT STATUS BPL CFDAH CHECK FOR DAH LDA B #$7F STA B RESMSK DIT RESET CES1 CLR B DIT BEING SENT BRA CKCNT TEST COUNT SPC 1 CFDAH ASLA TEST FOR DAH BPL CFES CHECK FOR ELEMENT SPACE LDA B #$BF STA B RESMSK DAH RESET LDA B #4 DAH BEING SENT BRA CKCNT SPC 1 CFES ASLA TEST FOR ELEMENT SPACE BPL CFWS CHECK FOR WORD SPACE LDA B #$DF STA B RESMSK ELEMENT SPACE RESET BSR SOZERO LDAB #1 BRA CKCNT SPC 1 CFWS ASL A BPL CFCS CHECK FOR SPACE LDA B #$EF STA B RESMSK WORD SPACE RESET LDA B #8 WORD SPACE BEING SENT BRA CKCNT SPC 1 CFCS LDA B #$F7 STA B RESMSK LDA B #4 CKCNT CMPB COUNT BEQ CK1 INC COUNT RETRN RTI SPC 1 CK1 CLR COUNT LDA A COSTA AND A RESMSK STA A COSTA BNE RETRN BRA GNEL SPC 1 ***SEND OUT A ZERO***  SOZERO LDA A PIABD AND A #$FE STA A PIABD RTS SPC 1 ***SEND OUT A ONE*** SOONE LDA A PIABD ORA A #1 SET BIT ZERO STA A PIABD RTS SPC 1 COMMR1 BRA COMMR SPC 1 ***GET NEW ELEMENT FOR OUTPUT*** GNEL LDA A BUFTOP CMPA #$80 TEST FOR CHAR END BNE GNEL1 LDA A #$08 SEND OUT CHAR. SPACE STA A COSTA BSR SOZERO LDX SAVEX CPX #BUFTOP BNE GNELR LDA A BUFLAG BUFFER EMPTY AND A #$7F STA A BUFLAG RESET FLAG RTI * 1 GNELR BSR MOVUP LDAA BUFTOP CMPA #$21 LOOK FOR SPACE BEQ SWS TST COSTA BEQ GNEL1 RTI * GNEL1 ASL BUFTOP BCS SODAH SEND OUT DAH LDA A #$A0 SEND OUT DIT & ELEMENT SPACE BRA SOEL * SODAH LDA A #$60 SEND OUT DAH &ELEMENT SPACE SOEL STA A COSTA SET STATUS BSR SOONE RTI * SWS LDA A #$80 STA A BUFTOP LDA A #$10 STA A COSTA SEND OUT WORD SPACE BSR SOZERO RTI * MOVUP LDX #BUFTOP-BUFBOT MOV1 LDA A BUFBOT-1,X STA A BUFBOT,X DEX BNE MOV1 LDX SAVEX UPDATE INPUT POINTER INX STX SAVEX MOVRT RTS SPC 1 ***COMM REC INTERRUPT ROUTINE*** COMMR LDX SAVEX INC CHCNT INC CHAR COUNTER LDA A ACIAD GET KB DATA CPX #BUFBOT BEQ BUFFUL MEMORY BUFFER FULL BIT B #$18 CK FOR FE OR OVRN BNE ERROR CMPA #$0D CK FOR CR BEQ SCR SEND CR CMPA #$5A BHI BADCH ILLEGAL CHAR STM STA A CVCX+1 LDX CVCX LDA B 0,X DATA CONVERTED TO MORSE CODE BEQ BADCH KICK OUT BAD CHAR'S LDX SAVEX DEX STA B 0,X STORE DATA IN BUFFER STX SAVEX MOVE POINTER DOWN LDA B BUFLAG ORA B #$80 SET FLAG BIT 7 STA B BUFLAG PRNT STA A ACIAD PRINT CHARACTER RTI * SCR LDA B BUFLAG ORA B #$40 SET BIT 6 STA B BUFLAG CLR CHCNT RESET COUNTER TO 0 BRA STM * BUFFUL LDA A #'* PRINT * FOR BUFFUL BRA PRNT * ERROR LDA A #'? PRINT ? FOR ERROR BRA PRNT * BADCH LDA A #7 RING BELL FOR BAD CHAR BRA PRNT SPC 1 ***START OF RECEIVE ROUTINE*** REC LDAA PIABD ORAA #4 REC LAMP ON ANDA #$FD XMIT LAMP OFF STAA PIABD KEYUP LDA A #$FF RESET INTERVAL COUNTER KULOOP CMP A #$FE INTERVAL COUNTER AT MAX? BEQ NOINC DO NOT INCR IF MAX INC A INCREMENT INTERVAL COUNTER BRA KUCONT SPC 1 NOINC STA A KUTIM SAVE KU INTERVAL TIME LDA B RCHAR GET RCVD CHAR CMP B #1 ANYTHING THERE? BEQ KUCONT BSR COMPKU KUCONT LDA B PIAAD CHECK INPUT BMI KD BRANCH IF KEYDOWN BSR TIMER TIME DELAY ROR B CHECK T/R SWITCH BCS KULOOP JMP POLL RETURN TO TX ROUTINE SPC 1 KD STA A KUTIM SAVE KU INTERVAL TIME BSR COMPKU KEYDWN LDA A #$FF RESET INTERVAL TIMER KDLOOP CMP A #$FE INTERVAL COUNTER AT MAX? BEQ MAXKD DO NOT INCR IF MAX INC A INCREMENT INTERVAL COUNTER MAXKD LDA B PIAAD CHECK INPUT  BPL KU BRANCH IF KEYUP BSR TIMER BRA KDLOOP SPC 1 KU STA A KDTIM SAVE KD INTERVAL TIME CMP A #$4 KD INTERVAL TIME TOO LOW? BCC CKHI BRANCH IF NOT TOO LOW LDA A SPEEDK LSR A DIVIDE SPEED CONSTANT BY 2 BRA UNZERO  SPC 1 CKHI CMP A #$7F KD INTERVAL TIME TOO HIGH? BCS CMPTKD BRANCH IF OK LDA A SPEEDK ASL A MULTIPLY SPEED CONSTANT BY 2 UNZERO ORA A #1 ASCERTAIN SPEED CONSTANT IS STA A SPEEDK NOT SET TO ZERO CMPTKD BSR COMPKD JMP KEYUP SPC 1 ***SUBROUTINE TO CREATE TIME DELAY*** TIMER PSH B SAVE B PSH A SAVE A LDA B SPEEDK DELOP2 LDA A #$40 DELOOP DEC A BNE DELOOP DEC B BNE DELOP2 JSR PACH PRINT CHAR IN BUFFER PUL A RESTORE A PUL B RESTORE B RTS SPC 1 ***SUBROUTINE TO COMPUTE KU*** COMPKU CMP A TQLDAT BCS MOREL BRANCH IF KUTIM < TQLDA2 T LDA A RCHAR GET CHAR BEING RECEIVED CMP A #1 BEQ CKFSP BSR GAFT GET ASCII FROM TABLE BSR PRINT LDA A #1 STA A RCHAR READY FOR NEW CHAR CKFSP LDA A TLDAT GET TWICE LAST DASH TIME CMP A KUTIM COMPARE WITH KU INTERVAL BCC MOREL BRANCH IF TLDAT >= KU INTER LDA A #$20 ASCII SPACE BSR PRINT PRINT SPACE MOREL RTS SPC 1  ***SUBROUTINE TO COMPUTE KD*** COMPKD LDA A TLETIM GET TWICE LAST ELEM TIME CMP A KDTIM COMPARE WITH KD INTERVAL  BCS DASHEL BRANCH IF TLETIM < KD INTER LDA A HLETIM GET HALF LAST ELEM TIME CMP A KDTIM COMPARE WITH KD INTERVAL  BCC DOTEL BRANCH IF HLETIM >= KD INTER LDA A LETYPE CHECK LAST ELEMENT TYPE BNE DASHEL BRANCH IF LAST ELEM WAS DASH  DOTEL CLR LETYPE MAKE LAST ELEM TYPE=00=DOT CLC BRA ADDEL DASHEL INC LETYPE MAKE LAST ELEM TYPE=DASH LDA A KDTIM GET KD INTERVAL STA A LDATIM STORE IN LAST DASH TIME TAB SAVE IN ACCUM B LSR A DIVIDE KD INTERVAL BY 2 STA A TQLDAT SAVE 1/2 KD LSR A DIVIDE 1/2 KD BY 2 ADD A TQLDAT ADD 1/2 TO 1/4 KD INTERVAL STA A TQLDAT STORE RESULT  ASL B MULTIPLY KD INTERVAL BY 2 STA B TLDAT STORE RESULT SEC ADDEL ROL RCHAR ADD NEW ELEM TO CHARACTER LDA A KDTIM GET KD INTERVAL TAB SAVE IN ACCUM B LSR A DIVIDE KD BY 2 STA A HLETIM STORE 1/2 KD INTERVAL ASL B MULTIPLY KD BY 2 STA B TLETIM STORE TWICE KD INTERVAL RTS SPC 1 ***SUBROUTINE TO PRINT RCVD CHAR*** PRINT INC CHCTR INCREMENT CHAR COUNTER LDA B CHCTR CMP B #60 CHECK CHAR COUNT BCS OK BRANCH IF LESS THAN 60 CMP B #71 BCS CKSP BRANCH IF LESS THAN 71 ENDLIN PSH A SAVE A BSR CRLFR PRINT CR AND LF CLR CHCTR RESET CHARACTER COUNTER PUL A RESTORE A CMP A #$20 IS CHARACTER A SPACE? BEQ DONE BRANCH IF YES CKSP CMP A #$20 BEQ ENDLIN END THE LINE IF SPACE OK BRA SDATA STORE CHARACTER DONE RTS SPC 1 ***SUBR. TO GET ASCII CHAR FROM CODE TABLE*** GAFT SEC CHANGE FORMAT OF RCHAR. ROLA GAFT1 ASLA BCC GAFT1 LDX #RESRT-1 STAB1 CMPA 0,X BEQ TABM FOUND MATCH  DEX CPX #RTAB+1 END OF TABLE? BNE STAB1 NO! LDAA #'_ RETURN "_" FOR NO MATCH RTS * TABM STX RECX  LDAA RECX+1 X(LOW) TO ACCA. RTS SPC 1 ***SUBROUTINE TO PRINT 1 ASCII CHAR*** PACH LDAB ACIAC BITB #2 BEQ PACH1 TST FOR TX REG. EMPTY. BSR GDATA BCC PACH1 EMPTY STAA ACIAD PRINT CHARACTER PACH1 RTS SPC 1 ***SUBROUTINE TO STORE DATA IN REC BUFFER*** SDATA LDX P2 CPX P1 BEQ BFUL CPX #BBOT-1 BNE SDATA1 LDX #BTOP  SDATA1 STAA 0,X DEX STX P2 CLC NOT FULL RTS * BFUL SEC BUFFER FULL RTS SPC 1 ***SUBROUTINE TO GET DATA FROM REC BUFFER*** GDATA LDX P1 DEX CPX P2 BEQ EMPTY CPX #BBOT-1 BNE GDATA1 LDX #BTOP GDATA1 LDAA 0,X STX P1 SEC NOT EMPTY RTS * EMPTY CLC EMPTY RTS SPC 1 ***SUBROUTINE TO SEND CR/LF TO REC BUFFER*** CRLFR LDX #CRLF CRR LDAA 0,X CMPA #4 BEQ CRR1 STX RECX BSR SDATA LDX RECX INX  BRA CRR CRR1 RTS SPC 1 *** CHARACTER STRINGS *** MSG1 FCC 'MORSE CODE SEND/RECEIVE ' FCC 'PROGRAM FOR MOTOROL3 A ' FCC '6800 MICROPROCESSOR' FCB $0D,$0A,0,0,0,0 FCC 'VER. 2.0 ** W7KGU ** WA7VKZ **' FCB $0A CRLF FCB $0D,$0A,0,0,0,0,4 SPC 1 ORG CODE+$3F8 FDB POLL,RESRT,RESRT,RESRT VECTORS END MON !L€" NAM EXORCYB **THIS PROGRAM ALLOWS THE EXORCISER TO COMMUNICATE *WITH ANOTHER COMPUTER VIA AN ADDITIONAL ACIA PORT *AND ACOUSTIC COUPLER. ********************************************** *SUBROUTINE"CONTRL" * THIS SUBROUTINE ALLOWS THE EXORCISER *TTY TO COMMUNICATE DIRECTLY WITH THE MODEM *THE EXORCISER WILL SIMPLY PASS ALL DATA *FROM ITS TTY TO THE CYBER UNTIL IT *RECEIVES A "CONTROL C" FROM ITS TTY ACIAAC EQU $E000 MODEM ACIA CONTROL REGISTER ACIAAD EQU $E001 MODEM ACIA DATA REFISTER ACIABC EQU $FCF4 EXORCISER ACIA CONTROL REG ACIABD EQU $FCF5 EXORCISER ACIA DATA REG CNTRLC EQU $03 "CONTROL C" ORG $0000 * TEMPORARY STORAGE LOCATIONS CKSM RMB 1 BYTECT RMB 1 XHI RMB 1 XLOW RMB 1 ECHO RMB 1 ORG $6000 CONTRL LDA A #3 LDX #ACIAAC STA A 0,X RESET ACIA'S STA A ACIABC LDA A #$81 SET BOTH FOR EVEN PARITY STA A 0,X STA A ACIABC LDX #PROMPT JSR PDATA LDX #ACIAAC TTY LDA A ACIABC CHECK FOR DATA FROM TTY ASR A BCC MODEM NOTHING FROM TTY, CHECK MODEM LDA A ACIABD GET CHARACTER FROM TTY STA A ACIABD ECHO CHAR TO TTY CMP A #CNTRLC BEQ GETFIL WAIT LDA B 0,X CHECK IF PREVIOS CHAR SENT ASR B ASR B BCC WAIT WAIT FOR LAST CHAR TO BE SENT STA A 1,X SEND CHAR TO MODEM MODEM LDA A 0,X CHECK FOR CHAR FROM MODEM ASR A BCC TTY NOTHING FROM MODEM, CHECK TTY LDA A 1,X GET CHAR FROM MODEM WAIT1 LDA B ACIABC CHECK IF PREVIOS CHAR SENT ASR B ASR B BCC WAIT1 TDR FULL, WAIT STA A ACIABD SEND CHAR TO TTY BRA TTY *SUBROUTINE "GETFILE" *THIS SUBROUTINE ASSUMES THAT A *M6800 LOADER FORMATTED FILE IS  *CONTAINED ON THE COMPUTER *COMMAND "COPY,FILENAME" HAS BEEN SENT, *BUT NO CARRIAGE RETURN AT THE END *"GETFILE IS ENTERED WHEN "CONTRL" *DETECTS A "CONTROL C"(ETX) GETFILE CLR ECHO LDX #MSG1 JSR PDATA PRINT "ECHO?" JSR INCH1 GET ANSWER CMP A #'Y CHECK FOR "Y" BNE ARND NO ECHO COM ECHO SET ECHO=1 ARND LDX #MSG2 JSR PDATA PRINT "WAIT" LDA A ACIAAC READ MODEM STATUS ASR A ASR A BCC GETFILE WAIT FOR MODEM TDR EMPTY LDA A #$0D 0D=CARRIAGE RETURN STA A ACIAAD SEND CR TO MODEM LOAD BSR INCH GET CHAR FROM MODEM  CMP A #'S BNE LOAD 1 ST CHAR NOT (S) BSR INCH NEXT CHAR CMP A #'9 BEQ CONTRL EOF DETECTED CMP A #'1 BNE LOAD 2ND CHAR NOT (1) CLR CKSM ZERO CHECKSUM BSR BYTE READ BYTE SUB A #2 STA A BYTECT BYTE COUNT *BUILD ADDRESS BSR BADDR *STORE DATA LOAD11 BSR BYTE DEC BYTECT BEQ LOAD15 ZERO BYTE COUN4 T STA A X STORE DATA INX BRA LOAD11 LOAD15 INC CKSM BEQ LOAD BSR ERROR CHECKSUM ERROR DETECTED JMP CONTRL *BUILD ADDRESS BADDR BSR BYTE READ 2 FRAMES STA A XHI BSR BYTE STA A XLOW LDX XHI RTS *INPUT BYTE (TWO FRAMES) BYTE BSR INHEX GET HEX CHAR ASL A ASL A ASL A ASL A TAB BSR INHEX AND A #$0F MASK TO 4 BITS ABA TAB ADD B CKSM STA B CKSM RTS * INPUT HEX CHAR INHEX BSR INCH CMP A #$30 BMI C1 NOT HEX CMP A #$39 BLE RETURN CMP A #$41 BMI C1 NOT HEX CMP A #$46 BGT C1 NOT HEX SUB A #7 RETURN RTS C1 JMP CONTRL *INPUT ONE CHAR INTO A-REGISTER INCH LDA A ACIAAC ASR A BCC INCH RECEIVER NOT READY LDA A ACIAAD INPUT CHAR TST ECHO ECHO SET? BEQ NOECH NOT SET JSR OUTCH ECHO CHAR NOECH AND A #$7F RESET PARITY CMP A #$7F BEQ INCH IGNORE RUBOUT RTS *CHECKSUM ERROR ERROR LDA A #'? STA A ACIABD PRINT(?) ON TTY RTS OUTCH EQU $F9DC PDATA EQU $FA33 INCH1 EQU $FA8B MSG1 FCC /ECHO?/ FCB 4 MSG2 FCC /WAIT/ FCB $0D,$0A,4 PROMPT FCB $D,$A,'!,4 END SCAN 163 EOR 163 0 ? AU€A NAM CODEC  TTL *CONVERTS ASCII-BAUDOT VER1.0*  OPT SYM,MEX,LLEN=80  SPC 2 * * *NAME:  JOHN HOYT *COMP: NAVELEX SECURITY ENG CENTER *ADDR: 3801 NEBRASKA AVE NW * WASHINGTON, DC 20390 *PHON: (202)282-0938 * * * *THESE ARE BAUDOT TO ASCII & ASCII TO *BAUDOT MACRO'S. * *PRIME USE IS IN INTRUP I/O ROUTINES TO *CONVERT FRM/TO BAUDOT TERMINAL DEVICES *FRM/TO ASCII TERMINAL DEVICES. * *LOWER CASE ASCII WILL BE CONVERTED TO *UPPER CASE & ASCII CHARS THAT HAVE NO *CORESPONDING BAUDOT CHAR WILL BE *CONVERTED TO NULL'S (IE-ALL 0'S CHAR). * *LK-UP TABLE TAKES UP 128 BYTES OF (ROM) MEM. * *MAX SERVICE TIME IS 67 MC6800 CLK CYCLES. * *TO MOVE LK-UP TBL IN (ROM) MEMORY, *CHANGE THE FOLLOWING: *IN CONBA---\.3 LDAB #$(NEW) *IN CONAB---\.4 LDAB #$(NEW) *IN TABLE---ORG $(NEW)00 *WHERE (NEW) = 1ST 2 HEX CHARS OF NEW TBL LOAC. *NOTE: TABLE MUST START @ ADDR ENDING IN 00!!!!! * *CHIPS OTHER THAN THE ACIA ARE NORMALLY REQUIRED *FOR BAUDOT (5 BIT CODE) USE. * * * *EXAMPLE PROGRAM CONVERTS ONE LINE FRM THE *CONSOLE KYBD TO BAUDOT STORED @ MEM ADDR $100 *ON, AND RECONVERTS THIS LINE BACK TO ASCII AT *THE CONSOLE PRNTR AFTER A CR IS SENT. IF THE *CONSOLE IS A TI 733 ASR THE EXAMPLE MUST BE *RUN @ 300 BAUD ON THE EXORCISER AS NO FILL *CHARS ARE SENT TO THE PRNTR. EXMPL NEEDS *LESS THA5 N 1K RAM STRT'G @ $0000 & LESS THAN *1K STRT'G @ $B500 TO RUN.  PAGE *MACRO CONBA - CONVERTS BAUDOT CHAR TO ASCII *USE IS AS FOLLOWS: CONBA ADDR,SHIFT,XLOAC *WHERE; ADDR=ADDR OF BAUDOT CHAR * SHIFT=LOCATION IN RAM(1 BYTE)INDICATING * IF FIGS OR LTTR BAUDOT CHAR. * XLOAC=2 BYTE LOCA IN RAM FOR LK * UP TABLE ADDR. * *IF A BAUDOT SHIFT CHAR IS INPUTED, THE *A-ACMLTR = 0 AT END OF MACRO. * *SERVICE TIME RANGES FRM 10 CLK CYCLES TO DECODE *A NULL TO 52 CLK CYCLES TO DECODE *AN ASCII UPPER CASE LTR. * CONBA MACR  LDAA \0 ;GET BAUDOT CHAR  BEQ \.4 ;GOTO \.4 IF=0  CMPA #$1F ;LTRS?  BEQ \.1  CMPA #$1B ;FIGS?  BEQ \.2 ;IF SO GOTO \.2  LDAB \1 ;SEE IF LTRS OR FIGS  BEQ \.3 ;IF FIGS GOTO \.3  ORAA #$60 ;SET BITS 5 & 6 IF LTRS \.3 LDAB #$B5  STAB \2  STAA \2+1  LDX \2  LDAA X ;ASCII CHAR  BRA \.4 ;GOTO END \.1 LDAB #$FF ;SET \1 TO $FF IF LTRS  STAB \1  CLRA  BRA \.4 \.2 CLR \1 ;SET \1 TO $00 IF FIGS  CLRA \.4 EQU *  ENDM  SPC 2  PAGE *MACRO CONAB - CONVERTS 7-BIT ASCII CHAR TO BAUDOT *USE IS AS FOLLOWS: CONAB ADDR,SHIFT,XLOAC *WHERE; ADDR=ADDR OF ASCII CHAR * SHIFT=1 BYTE RAM LOCA TO INDICATE IF * THE BAUDOT CHAR IS FIGS OR LTRS *  XLOAC=2 BYTE RAM LOAC FOR LK-UP TBL * *IF A BAUDOT SHIFT CHAR MUST BE SENT BOTH A & B *ACMLTRS WILL COMPARE & BOTH WILL HAVE THE SHIFT *CHAR THAT MUST BE SENT. THEN THIS MACRO MUST *BE RECALLED TO SEND THE BAUDOT CHAR. * *ANY ASCII CONTRL CHAR'S EXCEPT LF CR OR *BELL WILL BE DECODED AS NULL'S. * *THIS MACRO WILL TAKE BOTH LOWER AND UPPER CASE *ASCII CHAR'S AND CONVERT THEM TO UPPER CASE ON A *BAUDOT PRINTER (IE - a CONVERTS TO A). * *SERVICE TIMES RANGE FRM 10 CLK CYCLES TO DECODE *A NULL TO 67 CLK CYCLES TO DECODE A BAUDOT *FIGS SHIFT CHAR PRIOR TO A BAUDOT BELL CHAR. * CONAB MACR  LDAA \0 ;GET ASCII CHAR  BEQ \.5  CMPA #$7F  BEQ \.5  BITA #$40 ;LTRS?  BNE \.2 ;IF SO GOTO \.2  BITA #$60 ;CNTL CHAR?  BEQ \.3 ;IF SO GOTO \.3  CMPA #$20 ;SP?  BEQ \.4  LDAB #$1B ;FIGS  CMPB \1 ;SHIFT LOCATION IN RAM  BEQ \.4 \.6 STAB \1  TBA ;B=A  BRA \.5 ;GOTO END \.2 LDAB #$1F ;LTRS  CMPB \1  BNE \.6 ;SHIFT CHANGE (LTRS)  ORAA #$20 ;CONVERT LOWER CASE  EORA #$20 ;TO UPPER CASE \.4 LDAB #$B5  STAB \2  STAA \2+1  LDX \2  LDAA X ;BAUDOT CHAR  BRA \.5 ;GOTO END \.3 CMPA #$0A ;LF?  BNE \.7  LDAA #$02 ;BAUDOT LF  BRA \.5 \.7 CMPA #$0D ;CR?  BNE \.8  LDAA #$08 ;BAUDOT CR  BRA \.5 \.8 CMPA #$07 ;BELL?  BNE \.9  LDAB #$1B ;FIGS  CMPB \1  BEQ \.A  BRA \.6  \.A LDAA #$05 ;BAUDOT BELL  BRA \.5 \.9 CLRA \.5 EQU *  ENDM  SPC 2  PAGE 6  ORG $B500 *LOOK-UP TBL FOR ASCII-BAUDOT CONVERSION *CHANGE THE ABOVE ORG STATEMENT TO MOVE *LAST TWO DIGITS MUST BE 00. TABLE TAKES *UP 128 BYTES OF ROM.  SPC 2 *BAUDOT FIGURES TO ASCII SECTION  FCB $0  FCC \3\  FCB $0A ;LF  FCC \- \  FCB $07 ;BELL  FCC \87\  FCB $0D ;CR  FCC \$4',!:(5")2#6019?&\  FCB $0  FCC \./;\  FCB $0  SPC 2 *ASCII TO BAUDOT FIGS SECTION  FCB $04 ;SP  FCB $0D ;!  FCB $11 ;"  FCB $14 ;#  FCB $09 ;$  FCB $00  FCB $1A ;&  FCB $0B ;'  FCB $0F ;(  FCB $12 ;)  FCB $0  FCB $0  FCB $0C ;,  FCB $03 ;-  FCB $1C ;.  FCB $1D ;/  FCB $16 ;0  FCB $17 ;1  FCB $13 ;2  FCB $01 ;3  FCB $0A ;4  FCB $10 ;5  FCB $15 ;6  FCB $07 ;7  FCB $06 ;8  FCB $18 ;9  FCB $0E ;:  FCB $1E ;;  FCB $0  FCB $0  FCB $0  FCB $19 ;?  SPC 2 *UPPER CASE ASCII TO BAUDOT LTRS SECTION  FCB $0  FCB $03 ;A  FCB $19 ;B  FCB $0E ;C  FCB $09 ;D  FCB $01 ;E  FCB $0D ;F  FCB $1A ;G  FCB $14 ;H  FCB $06 ;I  FCB $0B ;J  FCB $0F ;K  FCB $12 ;L  FCB $1C ;M   FCB $0C ;N  FCB $18 ;O  FCB $16 ;P  FCB $17 ;Q  FCB $0A ;R  FCB $05 ;S  FCB $10 ;T  FCB $07 ;U  FCB $1E ;V  FCB $13 ;W  FCB $1D ;X  FCB $15 ;Y  FCB $11 ;Z  FCB $0  FCB $0  FCB $0  FCB $0  FCB $0  SPC 2 *BAUDOT LTRS TO UPPER CASE ASCII SECTION   FCB $0  FCC \E\  FCB $0A ;LF  FCC \A SIU\  FCB $0D ;CR  FCC \DRJNFCKTZLWHYPQOBG\  FCB $0  FCC \MXV\  FCB $0  SPC 2 *END OF TABLE  PAGE *EXAMPLE PRGM TO SHOW USE OF ASCII-BAUDOT *CONVERSION MACRO'S. * *REQUIRES <1K RAM STRT'G @ $0000 *AND <1K STRT'G @ $B500 TO RUN. * *TAKES IN ONE LINE FRM CONSOLE KYBD AND *GONVERTS TO BAUDOT STORED AT MEM LOAC $100 ON. *UPON RECEVING A CR, CONVERTS BAUDOT BACK *TO ASCII & SENDS TO CONSOLE PRNTR. *PRGM WILL THEN TAKE IN A NEW LINE, WRIT'G *OVER THE OLD LINE. * *MUST USE @ 300 BAUD IF CONSOLE *IS A TI 733 ASR (NO FILL CHARS)!! *  SPC 2  ORG $B580  LDS #$7FF  CLR $0  CLR $3  LDAA #$1 ;NO INT,7BIT,EP,2SB,X16CLK  STAA $FCF4 L3 LDX #$100  STX $6 STRT LDAB $FCF4 ;ACIA CR  BITB #1 ;REC DR FULL?  BEQ STRT L1 EQU *  CONAB $FCF5,$0,$1  LDX $6  STAA X  INX  STX $6  CBA  BEQ L1  CMPA #$08 ;BAUDOT CR  BNE STRT  LDX #$0FF  STX $8 L2 LDX $8  INX  STX $8  CONBA X,$3,$4  BEQ L2 ;SHIFT CHAR SND LDAB $FCF4  BITB #2 ;XMIT RDY?  BEQ SND  STAA $FCF5  CMPA #$D ;CR?  BNE L2  JMP L3  SPC 2  END 7 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@Yf€Y NAM MATH OPT O,NOG ORG $1000 SPC 1 * IN THE FOLLOWING SUBROUTINES INVOLVING TWO * OPERANDS,THE FIRST OPERAND IS AT LOCATIONS 03 TO * 07 IN THE FOLLOWING FORMAT: * LOCATION 03 M.S.BYTE OF MANTISSA * 04 MIDDLE BYTE OF MANTISSA * 05 L.S.BYTE OF MANTISSA * 06 EXPONENT * 07 SIGN OF MANTISSA * THE ADDRESS OF THE SECOND OPERAND IS SPECIFIED BY * THE INDEX REGISTER AS FOLLOWS: * 0,X M.S.BYTE OF MANTISSA * 1,X MIDDLE BYTE OF MANTISSA * 2,X L.S.BYTE OF MANTISSA * 3,X EXPONENT * 4,X SIGN OF MANTISSA * THE RESULT ALWAYS OVERWRITES THE FIRST OPERAND IN * LOCATIONS 03 TO 07 ; THE SECOND OPERAND REMAINS * UNALTERED SPC 1 FLAG EQU $07 SIGN OF FIRST OPERAND T1 EQU $08 TEMP. STORE FOR X REGISTER COUNT EQU $0A NUM EQU $0B FLAG1 EQU $0C ANS1 EQU $0F ANS2 EQU $13 S1 EQU $17 C1 EQU $1B SPC 1 * ADDITION ROUTINE. ADD * ---------------- * THE ADDEND,THE ADDRESS OF WHICH IS SPECIFIED BY * THE INDEX REGISTER,IS ADDED TO THE AUGEND IN * LOCATIONS 03 TO 07. SPC 1 ADD LDA A 4,X TEST SIGN OF ADDEND BPL ADDP IF SIGN IS NEGATIVE THEN JSR SUBP ...SUBTRACT ADDEND RTS ADDP STX T1 SAVE INDEX REGISTER  JSR ADJEXP ADJUST EXPONENTS LDA A 03 ORA A 04 ORA A 05 BNE A1 TEST IF MANTISSA=0 CLR FLAG SET SIGN TO POSITIVE  JSR GET RTS A1 LDA A FLAG TEST FLAG BEQ L1 JSR COMPL COMPLEMENT MANTISSA L1 JSR ADD1 ADD MANTISSAS BCS L2 CHECK IF OVERFLOW OCCURRED LDA A FLAG TEST SIGN BEQ OUT1 JSR COMPL COMPLEMENT MANTISSA JSR NORM NORMALISE RESULT BRA OUT1 L2 LDA A FLAG TEST SIGN BNE L3 SEC SHIFT IN A "1" ROR 0003 ROR 0004 ROR 0005 INC 0006 ADJUST EXPONENT OUT1 LDX T1 RESTORE INDEX REGISTER RTS L3 CLR FLAG SET SIGN TO POSITIVE JSR NORM NORMALISE RESULT BRA OUT1 SPC 1  * NORMALISATION ROUTINE NORM LDA A 03 CHECK IF NORMALISED BMI R2 LDA A #25 SET MAX.NUMBER OF SHIFTS L5 DEC A BEQ L4 DEC 0006 DECREMENT EXPONENT BVS ZERO CHECK FOR 2'S COMPL.OVERFLOW ASL 0005 SHIFT MANTISSA LEFT ROL 0004 ROL 0003 BPL L5 REPEAT IF NOT YET NORMALISED R2 RTS ZERO CLR A STA A 03 SET MANTISSA=0 STA A 04 STA A 05 L4 LDA A #$80 SET EXPONENT TO LARGEST STA A 06 ...NEGATIVE NUMBER ALLOWED CLR FLAG RTS SPC 1 * SUBTRACTION ROUTINE. SUBTR * ------------------- * THE SUBTRAHEND,THE ADDRESS OF WHICH IS SPECIFIED * BY THE INDEX REGISTER,IS SUBTRACTED FROM THE * MINUEND IN LOCATIONS 03 TO 07. SPC 1 SUBTR LDA A 4,X TEST SIGN OF SUBTRAHEND BPL SUBP IF SIGN IS NEGATIVE,THEN JSR ADDP ...ADD SUBTRAHEND RTS SUBP COM FLAG CHANGE SIGN JSR ADDP ADD ABS.VALUE OF SUBTRAHEND COM FLAG CHANGE SIGN OF RESULT RTS SPC 1 * SUBROUTINE 'ADJEXP' OPERATES ON THE SMALLER OF * THE TWO OPERANDS. ITS MANTISSA IS SHIFTED RIGHT * AND8  ITS EXPONENT INCREASED UNTIL IT IS EQUAL TO * THE EXPONENT OF THE LARGER OPERAND. ADJEXP LDA A 3,X EXPONENT OF ADDEND CMP A 06 EXPONENT OF AUGEND BEQ RET1 TEST FOR EQUAL EXPONENTS BLT RELOC (3,X)<(06) ADJ1 LSR 0003 SHIFT MANTISSA TO RIGHT AND ROR 0004 ...INCREASE EXPONENT ROR 0005 INC 0006 CMP A 06 BNE ADJ1 RET1 RTS SPC 1 * SUBROUTINE 'RELOC' IS REQUIRED IN CASE THE ADDEND * IS A CONSTANT IN ROM. IF ITS EXPONENT IS SMALLER * THAN THAT OF THE AUGEND,IT MUST BE TRANSFERRED TO * RAM SO THAT ITS MANTISSA CAN BE SHIFTED RIGHT AND * ITS EXPONENT INCREASED UNTIL IT EQUALS THE * EXPONENT OF THE AUGEND. RELOC LDA B 0,X COPY MANTISSA INTO 00,01,02 STA B 00 LDA B 1,X STA B 01 LDA B 2,X STA B 02 ADJ2 LSR 0000 SHIFT MANTISSA TO RIGHT AND ROR 0001 ...INCREASE EXPONENT ROR 0002 INC A A CONTAINS EXP.OF ADDEND CMP A 06 COMPARE WITH EXP.OF AUGEND BNE ADJ2 LDX #0000 LOAD X REG.WITH ADDR. RTS ...OF RELOCATED ADDEND. SPC 1 * SUBROUTINE 'COMPL' FORMS THE 2'S COMPLEMENT OF * THE 3-BYTE WORD IN LOCATIONS 03,04 AND 05 COMPL CLR A SUB A 05 STA A 05 LDA A #00 SBC A 04 STA A 04 LDA A #00 SBC A 03 STA A 03 RTS SPC 1 * SUBROUTINE 'ADD1' ADDS THE MANTISSA OF THE ADDEND * AT THE ADDRESS SPECIFIED BY THE INDEX REGISTER TO * THAT OF THE AUGEND IN LOCATIONS 03,04,05 AND * STORES THE RESULT IN 03,04,05 ADD1 LDA A 05 ADD A 2,X STA A 05 LDA A 04 ADC A 1,X STA A 04 LDA A 03 ADC A 0,X STA A 03 RTS SPC 1 * SUBROUTINE 'SUB1' SUBTRACTS THE MANTISSA OF THE * SUBTRAHEND AT THE ADDRESS SPECIFIED BY THE INDEX * REGISTER FROM THAT OF THE MINUEND IN LOCATIONS * 03,04,05 AND STORES THE RESULT IN 03,04,05 SUB1 LDA A 05 SUB A 2,X STA A 05 LDA A 04 SBC A 1,X STA A 04 LDA A 03 SBC A 0,X STA A 03 RTS SPC 1 * SUBROUTINE 'MOVE' TRANSFERS THE THREE BYTES AT * LOCATIONS 00,01,02 TO LOCATIONS 03,04,05 MOVE LDA A 00 STA A 03 LDA A 01 STA A 04 LDA A 02 STA A 05 RTS SPC 1 * MULTIPLICATION ROUTINE. MULT * ---------------------- * THE MULTIPLICAND AT LOCATIONS 03 TO 07 IS * MULTIPLIED BY THE MULTIPLIER,THE ADDRESS OF WHICH * IS SPECIFIED BY THE INDEX REGISTER. SPC 1 MULT LDA A 4,X TEST SIGN OF MULTIPLIER BPL MULTP COM FLAG CHANGE SIGN MULTP JSR ZTST TEST IF MULTIPLICAND=0 CLR B STA B 00 CLEAR 00,01,02 STA B 01 STA B 02 LDA B #24 B CONTAINS SHIFT COUNT LSR 0003 SHIFT MANTISSA OF MULTIPLICAND ROR 0004 ...TO RIGHT ONE BIT WITH ROR 0005 ...L.S.BIT INTO CARRY M1 BCC SHFT CARRY=1? LDA A 2,X YES: ADD MANTISSA OF ADD A 02 ...MULTIPLIER TO FORM PARTIAL STA A 02 ...RESULT. LDA A 1,X ADC A 01 STA A 01 LDA A 0,X ADC A 00 STA A 00 SHFT ROR 0000 NO: SHIFT MANTISSA OF PARTIAL ROR 0001 ...RESULT AND MULTIPLICAND ROR 0002 ...TO RIGHT ONE BIT. ROR 0003  ROR 0004 ROR 0005 DEC B CONTINUE UNTIL SHIFT COUNT=0 BNE M1 LDA A 3,X ADD A 06 ADD EXPONENTS BVS Z1 CHECK FOR 2'S COMPL.OVERFLOW STA A 06 LDA A 00 TEST IF RESULT IS NORMALISED BMI M2 ROL 0003 ROTATE LEFT TO NORMALISE ROL 0002 ROL 0001 ROL 0000 DEC 0006 BVS Z1 CHECK FOR 2'S COMPL.OVERFLOW M2 JSR MOVE TRANSFER MANTISSA OF RESULT LDA9  A 03 ...TO LOCATIONS 03,04,05 BEQ Z1 CHECK IF RESULT=0 RTS SPC 1 * SUBROUTINE 'ZTST' TESTS IF THE FIRST OPERAND=0 * IN WHICH CASE THE OPERATION (MULTIPLICATION, * DIVISION,OR SQUARE ROOT),IS BYPASSED AND THE * RESULT IS LEFT AS ZERO ZTST LDA A 03 BNE R1 INS INS R1 RTS SPC 1 Z1 JMP ZERO SPC 1 * DIVISION ROUTINE. DIV * ---------------- * THE DIVIDEND AT LOCATIONS 03 TO 07 IS DIVIDED BY * THE DIVISOR,THE ADDRESS OF WHICH IS SPECIFIED BY * THE INDEX REGISTER. SPC 1 DIV LDA A 4,X TEST SIGN OF DIVIDEND BPL DIVP COM FLAG CHANGE SIGN DIVP JSR ZTST TEST IF DIVIDEND=0 CLR B STA B 00 CLEAR 00,01,02 STA B 01 STA B 02 LDA B #25 B CONTAINS SHIFT COUNT COMP JSR SUB1 DIVIDEND>DIVISOR? BCC SHFT1 YES: SHIFT A"1"INTO QUOTIENT JSR ADD1 NO: ADD BACK DIVISOR AND CLC ...SHIFT A"0"INTO QUOTIENT BRA SHFT0 SHFT1 SEC SHFT0 ROL 0002 ROL 0001 ROL 0000 DEC B SHIFT COUNT=0? BEQ TC YES:DIV.OF MANTISSAS COMFLETE ASL 0005 NO:CONTINUE DIVISION ROL 0004 ROL 0003 BCC COMP CARRY SET?NO:COMPARE OPERANDS JSR SUB1 YES:SUBTRACT AND SHIFT A "1" BRA SHFT1 ...INTO QUOTIENT TC BCC SBEXP ROR 0000 ROR 0001 ROR 0002 INC 0006 SBEXP LDA A 06 SUB A 3,X SUBTRACT EXPONENTS BVS Z1 CHECK FOR 2'S COMPL.OVERFLOW STA A 06 JSR MOVE TRANSFER MANTISSA OF RESULT RTS ...TO LOCATIONS 03,04,05 SPC 1 * SUBROUTINE 'GET' TRANSFERS 4 BYTES OF DATA FROM * LOCATIONS SPECIFIED BY THE INDEX REGISTER,TO * LOCATIONS 03,04,05,06. GET LDA A 0,X STA A 03 LDA A 1,X STA A 04 LDA A 2,X STA A 05 LDA A 3,X STA A 06 RTS SPC 1 * SUBROUTINE 'SAVE' TRANSFERS 4 BYTES OF DATA * FROM LOCATIONS 03,04,05,06 TO LOCATIONS SPECIFIED * BY THE INDEX REGISTER. SAVE LDA A 03 STA A 0,X LDA A 04 STA A 1,X LDA A 05 STA A 2,X LDA A 06 STA A 3,X RTS SPC 1 * SQUARE ROOT ROUTINE. SQRT * ------------------- * THE SQUARE ROOT OF THE NUMBER IN LOACTIONS 03 TO * 06 IS COMPUTED USING THE NEWTON-RAPHSON ALGORITHM. * THE RESULT OVERWRITES THE INPUT IN 03,04,05,06. SPC 1 SQRT JSR ZTST TEST IF NUMBER=0 LDX #NUM STORE NUMBER JSR SAVE LDX #ANS1 JSR SAVE ASR ANS1+3 HALVE EXP.--INITIAL ESTIMATE SQ1 JSR DIVP CALCULATE NEXT ESTIMATE JSR ADDP DEC 0006 LDX #ANS2 ...AND STORE IN ANS2 JSR SAVE LDX #ANS1 JSR SUBP SUBTRACT PREVIOUS ESTIMATE CLR FLAG LDA B 06 LDX #ANS2 JSR GET CMP B #$EC COMPARE EXP.OF DIFF.BETW.TWO BGT ITER ...SUCCESSIVE ESTIMATES  RTS CONTINUE ITERATION UNTIL THIS ITER LDX #ANS1 DIFF.IS SUFFICIENTLY SMALL JSR SAVE LDX #NUM JSR GET LDX #ANS2 BRA SQ1 SPC 1 * SINE ROUTINE. SIN * ------------ * THE SINE OF THE ANGLE (IN RADIANS) IN LOCATIONS 03 * TO 07 IS CALCULATED USING 6 TERMS OF THE TAYLOR * SERIES. THE RESULT OVERWRITES THE INPUT IN 03 -07 SPC 1 SIN LDA A FLAG STORE SIGN STA A FLAG1 CLR FLAG LDX #K2P SUBTRACT 2*PI REPEATEDLY SIN1 JSR SUBP ...UNTIL X<2*PI LDA A FLAG BEQ SIN1 JSR ADDP LDX #K90 DETERMINE IF X007FHEX. ˆBNE…POSOV ˆTST…3,X ˆBMI…POSOV ˆLDX…#BA+3ƒSETXRTOADDROFPOSOFF ˆCLRAŒCLEARFLAG ˆRTS * ********* *NEGATIVE ********* * NEG…LDAA„X‡THISROUTINETESTSRESULTFOR ˆCMPA„#$FF„VALUE P *OUTPUTS:[SEEDESCRIPTION] *CALLS:BADDR2,OUTEEE *REGSUSED:A,B,XR;BA,EA *DESCRIPTION:OUTPUTSMEMORYBLOCK(BATOEA) *ŒINBINARYFORMAT.DUMPIS *ŒSTARTEDBYTYPINGGAFTER *ŒBAANDEAHASBEENENTERED. *ŒRETURNSTOMONTR4AFTERDUMP. BIDUMP‚JSR…BADDR2 ˆJSR…CRLF BD1…JSR…INEEE ˆCMPA„#'G…STARTDUMPIFAIS"G" ˆBNE…BD1 ˆLDAB„#$10 BD2…LDAA„#0†OUTPUTHEADER(16ZEROS) ˆBSR…OUTE ˆDECB ˆBNE…BD2 * ˆLDAA„#'Z…LOADSTARTCHARACTOR ˆBSR…OUTE„OUTPUTSTARTCHARACTOR * ˆLDX…#BA…THISROUTINEOUTPUTS(BA&EA) ˆLDAA„X‡ADDRESSES. ˆBSR…OUTE ˆLDAA„1,X ˆBSR…OUTE ˆLDAA„2,X ˆBSR…OUTE ˆLDAA„3,X ˆBSR…OUTE * ˆLDX…BA NEXT7ƒLDAA„X‡THISROUTINEOUTPUTSBINARY ˆBSR…OUTE„DATATOTERMINAL. ˆCPX…EA ˆBEQ…STOP ˆINX ˆBRA…NEXT7 STOP„JMP…MONTR4 OUTE„JMP…OUTEEE * ************** *BINARYLOADER ************** *FUNCTIONS:BINARY,BILOAD,SAVE,INEE, *ŠDEL1,DE1,OUT *INPUTS:BDTODUMP. *‡BLTOLOAD. *‡BINARYTAPESFORMATEDBYBIDUMP. *OUTPUTS:NONE *CALLS:INEEE,IOUT2,DE,DEL *REGSUSED:A,B,XR;BA,EA,XTEMP *DESCRIPTION:LOADSBINARYFORMATEDDATA. *ŒTAPESUSINGTHISLOADER *ŒMUSTBEDUMPEDBYTHEBIDUMP *ŒROUTINEINMONTR4. * BINARY‚JSR…INEEE ˆCMPA„#'D ˆBEQ…BIDUMP ˆJSR…CRLF BILOAD‚BSR…INEE ˆCMPA„#'Z…FINDSTARTCHARACTOR ˆBNE…BILOAD ˆLDX…#BA…SETXRTOINPUTADDRESSES ˆLDAB„#$4…SETBYTECOUNTERTO4 BIL2„BEQ…BIL1„STARTDATALOADIFADDRESSES ˆBSR…INEE„ARELOADED. ˆSTAA„X ˆINXINCREMENTADDRESSPOINTER ˆDECB ˆBRA…BIL2 BIL1„LDX…BA * NEXT8ƒBSR…INEE„INPUTANDLOADDATA ˆSTAA„X ˆCPX…EA ˆBEQ…STOP2 ˆINX ˆBRA…NEXT8 STOP2ƒJMP…MONTR4 * SAV…STX…XTEMP ˆLDX…#$8004 ˆRTS * INEE„PSHB ˆBSR…SAV IN1…LDAA„X ˆBMI…IN1 ˆCLR…2,X ˆBSR…DE1 ˆBSR…DEL1 ˆLDAB„#$4 ˆSTAB„2,X ˆASLB IN3…BSR…DEL1 ˆSEC ˆROL…X ˆRORA ˆDECB ˆBNE…IN3 ˆBSR…DEL1 OUT…JMP…IOUT2 DEL1„JMP…DEL DE1…JMP…DE * ******************** ******************** *PROGRAMENTRYPOINT ******************** ******************** *FUNCTIONS:MONTR4 *INPUTS:1ASCIICHRFROMTERMINAL *OUTPUTS:"?"FORILLEGALCOMMAND *CALLS:ALLMONTR4ROUTINES *REGSUSED:A,XR,SP;MONTR4ROUTINESMAY *ŠUSEALLREGESTORS. *DESCRIPTION:SELECTSSUBROUTINEINMONTR4 *ŒTOBEEXECUTED.ALOOKUP *ŒTABLESCHEMERATHERTHANA *ŒCOMPARESCHEMEISUSEDTOFIND *ŒTHECORRECTROUTINETO *ŒEXECUTE.TOEXITMONTR4 *ŒTYPEESCAPE... * MONTR4‚LDS…#STACK ˆLDX…#PROMPT ˆJSR…PDATA1 ˆJSR…INEEE ˆCMPA„#$1B„IFCHRIS(ESC) ˆBEQ…RTN…GOTOMIKBUG ˆCMPA„#$40 ˆBLE…OHYA ˆCMPA„#$55 ˆBGE…OHYA ˆLDX…#TABLE0 ˆANDA„#$1F„DELETETOP3BITS ˆASLAŒMULTIPLYABY2 LOOP1ƒCMPA„#0 ˆBEQ…DOIT ˆINX ˆDECA ˆBRA…LOOP1 DOIT„LDX…X ˆJMP…X OHYA„LDAA„#'? ˆJSR…OUTEEE ˆBRA…MONTR4 RTN…JMP…MIKBUG * ************** *G0SUBROUTINE ************** *FUNCTIONS:GO *INPUTS:NONE *OUTPUTS:NONE *CALLS:BADDR1 *REGSUSED:XR;BA *ŠUSERROUTINEMAYUSEALLREGS. *DESCRIPTION:GOESTOSUBROUTINECALLEDBY *ŒCONTENTSOFBA.CALLEDROUTINE *ŒMUSTRTS($39)ATENDTORETURN *ŒTOMONTR4CONTROL.. * GO†JSR…BADDR1 ˆJSR…X ˆBRA…MONTR4 * ****************** *MONTR4ASCIITEXT ****************** * PROMPT‚FCB…$13,$14,$D,$A,'>,$4 P1†FCB…$20,'B,'A,'=,$4 P2†FCB…$20,'E,'A,'=,$4 P3†FCB…$20,'T,'O,$20,'B,'A,'=,$4 P4†FCB…$20,'O,'F,'S,'T,'=,$4 SF†FCB…$D,$A,'%,'S,'R,'F,$4 * ************** *PROGRAMTABLE ************** * TABLE0‚FDB…MONTR4‚RESERVED T0A…FDB…MONTR4‚RESERVED T0B…FDB…BINARY T0C…FDB…MONTR4‚RESERVED T0D…FDB…MONTR4‚RESERVED T0E…FDB…EXAM T0F…FDB…FIND T0G…FDB…GO T0H…FDB…MONTR4‚RESERVED T0I…FDB…INST T0J…FDB…MONTR4‚? RESERVED T0K…FDB…MONTR4‚RESERVED T0L…FDB…LOAD T0M…FDB…MOVE T0N…FDB…MONTR4‚RESERVED T0O…FDB…OFF T1P…FDB…PTEXT T1Q…FDB…MONTR4‚RESERVED T1R…FDB…MONTR4‚RESERVED T1S…FDB…SHFTL T1T…FDB…TEXT ˆRMB…12†RESERVE12BYTESFORU-Z TABLE1‚RMB…256…RESERVERAMFORSEARCHTABLE ˆORG…$A048 ˆFDB…MONTR4 ˆEND @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@åååååååååååååååååååå@ ååååååååååååååååååååååååååA ååååååååååååååååååååååååååB ååååååååååååååååååååååååååC ååååååååååååååååååååååååååD ååååååååååååååååååååååååååE ååååååååååååååååååååååååååF ååååååååååååååååååååååååååG ååååååååååååååååååååååååååH ååååååååååååååååååååååååååI ååååååååååååååååååååååååååJ ååååååååååååååååååååååååååK ååååååååååååååååååååååååååL åååååååååååååååååååååååååå