aboutsummaryrefslogtreecommitdiff
path: root/amforth-6.5/appl/atmega2561
diff options
context:
space:
mode:
Diffstat (limited to 'amforth-6.5/appl/atmega2561')
-rw-r--r--amforth-6.5/appl/atmega2561/atmega256.asm18
-rw-r--r--amforth-6.5/appl/atmega2561/atmega256.eep.hex7
-rw-r--r--amforth-6.5/appl/atmega2561/atmega256.hex647
-rw-r--r--amforth-6.5/appl/atmega2561/atmega256.lst10182
-rw-r--r--amforth-6.5/appl/atmega2561/atmega256.map2503
-rw-r--r--amforth-6.5/appl/atmega2561/build.xml21
-rw-r--r--amforth-6.5/appl/atmega2561/dict_appl.inc5
-rw-r--r--amforth-6.5/appl/atmega2561/dict_appl_core.inc2
-rw-r--r--amforth-6.5/appl/atmega2561/words/applturnkey.asm32
9 files changed, 13417 insertions, 0 deletions
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<<RXCIE1
+ .equ bm_ENABLE_INT_TX = 1<<UDRIE1
+
+ .equ bm_USARTC_en = 0
+ .equ bm_ASYNC = 0 << 6
+ .equ bm_SYNC = 1 << 6
+ .equ bm_NO_PARITY = 0 << 4
+ .equ bm_EVEN_PARITY = 2 << 4
+ .equ bm_ODD_PARITY = 3 << 4
+ .equ bm_1STOPBIT = 0 << 3
+ .equ bm_2STOPBIT = 1 << 3
+ .equ bm_5BIT = 0 << 1
+ .equ bm_6BIT = 1 << 1
+ .equ bm_7BIT = 2 << 1
+ .equ bm_8BIT = 3 << 1
+
+ .include "drivers/usart_common.asm"
+
+ .set USART_C_VALUE = bm_ASYNC | bm_NO_PARITY | bm_1STOPBIT | bm_8BIT
+ .if WANT_INTERRUPTS == 0
+ .if WANT_ISR_RX == 1
+ .endif
+ .endif
+
+ .if WANT_ISR_RX == 1
+ .set USART_B_VALUE = bm_ENABLE_TX | bm_ENABLE_RX | bm_ENABLE_INT_RX
+ .include "drivers/usart-rx-buffer.asm"
+
+
+ ; sizes have to be powers of 2!
+ .equ usart_rx_size = $10
+ .equ usart_rx_mask = usart_rx_size - 1
+ .dseg
+000200 usart_rx_data: .byte usart_rx_size
+000210 usart_rx_in: .byte 1
+000211 usart_rx_out: .byte 1
+ .cseg
+
+ VE_TO_RXBUF:
+00007b ff07 .dw $ff07
+00007c 723e
+00007d 2d78
+00007e 7562
+00007f 0066 .db ">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 "<mark"
+ ; .dw VE_HEAD
+ ; .set VE_HEAD = VE_LMARK
+ XT_LMARK:
+00020d 011b .dw DO_COLON
+ PFA_LMARK:
+00020e 0a13 .dw XT_DP
+00020f 04ae .dw XT_EXIT
+ .include "words/l_resolve.asm"
+
+ ; Compiler
+ ; resolve backward branch
+ ;VE_LRESOLVE:
+ ; .dw $ff08
+ ; .db "<resolve"
+ ; .dw VE_HEAD
+ ; .set VE_HEAD = VE_LRESOLVE
+ XT_LRESOLVE:
+000210 011b .dw DO_COLON
+ PFA_LRESOLVE:
+000211 0fbd .dw XT_QSTACK
+000212 01dc .dw XT_COMMA
+000213 04ae .dw XT_EXIT
+
+ .include "words/ahead.asm"
+
+ ; Compiler
+ ; do a unconditional branch
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_AHEAD:
+000214 0005 .dw $0005
+000215 6861
+000216 6165
+000217 0064 .db "ahead",0
+000218 01f7 .dw VE_HEAD
+ .set VE_HEAD = VE_AHEAD
+ XT_AHEAD:
+000219 011b .dw DO_COLON
+ PFA_AHEAD:
+ .endif
+00021a 01d1 .dw XT_COMPILE
+00021b 04bd .dw XT_DOBRANCH
+00021c 0202 .dw XT_GMARK
+00021d 04ae .dw XT_EXIT
+ .include "words/if.asm"
+
+ ; Compiler
+ ; start conditional branch
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_IF:
+00021e 0002 .dw $0002
+00021f 6669 .db "if"
+000220 0214 .dw VE_HEAD
+ .set VE_HEAD = VE_IF
+ XT_IF:
+000221 011b .dw DO_COLON
+ PFA_IF:
+ .endif
+000222 01d1 .dw XT_COMPILE
+000223 04c7 .dw XT_DOCONDBRANCH
+000224 0202 .dw XT_GMARK
+000225 04ae .dw XT_EXIT
+ .include "words/else.asm"
+
+ ; Compiler
+ ; resolve the forward reference and place a new unresolved forward reference
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_ELSE:
+000226 0004 .dw $0004
+000227 6c65
+000228 6573 .db "else"
+000229 021e .dw VE_HEAD
+ .set VE_HEAD = VE_ELSE
+ XT_ELSE:
+00022a 011b .dw DO_COLON
+ PFA_ELSE:
+ .endif
+00022b 01d1 .dw XT_COMPILE
+00022c 04bd .dw XT_DOBRANCH
+00022d 0202 .dw XT_GMARK
+00022e 055d .dw XT_SWAP
+00022f 0207 .dw XT_GRESOLVE
+000230 04ae .dw XT_EXIT
+ .include "words/then.asm"
+
+ ; Compiler
+ ; finish if
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_THEN:
+000231 0004 .dw $0004
+000232 6874
+000233 6e65 .db "then"
+000234 0226 .dw VE_HEAD
+ .set VE_HEAD = VE_THEN
+ XT_THEN:
+000235 011b .dw DO_COLON
+ PFA_THEN:
+ .endif
+000236 0207 .dw XT_GRESOLVE
+000237 04ae .dw XT_EXIT
+ .include "words/begin.asm"
+
+ ; Compiler
+ ; put the next location for a transfer of control onto the control flow stack
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_BEGIN:
+000238 0005 .dw $0005
+000239 6562
+00023a 6967
+00023b 006e .db "begin",0
+00023c 0231 .dw VE_HEAD
+ .set VE_HEAD = VE_BEGIN
+ XT_BEGIN:
+00023d 011b .dw DO_COLON
+ PFA_BEGIN:
+ .endif
+00023e 020d .dw XT_LMARK
+00023f 04ae .dw XT_EXIT
+ .include "words/while.asm"
+
+ ; Compiler
+ ; at runtime skip until repeat if non-true
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_WHILE:
+000240 0005 .dw $0005
+000241 6877
+000242 6c69
+000243 0065 .db "while",0
+000244 0238 .dw VE_HEAD
+ .set VE_HEAD = VE_WHILE
+ XT_WHILE:
+000245 011b .dw DO_COLON
+ PFA_WHILE:
+ .endif
+000246 0221 .dw XT_IF
+000247 055d .dw XT_SWAP
+000248 04ae .dw XT_EXIT
+ .include "words/repeat.asm"
+
+ ; Compiler
+ ; continue execution at dest, resolve orig
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_REPEAT:
+000249 0006 .dw $0006
+00024a 6572
+00024b 6570
+00024c 7461 .db "repeat"
+00024d 0240 .dw VE_HEAD
+ .set VE_HEAD = VE_REPEAT
+ XT_REPEAT:
+00024e 011b .dw DO_COLON
+ PFA_REPEAT:
+ .endif
+00024f 0262 .dw XT_AGAIN
+000250 0235 .dw XT_THEN
+000251 04ae .dw XT_EXIT
+ .include "words/until.asm"
+
+ ; Compiler
+ ; finish begin with conditional branch, leaves the loop if true flag at runtime
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_UNTIL:
+000252 0005 .dw $0005
+000253 6e75
+000254 6974
+000255 006c .db "until",0
+000256 0249 .dw VE_HEAD
+ .set VE_HEAD = VE_UNTIL
+ XT_UNTIL:
+000257 011b .dw DO_COLON
+ PFA_UNTIL:
+ .endif
+000258 04ce .dw XT_DOLITERAL
+000259 04c7 .dw XT_DOCONDBRANCH
+00025a 01dc .dw XT_COMMA
+
+00025b 0210 .dw XT_LRESOLVE
+00025c 04ae .dw XT_EXIT
+ .include "words/again.asm"
+
+ ; Compiler
+ ; compile a jump back to dest
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_AGAIN:
+00025d 0005 .dw $0005
+00025e 6761
+00025f 6961
+000260 006e .db "again",0
+000261 0252 .dw VE_HEAD
+ .set VE_HEAD = VE_AGAIN
+ XT_AGAIN:
+000262 011b .dw DO_COLON
+ PFA_AGAIN:
+ .endif
+000263 01d1 .dw XT_COMPILE
+000264 04bd .dw XT_DOBRANCH
+000265 0210 .dw XT_LRESOLVE
+000266 04ae .dw XT_EXIT
+ .include "words/do.asm"
+
+ ; Compiler
+ ; start do .. [+]loop
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_DO:
+000267 0002 .dw $0002
+000268 6f64 .db "do"
+000269 025d .dw VE_HEAD
+ .set VE_HEAD = VE_DO
+ XT_DO:
+00026a 011b .dw DO_COLON
+ PFA_DO:
+
+ .endif
+00026b 01d1 .dw XT_COMPILE
+00026c 0734 .dw XT_DODO
+00026d 020d .dw XT_LMARK
+00026e 05ed .dw XT_ZERO
+00026f 02c5 .dw XT_TO_L
+000270 04ae .dw XT_EXIT
+ .include "words/loop.asm"
+
+ ; Compiler
+ ; compile (loop) and resolve the backward branch
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_LOOP:
+000271 0004 .dw $0004
+000272 6f6c
+000273 706f .db "loop"
+000274 0267 .dw VE_HEAD
+ .set VE_HEAD = VE_LOOP
+ XT_LOOP:
+000275 011b .dw DO_COLON
+ PFA_LOOP:
+ .endif
+000276 01d1 .dw XT_COMPILE
+000277 0762 .dw XT_DOLOOP
+000278 02ac .dw XT_ENDLOOP
+000279 04ae .dw XT_EXIT
+ .include "words/plusloop.asm"
+
+ ; Compiler
+ ; compile (+loop) and resolve branches
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_PLUSLOOP:
+00027a 0005 .dw $0005
+00027b 6c2b
+00027c 6f6f
+00027d 0070 .db "+loop",0
+00027e 0271 .dw VE_HEAD
+ .set VE_HEAD = VE_PLUSLOOP
+ XT_PLUSLOOP:
+00027f 011b .dw DO_COLON
+ PFA_PLUSLOOP:
+ .endif
+000280 01d1 .dw XT_COMPILE
+000281 0753 .dw XT_DOPLUSLOOP
+000282 02ac .dw XT_ENDLOOP
+000283 04ae .dw XT_EXIT
+ .include "words/leave.asm"
+
+ ; Compiler
+ ; immediatly leave the current DO..LOOP
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_LEAVE:
+000284 0005 .dw $0005
+000285 656c
+000286 7661
+000287 0065 .db "leave",0
+000288 027a .dw VE_HEAD
+ .set VE_HEAD = VE_LEAVE
+ XT_LEAVE:
+000289 011b .dw DO_COLON
+ PFA_LEAVE:
+ .endif
+00028a 01d1
+00028b 076d .DW XT_COMPILE,XT_UNLOOP
+00028c 0219
+00028d 02c5
+00028e 04ae .DW XT_AHEAD,XT_TO_L,XT_EXIT
+ .include "words/qdo.asm"
+
+ ; Compiler
+ ; start a ?do .. [+]loop control structure
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+
+ VE_QDO:
+00028f 0003 .dw $0003
+000290 643f
+000291 006f .db "?do",0
+000292 0284 .dw VE_HEAD
+ .set VE_HEAD = VE_QDO
+ XT_QDO:
+000293 011b .dw DO_COLON
+ PFA_QDO:
+ .endif
+000294 01d1 .dw XT_COMPILE
+000295 029b .dw XT_QDOCHECK
+000296 0221 .dw XT_IF
+000297 026a .dw XT_DO
+000298 055d .dw XT_SWAP ; DO sets a 0 marker on the leave stack
+000299 02c5 .dw XT_TO_L ; then follows at the end.
+00029a 04ae .dw XT_EXIT
+
+ ; there is no special runtime for ?do, the do runtime
+ ; gets wrapped with the sequence
+ ; ... ?do-check if do ..... loop then
+ ; with
+ ; : ?do-check ( n1 n2 -- n1 n2 true | false )
+ ; 2dup = dup >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 --
+ ; <resolve backward loop
+ ; BEGIN L> ?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) <builds does> 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<<PGERS|1<<SPMEN)
+01f009 d023 rcall dospm
+
+ DO_STOREI_writepage:
+ ; write page
+01f00a 01f9 movw zl, temp2
+01f00b e005 ldi temp0,(1<<PGWRT|1<<SPMEN)
+01f00c d020 rcall dospm
+
+ ; reenable RWW section
+01f00d 01f9 movw zl, temp2
+01f00e e101 ldi temp0,(1<<RWWSRE|1<<SPMEN)
+01f00f d01d rcall dospm
+01f010 9508 ret
+
+ ; load the desired page
+ .equ pagemask = ~ ( PAGESIZE - 1 )
+ pageload:
+01f011 01f9 movw zl, temp2
+ ; get the beginning of page
+01f012 78e0 andi zl,low(pagemask)
+01f013 7fff andi zh,high(pagemask)
+01f014 01ef movw y, z
+ ; loop counter (in words)
+01f015 e8a0 ldi xl,low(pagesize)
+01f016 e0b0 ldi xh,high(pagesize)
+ pageload_loop:
+ ; we need the current flash value anyways
+01f017 01fe movw z, y
+01f018 2755
+01f019 0fee
+01f01a 1fff
+01f01b 1f55
+01f01c bf5b
+01f01d 9147
+01f01e 9157 readflashcell temp6, temp7 ; destroys Z
+ ; now check: if Z points to the same cell as temp2/3, we want the new data
+01f01f 01fe movw z, y
+01f020 17e2 cp zl, temp2
+01f021 07f3 cpc zh, temp3
+01f022 f011 breq pageload_newdata
+01f023 010a movw r0, temp6
+01f024 c002 rjmp pageload_cont
+ pageload_newdata:
+01f025 017a movw temp4, temp6
+01f026 010c movw r0, tosl
+ pageload_cont:
+01f027 e001 ldi temp0,(1<<SPMEN)
+01f028 d004 rcall dospm
+01f029 9621 adiw y, 1
+01f02a 9711 sbiw x, 1
+01f02b f759 brne pageload_loop
+
+ pageload_done:
+01f02c 9508 ret
+
+
+ ;; dospm
+ ;;
+ ;; execute spm instruction
+ ;; temp0 holds the value for SPMCR
+
+ dospm:
+ ; store status register
+01f02d b71f in temp1,SREG
+01f02e 931f push temp1
+01f02f 94f8 cli
+ Wait_ee:
+01f030 99f9 sbic EECR, EEPE
+01f031 cffe rjmp Wait_ee
+ wait_spm:
+01f032 b717 in temp1, SPMCSR
+01f033 fd10 sbrc temp1, SPMEN
+01f034 cffd rjmp Wait_spm
+
+ ; turn the word addres into a byte address
+01f035 2755
+01f036 0fee
+01f037 1fff
+01f038 1f55
+01f039 bf5b writeflashcell
+ ; execute spm
+01f03a bf07 out SPMCSR,temp0
+01f03b 95e8 spm
+01f03c 911f pop temp1
+ ; restore status register
+01f03d bf1f out SREG,temp1
+01f03e 9508 ret
+
+ .org _pc
+ .else
+ .endif
+ .include "words/fetch-i.asm"
+
+ ; Memory
+ ; read 1 cell from flash
+ VE_FETCHI:
+000829 ff02 .dw $ff02
+00082a 6940 .db "@i"
+00082b 0811 .dw VE_HEAD
+ .set VE_HEAD = VE_FETCHI
+ XT_FETCHI:
+00082c 082d .dw PFA_FETCHI
+ PFA_FETCHI:
+00082d 01fc movw zl, tosl
+00082e 2755
+00082f 0fee
+000830 1fff
+000831 1f55
+000832 bf5b
+000833 9187
+000834 9197 readflashcell tosl,tosh
+000835 c8e9 jmp_ DO_NEXT
+
+ .if AMFORTH_NRWW_SIZE>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) <builds does> 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 @@
+<!-- make multiple targets with antelope -->
+<project name="Atmega256" basedir="." default="Help">
+
+ <import file="../avr-build.xml"/>
+ <target name="atmega256.hex" description="Hexfiles for AVR atmega256">
+ <avrasm2 projectname="atmega256" mcu="atmega2561"/>
+ </target>
+
+ <target name="atmega256" depends="atmega256.hex" description="AVR atmega256: Atmega2561 @ 14.7456 MHz">
+ <echo>Uploading Hexfiles for AVR atmega256</echo>
+ <avrdude
+ type="dragon"
+ mcu="m2561"
+ flashfile="atmega256.hex"
+ eepromfile="atmega256.eep.hex"
+ />
+ </target>
+ <target name="compile" depends="atmega256.hex">
+ </target>
+
+</project>
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