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&ú9�A%6‹¥29�0%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'2�4'.�8'*�9'& 320îÖç$…€'90¦æ€Âî§çÆ? ?0j'ÕæÎ‚Á&Ö–?.Y$½èu V×—½èx~9Ö–?*ÎÑ?/%éÆ†Ñ ã÷6¶Š€·29þÿÿúŽÿŠ~èþÿúŒ*' Œ'Žÿн ¾ Îfÿÿ¶Š€·Î ÿ½è"½èu½èS|½èu~ûDK9LPFCRSCP`CNmHRzr –Á€¦1€ *Q€{e€ W T Q N�S¦*"¦ª' ¦"æ!¡â$½%3l&lî æ &¦ª&¦ §¦§îç�l&l¦"æ!¡â$�E0î11n0î~†‚Œ†AÿoèÄ' æÅ 'Å' ÆŒÆ ç9Ä?„À§�Äþæ ë¦"æ!  â' Æ ŒÆŒÆ ç 9�&ð†€¥' ¦æ â+æ¦æ�ÿÂÿ+Ùæ â&æ +ÍÄ|Ë$~)æ ¶6¶6î?240?31111½ö¶ç§†þ6L6î¦*5�i¦+`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†7�F� $9�ц § 1Îÿ ' ¶üôG$÷öüõÄ 9 9†W· )}ÿ*�†7 ¶üý„_·üô†� 0î11n†~ù϶üý„?·üô†½ð}ÿ&�¯�­ ÛW~ K~ e~ ‚~ ‚�~˜Á & }ÿ*Î]À &ý9� µ|ÿb}ÿ*�²†0�°†�¬† ¨†�¤ÿb}ÿ*“�˜†9½ðÆO��Z&û ‚�ËÆ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~Æ6�26� §2�§9DDDD„‹0�9#‹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¦�*'.�.'*½W�J't�C'f�L'_ÿ€½^�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 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ (€ 0B�COMMAND�SYNTAX�ERROR 05�NAME�REQUIRED 06�\0�DOES�NOT�EXIST 08�\0�DUPLICATE�FILE�NAME 1B�FILE�NAME�NOT�FOUND 1A�DUPLICATE�FILE�NAME 0D�OPTION�CONFLICT 30�CHAIN�ABORTED�--�BREAK�KEY 31�CHAIN�ABORTED�--�SYSTEM�ERROR�STATUS�WORD 1C�FILE�IS�DELETE�PROTECTED 24�DEVICE�NOT�READY�AT�\8 0E�INVALID�TYPE�OF�OBJECT�FILE 0F�INVALID�LOAD�ADDRESS 13�INVALID�FILE�TYPE 1E�CONFLICTING�FILE�TYPES 1F�\0�HAS�INVALID�FILE�TYPE 27�INVALID�DATA�TRANSFER�TYPE�AT�\8 22�DEVICE�ALREADY�RESERVED�AT�\8 23�DEVICE�NOT�RESERVED�AT�\8 25�FILE�NOT�OPEN�OR�ALREADY�OPEN�AT�\8 26�END�OF�FILE�AT�\8 29�BUFFER�OVERFLOW�AT�\8 2A�CHECKSUM�ERROR�AT�\8 15�LOGICAL�SECTOR�NUMBER�OUT�OF�RANGE 07�ILLEGAL�FILE�NAME 2B�FILE�IS�WRITE�PROTECTED�AT�\8 20�\0�IS�WRITE�PROTECTED 09�NO�SUCH�DEVICE 04�ILLEGAL�DRIVE�NUMBER 12�INVALID�EXECUTION�ADDRESS 0A�INVALID�DEVICE 11�INVALID�RIB 1D�TOO�MANY�SOURCE�FILES 16�ILLEGAL�START/END�SPECIFICATIONS 17�ILLEGAL�PAGE�FORMAT 14�FILE�EXHAUSTED�BEFORE�LINE�FOUND 28�END�OF�MEDIA�AT�\8 18�ILLEGAL�LINE�NUMBER�OR�RANGE 19�LINE�NUMBER�ENTERED�BEFORE�SOURCE�FILE 02�DIRECTORY�SPACE�FULL 03�DISK�SPACE�FULL 10�NOT�ENOUGH�SEGMENT�DESCRIPTOR�SPACE 2C�INVALID�DIRECTORY�ENTRY�NO.�AT�\8 2D�CANNOT�DE-ALLOCATE�ALL�SPACE-DIRECTORY�ENTRY�EXISTS�AT�\8 2E�RECORD�LENGTH�TOO�LONG�AT�\8 0C�INTERNAL�SYSTEM�ERROR�AT�\8 21�INVALID�SCALL 2F�CHAIN�OVERLAY�CANNOT�BE�FOUND�OR�LOADED 32�CHAIN�ABORTED�--�ILLEGAL�OPERATOR 33�CHAIN�ABORTED�--�UNDEFINED�LABEL 34�CHAIN�ABORTED�--�PREMATURE�END�OF�FILE @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ,€ 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#�C�a½/þ–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|�@¯�?* *�SPECIAL�OPTION�--�TURN�OFF�THE�LISTING * �OPT�NOLIST �PAGE * *�MDOS�VERSION�2.0�--�SYSTEM�EQUATE�FILE�--�MARCH�9,1977 * �SPC�3 * *DEFINE�MULTI-SECTOR/SINGLE�SECTOR�I/O * MULTS�EQU�0�.�0�=>�SINGLE�SECTOR,�1�=>�MULTIPLE�SECTOR �SPC�3 * *�S�K�I�P�2…M�A�C�R�O * *�THE�GENERATED�BYTE�IS�A�"COMPARE�INDEX�IMMEDIATE". *�THE�EXECUTION�OF�THE�BYTE�WILL�CHANGE�THE�CONDITION�CODES�ONLY.� *�NO�REGISTERS�ARE�AFFECTED.‚THUS,�A�ONE�BYTE�INSTRUCTION *�IS�FORMED�THAT�SKIPS�FORWARD�TWO�BYTES. * SKIP2�MACR �FCB�$8C�. �ENDM * *�S�K�I�P�1…M�A�C�R�O * *�THE�SAME�CONCEPT�AS�THE�"SKIP2"�MACRO�IS�USED,�EXCEPT�THAT *�A�"BIT�TEST�ACCUMULATOR�A�IMMEDIATE"�OP�CODE�IS�GENERATED. * SKIP1�MACR �FCB�$85 �ENDM * *�S�C�A�L�L…M�A�C�R�O„(SYSTEM�FUNCTION�CALL) * SCALL�MACR �IFEQ�NARG-1 �SWI �FCB�\0!.%01111111 �ENDC * �IFNE�NARG-1 �FAIL�*�UNDEFINED�SWI�CALL�ARGUMENT�* �ENDC �ENDM * *�U�C�A�L�L…M�A�C�R�O„(USER�FUNCTION�CALL) * UCALL�MACR �IFEQ�NARG-1 �SWI �FCB�\0!+%10000000 �ENDC * �IFNE�NARG-1 �SCALL �ENDC �ENDM * *�S�E�Q…M�A�C�R�O†(NUMBERING�SEQUENTIAL�EQUATES) * SEQ�MACR �IFNE�NARG \0�EQU�*�. �ENDC �ORG�*+1�. �ENDM �PAGE * *�S�Y�S�T�E�M…F�U�N�C�T�I�O�N…D�E�F�I�N�I�T�I�O�N�S * * *�SET�LOCATION�COUNT�TO�0�FOR�THE�EQUATE�DEFINITIONS * .$SAV�SET�*�.�SAVE�OLD�LOCATION�COUNT �ORG�$0�. * * * �SEQ�.RESRV�.�RESERVE�A�DEVICE �SEQ�.RELES�.�RELEASE�A�DEVICE �SEQ�.OPEN�.�OPEN�A�FILE �SEQ�.CLOSE�.�CLOSE�A�FILE �SEQ�.GETRC�.�READ�A�RECORD �SEQ�.PUTRC�.�WRITE�A�RECORD �SEQ�.REWND�.�POSITION�TO�BEGINNING�OF�FILE �SEQ�.GETLS�.�READ�LOGICAL�SECTOR �SEQ�.PUTLS�.�WRITE�LOGICAL�SECTOR �SEQ�.KEYIN�.�CONSOLE�INPUT �SEQ�.DSPLY�.�CONSOLE�OUTPUT�(TERM�W/�CR) �SEQ�.DSPLX�.�CONSOLE�OUTPUT�(TERM�W/�EOT) �SEQ�.DSPLZ�.�CONSOLE�OUTPUT�(TERM�W/�EOT,�NO�CR/LF�AT�END) �SEQ�.CKBRK�.�CHECK�CONSOLE�FOR�BREAK�KEY �SEQ�.DREAD�.�EROM�DISK�READ �SEQ�.DWRIT�.�EROM�DISK�WRITE �SEQ�.MOVE�.�MOVE�A�STRING �SEQ�.CMPAR�.�COMPARE�STRINGS �SEQ�.STCHB�.�STORE�BLANKS �SEQ�.STCHR�.�STORE�CHARACTERS �SEQ�.ALPHA�.�CHECK�ALPHABETIC�CHARACTER �SEQ�.NUMD�.�CHECK�DECIMAL�DIGIT �SEQ�.ADDAM�.�INCREMENT�MEMORY�(DOUBLE�BYTE)�BY�A �SEQ�.SUBAM�.�DECREMENT�MEMORY�(DOUBLE�BYTE)�BY�A �SEQ�.MMA�.�MULTIPLY�(SHIFT�LEFT)�MEMORY�BY�A�(COUNT) �SEQ�.DMA�.�DIVIDE�(SHIFT�RIGHT)�MEMORY�BY�A�(COUNT) �SEQ�.MDENT�.�ENTER�MDOS�WITHOUT�RELOADING �SEQ�.LOAD�.�LOAD�A�FILE�FROM�DISK �SEQ�.DIRSM�.�DIRECTORY�SEARCH�AND�MODIFY �SEQ�.PFNAM�.�PROCESS�FILE�NAME �SEQ�.ALUSM�.�ALLOCATE�USER�MEMORY �SEQ�.CHANG�.�CHANGE�NAME/ATTRIBUTES �SEQ�.MDERR�.�MDOS�ERROR�MESSAGE�HANDLER �SEQ�.ALLOC�.�ALLOCATE�DISK�SPACE �SEQ�.DEALC�.�RETURN�DISK�SPACE �SEQ�.EWORD�.�SET�ERROR�STATUS�WORD�FOR�CHAIN �SEQ�.TXBA�.�TRANSFER�X�TO�B,A �SEQ�.TBAX�.�TRANSFER�B,A�TO�X �SEQ�.XBAX�.�EXCHANGE�B,A�AND�X �SEQ�.ADBX�.�ADD�B�TO�X �SEQ�.ADAX�.�ADD�A�TO�X �SEQ�.ADBAX�.�ADD�B,A�TO�X �SEQ�.ADXBA�.�ADD�X�TO�B,A �SEQ�.SUBX�.�SUBTRACT�B�FROM�X �SEQ�.SUAX�.�SUBTRACT�A�FROM�X �SEQ�.SUBAX�.�SUBTRACT�B,A�FROM�X �SEQ�.SUXBA�.�SUBTRACT�X�FROM�B,A �SEQ�.CPBAX�.�CO MPARE�B,A�TO�X �SEQ�.ASRX�.�SHIFT�X�RIGHT�(ARITHMETIC) �SEQ�.ASLX�.�SHIFT�X�LEFT�(ARITHMETIC/LOGICAL) �SEQ�.PSHX�.�PUSH�X�ON�STACK �SEQ�.PULX�.�PULL�X�FROM�STACK �SEQ�.PRINT�.�PRINT-TERMINATE�WITH�CR �SEQ�.PRINX�.�PRINT-TERMINATE�WITH�EOT �SEQ�.GETFD�.�READ�FDR �SEQ�.PUTFD�.�WRITE�FDR �SEQ�.PUTEF�.�WRITE�EOF �SEQ�.EREAD�.�DISK�READ�W/�ERR�RETN �SEQ�.EWRIT�.�DISK�WRITE�W/�ERR�RETN �IFNE�MULTS �SEQ�.MREAD�.�MULTIPLE�SECTOR�READ �SEQ�.MWRIT�.�MULTIPLE�SECTOR�WRITE �SEQ�.MERED�.�MULTIPLE�SECTOR�READ�W/�ERR�RETURN �SEQ�.MEWRT�.�MULTIPLE�SECTOR�WRITE�W/�ERR�RETURN �ENDC �IFEQ�MULTS �SEQ �SEQ �SEQ �SEQ �ENDC �SEQ�.BOOT�.�RELOAD�MDOS * �ORG�.$SAV�.�RESTORE�LOCATION�COUNTER �PAGE * *�A�S�C�I�I…C�O�N�T�R�O�L…C�H�A�R�A�C�A�T�E�R�S * NULL�EQU�0�.�NULL SOH�EQU�1�.�START�OF�HEADING STX�EQU�2�.�START�OF�TEXT ETX�EQU�3�.�END�OF�TEXT EOT�EQU�4�.�END�OF�TRANSMISSION� ENQ�EQU�5�.�ENQUIRY�(WRU�-�WHO�ARE�YOU) ACK�EQU�6�.�ACKNOWLEDGE BEL�EQU�7�.�BELL BS�EQU�8�.�BACKSPACE HT�EQU�9�.�HORIZONTAL�TAB LF�EQU�$A�.�LINE�FEED VT�EQU�$B�.�VERTICAL�TAB FF�EQU�$C�.�FORM�FEED CR�EQU�$D�.�CARRIAGE�RETURN SO�EQU�$E�.�SHIFT�OUT SI�EQU�$F�.�SHIFT�IN DLE�EQU�$10�.�DATA�LINK�ESCAPE DC1�EQU�$11�.�DEVICE�CONTROL�1 DC2�EQU�$12�.�DEVICE�CONTROL�2 DC3�EQU�$13�.�DEVICE�CONTROL�4 DC4�EQU�$14�.�DEVICE�CONTROL�4 NAK�EQU�$15�.�NEGATIVE�ACKNOWLEDGE SYN�EQU�$16�.�SYNCHRONOUS�IDLE ETB�EQU�$17�.�END�OF�TRANSMISSION�BLOCK CAN�EQU�$18�.�CANCEL EM�EQU�$19�.�END�OF�MEDIUM SUB�EQU�$1A�.�SUBSTITUTE� ESC�EQU�$1B�.�ESCAPE FS�EQU�$1C�.�FILE�SEPARATOR GS�EQU�$1D�.�GROUP�SEPARATOR RS�EQU�$1E�.�RECORD�SEPARATOR US�EQU�$1F�.�UNIT�SEPARATOR SPACE�EQU�$20�.�SPACE�(WORD�SEPARATOR) RUBOUT�EQU�$7F�.�DELETE�(RUB�OUT) * *�S�P�E�C�I�A�L…C�H�A�R�A�C�T�E�R…E�Q�U�A�T�E�S * SUFDLM�EQU�'.�.�SUFFIX�DELIMETER OPTDLM�EQU�';�.�OPTIONS�DELIMETER DRVDLM�EQU�':�.�LOGICAL�DRIVER�DELIMETER DEVDLM�EQU�'#�.�GENERIC�DEVICE�NAME�DELIMETER FAMDLM�EQU�'*�.�FAMILY�NAME/SUFFIX�DELIMETER E$FATL�EQU�1!<7�.�FATAL�ERROR�BIT �PAGE * *�M�D�O�S…S�E�C�T�O�R…E�Q�U�A�T�E�S * SC$DID�EQU�0�.�DISK�ID�PHYSICAL�SECTOR�NUMBER SC$CAT�EQU�1�.�CLUSTER�ALLOCATION�TABLE�PHSYICAL�SECTOR�NUMBER SC$LOK�EQU�2�.�LOCKOUT�CLUSTER�TABLE�PHYSICAL�SECTOR�NUMBER SC$DIR�EQU�3�.�DIRECTORY�START�PHYSICAL�SECTOR�NUMBER SC$DRE�EQU�$16�.�DIRECTORY�END�PHYSICAL�SECTOR�NUMBER SC$BB�EQU�$17�.�BOOT�BLOCK�PHYSICAL�SECTOR�NUMBER SC$DOS�EQU�$18�.�OPERATING�SYSTEM�PHSYICAL�SECTOR�NUMBER�(RIB�ADDRESS) SC$SIZ�EQU�128�.�SECTOR�SIZE�IN�BYTES SC$TRK�EQU�26�.�NUMBER�OF�SECTORS�/�TRACK SC$CLS�EQU�4�.�NUMBER�OF�SECTORS�/�CLUSTER SC$MAX�EQU�2000�.�MAXIMUM�NO.�OF�USABLE�SECTORS DFCLS$�EQU�32�.�DEFAULT�NO.�OF�CLUSTERS * *�D�I�S�K„I�D…S�E�C�T�O�R…O�F�F�S�E�T�S * DID$ID�EQU�0�.�OFFSET�TO�DISK�ID�(8�BYTES) DID$VN�EQU�8�.�OFFSET�TO�VERSION�NUMBER�(2�BYTES) DID$RN�EQU�10�.�OFFSET�TO�REVISION�NUMBER�(2�BYTES) DID$DT�EQU�12�.�OFFSET�TO�DATE�(6�BYTES) DID$NM�EQU�18�.�OFFSET�TO�USER�NAME�(20�BYTES) DID$RB�EQU�38�.�OFFSET�TO�RIB�ADDRS.�(20�BYTES) * *�D�I�R�E�C�T�O�R�Y…E�N�T�R�Y†O�F�F�S�E�T�S * DIR$NM�EQU�0�.�OFFSET�TO�NAME�(8�BYTES) DIR$SX�EQU�8�.�OFFSET�TO�SUFFIX�(2�BYTES) DIR$RB�EQU�10�.�OFFSET�TO�RIB�ADDRESS�(2�BYTES) DIR$AT�EQU�12�.�OFFSET�OF�ATTRIBUTES�(2�BYTES) DIR$NU�EQU�14�.�OFFSET�TO�NOT�USED�AREA�(2�BYTES) * *�R�.�I�.�B�.…B�I�N�A�R�Y…F�I�L�E…O�F�F�S�E�T�S * RIB$LB�EQU�117�.�NUMBER�OF�BYTES�IN�LAST�SECTOR RIB$SL�EQU�118 �.�NUMBER�OF�SECTORS�TO�LOAD� RIB$LA�EQU�120�.�MEMORY�LOAD�ADDRESS RIB$SA�EQU�122�.�START�EXECUTION�ADDRESS RIB$OT�EQU�124�.�OVERLAY�TABLE�POINTER RIB$SZ�EQU�126�.�SIZE�OF�PROGRAM�AREA �PAGE * *�U�N�I�F�I�E�D…I�/�O†C�O�N�T�R�O�L…B�L�O�C�K† * *•O�F�F�S�E�T�S * * IOCSTA�EQU�0�.�ERROR�STATUS IOCDTT�EQU�1�.�DATA�TRANSFER�TYPE IOCDBP�EQU�2�.�DATA�BUFFER�POINTER IOCDBS�EQU�4�.�DATA�BUFFER�START�ADDRESS IOCDBE�EQU�6�.�DATA�BUFFER�END�ADDRESS IOCGDW�EQU�8�.�GENERIC�DEVICE�TYPE/CONTROL�DESCRIPTOR�ADDRESS IOCLUN�EQU�10�.�LOGICAL�UNIT�NUMBER IOCNAM�EQU�11�.�FILE�NAME IOCMLS�EQU�11�.�MAXIMUM�REFERENCED�LOGICAL�SECTOR�NUMBER IOCSDW�EQU�13�.�CURRENT�SEGMENT�DESCRIPTOR�WORD IOCSLS�EQU�15�.�1ST�LOGICAL�SECTOR�OF�CURRENT�SEGMENT IOCLSN�EQU�17�.�CURRENT�LOGICAL�SECTOR�NUMBER IOCSUF�EQU�19�.�FILE�NAME�SUFFIX IOCEOF�EQU�19�.�LOGICAL�END�OF�FILE IOCRIB�EQU�21�.�PHYSICAL�DISK�ADDRESS�OF�R.I.B. IOCFDF�EQU�23�.�FILE�DESCRIPTOR�FLAGS IOCDEN�EQU�27�.�DIRECTORY�ENTRY�NUMBER IOCSBP�EQU�29�.�SECTOR�BUFFER�POINTER/INITIAL�ALLOCATION IOCSBS�EQU�31�.�SECTOR�BUFFER�START�ADDRESS IOCSBE�EQU�33�.�SECTOR�BUFFER�END�ADDRESS IOCSBI�EQU�35�.�SECTOR�BUFFER�INTERNAL�PTR IOCBLN�EQU�IOCSBI+2-IOCSTA�.�IOCB�LENGTH * *�U�N�I�F�I�E�D…I�/�O…E�R�R�O�R…S�T�A�T�U�S�E�S * .$SAV�SET�*�.�REMEMBER�THE�CURRENT�LOCATION�COUNTER �ORG�$0�.�RESET�IT�TO�ZERO�TO�USE�THE�SEQ�MACRO * �SEQ�I$NOER�.�NO�ERRORS,�NORMAL�RETURN �SEQ�I$NODV�.�NO�SUCH�DEVICE �SEQ�I$RESV�.�DEVICE�RESERVED�ALREADY �SEQ�I$NORV�.�DEVICE�NOT�RESERVED �SEQ�I$NRDY�.�DEVICE�NOT�READY �SEQ�I$IVDV�.�INVALID�DEVICE� �SEQ�I$DUPE�.�DUPLICATE�FILE�NAME �SEQ�I$NONM�.�FILE�NAME�NOT�FOUND �SEQ�I$CLOS�.�FILE�NAME�NOT�OPEN/OR�FILE�NOT�CLOSED �SEQ�I$EOF�.�END�OF�FILE �SEQ�I$FTYP�.�INVALID�FILE�TYPE �SEQ�I$DTYP�.�INVALID�DATA�TRANSFER�TYPE �SEQ�I$EOM�.�END�OF�MEDIA �SEQ�I$BUFO�.�BUFFER�OVERFLOW �SEQ�I$CKSM�.�CHECKSUM�ERROR �SEQ�I$WRIT�.�FILE�IS�WRITE�PROTECTED �SEQ�I$DELT�.�FILE�IS�DELETE�PROTECTED �SEQ�I$RANG�.�LOGICAL�SECTOR�NUMBER�OUT�OF�RANGE �SEQ�I$FSPC�.�NO�DISK�FILE�SPACE�AVAILABLE �SEQ�I$DSPC�.�NO�DIRECTORY�SPACE�AVAILABLE �SEQ�I$SSPC�.�NO�SEGMENT�DESCRIPTOR�SPACE�AVAILABLE �SEQ�I$IDEN�.�INVALID�DIR.�ENTRY�NO. �SEQ�I$RIB�.�INVALID�RIB �SEQ�I$DEAL�.�CAN'T�DEALLOCATE�ALL�SPACE �SEQ�I$RECL�.�BINARY�RECORD�LENGTH�TOO�LRGE * �ORG�.$SAV�.�RESTORE�THE�LOCATION�COUNTER * �PAGE * *�M�D�O�S…I�N�T�E�R�N�A�L†V�A�R�I�A�B�L�E * *‡A�N�D†L�O�C�A�T�I�O�N†E�Q�U�A�T�E�S * MDOS$�EQU�$100�.�START�OF�MDOS�ASECT CBUFL$�EQU�80�.�COMMAND�BUFFER�LENGTH CBUFF$�EQU�MDOS$-CBUFL$-2�.�COMMAND�BUFFER�LOCATION CBUFP$�EQU�CBUFF$+CBUFL$�.�COMMAND�BUFFER�SCAN�POINTER VERS$$�EQU�MDOS$�.�VERSION�# REVS$$�EQU�VERS$$+2�.�REVISION�# KYI$SV�EQU�REVS$$+2�.�SAVE�AREA�FOR�KEYIN$�VECTOR ENDOS$�EQU�KYI$SV+2�.�END�OF�MDOS ENDUS$�EQU�ENDOS$+2�.�END�OF�USER�PROGRAM�AREA ENDSY$�EQU�ENDUS$+2�.�END�OF�SYSTEM�(MDOS)�RAM RIBBA$�EQU�ENDSY$+4�.�RIB�BUFFER�ADDRESS ENDRV$�EQU�RIBBA$+2�.�END�OF�MDOS�ROM�VARIABLES GDBA$�EQU�ENDRV$+2�.�GENERIC�DEVICE�TABLE�ADDRESS SYERR$�EQU�GDBA$+2�.�SYSTEM�ERROR�STATUS�WORD SWI$SV�EQU�SYERR$+2�.�SWI�VECTOR�SAVE�AREA SWI$UV�EQU�SWI$SV+2�.�SWI�USER�VECTOR IRQ$UV�EQU�SWI$UV+2�.�IRQ�USER�VECTOR IRQ$SV�EQU�IRQ$UV+2�.�IRQ�VECTOR�SAVE�AREA CHFLG$�EQU�IRQ$SV+2�.�CHAIN�FUNCTION�FLAG�WORD SYIOCB�EQU�CHFLG$+2�.�SYSTEM�CONSOLE‚IOCB SYPOCB�EQU�SYIOCB+IOCBLN�.�SYSTEM�PRINTER�IOCB SYEOCB�EQU�SYPOCB+IOCBLN�.� ERR�MSG�FILE �PAGE * *L�O�G�I�C�A�LƒU�N�I�TƒN�U�M�B�E�R�-�-�B�I�TƒD�E�F�I�N�I�T�I�O�N� * LU$RES�EQU�%01000000�.�IOCB�RESERVED�FLAG * *�I�O�C�D�T�T„--…B�I�T…D�E�F�I�N�I�T�I�O�N�S * DT$OPP�EQU�%00000000�.�OPEN�UPDATE/INPUT DT$OPI�EQU�%00000001�.�OPEN�INPUT�MODE DT$OPO�EQU�%00000010�.�OPEN�OUTPUT�MODE DT$OPU�EQU�%00000011�.�OPEN�UPDATE�MODE DT$NFF�EQU�%00000100�.�NON-FILE�FORMAT�I/O�FLAG DT$TRU�EQU�%00001000�.�TRUNCATE�FLAG DT$CLS�EQU�%00010000�.�FILE�OPEN/CLOSE�FLAG DT$SIO�EQU�%00100000�.�SECTOR�I/O�FLAG DT$OUT�EQU�%01000000�.�OUTPUT�TRANSFER�TYPE DT$INP�EQU�%10000000�.�INPUT�TRANSFER�TYPE * *�I�O�C�F�D�F„--„B�I�T…D�E�F�I�N�I�T�I�O�N�S * FD$FMU�EQU�%00000000�.�USER�DEFINED�FORMAT�(SECTOR�I/O�ONLY) FD$FMD�EQU�%00000001�.�DEFAULT�OBJECT�REC'D�FORMAT�(DEVICE�DEPENDENT) FD$FML�EQU�%00000010�.�BINARY�LOAD�FORMAT�--�ABSOLUTE�MEMORY�IMAGE FD$FMB�EQU�%00000011�.�BINARY�RECORD�FORMAT�--�RASM�OUTPUT,�RLOAD�INPUT FD$FMR�EQU�%00000100�.�BINARY�LOAD�FORMAT�--�RELOCATABLE�MEMORY�IMAGE FD$FMA�EQU�%00000101�.�ASCII�RECORD�FORMAT�--�INCLUDES�EXORCISOR�LOAD�F FD$FMC�EQU�%00000111�.�ASCI-CONVERTED-BINARY�RECORD�FORMAT FD$CMP�EQU�%00001000�.�SPACE�COMPRESSION�FLAG FD$CON�EQU�%00010000�.�CONTIGUOUS�ALLOCATION�FLAG FD$SYS�EQU�%00100000�.�SYSTEM�FILE�ATTRIBUTE FD$DEL�EQU�%01000000�.�DELETE�PROTECTION�ATTRIBUTE FD$WRT�EQU�%10000000�.�WRITE�PROTECTION�ATTRIBUTE * *�U�N�I�F�I�E�D„I�/�O„C�O�N�T�R�O�L…D�E�S�C�R�I�P�T�O�R * *’B�L�O�C�K…O�F�F�S�E�T�S * CDBIOC�EQU�0�.�ADDRESS�OF�IOCB CDBSDA�EQU�2�.�SOFTWARE�DRIVER�ADDRESS CDBHAD�EQU�4�.�HARDWARE�ADDRESS CDBDDF�EQU�6�.�DEVICE�DESCRIPTOR�FLAGS CDBVDT�EQU�7�.�VALID�DATA�TYPE CDBDDA�EQU�8�.�DEVICE�DEPENDENT�AREA CDBWST�EQU�10�.�WORKING�STORAGE * *�C�D�B�D�D�F„--„B�I�T„D�E�F�I�N�I�T�I�O�N�S * DD$FMC�EQU�%00000001�.�ASCII-CONVERTED-BINARY�IS�DEFAULT�OBJECT�RECORD� DD$LOG�EQU�%00000010�.�LOGICAL�SECTOR�I/O�FLAG DD$CNS�EQU�%00000100�.�CONSOLE�FLAG DD$RWD�EQU�%00001000�.�REWIND�FLAG DD$OCF�EQU�%00010000�.�OPEN/CLOSE�FLAG DD$INP�EQU�%00100000�.�INPUT�DEVICE�FLAG DD$OUT�EQU�%01000000�.�OUTPUT�DEVICE�FLAG DD$RES�EQU�%10000000�.�RESERVABLE�DEVICE�FLAG * *�C�D�B�V�D�T„--…B�I�T„D�E�F�I�N�I�T�I�O�N�S * VD$BIN�EQU�%00000100�.�BINARY�OBJECT�FLAG VD$GDB�EQU�%00001000�.�TEMP�GDB�POINTER�FLAG VD$SDA�EQU�%00010000�.�TEMP�SDA�POINTER�FLAG VD$NFF�EQU�%10000000�.�NON-FILE�FORMAT�FLAG * *�D�E�V�I�C�E„D�R�I�V�E�R…E�N�T�R�Y„O�F�F�S�E�T�S * DV$ON�EQU�0�.�DEVICE�ON�OFFSET DV$OFF�EQU�3�.�DEVICE�OFF�OFFSET DV$INT�EQU�6�.�DEVICE�INTIALIZATION�OFFSET DV$TRM�EQU�9�.�DEVICE�TERMINATION�OFFSET DV$IO�EQU�12�.�DEVICE�CHARACTER�INPUT/OUTPUT�OFFSET �PAGE * *�D�I�S�K…E�R�O�M†E�Q�U�A�T�E�S * CURDRV�EQU�0�.�CURRENT�DRIVE�NUMBER STRSCT�EQU�1�.�STARTING�PHYSICAL�SECTOR�NUMBER NUMSCT�EQU�3�.�NUMBER�OF�SECTORS�TO�OPERATE�UPON LSCTLN�EQU�5�.�NUMBER�OF�BYTES�TO�BE�READ�FROM�LAST�SECTOR CURADR�EQU�6�.�MEMORY�ADDRESS�FOR�DISK�TRANSFER FDSTAT�EQU�8�.�DISK�TRANSFER�STATUS SCTCNT�EQU�11�.�SECTOR�COUNT�USED�IN�DETERMINING�ERRORS PGMDRV�EQU�$1D�.�DRIVE�FROM�WHICH�LAST�PROGRAM�WAS�LOADED PGMPSN�EQU�$1E�.�PHYSICAL�SECTOR�NUMBER�OF�RIB�OF�LAST�LOAD�PROGRAM * *�E�R�O�M„E�N�T�R�Y„P�O�I�N�T�S * OSLOAD�EQU�$E800�.�BOOTSTRAP�THE�OPERATING�SYSTEM FDINIT�EQU�$E822�.�INITIALIZE�THE�DISK'S�PIA�AND�SSDA CHKERR�EQU�$E853�.�CHECK�AND�PRINT�ERROR�FROM�FDSTAT PRNTER�EQU�$E85A�.�PRINT�ERROR�FROM�FDSTAT READSC�EQU�$E869�.�RE AD�SECTOR(S) READPS�EQU�$E86D�.�READ�PARTIAL�SECTOR RDCRC�EQU�$E86F�.�READ�AND�CHECK�FOR�CRC RWTEST�EQU�$E872�.�WRITE/READ�TEST RESTOR�EQU�$E875�.�MOVE�HEAD�TO�TRACK�0 SEEK�EQU�$E878�.�POSITION�HEAD�TO�TRACK�OF�"STRSCT" WRTEST�EQU�$E87B�.�WRITE�TEST WRDDAM�EQU�$E87E�.�WRITE�DELETED�DATA�MARK WRVERF�EQU�$E881�.�WRITE�AND�VERIFY�CRC WRITSC�EQU�$E884�.�WRITE�SECTOR(S) * *�E�R�O�M…E�R�R�O�R…E�Q�U�A�T�E�S * ER$CRC�EQU�'1�.�DATA�CRC�ERROR ER$WRT�EQU�'2�.�WRITE�PROTECTED�DISK ER$RDY�EQU�'3�.�DISK�NOT�READY ER$MRK�EQU�'4�.�DELETED�DATA�MARK�ENCOUNTERED ER$TIM�EQU�'5�.�TIMEOUT ER$DAD�EQU�'6�.�INVALID�DISK�ADDRESS ER$SEK�EQU�'7�.�SEEK�ERROR ER$DMA�EQU�'8�.�DATA�ADDRESS�MARK�ERROR ER$ACR�EQU�'9�.�ADDRESS�MARK�CRC�ERROR * *�M�I�S�C�E�L�L�A�N�E�O�U�S…E�R�O�M…E�Q�U�A�T�E�S * RETRY$�EQU�5�.�RETRY�COUNT�FOR�DISK�READ/WRITE�ERRORS * *�L�I�N�E„P�R�I�N�T�E�R…E�R�O�M…E�Q�U�A�T�E�S * LPINIT�EQU�$EBC0�.�INIT�PRINTER�PIA LIST�EQU�$EBCC�.�PRINT�CONTENTS�OF�'A' LDATA�EQU�$EBE4�.�PRINT�STRING,�CR/LF LDATA1�EQU�$EBF2�.�PRINT�STRING,�NO�CR/LF �PAGE * *�E�X�B�U�G…E�Q�U�A�T�E�S…F�O�R…M�D�O�S * INCHNP�EQU�$F015�.�INPUT�CHARACTER�(NO�PARITY) OUTCH�EQU�$F018�.�OUTPUT�ONE�CHARACTER PCRLF�EQU�$F021�.�PRINT�LF/CR PDATA�EQU�$F024�.�PRINT�STRING SBIT$�EQU�$FCFD�.�BIT�7�INDICATES�IRQ�OCCURRED�(IF�CLEARED) BRKPT$�EQU�$FF1F�.�MAID'S�BREAKPOINT�TABLE�(8�FDB'S) BKPIN$�EQU�$FF4F�.�EXBUG�BREAKPOINTS�IN�MEMORY�(FROM�CONTINUE�CMD) AECHO�EQU�$FF53�.�INPUT�CHARACTER�ECHO�FLAG�(0=>ECHO) IRQ$VC�EQU�$FFF8�.�IRQ�VECTOR SWI$VC�EQU�$FFFA�.�SWI�VECTOR NMI$VC�EQU�$FFFC�.�NMI�VECTOR XSTAK$�EQU�$FF8A�.�EXBUG�STACK MAID$�EQU�$F0F3�.�MAID�ENTRY�POINT XREG$P�EQU�$FF16�.�MAID�P-REG. XREG$X�EQU�$FF18�.�MAID�X-REG. XREG$A�EQU�$FF1A�.�MAID�A-REG. XREG$B�EQU�$FF1B�.�MAID�B-REG. XREG$C�EQU�$FF1C�.�MAID�C-REG. XREG$S�EQU�$FF1D�.�MAID�S-REG. BRKPE$�EQU�$FF63�.�END�OF�MAID�BREAKPOINT�TABLE CNACI$�EQU�$FCF4�.�CONSOLE�ACIA * *�SPECIAL�MACRO�FOR�THE�CENTRONIX�PRINTERS�TO�PRINT�TITLES * TITLE�MACR �TTL�\0 �ENDM �OPT�LIST * *�SPECIAL�OPTION�--�TURN�ON�THE�LISTING * �TITLE�(MDOS-EDOS�FILE�COPY) �PAGE �NAM�MECOPY �IDNT�MDOS�TO�EDOS�FILE�COPY�COMMAND�--�APRIL�27,�1977 �XDEF�MECOP$ �PAGE *ŽCOMMAND�DESCRIPTION *Ž------------------- * *�COMMAND�NAME:‚MECOPY *�------------ * *�PURPOSE: *�------- *‡THE�"MECOPY"�COMMAND�ALLOWS�FILES�FROM�AN�MDOS�DISKETTE�TO�BE *�COPIED�TO�AND�CATALOGUED�ON�AN�EDOS�2.X�DISKETTE.‚ONLY�SINGLE�FILES *�CAN�BE�COPIED. * *�FORMAT: *�------ * *ˆMECOPY[.][,] * *‡WHERE��IS�A�VALID�MDOS�COMMAND�LINE�DELIMETER,��IS *�THE�NAME�OF�AN�ASCII,�MDOS�FILE�ON�DRIVE�ZERO,��IS�THE�SUFFIX *�OF�THE�MDOS�FILE�(DEFAULTED�TO�".SA"�IF�NOT�SUPPLIED),�AND� *�IS�THE�NAME�OF�THE�EDOS�FILE�TO�BE�CREATED�ON�DRIVE�ONE. * *‡IF��IS�NOT�SPECIFIED�ON�THE�COMMAND�LINE,�THEN�THE *�FIRST�FIVE�CHARACTERS�OF�THE�MDOS�FILE�NAME�WILL�BE�USED�FOR�THE�EDOS�FILE. * * *‡NOTE:‚ONLY�ASCII�FILES�CAN�BE�COPIED�FROM�THE�MDOS�DISK. *ŽTHE�MDOS�DISK�MUST�BE�DRIVE�ZERO.‚THEREFORE, *ŽTHE�EDOS�DISK�MUST�BE�DRIVE�ONE. * *�ACTION: *�------- * *‡THE��WILL�BE�SEARCHED�FOR�ON�DRIVE�ZERO.‚IF�THE�SPECIFIED *��IS�NOT�FOUND,�THEN�THE�MESSAGE: * *“FILE�NAME�NOT�FOUND * *�WILL�BE�DISPLAYED.‚IF��IS�FOUND�ON�DRIVE�ZERO,�THEN *��WILL�BE�SEARCHED�FOR�IN�THE�EDOS�DIRECTORY�ON�DRIVE�ONE.‚IF *��IS �FOUND�TO�EXIST�ON�DRIVE�ONE,�THEN�THE�MESSAGE: * *“DUPLICATE�FILE�NAME * *�WILL�BE�DISPLAYED.‚IF��IS�NOT�FOUND�IN�THE�DRIVE�ONE *�DIRECTORY,�THEN�AN�ENTRY�FOR��WILL�BE�CREATED.‚THE�MESSAGE: * *’DIRECTORY�SPACE�FULL * *�MAY�BE�DISPLAYED�IF�THE�DIRECTORY�ON�DRIVE�ONE�(EDOS)�HAS *�NO�AVAILABLE�ENTRIES�FOR�THE�NEW�FILE. * *�IF�THE��IS�NOT�SPECIFIED�ON�THE�COMMAND�LINE,�THE�MESSAGE: * *‘NAME�REQUIRED * *�WILL�BE�DISPLAYED.‚AND,�IF�EITHER�THE��OF�THE��CONTAIN *�A�DEVICE�OR�FAMILY�INDICATOR,�THEN�THE�MESSAGE: * *�ILLEGAL�FILE�NAME * *�WILL�BE�DISPLAYED. * *‡IF�THE��FILE�IS�NOT�AN�ASCII�FILE,�THEN�THE�MESSAGE: * *ŽINVALID�FILE�TYPE * *�WILL�BE�DISPLAYED. * *‡DURING�NORMAL�COPYING,�COMPRESSED�SPACES�WILL�BE�AUTOMATICALLY *�EXPANDED,�AND�CARRIAGE�RETURNS�WILL�BE�FOLLOWED�WITH *�A�LINE�FEED-NULL�CHARACTER�PAIR.‚THUS,�THE�RESULTANT�EDOS�FILE�SIZE�WILL *�MOST�LIKELY�BE�LARGER�THAN�THE�MDOS�FILE�SIZE.‚THIS�WILL�NOT�ALWAYS *�BE�THE�CASE,�SINCE�THE�MDOS�FILE�WILL�PROBABLY�HAVE�ITS�LAST�CLUSTER�ONLY *�PARTIALLY�FILLED. * * *‡IF,�DURING�THE�FILE�COPY,�DISK�SPACE�IS�EXHAUSTED�ON�THE�EDOS�DISKETTE, *�THE�MESSAGE: * *�DISK�SPACE�FULL * *�WILL�BE�DISPLAYED. * *†AFTER�THE�COPY�IS�COMPLETED,�THE�EDOS�DIRECTORY�POINTER�FOR�THE *�NEXT�AVAILABLE�DISK�SECTOR�WILL�BE�UPDATED.‚THEN,�THE�MDOS�COMMAND *�INTERPRETER�WILL�BE�GIVEN�CONROL. * *†THE�BREAK�KEY�CAN�BE�USED�TO�ABORT�THE�COPY�PROCESS�AT�ANY�POINT. �PAGE * *�MACRO�TO�GENERATE�A�USER�SUPPLIED�ARGUMENT�OR�A�DEFAULT *„ARGUMENT�FOR�A�GIVEN�ASSEMBLER�DIRECTIVE.‚THE�DEFAULT *„ARGUMENT�IS�USED�IF�THE�USER�SUPPLIED�PARAMETER�IS�NULL. * *„\0�=�ASSEMBLER�DIRECTIVE�(REQUIRED) *„\1�=�OPERAND�PREFIX�MODIFIER�(OPTIONAL) *„\2�=�DEFAULT�VALUE�(REQUIRED) *„\3�=�USER�SUPPLIED�VALUE�(REQUIRED) *„\4�=�OPERAND�SUFFIX�MODIFIER�(OPTIONAL) *„\5�=�COMMENT�FOR�BOTH�USER/DEFAULT�VALUE�(OPTIONAL) *„\6�=�COMMENT�MODIFIER�FOR�DEFAULT�VALUE�(OPTIONAL) * IFNULL�MACR �IFNC�,\3 �\0�\1\3\4�.�\5 �ENDC �IFC�,\3 �\0�\1\2\4�.�\5�--�DEFAULT�=�\6 �ENDC �ENDM �PAGE * *�MACRO�TO�INITIALIZE�AN�IOCB * *�ARGUMENT‚NAME‚REQ/OPT‚DEFAULT *�-------------------------------- *„\0ƒIOCB�LABEL‚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 *‰IOCSBE�IOCSBS+127 * * *„\AƒCAN�BE�USED�TO�LIST/NOLIST�MACRO�CALLS�TO�IFNULL * *‰\A=MC�WILL�TURN�ON�PRINTING�MACRO�CALLS�WITHIN�THE�IOCB�MACRO. *ŒANYTHING�ELSE�WILL�SUPPRESS�PRINTING�OF�EMBEDDED�MACRO *ŒCALLS. * * * *�THE�IOCB�MACRO�REQUIRES�THE�IFNULL�MACRO * �PAGE IOCB�MACR �IFEQ�NARG �FAIL�**�PARAMETERS�REQUIRED�** �ENDC * �IFNC�MC,\A �OPT�NOMC �ENDC * �IFNC�,\0 \0�EQU�*�.�START�OF�\0�IOCB �ENDC * �IFC�,\0 \.0�EQU�*�.�START�OF�NAMELESS�\.0�IOCB �ENDC * �FCB�0�.�IOCSTA �IFNULL�FCB,,DT$OPI,(\1),(+DT$CLS),(IOCDTT:�CLOSED+),INPUT �FDB�0�.�IOCDBP �IFNULL�FDB,,0,(\2),,IOCDBS,0 �IFNULL�FDB,,0,(\3),,IOCDBE,0 �IFNULL�FCC,(2,),DK,(\4),,IOCGDT,DK �IFNULL�FCB,('0+),0,(\5),,IOCLUN,0 �IFNULL�FCC,(8,),(ˆ),(\6),,IOCNAM,SPACES �IFNULL�FCC,(2,),SA,(\7),,IOCSUF,SA �FDB�0�.�IOCRIB �IFNULL�FDB,,FD$FMA,(\8),(!<8),IOCFDF,ASCII �FDB�0�.�RESERVED �FDB�0�.�IOCDEN �FDB�0�.�IOCSBP �IFNULL�FDB,,0,(\9),,IOCSBS,0 �IFNULL�FDB,,0,(\9),(+SC$SIZ-1),IOCSBE,(0+127) �FDB�0�.�IOCSBI * �IFNC�MC,\A �OPT�MC �ENDC * �ENDM �PAGE * *�ED OS�DIRECTORY�AND�SYSTEM�EQUATES * NAME�EQU�0�.�NAME�OFFSET ATTR�EQU�5�.�ATTRIBUTE�OFFSET TRACK�EQU�6�.�TRACK�OFFSET SECTOR�EQU�7�.�SECTOR�OFFSET SIZE�EQU�8�.�FILE�SIZE�OFFSET ENTSIZ�EQU�11�.�DIRECTORY�ENTRY�SIZE DIRSIZ�EQU�110�.�OFFSET�TO�11TH�ENTRY�IN�DIRECTORY�SECTOR DIRSTR�EQU�4�.�STARTING�DIRECTORY�SECTOR�(USING�1-26�NUMBERING) DIRMAX�EQU�26�.�ENDING�DIRECTORY�SECTOR�(USING�1-26�NUMBERING) ENDATT�EQU�-1�.�END�OF�DIRECTORY�ATTRIBUTE DELATT�EQU�$80�.�DELETED�DIRECTORY�ENTRY�ATTRIBUTE NAMSIZ�EQU�5�.�EDOS�FILE�NAME�LENGTH LSTTRK�EQU�$4C�.�LAST�TRACK�ON�EDOS�DISK * *�ERROR�MESSAGE�NUMBER�EQUATES * MEER0�EQU�0�.�UNIFIED�I/O�ERROR MEER4�EQU�4�.�ILLEGAL�DRIVE�NUMBER MEER5�EQU�5�.�NAME�REQUIRED MEER7�EQU�7�.�ILLEGAL�FILE�NAME MEER19�EQU�19�.�INVALID�FILE�TYPE �PAGE * *�MACRO�DEFINITIONS�FOR�16�BIT�ARITHMETIC�AND�LOAD/STORE�OPERATIONS * LDBAX�MACR �LDAB�\0,X�.�\1 �LDAA�\0+1,X�.�\2 �ENDM * STBAX�MACR �STAB�\0,X�.�\1 �STAA�\0+1,X�.�\2 �ENDM * LDBA�MACR �LDAB�\0�.�\1 �LDAA�\0+1�.�\2 �ENDM * STBA�MACR �STAB�\0�.�\1 �STAA�\0+1�.�\2 �ENDM * ADBA�MACR �ADDA�\0�.�\1 �ADCB�#0�. �ENDM * *�DEFINE�A�MACRO�TO�BE�USED�FOR�A�LONG-BRANCH * GOTO�MACR �IFC�EQ,\1 �BNE�\.0 �ENDC �IFC�NE,\1 �BEQ�\.0 �ENDC �IFC�CC,\1 �BCS�\.0 �ENDC �IFC�CS,\1 �BCC�\.0 �ENDC �JMP�\0 \.0�EQU�*�. �ENDM �PAGE * *�DEFINE�A�MACRO�TO�CONSTRUCT�THE�EDOS�SECTOR�TABLE�MAP * *�ENTER�WITH�SECTOR�NUMBER�1-26�(INDEXED�FROM�START�OF�TABLE�-�1) *�AND�EXTRACT�THE�MAPPED�SECTOR�NUMBER�1-26. * * ESCTB�MACR �OPT�NOMEX \.0�SET�1�. �RPT�7,\.0 �RPT�7,\.0 �RPT�7,\.0 �RPT�5,\.0 �OPT�MEX �ENDM * RPT�MACR .TMP�SET�\0�. �OPT�MEX �FCB�\1�.�\.1 �OPT�NOMEX \1�SET�\1+9�. �IFGT�\1-26 \1�SET�\1-26 �ENDC .TMP�SET�.TMP-1�. �IFGT�.TMP �RPT�.TMP,\1 �ENDC �ENDM �PAGE * *�DATA�SECTION * �DSCT * *�MECOPY�VERSION/REVISION�NUMBERS * �FCC�"0100"�. * *�EDOS�OPEN�TEMPORARY�STORAGE * EDO.SX�FDB�0�.�IOCB�ADDRESS�SAVE�AREA EDO.MV�FDB�0�.�MOVE�PACKET �FDB�0�. EDO.DE�FCC�"*****"�.�EDOS�DUMMY�DIRECTORY�ENTRY �FCB�ENDATT,LSTTRK,SC$TRK-2,0,0,0 * *�DIRECTORY�SEARCH�TEMPORARY�WORK�AREA * EDI.SX�FDB�0�.�IOCB�ADDRESS�SAVE�AREA EDI.PK�FCB�0�.�PHYSICAL�SECTRO�I/O�PACKET �FDB�0�.�PSN�(MAPPED) �FDB�0�.�BUFFER �FDB�0�.�TRACK,�SECTOR�(NOT�MAPPED) EDI.CM�FDB�0�.�COMPARE�PAKET �FDB�0�. * *�EDOS�PHYSICAL�I/O�TEMPORARY�STORAGE * EDR.SX�FDB�0�.�I/O�PACKET�ADDRESS�SAVE�AREA * *�PUT�RECORD�TEMPORARY�STORAGE * PUT.SX�FDB�0�.�IOCB�ADDRESS�SAVE�AREA * *�GET/PUT�EDOS�LOGICAL�SECTOR�TEMPORARY�STORAGE * GET.SX�FDB�0�.�IOCB�ADDRESS�SAVE�AREA GET.PK�FCB�0�.�I/O�PACKET �FDB�0�.�PSN �FDB�0�.�BUFFER �FDB�0�.�TRACK,�SECTOR * *�EDOS�CLOSE�TEMPORARY�STORAGE * EDC.SX�FDB�0�.�IOCB�ADDRESS�SAVE�AREA �PAGE * *�DEFINE�THE�EDOS�SECTOR�MAPPING�TABLE * SCTTBL�ESCTB �PAGE * *�DEFINE�THE�IOCB'S * �IOCB�MDOSIO,,IREC,IRECE,,,,,,IBUFF * �IOCB�EDOSIO,DT$OPO,,,,1,,(‚),,OBUFF �PAGE * *�DEFINE�THE�SECTOR�BUFFERS * IBUFF�BSZ�SC$SIZ�. * OBUFF�BSZ�SC$SIZ�. * *�DEFINE�THE�RECORD�BUFFERS * IREC�BSZ�132�. IRECE�EQU�*�. * *�DEFINE�THE�PFNAM�PACKETS * EDPFN�FDB�0�. �FDB�EDOSIO+IOCLUN * MDPFN�FDB�0�. �FDB�MDOSIO+IOCLUN * *�DEFINE�STACK�AREA * �BSZ�100 STACK�EQU�*�. �PAGE * *�PROGRAM�SECTION * �PSCT * *�START‚OF�MAIN�CONTROL�LOOP * MECOP$�EQU�*�. �LDS�#STACK�.�INIT�THE�STACK�POINTER �JSR�SCANCL�.�GET�NAMES�FROM�COMMAND�LINE �BNE�MEXIT�.�NE�=>�ERROR * �JSR�CHKDRV�.�VERIFY�DRIVE�NUMBERS �BNE�MEXIT�.�NE�=>�ERROR * �LDX�#MDOS IO�.�IOCB�ADDRESS �JSR�MDOPEN�.�OPEN�THE�MDOS�FILE�--�INPUT �BNE�MEXIT0�.�NE�=>�ERROR * �SCALL�.CKBRK�.�SEE�IF�THE�OPERATOR�WANTS�TO�QUIT �BCS�MEXIT�.�CS�=>�YES * �LDX�#EDOSIO�.�IOCB�ADDRESS �JSR�EDOPEN�.�OPEN�THE�EDOS�FILE�--�OUTPUT �BNE�MEXIT0�.�NE�=>�ERROR * MEC010�JSR�GETRC�.�READ�AN�MDOS�RECORD �BCS�MEC030�.�CS�=>�END�OF�FILE �JSR�PUTRC�.�WRITE�THE�RECORD�TO�EDOS�FILE �BCS�MEXIT0�.�CS�=>�ERROR �SCALL�.CKBRK�.�SEE�IF�OPERATOR�WANTS�TO�QUIT �BCC�MEC010�.�CC�=>�NO,�CONTINUE * *�CLOSE�THE�FILES * MEC030�LDX�#EDOSIO�. �JSR�EDCLOS�.�CLOSE�THE�OUTPUT�FILE �BNE�MEXIT0�.�NE�=>�ERROR �LDX�#MDOSIO�. �JSR�MDCLOS�.�CLOSE�THE�INPUT�FILE �BEQ�MEND�.�EQ�=>�NORMAL�EXIT * *�ERROR�EXIT * MEXIT0�LDAB�#MEER0�.�UNIFIED�I/O�ERROR MEXIT�SCALL�.MDERR�.‚DISPLAY�THE�ERROR�MESSAGE * *�NORMAL�END * MEND�SCALL�.MDENT�.�RETURN�TO�MDOS�COMMAND�LIN�INTERPRETER �PAGE * *�SCAN�THE�MDOS�COMMAND�LINE�FOR�THE�INPUT�AND�OUTPUT�FILE�NAMES * *�EXIT:�Z=1�IF�NORMAL *‡Z=0�IF�ERROR * * SCANCL�EQU�*�. �LDX�CBUFP$�.�GET�THE�COMMAND�LINE�BUFFER�POINTER �STX�MDPFN�. �LDX�#MDPFN�.�POINT�TO�THE�PACKET �SCALL�.PFNAM�.�EXTRACT�THE�MDOS�FILE�NAME �TSTB�. �BNE�SCANE�.�NE�=>�ERROR�OCCURRED * �LDX�MDPFN�.�SAVE�COMMAND�LINE�SCAN�POINTER �STX�EDPFN�.�INTO�EDOS�FILE�NAME�PACKET * *�USE�THE�MDOS�FILE�NAME�AS�A�DEFAULT * �LDX�#MDOSIO+IOCNAM �STX�MDPFN�. �LDX�#EDOSIO+IOCNAM �STX�MDPFN+2�. �LDAB�#NAMSIZ�. �LDX�#MDPFN�.�MOVE�PACKET �SCALL�.MOVE * �LDX�#EDPFN�. �SCALL�.PFNAM�.�EXTRACT�THE�EDOS�FILE�NAME �ANDB�#$7F�.�STRIP�OFF�NULL�FILE�NAME�(OK) �BNE�SCANE1�.�NE�=>�ERROR�OCCURRED SCANX�RTS�.�EXIT * SCANE�ASLB�.�CHECK�FOR�NULL�FILE�NAME �LDAB�#MEER5�.� �BCS�SCANX�.�CS�=>�NAME�REQUIRED SCANE1�LDAB�#MEER7�.�ILLEGAL�FILE�NAME �BRA�SCANX �PAGE * *�CHECK�FOR�VALID�DRIVE�ASSIGNMENT:‚EDOS�=�1,�MDOS�=�0 * *�EXIT:�Z=1�IF�NORMAL *‡Z=0�IF�ERROR * * CHKDRV�EQU�*�. �LDAA�MDOSIO+IOCLUN �CMPA�#'0�. �BNE�CHKDE�.�NE�=>�WRONG�ASSIGNMENT �LDAA�EDOSIO+IOCLUN �CMPA�#'1�. �BNE�CHKDE�.�NE�=>�WRONG�ASSIGNMENT CHKDRX�RTS�.�EXIT * CHKDE�LDAB�#MEER4�.�ILLEGAL�DRIVE�NUMBER �BRA�CHKDRX�. �PAGE * *�RESERVE�AND�OPEN�THE�MDOS�INPUT�FILE * *�EXIT:�Z=1,C=0�IF�NORMAL *‡Z=0,C=1�IF�ERROR * * MDOPEN�EQU�*�. �SCALL�.RESRV�. �BCS�MDOPEX�.�CS�=>�ERROR �SCALL�.OPEN�. �BCS�MDOPEX�.�CS�=>�ERROR �LDAA�IOCFDF,X�.�CHECK�THE�ATTRIBUTE�TYPE �ANDA�#7�.�ISOLATE�FILE�TYPE�BITS �CMPA�#FD$FMA�.�IT�MUST�BE�ASCII �BNE�MDOPE1�.�NE�=>�ERROR �CLRB�. MDOPEY�STAB�IOCSTA,X�. MDOPEX�RTS�.�EXIT * MDOPE1�LDAB�#I$FTYP�.�INVALID�FILE�TYPE �BRA�MDOPEY�. �PAGE * *�OPEN�THE�EDOS�FILE�ON�THE�OUTPUT�DIRVE * *�X�=�IOCB�ADDRESS *…IOCNAM,�IOCDTT,�IOCLUN�REQUIRED * *�UPON�EXITING:�IOCLSN�=�TRACK,�SECTOR�OF�FILE *�IOCDEN�=�TRACK,�SECTOR�OF�DIRECTORY�SECTOR *�IOCDEN-2�=�OFFSET�INTO�SECTOR�BUFFER�OF�DIRECTORY�ENTRY *�IOCRIB�=�TRACK,�SECTOR�OF�FILE *�IOCMLS�=�0 * *ŽZ�=�1�IF�NORMAL *ŽZ�=�0�IF�ERROR * * * EDOPEN�EQU�*�. �STX�EDO.SX�.�SAVE�IOCB�ADDRESS �LDBAX�IOCGDW,(CHECK�DEVICE�TYPE) �CMPB�#'D�. �GOTO�EDOE10,NE�.�NE�=>�ILLEGAL�DEVICE �CMPA�#'K�. �GOTO�EDOE10,NE�.�NE�=>�ILLEGAL�DEVICE �LDAA�IOCDTT,X�. �BITA�#DT$CLS�. �GOTO�EDOE20,EQ�.�EQ�=>�FILE�ALREADY�OPEN �ANDA�#3�.�SAVE�OPEN�TYPE �CMPA�#DT$OPO�. �BEQ�EDO200�.�EQ�=>�OPEN�FOR�OUTPUT�ONLY �CMPA�#DT$OPI�. �GOTO�EDOE20,NE�.�NE�=>�ILLEGAL�OPEN�TYPE * *�OPEN�FILE�FOR�INPUT�ONLY * EDO100�JSR�EDIRSM�.�SEARCH�FOR�FILE�NAME�ON�EDOS�DIRECTORY �GOTO�EDOE30,NE�.�NE�=>� FILE�NAME�NOT�FOUND EDO110�LDAA�IOCDTT,X�. �ANDA�#$FF-DT$CLS�.�TURN�OFF�THE�CLOSED�BIT �STAA�IOCDTT,X�. �LDBAX�IOCSBS �STBAX�IOCSBP,(INIT�BUFFER�POINTER) �CLR�IOCMLS,X�.�ZERO�MAX�LSN �CLR�IOCMLS+1,X�. �LDBAX�IOCRIB,(GET�TRACK,SECTOR�OF�FILE) �STBAX�IOCLSN,(SET�FIRST�TRACK,SECTOR) �CLRB�.�SET�NORMAL�EXIT EDO199�STAB�IOCSTA,X�.�SET�THE�RETURN�STATUS �RTS�.�EXIT �PAGE * *�OPEN�FILE�FOR�OUTPUT�ONLY * EDO200�JSR�EDIRSM�.�SEARCH�FOR�FILE�NAME�ON�EDOS�DIRECTORY �GOTO�EDOE40,EQ�.�EQ�=>�DUPLICATE�FILE�NAME �LDBAX�IOCDEN,(PICK�UP�DIRECTORY�SECTOR) �STBAX�IOCLSN,(SETUP�LSN�TO�ACCESS�DIRECTORY) �LDX�IOCSBP,X�.�GET�ADDRESS�OF�LAS�ENTRY�IN�DIRECTORY �LDAA�ATTR,X�. �CMPA�#ENDATT�.�IT�MUST�BE�A�DELETED�ONE�TO�BE�THE�LAST�ONE �GOTO�EDOE50,NE�.�NE�=>�NO�DIRECTORY�SPACE �LDAA�#SC$TRK-1�.�CALC�#�SECTORS�LEFT �STAA�SIZE+1,X�. �LDAA�#LSTTRK�. �SUBA�TRACK,X�.�#�TRACKS�LEFT�-�1 �STAA�SIZE,X�. �CLRB�. EDO210�ADDA�SIZE,X�.�TIMES�26�SECTORS/TRACK �ADCB�#0�. �DEC�SIZE+1,X�. �BNE�EDO210�. �ADBA�#SC$TRK-2,(PLUS�MAX�#�SECTORS�ON�LAST�TRACK) �SUBA�SECTOR,X�.�MINUS�SECTORS�USED�IN�CURRENT�TRACK �SBCB�#0�. �BNE�EDO220�.�NE�=>�STILL�ROOM�LEFT�ON�DISK �TSTA�. �BNE�EDO220�.�NE�=>�STILL�ROOM�LEFT �JMP�EDOE60�.�EQ�=>�DISK�SPACE�FULL * EDO220�ADBA�#1�.�CORRECT�FILE�SIZE�FOR�DIRECTORY �STBAX�SIZE,(PUT�CORRECT�SIZE�INTO�DIRECTORY�ENTRY) �LDBAX�TRACK,TRACK,SECTOR �STX�EDO.MV+2�.�INIT�THE�MOVE�PACKET�DESTINATION�ADDRESS �LDX�EDO.SX�.�POINT�TO�IOCB �STBAX�IOCRIB,TRACK,SECTOR �LDAA�#IOCNAM�. �SCALL�.ADAX�. �STX�EDO.MV�.�SET�SOURCE�ADDRESS�IN�MOVE�PACKET �LDX�#EDO.MV�. �LDAB�#NAMSIZ�. �SCALL�.MOVE�.�PUT�THE�NAME�INTO�THE�DIRECTORY�ENTRY * *�CREATE�THE�DUMMY�DIRECTORY�ENTRY�FOR�EDOS�DIRECTORY * �LDX�EDO.SX�.�POINT�TO�IOCB �LDBAX�IOCSBS�.�IS�THERE�ROOM�FOR�DUMMY�ENTRY�IN�THIS�SECTOR�? �ADBA�#DIRSIZ�. �CMPA�IOCSBP+1,X�. �BNE�EDO250�.�NE�=>�YES,�THERE'S�ROOM �CMPB�IOCSBP,X�. �BNE�EDO250�. * *�THERE�IS�NO�ROOM�FOR�THE�DUMMY�ENTRY�IN�THE�CURRENT�SECTOR.� *�WRITE�OUT�THE�CURRENT�SECTOR�FIRST�AND�TRY�TO�PUT�ENTRY�INTO�NEXT *�SECTOR. * �JSR�PUTELS�.�PUT�OUT�CURRENT�EDOS�SECTOR �INC�IOCLSN+1,X�.�BUMP�THE�SECTOR�NUMBER�BY�1 �LDAA�IOCLSN+1,X�. �CMPA�#DIRMAX+1�.�IS�IT�PAST�THE�END�OF�THE�DIRECTORY�? �BEQ�EDO280�.�EQ�=>�YES,�DON'T�PUT�DUMMY�ENTRY�OUT * *�ZERO�FILL�THE�CURRENT�SECTOR�BUFFER�BEFORE�CREATING�NEW�DUMMY�ENTRY * �LDX�IOCSBS,X�.�POINT�TO�START�OF�BUFFER �LDAB�#SC$SIZ�. �CLRA�. �SCALL�.STCHR�. �LDX�EDO.SX�.�POINT�BACK�TO�IOCB �BRA�EDO260�. * *�UPDATE�THE�CURRENT�BUFFER�POINTER�TO�THE�NEXT�ENTRY�IN�THE�SECTOR * EDO250�LDBAX�IOCSBP�. �ADBA�#ENTSIZ�. �STBAX�IOCSBP�. EDO260�LDX�IOCSBP,X�.�POINT�TO�THE�NEW�DIRECTORY�ENTRY �STX�EDO.MV+2�.�SET�UP�DESTINATION�POINTER�OF�MOVE�PACKET �LDX�#EDO.DE�.�GET�ADDRESS�OF�DUMMY�ENTRY�IN�MEMORY �STX�EDO.MV�.�SET�UP�SOURCE�POINTER�OF�MOVE�PACKET �LDAB�#ENTSIZ�.� �LDX�#EDO.MV�.�POINT�TO‚THE�MOVE�PACKET �SCALL�.MOVE�.�MOVE�THE�DUMMY�ENTRY�INTO�THE�CURRENT�BUFFER �LDX�EDO.SX�.�POINT�TO�IOCB �JSR�PUTELS�.�WRITE�OUT�CURRENT�SECTOR EDO280�LDX�EDO.SX�.�POINT�TO�IOCB �JMP�EDO110�.�GO�SET�FILE�OPEN�AND�EXIT �PAGE * *�EDOS�OPEN�ERROR�HANDLER * EDOE10�LDAB�#I$IVDV�.�INVALID�DEVICE �SKIP2 * EDOE20�LDAB�#I$CLOS�.�FILE�ALREADY�OPEN �SKIP2 * EDOE30�LDAB�#I$NONM�.�FILE�NAME�NOT�FOUND �SKIP2 * EDOE40�LDAB�#I$DUPE�.�DUPLICATE�FILE�NAME �SKIP2 * EDOE50�LDAB�#I$DSPC�.�DIRECTORY�SPACE�FULL �SKIP2 * EDOE60�LDAB �#I$FSPC�.�DISK�SPACE�FULL * �LDX�EDO.SX�.�POINT�TO�IOCB �SEC�.�SET�ERROR�EXIT�STATUS �JMP�EDO199�.�SET�STATUS�AND�EXIT �PAGE * *�SEARCH�FOR�FILE�NAME�IN�EDOS�DIRECTORY * *�ENTRY:�X�=�IOCB�ADDRESS * *�EXIT:�Z=1�=>�NAME�FOUND�IN�DIRECTORY *‡Z=0�=>�NAME�NOT�FOUND�IN�DIRECTORY * *ˆIOCRIB�=�TRACK,SECTOR�OF�FILE,�IF�FOUND *ˆIOCDEN�=�TRACK,SECTOR�OF�DIRECTORY�SECTOR *†IOCDEN-2�=�OFFSET�INTO�SECTOR�BUFFER�OF�DIRECTORY�ENTRY * * EDIRSM�EQU�*�. �STX�EDI.SX�.�SAVE�IOCB�ADDRESS �LDAA�#DIRSTR�.�INIT�EDOS�DIRECTORY�SECTOR EDI005�CLR�EDI.PK+5�.�TRACK�0 �STAA�EDI.PK+6�.�SAVE�DIR�SECTOR�NUMBER �LDBAX�IOCSBS�. �STBAX�IOCSBP,(INIT�BUFFER�POINTER) �STBA�EDI.PK+3,(INIT�BUFFER�POINTER) �LDAB�IOCLUN,X�. �ANDB�#3�.�ISOLATE�DRIVE�NUMBER �LDX�#EDI.PK�. �JSR�EDREAD�.�READ�AN�EDOS�DIRECTORY�SECTOR * EDI010�LDX�EDI.SX�.�POINT�TO�IOCB �LDX�IOCSBP,X�.�POINT�TO�DIRECTORY�SECTOR �LDAA�ATTR,X�. �CMPA�#ENDATT�.�CHECK�FOR�END�OF�DIRECTORTY �BEQ�EDI100�.�EQ�=>�ENTRY�NOT�FOUND �CMPA�#DELATT�.�CHECK�FOR�DELETED�ENTRY �BEQ�EDI020�.�EQ�=>�SKIP�DELETED�ENTRY �STX�EDI.CM�.�SETUP�COMPARE�PARAMETERS�FOR�NAME �LDX�EDI.SX�.�POINT�TO�IOCB �LDAB�#IOCNAM�. �SCALL�.ADBX�.�POINT�TO�NAME �STX�EDI.CM+2�. �LDAB�#NAMSIZ�. �LDX�#EDI.CM�.�POINT�TO�THE�PARAMETER�PACKET �SCALL�.CMPAR�.�COMPARE�NAMES �BEQ�EDI200�.�EQ�=>�FILE�NAME�FOUND * *�CURRENT�DIRECTORY�ENTRY�DOES�NOT�MATCH * EDI020�LDX�EDI.SX�.�POINT�TO�IOCB �LDBAX�IOCSBS,(GET�BUFFER�POINTER) �ADBA�#DIRSIZ�. �CMPA�IOCSBP+1,X�.�CHECK�FOR�END�OF�SECTOR �BNE�EDI030�.�NE�=>�STILL�MORE�TO�CHECK �CMPB�IOCSBP,X�. �BEQ�EDI040�.�EQ�=>�END�OF�THIS�SECTOR * EDI030�LDBAX�IOCSBP,(UPDATE�POINTER�TO�NEXT�ENTRY) �ADBA�#ENTSIZ�. �STBAX�IOCSBP�. �BRA�EDI010�.�KEEP�LOOKING * *�THE�END�OF�THE�CURRENT�SECTOR�WAS�FOUND�WITHOUT�A�MATCH. *�SETUP�TO�READ�THE�NEXT�SECTOR,�IF�NOT�AT�THE�END *�OF�THE�DIRECTORY�ALREADY. * EDI040�LDAA�EDI.PK+6�.�GET�DIRECTORY�SECTOR�# �INCA�. �CMPA�#DIRMAX+1�.�AT�END? �BNE�EDI005�.�NE�=>�MORE�TO�SCAN * *�THE�REQUESTED�DIRECTORY�ENTRY�WAS�NOT�FOUND * EDI100�LDAB�#I$NONM�. �BRA�EDI210�. * *�THE�REQUESTED�DIRECTORY�ENTRY�WAS�FOUND * *�SAVE�TRACK,�SECTOR,�ETC. * EDI200�CLRB�.�SET�NORMAL�RETURN�STATUS EDI210�LDX�EDI.SX�.�POINT�TO�IOCB �STAB�IOCSTA,X�.�SET�THE�RETURN�STATUS �LDX�IOCSBP,X�.�POINT�TO�DIRECTORY�ENTRY �LDBAX�TRACK,TRACK,SECTOR �LDX�EDI.SX�.�POINT�TO�IOCB �STBAX�IOCRIB,(SAVE�RIB�ADDRESS) �LDBA�EDI.PK+5,TRACK,SECTOR�OF�DIRECTORY�ENTRY �STBAX�IOCDEN,TRACK,SECTOR �LDBAX�IOCSBP,(GET�CURRENT�BUFFER�POINTER) �SUBA�IOCSBS+1,X�.�CALC�OFFSET�OF�CURRENT�DIRECTORY�ENTRY �SBCB�IOCSBS,X�. �STBAX�IOCDEN-2,(SAVE�OFFSET�OF�DEN) �LDAB�IOCSTA,X�.�SET�RETURN�STATUS �RTS�.�EXIT �PAGE * *�EDOS�PHYSICAL�SECTOR�I/O�ROUTINE * * *�B�=�DRIVE *�X�=�I/O�PACKET�ADDRESS *‰FDB�0�.�STATUS *‰FDB�0�.�PSN�(CHANGED�BY�ROUTINE) *‰FDB�0�.�BUFFER *‰FDB�0�.�TRACK,SECTOR�(UNMAPPED)�SECTOR�IS�1-26 * EDWRIT�EQU�*�. �LDAA�#1�.�SETUP�WRITE�TYPE �SKIP1�. * EDREAD�EQU�*�. �CLRA�.�SETUP�READ�TYPE �PSHB�.�SAVE�DRIVE �PSHA�.�SAVE�I/O�TYPE �STX�EDR.SX�.�SAVE�I/O�PACKET�ADDRESS �LDBAX�5,TRACK,SECTOR * *�SINCE�INDEX�(SECTOR�NUMBER)�IS�IN�RANGE�1-26,�OFFSET�BASE *�ADDRESS�OF�TABLE�BY�1 * �LDX�#SCTTBL-1�.�POINT�TO�EDOS�SECTOR�MAP�TABLE �SCALL�.ADAX�.�INDEX�INTO�TABLE �LDAA�X�.�GET�MAPPED�SECTOR�NUMBER �DECA�.�MAKE�SECTOR�NUMBER�RELATIVE�TO�0 �JSR�TS2PSN�.�CONVERT�TRACK�SECTOR�(MAPPED)�INTO�PHYSICAL�SECTOR�# �LDX�EDR .SX�.�RESTORE�PACKET�POINTER �STBAX�1,PSN<8,PSN �PULA�.�RESTORE�I/O�TYPE �PULB�.�RESTORE�DRIVE�NUMBER �TSTA�. �BNE�EDR010�.�NE�=>�WRITE�OPERATION �SCALL�.DREAD�.�READ�A�SECTOR EDR005�RTS�.�EXIT * EDR010�SCALL�.DWRIT�.�WRITE�A�SECTOR �BRA�EDR005�. �PAGE * *�READ�A�RECORD�FROM�THE�INPUT�(MDOS)�FILE * *�EXIT:�Z=1�IF�NORMAL *‡Z=0�IF�ERROR * * GETRC�EQU�*�. �LDX�#IREC�.�INIT�THE�DATA�BUFFER�POINTERS �STX�MDOSIO+IOCDBS�. �LDX�#IRECE�. �STX�MDOSIO+IOCDBE�. �LDX�#MDOSIO�.�POINT�TO�THE�IOCB �SCALL�.GETRC�.�READ�A�RECORD �BEQ�GETRCX�.�EQ�=>�NORMAL�RETURN �CMPB�#I$EOF�.�CHECK�FOR�END�OF�FILE �BEQ�GETRCY�.�EQ�=>�GOOD�ERROR�EXIT �LDAB�#MEER0�.�UNIFIED�I/O�ERROR �SCALL�.MDERR�. �LDAB�SYERR$+1�.�RESTORE�ERROR�TYPE GETRCY�SEC�.�SET�ERROR�EXIT GETRCX�RTS�. �PAGE * *�WRITE�A�RECORD�FROM�THE�INPUT�RECORD�BUFFER�INTO�THE�OUTPUT�FILE� * * *�EXIT:�Z=1�IF�NORMAL *‡Z=0�IF�ERROR * * PUTRC�EQU�*�. �LDX�MDOSIO+IOCDBP�.�GET�END�OF�CURRENT�RECORD �STX�MDOSIO+IOCDBE�.�SET�END�OF�CURRENT�RECORD �LDX�MDOSIO+IOCDBS�.�GET�START�OF�CURRENT�RECORD �STX�MDOSIO+IOCDBP�.�SET�START�OF�CURRENT�RECORD * PUT010�LDX�#MDOSIO�.�POINT�TO�OUTPUT�IOCB �JSR�PUT100�.�GET�ONE�INPUT�BYTE �GOTO�PUT300,CS�.�CS�=>�NO�MORE�DATA�IN�RECORD �LDX�#EDOSIO�.�POINT�TO�OUTPUT�IOCB �PSHA�.�SAVE�BYTE�TO�BE�OUTPUT �JSR�PUT200�.�PUT�OUT�ONE�BYTE �PULA�.�RESTORE�THE�OUTPUT�BYTE �GOTO�PUTE10,NE�.�NE�=>�RAN�OUT�OF�DISK�SPACE �CMPA�#CR�.�WAS�IT�A�CARRIAGE�RETURN�? �BNE�PUT010�.�NE�=>�NO,�KEEP�PUTTING�OTHER�CHARACTERS �LDAA�#LF�.�EQ�=>�YES,�SUPPLY�LINE�FEED�AND�NULL�FOR�EDOS�FILE �JSR�PUT200�. �GOTO�PUTE10,NE�. �LDAA�#NULL�. �JSR�PUT200�. �GOTO�PUTE10,NE�. �BRA�PUT010�. �PAGE * *�GET�A�BYTE�FROM�THE�INPUT�BUFFER * *�X�=�IOCB�ADDRESS * *�A�=‚RETURNED�BYTE * PUT100�LDBAX�IOCDBE�.�CHECK�IOCDBP>IOCDBE �SUBA�IOCDBP+1,X�. �SBCB�IOCDBP,X�. �BCS�PUT190�.�CS�=>�END�OF�LINE�ENCOUNTERED �STX�PUT.SX�.�SAVE�IOCB�ADDRESS �LDX�IOCDBP,X�.�POINT�TO�THE�BYTE�TO�GET �LDAA�X�.�GET�IT �LDX�PUT.SX�.�RESTORE�IOCB�ADDRESS �INC�IOCDBP+1,X�.�BUMP�POINTER �BNE�PUT180�. �INC�IOCDBP,X�. PUT180�CLC�.�SET�NORMAL�EXIT PUT190�RTS�.�EXIT �PAGE * *�PUT�A�BYTE�INTO�THE�OUTPUT�BUFFFER * *�A�=�BYTE *�X�=�IOCB * PUT200�STX�PUT.SX�.�SAVE�IOCB�ADDRESS �LDX�IOCSBP,X�.�GET�BUFFER�POINTER �STAA�X�.�STORE�THE�BYTE �LDX�PUT.SX�.�RESTORE�IOCB�POINTER �INC�IOCSBP+1,X�.�BUMP�POINTER�BY�1 �BNE�PUT210�. �INC�IOCSBP,X�. PUT210�LDBAX�IOCSBP�. �SUBA�IOCSBE+1,X�.�CHECK�IOCSBP>IOCSBE �SBCB�IOCSBE,X�. �BCS�PUT290�.�CS�=>�OK,�NOT�FULL�YET �TSTA�.�CHECK�FOR�LAST�BYTE �BEQ�PUT290�.�EQ�=>�OK,�ONE�MORE�BYTE�TO�FILL * *�THE�CURRENT�SECTOR�BUFFER�IS�FULL. *�OUTPUT�THE�SECTOR�AND�RESET�THE�POINTERS * �JSR�PUTELS�.�WRITE�OUT�THE�SECTOR �LDBAX�IOCMLS�. �ADBA�#1�. �STBAX�IOCMLS�.�BUMP�MAX�LSN�(SIZE) �LDBAX�IOCLSN,TRACK,SECTOR �JSR�INTRSC�.�INCREMENT�TRACK,SECTOR�BY�1 �BNE�PUT299�.�NE�=>�DISK�SPACE�FULL �STBAX�IOCLSN,TRACK,SECTOR �LDBAX�IOCSBS �STBAX�IOCSBP,(RESET�BUFFER�POINTER) PUT290�CLRB PUT299�STAB�IOCSTA,X�. �RTS �PAGE * *�PUT�RECORD�ERROR�HANDLER * PUTE10�LDAB�#I$FSPC�.�NO�DISK�SPACE�LEFT �SEC�.�SET�ERROR�EXIT�STATUS �BRA�PUT399�. * *�NORMAL�EXIT * PUT300�CLRB�. PUT399�LDX�PUT.SX�.�POINT�TO�IOCB �STAB�IOCSTA,X�. �RTS�. �PAGE * *�INCREMENT�TRACK�SECTOR�IN�B,A * *�EXIT�Z�=�1�IF�OK�EXIT *†Z�=�0�IF�DISK�SPACE�EXCEEDED * * INTRSC�EQU�*�. �INCA�.�BUMP�SECTOR�NUMBER �CMPB�#LSTTRK�.�CHECK�FOR�LAST�TRACK �BEQ� INT060�.� �CMPA�#SC$TRK+1�.�CHECK�IF�MAX�SECTOR�EXCEEDED�YET �BNE�INT080�.�NE�=>�NOT�YET �BRA�INT070�. * INT060�CMPA�#SC$TRK-2+1�.�LAST�TRACK�HAS�FEWER�SECTORS �BNE�INT080�. INT070�INCB�.�BUMP�TRACK�NUMBER �LDAA�#1�.�RESET�SECTOR�NUMBER �CMPB�#LSTTRK+1�.�CHECK�FOR�END�OF�DISK �BEQ�INTE10�.�EQ�=>�OUT�OF�SPACE INT080�PSHA�.�SAVE�A �CLRA�.�SET�Z�=�1�FOR�GOOD�EXIT INT090�PULA�.�RESTORE�A �RTS�.�EXIT * *�ERROR�EXIT * INTE10�PSHA�.�SAVE�A �LDAA�#1�.�SET�Z�=�0�FOR�BAD�EXIT �BRA�INT090�. �PAGE * *�CONVERT�TRACK�SECTOR�TO�PHYSICAL�SECTOR�NUMBER * *�ENTRY:�B�=�TRACK *ˆA�=�SECTOR * *�EXIT:�B,A�=�PSN * TS2PSN�EQU�*�. �SCALL�.PSHX�.�SAVE�X �PSHA�.�SAVE�SECTOR�NUMBER �TBA�. �CLRB�.�B,A�=�16�BIT�TRACK�NUMBER * *�MULTIPLY�TRACK�TIMES�26 * *�26X�=�16X�+�8X�+�2X * �ASLA�. �ROLB�.�TRACK�*�2 �PSHA�.�SAVE�TRACK�*�2 �PSHB�. �ASLA�. �ROLB�.�TRACK�*�4 �ASLA�. �ROLB�.�TRACK�*�8 �PSHA�.�SAVE�TRACK�*�8 �PSHB�. �ASLA�. �ROLB�.�TRACK�*�16 �TSX�. �ADDA�1,X�. �ADCB�X�.�TRACK�*�16�+�TRACK�*�8�=�TRACK�*�24 �ADDA�3,X�. �ADCB�2,X�.�TRACK�*�24�+�TRACK�*�2�=�TRACK�*�26 �ADDA�4,X�.�ADD�IN�SECTOR�NUMBER �ADCB�#0�. �INS�.�RESTORE�STACK �INS�. �INS�. �INS�. �INS�. �SCALL�.PULX�.�RESTORE�X �RTS�. �PAGE * *�CLOSE�AND�RELEASE�THE�MDOS�FILE * *�EXIT:�Z=1�IF�NORMAL *‡Z=0�IF�ERROR * * MDCLOS�SCALL�.CLOSE�. �BNE�MDC005�.�NE�=>�ERROR�OCCURRED �SCALL�.RELES�. MDC005�RTS�.�EXIT �PAGE * *�READ/WRITE�THE�CURRENT�SECTOR�IN�IOCLSN�OF�AN�IOCB * * PUTELS�LDAA�#1�.�SET�THE�WRITE�TYPE �SKIP1 * GETELS�CLRA�.�SET�THE�READ�TYPE �PSHA�.�SAVE�THE�I/O�TYPE �STX�GET.SX�.�SAVE�THE�IOCB�ADDRESS �LDBAX�IOCSBS,(GET�THE�BUFFER�POINTER�RESET) �STBAX�IOCSBP �STBA�GET.PK+3,(INIT�PHYSICAL�I/O�PACKET�BUFFER) �LDAB�IOCLUN,X�. �ANDB�#3�.�ISOLATE�THE�DRIVE�NUMBER �PSHB�.�SAVE�DRIVE�NUMBER �LDBAX�IOCLSN,TRACK,SECTOR �LDX�#GET.PK�.�POINT�TO�THE�I/O�PACKET �STBAX�5,TRACK,SECTOR �PULB�.�RESTORE�DRIVE�NUMBER �PULA�.�RESTORE�THE�I/O�TYPE �TSTA�. �BEQ�GET010�.�EQ�=>�READ �JSR�EDWRIT�.�WRITE�THE�SECTOR �BRA�GET020 * GET010�JSR�EDREAD�.�READ�THE�SECTOR GET020�LDX�GET.SX�.�RESTORE�THE�IOCB�POINTER �RTS�.�EXIT �PAGE * *�CLOSE�THE�EDOS�FILE * *�X�=�IOCB�ADDRESS * * *�EXIT�Z=1�IF�NORMAL *†Z=0�IF�ERROR * EDCLOS�EQU�*�. �STX�EDC.SX�.�SAVE�THE�IOCB�ADDRESS �LDAA�IOCDTT,X�. �BITA�#DT$CLS�. �GOTO�EDCE10,NE�.�NE�=>�ALREADY�CLOSED �ANDA�#3�. �CMPA�#DT$OPI�.�CHECK�OPEN�TYPE �GOTO�EDC200,EQ�.�EQ�=>�INPUT�CLOSE,�JUST�EXIT �CMPA�#DT$OPO�. �GOTO�EDCE20,NE�.�NE�=>�ILLEGAL�OPEN�MODE * *�FILL�THE�LAST�SECTOR�WITH�NULLS * �LDBAX�IOCSBE�. �SUBA�IOCSBP+1,X�. �SBCB�IOCSBP,X�. �ADBA�#1�.�CALC�LENGTH�OF�UNUSED�BUFFER�AREA �CMPA�#SC$SIZ�. �BEQ�EDC050�.�EQ�=>�NOTHING�TO�FILL�IF�EMPTY�BUFFER �LDX�IOCSBP,X�.�GET�BUFFER�POINTER �TAB�.�SET�LENGTH �CLRA�.�SET�NULL �SCALL�.STCHR�.�FILL�THE�BUFFER �LDX�EDC.SX�.�POINT�TO�IOCB �JSR�PUTELS�.�WRITE�OUT�CURRENT�SECTOR �INC�IOCMLS+1,X�. �BNE�EDC050�. �INC�IOCMLS,X�. EDC050�LDBAX�IOCLSN,(SAVE�EOF�OF�FILE) �STBAX�IOCSBI �LDBAX�IOCDEN,(GET�DIRECTORY�ENTRY�TRACK/SECTOR) �STBAX�IOCLSN� �JSR�GETELS�.�READ�IN�THE�DIRECTORY�SECTOR �LDBAX�IOCDEN-2,(GET�BUFFER�OFFSET) �LDX�IOCSBP,X�.�GET�START�OF�BUFFER �SCALL�.ADXBA�. �LDX�EDC.SX�.�POINT�TO�IOCB �STBAX�IOCSBP,(SAVE�POINTER�TO�DIRECTORY�ENTRY) �LDBAX�IOCMLS,(GET�SIZE) �LDX�IOCSBP,X�.�POINT�TO�DIRECTORY�ENTRY �ADBA�#1,(ADJUST�FOR�DIRECTORY�ITEM) �STBAX�SIZE,(SET�SIZE�INTO�ENTRY) �CLR�ATTR,X�.�SET�ATTRIBU TE�TO�0 �LDX�EDC.SX�.�POINT�BACK�TO�IOCB �LDAA�IOCDEN-2+1,X�.�CHECK�IF�THIS�IS�LAST�ENTRY�IN�SECTOR �CMPA�#DIRSIZ�. �BNE�EDC100�.�NE�=>�NO �JSR�PUTELS�.�EQ�=>�YES,�WRITE�OUT�SECTOR �LDAA�IOCLSN+1,X�.�GET�DIRECTORY�SECTOR�NUMBER �CMPA�#DIRMAX�.�AT�END�? �BEQ�EDC200�.�EQ�=>�YES,�DON'T�HAVE�TO�PUT�OUT�DUMMY�ENTRY �INC�IOCLSN+1,X�.�BUMP�SECTOR�NUMBER �JSR�GETELS�.�READ�IN�SECTOR�WITH�DUMMY�ENTRY�IN�IT �BRA�EDC110�. * EDC100�LDBAX�IOCSBP� �ADBA�#ENTSIZ,(POINT�TO�NEXT�ENTRY�IN�BUFFER) �STBAX�IOCSBP� * EDC110�LDX�IOCSBP,X�.�POINT�TO�ENDING�ENTRY �LDAA�ATTR,X�.�CHECK�TO�SEE�IT�REALLY�IS�ENDING�ENTRY �CMPA�#ENDATT�. �BNE�EDCE30�.�NE�=>�NO�END�POINTER�IN�DIRECTORY �LDX�EDC.SX�.�POINT�TO�IOCB �LDBAX�IOCSBI,(GET�LAST�USED�TRACK,SECTOR) �JSR�INTRSC�.�BUMP�IT�BY�ONE �BNE�EDCE40�.�NE�=>�NO�MORE�DISK�SPACE �LDX�IOCSBP,X�.�POINT�TO�ENTRY�AGAIN �STBAX�TRACK� �LDX�EDC.SX�.�POINT�TO�IOCB �JSR�PUTELS�.�WRITE�OUT�DIRECTORY�SECTOR * *�NORMAL�EXIT * EDC200�CLRB�. EDC299�LDX�EDC.SX�.�POINT�TO�IOCB �STAB�IOCSTA,X�.�SET�EXIT�STATUS �RTS�. * *�ERROR�HANDLER�FOR�EDOS�CLOSE * EDCE10�LDAB�#I$CLOS�.�FILE�NOT�OPEN �SKIP2 * EDCE20�LDAB�#I$DTYP�.�ILLEGAL�OPEN�MODE �SKIP2 * EDCE30�LDAB�#I$IDEN�.�MISSING�ENDING�DIRECTORY�(DUMMY)�ENTRY �SKIP2 * EDCE40�LDAB�#I$FSPC�.�NO�MORE�DISK�SPACE�?? �SEC�. �BRA�EDC299�. �PAGE �END�MECOP$ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@|À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 & ÷€�NAM�HPLOADER �OPT�O *‚THIS�LOADER�WILL�LOAD‚THE�HP�INTERFACE *‚PROGRAM�FROM�THE�HP�DATA�CARTRIDGE �SPC�1 *W.C.WRAY�3/12/77 �SPC�1 INCHNP�EQU�$F015 OUTCH�EQU�$F018 EXBUG�EQU�$F564 �SPC�1 �SPC�1 �ORG�$12 �SPC�1 BYTECT�RMB�1 CKSM�RMB�1 XHI�RMB�1 XLOW�RMB�1 �ORG�$E789 �SPC�1 LOAD�LDA�A�#$11 �JSR�OUTCH �JSR�INCHNP �CMP�A�#'S �BNE�LOAD �JSR�INCHNP �CMP�A�#'9 �BNE�*+5 XBG�JMP�EXBUG �CMP�A�#'1 �BNE�LOAD �CLR�CKSM �BSR�BYTE �SUB�A�#2 �STA�A�BYTECT �SPC�1 *BUILD�ADDRESS �SPC�1 �BSR�BADDR �SPC�1 *STORE�DATA �SPC�1 LOAD1�BSR�BYTE �DEC�BYTECT �BEQ�LOAD15 �STA�A�0,X �CMP�A�0,X �BNE�LOAD19 �INX �BRA�LOAD1 �SPC�1 *DOES�CKSM�CK? �SPC�1 LOAD15�INC�CKSM �BEQ�LOAD LOAD19�LDA�A�#'? �JSR�OUTCH �SPC�1 *BUILD�ADDRESS �SPC�1 BADDR�BSR�BYTE �STA�A�XHI �BSR�BYTE �STA�A�XLOW �LDX�XHI �RTS �SPC�1 *ƒINPUT�BYTE�(TWO�CHARACTERS) �SPC�1 BYTE�BSR�INHEX BYTE2�ASL�A �ASL�A �ASL�A �ASL�A �TAB �BSR�INHEX �ABA �TAB �ADD�B�CKSM �STA�B�CKSM �RTS �SPC�1 *INPUT�HEX�CHARACTER INHEX�JSR�INCHNP INHEX2�SUB�A�#$30 �BMI�XBG �CMP�A�#$9 �BLE�IN1HG �CMP�A�#$11 �BMI�XBG �CMP�A�#$16 �BGT�XBG �SUB�A�#7 IN1HG�RTS �SPC�1 �END �CMP�A�#$16 �BGT�XBG �SUB�A�#7 IN1HG�RTS �SPC�1 �END ! @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ú€�NAM�VIEW �OPT�O �ORG�$F9F *MOD�TO�EDOS�TO�LIMIT�LINES�PRINTED�BY�CDIR�OR�CLIST *NUMBER�IS�ENTERED�0-F�TO�PRINT�MORE *�MERGE�WITH�EDOS�TO�USE *�FOR�USE�WITH�EXBUG *WRITTEN�BY�JOHN�CONNERS�FOND�DU�LAC�WISC. *MODIFIED�BY�W.C.WRAY�8/12/6 �SPC�3 AECHO�EQU�$FF53�EXBUGS�ECHO�FLG CBCDHX�EQU�$F006 INCHNP�EQU�$F015 OUTCH�EQU�$F018 �SPC�2 LINES�PSH�A �PSH�B �DEC�COUNT �BNE�PCR �LDA�A�AECHO �PSH�A �INC�AECHO GTHX�JSR�INCHNP �JSR�CBCDHX �BMI�GTHX �STA�A�COUNT �PUL�A� �STA�A�AECHO PCR�PUL�B �PUL�A �RTS �SPC�3 OUTCHX�CMP�A�#$A �BNE�OUT1 �BSR�LINES OUT1�JMP�OUTCH �SPC�2 COUNT�FCB�8 �ORG�$6AD �FDB�OUTCHX �SPC�2 �ORG�$808 �FDB�OUTCHX �SPC�2 �ORG�$20 �JMP�$26 �SPC�1 �ORG�$26 �LDA�A�#5 �STA�A�COUNT �JMP�$15F �SPC�1 �END @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ü€ �NAM�SAVE *PROGRAM�TO�MOVE�MEMORY�TO�DISC *FOR�USE�WITH�EXBUG�AND�EDOS�2.2 *PGM�IS�LOADED�OVER�CTAPE�ROUTINE *EDOS�IS�THEN�REENTERED�(AT�20;G) *COMMAND�IS�(SAVE,FILENAME) *W.C.WRAY�7/3/76 �SPC�1 �OPT�O,NOG �SPC�2 PDATA1�EQU�$F027 BEGA�EQU�$FF0A ENDA�EQU�$FF0C TW�EQU�$FF5A MCONT�EQU�$FF58 TEMP�EQU�$FF07 BEGEND�EQU�$F003 �SPC�1 XWRT�EQU�$E80C �ORG�$219 �SPC�1 �FCC�"SAVE�" �SPC�2 �ORG�$A37 �SPC�3 MOVE�JSR�BEGEND �SPC�3 *OUTPUT�MEMORY�IN�MOTOROLA�OBJECT�FORM �SPC�2 MOVE1�LDX�BEGA �STX�TW MOVE2�LDA�A�ENDA+1 �SUB�A�TW+1 �LDA�B�ENDA �SBC�B�TW �BNE�MOVE3 �CMP�A�#32 �BCS�MOVE4 MOVE3�LDA�A�#31 MOVE4�ADD�A�#4 �STA�A�MCONT�FRAME�COUNT �SUB�A�#3'  �STA�A�TEMP�BYTE�COUNT �SPC�3 *OUTPUT�S1�MESSAGE �SPC�2 �LDX�#S1MSG �JSR�PDATA3 �CLR�B�ZERO�CKSM �SPC�3 *OUTPUT�FRAME�COUNT �SPC�2 �LDX�#MCONT �BSR�MOVE6 *OUTPUT�ADDRESS �LDX�#TW �BSR�MOVE6 �BSR�MOVE6 *�OUTPUT�DATA �LDX�TW MOVE7�BSR�MOVE6�ONE�BYTE�(2�FRAMES) �DEC�TEMP�DEC�BYTE�COUNT �BNE�MOVE7 �STX�TW �COM�B �PSH�B �TSX �BSR�MOVE6�OUTPUT�CKSM �PUL�B �LDX�TW �DEX �CPX�ENDA �BNE�MOVE2 �LDX�#S9MSG �BSR�PDATA3 �RTS �SPC�3 *WRITE�2�HEX�CHAR-UPDATE�CKSM�SPC�2 MOVE6�ADD�B�X �SPC�1 OUT2H�LDA�A�X �BSR�OUTHL �LDA�A�X�GET�BYTE�AGAIN �INX �BRA�OUTHR�R�HEX�+‚RTS �SPC�3 OUTHL�LSR�A �LSR�A �LSR�A �LSR�A �SPC�2 OUTHR�AND�A�#$F �ADD�A�#$30 �CMP�A�#$39 �BLS�XWRT2 �ADD�A�#7 �SPC�1 XWRT2�JMP�XWRT1 �SPC�1 S1MSG�FCB�$D,$A,0,'S,'1,4 �SPC�1 S9MSG�FCB�$D,$A,0,'S,'9,'0,'3,'0,'0,'0,'0,'F,'C,$D,4 �SPC�1 PDATA4�BSR�XWRT1 �INX PDATA3�LDA�A�X �CMP�A�#4 �BNE�PDATA4 �RTS �SPC�3 XWRT1�STX�SVX �PSH�B �JSR�XWRT �PUL�B �LDX�SVX �RTS �SPC�1 SVX�RMB�2 �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ƒNAM�PROM 01�*�CONVERTS�WEATHERFORD�FORMATTED�PROM�TAPES�TO 02�*�BINARY‚FOR�DATA�I/O�PROM�PROGRAMMER 03�*�WEATHERFORD�FORMAT�IS 04�*�W000�0010�0111�1111�0101�0011�0000�1101�1000 05�*�W008�1110�0001�0000�1110�1001�1000�1110�0100 06�*�OR 07�*�W000�11000011�01011001�00011000�00000000 08�*�W004�11110000�00110011�11111000�11000011 11ƒOPT�O,S 12�OUTCH�EQU�$F9DC 13�INCHNP�EQU�$FAA0 14�AECHO�EQU�$FF53 15�MTTYSO�EQU�$FCF4 16ƒORG�$1000 20�START�JSR�PNON 25ƒJSR�PNLDR 30ƒJSR�READON 35�L1ƒJSR�READP 40‚CMPA�#'W 45‚BNE�L1 50�L2‚JSR�READP 55‚CMPA�#$20 60‚BNE�L2 65‚LDAA�#$FF 70‚JSR�OUTCH 75�LOOP�CLRB 85�L4‚JSR�READ 90‚CMPA�#$31 95‚BEQ�L3 100‚CMPA�#$30 105‚BEQ�L7 125‚JSR�PUN 130‚CMPA�#$20 135‚BEQ�LOOP 140‚CMPA�#$0D 145‚BNE�L1 150�L5‚JSR�READ 155ƒCMPA�#'W 160ƒBNE�L5 165�L6‚JSR�READ 170ƒCMPA�#$20 175ƒBNE�L6 180ƒBRA�LOOP 185�L3‚ASLB 186ƒINCB 190ƒBRA�L4 191�L7ƒASLB 192…BRA�L4 195�PNON‚PSHA 196…LDAA�#$12‚TURN�PUNCH�ON 200ƒJSR�OUTCH 205ƒPULA 206†RTS 210�PNLDR‚LDAB�#$19‚PUNCH�LEADER 215�PNULL‚CLRA 220ƒJSR�OUTCH 225ƒDECB 230‚BNE�PNULL 235‚RTS 240�READON‚LDAA�#$55‚TURN�READER�ON 245ƒSTAA�MTTYSO 250ƒLDAA�#$11 255ƒJSR�OUTCH 260„RTS 265�READ‚SECƒREAD�1�CHAR,�NO�PUNCH 270ƒROL�AECHO‚SET�NON�ECHO�FLAG 275�READP‚JSR�INCHNP 280„CMPA�#$7F 285ƒBEQ�READP‚IGNORE�RUBOUTS 290ƒRTS 295�PUN‚PSHAƒPUNCH�BINARY 300ƒTBA 301…JSR�OUTCH 310ƒCMPA�#$14 312ƒPULA 315ƒBNE�PUN1 320ƒJMP�PNON‚BINARY�CHAR�TURNED�PUNCH�OFF 325�PUN1�RTS 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@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%€%‚NAM�MEMOVE *�M.MEITIN *�MOTOROLA�INC * *�THIS�PROGRAM�REASSEMBLES�A�BLOCK�OF�CODE�FROM *�ONE�LOCATION�IN�MEMORY�TO�ANOTHER�WITHOUT�THE *�NEED�TO�REASSEMBLE�SOURCE�PROGRAMS�WHICH�ARE *�OFTEN�UNAVAILABLE. *�OPTIONALLY�THE�PROGRAM�CAN‚MOVE�THE *�BLOCK�WITHOUT�ALTERATION�SO�THAT‚ITS�MEMORY *�SPACE�CAN�BE�TEMPORARILY�CLEARED�FOR�OTHER�USE *�WITHOUT�LOSS�OF�CODE. * *�FEATURES: * *�IF�A* TTEMPT�MADE�TO�WRITE�INTO�ROM�OR�NON�EXISTENT *�MEMORY,�AN�ERROR�MESSAGE�GENERATED * *�THIS�PROGRAM�CAN�ALSO�REASSEMBLE�ITSELF� *�AT�A�DIFFERENT�LOCATION *�IT�BEGINS�AT�$2000 *�AND�ENDS�AT�$22C9�WITH�TABLES�BEGINNING�AT�$2191�. * *�PROGRAM�HAS�BEEN�WRITTEN�FOR�EXBUG�1.2 *�FOR�USE�WITH‚EXBUG1.1�SIMPLY�CHANGE�FOLLOWING *�LOCATIONS�FROM�61�TO�64�OR�SOURCE�STATEMENT *�BADDR�EQU�$F964;2011,201F,202D,20BA * *�OPERATION: *� *�1.�AT�THE�APPROPRIATE�PROMT,�ENTER�THE�CURRENT *„BEGINNING�AND�ENDING�LOCATIONS�OF�THE�ENTIRE *…PROGRAM�INCLUDING�THE�TABLES/DATA/MESSAGES�ETC. * *�2.�ENTER‚NEW�BEGIN�LOCATION *„PROGRAM�WILL�CALC.�AND�PRINT�NEW�END�LOCATION. * *�3.�ENTER�OPTION�TO�REASSEMBLE(R)�OR�MOVE(M) *„IF�REASSEMBLE�OPTION�CHOSEN,PROGRAM�REQUESTS *„BEGIN�ADDRESS�OF�TABLES/DATA�ETC.�IF�NONE�THEN *„ENTER�THE�OLD�END�LOCATION.PURPOSE�IS�TO�MOVE *„TABLES/DATA�ETC�AS�UNALTERED�BLOCK. * *�4.�NOTE:�PROGRAM�ASSUMES�CODING�IS�IN�A�CONTINUOUS� *„BLOCK�UP�TO�THE�TABLES�WHEN�IN�THE�REASSEMBLE *„MODE.IF�CODED�SECTION�IS�FRAGMENTED�WITH�DATA�INSERTED *„IN�BETWEEN�CODED�SECTION,THEN�RELOCATION�MUST *„BE�PERFORMED�IN�SEGMENTS�SO�THAT�DATA�IS�NOT *„INTERPRETED�AS�CODE�OR�VICE�VERSA * �OPT�O �OPT�S �OPT�NOG �ORG�$2000 �LDX�#MSG1 �JSR�PDATA STRT�LDX�#MSG2 �JSR�PDATA‚FORM�OLD�BOUNDS �LDX�#OBEG �JSR�BADDR �BMI�STRT OLOC�LDX�#MSG9 �JSR�PDATA �LDX�#OEND �JSR�BADDR �BMI�OLOC NLOC�LDX�#MSG3‚NEW�BEGIN�ADDR �JSR�PDATA �LDX�#NBEG �JSR�BADDR �BMI�NLOC �LDA�A�NBEG �LDA�B�NBEG+1 �SUB�B�OBEG+1 �SBC�A�OBEG �STA�A�OFSET �STA�B�OFSET+1 �LDA�A�OEND‚CALC�NEW�END�ADDR �LDA�B�OEND+1 �SUB�B�OBEG+1 �SBC�A�OBEG �ADD�B�NBEG+1 �ADC�A�NBEG �STA�A�NEND �STA�B�NEND+1 �LDX�#MSG4‚PRINT�NEW�END �JSR�PDATA �LDX�#NEND �JSR�OUT4HS MODE�LDX�#MSG5‚REASSEMBLE/MOVE? �JSR�PDATA �JSR�INCH �CMP�A�#$52‚R? �BEQ�RELOC‚ �CMP�A�#$4D‚M? �BNE�MODE �STS�ADDR5‚SAVE�STACK �LDS�OBEG �DES �LDX�NBEG MOV�PUL�A‚MOVE�BLOCK �STA�A�0,X �CMP�A�0,X �BNE�MEMER �INX �CPX�NEND �BNE�MOV �PUL�A �STA�A�0,X �CMP�A�0,X �BNE�MEMER �LDS�ADDR5‚RESTORE�STACK CONT�LDX�#MSG6 �JSR�PDATA‚CONTINUE? �JSR�INCH �CMP�A�#$59‚Y? �BEQ�STRT1 �CMP�A�#$4E‚N? �BNE�CONT �JMP�EXBUG STRT1�JMP�STRT RELOC�LDX�#MSG7‚BEG�TABLES? �JSR�PDATA �LDX�#BSYT �JSR�BADDR �BMI�RELOC �LDX�BSYT �DEX ‚STX�BSYT �LDA�A�BSYT‚NEW�BEG�SYM�TABLE �LDA�B�BSYT+1 �SUB�B�OBEG+1 �SBC�A�OBEG �ADD�B�NBEG+1 �ADC�A�NBEG �STA�A�NBSYT �STA�B�NBSYT+1 �STS�ADDR5‚SAVE�STACK �LDS�OBEG �DES �LDX�NBEG RELOC2�CPX�NBSYT‚END�CODE�SECT? �BEQ�MOVTAB �PUL�A �STA�A�0,X �CMP�A�0,X‚VERIFY �BEQ�DECODE MEMER�STX�XMOV �LDS�ADDR5 �LDX�#MSG8‚MEM�FAILED�AT �JSR�PDATA �LDX�#XMOV �JSR�OUT4HS �JMP�STRT DECODE�INX �CPX�NBSYT� �BEQ�MOVTAB �CMP�A�#$5F �BGT�NSB‚NOT�SINGLE�BYTE�INST. �CMP�A�#$30 �BLT�TST2 �JMP�RELOC2‚1�BYTE MOVTAB�JMP�MOV TST2�CMP�A�#$1B �BGT�PDUAL‚2�BYTE�REL? �JMP�RELOC2 NSB�STX�XMOV‚SAVE�X�FOR�SRCH �LDX�#OPTAB‚SRCH�3�BYTE�TABLE �LDA�B�#$FF SRCH�CMP�A�0,X �BEQ�TBOP �CMP�B�0,X‚END�TABLE? �BEQ�DUAL‚2�BYTE�BY�DEFAULT �INX �JMP�SRCH DUAL�LDX�XMOV PDUAL�PUL�A �STA�A�0,X �CMP�A�0,X �BNE�MEMER �INX �JMP�RELOC2 TBOP�LDX�XMOV‚ABSOLUTE? �PUL�A �PUL�B �DES �DES �SUB�B�OBEG+1 �SBC�A�OBEG �BLT�NOALT‚ABSOLUTE �PUL�A �PUL�B �DES �DES �SUB�B�OEND+1 �SBC�A�OEND �BGT�NOALT‚ABSOLUTE �PUL�A �PUL�B‚NOT�ABS�CALL�OFSET �ADD�B�OFSET+1‚&�MOVE �ADC�A�OFSET �STA�A�0,X �CMP�A�0,X �BNE�MFAIL �INX �CPX�NBSYT �BEQ�MOVTAB �STA�B�0,X �CMP�B�0,X �BNE�MFAIL �INX �JMP�REL+ OC2 MFAIL�JMP�MEMER NOALT�PUL�A‚ABSOLUTE�-�MOVE�NO� �STA�A�0,X‚CHANGE �CMP�A�0,X �BNE�MFAIL �INX �PUL�A �STA�A�0,X �CMP�A�0,X �INX �JMP�RELOC2 PDATA�EQU�$F024 EXBUG�EQU�$F564 BEGEND�EQU�$F003 BADDR�EQU�$F961 OUT4HS�EQU�$F01E BEGA�EQU�$FF0A ENDA�EQU�$FF0C OBEG�FDB�0 OEND�FDB�0 NBEG�FDB�0 NEND�FDB�0 OFSET�FDB�0 INCH�EQU�$F015 ADDR5�FDB�0 BSYT�FDB�0 NBSYT�FDB�0 XMOV�FDB�0 MSG1�FCB�$0A,$0D �FCCƒ/*********�PROGRAM�CODE�REASSEMBLER�*****/ �FCB�$0D,�$0A,�$0A,�$04 MSG2�FCC�/OLD�BEGIN�ADDR?�/‚ �FCB�$04 MSG3�FCC�/NEW�BEGIN�ADDR?�/ �FCB�$04 MSG4�FCC�/NEW�END�ADDR�IS�/ �FCB�$04,�$0A,�$04 MSG5�FCC�/REASSEMBLE�(R)�OR�TEMP�MOVE�(M)?�/ �FCB�$04 MSG6�FCC�/CONTINUE�YES�(Y)�OR�NO�(N)?�/ �FCB�$04 MSG7�FCC�/ENTER�BEG�TABLES�-�DATA�/ �FCB�$0D,�$0A �FCC�/IF�NONE�ENTER�OLD�END�ADDR�/ �FCB�$04 MSG8�FCC�/MEMORY�FAILED�AT�/ �FCB�$04 MSG9�FCC�/OLD�END�ADDR?�/ �FCB�$04 OPTAB�FCB�$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 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@€�NAM�PNGEN �OPT�O,NOM *�PRINTS/PUNCHES�MEMORY�CONTENTS�IN� *ƒBPNPNPNPNF�FORMAT�FOR�INPUT�TO� *ƒPROM�PROGRAMMER.‚ALLOWS�INPUT *ƒOF�USER�COMMENTS�BEFORE�BEGINNING, *ƒEOT�CHARACTER�($04)�TO�CONTINUE. *ƒUSER�MUST�MANUALLY�TURN�PUNCH�ON *ƒAND�OFF,�AND�GENERATE�LEADER/TRAILER. *ƒPROGRAM�WAITS�FOR�EOT�CHARACTER�FROM *ƒTTY�KEYBOARD�BEFORE�RETURNING�TO�MAID. *� PDATA�EQU‚$F024‚EQUATES�FOR�EXBUG�ROUTINES PDATA1�EQU‚$F027‚ INADDR�EQU‚$F00F PCRLF�EQU‚$F021 INCHNP�EQU‚$F015 OUT4HS�EQU‚$F01E OUTCH�EQU‚$F018 PSPACE�EQU‚$F02A RENTER�EQU‚$F0F9 BEGAR�EQU�$FF0A ENDAR�EQU�$FF0C BEGAT�EQU�$FF0E‚TAPE�CURRENT�ADDRESS †ORG�$2700 †LDX�#MMEM‚ADDR�OF�MESSAGE�(MEM) †JSR�PDATA‚PRINT�MESSAGE †LDX�#MBEG‚ADDR�OF�MESSAGE�(BEGIN�ADDR) †JSR�PDATA1� †LDX�#BEGAR‚PLACE�TO�STORE�INPUT�ADDR �JSR�INADDR�WAIT�FOR�INPUT,�STORE�ADDR �LDX�#MMEM�ADDR�OF�MESSAGE �JSR�PDATA1� �LDX�#MEND�ADDR�OF�MESSAGE�(END�ADDR) �JSR�PDATA1� �LDX�#ENDAR�PLACE�TO�STORE�FINAL�ADDR. �JSR�INADDR�GET�ADDR �LDX�#MTAPE� �JSR�PDATA1 �LDX�#BEGAT� �JSR�INADDR�*GOT�DATA�&�TAPE�LOCATIONS �JSR�PCRLF� TITLE�JSR�INCHNP�HEADER�LOOP �CMP�A�#4�=EOT �BNE�TITLE� NLINE�JSR�PCRLF�NEW�LINE �LDX�#BEGAT�PRINT �JSR�OUT4HS�TAPE�ADDRESS �LDA�B�#4�BYTE�COUNTER ONE�LDA�A�#'B�PREFIX�CHAR �JSR�OUTCH �BSR�PNOUT�PRINT�BIT�PATTERN �LDA�A�#'F�SUFFIX�CHAR �JSR�OUTCH �JSR�PSPACE �LDX�BEGAR�CURRENT�MEMORY�ADDR �CPX�ENDAR�FINAL�MEMORY�ADDR �BEQ�QUIT �INX �STX�BEGAR�UPDATE�CURRENT�MEMORY�ADDR �LDX�BEGAT�CURRENT�TAPE�ADDR �INX� �STX�BEGAT�UPDATE�IT� �DEC�B�UPDATE�BYTE�COUNT�(4/LINE) �BNE�ONE �BRA�NLINE QUIT�JSR�PCRLF TRAIL�JSR�INCHNP�WAIT�FOR�USER�TO�STOP �CMP�A�#4 �BNE�TRAIL�TAPE�PUNCH�AND�TYPE�EOT�CHAR �JMP�RENTER�GO�BACK�TO�MAID PNOUT�PSH�B �LDA�A�#8�8�BITS/BYTE �LDX�BEGAR �LDA�B�X�ACCB=CURRENT�BYTE LOOP�PSH�A �LDA�A�#'N �ROL�B�SHIFT�BIT�INTO�CARRY �BCC�OUT�NO�CARRY�MEANS�BIT�WAS�0 �LDA�A�#'P OUT�JSR�OUTCH�PRINT�IT� �PUL�A �DEC�A �BNE�LOOP�UNTIL�DONE�8�BITS �PUL�B �RTS MMEM�FCC�4,MEM �FCB, �4�EOT MTAPE�FCC�5,TAPE MBEG�FCC�11,BEGIN�ADDR �FCB�4�EOT MEND�FCC�9,END�ADDR �FCB�4�EOT �END @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@I€I10‚NAM�NIM 20‚OPT�O,S,NOG 30‚SPC�2 40�************************************** 50�*�NIM�GAME�PROGRAMMER�D.J.�MCCARROLL�* 60�************************************** 70�*� 80�*�THIS�PROGRAM�PLAYS�A�GAME�OF�NIM�AGAINST 90�*�A�HUMAN�OPPONENT�ON�A�TELETYPE�. 100�*�THE�GAME�CONSISTS�OF�3�ROWS�OF�X'S�WITH 110�*�3,5,7,�X'S�TO�ROWS�A,B�AND�C�RESPECTIVLY. 120�*�THE�OBJECT�OF�THE�GAME�IS�TO�LEAVE�YOUR 130�*�OPPONENT�WITH�THE�LAST�X.�EACH�OF�THE�TWO 140�*�PLAYERS�ALTERNATELY�REMOVES�A�NUMBER�OF�X'S 150�*�FROM�THE�ROWS.�EACH�PLAYER�MUST�TAKE�AT 160�*�LEAST�ONE�X�ON�A�TURN,�AND�HE�CAN�ONLY 170�*�TAKE�X'S�FROM�ONE�ROW�AT�A�TIME. 180�* 190�*�THE�ALGORITHYM�THE�MPU�USES�IS�THIS: 200�*� 210�*‚1)�THE�GAME�IS�BROKEN�DOWN�INTO�THREE 220�*…SECTIONS 230�*†A)�EARLY�GAME 240�*†B)�MID�GAME�-�ALL�ROWS�HAVE�ONE�OR 250�*‰LESS�X�LEFT 260�*†C)�END�GAME�-�ONLY�ONE�X�IS�LEFT 270�*‚2)�THE�NUMBER�OF�X'S�IN�EACH�ROW�IS�IN�BIN. 280�*‚3)�THE�"GOAL"�MOVES�IN�EARLY�GAME�ARE 290�*…THOSE�MOVES�THAT�LEAVE�THE�RESULT�OF 295�*…THE�EXCLUSIVE�"OR"�OF�ALL�COLUMNS� 300�*†EQUAL�TO�ZERO 310�*‚4)�THE�"GOAL"�MOVES�IN�MID�GAME�ARE 320�*…THOSE�MOVES�THAT�LEAVE�THE�RESULT�OF 330�*…THE�EXCLUSIVE�"OR"�OF�ALL�COLUMNS�EQUAL 340�*…TO�ONE 350�* 360�*�BY�ANALYSIS�OF�STATEMENTS�3�AND�4�ABOVE 370�*�IT�CAN�BE�SEEN�THAT�IF�THE�MPU�MOVES� 380�*�FIRST�IT�CAN�NOT�LOSE;�BECAUSE�THE� 390�*�STATEMENTS�WILL�BE�MADE�TRUE�BY�THE�MPU 400�*�AND�ANY�FURTHER�MOVES�WILL�MAKE�THEM�FALSE 410�* 420�*�TO�MAKE�THE�GAME�MORE�INTERESTING,�THE 430�*�MPU�COMMENTS�WHEN�TYPING�ERRORS�ARE 440�*�MADE�OR�WHEN�IT�WINS�. 450�*�ALL�GOAL�MOVES�ARE�STORED�ON�A�LIST�AND 460�*�ONE�IS�PICKED�AT�RANDOM�BY�THE�MACHINE. 470�*�IF�THERE�ARE�NO�GOAL�SOLUTIONS�(WHEN�THE 480�*�HUMAN�IS�WINNING)�THE�MPU�RANDOMLY 490�*�DECREMENTS�A�ROW.�THEREFORE�THE�MACHINE 500�*�DOES�NOT�NECCESSARILY 510�*�PLAY�THE�SAME�GAME�TWICE. 200‚PAGE 210�*�DATA�STORAGE�TABLE�* 220‚SPC�1 230�TEMP�RMB�1�TEMPORARY�SCRATCH� 240�CCOL�RMB�1�C�COLUMN�X�COUNT 250�BCOL�RMB�1�B�COLUMN�X�CUONTER 260�ACOL�RMB�1�A�COLUMN�X�COUNTER 270�ERROR�RMB�1�ERROR�COUNTER 280�MYMOVE�RMB�1�WHO�MOVES 285�LOSES�RMB�1�LOSS�COUNTER 286�RANDOM�RMB�2�RANDOM�NUMBER 287�ULOS�RMB�2�DECIMAL�LOSS�COUNT 286�GOAL�RMB�3�GOALS 290‚SPC�1 290�STAT�EQU�$FCF4�EXBUG�TTY�STATUS 295�TTYIO�EQU�$FCF5�EXBUG�TTY�I/O 300�OUCH�EQU�$F018�EXBUG�OUTPUT�ROUTINE 330‚ORG�$2000 340�*�PROGRAM�EXECUTED�STARTING�HERE�* 350‚SPC�1 354‚LDS�#$100 355‚CLR�LOSES 355‚CLR�ULOS 360‚LDX�#MSG1�RULES�REQUEST 370‚JSR�PRNT 380‚JSR�INEE 390‚CMPA�#'Y 400‚BNE�START�IF�"Y"�RESPONCE�TYPE�RULES 410‚LDX�#MSG2�RULES 420‚JSR�PRNT 430‚SPC�1 440�START�EQU�* 450‚SPC�1 460�*�SET�UP�THE�BOARD�* 470‚SPC�1 480‚LDAA�#7 490‚STAA�CCOL�7�X'S�IN�C 500‚LDAA�#5 510‚STAA�BCOL�5�- X'S�IN�B 520‚LDAA�#3 530‚STAA�ACOL�3�X'S�IN�A 535‚JSR�BOARD�OUTPUT�THE�BOARD 540‚SPC�1 550‚CLR�MYMOVE�INITIALIZE�MOVE�POINTER 580‚SPC�1 590�*�ASK�WHO�GOES�FIRST�AND�RESPOND�ACCORDINGLY 600‚SPC�1 610‚LDX�#MSG3�WHO�MOVES�1ST? 620‚JSR�PRNT 630�RESPON�JSR�INEE 640‚CMPA�#'Y 650‚BEQ�BEGIN�YES�YOU�MOVE�1ST 660‚CMPA�#'N 670‚BEQ�BEGIN1�NO�I�MOVE�1ST 680‚LDX�#MSG4�ERROR�INPUT 690‚JSR�PRNT 700‚BRA�RESPON 710‚SPC�1 720�BEGIN1�COM�MYMOVE�REVERSE�MOVE�POINTER 730�BEGIN�LDAA�ACOL�TEST�FOR�END�GAME 740‚ADDA�BCOL 750‚ADDA�CCOL 760‚CMPA�#1 770‚BNE�MYTEST 780‚JMP�END�GAME�ENDED 790�MYTEST�TST�MYMOVE�FIND�OUT�WHO'S�MOVE�IT�IS 800‚BEQ�IMOVE 810‚JMP�UMOVE 800‚SPC�1 801�*�TTY�INPUT�ROUTINE�AND�RANDOM�#�GEN.�* 802‚SPC�1 803�INEE�LDAA�RANDOM+1 804‚INCA 805‚CMPA�#3 806‚BNE�NZERO 807‚CLRA 808�NZERO�STAA�RANDOM+1 809‚LDAA�STAT 810‚BITA�#1 820‚BEQ�INEE 825‚CLR�RANDOM 830‚LDAA�TTYIO 840‚ANDA�#$7F 850‚JSR�OUCH 860‚RTS 820‚SPC�1� 830�*�MOVE�DECISION�ROUTINE�* 840‚SPC�1 850�IMOVE�LDX�#MSG5�PRINT�MY�MOVE 860‚JSR�PRNT 870‚LDAA�ACOL 880‚EORA�BCOL 890‚EORA�CCOL 900‚STAA�TEMP�FIND�"MAGIC"�NUMBER 910‚BNE�WIN�IF�NOT�0�AND�NOT�MID�GAME 920‚BSR�TEST�I�WILL�WIN�THE�GAME 930‚BCC�WIN 940‚SPC�1 950�*�FUDGE�A�MOVE�IF�LOSING�* 960‚SPC�1 970‚LDAA�#1 980‚STAA�TEMP‚FORCE�1�X�REMOVAL 990‚SPC�1 1000�WIN�LDX�#4�FIND�GOAL�SOLUTIONS 1010‚LDAA�#$FF 1020‚STAA�GOAL�ZERO�OLD�GOALS 1030‚STAA�GOAL+1 1040‚STAA�GOAL+2 1050�NEXT�DEX 1060‚BEQ�PICK1� 1070‚LDAA�X�FIND�A�GOAL 1080‚EORA�TEMP 1090‚CMPA�X 1100‚BGE�NEXT 1110‚STAA�GOAL-1,X�STORE�THE�GOAL�ON�LIST 1120‚BRA�NEXT 1130‚SPC�1 1140�PICK1�LDX�RANDOM�PICK�A�GOAL�AT�RANDOM 1150‚INX 1165‚INX 1166�NXT�DEX 1170‚LDAA�GOAL-1,X�IS�THIS�A�GOAL? 1180‚CMPA�#$FF 1190‚BNE�GOLFND�IF�TRUE�YES 1200‚CPX�#$1 1210‚BNE�NXT�IF�FALSE�GOAL�NOT�IN�RANGE 1220‚LDX�#4�OF�RANDOM�POINTER�SO�FIND�ANY�GOAL 1230�NXT1�DEX 1240‚BEQ�FUDGE1 1250‚LDAA�GOAL-1,X 1260‚CMPA�#$FF 1270‚BEQ�NXT1 1280‚SPC�1 1290�GOLFND�STAA�X�STORE�GOAL�ON�BOARD 1300‚BSR�TEST 1310‚BCS�FUDGE�THIS�GOAL�OK�IF�TRUE 1320‚TST�X�MODIFY�GOAL 1330‚BNE�CLR�CLEAR�IF�NONZERO 1340‚INC�X�SET�TO�ONE�IF�IS�ZERO 1350�FUDGE�JMP�TABLE 1360�CLR�JMP�CLEAR 1370‚SPC�1 1380�FUDGE1�LDX�RANDOM�PICK�A�RANDOM�FUGDED�MOVE 1390‚INX 1400�NXT2�DEX 1410‚BEQ�FUDGE2�IF�TRUE�OUT�OF�RAND.�RANGE 1420‚LDAA�X 1430‚BEQ�NXT2�IF�TRUE�COLUMN�ALREADY�ZERO 1440‚DEC�X� 1450‚JMP�TABLE 1460�FUDGE2�LDX�#4 1470‚BRA�NXT2 1230‚SPC�1 1240�TEST�LDAA�ACOL�TEST�FOR�MID�GAME 1250‚ORAA�BCOL�(ALL�COLUMNS�1�OR�LESS) 1260‚ORAA�CCOL 1270‚BIT�A�#$FE 1280‚BNE�ISMID 1290‚CLC 1300‚RTS 1310�ISMID�SEC 1320‚RTS 1330‚SPC�1 1340�END�LDAA�MYMOVE�FIND�OUT�WHO�LOST 1350‚BNE�ULOSE 1360‚LDX�#MSG6 1370�ENDD�JSR�PRNT 1380‚JMP�START 1381�ULOSE‚LDAA�ULOS 1382‚ADDA�#1 1383‚DAA 1384‚TAB 1380‚STAA�ULOS 1385‚ANDA�#$0F 1386‚ORAA�#$30 1387‚STAA�LOSCNT+1 1388‚LSRB 1389‚LSRB 1390‚LSRB 1391‚LSRB 1392‚ORAB�#$30 1393‚STAB�LOSCNT 1390‚LDAA�LOSES�GET�LOSS�COUNT 400‚INCA 410‚STAA�LOSES 420‚LDX�#LOSMSG 430�SRCH�INX 440‚INX 445‚CPX�#MAXLOS 446‚BNE�SRCH1 447‚LDX�#LASTL 448‚BRA�LLOSS 450�SRCH1�DECA 460‚BNE�SRCH 470�LLOSS�LDX�X�GET�LOSS�MESSAGE 480‚BRA�ENDD 1410‚SPC�1 1420�*�INPUT�THE�PLAYERS�MOVE�* 1430‚SPC�1 1440�UMOVE�LDX�#MSG8�PRINT�YOUR�MOVE 1450‚JSR�PRNT 1460‚LDX�#4 1470‚JSR�INEE 1480‚EORA�#$40 1490�LOOK�DEX�ACCEPT�A,B,C�ONLY 1500‚BEQ�WRONG 1510‚DECA�SET�X�TO�1,2,3�ACCORDINGLY 1520‚BNE�LOOK 1530‚JSR�INEE�GET�SECOND�INPUT�CHAR. 1540‚EO. R�A�#$30�ACCEPT�NUMBERS�ONLY 1550‚BEQ�WRONG�EXCLUDING�0 1560‚CMPA�#8�AND�8,9 1570‚BPL�WRONG 1580‚TAB�SAVE�NO.�IN�ACCB 1590‚LDAA�X�GET�COLUMN�TO�BE�CHANGED 1600‚SBA�SUBTRACT�NO.� 1610‚BPL�MOVIT 1620�WRONG�INC�ERROR 1635‚LDAA�ERROR 1640‚LDX�#ERMSG 1650�SEARCH�INX 1660‚INX 1665‚CPX�#MAXERR 1666‚BNE�SERCH1 1667‚BRA�SEARCH-3 1670�SERCH1�DEC�A 1680‚BNE�SEARCH 1690‚LDX�X�FIND�NEXT�ERROR�MESSAGE 1700‚JSR�PRNT�PRINT�ERROR�MESSAGE 1710‚BRA�UMOVE 1720‚SPC�1 1720�CLEAR�CLRA 1721�MOVIT�STAA�X�MAKE�MOVE 1722�TABLE�BSR�BOARD 1723‚JMP�BEGIN1 1724‚SPC�1 1730�BOARD�LDX�#1�PRINT�OUT�THE�BOARD 1740‚BSR�RET 1750‚LDX�#3 1760‚LDAA�#'A 1770�LOOP�STAA�TEMP 1780‚JSR�OUCH 1790‚LDAA�#$20�SPACE 1800‚JSR�OUCH 1810‚LDAA�#'X 1820‚LDAB�X 1830�LOOP1�BEQ�RET 1840‚JSR�OUCH 1850‚DECB 1860‚BRA�LOOP1 1870�RET�LDAA�#$0D�CR 1880‚JSR�OUCH 1890‚JSR�OUCH 1900‚LDAA�#$0A�LINEFEED 1910‚JSR�OUCH 1920‚LDAA�TEMP 1930‚INCA 1940‚DEX 1950‚BNE�LOOP 1960‚RTS 1970‚SPC�1 1971�PRNT�LDAA�#$0D 1972‚JSR�OUCH�PRINT�CR�LNFEED 1973‚JSR�OUCH 1974‚LDAA�#$0A 1975‚JSR�OUCH 1976‚JSR�OUCH 1980�PRNT1�LDAA�X�PRINT�OUT�MESSAGE�POINTED�AT�BY�X 1990‚CMPA�#$1B�UNTIL�ESC�FOUND 2000‚BEQ�DONE 2010‚JSR�OUCH 2020‚INX 2030‚BRA�PRNT1 2040�DONE�RTS 2050‚PAGE 2060�*�LIST�OF�MESSAGES�* 2070‚SPC�11 2080�MSG1�FCC�/DO�YOU�WANT�THE�RULES?�TYPE�"Y"�FOR�YES,�"N"�FOR�NO./ 2090‚FCB�$1B 2100�MSG2�FCC�/THE�RULES�ARE�AS�FOLLOWS:/ 2110‚FDB�$0D0D,$0A0A 2120‚FCC�/1)�YOU�MAY�TAKE�ANY�NUMBER�OF�X'S�FROM�A�COLUMN/ 2130‚FDB�$0D0D,$0A0A 2140‚FCC�/2)�YOU�MUST�TAKE�AT�LEAST�ONE�X�EACH�TURN/ 2150‚FDB�$0D0D,$0A0A 2160‚FCC�/3)�YOU�CAN�ONLY�TAKE�X'S�FROM�ONE�COLUMN�AT�A�TIME/ 2170‚FDB�$0D0D,$0A0A 2175‚FCC�/4)�TAKE�X'S�BY�TYPING�IN�THE�COLUMN�LETTER/ 2176‚FCB�$0D,$0D,$0A 2177‚FCC�/ƒTHEN�THE�NUMBER�OF�X'S�YOU�WISH�TO�REMOVE/ 2178‚FDB�$0D0D,$0A0A 2180‚FCC�/THE�OBJECT�OF�THE�GAME�IS�TO�LEAVE�ME�WITH�THE�LAST�X/ 2190‚FDB�$0D0D,$0A0A 2195‚FCC�/THE�BOARD�LOOKS�LIKE�THIS:/ 2196‚FDB�$0D0D,$0A1B 2200�MSG3�FCC�/DO�YOU�WANT�ME�TO�GO�FIRST?�"Y"=YES,�"N"=NO./ 2210‚FDB�$201B 2230�MSG4�FCC�/I�SAID�"Y"�OR�"N",�PIMPLE�BRAIN!/ 2240‚FCB�$1B 2250�MSG5�FCC�/MY�MOVE/ 2260‚FDB�$0A1B 2265�MSG8�FCC�/YOUR�MOVE‚/ 1266‚FCB�$1B 1270�MSG6�FCC�/YOU�WIN;�YOU�MUST�BE�LUCKY!/ 1280‚FCB�$1B 2270‚PAGE 1000�*�TABLE�OF�ERROR�MESSAGES�* 1010‚SPC�1 1020�ERMSG�EQU�*-2 1030‚FDB�MSG10 1040‚FDB�MSG11 1050‚FDB�MSG12 1060�MAXERR�EQU�* 1070‚SPC�1 1080�*�TABLE�OF�LOSS�MESSAGES�* 1090‚SPC�1 1100�LOSMSG�EQU�*-2 1110‚FDB�MSG20 1120‚FDB�MSG21 1130‚FDB�MSG22 1131‚FDB�MSG23 1132‚FDB�MSG24 1133‚FDB�MSG25 1134�LASTL�FDB�MSG26 1140�MAXLOS�EQU�* 1150‚SPC�1 1160�*�LIST�OF�ERROR�MESSAGES�* 1170‚SPC�1 1180�MSG10�FCC�/YOU�CAN'T�DO�THAT,�TURKEY!/ 1190‚FDB�$0A1B 1200�MSG11�FCC�/HOW�DO�YOU�EXPECT�TO�WIN�IF�YOU�CANT�EVEN�TYPE?/ 1210‚FDB�$0A1B 1220�MSG12�FCC�/YOU�KNOW�YOUR�PRETTY�BRIGHT�FOR�A�DIM�BULB!/ 1225‚FDB�$0A1B 1230‚SPC�1 1240�*�LIST�OF�LOSS�MESSAGES�* 1250‚SPC�1 1270�MSG20�FCC�/YOU�LOSE,�TOAD!/ 1280‚FDB�$0A1B 1290�MSG21�FCC�/KEEP�TRYING;�MAYBE�YOU'LL�GET�LUCKY!/ 1300‚FDB�$0A1B 1310�MSG22�FCC�/BOY!�I�SURE�AM�GLAD�I'M�NOT�BUYING�THE�PAPER!/ 1320‚FDB�$0A1B 1330�MSG23�FCC�/WHAT�YOU�NEED�IS�A�POWER�FAILURE!/ 1340‚FDB�$0A1B 1350�MSG24�FCC�/I'VE�PLAYED�DUMMIES�BEFORE,�BUT�YOU�TAKE�THE�CAKE!/ 1360‚FDB�$0A1B 1370�MSG25�FCC�/MAYBE�YOUR�BETTER�AT�TIC�TAC�TOE!/ 1380‚FDB�$0A1B 1390�MSG26�FCC�/YOU�HAVE�NOW�LOST�/ 1400�LOSCNT�RMB�2�DECIMAL�LOS/ S�FIGURES 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 X�007F�HEX. ˆBNE…POSOV ˆTST…3,X ˆBMI…POSOV ˆLDX…#BA+3ƒSET�XR�TO�ADDR�OF�POS�OFF ˆCLRAŒCLEAR�FLAG ˆRTS * ********* *NEGATIVE ********* * NEG…LDAA„X‡THIS�ROUTINE�TESTS�RESULT�FOR ˆCMPA„#$FF„VALUE�<�FF81�HEX. ˆBNE…NEGOV ˆLDAA„1,X ˆBPL…NEGOV ˆCMPA„#$80 ˆBEQ…NEGOV ˆLDX…#BA+1ƒSET�XR�TO�ADDR�OF�NEG�OFF ˆCLRAŒCLEAR�FLAG ˆRTS * ****************** *POSITIVE�OVERFLOW ****************** * POSOVƒCLR…X‡COMPUTE�POSITIVE�OVERFLOW ˆLDAA„#$7F ˆSTAA„1,X ˆBSR…SUB2 ˆLDAA„#'+…LOAD�FLAG�WITH�LITERAL�"+" ˆBRA…NEGOV1 * ****************** *NEGATIVE�OVERFLOW ****************** * NEGOV�LDAA�#$FF�COMPUTE�NEGATIVE�OVERFLOW ˆSTAA„2,X ˆLDAA„#$81 ˆSTAA„3,X ˆBSR…SUB2 ˆLDAA„#'-…LOAD�FLAG�WITH�LITERAL�"-" NEGOV1‚INX�SET�XR�TO�ADDR�OF�OVERFLOW ˆINX ˆRTS * ***************** *SUBTRACT�ROUTINE ***************** * SUB1„LDAA„#2†ADD�2�TO�BRANCH�ADDRESS ˆADDA„1,X ˆSTAA„1,X ˆLDAA„#0 ˆADCA„X ˆSTAA„X SUB2„LDAB„3,X…COMPUTE�OFFSET ˆSUBB„1,X ˆLDAA„2,X ˆSBCA„X ˆBMI…STORE ˆSTAB„3,X…STORE�POSITIVE�RESULT ˆSTAA„2,X ˆRTS STOREƒSTAB„1,X…STORE�NEGATIVE�RESULT ˆSTAA„X ˆRTS * ************************** *CARRIAGE�RETURN�LINE�FEED ************************** *FUNCTIONS:CRLF *INPUTS:NONE *OUTPUTS:CARRIAGE�RETURN,�LINE�FEED *CALLS:OUTEEE *REGS�USED:A * CRLF„LDAA„#$D ˆJSR…OUTEEE ˆLDAA„#$A ˆJSR…OUTEEE ˆRTS * ****************** *SEARCH�SUBROUTINE ****************** *FUNCTIONS:FIND *INPUTS:BA,EA,HEX�STRING�TO�BE�FOUND *OUTPUTS:BEGINNING�ADDRESS�WHERE�EACH *ˆSTRING�IS�FOUND. *CALLS:BADDR2,CRLF,INEEE,BYTE1,OUTS, *†PDATA1,OUT4HS *REGS�USED:A,B,XR,SP�;BA,EA, *ŠBA1,STACK,TABLE1 *DESCRIPTION:SEARCHES�FOR�A�HEX�STRING�IN *ŒMEMORY�BLOCK�(BA�TO�EA). *ŒAFTER�ENTERING�BA,EA,�ROUTINE *ŒRESPONDS�WITH�CRLF.�THEN�TYPE *ŒIN�HEX�STRING�(256�CHRS�MAX) *ŒFOLLOWED�BY�A�CARRIAGE�RETURN. *ŒROUTINE�WILL�SEARCH�BLOCK�AND *ŒPRINT�THE�BEGINNING�ADDRESS *ŒOF�EACH�LOCATION�STRING�IS�FOUND. *Œ%SRF�INDICATES�SEARCH�FAILS.... * FIND„JSR…BADDR2‚INPUT�BA�AND�EA ˆDEX�SET�BA�TO�PULL�FIRST�BYTE ˆSTX…BA ˆJSR…CRLF ˆLDX…#TABLE1+1 ˆCLRBŒCLEAR�BYTE�COUNTER NEXT4ƒJSR…INEEEƒBUILD�STRING�TO�BE�FOUND ˆCMPA„#$D…IS�CHR�A�CARRIAGE�RETURN ˆBEQ…F1 ˆJSR…BYTE1ƒBUILD�2ND�HALF�OF�BYTE ˆSTAA„X ˆINX ˆINCBŒINCREMENT�BYTE�COUNTER ˆJSR…OUTS ˆBRA…NEXT4 * F1†LDX…#TABLE1 ˆSTAB„X‡STORE�BYTE�COUNTER�CONTENTS ˆBEQ…SRF * TEST1ƒLDS…BA†THIS�ROUTINE�FINDS�FIRST NEXT5ƒTSX�BYTE�IN�STRING. ˆDEX ˆCPX…EA ˆBEQ…SRF ˆLDX…#TABLE1 ˆLDAB„X ˆINX ˆPULA ˆCMPA„X ˆBEQ…TEST2 ˆBRA…NEXT5 * TEST2ƒSTS…BA†THIS�ROUTINE�FINDS NEXT6ƒDECBŒSUCCESSOR�BTYES�IN�STRING ˆBEQ…PRINT ˆSTX…BA1 ˆTSX ˆDEX ˆCPX…EA ˆBEQ…SRF ˆLDX…BA1 ˆINX ˆPULA ˆCMPA„X ˆBEQ…NEXT6ƒLOOP�AND�TEST�NEXT�BYTE ˆBRA…TEST1 * PRINTƒLDS…#STACK‚THIS�ROUTINE�PRINTS�ADDRESS ˆJSR…CRLF„OF�FIRST�BYTE�IN�STRING.. ˆLDX…#BA ˆJSR…OUT4HS ˆBRA…TEST1 * SRF…LDX…#SF ˆLDS…#STACK ˆJSR…PDATA1 ˆJMP…MONTR4 * ************ *BINARY�DUMP ************ *FUNCTIONS:BDUMP *INPUTS:BA,EA,"G"�TO�DUM> P *OUTPUTS:[SEE�DESCRIPTION] *CALLS:BADDR2,OUTEEE *REGS�USED:A,B,XR�;BA,EA *DESCRIPTION:OUTPUTS�MEMORY�BLOCK�(BA�TO�EA) *ŒIN�BINARY�FORMAT.�DUMP�IS *ŒSTARTED�BY�TYPING�G�AFTER *ŒBA�AND�EA�HAS�BEEN�ENTERED. *ŒRETURNS�TO�MONTR4�AFTER�DUMP. BIDUMP‚JSR…BADDR2 ˆJSR…CRLF BD1…JSR…INEEE ˆCMPA„#'G…START�DUMP�IF�A�IS�"G" ˆBNE…BD1 ˆLDAB„#$10 BD2…LDAA„#0†OUTPUT�HEADER�(16�ZEROS) ˆBSR…OUTE ˆDECB ˆBNE…BD2 * ˆLDAA„#'Z…LOAD�START�CHARACTOR ˆBSR…OUTE„OUTPUT�START�CHARACTOR * ˆLDX…#BA…THIS�ROUTINE�OUTPUTS�(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‡THIS�ROUTINE�OUTPUTS�BINARY ˆBSR…OUTE„DATA�TO�TERMINAL. ˆCPX…EA ˆBEQ…STOP ˆINX ˆBRA…NEXT7 STOP„JMP…MONTR4 OUTE„JMP…OUTEEE * ************** *BINARY�LOADER ************** *FUNCTIONS:BINARY,BILOAD,SAVE,INEE, *ŠDEL1,DE1,OUT *INPUTS:BD�TO�DUMP. *‡BL�TO�LOAD. *‡BINARY�TAPES�FORMATED�BY�BIDUMP. *OUTPUTS:NONE *CALLS:INEEE,IOUT2,DE,DEL *REGS�USED:A,B,XR�;BA,EA,XTEMP *DESCRIPTION:LOADS�BINARY�FORMATED�DATA. *ŒTAPES�USING�THIS�LOADER *ŒMUST�BE�DUMPED�BY�THE�BIDUMP *ŒROUTINE�IN�MONTR4. * BINARY‚JSR…INEEE ˆCMPA„#'D ˆBEQ…BIDUMP ˆJSR…CRLF BILOAD‚BSR…INEE ˆCMPA„#'Z…FIND�START�CHARACTOR ˆBNE…BILOAD ˆLDX…#BA…SET�XR�TO�INPUT�ADDRESSES ˆLDAB„#$4…SET�BYTE�COUNTER�TO�4 BIL2„BEQ…BIL1„START�DATA�LOAD�IF�ADDRESSES ˆBSR…INEE„ARE�LOADED. ˆSTAA„X ˆINX�INCREMENT�ADDRESS�POINTER ˆDECB ˆBRA…BIL2 BIL1„LDX…BA * NEXT8ƒBSR…INEE„INPUT�AND�LOAD�DATA ˆ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 * ******************** ******************** *PROGRAM�ENTRY�POINT ******************** ******************** *FUNCTIONS:MONTR4 *INPUTS:1�ASCII�CHR�FROM�TERMINAL *OUTPUTS:"?"�FOR�ILLEGAL�COMMAND *CALLS:ALL�MONTR4�ROUTINES *REGS�USED:A,XR,SP�;MONTR4�ROUTINES�MAY *ŠUSE�ALL�REGESTORS. *DESCRIPTION:SELECTS�SUBROUTINE�IN�MONTR4 *ŒTO�BE�EXECUTED.�A�LOOK�UP *ŒTABLE�SCHEME�RATHER�THAN�A *ŒCOMPARE�SCHEME�IS�USED�TO�FIND *ŒTHE�CORRECT�ROUTINE�TO *ŒEXECUTE.�TO�EXIT�MONTR4 *ŒTYPE�ESCAPE... * MONTR4‚LDS…#STACK ˆLDX…#PROMPT ˆJSR…PDATA1 ˆJSR…INEEE ˆCMPA„#$1B„IF�CHR�IS�(ESC) ˆBEQ…RTN…GOTO�MIKBUG ˆCMPA„#$40 ˆBLE…OHYA ˆCMPA„#$55 ˆBGE…OHYA ˆLDX…#TABLE0 ˆANDA„#$1F„DELETE�TOP�3�BITS ˆASLAŒMULTIPLY�A�BY�2 LOOP1ƒCMPA„#0 ˆBEQ…DOIT ˆINX ˆDECA ˆBRA…LOOP1 DOIT„LDX…X ˆJMP…X OHYA„LDAA„#'? ˆJSR…OUTEEE ˆBRA…MONTR4 RTN…JMP…MIKBUG * ************** *G0�SUBROUTINE ************** *FUNCTIONS:GO *INPUTS:NONE *OUTPUTS:NONE *CALLS:BADDR1 *REGS�USED:XR�;BA *ŠUSER�ROUTINE�MAY�USE�ALL�REGS. *DESCRIPTION:GOES�TO�SUBROUTINE�CALLED�BY *ŒCONTENTS�OF�BA.�CALLED�ROUTINE *ŒMUST�RTS�($39)�AT�END�TO�RETURN *ŒTO�MONTR4�CONTROL.. * GO†JSR…BADDR1 ˆJSR…X ˆBRA…MONTR4 * ****************** *MONTR4�ASCII�TEXT ****************** * 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 * ************** *PROGRAM�TABLE ************** * 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†RESERVE�12�BYTES�FOR�U-Z TABLE1‚RMB…256…RESERVE�RAM�FOR�SEARCH�TABLE ˆORG…$A048 ˆFDB…MONTR4 ˆEND @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@åååååååååååååååååååå@ ååååååååååååååååååååååååååA ååååååååååååååååååååååååååB ååååååååååååååååååååååååååC ååååååååååååååååååååååååååD ååååååååååååååååååååååååååE ååååååååååååååååååååååååååF ååååååååååååååååååååååååååG ååååååååååååååååååååååååååH ååååååååååååååååååååååååååI ååååååååååååååååååååååååååJ ååååååååååååååååååååååååååK ååååååååååååååååååååååååååL åååååååååååååååååååååååååå