From 67d25d837ac55f28a366c0a3b262e439a6e75fc3 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Sat, 19 Aug 2017 12:15:28 +0200 Subject: Add AmForth --- amforth-6.5/appl/atmega2561/atmega256.asm | 18 + amforth-6.5/appl/atmega2561/atmega256.eep.hex | 7 + amforth-6.5/appl/atmega2561/atmega256.hex | 647 ++ amforth-6.5/appl/atmega2561/atmega256.lst | 10182 ++++++++++++++++++++ amforth-6.5/appl/atmega2561/atmega256.map | 2503 +++++ amforth-6.5/appl/atmega2561/build.xml | 21 + amforth-6.5/appl/atmega2561/dict_appl.inc | 5 + amforth-6.5/appl/atmega2561/dict_appl_core.inc | 2 + amforth-6.5/appl/atmega2561/words/applturnkey.asm | 32 + 9 files changed, 13417 insertions(+) create mode 100644 amforth-6.5/appl/atmega2561/atmega256.asm create mode 100644 amforth-6.5/appl/atmega2561/atmega256.eep.hex create mode 100644 amforth-6.5/appl/atmega2561/atmega256.hex create mode 100644 amforth-6.5/appl/atmega2561/atmega256.lst create mode 100644 amforth-6.5/appl/atmega2561/atmega256.map create mode 100644 amforth-6.5/appl/atmega2561/build.xml create mode 100644 amforth-6.5/appl/atmega2561/dict_appl.inc create mode 100644 amforth-6.5/appl/atmega2561/dict_appl_core.inc create mode 100644 amforth-6.5/appl/atmega2561/words/applturnkey.asm (limited to 'amforth-6.5/appl/atmega2561') diff --git a/amforth-6.5/appl/atmega2561/atmega256.asm b/amforth-6.5/appl/atmega2561/atmega256.asm new file mode 100644 index 0000000..30e1300 --- /dev/null +++ b/amforth-6.5/appl/atmega2561/atmega256.asm @@ -0,0 +1,18 @@ +; the 256x devices are special since they *require* +; both a 24bit address space and they need a special +; flash store placement in the NRWW section, way outside +; of the standard 16bit jump distance. + +; note that dict_appl_core includes a store-i_big.asm +; instead if the normal store-i.asm file. This file +; has all the magic needed for the large address space. +; *everything else* is identical to other controllers. + +.include "preamble.inc" + +; cpu clock in hertz +.equ F_CPU = 14745600 +.include "drivers/usart_1.asm" + +; all of amforth is in one segment +.include "amforth-low.asm" diff --git a/amforth-6.5/appl/atmega2561/atmega256.eep.hex b/amforth-6.5/appl/atmega2561/atmega256.eep.hex new file mode 100644 index 0000000..9bebfd9 --- /dev/null +++ b/amforth-6.5/appl/atmega2561/atmega256.eep.hex @@ -0,0 +1,7 @@ +:10007200FFFF8012E102CC0043049A00B0219804F1 +:0A008200960986007B12010086003B +:06009A0002008A0F760F40 +:1000A4001508A60000000000FF21AF21AF210000C9 +:1000B4000A00E100EF00B600D1008B1100007811B6 +:0800C400500E6F0E5F0E1700D5 +:00000001FF diff --git a/amforth-6.5/appl/atmega2561/atmega256.hex b/amforth-6.5/appl/atmega2561/atmega256.hex new file mode 100644 index 0000000..1ad9cb0 --- /dev/null +++ b/amforth-6.5/appl/atmega2561/atmega256.hex @@ -0,0 +1,647 @@ +:020000020000FC +:0200040039D1F0 +:0200080037D1EE +:02000C0035D1EC +:0200100033D1EA +:0200140031D1E8 +:020018002FD1E6 +:02001C002DD1E4 +:020020002BD1E2 +:0200240029D1E0 +:0200280027D1DE +:02002C0025D1DC +:0200300023D1DA +:0200340021D1D8 +:020038001FD1D6 +:02003C001DD1D4 +:020040001BD1D2 +:0200440019D1D0 +:0200480017D1CE +:02004C0015D1CC +:0200500013D1CA +:0200540011D1C8 +:020058000FD1C6 +:02005C000DD1C4 +:020060000BD1C2 +:0200640009D1C0 +:0200680007D1BE +:02006C0005D1BC +:0200700003D1BA +:0200740001D1B8 +:02007800FFD0B7 +:02007C00FDD0B5 +:02008000FBD0B3 +:02008400F9D0B1 +:02008800F7D0AF +:02008C00F5D0AD +:02009000F3D0AB +:02009400F1D0A9 +:02009800EFD0A7 +:02009C00EDD0A5 +:0200A000EBD0A3 +:0200A400E9D0A1 +:0200A800E7D09F +:0200AC00E5D09D +:0200B000E3D09B +:0200B400E1D099 +:0200B800DFD097 +:0200BC00DDD095 +:0200C000DBD093 +:0200C400D9D091 +:0200C800D7D08F +:0200CC00D5D08D +:0200D000D3D08B +:0200D400D1D089 +:0200D800CFD087 +:0200DC00CDD085 +:1000E000CBD000200010FFFF39000A0041546D659D +:1000F00067613235363107FF3E72782D62756600D2 +:1001000000008200082F10911002E0E0F2E0E10F01 +:10011000F31D008313951F7010931002899199911C +:100120000C941F0106FF6973722D72787B001B010E +:10013000CE04CE0031054A05CE0403006D12C7047B +:10014000A200BF0E8100AE041B01CE049700CE04B6 +:100150004800EB08CE040002CE041600ED0533097A +:10016000AE0406FF72782D62756692001B01D10005 +:10017000C704B700CE04110231054A05CE040002BF +:10018000360631055D05C806CE040F00AC06CE0468 +:1001900011022605AE0407FF72783F2D62756600D6 +:1001A000B1001B01B70ECE0411023105CE041002BE +:1001B0003105AC05AE0407FF74782D706F6C6C00D0 +:1001C000CB001B01EF00C704E200CE04CE002605E1 +:1001D000AE0408FF74783F2D706F6C6CDB001B0160 +:1001E000B70ECE04C8003105CE042000AC06AE0424 +:1001F00004FF75627272E9000905CA001A10241022 +:1002000006FF2B7573617274F8001B01CE04980011 +:10021000CE04C9002605CE040600CE04CA00260579 +:10022000FC004A059207CE04CD002605CE04CC0082 +:060230002605A400AE0447 +:040000000C94C00E8E +:10023600BF93AF93DB011196B21499F4FD015527D4 +:10024600EE0FFF1F551F5BBF679177911196FB015C +:100256005527EE0FFF1F551F5BBF07911791F8013A +:1002660009949A938A938B2D9927BB2466E079E0AB +:10027600EECF0A920FB60A920F900F900F900A9443 +:10028600B02CFF93EF93E2E1F2E00694E00DF31D4C +:10029600008003940082EF91FF9109900FBE0990B0 +:1002A600089502FF6D2B00011B0155127908AE045B +:1002B60003FF75642A0054011B014A059805790657 +:1002C60072055D058F0579067A053606AE0404FFCC +:1002D600756D61785B011B01CA09F505C7047401D8 +:1002E6005D057205AE0404FF756D696E6A011B013A +:1002F600CA090006C70480015D057205AE041B012C +:10030600CE040080AC06B305C7048B017412AE049C +:10031600E405AE040AFF6E616D653E666C61677347 +:1003260076011B012C08CE0400FFAC06AE0406FFC6 +:100336006E65776573748D01DC044B0206FF6C6194 +:10034600746573749A01DC044F0208FF28637265B2 +:1003560061746529A1011B011A0E05034A059F0157 +:10036600C2091A05EA029F011A05AE0401005C00E3 +:10037600A8011B01010E8905E3091A05AE04010057 +:100386002800B9011B01CE042900ED0DD309AE04E6 +:1003960007FF636F6D70696C6500C2011B018F05F5 +:1003A6004A05111098052C08DC01AE0401FF2C004B +:1003B600CB011B01130A0D08130AC806FF0F140A06 +:1003C600AE0403005B275D00D9011B01700CF2012E +:1003D600AE0407006C69746572616C00E4011B0170 +:1003E600D101CE04DC01AE040800736C6974657239 +:1003F600616CEC011B01D101D30BE10BAE041B01B7 +:10040600130AD101FFFFAE041B01BD0F130A5D05E0 +:100416000D08AE041B01130AAE041B01BD0FDC015F +:10042600AE040500616865616400F7011B01D10136 +:10043600BD040202AE040200696614021B01D1016A +:10044600C7040202AE040400656C73651E021B013C +:10045600D101BD0402025D050702AE040400746802 +:10046600656E26021B010702AE0405006265676918 +:100476006E0031021B010D02AE0405007768696C3F +:10048600650038021B0121025D05AE040600726597 +:100496007065617440021B0162023502AE040500FC +:1004A600756E74696C0049021B01CE04C704DC0139 +:1004B6001002AE040500616761696E0052021B01FD +:1004C600D101BD041002AE040200646F5D021B017F +:1004D600D10134070D02ED05C502AE0404006C6FB0 +:1004E6006F7067021B01D1016207AC02AE04050002 +:1004F6002B6C6F6F700071021B01D1015307AC02A8 +:10050600AE0405006C65617665007A021B01D101B7 +:100516006D071902C502AE0403003F646F00840232 +:100526001B01D1019B0221026A025D05C502AE04D0 +:100536001B01CA096D124A059805C704A302D3090F +:100546008F059606AE0407FF656E646C6F6F7000CC +:100556008F021B011002B9025205C704B50235020B +:10056600BD04AE02AE0402FF6C3EA6021B01D80219 +:1005760012051205CE04FEFFD802FE06AE0402FFE7 +:100586003E6CB6021B017912D802FE06D80212058D +:100596001A05AE0403FF6C703000C20209057E0026 +:1005A6001A10241002FF6C70CD02DC04510206FF03 +:1005B600637265617465D5021B01AE010E03D1013C +:1005C600E904AE0406FF686561646572DA021B0120 +:1005D600130A980598054A05C105C704FC024A0591 +:1005E600CE0400FFB506E50B8F05F907DC018F0584 +:1005F600AE04CE04F0FFA70C07FF776C73636F7031 +:100606006500E50279107A001A10241006FF72655B +:100616007665616CFF021B019F01C2091205520536 +:10062600C70419039F0112055D05D507AE04050031 +:10063600646F65733E0009031B01D1013203D101CA +:100646000E94D1012703AE049A938A93CB010196A7 +:100656007F917F916F91BF93AF93DB01EDCD1B012E +:100666008F059F01C2091205F907E4100D08AE04B3 +:1006760001FF3A001A031B01AE0149037205AE04DD +:1006860007FF3A6E6F6E616D65003B031B01130A2F +:100696004A05A6011A05D1011B015E03AE0401003D +:1006A6003B0043031B01D101AE0466030E03AE04F7 +:1006B60001FF5D0052031B017412AF091A05AE0457 +:1006C60001005B005B031B01ED05AF091A05AE04D3 +:1006D60008FF7661726961626C6563031B01240A17 +:1006E6007D0379122D0AAE0408FF636F6E73746181 +:1006F6006E746B031B01AE010E03D101DC04DC0139 +:10070600AE0404FF7573657277031B01AE010E0319 +:10071600D101EF04DC01AE040700726563757273E4 +:10072600650084031B01A6011205DC01AE0409FF66 +:10073600696D6D656469617465008F031B0143040F +:10074600F9074A052C08CE04FF7FAC065D050D08A7 +:10075600AE0406005B636861725D9A031B01D101FA +:10076600CE04500DDC01AE04060061626F72742285 +:10077600AC031B012509D101CE03AE0405FF61625E +:100786006F727400B7031B01E405A70C06FF3F61F7 +:10079600626F7274C1031B017A05C704D403060C89 +:1007A600C603D309AE0409FF6765742D73746163CC +:1007B6006B00C9031B014A05C2095D05F9074A0515 +:1007C6009805ED055D059B02C704F403340745074C +:1007D600CE06BC0968053606F9075D05E40553072C +:1007E600EA03D3098F05AE0409FF7365742D73748C +:1007F60061636B00D6031B016805BA05C7040604CE +:10080600CE04FCFFA70CCA09D5075D05ED059B02C2 +:10081600C70413043407C209DB09D50762070E04AF +:100826007205AE0409FF6D61702D737461636B0010 +:10083600F7031B014A05C2095D05F907BC094C12FD +:100846009B02C704380434074507F9075D05980578 +:10085600A105B8045205C70434048F0572056D0757 +:10086600AE048F057912530727047205ED05AE0411 +:100876000BFF6765742D63757272656E74001504DF +:100886001B01CE048400F907AE0409FF6765742DC9 +:100896006F72646572003B041B01CE048800DD03A1 +:1008A600AE0409FF6366672D6F72646572004804C3 +:1008B600DC04880007FF636F6D7061726500540485 +:1008C6006404BF93AF938C0189919991DC0189915E +:1008D60099919C0189919991FC01ED90F190EF1409 +:1008E60051F40A9519F02A95C1F701C02A95022BF1 +:1008F60011F4882702C08FEF00C0982FAF91BF91E7 +:100906009BCC07FF6E66613E6C6661005D041B0151 +:10091600D810C8069D063606AE040BFF6170706CD3 +:100926007475726E6B65790084041B010501DD0820 +:10093600CA0F480CA409CE04E8035B068905420ADF +:10094600880BD30B04006B487A20060CAE0404FF18 +:10095600657869749004AF04AF91BF916DCC07FFC1 +:100966006578656375746500AA04B904BC0189914C +:1009760099916DCCBE04FD015527EE0FFF1F551F43 +:100986005BBFA791B79158CCC804982B89919991D0 +:1009960091F3119651CCCF049A938A93FD01552772 +:1009A600EE0FFF1F551F5BBF87919791119644CCA1 +:1009B600DC049A938A93FB0131965527EE0FFF1FAD +:1009C600551F5BBF8791979137CCE9049A938A9319 +:1009D600CB01019631CCEF049A938A93FB013196B1 +:1009E6005527EE0FFF1F551F5BBF87919791840D0B +:1009F600951D22CC07FF2876616C75652900B20427 +:100A06001B01AE010E03D1010905AE041DDE4A0528 +:100A160011102C08B804AE0401FF4000FD041305B4 +:100A2600FC018191919108CC01FF21000F051B0566 +:100A3600FC01899199919183808389919991FCCB4D +:100A460002FF632117052705FC018991999180838F +:100A560089919991F1CB02FF634023053205FC0190 +:100A660099278081E9CB02FF40752E051B019B0764 +:100A760036061205AE0402FF217536051B019B07DB +:100A860036061A05AE0403FF647570003E054B0575 +:100A96009A938A93D1CB04FF3F647570460553053C +:100AA600082F092B11F09A938A93C6CB04FF73770C +:100AB60061704E055E058C01899199911A930A938E +:100AC600BBCB04FF6F766572590569059A938A93C5 +:100AD6008A819B81B1CB04FF64726F7064057305D4 +:100AE60089919991A9CB03FF726F74006E057B05FE +:100AF6008C0129913991899199913A932A931A9364 +:100B06000A939ACB03FF6E69700076058A052296D2 +:100B160093CB02FF723E850590059A938A938F9137 +:100B26009F918ACB02FF3E728C0599059F938F9306 +:100B36008991999181CB02FF72409505A2059A93FE +:100B46008A938F919F919F938F9376CB02FF3C3E22 +:100B56009E051B016D12B305AE0402FF303DA905CB +:100B6600B405982BD1F530C002FF303CB005BB056B +:100B760097FD2AC032C002FF303EB705C205821576 +:100B860093055CF151F120C003FF64303E00BE05C1 +:100B9600CC05821593058991999182059305ECF010 +:100BA600E1F012C003FF64303C00C705DA05229667 +:100BB60097FD0C94E7050C94F00504FF74727565B7 +:100BC600D505E5059A938A938FEF9FEF35CB01FF05 +:100BD6003000E005EE059A938A93C1012DCB02FF02 +:100BE600753CEA05F6052991399182179307A8F312 +:100BF600A1F3EACF02FF753EF2051B015D05F5057F +:100C0600AE0401FF3C00FD0508062991399128171D +:100C160039071CF7D9CF01FF3E00040612062991B9 +:100C2600399128173907CCF2C1F2CECF04FF6C6F89 +:100C360067320E061E06FC01992780E18A9522F08E +:100C4600EE0FFF1FD8F7F8CA9A95F6CA01FF2D00D6 +:100C560019062D0609911991081B190BC801ECCA32 +:100C660001FF2B002906370609911991800F911F64 +:100C7600E3CA02FF6D2A330640068C0189919991D9 +:100C86009C0131027001209FC0013003F308900DD2 +:100C9600E11CF31C1203F308900DE11CF31C9A935C +:100CA6008A93C701C9CA06FF756D2F6D6F643C062E +:100CB6005C067C01299139910991199140E15527EA +:100CC600000F111F221F331F551F2E153F055205FA +:100CD60018F003952E193F094A9589F73A932A93F6 +:100CE600C801AACA03FF756D2A0056067A068C014A +:100CF60089919991809FF00122273327909FF00DCB +:100D0600211D331D819FF00D211D331D919F200D47 +:100D1600311DCF019A938A93C9018ECA06FF696E67 +:100D260076657274750697068095909585CA02FF5A +:100D3600322F91069E06959587957ECA02FF322A26 +:100D46009A06A506880F991F77CA03FF616E64008D +:100D5600A106AD0609911991802391236DCA02FF60 +:100D66006F72A806B60609911991802B912B64CA59 +:100D760003FF786F7200B206C006099119918027A9 +:100D860091275ACA02FF312BBB06C906019654CADF +:100D960002FF312DC506CF0601974ECA07FF3F6EEB +:100DA600656761746500CB061B01BA05C704DC06DE +:100DB600A50AAE0406FF6C7368696674D106E3067D +:100DC600FC018991999131971AF0880F991FFBCFF1 +:100DD60033CA06FF727368696674DD06F206FC01A3 +:100DE6008991999131971AF096958795FBCF24CAE8 +:100DF60002FF2B21EC06FF06FC01899199912081C7 +:100E06003181820F931F808391838991999114CAAE +:100E160003FF72704000FB0610079A938A938DB702 +:100E26009EB70ACA03FF727021000B071A072FB775 +:100E3600F8948DBF9EBF2FBF89919991FDC903FF7D +:100E460073704000150727079A938A93CE01F4C959 +:100E560003FF7370210022073007EC0189919991F5 +:100E6600EBC9350729913991E0E83E0F821B930BB8 +:100E76003F932F939F938F9389919991DDC901FF9A +:100E860069002B0746079A938A938F919F91EF915A +:100E9600FF91FF93EF939F938F938E0F9F1FCCC964 +:100EA6005407EF91FF91E80FF91F899199911BF073 +:100EB600FF93EF9360CD0F911F911196BDC9630704 +:100EC600EF91FF913196BBF3F3CF06FF756E6C6F12 +:100ED6006F7042076E071F910F911F910F91ACC95A +:100EE60006FF636D6F76653E68077907BF93AF931C +:100EF600E991F991A991B991092F082B41F0E80FD1 +:100F0600F91FA80FB91F1E9112930197E1F7AF9130 +:100F1600BF918991999190C902FF3E3C730793074F +:100F2600092F982F802F88C903FF757040008F07FF +:100F36009C079A938A93C2017FC903FF75702100AB +:100F46009707A5072C018991999176C903FF316D01 +:100F56007300A007AE07E6E6FEE03197F1F7000062 +:100F66006BC903FF323E7200A907B907FC018991DC +:100F760099919F938F93FF93EF93899199915CC970 +:100F860003FF32723E00B407C8079A938A93EF9123 +:100F9600FF918F919F919A938A93CF014DC902FF3A +:100FA6002165C307D607FC01899199912FB7F8945B +:100FB60028D000B5081709F00BD0319622D000B51D +:100FC600091711F0892F04D02FBF8991999134C93F +:100FD600F999FECF07B700FDFDCFF2BDE1BD80BD9B +:100FE600FA9AF99A089502FF4065D207FA072FB7D1 +:100FF600F894FC0106D080B5319603D090B52FBF8A +:101006001BC9F999FECFF2BDE1BDF89A089502FF1A +:101016002169F6077910A4001A10241004FF286924 +:1010260021290A0816089C0189919991AF93BF93CB +:10103600CF93DF93E1E0EBBFF0EFE0E01995DF91AE +:0C104600CF91BF91AF9189919991F6C8AC +:020000023000CC +:10E0000010D0E094F0948E219F21982B19F0F90103 +:10E0100003E023D0F90105E020D0F90101E11DD092 +:10E020000895F901E078FF7FEF01A0E8B0E0FE017C +:10E030005527EE0FFF1F551F5BBF47915791FE01FC +:10E04000E217F30711F00A0102C07A010C0101E0A6 +:10E0500004D02196119759F708951FB71F93F8948C +:10E06000F999FECF17B710FDFDCF5527EE0FFF1F13 +:0EE07000551F5BBF07BFE8951F911FBF0895A6 +:020000020000FC +:1010520002FF406911082D08FC015527EE0FFF1F02 +:10106200551F5BBF87919791E9C803FF6E3E7200DF +:1010720029083B08FC01082F899199919F938F932E +:101082000A95D1F7EF93FF9389919991D7C803FFFE +:101092006E723E0036084D089A938A93FF91EF9143 +:1010A2000E2F8F919F919A938A930A95D1F7CF0130 +:1010B200C5C803FF64322A0048085F0809911991E4 +:1010C200000F111F881F991F1A930A93B7C803FFB5 +:1010D20064322F005A086D080991199195958795E8 +:1010E200179507951A930A93A9C802FF642B6808FB +:1010F2007A0829913991E990F99049915991240FEF +:10110200351F8E1D9F1D3A932A9398C802FF642DA6 +:1011120076088B0829913991E990F9904991599172 +:10112200421B530BE80AF90A5A934A93C70186C82D +:1011320007FF64696E76657274008708A0080991DA +:10114200199180959095009510951A930A9376C8F7 +:1011520002FF752E99081B01ED05900BAE0403FFEB +:10116200752E7200A9081B01ED055D05990BAE04F1 +:101172000DFF73686F772D776F72646C69737400FB +:10118200B0081B01CE04C8085D05BD10AE041B01EA +:10119200D810060C480CE405AE0405FF776F7264A4 +:1011A2007300B9081B01CE048A00F907C208AE0415 +:1011B20004FF2B696E74CE08DE0878943FC804FFE2 +:1011C2002D696E74D908E508F89438C804FF696E71 +:1011D2007421E0081B01CE0400003606D507AE04D8 +:1011E20004FF696E7440E7081B01CE040000360656 +:1011F200F907AE0408FF696E742D74726170F1080C +:101202000209B82E8991999119C81B01F508B804F1 +:101212000B09AE040C0901D011C8189504FF7069BE +:10122200636BFB081B01C806BC09260736061205BC +:10123200AE0402002E220F091B012509D101060C62 +:10124200AE04020073221A091B01CE042200ED0D26 +:10125200AF091205C7042E09FD01AE0404FF666939 +:101262006C6C22091B017A057A055205C7044009F4 +:101272004C1234074A054507260562073B097205E9 +:10128200AE040BFF656E7669726F6E6D656E7400EB +:101292002F09DC04820009FF776F72646C69737432 +:1012A200730000001B01CE040800AE0404FF2F707F +:1012B20061644C091B012607E9092C06AE0405FFEF +:1012C2002F686F6C640057091B01E909240A2C0678 +:1012D200AE040AFF666F7274682D6E616D656009F7 +:1012E2001B01D30B0700616D666F72746800AE0458 +:1012F20007FF76657273696F6E006A091B01CE047F +:101302004100AE0403FF6370750079091B01CE042E +:101312007500320CAE0408FF6D63752D696E666F41 +:1013220083091B01CE047100AE0405FF2F7573659E +:1013320072008C091B01CE042C00AE0405FF665F0F +:101342006370750042091B01CE040000CE04E10067 +:10135200AE0405FF7374617465009F09DC045302D7 +:1013620004FF62617365AA09EF040C0005FF63655F +:101372006C6C7300B109A50605FF63656C6C2B00EC +:10138200B709C30902960C941F0104FF32647570F9 +:10139200BD091B0168056805AE0405FF3264726F62 +:1013A2007000C6091B0172057205AE0404FF747554 +:1013B200636BCE091B015D056805AE0403FF3E6940 +:1013C2006E00D709EF04180003FF70616400DF09A3 +:1013D2001B01240ACE0428003606AE0404FF656D04 +:1013E2006974E50979100E0042104E1005FF656D13 +:1013F20069743F00EF097910100042104E1003FF8C +:101402006B657900F7097910120042104E1004FF43 +:101412006B65793F000A7910140042104E1002FFEA +:101422006470080A090574001A10241005FF656823 +:1014320065726500100A090578001A10241004FF6D +:1014420068657265170A090576001A10241005FFEF +:10145200616C6C6F7400200A1B01240A3606FF0FB0 +:10146200250AAE0403FF62696E00280A1B01791285 +:10147200B5091A05AE0407FF646563696D616C0006 +:10148200330A1B01CE040A00B5091A05AE0403FF94 +:10149200686578003C0A1B01CE041000B5091A05E4 +:1014A200AE0402FF626C480ADC04200007FF747578 +:1014B200726E6B657900520A791080001A1024103E +:1014C20004FF2F6D6F64570A660A9C0109911991F6 +:1014D200412F432717FF04C0109500950F5F1F4F40 +:1014E20037FF04C0309520952F5F3F4FEE24FF1841 +:1014F20051E1001F111F5A9539F447FF04C010959E +:1015020000950F5F1F4F0BC0EE1CFF1CE21AF30A7F +:1015120020F4E20EF31E8894ECCF0894EACFFA92FC +:10152200EA92C8010C941F0105FF752F6D6F6400CC +:10153200610A1B019805ED058F055B06AE0406FFE7 +:101542006E6567617465950A1B019606C806AE044E +:1015520001FF2F00A00A1B01650A8905AE0403FFE3 +:101562006D6F6400A90A1B01650A7205AE0403FFD0 +:1015720061627300B00A1B014A05D706AE0403FF7D +:101582006D696E00B80A1B01CA091106C704CA0AAE +:101592005D057205AE0403FF6D617800C00A1B0190 +:1015A200CA090706C704D60A5D057205AE0406FF1E +:1015B20077697468696ECC0A1B0168052C06980568 +:1015C2002C068F05F505AE0407FF746F7570706504 +:1015D2007200D80A1B014A05CE046100CE047B00CA +:1015E200DD0AC704F70ACE04DF00AC06AE0407FF2B +:1015F200746F6C6F77657200E50A1B014A05CE04B1 +:101602004100CE045B00DD0AC7040A0BCE042000B1 +:10161200B506AE0403FF686C6400F80ADC045502E8 +:1016220004FF686F6C640B0B1B010F0B4A0512055C +:10163200CE064A0598055D051A058F052605AE04F6 +:1016420002FF3C23110B1B01E9090F0B1A05AE0423 +:1016520001FF2300210B1B01B5091205A90B7A0515 +:10166200CE04090068050706C7043A0BCE0407003A +:101672003606CE0430003606150BAE0402FF237385 +:10168200290B1B012C0BCA09B506B305C704430B72 +:10169200AE0402FF233E3F0B1B01D3090F0B1205C1 +:1016A200E90968052C06AE0404FF7369676E4A0BEC +:1016B2001B01BA05C704600BCE042D00150BAE0446 +:1016C20003FF642E7200550B1B019805DB093A11CA +:1016D200240B420B7A05590B4D0B8F0568052C061E +:1016E200510C610CAE0402FF2E72610B1B019805B6 +:1016F20055128F05650BAE0402FF642E740B1B019D +:10170200ED05650B480CAE0401FF2E007D0B1B019D +:101712005512800BAE0403FF75642E00850B1B016E +:10172200ED05990B480CAE0404FF75642E728C0B08 +:101732001B019805240B420B4D0B8F0568052C06E7 +:10174200510C610CAE0406FF75642F6D6F64950B2E +:101752001B019805ED05A1055B068F055D05980542 +:101762005B068F05AE0406FF64696769743FA40BCC +:101772001B01EB0A4A05CE0439001106CE04000112 +:10178200AC0636064A05CE0440011106CE04070116 +:10179200AC062C06CE0430002C064A05B50912050B +:1017A200F505AE041B01A105320C8F056805C806BC +:1017B2009D063606C8069805AE0402FF732CB40BCC +:1017C2001B014A05E50BAE041B01DC014A059D061F +:1017D200DB09A4062C069805ED059B02C704F80B4D +:1017E20034074A051205DC01C2096207F20B8F05B4 +:1017F200C105C704FF0B4A053105DC017205AE04C1 +:1018020005FF697479706500DE0B1B014A059D06B0 +:10181200DB09A4062C069805ED059B02C7041A0CE9 +:1018220034074A052C084A05270C230CC806620710 +:10183200120C8F05C105C704210C4A052C08270C80 +:101842007205AE041B019207270CAE041B01CE04E5 +:10185200FF00AC06F309AE0406FF69636F756E7490 +:10186200010C1B014A05C8065D052C08AE0402FFE7 +:1018720063722D0C1B01CE040D00F309CE040A0085 +:10188200F309AE0405FF737061636500380C1B0138 +:10189200550AF309AE0406FF737061636573430C66 +:1018A2001B01ED05D00A4A05C7045B0C480CCE06A5 +:1018B200BD04540C7205AE0404FF747970654C0CBF +:1018C2001B014C129B02C7046C0C340745073105FF +:1018D200F3096207670CAE0401FF27005D0C1B01D0 +:1018E2001A0E320F3D0F4A05B00F6D125D052C081E +:1018F200CE04E50F6D12B506C704820CCE04F3FFC9 +:10190200A70C7205AE0407FF68616E646C65720015 +:101912006D0CEF040A0005FF636174636800840CB8 +:101922001B01260798058A0C120598050F078A0CD9 +:101932001A05B8048F058A0C1A058F057205ED0584 +:10194200AE0405FF7468726F77008C0C1B014A05A8 +:10195200B305C704AE0C7205AE048A0C1205190752 +:101962008F058A0C1A058F055D0598052F077205EC +:101972008F05AE0405FF63736B697000A20C1B0137 +:1019820098054A05C704CF0C68053105A1056D12FB +:10199200C704CF0C74120B0EBD04C20C8F05720566 +:1019A200AE0405FF637363616E00BB0C1B019805F7 +:1019B20068054A053105A1056D12B305C704EC0C93 +:1019C2005D05CE065D056805BA05B305C704EC0CD6 +:1019D200C806BD04DA0C890568052C068F05720558 +:1019E200AE0406FF616363657074D20C1B01680567 +:1019F2003606CE066805040A4A05380DB305C70443 +:101A02002A0D4A05CE0408006D12C7041A0D72058C +:101A12007A05CA09110698057A057A058F05C70461 +:101A2200180D300DCE06980568058F056E01BD04B0 +:101A3200280D4A05550A0706C704210D7205550AE5 +:101A42004A05F30968052605C80668057A01BD043A +:101A5200FC0C720589055D052C063B0CAE041B01CE +:101A6200CE0408004A05F309480CF309AE041B0131 +:101A72004A05CE040D006D125D05CE040A006D12FA +:101A8200B506AE0406FF726566696C6CF20C7910DD +:101A92001A0042104E1004FF63686172430D1B016D +:101AA2001A0E72053105AE0406FF6E756D6265721F +:101AB2004C0D1B01B509120598059E0D9805B10D37 +:101AC2009E0D8F05B50698054A05B305C704710D2D +:101AD200D3098F0572058F05B5091A05ED05AE0408 +:101AE200B807ED05ED05C707CF0D5205C704930DE5 +:101AF20074126D12C7048A0D3105CE042E006D12C8 +:101B0200C7048B0D8F05C704870D47117912BD04D9 +:101B1200990D7205D3098F0572058F05B5091A054E +:101B2200ED05AE04D3098F05C704980DA50A7412FA +:101B32008F05B5091A05E405AE041B0168053105D8 +:101B4200CE042D006D124A059805C704AA0D741221 +:101B52000B0E8F05AE04E9040A00100002000A0011 +:101B62001B0168053105CE0423002C064A05ED054C +:101B7200CE040400DD0AC704C70DAC0D36062C08DE +:101B8200B5091A0574120B0EBD04C80D7205AE0418 +:101B920007FF3E6E756D62657200550D1B014A05A9 +:101BA200C704E70D68053105B90BB305C704DB0DA2 +:101BB2007205AE0498056B11B50912055F018F0518 +:101BC20057016B1174120B0EBD04D00DAE0405FF4C +:101BD200706172736500C90D1B019805010EE3095E +:101BE20012050B0E8F05D70C4A05C806E309FE063F +:101BF20074120B0EAE0406FF736F75726365E80D07 +:101C02007910160042104E1007FF2F737472696E1E +:101C12006700FC0D1B017A05680536067A057A0510 +:101C22002C06AE040AFF70617273652D6E616D65DC +:101C3200050E1B01550A1E0EAE041B019805010E6E +:101C4200E30912050B0EA105C00C8F05D70CCA09BA +:101C52003606010E72052C06E3091A05AE0407FFCB +:101C620066696E642D787400130E1B01CE04420E59 +:101C7200CE0488001C04B305C704410ED309ED0548 +:101C8200AE041B019805CA098F058B104A05C704CB +:101C92004F0E9805890589058F05E405AE041B01E1 +:101CA200D30B0300206F6B00060CAE0403FF2E6FF4 +:101CB2006B00300E79101C0042104E101B01D30B2A +:101CC20002003E203B0C060CAE0406FF2E7265613C +:101CD2006479570E7910200042104E101B01D30B6D +:101CE2000400203F3F20060CB50912059805420A60 +:101CF200880BE3091205880B8F05B5091A05AE0496 +:101D020006FF2E6572726F72660E79101E00421007 +:101D12004E1004FF71756974810E1B01D102D80245 +:101D22001A05EF0E2F07FC0E19076603AF091205FD +:101D3200B305C7049D0E6B0E480DC704AF0ECE044B +:101D4200150F910C5205C704AF0E4A05CE04FEFFD3 +:101D52000706C704AD0E860EBD048F0E5B0EBD04D2 +:101D6200970E05FF7061757365008A0E7910570230 +:101D72002E10381004FF636F6C64B20EC00EA4B64E +:101D820022243324BB2424BEE0E0F2E02192E0309E +:101D9200E9F7F232D9F7E9E5F2E02F010FEF0DBFD3 +:101DA200048311E21EBF1583CFEAC683D1E2D78333 +:101DB200A2EEBEE00C941F0104FF7761726DBB0EB0 +:101DC2001B01B611CE04E50FCE04B70E59106603FF +:101DD2005D0A8E0E03FF73703000DD0E09050600EA +:101DE20042104E1002FF7370EB0EEF04080003FF67 +:101DF20072703000F30E1B01000F1205AE04EF04E7 +:101E0200040005FF646570746800F80E1B01EF0E94 +:101E120026072C069D06CE06AE0409FF696E746580 +:101E2200727072657400020F1B011A0E4A05C70414 +:101E3200260F320F3D0FAF091205C704210F1110F3 +:101E42002C08B804BD0FBD04160FD309AE0410FF51 +:101E5200666F7274682D7265636F676E697A6572F8 +:101E62000E0F09057C001A10241009FF7265636FBA +:101E7200676E697A6500280F1B01CE04480F5D0565 +:101E82001C04B305C704470FD309B00FAE041B01EE +:101E92007A057A05CA09B8077A05B804C7077A0528 +:101EA2004A05B00F6D12C704590F7205ED05AE0455 +:101EB20089058905E405AE0406FF64743A6E756D02 +:101EC200360FE904E50FF201F20107FF64743A6488 +:101ED2006E756D005D0FE904E50F6512651207FF6F +:101EE2007265633A6E756D00660F1B015A0DC70469 +:101EF200820F74126D12C704800F620FAE046C0F52 +:101F0200AE04B00FAE0408FF7265633A66696E6490 +:101F1200700F1B01360E4A05B305C704930F7205F5 +:101F2200B00FAE049A0FAE0405FF64743A787400E1 +:101F3200840FE9049E0FA20F65121B017205B804FB +:101F4200AE041B01BA05C704A80FDC01AE04B80435 +:101F5200AE0407FF64743A6E756C6C00950FE90469 +:101F6200B40FB40FB40F1B01CE04F3FFA70C06FF8E +:101F72003F737461636BAA0F1B01070FBA05C70495 +:101F8200C50FCE04FCFFA70CAE0403FF76657200FA +:101F9200B80F1B017109060C480CB50912057F091F +:101FA200420A5512240B2C0BCE042E00150B420BA9 +:101FB2004D0B610CB5091A05480C8709060CAE04D5 +:101FC20004FF6E6F6F70C60F1B01AE0406FF756EC5 +:101FD20075736564E10F1B012607240A2C06AE0403 +:101FE2000200746FE70F1B01700C5E12AF0912053D +:101FF200C7040510D101FF0FDC01AE041B018F05E0 +:102002004A05111098052C084A05111011102C08C8 +:10201200B804AE0407FF692D63656C6C2B00F10FE9 +:102022001B01C806AE0407FF456465666572400081 +:102032000B101B012C08F907AE0407FF4564656607 +:102042006572210014101B012C08D507AE0407FF8E +:1020520052646566657240001E101B012C08120551 +:10206200AE0407FF526465666572210028101B01E9 +:102072002C081A05AE0407FF5564656665724000B8 +:1020820032101B012C089B0736061205AE0407FF0F +:1020920055646566657221003C101B012C089B0784 +:1020A20036061A05AE0406FF64656665722148109D +:1020B2001B015E124A05111011102C08B804AE045F +:1020C20006FF64656665724054101B015E124A0584 +:1020D20011102C08B804AE0407FF28646566657207 +:1020E200290061101B01AE010E03D1017910AE046B +:1020F2000E9427034A0511102C08B804B804AE0444 +:102102000FFF7365617263682D776F72646C697318 +:1021120074006D101B019805ED05CE04A0108F050B +:10212200BD104A05B305C7049A10D3097205ED051F +:10213200AE044A05E4105D0594018201AE041B0160 +:1021420098057205CA09A105D810EE10C704AE1091 +:102152008F057205ED05E405AE04D3098F05ED0583 +:10216200AE0411FF74726176657273652D776F72BA +:10217200646C6973740081101B01F9074A05C70476 +:10218200CE10CA09B8075D05B804C7077A05C704A7 +:10219200CE108A042C08BD04BF10D309AE040BFF75 +:1021A2006E616D653E737472696E6700B2101B01D9 +:1021B200320CCE04FF00AC06AE0407FF6E66613E31 +:1021C20063666100D0101B018A04C806AE0408FFD2 +:1021D20069636F6D70617265DE101B019805680599 +:1021E2008F05AC05C704F910D3097205E405AE04E6 +:1021F2005D05ED059B02C7041C1134076805120535 +:1022020068052C084A05CE040001F505C7040D1126 +:102212005D05CE04FF00AC06AC05C7041411D3095A +:10222200E4056D07AE04C8065D05C2095D05CE046E +:1022320002005307FF10D309ED05AE0401FF2A0087 +:10224200E8101B013F067205AE0401FF6A001F1170 +:102252001B010F07CE040700360612050F07CE0436 +:102262000900360612053606AE0404FF6461627385 +:1022720026111B014A05BA05C70440114711AE04D5 +:1022820007FF646E65676174650036111B019F0864 +:102292007412ED057908AE0405FF636D6F76650073 +:1022A20041115311BF93AF93E991F991A991B9915A +:1022B200092F082B21F01D9111930197E1F7AF919E +:1022C200BF91899199910C941F0105FF3273776137 +:1022D20070004D111B017A0598057A058F05AE0431 +:1022E2000AFF726566696C6C2D74696266111B0166 +:1022F2009411CE045A00F70C9A111A05ED05E30960 +:102302001A05E405AE040AFF736F757263652D74D6 +:10231200696271111B0194119A111205AE0403FF37 +:10232200746962008411DC04850204FF237469620B +:102332009011DC04DF0206FF65653E72616D961145 +:102342001B01ED0534076805F90768051A05C2097E +:102352005D05C2095D056207A411D309AE0408FF39 +:10236200696E69742D72616D9C111B01CE04A80007 +:102372009B07CE0422009D06A111AE040BFF7365DC +:10238200742D63757272656E7400B0111B01CE04F8 +:102392008400D507AE0408FF776F72646C697374AA +:1023A200BF111B011C0AED056805D5074A05C209C4 +:1023B200FF0F1D0AAE040EFF666F7274682D776FF1 +:1023C20072646C697374CC11DC04860009FF736556 +:1023D200742D6F7264657200DC111B01CE048800DB +:1023E200FE03AE040FFF7365742D7265636F676E33 +:1023F200697A65727300E7111B01CE049A00FE032D +:10240200AE040FFF6765742D7265636F676E697A3C +:1024120065727300F3111B01CE049A00DD03AE0452 +:1024220004FF636F646502121B01AE010E03130AFF +:102432001110DC01AE0408FF656E642D636F6465E4 +:1024420011121B01D1010C94D1011F01AE0408FF2E +:10245200286D61726B6572291C120905A6001A109B +:1024620024100800706F7374706F6E6528121B0160 +:102472001A0E320F3D0F4A059805111011102C0843 +:10248200B8048F0511102C08DC01AE0406FF626F40 +:10249200756E647332121B01680536065D05AE0463 +:1024A20003FF733E640047121B014A05BA05AE04DE +:1024B20005FF3E626F6479005112C9060800326C52 +:1024C20069746572616C59121B015D05F201F201BA +:1024D200AE0401FF3D005F121B012C06B305AE04E2 +:1024E20001FF31006A12DC04010001FF32007112A7 +:0E24F200DC04020002FF2D317612DC04FFFF35 +:00000001FF diff --git a/amforth-6.5/appl/atmega2561/atmega256.lst b/amforth-6.5/appl/atmega2561/atmega256.lst new file mode 100644 index 0000000..6c42c66 --- /dev/null +++ b/amforth-6.5/appl/atmega2561/atmega256.lst @@ -0,0 +1,10182 @@ + +AVRASM ver. 2.1.52 atmega256.asm Sun Apr 30 20:10:15 2017 + +atmega256.asm(11): Including file '../../avr8\preamble.inc' +../../avr8\preamble.inc(2): Including file '../../avr8\macros.asm' +../../avr8\macros.asm(6): Including file '../../avr8\user.inc' +../../avr8\preamble.inc(6): Including file '../../avr8/devices/atmega2561\device.asm' +../../avr8/devices/atmega2561\device.asm(5): Including file '../../avr8/Atmel/Appnotes2\m2561def.inc' +atmega256.asm(15): Including file '../../avr8\drivers/usart_1.asm' +../../avr8\drivers/usart_1.asm(31): Including file '../../avr8\drivers/usart_common.asm' +../../avr8\drivers/usart_common.asm(11): Including file '../../avr8\drivers/usart-rx-buffer.asm' +../../avr8\drivers/usart_common.asm(24): Including file '../../avr8\words/usart-tx-poll.asm' +../../avr8\drivers/usart_common.asm(29): Including file '../../avr8\words/ubrr.asm' +../../avr8\drivers/usart_common.asm(30): Including file '../../avr8\words/usart.asm' +atmega256.asm(18): Including file '../../avr8\amforth-low.asm' +../../avr8\amforth-low.asm(11): Including file '../../avr8\amforth-interpreter.asm' +../../avr8\amforth-low.asm(12): Including file '../../avr8\drivers/generic-isr.asm' +../../avr8\amforth-low.asm(15): Including file '../../avr8\dict/rww.inc' +../../avr8\dict/rww.inc(1): Including file '../../avr8\words/mplus.asm' +../../avr8\dict/rww.inc(2): Including file '../../common\words/ud-star.asm' +../../avr8\dict/rww.inc(3): Including file '../../common\words/umax.asm' +../../avr8\dict/rww.inc(4): Including file '../../common\words/umin.asm' +../../avr8\dict/rww.inc(5): Including file '../../avr8\words/immediate-q.asm' +../../avr8\dict/rww.inc(6): Including file '../../avr8\words/name2flags.asm' +../../avr8\dict/rww.inc(9): Including file '../../avr8\dict/appl_8k.inc' +../../avr8\dict/appl_8k.inc(1): Including file '../../avr8\dict/compiler1.inc' +../../avr8\dict/compiler1.inc(2): Including file '../../avr8\words/newest.asm' +../../avr8\dict/compiler1.inc(3): Including file '../../avr8\words/latest.asm' +../../avr8\dict/compiler1.inc(4): Including file '../../common\words/do-create.asm' +../../avr8\dict/compiler1.inc(5): Including file '../../common\words/backslash.asm' +../../avr8\dict/compiler1.inc(6): Including file '../../common\words/l-paren.asm' +../../avr8\dict/compiler1.inc(8): Including file '../../common\words/compile.asm' +../../avr8\dict/compiler1.inc(9): Including file '../../avr8\words/comma.asm' +../../avr8\dict/compiler1.inc(10): Including file '../../common\words/brackettick.asm' +../../avr8\dict/compiler1.inc(13): Including file '../../common\words/literal.asm' +../../avr8\dict/compiler1.inc(14): Including file '../../common\words/sliteral.asm' +../../avr8\dict/compiler1.inc(15): Including file '../../avr8\words/g-mark.asm' +../../avr8\dict/compiler1.inc(16): Including file '../../avr8\words/g-resolve.asm' +../../avr8\dict/compiler1.inc(17): Including file '../../avr8\words/l_mark.asm' +../../avr8\dict/compiler1.inc(18): Including file '../../avr8\words/l_resolve.asm' +../../avr8\dict/compiler1.inc(20): Including file '../../common\words/ahead.asm' +../../avr8\dict/compiler1.inc(21): Including file '../../common\words/if.asm' +../../avr8\dict/compiler1.inc(22): Including file '../../common\words/else.asm' +../../avr8\dict/compiler1.inc(23): Including file '../../common\words/then.asm' +../../avr8\dict/compiler1.inc(24): Including file '../../common\words/begin.asm' +../../avr8\dict/compiler1.inc(25): Including file '../../common\words/while.asm' +../../avr8\dict/compiler1.inc(26): Including file '../../common\words/repeat.asm' +../../avr8\dict/compiler1.inc(27): Including file '../../common\words/until.asm' +../../avr8\dict/compiler1.inc(28): Including file '../../common\words/again.asm' +../../avr8\dict/compiler1.inc(29): Including file '../../common\words/do.asm' +../../avr8\dict/compiler1.inc(30): Including file '../../common\words/loop.asm' +../../avr8\dict/compiler1.inc(31): Including file '../../common\words/plusloop.asm' +../../avr8\dict/compiler1.inc(32): Including file '../../common\words/leave.asm' +../../avr8\dict/compiler1.inc(33): Including file '../../common\words/qdo.asm' +../../avr8\dict/compiler1.inc(34): Including file '../../common\words/endloop.asm' +../../avr8\dict/compiler1.inc(36): Including file '../../common\words/l-from.asm' +../../avr8\dict/compiler1.inc(37): Including file '../../common\words/to-l.asm' +../../avr8\dict/compiler1.inc(38): Including file '../../avr8\words/lp0.asm' +../../avr8\dict/compiler1.inc(39): Including file '../../avr8\words/lp.asm' +../../avr8\dict/compiler1.inc(41): Including file '../../common\words/create.asm' +../../avr8\dict/compiler1.inc(42): Including file '../../avr8\words/header.asm' +../../avr8\dict/compiler1.inc(43): Including file '../../avr8\words/wlscope.asm' +../../avr8\dict/compiler1.inc(44): Including file '../../common\words/reveal.asm' +../../avr8\dict/compiler1.inc(45): Including file '../../avr8\words/does.asm' +../../avr8\dict/compiler1.inc(46): Including file '../../common\words/colon.asm' +../../avr8\dict/compiler1.inc(47): Including file '../../avr8\words/colon-noname.asm' +../../avr8\dict/compiler1.inc(48): Including file '../../common\words/semicolon.asm' +../../avr8\dict/compiler1.inc(49): Including file '../../common\words/right-bracket.asm' +../../avr8\dict/compiler1.inc(50): Including file '../../common\words/left-bracket.asm' +../../avr8\dict/compiler1.inc(51): Including file '../../common\words/variable.asm' +../../avr8\dict/compiler1.inc(52): Including file '../../common\words/constant.asm' +../../avr8\dict/compiler1.inc(53): Including file '../../avr8\words/user.asm' +../../avr8\dict/compiler1.inc(55): Including file '../../common\words/recurse.asm' +../../avr8\dict/compiler1.inc(56): Including file '../../avr8\words/immediate.asm' +../../avr8\dict/compiler1.inc(58): Including file '../../common\words/bracketchar.asm' +../../avr8\dict/compiler1.inc(59): Including file '../../common\words/abort-string.asm' +../../avr8\dict/compiler1.inc(60): Including file '../../common\words/abort.asm' +../../avr8\dict/compiler1.inc(61): Including file '../../common\words/q-abort.asm' +../../avr8\dict/compiler1.inc(63): Including file '../../common\words/get-stack.asm' +../../avr8\dict/compiler1.inc(64): Including file '../../common\words/set-stack.asm' +../../avr8\dict/compiler1.inc(65): Including file '../../common\words/map-stack.asm' +../../avr8\dict/compiler1.inc(66): Including file '../../avr8\words/get-current.asm' +../../avr8\dict/compiler1.inc(67): Including file '../../common\words/get-order.asm' +../../avr8\dict/compiler1.inc(68): Including file '../../common\words/cfg-order.asm' +../../avr8\dict/compiler1.inc(69): Including file '../../avr8\words/compare.asm' +../../avr8\dict/compiler1.inc(70): Including file '../../avr8\words/nfa2lfa.asm' +../../avr8\amforth-low.asm(16): Including file 'dict_appl.inc' +dict_appl.inc(4): Including file 'words/applturnkey.asm' +../../avr8\amforth-low.asm(17): Including file '../../avr8\dict/nrww.inc' +../../avr8\dict/nrww.inc(4): Including file '../../avr8\words/exit.asm' +../../avr8\dict/nrww.inc(5): Including file '../../avr8\words/execute.asm' +../../avr8\dict/nrww.inc(6): Including file '../../avr8\words/dobranch.asm' +../../avr8\dict/nrww.inc(7): Including file '../../avr8\words/docondbranch.asm' +../../avr8\dict/nrww.inc(10): Including file '../../avr8\words/doliteral.asm' +../../avr8\dict/nrww.inc(11): Including file '../../avr8\words/dovariable.asm' +../../avr8\dict/nrww.inc(12): Including file '../../avr8\words/doconstant.asm' +../../avr8\dict/nrww.inc(13): Including file '../../avr8\words/douser.asm' +../../avr8\dict/nrww.inc(14): Including file '../../avr8\words/do-value.asm' +../../avr8\dict/nrww.inc(15): Including file '../../avr8\words/fetch.asm' +../../avr8\dict/nrww.inc(16): Including file '../../avr8\words/store.asm' +../../avr8\dict/nrww.inc(17): Including file '../../avr8\words/cstore.asm' +../../avr8\dict/nrww.inc(18): Including file '../../avr8\words/cfetch.asm' +../../avr8\dict/nrww.inc(19): Including file '../../avr8\words/fetch-u.asm' +../../avr8\dict/nrww.inc(20): Including file '../../avr8\words/store-u.asm' +../../avr8\dict/nrww.inc(23): Including file '../../avr8\words/dup.asm' +../../avr8\dict/nrww.inc(24): Including file '../../avr8\words/qdup.asm' +../../avr8\dict/nrww.inc(25): Including file '../../avr8\words/swap.asm' +../../avr8\dict/nrww.inc(26): Including file '../../avr8\words/over.asm' +../../avr8\dict/nrww.inc(27): Including file '../../avr8\words/drop.asm' +../../avr8\dict/nrww.inc(28): Including file '../../avr8\words/rot.asm' +../../avr8\dict/nrww.inc(29): Including file '../../avr8\words/nip.asm' +../../avr8\dict/nrww.inc(31): Including file '../../avr8\words/r_from.asm' +../../avr8\dict/nrww.inc(32): Including file '../../avr8\words/to_r.asm' +../../avr8\dict/nrww.inc(33): Including file '../../avr8\words/r_fetch.asm' +../../avr8\dict/nrww.inc(36): Including file '../../common\words/not-equal.asm' +../../avr8\dict/nrww.inc(37): Including file '../../avr8\words/equalzero.asm' +../../avr8\dict/nrww.inc(38): Including file '../../avr8\words/lesszero.asm' +../../avr8\dict/nrww.inc(39): Including file '../../avr8\words/greaterzero.asm' +../../avr8\dict/nrww.inc(40): Including file '../../avr8\words/d-greaterzero.asm' +../../avr8\dict/nrww.inc(41): Including file '../../avr8\words/d-lesszero.asm' +../../avr8\dict/nrww.inc(43): Including file '../../avr8\words/true.asm' +../../avr8\dict/nrww.inc(44): Including file '../../avr8\words/zero.asm' +../../avr8\dict/nrww.inc(45): Including file '../../avr8\words/uless.asm' +../../avr8\dict/nrww.inc(46): Including file '../../common\words/u-greater.asm' +../../avr8\dict/nrww.inc(47): Including file '../../avr8\words/less.asm' +../../avr8\dict/nrww.inc(48): Including file '../../avr8\words/greater.asm' +../../avr8\dict/nrww.inc(50): Including file '../../avr8\words/log2.asm' +../../avr8\dict/nrww.inc(51): Including file '../../avr8\words/minus.asm' +../../avr8\dict/nrww.inc(52): Including file '../../avr8\words/plus.asm' +../../avr8\dict/nrww.inc(53): Including file '../../avr8\words/mstar.asm' +../../avr8\dict/nrww.inc(54): Including file '../../avr8\words/umslashmod.asm' +../../avr8\dict/nrww.inc(55): Including file '../../avr8\words/umstar.asm' +../../avr8\dict/nrww.inc(57): Including file '../../avr8\words/invert.asm' +../../avr8\dict/nrww.inc(58): Including file '../../avr8\words/2slash.asm' +../../avr8\dict/nrww.inc(59): Including file '../../avr8\words/2star.asm' +../../avr8\dict/nrww.inc(60): Including file '../../avr8\words/and.asm' +../../avr8\dict/nrww.inc(61): Including file '../../avr8\words/or.asm' +../../avr8\dict/nrww.inc(62): Including file '../../avr8\words/xor.asm' +../../avr8\dict/nrww.inc(64): Including file '../../avr8\words/1plus.asm' +../../avr8\dict/nrww.inc(65): Including file '../../avr8\words/1minus.asm' +../../avr8\dict/nrww.inc(66): Including file '../../common\words/q-negate.asm' +../../avr8\dict/nrww.inc(67): Including file '../../avr8\words/lshift.asm' +../../avr8\dict/nrww.inc(68): Including file '../../avr8\words/rshift.asm' +../../avr8\dict/nrww.inc(69): Including file '../../avr8\words/plusstore.asm' +../../avr8\dict/nrww.inc(71): Including file '../../avr8\words/rpfetch.asm' +../../avr8\dict/nrww.inc(72): Including file '../../avr8\words/rpstore.asm' +../../avr8\dict/nrww.inc(73): Including file '../../avr8\words/spfetch.asm' +../../avr8\dict/nrww.inc(74): Including file '../../avr8\words/spstore.asm' +../../avr8\dict/nrww.inc(76): Including file '../../avr8\words/dodo.asm' +../../avr8\dict/nrww.inc(77): Including file '../../avr8\words/i.asm' +../../avr8\dict/nrww.inc(78): Including file '../../avr8\words/doplusloop.asm' +../../avr8\dict/nrww.inc(79): Including file '../../avr8\words/doloop.asm' +../../avr8\dict/nrww.inc(80): Including file '../../avr8\words/unloop.asm' +../../avr8\dict/nrww.inc(84): Including file '../../avr8\words/cmove_g.asm' +../../avr8\dict/nrww.inc(85): Including file '../../avr8\words/byteswap.asm' +../../avr8\dict/nrww.inc(86): Including file '../../avr8\words/up.asm' +../../avr8\dict/nrww.inc(87): Including file '../../avr8\words/1ms.asm' +../../avr8\dict/nrww.inc(88): Including file '../../avr8\words/2to_r.asm' +../../avr8\dict/nrww.inc(89): Including file '../../avr8\words/2r_from.asm' +../../avr8\dict/nrww.inc(91): Including file '../../avr8\words/store-e.asm' +../../avr8\dict/nrww.inc(92): Including file '../../avr8\words/fetch-e.asm' +../../avr8\dict/nrww.inc(93): Including file '../../avr8\words/store-i.asm' +../../avr8\dict/nrww.inc(95): Including file '../../avr8\words/store-i_big.asm' +../../avr8\dict/nrww.inc(99): Including file '../../avr8\words/fetch-i.asm' +../../avr8\dict/nrww.inc(102): Including file '../../avr8\dict/core_8k.inc' +../../avr8\dict/core_8k.inc(2): Including file '../../avr8\words/n_to_r.asm' +../../avr8\dict/core_8k.inc(3): Including file '../../avr8\words/n_r_from.asm' +../../avr8\dict/core_8k.inc(5): Including file '../../avr8\words/d-2star.asm' +../../avr8\dict/core_8k.inc(6): Including file '../../avr8\words/d-2slash.asm' +../../avr8\dict/core_8k.inc(7): Including file '../../avr8\words/d-plus.asm' +../../avr8\dict/core_8k.inc(8): Including file '../../avr8\words/d-minus.asm' +../../avr8\dict/core_8k.inc(9): Including file '../../avr8\words/d-invert.asm' +../../avr8\dict/core_8k.inc(10): Including file '../../common\words/u-dot.asm' +../../avr8\dict/core_8k.inc(11): Including file '../../common\words/u-dot-r.asm' +../../avr8\dict/core_8k.inc(13): Including file '../../common\words/show-wordlist.asm' +../../avr8\dict/core_8k.inc(14): Including file '../../common\words/words.asm' +../../avr8\dict/core_8k.inc(15): Including file '../../avr8\dict/interrupt.inc' +../../avr8\dict/interrupt.inc(8): Including file '../../avr8\words/int-on.asm' +../../avr8\dict/interrupt.inc(9): Including file '../../avr8\words/int-off.asm' +../../avr8\dict/interrupt.inc(10): Including file '../../avr8\words/int-store.asm' +../../avr8\dict/interrupt.inc(11): Including file '../../avr8\words/int-fetch.asm' +../../avr8\dict/interrupt.inc(12): Including file '../../avr8\words/int-trap.asm' +../../avr8\dict/interrupt.inc(14): Including file '../../avr8\words/isr-exec.asm' +../../avr8\dict/interrupt.inc(15): Including file '../../avr8\words/isr-end.asm' +../../avr8\dict/core_8k.inc(17): Including file '../../common\words/pick.asm' +../../avr8\dict/core_8k.inc(18): Including file '../../common\words/dot-quote.asm' +../../avr8\dict/core_8k.inc(19): Including file '../../common\words/squote.asm' +../../avr8\dict/core_8k.inc(21): Including file '../../avr8\words/fill.asm' +../../avr8\dict/core_8k.inc(23): Including file '../../avr8\words/environment.asm' +../../avr8\dict/core_8k.inc(24): Including file '../../avr8\words/env-wordlists.asm' +../../avr8\dict/core_8k.inc(25): Including file '../../avr8\words/env-slashpad.asm' +../../avr8\dict/core_8k.inc(26): Including file '../../common\words/env-slashhold.asm' +../../avr8\dict/core_8k.inc(27): Including file '../../common\words/env-forthname.asm' +../../avr8\dict/core_8k.inc(28): Including file '../../common\words/env-forthversion.asm' +../../avr8\dict/core_8k.inc(29): Including file '../../common\words/env-cpu.asm' +../../avr8\dict/core_8k.inc(30): Including file '../../avr8\words/env-mcuinfo.asm' +../../avr8\dict/core_8k.inc(31): Including file '../../common\words/env-usersize.asm' +../../avr8\dict/core_8k.inc(33): Including file '../../common\words/f_cpu.asm' +../../avr8\dict/core_8k.inc(34): Including file '../../avr8\words/state.asm' +../../avr8\dict/core_8k.inc(35): Including file '../../common\words/base.asm' +../../avr8\dict/core_8k.inc(37): Including file '../../avr8\words/cells.asm' +../../avr8\dict/core_8k.inc(38): Including file '../../avr8\words/cellplus.asm' +../../avr8\dict/core_8k.inc(40): Including file '../../common\words/2dup.asm' +../../avr8\dict/core_8k.inc(41): Including file '../../common\words/2drop.asm' +../../avr8\dict/core_8k.inc(43): Including file '../../common\words/tuck.asm' +../../avr8\dict/core_8k.inc(45): Including file '../../common\words/to-in.asm' +../../avr8\dict/core_8k.inc(46): Including file '../../common\words/pad.asm' +../../avr8\dict/core_8k.inc(47): Including file '../../common\words/emit.asm' +../../avr8\dict/core_8k.inc(48): Including file '../../common\words/emitq.asm' +../../avr8\dict/core_8k.inc(49): Including file '../../common\words/key.asm' +../../avr8\dict/core_8k.inc(50): Including file '../../common\words/keyq.asm' +../../avr8\dict/core_8k.inc(52): Including file '../../avr8\words/dp.asm' +../../avr8\dict/core_8k.inc(53): Including file '../../avr8\words/ehere.asm' +../../avr8\dict/core_8k.inc(54): Including file '../../avr8\words/here.asm' +../../avr8\dict/core_8k.inc(55): Including file '../../avr8\words/allot.asm' +../../avr8\dict/core_8k.inc(57): Including file '../../common\words/bin.asm' +../../avr8\dict/core_8k.inc(58): Including file '../../common\words/decimal.asm' +../../avr8\dict/core_8k.inc(59): Including file '../../common\words/hex.asm' +../../avr8\dict/core_8k.inc(60): Including file '../../common\words/bl.asm' +../../avr8\dict/core_8k.inc(62): Including file '../../avr8\words/turnkey.asm' +../../avr8\dict/core_8k.inc(64): Including file '../../avr8\words/slashmod.asm' +../../avr8\dict/core_8k.inc(65): Including file '../../avr8\words/uslashmod.asm' +../../avr8\dict/core_8k.inc(66): Including file '../../avr8\words/negate.asm' +../../avr8\dict/core_8k.inc(67): Including file '../../common\words/slash.asm' +../../avr8\dict/core_8k.inc(68): Including file '../../common\words/mod.asm' +../../avr8\dict/core_8k.inc(69): Including file '../../common\words/abs.asm' +../../avr8\dict/core_8k.inc(70): Including file '../../common\words/min.asm' +../../avr8\dict/core_8k.inc(71): Including file '../../common\words/max.asm' +../../avr8\dict/core_8k.inc(72): Including file '../../common\words/within.asm' +../../avr8\dict/core_8k.inc(74): Including file '../../common\words/to-upper.asm' +../../avr8\dict/core_8k.inc(75): Including file '../../common\words/to-lower.asm' +../../avr8\dict/core_8k.inc(77): Including file '../../avr8\words/hld.asm' +../../avr8\dict/core_8k.inc(78): Including file '../../common\words/hold.asm' +../../avr8\dict/core_8k.inc(79): Including file '../../common\words/less-sharp.asm' +../../avr8\dict/core_8k.inc(80): Including file '../../common\words/sharp.asm' +../../avr8\dict/core_8k.inc(81): Including file '../../common\words/sharp-s.asm' +../../avr8\dict/core_8k.inc(82): Including file '../../common\words/sharp-greater.asm' +../../avr8\dict/core_8k.inc(83): Including file '../../common\words/sign.asm' +../../avr8\dict/core_8k.inc(84): Including file '../../common\words/d-dot-r.asm' +../../avr8\dict/core_8k.inc(85): Including file '../../common\words/dot-r.asm' +../../avr8\dict/core_8k.inc(86): Including file '../../common\words/d-dot.asm' +../../avr8\dict/core_8k.inc(87): Including file '../../common\words/dot.asm' +../../avr8\dict/core_8k.inc(88): Including file '../../common\words/ud-dot.asm' +../../avr8\dict/core_8k.inc(89): Including file '../../common\words/ud-dot-r.asm' +../../avr8\dict/core_8k.inc(90): Including file '../../common\words/ud-slash-mod.asm' +../../avr8\dict/core_8k.inc(91): Including file '../../common\words/digit-q.asm' +../../avr8\dict/core_8k.inc(93): Including file '../../avr8\words/do-sliteral.asm' +../../avr8\dict/core_8k.inc(94): Including file '../../avr8\words/scomma.asm' +../../avr8\dict/core_8k.inc(95): Including file '../../avr8\words/itype.asm' +../../avr8\dict/core_8k.inc(96): Including file '../../avr8\words/icount.asm' +../../avr8\dict/core_8k.inc(97): Including file '../../common\words/cr.asm' +../../avr8\dict/core_8k.inc(98): Including file '../../common\words/space.asm' +../../avr8\dict/core_8k.inc(99): Including file '../../common\words/spaces.asm' +../../avr8\dict/core_8k.inc(100): Including file '../../common\words/type.asm' +../../avr8\dict/core_8k.inc(101): Including file '../../common\words/tick.asm' +../../avr8\dict/core_8k.inc(103): Including file '../../common\words/handler.asm' +../../avr8\dict/core_8k.inc(104): Including file '../../common\words/catch.asm' +../../avr8\dict/core_8k.inc(105): Including file '../../common\words/throw.asm' +../../avr8\dict/core_8k.inc(107): Including file '../../common\words/cskip.asm' +../../avr8\dict/core_8k.inc(108): Including file '../../common\words/cscan.asm' +../../avr8\dict/core_8k.inc(109): Including file '../../common\words/accept.asm' +../../avr8\dict/core_8k.inc(110): Including file '../../common\words/refill.asm' +../../avr8\dict/core_8k.inc(111): Including file '../../common\words/char.asm' +../../avr8\dict/core_8k.inc(112): Including file '../../common\words/number.asm' +../../avr8\dict/core_8k.inc(113): Including file '../../common\words/q-sign.asm' +../../avr8\dict/core_8k.inc(114): Including file '../../common\words/set-base.asm' +../../avr8\dict/core_8k.inc(115): Including file '../../common\words/to-number.asm' +../../avr8\dict/core_8k.inc(116): Including file '../../common\words/parse.asm' +../../avr8\dict/core_8k.inc(117): Including file '../../common\words/source.asm' +../../avr8\dict/core_8k.inc(118): Including file '../../common\words/slash-string.asm' +../../avr8\dict/core_8k.inc(119): Including file '../../common\words/parse-name.asm' +../../avr8\dict/core_8k.inc(120): Including file '../../common\words/find-xt.asm' +../../avr8\dict/core_8k.inc(122): Including file '../../common\words/prompt-ok.asm' +../../avr8\dict/core_8k.inc(123): Including file '../../common\words/prompt-ready.asm' +../../avr8\dict/core_8k.inc(124): Including file '../../common\words/prompt-error.asm' +../../avr8\dict/core_8k.inc(126): Including file '../../common\words/quit.asm' +../../avr8\dict/core_8k.inc(127): Including file '../../avr8\words/pause.asm' +../../avr8\dict/core_8k.inc(128): Including file '../../avr8\words/cold.asm' +../../avr8\dict/core_8k.inc(129): Including file '../../common\words/warm.asm' +../../avr8\dict/core_8k.inc(131): Including file '../../avr8\words/sp0.asm' +../../avr8\dict/core_8k.inc(132): Including file '../../avr8\words/rp0.asm' +../../avr8\dict/core_8k.inc(133): Including file '../../common\words/depth.asm' +../../avr8\dict/core_8k.inc(134): Including file '../../common\words/interpret.asm' +../../avr8\dict/core_8k.inc(135): Including file '../../avr8\words/forth-recognizer.asm' +../../avr8\dict/core_8k.inc(136): Including file '../../common\words/recognize.asm' +../../avr8\dict/core_8k.inc(137): Including file '../../common\words/rec-intnum.asm' +../../avr8\dict/core_8k.inc(138): Including file '../../common\words/rec-find.asm' +../../avr8\dict/core_8k.inc(139): Including file '../../common\words/dt-null.asm' +../../avr8\dict/core_8k.inc(141): Including file '../../common\words/q-stack.asm' +../../avr8\dict/core_8k.inc(142): Including file '../../common\words/ver.asm' +../../avr8\dict/core_8k.inc(144): Including file '../../common\words/noop.asm' +../../avr8\dict/core_8k.inc(145): Including file '../../avr8\words/unused.asm' +../../avr8\dict/core_8k.inc(147): Including file '../../common\words/to.asm' +../../avr8\dict/core_8k.inc(148): Including file '../../avr8\words/i-cellplus.asm' +../../avr8\dict/core_8k.inc(150): Including file '../../avr8\words/edefer-fetch.asm' +../../avr8\dict/core_8k.inc(151): Including file '../../avr8\words/edefer-store.asm' +../../avr8\dict/core_8k.inc(152): Including file '../../common\words/rdefer-fetch.asm' +../../avr8\dict/core_8k.inc(153): Including file '../../common\words/rdefer-store.asm' +../../avr8\dict/core_8k.inc(154): Including file '../../common\words/udefer-fetch.asm' +../../avr8\dict/core_8k.inc(155): Including file '../../common\words/udefer-store.asm' +../../avr8\dict/core_8k.inc(156): Including file '../../common\words/defer-store.asm' +../../avr8\dict/core_8k.inc(157): Including file '../../common\words/defer-fetch.asm' +../../avr8\dict/core_8k.inc(158): Including file '../../avr8\words/do-defer.asm' +../../avr8\dict/core_8k.inc(160): Including file '../../common\words/search-wordlist.asm' +../../avr8\dict/core_8k.inc(161): Including file '../../common\words/traverse-wordlist.asm' +../../avr8\dict/core_8k.inc(162): Including file '../../common\words/name2string.asm' +../../avr8\dict/core_8k.inc(163): Including file '../../avr8\words/nfa2cfa.asm' +../../avr8\dict/core_8k.inc(164): Including file '../../avr8\words/icompare.asm' +../../avr8\dict/core_8k.inc(166): Including file '../../common\words/star.asm' +../../avr8\dict/core_8k.inc(167): Including file '../../avr8\words/j.asm' +../../avr8\dict/core_8k.inc(169): Including file '../../avr8\words/dabs.asm' +../../avr8\dict/core_8k.inc(170): Including file '../../avr8\words/dnegate.asm' +../../avr8\dict/core_8k.inc(171): Including file '../../avr8\words/cmove.asm' +../../avr8\dict/core_8k.inc(172): Including file '../../common\words/2swap.asm' +../../avr8\dict/core_8k.inc(174): Including file '../../common\words/tib.asm' +../../avr8\dict/core_8k.inc(176): Including file '../../avr8\words/init-ram.asm' +../../avr8\dict/core_8k.inc(177): Including file '../../avr8\dict/compiler2.inc' +../../avr8\dict/compiler2.inc(8): Including file '../../avr8\words/set-current.asm' +../../avr8\dict/compiler2.inc(9): Including file '../../avr8\words/wordlist.asm' +../../avr8\dict/compiler2.inc(11): Including file '../../avr8\words/forth-wordlist.asm' +../../avr8\dict/compiler2.inc(12): Including file '../../common\words/set-order.asm' +../../avr8\dict/compiler2.inc(13): Including file '../../common\words/set-recognizer.asm' +../../avr8\dict/compiler2.inc(14): Including file '../../common\words/get-recognizer.asm' +../../avr8\dict/compiler2.inc(15): Including file '../../avr8\words/code.asm' +../../avr8\dict/compiler2.inc(16): Including file '../../avr8\words/end-code.asm' +../../avr8\dict/compiler2.inc(17): Including file '../../avr8\words/marker.asm' +../../avr8\dict/compiler2.inc(18): Including file '../../common\words/postpone.asm' +../../avr8\dict/core_8k.inc(178): Including file '../../common\words/bounds.asm' +../../avr8\dict/core_8k.inc(179): Including file '../../common\words/s-to-d.asm' +../../avr8\dict/core_8k.inc(180): Including file '../../avr8\words/to-body.asm' +../../avr8\dict/nrww.inc(112): Including file '../../common\words/2literal.asm' +../../avr8\dict/nrww.inc(113): Including file '../../avr8\words/equal.asm' +../../avr8\dict/nrww.inc(114): Including file '../../common\words/num-constants.asm' +../../avr8\amforth-low.asm(18): Including file 'dict_appl_core.inc' +../../avr8\amforth-low.asm(27): Including file '../../avr8\amforth-eeprom.inc' + + + ; both a 24bit address space and they need a special + ; flash store placement in the NRWW section, way outside + ; of the standard 16bit jump distance. + + ; note that dict_appl_core includes a store-i_big.asm + ; instead if the normal store-i.asm file. This file + ; has all the magic needed for the large address space. + ; *everything else* is identical to other controllers. + + .include "preamble.inc" + + .include "macros.asm" + + .set DICT_COMPILER2 = 0 ; + .set cpu_msp430 = 0 + .set cpu_avr8 = 1 + + .include "user.inc" + + ; + + ; used by the multitasker + .set USER_STATE = 0 + .set USER_FOLLOWER = 2 + + ; stackpointer, used by mulitasker + .set USER_RP = 4 + .set USER_SP0 = 6 + .set USER_SP = 8 + + ; excpection handling + .set USER_HANDLER = 10 + + ; numeric IO + .set USER_BASE = 12 + + ; character IO + .set USER_EMIT = 14 + .set USER_EMITQ = 16 + .set USER_KEY = 18 + .set USER_KEYQ = 20 + + .set USER_SOURCE = 22 + .set USER_TO_IN = 24 + .set USER_REFILL = 26 + + .set USER_P_OK = 28 + .set USER_P_ERR = 30 + .set USER_P_RDY = 32 + + .set SYSUSERSIZE = 34 + ; + + .def zerol = r2 + .def zeroh = r3 + .def upl = r4 + .def uph = r5 + + .def al = r6 + .def ah = r7 + .def bl = r8 + .def bh = r9 + + ; internal + .def mcu_boot = r10 + .def isrflag = r11 + + .def temp4 = r14 + .def temp5 = r15 + + .def temp0 = r16 + .def temp1 = r17 + .def temp2 = r18 + .def temp3 = r19 + + .def temp6 = r20 + .def temp7 = r21 + + .def tosl = r24 + .def tosh = r25 + + .def wl = r22 + .def wh = r23 + + .macro loadtos + ld tosl, Y+ + ld tosh, Y+ + .endmacro + + .macro savetos + st -Y, tosh + st -Y, tosl + .endmacro + + .macro in_ + .if (@1 < $40) + in @0,@1 + .else + lds @0,@1 + .endif + .endmacro + + .macro out_ + .if (@0 < $40) + out @0,@1 + .else + sts @0,@1 + .endif + .endmacro + + .macro sbi_ + .if (@0 < $40) + sbi @0,@1 + .else + in_ @2,@0 + ori @2,exp2(@1) + out_ @0,@2 + .endif + .endmacro + + .macro cbi_ + .if (@0 < $40) + cbi @0,@1 + .else + in_ @2,@0 + andi @2,~(exp2(@1)) + out_ @0,@2 + .endif + .endmacro + + .macro jmp_ + ; a more flexible macro + .ifdef @0 + .if (@0-pc > 2040) || (pc-@0>2040) + jmp @0 + .else + rjmp @0 + .endif + .else + jmp @0 + .endif + .endmacro + .macro call_ + ; a more flexible macro + .ifdef @0 + .if (@0-pc > 2040) || (pc-@0>2040) + call @0 + .else + rcall @0 + .endif + .else + call @0 + .endif + .endmacro + + ; F_CPU + ; µsec 16000000 14745600 8000000 1000000 + ; 1 16 14,74 8 1 + ; 10 160 147,45 80 10 + ; 100 1600 1474,56 800 100 + ; 1000 16000 14745,6 8000 1000 + ; + ; cycles = µsec * f_cpu / 1e6 + ; n_loops=cycles/5 + ; + ; cycles already used will be subtracted from the delay + ; the waittime resolution is 1 cycle (delay from exact to +1 cycle) + ; the maximum delay at 20MHz (50ns/clock) is 38350ns + ; waitcount register must specify an immediate register + ; + ; busy waits a specfied amount of microseconds + .macro delay + .set cycles = ( ( @0 * F_CPU ) / 1000000 ) + .if (cycles > ( 256 * 255 * 4 + 2)) + .error "MACRO delay - too many cycles to burn" + .else + .if (cycles > 6) + .set loop_cycles = (cycles / 4) + ldi zl,low(loop_cycles) + ldi zh,high(loop_cycles) + sbiw Z, 1 + brne pc-1 + .set cycles = (cycles - (loop_cycles * 4)) + .endif + .if (cycles > 0) + .if (cycles & 4) + rjmp pc+1 + rjmp pc+1 + .endif + .if (cycles & 2) + rjmp pc+1 + .endif + .if (cycles & 1) + nop + .endif + .endif + .endif + .endmacro + + ; portability macros, they come from the msp430 branches + + .macro DEST + .dw @0 + .endm + + ; controller specific file selected via include + ; directory definition when calling the assembler (-I) + .include "device.asm" + + ; generated automatically, do not edit + + .list + + .equ ramstart = 512 + .equ CELLSIZE = 2 + .macro readflashcell + clr temp7 + lsl zl + rol zh + rol temp7 + out_ RAMPZ, temp7 + elpm @0, Z+ + elpm @1, Z+ + .endmacro + .macro writeflashcell + clr temp7 + lsl zl + rol zh + rol temp7 + out_ RAMPZ, temp7 + .endmacro + .set WANT_ANALOG_COMPARATOR = 0 + .set WANT_USART0 = 0 + .set WANT_TWI = 0 + .set WANT_SPI = 0 + .set WANT_PORTA = 0 + .set WANT_PORTB = 0 + .set WANT_PORTC = 0 + .set WANT_PORTD = 0 + .set WANT_PORTE = 0 + .set WANT_PORTF = 0 + .set WANT_PORTG = 0 + .set WANT_TIMER_COUNTER_0 = 0 + .set WANT_TIMER_COUNTER_2 = 0 + .set WANT_WATCHDOG = 0 + .set WANT_USART1 = 0 + .set WANT_EEPROM = 0 + .set WANT_TIMER_COUNTER_5 = 0 + .set WANT_TIMER_COUNTER_4 = 0 + .set WANT_TIMER_COUNTER_3 = 0 + .set WANT_TIMER_COUNTER_1 = 0 + .set WANT_JTAG = 0 + .set WANT_EXTERNAL_INTERRUPT = 0 + .set WANT_CPU = 0 + .set WANT_AD_CONVERTER = 0 + .set WANT_BOOT_LOAD = 0 + .equ intvecsize = 2 ; please verify; flash size: 262144 bytes + .equ pclen = 3 ; please verify + .overlap + .org 2 +000002 d139 rcall isr ; External Interrupt Request 0 + .org 4 +000004 d137 rcall isr ; External Interrupt Request 1 + .org 6 +000006 d135 rcall isr ; External Interrupt Request 2 + .org 8 +000008 d133 rcall isr ; External Interrupt Request 3 + .org 10 +00000a d131 rcall isr ; External Interrupt Request 4 + .org 12 +00000c d12f rcall isr ; External Interrupt Request 5 + .org 14 +00000e d12d rcall isr ; External Interrupt Request 6 + .org 16 +000010 d12b rcall isr ; External Interrupt Request 7 + .org 18 +000012 d129 rcall isr ; Pin Change Interrupt Request 0 + .org 20 +000014 d127 rcall isr ; Pin Change Interrupt Request 1 + .org 22 +000016 d125 rcall isr ; Pin Change Interrupt Request 2 + .org 24 +000018 d123 rcall isr ; Watchdog Time-out Interrupt + .org 26 +00001a d121 rcall isr ; Timer/Counter2 Compare Match A + .org 28 +00001c d11f rcall isr ; Timer/Counter2 Compare Match B + .org 30 +00001e d11d rcall isr ; Timer/Counter2 Overflow + .org 32 +000020 d11b rcall isr ; Timer/Counter1 Capture Event + .org 34 +000022 d119 rcall isr ; Timer/Counter1 Compare Match A + .org 36 +000024 d117 rcall isr ; Timer/Counter1 Compare Match B + .org 38 +000026 d115 rcall isr ; Timer/Counter1 Compare Match C + .org 40 +000028 d113 rcall isr ; Timer/Counter1 Overflow + .org 42 +00002a d111 rcall isr ; Timer/Counter0 Compare Match A + .org 44 +00002c d10f rcall isr ; Timer/Counter0 Compare Match B + .org 46 +00002e d10d rcall isr ; Timer/Counter0 Overflow + .org 48 +000030 d10b rcall isr ; SPI Serial Transfer Complete + .org 50 +000032 d109 rcall isr ; USART0, Rx Complete + .org 52 +000034 d107 rcall isr ; USART0 Data register Empty + .org 54 +000036 d105 rcall isr ; USART0, Tx Complete + .org 56 +000038 d103 rcall isr ; Analog Comparator + .org 58 +00003a d101 rcall isr ; ADC Conversion Complete + .org 60 +00003c d0ff rcall isr ; EEPROM Ready + .org 62 +00003e d0fd rcall isr ; Timer/Counter3 Capture Event + .org 64 +000040 d0fb rcall isr ; Timer/Counter3 Compare Match A + .org 66 +000042 d0f9 rcall isr ; Timer/Counter3 Compare Match B + .org 68 +000044 d0f7 rcall isr ; Timer/Counter3 Compare Match C + .org 70 +000046 d0f5 rcall isr ; Timer/Counter3 Overflow + .org 72 +000048 d0f3 rcall isr ; USART1, Rx Complete + .org 74 +00004a d0f1 rcall isr ; USART1 Data register Empty + .org 76 +00004c d0ef rcall isr ; USART1, Tx Complete + .org 78 +00004e d0ed rcall isr ; 2-wire Serial Interface + .org 80 +000050 d0eb rcall isr ; Store Program Memory Read + .org 82 +000052 d0e9 rcall isr ; Timer/Counter4 Capture Event + .org 84 +000054 d0e7 rcall isr ; Timer/Counter4 Compare Match A + .org 86 +000056 d0e5 rcall isr ; Timer/Counter4 Compare Match B + .org 88 +000058 d0e3 rcall isr ; Timer/Counter4 Compare Match C + .org 90 +00005a d0e1 rcall isr ; Timer/Counter4 Overflow + .org 92 +00005c d0df rcall isr ; Timer/Counter5 Capture Event + .org 94 +00005e d0dd rcall isr ; Timer/Counter5 Compare Match A + .org 96 +000060 d0db rcall isr ; Timer/Counter5 Compare Match B + .org 98 +000062 d0d9 rcall isr ; Timer/Counter5 Compare Match C + .org 100 +000064 d0d7 rcall isr ; Timer/Counter5 Overflow + .org 102 +000066 d0d5 rcall isr ; USART2, Rx Complete + .org 104 +000068 d0d3 rcall isr ; USART2 Data register Empty + .org 106 +00006a d0d1 rcall isr ; USART2, Tx Complete + .org 108 +00006c d0cf rcall isr ; USART3, Rx Complete + .org 110 +00006e d0cd rcall isr ; USART3 Data register Empty + .org 112 +000070 d0cb rcall isr ; USART3, Tx Complete + .equ INTVECTORS = 57 + .nooverlap + + ; compatability layer (maybe empty) + + ; controller data area, environment query mcu-info + mcu_info: + mcu_ramsize: +000071 2000 .dw 8192 + mcu_eepromsize: +000072 1000 .dw 4096 + mcu_maxdp: +000073 ffff .dw 65535 + mcu_numints: +000074 0039 .dw 57 + mcu_name: +000075 000a .dw 10 +000076 5441 +000077 656d +000078 6167 +000079 3532 +00007a 3136 .db "ATmega2561" + .set codestart=pc + + ; some defaults, change them in your application master file + ; see template.asm for an example + + ; enabling Interrupts, disabling them affects + ; other settings as well. + .set WANT_INTERRUPTS = 1 + + ; count the number of interrupts individually. + ; requires a lot of RAM (one byte per interrupt) + ; disabled by default. + .set WANT_INTERRUPT_COUNTERS = 0 + + ; receiving is asynchronously, so an interrupt queue is useful. + .set WANT_ISR_RX = 1 + + ; case insensitve dictionary lookup. + .set WANT_IGNORECASE = 0 + + ; map all memories to one address space. Details in the + ; technical guide + .set WANT_UNIFIED = 0 + + ; terminal input buffer + .set TIB_SIZE = 90 ; ANS94 needs at least 80 characters per line + + ; USER variables *in addition* to system ones + .set APPUSERSIZE = 10 ; size of application specific user area in bytes + + ; addresses of various data segments + .set rstackstart = RAMEND ; start address of return stack, grows downward + .set stackstart = RAMEND - 80 ; start address of data stack, grows downward + ; change only if you know what to you do + .set NUMWORDLISTS = 8 ; number of word lists in the searh order, at least 8 + .set NUMRECOGNIZERS = 4 ; total number of recognizers, two are always used. + + ; 10 per mille (1 per cent) is ok. + .set BAUD = 38400 + .set BAUD_MAXERROR = 10 + + ; Dictionary setup + .set VE_HEAD = $0000 + .set VE_ENVHEAD = $0000 + + ; cpu clock in hertz + .equ F_CPU = 14745600 + .include "drivers/usart_1.asm" + + .equ BAUDRATE_HIGH = UBRR1H + .equ USART_C = UCSR1C + .equ USART_B = UCSR1B + .equ USART_A = UCSR1A + .equ USART_DATA = UDR1 + + .equ URXCaddr = URXC1addr + .equ UDREaddr = UDRE1addr + + .equ bm_USART_RXRD = 1 << RXC1 + .equ bm_USART_TXRD = 1 << UDRE1 + .equ bm_ENABLE_TX = 1 << TXEN1 + .equ bm_ENABLE_RX = 1 << RXEN1 + .equ bm_ENABLE_INT_RX = 1<rx-buf",0 +000080 0000 .dw VE_HEAD + .set VE_HEAD = VE_TO_RXBUF + XT_TO_RXBUF: +000081 0082 .dw PFA_rx_tobuf + PFA_rx_tobuf: +000082 2f08 mov temp0, tosl +000083 9110 0210 lds temp1, usart_rx_in +000085 e0e0 ldi zl, low(usart_rx_data) +000086 e0f2 ldi zh, high(usart_rx_data) +000087 0fe1 add zl, temp1 +000088 1df3 adc zh, zeroh +000089 8300 st Z, temp0 +00008a 9513 inc temp1 +00008b 701f andi temp1,usart_rx_mask +00008c 9310 0210 sts usart_rx_in, temp1 +00008e 9189 +00008f 9199 loadtos +000090 940c 011f jmp_ DO_NEXT + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ; setup with + ; ' isr-rx URXCaddr int! + VE_ISR_RX: +000092 ff06 .dw $ff06 +000093 7369 +000094 2d72 +000095 7872 .db "isr-rx" +000096 007b .dw VE_HEAD + .set VE_HEAD = VE_ISR_RX + XT_ISR_RX: +000097 011b .dw DO_COLON + usart_rx_isr: +000098 04ce .dw XT_DOLITERAL +000099 00ce .dw usart_data +00009a 0531 .dw XT_CFETCH +00009b 054a .dw XT_DUP +00009c 04ce .dw XT_DOLITERAL +00009d 0003 .dw 3 +00009e 126d .dw XT_EQUAL +00009f 04c7 .dw XT_DOCONDBRANCH +0000a0 00a2 .dw usart_rx_isr1 +0000a1 0ebf .dw XT_COLD + usart_rx_isr1: +0000a2 0081 .dw XT_TO_RXBUF +0000a3 04ae .dw XT_EXIT + + ; ( -- ) Hardware Access + ; R( --) + ; initialize usart + ;VE_USART_INIT_RXBUFFER: + ; .dw $ff0x + ; .db "+usart-buffer" + ; .dw VE_HEAD + ; .set VE_HEAD = VE_USART_INIT_RXBUFFER + XT_USART_INIT_RX_BUFFER: +0000a4 011b .dw DO_COLON + PFA_USART_INIT_RX_BUFFER: ; ( -- ) +0000a5 04ce +0000a6 0097 .dw XT_DOLITERAL, XT_ISR_RX +0000a7 04ce +0000a8 0048 .dw XT_DOLITERAL, URXCaddr +0000a9 08eb .dw XT_INTSTORE + +0000aa 04ce .dw XT_DOLITERAL +0000ab 0200 .dw usart_rx_data +0000ac 04ce .dw XT_DOLITERAL +0000ad 0016 .dw usart_rx_size + 6 +0000ae 05ed .dw XT_ZERO +0000af 0933 .dw XT_FILL +0000b0 04ae .dw XT_EXIT + + ; ( -- c) + ; MCU + ; get 1 character from input queue, wait if needed using interrupt driver + VE_RX_BUFFER: +0000b1 ff06 .dw $ff06 +0000b2 7872 +0000b3 622d +0000b4 6675 .db "rx-buf" +0000b5 0092 .dw VE_HEAD + .set VE_HEAD = VE_RX_BUFFER + XT_RX_BUFFER: +0000b6 011b .dw DO_COLON + PFA_RX_BUFFER: +0000b7 00d1 .dw XT_RXQ_BUFFER +0000b8 04c7 .dw XT_DOCONDBRANCH +0000b9 00b7 .dw PFA_RX_BUFFER +0000ba 04ce .dw XT_DOLITERAL +0000bb 0211 .dw usart_rx_out +0000bc 0531 .dw XT_CFETCH +0000bd 054a .dw XT_DUP +0000be 04ce .dw XT_DOLITERAL +0000bf 0200 .dw usart_rx_data +0000c0 0636 .dw XT_PLUS +0000c1 0531 .dw XT_CFETCH +0000c2 055d .dw XT_SWAP +0000c3 06c8 .dw XT_1PLUS +0000c4 04ce .dw XT_DOLITERAL +0000c5 000f .dw usart_rx_mask +0000c6 06ac .dw XT_AND +0000c7 04ce .dw XT_DOLITERAL +0000c8 0211 .dw usart_rx_out +0000c9 0526 .dw XT_CSTORE +0000ca 04ae .dw XT_EXIT + + ; ( -- f) + ; MCU + ; check if unread characters are in the input queue + VE_RXQ_BUFFER: +0000cb ff07 .dw $ff07 +0000cc 7872 +0000cd 2d3f +0000ce 7562 +0000cf 0066 .db "rx?-buf",0 +0000d0 00b1 .dw VE_HEAD + .set VE_HEAD = VE_RXQ_BUFFER + XT_RXQ_BUFFER: +0000d1 011b .dw DO_COLON + PFA_RXQ_BUFFER: +0000d2 0eb7 .dw XT_PAUSE +0000d3 04ce .dw XT_DOLITERAL +0000d4 0211 .dw usart_rx_out +0000d5 0531 .dw XT_CFETCH +0000d6 04ce .dw XT_DOLITERAL +0000d7 0210 .dw usart_rx_in +0000d8 0531 .dw XT_CFETCH +0000d9 05ac .dw XT_NOTEQUAL +0000da 04ae .dw XT_EXIT + ; .include "drivers/timer-usart-isr.asm" + .set XT_RX = XT_RX_BUFFER + .set XT_RXQ = XT_RXQ_BUFFER + .set XT_USART_INIT_RX = XT_USART_INIT_RX_BUFFER + .else + .endif + + .include "words/usart-tx-poll.asm" + + ; MCU + ; check availability and send one character to the terminal using register poll + VE_TX_POLL: +0000db ff07 .dw $ff07 +0000dc 7874 +0000dd 702d +0000de 6c6f +0000df 006c .db "tx-poll",0 +0000e0 00cb .dw VE_HEAD + .set VE_HEAD = VE_TX_POLL + XT_TX_POLL: +0000e1 011b .dw DO_COLON + PFA_TX_POLL: + ; wait for data ready +0000e2 00ef .dw XT_TXQ_POLL +0000e3 04c7 .dw XT_DOCONDBRANCH +0000e4 00e2 .dw PFA_TX_POLL + ; send to usart +0000e5 04ce .dw XT_DOLITERAL +0000e6 00ce .dw USART_DATA +0000e7 0526 .dw XT_CSTORE +0000e8 04ae .dw XT_EXIT + + ; ( -- f) MCU + ; MCU + ; check if a character can be send using register poll + VE_TXQ_POLL: +0000e9 ff08 .dw $ff08 +0000ea 7874 +0000eb 2d3f +0000ec 6f70 +0000ed 6c6c .db "tx?-poll" +0000ee 00db .dw VE_HEAD + .set VE_HEAD = VE_TXQ_POLL + XT_TXQ_POLL: +0000ef 011b .dw DO_COLON + PFA_TXQ_POLL: +0000f0 0eb7 .dw XT_PAUSE +0000f1 04ce .dw XT_DOLITERAL +0000f2 00c8 .dw USART_A +0000f3 0531 .dw XT_CFETCH +0000f4 04ce .dw XT_DOLITERAL +0000f5 0020 .dw bm_USART_TXRD +0000f6 06ac .dw XT_AND +0000f7 04ae .dw XT_EXIT + .set XT_TX = XT_TX_POLL + .set XT_TXQ = XT_TXQ_POLL + .set XT_USART_INIT_TX = 0 + + .include "words/ubrr.asm" + + ; MCU + ; returns usart UBRR settings + VE_UBRR: +0000f8 ff04 .dw $ff04 +0000f9 6275 +0000fa 7272 .db "ubrr" +0000fb 00e9 .dw VE_HEAD + .set VE_HEAD = VE_UBRR + XT_UBRR: +0000fc 0509 .dw PFA_DOVALUE1 + PFA_UBRR: ; ( -- ) +0000fd 00ca .dw EE_UBRRVAL +0000fe 101a .dw XT_EDEFERFETCH +0000ff 1024 .dw XT_EDEFERSTORE + .include "words/usart.asm" + + ; MCU + ; initialize usart + VE_USART: +000100 ff06 .dw $ff06 +000101 752b +000102 6173 +000103 7472 .db "+usart" +000104 00f8 .dw VE_HEAD + .set VE_HEAD = VE_USART + XT_USART: +000105 011b .dw DO_COLON + PFA_USART: ; ( -- ) + +000106 04ce .dw XT_DOLITERAL +000107 0098 .dw USART_B_VALUE +000108 04ce .dw XT_DOLITERAL +000109 00c9 .dw USART_B +00010a 0526 .dw XT_CSTORE + +00010b 04ce .dw XT_DOLITERAL +00010c 0006 .dw USART_C_VALUE +00010d 04ce .dw XT_DOLITERAL +00010e 00ca .dw USART_C | bm_USARTC_en +00010f 0526 .dw XT_CSTORE + +000110 00fc .dw XT_UBRR +000111 054a .dw XT_DUP +000112 0792 .dw XT_BYTESWAP +000113 04ce .dw XT_DOLITERAL +000114 00cd .dw BAUDRATE_HIGH +000115 0526 .dw XT_CSTORE +000116 04ce .dw XT_DOLITERAL +000117 00cc .dw BAUDRATE_LOW +000118 0526 .dw XT_CSTORE + .if XT_USART_INIT_RX!=0 +000119 00a4 .dw XT_USART_INIT_RX + .endif + .if XT_USART_INIT_TX!=0 + .endif + +00011a 04ae .dw XT_EXIT + + ; all of amforth is in one segment + .include "amforth-low.asm" + + ;;;; + ;;;; GPL V2 (only) + + .set pc_ = pc + + .org $0000 +000000 940c 0ec0 jmp_ PFA_COLD + .org pc_ + + .include "amforth-interpreter.asm" + + + DO_COLON: +00011b 93bf push XH +00011c 93af push XL ; PUSH IP +00011d 01db movw XL, wl +00011e 9611 adiw xl, 1 + DO_NEXT: + .if WANT_INTERRUPTS == 1 +00011f 14b2 cp isrflag, zerol +000120 f499 brne DO_INTERRUPT + .endif +000121 01fd movw zl, XL ; READ IP +000122 2755 +000123 0fee +000124 1fff +000125 1f55 +000126 bf5b +000127 9167 +000128 9177 readflashcell wl, wh +000129 9611 adiw XL, 1 ; INC IP + + DO_EXECUTE: +00012a 01fb movw zl, wl +00012b 2755 +00012c 0fee +00012d 1fff +00012e 1f55 +00012f bf5b +000130 9107 +000131 9117 readflashcell temp0,temp1 +000132 01f8 movw zl, temp0 +000133 9409 ijmp + + .if WANT_INTERRUPTS == 1 + DO_INTERRUPT: + ; here we deal with interrupts the forth way +000134 939a +000135 938a savetos +000136 2d8b mov tosl, isrflag +000137 2799 clr tosh +000138 24bb clr isrflag +000139 e066 ldi wl, LOW(XT_ISREXEC) +00013a e079 ldi wh, HIGH(XT_ISREXEC) +00013b cfee rjmp DO_EXECUTE + .include "drivers/generic-isr.asm" + + .eseg +000000 intvec: .byte INTVECTORS * CELLSIZE + .dseg +000212 intcnt: .byte INTVECTORS + .cseg + + ; interrupt routine gets called (again) by rcall! This gives the + ; address of the int-vector on the stack. + isr: +00013c 920a st -Y, r0 +00013d b60f in r0, SREG +00013e 920a st -Y, r0 + .if (pclen==3) +00013f 900f pop r0 ; some 128+K Flash devices use 3 cells for call/ret + .endif +000140 900f pop r0 +000141 900f pop r0 ; = intnum * intvectorsize + 1 (address following the rcall) +000142 940a dec r0 + .if intvecsize == 1 ; + .endif +000143 2cb0 mov isrflag, r0 +000144 93ff push zh +000145 93ef push zl +000146 e1e2 ldi zl, low(intcnt) +000147 e0f2 ldi zh, high(intcnt) +000148 9406 lsr r0 ; we use byte addresses in the counter array, not words +000149 0de0 add zl, r0 +00014a 1df3 adc zh, zeroh +00014b 8000 ld r0, Z +00014c 9403 inc r0 +00014d 8200 st Z, r0 +00014e 91ef pop zl +00014f 91ff pop zh + +000150 9009 ld r0, Y+ +000151 be0f out SREG, r0 +000152 9009 ld r0, Y+ +000153 9508 ret ; returns the interrupt, the rcall stack frame is removed! + ; no reti here, see words/isr-end.asm + .set AMFORTH_NRWW_SIZE=(FLASHEND-AMFORTH_RO_SEG)*2 + ; lower part of the dictionary + .include "dict/rww.inc" + + + ; Arithmetics + ; add a number to a double cell + VE_MPLUS: +000154 ff02 .dw $ff02 +000155 2b6d .db "m+" +000156 0100 .dw VE_HEAD + .set VE_HEAD = VE_MPLUS + XT_MPLUS: +000157 011b .dw DO_COLON + PFA_MPLUS: +000158 1255 .dw XT_S2D +000159 0879 .dw XT_DPLUS +00015a 04ae .dw XT_EXIT + .include "words/ud-star.asm" + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_UDSTAR: +00015b ff03 .dw $ff03 +00015c 6475 +../../common\words/ud-star.asm(9): warning: .cseg .db misalignment - padding zero byte +00015d 002a .db "ud*" +00015e 0154 .dw VE_HEAD + .set VE_HEAD = VE_UDSTAR + XT_UDSTAR: +00015f 011b .dw DO_COLON + PFA_UDSTAR: + + .endif + ;Z UD* ud1 d2 -- ud3 32*16->32 multiply + ; XT_DUP >R UM* DROP XT_SWAP R> UM* ROT + ; + +000160 054a +000161 0598 +000162 0679 +000163 0572 .DW XT_DUP,XT_TO_R,XT_UMSTAR,XT_DROP +000164 055d +000165 058f +000166 0679 +000167 057a +000168 0636 +000169 04ae .DW XT_SWAP,XT_R_FROM,XT_UMSTAR,XT_ROT,XT_PLUS,XT_EXIT + .include "words/umax.asm" + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_UMAX: +00016a ff04 .dw $ff04 +00016b 6d75 +00016c 7861 .db "umax" +00016d 015b .dw VE_HEAD + .set VE_HEAD = VE_UMAX + XT_UMAX: +00016e 011b .dw DO_COLON + PFA_UMAX: + .endif + +00016f 09ca +000170 05f5 .DW XT_2DUP,XT_ULESS +000171 04c7 .dw XT_DOCONDBRANCH +000172 0174 DEST(UMAX1) +000173 055d .DW XT_SWAP +000174 0572 UMAX1: .DW XT_DROP +000175 04ae .dw XT_EXIT + .include "words/umin.asm" + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_UMIN: +000176 ff04 .dw $ff04 +000177 6d75 +000178 6e69 .db "umin" +000179 016a .dw VE_HEAD + .set VE_HEAD = VE_UMIN + XT_UMIN: +00017a 011b .dw DO_COLON + PFA_UMIN: + .endif +00017b 09ca +00017c 0600 .DW XT_2DUP,XT_UGREATER +00017d 04c7 .dw XT_DOCONDBRANCH +00017e 0180 DEST(UMIN1) +00017f 055d .DW XT_SWAP +000180 0572 UMIN1: .DW XT_DROP +000181 04ae .dw XT_EXIT + .include "words/immediate-q.asm" + + ; Tools + ; return +1 if immediate, -1 otherwise, flag from name>flags + ;VE_IMMEDIATEQ: + ; .dw $ff06 + ; .db "immediate?" + ; .dw VE_HEAD + ; .set VE_HEAD = VE_IMMEDIATEQ + XT_IMMEDIATEQ: +000182 011b .dw DO_COLON + PFA_IMMEDIATEQ: +000183 04ce .dw XT_DOLITERAL +000184 8000 .dw $8000 +000185 06ac .dw XT_AND +000186 05b3 .dw XT_ZEROEQUAL +000187 04c7 .dw XT_DOCONDBRANCH +000188 018b DEST(IMMEDIATEQ1) +000189 1274 .dw XT_ONE +00018a 04ae .dw XT_EXIT + IMMEDIATEQ1: + ; not immediate +00018b 05e4 .dw XT_TRUE +00018c 04ae .dw XT_EXIT + .include "words/name2flags.asm" + + ; Tools + ; get the flags from a name token + VE_NAME2FLAGS: +00018d ff0a .dw $ff0a +00018e 616e +00018f 656d +000190 663e +000191 616c +000192 7367 .db "name>flags" +000193 0176 .dw VE_HEAD + .set VE_HEAD = VE_NAME2FLAGS + XT_NAME2FLAGS: +000194 011b .dw DO_COLON + PFA_NAME2FLAGS: +000195 082c .dw XT_FETCHI ; skip to link field +000196 04ce .dw XT_DOLITERAL +000197 ff00 .dw $ff00 +000198 06ac .dw XT_AND +000199 04ae .dw XT_EXIT + + .if AMFORTH_NRWW_SIZE > 8000 + .include "dict/appl_8k.inc" + + + .include "words/newest.asm" + + ; System Variable + ; system state + VE_NEWEST: +00019a ff06 .dw $ff06 +00019b 656e +00019c 6577 +00019d 7473 .db "newest" +00019e 018d .dw VE_HEAD + .set VE_HEAD = VE_NEWEST + XT_NEWEST: +00019f 04dc .dw PFA_DOVARIABLE + PFA_NEWEST: +0001a0 024b .dw ram_newest + + .dseg +00024b ram_newest: .byte 4 + .include "words/latest.asm" + + ; System Variable + ; system state + VE_LATEST: +0001a1 ff06 .dw $ff06 +0001a2 616c +0001a3 6574 +0001a4 7473 .db "latest" +0001a5 019a .dw VE_HEAD + .set VE_HEAD = VE_LATEST + XT_LATEST: +0001a6 04dc .dw PFA_DOVARIABLE + PFA_LATEST: +0001a7 024f .dw ram_latest + + .dseg +00024f ram_latest: .byte 2 + .include "words/do-create.asm" + + ; Compiler + ; parse the input and create an empty vocabulary entry without XT and data field (PF) + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_DOCREATE: +0001a8 ff08 .dw $ff08 +0001a9 6328 +0001aa 6572 +0001ab 7461 +0001ac 2965 .db "(create)" +0001ad 01a1 .dw VE_HEAD + .set VE_HEAD = VE_DOCREATE + XT_DOCREATE: +0001ae 011b .dw DO_COLON + PFA_DOCREATE: + .endif +0001af 0e1a +0001b0 0305 .DW XT_PARSENAME,XT_WLSCOPE ; ( -- addr len wid) +0001b1 054a +0001b2 019f +0001b3 09c2 +0001b4 051a .DW XT_DUP,XT_NEWEST,XT_CELLPLUS,XT_STORE ; save the wid +0001b5 02ea +0001b6 019f +0001b7 051a .DW XT_HEADER,XT_NEWEST,XT_STORE ; save the nt +0001b8 04ae .DW XT_EXIT + .include "words/backslash.asm" + + ; Compiler + ; everything up to the end of the current line is a comment + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_BACKSLASH: +0001b9 0001 .dw $0001 +0001ba 005c .db $5c,0 +0001bb 01a8 .dw VE_HEAD + .set VE_HEAD = VE_BACKSLASH + XT_BACKSLASH: +0001bc 011b .dw DO_COLON + PFA_BACKSLASH: + .endif +0001bd 0e01 .dw XT_SOURCE +0001be 0589 .dw XT_NIP +0001bf 09e3 .dw XT_TO_IN +0001c0 051a .dw XT_STORE +0001c1 04ae .dw XT_EXIT + .include "words/l-paren.asm" + + ; Compiler + ; skip everything up to the closing bracket on the same line + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_LPAREN: +0001c2 0001 .dw $0001 +0001c3 0028 .db "(" ,0 +0001c4 01b9 .dw VE_HEAD + .set VE_HEAD = VE_LPAREN + XT_LPAREN: +0001c5 011b .dw DO_COLON + PFA_LPAREN: + .endif +0001c6 04ce .dw XT_DOLITERAL +0001c7 0029 .dw ')' +0001c8 0ded .dw XT_PARSE +0001c9 09d3 .dw XT_2DROP +0001ca 04ae .dw XT_EXIT + + .include "words/compile.asm" + + ; Dictionary + ; read the following cell from the dictionary and append it to the current dictionary position. + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_COMPILE: +0001cb ff07 .dw $ff07 +0001cc 6f63 +0001cd 706d +0001ce 6c69 +0001cf 0065 .db "compile",0 +0001d0 01c2 .dw VE_HEAD + .set VE_HEAD = VE_COMPILE + XT_COMPILE: +0001d1 011b .dw DO_COLON + PFA_COMPILE: + .endif +0001d2 058f .dw XT_R_FROM +0001d3 054a .dw XT_DUP +0001d4 1011 .dw XT_ICELLPLUS +0001d5 0598 .dw XT_TO_R +0001d6 082c .dw XT_FETCHI +0001d7 01dc .dw XT_COMMA +0001d8 04ae .dw XT_EXIT + .include "words/comma.asm" + + ; Dictionary + ; compile 16 bit into flash at DP + VE_COMMA: +0001d9 ff01 .dw $ff01 +0001da 002c .db ',',0 ; , +0001db 01cb .dw VE_HEAD + .set VE_HEAD = VE_COMMA + XT_COMMA: +0001dc 011b .dw DO_COLON + PFA_COMMA: +0001dd 0a13 .dw XT_DP +0001de 080d .dw XT_STOREI +0001df 0a13 .dw XT_DP +0001e0 06c8 .dw XT_1PLUS +0001e1 0fff .dw XT_DOTO +0001e2 0a14 .dw PFA_DP +0001e3 04ae .dw XT_EXIT + .include "words/brackettick.asm" + + ; Compiler + ; what ' does in the interpreter mode, do in colon definitions + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_BRACKETTICK: +0001e4 0003 .dw $0003 +0001e5 275b +0001e6 005d .db "[']",0 +0001e7 01d9 .dw VE_HEAD + .set VE_HEAD = VE_BRACKETTICK + XT_BRACKETTICK: +0001e8 011b .dw DO_COLON + PFA_BRACKETTICK: + .endif +0001e9 0c70 .dw XT_TICK +0001ea 01f2 .dw XT_LITERAL +0001eb 04ae .dw XT_EXIT + + + .include "words/literal.asm" + + ; Compiler + ; compile a literal in colon defintions + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_LITERAL: +0001ec 0007 .dw $0007 +0001ed 696c +0001ee 6574 +0001ef 6172 +0001f0 006c .db "literal",0 +0001f1 01e4 .dw VE_HEAD + .set VE_HEAD = VE_LITERAL + XT_LITERAL: +0001f2 011b .dw DO_COLON + PFA_LITERAL: + .endif +0001f3 01d1 .DW XT_COMPILE +0001f4 04ce .DW XT_DOLITERAL +0001f5 01dc .DW XT_COMMA +0001f6 04ae .DW XT_EXIT + .include "words/sliteral.asm" + + ; String + ; compiles a string to flash, at runtime leaves ( -- flash-addr count) on stack + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_SLITERAL: +0001f7 0008 .dw $0008 +0001f8 6c73 +0001f9 7469 +0001fa 7265 +0001fb 6c61 .db "sliteral" +0001fc 01ec .dw VE_HEAD + .set VE_HEAD = VE_SLITERAL + XT_SLITERAL: +0001fd 011b .dw DO_COLON + PFA_SLITERAL: + .endif +0001fe 01d1 .dw XT_COMPILE +0001ff 0bd3 .dw XT_DOSLITERAL ; ( -- addr n) +000200 0be1 .dw XT_SCOMMA +000201 04ae .dw XT_EXIT + .include "words/g-mark.asm" + + ; Compiler + ; places current dictionary position for backward resolves + ;VE_GMARK: + ; .dw $ff05 + ; .db ">mark" + ; .dw VE_HEAD + ; .set VE_HEAD = VE_GMARK + XT_GMARK: +000202 011b .dw DO_COLON + PFA_GMARK: +000203 0a13 .dw XT_DP +000204 01d1 .dw XT_COMPILE +000205 ffff .dw -1 ; ffff does not erase flash +000206 04ae .dw XT_EXIT + .include "words/g-resolve.asm" + + ; Compiler + ; resolve backward jumps + ;VE_GRESOLVE: + ; .dw $ff08 + ; .db ">resolve" + ; .dw VE_HEAD + ; .set VE_HEAD = VE_GRESOLVE + XT_GRESOLVE: +000207 011b .dw DO_COLON + PFA_GRESOLVE: +000208 0fbd .dw XT_QSTACK +000209 0a13 .dw XT_DP +00020a 055d .dw XT_SWAP +00020b 080d .dw XT_STOREI +00020c 04ae .dw XT_EXIT + .include "words/l_mark.asm" + + ; Compiler + ; place destination for backward branch + ;VE_LMARK: + ; .dw $ff05 + ; .db "r if 2drop then r> invert ; + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + XT_QDOCHECK: +00029b 011b .dw DO_COLON + PFA_QDOCHECK: + .endif +00029c 09ca .dw XT_2DUP +00029d 126d .dw XT_EQUAL +00029e 054a .dw XT_DUP +00029f 0598 .dw XT_TO_R +0002a0 04c7 .dw XT_DOCONDBRANCH +0002a1 02a3 DEST(PFA_QDOCHECK1) +0002a2 09d3 .dw XT_2DROP + PFA_QDOCHECK1: +0002a3 058f .dw XT_R_FROM +0002a4 0696 .dw XT_INVERT +0002a5 04ae .dw XT_EXIT + .include "words/endloop.asm" + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_ENDLOOP: +0002a6 ff07 .dw $ff07 +0002a7 6e65 +0002a8 6c64 +0002a9 6f6f +0002aa 0070 .db "endloop",0 +0002ab 028f .dw VE_HEAD + .set VE_HEAD = VE_ENDLOOP + XT_ENDLOOP: +0002ac 011b .dw DO_COLON + PFA_ENDLOOP: + .endif + ;Z ENDLOOP adrs xt -- L: 0 a1 a2 .. aN -- + ; ?DUP WHILE POSTPONE THEN REPEAT ; + ; resolve LEAVEs + ; This is a common factor of LOOP and +LOOP. + +0002ad 0210 .DW XT_LRESOLVE +0002ae 02b9 +0002af 0552 +0002b0 04c7 LOOP1: .DW XT_L_FROM,XT_QDUP,XT_DOCONDBRANCH +0002b1 02b5 DEST(LOOP2) +0002b2 0235 .DW XT_THEN +0002b3 04bd .dw XT_DOBRANCH +0002b4 02ae DEST(LOOP1) +0002b5 04ae LOOP2: .DW XT_EXIT + ; leave address stack + .include "words/l-from.asm" + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_L_FROM: +0002b6 ff02 .dw $ff02 +0002b7 3e6c .db "l>" +0002b8 02a6 .dw VE_HEAD + .set VE_HEAD = VE_L_FROM + XT_L_FROM: +0002b9 011b .dw DO_COLON + PFA_L_FROM: + + .endif + ;Z L> -- x L: x -- move from leave stack + ; LP @ @ -2 LP +! ; + +0002ba 02d8 .dw XT_LP +0002bb 0512 .dw XT_FETCH +0002bc 0512 .dw XT_FETCH +0002bd 04ce .dw XT_DOLITERAL +0002be fffe .dw -2 +0002bf 02d8 .dw XT_LP +0002c0 06fe .dw XT_PLUSSTORE +0002c1 04ae .dw XT_EXIT + .include "words/to-l.asm" + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_TO_L: +0002c2 ff02 .dw $ff02 +0002c3 6c3e .db ">l" +0002c4 02b6 .dw VE_HEAD + .set VE_HEAD = VE_TO_L + XT_TO_L: +0002c5 011b .dw DO_COLON + PFA_TO_L: + .endif + ;Z >L x -- L: -- x move to leave stack + ; CELL LP +! LP @ ! ; (L stack grows up) + +0002c6 1279 .dw XT_TWO +0002c7 02d8 .dw XT_LP +0002c8 06fe .dw XT_PLUSSTORE +0002c9 02d8 .dw XT_LP +0002ca 0512 .dw XT_FETCH +0002cb 051a .dw XT_STORE +0002cc 04ae .dw XT_EXIT + .include "words/lp0.asm" + + ; Stack + ; start address of leave stack + VE_LP0: +0002cd ff03 .dw $ff03 +0002ce 706c +0002cf 0030 .db "lp0",0 +0002d0 02c2 .dw VE_HEAD + .set VE_HEAD = VE_LP0 + XT_LP0: +0002d1 0509 .dw PFA_DOVALUE1 + PFA_LP0: +0002d2 007e .dw CFG_LP0 +0002d3 101a .dw XT_EDEFERFETCH +0002d4 1024 .dw XT_EDEFERSTORE + .include "words/lp.asm" + + ; System Variable + ; leave stack pointer + VE_LP: +0002d5 ff02 .dw $ff02 +0002d6 706c .db "lp" +0002d7 02cd .dw VE_HEAD + .set VE_HEAD = VE_LP + XT_LP: +0002d8 04dc .dw PFA_DOVARIABLE + PFA_LP: +0002d9 0251 .dw ram_lp + + .dseg +000251 ram_lp: .byte 2 + .cseg + + + .include "words/create.asm" + + ; Dictionary + ; create a dictionary header. XT is (constant), with the address of the data field of name + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_CREATE: +0002da ff06 .dw $ff06 +0002db 7263 +0002dc 6165 +0002dd 6574 .db "create" +0002de 02d5 .dw VE_HEAD + .set VE_HEAD = VE_CREATE + XT_CREATE: +0002df 011b .dw DO_COLON + PFA_CREATE: + .endif +0002e0 01ae .dw XT_DOCREATE +0002e1 030e .dw XT_REVEAL +0002e2 01d1 .dw XT_COMPILE +0002e3 04e9 .dw PFA_DOCONSTANT +0002e4 04ae .dw XT_EXIT + .include "words/header.asm" + + ; Compiler + ; creates the vocabulary header without XT and data field (PF) in the wordlist wid + VE_HEADER: +0002e5 ff06 .dw $ff06 +0002e6 6568 +0002e7 6461 +0002e8 7265 .db "header" +0002e9 02da .dw VE_HEAD + .set VE_HEAD = VE_HEADER + XT_HEADER: +0002ea 011b .dw DO_COLON + PFA_HEADER: +0002eb 0a13 .dw XT_DP ; the new Name Field +0002ec 0598 .dw XT_TO_R +0002ed 0598 .dw XT_TO_R ; ( R: NFA WID ) +0002ee 054a .dw XT_DUP +0002ef 05c1 .dw XT_GREATERZERO +0002f0 04c7 .dw XT_DOCONDBRANCH +0002f1 02fc .dw PFA_HEADER1 +0002f2 054a .dw XT_DUP +0002f3 04ce .dw XT_DOLITERAL +0002f4 ff00 .dw $ff00 ; all flags are off (e.g. immediate) +0002f5 06b5 .dw XT_OR +0002f6 0be5 .dw XT_DOSCOMMA + ; make the link to the previous entry in this wordlist +0002f7 058f .dw XT_R_FROM +0002f8 07f9 .dw XT_FETCHE +0002f9 01dc .dw XT_COMMA +0002fa 058f .dw XT_R_FROM +0002fb 04ae .dw XT_EXIT + + PFA_HEADER1: + ; -16: attempt to use zero length string as a name +0002fc 04ce .dw XT_DOLITERAL +0002fd fff0 .dw -16 +0002fe 0ca7 .dw XT_THROW + + .include "words/wlscope.asm" + + ; Compiler + ; dynamically place a word in a wordlist. The word name may be changed. + VE_WLSCOPE: +0002ff ff07 .dw $ff07 +000300 6c77 +000301 6373 +000302 706f +000303 0065 .db "wlscope",0 +000304 02e5 .dw VE_HEAD + .set VE_HEAD = VE_WLSCOPE + XT_WLSCOPE: +000305 1079 .dw PFA_DODEFER1 + PFA_WLSCOPE: +000306 007a .dw CFG_WLSCOPE +000307 101a .dw XT_EDEFERFETCH +000308 1024 .dw XT_EDEFERSTORE + + ; wlscope, "wordlist scope" ( addr len -- addr' len' wid ), is a deferred word + ; which enables the AmForth application to choose the wordlist ( wid ) for the + ; new voc entry based on the input ( addr len ) string. The name of the new voc + ; entry ( addr' len' ) may be different from the input string. Note that all + ; created voc entry types pass through the wlscope mechanism. The default + ; wlscope action passes the input string to the output without modification and + ; uses get-current to select the wid. + .include "words/reveal.asm" + + ; Dictionary + ; makes an entry in a wordlist visible, if not already done. + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_REVEAL: +000309 ff06 .dw $ff06 +00030a 6572 +00030b 6576 +00030c 6c61 .db "reveal" +00030d 02ff .dw VE_HEAD + .set VE_HEAD = VE_REVEAL + XT_REVEAL: +00030e 011b .dw DO_COLON + PFA_REVEAL: + .endif +00030f 019f +000310 09c2 +000311 0512 .DW XT_NEWEST,XT_CELLPLUS,XT_FETCH ; only if wordlist is in use +000312 0552 +000313 04c7 .DW XT_QDUP,XT_DOCONDBRANCH +000314 0319 DEST(REVEAL1) +000315 019f +000316 0512 +000317 055d +000318 07d5 .DW XT_NEWEST,XT_FETCH,XT_SWAP,XT_STOREE + ; .DW XT_ZERO,XT_NEWEST,XT_CELLPLUS,XT_STORE ; clean wordlist entry + REVEAL1: +000319 04ae .DW XT_EXIT + .include "words/does.asm" + + ; Compiler + ; organize the XT replacement to call other colon code + VE_DOES: +00031a 0005 .dw $0005 +00031b 6f64 +00031c 7365 +00031d 003e .db "does>",0 +00031e 0309 .dw VE_HEAD + .set VE_HEAD = VE_DOES + XT_DOES: +00031f 011b .dw DO_COLON + PFA_DOES: +000320 01d1 .dw XT_COMPILE +000321 0332 .dw XT_DODOES +000322 01d1 .dw XT_COMPILE ; create a code snippet to be used in an embedded XT +000323 940e .dw $940e ; the address of this compiled +000324 01d1 .dw XT_COMPILE ; code will replace the XT of the +000325 0327 .dw DO_DODOES ; word that CREATE created +000326 04ae .dw XT_EXIT ; + + DO_DODOES: ; ( -- PFA ) +000327 939a +000328 938a savetos +000329 01cb movw tosl, wl +00032a 9601 adiw tosl, 1 + ; the following takes the address from a real uC-call + .if (pclen==3) +00032b 917f pop wh ; some 128K Flash devices use 3 cells for call/ret + .endif +00032c 917f pop wh +00032d 916f pop wl + +00032e 93bf push XH +00032f 93af push XL +000330 01db movw XL, wl +000331 cded jmp_ DO_NEXT + + ; ( -- ) + ; System + ; replace the XT written by CREATE to call the code that follows does> + ;VE_DODOES: + ; .dw $ff07 + ; .db "(does>)" + ; .set VE_HEAD = VE_DODOES + XT_DODOES: +000332 011b .dw DO_COLON + PFA_DODOES: +000333 058f .dw XT_R_FROM +000334 019f .dw XT_NEWEST +000335 09c2 .dw XT_CELLPLUS +000336 0512 .dw XT_FETCH +000337 07f9 .dw XT_FETCHE +000338 10e4 .dw XT_NFA2CFA +000339 080d .dw XT_STOREI +00033a 04ae .dw XT_EXIT + .include "words/colon.asm" + + ; Compiler + ; create a named entry in the dictionary, XT is DO_COLON + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_COLON: +00033b ff01 .dw $ff01 +00033c 003a .db ":",0 +00033d 031a .dw VE_HEAD + .set VE_HEAD = VE_COLON + XT_COLON: +00033e 011b .dw DO_COLON + PFA_COLON: + .endif +00033f 01ae .dw XT_DOCREATE +000340 0349 .dw XT_COLONNONAME +000341 0572 .dw XT_DROP +000342 04ae .dw XT_EXIT + .include "words/colon-noname.asm" + + ; Compiler + ; create an unnamed entry in the dictionary, XT is DO_COLON + VE_COLONNONAME: +000343 ff07 .dw $ff07 +000344 6e3a +000345 6e6f +000346 6d61 +000347 0065 .db ":noname",0 +000348 033b .dw VE_HEAD + .set VE_HEAD = VE_COLONNONAME + XT_COLONNONAME: +000349 011b .dw DO_COLON + PFA_COLONNONAME: +00034a 0a13 .dw XT_DP +00034b 054a .dw XT_DUP +00034c 01a6 .dw XT_LATEST +00034d 051a .dw XT_STORE + +00034e 01d1 .dw XT_COMPILE +00034f 011b .dw DO_COLON + +000350 035e .dw XT_RBRACKET +000351 04ae .dw XT_EXIT + .include "words/semicolon.asm" + + ; Compiler + ; finish colon defintion, compiles (exit) and returns to interpret state + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + + + VE_SEMICOLON: +000352 0001 .dw $0001 +000353 003b .db $3b,0 +000354 0343 .dw VE_HEAD + .set VE_HEAD = VE_SEMICOLON + XT_SEMICOLON: +000355 011b .dw DO_COLON + PFA_SEMICOLON: + .endif +000356 01d1 .dw XT_COMPILE +000357 04ae .dw XT_EXIT +000358 0366 .dw XT_LBRACKET +000359 030e .dw XT_REVEAL +00035a 04ae .dw XT_EXIT + .include "words/right-bracket.asm" + + ; Compiler + ; enter compiler mode + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_RBRACKET: +00035b ff01 .dw $ff01 +00035c 005d .db "]",0 +00035d 0352 .dw VE_HEAD + .set VE_HEAD = VE_RBRACKET + XT_RBRACKET: +00035e 011b .dw DO_COLON + PFA_RBRACKET: + .endif +00035f 1274 .dw XT_ONE +000360 09af .dw XT_STATE +000361 051a .dw XT_STORE +000362 04ae .dw XT_EXIT + .include "words/left-bracket.asm" + + ; Compiler + ; enter interpreter mode + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_LBRACKET: +000363 0001 .dw $0001 +000364 005b .db "[",0 +000365 035b .dw VE_HEAD + .set VE_HEAD = VE_LBRACKET + XT_LBRACKET: +000366 011b .dw DO_COLON + PFA_LBRACKET: + .endif +000367 05ed .dw XT_ZERO +000368 09af .dw XT_STATE +000369 051a .dw XT_STORE +00036a 04ae .dw XT_EXIT + .include "words/variable.asm" + + ; Compiler + ; create a dictionary entry for a variable and allocate 1 cell RAM + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + + VE_VARIABLE: +00036b ff08 .dw $ff08 +00036c 6176 +00036d 6972 +00036e 6261 +00036f 656c .db "variable" +000370 0363 .dw VE_HEAD + .set VE_HEAD = VE_VARIABLE + XT_VARIABLE: +000371 011b .dw DO_COLON + PFA_VARIABLE: + .endif +000372 0a24 .dw XT_HERE +000373 037d .dw XT_CONSTANT +000374 1279 .dw XT_TWO +000375 0a2d .dw XT_ALLOT +000376 04ae .dw XT_EXIT + .include "words/constant.asm" + + ; Compiler + ; create a constant in the dictionary + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + + VE_CONSTANT: +000377 ff08 .dw $ff08 +000378 6f63 +000379 736e +00037a 6174 +00037b 746e .db "constant" +00037c 036b .dw VE_HEAD + .set VE_HEAD = VE_CONSTANT + XT_CONSTANT: +00037d 011b .dw DO_COLON + PFA_CONSTANT: + .endif +00037e 01ae .dw XT_DOCREATE +00037f 030e .dw XT_REVEAL +000380 01d1 .dw XT_COMPILE +000381 04dc .dw PFA_DOVARIABLE +000382 01dc .dw XT_COMMA +000383 04ae .dw XT_EXIT + .include "words/user.asm" + + ; Compiler + ; create a dictionary entry for a user variable at offset n + VE_USER: +000384 ff04 .dw $ff04 +000385 7375 +000386 7265 .db "user" +000387 0377 .dw VE_HEAD + .set VE_HEAD = VE_USER + XT_USER: +000388 011b .dw DO_COLON + PFA_USER: +000389 01ae .dw XT_DOCREATE +00038a 030e .dw XT_REVEAL + +00038b 01d1 .dw XT_COMPILE +00038c 04ef .dw PFA_DOUSER +00038d 01dc .dw XT_COMMA +00038e 04ae .dw XT_EXIT + + .include "words/recurse.asm" + + ; Compiler + ; compile the XT of the word currently being defined into the dictionary + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_RECURSE: +00038f 0007 .dw $0007 +000390 6572 +000391 7563 +000392 7372 +000393 0065 .db "recurse",0 +000394 0384 .dw VE_HEAD + .set VE_HEAD = VE_RECURSE + XT_RECURSE: +000395 011b .dw DO_COLON + PFA_RECURSE: + .endif +000396 01a6 .dw XT_LATEST +000397 0512 .dw XT_FETCH +000398 01dc .dw XT_COMMA +000399 04ae .dw XT_EXIT + .include "words/immediate.asm" + + ; Compiler + ; set immediate flag for the most recent word definition + VE_IMMEDIATE: +00039a ff09 .dw $ff09 +00039b 6d69 +00039c 656d +00039d 6964 +00039e 7461 +00039f 0065 .db "immediate",0 +0003a0 038f .dw VE_HEAD + .set VE_HEAD = VE_IMMEDIATE + XT_IMMEDIATE: +0003a1 011b .dw DO_COLON + PFA_IMMEDIATE: +0003a2 0443 .dw XT_GET_CURRENT +0003a3 07f9 .dw XT_FETCHE +0003a4 054a .dw XT_DUP +0003a5 082c .dw XT_FETCHI +0003a6 04ce .dw XT_DOLITERAL +0003a7 7fff .dw $7fff +0003a8 06ac .dw XT_AND +0003a9 055d .dw XT_SWAP +0003aa 080d .dw XT_STOREI +0003ab 04ae .dw XT_EXIT + + .include "words/bracketchar.asm" + + ; Tools + ; skip leading space delimites, place the first character of the word on the stack + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_BRACKETCHAR: +0003ac 0006 .dw $0006 +0003ad 635b +0003ae 6168 +0003af 5d72 .db "[char]" +0003b0 039a .dw VE_HEAD + .set VE_HEAD = VE_BRACKETCHAR + XT_BRACKETCHAR: +0003b1 011b .dw DO_COLON + PFA_BRACKETCHAR: + .endif +0003b2 01d1 .dw XT_COMPILE +0003b3 04ce .dw XT_DOLITERAL +0003b4 0d50 .dw XT_CHAR +0003b5 01dc .dw XT_COMMA +0003b6 04ae .dw XT_EXIT + .include "words/abort-string.asm" + + ;C i*x x1 -- R: j*x -- x1<>0 + ; POSTPONE IS" POSTPONE ?ABORT ; IMMEDIATE + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_ABORTQUOTE: +0003b7 0006 .dw $0006 +0003b8 6261 +0003b9 726f +0003ba 2274 .db "abort",'"' +0003bb 03ac .dw VE_HEAD + .set VE_HEAD = VE_ABORTQUOTE + XT_ABORTQUOTE: +0003bc 011b .dw DO_COLON + PFA_ABORTQUOTE: + .endif +0003bd 0925 .dw XT_SQUOTE +0003be 01d1 .dw XT_COMPILE +0003bf 03ce .dw XT_QABORT +0003c0 04ae .DW XT_EXIT + .include "words/abort.asm" + + ; Exceptions + ; send an exception -1 + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_ABORT: +0003c1 ff05 .dw $ff05 +0003c2 6261 +0003c3 726f +0003c4 0074 .db "abort",0 +0003c5 03b7 .dw VE_HEAD + .set VE_HEAD = VE_ABORT + XT_ABORT: +0003c6 011b .dw DO_COLON + PFA_ABORT: + .endif +0003c7 05e4 .dw XT_TRUE +0003c8 0ca7 .dw XT_THROW + .include "words/q-abort.asm" + + ; ROT IF ITYPE ABORT THEN 2DROP ; + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_QABORT: +0003c9 ff06 .dw $ff06 +0003ca 613f +0003cb 6f62 +0003cc 7472 .db "?abort" +0003cd 03c1 .dw VE_HEAD + .set VE_HEAD = VE_QABORT + XT_QABORT: +0003ce 011b .dw DO_COLON + PFA_QABORT: + + .endif +0003cf 057a +0003d0 04c7 .DW XT_ROT,XT_DOCONDBRANCH +0003d1 03d4 DEST(QABO1) +0003d2 0c06 +0003d3 03c6 .DW XT_ITYPE,XT_ABORT +0003d4 09d3 +0003d5 04ae QABO1: .DW XT_2DROP,XT_EXIT + + .include "words/get-stack.asm" + + ; Tools + ; Get a stack from EEPROM + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_GET_STACK: +0003d6 ff09 .dw $ff09 +0003d7 6567 +0003d8 2d74 +0003d9 7473 +0003da 6361 +0003db 006b .db "get-stack",0 +0003dc 03c9 .dw VE_HEAD + .set VE_HEAD = VE_GET_STACK + XT_GET_STACK: +0003dd 011b .dw DO_COLON + .endif +0003de 054a .dw XT_DUP +0003df 09c2 .dw XT_CELLPLUS +0003e0 055d .dw XT_SWAP +0003e1 07f9 .dw XT_FETCHE +0003e2 054a .dw XT_DUP +0003e3 0598 .dw XT_TO_R +0003e4 05ed .dw XT_ZERO +0003e5 055d .dw XT_SWAP ; go from bigger to smaller addresses +0003e6 029b .dw XT_QDOCHECK +0003e7 04c7 .dw XT_DOCONDBRANCH +0003e8 03f4 DEST(PFA_N_FETCH_E2) +0003e9 0734 .dw XT_DODO + PFA_N_FETCH_E1: + ; ( ee-addr ) +0003ea 0745 .dw XT_I +0003eb 06ce .dw XT_1MINUS +0003ec 09bc .dw XT_CELLS ; ( -- ee-addr i*2 ) +0003ed 0568 .dw XT_OVER ; ( -- ee-addr i*2 ee-addr ) +0003ee 0636 .dw XT_PLUS ; ( -- ee-addr ee-addr+i +0003ef 07f9 .dw XT_FETCHE ;( -- ee-addr item_i ) +0003f0 055d .dw XT_SWAP ;( -- item_i ee-addr ) +0003f1 05e4 .dw XT_TRUE ; shortcut for -1 +0003f2 0753 .dw XT_DOPLUSLOOP +0003f3 03ea DEST(PFA_N_FETCH_E1) + PFA_N_FETCH_E2: +0003f4 09d3 .dw XT_2DROP +0003f5 058f .dw XT_R_FROM +0003f6 04ae .dw XT_EXIT + + .include "words/set-stack.asm" + + ; Tools + ; Write a stack to EEPROM + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_SET_STACK: +0003f7 ff09 .dw $ff09 +0003f8 6573 +0003f9 2d74 +0003fa 7473 +0003fb 6361 +0003fc 006b .db "set-stack",0 +0003fd 03d6 .dw VE_HEAD + .set VE_HEAD = VE_SET_STACK + XT_SET_STACK: +0003fe 011b .dw DO_COLON + PFA_SET_STACK: + .endif +0003ff 0568 .dw XT_OVER +000400 05ba .dw XT_ZEROLESS +000401 04c7 .dw XT_DOCONDBRANCH +000402 0406 DEST(PFA_SET_STACK0) +000403 04ce .dw XT_DOLITERAL +000404 fffc .dw -4 +000405 0ca7 .dw XT_THROW + PFA_SET_STACK0: +000406 09ca .dw XT_2DUP +000407 07d5 .dw XT_STOREE ; ( -- i_n .. i_0 n e-addr ) +000408 055d .dw XT_SWAP +000409 05ed .dw XT_ZERO +00040a 029b .dw XT_QDOCHECK +00040b 04c7 .dw XT_DOCONDBRANCH +00040c 0413 DEST(PFA_SET_STACK2) +00040d 0734 .dw XT_DODO + PFA_SET_STACK1: +00040e 09c2 .dw XT_CELLPLUS ; ( -- i_x e-addr ) +00040f 09db .dw XT_TUCK ; ( -- e-addr i_x e-addr +000410 07d5 .dw XT_STOREE +000411 0762 .dw XT_DOLOOP +000412 040e DEST(PFA_SET_STACK1) + PFA_SET_STACK2: +000413 0572 .dw XT_DROP +000414 04ae .dw XT_EXIT + + .include "words/map-stack.asm" + + ; Tools + ; Iterate over a stack + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_MAPSTACK: +000415 ff09 .dw $ff09 +000416 616d +000417 2d70 +000418 7473 +000419 6361 +00041a 006b .db "map-stack",0 +00041b 03f7 .dw VE_HEAD + .set VE_HEAD = VE_MAPSTACK + XT_MAPSTACK: +00041c 011b .dw DO_COLON + PFA_MAPSTACK: + .endif +00041d 054a .dw XT_DUP +00041e 09c2 .dw XT_CELLPLUS +00041f 055d .dw XT_SWAP +000420 07f9 .dw XT_FETCHE +000421 09bc .dw XT_CELLS +000422 124c .dw XT_BOUNDS +000423 029b .dw XT_QDOCHECK +000424 04c7 .dw XT_DOCONDBRANCH +000425 0438 DEST(PFA_MAPSTACK3) +000426 0734 .dw XT_DODO + PFA_MAPSTACK1: +000427 0745 .dw XT_I +000428 07f9 .dw XT_FETCHE ; -- i*x XT id +000429 055d .dw XT_SWAP +00042a 0598 .dw XT_TO_R +00042b 05a1 .dw XT_R_FETCH +00042c 04b8 .dw XT_EXECUTE ; i*x id -- j*y true | i*x false +00042d 0552 .dw XT_QDUP +00042e 04c7 .dw XT_DOCONDBRANCH +00042f 0434 DEST(PFA_MAPSTACK2) +000430 058f .dw XT_R_FROM +000431 0572 .dw XT_DROP +000432 076d .dw XT_UNLOOP +000433 04ae .dw XT_EXIT + PFA_MAPSTACK2: +000434 058f .dw XT_R_FROM +000435 1279 .dw XT_TWO +000436 0753 .dw XT_DOPLUSLOOP +000437 0427 DEST(PFA_MAPSTACK1) + PFA_MAPSTACK3: +000438 0572 .dw XT_DROP +000439 05ed .dw XT_ZERO +00043a 04ae .dw XT_EXIT + + ; + ; : map-stack ( i*x XT e-addr -- j*y ) + ; dup cell+ swap @e cells bounds ?do + ; ( -- i*x XT ) + ; i @e swap >r r@ execute + ; ?dup if r> drop unloop exit then + ; r> + ; 2 +loop drop 0 + ; ; + .include "words/get-current.asm" + + ; Search Order + ; get the wid of the current compilation word list + VE_GET_CURRENT: +00043b ff0b .dw $ff0b +00043c 6567 +00043d 2d74 +00043e 7563 +00043f 7272 +000440 6e65 +000441 0074 .db "get-current",0 +000442 0415 .dw VE_HEAD + .set VE_HEAD = VE_GET_CURRENT + XT_GET_CURRENT: +000443 011b .dw DO_COLON + PFA_GET_CURRENT: +000444 04ce .dw XT_DOLITERAL +000445 0084 .dw CFG_CURRENT +000446 07f9 .dw XT_FETCHE +000447 04ae .dw XT_EXIT + .include "words/get-order.asm" + + ; Search Order + ; Get the current search order word list + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_GET_ORDER: +000448 ff09 .dw $ff09 +000449 6567 +00044a 2d74 +00044b 726f +00044c 6564 +00044d 0072 .db "get-order",0 +00044e 043b .dw VE_HEAD + .set VE_HEAD = VE_GET_ORDER + XT_GET_ORDER: +00044f 011b .dw DO_COLON + PFA_GET_ORDER: + .endif +000450 04ce .dw XT_DOLITERAL +000451 0088 .dw CFG_ORDERLISTLEN +000452 03dd .dw XT_GET_STACK +000453 04ae .dw XT_EXIT + .include "words/cfg-order.asm" + + ; Search Order + ; Get the current search order word list + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_CFG_ORDER: +000454 ff09 .dw $ff09 +000455 6663 +000456 2d67 +000457 726f +000458 6564 +000459 0072 .db "cfg-order",0 +00045a 0448 .dw VE_HEAD + .set VE_HEAD = VE_CFG_ORDER + XT_CFG_ORDER: +00045b 04dc .dw PFA_DOVARIABLE + PFA_CFG_ORDER: + .endif +00045c 0088 .dw CFG_ORDERLISTLEN + .include "words/compare.asm" + + ; String + ; compares two strings in RAM + VE_COMPARE: +00045d ff07 .dw $ff07 +00045e 6f63 +00045f 706d +000460 7261 +000461 0065 .db "compare",0 +000462 0454 .dw VE_HEAD + .set VE_HEAD = VE_COMPARE + XT_COMPARE: +000463 0464 .dw PFA_COMPARE + PFA_COMPARE: +000464 93bf push xh +000465 93af push xl +000466 018c movw temp0, tosl +000467 9189 +000468 9199 loadtos +000469 01dc movw xl, tosl +00046a 9189 +00046b 9199 loadtos +00046c 019c movw temp2, tosl +00046d 9189 +00046e 9199 loadtos +00046f 01fc movw zl, tosl + PFA_COMPARE_LOOP: +000470 90ed ld temp4, X+ +000471 90f1 ld temp5, Z+ +000472 14ef cp temp4, temp5 +000473 f451 brne PFA_COMPARE_NOTEQUAL +000474 950a dec temp0 +000475 f019 breq PFA_COMPARE_ENDREACHED2 +000476 952a dec temp2 +000477 f7c1 brne PFA_COMPARE_LOOP +000478 c001 rjmp PFA_COMPARE_ENDREACHED + PFA_COMPARE_ENDREACHED2: +000479 952a dec temp2 + PFA_COMPARE_ENDREACHED: +00047a 2b02 or temp0, temp2 +00047b f411 brne PFA_COMPARE_CHECKLASTCHAR +00047c 2788 clr tosl +00047d c002 rjmp PFA_COMPARE_DONE + PFA_COMPARE_CHECKLASTCHAR: + PFA_COMPARE_NOTEQUAL: +00047e ef8f ser tosl +00047f c000 rjmp PFA_COMPARE_DONE + + PFA_COMPARE_DONE: +000480 2f98 mov tosh, tosl +000481 91af pop xl +000482 91bf pop xh +000483 cc9b jmp_ DO_NEXT + .include "words/nfa2lfa.asm" + + ; System + ; get the link field address from the name field address + VE_NFA2LFA: +000484 ff07 .dw $ff07 +000485 666e +000486 3e61 +000487 666c +000488 0061 .db "nfa>lfa",0 +000489 045d .dw VE_HEAD + .set VE_HEAD = VE_NFA2LFA + XT_NFA2LFA: +00048a 011b .dw DO_COLON + PFA_NFA2LFA: +00048b 10d8 .dw XT_NAME2STRING +00048c 06c8 .dw XT_1PLUS +00048d 069d .dw XT_2SLASH +00048e 0636 .dw XT_PLUS +00048f 04ae .dw XT_EXIT + .elif AMFORTH_NRWW_SIZE > 4000 + .elif AMFORTH_NRWW_SIZE > 2000 + .else + .endif + .include "dict_appl.inc" + + ; they may be moved to the core dictionary if needed + + .include "words/applturnkey.asm" + + ; R( -- ) + ; application specific turnkey action + VE_APPLTURNKEY: +000490 ff0b .dw $ff0b +000491 7061 +000492 6c70 +000493 7574 +000494 6e72 +000495 656b +000496 0079 .db "applturnkey",0 +000497 0484 .dw VE_HEAD + .set VE_HEAD = VE_APPLTURNKEY + XT_APPLTURNKEY: +000498 011b .dw DO_COLON + PFA_APPLTURNKEY: +000499 0105 .dw XT_USART + + .if WANT_INTERRUPTS == 1 +00049a 08dd .dw XT_INTON + .endif + +00049b 0fca .dw XT_DOT_VER +00049c 0c48 .dw XT_SPACE +00049d 09a4 .dw XT_F_CPU +00049e 04ce .dw XT_DOLITERAL +00049f 03e8 .dw 1000 +0004a0 065b .dw XT_UMSLASHMOD +0004a1 0589 .dw XT_NIP +0004a2 0a42 .dw XT_DECIMAL +0004a3 0b88 .dw XT_DOT +0004a4 0bd3 .dw XT_DOSLITERAL +0004a5 0004 .dw 4 +0004a6 486b +0004a7 207a .db "kHz " +0004a8 0c06 .dw XT_ITYPE + +0004a9 04ae .dw XT_EXIT + + .include "dict/nrww.inc" ; well, not really nrww, but simplifies things alot + + ; section together with the forth inner interpreter + + .include "words/exit.asm" + + ; Compiler + ; end of current colon word + VE_EXIT: +0004aa ff04 .dw $ff04 +0004ab 7865 +0004ac 7469 .db "exit" +0004ad 0490 .dw VE_HEAD + .set VE_HEAD = VE_EXIT + XT_EXIT: +0004ae 04af .dw PFA_EXIT + PFA_EXIT: +0004af 91af pop XL +0004b0 91bf pop XH +0004b1 cc6d jmp_ DO_NEXT + .include "words/execute.asm" + + ; System + ; execute XT + VE_EXECUTE: +0004b2 ff07 .dw $ff07 +0004b3 7865 +0004b4 6365 +0004b5 7475 +0004b6 0065 .db "execute",0 +0004b7 04aa .dw VE_HEAD + .set VE_HEAD = VE_EXECUTE + XT_EXECUTE: +0004b8 04b9 .dw PFA_EXECUTE + PFA_EXECUTE: +0004b9 01bc movw wl, tosl +0004ba 9189 +0004bb 9199 loadtos +0004bc cc6d jmp_ DO_EXECUTE + .include "words/dobranch.asm" + + ; System + ; runtime of branch + ;VE_DOBRANCH: + ; .dw $ff08 + ; .db "(branch)" + ; .dw VE_HEAD + ; .set VE_HEAD = VE_DOBRANCH + XT_DOBRANCH: +0004bd 04be .dw PFA_DOBRANCH + PFA_DOBRANCH: +0004be 01fd movw zl, XL +0004bf 2755 +0004c0 0fee +0004c1 1fff +0004c2 1f55 +0004c3 bf5b +0004c4 91a7 +0004c5 91b7 readflashcell XL,XH +0004c6 cc58 jmp_ DO_NEXT + .include "words/docondbranch.asm" + + ; System + ; runtime of ?branch + ;VE_DOCONDBRANCH: + ; .dw $ff09 + ; .db "(?branch)" + ; .dw VE_HEAD + ; .set VE_HEAD = VE_DOCONDBRANCH + XT_DOCONDBRANCH: +0004c7 04c8 .dw PFA_DOCONDBRANCH + PFA_DOCONDBRANCH: +0004c8 2b98 or tosh, tosl +0004c9 9189 +0004ca 9199 loadtos +0004cb f391 brbs 1, PFA_DOBRANCH ; 1 is z flag; if tos is zero (false), do the branch +0004cc 9611 adiw XL, 1 +0004cd cc51 jmp_ DO_NEXT + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + .include "words/doliteral.asm" + + ; System + ; runtime of literal + ;VE_DOLITERAL: + ; .dw $ff09 + ; .db "(literal)" + ; .dw VE_HEAD + ; .set VE_HEAD = VE_DOLITERAL + XT_DOLITERAL: +0004ce 04cf .dw PFA_DOLITERAL + PFA_DOLITERAL: +0004cf 939a +0004d0 938a savetos +0004d1 01fd movw zl, xl +0004d2 2755 +0004d3 0fee +0004d4 1fff +0004d5 1f55 +0004d6 bf5b +0004d7 9187 +0004d8 9197 readflashcell tosl,tosh +0004d9 9611 adiw xl, 1 +0004da cc44 jmp_ DO_NEXT + + .include "words/dovariable.asm" + + ; System + ; puts content of parameter field (1 cell) to TOS + ;VE_DOVARIABLE: + ; .dw $ff0a + ; .db "(variable)" + ; .dw VE_HEAD + ; .set VE_HEAD = VE_DOVARIABLE + XT_DOVARIABLE: +0004db 04dc .dw PFA_DOVARIABLE + PFA_DOVARIABLE: +0004dc 939a +0004dd 938a savetos +0004de 01fb movw zl, wl +0004df 9631 adiw zl,1 +0004e0 2755 +0004e1 0fee +0004e2 1fff +0004e3 1f55 +0004e4 bf5b +0004e5 9187 +0004e6 9197 readflashcell tosl,tosh +0004e7 cc37 jmp_ DO_NEXT + .include "words/doconstant.asm" + + ; System + ; place data field address on TOS + ;VE_DOCONSTANT: + ; .dw $ff0a + ; .db "(constant)" + ; .dw VE_HEAD + ; .set VE_HEAD = VE_DOCONSTANT + XT_DOCONSTANT: +0004e8 04e9 .dw PFA_DOCONSTANT + PFA_DOCONSTANT: +0004e9 939a +0004ea 938a savetos +0004eb 01cb movw tosl, wl +0004ec 9601 adiw tosl, 1 +0004ed cc31 jmp_ DO_NEXT + .include "words/douser.asm" + + ; System + ; runtime part of user + ;VE_DOUSER: + ; .dw $ff06 + ; .db "(user)" + ; .dw VE_HEAD + ; .set VE_HEAD = VE_DOUSER + XT_DOUSER: +0004ee 04ef .dw PFA_DOUSER + PFA_DOUSER: +0004ef 939a +0004f0 938a savetos +0004f1 01fb movw zl, wl +0004f2 9631 adiw zl, 1 +0004f3 2755 +0004f4 0fee +0004f5 1fff +0004f6 1f55 +0004f7 bf5b +0004f8 9187 +0004f9 9197 readflashcell tosl,tosh +0004fa 0d84 add tosl, upl +0004fb 1d95 adc tosh, uph +0004fc cc22 jmp_ DO_NEXT + .include "words/do-value.asm" + + ; System + ; runtime of value + VE_DOVALUE: +0004fd ff07 .dw $ff07 +0004fe 7628 +0004ff 6c61 +000500 6575 +000501 0029 .db "(value)", 0 +000502 04b2 .dw VE_HEAD + .set VE_HEAD = VE_DOVALUE + XT_DOVALUE: +000503 011b .dw DO_COLON + PFA_DOVALUE: +000504 01ae .dw XT_DOCREATE +000505 030e .dw XT_REVEAL +000506 01d1 .dw XT_COMPILE +000507 0509 .dw PFA_DOVALUE1 +000508 04ae .dw XT_EXIT + PFA_DOVALUE1: +000509 de1d call_ DO_DODOES +00050a 054a .dw XT_DUP +00050b 1011 .dw XT_ICELLPLUS +00050c 082c .dw XT_FETCHI +00050d 04b8 .dw XT_EXECUTE +00050e 04ae .dw XT_EXIT + + ; : (value) dup icell+ @i execute ; + .include "words/fetch.asm" + + ; Memory + ; read 1 cell from RAM address + VE_FETCH: +00050f ff01 .dw $ff01 +000510 0040 .db "@",0 +000511 04fd .dw VE_HEAD + .set VE_HEAD = VE_FETCH + XT_FETCH: +000512 0513 .dw PFA_FETCH + PFA_FETCH: + .if WANT_UNIFIED == 1 + .endif + PFA_FETCHRAM: +000513 01fc movw zl, tosl + ; low byte is read before the high byte +000514 9181 ld tosl, z+ +000515 9191 ld tosh, z+ +000516 cc08 jmp_ DO_NEXT + .if WANT_UNIFIED == 1 + .endif + .include "words/store.asm" + + ; Memory + ; write n to RAM memory at addr, low byte first + VE_STORE: +000517 ff01 .dw $ff01 +000518 0021 .db "!",0 +000519 050f .dw VE_HEAD + .set VE_HEAD = VE_STORE + XT_STORE: +00051a 051b .dw PFA_STORE + PFA_STORE: + .if WANT_UNIFIED == 1 + .endif + PFA_STORERAM: +00051b 01fc movw zl, tosl +00051c 9189 +00051d 9199 loadtos + ; the high byte is written before the low byte +00051e 8391 std Z+1, tosh +00051f 8380 std Z+0, tosl +000520 9189 +000521 9199 loadtos +000522 cbfc jmp_ DO_NEXT + .if WANT_UNIFIED == 1 + .endif + .include "words/cstore.asm" + + ; Memory + ; store a single byte to RAM address + VE_CSTORE: +000523 ff02 .dw $ff02 +000524 2163 .db "c!" +000525 0517 .dw VE_HEAD + .set VE_HEAD = VE_CSTORE + XT_CSTORE: +000526 0527 .dw PFA_CSTORE + PFA_CSTORE: +000527 01fc movw zl, tosl +000528 9189 +000529 9199 loadtos +00052a 8380 st Z, tosl +00052b 9189 +00052c 9199 loadtos +00052d cbf1 jmp_ DO_NEXT + .include "words/cfetch.asm" + + ; Memory + ; fetch a single byte from memory mapped locations + VE_CFETCH: +00052e ff02 .dw $ff02 +00052f 4063 .db "c@" +000530 0523 .dw VE_HEAD + .set VE_HEAD = VE_CFETCH + XT_CFETCH: +000531 0532 .dw PFA_CFETCH + PFA_CFETCH: +000532 01fc movw zl, tosl +000533 2799 clr tosh +000534 8180 ld tosl, Z +000535 cbe9 jmp_ DO_NEXT + .include "words/fetch-u.asm" + + ; Memory + ; read 1 cell from USER area + VE_FETCHU: +000536 ff02 .dw $ff02 +000537 7540 .db "@u" +000538 052e .dw VE_HEAD + .set VE_HEAD = VE_FETCHU + XT_FETCHU: +000539 011b .dw DO_COLON + PFA_FETCHU: +00053a 079b .dw XT_UP_FETCH +00053b 0636 .dw XT_PLUS +00053c 0512 .dw XT_FETCH +00053d 04ae .dw XT_EXIT + .include "words/store-u.asm" + + ; Memory + ; write n to USER area at offset + VE_STOREU: +00053e ff02 .dw $ff02 +00053f 7521 .db "!u" +000540 0536 .dw VE_HEAD + .set VE_HEAD = VE_STOREU + XT_STOREU: +000541 011b .dw DO_COLON + PFA_STOREU: +000542 079b .dw XT_UP_FETCH +000543 0636 .dw XT_PLUS +000544 051a .dw XT_STORE +000545 04ae .dw XT_EXIT + + ;;;;;;;;;;;;;;;;;;;;;;;;; + .include "words/dup.asm" + + ; Stack + ; duplicate TOS + VE_DUP: +000546 ff03 .dw $ff03 +000547 7564 +000548 0070 .db "dup",0 +000549 053e .dw VE_HEAD + .set VE_HEAD = VE_DUP + XT_DUP: +00054a 054b .dw PFA_DUP + PFA_DUP: +00054b 939a +00054c 938a savetos +00054d cbd1 jmp_ DO_NEXT + .include "words/qdup.asm" + + ; Stack + ; duplicate TOS if non-zero + VE_QDUP: +00054e ff04 .dw $ff04 +00054f 643f +000550 7075 .db "?dup" +000551 0546 .dw VE_HEAD + .set VE_HEAD = VE_QDUP + XT_QDUP: +000552 0553 .dw PFA_QDUP + PFA_QDUP: +000553 2f08 mov temp0, tosl +000554 2b09 or temp0, tosh +000555 f011 breq PFA_QDUP1 +000556 939a +000557 938a savetos + PFA_QDUP1: +000558 cbc6 jmp_ DO_NEXT + .include "words/swap.asm" + + ; Stack + ; swaps the two top level stack cells + VE_SWAP: +000559 ff04 .dw $ff04 +00055a 7773 +00055b 7061 .db "swap" +00055c 054e .dw VE_HEAD + .set VE_HEAD = VE_SWAP + XT_SWAP: +00055d 055e .dw PFA_SWAP + PFA_SWAP: +00055e 018c movw temp0, tosl +00055f 9189 +000560 9199 loadtos +000561 931a st -Y, temp1 +000562 930a st -Y, temp0 +000563 cbbb jmp_ DO_NEXT + .include "words/over.asm" + + ; Stack + ; Place a copy of x1 on top of the stack + VE_OVER: +000564 ff04 .dw $ff04 +000565 766f +000566 7265 .db "over" +000567 0559 .dw VE_HEAD + .set VE_HEAD = VE_OVER + XT_OVER: +000568 0569 .dw PFA_OVER + PFA_OVER: +000569 939a +00056a 938a savetos +00056b 818a ldd tosl, Y+2 +00056c 819b ldd tosh, Y+3 + +00056d cbb1 jmp_ DO_NEXT + .include "words/drop.asm" + + ; Stack + ; drop TOS + VE_DROP: +00056e ff04 .dw $ff04 +00056f 7264 +000570 706f .db "drop" +000571 0564 .dw VE_HEAD + .set VE_HEAD = VE_DROP + XT_DROP: +000572 0573 .dw PFA_DROP + PFA_DROP: +000573 9189 +000574 9199 loadtos +000575 cba9 jmp_ DO_NEXT + .include "words/rot.asm" + + ; Stack + ; rotate the three top level cells + VE_ROT: +000576 ff03 .dw $ff03 +000577 6f72 +000578 0074 .db "rot",0 +000579 056e .dw VE_HEAD + .set VE_HEAD = VE_ROT + XT_ROT: +00057a 057b .dw PFA_ROT + PFA_ROT: +00057b 018c movw temp0, tosl +00057c 9129 ld temp2, Y+ +00057d 9139 ld temp3, Y+ +00057e 9189 +00057f 9199 loadtos + +000580 933a st -Y, temp3 +000581 932a st -Y, temp2 +000582 931a st -Y, temp1 +000583 930a st -Y, temp0 + +000584 cb9a jmp_ DO_NEXT + .include "words/nip.asm" + + ; Stack + ; Remove Second of Stack + VE_NIP: +000585 ff03 .dw $ff03 +000586 696e +000587 0070 .db "nip",0 +000588 0576 .dw VE_HEAD + .set VE_HEAD = VE_NIP + XT_NIP: +000589 058a .dw PFA_NIP + PFA_NIP: +00058a 9622 adiw yl, 2 +00058b cb93 jmp_ DO_NEXT + ;;;;;;;;;;;;;;;;;;;;;;;;; + .include "words/r_from.asm" + + ; Stack + ; move TOR to TOS + VE_R_FROM: +00058c ff02 .dw $ff02 +00058d 3e72 .db "r>" +00058e 0585 .dw VE_HEAD + .set VE_HEAD = VE_R_FROM + XT_R_FROM: +00058f 0590 .dw PFA_R_FROM + PFA_R_FROM: +000590 939a +000591 938a savetos +000592 918f pop tosl +000593 919f pop tosh +000594 cb8a jmp_ DO_NEXT + .include "words/to_r.asm" + + ; Stack + ; move TOS to TOR + VE_TO_R: +000595 ff02 .dw $ff02 +000596 723e .db ">r" +000597 058c .dw VE_HEAD + .set VE_HEAD = VE_TO_R + XT_TO_R: +000598 0599 .dw PFA_TO_R + PFA_TO_R: +000599 939f push tosh +00059a 938f push tosl +00059b 9189 +00059c 9199 loadtos +00059d cb81 jmp_ DO_NEXT + .include "words/r_fetch.asm" + + ; Stack + ; fetch content of TOR + VE_R_FETCH: +00059e ff02 .dw $ff02 +00059f 4072 .db "r@" +0005a0 0595 .dw VE_HEAD + .set VE_HEAD = VE_R_FETCH + XT_R_FETCH: +0005a1 05a2 .dw PFA_R_FETCH + PFA_R_FETCH: +0005a2 939a +0005a3 938a savetos +0005a4 918f pop tosl +0005a5 919f pop tosh +0005a6 939f push tosh +0005a7 938f push tosl +0005a8 cb76 jmp_ DO_NEXT + + + .include "words/not-equal.asm" + + ; Compare + ; true if n1 is not equal to n2 + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_NOTEQUAL: +0005a9 ff02 .dw $ff02 +0005aa 3e3c .db "<>" +0005ab 059e .dw VE_HEAD + .set VE_HEAD = VE_NOTEQUAL + XT_NOTEQUAL: +0005ac 011b .dw DO_COLON + PFA_NOTEQUAL: + .endif + +0005ad 126d +0005ae 05b3 +0005af 04ae .DW XT_EQUAL,XT_ZEROEQUAL,XT_EXIT + .include "words/equalzero.asm" + + ; Compare + ; compare with 0 (zero) + VE_ZEROEQUAL: +0005b0 ff02 .dw $ff02 +0005b1 3d30 .db "0=" +0005b2 05a9 .dw VE_HEAD + .set VE_HEAD = VE_ZEROEQUAL + XT_ZEROEQUAL: +0005b3 05b4 .dw PFA_ZEROEQUAL + PFA_ZEROEQUAL: +0005b4 2b98 or tosh, tosl +0005b5 f5d1 brne PFA_ZERO1 +0005b6 c030 rjmp PFA_TRUE1 + .include "words/lesszero.asm" + + ; Compare + ; compare with zero + VE_ZEROLESS: +0005b7 ff02 .dw $ff02 +0005b8 3c30 .db "0<" +0005b9 05b0 .dw VE_HEAD + .set VE_HEAD = VE_ZEROLESS + XT_ZEROLESS: +0005ba 05bb .dw PFA_ZEROLESS + PFA_ZEROLESS: +0005bb fd97 sbrc tosh,7 +0005bc c02a rjmp PFA_TRUE1 +0005bd c032 rjmp PFA_ZERO1 + .include "words/greaterzero.asm" + + ; Compare + ; true if n1 is greater than 0 + VE_GREATERZERO: +0005be ff02 .dw $ff02 +0005bf 3e30 .db "0>" +0005c0 05b7 .dw VE_HEAD + .set VE_HEAD = VE_GREATERZERO + XT_GREATERZERO: +0005c1 05c2 .dw PFA_GREATERZERO + PFA_GREATERZERO: +0005c2 1582 cp tosl, zerol +0005c3 0593 cpc tosh, zeroh +0005c4 f15c brlt PFA_ZERO1 +0005c5 f151 brbs 1, PFA_ZERO1 +0005c6 c020 rjmp PFA_TRUE1 + .include "words/d-greaterzero.asm" + + ; Compare + ; compares if a double double cell number is greater 0 + VE_DGREATERZERO: +0005c7 ff03 .dw $ff03 +0005c8 3064 +0005c9 003e .db "d0>",0 +0005ca 05be .dw VE_HEAD + .set VE_HEAD = VE_DGREATERZERO + XT_DGREATERZERO: +0005cb 05cc .dw PFA_DGREATERZERO + PFA_DGREATERZERO: +0005cc 1582 cp tosl, zerol +0005cd 0593 cpc tosh, zeroh +0005ce 9189 +0005cf 9199 loadtos +0005d0 0582 cpc tosl, zerol +0005d1 0593 cpc tosh, zeroh +0005d2 f0ec brlt PFA_ZERO1 +0005d3 f0e1 brbs 1, PFA_ZERO1 +0005d4 c012 rjmp PFA_TRUE1 + .include "words/d-lesszero.asm" + + ; Compare + ; compares if a double double cell number is less than 0 + VE_DXT_ZEROLESS: +0005d5 ff03 .dw $ff03 +0005d6 3064 +0005d7 003c .db "d0<",0 +0005d8 05c7 .dw VE_HEAD + .set VE_HEAD = VE_DXT_ZEROLESS + XT_DXT_ZEROLESS: +0005d9 05da .dw PFA_DXT_ZEROLESS + PFA_DXT_ZEROLESS: +0005da 9622 adiw Y,2 +0005db fd97 sbrc tosh,7 +0005dc 940c 05e7 jmp PFA_TRUE1 +0005de 940c 05f0 jmp PFA_ZERO1 + + .include "words/true.asm" + + ; Arithmetics + ; leaves the value -1 (true) on TOS + VE_TRUE: +0005e0 ff04 .dw $ff04 +0005e1 7274 +0005e2 6575 .db "true" +0005e3 05d5 .dw VE_HEAD + .set VE_HEAD = VE_TRUE + XT_TRUE: +0005e4 05e5 .dw PFA_TRUE + PFA_TRUE: +0005e5 939a +0005e6 938a savetos + PFA_TRUE1: +0005e7 ef8f ser tosl +0005e8 ef9f ser tosh +0005e9 cb35 jmp_ DO_NEXT + .include "words/zero.asm" + + ; Arithmetics + ; place a value 0 on TOS + VE_ZERO: +0005ea ff01 .dw $ff01 +0005eb 0030 .db "0",0 +0005ec 05e0 .dw VE_HEAD + .set VE_HEAD = VE_ZERO + XT_ZERO: +0005ed 05ee .dw PFA_ZERO + PFA_ZERO: +0005ee 939a +0005ef 938a savetos + PFA_ZERO1: +0005f0 01c1 movw tosl, zerol +0005f1 cb2d jmp_ DO_NEXT + .include "words/uless.asm" + + ; Compare + ; true if u1 < u2 (unsigned) + VE_ULESS: +0005f2 ff02 .dw $ff02 +0005f3 3c75 .db "u<" +0005f4 05ea .dw VE_HEAD + .set VE_HEAD = VE_ULESS + XT_ULESS: +0005f5 05f6 .dw PFA_ULESS + PFA_ULESS: +0005f6 9129 ld temp2, Y+ +0005f7 9139 ld temp3, Y+ +0005f8 1782 cp tosl, temp2 +0005f9 0793 cpc tosh, temp3 +0005fa f3a8 brlo PFA_ZERO1 +0005fb f3a1 brbs 1, PFA_ZERO1 +0005fc cfea jmp_ PFA_TRUE1 + .include "words/u-greater.asm" + + ; Compare + ; true if u1 > u2 (unsigned) + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_UGREATER: +0005fd ff02 .dw $ff02 +0005fe 3e75 .db "u>" +0005ff 05f2 .dw VE_HEAD + .set VE_HEAD = VE_UGREATER + XT_UGREATER: +000600 011b .dw DO_COLON + PFA_UGREATER: + .endif +000601 055d .DW XT_SWAP +000602 05f5 .dw XT_ULESS +000603 04ae .dw XT_EXIT + .include "words/less.asm" + + ; Compare + ; true if n1 is less than n2 + VE_LESS: +000604 ff01 .dw $ff01 +000605 003c .db "<",0 +000606 05fd .dw VE_HEAD + .set VE_HEAD = VE_LESS + XT_LESS: +000607 0608 .dw PFA_LESS + PFA_LESS: +000608 9129 ld temp2, Y+ +000609 9139 ld temp3, Y+ +00060a 1728 cp temp2, tosl +00060b 0739 cpc temp3, tosh + PFA_LESSDONE: +00060c f71c brge PFA_ZERO1 +00060d cfd9 rjmp PFA_TRUE1 + .include "words/greater.asm" + + ; Compare + ; flag is true if n1 is greater than n2 + VE_GREATER: +00060e ff01 .dw $ff01 +00060f 003e .db ">",0 +000610 0604 .dw VE_HEAD + .set VE_HEAD = VE_GREATER + XT_GREATER: +000611 0612 .dw PFA_GREATER + PFA_GREATER: +000612 9129 ld temp2, Y+ +000613 9139 ld temp3, Y+ +000614 1728 cp temp2, tosl +000615 0739 cpc temp3, tosh + PFA_GREATERDONE: +000616 f2cc brlt PFA_ZERO1 +000617 f2c1 brbs 1, PFA_ZERO1 +000618 cfce rjmp PFA_TRUE1 + + .include "words/log2.asm" + + ; Arithmetics + ; logarithm to base 2 or highest set bitnumber + VE_LOG2: +000619 ff04 .dw $ff04 +00061a 6f6c +00061b 3267 .db "log2" +00061c 060e .dw VE_HEAD + .set VE_HEAD = VE_LOG2 + XT_LOG2: +00061d 061e .dw PFA_LOG2 + PFA_LOG2: +00061e 01fc movw zl, tosl +00061f 2799 clr tosh +000620 e180 ldi tosl, 16 + PFA_LOG2_1: +000621 958a dec tosl +000622 f022 brmi PFA_LOG2_2 ; wrong data +000623 0fee lsl zl +000624 1fff rol zh +000625 f7d8 brcc PFA_LOG2_1 +000626 caf8 jmp_ DO_NEXT + + PFA_LOG2_2: +000627 959a dec tosh +000628 caf6 jmp_ DO_NEXT + .include "words/minus.asm" + + ; Arithmetics + ; subtract n2 from n1 + VE_MINUS: +000629 ff01 .dw $ff01 +00062a 002d .db "-",0 +00062b 0619 .dw VE_HEAD + .set VE_HEAD = VE_MINUS + XT_MINUS: +00062c 062d .dw PFA_MINUS + PFA_MINUS: +00062d 9109 ld temp0, Y+ +00062e 9119 ld temp1, Y+ +00062f 1b08 sub temp0, tosl +000630 0b19 sbc temp1, tosh +000631 01c8 movw tosl, temp0 +000632 caec jmp_ DO_NEXT + .include "words/plus.asm" + + ; Arithmetics + ; add n1 and n2 + VE_PLUS: +000633 ff01 .dw $ff01 +000634 002b .db "+",0 +000635 0629 .dw VE_HEAD + .set VE_HEAD = VE_PLUS + XT_PLUS: +000636 0637 .dw PFA_PLUS + PFA_PLUS: +000637 9109 ld temp0, Y+ +000638 9119 ld temp1, Y+ +000639 0f80 add tosl, temp0 +00063a 1f91 adc tosh, temp1 +00063b cae3 jmp_ DO_NEXT + .include "words/mstar.asm" + + ; Arithmetics + ; multiply 2 cells to a double cell + VE_MSTAR: +00063c ff02 .dw $ff02 +00063d 2a6d .db "m*" +00063e 0633 .dw VE_HEAD + .set VE_HEAD = VE_MSTAR + XT_MSTAR: +00063f 0640 .dw PFA_MSTAR + PFA_MSTAR: +000640 018c movw temp0, tosl +000641 9189 +000642 9199 loadtos +000643 019c movw temp2, tosl + ; high cell ah*bh +000644 0231 muls temp3, temp1 +000645 0170 movw temp4, r0 + ; low cell al*bl +000646 9f20 mul temp2, temp0 +000647 01c0 movw tosl, r0 + ; signed ah*bl +000648 0330 mulsu temp3, temp0 +000649 08f3 sbc temp5, zeroh +00064a 0d90 add tosh, r0 +00064b 1ce1 adc temp4, r1 +00064c 1cf3 adc temp5, zeroh + + ; signed al*bh +00064d 0312 mulsu temp1, temp2 +00064e 08f3 sbc temp5, zeroh +00064f 0d90 add tosh, r0 +000650 1ce1 adc temp4, r1 +000651 1cf3 adc temp5, zeroh + +000652 939a +000653 938a savetos +000654 01c7 movw tosl, temp4 +000655 cac9 jmp_ DO_NEXT + .include "words/umslashmod.asm" + + ; Arithmetics + ; unsigned division ud / u2 with remainder + VE_UMSLASHMOD: +000656 ff06 .dw $ff06 +000657 6d75 +000658 6d2f +000659 646f .db "um/mod" +00065a 063c .dw VE_HEAD + .set VE_HEAD = VE_UMSLASHMOD + XT_UMSLASHMOD: +00065b 065c .dw PFA_UMSLASHMOD + PFA_UMSLASHMOD: +00065c 017c movw temp4, tosl + +00065d 9129 ld temp2, Y+ +00065e 9139 ld temp3, Y+ + +00065f 9109 ld temp0, Y+ +000660 9119 ld temp1, Y+ + + ;; unsigned 32/16 -> 16r16 divide + + PFA_UMSLASHMODmod: + + ; set loop counter +000661 e140 ldi temp6,$10 + + PFA_UMSLASHMODmod_loop: + ; shift left, saving high bit +000662 2755 clr temp7 +000663 0f00 lsl temp0 +000664 1f11 rol temp1 +000665 1f22 rol temp2 +000666 1f33 rol temp3 +000667 1f55 rol temp7 + + ; try subtracting divisor +000668 152e cp temp2, temp4 +000669 053f cpc temp3, temp5 +00066a 0552 cpc temp7,zerol + +00066b f018 brcs PFA_UMSLASHMODmod_loop_control + + PFA_UMSLASHMODmod_subtract: + ; dividend is large enough + ; do the subtraction for real + ; and set lowest bit +00066c 9503 inc temp0 +00066d 192e sub temp2, temp4 +00066e 093f sbc temp3, temp5 + + PFA_UMSLASHMODmod_loop_control: +00066f 954a dec temp6 +000670 f789 brne PFA_UMSLASHMODmod_loop + + PFA_UMSLASHMODmod_done: + ; put remainder on stack +000671 933a st -Y,temp3 +000672 932a st -Y,temp2 + + ; put quotient on stack +000673 01c8 movw tosl, temp0 +000674 caaa jmp_ DO_NEXT + .include "words/umstar.asm" + + ; Arithmetics + ; multiply 2 unsigned cells to a double cell + VE_UMSTAR: +000675 ff03 .dw $ff03 +000676 6d75 +000677 002a .db "um*",0 +000678 0656 .dw VE_HEAD + .set VE_HEAD = VE_UMSTAR + XT_UMSTAR: +000679 067a .dw PFA_UMSTAR + PFA_UMSTAR: +00067a 018c movw temp0, tosl +00067b 9189 +00067c 9199 loadtos + ; result: (temp3*temp1)* 65536 + (temp3*temp0 + temp1*temp2) * 256 + (temp0 * temp2) + ; low bytes +00067d 9f80 mul tosl,temp0 +00067e 01f0 movw zl, r0 +00067f 2722 clr temp2 +000680 2733 clr temp3 + ; middle bytes +000681 9f90 mul tosh, temp0 +000682 0df0 add zh, r0 +000683 1d21 adc temp2, r1 +000684 1d33 adc temp3, zeroh + +000685 9f81 mul tosl, temp1 +000686 0df0 add zh, r0 +000687 1d21 adc temp2, r1 +000688 1d33 adc temp3, zeroh + +000689 9f91 mul tosh, temp1 +00068a 0d20 add temp2, r0 +00068b 1d31 adc temp3, r1 +00068c 01cf movw tosl, zl +00068d 939a +00068e 938a savetos +00068f 01c9 movw tosl, temp2 +000690 ca8e jmp_ DO_NEXT + + .include "words/invert.asm" + + ; Arithmetics + ; 1-complement of TOS + VE_INVERT: +000691 ff06 .dw $ff06 +000692 6e69 +000693 6576 +000694 7472 .db "invert" +000695 0675 .dw VE_HEAD + .set VE_HEAD = VE_INVERT + XT_INVERT: +000696 0697 .dw PFA_INVERT + PFA_INVERT: +000697 9580 com tosl +000698 9590 com tosh +000699 ca85 jmp_ DO_NEXT + .include "words/2slash.asm" + + ; Arithmetics + ; arithmetic shift right + VE_2SLASH: +00069a ff02 .dw $ff02 +00069b 2f32 .db "2/" +00069c 0691 .dw VE_HEAD + .set VE_HEAD = VE_2SLASH + XT_2SLASH: +00069d 069e .dw PFA_2SLASH + PFA_2SLASH: +00069e 9595 asr tosh +00069f 9587 ror tosl +0006a0 ca7e jmp_ DO_NEXT + .include "words/2star.asm" + + ; Arithmetics + ; arithmetic shift left, filling with zero + VE_2STAR: +0006a1 ff02 .dw $ff02 +0006a2 2a32 .db "2*" +0006a3 069a .dw VE_HEAD + .set VE_HEAD = VE_2STAR + XT_2STAR: +0006a4 06a5 .dw PFA_2STAR + PFA_2STAR: +0006a5 0f88 lsl tosl +0006a6 1f99 rol tosh +0006a7 ca77 jmp_ DO_NEXT + .include "words/and.asm" + + ; Logic + ; bitwise and + VE_AND: +0006a8 ff03 .dw $ff03 +0006a9 6e61 +0006aa 0064 .db "and",0 +0006ab 06a1 .dw VE_HEAD + .set VE_HEAD = VE_AND + XT_AND: +0006ac 06ad .dw PFA_AND + PFA_AND: +0006ad 9109 ld temp0, Y+ +0006ae 9119 ld temp1, Y+ +0006af 2380 and tosl, temp0 +0006b0 2391 and tosh, temp1 +0006b1 ca6d jmp_ DO_NEXT + .include "words/or.asm" + + ; Logic + ; logical or + VE_OR: +0006b2 ff02 .dw $ff02 +0006b3 726f .db "or" +0006b4 06a8 .dw VE_HEAD + .set VE_HEAD = VE_OR + XT_OR: +0006b5 06b6 .dw PFA_OR + PFA_OR: +0006b6 9109 ld temp0, Y+ +0006b7 9119 ld temp1, Y+ +0006b8 2b80 or tosl, temp0 +0006b9 2b91 or tosh, temp1 +0006ba ca64 jmp_ DO_NEXT + + .include "words/xor.asm" + + ; Logic + ; exclusive or + VE_XOR: +0006bb ff03 .dw $ff03 +0006bc 6f78 +0006bd 0072 .db "xor",0 +0006be 06b2 .dw VE_HEAD + .set VE_HEAD = VE_XOR + XT_XOR: +0006bf 06c0 .dw PFA_XOR + PFA_XOR: +0006c0 9109 ld temp0, Y+ +0006c1 9119 ld temp1, Y+ +0006c2 2780 eor tosl, temp0 +0006c3 2791 eor tosh, temp1 +0006c4 ca5a jmp_ DO_NEXT + + .include "words/1plus.asm" + + ; Arithmetics + ; optimized increment + VE_1PLUS: +0006c5 ff02 .dw $ff02 +0006c6 2b31 .db "1+" +0006c7 06bb .dw VE_HEAD + .set VE_HEAD = VE_1PLUS + XT_1PLUS: +0006c8 06c9 .dw PFA_1PLUS + PFA_1PLUS: +0006c9 9601 adiw tosl,1 +0006ca ca54 jmp_ DO_NEXT + .include "words/1minus.asm" + + ; Arithmetics + ; optimized decrement + VE_1MINUS: +0006cb ff02 .dw $ff02 +0006cc 2d31 .db "1-" +0006cd 06c5 .dw VE_HEAD + .set VE_HEAD = VE_1MINUS + XT_1MINUS: +0006ce 06cf .dw PFA_1MINUS + PFA_1MINUS: +0006cf 9701 sbiw tosl, 1 +0006d0 ca4e jmp_ DO_NEXT + .include "words/q-negate.asm" + + ; 0< IF NEGATE THEN ; ...a common factor + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_QNEGATE: +0006d1 ff07 .dw $ff07 +0006d2 6e3f +0006d3 6765 +0006d4 7461 +../../common\words/q-negate.asm(11): warning: .cseg .db misalignment - padding zero byte +0006d5 0065 .db "?negate" +0006d6 06cb .dw VE_HEAD + .set VE_HEAD = VE_QNEGATE + XT_QNEGATE: +0006d7 011b .dw DO_COLON + PFA_QNEGATE: + + .endif +0006d8 05ba +0006d9 04c7 .DW XT_ZEROLESS,XT_DOCONDBRANCH +0006da 06dc DEST(QNEG1) +0006db 0aa5 .DW XT_NEGATE +0006dc 04ae QNEG1: .DW XT_EXIT + .include "words/lshift.asm" + + ; Arithmetics + ; logically shift n1 left n2 times + VE_LSHIFT: +0006dd ff06 .dw $ff06 +0006de 736c +0006df 6968 +0006e0 7466 .db "lshift" +0006e1 06d1 .dw VE_HEAD + .set VE_HEAD = VE_LSHIFT + XT_LSHIFT: +0006e2 06e3 .dw PFA_LSHIFT + PFA_LSHIFT: +0006e3 01fc movw zl, tosl +0006e4 9189 +0006e5 9199 loadtos + PFA_LSHIFT1: +0006e6 9731 sbiw zl, 1 +0006e7 f01a brmi PFA_LSHIFT2 +0006e8 0f88 lsl tosl +0006e9 1f99 rol tosh +0006ea cffb rjmp PFA_LSHIFT1 + PFA_LSHIFT2: +0006eb ca33 jmp_ DO_NEXT + + .include "words/rshift.asm" + + ; Arithmetics + ; shift n1 n2-times logically right + VE_RSHIFT: +0006ec ff06 .dw $ff06 +0006ed 7372 +0006ee 6968 +0006ef 7466 .db "rshift" +0006f0 06dd .dw VE_HEAD + .set VE_HEAD = VE_RSHIFT + XT_RSHIFT: +0006f1 06f2 .dw PFA_RSHIFT + PFA_RSHIFT: +0006f2 01fc movw zl, tosl +0006f3 9189 +0006f4 9199 loadtos + PFA_RSHIFT1: +0006f5 9731 sbiw zl, 1 +0006f6 f01a brmi PFA_RSHIFT2 +0006f7 9596 lsr tosh +0006f8 9587 ror tosl +0006f9 cffb rjmp PFA_RSHIFT1 + PFA_RSHIFT2: +0006fa ca24 jmp_ DO_NEXT + + .include "words/plusstore.asm" + + ; Arithmetics + ; add n to content of RAM address a-addr + VE_PLUSSTORE: +0006fb ff02 .dw $ff02 +0006fc 212b .db "+!" +0006fd 06ec .dw VE_HEAD + .set VE_HEAD = VE_PLUSSTORE + XT_PLUSSTORE: +0006fe 06ff .dw PFA_PLUSSTORE + PFA_PLUSSTORE: +0006ff 01fc movw zl, tosl +000700 9189 +000701 9199 loadtos +000702 8120 ldd temp2, Z+0 +000703 8131 ldd temp3, Z+1 +000704 0f82 add tosl, temp2 +000705 1f93 adc tosh, temp3 +000706 8380 std Z+0, tosl +000707 8391 std Z+1, tosh +000708 9189 +000709 9199 loadtos +00070a ca14 jmp_ DO_NEXT + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + .include "words/rpfetch.asm" + + ; Stack + ; current return stack pointer address + VE_RP_FETCH: +00070b ff03 .dw $ff03 +00070c 7072 +00070d 0040 .db "rp@",0 +00070e 06fb .dw VE_HEAD + .set VE_HEAD = VE_RP_FETCH + XT_RP_FETCH: +00070f 0710 .dw PFA_RP_FETCH + PFA_RP_FETCH: +000710 939a +000711 938a savetos +000712 b78d in tosl, SPL +000713 b79e in tosh, SPH +000714 ca0a jmp_ DO_NEXT + .include "words/rpstore.asm" + + ; Stack + ; set return stack pointer + VE_RP_STORE: +000715 ff03 .dw $ff03 +000716 7072 +000717 0021 .db "rp!",0 +000718 070b .dw VE_HEAD + .set VE_HEAD = VE_RP_STORE + XT_RP_STORE: +000719 071a .dw PFA_RP_STORE + PFA_RP_STORE: +00071a b72f in temp2, SREG +00071b 94f8 cli +00071c bf8d out SPL, tosl +00071d bf9e out SPH, tosh +00071e bf2f out SREG, temp2 +00071f 9189 +000720 9199 loadtos +000721 c9fd jmp_ DO_NEXT + .include "words/spfetch.asm" + + ; Stack + ; current data stack pointer + VE_SP_FETCH: +000722 ff03 .dw $ff03 +000723 7073 +000724 0040 .db "sp@",0 +000725 0715 .dw VE_HEAD + .set VE_HEAD = VE_SP_FETCH + XT_SP_FETCH: +000726 0727 .dw PFA_SP_FETCH + PFA_SP_FETCH: +000727 939a +000728 938a savetos +000729 01ce movw tosl, yl +00072a c9f4 jmp_ DO_NEXT + .include "words/spstore.asm" + + ; Stack + ; set data stack pointer to addr + VE_SP_STORE: +00072b ff03 .dw $ff03 +00072c 7073 +00072d 0021 .db "sp!",0 +00072e 0722 .dw VE_HEAD + .set VE_HEAD = VE_SP_STORE + XT_SP_STORE: +00072f 0730 .dw PFA_SP_STORE + PFA_SP_STORE: +000730 01ec movw yl, tosl +000731 9189 +000732 9199 loadtos +000733 c9eb jmp_ DO_NEXT + + .include "words/dodo.asm" + + ; System + ; runtime of do + ;VE_DODO: + ; .dw $ff04 + ; .db "(do)" + ; .dw VE_HEAD + ; .set VE_HEAD = VE_DODO + XT_DODO: +000734 0735 .dw PFA_DODO + PFA_DODO: +000735 9129 ld temp2, Y+ +000736 9139 ld temp3, Y+ ; limit + PFA_DODO1: +000737 e8e0 ldi zl, $80 +000738 0f3e add temp3, zl +000739 1b82 sub tosl, temp2 +00073a 0b93 sbc tosh, temp3 + +00073b 933f push temp3 +00073c 932f push temp2 ; limit ( --> limit + $8000) +00073d 939f push tosh +00073e 938f push tosl ; start -> index ( --> index - (limit - $8000) +00073f 9189 +000740 9199 loadtos +000741 c9dd jmp_ DO_NEXT + .include "words/i.asm" + + ; Compiler + ; current loop counter + VE_I: +000742 ff01 .dw $FF01 +000743 0069 .db "i",0 +000744 072b .dw VE_HEAD + .set VE_HEAD = VE_I + XT_I: +000745 0746 .dw PFA_I + PFA_I: +000746 939a +000747 938a savetos +000748 918f pop tosl +000749 919f pop tosh ; index +00074a 91ef pop zl +00074b 91ff pop zh ; limit +00074c 93ff push zh +00074d 93ef push zl +00074e 939f push tosh +00074f 938f push tosl +000750 0f8e add tosl, zl +000751 1f9f adc tosh, zh +000752 c9cc jmp_ DO_NEXT + .include "words/doplusloop.asm" + + ; System + ; runtime of +loop + ;VE_DOPLUSLOOP: + ; .dw $ff07 + ; .db "(+loop)" + ; .dw VE_HEAD + ; .set VE_HEAD = VE_DOPLUSLOOP + XT_DOPLUSLOOP: +000753 0754 .dw PFA_DOPLUSLOOP + PFA_DOPLUSLOOP: +000754 91ef pop zl +000755 91ff pop zh +000756 0fe8 add zl, tosl +000757 1ff9 adc zh, tosh +000758 9189 +000759 9199 loadtos +00075a f01b brvs PFA_DOPLUSLOOP_LEAVE + ; next cycle + PFA_DOPLUSLOOP_NEXT: + ; next iteration +00075b 93ff push zh +00075c 93ef push zl +00075d cd60 rjmp PFA_DOBRANCH ; read next cell from dictionary and jump to its destination + PFA_DOPLUSLOOP_LEAVE: +00075e 910f pop temp0 +00075f 911f pop temp1 ; remove limit +000760 9611 adiw xl, 1 ; skip branch-back address +000761 c9bd jmp_ DO_NEXT + .include "words/doloop.asm" + + ; System + ; runtime of loop + ;VE_DOLOOP: + ; .dw $ff06 + ; .db "(loop)" + ; .dw VE_HEAD + ; .set VE_HEAD = VE_DOLOOP + XT_DOLOOP: +000762 0763 .dw PFA_DOLOOP + PFA_DOLOOP: +000763 91ef pop zl +000764 91ff pop zh +000765 9631 adiw zl,1 +000766 f3bb brvs PFA_DOPLUSLOOP_LEAVE +000767 cff3 jmp_ PFA_DOPLUSLOOP_NEXT + .include "words/unloop.asm" + + ; Compiler + ; remove loop-sys, exit the loop and continue execution after it + VE_UNLOOP: +000768 ff06 .dw $ff06 +000769 6e75 +00076a 6f6c +00076b 706f .db "unloop" +00076c 0742 .dw VE_HEAD + .set VE_HEAD = VE_UNLOOP + XT_UNLOOP: +00076d 076e .dw PFA_UNLOOP + PFA_UNLOOP: +00076e 911f pop temp1 +00076f 910f pop temp0 +000770 911f pop temp1 +000771 910f pop temp0 +000772 c9ac jmp_ DO_NEXT + + ;;;;;;;;;;;;;;;;;;;;;;;;;;; + + .include "words/cmove_g.asm" + + ; Memory + ; copy data in RAM from higher to lower addresses. + VE_CMOVE_G: +000773 ff06 .dw $ff06 +000774 6d63 +000775 766f +000776 3e65 .db "cmove>" +000777 0768 .dw VE_HEAD + .set VE_HEAD = VE_CMOVE_G + XT_CMOVE_G: +000778 0779 .dw PFA_CMOVE_G + PFA_CMOVE_G: +000779 93bf push xh +00077a 93af push xl +00077b 91e9 ld zl, Y+ +00077c 91f9 ld zh, Y+ ; addr-to +00077d 91a9 ld xl, Y+ +00077e 91b9 ld xh, Y+ ; addr-from +00077f 2f09 mov temp0, tosh +000780 2b08 or temp0, tosl +000781 f041 brbs 1, PFA_CMOVE_G1 +000782 0fe8 add zl, tosl +000783 1ff9 adc zh, tosh +000784 0fa8 add xl, tosl +000785 1fb9 adc xh, tosh + PFA_CMOVE_G2: +000786 911e ld temp1, -X +000787 9312 st -Z, temp1 +000788 9701 sbiw tosl, 1 +000789 f7e1 brbc 1, PFA_CMOVE_G2 + PFA_CMOVE_G1: +00078a 91af pop xl +00078b 91bf pop xh +00078c 9189 +00078d 9199 loadtos +00078e c990 jmp_ DO_NEXT + .include "words/byteswap.asm" + + ; Arithmetics + ; exchange the bytes of the TOS + VE_BYTESWAP: +00078f ff02 .dw $ff02 +000790 3c3e .db "><" +000791 0773 .dw VE_HEAD + .set VE_HEAD = VE_BYTESWAP + XT_BYTESWAP: +000792 0793 .dw PFA_BYTESWAP + PFA_BYTESWAP: +000793 2f09 mov temp0, tosh +000794 2f98 mov tosh, tosl +000795 2f80 mov tosl, temp0 +000796 c988 jmp_ DO_NEXT + .include "words/up.asm" + + ; System Variable + ; get user area pointer + VE_UP_FETCH: +000797 ff03 .dw $ff03 +000798 7075 +000799 0040 .db "up@",0 +00079a 078f .dw VE_HEAD + .set VE_HEAD = VE_UP_FETCH + XT_UP_FETCH: +00079b 079c .dw PFA_UP_FETCH + PFA_UP_FETCH: +00079c 939a +00079d 938a savetos +00079e 01c2 movw tosl, upl +00079f c97f jmp_ DO_NEXT + + ; ( addr -- ) + ; System Variable + ; set user area pointer + VE_UP_STORE: +0007a0 ff03 .dw $ff03 +0007a1 7075 +0007a2 0021 .db "up!",0 +0007a3 0797 .dw VE_HEAD + .set VE_HEAD = VE_UP_STORE + XT_UP_STORE: +0007a4 07a5 .dw PFA_UP_STORE + PFA_UP_STORE: +0007a5 012c movw upl, tosl +0007a6 9189 +0007a7 9199 loadtos +0007a8 c976 jmp_ DO_NEXT + .include "words/1ms.asm" + + ; Time + ; busy waits (almost) exactly 1 millisecond + VE_1MS: +0007a9 ff03 .dw $ff03 +0007aa 6d31 +0007ab 0073 .db "1ms",0 +0007ac 07a0 .dw VE_HEAD + .set VE_HEAD = VE_1MS + XT_1MS: +0007ad 07ae .dw PFA_1MS + PFA_1MS: +0007ae e6e6 +0007af e0fe +0007b0 9731 +0007b1 f7f1 +0007b2 0000 delay 1000 +0007b3 c96b jmp_ DO_NEXT + .include "words/2to_r.asm" + + ; Stack + ; move DTOS to TOR + VE_2TO_R: +0007b4 ff03 .dw $ff03 +0007b5 3e32 +0007b6 0072 .db "2>r",0 +0007b7 07a9 .dw VE_HEAD + .set VE_HEAD = VE_2TO_R + XT_2TO_R: +0007b8 07b9 .dw PFA_2TO_R + PFA_2TO_R: +0007b9 01fc movw zl, tosl +0007ba 9189 +0007bb 9199 loadtos +0007bc 939f push tosh +0007bd 938f push tosl +0007be 93ff push zh +0007bf 93ef push zl +0007c0 9189 +0007c1 9199 loadtos +0007c2 c95c jmp_ DO_NEXT + .include "words/2r_from.asm" + + ; Stack + ; move DTOR to TOS + VE_2R_FROM: +0007c3 ff03 .dw $ff03 +0007c4 7232 +0007c5 003e .db "2r>",0 +0007c6 07b4 .dw VE_HEAD + .set VE_HEAD = VE_2R_FROM + XT_2R_FROM: +0007c7 07c8 .dw PFA_2R_FROM + PFA_2R_FROM: +0007c8 939a +0007c9 938a savetos +0007ca 91ef pop zl +0007cb 91ff pop zh +0007cc 918f pop tosl +0007cd 919f pop tosh +0007ce 939a +0007cf 938a savetos +0007d0 01cf movw tosl, zl +0007d1 c94d jmp_ DO_NEXT + + .include "words/store-e.asm" + + ; Memory + ; write n (2bytes) to eeprom address + VE_STOREE: +0007d2 ff02 .dw $ff02 +0007d3 6521 .db "!e" +0007d4 07c3 .dw VE_HEAD + .set VE_HEAD = VE_STOREE + XT_STOREE: +0007d5 07d6 .dw PFA_STOREE + PFA_STOREE: + .if WANT_UNIFIED == 1 + .endif + PFA_STOREE0: +0007d6 01fc movw zl, tosl +0007d7 9189 +0007d8 9199 loadtos +0007d9 b72f in_ temp2, SREG +0007da 94f8 cli +0007db d028 rcall PFA_FETCHE2 +0007dc b500 in_ temp0, EEDR +0007dd 1708 cp temp0,tosl +0007de f009 breq PFA_STOREE3 +0007df d00b rcall PFA_STOREE1 + PFA_STOREE3: +0007e0 9631 adiw zl,1 +0007e1 d022 rcall PFA_FETCHE2 +0007e2 b500 in_ temp0, EEDR +0007e3 1709 cp temp0,tosh +0007e4 f011 breq PFA_STOREE4 +0007e5 2f89 mov tosl, tosh +0007e6 d004 rcall PFA_STOREE1 + PFA_STOREE4: +0007e7 bf2f out_ SREG, temp2 +0007e8 9189 +0007e9 9199 loadtos +0007ea c934 jmp_ DO_NEXT + + PFA_STOREE1: +0007eb 99f9 sbic EECR, EEPE +0007ec cffe rjmp PFA_STOREE1 + + PFA_STOREE2: ; estore_wait_low_spm: +0007ed b707 in_ temp0, SPMCSR +0007ee fd00 sbrc temp0,SPMEN +0007ef cffd rjmp PFA_STOREE2 + +0007f0 bdf2 out_ EEARH,zh +0007f1 bde1 out_ EEARL,zl +0007f2 bd80 out_ EEDR, tosl +0007f3 9afa sbi EECR,EEMPE +0007f4 9af9 sbi EECR,EEPE + +0007f5 9508 ret + .if WANT_UNIFIED == 1 + .endif + .include "words/fetch-e.asm" + + ; Memory + ; read 1 cell from eeprom + VE_FETCHE: +0007f6 ff02 .dw $ff02 +0007f7 6540 .db "@e" +0007f8 07d2 .dw VE_HEAD + .set VE_HEAD = VE_FETCHE + XT_FETCHE: +0007f9 07fa .dw PFA_FETCHE + PFA_FETCHE: + .if WANT_UNIFIED == 1 + .endif + PFA_FETCHE1: +0007fa b72f in_ temp2, SREG +0007fb 94f8 cli +0007fc 01fc movw zl, tosl +0007fd d006 rcall PFA_FETCHE2 +0007fe b580 in_ tosl, EEDR + +0007ff 9631 adiw zl,1 + +000800 d003 rcall PFA_FETCHE2 +000801 b590 in_ tosh, EEDR +000802 bf2f out_ SREG, temp2 +000803 c91b jmp_ DO_NEXT + + PFA_FETCHE2: +000804 99f9 sbic EECR, EEPE +000805 cffe rjmp PFA_FETCHE2 + +000806 bdf2 out_ EEARH,zh +000807 bde1 out_ EEARL,zl + +000808 9af8 sbi EECR,EERE +000809 9508 ret + + .if WANT_UNIFIED == 1 + .endif + .include "words/store-i.asm" + + ; System Value + ; Deferred action to write a single 16bit cell to flash + VE_STOREI: +00080a ff02 .dw $ff02 +00080b 6921 .db "!i" +00080c 07f6 .dw VE_HEAD + .set VE_HEAD = VE_STOREI + XT_STOREI: +00080d 1079 .dw PFA_DODEFER1 + PFA_STOREI: +00080e 00a4 .dw EE_STOREI +00080f 101a .dw XT_EDEFERFETCH +000810 1024 .dw XT_EDEFERSTORE + .if FLASHEND > $10000 + .include "words/store-i_big.asm" + + ; R( -- ) + ; writes a cell in flash + VE_DO_STOREI_BIG: +000811 ff04 .dw $ff04 +000812 6928 +000813 2921 .db "(i!)" +000814 080a .dw VE_HEAD + .set VE_HEAD = VE_DO_STOREI_BIG + XT_DO_STOREI: +000815 0816 .dw PFA_DO_STOREI_BIG + PFA_DO_STOREI_BIG: +000816 019c movw temp2, tosl ; save the (word) address +000817 9189 +000818 9199 loadtos ; get the new value for the flash cell +000819 93af push xl +00081a 93bf push xh +00081b 93cf push yl +00081c 93df push yh +00081d e0e1 ldi zl, byte3(DO_STOREI_atmega) +00081e bfeb out_ rampz, zl +00081f eff0 ldi zh, byte2(DO_STOREI_atmega) +000820 e0e0 ldi zl, byte1(DO_STOREI_atmega) +000821 9519 eicall +000822 91df pop yh +000823 91cf pop yl +000824 91bf pop xh +000825 91af pop xl + ; finally clear the stack +000826 9189 +000827 9199 loadtos +000828 c8f6 jmp_ DO_NEXT + + ; + .set _pc = pc + .org NRWW_START_ADDR + DO_STOREI_atmega: + ; write data to temp page buffer + ; use the values in tosl/tosh at the + ; appropiate place +01f000 d010 rcall pageload + + ; erase page if needed + ; it is needed if a bit goes from 0 to 1 +01f001 94e0 com temp4 +01f002 94f0 com temp5 +01f003 218e and tosl, temp4 +01f004 219f and tosh, temp5 +01f005 2b98 or tosh, tosl +01f006 f019 breq DO_STOREI_writepage + +01f007 01f9 movw zl, temp2 +01f008 e003 ldi temp0,(1<8000 + .include "dict/core_8k.inc" + + .include "words/n_to_r.asm" + + ; Stack + ; move n items from data stack to return stack + VE_N_TO_R: +000836 ff03 .dw $ff03 +000837 3e6e +000838 0072 .db "n>r",0 +000839 0829 .dw VE_HEAD + .set VE_HEAD = VE_N_TO_R + XT_N_TO_R: +00083a 083b .dw PFA_N_TO_R + PFA_N_TO_R: +00083b 01fc movw zl, tosl +00083c 2f08 mov temp0, tosl + PFA_N_TO_R1: +00083d 9189 +00083e 9199 loadtos +00083f 939f push tosh +000840 938f push tosl +000841 950a dec temp0 +000842 f7d1 brne PFA_N_TO_R1 +000843 93ef push zl +000844 93ff push zh +000845 9189 +000846 9199 loadtos +000847 c8d7 jmp_ DO_NEXT + .include "words/n_r_from.asm" + + ; Stack + ; move n items from return stack to data stack + VE_N_R_FROM: +000848 ff03 .dw $ff03 +000849 726e +00084a 003e .db "nr>",0 +00084b 0836 .dw VE_HEAD + .set VE_HEAD = VE_N_R_FROM + XT_N_R_FROM: +00084c 084d .dw PFA_N_R_FROM + PFA_N_R_FROM: +00084d 939a +00084e 938a savetos +00084f 91ff pop zh +000850 91ef pop zl +000851 2f0e mov temp0, zl + PFA_N_R_FROM1: +000852 918f pop tosl +000853 919f pop tosh +000854 939a +000855 938a savetos +000856 950a dec temp0 +000857 f7d1 brne PFA_N_R_FROM1 +000858 01cf movw tosl, zl +000859 c8c5 jmp_ DO_NEXT + + .include "words/d-2star.asm" + + ; Arithmetics + ; shift a double cell left + VE_D2STAR: +00085a ff03 .dw $ff03 +00085b 3264 +00085c 002a .db "d2*",0 +00085d 0848 .dw VE_HEAD + .set VE_HEAD = VE_D2STAR + XT_D2STAR: +00085e 085f .dw PFA_D2STAR + PFA_D2STAR: +00085f 9109 ld temp0, Y+ +000860 9119 ld temp1, Y+ +000861 0f00 lsl temp0 +000862 1f11 rol temp1 +000863 1f88 rol tosl +000864 1f99 rol tosh +000865 931a st -Y, temp1 +000866 930a st -Y, temp0 +000867 c8b7 jmp_ DO_NEXT + .include "words/d-2slash.asm" + + ; Arithmetics + ; shift a double cell value right + VE_D2SLASH: +000868 ff03 .dw $ff03 +000869 3264 +00086a 002f .db "d2/",0 +00086b 085a .dw VE_HEAD + .set VE_HEAD = VE_D2SLASH + XT_D2SLASH: +00086c 086d .dw PFA_D2SLASH + PFA_D2SLASH: +00086d 9109 ld temp0, Y+ +00086e 9119 ld temp1, Y+ +00086f 9595 asr tosh +000870 9587 ror tosl +000871 9517 ror temp1 +000872 9507 ror temp0 +000873 931a st -Y, temp1 +000874 930a st -Y, temp0 +000875 c8a9 jmp_ DO_NEXT + .include "words/d-plus.asm" + + ; Arithmetics + ; add 2 double cell values + VE_DPLUS: +000876 ff02 .dw $ff02 +000877 2b64 .db "d+" +000878 0868 .dw VE_HEAD + .set VE_HEAD = VE_DPLUS + XT_DPLUS: +000879 087a .dw PFA_DPLUS + PFA_DPLUS: +00087a 9129 ld temp2, Y+ +00087b 9139 ld temp3, Y+ + +00087c 90e9 ld temp4, Y+ +00087d 90f9 ld temp5, Y+ +00087e 9149 ld temp6, Y+ +00087f 9159 ld temp7, Y+ + +000880 0f24 add temp2, temp6 +000881 1f35 adc temp3, temp7 +000882 1d8e adc tosl, temp4 +000883 1d9f adc tosh, temp5 + +000884 933a st -Y, temp3 +000885 932a st -Y, temp2 +000886 c898 jmp_ DO_NEXT + .include "words/d-minus.asm" + + ; Arithmetics + ; subtract d2 from d1 + VE_DMINUS: +000887 ff02 .dw $ff02 +000888 2d64 .db "d-" +000889 0876 .dw VE_HEAD + .set VE_HEAD = VE_DMINUS + XT_DMINUS: +00088a 088b .dw PFA_DMINUS + PFA_DMINUS: +00088b 9129 ld temp2, Y+ +00088c 9139 ld temp3, Y+ + +00088d 90e9 ld temp4, Y+ +00088e 90f9 ld temp5, Y+ +00088f 9149 ld temp6, Y+ +000890 9159 ld temp7, Y+ + +000891 1b42 sub temp6, temp2 +000892 0b53 sbc temp7, temp3 +000893 0ae8 sbc temp4, tosl +000894 0af9 sbc temp5, tosh + +000895 935a st -Y, temp7 +000896 934a st -Y, temp6 +000897 01c7 movw tosl, temp4 +000898 c886 jmp_ DO_NEXT + .include "words/d-invert.asm" + + ; Arithmetics + ; invert all bits in the double cell value + VE_DINVERT: +000899 ff07 .dw $ff07 +00089a 6964 +00089b 766e +00089c 7265 +00089d 0074 .db "dinvert",0 +00089e 0887 .dw VE_HEAD + .set VE_HEAD = VE_DINVERT + XT_DINVERT: +00089f 08a0 .dw PFA_DINVERT + PFA_DINVERT: +0008a0 9109 ld temp0, Y+ +0008a1 9119 ld temp1, Y+ +0008a2 9580 com tosl +0008a3 9590 com tosh +0008a4 9500 com temp0 +0008a5 9510 com temp1 +0008a6 931a st -Y, temp1 +0008a7 930a st -Y, temp0 +0008a8 c876 jmp_ DO_NEXT + .include "words/u-dot.asm" + + ; Numeric IO + ; unsigned PNO with single cell numbers + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_UDOT: +0008a9 ff02 .dw $ff02 +0008aa 2e75 .db "u." +0008ab 0899 .dw VE_HEAD + .set VE_HEAD = VE_UDOT + XT_UDOT: +0008ac 011b .dw DO_COLON + PFA_UDOT: + .endif +0008ad 05ed .dw XT_ZERO +0008ae 0b90 .dw XT_UDDOT +0008af 04ae .dw XT_EXIT + ; : u. ( us -- ) 0 ud. ; + .include "words/u-dot-r.asm" + + ; Numeric IO + ; unsigned PNO with single cells numbers, right aligned in width w + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + + + VE_UDOTR: +0008b0 ff03 .dw $ff03 +0008b1 2e75 +0008b2 0072 .db "u.r",0 +0008b3 08a9 .dw VE_HEAD + .set VE_HEAD = VE_UDOTR + XT_UDOTR: +0008b4 011b .dw DO_COLON + PFA_UDOTR: + .endif +0008b5 05ed .dw XT_ZERO +0008b6 055d .dw XT_SWAP +0008b7 0b99 .dw XT_UDDOTR +0008b8 04ae .dw XT_EXIT + ; : u.r ( s n -- ) 0 swap ud.r ; + + .include "words/show-wordlist.asm" + + ; Tools + ; prints the name of the words in a wordlist + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_SHOWWORDLIST: +0008b9 ff0d .dw $ff0d +0008ba 6873 +0008bb 776f +0008bc 772d +0008bd 726f +0008be 6c64 +0008bf 7369 +0008c0 0074 .db "show-wordlist",0 +0008c1 08b0 .dw VE_HEAD + .set VE_HEAD = VE_SHOWWORDLIST + XT_SHOWWORDLIST: +0008c2 011b .dw DO_COLON + PFA_SHOWWORDLIST: + .endif +0008c3 04ce .dw XT_DOLITERAL +0008c4 08c8 .dw XT_SHOWWORD +0008c5 055d .dw XT_SWAP +0008c6 10bd .dw XT_TRAVERSEWORDLIST +0008c7 04ae .dw XT_EXIT + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + XT_SHOWWORD: +0008c8 011b .dw DO_COLON + PFA_SHOWWORD: + .endif +0008c9 10d8 .dw XT_NAME2STRING +0008ca 0c06 .dw XT_ITYPE +0008cb 0c48 .dw XT_SPACE ; ( -- addr n) +0008cc 05e4 .dw XT_TRUE +0008cd 04ae .dw XT_EXIT + .include "words/words.asm" + + ; Tools + ; prints a list of all (visible) words in the dictionary + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + + + VE_WORDS: +0008ce ff05 .dw $ff05 +0008cf 6f77 +0008d0 6472 +0008d1 0073 .db "words",0 +0008d2 08b9 .dw VE_HEAD + .set VE_HEAD = VE_WORDS + XT_WORDS: +0008d3 011b .dw DO_COLON + PFA_WORDS: + .endif +0008d4 04ce .dw XT_DOLITERAL +0008d5 008a .dw CFG_ORDERLISTLEN+2 +0008d6 07f9 .dw XT_FETCHE +0008d7 08c2 .dw XT_SHOWWORDLIST +0008d8 04ae .dw XT_EXIT + .include "dict/interrupt.inc" + + .if WANT_INTERRUPTS == 1 + + .if WANT_INTERRUPT_COUNTERS == 1 + .endif + + .include "words/int-on.asm" + + ; Interrupt + ; turns on all interrupts + VE_INTON: +0008d9 ff04 .dw $ff04 +0008da 692b +0008db 746e .db "+int" +0008dc 08ce .dw VE_HEAD + .set VE_HEAD = VE_INTON + XT_INTON: +0008dd 08de .dw PFA_INTON + PFA_INTON: +0008de 9478 sei +0008df c83f jmp_ DO_NEXT + .include "words/int-off.asm" + + ; Interrupt + ; turns off all interrupts + VE_INTOFF: +0008e0 ff04 .dw $ff04 +0008e1 692d +0008e2 746e .db "-int" +0008e3 08d9 .dw VE_HEAD + .set VE_HEAD = VE_INTOFF + XT_INTOFF: +0008e4 08e5 .dw PFA_INTOFF + PFA_INTOFF: +0008e5 94f8 cli +0008e6 c838 jmp_ DO_NEXT + .include "words/int-store.asm" + + ; Interrupt + ; stores XT as interrupt vector i + VE_INTSTORE: +0008e7 ff04 .dw $ff04 +0008e8 6e69 +0008e9 2174 .db "int!" +0008ea 08e0 .dw VE_HEAD + .set VE_HEAD = VE_INTSTORE + XT_INTSTORE: +0008eb 011b .dw DO_COLON + PFA_INTSTORE: +0008ec 04ce .dw XT_DOLITERAL +0008ed 0000 .dw intvec +0008ee 0636 .dw XT_PLUS +0008ef 07d5 .dw XT_STOREE +0008f0 04ae .dw XT_EXIT + .include "words/int-fetch.asm" + + ; Interrupt + ; fetches XT from interrupt vector i + VE_INTFETCH: +0008f1 ff04 .dw $ff04 +0008f2 6e69 +0008f3 4074 .db "int@" +0008f4 08e7 .dw VE_HEAD + .set VE_HEAD = VE_INTFETCH + XT_INTFETCH: +0008f5 011b .dw DO_COLON + PFA_INTFETCH: +0008f6 04ce .dw XT_DOLITERAL +0008f7 0000 .dw intvec +0008f8 0636 .dw XT_PLUS +0008f9 07f9 .dw XT_FETCHE +0008fa 04ae .dw XT_EXIT + .include "words/int-trap.asm" + + ; Interrupt + ; trigger an interrupt + VE_INTTRAP: +0008fb ff08 .dw $ff08 +0008fc 6e69 +0008fd 2d74 +0008fe 7274 +0008ff 7061 .db "int-trap" +000900 08f1 .dw VE_HEAD + .set VE_HEAD = VE_INTTRAP + XT_INTTRAP: +000901 0902 .dw PFA_INTTRAP + PFA_INTTRAP: +000902 2eb8 mov isrflag, tosl +000903 9189 +000904 9199 loadtos +000905 c819 jmp_ DO_NEXT + + .include "words/isr-exec.asm" + + ; Interrupt + ; executes an interrupt service routine + ;VE_ISREXEC: + ; .dw $ff08 + ; .db "isr-exec" + ; .dw VE_HEAD + ; .set VE_HEAD = VE_ISREXEC + XT_ISREXEC: +000906 011b .dw DO_COLON + PFA_ISREXEC: +000907 08f5 .dw XT_INTFETCH +000908 04b8 .dw XT_EXECUTE +000909 090b .dw XT_ISREND +00090a 04ae .dw XT_EXIT + .include "words/isr-end.asm" + + ; Interrupt + ; re-enables interrupts in an ISR + ;VE_ISREND: + ; .dw $ff07 + ; .db "isr-end",0 + ; .dw VE_HEAD + ; .set VE_HEAD = VE_ISREND + XT_ISREND: +00090b 090c .dw PFA_ISREND + PFA_ISREND: +00090c d001 rcall PFA_ISREND1 ; clear the interrupt flag for the controller +00090d c811 jmp_ DO_NEXT + PFA_ISREND1: +00090e 9518 reti + .endif + + .include "words/pick.asm" + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_PICK: +00090f ff04 .dw $ff04 +000910 6970 +000911 6b63 .db "pick" +000912 08fb .dw VE_HEAD + .set VE_HEAD = VE_PICK + XT_PICK: +000913 011b .dw DO_COLON + PFA_PICK: + .endif +000914 06c8 .dw XT_1PLUS +000915 09bc .dw XT_CELLS +000916 0726 .dw XT_SP_FETCH +000917 0636 .dw XT_PLUS +000918 0512 .dw XT_FETCH +000919 04ae .dw XT_EXIT + .include "words/dot-quote.asm" + + ; Compiler + ; compiles string into dictionary to be printed at runtime + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + + + VE_DOTSTRING: +00091a 0002 .dw $0002 +00091b 222e .db ".",$22 +00091c 090f .dw VE_HEAD + .set VE_HEAD = VE_DOTSTRING + XT_DOTSTRING: +00091d 011b .dw DO_COLON + PFA_DOTSTRING: + .endif +00091e 0925 .dw XT_SQUOTE +00091f 01d1 .dw XT_COMPILE +000920 0c06 .dw XT_ITYPE +000921 04ae .dw XT_EXIT + .include "words/squote.asm" + + ; Compiler + ; compiles a string to flash, at runtime leaves ( -- flash-addr count) on stack + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_SQUOTE: +000922 0002 .dw $0002 +000923 2273 .db "s",$22 +000924 091a .dw VE_HEAD + .set VE_HEAD = VE_SQUOTE + XT_SQUOTE: +000925 011b .dw DO_COLON + PFA_SQUOTE: + .endif +000926 04ce .dw XT_DOLITERAL +000927 0022 .dw 34 ; 0x22 +000928 0ded .dw XT_PARSE ; ( -- addr n) +000929 09af .dw XT_STATE +00092a 0512 .dw XT_FETCH +00092b 04c7 .dw XT_DOCONDBRANCH +00092c 092e DEST(PFA_SQUOTE1) +00092d 01fd .dw XT_SLITERAL + PFA_SQUOTE1: +00092e 04ae .dw XT_EXIT + + .include "words/fill.asm" + + ; Memory + ; fill u bytes memory beginning at a-addr with character c + VE_FILL: +00092f ff04 .dw $ff04 +000930 6966 +000931 6c6c .db "fill" +000932 0922 .dw VE_HEAD + .set VE_HEAD = VE_FILL + XT_FILL: +000933 011b .dw DO_COLON + PFA_FILL: +000934 057a .dw XT_ROT +000935 057a .dw XT_ROT +000936 0552 +000937 04c7 .dw XT_QDUP,XT_DOCONDBRANCH +000938 0940 DEST(PFA_FILL2) +000939 124c .dw XT_BOUNDS +00093a 0734 .dw XT_DODO + PFA_FILL1: +00093b 054a .dw XT_DUP +00093c 0745 .dw XT_I +00093d 0526 .dw XT_CSTORE ; ( -- c c-addr) +00093e 0762 .dw XT_DOLOOP +00093f 093b .dw PFA_FILL1 + PFA_FILL2: +000940 0572 .dw XT_DROP +000941 04ae .dw XT_EXIT + + .include "words/environment.asm" + + ; System Value + ; word list identifier of the environmental search list + VE_ENVIRONMENT: +000942 ff0b .dw $ff0b +000943 6e65 +000944 6976 +000945 6f72 +000946 6d6e +000947 6e65 +000948 0074 .db "environment",0 +000949 092f .dw VE_HEAD + .set VE_HEAD = VE_ENVIRONMENT + XT_ENVIRONMENT: +00094a 04dc .dw PFA_DOVARIABLE + PFA_ENVIRONMENT: +00094b 0082 .dw CFG_ENVIRONMENT + .include "words/env-wordlists.asm" + + ; Environment + ; maximum number of wordlists in the dictionary search order + VE_ENVWORDLISTS: +00094c ff09 .dw $ff09 +00094d 6f77 +00094e 6472 +00094f 696c +000950 7473 +000951 0073 .db "wordlists",0 +000952 0000 .dw VE_ENVHEAD + .set VE_ENVHEAD = VE_ENVWORDLISTS + XT_ENVWORDLISTS: +000953 011b .dw DO_COLON + PFA_ENVWORDLISTS: +000954 04ce .dw XT_DOLITERAL +000955 0008 .dw NUMWORDLISTS +000956 04ae .dw XT_EXIT + .include "words/env-slashpad.asm" + + ; Environment + ; Size of the PAD buffer in bytes + VE_ENVSLASHPAD: +000957 ff04 .dw $ff04 +000958 702f +000959 6461 .db "/pad" +00095a 094c .dw VE_ENVHEAD + .set VE_ENVHEAD = VE_ENVSLASHPAD + XT_ENVSLASHPAD: +00095b 011b .dw DO_COLON + PFA_ENVSLASHPAD: +00095c 0726 .dw XT_SP_FETCH +00095d 09e9 .dw XT_PAD +00095e 062c .dw XT_MINUS +00095f 04ae .dw XT_EXIT + .include "words/env-slashhold.asm" + + ; Environment + ; size of the pictured numeric output buffer in bytes + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_ENVSLASHHOLD: +000960 ff05 .dw $ff05 +000961 682f +000962 6c6f +000963 0064 .db "/hold",0 +000964 0957 .dw VE_ENVHEAD + .set VE_ENVHEAD = VE_ENVSLASHHOLD + XT_ENVSLASHHOLD: +000965 011b .dw DO_COLON + PFA_ENVSLASHHOLD: + .endif +000966 09e9 .dw XT_PAD +000967 0a24 .dw XT_HERE +000968 062c .dw XT_MINUS +000969 04ae .dw XT_EXIT + .include "words/env-forthname.asm" + + ; Environment + ; flash address of the amforth name string + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_ENV_FORTHNAME: +00096a ff0a .dw $ff0a +00096b 6f66 +00096c 7472 +00096d 2d68 +00096e 616e +00096f 656d .db "forth-name" +000970 0960 .dw VE_ENVHEAD + .set VE_ENVHEAD = VE_ENV_FORTHNAME + XT_ENV_FORTHNAME: +000971 011b .dw DO_COLON + PFA_EN_FORTHNAME: +000972 0bd3 .dw XT_DOSLITERAL +000973 0007 .dw 7 + .endif +000974 6d61 +000975 6f66 +000976 7472 +../../common\words/env-forthname.asm(22): warning: .cseg .db misalignment - padding zero byte +000977 0068 .db "amforth" + .if cpu_msp430==1 + .endif +000978 04ae .dw XT_EXIT + .include "words/env-forthversion.asm" + + ; Environment + ; version number of amforth + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_ENV_FORTHVERSION: +000979 ff07 .dw $ff07 +00097a 6576 +00097b 7372 +00097c 6f69 +00097d 006e .db "version",0 +00097e 096a .dw VE_ENVHEAD + .set VE_ENVHEAD = VE_ENV_FORTHVERSION + XT_ENV_FORTHVERSION: +00097f 011b .dw DO_COLON + PFA_EN_FORTHVERSION: + .endif +000980 04ce .dw XT_DOLITERAL +000981 0041 .dw 65 +000982 04ae .dw XT_EXIT + .include "words/env-cpu.asm" + + ; Environment + ; flash address of the CPU identification string + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_ENV_CPU: +000983 ff03 .dw $ff03 +000984 7063 +000985 0075 .db "cpu",0 +000986 0979 .dw VE_ENVHEAD + .set VE_ENVHEAD = VE_ENV_CPU + XT_ENV_CPU: +000987 011b .dw DO_COLON + PFA_EN_CPU: + .endif +000988 04ce .dw XT_DOLITERAL +000989 0075 .dw mcu_name +00098a 0c32 .dw XT_ICOUNT +00098b 04ae .dw XT_EXIT + .include "words/env-mcuinfo.asm" + + ; Environment + ; flash address of some CPU specific parameters + VE_ENV_MCUINFO: +00098c ff08 .dw $ff08 +00098d 636d +00098e 2d75 +00098f 6e69 +000990 6f66 .db "mcu-info" +000991 0983 .dw VE_ENVHEAD + .set VE_ENVHEAD = VE_ENV_MCUINFO + XT_ENV_MCUINFO: +000992 011b .dw DO_COLON + PFA_EN_MCUINFO: +000993 04ce .dw XT_DOLITERAL +000994 0071 .dw mcu_info +000995 04ae .dw XT_EXIT + .include "words/env-usersize.asm" + + ; Environment + ; size of the USER area in bytes + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + + VE_ENVUSERSIZE: +000996 ff05 .dw $ff05 +000997 752f +000998 6573 +000999 0072 .db "/user",0 +00099a 098c .dw VE_ENVHEAD + .set VE_ENVHEAD = VE_ENVUSERSIZE + XT_ENVUSERSIZE: +00099b 011b .dw DO_COLON + PFA_ENVUSERSIZE: + .endif +00099c 04ce .dw XT_DOLITERAL +00099d 002c .dw SYSUSERSIZE + APPUSERSIZE +00099e 04ae .dw XT_EXIT + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + .include "words/f_cpu.asm" + + ; System + ; put the cpu frequency in Hz on stack + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_F_CPU: +00099f ff05 .dw $ff05 +0009a0 5f66 +0009a1 7063 +0009a2 0075 .db "f_cpu",0 +0009a3 0942 .dw VE_HEAD + .set VE_HEAD = VE_F_CPU + XT_F_CPU: +0009a4 011b .dw DO_COLON + PFA_F_CPU: + .endif +0009a5 04ce .dw XT_DOLITERAL +0009a6 0000 .dw (F_CPU % 65536) +0009a7 04ce .dw XT_DOLITERAL +0009a8 00e1 .dw (F_CPU / 65536) +0009a9 04ae .dw XT_EXIT + .include "words/state.asm" + + ; System Variable + ; system state + VE_STATE: +0009aa ff05 .dw $ff05 +0009ab 7473 +0009ac 7461 +0009ad 0065 .db "state",0 +0009ae 099f .dw VE_HEAD + .set VE_HEAD = VE_STATE + XT_STATE: +0009af 04dc .dw PFA_DOVARIABLE + PFA_STATE: +0009b0 0253 .dw ram_state + + .dseg +000253 ram_state: .byte 2 + .include "words/base.asm" + + ; Numeric IO + ; location of the cell containing the number conversion radix + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_BASE: +0009b1 ff04 .dw $ff04 +0009b2 6162 +0009b3 6573 .db "base" +0009b4 09aa .dw VE_HEAD + .set VE_HEAD = VE_BASE + XT_BASE: +0009b5 04ef .dw PFA_DOUSER + PFA_BASE: + .endif +0009b6 000c .dw USER_BASE + + .include "words/cells.asm" + + ; Arithmetics + ; n2 is the size in address units of n1 cells + VE_CELLS: +0009b7 ff05 .dw $ff05 +0009b8 6563 +0009b9 6c6c +0009ba 0073 .db "cells",0 +0009bb 09b1 .dw VE_HEAD + .set VE_HEAD = VE_CELLS + XT_CELLS: +0009bc 06a5 .dw PFA_2STAR + .include "words/cellplus.asm" + + ; Arithmetics + ; add the size of an address-unit to a-addr1 + VE_CELLPLUS: +0009bd ff05 .dw $ff05 +0009be 6563 +0009bf 6c6c +0009c0 002b .db "cell+",0 +0009c1 09b7 .dw VE_HEAD + .set VE_HEAD = VE_CELLPLUS + XT_CELLPLUS: +0009c2 09c3 .dw PFA_CELLPLUS + PFA_CELLPLUS: +0009c3 9602 adiw tosl, CELLSIZE +0009c4 940c 011f jmp_ DO_NEXT + + .include "words/2dup.asm" + + ; Stack + ; Duplicate the 2 top elements + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_2DUP: +0009c6 ff04 .dw $ff04 +0009c7 6432 +0009c8 7075 .db "2dup" +0009c9 09bd .dw VE_HEAD + .set VE_HEAD = VE_2DUP + XT_2DUP: +0009ca 011b .dw DO_COLON + PFA_2DUP: + .endif + +0009cb 0568 .dw XT_OVER +0009cc 0568 .dw XT_OVER +0009cd 04ae .dw XT_EXIT + .include "words/2drop.asm" + + ; Stack + ; Remove the 2 top elements + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_2DROP: +0009ce ff05 .dw $ff05 +0009cf 6432 +0009d0 6f72 +0009d1 0070 .db "2drop",0 +0009d2 09c6 .dw VE_HEAD + .set VE_HEAD = VE_2DROP + XT_2DROP: +0009d3 011b .dw DO_COLON + PFA_2DROP: + .endif +0009d4 0572 .dw XT_DROP +0009d5 0572 .dw XT_DROP +0009d6 04ae .dw XT_EXIT + + .include "words/tuck.asm" + + ; Stack + ; Copy the first (top) stack item below the second stack item. + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_TUCK: +0009d7 ff04 .dw $ff04 +0009d8 7574 +0009d9 6b63 .db "tuck" +0009da 09ce .dw VE_HEAD + .set VE_HEAD = VE_TUCK + XT_TUCK: +0009db 011b .dw DO_COLON + PFA_TUCK: + .endif +0009dc 055d .dw XT_SWAP +0009dd 0568 .dw XT_OVER +0009de 04ae .dw XT_EXIT + + .include "words/to-in.asm" + + ; System Variable + ; pointer to current read position in input buffer + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_TO_IN: +0009df ff03 .dw $ff03 +0009e0 693e +0009e1 006e .db ">in",0 +0009e2 09d7 .dw VE_HEAD + .set VE_HEAD = VE_TO_IN + XT_TO_IN: +0009e3 04ef .dw PFA_DOUSER + PFA_TO_IN: + .endif +0009e4 0018 .dw USER_TO_IN + .include "words/pad.asm" + + ; System Variable + ; Address of the temporary scratch buffer. + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_PAD: +0009e5 ff03 .dw $ff03 +0009e6 6170 +0009e7 0064 .db "pad",0 +0009e8 09df .dw VE_HEAD + .set VE_HEAD = VE_PAD + XT_PAD: +0009e9 011b .dw DO_COLON + PFA_PAD: + .endif +0009ea 0a24 .dw XT_HERE +0009eb 04ce .dw XT_DOLITERAL +0009ec 0028 .dw 40 +0009ed 0636 .dw XT_PLUS +0009ee 04ae .dw XT_EXIT + .include "words/emit.asm" + + ; Character IO + ; fetch the emit vector and execute it. should emit a character from TOS + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_EMIT: +0009ef ff04 .dw $ff04 +0009f0 6d65 +0009f1 7469 .db "emit" +0009f2 09e5 .dw VE_HEAD + .set VE_HEAD = VE_EMIT + XT_EMIT: +0009f3 1079 .dw PFA_DODEFER1 + PFA_EMIT: + .endif +0009f4 000e .dw USER_EMIT +0009f5 1042 .dw XT_UDEFERFETCH +0009f6 104e .dw XT_UDEFERSTORE + .include "words/emitq.asm" + + ; Character IO + ; fetch emit? vector and execute it. should return the ready-to-send condition + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_EMITQ: +0009f7 ff05 .dw $ff05 +0009f8 6d65 +0009f9 7469 +0009fa 003f .db "emit?",0 +0009fb 09ef .dw VE_HEAD + .set VE_HEAD = VE_EMITQ + XT_EMITQ: +0009fc 1079 .dw PFA_DODEFER1 + PFA_EMITQ: + .endif +0009fd 0010 .dw USER_EMITQ +0009fe 1042 .dw XT_UDEFERFETCH +0009ff 104e .dw XT_UDEFERSTORE + .include "words/key.asm" + + ; Character IO + ; fetch key vector and execute it, should leave a single character on TOS + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_KEY: +000a00 ff03 .dw $ff03 +000a01 656b +000a02 0079 .db "key",0 +000a03 09f7 .dw VE_HEAD + .set VE_HEAD = VE_KEY + XT_KEY: +000a04 1079 .dw PFA_DODEFER1 + PFA_KEY: + .endif +000a05 0012 .dw USER_KEY +000a06 1042 .dw XT_UDEFERFETCH +000a07 104e .dw XT_UDEFERSTORE + .include "words/keyq.asm" + + ; Character IO + ; fetch key? vector and execute it. should turn on key sender, if it is disabled/stopped + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_KEYQ: +000a08 ff04 .dw $ff04 +000a09 656b +000a0a 3f79 .db "key?" +000a0b 0a00 .dw VE_HEAD + .set VE_HEAD = VE_KEYQ + XT_KEYQ: +000a0c 1079 .dw PFA_DODEFER1 + PFA_KEYQ: + .endif +000a0d 0014 .dw USER_KEYQ +000a0e 1042 .dw XT_UDEFERFETCH +000a0f 104e .dw XT_UDEFERSTORE + + .include "words/dp.asm" + + ; System Value + ; address of the next free dictionary cell + VE_DP: +000a10 ff02 .dw $ff02 +000a11 7064 .db "dp" +000a12 0a08 .dw VE_HEAD + .set VE_HEAD = VE_DP + XT_DP: +000a13 0509 .dw PFA_DOVALUE1 + PFA_DP: +000a14 0074 .dw CFG_DP +000a15 101a .dw XT_EDEFERFETCH +000a16 1024 .dw XT_EDEFERSTORE + .include "words/ehere.asm" + + ; System Value + ; address of the next free address in eeprom + VE_EHERE: +000a17 ff05 .dw $ff05 +000a18 6865 +000a19 7265 +000a1a 0065 .db "ehere",0 +000a1b 0a10 .dw VE_HEAD + .set VE_HEAD = VE_EHERE + XT_EHERE: +000a1c 0509 .dw PFA_DOVALUE1 + PFA_EHERE: +000a1d 0078 .dw EE_EHERE +000a1e 101a .dw XT_EDEFERFETCH +000a1f 1024 .dw XT_EDEFERSTORE + .include "words/here.asm" + + ; System Value + ; address of the next free data space (RAM) cell + VE_HERE: +000a20 ff04 .dw $ff04 +000a21 6568 +000a22 6572 .db "here" +000a23 0a17 .dw VE_HEAD + .set VE_HEAD = VE_HERE + XT_HERE: +000a24 0509 .dw PFA_DOVALUE1 + PFA_HERE: +000a25 0076 .dw EE_HERE +000a26 101a .dw XT_EDEFERFETCH +000a27 1024 .dw XT_EDEFERSTORE + .include "words/allot.asm" + + ; System + ; allocate or release memory in RAM + VE_ALLOT: +000a28 ff05 .dw $ff05 +000a29 6c61 +000a2a 6f6c +000a2b 0074 .db "allot",0 +000a2c 0a20 .dw VE_HEAD + .set VE_HEAD = VE_ALLOT + XT_ALLOT: +000a2d 011b .dw DO_COLON + PFA_ALLOT: +000a2e 0a24 .dw XT_HERE +000a2f 0636 .dw XT_PLUS +000a30 0fff .dw XT_DOTO +000a31 0a25 .dw PFA_HERE +000a32 04ae .dw XT_EXIT + + .include "words/bin.asm" + + ; Numeric IO + ; set base for numeric conversion to 10 + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_BIN: +000a33 ff03 .dw $ff03 +000a34 6962 +000a35 006e .db "bin",0 +000a36 0a28 .dw VE_HEAD + .set VE_HEAD = VE_BIN + XT_BIN: +000a37 011b .dw DO_COLON + PFA_BIN: + .endif +000a38 1279 .dw XT_TWO +000a39 09b5 .dw XT_BASE +000a3a 051a .dw XT_STORE +000a3b 04ae .dw XT_EXIT + .include "words/decimal.asm" + + ; Numeric IO + ; set base for numeric conversion to 10 + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_DECIMAL: +000a3c ff07 .dw $ff07 +000a3d 6564 +000a3e 6963 +000a3f 616d +000a40 006c .db "decimal",0 +000a41 0a33 .dw VE_HEAD + .set VE_HEAD = VE_DECIMAL + XT_DECIMAL: +000a42 011b .dw DO_COLON + PFA_DECIMAL: + .endif +000a43 04ce .dw XT_DOLITERAL +000a44 000a .dw 10 +000a45 09b5 .dw XT_BASE +000a46 051a .dw XT_STORE +000a47 04ae .dw XT_EXIT + .include "words/hex.asm" + + ; Numeric IO + ; set base for numeric conversion to 10 + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_HEX: +000a48 ff03 .dw $ff03 +000a49 6568 +000a4a 0078 .db "hex",0 +000a4b 0a3c .dw VE_HEAD + .set VE_HEAD = VE_HEX + XT_HEX: +000a4c 011b .dw DO_COLON + PFA_HEX: + .endif +000a4d 04ce .dw XT_DOLITERAL +000a4e 0010 .dw 16 +000a4f 09b5 .dw XT_BASE +000a50 051a .dw XT_STORE +000a51 04ae .dw XT_EXIT + .include "words/bl.asm" + + ; Character IO + ; put ascii code of the blank to the stack + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_BL: +000a52 ff02 .dw $ff02 +000a53 6c62 .db "bl" +000a54 0a48 .dw VE_HEAD + .set VE_HEAD = VE_BL + XT_BL: +000a55 04dc .dw PFA_DOVARIABLE + PFA_BL: + .endif +000a56 0020 .dw 32 + + .include "words/turnkey.asm" + + ; System Value + ; Deferred action during startup/reset + VE_TURNKEY: +000a57 ff07 .dw $ff07 +000a58 7574 +000a59 6e72 +000a5a 656b +000a5b 0079 .db "turnkey",0 +000a5c 0a52 .dw VE_HEAD + .set VE_HEAD = VE_TURNKEY + XT_TURNKEY: +000a5d 1079 .dw PFA_DODEFER1 + PFA_TURNKEY: +000a5e 0080 .dw CFG_TURNKEY +000a5f 101a .dw XT_EDEFERFETCH +000a60 1024 .dw XT_EDEFERSTORE + ;;;;;;;;;;;;;;;;;;;;;;;;;;;; + .include "words/slashmod.asm" + + ; Arithmetics + ; signed division n1/n2 with remainder and quotient + VE_SLASHMOD: +000a61 ff04 .dw $ff04 +000a62 6d2f +000a63 646f .db "/mod" +000a64 0a57 .dw VE_HEAD + .set VE_HEAD = VE_SLASHMOD + XT_SLASHMOD: +000a65 0a66 .dw PFA_SLASHMOD + PFA_SLASHMOD: +000a66 019c movw temp2, tosl + +000a67 9109 ld temp0, Y+ +000a68 9119 ld temp1, Y+ + +000a69 2f41 mov temp6,temp1 ;move dividend High to sign register +000a6a 2743 eor temp6,temp3 ;xor divisor High with sign register +000a6b ff17 sbrs temp1,7 ;if MSB in dividend set +000a6c c004 rjmp PFA_SLASHMOD_1 +000a6d 9510 com temp1 ; change sign of dividend +000a6e 9500 com temp0 +000a6f 5f0f subi temp0,low(-1) +000a70 4f1f sbci temp1,high(-1) + PFA_SLASHMOD_1: +000a71 ff37 sbrs temp3,7 ;if MSB in divisor set +000a72 c004 rjmp PFA_SLASHMOD_2 +000a73 9530 com temp3 ; change sign of divisor +000a74 9520 com temp2 +000a75 5f2f subi temp2,low(-1) +000a76 4f3f sbci temp3,high(-1) +000a77 24ee PFA_SLASHMOD_2: clr temp4 ;clear remainder Low byte +000a78 18ff sub temp5,temp5;clear remainder High byte and carry +000a79 e151 ldi temp7,17 ;init loop counter + +000a7a 1f00 PFA_SLASHMOD_3: rol temp0 ;shift left dividend +000a7b 1f11 rol temp1 +000a7c 955a dec temp7 ;decrement counter +000a7d f439 brne PFA_SLASHMOD_5 ;if done +000a7e ff47 sbrs temp6,7 ; if MSB in sign register set +000a7f c004 rjmp PFA_SLASHMOD_4 +000a80 9510 com temp1 ; change sign of result +000a81 9500 com temp0 +000a82 5f0f subi temp0,low(-1) +000a83 4f1f sbci temp1,high(-1) +000a84 c00b PFA_SLASHMOD_4: rjmp PFA_SLASHMODmod_done ; return +000a85 1cee PFA_SLASHMOD_5: rol temp4 ;shift dividend into remainder +000a86 1cff rol temp5 +000a87 1ae2 sub temp4,temp2 ;remainder = remainder - divisor +000a88 0af3 sbc temp5,temp3 ; +000a89 f420 brcc PFA_SLASHMOD_6 ;if result negative +000a8a 0ee2 add temp4,temp2 ; restore remainder +000a8b 1ef3 adc temp5,temp3 +000a8c 9488 clc ; clear carry to be shifted into result +000a8d cfec rjmp PFA_SLASHMOD_3 ;else +000a8e 9408 PFA_SLASHMOD_6: sec ; set carry to be shifted into result +000a8f cfea rjmp PFA_SLASHMOD_3 + + PFA_SLASHMODmod_done: + ; put remainder on stack +000a90 92fa st -Y,temp5 +000a91 92ea st -Y,temp4 + + ; put quotient on stack +000a92 01c8 movw tosl, temp0 +000a93 940c 011f jmp_ DO_NEXT + .include "words/uslashmod.asm" + + ; Arithmetics + ; unsigned division with remainder + VE_USLASHMOD: +000a95 ff05 .dw $ff05 +000a96 2f75 +000a97 6f6d +000a98 0064 .db "u/mod",0 +000a99 0a61 .dw VE_HEAD + .set VE_HEAD = VE_USLASHMOD + XT_USLASHMOD: +000a9a 011b .dw DO_COLON + PFA_USLASHMOD: +000a9b 0598 .dw XT_TO_R +000a9c 05ed .dw XT_ZERO +000a9d 058f .dw XT_R_FROM +000a9e 065b .dw XT_UMSLASHMOD +000a9f 04ae .dw XT_EXIT + .include "words/negate.asm" + + ; Logic + ; 2-complement + VE_NEGATE: +000aa0 ff06 .dw $ff06 +000aa1 656e +000aa2 6167 +000aa3 6574 .db "negate" +000aa4 0a95 .dw VE_HEAD + .set VE_HEAD = VE_NEGATE + XT_NEGATE: +000aa5 011b .dw DO_COLON + PFA_NEGATE: +000aa6 0696 .dw XT_INVERT +000aa7 06c8 .dw XT_1PLUS +000aa8 04ae .dw XT_EXIT + .include "words/slash.asm" + + ; Arithmetics + ; divide n1 by n2. giving the quotient + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + + + VE_SLASH: +000aa9 ff01 .dw $ff01 +000aaa 002f .db "/",0 +000aab 0aa0 .dw VE_HEAD + .set VE_HEAD = VE_SLASH + XT_SLASH: +000aac 011b .dw DO_COLON + PFA_SLASH: + .endif +000aad 0a65 .dw XT_SLASHMOD +000aae 0589 .dw XT_NIP +000aaf 04ae .dw XT_EXIT + + .include "words/mod.asm" + + ; Arithmetics + ; divide n1 by n2 giving the remainder n3 + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + + + VE_MOD: +000ab0 ff03 .dw $ff03 +000ab1 6f6d +000ab2 0064 .db "mod",0 +000ab3 0aa9 .dw VE_HEAD + .set VE_HEAD = VE_MOD + XT_MOD: +000ab4 011b .dw DO_COLON + PFA_MOD: + .endif +000ab5 0a65 .dw XT_SLASHMOD +000ab6 0572 .dw XT_DROP +000ab7 04ae .dw XT_EXIT + .include "words/abs.asm" + + ; DUP ?NEGATE ; + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_ABS: +000ab8 ff03 .dw $ff03 +000ab9 6261 +000aba 0073 .db "abs",0 +000abb 0ab0 .dw VE_HEAD + .set VE_HEAD = VE_ABS + XT_ABS: +000abc 011b .dw DO_COLON + PFA_ABS: + + .endif + +000abd 054a +000abe 06d7 +000abf 04ae .DW XT_DUP,XT_QNEGATE,XT_EXIT + .include "words/min.asm" + + ; Compare + ; compare two values leave the smaller one + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + + + VE_MIN: +000ac0 ff03 .dw $ff03 +000ac1 696d +000ac2 006e .db "min",0 +000ac3 0ab8 .dw VE_HEAD + .set VE_HEAD = VE_MIN + XT_MIN: +000ac4 011b .dw DO_COLON + PFA_MIN: + .endif +000ac5 09ca .dw XT_2DUP +000ac6 0611 .dw XT_GREATER +000ac7 04c7 .dw XT_DOCONDBRANCH +000ac8 0aca DEST(PFA_MIN1) +000ac9 055d .dw XT_SWAP + PFA_MIN1: +000aca 0572 .dw XT_DROP +000acb 04ae .dw XT_EXIT + .include "words/max.asm" + + ; Compare + ; compare two values, leave the bigger one + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_MAX: +000acc ff03 .dw $ff03 +000acd 616d +000ace 0078 .db "max",0 +000acf 0ac0 .dw VE_HEAD + .set VE_HEAD = VE_MAX + XT_MAX: +000ad0 011b .dw DO_COLON + PFA_MAX: + + .endif +000ad1 09ca .dw XT_2DUP +000ad2 0607 .dw XT_LESS +000ad3 04c7 .dw XT_DOCONDBRANCH +000ad4 0ad6 DEST(PFA_MAX1) +000ad5 055d .dw XT_SWAP + PFA_MAX1: +000ad6 0572 .dw XT_DROP +000ad7 04ae .dw XT_EXIT + .include "words/within.asm" + + ; Compare + ; check if n is within min..max + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_WITHIN: +000ad8 ff06 .dw $ff06 +000ad9 6977 +000ada 6874 +000adb 6e69 .db "within" +000adc 0acc .dw VE_HEAD + .set VE_HEAD = VE_WITHIN + XT_WITHIN: +000add 011b .dw DO_COLON + PFA_WITHIN: + .endif +000ade 0568 .dw XT_OVER +000adf 062c .dw XT_MINUS +000ae0 0598 .dw XT_TO_R +000ae1 062c .dw XT_MINUS +000ae2 058f .dw XT_R_FROM +000ae3 05f5 .dw XT_ULESS +000ae4 04ae .dw XT_EXIT + + .include "words/to-upper.asm" + + ; String + ; if c is a lowercase letter convert it to uppercase + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_TOUPPER: +000ae5 ff07 .dw $ff07 +000ae6 6f74 +000ae7 7075 +000ae8 6570 +000ae9 0072 .db "toupper",0 +000aea 0ad8 .dw VE_HEAD + .set VE_HEAD = VE_TOUPPER + XT_TOUPPER: +000aeb 011b .dw DO_COLON + PFA_TOUPPER: + .endif +000aec 054a .dw XT_DUP +000aed 04ce .dw XT_DOLITERAL +000aee 0061 .dw 'a' +000aef 04ce .dw XT_DOLITERAL +000af0 007b .dw 'z'+1 +000af1 0add .dw XT_WITHIN +000af2 04c7 .dw XT_DOCONDBRANCH +000af3 0af7 DEST(PFA_TOUPPER0) +000af4 04ce .dw XT_DOLITERAL +000af5 00df .dw 223 ; inverse of 0x20: 0xdf +000af6 06ac .dw XT_AND + PFA_TOUPPER0: +000af7 04ae .dw XT_EXIT + .include "words/to-lower.asm" + + ; String + ; if C is an uppercase letter convert it to lowercase + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + + + VE_TOLOWER: +000af8 ff07 .dw $ff07 +000af9 6f74 +000afa 6f6c +000afb 6577 +000afc 0072 .db "tolower",0 +000afd 0ae5 .dw VE_HEAD + .set VE_HEAD = VE_TOLOWER + XT_TOLOWER: +000afe 011b .dw DO_COLON + PFA_TOLOWER: + .endif +000aff 054a .dw XT_DUP +000b00 04ce .dw XT_DOLITERAL +000b01 0041 .dw 'A' +000b02 04ce .dw XT_DOLITERAL +000b03 005b .dw 'Z'+1 +000b04 0add .dw XT_WITHIN +000b05 04c7 .dw XT_DOCONDBRANCH +000b06 0b0a DEST(PFA_TOLOWER0) +000b07 04ce .dw XT_DOLITERAL +000b08 0020 .dw 32 +000b09 06b5 .dw XT_OR + PFA_TOLOWER0: +000b0a 04ae .dw XT_EXIT + ;;;;;;;;;;;;;;;;;;;;;; + .include "words/hld.asm" + + ; Numeric IO + ; pointer to current write position in the Pictured Numeric Output buffer + VE_HLD: +000b0b ff03 .dw $ff03 +000b0c 6c68 +000b0d 0064 .db "hld",0 +000b0e 0af8 .dw VE_HEAD + .set VE_HEAD = VE_HLD + XT_HLD: +000b0f 04dc .dw PFA_DOVARIABLE + PFA_HLD: +000b10 0255 .dw ram_hld + + .dseg +000255 ram_hld: .byte 2 + .cseg + .include "words/hold.asm" + + ; Numeric IO + ; prepend character to pictured numeric output buffer + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_HOLD: +000b11 ff04 .dw $ff04 +000b12 6f68 +000b13 646c .db "hold" +000b14 0b0b .dw VE_HEAD + .set VE_HEAD = VE_HOLD + XT_HOLD: +000b15 011b .dw DO_COLON + PFA_HOLD: + .endif +000b16 0b0f .dw XT_HLD +000b17 054a .dw XT_DUP +000b18 0512 .dw XT_FETCH +000b19 06ce .dw XT_1MINUS +000b1a 054a .dw XT_DUP +000b1b 0598 .dw XT_TO_R +000b1c 055d .dw XT_SWAP +000b1d 051a .dw XT_STORE +000b1e 058f .dw XT_R_FROM +000b1f 0526 .dw XT_CSTORE +000b20 04ae .dw XT_EXIT + .include "words/less-sharp.asm" ; <# + + ; Numeric IO + ; initialize the pictured numeric output conversion process + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_L_SHARP: +000b21 ff02 .dw $ff02 +000b22 233c .db "<#" +000b23 0b11 .dw VE_HEAD + .set VE_HEAD = VE_L_SHARP + XT_L_SHARP: +000b24 011b .dw DO_COLON + PFA_L_SHARP: + .endif +000b25 09e9 .dw XT_PAD +000b26 0b0f .dw XT_HLD +000b27 051a .dw XT_STORE +000b28 04ae .dw XT_EXIT + .include "words/sharp.asm" + + ; Numeric IO + ; pictured numeric output: convert one digit + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + + + VE_SHARP: +000b29 ff01 .dw $ff01 +000b2a 0023 .db "#",0 +000b2b 0b21 .dw VE_HEAD + .set VE_HEAD = VE_SHARP + XT_SHARP: +000b2c 011b .dw DO_COLON + PFA_SHARP: + .endif +000b2d 09b5 .dw XT_BASE +000b2e 0512 .dw XT_FETCH +000b2f 0ba9 .dw XT_UDSLASHMOD +000b30 057a .dw XT_ROT +000b31 04ce .dw XT_DOLITERAL +000b32 0009 .dw 9 +000b33 0568 .dw XT_OVER +000b34 0607 .dw XT_LESS +000b35 04c7 .dw XT_DOCONDBRANCH +000b36 0b3a DEST(PFA_SHARP1) +000b37 04ce .dw XT_DOLITERAL +000b38 0007 .dw 7 +000b39 0636 .dw XT_PLUS + PFA_SHARP1: +000b3a 04ce .dw XT_DOLITERAL +000b3b 0030 .dw 48 ; ASCII 0 +000b3c 0636 .dw XT_PLUS +000b3d 0b15 .dw XT_HOLD +000b3e 04ae .dw XT_EXIT + ; : # ( ud1 -- ud2 ) + ; base @ ud/mod rot 9 over < if 7 + then 30 + hold ; + .include "words/sharp-s.asm" + + ; Numeric IO + ; pictured numeric output: convert all digits until 0 (zero) is reached + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_SHARP_S: +000b3f ff02 .dw $ff02 +000b40 7323 .db "#s" +000b41 0b29 .dw VE_HEAD + .set VE_HEAD = VE_SHARP_S + XT_SHARP_S: +000b42 011b .dw DO_COLON + PFA_SHARP_S: + .endif + NUMS1: +000b43 0b2c .dw XT_SHARP +000b44 09ca .dw XT_2DUP +000b45 06b5 .dw XT_OR +000b46 05b3 .dw XT_ZEROEQUAL +000b47 04c7 .dw XT_DOCONDBRANCH +000b48 0b43 DEST(NUMS1) ; PFA_SHARP_S +000b49 04ae .dw XT_EXIT + .include "words/sharp-greater.asm" ; #> + + ; Numeric IO + ; Pictured Numeric Output: convert PNO buffer into an string + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_SHARP_G: +000b4a ff02 .dw $ff02 +000b4b 3e23 .db "#>" +000b4c 0b3f .dw VE_HEAD + .set VE_HEAD = VE_SHARP_G + XT_SHARP_G: +000b4d 011b .dw DO_COLON + PFA_SHARP_G: + .endif +000b4e 09d3 .dw XT_2DROP +000b4f 0b0f .dw XT_HLD +000b50 0512 .dw XT_FETCH +000b51 09e9 .dw XT_PAD +000b52 0568 .dw XT_OVER +000b53 062c .dw XT_MINUS +000b54 04ae .dw XT_EXIT + .include "words/sign.asm" + + ; Numeric IO + ; place a - in HLD if n is negative + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_SIGN: +000b55 ff04 .dw $ff04 +000b56 6973 +000b57 6e67 .db "sign" +000b58 0b4a .dw VE_HEAD + .set VE_HEAD = VE_SIGN + XT_SIGN: +000b59 011b .dw DO_COLON + PFA_SIGN: + .endif +000b5a 05ba .dw XT_ZEROLESS +000b5b 04c7 .dw XT_DOCONDBRANCH +000b5c 0b60 DEST(PFA_SIGN1) +000b5d 04ce .dw XT_DOLITERAL +000b5e 002d .dw 45 ; ascii - +000b5f 0b15 .dw XT_HOLD + PFA_SIGN1: +000b60 04ae .dw XT_EXIT + .include "words/d-dot-r.asm" + + ; Numeric IO + ; singed PNO with double cell numbers, right aligned in width w + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_DDOTR: +000b61 ff03 .dw $ff03 +000b62 2e64 +000b63 0072 .db "d.r",0 +000b64 0b55 .dw VE_HEAD + .set VE_HEAD = VE_DDOTR + XT_DDOTR: +000b65 011b .dw DO_COLON + PFA_DDOTR: + + .endif +000b66 0598 .dw XT_TO_R +000b67 09db .dw XT_TUCK +000b68 113a .dw XT_DABS +000b69 0b24 .dw XT_L_SHARP +000b6a 0b42 .dw XT_SHARP_S +000b6b 057a .dw XT_ROT +000b6c 0b59 .dw XT_SIGN +000b6d 0b4d .dw XT_SHARP_G +000b6e 058f .dw XT_R_FROM +000b6f 0568 .dw XT_OVER +000b70 062c .dw XT_MINUS +000b71 0c51 .dw XT_SPACES +000b72 0c61 .dw XT_TYPE +000b73 04ae .dw XT_EXIT + ; : d.r ( d n -- ) + ; >r swap over dabs <# #s rot sign #> r> over - spaces type ; + .include "words/dot-r.asm" + + ; Numeric IO + ; singed PNO with single cell numbers, right aligned in width w + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_DOTR: +000b74 ff02 .dw $ff02 +000b75 722e .db ".r" +000b76 0b61 .dw VE_HEAD + .set VE_HEAD = VE_DOTR + XT_DOTR: +000b77 011b .dw DO_COLON + PFA_DOTR: + + .endif +000b78 0598 .dw XT_TO_R +000b79 1255 .dw XT_S2D +000b7a 058f .dw XT_R_FROM +000b7b 0b65 .dw XT_DDOTR +000b7c 04ae .dw XT_EXIT + ; : .r ( s n -- ) >r s>d r> d.r ; + .include "words/d-dot.asm" + + ; Numeric IO + ; singed PNO with double cell numbers + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_DDOT: +000b7d ff02 .dw $ff02 +000b7e 2e64 .db "d." +000b7f 0b74 .dw VE_HEAD + .set VE_HEAD = VE_DDOT + XT_DDOT: +000b80 011b .dw DO_COLON + PFA_DDOT: + + .endif +000b81 05ed .dw XT_ZERO +000b82 0b65 .dw XT_DDOTR +000b83 0c48 .dw XT_SPACE +000b84 04ae .dw XT_EXIT + ; : d. ( d -- ) 0 d.r space ; + .include "words/dot.asm" + + ; Numeric IO + ; singed PNO with single cell numbers + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + + + VE_DOT: +000b85 ff01 .dw $ff01 +000b86 002e .db ".",0 +000b87 0b7d .dw VE_HEAD + .set VE_HEAD = VE_DOT + XT_DOT: +000b88 011b .dw DO_COLON + PFA_DOT: + .endif +000b89 1255 .dw XT_S2D +000b8a 0b80 .dw XT_DDOT +000b8b 04ae .dw XT_EXIT + ; : . ( s -- ) s>d d. ; + .include "words/ud-dot.asm" + + ; Numeric IO + ; unsigned PNO with double cell numbers + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_UDDOT: +000b8c ff03 .dw $ff03 +000b8d 6475 +000b8e 002e .db "ud.",0 +000b8f 0b85 .dw VE_HEAD + .set VE_HEAD = VE_UDDOT + XT_UDDOT: +000b90 011b .dw DO_COLON + PFA_UDDOT: + .endif +000b91 05ed .dw XT_ZERO +000b92 0b99 .dw XT_UDDOTR +000b93 0c48 .dw XT_SPACE +000b94 04ae .dw XT_EXIT + .include "words/ud-dot-r.asm" + + ; Numeric IO + ; unsigned PNO with double cell numbers, right aligned in width w + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + + + VE_UDDOTR: +000b95 ff04 .dw $ff04 +000b96 6475 +000b97 722e .db "ud.r" +000b98 0b8c .dw VE_HEAD + .set VE_HEAD = VE_UDDOTR + XT_UDDOTR: +000b99 011b .dw DO_COLON + PFA_UDDOTR: + .endif +000b9a 0598 .dw XT_TO_R +000b9b 0b24 .dw XT_L_SHARP +000b9c 0b42 .dw XT_SHARP_S +000b9d 0b4d .dw XT_SHARP_G +000b9e 058f .dw XT_R_FROM +000b9f 0568 .dw XT_OVER +000ba0 062c .dw XT_MINUS +000ba1 0c51 .dw XT_SPACES +000ba2 0c61 .dw XT_TYPE +000ba3 04ae .dw XT_EXIT + .include "words/ud-slash-mod.asm" + + ; Arithmetics + ; unsigned double cell division with remainder + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_UDSLASHMOD: +000ba4 ff06 .dw $ff06 +000ba5 6475 +000ba6 6d2f +000ba7 646f .db "ud/mod" +000ba8 0b95 .dw VE_HEAD + .set VE_HEAD = VE_UDSLASHMOD + XT_UDSLASHMOD: +000ba9 011b .dw DO_COLON + PFA_UDSLASHMOD: + .endif +000baa 0598 .dw XT_TO_R +000bab 05ed .dw XT_ZERO +000bac 05a1 .dw XT_R_FETCH +000bad 065b .dw XT_UMSLASHMOD +000bae 058f .dw XT_R_FROM +000baf 055d .dw XT_SWAP +000bb0 0598 .dw XT_TO_R +000bb1 065b .dw XT_UMSLASHMOD +000bb2 058f .dw XT_R_FROM +000bb3 04ae .dw XT_EXIT + .include "words/digit-q.asm" + + ; Numeric IO + ; tries to convert a character to a number, set flag accordingly + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_DIGITQ: +000bb4 ff06 .dw $ff06 +000bb5 6964 +000bb6 6967 +000bb7 3f74 .db "digit?" +000bb8 0ba4 .dw VE_HEAD + .set VE_HEAD = VE_DIGITQ + XT_DIGITQ: +000bb9 011b .dw DO_COLON + PFA_DIGITQ: + .endif +000bba 0aeb .dw XT_TOUPPER +000bbb 054a +000bbc 04ce +000bbd 0039 +000bbe 0611 +000bbf 04ce +000bc0 0100 .DW XT_DUP,XT_DOLITERAL,57,XT_GREATER,XT_DOLITERAL,256 +000bc1 06ac +000bc2 0636 +000bc3 054a +000bc4 04ce +000bc5 0140 +000bc6 0611 .DW XT_AND,XT_PLUS,XT_DUP,XT_DOLITERAL,320,XT_GREATER +000bc7 04ce +000bc8 0107 +000bc9 06ac +000bca 062c +000bcb 04ce +000bcc 0030 .DW XT_DOLITERAL,263,XT_AND,XT_MINUS,XT_DOLITERAL,48 +000bcd 062c +000bce 054a +000bcf 09b5 +000bd0 0512 +000bd1 05f5 .DW XT_MINUS,XT_DUP,XT_BASE,XT_FETCH,XT_ULESS +000bd2 04ae .DW XT_EXIT + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + .include "words/do-sliteral.asm" + + ; String + ; runtime portion of sliteral + ;VE_DOSLITERAL: + ; .dw $ff0a + ; .db "(sliteral)" + ; .dw VE_HEAD + ; .set VE_HEAD = VE_DOSLITERAL + XT_DOSLITERAL: +000bd3 011b .dw DO_COLON + PFA_DOSLITERAL: +000bd4 05a1 .dw XT_R_FETCH ; ( -- addr ) +000bd5 0c32 .dw XT_ICOUNT +000bd6 058f .dw XT_R_FROM +000bd7 0568 .dw XT_OVER ; ( -- addr' n addr n) +000bd8 06c8 .dw XT_1PLUS +000bd9 069d .dw XT_2SLASH ; ( -- addr' n addr k ) +000bda 0636 .dw XT_PLUS ; ( -- addr' n addr'' ) +000bdb 06c8 .dw XT_1PLUS +000bdc 0598 .dw XT_TO_R ; ( -- ) +000bdd 04ae .dw XT_EXIT + .include "words/scomma.asm" + + ; Compiler + ; compiles a string from RAM to Flash + VE_SCOMMA: +000bde ff02 .dw $ff02 +000bdf 2c73 .db "s",$2c +000be0 0bb4 .dw VE_HEAD + .set VE_HEAD = VE_SCOMMA + XT_SCOMMA: +000be1 011b .dw DO_COLON + PFA_SCOMMA: +000be2 054a .dw XT_DUP +000be3 0be5 .dw XT_DOSCOMMA +000be4 04ae .dw XT_EXIT + + ; ( addr len len' -- ) + ; Compiler + ; compiles a string from RAM to Flash + ;VE_DOSCOMMA: + ; .dw $ff04 + ; .db "(s",$2c,")" + ; .dw VE_HEAD + ; .set VE_HEAD = VE_DOSCOMMA + XT_DOSCOMMA: +000be5 011b .dw DO_COLON + PFA_DOSCOMMA: +000be6 01dc .dw XT_COMMA +000be7 054a .dw XT_DUP ; ( --addr len len) +000be8 069d .dw XT_2SLASH ; ( -- addr len len/2 +000be9 09db .dw XT_TUCK ; ( -- addr len/2 len len/2 +000bea 06a4 .dw XT_2STAR ; ( -- addr len/2 len len' +000beb 062c .dw XT_MINUS ; ( -- addr len/2 rem +000bec 0598 .dw XT_TO_R +000bed 05ed .dw XT_ZERO +000bee 029b .dw XT_QDOCHECK +000bef 04c7 .dw XT_DOCONDBRANCH +000bf0 0bf8 .dw PFA_SCOMMA2 +000bf1 0734 .dw XT_DODO + PFA_SCOMMA1: +000bf2 054a .dw XT_DUP ; ( -- addr addr ) +000bf3 0512 .dw XT_FETCH ; ( -- addr c1c2 ) +000bf4 01dc .dw XT_COMMA ; ( -- addr ) +000bf5 09c2 .dw XT_CELLPLUS ; ( -- addr+cell ) +000bf6 0762 .dw XT_DOLOOP +000bf7 0bf2 .dw PFA_SCOMMA1 + PFA_SCOMMA2: +000bf8 058f .dw XT_R_FROM +000bf9 05c1 .dw XT_GREATERZERO +000bfa 04c7 .dw XT_DOCONDBRANCH +000bfb 0bff .dw PFA_SCOMMA3 +000bfc 054a .dw XT_DUP ; well, tricky +000bfd 0531 .dw XT_CFETCH +000bfe 01dc .dw XT_COMMA + PFA_SCOMMA3: +000bff 0572 .dw XT_DROP ; ( -- ) +000c00 04ae .dw XT_EXIT + .include "words/itype.asm" + + ; Tools + ; reads string from flash and prints it + VE_ITYPE: +000c01 ff05 .dw $ff05 +000c02 7469 +000c03 7079 +000c04 0065 .db "itype",0 +000c05 0bde .dw VE_HEAD + .set VE_HEAD = VE_ITYPE + XT_ITYPE: +000c06 011b .dw DO_COLON + PFA_ITYPE: +000c07 054a .dw XT_DUP ; ( --addr len len) +000c08 069d .dw XT_2SLASH ; ( -- addr len len/2 +000c09 09db .dw XT_TUCK ; ( -- addr len/2 len len/2 +000c0a 06a4 .dw XT_2STAR ; ( -- addr len/2 len len' +000c0b 062c .dw XT_MINUS ; ( -- addr len/2 rem +000c0c 0598 .dw XT_TO_R +000c0d 05ed .dw XT_ZERO +000c0e 029b .dw XT_QDOCHECK +000c0f 04c7 .dw XT_DOCONDBRANCH +000c10 0c1a .dw PFA_ITYPE2 +000c11 0734 .dw XT_DODO + PFA_ITYPE1: +000c12 054a .dw XT_DUP ; ( -- addr addr ) +000c13 082c .dw XT_FETCHI ; ( -- addr c1c2 ) +000c14 054a .dw XT_DUP +000c15 0c27 .dw XT_LOWEMIT +000c16 0c23 .dw XT_HIEMIT +000c17 06c8 .dw XT_1PLUS ; ( -- addr+cell ) +000c18 0762 .dw XT_DOLOOP +000c19 0c12 .dw PFA_ITYPE1 + PFA_ITYPE2: +000c1a 058f .dw XT_R_FROM +000c1b 05c1 .dw XT_GREATERZERO +000c1c 04c7 .dw XT_DOCONDBRANCH +000c1d 0c21 .dw PFA_ITYPE3 +000c1e 054a .dw XT_DUP ; make sure the drop below has always something to do +000c1f 082c .dw XT_FETCHI +000c20 0c27 .dw XT_LOWEMIT + PFA_ITYPE3: +000c21 0572 .dw XT_DROP +000c22 04ae .dw XT_EXIT + + ; ( w -- ) + ; R( -- ) + ; content of cell fetched on stack. + ;VE_HIEMIT: + ; .dw $ff06 + ; .db "hiemit" + ; .dw VE_HEAD + ; .set VE_HEAD = VE_HIEMIT + XT_HIEMIT: +000c23 011b .dw DO_COLON + PFA_HIEMIT: +000c24 0792 .dw XT_BYTESWAP +000c25 0c27 .dw XT_LOWEMIT +000c26 04ae .dw XT_EXIT + + ; ( w -- ) + ; R( -- ) + ; content of cell fetched on stack. + ;VE_LOWEMIT: + ; .dw $ff07 + ; .db "lowemit" + ; .dw VE_HEAD + ; .set VE_HEAD = VE_LOWEMIT + XT_LOWEMIT: +000c27 011b .dw DO_COLON + PFA_LOWEMIT: +000c28 04ce .dw XT_DOLITERAL +000c29 00ff .dw $00ff +000c2a 06ac .dw XT_AND +000c2b 09f3 .dw XT_EMIT +000c2c 04ae .dw XT_EXIT + .include "words/icount.asm" + + ; Tools + ; get count information out of a counted string in flash + VE_ICOUNT: +000c2d ff06 .dw $ff06 +000c2e 6369 +000c2f 756f +000c30 746e .db "icount" +000c31 0c01 .dw VE_HEAD + .set VE_HEAD = VE_ICOUNT + XT_ICOUNT: +000c32 011b .dw DO_COLON + PFA_ICOUNT: +000c33 054a .dw XT_DUP +000c34 06c8 .dw XT_1PLUS +000c35 055d .dw XT_SWAP +000c36 082c .dw XT_FETCHI +000c37 04ae .dw XT_EXIT + .include "words/cr.asm" + + ; Character IO + ; cause subsequent output appear at the beginning of the next line + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_CR: +000c38 ff02 .dw 0xff02 +000c39 7263 .db "cr" +000c3a 0c2d .dw VE_HEAD + .set VE_HEAD = VE_CR + XT_CR: +000c3b 011b .dw DO_COLON + PFA_CR: + .endif + +000c3c 04ce .dw XT_DOLITERAL +000c3d 000d .dw 13 +000c3e 09f3 .dw XT_EMIT +000c3f 04ce .dw XT_DOLITERAL +000c40 000a .dw 10 +000c41 09f3 .dw XT_EMIT +000c42 04ae .dw XT_EXIT + .include "words/space.asm" + + ; Character IO + ; emits a space (bl) + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_SPACE: +000c43 ff05 .dw $ff05 +000c44 7073 +000c45 6361 +000c46 0065 .db "space",0 +000c47 0c38 .dw VE_HEAD + .set VE_HEAD = VE_SPACE + XT_SPACE: +000c48 011b .dw DO_COLON + PFA_SPACE: + .endif +000c49 0a55 .dw XT_BL +000c4a 09f3 .dw XT_EMIT +000c4b 04ae .dw XT_EXIT + .include "words/spaces.asm" + + ; Character IO + ; emits n space(s) (bl) + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_SPACES: +000c4c ff06 .dw $ff06 +000c4d 7073 +000c4e 6361 +000c4f 7365 .db "spaces" +000c50 0c43 .dw VE_HEAD + .set VE_HEAD = VE_SPACES + XT_SPACES: +000c51 011b .dw DO_COLON + PFA_SPACES: + + .endif + ;C SPACES n -- output n spaces + ; BEGIN DUP 0> WHILE SPACE 1- REPEAT DROP ; +000c52 05ed +000c53 0ad0 .DW XT_ZERO, XT_MAX +000c54 054a +000c55 04c7 SPCS1: .DW XT_DUP,XT_DOCONDBRANCH +000c56 0c5b DEST(SPCS2) +000c57 0c48 +000c58 06ce +000c59 04bd .DW XT_SPACE,XT_1MINUS,XT_DOBRANCH +000c5a 0c54 DEST(SPCS1) +000c5b 0572 +000c5c 04ae SPCS2: .DW XT_DROP,XT_EXIT + .include "words/type.asm" + + ; Character IO + ; print a RAM based string + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_TYPE: +000c5d ff04 .dw $ff04 +000c5e 7974 +000c5f 6570 .db "type" +000c60 0c4c .dw VE_HEAD + .set VE_HEAD = VE_TYPE + XT_TYPE: +000c61 011b .dw DO_COLON + PFA_TYPE: + + .endif +000c62 124c .dw XT_BOUNDS +000c63 029b .dw XT_QDOCHECK +000c64 04c7 .dw XT_DOCONDBRANCH +000c65 0c6c DEST(PFA_TYPE2) +000c66 0734 .dw XT_DODO + PFA_TYPE1: +000c67 0745 .dw XT_I +000c68 0531 .dw XT_CFETCH +000c69 09f3 .dw XT_EMIT +000c6a 0762 .dw XT_DOLOOP +000c6b 0c67 DEST(PFA_TYPE1) + PFA_TYPE2: +000c6c 04ae .dw XT_EXIT + .include "words/tick.asm" + + ; Dictionary + ; search dictionary for name, return XT or throw an exception -13 + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_TICK: +000c6d ff01 .dw $ff01 +000c6e 0027 .db "'",0 +000c6f 0c5d .dw VE_HEAD + .set VE_HEAD = VE_TICK + XT_TICK: +000c70 011b .dw DO_COLON + PFA_TICK: + .endif +000c71 0e1a .dw XT_PARSENAME +000c72 0f32 .dw XT_FORTHRECOGNIZER +000c73 0f3d .dw XT_RECOGNIZE + ; a word is tickable unless DT:TOKEN is DT:NULL or + ; the interpret action is a NOOP +000c74 054a .dw XT_DUP +000c75 0fb0 .dw XT_DT_NULL +000c76 126d .dw XT_EQUAL +000c77 055d .dw XT_SWAP +000c78 082c .dw XT_FETCHI +000c79 04ce .dw XT_DOLITERAL +000c7a 0fe5 .dw XT_NOOP +000c7b 126d .dw XT_EQUAL +000c7c 06b5 .dw XT_OR +000c7d 04c7 .dw XT_DOCONDBRANCH +000c7e 0c82 DEST(PFA_TICK1) +000c7f 04ce .dw XT_DOLITERAL +000c80 fff3 .dw -13 +000c81 0ca7 .dw XT_THROW + PFA_TICK1: +000c82 0572 .dw XT_DROP +000c83 04ae .dw XT_EXIT + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + .include "words/handler.asm" + + ; Exceptions + ; USER variable used by catch/throw + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_HANDLER: +000c84 ff07 .dw $ff07 +000c85 6168 +000c86 646e +000c87 656c +000c88 0072 .db "handler",0 +000c89 0c6d .dw VE_HEAD + .set VE_HEAD = VE_HANDLER + XT_HANDLER: +000c8a 04ef .dw PFA_DOUSER + PFA_HANDLER: + .endif +000c8b 000a .dw USER_HANDLER + .include "words/catch.asm" + + ; Exceptions + ; execute XT and check for exceptions. + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_CATCH: +000c8c ff05 .dw $ff05 +000c8d 6163 +000c8e 6374 +000c8f 0068 .db "catch",0 +000c90 0c84 .dw VE_HEAD + .set VE_HEAD = VE_CATCH + XT_CATCH: +000c91 011b .dw DO_COLON + PFA_CATCH: + .endif + + ; sp@ >r +000c92 0726 .dw XT_SP_FETCH +000c93 0598 .dw XT_TO_R + ; handler @ >r +000c94 0c8a .dw XT_HANDLER +000c95 0512 .dw XT_FETCH +000c96 0598 .dw XT_TO_R + ; rp@ handler ! +000c97 070f .dw XT_RP_FETCH +000c98 0c8a .dw XT_HANDLER +000c99 051a .dw XT_STORE +000c9a 04b8 .dw XT_EXECUTE + ; r> handler ! +000c9b 058f .dw XT_R_FROM +000c9c 0c8a .dw XT_HANDLER +000c9d 051a .dw XT_STORE +000c9e 058f .dw XT_R_FROM +000c9f 0572 .dw XT_DROP +000ca0 05ed .dw XT_ZERO +000ca1 04ae .dw XT_EXIT + .include "words/throw.asm" + + ; Exceptions + ; throw an exception + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_THROW: +000ca2 ff05 .dw $ff05 +000ca3 6874 +000ca4 6f72 +000ca5 0077 .db "throw",0 +000ca6 0c8c .dw VE_HEAD + .set VE_HEAD = VE_THROW + XT_THROW: +000ca7 011b .dw DO_COLON + PFA_THROW: + .endif +000ca8 054a .dw XT_DUP +000ca9 05b3 .dw XT_ZEROEQUAL +000caa 04c7 .dw XT_DOCONDBRANCH +000cab 0cae DEST(PFA_THROW1) +000cac 0572 .dw XT_DROP +000cad 04ae .dw XT_EXIT + PFA_THROW1: +000cae 0c8a .dw XT_HANDLER +000caf 0512 .dw XT_FETCH +000cb0 0719 .dw XT_RP_STORE +000cb1 058f .dw XT_R_FROM +000cb2 0c8a .dw XT_HANDLER +000cb3 051a .dw XT_STORE +000cb4 058f .dw XT_R_FROM +000cb5 055d .dw XT_SWAP +000cb6 0598 .dw XT_TO_R +000cb7 072f .dw XT_SP_STORE +000cb8 0572 .dw XT_DROP +000cb9 058f .dw XT_R_FROM +000cba 04ae .dw XT_EXIT + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + .include "words/cskip.asm" + + ; String + ; skips leading occurancies in string at addr1/n1 leaving addr2/n2 pointing to the 1st non-c character + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_CSKIP: +000cbb ff05 .dw $ff05 +000cbc 7363 +000cbd 696b +000cbe 0070 .db "cskip",0 +000cbf 0ca2 .dw VE_HEAD + .set VE_HEAD = VE_CSKIP + XT_CSKIP: +000cc0 011b .dw DO_COLON + PFA_CSKIP: + .endif +000cc1 0598 .dw XT_TO_R ; ( -- addr1 n1 ) + PFA_CSKIP1: +000cc2 054a .dw XT_DUP ; ( -- addr' n' n' ) +000cc3 04c7 .dw XT_DOCONDBRANCH ; ( -- addr' n') +000cc4 0ccf DEST(PFA_CSKIP2) +000cc5 0568 .dw XT_OVER ; ( -- addr' n' addr' ) +000cc6 0531 .dw XT_CFETCH ; ( -- addr' n' c' ) +000cc7 05a1 .dw XT_R_FETCH ; ( -- addr' n' c' c ) +000cc8 126d .dw XT_EQUAL ; ( -- addr' n' f ) +000cc9 04c7 .dw XT_DOCONDBRANCH ; ( -- addr' n') +000cca 0ccf DEST(PFA_CSKIP2) +000ccb 1274 .dw XT_ONE +000ccc 0e0b .dw XT_SLASHSTRING +000ccd 04bd .dw XT_DOBRANCH +000cce 0cc2 DEST(PFA_CSKIP1) + PFA_CSKIP2: +000ccf 058f .dw XT_R_FROM +000cd0 0572 .dw XT_DROP ; ( -- addr2 n2) +000cd1 04ae .dw XT_EXIT + .include "words/cscan.asm" + + ; String + ; Scan string at addr1/n1 for the first occurance of c, leaving addr1/n2, char at n2 is first non-c character + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_CSCAN: +000cd2 ff05 .dw $ff05 +000cd3 7363 +000cd4 6163 +../../common\words/cscan.asm(12): warning: .cseg .db misalignment - padding zero byte +000cd5 006e .db "cscan" +000cd6 0cbb .dw VE_HEAD + .set VE_HEAD = VE_CSCAN + XT_CSCAN: +000cd7 011b .dw DO_COLON + PFA_CSCAN: + .endif +000cd8 0598 .dw XT_TO_R +000cd9 0568 .dw XT_OVER + PFA_CSCAN1: +000cda 054a .dw XT_DUP +000cdb 0531 .dw XT_CFETCH +000cdc 05a1 .dw XT_R_FETCH +000cdd 126d .dw XT_EQUAL +000cde 05b3 .dw XT_ZEROEQUAL +000cdf 04c7 .dw XT_DOCONDBRANCH +000ce0 0cec DEST(PFA_CSCAN2) +000ce1 055d .dw XT_SWAP +000ce2 06ce .dw XT_1MINUS +000ce3 055d .dw XT_SWAP +000ce4 0568 .dw XT_OVER +000ce5 05ba .dw XT_ZEROLESS ; not negative +000ce6 05b3 .dw XT_ZEROEQUAL +000ce7 04c7 .dw XT_DOCONDBRANCH +000ce8 0cec DEST(PFA_CSCAN2) +000ce9 06c8 .dw XT_1PLUS +000cea 04bd .dw XT_DOBRANCH +000ceb 0cda DEST(PFA_CSCAN1) + PFA_CSCAN2: +000cec 0589 .dw XT_NIP +000ced 0568 .dw XT_OVER +000cee 062c .dw XT_MINUS +000cef 058f .dw XT_R_FROM +000cf0 0572 .dw XT_DROP +000cf1 04ae .dw XT_EXIT + + ; : my-cscan ( addr len c -- addr len' ) + ; >r over ( -- addr len addr ) + ; begin + ; dup c@ r@ <> while + ; swap 1- swap over 0 >= while + ; 1+ + ; repeat then + ; nip over - r> drop + ; ; + .include "words/accept.asm" + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_ACCEPT: +000cf2 ff06 .dw $ff06 +000cf3 6361 +000cf4 6563 +000cf5 7470 .db "accept" +000cf6 0cd2 .dw VE_HEAD + .set VE_HEAD = VE_ACCEPT + XT_ACCEPT: +000cf7 011b .dw DO_COLON + PFA_ACCEPT: + + .endif +000cf8 0568 +000cf9 0636 +000cfa 06ce +000cfb 0568 .DW XT_OVER,XT_PLUS,XT_1MINUS,XT_OVER +000cfc 0a04 +000cfd 054a +000cfe 0d38 +000cff 05b3 +000d00 04c7 ACC1: .DW XT_KEY,XT_DUP,XT_CRLFQ,XT_ZEROEQUAL,XT_DOCONDBRANCH +000d01 0d2a DEST(ACC5) +000d02 054a +000d03 04ce +000d04 0008 +000d05 126d +000d06 04c7 .DW XT_DUP,XT_DOLITERAL,8,XT_EQUAL,XT_DOCONDBRANCH +000d07 0d1a DEST(ACC3) +000d08 0572 +000d09 057a +000d0a 09ca +000d0b 0611 +000d0c 0598 +000d0d 057a +000d0e 057a +000d0f 058f +000d10 04c7 .DW XT_DROP,XT_ROT,XT_2DUP,XT_GREATER,XT_TO_R,XT_ROT,XT_ROT,XT_R_FROM,XT_DOCONDBRANCH +000d11 0d18 DEST(ACC6) +000d12 0d30 +000d13 06ce +000d14 0598 +000d15 0568 +000d16 058f +000d17 016e .DW XT_BS,XT_1MINUS,XT_TO_R,XT_OVER,XT_R_FROM,XT_UMAX +000d18 04bd ACC6: .DW XT_DOBRANCH +000d19 0d28 DEST(ACC4) + + + ACC3: ; check for remaining control characters, replace them with blank +000d1a 054a .dw XT_DUP ; ( -- addr k k ) +000d1b 0a55 .dw XT_BL +000d1c 0607 .dw XT_LESS +000d1d 04c7 .dw XT_DOCONDBRANCH +000d1e 0d21 DEST(PFA_ACCEPT6) +000d1f 0572 .dw XT_DROP +000d20 0a55 .dw XT_BL + PFA_ACCEPT6: +000d21 054a +000d22 09f3 +000d23 0568 +000d24 0526 +000d25 06c8 +000d26 0568 +000d27 017a .DW XT_DUP,XT_EMIT,XT_OVER,XT_CSTORE,XT_1PLUS,XT_OVER,XT_UMIN +000d28 04bd ACC4: .DW XT_DOBRANCH +000d29 0cfc DEST(ACC1) +000d2a 0572 +000d2b 0589 +000d2c 055d +000d2d 062c +000d2e 0c3b +000d2f 04ae ACC5: .DW XT_DROP,XT_NIP,XT_SWAP,XT_MINUS,XT_CR,XT_EXIT + + + ; ( -- ) + ; System + ; send a backspace character to overwrite the current char + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + + ;VE_BS: + ; .dw $ff02 + ; .db "bs" + ; .dw VE_HEAD + ; .set VE_HEAD = VE_BS + XT_BS: +000d30 011b .dw DO_COLON + .endif +000d31 04ce .dw XT_DOLITERAL +000d32 0008 .dw 8 +000d33 054a .dw XT_DUP +000d34 09f3 .dw XT_EMIT +000d35 0c48 .dw XT_SPACE +000d36 09f3 .dw XT_EMIT +000d37 04ae .dw XT_EXIT + + + ; ( c -- f ) + ; System + ; is the character a line end character? + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + ;VE_CRLFQ: + ; .dw $ff02 + ; .db "crlf?" + ; .dw VE_HEAD + ; .set VE_HEAD = VE_CRLFQ + XT_CRLFQ: +000d38 011b .dw DO_COLON + .endif +000d39 054a .dw XT_DUP +000d3a 04ce .dw XT_DOLITERAL +000d3b 000d .dw 13 +000d3c 126d .dw XT_EQUAL +000d3d 055d .dw XT_SWAP +000d3e 04ce .dw XT_DOLITERAL +000d3f 000a .dw 10 +000d40 126d .dw XT_EQUAL +000d41 06b5 .dw XT_OR +000d42 04ae .dw XT_EXIT + .include "words/refill.asm" + + ; System + ; refills the input buffer + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_REFILL: +000d43 ff06 .dw $ff06 +000d44 6572 +000d45 6966 +000d46 6c6c .db "refill" +000d47 0cf2 .dw VE_HEAD + .set VE_HEAD = VE_REFILL + XT_REFILL: +000d48 1079 .dw PFA_DODEFER1 + PFA_REFILL: + .endif +000d49 001a .dw USER_REFILL +000d4a 1042 .dw XT_UDEFERFETCH +000d4b 104e .dw XT_UDEFERSTORE + .include "words/char.asm" + + ; Tools + ; copy the first character of the next word onto the stack + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_CHAR: +000d4c ff04 .dw $ff04 +000d4d 6863 +000d4e 7261 .db "char" +000d4f 0d43 .dw VE_HEAD + .set VE_HEAD = VE_CHAR + XT_CHAR: +000d50 011b .dw DO_COLON + PFA_CHAR: + .endif +000d51 0e1a .dw XT_PARSENAME +000d52 0572 .dw XT_DROP +000d53 0531 .dw XT_CFETCH +000d54 04ae .dw XT_EXIT + .include "words/number.asm" + + ; Numeric IO + ; convert a string at addr to a number + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_NUMBER: +000d55 ff06 .dw $ff06 +000d56 756e +000d57 626d +000d58 7265 .db "number" +000d59 0d4c .dw VE_HEAD + .set VE_HEAD = VE_NUMBER + XT_NUMBER: +000d5a 011b .dw DO_COLON + PFA_NUMBER: + .endif +000d5b 09b5 .dw XT_BASE +000d5c 0512 .dw XT_FETCH +000d5d 0598 .dw XT_TO_R +000d5e 0d9e .dw XT_QSIGN +000d5f 0598 .dw XT_TO_R +000d60 0db1 .dw XT_SET_BASE +000d61 0d9e .dw XT_QSIGN +000d62 058f .dw XT_R_FROM +000d63 06b5 .dw XT_OR +000d64 0598 .dw XT_TO_R + ; check whether something is left +000d65 054a .dw XT_DUP +000d66 05b3 .dw XT_ZEROEQUAL +000d67 04c7 .dw XT_DOCONDBRANCH +000d68 0d71 DEST(PFA_NUMBER0) + ; nothing is left. It cannot be a number at all +000d69 09d3 .dw XT_2DROP +000d6a 058f .dw XT_R_FROM +000d6b 0572 .dw XT_DROP +000d6c 058f .dw XT_R_FROM +000d6d 09b5 .dw XT_BASE +000d6e 051a .dw XT_STORE +000d6f 05ed .dw XT_ZERO +000d70 04ae .dw XT_EXIT + PFA_NUMBER0: +000d71 07b8 .dw XT_2TO_R +000d72 05ed .dw XT_ZERO ; starting value +000d73 05ed .dw XT_ZERO +000d74 07c7 .dw XT_2R_FROM +000d75 0dcf .dw XT_TO_NUMBER ; ( 0. addr len -- d addr' len' + ; check length of the remaining string. + ; if zero: a single cell number is entered +000d76 0552 .dw XT_QDUP +000d77 04c7 .dw XT_DOCONDBRANCH +000d78 0d93 DEST(PFA_NUMBER1) + ; if equal 1: mayba a trailing dot? --> double cell number +000d79 1274 .dw XT_ONE +000d7a 126d .dw XT_EQUAL +000d7b 04c7 .dw XT_DOCONDBRANCH +000d7c 0d8a DEST(PFA_NUMBER2) + ; excatly one character is left +000d7d 0531 .dw XT_CFETCH +000d7e 04ce .dw XT_DOLITERAL +000d7f 002e .dw 46 ; . +000d80 126d .dw XT_EQUAL +000d81 04c7 .dw XT_DOCONDBRANCH +000d82 0d8b DEST(PFA_NUMBER6) + ; its a double cell number + ; incorporate sign into number +000d83 058f .dw XT_R_FROM +000d84 04c7 .dw XT_DOCONDBRANCH +000d85 0d87 DEST(PFA_NUMBER3) +000d86 1147 .dw XT_DNEGATE + PFA_NUMBER3: +000d87 1279 .dw XT_TWO +000d88 04bd .dw XT_DOBRANCH +000d89 0d99 DEST(PFA_NUMBER5) + PFA_NUMBER2: +000d8a 0572 .dw XT_DROP + PFA_NUMBER6: +000d8b 09d3 .dw XT_2DROP +000d8c 058f .dw XT_R_FROM +000d8d 0572 .dw XT_DROP +000d8e 058f .dw XT_R_FROM +000d8f 09b5 .dw XT_BASE +000d90 051a .dw XT_STORE +000d91 05ed .dw XT_ZERO +000d92 04ae .dw XT_EXIT + PFA_NUMBER1: +000d93 09d3 .dw XT_2DROP ; remove the address + ; incorporate sign into number +000d94 058f .dw XT_R_FROM +000d95 04c7 .dw XT_DOCONDBRANCH +000d96 0d98 DEST(PFA_NUMBER4) +000d97 0aa5 .dw XT_NEGATE + PFA_NUMBER4: +000d98 1274 .dw XT_ONE + PFA_NUMBER5: +000d99 058f .dw XT_R_FROM +000d9a 09b5 .dw XT_BASE +000d9b 051a .dw XT_STORE +000d9c 05e4 .dw XT_TRUE +000d9d 04ae .dw XT_EXIT + .include "words/q-sign.asm" + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + XT_QSIGN: +000d9e 011b .dw DO_COLON + PFA_QSIGN: ; ( c -- ) + .endif +000d9f 0568 .dw XT_OVER ; ( -- addr len addr ) +000da0 0531 .dw XT_CFETCH +000da1 04ce .dw XT_DOLITERAL +000da2 002d .dw '-' +000da3 126d .dw XT_EQUAL ; ( -- addr len flag ) +000da4 054a .dw XT_DUP +000da5 0598 .dw XT_TO_R +000da6 04c7 .dw XT_DOCONDBRANCH +000da7 0daa DEST(PFA_NUMBERSIGN_DONE) +000da8 1274 .dw XT_ONE ; skip sign character +000da9 0e0b .dw XT_SLASHSTRING + PFA_NUMBERSIGN_DONE: +000daa 058f .dw XT_R_FROM +000dab 04ae .dw XT_EXIT + .include "words/set-base.asm" + + ; Numeric IO + ; skip a numeric prefix character + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + XT_BASES: +000dac 04e9 .dw PFA_DOCONSTANT + .endif +000dad 000a +000dae 0010 +000daf 0002 +000db0 000a .dw 10,16,2,10 ; last one could a 8 instead. + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + XT_SET_BASE: +000db1 011b .dw DO_COLON + PFA_SET_BASE: ; ( adr1 len1 -- adr2 len2 ) + .endif +000db2 0568 .dw XT_OVER +000db3 0531 .dw XT_CFETCH +000db4 04ce .dw XT_DOLITERAL +000db5 0023 .dw 35 +000db6 062c .dw XT_MINUS +000db7 054a .dw XT_DUP +000db8 05ed .dw XT_ZERO +000db9 04ce .dw XT_DOLITERAL +000dba 0004 .dw 4 +000dbb 0add .dw XT_WITHIN +000dbc 04c7 .dw XT_DOCONDBRANCH +000dbd 0dc7 DEST(SET_BASE1) + .if cpu_msp430==1 + .endif +000dbe 0dac .dw XT_BASES +000dbf 0636 .dw XT_PLUS +000dc0 082c .dw XT_FETCHI +000dc1 09b5 .dw XT_BASE +000dc2 051a .dw XT_STORE +000dc3 1274 .dw XT_ONE +000dc4 0e0b .dw XT_SLASHSTRING +000dc5 04bd .dw XT_DOBRANCH +000dc6 0dc8 DEST(SET_BASE2) + SET_BASE1: +000dc7 0572 .dw XT_DROP + SET_BASE2: +000dc8 04ae .dw XT_EXIT + + ; create bases 10 , 16 , 2 , 8 , + ; : set-base 35 - dup 0 4 within if + ; bases + @i base ! 1 /string + ; else + ; drop + ; then ; + .include "words/to-number.asm" + + ; Numeric IO + ; convert a string to a number c-addr2/u2 is the unconverted string + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_TO_NUMBER: +000dc9 ff07 .dw $ff07 +000dca 6e3e +000dcb 6d75 +000dcc 6562 +000dcd 0072 .db ">number",0 +000dce 0d55 .dw VE_HEAD + .set VE_HEAD = VE_TO_NUMBER + XT_TO_NUMBER: +000dcf 011b .dw DO_COLON + + .endif + +000dd0 054a +000dd1 04c7 TONUM1: .DW XT_DUP,XT_DOCONDBRANCH +000dd2 0de7 DEST(TONUM3) +000dd3 0568 +000dd4 0531 +000dd5 0bb9 .DW XT_OVER,XT_CFETCH,XT_DIGITQ +000dd6 05b3 +000dd7 04c7 .DW XT_ZEROEQUAL,XT_DOCONDBRANCH +000dd8 0ddb DEST(TONUM2) +000dd9 0572 +000dda 04ae .DW XT_DROP,XT_EXIT +000ddb 0598 +000ddc 116b +000ddd 09b5 +000dde 0512 +000ddf 015f TONUM2: .DW XT_TO_R,XT_2SWAP,XT_BASE,XT_FETCH,XT_UDSTAR +000de0 058f +000de1 0157 +000de2 116b .DW XT_R_FROM,XT_MPLUS,XT_2SWAP +000de3 1274 +000de4 0e0b +000de5 04bd .DW XT_ONE,XT_SLASHSTRING,XT_DOBRANCH +000de6 0dd0 DEST(TONUM1) +000de7 04ae TONUM3: .DW XT_EXIT + + ;C >NUMBER ud adr u -- ud' adr' u' + ;C convert string to number + ; BEGIN + ; DUP WHILE + ; OVER C@ DIGIT? + ; 0= IF DROP EXIT THEN + ; >R 2SWAP BASE @ UD* + ; R> M+ 2SWAP + ; 1 /STRING + ; REPEAT ; + .include "words/parse.asm" + + ; String + ; in input buffer parse ccc delimited string by the delimiter char. + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_PARSE: +000de8 ff05 .dw $ff05 +000de9 6170 +000dea 7372 +000deb 0065 .db "parse",0 +000dec 0dc9 .dw VE_HEAD + .set VE_HEAD = VE_PARSE + XT_PARSE: +000ded 011b .dw DO_COLON + PFA_PARSE: + .endif +000dee 0598 .dw XT_TO_R ; ( -- ) +000def 0e01 .dw XT_SOURCE ; ( -- addr len) +000df0 09e3 .dw XT_TO_IN ; ( -- addr len >in) +000df1 0512 .dw XT_FETCH +000df2 0e0b .dw XT_SLASHSTRING ; ( -- addr' len' ) + +000df3 058f .dw XT_R_FROM ; ( -- addr' len' c) +000df4 0cd7 .dw XT_CSCAN ; ( -- addr' len'') +000df5 054a .dw XT_DUP ; ( -- addr' len'' len'') +000df6 06c8 .dw XT_1PLUS +000df7 09e3 .dw XT_TO_IN ; ( -- addr' len'' len'' >in) +000df8 06fe .dw XT_PLUSSTORE ; ( -- addr' len') +000df9 1274 .dw XT_ONE +000dfa 0e0b .dw XT_SLASHSTRING +000dfb 04ae .dw XT_EXIT + .include "words/source.asm" + + ; System + ; address and current length of the input buffer + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_SOURCE: +000dfc ff06 .dw $FF06 +000dfd 6f73 +000dfe 7275 +000dff 6563 .db "source" +000e00 0de8 .dw VE_HEAD + .set VE_HEAD = VE_SOURCE + XT_SOURCE: +000e01 1079 .dw PFA_DODEFER1 + PFA_SOURCE: + .endif +000e02 0016 .dw USER_SOURCE +000e03 1042 .dw XT_UDEFERFETCH +000e04 104e .dw XT_UDEFERSTORE + + + .include "words/slash-string.asm" + + ; String + ; adjust string from addr1 to addr1+n, reduce length from u1 to u2 by n + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_SLASHSTRING: +000e05 ff07 .dw $ff07 +000e06 732f +000e07 7274 +000e08 6e69 +000e09 0067 .db "/string",0 +000e0a 0dfc .dw VE_HEAD + .set VE_HEAD = VE_SLASHSTRING + XT_SLASHSTRING: +000e0b 011b .dw DO_COLON + PFA_SLASHSTRING: + .endif +000e0c 057a .dw XT_ROT +000e0d 0568 .dw XT_OVER +000e0e 0636 .dw XT_PLUS +000e0f 057a .dw XT_ROT +000e10 057a .dw XT_ROT +000e11 062c .dw XT_MINUS +000e12 04ae .dw XT_EXIT + + .include "words/parse-name.asm" + + ; String + ; In the SOURCE buffer parse whitespace delimited string. Returns string address within SOURCE. + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + + VE_PARSENAME: +000e13 ff0a .dw $FF0A +000e14 6170 +000e15 7372 +000e16 2d65 +000e17 616e +000e18 656d .db "parse-name" +000e19 0e05 .dw VE_HEAD + .set VE_HEAD = VE_PARSENAME + XT_PARSENAME: +000e1a 011b .dw DO_COLON + PFA_PARSENAME: + .endif +000e1b 0a55 .dw XT_BL +000e1c 0e1e .dw XT_SKIPSCANCHAR +000e1d 04ae .dw XT_EXIT + + ; ( c -- addr2 len2 ) + ; String + ; skips char and scan what's left in source for char + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + ;VE_SKIPSCANCHAR: + ; .dw $FF0A + ; .db "skipscanchar" + ; .dw VE_HEAD + ; .set VE_HEAD = VE_SKIPSCANCHAR + XT_SKIPSCANCHAR: +000e1e 011b .dw DO_COLON + PFA_SKIPSCANCHAR: + .endif +000e1f 0598 .dw XT_TO_R +000e20 0e01 .dw XT_SOURCE +000e21 09e3 .dw XT_TO_IN +000e22 0512 .dw XT_FETCH +000e23 0e0b .dw XT_SLASHSTRING + +000e24 05a1 .dw XT_R_FETCH +000e25 0cc0 .dw XT_CSKIP +000e26 058f .dw XT_R_FROM +000e27 0cd7 .dw XT_CSCAN + + ; adjust >IN +000e28 09ca .dw XT_2DUP +000e29 0636 .dw XT_PLUS +000e2a 0e01 .dw XT_SOURCE +000e2b 0572 .dw XT_DROP +000e2c 062c .dw XT_MINUS +000e2d 09e3 .dw XT_TO_IN +000e2e 051a .dw XT_STORE +000e2f 04ae .dw XT_EXIT + .include "words/find-xt.asm" + + ; Tools + ; search wordlists for an entry with the xt from c-addr/len + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_FINDXT: +000e30 ff07 .dw $ff07 +000e31 6966 +000e32 646e +000e33 782d +000e34 0074 .db "find-xt",0 +000e35 0e13 .dw VE_HEAD + .set VE_HEAD = VE_FINDXT + XT_FINDXT: +000e36 011b .dw DO_COLON + PFA_FINDXT: + .endif +000e37 04ce .dw XT_DOLITERAL +000e38 0e42 .dw XT_FINDXTA +000e39 04ce .dw XT_DOLITERAL +000e3a 0088 .dw CFG_ORDERLISTLEN +000e3b 041c .dw XT_MAPSTACK +000e3c 05b3 .dw XT_ZEROEQUAL +000e3d 04c7 .dw XT_DOCONDBRANCH +000e3e 0e41 DEST(PFA_FINDXT1) +000e3f 09d3 .dw XT_2DROP +000e40 05ed .dw XT_ZERO + PFA_FINDXT1: +000e41 04ae .dw XT_EXIT + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + + XT_FINDXTA: +000e42 011b .dw DO_COLON + PFA_FINDXTA: + .endif +000e43 0598 .dw XT_TO_R +000e44 09ca .dw XT_2DUP +000e45 058f .dw XT_R_FROM +000e46 108b .dw XT_SEARCH_WORDLIST +000e47 054a .dw XT_DUP +000e48 04c7 .dw XT_DOCONDBRANCH +000e49 0e4f DEST(PFA_FINDXTA1) +000e4a 0598 .dw XT_TO_R +000e4b 0589 .dw XT_NIP +000e4c 0589 .dw XT_NIP +000e4d 058f .dw XT_R_FROM +000e4e 05e4 .dw XT_TRUE + PFA_FINDXTA1: +000e4f 04ae .dw XT_EXIT + + .include "words/prompt-ok.asm" + + ; System + ; send the READY prompt to the command line + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + ;VE_PROMPTOK: + ; .dw $ff02 + ; .db "ok" + ; .dw VE_HEAD + ; .set VE_HEAD = VE_PROMPTOK + XT_DEFAULT_PROMPTOK: +000e50 011b .dw DO_COLON + PFA_DEFAULT_PROMPTOK: +000e51 0bd3 .dw XT_DOSLITERAL +000e52 0003 .dw 3 +000e53 6f20 +000e54 006b .db " ok",0 + .endif +000e55 0c06 .dw XT_ITYPE +000e56 04ae .dw XT_EXIT + + ; ------------------------ + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_PROMPTOK: +000e57 ff03 .dw $FF03 +000e58 6f2e +../../common\words/prompt-ok.asm(43): warning: .cseg .db misalignment - padding zero byte +000e59 006b .db ".ok" +000e5a 0e30 .dw VE_HEAD + .set VE_HEAD = VE_PROMPTOK + XT_PROMPTOK: +000e5b 1079 .dw PFA_DODEFER1 + PFA_PROMPTOK: + .endif +000e5c 001c .dw USER_P_OK +000e5d 1042 .dw XT_UDEFERFETCH +000e5e 104e .dw XT_UDEFERSTORE + .include "words/prompt-ready.asm" + + ; System + ; process the error prompt + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + ;VE_PROMPTRDY: + ; .dw $ff04 + ; .db "p_er" + ; .dw VE_HEAD + ; .set VE_HEAD = VE_PROMPTRDY + XT_DEFAULT_PROMPTREADY: +000e5f 011b .dw DO_COLON + PFA_DEFAULT_PROMPTREADY: +000e60 0bd3 .dw XT_DOSLITERAL +000e61 0002 .dw 2 +000e62 203e .db "> " + .endif +000e63 0c3b .dw XT_CR +000e64 0c06 .dw XT_ITYPE +000e65 04ae .dw XT_EXIT + + ; ------------------------ + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_PROMPTREADY: +000e66 ff06 .dw $FF06 +000e67 722e +000e68 6165 +000e69 7964 .db ".ready" +000e6a 0e57 .dw VE_HEAD + .set VE_HEAD = VE_PROMPTREADY + XT_PROMPTREADY: +000e6b 1079 .dw PFA_DODEFER1 + PFA_PROMPTREADY: + .endif +000e6c 0020 .dw USER_P_RDY +000e6d 1042 .dw XT_UDEFERFETCH +000e6e 104e .dw XT_UDEFERSTORE + .include "words/prompt-error.asm" + + ; System + ; process the error prompt + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + ;VE_PROMPTERROR: + ; .dw $ff04 + ; .db "p_er" + ; .dw VE_HEAD + ; .set VE_HEAD = VE_PROMPTERROR + XT_DEFAULT_PROMPTERROR: +000e6f 011b .dw DO_COLON + PFA_DEFAULT_PROMPTERROR: +000e70 0bd3 .dw XT_DOSLITERAL +000e71 0004 .dw 4 +000e72 3f20 +000e73 203f .db " ?? " + .endif +000e74 0c06 .dw XT_ITYPE +000e75 09b5 .dw XT_BASE +000e76 0512 .dw XT_FETCH +000e77 0598 .dw XT_TO_R +000e78 0a42 .dw XT_DECIMAL +000e79 0b88 .dw XT_DOT +000e7a 09e3 .dw XT_TO_IN +000e7b 0512 .dw XT_FETCH +000e7c 0b88 .dw XT_DOT +000e7d 058f .dw XT_R_FROM +000e7e 09b5 .dw XT_BASE +000e7f 051a .dw XT_STORE +000e80 04ae .dw XT_EXIT + + ; ------------------------ + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_PROMPTERROR: +000e81 ff06 .dw $FF06 +000e82 652e +000e83 7272 +000e84 726f .db ".error" +000e85 0e66 .dw VE_HEAD + .set VE_HEAD = VE_PROMPTERROR + XT_PROMPTERROR: +000e86 1079 .dw PFA_DODEFER1 + PFA_PROMPTERROR: + .endif +000e87 001e .dw USER_P_ERR +000e88 1042 .dw XT_UDEFERFETCH +000e89 104e .dw XT_UDEFERSTORE + + .include "words/quit.asm" + + ; System + ; main loop of amforth. accept - interpret in an endless loop + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_QUIT: +000e8a ff04 .dw $ff04 +000e8b 7571 +000e8c 7469 .db "quit" +000e8d 0e81 .dw VE_HEAD + .set VE_HEAD = VE_QUIT + XT_QUIT: +000e8e 011b .dw DO_COLON + .endif + PFA_QUIT: +000e8f 02d1 +000e90 02d8 +000e91 051a .dw XT_LP0,XT_LP,XT_STORE +000e92 0eef .dw XT_SP0 +000e93 072f .dw XT_SP_STORE +000e94 0efc .dw XT_RP0 +000e95 0719 .dw XT_RP_STORE +000e96 0366 .dw XT_LBRACKET + + PFA_QUIT2: +000e97 09af .dw XT_STATE +000e98 0512 .dw XT_FETCH +000e99 05b3 .dw XT_ZEROEQUAL +000e9a 04c7 .dw XT_DOCONDBRANCH +000e9b 0e9d DEST(PFA_QUIT4) +000e9c 0e6b .dw XT_PROMPTREADY + PFA_QUIT4: +000e9d 0d48 .dw XT_REFILL +000e9e 04c7 .dw XT_DOCONDBRANCH +000e9f 0eaf DEST(PFA_QUIT3) +000ea0 04ce .dw XT_DOLITERAL +000ea1 0f15 .dw XT_INTERPRET +000ea2 0c91 .dw XT_CATCH +000ea3 0552 .dw XT_QDUP +000ea4 04c7 .dw XT_DOCONDBRANCH +000ea5 0eaf DEST(PFA_QUIT3) +000ea6 054a .dw XT_DUP +000ea7 04ce .dw XT_DOLITERAL +000ea8 fffe .dw -2 +000ea9 0607 .dw XT_LESS +000eaa 04c7 .dw XT_DOCONDBRANCH +000eab 0ead DEST(PFA_QUIT5) +000eac 0e86 .dw XT_PROMPTERROR + PFA_QUIT5: +000ead 04bd .dw XT_DOBRANCH +000eae 0e8f DEST(PFA_QUIT) + PFA_QUIT3: +000eaf 0e5b .dw XT_PROMPTOK +000eb0 04bd .dw XT_DOBRANCH +000eb1 0e97 DEST(PFA_QUIT2) + ; .dw XT_EXIT ; never reached + + .include "words/pause.asm" + + ; Multitasking + ; Fetch pause vector and execute it. may make a context/task switch + VE_PAUSE: +000eb2 ff05 .dw $ff05 +000eb3 6170 +000eb4 7375 +000eb5 0065 .db "pause",0 +000eb6 0e8a .dw VE_HEAD + .set VE_HEAD = VE_PAUSE + XT_PAUSE: +000eb7 1079 .dw PFA_DODEFER1 + PFA_PAUSE: +000eb8 0257 .dw ram_pause +000eb9 102e .dw XT_RDEFERFETCH +000eba 1038 .dw XT_RDEFERSTORE + + .dseg +000257 ram_pause: .byte 2 + .cseg + .include "words/cold.asm" + + ; System + ; start up amforth. + VE_COLD: +000ebb ff04 .dw $ff04 +000ebc 6f63 +000ebd 646c .db "cold" +000ebe 0eb2 .dw VE_HEAD + .set VE_HEAD = VE_COLD + XT_COLD: +000ebf 0ec0 .dw PFA_COLD + PFA_COLD: +000ec0 b6a4 in_ mcu_boot, MCUSR +000ec1 2422 clr zerol +000ec2 2433 clr zeroh +000ec3 24bb clr isrflag +000ec4 be24 out_ MCUSR, zerol + ; clear RAM +000ec5 e0e0 ldi zl, low(ramstart) +000ec6 e0f2 ldi zh, high(ramstart) + clearloop: +000ec7 9221 st Z+, zerol +000ec8 30e0 cpi zl, low(sram_size+ramstart) +000ec9 f7e9 brne clearloop +000eca 32f2 cpi zh, high(sram_size+ramstart) +000ecb f7d9 brne clearloop + ; init first user data area + ; allocate space for User Area + .dseg +000259 ram_user1: .byte SYSUSERSIZE + APPUSERSIZE + .cseg +000ecc e5e9 ldi zl, low(ram_user1) +000ecd e0f2 ldi zh, high(ram_user1) +000ece 012f movw upl, zl + ; init return stack pointer +000ecf ef0f ldi temp0,low(rstackstart) +000ed0 bf0d out_ SPL,temp0 +000ed1 8304 std Z+4, temp0 +000ed2 e211 ldi temp1,high(rstackstart) +000ed3 bf1e out_ SPH,temp1 +000ed4 8315 std Z+5, temp1 + + ; init parameter stack pointer +000ed5 eacf ldi yl,low(stackstart) +000ed6 83c6 std Z+6, yl +000ed7 e2d1 ldi yh,high(stackstart) +000ed8 83d7 std Z+7, yh + + ; load Forth IP with starting word +000ed9 eea2 ldi XL, low(PFA_WARM) +000eda e0be ldi XH, high(PFA_WARM) + ; its a far jump... +000edb 940c 011f jmp_ DO_NEXT + .include "words/warm.asm" + + ; System + ; initialize amforth further. executes turnkey operation and go to quit + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_WARM: +000edd ff04 .dw $ff04 +000ede 6177 +000edf 6d72 .db "warm" +000ee0 0ebb .dw VE_HEAD + .set VE_HEAD = VE_WARM + XT_WARM: +000ee1 011b .dw DO_COLON + PFA_WARM: + .endif +000ee2 11b6 .dw XT_INIT_RAM +000ee3 04ce .dw XT_DOLITERAL +000ee4 0fe5 .dw XT_NOOP +000ee5 04ce .dw XT_DOLITERAL +000ee6 0eb7 .dw XT_PAUSE +000ee7 1059 .dw XT_DEFERSTORE +000ee8 0366 .dw XT_LBRACKET +000ee9 0a5d .dw XT_TURNKEY +000eea 0e8e .dw XT_QUIT ; never returns + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + .include "words/sp0.asm" + + ; Stack + ; start address of the data stack + VE_SP0: +000eeb ff03 .dw $ff03 +000eec 7073 +000eed 0030 .db "sp0",0 +000eee 0edd .dw VE_HEAD + .set VE_HEAD = VE_SP0 + XT_SP0: +000eef 0509 .dw PFA_DOVALUE1 + PFA_SP0: +000ef0 0006 .dw USER_SP0 +000ef1 1042 .dw XT_UDEFERFETCH +000ef2 104e .dw XT_UDEFERSTORE + + ; ( -- addr) + ; Stack + ; address of user variable to store top-of-stack for inactive tasks + VE_SP: +000ef3 ff02 .dw $ff02 +000ef4 7073 .db "sp" +000ef5 0eeb .dw VE_HEAD + .set VE_HEAD = VE_SP + XT_SP: +000ef6 04ef .dw PFA_DOUSER + PFA_SP: +000ef7 0008 .dw USER_SP + .include "words/rp0.asm" + + ; Stack + ; start address of return stack + VE_RP0: +000ef8 ff03 .dw $ff03 +000ef9 7072 +000efa 0030 .db "rp0",0 +000efb 0ef3 .dw VE_HEAD + .set VE_HEAD = VE_RP0 + XT_RP0: +000efc 011b .dw DO_COLON + PFA_RP0: +000efd 0f00 .dw XT_DORP0 +000efe 0512 .dw XT_FETCH +000eff 04ae .dw XT_EXIT + + ; ( -- addr) + ; Stack + ; user variable of the address of the initial return stack + ;VE_DORP0: + ; .dw $ff05 + ; .db "(rp0)" + ; .dw VE_HEAD + ; .set VE_HEAD = VE_DORP0 + XT_DORP0: +000f00 04ef .dw PFA_DOUSER + PFA_DORP0: +000f01 0004 .dw USER_RP + .include "words/depth.asm" + + ; Stack + ; number of single-cell values contained in the data stack before n was placed on the stack. + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_DEPTH: +000f02 ff05 .dw $ff05 +000f03 6564 +000f04 7470 +000f05 0068 .db "depth",0 +000f06 0ef8 .dw VE_HEAD + .set VE_HEAD = VE_DEPTH + XT_DEPTH: +000f07 011b .dw DO_COLON + PFA_DEPTH: + .endif +000f08 0eef .dw XT_SP0 +000f09 0726 .dw XT_SP_FETCH +000f0a 062c .dw XT_MINUS +000f0b 069d .dw XT_2SLASH +000f0c 06ce .dw XT_1MINUS +000f0d 04ae .dw XT_EXIT + .include "words/interpret.asm" + + ; System + ; Interpret SOURCE word by word. + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_INTERPRET: +000f0e ff09 .dw $ff09 +000f0f 6e69 +000f10 6574 +000f11 7072 +000f12 6572 +000f13 0074 .db "interpret",0 +000f14 0f02 .dw VE_HEAD + .set VE_HEAD = VE_INTERPRET + XT_INTERPRET: +000f15 011b .dw DO_COLON + .endif + PFA_INTERPRET: +000f16 0e1a .dw XT_PARSENAME ; ( -- addr len ) +000f17 054a .dw XT_DUP ; ( -- addr len flag) +000f18 04c7 .dw XT_DOCONDBRANCH +000f19 0f26 DEST(PFA_INTERPRET2) +000f1a 0f32 .dw XT_FORTHRECOGNIZER +000f1b 0f3d .dw XT_RECOGNIZE +000f1c 09af .dw XT_STATE +000f1d 0512 .dw XT_FETCH +000f1e 04c7 .dw XT_DOCONDBRANCH +000f1f 0f21 DEST(PFA_INTERPRET1) +000f20 1011 .dw XT_ICELLPLUS ; we need the compile action + PFA_INTERPRET1: +000f21 082c .dw XT_FETCHI +000f22 04b8 .dw XT_EXECUTE +000f23 0fbd .dw XT_QSTACK +000f24 04bd .dw XT_DOBRANCH +000f25 0f16 DEST(PFA_INTERPRET) + PFA_INTERPRET2: +000f26 09d3 .dw XT_2DROP +000f27 04ae .dw XT_EXIT + .include "words/forth-recognizer.asm" + + ; System Value + ; address of the next free data space (RAM) cell + VE_FORTHRECOGNIZER: +000f28 ff10 .dw $ff10 +000f29 6f66 +000f2a 7472 +000f2b 2d68 +000f2c 6572 +000f2d 6f63 +000f2e 6e67 +000f2f 7a69 +000f30 7265 .db "forth-recognizer" +000f31 0f0e .dw VE_HEAD + .set VE_HEAD = VE_FORTHRECOGNIZER + XT_FORTHRECOGNIZER: +000f32 0509 .dw PFA_DOVALUE1 + PFA_FORTHRECOGNIZER: +000f33 007c .dw CFG_FORTHRECOGNIZER +000f34 101a .dw XT_EDEFERFETCH +000f35 1024 .dw XT_EDEFERSTORE + .include "words/recognize.asm" + + ; System + ; walk the recognizer stack + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_RECOGNIZE: +000f36 ff09 .dw $ff09 +000f37 6572 +000f38 6f63 +000f39 6e67 +000f3a 7a69 +000f3b 0065 .db "recognize",0 +000f3c 0f28 .dw VE_HEAD + .set VE_HEAD = VE_RECOGNIZE + XT_RECOGNIZE: +000f3d 011b .dw DO_COLON + PFA_RECOGNIZE: + .endif +000f3e 04ce .dw XT_DOLITERAL +000f3f 0f48 .dw XT_RECOGNIZE_A +000f40 055d .dw XT_SWAP +000f41 041c .dw XT_MAPSTACK +000f42 05b3 .dw XT_ZEROEQUAL +000f43 04c7 .dw XT_DOCONDBRANCH +000f44 0f47 DEST(PFA_RECOGNIZE1) +000f45 09d3 .dw XT_2DROP +000f46 0fb0 .dw XT_DT_NULL + PFA_RECOGNIZE1: +000f47 04ae .dw XT_EXIT + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + ; ( addr len XT -- addr len [ dt:xt -1 | 0 ] ) + XT_RECOGNIZE_A: +000f48 011b .dw DO_COLON + PFA_RECOGNIZE_A: + .endif +000f49 057a .dw XT_ROT ; -- len xt addr +000f4a 057a .dw XT_ROT ; -- xt addr len +000f4b 09ca .dw XT_2DUP +000f4c 07b8 .dw XT_2TO_R +000f4d 057a .dw XT_ROT ; -- addr len xt +000f4e 04b8 .dw XT_EXECUTE ; -- i*x dt:* | dt:null +000f4f 07c7 .dw XT_2R_FROM +000f50 057a .dw XT_ROT +000f51 054a .dw XT_DUP +000f52 0fb0 .dw XT_DT_NULL +000f53 126d .dw XT_EQUAL +000f54 04c7 .dw XT_DOCONDBRANCH +000f55 0f59 DEST(PFA_RECOGNIZE_A1) +000f56 0572 .dw XT_DROP +000f57 05ed .dw XT_ZERO +000f58 04ae .dw XT_EXIT + PFA_RECOGNIZE_A1: +000f59 0589 .dw XT_NIP +000f5a 0589 .dw XT_NIP +000f5b 05e4 .dw XT_TRUE +000f5c 04ae .dw XT_EXIT + + ; : recognize ( addr len stack-id -- i*x dt:* | dt:null ) + ; [: ( addr len -- addr len 0 | i*x dt:* -1 ) + ; rot rot 2dup 2>r rot execute 2r> rot + ; dup dt:null = ( -- addr len dt:* f ) + ; if drop 0 else nip nip -1 then + ; ;] + ; map-stack ( -- i*x addr len dt:* f ) + ; 0= if \ a recognizer did the job, remove addr/len + ; 2drop dt:null + ; then ; + ; + .include "words/rec-intnum.asm" + + ; Interpreter + ; Method table for single cell integers + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_DT_NUM: +000f5d ff06 .dw $ff06 +000f5e 7464 +000f5f 6e3a +000f60 6d75 .db "dt:num" +000f61 0f36 .dw VE_HEAD + .set VE_HEAD = VE_DT_NUM + XT_DT_NUM: +000f62 04e9 .dw PFA_DOCONSTANT + PFA_DT_NUM: + .endif +000f63 0fe5 .dw XT_NOOP ; interpret +000f64 01f2 .dw XT_LITERAL ; compile +000f65 01f2 .dw XT_LITERAL ; postpone + + ; ( -- addr ) + ; Interpreter + ; Method table for double cell integers + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_DT_DNUM: +000f66 ff07 .dw $ff07 +000f67 7464 +000f68 643a +000f69 756e +000f6a 006d .db "dt:dnum",0 +000f6b 0f5d .dw VE_HEAD + .set VE_HEAD = VE_DT_DNUM + XT_DT_DNUM: +000f6c 04e9 .dw PFA_DOCONSTANT + PFA_DT_DNUM: + .endif +000f6d 0fe5 .dw XT_NOOP ; interpret +000f6e 1265 .dw XT_2LITERAL ; compile +000f6f 1265 .dw XT_2LITERAL ; postpone + + ; ( addr len -- f ) + ; Interpreter + ; recognizer for integer numbers + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + + VE_REC_NUM: +000f70 ff07 .dw $ff07 +000f71 6572 +000f72 3a63 +000f73 756e +000f74 006d .db "rec:num",0 +000f75 0f66 .dw VE_HEAD + .set VE_HEAD = VE_REC_NUM + XT_REC_NUM: +000f76 011b .dw DO_COLON + PFA_REC_NUM: + .endif + ; try converting to a number +000f77 0d5a .dw XT_NUMBER +000f78 04c7 .dw XT_DOCONDBRANCH +000f79 0f82 DEST(PFA_REC_NONUMBER) +000f7a 1274 .dw XT_ONE +000f7b 126d .dw XT_EQUAL +000f7c 04c7 .dw XT_DOCONDBRANCH +000f7d 0f80 DEST(PFA_REC_INTNUM2) +000f7e 0f62 .dw XT_DT_NUM +000f7f 04ae .dw XT_EXIT + PFA_REC_INTNUM2: +000f80 0f6c .dw XT_DT_DNUM +000f81 04ae .dw XT_EXIT + PFA_REC_NONUMBER: +000f82 0fb0 .dw XT_DT_NULL +000f83 04ae .dw XT_EXIT + .include "words/rec-find.asm" + + ; Interpreter + ; search for a word + .if cpu_msp430==1 + .endif + .if cpu_avr8==1 + VE_REC_FIND: +000f84 ff08 .dw $ff08 +000f85 6572 +000f86 3a63 +000f87 6966 +000f88 646e .db "rec:find" +000f89 0f70 .dw VE_HEAD + .set VE_HEAD = VE_REC_FIND + XT_REC_FIND: +000f8a 011b .dw DO_COLON + PFA_REC_FIND: + .endif +000f8b 0e36 .DW XT_FINDXT +000f8c 054a .dw XT_DUP +000f8d 05b3 .dw XT_ZEROEQUAL +000f8e 04c7 .dw XT_DOCONDBRANCH +000f8f 0f93 DEST(PFA_REC_WORD_FOUND) +000f90 0572 .dw XT_DROP +000f91 0fb0 .dw XT_DT_NULL +000f92 04ae .dw XT_EXIT + PFA_REC_WORD_FOUND: +000f93 0f9a .dw XT_DT_XT + +000f94 04ae .dw XT_EXIT + + ; ( -- addr ) + ; Interpreter + ; actions to handle execution tokens and their flags + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_DT_XT: +000f95 ff05 .dw $ff05 +000f96 7464 +000f97 783a +000f98 0074 .db "dt:xt",0 +000f99 0f84 .dw VE_HEAD + .set VE_HEAD = VE_DT_XT + XT_DT_XT: +000f9a 04e9 .dw PFA_DOCONSTANT + PFA_DT_XT: + .endif +000f9b 0f9e .dw XT_R_WORD_INTERPRET +000f9c 0fa2 .dw XT_R_WORD_COMPILE +000f9d 1265 .dw XT_2LITERAL + + ; ( XT flags -- ) + ; Interpreter + ; interpret method for WORD recognizer + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + XT_R_WORD_INTERPRET: +000f9e 011b .dw DO_COLON + PFA_R_WORD_INTERPRET: + .endif +000f9f 0572 .dw XT_DROP ; the flags are in the way +000fa0 04b8 .dw XT_EXECUTE +000fa1 04ae .dw XT_EXIT + + ; ( XT flags -- ) + ; Interpreter + ; Compile method for WORD recognizer + .if cpu_msp430==1 + .endif + .if cpu_avr8==1 + XT_R_WORD_COMPILE: +000fa2 011b .dw DO_COLON + PFA_R_WORD_COMPILE: + .endif +000fa3 05ba .dw XT_ZEROLESS +000fa4 04c7 .dw XT_DOCONDBRANCH +000fa5 0fa8 DEST(PFA_R_WORD_COMPILE1) +000fa6 01dc .dw XT_COMMA +000fa7 04ae .dw XT_EXIT + PFA_R_WORD_COMPILE1: +000fa8 04b8 .dw XT_EXECUTE +000fa9 04ae .dw XT_EXIT + .include "words/dt-null.asm" + + ; Interpreter + ; there is no parser for this recognizer, this is the default and failsafe part + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_DT_NULL: +000faa ff07 .dw $ff07 +000fab 7464 +000fac 6e3a +000fad 6c75 +../../common\words/dt-null.asm(12): warning: .cseg .db misalignment - padding zero byte +000fae 006c .db "dt:null" +000faf 0f95 .dw VE_HEAD + .set VE_HEAD = VE_DT_NULL + XT_DT_NULL: +000fb0 04e9 .dw PFA_DOCONSTANT + PFA_DT_NULL: + .endif +000fb1 0fb4 .dw XT_FAIL ; interpret +000fb2 0fb4 .dw XT_FAIL ; compile +000fb3 0fb4 .dw XT_FAIL ; postpone + + ; ( addr len -- ) + ; Interpreter + ; default failure action: throw exception -13. + .if cpu_msp430==1 + .endif + .if cpu_avr8==1 + ;VE_FAIL: + ; .dw $ff04 + ; .db "fail" + ; .dw VE_HEAD + ; .set VE_HEAD = VE_FAIL + XT_FAIL: +000fb4 011b .dw DO_COLON + PFA_FAIL: + .endif +000fb5 04ce .dw XT_DOLITERAL +000fb6 fff3 .dw -13 +000fb7 0ca7 .dw XT_THROW + + .include "words/q-stack.asm" + + ; Tools + ; check data stack depth and exit to quit if underrun + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_QSTACK: +000fb8 ff06 .dw $ff06 +000fb9 733f +000fba 6174 +000fbb 6b63 .db "?stack" +000fbc 0faa .dw VE_HEAD + .set VE_HEAD = VE_QSTACK + XT_QSTACK: +000fbd 011b .dw DO_COLON + PFA_QSTACK: + .endif +000fbe 0f07 .dw XT_DEPTH +000fbf 05ba .dw XT_ZEROLESS +000fc0 04c7 .dw XT_DOCONDBRANCH +000fc1 0fc5 DEST(PFA_QSTACK1) +000fc2 04ce .dw XT_DOLITERAL +000fc3 fffc .dw -4 +000fc4 0ca7 .dw XT_THROW + PFA_QSTACK1: +000fc5 04ae .dw XT_EXIT + .include "words/ver.asm" + + ; Tools + ; print the version string + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_DOT_VER: +000fc6 ff03 .dw $ff03 +000fc7 6576 +../../common\words/ver.asm(12): warning: .cseg .db misalignment - padding zero byte +000fc8 0072 .db "ver" +000fc9 0fb8 .dw VE_HEAD + .set VE_HEAD = VE_DOT_VER + XT_DOT_VER: +000fca 011b .dw DO_COLON + PFA_DOT_VER: + .endif +000fcb 0971 .dw XT_ENV_FORTHNAME +000fcc 0c06 .dw XT_ITYPE +000fcd 0c48 .dw XT_SPACE +000fce 09b5 .dw XT_BASE +000fcf 0512 .dw XT_FETCH + +000fd0 097f .dw XT_ENV_FORTHVERSION +000fd1 0a42 .dw XT_DECIMAL +000fd2 1255 .dw XT_S2D +000fd3 0b24 .dw XT_L_SHARP +000fd4 0b2c .dw XT_SHARP +000fd5 04ce .dw XT_DOLITERAL +000fd6 002e .dw '.' +000fd7 0b15 .dw XT_HOLD +000fd8 0b42 .dw XT_SHARP_S +000fd9 0b4d .dw XT_SHARP_G +000fda 0c61 .dw XT_TYPE +000fdb 09b5 .dw XT_BASE +000fdc 051a .dw XT_STORE +000fdd 0c48 .dw XT_SPACE +000fde 0987 .dw XT_ENV_CPU +000fdf 0c06 .dw XT_ITYPE + +000fe0 04ae .dw XT_EXIT + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + .include "words/noop.asm" + + ; Tools + ; do nothing + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_NOOP: +000fe1 ff04 .dw $ff04 +000fe2 6f6e +000fe3 706f .db "noop" +000fe4 0fc6 .dw VE_HEAD + .set VE_HEAD = VE_NOOP + XT_NOOP: +000fe5 011b .dw DO_COLON + PFA_NOOP: + .endif +000fe6 04ae .DW XT_EXIT + .include "words/unused.asm" + + ; Tools + ; Amount of available RAM (incl. PAD) + VE_UNUSED: +000fe7 ff06 .dw $ff06 +000fe8 6e75 +000fe9 7375 +000fea 6465 .db "unused" +000feb 0fe1 .dw VE_HEAD + .set VE_HEAD = VE_UNUSED + XT_UNUSED: +000fec 011b .dw DO_COLON + PFA_UNUSED: +000fed 0726 .dw XT_SP_FETCH +000fee 0a24 .dw XT_HERE +000fef 062c .dw XT_MINUS +000ff0 04ae .dw XT_EXIT + + .include "words/to.asm" + + ; Tools + ; store the TOS to the named value (eeprom cell) + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_TO: +000ff1 0002 .dw $0002 +000ff2 6f74 .db "to" +000ff3 0fe7 .dw VE_HEAD + .set VE_HEAD = VE_TO + XT_TO: +000ff4 011b .dw DO_COLON + PFA_TO: + .endif +000ff5 0c70 .dw XT_TICK +000ff6 125e .dw XT_TO_BODY +000ff7 09af .dw XT_STATE +000ff8 0512 .dw XT_FETCH +000ff9 04c7 .dw XT_DOCONDBRANCH +000ffa 1005 DEST(PFA_TO1) +000ffb 01d1 .dw XT_COMPILE +000ffc 0fff .dw XT_DOTO +000ffd 01dc .dw XT_COMMA +000ffe 04ae .dw XT_EXIT + + ; ( n -- ) (R: IP -- IP+1) + ; Tools + ; runtime portion of to + ;VE_DOTO: + ; .dw $ff04 + ; .db "(to)" + ; .dw VE_HEAD + ; .set VE_HEAD = VE_DOTO + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + + XT_DOTO: +000fff 011b .dw DO_COLON + PFA_DOTO: + .endif +001000 058f .dw XT_R_FROM +001001 054a .dw XT_DUP +001002 1011 .dw XT_ICELLPLUS +001003 0598 .dw XT_TO_R +001004 082c .dw XT_FETCHI + PFA_TO1: +001005 054a .dw XT_DUP +001006 1011 .dw XT_ICELLPLUS +001007 1011 .dw XT_ICELLPLUS +001008 082c .dw XT_FETCHI +001009 04b8 .dw XT_EXECUTE +00100a 04ae .dw XT_EXIT + .include "words/i-cellplus.asm" + + ; Compiler + ; skip to the next cell in flash + VE_ICELLPLUS: +00100b ff07 .dw $FF07 +00100c 2d69 +00100d 6563 +00100e 6c6c +00100f 002b .db "i-cell+",0 +001010 0ff1 .dw VE_HEAD + .set VE_HEAD = VE_ICELLPLUS + XT_ICELLPLUS: +001011 011b .dw DO_COLON + PFA_ICELLPLUS: +001012 06c8 .dw XT_1PLUS +001013 04ae .dw XT_EXIT + + .include "words/edefer-fetch.asm" + + ; System + ; does the real defer@ for eeprom defers + VE_EDEFERFETCH: +001014 ff07 .dw $ff07 +001015 6445 +001016 6665 +001017 7265 +001018 0040 .db "Edefer@",0 +001019 100b .dw VE_HEAD + .set VE_HEAD = VE_EDEFERFETCH + XT_EDEFERFETCH: +00101a 011b .dw DO_COLON + PFA_EDEFERFETCH: +00101b 082c .dw XT_FETCHI +00101c 07f9 .dw XT_FETCHE +00101d 04ae .dw XT_EXIT + .include "words/edefer-store.asm" + + ; System + ; does the real defer! for eeprom defers + VE_EDEFERSTORE: +00101e ff07 .dw $ff07 +00101f 6445 +001020 6665 +001021 7265 +001022 0021 .db "Edefer!",0 +001023 1014 .dw VE_HEAD + .set VE_HEAD = VE_EDEFERSTORE + XT_EDEFERSTORE: +001024 011b .dw DO_COLON + PFA_EDEFERSTORE: +001025 082c .dw XT_FETCHI +001026 07d5 .dw XT_STOREE +001027 04ae .dw XT_EXIT + .include "words/rdefer-fetch.asm" + + ; System + ; The defer@ for ram defers + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_RDEFERFETCH: +001028 ff07 .dw $ff07 +001029 6452 +00102a 6665 +00102b 7265 +00102c 0040 .db "Rdefer@",0 +00102d 101e .dw VE_HEAD + .set VE_HEAD = VE_RDEFERFETCH + XT_RDEFERFETCH: +00102e 011b .dw DO_COLON + PFA_RDEFERFETCH: + .endif +00102f 082c .dw XT_FETCHI +001030 0512 .dw XT_FETCH +001031 04ae .dw XT_EXIT + .include "words/rdefer-store.asm" + + ; System + ; The defer! for ram defers + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_RDEFERSTORE: +001032 ff07 .dw $ff07 +001033 6452 +001034 6665 +001035 7265 +001036 0021 .db "Rdefer!",0 +001037 1028 .dw VE_HEAD + .set VE_HEAD = VE_RDEFERSTORE + XT_RDEFERSTORE: +001038 011b .dw DO_COLON + PFA_RDEFERSTORE: + .endif +001039 082c .dw XT_FETCHI +00103a 051a .dw XT_STORE +00103b 04ae .dw XT_EXIT + + .include "words/udefer-fetch.asm" + + ; System + ; does the real defer@ for user based defers + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_UDEFERFETCH: +00103c ff07 .dw $ff07 +00103d 6455 +00103e 6665 +00103f 7265 +001040 0040 .db "Udefer@",0 +001041 1032 .dw VE_HEAD + .set VE_HEAD = VE_UDEFERFETCH + XT_UDEFERFETCH: +001042 011b .dw DO_COLON + PFA_UDEFERFETCH: + .endif +001043 082c .dw XT_FETCHI +001044 079b .dw XT_UP_FETCH +001045 0636 .dw XT_PLUS +001046 0512 .dw XT_FETCH +001047 04ae .dw XT_EXIT + .include "words/udefer-store.asm" + + ; System + ; does the real defer! for user based defers + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_UDEFERSTORE: +001048 ff07 .dw $ff07 +001049 6455 +00104a 6665 +00104b 7265 +00104c 0021 .db "Udefer!",0 +00104d 103c .dw VE_HEAD + .set VE_HEAD = VE_UDEFERSTORE + XT_UDEFERSTORE: +00104e 011b .dw DO_COLON + PFA_UDEFERSTORE: + .endif + +00104f 082c .dw XT_FETCHI +001050 079b .dw XT_UP_FETCH +001051 0636 .dw XT_PLUS +001052 051a .dw XT_STORE +001053 04ae .dw XT_EXIT + + .include "words/defer-store.asm" + + ; System + ; stores xt1 as the xt to be executed when xt2 is called + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_DEFERSTORE: +001054 ff06 .dw $ff06 +001055 6564 +001056 6566 +001057 2172 .db "defer!" +001058 1048 .dw VE_HEAD + .set VE_HEAD = VE_DEFERSTORE + XT_DEFERSTORE: +001059 011b .dw DO_COLON + PFA_DEFERSTORE: + .endif +00105a 125e .dw XT_TO_BODY +00105b 054a .dw XT_DUP +00105c 1011 .dw XT_ICELLPLUS +00105d 1011 .dw XT_ICELLPLUS +00105e 082c .dw XT_FETCHI +00105f 04b8 .dw XT_EXECUTE +001060 04ae .dw XT_EXIT + + .include "words/defer-fetch.asm" + + ; System + ; returns the XT associated with the given XT + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_DEFERFETCH: +001061 ff06 .dw $ff06 +001062 6564 +001063 6566 +001064 4072 .db "defer@" +001065 1054 .dw VE_HEAD + .set VE_HEAD = VE_DEFERFETCH + XT_DEFERFETCH: +001066 011b .dw DO_COLON + PFA_DEFERFETCH: + .endif +001067 125e .dw XT_TO_BODY +001068 054a .dw XT_DUP +001069 1011 .dw XT_ICELLPLUS +00106a 082c .dw XT_FETCHI +00106b 04b8 .dw XT_EXECUTE +00106c 04ae .dw XT_EXIT + .include "words/do-defer.asm" + + ; System + ; runtime of defer + VE_DODEFER: +00106d ff07 .dw $ff07 +00106e 6428 +00106f 6665 +001070 7265 +001071 0029 .db "(defer)", 0 +001072 1061 .dw VE_HEAD + .set VE_HEAD = VE_DODEFER + XT_DODEFER: +001073 011b .dw DO_COLON + PFA_DODEFER: +001074 01ae .dw XT_DOCREATE +001075 030e .dw XT_REVEAL +001076 01d1 .dw XT_COMPILE +001077 1079 .dw PFA_DODEFER1 +001078 04ae .dw XT_EXIT + PFA_DODEFER1: +001079 940e 0327 call_ DO_DODOES +00107b 054a .dw XT_DUP +00107c 1011 .dw XT_ICELLPLUS +00107d 082c .dw XT_FETCHI +00107e 04b8 .dw XT_EXECUTE +00107f 04b8 .dw XT_EXECUTE +001080 04ae .dw XT_EXIT + + ; : (defer) dup i-cell+ @i execute execute ; + + + .include "words/search-wordlist.asm" + + ; Search Order + ; searches the word list wid for the word at c-addr/len + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_SEARCH_WORDLIST: +001081 ff0f .dw $ff0f +001082 6573 +001083 7261 +001084 6863 +001085 772d +001086 726f +001087 6c64 +001088 7369 +001089 0074 .db "search-wordlist",0 +00108a 106d .dw VE_HEAD + .set VE_HEAD = VE_SEARCH_WORDLIST + XT_SEARCH_WORDLIST: +00108b 011b .dw DO_COLON + PFA_SEARCH_WORDLIST: + .endif +00108c 0598 .dw XT_TO_R +00108d 05ed .dw XT_ZERO +00108e 04ce .dw XT_DOLITERAL +00108f 10a0 .dw XT_ISWORD +001090 058f .dw XT_R_FROM +001091 10bd .dw XT_TRAVERSEWORDLIST +001092 054a .dw XT_DUP +001093 05b3 .dw XT_ZEROEQUAL +001094 04c7 .dw XT_DOCONDBRANCH +001095 109a DEST(PFA_SEARCH_WORDLIST1) +001096 09d3 .dw XT_2DROP +001097 0572 .dw XT_DROP +001098 05ed .dw XT_ZERO +001099 04ae .dw XT_EXIT + PFA_SEARCH_WORDLIST1: + ; ... get the XT ... +00109a 054a .dw XT_DUP +00109b 10e4 .dw XT_NFA2CFA + ; .. and get the header flag +00109c 055d .dw XT_SWAP +00109d 0194 .dw XT_NAME2FLAGS +00109e 0182 .dw XT_IMMEDIATEQ +00109f 04ae .dw XT_EXIT + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + XT_ISWORD: +0010a0 011b .dw DO_COLON + PFA_ISWORD: + .endif + ; ( c-addr len 0 nt -- c-addr len 0 true| nt false ) +0010a1 0598 .dw XT_TO_R +0010a2 0572 .dw XT_DROP +0010a3 09ca .dw XT_2DUP +0010a4 05a1 .dw XT_R_FETCH ; -- addr len addr len nt +0010a5 10d8 .dw XT_NAME2STRING +0010a6 10ee .dw XT_ICOMPARE ; (-- addr len f ) +0010a7 04c7 .dw XT_DOCONDBRANCH +0010a8 10ae DEST(PFA_ISWORD3) + ; not now +0010a9 058f .dw XT_R_FROM +0010aa 0572 .dw XT_DROP +0010ab 05ed .dw XT_ZERO +0010ac 05e4 .dw XT_TRUE ; maybe next word +0010ad 04ae .dw XT_EXIT + PFA_ISWORD3: + ; we found the word, now clean up iteration data ... +0010ae 09d3 .dw XT_2DROP +0010af 058f .dw XT_R_FROM +0010b0 05ed .dw XT_ZERO ; finish traverse-wordlist +0010b1 04ae .dw XT_EXIT + .include "words/traverse-wordlist.asm" + + ; Tools Ext (2012) + ; call the xt for every member of the wordlist wid until xt returns false + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_TRAVERSEWORDLIST: +0010b2 ff11 .dw $ff11 +0010b3 7274 +0010b4 7661 +0010b5 7265 +0010b6 6573 +0010b7 772d +0010b8 726f +0010b9 6c64 +0010ba 7369 +0010bb 0074 .db "traverse-wordlist",0 +0010bc 1081 .dw VE_HEAD + .set VE_HEAD = VE_TRAVERSEWORDLIST + XT_TRAVERSEWORDLIST: +0010bd 011b .dw DO_COLON + PFA_TRAVERSEWORDLIST: + + .endif +0010be 07f9 .dw XT_FETCHE + PFA_TRAVERSEWORDLIST1: +0010bf 054a .dw XT_DUP ; ( -- xt nt nt ) +0010c0 04c7 .dw XT_DOCONDBRANCH ; ( -- nt ) is nfa = counted string +0010c1 10ce DEST(PFA_TRAVERSEWORDLIST2) +0010c2 09ca .dw XT_2DUP +0010c3 07b8 .dw XT_2TO_R +0010c4 055d .dw XT_SWAP +0010c5 04b8 .dw XT_EXECUTE +0010c6 07c7 .dw XT_2R_FROM +0010c7 057a .dw XT_ROT +0010c8 04c7 .dw XT_DOCONDBRANCH +0010c9 10ce DEST(PFA_TRAVERSEWORDLIST2) +0010ca 048a .dw XT_NFA2LFA +0010cb 082c .dw XT_FETCHI +0010cc 04bd .dw XT_DOBRANCH ; ( -- addr ) +0010cd 10bf DEST(PFA_TRAVERSEWORDLIST1) ; ( -- addr ) + PFA_TRAVERSEWORDLIST2: +0010ce 09d3 .dw XT_2DROP +0010cf 04ae .dw XT_EXIT + + ; : traverse-wordlist ( i*x xt wid -- i*x' ) + ; begin @ dup + ; while + ; 2dup 2>r + ; swap execute ( i*x nt -- i*x' f ) + ; 2r> rot + ; while + ; nfa>lfa @i + ; repeat then 2drop ; + .include "words/name2string.asm" + + ; Tools Ext (2012) + ; get a (flash) string from a name token nt + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_NAME2STRING: +0010d0 ff0b .dw $ff0b +0010d1 616e +0010d2 656d +0010d3 733e +0010d4 7274 +0010d5 6e69 +0010d6 0067 .db "name>string",0 +0010d7 10b2 .dw VE_HEAD + .set VE_HEAD = VE_NAME2STRING + XT_NAME2STRING: +0010d8 011b .dw DO_COLON + PFA_NAME2STRING: + + .endif +0010d9 0c32 .dw XT_ICOUNT ; ( -- addr n ) +0010da 04ce .dw XT_DOLITERAL +0010db 00ff .dw 255 +0010dc 06ac .dw XT_AND ; mask immediate bit +0010dd 04ae .dw XT_EXIT + .include "words/nfa2cfa.asm" + + ; Tools + ; get the XT from a name token + VE_NFA2CFA: +0010de ff07 .dw $ff07 +0010df 666e +0010e0 3e61 +0010e1 6663 +../../avr8\words/nfa2cfa.asm(6): warning: .cseg .db misalignment - padding zero byte +0010e2 0061 .db "nfa>cfa" +0010e3 10d0 .dw VE_HEAD + .set VE_HEAD = VE_NFA2CFA + XT_NFA2CFA: +0010e4 011b .dw DO_COLON + PFA_NFA2CFA: +0010e5 048a .dw XT_NFA2LFA ; skip to link field +0010e6 06c8 .dw XT_1PLUS ; next is the execution token +0010e7 04ae .dw XT_EXIT + .include "words/icompare.asm" + + ; Tools + ; compares string in RAM with string in flash. f is zero if equal like COMPARE + VE_ICOMPARE: +0010e8 ff08 .dw $ff08 +0010e9 6369 +0010ea 6d6f +0010eb 6170 +0010ec 6572 .db "icompare" +0010ed 10de .dw VE_HEAD + .set VE_HEAD = VE_ICOMPARE + XT_ICOMPARE: +0010ee 011b .dw DO_COLON + PFA_ICOMPARE: +0010ef 0598 .dw XT_TO_R ; ( -- r-addr r-len f-addr) +0010f0 0568 .dw XT_OVER ; ( -- r-addr r-len f-addr r-len) +0010f1 058f .dw XT_R_FROM ; ( -- r-addr r-len f-addr r-len f-len ) +0010f2 05ac .dw XT_NOTEQUAL ; ( -- r-addr r-len f-addr flag ) +0010f3 04c7 .dw XT_DOCONDBRANCH +0010f4 10f9 .dw PFA_ICOMPARE_SAMELEN +0010f5 09d3 .dw XT_2DROP +0010f6 0572 .dw XT_DROP +0010f7 05e4 .dw XT_TRUE +0010f8 04ae .dw XT_EXIT + PFA_ICOMPARE_SAMELEN: +0010f9 055d .dw XT_SWAP ; ( -- r-addr f-addr len ) +0010fa 05ed .dw XT_ZERO +0010fb 029b .dw XT_QDOCHECK +0010fc 04c7 .dw XT_DOCONDBRANCH +0010fd 111c .dw PFA_ICOMPARE_DONE +0010fe 0734 .dw XT_DODO + PFA_ICOMPARE_LOOP: + ; ( r-addr f-addr --) +0010ff 0568 .dw XT_OVER +001100 0512 .dw XT_FETCH + .if WANT_IGNORECASE == 1 + .endif +001101 0568 .dw XT_OVER +001102 082c .dw XT_FETCHI ; ( -- r-addr f-addr r-cc f- cc) + .if WANT_IGNORECASE == 1 + .endif + ; flash strings are zero-padded at the last cell + ; that means: if the flash cell is less $0100, than mask the + ; high byte in the ram cell +001103 054a .dw XT_DUP + ;.dw XT_BYTESWAP +001104 04ce .dw XT_DOLITERAL +001105 0100 .dw $100 +001106 05f5 .dw XT_ULESS +001107 04c7 .dw XT_DOCONDBRANCH +001108 110d .dw PFA_ICOMPARE_LASTCELL +001109 055d .dw XT_SWAP +00110a 04ce .dw XT_DOLITERAL +00110b 00ff .dw $00FF +00110c 06ac .dw XT_AND ; the final swap can be omitted + PFA_ICOMPARE_LASTCELL: +00110d 05ac .dw XT_NOTEQUAL +00110e 04c7 .dw XT_DOCONDBRANCH +00110f 1114 .dw PFA_ICOMPARE_NEXTLOOP +001110 09d3 .dw XT_2DROP +001111 05e4 .dw XT_TRUE +001112 076d .dw XT_UNLOOP +001113 04ae .dw XT_EXIT + PFA_ICOMPARE_NEXTLOOP: +001114 06c8 .dw XT_1PLUS +001115 055d .dw XT_SWAP +001116 09c2 .dw XT_CELLPLUS +001117 055d .dw XT_SWAP +001118 04ce .dw XT_DOLITERAL +001119 0002 .dw 2 +00111a 0753 .dw XT_DOPLUSLOOP +00111b 10ff .dw PFA_ICOMPARE_LOOP + PFA_ICOMPARE_DONE: +00111c 09d3 .dw XT_2DROP +00111d 05ed .dw XT_ZERO +00111e 04ae .dw XT_EXIT + + .if WANT_IGNORECASE == 1 + .endif + + .include "words/star.asm" + + ; Arithmetics + ; multiply routine + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_STAR: +00111f ff01 .dw $ff01 +001120 002a .db "*",0 +001121 10e8 .dw VE_HEAD + .set VE_HEAD = VE_STAR + XT_STAR: +001122 011b .dw DO_COLON + PFA_STAR: + .endif + +001123 063f .dw XT_MSTAR +001124 0572 .dw XT_DROP +001125 04ae .dw XT_EXIT + .include "words/j.asm" + + ; Compiler + ; loop counter of outer loop + VE_J: +001126 ff01 .dw $FF01 +001127 006a .db "j",0 +001128 111f .dw VE_HEAD + .set VE_HEAD = VE_J + XT_J: +001129 011b .dw DO_COLON + PFA_J: +00112a 070f .dw XT_RP_FETCH +00112b 04ce .dw XT_DOLITERAL +00112c 0007 .dw 7 +00112d 0636 .dw XT_PLUS +00112e 0512 .dw XT_FETCH +00112f 070f .dw XT_RP_FETCH +001130 04ce .dw XT_DOLITERAL +001131 0009 .dw 9 +001132 0636 .dw XT_PLUS +001133 0512 .dw XT_FETCH +001134 0636 .dw XT_PLUS +001135 04ae .dw XT_EXIT + + .include "words/dabs.asm" + + ; Arithmetics + ; double cell absolute value + VE_DABS: +001136 ff04 .dw $ff04 +001137 6164 +001138 7362 .db "dabs" +001139 1126 .dw VE_HEAD + .set VE_HEAD = VE_DABS + XT_DABS: +00113a 011b .dw DO_COLON + PFA_DABS: +00113b 054a .dw XT_DUP +00113c 05ba .dw XT_ZEROLESS +00113d 04c7 .dw XT_DOCONDBRANCH +00113e 1140 .dw PFA_DABS1 +00113f 1147 .dw XT_DNEGATE + PFA_DABS1: +001140 04ae .dw XT_EXIT + ; : dabs ( ud1 -- +d2 ) dup 0< if dnegate then ; + .include "words/dnegate.asm" + + ; Arithmetics + ; double cell negation + VE_DNEGATE: +001141 ff07 .dw $ff07 +001142 6e64 +001143 6765 +001144 7461 +001145 0065 .db "dnegate",0 +001146 1136 .dw VE_HEAD + .set VE_HEAD = VE_DNEGATE + XT_DNEGATE: +001147 011b .dw DO_COLON + PFA_DNEGATE: +001148 089f .dw XT_DINVERT +001149 1274 .dw XT_ONE +00114a 05ed .dw XT_ZERO +00114b 0879 .dw XT_DPLUS +00114c 04ae .dw XT_EXIT + ; : dnegate ( ud1 -- ud2 ) dinvert 1. d+ ; + .include "words/cmove.asm" + + ; Memory + ; copy data in RAM, from lower to higher addresses + VE_CMOVE: +00114d ff05 .dw $ff05 +00114e 6d63 +00114f 766f +001150 0065 .db "cmove",0 +001151 1141 .dw VE_HEAD + .set VE_HEAD = VE_CMOVE + XT_CMOVE: +001152 1153 .dw PFA_CMOVE + PFA_CMOVE: +001153 93bf push xh +001154 93af push xl +001155 91e9 ld zl, Y+ +001156 91f9 ld zh, Y+ ; addr-to +001157 91a9 ld xl, Y+ +001158 91b9 ld xh, Y+ ; addr-from +001159 2f09 mov temp0, tosh +00115a 2b08 or temp0, tosl +00115b f021 brbs 1, PFA_CMOVE1 + PFA_CMOVE2: +00115c 911d ld temp1, X+ +00115d 9311 st Z+, temp1 +00115e 9701 sbiw tosl, 1 +00115f f7e1 brbc 1, PFA_CMOVE2 + PFA_CMOVE1: +001160 91af pop xl +001161 91bf pop xh +001162 9189 +001163 9199 loadtos +001164 940c 011f jmp_ DO_NEXT + .include "words/2swap.asm" + + ; Stack + ; Exchange the two top cell pairs + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_2SWAP: +001166 ff05 .dw $ff05 +001167 7332 +001168 6177 +001169 0070 .db "2swap",0 +00116a 114d .dw VE_HEAD + .set VE_HEAD = VE_2SWAP + XT_2SWAP: +00116b 011b .dw DO_COLON + PFA_2SWAP: + + .endif +00116c 057a .dw XT_ROT +00116d 0598 .dw XT_TO_R +00116e 057a .dw XT_ROT +00116f 058f .dw XT_R_FROM +001170 04ae .dw XT_EXIT + + .include "words/tib.asm" + + ; System + ; refills the input buffer + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_REFILLTIB: +001171 ff0a .dw $ff0a +001172 6572 +001173 6966 +001174 6c6c +001175 742d +001176 6269 .db "refill-tib" +001177 1166 .dw VE_HEAD + .set VE_HEAD = VE_REFILLTIB + XT_REFILLTIB: +001178 011b .dw DO_COLON + PFA_REFILLTIB: + .endif +001179 1194 .dw XT_TIB +00117a 04ce .dw XT_DOLITERAL +00117b 005a .dw TIB_SIZE +00117c 0cf7 .dw XT_ACCEPT +00117d 119a .dw XT_NUMBERTIB +00117e 051a .dw XT_STORE +00117f 05ed .dw XT_ZERO +001180 09e3 .dw XT_TO_IN +001181 051a .dw XT_STORE +001182 05e4 .dw XT_TRUE ; -1 +001183 04ae .dw XT_EXIT + + ; ( -- addr n ) + ; System + ; address and current length of the input buffer + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_SOURCETIB: +001184 ff0a .dw $FF0A +001185 6f73 +001186 7275 +001187 6563 +001188 742d +001189 6269 .db "source-tib" +00118a 1171 .dw VE_HEAD + .set VE_HEAD = VE_SOURCETIB + XT_SOURCETIB: +00118b 011b .dw DO_COLON + PFA_SOURCETIB: + .endif +00118c 1194 .dw XT_TIB +00118d 119a .dw XT_NUMBERTIB +00118e 0512 .dw XT_FETCH +00118f 04ae .dw XT_EXIT + + ; ( -- addr ) + ; System Variable + ; terminal input buffer address + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_TIB: +001190 ff03 .dw $ff03 +001191 6974 +001192 0062 .db "tib",0 +001193 1184 .dw VE_HEAD + .set VE_HEAD = VE_TIB + XT_TIB: +001194 04dc .dw PFA_DOVARIABLE + PFA_TIB: +001195 0285 .dw ram_tib + .dseg +000285 ram_tib: .byte TIB_SIZE + .cseg + .endif + + ; ( -- addr ) + ; System Variable + ; variable holding the number of characters in TIB + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_NUMBERTIB: +001196 ff04 .dw $ff04 +001197 7423 +001198 6269 .db "#tib" +001199 1190 .dw VE_HEAD + .set VE_HEAD = VE_NUMBERTIB + XT_NUMBERTIB: +00119a 04dc .dw PFA_DOVARIABLE + PFA_NUMBERTIB: +00119b 02df .dw ram_sharptib + .dseg +0002df ram_sharptib: .byte 2 + .cseg + .endif + + .include "words/init-ram.asm" + + ; Tools + ; copy len cells from eeprom to ram + VE_EE2RAM: +00119c ff06 .dw $ff06 +00119d 6565 +00119e 723e +00119f 6d61 .db "ee>ram" +0011a0 1196 .dw VE_HEAD + .set VE_HEAD = VE_EE2RAM + XT_EE2RAM: +0011a1 011b .dw DO_COLON + PFA_EE2RAM: ; ( -- ) +0011a2 05ed .dw XT_ZERO +0011a3 0734 .dw XT_DODO + PFA_EE2RAM_1: + ; ( -- e-addr r-addr ) +0011a4 0568 .dw XT_OVER +0011a5 07f9 .dw XT_FETCHE +0011a6 0568 .dw XT_OVER +0011a7 051a .dw XT_STORE +0011a8 09c2 .dw XT_CELLPLUS +0011a9 055d .dw XT_SWAP +0011aa 09c2 .dw XT_CELLPLUS +0011ab 055d .dw XT_SWAP +0011ac 0762 .dw XT_DOLOOP +0011ad 11a4 .dw PFA_EE2RAM_1 + PFA_EE2RAM_2: +0011ae 09d3 .dw XT_2DROP +0011af 04ae .dw XT_EXIT + + ; ( -- ) + ; Tools + ; setup the default user area from eeprom + VE_INIT_RAM: +0011b0 ff08 .dw $ff08 +0011b1 6e69 +0011b2 7469 +0011b3 722d +0011b4 6d61 .db "init-ram" +0011b5 119c .dw VE_HEAD + .set VE_HEAD = VE_INIT_RAM + XT_INIT_RAM: +0011b6 011b .dw DO_COLON + PFA_INI_RAM: ; ( -- ) +0011b7 04ce .dw XT_DOLITERAL +0011b8 00a8 .dw EE_INITUSER +0011b9 079b .dw XT_UP_FETCH +0011ba 04ce .dw XT_DOLITERAL +0011bb 0022 .dw SYSUSERSIZE +0011bc 069d .dw XT_2SLASH +0011bd 11a1 .dw XT_EE2RAM +0011be 04ae .dw XT_EXIT + .include "dict/compiler2.inc" + + ; included almost independently from each other + ; on a include-per-use basis + ; + .if DICT_COMPILER2 == 0 + .set DICT_COMPILER2 = 1 + + .include "words/set-current.asm" + + ; Search Order + ; set current word list to the given word list wid + VE_SET_CURRENT: +0011bf ff0b .dw $ff0b +0011c0 6573 +0011c1 2d74 +0011c2 7563 +0011c3 7272 +0011c4 6e65 +0011c5 0074 .db "set-current",0 +0011c6 11b0 .dw VE_HEAD + .set VE_HEAD = VE_SET_CURRENT + XT_SET_CURRENT: +0011c7 011b .dw DO_COLON + PFA_SET_CURRENT: +0011c8 04ce .dw XT_DOLITERAL +0011c9 0084 .dw CFG_CURRENT +0011ca 07d5 .dw XT_STOREE +0011cb 04ae .dw XT_EXIT + .include "words/wordlist.asm" + + ; Search Order + ; create a new, empty wordlist + VE_WORDLIST: +0011cc ff08 .dw $ff08 +0011cd 6f77 +0011ce 6472 +0011cf 696c +0011d0 7473 .db "wordlist" +0011d1 11bf .dw VE_HEAD + .set VE_HEAD = VE_WORDLIST + XT_WORDLIST: +0011d2 011b .dw DO_COLON + PFA_WORDLIST: +0011d3 0a1c .dw XT_EHERE +0011d4 05ed .dw XT_ZERO +0011d5 0568 .dw XT_OVER +0011d6 07d5 .dw XT_STOREE +0011d7 054a .dw XT_DUP +0011d8 09c2 .dw XT_CELLPLUS +0011d9 0fff .dw XT_DOTO +0011da 0a1d .dw PFA_EHERE +0011db 04ae .dw XT_EXIT + + .include "words/forth-wordlist.asm" + + ; Search Order + ; get the system default word list + VE_FORTHWORDLIST: +0011dc ff0e .dw $ff0e +0011dd 6f66 +0011de 7472 +0011df 2d68 +0011e0 6f77 +0011e1 6472 +0011e2 696c +0011e3 7473 .db "forth-wordlist" +0011e4 11cc .dw VE_HEAD + .set VE_HEAD = VE_FORTHWORDLIST + XT_FORTHWORDLIST: +0011e5 04dc .dw PFA_DOVARIABLE + PFA_FORTHWORDLIST: +0011e6 0086 .dw CFG_FORTHWORDLIST + .include "words/set-order.asm" + + ; Search Order + ; replace the search order list + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_SET_ORDER: +0011e7 ff09 .dw $ff09 +0011e8 6573 +0011e9 2d74 +0011ea 726f +0011eb 6564 +0011ec 0072 .db "set-order",0 +0011ed 11dc .dw VE_HEAD + .set VE_HEAD = VE_SET_ORDER + XT_SET_ORDER: +0011ee 011b .dw DO_COLON + PFA_SET_ORDER: + .endif +0011ef 04ce .dw XT_DOLITERAL +0011f0 0088 .dw CFG_ORDERLISTLEN +0011f1 03fe .dw XT_SET_STACK +0011f2 04ae .dw XT_EXIT + + .include "words/set-recognizer.asm" + + ; Interpreter + ; replace the recognizer list + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_SET_RECOGNIZERS: +0011f3 ff0f .dw $ff0f +0011f4 6573 +0011f5 2d74 +0011f6 6572 +0011f7 6f63 +0011f8 6e67 +0011f9 7a69 +0011fa 7265 +0011fb 0073 .db "set-recognizers",0 +0011fc 11e7 .dw VE_HEAD + .set VE_HEAD = VE_SET_RECOGNIZERS + XT_SET_RECOGNIZERS: +0011fd 011b .dw DO_COLON + PFA_SET_RECOGNIZERS: + .endif +0011fe 04ce .dw XT_DOLITERAL +0011ff 009a .dw CFG_RECOGNIZERLISTLEN +001200 03fe .dw XT_SET_STACK +001201 04ae .dw XT_EXIT + + .include "words/get-recognizer.asm" + + ; Interpreter + ; Get the current recognizer list + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_GET_RECOGNIZERS: +001202 ff0f .dw $ff0f +001203 6567 +001204 2d74 +001205 6572 +001206 6f63 +001207 6e67 +001208 7a69 +001209 7265 +00120a 0073 .db "get-recognizers",0 +00120b 11f3 .dw VE_HEAD + .set VE_HEAD = VE_GET_RECOGNIZERS + XT_GET_RECOGNIZERS: +00120c 011b .dw DO_COLON + PFA_GET_RECOGNIZERS: + .endif +00120d 04ce .dw XT_DOLITERAL +00120e 009a .dw CFG_RECOGNIZERLISTLEN +00120f 03dd .dw XT_GET_STACK +001210 04ae .dw XT_EXIT + .include "words/code.asm" + + ; Compiler + ; create named entry in the dictionary, XT is the data field + VE_CODE: +001211 ff04 .dw $ff04 +001212 6f63 +001213 6564 .db "code" +001214 1202 .dw VE_HEAD + .set VE_HEAD = VE_CODE + XT_CODE: +001215 011b .dw DO_COLON + PFA_CODE: +001216 01ae .dw XT_DOCREATE +001217 030e .dw XT_REVEAL +001218 0a13 .dw XT_DP +001219 1011 .dw XT_ICELLPLUS +00121a 01dc .dw XT_COMMA +00121b 04ae .dw XT_EXIT + .include "words/end-code.asm" + + ; Compiler + ; finish a code definition + VE_ENDCODE: +00121c ff08 .dw $ff08 +00121d 6e65 +00121e 2d64 +00121f 6f63 +001220 6564 .db "end-code" +001221 1211 .dw VE_HEAD + .set VE_HEAD = VE_ENDCODE + XT_ENDCODE: +001222 011b .dw DO_COLON + PFA_ENDCODE: +001223 01d1 .dw XT_COMPILE +001224 940c .dw $940c +001225 01d1 .dw XT_COMPILE +001226 011f .dw DO_NEXT +001227 04ae .dw XT_EXIT + .include "words/marker.asm" + + ; System Value + ; The eeprom address until which MARKER saves and restores the eeprom data. + VE_MARKER: +001228 ff08 .dw $ff08 +001229 6d28 +00122a 7261 +00122b 656b +00122c 2972 .db "(marker)" +00122d 121c .dw VE_HEAD + .set VE_HEAD = VE_MARKER + XT_MARKER: +00122e 0509 .dw PFA_DOVALUE1 + PFA_MARKER: +00122f 00a6 .dw EE_MARKER +001230 101a .dw XT_EDEFERFETCH +001231 1024 .dw XT_EDEFERSTORE + .include "words/postpone.asm" + + ; Compiler + ; Append the compilation semantics of "name" to the dictionary + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_POSTPONE: +001232 0008 .dw $0008 +001233 6f70 +001234 7473 +001235 6f70 +001236 656e .db "postpone" +001237 1228 .dw VE_HEAD + .set VE_HEAD = VE_POSTPONE + XT_POSTPONE: +001238 011b .dw DO_COLON + PFA_POSTPONE: + .endif +001239 0e1a .dw XT_PARSENAME +00123a 0f32 .dw XT_FORTHRECOGNIZER +00123b 0f3d .dw XT_RECOGNIZE +00123c 054a .dw XT_DUP +00123d 0598 .dw XT_TO_R +00123e 1011 .dw XT_ICELLPLUS +00123f 1011 .dw XT_ICELLPLUS +001240 082c .dw XT_FETCHI +001241 04b8 .dw XT_EXECUTE +001242 058f .dw XT_R_FROM +001243 1011 .dw XT_ICELLPLUS +001244 082c .dw XT_FETCHI +001245 01dc .dw XT_COMMA +001246 04ae .dw XT_EXIT + .endif + .include "words/bounds.asm" + + ; Tools + ; convert a string to an address range + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_BOUNDS: +001247 ff06 .dw $ff06 +001248 6f62 +001249 6e75 +00124a 7364 .db "bounds" +00124b 1232 .dw VE_HEAD + .set VE_HEAD = VE_BOUNDS + XT_BOUNDS: +00124c 011b .dw DO_COLON + PFA_BOUNDS: + .endif +00124d 0568 .dw XT_OVER +00124e 0636 .dw XT_PLUS +00124f 055d .dw XT_SWAP +001250 04ae .dw XT_EXIT + .include "words/s-to-d.asm" + + ; Conversion + ; extend (signed) single cell value to double cell + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_S2D: +001251 ff03 .dw $ff03 +001252 3e73 +001253 0064 .db "s>d",0 +001254 1247 .dw VE_HEAD + .set VE_HEAD = VE_S2D + XT_S2D: +001255 011b .dw DO_COLON + PFA_S2D: + .endif +001256 054a .dw XT_DUP +001257 05ba .dw XT_ZEROLESS +001258 04ae .dw XT_EXIT + .include "words/to-body.asm" + + ; Core + ; get body from XT + VE_TO_BODY: +001259 ff05 .dw $ff05 +00125a 623e +00125b 646f +00125c 0079 .db ">body",0 +00125d 1251 .dw VE_HEAD + .set VE_HEAD = VE_TO_BODY + XT_TO_BODY: +00125e 06c9 .dw PFA_1PLUS + .elif AMFORTH_NRWW_SIZE>4000 + .elif AMFORTH_NRWW_SIZE>2000 + .else + .endif + ; now colon words + ;;;;;;;;;;;;;;;;;;;;;;;; + .include "words/2literal.asm" + + ; Compiler + ; compile a cell pair literal in colon definitions + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_2LITERAL: +00125f 0008 .dw $0008 +001260 6c32 +001261 7469 +001262 7265 +001263 6c61 .db "2literal" +001264 1259 .dw VE_HEAD + .set VE_HEAD = VE_2LITERAL + XT_2LITERAL: +001265 011b .dw DO_COLON + PFA_2LITERAL: + .endif +001266 055d .dw XT_SWAP +001267 01f2 .dw XT_LITERAL +001268 01f2 .dw XT_LITERAL +001269 04ae .dw XT_EXIT + .include "words/equal.asm" + + ; Compare + ; compares two values for equality + VE_EQUAL: +00126a ff01 .dw $ff01 +00126b 003d .db "=",0 +00126c 125f .dw VE_HEAD + .set VE_HEAD = VE_EQUAL + XT_EQUAL: +00126d 011b .dw DO_COLON + PFA_EQUAL: +00126e 062c .dw XT_MINUS +00126f 05b3 .dw XT_ZEROEQUAL +001270 04ae .dw XT_EXIT + .include "words/num-constants.asm" + + .endif + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_ONE: +001271 ff01 .dw $ff01 +001272 0031 .db "1",0 +001273 126a .dw VE_HEAD + .set VE_HEAD = VE_ONE + XT_ONE: +001274 04dc .dw PFA_DOVARIABLE + PFA_ONE: + .endif +001275 0001 .DW 1 + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_TWO: +001276 ff01 .dw $ff01 +001277 0032 .db "2",0 +001278 1271 .dw VE_HEAD + .set VE_HEAD = VE_TWO + XT_TWO: +001279 04dc .dw PFA_DOVARIABLE + PFA_TWO: + .endif +00127a 0002 .DW 2 + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_MINUSONE: +00127b ff02 .dw $ff02 +00127c 312d .db "-1" +00127d 1276 .dw VE_HEAD + .set VE_HEAD = VE_MINUSONE + XT_MINUSONE: +00127e 04dc .dw PFA_DOVARIABLE + PFA_MINUSONE: + .endif +00127f ffff .DW -1 + .include "dict_appl_core.inc" + + ; do not delete it! + + + .set DPSTART = pc + .set flashlast = pc + + .dseg + HERESTART: + .eseg + .include "amforth-eeprom.inc" +000072 ff ff + ; some configs +000074 80 12 CFG_DP: .dw DPSTART ; Dictionary Pointer +000076 e1 02 EE_HERE: .dw HERESTART ; Memory Allocation +000078 cc 00 EE_EHERE: .dw EHERESTART ; EEProm Memory Allocation +00007a 43 04 CFG_WLSCOPE: .dw XT_GET_CURRENT ; default wordlist scope +00007c 9a 00 CFG_FORTHRECOGNIZER: .dw CFG_RECOGNIZERLISTLEN ; Recognizer word set + ; LEAVE stack is between data stack and return stack. +00007e b0 21 CFG_LP0: .dw stackstart+1 +000080 98 04 CFG_TURNKEY: .dw XT_APPLTURNKEY ; TURNKEY +000082 96 09 CFG_ENVIRONMENT:.dw VE_ENVHEAD ; environmental queries +000084 86 00 CFG_CURRENT: .dw CFG_FORTHWORDLIST ; forth-wordlist +000086 7b 12 CFG_FORTHWORDLIST:.dw VE_HEAD ; pre-defined (compiled in) wordlist + CFG_ORDERLISTLEN: +000088 01 00 .dw 1 + CFG_ORDERLIST: ; list of wordlist id, exactly numwordlist entries +00008a 86 00 .dw CFG_FORTHWORDLIST ; get/set-order +00008c .byte (NUMWORDLISTS-1)*CELLSIZE ; one slot is already used + CFG_RECOGNIZERLISTLEN: +00009a 02 00 .dw 2 + CFG_RECOGNIZERLIST: +00009c 8a 0f .dw XT_REC_FIND +00009e 76 0f .dw XT_REC_NUM +0000a0 .byte (NUMRECOGNIZERS-2)*CELLSIZE ; two slots are already used + + EE_STOREI: +0000a4 15 08 .dw XT_DO_STOREI ; Store a cell into flash + + ; MARKER saves everything up to here. Nothing beyond gets saved + EE_MARKER: +0000a6 a6 00 .dw EE_MARKER + + ; default user area + EE_INITUSER: +0000a8 00 00 .dw 0 ; USER_STATE +0000aa 00 00 .dw 0 ; USER_FOLLOWER +0000ac ff 21 .dw rstackstart ; USER_RP +0000ae af 21 .dw stackstart ; USER_SP0 +0000b0 af 21 .dw stackstart ; USER_SP + +0000b2 00 00 .dw 0 ; USER_HANDLER +0000b4 0a 00 .dw 10 ; USER_BASE + +0000b6 e1 00 .dw XT_TX ; USER_EMIT +0000b8 ef 00 .dw XT_TXQ ; USER_EMITQ +0000ba b6 00 .dw XT_RX ; USER_KEY +0000bc d1 00 .dw XT_RXQ ; USER_KEYQ +0000be 8b 11 .dw XT_SOURCETIB ; USER_SOURCE +0000c0 00 00 .dw 0 ; USER_G_IN +0000c2 78 11 .dw XT_REFILLTIB ; USER_REFILL +0000c4 50 0e .dw XT_DEFAULT_PROMPTOK +0000c6 6f 0e .dw XT_DEFAULT_PROMPTERROR +0000c8 5f 0e .dw XT_DEFAULT_PROMPTREADY + + ; calculate baud rate error + .equ UBRR_VAL = ((F_CPU+BAUD*8)/(BAUD*16)-1) ; smart round + .equ BAUD_REAL = (F_CPU/(16*(UBRR_VAL+1))) ; effective baud rate + .equ BAUD_ERROR = ((BAUD_REAL*1000)/BAUD-1000) ; error in pro mille + + .if ((BAUD_ERROR>BAUD_MAXERROR) || (BAUD_ERROR<-BAUD_MAXERROR)) + .endif + EE_UBRRVAL: +0000ca 17 00 .dw UBRR_VAL ; BAUDRATE + ; 1st free address in EEPROM. + EHERESTART: + + .cseg + + +RESOURCE USE INFORMATION +------------------------ + +Notice: +The register and instruction counts are symbol table hit counts, +and hence implicitly used resources are not counted, eg, the +'lpm' instruction without operands implicitly uses r0 and z, +none of which are counted. + +x,y,z are separate entities in the symbol table and are +counted separately from r26..r31 here. + +.dseg memory usage only counts static data declared with .byte + +"ATmega2561" register use summary: +r0 : 26 r1 : 5 r2 : 9 r3 : 12 r4 : 4 r5 : 1 r6 : 0 r7 : 0 +r8 : 0 r9 : 0 r10: 1 r11: 6 r12: 0 r13: 0 r14: 22 r15: 20 +r16: 77 r17: 57 r18: 52 r19: 37 r20: 13 r21: 38 r22: 11 r23: 4 +r24: 187 r25: 133 r26: 28 r27: 17 r28: 7 r29: 4 r30: 81 r31: 41 +x : 4 y : 203 z : 41 +Registers used: 29 out of 35 (82.9%) + +"ATmega2561" instruction use summary: +.lds : 0 .sts : 0 adc : 22 add : 17 adiw : 17 and : 4 +andi : 3 asr : 2 bclr : 0 bld : 0 brbc : 2 brbs : 7 +brcc : 2 brcs : 1 break : 0 breq : 6 brge : 1 brhc : 0 +brhs : 0 brid : 0 brie : 0 brlo : 1 brlt : 3 brmi : 3 +brne : 13 brpl : 0 brsh : 0 brtc : 0 brts : 0 brvc : 0 +brvs : 2 bset : 0 bst : 0 call : 1 cbi : 0 cbr : 0 +clc : 1 clh : 0 cli : 5 cln : 0 clr : 21 cls : 0 +clt : 0 clv : 0 clz : 0 com : 14 cp : 11 cpc : 10 +cpi : 2 cpse : 0 dec : 10 eicall: 1 eijmp : 0 elpm : 16 +eor : 3 fmul : 0 fmuls : 0 fmulsu: 0 icall : 0 ijmp : 1 +in : 14 inc : 3 jmp : 8 ld : 136 ldd : 4 ldi : 31 +lds : 1 lpm : 0 lsl : 14 lsr : 2 mov : 15 movw : 65 +mul : 5 muls : 1 mulsu : 2 neg : 0 nop : 1 or : 9 +ori : 0 out : 26 pop : 47 push : 39 rcall : 69 ret : 6 +reti : 1 rjmp : 102 rol : 32 ror : 5 sbc : 9 sbci : 3 +sbi : 3 sbic : 3 sbis : 0 sbiw : 7 sbr : 0 sbrc : 4 +sbrs : 3 sec : 1 seh : 0 sei : 1 sen : 0 ser : 3 +ses : 0 set : 0 sev : 0 sez : 0 sleep : 0 spm : 2 +st : 74 std : 8 sts : 1 sub : 6 subi : 3 swap : 0 +tst : 0 wdr : 0 +Instructions used: 71 out of 116 (61.2%) + +"ATmega2561" memory use summary [bytes]: +Segment Begin End Code Data Used Size Use% +--------------------------------------------------------------- +[.cseg] 0x000000 0x03e07e 1962 12820 14782 262144 5.6% +[.dseg] 0x000200 0x0002e1 0 225 225 8192 2.7% +[.eseg] 0x000000 0x0000cc 0 204 204 4096 5.0% + +Assembly complete, 0 errors, 8 warnings diff --git a/amforth-6.5/appl/atmega2561/atmega256.map b/amforth-6.5/appl/atmega2561/atmega256.map new file mode 100644 index 0000000..b8ce7fe --- /dev/null +++ b/amforth-6.5/appl/atmega2561/atmega256.map @@ -0,0 +1,2503 @@ + +AVRASM ver. 2.1.52 atmega256.asm Sun Apr 30 20:10:15 2017 + + +SET DICT_COMPILER2 00000001 +SET cpu_msp430 00000000 +SET cpu_avr8 00000001 +SET USER_STATE 00000000 +SET USER_FOLLOWER 00000002 +SET USER_RP 00000004 +SET USER_SP0 00000006 +SET USER_SP 00000008 +SET USER_HANDLER 0000000a +SET USER_BASE 0000000c +SET USER_EMIT 0000000e +SET USER_EMITQ 00000010 +SET USER_KEY 00000012 +SET USER_KEYQ 00000014 +SET USER_SOURCE 00000016 +SET USER_TO_IN 00000018 +SET USER_REFILL 0000001a +SET USER_P_OK 0000001c +SET USER_P_ERR 0000001e +SET USER_P_RDY 00000020 +SET SYSUSERSIZE 00000022 +DEF zerol r2 +DEF zeroh r3 +DEF upl r4 +DEF uph r5 +DEF al r6 +DEF ah r7 +DEF bl r8 +DEF bh r9 +DEF mcu_boot r10 +DEF isrflag r11 +DEF temp4 r14 +DEF temp5 r15 +DEF temp0 r16 +DEF temp1 r17 +DEF temp2 r18 +DEF temp3 r19 +DEF temp6 r20 +DEF temp7 r21 +DEF tosl r24 +DEF tosh r25 +DEF wl r22 +DEF wh r23 +EQU SIGNATURE_000 0000001e +EQU SIGNATURE_001 00000098 +EQU SIGNATURE_002 00000002 +EQU UDR3 00000136 +EQU UBRR3H 00000135 +EQU UBRR3L 00000134 +EQU UCSR3C 00000132 +EQU UCSR3B 00000131 +EQU UCSR3A 00000130 +EQU OCR5CL 0000012c +EQU OCR5CH 0000012d +EQU OCR5BL 0000012a +EQU OCR5BH 0000012b +EQU OCR5AL 00000128 +EQU OCR5AH 00000129 +EQU ICR5H 00000127 +EQU ICR5L 00000126 +EQU TCNT5L 00000124 +EQU TCNT5H 00000125 +EQU TCCR5C 00000122 +EQU TCCR5B 00000121 +EQU TCCR5A 00000120 +EQU PORTL 0000010b +EQU DDRL 0000010a +EQU PINL 00000109 +EQU PORTK 00000108 +EQU DDRK 00000107 +EQU PINK 00000106 +EQU PORTJ 00000105 +EQU DDRJ 00000104 +EQU PINJ 00000103 +EQU PORTH 00000102 +EQU DDRH 00000101 +EQU PINH 00000100 +EQU UDR2 000000d6 +EQU UBRR2H 000000d5 +EQU UBRR2L 000000d4 +EQU UCSR2C 000000d2 +EQU UCSR2B 000000d1 +EQU UCSR2A 000000d0 +EQU UDR1 000000ce +EQU UBRR1L 000000cc +EQU UBRR1H 000000cd +EQU UCSR1C 000000ca +EQU UCSR1B 000000c9 +EQU UCSR1A 000000c8 +EQU UDR0 000000c6 +EQU UBRR0L 000000c4 +EQU UBRR0H 000000c5 +EQU UCSR0C 000000c2 +EQU UCSR0B 000000c1 +EQU UCSR0A 000000c0 +EQU TWAMR 000000bd +EQU TWCR 000000bc +EQU TWDR 000000bb +EQU TWAR 000000ba +EQU TWSR 000000b9 +EQU TWBR 000000b8 +EQU ASSR 000000b6 +EQU OCR2B 000000b4 +EQU OCR2A 000000b3 +EQU TCNT2 000000b2 +EQU TCCR2B 000000b1 +EQU TCCR2A 000000b0 +EQU OCR4CL 000000ac +EQU OCR4CH 000000ad +EQU OCR4BL 000000aa +EQU OCR4BH 000000ab +EQU OCR4AL 000000a8 +EQU OCR4AH 000000a9 +EQU ICR4L 000000a6 +EQU ICR4H 000000a7 +EQU TCNT4L 000000a4 +EQU TCNT4H 000000a5 +EQU TCCR4C 000000a2 +EQU TCCR4B 000000a1 +EQU TCCR4A 000000a0 +EQU OCR3CL 0000009c +EQU OCR3CH 0000009d +EQU OCR3BL 0000009a +EQU OCR3BH 0000009b +EQU OCR3AL 00000098 +EQU OCR3AH 00000099 +EQU ICR3L 00000096 +EQU ICR3H 00000097 +EQU TCNT3L 00000094 +EQU TCNT3H 00000095 +EQU TCCR3C 00000092 +EQU TCCR3B 00000091 +EQU TCCR3A 00000090 +EQU OCR1CL 0000008c +EQU OCR1CH 0000008d +EQU OCR1BL 0000008a +EQU OCR1BH 0000008b +EQU OCR1AL 00000088 +EQU OCR1AH 00000089 +EQU ICR1L 00000086 +EQU ICR1H 00000087 +EQU TCNT1L 00000084 +EQU TCNT1H 00000085 +EQU TCCR1C 00000082 +EQU TCCR1B 00000081 +EQU TCCR1A 00000080 +EQU DIDR1 0000007f +EQU DIDR0 0000007e +EQU DIDR2 0000007d +EQU ADMUX 0000007c +EQU ADCSRB 0000007b +EQU ADCSRA 0000007a +EQU ADCH 00000079 +EQU ADCL 00000078 +EQU XMCRB 00000075 +EQU XMCRA 00000074 +EQU TIMSK5 00000073 +EQU TIMSK4 00000072 +EQU TIMSK3 00000071 +EQU TIMSK2 00000070 +EQU TIMSK1 0000006f +EQU TIMSK0 0000006e +EQU PCMSK2 0000006d +EQU PCMSK1 0000006c +EQU PCMSK0 0000006b +EQU EICRB 0000006a +EQU EICRA 00000069 +EQU PCICR 00000068 +EQU OSCCAL 00000066 +EQU PRR1 00000065 +EQU PRR0 00000064 +EQU CLKPR 00000061 +EQU WDTCSR 00000060 +EQU SREG 0000003f +EQU SPL 0000003d +EQU SPH 0000003e +EQU EIND 0000003c +EQU RAMPZ 0000003b +EQU SPMCSR 00000037 +EQU MCUCR 00000035 +EQU MCUSR 00000034 +EQU SMCR 00000033 +EQU OCDR 00000031 +EQU ACSR 00000030 +EQU SPDR 0000002e +EQU SPSR 0000002d +EQU SPCR 0000002c +EQU GPIOR2 0000002b +EQU GPIOR1 0000002a +EQU OCR0B 00000028 +EQU OCR0A 00000027 +EQU TCNT0 00000026 +EQU TCCR0B 00000025 +EQU TCCR0A 00000024 +EQU GTCCR 00000023 +EQU EEARH 00000022 +EQU EEARL 00000021 +EQU EEDR 00000020 +EQU EECR 0000001f +EQU GPIOR0 0000001e +EQU EIMSK 0000001d +EQU EIFR 0000001c +EQU PCIFR 0000001b +EQU TIFR5 0000001a +EQU TIFR4 00000019 +EQU TIFR3 00000018 +EQU TIFR2 00000017 +EQU TIFR1 00000016 +EQU TIFR0 00000015 +EQU PORTG 00000014 +EQU DDRG 00000013 +EQU PING 00000012 +EQU PORTF 00000011 +EQU DDRF 00000010 +EQU PINF 0000000f +EQU PORTE 0000000e +EQU DDRE 0000000d +EQU PINE 0000000c +EQU PORTD 0000000b +EQU DDRD 0000000a +EQU PIND 00000009 +EQU PORTC 00000008 +EQU DDRC 00000007 +EQU PINC 00000006 +EQU PORTB 00000005 +EQU DDRB 00000004 +EQU PINB 00000003 +EQU PORTA 00000002 +EQU DDRA 00000001 +EQU PINA 00000000 +EQU ACME 00000006 +EQU ACIS0 00000000 +EQU ACIS1 00000001 +EQU ACIC 00000002 +EQU ACIE 00000003 +EQU ACI 00000004 +EQU ACO 00000005 +EQU ACBG 00000006 +EQU ACD 00000007 +EQU AIN0D 00000000 +EQU AIN1D 00000001 +EQU UDR0_0 00000000 +EQU UDR0_1 00000001 +EQU UDR0_2 00000002 +EQU UDR0_3 00000003 +EQU UDR0_4 00000004 +EQU UDR0_5 00000005 +EQU UDR0_6 00000006 +EQU UDR0_7 00000007 +EQU MPCM0 00000000 +EQU U2X0 00000001 +EQU UPE0 00000002 +EQU DOR0 00000003 +EQU FE0 00000004 +EQU UDRE0 00000005 +EQU TXC0 00000006 +EQU RXC0 00000007 +EQU TXB80 00000000 +EQU RXB80 00000001 +EQU UCSZ02 00000002 +EQU TXEN0 00000003 +EQU RXEN0 00000004 +EQU UDRIE0 00000005 +EQU TXCIE0 00000006 +EQU RXCIE0 00000007 +EQU UCPOL0 00000000 +EQU UCSZ00 00000001 +EQU UCPHA0 00000001 +EQU UCSZ01 00000002 +EQU UDORD0 00000002 +EQU USBS0 00000003 +EQU UPM00 00000004 +EQU UPM01 00000005 +EQU UMSEL00 00000006 +EQU UMSEL0 00000006 +EQU UMSEL01 00000007 +EQU UMSEL1 00000007 +EQU UBRR8 00000000 +EQU UBRR9 00000001 +EQU UBRR10 00000002 +EQU UBRR11 00000003 +EQU _UBRR0 00000000 +EQU _UBRR1 00000001 +EQU UBRR2 00000002 +EQU UBRR3 00000003 +EQU UBRR4 00000004 +EQU UBRR5 00000005 +EQU UBRR6 00000006 +EQU UBRR7 00000007 +EQU TWAM0 00000001 +EQU TWAMR0 00000001 +EQU TWAM1 00000002 +EQU TWAMR1 00000002 +EQU TWAM2 00000003 +EQU TWAMR2 00000003 +EQU TWAM3 00000004 +EQU TWAMR3 00000004 +EQU TWAM4 00000005 +EQU TWAMR4 00000005 +EQU TWAM5 00000006 +EQU TWAMR5 00000006 +EQU TWAM6 00000007 +EQU TWAMR6 00000007 +EQU TWBR0 00000000 +EQU TWBR1 00000001 +EQU TWBR2 00000002 +EQU TWBR3 00000003 +EQU TWBR4 00000004 +EQU TWBR5 00000005 +EQU TWBR6 00000006 +EQU TWBR7 00000007 +EQU TWIE 00000000 +EQU TWEN 00000002 +EQU TWWC 00000003 +EQU TWSTO 00000004 +EQU TWSTA 00000005 +EQU TWEA 00000006 +EQU TWINT 00000007 +EQU TWPS0 00000000 +EQU TWPS1 00000001 +EQU TWS3 00000003 +EQU TWS4 00000004 +EQU TWS5 00000005 +EQU TWS6 00000006 +EQU TWS7 00000007 +EQU TWD0 00000000 +EQU TWD1 00000001 +EQU TWD2 00000002 +EQU TWD3 00000003 +EQU TWD4 00000004 +EQU TWD5 00000005 +EQU TWD6 00000006 +EQU TWD7 00000007 +EQU TWGCE 00000000 +EQU TWA0 00000001 +EQU TWA1 00000002 +EQU TWA2 00000003 +EQU TWA3 00000004 +EQU TWA4 00000005 +EQU TWA5 00000006 +EQU TWA6 00000007 +EQU SPDR0 00000000 +EQU SPDR1 00000001 +EQU SPDR2 00000002 +EQU SPDR3 00000003 +EQU SPDR4 00000004 +EQU SPDR5 00000005 +EQU SPDR6 00000006 +EQU SPDR7 00000007 +EQU SPI2X 00000000 +EQU WCOL 00000006 +EQU SPIF 00000007 +EQU SPR0 00000000 +EQU SPR1 00000001 +EQU CPHA 00000002 +EQU CPOL 00000003 +EQU MSTR 00000004 +EQU DORD 00000005 +EQU SPE 00000006 +EQU SPIE 00000007 +EQU PORTA0 00000000 +EQU PA0 00000000 +EQU PORTA1 00000001 +EQU PA1 00000001 +EQU PORTA2 00000002 +EQU PA2 00000002 +EQU PORTA3 00000003 +EQU PA3 00000003 +EQU PORTA4 00000004 +EQU PA4 00000004 +EQU PORTA5 00000005 +EQU PA5 00000005 +EQU PORTA6 00000006 +EQU PA6 00000006 +EQU PORTA7 00000007 +EQU PA7 00000007 +EQU DDA0 00000000 +EQU DDA1 00000001 +EQU DDA2 00000002 +EQU DDA3 00000003 +EQU DDA4 00000004 +EQU DDA5 00000005 +EQU DDA6 00000006 +EQU DDA7 00000007 +EQU PINA0 00000000 +EQU PINA1 00000001 +EQU PINA2 00000002 +EQU PINA3 00000003 +EQU PINA4 00000004 +EQU PINA5 00000005 +EQU PINA6 00000006 +EQU PINA7 00000007 +EQU PORTB0 00000000 +EQU PB0 00000000 +EQU PORTB1 00000001 +EQU PB1 00000001 +EQU PORTB2 00000002 +EQU PB2 00000002 +EQU PORTB3 00000003 +EQU PB3 00000003 +EQU PORTB4 00000004 +EQU PB4 00000004 +EQU PORTB5 00000005 +EQU PB5 00000005 +EQU PORTB6 00000006 +EQU PB6 00000006 +EQU PORTB7 00000007 +EQU PB7 00000007 +EQU DDB0 00000000 +EQU DDB1 00000001 +EQU DDB2 00000002 +EQU DDB3 00000003 +EQU DDB4 00000004 +EQU DDB5 00000005 +EQU DDB6 00000006 +EQU DDB7 00000007 +EQU PINB0 00000000 +EQU PINB1 00000001 +EQU PINB2 00000002 +EQU PINB3 00000003 +EQU PINB4 00000004 +EQU PINB5 00000005 +EQU PINB6 00000006 +EQU PINB7 00000007 +EQU PORTC0 00000000 +EQU PC0 00000000 +EQU PORTC1 00000001 +EQU PC1 00000001 +EQU PORTC2 00000002 +EQU PC2 00000002 +EQU PORTC3 00000003 +EQU PC3 00000003 +EQU PORTC4 00000004 +EQU PC4 00000004 +EQU PORTC5 00000005 +EQU PC5 00000005 +EQU PORTC6 00000006 +EQU PC6 00000006 +EQU PORTC7 00000007 +EQU PC7 00000007 +EQU DDC0 00000000 +EQU DDC1 00000001 +EQU DDC2 00000002 +EQU DDC3 00000003 +EQU DDC4 00000004 +EQU DDC5 00000005 +EQU DDC6 00000006 +EQU DDC7 00000007 +EQU PINC0 00000000 +EQU PINC1 00000001 +EQU PINC2 00000002 +EQU PINC3 00000003 +EQU PINC4 00000004 +EQU PINC5 00000005 +EQU PINC6 00000006 +EQU PINC7 00000007 +EQU PORTD0 00000000 +EQU PD0 00000000 +EQU PORTD1 00000001 +EQU PD1 00000001 +EQU PORTD2 00000002 +EQU PD2 00000002 +EQU PORTD3 00000003 +EQU PD3 00000003 +EQU PORTD4 00000004 +EQU PD4 00000004 +EQU PORTD5 00000005 +EQU PD5 00000005 +EQU PORTD6 00000006 +EQU PD6 00000006 +EQU PORTD7 00000007 +EQU PD7 00000007 +EQU DDD0 00000000 +EQU DDD1 00000001 +EQU DDD2 00000002 +EQU DDD3 00000003 +EQU DDD4 00000004 +EQU DDD5 00000005 +EQU DDD6 00000006 +EQU DDD7 00000007 +EQU PIND0 00000000 +EQU PIND1 00000001 +EQU PIND2 00000002 +EQU PIND3 00000003 +EQU PIND4 00000004 +EQU PIND5 00000005 +EQU PIND6 00000006 +EQU PIND7 00000007 +EQU PORTE0 00000000 +EQU PE0 00000000 +EQU PORTE1 00000001 +EQU PE1 00000001 +EQU PORTE2 00000002 +EQU PE2 00000002 +EQU PORTE3 00000003 +EQU PE3 00000003 +EQU PORTE4 00000004 +EQU PE4 00000004 +EQU PORTE5 00000005 +EQU PE5 00000005 +EQU PORTE6 00000006 +EQU PE6 00000006 +EQU PORTE7 00000007 +EQU PE7 00000007 +EQU DDE0 00000000 +EQU DDE1 00000001 +EQU DDE2 00000002 +EQU DDE3 00000003 +EQU DDE4 00000004 +EQU DDE5 00000005 +EQU DDE6 00000006 +EQU DDE7 00000007 +EQU PINE0 00000000 +EQU PINE1 00000001 +EQU PINE2 00000002 +EQU PINE3 00000003 +EQU PINE4 00000004 +EQU PINE5 00000005 +EQU PINE6 00000006 +EQU PINE7 00000007 +EQU PORTF0 00000000 +EQU PF0 00000000 +EQU PORTF1 00000001 +EQU PF1 00000001 +EQU PORTF2 00000002 +EQU PF2 00000002 +EQU PORTF3 00000003 +EQU PF3 00000003 +EQU PORTF4 00000004 +EQU PF4 00000004 +EQU PORTF5 00000005 +EQU PF5 00000005 +EQU PORTF6 00000006 +EQU PF6 00000006 +EQU PORTF7 00000007 +EQU PF7 00000007 +EQU DDF0 00000000 +EQU DDF1 00000001 +EQU DDF2 00000002 +EQU DDF3 00000003 +EQU DDF4 00000004 +EQU DDF5 00000005 +EQU DDF6 00000006 +EQU DDF7 00000007 +EQU PINF0 00000000 +EQU PINF1 00000001 +EQU PINF2 00000002 +EQU PINF3 00000003 +EQU PINF4 00000004 +EQU PINF5 00000005 +EQU PINF6 00000006 +EQU PINF7 00000007 +EQU PORTG0 00000000 +EQU PG0 00000000 +EQU PORTG1 00000001 +EQU PG1 00000001 +EQU PORTG2 00000002 +EQU PG2 00000002 +EQU PORTG3 00000003 +EQU PG3 00000003 +EQU PORTG4 00000004 +EQU PG4 00000004 +EQU PORTG5 00000005 +EQU PG5 00000005 +EQU DDG0 00000000 +EQU DDG1 00000001 +EQU DDG2 00000002 +EQU DDG3 00000003 +EQU DDG4 00000004 +EQU DDG5 00000005 +EQU PING0 00000000 +EQU PING1 00000001 +EQU PING2 00000002 +EQU PING3 00000003 +EQU PING4 00000004 +EQU PING5 00000005 +EQU TOIE0 00000000 +EQU OCIE0A 00000001 +EQU OCIE0B 00000002 +EQU TOV0 00000000 +EQU OCF0A 00000001 +EQU OCF0B 00000002 +EQU WGM00 00000000 +EQU WGM01 00000001 +EQU COM0B0 00000004 +EQU COM0B1 00000005 +EQU COM0A0 00000006 +EQU COM0A1 00000007 +EQU CS00 00000000 +EQU CS01 00000001 +EQU CS02 00000002 +EQU WGM02 00000003 +EQU FOC0B 00000006 +EQU FOC0A 00000007 +EQU TCNT0_0 00000000 +EQU TCNT0_1 00000001 +EQU TCNT0_2 00000002 +EQU TCNT0_3 00000003 +EQU TCNT0_4 00000004 +EQU TCNT0_5 00000005 +EQU TCNT0_6 00000006 +EQU TCNT0_7 00000007 +EQU OCR0A_0 00000000 +EQU OCR0A_1 00000001 +EQU OCR0A_2 00000002 +EQU OCR0A_3 00000003 +EQU OCR0A_4 00000004 +EQU OCR0A_5 00000005 +EQU OCR0A_6 00000006 +EQU OCR0A_7 00000007 +EQU OCR0B_0 00000000 +EQU OCR0B_1 00000001 +EQU OCR0B_2 00000002 +EQU OCR0B_3 00000003 +EQU OCR0B_4 00000004 +EQU OCR0B_5 00000005 +EQU OCR0B_6 00000006 +EQU OCR0B_7 00000007 +EQU PSRSYNC 00000000 +EQU PSR10 00000000 +EQU TSM 00000007 +EQU TOIE2 00000000 +EQU TOIE2A 00000000 +EQU OCIE2A 00000001 +EQU OCIE2B 00000002 +EQU TOV2 00000000 +EQU OCF2A 00000001 +EQU OCF2B 00000002 +EQU WGM20 00000000 +EQU WGM21 00000001 +EQU COM2B0 00000004 +EQU COM2B1 00000005 +EQU COM2A0 00000006 +EQU COM2A1 00000007 +EQU CS20 00000000 +EQU CS21 00000001 +EQU CS22 00000002 +EQU WGM22 00000003 +EQU FOC2B 00000006 +EQU FOC2A 00000007 +EQU TCNT2_0 00000000 +EQU TCNT2_1 00000001 +EQU TCNT2_2 00000002 +EQU TCNT2_3 00000003 +EQU TCNT2_4 00000004 +EQU TCNT2_5 00000005 +EQU TCNT2_6 00000006 +EQU TCNT2_7 00000007 +EQU OCR2A_0 00000000 +EQU OCR2A_1 00000001 +EQU OCR2A_2 00000002 +EQU OCR2A_3 00000003 +EQU OCR2A_4 00000004 +EQU OCR2A_5 00000005 +EQU OCR2A_6 00000006 +EQU OCR2A_7 00000007 +EQU OCR2B_0 00000000 +EQU OCR2B_1 00000001 +EQU OCR2B_2 00000002 +EQU OCR2B_3 00000003 +EQU OCR2B_4 00000004 +EQU OCR2B_5 00000005 +EQU OCR2B_6 00000006 +EQU OCR2B_7 00000007 +EQU TCR2BUB 00000000 +EQU TCR2AUB 00000001 +EQU OCR2BUB 00000002 +EQU OCR2AUB 00000003 +EQU TCN2UB 00000004 +EQU AS2 00000005 +EQU EXCLK 00000006 +EQU PSRASY 00000001 +EQU PSR2 00000001 +EQU WDP0 00000000 +EQU WDP1 00000001 +EQU WDP2 00000002 +EQU WDE 00000003 +EQU WDCE 00000004 +EQU WDP3 00000005 +EQU WDIE 00000006 +EQU WDIF 00000007 +EQU UDR1_0 00000000 +EQU UDR1_1 00000001 +EQU UDR1_2 00000002 +EQU UDR1_3 00000003 +EQU UDR1_4 00000004 +EQU UDR1_5 00000005 +EQU UDR1_6 00000006 +EQU UDR1_7 00000007 +EQU MPCM1 00000000 +EQU U2X1 00000001 +EQU UPE1 00000002 +EQU DOR1 00000003 +EQU FE1 00000004 +EQU UDRE1 00000005 +EQU TXC1 00000006 +EQU RXC1 00000007 +EQU TXB81 00000000 +EQU RXB81 00000001 +EQU UCSZ12 00000002 +EQU TXEN1 00000003 +EQU RXEN1 00000004 +EQU UDRIE1 00000005 +EQU TXCIE1 00000006 +EQU RXCIE1 00000007 +EQU UCPOL1 00000000 +EQU UCSZ10 00000001 +EQU UCPHA1 00000001 +EQU UCSZ11 00000002 +EQU UDORD1 00000002 +EQU USBS1 00000003 +EQU UPM10 00000004 +EQU UPM11 00000005 +EQU UMSEL10 00000006 +EQU UMSEL11 00000007 +EQU UBRR_8 00000000 +EQU UBRR_9 00000001 +EQU UBRR_10 00000002 +EQU UBRR_11 00000003 +EQU UBRR_0 00000000 +EQU UBRR_1 00000001 +EQU UBRR_2 00000002 +EQU UBRR_3 00000003 +EQU UBRR_4 00000004 +EQU UBRR_5 00000005 +EQU UBRR_6 00000006 +EQU UBRR_7 00000007 +EQU EEAR8 00000000 +EQU EEAR9 00000001 +EQU EEAR10 00000002 +EQU EEAR11 00000003 +EQU EEAR0 00000000 +EQU EEAR1 00000001 +EQU EEAR2 00000002 +EQU EEAR3 00000003 +EQU EEAR4 00000004 +EQU EEAR5 00000005 +EQU EEAR6 00000006 +EQU EEAR7 00000007 +EQU EEDR0 00000000 +EQU EEDR1 00000001 +EQU EEDR2 00000002 +EQU EEDR3 00000003 +EQU EEDR4 00000004 +EQU EEDR5 00000005 +EQU EEDR6 00000006 +EQU EEDR7 00000007 +EQU EERE 00000000 +EQU EEPE 00000001 +EQU EEMPE 00000002 +EQU EERIE 00000003 +EQU EEPM0 00000004 +EQU EEPM1 00000005 +EQU TOIE5 00000000 +EQU OCIE5A 00000001 +EQU OCIE5B 00000002 +EQU OCIE5C 00000003 +EQU ICIE5 00000005 +EQU TOV5 00000000 +EQU OCF5A 00000001 +EQU OCF5B 00000002 +EQU OCF5C 00000003 +EQU ICF5 00000005 +EQU WGM50 00000000 +EQU WGM51 00000001 +EQU COM5C0 00000002 +EQU COM5C1 00000003 +EQU COM5B0 00000004 +EQU COM5B1 00000005 +EQU COM5A0 00000006 +EQU COM5A1 00000007 +EQU CS50 00000000 +EQU CS51 00000001 +EQU CS52 00000002 +EQU WGM52 00000003 +EQU WGM53 00000004 +EQU ICES5 00000006 +EQU ICNC5 00000007 +EQU FOC5C 00000005 +EQU FOC5B 00000006 +EQU FOC5A 00000007 +EQU ICR5H0 00000000 +EQU ICR5H1 00000001 +EQU ICR5H2 00000002 +EQU ICR5H3 00000003 +EQU ICR5H4 00000004 +EQU ICR5H5 00000005 +EQU ICR5H6 00000006 +EQU ICR5H7 00000007 +EQU ICR5L0 00000000 +EQU ICR5L1 00000001 +EQU ICR5L2 00000002 +EQU ICR5L3 00000003 +EQU ICR5L4 00000004 +EQU ICR5L5 00000005 +EQU ICR5L6 00000006 +EQU ICR5L7 00000007 +EQU TOIE4 00000000 +EQU OCIE4A 00000001 +EQU OCIE4B 00000002 +EQU OCIE4C 00000003 +EQU ICIE4 00000005 +EQU TOV4 00000000 +EQU OCF4A 00000001 +EQU OCF4B 00000002 +EQU OCF4C 00000003 +EQU ICF4 00000005 +EQU WGM40 00000000 +EQU WGM41 00000001 +EQU COM4C0 00000002 +EQU COM4C1 00000003 +EQU COM4B0 00000004 +EQU COM4B1 00000005 +EQU COM4A0 00000006 +EQU COM4A1 00000007 +EQU CS40 00000000 +EQU CS41 00000001 +EQU CS42 00000002 +EQU WGM42 00000003 +EQU WGM43 00000004 +EQU ICES4 00000006 +EQU ICNC4 00000007 +EQU FOC4C 00000005 +EQU FOC4B 00000006 +EQU FOC4A 00000007 +EQU TOIE3 00000000 +EQU OCIE3A 00000001 +EQU OCIE3B 00000002 +EQU OCIE3C 00000003 +EQU ICIE3 00000005 +EQU TOV3 00000000 +EQU OCF3A 00000001 +EQU OCF3B 00000002 +EQU OCF3C 00000003 +EQU ICF3 00000005 +EQU WGM30 00000000 +EQU WGM31 00000001 +EQU COM3C0 00000002 +EQU COM3C1 00000003 +EQU COM3B0 00000004 +EQU COM3B1 00000005 +EQU COM3A0 00000006 +EQU COM3A1 00000007 +EQU CS30 00000000 +EQU CS31 00000001 +EQU CS32 00000002 +EQU WGM32 00000003 +EQU WGM33 00000004 +EQU ICES3 00000006 +EQU ICNC3 00000007 +EQU FOC3C 00000005 +EQU FOC3B 00000006 +EQU FOC3A 00000007 +EQU TOIE1 00000000 +EQU OCIE1A 00000001 +EQU OCIE1B 00000002 +EQU OCIE1C 00000003 +EQU ICIE1 00000005 +EQU TOV1 00000000 +EQU OCF1A 00000001 +EQU OCF1B 00000002 +EQU OCF1C 00000003 +EQU ICF1 00000005 +EQU WGM10 00000000 +EQU WGM11 00000001 +EQU COM1C0 00000002 +EQU COM1C1 00000003 +EQU COM1B0 00000004 +EQU COM1B1 00000005 +EQU COM1A0 00000006 +EQU COM1A1 00000007 +EQU CS10 00000000 +EQU CS11 00000001 +EQU CS12 00000002 +EQU WGM12 00000003 +EQU WGM13 00000004 +EQU ICES1 00000006 +EQU ICNC1 00000007 +EQU FOC1C 00000005 +EQU FOC1B 00000006 +EQU FOC1A 00000007 +EQU OCDR0 00000000 +EQU OCDR1 00000001 +EQU OCDR2 00000002 +EQU OCDR3 00000003 +EQU OCDR4 00000004 +EQU OCDR5 00000005 +EQU OCDR6 00000006 +EQU OCDR7 00000007 +EQU IDRD 00000007 +EQU JTD 00000007 +EQU JTRF 00000004 +EQU ISC00 00000000 +EQU ISC01 00000001 +EQU ISC10 00000002 +EQU ISC11 00000003 +EQU ISC20 00000004 +EQU ISC21 00000005 +EQU ISC30 00000006 +EQU ISC31 00000007 +EQU ISC40 00000000 +EQU ISC41 00000001 +EQU ISC50 00000002 +EQU ISC51 00000003 +EQU ISC60 00000004 +EQU ISC61 00000005 +EQU ISC70 00000006 +EQU ISC71 00000007 +EQU INT0 00000000 +EQU INT1 00000001 +EQU INT2 00000002 +EQU INT3 00000003 +EQU INT4 00000004 +EQU INT5 00000005 +EQU INT6 00000006 +EQU INT7 00000007 +EQU INTF0 00000000 +EQU INTF1 00000001 +EQU INTF2 00000002 +EQU INTF3 00000003 +EQU INTF4 00000004 +EQU INTF5 00000005 +EQU INTF6 00000006 +EQU INTF7 00000007 +EQU PCIE0 00000000 +EQU PCIE1 00000001 +EQU PCIE2 00000002 +EQU PCIF0 00000000 +EQU PCIF1 00000001 +EQU PCIF2 00000002 +EQU PCINT16 00000000 +EQU PCINT17 00000001 +EQU PCINT18 00000002 +EQU PCINT19 00000003 +EQU PCINT20 00000004 +EQU PCINT21 00000005 +EQU PCINT22 00000006 +EQU PCINT23 00000007 +EQU PCINT8 00000000 +EQU PCINT9 00000001 +EQU PCINT10 00000002 +EQU PCINT11 00000003 +EQU PCINT12 00000004 +EQU PCINT13 00000005 +EQU PCINT14 00000006 +EQU PCINT15 00000007 +EQU PCINT0 00000000 +EQU PCINT1 00000001 +EQU PCINT2 00000002 +EQU PCINT3 00000003 +EQU PCINT4 00000004 +EQU PCINT5 00000005 +EQU PCINT6 00000006 +EQU PCINT7 00000007 +EQU SREG_C 00000000 +EQU SREG_Z 00000001 +EQU SREG_N 00000002 +EQU SREG_V 00000003 +EQU SREG_S 00000004 +EQU SREG_H 00000005 +EQU SREG_T 00000006 +EQU SREG_I 00000007 +EQU IVCE 00000000 +EQU IVSEL 00000001 +EQU PUD 00000004 +EQU PORF 00000000 +EQU EXTRF 00000001 +EQU BORF 00000002 +EQU WDRF 00000003 +EQU SRW00 00000000 +EQU SRW01 00000001 +EQU SRW10 00000002 +EQU SRW11 00000003 +EQU SRL0 00000004 +EQU SRL1 00000005 +EQU SRL2 00000006 +EQU SRE 00000007 +EQU XMM0 00000000 +EQU XMM1 00000001 +EQU XMM2 00000002 +EQU XMBK 00000007 +EQU CAL0 00000000 +EQU CAL1 00000001 +EQU CAL2 00000002 +EQU CAL3 00000003 +EQU CAL4 00000004 +EQU CAL5 00000005 +EQU CAL6 00000006 +EQU CAL7 00000007 +EQU CLKPS0 00000000 +EQU CLKPS1 00000001 +EQU CLKPS2 00000002 +EQU CLKPS3 00000003 +EQU CLKPCE 00000007 +EQU SE 00000000 +EQU SM0 00000001 +EQU SM1 00000002 +EQU SM2 00000003 +EQU RAMPZ0 00000000 +EQU RAMPZ1 00000001 +EQU EIND0 00000000 +EQU GPIOR20 00000000 +EQU GPIOR21 00000001 +EQU GPIOR22 00000002 +EQU GPIOR23 00000003 +EQU GPIOR24 00000004 +EQU GPIOR25 00000005 +EQU GPIOR26 00000006 +EQU GPIOR27 00000007 +EQU GPIOR10 00000000 +EQU GPIOR11 00000001 +EQU GPIOR12 00000002 +EQU GPIOR13 00000003 +EQU GPIOR14 00000004 +EQU GPIOR15 00000005 +EQU GPIOR16 00000006 +EQU GPIOR17 00000007 +EQU GPIOR00 00000000 +EQU GPIOR01 00000001 +EQU GPIOR02 00000002 +EQU GPIOR03 00000003 +EQU GPIOR04 00000004 +EQU GPIOR05 00000005 +EQU GPIOR06 00000006 +EQU GPIOR07 00000007 +EQU PRUSART1 00000000 +EQU PRUSART2 00000001 +EQU PRUSART3 00000002 +EQU PRTIM3 00000003 +EQU PRTIM4 00000004 +EQU PRTIM5 00000005 +EQU PRADC 00000000 +EQU PRUSART0 00000001 +EQU PRSPI 00000002 +EQU PRTIM1 00000003 +EQU PRTIM0 00000005 +EQU PRTIM2 00000006 +EQU PRTWI 00000007 +EQU MUX0 00000000 +EQU MUX1 00000001 +EQU MUX2 00000002 +EQU MUX3 00000003 +EQU MUX4 00000004 +EQU ADLAR 00000005 +EQU REFS0 00000006 +EQU REFS1 00000007 +EQU ADPS0 00000000 +EQU ADPS1 00000001 +EQU ADPS2 00000002 +EQU ADIE 00000003 +EQU ADIF 00000004 +EQU ADATE 00000005 +EQU ADSC 00000006 +EQU ADEN 00000007 +EQU ADTS0 00000000 +EQU ADTS1 00000001 +EQU ADTS2 00000002 +EQU MUX5 00000003 +EQU ADCH0 00000000 +EQU ADCH1 00000001 +EQU ADCH2 00000002 +EQU ADCH3 00000003 +EQU ADCH4 00000004 +EQU ADCH5 00000005 +EQU ADCH6 00000006 +EQU ADCH7 00000007 +EQU ADCL0 00000000 +EQU ADCL1 00000001 +EQU ADCL2 00000002 +EQU ADCL3 00000003 +EQU ADCL4 00000004 +EQU ADCL5 00000005 +EQU ADCL6 00000006 +EQU ADCL7 00000007 +EQU ADC0D 00000000 +EQU ADC1D 00000001 +EQU ADC2D 00000002 +EQU ADC3D 00000003 +EQU ADC4D 00000004 +EQU ADC5D 00000005 +EQU ADC6D 00000006 +EQU ADC7D 00000007 +EQU ADC8D 00000000 +EQU ADC9D 00000001 +EQU ADC10D 00000002 +EQU ADC11D 00000003 +EQU ADC12D 00000004 +EQU ADC13D 00000005 +EQU ADC14D 00000006 +EQU ADC15D 00000007 +EQU SPMEN 00000000 +EQU PGERS 00000001 +EQU PGWRT 00000002 +EQU BLBSET 00000003 +EQU RWWSRE 00000004 +EQU SIGRD 00000005 +EQU RWWSB 00000006 +EQU SPMIE 00000007 +EQU LB1 00000000 +EQU LB2 00000001 +EQU BLB01 00000002 +EQU BLB02 00000003 +EQU BLB11 00000004 +EQU BLB12 00000005 +EQU CKSEL0 00000000 +EQU CKSEL1 00000001 +EQU CKSEL2 00000002 +EQU CKSEL3 00000003 +EQU SUT0 00000004 +EQU SUT1 00000005 +EQU CKOUT 00000006 +EQU CKDIV8 00000007 +EQU BOOTRST 00000000 +EQU BOOTSZ0 00000001 +EQU BOOTSZ1 00000002 +EQU EESAVE 00000003 +EQU WDTON 00000004 +EQU SPIEN 00000005 +EQU JTAGEN 00000006 +EQU OCDEN 00000007 +EQU BODLEVEL0 00000000 +EQU BODLEVEL1 00000001 +EQU BODLEVEL2 00000002 +DEF XH r27 +DEF XL r26 +DEF YH r29 +DEF YL r28 +DEF ZH r31 +DEF ZL r30 +EQU FLASHEND 0001ffff +EQU IOEND 000001ff +EQU SRAM_START 00000200 +EQU SRAM_SIZE 00002000 +EQU RAMEND 000021ff +EQU XRAMEND 0000ffff +EQU E2END 00000fff +EQU EEPROMEND 00000fff +EQU EEADRBITS 0000000c +EQU NRWW_START_ADDR 0001f000 +EQU NRWW_STOP_ADDR 0001ffff +EQU RWW_START_ADDR 00000000 +EQU RWW_STOP_ADDR 0001efff +EQU PAGESIZE 00000080 +EQU FIRSTBOOTSTART 0001fe00 +EQU SECONDBOOTSTART 0001fc00 +EQU THIRDBOOTSTART 0001f800 +EQU FOURTHBOOTSTART 0001f000 +EQU SMALLBOOTSTART 0001fe00 +EQU LARGEBOOTSTART 0001f000 +EQU INT0addr 00000002 +EQU INT1addr 00000004 +EQU INT2addr 00000006 +EQU INT3addr 00000008 +EQU INT4addr 0000000a +EQU INT5addr 0000000c +EQU INT6addr 0000000e +EQU INT7addr 00000010 +EQU PCI0addr 00000012 +EQU PCI1addr 00000014 +EQU PCI2addr 00000016 +EQU WDTaddr 00000018 +EQU OC2Aaddr 0000001a +EQU OC2Baddr 0000001c +EQU OVF2addr 0000001e +EQU ICP1addr 00000020 +EQU OC1Aaddr 00000022 +EQU OC1Baddr 00000024 +EQU OC1Caddr 00000026 +EQU OVF1addr 00000028 +EQU OC0Aaddr 0000002a +EQU OC0Baddr 0000002c +EQU OVF0addr 0000002e +EQU SPIaddr 00000030 +EQU URXC0addr 00000032 +EQU UDRE0addr 00000034 +EQU UTXC0addr 00000036 +EQU ACIaddr 00000038 +EQU ADCCaddr 0000003a +EQU ERDYaddr 0000003c +EQU ICP3addr 0000003e +EQU OC3Aaddr 00000040 +EQU OC3Baddr 00000042 +EQU OC3Caddr 00000044 +EQU OVF3addr 00000046 +EQU URXC1addr 00000048 +EQU UDRE1addr 0000004a +EQU UTXC1addr 0000004c +EQU TWIaddr 0000004e +EQU SPMRaddr 00000050 +EQU ICP4addr 00000052 +EQU OC4Aaddr 00000054 +EQU OC4Baddr 00000056 +EQU OC4Caddr 00000058 +EQU OVF4addr 0000005a +EQU ICP5addr 0000005c +EQU OC5Aaddr 0000005e +EQU OC5Baddr 00000060 +EQU OC5Caddr 00000062 +EQU OVF5addr 00000064 +EQU URXC2addr 00000066 +EQU UDRE2addr 00000068 +EQU UTXC2addr 0000006a +EQU URXC3addr 0000006c +EQU UDRE3addr 0000006e +EQU UTXC3addr 00000070 +EQU INT_VECTORS_SIZE 00000072 +EQU ramstart 00000200 +EQU CELLSIZE 00000002 +SET WANT_ANALOG_COMPARATOR 00000000 +SET WANT_USART0 00000000 +SET WANT_TWI 00000000 +SET WANT_SPI 00000000 +SET WANT_PORTA 00000000 +SET WANT_PORTB 00000000 +SET WANT_PORTC 00000000 +SET WANT_PORTD 00000000 +SET WANT_PORTE 00000000 +SET WANT_PORTF 00000000 +SET WANT_PORTG 00000000 +SET WANT_TIMER_COUNTER_0 00000000 +SET WANT_TIMER_COUNTER_2 00000000 +SET WANT_WATCHDOG 00000000 +SET WANT_USART1 00000000 +SET WANT_EEPROM 00000000 +SET WANT_TIMER_COUNTER_5 00000000 +SET WANT_TIMER_COUNTER_4 00000000 +SET WANT_TIMER_COUNTER_3 00000000 +SET WANT_TIMER_COUNTER_1 00000000 +SET WANT_JTAG 00000000 +SET WANT_EXTERNAL_INTERRUPT 00000000 +SET WANT_CPU 00000000 +SET WANT_AD_CONVERTER 00000000 +SET WANT_BOOT_LOAD 00000000 +EQU intvecsize 00000002 +EQU pclen 00000003 +CSEG isr 0000013c +EQU INTVECTORS 00000039 +CSEG mcu_info 00000071 +CSEG mcu_ramsize 00000071 +CSEG mcu_eepromsize 00000072 +CSEG mcu_maxdp 00000073 +CSEG mcu_numints 00000074 +CSEG mcu_name 00000075 +SET codestart 0000007b +SET WANT_INTERRUPTS 00000001 +SET WANT_INTERRUPT_COUNTERS 00000000 +SET WANT_ISR_RX 00000001 +SET WANT_IGNORECASE 00000000 +SET WANT_UNIFIED 00000000 +SET TIB_SIZE 0000005a +SET APPUSERSIZE 0000000a +SET rstackstart 000021ff +SET stackstart 000021af +SET NUMWORDLISTS 00000008 +SET NUMRECOGNIZERS 00000004 +SET BAUD 00009600 +SET BAUD_MAXERROR 0000000a +SET VE_HEAD 0000127b +SET VE_ENVHEAD 00000996 +SET AMFORTH_RO_SEG 0001f000 +EQU F_CPU 00e10000 +EQU BAUDRATE_LOW 000000cc +EQU BAUDRATE_HIGH 000000cd +EQU USART_C 000000ca +EQU USART_B 000000c9 +EQU USART_A 000000c8 +EQU USART_DATA 000000ce +EQU URXCaddr 00000048 +EQU UDREaddr 0000004a +EQU bm_USART_RXRD 00000080 +EQU bm_USART_TXRD 00000020 +EQU bm_ENABLE_TX 00000008 +EQU bm_ENABLE_RX 00000010 +EQU bm_ENABLE_INT_RX 00000080 +EQU bm_ENABLE_INT_TX 00000020 +EQU bm_USARTC_en 00000000 +EQU bm_ASYNC 00000000 +EQU bm_SYNC 00000040 +EQU bm_NO_PARITY 00000000 +EQU bm_EVEN_PARITY 00000020 +EQU bm_ODD_PARITY 00000030 +EQU bm_1STOPBIT 00000000 +EQU bm_2STOPBIT 00000008 +EQU bm_5BIT 00000000 +EQU bm_6BIT 00000002 +EQU bm_7BIT 00000004 +EQU bm_8BIT 00000006 +SET USART_C_VALUE 00000006 +SET USART_B_VALUE 00000098 +EQU usart_rx_size 00000010 +EQU usart_rx_mask 0000000f +DSEG usart_rx_data 00000200 +DSEG usart_rx_in 00000210 +DSEG usart_rx_out 00000211 +CSEG VE_TO_RXBUF 0000007b +CSEG XT_TO_RXBUF 00000081 +CSEG PFA_rx_tobuf 00000082 +CSEG DO_NEXT 0000011f +CSEG VE_ISR_RX 00000092 +CSEG XT_ISR_RX 00000097 +CSEG DO_COLON 0000011b +CSEG usart_rx_isr 00000098 +CSEG XT_DOLITERAL 000004ce +CSEG XT_CFETCH 00000531 +CSEG XT_DUP 0000054a +CSEG XT_EQUAL 0000126d +CSEG XT_DOCONDBRANCH 000004c7 +CSEG usart_rx_isr1 000000a2 +CSEG XT_COLD 00000ebf +CSEG XT_EXIT 000004ae +CSEG XT_USART_INIT_RX_BUFFER 000000a4 +CSEG PFA_USART_INIT_RX_BUFFER 000000a5 +CSEG XT_INTSTORE 000008eb +CSEG XT_ZERO 000005ed +CSEG XT_FILL 00000933 +CSEG VE_RX_BUFFER 000000b1 +CSEG XT_RX_BUFFER 000000b6 +CSEG PFA_RX_BUFFER 000000b7 +CSEG XT_RXQ_BUFFER 000000d1 +CSEG XT_PLUS 00000636 +CSEG XT_SWAP 0000055d +CSEG XT_1PLUS 000006c8 +CSEG XT_AND 000006ac +CSEG XT_CSTORE 00000526 +CSEG VE_RXQ_BUFFER 000000cb +CSEG PFA_RXQ_BUFFER 000000d2 +CSEG XT_PAUSE 00000eb7 +CSEG XT_NOTEQUAL 000005ac +SET XT_RX 000000b6 +SET XT_RXQ 000000d1 +SET XT_USART_INIT_RX 000000a4 +CSEG VE_TX_POLL 000000db +CSEG XT_TX_POLL 000000e1 +CSEG PFA_TX_POLL 000000e2 +CSEG XT_TXQ_POLL 000000ef +CSEG VE_TXQ_POLL 000000e9 +CSEG PFA_TXQ_POLL 000000f0 +SET XT_TX 000000e1 +SET XT_TXQ 000000ef +SET XT_USART_INIT_TX 00000000 +CSEG VE_UBRR 000000f8 +CSEG XT_UBRR 000000fc +CSEG PFA_DOVALUE1 00000509 +CSEG PFA_UBRR 000000fd +ESEG EE_UBRRVAL 000000ca +CSEG XT_EDEFERFETCH 0000101a +CSEG XT_EDEFERSTORE 00001024 +CSEG VE_USART 00000100 +CSEG XT_USART 00000105 +CSEG PFA_USART 00000106 +CSEG XT_BYTESWAP 00000792 +SET pc_ 0000011b +CSEG PFA_COLD 00000ec0 +CSEG DO_INTERRUPT 00000134 +CSEG DO_EXECUTE 0000012a +CSEG XT_ISREXEC 00000906 +ESEG intvec 00000000 +DSEG intcnt 00000212 +SET AMFORTH_NRWW_SIZE 00001ffe +CSEG VE_MPLUS 00000154 +CSEG XT_MPLUS 00000157 +CSEG PFA_MPLUS 00000158 +CSEG XT_S2D 00001255 +CSEG XT_DPLUS 00000879 +CSEG VE_UDSTAR 0000015b +CSEG XT_UDSTAR 0000015f +CSEG PFA_UDSTAR 00000160 +CSEG XT_TO_R 00000598 +CSEG XT_UMSTAR 00000679 +CSEG XT_DROP 00000572 +CSEG XT_R_FROM 0000058f +CSEG XT_ROT 0000057a +CSEG VE_UMAX 0000016a +CSEG XT_UMAX 0000016e +CSEG PFA_UMAX 0000016f +CSEG XT_2DUP 000009ca +CSEG XT_ULESS 000005f5 +CSEG UMAX1 00000174 +CSEG VE_UMIN 00000176 +CSEG XT_UMIN 0000017a +CSEG PFA_UMIN 0000017b +CSEG XT_UGREATER 00000600 +CSEG UMIN1 00000180 +CSEG XT_IMMEDIATEQ 00000182 +CSEG PFA_IMMEDIATEQ 00000183 +CSEG XT_ZEROEQUAL 000005b3 +CSEG IMMEDIATEQ1 0000018b +CSEG XT_ONE 00001274 +CSEG XT_TRUE 000005e4 +CSEG VE_NAME2FLAGS 0000018d +CSEG XT_NAME2FLAGS 00000194 +CSEG PFA_NAME2FLAGS 00000195 +CSEG XT_FETCHI 0000082c +CSEG VE_NEWEST 0000019a +CSEG XT_NEWEST 0000019f +CSEG PFA_DOVARIABLE 000004dc +CSEG PFA_NEWEST 000001a0 +DSEG ram_newest 0000024b +CSEG VE_LATEST 000001a1 +CSEG XT_LATEST 000001a6 +CSEG PFA_LATEST 000001a7 +DSEG ram_latest 0000024f +CSEG VE_DOCREATE 000001a8 +CSEG XT_DOCREATE 000001ae +CSEG PFA_DOCREATE 000001af +CSEG XT_PARSENAME 00000e1a +CSEG XT_WLSCOPE 00000305 +CSEG XT_CELLPLUS 000009c2 +CSEG XT_STORE 0000051a +CSEG XT_HEADER 000002ea +CSEG VE_BACKSLASH 000001b9 +CSEG XT_BACKSLASH 000001bc +CSEG PFA_BACKSLASH 000001bd +CSEG XT_SOURCE 00000e01 +CSEG XT_NIP 00000589 +CSEG XT_TO_IN 000009e3 +CSEG VE_LPAREN 000001c2 +CSEG XT_LPAREN 000001c5 +CSEG PFA_LPAREN 000001c6 +CSEG XT_PARSE 00000ded +CSEG XT_2DROP 000009d3 +CSEG VE_COMPILE 000001cb +CSEG XT_COMPILE 000001d1 +CSEG PFA_COMPILE 000001d2 +CSEG XT_ICELLPLUS 00001011 +CSEG XT_COMMA 000001dc +CSEG VE_COMMA 000001d9 +CSEG PFA_COMMA 000001dd +CSEG XT_DP 00000a13 +CSEG XT_STOREI 0000080d +CSEG XT_DOTO 00000fff +CSEG PFA_DP 00000a14 +CSEG VE_BRACKETTICK 000001e4 +CSEG XT_BRACKETTICK 000001e8 +CSEG PFA_BRACKETTICK 000001e9 +CSEG XT_TICK 00000c70 +CSEG XT_LITERAL 000001f2 +CSEG VE_LITERAL 000001ec +CSEG PFA_LITERAL 000001f3 +CSEG VE_SLITERAL 000001f7 +CSEG XT_SLITERAL 000001fd +CSEG PFA_SLITERAL 000001fe +CSEG XT_DOSLITERAL 00000bd3 +CSEG XT_SCOMMA 00000be1 +CSEG XT_GMARK 00000202 +CSEG PFA_GMARK 00000203 +CSEG XT_GRESOLVE 00000207 +CSEG PFA_GRESOLVE 00000208 +CSEG XT_QSTACK 00000fbd +CSEG XT_LMARK 0000020d +CSEG PFA_LMARK 0000020e +CSEG XT_LRESOLVE 00000210 +CSEG PFA_LRESOLVE 00000211 +CSEG VE_AHEAD 00000214 +CSEG XT_AHEAD 00000219 +CSEG PFA_AHEAD 0000021a +CSEG XT_DOBRANCH 000004bd +CSEG VE_IF 0000021e +CSEG XT_IF 00000221 +CSEG PFA_IF 00000222 +CSEG VE_ELSE 00000226 +CSEG XT_ELSE 0000022a +CSEG PFA_ELSE 0000022b +CSEG VE_THEN 00000231 +CSEG XT_THEN 00000235 +CSEG PFA_THEN 00000236 +CSEG VE_BEGIN 00000238 +CSEG XT_BEGIN 0000023d +CSEG PFA_BEGIN 0000023e +CSEG VE_WHILE 00000240 +CSEG XT_WHILE 00000245 +CSEG PFA_WHILE 00000246 +CSEG VE_REPEAT 00000249 +CSEG XT_REPEAT 0000024e +CSEG PFA_REPEAT 0000024f +CSEG XT_AGAIN 00000262 +CSEG VE_UNTIL 00000252 +CSEG XT_UNTIL 00000257 +CSEG PFA_UNTIL 00000258 +CSEG VE_AGAIN 0000025d +CSEG PFA_AGAIN 00000263 +CSEG VE_DO 00000267 +CSEG XT_DO 0000026a +CSEG PFA_DO 0000026b +CSEG XT_DODO 00000734 +CSEG XT_TO_L 000002c5 +CSEG VE_LOOP 00000271 +CSEG XT_LOOP 00000275 +CSEG PFA_LOOP 00000276 +CSEG XT_DOLOOP 00000762 +CSEG XT_ENDLOOP 000002ac +CSEG VE_PLUSLOOP 0000027a +CSEG XT_PLUSLOOP 0000027f +CSEG PFA_PLUSLOOP 00000280 +CSEG XT_DOPLUSLOOP 00000753 +CSEG VE_LEAVE 00000284 +CSEG XT_LEAVE 00000289 +CSEG PFA_LEAVE 0000028a +CSEG XT_UNLOOP 0000076d +CSEG VE_QDO 0000028f +CSEG XT_QDO 00000293 +CSEG PFA_QDO 00000294 +CSEG XT_QDOCHECK 0000029b +CSEG PFA_QDOCHECK 0000029c +CSEG PFA_QDOCHECK1 000002a3 +CSEG XT_INVERT 00000696 +CSEG VE_ENDLOOP 000002a6 +CSEG PFA_ENDLOOP 000002ad +CSEG LOOP1 000002ae +CSEG XT_L_FROM 000002b9 +CSEG XT_QDUP 00000552 +CSEG LOOP2 000002b5 +CSEG VE_L_FROM 000002b6 +CSEG PFA_L_FROM 000002ba +CSEG XT_LP 000002d8 +CSEG XT_FETCH 00000512 +CSEG XT_PLUSSTORE 000006fe +CSEG VE_TO_L 000002c2 +CSEG PFA_TO_L 000002c6 +CSEG XT_TWO 00001279 +CSEG VE_LP0 000002cd +CSEG XT_LP0 000002d1 +CSEG PFA_LP0 000002d2 +ESEG CFG_LP0 0000007e +CSEG VE_LP 000002d5 +CSEG PFA_LP 000002d9 +DSEG ram_lp 00000251 +CSEG VE_CREATE 000002da +CSEG XT_CREATE 000002df +CSEG PFA_CREATE 000002e0 +CSEG XT_REVEAL 0000030e +CSEG PFA_DOCONSTANT 000004e9 +CSEG VE_HEADER 000002e5 +CSEG PFA_HEADER 000002eb +CSEG XT_GREATERZERO 000005c1 +CSEG PFA_HEADER1 000002fc +CSEG XT_OR 000006b5 +CSEG XT_DOSCOMMA 00000be5 +CSEG XT_FETCHE 000007f9 +CSEG XT_THROW 00000ca7 +CSEG VE_WLSCOPE 000002ff +CSEG PFA_DODEFER1 00001079 +CSEG PFA_WLSCOPE 00000306 +ESEG CFG_WLSCOPE 0000007a +CSEG VE_REVEAL 00000309 +CSEG PFA_REVEAL 0000030f +CSEG REVEAL1 00000319 +CSEG XT_STOREE 000007d5 +CSEG VE_DOES 0000031a +CSEG XT_DOES 0000031f +CSEG PFA_DOES 00000320 +CSEG XT_DODOES 00000332 +CSEG DO_DODOES 00000327 +CSEG PFA_DODOES 00000333 +CSEG XT_NFA2CFA 000010e4 +CSEG VE_COLON 0000033b +CSEG XT_COLON 0000033e +CSEG PFA_COLON 0000033f +CSEG XT_COLONNONAME 00000349 +CSEG VE_COLONNONAME 00000343 +CSEG PFA_COLONNONAME 0000034a +CSEG XT_RBRACKET 0000035e +CSEG VE_SEMICOLON 00000352 +CSEG XT_SEMICOLON 00000355 +CSEG PFA_SEMICOLON 00000356 +CSEG XT_LBRACKET 00000366 +CSEG VE_RBRACKET 0000035b +CSEG PFA_RBRACKET 0000035f +CSEG XT_STATE 000009af +CSEG VE_LBRACKET 00000363 +CSEG PFA_LBRACKET 00000367 +CSEG VE_VARIABLE 0000036b +CSEG XT_VARIABLE 00000371 +CSEG PFA_VARIABLE 00000372 +CSEG XT_HERE 00000a24 +CSEG XT_CONSTANT 0000037d +CSEG XT_ALLOT 00000a2d +CSEG VE_CONSTANT 00000377 +CSEG PFA_CONSTANT 0000037e +CSEG VE_USER 00000384 +CSEG XT_USER 00000388 +CSEG PFA_USER 00000389 +CSEG PFA_DOUSER 000004ef +CSEG VE_RECURSE 0000038f +CSEG XT_RECURSE 00000395 +CSEG PFA_RECURSE 00000396 +CSEG VE_IMMEDIATE 0000039a +CSEG XT_IMMEDIATE 000003a1 +CSEG PFA_IMMEDIATE 000003a2 +CSEG XT_GET_CURRENT 00000443 +CSEG VE_BRACKETCHAR 000003ac +CSEG XT_BRACKETCHAR 000003b1 +CSEG PFA_BRACKETCHAR 000003b2 +CSEG XT_CHAR 00000d50 +CSEG VE_ABORTQUOTE 000003b7 +CSEG XT_ABORTQUOTE 000003bc +CSEG PFA_ABORTQUOTE 000003bd +CSEG XT_SQUOTE 00000925 +CSEG XT_QABORT 000003ce +CSEG VE_ABORT 000003c1 +CSEG XT_ABORT 000003c6 +CSEG PFA_ABORT 000003c7 +CSEG VE_QABORT 000003c9 +CSEG PFA_QABORT 000003cf +CSEG QABO1 000003d4 +CSEG XT_ITYPE 00000c06 +CSEG VE_GET_STACK 000003d6 +CSEG XT_GET_STACK 000003dd +CSEG PFA_N_FETCH_E2 000003f4 +CSEG PFA_N_FETCH_E1 000003ea +CSEG XT_I 00000745 +CSEG XT_1MINUS 000006ce +CSEG XT_CELLS 000009bc +CSEG XT_OVER 00000568 +CSEG VE_SET_STACK 000003f7 +CSEG XT_SET_STACK 000003fe +CSEG PFA_SET_STACK 000003ff +CSEG XT_ZEROLESS 000005ba +CSEG PFA_SET_STACK0 00000406 +CSEG PFA_SET_STACK2 00000413 +CSEG PFA_SET_STACK1 0000040e +CSEG XT_TUCK 000009db +CSEG VE_MAPSTACK 00000415 +CSEG XT_MAPSTACK 0000041c +CSEG PFA_MAPSTACK 0000041d +CSEG XT_BOUNDS 0000124c +CSEG PFA_MAPSTACK3 00000438 +CSEG PFA_MAPSTACK1 00000427 +CSEG XT_R_FETCH 000005a1 +CSEG XT_EXECUTE 000004b8 +CSEG PFA_MAPSTACK2 00000434 +CSEG VE_GET_CURRENT 0000043b +CSEG PFA_GET_CURRENT 00000444 +ESEG CFG_CURRENT 00000084 +CSEG VE_GET_ORDER 00000448 +CSEG XT_GET_ORDER 0000044f +CSEG PFA_GET_ORDER 00000450 +ESEG CFG_ORDERLISTLEN 00000088 +CSEG VE_CFG_ORDER 00000454 +CSEG XT_CFG_ORDER 0000045b +CSEG PFA_CFG_ORDER 0000045c +CSEG VE_COMPARE 0000045d +CSEG XT_COMPARE 00000463 +CSEG PFA_COMPARE 00000464 +CSEG PFA_COMPARE_LOOP 00000470 +CSEG PFA_COMPARE_NOTEQUAL 0000047e +CSEG PFA_COMPARE_ENDREACHED2 00000479 +CSEG PFA_COMPARE_ENDREACHED 0000047a +CSEG PFA_COMPARE_CHECKLASTCHAR 0000047e +CSEG PFA_COMPARE_DONE 00000480 +CSEG VE_NFA2LFA 00000484 +CSEG XT_NFA2LFA 0000048a +CSEG PFA_NFA2LFA 0000048b +CSEG XT_NAME2STRING 000010d8 +CSEG XT_2SLASH 0000069d +CSEG VE_APPLTURNKEY 00000490 +CSEG XT_APPLTURNKEY 00000498 +CSEG PFA_APPLTURNKEY 00000499 +CSEG XT_INTON 000008dd +CSEG XT_DOT_VER 00000fca +CSEG XT_SPACE 00000c48 +CSEG XT_F_CPU 000009a4 +CSEG XT_UMSLASHMOD 0000065b +CSEG XT_DECIMAL 00000a42 +CSEG XT_DOT 00000b88 +CSEG VE_EXIT 000004aa +CSEG PFA_EXIT 000004af +CSEG VE_EXECUTE 000004b2 +CSEG PFA_EXECUTE 000004b9 +CSEG PFA_DOBRANCH 000004be +CSEG PFA_DOCONDBRANCH 000004c8 +CSEG PFA_DOLITERAL 000004cf +CSEG XT_DOVARIABLE 000004db +CSEG XT_DOCONSTANT 000004e8 +CSEG XT_DOUSER 000004ee +CSEG VE_DOVALUE 000004fd +CSEG XT_DOVALUE 00000503 +CSEG PFA_DOVALUE 00000504 +CSEG VE_FETCH 0000050f +CSEG PFA_FETCH 00000513 +CSEG PFA_FETCHRAM 00000513 +CSEG VE_STORE 00000517 +CSEG PFA_STORE 0000051b +CSEG PFA_STORERAM 0000051b +CSEG VE_CSTORE 00000523 +CSEG PFA_CSTORE 00000527 +CSEG VE_CFETCH 0000052e +CSEG PFA_CFETCH 00000532 +CSEG VE_FETCHU 00000536 +CSEG XT_FETCHU 00000539 +CSEG PFA_FETCHU 0000053a +CSEG XT_UP_FETCH 0000079b +CSEG VE_STOREU 0000053e +CSEG XT_STOREU 00000541 +CSEG PFA_STOREU 00000542 +CSEG VE_DUP 00000546 +CSEG PFA_DUP 0000054b +CSEG VE_QDUP 0000054e +CSEG PFA_QDUP 00000553 +CSEG PFA_QDUP1 00000558 +CSEG VE_SWAP 00000559 +CSEG PFA_SWAP 0000055e +CSEG VE_OVER 00000564 +CSEG PFA_OVER 00000569 +CSEG VE_DROP 0000056e +CSEG PFA_DROP 00000573 +CSEG VE_ROT 00000576 +CSEG PFA_ROT 0000057b +CSEG VE_NIP 00000585 +CSEG PFA_NIP 0000058a +CSEG VE_R_FROM 0000058c +CSEG PFA_R_FROM 00000590 +CSEG VE_TO_R 00000595 +CSEG PFA_TO_R 00000599 +CSEG VE_R_FETCH 0000059e +CSEG PFA_R_FETCH 000005a2 +CSEG VE_NOTEQUAL 000005a9 +CSEG PFA_NOTEQUAL 000005ad +CSEG VE_ZEROEQUAL 000005b0 +CSEG PFA_ZEROEQUAL 000005b4 +CSEG PFA_ZERO1 000005f0 +CSEG PFA_TRUE1 000005e7 +CSEG VE_ZEROLESS 000005b7 +CSEG PFA_ZEROLESS 000005bb +CSEG VE_GREATERZERO 000005be +CSEG PFA_GREATERZERO 000005c2 +CSEG VE_DGREATERZERO 000005c7 +CSEG XT_DGREATERZERO 000005cb +CSEG PFA_DGREATERZERO 000005cc +CSEG VE_DXT_ZEROLESS 000005d5 +CSEG XT_DXT_ZEROLESS 000005d9 +CSEG PFA_DXT_ZEROLESS 000005da +CSEG VE_TRUE 000005e0 +CSEG PFA_TRUE 000005e5 +CSEG VE_ZERO 000005ea +CSEG PFA_ZERO 000005ee +CSEG VE_ULESS 000005f2 +CSEG PFA_ULESS 000005f6 +CSEG VE_UGREATER 000005fd +CSEG PFA_UGREATER 00000601 +CSEG VE_LESS 00000604 +CSEG XT_LESS 00000607 +CSEG PFA_LESS 00000608 +CSEG PFA_LESSDONE 0000060c +CSEG VE_GREATER 0000060e +CSEG XT_GREATER 00000611 +CSEG PFA_GREATER 00000612 +CSEG PFA_GREATERDONE 00000616 +CSEG VE_LOG2 00000619 +CSEG XT_LOG2 0000061d +CSEG PFA_LOG2 0000061e +CSEG PFA_LOG2_1 00000621 +CSEG PFA_LOG2_2 00000627 +CSEG VE_MINUS 00000629 +CSEG XT_MINUS 0000062c +CSEG PFA_MINUS 0000062d +CSEG VE_PLUS 00000633 +CSEG PFA_PLUS 00000637 +CSEG VE_MSTAR 0000063c +CSEG XT_MSTAR 0000063f +CSEG PFA_MSTAR 00000640 +CSEG VE_UMSLASHMOD 00000656 +CSEG PFA_UMSLASHMOD 0000065c +CSEG PFA_UMSLASHMODmod 00000661 +CSEG PFA_UMSLASHMODmod_loop 00000662 +CSEG PFA_UMSLASHMODmod_loop_control 0000066f +CSEG PFA_UMSLASHMODmod_subtract 0000066c +CSEG PFA_UMSLASHMODmod_done 00000671 +CSEG VE_UMSTAR 00000675 +CSEG PFA_UMSTAR 0000067a +CSEG VE_INVERT 00000691 +CSEG PFA_INVERT 00000697 +CSEG VE_2SLASH 0000069a +CSEG PFA_2SLASH 0000069e +CSEG VE_2STAR 000006a1 +CSEG XT_2STAR 000006a4 +CSEG PFA_2STAR 000006a5 +CSEG VE_AND 000006a8 +CSEG PFA_AND 000006ad +CSEG VE_OR 000006b2 +CSEG PFA_OR 000006b6 +CSEG VE_XOR 000006bb +CSEG XT_XOR 000006bf +CSEG PFA_XOR 000006c0 +CSEG VE_1PLUS 000006c5 +CSEG PFA_1PLUS 000006c9 +CSEG VE_1MINUS 000006cb +CSEG PFA_1MINUS 000006cf +CSEG VE_QNEGATE 000006d1 +CSEG XT_QNEGATE 000006d7 +CSEG PFA_QNEGATE 000006d8 +CSEG QNEG1 000006dc +CSEG XT_NEGATE 00000aa5 +CSEG VE_LSHIFT 000006dd +CSEG XT_LSHIFT 000006e2 +CSEG PFA_LSHIFT 000006e3 +CSEG PFA_LSHIFT1 000006e6 +CSEG PFA_LSHIFT2 000006eb +CSEG VE_RSHIFT 000006ec +CSEG XT_RSHIFT 000006f1 +CSEG PFA_RSHIFT 000006f2 +CSEG PFA_RSHIFT1 000006f5 +CSEG PFA_RSHIFT2 000006fa +CSEG VE_PLUSSTORE 000006fb +CSEG PFA_PLUSSTORE 000006ff +CSEG VE_RP_FETCH 0000070b +CSEG XT_RP_FETCH 0000070f +CSEG PFA_RP_FETCH 00000710 +CSEG VE_RP_STORE 00000715 +CSEG XT_RP_STORE 00000719 +CSEG PFA_RP_STORE 0000071a +CSEG VE_SP_FETCH 00000722 +CSEG XT_SP_FETCH 00000726 +CSEG PFA_SP_FETCH 00000727 +CSEG VE_SP_STORE 0000072b +CSEG XT_SP_STORE 0000072f +CSEG PFA_SP_STORE 00000730 +CSEG PFA_DODO 00000735 +CSEG PFA_DODO1 00000737 +CSEG VE_I 00000742 +CSEG PFA_I 00000746 +CSEG PFA_DOPLUSLOOP 00000754 +CSEG PFA_DOPLUSLOOP_LEAVE 0000075e +CSEG PFA_DOPLUSLOOP_NEXT 0000075b +CSEG PFA_DOLOOP 00000763 +CSEG VE_UNLOOP 00000768 +CSEG PFA_UNLOOP 0000076e +CSEG VE_CMOVE_G 00000773 +CSEG XT_CMOVE_G 00000778 +CSEG PFA_CMOVE_G 00000779 +CSEG PFA_CMOVE_G1 0000078a +CSEG PFA_CMOVE_G2 00000786 +CSEG VE_BYTESWAP 0000078f +CSEG PFA_BYTESWAP 00000793 +CSEG VE_UP_FETCH 00000797 +CSEG PFA_UP_FETCH 0000079c +CSEG VE_UP_STORE 000007a0 +CSEG XT_UP_STORE 000007a4 +CSEG PFA_UP_STORE 000007a5 +CSEG VE_1MS 000007a9 +CSEG XT_1MS 000007ad +CSEG PFA_1MS 000007ae +SET cycles 00000001 +SET loop_cycles 00000e66 +CSEG VE_2TO_R 000007b4 +CSEG XT_2TO_R 000007b8 +CSEG PFA_2TO_R 000007b9 +CSEG VE_2R_FROM 000007c3 +CSEG XT_2R_FROM 000007c7 +CSEG PFA_2R_FROM 000007c8 +CSEG VE_STOREE 000007d2 +CSEG PFA_STOREE 000007d6 +CSEG PFA_STOREE0 000007d6 +CSEG PFA_FETCHE2 00000804 +CSEG PFA_STOREE3 000007e0 +CSEG PFA_STOREE1 000007eb +CSEG PFA_STOREE4 000007e7 +CSEG PFA_STOREE2 000007ed +CSEG VE_FETCHE 000007f6 +CSEG PFA_FETCHE 000007fa +CSEG PFA_FETCHE1 000007fa +CSEG VE_STOREI 0000080a +CSEG PFA_STOREI 0000080e +ESEG EE_STOREI 000000a4 +CSEG VE_DO_STOREI_BIG 00000811 +CSEG XT_DO_STOREI 00000815 +CSEG PFA_DO_STOREI_BIG 00000816 +CSEG DO_STOREI_atmega 0001f000 +SET _pc 00000829 +CSEG pageload 0001f011 +CSEG DO_STOREI_writepage 0001f00a +CSEG dospm 0001f02d +EQU pagemask ffffff80 +CSEG pageload_loop 0001f017 +CSEG pageload_newdata 0001f025 +CSEG pageload_cont 0001f027 +CSEG pageload_done 0001f02c +CSEG Wait_ee 0001f030 +CSEG wait_spm 0001f032 +CSEG VE_FETCHI 00000829 +CSEG PFA_FETCHI 0000082d +CSEG VE_N_TO_R 00000836 +CSEG XT_N_TO_R 0000083a +CSEG PFA_N_TO_R 0000083b +CSEG PFA_N_TO_R1 0000083d +CSEG VE_N_R_FROM 00000848 +CSEG XT_N_R_FROM 0000084c +CSEG PFA_N_R_FROM 0000084d +CSEG PFA_N_R_FROM1 00000852 +CSEG VE_D2STAR 0000085a +CSEG XT_D2STAR 0000085e +CSEG PFA_D2STAR 0000085f +CSEG VE_D2SLASH 00000868 +CSEG XT_D2SLASH 0000086c +CSEG PFA_D2SLASH 0000086d +CSEG VE_DPLUS 00000876 +CSEG PFA_DPLUS 0000087a +CSEG VE_DMINUS 00000887 +CSEG XT_DMINUS 0000088a +CSEG PFA_DMINUS 0000088b +CSEG VE_DINVERT 00000899 +CSEG XT_DINVERT 0000089f +CSEG PFA_DINVERT 000008a0 +CSEG VE_UDOT 000008a9 +CSEG XT_UDOT 000008ac +CSEG PFA_UDOT 000008ad +CSEG XT_UDDOT 00000b90 +CSEG VE_UDOTR 000008b0 +CSEG XT_UDOTR 000008b4 +CSEG PFA_UDOTR 000008b5 +CSEG XT_UDDOTR 00000b99 +CSEG VE_SHOWWORDLIST 000008b9 +CSEG XT_SHOWWORDLIST 000008c2 +CSEG PFA_SHOWWORDLIST 000008c3 +CSEG XT_SHOWWORD 000008c8 +CSEG XT_TRAVERSEWORDLIST 000010bd +CSEG PFA_SHOWWORD 000008c9 +CSEG VE_WORDS 000008ce +CSEG XT_WORDS 000008d3 +CSEG PFA_WORDS 000008d4 +CSEG VE_INTON 000008d9 +CSEG PFA_INTON 000008de +CSEG VE_INTOFF 000008e0 +CSEG XT_INTOFF 000008e4 +CSEG PFA_INTOFF 000008e5 +CSEG VE_INTSTORE 000008e7 +CSEG PFA_INTSTORE 000008ec +CSEG VE_INTFETCH 000008f1 +CSEG XT_INTFETCH 000008f5 +CSEG PFA_INTFETCH 000008f6 +CSEG VE_INTTRAP 000008fb +CSEG XT_INTTRAP 00000901 +CSEG PFA_INTTRAP 00000902 +CSEG PFA_ISREXEC 00000907 +CSEG XT_ISREND 0000090b +CSEG PFA_ISREND 0000090c +CSEG PFA_ISREND1 0000090e +CSEG VE_PICK 0000090f +CSEG XT_PICK 00000913 +CSEG PFA_PICK 00000914 +CSEG VE_DOTSTRING 0000091a +CSEG XT_DOTSTRING 0000091d +CSEG PFA_DOTSTRING 0000091e +CSEG VE_SQUOTE 00000922 +CSEG PFA_SQUOTE 00000926 +CSEG PFA_SQUOTE1 0000092e +CSEG VE_FILL 0000092f +CSEG PFA_FILL 00000934 +CSEG PFA_FILL2 00000940 +CSEG PFA_FILL1 0000093b +CSEG VE_ENVIRONMENT 00000942 +CSEG XT_ENVIRONMENT 0000094a +CSEG PFA_ENVIRONMENT 0000094b +ESEG CFG_ENVIRONMENT 00000082 +CSEG VE_ENVWORDLISTS 0000094c +CSEG XT_ENVWORDLISTS 00000953 +CSEG PFA_ENVWORDLISTS 00000954 +CSEG VE_ENVSLASHPAD 00000957 +CSEG XT_ENVSLASHPAD 0000095b +CSEG PFA_ENVSLASHPAD 0000095c +CSEG XT_PAD 000009e9 +CSEG VE_ENVSLASHHOLD 00000960 +CSEG XT_ENVSLASHHOLD 00000965 +CSEG PFA_ENVSLASHHOLD 00000966 +CSEG VE_ENV_FORTHNAME 0000096a +CSEG XT_ENV_FORTHNAME 00000971 +CSEG PFA_EN_FORTHNAME 00000972 +CSEG VE_ENV_FORTHVERSION 00000979 +CSEG XT_ENV_FORTHVERSION 0000097f +CSEG PFA_EN_FORTHVERSION 00000980 +CSEG VE_ENV_CPU 00000983 +CSEG XT_ENV_CPU 00000987 +CSEG PFA_EN_CPU 00000988 +CSEG XT_ICOUNT 00000c32 +CSEG VE_ENV_MCUINFO 0000098c +CSEG XT_ENV_MCUINFO 00000992 +CSEG PFA_EN_MCUINFO 00000993 +CSEG VE_ENVUSERSIZE 00000996 +CSEG XT_ENVUSERSIZE 0000099b +CSEG PFA_ENVUSERSIZE 0000099c +CSEG VE_F_CPU 0000099f +CSEG PFA_F_CPU 000009a5 +CSEG VE_STATE 000009aa +CSEG PFA_STATE 000009b0 +DSEG ram_state 00000253 +CSEG VE_BASE 000009b1 +CSEG XT_BASE 000009b5 +CSEG PFA_BASE 000009b6 +CSEG VE_CELLS 000009b7 +CSEG VE_CELLPLUS 000009bd +CSEG PFA_CELLPLUS 000009c3 +CSEG VE_2DUP 000009c6 +CSEG PFA_2DUP 000009cb +CSEG VE_2DROP 000009ce +CSEG PFA_2DROP 000009d4 +CSEG VE_TUCK 000009d7 +CSEG PFA_TUCK 000009dc +CSEG VE_TO_IN 000009df +CSEG PFA_TO_IN 000009e4 +CSEG VE_PAD 000009e5 +CSEG PFA_PAD 000009ea +CSEG VE_EMIT 000009ef +CSEG XT_EMIT 000009f3 +CSEG PFA_EMIT 000009f4 +CSEG XT_UDEFERFETCH 00001042 +CSEG XT_UDEFERSTORE 0000104e +CSEG VE_EMITQ 000009f7 +CSEG XT_EMITQ 000009fc +CSEG PFA_EMITQ 000009fd +CSEG VE_KEY 00000a00 +CSEG XT_KEY 00000a04 +CSEG PFA_KEY 00000a05 +CSEG VE_KEYQ 00000a08 +CSEG XT_KEYQ 00000a0c +CSEG PFA_KEYQ 00000a0d +CSEG VE_DP 00000a10 +ESEG CFG_DP 00000074 +CSEG VE_EHERE 00000a17 +CSEG XT_EHERE 00000a1c +CSEG PFA_EHERE 00000a1d +ESEG EE_EHERE 00000078 +CSEG VE_HERE 00000a20 +CSEG PFA_HERE 00000a25 +ESEG EE_HERE 00000076 +CSEG VE_ALLOT 00000a28 +CSEG PFA_ALLOT 00000a2e +CSEG VE_BIN 00000a33 +CSEG XT_BIN 00000a37 +CSEG PFA_BIN 00000a38 +CSEG VE_DECIMAL 00000a3c +CSEG PFA_DECIMAL 00000a43 +CSEG VE_HEX 00000a48 +CSEG XT_HEX 00000a4c +CSEG PFA_HEX 00000a4d +CSEG VE_BL 00000a52 +CSEG XT_BL 00000a55 +CSEG PFA_BL 00000a56 +CSEG VE_TURNKEY 00000a57 +CSEG XT_TURNKEY 00000a5d +CSEG PFA_TURNKEY 00000a5e +ESEG CFG_TURNKEY 00000080 +CSEG VE_SLASHMOD 00000a61 +CSEG XT_SLASHMOD 00000a65 +CSEG PFA_SLASHMOD 00000a66 +CSEG PFA_SLASHMOD_1 00000a71 +CSEG PFA_SLASHMOD_2 00000a77 +CSEG PFA_SLASHMOD_3 00000a7a +CSEG PFA_SLASHMOD_5 00000a85 +CSEG PFA_SLASHMOD_4 00000a84 +CSEG PFA_SLASHMODmod_done 00000a90 +CSEG PFA_SLASHMOD_6 00000a8e +CSEG VE_USLASHMOD 00000a95 +CSEG XT_USLASHMOD 00000a9a +CSEG PFA_USLASHMOD 00000a9b +CSEG VE_NEGATE 00000aa0 +CSEG PFA_NEGATE 00000aa6 +CSEG VE_SLASH 00000aa9 +CSEG XT_SLASH 00000aac +CSEG PFA_SLASH 00000aad +CSEG VE_MOD 00000ab0 +CSEG XT_MOD 00000ab4 +CSEG PFA_MOD 00000ab5 +CSEG VE_ABS 00000ab8 +CSEG XT_ABS 00000abc +CSEG PFA_ABS 00000abd +CSEG VE_MIN 00000ac0 +CSEG XT_MIN 00000ac4 +CSEG PFA_MIN 00000ac5 +CSEG PFA_MIN1 00000aca +CSEG VE_MAX 00000acc +CSEG XT_MAX 00000ad0 +CSEG PFA_MAX 00000ad1 +CSEG PFA_MAX1 00000ad6 +CSEG VE_WITHIN 00000ad8 +CSEG XT_WITHIN 00000add +CSEG PFA_WITHIN 00000ade +CSEG VE_TOUPPER 00000ae5 +CSEG XT_TOUPPER 00000aeb +CSEG PFA_TOUPPER 00000aec +CSEG PFA_TOUPPER0 00000af7 +CSEG VE_TOLOWER 00000af8 +CSEG XT_TOLOWER 00000afe +CSEG PFA_TOLOWER 00000aff +CSEG PFA_TOLOWER0 00000b0a +CSEG VE_HLD 00000b0b +CSEG XT_HLD 00000b0f +CSEG PFA_HLD 00000b10 +DSEG ram_hld 00000255 +CSEG VE_HOLD 00000b11 +CSEG XT_HOLD 00000b15 +CSEG PFA_HOLD 00000b16 +CSEG VE_L_SHARP 00000b21 +CSEG XT_L_SHARP 00000b24 +CSEG PFA_L_SHARP 00000b25 +CSEG VE_SHARP 00000b29 +CSEG XT_SHARP 00000b2c +CSEG PFA_SHARP 00000b2d +CSEG XT_UDSLASHMOD 00000ba9 +CSEG PFA_SHARP1 00000b3a +CSEG VE_SHARP_S 00000b3f +CSEG XT_SHARP_S 00000b42 +CSEG PFA_SHARP_S 00000b43 +CSEG NUMS1 00000b43 +CSEG VE_SHARP_G 00000b4a +CSEG XT_SHARP_G 00000b4d +CSEG PFA_SHARP_G 00000b4e +CSEG VE_SIGN 00000b55 +CSEG XT_SIGN 00000b59 +CSEG PFA_SIGN 00000b5a +CSEG PFA_SIGN1 00000b60 +CSEG VE_DDOTR 00000b61 +CSEG XT_DDOTR 00000b65 +CSEG PFA_DDOTR 00000b66 +CSEG XT_DABS 0000113a +CSEG XT_SPACES 00000c51 +CSEG XT_TYPE 00000c61 +CSEG VE_DOTR 00000b74 +CSEG XT_DOTR 00000b77 +CSEG PFA_DOTR 00000b78 +CSEG VE_DDOT 00000b7d +CSEG XT_DDOT 00000b80 +CSEG PFA_DDOT 00000b81 +CSEG VE_DOT 00000b85 +CSEG PFA_DOT 00000b89 +CSEG VE_UDDOT 00000b8c +CSEG PFA_UDDOT 00000b91 +CSEG VE_UDDOTR 00000b95 +CSEG PFA_UDDOTR 00000b9a +CSEG VE_UDSLASHMOD 00000ba4 +CSEG PFA_UDSLASHMOD 00000baa +CSEG VE_DIGITQ 00000bb4 +CSEG XT_DIGITQ 00000bb9 +CSEG PFA_DIGITQ 00000bba +CSEG PFA_DOSLITERAL 00000bd4 +CSEG VE_SCOMMA 00000bde +CSEG PFA_SCOMMA 00000be2 +CSEG PFA_DOSCOMMA 00000be6 +CSEG PFA_SCOMMA2 00000bf8 +CSEG PFA_SCOMMA1 00000bf2 +CSEG PFA_SCOMMA3 00000bff +CSEG VE_ITYPE 00000c01 +CSEG PFA_ITYPE 00000c07 +CSEG PFA_ITYPE2 00000c1a +CSEG PFA_ITYPE1 00000c12 +CSEG XT_LOWEMIT 00000c27 +CSEG XT_HIEMIT 00000c23 +CSEG PFA_ITYPE3 00000c21 +CSEG PFA_HIEMIT 00000c24 +CSEG PFA_LOWEMIT 00000c28 +CSEG VE_ICOUNT 00000c2d +CSEG PFA_ICOUNT 00000c33 +CSEG VE_CR 00000c38 +CSEG XT_CR 00000c3b +CSEG PFA_CR 00000c3c +CSEG VE_SPACE 00000c43 +CSEG PFA_SPACE 00000c49 +CSEG VE_SPACES 00000c4c +CSEG PFA_SPACES 00000c52 +CSEG SPCS1 00000c54 +CSEG SPCS2 00000c5b +CSEG VE_TYPE 00000c5d +CSEG PFA_TYPE 00000c62 +CSEG PFA_TYPE2 00000c6c +CSEG PFA_TYPE1 00000c67 +CSEG VE_TICK 00000c6d +CSEG PFA_TICK 00000c71 +CSEG XT_FORTHRECOGNIZER 00000f32 +CSEG XT_RECOGNIZE 00000f3d +CSEG XT_DT_NULL 00000fb0 +CSEG XT_NOOP 00000fe5 +CSEG PFA_TICK1 00000c82 +CSEG VE_HANDLER 00000c84 +CSEG XT_HANDLER 00000c8a +CSEG PFA_HANDLER 00000c8b +CSEG VE_CATCH 00000c8c +CSEG XT_CATCH 00000c91 +CSEG PFA_CATCH 00000c92 +CSEG VE_THROW 00000ca2 +CSEG PFA_THROW 00000ca8 +CSEG PFA_THROW1 00000cae +CSEG VE_CSKIP 00000cbb +CSEG XT_CSKIP 00000cc0 +CSEG PFA_CSKIP 00000cc1 +CSEG PFA_CSKIP1 00000cc2 +CSEG PFA_CSKIP2 00000ccf +CSEG XT_SLASHSTRING 00000e0b +CSEG VE_CSCAN 00000cd2 +CSEG XT_CSCAN 00000cd7 +CSEG PFA_CSCAN 00000cd8 +CSEG PFA_CSCAN1 00000cda +CSEG PFA_CSCAN2 00000cec +CSEG VE_ACCEPT 00000cf2 +CSEG XT_ACCEPT 00000cf7 +CSEG PFA_ACCEPT 00000cf8 +CSEG ACC1 00000cfc +CSEG XT_CRLFQ 00000d38 +CSEG ACC5 00000d2a +CSEG ACC3 00000d1a +CSEG ACC6 00000d18 +CSEG XT_BS 00000d30 +CSEG ACC4 00000d28 +CSEG PFA_ACCEPT6 00000d21 +CSEG VE_REFILL 00000d43 +CSEG XT_REFILL 00000d48 +CSEG PFA_REFILL 00000d49 +CSEG VE_CHAR 00000d4c +CSEG PFA_CHAR 00000d51 +CSEG VE_NUMBER 00000d55 +CSEG XT_NUMBER 00000d5a +CSEG PFA_NUMBER 00000d5b +CSEG XT_QSIGN 00000d9e +CSEG XT_SET_BASE 00000db1 +CSEG PFA_NUMBER0 00000d71 +CSEG XT_TO_NUMBER 00000dcf +CSEG PFA_NUMBER1 00000d93 +CSEG PFA_NUMBER2 00000d8a +CSEG PFA_NUMBER6 00000d8b +CSEG PFA_NUMBER3 00000d87 +CSEG XT_DNEGATE 00001147 +CSEG PFA_NUMBER5 00000d99 +CSEG PFA_NUMBER4 00000d98 +CSEG PFA_QSIGN 00000d9f +CSEG PFA_NUMBERSIGN_DONE 00000daa +CSEG XT_BASES 00000dac +CSEG PFA_SET_BASE 00000db2 +CSEG SET_BASE1 00000dc7 +CSEG SET_BASE2 00000dc8 +CSEG VE_TO_NUMBER 00000dc9 +CSEG TONUM1 00000dd0 +CSEG TONUM3 00000de7 +CSEG TONUM2 00000ddb +CSEG XT_2SWAP 0000116b +CSEG VE_PARSE 00000de8 +CSEG PFA_PARSE 00000dee +CSEG VE_SOURCE 00000dfc +CSEG PFA_SOURCE 00000e02 +CSEG VE_SLASHSTRING 00000e05 +CSEG PFA_SLASHSTRING 00000e0c +CSEG VE_PARSENAME 00000e13 +CSEG PFA_PARSENAME 00000e1b +CSEG XT_SKIPSCANCHAR 00000e1e +CSEG PFA_SKIPSCANCHAR 00000e1f +CSEG VE_FINDXT 00000e30 +CSEG XT_FINDXT 00000e36 +CSEG PFA_FINDXT 00000e37 +CSEG XT_FINDXTA 00000e42 +CSEG PFA_FINDXT1 00000e41 +CSEG PFA_FINDXTA 00000e43 +CSEG XT_SEARCH_WORDLIST 0000108b +CSEG PFA_FINDXTA1 00000e4f +CSEG XT_DEFAULT_PROMPTOK 00000e50 +CSEG PFA_DEFAULT_PROMPTOK 00000e51 +CSEG VE_PROMPTOK 00000e57 +CSEG XT_PROMPTOK 00000e5b +CSEG PFA_PROMPTOK 00000e5c +CSEG XT_DEFAULT_PROMPTREADY 00000e5f +CSEG PFA_DEFAULT_PROMPTREADY 00000e60 +CSEG VE_PROMPTREADY 00000e66 +CSEG XT_PROMPTREADY 00000e6b +CSEG PFA_PROMPTREADY 00000e6c +CSEG XT_DEFAULT_PROMPTERROR 00000e6f +CSEG PFA_DEFAULT_PROMPTERROR 00000e70 +CSEG VE_PROMPTERROR 00000e81 +CSEG XT_PROMPTERROR 00000e86 +CSEG PFA_PROMPTERROR 00000e87 +CSEG VE_QUIT 00000e8a +CSEG XT_QUIT 00000e8e +CSEG PFA_QUIT 00000e8f +CSEG XT_SP0 00000eef +CSEG XT_RP0 00000efc +CSEG PFA_QUIT2 00000e97 +CSEG PFA_QUIT4 00000e9d +CSEG PFA_QUIT3 00000eaf +CSEG XT_INTERPRET 00000f15 +CSEG PFA_QUIT5 00000ead +CSEG VE_PAUSE 00000eb2 +CSEG PFA_PAUSE 00000eb8 +DSEG ram_pause 00000257 +CSEG XT_RDEFERFETCH 0000102e +CSEG XT_RDEFERSTORE 00001038 +CSEG VE_COLD 00000ebb +CSEG clearloop 00000ec7 +DSEG ram_user1 00000259 +CSEG PFA_WARM 00000ee2 +CSEG VE_WARM 00000edd +CSEG XT_WARM 00000ee1 +CSEG XT_INIT_RAM 000011b6 +CSEG XT_DEFERSTORE 00001059 +CSEG VE_SP0 00000eeb +CSEG PFA_SP0 00000ef0 +CSEG VE_SP 00000ef3 +CSEG XT_SP 00000ef6 +CSEG PFA_SP 00000ef7 +CSEG VE_RP0 00000ef8 +CSEG PFA_RP0 00000efd +CSEG XT_DORP0 00000f00 +CSEG PFA_DORP0 00000f01 +CSEG VE_DEPTH 00000f02 +CSEG XT_DEPTH 00000f07 +CSEG PFA_DEPTH 00000f08 +CSEG VE_INTERPRET 00000f0e +CSEG PFA_INTERPRET 00000f16 +CSEG PFA_INTERPRET2 00000f26 +CSEG PFA_INTERPRET1 00000f21 +CSEG VE_FORTHRECOGNIZER 00000f28 +CSEG PFA_FORTHRECOGNIZER 00000f33 +ESEG CFG_FORTHRECOGNIZER 0000007c +CSEG VE_RECOGNIZE 00000f36 +CSEG PFA_RECOGNIZE 00000f3e +CSEG XT_RECOGNIZE_A 00000f48 +CSEG PFA_RECOGNIZE1 00000f47 +CSEG PFA_RECOGNIZE_A 00000f49 +CSEG PFA_RECOGNIZE_A1 00000f59 +CSEG VE_DT_NUM 00000f5d +CSEG XT_DT_NUM 00000f62 +CSEG PFA_DT_NUM 00000f63 +CSEG VE_DT_DNUM 00000f66 +CSEG XT_DT_DNUM 00000f6c +CSEG PFA_DT_DNUM 00000f6d +CSEG XT_2LITERAL 00001265 +CSEG VE_REC_NUM 00000f70 +CSEG XT_REC_NUM 00000f76 +CSEG PFA_REC_NUM 00000f77 +CSEG PFA_REC_NONUMBER 00000f82 +CSEG PFA_REC_INTNUM2 00000f80 +CSEG VE_REC_FIND 00000f84 +CSEG XT_REC_FIND 00000f8a +CSEG PFA_REC_FIND 00000f8b +CSEG PFA_REC_WORD_FOUND 00000f93 +CSEG XT_DT_XT 00000f9a +CSEG VE_DT_XT 00000f95 +CSEG PFA_DT_XT 00000f9b +CSEG XT_R_WORD_INTERPRET 00000f9e +CSEG XT_R_WORD_COMPILE 00000fa2 +CSEG PFA_R_WORD_INTERPRET 00000f9f +CSEG PFA_R_WORD_COMPILE 00000fa3 +CSEG PFA_R_WORD_COMPILE1 00000fa8 +CSEG VE_DT_NULL 00000faa +CSEG PFA_DT_NULL 00000fb1 +CSEG XT_FAIL 00000fb4 +CSEG PFA_FAIL 00000fb5 +CSEG VE_QSTACK 00000fb8 +CSEG PFA_QSTACK 00000fbe +CSEG PFA_QSTACK1 00000fc5 +CSEG VE_DOT_VER 00000fc6 +CSEG PFA_DOT_VER 00000fcb +CSEG VE_NOOP 00000fe1 +CSEG PFA_NOOP 00000fe6 +CSEG VE_UNUSED 00000fe7 +CSEG XT_UNUSED 00000fec +CSEG PFA_UNUSED 00000fed +CSEG VE_TO 00000ff1 +CSEG XT_TO 00000ff4 +CSEG PFA_TO 00000ff5 +CSEG XT_TO_BODY 0000125e +CSEG PFA_TO1 00001005 +CSEG PFA_DOTO 00001000 +CSEG VE_ICELLPLUS 0000100b +CSEG PFA_ICELLPLUS 00001012 +CSEG VE_EDEFERFETCH 00001014 +CSEG PFA_EDEFERFETCH 0000101b +CSEG VE_EDEFERSTORE 0000101e +CSEG PFA_EDEFERSTORE 00001025 +CSEG VE_RDEFERFETCH 00001028 +CSEG PFA_RDEFERFETCH 0000102f +CSEG VE_RDEFERSTORE 00001032 +CSEG PFA_RDEFERSTORE 00001039 +CSEG VE_UDEFERFETCH 0000103c +CSEG PFA_UDEFERFETCH 00001043 +CSEG VE_UDEFERSTORE 00001048 +CSEG PFA_UDEFERSTORE 0000104f +CSEG VE_DEFERSTORE 00001054 +CSEG PFA_DEFERSTORE 0000105a +CSEG VE_DEFERFETCH 00001061 +CSEG XT_DEFERFETCH 00001066 +CSEG PFA_DEFERFETCH 00001067 +CSEG VE_DODEFER 0000106d +CSEG XT_DODEFER 00001073 +CSEG PFA_DODEFER 00001074 +CSEG VE_SEARCH_WORDLIST 00001081 +CSEG PFA_SEARCH_WORDLIST 0000108c +CSEG XT_ISWORD 000010a0 +CSEG PFA_SEARCH_WORDLIST1 0000109a +CSEG PFA_ISWORD 000010a1 +CSEG XT_ICOMPARE 000010ee +CSEG PFA_ISWORD3 000010ae +CSEG VE_TRAVERSEWORDLIST 000010b2 +CSEG PFA_TRAVERSEWORDLIST 000010be +CSEG PFA_TRAVERSEWORDLIST1 000010bf +CSEG PFA_TRAVERSEWORDLIST2 000010ce +CSEG VE_NAME2STRING 000010d0 +CSEG PFA_NAME2STRING 000010d9 +CSEG VE_NFA2CFA 000010de +CSEG PFA_NFA2CFA 000010e5 +CSEG VE_ICOMPARE 000010e8 +CSEG PFA_ICOMPARE 000010ef +CSEG PFA_ICOMPARE_SAMELEN 000010f9 +CSEG PFA_ICOMPARE_DONE 0000111c +CSEG PFA_ICOMPARE_LOOP 000010ff +CSEG PFA_ICOMPARE_LASTCELL 0000110d +CSEG PFA_ICOMPARE_NEXTLOOP 00001114 +CSEG VE_STAR 0000111f +CSEG XT_STAR 00001122 +CSEG PFA_STAR 00001123 +CSEG VE_J 00001126 +CSEG XT_J 00001129 +CSEG PFA_J 0000112a +CSEG VE_DABS 00001136 +CSEG PFA_DABS 0000113b +CSEG PFA_DABS1 00001140 +CSEG VE_DNEGATE 00001141 +CSEG PFA_DNEGATE 00001148 +CSEG VE_CMOVE 0000114d +CSEG XT_CMOVE 00001152 +CSEG PFA_CMOVE 00001153 +CSEG PFA_CMOVE1 00001160 +CSEG PFA_CMOVE2 0000115c +CSEG VE_2SWAP 00001166 +CSEG PFA_2SWAP 0000116c +CSEG VE_REFILLTIB 00001171 +CSEG XT_REFILLTIB 00001178 +CSEG PFA_REFILLTIB 00001179 +CSEG XT_TIB 00001194 +CSEG XT_NUMBERTIB 0000119a +CSEG VE_SOURCETIB 00001184 +CSEG XT_SOURCETIB 0000118b +CSEG PFA_SOURCETIB 0000118c +CSEG VE_TIB 00001190 +CSEG PFA_TIB 00001195 +DSEG ram_tib 00000285 +CSEG VE_NUMBERTIB 00001196 +CSEG PFA_NUMBERTIB 0000119b +DSEG ram_sharptib 000002df +CSEG VE_EE2RAM 0000119c +CSEG XT_EE2RAM 000011a1 +CSEG PFA_EE2RAM 000011a2 +CSEG PFA_EE2RAM_1 000011a4 +CSEG PFA_EE2RAM_2 000011ae +CSEG VE_INIT_RAM 000011b0 +CSEG PFA_INI_RAM 000011b7 +ESEG EE_INITUSER 000000a8 +CSEG VE_SET_CURRENT 000011bf +CSEG XT_SET_CURRENT 000011c7 +CSEG PFA_SET_CURRENT 000011c8 +CSEG VE_WORDLIST 000011cc +CSEG XT_WORDLIST 000011d2 +CSEG PFA_WORDLIST 000011d3 +CSEG VE_FORTHWORDLIST 000011dc +CSEG XT_FORTHWORDLIST 000011e5 +CSEG PFA_FORTHWORDLIST 000011e6 +ESEG CFG_FORTHWORDLIST 00000086 +CSEG VE_SET_ORDER 000011e7 +CSEG XT_SET_ORDER 000011ee +CSEG PFA_SET_ORDER 000011ef +CSEG VE_SET_RECOGNIZERS 000011f3 +CSEG XT_SET_RECOGNIZERS 000011fd +CSEG PFA_SET_RECOGNIZERS 000011fe +ESEG CFG_RECOGNIZERLISTLEN 0000009a +CSEG VE_GET_RECOGNIZERS 00001202 +CSEG XT_GET_RECOGNIZERS 0000120c +CSEG PFA_GET_RECOGNIZERS 0000120d +CSEG VE_CODE 00001211 +CSEG XT_CODE 00001215 +CSEG PFA_CODE 00001216 +CSEG VE_ENDCODE 0000121c +CSEG XT_ENDCODE 00001222 +CSEG PFA_ENDCODE 00001223 +CSEG VE_MARKER 00001228 +CSEG XT_MARKER 0000122e +CSEG PFA_MARKER 0000122f +ESEG EE_MARKER 000000a6 +CSEG VE_POSTPONE 00001232 +CSEG XT_POSTPONE 00001238 +CSEG PFA_POSTPONE 00001239 +CSEG VE_BOUNDS 00001247 +CSEG PFA_BOUNDS 0000124d +CSEG VE_S2D 00001251 +CSEG PFA_S2D 00001256 +CSEG VE_TO_BODY 00001259 +CSEG VE_2LITERAL 0000125f +CSEG PFA_2LITERAL 00001266 +CSEG VE_EQUAL 0000126a +CSEG PFA_EQUAL 0000126e +CSEG VE_ONE 00001271 +CSEG PFA_ONE 00001275 +CSEG VE_TWO 00001276 +CSEG PFA_TWO 0000127a +CSEG VE_MINUSONE 0000127b +CSEG XT_MINUSONE 0000127e +CSEG PFA_MINUSONE 0000127f +SET DPSTART 00001280 +SET flashlast 00001280 +DSEG HERESTART 000002e1 +ESEG EHERESTART 000000cc +ESEG CFG_ORDERLIST 0000008a +ESEG CFG_RECOGNIZERLIST 0000009c +EQU UBRR_VAL 00000017 +EQU BAUD_REAL 00009600 +EQU BAUD_ERROR 00000000 diff --git a/amforth-6.5/appl/atmega2561/build.xml b/amforth-6.5/appl/atmega2561/build.xml new file mode 100644 index 0000000..b7804aa --- /dev/null +++ b/amforth-6.5/appl/atmega2561/build.xml @@ -0,0 +1,21 @@ + + + + + + + + + + Uploading Hexfiles for AVR atmega256 + + + + + + diff --git a/amforth-6.5/appl/atmega2561/dict_appl.inc b/amforth-6.5/appl/atmega2561/dict_appl.inc new file mode 100644 index 0000000..a52b464 --- /dev/null +++ b/amforth-6.5/appl/atmega2561/dict_appl.inc @@ -0,0 +1,5 @@ +; this dictionary contains optional words +; they may be moved to the core dictionary if needed + +.include "words/applturnkey.asm" + diff --git a/amforth-6.5/appl/atmega2561/dict_appl_core.inc b/amforth-6.5/appl/atmega2561/dict_appl_core.inc new file mode 100644 index 0000000..93c0d8a --- /dev/null +++ b/amforth-6.5/appl/atmega2561/dict_appl_core.inc @@ -0,0 +1,2 @@ +; This file is intentionally left empty +; do not delete it! diff --git a/amforth-6.5/appl/atmega2561/words/applturnkey.asm b/amforth-6.5/appl/atmega2561/words/applturnkey.asm new file mode 100644 index 0000000..f2726ff --- /dev/null +++ b/amforth-6.5/appl/atmega2561/words/applturnkey.asm @@ -0,0 +1,32 @@ +; ( -- ) System +; R( -- ) +; application specific turnkey action +VE_APPLTURNKEY: + .dw $ff0b + .db "applturnkey",0 + .dw VE_HEAD + .set VE_HEAD = VE_APPLTURNKEY +XT_APPLTURNKEY: + .dw DO_COLON +PFA_APPLTURNKEY: + .dw XT_USART + +.if WANT_INTERRUPTS == 1 + .dw XT_INTON +.endif + + .dw XT_DOT_VER + .dw XT_SPACE + .dw XT_F_CPU + .dw XT_DOLITERAL + .dw 1000 + .dw XT_UMSLASHMOD + .dw XT_NIP + .dw XT_DECIMAL + .dw XT_DOT + .dw XT_DOSLITERAL + .dw 4 + .db "kHz " + .dw XT_ITYPE + + .dw XT_EXIT -- cgit v1.2.3