IMD 1.16: 16/08/2007 16:30:25 user group 26-50  M68UGL2 0201061377USER-GROUP-LIBRARY \lx€ˆ�˜ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUG38S SA|ÅUG46S SA$ÅMDOSOV0 SY\òDIR CMðòMDOSOV4 SYˆòMDOS SYòUG31S SAhÅMDOSOV6 SY˜òUG27S SA�ÅUG35S SAPÅUG43S SAôÅCOPY SA¸EUG39S SA„ÅUG47S SADÅMDOSOV1 SYlòMDOSOV3 SY€òMDOSER SY åUG32S SAtÅUG40S SA”ÅBACKUP CM°òUG28S SA ÅUG29S SA¼ÅUG33S SA8ÅUG36S SAXÅUG37S SA\ÅUG41S SA´ÅUG44S SAøÅMDOSOV5 SY�òUG45S SA ÅUG48S SAxÅCOPY CMÔrUG49S SAôÅMDOSOV2 SYxòUG30S SA4ÅUG26S SAÅUG34S SADÅUG42S SAÜÅUG50S 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ÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅ  |Aa€Š NAM FLOAT OPT O,LLEN=80,CREF GET OBJECT TAPE ORG $B00 ** * FLOATING POINT PACKAGE * * 4 SUBROUTINES CURRENTLY EXIST. THEY ARE: * FLOATING ADD (FPADD) * FLOATING SUBTRACT (FPSUB) * FLOATING MULTIPLY (FPMUL) * FLOATING DIVIDE (FPDIV) * * GENERAL CALLING SEQUENCE * JSR FPXXX * FDB ARG1 ADDR OF ARG1 * FDB ARG2  ADDR OF ARG2 * FDB RESULT ADDR OF RESULT * ---- RETURN * * THE ARGS ARE IN THE FORMAT: *  BYTE 0 BIT 7 =SIGN OF FRACTION * BIT 6-0 =EXPONENT(2'S COMP) * BYTE 1-3 FRACTION (MAGNITUDE FORM) * * * ALL REGISTERS INCLUDING THE X-REG ARE DESTROYED * RESULT MAY BE THE SAME ADDR. AS ARG1 OR ARG2 *  THE V BIT WILL BE SET IF OVERFLOW * OCCURED. (DIV BY 0 IS OVFL) * * CODE TYPE: REENTRANT,NO STORAGE (ROM) *  POSITION INDEPENDENT * * * IF THE PROGRAM IS TO BE RAN AT AN ADDRESS * OTHER THAN $B00 IT CAN BE REASSEMBLED * OR, SINCE IT IS POSITION INDEPENDENT, * JUST MOVED. IF MOVED THE ENTRIES ARE AT: * ADD NEWORG * SUB NEWORG+2 * MUL NEWORG+4 * DIV NEWORG+6 * * IF SOMEONE WERE BRAVE ENOUGH TO CONVERT THIS * THIS TO A ROM IT COULD BE GIVEN ANY ADDRESS * AND ENTERED VIA THE ENTRIES LISTED ABOVE * * * STACK SIZE: 24 BYTES * * PROGRAM SIZE: 35F BYTES * * REPRESENTATIVE TIME: ADD 1900 USEC * SUBTRACT 2000 USEC *  MULTIPLY 3200 USEC * DIVIDE 6600 USEC * * DURING EXECUTION OF THE OPTIONS THE X-REG POINTS TO * TO A BLOCK OF DATA PUT ON THE STACK BY THE FRONT * END HANDLER. THEFORMAT OF THIS DATA IS: * BYTE 0 SCRATCH * BYTE 1 OVERFLOW INDICATOR * BYTES 2-6 RESULT * BYTES 7-11 ARG2 * BYTES 12-16 ARG1 * BYTES 17-18 PC OF CALLER * * THE EXTRA BYTE ADDED TO EACH ARG * AND RESULT IS USED TO MAINTAIN * ACCURACY AND IS REFERED TO AS * THE OVERFLOW BYTE. * * WRITTEN BY JOEL BONEY FOR MOTOROLA SPD. SEPT 75 * REVISED 2-28-77 - REV 1  * * REVISION :1 * ************************************************************ * * START VECTORS * FPADD BRA ADDGO FPSUB BRA SUBGO FPMUL BRA MULGO FPDIV BRA DIVGO * * ********** *MULTIPLY ARG1*ARG2=RESULT (CODE 0) ********** MULGO CLR B SET CODE = 0 BRA FPARG GO JOIN MUTUAL PROCESSING ********** * DIVIDE ARG2/ARG1=RESULT ********** DIVGO LDA B #1 SET CIODE=1 BRA FPARG GO JOIN MUTUAL PROCESSING ********** * ADD ARG1+ARG2=RESULT ********** ADDGO LDA B #2 SET CIDE=2 BRA FPARG GO JOIN MUTUAL PROCESSING *********** * SUB ARG1-ARG2=RESULT ********** SUBGO LDA B #3 SET CODE =3 * * HERE TO GET ARGS FROM USER CALLING SEQUENCE * AND TO RESERVE SCRATCH ON THE STACK * * FPARG TSX GET LOC OF STACK IN X LDX 0,X GET ADDR OF CALLING SEQUENCE LDX 0,X GET ADDR OF ARG1 CLR A CLEAR OVERFLOW BYTE PSH A LDA A 3,X PUSH ARG1 PSH A LDA A 2,X PSH A LDA A 1,X PSH A LDA A 0,X PSH A TSX USE STACK PTR TO GET BACK ADD  R OF ARGS LDX 5,X TO PC LDX 2,X GET ADDR OF ARG2 CLR A EXTRA BYTE PSH A LDA A 3,X PUSH ARG2 PSH A LDA A 2,X PSH A LDA A 1,X PSH A LDA A 0,X PSH A CLR A CLEAR SOME SPACE FOR RESULT PSH A AND SCRATCH PSH A PSH A PSH A PSH A PSH A PSH A TSX GET FINAL X (AT BASE OF DATA) * FIND OUT WHAT THE CALL WAS (CODE IN B) TST B MULT? BEQ MULSUB BRANCH IF SO CMP B #1 DIV? BEQ DVSUB1 BRANCH IF SO * MUST BE ADD OR SUB WHICH START OUT THE SAME BRA ADSUB1 GO TO ADD SUB * * HERE WHEN PROCESSING IS COMPLETED. PULL RESULT * FROM STACK AND PUT IT WHERE THE USER * POINTED * * FPOUT TST 6,X SHOULD WE ROUND? BPL X015 NO INC 5,X INCR AND GENERATE BNE X015 CARRIES INC 4,X BNE X015 INC 3,X BNE X015 CARRY OUT OF UPPER? LDA A #4 SEC SET CARRY TO SHIFT IN ONES X014 ROR 3,X YES,SHIFT 4 RIGHT ROR 4,X ROR 5,X ROR 6,X CLC DEC A BNE X014 ASL 2,X INCR EXPONENT ROR 0,X INC 2,X INC 2,X  BVS FPOVF1 BRANCH ON EXP OVF ROL 0,X ROR 2,X X015 INS PUL B GET OVFL FLAG IN B LDX 17,X GET ADDR OF CALLING SEQ  LDX 4,X GET ADDR OF RESULT PUL A STA A 0,X PULL RESULT PUL A STA A 1,X PUL A STA A 2,X PUL A STA A 3,X LDA A #11 POP EVERYTHING ELSE X020 INS DEC A BNE X020 TSX GET STACK UP LDX 0,X GET RETURN PC INS CLEAN STACK INS TST B BEQ X030 DID WE HAVE OVFL SEV YES,SET OVF BIT X030 JMP 6,X RETURN * PIC BRANCHES FPOVF1 BRA FPOVF PIC BRANCH DVSUB1 BRA DVSUB2 ADSUB1 BRA ADSUB2 PAGE * *----------------------------------------------------------- * * MULTIPLY ARG1*ARG2=RESULT * *---------------------------------------------------------- * ARG1 EQU 12 ARG2 EQU 7 RESULT EQU 2 * FPOUT2 BRA FPOUT PIC BRANCH MULSUB LDA A #ARG1 NORMALIZE ARG1 BSR NORMX1 LDA A #ARG2 NORMALIZE ARG2 BSR NORMX1 * FPM20 LDA A #25 LOOP CTR (NBR BITS+1) STA A 0,X CLEAR RESULT FRACTION CLR B (B HOLDS THE LSB FOR SPEED AND MEMORY) FPM30 ROR 13,X SHIFT ARG1 RIGHT ONE BIT ROR 14,X ROR 15,X DEC 0,X DONE 24 BITS? BEQ FPM40 YES BCC FPM35 NO, WAS SHIFTED BIT IN ARG1 SET? ADD B 10,X YES, ADD IN ARG2 LSB LDA A 4,X ADD IN ARG2 MIIDDLE BIT ADC A 9,X  STA A 4,X LDA A 3,X ADD IN ARG2 MSB ADC A 8,X STA A 3,X FPM35 ROR 3,X SHIFT RESULT RIGHT ROR 4,X ROR B ROR 6,X SAVE SHIFT OUT IN OVERGLOW BRA FPM30 * * HERE WHEN MULT COMPLETE. ADD EXPONENTS * FPM40 STA B 5,X PUT BACK LSB  LDA A 12,X GET SIGN OF RESULT TAB SAVE IN B TOO EOR B 7,X AND B #$80 CLR 0,X CLEAR LOCAL OVF FLAG ASL A GET EXPONENT IN ARITHMETIC FORM ASL 7,X ADD A 7,X ADD EXPONENTS FPM45 BVS FPMOVF BRANCH IF EXPONENT OVERFLOW CLC FIX EXPONENT ROR A FPM37 ABA ADD IN SIGN STA A 2,X LDA A #RESULT NORMALIZE ANS BSR NORMX1 TST 0,X LOCAL OVF SET? BEQ FPOUT2 NO INC 2,X YES INCR EXP * PIC BRANCHES ADSUB2 BRA ADDSUB * UNDER OR OVERFLOW FPMOVF BPL FPUND UNDERFLOW? PSH A NO LDA A 3,X GET ANS BIT A #$F0 IS IT NORMALIZED? PUL A BNE FPOVF YES,NORMALIZING WONT HELP THE OVERFLOW CMP A #$80 WOULD A NORMALIZE HELP? BNE FPOVF NO LDA A #$3F SET EXP MAX STA A 0,X SET LOCAL OVFL BRA FPM37 NORMX1 BRA NO  RMX2 PIC BRANCH DVSUB2 BRA DVSUB3 FPOUT1 BRA FPOUT2 * * HERE ON RESULT OVERFLOW * FPOVF AND B #$80 MASK OUT SIGN ORA B #$3F SET EXPONENT MAX LDA A #$FF INC 1,X SET OVERFLOW BRA FPMU10 * HERE ON UNDERFLOW FPUND CLR B CLR A SET EXPONENT AND FRACTION = 0 FPMU10 STA A 3,X SET RESULT FRACTION STA A 4,X STA A 5,X CLR 6,X STA B 2,X SET RESULT EXP BRA FPOUT1 HANG IT UP FPM456 BRA FPM45 PAGE * *---------------------------------------------------------- * ADD ARG1+ ARG2=RESULT * SUB ARG1-ARG2=RESULT *--------------------------------------------------------- ADDSUB PSH B PUSH ADD-SUB CODE * * NORMALIZE ARGS LDA A #ARG1 BSR NORMX2 LDA A #ARG2 BSR NORMX2 LDA A #8 STA A 0,X DONT SHIFT TOO MANY TIMES LDA A 12,X GET ARG1 EXP ASL A LEFT JUSTIFY IT LDA B 7,X GET ARG2 EXP ASL B FPA05 DEC 0,X TOO MANY SHIFTS BLT FPA25 BRANCH IF SO CBA COMPARE EXP1 TO EXP2 BEQ FPA30 EQUAL,PROCEED WITH THE ADD * SHIFT ARG WITH THE SMALLER EXP RIGHT 4 BITS BGT FPA20 ARG1 EXP IS BIGGER * ARG1 IS SMALLER BSR FPAS1 SHIFT ARG1 4 BITS BSR FPAS1 BSR FPAS1  BSR FPAS1 ADD A #2 BUMP EXP1 BRA FPA05 TRY AGAIN *ARG2 IS SMALLER FPA20 BSR FPAS2 SHIFT ARG2 4 BITS BSR FPAS2  BSR FPAS2 BSR FPAS2 ADD B #2 BUMP EXPONENT AND TRY AGAIN BRA FPA05 * HERE TO SHIFT ARG1 1 BIT RIGHT FPAS1 CLC SHIFT IN 0 SINCE ITS POS ROR 13,X ROR 14,X ROR 15,X ROR 16,X RTS * HERE TO SHIFT ARG2 1 BIT RIGHT FPAS2 CLC SHIFT IN 0 SINCE ITS POS ROR 8,X ROR 9,X ROR 10,X ROR 11,X RTS FPA25 CBA WHEN DIFF IS LARGE BGT FPA30 PICK UP THE BIG EXPONENT TBA BRA FPA30 * PIC BRANCHES FPOUT3 BRA FPOUT1 BRANCH FOR PIC DVSUB3 BRA DVSUB4 NORMX2 BRA NORMX3 FPUND5 BRA FPUND FPM455 BRA FPM456 FPOVF3 BRA FPOVF * * HERE ON EQUAL EXPONENTS * FPA30 STA A 2,X SAVE NEW EXPONENT IN RESULT BSR FPAS1 MAKE ROOM FOR SIGNS IN FRACTIONS BSR FPAS2 LDA A 12,X IS ARG1 NEGATIVE? BPL FPA40 NO LDA A #ARG1 YES , GO COMPLEMENT BSR COMX1 FPA40 LDA A 7,X IS ARG2 NEGATIVE? BPL FPA50 NO LDA A #ARG2 YES GO COMPLEMENT BSR COMX1 FPA50 PUL A GET ADD-SUB CODE CMP A #2 WHICH ONE BNE FPS10 SUB * HERE TO ADD TWO QUADRUPLE ARGS LDA A 16,X ARG1+ ADD A 11,X ARG2= STA A 6,X RESULT * LDA A 15,X LSB ADC A 10,X STA A 5,X * LDA A 14,X MIDDLE ADC A 9,X STA A 4,X * LDA A 13,X MSB ADC A 8,X * DID ANSWER OVERFLOW? FPA55 BVC FPA60 NO STA A 3,X SAVE MSB LDA A #4 CTR ROR 3,X BRING IN LOST BIT 1ST TIME BRA FPA58 FPA57 ASR 3,X SIGN EXTEND FPA58 ROR 4,X ROR 5,X ROR 6,X DEC A DONE 4 BITS BNE FPA57 NO INC 2,X INCR EXPONENET INC 2,X BVC FPA61 BRANCH ON NO OVERFLOW ROL 3,X SET OVERFLOW AND EXIT FPA59 ROR B FPOVF2 BRA FPOVF3 OVERFLOW * PIC BRANCHES FPA80 BRA FPOUT3 NORMX3 BRA NORMX4 DVSUB4 BRA DVSUB5 FPUND4 BRA FPUND5 FPM454 BRA FPM455 * FPA60 STA A 3,X SAVE MSB FPA61 TST 3,X IS RESULT NEGATIVE? CLC CLEAR C BPL FPA70 POSITIVE RESULT LDA A #RESULT BSR COMX1 NEGATIVE, COMPLEMENT IT SEC SET TO SHIFT IN MINUS BVS FPA59 TOO BIG TO COMPL FPA70 ROR 2,X SHIFT IN SIGN ROL 6,X MOVE SIGN BACK INTO EXP ROL 5,X ROL 4,X ROL 3,X LDA A 3,X IS  RESULT NORMALIZED? BIT A #$F0 BNE FPA80 YES LDA A #RESULT NO,GO NORMALIZE BSR NORMX BRA FPA80 DONE,EXIT * NORMX4 BRA NORMX DVSUB5 BRA DVSUB6 FPUND3 BRA FPUND4 FPM453 BRA FPM454 COMX1 BRA COMX * * HERE TO SUBTRACT TWO QUADRUPLE ARGS * FPS10 LDA A 16,X ARG1- SUB A 11,X ARG2= STA A 6,X RESULT * LDA A 15,X LSB SBC A 10,X STA A 5,X * LDA A 14,X MIDDLE SBC A 9,X STA A 4,X * LDA A 13,X MSB SBC A 8,X BCS FPS20 COMPLEMENT THE CARRY BIT SEC BRA FPA55 FPS20 CLC BRA FPA55 GO CHECK OVERFLOW AND NORMALIZE FPOVF4 BRA FPOVF2 PAGE * *------------ * * GENERALIZED NORMALIZE ROUTIE. CALL: * JSR NORMX * WHERE A CONTAINS OFFSET TO ARG FROM NORMAL X (0-64) * ALL REGS EXCEPT X ARE DESTROYED * V IS SET IF UNDERFLOW WOULD OCCUR IF NBR * WERE NORMALIZED * Z IS SET IF ARG = 0 * *----------- * NORMX PSH A PUSH X OFFSET CLR B CLEAR Z,V WORD NL1 INX BUMP X BY ONE DEC A DONE N TIMES BNE NL1 BRANCH IF NOT * DO NORMALIZE LDA A 1,X CHECK FOR ZERO FRACTION ORA A 2,X ORA A 3,X ORA A 4,X BEQ NRMZRO DONT TRY TO NORM. ZERO ASL 0,X SAVE SIGN IN B WITH OFFSET ROL B ALSO DBL EXP NRM01 LDA A 1,X BIT A #$F0 NORMALIZED YET? BNE NRMOUT YES DEC 0,X BVS NRMOVF STOP IF NEXT SHIFT WILL CAUSE UNDERFLOW DEC 0,X BSR NRMSH4 SHIFT FRACT 4 BITS BRA NRM01 TRY AGAIN NRMOVF INC 0,X RESTORE EXP ORA B #4 OVF BIT AFTER SHIFT NRMOUT ROR B ROR 0,X PUT SIGN BACK ON NRMXIT PUL A GET X OFFSET NRMLP DEX DEC A BNE NRMLP TPA GET CURRENT STATUS ANDA #$10 SAVE INTERUPT STATUS ABA ADD B TO STATUS  TAP RTS RETURN * SUB TO SHIFT TRIPLE BYTE LEFT 4 BITS NRMSH4 LDA A #4 NSHLOP ASL 4,X ROL 3,X ROL 2,X ROL 1,X  DEC A BNE NSHLOP RTS NRMZRO LDA B #4 SET Z BIT CLR 0,X CLEAR EXPONENT BRA NRMXIT EXIT * PIC BRANCHES DVSUB6 BRA DIVSUB FPUND2 BRA FPUND3 FPM452 BRA FPM453 FPOVF5 BRA FPOVF4 PAGE * *------------ * * GENERALIZED TWOS COMPLEMENT ROUTINE. CALL: * JSR COMX * WHERE A CONTAINS OFFSET TO ARG FROM PRESENT X (0-64) * REGGISTERS ARE LOST * *------------- * COMX TAB SAVE OFFSET IN B TOO COM10 INX DEC A REPOSITION X TO ARG BNE COM10 TPA SAVE CALLER'S CC -V=0 COM 1,X DO 1'S COMPLEMENT COM 2,X COM 3,X COM 4,X INC 4,X MAKE 2'S COMPLEMENT BNE COMOUT GENERATE CARRIES AS LONG AS NEEDED INC 3,X BNE COMOUT INC 2,X BNE COMOUT INC 1,X BVS COMXX CANT COMP 80 00 00 00 COMYY TPA SAVE CONDITION CODE COMOUT DEX FIX X DEC B BNE COMOUT TAP PUT CONDITIONS IN RTS EXIT,RETURN * PIC BRANCHES DIVSTP BRA FPOVF4 NORMX5 BRA NORMX FPOVF6 BRA FPOVF5 FPM451 BRA FPM452 FPUND1 BRA FPUND2 * * * HERE TO SEE IF WE CAN SHIFT THIS SO WE * CAN COMPLEMENT IT. COMXX LDA A #4 SHIFT 4 BITS RIGHT COM22 CLC ROR 1,X ROR 2,X ROR 3,X ROR 4,X DEC A DONE? BNE COM22 INC 0,X INCR EXPONENT INC 0,X BRA COMYY JOIN ABOVE PAGE * *--------------------------------------------------- * * DIVIDE ARG2/ARG1 =RESULT * *------------------------------------------------ * *  DIVSUB LDA A #ARG2 NORMALIZE DIVIDEND BSR NORMX5 LDA A #ARG1 NORMALIZE DIVISOR BSR NORMX5 BVS DIVSTP DIVISOR TOO S MALL BEQ DIVSTP DIV BY ZERO IS A NONO * FORCE ARG2 LT ARG1 SO ALGORITHM CAN WORK * MAKE DIVIDEND (ARG2) SMALLER IN FRACTION * AND LARGER IN EXP FPD15 LDA A #5 DO 5 SHIFTS ON ARG2 FPD20 LSR 8,X ROR 9,X ROR 10,X ROR 11,X DEC A BNE FPD20 * DIVIDE DIVISOR FRACTION BY 2 TO * FACILITATE THE ALGORITHM LSR 13,X ROR 14,X ROR 15,X ROR 16,X  * * HERE TO ACTUALLY DIVIDE THE FRACTIONS * LDA B 11,X GET OVF BYTE OF DIVIDEND LDA A #29 29 BITS TO DO WITH OVF FPD40 PSH A SAVE CTR ASL B SHIFT DIVIDEND LEFT ONE BIT ROL 10,X ROL 9,X ROL 8,X ASL 6,X SHIFT RESULT LEFT ONE BIT  ROL 5,X ROL 4,X ROL 3,X * DO A DBL SUBTRACT. IF THE RESULT IS POS SET * BIT IN RESULT. IF NEG ADD DIVISOR BACK * AND SET RESULT BIT = 0 SUB B 16,X DIVIDEND-DIVISOR * LDA A 10,X LSB SBC A 15,X STA A 10,X * LDA A 9,X MIDDLE SBC A 14,X STA A 9,X * LDA A 8,X MSB SBC A 13,X STA A 8,X * IF CARRY NOT SET SET QUOTIENT BIT * AND CONTINUE BCC FPD55 BRA FPD50 * PIC BRANCHES FPUND0 BRA FPUND1 FPM450 BRA FPM451 FPOVF7 BRA FPOVF6 * IF CARRY IS SET ADD DIVISOR BACK * AND CONTINUE FPD50 ADD B 16,X DO DBL ADD * LDA A 10,X LSB ADC A 15,X STA A 10,X * LDA A 9,X MIDDLE ADC A 14,X STA A 9,X * LDA A 8,X MSB ADC A 13,X STA A 8,X BRA FPD60 GO TO CONTINUE * * HERE TO SET BIT IN QUOTIENT * FPD55 INC 6,X SET IT * FPD60 PUL A PULL LOOP CTR DEC A GONE 28 TIMES? BNE FPD40 NO * LEFT JUSTIFY RESULT * SINCE WE ONLY DIVIDED 28 TIMES WE NEED TO SHIFT * UP 4 BITS BUT SINCE WE RIGHT SHIFTED THE DIVISOR * 3 IS THE MAGIC NUMBER LDA A #3 SHIFT RESULT UP 3 BITS FPD62 ASL 6,X ROL 5,X ROL 4,X ROL 3,X DEC A BNE FPD62 * * HERE TO SUB EXPONENTS (EXP2-EXP1) * ALSO CALCULATE SIGN AND ADJUST EXP * TO REFLECT ORIGINAL SHIFT OF THE * DIVIDEND * LDA A 7,X EXP2 TAB SAVE IN B FOR SIGN CALC EOR B 12,X EXCLUSIVE OR WITH ARG1 AND B #$80 EXTRACT SIGN CLR 0,X CLEAR LOCAL OVERFLOW ASL A DBL EXP2 ASL 12,X DBL EXP1 SUB A 12,X EXP2-EXP1 BVC FPD70 BRANCH ON NO OVERFLOW BPL FPD80 UNDERFLOW BRA FPOVF7 DEFINITE OVERFLOW * MAKE UP FOR ORIGINAL SHIFT OF ARG2 BY ADDING TO EXP * THE EXPONENT FPD70 ADD A #2 FPD75 BRA FPM450 GO CHECK FOR OVFL'S ETC * HERE ON POTENTIAL UNDERFLOW * SEE IF THE ADJUST WOULD HELP ANY FPD80 ADD A #2 AN OVFL NOW MEANS YES BVS FPD85 BRA FPUND0 DEFINITE UNDERFLOW FPD85 CLV RESET OVERFLOW BRA FPD75 GO EXIT PAGE * *--------------- * TEST FOR FLOATING PACKAGE *--------------- * * C A U T I O N ! ! * THE TEST PROGRAM IS NOT * POSITION INDEPENDENT AND CANNOT * BE MOVED WITHOUT REASSEMBLING. * * * THE TESTS ARE RAN BY ASSIGNING VALUES * TO VAL1 AND VAL2. BREAKS CAN THEN * BE SET AT THE BVS FOLLOWING EACH * SUBROUTINE CALL AND ANS BE PRINTED * OUT. * * SOME SAMPLE VALUES ARE: * NBR EXP FRACTION * .500 00 80 00 00 * .250  00 40 00 00 * .125 00 20 00 00 * .750 00 C0 00 00 * -.500 80 80 00 00 * 8.000  01 80 00 00 * 4.000 01 40 00 00 * 1.000 01 10 00 00 * -8.000 81 80 00 00 * 0.000   00 00 00 00 * 0.999 00 FF FF FF * * * DONT RE-EXECUTE THE CODE THAT MOVES * THE PROGRAM IF SEVERAL PASSES ARE * MADE THRU THE TEST. START SUBSEQUENT * PASSES AT 'ADDTST'. * ORG $100 FPTST LDS #STACK SET THE STACK LDX #$0AC0 MOVE THE SUB FROM CAT LDA A $40,X $0B00 TO $0AC0 TO STA A 0,X PROVE ITS REALLY PIC INX CPX #$0EC0 BNE CAT * * EQUATES SO WE CAN ENTER THE MOVED PRG * BY USING MNUEMONICS. * ADDIT EQU $AC0 SUBIT EQU $AC2 MULIT EQU $AC4 DIVIT EQU $AC6 * VAL1+VAL2=ANS ADDTST JSR ADDIT FPADD FDB VAL1 FDB VAL2 FDB ANS BVS OVER1 * VAL1-VAL2=ANS SUBTST JSR SUBIT FPSUB FDB VAL1 FDB VAL2 FDB ANS BVS OVER2 * VAL1*VAL2=ANS MULTST JSR MULIT FPMUL FDB VAL1 FDB VAL2 FDB ANS BVS OVER3 * VAL2/VAL1=ANS DIVTST JSR DIVIT FPDIV FDB VAL1 FDB VAL2 FDB ANS BVS OVER4 BRA * DONE *HERE ON OVERFLOWS OVER1 BRA * OVERFLOW ON ADD OVER2 BRA * OVERFLOW ON SUB OVER3 BRA * OVERFLOW ON MUL OVER4 BRA * OVERFLOW ON DIV * * INPUT ARGS * VAL1 FDB 0,0 VAL2 FDB 0,0 * * ANSWER * ANS FDB 0,0 * * STACK * BOTSTK RMB 50 STACK RMB 1 END MON ! d€ �NAM�RANDOM * *�REV.�1.0 * *GENERATES�A�(PSUEDO)RANDOM�SEQUENCE�OF�16�BIT *BINARY�NUMBERS�R(N)�USING�A�LINEAR�CONGRUENTIAL *SEQUENCE�OF�THE�FORM:�R(N+1)�=�(R(N)*A+C)MOD�2**16 *WHERE�A�=�2**11+2**2+1‚AND‚C�=�$3619. * *CAUTION:‚IF�A�K-BIT�RANDOM�NUMBER�IS�NEEDED�AS *OPPOSED�TO�A�16�BIT�RANDOM�NUMBER,�USE�THE‚MOST *SIGNIFICANT�K�BITS�(THE�LEAST�SIGNIFICANT�K�BITS *ARE�NOT�AS�RANDOM�). * *REFERENCE:‚DONALD�E�KNUTH,�"THE�ART�OF�COMPUTER *PROGRAMMING"�VOLUME�II�,�ADDISON�WESLEY�PUBLISHING *COMPANY,�1969. * *THE�RANDOM�NUMBER�GENERATOR�IS�WRITTEN�AS�A�SUB- *ROUTINE�CALLED�"RNDGEN�WHICH�IS�REENTRANT�AND�MAY *BE�STORED�IN�RAM�OR�ROM.‚TWO�BYTES�OF�RAM�ARE *REQUIRED�TO�STORE�THE�CURRENT�16�BIT�RANDOM�VALUE. * *REGISTERS�USED:�A,B,C,X * *INPUT:‚THE�CURRENT�16�BIT�RANDOM�NUMBER�WHICH�IS *STORED�AS�TWO�BYTES�AT�RAM�ADDRESSES�Z�(MOST *SIGNIFICANT�BYTE)�AND�Z+1�(LEAST�SIGNIFICANT�BYTE). *THE�INDEX�REGISTER�X�MUST�CONTAIN�THE�ADDRESS�Z. * *OUTPUT:�A�NEW�16�BIT�RANDOM‚NUMBER�WITH�THE�MOST *SIGNIFICANT�BYTE�STORED�IN�RAM�LOCATION�X�AND *ACCUMULATOR�A�AND�THE�LEAST�SIGNIFICANT�BYTE�STORED *IN�RAM�LOCATION�Z+1�AND�ACCUMULATOR�B.‚THE�INDEX *REGISTER�X�WILL�STILL�CONTAIN�THE�ADDRESS�Z. * *CALLING�SEQUENCE+ *“LDX‚#RNDADDƒRANDOM�#�STORE *“JSR‚RNDGEN * *PROGRAM�STORAGE:‚24�BYTES * *�EXECUTION�TIME(1MHZ�MPU�CLK):‚56�MICROSECONDS * * *� �ORG�$0000 RNDADD�RMB�2�RANDOM�NUMBER�STORAGE * *� �ORG�$0400 RNDGEN�LDAA�1,X�COMPUTE�(R(N)*2**9)MOD�2**16 �ASL�A �ADD�A�0,X�ADD�R(N)�TO�RESULT �LDA�B�1,X� �ASL�B�MULTIPLY�BY�2**2 �ROL�A �ASL�B �ROL�A �ADDB�1,X�ADD�R(N)�TO�RESULT �ADCA�0,X �ADDB�#$19�ADD�OFFSET�C=$3619 �ADCA�#$36� �STAA�0,X�STORE�NEW�RANDOM�NUMBER �STAB�1,X�IN�LOCATION�RNDADD. �RTS�RETURN�TO�MAIN �END ÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅ h€ NAM PROMDP OPT O OPT NOG * PROM SOURCE GEN ORG $0E00 * * STARTING ADDR OF PGM IS $E00. * PGM WILL PROMPT BLOC AND ELOC * FOR BEGIN AND END DUMP LOCATIONS * RESPECTIVELY. * RESPOND TO EACH BY TYPING A * 4-DIGIT HEX ADDRESS; * CTL/U WILL RESTART PGM. * PGM WILL PAUSE FOR PUNCH TURN-ON. * TYPE IN A DUMP FORMAT CONTROL * CHARACTER (NOT ECHOED) TO BEGIN * DUMP. * CHARACTER M WILL SUPPRESS LEADER * AND TERMINATOR. * CHARACTER N WILL SUPPRESS LEADER * ONLY. * ANY OTHER LEGAL KBD ACTION WILL GENERATE * A DUMP WITH BOTH LEADER AND TERMINATOR. * AT END OF DUMP PROGRAM WILL PAUSE AGAIN * FOR PUNCH TURN-OFF; CTL/U WILL RESTART PGM. * ANY OTHER KBD ACTION WILL CAUSE A RETURN TO EXBUG. * ACCS EQU $FCF4 ACDA EQU ACCS+1 STACK EQU *-1 EXBG EQU $F4D8 * ENTR LDAA #$B1 ENTRY POINT-SET I/O STAA ACCS RENT LDS #STACK SET UP STACK POINTER LDAB #$8 GET DUMP PARAMETERS LDX #HDR1 JSR TYPO GET ADDR OF FIRST LDX #CAD JSR INAD LDAB #$8 LDX #HDR2 JSR TYPO GET ADDR OF LAST LDX #ENDA JSR INAD JSR CRLF JSR INNE WAIT FOR ANY KBD ACTION STAA WORK CMPA #'N BEQ LINE BYPASS LEADER CMPA #'M BEQ LINE BYPASS LEADER JSR LDR BEGIN DUMP LINE LDAA CAD ANDA #3 JSR HFMT TBA BSR OUCH LDAA CAD+1 JSR HFMT BSR OUCH TBA BSR OUCH LDAA #$20 SPACE BSR OUCH LDX CAD LDAA 0,X JSR HFMT BSR OUCH TBA BSR OUCH JSR CRLF INX STX CAD DEX CPX ENDA BNE LINE LDAA WORK CMPA #'M BEQ PAU BYPASS TERMINATOR LDAB #3 LDX #SLSH BSR TYPO JSR LDR PAU JSR INNE WAIT FOR KBD ACTN CMPA #$15 CTL/U? BNE EXIT JMP RENT EXIT JMP EXBG EXIT TO EXBUG * * OUCH PSHB OUTPUT CHAR TO TTY OCH1 LDAB ACCS ASRB ASRB BCC OCH1 TX NOT RDY STAA ACDA PULB RTS * TYPO LDAA 0,X BSR OUCH INX DECB BNE TYPO RTS * INAD BSR INBY STAA 0,X BSR INBY STAA 1,X RTS * INBY BSR INHX ASLA ASLA ASLA ASLA STAA WORK BSR INHX ORAA WORK RTS * INHX BSR INNE INPUT A HEX DIGIT BSR OUCH ECHO CHARACTER CMPA #'0 BMI ABOT CHECK IF ERROR TEST CMPA #'9 BLE INH1 CMPA #'A BMI ABOT CMPA #'F BGT ABOT SUBA #7 INH1 ANDA #$F TRUNCATE TO 4 BITS RTS * ABOT CMPA #$15 CTL/U? BNE IGN JMP RENT YES,REDO IGN LDAA #$3F PRINT ? BSR OUCH BRA INHX * LDR LDAB #$30 OUTPUT LEADER CLRA NULL BSR OUCH DECB BGT NULL RTS * CRLF LDAA #$D OUTPUT CR/LF BSR OUCH LDAA #$A LINE FEED BSR OUCH RTS * INNE LDAA ACCS INPUT WITH NO ECHO ASRA BCC INNE RX NOT RDY LDAA ACDA INPUT ANDA #$7F MASK OFF MSB RTS * HFMT TAB FORMAT TO ASCII(A=MSB,B=LSB) ANDB #$F TRUNCATE TO 4 BITS LSRA LSRA LSRA LSRA  ADDA #'0 ASCII BIAS CMPA #'9 BLE HD2 ADDA #7 HD2 ADDB #'0 CMPB #'9 BLE HDX ADDB #7 HDX RTS * TADS RMB 2 TEMP ADDR STORE WORK RMB 1 HDR1 FCB $D,$A FCC /BLOC / HDR2 FCB $D,$A FCC /ELOC / CAD RMB 2 CURRENT ADDR ENDA RMB 2 END ADDR SLSH FCB $2F,$D,$A TERM CHAR END  ÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅto€u�NAM�MPURLT �OPT�L,P,O,NOG *MPUTEK�IS�A�REALTIME�OPERATING�SYSTEM�DESIGNED *TO�RUN�ON�THE�MOTOROLA�M6800�MICROPROCESSOR *WITH�AT�LEAST�2K�OF�MEMORY.‚ITS�TABLES�ARE *CURRENTLY�SET�UP�TO�HANDLE�NINETEEN�TASKS. �SPC�1 *WRITTEN�BY:�STEVE�B.�KITTLESON‚RM563‚962-2607 *DATE:‚8/25/75 �SPC�2 �SPC�2 *�TO�RUN�EXEC: *„SET�REGISTERS�AS�FOLLOWS: *†CC‚BR‚AR‚XR„PC *†FF‚00‚00‚0000‚0100 *„SET�SWITCH�(ADDED�BY�USER)�ON�EVAL.�MODULE�TO *ˆ"MPU�ECHO�INPUT" *„TYPE�G�ON�TTY �SPC�2 SFREGA�EQU�$2D�SPECIAL�FUNCTION�REG�ADR ITRAD1�EQU�$41�INTERRUPT�REG�ADR�FOR�STA�1 ITRAD2�EQU�$B1�INTERRUPT�REG�ADR�FOR�STA�2 �SPC�2 �ORG�$8004 PIA1AD�RMB�1�PIA1�A�SIDE�DATA PIA1AC�RMB�1�PIA1�A�SIDE�CONTROL PIA1BD�RMB�1�PIA1�B�SIDE�DATA PIA1BC�RMB�1�PIA1�B�SIDE�CONTROL �ORG�$8008 PIA2AD�RMB�1�PIA2�A�SIDE�DATA PIA2AC�RMB�1�PIA2�A�SIDE�CONTROL PIA2BD�RMB�1�PIA2�B�SIDE�DATA PIA2BC�RMB�1�PIA2�B�SIDE�CONTROL PIA2�EQU�PIA2AD ADRBUS�EQU�PIA2BD DATBUS�EQU�PIA2AD �SPC�2 �ORG�$0 �SPC�1 *THIS�TABLE�MUST�BE�PATCHED�WITH�TASK�ADDRESS �SPC�1 *…TASK�START�ADDRESS�TABLE� *…FIRST�8�ITEMS�ARE�FOR�INTERUPT�HANDLERS TSA�FDB�TURNOF„0- �FDB�TURNOF�1- �FDB�TURNOF�2- �FDB�TURNOF�3- �FDB�TURNOF�4- �FDB�TURNOF„5- �FDB�TURNOF„6- �FDB�TURNOF„7- �FDB�TURNOF�8- �FDB�ECHO�9-�ECHO�INPUT�TASK �FDB�CTRLA�10-�CTRL+A�TASK�(EXAMPLE) �FDB�TURNOF�11- �FDB�TURNOF�12- �FDB�TURNOF�13- �FDB�TURNOF�14- �FDB�TURNOF�15- �FDB�TURNOF�16- �FDB�TURNOF�17- �FDB�TURNOF�18- �FDB�TURNOF�19-�FILLER‚DO�NOT�USE �SPC�2 *�TASK�STATUS�TABLE†B7-B0 *…INIT:00010000�INDX�BY:�TASK�# �SPC�1 *…BITŠFUNCTION *…---Š-------- * *†7‹NOT�USED�=0 *†6‹NOT�USED�=0 *†5‹WAITING�FOR�CRT�INPUT�FLAG�=1 *†4‹TASK�INACTIVE�FLAG�=1 *†3‹XFER�IN�PROGRESS�(TAPE�OR�CRT)=1 *†2‹WAITING�FOR�CRT�HANDLER�FLAG�=1 *†1‹WAITING�FOR�TAPE�HANDLER�FLAG�=1 *†0‹SUSPEND�FLAG�=1 �SPC�1 TS�RMB�20�TASK�STATUS�TABLE �SPC�2 *�STATIONS�WAITING�FOR�SERVICE�TABLE‚B7-B0 *…INIT:�11111111‚INDX�BY:�TASK�# �SPC�1 *…BIT‰FUNCTION *…---‰-------- * *†7ŠNOT�USED�=1 *†6ŠNOT�USED�=1 *†5ŠNOT�USED�=1 *†4ŠNOT�USED�=1 *†3ŠSTATION�4�WAITING�=0 *†2ŠSTATION�3�WAITING�=0 *†1ŠSTATION�2�WAITING�=0 *†0ŠSTATION�1�WAITING�=0 �SPC�1 SWFS�RMB�20�STATIONS�WAITING�FOR�SERVICE NOTSKS�EQU�SWFS-TS�NUMBER�OF�TASKS �SPC�2 *�STATION�IN�SERVICE�TABLE‚B7-B0 *‡INIT:�00000000‚INDX�BY:�TASK�# �SPC�1 *…BIT‰FUNCTION *…---‰-------- * *†7ŠNOT�USED�=0 *†6ŠNOT�USED�=0 *†5ŠNOT�USED�=0 *†4ŠNOT�USED�=0 *†3ŠSTATION�4�IN�SERVICE�=1 *†2ŠSTATION�3�IN�SERVICE�=1 *†1ŠSTATION�2�IN�SERVICE�=1 *†0ŠSTATION�1�IN�SERVICE�=1 �SPC�1 SIS�RMB�20�STATION�IN�SERVICE �SPC�2 *BIT�MAP�TABLE �SPC�1 B7�EQU‚%10000000 B6�EQU‚%01000000 B5�EQU‚%00100000 B4�EQU‚%00010000 B3�EQU‚%00001000 B2�EQU‚%00000100 B1�EQU‚%00000010 B0�EQU‚%00000001 �SPC�1 TRA�RMB�40�TASK�RESTART�ADDRESS CTP�RMB�2�CURRENT�TASK�POINTER DSF�RMB�1�DID�SOMETHING�FLAG SPCFNC�RMB�1�SPECIAL�FUNCTIONS�VALUE SAVX�RMB�2 STAMSK�RMB�1�STATION�NO.�MASK MSGADR�RMB�2�ADR�OF�OUTPUT�MESSAGE MSGTSK�RMB�2�TASK�NO.�REQUESTING�MSG BITCNT�RMB�1�CHAR�BIT�COUNT OUTCHR�RMB�1�OU TPUT�CHAR NUCHRF�RMB�1�NEW�CHAR�FLAG INCHAR�RMB�1�INPUT�CHAR TSKBUF�RMB�2�TASK�CHAR�BUFFER�ADR CHRBF�RMB�1�CHAR�BUF�FLAG�1=FULL�0=EMPTY TSKWOI�RMB�2�TASK�WAITING�ON�INPUT HLDBUF�RMB�1�CHAR�HOLDING�BUFFER INXTMP�RMB�2�INDEX�TEMPORARY OUTPIP�RMB�1�OUTPUT�IN�PROGRESS�FLAG�1=N0�0=YES INPTIP�RMB�1�INPUT�IN�PROGRESS�FLAG‚DITTO ECOSRG�RMB�1�ECHO�STRING �FCB�$07,$04�TONE�AND�EOM SAVB�RMB�1 SAVA�RMB�1 �RMB�30�STACK�AREA STACK�RMB�1�1ST�LOC�OF�STACK �PAGE *ƒNAM‚INIT �SPC�1 �ORG�$100 �SPC�2 *�HERE�TO�INITIALIZE�AFTER�LOADING �SPC�2 *�SETUP�STACK�POINTER �SPC�1 INIT�LDS�#STACK �LDX�#PIA1AD�X-REG�=�ADR�PIA1A �LDA�A�0,X�CLEAR�CA1�BIT �CLR�1,X�CLEAR�PIA1A�CONTROL �LDA�A�#%00000001�SET�PIA1A�DATA�DIR �STA�A�0,X �LDA�A�#%00000101�SET�PIA1A�CONTROL �STA�A�1,X �CLR�3,X�CLEAR�PIA1B�CONTROL �LDA�A�#%00000101�SET�PIA1B�DIR �STA�A�2,X �LDA�A�#%00110100�SET�PIA1B�CONTROL �STA�A�3,X �LDA�A�#4�SET�BIT�TIMER�FOR�FULL�TIME �STA�A�2,X �LDX�#PIA2AD�X-REG=�PIA2�ADR �COM�0,X�SET�A�SIDE�DDR�AS�OUTPUTS �LDA�A�#%00011111�SET�PIA2�A�SIDE�CONTROL �STA�A�1,X �COM�2,X�SET�B�SIDE�DDR�AS�OUTPUTS �LDA�A�#%00101100�SET�PIA2�B�SIDE�CONTROL �STA�A�3,X �SPC�1 �SPC�1 *�SET�UP�INITIAL�TASK�STATION�TABLE �SPC�1 �LDX�#TS �LDA�A�#%00010000 �LDA�B�#20 �BSR�SETUP �SPC�2 *�SET�UP�INITIAL�STATIONS�WAITING�FOR�SERVICE�TABLE �SPC�1 �LDX�#SWFS �LDA�A�#%11111111 �LDA�B�#20 �BSR�SETUP �SPC�2 *�CLEAR�OTHER�TABLES�AND�FLAGS �SPC�1 �LDX�#SIS �CLR�A �LDA�B�#OUTPIP-SIS �BSR�SETUP �SPC�2 *�INITIALIZE�I/O�FLAGS �SPC�1 �INC�A �STA�A�OUTPIP �STA�A�INPTIP �SPC�2 �SPC�2 *SETUP�INTERRUPT�ADR �SPC�1 �LDX�#NTRUPT �STX�$A000 �CLI �JMP�QUSRCH �SPC�2 *�ROUTINE�TO�SET�MEMORY�LOCATIONS *…XR�-�1ST�ADR *…BR�-�NO.�OF�ITEMS *…AR�-�SETUP�VALUE �SPC�1 SETUP�STA�A�0,X �INX �DEC�B �BGT�SETUP �RTS �SPC�2 *ƒNAM�QUSRCH �SPC�1 �ORG�$180 QUSRCH�JMP�Q1 TSKRTN�JMP�Q2 �SPC�1 Q1�LDX�CTP�X-REG�=�CURRENT�TASK�POINTER QULOOP�LDA�A�TS,X�FETCH�CURRENT�TASK�STATUS �BEQ�XTASK�IF�CLEAR�-�RUN�IT NXTTSK�INX�IF�NOT-�CHECK�NEXT�TASK �CPX�#NOTSKSƒALL�TASKS�CHECKED? �BNE�QULOOP�NO-�CONTINUE�CHECKING �CLR�CTP+1�YES-CLEAR�CURRENT�TASK�PTR �LDA�A�DSF�BEEN�BUSY? �BNE�CLRDSF�YES-�CHECK�FOR�MORE �WAI�OTHERWISE,�WAIT�FOR�INTR CLRDSF�CLR�DSF �BRA�QUSRCH�SEARCH�QUEUE�AGAIN �SPC�2 *�HERE�TO�START�OR�RESTART�A�TASK �SPC�2 XTASK�INC�DSF�SET�DID�SOMETHING�FLAG �STX�CTP�SET�CURRENT�TASK�POINTER �STX�INXTMP�DOUBLE�TASK�POINTER �ASL�INXTMP+1�IN�INXTMP �LDA�A�SIS,X�IS�THIS�A�RESTART �BNE�RESTRTƒYES �CLR�A‚A-REG=0 �SEC‚SET�CARRY �ROL�A�MOVE�IT�INTO�A-REG STALOP�BITA�SWFS,X�AND�AGAINST�STA�WAI�FLAG �BEQ�SETSTA�FOUND�A�WAI�STA �ASL�A�CHECK�NEXT�STATION �BRA�STALOP SETSTA�STA�A�SIS,X�SET�STATION�IN�SERVICE �LDX�INXTMP�XR=�POINTER�TO�TSA �LDX�TSA,X�XR�=�TASK�START�ADR �JMP�0,X�RUN�TASK RESTRT�LDX�INXTMP‚X-REG=POINTER�TO�RES�ADR �LDX�TRA,X�X-REG=RESTART�ADR �JMP�0,X�LET�TASK�DO�ITS�THING Q2�CLI ‚LDX�CTP�X-REG=CURRENT�TASK�POINTER �BRA�NXTTSK�CONTINUE�QUEUE�SEARCH �PAGE *ƒNAM‚TURNON �SPC�1 �ORG�$200 �SPC�1 *�HERE�TO�TURN�ON�A�TASK �SPC�2 *…CALLING�SEQƒLDX�TSK# *“LDA�B�STA#�MASK�11111101�=�STA�2 *“JSR�TURNON �SPC�2 TURNON�LDA�A�TS,X�FETCH�TASK�STATUS �BIT�A�#%00010000�IF�TASK�IS�ALREADY�ON... �BEQ�TRN2�SET�SWFS�BIT �AND�A�#$EF�CLEAR�INACTIVE�BIT �STA�A�TS,X�STORE�TASK�STATUS TRN2�AND�B�SWFS,X�SET�STATION�WAI�FOR�SERVICE �STA�B�SWFS,X�STORE�STA�WAI�FLAG �RTS�RETURN �SPC�2 *ƒNAM�TURNOF �SPC�1 �ORG�$24 0 �SPC�1 *�HERE�TO�TURN�OFF�A�TASK *�TASKA�TURNS�ITSELF�OFF �SPC�2 *…CALLING�SEQƒJMP�TURNOF �SPC�2 TURNOF�SEI �LDX�CTP�X-REG=TASK# �LDA�A�SWFS,X�FETCH�STA�WAI�FLAG �ORA�A�SIS,X�SET�STA�DONE �STA�A�SWFS,X�STORE�STA�WAI�FLAG �CLR�SIS,X�CLEAR�STA�IN�SERVICE�FLAG �COM�A�CHECK�FOR�OTHER�STA�WAI �BNE�TOUT�YES�-�RETURN�TO�EXEC �LDA�A�TS,X�NO-FETCH�TASK�STATUS�WORD �ORA�A�#$10�SET�INACTIVE�BIT �STA�A�TS,X�STORE�TASK�STATUS TOUT�JMP�TSKRTN�BACK�TO�EXEC �SPC�2 *‚NAM�TRNOFF �ORG�$25A *�HERE�FOR�TASKA�TO�TURN�OFF�TASKB *�RETURN�TO�TASKA �SPC�1 *†JSR�TRNOFF *†XR=TASK�TO�TURN�OFF �SPC�1 TRNOFF�SEI �LDA�A�SWFS,X �ORA�A�SIS,X �STA�A�SWFS,X �CLR�SIS,X �COMA �BNE�OUT1 �LDA�A�TS,X �ORA�A�#$10 �STA�A�TS,X OUT1�CLI �RTS �PAGE *ƒNAM�GIVEUP �SPC�1 �ORG�$280 �SPC�1 *�HERE�TO�GIVE�CONTROL�BACK�TO�EXEC�TEMP. �SPC�2 *…CALLING�SEQƒJSR�GIVEUP�OR�JMP�GIVEUP �SPC�2 GIVEUP�PULA�FETCH�HI�RESTART�ADR �PULB�FETCH�LO�RESTART�ADR �LDX�CTP�X-REG=TASK# �STX�INXTMP �ASL�INXTMP+1 �LDX�INXTMP �STA�A�TRA,X�STORE�RESTART�ADR �STA�B�TRA+1,X �JMP�TSKRTN�BACK�TO�EXEC �SPC�2 *ƒNAM‚NTRUPT �SPC�1 �ORG�$2C0 �SPC�1 *�HERE�IN�RESPONSE�TO�INTERRUPT �SPC�2 *…I/O�GETS�IMMEDIATE�ATTENTION *…OTHERS�GET�FLAG�SET�IN�EXEC�TABLE �SPC�2 NTRUPT�LDA�A�PIA1AC�CHECK�FOR�CRT�INPUT �BIT�A�#%10000000�START�BIT�DETECTED? �BEQ�NOTIN�NO-CHECK�IO�TIMER �BIT�A�#%00000001�YES-INPUT�ALLOWED? �BNE�VEC1‚YES-GO�GET�IT NOTIN�LDA�A�PIA1BC�FETCH�B�SIDE�CTRL �BIT�A�#%00000011�IO�TIMER�ALLOWED? �BEQ�NOTIO�NO�-�CHECK�OTHER�INTRS �BIT�A�#%10000000�YES�-�IS�IT�IO�TIMER �BNE�VEC2 �BRA�NOTIO �SPC�2 *�VECTORS�TO�I/O�ROUTINES �SPC�1 VEC1�JMP�CRTIN VEC2�JMP�BITTMR �SPC�2 *�HERE�IF�INTERRUPT�NOT�CRT�I/O �SPC�2 ********************************************************* *�USER'S�INTERRUPT�HANDLER�GOES�HERE NOTIO�NOP *********************************************************** �SPC�2 *�HERE�TO�DECODE�INTERRUPTS *�TURN�ON�INTR�HANDLER�TASKS �SPC�2 *…A-REG�HAS�INTR�REG�CONTENTS �SPC�2 �LDX�#0�SET�TASK#�PTR �LDA�B�STAMSK �COM�B�STA�MASK�EX:�STA�2�=�11111101 DECOD3�ROL�A �BCC�FLGTSK�CHECK�FOR�SERVICE�REQUEST DECOD2�INX�NEXT�TASK �CPX�#8�8�POSSIBLE�CHECKED�YET? �BNE�DECOD3�NO�-�CHECK�ANOTHER �RTI �SPC�2 FLGTSK�PSH�A�GO�TURN�ON�A�TASK �PSH�B �STX�SAVX �JSR�TURNON �PUL�B �PUL�A �LDX�SAVX �BRA�DECOD2 �SPC�2 *ƒNAM�MSGREG �SPC�1 �ORG�$380 MSGREQ�JMP�MSG1 MSGOUT�JMP�MSG2 �SPC�1 *�HERE�TO�PROCESS�CRT�OUTPUT *†JSR�MSGREQ *…LOAD�ADR�OF�MSG�IN�X-REG *…JSR�MSGOUT �SPC�2 MSG1�SEI �LDA�A�OUTPIP�FETCH�OUTPUT�IN�PROGRESS�FLAG �AND�A�INPTIP�AND�WITH�INPUT�IN�PRGS�FLAG �BEQ�NOTAVL�BUSY-RESET�TO�COME�BACK�LATER �RTS NOTAVL�LDX�CTP�X-REG=TASK# �LDA�A�TS,X�FETCH�TASK�STATUS �ORA�A�#%00000100�SET�WAITING�FOR�CRT�FLAG �STA�A�TS,X *�TRY�AGAIN�LATER�WITH�MSGREQ �TSX�SP+1->XR �LDA�A�0,X�GET�HI�RTN�ADR �LDA�B�1,X�GET�LO�RTN�ADR �SUB�B�#3�DEC�RTN�ADR�BY�3 �SBC�A�#0 �STA�A�0,X�STORE�RTN�ADR->STACK �STA�B�1,X �JMP�GIVEUP�GIVE�UP�CTRL�TO�EXEC *‹RETURN�WILL�BE�TO�TASK�THAT *ŒMADE�CRT�MSG�REQUEST�AT�JSR�MSGREQ �SPC�1 *�HERE�TO�OUTPUT�A�MSG�ON�CRT �SPC�2 *…ADR�OF�MSG�IN�X-REG �SPC�2 MSG2�STX�MSGADR�SAVE�MSG�ADR �CLR�OUTPIP�SET�XFER�IN�PROGRESS �LDX�CTP�XREG=TASK# �LDA�A�TS,X�FETCH�TASK�STATUS �ORA�A�#%00001000�SET�XFER�IN�PROGRESS �STA�A�TS,X �STX�MSGTSK�SAVE�REQ�TASK# �LDA�A�#$01�SET�NEW�CHAR�FLAG �STA�A�NUCHRF �LDX�#PIA1AD �INC�2,X�RESET�TIMER �DEC�2,X �LDA�A�2,X�CLEAR�CB1�FLAG �LDA�A�#$37�ENABLE� CB1�INTR �STA�A�3,X �JSR�GIVEUP�BACK�TO�EXEC �SPC�2 *�EXEC�RETURNS�HERE�AFTER�MSG�IS�COMPLETE �SPC�2 *…LOOK�FOR�ANOTHER�TASK�WAITING�FOR�CRT �SPC�2 �LDX�MSGTSK �INX MSGSRH�LDA�A�TS,X �BIT�A�#%00000100 �BNE�RESWAI�FOUND�A�TASK�WAITING �CPX�MSGTSK �BEQ�COMPLT �INX �CPX�#NOTSKS �BNE�MSGSRH �LDX�#0 �BRA�MSGSRH RESWAI�AND�A�#%11111011�RESET�WAITING�ON�CRT �STA�A�TS,X COMPLT�INC�OUTPIP�RESET�OUTPIP �RTS�RETURN�TO�CALLING�TASK �SPC�2 *‚NAM‚BITTMR �SPC�1 �ORG�$400 �SPC�1 *�HERE�ON�CB1�-�BIT�TIMER�-�INTERRUPT �SPC�2 BITTMR�LDX�#PIA1AD �INC�2,X�RESET�TIMER �DEC�2,X �LDA�A�2,X�CLEAR�CB1�INTR�FLAG �LDA�A�INPTIP�FETCH�INPUT�FLAG �BEQ�BITINP�BRANCH�FOR�INPUT �SPC�2 *�HERE�TO�PROCESS�OUTPUT�MESSAGE �SPC�2 �LDA�A�NUCHRF�FETCH�NEW�CHAR�FLAG �BNE�NUCHR�BRANCH�ON�NEW�CHAR �LDA�B�BITCNT�FETCH�BIT�COUNT �BLE�MRKOUT�BRANCH�TO�MARK�OUTPUT�AT�END�OF�CHAR �LDA�A�OUTCHR�FETCH�CHAR �STA�A�0,X�SEND�LSB�TO�DATA�LINE �ROR�A‚SHIFT�NEXT�BIT�INTO�LSB �STA�A�OUTCHR�SAVE�CHAR�FOR�NEXT�TIME DECCNT�DEC�B�DECREMENT�BIT�COUNT �STA�B�BITCNT �RTI �SPC�1 MRKOUT�LDA�A�#$01�MARK�COM�LINE �STA�A�0,X �TST�B�CHECK�COUNT �BEQ�DECCNT�OUTPUT�1�MORE�MARK �STA�A�NUCHRF�RESET�NEW�CHAR�FLAG �RTI �SPC�1 NUCHR�LDX�MSGADR�FETCH�CHAR�ADR �LDA�A�0,X�FETCH�CHAR �INX�INC�CHAR�ADR �STX�MSGADR CHKEOM�CMP�A�#$04�CHDB�DOR�END�OF�MESSAGE �BEQ�THTSAL�BRANCH�ON�EOM �CLR�PIA1AD�SPACE�COM�LINE �STA�A�OUTCHR�STORE�CHAR �LDA�A�#8�RESET�BIT�COUNT �STA�A�BITCNT �CLR�NUCHRF�RESET�NEW�CHAR�FLAG �RTI �SPC�1 THTSAL�LDX�MSGTSK�FETCH�TASK�NO. �LDA�A�TS,X�FETCH�TASK�STATUS �AND�A�#%11110111�RESET�XFER�INPROCESS�FLAG �STA�A�TS,X �LDX�#PIA1AD �LDA�A�#%00110100�DISABLE�CB1�INTR �STA�A�3,X �RTI �SPC�1 BITINP�JMP�BITIN  �SPC�2 *ƒNAM‚CRTIN �SPC�1 �ORG�$480 �SPC�1 *�HERE�TO�SERVICE�CA1�-�CRT�INPUT�-�INTERRUPT �SPC�2 CRTIN�CLR�INPTIP�SET�INPUT�IN�PROCESS�BUSY �LDA�A�#%00000100�DISABLE�CA1�INTR �STA�A�PIA1AC �LDX�#PIA1AD �CLR�2,X�SET�TIMER�FOR�HALF�BIT�TIME �INC�2,X�RESET�TIMER �DEC�2,X �LDA�A�2,X�CLEAR�CB1�INTR�FLAG �LDA�A�#$37 �STA�A�3,X�ENABLE�CB1�INTR �INC�NUCHRF �LDA�A�OUTPIP�CHECK�FOR�OUTPUT�IN�PROGRESS �BNE�X1�BRANCH�IF�NOT �SEC�MARK�COM�OUT�LINE �ROL�0,X �LDX�MSGTSK �LDA�A�TS,X�RESET�XFER�IN�PROGRESS �AND�A�#%11110111 �STA�A�TS,X X1�RTI �SPC�2 *ƒNAM‚BITIN �SPC�1 �ORG�$4C0 �SPC�1 *�HERE�TO�SERVICE�BIT�TIMER�DURING�CRT�INPUT �SPC�2 BITIN�LDX�#PIA1AD �LDA�A�NUCHRF�FETCH�NEW�CHAR�FLAG �BEQ�BITIN2�NOT�NEW�CHAR �LDA�A�#4�SET�TIMER�FOR�FULL�BIT�TIME �STA�A�2,X �INC�2,X�RESET�TIMER �DEC�2,X �LDA�A�2,X�CLEAR�CB1�INTR�FLAG �LDA�A�#8�SET�BITCNT �STA�A�BITCNT �CLR�INCHAR�CLEAR�INPUT�CHAR �CLR�NUCHRF�RESET�NEW�CHAR�FLAG �RTI �SPC�1 *�HERE�TO�BUILD�BIT�INTO�CHAR �SPC�1 BITIN2�LDA�A�BITCNT �BLE�BITIN3�BRANCH�FOR�MARKS �SEC�MARK�OUTPUT �ROL�0,X�SHIFT�INPUT�BIT�INTO�CARRY �LDA�B�INCHAR�FETCH�INCHAR �ROR�B�SHIFT�BIT�INTO�INCHAR �STA�B�INCHAR BITIN4�DEC�BITCNT�DECREMENT�BITCNT �RTI �SPC�1 BITIN3�BEQ�BITIN4�RETURN�-�IGNORE�STOP�BIT �LDX�#09�ECHO�TASK#�TO�XR �LDA�B�#$FE�STA1�FOR�INPUT�ECHO �JSR�TURNON�TURN�ON�ECHO�TASK �LDX�#PIA1AD �LDA�A�0,X�CLEAR�CA1�INTR�FLAG �LDA�A�#$05�ENABLE�CA1�INTR �STA�A�1,X �LDA�A�#$34�DISABLE�CB1�INTR�(TIMER) �STA�A�3,X �INC�INPTIP�CLEAR�INPUT�IN�PROGRESS �RTI �SPC�2 *ƒNAM‚WAITFI �SPC�1 �ORG�$540 �SPC�1 *�HERE�TO�GIVE�UP�CONTROL�AND�WAIT�FOR�INPUT �SPC�2 *…X-REG=�CHAR�BUFFER�ADR *…BSR�WAITFI �SPC�2 WAITFI�LDA�A�CHRBF�FETCH�CHAR�BUFFER�FLA G �BEQ�EMPTY �CLR�CHRBF �LDA�A�HLDBUF�PUT�CHAR�IN�USERS�BUFFER �STA�A�0,X �RTS EMPTY�STX�TSKBUF�SAVE�BUFFER�ADR �LDX�CTP �STX�TSKWOI�SAVE�TASK�NO. �LDA�A�TS,X �ORA�A�#%00100000�SET�WAIT�ON�INPUT�FLAG �STA�A�TS,X �JMP�GIVEUP �SPC�2 *ƒNAM�ECHO �SPC�1 �ORG�$580 �SPC�1 *�TASK�9�-�ECHO�AND�DECODE�CRT�INPUT �SPC�2 ECHO�JSR�MSGREQ�GET�MSG�HANDLER �LDA�A�INCHAR�FETCH�CHAR �STA�A�ECOSRG�STORE�IN�ECHO�STRING �LDX�#ECOSRG�OUTPUT�MSG �JSR�MSGOUT �LDA�A�INCHAR �AND�A�#$7F �STA�A�INCHAR �BRA�ECHO2 �SPC�2 *�HERE�IF�A�TASK�IS�WAITING�FOR�INPUT �SPC�2 ECHO1�LDX�TSKBUF�FETCH�TASK�BUFFER�ADR �LDA�A�INCHAR �STA�A�0,X�STORE�CHAR�IN�TASK�BUF �CLR�CHRBF�CLEAR�BUFFER�FULL�FLAG �LDX�TSKWOI �LDA�A�TS,X�RESET�TASK�WAITING�FOR�INPUT�FLAG �AND�A�#%11011111 �STA�A�TS,X �BRA�EXTECO �SPC�2 �SPC�2 ECHO2�LDA�A�INCHAR�CHECK�CONTROL�BLOCK �CMP�A�#%01 �BLT�ECHO3 �CMP�A�#$06 �BGT�ECHO3 �SPC�2 *�HERE�IF�IT�IS�A�CONTROL�CHAR *�TURN�OFF�ANY�TASK�WFI �SPC�1 �LDX�TSKWOI �CPX�#$0000 �BEQ�CC �LDA�A�TS,X �AND�A�#%11011111�RESET�TASK�WAITING�FOR�INPUT�FLAG �STA�A�TS,X �JSR�TRNOFF CC�LDA�A�INCHAR �ADD�A�#09�MAKE�POINTER�TO�CONTROL�TASK �STA�A�TSKWOI+1 �LDX�TSKWOI �CLR�TSKWOI �CLR�TSKWOI+1 �LDA�B�#$FE�STA1�MASK �JSR�TURNON �BRA�EXTECO �SPC�2 *�HERE�TO�SAVE�CHAR�UNTIL�SOMEBODY�WANTS�IT �SPC�2 ECHO3�LDA�A�TSKWOI+1�CHECK�FOR�TASK�WOI �BNE�ECHO1 �LDA�A�INCHAR �STA�A�HLDBUF�SAVE�CHAR �INC�CHRBF‚SET�FLAG EXTECO�JMP�TURNOF �SPC�2 *�EXAMPLE�CONTROL�TASK�-�TASK�#10 �SPC�1 *�THIS�TASK�IS�STARTED�BY�THE�EXEC�IN�RESPONSE *�TO�A�CTRL�A�TYPED�ON�THE�TTY.‚IT�PRINTS�A *�MESSAGE�TO�THE�OPERATOR. �SPC�1 �ORG�$0600 �SPC�1 CTRLA�JSR�MSGREQ�REQUEST�MESSAGE�HANDLER �SPC�1 *�CONTROL�RETURNS�HERE�WHEN�MSG�HANDLER�READY �LDX�#MSG�XR=ADR�OF�MSG �JSR�MSGOUT�OUTPUT�MESSAGE �SPC�1 *�CONTROL�RETURNS�HERE�AFTER�MSG�COMPLETE *�OTHER�TASKS�MAY�RUN�WHILE�MSG�IS�TYPED �JMP�TURNOF�TURN�OFF�THIS�TASK�-�BACK�TO�EXEC �SPC�1 MSG�FCB�$0D,$0A�CR-LF �FCC�/THIS�IS�A�REAL-TIME�RESPONSE�/ �FCC�/TO�A�CONTROL�CHARACTER/ �FCB�$0D,$0A�CR-LF �FCC�/OTHER�TASKS�CAN�RUN�/ �FCC�/WHILE�THIS�MESSAGE�IS�PRINTING/ �FCB�$0D,$0A,$04�$04�TERMINATES�MSG �END ÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅ0�€1�NAM�BLKJCK *�BLACKJACK�REV�1.5�RICK�STERLING�QUAD�EIGHT�ELEC.�8/16/76 * *�NOTE�TO�USERS,�THERE�IS�A�TIMER�INCORPORATED�IN *�THIS�PROGRAM.�IT�IS�USED�TO�GENERATE�DELAYS�DURING *�PLAY�WHEN�OPERATING�AT�9600�BAUD.�THOSE�OF�YOU�WHO *�ARE�USING�SLOWER�BAUD�RATES�MAY�WISH�TO�DELETE�THIS *�FUNCTION. �OPT�O,NOG DLRTOT�EQU�$309 PLRTOT�EQU�$30A DLRSAV�EQU�$305 PLRSAV�EQU�$306 PLRACE�EQU�$307 DLRACE�EQU�$308 SAVEX�EQU�$300 DKPNTR�EQU�$302 FLAG�EQU�$304 RANDNO�EQU�$100 TEMP�EQU�$104 DECK�EQU�$105 �ORG�$1000 *�INITIALIZE�STACK�POINTER�PRINT�MESSAGE *�CLEAR�SCORE�CLEAR�CARD�MEMORY START�LDAA�#$39 �STAA�$FCF4 �LDS�#$FF0 �LDX�#SHUF �JSR�PRINT �LDX�#$3030 �STX�PLRSCR �STX�DLRSCR �CLR�DLRTOT �CLR�PLRTOT *�JUMP�TO�SHUFFLE�ROUTINE�REPEAT�UNTIL *�KEY�PUSHED LOOPC�JSR�SHUFLE+6 �LDAA�$FCF4 �ASRA �BCC�LOOPC �LDAA�$FCF5 �LDX�#DECK �STX�DKPNTR *�PLAY�STARTS�HERE,�ALL�TEMP�REGISTERS�ARE� *�CLEARED START1�CLR� FLAG �JSR�SCORE �CLR�PLRACE �CLR�DLRACE �CLR�DLRSAV �CLR�PLRSAV �JSR�TIME �LDX�#OVRLY �JSR�PRINT START2�JSR�DEAL �JSR�SCALE �JSR�PLRCRD �JSR�OUTCD �LDX�#SPACE �JSR�PRINT �JSR�DEAL �JSR�SCALE �JSR�DLRCRD �LDAB�FLAG �BEQ�FIRST �STAA�TEMP �BRA�SECOND FIRST�JSR�OUTCD SECOND�LDAA�#$A �JSR�COUT �LDAA�#$D �JSR�COUT �INC�FLAG �LDAA�FLAG �CMPA�#2 �BNE�START2 �LDAA�PLRSAV �CMPA�#22 �BNE�NEX1 �LDAA�#12 �STAA�PLRSAV �DEC�PLRACE NEX1�CMPA�#21 �BNE�CKDLR �LDX�#PLRBKJ �JSR�PRINT �INC�PLRTOT �JMP�START1 COUT�EQU�*�CHARATOR�OUTPUT�ROUTINE �PSHB�SAVE�B�REGISTER �LDAB�$FCF4�CONTROL�REG �ASRB �ASRB �BCC�COUT+1 �STAA�$FCF5�OUTPUT�CHAR �CLRB �DECB �BNE�*-1 �PULB�RESTORE�B�REG �RTS SCORE�TST�DLRTOT �BEQ�NEXT1 �CLR�DLRTOT �LDX�#DLRSCR �BSR�BCDADD NEXT1�TST�PLRTOT �BEQ�OUT7 �CLR�PLRTOT �LDX�#PLRSCR �BSR�BCDADD OUT7�RTS BCDADD�LDAA�1,X �LDAB�X �ANDA�#$F �ANDB�#$F �ASLB �ASLB �ASLB �ASLB �ABA �ADDA�#1 �DAA �TAB �ANDB�#$F �ADDB�#$30 �STAB�1,X �LSRA �LSRA �LSRA �LSRA �ADDA�#$30 �STAA�X �RTS TIME�CLRA TIMEL�LDX�#$0000�THIS�VALUE�MAY�BE�ADJ.�FOR�DIFFERENT�TIMEOUT LOOPT�INX �BNE�LOOPT �INCA �CMPA�#5�THIS�VALUE�MAY�BE�ADJ.�FOR�DIFFERENT�TIMEOUT �BNE�TIMEL �RTS CKDLR�LDAA�DLRSAV �CMPA�#22 �BNE�NEX2 �LDAA�#12 �STAA�DLRSAV �DEC�DLRACE NEX2�CMPA�#21 �BNE�HIT1 �LDX�#DWNCDM �JSR�PRINT �LDAA�TEMP �JSR�OUTCD �LDX�#DLRBKJ �JSR�PRINT �INC�DLRTOT �JMP�START1 HIT1�LDX�#HITMES �JSR�PRINT �JSR�CIN �CMPA�#$31 �BEQ�HIT2 �JMP�DLRNXT HIT2�JSR�DEAL �JSR�SCALE �JSR�PLRCRD �JSR�OUTCD �LDAA�PLRSAV �CMPA�#21 �BHI�BUST1 �BRA�HIT1 BUST1�LDAA�PLRACE �BEQ�BUST1A �DEC�PLRACE �LDAA�PLRSAV �SUBA�#10 �STAA�PLRSAV �BRA�HIT1 BUST1A�LDX�#DWNCDM �JSR�PRINT �LDAA�TEMP �JSR�OUTCD �LDX�#BUST �JSR�PRINT �BRA�DLRWIN DLRNXT�LDX�#DWNCDM �JSR�PRINT �LDAA�TEMP �JSR�OUTCD �LDAA�#$A �JSR�COUT �LDAA�#$D �JSR�COUT DLRNX2�LDAA�DLRSAV �CMPA�#16 �BHI�STOP �LDX�#SPC18 �JSR�PRINT �JSR�DEAL �JSR�SCALE �JSR�DLRCRD �JSR�OUTCD �BRA�DLRNX2 SCALE�TAB �ANDB�#$F �INCB �CMPB�#1 �BEQ�ACE �CMPB�#10 �BHI�TENS �RTS ACE�LDAB�#11 �RTS TENS�LDAB�#10 �RTS STOP�CMPA�#21 �BHI�BUST2 �CMPA�PLRSAV �BHI�DLRWIN �BEQ�PUSH PLRW�LDX�#PLRWIN �JSR�PRINT �INC�PLRTOT �BRA�OUT5 DLRWIN�LDX�#DLRWMS �JSR�PRINT �INC�DLRTOT OUT5�JMP�START1 BUST2�LDAA�DLRACE �BEQ�BUST2A �DEC�DLRACE �LDAA�DLRSAV �SUBA�#10 �STAA�DLRSAV �BRA�DLRNX2 BUST2A�LDX�#BUST �JSR�PRINT �BRA�PLRW PUSH�LDX�#PUSHM �JSR�PRINT �BRA�OUT5 �JMP�START1 OUTCD�PSHA �ANDA�#$F �TAB �ABA �ABA �ABA �ABA �CLRB �LDX�#CARD �STX�SAVEX �ADDA�SAVEX+1 �ADCB�SAVEX �STAA�SAVEX+1 �STAB�SAVEX �LDX�SAVEX �LDAB�#5 �BSR�PRINK �LDAA�#'/ �JSR�COUT �PULA �ANDA�#$30 �LSRA �LDX�#SUIT �CLRB �STX�SAVEX �ADDA�SAVEX+1 �ADCB�SAVEX �STAA�SAVEX+1 �STAB�SAVEX �LDX�SAVEX �LDAB�#8 �JSR�PRINK �RTS PRINK�LDAA�X �JSR�COUT �INX �DECB �BNE�PRINK �RTS DEAL�LDX�DKPNTR �CPX�#DECK+52 �BNE�DECKOK �LDX�#SHUF2 �JSR�PRINT �INS �INS �JMP�LOOPC DECKOK�LDX�DKPNTR �LDAA�X �INC�DKPNTR+1 �RTS PLRCRD�CMPB�#11 �BNE�PLRCR1 �INC�PLRACE PLRCR1�ADDB�PLRSAV �STAB�PLRSAV �RTS DLRCRD�CMPB�#11 �BNE�DLRCR1 �INC�DLRACE DLRCR1�ADDB�DLRSAV �STAB�DLRSAV �RTS SPACE�FCC�4,� �FCB�$4 CARD�FCC�'‚ACE‚TWOTHREE�FOUR�FIVE‚SIXSEVEN' �FCC�'EIGHT�NINE‚TEN�JACKQUEEN�KING' SUIT�FCC�'SPADES‚HEARTS‚CLUBSƒDIAMONDS' HITMES�FCB�$A,$D �FCB�$3F,$1A,$4 BUST�FCB�$A,$D,$7 �FCC�'BUST' �FCB�,$4 SPC18�FCB�$A,$D �FCC�'DEALER�DRAWS�A„' �FCB�$4 PLRWIN�FCB�$A,$D,$7 �FCC�'YOU�WIN' �FCB�$A,$D,$4 DLRWMS�FCB�$A,$D,$7 �FCC�'DEALER �WINS' �FCB�$A,$D,$4 PLRBKJ�FCB�$A,$D �FCC�'B�L�A�C�K�J�A�C�K„Y�O�UƒW�I�N�!�!' �FCB�$4 DLRBKJ�FCB�$A,$D �FCC�'B�L�A�C�K�J�A�C�K„I„W�I�N�!�!�!' �FCB�$4 PUSHM�FCB�$A,$D,$7 �FCC�'PUSH' �FCB�$4 DWNCDM�FCB�$A,$D �FCC�'MY�DOWN�CARD�WAS‚' �FCB�$4 CIN�EQU�* �LDAA�$FCF4 �ASRA �BCC�CIN �LDAA�$FCF5 �ANDA�#$7F �RTS *�THIS�SUB-ROUTINE�GENERATES�A�52�CARD�DECK SHUFLE‚LDX�#SHUF2 �JSR�PRINT �JSR�INIT LOOP4�JSR�RANDOM �JSR�CHECK �JSR�LOAD �BCC�LOOP4 �RTS *�THIS�IS�A�32�BIT�RANDOM�(PSEUDO)�NUMBER�GENERATOR *�4.29X10^9�STATES RANDOM‚LDAA�RANDNO+3 �ORAA�RANDNO+2 �ORAA�RANDNO+1 �ORAA�RANDNO �BNE�SKIP�IF�ZERO�ENTER�ALL�1'S �COM�RANDNO+3 SKIP�LDAA�RANDNO+3 �LSRA �LSRA �LSRA �EORA�RANDNO+3 �ASRA �ASRA �ROR�RANDNO �ROR�RANDNO+1 �ROR�RANDNO+2 �ROR�RANDNO+3 �RTS *�MODULO�52�MASK CHECK‚LDAA�RANDNO �EORA�RANDNO+1 �EORA�RANDNO+2 �EORA�RANDNO+3 �TAB �ANDA�#$F �CMPA�#12 �BLE�OK �SUBA�#13 OK�ANDB�#$30 �ABA �RTS *�SUBROUTINE�TO�LOAD�DECK�FROM�RANDOM�#�GEN. LOAD‚LDX�#DECK LOOP2�LDAB�X �BMI�ENT �CBA �BEQ�OUTNG �INX �CPX�#DECK+52 �BEQ�OUTOK �BRA�LOOP2 ENT�STAA�X OUTNG�CPX�#DECK+51 �BEQ�OUTOK �CLC �RTS OUTOK�SEC �RTS SHUF�FCB�$06,06,$0C,,,,,,$A,$D �FCC�'THIS�IS�MOTOROLA�BLACKJACK......' �FCC�'.........TRY�YOUR�LUCK.....!' �FCB�$D,$A �FCB�6,7 �FCC�'DEALER�MUST�HIT�ON�16�OR�LESS�AND' �FCC�'�STAND�ON�17.' �FCB�$D,$A,,,,, �FCC�'ACES�COUNT�1�OR�11�,�FACE�CARDS' �FCC�'�COUNT�TEN.' �FCB�$D,$A,,,,, �FCC�'BLACKJACK�WITH�ACE�AND�A�FACE�CARD' �FCC�'�OR�TEN' �FCB�$D,$A,,,,, �FCC�'TIES�COUNT�AS�A�PUSH�NO�WINNER.' �FCB�$D,$A,,,,, �FCC�'DURING�PLAY�TYPE�1�FOR�A�HIT,0�TO' �FCC�'�STAND�PAT' �FCB�$D,$A,,,,, SHUF2�FCB�$D,$A,6,2,, �FCC�'SHUFFLE�NOW�IN�PROGRESS.............' �FCC�'TYPE�ANY�KEY�TO�HALT�AND�DEAL' �FCB�6,1 �FCB�$D,$A,,,,, �FCB�$4 PRINT�EQU�* �LDAA�X �CMPA�#$4 �BNE�NOTEND �RTS NOTEND�JSR�COUT �INX �BRA�PRINT INIT�EQU�*�INITIALIZE�DECK�FOR�LOAD� *�ROUTINE�,�ALL�CARDS�EQUAL�FF �LDX�#DECK �LDAA�#$FF LOOP7�STAA�X �INX �CPX�#DECK+52 �BNE�LOOP7 �RTS OVRLY�FCB�$0C,,, �FCB�$D,$A,,,,, �FCC�4,� �FCC�'PLAYER' �FCC�13,� �FCC�'DEALER' �FCB�$D,$A,,, �FCC�6,� PLRSCR�RMB�2 �FCC�17,� DLRSCR�RMB�2 �FCB�$D,$A,$A,$4 �END� �MON ÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅš€  NAM BINBCD OPT MEM OPT S SPC 1 ********** * THIS ROUTINE CONVERTS A 16-BIT UNSIGNED BINARY * NUMBER TO A PACKED 5-DIGIT (3 BYTE) BCD * EQUIVALENT. REV. 1.0 10/18/75 * AUTHOR: DON L. JACKSON, MOTOROLA SPD M/D BB102 ********** SPC 1 ORG $0 BIN1 RMB 1 *MS BYTE OF BINARY NUMBER BIN0 RMB 1 *LS BYTE OF BINARY NUMBER DEC2 RMB 1 *MS 1 DIGIT OF BCD RESULT DEC1 RMB 1 * 2 DIGITS OF BCD RESULT DEC0 RMB 1 *LS 2 DIGITS OF BCD RESULT SPC 1 CONB7 FCB $28,1,,$64,,,$32,,,$16,,0 CONB15 FCB $68,$27,3,$84,$63,1,$92,$81,0 FCB ,$56,2,0 ORG $500 BINBCD CLR A *CLEAR THE STA A DEC1 * RESULT STA A DEC2 * AREA SPC 1 LDA B BIN0 AND B #$F *SAVE 4 LSB ABA *ADD TO ACC A DAA *DECIMAL ADJUST STA A DEC0 *STORE IN ANSWER LSD SPC 1 LDX #CONB7-3 LDA B BIN0 *LOAD LOWEST 8 BITS AND B #$F0 *SAVE 4 MSB OF LOWEST BYTE BSR BI TSR LDX #CONB15-3 LDA B BIN1 *LOAD HIGHEST 8 BITS BITSR INX *SET X TO CONSTANT INX INX ASL B *SHIFT BIT TO CARRY BCC NEXTB *BRANCH IF BIT IS ZERO BSR ADDSR *ADD CONSTANT IF NOT ZERO NEXTB TST B BNE BITSR *DO NEXT BIT IF ANY REMAIN RTS SPC 1 ADDSR LDA A DEC0 *ADD CONSTANT TO RESULT ADD A 0,X * SUBROUTINE. DAA STA A DEC0 LDA A DEC1 ADC A 1,X DAA STA A DEC1 LDA A DEC2 ADC A 2,X DAA STA A DEC2 RTS MON |�@½€Â�NAM�MATHPAK * * *‡VERSION�1.0 * * *‡LAST�ACCESS�DATE:‚27�OCTOBER�1975 * * *‡WRITTEN�BY:‚RAYMOND�H.�NAUGLE *”MOTOROLA,�INC.,�SPD *”2626�S.�HARDY *”TEMPE,�ARIZONA *”(602)�244-4182 *”DI-TEL�222-4182 * * *‡THIS�IS�A�GROUP�OF�8�MULTIPLE-PRECISION *‡BCD�ARITHMETIC�SUBROUTINES: * *‡1.ƒINTEGER�ADDITION * *‡2.ƒINTEGER�SUBTRACTION * *‡3.ƒINTEGER�MULTIPLICATION * *‡4.ƒINTEGER�DIVISION * *‡5.ƒFLOATING�POINT�ADDITION * *‡6.ƒFLOATING�POINT�SUBTRACTION * *‡7.ƒFLOATING�POINT�MULTIPLICATION * *‡8.ƒFLOATING�POINT�DIVISION * *‡INCLUDED�IS�A�SUBROUTINE�TO�MOVE�THE *‡NUMBERS�TO�BE�OPERATED�ON�INTO�AND�OUT�OF *‡THE�RAM�LOCATIONS�USED�AS�SCRATCHPAD. * *‡ALSO�FOR�FLOATING�POINT�NUMBERS�A *‡SUBROUTINE�IS�INCLUDED�TO�DELETE�THE *‡LEADING�ZEROS�AND�ADJUST�THE�EXPONENT *‡ACCORDINGLY. �PAGE *‡NUMBER�DEFINITION: * *‡-�INTEGER * *ŽDDDDD. * *‡WHERE�D�CONTAINS�TWO�DECIMAL�DIGITS�(BCD). *‡THE�NUMBER�OF�D'S�IN�A�NUMBER�IS�DEPENDENT *‡ON�THE�NUMBER�ASSIGNED�TO�ND�AND�NDD *‡DURING�ASSEMBLY.‚THE�DECIMAL�POINT�IS� *‡ASSUMED�TO�BE�AFTER�THE�LAST�D,�RIGHT *‡HAND�JUSTIFICATION. * *‡-�FLOATING�POINT * *ŽAB.DDDDD * *‡WHERE�AB�CONTAINS�THE�EXPONENT�AND�SIGNS *‡OF�THE�EXPONENT�AND�NUMBER.‚THE�DECIMAL *‡POINT�IS�ASSUMED�TO�PRECEED�THE�NUMBER. *‡EACH�D�CONTAINS�TWO�DECIMAL�DIGITS�(BCD). *‡AGAIN�THE�NUMBER�OF�D'S�IS�DEPENDENT�ON *‡THE�VALUE�ASSIGNED�TO�ND�AND�NDD�DURING *‡THE�ASSEMBLY�OF�THE�SUBROUTINES. * *ŽA�=�7�6�5�4�3�2�1�0ƒ(BIT�NUMBERS) * *‡BIT�7�IS�THE�SIGN�BIT�OF�THE�NUMBER. *�0=+,�1=-. *‡BIT�6�IS�THE�SIGN�BIT�OF�THE�EXPONENT. *�0=+,�1=-. *‡BIT�5�IS�THE�ERROR/ZERO�BIT.‚IN�THESE *�SUBROUTINES�THIS�BIT�IS�USED�TO� *�INDICATE�IF�THE�NUMBER�IS�EQUAL�TO *�ZERO�BUT�IN�FURTHER�SUBROUTINES�IT *�COULD�BE�USED�TO�INDICATE�ERROR, *�SUCH�AS�A�DIVIDE�BY�ZERO�OPERATION. *‡BIT�4�IS�THE�OVERFLOW�OF�THE�EXPONENT. *�IF�THE�EXPONENT�SHOULD�OVERFLOW�THIS *�BIT�WILL�BE�SET,�CLEAR�OTHERWISE. *‡BITS�3,2,1,0�CONTAIN�THE�UPPER�DIGIT�OF *�THE�THREE�DECIMAL�DIGIT�EXPONENT. * *ŽB * *‡B�CONTAINS�THE�LOWER�TWO�DECIMAL�DIGITS�OF *‡THE�EXPONENT. �PAGE *‡BCD�ARITHMETIC�OPERATIONS * *‡INPUTS: * *‡-�INTEGER * *‡THE�TWO�NUMBERS�TO�BE�OPERATED�ON�ARE *‡TO�BE�PLACED�IN�THE�A�AND�C�REGISTERS. * *‡-�FLOATING�POINT * *‡THE�TWO�NUMBERS�TO�BE�OPERATED�ON�ARE *‡TO�BE�PLACED�IN�THE�A�AND�C�REGISTERS. *‡THE�EXPONENT�OCCUPIES�THE�FIRST�TWO�BYTES *‡OF�THE�REGISTER.‚THE�NUMBER�OCCUPIES�THE� *‡REMAINDER�OF�THE�REGISTER�AND�THE�FIRST *‡TWO�BYTES�OF�THE�FOLLOWING�REGISTER. * *‡OUTPUTS: * *‡-�INTEGER * *‡THE�ANSWER�IS�LOCATED�IN�THE�E�REGISTER. *‡THE�A�REGISTER�ALSO�RETURNS�WITH�ITS� *‡ORIGINAL�VALUE.‚THIS�FEATURE�MAY�BE�USED *‡FOR�MAKING�LOOKUP�TABLES. * *‡-�FLOATING�POINT * *‡THE�ANSWER�IS�LOCATED�IN�THE�D�REGISTER. *‡THE�EXPONENT �IS�IN�THE�FIRST�TWO�BYTES *‡FOLLOWED�BY�THE�NUMBER�IN�THE�REMAINDER *‡OF�THE�REGISTER�AND�THE�FIRST�TWO�BYTES *‡OF�THE�E�REGISTER.‚THE�NUMBER�ENTERED�IN *‡THE�A�REGISTER�ALSO�IS�RETURNED�WITH�THE *‡ORIGINAL�VALUE,�USEFUL�IN�MAKING�LOOKUP *‡TABLES. �PAGE �OPT�O �ORG�$0 *ƒBY�CHANGING�THE�FOLLOWING�TWO�NUMBERS *ƒTHE�PRECISION�OF�THE�SUBROUTINES�MAY� *ƒBE�ALTERED.‚THE�NUMBER�ENTERED�SHOULD *ƒBE�AN�EVEN�NUMBER. ND�EQU�10�NUMBER�OF�DIGITS NDD�EQU�$10�NUMBER�OF�DIGITS *ƒTHE�ASSEMBLER�CALCULATES�THE�REQUIRED�NUMBER *ƒOF�BYTES�FOR�THE�NUMBER�OF�DIGITS�ENTERED NB�EQU�ND/2�THIS�IS�THE�NUMBER�OF�BYTES *ƒTHE�FOLLOWING�DEFINES�THE�RAM�LOCATIONS *ƒNEEDED�TO�OPERATE�THE�SUBROUTINES. *ƒTHE�ORDER�SHOULD�NOT�BE�CHANGED. EXP2�RMB�2�STORAGE�FOR�FLOATING�EXP.�#2 EXP1�RMB�2�STORAGE�FOR�FLOATING�EXP.�#1 AREG�RMB�NB�ENTER�FIRST�NUMBER�HERE BREG�RMB�NB�SCRATCH CREG�RMB�NB�ENTER�SECOND�NUMBER�HERE DREG�RMB�NB�FLOATING�POINT�ANSWER EREG�RMB�NB�INTERGER�ANSWER �RMB�2�BUFFER�FOR�FLOATING�POINT ADRSAV�RMB�2�ADDRESS�POINTER EXPSAV�RMB�2�EXPONENT�SCRATCH COUNTR�RMB�1�COUNTER ADRTO�RMB�2�MOVE�ADDRESS�TO ADRFM�RMB�2�MOVE�ADDRESS�FROM �ORG�$1000 �PAGE *„THIS�SUBROUTINE�MOVES�A�NUMBER�FROM�MEMORY�TO *‚THE�A�OR�C�REGISTER.‚ALSO�THIS�WILL�MOVE�THE *‚D�OR�E�REGISTER�TO�SOME�LOCATION�IN�MEMORY. * *„THIS�SUBROUTINE�IS�ENTERED�BY�LOADING�THE *‚INDEX�REGISTER�WITH�THE�BEGINING�MEMORY�LOCATION *‚AND�GOING�TO�THE�APPROPRIATE�ENTRY�POINT. * *„THE�ENTRY�POINT�LABELS�USED�HERE�ARE *„AS�FOLLOWS: * *„-�THE�FIRST�LETTER�INDICATES�THE�TYPE�OF *†NUMBER�BEING�MOVED- *ˆI�FOR�INTEGER *ˆF�FOR�FLOATING�POINT * *„-�THE�SECOND�LETTER�INDICATES�DIRECTION�OF *†MOVEMENT- *ˆT�IS�FOR�MOVING�A�NUMBER�TO *ŠTHE�REGISTERS *ˆF�IS�FOR�MOVING�A�NUMBER�FROM *ŠTHE�REGISTERS * *„-�THE�FOLLOWING�FOUR�LETTERS�INDICATE�THE *†REGISTER�INVOLVED�IN�THE�MOVE. ITAREG�LDA�B�#NB�NUMBER�OF�BYTES�TO�MOVE �BRA�*+4 FTAREG�LDA�B�#NB+2�NUMBER�OF�BYTES�TO�MOVE �STX�ADRFM�SAVE�ADDRESS�FROM �LDX�#AREG �STX�ADRTO�SAVE�ADDRESS�TO �BRA�MOVER�GO�TO�MOVER ITCREG�LDA�B�#NB�NUMBER�OF�BYTES�TO�MOVE �BRA�*+4 FTCREG�LDA�B�#NB+2�NUMBER�OF�BYTES�TO�MOVE �STX�ADRFM�SAVE�ADDRESS�FROM �LDX�#CREG �STX�ADRTO�SAVE�ADDRESS�TO �BRA�MOVER�GO�TO�MOVER IFEREG�LDA�B�#NB�NUMBER�OF�BYTES�TO�MOVE �STX�ADRTO�SAVE�ADDRESS�TO �LDX�#EREG �STX�ADRFM�SAVE�ADDRESS�FROM �BRA�MOVER�GO�TO�MOVER FFDREG�LDA�B�#NB+2�NUMBER�OF�BYTES�TO�MOVE �STX�ADRTO�SAVE�ADDRESS�TO �LDX�#DREG �STX�ADRFM�SAVE�ADDRESS�FROM MOVER�LDX�ADRFM�MOVE�DATA�FROM�LOCATION �LDA�A�0,X�POINTED�AT�BY�ADRFM �INX�TO�LOCATION�POINTED�AT �STX�ADRFM�BY�ADRTO �LDX�ADRTO�* �STA�A�0,X�* �INX�* �STX�ADRTO�* �DEC�B�* �BNE�MOVER�MOVER�FINISHED? �RTS�RETURN.�MOVE�FINISHED!!! *ƒTHIS�SUBROUTINE�ADDS�TWO�UNSIGNED� *ƒINTEGER�NUMBERS *…1ST�NUMBER�IN�THE�A�REGISTER *…2ND�NUMBER�IN�THE�C�REGISTER *ƒTHE�ANSWER�IS�IN�THE�E�REGISTER.� *ƒIF�ANY�OVERFLOW�OCCURED�WHILE�ADDING�THE�NUMBERS *ƒIT�WILL�BE�PLACED�IN�LOCATION�EREG-1 ADD�LDX�#BREG �LDA�B�#NB �CLC ADD10�DEX�ADDITION�LOOP �LDA�A�0,X�* �ADC�A�2*NB,X�* �DAA�* �STA�A�4*NB,X�* �DEC�B�* �BNE�ADD10�* �STA�B�EREG-1 �BCC�ADD20�ADDITION�OVERFLOW�? �INC�EREG-1�YES,�ADD�TO�NUMBER�STRING ADD20�LDX�#EREG-1 ADD30�DEX�CLEAR�D�REGISTER �STA�B�0,X�* �CPX�#DREG�* �BNE�ADD30�* �RTS�RETURN.�ADDITION�FINISHED!!! *ƒTHIS�SUBROUTINE�SUBTRACTS�TWO�UNSIGNED *ƒINTEGER�NUMBERS *…1ST�NUMBER�IN�A�REGISTER *…2ND�NUMBER�IN�C�REGI STER *ƒTHE�ANSWER�IS�IN�THE�E�REGISTER�IN�MAGNITUDE *ƒFORM.�IF�THE�NUMBER�IN�THE�C�REGISTER�IS *ƒLARGER�THAN�THE�NUMBER�IN�THE�A�REGISTER *ƒA�FLAG�WILL�BE�SET�IN�THE�MSB�OF� *ƒLOCATION�DREG�INDICATING�A�NEGATIVE�ANSWER. SUB�LDX�#CREG �LDA�B�#NB SUB10�DEX�SETUP�CREG�FOR�SUBTRACT �LDA�A�#$99�9'S�COMPLIMENT�FORM �SUB�A�NB,X�* �STA�A�NB,X�* �DEC�B�* �BNE�SUB10�* �LDA�B�#NB �SEC SUB20�DEX�ADD�10'S�COMPLIMENT �LDA�A�0,X�OF�CREG�TO�AREG �ADC�A�2*NB,X�* �DAA�* �STA�A�4*NB,X�* �DEC�B�* �BNE�SUB20�* �BCS�SUB40�WAS�A�LARGER�THAN�C�? �LDX�#EREG+NB�NO,�C�WAS�LARGER�THAN�A� �LDA�B�#NB SUB30�DEX�FIND�9'S�COMPLIMENT �LDA�A�#$99�OF�ANSWER �SUB�A�0,X�* �STA�A�0,X�* �DEC�B�* �BNE�SUB30�* �LDA�B�#NB �SEC SUB35�DEX�ADD�1�TO�9'S�COMPLIMENT �LDA�A�#00�TO�FORM�10'S�COMPLIMENT �ADC�A�NB,X�ANSWER�IN�MAGNITUDE�FORM �DAA�* �STA�A�NB,X�* �DEC�B�* �BNE�SUB35�* �LDA�A�#$80�SET�SIGN�FLAG �STA�A�0,X�* �CLR�A �LDA�B�#NB-1 �BRA�SUB50 SUB40�LDX�#DREG�YES,�A�WAS�LARGER�THAN�C �LDA�B�#NB-1 �CLR�A �STA�A�0,X SUB50�INX�CLEAR�D�REGISTER �STA�A�0,X�* �DEC�B�* �BNE�SUB50�* �RTS�RETURN.�SUBTRACT�FINISHED!!! *ƒTHIS�SUBROUTINE�MULTIPLIES�TWO�UNSIGNED *ƒINTEGER�NUMBERS *…1ST�NUMBER�IN�A�REGISTER *…2ND�NUMBER�IN�C�REGISTER *ƒTHE�ANSWER�IS�IN�THE�E�REGISTER. *ƒIF�ANY�OVERFLOW�OCCURS�WHEN�MULTIPLYING *ƒIT�WILL�BE�LOCATED�IN�THE�D�REGISTER. MUL�LDX�#EREG�CLEAR�ANSWER�LOCATION--- �LDA�B�#2*NB�D�REGISTER�AND�E�REGISTER �CLR�A�* MUL05�DEX�* �STA�A�NB,X�* �DEC�B�* �BNE�MUL05�CLEAR�FINISHED? �LDA�B�#NB�YES,�CLEAR�B�REGISTER MUL10�DEX�* �STA�A�0,X�* �DEC�B�* �BNE�MUL10�CLEAR�FINISHED? MUL15�DEX�YES,�MULTIPLICATION�LOOP �CPX�#AREG-1�* �BNE�MUL20�LOOP�FINISHED? �RTS�RETURN.�MULTIPLY�FINISHED!!! MUL20�STX�ADRSAV�CHECK�RIGHT�DIGIT �LDA�B�0,X�* �AND�B�#$0F�* �BEQ�MUL30�RIGHT�DIGIT�CLEAR? MUL25�BSR�MUL45�NO,�ADD�B,C�REG�TO�D,E�REG �DEC�B �BNE�MUL25�IS�ADDITION�FINISHED? MUL30�BSR�MUL55�YES,�MOVE�B,C�REG�4�BITS�LEFT �LDA�B�0,X�CHECK�LEFT�DIGIT �AND�B�#$F0�* �BEQ�MUL40�LEFT�DIGIT�CLEAR? �LSR�B�NO,�SHIFT�COUNTER�4�BITS �LSR�B�* �LSR�B�* �LSR�B�* MUL35�BSR�MUL45�ADD�B,C�REG�TO�D,E�REG �DEC�B �BNE�MUL35�IS�ADDITION�FINISHED? MUL40�BSR�MUL55�YES,SHIFT�B,C�REG�4�BITS�LEFT �BRA�MUL15�GO�TO�TOP�OF�SUBROUTINE MUL45�CLC�ADDITION�SUBROUTINE: MUL50�LDA�A�2*NB,X�ADD�B,C�REG�TO�D,E�REG �ADC�A�4*NB,X�*� �DAA�*� �STA�A�4*NB,X�* �DEX�* �CPX�#AREG-NB-1 �BNE�MUL50�ADDITION�FINISHED? �LDX�ADRSAV�YES �RTS�RETURN.�ADD�FINISHED MUL55�LDA�A�#$04�4�BIT�SHIFT�SUBROUTINE: MUL60�LDA�B�#2*NB�SHIFT�B,C�REG�ONE�BIT �LDX�#DREG�TO�THE�LEFT �CLC�* MUL65�DEX�* �ROL�0,X�* �DEC�B�* �BNE�MUL65�BIT�SHIFTING�FINISHED? �DEC�A�YES �BNE�MUL60�4�BIT�SHIFTING�FINISHED? �LDX�ADRSAV�YES �RTS�RETURN.‚SHIFT�FINISHED *‚THIS�SUBROUTINE�ADDS�TWO�SIGNED�FLOATING *‚POINT�NUMBERS *„1ST�NUMBER�IN�THE�A�REGISTER *„2ND�NUMBER�IN�THE�C�REGISTER *‚(THE�EXPONENT�IS�PLACED�IN�THE�FIRST�TWO *‚BYTES�OF�EACH�REGISTER�FOLLOWED�BY�THE *‚DEFINED�NUMBER�OF�BYTES�OF�THE�NUMBER) *‚THE�ANSWER�IS�IN�THE�D�REGISTER. *‚IF�THE�TWO�NUMBERS�HAVE�THE�SAME�SIGN�THEY *‚WILL�BE�ADDED.‚IF�THE�TWO�NUMBERS�HAVE�OPPOSITE *‚SIGNS�THE�NUMBERS�WILL�BE�SUBRACTED. FADD�LDX�#AREG �JSR�PAK�PACK�A�REGISTER �LDX�#CREG �JSR�PAK�PACK�C�REGISTER �LDX�#AREG-2�POSITION�A�REGISTER �LDA�B�#NB+2�* FADD01�LDA�A�2,X�* �STA�A�0,X�* �INX�* �DEC�B�* �BNE�FADD01�* �LDX�CREG�SAVE�EXPONENT�OF�C�REGISTER �STX�EXP2�* �LDX�#CREG�POSITION�C�RE GISTER �LDA�B�#NB�* FADD02�LDA�A�2,X�* �STA�A�0,X�* �INX�* �DEC�B�* �BNE�FADD02�* �LDX�#AREG�SAVE�A�REGISTER �LDA�B�#NB�* FADD03�LDA�A�0,X�* �STA�A�NB,X�* �INX�* �DEC�B�* �BNE�FADD03�* �LDA�A�EXP1 �AND�A�#$20 �BEQ�FADD04�IS�AREG�=�0 �JMP�FADD20�YES,�MOVE�CREG�TO�ANS.�LOC. FADD04�LDA�A�EXP2�NO �AND�A�#$20 �BEQ�FADD06�IS�CREG�=�0 �JMP�FADD16�YES,�MOVE�AREG�TO�ANS.�LOC. FADD06�LDA�A�EXP1�NO,�FIND�SIGNS�OF�EXPONENTS �AND�A�#$40�DETERMINE�THE�OFFSET �STA�A�COUNTR�OF�THE�NUMBERS �LDA�B�EXP2�* �AND�B�#$40�* �CBA�* �BEQ�FADD08�EXPONENT�SIGNS�? �LDA�A�EXP2�--DIFFERENT--- �AND�A�#$1F�ADD�EXPONENTS �STA�A�EXPSAV�TO�DETERMINE�OFFSET �LDA�B�EXP1�* �AND�B�#$1F�* �LDA�A�EXP2+1�* �ADD�A�EXP1+1�* �DAA�* �STA�A�EXPSAV+1�* �TBA�* �ADC�A�EXPSAV�* �DAA�* �STA�A�EXPSAV�* �BRA�FADD12�EXPSAV&+1�CONTAIN�OFFSET FADD08�CLR�COUNTR�--SAME�EXPONENT�SIGNS--- �LDA�A�EXP1�FIND�DIFFERENCE�OF�EXPS. �AND�A�#$1F�SUBRTACT�EXP�OF�CREG �STA�A�EXPSAV�FROM�EXP�OF�AREG �LDA�A�#$99�(ADD�10'S�COMPLIMENT�OF�CREG) �LDA�B�EXP2�* �AND�B�#$1F�* �SBA�* �TAB�* �LDA�A�#$99�* �SUB�A�EXP2+1�* �SEC�* �ADC�A�EXP1+1�* �DAA�* �STA�A�EXPSAV+1�* �TBA�* �ADC�A�EXPSAV�* �DAA�* �STA�A�EXPSAV�* �BCS�FADD10�WAS�AREG�EXPONENT�LARGER�? �LDA�A�#$99�NO,�SUBTRACT�EXP�OF�AREG �INC�COUNTR�FROM�EXP�OF�CREG �TAB�(10'S�COMPLIMENT�OF�EXP) �SUB�B�EXPSAV�* �SUB�A�EXPSAV+1�* �ADD�A�#$01�* �DAA�* �STA�A�EXPSAV+1�* �TBA�* �ADC�A�#$00�* �DAA�* �STA�A�EXPSAV�OFFSET�IN�EXPSAV&+1 FADD10�LDA�A�EXP1�CHANGE�LARGER�NUMBER �AND�A�#$40�POINTER�IS�NEGATIVE �BEQ�FADD12�EXPONENTS �DEC�COUNTR FADD12�LDA�A�EXPSAV�CHECK�FOR�ADJUSTMENT�RANGE �BNE�FADD14�* �LDA�A�EXPSAV+1 �CMP�A�#NDD�ARE�NUMBERS�IN �BLT�FADD26�RANGE�OF�ADJUSTMENT? FADD14�LDA�A�COUNTR�NO,�MOVE�NUMBER�TO�ANS.�LOC. �BNE�FADD20�WHICH�NUMBER�IS�LARGER�? FADD16�LDX�#AREG-2�A�REGISTER �LDA�B�#NB+2 FADD18�LDA�A�0,X�MOVE�TO�ANSWER�LOCATION �STA�A�3*NB+2,X�* �INX�* �DEC�B�* �BNE�FADD18�* �BRA�FADD24�GO�TO�END FADD20�LDX�EXP2�C�REGISTER �STX�DREG �LDX�#CREG �LDA�B�#NB FADD22�LDA�A�0,X�MOVE�TO�ANSWER�LOCATION �STA�A�NB+2,X�* �INX�* �DEC�B�* �BNE�FADD22�* FADD24�JMP�FADD72�GO�TO�END FADD26�LDX�#AREG�ADJUST�SMALLER�NUMBER �LDA�A�COUNTR �BNE�FADD30�A�REGISTER�LARGER�? �LDX�#CREG�YES,�ADJUST�C�REGISTER FADD30�STX�ADRSAV�ADJUSTING�INDEX�STORED �LDA�A�EXPSAV+1 �LSR�A �BCC�FADD36�ODD�NUMBER�OF�SHIFTS�? �LDA�A�#$04�YES FADD32�LDA�B�#NB�SHIFT�NUMBER�RIGHT�4�BITS �LDX�ADRSAV�* �CLC�* FADD34�ROR�0,X�* �INX�* �DEC�B�* �BNE�FADD34�* �DEC�A�* �BNE�FADD32�* �DEC�EXPSAV+1 FADD36�LDA�A�EXPSAV+1 �BEQ�FADD42�ADJUSTING�FINISHED�? FADD38�LDX�ADRSAV�NO,�EVEN�NUMBER�OF�DIGIT �LDA�B�#NB-1�SHIFTING�(BYTE�SHIFTING) FADD40�DEX�SHIFT�RIGHT�ONE�BYTE �LDA�A�NB-1,X�* �STA�A�NB,X�* �DEC�B�* �BNE�FADD40�* �CLR�NB-1,X �LDA�A�#$98�SUBTRACT�2�FROM�SHIFT�COUNT �ADD�A�EXPSAV+1�* �DAA�* �STA�A�EXPSAV+1�* �BNE�FADD38�FINISHED�SHIFTING? FADD42�LDX�#EXP2�YES �LDA�A�COUNTR�USE�EXPONENT�OF�LARGER �BNE�FADD44�NUMBER�AND�SIGN�OF�NUMBER �LDX�#EXP1�IN�A�THE�REGISTER. FADD44�LDA�A�0,X�IF�THE�NUMBERS�HAVE�THE�SAME �AND�A�#$5F�SIGN�THE�TWO�NUMBERS�WILL�BE �LDA�B�EXP1�ADDED.‚IF�THE�TWO�NUMBERS �AND�B�#$80�HAVE�OPPOSITE�SIGNS�THE �ABA�NUMBERS�WILL�BE�SUBTRACTED. �STA�A�EXPSAV�IF�CREG�IS�LARGER�A�FLAG �LDA�A�1,X�AT�LOCATION�DREG �STA�A�EXPSAV+1�WILL�BE�SET�(SUBTRACTION) �LDA�A�EXP1�IF�THE�SIGNS�OF�THE� �EOR�A�EXP2�NUMBERS�ARE�SAME--ADD �AND�A�#$80�DIFFERENT--SUBTR ACT �BEQ�FADD54�GO�TO�SUBROUTINES� �JSR�SUB�***�SUBTRACTION�*** �LDA�A�DREG�GET�EXPONENT �EOR�A�EXPSAV�INCLUDE�SIGN�CHANGE(IF�ANY) �STA�A�DREG�* �LDA�A�EXPSAV+1�* �STA�A�DREG+1�* �LDX�#DREG �LDA�B�#NB FADD50�LDA�A�NB,X�MOVE�TO�ANSWER�LOCATION �STA�A�2,X�* �INX�* �DEC�B�* �BNE�FADD50�* �LDX�#DREG �JSR�PAK�PACK�ANSWER. �JMP�FADD72�GO�TO�END FADD54�JSR�ADD�***�ADDITION�*** �LDA�A�EREG-1 �BNE�FADD60�DID�OPERATION�OVERFLOW? �LDX�EXPSAV�NO�OVERFLOW �STX�DREG �LDX�#DREG �LDA�B�#NB �BRA�FADD50 FADD60�LDA�A�EXPSAV�YES,�OVERFLOW �AND�A�#$40 �BNE�FADD64�SIGN�OF�EXPONENT? �LDA�A�EXPSAV�POSITIVE �TAB �AND�A�#$1F �STA�A�DREG �AND�B�#$C0 �STA�B�EXPSAV �LDA�A�EXPSAV+1 �ADD�A�#$02�ADD�2�TO�THE�EXPONENT �DAA �STA�A�DREG+1 �LDA�A�#$00 �ADC�A�DREG �DAA �TAB �AND�A�#$1F�KEEP�OVERFLOW�OF�EXPONENT �AND�B�#$20�IF�PRESENT �LSR�B �ABA �LDA�B�EXPSAV �BRA�FADD68 FADD64�LDA�A�EXPSAV�NEGATIVE�EXPONENT �TAB �AND�A�#$1F �STA�A�DREG �AND�B�#$C0 �LDA�A�EXPSAV+1 �ADD�A�#$98�SUBTRACT�2�FROM�EXP. �DAA �STA�A�DREG+1 �LDA�A�#$99 �ADC�A�DREG �DAA �BCS�FADD68�WAS�EXP�=�-1�OR�-0? �LDA�A�#$02�YES�SUBTRACT�ORIGINAL �SUB�A�EXPSAV+1�NUMBER�FROM�2�TO�OBTAIN �STA�A�DREG+1�CORRECT�NUMBER �CLR�A �AND�B�#$80�CLEAR�SIGN�BIT FADD68�ABA �STA�A�DREG �LDX�#DREG �LDA�B�#NB FADD70�LDA�A�NB-1,X�MOVE�TO�ANSWER�LOCATION �STA�A�2,X�* �INX�* �DEC�B�* �BNE�FADD70�* FADD72�LDX�EXP1�RESTORE�A�REGISTER �STX�AREG�* �LDX�#AREG�* �LDA�B�#NB�* FADD74�LDA�A�NB,X�* �STA�A�2,X�* �INX�* �DEC�B�* �BNE�FADD74�* �LDX�#DREG �JSR�PAK�PACK�ANSWER. �RTS�RETURN. *‚THIS�SUBROUTINE�SUBTRACTS�TWO�SIGNED�FLOATING *‚POINT�NUMBERS. *„1ST�NUMBER�IN�THE�A�REGISTER *„2ND�NUMBER�IN�THE�C�REGISTER *‚(THE�EXPONENT�IS�PLACED�IN�THE�FIRST�TWO *‚BYTES�OF�EACH�REGISTER�FOLLOWED�BY�THE *‚DEFINED�NUMBER�OF�BYTES�OF�THE�NUMBER) *‚THE�ANSWER�IS�IN�THE�D�REGISTER. *‚IF�THE�TWO�NUMBERS�HAVE�THE�SAME�SIGN�THEY *‚WILL�BE�SUBTRACTED.‚IF�THE�TWO�NUMBERS�HAVE *‚OPPOSITE�SIGNS�THE�NUMBERS�WILL�BE�ADDED. FSUB�LDA�A�#$80�CHANGE�SIGN�OF�CREG �EOR�A�CREG�AND�JUMP�TO�ADDITION �STA�A�CREG�SUBROUTINE �JMP�FADD *ƒTHIS�SUBROUTINE�MULTIPLIES�TWO�SIGNED *ƒFLOATING�POINT�NUMBERS. *…1ST�NUMBER�IN�THE�A�REGISTER *…2ND�NUMBER�IN�THE�C�REGISTER *ƒ(THE�EXPONENT�IS�PLACED�IN�THE�FIRST�TWO *ƒBYTES�OF�EACH�REGISTER�FOLLOWED�BY�THE *ƒDEFINED�NUMBER�OF�BYTES�OF�THE�NUMBER) *ƒTHE�ANSWER�IS�IN�THE�D�REGISTER. FMUL�LDX�#AREG �JSR�PAK�PACK�A�REGISTER �LDX�#CREG �JSR�PAK�PACK�C�REGISTER �LDX�CREG �STX�EXP2�SAVE�EXP�OF�C�REGISTER �LDX�#AREG-2�MOVE�A�REGISTER�INTO�POSITION �LDA�B�#NB+2�* FMUL10�LDA�A�2,X�* �STA�A�0,X�* �INX�* �DEC�B�* �BNE�FMUL10�* �LDA�B�#NB�MOVE�C�REGISTER�INTO�POSITION FMUL20�LDA�A�NB+2,X�* �STA�A�NB,X�* �INX�* �DEC�B�* �BNE�FMUL20�* �JSR�MUL�***�MULTIPLICATION�*** �LDX�#DREG�MOVE�ANSWER�(BOTH�BYTES) �LDA�B�#2*NB�RIGHT�TWO�BYTES FMUL30�DEX�* �LDA�A�2*NB,X�* �STA�A�2*NB+2,X�* �DEC�B�* �BNE�FMUL30�* �LDA�B�#NB+2�RESTORE�A�REGISTER FMUL40�DEX�* �LDA�A�0,X�* �STA�A�2,X�* �DEC�B�* �BNE�FMUL40�* �LDA�A�EXP1 �EOR�A�EXP2 �AND�A�#$40 �BEQ�FMUL50�SIGNS�OF�EXPONENTS? �LDA�B�EXP2�OPPOSITE�SIGNS-- �AND�B�#$1F�SUBTRACT�CREG�EXP �LDA�A�#$99�FROM�AREG�EXP �SBA�* �STA�A�DREG�* �LDA�A�#$99�* �SUB�A�EXP2+1�* �SEC�* �ADC�A�EXP1+1�* �DAA�* �STA�A�DREG+1�* �LDA�A�EXP1�* �AND�A�#$1F�* �ADC�A�DREG�* �DAA�* �BCS�FMUL60�WAS�AREG�EXP�LARGER? �LDA�A�#$99�NO,�CREG�EXP�LARGER �TAB�FIND�10'S�COMPLIMENT�OF�EXP �SUB�B �DREG�* �SUB�A�DREG+1�* �ADD�A�#$01�* �DAA�* �STA�A�DREG+1�* �TBA�* �ADC�A�#$00�* �DAA�* �LDA�B�EXP2�* �AND�B�#$40�SIGN�OF�EXP2(CREG) �ABA�* �BRA�FMUL70�BRANCH�TO�FINISH FMUL50�LDA�B�EXP2�SAME�SIGNS �AND�B�#$1F�ADD�EXPONENTS �STA�A�EXPSAV�* �LDA�A�EXP2+1�* �CLC�* �ADC�A�EXP1+1�* �DAA�* �STA�A�DREG+1�* �LDA�A�EXP1�* �AND�A�#$1F�* �ADC�A�EXPSAV�* �DAA�* FMUL60�LDA�B�EXP1�SIGN�OF�EXP1(AREG) �AND�B�#$40�* �ABA�* FMUL70�LDA�B�EXP1�GET�SIGN�OF�ANSWER �EORB�EXP2�MULTIPLY�SIGNS �AND�B�#$80�SIGN�OF�ANSWER�INSERTED �ABA �STA�A�DREG �LDX�#DREG �JSR�PAK�PACK�ANSWER �RTS�RETURN.�MULTIPLICATION�FINISHED!!! *ƒTHIS�SUBROUTINE�PACKS�THE�FLOATING�POINTING *ƒNUMBER�TO�THE�LEFT�DELETING�THE�LEADING�ZEROS *ƒAND�ADJUSTING�THE�EXPONENT�ACCORDINGLY. *ƒENTRY�INTO�THIS�SUBROUTINE�REQUIRES�ONLY�THE� *ƒINDEX�REGISTER�BE�INITIALIZED.‚THE�INDEX *ƒREGISTER�IS�TO�CONTAIN�THE�ADDRESS�OF�THE�FIRST *ƒBYTE�OF�THE�FLOATING�POINT�NUMBER�(THE�A *ƒPORTION�OF�THE�EXPONENT�AS�DESCRIBED�IN *ƒNUMBER�DEFINITION) PAK�STX�ADRSAV�SAVE�ADDRESS�POINTER �LDA�A�0,X�SAVE�M.S.�DIGIT�AND �AND�A�#$1F�OVERFLOW�OF�EXP. �STA�A�EXPSAV�* �CLR�COUNTR PAK05�LDX�ADRSAV �LDA�A�2,X �BNE�PAK15�DOUBLE�DIGIT�ZERO? �LDA�B�#NB-1�-YES PAK10�LDA�A�3,X�MOVE�NUMBER�LEFT�TWO�DIGITS �STA�A�2,X�*�(1�BYTE) �INX�* �DEC�B�* �BNE�PAK10�* �CLR�2,X�CLEAR�LAST�BYTE �LDA�A�COUNTR�ADD�TWO�TO�COUNTER �ADD�A�#$02�* �DAA�* �STA�A�COUNTR�* �CMP�A�#NDD �BLT�PAK05�NUMBER�OF�DIGITS�EXCEEDED? �LDA�A�#$20�-YES,�SET�ERROR�FLAG �LDX�ADRSAV�* �STA�A�0,X�* �CLR�1,X �RTS�RETURN.�NUMBER�=�ZERO!!! PAK15�LDA�B�COUNTR �BEQ�PAK30�ADJUST�EXPONENT? �LDA�A�0,X�-YES �AND�A�#$40 �BEQ�PAK20�SIGN�OF�EXPONENT-- �LDA�A�1,X�NEGATIVE �ABA‚ADD�COUNTER�TO�EXPONENT �DAA�* �STA�A�1,X�* �LDA�A�#0�* �ADC�A�EXPSAV�* �DAA�* �TAB�* �AND�A�#$1F�* �AND�B�#$20�OVERFLOW�MARKER �LSR�B�* �ABA�* �STA�A�EXPSAV �BRA�PAK30� PAK20�LDA�A�#$99�POSITIVE�EXPONENT �SBA�SUBTRACT�COUNTER�FROM�EXP. �SEC�* �ADC�A�1,X�* �DAA�* �TAB�* �LDA�A�#$99�* �ADC�A�EXPSAV�* �DAA�* �BCC�PAK25�NUMBER�ERROR? �STA�A�EXPSAV�NO,�SAVE�EXPONENT �STA�B�1,X�* �LDA�B�COUNTR�* �BRA�PAK30�* PAK25�LDA�A�#$99�SUBTRACT�EXPONENT�FROM �SUB�A�EXPSAV�COUNTER �TAB�* �LDA�A�#$99�* �SUB�A�1,X�* �SEC�* �ADC�A�COUNTR�* �DAA�* �STA�A�1,X�* �TBA�* �ADC�A�#$00�* �DAA�* �STA�A�EXPSAV�SAVE �LDA�A�0,X�CHANGE�EXPONENT'S�SIGN �ORA�A�#$40�* �STA�A�0,X�* PAK30�LDA�A�2,X �AND�A�#$F0 �BNE�PAK45�FIRST�DIGIT�ZERO? �LDA�A�#$01�-YES �STA�A�COUNTR� �LDA�A�#$04�ROTATE�NUMBER�1�DIGIT PAK35�LDA�B�#NB�* �LDX�ADRSAV�* �CLC�* PAK40�DEX�* �ROL�NB+2,X�* �DEC�B �BNE�PAK40�* �DEC�A�* �BNE�PAK35�* �LDX�ADRSAV� �JMP�PAK15�ADJUST�EXPONENT PAK45�LDA�A�0,X�GET�SIGN�OF�NUMBER�AND�EXPONENT �AND�A�#$C0�* �ORA�A�EXPSAV�ADD�EXPONENT �STA�A�0,X�SAVE�EXPONENT �RTS�RETURN.‚NUMBER�PACKED!!! *‚THIS�SUBROUTINE�DIVIDES�TWO�UNSIGNED *‚INTEGER�NUMBERS *„1ST�NUMBER�IN�THE�C�REGISTER *„2ND�NUMBER�IN�THE�A�REGISTER *‚THE�ANSWER�(C/A)�IS�IN�THE�E�REGISTER. *‚THE�NUMBER�IN�THE�A�REGISTER�(DIVISOR) *‚IS�UNCHANGED. DIV�LDX�#EREG �LDA�B�#2*NB �CLR�A DIV04�DEX�CLEAR�D,E�REGISTERS �STA�A�NB,X�* �DEC�B�* �BNE�DIV04�* �LDA�B�#NB DIV08�DEX�CLEAR�B�REGISTER �STA�A�0,X�* �DEC�B�* �BNE�DIV08�* �CLR�AREG-1 �LDA�A�#$04 DIV12�LDA�B�#NB+1�SHIFT�DIVISOR�LEFT �LDX�#BREG�4�BITS�(1�DIGIT) �CLC�* DIV16�DEX�* �ROL�0,X�* �DEC�B�* �BNE�DIV16�* �DEC�A�* �BNE�DIV12�* �LDA�A�#4*NB�INITIALIZE�SHIFT �STA�A�COUNTR�COUNTER DIV 20�BSR�DIV60�10'S�COMP�OF�A DIV24�BSR�DIV72�ADD�A�&�B�REGISTERS �BCC�DIV28�TOO�MUCH? �INC�EREG+NB-1�NO.�ADD�1�TO�NUMBER �BRA�DIV24 DIV28�BSR�DIV60�10'S�COMP�OF�A �DEC�COUNTR �BEQ�DIV40�OPERATION�FINISHED? �BSR�DIV72�NO,�ADD�A�&�B�REGISTERS �LDA�A�#$04�SHIFT�B,C,D,E DIV32�LDA�B�#4*NB�REGISTERS�LEFT �LDX�#EREG�4�BITS�(1�DIGIT) �CLC�* DIV36�DEX�* �ROL�NB,X�* �DEC�B�* �BNE�DIV36�* �DEC�A�* �BNE�DIV32�* �BRA�DIV20 DIV40�LDA�A�#$04�RESTORE�A�REGISTER DIV44�LDA�B�#NB+1�* �LDX�#AREG-1�* DIV48�ROR�0,X�* �INX�* �DEC�B�* �BNE�DIV48�* �DEC�A�* �BNE�DIV44�* DIV52�LDA�B�#NB�SET�UP�ANSWER �STA�B�COUNTR�FOR�INTEGER�OUTPUT �LDX�#EREG�SHIFT�D�&�E�REGISTERS DIV56�DEX�* �LDA�A�0,X�* �LDA�B�NB,X�* �STA�A�NB,X�* �STA�B�0,X�* �DEC�COUNTR�* �BNE�DIV56�* �RTS�RETURN.�DIVISION�FINISHED!!! DIV60�LDA�B�#NB+1�10'S�COMPLIMENT�OF �LDX�#AREG-1�A�REGISTER DIV64�LDA�A�#$99�9'S�COMP �SUB�A�0,X�* �STA�A�0,X�* �INX�* �DEC�B�* �BNE�DIV64�* �SEC�10'S�COMPLIMENT�(9'S�+1) �LDA�B�#NB+1�* DIV68�DEX�* �LDA�A�#$00�* �ADC�A�0,X�* �DAA�* �STA�A�0,X�* �DEC�B�* �BNE�DIV68�* �RTS�RETURN.�COMPLIMENT�FINISHED. DIV72�LDA�B�#NB+1�ADD�A�&�B�REGISTERS �LDX�#BREG�* �CLC�* DIV76�DEX�* �LDA�A�0,X�* �ADC�A�NB+1,X�* �DAA�* �STA�A�NB+1,X�* �DEC�B�* �BNE�DIV76�* �RTS�RETURN.‚ADD�FINISHED. *‚THIS�SUBROUTINE�DIVIDES�TWO�SIGNED *‚FLOATING�POINT�NUMBERS. *„1ST�NUMBER�IS�IN�THE�C�REGISTER *„2ND�NUMBER�IS�IN�THE�A�REGISTER *‚THE�ANSWER�(C/A)�IS�IN�THE�D�REGISTER.�THE *‚NUMBER�IN�THE�A�REGISTER�IS�RETAINED. FDIV�LDX�#AREG �JSR�PAK�PACK�A�REGISTER �LDA�A�AREG �AND�A�#$20�CHECK�A�REGISTER �BEQ�FDIV04�A�REGISTER�EQUAL�TO�ZERO? �SWI�YES,�ERROR:�DIVISION�BY�ZERO!!! FDIV04�LDX�#CREG �JSR�PAK�PACK�C�REGISTER �LDX�AREG �STX�EXPSAV�SAVE�A�EXPONENT �LDX�CREG �STX�EXP2�SAVE�C�EXPONENT �LDX�#AREG�MOVE�A�REGISTER �LDA�B�#NB�INTO�POSITION FDIV08�LDA�A�2,X�* �STA�A�0,X�* �INX�* �DEC�B�* �BNE�FDIV08�* �LDA�B�#NB�MOVE�C�REGISTER FDIV12�LDA�A�NB+2,X�INTO�POSITION �STA�A�NB,X�* �INX�* �DEC�B�* �BNE�FDIV12�* �JSR�DIV�DIVIDE�NUMBERS!!! �LDX�#BREG�RESTORE�A�REGISTER �LDA�B�#NB�* FDIV16�DEX�* �LDA�A�0,X�* �STA�A�2,X�* �DEC�B�* �BNE�FDIV16�* �LDX�EXPSAV�AND�THE�A�EXPONENT �STX�AREG�* �STX�EXP1 �LDX�#EREG-1�MOVE�ANSWER�INTO�POSITION �LDA�B�#NB�* FDIV20�LDA�A�0,X�* �STA�A�2,X�* �DEX�* �DEC�B�* �BNE�FDIV20�* �LDA�A�2*NB,X �BEQ�FDIV32�ANSWER�LESS�THAN�ONE? �STA�A�2,X�NO,ADD�2�TO�C�EXPONENT �LDX�#EREG�MOVE�ANSWER�1�BYTE�RIGHT �LDA�B�#NB�* FDIV22�LDA�A�0,X�* �STA�A�1,X�* �DEX�* �DEC�B�* �BNE�FDIV22�* �LDA�A�EXP2 �AND�A�#$40 �BNE�FDIV24�SIGN�OF�C�EXPONENT? �LDA�A�EXP2�POSITIVE �TAB�* �AND�A�#$1F�(A�HAS�NUMBER) �STA�A�DREG�* �AND�B�#$C0�(B�HAS�SIGNS) �STA�B�EXP2�* �LDA�A�EXP2+1 �ADD�A�#$02�ADD�2�TO�THE�C�EXPONENT �DAA �STA�A�DREG+1 �LDA�A�#$00 �ADC�A�DREG �DAA �TAB �AND�A�#$1F�KEEP�OVERFLOW�OF�EXPONENT �AND�B�#$20�IF�PRESENT �LSR�B�* �ABA�* �LDA�B�EXP2 �BRA�FDIV28 FDIV24�LDA�A�EXP2�NEGATIVE�EXPONENT �TAB�(SUBTRACT�2�FROM�EXPONTENT) �AND�A�#$1F �STA�A�DREG �AND�B�#$C0 �LDA�A�EXP2+1 �ADD�A�#$98�ADD�-2�TO�EXPONENT �DAA �STA�A�DREG+1 �LDA�A�#$99 �ADC�A�DREG �DAA �BCS�FDIV28�WAS�EXP�=�-1�OR�-0? �LDA�A�#$02�YES,�SUBTRACT�ORIGINAL �SUB�A�EXP2+1�NUMBER�FROM�2�TO�OBTAIN �STA�A�DREG+1�CORRECT�NUMBER �CLR�A �AND�B�#$80�CLEAR�SIGN�BIT FDIV28�ABA �STA�A�EXP2 �LDA�A�DREG+1 �STA�A�EXP2+1 FDIV32�LDA�A�EXP1 �EOR�A�#$40 �STA�A�EXP1�CHANGE�SIGN�OF�A�EXPONENT �EOR�A�EXP2 �AND�A�#$40 �BEQ �FDIV36�SIGNS�OF�EXPONENTS? �LDA�B�EXP2�OPPOSITE�SIGNS �AND�B�#$1F�SUBTRACT�CREG�EXP�FROM �LDA�A�#$99�AREG�EXP �SBA�* �STA�A�DREG�* �LDA�A�#$99�* �SUB�A�EXP2+1�* �SEC�* �ADC�A�EXP1+1�* �DAA�* �STA�A�DREG+1�* �LDA�A�EXP1�* �AND�A�#$1F�* �ADC�A�DREG�* �DAA�* �BCS�FDIV40�WAS�AREG�EXP�LARGER? �LDA�A�#$99�NO,�CREG�EXP�WAS�LARGER �TAB�FIND�10'S�COMPLEMENT�OF�EXP �SUB�B�DREG �SUB�A�DREG+1 �ADD�A�#$01 �DAA �STA�A�DREG+1 �TBA �ADC�A�#$00 �DAA �LDA�B�EXP2 �AND�B�#$40�SIGN�OF�C�REGISTER �ABA �BRA�FDIV44 FDIV36�LDA�B�EXP2�SAME�SIGNS �AND�B�#$1F�ADD�EXPONENTS �STA�A�EXPSAV�* �LDA�A�EXP2+1�* �CLC�* �ADC�A�EXP1+1�* �DAA�* �STA�A�DREG+1�* �LDA�A�EXP1�* �AND�A�#$1F�* �ADC�A�EXPSAV�* �DAA�* �TAB�RETAIN�OVERFLOW,�IF�ANY �AND�A�#$1F�* �AND�B�#$20�* �LSR�B�* �ABA�* FDIV40�LDA�B�EXP1�SIGN�OF�A�REGISTER �AND�B�#$40�* �ABA�* FDIV44�LDA�B�EXP1�GET�SIGN�OF�ANSWER �EOR�B�EXP2�(MULTIPLY�SIGNS) �AND�B�#$80�SIGN�OF�ANSWER�INSERTED �ABA �STA�A�DREG �LDX�#DREG �JSR�PAK�PACK�ANSWER �RTS�RETURN.�DIVISION�FINISHED�!!! �PAGE *ƒTHIS�IS�A�DEMONSTRATION�PROGRAM�TO *ƒILLISTRATE�THE�USE�OF�THE�SUBROUTINES. �ORG�$2000 START�LDS�#$27FF �LDX�#NUM1 �JSR�ITAREG�LOAD�A�REGISTER�WITH�NUM1 �LDX�#NUM2 �JSR�ITCREG�LOAD�C�REGISTER�WITH�NUM2 �JSR�ADD�INTEGER�ADD�THE�TWO�NUMBERS �LDX�#NUM3 �JSR�IFEREG�SAVE�ANSWER�AT�NUM3 �LDX�#NUM2 �JSR�ITCREG�RELOAD�C�REGISTER �JSR�SUB�INTEGER�SUBTRACT �LDX�#NUM4 �JSR�IFEREG�SAVE�ANSWER�IN�NUM4 �LDX�#NUM2 �JSR�ITCREG�RELOAD�C�REGISTER �JSR�MUL�INTEGER�MULTIPLY �LDX�#NUM5 �JSR�IFEREG�SAVE�ANSWER�IN�NUM5 �LDX�#NUM6 �JSR�FTAREG�LOAD�A�REGISTER�FROM�NUM6 �LDX�#NUM7 �JSR�FTCREG�LOAD�C�REGISTER �JSR�FADD�ADD�FLOATING�POINT �LDX�#NUM8 �JSR�FFDREG�SAVE�ANSWER �LDX�#NUM7 �JSR�FTCREG�RELOAD�C�REGISTER �JSR�FSUB�SUBTRACT�FLOATING�POINT �LDX�#NUM9 �JSR�FFDREG�SAVE�ANSWER �LDX�#NUM7 �JSR�FTCREG�RELOAD�C�REGISTER �JSR�FMUL�MULTIPLY�FLOATING�POINT �LDX�#NUM10 �JSR�FFDREG �SWI�RETURN�TO�CONSOLE �PAGE NUM1�FCB�$00,$00,$00,$25,$03�2,503 NUM2�FCB�$00,$00,$00,$04,$50�450 NUM3�RMB�NB�ANSWER�=�0000002953. NUM4�RMB�NB�ANSWER�=�0000002053. NUM5�RMB�NB�ANSWER�=�0001126350. NUM6�FCB�%00000000,$03,$43,$00,$00,$00,$00�430. NUM7�FCB�%01000000,$01,$25,$00,$00,$00,$00�.025 NUM8�RMB�NB+2�ANSWER�=�0003�4300250000 NUM9�RMB�NB+2�ANSWER�=�0003�4299750000 NUM10�RMB�NB+2�ANSWER�=�0002�1075000000 �END �MON ΀ �NAM�KEYSUB�KEYBOARD�INTERRUPT�SUB *�REV�1.0�BY�MOTOROLA�MICROSYSTEMS�MARCH�1977 �OPT�S �OPT�O �ORG�$6 KBUFF‚RMB�1 �ORG�$1200 DLSUB‚EQU�$1300 ERSUB‚EQU�$1400 �JSR�DLSUB�GO�TO�DLSUB �FDB�12�WAIT�12�MSEC�FOR�BOUNCE�DELAY �FCB�1�LOOK�FOR�A�ONE �FCB�0�THROUGH�THIS�MASK �FDB�0�IN�LOCATION�ZERO �LDA�A�$4000�READ�A�SIDE�PIA �STA�A�KBUFF�STORE�IN�KEYBOARD�BUFFER �JSR�DLSUB�GO�TO�DLSUB �FDB�60000�WAIT�FOR�A�MINUTE�FCB�0�LOOK�FOR�A�ZERO �FCB�$1F�ON�ALL�KEYS �FDB�$4000�AT�A�SIDE�PIA �TST�A�SEE�IF�TIMEOUT�OCCURED �BNE�*+5�BRANCH�IF�NOT �JSR�ERSUB�GO�TO�ERROR�SUB�IF�TIMEOUT �RTI�RETURN�TO�MAIN�PROGRAM �END �NAM�DLSUB �ORG�0000 �OPT�0 �OPT�S �RMB�1 �RMB�1 �RMB�1 �RMB�1 �RMB�1 �ORG�$1300 �PUL�A �STA�A�TEMP �PUL�B �STA�A�TEMP+1 �ADD�B�#6 �ADC�A�#0 �PSH�B �PSH�A �LDX�TEMP �LDA�0,X �LDA�B�1,X �COM�A �NEG�B �BNE�*+3 �INC�A �STA�A�CONT-1 �STA�B�CONT �LDA�A�#$E9 �STA�A�D0ONT �LDA�B�2,X �LDA�A�3,X �LDX�4,  X �BRA�DLTST �PSH�A �LDA�A�#$E7 �STA�A�D0ONT �PUL�A �BIT�A�0,X �BEQ�DGLIT �BIT�A�0,X �BEQ�DLTST �BRA�*+8 �BIT�A�0,X �BNE�DLTST �BRA�ZTST �BIT�B�#1 �BEQ�DLINC �BRA�YDOUT �BIT�B�#1 �BEQ�YDOUT �INC�D0ONT �BNE�DLTST �INC�CONT �BNE�DLSTRT �INC�CONT-1 �BNE�DLSTRT �CLR�A �RTS �LDA�A�#1 �RTS ÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÑ€�NAM�OFFSET�LOAD *�REV�4/2/76�LAG *�MIK�ADAPTION *�POSITIVE�OFFSET�(MSB�HEX)�IN�A014�(OR�00) *�NEGATIVE�OFFSET�(MSB�HEX)�IN�A015�(OR�00) * *�MIKBUG�EQUATES * BYTE�EQU�$E055 BYTECT�EQU�$A00B CKSM�EQU�$A00A CONTRL�EQU�$E0E3 INEEE�EQU�$E1AC NEGOFF�EQU�$A015 OUTEEE�EQU�$E101 POSOFF�EQU�$A014 PIASB�EQU�$8007�PIA �ORG�$0200�PROG�START LOADO�LDA�A�#$3C �STA�A�PIASB�READER�ON �LDA�A�#@21 �JSR�OUTEEE�OUTPUT�CHAR LOADA�JSR�INEEE�INPUT�CHAR �CMP�A�#'S �BNE�LOADA�1ST�CHAR�NOT�"S" �JSR�INEEE �CMP�A�#'9 �BEQ�LOADD�2ND�CHAR�"9" �CMP�A�#'1 �BNE�LOADA�2ND�CHAR�NOT�"1" �CLR�CKSM�ZERO�CHECKSUM �JSR�BYTE�READ�2�FRAMES �SUB�A�#2 �STA�A�BYTECT�SET�BYTE�COUNT �JSR�BYTE�READ�2�FRAMES �ADD�A�POSOFF�ADD�+�OFFSET �SUB�A�NEGOFF�SUB�-�OFFSET �STA�A�X�HI LOADB�JSR�BYTE�READ�2�FRAMES �STA�A�X�LOW �LDX�X�HI�(X)�OFFSET�"NEW"�ADDRESS �JSR�BYTE�READ�2�FRAMES �DEC�BYTECT�DECREMENT�BYTE�COUNT �BEQ�LOADC�ZERO�BYTE�COUNT �STA�A�X�STORE�INPUT�DATA �INX �BRA�LOADB LOADC�INC�CKSM�INCREMENT�CHECKSUM �BEQ�LOADA�CHECKSUM�OK �LDA�A�#'?�CHECKSUM�ERROR �JSR�OUTEEE�PRINT�QUESTION�MARK LOADD�JMP�CONTRL�MIKBUG�CONTROL �END ÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÔ€ STX $0 DES TSX CLR $0,X COM $0,X BA1 LDX $04 STX $06 JSR $FFAF STAA $02 LDAA $07 PSHA LDAA $02  TSTA BNE BA1 TSTB BNE BA1 LDX $00 BA5 PULA TSTA BPL BA3 RTS BA3 CMPA #09 BLE BA4 ADDA #07 BA4 ADDA #30 STAA $00,X INX BRA BA5 LDX #0010 SETUP BASE (=16) STX $04 LDAB #00 SETUP CONSTANT TO CONVERT LDAA #38 LDX #0900 POINT TO OUTPUT AREA JSR $0800 BINARY TO ASCII BRA * END END EÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÖ€*‚SOURCE�CODE�NOT�SUPPLIED�TO�MOTOROLA�MICROSYSTEMS�BY *‚JOHN�M.�BILLINGS. ! ÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅ×€OUT2HS�EQU�$E0CA�ADDRESS�OF�MIKBUG�ROUTINE PDATA1�EQU�$E07E CRLF�EQU�$0D0A EL�EQU�$15�ERASE�TO�END�OF�LINE SBYTE�EQU�$04 AHOLD�FCB�0 BHOLD�RMB�1 TESTOB�EQU�* �LDAA�AHOLD�GET�INITIAL�ASCII�CODE ALOOP1�EQU�*�ASCII�TO�BAUDOT�LOOP �STAA�AHOLD�SAVE�ASCII�CHARACTER �LDX�#AID�POINT�TO�ASCII�ID �JSR�PDATA1�PRINT �LDX�#AHOLD�POINT�TO�ASCII�CODE �JSR�OUT2HS�OUTPUT�TO�TVT�IN�HEX �LDAA�AHOLD �JSR�ABAUD�BR�TO�CONVERSION�ROUTINE �STAA�BHOLD�STORE�BAUDOT�CODE �ORAB�#$30�CHANGE�SHIFT�CODE�TO�CHARACTER �STAB�SHCODE�STORE�IN�FIELD �LDX�#BID�POINT�TO�BAUDOT�ID �JSR�PDATA1�PRINT �LDX�#BHOLD�POINT�TO�BAUDOT�CHAR �JSR�OUT2HS�PRINT �LDX�#SHIFT�POINT�TO�SHIFT�FIELD �JSR�PDATA1�PRINT �LDAA�AHOLD�RELOAD�ASCII�CHARACTER �INC�A�GET�NEXT�ASCII�CODE �BNE�ALOOP1�LOOP�UNTIL�CYCLE�COMPLETE �SWI�RETURN�TO�MIKBUG AID‚FDB�CRLF �FCB�EL �FCC�2,AS �FCC�2,CI �FCC�2,I �FCC�2,-- �FCC�2,-- �FCB�SBYTE BID�FCC�2,BA �FCC�2,UD �FCC�2,OT �FCC�2,-- �FCC�2,-- �FCB�SBYTE SHIFT�FCC�2,SH �FCC�2,IF �FCC�2,T- �FCC�2,-- SHCODE�RMB�1 CRLFEL�EQU�* �PAGE �FDB�CRLF �FCB�EL �FCB�SBYTE ABAUD�EQU�* �ANDA�#$7F�STRIP�OFF�PARITY�BIT �LDX�#CODTBL�POINT�TO�TABLE �CLR�B�ZERO�OUT�B �SUBA�#7�SUBTRACT�NULLS �BMI�STILBD�INVALID�CODE �BEQ�NEEDLP�BYPASS�LOOP �CMPA�#LAST1�IS�THIS�CODE�IN�FIRST�TABLE�? �BLT�GINDEX�BR�IF�YES �LDX�#CTABLE�POINT�TO�2ND�TABLE �SUBA�#25�SUBTRACT�NULLS �BMI�STILBD�INVALID�CODE �BEQ�NEEDLP�BYPASS�LOOP �CMPA�#LAST2�IS�THIS�CODE�IN�2ND�TABLE�? �BGE�NOTFND�BR�IF�NO GINDEX�EQU�* �DEX�POINT �INCA�TO ALOOP�EQU�*�THE �INX�PROPER �DECA�BYTE �BNE�ALOOP�IN�TABLE NEEDLP�EQU�* �LDAA�0,X�LOAD�INTO�A �ASL�A�TRANSFER �ROL�B�SHIFT �ROL�A�CODE �ROL�B�FROM �LSR�A�A�TO �LSR�A�B �RTS�RETURN NOTFND�EQU�* �SUBA�#32�SUBTRACT�HEX�'20' �CMPA�#LAST2�CHECK�FOR�LOWER�CASE�CHARS �BGE�STILBD�BR�IF�NOT�FOUND �CMPA�#$20�CHECK�FOR�LOWER�CASE�ALPHA�CHAR �BGT�GINDEX�BR�IF�FOUND STILBD�EQU�* �LDAB�#2�SET�SHIFT�CODE�TO�2�(DONT-CARE) �CLR�A�ZERO�OUT�A �RTS�RETURN �PAGE CODTBL�EQU�* �FCB�$45�BEL�(ASCII�H'07) �FCB�$80�NULL�(ASCII�H'08) �FCB�$80�NULL�(ASCII�H'09) �FCB�$82�LF�(ASCII�H'0A) �FCB�$80�NULL�(ASCII�H'0B) �FCB�$80�NULL�(ASCII�H'0C) �FCB�$88�CR�(ASCII�H'0D) LAST1�EQU�*-CODTBL CTABLE�EQU�* �FCB�$84�SPACE�(ASCII�H'20) �FCB�$4D�!�(ASCII�H'21) �FCB�$51�"�(ASCII�H'22) �FCB�$54�#�(ASCII�H'23) �FCB�$49�$�(ASCII�H'24) �FCB�$80�NULL�(ASCII�H'25) �FCB�$5A�&�(ASCII�H'26) �FCB�$4B�'�(ASCII�H'27) �FCB�$4F�(�(ASCII�H'28) �FCB�$52�)�(ASCII�H'29) �FCB�$80�NULL�(ASCII�H'2A) �FCB�$80�NULL�(ASCII�H'2B) �FCB�$4C�'�(ASCII�H'2C) �FCB�$43�-�(ASCII�H'2D) �FCB�$5C�.�(ASCII�H'3E) �FCB�$5D�/�(ASCII�H'2F) �FCB�$56�0�(ASCII�H'30) �FCB�$57�1�(ASCII�H'31) �FCB�$53�2�(ASCII�H'32) �FCB�$41�3�(ASCII�H'33) �FCB�$4A�4�(ASCII�H'34) �FCB�$50�5�(ASCII�H'35) �FCB�$55�6�(ASCII�H'36) �FCB�$47�7�(ASCII�H'37) �FCB�$46�8�(ASCII�H'38) �FCB�$58�9�(ASCII�H'39) �FCB�$4E�:�(ASCII�H'3A) �FCB�$5E�;�(ASCII�H'3B) �FCB�$80�NUL�(ASCII�H'3C) �FCB�$80�NUL�(ASCII�H'3D) �FCB�$80�NUL�(ASCII�H'3E) �FCB�$59�?�(ASCII�H'3F) �FCB�$80�NUL" �(ASCII�H'40) �FCB�$03�A�(ASCII�H'41) �FCB�$19�B�(ASCII�H'42) �FCB�$0E�C�(ASCII�H'43) �FCB�$09�D�(ASCII�H'44) �FCB�$01�E�(ASCII�H'45) �FCB�$0D�F�(ASCII�H'46) �FCB�$1A�G�(ASCII�H'47) �PAGE �FCB�$14�H�(ASCII�H'48) �FCB�$06�I�(ASCII�H'49) �FCB�$0B�J�(ASCII�H'4A) �FCB�$0F�K�(ASCII�H'4B) �FCB�$12�L�(ASCII�H'4C) �FCB�$1C�M�(ASCII�H'4D) �FCB�$0C�N�(ASCII�H'4E) �FCB�$18�O�(ASCII�H'4F) �FCB�$16�P�(ASCII�H'50) �FCB�$17�Q�(ASCII�H'51) �FCB�$0A�R�(ASCII�H'52) �FCB�$05�S�(ASCII�H'53) �FCB�$10�T�(ASCII�H'54) �FCB�$07�U�(ASCII�H'55) �FCB�$1E�V�(ASCII�H'56) �FCB�$13�W�(ASCII�H'57) �FCB�$1D�X�(ASCII�H'58) �FCB�$15�Y�(ASCII�H'59) �FCB�$11�Z�(ASCII�H'5A) LAST2�EQU�*-CTABLE �END ÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅ߀�NAM�TXTSTG �OPT�NOP,S * *�ROUTINE�TXTSTG�INPUTS�A�STRING�OF�CHARACTERS *�FROM�AN�ASCII�KEYBOARD�UNTIL�THE�EOT�(CTRL/D) *�DELIMITER�IS�ENCOUNTERED.‚THE�ROUTINE�THEN *�REPEATEDLY�'ECHOES'�)OUTPUTS)�THE�AS-BUILT *�TEXT�STRING.‚MIKBUG�ROM�ROUTINES�INEEE�AND *�PDATA1�ARE�USED. *�THE�PCR�AT�A048/A049�MUST�BE�SET�TO�THE *�START�ADDRESS�OF�THE�PROGRAM. * PDATA1�EQU�$E07E INEEE�EQU�$E1AC * START�EQU�* �LDX�#TXTPTR�.POINTER�TO�TEXT�STRING *�BUILD�AREA�IN�IXR LOOP1�EQU�* �JSR�INEEE�.GOTO�MIKBUG�CHAR.�INPUT�R �STA�A�0,X�.STORE�INPUT�CHAR.�IN�TEXT �INX�.INCREMENT�IXR�(POINTER) �CMP�A�#4�.WAS�IT�AN�EOT�?�(CTRL/D) �BNE�LOOP1�.NO,�GO�BACK�FOR�ANOTHER *�INPUT�CHARACTER *�OTHERWISE,�FALL�THRU *�TO�PRINT�CONTINUOUSLY. * LOOP2�EQU�* �LDX�#TXTPTR�.POINTER�TO�TEXT�STRING �JSR�PDATA1�.GOTO�MIKBUG�PRINT�ROUTINE �BRA�LOOP2�.�REPEAT�PRINT *� TXTPTR�EQU�*�.�START�OF�TEXT�STRING *�BUILD�AREA * �END  ဠ�NAM�DUMPHC *�REV.�1.0�BY�MOTOROLA�MICROSYSTEMS�APRIL�1977 �ORG�$200 �OPT�O DUMPA�BSR�DUMPA1�TTY�CONTROL �BRA�DUMPA�R1 DUMPB�BRA�DUMPB1�CALLED�AS�SUBROUTINE PDATA1�EQU�$E07E�PRINT�STRING OUTEEE�EQU�$E1D1�PRINT�CHAR OUT2HS�EQU�$E0CA�PRINT�2�HEX OUT4HS�EQU�$E0CB�PRINT�4�HEX OUTSP�EQU�$E0CC�PRINT�A�SPACE BADDR�EQU�$E047�GET�4�HEX�INTO�A00C INEEE�EQU�$E1AC�GET�A�CHAR MCL�EQU�$E19D�C/R�L/F�ETC DUMPA1�LDA�A�#$54�T�PRINT �JSR�OUTEEE�TITLE- ‚LDA�A�#$49�I ‚JSR�OUTEEE ‚LDA�A�#$54�T ‚JSR�OUTEEE ‚LDA�A�#$4C�L ‚JSR�OUTEEE ‚LDA�A�#$45�E� ‚JSR�OUTEEE ‚LDA�A�#$2D ‚JSR�OUTEEE INLOOP�JSR�INEEE�GET�CHAR ‚CMP�A�#$04�IS�IT�EOT? ‚BNE�INLOOP�NO,LOOP ‚LDX�#MCL�C/R�LF�ETC ‚JSR�PDATA1 ‚JSR�BADDR�GET�START ‚LDX�$A00C ‚STX�$A002�STORE ‚JSR�OUTSP�SPACE ‚JSR�BADDR�GET�END ‚LDX�$A00C� ‚STX�$A004�STORE DUMPB1�LDX�#MCL�CR/LF ‚JSR�PDATA1 ‚LDA�A�$10�16�BYTES/LINE ‚STA�A�$A018 ‚LDX�$A002�START ‚STX�$A014�TO�LINE�STARTS ‚STX�$A016�CHAR�START NEWLIN�LDX�#MCL�C/R�LF�ETC ‚JSR�PDATA1 ‚LDX�#$A014�POINT�TO�ADDRESS� ‚JSR�OUT4HS�PRINT ‚JSR�OUTSP�SPACE ‚LDA�B�$A018�BYTES/LN LOOP1�LDX�$A014 ‚JSR�OUT2HS�PRINT�HEX ‚DEX�DEC�X ‚CPX�$A004 ‚BEQ�SPAC3 ‚INX�X=X+1 ‚STX�$A014�STOR ‚DEC�B�B=# B+1 ‚BNE�LOOP1�LINE�NOT�DONE PRTCHR�JSR�OUTSP�SPACE ‚LDA�B�$A018�BYTES/LN LOOP2�LDX�$A016 ‚LDA�A�0,X�CHAR�TO�A ‚NOP ‚BSR�OUTCH ‚LDX�$A016�RELOAD ‚CPX�$A004 ‚BEQ�END�GO�TO�END ‚INX�NEXT�CHAR ‚STX�$A016�STORE�IT ‚DEC�B�IS�LINE�DONE ‚BNE�LOOP2�NO ‚BRA�NEWLIN�YES END�LDX�#MCL�SKIP ‚JSR�PDATA1�VP ‚LDX�#MCL�3 ‚JSR�PDATA1�LINES ‚LDX�#MCL ‚JSR�PDATA1 ‚RTS�RETURN OUTCH�CMP�A�#$20�<30 ‚BCC�OKC�YES LDPRD�LDA�A�#$2E�.�LOAD OKC�CMP�A�#$60�<60 ‚BCC�LDPRD�NG�. ‚JSR�OUTEEE�PUT�CHAR ‚RTS�RETURN SPAC3�DEC�B�DEC�B�1�EXTRA ‚BLE�PRTCHR�X=X�END LOOP3�JSR�OUTSP�SPACE�3 ‚JSR�OUTSP ‚JSR�OUTSP ‚DEC�B�B=B-1 ‚BGT�LOOP3�KEEP�LOOPING ‚BRA�PRTCHR ‚END ÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅå€*�REV.�1.0�BY�MOTOROLA�MICROSYSTEMS�APRIL�1977 �OPT�NOG HMSG�FCC�/HANGMAN!/ GCNT�FCB�0�GUESS�COUNTER REG1�FCB�0�REGISTER�1 REG2�FCB�0�REGISTER�2 DCNT�FCB�0�DASH�COUNTER WPTR�FDB�0�WORD�POINTER WBUF�RMB�8�WORD�BUFFER GBUF�FCB�$2D �FCB�$2D,$2D,$2D,$2D,$2D,$2D,$2D�GUESS�BUFFER STOREX�RMB�2�STOREX LETTER�RMB�1�LETTER SW1�FDB�0�SW1 SW2�FDB�0�SW2 SW3�FDB�0�SW3 PRINT�EQU�$E07E GET�EQU�$E1AC STOP�EQU�$E0E3 SWITCH�LDAB�SW1�SWITCH�TWO�BLOCKS �STAB�SW1+4 �LDAB�SW1+1 �STAB�SW1+5 �LDAB�SW1+2 �STAB�SW1 �LDAB�SW1+3 �STAB�SW1+1 �LDAB�SW1+4 �STAB�SW1+2 �LDAB�SW1+5 �STAB�SW1+3 ‚RTS DOMSG�FCC�/DO�YOU�WANT�A�NEW�WORD?/ TMSG�FCC�/THANKS�FOR�PLAYING!/ GMSG�FCC�/GUESS�A�LETTER:/ IMSG�FCC�/INCORRECT�GUESS!/ GOMSG�FCC�/GOOD.�YOU�NOW�HAVE:/ CMSG�FCC�/CONGRATULATIONS!/ START�LDAA�#1 �STAA�GCNT�GUESSES�COUNTER �LDX�WTAB �STX�WPTR NUGAME�LDX�#DOMSG�DO"�MSG �JSR�PRINT REPLY�JSR�GET�REPLY �CMPA�#'N �BEQ�THANKS �CMPA�#'Y �BNE�REPLY �JSR�CHANGE �BRA�GUESS THANKS�LDX�#TMSG�"THANKS"�MSG �JSR�PRINT �JMP�STOP GUESS�LDX�#GMSG�"GUESS"�MSG �JSR�PRINT �JSR�GET�REPLY �STAA�LETTER �CLRB �LDX�#WBUF�WORD�BUFFER CMPARE�CMPA�0,X �BNE�MATCH �INCB�8,X �STAA�8,X�GUESS�BUFFER MATCH�INX �LDAA�0,X�NEXT�CHAR �CMPA�#0 �BEQ�FINAL �CPX�#GBUF�LAST�WORD�BFR �BEQ�FINAL �LDAA�LETTER �BRA�CMPARE FINAL�CMPB�#0 �BEQ�WRONG �LDX�#GOMSG�"GOOD"�MSG �JSR�PRINT �CLRA �STAA�DCNT�ZERO�DASH�COUNTER� �LDX�#WBUF�WORD�BFR READGB�LDAA�8,X�GUESS�BFR �CMPA�#$2D �BNE�PRNTGB �LDAB�DASHES�COUNTER �INCB �STAB�DASHES�CTR PRNTGB�LDAA�8,X�GUESS�BFR �JSR�PRINT �INX �LDAA�0,X�WORD�BFR �CMPA�#0 �BEQ�ENDTWO �CPX�#GBUF�FOR�LAST�WRD�BFR �BEQ�ENDTWO �BRA�READGB ENDTWO�LDX�#DCNT�DASH�CTR �LDAB�0,X �BNE�GUESS �LDX�#CMSG�"CONGRAT"�MSG �JSR�PRINT WAIT�LDX�#$FFFF WAIT1�DEX �BNE�WAIT1 �JMP�NUGAME WRONG�LDX�#IMSG�"INCORRECT"�MSG �JSR�PRINT �LDAB�GCNT �INCB �STAB�GCNT �STAB�REG1�REGISTER�1 �LDAA�#8 �SBA �STAA�REG2�REGISTER�2 PRNTHM�LDX�#HMSG�HANGMAN �STX�STOREX PRTAGN�LDX�STOREX �LDAA�0,X �JSR�PRINT �INX �STX�STOREX �LDAB�REG1 �DECB �STAB�REG1 �BNE�PRTAGN� �LDAB�REG2�REGISTER�2 �BNE�DASHES �JMP�NUGAME DASHES�LDAA�#$2D �JSR�PRINT �LDAB�REG2 �DECB �STAB�REG2 �BNE�DASHES �JMP�GUESS CHANGE�LDX�#GBUF�GUESS�BUFR �LDAB�#08 �LDAA�#$2D DASHFL�STAA�0,X �INX �DECB �BNE�DASHFL ZEROES�LDX�#WBUF�WORD�BFR �LDAB�#8 �CLRA ZERO2�STAA�0,X �INX �DECB �BNE�ZERO2 �LDX�#WPTR�WORD�POINTER �LDAA�0,X�WORD�TABLE �BNE�AHEAD �LDX�#WTAB�WORD�TBL�FIRST�ADDR �STX�WPTR�WORD�POINTER AHEAD�STX�SW1 �LDX�#WBUF�WORD�BFR �STX�$ SW2 LOAD�LDX�SW1 LOAD2�LDAA�0,X �BEQ�NXWORD �JSR�SWITCH �LDX�SW1 �STAA�0,X �INX �STX�SW1 �JSR�SWITCH �LDX�SW1 �INX �STX�SW1 �BRA�LOAD2 NXWORD�INX �STX�WPTR�WORD�PTR RANDOM�LDX�GCNT�GUESS�COUNTER �LDAA�0,X �DECA �STAA�0,X �BNE�ZEROES �RTS�GUESS WTAB�EQU�* �FCC�/HELLO/ �FCB�0 �FCC�/FORENOON/ �FCB�0 �FCC�/ROULETTE/ �FCB�0 �FCC�/MISHMASH/ �FCB�0 �FCC�/BUREAU/ �FCB�0 �FCC�/ARRIVE/ �FCB�0 �FCC�/FRINGE/ �FCB�0 �FCC�/PONTOON/ �FCB�0 �FCC�/BANANA/ �FCB�0 �FCC�/KUMQUAT/ �FCB�0 �FCC�/DROWSE/ �FCB�0 �FCC�/SUBSONIC/ �FCB�0 �FCC�/ZOOM/ �FCB�0 �FCC�/TATTOO/ �FCB�0 �FCC�/QUIZ/ �FCB�0 �FCC�/GUERILLA/ �FCB�0 �FCC�/CASCADE/ �FCB�0� �FCC�/PROTOCOL/ �FCB�0 �FCC�/EXCEPT/ �FCB�0 �FCC�/IMPART/ �FCB�0 �FCC�/LEGION/ �FCB�0 �FCC�/NIBBLE/ �FCB�0 �FCC�/UNIVERSE/ �FCB�0 �FCC�/XENON/ �FCB�0 �FCC�/JELLY/ �FCB�0 �FCC�/VARIABLE/ �FCB�0 �FCC�/OPPOSITE/ �FCB�0 �FCC�/ENRAGE/ �FCB�0 �FCC�/WEB/ �FCB�0 �FCC�/REGRET/ �FCB�0 �FCC�/HOLLOW/ �FCB�0 �FCC�/MIDST/ �FCB�0 �FCC�/COYOTE/ �FCB�0 �FCC�/LYRE/ �FCB�0 �FCC�/AARDVARK/ �FCB�0 �FCC�/SAND/ �FCB�0 �FCC�/PAUSE/ �FCB�0 �FCC�/ICEBERG/ �FCB�0 �FCC�/FASTEN/ �FCB�0 �FCC�/BEETLE/ �FCB�0 �FCC�/KETTLE/ �FCB�0 �FCC�/DAUGHTER/ �FCB�0 �FCC�/ZIP/ �FCB�0 �FCC�/TREMOR/ �FCB�0 �FCC�/GERANIUM/ �FCB�0 �FCC�/CLUB/ �FCB�0 �FCC�/ECONOMY/ �FCB�0 �FCC�/ALPHA/ �FCB�0 �FCC�/JACKAL/ �FCB�0 �FCC�/NYMPH/ �FCB�0 �FCC�/OCEAN/ �FCB�0 �FCC�/QUACK/ �FCB�0 �FCC�/PYGMY/ �FCB�0 �FCC�/DYE/ �FCB�0 �FCC�/LAVENDER/ �FCB�0 �FCC�/SLY/ �FCB�0�END�OF�TABLE �END $í€%�NAM�FDISK *�REV.�1.0�BY�MOTOROLA�MICROSYSTEMS�APRIL�1977 �SPC�1 *�BY:�HERVE�TIREFORD *…MOTOROLA�SEMICONDUCTOR�PRODUCTS �SPC�3 *�------------------------------------------ *�THE�FOLLOWING�PROGRAM�ALLOWS�THE�USER�TO *�DUMP�THE�CONTENTS�OF�MEMORY�ONTO�AN *�EDOS2�STRUCTURED�DISKETTE�IN�THE�MOTOROLA *�DEFINED�FORMAT�(S0,�S1,�S9). �SPC�1 *�IT�IS�ASSUMED�THAT: *� *ƒ1-�THE�USER'S�CODE�IS�OUTSIDE�THE�FIRST *†K�OF�MEMORY�SINCE�THE�DUMP�PROGRAM *†RESIDES�IN�THIS�AREA.�SHOULD�THE�USER'S *†PROGRAM�BE�IN�THIS�AREA,�ONE�CAN�RECO- *†VER�FROM�THIS�SITUATION�BY�MERELY�SHIF- *†TING�THE�USER'S�CODE�USING�THE�SWITCHES *†THAT�ARE�LOCATED�ON�THE�EDGE�OF�THE�ME- *†MORY�CARDS�AND�THEN�LOAD�THE�DUMP�PGM. * *ƒ2-�THE�OBJECT�CODE�IS�OUTPUTTED�TO�THE *†DISKETTE�IN�THE�DRIVE�UNIT�0. *� *ƒ3-�THE�DIALOG�BETWEEN�THE�USER�AND�THE *†DUMP�PROGRAM�IS�THE�SAME�AS�WHEN�INI- *†TIATING�THE�EXBUG�PUNCH�ROUTINE.�NOTE *†THAT�THE�HEADER�IS�USED�AS�FILENAME�FOR *†THE�OBJECT�CODE�THAT�IS�GENERATED. *� *ƒ4-�PGM�STARTING�ADDRESS�=�100. �PAGE �OPT�O �SPC�1 *�TEMPORARY�EDOS�STORAGE �SPC�1 ISIZE�EQU�$4 ITRK�EQU�6 ISCTR�EQU�7 ICNTR�EQU�8 OSIZE�EQU�$9 OTRK�EQU�11 OSCTR�EQU�12 OCNTR�EQU�13 TISIZE�EQU�15 �SPC�1 *�EDOS�UTILITY�ROUTINES �SPC�1 RI�EQU�$E809 WRT�EQU�$E80C �SPC�1 *�FILE�DIRECTORY�STORAGE�AREA �SPC�1 �ORG�$100 �JMP�START �SPC�1 BUF1�RMB�128 �SPC�1 *�EXBUG�EQUATES BEGEND�EQU�$F003 BUF�EQU�$FF8D INCHNP�EQU�$F015 BEGA�EQU�$FF0A TW�EQU�$FF5A ENDA�EQU�$FF0C MCONT�EQU�$FF58 TEMP�EQU�$FF07 CHEXL�EQU�$F009 CHEXR�EQU�$F00C PDATA�EQU�$F024 �SPC�2 XTEMP�RMB�2 XTEMP3�RMB�2 STEMP�RMB�2 �SPC�1 �SPC�1 START�LDS�#STACK�INITLZ�STACK�POINTER �LDX�#TEXT1 �JSR�PDATA �LDX�#24 �STX�ISIZE�PREPARE�TO�REA% D�FROM�DISK �CLR�ITRK �LDA�A�#3 �STA�A�ISCTR �SPC�1 *�READ�FILE�DIRCTORY�INTO�BUF1 �SPC�1 LOOP3‚CLR�ICNTR �LDA�B�#128 �LDX�#BUF1 LOOP�STX�XTEMP �PSH�B �JSR�RI �BCS�NTFND �LDX�XTEMP �STA�A�X �INX �PUL�B �DEC�B �BNE�LOOP �SPC�1 *�SEARCH�BUF1�FOR�AN�ATTRIBUTE�OF�$FF �SPC�1 �LDX�#BUF1 LOOP2�LDA�A�5,X �CMPA�#$FF �BEQ�FOUND2 �LDA�B�#11 LOOP1�INX �DEC�B �BNE�LOOP1 �CPX�#BUF1+121 �BNE�LOOP2 �BRA�LOOP3 �SPC�1 *�SEND�MESSAGE�"NO�ROOM"",�THEN *�REENTER�EXBUG�--------------- �SPC�1 NTFND‚LDX�#MESSAG �JSR�PDATA �JMP�$F564 �SPC�1 *�COMPUTE�REMAINING�SIZE *�WHERE�OBJECT�FILE�IS�TO�STORE�------ �SPC�1 FOUND2�STX�XTEMP �LDAA�#$4C �LDAB�6,X �STAB�OTRK �SBA �STAA�OSIZE �LDAA�7,X �STAA�OSCTR �LDX�#$19 �CLRB FND2�ADDA�OSIZE �ADCB�#0 �DEX �BNE�FND2 �ADDA�#$18 �ADCB�#0 �SUBA�OSCTR �SBCB�#0 �BNE�FND3 �TSTA �BEQ�NTFND �SPC�1 *�PREPARE�STORAGE�OF�OBJECT�FILE�ON�DISKETTE�-- �SPC�1 FND3�STAB�OSIZE �STAA�OSIZE+1 �STAB�TISIZE �STAA�TISIZE+1 �SPC�1 *�GENERATE�OBJECT�FILE�-�THIS�ROUTINE�IS *�SIMILAR�TO�THE�EXBUG�PUNCH *�PROGRAM�EXCEPT�THAT�DATA�IS�SENT *�TO�THE�DISKETTE�----------------------- �SPC�1 FNCHE�JSR�BEGEND FNCH�LDX�#MHDR �JSR�PDATA �LDX�#BUF PH31�JSR�INCHNP �CMP�A�#$20 �BLT�PH33 �CMP�A�#$61 �BLT�PH35 PH33�LDA�A�#$20 PH35�STA�A�X �INX �CPX�#BUF+6 �BNE�PH31 �LDA�B�#$83 �LDX�#MTAPE3 �JSR�FDATA1 �LDX�#BUF PH41�JSR�FUNT2 �CPX�#BUF+6 �BNE�PH41 �COM�B �PSH�B �TSX �BSR�FUNT2 �PUL�B �LDX�BEGA �STX�TW FUN11�LDA�A�ENDA+1 �SUB�A�TW+1 �LDA�B�ENDA �SBC�B�TW �BNE�FUN22 �CMP�A�#24 �BCS�FUN23 FUN22�LDA�A�#23 FUN23�ADD�A�#4 �STA�A�MCONT �SUB�A�#3 �STA�A�TEMP �LDX�#MTAPE1 �BSR�FDATA1 �CLR�B �LDX�#MCONT �BSR�FUNT2 �LDX�#TW �BSR�FUNT2 �BSR�FUNT2 �LDX�TW FUN32�BSR�FUNT2 �DEC�TEMP �BNE�FUN32 �STX�TW �COM�B �PSH�B �TSX �BSR�FUNT2 �PUL�B �LDX�TW �DEX �CPX�ENDA �BNE�FUN11 �LDX�#MTAPE2 �BSR�FDATA1 �BRA�UPDAT �SPC�1 FUNT2�STX�XTEMP3 �ADDB�X �PSH�B �LDA�A�X �JSR�CHEXL �JSR�WRT �LDX�XTEMP3 �LDA�A�X �JSR�CHEXR �JSR�WRT �LDX�XTEMP3 �INX �PULB FDATA9‚RTS �SPC�1 FDATA1�LDA�A�X �CMP�A�#4 �BEQ�FDATA9 �STX�XTEMP3 �JSR�WRT �LDX�XTEMP3 �INX �BRA�FDATA1 �SPC�1 *�UPDATE�FILE�DIRECTORY�IN�BUF1. *�INCLUDE�FILE�NAME�---------- �SPC�1 FILL�CLRA �JSR�WRT UPDAT�LDAB�OCNTR �BNE�FILL UPDAT2�LDA�B�TISIZE �LDA�A�TISIZE+1 �SUBA�OSIZE+1 �SBCB�OSIZE �ADDA�#1 �ADCB�#0 �LDX�XTEMP �STA�B�8,X �STA�A�9,X �CLR�5,X �STS�STEMP �LDS�#BUF-1 �LDA�B�#5 LOOP5�PUL�A �STA�A�X �INX �DEC�B �BNE�LOOP5 �LDS�STEMP �LDX�ISIZE �DEX �STX�OSIZE �LDAA�OTRK �PSHA �CLR�OTRK �LDAA�OSCTR �PSHA �LDA�A�ISCTR �STA�A�OSCTR �LDX�XTEMP �LDAB�#11 LOOP7�INX �DECB �BNE�LOOP7 �CPX�#BUF1+121 �BNE�UPDAT4 �BSR�WRTBUF �LDX�#BUF1 UPDAT4�LDAA�#$FF �STAA�5,X �PULA �STAA�7,X �PULA �STAA�6,X �BSR�WRTBUF �JMP�$F564 �SPC�1 *�WRITE�UPDATED�DIRECTORY�TO�THE�FILE *�DIRECTORY�AREA�OF�THE�DISKETTE�---- �SPC�1 WRTBUF‚LDX�#BUF1 LOOP6�LDA�A�X �STX�XTEMP �JSR�WRT �LDX�XTEMP �INX� �CPX�#BUF1+128 �BNE�LOOP6 �RTS �SPC�1 �OPT�NOGENERATE MESSAG‚FCC�/NO�ROOM/ �FCB�$0D,$0A,$20,$20,4 �SPC�1 TEXT1‚FCC�/MEMORY�DUMP�ON�DISKETTE/ �FCB�$0D,$0A,4 MHDR�FCC�/HDR=X�/ �FCB�4 MTAPE1�FCB�$D,$A,0,'S,'1,4 MTAPE2‚FCB�$0D,$0A,0 �FCC�/S9030000FC/ �FCB�$D,4 MTAPE3�FCB�$D,$A,$0 �FCC�/S00B00005820/ �FCB�4 �SPC�1 STACK�EQU�*+30 �SPC�2 �END ÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅ& ÷€ NAM TAPVRF SPC 2 * AUTHOR: BERNARD RIGAUD * MOTOROLA SEMICONDUCTOR PRODUCTS SPC 1 * THIS PROGRAM ALLOWS TO CHECK PAPER TAPE COPIES * OF ANY FORMAT WITH THE MOTOROLA H/S READER. * * AFTER PRINTING THE CHARACTER '= THE PROGRAM * WAITS FOR A COMMAND: * M (MASTER) READS ORIGINAL PAPER TAPE, COMPUTES * AND PRINTS CHECKSUM. * C (COPY) READS COPIES, COMPUTES AND PRINTS * CHECKSUM, COMPARES IT WITH MASTER * CHECKSUM AND PRINTS A MESSAGE. * X (EXBUG) RETURN TO EXBUG. * * REMARK: * TO AVOID ERRONEOUS COMPARISONS, THE ENDS OF * ORIGINAL TAPE AND OF ITS COPY HAVE TO BE CUT * IN THE SAME WAY. SPC 1 * STARTING ADDRESS: $100 SPC 2 OPT O,NOG SPC 1  PCRLF EQU $F021 PDATA1 EQU $F027 OUTCH EQU $F018 INCHNP EQU $F015 EXBUG EQU $F564 GETC EQU $EB02 OUT4HS EQU $F01E  SPC 1 ORG $100 SPC 1 * * GET COMMANDS * BEGIN EQU * LDS #*-1 BEG0 JSR PCRLF LDA A #'= JSR OUTCH PRINT = JSR INCHNP GET COMMAND CMP A #'M M? BEQ MASTER CMP A #'C C? BEQ COPY CMP A #'X X? BNE BEG0 WRONG COMMAND JMP EXBUG * * M COMMAND * MASTER EQU * LDX #0 CLEAR CHECKSUM BSR CLEAR M1 JSR GETC GET CHARACTER FROM TAPE BCS M3 END OF TAPE LDX #3 BSR ADDIT ADD CHARACTER TO CHECKSUM BRA M1 M3 LDX #0 BSR PRTCKS PRINT CHECKSUM BRA BEG0 * * SUBROUTINE TO CLEAR 4 MEMORY LOATIONS * CLEAR EQU * LDA B #4 COUNT 4 LOCATIONS CL0 CLR X CLEAR MEMORY  INX DEC B BNE CL0 RTS * * SUBROUTINE TO UPDATE CHECKSUM * ADDIT EQU * LDA B #4 COUNTER CLC ADD0 ADC A X ADD AND STORE STA A X IN MEMORY LDA A #0 DEX DEC B BNE ADD0 RTS * * C COMMAND * COPY EQU * LDX #4 CLEAR CHECKSUM BSR CLEAR C1 JSR GETC GET CHARACTER FROM TAPE BCS C3 END OF TAPE LDX #7 BSR ADDIT ADD CHAR. TO COPY CHECKSUM BRA C1 C3 LDX #4 JSR PRTCKS PRINT COPY-CHECKSUM SPC 1 COMP EQU * COMPARE CHECKSUMS LDA B #4 COUNTER  LDX #0 COM1 LDA A X CMP A 4,X COMPARE ONE BYTE BNE WRGMES NOT EQUAL INX DEC B BNE COM1 SPC 1 GDMES LDX #MSSOK CHECKSUMS EQUAL BRA MES0 PRINT /O.K./ SPC 1 WRGMES LDX #MSSWRG CHECKSUMS NOT EQUAL MES0 JSR PDATA1 PRINT /WRONG COPY/ JMP BEG0 * * SUBROUTINE TO PRINT CHECKSUM * PRTCKS EQU * LDA A #$20 JSR OUTCH PRINT SPACE JSR OUT4HS PRINT 4 CHARACTERS + SPACE JMP OUT4HS * * MESSAGES * MSSOK FCC /O.K./ FCB 4 SPC 1 MSSWRG FCC /WRONG COPY/ FCB 4 SPC 3 END ÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅý€*�THIS�PROGRAM�IS�AVAILABLE�ON�PAPER�TAPE�ONLY. '  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 PRO$þ€$ NAM TOWER OPT P,O,NOG * * * PROGRAM TO CALCULATE THE MOVES FOR THE 'TOWERS * OF HANOI ' PROBLEM. THE EXERCISER IS THE * TARGET DEVICE. THE PROGRAM EMPLOYEES RECURSION. * ( A SUBROUTINE CALLS ITSELF). THIS IS ACOMP- * LISHED BY PUTTING AND KEEPING THE VARIABLES * ON THE STACK. GENERALLY THE X-REG POINTS * TO A PLACE ON THE STACK SUCH THAT: * 0,X = PC HIGH * 1,X = PC LOW * 2,X = K * 3,X = J * 4,X = I * 5,X = N (NBR OF DISCS) * * * SOME OF THE COMMENTS RELATE TO THE HIGHER LEVEL * LANGUAGE 'PASCAL'. THE PROGRAM WAS PATTERNED * AFTER A PASCAL PRG. * * BY JOEL BONEY FOR MOTOROLA INC. - MAR 15 1976 * * PDATA EQU $FA33 EXBUG PRINT DATA ROUTINE INCHNP EQU $FAA0 EXBUG INPUT CHAR ROURINE ORG $1000 * MAIN LDS #$FFF SET STACK BSR GETN GO GET NBR OF DISCS * CALL TH(N,I,J,K) PSHA PUT N ON STACK LDAA #1 I=1 PSHA INCA  J=2 PSHA INCA K=3 PSHA BSR TH INITIAL CALL LDX #EOMSG ALL DONE MSG JSR PDATA JMP MAIN * * SUBROUTINE TO SOLVE THE TOWERS * TH TSX  GET CURRENT PTR TO STACK LDAA 5,X GET N * IF N=1 THEN PRINT N GOES FROM I TO J. CMPA #1 BNE ELSE BSR NGOSIJ PRINT MSG BRA OUT SKIP ELSE * ELSE CALL TH(N-1,I,K,J) ELSE DECA  N=N-1 PSHA LDAA 4,X I PSHA LDAA 2,X SWAP K FOR J PSHA  LDAA 3,X SWAP J FOR K PSHA BSR TH RECURSIVE CALL 1 TSX GET NEW PT ON STACK * WRITE N GOES FROM I TO J BSR NGOSIJ * CALL TH(N=1,K,J,I) LDAA 5,X N=N-1 DECA  PSHA LDAA 2,X SWAP K FOR I PSHA LDAA 3,X J PSHA LDAA 4,X  SWAP I FOR K PSHA BSR TH RECURSIVE CALL 2 TSX GET NEW PTR ON STACK * END  OUT INS POP OFF PREVIOUS ARGS INS INS INS INS INS LDX 0,X JMP 0,X DO RTS THIS WAY * * * SUBROUTINE TO GET N AND PRINT HEADER * * GETN LDX #MSG2  PRINT HEADER JSR PDATA JSR INCHNP GET ANS SUBA #$30 MAKE ASCII INTO NBR BLS GETN VALID? CMPA #9 BHI GETN VALID? RTS * * * SUBROUTINE TO PRINT 'N' GOES FROM 'I' TO 'J' * * NGOSIJ LDAB #$30 ASCII NBR BIAS LDAA 5,X GET N ABA MAKE ASCII  STAA LITN LITERAL N LDAA 4,X ABA STAA LITI LITERAL I LDAA 3,X (  ABA STAA LITJ LITERAL J STX TEMP LDX #LITN PRINT OUT MSG JSR PDATA  LDX TEMP RTS TEMP RMB 2 * N GOES FROM I TO J MSG LITN RMB 1 FCC ' GOES FROM ' LITI RMB 1 FCC ' TO ' LITJ RMB 1 FCB $04 * ALL DONE MSG EOMSG FCC 'EVERYONE IS ON TWO. ALL DONE.'  FCB $0A,$04 * HEADER MSG AND GET NBR OF DISCS * MSG2 FCB $0A,$0A,$0A FCC 'THIS PROGRAM SOLVES THE TOWER OF HANOI PROBLEM.' FCC ' THE TOWER OF HANOI PROBLEM' FCB $0D,$0A FCC 'REQUIRES MOVEMENT OF N DISCS FROM ONE PEG TO ANOTHER' FCC ' USING A 3RD PEG. ' FCB $0D,$0A FCC 'DISCS ON THE ORIGIN ARE STORED FROM BOTTOM TO TOP ' FCC 'IN DECREASING SIZE.' FCB $0D,$0A FCC 'THE RULES ARE:' FCB $0A,$0D FCC ' ONLY ONE DISC CAN BE MOVED AT A TIME.' FCB $0A,$0D  FCC ' YOU CAN NOT PUT A BIGGER DISC ON A SMALLER ONE.' FCB $0D,$0A FCC ' THE DISCS ON THE DESTINATION PEG MUST BE IN ' FCC 'DECREASING ORDER ON COMPLETION.' FCB $0D,$0A,$0A FCC 'EXAMPLE: ' FCB $0D,$0A FCC ' ! !  !' FCB $0D,$0A FCC ' ! ! !' FCB $0D,$0A FCC '1 XXX ! !' FCB $0D,$0A FCC '2 XXXXX ! !' FCB $0D,$0A FCC '3 XXXXXXX ! !' FCB $0D,$0A FCC '---------- --------- ---------' FCB $0D,$0A FCC ' 1 2 3' FCB $0D,$0A,$0A FCC 'PROBLEM IS TO MOVE DISCS 1,2,3 FROM PEG 1 TO 2 USING' FCC 'PEG 3 AS INTERMEDIARY.' FCB $0A,$0A,$0D,$0A FCC 'TYPE IN NUMBER OF DISCS TO BE SOLVED:' FCB 4  END MON ÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅ€*‚SOURCE�CODE�NOT�SUPPLIED�TO�MOTOROLA�MICROSYSTEMS�BY *‚N.�J.�BURZINSKI. ÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅ €�NAM�CVTBLS-C�4/6/76 *FILE�20,�C-3�CONVERSION�TABLES *TWO�PASS�ASSEMBLY�(�WDS,171�BYTES,�MS) �ORG�$8040�CONVERSION�TABLES *ENTER�WITH�TABLE#�IN�ACCA�B7,B6 *&�X�VALUE�IN�COUNT,COUNT+1 *RETURN�WITH�Y�IN�COUNT,�COUNT+1 *�SUBROUTINE�CALLED+�MPY8 ************** *ESTABLISH�CONVERSION�TABLES ************** CVTBLS�BRA�CVTBL1�DATA�GUARD TABLE1�FDB�00000�0-ELEMENTS�FOR... �FDB�00403�1-WATTMETTER�CONVERSION �FDB�01029�2-�(�YN�VALUES�) �FDB�01790�3- �FDB�02636�4- �FDB�03557�5- �FDB�04579�6- �FDB�05752�7- �FDB�07123�8- �FDB�08696�9- �FDB�10391�10- TABLE2�FDB�0�0-ELEMENTS�FOR... �FDB�0�1-THERMOCOUPLE�CONVERSION �FDB�0�2-�(�YN�VALUES�) �FDB�0) �3- �FDB�0�4- �FDB�0�5- �FDB�0�6- �FDB�0�7- �FDB�0�8- �FDB�0�9- �FDB�0�10- TABLE3�FDB�0�0-ELEMENTS�FOR... �FDB�0�1-DC�TO�RMS�CONVERSION �FDB�0�2-�(�YN�VALUES�) �FDB�0�3- �FDB�0�4- �FDB�0�5- �FDB�0�6- �FDB�0�7- �FDB�0�8- �FDB�0�9- �FDB�0�10- TABLES�FDB�TABLE1�TABLE�1�ADDRESS �FDB�TABLE2 �FDB�TABLE3 TBLSHB�EQU�TABLES/256�TABLES�HI�BYTE TBTEMP�EQU�TBLSHB*256 TBLSLB�EQU�TABLES-TBTEMP�TABLES�LO�BYTE CVTBL1�CLR�TEMP1 �LDAB�#TBLSHB�TABLES�HI�BYTE�TO�TEMP0 �STA�B�TEMP0 �ASL�A�MOVE�TABLE#�FROM�ACCA... �ROL�TEMP1�B7,B6�TO�TEMP1 �ROL�TEMP1 �ASL�TEMP1�MULTIPLY�BY�2 �LDX�TEMP0�XH=TABLES�HB,�XL=TABLE#*2 *TBLSLB-2,X�POINTS�TO�TABLE�ADDRESS... *WHERE�XH=TBLSHB,�XL=TABLE#*2 �LDX�TBLSLB-2,X�TABLE�BASE�ADD.�IN�X�REG �STX�TEMP0 �LDA�A�COUNT�HI�BYTE �LDA�B�COUNT+1�LO�BYTE �LSR�A �ROR�B �LSR�A�/4�GIVES�TABLE�ELEMENT# �ROR�B �STA�B�SAVEB�((X-XN)/4)=SMALL�A�/4 �ASL�A�2*ELEMENT#� �ADD�A�TEMP1�ADD�2*ELEMENT#�TO�XL �STA�A�TEMP1 �LDA�A�TEMP0 �ADC�A�#0�ADD�CARRY�TO�XH �STA�A�TEMP0 �LDX�TEMP0�POINTS�TO�TABLE�ELEMENT�YN �STX�SAVEX �LDA�A�2,X�Y(N+1)�LO�BYTE �LDA�B�3,X �SUB�B�1,X�Y(N+1)-YN �SBC�A�0,X�Y(N+1)-YN-C=�DELTA�Y �LSR�A�/8�TO�SCALE�DELTA�Y... �ROR�B�TO�<�8�BITS�FULL�SCALE �LSR�A �ROR�B �LSR�A �ROR�B �LDA�A�SAVEB�RESTORE�SMALL�A�/4 �JSR�MPY8�A�TIMES�B�=A,B �LSR�A�/32 �ROR�B �LSR�A �ROR�B �LSR�A �ROR�B �LSR�A �ROR�B �LSR�A �ROR�B �STA�A�TEMP0�STORE�PRODUCT�AS... �STA�B�TEMP1�SMALL�B �LDX�SAVEX�RESTORE�YN�POINTER �LDA�A�0,X�LOAD�YN �LDA�B�1,X �ADD�B�TEMP1�FORM�Y=YN+SMALL�B �ADC�A�TEMP0 �STA�A�COUNT �STA�B�COUNT+1 �RTS �PAGE *FILE�16,C-15,�8B*8B=16B�MULTIPLY *TWO�PASS�ASSEMBLY�(373WDS,27BYTES,�MS) *A�TIMES�B,�RESULT�IN�A,B MPY8�STA�B�TEMP1�MULTIPLICAND �STA�A�TEMP0�MULTIPLIER �LDA�A�#8 �STA�A�TEMP3 �CLR�A �CLR�B MPY81�ASL�B�SHIFT�RESULT�LEFT �ROL�A �ASL�TEMP1�TEST�NEXT�MSB�OF�MPYCAND �BCC�MPY82 �ADD�B�TEMP0�ADD�MULTIPLIER�TO�RESULT �ADC�A�#0 MPY82�DEC�TEMP3�DECREMENT�BIT�COUNT �BNE�MPY81�COUNT�NOT�ZERO �RTS �PAGE *�FILE�19,C-3�TEST�CONVERSION�TABLES *�ONE�PASS�ASSEMBLY *�THIS�ROUTINE�TESTS�THE�CONVERSION�TABLES *�ROUTINE�BY�STACKING�Y�VALUES�CORRESPONDING *�TO�X=N*256,�FOR�N=1�TO�40.�THE�DATA�STACK *�BEGINS�AT�128,�WITH�XH(N=1). ‚ORG�$1 *�VARIABLES�USED: TEMP0�RMB�1 TEMP1�RMB�1 TEMP3�RMB�1 TEMP4�RMB�1 COUNT�RMB�2 SAVEB�RMB�1 SAVEX�RMB�2 SAVESP�RMB�2 SAVSP1�RMB�2 �ORG�$8000 *�EXECUTE�PROGRAM�BY�ENTERING�MAID;�SET *�BREAKPOINT�AT�BRA*�INSTRUCTION,�THEN�;G. TCVTBL�LDS�#207�SP=127+80=207 �STS�SAVSP1�INITIALIZE�DATA�POINTER �LDA�A�#40�INITIALIZE�COUNT�TO�10,240 �STA�A�TEMP4� �LDAA�#$7F�INITIALIZE�SUBROUTINE�STACK TCTBL1�STS�SAVESP�SAVE�SUBROUTINE�STACK �LDS�SAVSP1�LOAD�DATA�POINTER �LDA�A�TEMP4�LOAD�NEW�INPUT�COUNT �STA�A�COUNT �CLR�COUNT+1�INPUT�COUNT�LOW�BYTE �LDA�A�#01000000B�TABLE#=1�IN�B7,B6 �JSR�CVTBLS�CALL�CONVERSION�TABLES �LDA�A�COUNT�STACK�RESULT �PSH�A �LDA�A�COUNT+1 �PSH�A �STS�SAVSP1�SAVE�DATA�STACK�POINTER �LDS�SAVESP�RESTORE�SUBROUTINE�POINTER �DEC�TEMP4�SUBTRACT�256�FROM�INPUT�COUNT �BNE�TCTBL1�CONVERT�ANOTHER�VALUE �BRA�*�EXORCISER�BREAK�POINT �ORG�$83FE �FDB�$8000�SET�RESTART�VECTOR�FOR�EXOR. �END ÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅ* 1€/00000‚NAM�AETX.1 00010�*�NAM:�AETX.1ƒVERSION�1ƒ01-17-76ƒCMP:M6800 00020�* 00030�*�PGR:�CHRIS�GRANTƒORG:�MARTIN�MARIETTA,�DENVER 00040�* 00050�*�SYS:�M68RES 00060�* 00070�*�DES:�THIS�EDITOR/ASSEMBLER�INTERNAL�TRANSFER 00080�*†ROUTINE�IS�USED�WITH�THE�CO-RESIDENT 00090�*†EDITOR/ASSEMBLER.‚IT�ALLOWS�THE�EDIT 00100�*†BUFFER�TO�BE�ACCESSED�DIRECTLY�BY�THE 00110�*†ASSEMBLER�WITHOUT�EXTERNAL�TAPE�TRANSFERS. 00120�* 00130�*†EXBUG�UTILIZATION 00140�* 00150�*�REV:�NONE 00160�* 00170‚OPT�OUTPUT�TAPE 00180‚OPT�NOG 00190�* 00200�* 00210‚SPC�4 00220�**************************************************** 00230�**************************************************** 00240�*‘INSTRUCTIONS 00250�* 00260�*�TO�TRANSFER�FROM�EDITOR�TO�ASSEMBLER� 00270�*„ENTER�CONTROL�A 00280�* 00290�*�TO�TRANSFER�FROM�ASSEMBLER�TO�EDITOR 00300�*„ENTER�CONTROL�E 00310�* 00320�*�EDIT�BUFFER�IS�LOCATED�FROM�END�OF�PROGRAM 00330�*„TO�$37FF. 00340�*„TO�CHANGE�BEGINNING�ADDRESS,�REDEFINE�"BEGED" 00350�*„TO�CHANGE�ENDING�ADDRESS,�REDEFINE�"ENDED" 00360�* 00370�*�ASSEMBLER�SYMBOL�TABLE�IS�LOCATED�FROM�$3800 00380�*„TO�$3FFF,�ALLOWING�DEFINITION�OF�256�SYMBOLS. 00390�*„TO�CHANGE�BEGINNING�ADDRESS,�REDEFINE�"BEGAS" 00400�*„TO�CHANGE�ENDING�ADDRESS,�REDEFINE�"ENDAS" 00410�* 00420�*�WHEN�THE�ASSEMBLER�IS�ENTERED�BY�SETTING�THE 00430�*„PROGRAM�COUNTER�TO�$0100�AND�THE�EDITOR�IS 00440�*„ENTERED�VIA�THE�PC�AT�$0103,�THE�ASSEMBLER 00450�*„AND�EDITOR�WILL�FUNCTION�AS�DESCRIBED�IN�THE 00460�*„SOFTWARE�SUPPLEMENT.‚THIS�ROUTINE�WILL�TAKE 00470�*„CONTROL�WHEN�PROGRAM�TRANSFER�IS�INITIATED 00480�*„BY�"CTRL�A"�OR�"CTRL�E" 00490�* 00500�*�THIS�PROGRAM�MUST�BE�LOADED�AFTER�LOADING�THE 00510�*„ASSEMBLER/EDITOR�BECAUSE�SEVERAL�OF�THEIR 00520�*„INSTRUCTIONS�ARE�CHANGED�BY�AETX.1 00530�* 00540�*�DO�NOT�USE�THE�EDITOR�AND�ASSEMBLER�OVERWRITE 00550�*„OPTIONS�WHEN�USING�THIS�ROUTINE 00560�* 00570�**************************************************** 00580�**************************************************** 00590‚SPC�4 00600�*�THE�FOLLOWING�SECTION�MODIFIES�THE�C0-RESIDENT 00610�*„EDITOR/ASSEMBLER�SOFTWARE 00620�**************************************************** 00625‚SPC�1 00630‚ORG�$EC 00640�UPDEX�RMB�2 00650�DWNDEX�RMB�2 00660‚ORG�$100 00670�ASM�JMP�ASENT 00680�ED�JMP�EDENT 00690‚ORG�$118 00700�XCI�JMP�MCI 00710�XCIE�JMP�MCIE 00720‚ORG�$1E9 00730‚FDB�RDRBYP 00740‚ORG�$210 00750‚FDB�RDRBYP 00760‚ORG�$27D 00770‚FDB�TRANSC 00780‚ORG�$301 00790‚FDB�ENDAS 00800‚ORG�$905 00810‚FDB�BEGAS 00820‚ORG�$9BB 00830‚FDB�BEGAS 00840‚ORG�$94D 00850‚FDB�EBINZ 00860‚ORG�$12E9 00870‚FDB�BEGAS 00880‚ORG�$1738 00890‚FDB�BEGED 00900‚ORG�$1741 00910�END1�CPX�#ENDED 00920‚BNE�END1-3 00930�**************************************************** 00940‚SPC�4 00950‚ORG�$1D06 00955‚SPC�4 00960�*�EDITOR�PROGRAM�COUNTER�ENTRY�POINT 00965‚SPC�1 00970�EDENT�CLR�MODE 00980‚JMP�ESTART 00985‚SPC�4 00990�*�ASSEMBLER�PROGRAM�COUNTER�ENTRY�POINT 00995‚SPC�1 01000�ASENT�LDAA�#1 01010‚STAA�MODE 01020‚JMP�ASTART 01025‚SPC�4 01030�*�CONSOLE�INPUT�ROUTINES:�CHECK�FOR�"CTRL�A" 01040�*„AND�"CTRL�E"�AND�INITIATE�TRANSFER 01045‚SPC�1 01050�MCI�JSR�CI 01060�MCI1�CMPA�#1�CONTROL�A? 01070‚BEQ�MCI2�YES,�CHECK�MODE 01080‚CMPA�#5�NO,�CONTROL�E? 01090‚BEQ�MCI3�YES,�CHECK+ �MODE 01100‚RTS 01110�MCI2�PSHB 01120‚LDAB�MODE 01130‚RORB 01140‚PULB 01150‚BCC�ASTRAN�IN�EDITOR�MODE? 01160‚RTS�NO,�RETURN 01170�MCI3�PSH�B 01180‚LDAB�MODE 01190‚RORB 01200‚PULB 01210‚BCS�EDTRAN�IN�ASSEMBLER�MODE? 01220‚RTS�NO,�RETURN 01230�MCIE�JSR�CIE 01240‚BRA�MCI1 01245‚SPC�4 01250�*�INITIALIZE�EDIT�BUFFER�POINTER 01255‚SPC�1 01260�EBINZ�STX�SAVX�SAVE�X-REG 01270‚LDX�#BEGED+1 01280‚STX�EBUFPT 01290‚LDX�SAVX�RESTORE�X-REG 01300‚JMP�ASMSG 01305‚SPC�4 01310�*�BYPASS�TAPE�READER�COMMANDS 01315‚SPC�1 01320�RDRBYP�PSHA�SAVE�ACC-A 01330‚LDAA�MODE 01340‚CMPA�#$81�E-TO-A�TRANSFER�MODE? 01350‚PULA�RESTORE�ACC-A 01360‚BNE�RDBY1�NO,�CONTINUE 01370‚RTS�YES,�BYPASS 01380�RDBY1�JMP�OUTCH 01385‚SPC�4 01390�*�ASTRAN�SAVES�THE�EDITOR�SCRATCH�AREA 01400�*„BEFORE�ENTERING�THE�ASSEMBLER 01405‚SPC�1 01410�ASTRAN�LDAB�#$81 01420‚STAB�MODE�UPDATE 01430‚LDX�#TSTK 01440‚STX�UPDEX 01450‚LDX�#$3D 01460�ASTR1�BMI�ASTR2�MOVE�COMPLETE 01470‚LDAA�$20,X 01480‚DEX 01490‚STX�DWNDEX 01500‚LDX�UPDEX 01510‚STAA�X 01520‚DEX 01530‚STX�UPDEX 01540‚LDX�DWNDEX 01550‚BRA�ASTR1 01560�ASTR2�JMP�ASTART 01565‚SPC�4 01570�*�EDTRAN�RESTORES�THE�EDITOR�SCRATCH�AREA 01580�*„MOVED�DURING�TRANSFER�TO�ASSEMBLER. 01590�*„EDITOR�THEN�ENTERED�W/O�INITIALIZATION. 01595‚SPC�1 01600�EDTRAN�LDAB�#$81 01610‚CMPB�MODE 01620‚BNE�EDTR3 01630‚DECB 01640‚STAB�MODE�UPDATE 01650‚LDX�#$3D 01660‚STX�DWNDEX 01670‚LDX�#TSTK 01680�EDTR1�LDAA�X 01690‚DEX 01700‚STX�UPDEX 01710‚LDX�DWNDEX 01720‚STAA�$20,X 01730‚DEX 01740‚STX�DWNDEX 01750‚BMI�EDTR2�MOVE�COMPLETE 01760‚LDX�UPDEX 01770‚BRA�EDTR1 01780�EDTR2�JMP�PROMPT�NON-INZ�EDITOR�INPUT 01790�EDTR3�JMP�ESTART�EDITOR�INPUT 01795‚SPC�4 01800�*�TRANSC�CHECKS�THE�MODE�FOR�INTERNAL�EDIT�BUFFER 01810�*„TO�ASSEMBLER�TRANSFER.‚IF�INTERNAL�TRANSFER 01820�*„BIT�IS�SET�THE�RECORD�IS�READ�FROM�EDIT�BUFFER 01830�*„RATHER�THAN�TAPE 01835‚SPC�1 01840�TRANSC�LDAA�MODE 01850‚CMPA�#$81�INT�TRANSFER�MODE? 01860‚BEQ�TRAN1�YES,�INPUT�FROM�EDIT�BUFFER 01870‚JMP�CI 01880�TRAN1�LDX�EBUFPT�EDIT�BUFFER�POINTER 01890‚LDAA�X�INPUT�CHAR 01900‚CMPA�#$FF�END�OF�TEXT? 01910‚BEQ�TRAN2�YES,�EXIT�PASS 01920‚INX�INCREMENT�BUFFER�POINTER 01930‚STX�EBUFPT 01940‚RTS 01950�TRAN2�LDAA�#$D 01960‚RTS 01965‚SPC�4 01970�MODE�RMB�1 01980�SAVX�RMB�2 01990�EBUFPT�RMB�2�EDIT�BUFFER�POINTER 02000‚RMB�$3E 02010�TSTK�EQU�*-1�TOP�SAVED�BUFFER�STACK 02020�BEGAS�EQU�$3800�SYMBOL�TABLE�BEGINS 02030�ENDAS�EQU�$3FFF�SYMBOL�TABLE�ENDS 02040�BEGED�EQU�TSTK+1�EDIT�BUFFER�BEGINS 02050�ENDED�EQU�$37FF�EDIT�BUFFER�ENDS 02060�ESTART�EQU�$1641�EDITOR�START 02070�ASTART�EQU�$8F4�ASSEMBLER�START 02071‚SPC�1 02072�*�FOR�MIKBUG�USE�THE�FOLLOWING�VALUES 02073�*�CI�-�$�14D 02074�*�CIE�-�$14D 02075�*�OUTCH�-�$221 02076‚SPC�1 02080�CI�EQU�$14C�CONSOLE�INPUT 02090�CIE�EQU�$14F�CONSOLE�INPUT/ECHO 02100�PROMPT�EQU�$1673�NON-INZ�EDITOR�ENTRY 02110�OUTCH�EQU�$F018 02120�ASMSG�EQU�$11E 02130‚END ÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅ, y€x‡NAM�BIORTM� *� *� *ˆTHE�FOLLOWING�PROGRAM�COMPUTES�THE�BIORHYTHS� *ˆFOR�DATA�INPUT�THROUGH�THE�TELETYPE,�AND� *ˆDISPLAYS�THE�RESULT�IN�A�CHART�TYPED�OUT� *ˆON�THE�TTY.�VARIABLES�USED�IN�THE�PROCESS� *ˆARE�EXPLAINED�BELOW.� *� *VARIABLE�LIST:� *� *ˆNUMDAH,NUMDAL-ADDRESS�OF�LIST�OF�DAYS�IN�MONTH� *ˆNMMDYL-ADDRESS�OF�LIST�OF�DAYS�LEFT� *’IN�THE�YEAR�FROM�END�OF�EACH�MONTH� *‰BINBYL-BIRTH�YEAR�IN�BINARY *ˆBINMON-BIRTH�MONTH�IN�BINARY� *ˆBINTAD-BINARY�TARGET�MONTH� *ˆPHIS-PHASE�OF�PHYSICAL�CYCLE� *ˆEMOR-PHASE�OF�EMOTIONAL�CYCLE *ˆINTR-PHASE�OF�INTELLECTUAL�CYCLE� *ˆLOOKU,LOOKL-INDEX�ADDRESS�INTO *“POSITION�ARRAYS *ˆPHYSU,PHYSL-ADDRESS�OF�POSITION�ARRAY� *“FOR�PHYSICAL�CYCLE *‰EMOTU,EMOTL-ADDRESS�OF�POSITION�ARRAY *’FOR�EMOTIONAL�CYCLE� *ˆINTEU,INTEL-ADDRESS�OF�POSITION�ARRAY� *’FOR�INTELLECTUAL�CYCLE.� *ˆBINNUM-BINARY�NUMBER�OF�DAYS�TO�BE�PLOTTED� *ˆBMON-BIRTH�MONTH�IN�BCD *ˆBDAY-BIRTH�DAY�IN�BCD� *ˆBYR-BIRTH�YEAR�IN�BCD� *ˆDMON-TARGET�MONTH�IN�BCD� *ˆDDAY-TARGET�DAY�IN�BCD� *ˆDYR-TARGET�YEAR�IN�BCD� *ˆNODAYS-LENTH�OF�PLOT�IN�BCD�(DAYS)� *ˆBINBD-BINARY�BIRTH�DAY� *ˆTOTALH,TOTALL-LIFESPAN�IN�DAYS� *ˆTEMP-TEMPORARY�STORAGE�LOCATION� *ˆPHYPRINT�LOCATION�OF�PHYS.�VALUE� *ˆEMOPRT-PRINT�LOCATION�OF�EMOT.�VALUE� *ˆINTPRT-PRINT�LOCATION�OF�INTELL.�VALUE� *ˆXKDVSR-DIVISOR�IN�XKDVND�ROUTINE� *ˆXKDVND-DIVIDEND� *ˆXKQUOT-QUOTIENT�IN�DIVIDE�ROUTINE� *†XKDSPL-AMOUNT�REMAINDER�IS�SHIFTED� *ˆDAYMON-ARRAY�OF�DAYS�IN�EACH�MONTH� *ˆDAYYRE-ARRAY�OF�DAYS�LEFT�YEAR� *’FROM�END�OF�EACH�MONTH� *� *� *ˆTHESE�VARIABLES�RESIDE�IN�THE�BASE� *ˆPAGE�OF�MEMORY�AS�ASSEMBLED�BELOW:� *� *� �ORG�$80 FLAG�RMB�1� NUMDAHƒFCB‡0� NUMDALƒFCB‡0� NMDYH„FCB‡0� NMDYL„FCB‡13� BINBYLƒRMB‡1� BINMONƒRMB‡1� BINTADƒRMB‡1� PHIS�RMB‡1� EMOR…RMB‡1� INTR…RMB‡1� LOOKU„RMB‡1� LOOKL„RMB‡1� PHYSL„FCB„39� PHYSU„FCB‡0� EMOTL„FCB‡62� EMOTU„FCB‡0� INTEL„FCB‡90� INTEU�FCB�0 BINNUMƒRMB‡1� BMON…RMB‡3� BDAY…RMB‡3� BYR†RMB‡2� DMON…RMB‡3� DDAY‚RMB‡3� DYR†RMB‡2� NODAYSƒRMB‡2� BINBD„RMB‡1� TOTALHƒRMB‡1� TOTALL�RMBŠ1� TEMP…RMB‡1� PHYPRTƒRMB‡1� EMOPRTƒRMB‡1� INTPRTƒRMB‡1� BINDYL�RMB�1 *� ‰ORG‡$F9� XKDVSRƒRMB‡1� XKDVNDƒRMB‡1� ‰RMB‡1� XKQUOTƒRMB�1† ‰RMB‡1� XKDSPLƒRMB‡1� �ORG�$00 DAYMONƒFCB�0,31,28,31,30,31,30,31,31,30,31,30,31 DAYYRE�FCB�0,0 ‰FCB‡78,1� ‰FCB‡50,1� ‰FCB‡20,1� ‰FCB„245,0� ‰FCB‡214,0� ‰FCB‡184,0� ‰FCB‡153,0� ‰FCB‡122,0� ˆFCB‡92,0� ‰FCB‡61,0� ‰FCB‡31,0� ‰FCB‡0,0� *� *� *� ‰FCB…25,32,38,43,47,49,50,49� ‰FCB‡45,41,35,28,23,15,9,5,1,0� ‰FCB‡1,3,7,12,18� *� *� ‡FCB‡25,31,36,41,45,48,49,50� ‰FCB‡49,48,45,41,36,31,25,19� ‰FCB‡14,9,5,2,1,0,1,2,5,9,14,19� *� *� ‰FCB‡25,30,34,39,42,45,48,49,50,50� ‰FCB‡47,44,41,37,32,27,23,18,13� …FCB‡9,6,3,1,0,0,1,2,5,8,11� ‰FCB‡16,20� *� *� *� *� *� *ˆTHIS�INITIAL�PROMPT�ROUTINE�EXPLAINS *ˆBIORHYTHMS�AND�ASKS�FOR�PERTINENT� *ˆDATA�NEEDED�TO�PLOT�EACH�CYCLE.� *ˆTHE�SUBROUTINES�CALLED�ARE: *’INCH� *’OUTCH� *’PROM� *’ENTER� * * STACK�EQU�511�END�OF�STACK ‰ORG‡512� START�LDS�#STACK INCH…EQU‡$F012� OUTCH„EQU‡$F018� *…INITIATE�PROMPT�ROUTINE� *� KD‡LDAB†#79� ‰LDX‡#PROMPTƒOUTPUT"DO�YOU�WISH...#� ‰JSR…PROM� *� *� ‰JSR‡INCH� �ANDA�#$7F� �CMPA�#$59� �BNE�NOLIST� LIST…LDAB†#232� †LDX‡#INTROD� ‰JSR‡PROM� ‰LDAB†#240� ‰LDX‡#INTRO2� ‰JSR‡PROM ‰LDAB†#128� ‰LDX‡#INTRO3� ‰JSR‡PROM� NOLISTƒLDAB†#111�-  †LDX‡#DTEINPƒPROMPT�FOR�BIRTH�DATE� ‰JSR‡PROM� ‰LDAB†#8� ‰LDX‡#BMON…ENTER�BIRTH�DATE�IN�BUFFER� ‰JSR‡ENTER� *� *� ‰LDAB†#62� ‰LDX‡#BEGIN„PROMPT�FOR�TARGET�DATE� ‰JSR‡PROM� **� *� ‰LDAB†#8� ‰LDX‡#DMON…STORRE�TARGET�DA@ ‰JSR‡ENTER� *� *� ‰LDAB†#62‡PROMPT�FOR�LENGTH�OF�PLOT� ‰LDX‡#HMDAYS ‰JSR‡PROM� *� *� ‰LDAB†#2� ‰LDX‡#NODAYSƒSTORE�LENGTH�OF�PLOT� �JSR�ENTER *� *� ‰LDAB†#67‡TYPES�EXPLANATION�OF�CHART� ‰LDX‡#CHART� ‰JSR‡PROM� *� *� *� *ˆTHIS�ROUTINE�COMPUTES�THE�LIFESPAN�IN�DAYS.� *ˆTHE�ACCUMULATION�ADDS�IN�ORDER�,�1)THE� *ˆDAYS�LEFT�IN�THE�BIRTH�MONTH,�2)THE�DAYS� *ˆLEFT�IN�THE�BIRTH�YEAR,�3)THE�DAYS�IN� *ˆEACH�YEAR�FROM�THE�BIRTH�YEAR�TO�THE�TARGET� *ˆYEAR,�4)THE�DAYS�IN�THE�TARGET�YEAR�TO�TARGET� *ˆMONTH,�AND�5)THE�DAYS�IN�THE�TARGET�MONTH�TO� *ˆTHE�TARGET�DAY.‚THE�LIFESPAN�IS�KEPT�IN� *ˆTOTALH�AND�TOTALL.‚ALL�LEAP�YEARS�ARE� *ˆDULY�ACCOUNTED�FOR.� *ˆSUBROUTINE�USED�IS:� *’BINAR� *� ‰CLR‡TOTALL�RESET�TOTAL�LIFESPAN� ‰CLR‡TOTALH� �CLR�FLAG�*******� �LDX�BYR�*******� �CPX�DYR�*******� �BNE�NEQ�*** �INC�FLAG�*******� NEQ�LDAA�BMON�FIND�NUMBER�OF�DAYS�IN� ŠLDAB†BMON+1„BIRTH�MONTH� ‰CMPA„#0� ‰BEQ‡RST� ‰ADDB†#10‡CONVERTS�BCD�MONTH-BINARY� RST†STAB†NUMDAL� ‡LDX‡NUMDAH� ‰LDAA†0,X‡ACCUMA�HAS�DAYSIN�BIRTH�MON� �LDAB�BDAY�THE�BCD�BIRTH�DATE �CMPB�#0�IS�CONVERTED�INTO �BEQ�OVR4 ‰CMPB†#1…IN�ACCUM�B�AND� ‰BEQ‡OVR1†STORED�IN�BINBD� ‰CMPB†#2� ‰BEQ‡OVR2� †LDAB†BDAY+1� ‰ADDB†#30� ‰BRA‡OVR� OVR4…LDAB†BDAY+1� ‰BRA‡OVR� OVR1…LDAB†BDAY+1� ‰ADDB†#10� ‰BRA‡OVR� OVR2…LDAB†BDAY+1� ‰ADDBƒ#20� OVR†STAB†BINBD� *� *� ‰SUBA†BINBD…DAYS�IN�BIRTH�MONTH�-�BDAY� ‰BMI†CORREC„NEG�OCCRUS�IN�FEB,�LEAP�YR� ‰STAA†TOTALL� ‰BRA‡LEFYEA� CORRECƒCLR‡TOTALL� LEFYEA‚LDAA†NUMDAL„THE�DAYS�LEFT�IN�YEAR� ‰ROLA�ARE�ADDED�TO�TOTAL� ‰ADDA†#13†LIFESPAN,�BY� ‰STAA†NMDYL…INDEXING�INTO� ‰LDX‡NMDYH…ARRAY�THRUU� ‰LDAA†0,X†NMDYH�&NMDYL� ‰INX� ‰LDAB†0,X� ‰ADDA†TOTALL� ‰ADCB†TOTALH ˆSTAA†TOTALL� ‰STAB†TOTALH� �LDAA�#1�*******� �CMPA�FLAG�*******� �BNE�NEQ1�*******� �LDAA�#109 �LDAB�#1�HI�&�LO�BYTES�OF�365� �SUBA�TOTALL� �SBCB�TOTALH�SUB�#�OF�DAYS�FROM�365� �COMA� �COMB� �ADDA�#1� �ADCB�#0 �STAA�TOTALL� �STAB�TOTALH� �BRA�TARDAT�*******� NEQ1�LDX�#DYR� ‰JSR‡BINAR� ‰STAA„BINDYL„TARGET�YR.�TO�BINARY� ‰LDX‡#BYR� ‰JSR‡BINAR� ‰STAA†BINBYL� ‰ANDA†#$03†MASK�LOWEST�2�BITS�OF�BY� ‰BNE‡FINI� ‰LDAA†NUMDAL„TEST�FOR�PAST�FEB�+ ˆCMPA†#2� ‰BGT‡FINI� ‰LDAA†#1� ‰LDAB†#0� ‰ADDA†TOTALL� ˆADCB†TOTALH� ‰STAA†TOTALL� ‰STAB†TOTALH� FINI…LDAA†BINBYL„INCR�1�YE ‰ADDA†#1� ‰STAA†BINBYL� ‰CMPA†BINDYL� ‰BNE‡CONT� ˆBRA‡TARDAT� *� *� CONT…LDAA†#$6D†ADD�365�TO�TOTAL� ‰LDAB†#1� ‰ADDA†TOTALL� ˆADCB†TOTALH� ‰STAA†TOTALL� ‰STAB†TOTALH� ‰LDAA†BINBYL„CHECK�FOR‚LEAP�YAR� ‰ANDA†#$03� ‰BNE‡CO� ‰LDAA†#1� ‰LDAB†#0� ‰ADDA…TOTALL„ADD�1�DAY�IF�LEAP�YR� ‰ADCB†TOTALH� ‰STAA†TOTALL� ‰STAB†TOTALH� CO‡BRA‡FINI†BRANH�BACK� TARDATƒLDAA†DMON� ‰LDAB†DMON+1„TARGET�MONTH�IS�LODED� ‡CMPA†#0� ‰BEQ‡OUT� ‰ADDB†#10� OUT†STAB†BINMON�STORE�BINARY�TARGET�MONTH� * * ‰LDAA†#1� OTA†CMPA†BINMON� ‰BEQ‡DAYCO� ‰STAA†NUMDAL� ‡LDX‡NUMDAH� ‰LDAB†0,X� ‰ADDB†TOTALL� ‰STAB†TOTALL� ‰LDAB†#0� †ADCB†TOTALH� ‰STAB†TOTALH� ‰INCA� ‰BRA‡OTA� *� *� DAYCO„LDX„#DDAY…CONVRT�BCD�TARGET�TO�BINARY� ‰JSR‡BINAR� ‰STAA†BINTAD� *� *� ‰ADDAƒTOTALL� ‰STAA†TOTALL� ‰LDAA†#0� ‰ADCA†TOTALH� ‰STAA†TOTALH„ADD�AAYS�TO‚TOTAL� *� *� ‰LDAA†BINDYL� ‰ANDA†#03� ‰BNE‡NXT� ‰LDABƒBINMON„CORRECTS�FOR�LEAP�YR� ‰CMPB†#2� ‰BLE‡NXT� ‰LDAA†#1� ‰ADDA†. TOTALL� ‰STAA†TOTALL� ‰LDAA†#0� ‰ADCA†TOTALH� ‰STAA†TOTALH� *� *ˆTHIS�ROUTINE�COMPUTES�THE�PHASE�OF�THE�THREE� *ˆCYCLES�USING�SUBROUTINES�RMDR�AND�XKDIVD.�THE� *…RESULTS�ARE�SCALED�AND�STORED�IN�A�BUFFER�FOR� *ˆPRINT�OUT.� *� *� *� NXT†LDAA†#23� ‰JSR†RMDR� ‰STAA†PHIS� ‰ADDA†PHYSL…THE�PHASE�OF�EACH�CYCLE� ‰STAA†LOOKL…IS�CALCULATED� ‰LDAA†#0� ‰ADCA†PHYSU� ‰STAA†LOOKU� ‰LDX‡LOOKU� ˆLDAA†0,X� ‰STAA†PHYPRT„PHIS,EMOR,AND�INTR�HOLD� ‰LDAA†#28‡THE�REMAINDER�OF�DIVIDING ˆJSR‡RMDR†LIFESPAN�BY�NO.�OF�DAYS� ‰STAA†EMOR†IN�EACH�CYCLE.� ‰ADDA†EMOTL� ‰STAA†LOOKL� ‰LDAA†#0� ‰ADCA†EMOTU� ‰STAA†LOOKU� ‰LDX„LOOKU� ‰LDAA†0,X� ‰STAA†EMOPRT� **� **� *� ‰LDAA†#33� ‰JSR„RMDR� ‰STAA†INTR†THE�INTELLECTUAL�DATA� ‰ADDA†INTEL…IS�UPDATED�THRU�LOOKUP� †STAA†LOOKL…ROUTINE� ‰LDAA†#0� ‰ADCA†INTEU� ‰STAA†LOOKU� ‰LDX†LOOKU� ‰LDAA†0,X� ‰STAA†INTPRT� ‰LDX‡#NODAYS� ‰JSR‡BINAR� †STAA†BINNUM� **� *� *ˆTHIS�SECTION�SEQUENCES�THE�OUTPUT�OF�DATA� *ˆIN�A�CHART�FORMAT�ON�TTY.�SUBROUTINES� *ˆCALLED�ARE�DATEO,�WHICH�TYPES�A� *ˆPROPERLY�FORMATTED�DATE,�AND�PLOT,�WHICH� *ˆTYPES�THE‚POINTS�IN�EACH�CYCLE.� *� *� *� *� ‰LDAB†#142†OUTPUT�EXPLANATION�OF�PLOT� ‰LDX…#DATI� ‰JSR‡PROM� PO‡JSR‡DATEO…OUTPUT�DATA� ‰JSR‡PLOT� ‰DEC‡BINNUM ‰LDAA†#0� ‰CMPA†BINNUM� ‰BEQ‡PLOTO� ‰LDAA†BINTAD� ‰INCAŽTHE�DATE�TO�BE�PLOTTED� ‰STAA†BINTAD„IS�INCREMENTED�AND�TESTED� ‰LDAB…BINMON„FOR�PROPER�DAY,�MONTH� ‰STAB†NUMDAL„AND�YEAR�CIONVENTIONS� ‰LDX‡NUMDAH� ‰LDAB†0,X ‰STAB†TEMP� ‰CMPA†TEMP� ‰BGT‡TEST� TRTB…LDAA†DDAY+1„INCR.BCD�TARGET� ‰ADDA†#1ˆDAY� ‰DAA‘DECIMAL�ADJUST� ‰CMPA†#$0F†RESULT� ‡BGE‡ADDV� ‰STAA†DDAY+1� ‰BRA‡CONTIN� PLOTO„JMP‡PLOTOV� *� *†TEST�LOOKS�FOR�FEBRUARY�OF�LEAP�YEAR� *ˆAND�ADDS�DAY�ACCORDINGLY.� *� TEST…LDAB†#2� ‰CMPB„BINMON� ‰BEQ‡FEBR� TRTN…LDAB†#1� ‰STAB†BINTAD„RESET�DAY�TO�1� ‰STAB†DDAY+1� ‰CLR‡DDAY� ‰INC‡BINMON� ‰LDAB†#13� ‰CMPB†BINMON� ‰BEQ‡RSETM� ‰LDAA†DMON+1� ‰ADDA†#1� ‰DAA� ‰CMPA†#$0F� ‰BGE†ADDR� ‰STAA†DMON+1� ‰BRA‡CONTIN� ADDR…ANDA†#$0F� ‰STAA†DMON+1� ˆINC‡DMON� ‰BRA‡CONTIN� RSETM„LDAA†#1� ‰STAA†BINMON� ‰STAA†DMON+1� ‰CLR‡DMON� ‰INC‡BINDYL„ADD�1�YYR�TO�BHN�TARGET�YR� ‰LDAA†DYR+1� ˆADDA†#1� ‰DAA� ‰CMPA†#$0F†TEST�FOR�CARRY� ‰BLT‡FINAL� ˆANDA†#$0F� ‰INC‡DYR� FINAL„STAA†DYR+1� ‰BRA‡CONTIN� *� *� FEBR…LDAA†BINDYL� ‰ANDA†#$03� ‰CMPA†#0� ‰BNE‡TRTN� ‰LDAA†BINTAD� ‚CMPA†#29� ‰BEQ‡TRTB� ‰CMPA†#30� ‰BGE‡TRTN� ‰BRA‡CONTIN� ADDVƒANDA†#$0F� ‰STAA†DDAY+1� ‰INC‡DDAY� ‰BRA‡CONTIN� *� *� *� *ˆNEXT�THE�P,E,�AND�I�DATA�IS�UPDATED� *ˆBY�INCRIMNTING�EACH�PHASE�NUMBER� *ˆAND�INDEXING�INTO�THE�PROPER�POSITION� *ˆARRAY�TO�GET�THE�LOCATION�OF�POINT� *ˆON�THE�PLOT.� *� *� CONTINƒLDAA†PHIS� ‰INCA�IS�LIMIT�HIT�IN�PHYSICAL� ‰STAA†PHIS†CYCLE� ‰CMPA†#23‡IF�SO�RESET�PHASE� ‰BNE‡NORST� ‰CLRA� ‰CLR‡PHIS� NORST„ADDA†PHYSL…INDEX�INTO�ARRAY� ˆSTAA†LOOKL� ‰LDAA†#0� ‰ADCA†PHYSU…PUT�VALUE�IN�PRINT�BUFFER� ˆSTAA†LOOKU� ‰LDX‡LOOKU� ‰LDAA†0,X� ‰STAA†PHYPRT� *� *� *� ‰LDAA†EMOR� ‰INCA� ‰STAA†EMOR� ‰CMPA†#28‡CHECK�FOR�LIMIT�IN�EMOTIONAL� ‰BNE‡NORT†CYCLE� ‰CLRA� ‰CLR‡EMOR†RESET�IF�HIT� NORT…ADDA†EMOTL� ‰STAA†LOOKL…LOOK�UP�DISPLAY�VALUE� ‰LDAA†#0� ‰ADCA†EMOTU� ‰STAA†LOOKU ‰LDX‡LOOKU� ‰LDAA†0,X� ‰STAA†EMOPRT� *� *� *� ‰LDAA†INTR†LIMIT�HIT�OR�INTELL�CYCLE?� ‰INCA� ‰STAA†INTR†RESET�IF�NEEDED� ‰CMPA†#33� ‰BNE‡NORS� ‰CLRA� ‰CLR‡INTR†LOOK�UP�VSLUE�AND�RETRIEVE� NORS…ADDA†INTEL…FOR�PRINT�OUT� ‰STAA†LOOKL� ‰LDAA†#0� ‰ADCA†INTEU� ‰STAA†LOOKU� ‰LDX†LOOKU� ‰LDAA†0,X� ‰STAA†INTPRT�/  ‰JMP‡POˆGO�TO�PPRRNT�ROUTINE� *� *� *� *� *ˆREQUEST�ANOTHER�DATE�OR�TERMINATE� PLOTOVƒLDAB†#1� ‰LDAA†#$0D� ‰JSR‡OUTCH� ‰LDAA†#$0A� LFO†JSR‡OUTCH� ‰DECB� ‰CMPB…#0� ‰BGT‡LFO� ANOT�LDAB�#$1E� ‰LDX‡#ANOTHR� ‰JSR‡PROM� ‰JSR‡INCH� �ANDA�#$7F� �CMPA�#$4E� �BNE�KD1� �SWI� KD1†JMP‡KD� *� *� *� *ˆSUBROUTINES�USED‚INTHE�MAINLLINE�ARE�LISTED� *ˆIN�THE�FOLLOWING�CODE.� *� *� *� *œBINAR� BINAR„LDAB†0,X� ‰INX‘BINAR�CONVERTS�BCD�CODE� ‰LDAA†0,X‡STORED�AT�VALUE�IN�INDEX�REG� TAK†CMPB†#0ˆ(MS�DIGIT)�AND�INDEX+1� ‰BLE‡TASK†(LS�DIGIT)�INTO�BINARY�VALUE� ‰ADDA†#10‡STORED�IN�ACCUM�A� ‰DECB� ‰BRA‡TAK� TASK…RTS� *� *� *� *� *� *œPROM� PROM…LDAA†0,X‡PROM�OUTPUTS�A�CHARACTER�STRING� PR‡JSR‡OUTCH…ON�THE�TTY,WITH�THE�ADDRESS�OF� ‰INX‘THE�STRING�IN�THE�INDEX�REG� ‰DECB�AND�THE�NO.�OF�BYTES�IN� ‰BNE‡PROM†ACCUM�B� ‰RTS� *� *� *� *� *� *œENTER� ENTER„JSR‡INCH†ENTER�STORES�ACHARACTER�STRING� ‰ANDA†#$0F‡FROM�THE�TTY�AT�LOCATION� ‰STAA†0,X‡STARTING�AT�VALUE�IN�INDEX�REG.� ‰INX‘AND�ENDING�N�BYTES�LATGER� ‰DECB�WHERE�N�IS�HEL�D�IN�ACCUMB� ‰BNE‡ENTER� ‰RTS� *� *� *� *� *� *œDATEO� DATEO„LDAA†#$0D†DATEO�PRINTS�THE�DATE�STORED�AT�DMON� ‰JSR‡OUTCH…WITH�SLASHES�BETWEEN�THE�DAY� ‰LDAA†#$0A†AND�MONTH�AND�MONTH�AND�YEAR� ‰JSR‡OUTCH� ‰LDAB†#0� ‰LDX‡#DMON� BAK†LDAA†0,X� ‰ADDA†#$30� ‰JSR‡OUTCH� BAKO…INX� ‰INCB� ‰CMPB†#2� ‰BEQ‡SLASH� ‰CMPB†#8� ‰BEQ‡LAST� ‰CMPB†#5� ‰BEQ‡SLASH� ‰BRA‡BAK� SLASH„LDAA†#$2F� ‰JSR‡OUTCH� ‰BRA‡BAKO� LAST…LDAB†#6� ‰LDAA†#$20†SPACE�OVER�6�SPACES� ‰JSR‡OUTCH� ‰DECB� ‰BEQ‡RTRN� ‰BRA‡LAST+1� RTRN…RTS� *� *� *� *� *� *œPLOT� PLOT…LDAB†#0ˆPLOT�OUTPUTS�THE�POSITOIN� ‰CMPB†#51‡OF�THE�THREE�CYCLES�ON� ‰BEQ‡QUIT†A�GRAPH�THRU�THE�TTY� ‰CMPB†PHYPRT†VALID�POSITIONS�ARE� ‰BEQ‡PPRT†0�THRYUGH�50,�AND�EACH� ‰CMPB†EMOPRT„LOOPTHRU�THE�CODE�CHECKS� ‰BEQ‡EPRT†THE�STORED�VALUES�AGAINST� ‰CMPB†INTPRT„THE�CURRENT�TTY�PRINT� ‰BEQ‡IPRT†POSITION.�IF�A�MATCH� ‰CMPB†#25‡OCCURS�THE�PROPER�LETTER� ‰BEQ‡PERPRT„IS�PRINTED,�IF�NOT�A�SPECE� ‰LDAA†#$20†IS�OUTPUT.� ‰JSR‡OUTCH� ‰INCB� ‰BRA‡PLOT+1� *� *� PPRT…LDAA†#$50� ‰JSR‡OUTCH� ‰INCB� ‰BRA‡PLOT+1� IPRT…LDAA†#$49� ‰JSR‡OUTCH� ‰INCB� ‰BRA‡PLOT+1� EPRT…LDAA†#$45� ‰JSR‡OUTCH� ‰INCB� ‰BRA‡PLOT+1� PERPRTƒLDAA†#$2E� ‰JSR‡OUTCH� ‰INCB� ‰BRA‡PLOT+1� QUIT…LDAA†#$0� ‰JSR‡OUTCH� ‰LDAA†#$0� ‰JSR‡OUTCH� ‰JSR‡OUTCH� ‰RTS� *� *� *� *� *� *œRMDR� RMDR…STAA†XKDVSR„RMDR�PROPERLY�FORMATS�ENTRY�OF� ‰LDAA†TOTALH„VARIABVLES�TO�XKDIVD�TO� ‰LDAB†TOTALL„OBTAIN�THE�VALUE�OF�TBE� ‰STAA†XKDVND„REMAINDER�IN�THE� ‰STAB†XKDVND+1‚DIVISION:� ‰JSR‡XKDIVD‡LIFESPAN/DAYS�PER�CYCLE� *œFOR�EACH�OF�THE�3�CYCLES� ‰LDAA†XKDVND„AND�SHIFTS�THE�SCALED� ‰LDAB†XKDSPL„REMAINDER�BEFORE� BITSFTƒCMPB†#0ˆRETURNING�TO�CALLING� ‰BEQ‡OUPUT…ROUTINE� ‰RORA� ‰DECB� ‰BRA‡BITSFT� OUPUT„RTS� *� *� *� *� *� *� *� *� *� *� *œXKDIVD� XKDIVDƒLDAB†#8ˆXKDIVD�IS�A�DIVIDE�ROUTINE� ‰CLR‡XKQUOT„FROM�THE�MOTOROLA� ‰CLR‡XKQUOT+1‚APPLICATIONS�MAINUAL� DVDLPOƒINCB�WHICH�DIVIDES�XKDVND� ‰CMPB†#16‡BY�XKDIVSR�TO� ‰BGT‡DVDERR„PRODUCE�XKQWUOT�AND� ‰ASL‡XKDVSR„XKQUOT+1,�AND�THE� ‰BCC‡DVDLPO„REMAINDER,�WHICH� ‰STAB†XKDSPL„IS�HELD�IN� ‰ROR‡XKDVSR„XKDVND�AFTER� *œCOMPLETION�OF�THE� *œROUUTINE,�SHIFTED� ‰LDAA†XKDVND„LEFT�N�PLACES� DVDLP1ƒCMPA†XKDVSR„WHERE�N�IS�XKDSPL� ‰BCS‡DVNSUB� DVDLP2ƒSEC� ‰ROL‡XKQUOT+1� ‰ROL‡XKQUOT� ‰SUBA†XKDVSR� ‰STAA†XKDVND� ‰BRA‡DVSHFT� DVNSUBƒCLC� ‰ROL‡XKQUOT+1� ‰ROL‡XKQUOT� DVSHFTƒDECB� ‰BEQ‡DVDEND� ‰CLC� ‰ROL‡XKDVND+1� ‰ROL‡XKDVND� ‰0 LDAA†XKDVND� ‰BCS‡DVDLP2� ‰BRA‡DVDLP1� DVDERRƒLDX‡#$FFFF� ‰STX‡XKQUOT� DVDENDƒLDAB†XKDSPL� ‰SUBB†#9� ‰CMPB†#4� ‰BCS‡DVDLP3� ‰SUBB†#4� DVDLP3ƒSTAB†XKDSPL� *� ‰RTS� *� *� *� *ˆTHE�FOLLOWING�ARE�THE�PROMPT�MESSAGES� *ˆTHAT�ARE�OUTPUT�ON�THE�TTY�DURING� *ˆTHE�PROGRAM.� *� ‰ORGˆ2000� INTRODƒFCB‡$0D,$0A� ‰FCC‡25,� ‰FCC‡/BIORHYTHM/� ‰FCB‡$0D,$0A,$0D,$0A� ‰FCC‡/THE�PURPOSE�OF�BIORHYTHM�IS�TO/� ‰FCC‡/�PREDICT�A�PHYSICAL,/� ‰FCB‡$0D,$0A� ‰FCC‡/EMOTIONAL�AND�INTELLECTUAL�PATTERN/� ‰FCC‡/�THAT�INDICATES�YOUR/� ‰FCB‡$0D,$0A� ‰FCC‡/UP�AND�DOWN�DAYS�FOR�ANY�PERIOD/� ‰FCC‡/�OF�TIME.�BIORHYTHM�CAN/� ‰FCB‡$0D,$0A� ‰FCC‡/SHOW�WHICH�DAYS�WERE�GOOD�OR/� INTRO2ƒFCC‡/�BAD�FOR�YOU�BEGINNING�WITH/� ‰FCB‡$0D,$0A� ‰FCC‡/YOUR�BIRTH.�IT�CAN�ALSO�SHOW�/� ‰FCC‡/YOU�WHICH�FUTURE�/� ‰FCB‡$0D,$0A� ‰FCC‡/DAYS�WILL�BE�GOOD�OR�BAD�FOR�YOU.�/� ‰FCB‡$0D,$0A� ‰FCC‡/THESE�PREDICTIONS�ARE�BASED�ON/� ‰FCC‡/�SCIENTIFIC/� ‰FCB‡$0D,$0A� ‰FCC‡/STUDIES�TO�DETERMINE�WHY�ACCIDENTS/� ‰FCC‡/�OCCUR.�IT�WAS�LEARNED/� ‰FCB‡$0D,$0A� �FCC�/THROUGH�THESE�STUDIES�THAT�A/ INTRO3ƒFCC‡/�PHYSICAL�CYCLE�OCCURS�EVERY/� ‰FCB‡$0D,$0A� ‰FCC‡/23�DAYS,�AN�EMOTIONAL�CYCLE/� ‰FCC‡/�OCCURS/� ‰FCC‡/�EVERY�28�DAYS,�AND�AN/� ‰FCB‡$0D,$0A� ‰FCC‡/INTELLECTUAL�CYCLE�OCCURS/� ‰FCC‡/�EVERY�33�DAYS./� *� *� PROMPTƒFCB‡$0D,$0A� ‰FCC‡/DO�YOU�WISH�AN�INTRODUCTION/� ‰FCC‡/�TO�BIORHYTHMS?�TYPE�Y/� ‰FCC‡/�FOR�YES,�OR�N�FOR�NO./� ‰FCB‡$0D,$0A� ‰FCC‡/?�/� *� *� DTEINPƒFCB‡$0D,$0A,$0D,$0A� ‰FCC‡/PLEASE�TYPE�YOUR�BIRTH�DATE/� ‰FCC‡/�USING�THE�FOLLOWING�FORMAT:/� ‰FCB‡$0D,$0A� ‰FCC‡/MM,DD,YY‚EXAMPLE;�JANUARY/� ‰FCC‡/�17,1942/� ‰FCC‡/�=�01,17,42/� ‰FCB‡$0D,$0A� ‰FCC‡/?/� *� *� BEGIN„FCB‡$0D,$0A� ‰FCC‡/AT�WHAT�DATE�ARE�YOU�INTERESTED�/� ‰FCC‡/IN�BEGINNING�BIORHYTHM?/� ‰FCB‡$0D,$0A� ‰FCC‡/?/� *� *� HMDAYSƒFCB‡$0D,$0A� ‰FCC‡/HOW�MANY�DAYS�DO�YOU�WISH�TO/� ‰FCC‡/�HAVE�PLOTTED?/� ‰FCC‡/�(01�THRU�99)/� ‰FCB‡$0D,$0A� ‰FCC‡/?/� *� *� CHART„FCB‡$0D,$0A� �FCC�/PHYSICAL�CYCLE�=�P/ ‰FCB‡$0D,$0A� ‰FCC‡/EMOTIONAL�CYCLE�=�E/� ‰FCB‡$0D,$0A� ‰FCC‡/INTELLECTUAL�CYCLE�=�I/� ‰FCB‡$0D,$0A� *� *� DATI…FCB‡$0D,$0A� ‰FCC‡13,DATE� ‰FCC‡22,DOWN� ‰FCC‡28,CRITICAL� ‰FCC‡5,UP� ‰FCB‡$0D,$0A� ‰FCC‡/Œ/� ‰FCC‡/------------/� ‰FCC‡/------------/� ‰FCC‡/------------/� ‰FCC‡/------------/� ‰FCC‡/--------/� ANOTHRƒFCB‡$0D,$0A� ‰FCC‡/DO�YOU�WISH�ANOTHER�CHART?/� ‰FCB‡$0D,$0A� �END�START ÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅ =€�NAM�TRACE *�REV�1.1�BY�MOTOROLA�MICROSYSTEMS�APRIL�1977 �ORG�$100 �SPC�2 TRACE�STA�A�LABEL3�*SAV�AR �STA�B�LABEL4�*SAV�BR �TPA �STA�A�LABEL5�*SAV�CCR �STX�LABEL6�*SAV�XR �TSX �LDX�0,X�*GET�PC �STX�LABEL1�*TEMP�PC �LDX�#LABEL1�*PC�TO�XR �JSR�$E0C8�*PRINT�PC �JSR�$E0CA�*PRINT�AR �JSR�$E0CA�*PRINT�BR �LDA�A�#$0D�*CR �JSR�$E1D1 �LDA�A�#$A�*LF �JSR�$E1D1 �LDA�A�LABEL5�*RESTORE�CCR�TAP �LDA�B�LABEL4�*RESTORE�BR �LDX�LABEL6�*RESTORE�XR �LDA�A�LABEL3�*RESTORE�AR �PSHA�*SAVE�AR�ON�STACK �LDAA�LABEL5� �TAP�*RESTORE�CCR �PULA�*RESTORE�AR �RTS LABEL1�RMB�1 LABEL2�RMB�1 LABEL3�RMB�1 LABEL4�RMB�1 LABEL5�RMB�1 LABEL6�RMB�1 LABEL7�RMB�1 �SPC�5 �OR1 G�$200 * *TEST�PROGRAM�FOR�TRACE * �LDX�#$ABCD�*LOAD�XR�WITH�ABCD �LDA�A�#$FF�*LOAD�AR�WITH�FF �LDA�B�#00�*LOAD�BR�WITH�00 �JSR�TRACE�*JMP�TO�TRACE �LDA�A�#00�*LOAD�AR�WITH�00 �LDA�B�#$FF�*LOAD�BR�WITH�FF �JSR�TRACE�*JMP�TO�TRACE �SWI�*DISPLAY�REGISTERS�AFTER�TRACE �END ÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅ}@5`€³‡NAM‚TSTFPP * * *†24�BIT�REENTRANT�FLOATING�POINT�PACKAGE * *†WITH�AUXILIARY�CONTROL/TEST�PROGRAM * * *†PROGRAMMER: * *†DR.�BENTON�D.�WEATHERS *†SANGAMO�ELECTRIC�COMPANY *†BOX‚3347 *†SPRINGFIELD,�ILLINOIS�62714 * *†217/544-6411�EXT�591 * ‡ORG‚$0”DEFINITION�OF�MEMORY�ADDRESSES�IN�RAM A1…RMB‚3•RESERVE�3�BYTES�OF�RAM A2…RMB‚3•RESERVE�THREE�BYTES�OF�RAM PSH4T1�RMB‚2•WORKING�LOCATION�FOR�PSH4 PSH4T2�RMB‚2•WORKING�LOCATION�FOR�PSH4 L1…RMB‚1‹LOOP�COUNTER L2…RMB‚1‹LOOP�COUNTER A3…RMB‚3‹HOLDS�MAIN�COPY�OF�ARG1 ROUADD�RMB‚2‹HOLDS�SUBROUTINE�ADDRESS * INCHƒEQU‚$FA8B‘SUBROUTINE�ADDRESS OUTCH‚EQU‚$F9DC‘SUBROUTINE�ADDRESS ‡PAGE * * *†MAIN�CONTROL�PROGRAM�FOR�TESTING *ˆTHE�FLOATING�POINT�PACKAGE * * ‡ORG‚$8500 ‡LDS‚#$FF’INITIALIZE�STACK�POINTER * *†MAIN�TESTING�LOOP * LOOPƒJSR‚QUERY‘NEWLINE,�QM�ON�TTY ‡LDAA�#'O“OUTPUT�'O' ‡JSR‚OUTCH ‡LDAA�#'C“OUTPUT�'C' ‡JSR‚OUTCH ‡JSR‚INCH’GET�OPERATION�CODE * *†SEVEN�WAY�BRANCH * ‡CMPA�#'1“TEST�FOR�'1' ‡BEQ‚ADD ‡CMPA�#'2“TEST�FOR�'2' ‡BEQ‚SUB ‡CMPA�#'3“TEST�FOR�'3' ‡BEQ‚MUL ‡CMPA�#'4“TEST�FOR�'4' ‡BEQ‚DIV ‡CMPA�#'5“TEST�FOR�'5' ‡BEQ‚FLOAT ‡CMPA�#'6“TEST�FOR�'6' ‡BEQ‚IFIX ‡CMPA�#'7“TEST�FOR�'7' ‡BEQ‚NEGATE ‡CMPA�#'8‰TEST�FOR�'8' ‡BEQ‚CLEAR * ‡LDAA�#'X“INVALID�OP-CODE,�OUTPUT�'X' ‡JSR‚OUTCH ‡BRA‚LOOP’GO�GET�NEXT�OP-CODE * ADD„JSR‚SETUP2 ‡LDX‚#FPPADD…LOAD�ADDRESS�INTO�INDEX�REG ‡BRA‚PRINT * SUB„JSR‚SETUP2 ‡LDX‚#FPPSUB…LOAD�ADDRESS ‡BRA‚PRINT * MUL„JSR‚SETUP2 ‡LDX‚#FPPMUL ‡BRA‚PRINT * DIV„JSR‚SETUP2 ‡LDX‚#FPPDIV ‡BRA‚PRINT * FLOAT‚JSR‚QUERY ‡LDAA�#A2 ‡JSR‚READ3B ‡LDAA�#A1 ‡LDAB�#A2 ‡JSR‚FPPFLT ‡BRA‚PRIN1 * IFIXƒJSR‚SETUP1 ‡JSR‚FPPFIX�FLOATINGPOINT�TO�INTEGER ‡LDAA�#'ŠOUTPUT�BLANK�CHARACTER ‡JSR‚OUTCH ‡LDAA�#A1 ‡JSR‚WRIT3B ‡JMP‚LOOP * NEGATE�JSR‚SETUP1 ‡JSR‚FPPNEG�FLOATING�POINT�NEGATE ‡BRA‚PRIN1 * CLEAR‚LDAA�#A1 ‡JSR‚FPPCLR ‡BRA‚PRIN1 * *†EXECUTION�REPETITION�LOOP PRINT‚STX‚ROUADD†SAVE�THE�SUBROUTINE�ADDRESS ‡LDAA�#A3 ‡LDAB�#A1 ‡JSR‚FPPCPY†A3=A1 * *†INITIALIZE�OUTSIDE�LOOP * ‡LDAA�#2 ‡STAA�L1 LOOP1‚DEC‚L1ŠSTART�OF�OUTSIDE�LOOP ‡BNE‚LOOPA ‡BRA‚PRIN1‡GET�OUT�OF�EXECUTION�LOOP * *†INITIALIZE�INNER�LOOP * LOOPA‚LDAA�#2 ‡STAA�L2 LOOP2‚DEC‚L2ŠDECREMENT�INNER�LOOP�COUNTER ‡BNE‚LOOPB ‡BRA‚LOOP1‡INNER�LOOP�DONE�SO�BACK�TO�OUTER�LOOP * *†EXECUTION�SECTION * LOOPB‚LDAA�#A1 ‡LDAB�#A3 ‡JSR‚FPPCPY†A1=A3 ‡LDAA�#A1 ‡LDAB�#A2 ‡LDX‚ROUADD†SET�UP�ROUTINE�ADDRESS ‡JSR‚0,X ‡BRA‚LOOP2 * *†PRINT�RESULTS * PRIN1‚JSR‚NEWLIN ‡LDAA�#A1“SET�UP�ADDRESS�OF�RESULTS ‡JSR‚WRIT3B�PRINT�RESULTS ‡LDAA�#' ‡JS2 R‚OUTCH ‡LDAA�#A1 ‡JSR‚FPST’PRINT�RESULT�IN�DECIMAL�FORMAT ‡JMP‚LOOP’GO�GET�NEXT�OP-CODE ‡PAGE * * *†SETUP1,�SETUP2 * * SETUP1�JSR‚QUERY ‡LDAA�#A2 ‡JSR‚STFP ‡LDAA�#A2 ‡JSR‚WRIT3B ‡BRA‚SUREG‘SET�UP�POINTERS�IN�REG'S * SETUP2�JSR‚QUERY‘NEWLINE,�QM�ON�TTY ‡LDAA�#A1“ARG1�TO�A1 ‡JSR‚STFP ‡LDAA�#A1 ‡JSR‚WRIT3B ‡JSR‚QUERY ‡LDAA�#A2“ARG2�TO�A2 ‡JSR‚STFP ‡LDAA�#A2 ‡JSR‚WRIT3B SUREG‚LDAA�#A1“SET�UP�ADDRESS�IN�A�REG ‡LDAB�#A2“SET�UP�ADDRESS�IN�B�REG ‡RTS˜RETURN * * *†READ�3�CONSECUTIVE�BYTES�(6�CHARACTERS) *†ON�ENTRY�THE�STORAGE�ADDRESS�IS�IN�THE�A�REG *†CHARACTER�TO�HEX�CONVERSION�IS�PERFORMED�AND�THE *†BYTES�PUT�AWAY. * READ3B�PSHA—PUT�THE�MEMORY�ADDRESS�ON�THE�STACK ‡CLRA ‡PSHA * *†SET�UP�THE�OUTER�LOOP�TO�GO�FROM�3�TO�1 * ‡LDAA�#3 ‡PSHA READ31�LDAA�#2”SET�UP�INNER�LOOP�TO�GO�TWICE ‡PSHA ‡CLRB—USE�B�REG�TO�MERGE�HEX�CHARACTERS READ32�JSR‚INCH’GET�CHARACTER�FROM�TTY ‡CMPA�#'0“IS�CHR�CODE�LT�ASC�'0' ‡BLT‚READ33�YES ‡CMPA�#'9“IS�CHR�CODE�GT�ASC�'9' ‡BGT‚READ33�YES ‡SUBA�#'0“SUBTRACT�CODE�FOR�ASC�'0' ‡BRA‚READ34�GO�TO�MERGE�SECTION READ33�CMPA�#'A“IS�CHAR�CODE�LT�ASC�'A' ‡BLT‚READ35�YES,�INVALID�CHARACTER ‡CMPA�#'F“IS�CHAR�CODE�GT�ASC�'F' ‡BGT‚READ35�YES,�INVALID�CODE ‡SUBA�#'A“SUBTRACT�CODE�FOR�ASC�'A' ‡ADDA�#10“ADD�10 READ34�ASLB—MERGE�A�REG�WITH�B�REG ‡ASLB ‡ASLB ‡ASLB ‡ABA˜MERGE ‡TAB˜PUT�RESULT�IN�B�REG ‡TSX˜INDEX�REG�TO�TOP�OF�STACK ‡DEC‚0,X“DECREMENT�INNER�LOOP�COUNTER ‡TST�0,X”IS�INNER�LOOP�CNTR�POS? ‡BGT‚READ32�YES,�CONTINUE�LOOPING * *†PUT�THE�CHARACTER�AWAY * ‡LDX‚2,X“GET�ADDRESS�OFF�THE�STACK ‡STAB�0,X“STORE�MERGED�RESULT ‡TSX˜INDES�TO�TOP�OF�STACK ‡INC‚3,X“INC�LSB�OF�MEMORY�ADDRESS ‡INS˜REMOVE�INNER�LOOP�CNTR�FRM�STACK ‡DEC‚1,X‰DECREMENT�OUTER�LOOP�COUNTER ‡TST‚1,X‰IS�OUTER�LOOP�CNTR�POSITIVE ‡BGT‚READ31�YES,�GO�GET�NEXT�BYTE ‡INS˜CLEAN�UP�STACK ‡INS ‡INS ‡RTS˜RETURN * *†INVALID�CHARACTER * READ35�LDAA�#'X“OUTPUT�AN�'X'�CHARACTER ‡JSR‚OUTCH ‡BRA‚READ32�REREAD�CHARACTER * * *†WRITE�THREE�CONSECUTIVE�BYTES * * WRIT3B�PSHA—PUSH�DATA�POINTER�ONTO�STACK ‡CLRA ‡PSHA ‡LDAA�#3”SET�OUTER�LOOP�TO�GO�3�TIMES ‡PSHA ‡DES˜ALLOCATE�SPACE�ON�STACK�FOR�L2�CNTR WRIT31�TSX˜INDEX�TO�TOP�OF�STACK ‡LDX‚2,X“GET�DATA�POINTER ‡LDAB�0,X“DATA�TO�B�REG ‡TSX˜INDEX�TO�TOP�OF�STACK ‡INC‚3,X“INCREMENT�BYTE�PONNTER ‡LDAA�#1”INNER�LOOP�INITIALIZATION ‡STAA�0,X * WRIT32�TBA˜UNPACK�FOUR�BITS,�B�REG�TO�A�REG ‡TST‚0,X“IS�INNER�LOOP�EQUAL�TO�ZERO? ‡BEQ‚WRIT35�YES,�SKIP�SHIFT�OPERATION ‡LSRA—LOGIC�SHIFT�RIGHT�FOUR�TIMES ‡LSRA ‡LSRA ‡LSRA WRIT35�ANDA�#15“MASK�OUT�4�MOST�SIGNIFICANT�BITS *†UNPACKING�COMPLETE ‡CMPA�#10“IS�4-BIT�FIELD�LT�10? ‡BLT‚WRIT33�YES(DIGIT�0�-�9) ‡SUBA�#10“NO�(LETTER�A�-�F) ‡ADDA�#'A“ADD�ASCII�'A'�CODE�TO�RESULT ‡BRA‚WRIT34�GO�TO�OUTPUT�SECTION WRIT33�ADDA�#'0“ADD�ASCII�'0'�CODE�TO�RESULT WRIT34�JSR‚OUTCH‘OUTPUT�CHARACTER ‡TSX˜INDEX�TO�TOP�OF�STACK ‡DEC‚0,X“INNER�LOOP�TEST ‡TST‚0,X“IS�INNR�LOOP�CNTR�GE�0? ‡BGE‚WRIT32�YES,�CONTINUE�WITH�LOOP ‡DEC‚1,X“OUTER�LOOP�TEST ‡TST‚1,X“IS�OUTER�LOOP�CNTR�GT�0? ‡BGT‚WRIT31�YES,�GET�NEXT�BYTE ‡INS˜CLEAN�UP�STACK ‡INS ‡INS ‡INS ‡RTS˜RETURN * * *†QUERY�SUBROUTINE * * QUERY‚JSR‚NEWLIN�CAUSE�TTY�TO�SPACE�TO�NEW�LINE ‡LDAA�#'?“OUTPUT�QUESTION�MARK ‡JSR‚OUTCH ‡RTS * * *†NEWLINE * * NEWLIN�LDAA�#13“OUTPUT�CARRIAGE�RETURN ‡JSR‚OUTCH ‡LDAA�#10“OUTPUT�LINE�FEED ‡JSR‚OUTCH ‡RTS˜RETURN ‡PAGE * * *†STRING�TO�FLOATING�POINT�ROUTINE * * STFPƒPSHA—PUSH�DATA�ADDRESS�O3 NTO�STACK ‡CLRA ‡PSHA ‡PSHA—STFPDP=0�(DEC�PNT�FLAG) ‡PSHA—STFPSG=0�(NEGATIVE�SIGN�FLAG) ‡LDX‚#0 ‡JSR‚PSH4’STFPA1=0.0 ‡LDX‚#$4000 ‡LDAA�#1 ‡JSR‚PSH4’STFPA2=1.0 ‡JSR‚PSH4’STFPA3=??? ‡LDX‚#$5000 ‡LDAA�#4 ‡JSR‚PSH4’STFPA4=10.0 ‡TSX˜INDEX�POINTS�TO�TOP�OF�STACK * *†STACK�OFFSET�DEFINITIONS * STFPA4�EQU‚1 STFPA3�EQU‚5 STFPA2�EQU‚9 STFPA1�EQU‚13 STFPSG�EQU‚16”NEGATIVE�SIGN�FLAG STFPDP�EQU‚17”DECIMAL�POINT�FLAG STFPRS�EQU‚18”RESULT�ADDRESS * *†CHARACTER�PROCESSING�LOOP * STFP1‚JSR‚INCH’GET�A�CHARACTER�INTO�A�REG ‡CMPA�#$A“LINE�FEED�CHARACTER ‡BEQ‚STFP4‘YES ‡CMPA�#'-“MINUS�SIGN ‡BNE‚STFP2‘NO ‡INC‚STFPSG,XŽYES,�SET�NEGATIVE�SIGN�FLAG ‡BRA‚STFP1 STFP2‚CMPA�#'.“DECIMAL�POINT ‡BNE‚STFP3‘NO ‡INC‚STFPDP,XŽSET�DECIMAL�POINT�FLAG ‡BRA‚STFP1 STFP3‚CMPA�#$40ˆ$40�IS�CODE�FOR�10 ‡BPL‚STFP1 ‡CMPA�#'0 ‡BMI‚STFP1 * *†DIGIT�DETECTED * ‡SUBA�#'0“SUBTRACT�CODE�FOR�ZERO ‡STAA�STFPA3+1,XŒSTORE�INTEGER�IN�A3 ‡CLR‚STFPA3,X ‡LDAA�STFPA3-1,X ‡TAB ‡JSR‚FPPFLT�A3=FLOAT(A3) ‡TSX˜RESTORE�INDEX ‡LDAA�STFPA1-1,X ‡LDAB�STFPA4-1,X ‡JSR‚FPPMUL�A1=A1*10.0 ‡TSX ‡LDAA�STFPA1-1,X ‡LDAB�STFPA3-1,X ‡JSR‚FPPADD�A1=A1+A3 ‡TSX ‡TST‚STFPDP,XŽIS�DECIMAL�POINT�FLAG�SET ‡BLE‚STFP1‘NO ‡LDAA�STFPA2-1,XŒYES,�CALCULATE�PWR�OF�10. ‡LDAB�STFPA4-1,X ‡JSR‚FPPMUL�A2=A2*10. ‡TSX ‡BRA‚STFP1 * *†CLEANUP * STFP4‚LDAA�STFPA1-1,X ‡LDAB�STFPA2-1,X ‡JSR‚FPPDIV�A1=A1/A2 ‡TSX ‡TST‚STFPSG,X ‡BEQ‚STFP5 ‡LDAA�STFPA1-1,XŒSIGN�FLAG�SET ‡TAB ‡JSR‚FPPNEG�A1=-A1 ‡TSX STFP5‚LDAA�STFPA1,XŽMOVE�TO�RESULT�AREA ‡LDAB�STFPA1+1,X ‡LDX‚STFPRS,X ‡STAA�0,X ‡STAB�1,X ‡TSX ‡LDAA�STFPA1+2,X ‡LDX‚STFPRS,X ‡STAA�2,X ‡LDAA�#20 STFP6‚INS ‡DECA ‡BGT‚STFP6‘LOOP�TO�CLEAN�UP�THE�STACK ‡RTS ‡PAGE * * *†FLOATING�POINT�TO�STRING�CONVERSION�ROUTINE * * FPSTƒPSHA—VALUE�ADDRESS�ONTO�STACK ‡CLRA ‡PSHA ‡TSX˜INDEX�TO�TOP�OF�STACK ‡LDAA�#5 ‡PSHA�SD=5 ‡PSHA�DP=5 ‡LDX‚0,X“GET�VALUE�ONTO�THE�STACK ‡LDAA�2,X“EXPONENT�INTO�THE�A�REG ‡LDX‚0,X“MANTISSA�INTO�THE�INDEX�REG ‡JSR‚PSH4’A1=INPUT�VALUE ‡LDX‚#$5000 ‡LDAA�#4 ‡JSR‚PSH4’A2=10. ‡LDX‚#$4E20 ‡LDAA�#14 ‡JSR‚PSH4ˆA3=10000. ‡LDX‚#$61A8 ‡LDAA�#$11 ‡JSR‚PSH4ˆA4=100000. ‡JSR‚PSH4’A5=SCRATCH ‡TSXŽRESTORE�INDEX * *†STACK�OFFSET�DEFINITIONS * FPSTA5�EQU‚1 FPSTA4�EQU‚5 FPSTA3�EQU‚9 FPSTA2�EQU‚13 FPSTA1�EQU‚17 FPSTDP�EQU‚20 FPSTSD�EQU‚21 FPSTVL�EQU‚22 * ‡TST‚FPSTA1,XŽTEST�INPUT�VALUE ‡BEQ‚FPST1‘BRANCH�IF�ZERO ‡BMI‚FPST2‘BRANCH�IF�NEGATIVE ‡BRA‚FPST3‘NUMBER�IS�READY�TO�BE�SCALED * *†ZERO�VALUE * FPST1‚LDAA�#'0“PRINT�A�SINGLE�ZERO ‡JSR‚OUTCH ‡JMP‚FPST10�GO�CLEAN�UP�STACK * *†NEGATIVE�NUMBER * FPST2‚LDAA�#'-“PRINT�MINUS�SIGN ‡JSR‚OUTCH ‡LDAA�FPSTA1-1,X ‡TAB ‡JSR‚FPPNEG�A1=-A1 ‡TSX * *†NORMALIZING�LOOP * FPST3‚LDAA�FPSTA1-1,X ‡LDAB�FPSTA3-1,X ‡JSR‚FPPCMP�TEST(A1-10000.) ‡TSX˜RESET�INDEX ‡BPL‚FPST4‘BRANCH�IF�ZERO�OR�POSITIVE ‡LDAA�FPSTA1-1,X ‡LDAB�FPSTA2-1,X ‡JSR‚FPPMUL�A1=A1*10. ‡TSX ‡DEC‚FPSTDP,XŽDP=DP-1 ‡BRA‚FPST3‘CONTINUE�LOOP * FPST4‚LDAA�FPSTA1-1,X ‡LDAB�FPSTA4-1,X ‡JSR‚FPPCMP�TEST�(A1-100000.) ‡TSX ‡BMI‚FPST5‘BRANCH�IF�NEGATIVE ‡LDAA�FPSTA1-1,X ‡LDAB�FPSTA2-1,X ‡JSR‚FPPDIV�A1=A1/10. ‡TSX ‡INC‚FPSTDP,XŽDP=DP+1 ‡BRA‚FPST4‘CONTINUE�LOOP * *†TEST�TO�SEE�IF�DP�AND�LEADING�ZEROS�ARE�NEEDED * FPST5‚TST‚FPSTDP,XŽIS�DP�CNT�NEGATIVE ‡BPL‚FPST7‘NO ‡LDAA�#'.“OUTPUT�DECIMAL�POINT ‡JSR‚OUTCH FPST6‚LDAA�#'0“OUTPUT�LEADING�ZEROS ‡JSR‚OUTCH ‡INC‚FPSTDP,X ‡BMI‚FPST6 ‡LDAA�#$FF’RESET�DP�CNT�TO�NEGATIVE�VALUE ‡STAA�FPSTDP,X * *†LOOP�TO�PRINT�FIVE�SIGNIFICANT�DI4 GITS * FPST7‚DEC‚FPSTSD,XŽSD=SD-1 ‡BMI‚FPST9‘GET�OUT�IF�5�SD�HAVE�GONE ‡TST‚FPSTDP,XŽSHOULD�DECIMAL�BE�OUTPUT? ‡BNE‚FPST8‘NO ‡LDAA�#'.“OUTPUT�DECIMAL�POINT ‡JSR‚OUTCH FPST8‚DEC‚FPSTDP,XŽDP=DP-1 ‡LDAA�FPSTA5-1,XŒDATA�SINK ‡LDAB�FPSTA1-1,XŒDATA�SOURCE ‡JSR‚FPPCPY�A5=A1 ‡TSX ‡LDAA�FPSTA5-1,X ‡LDAB�FPSTA3-1,X ‡JSR‚FPPDIV�A5=A5/A3 ‡TSX ‡LDAA�FPSTA5-1,X ‡TAB ‡JSR‚FPPFIX�A5=IFIX(A5) ‡TSX ‡LDAA�FPSTA5+1,XŒOUTPUT�DIGIT ‡ADDA�#'0“ADD�CHARACTER�CODE�FOR�ZERO ‡JSR‚OUTCH ‡LDAA�FPSTA5-1,X ‡TAB ‡JSR‚FPPFLT�A5=FLOAT(A5) ‡TSX ‡LDAA�FPSTA5-1,X ‡LDAB�FPSTA3-1,X ‡JSR‚FPPMUL�A5=A5*A3 ‡TSX ‡LDAA�FPSTA1-1,X ‡LDAB�FPSTA5-1,X ‡JSR‚FPPSUB�A1=A1-A5 ‡TSX ‡LDAA�FPSTA3-1,X ‡LDAB�FPSTA2-1,X ‡JSR‚FPPDIV�A3=A3/10. ‡TSX ‡JMP‚FPST7‘CONTINUE�LOOP * *†OUTPUT�TRAILING�ZEROS,�IF�NECESSARY * FPST9‚TST‚FPSTDP,XŽARE�TRAILING�ZEROS�REQUIRED? ‡BLE‚FPST10�NO ‡DEC‚FPSTDP,X ‡LDAA�#'0“OUTPUT�ZERO ‡JSR‚OUTCH ‡BRA‚FPST9‘CONTINUE�LOOP * *†CLEANUP�SECTION * FPST10�LDAA�#24 FPST11�INS˜INCREMENT�STACK�POINTER ‡DECA—DECREMENT�COUNT ‡BGT‚FPST11�CONTINUE�WHILE�COUNT�IS�POSITIVE ‡RTS˜RETURN�TO�CALL ‡PAGE * *†ROUTINE�TO�PUSH�FOUR�BYTES�ON�THE�STACK.‚NOT�REENTRANT. *†PUSHES�EXPONENT�(FROM�A�REG),�LS�BYTE,�MS�BYTE�OF�MANTISSA *†FOLLOWED�BY�A�POINTER�TO�MS�BYTE�OF�THE�MANTISSA * PSH4ƒSTX‚PSH4T1�SAVE�THE�MANTISSA ‡TSX˜INDEX�TO�TOP�OF�STACK ‡LDX‚0,X“RETURN�ADDRESS�TO�INDEX ‡STX‚PSH4T2�SAVE�THE�RETURN�ADDRESS ‡INS˜BACK�UP�THE�STACK ‡INS ‡PSHA—PUSH�EXPONENT�ONTO�STACK ‡LDAA�PSH4T1+1ŽLS�BYTE�OF�MANTISSA ‡PSHA—ONTO�THE�STACK ‡LDAA�PSH4T1�MS�BYTE�OF�MANTISSA�ONTO�THE�STACK ‡PSHA ‡TSX˜INDEX�TO�TOP�OF�STACK ‡STX‚PSH4T1�TRANSFER�POINTER�TO�MEMORY ‡LDAA�PSH4T1+1ŽGET�LS�BYTE�OF�POINTER ‡PSHA—PUSH�ONTO�STACK ‡LDX‚PSH4T2�GET�THE�RETURN�ADDRESS ‡JMP‚0,X“RETURN�TO�CALL ‡PAGE * * *†FLOATING�POINT�COMPARE * *†THIS�PROGRAM�IS�NOT�REENTRANT.‚TO�MAKE�IT�REENTRANT,�THE *†INTERRUPT�SYSTEM�MUST�BE�DISABLED�WHEN�THE�MEMORY�ADDRESS *†PSH4T1�IS�BEING�USED. * FPPCMP�PSHA—COPY�FIRST�ARGUMENT�ONTO�STACK ‡CLRA ‡PSHA ‡TSX ‡LDX‚0,X ‡LDAA�2,X ‡PSHA ‡LDAA�1,X ‡PSHA ‡LDAA�0,X ‡PSHA ‡TSX ‡STX‚PSH4T1�INDEX�TO�SCRATCH�MEMORY ‡LDAA�PSH4T1+1ŽGET�8�BIT�ADDRESS�BACK�TO�A�REG *†B�REG�SET�UP�BY�CALLING�PROGRAM,�AND�NOT�DISTURBED ‡JSR‚FPPSUB�DESTRUCTIVE�SUBTRACT ‡TSX ‡LDAA�0,X“MSB�OF�MANTISSA�TO�A�REG ‡INS˜CLEAN�UP�STACK ‡INS ‡INS ‡INS ‡INS ‡TSTA—SET�STATUS�BITS�FOR�RESULT ‡RTS˜RETURN ‡PAGE * * *†COPY�FLOATING�POINT�WORD * * FPPCPY�PSHB—SOURCE�ADDRESS�ONTO�STACK ‡CLRB ‡PSHB ‡PSHA—PUSH�SINK�ADDRESS�ONTO�STACK ‡PSHB ‡TSX ‡LDX‚2,X“SOURCE�ADDR�INTO�X ‡LDAA�0,X“MANTIXSA�INTO�A�AND�B�REG ‡LDAB�1,X ‡TSX˜NOW,�TRANSMIT�MANTISSA ‡LDX‚0,X ‡STAA�0,X ‡STAB�1,X ‡TSX˜NOW�GET�EXPONENT ‡LDX‚2,X ‡LDAA�2,X ‡TSX ‡LDX‚0,X ‡STAA�2,X ‡INS ‡INS ‡INS ‡INS ‡RTS˜RETURN�TO�CALL ‡PAGE * *†FLOATING�POINT�NUMBER�CONSISTS�OF�3�CONSECUTIVE�BYTES *ˆBYTE�0�-�MS�BYTE�OF�16�BIT�2'S�COMPLEMENT�MANTISSA *ˆBYTE�1�-�LS�BYTE�OF�MANTISSA *ˆBYTE�2�-�8�BIT�2'S�COMPLEMENT�BINARY�EXPONENT * * * *†FLOATING�POINT�SUBTRACT * * FPPSUB�JSR‚FPPASU�SET�UP�ARGS ‡TSX˜SET�INDEX�TO�TOP�OF�STACK ‡INX˜SET�INDEX�TO�ARG2 ‡INX ‡INX ‡INX ‡INX ‡INX ‡JSR‚FPPNE1�NEGATE�ARGUMENT�2 ‡BRA‚FPPAD0 * * *†BASIC�NEGATION�ROUTINE * * FPPNE1�PSHA—SAVE�A�REG ‡PSHB—SAVE�B�REG ‡LDAA�0,X“MANTISSA�TO�A�AND�B�REG'X ‡LDAB�1,X ‡COMA—TAKE�TWO'S�COMPLEMENT ‡NEGB ‡BCS‚FPPNE2 ‡INCA FPPNE2�CMPA�#$80’CHECK�FOR�SPECIAL�CASE�$8000 ‡BNE‚FPPNE3 ‡CMPB�#$00 ‡BNE‚FPPNE3 5 ‡CLC˜SPECIAL�CASE�FOUND,�CLEAR�CARRY ‡RORA—SHIFT�MANTISSA�RIGHT ‡RORB ‡INC‚2,X“INCREMENT�EXPONENT FPPNE3�STAA�0,X“STORE�RESULTS ‡STAB�1,X ‡PULB—RESTORE�B�REG ‡PULA—RESTORE�A�REG ‡RTS˜RETURN ‡PAGE * * *†SUBROUTINE�FOR�ROUNDING,�AND�FOR�OVERFLOW�NORMALIZATION * * *†ON�ENTRY,�A�NON-ZERO�B�REG�MEANS�ROUNDING�IS�REQUIRED * FPPRND�TSTB�IS�ROUNDING�REQUIRED? ‡BEQ‚FPPRN9†NO,�SO�RETURN FPPRN1�TST‚0,X‰YES,�IS�NUMBER�POSIBIVE�OR�NEGATIVE? ‡BPL‚FPPRN2†NUMBER�IS�POSITIVE�OR�ZERO ‡TST‚1,X‰NUMBER�IS�NEGATIVE,�IS�LSB�ZERO? ‡BEQ‚FPPRN3†YES ‡DEC‚1,X‰NO�(NO�BORROW�GENERATED) ‡RTSŽRETURN FPPRN3�DEC‚1,X‰BORROW�WILL�BE�GENERATED ‡DEC‚0,X‰SO�DECREMENT�MSB�ALSO ‡BRA‚FPPRN4†GO�CHECK�FOR�OVERFLOW FPPRN2�INC‚1,X‰NUMBER�IS�POSITIVE�SO�ROUND�UP ‡BNE‚FPPRN9†GET�OUT�SINCE�THERE�IS�NO�CARRY ‡INC‚0,X‰CARRY�SET,�SO�INCRMT�MSB FPPRN4�BVC‚FPPRN9†CHK�FOR�OVFLW,�GET�OUT�IF�CLEAR * *†OVERFLOW�HANDLING�ENTRY�POINT * FPPOVF�INC‚2,X‰INCREMENT�EXPONENT ‡TST‚0,X‰POS�OR�NEG�OVFLW,�CARRY=0 ‡BMI‚FPPRN5†BRANCH�FOR�POSITIVE�OVERFLOW ‡SECŽNEGATIVE�OVERFLOW�SO�SET�CARRY FPPRN5�ROR‚0,X‰ROTATE�RIGHT�MSB�OF�MANTISSA ‡ROR‚1,X‰ROTATE�RIGHT�LSB�OF�MANTISSA ‡BCS‚FPPRN1†SEE�IF�FURTHER�ROUNDING�REQUIRED FPPRN9�RTSŽRETURN�TO�CALL ‡PAGE * * *†FLOATING�POINT�ADDITION * * FPPADD�JSR‚FPPASU�SETUP�ARGUMENTS�ON�STACK FPPAD0�TSX‚SET�INDEX�TO�TOP�OF�STACK ‡TST‚FPPAR2,XŽIS�ARG2�ZERO? ‡BEQ‚FPPMO0�YES,�RETURN�ARG1 ‡TST‚FPPAR1,XŽNO,�IS�ARG1�ZERO ‡BEQ‚FPPRT2�YES,�RETURN�ARG2 ‡LDAA�FPPAR1+2,XŒFORM�DIFFERENCE�OF�EXPONENTS ‡SUBA�FPPAR2+2,X ‡STAA�FPPEXD,XŽPUT�IT�ON�THE�STACK ‡CMPA�#15“IS�DIFF�GT�15? ‡BGT‚FPPMO0�YES,�RETURN�ARG1 ‡CMPA�#0-15‘NO,�IS�DIFF�LT�-15? ‡BLT‚FPPRT2�YES,�RETURN�ARG2 ‡TSTA—NO,�IS�ARG2�GT�ARG1? ‡BGT‚FPPAD1†SET�INDEX�TO�ARG2�ON�STACK ‡BEQ‚FPPAD2�EXPONENTS�ARE�EQUAL ‡INX ‡INX ‡INX ‡INX ‡INX ‡NEGA FPPAD1�INX˜ADJUST�INDEX�TO�ARGUMENT�TO�BE�SHIFTED ‡INX ‡INX ‡INX ‡INX ‡INX ‡BRA‚FPPSFT�SHIFT�SMALLER�ARGUMENT FPPAD2�TSX˜RESTORE�INDEX�TO�TOP�OF�STACK * *†ADDITION�OF�MANTISSAS * ‡LDAA�FPPAR1+2,X ‡STAA�FPPRES+2,XŒSTORE�THE�EXPONENT ‡LDAA�FPPAR1+1,X ‡ADDA�FPPAR2+1,X ‡STAA�FPPRES+1,XŒSTORE�LSB�OF�MANTISSA ‡LDAB�FPPAR1,X„ADD�MSB�OF�MANTISSAS,�USE�B�REG ‡ADCB�FPPAR2,X ‡TPAŽSAVE�V�IN�TH�A�REG ‡STAB�FPPRES,X„STORE�THE�RESULT ‡TAPŽRESTORE�THE�V�BIT ‡BVC‚FPPNOR†NORMALIZE�IF�NO�OVERFLOW ‡INXŽSET�INDEX�TO�RESULT ‡INX ‡INX ‡JSR‚FPPOVF†GO�TO�OVERFLOW-ROUNDING�ROUTINE ‡TSXŽRESTORE�INDEX�REG ‡BRA‚FPPNOR†GO�TO�NORMALIZATION�ROUTINE * *†RETURN�ARGUMENT�2�AS�RESULT * FPPRT2�LDAA�FPPAR2,XŽMOVE�3�BYTES�TO�FPPRES�ON�STACK ‡STAA�FPPRES,X ‡LDAA�FPPAR2+1,X ‡STAA�FPPRES+1,X ‡LDAA�FPPAR2+2,X ‡STAA�FPPRES+2,X ‡BRA‚FPPMOV�MOVE�RESULT�TO�ARG1�MEMORY�LOCATION * *†ROUTINE�TO�SHIFT�MANTISSA�RIGHT�AND�ADJUST�EXPONENT * *†A�REGISTER�CONTAINS�SHIFT�COUNT,�AND�INDEX�POINTS�TO�QUANTITY *ˆTO�BE�ADJUSTED * FPPSFT�CLRB�SET�B�TO�INDICATE�NO�ROUNDING FPPSF1�TSTA�SEE�IF�FURTHER�SHIFTING�REQUIRED ‡BEQ‚FPPSF2†NONE�REQUIRED,�SO�GO�TO�ROUNDING�SECTION ‡DECA—DECREMENT�COUNT ‡INC‚2,X“INCREMENT�EXPONENT ‡ASR‚0,X“ARITH�SHIFT�RIGH�MSB�OF�MANTISSA ‡ROR‚1,X“ROTATE�RIGHT�LSB�OF�MANTISSA ‡BCC‚FPPSFT†SET�B�REG�ACCORDING�TO�STATE�OF�CARRY�BIT ‡LDAB�#1 ‡BRA‚FPPSF1†CONTINUE�LOOP FPPSF2�JSR‚FPPRND†SEE�IF�ROUNDING�REQUIRED ‡BRA‚FPPAD2†GET�OUT�OF�THIS�ROUTINE * FPPMO0�BRA‚FPPMO1�DUMMY�TO�EXTEND�BRANCHING�RANGE * ‡PAGE * *†NORMALIZATION�ROUTINE�(SHIFT�MANTISSA�LEFT�UNTIL�TWO�MS *ˆBITS�ARE�DIFFERE6 NT.‚DO�NOT�NORMALIZE�ZERO�RESULT) * FPPNOR�TST‚FPPRES,XŽIS�MSB�OF�MANTISSA�ZERO ‡BNE‚FPPNO1�NO,�SO�NORMALIZE ‡TST‚FPPRES+1,XŒIS�LSB�OF�MANTISSA�ZERO? ‡BEQ‚FPPMOV�YES,�DO�NOT�NORMALIZE * *†START�OF�REGULAR�NORMALIZATION * FPPNO1�LDAA�FPPRES,XŽIS�SIGN�BIT�CLEAR? ‡BGE‚FPPNO2�YES,�CHECK�FOR�BIT�6�SET ‡ROLA—NO,�IS�BIT�6�CLEAR ‡BMI‚FPPNO3†NO,�GO�TO�SHIFT�LEFT�ROUTINE ‡BRA‚FPPMOV†YES,�NORMALIZATION�COMPLETE FPPNO2�ROLA—SIGN�BIT�CLEAR,�IS�BIT�6�SET? ‡BMI‚FPPMOV†YES,�NORMALIZATION�COMPLETE * *†ROUTINE�TO�SHIFT�RESULT�LEFT�ONE�PLACE * FPPNO3�ASL‚FPPRES+1,X ‡ROL‚FPPRES,XŽROTATE�LEFT�MSB�OF�MANTISSA ‡DEC‚FPPRES+2,XŒDECREMENT�EXPONENT ‡BRA‚FPPNO1�BACK�TO�START�OF�LOOP * * *†MOVE�RESULT�FROM�STACK�INTO�MEMORY * FPPMOV�LDAA�FPPRES,X ‡LDAB�FPPRES+1,X ‡LDX‚FPPPA1,X ‡STAA�0,X ‡STAB�1,X ‡TSX ‡LDAA�FPPRES+2,X ‡LDX‚FPPPA1,X ‡STAA�2,X * *†CLEAN�UP�STACK * FPPMO1�LDAA�#FPPRTN+2 FPPMO2�INS˜INCREMENT�STACK�POINTER ‡DECA—DECREMENT�COUNT ‡BGT‚FPPMO2�LOOP�TEST ‡RTS˜RETURN�FROM�SUBROUTINE ‡PAGE * * *†FLOATING�POINT�MULTIPLY * * FPPMUL�JSR‚FPPASU�SET�UP�ARGUMENTS�ON�STACK ‡TSX˜SET�INDEX�TO�TOP�OF�STACK ‡JSR‚FPPSMD�PROCESS�ARGUMENTS ‡TSX˜SET�INDEX�TO�TOP�OF�STACK ‡STAB�FPPSGN,XŽSTORE�THE�SIGN�FLAG ‡LDAA�FPPAR1+2,XŒADD�EXPONENTS�AND ‡ADDA�FPPAR2+2,XŒSTORE�IN�THE ‡DECA�ADJST�EXPONENT�TO�ACCOUNT�FOR�SHIFT�WHICH�FOLLOW ‡STAA�FPPCRY,X„SAVE�THE�RESULT�EXPONENT�ON�STACK * *†MULTIPLY�MANTISSAS * ‡ASL‚FPPAR2+1,X ‡ROL‚FPPAR2,X„ROTATE�ARG2�TO�SAVE�A�BIT�OF�SIGNIFICANCE ‡CLR‚FPPAR1+2,X‚CLEAR�3RD�BYTE�OF�ARG1 ‡CLR‚FPPRES,X„CLEAR�RESULT�LOCATION(24�BIT�ACCUMULATOR) ‡CLR‚FPPRES+1,X ‡CLR‚FPPRES+2,X ‡LDAA�#15“INITIALIZE�THE ‡STAA�FPPCNT,XŽLOOP�COUNT FPPMU1�ASL‚FPPAR2+1,XŒSHIFT�ARG2�MANTISSA�LEFT ‡ROL‚FPPAR2,XŽIS�CARRY�SET? ‡BCC‚FPPMU2�NO,�SKIP�ADD�OPERATION ‡LDAA�FPPRES+2,X ‡ADDA�FPPAR1+2,X ‡STAA�FPPRES+2,X ‡LDAA�FPPRES+1,X ‡ADCA�FPPAR1+1,X ‡STAA�FPPRES+1,X ‡LDAA�FPPRES,X ‡ADCA�FPPAR1,X ‡STAA�FPPRES,X FPPMU2�LSR‚FPPAR1,XŽSHIFT�ARG�1�MANTISSA�RIGHT ‡ROR‚FPPAR1+1,X ‡ROR‚FPPAR1+2,X ‡DEC‚FPPCNT,XŽDECREMENT�LOOP�COUNT ‡TST‚FPPCNT,XŽIS�LOOP�FINISHED? ‡BGT‚FPPMU1�NO,�GO�BACK�TO�START�OF�LOOP ‡TST‚FPPRES,X„IS�SIGN�BIT�SET? ‡BLE‚FPPMU8†YES,�OR�POSSIBLY�ZERO�RESULT FPPMU3�DEC‚FPPCRY,X„DECREMENT�EXPONENT ‡ASL‚FPPRES+2,X‚SHIFT�RESULT�MANTISSA�LEFT ‡ROL‚FPPRES+1,X ‡ROL‚FPPRES,X ‡BPL‚FPPMU3†CONTINUE�UNTIL�SIGN�BIT�SET FPPMU8�LDAA�FPPCRY,X„MOVE�EXPONENT ‡STAA�FPPRES+2,X FPPMU6�TST‚FPPRES,X„CHECK�FOR�ZERO�RESULT ‡BPL‚FPPMU7†SKIP�OVERFLOW�OPERATION�FOR�ZERO�RESULT ‡INXŽADJUST�FOR�OVFLW,�AND�ROUND�RESULT ‡INXŽSET�INDEX�TO�FPPRES ‡INX ‡JSR‚FPPOVF†CALL�OVERFLOW�ROUTINE ‡TSX FPPMU7�TST‚FPPSGN,XŽIS�THE�RESULT�NEGATIVE? ‡BEQ‚FPPMU4�NO,SKIP�COMPLEMENTING�OPERATION ‡INX˜YES,�NEGATE�RESULT ‡INX ‡INX˜INDEX�TO�FPPRES ‡JSR‚FPPNE1�NEGATION�ROUTINE ‡TSX˜RESTORE�INDEX FPPMU4�JMP�FPPNOR‘GO�TO�NORMALIZING�ROUTINE ‡PAGE * * *†FLOATING�POINT�DIVIDE * * FPPDIV�JSR‚FPPASU�SET�UP�ARGS�ON�STACK ‡TSX˜INDEX�TO�TOP�OF�STACK ‡TST‚FPPAR2,XŽIS�DIVISOR�ZERO? ‡BEQ‚FPPZDV�YES,�PROCESS�SPECIAL�CASE ‡JSR‚FPPSMD�PROCESS�ARGS�1�&�2 ‡TSX˜SET�INDEX�TO�TOP�OF�STACK ‡STAB�FPPSGN,XŽSTORE�THE�SIGN�FLAG ‡LDAA�FPPAR1+2,XŒFORM�DIFFERENCE�OF�EXPONENTS ‡SUBA�FPPAR2+2,X ‡STAA�FPPRES+2,XŒPUT�EXPONENT�AWAY ‡LDAA�#16“INITIALIZE�THE ‡STAA�FPPCNT,XŽLOOP�COUNTER * *†LOGIC�TO�MAKE�SURE�16�BITS�OF�QUOTIENT�ARE�COMPUTED * ‡LDAA�FPPAR1,X„COMPUTE�DIFFERENCE�FOUND�FIRST�TIME�AROUND�LOOP ‡LD7 AB�FPPAR1+1,X ‡SUBB�FPPAR2+1,X ‡SBCA�FPPAR2,X ‡TSTA�IS�REMAINDER�NEGATIVE? ‡BPL‚FPPDI4†NO,�LEADING�BIT�IS�1 ‡ASL‚FPPAR1+1,X‚YES,�LEADING�BIT�IS�ZERO ‡ROL‚FPPAR1,X„SO�SHIFT�NUMERATOR�MANTISSA�LEFT�ONE�PLACE ‡DEC‚FPPRES+2,X‚DECREMENT�EXPONENT�OF�RESULT * *†MAIN�DIVISION�LOOP * FPPDI1�LDAA�FPPAR1,XŽLOAD�REMAINDER ‡LDAB�FPPAR1+1,XŒWHICH�STARTS�AS�THE�NUMERATOR ‡SUBB�FPPAR2+1,XŒSUBTRACT�DIVISOR ‡SBCA�FPPAR2,X ‡TSTA—IS�REMAINDER�NEGATIVE?�(CARRY=0) ‡BLT‚FPPDI2�YES,�CARRY�IS�CLEAR,�SKIP FPPDI4�SECŽNO,�SET�CARRY FPPDI2�ROL‚FPPRES+1,XŒSHIFT�CARRY�BIT ‡ROL‚FPPRES,XŽINTO�THE�QUOTIENT ‡TSTA—IS�REMAINDER�NEGATIVE? ‡BLT‚FPPDI3�YES,�GO�SHIFT�OLD�REM�LEFT ‡STAA�FPPAR1,XŽNO,�SO�STORE�NEW�REMAINDER ‡STAB�FPPAR1+1,X FPPDI3�ASL‚FPPAR1+1,XŒSHIFT�OLD�REMAINDER�LEFT ‡ROL‚FPPAR1,X ‡DEC‚FPPCNT,XŽLOOP�TEST ‡TST‚FPPCNT,X ‡BGT‚FPPDI1�CONTINUE�LOOPING ‡JMP‚FPPMU6 * FPPZDV�LDAA�#127’ZERO�DIVISION,�SET�Q�TO�MAX ‡STAA�FPPRES,XŽPOSITIVE�VALUE ‡STAA�FPPRES+2,X ‡LDAA�#$FF ‡STAA�FPPRES+1,X ‡JMP‚FPPMOV ‡PAGE * *†PROCESS�TWO�ARGUMENTS * FPPSMD�CLRB—CLEAR�THE�SIGN�INDICATOR ‡INX˜SET�INDEX�TO�ARG�2 ‡INX ‡INX ‡INX ‡INX ‡INX ‡JSR‚FPPPAR�PROCESS�ARGUMENT�2 ‡INX˜SET�INDEX�TO�ARG1 ‡INX ‡INX ‡INX ‡INX ‡JSR‚FPPPAR�PROCESS�ARGUMENT�1 ‡RTS˜RETURN * *†SUBROUTINE�TO�PROCESS�MUL�ARGS * *†INDEX�POINTS�TO�FP�ARGUMENT * FPPPAR�TST‚0,X“IS�ARG�NEGATIVE ‡BGE‚FPPPA0�NO,�SKIP�SIGN�CHANGE ‡COMB—COMPLEMENT�THE�RESULT�SIGN ‡JSR‚FPPNE1�NEGATE�ARGUMENT FPPPA0�RTSŽRETURN * *†ROUTINE�TO�SET�UP�ARGUMENTS�ON�THE�STACK * *†A�REG�CONTAINS�POINTER�TO�ARG1 *†B�REG�CONTAINS�POINTER�TO�ARG2 * *†THE�B�REG�WILL�BE�USED�TO�CONTROL�THE�TWO�PASS�LOOP * FPPASU�PSHA—LSB�OF�ADDRESS�ONTO�STACK ‡CLRA—CLEAR�A�REGISTER ‡PSHA—MSB�OF�ARG�ADDRESS�ONTO�STACK ‡TSX˜LOAD�ADDRESS�OF�ARG�INTO�X ‡LDX‚0,X ‡LDAA�2,X“ARG�EXPONENT�ONTO�STACK ‡PSHA ‡LDAA�1,X“LSB�OF�ARG�MANTISSA�ONTO�STACK ‡PSHA ‡LDAA�0,X“MSB�OF�ARG�MANTISSA�ONTO�THE�STACK ‡PSHA ‡TSTB—IS�THE�B�REG�CLEAR? ‡BEQ‚FPPAS2�YES,�EXIT�FROM�LOOP ‡TBA˜NO,�MOVE�BREG�TO�A�REG ‡CLRB—CLEAR�B�REG�TO�INDICATE�LOOP�TERMINATI ‡BRA‚FPPASU�REPEAT�SEQUENCE�FOR�ARG2 FPPAS2�DES˜LEAVE�SIX‚ADDITIONAL�POSITIONS�ON�STA ‡DES ‡DES ‡DES ‡DES ‡DES ‡TSX˜SET�INDEX�TO�TOP�OF�STACK ‡LDX‚FPPRTN,X ‡JMP‚0,X“RETURN�(RTS�CANNOT�BE�USED�HERE) * *†STACK�LOCATION�SYMBOLS * FPPCNT�EQU‚0•LOOP�COUNTER FPPCRY�EQU‚FPPCNT+1ŽCARRY�INDICATOR FPPSGN�EQU�FPPCRY+1�PRODUCT�(QUOTIENT)�SIGN FPPEXD�EQU‚FPPSGN�EXPONENT�DIFFERENCE FPPRES�EQU‚FPPEXD+1ŽRESULT�OF�OPERATION FPPAR2�EQU‚FPPRES+3ŽARG�2�(DATA) FPPPA2�EQU‚FPPAR2+3ŽARG�2�(POINTER) FPPAR1�EQU‚FPPPA2+2ŽARG�1�(DATA) FPPPA1�EQU‚FPPAR1+3ŽARG�1�(POINTER) FPPRTN�EQU‚FPPPA1+2ŽRETURN�ADDRESS * * *†FLOAT * * FPPFLT�JSR‚FPPASU�SET�UP�ARGS ‡TSX˜SET�INDEX�TO�TOP�OF�STACK ‡LDAA�#15“15�TO�THE�A�REG ‡STAA�FPPRES+2,XŒSET�THE�RESULT�EXPONENT ‡LDAA�FPPAR2,XŽMOVE�MANTISSA ‡STAA�FPPRES,X ‡LDAA�FPPAR2+1,X ‡STAA�FPPRES+1,X ‡JMP‚FPPNOR�GO�TO�NORMALIZING�SECTION * * *†IFIX * * FPPFIX�JSR‚FPPASU�SET�UP�ARGS ‡TSX˜SET�UP�INDEX�TO�TOP�OF�STACK ‡LDAA�FPPAR2+2,XŒGET�EXPONENT�INTO�A�REG FPPFI1�CMPA�#15“COMPARE�EXPONENT�WITH�15 ‡BEQ‚FPPFI3�EQUAL ‡BGT‚FPPFI2�LESS�THAN *†EXPONENT�IS�LESS�THAN�15�SO�SHIFT�RIGHT ‡INCA—INCREMENT�EXPONENT ‡ASR‚FPPAR2,XŽSHIFT�MANTISSA�RIGHT ‡ROR‚FPPAR2+1,X ‡BRA‚FPPFI1�CONTINUE�LOOPING *†EXPONENT�GREATER�THAN�15�SO�SHIFT�LEFT�(ERROR) FPPFI2�DECA ‡ASL‚FPPAR2+1,XŒSHIFT�MANTISSA�LEFT ‡ROL‚FPPAR2,X ‡BRA‚FPPFI1�CONTI8 NUE�LOOPING *†EXPONENT�EQUAL�TO�15�SO�SHIFT�IS�COMPLETE FPPFI3�LDAA�FPPAR2,XŽTRANSFER�RESULTS ‡LDAB�FPPAR2+1,X ‡LDX‚FPPPA1,X ‡STAA�0,X ‡STAB�1,X ‡JMP‚FPPMO1�GO�CLEAN�UP�STACK * * *†FLOATING�POINT�NEGATE * * FPPNEG�JSR‚FPPASU�SET�UP�ARGUMENTS ‡TSX˜SET�INDEX�TO�TOP�OF�STACK ‡INX˜SET�INDEX�TO�ARG2 ‡INX ‡INX ‡INX ‡INX ‡INX ‡JSR‚FPPNE1 ‡TSX˜INDEX�TO�TOP�OF�STACK ‡JMP‚FPPRT2�RETURN�ARG2 * * *†FLOATING�POINT�CLEAR * * FPPCLR�PSHA—PUT�ADDRESS�ONTO�STACK ‡CLRA ‡PSHA ‡TSX˜INDEX�TO�TOP�OF�STACK ‡LDX‚0,X“GET�ADDRESS�INTO�INDEX�REG ‡CLR‚0,X“CLEAR�THREE�CONSECUTIVE�BYTES ‡CLR‚1,X �CLR�2,X �INS�CLEAN�UP�STACK ‡INS ‡RTS˜RETURN ‡END :: ÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅ1n€1�NAM�BLKJCK *�BLACKJACK�REV�1.5�RICK�STERLING�QUAD�EIGHT�ELEC.�8/16/76 * *�NOTE�TO�USERS,�THERE�IS�A�TIMER�INCORPORATED�IN *�THIS�PROGRAM.�IT�IS�USED�TO�GENERATE�DELAYS�DURING *�PLAY�WHEN�OPERATING�AT�9600�BAUD.�THOSE�OF�YOU�WHO *�ARE�USING�SLOWER�BAUD�RATES�MAY�WISH�TO�DELETE�THIS *�FUNCTION. �OPT�O,NOG DLRTOT�EQU�$309 PLRTOT�EQU�$30A DLRSAV�EQU�$305 PLRSAV�EQU�$306 PLRACE�EQU�$307 DLRACE�EQU�$308 SAVEX�EQU�$300 DKPNTR�EQU�$302 FLAG�EQU�$304 RANDNO�EQU�$100 TEMP�EQU�$104 DECK�EQU�$105 �ORG�$1000 *�INITIALIZE�STACK�POINTER�PRINT�MESSAGE *�CLEAR�SCORE�CLEAR�CARD�MEMORY START�LDAA�#$39 �STAA�$FCF4 �LDS�#$FF0 �LDX�#SHUF �JSR�PRINT �LDX�#$3030 �STX�PLRSCR �STX�DLRSCR �CLR�DLRTOT �CLR�PLRTOT *�JUMP�TO�SHUFFLE�ROUTINE�REPEAT�UNTIL *�KEY�PUSHED LOOPC�JSR�SHUFLE+6 �LDAA�$FCF4 �ASRA �BCC�LOOPC �LDAA�$FCF5 �LDX�#DECK �STX�DKPNTR *�PLAY�STARTS�HERE,�ALL�TEMP�REGISTERS�ARE� *�CLEARED START1�CLR�FLAG �JSR�SCORE �CLR�PLRACE �CLR�DLRACE �CLR�DLRSAV �CLR�PLRSAV �JSR�TIME �LDX�#OVRLY �JSR�PRINT START2�JSR�DEAL �JSR�SCALE �JSR�PLRCRD �JSR�OUTCD �LDX�#SPACE �JSR�PRINT �JSR�DEAL �JSR�SCALE �JSR�DLRCRD �LDAB�FLAG �BEQ�FIRST �STAA�TEMP �BRA�SECOND FIRST�JSR�OUTCD SECOND�LDAA�#$A �JSR�COUT �LDAA�#$D �JSR�COUT �INC�FLAG �LDAA�FLAG �CMPA�#2 �BNE�START2 �LDAA�PLRSAV �CMPA�#22 �BNE�NEX1 �LDAA�#12 �STAA�PLRSAV �DEC�PLRACE NEX1�CMPA�#21 �BNE�CKDLR �LDX�#PLRBKJ �JSR�PRINT �INC�PLRTOT �JMP�START1 COUT�EQU�*�CHARATOR�OUTPUT�ROUTINE �PSHB�SAVE�B�REGISTER �LDAB�$FCF4�CONTROL�REG �ASRB �ASRB �BCC�COUT+1 �STAA�$FCF5�OUTPUT�CHAR �CLRB �DECB �BNE�*-1 �PULB�RESTORE�B�REG �RTS SCORE�TST�DLRTOT �BEQ�NEXT1 �CLR�DLRTOT �LDX�#DLRSCR �BSR�BCDADD NEXT1�TST�PLRTOT �BEQ�OUT7 �CLR�PLRTOT �LDX�#PLRSCR �BSR�BCDADD OUT7�RTS BCDADD�LDAA�1,X �LDAB�X �ANDA�#$F �ANDB�#$F �ASLB �ASLB �ASLB �ASLB �ABA �ADDA�#1 �DAA �TAB �ANDB�#$F �ADDB�#$30 �STAB�1,X �LSRA �LSRA �LSRA �LSRA �ADDA�#$30 �STAA�X �RTS TIME�CLRA TIMEL�LDX�#$0000�THIS�VALUE�MAY�BE�ADJ.�FOR�DIFFERENT�TIMEOUT LOOPT�INX �BNE�LOOPT �INCA �CMPA�#5�THIS�VALUE�MAY�BE�ADJ.�FOR�DIFFERENT�TIMEOUT �BNE�TIMEL �RTS CKDLR�LDAA�DLRSAV �CMPA�#22 �BNE�NEX2 �LDAA�#12 �STAA�DLRSAV �DEC�DLRACE NEX2�CMPA�#21 �BNE�HIT1 �LDX�#DWNCDM �JSR�PRINT �LDAA�TEMP �J9 SR�OUTCD �LDX�#DLRBKJ �JSR�PRINT �INC�DLRTOT �JMP�START1 HIT1�LDX�#HITMES �JSR�PRINT �JSR�CIN �CMPA�#$31 �BEQ�HIT2 �JMP�DLRNXT HIT2�JSR�DEAL �JSR�SCALE �JSR�PLRCRD �JSR�OUTCD �LDAA�PLRSAV �CMPA�#21 �BHI�BUST1 �BRA�HIT1 BUST1�LDAA�PLRACE �BEQ�BUST1A �DEC�PLRACE �LDAA�PLRSAV �SUBA�#10 �STAA�PLRSAV �BRA�HIT1 BUST1A�LDX�#DWNCDM �JSR�PRINT �LDAA�TEMP �JSR�OUTCD �LDX�#BUST �JSR�PRINT �BRA�DLRWIN DLRNXT�LDX�#DWNCDM �JSR�PRINT �LDAA�TEMP �JSR�OUTCD �LDAA�#$A �JSR�COUT �LDAA�#$D �JSR�COUT DLRNX2�LDAA�DLRSAV �CMPA�#16 �BHI�STOP �LDX�#SPC18 �JSR�PRINT �JSR�DEAL �JSR�SCALE �JSR�DLRCRD �JSR�OUTCD �BRA�DLRNX2 SCALE�TAB �ANDB�#$F �INCB �CMPB�#1 �BEQ�ACE �CMPB�#10 �BHI�TENS �RTS ACE�LDAB�#11 �RTS TENS�LDAB�#10 �RTS STOP�CMPA�#21 �BHI�BUST2 �CMPA�PLRSAV �BHI�DLRWIN �BEQ�PUSH PLRW�LDX�#PLRWIN �JSR�PRINT �INC�PLRTOT �BRA�OUT5 DLRWIN�LDX�#DLRWMS �JSR�PRINT �INC�DLRTOT OUT5�JMP�START1 BUST2�LDAA�DLRACE �BEQ�BUST2A �DEC�DLRACE �LDAA�DLRSAV �SUBA�#10 �STAA�DLRSAV �BRA�DLRNX2 BUST2A�LDX�#BUST �JSR�PRINT �BRA�PLRW PUSH�LDX�#PUSHM �JSR�PRINT �BRA�OUT5 �JMP�START1 OUTCD�PSHA �ANDA�#$F �TAB �ABA �ABA �ABA �ABA �CLRB �LDX�#CARD �STX�SAVEX �ADDA�SAVEX+1 �ADCB�SAVEX �STAA�SAVEX+1 �STAB�SAVEX �LDX�SAVEX �LDAB�#5 �BSR�PRINK �LDAA�#'/ �JSR�COUT �PULA �ANDA�#$30 �LSRA �LDX�#SUIT �CLRB �STX�SAVEX �ADDA�SAVEX+1 �ADCB�SAVEX �STAA�SAVEX+1 �STAB�SAVEX �LDX�SAVEX �LDAB�#8 �JSR�PRINK �RTS PRINK�LDAA�X �JSR�COUT �INX �DECB �BNE�PRINK �RTS DEAL�LDX�DKPNTR �CPX�#DECK+52 �BNE�DECKOK �LDX�#SHUF2 �JSR�PRINT �INS �INS �JMP�LOOPC DECKOK�LDX�DKPNTR �LDAA�X �INC�DKPNTR+1 �RTS PLRCRD�CMPB�#11 �BNE�PLRCR1 �INC�PLRACE PLRCR1�ADDB�PLRSAV �STAB�PLRSAV �RTS DLRCRD�CMPB�#11 �BNE�DLRCR1 �INC�DLRACE DLRCR1�ADDB�DLRSAV �STAB�DLRSAV �RTS SPACE�FCC�4,� �FCB�$4 CARD�FCC�'‚ACE‚TWOTHREE�FOUR�FIVE‚SIXSEVEN' �FCC�'EIGHT�NINE‚TEN�JACKQUEEN�KING' SUIT�FCC�'SPADES‚HEARTS‚CLUBSƒDIAMONDS' HITMES�FCB�$A,$D �FCB�$3F,$1A,$4 BUST�FCB�$A,$D,$7 �FCC�'BUST' �FCB�,$4 SPC18�FCB�$A,$D �FCC�'DEALER�DRAWS�A„' �FCB�$4 PLRWIN�FCB�$A,$D,$7 �FCC�'YOU�WIN' �FCB�$A,$D,$4 DLRWMS�FCB�$A,$D,$7 �FCC�'DEALER�WINS' �FCB�$A,$D,$4 PLRBKJ�FCB�$A,$D �FCC�'B�L�A�C�K�J�A�C�K„Y�O�UƒW�I�N�!�!' �FCB�$4 DLRBKJ�FCB�$A,$D �FCC�'B�L�A�C�K�J�A�C�K„I„W�I�N�!�!�!' �FCB�$4 PUSHM�FCB�$A,$D,$7 �FCC�'PUSH' �FCB�$4 DWNCDM�FCB�$A,$D �FCC�'MY�DOWN�CARD�WAS‚' �FCB�$4 CIN�EQU�* �LDAA�$FCF4 �ASRA �BCC�CIN �LDAA�$FCF5 �ANDA�#$7F �RTS *�THIS�SUB-ROUTINE�GENERATES�A�52�CARD�DECK SHUFLE‚LDX�#SHUF2 �JSR�PRINT �JSR�INIT LOOP4�JSR�RANDOM �JSR�CHECK �JSR�LOAD �BCC�LOOP4 �RTS *�THIS�IS�A�32�BIT�RANDOM�(PSEUDO)�NUMBER�GENERATOR *�4.29X10^9�STATES RANDOM‚LDAA�RANDNO+3 �ORAA�RANDNO+2 �ORAA�RANDNO+1 �ORAA�RANDNO �BNE�SKIP�IF�ZERO�ENTER�ALL�1'S �COM�RANDNO+3 SKIP�LDAA�RANDNO+3 �LSRA �LSRA �LSRA �EORA�RANDNO+3 �ASRA �ASRA �ROR�RANDNO �ROR�RANDNO+1 �ROR�RANDNO+2 �ROR�RANDNO+3 �RTS *�MODULO�52�MASK CHECK‚LDAA�RANDNO �EORA�RANDNO+1 �EORA�RANDNO+2 �EORA�RANDNO+3 �TAB �ANDA�#$F �CMPA�#12 �BLE�OK �SUBA�#13 OK�ANDB�#$30 �ABA �RTS *�SUBROUTINE�TO�LOAD�DECK�FROM�RANDOM�#�GEN. LOAD‚LDX�#DECK LOOP2�LDAB�X �BMI�ENT �CBA �BEQ�OUTNG �INX �CPX�#DECK+52 �BEQ�OUTOK �BRA�LOOP2 ENT�STAA�X OUTNG�CPX�#DECK+51 �BEQ�OUTOK �CLC �RTS OUTOK�SEC �RTS SHUF�FCB�$06,06,$0C,,,,,,$A,$D �FCC�'THIS�IS�MOTOROLA�BLACKJACK......' �FCC�'.........TRY�YOUR�LUCK.....!' �FCB�$D,$A �FCB�6,7 �FCC�'DEALER�MUST�HIT�ON�16�OR�LESS�AND' �FCC�'�STAND�ON: �17.' �FCB�$D,$A,,,,, �FCC�'ACES�COUNT�1�OR�11�,�FACE�CARDS' �FCC�'�COUNT�TEN.' �FCB�$D,$A,,,,, �FCC�'BLACKJACK�WITH�ACE�AND�A�FACE�CARD' �FCC�'�OR�TEN' �FCB�$D,$A,,,,, �FCC�'TIES�COUNT�AS�A�PUSH�NO�WINNER.' �FCB�$D,$A,,,,, �FCC�'DURING�PLAY�TYPE�1�FOR�A�HIT,0�TO' �FCC�'�STAND�PAT' �FCB�$D,$A,,,,, SHUF2�FCB�$D,$A,6,2,, �FCC�'SHUFFLE�NOW�IN�PROGRESS.............' �FCC�'TYPE�ANY�KEY�TO�HALT�AND�DEAL' �FCB�6,1 �FCB�$D,$A,,,,, �FCB�$4 PRINT�EQU�* �LDAA�X �CMPA�#$4 �BNE�NOTEND �RTS NOTEND�JSR�COUT �INX �BRA�PRINT INIT�EQU�*�INITIALIZE�DECK�FOR�LOAD� *�ROUTINE�,�ALL�CARDS�EQUAL�FF �LDX�#DECK �LDAA�#$FF LOOP7�STAA�X �INX �CPX�#DECK+52 �BNE�LOOP7 �RTS OVRLY�FCB�$0C,,, �FCB�$D,$A,,,,, �FCC�4,� �FCC�'PLAYER' �FCC�13,� �FCC�'DEALER' �FCB�$D,$A,,, �FCC�6,� PLRSCR�RMB�2 �FCC�17,� DLRSCR�RMB�2 �FCB�$D,$A,$A,$4 �END� �MON ååååååååååååååååååå; åååååååååååååååååååååååååå< åååååååååååååååååååååååååå= åååååååååååååååååååååååååå> åååååååååååååååååååååååååå? åååååååååååååååååååååååååå@ ååååååååååååååååååååååååååA ååååååååååååååååååååååååååB ååååååååååååååååååååååååååC ååååååååååååååååååååååååååD ååååååååååååååååååååååååååE ååååååååååååååååååååååååååF ååååååååååååååååååååååååååG ååååååååååååååååååååååååååH ååååååååååååååååååååååååååI ååååååååååååååååååååååååååJ ååååååååååååååååååååååååååK ååååååååååååååååååååååååååL åååååååååååååååååååååååååå