Apple II Original ROM InformationSourcehttp://members.buckeye-express.com/marksm/6502/27 June 2004The 6502 Firmware PageThis site is mostly about the firmware -- software in ROM -- that came with the original Apple II, not the II+, IIe, IIc, or IIgs. The original Apple II had 4K of RAM and 8K of ROM. The ROM contains software, such as the Monitor and Integer BASIC, appropriate for a SBC.Red Book refers to the original Apple II Reference Manual dated 1978.WOZPAK refers to the WOZPAK II, a publication by Call-A.P.P.L.E., an Apple II user group.DDJ refers to Dr. Dobbs Journal, a computer magazine.IA refers to Interface Age, a publication of the SCCS (Southern California Computer Society).SYM and AIM refer to early 6502 single board computers.Contents* Apple II ROM (12 KB binary) * Memory map of the Apple II ROMs * Summary of Monitor Commands * Red Book Monitor listing * Red Book Sweet-16 listing * WOZPAK Sweet-16 article by Steve Wozniak * WOZPAK Sweet-16 article by Dick Sedgewick * Red Book Mini-Assembler listing * Red Book Floating point listing * WOZPAK Floating point routines description * DDJ Floating point article * IA Floating point article * SYM Monitor listing * AIM Monitor listing * AIM BASIC Language Reference Manual ------------------------------------------------------------------------Questions or comments? Email me at paulrsm@buckeye-express.com------------------------------------------------------------------------Updates* 2000-09-01 -- Added AIM BASIC Language Reference Manual +------------------------------------------------------------------------| TOPIC -- Apple II -- Apple II ROM (12 KB binary) +------------------------------------------------------------------------File ............. "a2rom.bin"Fork ............. DATASize (bytes) ..... 12,288 (12KB) / $00003000Created .......... Sunday, December 8, 2002 -- 8:47:53 PMModified ......... Sunday, December 8, 2002 -- 8:47:53 PMD/000000: A9208D26 03AD57C0 AD53C0AD 50C0A900 [...&..W..S..P...]D/000010: 851CAD26 03851BA0 00841AA5 1C911A20 [...&............]D/000020: A2D0C8D0 F6E61BA5 1B291FD0 EE608D22 [.........)...`."]D/000030: 038E2003 8C210348 29C08526 4A4A0526 [.....!.H)..&JJ.&]D/000040: 85266885 270A0A0A 26270A26 270A6626 [.&h.'...&'.&'.f&]D/000050: A527291F 0D260385 278AC000 F005A023 [.')..&..'......#]D/000060: 6904C8E9 07B0FB8C 2503AABD EAD08530 [i.......%......0]D/000070: 984AAD24 03851CB0 2960202E D0A51C51 [.J.$....)`.....Q]D/000080: 26253051 26912660 1024A530 4AB00549 [&%0Q&.&`.$.0J..I]D/000090: C0853060 881002A0 27A9C085 308C2503 [..0`....'...0.%.]D/0000A0: A51C0AC9 C01006A5 1C497F85 1C60A530 [.........I...`.0]D/0000B0: 0A498030 DCA981C8 C02890DF A000B0DB [.I.0.....(......]D/0000C0: 18A55129 04F027A9 7F253031 26D01BEE [..Q)..'..%01&...]D/0000D0: 2A03A97F 25301012 18A55129 04F00FB1 [*...%0....Q)....]D/0000E0: 26451C25 30D003EE 2A035126 9126A551 [&E.%0...*.Q&.&.Q]D/0000F0: 65532903 C9026AB0 8F303018 A5272CEA [eS)...j..00..',.]D/000100: D1D02206 26B01A2C F3D0F005 691F38B0 [..".&..,....i.8.]D/000110: 12692348 A52669B0 B00269F0 852668B0 [.i#H.&i...i..&h.]D/000120: 02691F66 2669FC85 276018A5 2769042C [.i.f&i..'`..'i.,]D/000130: EAD1D0F3 06269019 69E0182C 2ED1F013 [.....&..i..,....]D/000140: A5266950 49F0F002 49F08526 AD260390 [.&iPI...I..&.&..]D/000150: 0269E066 2690D048 A9008D20 038D2103 [.i.f&..H......!.]D/000160: 8D220368 4838ED20 03488AED 21038553 [.".hH8...H..!..S]D/000170: B00A6849 FF690148 A900E553 85518555 [..hI.i.H...S.Q.U]D/000180: 68855085 54688D20 038E2103 9818ED22 [h.P.Th....!...."]D/000190: 03900449 FF69FE85 528C2203 665338E5 [...I.i..R.".fS8.]D/0001A0: 50AAA9FF E551851D AC2503B0 050A2088 [P....Q...%......]D/0001B0: D038A554 65528554 A555E900 8555B126 [.8.TeR.T.U...U.&]D/0001C0: 451C2530 51269126 E8D004E6 1DF06BA5 [E.%0Q&.&......k.]D/0001D0: 53B0DA20 F9D018A5 54655085 54A55565 [S.......TeP.T.Ue]D/0001E0: 5150D981 82848890 A0C01CFF FEFAF4EC [QP..............]D/0001F0: E1D4C5B4 A18D7861 493118FF A5260AA5 [......xaI1...&..]D/000200: 2729032A 05260A0A 0A8D2203 A5274A4A [').*.&...."..'JJ]D/000210: 29070D22 038D2203 AD25030A 6D25030A [)..".."..%..m%..]D/000220: AACAA530 297FE84A D0FC8D21 038A186D [...0)..J...!...m]D/000230: 25039003 EE21038D 20036086 1A841BAA [%....!....`.....]D/000240: 4A4A4A4A 85538A29 0FAABCEB D1845049 [JJJJ.S.)......PI]D/000250: 0FAABCEC D1C88452 AC2503A2 008E2A03 [.......R.%....*.]D/000260: A11A8551 A2808654 8655AE27 03A55438 [...Q...T.U.'..T8]D/000270: 65508554 900420D8 D018A555 65528555 [eP.T.......UeR.U]D/000280: 900320D9 D0CAD0E5 A5514A4A 4AD0D3E6 [.........QJJJ...]D/000290: 1AD002E6 1BA11AD0 C960861A 841BAA4A [.........`.....J]D/0002A0: 4A4A4A85 538A290F AABCEBD1 8450490F [JJJ.S.)......PI.]D/0002B0: AABCECD1 C88452AC 2503A200 8E2A03A1 [......R.%....*..]D/0002C0: 1A8551A2 80865486 55AE2703 A5543865 [..Q...T.U.'..T8e]D/0002D0: 50855490 0420C0D0 18A55565 52855590 [P.T.......UeR.U.]D/0002E0: 0320D9D0 CAD0E5A5 514A4A4A D0D3E61A [........QJJJ....]D/0002F0: D002E61B A11AD0C9 602090D3 8D240320 [........`....$..]D/000300: AFD34820 9AD36820 2ED0AE23 036020F9 [..H...h....#.`..]D/000310: D24C7DD0 AD25034A 2090D320 75D0209A [.L}..%.J....u...]D/000320: D38A4898 AA20AFD3 A8682064 D1AE2303 [..H......h.d..#.]D/000330: 602090D3 4C10D020 F9D22051 D3203BD2 [`...L......Q..;.]D/000340: AE230360 20F9D220 51D3209A D2AE2303 [.#.`....Q.....#.]D/000350: 608E2303 A0322092 D38D2703 A0282092 [`.#..2....'..(..]D/000360: D348AD28 03851AAD 2903851B A0202092 [.H.(....).......]D/000370: D3F039A2 00C11AF0 02B0310A 9003E61B [..9.......1.....]D/000380: 18A8B11A 651AAAC8 B11A6D29 03A86860 [....e.....m)..h`]D/000390: A016B14A D01688B1 4A608E23 03A005B1 [...J....J`.#....]D/0003A0: 4AAAC8B1 4AA8E018 E90190ED 4C68EEA0 [J...J.......Lh..]D/0003B0: 0D2092D3 C9C0B0F4 608E2303 201EF120 [........`.#.....]D/0003C0: FDFEA900 853C8D28 031865CE A8A90885 [.....<.(..e.....]D/0003D0: 3D8D2903 65CFB025 C4CA48E5 CB68B01D [=.).e..%..H..h..]D/0003E0: 843E853F C8D00269 01844A85 4B84CC85 [.>.?...i..J.K...]D/0003F0: CD20FAFC A9032002 FFAE2303 604C6BE3 [..........#.`Lk.]D/000400: 2089F6B0 3334F400 2089F618 4C006838 [....34......L.h8]D/000410: 19CE00C9 3536213B 3CC93739 29D80346 [....56!;<.79)..F]D/000420: 3A26E0D7 03384AA9 396AD302 2AD40202 [:&...8J.9j..*...]D/000430: 07307600 A501A600 201BE5A9 AD20EDFD [.0v.............]D/000440: A9BE20ED FDA517A6 16201BE5 208EFD20 [................]D/000450: 8CF62B3C A23B0DD1 02C2004C 68EE004C [..+<.;.....Lh..L]D/000460: 6BE3ECDC 02F419B0 001AC000 27D80363 [k...........'..c]D/000470: E7673D25 3B211C2C A23C2BB6 03076BBD [.g=%;!.,.<+...k.]D/000480: 07F5C72C 771B2800 1C67FC08 E547D902 [...,w.(..g...G..]D/000490: 09DA02F5 F76705FC F747DB06 F71C5D00 [.....g...G....].]D/0004A0: DC06F108 13FDFD06 0F1D2400 DD0609F0 [..........$.....]D/0004B0: 06BA1D74 00BD0901 B03C01D1 2089F61C [...t.....<......]D/0004C0: 4E00CC38 19CA0069 7C0020DF F02089F6 [N..8...i|.......]D/0004D0: CC287C00 60A9DCA0 D44CB0D5 A434B900 [.(|.`....L...4..]D/0004E0: 02C9AAD0 0CE634A2 07B53C95 02CA10F9 [......4...<.....]D/0004F0: 60A002B1 3C990B00 8810F820 8EF8A62F [`...<........../]D/000500: CAD00CA5 0B290DF0 142908D0 10850D20 [.....)...)......]D/000510: 89F622D6 020626B1 0202A436 00A200B5 [.."...&....6....]D/000520: 0B9142E8 20B4FCC6 2F10F490 C460A954 [..B...../....`.T]D/000530: A0D54CB0 D586D838 A2FFB54D F5CB95CF [..L....8...M....]D/000540: E8F0F720 1EF12054 D5A20120 2CF12054 [.......T....,..T]D/000550: D5A6D860 20FAFCA9 1620C9FC 852E20FA [...`............]D/000560: FCA02420 FDFCB0F9 20FDFCA0 3B20ECFC [..$.........;...]D/000570: F00E452E 852E20BA FCA03490 F04C26FF [..E.......4..L&.]D/000580: EAEAEAC1 3CF0EB48 202DFF20 92FDB13C [....<..H.-.....<]D/000590: 20DAFDA9 A020EDFD A9A820ED FD6820DA [.............h..]D/0005A0: FDA9A920 EDFDA98D 4CEDFDA9 8D4CEDFD [........L....L..]D/0005B0: 8DF9038C FA03A94C 8DF80360 A9C3A0D5 [.......L...`....]D/0005C0: 4CB0D5A9 0020D0D5 A9FF20D0 D54C3AFF [L............L:.]D/0005D0: 850049FF 8501A53D 85078509 850BA000 [..I....=........]D/0005E0: 84068408 840AA63E A5009108 C8D0FBE6 [.......>........]D/0005F0: 09CAD0F6 A63EB106 C500F013 48A50720 [.....>......H...]D/000600: DAFD9820 8AD6A500 208AD668 2092D6C8 [...........h....]D/000610: D0E4E607 CAD0DFA6 3EA50191 0A840D84 [........>.......]D/000620: 0CE60CA5 012045D6 A5002045 D6060C26 [......E....E...&]D/000630: 0DA50DC5 3E90ECA5 00910AE6 0AD0DAE6 [....>...........]D/000640: 0BCAD0D5 608502A5 0A450C85 08A50B45 [....`....E.....E]D/000650: 0D8509A5 029108B1 0AC501F0 E748A50B [.............H..]D/000660: 20DAFDA5 0A208AD6 A501910A 208AD668 [...............h]D/000670: 4CCB02A5 0920DAFD A508208A D6A50220 [L...............]D/000680: 8AD6202D FFA98D4C EDFD20DA FDA9A04C [...-...L.......L]D/000690: EDFD840F 850E208A D6202DFF A500450E [..........-...E.]D/0006A0: 850EA007 460E9023 A9A020ED FDA53DC9 [....F..#......=.]D/0006B0: 50A9C469 0020EDFD A9AD20ED FD98D005 [P..i............]D/0006C0: A9B120ED FDB9D3D6 20EDFD88 10D6A40F [................]D/0006D0: 4C85D6B0 B9B8B7B6 B5B4B3B2 B1A00084 [L...............]D/0006E0: 06840788 98D00EA0 1A200ED7 85068407 [................]D/0006F0: A021200E D7850884 09A00820 0ED78502 [.!..............]D/000700: 8403A011 200ED785 0484054C 08D4B14A [...........L...J]D/000710: 48C8B14A A868604C 4ED7A401 AD30C0E6 [H..J.h`LN....0..]D/000720: 02D005E6 03D00560 EA4C2CD7 88F0054C [.......`.L,....L]D/000730: 32D7D0EB A400AD30 C0E602D0 05E603D0 [2......0........]D/000740: 0560EA4C 46D788F0 D14C4CD7 D0EBADFF [.`.LF....LL.....]D/000750: 020AA8B9 96D78500 ADFD024A F0044600 [...........J..F.]D/000760: D0F9B996 D738E500 8501C8B9 96D76500 [.....8........e.]D/000770: 8500A900 38EDFE02 8503A900 8502A501 [....8...........]D/000780: D098EAEA 4C87D7E6 02D005E6 03D00560 [....L..........`]D/000790: EA4C94D7 D0EC0000 F6F6E8E8 DBDBCFCF [.L..............]D/0007A0: C3C3B8B8 AEAEA4A4 9B9B9292 8A8A8282 [................]D/0007B0: 7B7B7474 6D6E6768 61625C5C 57575252 [{{ttmnghab\\WWRR]D/0007C0: 4D4E4949 45454141 3D3E3A3A 36373334 [MNIIEEAA=>::6734]D/0007D0: 30312E2E 2B2C2929 26272425 22232021 [01..+,))&'$%"#.!]D/0007E0: 1E1F1D1D 1B1C1A1A 18191717 15161415 [................]D/0007F0: 13141212 11111010 0F100E0F FFFFFFFF [................]D/000800: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000810: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000820: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000830: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000840: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000850: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000860: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000870: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000880: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000890: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/0008A0: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/0008B0: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/0008C0: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/0008D0: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/0008E0: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/0008F0: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000900: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000910: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000920: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000930: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000940: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000950: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000960: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000970: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000980: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000990: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/0009A0: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/0009B0: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/0009C0: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/0009D0: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/0009E0: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/0009F0: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000A00: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000A10: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000A20: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000A30: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000A40: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000A50: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000A60: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000A70: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000A80: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000A90: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000AA0: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000AB0: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000AC0: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000AD0: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000AE0: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000AF0: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000B00: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000B10: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000B20: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000B30: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000B40: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000B50: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000B60: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000B70: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000B80: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000B90: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000BA0: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000BB0: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000BC0: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000BD0: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000BE0: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000BF0: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000C00: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000C10: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000C20: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000C30: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000C40: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000C50: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000C60: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000C70: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000C80: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000C90: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000CA0: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000CB0: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000CC0: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000CD0: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000CE0: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000CF0: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000D00: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000D10: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000D20: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000D30: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000D40: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000D50: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000D60: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000D70: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000D80: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000D90: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000DA0: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000DB0: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000DC0: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000DD0: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000DE0: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000DF0: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000E00: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000E10: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000E20: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000E30: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000E40: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000E50: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000E60: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000E70: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000E80: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000E90: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000EA0: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000EB0: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000EC0: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000ED0: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000EE0: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000EF0: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000F00: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000F10: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000F20: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000F30: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000F40: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000F50: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000F60: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000F70: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000F80: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000F90: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000FA0: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000FB0: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000FC0: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000FD0: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000FE0: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/000FF0: FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF [................]D/001000: 2000F04C B3E28533 4CEDFD60 8A2920F0 [...L...3L..`.)..]D/001010: 23A9A085 E44CEDFD A920C524 B00CA98D [#....L.....$....]D/001020: A00720ED FDA9A088 D0F8A000 B1E2E6E2 [................]D/001030: D002E6E3 602015E7 2076E5A5 E2C5E6A5 [....`....v......]D/001040: E3E5E7B0 EF206DE0 4C3BE0A5 CA85E2A5 [......m.L;......]D/001050: CB85E3A5 4C85E6A5 4D85E7D0 DE2015E7 [....L...M.......]D/001060: 206DE5A5 E485E2A5 E585E3B0 C786D8A9 [.m..............]D/001070: A085FA20 2AE09885 E4202AE0 AA202AE0 [....*.....*...*.]D/001080: 201BE520 18E084FA AA10180A 10E9A5E4 [................]D/001090: D0032011 E08A20ED FDA92520 1AE0AA30 [..........%....0]D/0010A0: F585E4C9 01D005A6 D84C8EFD 4884CEA2 [.........L..H...]D/0010B0: ED86CFC9 519004C6 CFE95048 B1CEAA88 [....Q.....PH....]D/0010C0: B1CE10FA E0C0B004 E00030F2 AA68E901 [..........0..h..]D/0010D0: D0E924E4 300320F8 EFB1CE10 10AA293F [..$.0.........)?]D/0010E0: 85E41869 A020EDFD 88E0C090 EC200CE0 [...i............]D/0010F0: 68C95DF0 A4C928D0 8AF09E20 18E19550 [h.]...(........P]D/001100: D5789011 A02B4CE0 E32034EE D55090F4 [.x...+L...4..P..]D/001110: 20E4EF95 784C23E8 2034EEF0 E738E901 [....xL#..4...8..]D/001120: 602018E1 955018F5 784C02E1 A014D0D6 [`....P..xL......]D/001130: 2018E1E8 B55085DA 65CE48A8 B57885DB [.....P..e.H..x..]D/001140: 65CF48C4 CAE5CBB0 E3A5DA69 FE85DAA9 [e.H........i....]D/001150: FFA865DB 85DBC8B1 DAD9CC00 D00F98F0 [..e.............]D/001160: F56891DA 99CC0088 10F7E860 EAA080D0 [.h.........`....]D/001170: 95A90020 0AE7A002 9478200A E786D8AA [.........x......]D/001180: E6332051 F3C6338A A6D89578 B55185CE [.3.Q..3....x.Q..]D/001190: B57985CF E8E820BC E1B54ED5 76B015F6 [.y........N.v...]D/0011A0: 4EA8B1CE B450C4E4 9004A083 D0C191DA [N....P..........]D/0011B0: F65090E5 B4508A91 DA4C23F2 B55185DA [.P...P...L#..Q..]D/0011C0: 38E90285 E4B57985 DBE90085 E5A000B1 [8.....y.........]D/0011D0: E418E5DA 85E460B5 5385CEB5 7B85CFB5 [......`.S...{...]D/0011E0: 5185DAB5 7985DBE8 E8E8A000 947894A0 [Q...y........x..]D/0011F0: C89450B5 4DD57508 48B54FD5 77900768 [..P.M.u.H.O.w..h]D/001200: 28B00256 5060A8B1 CE85E468 A828B0F3 [(..VP`.....h.(..]D/001210: B1DAC5E4 D0EDF64F F64DB0D7 20D7E14C [.......O.M.....L]D/001220: 36E72054 E206CE26 CF900D18 A5E665DA [6..T...&......e.]D/001230: 85E6A5E7 65DB85E7 88F00906 E626E710 [....e........&..]D/001240: E44C7EE7 A5E62008 E7A5E795 A006E590 [.L~.............]D/001250: 284C6FE7 A95585E5 205BE2A5 CE85DAA5 [(Lo..U...[......]D/001260: CF85DB20 15E784E6 84E7A5CF 1009CA06 [................]D/001270: E5206FE7 2015E7A0 1060206C EEF0C5FF [..o......`.l....]D/001280: E633A000 20CEE3C6 33602034 EE4A0820 [.3......3`.4.J..]D/001290: 47F82034 EEA8B126 2890044A 4A4A4A29 [G..4...&(..JJJJ)]D/0012A0: 0FA00020 08E794A0 8884D760 FFFFFFFF [...........`....]D/0012B0: 20D3EF20 8EFD46D9 A9BE2006 E0A00084 [......F.........]D/0012C0: FA24F810 0CA6F6A5 F7201BE5 A9A020ED [.$..............]D/0012D0: FDA2FF9A 20CEE384 F18A85C8 A2202091 [................]D/0012E0: E4A5C869 0085E0A9 00AA6902 85E1A1E0 [...i......i.....]D/0012F0: 29F0C9B0 F0034C83 E8A002B1 E099CD00 [).....L.........]D/001300: 88D0F820 8AE3A5F1 E5C8C904 F0A891E0 [................]D/001310: A5CAF1E0 85E4A5CB E90085E5 A5E4C5CC [................]D/001320: A5E5E5CD 9045A5CA F1E085E6 A5CBE900 [.....E..........]D/001330: 85E7B1CA 91E6E6CA D002E6CB A5E2C5CA [................]D/001340: A5E3E5CB B0E0B5E4 95CACA10 F9B1E0A8 [................]D/001350: 88B1E091 E698D0F8 24F81009 B5F775F5 [........$.....u.]D/001360: 95F7E8F0 F7107E00 000000A0 14D07120 [......~.......q.]D/001370: 15E7A5E2 85E6A5E3 85E72075 E5A5E285 [...........u....]D/001380: E4A5E385 E5D00E20 15E7206D E5A5E685 [...........m....]D/001390: E2A5E785 E3A000A5 CAC5E4A5 CBE5E5B0 [................]D/0013A0: 16A5E4D0 02C6E5C6 E4A5E6D0 02C6E7C6 [................]D/0013B0: E6B1E491 E690E0A5 E685CAA5 E785CB60 [...............`]D/0013C0: 20EDFDC8 B900EB30 F709804C EDFD98AA [.......0...L....]D/0013D0: 2075FD8A A8A9DF99 0002A2FF 6060A006 [.u..........``..]D/0013E0: 20D3EE24 D930034C B6E24C9A EB2A69A0 [...$.0.L..L..*i.]D/0013F0: DD0002D0 53B1FE0A 300688B1 FE3029C8 [....S...0....0).]D/001400: 86C89848 A200A1FE AA4A4940 11FEC9C0 [...H.....JI@....]D/001410: 9001E8C8 D0F368A8 8A4CF8F2 E6F1A6F1 [......h..L......]D/001420: F0BC9D00 0260A6C8 A9A0E8DD 0002B0FA [.....`..........]D/001430: B1FE293F 4AD0B6BD 0002B006 693FC91A [..)?J.......i?..]D/001440: 906F694F C90A9069 A6FDC8B1 FE29E0C9 [.oiO...i.....)..]D/001450: 20F07AB5 A885C8B5 D185F188 B1FE0A10 [..z.............]D/001460: FA88B038 0A3035B4 5884FFB4 80E810DA [...8.05.X.......]D/001470: F0B3C97E B022CA10 04A00610 299480A4 [...~."......)...]D/001480: FF9458A4 C894A8A4 F194D129 1FA8B997 [..X........)....]D/001490: F10AA8A9 762A85FF D001C8C8 86FDB1FE [....v*..........]D/0014A0: 3084D005 A00E4CE0 E3C903B0 C34AA6C8 [0.....L......J..]D/0014B0: E8BD0002 9004C9A2 F00AC9DF F00686C8 [................]D/0014C0: 201CE4C8 88A6FDB1 FE880A10 CFB45884 [..............X.]D/0014D0: FFB480E8 B1FE299F D0ED85F2 85F39848 [......)........H]D/0014E0: 86FDB4D0 84C918A9 0A85F9A2 00C8B900 [................]D/0014F0: 02290F65 F2488A65 F3301CAA 68C6F9D0 [.).e.H.e.0..h...]D/001500: F285F286 F3C4F1D0 DEA4C9C8 84F1201C [................]D/001510: E468A8A5 F3B0A9A0 00108B85 F386F2A2 [.h..............]D/001520: 0486C9A9 B085F9A5 F2DD63E5 A5F3FD68 [..........c....h]D/001530: E5900D85 F3A5F2FD 63E585F2 E6F9D0E7 [........c.......]D/001540: A5F9E8CA F00EC9B0 F00285C9 24C93004 [............$.0.]D/001550: A5FAF00B 20EDFD24 F8100499 0002C8CA [.......$........]D/001560: 10C16001 0A64E810 00000003 27A5CA85 [..`..d......'...]D/001570: E6A5CB85 E7E8A5E7 85E5A5E6 85E4C54C [...............L]D/001580: A5E5E54D B026A001 B1E4E5CE C8B1E4E5 [...M.&..........]D/001590: CFB019A0 00A5E671 E485E690 03E6E718 [.......q........]D/0015A0: C8A5CEF1 E4C8A5CF F1E4B0CA 6046F8A5 [............`F..]D/0015B0: 4C85CAA5 4D85CBA5 4A85CCA5 4B85CDA9 [L...M...J...K...]D/0015C0: 0085FB85 FC85FEA9 00851D60 A5D04C6B [...........`..Lk]D/0015D0: E3A0FF84 D8C8B1E0 3006C940 D06885D8 [........0..@.h..]D/0015E0: D1D0F0F1 B1D0C84A D0FAB1D0 48C8B1D0 [.......J....H...]D/0015F0: A86885D0 84D1C5CC D0D7C4CD D0D3A000 [.h..............]D/001600: C8B1E030 FB4940F0 F7986904 4865D0A8 [...0.I@...i.He..]D/001610: A5D16900 48C4CAE5 CBB0B384 CC6885CD [..i.H........h..]D/001620: 68A8A900 8891D088 91D088A5 CD91D088 [h...............]D/001630: A5CC91D0 88A90091 D0883097 B1E0D0F7 [..........0.....]D/001640: A54AA44B D0ACB1D0 C940B09A 959F9869 [.J.K.....@.....i]D/001650: 034865D0 200AE720 FFE688D0 FA9865D1 [.He...........e.]D/001660: 95786824 D8301DA8 A900200A E79578B1 [.xh$.0........x.]D/001670: D0100FF6 78C8D0F7 09A90085 D485D5A2 [....x...........]D/001680: 2048A000 B1E01018 0A30B520 FFE62008 [.H.......0......]D/001690: E720FFE6 95A024D4 1001CA20 FFE6B0E6 [......$.........]D/0016A0: C928D01F A5E0200A E7A5E195 7824D430 [.(..........x$.0]D/0016B0: 0BA90120 0AE7A900 9578F678 20FFE630 [.........x.x...0]D/0016C0: F9B0D324 D41006C9 04B0D046 D4A885D6 [...$.......F....]D/0016D0: B980E929 550A85D7 68A8B980 E929AAC5 [...)U...h....)..]D/0016E0: D7B00998 4820EBF3 A5D69095 B900EA85 [....H...........]D/0016F0: CEB980EA 85CF20FC E64CD8E6 6CCE00E6 [.........L..l...]D/001700: E0D002E6 E1B1E060 9477CA30 03955060 [.......`.w.0..P`]D/001710: A0664CE0 E3A000B5 5085CEB5 A085CFB5 [.fL.....P.......]D/001720: 78F00E85 CFB1CE48 C8B1CE85 CF6885CE [x......H.....h..]D/001730: 88E86020 4AE72015 E7982008 E795A0C5 [..`.J...........]D/001740: CED006C5 CFD002F6 50602082 E72059E7 [........P`....Y.]D/001750: 2015E724 CF301BCA 602015E7 A5CFD004 [...$.0..`.......]D/001760: A5CEF0F3 A9FF2008 E795A024 CF30E920 [...........$.0..]D/001770: 15E79838 E5CE2008 E798E5CF 5023A000 [...8........P#..]D/001780: 1090206F E72015E7 A5CE85DA A5CF85DB [...o............]D/001790: 2015E718 A5CE65DA 2008E7A5 CF65DB70 [......e......e.p]D/0017A0: DD95A060 2034EEA8 D0034CCB EE884CF4 [...`.4....L...L.]D/0017B0: F3A52409 07A8C8D0 F5C8D0F5 B0F96000 [..$...........`.]D/0017C0: 0020B1E7 2015E7A5 CF100AA9 AD20EDFD [................]D/0017D0: 2072E750 EF8884D5 86CFA6CE 201BE5A6 [.r.P............]D/0017E0: CF602015 E7A5CE85 F6A5CF85 F78884F8 [.`..............]D/0017F0: C8A90A85 F484F560 2015E7A5 CEA4CF10 [.......`........]D/001800: F22015E7 B55085DA B57885DB A5CE91DA [.....P...x......]D/001810: C8A5CF4C 07F26068 6824D510 05208EFD [...L..`hh$......]D/001820: 46D560A0 FF84D760 20CDEFF0 07A92585 [F.`....`......%.]D/001830: D68884D4 E860A5CA A4CBD05A A041A5FC [.....`.....Z.A..]D/001840: C910B05E A8E6FCA5 E0990001 A5E19910 [...^............]D/001850: 01A5DC99 2001A5DD 99300120 15E7206D [.........0.....m]D/001860: E59004A0 37D03BA5 E4A4E585 DC84DD18 [....7.;.........]D/001870: 69039001 C8A2FF86 D99A85E0 84E1202E [i...............]D/001880: F0A00020 79E624D9 104918A0 00A5DC71 [....y.$..I.....q]D/001890: DCA4DD90 01C8C54C D0D1C44D D0CDA031 [.......L...M...1]D/0018A0: 46D94CE0 E3A04AA5 FCF0F7C6 FCA8B91F [F.L...J.........]D/0018B0: 0185DCB9 2F0185DD BEFF00B9 0F01A88A [..../...........]D/0018C0: 4C75E8A0 6320C4E3 A001B1DC AAC8B1DC [Lu..c...........]D/0018D0: 201BE54C B3E2C6FB A05BA5FB F0C4A8B5 [...L.....[......]D/0018E0: 50D93F01 D0F0B578 D94F01D0 E9B95F01 [P.?....x.O...._.]D/0018F0: 85DAB96F 0185DB20 15E7CA20 93E72001 [...o............]D/001900: E8CAA4FB B9CF0195 9FB9BF01 A0002008 [................]D/001910: E72082E7 2059E720 15E7A4FB A5CEF005 [.....Y..........]D/001920: 596F0110 12B97F01 85DCB98F 0185DDBE [Yo..............]D/001930: 9F01B9AF 01D087C6 FB60A054 A5FBC910 [.........`.T....]D/001940: F09AE6FB A8B55099 4001B578 4C88F260 [......P.@..xL..`]D/001950: 2015E7A4 FBA5CE99 BF01A5CF 99CF01A9 [................]D/001960: 01995F01 A900996F 01A5DC99 7F01A5DD [.._....o........]D/001970: 998F01A5 E0999F01 A5E199AF 01602015 [.............`..]D/001980: 000000AB 03030303 03030303 03030303 [................]D/001990: 03033F3F C0C03C3C 3C3C3C3C 3C300FC0 [..??..<<<<<<<0..]D/0019A0: C3FF5500 ABAB0303 FFFF55FF FF55CFCF [..U.......U..U..]D/0019B0: CFCFCFFF 55C6C6C6 55F0F0CF CF550155 [....U...U....U.U]D/0019C0: FFFF5503 03030303 03030303 03030303 [..U.............]D/0019D0: 03030303 03030303 03030303 0300AB03 [................]D/0019E0: 57030303 03070303 03030303 03030303 [W...............]D/0019F0: 0303AAFF 03030303 03030303 03030303 [................]D/001A00: 17FFFF19 DF420AF2 EC876FAD B7E2F854 [.....B....o....T]D/001A10: 4DC98582 2210334A 5B4E534A 49666D7A [M...".3J[NSJIfmz]D/001A20: 71FF2309 5B16B6CB FFFFFBFF FF24F64E [q.#.[........$.N]D/001A30: 59503BFF 23A36F36 23D71C22 1D8AAB23 [YP;.#.o6#.."...#]D/001A40: FFFF2130 1E03C420 00C1BA39 40A0301E [..!0.......9@.0.]D/001A50: A4D3B6BC AA3A0150 79D8D8A5 3CFF165B [.....:.Py...<..[]D/001A60: 2803C41D 08004E00 3E00A6B0 00BCC657 [(.....N.>......W]D/001A70: 8C0127FF 5D354B67 E0E17604 0571C91A [..'.]5Kg..v..q..]D/001A80: E8FFFFE8 F0F1F3EF EFE3E3E5 E5E7E7EE [................]D/001A90: F0F0E7E7 E2EFE7E7 F2F2F2E7 F2F2F2E2 [................]D/001AA0: F3FFE8E1 E8E8EFEB FFFFE0FF FFEFEEEF [................]D/001AB0: E7E7F3FF E8E7E7E7 E8E1E2EE F3E2E2E8 [................]D/001AC0: FFFFE1E1 EFEEE7E8 EEE7F3FB FBEEE1EF [................]D/001AD0: E7E8EFEF EBE9E8E9 F2E8E8E8 E8FFE8E8 [................]D/001AE0: E8EEE7E8 EFEFEEEF EEEFEEEE EFEEEEEE [................]D/001AF0: E1E8E8FF E0E0E0F1 F2F2F1F3 F3F1F3F4 [................]D/001B00: BEB3B2B7 B637D4CF CFA0CCCF CE47D3D9 [.....7.......G..]D/001B10: CED4C158 CDC5CDA0 C6D5CC4C D4CFCFA0 [...X.......L....]D/001B20: CDC1CED9 A0D0C1D2 C5CE53D3 D4D2C9CE [..........S.....]D/001B30: 47CECFA0 C5CE44C2 C1C4A0C2 D2C1CEC3 [G.....D.........]D/001B40: 48B1B6A0 C7CFD3D5 C253C2C1 C4A0D2C5 [H........S......]D/001B50: D4D5D24E B1B6A0C6 CFD253C2 C1C4A0CE [...N......S.....]D/001B60: C5D854D3 D4CFD0D0 C5C4A0C1 D420AAAA [..T.............]D/001B70: AA20A0C5 D2D20DBE B2B535D2 C1CEC745 [..........5....E]D/001B80: C4C94DD3 D4D2A0CF D6C64CDC 0DD2C5D4 [..M.......L.....]D/001B90: D9D0C5A0 CCC9CEC5 8D3F46D9 90034CC3 [.........?F...L.]D/001BA0: E8A6CF9A A6CEA08D D002A099 20C4E386 [................]D/001BB0: CEBA86CF 2066F384 F1A9FF85 C80A85D9 [.....f..........]D/001BC0: A220A915 2091E4E6 D9A6CEA4 C80A85CE [................]D/001BD0: C8B90002 C980F0D2 49B0C90A B0F0C8C8 [........I.......]D/001BE0: 84C8B900 0248B9FF 01A00020 08E76895 [.....H........h.]D/001BF0: A0A5CEC9 33D00320 6FE74C01 E8FFFFFF [....3...o.L.....]D/001C00: 50204FC0 F4A1E4AF ADF2AFE4 AEA1F0A5 [P.O.............]D/001C10: B4B3EFB4 EEA5A8B4 5C800040 608D608B [........\..@`.`.]D/001C20: 7F1D207E 8C330000 6003BF12 4783AEA9 [...~.3..`...G...]D/001C30: 6783B2B0 E5A3A1B2 B479B0B3 A469B0B3 [g........y...i..]D/001C40: A4E5A3A1 B2B4AFAE 79B0B3A4 AFAE69B0 [........y.....i.]D/001C50: B3A4AFAE F0AFB0F4 B3A9AC60 8C20B4B3 [...........`....]D/001C60: A9AC0040 89C9479D 17689D0A 587B67A2 [...@..G..h..X{g.]D/001C70: A1B4B667 B4A1078C 07AEA9AC B667B4A1 [...g.........g..]D/001C80: 078C07AE A9ACA867 8C07B4AF ACB0679D [.......g......g.]D/001C90: B2AFACAF A3678C07 A5ABAFB0 F4AEA9B2 [.....g..........]D/001CA0: B07F0E27 B4AEA9B2 B07F0E28 B4AEA9B2 [...'.......(....]D/001CB0: B06407A6 A967AFB4 AFA778B4 A5AC6B7F [.d...g....x...k.]D/001CC0: 02ADA5B2 67A2B5B3 AFA7EEB2 B5B4A5B2 [....g...........]D/001CD0: 7E8C39B4 B8A5AE67 B0A5B4B3 27AFB407 [~.9....g....'...]D/001CE0: 9D19B2AF A67F0537 B4B5B0AE A97F0528 [.......7.......(]D/001CF0: B4B5B0AE A97F052A B4B5B0AE A9E4AEA5 [.......*........]D/001D00: 0047A2A1 B47F0D30 ADA9A47F 0D23ADA9 [.G.....0.....#..]D/001D10: A467ACAC A1A3F2A7 F4B8A5B4 004DCC67 [.g...........M.g]D/001D20: 8C688CDB 679B689B 508C638C 7F015107 [.h..g.h.P.c...Q.]D/001D30: 88298480 C4195771 07881471 078C0788 [.)....Wq...q....]D/001D40: AEB2A3B3 710888A3 B3A17108 88AEA5AC [....q.....q.....]D/001D50: 68830868 9D087107 886075B4 AFAE758D [h..h..q..`u...u.]D/001D60: 758B5107 8819B8A4 AEB2ECA4 B0F3A2A1 [u.Q.............]D/001D70: EEA7B3E4 AEB2EBA5 A5B05107 883981C1 [..........Q..9..]D/001D80: 4F7F0F2F 00510688 29C20C82 578C6A8C [O../.Q..)...W.j.]D/001D90: 42AEA5A8 B460AEA5 A8B44F7E 1E358C27 [B....`....O~.5.']D/001DA0: 51078809 8BFEE4AF ADF2AFE4 AEA1DCDE [Q...............]D/001DB0: 9CDD9CDE DD9EC3DD CFCACDCB 00479AAD [.............G..]D/001DC0: A5ADAFAC 679AADA5 ADA9A8EE A1AD608C [....g.........`.]D/001DD0: 20AFB4B5 A1F2ACA3 F7A5AE60 8C20ACA5 [...........`....]D/001DE0: A4EEB5B2 60AEB5B2 EEAFA3E5 B6A1B3E4 [....`...........]D/001DF0: A1AFAC7A 7E9A2220 006003BF 6003BF1F [...z~."..`..`...]D/001E00: 20B1E7E8 E8B54F85 DAB57785 DBB44E98 [......O...w...N.]D/001E10: D576B009 B1DA20ED FDC84C0F EEA9FF85 [.v........L.....]D/001E20: D560E8A9 00957895 A0B57738 F54F9550 [.`....x...w8.O.P]D/001E30: 4C23E8FF 2015E7A5 CFD028A5 CE602034 [L#........(..`.4]D/001E40: EEA4C8C9 30B021C0 28B01D4C 00F82034 [....0.!.(..L...4]D/001E50: EE4C64F8 46F86020 B3F3C918 B00A8525 [.Ld.F.`........%]D/001E60: 4C22FCA0 774CE0E3 A07BD0F9 2054E2A5 [L"..wL...{...T..]D/001E70: DAD007A5 DBD0034C 7EE706CE 26CF26E6 [.......L~...&.&.]D/001E80: 26E7A5E6 C5DAA5E7 E5DB900A 85E7A5E6 [&...............]D/001E90: E5DA85E6 E6CE88D0 E160FFFF FFFFFFFF [.........`......]D/001EA0: 2015E76C CE002034 EEC5C890 BB852C60 [...l...4......,`]D/001EB0: 2034EEC9 30B0B1A4 C84C19F8 2034EEC5 [.4..0....L...4..]D/001EC0: C890A585 2D602034 EEC928B0 9BA8A5C8 [....-`.4..(.....]D/001ED0: 4C28F898 AAA06E20 C4E38AA8 20C4E3A0 [L(....n.........]D/001EE0: 724C61F1 203FF206 CE26CF30 FAB0DCD0 [rLa..?...&.0....]D/001EF0: 04C5CEB0 D6602015 E7B1CE94 9F4C08E7 [.....`.......L..]D/001F00: 2034EEA5 CE85C860 2015E7A5 C891CE60 [.4.....`.......`]D/001F10: 206CEEA5 CE85E6A5 CF85E74C 44E220E4 [.l.........LD...]D/001F20: EE4C34E1 20E4EEB4 78B55069 FEB00188 [.L4.....x.Pi....]D/001F30: 85DA84DB 1865CE95 509865CF 9578A000 [.....e..P.e..x..]D/001F40: B550D1DA C8B578F1 DAB0804C 23E82015 [.P....x....L#...]D/001F50: E7A54E20 08E7A54F D004C54E 6900297F [..N....O...Ni.).]D/001F60: 854F95A0 A011A54F 0A186940 0A264E26 [.O.....O..i@.&N&]D/001F70: 4F88D0F2 A5CE2008 E7A5CF95 A04C7AE2 [O............Lz.]D/001F80: 2015E7A4 CEC44AA5 CFE54B90 1E844CA5 [......J...K...L.]D/001F90: CF854D4C ADE52015 E7A4CEC4 4CA5CFE5 [..ML........L...]D/001FA0: 4DB00884 4AA5CF85 4B90E84C CBEEFFFF [M...J...K..L....]D/001FB0: FFFFFFFF FFFF2071 E14CBFEF 2003EEA9 [.......q.L......]D/001FC0: FF85C8A9 808D0002 602036E7 E82036E7 [........`.6...6.]D/001FD0: B55060A9 00854A85 4CA90885 4BA91085 [.P`...J.L...K...]D/001FE0: 4D4CADE5 D578D001 184C02E1 20B7E54C [ML...x...L.....L]D/001FF0: 36E820B7 E54C5BE8 E080D001 884C0CE0 [6....L[......L..]D/002000: A00084A0 844A844C A908854B 854DE64D [.....J.L...K.M.M]D/002010: B14C49FF 914CD14C D00849FF 914CD14C [.LI..L.L..I..L.L]D/002020: F0EC4CAD E54C79F1 2032F04C BEE8A6E0 [..L..Ly..2.L....]D/002030: A5E1AC00 C0C083D0 EC2C10C0 86508551 [.........,...P.Q]D/002040: A5DC8578 A5DD8579 4CC3E8FF FF2015E7 [...x...yL.......]D/002050: 86D8A2FE 38B5D095 E6B54EF5 D095DCE8 [....8.....N.....]D/002060: D0F3904B CAB5CB95 E7F5DB95 E5E8F0F5 [...K............]D/002070: 900AA5CC C5E4A5CD E5E59013 4C6BE3B1 [............Lk..]D/002080: E691E4E6 E4D002E6 E5E6E6D0 02E6E7A5 [................]D/002090: E6C54CA5 E7E54D90 E6A2FEB5 E6954EB5 [..L...M.......N.]D/0020A0: CCF5DC95 CCE8D0F3 A6D860B1 4C91CEA5 [..........`.L...]D/0020B0: CED002C6 CFC6CEA5 4CD002C6 4DC64CC5 [........L...M.L.]D/0020C0: CAA54DE5 CB90E4B0 D02015E7 A4CEC0CA [..M.............]D/0020D0: A5CFE5CB B0A6844A A5CF854B 4CB7E586 [.......J...KL...]D/0020E0: D8201EF1 20FDFEA2 FF38B54D F5CF95DB [.........8.M....]D/0020F0: E8F0F790 87A5CCC5 DAA5CDE5 DBB0D5A5 [................]D/002100: CED004A5 CFF011A5 DA85CAA5 DB85CB20 [................]D/002110: 2CF120FD FEA6D860 203AFF4C 15F1A0CE [,......`.:.L....]D/002120: 843CC884 3EA00084 3D843F60 B5CA953C [.<..>...=.?`...<]D/002130: B44C943E CA10F5A5 3ED002C6 3FC63E60 [.L.>....>...?.>`]D/002140: 86D838A2 FFB54DF5 CB95CFE8 F0F7201E [..8...M.........]D/002150: F120CDFE A201202C F1A91A20 CFFEA6D8 [.......,........]D/002160: 6020C4E3 4C3AFFA5 FCD0034C A5E8C6FC [`...L:.....L....]D/002170: 60A9FF85 A06046A0 6024A010 19A9A320 [`....`F.`$......]D/002180: EDFDA001 B1DCAAC8 B1DC201B E5A9A04C [...............L]D/002190: EDFDA5DC A4DD60C1 007FD1CC C7CFCEC5 [......`.........]D/0021A0: 9A988D96 9593BFB2 32120FBC B0ACBE35 [........2......5]D/0021B0: 0C613010 0BDDFBA0 0020C7E7 A9A04CED [.a0...........L.]D/0021C0: FD000000 00000000 00A44AA5 4B48C4DA [..........J.KH..]D/0021D0: E5DBB01C 6884D085 D1A0FFC8 B1D030FB [....h.........0.]D/0021E0: C940F0F7 C8C8B1D0 4888B1D0 A868D0DD [.@......H....h..]D/0021F0: 68A000B1 D030054A F008A9A4 20EDFDC8 [h....0.J........]D/002200: D0F1A9BD 4CEDFD91 DAE8B59F F0304CD5 [....L........0L.]D/002210: F3A03007 A5DCA4DD 207DF120 C9F1A6D8 [..0......}......]D/002220: 4CB7F1E8 E8B59FF0 1F4CE0F3 3007A5DC [L........L..0...]D/002230: A4DD207D F120C9F1 A6D84C09 F4E86020 [...}......L...`.]D/002240: 15E7E6CE D002E6CF 60205BF2 D0152053 [........`.[....S]D/002250: F2D01020 82E7206F E7500320 82E72059 [.......o.P.....Y]D/002260: E756504C 36E720C9 EF154F10 0520C9EF [.VPL6.....O.....]D/002270: 354F9550 10ED4CC9 EF2015E7 A4FBA5CE [5O.P..L.........]D/002280: 995F01A5 CF4C66E9 99500188 3051B940 [._...Lf..P..0Q.@]D/002290: 01D550D0 F6B95001 D578D0EF C6FBB941 [..P...P..x.....A]D/0022A0: 01994001 B9510199 5001B9C1 0199C001 [..@..Q..P.......]D/0022B0: B9D10199 D001B961 01996001 B9710199 [.......a..`..q..]D/0022C0: 7001B981 01998001 B9910199 9001B9A1 [p...............]D/0022D0: 0199A001 B9A10199 A001C8C4 FB90BF60 [...............`]D/0022E0: E8A90048 B55038E9 0385CEB5 78E90085 [...H.P8.....x...]D/0022F0: CF68A000 91CEE860 C985B003 4CC0E4A0 [.h.....`....L...]D/002300: 024C48E4 E8A901D0 DAE8A578 85DCA579 [.LH........x...y]D/002310: 85DDA550 A4514C75 E8A901D0 C6B550D5 [...P.QLu......P.]D/002320: 7890034C 68EEA8B5 5185CEB5 7985CFB1 [x..Lh...Q...y...]D/002330: CEA000E8 E82008E7 4C04F420 34EE86D8 [........L...4...]D/002340: 2903AA20 1EFBA6D8 98A00020 08E794A0 [)...............]D/002350: 602075FD 8A48BD00 02C983D0 034C03E0 [`.u..H.......L..]D/002360: CA10F368 AA602080 E298AA20 54F38AA8 [...h.`......T...]D/002370: 602015E7 A5CF1008 98CA2008 E794A060 [`..............`]D/002380: 85D1A5CE 85D02015 E7A5CE85 D2A5CF85 [................]D/002390: D3A90120 08E794A0 A5D0D004 C6D130DF [..............0.]D/0023A0: C6D0A5D2 A0002008 E7A5D395 A02022E2 [..............".]D/0023B0: 4C98F320 34EE1869 FF6020B1 E746D560 [L...4..i.`...F.`]D/0023C0: 86D99A20 2EF04C83 E82034EE 86D82095 [......L...4.....]D/0023D0: FEA6D860 FE24D910 E086D824 A04C12F2 [...`.$.....$.L..]D/0023E0: 24D910D5 86D824A0 4C2CF2A0 004CFFE6 [$.....$.L,...L..]D/0023F0: A8208EFD 9838E521 B0F68424 60000000 [.....8.!...$`...]D/002400: FFFFFFFF 94A04C23 E8A000F0 0420EDFD [......L#........]D/002410: C8B1DA30 F8A9FF85 D5602034 EE86D820 [...0.....`.4....]D/002420: 8BFEA6D8 6018A202 B5F975F5 95F9CA10 [....`.....u.....]D/002430: F76006F3 2037F424 F9100520 A4F4E6F3 [.`...7.$........]D/002440: 38A20494 FBB5F7B4 F394F795 F3CAD0F3 [8...............]D/002450: 60A98E85 F8A5F9C9 C0300CC6 F806FB26 [`........0.....&]D/002460: FA26F9A5 F8D0EE60 20A4F420 7BF4A5F4 [.&.....`....{...]D/002470: C5F8D0F7 2025F450 EA700590 C4A5F90A [.....%.P.p......]D/002480: E6F8F075 A2FA76FF E8D0FB60 2032F465 [...u..v....`.2.e]D/002490: F820E2F4 182084F4 90032025 F48810F5 [...........%....]D/0024A0: 46F390BF 38A203A9 00F5F895 F8CAD0F7 [F...8...........]D/0024B0: F0C52032 F4E5F820 E2F438A2 02B5F5F5 [...2......8.....]D/0024C0: FC48CA10 F8A2FD68 900295F8 E8D0F826 [.H.....h.......&]D/0024D0: FB26FA26 F906F726 F626F5B0 1C88D0DA [.&.&...&.&......]D/0024E0: F0BE86FB 86FA86F9 B00D3004 686890B2 [..........0.hh..]D/0024F0: 498085F8 A0176010 F74CF503 FFFFFFFF [I.....`..L......]D/002500: E9814AD0 14A43FA6 3ED00188 CA8A18E5 [..J...?.>.......]D/002510: 3A853E10 01C898E5 3BD06BA4 2FB93D00 [:.>.....;.k./.=.]D/002520: 913A8810 F8201AFC 201AFC20 D0F82053 [.:.............S]D/002530: F9843B85 3A4C95F5 20BEFFA4 3420A7FF [..;.:L......4...]D/002540: 8434A017 88304BD9 CCFFD0F8 C015D0E8 [.4...0K.........]D/002550: A531A000 C6342000 FE4C95F5 A53D208E [.1...4...L...=..]D/002560: F8AABD00 FAC542D0 13BDC0F9 C543D00C [......B......C..]D/002570: A544A42E C09DF088 C52EF09F C63DD0DC [.D...........=..]D/002580: E644C635 F0D6A434 98AA204A F9A9DE20 [.D.5...4...J....]D/002590: EDFD203A FFA9A185 332067FD 20C7FFAD [...:....3.g.....]D/0025A0: 0002C9A0 F013C8C9 A4F09288 20A7FFC9 [................]D/0025B0: 93D0D58A F0D22078 FEA90385 3D2034F6 [.......x....=.4.]D/0025C0: 0AE9BEC9 C290C10A 0AA2040A 26422643 [............&B&C]D/0025D0: CA10F8C6 3DF0F410 E4A20520 34F68434 [....=.......4..4]D/0025E0: DDB4F9D0 132034F6 DDBAF9F0 0DBDBAF9 [......4.........]D/0025F0: F007C9A4 F003A434 18882644 E003D00D [.......4..&D....]D/002600: 20A7FFA5 3FF001E8 8635A203 88863DCA [....?....5....=.]D/002610: 10C9A544 0A0A0535 C920B006 A635F002 [...D...5.....5..]D/002620: 09808544 8434B900 02C9BBF0 04C98DD0 [...D.4..........]D/002630: 804C5CF5 B90002C8 C9A0F0F8 60207DF4 [.L\.........`.}.]D/002640: A5F81013 C98ED0F5 24F9100A A5FBF006 [........$.......]D/002650: E6FAD002 E6F960A9 0085F985 FA60FFFF [......`......`..]D/002660: FFFFFFFF FFFF4C92 F5845886 57855608 [......L...X.W.V.]D/002670: 688559BA E8E8BD00 010A0A0A 0A60A458 [h.Y..........`.X]D/002680: A657A559 48A55628 60204AFF 68851E68 [.W.YH.V(`.J.h..h]D/002690: 851F2098 F64C92F6 E61ED002 E61FA9F7 [.....L..........]D/0026A0: 48A000B1 1E290F0A AA4A511E F00B861D [H....)...JQ.....]D/0026B0: 4A4A4AA8 B9E1F648 60E61ED0 02E61FBD [JJJ....H`.......]D/0026C0: E4F648A5 1D4A6068 68203FFF 6C1E00B1 [..H..J`hh.?.l...]D/0026D0: 1E950188 B11E9500 9838651E 851E9002 [.........8e.....]D/0026E0: E61F6002 F9049D0D 9E25AF16 B247B951 [..`......%...G.Q]D/0026F0: C02FC95B D285DD6E 0533E870 931EE765 [./.[...n.3.p...e]D/002700: E7E7E710 CAB50085 00B50185 0160A500 [.............`..]D/002710: 9500A501 950160A5 008100A0 00841DF6 [......`.........]D/002720: 00D002F6 0160A100 8500A000 8401F0ED [.....`..........]D/002730: A000F006 2066F7A1 00A82066 F7A10085 [.....f.....f....]D/002740: 008401A0 00841D60 2026F7A1 0085014C [.......`.&.....L]D/002750: 1FF72017 F7A50181 004C1FF7 2066F7A5 [.........L...f..]D/002760: 0081004C 43F7B500 D002D601 D60060A0 [...LC.........`.]D/002770: 0038A500 F5009900 00A501F5 01990100 [.8..............]D/002780: 98690085 1D60A500 75008500 A5017501 [.i...`..u.....u.]D/002790: A000F0E9 A51E2019 F7A51F20 19F718B0 [................]D/0027A0: 0EB11E10 0188651E 851E9865 1F851F60 [......e....e...`]D/0027B0: B0EC600A AAB50110 E8600AAA B50130E1 [..`......`....0.]D/0027C0: 600AAAB5 001501F0 D8600AAA B5001501 [`........`......]D/0027D0: D0CF600A AAB50035 0149FFF0 C4600AAA [..`....5.I...`..]D/0027E0: B5003501 49FFD0B9 60A21820 66F7A100 [..5.I...`...f...]D/0027F0: 851F2066 F7A10085 1E604CC7 F6F6FFFF [...f.....`L.....]D/002800: 4A082047 F828A90F 900269E0 852EB126 [J..G.(....i....&]D/002810: 4530252E 51269126 602000F8 C42CB011 [E0%.Q&.&`....,..]D/002820: C8200EF8 90F66901 482000F8 68C52D90 [......i.H...h.-.]D/002830: F560A02F D002A027 842DA027 A9008530 [.`./...'.-.'...0]D/002840: 2028F888 10F66048 4A290309 04852768 [.(....`HJ)....'h]D/002850: 29189002 697F8526 0A0A0526 852660A5 [)...i..&...&.&`.]D/002860: 30186903 290F8530 0A0A0A0A 05308530 [0.i.)..0.....0.0]D/002870: 604A0820 47F8B126 2890044A 4A4A4A29 [`J..G..&(..JJJJ)]D/002880: 0F60A63A A43B2096 FD2048F9 A13AA84A [.`.:.;....H..:.J]D/002890: 90096AB0 10C9A2F0 0C29874A AABD62F9 [..j......).J..b.]D/0028A0: 2079F8D0 04A080A9 00AABDA6 F9852E29 [.y.............)]D/0028B0: 03852F98 298FAA98 A003E08A F00B4A90 [../.).........J.]D/0028C0: 084A4A09 2088D0FA C888D0F2 60FFFFFF [.JJ.........`...]D/0028D0: 2082F848 B13A20DA FDA20120 4AF9C42F [...H.:......J../]D/0028E0: C890F1A2 03C00490 F268A8B9 C0F9852C [.........h.....,]D/0028F0: B900FA85 2DA900A0 05062D26 2C2A88D0 [....-.....-&,*..]D/002900: F869BF20 EDFDCAD0 EC2048F9 A42FA206 [.i........H../..]D/002910: E003F01C 062E900E BDB3F920 EDFDBDB9 [................]D/002920: F9F00320 EDFDCAD0 E7608830 E720DAFD [.........`.0....]D/002930: A52EC9E8 B13A90F2 2056F9AA E8D001C8 [.....:...V......]D/002940: 9820DAFD 8A4CDAFD A203A9A0 20EDFDCA [.....L..........]D/002950: D0F86038 A52FA43B AA100188 653A9001 [..`8./.;....e:..]D/002960: C8600420 54300D80 04900322 54330D80 [.`..T0....."T3..]D/002970: 04900420 54330D80 04900420 543B0D80 [....T3......T;..]D/002980: 04900022 44330DC8 44001122 44330DC8 [..."D3..D.."D3..]D/002990: 44A90122 44330D80 04900122 44330D80 [D.."D3....."D3..]D/0029A0: 04902631 879A0021 81820000 594D9192 [..&1...!....YM..]D/0029B0: 864A859D ACA9ACA3 A8A4D900 D8A4A400 [.J..............]D/0029C0: 1C8A1C23 5D8B1BA1 9D8A1D23 9D8B1DA1 [...#]......#....]D/0029D0: 002919AE 69A81923 24531B23 245319A1 [.)..i..#$S.#$S..]D/0029E0: 001A5B5B A5692424 AEAEA8AD 29007C00 [..[[.i$$....).|.]D/0029F0: 159C6D9C A5692953 84133411 A56923A0 [..m..i)S..4..i#.]D/002A00: D8625A48 26629488 5444C854 6844E894 [.bZH&b..TD.ThD..]D/002A10: 00B40884 74B4286E 74F4CC4A 72F2A48A [....t.(nt..Jr...]D/002A20: 00AAA2A2 74747472 4468B232 B2002200 [....tttrDh.2..".]D/002A30: 1A1A2626 727288C8 C4CA2648 4444A2C8 [..&&rr....&HDD..]D/002A40: FFFFFF20 D0F86885 2C68852D A208BD10 [......h.,h.-....]D/002A50: FB953CCA D0F8A13A F042A42F C920F059 [..<....:.B./...Y]D/002A60: C960F045 C94CF05C C96CF059 C940F035 [.`.E.L.\.l.Y.@.5]D/002A70: 291F4914 C904F002 B13A993C 008810F8 [).I......:.<....]D/002A80: 203FFF4C 3C008545 68480A0A 0A30036C [.?.L<..EhH...0.l]D/002A90: FE032820 4CFF6885 3A68853B 2082F820 [..(.L.h.:h.;....]D/002AA0: DAFA4C65 FF186885 4868853A 68853BA5 [..Le..h.Hh.:h.;.]D/002AB0: 2F2056F9 843B1890 14182054 F9AA9848 [/.V..;.....T...H]D/002AC0: 8A48A002 18B13AAA 88B13A86 3B853AB0 [.H....:...:.;.:.]D/002AD0: F3A52D48 A52C4820 8EFDA945 8540A900 [..-H.,H....E.@..]D/002AE0: 8541A2FB A9A020ED FDBD1EFA 20EDFDA9 [.A..............]D/002AF0: BD20EDFD B54A20DA FDE830E8 6018A001 [.....J....0.`...]D/002B00: B13A2056 F9853A98 38B0A220 4AFF38B0 [.:.V..:.8...J.8.]D/002B10: 9EEAEA4C 0BFB4CFD FAC1D8D9 D0D3AD70 [...L..L........p]D/002B20: C0A000EA EABD64C0 1004C8D0 F88860A9 [......d.......`.]D/002B30: 008548AD 56C0AD54 C0AD51C0 A900F00B [..H.V..T..Q.....]D/002B40: AD50C0AD 53C02036 F8A91485 22A90085 [.P..S..6...."...]D/002B50: 20A92885 21A91885 23A91785 254C22FC [..(.!...#...%L".]D/002B60: 20A4FBA0 10A5504A 900C18A2 FEB55475 [......PJ......Tu]D/002B70: 569554E8 D0F7A203 7650CA10 FB88D0E5 [V.T.....vP......]D/002B80: 6020A4FB A0100650 26512652 265338A5 [`......P&Q&R&S8.]D/002B90: 52E554AA A553E555 90068652 8553E650 [R.T..S.U...R.S.P]D/002BA0: 88D0E360 A000842F A25420AF FBA250B5 [...`.../.T....P.]D/002BB0: 01100D38 98F50095 0098F501 9501E62F [...8.........../]D/002BC0: 60484A29 03090485 29682918 9002697F [`HJ)....)h)...i.]D/002BD0: 85280A0A 05288528 60C987D0 12A94020 [.(...(.(`.....@.]D/002BE0: A8FCA0C0 A90C20A8 FCAD30C0 88D0F560 [..........0....`]D/002BF0: A4249128 E624A524 C521B066 60C9A0B0 [.$.(.$.$.!.f`...]D/002C00: EFA810EC C98DF05A C98AF05A C988D0C9 [.......Z...Z....]D/002C10: C62410E8 A5218524 C624A522 C525B00B [.$...!.$.$.".%..]D/002C20: C625A525 20C1FB65 20852860 49C0F028 [.%.%...e..(`I..(]D/002C30: 69FD90C0 F0DA69FD 902CF0DE 69FD905C [i.....i..,..i..\]D/002C40: D0E9A424 A5254820 24FC209E FCA00068 [...$.%H.$......h]D/002C50: 6900C523 90F0B0CA A5228525 A0008424 [i..#.....".%...$]D/002C60: F0E4A900 8524E625 A525C523 90B6C625 [.....$.%.%.#...%]D/002C70: A5224820 24FCA528 852AA529 852BA421 [."H.$..(.*.).+.!]D/002C80: 88686901 C523B00D 482024FC B128912A [.hi..#..H.$..(.*]D/002C90: 8810F930 E1A00020 9EFCB086 A424A9A0 [...0.........$..]D/002CA0: 9128C8C4 2190F960 3848E901 D0FC68E9 [.(..!..`8H....h.]D/002CB0: 01D0F660 E642D002 E643A53C C53EA53D [...`.B...C.<.>.=]D/002CC0: E53FE63C D002E63D 60A04B20 DBFCD0F9 [.?.<...=`.K.....]D/002CD0: 69FEB0F5 A02120DB FCC8C888 D0FD9005 [i....!..........]D/002CE0: A03288D0 FDAC20C0 A02CCA60 A2084820 [.2.......,.`..H.]D/002CF0: FAFC682A A03ACAD0 F56020FD FC88AD60 [..h*.:...`.....`]D/002D00: C0452F10 F8452F85 2FC08060 A424B128 [.E/..E/./..`.$.(]D/002D10: 48293F09 40912868 6C3800E6 4ED002E6 [H)?.@.(hl8..N...]D/002D20: 4F2C00C0 10F59128 AD00C02C 10C06020 [O,.....(...,..`.]D/002D30: 0CFD202C FC200CFD C99BF0F3 60A53248 [...,........`.2H]D/002D40: A9FF8532 BD000220 EDFD6885 32BD0002 [...2......h.2...]D/002D50: C988F01D C998F00A E0F89003 203AFFE8 [.............:..]D/002D60: D013A9DC 20EDFD20 8EFDA533 20EDFDA2 [...........3....]D/002D70: 018AF0F3 CA2035FD C995D002 B128C9E0 [......5......(..]D/002D80: 900229DF 9D0002C9 8DD0B220 9CFCA98D [..).............]D/002D90: D05BA43D A63C208E FD2040F9 A000A9AD [.[.=.<....@.....]D/002DA0: 4CEDFDA5 3C090785 3EA53D85 3FA53C29 [L...<...>.=.?.<)]D/002DB0: 07D00320 92FDA9A0 20EDFDB1 3C20DAFD [............<...]D/002DC0: 20BAFC90 E8604A90 EA4A4AA5 3E900249 [.....`J..JJ.>..I]D/002DD0: FF653C48 A9BD20ED FD68484A 4A4A4A20 [.e.]D/002E10: 40E640D0 02E64160 A434B9FF 01853160 [@.@...A`.4....1`]D/002E20: A201B53E 95429544 CA10F760 B13C9142 [...>.B.D...`.<.B]D/002E30: 20B4FC90 F760B13C D142F01C 2092FDB1 [.....`.<.B......]D/002E40: 3C20DAFD A9A020ED FDA9A820 EDFDB142 [<..............B]D/002E50: 20DAFDA9 A920EDFD 20B4FC90 D9602075 [.............`.u]D/002E60: FEA91448 20D0F820 53F9853A 843B6838 [...H....S..:.;h8]D/002E70: E901D0EF 608AF007 B53C953A CA10F960 [....`....<.:...`]D/002E80: A03FD002 A0FF8432 60A90085 3EA238A0 [.?.....2`...>.8.]D/002E90: 1BD008A9 00853EA2 36A0F0A5 3E290FF0 [......>.6...>)..]D/002EA0: 0609C0A0 00F002A9 FD940095 0160EAEA [.............`..]D/002EB0: 4C00E04C 03E02075 FE203FFF 6C3A004C [L..L...u..?.l:.L]D/002EC0: D7FAC634 2075FE4C 43FA4CF8 03A94020 [...4.u.LC.L...@.]D/002ED0: C9FCA027 A200413C 48A13C20 EDFE20BA [...'..A&?....1...?.=]D/002FA0: 9541E8F0 F3D006A2 00863E86 3FB90002 [.A........>.?...]D/002FB0: C849B0C9 0A90D369 88C9FAB0 CD60A9FE [.I.....i.....`..]D/002FC0: 48B9E3FF 48A531A0 00843160 BCB2BEED [H...H.1...1`....]D/002FD0: EFC4ECA9 BBA6A406 95070205 F000EB93 [................]D/002FE0: A7C699B2 C9BEC135 8CC396AF 17172B1F [.......5......+.]D/002FF0: 837F5DCC B5FC1717 F503FB03 59FF86FA [..].........Y...]Brought to you by:dtcdumpfile 1.0.0 (Apple Macintosh File Hex Dumper) Sunday, July 6, 1997+------------------------------------------------------------------------| TOPIC -- Apple II -- Memory map of the Apple II ROMs +------------------------------------------------------------------------Memory map of the Apple II ROMs* $F800-$FFFFMonitor. Handles screen I/O and keyboard input. Also has a disassembler, memory dump, memory move, memory compare, step and trace functions, lo-res graphics routines, multiply and divide routines, and more. This monitor has the cleanest code of all the Apple II monitors. Every one after this had to patch the monitor to add functions while still remaining (mostly) compatible. Complete source code is in the manual. * $F689-F7FCSweet-16 interpreter. Sweet-16 code has been benchmarked to be about half the size of pure 6502 code but 5-8 times slower. The renumber routine in the Programmer's Aid #1 is written in Sweet-16, where small size was much more important than speed. Complete source code is in the manual. * $F500-F63C and $F666-F668Mini-assembler. This lets you type in assembly code, one line at a time, and it will assemble the proper bytes. No labels or equates are supported--it is a MINI assembler. Complete source code is in the manual. * $F425-F4FB and $F63D-F65DFloating point routines. Woz's first plans for his 6502 BASIC included floating point, but he abandoned them when he realized he could finish faster by going integer only. He put these routines in the ROMs but they are not called from anywhere. Complete source code is in the manual. * $E000-F424Integer BASIC by Woz (Steve Wozniak, creator of the Apple II). "That BASIC, which we shipped with the first Apple II's, was never assembled--ever. There was one handwritten copy, all handwritten, all hand assembled." Woz, October 1984. * $D800-DFFFEmpty ROM socket. There was at least one third party ROM add-on. * $D000-D7FFProgrammer's Aid #1--missing from the original Apple II, this is a ROM add-on Apple sold that contains Integer BASIC utilities such as high-resolution graphics support, renumber, append, tape verify, music, and a RAM test. Complete source code is in the manual. +------------------------------------------------------------------------| TOPIC -- Apple II -- Summary of Monitor Commands +------------------------------------------------------------------------Summary of Apple II Monitor CommandsExamining Memory.* {adrs}Examines the value contained in one location. * {adrs1}.{adrs2}Displays the values contained in all locations between {adrs1} and {adrs2}. * [RETURN]Displays the values in up to eight locations following the last opened location. Changing the Contents of Memory.* {adrs}:{val} {val} ...Stores the values in consecutive memory locations starting at {adrs}. * :{val} {val}Stores values in memory starting at the next changeable location. Moving and Comparing.* {dest}<{start}.{end}MCopies the values in the range {start}.{end} into the range beginning at {dest}. (M=move) * {dest}<{start}.{end}VCompares the values in the range {start}.{end} to those in the range beginning at {dest}. (V=verify) Saving and Loading via Cassette Tape.* {start}.{end}WWrites the values in the memory range {start}.{end} onto tape, preceded by a ten-second leader. * {start}.{end}RReads values from tape, storing them in memory beginning at {start} and stopping at {end}. Prints "ERR" if an error occurs. Running and Listing Programs.* {adrs}GTransfers control to the machine language program beginning at {adrs}. (G=go) * {adrs}LDisassembles and displays 20 instructions, starting at {adrs}. Subsequent L's will display 20 more instructions each. (L=list) Miscellaneous.* {adrs}SDisassemble, display, and execute the instruction at {adrs}, and display the contents of the 6502's internal registers. Subsequent S's will display and execute successive instructions. (S=step) * {adrs}TStep infinitely. The TRACE command stops only when it executes a BRK instruction or when you press RESET. (T=trace) * Contrl-EDisplays the contents of the 6502's registers. (E=examine) * ISet Inverse display mode. * NSet Normal display mode. Also useful as a delimiter for putting multiple commands on one line. * Control-BEnter the language currently installed in the Apple's ROM (cold start at $E000). * Control-CReenter the language currently installed in the Apple's ROM (warm start at $E003). * {val1}+{val2}Add the two values and print the result. * {val2}-{val1}Subtract the second value from the first and print the result. * {slot} Control-PDivert output to the device whose interface card in in slot number {slot}. If {slot}=0, then route output to the Apple's screen. * {slot} Control-KAccept input from the device whose interface card is in slot number {slot}. If {slot}=0, then accept input from the Apple's keyboard. * Control-YJump to the machine language subroutine at location $03F8. This lets you add your own commands to the Monitor. The Mini-Assembler.* F666GInvoke the Mini-Assembler. * ${command}Execute a Monitor command from the Mini-Assembler. * FF69GLeave the Mini-Assembler. +------------------------------------------------------------------------| TOPIC -- Apple II -- Red Book Monitor listing +------------------------------------------------------------------------ 1 *************************** 2 * * 3 * APPLE II * 4 * SYSTEM MONITOR * 5 * * 6 * COPYRIGHT 1977 BY * 7 * APPLE COMPUTER, INC. * 8 * * 9 * ALL RIGHTS RESERVED * 10 * * 11 * S. WOZNIAK * 12 * A. BAUM * 13 * * 14 *************************** 15 ; TITLE "APPLE II SYSTEM MONITOR" 16 LOC0 EQU $00 17 LOC1 EQU $01 18 WNDLFT EQU $20 19 WNDWDTH EQU $21 20 WNDTOP EQU $22 21 WNDBTM EQU $23 22 CH EQU $24 23 CV EQU $25 24 GBASL EQU $26 25 GBASH EQU $27 26 BASL EQU $28 27 BASH EQU $29 28 BAS2L EQU $2A 29 BAS2H EQU $2B 30 H2 EQU $2C 31 LMNEM EQU $2C 32 RTNL EQU $2C 33 V2 EQU $2D 34 RMNEM EQU $2D 35 RTNH EQU $2D 36 MASK EQU $2E 37 CHKSUM EQU $2E 38 FORMAT EQU $2E 39 LASTIN EQU $2F 40 LENGTH EQU $2F 41 SIGN EQU $2F 42 COLOR EQU $30 43 MODE EQU $31 44 INVFLG EQU $32 45 PROMPT EQU $33 46 YSAV EQU $34 47 YSAV1 EQU $35 48 CSWL EQU $36 49 CSWH EQU $37 50 KSWL EQU $38 51 KSWH EQU $39 52 PCL EQU $3A 53 PCH EQU $3B 54 XQT EQU $3C 55 A1L EQU $3C 56 A1H EQU $3D 57 A2L EQU $3E 58 A2H EQU $3F 59 A3L EQU $40 60 A3H EQU $41 61 A4L EQU $42 62 A4H EQU $43 63 A5L EQU $44 64 A5H EQU $45 65 ACC EQU $45 66 XREG EQU $46 67 YREG EQU $47 68 STATUS EQU $48 69 SPNT EQU $49 70 RNDL EQU $4E 71 RNDH EQU $4F 72 ACL EQU $50 73 ACH EQU $51 74 XTNDL EQU $52 75 XTNDH EQU $53 76 AUXL EQU $54 77 AUXH EQU $55 78 PICK EQU $95 79 IN EQU $0200 80 USRADR EQU $03F8 81 NMI EQU $03FB 82 IRQLOC EQU $03FE 83 IOADR EQU $C000 84 KBD EQU $C000 85 KBDSTRB EQU $C010 86 TAPEOUT EQU $C020 87 SPKR EQU $C030 88 TXTCLR EQU $C050 89 TXTSET EQU $C051 90 MIXCLR EQU $C052 91 MIXSET EQU $C053 92 LOWSCR EQU $C054 93 HISCR EQU $C055 94 LORES EQU $C056 95 HIRES EQU $C057 96 TAPEIN EQU $C060 97 PADDL0 EQU $C064 98 PTRIG EQU $C070 99 BASIC EQU $E000 100 BASIC2 EQU $E003 101 ORG $F800 ;ROM START ADDRESSF800: 4A 102 PLOT LSR ;Y-COORD/2F801: 08 103 PHP ;SAVE LSB IN CARRYF802: 20 47 F8 104 JSR GBASCALC ;CALC BASE ADR IN GBASL,HF805: 28 105 PLP ;RESTORE LSB FROM CARRYF806: A9 0F 106 LDA #$0F ;MASK $0F IF EVENF808: 90 02 107 BCC RTMASKF80A: 69 E0 108 ADC #$E0 ;MASK $F0 IF ODDF80C: 85 2E 109 RTMASK STA MASKF80E: B1 26 110 PLOT1 LDA (GBASL),Y ;DATAF810: 45 30 111 EOR COLOR ; EOR COLORF812: 25 2E 112 AND MASK ; AND MASKF814: 51 26 113 EOR (GBASL),Y ; EOR DATAF816: 91 26 114 STA (GBASL),Y ; TO DATAF818: 60 115 RTSF819: 20 00 F8 116 HLINE JSR PLOT ;PLOT SQUAREF81C: C4 2C 117 HLINE1 CPY H2 ;DONE?F81E: B0 11 118 BCS RTS1 ; YES, RETURNF820: C8 119 INY ; NO, INC INDEX (X-COORD)F821: 20 0E F8 120 JSR PLOT1 ;PLOT NEXT SQUAREF824: 90 F6 121 BCC HLINE1 ;ALWAYS TAKENF826: 69 01 122 VLINEZ ADC #$01 ;NEXT Y-COORDF828: 48 123 VLINE PHA ; SAVE ON STACKF829: 20 00 F8 124 JSR PLOT ; PLOT SQUAREF82C: 68 125 PLAF82D: C5 2D 126 CMP V2 ;DONE?F82F: 90 F5 127 BCC VLINEZ ; NO, LOOPF831: 60 128 RTS1 RTSF832: A0 2F 129 CLRSCR LDY #$2F ;MAX Y, FULL SCRN CLRF834: D0 02 130 BNE CLRSC2 ;ALWAYS TAKENF836: A0 27 131 CLRTOP LDY #$27 ;MAX Y, TOP SCREEN CLRF838: 84 2D 132 CLRSC2 STY V2 ;STORE AS BOTTOM COORD 133 ; FOR VLINE CALLSF83A: A0 27 134 LDY #$27 ;RIGHTMOST X-COORD (COLUMN)F83C: A9 00 135 CLRSC3 LDA #$00 ;TOP COORD FOR VLINE CALLSF83E: 85 30 136 STA COLOR ;CLEAR COLOR (BLACK)F840: 20 28 F8 137 JSR VLINE ;DRAW VLINEF843: 88 138 DEY ;NEXT LEFTMOST X-COORDF844: 10 F6 139 BPL CLRSC3 ;LOOP UNTIL DONEF846: 60 140 RTSF847: 48 141 GBASCALC PHA ;FOR INPUT 000DEFGHF848: 4A 142 LSRF849: 29 03 143 AND #$03F84B: 09 04 144 ORA #$04 ; GENERATE GBASH=000001FGF84D: 85 27 145 STA GBASHF84F: 68 146 PLA ; AND GBASL=HDEDE000F850: 29 18 147 AND #$18F852: 90 02 148 BCC GBCALCF854: 69 7F 149 ADC #$7FF856: 85 26 150 GBCALC STA GBASLF858: 0A 151 ASLF859: 0A 152 ASLF85A: 05 26 153 ORA GBASLF85C: 85 26 154 STA GBASLF85E: 60 155 RTSF85F: A5 30 156 NXTCOL LDA COLOR ;INCREMENT COLOR BY 3F861: 18 157 CLCF862: 69 03 158 ADC #$03F864: 29 0F 159 SETCOL AND #$0F ;SETS COLOR=17*A MOD 16F866: 85 30 160 STA COLORF868: 0A 161 ASL ;BOTH HALF BYTES OF COLOR EQUALF869: 0A 162 ASLF86A: 0A 163 ASLF86B: 0A 164 ASLF86C: 05 30 165 ORA COLORF86E: 85 30 166 STA COLORF870: 60 167 RTSF871: 4A 168 SCRN LSR ;READ SCREEN Y-COORD/2F872: 08 169 PHP ;SAVE LSB (CARRY)F873: 20 47 F8 170 JSR GBASCALC ;CALC BASE ADDRESSF876: B1 26 171 LDA (GBASL),Y ;GET BYTEF878: 28 172 PLP ;RESTORE LSB FROM CARRYF879: 90 04 173 SCRN2 BCC RTMSKZ ;IF EVEN, USE LO HF87B: 4A 174 LSRF87C: 4A 175 LSRF87D: 4A 176 LSR ;SHIFT HIGH HALF BYTE DOWNF87E: 4A 177 LSRF87F: 29 0F 178 RTMSKZ AND #$0F ;MASK 4-BITSF881: 60 179 RTSF882: A6 3A 180 INSDS1 LDX PCL ;PRINT PCL,HF884: A4 3B 181 LDY PCHF886: 20 96 FD 182 JSR PRYX2F889: 20 48 F9 183 JSR PRBLNK ;FOLLOWED BY A BLANKF88C: A1 3A 184 LDA (PCL,X) ;GET OP CODEF88E: A8 185 INSDS2 TAYF88F: 4A 186 LSR ;EVEN/ODD TESTF890: 90 09 187 BCC IEVENF892: 6A 188 ROR ;BIT 1 TESTF893: B0 10 189 BCS ERR ;XXXXXX11 INVALID OPF895: C9 A2 190 CMP #$A2F897: F0 0C 191 BEQ ERR ;OPCODE $89 INVALIDF899: 29 87 192 AND #$87 ;MASK BITSF89B: 4A 193 IEVEN LSR ;LSB INTO CARRY FOR L/R TESTF89C: AA 194 TAXF89D: BD 62 F9 195 LDA FMT1,X ;GET FORMAT INDEX BYTEF8A0: 20 79 F8 196 JSR SCRN2 ;R/L H-BYTE ON CARRYF8A3: D0 04 197 BNE GETFMTF8A5: A0 80 198 ERR LDY #$80 ;SUBSTITUTE $80 FOR INVALID OPSF8A7: A9 00 199 LDA #$00 ;SET PRINT FORMAT INDEX TO 0F8A9: AA 200 GETFMT TAXF8AA: BD A6 F9 201 LDA FMT2,X ;INDEX INTO PRINT FORMAT TABLEF8AD: 85 2E 202 STA FORMAT ;SAVE FOR ADR FIELD FORMATTINGF8AF: 29 03 203 AND #$03 ;MASK FOR 2-BIT LENGTH 204 ; (P=1 BYTE, 1=2 BYTE, 2=3 BYTE)F8B1: 85 2F 205 STA LENGTHF8B3: 98 206 TYA ;OPCODEF8B4: 29 8F 207 AND #$8F ;MASK FOR 1XXX1010 TESTF8B6: AA 208 TAX ; SAVE ITF8B7: 98 209 TYA ;OPCODE TO A AGAINF8B8: A0 03 210 LDY #$03F8BA: E0 8A 211 CPX #$8AF8BC: F0 0B 212 BEQ MNNDX3F8BE: 4A 213 MNNDX1 LSRF8BF: 90 08 214 BCC MNNDX3 ;FORM INDEX INTO MNEMONIC TABLEF8C1: 4A 215 LSRF8C2: 4A 216 MNNDX2 LSR ;1) 1XXX1010->00101XXXF8C3: 09 20 217 ORA #$20 ;2) XXXYYY01->00111XXXF8C5: 88 218 DEY ;3) XXXYYY10->00110XXXF8C6: D0 FA 219 BNE MNNDX2 ;4) XXXYY100->00100XXXF8C8: C8 220 INY ;5) XXXXX000->000XXXXXF8C9: 88 221 MNNDX3 DEYF8CA: D0 F2 222 BNE MNNDX1F8CC: 60 223 RTSF8CD: FF FF FF 224 DFB $FF,$FF,$FFF8D0: 20 82 F8 225 INSTDSP JSR INSDS1 ;GEN FMT, LEN BYTESF8D3: 48 226 PHA ;SAVE MNEMONIC TABLE INDEXF8D4: B1 3A 227 PRNTOP LDA (PCL),YF8D6: 20 DA FD 228 JSR PRBYTEF8D9: A2 01 229 LDX #$01 ;PRINT 2 BLANKSF8DB: 20 4A F9 230 PRNTBL JSR PRBL2F8DE: C4 2F 231 CPY LENGTH ;PRINT INST (1-3 BYTES)F8E0: C8 232 INY ;IN A 12 CHR FIELDF8E1: 90 F1 233 BCC PRNTOPF8E3: A2 03 234 LDX #$03 ;CHAR COUNT FOR MNEMONIC PRINTF8E5: C0 04 235 CPY #$04F8E7: 90 F2 236 BCC PRNTBLF8E9: 68 237 PLA ;RECOVER MNEMONIC INDEXF8EA: A8 238 TAYF8EB: B9 C0 F9 239 LDA MNEML,YF8EE: 85 2C 240 STA LMNEM ;FETCH 3-CHAR MNEMONICF8F0: B9 00 FA 241 LDA MNEMR,Y ; (PACKED IN 2-BYTES)F8F3: 85 2D 242 STA RMNEMF8F5: A9 00 243 PRMN1 LDA #$00F8F7: A0 05 244 LDY #$05F8F9: 06 2D 245 PRMN2 ASL RMNEM ;SHIFT 5 BITS OFF8FB: 26 2C 246 ROL LMNEM ; CHARACTER INTO AF8FD: 2A 247 ROL ; (CLEARS CARRY)F8FE: 88 248 DEYF8FF: D0 F8 249 BNE PRMN2F901: 69 BF 250 ADC #$BF ;ADD "?" OFFSETF903: 20 ED FD 251 JSR COUT ;OUTPUT A CHAR OF MNEMF906: CA 252 DEXF907: D0 EC 253 BNE PRMN1F909: 20 48 F9 254 JSR PRBLNK ;OUTPUT 3 BLANKSF90C: A4 2F 255 LDY LENGTHF90E: A2 06 256 LDX #$06 ;CNT FOR 6 FORMAT BITSF910: E0 03 257 PRADR1 CPX #$03F912: F0 1C 258 BEQ PRADR5 ;IF X=3 THEN ADDR.F914: 06 2E 259 PRADR2 ASL FORMATF916: 90 0E 260 BCC PRADR3F918: BD B3 F9 261 LDA CHAR1-1,XF91B: 20 ED FD 262 JSR COUTF91E: BD B9 F9 263 LDA CHAR2-1,XF921: F0 03 264 BEQ PRADR3F923: 20 ED FD 265 JSR COUTF926: CA 266 PRADR3 DEXF927: D0 E7 267 BNE PRADR1F929: 60 268 RTSF92A: 88 269 PRADR4 DEYF92B: 30 E7 270 BMI PRADR2F92D: 20 DA FD 271 JSR PRBYTEF930: A5 2E 272 PRADR5 LDA FORMATF932: C9 E8 273 CMP #$E8 ;HANDLE REL ADR MODEF934: B1 3A 274 LDA (PCL),Y ;SPECIAL (PRINT TARGET,F936: 90 F2 275 BCC PRADR4 ; NOT OFFSET)F938: 20 56 F9 276 RELADR JSR PCADJ3F93B: AA 277 TAX ;PCL,PCH+OFFSET+1 TO A,YF93C: E8 278 INXF93D: D0 01 279 BNE PRNTYX ;+1 TO Y,XF93F: C8 280 INYF940: 98 281 PRNTYX TYAF941: 20 DA FD 282 PRNTAX JSR PRBYTE ;OUTPUT TARGET ADRF944: 8A 283 PRNTX TXA ; OF BRANCH AND RETURNF945: 4C DA FD 284 JMP PRBYTEF948: A2 03 285 PRBLNK LDX #$03 ;BLANK COUNTF94A: A9 A0 286 PRBL2 LDA #$A0 ;LOAD A SPACEF94C: 20 ED FD 287 PRBL3 JSR COUT ;OUTPUT A BLANKF94F: CA 288 DEXF950: D0 F8 289 BNE PRBL2 ;LOOP UNTIL COUNT=0F952: 60 290 RTSF953: 38 291 PCADJ SEC ;0=1-BYTE, 1=2-BYTEF954: A5 2F 292 PCADJ2 LDA LENGTH ; 2=3-BYTEF956: A4 3B 293 PCADJ3 LDY PCHF958: AA 294 TAX ;TEST DISPLACEMENT SIGNF959: 10 01 295 BPL PCADJ4 ; (FOR REL BRANCH)F95B: 88 296 DEY ;EXTEND NEG BY DEC PCHF95C: 65 3A 297 PCADJ4 ADC PCLF95E: 90 01 298 BCC RTS2 ;PCL+LENGTH(OR DISPL)+1 TO AF960: C8 299 INY ; CARRY INTO Y (PCH)F961: 60 300 RTS2 RTS 301 * FMT1 BYTES: XXXXXXY0 INSTRS 302 * IF Y=0 THEN LEFT HALF BYTE 303 * IF Y=1 THEN RIGHT HALF BYTE 304 * (X=INDEX)F962: 04 20 54 305 FMT1 DFB $04,$20,$54,$30,$0DF965: 30 0DF967: 80 04 90 306 DFB $80,$04,$90,$03,$22F96A: 03 22F96C: 54 33 0D 307 DFB $54,$33,$0D,$80,$04F96F: 80 04F971: 90 04 20 308 DFB $90,$04,$20,$54,$33F974: 54 33F976: 0D 80 04 309 DFB $0D,$80,$04,$90,$04F979: 90 04F97B: 20 54 3B 310 DFB $20,$54,$3B,$0D,$80F97E: 0D 80F980: 04 90 00 311 DFB $04,$90,$00,$22,$44F983: 22 44F985: 33 0D C8 312 DFB $33,$0D,$C8,$44,$00F988: 44 00F98A: 11 22 44 313 DFB $11,$22,$44,$33,$0DF98D: 33 0DF98F: C8 44 A9 314 DFB $C8,$44,$A9,$01,$22F992: 01 22F994: 44 33 0D 315 DFB $44,$33,$0D,$80,$04F997: 80 04F999: 90 01 22 316 DFB $90,$01,$22,$44,$33F99C: 44 33F99E: 0D 80 04 317 DFB $0D,$80,$04,$90F9A1: 90F9A2: 26 31 87 318 DFB $26,$31,$87,$9A ;$ZZXXXY01 INSTR'SF9A5: 9AF9A6: 00 319 FMT2 DFB $00 ;ERRF9A7: 21 320 DFB $21 ;IMMF9A8: 81 321 DFB $81 ;Z-PAGEF9A9: 82 322 DFB $82 ;ABSF9AA: 00 323 DFB $00 ;IMPLIEDF9AB: 00 324 DFB $00 ;ACCUMULATORF9AC: 59 325 DFB $59 ;(ZPAG,X)F9AD: 4D 326 DFB $4D ;(ZPAG),YF9AE: 91 327 DFB $91 ;ZPAG,XF9AF: 92 328 DFB $92 ;ABS,XF9B0: 86 329 DFB $86 ;ABS,YF9B1: 4A 330 DFB $4A ;(ABS)F9B2: 85 331 DFB $85 ;ZPAG,YF9B3: 9D 332 DFB $9D ;RELATIVEF9B4: AC A9 AC 333 CHAR1 ASC ",),#($"F9B7: A3 A8 A4F9BA: D9 00 D8 334 CHAR2 DFB $D9,$00,$D8,$A4,$A4,$00F9BD: A4 A4 00 335 *CHAR2: "Y",0,"X$$",0 336 * MNEML IS OF FORM: 337 * (A) XXXXX000 338 * (B) XXXYY100 339 * (C) 1XXX1010 340 * (D) XXXYYY10 341 * (E) XXXYYY01 342 * (X=INDEX)F9C0: 1C 8A 1C 343 MNEML DFB $1C,$8A,$1C,$23,$5D,$8BF9C3: 23 5D 8BF9C6: 1B A1 9D 344 DFB $1B,$A1,$9D,$8A,$1D,$23F9C9: 8A 1D 23F9CC: 9D 8B 1D 345 DFB $9D,$8B,$1D,$A1,$00,$29F9CF: A1 00 29F9D2: 19 AE 69 346 DFB $19,$AE,$69,$A8,$19,$23F9D5: A8 19 23F9D8: 24 53 1B 347 DFB $24,$53,$1B,$23,$24,$53F9DB: 23 24 53F9DE: 19 A1 348 DFB $19,$A1 ;(A) FORMAT ABOVEF9E0: 00 1A 5B 349 DFB $00,$1A,$5B,$5B,$A5,$69F9E3: 5B A5 69F9E6: 24 24 350 DFB $24,$24 ;(B) FORMATF9E8: AE AE A8 351 DFB $AE,$AE,$A8,$AD,$29,$00F9EB: AD 29 00F9EE: 7C 00 352 DFB $7C,$00 ;(C) FORMATF9F0: 15 9C 6D 353 DFB $15,$9C,$6D,$9C,$A5,$69F9F3: 9C A5 69F9F6: 29 53 354 DFB $29,$53 ;(D) FORMATF9F8: 84 13 34 355 DFB $84,$13,$34,$11,$A5,$69F9FB: 11 A5 69F9FE: 23 A0 356 DFB $23,$A0 ;(E) FORMATFA00: D8 62 5A 357 MNEMR DFB $D8,$62,$5A,$48,$26,$62FA03: 48 26 62FA06: 94 88 54 358 DFB $94,$88,$54,$44,$C8,$54FA09: 44 C8 54FA0C: 68 44 E8 359 DFB $68,$44,$E8,$94,$00,$B4FA0F: 94 00 B4FA12: 08 84 74 360 DFB $08,$84,$74,$B4,$28,$6EFA15: B4 28 6EFA18: 74 F4 CC 361 DFB $74,$F4,$CC,$4A,$72,$F2FA1B: 4A 72 F2FA1E: A4 8A 362 DFB $A4,$8A ;(A) FORMATFA20: 00 AA A2 363 DFB $00,$AA,$A2,$A2,$74,$74FA23: A2 74 74FA26: 74 72 364 DFB $74,$72 ;(B) FORMATFA28: 44 68 B2 365 DFB $44,$68,$B2,$32,$B2,$00FA2B: 32 B2 00FA2E: 22 00 366 DFB $22,$00 ;(C) FORMATFA30: 1A 1A 26 367 DFB $1A,$1A,$26,$26,$72,$72FA33: 26 72 72FA36: 88 C8 368 DFB $88,$C8 ;(D) FORMATFA38: C4 CA 26 369 DFB $C4,$CA,$26,$48,$44,$44FA3B: 48 44 44FA3E: A2 C8 370 DFB $A2,$C8 ;(E) FORMATFA40: FF FF FF 371 DFB $FF,$FF,$FFFA43: 20 D0 F8 372 STEP JSR INSTDSP ;DISASSEMBLE ONE INSTFA46: 68 373 PLA ; AT (PCL,H)FA47: 85 2C 374 STA RTNL ;ADJUST TO USERFA49: 68 375 PLA ; STACK. SAVEFA4A: 85 2D 376 STA RTNH ; RTN ADR.FA4C: A2 08 377 LDX #$08FA4E: BD 10 FB 378 XQINIT LDA INITBL-1,X ;INIT XEQ AREAFA51: 95 3C 379 STA XQT,XFA53: CA 380 DEXFA54: D0 F8 381 BNE XQINITFA56: A1 3A 382 LDA (PCL,X) ;USER OPCODE BYTEFA58: F0 42 383 BEQ XBRK ;SPECIAL IF BREAKFA5A: A4 2F 384 LDY LENGTH ;LEN FROM DISASSEMBLYFA5C: C9 20 385 CMP #$20FA5E: F0 59 386 BEQ XJSR ;HANDLE JSR, RTS, JMP,FA60: C9 60 387 CMP #$60 ; JMP (), RTI SPECIALFA62: F0 45 388 BEQ XRTSFA64: C9 4C 389 CMP #$4CFA66: F0 5C 390 BEQ XJMPFA68: C9 6C 391 CMP #$6CFA6A: F0 59 392 BEQ XJMPATFA6C: C9 40 393 CMP #$40FA6E: F0 35 394 BEQ XRTIFA70: 29 1F 395 AND #$1FFA72: 49 14 396 EOR #$14FA74: C9 04 397 CMP #$04 ;COPY USER INST TO XEQ AREAFA76: F0 02 398 BEQ XQ2 ; WITH TRAILING NOPSFA78: B1 3A 399 XQ1 LDA (PCL),Y ;CHANGE REL BRANCHFA7A: 99 3C 00 400 XQ2 STA XQT,Y ; DISP TO 4 FORFA7D: 88 401 DEY ; JMP TO BRANCH ORFA7E: 10 F8 402 BPL XQ1 ; NBRANCH FROM XEQ.FA80: 20 3F FF 403 JSR RESTORE ;RESTORE USER REG CONTENTS.FA83: 4C 3C 00 404 JMP XQT ;XEQ USER OP FROM RAMFA86: 85 45 405 IRQ STA ACC ; (RETURN TO NBRANCH)FA88: 68 406 PLAFA89: 48 407 PHA ;**IRQ HANDLERFA8A: 0A 408 ASLFA8B: 0A 409 ASLFA8C: 0A 410 ASLFA8D: 30 03 411 BMI BREAK ;TEST FOR BREAKFA8F: 6C FE 03 412 JMP (IRQLOC) ;USER ROUTINE VECTOR IN RAMFA92: 28 413 BREAK PLPFA93: 20 4C FF 414 JSR SAV1 ;SAVE REG'S ON BREAKFA96: 68 415 PLA ; INCLUDING PCFA97: 85 3A 416 STA PCLFA99: 68 417 PLAFA9A: 85 3B 418 STA PCHFA9C: 20 82 F8 419 XBRK JSR INSDS1 ;PRINT USER PC.FA9F: 20 DA FA 420 JSR RGDSP1 ; AND REG'SFAA2: 4C 65 FF 421 JMP MON ;GO TO MONITORFAA5: 18 422 XRTI CLCFAA6: 68 423 PLA ;SIMULATE RTI BY EXPECTINGFAA7: 85 48 424 STA STATUS ; STATUS FROM STACK, THEN RTSFAA9: 68 425 XRTS PLA ;RTS SIMULATIONFAAA: 85 3A 426 STA PCL ; EXTRACT PC FROM STACKFAAC: 68 427 PLA ; AND UPDATE PC BY 1 (LEN=0)FAAD: 85 3B 428 PCINC2 STA PCHFAAF: A5 2F 429 PCINC3 LDA LENGTH ;UPDATE PC BY LENFAB1: 20 56 F9 430 JSR PCADJ3FAB4: 84 3B 431 STY PCHFAB6: 18 432 CLCFAB7: 90 14 433 BCC NEWPCLFAB9: 18 434 XJSR CLCFABA: 20 54 F9 435 JSR PCADJ2 ;UPDATE PC AND PUSHFABD: AA 436 TAX ; ONTO STACH FORFABE: 98 437 TYA ; JSR SIMULATEFABF: 48 438 PHAFAC0: 8A 439 TXAFAC1: 48 440 PHAFAC2: A0 02 441 LDY #$02FAC4: 18 442 XJMP CLCFAC5: B1 3A 443 XJMPAT LDA (PCL),YFAC7: AA 444 TAX ;LOAD PC FOR JMP,FAC8: 88 445 DEY ; (JMP) SIMULATE.FAC9: B1 3A 446 LDA (PCL),YFACB: 86 3B 447 STX PCHFACD: 85 3A 448 NEWPCL STA PCLFACF: B0 F3 449 BCS XJMPFAD1: A5 2D 450 RTNJMP LDA RTNHFAD3: 48 451 PHAFAD4: A5 2C 452 LDA RTNLFAD6: 48 453 PHAFAD7: 20 8E FD 454 REGDSP JSR CROUT ;DISPLAY USER REGFADA: A9 45 455 RGDSP1 LDA #ACC ; CONTENTS WITHFADC: 85 40 456 STA A3L ; LABELSFADE: A9 00 457 LDA #ACC/256FAE0: 85 41 458 STA A3HFAE2: A2 FB 459 LDX #$FBFAE4: A9 A0 460 RDSP1 LDA #$A0FAE6: 20 ED FD 461 JSR COUTFAE9: BD 1E FA 462 LDA RTBL-$FB,XFAEC: 20 ED FD 463 JSR COUTFAEF: A9 BD 464 LDA #$BDFAF1: 20 ED FD 465 JSR COUTFAF4: B5 4A 466 LDA ACC+5,XFAF6: 20 DA FD 467 JSR PRBYTEFAF9: E8 468 INXFAFA: 30 E8 469 BMI RDSP1FAFC: 60 470 RTSFAFD: 18 471 BRANCH CLC ;BRANCH TAKEN,FAFE: A0 01 472 LDY #$01 ; ADD LEN+2 TO PCFB00: B1 3A 473 LDA (PCL),YFB02: 20 56 F9 474 JSR PCADJ3FB05: 85 3A 475 STA PCLFB07: 98 476 TYAFB08: 38 477 SECFB09: B0 A2 478 BCS PCINC2FB0B: 20 4A FF 479 NBRNCH JSR SAVE ;NORMAL RETURN AFTERFB0E: 38 480 SEC ; XEQ USER OFFB0F: B0 9E 481 BCS PCINC3 ;GO UPDATE PCFB11: EA 482 INITBL NOPFB12: EA 483 NOP ;DUMMY FILL FORFB13: 4C 0B FB 484 JMP NBRNCH ; XEQ AREAFB16: 4C FD FA 485 JMP BRANCHFB19: C1 486 RTBL DFB $C1FB1A: D8 487 DFB $D8FB1B: D9 488 DFB $D9FB1C: D0 489 DFB $D0FB1D: D3 490 DFB $D3FB1E: AD 70 C0 491 PREAD LDA PTRIG ;TRIGGER PADDLESFB21: A0 00 492 LDY #$00 ;INIT COUNTFB23: EA 493 NOP ;COMPENSATE FOR 1ST COUNTFB24: EA 494 NOPFB25: BD 64 C0 495 PREAD2 LDA PADDL0,X ;COUNT Y-REG EVERYFB28: 10 04 496 BPL RTS2D ; 12 USECFB2A: C8 497 INYFB2B: D0 F8 498 BNE PREAD2 ; EXIT AT 255 MAXFB2D: 88 499 DEYFB2E: 60 500 RTS2D RTSFB2F: A9 00 501 INIT LDA #$00 ;CLR STATUS FOR DEBUGFB31: 85 48 502 STA STATUS ; SOFTWAREFB33: AD 56 C0 503 LDA LORESFB36: AD 54 C0 504 LDA LOWSCR ;INIT VIDEO MODEFB39: AD 51 C0 505 SETTXT LDA TXTSET ;SET FOR TEXT MODEFB3C: A9 00 506 LDA #$00 ; FULL SCREEN WINDOWFB3E: F0 0B 507 BEQ SETWNDFB40: AD 50 C0 508 SETGR LDA TXTCLR ;SET FOR GRAPHICS MODEFB43: AD 53 C0 509 LDA MIXSET ; LOWER 4 LINES ASFB46: 20 36 F8 510 JSR CLRTOP ; TEXT WINDOWFB49: A9 14 511 LDA #$14FB4B: 85 22 512 SETWND STA WNDTOP ;SET FOR 40 COL WINDOWFB4D: A9 00 513 LDA #$00 ; TOP IN A-REG,FB4F: 85 20 514 STA WNDLFT ; BTTM AT LINE 24FB51: A9 28 515 LDA #$28FB53: 85 21 516 STA WNDWDTHFB55: A9 18 517 LDA #$18FB57: 85 23 518 STA WNDBTM ; VTAB TO ROW 23FB59: A9 17 519 LDA #$17FB5B: 85 25 520 TABV STA CV ;VTABS TO ROW IN A-REGFB5D: 4C 22 FC 521 JMP VTABFB60: 20 A4 FB 522 MULPM JSR MD1 ;ABS VAL OF AC AUXFB63: A0 10 523 MUL LDY #$10 ;INDEX FOR 16 BITSFB65: A5 50 524 MUL2 LDA ACL ;ACX * AUX + XTNDFB67: 4A 525 LSR ; TO AC, XTNDFB68: 90 0C 526 BCC MUL4 ;IF NO CARRY,FB6A: 18 527 CLC ; NO PARTIAL PROD.FB6B: A2 FE 528 LDX #$FEFB6D: B5 54 529 MUL3 LDA XTNDL+2,X ;ADD MPLCND (AUX)FB6F: 75 56 530 ADC AUXL+2,X ; TO PARTIAL PRODFB71: 95 54 531 STA XTNDL+2,X ; (XTND)FB73: E8 532 INXFB74: D0 F7 533 BNE MUL3FB76: A2 03 534 MUL4 LDX #$03FB78: 76 535 MUL5 DFB $76FB79: 50 536 DFB $50FB7A: CA 537 DEXFB7B: 10 FB 538 BPL MUL5FB7D: 88 539 DEYFB7E: D0 E5 540 BNE MUL2FB80: 60 541 RTSFB81: 20 A4 FB 542 DIVPM JSR MD1 ;ABS VAL OF AC, AUX.FB84: A0 10 543 DIV LDY #$10 ;INDEX FOR 16 BITSFB86: 06 50 544 DIV2 ASL ACLFB88: 26 51 545 ROL ACHFB8A: 26 52 546 ROL XTNDL ;XTND/AUXFB8C: 26 53 547 ROL XTNDH ; TO AC.FB8E: 38 548 SECFB8F: A5 52 549 LDA XTNDLFB91: E5 54 550 SBC AUXL ;MOD TO XTND.FB93: AA 551 TAXFB94: A5 53 552 LDA XTNDHFB96: E5 55 553 SBC AUXHFB98: 90 06 554 BCC DIV3FB9A: 86 52 555 STX XTNDLFB9C: 85 53 556 STA XTNDHFB9E: E6 50 557 INC ACLFBA0: 88 558 DIV3 DEYFBA1: D0 E3 559 BNE DIV2FBA3: 60 560 RTSFBA4: A0 00 561 MD1 LDY #$00 ;ABS VAL OF AC, AUXFBA6: 84 2F 562 STY SIGN ; WITH RESULT SIGNFBA8: A2 54 563 LDX #AUXL ; IN LSB OF SIGN.FBAA: 20 AF FB 564 JSR MD3FBAD: A2 50 565 LDX #ACLFBAF: B5 01 566 MD3 LDA LOC1,X ;X SPECIFIES AC OR AUXFBB1: 10 0D 567 BPL MDRTSFBB3: 38 568 SECFBB4: 98 569 TYAFBB5: F5 00 570 SBC LOC0,X ;COMPL SPECIFIED REGFBB7: 95 00 571 STA LOC0,X ; IF NEG.FBB9: 98 572 TYAFBBA: F5 01 573 SBC LOC1,XFBBC: 95 01 574 STA LOC1,XFBBE: E6 2F 575 INC SIGNFBC0: 60 576 MDRTS RTSFBC1: 48 577 BASCALC PHA ;CALC BASE ADR IN BASL,HFBC2: 4A 578 LSR ; FOR GIVEN LINE NOFBC3: 29 03 579 AND #$03 ; 0<=LINE NO.<=$17FBC5: 09 04 580 ORA #$04 ;ARG=000ABCDE, GENERATEFBC7: 85 29 581 STA BASH ; BASH=000001CDFBC9: 68 582 PLA ; ANDFBCA: 29 18 583 AND #$18 ; BASL=EABAB000FBCC: 90 02 584 BCC BSCLC2FBCE: 69 7F 585 ADC #$7FFBD0: 85 28 586 BSCLC2 STA BASLFBD2: 0A 587 ASLFBD3: 0A 588 ASLFBD4: 05 28 589 ORA BASLFBD6: 85 28 590 STA BASLFBD8: 60 591 RTSFBD9: C9 87 592 BELL1 CMP #$87 ;BELL CHAR? (CNTRL-G)FBDB: D0 12 593 BNE RTS2B ; NO, RETURNFBDD: A9 40 594 LDA #$40 ;DELAY .01 SECONDSFBDF: 20 A8 FC 595 JSR WAITFBE2: A0 C0 596 LDY #$C0FBE4: A9 0C 597 BELL2 LDA #$0C ;TOGGLE SPEAKER ATFBE6: 20 A8 FC 598 JSR WAIT ; 1 KHZ FOR .1 SEC.FBE9: AD 30 C0 599 LDA SPKRFBEC: 88 600 DEYFBED: D0 F5 601 BNE BELL2FBEF: 60 602 RTS2B RTSFBF0: A4 24 603 STOADV LDY CH ;CURSOR H INDEX TO Y-REGFBF2: 91 28 604 STA (BASL),Y ;STORE CHAR IN LINEFBF4: E6 24 605 ADVANCE INC CH ;INCREMENT CURSOR H INDEXFBF6: A5 24 606 LDA CH ; (MOVE RIGHT)FBF8: C5 21 607 CMP WNDWDTH ;BEYOND WINDOW WIDTH?FBFA: B0 66 608 BCS CR ; YES CR TO NEXT LINEFBFC: 60 609 RTS3 RTS ; NO,RETURNFBFD: C9 A0 610 VIDOUT CMP #$A0 ;CONTROL CHAR?FBFF: B0 EF 611 BCS STOADV ; NO,OUTPUT IT.FC01: A8 612 TAY ;INVERSE VIDEO?FC02: 10 EC 613 BPL STOADV ; YES, OUTPUT IT.FC04: C9 8D 614 CMP #$8D ;CR?FC06: F0 5A 615 BEQ CR ; YES.FC08: C9 8A 616 CMP #$8A ;LINE FEED?FC0A: F0 5A 617 BEQ LF ; IF SO, DO IT.FC0C: C9 88 618 CMP #$88 ;BACK SPACE? (CNTRL-H)FC0E: D0 C9 619 BNE BELL1 ; NO, CHECK FOR BELL.FC10: C6 24 620 BS DEC CH ;DECREMENT CURSOR H INDEXFC12: 10 E8 621 BPL RTS3 ;IF POS, OK. ELSE MOVE UPFC14: A5 21 622 LDA WNDWDTH ;SET CH TO WNDWDTH-1FC16: 85 24 623 STA CHFC18: C6 24 624 DEC CH ;(RIGHTMOST SCREEN POS)FC1A: A5 22 625 UP LDA WNDTOP ;CURSOR V INDEXFC1C: C5 25 626 CMP CVFC1E: B0 0B 627 BCS RTS4 ;IF TOP LINE THEN RETURNFC20: C6 25 628 DEC CV ;DEC CURSOR V-INDEXFC22: A5 25 629 VTAB LDA CV ;GET CURSOR V-INDEXFC24: 20 C1 FB 630 VTABZ JSR BASCALC ;GENERATE BASE ADRFC27: 65 20 631 ADC WNDLFT ;ADD WINDOW LEFT INDEXFC29: 85 28 632 STA BASL ;TO BASLFC2B: 60 633 RTS4 RTSFC2C: 49 C0 634 ESC1 EOR #$C0 ;ESC?FC2E: F0 28 635 BEQ HOME ; IF SO, DO HOME AND CLEARFC30: 69 FD 636 ADC #$FD ;ESC-A OR B CHECKFC32: 90 C0 637 BCC ADVANCE ; A, ADVANCEFC34: F0 DA 638 BEQ BS ; B, BACKSPACEFC36: 69 FD 639 ADC #$FD ;ESC-C OR D CHECKFC38: 90 2C 640 BCC LF ; C, DOWNFC3A: F0 DE 641 BEQ UP ; D, GO UPFC3C: 69 FD 642 ADC #$FD ;ESC-E OR F CHECKFC3E: 90 5C 643 BCC CLREOL ; E, CLEAR TO END OF LINEFC40: D0 E9 644 BNE RTS4 ; NOT F, RETURNFC42: A4 24 645 CLREOP LDY CH ;CURSOR H TO Y INDEXFC44: A5 25 646 LDA CV ;CURSOR V TO A-REGISTERFC46: 48 647 CLEOP1 PHA ;SAVE CURRENT LINE ON STKFC47: 20 24 FC 648 JSR VTABZ ;CALC BASE ADDRESSFC4A: 20 9E FC 649 JSR CLEOLZ ;CLEAR TO EOL, SET CARRYFC4D: A0 00 650 LDY #$00 ;CLEAR FROM H INDEX=0 FOR RESTFC4F: 68 651 PLA ;INCREMENT CURRENT LINEFC50: 69 00 652 ADC #$00 ;(CARRY IS SET)FC52: C5 23 653 CMP WNDBTM ;DONE TO BOTTOM OF WINDOW?FC54: 90 F0 654 BCC CLEOP1 ; NO, KEEP CLEARING LINESFC56: B0 CA 655 BCS VTAB ; YES, TAB TO CURRENT LINEFC58: A5 22 656 HOME LDA WNDTOP ;INIT CURSOR VFC5A: 85 25 657 STA CV ; AND H-INDICESFC5C: A0 00 658 LDY #$00FC5E: 84 24 659 STY CH ;THEN CLEAR TO END OF PAGEFC60: F0 E4 660 BEQ CLEOP1FC62: A9 00 661 CR LDA #$00 ;CURSOR TO LEFT OF INDEXFC64: 85 24 662 STA CH ;(RET CURSOR H=0)FC66: E6 25 663 LF INC CV ;INCR CURSOR V(DOWN 1 LINE)FC68: A5 25 664 LDA CVFC6A: C5 23 665 CMP WNDBTM ;OFF SCREEN?FC6C: 90 B6 666 BCC VTABZ ; NO, SET BASE ADDRFC6E: C6 25 667 DEC CV ;DECR CURSOR V (BACK TO BOTTOM)FC70: A5 22 668 SCROLL LDA WNDTOP ;START AT TOP OF SCRL WNDWFC72: 48 669 PHAFC73: 20 24 FC 670 JSR VTABZ ;GENERATE BASE ADRFC76: A5 28 671 SCRL1 LDA BASL ;COPY BASL,HFC78: 85 2A 672 STA BAS2L ; TO BAS2L,HFC7A: A5 29 673 LDA BASHFC7C: 85 2B 674 STA BAS2HFC7E: A4 21 675 LDY WNDWDTH ;INIT Y TO RIGHTMOST INDEXFC80: 88 676 DEY ; OF SCROLLING WINDOWFC81: 68 677 PLAFC82: 69 01 678 ADC #$01 ;INCR LINE NUMBERFC84: C5 23 679 CMP WNDBTM ;DONE?FC86: B0 0D 680 BCS SCRL3 ; YES, FINISHFC88: 48 681 PHAFC89: 20 24 FC 682 JSR VTABZ ;FORM BASL,H (BASE ADDR)FC8C: B1 28 683 SCRL2 LDA (BASL),Y ;MOVE A CHR UP ON LINEFC8E: 91 2A 684 STA (BAS2L),YFC90: 88 685 DEY ;NEXT CHAR OF LINEFC91: 10 F9 686 BPL SCRL2FC93: 30 E1 687 BMI SCRL1 ;NEXT LINE (ALWAYS TAKEN)FC95: A0 00 688 SCRL3 LDY #$00 ;CLEAR BOTTOM LINEFC97: 20 9E FC 689 JSR CLEOLZ ;GET BASE ADDR FOR BOTTOM LINEFC9A: B0 86 690 BCS VTAB ;CARRY IS SETFC9C: A4 24 691 CLREOL LDY CH ;CURSOR H INDEXFC9E: A9 A0 692 CLEOLZ LDA #$A0FCA0: 91 28 693 CLEOL2 STA (BASL),Y ;STORE BLANKS FROM 'HERE'FCA2: C8 694 INY ; TO END OF LINES (WNDWDTH)FCA3: C4 21 695 CPY WNDWDTHFCA5: 90 F9 696 BCC CLEOL2FCA7: 60 697 RTSFCA8: 38 698 WAIT SECFCA9: 48 699 WAIT2 PHAFCAA: E9 01 700 WAIT3 SBC #$01FCAC: D0 FC 701 BNE WAIT3 ;1.0204 USECFCAE: 68 702 PLA ;(13+27/2*A+5/2*A*A)FCAF: E9 01 703 SBC #$01FCB1: D0 F6 704 BNE WAIT2FCB3: 60 705 RTSFCB4: E6 42 706 NXTA4 INC A4L ;INCR 2-BYTE A4FCB6: D0 02 707 BNE NXTA1 ; AND A1FCB8: E6 43 708 INC A4HFCBA: A5 3C 709 NXTA1 LDA A1L ;INCR 2-BYTE A1.FCBC: C5 3E 710 CMP A2LFCBE: A5 3D 711 LDA A1H ; AND COMPARE TO A2FCC0: E5 3F 712 SBC A2HFCC2: E6 3C 713 INC A1L ; (CARRY SET IF >=)FCC4: D0 02 714 BNE RTS4BFCC6: E6 3D 715 INC A1HFCC8: 60 716 RTS4B RTSFCC9: A0 4B 717 HEADR LDY #$4B ;WRITE A*256 'LONG 1'FCCB: 20 DB FC 718 JSR ZERDLY ; HALF CYCLESFCCE: D0 F9 719 BNE HEADR ; (650 USEC EACH)FCD0: 69 FE 720 ADC #$FEFCD2: B0 F5 721 BCS HEADR ;THEN A 'SHORT 0'FCD4: A0 21 722 LDY #$21 ; (400 USEC)FCD6: 20 DB FC 723 WRBIT JSR ZERDLY ;WRITE TWO HALF CYCLESFCD9: C8 724 INY ; OF 250 USEC ('0')FCDA: C8 725 INY ; OR 500 USEC ('0')FCDB: 88 726 ZERDLY DEYFCDC: D0 FD 727 BNE ZERDLYFCDE: 90 05 728 BCC WRTAPE ;Y IS COUNT FORFCE0: A0 32 729 LDY #$32 ; TIMING LOOPFCE2: 88 730 ONEDLY DEYFCE3: D0 FD 731 BNE ONEDLYFCE5: AC 20 C0 732 WRTAPE LDY TAPEOUTFCE8: A0 2C 733 LDY #$2CFCEA: CA 734 DEXFCEB: 60 735 RTSFCEC: A2 08 736 RDBYTE LDX #$08 ;8 BITS TO READFCEE: 48 737 RDBYT2 PHA ;READ TWO TRANSITIONSFCEF: 20 FA FC 738 JSR RD2BIT ; (FIND EDGE)FCF2: 68 739 PLAFCF3: 2A 740 ROL ;NEXT BITFCF4: A0 3A 741 LDY #$3A ;COUNT FOR SAMPLESFCF6: CA 742 DEXFCF7: D0 F5 743 BNE RDBYT2FCF9: 60 744 RTSFCFA: 20 FD FC 745 RD2BIT JSR RDBITFCFD: 88 746 RDBIT DEY ;DECR Y UNTILFCFE: AD 60 C0 747 LDA TAPEIN ; TAPE TRANSITIONFD01: 45 2F 748 EOR LASTINFD03: 10 F8 749 BPL RDBITFD05: 45 2F 750 EOR LASTINFD07: 85 2F 751 STA LASTINFD09: C0 80 752 CPY #$80 ;SET CARRY ON YFD0B: 60 753 RTSFD0C: A4 24 754 RDKEY LDY CHFD0E: B1 28 755 LDA (BASL),Y ;SET SCREEN TO FLASHFD10: 48 756 PHAFD11: 29 3F 757 AND #$3FFD13: 09 40 758 ORA #$40FD15: 91 28 759 STA (BASL),YFD17: 68 760 PLAFD18: 6C 38 00 761 JMP (KSWL) ;GO TO USER KEY-INFD1B: E6 4E 762 KEYIN INC RNDLFD1D: D0 02 763 BNE KEYIN2 ;INCR RND NUMBERFD1F: E6 4F 764 INC RNDHFD21: 2C 00 C0 765 KEYIN2 BIT KBD ;KEY DOWN?FD24: 10 F5 766 BPL KEYIN ; LOOPFD26: 91 28 767 STA (BASL),Y ;REPLACE FLASHING SCREENFD28: AD 00 C0 768 LDA KBD ;GET KEYCODEFD2B: 2C 10 C0 769 BIT KBDSTRB ;CLR KEY STROBEFD2E: 60 770 RTSFD2F: 20 0C FD 771 ESC JSR RDKEY ;GET KEYCODEFD32: 20 2C FC 772 JSR ESC1 ; HANDLE ESC FUNC.FD35: 20 0C FD 773 RDCHAR JSR RDKEY ;READ KEYFD38: C9 9B 774 CMP #$9B ;ESC?FD3A: F0 F3 775 BEQ ESC ; YES, DON'T RETURNFD3C: 60 776 RTSFD3D: A5 32 777 NOTCR LDA INVFLGFD3F: 48 778 PHAFD40: A9 FF 779 LDA #$FFFD42: 85 32 780 STA INVFLG ;ECHO USER LINEFD44: BD 00 02 781 LDA IN,X ; NON INVERSEFD47: 20 ED FD 782 JSR COUTFD4A: 68 783 PLAFD4B: 85 32 784 STA INVFLGFD4D: BD 00 02 785 LDA IN,XFD50: C9 88 786 CMP #$88 ;CHECK FOR EDIT KEYSFD52: F0 1D 787 BEQ BCKSPC ; BS, CTRL-XFD54: C9 98 788 CMP #$98FD56: F0 0A 789 BEQ CANCELFD58: E0 F8 790 CPX #$F8 ;MARGIN?FD5A: 90 03 791 BCC NOTCR1FD5C: 20 3A FF 792 JSR BELL ; YES, SOUND BELLFD5F: E8 793 NOTCR1 INX ;ADVANCE INPUT INDEXFD60: D0 13 794 BNE NXTCHARFD62: A9 DC 795 CANCEL LDA #$DC ;BACKSLASH AFTER CANCELLED LINEFD64: 20 ED FD 796 JSR COUTFD67: 20 8E FD 797 GETLNZ JSR CROUT ;OUTPUT CRFD6A: A5 33 798 GETLN LDA PROMPTFD6C: 20 ED FD 799 JSR COUT ;OUTPUT PROMPT CHARFD6F: A2 01 800 LDX #$01 ;INIT INPUT INDEXFD71: 8A 801 BCKSPC TXA ; WILL BACKSPACE TO 0FD72: F0 F3 802 BEQ GETLNZFD74: CA 803 DEXFD75: 20 35 FD 804 NXTCHAR JSR RDCHARFD78: C9 95 805 CMP #PICK ;USE SCREEN CHARFD7A: D0 02 806 BNE CAPTST ; FOR CTRL-UFD7C: B1 28 807 LDA (BASL),YFD7E: C9 E0 808 CAPTST CMP #$E0FD80: 90 02 809 BCC ADDINP ;CONVERT TO CAPSFD82: 29 DF 810 AND #$DFFD84: 9D 00 02 811 ADDINP STA IN,X ;ADD TO INPUT BUFFD87: C9 8D 812 CMP #$8DFD89: D0 B2 813 BNE NOTCRFD8B: 20 9C FC 814 JSR CLREOL ;CLR TO EOL IF CRFD8E: A9 8D 815 CROUT LDA #$8DFD90: D0 5B 816 BNE COUTFD92: A4 3D 817 PRA1 LDY A1H ;PRINT CR,A1 IN HEXFD94: A6 3C 818 LDX A1LFD96: 20 8E FD 819 PRYX2 JSR CROUTFD99: 20 40 F9 820 JSR PRNTYXFD9C: A0 00 821 LDY #$00FD9E: A9 AD 822 LDA #$AD ;PRINT '-'FDA0: 4C ED FD 823 JMP COUTFDA3: A5 3C 824 XAM8 LDA A1LFDA5: 09 07 825 ORA #$07 ;SET TO FINISH ATFDA7: 85 3E 826 STA A2L ; MOD 8=7FDA9: A5 3D 827 LDA A1HFDAB: 85 3F 828 STA A2HFDAD: A5 3C 829 MODSCHK LDA A1LFDAF: 29 07 830 AND #$07FDB1: D0 03 831 BNE DATAOUTFDB3: 20 92 FD 832 XAM JSR PRA1FDB6: A9 A0 833 DATAOUT LDA #$A0FDB8: 20 ED FD 834 JSR COUT ;OUTPUT BLANKFDBB: B1 3C 835 LDA (A1L),YFDBD: 20 DA FD 836 JSR PRBYTE ;OUTPUT BYTE IN HEXFDC0: 20 BA FC 837 JSR NXTA1FDC3: 90 E8 838 BCC MODSCHK ;CHECK IF TIME TO,FDC5: 60 839 RTS4C RTS ; PRINT ADDRFDC6: 4A 840 XAMPM LSR ;DETERMINE IF MONFDC7: 90 EA 841 BCC XAM ; MODE IS XAMFDC9: 4A 842 LSR ; ADD, OR SUBFDCA: 4A 843 LSRFDCB: A5 3E 844 LDA A2LFDCD: 90 02 845 BCC ADDFDCF: 49 FF 846 EOR #$FF ;SUB: FORM 2'S COMPLEMENTFDD1: 65 3C 847 ADD ADC A1LFDD3: 48 848 PHAFDD4: A9 BD 849 LDA #$BDFDD6: 20 ED FD 850 JSR COUT ;PRINT '=', THEN RESULTFDD9: 68 851 PLAFDDA: 48 852 PRBYTE PHA ;PRINT BYTE AS 2 HEXFDDB: 4A 853 LSR ; DIGITS, DESTROYS A-REGFDDC: 4A 854 LSRFDDD: 4A 855 LSRFDDE: 4A 856 LSRFDDF: 20 E5 FD 857 JSR PRHEXZFDE2: 68 858 PLAFDE3: 29 0F 859 PRHEX AND #$0F ;PRINT HEX DIG IN A-REGFDE5: 09 B0 860 PRHEXZ ORA #$B0 ; LSB'SFDE7: C9 BA 861 CMP #$BAFDE9: 90 02 862 BCC COUTFDEB: 69 06 863 ADC #$06FDED: 6C 36 00 864 COUT JMP (CSWL) ;VECTOR TO USER OUTPUT ROUTINEFDF0: C9 A0 865 COUT1 CMP #$A0FDF2: 90 02 866 BCC COUTZ ;DON'T OUTPUT CTRL'S INVERSEFDF4: 25 32 867 AND INVFLG ;MASK WITH INVERSE FLAGFDF6: 84 35 868 COUTZ STY YSAV1 ;SAV Y-REGFDF8: 48 869 PHA ;SAV A-REGFDF9: 20 FD FB 870 JSR VIDOUT ;OUTPUT A-REG AS ASCIIFDFC: 68 871 PLA ;RESTORE A-REGFDFD: A4 35 872 LDY YSAV1 ; AND Y-REGFDFF: 60 873 RTS ; THEN RETURNFE00: C6 34 874 BL1 DEC YSAVFE02: F0 9F 875 BEQ XAM8FE04: CA 876 BLANK DEX ;BLANK TO MONFE05: D0 16 877 BNE SETMDZ ;AFTER BLANKFE07: C9 BA 878 CMP #$BA ;DATA STORE MODE?FE09: D0 BB 879 BNE XAMPM ; NO, XAM, ADD, OR SUBFE0B: 85 31 880 STOR STA MODE ;KEEP IN STORE MODEFE0D: A5 3E 881 LDA A2LFE0F: 91 40 882 STA (A3L),Y ;STORE AS LOW BYTE AS (A3)FE11: E6 40 883 INC A3LFE13: D0 02 884 BNE RTS5 ;INCR A3, RETURNFE15: E6 41 885 INC A3HFE17: 60 886 RTS5 RTSFE18: A4 34 887 SETMODE LDY YSAV ;SAVE CONVERTED ':', '+',FE1A: B9 FF 01 888 LDA IN-1,Y ; '-', '.' AS MODE.FE1D: 85 31 889 SETMDZ STA MODEFE1F: 60 890 RTSFE20: A2 01 891 LT LDX #$01FE22: B5 3E 892 LT2 LDA A2L,X ;COPY A2 (2 BYTES) TOFE24: 95 42 893 STA A4L,X ; A4 AND A5FE26: 95 44 894 STA A5L,XFE28: CA 895 DEXFE29: 10 F7 896 BPL LT2FE2B: 60 897 RTSFE2C: B1 3C 898 MOVE LDA (A1L),Y ;MOVE (A1 TO A2) TOFE2E: 91 42 899 STA (A4L),Y ; (A4)FE30: 20 B4 FC 900 JSR NXTA4FE33: 90 F7 901 BCC MOVEFE35: 60 902 RTSFE36: B1 3C 903 VFY LDA (A1L),Y ;VERIFY (A1 TO A2) WITHFE38: D1 42 904 CMP (A4L),Y ; (A4)FE3A: F0 1C 905 BEQ VFYOKFE3C: 20 92 FD 906 JSR PRA1FE3F: B1 3C 907 LDA (A1L),YFE41: 20 DA FD 908 JSR PRBYTEFE44: A9 A0 909 LDA #$A0FE46: 20 ED FD 910 JSR COUTFE49: A9 A8 911 LDA #$A8FE4B: 20 ED FD 912 JSR COUTFE4E: B1 42 913 LDA (A4L),YFE50: 20 DA FD 914 JSR PRBYTEFE53: A9 A9 915 LDA #$A9FE55: 20 ED FD 916 JSR COUTFE58: 20 B4 FC 917 VFYOK JSR NXTA4FE5B: 90 D9 918 BCC VFYFE5D: 60 919 RTSFE5E: 20 75 FE 920 LIST JSR A1PC ;MOVE A1 (2 BYTES) TOFE61: A9 14 921 LDA #$14 ; PC IF SPEC'D ANDFE63: 48 922 LIST2 PHA ; DISEMBLE 20 INSTRSFE64: 20 D0 F8 923 JSR INSTDSPFE67: 20 53 F9 924 JSR PCADJ ;ADJUST PC EACH INSTRFE6A: 85 3A 925 STA PCLFE6C: 84 3B 926 STY PCHFE6E: 68 927 PLAFE6F: 38 928 SECFE70: E9 01 929 SBC #$01 ;NEXT OF 20 INSTRSFE72: D0 EF 930 BNE LIST2FE74: 60 931 RTSFE75: 8A 932 A1PC TXA ;IF USER SPEC'D ADRFE76: F0 07 933 BEQ A1PCRTS ; COPY FROM A1 TO PCFE78: B5 3C 934 A1PCLP LDA A1L,XFE7A: 95 3A 935 STA PCL,XFE7C: CA 936 DEXFE7D: 10 F9 937 BPL A1PCLPFE7F: 60 938 A1PCRTS RTSFE80: A0 3F 939 SETINV LDY #$3F ;SET FOR INVERSE VIDFE82: D0 02 940 BNE SETIFLG ; VIA COUT1FE84: A0 FF 941 SETNORM LDY #$FF ;SET FOR NORMAL VIDFE86: 84 32 942 SETIFLG STY INVFLGFE88: 60 943 RTSFE89: A9 00 944 SETKBD LDA #$00 ;SIMULATE PORT #0 INPUTFE8B: 85 3E 945 INPORT STA A2L ; SPECIFIED (KEYIN ROUTINE)FE8D: A2 38 946 INPRT LDX #KSWLFE8F: A0 1B 947 LDY #KEYINFE91: D0 08 948 BNE IOPRTFE93: A9 00 949 SETVID LDA #$00 ;SIMULATE PORT #0 OUTPUTFE95: 85 3E 950 OUTPORT STA A2L ; SPECIFIED (COUT1 ROUTINE)FE97: A2 36 951 OUTPRT LDX #CSWLFE99: A0 F0 952 LDY #COUT1FE9B: A5 3E 953 IOPRT LDA A2L ;SET RAM IN/OUT VECTORSFE9D: 29 0F 954 AND #$0FFE9F: F0 06 955 BEQ IOPRT1FEA1: 09 C0 956 ORA #IOADR/256FEA3: A0 00 957 LDY #$00FEA5: F0 02 958 BEQ IOPRT2FEA7: A9 FD 959 IOPRT1 LDA #COUT1/256FEA9: 94 00 960 IOPRT2 STY LOC0,XFEAB: 95 01 961 STA LOC1,XFEAD: 60 962 RTSFEAE: EA 963 NOPFEAF: EA 964 NOPFEB0: 4C 00 E0 965 XBASIC JMP BASIC ;TO BASIC WITH SCRATCHFEB3: 4C 03 E0 966 BASCONT JMP BASIC2 ;CONTINUE BASICFEB6: 20 75 FE 967 GO JSR A1PC ;ADR TO PC IF SPEC'DFEB9: 20 3F FF 968 JSR RESTORE ;RESTORE META REGSFEBC: 6C 3A 00 969 JMP (PCL) ;GO TO USER SUBRFEBF: 4C D7 FA 970 REGZ JMP REGDSP ;TO REG DISPLAYFEC2: C6 34 971 TRACE DEC YSAVFEC4: 20 75 FE 972 STEPZ JSR A1PC ;ADR TO PC IF SPEC'DFEC7: 4C 43 FA 973 JMP STEP ;TAKE ONE STEPFECA: 4C F8 03 974 USR JMP USRADR ;TO USR SUBR AT USRADRFECD: A9 40 975 WRITE LDA #$40FECF: 20 C9 FC 976 JSR HEADR ;WRITE 10-SEC HEADERFED2: A0 27 977 LDY #$27FED4: A2 00 978 WR1 LDX #$00FED6: 41 3C 979 EOR (A1L,X)FED8: 48 980 PHAFED9: A1 3C 981 LDA (A1L,X)FEDB: 20 ED FE 982 JSR WRBYTEFEDE: 20 BA FC 983 JSR NXTA1FEE1: A0 1D 984 LDY #$1DFEE3: 68 985 PLAFEE4: 90 EE 986 BCC WR1FEE6: A0 22 987 LDY #$22FEE8: 20 ED FE 988 JSR WRBYTEFEEB: F0 4D 989 BEQ BELLFEED: A2 10 990 WRBYTE LDX #$10FEEF: 0A 991 WRBYT2 ASLFEF0: 20 D6 FC 992 JSR WRBITFEF3: D0 FA 993 BNE WRBYT2FEF5: 60 994 RTSFEF6: 20 00 FE 995 CRMON JSR BL1 ;HANDLE A CR AS BLANKFEF9: 68 996 PLA ; THEN POP STACKFEFA: 68 997 PLA ; AND RTN TO MONFEFB: D0 6C 998 BNE MONZFEFD: 20 FA FC 999 READ JSR RD2BIT ;FIND TAPEIN EDGEFF00: A9 16 1000 LDA #$16FF02: 20 C9 FC 1001 JSR HEADR ;DELAY 3.5 SECONDSFF05: 85 2E 1002 STA CHKSUM ;INIT CHKSUM=$FFFF07: 20 FA FC 1003 JSR RD2BIT ;FIND TAPEIN EDGEFF0A: A0 24 1004 RD2 LDY #$24 ;LOOK FOR SYNC BITFF0C: 20 FD FC 1005 JSR RDBIT ; (SHORT 0)FF0F: B0 F9 1006 BCS RD2 ; LOOP UNTIL FOUNDFF11: 20 FD FC 1007 JSR RDBIT ;SKIP SECOND SYNC H-CYCLEFF14: A0 3B 1008 LDY #$3B ;INDEX FOR 0/1 TESTFF16: 20 EC FC 1009 RD3 JSR RDBYTE ;READ A BYTEFF19: 81 3C 1010 STA (A1L,X) ;STORE AT (A1)FF1B: 45 2E 1011 EOR CHKSUMFF1D: 85 2E 1012 STA CHKSUM ;UPDATE RUNNING CHKSUMFF1F: 20 BA FC 1013 JSR NXTA1 ;INC A1, COMPARE TO A2FF22: A0 35 1014 LDY #$35 ;COMPENSATE 0/1 INDEXFF24: 90 F0 1015 BCC RD3 ;LOOP UNTIL DONEFF26: 20 EC FC 1016 JSR RDBYTE ;READ CHKSUM BYTEFF29: C5 2E 1017 CMP CHKSUMFF2B: F0 0D 1018 BEQ BELL ;GOOD, SOUND BELL AND RETURNFF2D: A9 C5 1019 PRERR LDA #$C5FF2F: 20 ED FD 1020 JSR COUT ;PRINT "ERR", THEN BELLFF32: A9 D2 1021 LDA #$D2FF34: 20 ED FD 1022 JSR COUTFF37: 20 ED FD 1023 JSR COUTFF3A: A9 87 1024 BELL LDA #$87 ;OUTPUT BELL AND RETURNFF3C: 4C ED FD 1025 JMP COUTFF3F: A5 48 1026 RESTORE LDA STATUS ;RESTORE 6502 REG CONTENTSFF41: 48 1027 PHA ; USED BY DEBUG SOFTWAREFF42: A5 45 1028 LDA ACCFF44: A6 46 1029 RESTR1 LDX XREGFF46: A4 47 1030 LDY YREGFF48: 28 1031 PLPFF49: 60 1032 RTSFF4A: 85 45 1033 SAVE STA ACC ;SAVE 6502 REG CONTENTSFF4C: 86 46 1034 SAV1 STX XREGFF4E: 84 47 1035 STY YREGFF50: 08 1036 PHPFF51: 68 1037 PLAFF52: 85 48 1038 STA STATUSFF54: BA 1039 TSXFF55: 86 49 1040 STX SPNTFF57: D8 1041 CLDFF58: 60 1042 RTSFF59: 20 84 FE 1043 RESET JSR SETNORM ;SET SCREEN MODEFF5C: 20 2F FB 1044 JSR INIT ; AND INIT KBD/SCREENFF5F: 20 93 FE 1045 JSR SETVID ; AS I/O DEV'SFF62: 20 89 FE 1046 JSR SETKBDFF65: D8 1047 MON CLD ;MUST SET HEX MODE!FF66: 20 3A FF 1048 JSR BELLFF69: A9 AA 1049 MONZ LDA #$AA ;'*' PROMPT FOR MONFF6B: 85 33 1050 STA PROMPTFF6D: 20 67 FD 1051 JSR GETLNZ ;READ A LINEFF70: 20 C7 FF 1052 JSR ZMODE ;CLEAR MON MODE, SCAN IDXFF73: 20 A7 FF 1053 NXTITM JSR GETNUM ;GET ITEM, NON-HEXFF76: 84 34 1054 STY YSAV ; CHAR IN A-REGFF78: A0 17 1055 LDY #$17 ; X-REG=0 IF NO HEX INPUTFF7A: 88 1056 CHRSRCH DEYFF7B: 30 E8 1057 BMI MON ;NOT FOUND, GO TO MONFF7D: D9 CC FF 1058 CMP CHRTBL,Y ;FIND CMND CHAR IN TELFF80: D0 F8 1059 BNE CHRSRCHFF82: 20 BE FF 1060 JSR TOSUB ;FOUND, CALL CORRESPONDINGFF85: A4 34 1061 LDY YSAV ; SUBROUTINEFF87: 4C 73 FF 1062 JMP NXTITMFF8A: A2 03 1063 DIG LDX #$03FF8C: 0A 1064 ASLFF8D: 0A 1065 ASL ;GOT HEX DIG,FF8E: 0A 1066 ASL ; SHIFT INTO A2FF8F: 0A 1067 ASLFF90: 0A 1068 NXTBIT ASLFF91: 26 3E 1069 ROL A2LFF93: 26 3F 1070 ROL A2HFF95: CA 1071 DEX ;LEAVE X=$FF IF DIGFF96: 10 F8 1072 BPL NXTBITFF98: A5 31 1073 NXTBAS LDA MODEFF9A: D0 06 1074 BNE NXTBS2 ;IF MODE IS ZEROFF9C: B5 3F 1075 LDA A2H,X ; THEN COPY A2 TOFF9E: 95 3D 1076 STA A1H,X ; A1 AND A3FFA0: 95 41 1077 STA A3H,XFFA2: E8 1078 NXTBS2 INXFFA3: F0 F3 1079 BEQ NXTBASFFA5: D0 06 1080 BNE NXTCHRFFA7: A2 00 1081 GETNUM LDX #$00 ;CLEAR A2FFA9: 86 3E 1082 STX A2LFFAB: 86 3F 1083 STX A2HFFAD: B9 00 02 1084 NXTCHR LDA IN,Y ;GET CHARFFB0: C8 1085 INYFFB1: 49 B0 1086 EOR #$B0FFB3: C9 0A 1087 CMP #$0AFFB5: 90 D3 1088 BCC DIG ;IF HEX DIG, THENFFB7: 69 88 1089 ADC #$88FFB9: C9 FA 1090 CMP #$FAFFBB: B0 CD 1091 BCS DIGFFBD: 60 1092 RTSFFBE: A9 FE 1093 TOSUB LDA #GO/256 ;PUSH HIGH-ORDERFFC0: 48 1094 PHA ; SUBR ADR ON STKFFC1: B9 E3 FF 1095 LDA SUBTBL,Y ;PUSH LOW-ORDERFFC4: 48 1096 PHA ; SUBR ADR ON STKFFC5: A5 31 1097 LDA MODEFFC7: A0 00 1098 ZMODE LDY #$00 ;CLR MODE, OLD MODEFFC9: 84 31 1099 STY MODE ; TO A-REGFFCB: 60 1100 RTS ; GO TO SUBR VIA RTSFFCC: BC 1101 CHRTBL DFB $BC ;F("CTRL-C")FFCD: B2 1102 DFB $B2 ;F("CTRL-Y")FFCE: BE 1103 DFB $BE ;F("CTRL-E")FFCF: ED 1104 DFB $ED ;F("T")FFD0: EF 1105 DFB $EF ;F("V")FFD1: C4 1106 DFB $C4 ;F("CTRL-K")FFD2: EC 1107 DFB $EC ;F("S")FFD3: A9 1108 DFB $A9 ;F("CTRL-P")FFD4: BB 1109 DFB $BB ;F("CTRL-B")FFD5: A6 1110 DFB $A6 ;F("-")FFD6: A4 1111 DFB $A4 ;F("+")FFD7: 06 1112 DFB $06 ;F("M") (F=EX-OR $B0+$89)FFD8: 95 1113 DFB $95 ;F("<")FFD9: 07 1114 DFB $07 ;F("N")FFDA: 02 1115 DFB $02 ;F("I")FFDB: 05 1116 DFB $05 ;F("L")FFDC: F0 1117 DFB $F0 ;F("W")FFDD: 00 1118 DFB $00 ;F("G")FFDE: EB 1119 DFB $EB ;F("R")FFDF: 93 1120 DFB $93 ;F(":")FFE0: A7 1121 DFB $A7 ;F(".")FFE1: C6 1122 DFB $C6 ;F("CR")FFE2: 99 1123 DFB $99 ;F(BLANK)FFE3: B2 1124 SUBTBL DFB BASCONT-1FFE4: C9 1125 DFB USR-1FFE5: BE 1126 DFB REGZ-1FFE6: C1 1127 DFB TRACE-1FFE7: 35 1128 DFB VFY-1FFE8: 8C 1129 DFB INPRT-1FFE9: C3 1130 DFB STEPZ-1FFEA: 96 1131 DFB OUTPRT-1FFEB: AF 1132 DFB XBASIC-1FFEC: 17 1133 DFB SETMODE-1FFED: 17 1134 DFB SETMODE-1FFEE: 2B 1135 DFB MOVE-1FFEF: 1F 1136 DFB LT-1FFF0: 83 1137 DFB SETNORM-1FFF1: 7F 1138 DFB SETINV-1FFF2: 5D 1139 DFB LIST-1FFF3: CC 1140 DFB WRITE-1FFF4: B5 1141 DFB GO-1FFF5: FC 1142 DFB READ-1FFF6: 17 1143 DFB SETMODE-1FFF7: 17 1144 DFB SETMODE-1FFF8: F5 1145 DFB CRMON-1FFF9: 03 1146 DFB BLANK-1FFFA: FB 1147 DFB NMI ;NMI VECTORFFFB: 03 1148 DFB NMI/256FFFC: 59 1149 DFB RESET ;RESET VECTORFFFD: FF 1150 DFB RESET/256FFFE: 86 1151 DFB IRQ ;IRQ VECTORFFFF: FA 1152 DFB IRQ/256 1153 XQTNZ EQU $3C+------------------------------------------------------------------------| TOPIC -- Apple II -- Red Book Sweet-16 listing +------------------------------------------------------------------------ 1 *********************** 2 * * 3 * APPLE-II PSEUDO * 4 * MACHINE INTERPRETER * 5 * * 6 * COPYRIGHT 1977 * 7 * APPLE COMPUTER INC * 8 * * 9 * ALL RIGHTS RESERVED * 10 * S. WOZNIAK * 11 * * 12 *********************** 13 ; TITLE "SWEET16 INTERPRETER" 14 R0L EQU $0 15 R0H EQU $1 16 R14H EQU $1D 17 R15L EQU $1E 18 R15H EQU $1F 19 SW16PAG EQU $F7 20 SAVE EQU $FF4A 21 RESTORE EQU $FF3F 22 ORG $F689F689: 20 4A FF 23 SW16 JSR SAVE ;PRESERVE 6502 REG CONTENTSF68C: 68 24 PLAF68D: 85 1E 25 STA R15L ;INIT SWEET16 PCF68F: 68 26 PLA ;FROM RETURNF690: 85 1F 27 STA R15H ; ADDRESSF692: 20 98 F6 28 SW16B JSR SW16C ;INTERPRET AND EXECUTEF695: 4C 92 F6 29 JMP SW16B ;ONE SWEET16 INSTR.F698: E6 1E 30 SW16C INC R15LF69A: D0 02 31 BNE SW16D ;INCR SWEET16 PC FOR FETCHF69C: E6 1F 32 INC R15HF69E: A9 F7 33 SW16D LDA #SW16PAGF6A0: 48 34 PHA ;PUSH ON STACK FOR RTSF6A1: A0 00 35 LDY #$0F6A3: B1 1E 36 LDA (R15L),Y ;FETCH INSTRF6A5: 29 0F 37 AND #$F ;MASK REG SPECIFICATIONF6A7: 0A 38 ASL ;DOUBLE FOR TWO BYTE REGISTERSF6A8: AA 39 TAX ;TO X REG FOR INDEXINGF6A9: 4A 40 LSRF6AA: 51 1E 41 EOR (R15L),Y ;NOW HAVE OPCODEF6AC: F0 0B 42 BEQ TOBR ;IF ZERO THEN NON-REG OPF6AE: 86 1D 43 STX R14H ;INDICATE'PRIOR RESULT REG'F6B0: 4A 44 LSRF6B1: 4A 45 LSR ;OPCODE*2 TO LSB'SF6B2: 4A 46 LSRF6B3: A8 47 TAY ;TO Y REG FOR INDEXINGF6B4: B9 E1 F6 48 LDA OPTBL-2,Y ;LOW ORDER ADR BYTEF6B7: 48 49 PHA ;ONTO STACKF6B8: 60 50 RTS ;GOTO REG-OP ROUTINEF6B9: E6 1E 51 TOBR INC R15LF6BB: D0 02 52 BNE TOBR2 ;INCR PCF6BD: E6 1F 53 INC R15HF6BF: BD E4 F6 54 TOBR2 LDA BRTBL,X ;LOW ORDER ADR BYTEF6C2: 48 55 PHA ;ONTO STACK FOR NON-REG OPF6C3: A5 1D 56 LDA R14H ;'PRIOR RESULT REG' INDEXF6C5: 4A 57 LSR ;PREPARE CARRY FOR BC, BNC.F6C6: 60 58 RTS ;GOTO NON-REG OP ROUTINEF6C7: 68 59 RTNZ PLA ;POP RETURN ADDRESSF6C8: 68 60 PLAF6C9: 20 3F FF 61 JSR RESTORE ;RESTORE 6502 REG CONTENTSF6CC: 6C 1E 00 62 JMP (R15L) ;RETURN TO 6502 CODE VIA PCF6CF: B1 1E 63 SETZ LDA (R15L),Y ;HIGH-ORDER BYTE OF CONSTANTF6D1: 95 01 64 STA R0H,XF6D3: 88 65 DEYF6D4: B1 1E 66 LDA (R15L),Y ;LOW-ORDER BYTE OF CONSTANTF6D6: 95 00 67 STA R0L,XF6D8: 98 68 TYA ;Y-REG CONTAINS 1F6D9: 38 69 SECF6DA: 65 1E 70 ADC R15L ;ADD 2 TO PCF6DC: 85 1E 71 STA R15LF6DE: 90 02 72 BCC SET2F6E0: E6 1F 73 INC R15HF6E2: 60 74 SET2 RTSF6E3: 02 75 OPTBL DFB SET-1 ;1XF6E4: F9 76 BRTBL DFB RTN-1 ;0F6E5: 04 77 DFB LD-1 ;2XF6E6: 9D 78 DFB BR-1 ;1F6E7: 0D 79 DFB ST-1 ;3XF6E8: 9E 80 DFB BNC-1 ;2F6E9: 25 81 DFB LDAT-1 ;4XF6EA: AF 82 DFB BC-1 ;3F6EB: 16 83 DFB STAT-1 ;5XF6EC: B2 84 DFB BP-1 ;4F6ED: 47 85 DFB LDDAT-1 ;6XF6EE: B9 86 DFB BM-1 ;5F6EF: 51 87 DFB STDAT-1 ;7XF6F0: C0 88 DFB BZ-1 ;6F6F1: 2F 89 DFB POP-1 ;8XF6F2: C9 90 DFB BNZ-1 ;7F6F3: 5B 91 DFB STPAT-1 ;9XF6F4: D2 92 DFB BM1-1 ;8F6F5: 85 93 DFB ADD-1 ;AXF6F6: DD 94 DFB BNM1-1 ;9F6F7: 6E 95 DFB SUB-1 ;BXF6F8: 05 96 DFB BK-1 ;AF6F9: 33 97 DFB POPD-1 ;CXF6FA: E8 98 DFB RS-1 ;BF6FB: 70 99 DFB CPR-1 ;DXF6FC: 93 100 DFB BS-1 ;CF6FD: 1E 101 DFB INR-1 ;EXF6FE: E7 102 DFB NUL-1 ;DF6FF: 65 103 DFB DCR-1 ;FXF700: E7 104 DFB NUL-1 ;EF701: E7 105 DFB NUL-1 ;UNUSEDF702: E7 106 DFB NUL-1 ;FF703: 10 CA 107 SET BPL SETZ ;ALWAYS TAKENF705: B5 00 108 LD LDA R0L,X 109 BK EQU *-1F707: 85 00 110 STA R0LF709: B5 01 111 LDA R0H,X ;MOVE RX TO R0F70B: 85 01 112 STA R0HF70D: 60 113 RTSF70E: A5 00 114 ST LDA R0LF710: 95 00 115 STA R0L,X ;MOVE R0 TO RXF712: A5 01 116 LDA R0HF714: 95 01 117 STA R0H,XF716: 60 118 RTSF717: A5 00 119 STAT LDA R0LF719: 81 00 120 STAT2 STA (R0L,X) ;STORE BYTE INDIRECTF71B: A0 00 121 LDY #$0F71D: 84 1D 122 STAT3 STY R14H ;INDICATE R0 IS RESULT NEGF71F: F6 00 123 INR INC R0L,XF721: D0 02 124 BNE INR2 ;INCR RXF723: F6 01 125 INC R0H,XF725: 60 126 INR2 RTSF726: A1 00 127 LDAT LDA (R0L,X) ;LOAD INDIRECT (RX)F728: 85 00 128 STA R0L ;TO R0F72A: A0 00 129 LDY #$0F72C: 84 01 130 STY R0H ;ZERO HIGH-ORDER R0 BYTEF72E: F0 ED 131 BEQ STAT3 ;ALWAYS TAKENF730: A0 00 132 POP LDY #$0 ;HIGH ORDER BYTE = 0F732: F0 06 133 BEQ POP2 ;ALWAYS TAKENF734: 20 66 F7 134 POPD JSR DCR ;DECR RXF737: A1 00 135 LDA (R0L,X) ;POP HIGH ORDER BYTE @RXF739: A8 136 TAY ;SAVE IN Y-REGF73A: 20 66 F7 137 POP2 JSR DCR ;DECR RXF73D: A1 00 138 LDA (R0L,X) ;LOW-ORDER BYTEF73F: 85 00 139 STA R0L ;TO R0F741: 84 01 140 STY R0HF743: A0 00 141 POP3 LDY #$0 ;INDICATE R0 AS LAST RESULT REGF745: 84 1D 142 STY R14HF747: 60 143 RTSF748: 20 26 F7 144 LDDAT JSR LDAT ;LOW-ORDER BYTE TO R0, INCR RXF74B: A1 00 145 LDA (R0L,X) ;HIGH-ORDER BYTE TO R0F74D: 85 01 146 STA R0HF74F: 4C 1F F7 147 JMP INR ;INCR RXF752: 20 17 F7 148 STDAT JSR STAT ;STORE INDIRECT LOW-ORDERF755: A5 01 149 LDA R0H ;BYTE AND INCR RX. THENF757: 81 00 150 STA (R0L,X) ;STORE HIGH-ORDER BYTE.F759: 4C 1F F7 151 JMP INR ;INCR RX AND RETURNF75C: 20 66 F7 152 STPAT JSR DCR ;DECR RXF75F: A5 00 153 LDA R0LF761: 81 00 154 STA (R0L,X) ;STORE R0 LOW BYTE @RXF763: 4C 43 F7 155 JMP POP3 ;INDICATE R0 AS LAST RSLT REGF766: B5 00 156 DCR LDA R0L,XF768: D0 02 157 BNE DCR2 ;DECR RXF76A: D6 01 158 DEC R0H,XF76C: D6 00 159 DCR2 DEC R0L,XF76E: 60 160 RTSF76F: A0 00 161 SUB LDY #$0 ;RESULT TO R0F771: 38 162 CPR SEC ;NOTE Y-REG = 13*2 FOR CPRF772: A5 00 163 LDA R0LF774: F5 00 164 SBC R0L,XF776: 99 00 00 165 STA R0L,Y ;R0-RX TO RYF779: A5 01 166 LDA R0HF77B: F5 01 167 SBC R0H,XF77D: 99 01 00 168 SUB2 STA R0H,YF780: 98 169 TYA ;LAST RESULT REG*2F781: 69 00 170 ADC #$0 ;CARRY TO LSBF783: 85 1D 171 STA R14HF785: 60 172 RTSF786: A5 00 173 ADD LDA R0LF788: 75 00 174 ADC R0L,XF78A: 85 00 175 STA R0L ;R0+RX TO R0F78C: A5 01 176 LDA R0HF78E: 75 01 177 ADC R0H,XF790: A0 00 178 LDY #$0 ;R0 FOR RESULTF792: F0 E9 179 BEQ SUB2 ;FINISH ADDF794: A5 1E 180 BS LDA R15L ;NOTE X-REG IS 12*2!F796: 20 19 F7 181 JSR STAT2 ;PUSH LOW PC BYTE VIA R12F799: A5 1F 182 LDA R15HF79B: 20 19 F7 183 JSR STAT2 ;PUSH HIGH-ORDER PC BYTEF79E: 18 184 BR CLCF79F: B0 0E 185 BNC BCS BNC2 ;NO CARRY TESTF7A1: B1 1E 186 BR1 LDA (R15L),Y ;DISPLACEMENT BYTEF7A3: 10 01 187 BPL BR2F7A5: 88 188 DEYF7A6: 65 1E 189 BR2 ADC R15L ;ADD TO PCF7A8: 85 1E 190 STA R15LF7AA: 98 191 TYAF7AB: 65 1F 192 ADC R15HF7AD: 85 1F 193 STA R15HF7AF: 60 194 BNC2 RTSF7B0: B0 EC 195 BC BCS BRF7B2: 60 196 RTSF7B3: 0A 197 BP ASL ;DOUBLE RESULT-REG INDEXF7B4: AA 198 TAX ;TO X REG FOR INDEXINGF7B5: B5 01 199 LDA R0H,X ;TEST FOR PLUSF7B7: 10 E8 200 BPL BR1 ;BRANCH IF SOF7B9: 60 201 RTSF7BA: 0A 202 BM ASL ;DOUBLE RESULT-REG INDEXF7BB: AA 203 TAXF7BC: B5 01 204 LDA R0H,X ;TEST FOR MINUSF7BE: 30 E1 205 BMI BR1F7C0: 60 206 RTSF7C1: 0A 207 BZ ASL ;DOUBLE RESULT-REG INDEXF7C2: AA 208 TAXF7C3: B5 00 209 LDA R0L,X ;TEST FOR ZEROF7C5: 15 01 210 ORA R0H,X ;(BOTH BYTES)F7C7: F0 D8 211 BEQ BR1 ;BRANCH IF SOF7C9: 60 212 RTSF7CA: 0A 213 BNZ ASL ;DOUBLE RESULT-REG INDEXF7CB: AA 214 TAXF7CC: B5 00 215 LDA R0L,X ;TEST FOR NON-ZEROF7CE: 15 01 216 ORA R0H,X ;(BOTH BYTES)F7D0: D0 CF 217 BNE BR1 ;BRANCH IF SOF7D2: 60 218 RTSF7D3: 0A 219 BM1 ASL ;DOUBLE RESULT-REG INDEXF7D4: AA 220 TAXF7D5: B5 00 221 LDA R0L,X ;CHECK BOTH BYTESF7D7: 35 01 222 AND R0H,X ;FOR $FF (MINUS 1)F7D9: 49 FF 223 EOR #$FFF7DB: F0 C4 224 BEQ BR1 ;BRANCH IF SOF7DD: 60 225 RTSF7DE: 0A 226 BNM1 ASL ;DOUBLE RESULT-REG INDEXF7DF: AA 227 TAXF7E0: B5 00 228 LDA R0L,XF7E2: 35 01 229 AND R0H,X ;CHECK BOTH BYTES FOR NO $FFF7E4: 49 FF 230 EOR #$FFF7E6: D0 B9 231 BNE BR1 ;BRANCH IF NOT MINUS 1F7E8: 60 232 NUL RTSF7E9: A2 18 233 RS LDX #$18 ;12*2 FOR R12 AS STACK POINTERF7EB: 20 66 F7 234 JSR DCR ;DECR STACK POINTERF7EE: A1 00 235 LDA (R0L,X) ;POP HIGH RETURN ADDRESS TO PCF7F0: 85 1F 236 STA R15HF7F2: 20 66 F7 237 JSR DCR ;SAME FOR LOW-ORDER BYTEF7F5: A1 00 238 LDA (R0L,X)F7F7: 85 1E 239 STA R15LF7F9: 60 240 RTSF7FA: 4C C7 F6 241 RTN JMP RTNZ+------------------------------------------------------------------------| TOPIC -- Apple II -- WOZPAK Sweet-16 article by Steve Wozniak +------------------------------------------------------------------------SWEET 16: A Pseudo 16 Bit Microprocessorby Steve WozniakDescription:------------While writing APPLE BASIC for a 6502 microprocessor, I repeatedlyencountered a variant of MURPHY'S LAW. Briefly stated, any routineoperating on 16-bit data will require at least twice the code thatit should. Programs making extensive use of 16-bit pointers (suchas compilers, editors, and assemblers) are included in thiscategory. In my case, even the addition of a few double-byteinstructions to the 6502 would have only slightly alleviated theproblem. What I really needed was a 6502/RCA 1800 hybrid - anabundance of 16-bit registers and excellent pointer capability.My solution was to implement a non-existant (meta) 16-bitprocessor in software, interpreter style, which I call SWEET 16.SWEET 16 is based on sixteen 16-bit registers (R0-15), which areactually 32 memory locations. R0 doubles as the SWEET 16accumulator (ACC), R15 as the program counter (PC), and R14 as thestatus register. R13 holds compare instruction results and R12 isthe subroutine return stack pointer if SWEET 16 subroutines areused. All other SWEET 16 registers are at the user's unrestricteddisposal.SWEET 16 instructions fall into register and non-register categories.The register ops specify one of the sixteen registers to be used aseither a data element or a pointer to data in memory, dependingon the specific instruction. For example INR R5 uses R5 as dataand ST @R7 uses R7 as a pointer to data in memory. Except for theSET instruction, register ops take one byte of code each. Thenon-register ops are primarily 6502 style branches with the secondbyte specifying a +/-127 byte displacement relative to the addressof the following instruction. Providing that the prior register opresult meets a specified branch condition, the displacement isadded to the SWEET 16 PC, effecting a branch.SWEET 16 is intended as a 6502 enhancement package, not a standalone processor. A 6502 program switches to SWEET 16 mode with asubroutine call and subsequent code is interpreted as SWEET 16instructions. The nonregister op RTN returns the user program to6502 mode after restoring the internal register contents(A, X, Y, P, and S). The following example illustrates how to useSWEET 16.300 B9 00 02 LDA IN,Y ;get a char303 C9 CD CMP #"M" ;"M" for move305 D0 09 BNE NOMOVE ;No. Skip move307 20 89 F6 JSR SW16 ;Yes, call SWEET 1630A 41 MLOOP LD @R1 ;R1 holds source30B 52 ST @R2 ;R2 holds dest. addr.30C F3 DCR R3 ;Decr. length30D 07 FB BNZ MLOOP ;Loop until done30F 00 RTN ;Return to 6502 mode.310 C9 C5 NOMOVE CMP #"E" ;"E" char?312 D0 13 BEQ EXIT ;Yes, exit314 C8 INY ;No, cont.NOTE: Registers A, X, Y, P, and S are not disturbed by SWEET 16.Instruction Descriptions:-------------------------The SWEET 16 opcode listing is short and uncomplicated. Exceptingrelative branch displacements, hand assembly is trivial. Allregister opcodes are formed by combining two Hex digits, one for theopcode and one to specify a register. For example, opcodes 15 and45 both specify register R5 while codes 23, 27, and 29 are all STops. Most register ops are assigned in complementary pairs tofacilitate remembering them. Therefore, LD ans ST are opcodes 2Nand 3N respectively, while LD @ and ST @ are codes 4N and 5N.Opcodes 0 to C (Hex) are assigned to the thirteen non-register ops.Except for RTN (opcode 0), BK (0A), and RS (0B), the non registerops are 6502 style branches. The second byte of a branch instructioncontains a +/-127 byte displacement value (in two's complement form)relative to the address of the instruction immediately followingthe branch.If a specified branch condition is met by the prior register opresult, the displacement is added to the PC effecting a branch.Except for the BR (Branch always) and BS (Branch to a Subroutine),the branch opcodes are assigned in complementary pairs, renderingthem easily remembered for hand coding. For example, Branch if Plusand Branch if Minus are opcodes 4 and 5 while Branch if Zero andBranch if NonZero are opcodes 6 and 7.SWEET 16 Opcode Summary:------------------------Register OPS- 1n SET Rn Constant (Set) 2n LD Rn (Load) 3n ST Rn (Store) 4n LD @Rn (Load Indirect) 5n ST @Rn (Store Indirect) 6n LDD @Rn (Load Double Indirect) 7n STD @Rn (Store Double Indirect) 8n POP @Rn (Pop Indirect) 9n STP @Rn (Store POP Indirect) An ADD Rn (Add) Bn SUB Rn (Sub) Cn POPD @Rn (Pop Double Indirect) Dn CPR Rn (Compare) En INR Rn (Increment) Fn DCR Rn (Decrement)Non-register OPS- 00 RTN (Return to 6502 mode) 01 BR ea (Branch always) 02 BNC ea (Branch if No Carry) 03 BC ea (Branch if Carry) 04 BP ea (Branch if Plus) 05 BM ea (Branch if Minus) 06 BZ ea (Branch if Zero) 07 BNZ ea (Branch if NonZero) 08 BM1 ea (Branch if Minus 1) 09 BNM1 ea (Branch if Not Minus 1) 0A BK (Break) 0B RS (Return from Subroutine) 0C BS ea (Branch to Subroutine) 0D (Unassigned) 0E (Unassigned) 0F (Unassigned)Register Instructions:----------------------SET: SET Rn,Constant [ 1n Low High ] The 2-byte constant is loaded into Rn (n=0 to F, Hex) and branch conditions set accordingly. The carry is cleared. EXAMPLE: 15 34 A0 SET R5 $A034 ;R5 now contains $A034LOAD: LD Rn [ 2n ] The ACC (R0) is loaded from Rn and branch conditions set according to the data transferred. The carry is cleared and contents of Rn are not disturbed. EXAMPLE: 15 34 A0 SET R5 $A034 25 LD R5 ;ACC now contains $A034STORE: ST Rn [ 3n ] The ACC is stored into Rn and branch conditions set according to the data transferred. The carry is cleared and the ACC contents are not disturbed. EXAMPLE: 25 LD R5 ;Copy the contents 36 ST R6 ;of R5 to R6LOAD INDIRECT: LD @Rn [ 4n ] The low-order ACC byte is loaded from the memory location whose address resides in Rn and the high-order ACC byte is cleared. Branch conditions reflect the final ACC contents which will always be positive and never minus 1. The carry is cleared. After the transfer, Rn is incremented by 1. EXAMPLE 15 34 A0 SET R5 $A034 45 LD @R5 ;ACC is loaded from memory ;location $A034 ;R5 is incr to $A035STORE INDIRECT: ST @Rn [ 5n ] The low-order ACC byte is stored into the memory location whose address resides in Rn. Branch conditions reflect the 2-byte ACC contents. The carry is cleared. After the transfer Rn is incremented by 1. EXAMPLE: 15 34 A0 SET R5 $A034 ;Load pointers R5, R6 with 16 22 90 SET R6 $9022 ;$A034 and $9022 45 LD @R5 ;Move byte from $A034 to $9022 56 ST @R6 ;Both ptrs are incrementedLOAD DOUBLE-BYTE INDIRECT: LDD @Rn [ 6n ] The low order ACC byte is loaded from memory location whose address resides in Rn, and Rn is then incremented by 1. The high order ACC byte is loaded from the memory location whose address resides in the incremented Rn, and Rn is again incremented by 1. Branch conditions reflect the final ACC contents. The carry is cleared. EXAMPLE: 15 34 A0 SET R5 $A034 ;The low-order ACC byte is loaded 65 LDD @R6 ;from $A034, high-order from ;$A035, R5 is incr to $A036STORE DOUBLE-BYTE INDIRECT: STD @Rn [ 7n ] The low-order ACC byte is stored into memory location whose address resides in Rn, and Rn is the incremented by 1. The high-order ACC byte is stored into the memory location whose address resides in the incremented Rn, and Rn is again incremented by 1. Branch conditions reflect the ACC contents which are not disturbed. The carry is cleared. EXAMPLE: 15 34 A0 SET R5 $A034 ;Load pointers R5, R6 16 22 90 SET R6 $9022 ;with $A034 and $9022 65 LDD @R5 ;Move double byte from 76 STD @R6 ;$A034-35 to $9022-23. ;Both pointers incremented by 2.POP INDIRECT: POP @Rn [ 8n ] The low-order ACC byte is loaded from the memory location whose address resides in Rn after Rn is decremented by 1, and the high order ACC byte is cleared. Branch conditions reflect the final 2-byte ACC contents which will always be positive and never minus one. The carry is cleared. Because Rn is decremented prior to loading the ACC, single byte stacks may be implemented with the ST @Rn and POP @Rn ops (Rn is the stack pointer). EXAMPLE: 15 34 A0 SET R5 $A034 ;Init stack pointer 10 04 00 SET R0 4 ;Load 4 into ACC 55 ST @R5 ;Push 4 onto stack 10 05 00 SET R0 5 ;Load 5 into ACC 55 ST @R5 ;Push 5 onto stack 10 06 00 SET R0 6 ;Load 6 into ACC 55 ST @R5 ;Push 6 onto stack 85 POP @R5 ;Pop 6 off stack into ACC 85 POP @R5 ;Pop 5 off stack 85 POP @R5 ;Pop 4 off stackSTORE POP INDIRECT: STP @Rn [ 9n ] The low-order ACC byte is stored into the memory location whose address resides in Rn after Rn is decremented by 1. Branch conditions will reflect the 2-byte ACC contents which are not modified. STP @Rn and POP @Rn are used together to move data blocks beginning at the greatest address and working down. Additionally, single-byte stacks may be implemented with the STP @Rn ops. EXAMPLE: 14 34 A0 SET R4 $A034 ;Init pointers 15 22 90 SET R5 $9022 84 POP @R4 ;Move byte from 95 STP @R5 ;$A033 to $9021 84 POP @R4 ;Move byte from 95 STP @R5 ;$A032 to $9020ADD: ADD Rn [ An ] The contents of Rn are added to the contents of ACC (R0), and the low-order 16 bits of the sum restored in ACC. the 17th sum bit becomes the carry and the other branch conditions reflect the final ACC contents. EXAMPLE: 10 34 76 SET R0 $7634 ;Init R0 (ACC) and R1 11 27 42 SET R1 $4227 A1 ADD R1 ;Add R1 (sum=B85B, C clear) A0 ADD R0 ;Double ACC (R0) to $70B6 ;with carry set.SUBTRACT: SUB Rn [ Bn ] The contents of Rn are subtracted from the ACC contents by performing a two's complement addition: ACC = ACC + Rn + 1 The low order 16 bits of the subtraction are restored in the ACC, the 17th sum bit becomes the carry and other branch conditions reflect the final ACC contents. If the 16-bit unsigned ACC contents are greater than or equal to the 16-bit unsigned Rn contents, then the carry is set, otherwise it is cleared. Rn is not disturbed. EXAMPLE: 10 34 76 SET R0 $7634 ;Init R0 (ACC) 11 27 42 SET R1 $4227 ;and R1 B1 SUB R1 ;subtract R1 ;(diff=$340D with c set) B0 SUB R0 ;clears ACC. (R0)POP DOUBLE-BYTE INDIRECT: POPD @Rn [ Cn ] Rn is decremented by 1 and the high-order ACC byte is loaded from the memory location whose address now resides in Rn. Rn is again decremented by 1 and the low-order ACC byte is loaded from the corresponding memory location. Branch conditions reflect the final ACC contents. The carry is cleared. Because Rn is decremented prior to loading each of the ACC halves, double-byte stacks may be implemented with the STD @Rn and POPD @Rn ops (Rn is the stack pointer). EXAMPLE: 15 34 A0 SET R5 $A034 ;Init stack pointer 10 12 AA SET R0 $AA12 ;Load $AA12 into ACC 75 STD @R5 ;Push $AA12 onto stack 10 34 BB SET R0 $BB34 ;Load $BB34 into ACC 75 STD @R5 ;Push $BB34 onto stack C5 POPD @R5 ;Pop $BB34 off stack C5 POPD @R5 ;Pop $AA12 off stackCOMPARE: CPR Rn [ Dn ] The ACC (R0) contents are compared to Rn by performing the 16 bit binary subtraction ACC-Rn and storing the low order 16 difference bits in R13 for subsequent branch tests. If the 16 bit unsigned ACC contents are greater than or equal to the 16 bit unsigned Rn contents, then the carry is set, otherwise it is cleared. No other registers, including ACC and Rn, are disturbed. EXAMPLE: 15 34 A0 SET R5 $A034 ;Pointer to memory 16 BF A0 SET R6 $A0BF ;Limit address B0 LOOP1 SUB R0 ;Zero data 75 STD @R5 ;clear 2 locations ;increment R5 by 2 25 LD R5 ;Compare pointer R5 D6 CPR R6 ;to limit R6 02 FA BNC LOOP1 ;loop if C clearINCREMENT: INR Rn [ En ] The contents of Rn are incremented by 1. The carry is cleared and other branch conditions reflect the incremented value. EXAMPLE: 15 34 A0 SET R5 $A034 ;(Pointer) B0 SUB R0 ;Zero to R0 55 ST @R5 ;Clr Location $A034 E5 INR R5 ;Incr R5 to $A036 55 ST @R5 ;Clrs location $A036 ;(not $A035)DECREMENT: DCR Rn [ Fn ] The contents of Rn are decremented by 1. The carry is cleared and other branch conditions reflect the decremented value. EXAMPLE: (Clear 9 bytes beginning at location A034) 15 34 A0 SET R5 $A034 ;Init pointer 14 09 00 SET R4 9 ;Init counter B0 SUB R0 ;Zero ACC 55 LOOP2 ST @R5 ;Clear a mem byte F4 DCR R4 ;Decrement count 07 FC BNZ LOOP2 ;Loop until ZeroNon-Register Instructions:--------------------------RETURN TO 6502 MODE: RTN 00 Control is returned to the 6502 and program execution continues at the location immediately following the RTN instruction. the 6502 registers and status conditions are restored to their original contents (prior to entering SWEET 16 mode).BRANCH ALWAYS: BR ea [ 01 d ] An effective address (ea) is calculated by adding the signed displacement byte (d) to the PC. The PC contains the address of the instruction immediately following the BR, or the address of the BR op plus 2. The displacement is a signed two's complement value from -128 to +127. Branch conditions are not changed. NOTE: The effective address calculation is identical to that for 6502 relative branches. The Hex add & Subtract features of the APPLE ][ monitor may be used to calculate displacements. d = $80 ea = PC + 2 - 128 d = $81 ea = PC + 2 - 127 d = $FF ea = PC + 2 - 1 d = $00 ea = PC + 2 + 0 d = $01 ea = PC + 2 + 1 d = $7E ea = PC + 2 + 126 d = $7F ea = PC + 2 + 127 EXAMPLE: $300: 01 50 BR $352BRANCH IF NO CARRY: BNC ea [ 02 d ] A branch to the effective address is taken only is the carry is clear, otherwise execution resumes as normal with the next instruction. Branch conditions are not changed.BRANCH IF CARRY SET: BC ea [ 03 d ] A branch is effected only if the carry is set. Branch conditions are not changed.BRANCH IF PLUS: BP ea [ 04 d ] A branch is effected only if the prior 'result' (or most recently transferred dat) was positive. Branch conditions are not changed. EXAMPLE: (Clear mem from A034 to A03F) 15 34 A0 SET R5 $A034 ;Init pointer 14 3F A0 SET R4 $A03F ;Init limit B0 LOOP3 SUB R0 55 ST @R5 ;Clear mem byte ;Increment R5 24 LD R4 ;Compare limit D5 CPR R5 ;to pointer 04 FA BP LOOP3 ;Loop until doneBRANCH IF MINUS: BM ea [ 05 d ] A branch is effected only if prior 'result' was minus (negative, MSB = 1). Branch conditions are not changed.BRANCH IF ZERO: BZ ea [ 06 d ] A Branch is effected only if the prior 'result' was zero. Branch conditions are not changed.BRANCH IF NONZERO BNZ ea [ 07 d ] A branch is effected only if the priot 'result' was non-zero Branch conditions are not changed.BRANCH IF MINUS ONE BM1 ea [ 08 d ] A branch is effected only if the prior 'result' was minus one ($FFFF Hex). Branch conditions are not changed.BRANCH IF NOT MINUS ONE BNM1 ea [ 09 d ] A branch effected only if the prior 'result' was not minus 1. Branch conditions are not changed.BREAK: BK [ 0A ] A 6502 BRK (break) instruction is executed. SWEET 16 may be re-entered non destructively at SW16d after correcting the stack pointer to its value prior to executing the BRK.RETURN FROM SWEET 16 SUBROUTINE: RS [ 0B ] RS terminates execution of a SWEET 16 subroutine and returns to the SWEET 16 calling program which resumes execution (in SWEET 16 mode). R12, which is the SWEET 16 subroutine return stack pointer, is decremented twice. Branch conditions are not changed.BRANCH TO SWEET 16 SUBROUTINE: BS ea [ 0c d ] A branch to the effective address (PC + 2 + d) is taken and execution is resumed in SWEET 16 mode. The current PC is pushed onto a SWEET 16 subroutine return address stack whose pointer is R12, and R12 is incremented by 2. The carry is cleared and branch conditions set to indicate the current ACC contents. EXAMPLE: (Calling a 'memory move' subroutine to move A034-A03B to 3000-3007) 15 34 A0 SET R5 $A034 ;Init pointer 1 14 3B A0 SET R4 $A03B ;Init limit 1 16 00 30 SET R6 $3000 ;Init pointer 2 0C 15 BS MOVE ;Call move subroutine 45 MOVE LD @R5 ;Move one 56 ST @R6 ;byte 24 LD R4 D5 CPR R5 ;Test if done 04 FA BP MOVE 0B RS ;ReturnTheory of Operation:--------------------SWEET 16 execution mode begins with a subroutine call to SW16. All6502 registers are saved at this time, to be restored when a SWEET16 RTN instruction returns control to the 6502. If you can tolerateindefinate 6502 register contents upon exit, approximately 30 usecmay be saved by entering at SW16 + 3. Because this might cause aninadvertant switch from Hex to Decimal mode, it is advisable to enterat SW16 the first time through.After saving the 6502 registers, SWEET 16 initializes its PC (R15)with the subroutine return address off the 6502 stack. SWEET 16'sPC points to the location preceding the next instruction to beexecuted. Following the subroutine call are 1-,2-, and 3-byteSWEET 16 instructions, stored in ascending memory like 6502instructions. the main loop at SW16B repeatedly calls the 'executeinstruction' routine to execute it.Subroutine SW16C increments the PC (R15) and fetches the next opcode,which is either a register op of the form OP REG with OP between 1and 15 or a non-register op of the form 0 OP with OP between 0 and 13.Assuming a register op, the register specification is doubled toaccount for the 3 byte SWEET 16 registers and placed in the X-regfor indexing. Then the instruction type is determined. Register opsplace the doubled register specification in the high order byte ofR14 indicating the 'prior result register' to subsequent branchinstructions. Non-register ops treat the register specifcation(right-hand half-byte) as their opcode, increment the SWEET 16 PCto point at the displacement byte of branch instructions, load theA-reg with the 'prior result register' index for branch conditiontesting, and clear the Y-reg.When is an RTS really a JSR?----------------------------Each instruction type has a corresponding subroutine. The subroutineentry points are stored in a table which is directly indexed into bythe opcode. By assigning all the entries to a common page, only asingle byte to address need be stored per routine. The 6502 indirectjump might have been used as follows to transfer control to theappropriate subroutine. LDA #ADRH ;High-order byte. STA IND+1 LDA OPTBL,X ;Low-order byte. STA IND JMP (IND)To save code, the subroutine entry address (minus 1) is pushed ontothe stack, high-order byte first. A 6502 RTS (return from subroutine)is used to pop the address off the stack and into the 6502 PC (afterincrementing by 1). The net result is that the desired subroutine isreached by executing a subroutine return instruction!Opcode Subroutines:-------------------The register op routines make use of the 6502 'zero page indexed by X'and 'indexed by X direct' addressing modes to access the specifiedregisters and indirect data. The 'result' of most register ops is leftin the specified register and can be sensed by subsequent branchinstructions, since the register specification is saved in the high-order byte of R14. This specification is changed to indicate R0 (ACC)for ADD and SUB instructions and R13 for the CPR (compare) instruction.Normally the high-order R14 byte holds the 'prior result register'index times 2 to account for the 2-byte SWEET 16 registers and theLSB is zero. If ADD, SUB, or CPR instructions generate carries, thenthis index is incremented, setting the LSB.The SET instruction increments the PC twice, picking up data bytes inthe specified register. In accordance with 6502 convention, thelow-order data byte precedes the high-order byte.Most SWEET 16 non-register ops are relative branches. The correspondingsubroutines determine whether or not the 'prior result' meets thespecified branch condition and if so, update the SWEET 16 PC by addingthe displacement value (-128 to +127 bytes).The RTN op restores the 6502 register contents, pops the subroutinereturn stack and jumps indirect through the SWEET 16 PC. This transferscontrol to the 6502 at the instruction immediately following theRTN instruction.The BK op actually executes a 6502 break instruction (BRK), transferringcontrol to the interrupt handler.Any number of subroutine levels may be implemented within SWEET 16 codevia the BS (Branch to Subroutine) and RS (Return from Subroutine)instructions. The user must initialize and otherwise not disturb R12 ifthe SWEET 16 subroutine capability is used since it is utilized as theautomatic return stack pointer.Memory Allocation:------------------The only storage that must be allocated for SWEET 16 variables are 32consecutive locations in page zero for the SWEET 16 registers, fourlocations to save the 6502 register contents, and a few levels of the6502 subroutine return address stack. if you don't need to preserve the6502 register contents, delete the SAVE and RESTORE subroutines and thecorresponding subroutine calls. This will free the four page zerolocations ASAV, XSAV, YSAV, and PSAV.User Modifications:-------------------You may wish to add some of your own instructions to this implementation ofSWEET 16. If you use the unassigned opcodes $0E and $0F, remember thatSWEET 16 treats these as 2-byte instructions. You may wish to handle thebreak instruction as a SWEET 16 call, saving two bytes of code each timeyou transfer into SWEET 16 mode. Or you may wish to use the SWEET 16BK (break) op as a 'CHAROUT' call in the interrupt handler. You can performabsolute jumps within SWEET 16 by loading the ACC (R0) with the addressyou wish to jump to (minus 1) and executing a ST R15 instruction.+------------------------------------------------------------------------| TOPIC -- Apple II -- WOZPAK Sweet-16 article by Dick Sedgewick +------------------------------------------------------------------------SWEET 16 - INTRODUCTIONby Dick SedgewickSweet 16 is probably the least used and least understood seedin the Apple ][.In exactly the same sense that Integer and Applesoft Basicsare languages, SWEET 16 is a language. Compared to theBasics, however, it would be classed as low level with astrong likeness to conventional 6502 Assembly language.To use SWEET 16, you must learn the language - and to quote"WOZ", "The opcode list is short and uncomplicated". "WOZ"(Steve Wozniak), of course is Mr. Apple, and the creator ofSWEET 16.SWEET 16 is ROM based in every Apple ][ from $F689 to $F7FC.It has it's own set of opcodes and instruction sets, and usesthe SAVE and RESTORE routines from the Apple Monitor topreserve the 6502 registers when in use, allowing SWEET 16 tobe used as a subroutine.It uses the first 32 locations on zero page to set up its 16double byte registers, and is therefore not compatible withApplesoft Basic without some additional efforts.The original article, "SWEET 16: The 6502 Dream Machine",first appeared in Byte Magazine, November 1977 and later inthe original "WOZ PAK". The article is included here andagain as test material to help understand the use andimplementation of SWEET 16.Examples of the use of SWEET 16 are found in the Programmer'sAid #1, in the Renumber, Append, and Relocate programs. TheProgrammer's Aid Operating Manual contains complete sourceassembly listings, indexed on page 65.The demonstration program is written to be introductory andsimple, consisting of three parts: 1. Integer Basic Program 2. Machine Language Subroutine 3. SWEET 16 SubroutineThe task of the program will be to move data. Parameters ofthe move will be entered in the Integer Basic Program.The "CALL 768" ($300) at line 120, enters a 6502 machinelanguage subroutine having the single purpose of enteringSWEET 16 and subsequently returning to BASIC (addresses $300,$301, $302, and $312 respectively). The SWEET 16 subroutineof course performs the move, and is entered at Hex locations$303 to $311 (see listing Number 3).After the move, the screen will display three lines of data,each 8 bytes long, and await entry of a new set of parameters.The three lines of data displayed on the screen are asfollows: Line 1: The first 8 bytes of data starting at $800, which is the fixed source data to be moved (in this case, the string A$). Line 2: The first 8 bytes of data starting at the hex address entered as the destination of the move (high order byte only). Line 3: The first 8 bytes of data starting at $0000 (the first four SWEET 16 registers).The display of 8 bytes of data was chosen to simplify theillustration of what goes on.Integer Basic has its own way of recording the string A$.Because the name chosen for the string "A$" is stored in 2bytes, a total of five housekeeping bytes precede the dataentered as A$, leaving only three additional bytes availablefor display. Integer Basic also adds a housekeeping byte atthe end of a string, known as the "string terminator".Consequently, for convenience purposes of the display, and tosee the string terminator as the 8th byte, the string dataentered via the keyboard should be limited to two characters,and will appear as the 6th and 7th bytes. Additionally,parameters to be entered include the number of bytes to bemoved. A useful range for this demonstration would be 1-8inclusive, but of course 1-255 will work.Finally, the starting address of the destination of the movemust be entered. Again, for simplicity, only the high-orderbyte is entered, and the program allows a choice betweenDecimal 9 and high-order byte of program pointer 1, to avoidunnecessary problems (in this demonstration enter a decimalnumber between 9 and 144 for a 48K APPLE).The 8 bytes of data displayed starting at $00 will enable oneto observe the condition of the SWEET 16 registers after amove has been accomplished, and thereby understand how theSWEET 16 program works.From the article "SWEET 16: A 6502 Dream Machine", rememberthat SWEET 16 can establish 16 double byte registers startingat $00. This means that SWEET 16 can use the first 32addresses on zero page.The "events" occurring in this demonstration program can bestudied in the first four SWEET 16 registers. Therefore, the8 byte display starting at $0000 is large enough for thispurpose.These four registers are established as R0, R1, R2, R3:R0 $0000 & 0001 -SWEET 16 accumulatorR1 $0002 & 0003 -Source addressR2 $0004 & 0005 -Destination addressR3 $0006 & 0007 -Number of bytes to move . . .R14 $001C & 001D -Prior result registerR15 $001E & 001F -SWEET 16 Program counterAdditionally, an examination of registers R14 and R15 willextend and understanding of SWEET 16, as fully explained inthe "WOZ" text. Notice that the high order byte of R14,(located at $1D) contains $06, and is the doubled registerspecification (3X2=$06). R15, the SWEET 16 program countercontains the address of the next operation as it did for eachstep during execution of the program, which was $0312 whenexecution ended and the 6502 code resumed.To try a sample run, enter the Integer Basic program as shownin Listing #1. Of course, REM statements can be omitted, andline 10 is only helpful if the machine code is to be storedon disk. Listing #2 must also be entered starting at $300.NOTE: A 6502 disassembly does not look like listing #3, butthe SOURCEROR disassembler would create a correct disassembly. Enter "RUN" and hit RETURN Enter "12" and hit RETURN (A$ - A$ string data) Enter "18" and hit RETURN (high-order byte of destination)The display should appear as follows: $0800-C1 40 00 10 08 B1 B2 1E (SOURCE) $0A00-C1 40 00 10 08 B1 B2 1E (Dest.) $0000-1E 00 08 08 08 0A 00 00 (SWEET 16)NOTE: The 8 bytes stored at $0A00 are identical to the 8bytes starting at $0800, indicating that an accurate move of 8bytes length has been made. They are moved one byte at atime starting with token C1 and ending with token 1E. Ifmoving less than 8 bytes, the data following the moved datawould be whatever existed at those locations before the move.The bytes have the following significance:A Token$ C1 40 00 10 08 B1 B2 1E --------- ---- -------- --------- -- | | | | | String VN DSP NVA DATA DATA TerminatorThe SWEET 16 registers are as shown: low high low high low high low high$0000 1E 00 08 08 08 0A 00 00 ---------- ---------- ---------- ---------- | | | | register register register register R0 R1 R2 R3 (acc) (source) (dest) (#bytes)The low order byte of R0, the SWEET 16 accumulator, has $1Ein it, the last byte moved (the 8th).The low order byte of the source register R1 started as $00and was incremented eight times, once for each byte of moveddata.The high order byte of the destination register R2 contains$0A, which was entered at 10 (the variable) and poked intothe SWEET 16 code. The low-order byte of R2 was incrementedexactly like R1.Finally, register R3, the register that stores the number ofbytes to be moved, has been poked to 8 (the variable B) anddecremented eight times as each byte got moved, ending up$0000.By entering character strings and varying the number of bytesto be moved, the SWEET 16 registers can be observed and thecontents predicted.Working with this demonstration program, and study of thetext material will enable you to write SWEET 16 programs thatperform additional 16 bit manipulations. The unassignedopcodes mentioned in the "WOZ Dream Machine" article shouldpresent a most interesting opportunity to "play".SWEET 16 as a language - or tool - opens a new direction toApple ][ owners without spending a dime, and it's been thereall the time."Apple-ites" who desire to learn machine language programming,can use SWEET 16 as a starting point. With this textmaterial to use, and less opcodes to learn, a user canquickly be effective.Listing #1>List 10 PRINT "[D]BLOAD SWEET": REM CTRL D 20 CALL - 936: DIM A $ (10) 30 INPUT "ENTER STRING A $ " , A $ 40 INPUT "ENTER # BYTES " , B 50 IF NOT B THEN 40 : REM AT LEAST 1 60 POKE 778 , B : REM POKE LENGTH 70 INPUT "ENTER DESTINATION " , A 80 IF A > PEEK (203) - 1 THEN 70 90 IF A < PEEK (205) + 1 THEN 70 100 POKE 776 , A : REM POKE DESTINATION 110 M = 8 : GOSUB 160 : REM DISPLAY 120 CALL 768 : REM GOTO $0300 130 M = A : GOSUB 160 : REM DISPLAY 140 M = O : GOSUB 160 : REM DISPLAY 150 PRINT : PRINT : GOTO 30 160 POKE 60 , 0 : POKE 61 , M 170 CALL -605 : RETURN : REM XAM8 IN MONITORListing #2 300:20 89 F6 11 00 08 12 00 00 13 00 00 41 52 F3 07 FB 00 60Listing #3SWEET 16 $300 20 89 F6 JSR $F689 $303 11 00 08 SET R1 source address $306 12 00 00 SET R2 destination address A $309 13 00 00 SET R3 length B $30C 41 LD @R1 $30D 52 ST @R2 $30E F3 DCR R3 $30F 07 BNZ $30C $311 00 RTN $312 60 RTSData will be poked from the Integer Basic program: "A" from Line 100 "B" from Line 60+------------------------------------------------------------------------| TOPIC -- Apple II -- Red Book Mini-Assembler listing +------------------------------------------------------------------------ 1 *********************** 2 * * 3 * APPLE-II * 4 * MINI-ASSEMBLER * 5 * * 6 * COPYRIGHT 1977 BY * 7 * APPLE COMPUTER INC. * 8 * * 9 * ALL RIGHTS RESERVED * 10 * * 11 * S. WOZNIAK * 12 * A. BAUM * 13 *********************** 14 ; TITLE "APPLE-II MINI-ASSEMBLER" 15 FORMAT EQU $2E 16 LENGTH EQU $2F 17 MODE EQU $31 18 PROMPT EQU $33 19 YSAV EQU $34 20 L EQU $35 21 PCL EQU $3A 22 PCH EQU $3B 23 A1H EQU $3D 24 A2L EQU $3E 25 A2H EQU $3F 26 A4L EQU $42 27 A4H EQU $43 28 FMT EQU $44 29 IN EQU $200 30 INSDS2 EQU $F88E 31 INSTDSP EQU $F8D0 32 PRBL2 EQU $F94A 33 PCADJ EQU $F953 34 CHAR1 EQU $F9B4 35 CHAR2 EQU $F9BA 36 MNEML EQU $F9C0 37 MNEMR EQU $FA00 38 CURSUP EQU $FC1A 39 GETLNZ EQU $FD67 40 COUT EQU $FDED 41 BL1 EQU $FE00 42 A1PCLP EQU $FE78 43 BELL EQU $FF3A 44 GETNUM EQU $FFA7 45 TOSUB EQU $FFBE 46 ZMODE EQU $FFC7 47 CHRTBL EQU $FFCC 48 ORG $F500F500: E9 81 49 REL SBC #$81 ;IS FMT COMPATIBLEF502: 4A 50 LSR ;WITH RELATIVE MODE?F503: D0 14 51 BNE ERR3 ; NO.F505: A4 3F 52 LDY A2HF507: A6 3E 53 LDX A2L ;DOUBLE DECREMENTF509: D0 01 54 BNE REL2F50B: 88 55 DEYF50C: CA 56 REL2 DEXF50D: 8A 57 TXAF50E: 18 58 CLCF50F: E5 3A 59 SBC PCL ;FORM ADDR-PC-2F511: 85 3E 60 STA A2LF513: 10 01 61 BPL REL3F515: C8 62 INYF516: 98 63 REL3 TYAF517: E5 3B 64 SBC PCHF519: D0 6B 65 ERR3 BNE ERR ;ERROR IF >1-BYTE BRANCHF51B: A4 2F 66 FINDOP LDY LENGTHF51D: B9 3D 00 67 FNDOP2 LDA A1H,Y ;MOVE INST TO (PC)F520: 91 3A 68 STA (PCL),YF522: 88 69 DEYF523: 10 F8 70 BPL FNDOP2F525: 20 1A FC 71 JSR CURSUPF528: 20 1A FC 72 JSR CURSUP ;RESTORE CURSORF52B: 20 D0 F8 73 JSR INSTDSP ;TYPE FORMATTED LINEF52E: 20 53 F9 74 JSR PCADJ ;UPDATE PCF531: 84 3B 75 STY PCHF533: 85 3A 76 STA PCLF535: 4C 95 F5 77 JMP NXTLINE ;GET NEXT LINEF538: 20 BE FF 78 FAKEMON3 JSR TOSUB ;GO TO DELIM HANDLERF53B: A4 34 79 LDY YSAV ;RESTORE Y-INDEXF53D: 20 A7 FF 80 FAKEMON JSR GETNUM ;READ PARAMF540: 84 34 81 STY YSAV ;SAVE Y-INDEXF542: A0 17 82 LDY #$17 ;INIT DELIMITER INDEXF544: 88 83 FAKEMON2 DEY ;CHECK NEXT DELIMF545: 30 4B 84 BMI RESETZ ;ERR IF UNRECOGNIZED DELIMF547: D9 CC FF 85 CMP CHRTBL,Y ;COMPARE WITH DELIM TABLEF54A: D0 F8 86 BNE FAKEMON2 ;NO MATCHF54C: C0 15 87 CPY #$15 ;MATCH, IS IT CR?F54E: D0 E8 88 BNE FAKEMON3 ;NO, HANDLE IT IN MONITORF550: A5 31 89 LDA MODEF552: A0 00 90 LDY #$0F554: C6 34 91 DEC YSAVF556: 20 00 FE 92 JSR BL1 ;HANDLE CR OUTSIDE MONITORF559: 4C 95 F5 93 JMP NXTLINEF55C: A5 3D 94 TRYNEXT LDA A1H ;GET TRIAL OPCODEF55E: 20 8E F8 95 JSR INSDS2 ;GET FMT+LENGTH FOR OPCODEF561: AA 96 TAXF562: BD 00 FA 97 LDA MNEMR,X ;GET LOWER MNEMONIC BYTEF565: C5 42 98 CMP A4L ;MATCH?F567: D0 13 99 BNE NEXTOP ;NO, TRY NEXT OPCODE.F569: BD C0 F9 100 LDA MNEML,X ;GET UPPER MNEMONIC BYTEF56C: C5 43 101 CMP A4H ;MATCH?F56E: D0 0C 102 BNE NEXTOP ;NO, TRY NEXT OPCODEF570: A5 44 103 LDA FMTF572: A4 2E 104 LDY FORMAT ;GET TRIAL FORMATF574: C0 9D 105 CPY #$9D ;TRIAL FORMAT RELATIVE?F576: F0 88 106 BEQ REL ;YES.F578: C5 2E 107 NREL CMP FORMAT ;SAME FORMAT?F57A: F0 9F 108 BEQ FINDOP ;YES.F57C: C6 3D 109 NEXTOP DEC A1H ;NO, TRY NEXT OPCODEF57E: D0 DC 110 BNE TRYNEXTF580: E6 44 111 INC FMT ;NO MORE, TRY WITH LEN=2F582: C6 35 112 DEC L ;WAS L=2 ALREADY?F584: F0 D6 113 BEQ TRYNEXT ;NO.F586: A4 34 114 ERR LDY YSAV ;YES, UNRECOGNIZED INST.F588: 98 115 ERR2 TYAF589: AA 116 TAXF58A: 20 4A F9 117 JSR PRBL2 ;PRINT ^ UNDER LAST READF58D: A9 DE 118 LDA #$DE ;CHAR TO INDICATE ERRORF58F: 20 ED FD 119 JSR COUT ;POSITION.F592: 20 3A FF 120 RESETZ JSR BELLF595: A9 A1 121 NXTLINE LDA #$A1 ;'!'F597: 85 33 122 STA PROMPT ;INITIALIZE PROMPTF599: 20 67 FD 123 JSR GETLNZ ;GET LINE.F59C: 20 C7 FF 124 JSR ZMODE ;INIT SCREEN STUFFF59F: AD 00 02 125 LDA IN ;GET CHARF5A2: C9 A0 126 CMP #$A0 ;ASCII BLANK?F5A4: F0 13 127 BEQ SPACE ;YESF5A6: C8 128 INYF5A7: C9 A4 129 CMP #$A4 ;ASCII '$' IN COL 1?F5A9: F0 92 130 BEQ FAKEMON ;YES, SIMULATE MONITORF5AB: 88 131 DEY ;NO, BACKUP A CHARF5AC: 20 A7 FF 132 JSR GETNUM ;GET A NUMBERF5AF: C9 93 133 CMP #$93 ;':' TERMINATOR?F5B1: D0 D5 134 ERR4 BNE ERR2 ;NO, ERR.F5B3: 8A 135 TXAF5B4: F0 D2 136 BEQ ERR2 ;NO ADR PRECEDING COLON.F5B6: 20 78 FE 137 JSR A1PCLP ;MOVE ADR TO PCL, PCH.F5B9: A9 03 138 SPACE LDA #$3 ;COUNT OF CHARS IN MNEMONICF5BB: 85 3D 139 STA A1HF5BD: 20 34 F6 140 NXTMN JSR GETNSP ;GET FIRST MNEM CHAR.F5C0: 0A 141 NXTM ASLF5C1: E9 BE 142 SBC #$BE ;SUBTRACT OFFSETF5C3: C9 C2 143 CMP #$C2 ;LEGAL CHAR?F5C5: 90 C1 144 BCC ERR2 ;NO.F5C7: 0A 145 ASL ;COMPRESS-LEFT JUSTIFYF5C8: 0A 146 ASLF5C9: A2 04 147 LDX #$4F5CB: 0A 148 NXTM2 ASL ;DO 5 TRIPLE WORD SHIFTSF5CC: 26 42 149 ROL A4LF5CE: 26 43 150 ROL A4HF5D0: CA 151 DEXF5D1: 10 F8 152 BPL NXTM2F5D3: C6 3D 153 DEC A1H ;DONE WITH 3 CHARS?F5D5: F0 F4 154 BEQ NXTM2 ;YES, BUT DO 1 MORE SHIFTF5D7: 10 E4 155 BPL NXTMN ;NOF5D9: A2 05 156 FORM1 LDX #$5 ;5 CHARS IN ADDR MODEF5DB: 20 34 F6 157 FORM2 JSR GETNSP ;GET FIRST CHAR OF ADDRF5DE: 84 34 158 STY YSAVF5E0: DD B4 F9 159 CMP CHAR1,X ;FIRST CHAR MATCH PATTERN?F5E3: D0 13 160 BNE FORM3 ;NOF5E5: 20 34 F6 161 JSR GETNSP ;YES, GET SECOND CHARF5E8: DD BA F9 162 CMP CHAR2,X ;MATCHES SECOND HALF?F5EB: F0 0D 163 BEQ FORM5 ;YES.F5ED: BD BA F9 164 LDA CHAR2,X ;NO, IS SECOND HALF ZERO?F5F0: F0 07 165 BEQ FORM4 ;YES.F5F2: C9 A4 166 CMP #$A4 ;NO,SECOND HALF OPTIONAL?F5F4: F0 03 167 BEQ FORM4 ;YES.F5F6: A4 34 168 LDY YSAVF5F8: 18 169 FORM3 CLC ;CLEAR BIT-NO MATCHF5F9: 88 170 FORM4 DEY ;BACK UP 1 CHARF5FA: 26 44 171 FORM5 ROL FMT ;FORM FORMAT BYTEF5FC: E0 03 172 CPX #$3 ;TIME TO CHECK FOR ADDR.F5FE: D0 0D 173 BNE FORM7 ;NOF600: 20 A7 FF 174 JSR GETNUM ;YESF603: A5 3F 175 LDA A2HF605: F0 01 176 BEQ FORM6 ;HIGH-ORDER BYTE ZEROF607: E8 177 INX ;NO, INCR FOR 2-BYTEF608: 86 35 178 FORM6 STX L ;STORE LENGTHF60A: A2 03 179 LDX #$3 ;RELOAD FORMAT INDEXF60C: 88 180 DEY ;BACKUP A CHARF60D: 86 3D 181 FORM7 STX A1H ;SAVE INDEXF60F: CA 182 DEX ;DONE WITH FORMAT CHECK?F610: 10 C9 183 BPL FORM2 ;NO.F612: A5 44 184 LDA FMT ;YES, PUT LENGTHF614: 0A 185 ASL ;IN LOW BITSF615: 0A 186 ASLF616: 05 35 187 ORA LF618: C9 20 188 CMP #$20F61A: B0 06 189 BCS FORM8 ;ADD "$" IF NONZERO LENGTHF61C: A6 35 190 LDX L ;AND DON'T ALREADY HAVE ITF61E: F0 02 191 BEQ FORM8F620: 09 80 192 ORA #$80F622: 85 44 193 FORM8 STA FMTF624: 84 34 194 STY YSAVF626: B9 00 02 195 LDA IN,Y ;GET NEXT NONBLANKF629: C9 BB 196 CMP #$BB ;';' START OF COMMENT?F62B: F0 04 197 BEQ FORM9 ;YESF62D: C9 8D 198 CMP #$8D ;CARRIAGE RETURN?F62F: D0 80 199 BNE ERR4 ;NO, ERR.F631: 4C 5C F5 200 FORM9 JMP TRYNEXTF634: B9 00 02 201 GETNSP LDA IN,YF637: C8 202 INYF638: C9 A0 203 CMP #$A0 ;GET NEXT NON BLANK CHARF63A: F0 F8 204 BEQ GETNSPF63C: 60 205 RTS 206 ORG $F666F666: 4C 92 F5 207 MINIASM JMP RESETZ+------------------------------------------------------------------------| TOPIC -- Apple II -- Red Book Floating point listing +------------------------------------------------------------------------Apple II Reference Manual (Red Book), January 1978, pages 94-95. *********************** * * * APPLE-II FLOATING * * POINT ROUTINES * * * * COPYRIGHT 1977 BY * * APPLE COMPUTER INC. * * * * ALL RIGHTS RESERVED * * * * S. WOZNIAK * * * *********************** TITLE "FLOATING POINT ROUTINES" SIGN EPZ $F3 X2 EPZ $F4 M2 EPZ $F5 X1 EPZ $F8 M1 EPZ $F9 E EPZ $FC OVLOC EQU $3F5 ORG $F425F425: 18 ADD CLC CLEAR CARRYF426: A2 02 LDX #$2 INDEX FOR 3-BYTE ADD.F428: B5 F9 ADD1 LDA M1,XF42A: 75 F5 ADC M2,X ADD A BYTE OF MANT2 TO MANT1F42C: 95 F9 STA M1,XF42E: CA DEX INDEX TO NEXT MORE SIGNIF. BYTE.F42F: 10 F7 BPL ADD1 LOOP UNTIL DONE.F431: 60 RTS RETURNF432: 06 F3 MD1 ASL SIGN CLEAR LSB OF SIGN.F434: 20 37 F4 JSR ABSWAP ABS VAL OF M1, THEN SWAP WITH M2F437: 24 F9 ABSWAP BIT M1 MANT1 NEGATIVE?F439: 10 05 BPL ABSWAP1 NO, SWAP WITH MANT2 AND RETURN.F43B: 20 A4 F4 JSR FCOMPL YES, COMPLEMENT IT.F43E: E6 F3 INC SIGN INCR SIGN, COMPLEMENTING LSB.F440: 38 ABSWAP1 SEC SET CARRY FOR RETURN TO MUL/DIV.F441: A2 04 SWAP LDX #$4 INDEX FOR 4 BYTE SWAP.F443: 94 FB SWAP1 STY E-1,XF445: B5 F7 LDA X1-1,X SWAP A BYTE OF EXP/MANT1 WITHF447: B4 F3 LDY X2-1,X EXP/MANT2 AND LEAVE A COPY OFF449: 94 F7 STY X1-1,X MANT1 IN E (3 BYTES). E+3 USEDF44B: 95 F3 STA X2-1,XF44D: CA DEX ADVANCE INDEX TO NEXT BYTEF44E: D0 F3 BNE SWAP1 LOOP UNTIL DONE.F450: 60 RTS RETURNF451: A9 8E FLOAT LDA #$8E INIT EXP1 TO 14,F453: 85 F8 STA X1 THEN NORMALIZE TO FLOAT.F455: A5 F9 NORM1 LDA M1 HIGH-ORDER MANT1 BYTE.F457: C9 C0 CMP #$C0 UPPER TWO BITS UNEQUAL?F459: 30 0C BMI RTS1 YES, RETURN WITH MANT1 NORMALIZEDF45B: C6 F8 DEC X1 DECREMENT EXP1.F45D: 06 FB ASL M1+2F45F: 26 FA ROL M1+1 SHIFT MANT1 (3 BYTES) LEFT.F461: 26 F9 ROL M1F463: A5 F8 NORM LDA X1 EXP1 ZERO?F465: D0 EE BNE NORM1 NO, CONTINUE NORMALIZING.F467: 60 RTS1 RTS RETURN.F468: 20 A4 F4 FSUB JSR FCOMPL CMPL MANT1,CLEARS CARRY UNLESS 0F46B: 20 7B F4 SWPALGN JSR ALGNSWP RIGHT SHIFT MANT1 OR SWAP WITHF46E: A5 F4 FADD LDA X2F470: C5 F8 CMP X1 COMPARE EXP1 WITH EXP2.F472: D0 F7 BNE SWPALGN IF #,SWAP ADDENDS OR ALIGN MANTS.F474: 20 25 F4 JSR ADD ADD ALIGNED MANTISSAS.F477: 50 EA ADDEND BVC NORM NO OVERFLOW, NORMALIZE RESULT.F479: 70 05 BVS RTLOG OV: SHIFT M1 RIGHT, CARRY INTO SIGNF47B: 90 C4 ALGNSWP BCC SWAP SWAP IF CARRY CLEAR, * ELSE SHIFT RIGHT ARITH.F47D: A5 F9 RTAR LDA M1 SIGN OF MANT1 INTO CARRY FORF47F: 0A ASL RIGHT ARITH SHIFT.F480: E6 F8 RTLOG INC X1 INCR X1 TO ADJUST FOR RIGHT SHIFTF482: F0 75 BEQ OVFL EXP1 OUT OF RANGE.F484: A2 FA RTLOG1 LDX #$FA INDEX FOR 6:BYTE RIGHT SHIFT.F486: 76 FF ROR1 ROR E+3,XF488: E8 INX NEXT BYTE OF SHIFT.F489: D0 FB BNE ROR1 LOOP UNTIL DONE.F48B: 60 RTS RETURN.F48C: 20 32 F4 FMUL JSR MD1 ABS VAL OF MANT1, MANT2F48F: 65 F8 ADC X1 ADD EXP1 TO EXP2 FOR PRODUCT EXPF491: 20 E2 F4 JSR MD2 CHECK PROD. EXP AND PREP. FOR MULF494: 18 CLC CLEAR CARRY FOR FIRST BIT.F495: 20 84 F4 MUL1 JSR RTLOG1 M1 AND E RIGHT (PROD AND MPLIER)F498: 90 03 BCC MUL2 IF CARRY CLEAR, SKIP PARTIAL PRODF49A: 20 25 F4 JSR ADD ADD MULTIPLICAND TO PRODUCT.F49D: 88 MUL2 DEY NEXT MUL ITERATION.F49E: 10 F5 BPL MUL1 LOOP UNTIL DONE.F4A0: 46 F3 MDEND LSR SIGN TEST SIGN LSB.F4A2: 90 BF NORMX BCC NORM IF EVEN,NORMALIZE PROD,ELSE COMPF4A4: 38 FCOMPL SEC SET CARRY FOR SUBTRACT.F4A5: A2 03 LDX #$3 INDEX FOR 3 BYTE SUBTRACT.F4A7: A9 00 COMPL1 LDA #$0 CLEAR A.F4A9: F5 F8 SBC X1,X SUBTRACT BYTE OF EXP1.F4AB: 95 F8 STA X1,X RESTORE IT.F4AD: CA DEX NEXT MORE SIGNIFICANT BYTE.F4AE: D0 F7 BNE COMPL1 LOOP UNTIL DONE.F4B0: F0 C5 BEQ ADDEND NORMALIZE (OR SHIFT RT IF OVFL).F4B2: 20 32 F4 FDIV JSR MD1 TAKE ABS VAL OF MANT1, MANT2.F4B5: E5 F8 SBC X1 SUBTRACT EXP1 FROM EXP2.F4B7: 20 E2 F4 JSR MD2 SAVE AS QUOTIENT EXP.F4BA: 38 DIV1 SEC SET CARRY FOR SUBTRACT.F4BB: A2 02 LDX #$2 INDEX FOR 3-BYTE SUBTRACTION.F4BD: B5 F5 DIV2 LDA M2,XF4BF: F5 FC SBC E,X SUBTRACT A BYTE OF E FROM MANT2.F4C1: 48 PHA SAVE ON STACK.F4C2: CA DEX NEXT MORE SIGNIFICANT BYTE.F4C3: 10 F8 BPL DIV2 LOOP UNTIL DONE.F4C5: A2 FD LDX #$FD INDEX FOR 3-BYTE CONDITIONAL MOVEF4C7: 68 DIV3 PLA PULL BYTE OF DIFFERENCE OFF STACKF4C8: 90 02 BCC DIV4 IF M20 OK1D06 00 ERROR BRK ERROR ARG<=0 *1D07 20 1C 1F CONT JSR SWAP MOVE ARG TO EXP/MANT21D0A A5 04 LDA X2 HOLD EXPONENT1D0C A0 80 LDY =$801D0E 84 04 STY X2 SET EXPONENT 2 TO 0 ($80)1D10 49 80 EOR =$80 COMPLIMENT SIGN BIT OF ORIGINAL EXPONENT1D12 85 0A STA M1+1 SET EXPONENT INTO MANTISSA 1 FOR FLOAT1D14 A9 00 LDA =01D16 85 09 STA M1 CLEAR MSB OF MANTISSA 11D18 20 2C 1F JSR FLOAT CONVERT TO FLOATING POINT1D1B A2 03 LDX =3 4 BYTE TRANSFERS1D1D B5 04 SEXP1 LDA X2,X1D1F 95 10 STA Z,X COPY MANTISSA TO Z1D21 B5 08 LDA X1,X1D23 95 18 STA SEXP,X SAVE EXPONENT IN SEXP1D25 BD D1 1D LDA R22,X LOAD EXP/MANT1 WITH SQRT(2)1D28 95 08 STA X1,X1D2A CA DEX1D2B 10 F0 BPL SEXP11D2D 20 4A 1F JSR FSUB Z-SQRT(2)1D30 A2 03 LDX =3 4 BYTE TRANSFER1D32 B5 08 SAVET LDA X1,X SAVE EXP/MANT1 AS T1D34 95 14 STA T,X1D36 B5 10 LDA Z,X LOAD EXP/MANT1 WITH Z1D38 95 08 STA X1,X1D3A BD D1 1D LDA R22,X LOAD EXP/MANT2 WITH SQRT(2)1D3D 95 04 STA X2,X1D3F CA DEX1D40 10 F0 BPL SAVET1D42 20 50 1F JSR FADD Z+SQRT(2)1D45 A2 03 LDX =3 4 BYTE TRANSFER1D47 B5 14 TM2 LDA T,X1D49 95 04 STA X2,X LOAD T INTO EXP/MANT21D4B CA DEX1D4C 10 F9 BPL TM21D4E 20 9D 1F JSR FDIV T=(Z-SQRT(2))/(Z+SQRT(2))1D51 A2 03 LDX =3 4 BYTE TRANSFER1D53 B5 08 MIT LDA X1,X1D55 95 14 STA T,X COPY EXP/MANT1 TO T AND1D57 95 04 STA X2,X LOAD EXP/MANT2 WITH T1D59 CA DEX1D5A 10 F7 BPL MIT1D5C 20 77 1F JSR FMUL T*T1D5F 20 1C 1F JSR SWAP MOVE T*T TO EXP/MANT21D62 A2 03 LDX =3 4 BYTE TRANSFER1D64 BD E1 1D MIC LDA C,X1D67 95 08 STA X1,X LOAD EXP/MANT1 WITH C1D69 CA DEX1D6A 10 F8 BPL MIC1D6C 20 4A 1F JSR FSUB T*T-C1D6F A2 03 LDX =3 4 BYTE TRANSFER1D71 BD DD 1D M2MB LDA MB,X1D74 95 04 STA X2,X LOAD EXP/MANT2 WITH MB1D76 CA DEX1D77 10 F8 BPL M2MB1D79 20 9D 1F JSR FDIV MB/(T*T-C)1D7C A2 03 LDX =31D7E BD D9 1D M2A1 LDA A1,X1D81 95 04 STA X2,X LOAD EXP/MANT2 WITH A11D83 CA DEX1D84 10 F8 BPL M2A11D86 20 50 1F JSR FADD MB/(T*T-C)+A11D89 A2 03 LDX =3 4 BYTE TRANSFER1D8B B5 14 M2T LDA T,X1D8D 95 04 STA X2,X LOAD EXP/MANT2 WITH T1D8F CA DEX1D90 10 F9 BPL M2T1D92 20 77 1F JSR FMUL (MB/(T*T-C)+A1)*T1D95 A2 03 LDX =3 4 BYTE TRANSFER1D97 BD E5 1D M2MHL LDA MHLF,X1D9A 95 04 STA X2,X LOAD EXP/MANT2 WITH MHLF (.5)1D9C CA DEX1D9D 10 F8 BPL M2MHL1D9F 20 50 1F JSR FADD +.51DA2 A2 03 LDX =3 4 BYTE TRANSFER1DA4 B5 18 LDEXP LDA SEXP,X1DA6 95 04 STA X2,X LOAD EXP/MANT2 WITH ORIGINAL EXPONENT1DA8 CA DEX1DA9 10 F9 BPL LDEXP1DAB 20 50 1F JSR FADD +EXPN1DAE A2 03 LDX =3 4 BYTE TRANSFER1DB0 BD D5 1D MLE2 LDA LE2,X1DB3 95 04 STA X2,X LOAD EXP/MANT2 WITH LN(2)1DB5 CA DEX1DB6 10 F8 BPL MLE21DB8 20 77 1F JSR FMUL *LN(2)1DBB 60 RTS RETURN RESULT IN MANT/EXP1 * * COMMON LOG OF MANT/EXP1 RESULT IN MANT/EXP1 *1DBC 20 00 1D LOG10 JSR LOG COMPUTE NATURAL LOG1DBF A2 03 LDX =31DC1 BD CD 1D L10 LDA LN10,X1DC4 95 04 STA X2,X LOAD EXP/MANT2 WITH 1/LN(10)1DC6 CA DEX1DC7 10 F8 BPL L101DC9 20 77 1F JSR FMUL LOG10(X)=LN(X)/LN(10)1DCC 60 RTS *1DCD 7E 6F LN10 DCM 0.4342945 2D ED1DD1 80 5A R22 DCM 1.4142136 SQRT(2) 02 7A1DD5 7F 58 LE2 DCM 0.69314718 LOG BASE E OF 2 B9 0C1DD9 80 52 A1 DCM 1.2920074 80 401DDD 81 AB MB DCM -2.6398577 86 491DE1 80 6A C DCM 1.6567626 08 661DE5 7F 40 MHLF DCM 0.5 00 00 *1E00 ORG $1E00 STARTING LOCATION FOR EXP * * EXP OF MANT/EXP1 RESULT IN MANT/EXP1 *1E00 A2 03 EXP LDX =3 4 BYTE TRANSFER1E02 BD D8 1E LDA L2E,X1E05 95 04 STA X2,X LOAD EXP/MANT2 WITH LOG BASE 2 OF E1E07 CA DEX1E08 10 F8 BPL EXP+21E0A 20 77 1F JSR FMUL LOG2(3)*X1E0D A2 03 LDX =3 4 BYTE TRANSFER1E0F B5 08 FSA LDA X1,X1E11 95 10 STA Z,X STORE EXP/MANT1 IN Z1E13 CA DEX1E14 10 F9 BPL FSA SAVE Z=LN(2)*X1E16 20 E8 1F JSR FIX CONVERT CONTENTS OF EXP/MANT1 TO AN INTEGER1E19 A5 0A LDA M1+11E1B 85 1C STA INT SAVE RESULT AS INT1E1D 38 SEC SET CARRY FOR SUBTRACTION1E1E E9 7C SBC =124 INT-1241E20 A5 09 LDA M11E22 E9 00 SBC =01E24 10 15 BPL OVFLW OVERFLOW INT>=1241E26 18 CLC CLEAR CARRY FOR ADD1E27 A5 0A LDA M1+11E29 69 78 ADC =120 ADD 120 TO INT1E2B A5 09 LDA M11E2D 69 00 ADC =01E2F 10 0B BPL CONTIN IF RESULT POSITIVE CONTINUE1E31 A9 00 LDA =0 INT<-120 SET RESULT TO ZERO AND RETURN1E33 A2 03 LDX =3 4 BYTE MOVE1E35 95 08 ZERO STA X1,X SET EXP/MANT1 TO ZERO1E37 CA DEX1E38 10 FB BPL ZERO1E3A 60 RTS RETURN *1E3B 00 OVFLW BRK OVERFLOW *1E3C 20 2C 1F CONTIN JSR FLOAT FLOAT INT1E3F A2 03 LDX =31E41 B5 10 ENTD LDA Z,X1E43 95 04 STA X2,X LOAD EXP/MANT2 WITH Z1E45 CA DEX1E46 10 F9 BPL ENTD1E48 20 4A 1F JSR FSUB Z*Z-FLOAT(INT)1E4B A2 03 LDX =3 4 BYTE MOVE1E4D B5 08 ZSAV LDA X1,X1E4F 95 10 STA Z,X SAVE EXP/MANT1 IN Z1E51 95 04 STA X2,X COPY EXP/MANT1 TO EXP/MANT21E53 CA DEX1E54 10 F7 BPL ZSAV1E56 20 77 1F JSR FMUL Z*Z1E59 A2 03 LDX =3 4 BYTE MOVE1E5B BD DC 1E LA2 LDA A2,X1E5E 95 04 STA X2,X LOAD EXP/MANT2 WITH A21E60 B5 08 LDA X1,X1E62 95 18 STA SEXP,X SAVE EXP/MANT1 AS SEXP1E64 CA DEX1E65 10 F4 BPL LA21E67 20 50 1F JSR FADD Z*Z+A21E6A A2 03 LDX =3 4 BYTE MOVE1E6C BD E0 1E LB2 LDA B2,X1E6F 95 04 STA X2,X LOAD EXP/MANT2 WITH B21E71 CA DEX1E72 10 F8 BPL LB21E74 20 9D 1F JSR FDIV T=B/(Z*Z+A2)1E77 A2 03 LDX =3 4 BYTE MOVE1E79 B5 08 DLOAD LDA X1,X1E7B 95 14 STA T,X SAVE EXP/MANT1 AS T1E7D BD E4 1E LDA C2,X1E80 95 08 STA X1,X LOAD EXP/MANT1 WITH C21E82 B5 18 LDA SEXP,X1E84 95 04 STA X2,X LOAD EXP/MANT2 WITH SEXP1E86 CA DEX1E87 10 F0 BPL DLOAD1E89 20 77 1F JSR FMUL Z*Z*C21E8C 20 1C 1F JSR SWAP MOVE EXP/MANT1 TO EXP/MANT21E8F A2 03 LDX =3 4 BYTE TRANSFER1E91 B5 14 LTMP LDA T,X1E93 95 08 STA X1,X LOAD EXP/MANT1 WITH T1E95 CA DEX1E96 10 F9 BPL LTMP1E98 20 4A 1F JSR FSUB C2*Z*Z-B2/(Z*Z+A2)1E9B A2 03 LDX =3 4 BYTE TRANSFER1E9D BD E8 1E LDD LDA D,X1EA0 95 04 STA X2,X LOAD EXP/MANT2 WITH D1EA2 CA DEX1EA3 10 F8 BPL LDD1EA5 20 50 1F JSR FADD D+C2*Z*Z-B2/(Z*Z+A2)1EA8 20 1C 1F JSR SWAP MOVE EXP/MANT1 TO EXP/MANT21EAB A2 03 LDX =3 4 BYTE TRANSFER1EAD B5 10 LFA LDA Z,X1EAF 95 08 STA X1,X LOAD EXP/MANT1 WITH Z1EB1 CA DEX1EB2 10 F9 BPL LFA1EB4 20 4A 1F JSR FSUB -Z+D+C2*Z*Z-B2/(Z*Z+A2)1EB7 A2 03 LDX =3 4 BYTE TRANSFER1EB9 B5 10 LF3 LDA Z,X1EBB 95 04 STA X2,X LOAD EXP/MANT2 WITH Z1EBD CA DEX1EBE 10 F9 BPL LF31EC0 20 9D 1F JSR FDIV Z/(**** )1EC3 A2 03 LDX =3 4 BYTE TRANSFER1EC5 BD E5 1D LD12 LDA MHLF,X1EC8 95 04 STA X2,X LOAD EXP/MANT2 WITH .51ECA CA DEX1ECB 10 F8 BPL LD121ECD 20 50 1F JSR FADD +Z/(***)+.51ED0 38 SEC ADD INT TO EXPONENT WITH CARRY SET1ED1 A5 1C LDA INT TO MULTIPLY BY1ED3 65 08 ADC X1 2**(INT+1)1ED5 85 08 STA X1 RETURN RESULT TO EXPONENT1ED7 60 RTS RETURN ANS=(.5+Z/(-Z+D+C2*Z*Z-B2/(Z*Z+A2))*2**(INT+1)1ED8 80 5C L2E DCM 1.4426950409 LOG BASE 2 OF E 55 1E1EDC 86 57 A2 DCM 87.417497202 6A E11EE0 89 4D B2 DCM 617.9722695 3F 1D1EE4 7B 46 C2 DCM .03465735903 FA 701EE8 83 4F D DCM 9.9545957821 A3 03 * * * BASIC FLOATING POINT ROUTINES *1F00 ORG $1F00 START OF BASIC FLOATING POINT ROUTINES1F00 18 ADD CLC CLEAR CARRY1F01 A2 02 LDX =$02 INDEX FOR 3-BYTE ADD1F03 B5 09 ADD1 LDA M1,X1F05 75 05 ADC M2,X ADD A BYTE OF MANT2 TO MANT11F07 95 09 STA M1,X1F09 CA DEX ADVANCE INDEX TO NEXT MORE SIGNIF.BYTE1F0A 10 F7 BPL ADD1 LOOP UNTIL DONE.1F0C 60 RTS RETURN1F0D 06 03 MD1 ASL SIGN CLEAR LSB OF SIGN1F0F 20 12 1F JSR ABSWAP ABS VAL OF MANT1, THEN SWAP MANT21F12 24 09 ABSWAP BIT M1 MANT1 NEG?1F14 10 05 BPL ABSWP1 NO,SWAP WITH MANT2 AND RETURN1F16 20 8F 1F JSR FCOMPL YES, COMPLIMENT IT.1F19 E6 03 INC SIGN INCR SIGN, COMPLEMENTING LSB1F1B 38 ABSWP1 SEC SET CARRY FOR RETURN TO MUL/DIV * * SWAP EXP/MANT1 WITH EXP/MANT2 *1F1C A2 04 SWAP LDX =$04 INDEX FOR 4-BYTE SWAP.1F1E 94 0B SWAP1 STY E-1,X1F20 B5 07 LDA X1-1,X SWAP A BYTE OF EXP/MANT1 WITH1F22 B4 03 LDY X2-1,X EXP/MANT2 AND LEAVEA COPY OF1F24 94 07 STY X1-1,X MANT1 IN E(3BYTES). E+3 USED.1F26 95 03 STA X2-1,X1F28 CA DEX ADVANCE INDEX TO NEXT BYTE1F29 D0 F3 BNE SWAP1 LOOP UNTIL DONE.1F2B 60 RTS * * * * CONVERT 16 BIT INTEGER IN M1(HIGH) AND M1+1(LOW) TO F.P. * RESULT IN EXP/MANT1. EXP/MANT2 UNEFFECTED * *1F2C A9 8E FLOAT LDA =$8E1F2E 85 08 STA X1 SET EXPN TO 14 DEC1F30 A9 00 LDA =0 CLEAR LOW ORDER BYTE1F32 85 0B STA M1+21F34 F0 08 BEQ NORM NORMALIZE RESULT1F36 C6 08 NORM1 DEC X1 DECREMENT EXP11F38 06 0B ASL M1+21F3A 26 0A ROL M1+1 SHIFT MANT1 (3 BYTES) LEFT1F3C 26 09 ROL M11F3E A5 09 NORM LDA M1 HIGH ORDER MANT1 BYTE1F40 0A ASL UPPER TWO BITS UNEQUAL?1F41 45 09 EOR M11F43 30 04 BMI RTS1 YES,RETURN WITH MANT1 NORMALIZED1F45 A5 08 LDA X1 EXP1 ZERO?1F47 D0 ED BNE NORM1 NO, CONTINUE NORMALIZING1F49 60 RTS1 RTS RETURN * * * EXP/MANT2-EXP/MANT1 RESULT IN EXP/MANT1 *1F4A 20 8F 1F FSUB JSR FCOMPL CMPL MANT1 CLEARS CARRY UNLESS ZERO1F4D 20 5D 1F SWPALG JSR ALGNSW RIGHT SHIFT MANT1 OR SWAP WITH MANT2 ON CARRY * * ADD EXP/MANT1 AND EXP/MANT2 RESULT IN EXP/MANT1 *1F50 A5 04 FADD LDA X21F52 C5 08 CMP X1 COMPARE EXP1 WITH EXP21F54 D0 F7 BNE SWPALG IF UNEQUAL, SWAP ADDENDS OR ALIGN MANTISSAS1F56 20 00 1F JSR ADD ADD ALIGNED MANTISSAS1F59 50 E3 ADDEND BVC NORM NO OVERFLOW, NORMALIZE RESULTS1F5B 70 05 BVS RTLOG OV: SHIFT MANT1 RIGHT. NOTE CARRY IS CORRECT SIGN1F5D 90 BD ALGNSW BCC SWAP SWAP IF CARRY CLEAR, ELSE SHIFT RIGHT ARITH.1F5F A5 09 RTAR LDA M1 SIGN OF MANT1 INTO CARRY FOR1F61 0A ASL RIGHT ARITH SHIFT1F62 E6 08 RTLOG INC X1 INCR EXP1 TO COMPENSATE FOR RT SHIFT1F64 F0 7E BEQ OVFL EXP1 OUT OF RANGE.1F66 A2 FA RTLOG1 LDX =$FA INDEX FOR 6 BYTE RIGHT SHIFT1F68 A9 80 ROR1 LDA =$801F6A B0 01 BCS ROR21F6C 0A ASL1F6D 56 0F ROR2 LSR E+3,X SIMULATE ROR E+3,X1F6F 15 0F ORA E+3,X1F71 95 0F STA E+3,X1F73 E8 INX NEXT BYTE OF SHIFT1F74 D0 F2 BNE ROR1 LOOP UNTIL DONE1F76 60 RTS RETURN * * * EXP/MANT1 X EXP/MANT2 RESULT IN EXP/MANT1 *1F77 20 0D 1F FMUL JSR MD1 ABS. VAL OF MANT1, MANT21F7A 65 08 ADC X1 ADD EXP1 TO EXP2 FOR PRODUCT EXPONENT1F7C 20 CD 1F JSR MD2 CHECK PRODUCT EXP AND PREPARE FOR MUL1F7F 18 CLC CLEAR CARRY1F80 20 66 1F MUL1 JSR RTLOG1 MANT1 AND E RIGHT.(PRODUCT AND MPLIER)1F83 90 03 BCC MUL2 IF CARRY CLEAR, SKIP PARTIAL PRODUCT1F85 20 00 1F JSR ADD ADD MULTIPLICAN TO PRODUCT1F88 88 MUL2 DEY NEXT MUL ITERATION1F89 10 F5 BPL MUL1 LOOP UNTIL DONE1F8B 46 03 MDEND LSR SIGN TEST SIGN (EVEN/ODD)1F8D 90 AF NORMX BCC NORM IF EXEN, NORMALIZE PRODUCT, ELSE COMPLEMENT1F8F 38 FCOMPL SEC SET CARRY FOR SUBTRACT1F90 A2 03 LDX =$03 INDEX FOR 3 BYTE SUBTRACTION1F92 A9 00 COMPL1 LDA =$00 CLEAR A1F94 F5 08 SBC X1,X SUBTRACT BYTE OF EXP11F96 95 08 STA X1,X RESTORE IT1F98 CA DEX NEXT MORE SIGNIFICANT BYTE1F99 D0 F7 BNE COMPL1 LOOP UNTIL DONE1F9B F0 BC BEQ ADDEND NORMALIZE (OR SHIFT RIGHT IF OVERFLOW) * * * EXP/MANT2 / EXP/MANT1 RESULT IN EXP/MANT1 *1F9D 20 0D 1F FDIV JSR MD1 TAKE ABS VAL OF MANT1, MANT21FA0 E5 08 SBC X1 SUBTRACT EXP1 FROM EXP21FA2 20 CD 1F JSR MD2 SAVE AS QUOTIENT EXP1FA5 38 DIV1 SEC SET CARRY FOR SUBTRACT1FA6 A2 02 LDX =$02 INDEX FOR 3-BYTE INSTRUCTION1FA8 B5 05 DIV2 LDA M2,X1FAA F5 0C SBC E,X SUBTRACT A BYTE OF E FROM MANT21FAC 48 PHA SAVE ON STACK1FAD CA DEX NEXT MORE SIGNIF BYTE1FAE 10 F8 BPL DIV2 LOOP UNTIL DONE1FB0 A2 FD LDX =$FD INDEX FOR 3-BYTE CONDITIONAL MOVE1FB2 68 DIV3 PLA PULL A BYTE OF DIFFERENCE OFF STACK1FB3 90 02 BCC DIV4 IF MANT2|<--- THREE BYTE MANTISSA --->|| (TWOS COMPLEMENT REPRESENTATION) ||<---- FOUR-BYTE FLOATING POINT OPERAND ---->|The exponent byte is a binary scaling factor for theMantissa. The exponent is a standard two's comple-ment representation except that the sign bit is comple-mented and runs from +128 to +127. For example: $00 is -128 $01 is -127 * * $7F is -1 $80 is 0 $81 is -1 * * $FF is 127The mantissa is standard two's complement repre-sentation with the sign bit in the most significant bit ofthe high order byte. The assumed decimal point is be-tween bits 6 and 7 of the most significant byte. Thus thenormalized mantissa ranges in absolute value from 1 to2. Except when the exponent has a value of +128 themantissa is normalized to retain maximum precision.The mantissa is normalized if the upper two bits of thehigh-order mantissa byte are unequal. Thus a normal-ized mantissa is of the following form: 01.xxxxxx positive mantissa (high byte) 10.xxxxxx negative mantissa (high byte) Assumed binary pointSome sample floating point numbers in hex 83 50 00 00 10. 80 40 00 00 1. 7C 66 66 66 .1 00 00 00 00 0. FC 99 99 9A -.1 7F 80 00 00 -1. 83 B0 00 00 -10.The routines are all entered using a JSR instruction.Base page locations $004-$007 are referred to asexp/mant2 while $0008-000b are referred to as exp/mant1 and act as floating point registers. On entry tothe subroutines these registers contain the numbers tobe operated upon and contain the result on return, Thefunction of the registers is given before each entry pointin the source listing. There are three error traps whichwill cause a software interrupts. ERROT (1D06) isencountered if the argument in the log routine is lessthan or equal to zero. OVFLW (1E3B) will be executed ifthe argument of EXP is too large. Overflow detected bythe basic floating point routines will cause OVFL (1FE4)to be executed. The routines do not give underflowerrors, but set the number to zero if underflow occurs.Readers of Dr. Dobbs's journal should note that whenthese routines were published in that journal the mathfunction LOG contained an error which prevented thecorrect result from being given if the argument was lessthan 1. This error has been correted in the present list-ing and marked with "MOD 9/76." 1 * SEPTEMBER 11, 1976 2 * BASIC FLOATING POINT ROUTINES 3 * FOR 6502 MICROPROCESSOR 4 * BY R. RANKIN AND S. WOZNIAK 5 * 6 * CONSISTING OF: 7 * NATURAL LOG 8 * COMMON LOG 9 * EXPONENTIAL (E**X) 10 * FLOAT FIX 11 * FADD FSUB 12 * FMUL FDIV 13 * 14 * 15 * FLOATING POINT REPRESENTATION (4-BYTES) 16 * EXPONENT BYTE 1 17 * MANTISSA BYTES 2-4 18 * 19 * MANTISSA: TWO'S COMPLIMENT REPRESENTATION WITH SIGN IN 20 * MSB OF HIGH-ORDER BYTE. MANTISSA IS NORMALIZED WITH AN 21 * ASSUMED DECIMAL POINT BETWEEN BITS 5 AND 6 OF THE HIGH-ORDER 22 * BYTE. THUS THE MANTISSA IS IN THE RANGE 1. TO 2. EXCEPT 23 * WHEN THE NUMBER IS LESS THAN 2**(-128). 24 * 25 * EXPONENT: THE EXPONENT REPRESENTS POWERS OF TWO. THE 26 * REPRESENTATION IS 2'S COMPLIMENT EXCEPT THAT THE SIGN 27 * BIT (BIT 7) IS COMPLIMENTED. THIS ALLOWS DIRECT COMPARISON 28 * OF EXPONENTS FOR SIZE SINCE THEY ARE STORED IN INCREASING 29 * NUMERICAL SEQUENCE RANGING FROM $00 (-128) TO $FF (+127) 30 * ($ MEANS NUMBER IS HEXADECIMAL). 31 * 32 * REPRESENTATION OF DECIMAL NUMBERS: THE PRESENT FLOATING 33 * POINT REPRESENTATION ALLOWS DECIMAL NUMBERS IN THE APPROXIMATE 34 * RANGE OF 10**(-38) THROUGH 10**(38) WITH 6 TO 7 SIGNIFICANT 35 * DIGITS. 36 * 37 * 38 0003 ORG 3 SET BASE PAGE ADRESSES 39 0003 EA SIGN NOP 40 0004 EA X2 NOP EXPONENT 2 41 0005 00 00 00 M2 BSS 3 MANTISSA 2 42 0008 EA X1 NOP EXPONENT 1 43 0009 00 00 00 M1 BSS 3 MANTISSA 1 44 000C E BSS 4 SCRATCH 45 0010 Z BSS 4 46 0014 T BSS 4 47 0018 SEXP BSS 4 48 001C 00 INT BSS 1 49 * 50 1D00 ORG $1D00 STARTING LOCATION FOR LOG 51 * 52 * NATURAL LOG OF MANT/EXP1 WITH RESULT IN MANT/EXP1 53 * 54 1D00 A5 09 LOG LDA M1 55 1D02 F0 02 BEQ ERROR 56 1D04 10 01 BPL CONT IF ARG>0 OK 57 1D06 00 ERROR BRK ERROR ARG<=0 58 * 59 1D07 20 1C 1F CONT JSR SWAP MOVE ARG TO EXP/MANT2 60 1D0A A2 00 LDX =0 MOD 9/76: LOAD X FOR LATER 61 1D0C A5 04 LDA X2 HOLD EXPONENT 62 1D0E A0 80 LDY =$80 63 1D10 84 04 STY X2 SET EXPONENT 2 TO 0 ($80) 64 1D12 49 80 EOR =$80 COMPLIMENT SIGN BIT OF ORIGINAL EXPONENT 65 1D14 85 0A STA M1+1 SET EXPONENT INTO MANTISSA 1 FOR FLOAT 66 1D16 10 01 BPL *+3 MOD 9/76: IS EXPONENT ZERO? 67 1D18 CA DEX MOD 9/76: YES SET X TO $FF 68 1D19 86 09 STX M1 MOD 9/76: SET UPPER BYTE OF EXPONENT 69 1D1B 20 2C 1F JSR FLOAT CONVERT TO FLOATING POINT 70 1D1E A2 03 LDX =3 4 BYTE TRANSFERS 71 1D20 B5 04 SEXP1 LDA X2,X 72 1D22 95 10 STA Z,X COPY MANTISSA TO Z 73 1D24 B5 08 LDA X1,X 74 1D26 95 18 STA SEXP,X SAVE EXPONENT IN SEXP 75 1D28 BD D4 1D LDA R22,X LOAD EXP/MANT1 WITH SQRT(2) 76 1D2B 95 08 STA X1,X 77 1D2D CA DEX 78 1D2E 10 F0 BPL SEXP1 79 1D30 20 4A 1F JSR FSUB Z-SQRT(2) 80 1D33 A2 03 LDX =3 4 BYTE TRANSFER 81 1D35 B5 08 SAVET LDA X1,X SAVE EXP/MANT1 AS T 82 1D37 95 14 STA T,X 83 1D39 B5 10 LDA Z,X LOAD EXP/MANT1 WITH Z 84 1D3B 95 08 STA X1,X 85 1D3D BD D4 1D LDA R22,X LOAD EXP/MANT2 WITH SQRT(2) 86 1D40 95 04 STA X2,X 87 1D42 CA DEX 88 1D43 10 F0 BPL SAVET 89 1D45 20 50 1F JSR FADD Z+SQRT(2) 90 1D48 A2 03 LDX =3 4 BYTE TRANSFER 91 1D4A B5 14 TM2 LDA T,X 92 1D4C 95 04 STA X2,X LOAD T INTO EXP/MANT2 93 1D4E CA DEX 94 1D4F 10 F9 BPL TM2 95 1D51 20 9D 1F JSR FDIV T=(Z-SQRT(2))/(Z+SQRT(2)) 96 1D54 A2 03 LDX =3 4 BYTE TRANSFER 97 1D56 B5 08 MIT LDA X1,X 98 1D58 95 14 STA T,X COPY EXP/MANT1 TO T AND 99 1D5A 95 04 STA X2,X LOAD EXP/MANT2 WITH T 100 1D5C CA DEX 101 1D5D 10 F7 BPL MIT 102 1D5F 20 77 1F JSR FMUL T*T 103 1D62 20 1C 1F JSR SWAP MOVE T*T TO EXP/MANT2 104 1D65 A2 03 LDX =3 4 BYTE TRANSFER 105 1D67 BD E4 1D MIC LDA C,X 106 1D6A 95 08 STA X1,X LOAD EXP/MANT1 WITH C 107 1D6C CA DEX 108 1D6D 10 F8 BPL MIC 109 1D6F 20 4A 1F JSR FSUB T*T-C 110 1D72 A2 03 LDX =3 4 BYTE TRANSFER 111 1D74 BD E0 1D M2MB LDA MB,X 112 1D77 95 04 STA X2,X LOAD EXP/MANT2 WITH MB 113 1D79 CA DEX 114 1D7A 10 F8 BPL M2MB 115 1D7C 20 9D 1F JSR FDIV MB/(T*T-C) 116 1D7F A2 03 LDX =3 117 1D81 BD DC 1D M2A1 LDA A1,X 118 1D84 95 04 STA X2,X LOAD EXP/MANT2 WITH A1 119 1D86 CA DEX 120 1D87 10 F8 BPL M2A1 121 1D89 20 50 1F JSR FADD MB/(T*T-C)+A1 122 1D8C A2 03 LDX =3 4 BYTE TRANSFER 123 1D8E B5 14 M2T LDA T,X 124 1D90 95 04 STA X2,X LOAD EXP/MANT2 WITH T 125 1D92 CA DEX 126 1D93 10 F9 BPL M2T 127 1D95 20 77 1F JSR FMUL (MB/(T*T-C)+A1)*T 128 1D98 A2 03 LDX =3 4 BYTE TRANSFER 129 1D9A BD E8 1D M2MHL LDA MHLF,X 130 1D9D 95 04 STA X2,X LOAD EXP/MANT2 WITH MHLF (.5) 131 1D9F CA DEX 132 1DA0 10 F8 BPL M2MHL 133 1DA2 20 50 1F JSR FADD +.5 134 1DA5 A2 03 LDX =3 4 BYTE TRANSFER 135 1DA7 B5 18 LDEXP LDA SEXP,X 136 1DA9 95 04 STA X2,X LOAD EXP/MANT2 WITH ORIGINAL EXPONENT 137 1DAB CA DEX 138 1DAC 10 F9 BPL LDEXP 139 1DAE 20 50 1F JSR FADD +EXPN 140 1DB1 A2 03 LDX =3 4 BYTE TRANSFER 141 1DB3 BD D8 1D MLE2 LDA LE2,X 142 1DB6 95 04 STA X2,X LOAD EXP/MANT2 WITH LN(2) 143 1DB8 CA DEX 144 1DB9 10 F8 BPL MLE2 145 1DBB 20 77 1F JSR FMUL *LN(2) 146 1DBE 60 RTS RETURN RESULT IN MANT/EXP1 147 * 148 * COMMON LOG OF MANT/EXP1 RESULT IN MANT/EXP1 149 * 150 1DBF 20 00 1D LOG10 JSR LOG COMPUTE NATURAL LOG 151 1DC2 A2 03 LDX =3 152 1DC4 BD D0 1D L10 LDA LN10,X 153 1DC7 95 04 STA X2,X LOAD EXP/MANT2 WITH 1/LN(10) 154 1DC9 CA DEX 155 1DCA 10 F8 BPL L10 156 1DCC 20 77 1F JSR FMUL LOG10(X)=LN(X)/LN(10) 157 1DCF 60 RTS 158 * 159 1DD0 7E 6F LN10 DCM 0.4342945 2D ED 160 1DD4 80 5A R22 DCM 1.4142136 SQRT(2) 82 7A 161 1DD8 7F 58 LE2 DCM 0.69314718 LOG BASE E OF 2 B9 0C 162 1DDC 80 52 A1 DCM 1.2920074 B0 40 163 1DE0 81 AB MB DCM -2.6398577 86 49 164 1DE4 80 6A C DCM 1.6567626 08 66 165 1DE8 7F 40 MHLF DCM 0.5 00 00 166 * 167 1E00 ORG $1E00 STARTING LOCATION FOR EXP 168 * 169 * EXP OF MANT/EXP1 RESULT IN MANT/EXP1 170 * 171 1E00 A2 03 EXP LDX =3 4 BYTE TRANSFER 172 1E02 BD D8 1E LDA L2E,X 173 1E05 95 04 STA X2,X LOAD EXP/MANT2 WITH LOG BASE 2 OF E 174 1E07 CA DEX 175 1E08 10 F8 BPL EXP+2 176 1E0A 20 77 1F JSR FMUL LOG2(3)*X 177 1E0D A2 03 LDX =3 4 BYTE TRANSFER 178 1E0F B5 08 FSA LDA X1,X 179 1E11 95 10 STA Z,X STORE EXP/MANT1 IN Z 180 1E13 CA DEX 181 1E14 10 F9 BPL FSA SAVE Z=LN(2)*X 182 1E16 20 E8 1F JSR FIX CONVERT CONTENTS OF EXP/MANT1 TO AN INTEGER 183 1E19 A5 0A LDA M1+1 184 1E1B 85 1C STA INT SAVE RESULT AS INT 185 1E1D 38 SEC SET CARRY FOR SUBTRACTION 186 1E1E E9 7C SBC =124 INT-124 187 1E20 A5 09 LDA M1 188 1E22 E9 00 SBC =0 189 1E24 10 15 BPL OVFLW OVERFLOW INT>=124 190 1E26 18 CLC CLEAR CARRY FOR ADD 191 1E27 A5 0A LDA M1+1 192 1E29 69 78 ADC =120 ADD 120 TO INT 193 1E2B A5 09 LDA M1 194 1E2D 69 00 ADC =0 195 1E2F 10 0B BPL CONTIN IF RESULT POSITIVE CONTINUE 196 1E31 A9 00 LDA =0 INT<-120 SET RESULT TO ZERO AND RETURN 197 1E33 A2 03 LDX =3 4 BYTE MOVE 198 1E35 95 08 ZERO STA X1,X SET EXP/MANT1 TO ZERO 199 1E37 CA DEX 200 1E38 10 FB BPL ZERO 201 1E3A 60 RTS RETURN 202 * 203 1E3B 00 OVFLW BRK OVERFLOW 204 * 205 1E3C 20 2C 1F CONTIN JSR FLOAT FLOAT INT 206 1E3F A2 03 LDX =3 207 1E41 B5 10 ENTD LDA Z,X 208 1E43 95 04 STA X2,X LOAD EXP/MANT2 WITH Z 209 1E45 CA DEX 210 1E46 10 F9 BPL ENTD 211 1E48 20 4A 1F JSR FSUB Z*Z-FLOAT(INT) 212 1E4B A2 03 LDX =3 4 BYTE MOVE 213 1E4D B5 08 ZSAV LDA X1,X 214 1E4F 95 10 STA Z,X SAVE EXP/MANT1 IN Z 215 1E51 95 04 STA X2,X COPY EXP/MANT1 TO EXP/MANT2 216 1E53 CA DEX 217 1E54 10 F7 BPL ZSAV 218 1E56 20 77 1F JSR FMUL Z*Z 219 1E59 A2 03 LDX =3 4 BYTE MOVE 220 1E5B BD DC 1E LA2 LDA A2,X 221 1E5E 95 04 STA X2,X LOAD EXP/MANT2 WITH A2 222 1E60 B5 08 LDA X1,X 223 1E62 95 18 STA SEXP,X SAVE EXP/MANT1 AS SEXP 224 1E64 CA DEX 225 1E65 10 F4 BPL LA2 226 1E67 20 50 1F JSR FADD Z*Z+A2 227 1E6A A2 03 LDX =3 4 BYTE MOVE 228 1E6C BD E0 1E LB2 LDA B2,X 229 1E6F 95 04 STA X2,X LOAD EXP/MANT2 WITH B2 230 1E71 CA DEX 231 1E72 10 F8 BPL LB2 232 1E74 20 9D 1F JSR FDIV T=B/(Z*Z+A2) 233 1E77 A2 03 LDX =3 4 BYTE MOVE 234 1E79 B5 08 DLOAD LDA X1,X 235 1E7B 95 14 STA T,X SAVE EXP/MANT1 AS T 236 1E7D BD E4 1E LDA C2,X 237 1E80 95 08 STA X1,X LOAD EXP/MANT1 WITH C2 238 1E82 B5 18 LDA SEXP,X 239 1E84 95 04 STA X2,X LOAD EXP/MANT2 WITH SEXP 240 1E86 CA DEX 241 1E87 10 F0 BPL DLOAD 242 1E89 20 77 1F JSR FMUL Z*Z*C2 243 1E8C 20 1C 1F JSR SWAP MOVE EXP/MANT1 TO EXP/MANT2 244 1E8F A2 03 LDX =3 4 BYTE TRANSFER 245 1E91 B5 14 LTMP LDA T,X 246 1E93 95 08 STA X1,X LOAD EXP/MANT1 WITH T 247 1E95 CA DEX 248 1E96 10 F9 BPL LTMP 249 1E98 20 4A 1F JSR FSUB C2*Z*Z-B2/(Z*Z+A2) 250 1E9B A2 03 LDX =3 4 BYTE TRANSFER 251 1E9D BD E8 1E LDD LDA D,X 252 1EA0 95 04 STA X2,X LOAD EXP/MANT2 WITH D 253 1EA2 CA DEX 254 1EA3 10 F8 BPL LDD 255 1EA5 20 50 1F JSR FADD D+C2*Z*Z-B2/(Z*Z+A2) 256 1EA8 20 1C 1F JSR SWAP MOVE EXP/MANT1 TO EXP/MANT2 257 1EAB A2 03 LDX =3 4 BYTE TRANSFER 258 1EAD B5 10 LFA LDA Z,X 259 1EAF 95 08 STA X1,X LOAD EXP/MANT1 WITH Z 260 1EB1 CA DEX 261 1EB2 10 F9 BPL LFA 262 1EB4 20 4A 1F JSR FSUB -Z+D+C2*Z*Z-B2/(Z*Z+A2) 263 1EB7 A2 03 LDX =3 4 BYTE TRANSFER 264 1EB9 B5 10 LF3 LDA Z,X 265 1EBB 95 04 STA X2,X LOAD EXP/MANT2 WITH Z 266 1EBD CA DEX 267 1EBE 10 F9 BPL LF3 268 1EC0 20 9D 1F JSR FDIV Z/(**** ) 269 1EC3 A2 03 LDX =3 4 BYTE TRANSFER 270 1EC5 BD E8 1D LD12 LDA MHLF,X 271 1EC8 95 04 STA X2,X LOAD EXP/MANT2 WITH .5 272 1ECA CA DEX 273 1ECB 10 F8 BPL LD12 274 1ECD 20 50 1F JSR FADD +Z/(***)+.5 275 1ED0 38 SEC ADD INT TO EXPONENT WITH CARRY SET 276 1ED1 A5 1C LDA INT TO MULTIPLY BY 277 1ED3 65 08 ADC X1 2**(INT+1) 278 1ED5 85 08 STA X1 RETURN RESULT TO EXPONENT 279 1ED7 60 RTS RETURN ANS=(.5+Z/(-Z+D+C2*Z*Z-B2/(Z*Z+A2))*2**(INT+1) 280 1ED8 80 5C L2E DCM 1.4426950409 LOG BASE 2 OF E 55 1E 281 1EDC 86 57 A2 DCM 87.417497202 6A E1 282 1EE0 89 4D B2 DCM 617.9722695 3F 1D 283 1EE4 7B 46 C2 DCM .03465735903 4A 70 284 1EE8 83 4F D DCM 9.9545957821 A3 03 285 * 286 * 287 * BASIC FLOATING POINT ROUTINES 288 * 289 1F00 ORG $1F00 START OF BASIC FLOATING POINT ROUTINES 290 1F00 18 ADD CLC CLEAR CARRY 291 1F01 A2 02 LDX =$02 INDEX FOR 3-BYTE ADD 292 1F03 B5 09 ADD1 LDA M1,X 293 1F05 75 05 ADC M2,X ADD A BYTE OF MANT2 TO MANT1 294 1F07 95 09 STA M1,X 295 1F09 CA DEX ADVANCE INDEX TO NEXT MORE SIGNIF.BYTE 296 1F0A 10 F7 BPL ADD1 LOOP UNTIL DONE. 297 1F0C 60 RTS RETURN 298 1F0D 06 03 MD1 ASL SIGN CLEAR LSB OF SIGN 299 1F0F 20 12 1F JSR ABSWAP ABS VAL OF MANT1, THEN SWAP MANT2 300 1F12 24 09 ABSWAP BIT M1 MANT1 NEG? 301 1F14 10 05 BPL ABSWP1 NO,SWAP WITH MANT2 AND RETURN 302 1F16 20 8F 1F JSR FCOMPL YES, COMPLIMENT IT. 303 1F19 E6 03 INC SIGN INCR SIGN, COMPLEMENTING LSB 304 1F1B 38 ABSWP1 SEC SET CARRY FOR RETURN TO MUL/DIV 305 * 306 * SWAP EXP/MANT1 WITH EXP/MANT2 307 * 308 1F1C A2 04 SWAP LDX =$04 INDEX FOR 4-BYTE SWAP. 309 1F1E 94 0B SWAP1 STY E-1,X 310 1F20 B5 07 LDA X1-1,X SWAP A BYTE OF EXP/MANT1 WITH 311 1F22 B4 03 LDY X2-1,X EXP/MANT2 AND LEAVEA COPY OF 312 1F24 94 07 STY X1-1,X MANT1 IN E(3BYTES). E+3 USED. 313 1F26 95 03 STA X2-1,X 314 1F28 CA DEX ADVANCE INDEX TO NEXT BYTE 315 1F29 D0 F3 BNE SWAP1 LOOP UNTIL DONE. 316 1F2B 60 RTS 317 * 318 * 319 * 320 * CONVERT 16 BIT INTEGER IN M1(HIGH) AND M1+1(LOW) TO F.P. 321 * RESULT IN EXP/MANT1. EXP/MANT2 UNEFFECTED 322 * 323 * 324 1F2C A9 8E FLOAT LDA =$8E 325 1F2E 85 08 STA X1 SET EXPN TO 14 DEC 326 1F30 A9 00 LDA =0 CLEAR LOW ORDER BYTE 327 1F32 85 0B STA M1+2 328 1F34 F0 08 BEQ NORM NORMALIZE RESULT 329 1F36 C6 08 NORM1 DEC X1 DECREMENT EXP1 330 1F38 06 0B ASL M1+2 331 1F3A 26 0A ROL M1+1 SHIFT MANT1 (3 BYTES) LEFT 332 1F3C 26 09 ROL M1 333 1F3E A5 09 NORM LDA M1 HIGH ORDER MANT1 BYTE 334 1F40 0A ASL UPPER TWO BITS UNEQUAL? 335 1F41 45 09 EOR M1 336 1F43 30 04 BMI RTS1 YES,RETURN WITH MANT1 NORMALIZED 337 1F45 A5 08 LDA X1 EXP1 ZERO? 338 1F47 D0 ED BNE NORM1 NO, CONTINUE NORMALIZING 339 1F49 60 RTS1 RTS RETURN 340 * 341 * 342 * EXP/MANT2-EXP/MANT1 RESULT IN EXP/MANT1 343 * 344 1F4A 20 8F 1F FSUB JSR FCOMPL CMPL MANT1 CLEARS CARRY UNLESS ZERO 345 1F4D 20 5D 1F SWPALG JSR ALGNSW RIGHT SHIFT MANT1 OR SWAP WITH MANT2 ON CARRY 346 * 347 * ADD EXP/MANT1 AND EXP/MANT2 RESULT IN EXP/MANT1 348 * 349 1F50 A5 04 FADD LDA X2 350 1F52 C5 08 CMP X1 COMPARE EXP1 WITH EXP2 351 1F54 D0 F7 BNE SWPALG IF UNEQUAL, SWAP ADDENDS OR ALIGN MANTISSAS 352 1F56 20 00 1F JSR ADD ADD ALIGNED MANTISSAS 353 1F59 50 E3 ADDEND BVC NORM NO OVERFLOW, NORMALIZE RESULTS 354 1F5B 70 05 BVS RTLOG OV: SHIFT MANT1 RIGHT. NOTE CARRY IS CORRECT SIGN 355 1F5D 90 BD ALGNSW BCC SWAP SWAP IF CARRY CLEAR, ELSE SHIFT RIGHT ARITH. 356 1F5F A5 09 RTAR LDA M1 SIGN OF MANT1 INTO CARRY FOR 357 1F61 0A ASL RIGHT ARITH SHIFT 358 1F62 E6 08 RTLOG INC X1 INCR EXP1 TO COMPENSATE FOR RT SHIFT 359 1F64 F0 7E BEQ OVFL EXP1 OUT OF RANGE. 360 1F66 A2 FA RTLOG1 LDX =$FA INDEX FOR 6 BYTE RIGHT SHIFT 361 1F68 A9 80 ROR1 LDA =$80 362 1F6A B0 01 BCS ROR2 363 1F6C 0A ASL 364 1F6D 56 0F ROR2 LSR E+3,X SIMULATE ROR E+3,X 365 1F6F 15 0F ORA E+3,X 366 1F71 95 0F STA E+3,X 367 1F73 E8 INX NEXT BYTE OF SHIFT 368 1F74 D0 F2 BNE ROR1 LOOP UNTIL DONE 369 1F76 60 RTS RETURN 370 * 371 * 372 * EXP/MANT1 X EXP/MANT2 RESULT IN EXP/MANT1 373 * 374 1F77 20 0D 1F FMUL JSR MD1 ABS. VAL OF MANT1, MANT2 375 1F7A 65 08 ADC X1 ADD EXP1 TO EXP2 FOR PRODUCT EXPONENT 376 1F7C 20 CD 1F JSR MD2 CHECK PRODUCT EXP AND PREPARE FOR MUL 377 1F7F 18 CLC CLEAR CARRY 378 1F80 20 66 1F MUL1 JSR RTLOG1 MANT1 AND E RIGHT.(PRODUCT AND MPLIER) 379 1F83 90 03 BCC MUL2 IF CARRY CLEAR, SKIP PARTIAL PRODUCT 380 1F85 20 00 1F JSR ADD ADD MULTIPLICAN TO PRODUCT 381 1F88 88 MUL2 DEY NEXT MUL ITERATION 382 1F89 10 F5 BPL MUL1 LOOP UNTIL DONE 383 1F8B 46 03 MDEND LSR SIGN TEST SIGN (EVEN/ODD) 384 1F8D 90 AF NORMX BCC NORM IF EXEN, NORMALIZE PRODUCT, ELSE COMPLEMENT 385 1F8F 38 FCOMPL SEC SET CARRY FOR SUBTRACT 386 1F90 A2 03 LDX =$03 INDEX FOR 3 BYTE SUBTRACTION 387 1F92 A9 00 COMPL1 LDA =$00 CLEAR A 388 1F94 F5 08 SBC X1,X SUBTRACT BYTE OF EXP1 389 1F96 95 08 STA X1,X RESTORE IT 390 1F98 CA DEX NEXT MORE SIGNIFICANT BYTE 391 1F99 D0 F7 BNE COMPL1 LOOP UNTIL DONE 392 1F9B F0 BC BEQ ADDEND NORMALIZE (OR SHIFT RIGHT IF OVERFLOW) 393 * 394 * 395 * EXP/MANT2 / EXP/MANT1 RESULT IN EXP/MANT1 396 * 397 1F9D 20 0D 1F FDIV JSR MD1 TAKE ABS VAL OF MANT1, MANT2 398 1FA0 E5 08 SBC X1 SUBTRACT EXP1 FROM EXP2 399 1FA2 20 CD 1F JSR MD2 SAVE AS QUOTIENT EXP 400 1FA5 38 DIV1 SEC SET CARRY FOR SUBTRACT 401 1FA6 A2 02 LDX =$02 INDEX FOR 3-BYTE INSTRUCTION 402 1FA8 B5 05 DIV2 LDA M2,X 403 1FAA F5 0C SBC E,X SUBTRACT A BYTE OF E FROM MANT2 404 1FAC 48 PHA SAVE ON STACK 405 1FAD CA DEX NEXT MORE SIGNIF BYTE 406 1FAE 10 F8 BPL DIV2 LOOP UNTIL DONE 407 1FB0 A2 FD LDX =$FD INDEX FOR 3-BYTE CONDITIONAL MOVE 408 1FB2 68 DIV3 PLA PULL A BYTE OF DIFFERENCE OFF STACK 409 1FB3 90 02 BCC DIV4 IF MANT2' ;FWD ARROW?0339 81D1 38 M1 SEC0340 81D2 60 RTS0341 81D3 20 FA 82 OBCMIN JSR OUTBYT ;OUT BYTE, OUT COMMA, IN BYTE0342 81D6 20 3A 83 COMINB JSR COMMA ;OUT COMMA, IN BYTE0343 81D9 20 1B 8A INBYTE JSR INCHR0344 81DC 20 75 82 JSR ASCNIB0345 81DF B0 14 BCS OUT40346 81E1 0A ASL A0347 81E2 0A ASL A0348 81E3 0A ASL A0349 81E4 0A ASL A0350 81E5 8D 33 A6 STA SCR30351 81E8 20 1B 8A JSR INCHR0352 81EB 20 75 82 JSR ASCNIB0353 81EE B0 11 BCS OUT20354 81F0 0D 33 A6 ORA SCR30355 81F3 18 GOOD CLC0356 81F4 60 RTS0357 81F5 C9 3A OUT4 CMP #':' ;COLON ?0358 81F7 D0 05 BNE OUT10359 81F9 20 1B 8A JSR INCHR0360 81FC D0 F5 BNE GOOD ;CARRIAGE RETURN?0361 81FE B8 OUT1 CLV0362 81FF 50 03 BVC CRCHK0363 8201 2C 04 82 OUT2 BIT CRCHK0364 8204 C9 0D CRCHK CMP #$0D ;CHECK FOR C/R0365 8206 38 SEC0366 8207 60 RTS0367 8208 A2 10 PSHOVE LDX #$10 ;PUSH PARMS DOWN0368 820A 0E 4A A6 PRM10 ASL P3L0369 820D 2E 4B A6 ROL P3H0370 8210 2E 4C A6 ROL P2L0371 8213 2E 4D A6 ROL P2H0372 8216 2E 4E A6 ROL P1L0373 8219 2E 4F A6 ROL P1H0374 821C CA DEX0375 821D D0 EB BNE PRM100376 821F 60 RTS0377 8220 20 88 81 PARM JSR SAVER ;GET PARMS - RETURN ON C/R OR ERR0378 8223 A9 00 LDA #00379 8225 8D 49 A6 STA PARNR0380 8228 8D 33 A6 STA SCR30381 822B 20 08 82 PM1 JSR PSHOVE0382 822E 20 1B 8A PARFIL JSR INCHR0383 8231 C9 2C CMP #',' ;VALID DELIMETERS - ,0384 8233 F0 04 BEQ M210385 8235 C9 2D CMP #'-'0386 8237 D0 11 BNE M220387 8239 A2 FF M21 LDX #$FF0388 823B 8E 33 A6 STX SCR30389 823E EE 49 A6 INC PARNR0390 8241 AE 49 A6 LDX PARNR0391 8244 E0 03 CPX #$030392 8246 D0 E3 BNE PM10393 8248 F0 1D BEQ M240394 824A 20 75 82 M22 JSR ASCNIB0395 824D B0 18 BCS M240396 824F A2 04 LDX #40397 8251 0E 4A A6 M23 ASL P3L0398 8254 2E 4B A6 ROL P3H0399 8257 CA DEX0400 8258 D0 F7 BNE M230401 825A 0D 4A A6 ORA P3L0402 825D 8D 4A A6 STA P3L0403 8260 A9 FF LDA #$FF0404 8262 8D 33 A6 STA SCR30405 8265 D0 C7 BNE PARFIL0406 8267 2C 33 A6 M24 BIT SCR30407 826A F0 03 BEQ M250408 826C EE 49 A6 INC PARNR0409 826F C9 0D M25 CMP #$0D0410 8271 18 CLC0411 8272 4C B8 81 JMP RESXAF0412 8275 C9 0D ASCNIB CMP #$0D ;C/R?0413 8277 F0 19 BEQ M290414 8279 C9 30 CMP #'0'0415 827B 90 0C BCC M260416 827D C9 47 CMP #'G'0417 827F B0 08 BCS M260418 8281 C9 41 CMP #'A'0419 8283 B0 08 BCS M270420 8285 C9 3A CMP #':'0421 8287 90 06 BCC M280422 8289 C9 30 M26 CMP #'0'0423 828B 38 SEC ;CARRY SET - NON HEX0424 828C 60 RTS0425 828D E9 37 M27 SBC #$370426 828F 29 0F M28 AND #$0F0427 8291 18 CLC0428 8292 60 M29 RTS0429 8293 EE 4A A6 INCP3 INC P3L ;INCREMENT P3 (16 BITS)0430 8296 D0 03 BNE *+50431 8298 EE 4B A6 INC P3H0432 829B 60 RTS0433 829C AE 4D A6 P2SCR LDX P2H ;MOVE P2 TO FE,FF0434 829F 86 FF STX $FF0435 82A1 AE 4C A6 LDX P2L0436 82A4 86 FE STX $FE0437 82A6 60 RTS0438 82A7 AE 4B A6 P3SCR LDX P3H ;MOVE P3 TO FE,FF0439 82AA 86 FF STX $FF0440 82AC AE 4A A6 LDX P3L0441 82AF 86 FE STX $FE0442 82B1 60 RTS0443 82B2 E6 FE INCCMP INC $FE ;INCREM FE,FF, COMPARE TO P30444 82B4 D0 14 BNE COMPAR0445 82B6 E6 FF INC $FF0446 82B8 D0 10 WRAP BNE COMPAR ;TEST TO WRAP AROUND0447 82BA 2C BD 82 BIT EXWRAP0448 82BD 60 EXWRAP RTS0449 82BE A5 FE DECCMP LDA $FE ;DECREM FE,FF AND COMPARE TO P30450 82C0 D0 06 BNE M320451 82C2 A5 FF LDA $FF0452 82C4 F0 F2 BEQ WRAP0453 82C6 C6 FF DEC $FF0454 82C8 C6 FE M32 DEC $FE0455 82CA 20 88 81 COMPAR JSR SAVER ;COMPARE FE,FF TO P30456 82CD A5 FF LDA $FF0457 82CF CD 4B A6 CMP P3H0458 82D2 D0 05 BNE EXITCP0459 82D4 A5 FE LDA $FE0460 82D6 CD 4A A6 CMP P3L0461 82D9 B8 EXITCP CLV0462 82DA 4C BE 81 JMP RESXF0463 82DD 08 CHKSAD PHP ;16 BIT CKSUM IN SCR6,70464 82DE 48 PHA0465 82DF 18 CLC0466 82E0 6D 36 A6 ADC SCR60467 82E3 8D 36 A6 STA SCR60468 82E6 90 03 BCC M330469 82E8 EE 37 A6 INC SCR70470 82EB 68 M33 PLA0471 82EC 28 PLP0472 82ED 60 RTS0473 82EE AD 59 A6 OUTPC LDA PCLR ;OUTPUT PC0474 82F1 AE 5A A6 LDX PCHR0475 82F4 48 OUTXAH PHA0476 82F5 8A TXA0477 82F6 20 FA 82 JSR OUTBYT0478 82F9 68 PLA0479 82FA 48 OUTBYT PHA ;OUTPUT 2 HEX DIGS FROM A0480 82FB 48 PHA0481 82FC 4A LSR A0482 82FD 4A LSR A0483 82FE 4A LSR A0484 82FF 4A LSR A0485 8300 20 44 8A JSR NBASOC0486 8303 68 PLA0487 8304 20 44 8A JSR NBASOC0488 8307 68 PLA0489 8308 60 RTS0490 8309 29 0F NIBASC AND #$0F ;NIBBLE IN A TO ASCII IN A0491 830B C9 0A CMP #$0A ;LINE FEED0492 830D B0 04 BCS NIBALF0493 830F 69 30 ADC #$300494 8311 90 02 BCC EXITNB0495 8313 69 36 NIBALF ADC #$360496 8315 60 EXITNB RTS0497 8316 20 4D 83 CRLFSZ JSR CRLF ;PRINT CRLF, FF, FE0498 8319 A6 FF LDX $FF0499 831B A5 FE LDA $FE0500 831D 4C F4 82 JMP OUTXAH0501 8320 A9 3F OUTQM LDA #'?'0502 8322 4C 47 8A JMP OUTCHR0503 8325 20 3A 83 OCMCK JSR COMMA ;OUT COMMA, CKSUM LO0504 8328 AD 36 A6 LDA SCR60505 832B 4C FA 82 JMP OUTBYT0506 832E A9 00 ZERCK LDA #0 ;INIT CHECKSUM0507 8330 8D 36 A6 STA SCR60508 8333 8D 37 A6 STA SCR70509 8336 60 RTS0510 8337 20 EE 82 OPCCOM JSR OUTPC ;PC OUT, COMMA OUT0511 833A 48 COMMA PHA ;COMMA OUT0512 833B A9 2C LDA #','0513 833D D0 06 BNE SPCP30514 833F 20 42 83 SPC2 JSR SPACE ;2 SPACES OUT0515 8342 48 SPACE PHA ;1 SPACE OUT0516 8343 A9 20 LDA #$20 ;SPACE0517 8345 20 47 8A SPCP3 JSR OUTCHR0518 8348 68 PLA0519 8349 60 RTS0520 834A 20 FA 82 OBCRLF JSR OUTBYT ;BYTE OUT, CRLF OUT0521 834D 48 CRLF PHA0522 834E A9 0D LDA #$0D0523 8350 20 47 8A JSR OUTCHR0524 8353 A9 0A LDA #$0A ;LINE FEED0525 8355 20 47 8A JSR OUTCHR0526 8358 68 PLA0527 8359 60 RTS0528 835A AE 56 A6 DELAY LDX TV ;DELAY DEPENDS ON TV0529 835D 20 88 81 DL1 JSR SAVER0530 8360 A9 FF LDA #$FF0531 8362 8D 39 A6 STA SCR90532 8365 8D 38 A6 STA SCR80533 8368 0E 38 A6 DLY1 ASL SCR8 ;(SCR9,8)=FFFF-2**X0534 836B 2E 39 A6 ROL SCR90535 836E CA DEX0536 836F D0 F7 BNE DLY10537 8371 20 03 89 DLY2 JSR IJSCNV ;SCAN DISPLAY0538 8374 20 86 83 JSR INSTAT ;SEE IF KEY DOWN0539 8377 B0 0A BCS DLY00540 8379 EE 38 A6 INC SCR8 ;SCAN 2**X+1 TIMES0541 837C D0 03 BNE *+50542 837E EE 39 A6 INC SCR90543 8381 D0 EE BNE DLY20544 8383 4C BE 81 DLY0 JMP RESXF0545 8386 ; INSTAT - SEE IF KEY DOWN, RESULT IN CARRY0546 8386 ; KEYSTAT, TSTAT RETURN IMMEDIATELY W/STATUS0547 8386 ; INSTAT WAITS FOR RELEASE0548 8386 20 92 83 INSTAT JSR INJISV0549 8389 90 06 BCC INST20550 838B 20 92 83 INST1 JSR INJISV0551 838E B0 FB BCS INST10552 8390 38 SEC0553 8391 60 INST2 RTS0554 8392 6C 67 A6 INJISV JMP (INSVEC+1)0555 8395 ;0556 8395 ;0557 8395 ; *** EXECUTE BLOCKS BEGIN HERE0558 8395 ;0559 8395 BZPARM =*0560 8395 ; ZERO PARM COMMANDS0561 8395 ;0562 8395 C9 52 REGZ CMP #'R' ;DISP REGISTERS0563 8397 D0 5A BNE GOZ ;PC,S,F,A,X,Y0564 8399 20 4D 83 RGBACK JSR CRLF0565 839C A9 50 LDA #'P'0566 839E 20 47 8A JSR OUTCHR0567 83A1 20 42 83 JSR SPACE0568 83A4 20 EE 82 JSR OUTPC0569 83A7 20 D6 81 JSR COMINB0570 83AA B0 13 BCS NH30571 83AC 8D 34 A6 STA SCR40572 83AF 20 D9 81 JSR INBYTE0573 83B2 B0 0B BCS NH30574 83B4 8D 59 A6 STA PCLR0575 83B7 AD 34 A6 LDA SCR40576 83BA 8D 5A A6 STA PCHR0577 83BD 90 09 BCC M340578 83BF D0 02 NH3 BNE NOTCR0579 83C1 18 EXITRG CLC0580 83C2 60 EXRGP1 RTS0581 83C3 20 CB 81 NOTCR JSR ADVCK0582 83C6 D0 FA BNE EXRGP10583 83C8 A0 00 M34 LDY #00584 83CA C8 M35 INY0585 83CB C0 06 CPY #60586 83CD F0 CA BEQ RGBACK0587 83CF 20 4D 83 JSR CRLF0588 83D2 B9 99 8F LDA RGNAM-1,Y ;GET REG NAME0589 83D5 ; OUTPUT 3 SPACES TO LINE UP DISPLAY0590 83D5 20 47 8A JSR OUTCHR0591 83D8 20 42 83 JSR SPACE0592 83DB 20 3F 83 JSR SPC20593 83DE B9 5A A6 LDA PCHR,Y0594 83E1 20 D3 81 JSR OBCMIN0595 83E4 B0 05 BCS M360596 83E6 99 5A A6 STA PCHR,Y0597 83E9 90 DF BCC M350598 83EB F0 D4 M36 BEQ EXITRG0599 83ED 20 CB 81 JSR ADVCK0600 83F0 F0 D8 BEQ M350601 83F2 60 RTS0602 83F3 C9 47 GOZ CMP #'G'0603 83F5 D0 20 BNE LPZB0604 83F7 20 4D 83 JSR CRLF0605 83FA 20 9C 8B GO1ENT JSR NACCES ;WRITE PROT MONITOR RAM0606 83FD AE 5B A6 LDX SR ;RESTORE REGS0607 8400 9A TXS0608 8401 AD 5A A6 LDA PCHR0609 8404 48 PHA0610 8405 AD 59 A6 LDA PCLR0611 8408 48 NR10 PHA0612 8409 AD 5C A6 LDA FR0613 840C 48 PHA0614 840D AC 5F A6 LDY YR0615 8410 AE 5E A6 LDX XR0616 8413 AD 5D A6 LDA AR0617 8416 40 RTI0618 8417 C9 11 LPZB CMP #$11 ;LOAD PAPER TAPE0619 8419 F0 03 BEQ *+50620 841B 4C A7 84 JMP DEPZ0621 841E 20 88 81 JSR SAVER0622 8421 20 4D 83 JSR CRLF0623 8424 A9 00 LDA #00624 8426 8D 52 A6 STA ERCNT0625 8429 20 2E 83 LPZ JSR ZERCK0626 842C 20 1B 8A LP1 JSR INCHR0627 842F C9 3B CMP #$3B ;SEMI COLON0628 8431 D0 F9 BNE LP10629 8433 20 A1 84 JSR LDBYTE0630 8436 B0 56 BCS TAPERR0631 8438 D0 09 BNE NUREC0632 843A AD 52 A6 LDA ERCNT ;ERRORS ?0633 843D F0 01 BEQ *+30634 843F 38 SEC0635 8440 4C B8 81 JMP RESXAF0636 8443 8D 3D A6 NUREC STA SCRD0637 8446 20 A1 84 JSR LDBYTE0638 8449 B0 43 BCS TAPERR0639 844B 85 FF STA $FF0640 844D 20 A1 84 JSR LDBYTE0641 8450 B0 D7 BCS LPZ0642 8452 85 FE STA $FE0643 8454 20 A1 84 MORED JSR LDBYTE0644 8457 B0 35 BCS TAPERR0645 8459 A0 00 LDY #00646 845B 91 FE STA ($FE),Y0647 845D D1 FE CMP ($FE),Y0648 845F F0 0C BEQ LPGD0649 8461 AD 52 A6 LDA ERCNT0650 8464 29 0F AND #$0F0651 8466 C9 0F CMP #$0F0652 8468 F0 03 BEQ *+50653 846A EE 52 A6 INC ERCNT0654 846D 20 B2 82 LPGD JSR INCCMP0655 8470 CE 3D A6 DEC SCRD0656 8473 D0 DF BNE MORED0657 8475 20 D9 81 JSR INBYTE0658 8478 B0 14 BCS TAPERR0659 847A CD 37 A6 CMP SCR70660 847D D0 0C BNE BADDY0661 847F 20 D9 81 JSR INBYTE0662 8482 B0 0A BCS TAPERR0663 8484 CD 36 A6 CMP SCR60664 8487 F0 A0 BEQ LPZ0665 8489 D0 03 BNE TAPERR ;(ALWAYS)0666 848B 20 D9 81 BADDY JSR INBYTE0667 848E AD 52 A6 TAPERR LDA ERCNT0668 8491 29 F0 AND #$F00669 8493 C9 F0 CMP #$F00670 8495 F0 92 BEQ LPZ0671 8497 AD 52 A6 LDA ERCNT0672 849A 69 10 ADC #$100673 849C 8D 52 A6 STA ERCNT0674 849F D0 88 BNE LPZ0675 84A1 20 D9 81 LDBYTE JSR INBYTE0676 84A4 4C DD 82 JMP CHKSAD0677 84A7 C9 44 DEPZ CMP #'D' ;DEPOSIT, 0 PARM - USE (OLD)0678 84A9 D0 03 BNE MEMZ0679 84AB 4C E1 84 JMP NEWLN0680 84AE C9 4D MEMZ CMP #'M' ;MEM, 0 PARM - USE (OLD)0681 84B0 D0 03 BNE VERZ0682 84B2 4C 17 85 JMP NEWLOC0683 84B5 C9 56 VERZ CMP #'V' ;VERIFY, 0 PARM - USE (OLD)0684 84B7 D0 0D BNE L1ZB ; ... DO 8 BYTES (LIKE VER 1 PARM)0685 84B9 A5 FE LDA $FE0686 84BB 8D 4A A6 STA P3L0687 84BE A5 FF LDA $FF0688 84C0 8D 4B A6 STA P3H0689 84C3 4C 9A 85 JMP VER1+40690 84C6 C9 12 L1ZB CMP #$12 ;LOAD KIM, ZERO PARM0691 84C8 D0 05 BNE L2ZB0692 84CA A0 00 LDY #0 ;MODE = KIM0693 84CC 4C 78 8C L1J JMP LENTRY ;GO TO CASSETTE ROUTINE0694 84CF C9 13 L2ZB CMP #$13 ;LOAD HS, ZERO PARM0695 84D1 D0 04 BNE EZPARM0696 84D3 A0 80 LDY #$80 ;MODE - HS0697 84D5 D0 F5 BNE L1J ;(ALWAYS)0698 84D7 6C 6D A6 EZPARM JMP (URCVEC+1) ;ELSE UNREC COMMAND0699 84DA B1PARM =*0700 84DA ;0701 84DA ; 1 PARAMETER COMMAND EXEC BLOCKS0702 84DA ;0703 84DA C9 44 DEP1 CMP #'D' ;DEPOSIT, 1 PARM0704 84DC D0 32 BNE MEM10705 84DE 20 A7 82 JSR P3SCR0706 84E1 20 16 83 NEWLN JSR CRLFSZ0707 84E4 A0 00 LDY #00708 84E6 A2 08 LDX #80709 84E8 20 42 83 DEPBYT JSR SPACE0710 84EB 20 D9 81 JSR INBYTE0711 84EE B0 11 BCS NH410712 84F0 91 FE STA ($FE),Y0713 84F2 D1 FE CMP ($FE),Y ;VERIFY0714 84F4 F0 03 BEQ DEPN0715 84F6 20 20 83 JSR OUTQM ;TYPE "?" IF NG0716 84F9 20 B2 82 DEPN JSR INCCMP0717 84FC CA DEX0718 84FD D0 E9 BNE DEPBYT0719 84FF F0 E0 BEQ NEWLN0720 8501 F0 0B NH41 BEQ DEPEC0721 8503 C9 20 CMP #$20 ;SPACE = FWD0722 8505 D0 4C BNE DEPES0723 8507 70 F0 BVS DEPN0724 8509 20 42 83 JSR SPACE0725 850C 10 EB BPL DEPN0726 850E 18 DEPEC CLC0727 850F 60 RTS0728 8510 C9 4D MEM1 CMP #'M' ;MEMORY, 1 PARM0729 8512 D0 65 BNE GO10730 8514 20 A7 82 JSR P3SCR0731 8517 20 16 83 NEWLOC JSR CRLFSZ0732 851A 20 3A 83 JSR COMMA0733 851D A0 00 LDY #00734 851F B1 FE LDA ($FE),Y0735 8521 20 D3 81 JSR OBCMIN0736 8524 B0 11 BCS NH420737 8526 A0 00 LDY #$000738 8528 91 FE STA ($FE),Y0739 852A D1 FE CMP ($FE),Y ;VERIFY MEM0740 852C F0 03 BEQ NXTLOC0741 852E 20 20 83 JSR OUTQM ;TYPE ? AND CONTINUE0742 8531 20 B2 82 NXTLOC JSR INCCMP0743 8534 18 CLC0744 8535 90 E0 BCC NEWLOC0745 8537 F0 3E NH42 BEQ EXITM10746 8539 50 04 BVC *+60747 853B C9 3C CMP #'<'0748 853D F0 D8 BEQ NEWLOC0749 853F C9 20 CMP #$20 ;SPACE ?0750 8541 F0 EE BEQ NXTLOC0751 8543 C9 3E CMP #'>'0752 8545 F0 EA BEQ NXTLOC0753 8547 C9 2B CMP #'+'0754 8549 F0 10 BEQ LOCP80755 854B C9 3C CMP #'<'0756 854D F0 06 BEQ PRVLOC0757 854F C9 2D CMP #'-'0758 8551 F0 16 BEQ LOCM80759 8553 38 DEPES SEC0760 8554 60 RTS0761 8555 20 BE 82 PRVLOC JSR DECCMP ;BACK ONE BYT0762 8558 18 CLC0763 8559 90 BC BCC NEWLOC0764 855B A5 FE LOCP8 LDA $FE ;GO FWD 8 BYTES0765 855D 18 CLC0766 855E 69 08 ADC #$080767 8560 85 FE STA $FE0768 8562 90 02 BCC M420769 8564 E6 FF INC $FF0770 8566 18 M42 CLC0771 8567 90 AE BCC NEWLOC0772 8569 A5 FE LOCM8 LDA $FE ;GO BACKWD 8 BYTES0773 856B 38 SEC0774 856C E9 08 SBC #$080775 856E 85 FE STA $FE0776 8570 B0 02 BCS M430777 8572 C6 FF DEC $FF0778 8574 18 M43 CLC0779 8575 90 A0 BCC NEWLOC0780 8577 18 EXITM1 CLC0781 8578 60 RTS0782 8579 C9 47 GO1 CMP #'G' ;GO, 1 PARM (RTRN ADDR ON STK)0783 857B D0 19 BNE VER1 ; ... PARM IS ADDR TO GO TO0784 857D 20 4D 83 JSR CRLF0785 8580 20 9C 8B JSR NACCES ;WRITE PROT MONITR RAM0786 8583 A2 FF LDX #$FF ;PUSH RETURN ADDR0787 8585 9A TXS0788 8586 A9 7F LDA #$7F0789 8588 48 PHA0790 8589 A9 FF LDA #$FF0791 858B 48 PHA0792 858C AD 4B A6 LDA P3H0793 858F 48 PHA0794 8590 AD 4A A6 LDA P3L0795 8593 4C 08 84 JMP NR100796 8596 C9 56 VER1 CMP #'V' ;VERIFY, 1 PARM (8 BYTES, CKSUM)0797 8598 D0 1A BNE JUMP10798 859A AD 4A A6 LDA P3L0799 859D 8D 4C A6 STA P2L0800 85A0 18 CLC0801 85A1 69 07 ADC #$070802 85A3 8D 4A A6 STA P3L0803 85A6 AD 4B A6 LDA P3H0804 85A9 8D 4D A6 STA P2H0805 85AC 69 00 ADC #00806 85AE 8D 4B A6 STA P3H0807 85B1 4C 40 86 JMP VER2+40808 85B4 C9 4A JUMP1 CMP #'J' ;JUMP (JUMP TABLE IN SYS RAM)0809 85B6 D0 1F BNE L11B0810 85B8 AD 4A A6 LDA P3L0811 85BB C9 08 CMP #8 ;0-7 ONLY VALID0812 85BD B0 26 BCS JUM20813 85BF 20 9C 8B JSR NACCES ;WRITE PROT SYS RAM0814 85C2 0A ASL A0815 85C3 A8 TAY0816 85C4 A2 FF LDX #$FF ;INIT STK PTR0817 85C6 9A TXS0818 85C7 A9 7F LDA #$7F ;PUSH COLD RETURN0819 85C9 48 PHA0820 85CA A9 FF LDA #$FF0821 85CC 48 PHA0822 85CD B9 21 A6 LDA JTABLE+1,Y ;GET ADDR FROM TABLE0823 85D0 48 PHA ;PUSH ON STACK0824 85D1 B9 20 A6 LDA JTABLE,Y0825 85D4 4C 08 84 JMP NR10 ;LOAD UP USER REG'S AND RTI0826 85D7 C9 12 L11B CMP #$12 ;LOAD KIM FMT, 1 PARM0827 85D9 D0 14 BNE L21B0828 85DB A0 00 LDY #0 ;MODE = KIM0829 85DD AD 4A A6 L11C LDA P3L0830 85E0 C9 FF CMP #$FF ;ID MUST NOT BE FF0831 85E2 D0 02 BNE *+40832 85E4 38 SEC0833 85E5 60 JUM2 RTS0834 85E6 20 08 82 JSR PSHOVE ;FIX PARM POSITION0835 85E9 20 08 82 L11D JSR PSHOVE0836 85EC 4C 78 8C JMP LENTRY0837 85EF C9 13 L21B CMP #$13 ;LOAD TAPE, HS FMT, 1 PARM0838 85F1 D0 04 BNE WPR1B0839 85F3 A0 80 LDY #$80 ;MODE = HS0840 85F5 D0 E6 BNE L11C0841 85F7 C9 57 WPR1B CMP #'W' ;WRITE PROT USER RAM0842 85F9 D0 1B BNE E1PARM0843 85FB AD 4A A6 LDA P3L ; FIRST DIG IS 1K ABOVE 0,0844 85FE 29 11 AND #$11 ; SECOND IS 2K ABOVE 00845 8600 C9 08 CMP #8 ; THIRD IS 3K ABOVE 0.0846 8602 2A ROL A0847 8603 4E 4B A6 LSR P3H0848 8606 2A ROL A0849 8607 0A ASL A0850 8608 29 0F AND #$0F0851 860A 49 0F EOR #$0F ;0 IS PROTECT0852 860C 8D 01 AC STA OR3A0853 860F A9 0F LDA #$0F0854 8611 8D 03 AC STA DDR3A0855 8614 18 CLC0856 8615 60 RTS0857 8616 4C 27 88 E1PARM JMP CALC30858 8619 B2PARM =*0859 8619 ;0860 8619 ; 2 PARAMETER EXEC BLOCKS0861 8619 ;0862 8619 C9 10 STD2 CMP #$10 ;STORE DOUBLE BYTE0863 861B D0 12 BNE MEM20864 861D 20 A7 82 JSR P3SCR0865 8620 AD 4D A6 LDA P2H0866 8623 A0 01 LDY #10867 8625 91 FE STA ($FE),Y0868 8627 88 DEY0869 8628 AD 4C A6 LDA P2L0870 862B 91 FE STA ($FE),Y0871 862D 18 CLC0872 862E 60 RTS0873 862F C9 4D MEM2 CMP #'M' ;CONTINUE MEM SEARCH W/OLD PTR0874 8631 D0 09 BNE VER20875 8633 AD 4C A6 LDA P2L0876 8636 8D 4E A6 STA P1L0877 8639 4C 08 88 JMP MEM3C0878 863C C9 56 VER2 CMP #'V' ;VERIFY MEM W/CHKSUMS , 2 PARM0879 863E D0 48 BNE L12B0880 8640 20 9C 82 JSR P2SCR0881 8643 20 2E 83 JSR ZERCK0882 8646 20 16 83 VADDR JSR CRLFSZ0883 8649 A2 08 LDX #80884 864B 20 42 83 V2 JSR SPACE0885 864E A0 00 LDY #00886 8650 B1 FE LDA ($FE),Y0887 8652 20 DD 82 JSR CHKSAD0888 8655 20 FA 82 JSR OUTBYT0889 8658 20 B2 82 JSR INCCMP0890 865B 70 11 BVS V10891 865D F0 02 BEQ *+40892 865F B0 0D BCS V10893 8661 CA DEX0894 8662 D0 E7 BNE V20895 8664 20 25 83 JSR OCMCK0896 8667 20 86 83 JSR INSTAT0897 866A 90 DA BCC VADDR0898 866C 18 CLC0899 866D 60 RTS0900 866E 20 BE 82 V1 JSR DECCMP0901 8671 E0 08 CPX #80902 8673 F0 03 BEQ *+50903 8675 E8 INX0904 8676 10 F6 BPL V10905 8678 20 25 83 JSR OCMCK0906 867B 20 4D 83 JSR CRLF0907 867E 20 42 83 JSR SPACE0908 8681 AE 37 A6 LDX SCR70909 8684 20 F4 82 JSR OUTXAH0910 8687 60 RTS0911 8688 C9 12 L12B CMP #$12 ;LOAD KIM FMT TAPE, 2 PARMS0912 868A D0 0C BNE SP2B0913 868C AD 4C A6 LDA P2L0914 868F C9 FF CMP #$FF ;ID MUST BE FF0915 8691 D0 F4 BNE L12B-1 ;ERR0916 8693 A0 00 LDY #0 ;MODE = HS0917 8695 4C E9 85 JMP L11D0918 8698 C9 1C SP2B CMP #$1C ;SAVE PAPER TAPE, 2 PARMS0919 869A D0 75 BNE E2PARM0920 869C 18 CLC0921 869D 20 88 81 JSR SAVER0922 86A0 20 9C 82 JSR P2SCR0923 86A3 20 FA 86 SP2C JSR DIFFZ0924 86A6 B0 03 BCS SP2D0925 86A8 4C C4 81 SPEXIT JMP RESALL0926 86AB 20 4D 83 SP2D JSR CRLF0927 86AE CD 58 A6 CMP MAXRC0928 86B1 90 05 BCC SP2E0929 86B3 AD 58 A6 LDA MAXRC0930 86B6 B0 02 BCS SP2F0931 86B8 69 01 SP2E ADC #10932 86BA 8D 3D A6 SP2F STA RC0933 86BD A9 3B LDA #$3B ;SEMI COLON0934 86BF 20 47 8A JSR OUTCHR0935 86C2 AD 3D A6 LDA RC0936 86C5 20 F4 86 JSR SVBYTE0937 86C8 A5 FF LDA $FF0938 86CA 20 F4 86 JSR SVBYTE0939 86CD A5 FE LDA $FE0940 86CF 20 F4 86 JSR SVBYTE0941 86D2 A0 00 MORED2 LDY #$000942 86D4 B1 FE LDA ($FE),Y0943 86D6 20 F4 86 JSR SVBYTE0944 86D9 20 86 83 JSR INSTAT ;STOP IF KEY DEPRESSED0945 86DC B0 CA BCS SPEXIT0946 86DE 20 B2 82 JSR INCCMP0947 86E1 70 C5 BVS SPEXIT0948 86E3 CE 3D A6 DEC RC0949 86E6 D0 EA BNE MORED20950 86E8 AE 37 A6 LDX SCR70951 86EB AD 36 A6 LDA SCR60952 86EE 20 F4 82 JSR OUTXAH0953 86F1 18 CLC0954 86F2 90 AF BCC SP2C0955 86F4 20 DD 82 SVBYTE JSR CHKSAD0956 86F7 4C FA 82 JMP OUTBYT0957 86FA 20 2E 83 DIFFZ JSR ZERCK0958 86FD AD 4A A6 DIFFL LDA P3L0959 8700 38 SEC0960 8701 E5 FE SBC $FE0961 8703 48 PHA0962 8704 AD 4B A6 LDA P3H0963 8707 E5 FF SBC $FF0964 8709 F0 04 BEQ DIFF10965 870B 68 PLA0966 870C A9 FF LDA #$FF0967 870E 60 RTS0968 870F 68 DIFF1 PLA0969 8710 60 RTS0970 8711 4C 27 88 E2PARM JMP CALC3 ;MAY BE CALC OR EXEC0971 8714 B3PARM =*0972 8714 ;0973 8714 ; 3 PARAMETER COMMAND EXECUTE BLOCKS0974 8714 ;0975 8714 C9 46 FILL3 CMP #'F' ;FILL MEM0976 8716 D0 21 BNE BLK30977 8718 20 9C 82 JSR P2SCR0978 871B A9 00 LDA #00979 871D 8D 52 A6 STA ERCNT ;ZERO ERROR COUNT0980 8720 AD 4E A6 LDA P1L0981 8723 A0 00 F1 LDY #00982 8725 91 FE STA ($FE),Y0983 8727 D1 FE CMP ($FE),Y ;VERIFY0984 8729 F0 03 BEQ F30985 872B 20 C1 87 JSR BRTT ;INC ERCNT (UP TO FF)0986 872E 20 B2 82 F3 JSR INCCMP0987 8731 70 7C BVS B10988 8733 F0 EE BEQ F10989 8735 90 EC BCC F10990 8737 B0 76 F2 BCS B1 ;(ALWAYS)0991 8739 C9 42 BLK3 CMP #'B' ;BLOCK MOVE (OVERLAP OKAY)0992 873B F0 03 BEQ *+50993 873D 4C CD 87 JMP S13B0994 8740 A9 00 LDA #00995 8742 8D 52 A6 STA ERCNT0996 8745 20 9C 82 JSR P2SCR0997 8748 AD 4E A6 LDA P1L0998 874B 85 FC STA $FC0999 874D AD 4F A6 LDA P1H1000 8750 85 FD STA $FD1001 8752 C5 FF CMP $FF ;WHICH DIRECTION TO MOVE?1002 8754 D0 06 BNE *+81003 8756 A5 FC LDA $FC1004 8758 C5 FE CMP $FE1005 875A F0 53 BEQ B1 ;16 BITS EQUAL THEN FINISHED1006 875C B0 14 BCS B2 ;MOVE DEC'NG1007 875E 20 B7 87 BLP JSR BMOVE ;MOVE INC'NG1008 8761 E6 FC INC $FC1009 8763 D0 02 BNE *+41010 8765 E6 FD INC $FD1011 8767 20 B2 82 JSR INCCMP1012 876A 70 43 BVS B11013 876C F0 F0 BEQ BLP1014 876E 90 EE BCC BLP1015 8770 B0 3D BCS B11016 8772 A5 FC B2 LDA $FC ;CALC VALS FOR MOVE DEC'NG1017 8774 18 CLC1018 8775 6D 4A A6 ADC P3L1019 8778 85 FC STA $FC1020 877A A5 FD LDA $FD1021 877C 6D 4B A6 ADC P3H1022 877F 85 FD STA $FD1023 8781 38 SEC1024 8782 A5 FC LDA $FC1025 8784 E5 FE SBC $FE1026 8786 85 FC STA $FC1027 8788 A5 FD LDA $FD1028 878A E5 FF SBC $FF1029 878C 85 FD STA $FD1030 878E 20 A7 82 JSR P3SCR1031 8791 AD 4C A6 LDA P2L1032 8794 8D 4A A6 STA P3L1033 8797 AD 4D A6 LDA P2H1034 879A 8D 4B A6 STA P3H1035 879D 20 B7 87 BLP1 JSR BMOVE ;MOVE DEC'NG1036 87A0 A5 FC LDA $FC1037 87A2 D0 02 BNE *+41038 87A4 C6 FD DEC $FD1039 87A6 C6 FC DEC $FC1040 87A8 20 BE 82 JSR DECCMP1041 87AB 70 02 BVS B11042 87AD B0 EE BCS BLP11043 87AF AD 52 A6 B1 LDA ERCNT ;FINISHED, TEST ERCNT1044 87B2 38 SEC1045 87B3 D0 01 BNE *+31046 87B5 18 CLC1047 87B6 60 RTS1048 87B7 A0 00 BMOVE LDY #0 ;MOVE 1 BYT + VER1049 87B9 B1 FE LDA ($FE),Y1050 87BB 91 FC STA ($FC),Y1051 87BD D1 FC CMP ($FC),Y1052 87BF F0 0B BEQ BRT1053 87C1 AC 52 A6 BRTT LDY ERCNT ;INC ERCNT, DONT PASS FF1054 87C4 C0 FF CPY #$FF1055 87C6 F0 04 BEQ *+61056 87C8 C8 INY1057 87C9 8C 52 A6 STY ERCNT1058 87CC 60 BRT RTS1059 87CD C9 1D S13B CMP #$1D ;SAVE KIM FMT TAPE, 3 PARMS1060 87CF D0 15 BNE S23B1061 87D1 A0 00 LDY #$0 ;MODE = KIM1062 87D3 AD 4E A6 S13C LDA P1L1063 87D6 D0 02 BNE *+4 ;ID MUST NOT = 01064 87D8 38 SEC1065 87D9 60 RTS1066 87DA C9 FF CMP #$FF ;ID MUST NOT = FF1067 87DC D0 02 BNE *+41068 87DE 38 S1NG SEC1069 87DF 60 RTS1070 87E0 20 93 82 JSR INCP3 ;USE END ADDR + 11071 87E3 4C 87 8E JMP SENTRY1072 87E6 C9 1E S23B CMP #$1E ;SAVE HS FMT TAPE, 3 PARMS1073 87E8 D0 04 BNE L23P1074 87EA A0 80 LDY #$80 ;MODE = HS1075 87EC D0 E5 BNE S13C ;(ALWAYS)1076 87EE C9 13 L23P CMP #$13 ;LOAD HS, 3 PARMS1077 87F0 D0 0F BNE MEM31078 87F2 AD 4E A6 LDA P1L1079 87F5 C9 FF CMP #$FF ;ID MUST BE FF1080 87F7 D0 E5 BNE S1NG ;ERROR RETURN1081 87F9 20 93 82 JSR INCP3 ;USE END ADDR + 11082 87FC A0 80 LDY #$80 ;MODE = HS1083 87FE 4C 78 8C JMP LENTRY1084 8801 C9 4D MEM3 CMP #'M' ;MEM 3 SEARCH - BYTE1085 8803 D0 22 BNE CALC31086 8805 20 9C 82 JSR P2SCR1087 8808 AD 4E A6 MEM3C LDA P1L1088 880B A0 00 LDY #01089 880D D1 FE CMP ($FE),Y1090 880F F0 0B BEQ MEM3E ;FOUND SEARCH BYTE?1091 8811 20 B2 82 MEM3D JSR INCCMP ;NO, INC BUFFER ADDR1092 8814 70 04 BVS MEM3EX1093 8816 F0 F0 BEQ MEM3C1094 8818 90 EE BCC MEM3C1095 881A 18 MEM3EX CLC1096 881B 60 RTS ;SEARCHED TO BOUND1097 881C 20 17 85 MEM3E JSR NEWLOC ;FOUND SEARCH BYTE1098 881F 90 05 BCC MEM3F1099 8821 C9 47 CMP #'G' ;ENTERED G?1100 8823 F0 EC BEQ MEM3D1101 8825 38 SEC1102 8826 60 MEM3F RTS1103 8827 C9 43 CALC3 CMP #'C' ;CALCULATE, 1, 2 OR 3 PARMS1104 8829 D0 26 BNE EXE3 ;RESULT = P1+P2+P31105 882B 20 4D 83 C1 JSR CRLF1106 882E 20 42 83 JSR SPACE1107 8831 18 CLC1108 8832 AD 4E A6 LDA P1L1109 8835 6D 4C A6 ADC P2L1110 8838 A8 TAY1111 8839 AD 4F A6 LDA P1H1112 883C 6D 4D A6 ADC P2H1113 883F AA TAX1114 8840 38 SEC1115 8841 98 TYA1116 8842 ED 4A A6 SBC P3L1117 8845 A8 TAY1118 8846 8A TXA1119 8847 ED 4B A6 SBC P3H1120 884A AA TAX1121 884B 98 TYA1122 884C 20 F4 82 JSR OUTXAH1123 884F 18 CLC1124 8850 60 RTS1125 8851 C9 45 EXE3 CMP #'E' ;EXECUTE FROM RAM, 1-3 PARMS1126 8853 D0 57 BNE E3PARM1127 8855 ; SEE IF VECTOR ALREADY MOVED1128 8855 AD 62 A6 LDA INVEC+2 ;INVEC MOVED TO SCRA, SCRB1129 8858 ; HI BYTE OF EXEVEC MUST BE DIFFERENT FROM INVEC1130 8858 CD 73 A6 CMP EXEVEC+1 ;$FA, $FB USED AS RAM PTR1131 885B F0 15 BEQ PTRIN1132 885D 8D 3B A6 STA SCRA+1 ;SAVE INVEC IN SCRA,B1133 8860 AD 61 A6 LDA INVEC+11134 8863 8D 3A A6 STA SCRA1135 8866 AD 72 A6 LDA EXEVEC ;PUT ADDR OF RIN IN INVEC1136 8869 8D 61 A6 STA INVEC+11137 886C AD 73 A6 LDA EXEVEC+11138 886F 8D 62 A6 STA INVEC+21139 8872 AD 4B A6 PTRIN LDA P3H ;INIT RAM PTR IN $FA, $FB1140 8875 85 FB STA $FB1141 8877 AD 4A A6 LDA P3L1142 887A 85 FA STA $FA1143 887C 18 CLC1144 887D 60 RTS1145 887E 20 88 81 RIN JSR SAVER ;GET INPUT FROM RAM1146 8881 A0 00 LDY #$0 ;RAM PTR IN $FA, $FB1147 8883 B1 FA LDA ($FA),Y1148 8885 F0 12 BEQ RESTIV ;IF 00 BYTE, RESTORE INVEC1149 8887 E6 FA INC $FA1150 8889 D0 02 BNE *+41151 888B E6 FB INC $FB1152 888D 2C 53 A6 BIT TECHO ;ECHO CHARS IN ?1153 8890 10 03 BPL *+51154 8892 20 47 8A JSR OUTCHR1155 8895 18 CLC1156 8896 4C B8 81 JMP RESXAF1157 8899 AD 3A A6 RESTIV LDA SCRA ;RESTORE INVEC1158 889C 8D 61 A6 STA INVEC+11159 889F AD 3B A6 LDA SCRA+11160 88A2 8D 62 A6 STA INVEC+21161 88A5 18 CLC1162 88A6 20 1B 8A JSR INCHR1163 88A9 4C B8 81 JMP RESXAF1164 88AC 6C 6D A6 E3PARM JMP (URCVEC+1) ;... ELSE UNREC CMD1165 88AF ; ***1166 88AF ; *** HEX KEYBOARD I/O1167 88AF ; ***1168 88AF 20 88 81 GETKEY JSR SAVER ;FIND KEY1169 88B2 20 CF 88 JSR GK1170 88B5 C9 FE CMP #$FE1171 88B7 D0 13 BNE EXITGK1172 88B9 20 CF 88 JSR GK1173 88BC 8A TXA1174 88BD 0A ASL A1175 88BE 0A ASL A1176 88BF 0A ASL A1177 88C0 0A ASL A1178 88C1 8D 3E A6 STA SCRE1179 88C4 20 CF 88 JSR GK1180 88C7 8A TXA1181 88C8 18 CLC1182 88C9 6D 3E A6 ADC SCRE1183 88CC 4C B8 81 EXITGK JMP RESXAF1184 88CF A9 00 GK LDA #01185 88D1 8D 55 A6 STA KSHFL1186 88D4 20 03 89 GK1 JSR IJSCNV ;SCAN KB1187 88D7 F0 FB BEQ GK11188 88D9 20 2C 89 JSR LRNKEY ;WHAT KEY IS IT?1189 88DC F0 F6 BEQ GK11190 88DE 48 PHA1191 88DF 8A TXA1192 88E0 48 PHA1193 88E1 20 72 89 JSR BEEP1194 88E4 20 23 89 GK2 JSR KEYQ1195 88E7 D0 FB BNE GK2 ;Z=1 IF KEY DOWN1196 88E9 20 9B 89 JSR NOBEEP ;DELAY (DEBOUNCE) W/O BEEP1197 88EC 20 23 89 JSR KEYQ1198 88EF D0 F3 BNE GK21199 88F1 68 PLA1200 88F2 AA TAX1201 88F3 68 PLA1202 88F4 C9 FF CMP #$FF ;IF SHIFT, SET FLAG + GET NEXT KEY1203 88F6 D0 07 BNE EXITG1204 88F8 A9 19 LDA #$191205 88FA 8D 55 A6 STA KSHFL1206 88FD D0 D5 BNE GK11207 88FF 60 EXITG RTS1208 8900 20 C1 89 HDOUT JSR OUTDSP ;CHAR OUT, SCAN KB1209 8903 6C 70 A6 IJSCNV JMP (SCNVEC+1)1210 8906 A9 09 SCAND LDA #$9 ;SCAN DISPLAY FROM DISBUF1211 8908 20 A5 89 JSR CONFIG1212 890B A2 05 LDX #51213 890D A0 00 SC1 LDY #01214 890F BD 40 A6 LDA DISBUF,X1215 8912 8C 00 A4 STY PADA1216 8915 8E 02 A4 STX PBDA1217 8918 8D 00 A4 STA PADA1218 891B A0 10 LDY #$101219 891D 88 SC2 DEY1220 891E D0 FD BNE SC21221 8920 CA DEX1222 8921 10 EA BPL SC11223 8923 20 A3 89 KEYQ JSR KSCONF ; KEY DOWN ? (YES THEN Z=1)1224 8926 AD 00 A4 H8926 LDA PADA1225 8929 49 7F EOR #$7F1226 892B 60 RTS1227 892C 29 3F LRNKEY AND #$3F ;DETERMINE WHAT KEY IS DOWN1228 892E 8D 3F A6 STA SCRF1229 8931 A9 05 LDA #$051230 8933 20 A5 89 JSR CONFIG1231 8936 AD 02 A4 LDA PBDA1232 8939 29 07 AND #$071233 893B 49 07 EOR #$071234 893D D0 05 BNE LK11235 893F 2C 00 A4 BIT PADA1236 8942 30 1A BMI NOKEY1237 8944 C9 04 LK1 CMP #$041238 8946 90 02 BCC LK21239 8948 A9 03 LDA #$031240 894A 0A LK2 ASL A1241 894B 0A ASL A1242 894C 0A ASL A1243 894D 0A ASL A1244 894E 0A ASL A1245 894F 0A ASL A1246 8950 18 CLC1247 8951 6D 3F A6 ADC SCRF1248 8954 A2 19 LDX #$191249 8956 DD D6 8B LK3 CMP SYM,X1250 8959 F0 05 BEQ FOUND1251 895B CA DEX1252 895C 10 F8 BPL LK31253 895E E8 NOKEY INX1254 895F 60 RTS1255 8960 8A FOUND TXA1256 8961 18 CLC1257 8962 6D 55 A6 ADC KSHFL1258 8965 AA TAX1259 8966 BD EF 8B LDA ASCII,X1260 8969 60 RTS1261 896A 20 23 89 KYSTAT JSR KEYQ ;KEY DOWN? RETURN IN CARRY1262 896D 18 CLC1263 896E F0 01 BEQ *+31264 8970 38 SEC1265 8971 60 RTS1266 8972 20 88 81 BEEP JSR SAVER ;DELAY (BOUNCE) W/BEEP1267 8975 A9 0D BEEPP3 LDA #$0D1268 8977 20 A5 89 BEEPP5 JSR CONFIG1269 897A A2 70 LDX #$70 ;DURATION CONSTANT1270 897C A9 08 BE1 LDA #81271 897E 8D 02 A4 STA PBDA1272 8981 20 95 89 JSR BE21273 8984 A9 06 LDA #61274 8986 8D 02 A4 STA PBDA1275 8989 20 95 89 JSR BE21276 898C CA DEX1277 898D D0 ED BNE BE11278 898F 20 A3 89 JSR KSCONF1279 8992 4C C4 81 JMP RESALL1280 8995 A0 1A BE2 LDY #$1A1281 8997 88 BE3 DEY1282 8998 D0 FD BNE BE31283 899A 60 RTS1284 899B 20 88 81 NOBEEP JSR SAVER ;DELAY W/O BEEP1285 899E A9 01 LDA #$011286 89A0 4C 77 89 JMP BEEPP5 ;(BNE BEEPP5, $FF)1287 89A3 A9 01 KSCONF LDA #$1 ;CONFIGURE FOR KEYBOARD1288 89A5 20 88 81 CONFIG JSR SAVER ;CONFIGURE I/O FROM TABLE VAL1289 89A8 A0 01 LDY #$011290 89AA AA TAX1291 89AB BD C8 8B CON1 LDA VALSP2,X1292 89AE 99 02 A4 STA PBDA,Y1293 89B1 BD C6 8B LDA VALS,X1294 89B4 99 00 A4 STA PADA,Y1295 89B7 CA DEX1296 89B8 88 DEY1297 89B9 10 F0 BPL CON11298 89BB 4C C4 81 JMP RESALL1299 89BE 20 AF 88 HKEY JSR GETKEY ;GET KEY FROM KB AND ECHO ON KB1300 89C1 20 88 81 OUTDSP JSR SAVER ;DISPLAY OUT1301 89C4 29 7F AND #$7F1302 89C6 C9 07 CMP #$07 ;BELL?1303 89C8 D0 03 BNE NBELL1304 89CA 4C 75 89 JMP BEEPP3 ;YES - BEEP1305 89CD 20 06 8A NBELL JSR TEXT ;PUSH INTO SCOPE BUFFER1306 89D0 C9 2C CMP #$2C ;COMMA?1307 89D2 D0 0A BNE OUD11308 89D4 AD 45 A6 LDA RDIG1309 89D7 09 80 ORA #$80 ;TURN ON DECIMAL PT1310 89D9 8D 45 A6 STA RDIG1311 89DC D0 25 BNE EXITOD1312 89DE A2 3A OUD1 LDX #$3A1313 89E0 DD EE 8B OUD2 CMP ASCIM1,X1314 89E3 F0 05 BEQ GETSGS1315 89E5 CA DEX1316 89E6 D0 F8 BNE OUD21317 89E8 F0 19 BEQ EXITOD1318 89EA BD 28 8C GETSGS LDA SEGSM1,X ;GET CORR SEG CODE FROM TABLE1319 89ED C9 F0 CMP #$F01320 89EF F0 12 BEQ EXITOD1321 89F1 A2 00 LDX #01322 89F3 48 PHA1323 89F4 BD 41 A6 OUD3 LDA DISBUF+1,X ;SHOVE DOWN DISPLAY BUFFER1324 89F7 9D 40 A6 STA DISBUF,X1325 89FA E8 INX1326 89FB E0 05 CPX #51327 89FD D0 F5 BNE OUD31328 89FF 68 PLA1329 8A00 8D 45 A6 STA RDIG1330 8A03 4C C4 81 EXITOD JMP RESALL1331 8A06 48 TEXT PHA ;UPDATE SCOPE BUFFER1332 8A07 8A TXA ;SAVE X1333 8A08 48 PHA1334 8A09 A2 1E LDX #$1E ;PUSH DOWN 32 CHARS1335 8A0B BD 00 A6 TXTMOV LDA SCPBUF,X1336 8A0E 9D 01 A6 STA SCPBUF+1,X1337 8A11 CA DEX1338 8A12 10 F7 BPL TXTMOV1339 8A14 68 PLA ;RESTORE X1340 8A15 AA TAX1341 8A16 68 PLA ;RESTORE CHR1342 8A17 8D 00 A6 STA SCPBUF ;STORE CHR IN EMPTY SLOT1343 8A1A 60 RTS1344 8A1B ;1345 8A1B ;***1346 8A1B ;*** TERMINAL I/O1347 8A1B ;***1348 8A1B 20 88 81 INCHR JSR SAVER ;INPUT CHAR1349 8A1E 20 41 8A JSR INJINV1350 8A21 29 7F AND #$7F ;DROP PARITY1351 8A23 C9 61 CMP #$61 ;ALPHA?1352 8A25 90 06 BCC INRT11353 8A27 C9 7B CMP #$7B1354 8A29 B0 02 BCS INRT11355 8A2B 29 DF AND #$DF ;CVRT TO UPPER CASE1356 8A2D C9 0F INRT1 CMP #$0F ;CTL O ?1357 8A2F D0 0B BNE INRT21358 8A31 AD 53 A6 LDA TECHO1359 8A34 49 40 EOR #$40 ;TOGGLE CTL O BIT1360 8A36 8D 53 A6 STA TECHO1361 8A39 18 CLC1362 8A3A 90 E2 BCC INCHR+3 ;GET GET ANOTHER CHAR1363 8A3C C9 0D INRT2 CMP #$0D ;CARRIAGE RETURN?1364 8A3E 4C B8 81 JMP RESXAF1365 8A41 6C 61 A6 INJINV JMP (INVEC+1)1366 8A44 20 09 83 NBASOC JSR NIBASC ;NIBBLE TO ASCII, OUTCHR1367 8A47 20 88 81 OUTCHR JSR SAVER1368 8A4A 2C 53 A6 BIT TECHO ;LOOK AT CTRL O FLAG1369 8A4D 70 03 BVS *+51370 8A4F 20 55 8A JSR INJOUV1371 8A52 4C C4 81 JMP RESALL1372 8A55 6C 64 A6 INJOUV JMP (OUTVEC+1)1373 8A58 20 88 81 INTCHR JSR SAVER ;IN TERMINAL CHAR1374 8A5B A9 00 LDA #01375 8A5D 85 F9 STA $F91376 8A5F AD 02 A4 LOOK LDA PBDA ;FIND LEADING EDGE1377 8A62 2D 54 A6 AND TOUTFL1378 8A65 38 SEC1379 8A66 E9 40 SBC #$401380 8A68 90 F5 BCC LOOK1381 8A6A 20 E9 8A TIN JSR DLYH ;TERMINAL BIT1382 8A6D AD 02 A4 LDA PBDA1383 8A70 2D 54 A6 AND TOUTFL1384 8A73 38 SEC1385 8A74 E9 40 SBC #$40 ;OR BITS 7,7 (TTY,CRT)1386 8A76 2C 53 A6 BIT TECHO ;ECHO BIT?1387 8A79 10 06 BPL DMY11388 8A7B 20 D4 8A JSR OUT1389 8A7E 4C 87 8A JMP SAVE1390 8A81 A0 07 DMY1 LDY #71391 8A83 88 TLP1 DEY1392 8A84 D0 FD BNE TLP11393 8A86 EA NOP1394 8A87 66 F9 SAVE ROR $F91395 8A89 20 E9 8A JSR DLYH1396 8A8C 48 PHA ;TIMING1397 8A8D B5 00 LDA 0,X1398 8A8F 68 PLA1399 8A90 90 D8 BCC TIN1400 8A92 20 E9 8A JSR DLYH1401 8A95 18 CLC1402 8A96 20 D4 8A JSR OUT1403 8A99 A5 F9 LDA $F91404 8A9B 49 FF EOR #$FF1405 8A9D 4C B8 81 JMP RESXAF1406 8AA0 85 F9 TOUT STA $F9 ;TERMINAL CHR OUT1407 8AA2 20 88 81 JSR SAVER1408 8AA5 20 E9 8A JSR DLYH ;DELAY 1/2 BIT TIME1409 8AA8 A9 30 LDA #$30 ;SET FOR OUTPUT1410 8AAA 8D 03 A4 STA PBDA+1 ;DATA DIRECTION1411 8AAD A5 F9 LDA $F9 ;RECOVER CHR DATA1412 8AAF A2 0B LDX #$0B ;START BIT,8DATA, 3STOPS1413 8AB1 49 FF EOR #$FF ;INVERT DATA1414 8AB3 38 SEC ;START BIT1415 8AB4 20 D4 8A OUTC JSR OUT ;OUTPUT BIT FROM CARRY1416 8AB7 20 E6 8A JSR DLYF ;WAIT FULL BIT TIME1417 8ABA A0 06 LDY #$061418 8ABC 88 PHAKE DEY1419 8ABD D0 FD BNE PHAKE1420 8ABF EA NOP1421 8AC0 4A LSR A1422 8AC1 CA DEX1423 8AC2 D0 F0 BNE OUTC1424 8AC4 A5 F9 LDA $F91425 8AC6 C9 0D CMP #$0D ;CARRIAGE RETURN?1426 8AC8 F0 04 BEQ GOPAD ;YES-PAD IT1427 8ACA C9 0A CMP #$0A ;PAD LINE FEED TOO1428 8ACC D0 03 BNE LEAVE1429 8ACE 20 32 8B GOPAD JSR PAD1430 8AD1 4C C4 81 LEAVE JMP RESALL1431 8AD4 48 OUT PHA ;TERMINAL BIT OUT1432 8AD5 AD 02 A4 LDA PBDA1433 8AD8 29 0F AND #$0F1434 8ADA 90 02 BCC OUTONE1435 8ADC 09 30 ORA #$301436 8ADE 2D 54 A6 OUTONE AND TOUTFL ;MASK OUTPUT1437 8AE1 8D 02 A4 STA PBDA1438 8AE4 68 PLA1439 8AE5 60 RTS1440 8AE6 ;1441 8AE6 20 E9 8A DLYF JSR DLYH ;DELAY FULL1442 8AE9 08 DLYH PHP ;DELAY HALF1443 8AEA 48 PHA1444 8AEB 8A TXA1445 8AEC 48 PHA1446 8AED 98 TYA1447 8AEE AE 51 A6 LDX SDBYT1448 8AF1 A0 03 DLYX LDY #31449 8AF3 88 DLYY DEY1450 8AF4 D0 FD BNE DLYY1451 8AF6 CA DEX1452 8AF7 D0 F8 BNE DLYX1453 8AF9 A8 TAY1454 8AFA 68 PLA1455 8AFB AA TAX1456 8AFC 68 PLA1457 8AFD 28 PLP1458 8AFE 60 RTS1459 8AFF A9 00 BAUD LDA #0 ;DETERMINE BAUD RATE ON PB71460 8B01 A8 TAY1461 8B02 AD 02 A4 SEEK LDA PBDA1462 8B05 0A ASL A1463 8B06 B0 FA BCS SEEK1464 8B08 20 27 8B CLEAR JSR INK1465 8B0B 90 FB BCC CLEAR1466 8B0D 20 27 8B SET JSR INK1467 8B10 B0 FB BCS SET1468 8B12 8C 51 A6 STY SDBYT1469 8B15 BD 63 8C DEAF LDA DECPTS,X1470 8B18 CD 51 A6 CMP SDBYT1471 8B1B B0 07 BCS AGAIN1472 8B1D BD 69 8C LDA STDVAL,X ;LOAD CLOSEST STD VALUE1473 8B20 8D 51 A6 STA SDBYT1474 8B23 60 RTS1475 8B24 E8 AGAIN INX1476 8B25 10 EE BPL DEAF1477 8B27 C8 INK INY1478 8B28 A2 1C LDX #$1C1479 8B2A CA INK1 DEX1480 8B2B D0 FD BNE INK11481 8B2D AD 02 A4 LDA PBDA1482 8B30 0A ASL A1483 8B31 60 RTS1484 8B32 AE 50 A6 PAD LDX PADBIT ;PAD CARRIAGE RETURN OR LF1485 8B35 20 E6 8A PAD1 JSR DLYF ;WITH EXTRA STOP BITS1486 8B38 CA DEX1487 8B39 D0 FA BNE PAD11488 8B3B 60 RTS1489 8B3C 20 A3 89 TSTAT JSR KSCONF ;SEE IF BREAK KEY DOWN1490 8B3F AD 02 A4 LDA PBDA1491 8B42 2D 54 A6 AND TOUTFL1492 8B45 38 SEC1493 8B46 E9 40 SBC #$401494 8B48 60 RTS1495 8B49 FF .DB $FF ;NOT USED1496 8B4A ; ***1497 8B4A ; *** RESET - TURN OFF POR, INIT SYS RAM, ENTER MONITOR1498 8B4A ; ***1499 8B4A ;1500 8B4A A2 FF RESET LDX #$FF1501 8B4C 9A TXS ;INIT STACK PTR1502 8B4D A9 CC LDA #$CC1503 8B4F 8D 0C A0 STA PCR1 ;DISABLE POR, TAPE OFF1504 8B52 A9 04 LDA #41505 8B54 48 PHA1506 8B55 28 PLP ;INIT F, DISABLE IRQ DURING DFTXFR1507 8B56 20 86 8B JSR ACCESS ;UN WRITE PROT SYS RAM1508 8B59 A2 5F DFTXFR LDX #$5F ;INIT SYS RAM (EXCPT SCPBUF)1509 8B5B BD A0 8F LDA DFTBLK,X1510 8B5E 9D 20 A6 STA RAM,X1511 8B61 CA DEX1512 8B62 10 F7 BPL DFTXFR+21513 8B64 A9 07 NEWDEV LDA #7 ;CHANGE DEVC/BAUD RATE1514 8B66 20 47 8A JSR OUTCHR ;BEEP1515 8B69 20 A3 89 SWITCH JSR KSCONF ;KEYBOARD OR TERMINAL?1516 8B6C 20 26 89 SWLP JSR KEYQ+31517 8B6F D0 0B BNE MONENT1518 8B71 2C 02 A4 BIT PBDA1519 8B74 10 F6 BPL SWLP1520 8B76 20 B7 8B JSR VECSW ;SWITCH VECTORS1521 8B79 20 FF 8A JSR BAUD1522 8B7C A2 FF MONENT LDX #$FF ;MONITOR ENTRY1523 8B7E 9A TXS1524 8B7F D8 CLD1525 8B80 20 86 8B JSR ACCESS ;UNWRITE PROT MONITOR RAM1526 8B83 4C 03 80 JMP WARM1527 8B86 20 88 81 ACCESS JSR SAVER ;UN WRITE PROT SYS RAM1528 8B89 AD 01 AC LDA OR3A1529 8B8C 09 01 ORA #11530 8B8E 8D 01 AC ACC1 STA OR3A1531 8B91 AD 03 AC LDA DDR3A1532 8B94 09 01 ORA #11533 8B96 8D 03 AC STA DDR3A1534 8B99 4C C4 81 JMP RESALL1535 8B9C 20 88 81 NACCES JSR SAVER ;WRITE PROT SYS RAM1536 8B9F AD 01 AC LDA OR3A1537 8BA2 29 FE AND #$FE1538 8BA4 18 CLC1539 8BA5 90 E7 BCC ACC11540 8BA7 20 86 8B TTY JSR ACCESS ;UN WRITE PROT RAM1541 8BAA A9 D5 LDA #$D5 ;110 BAUD1542 8BAC 8D 51 A6 STA SDBYT1543 8BAF AD 54 A6 LDA TOUTFL1544 8BB2 09 40 ORA #$401545 8BB4 8D 54 A6 STA TOUTFL1546 8BB7 20 86 8B VECSW JSR ACCESS ;UN WRITE PROT RAM1547 8BBA A2 08 LDX #$81548 8BBC BD 6F 8C SWLP2 LDA TRMTBL,X1549 8BBF 9D 60 A6 STA INVEC,X1550 8BC2 CA DEX1551 8BC3 10 F7 BPL SWLP21552 8BC5 60 RTS1553 8BC6 ;1554 8BC6 ;***1555 8BC6 ;*** TABLES (I/O CONFIGURATIONS, KEY CODES, ASCII CODES)1556 8BC6 ;***1557 8BC6 00 80 08 37 VALS .DB $00,$80,$08,$37 ;KB SENSE, A=11558 8BCA 00 7F 00 30 .DB $00,$7F,$00,$30 ;KB LRN, A=51559 8BCE 00 FF 00 3F .DB $00,$FF,$00,$3F ;SCAN DSP, A=91560 8BD2 00 00 07 3F .DB $00,$00,$07,$3F ;BEEP, A=D1561 8BD6 VALSP2 =VALS+21562 8BD6 SYM =* ;KEY CODES RETURNED BY LRNKEY1563 8BD6 TABLE =*1564 8BD6 01 .DB $01 ;0/U01565 8BD7 41 .DB $41 ;1/U11566 8BD8 81 .DB $81 ;2/U21567 8BD9 C1 .DB $C1 ;3/U31568 8BDA 02 .DB $02 ;4/U41569 8BDB 42 .DB $42 ;5/U51570 8BDC 82 .DB $82 ;6/U61571 8BDD C2 .DB $C2 ;7/U71572 8BDE 04 .DB $04 ;8/JMP1573 8BDF 44 .DB $44 ;9/VER1574 8BE0 84 .DB $84 ;A/ASCII1575 8BE1 C4 .DB $C4 ;B/BLK MOV1576 8BE2 08 .DB $08 ;C/CALC1577 8BE3 48 .DB $48 ;D/DEP1578 8BE4 88 .DB $88 ;E/EXEC1579 8BE5 C8 .DB $C8 ;F/FILL1580 8BE6 10 .DB $10 ;CR/SD1581 8BE7 50 .DB $50 ;-/+1582 8BE8 90 .DB $90 ;>/<1583 8BE9 D0 .DB $D0 ;SHIFT1584 8BEA 20 .DB $20 ;GO/LP1585 8BEB 60 .DB $60 ;REG/SP1586 8BEC A0 .DB $A0 ;MEM/WP1587 8BED 00 .DB $00 ;L2/L11588 8BEE 40 .DB $40 ;S2/S11589 8BEF ASCIM1 =*-11590 8BEF ASCII =* ;ASCII CODES AND HASH CODES1591 8BEF 30 .DB $30 ;ZERO1592 8BF0 31 .DB $31 ;ONE1593 8BF1 32 .DB $32 ;TWO1594 8BF2 33 .DB $33 ;THREE1595 8BF3 34 .DB $34 ;FOUR1596 8BF4 35 .DB $35 ;FIVE1597 8BF5 36 .DB $36 ;SIX1598 8BF6 37 .DB $37 ;SEVEN1599 8BF7 38 .DB $38 ;EIGHT1600 8BF8 39 .DB $39 ;NINE1601 8BF9 41 .DB $41 ;A1602 8BFA 42 .DB $42 ;B1603 8BFB 43 .DB $43 ;C1604 8BFC 44 .DB $44 ;D1605 8BFD 45 .DB $45 ;E1606 8BFE 46 .DB $46 ;F1607 8BFF 0D .DB $0D ;CR1608 8C00 2D .DB $2D ;DASH1609 8C01 3E .DB $3E ;>1610 8C02 FF .DB $FF ;SHIFT1611 8C03 47 .DB $47 ;G1612 8C04 52 .DB $52 ;R1613 8C05 4D .DB $4D ;M1614 8C06 13 .DB $13 ;L21615 8C07 1E .DB $1E ;S21616 8C08 ; KB UPPER CASE1617 8C08 14 .DB $14 ;U01618 8C09 15 .DB $15 ;U11619 8C0A 16 .DB $16 ;U21620 8C0B 17 .DB $17 ;U31621 8C0C 18 .DB $18 ;U41622 8C0D 19 .DB $19 ;U51623 8C0E 1A .DB $1A ;U61624 8C0F 1B .DB $1B ;U71625 8C10 4A .DB $4A ;J1626 8C11 56 .DB $56 ;V1627 8C12 FE .DB $FE ;ASCII1628 8C13 42 .DB $42 ;B1629 8C14 43 .DB $43 ;C1630 8C15 44 .DB $44 ;D1631 8C16 45 .DB $45 ;E1632 8C17 46 .DB $46 ;F1633 8C18 10 .DB $10 ;SD1634 8C19 2B .DB $2B ;+1635 8C1A 3C .DB $3C ;<1636 8C1B 00 .DB $00 ;SHIFT1637 8C1C 11 .DB $11 ;LP1638 8C1D 1C .DB $1C ;SP1639 8C1E 57 .DB $57 ;W1640 8C1F 12 .DB $12 ;L11641 8C20 1D .DB $1D ;S11642 8C21 2E .DB $2E ;.1643 8C22 20 .DB $20 ;BLANK1644 8C23 3F .DB $3F ;?1645 8C24 50 .DB $50 ;P1646 8C25 07 .DB $07 ;BELL1647 8C26 53 .DB $53 ;S1648 8C27 58 .DB $58 ;X1649 8C28 59 .DB $59 ;Y1650 8C29 ; SEGMENT CODES FOR ON-BOARD DISPLAY1651 8C29 SEGSM1 =*-11652 8C29 3F .DB $3F ;ZERO1653 8C2A 06 .DB $06 ;ONE1654 8C2B 5B .DB $5B ;TWO1655 8C2C 4F .DB $4F ;THREE1656 8C2D 66 .DB $66 ;FOUR1657 8C2E 6D .DB $6D ;FIVE1658 8C2F 7D .DB $7D ;SIX1659 8C30 07 .DB $07 ;SEVEN1660 8C31 7F .DB $7F ;EIGHT1661 8C32 67 .DB $67 ;NINE1662 8C33 77 .DB $77 ;A1663 8C34 7C .DB $7C ;B1664 8C35 39 .DB $39 ;C1665 8C36 5E .DB $5E ;D1666 8C37 79 .DB $79 ;E1667 8C38 71 .DB $71 ;F1668 8C39 F0 .DB $F0 ;CR1669 8C3A 40 .DB $40 ;DASH1670 8C3B 70 .DB $70 ;>1671 8C3C 00 .DB $00 ;SHIFT1672 8C3D 6F .DB $6F ;G1673 8C3E 50 .DB $50 ;R1674 8C3F 54 .DB $54 ;M1675 8C40 38 .DB $38 ;L21676 8C41 6D .DB $6D ;S21677 8C42 01 .DB $01 ;U01678 8C43 08 .DB $08 ;U11679 8C44 09 .DB $09 ;U21680 8C45 30 .DB $30 ;U31681 8C46 36 .DB $36 ;U41682 8C47 5C .DB $5C ;U51683 8C48 63 .DB $63 ;U61684 8C49 03 .DB $03 ;U71685 8C4A 1E .DB $1E ;J1686 8C4B 72 .DB $72 ;V1687 8C4C 77 .DB $77 ;A1688 8C4D 7C .DB $7C ;B1689 8C4E 39 .DB $39 ;C1690 8C4F 5E .DB $5E ;D1691 8C50 79 .DB $79 ;E1692 8C51 71 .DB $71 ;F1693 8C52 6D .DB $6D ;SD1694 8C53 76 .DB $76 ;+1695 8C54 46 .DB $46 ;<1696 8C55 00 .DB $00 ;SHIFT1697 8C56 38 .DB $38 ;LP1698 8C57 6D .DB $6D ;SP1699 8C58 1C .DB $1C ;W1700 8C59 38 .DB $38 ;L11701 8C5A 6D .DB $6D ;S11702 8C5B 80 .DB $80 ;.1703 8C5C 00 .DB $00 ;SPACE1704 8C5D 53 .DB $53 ;?1705 8C5E 73 .DB $73 ;P1706 8C5F 49 .DB $49 ;BELL1707 8C60 6D .DB $6D ;S1708 8C61 64 .DB $64 ;X1709 8C62 6E .DB $6E ;Y1710 8C63 973D1F100800DECPTS .DB $97,$3D,$1F,$10,$08,$00 ; TO DETERMINE BAUD RATE1711 8C69 .MSFIRST1712 8C69 D54C24100601STDVAL .DW $D54C,$2410,$0601 ;STD VALS FOR BAUD RATES1713 8C6F .LSFIRST1714 8C6F ; 110,300,600,1200,2400,4800 BAUD1715 8C6F 4C 58 8A TRMTBL JMP INTCHR1716 8C72 4C A0 8A JMP TOUT1717 8C75 4C 3C 8B JMP TSTAT1718 8C78 ;1719 8C781720 8C78 ;****** VERSION 2 4/13/79 "SY1.1"1721 8C78 ;****** COPYRIGHT 1978 SYNERTEK SYSTEMS CORPORATION1722 8C78 ;******1723 8C78 BDRY =$F8 ;0/1 BDRY FOR READ TIMING1724 8C78 OLD =$F9 ;HOLD PREV INPUT LEVEL IN GETTR1725 8C78 CHAR =$FC ;CHAR ASSY AND DISASSY1726 8C78 MODE =$FD ;BIT7=1 IS HS, 0 IS KIM1727 8C78 ;... BIT6=1 - IGNORE DATA1728 8C78 BUFADL =$FE ;RUNNING BUFFER ADR1729 8C78 BUFADH =$FF1730 8C78 ;TAPDEL =$A630 ;HI SPEED TAPE DELAY1731 8C78 ;KMBDRY =$A631 ;KIM READ BDRY1732 8C78 ;HSBDRY =$A632 ;HS READ BDRY1733 8C78 ;TAPET1 =$A635 ;HS FIRST 1/2 BIT1734 8C78 ;TAPET2 =$A63C ;HS SECOND 1/2 BIT1735 8C78 ;SCR6 =$A636 ;SCR61736 8C78 ;SCR7 =$8637 ;SCR71737 8C78 ;SCR8 =$A638 ;SCR81738 8C78 ;SCR9 =$A639 ;SCR91739 8C781740 A64A *=$A64A1741 A64A EAL .BLOCK 1 ;P3L - END ADDR +1 (LO)1742 A64B EAH .BLOCK 1 ;P3H - (HI)1743 A64C SAL .BLOCK 1 ;P2L - START ADDR (LO)1744 A64D SAH .BLOCK 1 ;P2H - (HI)1745 A64E ID .BLOCK 1 ;P1L - ID1746 A64F1747 A64F EOT = $041748 A64F SYN = $161749 A64F TPBIT =%1000 ;BIT 3 IS ENABLE/DISABLE TO DECODER1750 A64F FRAME =$FF ;ERROR MSG # FOR FRAME ERROR1751 A64F CHECK =$CC ;ERROR # FOR CHECKSUM ERROR1752 A64F LSTCHR =$2F ;LAST CHAR NOT '/'1753 A64F NONHEX =$FF ;NON HEX CHAR IN KIM REC1754 A64F1755 A64F ;ACCESS =$8BB6 ;UNRITE PROTECT SYSTEM RAM1756 A64F ;P2SCR =$829C ;MOVE P2 TO $FF,$FE IN PAGE ZERO1757 A64F ;ZERCK =$832E ;MOVE ZERO TO CHECK SUM1758 A64F ;CONFIG =$89A5 ;CONFIGURE I/O1759 A64F1760 A64F ; I/O - TAPE ON/OFF IS CB2 ON VIA 1 (A000)1761 A64F ; TAPE IN IS PB6 ON VIA 1 (A000)1762 A64F ; TAPE OUT IS CODE 7 TO DISPLAY DECODER, THRU 6532,1763 A64F ; PB0-PB3 (A400)1764 A64F1765 A64F VIAACR =$A00B1766 A64F VIAPCR =$A00C ;CONTROL CB2 TAPE ON/OFF, POR1767 A64F TPOUT =$A4021768 A64F TAPOUT =TPOUT1769 A64F DDROUT =$A4031770 A64F TAPIN =$A0001771 A64F DDRIN =$A0021772 A64F TIMER =$A406 ;6532 TIMER READ1773 A64F TIM8 =$A415 ;6532 TIMER SET (8US)1774 A64F DDRDIG =$A4011775 A64F DIG =$A4001776 A64F1777 A64F ; LOADT ENTER W/ID IN PARM 2, MODE IN [Y]1778 A64F1779 8C78 *=$8C781780 8C78 20 A9 8D LOADT JSR START ;INITIALIZE1781 8C7B 20 52 8D LOADT2 JSR SYNC ;GET IN SYNC1782 8C7E 20 E1 8D LOADT4 JSR RDCHTX1783 8C81 C9 2A CMP #'*' ;START OF DATA?1784 8C83 F0 06 BEQ LOAD111785 8C85 C9 16 CMP #SYN ;NO - SYN?1786 8C87 D0 F2 BNE LOADT2 ;IF NOT, RESTART SYNC SEARCH1787 8C89 F0 F3 BEQ LOADT4 ;IF YES, KEEP LOOKING FOR *1788 8C8B1789 8C8B 06 FD LOAD11 ASL MODE ;GET MODE IN A, CLEAR BIT61790 8C8D 6A ROR A1791 8C8E 85 FD STA MODE1792 8C90 20 26 8E JSR RDBYTX ;READ ID BYTE ON TAPE1793 8C93 8D 00 A4 STA DIG ;DISPLAY ON LED (NOT DECODED)1794 8C96 CD 4E A6 CMP ID ;COMPARE WITH REQUESTED ID1795 8C99 F0 29 BEQ LOADT5 ;LOAD IF EQUAL1796 8C9B AD 4E A6 LDA ID ;COMPARE WITH 01797 8C9E C9 00 CMP #01798 8CA0 F0 22 BEQ LOADT5 ;IF 0, LOAD ANYWAY1799 8CA2 C9 FF CMP #$FF ;COMPARE WITH FF1800 8CA4 F0 07 BEQ LOADT6 ;IF FF, USE REQUEST SA TO LOAD1801 8CA61802 8CA6 24 FD BIT MODE ;UNWANTED RECORD, KIM OR HS?1803 8CA8 30 16 BMI HWRONG1804 8CAA 4C 7B 8C JMP LOADT2 ;IF KIM, RESTART SEARCH1805 8CAD1806 8CAD ; SA (&EA IF USED) COME FROM REQUEST. DISCARD TAPE VALUES1807 8CAD ; (BUFAD ALREADY SET TO SA BY 'START')1808 8CAD ;1809 8CAD 20 74 8E LOADT6 JSR RDCHK ;GET SAL FROM TAPE1810 8CB0 20 74 8E JSR RDCHK ;GET SAH FROM TAPE1811 8CB3 24 FD BIT MODE ;HS OR KIM?1812 8CB5 10 52 BPL LOADT7 ;IF KIM, START READING DATA1813 8CB7 20 74 8E JSR RDCHK ;HS, GET EAH, EAL FROM TAPE1814 8CBA 20 74 8E JSR RDCHK ; ... BUT IGNORE1815 8CBD 4C DE 8C JMP LT7H ;START READING HS DATA1816 8CC01817 8CC0 ; SA ( & EA IF USED) COME FROM TAPE. SA REPLACES BUFAD1818 8CC01819 8CC0 A9 C0 HWRONG LDA #$C0 ;READ THRU TO GE TO NEXT REC1820 8CC2 85 FD STA MODE ;BUT DON'T CHECK CKSUM, NO FRAME ERR1821 8CC41822 8CC4 20 74 8E LOADT5 JSR RDCHK ;GET SAL FROM TAPE1823 8CC7 85 FE STA BUFADL ;PUT IN BUF START L1824 8CC9 20 74 8E JSR RDCHK ;SAME FOR SAH1825 8CCC 85 FF STA BUFADH1826 8CCE ;(SAL - H STILL HAVE REQUEST VALUE)1827 8CCE 24 FD BIT MODE ;HS OR KIM?1828 8CD0 10 37 BPL LOADT7 ;IF KIM, START READING RECORD1829 8CD2 20 74 8E JSR RDCHK ;HS. GET & SAVE EAL,EAH1830 8CD5 8D 4A A6 STA EAL1831 8CD8 20 74 8E JSR RDCHK1832 8CDB 8D 4B A6 STA EAH1833 8CDE1834 8CDE ; READ HS DATA1835 8CDE1836 8CDE 20 E5 8D LT7H JSR RDBYTH ;GET NEXT BYTE1837 8CE1 A6 FE LDX BUFADL ;CHECK FOR END OF DATA + 11838 8CE3 EC 4A A6 CPX EAL1839 8CE6 D0 07 BNE LT7HA1840 8CE8 A6 FF LDX BUFADH1841 8CEA EC 4B A6 CPX EAH1842 8CED F0 14 BEQ LT7HB1843 8CEF 20 77 8E LT7HA JSR CHKT ;NOT END, UPDATE CHECKSUM1844 8CF2 24 FD BIT MODE ;WRONG RECORD?1845 8CF4 70 04 BVS LT7HC ;IF SO, DONT STORE BYTE1846 8CF6 A0 00 LDY #0 ;STORE BYTE1847 8CF8 91 FE STA (BUFADL),Y1848 8CFA E6 FE LT7HC INC BUFADL ;BUMP BUFFER ADDR1849 8CFC D0 E0 BNE LT7H1850 8CFE E6 FF INC BUFADH ;CARRY1851 8D00 4C DE 8C JMP LT7H1852 8D031853 8D03 C9 2F LT7HB CMP #'/' ;EA, MUST BE "/"1854 8D05 D0 29 BNE LCERR ;LAST CHAR NOT '/'1855 8D07 F0 15 BEQ LT8A ;(ALWAYS)1856 8D091857 8D09 ; READ KIM DATA1858 8D091859 8D09 20 2A 8E LOADT7 JSR RDBYT1860 8D0C B0 26 BCS LDT7A ;NONHEX OR LAST CHAR1861 8D0E 20 77 8E JSR CHKT ;UPDATE CHECKSUM (PACKED BYTE)1862 8D11 A0 00 LDY #0 ;STORE BYTE1863 8D13 91 FE STA (BUFADL),Y1864 8D15 E6 FE INC BUFADL ;BUMP BUFFER ADR1865 8D17 D0 F0 BNE LOADT7 ;CARRY?1866 8D19 E6 FF INC BUFADH1867 8D1B 4C 09 8D JMP LOADT71868 8D1E1869 8D1E ; TEST CHECKSUM & FINISH1870 8D1E1871 8D1E LOADT8 =*1872 8D1E 20 26 8E LT8A JSR RDBYTX ;CHECK SUM1873 8D21 CD 36 A6 CMP SCR61874 8D24 D0 16 BNE CKERR1875 8D26 20 26 8E JSR RDBYTX1876 8D29 CD 37 A6 CMP SCR71877 8D2C D0 0E BNE CKERR ;CHECK SUM ERROR1878 8D2E F0 11 BEQ OKEXIT ;(ALWAYS)1879 8D301880 8D30 A9 2F LCERR LDA #LSTCHR ;LAST CHAR IS NOT '/'1881 8D32 D0 0A BNE NGEXIT ;(ALWAYS)1882 8D341883 8D34 C9 2F LDT7A CMP #'/' ;LAST OR NONHEX?1884 8D36 F0 E6 BEQ LOADT8 ;LAST1885 8D38 FRERR ;FRAMING ERROR1886 8D38 A9 FF NHERR LDA #NONHEX ;KIM ONLY, NON HEX CHAR READ1887 8D3A D0 02 BNE NGEXIT ;(ALWAYS)1888 8D3C1889 8D3C A9 CC CKERR LDA #CHECK ;CHECKSUM ERROR1890 8D3E1891 8D3E 38 NGEXIT SEC ;ERROR INDICATOR TO MONITOR IS CARRY1892 8D3F B0 01 BCS EXIT ;(ALWAYS)1893 8D411894 8D41 18 OKEXIT CLC ;NO ERROR1895 8D421896 8D42 24 FD EXIT BIT MODE1897 8D44 50 08 BVC EX10 ;READING WRONG REC?1898 8D46 A0 80 LDY #$801899 8D48 4C 78 8C JMP LOADT ;RESTART SEARCH1900 8D4B1901 8D4B 68 USRREQ PLA ;USER REQUESTS EXIT1902 8D4C 68 PLA1903 8D4D 38 SEC1904 8D4E A2 CC EX10 LDX #$CC1905 8D50 D0 69 BNE STCC ;STOP TAPE, RETURN1906 8D52 AD 02 A0 SYNC LDA DDRIN ;CHANGE DATA DIRECTION1907 8D55 29 BF AND #$BF1908 8D57 8D 02 A0 STA DDRIN1909 8D5A A9 00 LDA #01910 8D5C 8D 0B A0 STA VIAACR1911 8D5F AD 31 A6 LDA KMBDRY ;SET UP BOUNDARY1912 8D62 24 FD BIT MODE1913 8D64 10 03 BPL SY1001914 8D66 AD 32 A6 LDA HSBDRY1915 8D69 85 F8 SY100 STA BDRY1916 8D6B A9 6D LDA #$6D1917 8D6D 8D 00 A4 STA DIG ;INDICATE NO SYNC ON LEDS1918 8D70 A5 FD LDA MODE ;TURN ON OUT OF SYNC MODE1919 8D72 09 40 ORA #$40 ;BIT61920 8D74 85 FD STA MODE1921 8D76 A9 7F SYNC5 LDA #$7F ;TEST FOR CR DOWN ON HKB1922 8D78 8D 01 A4 STA DDRDIG1923 8D7B 2C 00 A4 BIT DIG1924 8D7E 10 CB BPL USRREQ ;CR KEY DOWN - EXIT (ERRORS)1925 8D80 20 9F 8D JSR SYNBIT1926 8D83 66 FC ROR CHAR1927 8D85 A5 FC LDA CHAR1928 8D87 C9 16 CMP #SYN1929 8D89 D0 EB BNE SYNC51930 8D8B A2 0A SYNC10 LDX #10 ;NOW MAKE SURE CAN GET 10 SYNS1931 8D8D 20 E1 8D JSR RDCHTX1932 8D90 C9 16 CMP #SYN1933 8D92 D0 E2 BNE SYNC51934 8D94 CA DEX1935 8D95 D0 F6 BNE SYNC10+21936 8D97 8E 00 A4 STX DIG ;TURN OFF DISPLAY1937 8D9A CA DEX ;X=$FF1938 8D9B 8E 01 A4 STX DDRDIG1939 8D9E 60 RTS1940 8D9F ;SYNBIT - GET BIT IN SYN SEARCH. IF HS, ENTER WITH1941 8D9F ; TIMER STARTED BY PREV BIT, BIT RETURNED IN CARRY.1942 8D9F1943 8D9F 24 FD SYNBIT BIT MODE ;KIM OR HS?1944 8DA1 10 69 BPL RDBITK ;KIM1945 8DA3 20 CA 8D JSR GETTR ;HS1946 8DA6 B0 22 BCS GETTR ;IF SHORT, GET NEXT TRANS1947 8DA8 60 RTS ;BIT IS ZERO1948 8DA91949 8DA9 84 FD START STY MODE ;MODE PARM PASSED IN [Y]1950 8DAB 20 86 8B JSR ACCESS ;FIX BASIC WARM START BUG1951 8DAE A9 09 LDA #91952 8DB0 20 A5 89 JSR CONFIG ;PARTIAL I/O CONFIGURATION1953 8DB3 20 2E 83 JSR ZERCK ;ZERO THE CHECK SUM1954 8DB6 20 9C 82 JSR P2SCR ;MOVE SA TO FE,FF IN PAGE ZERO1955 8DB9 A2 EC LDX #$EC1956 8DBB 8E 0C A0 STCC STX VIAPCR ;TAPE ON1957 8DBE 60 RTS1958 8DBF1959 8DBF ; GETTR - GET TRANSITION TIME FROM 6532 CLOCK1960 8DBF ; DESTROYS A,Y1961 8DBF1962 8DBF A9 00 KGETTR LDA #0 ;KIM GETTR - GET FULL CYCLE1963 8DC1 85 F9 STA OLD ;FORCE GETTR POLARITY1964 8DC3 AD 00 A0 KG100 LDA TAPIN ;WAIT TIL INPUT LO1965 8DC6 29 40 AND #$401966 8DC8 D0 F9 BNE KG1001967 8DCA1968 8DCA A0 FF GETTR LDY #$FF1969 8DCC AD 00 A0 NOTR LDA TAPIN1970 8DCF 29 40 AND #$401971 8DD1 C5 F9 CMP OLD1972 8DD3 F0 F7 BEQ NOTR ;NO CHANGE1973 8DD5 85 F9 STA OLD1974 8DD7 AD 06 A4 LDA TIMER1975 8DDA 8C 15 A4 STY TIM8 ;RESTART CLOCK1976 8DDD 18 CLC1977 8DDE 65 F8 ADC BDRY1978 8DE0 60 RTS1979 8DE11980 8DE1 24 FD RDCHTX BIT MODE ;READ HS OR KIM CHARACTER1981 8DE3 10 7A BPL RDCHT ;KIM1982 8DE51983 8DE5 ; RDBYTH - READ HS BYTE1984 8DE5 ; Y DESTROYED, BYTE RETURNED IN CHAR AND A1985 8DE5 ; TIME FROM ONE CALL TO NEXT MUST BE LESS THAN1986 8DE5 ; START BIT TIME (TIMER STILL RUNNING)1987 8DE51988 8DE5 8E 38 A6 RDBYTH STX SCR8 ;SAVE X1989 8DE8 A2 08 LDX #81990 8DEA 20 CA 8D JSR GETTR ;GET START BIT TIME1991 8DED B0 14 BCS RDBH90 ;IF NOT 0, FRAMING ERR1992 8DEF 20 CA 8D RDBH10 JSR GETTR ;GET BIT IN CARRY1993 8DF2 90 04 BCC RDASSY1994 8DF4 20 CA 8D JSR GETTR ;BIT IS ONE, WAIT HALF CYC1995 8DF7 38 SEC ;MAKE SURE "1"1996 8DF8 66 FC RDASSY ROR CHAR1997 8DFA CA DEX1998 8DFB D0 F2 BNE RDBH101999 8DFD A5 FC LDA CHAR ;GET IN ACC2000 8DFF AE 38 A6 H8DFF LDX SCR8 ;RESTORE X2001 8E02 60 RTS2002 8E03 24 FD RDBH90 BIT MODE ;NO ERR IF NOT IN SYNC2003 8E05 70 F8 BVS RDBH90-4 ;OR READING WRONG REC2004 8E07 68 PLA ;FIX STACK2005 8E08 68 PLA2006 8E09 4C 38 8D JMP FRERR2007 8E0C2008 8E0C ; RDBITK - READ KIM BIT - X,Y,A DESTROYED, BIT RETURNED IN C2009 8E0C2010 8E0C 20 BF 8D RDBITK JSR KGETTR ;WAIT FOR LF2011 8E0F B0 FB BCS RDBITK2012 8E11 20 BF 8D JSR KGETTR ;GET SECOND2013 8E14 B0 F6 BCS RDBITK2014 8E16 A2 00 LDX #02015 8E18 E8 RDB100 INX ;COUNT LF FULL CYCLES2016 8E19 20 BF 8D JSR KGETTR2017 8E1C 90 FA BCC RDB1002018 8E1E 20 BF 8D JSR KGETTR ;GET SECOND2019 8E21 90 F5 BCC RDB1002020 8E23 E0 08 CPX #$08 ;GET BIT TO CARRY2021 8E25 60 RTS2022 8E262023 8E26 24 FD RDBYTX BIT MODE ;READ HS OR KIM BYTE2024 8E28 30 BB BMI RDBYTH ;HS2025 8E2A2026 8E2A 20 5F 8E RDBYT JSR RDCHT ;READ KIM BYTE INTO CHAR AND A2027 8E2D C9 2F CMP #'/' ;READ ONE CHAR IF LAST2028 8E2F F0 2C BEQ PACKT3 ;SET CARRY AND RETURN2029 8E31 20 3C 8E JSR PACKT2030 8E34 B0 26 BCS RDRTN ;NON HEX CHAR?2031 8E36 AA TAX ;SAVE MSD2032 8E37 20 5F 8E JSR RDCHT2033 8E3A 86 FC STX CHAR ;MOVE MSD TO CHAR2034 8E3C ; AND FALL INTO PACKT AGAIN2035 8E3C2036 8E3C ;PACKT - ASCII HEX TO 4 BITS2037 8E3C ;INPUT IN A, OUTPUT IN CHAR AND A, CARRY SET = NON HEX2038 8E3C2039 8E3C C9 30 PACKT CMP #$30 ;LT "0"?2040 8E3E 90 1D BCC PACKT32041 8E40 C9 47 CMP #$47 ;GT "F" ?2042 8E42 B0 19 BCS PACKT32043 8E44 C9 40 CMP #$40 ;A-F?2044 8E46 F0 15 BEQ PACKT3 ;40 NOT VALID2045 8E48 90 03 BCC PACKT12046 8E4A 18 CLC2047 8E4B 69 09 ADC #92048 8E4D 2A PACKT1 ROL A ;GET LSD INTO LEFT NIBBLE2049 8E4E 2A ROL A2050 8E4F 2A ROL A2051 8E50 2A ROL A2052 8E51 A0 04 LDY #42053 8E53 2A RACKT2 ROL A ;ROTATE 1 BIT AT A TIME INTO CHAR2054 8E54 26 FC ROL CHAR2055 8E56 88 DEY2056 8E57 D0 FA BNE RACKT22057 8E59 A5 FC LDA CHAR ;GET INTO ACCUM ALSO2058 8E5B 18 CLC ;OK2059 8E5C 60 RDRTN RTS2060 8E5D 38 PACKT3 SEC ;NOT HEX2061 8E5E 60 RTS2062 8E5F2063 8E5F ; RDCHT - READ KIM CHAR2064 8E5F ; PRESERVES X, RETURNS CHAR IN CHAR (W/PARITY)2065 8E5F ; AND A (W/O PARITY)2066 8E5F2067 8E5F 8A RDCHT TXA ;SAVE X2068 8E60 48 PHA2069 8E61 A9 FF LDA #$FF ;USE A TO COUNT BITS (BY SHIFTING)2070 8E63 48 KBITS PHA ;SAVE COUNTER2071 8E64 20 0C 8E JSR RDBITK2072 8E67 66 FC ROR CHAR2073 8E69 68 PLA2074 8E6A 0A ASL A2075 8E6B D0 F6 BNE KBITS ;DO 8 BITS2076 8E6D 68 PLA ;RESTORE X2077 8E6E AA TAX2078 8E6F A5 FC LDA CHAR2079 8E71 2A ROL A2080 8E72 4A LSR A ;DROP PARITY2081 8E73 60 RTS2082 8E742083 8E74 ; RDCHK - READ ONE BYT, INCLUDE IN CKSUM2084 8E742085 8E74 20 26 8E RDCHK JSR RDBYTX ;FALL INTO CHKT2086 8E772087 8E77 ; CHKT - UPDATE CHECK SUM FROM BYTE IN A2088 8E77 ; DESTROYS Y2089 8E772090 8E77 A8 CHKT TAY ;SAVE ACCUM2091 8E78 18 CLC2092 8E79 6D 36 A6 ADC SCR62093 8E7C 8D 36 A6 STA SCR62094 8E7F 90 03 BCC CHKT102095 8E81 EE 37 A6 INC SCR7 ;BUMP HI BYTE2096 8E84 98 CHKT10 TYA ;RESTORE A2097 8E85 60 RTS2098 8E862099 8E86 FF .DB $FF ;NOT USED2100 8E87 *=$8E87 ;KEEP OLD ENTRY POINT2101 8E87 20 A9 8D DUMPT JSR START ;INIT VIA & CKSUM, SA TO BUFAD & START2102 8E8A A9 07 LDA #7 ;CODE FOR TAPE OUT2103 8E8C 8D 02 A4 STA TAPOUT ;BIT 3 USED FOR HI/LO2104 8E8F A2 01 LDX #1 ;KIM DELAY CONSTANT (OUTER)2105 8E91 A4 FD LDY MODE ;128 KIM, 0 HS2106 8E93 10 03 BPL DUMPT1 ;KIM - DO 128 SYNS2107 8E95 AE 30 A6 LDX TAPDEL ;HS INITIAL DELAY (OUTER)2108 8E98 8A DUMPT1 TXA2109 8E99 48 PHA2110 8E9A A9 16 DMPT1A LDA #SYN2111 8E9C 20 0A 8F JSR OUTCTX2112 8E9F 88 DEY2113 8EA0 D0 F8 BNE DMPT1A ;INNER LOOP (HS OR KIM)2114 8EA2 68 PLA2115 8EA3 AA TAX2116 8EA4 CA DEX2117 8EA5 D0 F1 BNE DUMPT12118 8EA7 A9 2A LDA #'*' ;WRITE START2119 8EA9 20 0A 8F JSR OUTCTX2120 8EAC2121 8EAC AD 4E A6 LDA ID ;WRITE ID2122 8EAF 20 3F 8F JSR OUTBTX2123 8EB22124 8EB2 AD 4C A6 LDA SAL ;WRITE SA2125 8EB5 20 3C 8F JSR OUTBCX2126 8EB8 AD 4D A6 LDA SAH2127 8EBB 20 3C 8F JSR OUTBCX2128 8EBE2129 8EBE ;2130 8EBE 24 FD BIT MODE ;KIM OR HS2131 8EC0 10 0C BPL DUMPT22132 8EC22133 8EC2 AD 4A A6 LDA EAL ;HS, WRITE EA2134 8EC5 20 3C 8F JSR OUTBCX2135 8EC8 AD 4B A6 LDA EAH2136 8ECB 20 3C 8F JSR OUTBCX2137 8ECE2138 8ECE A5 FE DUMPT2 LDA BUFADL ;CHECK FOR LAST BYTE2139 8ED0 CD 4A A6 CMP EAL2140 8ED3 D0 25 BNE DUMPT42141 8ED5 A5 FF LDA BUFADH2142 8ED7 CD 4B A6 CMP EAH2143 8EDA D0 1E BNE DUMPT42144 8EDC2145 8EDC A9 2F LDA #'/' ;LAST, WRITE "/"2146 8EDE 20 0A 8F JSR OUTCTX2147 8EE1 AD 36 A6 LDA SCR6 ;WRITE CHECK SUM2148 8EE4 20 3F 8F JSR OUTBTX2149 8EE7 AD 37 A6 LDA SCR72150 8EEA 20 3F 8F JSR OUTBTX2151 8EED2152 8EED A9 04 LDA #EOT ;WRITE TWO EOT'S2153 8EEF 20 3F 8F JSR OUTBTX2154 8EF2 A9 04 LDA #EOT2155 8EF4 20 3F 8F JSR OUTBTX2156 8EF72157 8EF7 DT3E =* ;(SET "OK" MARK)2158 8EF7 4C 41 8D JMP OKEXIT2159 8EFA2160 8EFA A0 00 DUMPT4 LDY #0 ;GET BYTE2161 8EFC B1 FE LDA (BUFADL),Y2162 8EFE 20 3C 8F JSR OUTBCX ;WRITE IT W/CHK SUM2163 8F01 E6 FE INC BUFADL ;BUMP BUFFER ADDR2164 8F03 D0 C9 BNE DUMPT22165 8F05 E6 FF INC BUFADH ;CARRY2166 8F07 4C CE 8E JMP DUMPT22167 8F0A 24 FD OUTCTX BIT MODE ;HS OR KIM?2168 8F0C 10 48 BPL OUTCHT ;KIM2169 8F0E2170 8F0E ; OUTBTH - NO CLOCK2171 8F0E ; A,X DESTROYED2172 8F0E ; MUST RESIDE ON ONE PAGE - TIMING CRITICAL2173 8F0E A2 09 OUTBTH LDX #9 ;8 BITS + START BIT2174 8F10 8C 39 A6 STY SCR92175 8F13 85 FC STA CHAR2176 8F15 AD 02 A4 LDA TAPOUT ;GET PREV LEVEL2177 8F18 46 FC GETBIT LSR CHAR2178 8F1A 49 08 EOR #TPBIT2179 8F1C 8D 02 A4 STA TAPOUT ;INVERT LEVEL2180 8F1F ; *** HERE STARTS FIRST HALF CYCLE2181 8F1F AC 35 A6 LDY TAPET12182 8F22 88 A416 DEY ;TIME FOR THIS LOOP IS 5Y-12183 8F23 D0 FD BNE A4162184 8F25 90 12 BCC NOFLIP ;NOFLIP IF BIT ZERO2185 8F27 49 08 EOR #TPBIT ;BIT IS ONE - INVERT OUTPUT2186 8F29 8D 02 A4 STA TAPOUT2187 8F2C ; *** END OF FIRST HALF CYCLE2188 8F2C AC 3C A6 B416 LDY TAPET22189 8F2F 88 B416B DEY ;LENGTH OF LOOP IS 5Y-12190 8F30 D0 FD BNE B416B2191 8F32 CA DEX2192 8F33 D0 E3 BNE GETBIT ;GET NEXT BIT (LAST IS 0 START BIT)2193 8F35 AC 39 A6 LDY SCR9 ; (BY 9 BIT LSR)2194 8F38 60 RTS2195 8F39 EA NOFLIP NOP ;TIMING2196 8F3A 90 F0 BCC B416 ;(ALWAYS)2197 8F3C ;2198 8F3C 20 77 8E OUTBCX JSR CHKT ;WRITE HS OR KIM BYTE & CKSUM2199 8F3F 24 FD OUTBTX BIT MODE ;WRITE HS OR KIM BYTE2200 8F41 30 CB BMI OUTBTH ;HS2201 8F432202 8F43 ;OUTBTC - OUTPUT ONE KIM BYTE2203 8F432204 8F43 OUTBTC =*2205 8F43 A8 OUTBT TAY ;SAVE DATA BYTE2206 8F44 4A LSR A2207 8F45 4A LSR A2208 8F46 4A LSR A2209 8F47 4A LSR A2210 8F48 20 4B 8F JSR HEXOUT ;MORE SIG DIGIT2211 8F4B ; FALL INTO HEXOUT2212 8F4B2213 8F4B 29 0F HEXOUT AND #$0F ;CVT LSD OF [A] TO ASCII, OUTPUT2214 8F4D C9 0A CMP #$0A2215 8F4F 18 CLC2216 8F50 30 02 BMI HEX12217 8F52 69 07 ADC #$072218 8F54 69 30 HEX1 ADC #$302219 8F562220 8F56 ; OUTCHT - OUTPUT ASCII CHAR (KIM)2221 8F56 ; CLOCK NOT USED2222 8F56 ; X,Y PRESERVED2223 8F56 ; MUST RESIDE ON ONE PAGE - TIMING CRITICAL2224 8F562225 8F56 8E 38 A6 OUTCHT STX SCR8 ;PRESERVE X2226 8F59 8C 39 A6 STY SCR9 ;DITTO Y2227 8F5C 85 FC STA CHAR2228 8F5E A9 FF LDA #$FF ;USE FF W/SHIFTS TO COUNT BITS2229 8F60 48 KIMBIT PHA ;SAVE BIT CTR2230 8F61 AD 02 A4 LDA TPOUT ;GET CURRENT OUTPUT LEVEL2231 8F64 46 FC LSR CHAR ;GET DATA BIT IN CARRY2232 8F66 A2 12 LDX #18 ;ASSUME 'ONE'2233 8F68 B0 02 BCS HF2234 8F6A A2 24 LDX #36 ;BIT IS ZERO2235 8F6C A0 19 HF LDY #252236 8F6E 49 08 EOR #TPBIT ;INVERT OUTPUT2237 8F70 8D 02 A4 STA TPOUT2238 8F73 88 HFP1 DEY ;PAUSE FOR 138 USEC2239 8F74 D0 FD BNE HFP12240 8F76 CA DEX ;COUNT HALF CYCS OF HF2241 8F77 D0 F3 BNE HF2242 8F79 A2 18 LDX #24 ;ASSUME BIT IS ONE2243 8F7B B0 02 BCS LF202244 8F7D A2 0C LDX #12 ;BIT IS ZERO2245 8F7F A0 27 LF20 LDY #392246 8F81 49 08 EOR #TPBIT ;INVERT OUTPUT2247 8F83 8D 02 A4 STA TPOUT2248 8F86 88 LFP1 DEY ;PAUSE FOR 208 USEC2249 8F87 D0 FD BNE LFP12250 8F89 CA DEX ;COUNT HALF CYCS2251 8F8A D0 F3 BNE LF202252 8F8C 68 PLA ;RESTORE BIT CTR2253 8F8D 0A ASL A ;DECREMENT IT2254 8F8E D0 D0 BNE KIMBIT ;FF SHIFTED 8X = 02255 8F90 AE 38 A6 LDX SCR82256 8F93 AC 39 A6 LDY SCR92257 8F96 98 TYA ;RESTORE DATA BYTE2258 8F97 60 RTS2259 8F982260 8F98 FF FF .DB $FF,$FF ;NOT USED2261 8F9A2262 8F9A ; REGISTER NAME PATCH2263 8F9A *=$8F9A2264 8F9A 53 .DB "S"2265 8F9B 46 .DB "F"2266 8F9C 41 .DB "A"2267 8F9D 58 .DB 'X'2268 8F9E 59 .DB "Y"2269 8F9F 01 .DB $012270 8FA0 ;2271 8FA0 ;2272 8FA0 ;***2273 8FA0 ;*** DEFAULT TABLE2274 8FA0 ;***2275 8FA0 *=$8FA02276 8FA0 DFTBLK =*2277 8FA0 00 C0 .DW $C000 ;BASIC *** JUMP TABLE2278 8FA2 A7 8B .DW TTY2279 8FA4 64 8B .DW NEWDEV2280 8FA6 00 00 .DW $0000 ;PAGE ZERO2281 8FA8 00 02 .DW $02002282 8FAA 00 03 .DW $03002283 8FAC 00 C8 .DW $C8002284 8FAE 00 D0 .DW $D0002285 8FB0 04 .DB $04 ;TAPE DELAY (9.0 SEC)2286 8FB1 2C .DB $2C ;KIM TAPE BOUNDARY2287 8FB2 46 .DB $46 ;HS TAPE BOUNDARY2288 8FB3 00 00 .DB $00,$00 ;SCR3,SCR42289 8FB5 33 .DB $33 ;HS TAPE FIRST 1/2 BIT2290 8FB6 00 00 .DB $00,$00 ;SCR6,SCR72291 8FB8 00 00 00 00 .DB $00,$00,$00,$00 ;SCR8-SCRB2292 8FBC 5A .DB $5A ;HS TAPE SECOND 1/2 BIT2293 8FBD 00 00 00 .DB $00,$00,$00 ;SCRD-SCRF2294 8FC0 00006D6E8606 .DB $00,$00,$6D,$6E,$86,$06 ;DISP BUFFER (SY1.1)2295 8FC6 00 00 00 .DB $00,$00,$00 ;NOT USED2296 8FC9 00 .DB $00 ;PARNR2297 8FCA 000000000000 .DW $0000,$0000,$0000 ;PARMS2298 8FD0 01 .DB $01 ;PADBIT2299 8FD1 4C .DB $4C ;SDBYT2300 8FD2 00 .DB $00 ;ERCNT2301 8FD3 80 .DB $80 ;TECHO2302 8FD4 B0 .DB $B0 ;TOUTFL2303 8FD5 00 .DB $00 ;KSHFL2304 8FD6 00 .DB $00 ;TV2305 8FD7 00 .DB $00 ;LSTCOM2306 8FD8 10 .DB $10 ;MAXRC2307 8FD9 4A 8B .DW RESET ;USER REG'S2308 8FDB FF .DB $FF ;STACK2309 8FDC 00 .DB $00 ;FLAGS2310 8FDD 00 .DB $00 ;A2311 8FDE 00 .DB $00 ;X2312 8FDF 00 .DB $00 ;Y2313 8FE0 ;VECTORS2314 8FE0 4C BE 89 JMP HKEY ;INVEC2315 8FE3 4C 00 89 JMP HDOUT ;OUTVEC2316 8FE6 4C 6A 89 JMP KYSTAT ;INSVEC2317 8FE9 4C D1 81 JMP M1 ;UNRECOGNIZED SYNTAX (ERROR)2318 8FEC 4C D1 81 JMP M1 ;UNRECOGNIZED COMMAND (ERROR)2319 8FEF 4C 06 89 JMP SCAND ;SCNVEC2320 8FF2 7E 88 .DW RIN ;IN PTR FOR EXEC FROM RAM2321 8FF4 C0 80 .DW TRCOFF ;USER TRACE VECTOR2322 8FF6 4A 80 .DW SVBRK ;BRK2323 8FF8 29 80 .DW SVIRQ ;USER IRQ2324 8FFA 9B 80 .DW SVNMI ;NMI2325 8FFC 4A 8B .DW RESET ;RESET2326 8FFE 0F 80 .DW IRQBRK ;IRQ2327 90002328 9000 LENTRY =$8C782329 9000 SENTRY =$8C78+$20F2330 9000 RGNAM =$8F9A ;REGISTER NAME PATCH2331 90002332 9000 .ENDtasm: Number of errors = 0+------------------------------------------------------------------------| TOPIC -- AIM Computer -- AIM Monitor listing +------------------------------------------------------------------------0001 0000 ;TELEMARK CROSS ASSEMBLER (TASM) http://www.halcyon.com/squakvly/0002 00000003 0000 ;***************************************************0004 0000 ;***************************************************0005 0000 ;** **0006 0000 ;** PL-PA00-JOO1A **0007 0000 ;** **0008 0000 ;** ROCKWELL R6500 MICROCOMPUTER SYSTEM **0009 0000 ;** **0010 0000 ;** AIM 65 MONITOR **0011 0000 ;** **0012 0000 ;** PROGRAM LISTING **0013 0000 ;** **0014 0000 ;** REVISION A AUG 22, 1978 **0015 0000 ;** **0016 0000 ;***************************************************0017 0000 ;***************************************************0018 00000019 0000 ;ROCKWELL INTERNATIONAL0020 0000 ;MICROELECTRONIC DEVICES0021 0000 ;3310 MIRALOMA AVENUE0022 0000 ;P. O. BOX 36690023 0000 ;ANAHEIM CA U.S.A. 928030024 00000025 0000 ; **************************************0026 0000 ; * USER 6522 ADDRESSES (A000-A00F) *0027 0000 ; **************************************0028 A000 *=$A0000029 A000 UDRB .BLOCK 1 ;DATA REG B0030 A001 UDRAH .BLOCK 1 ;DATA REG A0031 A002 UDDRB .BLOCK 1 ;DATA DIR REG B0032 A003 UDDRA .BLOCK 1 ;DATA DIR REG A0033 A004 UT1L .BLOCK 1 ;TIMER 1 COUNTER LOW0034 A005 UT1CH .BLOCK 1 ;TIMER 1 COUNTER HIGH0035 A006 UT1LL .BLOCK 1 ;TIMER 1 LATCH LOW0036 A007 UT1LH .BLOCK 1 ;TIMER 1 LATCH HIGH0037 A008 UT2L .BLOCK 1 ;TIMER 2 LATCH & COUNTER LOW0038 A009 UT2H .BLOCK 1 ;TIMER 2 COUNTER HIGH0039 A00A USR .BLOCK 1 ;SHIFT REGISTER0040 A00B UACR .BLOCK 1 ;AUX CONTROL REGISTER0041 A00C UPCR .BLOCK 1 ;PERIPHERAL CONTROL REGISTER0042 A00D UIFR .BLOCK 1 ;INTERRUPT FLAG REGISTER0043 A00E UIER .BLOCK 1 ;INTERRUPT ENABLE REGISTER0044 A00F UDRA .BLOCK 1 ;DATA REGISTER A0045 A0100046 A010 ASSEM =$D000 ;ASSEMBLER ENTRY0047 A010 BASIEN =$B000 ;BASIC ENTRY (COLD)0048 A010 BASIRE =$B003 ;BASIC ENTRY (WARM)0049 A0100050 A010 ; MONITOR RAM0051 A010 ;TEXT EDITOR EQUATES (PAG 0)0052 A010 ;OVERLAPS TABUF2+50 (TAPE OUTPUT BUFFER $AD-$FF)0053 00DF *=$00DF0054 00DF NOWLN .BLOCK 2 ;CURRENT LINE0055 00E1 BOTLN .BLOCK 2 ;LAST ACTIVE , SO FAR0056 00E3 TEXT .BLOCK 2 ;LIMITS OF BUFFER (START)0057 00E5 END .BLOCK 2 ;LIMITS OF BUFFER (END)0058 00E7 SAVE .BLOCK 2 ;USED BY REPLACE0059 00E9 OLDLEN .BLOCK 1 ;ORIG LENGTH0060 00EA LENGTH .BLOCK 1 ;NEW LENGTH0061 00EB STRING .BLOCK 20 ;FIND STRING0062 00FF0063 0100 *=$01000064 0100 ;BREAKPOINTS AND USER I/O HANDLERS0065 0100 BKS .BLOCK 8 ;BRK LOCATIONS0066 0108 UIN .BLOCK 2 ;USER INPUT HANDLER (VECTOR)0067 010A UOUT .BLOCK 2 ;USER OUTPUT HANDLER (VECTOR)0068 010C0069 010C ;UNUSED KEYS TO GO TO USER ROUTINE0070 010C KEYF1 .BLOCK 3 ;USER PUTS A JMP INSTRUCTION TO...0071 010F KEYF2 .BLOCK 3 ;GO TO HIS ROUTINE ON EITHER KEY..0072 0112 KEYF3 .BLOCK 3 ;ENTRY0073 01150074 0115 ;EQUATES FOR DISASSEMBLER (PAG 1)0075 0116 *=$0116 ;SAME AS TAPE BUFFER I/O (TABUFF)0076 0116 FORMA .BLOCK 10077 0117 LMNEM .BLOCK 10078 0118 RMNEM .BLOCK 140079 01260080 0126 ;EQUATES FOR MNEMONIC ENTRY0081 0126 MOVAD .BLOCK 80082 012E TYPE .BLOCK 20083 0130 TMASK1 =MOVAD0084 0130 TMASK2 =MOVAD+10085 0130 CH .BLOCK 30086 0133 ADFLD .BLOCK 200087 0147 HISTM =$A42E ;SHARE WITH NAME & HIST0088 0147 BYTESM =HISTM+10089 0147 TEMPX =HISTM+30090 0147 TEMPA =HISTM+50091 0147 OPCODE =HISTM+60092 0147 CODFLG =HISTM+90093 01470094 0147 ; **********************************0095 0147 ; * 6532 ADDRESSES (A400-A7FF) *0096 0147 ; **********************************0097 A400 *=$A4000098 A400 MONRAM *=*0099 A400 ;JUMP VECTORS0100 A400 IRQV4 .BLOCK 2 ;IRQ AFTER MONITOR (NO BRK)0101 A402 NMIV2 .BLOCK 2 ;NMI0102 A404 IRQV2 .BLOCK 2 ;IRQ0103 A4060104 A406 ;I/O DEVICES0105 A406 DILINK .BLOCK 2 ;DISPL LINKAGE (TO ECHO TO DISP)0106 A408 TSPEED .BLOCK 1 ;TAPE SPEED (C7,5B,5A)0107 A409 GAP .BLOCK 1 ;TIMING GAP BETWEEN BLOCKS0108 A40A ;END OF USER ALTERABLE LOCATIONS0109 A40A NPUL .BLOCK 1 ;# OF HALF PULSES...0110 A40B TIMG .BLOCK 3 ;FOR TAPE0111 A40E REGF .BLOCK 1 ;REGS FLG FOR SINGLE STEP MODE0112 A40F DISFLG .BLOCK 1 ;DISASSEM FLG FOR SINGLE STEP MODE0113 A410 BKFLG .BLOCK 1 ;ENABLE OR DIS BREAKPOINTS0114 A411 PRIFLG .BLOCK 1 ;ENABLE OR DIS PRINTER0115 A412 INFLG .BLOCK 1 ;INPUT DEVICE0116 A413 OUTFLG .BLOCK 1 ;OUTPUT DEVICE0117 A414 HISTP .BLOCK 1 ;HISTORY PTR (SINGLE STEP) (Y)0118 A415 CURPO2 .BLOCK 1 ;DISPLAY POINTER0119 A416 CURPOS .BLOCK 1 ;PRINTER POINTER0120 A417 CNTH30 .BLOCK 1 ;BAUD RATE &...0121 A418 CNTL30 .BLOCK 1 ;DELAY FOR TTY0122 A419 COUNT .BLOCK 1 ;# OF LINES (0-99)0123 A41A S1 .BLOCK 2 ;START ADDRESS0124 A41C ADDR .BLOCK 2 ;END ADDRESS0125 A41E CKSUM .BLOCK 2 ;CHECKSUM0126 A420 S2 =BKS+6 ;VERTICAL COUNT (ONLY ON DUMP)0127 A4200128 A420 ;MONITOR REGISTERS0129 A420 SAVPS .BLOCK 1 ;STATUS0130 A421 SAVA .BLOCK 1 ;ACCUM0131 A422 SAVX .BLOCK 1 ;X REG0132 A423 SAVY .BLOCK 1 ;Y REG0133 A424 SAVS .BLOCK 1 ;STACK POINTER0134 A425 SAVPC .BLOCK 2 ;PROGR COUNTER0135 A4270136 A427 ;WORK AREAS FOR PAGE ZERO SIMULATION0137 A427 ;SIMULATE LDA (NNNN),Y ,WHERE NNNN IS ABSOLUTE0138 A427 STIY .BLOCK 3 ;STA NM,Y0139 A42A CPIY .BLOCK 3 ;CMP NM,Y OR LDA NM,Y0140 A42D .BLOCK 1 ;RTS0141 A42E LDIY =CPIY ;LDA NM,Y0142 A42E0143 A42E ;VARIABLES FOR TAPE0144 A42E NAME .BLOCK 6 ;FILE NAME0145 A434 TAPIN .BLOCK 1 ;IN FLG (TAPE 1 OR 2)0146 A435 TAPOUT .BLOCK 1 ;OUT FLG (TAPE 1 OR 2)0147 A436 TAPTR .BLOCK 1 ;TAPE BUFF POINTER0148 A437 TAPTR2 .BLOCK 1 ;TAPE OUTPUT BUFF PTR0149 A438 HIST =NAME ;FOUR LAST ADDR + NEXT (SINGL STEP)`0150 A438 BLK =$0115 ;BLOCK COUNT0151 A438 TABUFF =$0116 ;TAPE BUFFER (I/O)0152 A438 BLKO =$0168 ;OUTPUT BLOCK COUNT0153 A438 TABUF2 =$00AD ;OUTPUT BUFF WHEN ASSEMB (PAG0)0154 A438 DIBUFF .BLOCK 40 ;DISPLAY BUFFER0155 A4600156 A460 ;VARIABLES USED IN PRINTING0157 A460 IBUFM .BLOCK 20 ;PRINTER BUFFER0158 A474 IDIR .BLOCK 1 ;DIRECTION == 0=>+ , FF=>-0159 A475 ICOL .BLOCK 1 ;COLUMN LEFTMOST=0,RIGHTMOST=40160 A476 IOFFST .BLOCK 1 ;OFFSET 0=LEFT DGT,1=RIGHT DGT0161 A477 IDOT .BLOCK 1 ;# OF LAST DOT ENCOUNTERED0162 A478 IOUTL .BLOCK 1 ;LOWER 8 OUTPUTS(8 COLS ON RIGHT)0163 A479 IOUTU .BLOCK 1 ;UPPER 2 DIGITS0164 A47A IBITL .BLOCK 1 ;1 BIT MSK FOR CURRENT OUTPUT0165 A47B IBITU .BLOCK 10166 A47C IMASK .BLOCK 1 ;MSK FOR CURRENT ROW0167 A47D JUMP .BLOCK 2 ;INDIR & ADDR OF TABL FOR CURR ROW0168 A47F0169 A47F ;VARIABLES FOR KEYBOARD0170 A47F ROLLFL .BLOCK 1 ;SAVE LAST STROBE FOR ROLLOVER0171 A480 KMASK =CPIY ;TO MASK OFF CTRL OR SHIFT0172 A480 STBKEY =CPIY+1 ;STROBE KEY (1-8 COLUMNS)0173 A4800174 A480 ; I/O ASSIGNMENT0175 A480 *=$A4800176 A480 DRA2 .BLOCK 1 ;DATA REG A0177 A481 DDRA2 .BLOCK 1 ;DATA DIR REG A0178 A482 DRB2 .BLOCK 1 ;DATA REG B0179 A483 DDRB2 .BLOCK 1 ;DATA DIR REG B0180 A4840181 A484 ; WRITE EDGE DETECT CONTROL (NOT USED BECAUSE KB)0182 A484 *=$A4840183 A484 DNPA7 .BLOCK 1 ;DISABLE PA7 INT ,NEG EDGE DET0184 A485 DPPA7 .BLOCK 1 ;DIS PA7 INT ,POS EDGE DETE0185 A486 ENPA7 .BLOCK 1 ;ENA PA7 INT ,NEG EDG DET0186 A487 EPPA7 .BLOCK 1 ;ENA PA7 INT ,POS EDG DET0187 A4880188 A488 ; READ AND CLEAR INTERRUPT0189 A485 *=$A4850190 A485 RINT .BLOCK 1 ;BIT 7=TIMER FLG , BIT 6=PA7 FLG0191 A4860192 A486 ; TIMER INTERRUPT0193 A494 *=$A4940194 A494 ;WRITE COUNT TO INTERVAL TIMER0195 A494 ;INTERRUPT DISABLE FOR THESE ADDRS0196 A494 DIV1 .BLOCK 1 ;DIV BY 1 (DISABLE);ADD 8 TO ENA0197 A495 DIV8 .BLOCK 1 ;DIV BY 8 (DIS) ; ADD 8 TO ENA0198 A496 DIV64 .BLOCK 1 ;DIV BY 64 (DIS) ; ADD 8 TO ENA0199 A497 DI1024 .BLOCK 1 ;DIV BY 1024 (DIS) ; ADD 8 TO ENA0200 A4980201 A498 ; *********************************************0202 A498 ; * 6522 ADDRESSES (MONIT) (A800-ABFF) *0203 A498 ; *********************************************0204 A800 *=$A8000205 A800 DRB .BLOCK 1 ;DATA REG B0206 A801 DRAH .BLOCK 1 ;DATA REG A0207 A802 DDRB .BLOCK 1 ;DATA DIR REG B0208 A803 DDRA .BLOCK 1 ;DATA DIR REG A0209 A804 T1L .BLOCK 1 ;TIMER 1 COUNTER LOW0210 A805 T1CH .BLOCK 1 ;TIMER 1 COUNTER HIGH0211 A806 T1LL .BLOCK 1 ;TIMER 1 LATCH LOW0212 A807 T1LH .BLOCK 1 ;TIMER 1 LATCH HIGH0213 A808 T2L .BLOCK 1 ;TIMER 2 LATCH & COUNTER LOW0214 A809 T2H .BLOCK 1 ;TIMER 2 COUNTER HIGH0215 A80A SR .BLOCK 1 ;SHIFT REGISTER0216 A80B ACR .BLOCK 1 ;AUX CONTROL REGISTER0217 A80C PCR .BLOCK 1 ;PERIPHERAL CONTROL REGISTER0218 A80D IFR .BLOCK 1 ;INTERRUPT FLAG REGISTER0219 A80E IER .BLOCK 1 ;INTERRUPT ENABLE REGISTER0220 A80F DRA .BLOCK 1 ;DATA REGISTER A0221 A8100222 A810 ;DEFINE I/O CONTROL FOR PCR (CA1,CA2,CB1,CB2)0223 A810 DATIN =$0E ;DATA IN CA2=10224 A810 DATOUT =$0C ;DATA OUT CA2=00225 A810 PRST =$00 ;PRINT START (CB1) ,NEG DETEC0226 A810 SP12 =$01 ;STROBE P1,P2 (CA1) ,POS DETEC0227 A810 MON =$C0 ;MOTOR ON (CB2=0)0228 A810 MOFF =$E00229 A810 ;MSKS TO OBTAIN EACH INTERRUPT0230 A810 MPRST =$10 ;INT FLG FOR CB10231 A810 MSP12 =$02 ;INT FLG FOR CA10232 A810 MT2 =$20 ;INT FLG FOR T20233 A8100234 A810 ;DEFINE I/O CONTROL FOR ACR (TIMERS,SR)0235 A810 PRTIME =1700 ; PRINTING TIME =1.7M MSEC0236 A810 DEBTIM =5000 ; DEBOUNCE TIME (5 MSEC)0237 A810 T2I =$00 ;T2 AS ONE SHOT (PRI,KB,TTY,TAPE)0238 A810 T1I =$00 ;T1 AS ONE SHOT,PB7 DIS (TAPES)0239 A810 T1FR =$C0 ;T1 IN FREE RUNNING (TAPE)0240 A8100241 A810 ; ******************************0242 A810 ; * DISPLAY (AC00-AFFF) *0243 A810 ; ******************************0244 A810 ; REGISTERS FOR DISPLAY (6520)0245 AC00 *=$AC000246 AC00 RA .BLOCK 1 ;REGISTER A0247 AC01 CRA .BLOCK 1 ;CONTROL REG A0248 AC02 RB .BLOCK 1 ;REG B0249 AC03 CRB .BLOCK 1 ;CONTROL REG B0250 AC040251 AC04 ;CHR 00-03 ENA BY $AC04-AC070252 AC04 ;CHR 04-07 ENA BY $AC08-AC0B0253 AC04 ;CHR 08-11 ENA BY $AC10-AC130254 AC04 ;CHR 12-15 ENA BY $AC20-AC230255 AC04 ;CHR 16-19 ENA BY $AC40-AC430256 AC040257 AC04 NULLC =$FF0258 AC04 CR =$0D0259 AC04 LF =$0A0260 AC04 ESCAPE =$1B0261 AC04 RUB =$080262 AC04 EQS =$BD0263 AC04 ;.FILE A10264 AC040265 AC04 ; E=ENTER EDITOR0266 AC04 ; T=RE-ENTER EDITOR TO RE-EDIT SOURCE0267 AC04 ; R=SHOW REGISTERS0268 AC04 ; M=DISPLAY MEMORY0269 AC04 ; =SHOW NEXT 4 ADDRESSES0270 AC04 ; G=GO AT CURRENT P.C. (COUNT)0271 AC04 ; /=ALTER CURRENT MEMORY0272 AC04 ; L=LOAD OBJECT0273 AC04 ; D=DUMP OBJECT0274 AC04 ; N=ASSEMBLE0275 AC04 ; *=ALTER P.C.0276 AC04 ; A=ALTER ACCUMULATOR0277 AC04 ; X=ALTER X REGISTER0278 AC04 ; Y=ALTER Y REGISTER0279 AC04 ; P=ALTER PROCESSOR STATUS0280 AC04 ; S=ALTER STACK POINTER0281 AC04 ; B=SET BREAK ADDR0282 AC04 ; ?=SHOW BREAK ADDRESSES0283 AC04 ; #=CLEAR BREAK ADDRESSES0284 AC04 ; H=SHOW TRACE HISTORY STACK0285 AC04 ; V=TOGGLE REGISTER PRINT WITH DIS.0286 AC04 ; Z=TOGGLE DISASSEMBLER TRACE0287 AC04 ; \=TURN ON/OFF PRINTER0288 AC04 ; =ADV PAPER0289 AC04 ; I=MNEMONIC ENTRY0290 AC04 ; K=DISASSEMBLE MEMORY0291 AC04 ; 1=TOGGLE TAPE 1 CONTRL (ON OR OFF)0292 AC04 ; 2=TOGGLE TAPE 2 CONTRL0293 AC04 ; 3=VERIFY CKSUM FOR TAPES0294 AC04 ; 4=ENABLE BREAKS0295 AC04 ; 5=BASIC ENTRY (COLD)0296 AC04 ; 6=BASIC REENTRY (WARM)0297 AC040298 AC04 ;FOLLOWING KEYS ARE UNUSED BUT 'HOOKS'0299 AC04 ;ARE PROVIDED IN LOCATIONS 010C-01140300 AC04 ;0301 AC04 ; KEYF1,KEYF2,KEYF30302 AC040303 E000 *=$E0000304 E000 ;ALL MSGS HAVE MSB=1 OF LAST CHAR TO END IT0305 E000 46524F4DBD M1 .DB "FROM",EQS0306 E005 54 4F BD M3 .DB "TO",EQS0307 E008 202A2A2A2A20M4 .DB " **** PS AA XX YY S",$D30307 E00E 50532041412058582059592053D30308 E01C 4D4F5245BF M5 .DB "MORE",$BF0309 E021 4F 4E A0 M6 .DB "ON",$A0 ;"ON "0310 E024 4F 46 C6 M7 .DB "OF",$C6 ;"OFF"0311 E027 42 52 CB M8 .DB "BR",$CB ;"BRK"0312 E02A 49 4E BD M9 .DB "IN",EQS0313 E02D 4F 55 54 BD M10 .DB "OUT",EQS0314 E031 204D454D2046M11 .DB " MEM FAIL",$A00314 E037 41494CA00315 E03B 205052494E54M12 .DB " PRINTER DOW",$CE0315 E041 455220444F57CE0316 E048 2053524348 TMSG0 .DB " SRCH"0317 E04D 20 46 BD TMSG1 .DB " F",EQS0318 E050 54 BD TMSG2 .DB "T",EQS0319 E052 A0 C5 D2 D2 TMSG3 .DB $A0,$C5,$D2,$D2 ;PRINT " ERROR" ,MSB=10320 E056 CFD2A0A0A0A0 .DB $CF,$D2,$A0,$A0,$A0,$A0,$A0,$A0,";"0320 E05C A0A03B0321 E05F 41 BD TMSG5 .DB "A",EQS0322 E061 424C4B3DA0 TMSG6 .DB "BLK=",$A00323 E066 A0CCCFC1C43BTMSG7 .DB $A0,$CC,$CF,$C1,$C4,";"0324 E06C 454449544FD2EMSG1 .DB "EDITO",$D2 ;EDITOR MESSAGES0325 E072 45 4E C4 EMSG2 .DB "EN",$C40326 E0750327 E075 ;VECTORS COME HERE FIRST AFTER JUMP THRU FFFA-FFFF0328 E075 6C 02 A4 NMIV1 JMP (NMIV2) ;NMIV2 IS A VECTOR TO NMIV30329 E078 6C 04 A4 IRQV1 JMP (IRQV2) ;IRQV2 IS A VECTOR TO IRQV30330 E07B0331 E07B ;SINGLE STEP ENTRY POINT (NMI)0332 E07B 8D 21 A4 NMIV3 STA SAVA ;SAVE ACCUM0333 E07E 68 PLA0334 E07F 8D 20 A4 STA SAVPS ;SAVE PROCESSOR STATUS0335 E082 D8 CLD0336 E083 8E 22 A4 STX SAVX ;SAVE X0337 E086 8C 23 A4 STY SAVY0338 E089 68 PLA0339 E08A 8D 25 A4 STA SAVPC ;PROGRAM COUNTER0340 E08D 68 PLA0341 E08E 8D 26 A4 STA SAVPC+10342 E091 BA TSX ;GET STACK PTR & SAVE IT0343 E092 8E 24 A4 STX SAVS0344 E095 ;TRACE THE ADDRESS0345 E095 AC 14 A4 LDY HISTP ;GET POINTER TO HISTORY STACK0346 E098 AD 26 A4 LDA SAVPC+1 ;SAVE HALT ADDR IN HISTORY STACK0347 E09B 99 2E A4 STA HIST,Y0348 E09E AD 25 A4 LDA SAVPC0349 E0A1 99 2F A4 STA HIST+1,Y0350 E0A4 20 88 E6 JSR NHIS ;UPDATE POINTER0351 E0A7 AD 10 A4 LDA BKFLG ;SOFT BREAKS ON?0352 E0AA F0 08 BEQ NMI5 ;NO ,DONT CHCK BRKPOINT LIST0353 E0AC 20 6B E7 JSR CKB ;CHECK BREAKPOINT LIST0354 E0AF 90 03 BCC NMI5 ;DID NOT HIT BREAKPOINT0355 E0B1 4C 7F E1 NMI4 JMP IRQ2 ;HIT A BREAK-TRAP TO MONITOR0356 E0B4 20 90 E7 NMI5 JSR DONE ;COUNT =0 ?0357 E0B7 F0 F8 BEQ NMI4 ;YES,TRAP TO MONITOR0358 E0B9 20 07 E9 JSR RCHEK ;CHK IF HE WANTS TO INTERR0359 E0BC 4C 6D E2 JMP GOBK ;NOT DONE-RESUME EXECUTION0360 E0BF0361 E0BF ;POWER UP AND RESET ENTRY POINT (RST TRANSFERS HERE)0362 E0BF D8 RSET CLD ;CLEAR DEC MODE0363 E0C0 78 SEI ;DISABLE INTERRUPT0364 E0C1 A2 FF LDX #$FF ;INIT STACK PTR0365 E0C3 9A TXS0366 E0C4 8E 24 A4 STX SAVS ;ALSO INIT SAVED STACK PTR0367 E0C7 ;INITIALIZE 65220368 E0C7 A2 0E LDX #140369 E0C9 BD 43 E7 RS1 LDA INTAB1,X ;PB1-PB0,PA7-PA0 FOR PRNTR0370 E0CC 9D 00 A8 STA DRB,X ;PB2=TTO,PB6=TTI0371 E0CF CA DEX ;PB4-PB5=TAPE CONTROL,PB7=DATA0372 E0D0 10 F7 BPL RS1 ;PB3 =SWITCH KB/TTY0373 E0D2 ;INITIALIZE 65320374 E0D2 A2 03 LDX #3 ;PORTS USED FOR KB0375 E0D4 BD 52 E7 RS2 LDA INTAB2,X ;PA0-PA7 AS OUTPUT0376 E0D7 9D 80 A4 STA DRA2,X ;PB0-PB7 AS INPUT0377 E0DA CA DEX0378 E0DB 10 F7 BPL RS20379 E0DD ;INITIALIZE MONITOR RAM (6532)0380 E0DD AD 56 E7 LDA INTAB3 ;CHECK IF NMIV2 HAS BEEN CHANGED0381 E0E0 CD 02 A4 CMP NMIV2 ;IF IT HAS THEN ASSUME A COLD0382 E0E3 D0 0C BNE RS3A ;START AND INITIALIZE EVERYTHING0383 E0E5 AD 57 E7 LDA INTAB3+10384 E0E8 CD 03 A4 CMP NMIV2+10385 E0EB D0 04 BNE RS3A0386 E0ED A2 10 LDX #16 ;THEY ARE EQUAL ,IT'S A WARM RESET0387 E0EF D0 02 BNE RS30388 E0F1 A2 00 RS3A LDX #0 ;INIT EVERYTHING (POWER UP)0389 E0F3 BD 56 E7 RS3 LDA INTAB3,X0390 E0F6 9D 02 A4 STA NMIV2,X0391 E0F9 E8 INX0392 E0FA E0 15 CPX #210393 E0FC 90 F5 BCC RS30394 E0FE ;INITIALIZE DISPLAY (6520)0395 E0FE A9 00 LDA #0 ;SET CONTR REG FOR DATA DIR REG0396 E100 A2 01 LDX #10397 E102 20 13 E1 JSR SETREG0398 E105 A9 FF LDA #$FF ;SET DATA DIR REG FOR OUTPUT0399 E107 CA DEX0400 E108 20 13 E1 JSR SETREG0401 E10B A9 04 LDA #$04 ;SET CONTR REG FOR PORTS0402 E10D E8 INX0403 E10E 20 13 E1 JSR SETREG0404 E111 D0 07 BNE RS3B0405 E113 9D 00 AC SETREG STA RA,X0406 E116 9D 02 AC STA RB,X0407 E119 60 RTS0408 E11A 58 RS3B CLI ;CLEAR INTERRUPT0409 E11B0410 E11B ;KB/TTY SWITCH TEST AND BIT RATE MEASUREMENT0411 E11B A9 08 LDA #$08 ;PB3=SWITCH KB/TTY0412 E11D 2C 00 A8 RS4 BIT DRB ;A^M ,PB6-> V (OVERFLOW FLG)0413 E120 D0 22 BNE RS7 ;BRANCH ON KB0414 E122 70 F9 BVS RS4 ;START BIT=PB6=0?0415 E124 A9 FF LDA #$FF ;YES ,INITIALIZE TIMER T20416 E126 8D 09 A8 STA T2H0417 E129 2C 00 A8 RS5 BIT DRB ;END OF START BIT ?0418 E12C 50 FB BVC RS5 ;NO ,WAIT UNTIL PB6 BACK TO 10419 E12E AD 09 A8 LDA T2H ;STORE TIMING0420 E131 49 FF EOR #$FF ;COMPLEMENT0421 E133 8D 17 A4 STA CNTH300422 E136 AD 08 A8 LDA T2L0423 E139 49 FF EOR #$FF0424 E13B 20 7C FE JSR PATCH1 ;ADJUST IT0425 E13E 20 13 EA RS6 JSR CRLOW ;CLEAR DISPLAY0426 E141 4C 72 FF JMP PAT210427 E144 A2 13 RS7 LDX #19 ;CLEAR HARDWARE CURSORS0428 E146 8A RS8 TXA0429 E147 48 PHA0430 E148 A9 00 LDA #00431 E14A 20 7B EF JSR OUTDD10432 E14D 68 PLA0433 E14E AA TAX0434 E14F CA DEX0435 E150 10 F4 BPL RS80436 E152 30 EA BMI RS60437 E1540438 E154 ;BRK INSTR (00) OR IRQ ENTRY POINT0439 E154 8D 21 A4 IRQV3 STA SAVA0440 E157 68 PLA0441 E158 48 PHA ;GET STATUS0442 E159 29 10 AND #$10 ;SEE IF 'BRK' , ISOLATE B FLG0443 E15B D0 06 BNE IRQ1 ;TRAP WAS CAUSED BY "BRK" INSTRUC0444 E15D AD 21 A4 LDA SAVA ;TRAP CAUSED BY IRQ SO TRANSFER0445 E160 6C 00 A4 JMP (MONRAM) ;CONTROL TO USER THRU VECTOR0446 E163 ;IS 'BRK' INSTR ,SHOW PC & DATA0447 E163 ;PC IS OFF BY ONE , SO ADJUST IT0448 E163 68 IRQ1 PLA0449 E164 8D 20 A4 STA SAVPS ;SAVE PROCESSOR STATUS0450 E167 8E 22 A4 STX SAVX0451 E16A 8C 23 A4 STY SAVY0452 E16D D8 CLD0453 E16E 68 PLA ;PROGR CNTR0454 E16F 38 SEC ;SUBTRACT ONE FROM RETURN ADDR0455 E170 E9 01 SBC #10456 E172 8D 25 A4 STA SAVPC0457 E175 68 PLA0458 E176 E9 00 SBC #00459 E178 8D 26 A4 STA SAVPC+10460 E17B BA TSX ;GET STACK PTR & SAVE IT0461 E17C 8E 24 A4 STX SAVS0462 E17F ;SHOW PC AND DATA0463 E17F 20 61 F4 IRQ2 JSR REGQ ;SHOW NEXT INSTRUCTION & CONTINUE0464 E1820465 E182 ;THIS ROUTINE WILL GET A CHR WITH "( )" FROM0466 E182 ;KB/TTY & THEN WILL GO TO THE RESPECTIVE COMMAND0467 E182 4C 59 FF START JMP PAT19 ;CLEAR DEC MODE & 0468 E185 A9 BC STA1 LDA #'<'+$80 ;"<" CHR WITH MSB=1 FOR DISP0469 E187 20 7A E9 JSR OUTPUT0470 E18A 20 96 FE JSR RED1 ;GET CHR & ECHO FROM KB/TTY0471 E18D 48 PHA0472 E18E A9 3E LDA #'>'0473 E190 20 7A E9 JSR OUTPUT0474 E193 68 PLA ;SCAN LIST OF CMDS FOR ENTERED CHR0475 E194 A2 20 LDX #MCNT ;COUNT OF COMMANDS0476 E196 DD C4 E1 MCM2 CMP COMB,X ;CHECK NEXT COMMAND IN LIST0477 E199 F0 11 BEQ MCM3 ;MATCH , SO PROCESS THIS COMMAND0478 E19B CA DEX0479 E19C 10 F8 BPL MCM20480 E19E ;IS BAD COMMAND0481 E19E 20 D4 E7 JSR QM0482 E1A1 D8 COMIN CLD0483 E1A2 20 FE E8 JSR LL0484 E1A5 AE 24 A4 LDX SAVS0485 E1A8 9A TXS0486 E1A9 4C 82 E1 JMP START0487 E1AC ;HAVE VALID COMMAND0488 E1AC 8A MCM3 TXA ;CONVERT TO WORD (MULT BY 2)0489 E1AD 0A ASL A ;2 BYTES (ADDR)0490 E1AE AA TAX0491 E1AF BD E5 E1 LDA MONCOM,X ;GET ADDRESS OF COMMAND PROCESSOR0492 E1B2 8D 7D A4 STA JUMP0493 E1B5 BD E6 E1 LDA MONCOM+1,X0494 E1B8 8D 7E A4 STA JUMP+10495 E1BB 20 C1 E1 JSR JMPR ;CMD PROCESSORS CAN EXIT WITH 'RTS'0496 E1BE 4C 82 E1 JMP START0497 E1C1 6C 7D A4 JMPR JMP (JUMP) ;GO TO COMMAND0498 E1C40499 E1C4 ;VALID COMMANDS0500 E1C4 MCNT =32 ;COUNT0501 E1C4 4554524D472FCOMB .DB "ETRMG/LDN*AXYPS "0501 E1CA 4C444E2A4158595053200502 E1D4 423F2348565A .DB "B?#HVZIK123456[]",$5E0502 E1DA 494B3132333435365B5D5E0503 E1E50504 E1E5 39F6CFF627E2MONCOM .DW EDIT,REENTR,REG,MEM,GO0504 E1EB 48E261E20505 E1EF A0E2E6E23BE4 .DW CHNGG,LOAD,DUMP,ASSEM,CGPC,CGA0505 E1F5 00D0D4E5EEE50506 E1FB F2E5F6E5EAE5 .DW CGX,CGY,CGPS,CGS,NXT5,BRKA0506 E201 FAE50DE61BE60507 E207 4DE6FEE665E6 .DW SHOW,CLRBK,SHIS,REGT,TRACE0507 E20D D9E6DDE60508 E211 9EFB0AE7BDE6 .DW MNEENT,KDISA,TOGTA1,TOGTA2,VECKSM0508 E217 CBE694E60509 E21B E5E600B003B0 .DW BRKK,BASIEN,BASIRE0510 E221 ;USER DEFINED FUNCTIONS0511 E221 0C010F011201 .DW KEYF1,KEYF2,KEYF30512 E2270513 E227 ;***** R COMMAND-DISPLAY REGISTERS *****0514 E227 20 13 EA REG JSR CRLOW ;CLEAR DISP IF KB0515 E22A A0 08 LDY #M4-M1 ;MESSAG & 0516 E22C 20 AF E7 JSR KEP0517 E22F 20 24 EA JSR CRCK0518 E232 20 3E E8 REG1 JSR BLANK0519 E235 A0 09 LDY #SAVPC-ADDR ;OUTPUT PGR CNTR (SAVEPC+1,SAVEPC)0520 E237 20 DD E2 JSR WRITAD0521 E23A A9 20 LDA #SAVPS ;NOW THE OTHER 5 REGS0522 E23C 8D 1C A4 STA ADDR0523 E23F A9 A4 LDA #SAVPS/2560524 E241 8D 1D A4 STA ADDR+10525 E244 A2 05 LDX #5 ;COUNT0526 E246 D0 07 BNE MEM1 ;SHARE CODE0527 E2480528 E248 ;***** M COMMAND-DISPLAY MEMORY *****0529 E248 20 AE EA MEM JSR ADDIN ;GET START ADDDRESS IN ADDR0530 E24B B0 13 BCS MEM30531 E24D A2 04 MEIN LDX #40532 E24F A0 00 MEM1 LDY #00533 E251 20 3E E8 MEM2 JSR BLANK0534 E254 A9 1C LDA #ADDR0535 E256 20 58 EB JSR LDAY ;LOAD CONTENTS OF CURR LOCATION0536 E259 20 46 EA JSR NUMA ;AND DISPLAY IT AS 2 HEX DIGITS0537 E25C C8 INY0538 E25D CA DEX ;DECR COUNTER0539 E25E D0 F1 BNE MEM20540 E260 60 MEM3 RTS ;GET NEXT COMMAND0541 E2610542 E261 ;***** G COMMAND-RESTART PROCESSOR *****0543 E261 20 37 E8 GO JSR PSL1 ;"/"0544 E264 20 85 E7 JSR GCNT ;GET COUNT0545 E267 20 F0 E9 JSR CRLF0546 E26A 4C 86 E2 JMP GOBK1 ;RESUME EXECUTION0547 E26D AD 0E A4 GOBK LDA REGF ;DISPLAY REGISTERS ?0548 E270 F0 06 BEQ GOBK0 ;NO,BRANCH0549 E272 20 32 E2 JSR REG1 ;SHOW THE SIX REG0550 E275 20 24 EA JSR CRCK ;0551 E278 20 07 E9 GOBK0 JSR RCHEK ;SEE IF HE WANTS TO INTERRUPT0552 E27B AD 0F A4 LDA DISFLG ;DISASSEMBLE CURRENT INSTR ?0553 E27E F0 06 BEQ GOBK1 ;NO,BRANCH0554 E280 20 6C F4 JSR DISASM ;DISASM THIS INSTRUCTION0555 E283 20 13 EA JSR CRLOW0556 E286 AE 24 A4 GOBK1 LDX SAVS ;RESTORE SAVED REGS FOR RTI0557 E289 9A TXS0558 E28A AC 23 A4 LDY SAVY0559 E28D AE 22 A4 LDX SAVX0560 E290 AD 26 A4 LDA SAVPC+10561 E293 48 PHA ;PUT PC ON STACK0562 E294 AD 25 A4 LDA SAVPC0563 E297 48 PHA0564 E298 AD 20 A4 LDA SAVPS ;STATUS ALSO0565 E29B 48 PHA0566 E29C AD 21 A4 LDA SAVA0567 E29F 40 RTI ;AND AWAY WE GO...0568 E2A00569 E2A0 ;***** / COMMAND-ALTER MEMORY *****0570 E2A0 20 3E E8 CHNGG JSR BLANK0571 E2A3 20 DB E2 JSR WRITAZ ;WRITE ADDR0572 E2A6 20 3E E8 CHNG1 JSR BLANK0573 E2A9 20 5D EA JSR RD2 ;GET VALUE0574 E2AC 90 0A BCC CH2 ;ISN'T SKIP OR DONE0575 E2AE C9 20 CMP #' '0576 E2B0 D0 13 BNE CH3 ;NOT BLANK SO MUST BE DONE0577 E2B2 ;SKIP THIS LOCATION0578 E2B2 20 3E E8 JSR BLANK0579 E2B5 4C C0 E2 JMP CH40580 E2B8 ;IS ALTER0581 E2B8 20 78 EB CH2 JSR SADDR ;STORE ENTERED VALUE INTO MEMORY0582 E2BB F0 03 BEQ CH4 ;NO ERROR IN STORE0583 E2BD 4C 33 EB JMP MEMERR ;MEMORY WRITE ERROR0584 E2C0 C8 CH4 INY0585 E2C1 C0 04 CPY #40586 E2C3 D0 E1 BNE CHNG1 ;GO AGAIN0587 E2C5 ;HAVE DONE LINE OR HAVE 0588 E2C5 20 CD E2 CH3 JSR NXTADD ;UPDATE THE ADDRESS0589 E2C8 A9 0D LDA #CR ;CLEAR DISPL0590 E2CA 4C E9 FE JMP PATC10 ;ONLY ONE & BACK TO MONITOR0591 E2CD0592 E2CD 98 NXTADD TYA ;ADD Y TO ADDR+1,ADDR0593 E2CE 18 CLC0594 E2CF 6D 1C A4 ADC ADDR0595 E2D2 8D 1C A4 STA ADDR0596 E2D5 90 03 BCC NXTA10597 E2D7 EE 1D A4 INC ADDR+10598 E2DA 60 NXTA1 RTS0599 E2DB0600 E2DB ;WRITE CURRENT VALUE OF ADDR0601 E2DB ;PART OF / & SPACE COMM0602 E2DB A0 00 WRITAZ LDY #00603 E2DD B9 1D A4 WRITAD LDA ADDR+1,Y0604 E2E0 BE 1C A4 LDX ADDR,Y0605 E2E3 4C 42 EA JMP WRAX0606 E2E60607 E2E6 ;***** L COMMAND-GENERAL LOAD *****0608 E2E6 ;LOAD OBJECT FROM TTY,USER,TYPE OR TAPE IN KIM-1 FORMAT0609 E2E6 20 48 E8 LOAD JSR WHEREI ;WHERE INPUT0610 E2E9 ;GET ";" , # OF BYTES AND SA0611 E2E9 20 93 E9 LOAD1 JSR INALL ;GET FIRST CHAR0612 E2EC C9 3B CMP #SEMICOLON ;LOOK FOR BEGINNING0613 E2EE D0 F9 BNE LOAD1 ;IGNORE ALL CHARS BEFORE ";"0614 E2F0 20 4D EB JSR CLRCK ;CLEAR CHECHSUM0615 E2F3 20 4B E5 JSR CHEKAR ;READ RECORD LENGTH0616 E2F6 AA TAX ;SAVE IN X THE # BYTES0617 E2F7 20 4B E5 JSR CHEKAR ;READ UPPER HALF OF ADDRESS0618 E2FA 8D 1D A4 STA ADDR+10619 E2FD 20 4B E5 JSR CHEKAR ;READ LOWER HALF OF ADDRESS0620 E300 8D 1C A4 STA ADDR0621 E303 8A TXA0622 E304 F0 1B BEQ LOAD4 ;LAST RECORD (RECORD LENGTH=0)0623 E306 ;GET DATA0624 E306 20 FD E3 LOAD2 JSR RBYTE ;READ NEXT BYTE OF DATA0625 E309 20 13 E4 JSR STBYTE ;STORE AT LOC (ADDR+1,ADDR)0626 E30C CA DEX ;DECR RECORD LENGTH0627 E30D D0 F7 BNE LOAD20628 E30F ;COMPARE CKSUM0629 E30F 20 FD E3 JSR RBYTE ;READ UPPER HALF OF CHCKSUM0630 E312 CD 1F A4 CMP CKSUM+1 ;COMPARE TO COMPUTED VALUE0631 E315 D0 6E BNE CKERR ;CKSUM ERROR0632 E317 20 FD E3 JSR RBYTE ;READ LOWER HALF OF CHECKSUM0633 E31A CD 1E A4 CMP CKSUM0634 E31D D0 66 BNE CKERR0635 E31F F0 C8 BEQ LOAD1 ;UNTIL LAST RECORD0636 E321 A2 05 LOAD4 LDX #5 ;READ 4 MORE ZEROS0637 E323 20 FD E3 LOAD5 JSR RBYTE0638 E326 CA DEX0639 E327 D0 FA BNE LOAD50640 E329 20 93 E9 JSR INALL ;READ LAST 0641 E32C 4C 20 E5 JMP DU13 ;SET DEFAULT DEV & GO BACK0642 E32F0643 E32F ;LOAD ROUTINE FROM TAPE BY BLOCKS0644 E32F ;CHECK FOR RIGHT FILE & LOAD FIRST BLOCK0645 E32F A9 00 LOADTA LDA #$00 ;CLEAR BLOCK COUNT0646 E331 8D 15 01 STA BLK0647 E334 20 53 ED JSR TIBY1 ;LOAD BUFFER WITH A BLOCK0648 E337 CA DEX ;SET X=00649 E338 8E 15 A4 STX CURPO2 ;CLEAR DISPLAY PTR0650 E33B BD 16 01 LDA TABUFF,X ;BLK COUNT SHOULD BE ZERO0651 E33E D0 EF BNE LOADTA ;NO, READ ANOTHER BLOCK0652 E340 E8 INX0653 E341 ;AFTER FIRST BLOCK OUTPUT FILE NAME0654 E341 EE 11 A4 INC PRIFLG ;SO DO NOT GO TO PRINT.0655 E344 A0 48 LDY #TMSG0-M1 ;PRINT "F="0656 E346 20 AF E7 JSR KEP0657 E349 BD 16 01 LOAD1A LDA TABUFF,X ;OUTPUT FILE NAME0658 E34C 20 7A E9 JSR OUTPUT ;ONLY TO DISPLAY0659 E34F E8 INX0660 E350 E0 06 CPX #60661 E352 D0 F5 BNE LOAD1A0662 E354 20 3E E8 JSR BLANK0663 E357 A0 61 LDY #TMSG6-M1 ;PRINT "BLK= "0664 E359 20 AF E7 JSR KEP0665 E35C CE 11 A4 DEC PRIFLG ;RESTORE PRINTR FLG0666 E35F 20 BD ED JSR ADDBK1 ;JUST OUTPUT BLK CNT0667 E362 A2 01 LDX #1 ;RESTORE X0668 E364 ;CHECK IF FILE IS CORRECT0669 E364 BD 16 01 LOADT2 LDA TABUFF,X ;NOW CHCK FILE NAME0670 E367 DD 2D A4 CMP NAME-1,X0671 E36A D0 C3 BNE LOADTA ;IF NO FILENAME GET0672 E36C E8 INX ;ANOTHER BLOCK0673 E36D E0 06 CPX #6 ;FILENAME=5 CHRS0674 E36F D0 F3 BNE LOADT20675 E371 8E 36 A4 STX TAPTR ;SAVE TAPE BUFF PTR0676 E374 EE 11 A4 INC PRIFLG ;OUTPUT MSG ONLY TO DISPLAY0677 E377 A9 00 LDA #0 ;CLEAR DISPLAY POINTER0678 E379 8D 15 A4 STA CURPO20679 E37C A0 66 LDY #TMSG7-M1 ;PRINT "LOAD " WITHOUT CLR DISPL0680 E37E 20 96 E3 JSR CKER10681 E381 CE 11 A4 DEC PRIFLG0682 E384 60 RTS0683 E3850684 E385 ;LINE CKSUM ERROR0685 E385 20 8E E3 CKERR JSR CKER0 ;SUBR SO MNEM ENTRY CAN USE IT0686 E388 20 DB E2 JSR WRITAZ ;WRITE ADDR0687 E38B 4C A1 E1 JMP COMIN0688 E38E 20 FE E8 CKER0 JSR LL ;SET DEFAULT DEVICES0689 E391 20 24 EA JSR CRCK ;0690 E394 A0 52 CKER00 LDY #TMSG3-M1 ;PRINT "ERROR"0691 E396 B9 00 E0 CKER1 LDA M1,Y ;DONT CLR DISPLAY TO THE RIGHT0692 E399 C9 3B CMP #SEMICOLON0693 E39B F0 06 BEQ CKER20694 E39D 20 7A E9 JSR OUTPUT ;ONLY TO TERMINAL0695 E3A0 C8 INY0696 E3A1 D0 F3 BNE CKER10697 E3A3 60 CKER2 RTS0698 E3A40699 E3A4 ;LOAD ROUTINE FROM TAPE WITH KIM-1 FORMAT0700 E3A4 20 4D EB LOADKI JSR CLRCK ;CLEAR CKSUM0701 E3A7 20 EA ED LOADK1 JSR TAISET ;SET TAPE FOR INPUT0702 E3AA 20 29 EE LOADK2 JSR GETTAP ;READ CHARACTER FROM TAPE0703 E3AD C9 2A CMP #'*' ;BEGINNING OF FILE?0704 E3AF F0 06 BEQ LOADK3 ;YES,BRNCH0705 E3B1 C9 16 CMP #$16 ;IF NOT * SHOULD BE SYN0706 E3B3 D0 F2 BNE LOADK10707 E3B5 F0 F3 BEQ LOADK20708 E3B7 20 FD E3 LOADK3 JSR RBYTE ;READ ID FROM TAPE0709 E3BA 8D 21 A4 STA SAVA ;SAVE ID0710 E3BD ;NOW GET ADDR TO DISPLAY0711 E3BD ;& COMPARE ID AFTERWARDS0712 E3BD 20 4B E5 JSR CHEKAR ;GET START ADDR LOW0713 E3C0 8D 1C A4 STA ADDR0714 E3C3 20 4B E5 JSR CHEKAR ;GET START ADDR HIGH0715 E3C6 8D 1D A4 STA ADDR+10716 E3C9 20 25 E4 JSR GETID ;ID FROM HIM0717 E3CC CD 21 A4 CMP SAVA ;DO IDS MATCH?0718 E3CF D0 D3 BNE LOADKI ;NO ,GET ANOTHER FILE0719 E3D1 A2 02 LOADK5 LDX #$02 ;GET 2 CHARS0720 E3D3 20 29 EE LOADK6 JSR GETTAP ;1 CHAR FROM TAPE0721 E3D6 C9 2F CMP #'/' ;LAST CHAR ?0722 E3D8 F0 0E BEQ LOADK7 ;YES,BRNCH0723 E3DA 20 84 EA JSR PACK ;CONVERT TO HEX0724 E3DD B0 A6 BCS CKERR ;NOT HEX CHAR SO ERROR0725 E3DF CA DEX0726 E3E0 D0 F1 BNE LOADK60727 E3E2 20 13 E4 JSR STBYTE ;STORE & CHCK MEM FAIL0728 E3E5 4C D1 E3 JMP LOADK5 ;NEXT0729 E3E8 20 FD E3 LOADK7 JSR RBYTE ;END OF DATA CMP CKSUM0730 E3EB CD 1E A4 CMP CKSUM ;LOW0731 E3EE D0 95 BNE CKERR0732 E3F0 20 FD E3 JSR RBYTE0733 E3F3 CD 1F A4 CMP CKSUM+1 ;HIGH0734 E3F6 D0 8D BNE CKERR0735 E3F8 68 PLA ;CORRECT RTN INSTEAD OF WHEREI0736 E3F9 68 PLA0737 E3FA 4C 20 E5 JMP DU13 ;TELL HIM & GO BACK TO COMMAN0738 E3FD0739 E3FD ;GET 2 ASCII CHRS INTO 1 BYTE0740 E3FD ;FOR TAPE (T) GET ONLY ONE HEX CHR0741 E3FD AD 12 A4 RBYTE LDA INFLG ;INPUT DEVICE0742 E400 C9 54 CMP #'T'0743 E402 D0 03 BNE RBYT10744 E404 4C 93 E9 JMP INALL ;ONLY ONE BYTE FOR T (INPUT DEV)0745 E407 20 93 E9 RBYT1 JSR INALL0746 E40A 20 84 EA JSR PACK0747 E40D 20 93 E9 JSR INALL0748 E410 4C 84 EA JMP PACK0749 E4130750 E413 ;STORE AND CHECK MEMORY FAIL0751 E413 20 4E E5 STBYTE JSR CHEKA ;ADD TO CKSUM0752 E416 A0 00 LDY #00753 E418 20 78 EB JSR SADDR ;STORE AND CHCK0754 E41B F0 03 BEQ *+50755 E41D 4C 33 EB JMP MEMERR ;MEMORY WRITE ERROR0756 E420 A0 01 LDY #1 ;INC ADDR+1,ADDR BY 10757 E422 4C CD E2 JMP NXTADD0758 E4250759 E425 ;GET ID FROM LAST 2 CHR OF FILENAM0760 E425 A2 04 GETID LDX #4 ;SEE WHAT HE GAVE US0761 E427 BD 2E A4 GID1 LDA NAME,X ;GET LAST 2 CHARS0762 E42A CA DEX0763 E42B C9 20 CMP #' ' ; ?0764 E42D F0 F8 BEQ GID10765 E42F BD 2E A4 LDA NAME,X ;CONVERT TO BINARY0766 E432 20 84 EA JSR PACK0767 E435 BD 2F A4 LDA NAME+1,X0768 E438 4C 84 EA JMP PACK ;ID IS IN STIY0769 E43B0770 E43B ;***** D COMMAND-GENERAL DUMP *****0771 E43B ;TO TTY,PRINTR,USER,X ,TAPE,TAKIM-10772 E43B AD 10 A4 DUMP LDA BKFLG ;SAVE IT TO USE IT0773 E43E 48 PHA0774 E43F A9 00 LDA #000775 E441 8D 10 A4 STA BKFLG0776 E444 20 24 EA DU1 JSR CRCK ;0777 E447 20 A3 E7 DU0 JSR FROM ;GET START ADDR0778 E44A B0 FB BCS DU0 ;IN CASE OF ERROR DO IT AGAIN0779 E44C 20 3E E8 JSR BLANK0780 E44F 20 10 F9 JSR ADDRS1 ;TRANSFER ADDR TO S10781 E452 20 A7 E7 DU1B JSR TO ;GET END ADDR0782 E455 B0 FB BCS DU1B0783 E457 20 13 EA JSR CRLOW0784 E45A AD 10 A4 LDA BKFLG ;EXECUTE WHEREO ONLY ONCE0785 E45D D0 0E BNE DU1A0786 E45F 20 71 E8 JSR WHEREO ;WHICH DEV (OUTFLG)0787 E462 A9 00 LDA #00788 E464 8D 06 01 STA S2 ;CLEAR RECORD COUNT0789 E467 8D 07 01 STA S2+10790 E46A EE 10 A4 INC BKFLG ;SET FLG0791 E46D ;CHCK OUTPUT DEV0792 E46D AD 13 A4 DU1A LDA OUTFLG0793 E470 C9 4B CMP #'K' ;TAPE FOR KIM?0794 E472 D0 04 BNE *+60795 E474 68 PLA ;PULL FLG0796 E475 4C 87 E5 JMP DUMPKI ;YES, GO OUTPUT WHOLE FILE0797 E478 A0 01 LDY #1 ;OUTPUT ONE MORE BYTE0798 E47A 20 CD E2 JSR NXTADD0799 E47D 20 F0 E9 DU2 JSR CRLF0800 E480 20 07 E9 JSR RCHEK ;SEE IF HE WANTS TO INTERRUPT0801 E483 ;CALCULATE # OF BYTES YET TO BE DUMPED0802 E483 20 4D EB JSR CLRCK ;CLEAR CKSUM0803 E486 AD 1C A4 LDA ADDR ;END ADDRESS-CURRENT ADDRESS0804 E489 38 SEC0805 E48A ED 1A A4 SBC S10806 E48D 48 PHA ;# OF BYTES LOW0807 E48E AD 1D A4 LDA ADDR+10808 E491 ED 1B A4 SBC S1+10809 E494 D0 09 BNE DU6 ;# OF BYTES HIGH0810 E496 ;SEE IF 24 OR MORE BYTES TO GO0811 E496 68 PLA ;# BYTES HIGH WAS ZERO0812 E497 F0 42 BEQ DU10 ;ARE DONE0813 E499 C9 18 CMP #24 ;# BYTES > 24 ?0814 E49B 90 05 BCC DU8 ;NO ,ONLY OUTPUT REMAINING BYTES0815 E49D B0 01 BCS DU7 ;YES ,24 BYTES IN NEXT RECORD0816 E49F 68 DU6 PLA0817 E4A0 A9 18 DU7 LDA #240818 E4A2 ;OUTPUT ";" ,# OF BYTES AND SA0819 E4A2 48 DU8 PHA0820 E4A3 20 BA E9 JSR SEMI ;SEMICOLON0821 E4A6 68 PLA0822 E4A7 8D 19 A4 STA COUNT ;SAVE # OF BYTES0823 E4AA 20 38 E5 JSR OUTCK ;OUTPUT # OF BYTES0824 E4AD AD 1B A4 LDA S1+1 ;OUTPUT ADDRESS0825 E4B0 20 38 E5 JSR OUTCK0826 E4B3 AD 1A A4 LDA S10827 E4B6 20 38 E5 JSR OUTCK0828 E4B9 ;OUTPUT DATA0829 E4B9 20 31 E5 DU9 JSR OUTCKS ;GET CHAR SPEC BY S1 (NO PAG 0)0830 E4BC A9 00 LDA #0 ;CLEAR DISP PTR0831 E4BE 8D 15 A4 STA CURPO20832 E4C1 20 5D E5 JSR ADDS1 ;INCR S1+1,S10833 E4C4 CE 19 A4 DEC COUNT ;DECREMENT BYTE COUNT0834 E4C7 D0 F0 BNE DU9 ;NOT DONE WITH THIS RECORD0835 E4C9 ;OUTPUT CKSUM0836 E4C9 AD 1F A4 LDA CKSUM+10837 E4CC 20 3B E5 JSR OUTCK1 ;WITHOUT CHEKA0838 E4CF AD 1E A4 LDA CKSUM0839 E4D2 20 3B E5 JSR OUTCK10840 E4D5 20 66 E5 JSR INCS2 ;INC VERTICAL COUNT0841 E4D8 4C 7D E4 JMP DU2 ;NEXT RECORD0842 E4DB ;ALL DONE0843 E4DB A0 1C DU10 LDY #M5-M1 ;PRINT "MORE ?#0844 E4DD 20 70 E9 JSR KEPR ;OUTPUT MSG AND GET AN ANSWER0845 E4E0 C9 59 CMP #'Y'0846 E4E2 D0 03 BNE *+50847 E4E4 4C 44 E4 JMP DU1 ;DUMP MORE DATA0848 E4E7 68 PLA ;RESTORE FLG0849 E4E8 8D 10 A4 STA BKFLG0850 E4EB ;OUTPUT LAST RECORD0851 E4EB 20 66 E5 JSR INCS20852 E4EE 20 BA E9 JSR SEMI ;OUTPUT ';'0853 E4F1 A2 02 LDX #20854 E4F3 A9 00 LDA #0 ;OUTPUT # OF BYTES (0-LAST RECORD)0855 E4F5 20 3B E5 JSR OUTCK10856 E4F8 AD 07 01 DU10A LDA S2+1 ;OUTPUT RECORD COUNT0857 E4FB 20 3B E5 JSR OUTCK1 ;CHECKCUM IS THE SAME0858 E4FE AD 06 01 LDA S20859 E501 20 3B E5 JSR OUTCK10860 E504 CA DEX0861 E505 D0 F1 BNE DU10A0862 E507 20 F0 E9 JSR CRLF0863 E50A ;CLOSE TAPE BLOCK IF ACTIVE0864 E50A AD 13 A4 DU11 LDA OUTFLG0865 E50D C9 54 CMP #'T'0866 E50F D0 0F BNE DU13 ;NO ,BRANCH0867 E511 AD 37 A4 DU12 LDA TAPTR2 ;TAP OUTPUT BUFF PTR0868 E514 C9 01 CMP #1 ;BECAUSE FIRST ONE IS BLK CNT0869 E516 F0 08 BEQ DU13 ;NO DATA TO WRITE0870 E518 A9 00 LDA #0 ;FILL REST BUFF ZEROS0871 E51A 20 8B F1 JSR TOBYTE ;OUTPUT TO BUFF0872 E51D 4C 11 E5 JMP DU12 ;FINISH THIS BLOCK0873 E520 20 13 EA DU13 JSR CRLOW0874 E523 18 CLC ;ENABLE INTERR0875 E524 A9 00 LDA #T1I ;T1 FROM FREE RUNNING TO 1 SHOT0876 E526 8D 0B A8 STA ACR0877 E529 A9 34 DU14 LDA #$34 ;SET BOTH TAPES ON0878 E52B 8D 00 A8 STA DRB0879 E52E 4C FE E8 JMP LL0880 E5310881 E531 ;GET CHAR SPECIFIED BY START ADDR (S1)0882 E531 A9 1A OUTCKS LDA #S10883 E533 A0 00 LDY #00884 E535 20 58 EB JSR LDAY0885 E5380886 E538 ;ADD TO CHECKSUM AND PRINT0887 E538 20 4E E5 OUTCK JSR CHEKA ;CHCKSUM0888 E53B 48 OUTCK1 PHA0889 E53C AD 13 A4 LDA OUTFLG ;IF TAPE DO NOT CNVRT0890 E53F C9 54 CMP #'T' ;TO TWO ASCII CHRS0891 E541 D0 04 BNE OUTCK20892 E543 68 PLA0893 E544 4C 8B F1 JMP TOBYTE ;OUTPUT TO TAP BUFF0894 E547 68 OUTCK2 PLA0895 E548 4C 46 EA JMP NUMA ;TWO ASCII REPRE0896 E54B0897 E54B 20 FD E3 CHEKAR JSR RBYTE ;TWO ASCII CHR---> 1 BYTE0898 E54E 48 CHEKA PHA ;ADD TO CHECKSUM0899 E54F 18 CLC0900 E550 6D 1E A4 ADC CKSUM0901 E553 8D 1E A4 STA CKSUM0902 E556 90 03 BCC *+50903 E558 EE 1F A4 INC CKSUM+10904 E55B 68 PLA0905 E55C 60 RTS0906 E55D0907 E55D ;ADD ONE TO START ADDR (S1)0908 E55D EE 1A A4 ADDS1 INC S10909 E560 D0 03 BNE ADD10910 E562 EE 1B A4 INC S1+10911 E565 60 ADD1 RTS0912 E5660913 E566 EE 06 01 INCS2 INC S2 ;INCR VERTICAL COUNT0914 E569 D0 03 BNE *+50915 E56B EE 07 01 INC S2+10916 E56E 60 RTS0917 E56F0918 E56F ;OPEN A FILE FOR OUTPUT TO TAPE BY BLOCKS0919 E56F ;OUTPUT FILENAME GIVEN BY JSR WHEREO TO TAPE BUFF0920 E56F A2 00 DUMPTA LDX #0 ;INITIALIZE TAPTR0921 E571 8A TXA ;TO OUTPUT0922 E572 8E 68 01 STX BLKO ;BLOCK COUNTER0923 E575 8E 37 A4 STX TAPTR2 ;TAP OUTPUT BUFF PTR0924 E578 20 8B F1 JSR TOBYTE ;TWO START OF FILE CHRS0925 E57B BD 2E A4 DUMPT1 LDA NAME,X ;OUTPUT FILENAME0926 E57E 20 8B F1 JSR TOBYTE0927 E581 E8 INX0928 E582 E0 05 CPX #50929 E584 D0 F5 BNE DUMPT1 ;5 FILENAME CHRS ?0930 E586 60 RTS0931 E5870932 E587 ;DUMP ROUTINE TO TAPE WITH KIM-1 FORMAT0933 E587 20 1D F2 DUMPKI JSR TAOSET ;SET TAPE FOR OUTPUT0934 E58A A9 2A LDA #'*' ;TO EITHER 1 OR 20935 E58C 20 4A F2 JSR OUTTAP ;DIRECTLY TO TAPE0936 E58F ;ID FROM LAST 2 CHRS OF FILENAME0937 E58F 20 25 E4 JSR GETID0938 E592 20 3B E5 JSR OUTCK10939 E595 20 4D EB JSR CLRCK0940 E598 ;STARTING ADDR0941 E598 AD 1A A4 LDA S10942 E59B 20 38 E5 JSR OUTCK ;WITH CHCKSUM0943 E59E AD 1B A4 LDA S1+10944 E5A1 20 38 E5 JSR OUTCK0945 E5A4 ;OUTPUT DATA0946 E5A4 20 31 E5 DUK2 JSR OUTCKS ;OUTPUT CHR SPECIFIED BY S1+1,S10947 E5A7 20 5D E5 JSR ADDS1 ;INCREM S1+1,S10948 E5AA AD 1A A4 LDA S1 ;CHCK FOR LAST BYTE0949 E5AD CD 1C A4 CMP ADDR ;LSB OF END ADDR0950 E5B0 AD 1B A4 LDA S1+10951 E5B3 ED 1D A4 SBC ADDR+10952 E5B6 90 EC BCC DUK2 ;NEXT CHR0953 E5B8 ;NOW SEND END CHR "/"0954 E5B8 A9 2F LDA #'/'0955 E5BA 20 4A F2 JSR OUTTAP ;DIRECTLY TO TAPE0956 E5BD ;CHECKSUM0957 E5BD AD 1E A4 LDA CKSUM0958 E5C0 20 46 EA JSR NUMA ;ASCII REPRES0959 E5C3 AD 1F A4 LDA CKSUM+10960 E5C6 20 46 EA JSR NUMA0961 E5C9 ;TWO EOT CHRS0962 E5C9 A9 04 LDA #$040963 E5CB 20 4A F2 JSR OUTTAP0964 E5CE 20 4A F2 JSR OUTTAP0965 E5D1 ;TURN TAPES ON0966 E5D1 4C 20 E5 JMP DU130967 E5D40968 E5D4 ;***** * COMMAND-ALTER PROGRAM COUNTER *****0969 E5D4 20 AE EA CGPC JSR ADDIN ;ADDR <=ADDRESS ENTERED FROM KB0970 E5D7 20 DD E5 CGPC0 JSR CGPC1 ;TRANSFER ADDR TO SAVPC0971 E5DA 4C 13 EA JMP CRLOW0972 E5DD AD 1D A4 CGPC1 LDA ADDR+1 ;THIS WAY MNEMONICS CAN USE IT0973 E5E0 8D 26 A4 STA SAVPC+10974 E5E3 AD 1C A4 LDA ADDR0975 E5E6 8D 25 A4 STA SAVPC0976 E5E9 60 RTS0977 E5EA0978 E5EA ;***** P COMMAND-ALTER PROCESSOR STATUS *****0979 E5EA A2 00 CGPS LDX #00980 E5EC F0 0E BEQ CGALL0981 E5EE0982 E5EE ;***** A COMMAND-ALTER ACCUMULATOR *****0983 E5EE A2 01 CGA LDX #10984 E5F0 D0 0A BNE CGALL0985 E5F20986 E5F2 ;***** X COMMAND-ALTER X REGISTER *****0987 E5F2 A2 02 CGX LDX #20988 E5F4 D0 06 BNE CGALL0989 E5F60990 E5F6 ;***** Y COMMAND-ALTER Y REGISTER *****0991 E5F6 A2 03 CGY LDX #30992 E5F8 D0 02 BNE CGALL0993 E5FA0994 E5FA ;***** S COMMAND-ALTER STACK POINTER *****0995 E5FA A2 04 CGS LDX #40996 E5FC 20 D8 E7 CGALL JSR EQUAL ;PRINT PROMPT0997 E5FF 20 5D EA JSR RD2 ;GET VALUE FROM KEYBOARD0998 E602 B0 04 BCS GOERR0999 E604 9D 20 A4 STA SAVPS,X1000 E607 60 RTS1001 E608 20 D4 E7 GOERR JSR QM1002 E60B D0 EF BNE CGALL1003 E60D1004 E60D ;***** COMMAND-SHOW NEXT 5 MEMORY LOC *****1005 E60D 20 3E E8 NXT5 JSR BLANK1006 E610 A0 04 LDY #4 ;UPDATE ADDR FROM1007 E612 20 CD E2 JSR NXTADD ;=XXXX1008 E615 20 DB E2 JSR WRITAZ ;OUTPUT ADDRESS1009 E618 4C 4D E2 JMP MEIN ;DISPLAY CONTENTS OF NEXT 4 LOCS1010 E61B1011 E61B ;***** B COMMAND-SET BREAKPOINT ADDR *****1012 E61B A0 27 BRKA LDY #M8-M1 ;PRINT "BRK"1013 E61D 20 AF E7 JSR KEP1014 E620 20 37 E8 BRK1 JSR PSL1 ;PRINT "/"1015 E623 20 73 E9 JSR REDOUT ;GET BREAK NUMBER1016 E626 38 SEC1017 E627 E9 30 SBC #'0' ;0 THRU 31018 E629 30 04 BMI BKERR ;CHARACTER < '0' -ILLEGAL1019 E62B C9 04 CMP #4 ;FOUR BRK POINTS1020 E62D 30 05 BMI BKOK ;0 < CHARACTER < 4 -OK1021 E62F 20 D4 E7 BKERR JSR QM ;ERROR1022 E632 D0 EC BNE BRK1 ;ALLOW REENTRY OF BREAK NUMBER1023 E634 0A BKOK ASL A ;*2 TO FORM WORD OFFSET1024 E635 48 PHA ;SAVE IT1025 E636 20 AE EA JSR ADDIN ;GET ADDRESS FOR BREAKPOINT1026 E639 68 PLA1027 E63A B0 10 BCS BKO2 ;BAD ADDRESS ENTERED1028 E63C 20 3D FF JSR PATC18 ; & CLR BUFFERS1029 E63F AA TAX ;# OF BRK1030 E640 AD 1C A4 LDA ADDR ;STORE ENTERED ADDR IN BRKPT LIST1031 E643 9D 00 01 STA BKS,X1032 E646 AD 1D A4 LDA ADDR+11033 E649 9D 01 01 STA BKS+1,X1034 E64C 60 BKO2 RTS ;ALL DONE1035 E64D1036 E64D ;***** ? COMMAND-SHOW CURRENT BREAKPOINTS *****1037 E64D A0 00 SHOW LDY #01038 E64F 20 13 EA JSR CRLOW1039 E652 20 3E E8 SH1 JSR BLANK1040 E655 BE 00 01 LDX BKS,Y ;ADDRESS OF NEXT BREAKPOINT1041 E658 B9 01 01 LDA BKS+1,Y1042 E65B 20 42 EA JSR WRAX ;SHOW BREAKPOINT ADDRESS1043 E65E C8 INY1044 E65F C8 INY1045 E660 C0 08 CPY #81046 E662 D0 EE BNE SH11047 E664 60 RTS1048 E6651049 E665 ;***** H COMMAND-SHOW TRACE STACK HISTORY *****1050 E665 ;LAST FIVE INSTR ADDRS1051 E665 A2 05 SHIS LDX #5 ;NUMBER OF ENTRIES1052 E667 8E 29 A4 STX STIY+21053 E66A AC 14 A4 SH11 LDY HISTP ;POINTER TO LATEST ENTRY1054 E66D 20 13 EA JSR CRLOW1055 E670 20 3E E8 JSR BLANK1056 E673 B9 2E A4 LDA HIST,Y ;OUTPUT ADDRESS OF ENTRY1057 E676 20 46 EA JSR NUMA1058 E679 B9 2F A4 LDA HIST+1,Y1059 E67C 20 46 EA JSR NUMA1060 E67F 20 88 E6 JSR NHIS ;UPDATE POINTER1061 E682 CE 29 A4 DEC STIY+21062 E685 D0 E3 BNE SH111063 E687 60 RTS1064 E6881065 E688 ;UPDATE HISTORY POINTER (PART OF H)1066 E688 C8 NHIS INY1067 E689 C8 INY1068 E68A C0 0A CPY #101069 E68C D0 02 BNE NH11070 E68E A0 00 LDY #0 ;WRAPAROUND AT 101071 E690 8C 14 A4 NH1 STY HISTP1072 E693 60 RTS1073 E6941074 E694 ;***** 3 COMMAND-VERIFY TAPES *****1075 E694 ;VERIFY CKSUM OF BLOCKS1076 E694 20 48 E8 VECKSM JSR WHEREI ;GET THE FILE1077 E697 20 93 E9 JSR INALL ;CHCK OBJ OR SOURCE1078 E69A C9 0D CMP #CR ;FIRST CHR IS IF OBJ1079 E69C D0 0E BNE VECK2 ;ASSUME SOURCE CODE1080 E69E 20 93 E9 VECK1 JSR INALL ;OBJECT FILE1081 E6A1 C9 3B CMP #SEMICOLON1082 E6A3 D0 F9 BNE VECK1 ;IGNORE ALL CHARS BEFORE ';'1083 E6A5 20 93 E9 JSR INALL1084 E6A8 4C 60 FF JMP PAT201085 E6AB EA NOP1086 E6AC 20 93 E9 VECK2 JSR INALL ;IT IS TEXT1087 E6AF C9 0D CMP #CR1088 E6B1 D0 F9 BNE VECK21089 E6B3 20 93 E9 JSR INALL ;NEED TO TO FINISH1090 E6B6 C9 0D CMP #CR1091 E6B8 D0 F2 BNE VECK21092 E6BA 4C 20 E5 JMP DU13 ;CLOSE FILE, IT IS OKAY1093 E6BD1094 E6BD ;***** 1 COMMAND-TOGGLE TAPE 1 CONTROL *****1095 E6BD AD 00 A8 TOGTA1 LDA DRB1096 E6C0 49 10 EOR #$10 ;INVERT PB41097 E6C2 8D 00 A8 STA DRB1098 E6C5 29 10 AND #$101099 E6C7 F0 28 BEQ BRK3 ;IF 0 TAPE CNTRL IS ON1100 E6C9 D0 2F BNE BRK4 ;IF $10 TAPE CNTRL IS OFF1101 E6CB1102 E6CB ;***** 2 COMMAND-TOGGLE TAPE 2 CONTROL *****1103 E6CB AD 00 A8 TOGTA2 LDA DRB1104 E6CE 49 20 EOR #$20 ;INVERT PB51105 E6D0 8D 00 A8 STA DRB1106 E6D3 29 20 AND #$201107 E6D5 F0 1A BEQ BRK31108 E6D7 D0 21 BNE BRK41109 E6D91110 E6D9 ;***** V COMMAND-TOGGLE REGISTER DISP FLG *****1111 E6D9 ;DISPLAY REGIST BEFORE EXEC1112 E6D9 A2 0E REGT LDX #REGF1113 E6DB D0 0A BNE TOGL1114 E6DD1115 E6DD ;****** Z COMMAND-TOGGLE DIS TRACE FLG *****1116 E6DD ;DISPL NEXT INSTR BEFORE EXEC1117 E6DD A2 0F TRACE LDX #DISFLG1118 E6DF D0 06 BNE TOGL1119 E6E11120 E6E1 ;***** \ COMMAND-TOGGLE PRINTER FLAG *****1121 E6E1 A2 11 PRITR LDX #PRIFLG1122 E6E3 D0 02 BNE TOGL1123 E6E51124 E6E5 ;***** 4 COMMAND-TOGGLE SOFT BRK ENABL FLG *****1125 E6E5 A2 10 BRKK LDX #BKFLG1126 E6E71127 E6E7 BD 00 A4 TOGL LDA MONRAM,X ;LOAD FLAG1128 E6EA F0 0A BEQ TOGL1 ;FLAG IS OFF ,SO TURN ON1129 E6EC A9 00 LDA #0 ;FLAG IS ON ,SO TURN OFF1130 E6EE 9D 00 A4 STA MONRAM,X1131 E6F1 A0 24 BRK3 LDY #M7-M1 ;PRINT "OFF"1132 E6F3 4C AF E7 BRK2 JMP KEP1133 E6F6 38 TOGL1 SEC ;TURN FLAG ON BY SETTING NON-ZERO1134 E6F7 7E 00 A4 ROR MONRAM,X ;FLAG IS ON MSB1135 E6FA A0 21 BRK4 LDY #M6-M1 ;PRINT "ON"1136 E6FC D0 F5 BNE BRK21137 E6FE1138 E6FE ;***** # COMMAND-CLEAR ALL BREAKS *****1139 E6FE A9 00 CLRBK LDA #0 ;STORE ZEROS INTO BRKPT LIST1140 E700 A2 07 LDX #71141 E702 9D 00 01 RS20 STA BKS,X1142 E705 CA DEX1143 E706 10 FA BPL RS201144 E708 30 E7 BMI BRK3 ;PRINT "OFF"1145 E70A1146 E70A ;***** K COMMAND-DISASSEMBLE MEMORY *****1147 E70A A9 2A KDISA LDA #'*' ;GET START ADDRESS1148 E70C 20 7A E9 JSR OUTPUT1149 E70F 20 AE EA JSR ADDIN1150 E712 B0 F6 BCS KDISA ;IF ERROR DO IT AGAIN1151 E714 20 D7 E5 JSR CGPC0 ;GET IT INTO PROG CNTR1152 E717 20 37 E8 JSR PSL1 ;PRINT "/"1153 E71A 20 85 E7 JSR GCNT ;GET COUNT1154 E71D 20 24 EA JSR CRCK1155 E720 4C 2B E7 JMP JD21156 E723 20 07 E9 JD1 JSR RCHEK ;SEE IF HE WANTS TO INTERRUPT1157 E726 20 90 E7 JSR DONE1158 E729 F0 17 BEQ JD41159 E72B 20 6C F4 JD2 JSR DISASM ;GO TO DISASSEMBLER1160 E72E AD 25 A4 LDA SAVPC ;POINT TO NEXT INSTRUC LOCAT1161 E731 38 SEC ;ONE MORE TO PROG CNTR1162 E732 65 EA ADC LENGTH1163 E734 8D 25 A4 STA SAVPC1164 E737 90 03 BCC JD31165 E739 EE 26 A4 INC SAVPC+11166 E73C 20 24 EA JD3 JSR CRCK ;1167 E73F 4C 23 E7 JMP JD11168 E742 60 JD4 RTS1169 E7431170 E743 ;INITIALIZATION TABLE FOR 65221171 E743 340037FF25FFINTAB1 .DB $34,$00,$37,$FF,$25,$FF,$25,$FF1171 E749 25FF1172 E74B FF FF 00 00 .DB $FF,$FF,$00,T1I+T2I1173 E74F E1 FF 7F .DB MOFF+PRST+SP12,$FF,$7F1174 E752 ;INITIALIZATION TABLE FOR 65321175 E752 FF FF 00 00 INTAB2 .DB $FF,$FF,$00,$001176 E756 ;INITIALIZATION TABLE FOR MONITOR RAM1177 E756 7BE054E105EFINTAB3 .DW NMIV3,IRQV3,OUTDIS1178 E75C C70802CA0380 .DB $C7,$08,$02,$CA,$03,$80,$00,$001178 E762 00001179 E764 00800D0D0000 .DB $00,$80,$0D,$0D,$00,$00,$001179 E76A 001180 E76B ;SEE IF WE HIT A SOFT BREAKPOINT (PART OF NMV3)1181 E76B A2 07 CKB LDX #7 ;COMPARE BRKPT LIST TO TRAP ADDR1182 E76D BD 00 01 CKB2 LDA BKS,X ;GET ADDRESS OF NEXT BREAKPOINT1183 E770 CA DEX1184 E771 CD 26 A4 CMP SAVPC+1 ;COMPARE TO SAVED PROGRAM COUNTER1185 E774 D0 0A BNE CKB11186 E776 BD 00 01 LDA BKS,X1187 E779 CD 25 A4 CMP SAVPC1188 E77C D0 02 BNE CKB1 ;NO MATCH SO TRY NEXT BREAKPOINT1189 E77E 38 SEC ;MATCH-SET MATCH FLAG1190 E77F 60 RTS1191 E780 CA CKB1 DEX1192 E781 10 EA BPL CKB2 ;MORE TO GO1193 E783 18 CLC ;NO MATCH -RESET MATCH FLAG1194 E784 60 RTS1195 E7851196 E785 ;GET # OF LINES COUNT FOR GO-COMMAND,LIST-COMM1197 E785 20 5D EA GCNT JSR RD21198 E788 90 02 BCC GCN11199 E78A 49 0C EOR #$0C ;---> $2C ,---> $011200 E78C 8D 19 A4 GCN1 STA COUNT1201 E78F 60 RTS1202 E7901203 E790 ;CHECK IF COUNT HAS REACHED ZERO1204 E790 ;COUNT=$2C MEANS FOREVER1205 E790 AD 19 A4 DONE LDA COUNT ;IF COUNT=0 WE ARE DONE1206 E793 C9 2C CMP #$2C ;THIS MEANS FOR EVER1207 E795 F0 09 BEQ DON1 ;SET ACC DIFF FROM ZERO1208 E797 F8 SED ;DECREMENT COUNT IN DECIMAL1209 E798 38 SEC1210 E799 E9 01 SBC #11211 E79B D8 CLD1212 E79C 8D 19 A4 STA COUNT1213 E79F 60 RTS1214 E7A0 A9 2C DON1 LDA #$2C1215 E7A2 60 RTS1216 E7A31217 E7A3 A0 00 FROM LDY #0 ;PRINT "FR="1218 E7A5 F0 02 BEQ TO11219 E7A71220 E7A7 A0 05 TO LDY #M3-M1 ;PRINT "TO="1221 E7A9 20 AF E7 TO1 JSR KEP1222 E7AC 4C B1 EA JMP ADDNE ;GET ADDRESS1223 E7AF1224 E7AF ;PRINT MSG POINTED TO BY Y REG1225 E7AF B9 00 E0 KEP LDA M1,Y1226 E7B2 48 PHA1227 E7B3 29 7F AND #$7F ;STRIP OFF MSB1228 E7B5 20 7A E9 JSR OUTPUT1229 E7B8 C8 INY1230 E7B9 68 PLA1231 E7BA 10 F3 BPL KEP ;MSB =1 ?1232 E7BC 60 RTS1233 E7BD1234 E7BD ;PRINT "*" ,BUT NOT TO TAPE RECORDER, NOR LOADING....1235 E7BD ;PAPER TAPE OR TO DISPLAY1236 E7BD AD 12 A4 PROMPT LDA INFLG ;WHICH DEV (FOR EDITOR)1237 E7C0 C9 54 CMP #'T' ;NO PROMPT IF "T" OR "L"1238 E7C2 4C EF FE JMP PATC111239 E7C5 20 42 E8 PROMP1 JSR TTYTST ;PROMPT ONLY TO TTY1240 E7C8 D0 05 BNE PR2 ;BRANCH ON KB1241 E7CA A9 2A LDA #'*'1242 E7CC 4C 7A E9 PR1 JMP OUTPUT ;ONLY TO TERMIN1243 E7CF A9 0D PR2 LDA #CR ;CLR DISP1244 E7D1 4C 05 EF JMP OUTDIS1245 E7D41246 E7D4 A9 3F QM LDA #'?' ;PRINT "?"1247 E7D6 D0 F4 BNE PR11248 E7D81249 E7D8 A9 3D EQUAL LDA #'=' ;PRINT "="1250 E7DA D0 F0 BNE PR11251 E7DC1252 E7DC ;ON DELETE KEY OUTPUT SLASH IF TTY & ....1253 E7DC ;BACK UP CURSOR IF KB (MAY NEED SCROLLING)1254 E7DC 20 42 E8 PSLS JSR TTYTST ;TTY OR KB ?1255 E7DF F0 56 BEQ PSL1 ;BRANCH ON TTY1256 E7E1 20 9E EB JSR PHXY ;SAVE X,Y1257 E7E4 CE 15 A4 DEC CURPO2 ;DECR DISP PNTR1258 E7E7 AE 15 A4 LDX CURPO21259 E7EA E0 14 CPX #20 ;IF MORE THAN 20 JUST SCROLL THEM1260 E7EC B0 0D BCS PSL01261 E7EE A9 20 LDA #' ' ;< 20 ,SO CLR CUR1262 E7F0 20 02 EF JSR OUTDP11263 E7F3 CE 15 A4 DEC CURPO21264 E7F6 4C 02 E8 JMP PSL001265 E7F9 EA NOP1266 E7FA EA NOP1267 E7FB 20 F8 FE PSL0 JSR PATC12 ;CLR PRIFLG1268 E7FE CA DEX ;ONE CHR LESS1269 E7FF 20 2F EF JSR OUTD2A ;SCROLL THEM1270 E802 AD 15 A4 PSL00 LDA CURPO2 ;DISBUF---> PRIBUFF1271 E805 C9 15 CMP #211272 E807 90 13 BCC PSL0B1273 E809 C9 29 CMP #411274 E80B 90 07 BCC PSL0A1275 E80D A0 28 LDY #40 ;CHR 40-591276 E80F E9 28 SBC #401277 E811 4C 1E E8 JMP PSL0C1278 E814 A0 14 PSL0A LDY #20 ;CHR 20-391279 E816 38 SEC1280 E817 E9 14 SBC #201281 E819 4C 1E E8 JMP PSL0C1282 E81C A0 00 PSL0B LDY #0 ;CHR 00-191283 E81E 8D 16 A4 PSL0C STA CURPOS1284 E821 A2 00 LDX #01285 E823 B9 38 A4 PSL0D LDA DIBUFF,Y ;TRANSFER THEM1286 E826 9D 60 A4 STA IBUFM,X1287 E829 E8 INX1288 E82A C8 INY1289 E82B EC 16 A4 CPX CURPOS ;PRI PNTR1290 E82E 90 F3 BCC PSL0D1291 E830 20 38 F0 JSR OUTPR ;CLR PRI BUFF TO THE RIGHT1292 E833 20 AC EB JSR PLXY ;RESTORE X,Y1293 E836 60 RTS1294 E837 A9 2F PSL1 LDA #'/' ;PRINT "/"1295 E839 D0 91 BNE PR11296 E83B1297 E83B 20 3E E8 BLANK2 JSR BLANK ;TWO SPACES1298 E83E A9 20 BLANK LDA #' '1299 E840 D0 8A BNE PR11300 E8421301 E842 ;CHECK TTY/KBD SWITCH (Z=1 FOR TTY)1302 E842 A9 08 TTYTST LDA #$08 ;CHECK IF TTY OR KB1303 E844 2C 00 A8 BIT DRB ;TTY OR KB SWICTH =PB31304 E847 60 RTS1305 E8481306 E848 ;WHERE IS INPUT COMING FROM?1307 E848 ;SET UP FOR INPUT ACTIVE DEVICE1308 E848 A0 2A WHEREI LDY #M9-M1 ;PRINT "IN"1309 E84A 20 70 E9 JSR KEPR ;OUTPUT MSG AND INPUT CHR1310 E84D 8D 12 A4 STA INFLG1311 E850 C9 54 CMP #'T'1312 E852 D0 08 BNE WHE11313 E854 A2 00 LDX #0 ;FOR INPUT FILE FLG1314 E856 20 A2 E8 JSR FNAM ;OPEN FILE FOR TAPE (1 OR 2)1315 E859 4C 2F E3 JMP LOADTA ;GET FILE1316 E85C C9 4B WHE1 CMP #'K' ;TAPE WITH KIM FORMAT1317 E85E D0 08 BNE WHE21318 E860 A2 00 LDX #0 ;FOR INPUT FILE FLG1319 E862 20 A2 E8 JSR FNAM ;OPEN FILE FOR TAP (1 OR 2)1320 E865 4C A4 E3 JMP LOADKI ;THE WHOLE FILE1321 E868 C9 55 WHE2 CMP #'U' ;USER RTN?1322 E86A D0 04 BNE WHE31323 E86C 18 CLC ;SET FLG FOR INITIALIZATION1324 E86D 6C 08 01 JMP (UIN) ;USER INPUT SETUP1325 E870 60 WHE3 RTS1326 E8711327 E871 ;WHERE IS OUTPUT GOING TO?1328 E871 ;SET UP FOR OUTPUT ACTIVE DEVICE1329 E871 A0 2D WHEREO LDY #M10-M1 ;PRINT "OUT"1330 E873 20 70 E9 JSR KEPR ;OUTPUT MSG & INPUT CHR1331 E876 8D 13 A4 STA OUTFLG ;DEVICE FLG1332 E879 ;TAPES1333 E879 C9 54 CMP #'T'1334 E87B D0 08 BNE WHRO11335 E87D A2 01 LDX #1 ;FOR OUTPUT FILE FLG1336 E87F 20 A2 E8 JSR FNAM ;FILENAME & TAPE (1 OR 2)1337 E882 4C 6F E5 JMP DUMPTA ;INITIALIZE FILE1338 E885 C9 4B WHRO1 CMP #'K' ;TAPE WITH KIM FORMAT1339 E887 D0 05 BNE WHRO21340 E889 A2 01 LDX #1 ;FOR OUTPUT FILE FLG1341 E88B 4C A2 E8 JMP FNAM1342 E88E ;PRINTER1343 E88E C9 50 WHRO2 CMP #'P' ;PRINTER?1344 E890 D0 05 BNE WHRO31345 E892 A9 0D LDA #CR ;OUTPUT LAST LINE IF ON1346 E894 4C 00 F0 JMP OUTPRI ;& CLEAR PRINTER PTR1347 E897 ;USER SET UP1348 E897 C9 55 WHRO3 CMP #'U' ;USR RTN?1349 E899 D0 04 BNE WHRO41350 E89B 18 CLC ;CLR FLG FOR INITIALIZATION1351 E89C 6C 0A 01 JMP (UOUT) ;USER OUTPUT SETUP1352 E89F ;ANY OTHER1353 E89F 4C 13 EA WHRO4 JMP CRLOW1354 E8A21355 E8A2 ;GET FILE NAME & TAPE UNIT1356 E8A2 20 9E EB FNAM JSR PHXY ;SAVE IN/OUT FLG (X)1357 E8A5 20 CF E8 JSR NAMO ;GET NAME1358 E8A8 A0 50 WHICHT LDY #TMSG2-M1 ;PRINT "T="1359 E8AA 20 70 E9 JSR KEPR ;OUTPUT MSG & INPUT CHR1360 E8AD C9 0D CMP #CR1361 E8AF D0 02 BNE TAP11362 E8B1 A9 31 LDA #'1' ; ==> TAPE 11363 E8B3 38 TAP1 SEC1364 E8B4 E9 31 SBC #'1' ;SUBTRACT 311365 E8B6 30 04 BMI TAP2 ;ONLY 1,2 OK1366 E8B8 C9 02 CMP #21367 E8BA 30 06 BMI TAP3 ;OK1368 E8BC 20 D4 E7 TAP2 JSR QM ;ERROR1369 E8BF 4C A8 E8 JMP WHICHT1370 E8C2 20 AC EB TAP3 JSR PLXY ;IN/OUT FLG1371 E8C5 9D 34 A4 STA TAPIN,X ;IF X=0 --> TAPIN (TAPE 1 OR 2)1372 E8C8 20 83 FE JSR CUREAD ;GET ANYTHING1373 E8CB 20 24 EA JSR CRCK ;1374 E8CE 60 RTS ;IF X=1 --> TAPOUT (TAPE 1 OR 2)1375 E8CF1376 E8CF ;GET FILE NAME1377 E8CF A0 4D NAMO LDY #TMSG1-M1 ;PRINT "F="1378 E8D1 20 AF E7 JSR KEP ;NO CRLF1379 E8D4 A0 00 LDY #01380 E8D6 20 5F E9 NAMO1 JSR RDRUP ;GET CHAR1381 E8D9 C9 0D CMP #CR ;DONE?1382 E8DB F0 0C BEQ NAMO21383 E8DD C9 20 CMP #' '1384 E8DF F0 08 BEQ NAMO21385 E8E1 99 2E A4 STA NAME,Y ;STORE1386 E8E4 C8 INY1387 E8E5 C0 05 CPY #51388 E8E7 D0 ED BNE NAMO11389 E8E9 ;BLANK REST OF NAME1390 E8E9 A9 20 NAMO2 LDA #' '1391 E8EB C0 05 NAMO3 CPY #51392 E8ED F0 06 BEQ NAMO41393 E8EF 99 2E A4 STA NAME,Y1394 E8F2 C8 INY1395 E8F3 D0 F6 BNE NAMO31396 E8F5 4C 3E E8 NAMO4 JMP BLANK1397 E8F81398 E8F8 ;SET INPUT FROM TERMINAL (KB OR TTY)1399 E8F8 A9 0D INLOW LDA #CR1400 E8FA 8D 12 A4 STA INFLG1401 E8FD 60 RTS1402 E8FE1403 E8FE ;SET I/O TO TERMINAL (KB & D/P ,OR TTY)1404 E8FE 20 F8 E8 LL JSR INLOW1405 E9011406 E901 ;SET OUTPUT TO TERMINAL (D/P OR TTY)1407 E901 A9 0D OUTLOW LDA #CR1408 E903 8D 13 A4 STA OUTFLG1409 E906 60 OUTL1 RTS1410 E9071411 E907 ;ON STOPS EXECUTION & BACK TO MONITOR1412 E907 ;ON STOPS EXECUTION & CONTINUE ON ANY OTHER KEY1413 E907 20 42 E8 RCHEK JSR TTYTST ;TTY OR KB ?1414 E90A F0 1A BEQ RCHTTY1415 E90C 20 EF EC JSR ROONEK ;CLR MSK & GET A KEY1416 E90F 88 DEY1417 E910 30 13 BMI RCH3 ;RTN ON NO KEY1418 E912 A2 00 LDX #01419 E914 20 82 EC JSR GETK2 ;GET THE KEY1420 E917 C9 1B CMP #ESCAPE1421 E919 F0 3B BEQ REA1 ;TO COMMAN & SET I/O TO TERMINAL1422 E91B C9 20 CMP #' ' ;WAIT KEY1423 E91D D0 06 BNE RCH3 ;RTN, IGNORE OTHER KEYS1424 E91F 20 EF EC RCH2 JSR ROONEK ;WAIT TILL HE RELEASE IT &1425 E922 88 DEY ;QUIT WAITING ON NEXT KEY1426 E923 30 FA BMI RCH21427 E925 60 RCH3 RTS1428 E926 70 13 RCHTTY BVS RCHT1 ;TTI=PB6 ---> V (OVERFL FLG)1429 E928 2C 00 A8 RCHT2 BIT DRB ;WAIT TILL HE RELEASE IT1430 E92B 50 FB BVC RCHT21431 E92D 20 0F EC JSR DELAY1432 E930 20 DB EB JSR GETTTY ;GET A CHAR1433 E933 C9 1B CMP #ESCAPE1434 E935 F0 1F BEQ REA1 ;TO COMMAN1435 E937 C9 20 CMP #' '1436 E939 D0 ED BNE RCHT21437 E93B 60 RCHT1 RTS ;QUIT WAITING ON ANY KEY1438 E93C1439 E93C ;READ ONE CHAR FROM KB/TTY & PRESERVE X,Y1440 E93C 20 9E EB READ JSR PHXY ;PUSH X & Y1441 E93F 20 42 E8 JSR TTYTST ;TTY OR KB ?1442 E942 D0 06 BNE READ11443 E944 20 DB EB JSR GETTTY1444 E947 4C 4D E9 JMP READ21445 E94A 20 40 EC READ1 JSR GETKEY1446 E94D 20 AC EB READ2 JSR PLXY ;PULL X & Y1447 E950 29 7F AND #$7F ;STRIP PARITY1448 E952 C9 1B CMP #ESCAPE1449 E954 D0 E5 BNE RCHT1 ;RTN1450 E956 20 3D FF REA1 JSR PATC18 ; & CLR BUFFERS1451 E959 4C A1 E1 JMP COMIN ;BOTH I/O TO TERMINAL1452 E95C1453 E95C ;READ WITH RUBOUT OR DELETE POSSIBLE1454 E95C 20 DC E7 RB2 JSR PSLS ;SLASH OR BACK SPACE1455 E95F 20 83 FE RDRUP JSR CUREAD1456 E962 C9 08 CMP #RUB ;RUBOUT1457 E964 F0 04 BEQ RDR11458 E966 C9 7F CMP #$7F ;ALSO DELETE1459 E968 D0 0C BNE RED2 ;ECHO IF NOT 1460 E96A ;RUBOUT TO DELETE CHAR1461 E96A 88 RDR1 DEY1462 E96B 10 EF BPL RB21463 E96D C8 INY1464 E96E F0 EF BEQ RDRUP1465 E9701466 E970 ;OUTPUT MESSAGE THEN INPUT CHR1467 E970 20 AF E7 KEPR JSR KEP1468 E9731469 E973 ;READ AND ECHO A CHAR FROM KB OR TTY1470 E973 20 83 FE REDOUT JSR CUREAD1471 E976 C9 0D RED2 CMP #CR1472 E978 F0 C1 BEQ RCHT1 ;DO NOT ECHO 1473 E97A1474 E97A ;OUTPUTS A CHAR TO EITHER TTY OR D/P1475 E97A 48 OUTPUT PHA ;SAVE IT1476 E97B AD 11 A4 OUT1 LDA PRIFLG ;IF LSB=1 OUTPUT ONLY TO DISP1477 E97E 29 01 AND #$011478 E980 F0 04 BEQ OUT1A1479 E982 68 PLA1480 E983 4C 02 EF JMP OUTDP1 ;ONLY TO DISPL1481 E986 20 42 E8 OUT1A JSR TTYTST ;TTY OR KB ?1482 E989 D0 04 BNE OUT21483 E98B 68 PLA1484 E98C 4C A8 EE JMP OUTTTY ;TO TTY1485 E98F 68 OUT2 PLA1486 E990 4C FC EE JMP OUTDP ;TO DISP & PRINTR1487 E9931488 E993 ;GET A CHR FROM CURRENT INPUT DEVICE (SET ON INFLG)1489 E993 AD 12 A4 INALL LDA INFLG1490 E996 C9 54 CMP #'T'1491 E998 D0 03 BNE *+51492 E99A 4C 3B ED JMP TIBYTE ;CHAR FROM BUFFER1493 E99D C9 4B CMP #'K' ;WITH KIM FORMAT1494 E99F D0 03 BNE *+51495 E9A1 4C 29 EE JMP GETTAP ;DIRECTLY FROM TAPE1496 E9A4 C9 4D CMP #'M' ;MEMORY FOR ASM?1497 E9A6 D0 03 BNE *+51498 E9A8 4C D0 FA JMP MREAD1499 E9AB C9 55 CMP #'U' ;USER ROUTINE?1500 E9AD D0 04 BNE *+61501 E9AF 38 SEC ;SET FLG FOR NORMAL INPUT1502 E9B0 6C 08 01 JMP (UIN)1503 E9B3 C9 4C CMP #'L' ;TO LOAD PPR TAPE1504 E9B5 D0 A8 BNE RDRUP1505 E9B7 4C DB EB JMP GETTTY ; FROM TTY1506 E9BA1507 E9BA ;.FILE A21508 E9BA A9 3B SEMI LDA #SEMICOLON ;OUTPUT A ";"1509 E9BC ;WRITE A CHR TO OUTPUT DEVICE (SET ON OUTFLG)1510 E9BC 48 OUTALL PHA1511 E9BD AD 13 A4 LDA OUTFLG1512 E9C0 ;TAPE BY BLOCKS1513 E9C0 C9 54 CMP #'T' ;TAPES ?1514 E9C2 D0 04 BNE OUTA11515 E9C4 68 PLA1516 E9C5 4C 8B F1 JMP TOBYTE ;OUTPUT ONE CHAR TO TAPE BUFFER1517 E9C8 ;TAPE KIM FORMAT1518 E9C8 C9 4B OUTA1 CMP #'K' ;KIM-1 ?1519 E9CA D0 04 BNE OUTA21520 E9CC 68 PLA1521 E9CD 4C 4A F2 JMP OUTTAP1522 E9D0 ;PRINTER1523 E9D0 C9 50 OUTA2 CMP #'P' ;PRINTER ?1524 E9D2 D0 0E BNE OUTA31525 E9D4 38 SEC ;TURN PRINTER ON1526 E9D5 6E 11 A4 ROR PRIFLG1527 E9D8 68 PLA1528 E9D9 08 PHP1529 E9DA 20 00 F0 JSR OUTPRI1530 E9DD 28 PLP1531 E9DE 2E 11 A4 ROL PRIFLG ;RESTORE FLG1532 E9E1 60 RTS1533 E9E2 ;USER DEFINED1534 E9E2 C9 55 OUTA3 CMP #'U' ;USER ROUTINE?1535 E9E4 D0 04 BNE OUTA41536 E9E6 38 SEC ;SET FLG FOR NORMAL OUTPUT1537 E9E7 6C 0A 01 JMP (UOUT) ;YES1538 E9EA ;NOWHERE OR TO TTY ,D/P1539 E9EA C9 58 OUTA4 CMP #'X' ;EAT IT?1540 E9EC D0 8D BNE OUT1 ;OUTPUT TO TTY OR D/P1541 E9EE 68 PLA1542 E9EF 60 RTS1543 E9F01544 E9F0 ;THIS ROUTINE OUTPUTS A CRLF TO ANY OUTPUT DEV1545 E9F0 ;LF AND NULL IS SENT ONLY TO TTY1546 E9F0 A9 0D CRLF LDA #CR1547 E9F2 20 BC E9 JSR OUTALL1548 E9F5 20 42 E8 JSR TTYTST ;TTY OR KB ?1549 E9F8 D0 29 BNE CR2J1550 E9FA AD 13 A4 LDA OUTFLG ;LF ONLY TO TTY1551 E9FD C9 54 CMP #'T'1552 E9FF F0 22 BEQ CR2J1553 EA01 C9 4B CMP #'K'1554 EA03 F0 1E BEQ CR2J1555 EA05 C9 50 CMP #'P'1556 EA07 F0 1A BEQ CR2J1557 EA09 A9 0A LDA #LF1558 EA0B 20 BC E9 JSR OUTALL1559 EA0E A9 FF LDA #NULLC1560 EA10 4C BC E9 JMP OUTALL1561 EA131562 EA13 ;CRLF TO TERMINAL (TTY OR D/P) ONLY1563 EA13 48 CRLOW PHA ;SAVE A1564 EA14 AD 13 A4 LDA OUTFLG1565 EA17 48 PHA1566 EA18 20 01 E9 JSR OUTLOW1567 EA1B 20 F0 E9 JSR CRLF1568 EA1E 68 PLA1569 EA1F 8D 13 A4 STA OUTFLG1570 EA22 68 PLA1571 EA23 60 CR2J RTS1572 EA241573 EA24 ;OUTPUT TO TTY IF SWITCH ON TTY & INFLG NOT L1574 EA24 ;DONT CLR DISPLAY BUT CLEARS PNTRS FOR NEXT LINE1575 EA24 ;IF PRNTR HAS PRINTED ON 21RST CHR DONT OUTPUT 1576 EA24 AD 12 A4 CRCK LDA INFLG ;NO IF "L"1577 EA27 C9 4C CMP #'L'1578 EA29 D0 01 BNE CRCK11579 EA2B 60 RTS1580 EA2C 20 42 E8 CRCK1 JSR TTYTST ;CHECK IF TTY OR KB1581 EA2F F0 E2 BEQ CRLOW ;BRNCH IF TTY1582 EA31 ;IF PRINTR PTR=0 ,DO NOT CLR PRI1583 EA31 AD 16 A4 LDA CURPOS1584 EA34 F0 05 BEQ CRCK2 ;IF PTR=0 ,NO 1585 EA36 A9 0D LDA #CR1586 EA38 20 00 F0 JSR OUTPRI1587 EA3B A9 8D CRCK2 LDA #CR+$80 ; ONLY FOR TV1588 EA3D 4C 02 EF JMP OUTDP11589 EA40 EA NOP1590 EA41 EA NOP1591 EA421592 EA42 ;WRITE A THEN X IN ASCII TO THE OUTPUT DEV1593 EA42 20 46 EA WRAX JSR NUMA1594 EA45 8A TXA1595 EA461596 EA46 ;PRINT ONE BYTE=TWO ASCII CHARS TO OUTPUT DEVICE1597 EA46 48 NUMA PHA1598 EA47 4A LSR A1599 EA48 4A LSR A1600 EA49 4A LSR A1601 EA4A 4A LSR A1602 EA4B 20 51 EA JSR NOUT1603 EA4E 68 PLA1604 EA4F 29 0F AND #$F1605 EA51 18 NOUT CLC1606 EA52 69 30 ADC #'0'1607 EA54 C9 3A CMP #'9'+11608 EA56 90 02 BCC LT101609 EA58 69 06 ADC #6 ;CARRY IS SET1610 EA5A 4C BC E9 LT10 JMP OUTALL1611 EA5D1612 EA5D ;READ TWO CHR & PACK THEM INTO ONE BYTE1613 EA5D ;PART OF ALTER MEMORY , / COMM1614 EA5D 20 73 E9 RD2 JSR REDOUT1615 EA60 C9 0D CMP #CR ;?1616 EA62 F0 17 BEQ RSPAC1617 EA64 C9 20 CMP #' ' ;FOR MEMORY ALTER1618 EA66 F0 13 BEQ RSPAC1619 EA68 C9 2E CMP #'.' ;TREAT "." AS 1620 EA6A D0 04 BNE RD11621 EA6C A9 20 LDA #' '1622 EA6E D0 0B BNE RSPAC1623 EA70 20 84 EA RD1 JSR PACK1624 EA73 B0 06 BCS RSPAC1625 EA75 20 73 E9 JSR REDOUT1626 EA78 4C 84 EA JMP PACK1627 EA7B ;WAS SPACE OR 1628 EA7B 38 RSPAC SEC1629 EA7C 60 RTS1630 EA7D1631 EA7D ;CONVERT ACC IN ASCII TO ACC IN HEX (4 MSB=0)1632 EA7D 48 HEX PHA ;SAVE A1633 EA7E A9 00 LDA #0 ;CLEAR STIY IF HEX1634 EA80 8D 29 A4 STA STIY+2 ;BECAUSE ONLY ONCE1635 EA83 68 PLA1636 EA84 ;PACK TWO ASCII INTO ONE HEX (CALL SUBR TWO TIMES)1637 EA84 ;RESULT IS GIVEN ON ACC WITH FIRST CHR INTO 4 MSB1638 EA84 C9 30 PACK CMP #'0' ;< 30 ?1639 EA86 90 F3 BCC RSPAC1640 EA88 C9 47 CMP #'F'+1 ; > 47 ?1641 EA8A B0 EF BCS RSPAC1642 EA8C C9 3A CMP #'9'+1 ; < $101643 EA8E 90 06 BCC PAK11644 EA90 C9 40 CMP #'A'-1 ; > $10 ?1645 EA92 90 E7 BCC RSPAC1646 EA94 69 08 ADC #8 ;ADD 9 IF LETTER (C IS SET)1647 EA96 2A PAK1 ROL A ;SHIFT A 4 TIMES1648 EA97 2A ROL A1649 EA98 2A ROL A1650 EA99 2A ROL A1651 EA9A 8E 2D A4 STX CPIY+3 ;SAVE X1652 EA9D A2 04 LDX #41653 EA9F 2A PAK2 ROL A ;TRANSFER A TO STIY1654 EAA0 2E 29 A4 ROL STIY+2 ; THRU CARRY1655 EAA3 CA DEX1656 EAA4 D0 F9 BNE PAK21657 EAA6 AE 2D A4 LDX CPIY+3 ;REST X1658 EAA9 AD 29 A4 LDA STIY+21659 EAAC 18 CLC1660 EAAD 60 RTS1661 EAAE1662 EAAE ;GET FOUR BYTE ADDR ,TAKE LAST FOUR CHR TO...1663 EAAE ;CALCULATE ADDR .ALLOW DELETE ALSO1664 EAAE 20 D8 E7 ADDIN JSR EQUAL1665 EAB1 AD 15 A4 ADDNE LDA CURPO2 ;SAVE POSITION1666 EAB4 48 PHA1667 EAB5 A0 00 LDY #01668 EAB7 20 5F E9 ADDN1 JSR RDRUP1669 EABA C9 0D CMP #CR1670 EABC F0 09 BEQ ADDN21671 EABE C9 20 CMP #' '1672 EAC0 F0 05 BEQ ADDN21673 EAC2 C8 INY1674 EAC3 C0 0B CPY #11 ;ALLOW 101675 EAC5 90 F0 BCC ADDN11676 EAC7 68 ADDN2 PLA1677 EAC8 8D 2D A4 STA CPIY+3 ;SAVE1678 EACB C0 00 CPY #0 ;IF FIRST CHR PUT DEFAULT VALUES1679 EACD D0 0D BNE ADDN31680 EACF A9 02 LDA #$021681 EAD1 8D 1D A4 STA ADDR+1 ;DEFAULT OF 02001682 EAD4 8D 1E A4 STA CKSUM ;DEFAULT1683 EAD7 8C 1C A4 STY ADDR1684 EADA 18 CLC1685 EADB 60 RTS1686 EADC A2 00 ADDN3 LDX #01687 EADE 88 DEY ;Y-41688 EADF 88 DEY1689 EAE0 88 DEY1690 EAE1 88 DEY1691 EAE2 10 13 BPL ADDN5 ;BRANCH IF > 4 CHR1692 EAE4 98 TYA1693 EAE5 49 FF EOR #$FF1694 EAE7 A8 TAY ;# OF LEADING 01695 EAE8 A9 30 ADDN4 LDA #$301696 EAEA 9D 1C A4 STA ADDR,X1697 EAED E8 INX1698 EAEE 88 DEY1699 EAEF 10 F7 BPL ADDN41700 EAF1 AC 2D A4 LDY CPIY+3 ;NOW THE CHR1701 EAF4 4C FD EA JMP ADDN61702 EAF7 98 ADDN5 TYA ;PUT CHR1703 EAF8 18 CLC1704 EAF9 6D 2D A4 ADC CPIY+31705 EAFC A8 TAY1706 EAFD B9 38 A4 ADDN6 LDA DIBUFF,Y ;FROM DISP BUFF1707 EB00 9D 1C A4 STA ADDR,X1708 EB03 C8 INY1709 EB04 E8 INX1710 EB05 E0 04 CPX #41711 EB07 D0 F4 BNE ADDN61712 EB09 A2 01 LDX #11713 EB0B A0 00 LDY #0 ;CNVRT CHR TO HEX1714 EB0D B9 1C A4 ADDN7 LDA ADDR,Y1715 EB10 20 7D EA JSR HEX1716 EB13 B0 16 BCS ADDN81717 EB15 C8 INY1718 EB16 B9 1C A4 LDA ADDR,Y1719 EB19 C8 INY1720 EB1A 20 84 EA JSR PACK ;PACK TWO CHRS INTO 1 BYTE1721 EB1D B0 0C BCS ADDN8 ;BRCNH IF ERROR1722 EB1F 9D 1C A4 STA ADDR,X1723 EB22 CA DEX1724 EB23 10 E8 BPL ADDN71725 EB25 E8 INX ;X=01726 EB26 8E 1E A4 STX CKSUM ;TO INDICATE WE GOT AN ADDR1727 EB29 18 CLC ;NO INVALID CHARS1728 EB2A 60 RTS1729 EB2B 20 94 E3 ADDN8 JSR CKER00 ;OUTPUT ERROR MSG1730 EB2E 20 24 EA JSR CRCK ;1731 EB31 38 SEC ;SET CARRY FOR INVALID CHR1732 EB32 60 RTS1733 EB331734 EB33 ;MEMORY FAIL TO WRITE MSG & SPECIFIC ADDRESS1735 EB33 20 24 EA MEMERR JSR CRCK1736 EB36 20 CD E2 JSR NXTADD ;ADD Y TO ADDR+1,ADDR1737 EB39 A0 31 LDY #M11-M1 ;PRINT "MEM FAIL"1738 EB3B 20 AF E7 JSR KEP ;FAIL MSG1739 EB3E 20 DB E2 JSR WRITAZ ;PRINT ADDR+1 , ADDR1740 EB41 4C A1 E1 JMP COMIN1741 EB441742 EB44 ;CLEAR DISPLAY & PRINTER POINTERS1743 EB44 A9 00 CLR LDA #01744 EB46 8D 15 A4 STA CURPO2 ;DISP PNTR1745 EB49 8D 16 A4 STA CURPOS ;PRINTR PNTR1746 EB4C 60 RTS1747 EB4D1748 EB4D ;CLEAR CKSUM1749 EB4D A9 00 CLRCK LDA #01750 EB4F 8D 1F A4 STA CKSUM+11751 EB52 8D 1E A4 STA CKSUM1752 EB55 60 RTS1753 EB561754 EB56 ;CODE FOR PAGE ZERO SIMULATION1755 EB56 ;SUBR LDAY-SIMULATES LDA (N),Y INSTR WITHOUT PAG 01756 EB56 ;BY PUTTING INDIR ADDR INTO RAM & THEN EXEC LDA NM,Y1757 EB56 A9 25 PCLLD LDA #SAVPC ;FOR DISASSEMBLER1758 EB58 8C 2D A4 LDAY STY CPIY+3 ;SAVE Y1759 EB5B A8 TAY1760 EB5C B9 00 A4 LDA MONRAM,Y ;MONRAM=MONITOR RAM1761 EB5F 8D 2B A4 STA LDIY+11762 EB62 B9 01 A4 LDA MONRAM+1,Y1763 EB65 8D 2C A4 STA LDIY+21764 EB68 AC 2D A4 LDY CPIY+3 ;REST Y1765 EB6B A9 B9 LDA #$B9 ;INST FOR LDA NM,Y1766 EB6D 8D 2A A4 STA LDIY1767 EB70 A9 60 LDA #$60 ;RTS1768 EB72 8D 2D A4 STA LDIY+31769 EB75 4C 2A A4 JMP LDIY ;START EXECUTING LDA (),Y1770 EB781771 EB78 ;SUBR STORE AT ADDR & CMP WITHOUT PAG 01772 EB78 ;REPLACES STA (ADDR),Y & CMP (ADDR),Y1773 EB78 ;LOOK THAT ADDR & ADDR+1 ARE NOT ON PAG 01774 EB78 48 SADDR PHA1775 EB79 AD 1C A4 LDA ADDR1776 EB7C 8D 28 A4 STA STIY+11777 EB7F 8D 2B A4 STA CPIY+11778 EB82 AD 1D A4 LDA ADDR+11779 EB85 8D 29 A4 STA STIY+21780 EB88 8D 2C A4 STA CPIY+21781 EB8B A9 99 LDA #$99 ;STA INSTR1782 EB8D 8D 27 A4 STA STIY1783 EB90 A9 D9 LDA #$D9 ;CMP INSTR1784 EB92 8D 2A A4 STA CPIY1785 EB95 A9 60 LDA #$60 ;RTS1786 EB97 8D 2D A4 STA LDIY+31787 EB9A 68 PLA1788 EB9B 4C 27 A4 JMP STIY ;START EXECUTING STA (),Y1789 EB9E1790 EB9E ;PUSH X & Y WITHOUT CHANGING THE REGS1791 EB9E 8D 2D A4 PHXY STA CPIY+3 ;SAVE ACC1792 EBA1 98 TYA1793 EBA2 48 PHA ;PUSH Y1794 EBA3 8A TXA1795 EBA4 48 PHA ;PUSH X1796 EBA5 20 BA EB JSR SWSTAK ;SWAP X , Y WITH RTRN ADDR FROM S`1797 EBA8 AD 2D A4 LDA CPIY+31798 EBAB 60 RTS1799 EBAC1800 EBAC ;PULL X & Y WITHOUT CHANGING ACC1801 EBAC ;IT HAS TO BE CALLED BY JSR & NOT BY JMP INSTR1802 EBAC ;SINCE IT SWAPS THE STACK1803 EBAC 8D 2D A4 PLXY STA CPIY+31804 EBAF 20 BA EB JSR SWSTAK ;SWAP X , Y WITH RTRN ADDR FROM`1805 EBB2 68 PLA1806 EBB3 AA TAX ;PULL X1807 EBB4 68 PLA1808 EBB5 A8 TAY ;PULL Y1809 EBB6 AD 2D A4 LDA CPIY+31810 EBB9 60 RTS1811 EBBA1812 EBBA ;SWAP STACK1813 EBBA BA SWSTAK TSX1814 EBBB A9 02 LDA #21815 EBBD 48 SWST1 PHA1816 EBBE BD 06 01 LDA $0106,X ;GET PCH OR PCL1817 EBC1 BC 04 01 LDY $0104,X ;GET Y OR X REGS1818 EBC4 9D 04 01 STA $0104,X1819 EBC7 98 TYA1820 EBC8 9D 06 01 STA $0106,X1821 EBCB CA DEX1822 EBCC 68 PLA1823 EBCD 38 SEC1824 EBCE E9 01 SBC #11825 EBD0 D0 EB BNE SWST11826 EBD2 BD 08 01 LDA $0108,X ;RESTORE Y & X FROM STACK1827 EBD5 A8 TAY1828 EBD6 BD 07 01 LDA $0107,X1829 EBD9 AA TAX1830 EBDA 60 RTS1831 EBDB1832 EBDB ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1833 EBDB ;GET A CHAR FROM TTY SUBR INTO ACC ,SAVES X1834 EBDB 8A GETTTY TXA ;SAVE X1835 EBDC 48 PHA1836 EBDD A2 07 LDX #$07 ;SET UP FOR 8 BIT CNT1837 EBDF 8E 2A A4 STX CPIY ;CLR MSB1838 EBE2 2C 00 A8 GET1 BIT DRB ;A^M , PB6->V1839 EBE5 70 FB BVS GET1 ;WAIT FOR START BIT1840 EBE7 20 0F EC JSR DELAY ;DELAY 1 BIT1841 EBEA 20 23 EC JSR DEHALF ;DELAY 1/2 BIT TIME1842 EBED AD 00 A8 GET3 LDA DRB ;GET 8 BITS1843 EBF0 29 40 AND #$40 ;MASK OFF OTHER BITS,ONLY PB61844 EBF2 4E 2A A4 LSR CPIY ;SHIFT RIGHT CHARACTER1845 EBF5 0D 2A A4 ORA CPIY1846 EBF8 8D 2A A4 STA CPIY1847 EBFB 20 0F EC JSR DELAY ;DELAY 1 BIT TIME1848 EBFE CA DEX1849 EBFF D0 EC BNE GET3 ;GET NEXT BIT1850 EC01 20 0F EC JSR DELAY ;DO NOT CARE FOR PARITY BIT1851 EC04 20 23 EC JSR DEHALF ;UNTIL WE GET BACK TO ONE AGAIN1852 EC07 68 PLA ;RESTORE X1853 EC08 AA TAX1854 EC09 AD 2A A4 LDA CPIY1855 EC0C 29 7F AND #$7F ;CLEAR PARITY BIT1856 EC0E 60 RTS1857 EC0F1858 EC0F ;DELAY 1 BIT TIME AS GIVEN BY BAUD RATE1859 EC0F AD 18 A4 DELAY LDA CNTL30 ;START TIMER T21860 EC12 8D 08 A8 STA T2L1861 EC15 AD 17 A4 LDA CNTH301862 EC18 8D 09 A8 DE1 STA T2H1863 EC1B AD 0D A8 DE2 LDA IFR ;GET INT FLG FOR T21864 EC1E 29 20 AND #MT21865 EC20 F0 F9 BEQ DE2 ;TIME OUT ?1866 EC22 60 RTS1867 EC231868 EC23 ;DELAY HALF BIT TIME1869 EC23 ;TOTAL TIME DIVIDED BY 21870 EC23 AD 17 A4 DEHALF LDA CNTH301871 EC26 4A LSR A ;LSB TO CARRY1872 EC27 AD 18 A4 LDA CNTL301873 EC2A 6A ROR A ;SHIFT WITH CARRY1874 EC2B 8D 08 A8 STA T2L1875 EC2E AD 17 A4 LDA CNTH301876 EC31 4A LSR A1877 EC32 8D 09 A8 STA T2H1878 EC35 4C 1B EC JMP DE21879 EC381880 EC38 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1881 EC38 A9 00 GETKD0 LDA #01882 EC3A 8D 77 A4 STA IDOT ;GO ANOTHER 90 DOTS1883 EC3D 20 50 F0 JSR IPO0 ;OUTPUT 90 DOTS TO PRI (ZEROS)1884 EC401885 EC40 ;GET A CHAR FROM KB SUBROUTINE1886 EC40 ;FROM KB Y=ROW ,STBKEY=COLUMNS (STROBE)1887 EC40 ;X=CTRL OR SHIFT ,OTHERWISE X=01888 EC40 20 EF EC GETKEY JSR ROONEK ;WAIT IF LAST KEY STILL DOWN1889 EC43 20 2A ED GETKY JSR DEBKEY ;DEBOUNCE KEY (5 MSEC)1890 EC46 ;CTRL OR SHIFT ?1891 EC46 A9 8F LDA #$8F ;CHCK CLMN 5,6,71892 EC48 8D 80 A4 STA DRA21893 EC4B AD 82 A4 LDA DRB2 ;CHCK ROW 11894 EC4E 4A LSR A1895 EC4F B0 20 BCS GETK1 ;IF=1 ,NO CTRL OR SHIFT1896 EC51 A2 03 LDX #3 ;CLMN 5,6,7 (CNTRL,SHIFTL,SHIFTR)1897 EC53 A9 7F LDA #$7F ;CTRL OR SHIFT ,SO WHICH ONE?1898 EC55 38 GETK0 SEC1899 EC56 6A ROR A1900 EC57 48 PHA1901 EC58 20 0B ED JSR ONEK2 ;LETS GET CTRL OR SHIFT INTO X1902 EC5B AD 82 A4 LDA DRB21903 EC5E 4A LSR A ;ONLY ROW 11904 EC5F 90 06 BCC GETK00 ;GOT YOU1905 EC61 68 PLA1906 EC62 CA DEX1907 EC63 D0 F0 BNE GETK01908 EC65 F0 DC BEQ GETKY ;THERE IS A MISTAKE CHECK AGAIN1909 EC67 68 GETK00 PLA ;NOW GET STBKEY INTO X1910 EC68 AD 2B A4 LDA STBKEY ;CLMN INTO X1911 EC6B 49 FF EOR #$FF ;COMPLEMENT BECAUSE STRBS ARE 01912 EC6D AA TAX ;CTRL OR SHIFT TO X1913 EC6E EE 2A A4 INC KMASK ;SET MSK=$011914 EC71 ;NOW GET ANY KEY1915 EC71 20 05 ED GETK1 JSR ONEKEY ;GET A KEY1916 EC74 88 DEY ;CHK THE ROW (1-8)1917 EC75 D0 09 BNE GETK1B ;CHK IF CTRL OR SHIFT1918 EC77 AD 2B A4 LDA STBKEY ;WERE ENTERED AT THE LAST MOMENT1919 EC7A C9 F7 CMP #$F7 ;IF CLMN 5,6,7,8 TO IT AGAIN1920 EC7C B0 04 BCS GETK21921 EC7E 90 C3 BCC GETKY ;SEND IT TO GET CTRL OR SHIFT1922 EC80 30 C1 GETK1B BMI GETKY ;NO KEY ,CLEAR MSK1923 EC82 ;WE HAVE A KEY ,DECODE IT1924 EC82 20 2C ED GETK2 JSR DEBK1 ;DEBOUNCE KEY (5 MSEC)1925 EC85 98 TYA ;MULT BY 81926 EC86 0A ASL A1927 EC87 0A ASL A1928 EC88 0A ASL A1929 EC89 A8 TAY ;NOW Y HAS ROW ADDR FROM ROW 11930 EC8A AD 2B A4 LDA STBKEY ;ADD COLUMN TO Y1931 EC8D 4A GETK3 LSR A1932 EC8E 90 03 BCC GETK41933 EC90 C8 INY1934 EC91 D0 FA BNE GETK31935 EC93 B9 21 F4 GETK4 LDA ROW1,Y ;GET THE CHR1936 EC96 48 PHA1937 EC97 8A TXA ;SEE IF CTRL OR SHIFT WAS USED1938 EC98 F0 24 BEQ GETK7 ;BRCH IF NO CTRL OR SHIFT1939 EC9A 29 10 AND #$10 ;CTRL ?1940 EC9C F0 06 BEQ GETK5 ;NO ,GO GETKS1941 EC9E 68 PLA1942 EC9F 29 3F AND #$3F ;MSK OFF 2 MSB FOR CONTROL1943 ECA1 4C BF EC JMP GETK8 ;EXIT1944 ECA4 68 GETK5 PLA1945 ECA5 48 PHA ;SAVE IT1946 ECA6 29 40 AND #$40 ;IF ALPHA CHARS DO NOT SHIFT1947 ECA8 D0 14 BNE GETK71948 ECAA 68 PLA1949 ECAB 48 PHA1950 ECAC 29 0F AND #$0F ;ONLY LSB1951 ECAE F0 0E BEQ GETK7 ;DO NOT INTERCHANGE OR 01952 ECB0 C9 0C CMP #$0C ;ACC>=$0C ?1953 ECB2 B0 05 BCS GETK6 ;YES ACC>=$0C1954 ECB4 68 PLA ;NO, ACC<$0C1955 ECB5 29 EF AND #$EF ;STRIP OFF BIT 41956 ECB7 D0 06 BNE GETK8 ;EXIT1957 ECB9 68 GETK6 PLA ;ACC>=$0C1958 ECBA 09 10 ORA #$10 ;BIT 4= 11959 ECBC D0 01 BNE GETK8 ;EXIT1960 ECBE 68 GETK7 PLA1961 ECBF ;CHECK FOR "ADV PAP","PRI LINE", OR "TOGL PRIFLG"1962 ECBF ;IN THIS WAY WE DONT HAVE TO CHCK FOR THIS COMM1963 ECBF C9 60 GETK8 CMP #$60 ;ADV PAPER COMM1964 ECC1 D0 06 BNE GETK111965 ECC3 E0 00 CPX #0 ;IF SHIFT IS NOT ADV PAPER1966 ECC5 F0 25 BEQ GETK10 ;NO SHIFT ,SO ADVPAPER1967 ECC7 29 4F AND #$4F ;CONVRT TO "@"1968 ECC9 C9 1C GETK11 CMP #$1C ;SEE IF TOGGL PRIFLG (CONTRL PRI)1969 ECCB D0 14 BNE GETK131970 ECCD 20 E1 E6 JSR PRITR ;GO TOGGLE FLG1971 ECD0 A0 01 LDY #1 ;GET THE PTRS BACK 3 SPACES1972 ECD2 B9 15 A4 GETK12 LDA CURPO2,Y1973 ECD5 38 SEC1974 ECD6 E9 03 SBC #3 ;BECAUSE "ON ,OFF" MSGS1975 ECD8 99 15 A4 STA CURPO2,Y1976 ECDB 88 DEY1977 ECDC 10 F4 BPL GETK121978 ECDE 4C 40 EC JMP GETKEY1979 ECE1 C9 5C GETK13 CMP #BACKSLASH ;PRINT LINE COMMAND1980 ECE3 D0 06 BNE GETK141981 ECE5 20 4A F0 JSR IPS0 ;PRINT WHATEVER IS IN BUFFER1982 ECE8 4C 40 EC JMP GETKEY1983 ECEB 60 GETK14 RTS1984 ECEC 4C 38 EC GETK10 JMP GETKD01985 ECEF1986 ECEF ;WAIT IF LAST KEY STILL DOWN (ROLLOVER)1987 ECEF AD 82 A4 ROONEK LDA DRB2 ;SEE IF KEY STILL DOWN1988 ECF2 C9 FF CMP #$FF1989 ECF4 F0 0A BEQ ROO1 ;NO KEY AT ALL, CLR ROLLFL1990 ECF6 0D 7F A4 ORA ROLLFL ;ACCEPT ONLY LAST KEY1991 ECF9 49 FF EOR #$FF ;STRBS ARE ZEROS TO INVER1992 ECFB D0 F2 BNE ROONEK1993 ECFD 20 2A ED JSR DEBKEY ;CLR KMASK & DEBOUNCE RELEASE1994 ED00 A9 00 ROO1 LDA #0 ;CLR KMASK1995 ED02 8D 2A A4 STA KMASK1996 ED05 ;GO THRU KB ONCE AND RTN ,IF ANY1997 ED05 ;KEY Y=ROW (1-8) & STBKEY=CLMN1998 ED05 ;IF NO KEY Y=0 ,STBKEY=$FF1999 ED05 A9 7F ONEKEY LDA #$7F ;FIRST STROBE TO MSB2000 ED07 D0 02 BNE ONEK2 ;START AT ONEK22001 ED09 38 ONEK1 SEC ;ONLY ONE PULSE (ZERO)2002 ED0A 6A ROR A ;SHIFT TO RIGHT2003 ED0B 8D 80 A4 ONEK2 STA DRA2 ;OUTPUT CLMN STROBE2004 ED0E 8D 2B A4 STA STBKEY ;SAVE IT2005 ED11 A0 08 LDY #8 ;CHECK 8 ROWS2006 ED13 AD 82 A4 LDA DRB2 ;ANY KEY ?2007 ED16 0D 2A A4 ORA KMASK ;DISABLE ROW 1 IF CTRL OR SHIFT2008 ED19 8D 7F A4 STA ROLLFL ;SAVE WHICH KEY IT WAS2009 ED1C 0A ONEK3 ASL A2010 ED1D 90 0A BCC ONEK4 ;JUMP IF KEY (ZERO)2011 ED1F 88 DEY2012 ED20 D0 FA BNE ONEK32013 ED22 AD 2B A4 LDA STBKEY2014 ED25 C9 FF CMP #$FF ;LAST CLMN ?2015 ED27 D0 E0 BNE ONEK1 ;NO ,DO NEXT CLMN2016 ED29 60 ONEK4 RTS2017 ED2A2018 ED2A A2 00 DEBKEY LDX #0 ;CLEAR CNTRL OR SHIFT2019 ED2C A9 00 DEBK1 LDA #0 ;CLR KMASK2020 ED2E 8D 2A A4 STA KMASK2021 ED31 A9 88 LDA #DEBTIM ;DEBOUNCE TIME FOR KEYBOARD2022 ED33 8D 08 A8 STA T2L2023 ED36 A9 13 LDA #DEBTIM/2562024 ED38 4C 18 EC JMP DE1 ;WAIT FOR 5 MSEC2025 ED3B2026 ED3B ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2027 ED3B ;GET A CHAR FROM TAPE SUBROUTINE2028 ED3B ;A BUFFER IS USED TO GET BLOCKS OF DATA2029 ED3B ;FROM TAPE ,EXCEPT WHEN FORMAT EQUAL TO2030 ED3B ;KIM-1 (THE WHOLE FILE IS LOADED AT ONE TIME)2031 ED3B 20 9E EB TIBYTE JSR PHXY ;PUSH X2032 ED3E AE 36 A4 LDX TAPTR ;POINTER FOR BUFFER2033 ED41 E0 50 CPX #80 ;IS BUFFER EMPTY ?2034 ED43 D0 03 BNE TIB12035 ED45 20 53 ED JSR TIBY1 ;LOAD ANOTHER BLOCK2036 ED48 BD 16 01 TIB1 LDA TABUFF,X2037 ED4B E8 INX2038 ED4C 8E 36 A4 STX TAPTR2039 ED4F 20 AC EB JSR PLXY ;PULL X2040 ED52 60 RTS2041 ED53 ;LOAD A BLOCK FROM TAPE INTO BUFFER2042 ED53 20 EA ED TIBY1 JSR TAISET ;SET TAPE FOR INPUT2043 ED56 20 29 EE TIBY3 JSR GETTAP ;GET A CHAR FROM TAPE2044 ED59 C9 23 CMP #'#' ;CHECK FIRST CHR FOR2045 ED5B F0 06 BEQ TIBY4 ;START OF BLOCK2046 ED5D C9 16 CMP #$16 ;IF NOT # SHOULD BE SYN2047 ED5F D0 F2 BNE TIBY12048 ED61 F0 F3 BEQ TIBY32049 ED63 A2 00 TIBY4 LDX #02050 ED65 20 29 EE TIBY5 JSR GETTAP ;NOW LOAD INTO BUFFER2051 ED68 9D 16 01 STA TABUFF,X2052 ED6B E8 INX2053 ED6C E0 52 CPX #822054 ED6E D0 F5 BNE TIBY52055 ED70 AD 00 A8 LDA DRB2056 ED73 29 CF AND #$CF2057 ED75 8D 00 A8 STA DRB ;TURN OFF TAPES2058 ED78 58 CLI ;ENABL INTERR2059 ED79 20 BD ED JSR ADDBK1 ;DISPLAY BLK COUNT2060 ED7C A2 00 LDX #0 ;TO CLEAR PTR IN TIBYTE2061 ED7E AD 15 01 LDA BLK ;CHECK THE BLOCK COUNT2062 ED81 F0 05 BEQ TIBY5A ;IF FIRST BLK ,DO NOT CMP2063 ED83 DD 16 01 CMP TABUFF,X2064 ED86 D0 28 BNE TIBY7 ;BRANCH IF WE MISSED ONE BLOCK2065 ED88 E8 TIBY5A INX2066 ED89 8E 36 A4 STX TAPTR2067 ED8C EE 15 01 INC BLK ;INCR BLK CONT2068 ED8F AD 67 01 LDA TABUFF+81 ;STORE THIS BLK CKSUM2069 ED92 48 PHA2070 ED93 AD 66 01 LDA TABUFF+802071 ED96 48 PHA2072 ED97 CE 12 A4 DEC INFLG ;SET INFLG DIFF FROM OUTFLG2073 ED9A 20 E7 F1 JSR BKCKSM ;COMPUT BLK CKSUM FOR THIS BLK2074 ED9D 68 PLA2075 ED9E CD 66 01 CMP TABUFF+80 ;DO THEY AGREE ?2076 EDA1 D0 0C BNE TIBY62077 EDA3 68 PLA2078 EDA4 CD 67 01 CMP TABUFF+812079 EDA7 D0 07 BNE TIBY72080 EDA9 EE 12 A4 INC INFLG ;RESTORE INPUT DEVICE2081 EDAC A2 01 LDX #1 ;TO GET FIRST CHR IN TIBYTE2082 EDAE 60 RTS2083 EDAF 68 TIBY6 PLA ;RESTORE STACK PTR2084 EDB0 68 TIBY7 PLA2085 EDB1 68 PLA2086 EDB2 68 PLA2087 EDB3 68 PLA2088 EDB4 20 8E E3 JSR CKER02089 EDB7 4C A1 E1 JMP COMIN2090 EDBA2091 EDBA ;ADD 1 TO BLK COUNT AND OUTPUT IT2092 EDBA EE 15 01 ADDBLK INC BLK ;INCR BLK CNT2093 EDBD EE 11 A4 ADDBK1 INC PRIFLG ;SO DONT OUTPUT TO PRINTR2094 EDC0 A9 12 LDA #18 ;ONLY OUTPUT IN THIS POSITION2095 EDC2 8D 15 A4 STA CURPO22096 EDC5 AD 4A A4 LDA DIBUFF+18 ;SAVE DISBUF (FOR EDIT)2097 EDC8 48 PHA2098 EDC9 AD 4B A4 LDA DIBUFF+192099 EDCC 48 PHA2100 EDCD AE 13 A4 LDX OUTFLG ;SAVE OUTFLG2101 EDD0 A9 0D LDA #CR2102 EDD2 8D 13 A4 STA OUTFLG ;TO OUTPUT TO TERMINAL2103 EDD5 AD 16 01 LDA BLK+1 ;BLK CNT COMING FROM TAPE2104 EDD8 20 46 EA JSR NUMA ;OUTPUT IN ASCII2105 EDDB 8E 13 A4 STX OUTFLG ;RESTORE OUTFLG2106 EDDE 68 PLA2107 EDDF 8D 4B A4 STA DIBUFF+192108 EDE2 68 PLA2109 EDE3 8D 4A A4 STA DIBUFF+182110 EDE6 CE 11 A4 DEC PRIFLG ;RESTORE PRI FLG2111 EDE9 60 RTS2112 EDEA2113 EDEA ;SET TAPE (1 OR 2) FOR INPUT2114 EDEA A9 37 TAISET LDA #$37 ;SET PB7 FOR INPUT2115 EDEC 8D 02 A8 STA DDRB2116 EDEF AD 34 A4 LDA TAPIN ;INPUT FLG (TAP 1=2 OR TAP 2=1)2117 EDF2 20 1C EE JSR TIOSET ;RESET PB4 OR PB52118 EDF5 A9 EE LDA #MOFF+DATIN ;SET CA2=1 (DATA IN)2119 EDF7 8D 0C A8 STA PCR2120 EDFA A9 FF LDA #$FF ;PREPARE T22121 EDFC 8D 08 A8 STA T2L ;LACTH2122 EDFF ;CHCK BIT BY BIT UNTIL $162123 EDFF 20 3B EE SYNC JSR RDBIT ;GET A BIT IN MSB2124 EE02 4E 2A A4 LSR CPIY ;MAKE ROOM FOR BIT2125 EE05 0D 2A A4 ORA CPIY ;PUT BIT INTO MSB2126 EE08 8D 2A A4 STA CPIY2127 EE0B C9 16 CMP #$16 ;SYN CHAR ?2128 EE0D D0 F0 BNE SYNC2129 EE0F A2 05 LDX #$05 ;TEST FOR 5 SYN CHARS2130 EE11 20 29 EE SYNC1 JSR GETTAP2131 EE14 C9 16 CMP #$162132 EE16 D0 E7 BNE SYNC ;IF NOT 2 CHAR RE-SYNC2133 EE18 CA DEX2134 EE19 D0 F6 BNE SYNC12135 EE1B 60 RTS2136 EE1C2137 EE1C ;SET PB4 OR PB5 OFF2138 EE1C ;USED BY IN/OUT SET UPS2139 EE1C D0 04 TIOSET BNE TIOS1 ;BRCH IF TAP12140 EE1E A9 14 LDA #$14 ;SET TAP 2 OFF (PB5=0)2141 EE20 D0 02 BNE TIOS22142 EE22 A9 24 TIOS1 LDA #$24 ;SET TAP 1 OFF (PB4=0)2143 EE24 8D 00 A8 TIOS2 STA DRB2144 EE27 78 SEI ;DISABLE INTERR WHILE TAP2145 EE28 60 RTS2146 EE292147 EE29 ;GET 1 CHAR FROM TAPE AND RETURN2148 EE29 ;WITH CHR IN ACC, USE CPIY TO ASM CHR ,USES Y2149 EE29 A0 08 GETTAP LDY #$08 ;READ 8 BITS2150 EE2B 20 3B EE GETA1 JSR RDBIT ;GET NEXT DATA BIT2151 EE2E 4E 2A A4 LSR CPIY ;MAKE ROOM FOR MSB2152 EE31 0D 2A A4 ORA CPIY ;OR IN SIGN BIT2153 EE34 8D 2A A4 STA CPIY ;REPLACE CHAR2154 EE37 88 DEY2155 EE38 D0 F1 BNE GETA12156 EE3A 60 RTS2157 EE3B ;GET ONE BIT FROM TAPE AND2158 EE3B ;RETURN IT IN SIGN OF A (MSB)2159 EE3B AD 08 A4 RDBIT LDA TSPEED ;ARE WE IN C7 OR 5B,5A FREQUENC`2160 EE3E 30 27 BMI RDBIT4 ;JUMP TO C7 FREQ FORMAT2161 EE40 20 75 EE JSR CKFREQ ;START BIT IN HIGH FREQ2162 EE43 20 75 EE RDBIT1 JSR CKFREQ ;HIGH TO LOW FREQ TRANS2163 EE46 B0 FB BCS RDBIT12164 EE48 AD 96 A4 LDA DIV64 ;GET HIGH FREQ TIMING2165 EE4B 48 PHA2166 EE4C A9 FF LDA #$FF ;SET UP TIMER2167 EE4E 8D 96 A4 STA DIV642168 EE51 20 75 EE RDBIT2 JSR CKFREQ ;LOW TO HIGH FREQ TRANS2169 EE54 90 FB BCC RDBIT2 ;WAIT TILL FREQ IS HIGH2170 EE56 68 PLA2171 EE57 38 SEC2172 EE58 ED 96 A4 SBC DIV64 ;(256-T1) - (256-T2) =T2-T12173 EE5B 48 PHA ;LOW FREQ TIME-HIGH FREQ TIME2174 EE5C A9 FF LDA #$FF2175 EE5E 8D 96 A4 STA DIV64 ;SET UP TIMER2176 EE61 68 PLA2177 EE62 49 FF EOR #$FF2178 EE64 29 80 AND #$802179 EE66 60 RTS2180 EE67 ;EACH BIT STARTS WITH HALF PULSE OF 2400 & THEN2181 EE67 ;3 HALF PULSES OF 1200 HZ FOR 0 ,3 PUSLES OF 2400 FOR 12182 EE67 ;THE READING IS MADE ON THE FOURTH 1/2 PULSE ,WHERE2183 EE67 ;THE SIGNAL HAS STABILIZED2184 EE67 20 75 EE RDBIT4 JSR CKFREQ ;SEE WHICH FREQ2185 EE6A 90 FB BCC RDBIT42186 EE6C 20 75 EE JSR CKFREQ2187 EE6F 20 75 EE JSR CKFREQ2188 EE72 4C B5 FF JMP PATC24 ;NOW READ THE BIT2189 EE752190 EE75 2C 00 A8 CKFREQ BIT DRB ;ARE WE HIGH OR LOW ?2191 EE78 30 27 BMI CKF42192 EE7A 2C 00 A8 CKF1 BIT DRB ;WAIT TILL HIGH2193 EE7D 10 FB BPL CKF12194 EE7F 65 00 ADC $00 ;EQUALIZER2195 EE81 AD 09 A8 CKF2 LDA T2H ;SAVE CNTR2196 EE84 48 PHA2197 EE85 AD 08 A8 LDA T2L2198 EE88 48 PHA2199 EE89 A9 FF LDA #$FF2200 EE8B 8D 09 A8 STA T2H ;START CNTR2201 EE8E AD 08 A4 LDA TSPEED2202 EE91 30 06 BMI CKF3 ;SUPER SPEED ?2203 EE93 68 PLA2204 EE94 CD 08 A4 CMP TSPEED ;HIGH OR LOW FREC2205 EE97 68 PLA ;C=1 IF HIGH ,C=0 IF LOW2206 EE98 60 RTS2207 EE99 68 CKF3 PLA2208 EE9A CD 08 A4 CMP TSPEED ;CENTER FREQ2209 EE9D 68 CKF3A PLA2210 EE9E E9 FE SBC #$FE2211 EEA0 60 RTS2212 EEA1 2C 00 A8 CKF4 BIT DRB ;WAIT TILL LOW2213 EEA4 30 FB BMI CKF42214 EEA6 10 D9 BPL CKF2 ;GO GET TIMING2215 EEA82216 EEA8 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2217 EEA8 ;OUTPUT ACC TO TTY SUBROUTINE2218 EEA8 ;X,Y ARE PRESERVED2219 EEA8 48 OUTTTY PHA ;SAVE A2220 EEA9 20 9E EB JSR PHXY ;PUSH X2221 EEAC 8D 27 A4 STA STIY ;PUT CHAR HERE2222 EEAF 20 0F EC JSR DELAY ;STOP BIT FROM LAST CHAR2223 EEB2 AD 00 A8 LDA DRB2224 EEB5 29 FB AND #$FB ;START BIT PB2=02225 EEB7 8D 00 A8 STA DRB ;TTO=PB22226 EEBA 8D 28 A4 STA STIY+1 ;SAVE THIS PATTERN2227 EEBD 20 0F EC JSR DELAY2228 EEC0 A2 08 LDX #$08 ;8 BITS2229 EEC2 2E 27 A4 ROL STIY ;GET FIRST LSB INTO BIT 22230 EEC5 2E 27 A4 ROL STIY2231 EEC8 2E 27 A4 ROL STIY2232 EECB 6E 27 A4 OUTT1 ROR STIY2233 EECE AD 27 A4 LDA STIY2234 EED1 29 04 AND #$04 ;GET ONLY BIT 2 FOR PB22235 EED3 0D 28 A4 ORA STIY+1 ;PUT BIT INTO PATTERN2236 EED6 8D 00 A8 STA DRB ;NOW TO TTY2237 EED9 08 PHP ;PRESERVE CARRY FOR ROTATE2238 EEDA 20 0F EC JSR DELAY2239 EEDD 28 PLP2240 EEDE CA DEX2241 EEDF D0 EA BNE OUTT12242 EEE1 A9 04 LDA #$04 ;STOP BIT2243 EEE3 0D 28 A4 ORA STIY+12244 EEE6 8D 00 A8 STA DRB2245 EEE9 20 0F EC JSR DELAY ;STOP BIT2246 EEEC 20 AC EB JSR PLXY ;PULL X2247 EEEF 68 PLA2248 EEF0 C9 0A CMP #LF2249 EEF2 F0 07 BEQ OUTT22250 EEF4 C9 FF CMP #NULLC2251 EEF6 F0 03 BEQ OUTT22252 EEF8 4C 05 EF JMP OUTDIS ;USE THAT BUFF2253 EEFB 60 OUTT2 RTS2254 EEFC2255 EEFC ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2256 EEFC ;OUTPUT A CHR TO D/P SUBR (SINGLE ENTRY FOR BOTH SUBR)2257 EEFC ;IF CHAR= CLEAR DISPLAY & PRINTER2258 EEFC 20 00 F0 OUTDP JSR OUTPRI ;FIRST TO PRI THEN TO DISP2259 EEFF EA NOP2260 EF00 EA NOP2261 EF01 EA NOP2262 EF02 6C 06 A4 OUTDP1 JMP (DILINK) ;HERE HE COULD ECHO SOMEWHERE ELSE`2263 EF052264 EF05 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2265 EF05 ;OUTPUT ACC TO DISPLAY SUBROUTINE2266 EF05 ;IF SIGN BIT (MSB)=1 DISP DO NOT CLR TO THE RIGHT2267 EF05 48 OUTDIS PHA ;SAVE A2268 EF06 20 9E EB JSR PHXY ;PUSH X2269 EF09 C9 0D CMP #CR ; ?2270 EF0B D0 07 BNE OUTD12271 EF0D A2 00 LDX #0 ;YES2272 EF0F 8E 15 A4 STX CURPO2 ;CLEAR DISP POINTER2273 EF12 F0 42 BEQ OUTD5 ;GO CLEAR DISP2274 EF14 4C 9C FE OUTD1 JMP PATCH42275 EF17 E0 3C OUTD1A CPX #60 ;LAST CHAR FOR DISP?2276 EF19 90 05 BCC OUTD22277 EF1B 20 AC EB JSR PLXY ;GO BACK2278 EF1E 68 PLA ;DO NOT STORE2279 EF1F 60 RTS2280 EF20 9D 38 A4 OUTD2 STA DIBUFF,X ;PUT CHAR IN BUFF2281 EF23 EE 15 A4 INC CURPO2 ;INC POINTER2282 EF26 E0 14 CPX #20 ;DISPLAY FULL?2283 EF28 90 1E BCC OUTD42284 EF2A 20 2F EF JSR OUTD2A ;THIS WAY SCROLL IS A SUBR2285 EF2D 30 47 BMI OUTD7 ;EXIT DISP2286 EF2F ;YES, SCROLL CHARS TO THE LEFT2287 EF2F 8A OUTD2A TXA ;X---> Y2288 EF30 A8 TAY2289 EF31 A2 13 LDX #19 ;ADDR FOR DISP DO NOT2290 EF33 8E 27 A4 OUTD3 STX STIY ;DECREM IN BINARY2291 EF36 B9 38 A4 LDA DIBUFF,Y ;FROM BUFFER TO DISP2292 EF39 09 80 ORA #$80 ;NO CURSOR2293 EF3B 20 7B EF JSR OUTDD1 ;CONVERT X INTO REAL ADDR2294 EF3E 88 DEY2295 EF3F CE 27 A4 DEC STIY2296 EF42 AE 27 A4 LDX STIY2297 EF45 10 EC BPL OUTD3 ;AGAIN UNTIL WHOLE DISP2298 EF47 60 RTS2299 EF48 48 OUTD4 PHA2300 EF49 09 80 ORA #$80 ;NO CURSOR2301 EF4B 20 7B EF JSR OUTDD1 ;X=<$19 ,CONVRT TO REAL ADDR2302 EF4E 68 PLA2303 EF4F 29 80 AND #$80 ;IF MSB=0 CLEAR REST OF DISPLAY2304 EF51 D0 23 BNE OUTD72305 EF53 AE 15 A4 LDX CURPO22306 EF56 ;CLEAR DISP TO THE RIGHT2307 EF56 E0 14 OUTD5 CPX #202308 EF58 B0 1C BCS OUTD72309 EF5A 8E 27 A4 STX STIY2310 EF5D A9 A0 LDA #' '+$80 ;2311 EF5F 20 7B EF JSR OUTDD1 ;CONVRT TO REAL ADDR2312 EF62 EE 27 A4 INC STIY2313 EF65 AE 27 A4 LDX STIY2314 EF68 D0 EC BNE OUTD5 ;GO NEXT2315 EF6A 4C 76 EF JMP OUTD72316 EF6D EA NOP2317 EF6E EA NOP2318 EF6F EA NOP2319 EF70 EA NOP2320 EF71 EA NOP2321 EF72 EA NOP2322 EF73 EA NOP2323 EF74 EA NOP2324 EF75 EA NOP2325 EF76 20 AC EB OUTD7 JSR PLXY ;REST ,SO PRINTR INDEPEN2326 EF79 68 PLA2327 EF7A 60 RTS2328 EF7B2329 EF7B ;CONVERT X INTO REAL ADDR FOR DISPLAY2330 EF7B ;AND OUTPUT IT PB=DATA ; PA=W,CE ,A0 A1 (6520)2331 EF7B 48 OUTDD1 PHA ;SAVE DATA2332 EF7C 8A TXA2333 EF7D 48 PHA ;SAVE X2334 EF7E 4A LSR A ;DIVIDE X BY 42335 EF7F 4A LSR A ;TO GET CHIP SELECT2336 EF80 AA TAX ;BACK TO X2337 EF81 A9 04 LDA #4 ;FIRST CHIP SELECT2338 EF83 E0 00 CPX #0 ;FIRST CHIP ?2339 EF85 F0 04 BEQ OUTDD32340 EF87 0A OUTDD2 ASL A2341 EF88 CA DEX2342 EF89 D0 FC BNE OUTDD2 ;BACK TILL RIGH CS2343 EF8B 8D 28 A4 OUTDD3 STA STIY+1 ;SAVE CS TEMPORARILY2344 EF8E 68 PLA ;GET X AGAIN FOR CHAR2345 EF8F 29 03 AND #$03 ;IN THAT CHIP2346 EF91 0D 28 A4 ORA STIY+1 ;OR IN CS AND CHAR2347 EF94 ;STORE ADDR AND DATA INTO DISPL2348 EF94 49 FF EOR #$FF ;W=1 , CE=0 & A1,A02349 EF96 8D 00 AC STA RA2350 EF99 AA TAX ;SAVE A IN X2351 EF9A 68 PLA ;GET DATA2352 EF9B 48 PHA2353 EF9C 8D 02 AC STA RB2354 EF9F 8A TXA2355 EFA0 49 80 EOR #$80 ;SET W=02356 EFA2 8D 00 AC STA RA2357 EFA5 EA NOP2358 EFA6 09 7C ORA #$7C ;SET CE=12359 EFA8 8D 00 AC STA RA2360 EFAB A9 FF LDA #$FF ;SET W=12361 EFAD 8D 00 AC STA RA2362 EFB0 68 PLA ;RETURN DATA2363 EFB1 60 RTS2364 EFB22365 EFF9 *=$EFF92366 EFF9 EA .DB $EA2367 F000 *=$F0002368 F000 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2369 F000 ;OUTPUT ACC TO PRINTER SUBROUTINE2370 F000 ;PRINTS ON 21RST CHAR OR WHEN 2371 F000 ;IT WILL PUT IT ON BUBFFER BUT WONT PRINT IF2372 F000 ;PRIFLG=02373 F000 48 OUTPRI PHA ;SAVE CHR TO BE OUTPUT2374 F001 20 9E EB JSR PHXY ;SAVE X2375 F004 C9 0D CMP #CR ;SEE IF CR2376 F006 F0 07 BEQ OUT01 ;YES SO PRINT THE BUFF2377 F008 AE 16 A4 LDX CURPOS ;PTR TO NEXT POS IN BUFF2378 F00B E0 14 CPX #20 ;SEE IF BUFF FULL2379 F00D D0 16 BNE OUT04 ;NOT FULL SO RETURN2380 F00F ; SO FILL REST OF BUFFER WITH BLANKS2381 F00F 48 OUT01 PHA2382 F010 A9 00 LDA #0 ;CURPOS = 02383 F012 AE 16 A4 LDX CURPOS ;SEE IF ANYTHING IN BUFFER2384 F015 8D 16 A4 STA CURPOS2385 F018 20 38 F0 JSR OUTPR ;CLEAR PRIBUF TO THE RIGHT2386 F01B ;BUFFER FILLED SO PRINT IT2387 F01B 20 45 F0 JSR IPST ;START THE PRINT2388 F01E A2 00 LDX #0 ;STORE CHR IN BUFF (FIRST LOC)2389 F020 68 PLA ;GET IT2390 F021 C9 0D CMP #CR ;DONT STORE IF 2391 F023 F0 0E BEQ OUT052392 F025 9D 60 A4 OUT04 STA IBUFM,X ;STORE CHR IN BUFF2393 F028 EE 16 A4 INC CURPOS ;INCR BUFF PNTR2394 F02B E8 INX2395 F02C 29 80 AND #$802396 F02E D0 03 BNE OUT05 ;DONT CLR IF MSB=12397 F030 20 38 F0 JSR OUTPR ;CLEAR PRIBUFF TO THE RIGHT2398 F033 20 AC EB OUT05 JSR PLXY ;RESTORE REGS2399 F036 68 PLA2400 F037 60 RTS2401 F038 A9 20 OUTPR LDA #' ' ;FILL REST OF BUFF WITH BLANKS2402 F03A E0 14 OUTPR1 CPX #20 ;SEE IF END OF BUFF2403 F03C F0 06 BEQ OUTPR22404 F03E 9D 60 A4 STA IBUFM,X ;NO SO STORE BLANK2405 F041 E8 INX ;INCR BUFF PNTR2406 F042 10 F6 BPL OUTPR12407 F044 60 OUTPR2 RTS2408 F0452409 F045 ;SUB TO OUTPUT BUFFER, 70 DOTS (10 DOTS AT2410 F045 ;A TIME BY 7 ROWS) FOR EACH LINE OF PRINTING2411 F045 2C 11 A4 IPST BIT PRIFLG ;PRINT FLG ON ?2412 F048 10 2E BPL IPO42413 F04A 20 CB F0 IPS0 JSR PINT ;INITIALIZE VALUES2414 F04D 20 E3 F0 JSR IPSU ;SET UP FIRS OUTPUT PATTERN2415 F050 A9 C1 IPO0 LDA #PRST+SP12+MON ;TURN MOTOR ON2416 F052 8D 0C A8 STA PCR2417 F055 20 A0 FF JSR PAT23 ;TIME OUT ?2418 F058 D0 0C BNE IPO2 ;NO, START SIGNAL RECEIVED2419 F05A 20 A0 FF JSR PAT23 ;YES, TRY AGAIN2420 F05D D0 07 BNE IPO2 ;OK2421 F05F 4C 79 F0 JMP PRIERR ;TWO TIME OUTS - ERROR2422 F062 EA NOP2423 F063 EA NOP2424 F064 EA NOP2425 F065 EA NOP2426 F066 20 87 F0 IPO2 JSR PRNDOT ;STRB P1=1 PRINT DOTS (1.7MSEC)2427 F069 20 87 F0 JSR PRNDOT ;STRB P2=1 PRINT DOTS (1.7MSEC)2428 F06C ;CHECK FOR 90, WHEN 70 PRNDOT WILL OUTPUT ZEROS2429 F06C AD 77 A4 LDA IDOT2430 F06F C9 5A CMP #902431 F071 90 F3 BCC IPO2 ;L.T. 90 THEN GO STROB P12432 F073 A9 E1 IPO3 LDA #PRST+SP12+MOFF ;TURN MOTOR OFF2433 F075 8D 0C A8 STA PCR2434 F078 60 IPO4 RTS2435 F0792436 F079 20 44 EB PRIERR JSR CLR ;CLEAR PRI PNTR2437 F07C 20 B1 FE JSR PATCH5 ;TURN PRI OFF2438 F07F A0 3B LDY #M12-M12439 F081 20 AF E7 JSR KEP2440 F084 4C A1 E1 JMP COMIN ;BACK WHERE SUBR WAS CALLED2441 F0872442 F087 ;SUBR TO INCR DOT COUNTER,WHEN2443 F087 ;NEG TRANS OUTPUT CHR FOR 1.7 MSEC2444 F087 ;CLEAR & SET UP NEXT PATTERN2445 F087 A9 00 PRNDOT LDA #0 ;CLR INTERRPTS2446 F089 8D 01 A8 STA DRAH2447 F08C AD 0D A8 PRDOT0 LDA IFR2448 F08F 29 02 AND #MSP12 ;ANY STROBES ?2449 F091 F0 F9 BEQ PRDOT02450 F093 AD 0C A8 LDA PCR2451 F096 49 01 EOR #$012452 F098 8D 0C A8 STA PCR2453 F09B EE 77 A4 INC IDOT2454 F09E AD 79 A4 LDA IOUTU ;2 LEFT ELEM2455 F0A1 0D 00 A8 ORA DRB ;DO NOT TURN TTY OUTPUT OFF2456 F0A4 8D 00 A8 STA DRB2457 F0A7 AD 78 A4 LDA IOUTL ;7 RIGHT ELEM, CLR CA1 INTER FLG2458 F0AA 8D 01 A8 STA DRAH2459 F0AD A9 A4 LDA #PRTIME2460 F0AF 8D 08 A8 STA T2L2461 F0B2 A9 06 LDA #PRTIME/256 ;START T2 FOR 1.7 MSEC2462 F0B4 8D 09 A8 STA T2H2463 F0B7 20 E3 F0 JSR IPSU ;SET NEXT PATTERN WHILE WAITING2464 F0BA 20 1B EC JSR DE2 ;WAIT TILL TIME OUT2465 F0BD A9 00 LDA #0 ;THERMAL ELEM OFF2466 F0BF 8D 01 A8 STA DRAH2467 F0C2 AD 00 A8 LDA DRB ;BUT DONT CHANGE TAPE CONTROLS2468 F0C5 29 FC AND #$FC2469 F0C7 8D 00 A8 STA DRB2470 F0CA 60 RTS2471 F0CB2472 F0CB ; SUBROUTINE PINT -- INIT VARS FOR PRINTER2473 F0CB A9 FF PINT LDA #$FF2474 F0CD 8D 74 A4 STA IDIR ;DIRECTION <= -2475 F0D0 A9 05 LDA #52476 F0D2 8D 75 A4 STA ICOL ;COLUMN <= LEFTMOST +12477 F0D5 A9 01 LDA #12478 F0D7 8D 76 A4 STA IOFFST ;OFFSET <= LEFT CHARACTER2479 F0DA 8D 7C A4 STA IMASK2480 F0DD A9 00 LDA #02481 F0DF 8D 77 A4 STA IDOT ;DOT COUNTER <= 02482 F0E2 60 RTS2483 F0E32484 F0E3 ;THE VARIABLES FOR THE PRINTER ARE AS FOLLOWS:2485 F0E3 ;2486 F0E3 ;IDIR DIRECT HEAD IS CURRENTLY MOVING (0=+, $FF=-)2487 F0E3 ;ICOL CLMN TO BE PRNTED NEXT (LEFTMOST=0,RIGHTMOST=4)2488 F0E3 ;IOFFST OFFSET N PRINT BUFF (0=LEFT CHR, 1=RIGHT CHR)2489 F0E3 ;IDOT COUNT OF NUMBER OF DOTS PRINTED THUS FAR2490 F0E3 ;IOUTL SOLENOID PATTERN (8 CHRS ON RIGHT)2491 F0E3 ;IOUTU SOLENOID PATTERN (2 CHRS ON LEFT)2492 F0E3 ;IBITL 1 BIT MSK USED IN SETTING NEXT SOLENOID VALUE2493 F0E3 ;IBITU UPPER PART OF MASK2494 F0E3 ;IBUFM START OF PRINT BUFFER (LEFTMOST CHR FIRST)2495 F0E3 ;IMASK MASK FOR CURRENT ROW BEING PRINTED2496 F0E3 ;JUMP ADDRESS OF TABLE FOR CURRENT COLUMN2497 F0E3 ;2498 F0E3 ; THE DOT PATTERNS FOR THE CHRS ARE STORED SO THAT...2499 F0E3 ;EACH BYTE CONTAINS THE DOTS FOR ONE COLUMN OF ONE...2500 F0E3 ;CHR. SINCE EACH COLUMN CONTAINS SEVEN DOTS ,2501 F0E3 ;THIS MEANS THAT ONE BIT PER BYTE IS UNUSED.2502 F0E3 ; THE PATTERNS ARE ORGANIZED INTO 5 TABLES OF 64...2503 F0E3 ;BYTES WHERE EACH TABLE CONTAINS ALL THE DOT...2504 F0E3 ;PATTERNS FOR A PARTICULAR COLUMN. THE BYTES IN EACH...2505 F0E3 ;TABLE ARE ORDERED ACCORDING TO THE CHR CODE OF...2506 F0E3 ;THE CHR BEING REFERENCED. THE CHR CODE CAN...2507 F0E3 ;THUS BE USED TO DIRECTLY INDEX INTO THE TABLE.2508 F0E32509 F0E3 ;SUBROUTINE IPSU -- SET UP OUTPUT PATTERN FOR PRINTER2510 F0E3 ; THIS ROUTINE IS CALLED IN ORDER TO2511 F0E3 ;SET UP THE NEXT GROUP OF SOLENOIDS TO2512 F0E3 ;BE OUTPUT TO THE PRINTER.2513 F0E3 ; ON ENTRY THE CONTENTS OF ALL REGISTERS2514 F0E3 ;ARE ARBITRARY2515 F0E3 ; ON EXIT THE CONTENTS OF A,X,Y ARE UNDEFINED2516 F0E3 A2 00 IPSU LDX #0 ;X POINTS TO VAR BLOCK FOR PRNTR2517 F0E5 20 21 F1 JSR INCP ;ADVANCE PTRS TO NXT DOT POSITION2518 F0E8 ;X NOW CONTAINS INDEX INTO PRINT BUFFER2519 F0E8 BD 60 A4 IPS1 LDA IBUFM,X ;LOAD NEXT CHAR FROM BUFFER2520 F0EB 29 3F AND #$3F2521 F0ED A8 TAY2522 F0EE A9 7D LDA #JUMP ;A<= DOT PATTERN FOR CHAR & COL2523 F0F0 20 58 EB JSR LDAY2524 F0F3 2C 7C A4 BIT IMASK ;SEE IF DOT IS SET2525 F0F6 F0 16 BEQ IPS2 ;NO SO GO ON TO NEXT CHAR2526 F0F8 AD 7A A4 LDA IBITL ;DOT ON SO SET THE CURR SOLENOID2527 F0FB F0 08 BEQ IPS3 ;LSB OF SOL MASK IS 0 , DO MSB2528 F0FD 0D 78 A4 ORA IOUTL ;SET THE SOLENOID IN THE PATTERN2529 F100 8D 78 A4 STA IOUTL2530 F103 D0 09 BNE IPS2 ;BRANCH ALWAYS2531 F105 AD 7B A4 IPS3 LDA IBITU ;SOLENOID IS ONE OF THE 2 MSD2532 F108 0D 79 A4 ORA IOUTU ;SET THE BIT IN THE PATTERN2533 F10B 8D 79 A4 STA IOUTU2534 F10E 0E 7A A4 IPS2 ASL IBITL ;SHIFT MSK TO NXT CHR POSITION2535 F111 2E 7B A4 ROL IBITU2536 F114 CA DEX ;DECR PTR INTO BUFFER2537 F115 CA DEX2538 F116 10 D0 BPL IPS1 ;NOT END YET2539 F118 ;SOLENOID PATTERN IS SET UP IN IOUTU,IOUTL2540 F118 AD 79 A4 LDA IOUTU ;LEFTMOST 22541 F11B 29 03 AND #$03 ;DISABLE FOR SEGMENTS2542 F11D 8D 79 A4 STA IOUTU2543 F120 60 RTS2544 F1212545 F121 ; SUBROUTINE INCP2546 F121 ;THIS SUBROUTINE IS USED TO UPDATE THE PRINTER VARIABLES2547 F121 ;TO POINT TO THE NEXT DOT POSITION TO BE PRINTED2548 F121 ;X REG IS USED TO POINT TO THE VARIABLE BLOCK OF2549 F121 ;BEING UPDATED2550 F121 ;ON EXIT X CONTAINS THE POINTER TO THE LAST CHARACTER IN2551 F121 ;THE PRINT BUFFER2552 F121 ;CONTENTS OF A,Y ON EXIT ARE ARBITRARY2553 F121 BD 74 A4 INCP LDA IDIR,X ;EXAMINE DIRECTION(+ OR -)2554 F124 10 1E BPL OP03 ;DIRECTION = +2555 F126 ;*DIRECTION = -2556 F126 BD 75 A4 LDA ICOL,X ;SEE WHAT THE COLUMN IS2557 F129 F0 05 BEQ OP04 ;COLUMN = 0 SO END OF DIGIT2558 F12B ;**COLUMN # 0 SO JUST DECREMENT COLUMN2559 F12B DE 75 A4 DEC ICOL,X2560 F12E 10 33 BPL NEWCOL ;BRANCH ALWAYS2561 F130 ;**COLUMN = 0 SO SEE IF EVEN OR ODD DIGIT2562 F130 BD 76 A4 OP04 LDA IOFFST,X2563 F133 F0 0A BEQ OP07 ;OFFSET = 0 SO DIRECTION CHANGE2564 F135 ;***OFFSET = 1 SO MOVE TO RIGHT DIGIT2565 F135 DE 76 A4 DEC IOFFST,X ;OFFSET <= 0 (LEFT CHARACTER)2566 F138 A9 04 LDA #4 ;COLUMN <= 42567 F13A 9D 75 A4 STA ICOL,X2568 F13D 10 24 BPL NEWCOL ;BRANCH ALWAYS2569 F13F ;***OFFSET = 0 SO CHANGE DIRECTION TO +2570 F13F FE 74 A4 OP07 INC IDIR,X ;DIRECTION <= $00 (+)2571 F142 10 1C BPL NEWROW ;BRANCH ALWAYS2572 F144 ;*DIRECTION = +2573 F144 BD 75 A4 OP03 LDA ICOL,X ;SEE IF LAST COLUMN IN DIGIT2574 F147 C9 04 CMP #42575 F149 F0 05 BEQ OP05 ;COLUMN = 4 SO GO TO NEXT DIGIT2576 F14B FE 75 A4 INC ICOL,X ;JUST INCR COLUMN-NOT END OF DIGIT2577 F14E 10 13 BPL NEWCOL ;BRANCH ALWAYS2578 F150 ;**AT COLUMN 4 -- SEE IF LEFT OR RIGHT DIGIT2579 F150 BD 76 A4 OP05 LDA IOFFST,X2580 F153 D0 08 BNE OP06 ;OFFSET # 0 SO RIGHT DIGIT2581 F155 9D 75 A4 STA ICOL,X ;COLUMN <= 02582 F158 FE 76 A4 INC IOFFST,X ;OFFSET <= 1 (RIGHT CHARACTER)2583 F15B 10 06 BPL NEWCOL ;BRANCH ALWAYS2584 F15D ;***OFFSET = 1 SO DIRECTION CHANGE2585 F15D DE 74 A4 OP06 DEC IDIR,X ;DIRECTION <= $FF (-)2586 F1602587 F160 ;START OF NEW PRINT ROW2588 F160 1E 7C A4 NEWROW ASL IMASK,X ;UPDATE ROW MASK FOR DOT PATTERNS2589 F163 ;START OF NEW PRINT COLUMN2590 F163 A9 00 NEWCOL LDA #0 ;CLEAR OUTPUT PATTERN2591 F165 9D 78 A4 STA IOUTL,X ;PATTERN FOR 8 RIGHT CHRS2592 F168 9D 79 A4 STA IOUTU,X ;PATTERN FOR 2 LEFT SOLEN2593 F16B 9D 7B A4 STA IBITU,X ;OUTPUT MSK FOR LEFTMOST SOLEN2594 F16E A9 01 LDA #12595 F170 9D 7A A4 STA IBITL,X ;OUTPUT MSK FOR RIGHTMOST SOLEN2596 F173 ;GET ADDRESS OF DOT PATTERN TABLE FOR NEXT COLUMN2597 F173 BD 75 A4 LDA ICOL,X ;GET COLUMN NUMBER (0-4)2598 F176 0A ASL A ;*2 ,INDEX INTO TBL OF TBL ADDRS2599 F177 A8 TAY2600 F178 B9 D7 F2 LDA MTBL,Y ;LSB OF ADDR OF TABLE2601 F17B 9D 7D A4 STA JUMP,X ;PTR TO TBL WITH DOT PATTERNS2602 F17E B9 D8 F2 LDA MTBL+1,Y ;MSB OF TABLE ADDRESS2603 F181 9D 7E A4 STA JUMP+1,X2604 F184 A9 12 LDA #18 ;COMPUTE INDEX INTO PRNTR BUFFER2605 F186 1D 76 A4 ORA IOFFST,X ;+1 IF RIGHT CHR2606 F189 AA TAX2607 F18A 60 RTS2608 F18B2609 F18B ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2610 F18B ;OUTPUT ACC TO TAPE BUFFER SUBROUTINE2611 F18B ; & WHEN FULL OUTPUT BUFF TO TAPE.2612 F18B ; IF INFLG=OUTFLG= T USE TWO BUFFERS2613 F18B ;OTHERWISE USE SAME BUFFER FOR INPUT2614 F18B ;AND OUTPUT (MONIT BUFFER)2615 F18B 20 9E EB TOBYTE JSR PHXY ;SAVE X2616 F18E AE 37 A4 LDX TAPTR2 ;TAPE BUFFER POINTER FOR OUTPUT2617 F191 20 0F F2 JSR BKCK2 ;STORE IN BUFFER2618 F194 E8 INX2619 F195 8E 37 A4 STX TAPTR2 ;FOR NEXT2620 F198 E0 50 CPX #80 ;BUFFER FULL?2621 F19A D0 32 BNE TABY3 ;NO , GO BACK2622 F19C ;OUTPUT A BLOCK FROM BUFFER TO TAPE2623 F19C 20 E7 F1 JSR BKCKSM ;COMPUT BLOCK CHECKSUM2624 F19F 20 1D F2 JSR TAOSET ;SET TAPE FOR OUTPUT2625 F1A2 A9 23 LDA #'#' ;CHAR FOR BEGINNING2626 F1A4 20 4A F2 JSR OUTTAP ;OF BLOCK2627 F1A7 ;OUTPUT CHRS FROM ACTIVE BUFFER2628 F1A7 20 D2 F1 TABY2 JSR CKBUFF ;LOAD CHR FROM ACTIVE BUFFER2629 F1AA 20 4A F2 JSR OUTTAP ; FROM BUFFER2630 F1AD E8 INX2631 F1AE E0 53 CPX #83 ;2 BLOCK CKSUM CHR + 1 EXTRA CHR..2632 F1B0 D0 F5 BNE TABY2 ;OTHERWISE ERROR2633 F1B2 AD 00 A8 LDA DRB2634 F1B5 29 CF AND #$CF ;TURN TAPES OFF PB5,PB42635 F1B7 8D 00 A8 STA DRB2636 F1BA 58 CLI ;ENABLE INTERRUPT2637 F1BB A9 00 LDA #02638 F1BD 8D 37 A4 STA TAPTR2 ;CLR TAPE BUFF PTR2639 F1C0 A9 00 LDA #T1I ;RESET FREE RUNNING TO 1 SHOT2640 F1C2 8D 0B A8 STA ACR2641 F1C5 20 9A FF JSR PAT22 ;ADD 1 TO BLK COUNT & OUTPUT2642 F1C8 AD 68 01 LDA BLKO ;PUT BLK CNT IN FIRST LOC (TABUFF)2643 F1CB 20 8B F1 JSR TOBYTE2644 F1CE 20 AC EB TABY3 JSR PLXY2645 F1D1 60 RTS2646 F1D22647 F1D2 ;CHCK ACTIVE BUFFER AND LOAD A CHR2648 F1D2 ;CARRY=0 IF ONLY 1 BUFFER ,C=1 IF 2 BUFFERS2649 F1D2 AD 12 A4 CKBUFF LDA INFLG2650 F1D5 CD 13 A4 CMP OUTFLG2651 F1D8 D0 08 BNE CBUFF12652 F1DA C9 54 CMP #'T' ;SEE IF INFLG=OUTFLG = T2653 F1DC D0 04 BNE CBUFF12654 F1DE 38 SEC ;USE PAGE 1 FOR OUTPUT BUFFER2655 F1DF B5 AD LDA TABUF2,X2656 F1E1 60 RTS2657 F1E2 18 CBUFF1 CLC ;USE SAME BUFFER FOR I/O2658 F1E3 BD 16 01 LDA TABUFF,X2659 F1E6 60 RTS2660 F1E72661 F1E7 ;COMPUTE BLOCK CHECKSUM & PUT IT2662 F1E7 ;AT THE END OF ACTIVE BUFFER2663 F1E7 A9 00 BKCKSM LDA #0 ;CLEAR BLK CKSUM LOCAT2664 F1E9 8D 66 01 STA TABUFF+802665 F1EC 8D 67 01 STA TABUFF+812666 F1EF A2 4F LDX #792667 F1F1 20 D2 F1 BKCK1 JSR CKBUFF ;GET CHR FROM EITHER BUFFER2668 F1F4 18 CLC2669 F1F5 6D 66 01 ADC TABUFF+80 ;ADD TO CKSUM2670 F1F8 8D 66 01 STA TABUFF+802671 F1FB 90 03 BCC *+52672 F1FD EE 67 01 INC TABUFF+812673 F200 CA DEX2674 F201 10 EE BPL BKCK1 ;DO THE WHOLE BUFFER2675 F203 A2 50 LDX #802676 F205 AD 66 01 LDA TABUFF+80 ;PUT CKSUM INTO RIGHT BUFFER2677 F208 20 0F F2 JSR BKCK22678 F20B E8 INX2679 F20C AD 67 01 LDA TABUFF+812680 F20F 48 BKCK2 PHA ;OUTPUT A CHAR TO RIGHT BUFFER2681 F210 20 D2 F1 JSR CKBUFF ;GET WHICH BUFFER2682 F213 68 PLA2683 F214 B0 04 BCS BKCK3 ;BRNCH TO SECOND BUFFER2684 F216 9D 16 01 STA TABUFF,X2685 F219 60 RTS2686 F21A 95 AD BKCK3 STA TABUF2,X ;TO PAG 12687 F21C 60 RTS2688 F21D2689 F21D ;SET TAPE (1 OR 2) FOR OUTPUT2690 F21D 20 C0 F2 TAOSET JSR SETSPD ;SET UP SPEED (# OF HALF PULSES)2691 F220 AD 35 A4 LDA TAPOUT ;OUTPUT FLG (TAPE 1 OR 2)2692 F223 20 1C EE JSR TIOSET ;SET PB4 OR PB5 TO ZERO2693 F226 A9 EC LDA #DATOUT+MOFF ;SET CA2=0 (DATA OUT)2694 F228 8D 0C A8 STA PCR2695 F22B A9 C0 LDA #T1FR ;SET TIMER IN FREE RUNNING2696 F22D 8D 0B A8 STA ACR2697 F230 A9 00 LDA #002698 F232 8D 05 A8 STA T1CH ;START TIMER T12699 F235 AE 09 A4 LDX GAP ;OUTPUT 4*GAP SYN BYTES2700 F238 A9 16 TAOS1 LDA #$16 ;SYN CHAR2701 F23A 20 4A F2 JSR OUTTAP ;TO TAPE2702 F23D 20 4A F2 JSR OUTTAP2703 F240 20 4A F2 JSR OUTTAP2704 F243 20 4A F2 JSR OUTTAP2705 F246 CA DEX2706 F247 D0 EF BNE TAOS12707 F249 60 RTS2708 F24A2709 F24A ;OUTPUT ACC TO TAPE2710 F24A 8E 2D A4 OUTTAP STX CPIY+3 ;SAVE X2711 F24D A0 07 LDY #$07 ;FOR THE 8 BITS2712 F24F 8C 27 A4 STY STIY2713 F252 AE 08 A4 LDX TSPEED2714 F255 30 39 BMI OUTTA1 ;IF ONE IS SUPER HIPER2715 F257 48 PHA2716 F258 A0 02 TRY LDY #2 ;SEND 3 UNITS2717 F25A 8C 28 A4 STY STIY+1 ;STARTING AT 3700 HZ2718 F25D BE 0A A4 ZON LDX NPUL,Y ;#OF HALF CYCLES2719 F260 48 PHA2720 F261 B9 0B A4 ZON1 LDA TIMG,Y ;SET UP LACTH FOR NEXT2721 F264 8D 06 A8 STA T1LL ;PULSE (80 OR CA) (FREC)2722 F267 A9 00 LDA #02723 F269 8D 07 A8 STA T1LH2724 F26C 2C 0D A8 ZON2 BIT IFR ;WAIT FOR PREVIOUS2725 F26F 50 FB BVC ZON2 ;CYCLE (T1 INT FLG)2726 F271 AD 04 A8 LDA T1L ;CLR INTERR FLG2727 F274 CA DEX2728 F275 D0 EA BNE ZON1 ;SEND ALL CYCLES2729 F277 68 PLA2730 F278 CE 28 A4 DEC STIY+12731 F27B F0 05 BEQ SETZ ;BRCH IF LAST ONE2732 F27D 30 07 BMI ROUT ;BRCH IF NO MORE2733 F27F 4A LSR A ;TAKE NEXT BIT2734 F280 90 DB BCC ZON ;...IF IT'S A ONE...2735 F282 A0 00 SETZ LDY #0 ;SWITCH TO 2400 HZ2736 F284 F0 D7 BEQ ZON ;UNCONDITIONAL BRCH2737 F286 CE 27 A4 ROUT DEC STIY ;ONE LESS BIT2738 F289 10 CD BPL TRY ;ANY MORE? GO BACK2739 F28B 68 ROUT1 PLA ;RECOVER CHR2740 F28C AE 2D A4 LDX CPIY+3 ;RESTORE X2741 F28F 60 RTS2742 F2902743 F290 ;OUTPUT HALF PULSE FOR 0 (1200 HZ) &2744 F290 ;TWO HALF PULSES FOR 1 (2400 HZ) (00 TSPEED)2745 F290 48 OUTTA1 PHA2746 F291 8D 28 A4 STA STIY+1 ;STORE ACC2747 F294 A2 02 OUTTA2 LDX #2 ;# OF HALF PULSES2748 F296 A9 D0 LDA #$D0 ;1/2 PULSE OF 24002749 F298 8D 06 A8 STA T1LL2750 F29B A9 00 LDA #002751 F29D 8D 07 A8 STA T1LH2752 F2A0 20 BC FF JSR PATC25 ;WAIT TILL COMPLETED2753 F2A3 4E 28 A4 LSR STIY+1 ;GET BITS FROM CHR2754 F2A6 B0 0A BCS OUTTA32755 F2A8 A9 A0 LDA #$A0 ;BIT=0 ,OUTPUT 1200 HZ2756 F2AA 8D 06 A8 STA T1LL2757 F2AD A9 01 LDA #$012758 F2AF 8D 07 A8 STA T1LH2759 F2B2 20 BC FF OUTTA3 JSR PATC252760 F2B5 CA DEX2761 F2B6 10 FA BPL OUTTA3 ;OUTPUT 3 HALF PULSES2762 F2B8 88 DEY2763 F2B9 10 D9 BPL OUTTA2 ;ALL BITS ?2764 F2BB 4C 8B F2 JMP ROUT1 ;RESTORE REGS2765 F2BE EA NOP2766 F2BF EA NOP2767 F2C02768 F2C0 ;SET SPEED FROM NORMAL TO 3 TIMES NORMAL2769 F2C0 AD 08 A4 SETSPD LDA TSPEED ;SPEED FLG2770 F2C3 6A ROR A ;NORMAL OR 3* NORM2771 F2C4 A9 0C LDA #122772 F2C6 90 02 BCC SETSP12773 F2C8 A9 04 LDA #42774 F2CA 8D 0A A4 SETSP1 STA NPUL2775 F2CD A9 12 LDA #182776 F2CF 90 02 BCC SETSP22777 F2D1 A9 06 LDA #62778 F2D3 8D 0C A4 SETSP2 STA TIMG+12779 F2D6 60 RTS2780 F2D7 ;.FILE A3/22781 F2D72782 F2D7 ; ADDRESS TABLE FOR EACH PRINT COLUMN2783 F2D7 ; EACH TBL CONTAINS DOT PATTERNS FOR 1 OF THE 5 COLUMNS.2784 F2D7 ; DATA ARE STORED WITH EACH BYTE DEFINING ONE COLUMN...2785 F2D7 ; OF A CHARACTER, WITH THE TOP DOT CORRESPONDING TO THE..2786 F2D7 ; LSB IN THE BYTE2787 F2D7 E1F221F361F3MTBL .DW COL0,COL1,COL2,COL3,COL42787 F2DD A1F3E1F32788 F2E12789 F2E1 ;DOT PATTERNS FOR COLUMN ZERO (LEFTMOST COLUMN)2790 F2E1 3E7E7F3E7F7FCOL0 .DB $3E,$7E,$7F,$3E,$7F,$7F,$7F,$3E ;@ -- G2790 F2E7 7F3E2791 F2E9 7F00207F7F7F .DB $7F,$00,$20,$7F,$7F,$7F,$7F,$3E ;H -- O2791 F2EF 7F3E2792 F2F1 7F3E7F46013F .DB $7F,$3E,$7F,$46,$01,$3F,$07,$7F ;P -- W2792 F2F7 077F2793 F2F9 6307617F0300 .DB $63,$07,$61,$7F,$03,$00,$02,$40 ;X -- (2793 F2FF 02402794 F301 000000142463 .DB $00,$00,$00,$14,$24,$63,$60,$00 ; -- '2794 F307 60002795 F309 000014084008 .DB $00,$00,$14,$08,$40,$08,$40,$60 ;( -- /2795 F30F 40602796 F311 3E4462411827 .DB $3E,$44,$62,$41,$18,$27,$3C,$01 ;0 -- 72796 F317 3C012797 F319 364600400814 .DB $36,$46,$00,$40,$08,$14,$41,$02 ;8 -- ?2797 F31F 41022798 F3212799 F321 ;DOT PATTERNS FOR COLUMN 12800 F321 410949414149COL1 .DB $41,$09,$49,$41,$41,$49,$09,$41 ;@ -- G2800 F327 09412801 F329 084140084002 .DB $08,$41,$40,$08,$40,$02,$06,$41 ;H -- O2801 F32F 06412802 F331 094109490140 .DB $09,$41,$09,$49,$01,$40,$18,$20 ;P -- W2802 F337 18202803 F339 140851410400 .DB $14,$08,$51,$41,$04,$00,$01,$40 ;X -- (2803 F33F 01402804 F341 0000077F2A13 .DB $00,$00,$07,$7F,$2A,$13,$4E,$04 ; -- '2804 F347 4E042805 F349 1C4108083008 .DB $1C,$41,$08,$08,$30,$08,$00,$10 ;( -- /2805 F34F 00102806 F351 514251411445 .DB $51,$42,$51,$41,$14,$45,$4A,$71 ;0 -- 72806 F357 4A712807 F359 494900341414 .DB $49,$49,$00,$34,$14,$14,$41,$01 ;8 -- ?2807 F35F 41012808 F3612809 F361 ;DOT PATTERNS FOR COLUMN 22810 F361 5D0949414149COL2 .DB $5D,$09,$49,$41,$41,$49,$09,$41 ;@ -- G2810 F367 09412811 F369 087F4114400C .DB $08,$7F,$41,$14,$40,$0C,$08,$41 ;H -- O2811 F36F 08412812 F371 095119497F40 .DB $09,$51,$19,$49,$7F,$40,$60,$18 ;P -- W2812 F377 60182813 F379 087849410841 .DB $08,$78,$49,$41,$08,$41,$01,$40 ;X -- (2813 F37F 01402814 F381 004F00147F08 .DB $00,$4F,$00,$14,$7F,$08,$59,$02 ; -- '2814 F387 59022815 F389 22223E3E0008 .DB $22,$22,$3E,$3E,$00,$08,$00,$08 ;( -- /2815 F38F 00082816 F391 497F51491245 .DB $49,$7F,$51,$49,$12,$45,$49,$09 ;0 -- 72816 F397 49092817 F399 494944002214 .DB $49,$49,$44,$00,$22,$14,$22,$51 ;8 -- ?2817 F39F 22512818 F3A12819 F3A1 ;DOT PATTERNS FOR COLUMN 32820 F3A1 550949412249COL3 .DB $55,$09,$49,$41,$22,$49,$09,$49 ;@ -- G2820 F3A7 09492821 F3A9 08413F224002 .DB $08,$41,$3F,$22,$40,$02,$30,$41 ;H -- O2821 F3AF 30412822 F3B1 092129490140 .DB $09,$21,$29,$49,$01,$40,$18,$20 ;P -- W2822 F3B7 18202823 F3B9 140845001041 .DB $14,$08,$45,$00,$10,$41,$01,$40 ;X -- (2823 F3BF 01402824 F3C1 0000077F2A64 .DB $00,$00,$07,$7F,$2A,$64,$26,$01 ; -- '2824 F3C7 26012825 F3C9 411C08080008 .DB $41,$1C,$08,$08,$00,$08,$00,$04 ;( -- /2825 F3CF 00042826 F3D1 454049557F45 .DB $45,$40,$49,$55,$7F,$45,$49,$05 ;0 -- 72826 F3D7 49052827 F3D9 492900004114 .DB $49,$29,$00,$00,$41,$14,$14,$09 ;8 -- ?2827 F3DF 14092828 F3E1 ;DOT PATTERNS FOR COLUMN 42829 F3E1 1E7E36221C41COL4 .DB $1E,$7E,$36,$22,$1C,$41,$01,$7A ;@ -- G2829 F3E7 017A2830 F3E9 7F000141407F .DB $7F,$00,$01,$41,$40,$7F,$7F,$3E ;H -- O2830 F3EF 7F3E2831 F3F1 065E4631013F .DB $06,$5E,$46,$31,$01,$3F,$07,$7F ;P -- W2831 F3F7 077F2832 F3F9 63074300607F .DB $63,$07,$43,$00,$60,$7F,$02,$40 ;X -- (2832 F3FF 02402833 F401 000000141263 .DB $00,$00,$00,$14,$12,$63,$50,$00 ; -- '2833 F407 50002834 F409 000014080008 .DB $00,$00,$14,$08,$00,$08,$00,$03 ;( -- /2834 F40F 00032835 F411 3E4046221039 .DB $3E,$40,$46,$22,$10,$39,$31,$03 ;0 -- 72835 F417 31032836 F419 361E00004114 .DB $36,$1E,$00,$00,$41,$14,$08,$06 ;8 -- ?2836 F41F 08062837 F4212838 F421 ;ASCII CHARACTERS FOR KB2839 F421 2008000D0000ROW1 .DB $20,$08,$00,$0D,$00,$00,$00,$002839 F427 00002840 F429 00605C000000ROW2 .DB $00,$60,'\',$00,$00,$00,$7F,$002840 F42F 7F002841 F431 2E4C502D3A30ROW3 .DB ".LP-:0;/"2841 F437 3B2F2842 F439 4D4A494F3938ROW4 .DB "MJIO98K,"2842 F43F 4B2C2843 F441 424759553736ROW5 .DB "BGYU76HN"2843 F447 484E2844 F449 434452543534ROW6 .DB "CDRT54FV"2844 F44F 46562845 F451 5A4157453332ROW7 .DB "ZAWE32SX"2845 F457 53582846 F459 00001B51315EROW8 .DB $00,$00,$1B,"Q1",$5E,"]["2846 F45F 5D5B2847 F4612848 F461 ;DISASSEMBLE INSTRUCTIONS AND SHOW REGS IS REGF SET2849 F461 AD 0E A4 REGQ LDA REGF ;GET FLAG2850 F464 F0 06 BEQ DISASM2851 F466 20 32 E2 JSR REG1 ;SHOW THE SIX REGS2852 F469 20 24 EA JSR CRCK ;2853 F46C2854 F46C 20 45 F5 DISASM JSR PRBL22855 F46F 20 3C F5 JSR PRPC ;OUTPUT PROG COUNTR2856 F472 A0 00 LDY #02857 F474 20 56 EB JSR PCLLD2858 F477 A8 TAY2859 F478 4A LSR A2860 F479 90 0B BCC IEVEN2861 F47B 4A LSR A2862 F47C B0 17 BCS ERR2863 F47E C9 22 CMP #$222864 F480 F0 13 BEQ ERR2865 F482 29 07 AND #72866 F484 09 80 ORA #$802867 F486 4A IEVEN LSR A2868 F487 AA TAX2869 F488 BD 5B F5 LDA MODE,X2870 F48B B0 04 BCS RTMODE2871 F48D 4A LSR A2872 F48E 4A LSR A2873 F48F 4A LSR A2874 F490 4A LSR A2875 F491 29 0F RTMODE AND #$F2876 F493 D0 04 BNE GETFMT2877 F495 A0 80 ERR LDY #$802878 F497 A9 00 LDA #02879 F499 AA GETFMT TAX2880 F49A BD 9F F5 LDA MODE2,X2881 F49D 8D 16 01 STA FORMA2882 F4A0 29 03 AND #32883 F4A2 85 EA STA LENGTH2884 F4A4 98 TYA ;OPCODE2885 F4A5 29 8F AND #$8F2886 F4A7 AA TAX2887 F4A8 98 TYA ;OPCODE IN A AGAIN2888 F4A9 A0 03 LDY #32889 F4AB E0 8A CPX #$8A2890 F4AD F0 0B BEQ MNNDX32891 F4AF 4A MNNDX1 LSR A2892 F4B0 90 08 BCC MNNDX32893 F4B2 4A LSR A2894 F4B3 4A MNNDX2 LSR A2895 F4B4 09 20 ORA #$202896 F4B6 88 DEY2897 F4B7 D0 FA BNE MNNDX22898 F4B9 C8 INY2899 F4BA 88 MNNDX3 DEY2900 F4BB D0 F2 BNE MNNDX12901 F4BD 48 PHA ;SAVE MNEMONIC TABLE INDEX2902 F4BE 20 56 EB JSR PCLLD2903 F4C1 20 46 EA JSR NUMA2904 F4C4 20 45 F5 JSR PRBL2 ;PRINT LAST BLANK2905 F4C7 68 PLA2906 F4C8 A8 TAY2907 F4C9 B9 B9 F5 LDA MNEML,Y2908 F4CC 8D 17 01 STA LMNEM2909 F4CF B9 F9 F5 LDA MNEMR,Y2910 F4D2 8D 18 01 STA RMNEM2911 F4D5 A2 03 LDX #3 ;MUST BE2912 F4D7 A9 00 PRMN1 LDA #02913 F4D9 A0 05 LDY #52914 F4DB 0E 18 01 PRMN2 ASL RMNEM2915 F4DE 2E 17 01 ROL LMNEM2916 F4E1 2A ROL A2917 F4E2 88 DEY2918 F4E3 D0 F6 BNE PRMN22919 F4E5 69 BF ADC #'?'+$80 ;ADD "?" OFFSET2920 F4E7 20 BC E9 JSR OUTALL2921 F4EA CA DEX2922 F4EB D0 EA BNE PRMN12923 F4ED 20 45 F5 JSR PRBL22924 F4F0 A2 06 LDX #62925 F4F2 A9 00 LDA #02926 F4F4 8D 29 A4 STA STIY+2 ;FLAG2927 F4F7 E0 03 PRADR1 CPX #32928 F4F9 D0 1E BNE PRADR3 ;IF X=3 PRINT ADDR VALUE2929 F4FB A4 EA LDY LENGTH2930 F4FD F0 1A BEQ PRADR3 ;1 BYTE INSTR2931 F4FF AD 16 01 PRADR2 LDA FORMA2932 F502 C9 E8 CMP #$E8 ;RELATIVE ADDRESSING2933 F504 20 56 EB JSR PCLLD2934 F507 B0 27 BCS RELADR2935 F509 ;SE IF SYMBOL2936 F509 48 PHA2937 F50A AD 29 A4 LDA STIY+22938 F50D D0 03 BNE MR11A2939 F50F EE 29 A4 INC STIY+2 ;SHOW WE WERE HERE2940 F5122941 F512 68 MR11A PLA2942 F513 20 46 EA JSR NUMA2943 F516 88 DEY2944 F517 D0 E6 BNE PRADR22945 F519 0E 16 01 PRADR3 ASL FORMA2946 F51C 90 0E BCC PRADR42947 F51E BD AC F5 LDA CHAR1-1,X2948 F521 20 BC E9 JSR OUTALL2949 F524 BD B2 F5 LDA CHAR2-1,X2950 F527 F0 03 BEQ PRADR42951 F529 20 BC E9 JSR OUTALL2952 F52C CA PRADR4 DEX2953 F52D D0 C8 BNE PRADR12954 F52F 60 RTS2955 F530 20 4D F5 RELADR JSR PCADJ32956 F533 AA TAX2957 F534 E8 INX2958 F535 D0 01 BNE PRNTXY2959 F537 C8 INY2960 F538 98 PRNTXY TYA2961 F539 4C 42 EA JMP WRAX ;PRINT A &X2962 F53C AD 26 A4 PRPC LDA SAVPC+1 ;PRINT PC2963 F53F AE 25 A4 LDX SAVPC2964 F542 20 42 EA JSR WRAX2965 F545 A9 20 PRBL2 LDA #' '2966 F547 4C BC E9 JMP OUTALL2967 F54A A5 EA LDA LENGTH2968 F54C 38 SEC2969 F54D AC 26 A4 PCADJ3 LDY SAVPC+1 ;PRG CNTR HIGH2970 F550 AA TAX2971 F551 10 01 BPL PCADJ42972 F553 88 DEY2973 F554 6D 25 A4 PCADJ4 ADC SAVPC ;PROG CNTR LOW2974 F557 90 01 BCC RTS12975 F559 C8 INY2976 F55A 60 RTS1 RTS2977 F55B2978 F55B 40024503D008MODE .DB $40,2,$45,3,$D0,8,$40,92978 F561 40092979 F563 30224533D008 .DB $30,$22,$45,$33,$D0,8,$40,92979 F569 40092980 F56B 40024533D008 .DB $40,2,$45,$33,$D0,8,$40,92980 F571 40092981 F573 400245B3D008 .DB $40,2,$45,$B3,$D0,8,$40,92981 F579 40092982 F57B 00224433D08C .DB 0,$22,$44,$33,$D0,$8C,$44,02982 F581 44002983 F583 11224433D08C .DB $11,$22,$44,$33,$D0,$8C,$44,$9A2983 F589 449A2984 F58B 10 22 44 33 .DB $10,$22,$44,$332985 F58F D0 08 40 09 .DB $D0,8,$40,92986 F593 10224433D008 .DB $10,$22,$44,$33,$D0,8,$40,92986 F599 40092987 F59B 62 13 78 A9 .DB $62,$13,$78,$A92988 F59F2989 F59F 002101020080MODE2 .DB 0,$21,1,2,0,$80,$59,$4D2989 F5A5 594D2990 F5A7 1112064A051D .DB $11,$12,6,$4A,5,$1D2991 F5AD2992 F5AD 2C292C23282ECHAR1 .DB ",",$29,",#(","."2993 F5B3 590058000041CHAR2 .DB "Y",0,"X",0,0,"A"2994 F5B92995 F5B9 1C8A1C235D8BMNEML .DB $1C,$8A,$1C,$23,$5D,$8B,$1B2995 F5BF 1B2996 F5C0 A1 .DB $A12997 F5C1 9D8A1D239D8B .DB $9D,$8A,$1D,$23,$9D,$8B,$1D,$A12997 F5C7 1DA12998 F5C9 002919AE69A8 .DB 0,$29,$19,$AE,$69,$A8,$19,$232998 F5CF 19232999 F5D1 24531B232453 .DB $24,$53,$1B,$23,$24,$53,$19,$A12999 F5D7 19A13000 F5D9 001A5B5BA569 .DB 0,$1A,$5B,$5B,$A5,$69,$24,$243000 F5DF 24243001 F5E1 AEAEA8AD2900 .DB $AE,$AE,$A8,$AD,$29,0,$7C,03001 F5E7 7C003002 F5E9 159C6D9CA569 .DB $15,$9C,$6D,$9C,$A5,$69,$29,$533002 F5EF 29533003 F5F1 84133411A569 .DB $84,$13,$34,$11,$A5,$69,$23,$A03003 F5F7 23A03004 F5F93005 F5F9 D8625A482662MNEMR .DB $D8,$62,$5A,$48,$26,$62,$943005 F5FF 943006 F600 88 .DB $883007 F601 5444C8546844 .DB $54,$44,$C8,$54,$68,$44,$E8,$943007 F607 E8943008 F609 00B4088474B4 .DB 0,$B4,8,$84,$74,$B4,$28,$6E3008 F60F 286E3009 F611 74F4CC4A72F2 .DB $74,$F4,$CC,$4A,$72,$F2,$A4,$8A3009 F617 A48A3010 F619 00AAA2A27474 .DB 0,$AA,$A2,$A2,$74,$74,$74,$723010 F61F 74723011 F621 4468B232B200 .DB $44,$68,$B2,$32,$B2,0,$22,03011 F627 22003012 F629 1A1A26267272 .DB $1A,$1A,$26,$26,$72,$72,$88,$C83012 F62F 88C83013 F631 C4CA26484444 .DB $C4,$CA,$26,$48,$44,$44,$A2,$C83013 F637 A2C83014 F6393015 F639 ;*******************************3016 F639 ;*** AIM TEXT EDITOR ***3017 F639 ;*** 05/01/78 ***3018 F639 ;*******************************3019 F6393020 F639 ; R=READ FROM ANY INPUT DEVICE3021 F639 ; I=INSERT A LINE FROM INPUT DEV3022 F639 ; K=DELETE A LINE3023 F639 ; U-GO UP ONE LINE3024 F639 ; D=GO DOWN ONE LINE3025 F639 ; L=LIST LINES TO OUTPUT DEV3026 F639 ; T=GO TO TOP OF TEXT3027 F639 ; B=GO TO BOTTOM OF TEXT3028 F639 ; F=FIND STRING3029 F639 ; C=CHANGE STRING TO NEW STRING3030 F639 ; Q=QUIT EDITOR3031 F639 ; =DISPLAY CURRENT LINE3032 F6393033 F639 ;***** E COMMAND-EDITOR ENTRY (FROM MONITOR) *****3034 F639 20 13 EA EDIT JSR CRLOW3035 F63C A0 6C LDY #EMSG1-M13036 F63E 20 AF E7 JSR KEP ;START UP MSG3037 F641 20 13 EA JSR CRLOW3038 F644 20 A3 E7 EDI0 JSR FROM3039 F647 B0 FB BCS EDI03040 F649 AD 1E A4 LDA CKSUM ;IS CLR IF ADDR WAS INPUTTED3041 F64C F0 03 BEQ *+53042 F64E 20 DB E2 JSR WRITAZ ;OUTPUT DEFAULT ADDR (0200)3043 F651 A2 01 LDX #13044 F653 BD 1C A4 EDI1 LDA ADDR,X3045 F656 95 E3 STA TEXT,X3046 F658 95 E1 STA BOTLN,X3047 F65A 9D 1A A4 STA S1,X ;FOR MEMORY TEST3048 F65D CA DEX3049 F65E 10 F3 BPL EDI13050 F660 20 3B E8 JSR BLANK23051 F663 20 A7 E7 EDI2 JSR TO ;END3052 F666 B0 FB BCS EDI23053 F668 20 BC F8 JSR TOPNO ;TRANSF TEXT TO ADDR FOR RAM CHECK3054 F66B AD 1E A4 LDA CKSUM ;IS CLR IF ADDR WAS INPUTTED3055 F66E F0 10 BEQ EDI4 ;BRNCH IF NOT DEFAULT VALUE3056 F670 20 34 F9 JSR SAVNOW3057 F673 20 B6 F6 EDI3 JSR EDI ;CARRY IS SET IF NO RAM THERE3058 F676 90 FB BCC EDI33059 F678 A9 00 LDA #0 ;SET UPPER LIMIT TO BEGINNING...3060 F67A 8D 1C A4 STA ADDR ;OF PAGE3061 F67D 20 DB E2 JSR WRITAZ ;OUTPUT DEFAULT VALUE ,UPPER LIMIT3062 F680 AD 1C A4 EDI4 LDA ADDR3063 F683 85 E5 STA END3064 F685 AD 1D A4 LDA ADDR+13065 F688 85 E6 STA END+13066 F68A 20 34 F9 JSR SAVNOW3067 F68D ;NOW SEE IF MEMORY IS THERE3068 F68D 20 B6 F6 EDI5 JSR EDI3069 F690 90 FB BCC EDI53070 F692 A5 E6 LDA END+1 ;CMP WITH END3071 F694 CD 1D A4 CMP ADDR+13072 F697 F0 11 BEQ EDI73073 F699 B0 13 BCS EDI83074 F69B 20 BC F8 EDI6 JSR TOPNO ;RESTORE NOWLN3075 F69E A9 00 LDA #03076 F6A0 91 DF STA (NOWLN),Y ;END OF TEXT MARKER3077 F6A2 20 13 EA JSR CRLOW3078 F6A5 A9 52 LDA #'R' ;FORCE READ COMMAND3079 F6A7 4C 8D FA JMP ENTRY3080 F6AA A5 E5 EDI7 LDA END ;IF ZERO MEM IS OKAY3081 F6AC F0 ED BEQ EDI63082 F6AE A9 00 EDI8 LDA #03083 F6B0 8D 1C A4 STA ADDR3084 F6B3 4C 33 EB JMP MEMERR ;NO MEMORY FOR THOSE LIMITS3085 F6B63086 F6B6 A0 00 EDI LDY #0 ;CHCK IF MEMORY WRITES3087 F6B8 20 B7 FE JSR PATCH6 ;GET BYTE ADDR BY ADDR,ADDR+13088 F6BB 48 PHA ;SAVE IT3089 F6BC A9 AA LDA #$AA ;SET THIS PATTERN3090 F6BE 20 78 EB JSR SADDR ;CHCK IT3091 F6C1 D0 09 BNE EDI2B3092 F6C3 68 PLA3093 F6C4 20 78 EB JSR SADDR ;RESTORE CHR3094 F6C7 EE 1D A4 INC ADDR+1 ;NEXT PAG3095 F6CA 18 CLC ;IT WROTE3096 F6CB 60 RTS3097 F6CC 38 EDI2B SEC ;DIDNT WRITE3098 F6CD 68 PLA3099 F6CE 60 RTS3100 F6CF3101 F6CF ;***** T COMMAND-REENTRY EDITOR *****3102 F6CF ;RE-ENTRY POINT,TEXT ALREADY THERE3103 F6CF 20 24 EA REENTR JSR CRCK ; IF PRI ON3104 F6D2 20 BC F8 TP JSR TOPNO ;GO TO TOP3105 F6D5 4C B9 F7 JMP IN03A ;DISPLAY LINE3106 F6D83107 F6D8 ;***** U COMMAND-UP LINE *****3108 F6D8 ;GO UP ONE LINE BUT...3109 F6D8 ;DOWN IN ADDRESSING MEMORY3110 F6D8 20 DB F8 DNNO JSR ATTOP ;THIS RTN DOESNT PRINT3111 F6DB 90 06 BCC DOW1 ;NOT TOP3112 F6DD 20 27 F7 JSR PLNE ;ARE AT TOP3113 F6E0 4C 78 FA JMP ERR03114 F6E3 A0 00 DOW1 LDY #03115 F6E5 20 1D F9 JSR SUB ;DECREMENT NOWLN PAST 3116 F6E8 20 1D F9 DOW2 JSR SUB3117 F6EB 20 DB F8 JSR ATTOP3118 F6EE B0 30 BCS UP43119 F6F0 B1 DF LDA (NOWLN),Y3120 F6F2 C9 0D CMP #CR3121 F6F4 D0 F2 BNE DOW23122 F6F6 4C 28 F9 JMP AD13123 F6F93124 F6F9 ;***** D COMMAND-DOWN LINE *****3125 F6F9 ;GO DOWN ONE LINE BUT...3126 F6F9 ;UP IN ADDRESSING MEMORY3127 F6F9 20 09 F7 UP JSR UPNO3128 F6FC 20 27 F7 JSR PLNE ;DISPLAY LINE & CHCK BOTTOM3129 F6FF 20 E9 F8 JSR ATBOT3130 F702 90 1C BCC UP43131 F704 A0 72 LDY #EMSG2-M1 ;PRINT "END"3132 F706 4C AF E7 JMP KEP3133 F709 A0 00 UPNO LDY #03134 F70B 20 E9 F8 JSR ATBOT3135 F70E 90 03 BCC UP13136 F710 4C 5C FA JMP ENDERR3137 F713 B1 DF UP1 LDA (NOWLN),Y3138 F715 F0 09 BEQ UP43139 F717 C8 INY3140 F718 C9 0D CMP #CR3141 F71A D0 F7 BNE UP13142 F71C 98 TYA3143 F71D 20 2A F9 JSR ADDA ;ADD LENGTH TO CURRENT LINE3144 F720 60 UP4 RTS3145 F7213146 F721 ;***** B COMMAND-GO TO BOTTOM *****3147 F721 20 C5 F8 BT JSR SETBOT3148 F724 ;START U-COMMAND HERE3149 F724 20 D8 F6 DOWN JSR DNNO ;U COMMAND3150 F7273151 F727 ;***** COMMAND-DISPLAY CURRENT LINE *****3152 F727 A0 00 PLNE LDY #0 ;PRINT CURRENT LINE3153 F729 B1 DF P02 LDA (NOWLN),Y3154 F72B F0 0E BEQ P01 ;PAST END ?3155 F72D C9 0D CMP #CR ;DONE?3156 F72F F0 0A BEQ P013157 F731 20 BC E9 JSR OUTALL ;PUT IT SOMEWHERE3158 F734 99 38 A4 STA DIBUFF,Y3159 F737 C8 INY3160 F738 4C 29 F7 JMP P023161 F73B 84 EA P01 STY LENGTH3162 F73D 84 E9 STY OLDLEN3163 F73F AC 13 A4 P03 LDY OUTFLG ;ONE MORE FOR TAPE3164 F742 C0 0D CPY #CR3165 F744 F0 03 BEQ P003166 F746 4C F0 E9 JMP CRLF ;TO OUTPUT DEV3167 F749 4C 24 EA P00 JMP CRCK ;, & DONT CLR DISPL3168 F74C3169 F74C ;***** K COMMAND-KILL LINE *****3170 F74C ;DELETE CURRENT LINE3171 F74C 20 B6 F8 DLNE JSR KIFLG ;CLR K OR I COMM FLG3172 F74F EA NOP3173 F750 EA NOP3174 F751 EA NOP3175 F752 20 27 F7 JSR PLNE3176 F755 20 E9 F8 JSR ATBOT3177 F758 B0 CD BCS PLNE ;AT END OF TEXT3178 F75A A0 00 LDY #03179 F75C 84 EA STY LENGTH3180 F75E 20 3F F9 JSR REPLAC ;KILL LINE3181 F761 4C 27 F7 JMP PLNE3182 F7643183 F764 ;***** I COMMAND-INSERT LINE *****3184 F764 20 6D F7 IN JSR INL3185 F767 20 F9 F6 JSR UP ;DISPLAY NEXT LINE DOWN3186 F76A 4C 78 FA JMP ERR0 ;IF AT BOTTOM PRINT "END"3187 F76D 20 B6 F8 INL JSR KIFLG ;CLR K OR I COMM FLG3188 F770 A0 00 LDY #0 ;GET LINE INTO DIBUFF3189 F772 84 E9 STY OLDLEN3190 F774 20 BD E7 JSR PROMPT3191 F777 20 44 EB JSR CLR3192 F77A 20 93 E9 IN02 JSR INALL3193 F77D 20 F8 FE JSR PATC12 ;CLR, SO WE CAN OUTPUT TO PRI3194 F780 C9 7F CMP #$7F ;RUB3195 F782 4C 2A FF JMP PATC17 ;NO ZEROS IN CASE OF PAPER TAPE3196 F785 C9 0A IN02A CMP #LF3197 F787 F0 F1 BEQ IN023198 F789 C9 0D CMP #CR3199 F78B F0 1B BEQ IN033200 F78D C0 3C CPY #60 ;DO NOT INCR Y IF 603201 F78F B0 08 BCS IN03B3202 F791 99 38 A4 STA DIBUFF,Y3203 F794 C8 INY3204 F795 C0 3C CPY #603205 F797 D0 E1 BNE IN02 ;CONTIN , DISP WONT ALLOW > 60 CHR`3206 F799 A0 3C IN03B LDY #60 ;SET Y TO MAX OF 603207 F79B A9 01 LDA #$013208 F79D 0D 11 A4 ORA PRIFLG ;DO NOT OUTPUT TO PRI ANY MORE3209 F7A0 8D 11 A4 STA PRIFLG ;OTHERWISE CLOBBERS THE BUFFER3210 F7A3 8C 15 A4 STY CURPO23211 F7A6 D0 D2 BNE IN02 ;GO BACK3212 F7A8 84 EA IN03 STY LENGTH3213 F7AA C0 00 CPY #0 ;FIRST CHAR?3214 F7AC D0 17 BNE IN053215 F7AE AD 19 A4 LDA COUNT ;K OR I COMM FLG ?3216 F7B1 D0 12 BNE IN05 ;BRANCH IF C COMMAND3217 F7B3 20 24 EA JSR CRCK ; IF PRI PNTR DIFF FROM 03218 F7B6 20 03 FF JSR PATC13 ;TURN ON TAPES & SET DEFAULT DEV3219 F7B9 20 27 F7 IN03A JSR PLNE ;DISPLAY NEXT LINE DOWN3220 F7BC 20 09 F7 JSR UPNO ;PRINT "END" IF BOTTOM3221 F7BF 20 D8 F6 JSR DNNO3222 F7C2 4C 78 FA JMP ERR03223 F7C5 20 3F F9 IN05 JSR REPLAC ;INSERT THE LINE3224 F7C8 4C 24 EA JMP CRCK ; IF PRI PTR NOT 03225 F7CB3226 F7CB ;***** R COMMAND-READ LINE *****3227 F7CB ;READ TEXT FROM ANY INPUT DEVICE UNTIL3228 F7CB ;TWO CONSECUTIVE ARE ENCOUNTER.3229 F7CB 20 48 E8 INPU JSR WHEREI3230 F7CE AC 12 A4 LDY INFLG ;IF TAPE DO NOT ERRASE BUFFER3231 F7D1 C0 54 CPY #'T'3232 F7D3 F0 03 BEQ INPU13233 F7D5 20 13 EA JSR CRLOW3234 F7D8 20 6D F7 INPU1 JSR INL3235 F7DB 20 09 F7 JSR UPNO ;NEXT LINE3236 F7DE 4C D8 F7 JMP INPU13237 F7E13238 F7E1 ;***** L COMMAND-LIST LINES *****3239 F7E1 ;PRINT FROM HERE N LINES TO ACTIVE OUTPUT DEV3240 F7E1 20 37 E8 LST JSR PSL1 ;PRINT "/"3241 F7E4 20 85 E7 JSR GCNT ;GET LINES COUNT3242 F7E7 20 13 EA JSR CRLOW3243 F7EA 20 71 E8 JSR WHEREO ;WHERE TO3244 F7ED 4C F8 F7 JMP LST02 ;ONE MORE LINE3245 F7F0 20 07 E9 LST01 JSR RCHEK3246 F7F3 20 90 E7 JSR DONE3247 F7F6 F0 0B BEQ LST33248 F7F8 20 27 F7 LST02 JSR PLNE3249 F7FB 20 09 F7 JSR UPNO ;NEXT LINE3250 F7FE 20 E9 F8 JSR ATBOT3251 F801 90 ED BCC LST01 ;NO3252 F803 20 3F F7 LST3 JSR P03 ;ONE MORE CRLF FOR TAPE3253 F806 20 0D FF JSR PATC14 ;CLOSE TAPE IF NEEDED3254 F809 4C 5C FA JMP ENDERR3255 F80C3256 F80C ;***** F COMMAND-FIND STRING *****3257 F80C ;FIND STRING AND PRINT LINE TO TERMINAL3258 F80C 20 1E F8 FCHAR JSR FCH3259 F80F AD 15 A4 FCHA1 LDA CURPO2 ;SAVE BUFFER PNTR3260 F812 48 PHA3261 F813 20 44 EB JSR CLR ;CLEAR DISP PNTR3262 F816 20 27 F7 JSR PLNE3263 F819 68 PLA3264 F81A 8D 15 A4 STA CURPO23265 F81D 60 RTS3266 F81E ;FIND A CHARACTER STRING3267 F81E A0 00 FCH LDY #03268 F820 20 BD E7 JSR PROMPT3269 F823 20 5F E9 FC1 JSR RDRUP ;GET THE CHARACTER3270 F826 C9 0D CMP #CR ;REUSE OLD ARGUMENT??3271 F828 D0 0A BNE FC33272 F82A C0 00 CPY #0 ;FIRST CHAR?3273 F82C D0 06 BNE FC33274 F82E 20 09 F7 FC2 JSR UPNO ;NEXT LINE DOWN3275 F831 4C 49 F8 JMP FC53276 F834 C9 0D FC3 CMP #CR ;DONE3277 F836 F0 0B BEQ FC43278 F838 99 EB 00 STA STRING,Y3279 F83B C8 INY3280 F83C C0 14 CPY #20 ;MAX LENGTH3281 F83E D0 E3 BNE FC13282 F840 4C 72 FA JMP ERROR3283 F843 20 24 EA FC4 JSR CRCK ;CLEAR DISPLAY3284 F846 8C 29 A4 STY STIY+2 ;COUNT OF CHARACTERS3285 F849 A0 00 FC5 LDY #03286 F84B 8C 15 A4 STY CURPO2 ;START AT BEGINNING OF LINENTR IS3287 F84E AC 15 A4 FC6 LDY CURPO2 ;CLOBBER3288 F851 A2 00 LDX #03289 F853 B1 DF FC7 LDA (NOWLN),Y ;GET THE CHARACTER3290 F855 D0 03 BNE FC8 ;NOT AT END3291 F857 4C 5C FA JMP ENDERR3292 F85A C9 0D FC8 CMP #CR ;END OF LINE3293 F85C F0 D0 BEQ FC23294 F85E D5 EB CMP STRING,X3295 F860 F0 06 BEQ FC93296 F862 EE 15 A4 INC CURPO23297 F865 4C 4E F8 JMP FC63298 F868 C8 FC9 INY3299 F869 E8 INX3300 F86A EC 29 A4 CPX STIY+2 ;DONE?3301 F86D D0 E4 BNE FC73302 F86F 60 RTS3303 F8703304 F870 ;***** Q COMMAND-EXIT EDITOR *****3305 F870 ; EXIT THE TEXT EDITOR NEATLY3306 F870 20 13 EA STOP JSR CRLOW3307 F873 4C A1 E1 JMP COMIN3308 F8763309 F876 ;***** C COMMAND-CHANGE STRING *****3310 F876 ;CHANGE STRING TO ANOTHER STRING IN A LINE3311 F876 20 B2 F8 CHNG JSR CFLG ;SET C COMMAND FLG3312 F879 20 0C F8 JSR FCHAR ;FIND CORRECT LINE3313 F87C 20 3C E9 CHN1 JSR READ ;IS IF OK3314 F87F C9 0D CMP #CR3315 F881 F0 09 BEQ CHN23316 F883 20 2E F8 JSR FC2 ;TRY NEXT ONE3317 F886 20 0F F8 JSR FCHA1 ; SHOW LINE3318 F889 4C 7C F8 JMP CHN13319 F88C AD 29 A4 CHN2 LDA STIY+2 ;GET CHAR COUNT3320 F88F 85 E9 STA OLDLEN ;GET READY FOR REPLAC3321 F891 AD 15 A4 LDA CURPO2 ;PNTR TO BEGINNING OF STRING3322 F894 48 PHA ;SAVE IT3323 F895 20 2A F9 JSR ADDA ;ADD TO NOWLN (LINE PNTR)3324 F898 20 44 EB JSR CLR ;CLEAR DISP3325 F89B A0 05 LDY #M3-M1 ;PRINT "TO"3326 F89D 20 AF E7 JSR KEP3327 F8A0 A0 00 LDY #03328 F8A2 20 7A F7 JSR IN02 ;GET NEW STRING & REPLAC3329 F8A5 68 PLA3330 F8A6 AA TAX3331 F8A7 F0 06 BEQ CHN43332 F8A9 20 1D F9 CHN3 JSR SUB ;RESTORE NOWLN WHERE IT WAS3333 F8AC CA DEX3334 F8AD D0 FA BNE CHN33335 F8AF 4C 27 F7 CHN4 JMP PLNE ;DISPLAY THE CHANGED LINE3336 F8B23337 F8B2 ;THE FOLLOWING ARE SUBROUTINES USED BY COMMANDS3338 F8B2 A9 01 CFLG LDA #1 ;SET FLG FOR C COMMAND3339 F8B4 D0 02 BNE KI23340 F8B6 A9 00 KIFLG LDA #0 ;CLR K OR I COMMAND FLG3341 F8B8 8D 19 A4 KI2 STA COUNT3342 F8BB 60 RTS3343 F8BC3344 F8BC A5 E3 TOPNO LDA TEXT ;SET CURRENT LINE TO TOP3345 F8BE A6 E4 LDX TEXT+13346 F8C0 85 DF TPO1 STA NOWLN3347 F8C2 86 E0 STX NOWLN+13348 F8C4 60 RTS3349 F8C53350 F8C5 A5 E1 SETBOT LDA BOTLN ;SET CURRENT LINE TO BOTTOM3351 F8C7 A6 E2 LDX BOTLN+13352 F8C9 85 E7 STA SAVE3353 F8CB 86 E8 STX SAVE+13354 F8CD 4C C0 F8 JMP TPO13355 F8D03356 F8D0 AD 1C A4 RESNOW LDA ADDR ;RESTORE CURRENT LINE ADDRESS3357 F8D3 85 DF STA NOWLN3358 F8D5 AD 1D A4 LDA ADDR+13359 F8D8 85 E0 STA NOWLN+13360 F8DA 60 RTS3361 F8DB3362 F8DB ; SEE IF CURRENT LINE AT TOP (C SET IF SO)3363 F8DB A5 DF ATTOP LDA NOWLN3364 F8DD C5 E3 CMP TEXT3365 F8DF D0 16 BNE AT013366 F8E1 A5 E0 LDA NOWLN+13367 F8E3 C5 E4 CMP TEXT+13368 F8E5 D0 10 BNE AT013369 F8E7 38 SEC3370 F8E8 60 RTS3371 F8E93372 F8E9 ; SEE IF CURRENT LINE AT BOTTOM (C SET IF SO)3373 F8E9 A5 DF ATBOT LDA NOWLN3374 F8EB A6 E0 LDX NOWLN+13375 F8ED C5 E1 CMP BOTLN3376 F8EF D0 06 BNE AT013377 F8F1 E4 E2 CPX BOTLN+13378 F8F3 D0 02 BNE AT013379 F8F5 38 AT02 SEC3380 F8F6 60 RTS3381 F8F7 18 AT01 CLC3382 F8F8 60 RTS3383 F8F93384 F8F9 ;SEE IF WE RAN PAST END OF BUFFER LIMIT3385 F8F9 A5 E1 ATEND LDA BOTLN3386 F8FB A6 E2 LDX BOTLN+13387 F8FD E4 E6 CPX END+1 ;HIGH BYTE > OR = ?3388 F8FF 90 F6 BCC AT013389 F901 D0 F2 BNE AT023390 F903 C5 E5 CMP END ;LOW BYTE > OR = ?3391 F905 90 F0 BCC AT013392 F907 B0 EC BCS AT023393 F9093394 F909 ; SAVE CURRENT LINE (NEWLN) IN S13395 F909 A5 DF NOWS1 LDA NOWLN3396 F90B A6 E0 LDX NOWLN+13397 F90D 4C 16 F9 JMP ADDS1A3398 F9103399 F910 ; MOVE ADDR INTO S13400 F910 AD 1C A4 ADDRS1 LDA ADDR3401 F913 AE 1D A4 LDX ADDR+13402 F916 8D 1A A4 ADDS1A STA S13403 F919 8E 1B A4 STX S1+13404 F91C 60 RTS3405 F91D3406 F91D ; SUBTRACT ONE FROM CURRENT LINE (NOWLN)3407 F91D C6 DF SUB DEC NOWLN3408 F91F A5 DF LDA NOWLN3409 F921 C9 FF CMP #$FF3410 F923 D0 02 BNE SUB13411 F925 C6 E0 DEC NOWLN+13412 F927 60 SUB1 RTS3413 F9283414 F928 ; ADD ACC TO CURRENT LINE (NOWLN)3415 F928 A9 01 AD1 LDA #13416 F92A 18 ADDA CLC3417 F92B 65 DF ADC NOWLN3418 F92D 85 DF STA NOWLN3419 F92F 90 02 BCC ADDA13420 F931 E6 E0 INC NOWLN+13421 F933 60 ADDA1 RTS3422 F9343423 F934 A5 DF SAVNOW LDA NOWLN ;SAVE CURRENT LINE INTO ADDR3424 F936 8D 1C A4 STA ADDR3425 F939 A5 E0 LDA NOWLN+13426 F93B 8D 1D A4 STA ADDR+13427 F93E 60 REP2 RTS3428 F93F3429 F93F ;MOVE CURRENT TEXT AROUND TO HAVE3430 F93F ;SPACE TO PUT IN THE NEW BUFFER3431 F93F A4 EA REPLAC LDY LENGTH3432 F941 C4 E9 CPY OLDLEN ;COMPARE OLD AND NEW LENGTHS3433 F943 D0 1A BNE R2W ;BRANCH IF DIFF3434 F945 F0 07 BEQ R87 ;LENGTHS ARE EQUAL. JUST REPLACE3435 F947 A9 0D R8 LDA #CR3436 F949 91 DF STA (NOWLN),Y3437 F94B 20 4A FA JSR GOGO3438 F94E3439 F94E ;LENGTH = OLDLEN3440 F94E 88 R87 DEY3441 F94F C0 FF CPY #$FF3442 F951 F0 EB BEQ REP23443 F953 B9 38 A4 R88 LDA DIBUFF,Y3444 F956 91 DF STA (NOWLN),Y3445 F958 20 4A FA JSR GOGO3446 F95B 88 DEY3447 F95C 10 F5 BPL R883448 F95E 60 RTS3449 F95F B0 6E R2W BCS R100 ;LENGTH > OLDLEN3450 F9613451 F961 ;LENGTH < OLDLEN3452 F961 20 34 F9 JSR SAVNOW ;PUT NOWLN INTO ADDR3453 F964 20 10 F9 JSR ADDRS1 ;PUT IT IN S1 ALSO3454 F967 A5 E9 LDA OLDLEN3455 F969 38 SEC3456 F96A E5 EA SBC LENGTH ;GET DIFFERENCE IN LENGTHS3457 F96C A4 EA LDY LENGTH3458 F96E D0 07 BNE RQP3459 F970 AE 19 A4 LDX COUNT ;C-COMM ?3460 F973 D0 02 BNE RQP ;YES, JUMP3461 F975 69 00 ADC #0 ;INCLUDE 3462 F977 48 RQP PHA3463 F978 18 CLC3464 F979 6D 1A A4 ADC S13465 F97C 8D 1A A4 STA S13466 F97F 90 03 BCC R63467 F981 EE 1B A4 INC S1+13468 F984 A9 1A R6 LDA #S13469 F986 20 58 EB JSR LDAY3470 F989 91 DF STA (NOWLN),Y ;...AND NOVE IT UP (DOWN IN ADDR)3471 F98B 20 4A FA JSR GOGO3472 F98E AA TAX3473 F98F AD 1A A4 LDA S13474 F992 C5 E1 CMP BOTLN ;DONE ??3475 F994 D0 07 BNE R53476 F996 AD 1B A4 LDA S1+13477 F999 C5 E2 CMP BOTLN+13478 F99B F0 0E BEQ R73479 F99D 20 28 F9 R5 JSR AD13480 F9A0 EE 1A A4 INC S13481 F9A3 D0 03 BNE R553482 F9A5 EE 1B A4 INC S1+13483 F9A8 4C 84 F9 R55 JMP R63484 F9AB 20 D0 F8 R7 JSR RESNOW ;RESTORE NOWLN3485 F9AE 68 PLA ;RESTORE DIFFERENCE3486 F9AF 8D 2A A4 STA CPIY ;SAVE IT3487 F9B2 A5 E1 LDA BOTLN3488 F9B4 38 SEC3489 F9B5 ED 2A A4 SBC CPIY ;AND SUBTRACT IT FROM BOTTOM3490 F9B8 85 E1 STA BOTLN3491 F9BA B0 02 BCS R93492 F9BC C6 E2 DEC BOTLN+13493 F9BE AD 19 A4 R9 LDA COUNT ;C COMM OR K ,I COMM ?3494 F9C1 D0 04 BNE R103495 F9C3 A4 EA LDY LENGTH3496 F9C5 D0 05 BNE R113497 F9C7 A4 EA R10 LDY LENGTH3498 F9C9 D0 83 BNE R873499 F9CB 60 RTS3500 F9CC 4C 47 F9 R11 JMP R83501 F9CF3502 F9CF ;LENGTH > OLDLEN3503 F9CF A5 EA R100 LDA LENGTH ;NEW LINE IS LONGER3504 F9D1 38 SEC3505 F9D2 E5 E9 SBC OLDLEN3506 F9D4 A4 E9 LDY OLDLEN3507 F9D6 D0 02 BNE R101 ;ALREADY HAVE ROOM FOR CR3508 F9D8 69 00 ADC #0 ;ADD ONE TO DIFFERENCE3509 F9DA 48 R101 PHA3510 F9DB 20 34 F9 JSR SAVNOW ;NOWLN INTO S13511 F9DE 20 C5 F8 JSR SETBOT3512 F9E1 A0 00 LDY #03513 F9E3 B1 DF R102 LDA (NOWLN),Y3514 F9E5 C9 00 CMP #03515 F9E7 F0 06 BEQ R1083516 F9E9 20 28 F9 JSR AD13517 F9EC 4C E3 F9 JMP R1023518 F9EF 68 R108 PLA3519 F9F0 48 PHA3520 F9F1 18 CLC3521 F9F2 65 E1 ADC BOTLN ;ADD DIFFERENCE TO END3522 F9F4 85 E1 STA BOTLN ;STORE NEW END3523 F9F6 90 02 BCC R1033524 F9F8 E6 E2 INC BOTLN+13525 F9FA 20 F9 F8 R103 JSR ATEND3526 F9FD 90 0B BCC R1073527 F9FF A5 E7 LDA SAVE ;RESTORE OLD BOTTOM3528 FA01 85 E1 STA BOTLN3529 FA03 A5 E8 LDA SAVE+13530 FA05 85 E2 STA BOTLN+13531 FA07 4C 5C FA JMP ENDERR ;RAN PAST BUFFER END3532 FA0A 20 09 F9 R107 JSR NOWS1 ;SAVE CURRENT END3533 FA0D 68 PLA3534 FA0E 18 CLC3535 FA0F 65 DF ADC NOWLN3536 FA11 85 DF STA NOWLN3537 FA13 90 02 BCC R1043538 FA15 E6 E0 INC NOWLN+13539 FA17 A9 1A R104 LDA #S13540 FA19 20 58 EB JSR LDAY3541 FA1C 91 DF STA (NOWLN),Y3542 FA1E 20 4A FA JSR GOGO3543 FA21 AD 1A A4 LDA S13544 FA24 CD 1C A4 CMP ADDR3545 FA27 D0 08 BNE R1053546 FA29 AD 1B A4 LDA S1+13547 FA2C CD 1D A4 CMP ADDR+1 ;BACK WHERE WE STARTED ??3548 FA2F F0 13 BEQ R106 ;BRANCH IF DONE3549 FA31 20 1D F9 R105 JSR SUB3550 FA34 CE 1A A4 DEC S13551 FA37 AD 1A A4 LDA S13552 FA3A C9 FF CMP #$FF3553 FA3C D0 03 BNE R10513554 FA3E CE 1B A4 DEC S1+13555 FA41 4C 17 FA R1051 JMP R1043556 FA44 20 D0 F8 R106 JSR RESNOW3557 FA47 4C BE F9 JMP R93558 FA4A3559 FA4A ;SEE IF IT WROTE INTO MEMORY3560 FA4A D1 DF GOGO CMP (NOWLN),Y3561 FA4C F0 0D BEQ GOGO13562 FA4E ;MOVE ADDRESS3563 FA4E A5 DF LDA NOWLN3564 FA50 8D 1C A4 STA ADDR3565 FA53 A5 E0 LDA NOWLN+13566 FA55 8D 1D A4 STA ADDR+13567 FA58 4C 33 EB JMP MEMERR3568 FA5B 60 GOGO1 RTS ;OK3569 FA5C3570 FA5C 20 44 EB ENDERR JSR CLR ;CLEAR PNTR3571 FA5F A0 72 LDY #EMSG2-M1 ;PRINT "END"3572 FA61 20 AF E7 JSR KEP3573 FA64 20 D8 F6 JSR DNNO ;BACK UP TO LAST LINE3574 FA67 20 42 E8 JSR TTYTST ;IF TTY 3575 FA6A D0 03 BNE ENDE23576 FA6C 20 13 EA JSR CRLOW3577 FA6F 4C 78 FA ENDE2 JMP ERR03578 FA72 20 FE E8 ERROR JSR LL3579 FA75 20 D4 E7 JSR QM3580 FA78 20 44 EB ERR0 JSR CLR3581 FA7B A2 FF LDX #$FF3582 FA7D COM =ERR03583 FA7D 9A TXS3584 FA7E 20 FE E8 JSR LL ;I/O TO TERMINAL (KB,D/P OR TTY)3585 FA81 D8 CLD3586 FA82 20 88 FA JSR COMM3587 FA85 4C 78 FA JMP ERR03588 FA883589 FA88 ;GET EDITOR COMMANDS & DECODE3590 FA88 A2 00 COMM LDX #03591 FA8A 20 BC FE JSR PATCH8 ;READ A CHAR WITH "=< >"3592 FA8D A2 0B ENTRY LDX #COMCN13593 FA8F DD AC FA CD02 CMP COMTBL,X ;COMPARE WITH ALLOWABLE COMMANDS3594 FA92 F0 0C BEQ CFND1 ;MATCH ,SO PROCESS COMMAND3595 FA94 CA DEX3596 FA95 10 F8 BPL CD023597 FA97 20 D4 E7 JSR QM ;NOT IN LIST ,SO NOT LEGAL COMMAND3598 FA9A 20 24 EA JSR CRCK3599 FA9D 4C 78 FA JMP ERR03600 FAA0 20 17 FF CFND1 JSR PATC15 ; & START DECODING COMMAND3601 FAA3 BD B9 FA LDA JTBL+1,X3602 FAA6 8D 1B A4 STA S1+13603 FAA9 6C 1A A4 JMP (S1)3604 FAAC3605 FAAC COMCN1 =113606 FAAC ;COMMAND TABLE3607 FAAC 4B2052495544COMTBL .DB "K RIUDLTBFQC"3607 FAB2 4C54424651433608 FAB8 4CF727F7CBF7JTBL .DW DLNE,PLNE,INPU,IN,DOWN,UP3608 FABE 64F724F7F9F63609 FAC4 E1F7D2F621F7 .DW LST,TP,BT,FCHAR,STOP,CHNG3609 FACA 0CF870F876F83610 FAD03611 FAD0 ;READ FROM MEMORY FOR ASSEMBLER3612 FAD0 98 MREAD TYA3613 FAD1 48 PHA3614 FAD2 A0 00 LDY #03615 FAD4 B1 DF LDA (NOWLN),Y3616 FAD6 8D 2A A4 STA CPIY3617 FAD9 20 28 F9 JSR AD13618 FADC 68 PLA3619 FADD A8 TAY3620 FADE AD 2A A4 LDA CPIY3621 FAE1 60 RTS3622 FAE23623 FAE2 ;THIS PROGRAM CONVERS MNEMONIC INSTRUCTIONS INTO MACHINE3624 FAE2 ;CODE AND STORES IT IN THE DESIGNATED MEMORY AREA3625 FAE23626 FAE2 ;ROM TABLE LOCATIONS:3627 FAE2 00020008F2FFTYPTR1 .DB 00,02,00,08,$F2,$FF,$80,013627 FAE8 80013628 FAEA C0E2C0C0FF00 .DB $C0,$E2,$C0,$C0,$FF,00,003628 FAF0 003629 FAF1 0800108040C0TYPTR2 .DB 08,00,$10,$80,$40,$C0,00,$C03629 FAF7 00C03630 FAF9 00400000E420 .DB $00,$40,00,00,$E4,$20,$803630 FAFF 803631 FB00 00FC000808F8CORR .DB 00,$FC,00,08,08,$F8,$FC,$F43631 FB06 FCF43632 FB08 0C1004F40020 .DB $0C,$10,04,$F4,00,$20,$103632 FB0E 103633 FB0F 00000F010101SIZEM .DB 00,00,$0F,01,01,01,$11,$113633 FB15 11113634 FB17 020211110212 .DB 02,02,$11,$11,02,$12,003634 FB1D 003635 FB1E3636 FB1E 000810182028STCODE .DB $00,$08,$10,$18,$20,$28,$30,$383636 FB24 30383637 FB26 404850586068 .DB $40,$48,$50,$58,$60,$68,$70,$783637 FB2C 70783638 FB2E 80889098ACA8 .DB $80,$88,$90,$98,$AC,$A8,$B0,$B83638 FB34 B0B83639 FB36 CCC8D0D8ECE8 .DB $CC,$C8,$D0,$D8,$EC,$E8,$F0,$F83639 FB3C F0F83640 FB3E 0C2C4C4C8CAC .DB $0C,$2C,$4C,$4C,$8C,$AC,$CC,$EC3640 FB44 CCEC3641 FB46 8A9AAABACADA .DB $8A,$9A,$AA,$BA,$CA,$DA,$EA,$FA3641 FB4C EAFA3642 FB4E 0E2E4E6E8EAE .DB $0E,$2E,$4E,$6E,$8E,$AE,$CE,$EE3642 FB54 CEEE3643 FB56 0D2D4D6D8DAD .DB $0D,$2D,$4D,$6D,$8D,$AD,$CD,$ED3643 FB5C CDED3644 FB5E 0D0D0C0D0E0DTYPTB .DB 13,13,12,13,14,13,12,133644 FB64 0C0D3645 FB66 0D0D0C0D0D0D .DB 13,13,12,13,13,13,12,133645 FB6C 0C0D3646 FB6E 0F0D0C0D090D .DB 15,13,12,13,9,13,12,133646 FB74 0C0D3647 FB76 080D0C0D080D .DB 8,13,12,13,8,13,12,133647 FB7C 0C0D3648 FB7E 0F060B0B040A .DB 15,6,11,11,4,10,8,83648 FB84 08083649 FB86 0D0D0D0D0D0F .DB 13,13,13,13,13,15,13,153649 FB8C 0D0F3650 FB8E 070707070509 .DB 7,7,7,7,5,9,3,33650 FB94 03033651 FB96 010101010201 .DB 1,1,1,1,2,1,1,13651 FB9C 01013652 FB9E3653 FB9E ;PROGRAM STARTS HERE3654 FB9E AD 25 A4 MNEENT LDA SAVPC ;TRANSF PC TO ADDR3655 FBA1 8D 1C A4 STA ADDR3656 FBA4 AD 26 A4 LDA SAVPC+13657 FBA7 8D 1D A4 STA ADDR+13658 FBAA 20 24 EA STARTM JSR CRCK ; IF PRI PTR DIFF FROM 03659 FBAD A9 00 LDA #03660 FBAF 8D 37 A4 STA CODFLG3661 FBB2 20 3E E8 JSR BLANK3662 FBB5 20 DB E2 JSR WRITAZ ;WRITE ADDRESS3663 FBB8 20 3B E8 JSR BLANK23664 FBBB 20 3B E8 JSR BLANK23665 FBBE 4C 06 FE JMP MNEM ;JUMP TO INPUT MNEMONIC OPCODE3666 FBC1 A9 00 MODEM LDA #00 ;SET UP TO FORM MODE MATCH3667 FBC3 8D 26 01 STA TMASK13668 FBC6 8D 27 01 STA TMASK23669 FBC9 20 3E E8 JSR BLANK3670 FBCC AC 2E 01 LDY TYPE3671 FBCF 38 SEC3672 FBD0 6E 26 01 PNTLUP ROR TMASK1 ;SHIFT POINTER TO INSTRUCTION TYPE3673 FBD3 6E 27 01 ROR TMASK23674 FBD6 88 DEY3675 FBD7 D0 F7 BNE PNTLUP3676 FBD93677 FBD9 ;TEST FOR ONE BYTE INSTRUCTION3678 FBD9 AC 2E 01 LDY TYPE3679 FBDC C0 0D CPY #$0D3680 FBDE D0 05 BNE RDADDR3681 FBE0 A2 00 LDX #003682 FBE23683 FBE2 ;INPUT ADRESS FIELD3684 FBE2 4C CB FC JMP OPCOMP3685 FBE5 A0 06 RDADDR LDY #06 ;CLEAR ADDRESS FIELD (NON HEX)3686 FBE7 A9 51 LDA #'Q'3687 FBE9 99 32 01 CLRLUP STA ADFLD-1,Y3688 FBEC 88 DEY3689 FBED D0 FA BNE CLRLUP ;(LEAVES Y = 0 FOR NEXT PHASE)3690 FBEF 20 5F E9 JSR RDRUP ;WITH RUBOUT3691 FBF2 C9 20 CMP #' ' ;IGNORE SPACE CHARACTERS3692 FBF4 F0 EF BEQ RDADDR3693 FBF6 99 33 01 STORCH STA ADFLD,Y ;STORE ADDRESS CHARACTER3694 FBF9 C8 INY3695 FBFA C0 07 CPY #073696 FBFC B0 5C BCS TRY563697 FBFE 20 5F E9 JSR RDRUP ;READ REMAINDER OF ADDRESS CHARS3698 FC01 C9 20 CMP #' ' ;THRU WHEN OR 3699 FC03 D0 05 BNE STOR13700 FC05 EE 37 A4 INC CODFLG ;SET CODE FLG3701 FC08 D0 04 BNE EVAL3702 FC0A C9 0D STOR1 CMP #CR ;CHECK FOR 3703 FC0C D0 E8 BNE STORCH3704 FC0E3705 FC0E ;SEPARATE ADDRESS MODE FROM ADDRESS FIELD3706 FC0E 8C 31 A4 EVAL STY TEMPX ;TEMPX NOW HAS NUMBER OF CHAR3707 FC11 AD 33 01 LDA ADFLD ;CHECK FIRST CHAR FOR # OR (3708 FC14 C9 23 CMP #'#'3709 FC16 F0 25 BEQ HATCJ3710 FC18 C9 28 CMP #'('3711 FC1A F0 5A BEQ PAREN3712 FC1C AD 31 A4 LDA TEMPX ;CHECK FOR ACCUMULATOR MODE3713 FC1F C9 01 CMP #013714 FC21 D0 05 BNE TRYZP3715 FC23 A2 01 ACCUM LDX #013716 FC25 4C CB FC JMP OPCOMP3717 FC28 C9 02 TRYZP CMP #02 ;CHECK FOR ZERO PAGE MODE3718 FC2A D0 14 BNE TRY343719 FC2C AD 2E 01 LDA TYPE ;CHCK FOR BRNCH WITH RELATIVE ADDR`3720 FC2F C9 0C CMP #$0C3721 FC31 D0 05 BNE ZPAGE3722 FC33 A2 02 LDX #023723 FC35 4C CB FC JMP OPCOMP3724 FC38 A2 05 ZPAGE LDX #053725 FC3A 4C CB FC JMP OPCOMP3726 FC3D 4C B6 FC HATCJ JMP HATCH3727 FC40 A9 04 TRY34 LDA #04 ;CHECK FOR ABSOLUTE OR ZP,X ORZP,`3728 FC42 CD 31 A4 CMP TEMPX3729 FC45 90 15 BCC ABSIND3730 FC47 A2 02 LDX #023731 FC49 20 F1 FD JSR XORYZ ;CC = X, CS = Y, NE = ABSOLUTE3732 FC4C D0 58 BNE ABSOL3733 FC4E 90 05 BCC ZPX3734 FC50 A2 03 ZPY LDX #03 ;CARRY SET SO ZP,Y MODE3735 FC52 4C CB FC JMP OPCOMP3736 FC55 A2 04 ZPX LDX #04 ;CARRY CLEAR SO ZP,X MODE3737 FC57 4C CB FC JMP OPCOMP3738 FC5A B0 69 TRY56 BCS ERRORM3739 FC5C 20 EF FD ABSIND JSR XORY ;CC=ABS,X CS=ABS,Y NE=ERROR3740 FC5F D0 64 BNE ERRORM3741 FC61 90 0F BCC ABSX3742 FC63 A9 09 ABSY LDA #093743 FC65 CD 2E 01 CMP TYPE3744 FC68 D0 04 BNE ABSY13745 FC6A A2 0E LDX #$0E3746 FC6C D0 5D BNE OPCOMP3747 FC6E A2 08 ABSY1 LDX #$083748 FC70 D0 59 BNE OPCOMP3749 FC72 A2 09 ABSX LDX #09 ;CARRY CLEAR SO ABS,X MODE3750 FC74 D0 55 BNE OPCOMP3751 FC76 AD 36 01 PAREN LDA ADFLD+3 ;SEE IF (HH,X),(HH)Y OR (HHHH)3752 FC79 C9 2C CMP #',' ;(HHX) (HH),Y ARE OK TOO3753 FC7B F0 04 BEQ INDX ;COMMA IN 4TH POSITION = (HH,X)3754 FC7D C9 58 CMP #'X' ;X IN 4TH POSITION = (HHX)3755 FC7F D0 04 BNE TRYINY3756 FC81 A2 0B INDX LDX #$0B3757 FC83 D0 46 BNE OPCOMP3758 FC85 C9 29 TRYINY CMP #')' ;")" IN 4TH POS = (HH)Y OR (HH),Y3759 FC87 D0 0B BNE TRYJMP3760 FC89 20 EF FD JSR XORY ;CHCK TO SEE IF Y INDEX REG DESIRE3761 FC8C D0 37 BNE ERRORM3762 FC8E 90 35 BCC ERRORM3763 FC90 A2 0A LDX #$0A3764 FC92 D0 37 BNE OPCOMP3765 FC94 AD 38 01 TRYJMP LDA ADFLD+5 ;CHECK FOR FINAL PAREN3766 FC97 C9 29 CMP #')'3767 FC99 D0 2A BNE ERRORM3768 FC9B AD 2E 01 LDA TYPE ;CONFIRM CORRECT ADDRESS TYPE3769 FC9E C9 0B CMP #$0B3770 FCA0 D0 23 BNE ERRORM3771 FCA2 A2 0D LDX #$0D ;OK, FORM IS JMP (HHHH)3772 FCA4 D0 25 BNE OPCOMP3773 FCA6 AD 2E 01 ABSOL LDA TYPE ;CHECK FOR BRANCH TO ABSOLUTE LOC3774 FCA9 C9 0C CMP #$0C3775 FCAB D0 05 BNE ABSOL13776 FCAD A2 02 LDX #023777 FCAF 4C CB FC JMP OPCOMP3778 FCB2 A2 0C ABSOL1 LDX #$0C3779 FCB4 D0 15 BNE OPCOMP3780 FCB6 ;SELECT IMMEDIATE ADDRESSING TYPE3781 FCB6 AD 2E 01 HATCH LDA TYPE3782 FCB9 C9 01 CMP #013783 FCBB F0 04 BEQ IMMED13784 FCBD A2 07 LDX #073785 FCBF D0 0A BNE OPCOMP3786 FCC1 A2 06 IMMED1 LDX #063787 FCC3 D0 06 BNE OPCOMP3788 FCC5 20 94 E3 ERRORM JSR CKER00 ;OUTPUT ERROR MESSAGE3789 FCC8 4C AA FB JMP STARTM3790 FCCB3791 FCCB ;COMPUTE FINAL OP CODE FOR DEFINED ADDRESING MODE3792 FCCB BD E2 FA OPCOMP LDA TYPTR1,X ;MATCH TYPE MASK WITH VALID MODE3793 FCCE F0 05 BEQ OPCMP1 ;PATTERNS & SKIP 1ST WORD TEST IF3794 FCD0 2D 26 01 AND TMASK1 ;ALREADY ZERO3795 FCD3 D0 08 BNE VALID3796 FCD5 BD F1 FA OPCMP1 LDA TYPTR2,X ;TEST 2ND PART3797 FCD8 2D 27 01 AND TMASK2 ;INST DOES NOT HAVE SPECIFIED MODE3798 FCDB F0 E8 BEQ ERRORM3799 FCDD 18 VALID CLC ;FORM FINAL OP CODE3800 FCDE BD 00 FB LDA CORR,X3801 FCE1 6D 34 A4 ADC OPCODE3802 FCE4 8D 34 A4 STA OPCODE3803 FCE73804 FCE7 ;PROCESS ADRESSES TO FINAL FORMAT3805 FCE7 BD 0F FB LDA SIZEM,X ;OBTAIN ADDRESS FORMAT FROM TABLE3806 FCEA C9 00 CMP #003807 FCEC F0 50 BEQ ONEBYT3808 FCEE C9 0F CMP #$0F ;NEED BRANCH COMPUTATION?3809 FCF0 F0 1D BEQ BRNCHC3810 FCF2 8D 33 A4 STA TEMPA ;SAVE START POINT & CHAR COUNT3811 FCF5 29 0F AND #$0F ;SEPARATE CHARACTER COUNT3812 FCF7 A8 TAY ;LOAD ADDR BYTES INTO Y (0,1,OR 2)3813 FCF8 8D 2F A4 STA BYTESM ;SAVE IN BYTES3814 FCFB EE 2F A4 INC BYTESM ;TO INSTR LENGTH (1,2,OR 3 BYTES)3815 FCFE AD 33 A4 LDA TEMPA ;SEPARATE STARTING POINT3816 FD01 29 F0 AND #$F03817 FD03 4A LSR A3818 FD04 4A LSR A3819 FD05 4A LSR A3820 FD06 4A LSR A3821 FD07 AA TAX ;AND PUT IT IN X3822 FD08 20 12 FD JSR CONVRT ;CONVERT ASCII ADDRESS TO HEX3823 FD0B B0 B8 BCS ERRORM ;SKIP OUT IF ERROR IN INPUT3824 FD0D 90 1D BCC STASH3825 FD0F 4C 86 FD BRNCHC JMP BRCOMP3826 FD123827 FD12 ;############ SUBROUTINE ###############3828 FD12 ;CONVERT FORMATTED ADDRESS INTO PROPER HEX ADDRESS3829 FD12 BD 33 01 CONVRT LDA ADFLD,X ;PICK UP 1ST ADDRES CHARACTER3830 FD15 20 7D EA JSR HEX ;CONVERT TO MOST SIG HEX3831 FD18 B0 11 BCS ERRFLG3832 FD1A E8 INX ;GET NEXT ASCII CHARACTER3833 FD1B BD 33 01 LDA ADFLD,X3834 FD1E E8 INX ;POINT TO NEXT CHARACTER, IF ANY3835 FD1F 20 84 EA JSR PACK3836 FD22 B0 07 BCS ERRFLG3837 FD24 99 34 A4 STA OPCODE,Y ;SAVE IN MOST SIG. BYTE LOCATION3838 FD27 88 DEY ;SET UP FOR NEXT ADDR BYTE, IF ANY3839 FD28 D0 E8 BNE CONVRT ;IF NECESSARY, FORM NEXT ADDR BYTE3840 FD2A 18 CLC3841 FD2B 60 ERRFLG RTS ;NON HEX CLEARED CARRY3842 FD2C ;#############3843 FD2C3844 FD2C AC 2F A4 STASH LDY BYTESM ;SET UP TO STORE COMMAND3845 FD2F 88 DEY3846 FD30 B9 34 A4 STSHLP LDA OPCODE,Y3847 FD33 20 78 EB JSR SADDR ;STORE ONE BYTE OF COMMAND3848 FD36 C0 00 CPY #003849 FD38 F0 0B BEQ FORMDS3850 FD3A 88 DEY3851 FD3B B8 CLV3852 FD3C 50 F2 BVC STSHLP ;REPEAT TILL THRU3853 FD3E3854 FD3E A9 01 ONEBYT LDA #01 ;SET BYTES = 13855 FD40 8D 2F A4 STA BYTESM3856 FD43 D0 E7 BNE STASH3857 FD453858 FD45 ;FORMAT FOR SYSTEM 65 DISPLAY (REFORMAT FOR AIM)3859 FD45 20 44 EB FORMDS JSR CLR3860 FD48 20 DD E5 JSR CGPC1 ;ADDR TO SAVPC FOR DISASSEMBLY3861 FD4B 20 42 E8 JSR TTYTST ;IF TTY DO NOT GO TO DISASS3862 FD4E D0 08 BNE FORMD13863 FD50 20 3B E8 JSR BLANK2 ;IT IS TTY3864 FD53 20 3B E8 JSR BLANK23865 FD56 D0 11 BNE FORMD2 ;OUTPUT OPCODE3866 FD58 20 6C F4 FORMD1 JSR DISASM3867 FD5B 20 24 EA JSR CRCK ; IF PRI PTR DIFF FROM 03868 FD5E AD 37 A4 LDA CODFLG ;SEE IF HE WANTS CODE ALSO3869 FD61 F0 1A BEQ FORM13870 FD63 20 3E E8 JSR BLANK3871 FD66 20 3C F5 JSR PRPC ;PROG CNTR3872 FD69 ;OUTPUT OPCODE3873 FD69 AE 2F A4 FORMD2 LDX BYTESM3874 FD6C A0 00 LDY #003875 FD6E A9 1C DISPLY LDA #ADDR ;DO LDA (ADDR),Y ,WHITOUT PAG 03876 FD70 20 58 EB JSR LDAY3877 FD73 20 46 EA JSR NUMA3878 FD76 20 3E E8 JSR BLANK3879 FD79 C8 INY3880 FD7A CA DEX3881 FD7B D0 F1 BNE DISPLY3882 FD7D3883 FD7D ;POINT TO NEXT INSTRUCTION LOCATION3884 FD7D AC 2F A4 FORM1 LDY BYTESM ;ADD BYTESM TO ADDR3885 FD80 20 CD E2 JSR NXTADD3886 FD83 4C 24 FF JMP PATC16 ;UPDATE PC3887 FD863888 FD86 ;RELATIVE BRANCH ADDRESS COMPUTATION3889 FD86 AD 31 A4 BRCOMP LDA TEMPX3890 FD89 C9 02 CMP #02 ;IF REL BRANCH INPUT, USE IT3891 FD8B D0 11 BNE COMPBR3892 FD8D A2 00 LDX #003893 FD8F A0 01 LDY #013894 FD91 20 12 FD JSR CONVRT3895 FD94 B0 40 BCS ERRJMP3896 FD96 A9 02 LDA #023897 FD98 8D 2F A4 STA BYTESM ;SET PROPER BYTES3898 FD9B 4C 2C FD JMP STASH3899 FD9E A2 00 COMPBR LDX #003900 FDA0 A0 02 LDY #023901 FDA2 20 12 FD JSR CONVRT3902 FDA5 B0 2F BCS ERRJMP3903 FDA7 AD 1D A4 LDA ADDR+1 ;ADD BRANCH OFFSET3904 FDAA 8D 27 01 STA MOVAD+13905 FDAD AD 1C A4 LDA ADDR3906 FDB0 18 CLC3907 FDB1 69 02 ADC #023908 FDB3 8D 26 01 STA MOVAD3909 FDB6 90 03 BCC CMPBR13910 FDB8 EE 27 01 INC MOVAD+13911 FDBB 38 CMPBR1 SEC ;COMPUTE BRANCH RELATIVE ADDRESS3912 FDBC AD 35 A4 LDA OPCODE+13913 FDBF ED 26 01 SBC MOVAD3914 FDC2 8D 35 A4 STA OPCODE+13915 FDC5 AD 36 A4 LDA OPCODE+23916 FDC8 ED 27 01 SBC MOVAD+13917 FDCB 8D 36 A4 STA OPCODE+23918 FDCE C9 00 CMP #003919 FDD0 F0 0E BEQ FORWRD3920 FDD2 C9 FF CMP #$FF3921 FDD4 F0 03 BEQ BACKWD3922 FDD6 4C C5 FC ERRJMP JMP ERRORM3923 FDD9 AD 35 A4 BACKWD LDA OPCODE+1 ;CHECK IN RANGE3924 FDDC 30 09 BMI OK3925 FDDE 10 F6 BPL ERRJMP3926 FDE0 AD 35 A4 FORWRD LDA OPCODE+13927 FDE3 10 02 BPL OK3928 FDE5 30 EF BMI ERRJMP3929 FDE7 A9 02 OK LDA #02 ;SET UP FOR STASH3930 FDE9 8D 2F A4 STA BYTESM3931 FDEC 4C 2C FD JMP STASH3932 FDEF3933 FDEF ;###### SUBROUTINE ########3934 FDEF ;SUBROUTINE FOR DETERMINING X OR Y OR NEITHER3935 FDEF A2 04 XORY LDX #043936 FDF1 BD 33 01 XORYZ LDA ADFLD,X3937 FDF4 C9 2C CMP #','3938 FDF6 D0 04 BNE XORY13939 FDF8 E8 INX3940 FDF9 BD 33 01 LDA ADFLD,X3941 FDFC C9 58 XORY1 CMP #'X'3942 FDFE F0 03 BEQ ISX3943 FE00 C9 59 CMP #'Y'3944 FE02 XORYRT3945 FE02 60 RTS ;NOT ZERO IS NOT X OR NOT Y3946 FE03 18 ISX CLC ;CARRY SET IS Y3947 FE04 90 FC BCC XORYRT ; CARRY CLEAR IS X3948 FE06 ;####### END OF SUB ########3949 FE063950 FE06 ; INPUT FOR MNEMONIC CODE3951 FE06 A0 00 MNEM LDY #003952 FE08 8C 34 A4 STY OPCODE3953 FE0B 8C 35 A4 STY OPCODE+13954 FE0E 8C 36 A4 STY OPCODE+2 ;CLEARS OPCODE FOR NEW INPUT3955 FE11 8C 26 01 STY MOVAD ;CLEARS UNUSED BIT IN FINAL FORMAT3956 FE14 20 5F E9 RDLUP JSR RDRUP3957 FE17 C9 2A CMP #'*' ;COMMAND TO LOAD POINTER3958 FE19 F0 58 BEQ STLOAD ;GO TO SET CURRENT ADDRESS POINTER3959 FE1B C9 20 CMP #' ' ;IGNORE SPACE BAR INPUT3960 FE1D F0 F5 BEQ RDLUP3961 FE1F 29 1F AND #$1F ;MASK OFF UPPER 3 BITS3962 FE21 99 30 01 STA CH,Y3963 FE24 98 TYA3964 FE25 AA TAX ;Y----> X3965 FE26 FE 30 01 INC CH,X ;FORMAT TO MATCH DISASSEMBLER TBL3966 FE29 C8 INY3967 FE2A C0 03 CPY #03 ;REPEAT FOR EACH OF 3 CHARACTERS3968 FE2C D0 E6 BNE RDLUP3969 FE2E3970 FE2E ;COMPRESS 3 FORMATED CHARACTERS TO MOVAD & MOVAD+13971 FE2E A0 03 LDY #03 ;SET UP OUTER LOOP3972 FE30 B9 2F 01 OUTLUP LDA CH-1,Y ;COMPRESS 3 CHARACTERS3973 FE33 A2 05 LDX #05 ;SET UP INNER LOOP3974 FE35 4A INLUP LSR A ;SHIFT 5 BITS ACC TO MOVAD,MOVAD+13975 FE36 6E 26 01 ROR MOVAD3976 FE39 6E 27 01 ROR MOVAD+13977 FE3C CA DEX3978 FE3D D0 F6 BNE INLUP3979 FE3F 88 DEY3980 FE40 D0 EE BNE OUTLUP3981 FE423982 FE42 ;SEARCH FOR MATCHING COMPRESSED CODE3983 FE42 A2 40 LDX #$403984 FE44 AD 26 01 SRCHLP LDA MOVAD3985 FE47 DD B8 F5 SRCHM CMP MNEML-1,X ;MATCH LEFT HALF3986 FE4A F0 05 BEQ MATCH3987 FE4C CA DEX3988 FE4D D0 F8 BNE SRCHM ;IF NO - TRY AGAIN3989 FE4F F0 0B BEQ MATCH13990 FE51 AD 27 01 MATCH LDA MOVAD+1 ;ALSO MATCH RIGHT HALF3991 FE54 DD F8 F5 CMP MNEMR-1,X3992 FE57 F0 06 BEQ GOTIT3993 FE59 CA DEX3994 FE5A D0 E8 BNE SRCHLP3995 FE5C 4C C5 FC MATCH1 JMP ERRORM3996 FE5F3997 FE5F ;GET INSTRUCTION TYPE FROM TYPE TABLE3998 FE5F BD 5D FB GOTIT LDA TYPTB-1,X3999 FE62 8D 2E 01 STA TYPE4000 FE654001 FE65 ;GET OPCODE FROM OP CODE UE4002 FE65 BD 1D FB LDA STCODE-1,X4003 FE68 8D 34 A4 STA OPCODE4004 FE6B 4C C1 FB JMP MODEM4005 FE6E4006 FE6E ;THIS SECTION SETS THE CURRENT ADDRESS POINTER4007 FE6E A9 2A STLO LDA #'*'4008 FE70 20 7A E9 JSR OUTPUT4009 FE73 20 AE EA STLOAD JSR ADDIN ;GET ADDR4010 FE76 B0 F6 BCS STLO ;IN CASE OF ERROR4011 FE78 4C 24 FF JMP PATC16 ;ADDR TO PC THEN TO STARTM4012 FE7B4013 FE7B ;PATCHES TO CORRECT PROBLEMS WITHOUT4014 FE7B ;CHANGING ENTRY POINTS TO THE ROUTINES4015 FE7B 41 .DB "A"4016 FE7C 38 PATCH1 SEC ;ADJUST BAUD4017 FE7D E9 2C SBC #444018 FE7F 8D 18 A4 STA CNTL304019 FE82 60 RTS4020 FE834021 FE83 8A CUREAD TXA ;SAVE X , OUTPUT CUR4022 FE84 48 PHA4023 FE85 AE 15 A4 LDX CURPO24024 FE88 E0 14 CPX #20 ;ONLY IF < 204025 FE8A B0 05 BCS PAT2A4026 FE8C A9 DE LDA #$DE4027 FE8E 20 7B EF JSR OUTDD14028 FE91 68 PAT2A PLA4029 FE92 AA TAX4030 FE93 4C 3C E9 JMP READ ;CONTINUE4031 FE964032 FE96 20 3C E9 RED1 JSR READ ;READ & ECHO WITHOUT CURSOR4033 FE99 4C 76 E9 JMP RED24034 FE9C4035 FE9C AE 15 A4 PATCH4 LDX CURPO2 ;DONT DO ANYTHING IF "8D"4036 FE9F C9 8D CMP #CR+$80 ;SO FOR TV & NOT FOR DISP4037 FEA1 D0 0B BNE PAT4A4038 FEA3 A9 A0 LDA #' '+$80 ;CLR CURSOR4039 FEA5 20 7B EF JSR OUTDD14040 FEA8 20 44 EB JSR CLR ;CLR PNTRS4041 FEAB 4C 76 EF JMP OUTD7 ;EXIT4042 FEAE 4C 17 EF PAT4A JMP OUTD1A ;CONTINUE4043 FEB14044 FEB1 8D 11 A4 PATCH5 STA PRIFLG ;TURN PRI OFF4045 FEB4 4C 73 F0 JMP IPO34046 FEB74047 FEB7 A9 1C PATCH6 LDA #ADDR ;SIMULATE LDA (ADDR),Y4048 FEB9 4C 58 EB JMP LDAY4049 FEBC4050 FEBC 20 3C E9 PATCH8 JSR READ ;READ & ECHO WITH CARROTS4051 FEBF 48 PHA4052 FEC0 20 D8 E7 JSR EQUAL4053 FEC3 A9 3C LDA #'<'4054 FEC5 20 7A E9 JSR OUTPUT4055 FEC8 68 PLA4056 FEC9 48 PHA4057 FECA C9 0D CMP #CR4058 FECC F0 03 BEQ PATC8C4059 FECE 20 7A E9 JSR OUTPUT4060 FED1 A9 3E PATC8C LDA #'>'4061 FED3 20 7A E9 JSR OUTPUT4062 FED6 68 PLA4063 FED7 60 RTS4064 FED84065 FED8 C9 F7 PATCH9 CMP #$F7 ;CHCK LOWER TRANSITION OF TIMER4066 FEDA B0 06 BCS PAT9A4067 FEDC CD 08 A4 CMP TSPEED4068 FEDF 4C 9D EE JMP CKF3A4069 FEE2 CD 08 A4 PAT9A CMP TSPEED4070 FEE5 68 PLA4071 FEE6 C9 FF CMP #$FF4072 FEE8 60 PAT9B RTS4073 FEE94074 FEE9 20 F0 E9 PATC10 JSR CRLF ;CLR DISP (ONLY 1 )4075 FEEC 4C 85 E1 JMP STA14076 FEEF4077 FEEF F0 F7 PATC11 BEQ PAT9B ;GO OUTPUT PROMPT4078 FEF1 C9 4C CMP #'L' ;NO PROMPT FOR "T" OR "L"4079 FEF3 F0 F3 BEQ PAT9B4080 FEF5 4C C5 E7 JMP PROMP14081 FEF84082 FEF8 48 PATC12 PHA ;CLEAR PRIFLG SO WE CAN OUTPUT4083 FEF9 AD 11 A4 LDA PRIFLG ;TO PRINTER IF FLG WAS ON (MSB)4084 FEFC 29 F0 AND #$F04085 FEFE 8D 11 A4 STA PRIFLG4086 FF01 68 PLA4087 FF02 60 RTS4088 FF034089 FF03 AD 12 A4 PATC13 LDA INFLG ;TURN TAPES ON ONLY IF TAPES4090 FF06 C9 54 CMP #'T'4091 FF08 D0 DE BNE PAT9B4092 FF0A 4C 29 E5 JMP DU14 ;TURN ON TAPES & SET DEF DEV4093 FF0D4094 FF0D AD 13 A4 PATC14 LDA OUTFLG ;TURN ON TAPES ONLY IF TAPES4095 FF10 C9 54 CMP #'T'4096 FF12 D0 D4 BNE PAT9B4097 FF14 4C 0A E5 JMP DU114098 FF174099 FF17 20 F0 E9 PATC15 JSR CRLF ;DECODE COMMAND4100 FF1A 8A TXA ;SAVE INDEX4101 FF1B 0A ASL A4102 FF1C AA TAX4103 FF1D BD B8 FA LDA JTBL,X ;PART OF ENTRY4104 FF20 8D 1A A4 STA S14105 FF23 60 RTS4106 FF244107 FF24 20 DD E5 PATC16 JSR CGPC1 ;ADDR TO PC4108 FF27 4C AA FB JMP STARTM ;BACK TO MNEMONIC START4109 FF2A4110 FF2A F0 0E PATC17 BEQ PAT17B ;RUB, SO READ ANOTHER4111 FF2C C9 00 CMP #04112 FF2E F0 03 BEQ PAT17A4113 FF30 4C 85 F7 JMP IN02A ;NEITHER ,CONTINUE4114 FF33 20 93 E9 PAT17A JSR INALL ;SKIP ON ZEROS4115 FF36 C9 7F CMP #$7F ;UNTILL RUB4116 FF38 D0 F9 BNE PAT17A4117 FF3A 4C 7A F7 PAT17B JMP IN02 ;GO BACK4118 FF3D4119 FF3D 20 F8 FE PATC18 JSR PATC12 ;RESET PRIFLG4120 FF40 48 PHA4121 FF41 20 42 E8 JSR TTYTST ;IF TTY JUST RTN4122 FF44 D0 02 BNE PAT18A4123 FF46 68 PLA4124 FF47 60 RTS4125 FF48 20 FE E8 PAT18A JSR LL ;SET TO LOW SPEED4126 FF4B 20 45 F0 JSR IPST ;PRINT WHAT IS IN BUFFER4127 FF4E 20 44 EB JSR CLR ;CLR PRINTER BUFFER BY OUTPUTTING4128 FF51 20 3E E8 JSR BLANK ;AN SPACE4129 FF54 20 44 EB JSR CLR4130 FF57 68 PLA ;RTN ACC4131 FF58 60 RTS4132 FF594133 FF59 D8 PAT19 CLD4134 FF5A 20 24 EA JSR CRCK4135 FF5D 4C 85 E1 JMP STA14136 FF604137 FF60 F0 0D PAT20 BEQ VECK4 ;END (DATA BYTES=0)4138 FF62 18 CLC4139 FF63 69 04 ADC #44140 FF65 AA TAX4141 FF66 20 93 E9 VECK5 JSR INALL ;SKIP OVER DATA4142 FF69 CA DEX4143 FF6A D0 FA BNE VECK54144 FF6C 4C 9E E6 JMP VECK1 ;PROCESS NEXT RCD4145 FF6F 4C 20 E5 VECK4 JMP DU134146 FF724147 FF72 A0 00 PAT21 LDY #04148 FF74 B9 88 FF PAT21A LDA POMSG,Y ;RESET MSG4149 FF77 F0 06 BEQ PAT21B4150 FF79 20 7A E9 JSR OUTPUT4151 FF7C C8 INY4152 FF7D D0 F5 BNE PAT21A4153 FF7F 20 F0 E9 PAT21B JSR CRLF4154 FF82 20 F0 E9 JSR CRLF4155 FF85 4C 82 E1 JMP START4156 FF884157 FF88 2020524F434BPOMSG .DB " ROCKWELL AIM 65"4157 FF8E 57454C4C2041494D2036354158 FF99 00 .DB 04159 FF9A4160 FF9A EE 68 01 PAT22 INC BLKO4161 FF9D 4C BD ED JMP ADDBK14162 FFA04163 FFA0 A9 FF PAT23 LDA #$FF ;START TIMER4164 FFA2 8D 97 A4 STA DI10244165 FFA5 AD 85 A4 PAT23A LDA RINT ;TIME OUT?4166 FFA8 30 08 BMI PAT23B ;YES4167 FFAA AD 0D A8 LDA IFR ;START SIGNAL?4168 FFAD 29 10 AND #MPRST4169 FFAF F0 F4 BEQ PAT23A ;NO4170 FFB1 60 RTS ;YES4171 FFB2 A9 00 PAT23B LDA #0 ;TIME OUT RETURN4172 FFB4 60 RTS4173 FFB54174 FFB5 20 75 EE PATC24 JSR CKFREQ ;READ BIT FROM FOURTH HALF PULSE4175 FFB8 6A ROR A4176 FFB9 29 80 AND #$804177 FFBB 60 RTS4178 FFBC4179 FFBC 2C 0D A8 PATC25 BIT IFR ;WAIT TILL TIMES OUT4180 FFBF 50 FB BVC PATC254181 FFC1 AD 04 A8 LDA T1L ;CLR INTERRUPT FLG4182 FFC4 60 RTS4183 FFC54184 FFF9 *=$FFF94185 FFF9 ;INTERRUPT VECTORS4186 FFF9 FA .DB $FA4187 FFFA 75E0BFE078E0 .DW NMIV1,RSET,IRQV1 ;SET UP VECTORS4188 10000 ;.END A0/14189 10000 SEMICOLON =$3B4190 10000 BACKSLASH =$5C4191 10000 .END M1Label Value Label Value Label Value------------------ ------------------ ------------------ASSEM D000 ADFLD 0133 ADDR A41CACR A80B ADDS1 E55D ADD1 E565ADDIN EAAE ADDNE EAB1 ADDN1 EAB7ADDN2 EAC7 ADDN3 EADC ADDN4 EAE8ADDN5 EAF7 ADDN6 EAFD ADDN7 EB0DADDN8 EB2B ADDBLK EDBA ADDBK1 EDBDATTOP F8DB ATBOT F8E9 AT02 F8F5AT01 F8F7 ATEND F8F9 ADDRS1 F910ADDS1A F916 AD1 F928 ADDA F92AADDA1 F933 ACCUM FC23 ABSIND FC5CABSY FC63 ABSY1 FC6E ABSX FC72ABSOL FCA6 ABSOL1 FCB2 BASIEN B000BASIRE B003 BOTLN 00E1 BKS 0100BYTESM A42F BKFLG A410 BLK 0115BLKO 0168 BRKA E61B BRK1 E620BKERR E62F BKOK E634 BKO2 E64CBRKK E6E5 BRK3 E6F1 BRK2 E6F3BRK4 E6FA BLANK2 E83B BLANK E83EBKCKSM F1E7 BKCK1 F1F1 BKCK2 F20FBKCK3 F21A BT F721 BRNCHC FD0FBRCOMP FD86 BACKWD FDD9 BACKSLASH 005CCH 0130 CODFLG A437 CURPO2 A415CURPOS A416 CNTH30 A417 CNTL30 A418COUNT A419 CKSUM A41E CPIY A42ACRA AC01 CRB AC03 CR 000DCOMIN E1A1 COMB E1C4 CHNGG E2A0CHNG1 E2A6 CH2 E2B8 CH4 E2C0CH3 E2C5 CKERR E385 CKER0 E38ECKER00 E394 CKER1 E396 CKER2 E3A3CHEKAR E54B CHEKA E54E CGPC E5D4CGPC0 E5D7 CGPC1 E5DD CGPS E5EACGA E5EE CGX E5F2 CGY E5F6CGS E5FA CGALL E5FC CLRBK E6FECKB E76B CKB2 E76D CKB1 E780CRLF E9F0 CRLOW EA13 CR2J EA23CRCK EA24 CRCK1 EA2C CRCK2 EA3BCLR EB44 CLRCK EB4D CKFREQ EE75CKF1 EE7A CKF2 EE81 CKF3 EE99CKF3A EE9D CKF4 EEA1 CKBUFF F1D2CBUFF1 F1E2 COL0 F2E1 COL1 F321COL2 F361 COL3 F3A1 COL4 F3E1CHAR1 F5AD CHAR2 F5B3 CHNG F876CHN1 F87C CHN2 F88C CHN3 F8A9CHN4 F8AF CFLG F8B2 COM FA78COMM FA88 CD02 FA8F CFND1 FAA0COMCN1 000B COMTBL FAAC CORR FB00CLRLUP FBE9 CONVRT FD12 COMPBR FD9ECMPBR1 FDBB CUREAD FE83 DILINK A406DISFLG A40F DIBUFF A438 DRA2 A480DDRA2 A481 DRB2 A482 DDRB2 A483DNPA7 A484 DPPA7 A485 DIV1 A494DIV8 A495 DIV64 A496 DI1024 A497DRB A800 DRAH A801 DDRB A802DDRA A803 DRA A80F DATIN 000EDATOUT 000C DEBTIM 1388 DUMP E43BDU1 E444 DU0 E447 DU1B E452DU1A E46D DU2 E47D DU6 E49FDU7 E4A0 DU8 E4A2 DU9 E4B9DU10 E4DB DU10A E4F8 DU11 E50ADU12 E511 DU13 E520 DU14 E529DUMPTA E56F DUMPT1 E57B DUMPKI E587DUK2 E5A4 DONE E790 DON1 E7A0DELAY EC0F DE1 EC18 DE2 EC1BDEHALF EC23 DEBKEY ED2A DEBK1 ED2CDISASM F46C DNNO F6D8 DOW1 F6E3DOW2 F6E8 DOWN F724 DLNE F74CDISPLY FD6E END 00E5 ENPA7 A486EPPA7 A487 ESCAPE 001B EQS 00BDEMSG1 E06C EMSG2 E072 EQUAL E7D8ERR F495 EDIT F639 EDI0 F644EDI1 F653 EDI2 F663 EDI3 F673EDI4 F680 EDI5 F68D EDI6 F69BEDI7 F6AA EDI8 F6AE EDI F6B6EDI2B F6CC ENDERR FA5C ENDE2 FA6FERROR FA72 ERR0 FA78 ENTRY FA8DEVAL FC0E ERRORM FCC5 ERRFLG FD2BERRJMP FDD6 FORMA 0116 FROM E7A3FNAM E8A2 FCHAR F80C FCHA1 F80FFCH F81E FC1 F823 FC2 F82EFC3 F834 FC4 F843 FC5 F849FC6 F84E FC7 F853 FC8 F85AFC9 F868 FORMDS FD45 FORMD1 FD58FORMD2 FD69 FORM1 FD7D FORWRD FDE0GAP A409 GO E261 GOBK E26DGOBK0 E278 GOBK1 E286 GETID E425GID1 E427 GOERR E608 GCNT E785GCN1 E78C GETTTY EBDB GET1 EBE2GET3 EBED GETKD0 EC38 GETKEY EC40GETKY EC43 GETK0 EC55 GETK00 EC67GETK1 EC71 GETK1B EC80 GETK2 EC82GETK3 EC8D GETK4 EC93 GETK5 ECA4GETK6 ECB9 GETK7 ECBE GETK8 ECBFGETK11 ECC9 GETK12 ECD2 GETK13 ECE1GETK14 ECEB GETK10 ECEC GETTAP EE29GETA1 EE2B GETFMT F499 GOGO FA4AGOGO1 FA5B GOTIT FE5F HISTM A42EHISTP A414 HIST A42E HEX EA7DHATCJ FC3D HATCH FCB6 IRQV4 A400IRQV2 A404 INFLG A412 IBUFM A460IDIR A474 ICOL A475 IOFFST A476IDOT A477 IOUTL A478 IOUTU A479IBITL A47A IBITU A47B IMASK A47CIFR A80D IER A80E IRQV1 E078IRQV3 E154 IRQ1 E163 IRQ2 E17FINCS2 E566 INTAB1 E743 INTAB2 E752INTAB3 E756 INLOW E8F8 INALL E993IPST F045 IPS0 F04A IPO0 F050IPO2 F066 IPO3 F073 IPO4 F078IPSU F0E3 IPS1 F0E8 IPS3 F105IPS2 F10E INCP F121 IEVEN F486IN F764 INL F76D IN02 F77AIN02A F785 IN03B F799 IN03 F7A8IN03A F7B9 IN05 F7C5 INPU F7CBINPU1 F7D8 INDX FC81 IMMED1 FCC1ISX FE03 INLUP FE35 JUMP A47DJMPR E1C1 JD1 E723 JD2 E72BJD3 E73C JD4 E742 JTBL FAB8KEYF1 010C KEYF2 010F KEYF3 0112KMASK A42A KDISA E70A KEP E7AFKEPR E970 KIFLG F8B6 KI2 F8B8LENGTH 00EA LMNEM 0117 LDIY A42ALF 000A LOAD E2E6 LOAD1 E2E9LOAD2 E306 LOAD4 E321 LOAD5 E323LOADTA E32F LOAD1A E349 LOADT2 E364LOADKI E3A4 LOADK1 E3A7 LOADK2 E3AALOADK3 E3B7 LOADK5 E3D1 LOADK6 E3D3LOADK7 E3E8 LL E8FE LT10 EA5ALDAY EB58 LST F7E1 LST01 F7F0LST02 F7F8 LST3 F803 MOVAD 0126MONRAM A400 MON 00C0 MOFF 00E0MPRST 0010 MSP12 0002 MT2 0020M1 E000 M3 E005 M4 E008M5 E01C M6 E021 M7 E024M8 E027 M9 E02A M10 E02DM11 E031 M12 E03B MCM2 E196MCM3 E1AC MCNT 0020 MONCOM E1E5MEM E248 MEIN E24D MEM1 E24FMEM2 E251 MEM3 E260 MEMERR EB33MTBL F2D7 MNNDX1 F4AF MNNDX2 F4B3MNNDX3 F4BA MR11A F512 MODE F55BMODE2 F59F MNEML F5B9 MNEMR F5F9MREAD FAD0 MNEENT FB9E MODEM FBC1MNEM FE06 MATCH FE51 MATCH1 FE5CNOWLN 00DF NMIV2 A402 NPUL A40ANAME A42E NULLC 00FF NMIV1 E075NMIV3 E07B NMI4 E0B1 NMI5 E0B4NXTADD E2CD NXTA1 E2DA NXT5 E60DNHIS E688 NH1 E690 NAMO E8CFNAMO1 E8D6 NAMO2 E8E9 NAMO3 E8EBNAMO4 E8F5 NUMA EA46 NOUT EA51NEWROW F160 NEWCOL F163 NOWS1 F909OLDLEN 00E9 OPCODE A434 OUTFLG A413OUTCKS E531 OUTCK E538 OUTCK1 E53BOUTCK2 E547 OUTLOW E901 OUTL1 E906OUTPUT E97A OUT1 E97B OUT1A E986OUT2 E98F OUTALL E9BC OUTA1 E9C8OUTA2 E9D0 OUTA3 E9E2 OUTA4 E9EAONEKEY ED05 ONEK1 ED09 ONEK2 ED0BONEK3 ED1C ONEK4 ED29 OUTTTY EEA8OUTT1 EECB OUTT2 EEFB OUTDP EEFCOUTDP1 EF02 OUTDIS EF05 OUTD1 EF14OUTD1A EF17 OUTD2 EF20 OUTD2A EF2FOUTD3 EF33 OUTD4 EF48 OUTD5 EF56OUTD7 EF76 OUTDD1 EF7B OUTDD2 EF87OUTDD3 EF8B OUTPRI F000 OUT01 F00FOUT04 F025 OUT05 F033 OUTPR F038OUTPR1 F03A OUTPR2 F044 OP04 F130OP07 F13F OP03 F144 OP05 F150OP06 F15D OUTTAP F24A OUTTA1 F290OUTTA2 F294 OUTTA3 F2B2 OPCOMP FCCBOPCMP1 FCD5 ONEBYT FD3E OK FDE7OUTLUP FE30 PRIFLG A411 PCR A80CPRST 0000 PRTIME 06A4 PRITR E6E1PROMPT E7BD PROMP1 E7C5 PR1 E7CCPR2 E7CF PSLS E7DC PSL0 E7FBPSL00 E802 PSL0A E814 PSL0B E81CPSL0C E81E PSL0D E823 PSL1 E837PACK EA84 PAK1 EA96 PAK2 EA9FPCLLD EB56 PHXY EB9E PLXY EBACPRIERR F079 PRNDOT F087 PRDOT0 F08CPINT F0CB PRMN1 F4D7 PRMN2 F4DBPRADR1 F4F7 PRADR2 F4FF PRADR3 F519PRADR4 F52C PRNTXY F538 PRPC F53CPRBL2 F545 PCADJ3 F54D PCADJ4 F554PLNE F727 P02 F729 P01 F73BP03 F73F P00 F749 PNTLUP FBD0PAREN FC76 PATCH1 FE7C PAT2A FE91PATCH4 FE9C PAT4A FEAE PATCH5 FEB1PATCH6 FEB7 PATCH8 FEBC PATC8C FED1PATCH9 FED8 PAT9A FEE2 PAT9B FEE8PATC10 FEE9 PATC11 FEEF PATC12 FEF8PATC13 FF03 PATC14 FF0D PATC15 FF17PATC16 FF24 PATC17 FF2A PAT17A FF33PAT17B FF3A PATC18 FF3D PAT18A FF48PAT19 FF59 PAT20 FF60 PAT21 FF72PAT21A FF74 PAT21B FF7F POMSG FF88PAT22 FF9A PAT23 FFA0 PAT23A FFA5PAT23B FFB2 PATC24 FFB5 PATC25 FFBCQM E7D4 RMNEM 0118 REGF A40EROLLFL A47F RINT A485 RA AC00RB AC02 RUB 0008 RSET E0BFRS1 E0C9 RS2 E0D4 RS3A E0F1RS3 E0F3 RS3B E11A RS4 E11DRS5 E129 RS6 E13E RS7 E144RS8 E146 REG E227 REG1 E232RBYTE E3FD RBYT1 E407 REGT E6D9RS20 E702 RCHEK E907 RCH2 E91FRCH3 E925 RCHTTY E926 RCHT2 E928RCHT1 E93B READ E93C READ1 E94AREAD2 E94D REA1 E956 RB2 E95CRDRUP E95F RDR1 E96A REDOUT E973RED2 E976 RD2 EA5D RD1 EA70RSPAC EA7B ROONEK ECEF ROO1 ED00RDBIT EE3B RDBIT1 EE43 RDBIT2 EE51RDBIT4 EE67 ROUT F286 ROUT1 F28BROW1 F421 ROW2 F429 ROW3 F431ROW4 F439 ROW5 F441 ROW6 F449ROW7 F451 ROW8 F459 REGQ F461RTMODE F491 RELADR F530 RTS1 F55AREENTR F6CF RESNOW F8D0 REP2 F93EREPLAC F93F R8 F947 R87 F94ER88 F953 R2W F95F RQP F977R6 F984 R5 F99D R55 F9A8R7 F9AB R9 F9BE R10 F9C7R11 F9CC R100 F9CF R101 F9DAR102 F9E3 R108 F9EF R103 F9FAR107 FA0A R104 FA17 R105 FA31R1051 FA41 R106 FA44 RDADDR FBE5RDLUP FE14 RED1 FE96 SAVE 00E7STRING 00EB S1 A41A S2 0106SAVPS A420 SAVA A421 SAVX A422SAVY A423 SAVS A424 SAVPC A425STIY A427 STBKEY A42B SR A80ASP12 0001 SETREG E113 START E182STA1 E185 STBYTE E413 SHOW E64DSH1 E652 SHIS E665 SH11 E66ASEMI E9BA SADDR EB78 SWSTAK EBBASWST1 EBBD SYNC EDFF SYNC1 EE11SETZ F282 SETSPD F2C0 SETSP1 F2CASETSP2 F2D3 STOP F870 SETBOT F8C5SUB F91D SUB1 F927 SAVNOW F934SIZEM FB0F STCODE FB1E STARTM FBAASTORCH FBF6 STOR1 FC0A STASH FD2CSTSHLP FD30 SRCHLP FE44 SRCHM FE47STLO FE6E STLOAD FE73 SEMICOLON 003BTEXT 00E3 TYPE 012E TMASK1 0126TMASK2 0127 TEMPX A431 TEMPA A433TSPEED A408 TIMG A40B TAPIN A434TAPOUT A435 TAPTR A436 TAPTR2 A437TABUFF 0116 TABUF2 00AD T1L A804T1CH A805 T1LL A806 T1LH A807T2L A808 T2H A809 T2I 0000T1I 0000 T1FR 00C0 TMSG0 E048TMSG1 E04D TMSG2 E050 TMSG3 E052TMSG5 E05F TMSG6 E061 TMSG7 E066TOGTA1 E6BD TOGTA2 E6CB TRACE E6DDTOGL E6E7 TOGL1 E6F6 TO E7A7TO1 E7A9 TTYTST E842 TAP1 E8B3TAP2 E8BC TAP3 E8C2 TIBYTE ED3BTIB1 ED48 TIBY1 ED53 TIBY3 ED56TIBY4 ED63 TIBY5 ED65 TIBY5A ED88TIBY6 EDAF TIBY7 EDB0 TAISET EDEATIOSET EE1C TIOS1 EE22 TIOS2 EE24TOBYTE F18B TABY2 F1A7 TABY3 F1CETAOSET F21D TAOS1 F238 TRY F258TP F6D2 TOPNO F8BC TPO1 F8C0TYPTR1 FAE2 TYPTR2 FAF1 TYPTB FB5ETRYZP FC28 TRY34 FC40 TRY56 FC5ATRYINY FC85 TRYJMP FC94 UDRB A000UDRAH A001 UDDRB A002 UDDRA A003UT1L A004 UT1CH A005 UT1LL A006UT1LH A007 UT2L A008 UT2H A009USR A00A UACR A00B UPCR A00CUIFR A00D UIER A00E UDRA A00FUIN 0108 UOUT 010A UP F6F9UPNO F709 UP1 F713 UP4 F720VECKSM E694 VECK1 E69E VECK2 E6ACVALID FCDD VECK5 FF66 VECK4 FF6FWRITAZ E2DB WRITAD E2DD WHEREI E848WHE1 E85C WHE2 E868 WHE3 E870WHEREO E871 WHRO1 E885 WHRO2 E88EWHRO3 E897 WHRO4 E89F WHICHT E8A8WRAX EA42 XORY FDEF XORYZ FDF1XORY1 FDFC XORYRT FE02 ZON F25DZON1 F261 ZON2 F26C ZPAGE FC38ZPY FC50 ZPX FC55tasm: Number of errors = 0AIM 65 MICROCOMPUTER MONITOR PROGRAM LISTINGRockwell InternationalDocument No. 29650 N36LRev. 1, April 1979I used the Telemark Cross Assembler v3.1 (TASM) to re-create the source code.See http://www.halcyon.com/squakvly/I tried to exactly duplicate the original source but some errors may exist. The exceptions are when the original had a hexadecimal constant insteadof an ASCII constant or ASCII equate (especially CR) in some immediatemode instructions; I changed them to ASCII constants or an equate.For example, line 468 in the printed listing is:0468 E185 A9 BC STA1 LDA #$BC ;"<" CHR WITH MSB=1 FOR DISPMy version is:0468 E185 A9 BC STA1 LDA #'<'+$80 ;"<" CHR WITH MSB=1 FOR DISPThe TASM assembler is not the same one that Rockwell used to write thecode, so some assembler directives and opcode formats are different. However, the ASM file uses the same line numbering as the printed listing. That is, line 1000 in the printed listing corresponds to line 1000 in theASM file and line 1000 in the LST file.I could not fully read eight lines in the program listing because I waslooking at a scanned copy, not the original. The rightmost characterswere lost in the binding. These are the lines:0149 HIST =NAME ;FOUR LAST ADDR + NEXT (SINGL STEP)1796 JSR SWSTAK ;SWAP X , Y WITH RTRN ADDR FROM S1804 JSR SWSTAK ;SWAP X , Y WITH RTRN ADDR FROM2159 RDBIT LDA TSPEED ;ARE WE IN C7 OR 5B,5A FREQUENC2262 OUTDP1 JMP (DILINK) ;HERE HE COULD ECHO SOMEWHERE ELSE3205 BNE IN02 ;CONTIN , DISP WONT ALLOW > 60 CHR3719 LDA TYPE ;CHCK FOR BRNCH WITH RELATIVE ADDR3727 TRY34 LDA #04 ;CHECK FOR ABSOLUTE OR ZP,X ORZP,NOTE: I have since been told that the cut-off lines above exist in theoriginal manual.+------------------------------------------------------------------------| TOPIC -- AIM Computer -- AIM BASIC Language Reference Manual +------------------------------------------------------------------------AIM 65 MICROCOMPUTER BASIC LANGUAGE REFERENCE MANUALRockwell International CorporationDocument No 29650 N49March 1979 TABLE OF CONTENTS100 Installing BASIC in the AIM 65200 Getting Started With Basic 201 BASIC Command Set 202 Direct and Indirect Commands 203 Operating on Programs and Lines 204 Printing Data 205 Number Format 206 Variables 207 Relational Tests 208 Looping 209 Matrix Operations 210 Subroutines 211 Entering Data 212 Strings300 Statement Definitions 301 Special Characters 302 Operators 303 Commands 304 Program Statements 305 Input/Output Statements 306 String Functions 307 Arithmetic FunctionsA Error MessagesB Space HintsC Speed HintsD Converting BASIC Programs not Written for AIM 65 BASICE ASCII Character CodesF Assembly Language SubroutinesG Storing AIM 65 BASIC Programs on CassetteH ATN ImplementationINTRODUCTIONBefore a computer can perform any useful function, it must be "told" what to do. Unfortunately,at this time, computers are not capable of understanding English or any other "human" language.This is primarily because our languages are rich with ambiguities and implied meanings. Thecomputer must be told precise instructions and the exact sequence of operations to be performedin order so accomplish any specific task. Therefore, in order to facilitate human communicationwith a computer, programming languages have been developed.Rockwell AIM 65 8K BASIC by Microsoft is a programming language both easily understood andsimple to use. It serves as an excellent "tool" for applications in areas such as business, science,and education. After only a few hours of using BASIC, you will find that you can already writeprograms with an ease that few other computer languages can duplicate.Originally developed at Dartmouth University, the BASIC language has found wide acceptance inthe computer field. Although it is one of the simplest computer languages to use, it is very powerful.BASIC uses a small set of common English words as its "comnmands." Designed specifically as an"interactive" language, you can give a command such as "PRINT 2 + 2," and BASIC will immediatelyreply with "4." It is not necessary to submit a card deck wish your program on it and then waithours for the results. Instead, the full power of the computer is "at your fingertips."We hope that you enjoy BASIC, and are successful in using it to solve all of your programmingproblems.100 INSTALLING BASIC IN THE AIM 65ROM INSTALLATION PROCEDUREBefore handling the BASIC ROM circuits, be sure to observe the precautions outlined in Section 1.4of the AIM 65 User's Guide.To install the ROMs, turn off power to the AIM 65. Inspect the pins on the two BASIC ROMs toensure that they are straight and free of foreign material. While supporting the AIM 65 MasterModule beneath the ROM socket, insert ROM number R3225 into Socket Z25, being careful toobserve the device orientation. Now insert ROM number R3226 into Socket Z26. Be certain thatboth ROM's are completely inserted into their sockets, then turn on power to the AIM 65.ENTERING BASICTo enter and initialize BASIC, type 5 after the monitor prompt is displayed. AIM 65 will respondwith: <5> MEMORY SIZE? ^Type the highest address in memory that is to be allocated to the BASIC program, in decimal. Endthe entry by typing RETURN. BASIC will allocate memory from 530 (212 in hex) through theentered address. If BASIC is to use all available memory, type RETURN without entering anaddress. The highest address is 1024 (400 hex) in the 1K RAM version of AIM 65, and 4096(1000 hex) in the 4K RAM version.BASIC will then ask: WIDTH? ^Type in the output line width of the printer (or any other output device that is being used) and end theinput with RETURN.The entered number may vary from 1 to 255, depending on the output device. If RETURN is typedwithout entering a number, the output line width is set to a default value of 20, which is the columnwidth of the AIM 65 printer.BASIC will respond with: XXXX BYTES FREEwhere XXXX is the number of bytes available for BASIC program, variables, matrix storage, andstring space. If all available memory was allocated, BASIC will reply with: 494 BYTES FREE (for 1K RAM; i.e., 1024-530)or 3566 BYTES FREE (for 4K RAM; i.e., 4096-530)BASIC will display: ^ AIM 65 BASIC Vn.nwhere n.n is the version number.BASIC is now in the command entry mode as indicated by the BASIC prompt (^) in the displaycolumn 1. Subject 201 gets you started into the BASIC commands.Read the following paragraphs first, however, so understand how to exit and reenter the BASICand how the BASIC cursor prompt operates. CAUTION Entering BASIC with the 5 key causes the allocated memory to be initialized with AA (hex) in all bytes, starting with address 532. This, of course, destroys any previous BASIC programs, data in the AIM 65 Editor Text Buffer, or machine level routines that may have been stored in this portion of memory. Be sure to save any desired data or programs that may exist in this area before entering BASIC with the 5 key. Note that text in the Text Buffer or machine level routine may co-exist in memory with BASIC by locating such text or routines in upper memory and entering the highest BASIC address with a value lower than the starting address of such text or routines.EXITING BASICTo escape from BASIC and return to the AIM 65 Monitor, type ESC any time the BASIC commandcursor is displayed. You can also escape BASIC while a program is running, by pressing the F1 key(see Subject 301).Pressing RESET will also cause the AIM 65 Monitor to be entered as well as performing a hardwarereset of AIM 65.REENTERING BASICBASIC may be reentered by typing 6 whenever the AIM 65 Monitor prompt is displayed. In thiscase, however, any existing BASIC program is retained in memory. AIM 65 will respond to aKey 6 entry with: <6> ^6>BASIC CURSORThe BASIC cursor (^), displayed in column 1 whenever BASIC is in the command entry mode,indicates that a BASIC command can be entered. The last displayed data resulting from the previouscommand is retained except for column 1 to provide information continuity with the previouscommand or displayed output data. This is especially helpful when the printer control is turned offto preserve printer paper.When the first character of the next command is typed, the display will blank except for the newlytyped character. The cursor then advances across the display in accordance with typed charactersto indicate the character input position.The displayed cursor does not appear on the printer output, thus any data printed in column 1 willbe retained. CAUTION The minus sign associated with any negative values that are displayed starting in column 1 will be replaced with the cursor in the BASIC command entry mode. In the case of direct commands, the minus sign will only flash before the cursor is displayed if the printer control is on or may not appear at all if the printer control is off. In order to retain the minus sign, a leading blank should be displayed before the value is displayed (see Subject 204).PRINTER CONTROLWhile in the BASIC command entry mode, the printer may be turned on or off by typing PRINTwhile CNTL is pressed (CNTL PRINT). The on/off state of the printer is displayed after typingPRINT.If the printer is turned off, statements in the BASIC command entry mode and data output fromPRINT commands will be directed to the display only. If the printer is turned on, all commandsand data from PRINT commands will be directed to both the printer and display. With the printeroff, data can still be directed to the printer by using the PRINT) command (see Subject 305).Similarly, INPUT statements will output data to the printer in response to the printer control state.An INPUT! statement will output data to the printer even if the printer control is off (seeSubject 305).200 GETTING STARTED WITH BASIC201 BASIC COMMAND SETThis section is not intended to be a detailed course in BASIC programming. It will, however, serveas an excellent introduction for those of you unfamiliar with the language.We recommend that you try each example in this section as it is presented. This will enhance your"feel" for BASIC and how it is used. Table 201-1 lists all the AIM 65 BASIC commands. NOTE Any time the cursor (^) is displayed in column 1 a BASIC command may be typed in. End all commands to BASIC by typing RETURN. The RETURN tells BASIC that you have finished typing the command. If you make an error, type a DEL (RUBOUT on a TTY) to eliminate the last character. Repeated use of DEL will eliminate previous characters. An @ symbol will eliminate that entire line being typed. Table 201.1. AIM 65 BASIC Commands Commands Input/Output -------- ------------ CLEAR DATA CONT GET FRE INPUT LIST POS LOAD PRINT NEW READ PEEK SPC POKE TAB RUN SAVE String Functions ---------------- Program Statements ASC ------------------ CHR$ DEF FN LEFT$ DIM LEN END MID$ FOR RIGHT$ GOSUB STR$ GOTO VAL IF...GOTO IF...THEN LET Arithmetic Functions NEXT -------------------- ON...GOSUB ABS ON...GOTO ATN* REM COS RESTORE EXP RETURN INT STOP LOG USR RND WAIT SIN SGN SQR TAN* Although the ATN function is not included in AIM 65 BASIC, the ATN command is recognized (see Appendix H).202 DIRECT AND INDIRECT COMMANDSDIRECT COMMANDSTry typing in the following: PRINT 10-4 (end with RETURN)BASIC will immediately print: 6The print statement you typed in was executed as soon as you hit the RETURN key. This is calleda direct command. BASIC evaluated the formula after the "PRINT" and then typed out its value,in this case "6".Now try typing in this: PRINT 1/2,3*10 ("*" means multiply, "/" means divide)BASIC will print: .5 30As you can see, BASIC can do division and multiplication as well as subtraction. Note how a ","(comma) was used in the print command to print two values instead of just one. The commanddivides a line into 10-character-wide columns. The comma causes BASIC to skip to the next10-column field on the terminal, where the value 30 is printed.INDIRECT COMMANDSThere is another type of command called an Indirect Command. Every Indirect command beginswith a Line Number. A Line Number is any integer from 0 to 63999.Try typing in these lines: 10 PRINT 2+3 20 PRINT 2-3A sequence of Indirect Commands is called a "Program." Instead of executing indirect statementsimmediately, BASIC saves Indirect Commands in memory. When you type in RUN, BASIC willexecute the lowest numbered indirect statement that has been typed in first, then the next higher,etc., for as many as were typed in.In the example above, we typed in line 10 first and line 20 second. However, it makes no differencein what order you type in indirect statements. BASIC always puts them into correct numerical orderaccording to the Line Number.Suppose we type inRUNBASIC will print: 5 -1203 OPERATING ON PROGRAMS AND LINESIn Subject 202, we typed a two-line program into memory. Now let's see how BASIC can be usedto operate on either or both lines.LISTING A PROGRAMIf we want a listing of the complete program currently in memory, we type in LISTBASIC will reply with: 10 PRINT 2+3 20 PRINT 2-3DELETING A LINESometimes it is desirable to delete a line of a program altogether. This is accomplished by typingthe Line Number of the line so be deleted, followed by a carriage return.Type in the following: 10 LISTBASIC will reply with: 20 PRINT 2-3We have now deleted line 10 from the program.REPLACING A LINEYou can replace line 10, rather than just deleting it, by typing the new line 10 and hittingRETURN.Type in the following: 10 PRINT 3-3 LISTBASIC will reply with: 10 PRINT 3-3 20 PRINT 2-3It is not recommended that lines be numbered consecutively. It may become necessary to insert anew line between two existing lines. An increment of 10 between line numbers is generally sufficient.DELETING A PROGRAMIf you want to delete the complete program currently stored in memory, type in "NEW." If youare finished running one program and are about to read in a new one, be sure to type in "NEW"first.Type in the following: NEWNow type in: LIST204 PRINTING DATAIf is often desirable to include explanatory text along with answers that are printed out.Type in the following: PRINT "ONE HALF EQUALS", 1/2BASIC will reply with: ONE THIRD EOUALS .5As explained in Subject 202, including a "," in a PRINT statement causes it to space over to thenext 10-column field before the value following the "," is printed.If we use a ";" instead of a comma, the next value will be printed immediately following theprevious value. NOTE Numbers are always printed with at least one trailing space. Any text to be printed must always be enclosed in double quotes.Try the following examples:1. PRINT "ONE HALF EQUALS"; 1/2 ONE HALF EQUALS .52. PRINT 1,2,3 1 2 3 ...3. PRINT 1;2;3 1 2 34. PRINT -1;2;-3 -1 2 -3205 NUMBER FORMATWe will digress for a moment to explain the format of numbers in BASIC. Numbers are storedinternally to over nine digits of accuracy. When a number is printed, only nine digits are shown.Every number may also have an exponent (a power of ten scaling factor).The largest number that may be presented in AIM 65 BASIC is 1.70141183*10^38, while thesmallest positive number is 2.93873588*10^-39.When a number is printed, the following rules define the format:1. If the number is negative, a minus sign (-) is printed. If the number is positive, a space is printed.2. If the absolute value of the number is an integer in the range 0 to 999999999, it is printed as an integer.3. If the absolute value of the number is greater than or equal to 0.01 and less than or equal to 999999999, it is printed in fixed point notation, with no exponent.4. If the number does not fall under categories 2 or 3, scientific notation is used.Scientific notation is formatted as follows: SX.XXXXXXXXESTT. (Each X is some integer,0 to 9.)The leading "S" is the sign of the number: a space for a positive number and a "-" forfor a negative one. One non-zero digit is printed before the decimal point. This itfollowed by the decimal point and then the other eight digits of the mantissa. An"E" is then printed (for exponent), followed by the sign (S) of the exponent; thenthe two digits (TT) of the exponent itself. Leading zeroes are never printed; i.e.,the digit before the decimal is never zero. Trailing zeroes are never printed. If thereis only one digit to print after all trailing zeroes are suppressed, no decimal point isprinted. The exponent sign will be "+" for positive and "-" for negative. Twodigits of the exponent are always printed; that is, zeroes are not suppressed in theexponent field. The value of any number expressed thus is the number so the leftof the "E" times 10 raised to the power of the number to the right of the "E".Regardless of what format is used, a space is always printed following a number. BASIC checksto see if the entire number will fit on the current line. If it cannot, a carriage return/line feed isexecuted before printing the number.Following are examples of various numbers and the output format in which BASIC will output them: NUMBER OUTPUT FORMAT ------------- ------------- +1 1 -1 -1 6523 6523 -23.460 -23.46 1E20 1E+20 -12.3456E-7 -1.23456E-06 1.234567E-10 1.23457E-10 1000000000 1E+09 999999999 999999999 .1 .1 .01 .01 .000123 1.23 E-04A number input from the keyboard or a numeric constant used in a BASIC program may have asmany digits as desired, up to the maximum length of a line (72 characters) or maximum numericvalue. However, only the first 10 digits are significant, and tenth digit is rounded up. PRINT 1.23456789876543210 1.2345679206 VARIABLESASSIGNING VARIABLES WITH AN INPUT STATEMENTFollowing is an example of a program that reads a value from the keyboard and uses that value tocalculate and print a result: 10 INPUT R 20 PRINT 3.14159*R*R RUN ?10 314.159Here's what's happening: When BASIC encounters the input statement, it outputs a question mark(?) on the display and then waits for you to type in a number. When you do (in the above example,10 was typed), execution continues with the next statement in the program after the variable (R)has been set (in this case to 10). In the above example, line 20 would now be executed. When theformula after the PRINT statement is evaluated, the value 10 is substituted for the variable R eachtime R appears in the formula. Therefore, the formula becomes 3.14159*10*10, or 314.159.If we wanted so calculate the area of various circles, we could rerun the program for each successivecircle. But, there's an easier way to do it simply by adding another line to the program, as follows: 30 GOTO 10 RUN ?10 314.159 ?3 28.27431 ?4.7 69.3977231 ?By putting a "GOTO" statement on the end of our program, we have caused it to go back to line 10after it prints each answer for the successive circles. This could have gone on indefinitely, but wedecided to stop after calculating the area for three circles. This was accomplished by typing acarriage return to the input statement (thus a blank line).VARIABLE NAMESThe letter "R" in the program above is a "variable." A variable name can be any alphabeticcharacter and may be followed by any alphanumeric character (letters A to Z, numbers 0 to 9).Any alphanumeric characters after the first two are ignored.Here are some examples of legal and illegal variable names: Legal Illegal A % (first character must be alphabetic) Z1 ZIABCD (variable name too long) TP TO (variable names cannot be reserved words) PSTG$ RGOTO (variable names cannot contain reserved words) COUNTASSIGNING VARIABLES WITH A LET OR ASSIGNMENT STATEMENTBesides having values assigned to variables with an input statement, you can also set the value of avariable with a LET or assignment statement.Try the following examples: A=5 PRINT A, A*2 5 10 LET Z=7 PRINT Z, Z-A 7 2As you will notice from the examples, the "LET" is optional in an assignment statement.BASIC "remembers" the values that have been assigned to variables using this type of statement.This "remembering" process uses space in the memory to store the data.The values of variables are discarded (and the space in memory used to store them is released) whenone of four conditions occur:* A new line is typed into the program or an old line is deleted* A CLEAR command is typed in* A RUN command is typed in* NEW is typed inAnother important fact is that if a variable is encountered in a formula before it is assigned a value,it is automatically assigned the value zero. Zero is then substituted as the value of the variable in theparticular formula. Try the example below: PRINT Q;Q+2;Q*2 0 2 0RESERVED WORDSThe words used as BASIC statements are "reserved" for this specific purpose. You cannot use thesewords as variable names or inside of any variable name. For instance, "FEND" would be illegalbecause "END" is a reserved word.Table 206-1 is a list of the reserved words in BASIC. Table 206-1. AIM 65 BASIC Reserved Words ABS FN LIST PRINT SPC AND FOR LOAD POS SQR ASC FRE LOG READ STEP ATN GET MID$ REM STOP CHR$ GOSUB NEW RESTORE STR$ CLEAR GOTO NEXT RETURN TAB CONT IF NOT RIGHT$ TAN COS INPUT NULL RND THEN DATA INT ON RUN TO DEF LEFT$ OR SAVE USR DIM LEN PEEK SGN VAL END LET POKE SIN WAIT EXPREMARKSThe REM (short for "remark") statement is used to insert comments or notes into a program. WhenBASIC encounters a REM statement, the rest of the line is ignored.This serves mainly as an aid for the programmer and serves no useful function as far as the operationof the program in solving a particular problem.207 RELATIONAL TESTSSuppose we wanted to write a program to check whether a number is zero. With the statementswe've gone over so far, this could not be done. What is needed is a statement which can be usedto conditionally branch to another statement. The "IF-THEN" statement does just that.Type in the following program: (remember, type NEW first) 10 INPUT B 20 IF B=0 THEN 55 30 PRINT "NON-ZERO" 40 GOTO 10 50 PRINT "ZERO" 60 GOTO 10When this program is typed and run, it will ask for a value for B. Type in any value you wish.The AIM 65 will then come to the "IF" statement. Between the "IF" and the "THEN" portionof the statement there are two expressions separated by a "relation."A relation is one of the following six symbols: RELATION MEANING -------- ------------------------ = EQUAL TO > GREATER THAN < LESS THAN <> NOT EQUAL TO <= or =< LESS THAN OR EQUAL TO => or >= GREATER THAN OR EQUAL TOThe IF statement is either true or false, depending upon whether the two expressions satisfy therelation. For example, in the program we just did, if 0 was typed in for B the IF statement wouldbe true because 0=0. In this case, since the number after the THEN is 50, execution of the programwould continue at line 50. Therefore, "ZERO" would be printed and then the program wouldjump back to line 10 (because of the GOTO statement in line 60).Suppose a 1 was typed in for B. Since 1=0 is false, the IF statement would be false and the programwould continue execution with the next line. Therefore, "NON-ZERO" would be printed and theGOTO in line 40 would send the program back to line 10.A PROGRAM USING RELATIONSNow try the following program for comparing two numbers: 10 INPUT A,B 20 IF A<=B THEN 50 30 PRINT "A IS BIGGER" 40 GOTO 10 50 IF A=1 THEN 20Notice that we are now checking to see that I is greater than or equal to the final value. The reasonis that we are now counting by a negative number. In the previous examples it was the opposite, sowe were checking for a variable less than or equal to the final value.SOME OTHER LOOPING OPERATIONSThe "STEP" statement previously shown can also be used with negative numbers to accomplish thissame result. This can be done using the same format as in the other program: 10 FOR I=10 TO 1 STEP -1 20 PRINT I 30 NEXT I"FOR" loops can also be "nested." For example: 10 FOR I=1 TO 5 20 FOR J=1 TO 3 30 PRINT I,J 40 NEXT J 50 NEXT INotice that "NEXT J" precedes "NEXT I." This is because the J-Ioop is inside the I-loop. Thefollowing program is incorrect; run it and see what happens: 10 FOR I=1 TO 5 20 FOR J=1 TO 3 30 PRINT I,J 40 NEXT I 50 NEXT JIt does not work because when the "NEXT I" is encountered, all knowledge of the J-loop is lost.This happens because the J-loop is "inside" the I-loop.209 MATRIX OPERATIONSIt is often convenient to be able to select any element in a table of numbers. BASIC allows this tobe done through the use of matrices.A matrix is a table of numbers. The name of this table (the matrix name) is any legal variable name,"A" for example. The matrix name "A" is distinct and separate from the simple variable "A," andyou could use both in the same program.To select an element of the table, we subscript "A": that is, to select the I'th element, we enclose Iin parentheses "(I)" and then follow "A" by this subscript. Therefore, "A(I)" is the I'th element inthe matrix "A.""A(1)" is only one element of matrix A, and BASIC must be told how much space so allocate forthe entire matrix. This is done with a "DIM" statement, using the format "DIM A(15)." In thiscase, we have reserved space for the matrix index "I" to go from 0 to 15. Matrix subscripts alwaysstart as 0; therefore, in the above example, we have allowed for 16 numbers in matrix A.If "A(1)" is used in a program before is has been dimensioned, BASIC reserves space for 11 elements(0 through 10).A SORT PROGRAMAs an example of how matrices are used, try the following program so sort a list of 8 numbers, inwhich you pick the numbers to be sorted: 10 DIM A(8) 110 A(I)=A(I+1) 20 FOR I=1 TO 8 120 A(I+1)=T 30 INPUT A(I) 130 F=1 50 NEXT I 140 NEXT I 70 F=0 150 IF F=1 THEN 70 80 FOR I=1 TO 7 160 FOR I=1 TO 8 90 IF A(I)<=A(I+1) THEN 140 170 PRINT A(I) 100 T=A(I) 180 NEXT IWhen line 10 is executed, BASIC sets aside space for 9 numeric values, A(0) through A(8).Lines 20 through 50 get the unsorted list from the user. The sorting itself is done by going throughthe list of numbers and switching any two that are not in order. "F" is used to indicate if anyswitches were made; if any were made, line 150 tells BASIC to go back and check some more.If we did not switch any numbers, or after they are all in order, lines 160 through 180 will printout the sorted list. Note that a subscript can be any expression.210 SUBROUTINESIf you have a program that performs the same action in several different places, you could duplicatethe same statements for the action in each place within the program.The "GOSUB" and "RETURN" statements can be used to avoid this duplication. When a "GOSUB"is encountered, BASIC branches to the line whose number follows the "GOSUB." However, BASICremembers where it was in the program before it branches. When the "RETURN" statement isencountered, BASIC goes back to the first statement following the last "GOSUB" that wasexecuted. Observe the following program: 10 PRINT "WHAT IS THE NUMBER"; 30 GOSUB 100 40 T=N 50 PRINT "SECOND NUMBER"; 70 GOSUB 100 80 PRINT "THE SUM IS"; T+N 90 STOP 100 INPUT N 110 IF N=INT(N) THEN 140 120 PRINT "MUST BE INTEGER." 130 GOTO 100 140 RETURNThis program asks for two numbers (which must be integers), and then prints their sum. Thesubroutine in this program is lines 100 to 140. The subroutine asks for a number, and if it is notan integer, asks for a new number. It will continue to ask until an integer value is typed in.The main program prints "WHAT IS THE NUMBER," and then calls the subroutine so get the valueof the number into N. When the subroutine returns (to line 40), the value input is saved in thevariable T. This is done so that when the subroutine is called a second time, the value of the firstnumber will not be lost."SECOND NUMBER" is then printed, and the second value is entered when the subroutine isagain called.When the subroutine returns the second time, "THE SUM IS" is printed, followed by the sum.T contains the value of the first number that was entered and N contains the value of the secondnumber.STOPPING A PROGRAMThe next statement in the program is a "STOP" statement. This causes the program to stopexecution at line 90. If the "STOP" statement was excluded from the program, we would "fallinto" the subroutine at line 100. This is undesirable because we would be asked to input anothernumber. If we did, the subroutine would try to return; and since there was no "GOSUB" whichcalled the subroutine, an RG error would occur. Each "GOSUB" executed in a program shouldhave a matching "RETURN" executed later. The opposite also applies: a "RETURN" should beencountered only if it is part of a subroutine which has been called by a "GOSUB."Either "STOP" or "END" can be used to separate a program from its subroutines. "STOP" willprint a message saying at what line the "STOP" was encountered.211 ENTERING DATASuppose you had to enter numbers to your program that did not change each time the program wasrun, but you would like it to be easy to change them if necessary. BASIC contains special state-ments, "READ" and "DATA," for this purpose.Consider the following program: 10 PRINT "GUESS A NUMBER"; 20 INPUT G 30 READ D 40 IF D = -999999 THEN 90 50 IF D<>G THEN 30 60 PRINT "YOU ARE CORRECT" 70 END 90 PRINT "BAD GUESS, TRY AGAIN." 95 RESTORE 100 GOTO 10 110 DATA 1,393,-39,28,391,-8,0,3.14,90 120 DATA 89,5,10,15,-34,-999999When the "READ" statement is encountered, the effect is the same as an INPUT statement. But,instead of getting a number from the keyboard, a number is read from the "DATA" statements.The first time a number is needed for a READ, the first number in the first DATA statement isread. The second time one is needed, the second number in the first DATA statement is read.When the all numbers of the first DATA statement have been read in this manner, the secondDATA statement will be used. DATA is always read sequentially in this manner, and there maybe any number of DATA statements in your program.The purpose of this program is to play a little game in which you try to guess one of the numberscontained in the DATA statements. For each guess that is typed in, we read through all of thenumbers in the DATA statements until we find one that matches the guess.If more values are read than there are numbers in the DATA statements, an out of data (OD) erroroccurs. That is why in line 40 we check to see if -999999 was read. This is not one of the numbersto be matched, but is used as a flag to indicate that all of the data (possible correct guesses) hasbeen read. Therefore, if -999999 was read, we know that the guess was incorrect.Before going back to line 10 for another guess, we need to make the READ's begin with the firstpiece of data again. This is the function of the "RESTORE." After the RESTORE is encountered,the next piece of data read will be the first number in the first DATA statement again.DATA statements may be placed anywhere within the program. Only READ statements make useof the DATA statements in a program, and any other time they are encountered during programexecution they will be ignored.212 STRINGSA list of characters is referred to as a "String." Rockwell, R6500, and THIS IS A TEST are allstrings. Like numeric variables, string variables can be assigned specific values. String variables aredistinguished from numeric variables by a "$" after the variable name.For example, try the following: A$="ROCKWELL R6500" PRINT A$ ROCKWELL R6500In this example, we set the string variable A$ to the string value "ROCKWELL R6500." Note thatwe also enclosed the character string so be assigned to A$ in quotes.LEN FUNCTIONNow that we have set A$ to a string value, we can find out what the length of this value is (thenumber of characters it contains). We do this as follows: PRINT LEN(A$),LEN("MICROCOMPUTER") 14 13The "LEN" function returns an integer equal to the number of characters in a string.A string expression may contain from 0 to 255 characters. A string containing 0 characters is calledthe "null" string. Before a string variable is set to a value in the program, it is initialized to the nullstring. Printing a null string on the terminal will cause no characters to be printed, and the printeror cursor will not be advanced to the next column. Try the following: PRINT LEN(Q$);Q$;3 0 3Another way to create the null string is: Q$=""Setting a string variable to the null string can be used to free up the string space used by a non-nullstring variable.LEFT$ FUNCTIONIt is often desirable to access parts of a string and manipulate them. Now that we have set A$ to"ROCKWELL R6500," we might want to print out only the first eight characters of A$. We woulddo so like this: PRINT LEFT$(A$,8) ROCKWELL"LEFT$" is a string function which returns a string composed of the leftmost N characters of itsstring argument. Here is another example: FOR N=1 TO LEN(A$):PRINT LEFT$(A$,N):NEXT N R RO ROC ROCK ROCKW ROCKWE ROCKWEL ROCKWELL ROCKWELL R ROCKWELL R6 ROCKWELL R65 ROCKWELL R650 ROCKWELL R6500Since A$ has 14 characters this loop will be executed with N=1,2,3,...,13,14. The first timethrough only the first character will be printed, the second time the first two characters will beprinted, etc.RIGHT$ FUNCTIONAnother string function, called "RIGHT$," returns the right N characters from a string expression.Try substituting "RIGHT$" for "LEFT$" in the previous example and see what happens.MID$ FUNCTIONThere is also a string function which allows us to take characters from the middle of a string. Trythe following: FOR N=1 TO LEN(A$):PRINT MID$(A$,N):NEXT N ROCKWELL R6500 OCKWELL R6500 CKWELL R6500 KWELL R6500 WELL R6500 ELL R6500 LL R6500 L R6500 R6500 R6500 6500 500 00 0"MID$" returns a string starting at the Nth position of A$ so the end (last character) of A$. Thefirst position of the string is position 1 and the last possible position of a string is position 255.Very often it is desirable to extract only the Nth character from a string. This can be done bycalling MID$ with three arguments. The third argument specifies the number of characters toreturn.For example: FOR N=1 TO LEN(A$):PRINT MID$(A$,N,1),MID$(A$,N,2):NEXT N R RO O OC C CK K KW W WE E EL L LL L L R R R6 6 65 5 50 0 00 0 0CONCATENATION-JOINING STRINGSStrings may also be concatenated (put or joined together) through the use of the "+" operator.Try the following: B$="BASIC FOR"+" "+A$ PRINT B$ BASIC FOR ROCKWELL R6500Concatenation is especially useful if you wish to take a string apart and then put it back togetherwith slight modifications. For instance: C$=LEFT$(B$,9)+"-"+MID$(B$,11,8)+"-"+RIGHT$(B$,5) PRINT C$ BASIC FOR-ROCKWELL-R6500VAL AND STRS FUNCTIONSSometimes it is desirable to convert a number to its string representation, and vice-versa. "VAL"and "STR$" perform these functions.Try the following: STRING$="567.8" PRINT VAL(STRING$) 567.8 STRING$=STR$(3.1415) PRINT STRINGS$,LEFT$(STRING$,5) 3.1415 3.14"STR$" can be used to perform formatted I/O on numbers. You can convert a number to a stringand then use LEFT$, RIGHT$, MID$ and concatenation to reformat the number as desired."STR$" can also be used to conveniently find out how many print columns a number will take.For example: PRINT LEN(STR$(3.157)) 6If you have an application in which a user is typing in a question such as "WHAT IS THE VOLUMEOF A CYLINDER OF RADIUS 5.36 FEET, OF HEIGHT 5.1 FEET?" you can use "VAL" toextract the numeric values 5.36 and 5.1 from the question.CHR$ FUNCTIONCHR$ is a string function which returns a one character string which contains the alphanumericequivalent of the argument, according so the conversion table in Appendix E. ASC takes the firstcharacter of a string and converts it to its ASCII decimal value.One of the most common uses of CHR$ is to send a special character to a terminal. 100 DIM A$(15) 110 FOR I=1 TO 15 120 READ A$(I) 130 NEXT I 120 F=0:I=1 130 IF A$(I)<=A$(I+1) THEN 180 140 T$=A$(I+1) 150 A$(I+1)=A$(I) 160 A$(I)=T$ 170 F=1 180 I=I+1 185 IF I<15 THEN 130 190 IF F THEN 120 200 FOR I=1 TO 15 202 PRINT A$(I) 204 NEXT I 220 DATA AIM 65,DOG 230 DATA CAT,R6500 240 DATA ROCKWELL,RANDOM 250 DATA SATURDAY,"***ANSWER***" 260 DATA MICRO,FOO 270 DATA COMPUTER,MED 280 DATA NEWPORT BE-ACH,DALLAS,ANAHEIMADDITIONAL STRING CONSIDERATIONS1. A string may contain from 0 to 255 characters. All string variable names end in a dollar sign ($); for example, A$, B9$, K$, HELLO$.2. String matrices may be dimensioned exactly like numeric matrices. For instance, DIM A$(10,10) creates a string matrix of 121 elements, eleven rows by elevon columns (rows 0 to 10 and columns 0 to 10). Each string matrix element is a complete string, which can be up to 255 characters in length. NAME EXAMPLE PURPOSE/USE ---- ------- ----------- DIM 25 DIM A$(10,10) Allocates space for a pointer and length for each element of a string matrix. No string space is allocated. LET 27 LET A$="FOO"+V$ Assigns the value of a string expression to a string variable. LET is optional. = String comparison operators. Comparison > is made on the basis of ASCII codes, a < character at a time until a difference is <= or =< found. If during the comparison of two >= or => strings, the end of one is reached, the <> shorter string is considered smaller. Note that "A " is greater than "A" since trailing spaces are significant. + 30 LET Z$=R$+Q$ String concatenation. The resulting string must be less than 256 characters in length or an LS error will occur. INPUT 40 INPUT X$ Reads a string from the keyboard. String does not have to be quoted; but if not, leading blanks will be ignored and the string will be terminated on a "," or ":" character. READ 50 READ X$ Reads a string from DATA statements within the program. Strings do not have to be quoted; but if they are not, they are terminated on a "," or ":" character and leading spaces are ignored. See DATA for the format of string data. PRINT 60 PRINT X$ Prints the string expression on the 70 PRINT "FOO"+A$ display/printer.300 STATEMENT DEFINITIONS301 SPECIAL CHARACTERS CHARACTER USE --------- --- @ Erases current line being typed, and types a carriage return/line feed. DEL Erases last character typed. If no more characters are left on the line, types a carriage return/line feed. RETURN A RETURN must end every line typed in. Returns cursor to the first position (leftmost) on line, and prints the line if the printer is on. F1 Interrupts execution of a program or a list command. F1 has effect when a statement finishes execution, or in the case of interrupting a LIST command, when a complete line has finished printing. In both cases a return is made to BASIC's command level and OK is typed. Prints "BREAK IN LINE XXXX," where XXXX is the line number of the next statement to be executed. There is no F1 key on a TTY. However, when TTY is being used, the AIM 65's F1 key is operational and can be used. : (colon) A colon is used to separate statements on a line. Colons may be used in direct and indirect statements. The only limit on the number of statements per line is the line length. It is not possible to GOTO or GOSUB to the middle of a line. ? Question marks are equivalent to PRINT. For instance, ? 2+2 is equivalent to PRINT 2+2. Question marks can also be used in indirect statements. 10 ? X, when listed, will be typed as 10 PRINT X. $ A dollar sign ($) suffix on a variable name establishes the variable as a character string. % A percent sign (%) suffix on a variable name establishes the variable as an integer ! An exclamation sign (!) suffix on an INPUT, PRINT, or ? command causes the input or output to be printed even though the printer is turned off. ESC Returns control to the Monitor. CNTL PRINT Turns the AIM 65 printer on if it is off, and off if it is on.302 OPERATORS SYMBOL SAMPLE STATEMENT PURPOSE/USE ------ ---------------- ----------- = A=100 Assigns a value to a variable LET Z=2.5 The LET is optional - B=-A Negation. Note that 0-A is subtraction, while -A is negation. ^ (F3 key) 130 PRINT X^3 Exponentiation (equal to X*X*X in in the sample statement) 0^0=1 0 to any other power = 0 A^B, with A negative and B not an integer gives an FC error. * 140 X=R*(B*D) Multiplication. / 150 PRINT X/1.3 Division. + 160 Z=R+T+Q Addition - 170 J=100-I SubtractionRULES FOR EVALUATING EXPRESSIONS:1) Operations of higher precedence are performed before operations of lower precedence. This means the multiplication and divisions are performed before additions and subtractions. As an example, 2+10/5 equals 4, not 2.4. When operations of equal precedence are found in a formula, the left hand one is executed first: 6-3+5=8, not -2.2) The order in which operations are performed can always be specified explicitly through the use of parentheses. For instance, to add 5 to 3 and then divided that by 4, we would use (5+3)/4, which equals 2. If instead we had used 5+3/4, we would get 5.75 as a result (5 plus 3/4).The precedence of operators used in evaluating expressions is as follows, in order beginning with thehighest precedence : NOTE Operators listed on the same line have the same precedence.1) Expressions in parentheses are always evaluated first2) ^ (F3 KEY) ExponentiatiOn3) NEGATION -X where X may be a formula4) * and / Multiplication and Division5) + and - Addition and Subtraction6) RELATIONAL OPERATORS: = Equal (equal precedence for all six) <> Not Equal < Less Than > Greater Than =< or <= Less Than or Equal => or >= Greater Than or Equal (These three below are Logical Operators)7) NOT Logical and bitwise "NOT" like negation, not takes only the formula to its right as an argument8) AND Logical and bitwise "AND"9) OR Logical and bitwise "OR"A relational expression can be used as part of any expression.Relational Operator expressions will always have a value of True (-1) or a value of False (0).Therefore, (5=4)=0, (5=5)=-1, (4>5)=0, (4<5)=-1, etc.The THEN clause of an IF statement is executed whenever the formula after the IF is not equal to 0.That is to say, IF X THEN ... is equivalent to IF X<>0 THEN .... SYMBOL SAMPLE STATEMENT PURPOSE/USE ------ ---------------- ----------- - 10 IF A=15 THEN 40 Expression Equals Expression <> 70 IF A<>0 THEN 5 Expression Does Not Equal Expression > 30 IF B>100 THEN 8 Expression Greater Than Expression < 160 IF B<2 THEN 10 Expression Less Than Expression <=,=< 180 IF 100<=B+C THEN 10 Expression Less Than or Equal To Expression >=,=> 190 IF Q=>R THEN 50 Expression Greater Than Or Equal To Expression AND 2 IF A<5 AND B<2 THEN 7 If expression 1 (A<5) AND expression 2 (B<2) are both true, then branch to line 7 OR IF A<1 OR B<2 THEN 2 If either expression 1 (A<1) OR expression 2 (B<2) is true, then branch to line 2 NOT IF NOT Q3 THEN 4 If expression "NOT Q3" is true (Because Q3 is false), then branch to line 4 Note: NOT -1=0 (NOT true=false)AND, OR, and NOT can be used for bit manipulation, and for performing boolean operations.These three operators convert their arguments to sixteen bit, signed two's-complement integers inthe range -32768 to +32767. They then perform the specified logical operation on them and returna result within the same range. If the arguments are not in this range, an "FC" error results.The operations are performed in bitwise fashion, this means that each bit of the result is obtainedby examining the bit in the same position for each argument.The following truth table shows the logical relationship between bits: OPERATOR ARGUMENT 1 ARGUMENT 2 RESULT -------- ---------- ---------- ------ AND 1 1 1 0 1 0 1 0 0 0 0 0 OR 1 1 1 1 0 1 0 1 1 0 0 0 NOT 1 - 0 0 - 1EXAMPLES: (In all of the examples below, leading zeroes on binary numbers are not shown.)63 AND 16=16 Since 63 equals binary 111111 and 16 equals binary 10000, the result of the AND is binary 10000 or 16.15 AND 14=14 15 equals binary 1111 and 14 equals binary 1110, so 15 AND 14 equals binary 1110 or 14.-1 AND 8=8 -1 equals binary 1111111111111111 and 8 equals binary 1000, so the result is binary 1000 or 8 decimal.4 AND 2=0 4 equals binary 100 and 2 equals binary 10, so the result is binary 0 because nons of the bits in either argument match to give a 1 bit in the result.4 OR 2=6 Binary 100 OR'd with binary 10 equals binary 110, or 6 decimal.10 OR 10=10 Binary 1010 OR'd with binary 1010 equals binary 1010, or 10 decimal.-1 OR -2=-1 Binary 1111111111111111 (-1) OR'd with binary 1111111111111110 (-2) equals binary 1111111111111111, or -1.NOT 0=-1 The bit complement of binary 0 to 16 places is sixteen ones (1111111111111111) or -1. Also NOT -1=0.NOT X NOT X is equal to -(X+1). This is because to form the sixteen bit two's complement of the number, you take the bit (one's) complement and add one.NOT 1=-2 The sixteen bit complement of 1 is 1111111111111110, which is equal to -(1+1) or -2.A typical use of the bitwise operators is to test bits set in the computer's locations which reflect thestate of some external device.Bit position 7 is the most significant bit of a byte, while position 0 is the least significant.For instance, suppose bit 1 of location 40963 is 0 when the door to Room X is closed, and 1 if thedoor is open. The following program will print "Intruder Alert" if the door is opened: 10 IF NOT (PEEK(40963) AND 2) THEN 10 This line will execute over and over until bit 1 (masked or selected by the 2) becomes a 1. When that happens, we go to line 20. 20 PRINT "INTRUDER ALERT" Line 20 will output "INTRUDER ALERT."However, we can replace statement 10 with a "WAIT" statement, which has exactly the same effect. 10 WAIT 40963,2 This line delays the execution of the next statement in the program until bit 1 of location A003 becomes 1. The WAIT is much faster than the equivalent IF statement and also takes less bytes of program storage.The following is another useful way of using relational operators: 125 A=-(B>C)*B-(B<=C)*C This statement will set the variable A to MAX(B,C) = the larger of the two variables B and C.303 COMMANDSA BASIC command may be entered when the cursor is displayed. This is called the "Command Level."Commands may be used as program statements. Certain commands, such as LIST, NEW, and LOADwill terminate program execution when they finish. Each command may require one or morearguments in addition to the command statement, as defined in the syntax/function description. Anargument without parenthesis is required to be entered without parenthesis. Arguments containedwithin parenthesis are required to be entered with the shown parenthesis. Arguments within bracketsare optional. Optional arguments, if included, must be entered with or without accompanyingparenthesis, however shown.STATEMENT SYNTAX/FUNCTION EXAMPLECLEAR CLEAR CLEAR Clears all program variables, resets "FOR" and "GOSUB" state, and restores data.STATEMENT SYNTAX/FUNCTION EXAMPLECONT CONT CONT Continues program execution after the F1 key or a STOP or INPUT statement termi- nates execution. You cannot continue after any error, after modifying your program, or before your program has been run. One of the main purposes of CONT is debugging. Suppose at some point after running your program, nothing is printed. This may be because your program is performing some time consuming calculation, but it may be because you have fallen into an "infinite loop." An infinite loop is a series of BASIC statements from which there is no excape. BASIC will keep executing the series of statements over and over; until you inter- vene or until power to the AIM 65 is turned off. If you suspect your program is in an infinite loop, press F1 until the BREAK message is displayed. The line number of the statement BASIC was executing will be displayed. After BASIC has displayed the cursor, you can use PRINT to type out some of the values of your variables. After examining these values you may become satisfied that your program is functioning correctly. You should then type in CONT to Continue executing your program where it left off, or type a direct GOTO statement to resume execution of the program at a different line. You could also use assignment statements to set some of your variables to different values. Remember, if you interrupt a program with the F1 key and expect to continue it later, you must not get any errors or type in any new program lines. If you do, you won't be able to continue and will get a "CN" (continue not) error. It is impossible to continue a direct command. CONT always resumes execution at the next statement to be executed in your program when F1 was typed.STATEMENT SYNTAX/FUNCTION EXAMPLEFRE FRE (expression) 270 PRINT FRE(0) Gives the number of memory bytes currently unused by BASIC. A dummy operand--0 or 1--must be used.STATEMENT SYNTAX/FUNCTION EXAMPLELIST LIST [[start line] [-[end line]]] Lists current program optionally starting at specified line. List can be interrupted with the F1 key. (BASIC will finish listing the current line.) Lists entire program LIST Lists just line 100. LIST 100 Lists lines 100 to 1000. LIST 100-1000 Lists from current line to line 1000. LIST -1000 Lists from line 100 to end of program. LIST 100-STATEMENT SYNTAX/FUNCTION EXAMPLELOAD LOAD LOAD Loads a BASIC program from the cassette tape. When done, the LOAD will display the cursor. See Appendix G for more information.STATEMENT SYNTAX/FUNCTION EXAMPLENEW NEW NEW Deletes current program and all variables.STATEMENT SYNTAX/FUNCTION EXAMPLEPEEK PEEK (address) 356 PRINT PEEK(I) The PEEK function returns the contents of memory address I in decimal. The value returned will be =>0 and <=255. If I is >65535 or <0, an FC error will occur. An attempt to read a non-existent memory address will return an unknown value.STATEMENT SYNTAX/FUNCTION EXAMPLEPOKE POKE location, byte 357 POKE I,J The POKE statement stores the byte specified by its second argument (J) into the location given by its first argument (I). The byte to be stored must be =>0 and <=255, or an FC error will occur. The address (I) must be =>0 and <=65535, or an FC error result. Caution: Careless use of the POKE statement may cause your program, BASIC, or the Monitor functions to operate incorrectly, to hang up, and/or cause loss of your program. Note that Pages 0 and 1 in memory are reserved for use by BASIC and should not be used for user program variable storage. A POKE to a non-existent memory location is harmless. One of the main uses of POKE is to pass arguments to machine language subroutines. (See Appendix F.) You could also use PEEK and POKE to write a memory diagnostic or an assembler in BASIC.STATEMENT SYNTAX/FUNCTION EXAMPLERUN RUN line number RUN 200 Starts execution of the program currently in memory at the specified line number. RUN deletes all variables [does a CLEAR) and restores DATA. If you have stopped your program and wish to continue execution at some point in the program, use a direct GOTO statement to start execution of your program at the desired line, or CONT to continue after a break. Start program execution at the lowest RUN numbered statement.STATEMENT SYNTAX/FUNCTION EXAMPLESAVE SAVE SAVE Saves the current program in the AIM 65 memory on cassette tape. The program in memory is left unchanged. More than one program may be stored on cassette using this command. See Appendix G for more information.304 PROGRAM STATEMENTSIn the following description of statements, an argument of B, C, V or W denotes a numeric variable,X denotes a numeric expression, X$ denotes a string expression and an I or J denotes an expressionthat is truncated to an integer before the statement is executed. Truncation means that anyfractional part of the number is lost, e.g., 3.9 becomes 3, 4.01 becomes 4.An expression is a series of variables, operators, function calls and constants which after theoperations and function calls are performed using the precedence rules, evaluates to a numericor string value.A constant is either a number (3.14) or a string literal ("FOO").STATEMENT SYNTAX/FUNCTION EXAMPLEDEF DEF FNx [(argument list)] = expression 100 DEF FNA(V)=V/B+C The user can define functions like the built- in functions (SQR, SGN, ABS, etc.) through the use of the DEF statement. The name of the function is "FN" followed by any legal variable name, for example: FNX, FNJ7, FNKO, FNR2. User defined func- tions are restricted to one line. A function may be defined to be any expression, but may only have one argument. In the example, B and C are variables that are used in the program. Executing the DEF state- ment defines the function. User defined functions can be redefined by executing another DEF statement for the same function. "V" is called the dummy variable. Execution of this statement following the 100 Z=FNA(3) above would cause Z to be set to 3/B+C, but the value of V would be unchanged.STATEMENT SYNTAX/FUNCTION EXAMPLEDIM DIM variable (size 1, [size 2...]) 113 DIM A(3),B(10) Allocates space for matrices. All matrix elements are set to zero by the DIM statement. Matrices can have from one to 255 114 DIM R3(5,5), dimensions. D$(2,2,2) Matrices can be dimensioned dynamically 115 DIM Q1(N),Z(2*I) during program execution. If a matrix is not explicitly dimensioned with a DIM statement, it is assumed to be a single dimensioned matrix of whose single subscript may range 0 to 10 (eleven elements). If this statement was encountered before a 117 A(8)=4 DIM statement for A was found in the program, it would be as if a DIM A(10) had been executed previous to the execu- tion of line 117. All subscripts start at zero (0), which means that DIM X(100) really allocates 101 matrix elements.STATEMENT SYNTAX/FUNCTION EXAMPLEEND END 999 END Terminates program execution without printing a BREAK message. (See STOP.) CONT after an END statement causes execution to resume at the statement after the END Statement. END can be used anywhere in the program, and is optional.STATEMENT SYNTAX/FUNCTION EXAMPLEFOR FOR variable = expression to expression 300 FOR V=1 TO 9.3 [STEP expression] (See NEXT statement) STEP .6 V is set equal to the value of the expression following the equal sign, in this case 1. This value is called the initial value. Then the statements between FOR and NEXT are executed. The final value is the value of the expression following the TO. The step is the value of the expression following STEP. When the NEXT statement is encountered, the step is added to the variable. If no STEP was specified, it is assumed to 310 FOR V=1 TO 9.3 be one. If the step is positive and the new value of the variable is <= the final value (9.3 in this example), or the step value is negative and the new value of the variable is => the final value, then the first state- ment following the FOR statement is executed. Otherwise, the statement following the NEXT statement is executed. All FOR loops execute the statements between the FOR and the NEXT at least once, even in cases like FOR V=1 TO 0. Note that expressions (formulas) may be 315 FOR V=10*N TO used for the initial, final and step values 3.4/Q STEP SQR(R) in a FOR loop. The values of the expres- sions are computed only once, before the body of the FOR...NEXT loop is executed. When the statement after the NEXT is 320 FOR V=9 TO 1 executed, the loop variable is never equal STEP -1 to the final value, but is equal to whatever value caused the FOR...NEXT loop to terminate. The statements between the FOR and its corresponding NEXT in both examples above (310 and 320) would be executed nine times. Error: do not use nested FOR...NEXT 330 FOR W=1 TO 10: loops with the same index variable. FOR W=1 TO 5:NEXT W:NEXT W FOR loop nesting is limited only by the available memory. (See Appendix C.)STATEMENT SYNTAX/FUNCTION EXAMPLEGOSUB GOSUB line number 10 GOSUB 910 Branches to the specified statement (910) until a RETURN is encountered; when a branch is then made to the statement after the GOSUB. GOSUB nesting is limited only by the available memory.STATEMENT SYNTAX/FUNCTION EXAMPLEGOTO GOTO line number 50 GOTO 100 Branches to the statement specified.STATEMENT SYNTAX/FUNCTION EXAMPLEIF...GOTO IF expression GOTO line number ... 32 IF X<=Y+23.4 Equivalent to IF...THEN, except that GOTO 92 IF...GOTO must be followed by a line number, while IF...THEN can be followed by either a line number or another statement.STATEMENT SYNTAX/FUNCTION EXAMPLEIF...THEN IF expression THEN line number ... IF X<10 THEN 5 Branches to specified statement if the relation is True. Executes all of the statements on the 20 IF X<0 THEN PRINT remainder of the THEN if the relation "X LESS THAN 0" is True. WARNING: The "Z=A" will never be 25 IF X=5 THEN 50:Z=A executed because if the relation is true, BASIC will branch to line 50. If the relation is false BASIC will proceed to to the line following line 25. In this example, if X is less than 0, the 26 IF X<0 THEN PRINT PRINT statement will be executed and "ERROR, X NEGATIVE": then the GOTO statement will branch to GOTO 350 line 350. If the X was 0 or positive, BASIC will proceed to execute the lines after line 26.STATEMENT SYNTAX/FUNCTION EXAMPLELET [LET] variable = expression 300 LET W=X Assigns a value to a variable, "LET" is optional. 310 V=5.1STATEMENT SYNTAX/FUNCTION EXAMPLENEXT NEXT [variable] [,variable] ... 340 NEXT V Marks the end of a FOR loop. If no variable is given, matches the most 345 NEXT recent FOR loop, A single NEXT may be used to match 350 NEXT V,W multiple FOR statements. Equivalent to NEXT V:NEXT W.STATEMENT SYNTAX/FUNCTION EXAMPLEON...GOSUB ON expression GOSUB line [,line] ... 110 ON I GOSUB 50,60 Identical to "ON...GOTO," except that a subroutine call (GOSUB) is executed instead of a GOTO. RETURN from the GOSUB branches to the statement after the ON...GOSUB.STATEMENT SYNTAX/FUNCTION EXAMPLEON...GOTO ON expression GOTO line [, line] ... 100 ON I GOTO 10,20, Branches to the line indicated by the 30,40 I'th number after the GOTO. That is: IF I=1, THEN GOTO LINE 10 IF I=2, THEN GOTO LINE 20 IF I=3, THEN GOTO LINE 30 IF I=4, THEN GOTO LINE 40. If I=0, or I attempts to select a nonexistent line (>=5 in this case), the statement after the ON statement is executed. However, if I is >255 or <0, an FC error message will result. As many line numbers as will fit on a line can follow an ON...GOTO. This statement will branch to line 40 if the 105 ON SGN(X)+2 expression X is less than zero, to line 50 if GOTO 40,50,60 it equals zero, and to line 60 if it is greater than zero.STATEMENT SYNTAX/FUNCTION EXAMPLEREM REM any text 500 REM NOW SET Allows the programmer to put comments V=0 in his program. REM statements are not executed, but can be branched to. A REM statement is terminated by end of line, but not by a ":". In this case the V=0 will never be executed 505 REM SET V=0: by BASIC. V=0 In this case V=0 will be executed, 505 V=0: REM SET V=0STATEMENT SYNTAX/FUNCTION EXAMPLERESTORE RESTORE 510 RESTORE Allows the re-reading of DATA statements, After a RESTORE, the next piece of data read will be the first piece listed in the first DATA statement of the program. The second piece of data read will be the second piece listed in the first DATA statement, and so on as in a normal READ operation.STATEMENT SYNTAX/FUNCTION EXAMPLERETURN RETURN 50 RETURN Causes a subroutine to return to the state- ment after the most recently executed GOSUB.STATEMENT SYNTAX/FUNCTION EXAMPLESTOP STOP 900 STOP Causes a program to stop execution and to enter command mode. Prints BREAK IN LINE 900. (As per this example.) CONT after a STOP branches to the statement following the STOP.STATEMENT SYNTAX/FUNCTION EXAMPLEUSR USR (argument) 200 V=USR(W) Calls the user's machine language subroutine with the argument. See PEEK and POKE in Subject 303, and Appendix F.SYMBOL SYNTAX/FUNCTION EXAMPLEWAIT WAIT (address, mask [, select] ) 805 WAIT I,J,K This statement reads the contents of the 806 WAIT I,J addressed location, does an Exclusive-OR with the select value, and then ANDs the result with the mask. This sequence is repeated until a non-zero result is obtained, at which time execution continues at the statement that follows WAIT. If the WAIT statement has no select argument, the select value is assumed to be zero. If you are waiting for a bit to become zero, there should be a "one" in the corresponding bit position of the select value. The select value (K) and the mask value (J) can range from 0 to 255. The address (I) can range from 0 to 65535.305 INPUT/OUTPUT STATEMENTSSTATEMENT SYNTAX/FUNCTION EXAMPLEDATA DATA item [, item...] 10 DATA 1,3,-1E3,.04 Specifies data, read from left to right. Information appears in data statements in the same order as it will be read in the program. Strings may be read from DATA state- 20 DATA "FOO",Z1 ments. If you want the string to contain leading spaces (blanks), colons (:) or commas (,), you must enclose the string in double quotes. It is illegal so have a double quote within string data or a string literal. (""BASIC"" is illegal.)STATEMENT SYNTAX/FUNCTION EXAMPLEINPUT INPUT [!] ["prompt string literal";] 3 INPUT V,W,W2 variable [, variable] ... Requests data from the keyboard (to be typed in). Each value must be separated from the preceeding value by a comma (,). The last value typed should be followed by a carriage return. A "?" is displayed as a prompt character. Only constants may be typed in as a response to an INPUT state- ment, such as 4.5E-3 or "CAT." If more data was requested in an INPUT statement than was typed in, a "??" is printed and the rest of the data should be typed in. If more data was typed in than was requested, the warning "EXTRA IGNORED" will be displayed. Strings must be input in the same format as they are specified in DATA statements. Optionally displays a prompt string 5 INPUT "VALUE";V ("VALUE") before requesting data from the keyboard. If RETURN is typed to an input statement, BASIC returns to com- command mode. Typing CONT after an INPUT command has been interrupted will cause execution to resume at the INPUT statement. If the optional character ! is included 15 INPUT! "VALUE";V following INPUT, then the prompts from the INPUT statement and the user's entries will be printed (even if the printer is turned off) and displayed.STATEMENT SYNTAX/FUNCTION EXAMPLEPOS POS (expression) 260 PRINT POS(I) Gives the current position of the cursor on the display. The leftmost character position on the display is position zero. A dummy operand--0 or 1--must be used.STATEMENT SYNTAX/FUNCTION EXAMPLEPRINT PRINT [!] expression [, expression] 360 PRINT X,Y;Z Prints the value of expressions on the 370 PRINT " " display/printer. If the list of values to be 380 PRINT X,Y; printed out does not end with a comma 390 PRINT "VALUE IS";A (,) or a semicolon (;), then a carriage 400 PRINT A2,B, return/line feed is executed after all the values have been printed. Strings enclosed in quotes (") may also be printed. If a semicolon separates two expressions in the list, their values are printed next to each other. If a comma appears after an expression in the list, and the print head is at print position 11 or more, then a carriage return/line feed is executed. If the print head is before print position 11, then spaces are printed until the carriage is at the beginning of the next 10 column field. If there is a blank string enclosed in quotes, as in line 370 of the examples, then a carriage return/line feed is executed. "VALUE IS" will be displayed and printed. 410 PRINT ! "VALUE IS";A String expressions may be printed. 420 PRINT MID$(A$,2);STATEMENT SYNTAX/FUNCTION EXAMPLEREAD READ variable [, variable] 490 READ V,W Read data into specified variables from a DATA statement. The first piece of data read will be the first piece of data listed in the first DATA statement of the program. The second piece of data read will be the second piece listed in the first DATA statement, and so on. When all of the data have been read from the first DATA state- ment, the next piece of data to be read will be the first piece listed in the second DATA statement of the program. Attempting to read more data than there is in all the DATA statements in a program will cause an OD (out of data) error.STATEMENT SYNTAX/FUNCTION EXAMPLESPC SPC (expression) 250 PRINT SPC(I) Prints I space [or blank) characters on the terminal. May be used only in a PRINT statement. I must be =>0 and <=255 or an FC error will result.STATEMENT SYNTAX/FUNCTION EXAMPLETAB TAB (expression) 240 PRINT TAB(I) Spaces to the specified print position (column) on the printer. May be used only in PRINT statements. Zero is the leftmost column on the termainl, 19 the rightmost. If the carriage is beyond pos position I, then no printing is done. I must be =>0 and <=255. If I is greater than 19, the printer will skip the required number of lines to arrive at the specified position.306 STRING FUNCTIONSSTATEMENT SYNTAX/FUNCTION EXAMPLEASC ASC (string expression) 300 PRINT ASC(X$) Returns the ASCII numeric value of the first character of the string expression X$. See Appendix E for an ASCII/number conversion table. An FC error will occur if X$ is the null string.STATEMENT SYNTAX/FUNCTION EXAMPLECHR$ CHR$ (expression) 275 PRINT CHR$(I) Returns one character, the ASCII equiva- lent of the argument (I) which must be a number between 0 and 255. See Appendix E.STATEMENT SYNTAX/FUNCTION EXAMPLEGET GET string variable 10 GET A$ Inputs a single character from the keyboard. If data is at the keyboard, it is put in the variable specified in the GET statement. If no data is available, the BASIC program will continue execution. GET can only be used as an indirect command.STATEMENT SYNTAX/FUNCTION EXAMPLELEFT$ LEFT$ (string expression, length) 310 PRINT LEFT$(X$,I) Gives the leftmost I characters of the string expression X$. If I<=0 or >255 an FC error occurs.STATEMENT SYNTAX/FUNCTION EXAMPLELEN LEN (string expression) 220 PRINT LEN(X$) Gives the length of the string expression X$ in characters (bytes). Non-printing charac- ters and blanks are counted as part of the length.STATEMENT SYNTAX/FUNCTION EXAMPLEMID$ MID$ [string expression, start [, length]) 330 PRINT MID$(X$,I) MID$ called with two arguments returns characters from the string expression X$ starting at character position I. If I>LEN(X$), then MID$ returns a null (zero length) string. If I<=0 or >255, an FC error occurs, MID$ called with three arguments returns 340 PRINT MID$(X$, a string expression composed of the I,J) characters of the string expression X$ starting at the Ith character for J characters. If I>LEN(X$), MID$ returns a null string. If I or J <=0 or >255, an FC error occurs. If J specifies more characters than are left in the string, all characters from the Ith on are returned.STATEMENT SYNTAX/FUNCTION EXAMPLERIGHT$ RIGHT$ (string expression, length) 320 PRINT RIGHT$ Gives the rightmost I characters of the (X$,I) string expression X$. When I<=0 or >255 an FC error will occur. If I>=LEN(X$) then RIGHT$ returns all of X$.STATEMENT SYNTAX/FUNCTION EXAMPLESTR$ STR$ (expression) 290 PRINT STR$(X) Gives a string which is the character repre- sentation of the numeric expression X. For instance, STR$(3.1)="3.1."STATEMENT SYNTAX/FUNCTION EXAMPLEVAL VAL (string expression) 280 PRINT VAL(X$) Returns the string expression X$ converted to a number. For instance. VAL("3.1")=3.1. If the first non-space character of the string is not a plus (+) or minus (-) sign; a digit or a decimal point (.) then zero will be returned.307 ARITHMETIC FUNCTIONSSTATEMENT SYNTAX/FUNCTION EXAMPLEABS ABS (expression) 120 PRINT ABS(X) Gives the absolute value of the expression X. ABS returns X if X>=0, -X otherwise.STATEMENT SYNTAX/FUNCTION EXAMPLEATN ATN (expression) 210 PRINT ATN(X) Gives the arcTangent of the expression X. The result is returned in radians and ranges from -PI/2 to PI/2 (PI/2=1.5708). If you want to use this function, you must provide the code in memory. See Appendix H for implementation details.STATEMENT SYNTAX/FUNCTION EXAMPLECOS COS (expression) 200 PRINT COS(X) Gives the cosine of the expression X. X is interpreted as being in radians.STATEMENT SYNTAX/FUNCTION EXAMPLEEXP EXP (expression) 150 PRINT EXP(X) Gives the constant "E" (2.71828) raised so the power X (E^X). The maximum argu- ment that can be passed to EXP without overflow occurring is 88.0296.STATEMENT SYNTAX/FUNCTION EXAMPLEINT INT (expression) 140 PRINT INT(X) Returns the largest integer less than or equal to its expression X. For example: INT(.23)=0, INT(7)=7, INT(-.1)=-1, INT(-2)=-2, INT(1.1)=1. The following would round X to 0 decimal places: INT(X*10^D+.5)/10^DSTATEMENT SYNTAX/FUNCTION EXAMPLELOG LOG (expression) 160 PRINT LOG(X) Gives the natural (Base E) logarithm of its expression X. To obtain the Base Y logarithm of X use the formula LOG(X)/ LOG(Y). Example: The base 10 (com- mon) log of 7 = LOG(7)/LOG(10).STATEMENT SYNTAX/FUNCTION EXAMPLERND RND (parameter) 170 PRINT RND(X) Generates a random number between 0 and 1. The parameter X controls the generation of random numbers as follows: X<0 starts a new sequence of random numbers using X. Calling RND with the same X starts the same random number sequence. X=0 gives the last random number generated. Repeated calls to RND(0) will always return the same random number. X>0 generates a new random number between 0 and 1. Note that (B-A)*RND(1)+A will generate a random number between A and B.STATEMENT SYNTAX/FUNCTION EXAMPLESGN SGN (expression) 230 PRINT SGN(X) Gives 1. If X>0, 0 if X=0, and -1 if X<0.STATEMENT SYNTAX/FUNCTION EXAMPLESIN SIN (expression) 190 PRINT SIN(X) Gives the sine of the expression X. X is interpreted as being in radians. Note: COS(X) =SIN(X+3.14159/2) and that 1 Radian = 180/PI degrees = 57.2958 degrees; so that the sine of X degrees= SIN(X/57.2958).STATEMENT SYNTAX/FUNCTION EXAMPLESQR SQR (expression) 180 PRINT SQR(X) Gives the square root of the expression X. An FC error will occur if X is less than zero,STATEMENT SYNTAX/FUNCTION EXAMPLETAN TAN (expression) 200 PRINT TAN(X) Gives the tangent of the expression X. X is interpreted as being in radians.DERIVED FUNCTIONSThe following functions, while not intrinsic to BASIC, can be calculated using the existing BASICfunctions:FUNCTION FUNCTION EXPRESSED IN TERMS OF BASIC FUNCTIONSSECANT SEC(X) = 1/COS(X)COSECANT CSC(X) = 1/SIN(X)COTANGENT COT(X) = 1/TAN(X)INVERSE SINE* ARCSIN(X) = ATN(X/SQR(-X*X+1))INVERSE COSINE* ARCCOS(X) = -ATN(X/SQR(-X*X+1))+1.5708INVERSE SECANT* ARCSEC(X) = ATN(SQR(X*X-1))+(SGN(X)-1)*1.5708INVERSE COSECANT* ARCCSC(X) = ATN(1/SQR(X*X-1))+(SGN(X)-1)*1.5708INVERSE COTANGENT* ARCCOT(X) = -ATN(X)+1.5708HYPERBOLIC SINE SINH(X) = (EXP(X)-EXP(-X))/2HYPERBOLIC COSINE COSH(X) = (EXP(X)+EXP(-X))/2HYPERBOLIC TANGENT TANH(X) = -EXP(-X)/(EXP(X)+EXP(-X))*2+1HYPERBOLIC SECANT SECH(X) = 2/(EXP(X)+EXP(-X))HYPERBOLIC COSECANT CSCH(X) = 2/(EXP(X)-EXP(-X))HYPERBOLICCOTANGENT COTH(X) = EXP(-X)/(EXP(X)-EXP(-X))*2+1*These functions require the user-defined ATN function. See Appendix H for details.FUNCTION FUNCTION EXPRESSED IN TERMS OF BASIC FUNCTIONSINVERSE HYPERBOLICSINE ARGSINH(X) = LOG(X+SQR(X*X+1))INVERSE HYPERBOLICCOSINE ARGCOSH(X) = LOG(X+SQR(X*X-1))INVERSE HYPERBOLICTANGENT ARGTANH(X) = LOG((1+X)/(1-X))/2INVERSE HYPERBOLICSECANT ARGSECH(X) = LOG((XQR(-X*X+1)+1)/XINVERSE HYPERBOLICCOSECANT ARGCSCH(X) = LOG((SGN(X)*SQR(X*X+1)+1)/X)INVERSE HYPERBOLICCOTANGENT ARGCOTH(X) = LOG((X+1)/(X-1))/2A ERROR MESSAGESIf an error occurs, BASIC outputs an error message, returns to command level and displays thecursor. Variable values and the program text remain intact, but the program can not be continuedand all GOSUB and FOR context is lost.When an error occurs in a direct statement, no line number is printed.Format of error messages: Direct Statement ?XX ERROR Indirect Statement ?XX ERROR IN YYYYYIn both of the above examples, "XX" will be the error code. The "YYYYY" will be the linenumber where the error occured for the indirect statement.The following are the possible error codes and their meanings:ERROR CODE MEANING BS Bad Subscript. An attempt was made to reference a matrix element which is outside the dimensions of the matrix. This error can occur if the wrong number of dimensions are used in a matrix reference; for instance, LET A(1,1,1)=Z when A has been dimensioned DIM A(2,2). CN Continue error, Attempt to continue a program when none exists, an error occured, or after a new line was typed into the program. DD Double Dimension. After a matrix was dimensioned, another DIM statement for the same matrix was encountered. This error often occurs if a matrix has been given the default dimension 10 because a statement like A(I)=3 is encountered and then later in the program a DIM A(100) is found, FC Function Call error, The parameter passed to a math or string func- tion was out of range. FC errors can occur due to: 1. A negative matrix subscript (LET A(-1)=0) 2. An unreasonably large matrix subscript (>32767) 3. LOG-negative or zero argument 4. SQR-negative argument 5. A^B with A negative and B not an integer 6. A call to USR before the address of the machine language subroutine has been patched in 7. Calls to MID$, LEFT$, RIGHT$, WAIT, PEEK, POKE, TAB, SPC or ON...GOTO with an improper argument. ID Illegal Direct. You cannot use an INPUT, DEF or GET statement as a direct command. LS Long String. Attempt was made by use of the concantenation operator to create a string more than 255 characters long. NF NEXT without FOR. The variable in a NEXT statement corresponds to no previously executed FOR statement. OD Out of Data. A READ statement was executed but all of the DATA statements in the program have already been read. The program tried to read too much data or insufficient data was included in the program. OM Out of Memory. Program too large, too many variables, too many FOR loops, too many GOSUB's, too complicated an expression, or any combination of the above. (see Appendix B) OV Overflow. The result of a calculation was too large to be represented in BASIC's number format. If an underflow (too small result) occurs, zero is given as the result and execution continues without any error message being printed. RG RETURN without GOSUB. A RETURN statement was encountered without a previous GOSUB statement being executed, SN Syntax error. Missing parenthesis in an expression, illegal character in a line, incorrect punctuation, etc. ST String Temporaries. A string expression was too complex. Break it into two or more shorter expressions. TM Type Mismatch. The left side of an assignment statement was a numeric variable and the right side was a string, or vice versa; or, a function which expected a string argument was given a numeric one or vice versa. UF Undefined Function. Reference was made to a user function which has never been defined. US Undefined Statement. An attempt was made to GOTO, GOSUB or THEN to a statement which does not exist. /0 Division by ZeroB SPACE HINTSIn order to make your program smaller and save space, the following hints may be useful. 1. Use multiple statements per line. There is a five-byte of overhead associated with each line in the program. Two of these five bytes contain the line number of the line in binary. This means that no matter how many digits you have in your line number (minimum line number is 0, maximum is 63999), it takes the same number of bytes. Putting as many statements as possible on a line will cut down on the number of bytes used by your program. 2. Delete all unnecessary spaces from your program. For instance: 10 PRINT X, Y, Z uses three more bytes than 10 PRINTX,Y,Z Note: All spaces between the line number and the first non-blank character are ignored. 3. Delete all REM statements. Each REM statement uses at least one byte plus the number in the comment text. For instance, the statement 130 REM THIS IS A COMMENT uses 24 bytes of memory. In the statement 140 X=X+Y: REM UPDATE SUM, the REM uses 14 bytes of memory including the colon before the REM. 4. Use variables instead of constants. Suppose you use the constant 3.14159 ten times in your program. If you insert a statement 10 P=3.1.4159 in the program, and use P instead of 3.14159 each time it is needed, you will save 40 bytes. This will also result in a speed improvement. 5. A program need not end with an END, so an END statement at the end of a program may be deleted. 6. Reuse variables. If you have a variable T which is used so hold a temporary result in one part of the program and you need a temporary variable later in your program, use it again. Or, if you are asking the terminal user to give a YES or NO answer to two differ- ent questions at two different times during the execution of the program, use the same temporary variable A$ to store the reply. 7. Use GOSUB's to execute sections of program statements that perform identical actions. 8. Use the zero elements of matrices; for instance, A(0), B(0,X).STORAGE ALLOCATION INFORMATIONSimple (non-matrix) numeric and strong variables like V use 7 bytes; 2 for the variable name, and5 for the value. Simple non-matrix string variables also use 7 bytes; 2 for the variable name, 1 for thelength, 2 for a pointer, and 2 are unused.Matrix variables require 7 bytes to hold the header, plus additional bytes to hold each matrix element.Each element that is an integer variable requires 2 bytes. Elements that are string variables or floatingpoint variables require 3 bytes or 5 bytes, respectively.String variables also use one byte of string space for each character in the string. This is truewhether the string variable is a simple string variable like A$, or an element of a string matrixsuch as Q1$(5,2).When a new function is defined by a DEF statement, 7 bytes are used to store the definition.Reserved words such as FOR, GOTO or NOT, and the names of the intrinsic functions such asCOS, INT and STR$ take up only one byte of program storage. All other characters in programsuse one byte of program storage each.When a program is being executed, space is dynamically allocated on the stack as follows: 1. Each active FOR...NEXT loop uses 22 bytes. 2. Each active GOSUB (one that has not returned yet) uses 6 bytes. 3. Each parenthesis encountered in an expression uses 4 bytes and each temporary result calculated in an expression uses 12 bytes.C SPEED HINTSThe hints below should improve the execution time of your BASIC program. Note that some ofthese hints are the same as those used to decrease the space used by your programs. This meansthat in many cases you can increase the efficiency of both the speed and size of your programs atthe same time. 1. Delete all unnecessary spaces and REM's from the program. This may cause a small decrease in execution time because BASIC would otherwise have to ignore or skip over spaces and REM statements. 2. THIS IS PROBABLY THE MOST IMPORTANT SPEED HINT. Use variables instead of constants. It takes more time to convert a constant to its floating point representation than it does to fetch the value of a simple or matrix variable. This is especially important within FOR...NEXT loops or other code that is executed repeatedly. 3. Variables which are encountered first during the execution of a BASIC program are allocated at the start of the variable table. This means that a statement such as 5 A=0:B=A:C=A, will place A first, B second, and C third in the symbol table (assuming line 5 is the first statement executed in the program). Later in the program, when BASIC finds a reference to the variable A, it will search only one entry in the symbol table to find A, two entries to find B and three entries to find C, etc. 4. Use NEXT statements without the index variable. NEXT is somewhat faster than NEXT I because no check is made to see whether the variable specified in the NEXT is the same as the variable in the most recent FOR statement.D CONVERTING BASIC PROGRAMS NOT WRITTEN FOR AIM 65 BASICThough implementations of BASIC on different computers are in many ways similar, there are someincompatibilities which you should watch for if you are planning to convert some BASIC programsthat were not written in AIM 65 BASIC. 1. Matrix subscripts. Some BASICs use "[" and "]" to denote matrix subscripts. AIM 65 BASIC uses "(" and ")". 2. Strings. A number of BASICs force you to dimension (declare) the length of strings before you use them. You should remove all dimension statements of this type from the program. In some of these BASICs, a declaration of the form DIM A$(I,J) declares a string matrix of J elements each of which has a length I. Convert DIM statements of this type to equivalent ones in AIM 65 BASIC: DIM A$(J). AIM 65 BASIC uses "+" for string concatenation, not "," or "&". AIM 65 BASIC uses LEFT$, RIGHT$ and MID$ to take substrings of strings. Other BASICs uses A$(I) to access the Ith character of the string A$, and A$(I,J) to take a substring of A$ from character position I to character position J. Convert as follows: OLD AIM 65 A$(I) MID$(A$,I,1) A$(I,J) MID$(A$,I,J-I+1) This assumes that the reference to a substring of A$ is in an expression or is on the right side of an assignment. If the reference to A$ is on the left hand side of an assignment, and X$ is the string expression used to replace characters in A$, convert as follows: OLD AIM 65 A$(I)=X$ A$=LEFT$(A$,I-1)+X$+MID$(A$,I+1) A$(I,J)=X$ A$=LEFT$(A$,I-1)+X$+MID$(A$,J+1) 3. Multiple assignments. Some BASICs allow statements of the form: 500 LET B=C=0. This statement would set the variables B & C to zero. In AIM 65 BASIC this has an entirely different effect. All the "='s" to the right of the first one would be interpreted as logical comparison operators. This would set the variable B to -1 if C equaled 0. If C did not equal 0, B would be set to 0. The easiest way to convert statements like this one is to rewrite them as follows: 500 C=0:B=C 4. Some BASICs use "/" instead of ":" to delimit multiple statements per line. Change all occurrences of "/" to ":" in the program. 5. Programs which use the MAT functions available in some BASICs will have to be re-written using FOR...NEXT loops to perform the appropriate operations. 6. A PRINT statement with no arguments will not cause a paper feed on the printer. To generate a paper feed (blank line), use PRINT "space"E ASCII CHARACTER CODESDECIMAL CHAR. DECIMAL CHAR. DECIMAL CHAR.------- ---- ------- ---- ------- ----000 NUL 043 + 086 V001 SOH 044 , 087 W002 STX 045 - 088 X003 ETX 046 . 089 Y004 EOT 047 / 090 Z005 ENQ 048 0 091 [006 ACK 049 1. 092 /007 BEL 050 2 093 ]008 BS 051 3 094 ^009 HT 052 4 095 _010 LF 053 5 096 `011 VT 054 6 097 a012 FF 055 7 098 b013 CR 056 8 099 c014 SO 057 9 100 d015 SI 058 : 101 e016 DLE 059 ; 102 f017 DC1 060 < 103 g018 DC2 061 = 104 h019 DC3 062 > 105 i020 DC4 063 ? 106 j021 NAK 064 @ 107 k022 SYN 065 A 108 l023 ETB 066 B 109 m024 CAN 067 C 110 n025 EM 068 D 111 o026 SUB 069 E 112 p027 ESCAPE 070 F 113 q028 FS 071 G 114 r029 GS 072 H 115 s030 RS 073 I 116 t031 US 074 J 117 u032 SPACE 075 K 118 v033 ! 076 L 119 w034 " 077 M 120 x035 # 078 N 121 y036 $ 079 O 122 z037 % 080 P 123 {038 & 081 Q 124 |039 ' 082 R 125 }040 ( 083 S 126 ~041 ) 084 T 127 DEL042 * 085 ULF=Line Feed FF=Form Feed CR=Carriage Return DEL=Rubout on TTYF ASSEMBLY LANGUAGE SUBROUTINESAIM 65 BASIC allows a user to link to assembly language subroutines, via the USR(W) function.This function allows one parameter to be passed between BASIC and a subroutine.The first step is to allocate sufficient memory for the subroutine. AIM 65 BASIC always uses allRAM memory locations, beginning at decimal location 530 (hex location 212), unless limited bythe user. You can limit BASIC's memory useage by answering the prompt MEMORY SIZE? (seeSubject 100) with some number less than 4096, assuming a 4K system. This will leave sufficientspace for the subroutine as the top of RAM.For example, if your response to MEMORY SIZE? is "2048", 1518 bytes at the top of RAMwill be free for assembly language subroutines.Parameter (W), passed to a subroutine by USR(W), will be converted to floating-point accumulatorlocated at $A9. The floating-point accumulator has the following format: ADDRESS CONTENT $A9 Exponent + $81 ($80 if mantissa = 00) $AA-$AD Mantissa, normalized so that Bit 7 of MSB is set. $AA is MSB, $AD is LSB. $AE Sign of mantissaA parameter passed to an assembly language subroutine from BASIC can be truncated by the sub-routine to a 2-byte integer and deposited in $AC (MSB) and $AD (LSB). If the parameter isgreater than 32767 or less than -32768, an FC error will result. The address of the subroutinethat converts a floating-point number to an integer is located in $B006, $B007.A parameter passed to BASIC from an assembly language subroutine will be converted to floating-point. The address of the subroutine that performs this conversion is in $B008, $B009. Theinteger MSB ($AC) must be in the accumulator; the integer LSB ($AD) must be in the Y register.Prior to executing USR, the starting address of the assembly language subroutine must be storedin locations $04 (LSB) and $05 (MSB). This is generally performed using the POKE command.Note that more than one assembly language subroutine may be called from a BASIC program,by changing the starting address in $04 and $05.Figure F-1 is the listing for a BASIC program that calls an assembly language subroutine located at$A00. Here's what the BASIC program does: * Line 10 - Stores the starting address of the assembly language subroutine ($A00) into locations $04 and $05, using POKE. * Line 20 - Asks for a number "N". * Line 30 - Calls the subroutine, with N as the parameter. * Line 40 - Upon return from the subroutine, the BASIC program prints X, the parameter passed from the subroutine to the BASIC program. * Line 50 - Loops back to get a new N ROCKWELL AIM 65 <5> MEMORY SIZE? 2048 WIDTH? 1518 BYTES FREE AIM 65 BASIC V1.1 OK 10 POKE 04,0: POKE 05 ,10 20 INPUT"NUMBER";N 30 X=USR(N) 40 PRINTX 50 GOTO 20Figure F-1. BASIC Program That Calls Assembly Language SubroutineThe assembly language subroutine (Figure F-2) performs these operations: * Prints the floating-point accumulator ($A9-$AE), using Monitor subroutines NUMA ($EA46), BLANK ($E83E) and CRLF ($E9F0), * Converts the floating-point accumulator to an integer, using the subroutine at $BF00. The address $BF00 was found in locations $B006, $B007. (Address $BF00 may vary with different versions of BASIC. Be sure to check locations $B006 and $B007 for the correct address.) * After conversion, the program again prints the floating point accumulator, * The program then swaps the bytes of the integer. * Finally, the program converts the result to floating point and returns to BASIC (JMP C0D3). Address $C0D3 was found in locations $B008, $B009. (Address $C0D3 may vary with different versions of BASIC. Be sure to check locations $B008 and $B009 for the correct address. <1> 0A26 *=A00 0A00 A0 LDY #00 0A02 A2 LDX #00 0A04 B5 LDA A9,X 0A06 20 JSR EA46 0A09 20 JSR E83E 0A0C E8 INX 0A0D E0 CPX #06 0A0F D0 BNE 0A04 0A11 20 JSR E9F0 0A14 C0 CPY #00 0A16 F0 BEQ 0A1F 0A13 A5 LDA AD 0A18 A4 LDY AC 0A1C 4C JMP C0D3 0A1F 20 JSR BF00 0A22 C8 INY 0A23 D0 BNE 0A02 0A25 00 BRK 0A26Figure F-2 Assembly Language SubroutineFigure F-3 shows the print-out for various values of "N". <6> OK RUN NUMBER? 128 88 80 00 00 00 00 88 00 00 00 80 00 -32768 NUMBER? 1 81 80 00 00 00 00 81 00 00 00 01 00 256 NUMBER? 4097 8D 80 06 00 00 00 8D 00 00 10 01 00 272 NUMBER? 256 89 80 00 00 00 00 89 00 00 01 00 00 1Figure F-3. Output for ExampleG STORING AIM 65 BASIC PROGRAMS ON CASSETTEAIM 65 BASIC Programs can be stored on cassette tape by using BASIC's SAVE and LOADcommands, or by using the AIM 65 Editor. Before employing either procedure be sure to care-fully observe the recorder installation and operation procedures given in Section 9 of theAIM 65 User's Guide.RECORDING ON CASSETTE USING THE BASIC SAVE COMMANDThe procedure to store a BASIC program is: 1. Install a cassette in the recorder, and manually position the tape to the program record position. Be sure to initialise the counter at the start of the tape. Note: Since remote control must be used to retrieve a BASIC program, observe the tape gap CAUTION in Section 9.1.5 (Step 1) of the AIM 65 User's Guide. 2. While in BASIC, type in SAVE. BASIC will respond with: OUT= 3. Enter a T (for "Tape"). BASIC will display: OUT=T F= 4. Enter the file name (up to five characters). If the file name is FNAME, BASIC will display: OUT=T F=FNAME T= 5. Put the recorder into Record mode. 6. Enter the recorder number (1 or 2) and type RETURN. 7. If remote control is being used, observe the procedures outlined in Section 9.1.5 of the AIM 65 User's Guide. 8. When recording has been completed, BASIC will display the cursor. 9. Switch the recorder out of record mode.RETRIEVING A PROGRAM FROM CASSETTE USING THE BASIC LOAD COMMANDThe procedure to retrieve a BASIC program is: 1. Install the cassette in the recorder., and manually position the tape to about five counts before the beginning of the desired file. Note: Remote control must be used when retrieving a file via BASIC. 2. While in BASIC, type in LOAD. BASIC will respond with: IN= 3. Enter a T (for "Tape"). BASIC will display: IN=T F= 4. Enter the file name. If the file name is FNAME, BASIC will display: IN=T F=FNAME T= 5. Enter the recorder number (1 or 2) and type RETURN. 6. Put the recorder into play mode. Be sure to observe the procedures outlined in Section 9.1.6 of the AIM 65 User's Guide. While the file is being read, each line will be displayed (and printed, if the printer is on). If the printer is on, the tape gap ($A409) will probably have to be increased. The file being loaded will not overlay any BASIC statements already entered unless the statement numbers are the same. 7. When loading has been completed. BASIC will display the cursor. 8. Switch the recorder out of play mode.CASSETTE OPERATIONS USING THE AIM 65 EDITORAIM 65 BASIC programs can also be stored and retrieved from cassette using the AIM 65 Editor.However, if the program is to be retrieved by BASIC at some future time, one rule must beobserved: When BASIC stores a program on cassette, it inserts a CTRL/Z after the last line. The AIM 65 Editor will strip off the CTRL/Z when it retrieves the program. Therefore, before storing a BASIC program from the Editor, the user must insert a CTRL/Z following the last line of the program.H ATN IMPLEMENTATIONThe ATN function (see Subject 307) can be programmed in RAM using the AIM 65 MnemonicEntry (I) and Alter Memory Locations (/) commands, as shown below. The program is writtenfor the AIM 65 with 4K bytes of RAM. The ATN function can be relocated elsewhere in memoryby changing the starting addresses of the instructions and constants, the conditional branchaddresses, the vector to the constants start address and the vector to the ATN function starTaddress.ATN FUNCTION CONSTANTS ENTERED BY ALTER MEMORY = 0F80 XX XX XX XX Constants Starting Address = 0F80 = 0F80 0B 76 83 83 8 0F84 BD D3 79 1E 0F88 F4 A6 F5 7B 0F8C 83 FC B0 10 0F90 7C 0C 1F 67 0F94 CA 7C DE 53 0F98 CB C1 7D 14 OF9C 64 70 4C 7D 0FA0 B7 EA 51. 7A 0FA4 7D 63 30 88 0FA8 7E 7E 92 44 0FAC 99 3A 7E 4C 0FR0 CC 91 C7 7F 0FB4 AA AA AA 13 0FR8 81 00 00 00 0FBC 00ATN FUNCTION INSTRUCTIONS STORED BY MNEMONIC ENTRY (I)XXXX *=0FBD Instructions Starting Address = 0F8D0FBD A5 LDA AE0FBF 48 PHA0FC0 10 BPL 0FC50FC2 20 JSR CCB80FC5 AS LDA A90FC7 48 PHA0FC8 C9 CMP #810FCA 90 BCC 0FD30FCC A9 LDA #FB0FCE A0 LDY #C60FD0 20 JSR C84E0FD3 A9 LDA #80 \ Starting Address of Constants = 0F800FD5 A0 LDY #0F /0FD7 20 JSR CD440FDA 68 PLA0FDB C9 CMP #810FDD 90 BCC 0FE60FDF A9 LDA #4E0FE1 A0 LDY #CE0FE3 20 JSR C58F0FE6 68 PLA0FE7 10 BPL 0FEC0FE9 4C JMP CCB80FEC 60 RTS0FECBASIC INITIALIZATION FOR ATN FUNCTIONBASIC memory must be initialized below the memory allocated to the ATN function. The ATNvector in RAM must also be changed from the address of the FC error message to the startingaddress of the ATN function instructions. This can be done using BASIC initialization, as follows:<5>MEMORY SIZE? 3968 Limit BASIC to F80WIDTH? 16 3438 BYTES FREE AIM 65 BASIC V1.1POKE 188,189 Change ATN function vector low to $BDPOKE 189,15 Change ATN function vector high to $0F?ATN (TAN(.5)) Test case to verify proper ATN function program .5 Expected answer = .5SAVING ATN OBJECT CODE ON CASSETTEThe object code for the ATN function can be saved on cassette by dumping addresses $00BBthrough $00BD (Jump instruction to ATN) and $0F80 through $0FEC (constants and instructions)after the function is initially loaded and verified.The ATN function can then be loaded from cassette by executing the Monitor L command afterBASIC has been initialized via the 5 command. After the ATN function has been loaded, reenterBASIC with the 6 command.###ð Apple II Computer Technical Information ðApple II Original ROM Informationhttp://members.buckeye-express.com/marksm/6502/ -- 27 June 2004 -- 9 of 257