From 67d25d837ac55f28a366c0a3b262e439a6e75fc3 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Sat, 19 Aug 2017 12:15:28 +0200 Subject: Add AmForth --- amforth-6.5/appl/eval-pollin/blocks/hd44780.frt | 115 + .../appl/eval-pollin/blocks/hello-world.frt | 81 + amforth-6.5/appl/eval-pollin/blocks/netio.frt | 32 + amforth-6.5/appl/eval-pollin/build.xml | 15 + amforth-6.5/appl/eval-pollin/dict_appl.inc | 8 + amforth-6.5/appl/eval-pollin/dict_appl_core.inc | 2 + amforth-6.5/appl/eval-pollin/p1284-16.eep.hex | 7 + amforth-6.5/appl/eval-pollin/p1284-16.hex | 646 ++ amforth-6.5/appl/eval-pollin/p1284-16.lst | 10495 +++++++++++++++++++ amforth-6.5/appl/eval-pollin/p1284-16.map | 2253 ++++ amforth-6.5/appl/eval-pollin/p1284-16.xml | 36 + amforth-6.5/appl/eval-pollin/p16-8.eep.hex | 7 + amforth-6.5/appl/eval-pollin/p16-8.hex | 625 ++ amforth-6.5/appl/eval-pollin/p16-8.lst | 10363 ++++++++++++++++++ amforth-6.5/appl/eval-pollin/p16-8.map | 1961 ++++ amforth-6.5/appl/eval-pollin/p16-8.xml | 36 + amforth-6.5/appl/eval-pollin/p32-16.xml | 45 + amforth-6.5/appl/eval-pollin/p32-8.eep.hex | 7 + amforth-6.5/appl/eval-pollin/p32-8.hex | 628 ++ amforth-6.5/appl/eval-pollin/p32-8.lst | 10420 ++++++++++++++++++ amforth-6.5/appl/eval-pollin/p32-8.map | 1933 ++++ amforth-6.5/appl/eval-pollin/p32-8.xml | 35 + amforth-6.5/appl/eval-pollin/p328-16.eep.hex | 7 + amforth-6.5/appl/eval-pollin/p328-16.hex | 633 ++ amforth-6.5/appl/eval-pollin/p328-16.lst | 10427 ++++++++++++++++++ amforth-6.5/appl/eval-pollin/p328-16.map | 2054 ++++ amforth-6.5/appl/eval-pollin/p328-16.xml | 36 + amforth-6.5/appl/eval-pollin/p644-16.eep.hex | 7 + amforth-6.5/appl/eval-pollin/p644-16.hex | 635 ++ amforth-6.5/appl/eval-pollin/p644-16.lst | 10444 ++++++++++++++++++ amforth-6.5/appl/eval-pollin/p644-16.map | 2133 ++++ amforth-6.5/appl/eval-pollin/p644-16.xml | 27 + amforth-6.5/appl/eval-pollin/p8-12.xml | 25 + amforth-6.5/appl/eval-pollin/pollin.asm | 21 + amforth-6.5/appl/eval-pollin/words/applturnkey.asm | 30 + 35 files changed, 66229 insertions(+) create mode 100644 amforth-6.5/appl/eval-pollin/blocks/hd44780.frt create mode 100644 amforth-6.5/appl/eval-pollin/blocks/hello-world.frt create mode 100644 amforth-6.5/appl/eval-pollin/blocks/netio.frt create mode 100644 amforth-6.5/appl/eval-pollin/build.xml create mode 100644 amforth-6.5/appl/eval-pollin/dict_appl.inc create mode 100644 amforth-6.5/appl/eval-pollin/dict_appl_core.inc create mode 100644 amforth-6.5/appl/eval-pollin/p1284-16.eep.hex create mode 100644 amforth-6.5/appl/eval-pollin/p1284-16.hex create mode 100644 amforth-6.5/appl/eval-pollin/p1284-16.lst create mode 100644 amforth-6.5/appl/eval-pollin/p1284-16.map create mode 100644 amforth-6.5/appl/eval-pollin/p1284-16.xml create mode 100644 amforth-6.5/appl/eval-pollin/p16-8.eep.hex create mode 100644 amforth-6.5/appl/eval-pollin/p16-8.hex create mode 100644 amforth-6.5/appl/eval-pollin/p16-8.lst create mode 100644 amforth-6.5/appl/eval-pollin/p16-8.map create mode 100644 amforth-6.5/appl/eval-pollin/p16-8.xml create mode 100644 amforth-6.5/appl/eval-pollin/p32-16.xml create mode 100644 amforth-6.5/appl/eval-pollin/p32-8.eep.hex create mode 100644 amforth-6.5/appl/eval-pollin/p32-8.hex create mode 100644 amforth-6.5/appl/eval-pollin/p32-8.lst create mode 100644 amforth-6.5/appl/eval-pollin/p32-8.map create mode 100644 amforth-6.5/appl/eval-pollin/p32-8.xml create mode 100644 amforth-6.5/appl/eval-pollin/p328-16.eep.hex create mode 100644 amforth-6.5/appl/eval-pollin/p328-16.hex create mode 100644 amforth-6.5/appl/eval-pollin/p328-16.lst create mode 100644 amforth-6.5/appl/eval-pollin/p328-16.map create mode 100644 amforth-6.5/appl/eval-pollin/p328-16.xml create mode 100644 amforth-6.5/appl/eval-pollin/p644-16.eep.hex create mode 100644 amforth-6.5/appl/eval-pollin/p644-16.hex create mode 100644 amforth-6.5/appl/eval-pollin/p644-16.lst create mode 100644 amforth-6.5/appl/eval-pollin/p644-16.map create mode 100644 amforth-6.5/appl/eval-pollin/p644-16.xml create mode 100644 amforth-6.5/appl/eval-pollin/p8-12.xml create mode 100644 amforth-6.5/appl/eval-pollin/pollin.asm create mode 100644 amforth-6.5/appl/eval-pollin/words/applturnkey.asm (limited to 'amforth-6.5/appl/eval-pollin') diff --git a/amforth-6.5/appl/eval-pollin/blocks/hd44780.frt b/amforth-6.5/appl/eval-pollin/blocks/hd44780.frt new file mode 100644 index 0000000..0524f5f --- /dev/null +++ b/amforth-6.5/appl/eval-pollin/blocks/hd44780.frt @@ -0,0 +1,115 @@ +\ +\ Module: hd44780 routines +\ use the hd44780 module in 8bit mode +\ v 0.9 + +\ needs marker.frt and bitnames.frt from lib + +marker _hd44780_ + + +hex + +\ for the pollin addon board 1.0 +1b 20 + constant hd44780-data \ PORTA +18 20 + constant hd44780-ctrl \ PORTB + +hd44780-ctrl 1 portpin: hd44780-rw +hd44780-ctrl 0 portpin: hd44780-en +hd44780-ctrl 2 portpin: hd44780-rs + +2 constant hd44780-pulse-delay +a constant hd44780-short-delay + +: hd44780-pulse-en + hd44780-en high + hd44780-pulse-delay ms + hd44780-en low + hd44780-pulse-delay ms +; + +: hd44780-data-mode + hd44780-rs high +; + +: hd44780-command-mode + hd44780-rs low +; + + +: hd44780-read-mode + 0 hd44780-data 1- c! \ input + hd44780-rw high +; + +: hd44780-write-mode + ff hd44780-data 1- c! \ output + hd44780-rw low +; + +: hd44780-read-data ( -- c ) + hd44780-read-mode + hd44780-pulse-en + hd44780-short-delay ms + hd44780-data 1- 1- c@ +; + +: hd44780-wait + hd44780-read-mode + hd44780-rw high + hd44780-rs low + hd44780-pulse-en + begin + hd44780-data 1- 1- c@ + 80 and + until +; + +: hd44780-command ( n -- ) + hd44780-wait + hd44780-write-mode + hd44780-command-mode + hd44780-data c! + hd44780-pulse-en +; + +: hd44780-emit ( c -- ) + hd44780-write-mode + hd44780-data-mode + hd44780-data c! + hd44780-pulse-en +; + +: hd44780-init + hd44780-rw pin_output + hd44780-en pin_output + hd44780-rs pin_output +; +\ from tracker: hd44780.frt - added LCD initialization - ID: 2785157 +: hd44780-cmd-no-wait ( n -- ) + hd44780-write-mode + hd44780-command-mode + hd44780-data c! + hd44780-pulse-en +; + +: hd44780-start + hd44780-init + 15 ms + 30 hd44780-cmd-no-wait + 4 ms + 30 hd44780-cmd-no-wait + 1 ms + 30 hd44780-cmd-no-wait + 38 hd44780-command + 6 hd44780-command + c hd44780-command + 1 hd44780-command +; + + +: hd44780-page ( clear page ) + 1 hd44780-command ( clear hd44780 ) + 3 hd44780-command ( cursor home ) +; + diff --git a/amforth-6.5/appl/eval-pollin/blocks/hello-world.frt b/amforth-6.5/appl/eval-pollin/blocks/hello-world.frt new file mode 100644 index 0000000..94073b8 --- /dev/null +++ b/amforth-6.5/appl/eval-pollin/blocks/hello-world.frt @@ -0,0 +1,81 @@ +\ test routines for the atmel evaluation +\ boards from www.pollin.de +\ needs the device register definitions loaded + +#require ms.frt + +marker _pollin_ + +decimal + +\ wait some milliseconds +: blinkdelay 250 ms ; + +PORTD 5 portpin: led1 +PORTD 6 portpin: led2 + +PORTD 2 portpin: key1 +PORTD 3 portpin: key2 +PORTD 4 portpin: key3 + +GICR 7 portpin: en_int1 +GICR 6 portpin: en_int0 +GICR 5 portpin: en_int2 + +: +demoports + led1 pin_output + led2 pin_output + key1 pin_input + key2 pin_input + key3 pin_input + + 05 MCUCR c! \ int0/1 + en_int1 high + en_int0 high + en_int2 low +; + +\ test runs until a terminal-key is pressed + +\ as long as a key on the board is pressed the +\ corresponding led/buzzer is turned on +: keys + begin + PIND c@ + [ hex ] fc and + 3 lshift + PORTD c! + key? until + key drop \ we do not want to keep this key stroke +; + + +: blink ( -- ) + led1 high blinkdelay + led2 high blinkdelay + led2 low blinkdelay + led1 low blinkdelay +; + +: led1blink + led1 high + blinkdelay + led1 low +; + +\ simple lights on/off +: led + begin + blink + key? + until + key drop \ we do not want to keep this key stroke +; + +\ interrupt processing takes a long time, do not +\ press the key while it runs... +\ ' led1blink 1 int! +\ ' noop 2 int! + +\ autoconfig the i/o ports +\ ' portinit 'turnkey e! diff --git a/amforth-6.5/appl/eval-pollin/blocks/netio.frt b/amforth-6.5/appl/eval-pollin/blocks/netio.frt new file mode 100644 index 0000000..6c1f62c --- /dev/null +++ b/amforth-6.5/appl/eval-pollin/blocks/netio.frt @@ -0,0 +1,32 @@ + +\ Definitions for the netio-addon board + +\ SPI communication pins + PORTB 4 portpin: /ss + PORTB 5 portpin: _mosi + PORTB 6 portpin: _miso + PORTB 7 portpin: _clk + +\ setup the SPI pins + : +spi ( -- ) + /ss high \ activate pullup! + _mosi high _mosi pin_output + _clk low _clk pin_output + ; + + : -spi 0 SPCR c! ; + + \ transfer 1 cell + : >< c!@spi + swap c!@spi + swap >< + + ; + +: +mmc + /ss low +; +: -mmc + /ss high +; + diff --git a/amforth-6.5/appl/eval-pollin/build.xml b/amforth-6.5/appl/eval-pollin/build.xml new file mode 100644 index 0000000..081eea6 --- /dev/null +++ b/amforth-6.5/appl/eval-pollin/build.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/amforth-6.5/appl/eval-pollin/dict_appl.inc b/amforth-6.5/appl/eval-pollin/dict_appl.inc new file mode 100644 index 0000000..a7e4b42 --- /dev/null +++ b/amforth-6.5/appl/eval-pollin/dict_appl.inc @@ -0,0 +1,8 @@ +; this dictionary contains optional words +; they may be moved to the core dictionary if needed +.include "words/dot-s.asm" +.include "words/spirw.asm" +.include "words/n-spi.asm" +.include "words/applturnkey.asm" +.include "dict/compiler2.inc" +.include "words/2r_fetch.asm" diff --git a/amforth-6.5/appl/eval-pollin/dict_appl_core.inc b/amforth-6.5/appl/eval-pollin/dict_appl_core.inc new file mode 100644 index 0000000..93c0d8a --- /dev/null +++ b/amforth-6.5/appl/eval-pollin/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/eval-pollin/p1284-16.eep.hex b/amforth-6.5/appl/eval-pollin/p1284-16.eep.hex new file mode 100644 index 0000000..dfec159 --- /dev/null +++ b/amforth-6.5/appl/eval-pollin/p1284-16.eep.hex @@ -0,0 +1,7 @@ +:10004600FFFF9A05CB01A00042046E00B040EC040D +:0A0056004DF55A00A8FD01005A0004 +:06006E0002003FFB2BFB2A +:1000780090F37A0000000000FF40AF40AF4000005E +:100088000A00B600C4008B00A60040FD00002DFD4C +:0800980005FA24FA14FA19001C +:00000001FF diff --git a/amforth-6.5/appl/eval-pollin/p1284-16.hex b/amforth-6.5/appl/eval-pollin/p1284-16.hex new file mode 100644 index 0000000..1f80cb8 --- /dev/null +++ b/amforth-6.5/appl/eval-pollin/p1284-16.hex @@ -0,0 +1,646 @@ +: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 +:10008800F7D000400010FFFF23000B0041546D65BE +:10009800676131323834500007FF3E72782D62753F +:1000A800660000005700082F10911001E0E0F1E011 +:1000B800E10FF31D008313951F70109310018991B0 +:1000C80099910C9405F006FF6973722D72785000AF +:1000D80001F046F0C600AAF0C3F046F003009AFD0E +:1000E8003FF0770074FA560026F001F046F06C00F5 +:1000F80046F02800A2F446F0000146F0160066F12A +:10010800EAF426F006FF72782D627566670001F042 +:10011800A6003FF08C0046F01101AAF0C3F046F0AB +:100128000001AFF1AAF0D6F041F246F00F0025F237 +:1001380046F011019FF026F007FF72783F2D627597 +:100148006600860001F06CFA46F01101AAF046F04C +:100158001001AAF025F126F007FF74782D706F6C56 +:100168006C00A00001F0C4003FF0B70046F0C600E4 +:100178009FF026F008FF74783F2D706F6C6CB0000C +:1001880001F06CFA46F0C000AAF046F0200025F213 +:1001980026F004FF75627272BE0081F09E00CFFBEC +:1001A800D9FB06FF2B7573617274CD0001F046F020 +:1001B800980046F0C1009FF046F0060046F0C200E5 +:1001C8009FF0D100C3F00BF346F0C5009FF046F056 +:1001D800C4009FF0790026F008FF31772E7265730E +:1001E8006574D500F7009A938A93249A2C98E0E8CE +:1001F800F7E03197F1F71FB7F8942C9A2498E0E0CC +:10020800F1E03197F1F783B184FF9FEF1FBF249886 +:100218002C98E0E8F6E03197F1F7892F0C9405F077 +:1002280007FF31772E736C6F7400F0001B012C9858 +:10023800249A1FB7F894E8E1F0E03197F1F7889431 +:10024800879510F42C9A2498E4E2F0E03197F1F7BE +:1002580003B104FD8068ECECF0E03197F1F72C9ADB +:100268002498E8E0F0E03197F1F71FBF0C9405F00F +:040000000C9475FAED +:100278000A920FB60A920F900F900A94B02CFF932F +:10028800EF93E2E1F1E00694E00DF31D00800394A2 +:100298000082EF91FF9109900FBE0990089502FF27 +:1002A8006D2B140101F082FD30F426F003FF756414 +:1002B8002A00530101F0C3F011F1F2F1EBF0D6F08E +:1002C80008F1F2F1F3F0AFF126F004FF756D6178F3 +:1002D8005A0101F080F56EF13FF07301D6F0EBF0B2 +:1002E80026F004FF756D696E690101F080F579F1FA +:1002F8003FF07F01D6F0EBF026F001F046F00080E9 +:1003080025F22CF13FF08A01A1FD26F05DF126F0DF +:100318000AFF6E616D653E666C616773750101F079 +:10032800E3F346F000FF25F226F006FF6E657765D9 +:1003380073748C0154F0350106FF6C617465737435 +:10034800990154F0390108FF2863726561746529C1 +:10035800A00101F0CFF90403C3F09E0179F593F0F1 +:10036800E9029E0193F026F001005C00A70101F06C +:10037800B6F902F199F593F026F001002800B801CA +:1003880001F046F02900A2F989F526F007FF636F0E +:100398006D70696C6500C10101F008F1C3F0C6FB1E +:1003A80011F1E3F3DB0126F001FF2C00CA0101F093 +:1003B800C9F585F3C9F541F2B4FBCAF526F0030087 +:1003C8005B275D00D80101F025F8F10126F0070050 +:1003D8006C69746572616C00E30101F0D00146F04C +:1003E800DB0126F00800736C69746572616CEB01BF +:1003F80001F0D00188F796F726F001F0C9F5D00191 +:10040800FFFF26F001F072FBC9F5D6F085F326F060 +:1004180001F0C9F526F001F072FBDB0126F00500BA +:10042800616865616400F60101F0D00135F00102F0 +:1004380026F002006966130201F0D0013FF00102C4 +:1004480026F00400656C73651D0201F0D00135F0DB +:100458000102D6F0060226F004007468656E2502D3 +:1004680001F0060226F00500626567696E00300239 +:1004780001F00C0226F005007768696C6500370208 +:1004880001F02002D6F026F00600726570656174EE +:100498003F0201F06102340226F00500756E7469AE +:1004A8006C00480201F046F03FF0DB010F0226F035 +:1004B8000500616761696E00510201F0D00135F0F5 +:1004C8000F0226F00200646F5C0201F0D001ADF269 +:1004D8000C0266F1C40226F004006C6F6F706602AD +:1004E80001F0D001DBF2AB0226F005002B6C6F6F38 +:1004F8007000700201F0D001CCF2AB0226F00500CA +:100508006C6561766500790201F0D001E6F21802A7 +:10051800C40226F003003F646F00830201F0D0019B +:100528009A0220026902D6F0C40226F001F080F592 +:100538009AFDC3F011F13FF0A20289F508F10FF21C +:1005480026F007FF656E646C6F6F70008E0201F015 +:100558000F02B802CBF03FF0B402340235F0AD021E +:1005680026F002FF6C3EA50201F0D7028BF08BF05B +:1005780046F0FEFFD70277F226F002FF3E6CB50286 +:1005880001F0A6FDD70277F2D7028BF093F026F0A0 +:1005980003FF6C703000C10281F05200CFFBD9FB21 +:1005A80002FF6C70CC0254F03B0106FF6372656178 +:1005B8007465D40201F0AD010D03D00161F026F09D +:1005C80006FF686561646572D90201F0C9F511F129 +:1005D80011F1C3F03AF13FF0FB02C3F046F000FF1F +:1005E8002EF29AF708F171F3DB0108F126F046F0D4 +:1005F800F0FF5CF807FF776C73636F706500E402C7 +:100608002EFC4E00CFFBD9FB06FF72657665616C48 +:10061800FE0201F09E0179F58BF0CBF03FF0180354 +:100628009E018BF0D6F04DF326F00500646F6573DC +:100638003E00080301F0D0013103D0010E94D0012F +:10064800260326F09A938A93CB0101967F916F91A6 +:10065800BF93AF93DB010C9405F001F008F19E0104 +:1006680079F58BF071F399FC85F326F001FF3A00D8 +:10067800190301F0AD014803EBF026F007FF3A6ECD +:100688006F6E616D65003A0301F0C9F5C3F0A5010D +:1006980093F0D00101F05D0326F001003B00420316 +:1006A80001F0D00126F065030D0326F001FF5D007F +:1006B800510301F0A1FD66F593F026F001005B00FF +:1006C8005A0301F066F166F593F026F008FF7661AB +:1006D800726961626C65620301F0DAF57C03A6FD5C +:1006E800E3F526F008FF636F6E7374616E746A0336 +:1006F80001F0AD010D03D00154F0DB0126F004FF39 +:1007080075736572760301F0AD010D03D00167F0D2 +:10071800DB0126F007007265637572736500830359 +:1007280001F0A5018BF0DB0126F009FF696D6D650D +:100738006469617465008E0301F0420471F3C3F0CB +:10074800E3F346F0FF7F25F2D6F085F326F00600A6 +:100758005B636861725D990301F0D00146F005F9A9 +:10076800DB0126F0060061626F727422AB0301F0B0 +:10077800DCF4D001CD0326F005FF61626F727400CE +:10078800B60301F05DF15CF806FF3F61626F7274B9 +:10079800C00301F0F3F03FF0D303BBF7C50389F5BD +:1007A80026F009FF6765742D737461636B00C803D5 +:1007B80001F0C3F079F5D6F071F3C3F011F166F1E9 +:1007C800D6F09A023FF0F303ADF2BEF247F273F5AA +:1007D800E1F0AFF171F3D6F05DF1CCF2E90389F500 +:1007E80008F126F009FF7365742D737461636B005B +:1007F800D50301F0E1F033F13FF0050446F0FCFFCA +:100808005CF880F54DF3D6F066F19A023FF01204D9 +:10081800ADF279F591F54DF3DBF20D04EBF026F02E +:1008280009FF6D61702D737461636B00F60301F04D +:10083800C3F079F5D6F071F373F579FD9A023FF0BC +:100848003704ADF2BEF271F3D6F011F11AF130F0BF +:10085800CBF03FF0330408F1EBF0E6F226F008F1B4 +:10086800A6FDCCF22604EBF066F126F00BFF6765D7 +:10087800742D63757272656E7400140401F046F08D +:10088800580071F326F009FF6765742D6F7264656F +:1008980072003A0401F046F05C00DC0326F009FF20 +:1008A8006366672D6F7264657200470454F05C00DC +:1008B80007FF636F6D706172650053046304BF9333 +:1008C800AF938C0189919991DC01899199919C014F +:1008D80089919991FC01ED90F190EF1451F40A95EA +:1008E80019F02A95C1F701C02A95022B11F488271F +:1008F80002C08FEF00C0982FAF91BF910C9405F004 +:1009080007FF6E66613E6C6661005C0401F08DFC59 +:1009180041F216F2AFF126F002FF2E73840401F0C3 +:10092800BCFA63F4FDF7BCFA66F19A023FF0A20440 +:10093800ADF2BEF2CAF463F4DBF29D0426F006FFC2 +:100948006321407370699004A90403D099270C941B +:1009580005F08EBD0DB5087F0DBD0DB507FFFACFAB +:100968008EB5089505FF6E4073706900A304BC043A +:100978008C0189919991FC01C8012EBC2DB527FFE6 +:10098800FDCF2EB521930197C1F7899199910C94C8 +:1009980005F005FF6E2173706900B604D3048C015D +:1009A80089919991FC01C80121912EBD2DB527FF90 +:1009B800FDCF2EB50197C1F7899199910C9405F057 +:1009C8000BFF6170706C7475726E6B657900CD0485 +:1009D80001F0DA0094F47FFBFDF75BF546F0E803DD +:1009E800D4F102F1F8F53DF788F704006B487A2056 +:1009F800BBF726F00BFF7365742D63757272656E15 +:100A08007400E40401F046F058004DF326F008FFA6 +:100A1800776F72646C697374FE0401F0D2F566F145 +:100A2800E1F04DF3C3F079F5B4FBD3F526F00EFFF2 +:100A3800666F7274682D776F72646C6973740B05D6 +:100A480054F05A0009FF7365742D6F726465720063 +:100A58001B0501F046F05C00FD0326F00FFF7365EF +:100A6800742D7265636F676E697A65727300260507 +:100A780001F046F06E00FD0326F00FFF6765742D48 +:100A88007265636F676E697A65727300320501F08B +:100A980046F06E00DC0326F004FF636F64654105D1 +:100AA80001F0AD010D03C9F5C6FBDB0126F008FF17 +:100AB800656E642D636F6465500501F0D0010C9478 +:100AC800D00105F026F008FF286D61726B65722968 +:100AD8005B0581F07A00CFFBD9FB0800706F737457 +:100AE800706F6E65670501F0CFF9E7FAF2FAC3F0A7 +:100AF80011F1C6FBC6FBE3F330F008F1C6FBE3F3E4 +:100B0800DB0126F003FF3272400071058B059A93D2 +:100B18008A93EF91FF918F919F919F938F93FF936A +:0C0B2800EF939A938A93CF010C9405F090 +:020000021000EC +:10E00200BF93AF93DB011196B21499F4FD0155272A +:10E01200EE0FFF1F551F5BBF679177911196FB01B2 +:10E022005527EE0FFF1F551F5BBF07911791F80190 +:10E0320009949A938A938B2D9927BB246DEB74EFE5 +:10E04200EECF04FF65786974860527F0AF91BF9122 +:10E05200DBCF07FF657865637574650022F031F0E8 +:10E06200BC0189919991DBCF36F0FD015527EE0F66 +:10E07200FF1F551F5BBFA791B791C6CF40F0982BEA +:10E082008991999191F31196BFCF47F09A938A9310 +:10E09200FD015527EE0FFF1F551F5BBF879197911B +:10E0A2001196B2CF54F09A938A93FB013196552779 +:10E0B200EE0FFF1F551F5BBF87919791A5CF61F0B0 +:10E0C2009A938A93CB0101969FCF67F09A938A9392 +:10E0D200FB0131965527EE0FFF1F551F5BBF87913E +:10E0E2009791840D951D90CF07FF2876616C756519 +:10E0F20029002AF001F0AD010D03D00181F026F0D4 +:10E102000E942603C3F0C6FBE3F330F026F001FFC2 +:10E11200400075F08CF0FC018191919175CF01FF67 +:10E12200210088F094F0FC01899199919183808378 +:10E132008991999169CF02FF632190F0A0F0FC01CF +:10E14200899199918083899199915ECF02FF634071 +:10E152009CF0ABF0FC019927808156CF02FF4075FD +:10E16200A7F001F014F3AFF18BF026F002FF217556 +:10E17200AFF001F014F3AFF193F026F003FF6475F2 +:10E182007000B7F0C4F09A938A933ECF04FF3F64C5 +:10E192007570BFF0CCF0082F092B11F09A938A9377 +:10E1A20033CF04FF73776170C7F0D7F08C01899188 +:10E1B20099911A930A9328CF04FF6F766572D2F071 +:10E1C200E2F09A938A938A819B811ECF04FF647244 +:10E1D2006F70DDF0ECF08991999116CF03FF726FA9 +:10E1E2007400E7F0F4F08C012991399189919991A9 +:10E1F2003A932A931A930A9307CF03FF6E6970002A +:10E20200EFF003F1229600CF02FF723EFEF009F119 +:10E212009A938A938F919F91F7CE02FF3E7205F1F6 +:10E2220012F19F938F9389919991EECE02FF7240E2 +:10E232000EF11BF19A938A938F919F919F938F93E3 +:10E24200E3CE02FF3C3E17F101F09AFD2CF126F0DD +:10E2520002FF303D22F12DF1982BD1F530C002FFA3 +:10E26200303C29F134F197FD2AC032C002FF303E22 +:10E2720030F13BF1821593055CF151F120C003FFAF +:10E2820064303E0037F145F18215930589919991E9 +:10E2920082059305ECF0E1F012C003FF64303C000C +:10E2A20040F153F1229697FD0C9460F10C9469F1C0 +:10E2B20004FF747275654EF15EF19A938A938FEF43 +:10E2C2009FEFA2CE01FF300059F167F19A938A9332 +:10E2D200C1019ACE02FF753C63F16FF12991399128 +:10E2E20082179307A8F3A1F3EACF02FF753E6BF101 +:10E2F20001F0D6F06EF126F001FF3C0076F181F1DB +:10E3020029913991281739071CF7D9CF01FF3E000F +:10E312007DF18BF12991399128173907CCF2C1F29D +:10E32200CECF04FF6C6F673287F197F1FC0199271A +:10E3320080E18A9522F0EE0FFF1FD8F765CE9A95FD +:10E3420063CE01FF2D0092F1A6F109911991081BEC +:10E35200190BC80159CE01FF2B00A2F1B0F10991AE +:10E362001991800F911F50CE02FF6D2AACF1B9F1C5 +:10E372008C01899199919C0131027001209FC00109 +:10E382003003F308900DE11CF31C1203F308900D07 +:10E39200E11CF31C9A938A93C70136CE06FF756D72 +:10E3A2002F6D6F64B5F1D5F17C01299139910991F5 +:10E3B200199140E15527000F111F221F331F551FCE +:10E3C2002E153F05520518F003952E193F094A955F +:10E3D20089F73A932A93C80117CE03FF756D2A0075 +:10E3E200CFF1F3F18C0189919991809FF00122275D +:10E3F2003327909FF00D211D331D819FF00D211DAC +:10E40200331D919F200D311DCF019A938A93C9012B +:10E41200FBCD06FF696E76657274EEF110F280959F +:10E422009095F2CD02FF322F0AF217F29595879559 +:10E43200EBCD02FF322A13F21EF2880F991FE4CDB0 +:10E4420003FF616E64001AF226F20991199180238A +:10E452009123DACD02FF6F7221F22FF20991199105 +:10E46200802B912BD1CD03FF786F72002BF239F202 +:10E472000991199180279127C7CD02FF312B34F2E0 +:10E4820042F20196C1CD02FF312D3EF248F20197D0 +:10E49200BBCD07FF3F6E65676174650044F201F012 +:10E4A20033F13FF055F25AF626F006FF6C736869B5 +:10E4B20066744AF25CF2FC018991999131971AF0E3 +:10E4C200880F991FFBCFA0CD06FF7273686966742F +:10E4D20056F26BF2FC018991999131971AF0969557 +:10E4E2008795FBCF91CD02FF2B2165F278F2FC01DB +:10E4F2008991999120813181820F931F8083918329 +:10E502008991999181CD03FF7270400074F289F272 +:10E512009A938A938DB79EB777CD03FF72702100CD +:10E5220084F293F22FB7F8948DBF9EBF2FBF8991CB +:10E5320099916ACD03FF737040008EF2A0F29A9314 +:10E542008A93CE0161CD03FF737021009BF2A9F281 +:10E55200EC018991999158CDAEF229913991E0E877 +:10E562003E0F821B930B3F932F939F938F9389911F +:10E5720099914ACD01FF6900A4F2BFF29A938A935E +:10E582008F919F91EF91FF91FF93EF939F938F93C1 +:10E592008E0F9F1F39CDCDF2EF91FF91E80FF91F3A +:10E5A200899199911BF0FF93EF935FCD0F911F918A +:10E5B20011962ACDDCF2EF91FF913196BBF3F3CFA6 +:10E5C20006FF756E6C6F6F70BBF2E7F21F910F91D1 +:10E5D2001F910F9119CD06FF636D6F76653EE1F2D3 +:10E5E200F2F2BF93AF93E991F991A991B991092FF1 +:10E5F200082B41F0E80FF91FA80FB91F1E911293C3 +:10E602000197E1F7AF91BF9189919991FDCC02FFFA +:10E612003E3CECF20CF3092F982F802FF5CC03FF30 +:10E622007570400008F315F39A938A93C201ECCCFB +:10E6320003FF7570210010F31EF32C01899199914B +:10E64200E3CC03FF316D730019F327F3E0EAFFE037 +:10E652003197F1F7D9CC03FF323E720022F331F346 +:10E66200FC01899199919F938F93FF93EF938991E5 +:10E672009991CACC03FF32723E002CF340F39A9375 +:10E682008A93EF91FF918F919F919A938A93CF01F1 +:10E69200BBCC02FF21653BF34EF3FC0189919991BA +:10E6A2002FB7F89428D000B5081709F00BD031968F +:10E6B20022D000B5091711F0892F04D02FBF8991FC +:10E6C2009991A2CCF999FECF07B700FDFDCFF2BD1B +:10E6D200E1BD80BDFA9AF99A089502FF40654AF3B6 +:10E6E20072F32FB7F894FC0106D080B5319603D0AF +:10E6F20090B52FBF89CCF999FECFF2BDE1BDF89A52 +:10E70200089502FF21696EF32EFC7800CFFBD9FB3E +:10E7120009FF2821692D6E727777290082F391F320 +:10E722001FB71F93F8949C0189919991AF93BF935E +:10E73200CF93DF9309D0DF91CF91BF91AF918991B0 +:10E7420099911F911FBF60CC10D0E094F0948E215C +:10E752009F21982B19F0F90102E023D0F90104E07E +:10E7620020D0F90100E11DD00895F901E078FF7F82 +:10E77200EF01A0E8B0E0FE015527EE0FFF1F551F85 +:10E782005BBF47915791FE01E217F30711F00A01AF +:10E7920002C07A010C01002704D02196119759F783 +:10E7A2000895F999FECF17B710FDFDCF5527EE0F4B +:10E7B200FF1F551F5BBF016007BFE895089502FF69 +:10E7C200406989F3E4F3FC015527EE0FFF1F551F43 +:10E7D2005BBF8791979118CC03FF6E3E7200E0F306 +:10E7E200F2F3FC01082F899199919F938F930A95D7 +:10E7F200D1F7EF93FF938991999106CC03FF6E7243 +:10E802003E00EDF304F49A938A93FF91EF910E2F59 +:10E812008F919F919A938A930A95D1F7CF01F4CB66 +:10E8220003FF64322A00FFF316F409911991000FD5 +:10E83200111F881F991F1A930A93E6CB03FF6432B4 +:10E842002F0011F424F40991199195958795179544 +:10E8520007951A930A93D8CB02FF642B1FF431F465 +:10E8620029913991E990F99049915991240F351FD5 +:10E872008E1D9F1D3A932A93C7CB02FF642D2DF460 +:10E8820042F429913991E990F99049915991421BA9 +:10E89200530BE80AF90A5A934A93C701B5CB07FF0B +:10E8A20064696E76657274003EF457F409911991A9 +:10E8B20080959095009510951A930A93A5CB02FF27 +:10E8C200752E50F401F066F145F726F003FF752E20 +:10E8D200720060F401F066F1D6F04EF726F00DFFFB +:10E8E20073686F772D776F72646C6973740067F465 +:10E8F20001F046F07FF4D6F072FC26F001F08DFCB8 +:10E90200BBF7FDF75DF126F005FF776F72647300C8 +:10E9120070F401F046F05E0071F379F426F004FF22 +:10E922002B696E7485F495F478946ECB04FF2D698F +:10E932006E7490F49CF4F89467CB04FF696E7421B2 +:10E9420097F401F046F00000AFF14DF326F004FF1A +:10E95200696E74409EF401F046F00000AFF171F36D +:10E9620026F008FF696E742D74726170A8F4B9F410 +:10E97200B82E8991999148CB01F0ACF430F0C2F4F1 +:10E9820026F0C3F401D040CB189504FF7069636B85 +:10E99200B2F401F041F273F59FF2AFF18BF026F081 +:10E9A20002002E22C6F401F0DCF4D001BBF726F0FF +:10E9B20002007322D1F401F046F02200A2F966F5BA +:10E9C2008BF03FF0E5F4FC0126F004FF66696C6C05 +:10E9D200D9F401F0F3F0F3F0CBF03FF0F7F479FD66 +:10E9E200ADF2C3F0BEF29FF0DBF2F2F4EBF026F0F0 +:10E9F2000BFF656E7669726F6E6D656E7400E6F47C +:10EA020054F0560009FF776F72646C697374730077 +:10EA1200000001F046F0080026F004FF2F70616448 +:10EA220003F501F09FF29FF5A5F126F005FF2F688F +:10EA32006F6C64000EF501F09FF5DAF5A5F126F092 +:10EA42000AFF666F7274682D6E616D6517F501F0CD +:10EA520088F70700616D666F7274680026F007FF21 +:10EA620076657273696F6E0021F501F046F0410020 +:10EA720026F003FF6370750030F501F046F049009F +:10EA8200E7F726F008FF6D63752D696E666F3AF53C +:10EA920001F046F0450026F005FF2F757365720000 +:10EAA20043F501F046F02C0026F005FF665F637027 +:10EAB2007500F9F401F046F0002446F0F40026F067 +:10EAC20005FF73746174650056F554F03D0104FF4F +:10EAD2006261736561F567F00C0005FF63656C6C3C +:10EAE200730068F51EF205FF63656C6C2B006EF512 +:10EAF2007AF5029689CA04FF3264757074F501F0E2 +:10EB0200E1F0E1F026F005FF3264726F70007CF5EF +:10EB120001F0EBF0EBF026F004FF7475636B84F503 +:10EB220001F0D6F0E1F026F003FF3E696E008DF5AC +:10EB320067F0180003FF7061640095F501F0DAF5E3 +:10EB420046F02800AFF126F004FF656D69749BF56D +:10EB52002EFC0E00F7FB03FC05FF656D69743F0098 +:10EB6200A5F52EFC1000F7FB03FC03FF6B65790093 +:10EB7200ADF52EFC1200F7FB03FC04FF6B65793F39 +:10EB8200B6F52EFC1400F7FB03FC02FF6470BEF521 +:10EB920081F04800CFFBD9FB05FF6568657265000F +:10EBA200C6F581F04C00CFFBD9FB04FF68657265A6 +:10EBB200CDF581F04A00CFFBD9FB05FF616C6C6F8C +:10EBC2007400D6F501F0DAF5AFF1B4FBDBF526F00F +:10EBD20003FF62696E00DEF501F0A6FD6CF593F0AD +:10EBE20026F007FF646563696D616C00E9F501F069 +:10EBF20046F00A006CF593F026F003FF6865780092 +:10EC0200F2F501F046F010006CF593F026F002FFE9 +:10EC1200626CFEF554F0200007FF7475726E6B652E +:10EC2200790008F62EFC5400CFFBD9FB04FF2F6DB0 +:10EC32006F640DF61CF69C0109911991412F43272F +:10EC420017FF04C0109500950F5F1F4F37FF04C0D8 +:10EC5200309520952F5F3F4FEE24FF1851E1001FA2 +:10EC6200111F5A9539F447FF04C0109500950F5FA4 +:10EC72001F4F0BC0EE1CFF1CE21AF30A20F4E20E37 +:10EC8200F31E8894ECCF0894EACFFA92EA92C80174 +:10EC9200BBC905FF752F6D6F640017F601F011F106 +:10ECA20066F108F1D4F126F006FF6E6567617465BE +:10ECB2004AF601F00FF241F226F001FF2F0055F65D +:10ECC20001F01BF602F126F003FF6D6F64005EF6A1 +:10ECD20001F01BF6EBF026F003FF6162730065F6AC +:10ECE20001F0C3F050F226F003FF6D696E006DF67D +:10ECF20001F080F58AF13FF07FF6D6F0EBF026F0D6 +:10ED020003FF6D61780075F601F080F580F13FF048 +:10ED12008BF6D6F0EBF026F006FF77697468696E21 +:10ED220081F601F0E1F0A5F111F1A5F108F16EF122 +:10ED320026F007FF746F7570706572008DF601F032 +:10ED4200C3F046F0610046F07B0092F63FF0ACF66D +:10ED520046F0DF0025F226F007FF746F6C6F7765CF +:10ED620072009AF601F0C3F046F0410046F05B00F3 +:10ED720092F63FF0BFF646F020002EF226F003FF97 +:10ED8200686C6400ADF654F03F0104FF686F6C6478 +:10ED9200C0F601F0C4F6C3F08BF047F2C3F011F1F4 +:10EDA200D6F093F008F19FF026F002FF3C23C6F65E +:10EDB20001F09FF5C4F693F026F001FF2300D6F68A +:10EDC20001F06CF58BF05EF7F3F046F00900E1F02C +:10EDD20080F13FF0EFF646F00700AFF146F0300069 +:10EDE200AFF1CAF626F002FF2373DEF601F0E1F678 +:10EDF20080F52EF22CF13FF0F8F626F002FF233ECA +:10EE0200F4F601F089F5C4F68BF09FF5E1F0A5F177 +:10EE120026F004FF7369676EFFF601F033F13FF0ED +:10EE220015F746F02D00CAF626F003FF642E720095 +:10EE32000AF701F011F191F5EFFCD9F6F7F6F3F0CC +:10EE42000EF702F708F1E1F0A5F106F816F826F040 +:10EE520002FF2E7216F701F011F182FD08F11AF786 +:10EE620026F002FF642E29F701F066F11AF7FDF78A +:10EE720026F001FF2E0032F701F082FD35F726F071 +:10EE820003FF75642E003AF701F066F14EF7FDF7C5 +:10EE920026F004FF75642E7241F701F011F1D9F6E4 +:10EEA200F7F602F708F1E1F0A5F106F816F826F0F8 +:10EEB20006FF75642F6D6F644AF701F011F166F178 +:10EEC2001AF1D4F108F1D6F011F1D4F108F126F0DB +:10EED20006FF64696769743F59F701F0A0F6C3F051 +:10EEE20046F039008AF146F0000125F2AFF1C3F095 +:10EEF20046F040018AF146F0070125F2A5F146F0FD +:10EF02003000A5F1C3F06CF58BF06EF126F001F044 +:10EF12001AF1E7F708F1E1F041F216F2AFF141F22E +:10EF220011F126F002FF732C69F701F0C3F09AF792 +:10EF320026F001F0DB01C3F016F291F51DF2A5F106 +:10EF420011F166F19A023FF0ADF7ADF2C3F08BF02A +:10EF5200DB0179F5DBF2A7F708F13AF13FF0B4F7FC +:10EF6200C3F0AAF0DB01EBF026F005FF69747970BB +:10EF7200650093F701F0C3F016F291F51DF2A5F1C9 +:10EF820011F166F19A023FF0CFF7ADF2C3F0E3F36D +:10EF9200C3F0DCF7D8F741F2DBF2C7F708F13AF138 +:10EFA2003FF0D6F7C3F0E3F3DCF7EBF026F001F025 +:10EFB2000BF3DCF726F001F046F0FF0025F2A9F58D +:10EFC20026F006FF69636F756E74B6F701F0C3F041 +:10EFD20041F2D6F0E3F326F002FF6372E2F701F0AA +:10EFE20046F00D00A9F546F00A00A9F526F005FF46 +:10EFF200737061636500EDF701F00BF6A9F526F079 +:10F0020006FF737061636573F8F701F066F185F6C8 +:10F01200C3F03FF010F8FDF747F235F009F8EBF0D6 +:10F0220026F004FF7479706501F801F079FD9A0207 +:10F032003FF021F8ADF2BEF2AAF0A9F5DBF21CF81E +:10F0420026F001FF270012F801F0CFF9E7FAF2FAF1 +:10F05200C3F065FB9AFDD6F0E3F346F09AFB9AFD06 +:10F062002EF23FF037F846F0F3FF5CF8EBF026F0B3 +:10F0720007FF68616E646C65720022F867F00A002F +:10F0820005FF63617463680039F801F09FF211F1C2 +:10F092003FF88BF011F188F23FF893F030F008F16D +:10F0A2003FF893F008F1EBF066F126F005FF746883 +:10F0B200726F770041F801F0C3F02CF13FF063F872 +:10F0C200EBF026F03FF88BF092F208F13FF893F064 +:10F0D20008F1D6F011F1A8F2EBF008F126F005FFE5 +:10F0E20063736B69700057F801F011F1C3F03FF0E0 +:10F0F20084F8E1F0AAF01AF19AFD3FF084F8A1FD3C +:10F10200C0F935F077F808F1EBF026F005FF6373EC +:10F1120063616E0070F801F011F1E1F0C3F0AAF042 +:10F122001AF19AFD2CF13FF0A1F8D6F047F2D6F091 +:10F13200E1F033F12CF13FF0A1F841F235F08FF814 +:10F1420002F1E1F0A5F108F1EBF026F006FF6163B0 +:10F152006365707487F801F0E1F0AFF147F2E1F016 +:10F16200BAF5C3F0EDF82CF13FF0DFF8C3F046F04A +:10F1720008009AFD3FF0CFF8EBF0F3F080F58AF14A +:10F1820011F1F3F0F3F008F13FF0CDF8E5F847F2B2 +:10F1920011F1E1F008F16D0135F0DDF8C3F00BF685 +:10F1A20080F13FF0D6F8EBF00BF6C3F0A9F5E1F0F1 +:10F1B2009FF041F2E1F0790135F0B1F8EBF002F1A4 +:10F1C200D6F0A5F1F0F726F001F046F00800C3F002 +:10F1D200A9F5FDF7A9F526F001F0C3F046F00D0000 +:10F1E2009AFDD6F046F00A009AFD2EF226F006FFAE +:10F1F200726566696C6CA7F82EFC1A00F7FB03FCBB +:10F2020004FF63686172F8F801F0CFF9EBF0AAF03D +:10F2120026F006FF6E756D62657201F901F06CF5FC +:10F222008BF011F153F911F166F953F908F12EF24D +:10F2320011F1C3F02CF13FF026F989F508F1EBF05A +:10F2420008F16CF593F066F126F030F366F166F1A1 +:10F252003FF384F9CBF03FF048F9A1FD9AFD3FF06E +:10F262003FF9AAF046F02E009AFD3FF040F908F16E +:10F272003FF03CF9FCFCA6FD35F04EF9EBF089F5C8 +:10F2820008F1EBF008F16CF593F066F126F089F5E0 +:10F2920008F13FF04DF95AF6A1FD08F16CF593F033 +:10F2A2005DF126F001F0E1F0AAF046F02D009AFDA2 +:10F2B200C3F011F13FF05FF9A1FDC0F908F126F0AA +:10F2C20061F00A00100002000A0001F0E1F0AAF069 +:10F2D20046F02300A5F1C3F066F146F0040092F671 +:10F2E2003FF07CF961F9AFF1E3F36CF593F0A1FD26 +:10F2F200C0F935F07DF9EBF026F007FF3E6E756D33 +:10F30200626572000AF901F0C3F03FF09CF9E1F086 +:10F31200AAF06EF72CF13FF090F9EBF026F011F124 +:10F3220020FD6CF58BF05E0108F1560120FDA1FD78 +:10F33200C0F935F085F926F005FF7061727365003A +:10F342007EF901F011F1B6F999F58BF0C0F908F1E7 +:10F352008CF8C3F041F299F577F2A1FDC0F926F0DD +:10F3620006FF736F757263659DF92EFC1600F7FB3D +:10F3720003FC07FF2F737472696E6700B1F901F025 +:10F38200F3F0E1F0AFF1F3F0F3F0A5F126F00AFFAC +:10F3920070617273652D6E616D65BAF901F00BF6DD +:10F3A200D3F926F001F011F1B6F999F58BF0C0F915 +:10F3B2001AF175F808F18CF880F5AFF1B6F9EBF0B7 +:10F3C200A5F199F593F026F007FF66696E642D7832 +:10F3D2007400C8F901F046F0F7F946F05C001B042E +:10F3E2002CF13FF0F6F989F566F126F001F011F102 +:10F3F20080F508F140FCC3F03FF004FA11F102F18C +:10F4020002F108F15DF126F001F088F70300206FA8 +:10F412006B00BBF726F003FF2E6F6B00E5F92EFCA5 +:10F422001C00F7FB03FC01F088F702003E20F0F716 +:10F43200BBF726F006FF2E72656164790CFA2EFC8A +:10F442002000F7FB03FC01F088F70400203F3F2077 +:10F45200BBF76CF58BF011F1F8F53DF799F58BF0F0 +:10F462003DF708F16CF593F026F006FF2E657272F7 +:10F472006F721BFA2EFC1E00F7FB03FC04FF717572 +:10F48200697436FA01F0D002D70293F0A4FAA8F216 +:10F49200B1FA92F2650366F58BF02CF13FF052FA65 +:10F4A20020FAFDF83FF064FA46F0CAFA46F8CBF0CB +:10F4B2003FF064FAC3F046F0FEFF80F13FF062FADB +:10F4C2003BFA35F044FA10FA35F04CFA05FF706158 +:10F4D200757365003FFA2EFC4101E3FBEDFB04FF6F +:10F4E200636F6C6467FA75FAA4B622243324BB24D2 +:10F4F20024BEE0E0F1E02192E030E9F7F134D9F7FF +:10F50200E3E4F1E02F010FEF0DBF048310E41EBF0F +:10F512001583CFEAC683D0E4D783A7E9BAEF0C9468 +:10F5220005F004FF7761726D70FA01F06BFD46F031 +:10F532009AFB46F06CFA0EFC650313F643FA03FFDE +:10F542007370300092FA81F00600F7FB03FC02FFB1 +:10F552007370A0FA67F0080003FF72703000A8FA17 +:10F5620001F0B5FA8BF026F067F0040005FF646540 +:10F5720070746800ADFA01F0A4FA9FF2A5F116F2D8 +:10F5820047F226F009FF696E746572707265740045 +:10F59200B7FA01F0CFF9C3F03FF0DBFAE7FAF2FA7B +:10F5A20066F58BF03FF0D6FAC6FBE3F330F072FB60 +:10F5B20035F0CBFA89F526F010FF666F7274682D6C +:10F5C2007265636F676E697A6572C3FA81F0500083 +:10F5D200CFFBD9FB09FF7265636F676E697A6500BD +:10F5E200DDFA01F046F0FDFAD6F01B042CF13FF0F3 +:10F5F200FCFA89F565FB26F001F0F3F0F3F080F5F3 +:10F6020030F3F3F030F03FF3F3F0C3F065FB9AFD13 +:10F612003FF00EFBEBF066F126F002F102F15DF134 +:10F6220026F006FF64743A6E756DEBFA61F09AFB90 +:10F63200F101F10107FF64743A646E756D0012FB0B +:10F6420061F09AFB92FD92FD07FF7265633A6E7557 +:10F652006D001BFB01F00FF93FF037FBA1FD9AFD96 +:10F662003FF035FB17FB26F021FB26F065FB26F069 +:10F6720008FF7265633A66696E6425FB01F0EBF977 +:10F68200C3F02CF13FF048FBEBF065FB26F04FFB9B +:10F6920026F005FF64743A78740039FB61F053FB7D +:10F6A20057FB92FD01F0EBF030F026F001F033F160 +:10F6B2003FF05DFBDB0126F030F026F007FF6474BB +:10F6C2003A6E756C6C004AFB61F069FB69FB69FB81 +:10F6D20001F046F0F3FF5CF806FF3F737461636B61 +:10F6E2005FFB01F0BCFA33F13FF07AFB46F0FCFF1E +:10F6F2005CF826F003FF766572006DFB01F028F5D9 +:10F70200BBF7FDF76CF58BF036F5F8F582FDD9F60F +:10F71200E1F646F02E00CAF6F7F602F716F86CF597 +:10F7220093F0FDF73EF5BBF726F004FF6E6F6F70A6 +:10F732007BFB01F026F006FF756E7573656496FB20 +:10F7420001F09FF2DAF5A5F126F00200746F9CFB3E +:10F7520001F025F88BFD66F58BF03FF0BAFBD00186 +:10F76200B4FBDB0126F001F008F1C3F0C6FB11F196 +:10F77200E3F3C3F0C6FBC6FBE3F330F026F007FF6A +:10F78200692D63656C6C2B00A6FB01F041F226F03B +:10F7920007FF4564656665724000C0FB01F0E3F354 +:10F7A20071F326F007FF4564656665722100C9FBA7 +:10F7B20001F0E3F34DF326F007FF526465666572CC +:10F7C2004000D3FB01F0E3F38BF026F007FF526415 +:10F7D200656665722100DDFB01F0E3F393F026F02C +:10F7E20007FF5564656665724000E7FB01F0E3F3CD +:10F7F20014F3AFF18BF026F007FF5564656665726E +:10F802002100F1FB01F0E3F314F3AFF193F026F0E2 +:10F8120006FF646566657221FDFB01F08BFDC3F096 +:10F82200C6FBC6FBE3F330F026F006FF64656665AF +:10F83200724009FC01F08BFDC3F0C6FBE3F330F02C +:10F8420026F007FF286465666572290016FC01F040 +:10F85200AD010D03D0012EFC26F00E942603C3F059 +:10F86200C6FBE3F330F030F026F00FFF73656172F0 +:10F8720063682D776F72646C6973740022FC01F007 +:10F8820011F166F146F055FC08F172FCC3F02CF15F +:10F892003FF04FFC89F5EBF066F126F0C3F099FCDE +:10F8A200D6F09301810126F001F011F1EBF080F521 +:10F8B2001AF18DFCA3FC3FF063FC08F1EBF066F15A +:10F8C2005DF126F089F508F166F126F011FF7472F8 +:10F8D2006176657273652D776F72646C69737400FB +:10F8E20036FC01F071F3C3F03FF083FC80F530F396 +:10F8F200D6F030F03FF3F3F03FF083FC8A04E3F3F9 +:10F9020035F074FC89F526F00BFF6E616D653E7370 +:10F912007472696E670067FC01F0E7F746F0FF005A +:10F9220025F226F007FF6E66613E6366610085FC84 +:10F9320001F08A0441F226F008FF69636F6D70617D +:10F94200726593FC01F011F1E1F008F125F13FF04D +:10F95200AEFC89F5EBF05DF126F0D6F066F19A0285 +:10F962003FF0D1FCADF2E1F08BF0E1F0E3F3C3F054 +:10F9720046F000016EF13FF0C2FCD6F046F0FF0007 +:10F9820025F225F13FF0C9FC89F55DF1E6F226F09A +:10F9920041F2D6F079F5D6F046F00200CCF2B4FC92 +:10F9A20089F566F126F001FF2A009DFC01F0B8F10D +:10F9B200EBF026F001FF6A00D4FC01F088F246F079 +:10F9C2000700AFF18BF088F246F00900AFF18BF03F +:10F9D200AFF126F004FF64616273DBFC01F0C3F057 +:10F9E20033F13FF0F5FCFCFC26F007FF646E65671F +:10F9F20061746500EBFC01F056F4A1FD66F130F490 +:10FA020026F005FF636D6F766500F6FC08FDBF9377 +:10FA1200AF93E991F991A991B991092F082B21F09E +:10FA22001D9111930197E1F7AF91BF91899199913E +:10FA32000C9405F005FF32737761700002FD01F04E +:10FA4200F3F011F1F3F008F126F00AFF726566692E +:10FA52006C6C2D7469621BFD01F049FD46F05A0081 +:10FA6200ACF84FFD93F066F199F593F05DF126F055 +:10FA72000AFF736F757263652D74696226FD01F06A +:10FA820049FD4FFD8BF026F003FF7469620039FDDA +:10FA920054F06F0104FF2374696245FD54F0C901FB +:10FAA20006FF65653E72616D4BFD01F066F1ADF2D8 +:10FAB200E1F071F3E1F093F079F5D6F079F5D6F053 +:10FAC200DBF259FD89F526F008FF696E69742D7223 +:10FAD200616D51FD01F046F07C0014F346F0220006 +:10FAE20016F256FD26F006FF626F756E647365FDB1 +:10FAF20001F0E1F0AFF1D6F026F003FF733E6400AF +:10FB020074FD01F0C3F033F126F005FF3E626F642D +:10FB120079007EFD42F20800326C69746572616C94 +:10FB220086FD01F0D6F0F101F10126F001FF3D0062 +:10FB32008CFD01F0A5F12CF126F001FF310097FDBB +:10FB420054F0010001FF32009EFD54F0020002FF5A +:08FB52002D31A3FD54F0FFFF6B +:00000001FF diff --git a/amforth-6.5/appl/eval-pollin/p1284-16.lst b/amforth-6.5/appl/eval-pollin/p1284-16.lst new file mode 100644 index 0000000..00d54e8 --- /dev/null +++ b/amforth-6.5/appl/eval-pollin/p1284-16.lst @@ -0,0 +1,10495 @@ + +AVRASM ver. 2.1.52 p1284-16.asm Sun Apr 30 20:10:15 2017 + +p1284-16.asm(5): 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/atmega1284p\device.asm' +../../avr8/devices/atmega1284p\device.asm(5): Including file '../../avr8/Atmel/Appnotes2\m1284Pdef.inc' +p1284-16.asm(14): Including file '../../avr8\drivers/usart_0.asm' +../../avr8\drivers/usart_0.asm(32): 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' +p1284-16.asm(19): Including file '../../avr8\drivers/1wire.asm' +p1284-16.asm(21): Including file '../../avr8\amforth.asm' +../../avr8\amforth.asm(12): Including file '../../avr8\drivers/generic-isr.asm' +../../avr8\amforth.asm(14): 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.asm(15): Including file 'dict_appl.inc' +dict_appl.inc(3): Including file '../../common\words/dot-s.asm' +dict_appl.inc(4): Including file '../../avr8\words/spirw.asm' +dict_appl.inc(5): Including file '../../avr8\words/n-spi.asm' +dict_appl.inc(6): Including file 'words/applturnkey.asm' +dict_appl.inc(7): 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' +dict_appl.inc(8): Including file '../../avr8\words/2r_fetch.asm' +../../avr8\amforth.asm(23): Including file '../../avr8\amforth-interpreter.asm' +../../avr8\amforth.asm(24): 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(97): Including file '../../avr8\words/store-i_nrww.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/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.asm(25): Including file 'dict_appl_core.inc' +../../avr8\amforth.asm(36): Including file '../../avr8\amforth-eeprom.inc' + + + ; file see ../template/template.asm. You may want to + ; copy that file to this one and edit it afterwards. + + .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 = 256 + .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_PORTA = 0 + .set WANT_PORTB = 0 + .set WANT_PORTC = 0 + .set WANT_PORTD = 0 + .set WANT_TIMER_COUNTER_0 = 0 + .set WANT_TIMER_COUNTER_1 = 0 + .set WANT_TIMER_COUNTER_2 = 0 + .set WANT_TIMER_COUNTER_3 = 0 + .set WANT_BOOT_LOAD = 0 + .set WANT_EXTERNAL_INTERRUPT = 0 + .set WANT_AD_CONVERTER = 0 + .set WANT_JTAG = 0 + .set WANT_EEPROM = 0 + .set WANT_TWI = 0 + .set WANT_USART1 = 0 + .set WANT_SPI = 0 + .set WANT_WATCHDOG = 0 + .set WANT_CPU = 0 + .equ intvecsize = 2 ; please verify; flash size: 131072 bytes + .equ pclen = 2 ; 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 ; Pin Change Interrupt Request 0 + .org 10 +00000a d131 rcall isr ; Pin Change Interrupt Request 1 + .org 12 +00000c d12f rcall isr ; Pin Change Interrupt Request 2 + .org 14 +00000e d12d rcall isr ; Pin Change Interrupt Request 3 + .org 16 +000010 d12b rcall isr ; Watchdog Time-out Interrupt + .org 18 +000012 d129 rcall isr ; Timer/Counter2 Compare Match A + .org 20 +000014 d127 rcall isr ; Timer/Counter2 Compare Match B + .org 22 +000016 d125 rcall isr ; Timer/Counter2 Overflow + .org 24 +000018 d123 rcall isr ; Timer/Counter1 Capture Event + .org 26 +00001a d121 rcall isr ; Timer/Counter1 Compare Match A + .org 28 +00001c d11f rcall isr ; Timer/Counter1 Compare Match B + .org 30 +00001e d11d rcall isr ; Timer/Counter1 Overflow + .org 32 +000020 d11b rcall isr ; Timer/Counter0 Compare Match A + .org 34 +000022 d119 rcall isr ; Timer/Counter0 Compare Match B + .org 36 +000024 d117 rcall isr ; Timer/Counter0 Overflow + .org 38 +000026 d115 rcall isr ; SPI Serial Transfer Complete + .org 40 +000028 d113 rcall isr ; USART0, Rx Complete + .org 42 +00002a d111 rcall isr ; USART0 Data register Empty + .org 44 +00002c d10f rcall isr ; USART0, Tx Complete + .org 46 +00002e d10d rcall isr ; Analog Comparator + .org 48 +000030 d10b rcall isr ; ADC Conversion Complete + .org 50 +000032 d109 rcall isr ; EEPROM Ready + .org 52 +000034 d107 rcall isr ; 2-wire Serial Interface + .org 54 +000036 d105 rcall isr ; Store Program Memory Read + .org 56 +000038 d103 rcall isr ; USART1 RX complete + .org 58 +00003a d101 rcall isr ; USART1 Data Register Empty + .org 60 +00003c d0ff rcall isr ; USART1 TX complete + .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 Overflow + .equ INTVECTORS = 35 + .nooverlap + + ; compatability layer (maybe empty) + + ; controller data area, environment query mcu-info + mcu_info: + mcu_ramsize: +000045 4000 .dw 16384 + mcu_eepromsize: +000046 1000 .dw 4096 + mcu_maxdp: +000047 ffff .dw 65535 + mcu_numints: +000048 0023 .dw 35 + mcu_name: +000049 000b .dw 11 +00004a 5441 +00004b 656d +00004c 6167 +00004d 3231 +00004e 3438 +00004f 0050 .db "ATmega1284P",0 + .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 + + .set AMFORTH_RO_SEG = NRWW_START_ADDR+1 + + ; cpu clock in hertz + .equ F_CPU = 16000000 + .set BAUD_MAXERROR = 30 + .equ TIMER_INT = OVF2addr + + .include "drivers/usart_0.asm" + + .equ BAUDRATE_HIGH = UBRR0H + .equ USART_C = UCSR0C + .equ USART_B = UCSR0B + .equ USART_A = UCSR0A + .equ USART_DATA = UDR0 + .ifndef URXCaddr + .equ URXCaddr = URXC0addr + .equ UDREaddr = UDRE0addr + .endif + + .equ bm_USART_RXRD = 1 << RXC0 + .equ bm_USART_TXRD = 1 << UDRE0 + .equ bm_ENABLE_TX = 1 << TXEN0 + .equ bm_ENABLE_RX = 1 << RXEN0 + .equ bm_ENABLE_INT_RX = 1<rx-buf",0 +000055 0000 .dw VE_HEAD + .set VE_HEAD = VE_TO_RXBUF + XT_TO_RXBUF: +000056 0057 .dw PFA_rx_tobuf + PFA_rx_tobuf: +000057 2f08 mov temp0, tosl +000058 9110 0110 lds temp1, usart_rx_in +00005a e0e0 ldi zl, low(usart_rx_data) +00005b e0f1 ldi zh, high(usart_rx_data) +00005c 0fe1 add zl, temp1 +00005d 1df3 adc zh, zeroh +00005e 8300 st Z, temp0 +00005f 9513 inc temp1 +000060 701f andi temp1,usart_rx_mask +000061 9310 0110 sts usart_rx_in, temp1 +000063 9189 +000064 9199 loadtos +000065 940c f005 jmp_ DO_NEXT + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ; setup with + ; ' isr-rx URXCaddr int! + VE_ISR_RX: +000067 ff06 .dw $ff06 +000068 7369 +000069 2d72 +00006a 7872 .db "isr-rx" +00006b 0050 .dw VE_HEAD + .set VE_HEAD = VE_ISR_RX + XT_ISR_RX: +00006c f001 .dw DO_COLON + usart_rx_isr: +00006d f046 .dw XT_DOLITERAL +00006e 00c6 .dw usart_data +00006f f0aa .dw XT_CFETCH +000070 f0c3 .dw XT_DUP +000071 f046 .dw XT_DOLITERAL +000072 0003 .dw 3 +000073 fd9a .dw XT_EQUAL +000074 f03f .dw XT_DOCONDBRANCH +000075 0077 .dw usart_rx_isr1 +000076 fa74 .dw XT_COLD + usart_rx_isr1: +000077 0056 .dw XT_TO_RXBUF +000078 f026 .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: +000079 f001 .dw DO_COLON + PFA_USART_INIT_RX_BUFFER: ; ( -- ) +00007a f046 +00007b 006c .dw XT_DOLITERAL, XT_ISR_RX +00007c f046 +00007d 0028 .dw XT_DOLITERAL, URXCaddr +00007e f4a2 .dw XT_INTSTORE + +00007f f046 .dw XT_DOLITERAL +000080 0100 .dw usart_rx_data +000081 f046 .dw XT_DOLITERAL +000082 0016 .dw usart_rx_size + 6 +000083 f166 .dw XT_ZERO +000084 f4ea .dw XT_FILL +000085 f026 .dw XT_EXIT + + ; ( -- c) + ; MCU + ; get 1 character from input queue, wait if needed using interrupt driver + VE_RX_BUFFER: +000086 ff06 .dw $ff06 +000087 7872 +000088 622d +000089 6675 .db "rx-buf" +00008a 0067 .dw VE_HEAD + .set VE_HEAD = VE_RX_BUFFER + XT_RX_BUFFER: +00008b f001 .dw DO_COLON + PFA_RX_BUFFER: +00008c 00a6 .dw XT_RXQ_BUFFER +00008d f03f .dw XT_DOCONDBRANCH +00008e 008c .dw PFA_RX_BUFFER +00008f f046 .dw XT_DOLITERAL +000090 0111 .dw usart_rx_out +000091 f0aa .dw XT_CFETCH +000092 f0c3 .dw XT_DUP +000093 f046 .dw XT_DOLITERAL +000094 0100 .dw usart_rx_data +000095 f1af .dw XT_PLUS +000096 f0aa .dw XT_CFETCH +000097 f0d6 .dw XT_SWAP +000098 f241 .dw XT_1PLUS +000099 f046 .dw XT_DOLITERAL +00009a 000f .dw usart_rx_mask +00009b f225 .dw XT_AND +00009c f046 .dw XT_DOLITERAL +00009d 0111 .dw usart_rx_out +00009e f09f .dw XT_CSTORE +00009f f026 .dw XT_EXIT + + ; ( -- f) + ; MCU + ; check if unread characters are in the input queue + VE_RXQ_BUFFER: +0000a0 ff07 .dw $ff07 +0000a1 7872 +0000a2 2d3f +0000a3 7562 +0000a4 0066 .db "rx?-buf",0 +0000a5 0086 .dw VE_HEAD + .set VE_HEAD = VE_RXQ_BUFFER + XT_RXQ_BUFFER: +0000a6 f001 .dw DO_COLON + PFA_RXQ_BUFFER: +0000a7 fa6c .dw XT_PAUSE +0000a8 f046 .dw XT_DOLITERAL +0000a9 0111 .dw usart_rx_out +0000aa f0aa .dw XT_CFETCH +0000ab f046 .dw XT_DOLITERAL +0000ac 0110 .dw usart_rx_in +0000ad f0aa .dw XT_CFETCH +0000ae f125 .dw XT_NOTEQUAL +0000af f026 .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: +0000b0 ff07 .dw $ff07 +0000b1 7874 +0000b2 702d +0000b3 6c6f +0000b4 006c .db "tx-poll",0 +0000b5 00a0 .dw VE_HEAD + .set VE_HEAD = VE_TX_POLL + XT_TX_POLL: +0000b6 f001 .dw DO_COLON + PFA_TX_POLL: + ; wait for data ready +0000b7 00c4 .dw XT_TXQ_POLL +0000b8 f03f .dw XT_DOCONDBRANCH +0000b9 00b7 .dw PFA_TX_POLL + ; send to usart +0000ba f046 .dw XT_DOLITERAL +0000bb 00c6 .dw USART_DATA +0000bc f09f .dw XT_CSTORE +0000bd f026 .dw XT_EXIT + + ; ( -- f) MCU + ; MCU + ; check if a character can be send using register poll + VE_TXQ_POLL: +0000be ff08 .dw $ff08 +0000bf 7874 +0000c0 2d3f +0000c1 6f70 +0000c2 6c6c .db "tx?-poll" +0000c3 00b0 .dw VE_HEAD + .set VE_HEAD = VE_TXQ_POLL + XT_TXQ_POLL: +0000c4 f001 .dw DO_COLON + PFA_TXQ_POLL: +0000c5 fa6c .dw XT_PAUSE +0000c6 f046 .dw XT_DOLITERAL +0000c7 00c0 .dw USART_A +0000c8 f0aa .dw XT_CFETCH +0000c9 f046 .dw XT_DOLITERAL +0000ca 0020 .dw bm_USART_TXRD +0000cb f225 .dw XT_AND +0000cc f026 .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: +0000cd ff04 .dw $ff04 +0000ce 6275 +0000cf 7272 .db "ubrr" +0000d0 00be .dw VE_HEAD + .set VE_HEAD = VE_UBRR + XT_UBRR: +0000d1 f081 .dw PFA_DOVALUE1 + PFA_UBRR: ; ( -- ) +0000d2 009e .dw EE_UBRRVAL +0000d3 fbcf .dw XT_EDEFERFETCH +0000d4 fbd9 .dw XT_EDEFERSTORE + .include "words/usart.asm" + + ; MCU + ; initialize usart + VE_USART: +0000d5 ff06 .dw $ff06 +0000d6 752b +0000d7 6173 +0000d8 7472 .db "+usart" +0000d9 00cd .dw VE_HEAD + .set VE_HEAD = VE_USART + XT_USART: +0000da f001 .dw DO_COLON + PFA_USART: ; ( -- ) + +0000db f046 .dw XT_DOLITERAL +0000dc 0098 .dw USART_B_VALUE +0000dd f046 .dw XT_DOLITERAL +0000de 00c1 .dw USART_B +0000df f09f .dw XT_CSTORE + +0000e0 f046 .dw XT_DOLITERAL +0000e1 0006 .dw USART_C_VALUE +0000e2 f046 .dw XT_DOLITERAL +0000e3 00c2 .dw USART_C | bm_USARTC_en +0000e4 f09f .dw XT_CSTORE + +0000e5 00d1 .dw XT_UBRR +0000e6 f0c3 .dw XT_DUP +0000e7 f30b .dw XT_BYTESWAP +0000e8 f046 .dw XT_DOLITERAL +0000e9 00c5 .dw BAUDRATE_HIGH +0000ea f09f .dw XT_CSTORE +0000eb f046 .dw XT_DOLITERAL +0000ec 00c4 .dw BAUDRATE_LOW +0000ed f09f .dw XT_CSTORE + .if XT_USART_INIT_RX!=0 +0000ee 0079 .dw XT_USART_INIT_RX + .endif + .if XT_USART_INIT_TX!=0 + .endif + +0000ef f026 .dw XT_EXIT + + ; settings for 1wire interface + .equ OW_PORT=PORTB + .EQU OW_BIT=4 + .include "drivers/1wire.asm" + + ; B. J. Rodriguez (MSP 430) + ; Matthias Trute (AVR Atmega) + ; COPYRIGHT + ; (c) 2012 Bradford J. Rodriguez for the 430 code and API + + ; adapted 430 assembly code to AVR + ; wishlist: + ; use a configurable pin at runtime, compatible with bitnames.frt + ; no external pull up, no external power supply for devices + ; ??? + ; + ;.EQU OW_BIT=4 + ;.equ OW_PORT=PORTE + .set OW_DDR=(OW_PORT-1) + .set OW_PIN=(OW_DDR-1) + + ;****f* 1W.RESET + ; NAME + ; 1W.RESET + ; SYNOPSIS + ; 1W.RESET ( -- f ) Initialize 1-wire devices; return true if present + ; DESCRIPTION + ; This configures the port pin used by the 1-wire interface, and then + ; sends an "initialize" sequence to the 1-wire devices. If any device + ; is present, it will be detected. + ; + ; Timing, per DS18B20 data sheet: + ; a) Output "0" (drive output low) for >480 usec. + ; b) Output "1" (let output float). + ; c) After 15 to 60 usec, device will drive pin low for 60 to 240 usec. + ; So, wait 75 usec and sample input. + ; d) Leave output high (floating) for at least 480 usec. + ;****** + ; ( -- f ) + ; Hardware + ; Initialize 1-wire devices; return true if present + VE_OW_RESET: +0000f0 ff08 .dw $ff08 +0000f1 7731 +0000f2 722e +0000f3 7365 +0000f4 7465 .db "1w.reset" +0000f5 00d5 .dw VE_HEAD + .set VE_HEAD = VE_OW_RESET + XT_OW_RESET: +0000f6 00f7 .dw PFA_OW_RESET + PFA_OW_RESET: +0000f7 939a +0000f8 938a savetos + ; setup to output +0000f9 9a24 sbi OW_DDR, OW_BIT + ; Pull output low +0000fa 982c cbi OW_PORT, OW_BIT + ; Delay >480 usec +0000fb e8e0 +0000fc e0f7 +0000fd 9731 +0000fe f7f1 DELAY 480 + ; Critical timing period, disable interrupts. +0000ff b71f in temp1, SREG +000100 94f8 cli + ; Pull output high +000101 9a2c sbi OW_PORT, OW_BIT + ; make pin input, sends "1" +000102 9824 cbi OW_DDR, OW_BIT +000103 e0e0 +000104 e0f1 +000105 9731 +000106 f7f1 DELAY 64 ; delayB + ; Sample input pin, set TOS if input is zero +000107 b183 in tosl, OW_PIN +000108 ff84 sbrs tosl, OW_BIT +000109 ef9f ser tosh + ; End critical timing period, enable interrupts +00010a bf1f out SREG, temp1 + ; release bus +00010b 9824 cbi OW_DDR, OW_BIT +00010c 982c cbi OW_PORT, OW_BIT + + ; Delay rest of 480 usec +00010d e8e0 +00010e e0f6 +00010f 9731 +000110 f7f1 DELAY 416 + ; we now have the result flag in TOS +000111 2f89 mov tosl, tosh +000112 940c f005 jmp_ DO_NEXT + + ;****f* 1W.SLOT + ; NAME + ; 1W.SLOT + ; SYNOPSIS + ; 1W.SLOT ( c -- c' ) Write and read one bit to/from 1-wire. + ; DESCRIPTION + ; The "touch byte" function is described in Dallas App Note 74. + ; It outputs a byte to the 1-wire pin, LSB first, and reads back + ; the state of the 1-wire pin after a suitable delay. + ; To read a byte, output $FF and read the reply data. + ; To write a byte, output that byte and discard the reply. + ; + ; This function performs one bit of the "touch" operation -- + ; one read/write "slot" in Dallas jargon. Perform this eight + ; times in a row to get the "touch byte" function. + ; + ; PARAMETERS + ; The input parameter is xxxxxxxxbbbbbbbo where + ; 'xxxxxxxx' are don't cares, + ; 'bbbbbbb' are bits to be shifted down, and + ; 'o' is the bit to be output in the slot. This must be 1 + ; to create a read slot. + ; + ; The returned value is xxxxxxxxibbbbbbb where + ; 'xxxxxxxx' are not known (the input shifted down 1 position), + ; 'i' is the bit read during the slot. This has no meaning + ; if it was a write slot. + ; 'bbbbbbb' are the 7 input bits, shifted down one position. + ; + ; This peculiar parameter usage allows OWTOUCH to be written as + ; OWSLOT OWSLOT OWSLOT OWSLOT OWSLOT OWSLOT OWSLOT OWSLOT + ; + ; NOTES + ; Interrupts are disabled during each bit. + + ; Timing, per DS18B20 data sheet: + ; a) Output "0" for start period. (> 1 us, < 15 us, typ. 6 us*) + ; b) Output data bit (0 or 1), open drain + ; c) After MS from start of cycle, sample input (15 to 60 us, typ. 25 us*) + ; d) After write-0 period from start of cycle, output "1" (>60 us) + ; e) After recovery period, loop or return. (> 1 us) + ; For writes, DS18B20 samples input 15 to 60 usec from start of cycle. + ; * "Typical" values are per App Note 132 for a 300m cable length. + + ; --------- ------------------------------- + ; \ / / + ; ------------------------------- + ; a b c d e + ; | 6us | 19us | 35us | 2us | + ;****** + ; ( c -- c' ) + ; Hardware + ; Write and read one bit to/from 1-wire. + VE_OW_SLOT: +000114 ff07 .dw $ff07 +000115 7731 +000116 732e +000117 6f6c +000118 0074 .db "1w.slot",0 +000119 00f0 .dw VE_HEAD + .set VE_HEAD = VE_OW_SLOT + XT_OW_SLOT: +00011a 011b .dw PFA_OW_SLOT + PFA_OW_SLOT: + ; pull low +00011b 982c cbi OW_PORT, OW_BIT +00011c 9a24 sbi OW_DDR, OW_BIT + ; disable interrupts +00011d b71f in temp1, SREG +00011e 94f8 cli +00011f e1e8 +000120 e0f0 +000121 9731 +000122 f7f1 DELAY 6 ; DELAY A + ; check bit +000123 9488 clc +000124 9587 ror tosl +000125 f410 brcc PFA_OW_SLOT0 ; a 0 keeps the bus low + ; release bus, a 1 is written +000126 9a2c sbi OW_PORT, OW_BIT +000127 9824 cbi OW_DDR, OW_BIT + PFA_OW_SLOT0: + ; sample the input (no action required if zero) +000128 e2e4 +000129 e0f0 +00012a 9731 +00012b f7f1 DELAY 9 ; wait DELAY E to sample +00012c b103 in temp0, OW_PIN +00012d fd04 sbrc temp0, OW_BIT +00012e 6880 ori tosl, $80 + +00012f ecec +000130 e0f0 +000131 9731 +000132 f7f1 DELAY 51 ; DELAY B +000133 9a2c sbi OW_PORT, OW_BIT ; release bus +000134 9824 cbi OW_DDR, OW_BIT +000135 e0e8 +000136 e0f0 +000137 9731 +000138 f7f1 delay 2 + ; re-enable interrupts +000139 bf1f out SREG, temp1 +00013a 940c f005 jmp_ DO_NEXT + + .include "amforth.asm" + + ;;;; + ;;;; GPL V2 (only) + + .set AMFORTH_NRWW_SIZE=(FLASHEND-AMFORTH_RO_SEG)*2 + + .set corepc = pc + .org $0000 +000000 940c fa75 jmp_ PFA_COLD + + .org corepc + .include "drivers/generic-isr.asm" + + .eseg +000000 intvec: .byte INTVECTORS * CELLSIZE + .dseg +000112 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) + .endif +00013f 900f pop r0 +000140 900f pop r0 ; = intnum * intvectorsize + 1 (address following the rcall) +000141 940a dec r0 + .if intvecsize == 1 ; + .endif +000142 2cb0 mov isrflag, r0 +000143 93ff push zh +000144 93ef push zl +000145 e1e2 ldi zl, low(intcnt) +000146 e0f1 ldi zh, high(intcnt) +000147 9406 lsr r0 ; we use byte addresses in the counter array, not words +000148 0de0 add zl, r0 +000149 1df3 adc zh, zeroh +00014a 8000 ld r0, Z +00014b 9403 inc r0 +00014c 8200 st Z, r0 +00014d 91ef pop zl +00014e 91ff pop zh + +00014f 9009 ld r0, Y+ +000150 be0f out SREG, r0 +000151 9009 ld r0, Y+ +000152 9508 ret ; returns the interrupt, the rcall stack frame is removed! + ; no reti here, see words/isr-end.asm + ; lower part of the dictionary + .include "dict/rww.inc" + + + ; Arithmetics + ; add a number to a double cell + VE_MPLUS: +000153 ff02 .dw $ff02 +000154 2b6d .db "m+" +000155 0114 .dw VE_HEAD + .set VE_HEAD = VE_MPLUS + XT_MPLUS: +000156 f001 .dw DO_COLON + PFA_MPLUS: +000157 fd82 .dw XT_S2D +000158 f430 .dw XT_DPLUS +000159 f026 .dw XT_EXIT + .include "words/ud-star.asm" + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_UDSTAR: +00015a ff03 .dw $ff03 +00015b 6475 +../../common\words/ud-star.asm(9): warning: .cseg .db misalignment - padding zero byte +00015c 002a .db "ud*" +00015d 0153 .dw VE_HEAD + .set VE_HEAD = VE_UDSTAR + XT_UDSTAR: +00015e f001 .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 + ; + +00015f f0c3 +000160 f111 +000161 f1f2 +000162 f0eb .DW XT_DUP,XT_TO_R,XT_UMSTAR,XT_DROP +000163 f0d6 +000164 f108 +000165 f1f2 +000166 f0f3 +000167 f1af +000168 f026 .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: +000169 ff04 .dw $ff04 +00016a 6d75 +00016b 7861 .db "umax" +00016c 015a .dw VE_HEAD + .set VE_HEAD = VE_UMAX + XT_UMAX: +00016d f001 .dw DO_COLON + PFA_UMAX: + .endif + +00016e f580 +00016f f16e .DW XT_2DUP,XT_ULESS +000170 f03f .dw XT_DOCONDBRANCH +000171 0173 DEST(UMAX1) +000172 f0d6 .DW XT_SWAP +000173 f0eb UMAX1: .DW XT_DROP +000174 f026 .dw XT_EXIT + .include "words/umin.asm" + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_UMIN: +000175 ff04 .dw $ff04 +000176 6d75 +000177 6e69 .db "umin" +000178 0169 .dw VE_HEAD + .set VE_HEAD = VE_UMIN + XT_UMIN: +000179 f001 .dw DO_COLON + PFA_UMIN: + .endif +00017a f580 +00017b f179 .DW XT_2DUP,XT_UGREATER +00017c f03f .dw XT_DOCONDBRANCH +00017d 017f DEST(UMIN1) +00017e f0d6 .DW XT_SWAP +00017f f0eb UMIN1: .DW XT_DROP +000180 f026 .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: +000181 f001 .dw DO_COLON + PFA_IMMEDIATEQ: +000182 f046 .dw XT_DOLITERAL +000183 8000 .dw $8000 +000184 f225 .dw XT_AND +000185 f12c .dw XT_ZEROEQUAL +000186 f03f .dw XT_DOCONDBRANCH +000187 018a DEST(IMMEDIATEQ1) +000188 fda1 .dw XT_ONE +000189 f026 .dw XT_EXIT + IMMEDIATEQ1: + ; not immediate +00018a f15d .dw XT_TRUE +00018b f026 .dw XT_EXIT + .include "words/name2flags.asm" + + ; Tools + ; get the flags from a name token + VE_NAME2FLAGS: +00018c ff0a .dw $ff0a +00018d 616e +00018e 656d +00018f 663e +000190 616c +000191 7367 .db "name>flags" +000192 0175 .dw VE_HEAD + .set VE_HEAD = VE_NAME2FLAGS + XT_NAME2FLAGS: +000193 f001 .dw DO_COLON + PFA_NAME2FLAGS: +000194 f3e3 .dw XT_FETCHI ; skip to link field +000195 f046 .dw XT_DOLITERAL +000196 ff00 .dw $ff00 +000197 f225 .dw XT_AND +000198 f026 .dw XT_EXIT + + .if AMFORTH_NRWW_SIZE > 8000 + .include "dict/appl_8k.inc" + + + .include "words/newest.asm" + + ; System Variable + ; system state + VE_NEWEST: +000199 ff06 .dw $ff06 +00019a 656e +00019b 6577 +00019c 7473 .db "newest" +00019d 018c .dw VE_HEAD + .set VE_HEAD = VE_NEWEST + XT_NEWEST: +00019e f054 .dw PFA_DOVARIABLE + PFA_NEWEST: +00019f 0135 .dw ram_newest + + .dseg +000135 ram_newest: .byte 4 + .include "words/latest.asm" + + ; System Variable + ; system state + VE_LATEST: +0001a0 ff06 .dw $ff06 +0001a1 616c +0001a2 6574 +0001a3 7473 .db "latest" +0001a4 0199 .dw VE_HEAD + .set VE_HEAD = VE_LATEST + XT_LATEST: +0001a5 f054 .dw PFA_DOVARIABLE + PFA_LATEST: +0001a6 0139 .dw ram_latest + + .dseg +000139 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: +0001a7 ff08 .dw $ff08 +0001a8 6328 +0001a9 6572 +0001aa 7461 +0001ab 2965 .db "(create)" +0001ac 01a0 .dw VE_HEAD + .set VE_HEAD = VE_DOCREATE + XT_DOCREATE: +0001ad f001 .dw DO_COLON + PFA_DOCREATE: + .endif +0001ae f9cf +0001af 0304 .DW XT_PARSENAME,XT_WLSCOPE ; ( -- addr len wid) +0001b0 f0c3 +0001b1 019e +0001b2 f579 +0001b3 f093 .DW XT_DUP,XT_NEWEST,XT_CELLPLUS,XT_STORE ; save the wid +0001b4 02e9 +0001b5 019e +0001b6 f093 .DW XT_HEADER,XT_NEWEST,XT_STORE ; save the nt +0001b7 f026 .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: +0001b8 0001 .dw $0001 +0001b9 005c .db $5c,0 +0001ba 01a7 .dw VE_HEAD + .set VE_HEAD = VE_BACKSLASH + XT_BACKSLASH: +0001bb f001 .dw DO_COLON + PFA_BACKSLASH: + .endif +0001bc f9b6 .dw XT_SOURCE +0001bd f102 .dw XT_NIP +0001be f599 .dw XT_TO_IN +0001bf f093 .dw XT_STORE +0001c0 f026 .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: +0001c1 0001 .dw $0001 +0001c2 0028 .db "(" ,0 +0001c3 01b8 .dw VE_HEAD + .set VE_HEAD = VE_LPAREN + XT_LPAREN: +0001c4 f001 .dw DO_COLON + PFA_LPAREN: + .endif +0001c5 f046 .dw XT_DOLITERAL +0001c6 0029 .dw ')' +0001c7 f9a2 .dw XT_PARSE +0001c8 f589 .dw XT_2DROP +0001c9 f026 .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: +0001ca ff07 .dw $ff07 +0001cb 6f63 +0001cc 706d +0001cd 6c69 +0001ce 0065 .db "compile",0 +0001cf 01c1 .dw VE_HEAD + .set VE_HEAD = VE_COMPILE + XT_COMPILE: +0001d0 f001 .dw DO_COLON + PFA_COMPILE: + .endif +0001d1 f108 .dw XT_R_FROM +0001d2 f0c3 .dw XT_DUP +0001d3 fbc6 .dw XT_ICELLPLUS +0001d4 f111 .dw XT_TO_R +0001d5 f3e3 .dw XT_FETCHI +0001d6 01db .dw XT_COMMA +0001d7 f026 .dw XT_EXIT + .include "words/comma.asm" + + ; Dictionary + ; compile 16 bit into flash at DP + VE_COMMA: +0001d8 ff01 .dw $ff01 +0001d9 002c .db ',',0 ; , +0001da 01ca .dw VE_HEAD + .set VE_HEAD = VE_COMMA + XT_COMMA: +0001db f001 .dw DO_COLON + PFA_COMMA: +0001dc f5c9 .dw XT_DP +0001dd f385 .dw XT_STOREI +0001de f5c9 .dw XT_DP +0001df f241 .dw XT_1PLUS +0001e0 fbb4 .dw XT_DOTO +0001e1 f5ca .dw PFA_DP +0001e2 f026 .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: +0001e3 0003 .dw $0003 +0001e4 275b +0001e5 005d .db "[']",0 +0001e6 01d8 .dw VE_HEAD + .set VE_HEAD = VE_BRACKETTICK + XT_BRACKETTICK: +0001e7 f001 .dw DO_COLON + PFA_BRACKETTICK: + .endif +0001e8 f825 .dw XT_TICK +0001e9 01f1 .dw XT_LITERAL +0001ea f026 .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: +0001eb 0007 .dw $0007 +0001ec 696c +0001ed 6574 +0001ee 6172 +0001ef 006c .db "literal",0 +0001f0 01e3 .dw VE_HEAD + .set VE_HEAD = VE_LITERAL + XT_LITERAL: +0001f1 f001 .dw DO_COLON + PFA_LITERAL: + .endif +0001f2 01d0 .DW XT_COMPILE +0001f3 f046 .DW XT_DOLITERAL +0001f4 01db .DW XT_COMMA +0001f5 f026 .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: +0001f6 0008 .dw $0008 +0001f7 6c73 +0001f8 7469 +0001f9 7265 +0001fa 6c61 .db "sliteral" +0001fb 01eb .dw VE_HEAD + .set VE_HEAD = VE_SLITERAL + XT_SLITERAL: +0001fc f001 .dw DO_COLON + PFA_SLITERAL: + .endif +0001fd 01d0 .dw XT_COMPILE +0001fe f788 .dw XT_DOSLITERAL ; ( -- addr n) +0001ff f796 .dw XT_SCOMMA +000200 f026 .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: +000201 f001 .dw DO_COLON + PFA_GMARK: +000202 f5c9 .dw XT_DP +000203 01d0 .dw XT_COMPILE +000204 ffff .dw -1 ; ffff does not erase flash +000205 f026 .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: +000206 f001 .dw DO_COLON + PFA_GRESOLVE: +000207 fb72 .dw XT_QSTACK +000208 f5c9 .dw XT_DP +000209 f0d6 .dw XT_SWAP +00020a f385 .dw XT_STOREI +00020b f026 .dw XT_EXIT + .include "words/l_mark.asm" + + ; Compiler + ; place destination for backward branch + ;VE_LMARK: + ; .dw $ff05 + ; .db "r if 2drop then r> invert ; + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + XT_QDOCHECK: +00029a f001 .dw DO_COLON + PFA_QDOCHECK: + .endif +00029b f580 .dw XT_2DUP +00029c fd9a .dw XT_EQUAL +00029d f0c3 .dw XT_DUP +00029e f111 .dw XT_TO_R +00029f f03f .dw XT_DOCONDBRANCH +0002a0 02a2 DEST(PFA_QDOCHECK1) +0002a1 f589 .dw XT_2DROP + PFA_QDOCHECK1: +0002a2 f108 .dw XT_R_FROM +0002a3 f20f .dw XT_INVERT +0002a4 f026 .dw XT_EXIT + .include "words/endloop.asm" + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_ENDLOOP: +0002a5 ff07 .dw $ff07 +0002a6 6e65 +0002a7 6c64 +0002a8 6f6f +0002a9 0070 .db "endloop",0 +0002aa 028e .dw VE_HEAD + .set VE_HEAD = VE_ENDLOOP + XT_ENDLOOP: +0002ab f001 .dw DO_COLON + PFA_ENDLOOP: + .endif + ;Z ENDLOOP adrs xt -- L: 0 a1 a2 .. aN -- + ; ?DUP WHILE POSTPONE THEN REPEAT ; + ; resolve LEAVEs + ; This is a common factor of LOOP and +LOOP. + +0002ac 020f .DW XT_LRESOLVE +0002ad 02b8 +0002ae f0cb +0002af f03f LOOP1: .DW XT_L_FROM,XT_QDUP,XT_DOCONDBRANCH +0002b0 02b4 DEST(LOOP2) +0002b1 0234 .DW XT_THEN +0002b2 f035 .dw XT_DOBRANCH +0002b3 02ad DEST(LOOP1) +0002b4 f026 LOOP2: .DW XT_EXIT + ; leave address stack + .include "words/l-from.asm" + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_L_FROM: +0002b5 ff02 .dw $ff02 +0002b6 3e6c .db "l>" +0002b7 02a5 .dw VE_HEAD + .set VE_HEAD = VE_L_FROM + XT_L_FROM: +0002b8 f001 .dw DO_COLON + PFA_L_FROM: + + .endif + ;Z L> -- x L: x -- move from leave stack + ; LP @ @ -2 LP +! ; + +0002b9 02d7 .dw XT_LP +0002ba f08b .dw XT_FETCH +0002bb f08b .dw XT_FETCH +0002bc f046 .dw XT_DOLITERAL +0002bd fffe .dw -2 +0002be 02d7 .dw XT_LP +0002bf f277 .dw XT_PLUSSTORE +0002c0 f026 .dw XT_EXIT + .include "words/to-l.asm" + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_TO_L: +0002c1 ff02 .dw $ff02 +0002c2 6c3e .db ">l" +0002c3 02b5 .dw VE_HEAD + .set VE_HEAD = VE_TO_L + XT_TO_L: +0002c4 f001 .dw DO_COLON + PFA_TO_L: + .endif + ;Z >L x -- L: -- x move to leave stack + ; CELL LP +! LP @ ! ; (L stack grows up) + +0002c5 fda6 .dw XT_TWO +0002c6 02d7 .dw XT_LP +0002c7 f277 .dw XT_PLUSSTORE +0002c8 02d7 .dw XT_LP +0002c9 f08b .dw XT_FETCH +0002ca f093 .dw XT_STORE +0002cb f026 .dw XT_EXIT + .include "words/lp0.asm" + + ; Stack + ; start address of leave stack + VE_LP0: +0002cc ff03 .dw $ff03 +0002cd 706c +0002ce 0030 .db "lp0",0 +0002cf 02c1 .dw VE_HEAD + .set VE_HEAD = VE_LP0 + XT_LP0: +0002d0 f081 .dw PFA_DOVALUE1 + PFA_LP0: +0002d1 0052 .dw CFG_LP0 +0002d2 fbcf .dw XT_EDEFERFETCH +0002d3 fbd9 .dw XT_EDEFERSTORE + .include "words/lp.asm" + + ; System Variable + ; leave stack pointer + VE_LP: +0002d4 ff02 .dw $ff02 +0002d5 706c .db "lp" +0002d6 02cc .dw VE_HEAD + .set VE_HEAD = VE_LP + XT_LP: +0002d7 f054 .dw PFA_DOVARIABLE + PFA_LP: +0002d8 013b .dw ram_lp + + .dseg +00013b 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: +0002d9 ff06 .dw $ff06 +0002da 7263 +0002db 6165 +0002dc 6574 .db "create" +0002dd 02d4 .dw VE_HEAD + .set VE_HEAD = VE_CREATE + XT_CREATE: +0002de f001 .dw DO_COLON + PFA_CREATE: + .endif +0002df 01ad .dw XT_DOCREATE +0002e0 030d .dw XT_REVEAL +0002e1 01d0 .dw XT_COMPILE +0002e2 f061 .dw PFA_DOCONSTANT +0002e3 f026 .dw XT_EXIT + .include "words/header.asm" + + ; Compiler + ; creates the vocabulary header without XT and data field (PF) in the wordlist wid + VE_HEADER: +0002e4 ff06 .dw $ff06 +0002e5 6568 +0002e6 6461 +0002e7 7265 .db "header" +0002e8 02d9 .dw VE_HEAD + .set VE_HEAD = VE_HEADER + XT_HEADER: +0002e9 f001 .dw DO_COLON + PFA_HEADER: +0002ea f5c9 .dw XT_DP ; the new Name Field +0002eb f111 .dw XT_TO_R +0002ec f111 .dw XT_TO_R ; ( R: NFA WID ) +0002ed f0c3 .dw XT_DUP +0002ee f13a .dw XT_GREATERZERO +0002ef f03f .dw XT_DOCONDBRANCH +0002f0 02fb .dw PFA_HEADER1 +0002f1 f0c3 .dw XT_DUP +0002f2 f046 .dw XT_DOLITERAL +0002f3 ff00 .dw $ff00 ; all flags are off (e.g. immediate) +0002f4 f22e .dw XT_OR +0002f5 f79a .dw XT_DOSCOMMA + ; make the link to the previous entry in this wordlist +0002f6 f108 .dw XT_R_FROM +0002f7 f371 .dw XT_FETCHE +0002f8 01db .dw XT_COMMA +0002f9 f108 .dw XT_R_FROM +0002fa f026 .dw XT_EXIT + + PFA_HEADER1: + ; -16: attempt to use zero length string as a name +0002fb f046 .dw XT_DOLITERAL +0002fc fff0 .dw -16 +0002fd f85c .dw XT_THROW + + .include "words/wlscope.asm" + + ; Compiler + ; dynamically place a word in a wordlist. The word name may be changed. + VE_WLSCOPE: +0002fe ff07 .dw $ff07 +0002ff 6c77 +000300 6373 +000301 706f +000302 0065 .db "wlscope",0 +000303 02e4 .dw VE_HEAD + .set VE_HEAD = VE_WLSCOPE + XT_WLSCOPE: +000304 fc2e .dw PFA_DODEFER1 + PFA_WLSCOPE: +000305 004e .dw CFG_WLSCOPE +000306 fbcf .dw XT_EDEFERFETCH +000307 fbd9 .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: +000308 ff06 .dw $ff06 +000309 6572 +00030a 6576 +00030b 6c61 .db "reveal" +00030c 02fe .dw VE_HEAD + .set VE_HEAD = VE_REVEAL + XT_REVEAL: +00030d f001 .dw DO_COLON + PFA_REVEAL: + .endif +00030e 019e +00030f f579 +000310 f08b .DW XT_NEWEST,XT_CELLPLUS,XT_FETCH ; only if wordlist is in use +000311 f0cb +000312 f03f .DW XT_QDUP,XT_DOCONDBRANCH +000313 0318 DEST(REVEAL1) +000314 019e +000315 f08b +000316 f0d6 +000317 f34d .DW XT_NEWEST,XT_FETCH,XT_SWAP,XT_STOREE + ; .DW XT_ZERO,XT_NEWEST,XT_CELLPLUS,XT_STORE ; clean wordlist entry + REVEAL1: +000318 f026 .DW XT_EXIT + .include "words/does.asm" + + ; Compiler + ; organize the XT replacement to call other colon code + VE_DOES: +000319 0005 .dw $0005 +00031a 6f64 +00031b 7365 +00031c 003e .db "does>",0 +00031d 0308 .dw VE_HEAD + .set VE_HEAD = VE_DOES + XT_DOES: +00031e f001 .dw DO_COLON + PFA_DOES: +00031f 01d0 .dw XT_COMPILE +000320 0331 .dw XT_DODOES +000321 01d0 .dw XT_COMPILE ; create a code snippet to be used in an embedded XT +000322 940e .dw $940e ; the address of this compiled +000323 01d0 .dw XT_COMPILE ; code will replace the XT of the +000324 0326 .dw DO_DODOES ; word that CREATE created +000325 f026 .dw XT_EXIT ; + + DO_DODOES: ; ( -- PFA ) +000326 939a +000327 938a savetos +000328 01cb movw tosl, wl +000329 9601 adiw tosl, 1 + ; the following takes the address from a real uC-call + .if (pclen==3) + .endif +00032a 917f pop wh +00032b 916f pop wl + +00032c 93bf push XH +00032d 93af push XL +00032e 01db movw XL, wl +00032f 940c f005 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: +000331 f001 .dw DO_COLON + PFA_DODOES: +000332 f108 .dw XT_R_FROM +000333 019e .dw XT_NEWEST +000334 f579 .dw XT_CELLPLUS +000335 f08b .dw XT_FETCH +000336 f371 .dw XT_FETCHE +000337 fc99 .dw XT_NFA2CFA +000338 f385 .dw XT_STOREI +000339 f026 .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: +00033a ff01 .dw $ff01 +00033b 003a .db ":",0 +00033c 0319 .dw VE_HEAD + .set VE_HEAD = VE_COLON + XT_COLON: +00033d f001 .dw DO_COLON + PFA_COLON: + .endif +00033e 01ad .dw XT_DOCREATE +00033f 0348 .dw XT_COLONNONAME +000340 f0eb .dw XT_DROP +000341 f026 .dw XT_EXIT + .include "words/colon-noname.asm" + + ; Compiler + ; create an unnamed entry in the dictionary, XT is DO_COLON + VE_COLONNONAME: +000342 ff07 .dw $ff07 +000343 6e3a +000344 6e6f +000345 6d61 +000346 0065 .db ":noname",0 +000347 033a .dw VE_HEAD + .set VE_HEAD = VE_COLONNONAME + XT_COLONNONAME: +000348 f001 .dw DO_COLON + PFA_COLONNONAME: +000349 f5c9 .dw XT_DP +00034a f0c3 .dw XT_DUP +00034b 01a5 .dw XT_LATEST +00034c f093 .dw XT_STORE + +00034d 01d0 .dw XT_COMPILE +00034e f001 .dw DO_COLON + +00034f 035d .dw XT_RBRACKET +000350 f026 .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: +000351 0001 .dw $0001 +000352 003b .db $3b,0 +000353 0342 .dw VE_HEAD + .set VE_HEAD = VE_SEMICOLON + XT_SEMICOLON: +000354 f001 .dw DO_COLON + PFA_SEMICOLON: + .endif +000355 01d0 .dw XT_COMPILE +000356 f026 .dw XT_EXIT +000357 0365 .dw XT_LBRACKET +000358 030d .dw XT_REVEAL +000359 f026 .dw XT_EXIT + .include "words/right-bracket.asm" + + ; Compiler + ; enter compiler mode + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_RBRACKET: +00035a ff01 .dw $ff01 +00035b 005d .db "]",0 +00035c 0351 .dw VE_HEAD + .set VE_HEAD = VE_RBRACKET + XT_RBRACKET: +00035d f001 .dw DO_COLON + PFA_RBRACKET: + .endif +00035e fda1 .dw XT_ONE +00035f f566 .dw XT_STATE +000360 f093 .dw XT_STORE +000361 f026 .dw XT_EXIT + .include "words/left-bracket.asm" + + ; Compiler + ; enter interpreter mode + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_LBRACKET: +000362 0001 .dw $0001 +000363 005b .db "[",0 +000364 035a .dw VE_HEAD + .set VE_HEAD = VE_LBRACKET + XT_LBRACKET: +000365 f001 .dw DO_COLON + PFA_LBRACKET: + .endif +000366 f166 .dw XT_ZERO +000367 f566 .dw XT_STATE +000368 f093 .dw XT_STORE +000369 f026 .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: +00036a ff08 .dw $ff08 +00036b 6176 +00036c 6972 +00036d 6261 +00036e 656c .db "variable" +00036f 0362 .dw VE_HEAD + .set VE_HEAD = VE_VARIABLE + XT_VARIABLE: +000370 f001 .dw DO_COLON + PFA_VARIABLE: + .endif +000371 f5da .dw XT_HERE +000372 037c .dw XT_CONSTANT +000373 fda6 .dw XT_TWO +000374 f5e3 .dw XT_ALLOT +000375 f026 .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: +000376 ff08 .dw $ff08 +000377 6f63 +000378 736e +000379 6174 +00037a 746e .db "constant" +00037b 036a .dw VE_HEAD + .set VE_HEAD = VE_CONSTANT + XT_CONSTANT: +00037c f001 .dw DO_COLON + PFA_CONSTANT: + .endif +00037d 01ad .dw XT_DOCREATE +00037e 030d .dw XT_REVEAL +00037f 01d0 .dw XT_COMPILE +000380 f054 .dw PFA_DOVARIABLE +000381 01db .dw XT_COMMA +000382 f026 .dw XT_EXIT + .include "words/user.asm" + + ; Compiler + ; create a dictionary entry for a user variable at offset n + VE_USER: +000383 ff04 .dw $ff04 +000384 7375 +000385 7265 .db "user" +000386 0376 .dw VE_HEAD + .set VE_HEAD = VE_USER + XT_USER: +000387 f001 .dw DO_COLON + PFA_USER: +000388 01ad .dw XT_DOCREATE +000389 030d .dw XT_REVEAL + +00038a 01d0 .dw XT_COMPILE +00038b f067 .dw PFA_DOUSER +00038c 01db .dw XT_COMMA +00038d f026 .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: +00038e 0007 .dw $0007 +00038f 6572 +000390 7563 +000391 7372 +000392 0065 .db "recurse",0 +000393 0383 .dw VE_HEAD + .set VE_HEAD = VE_RECURSE + XT_RECURSE: +000394 f001 .dw DO_COLON + PFA_RECURSE: + .endif +000395 01a5 .dw XT_LATEST +000396 f08b .dw XT_FETCH +000397 01db .dw XT_COMMA +000398 f026 .dw XT_EXIT + .include "words/immediate.asm" + + ; Compiler + ; set immediate flag for the most recent word definition + VE_IMMEDIATE: +000399 ff09 .dw $ff09 +00039a 6d69 +00039b 656d +00039c 6964 +00039d 7461 +00039e 0065 .db "immediate",0 +00039f 038e .dw VE_HEAD + .set VE_HEAD = VE_IMMEDIATE + XT_IMMEDIATE: +0003a0 f001 .dw DO_COLON + PFA_IMMEDIATE: +0003a1 0442 .dw XT_GET_CURRENT +0003a2 f371 .dw XT_FETCHE +0003a3 f0c3 .dw XT_DUP +0003a4 f3e3 .dw XT_FETCHI +0003a5 f046 .dw XT_DOLITERAL +0003a6 7fff .dw $7fff +0003a7 f225 .dw XT_AND +0003a8 f0d6 .dw XT_SWAP +0003a9 f385 .dw XT_STOREI +0003aa f026 .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: +0003ab 0006 .dw $0006 +0003ac 635b +0003ad 6168 +0003ae 5d72 .db "[char]" +0003af 0399 .dw VE_HEAD + .set VE_HEAD = VE_BRACKETCHAR + XT_BRACKETCHAR: +0003b0 f001 .dw DO_COLON + PFA_BRACKETCHAR: + .endif +0003b1 01d0 .dw XT_COMPILE +0003b2 f046 .dw XT_DOLITERAL +0003b3 f905 .dw XT_CHAR +0003b4 01db .dw XT_COMMA +0003b5 f026 .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: +0003b6 0006 .dw $0006 +0003b7 6261 +0003b8 726f +0003b9 2274 .db "abort",'"' +0003ba 03ab .dw VE_HEAD + .set VE_HEAD = VE_ABORTQUOTE + XT_ABORTQUOTE: +0003bb f001 .dw DO_COLON + PFA_ABORTQUOTE: + .endif +0003bc f4dc .dw XT_SQUOTE +0003bd 01d0 .dw XT_COMPILE +0003be 03cd .dw XT_QABORT +0003bf f026 .DW XT_EXIT + .include "words/abort.asm" + + ; Exceptions + ; send an exception -1 + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_ABORT: +0003c0 ff05 .dw $ff05 +0003c1 6261 +0003c2 726f +0003c3 0074 .db "abort",0 +0003c4 03b6 .dw VE_HEAD + .set VE_HEAD = VE_ABORT + XT_ABORT: +0003c5 f001 .dw DO_COLON + PFA_ABORT: + .endif +0003c6 f15d .dw XT_TRUE +0003c7 f85c .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: +0003c8 ff06 .dw $ff06 +0003c9 613f +0003ca 6f62 +0003cb 7472 .db "?abort" +0003cc 03c0 .dw VE_HEAD + .set VE_HEAD = VE_QABORT + XT_QABORT: +0003cd f001 .dw DO_COLON + PFA_QABORT: + + .endif +0003ce f0f3 +0003cf f03f .DW XT_ROT,XT_DOCONDBRANCH +0003d0 03d3 DEST(QABO1) +0003d1 f7bb +0003d2 03c5 .DW XT_ITYPE,XT_ABORT +0003d3 f589 +0003d4 f026 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: +0003d5 ff09 .dw $ff09 +0003d6 6567 +0003d7 2d74 +0003d8 7473 +0003d9 6361 +0003da 006b .db "get-stack",0 +0003db 03c8 .dw VE_HEAD + .set VE_HEAD = VE_GET_STACK + XT_GET_STACK: +0003dc f001 .dw DO_COLON + .endif +0003dd f0c3 .dw XT_DUP +0003de f579 .dw XT_CELLPLUS +0003df f0d6 .dw XT_SWAP +0003e0 f371 .dw XT_FETCHE +0003e1 f0c3 .dw XT_DUP +0003e2 f111 .dw XT_TO_R +0003e3 f166 .dw XT_ZERO +0003e4 f0d6 .dw XT_SWAP ; go from bigger to smaller addresses +0003e5 029a .dw XT_QDOCHECK +0003e6 f03f .dw XT_DOCONDBRANCH +0003e7 03f3 DEST(PFA_N_FETCH_E2) +0003e8 f2ad .dw XT_DODO + PFA_N_FETCH_E1: + ; ( ee-addr ) +0003e9 f2be .dw XT_I +0003ea f247 .dw XT_1MINUS +0003eb f573 .dw XT_CELLS ; ( -- ee-addr i*2 ) +0003ec f0e1 .dw XT_OVER ; ( -- ee-addr i*2 ee-addr ) +0003ed f1af .dw XT_PLUS ; ( -- ee-addr ee-addr+i +0003ee f371 .dw XT_FETCHE ;( -- ee-addr item_i ) +0003ef f0d6 .dw XT_SWAP ;( -- item_i ee-addr ) +0003f0 f15d .dw XT_TRUE ; shortcut for -1 +0003f1 f2cc .dw XT_DOPLUSLOOP +0003f2 03e9 DEST(PFA_N_FETCH_E1) + PFA_N_FETCH_E2: +0003f3 f589 .dw XT_2DROP +0003f4 f108 .dw XT_R_FROM +0003f5 f026 .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: +0003f6 ff09 .dw $ff09 +0003f7 6573 +0003f8 2d74 +0003f9 7473 +0003fa 6361 +0003fb 006b .db "set-stack",0 +0003fc 03d5 .dw VE_HEAD + .set VE_HEAD = VE_SET_STACK + XT_SET_STACK: +0003fd f001 .dw DO_COLON + PFA_SET_STACK: + .endif +0003fe f0e1 .dw XT_OVER +0003ff f133 .dw XT_ZEROLESS +000400 f03f .dw XT_DOCONDBRANCH +000401 0405 DEST(PFA_SET_STACK0) +000402 f046 .dw XT_DOLITERAL +000403 fffc .dw -4 +000404 f85c .dw XT_THROW + PFA_SET_STACK0: +000405 f580 .dw XT_2DUP +000406 f34d .dw XT_STOREE ; ( -- i_n .. i_0 n e-addr ) +000407 f0d6 .dw XT_SWAP +000408 f166 .dw XT_ZERO +000409 029a .dw XT_QDOCHECK +00040a f03f .dw XT_DOCONDBRANCH +00040b 0412 DEST(PFA_SET_STACK2) +00040c f2ad .dw XT_DODO + PFA_SET_STACK1: +00040d f579 .dw XT_CELLPLUS ; ( -- i_x e-addr ) +00040e f591 .dw XT_TUCK ; ( -- e-addr i_x e-addr +00040f f34d .dw XT_STOREE +000410 f2db .dw XT_DOLOOP +000411 040d DEST(PFA_SET_STACK1) + PFA_SET_STACK2: +000412 f0eb .dw XT_DROP +000413 f026 .dw XT_EXIT + + .include "words/map-stack.asm" + + ; Tools + ; Iterate over a stack + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_MAPSTACK: +000414 ff09 .dw $ff09 +000415 616d +000416 2d70 +000417 7473 +000418 6361 +000419 006b .db "map-stack",0 +00041a 03f6 .dw VE_HEAD + .set VE_HEAD = VE_MAPSTACK + XT_MAPSTACK: +00041b f001 .dw DO_COLON + PFA_MAPSTACK: + .endif +00041c f0c3 .dw XT_DUP +00041d f579 .dw XT_CELLPLUS +00041e f0d6 .dw XT_SWAP +00041f f371 .dw XT_FETCHE +000420 f573 .dw XT_CELLS +000421 fd79 .dw XT_BOUNDS +000422 029a .dw XT_QDOCHECK +000423 f03f .dw XT_DOCONDBRANCH +000424 0437 DEST(PFA_MAPSTACK3) +000425 f2ad .dw XT_DODO + PFA_MAPSTACK1: +000426 f2be .dw XT_I +000427 f371 .dw XT_FETCHE ; -- i*x XT id +000428 f0d6 .dw XT_SWAP +000429 f111 .dw XT_TO_R +00042a f11a .dw XT_R_FETCH +00042b f030 .dw XT_EXECUTE ; i*x id -- j*y true | i*x false +00042c f0cb .dw XT_QDUP +00042d f03f .dw XT_DOCONDBRANCH +00042e 0433 DEST(PFA_MAPSTACK2) +00042f f108 .dw XT_R_FROM +000430 f0eb .dw XT_DROP +000431 f2e6 .dw XT_UNLOOP +000432 f026 .dw XT_EXIT + PFA_MAPSTACK2: +000433 f108 .dw XT_R_FROM +000434 fda6 .dw XT_TWO +000435 f2cc .dw XT_DOPLUSLOOP +000436 0426 DEST(PFA_MAPSTACK1) + PFA_MAPSTACK3: +000437 f0eb .dw XT_DROP +000438 f166 .dw XT_ZERO +000439 f026 .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: +00043a ff0b .dw $ff0b +00043b 6567 +00043c 2d74 +00043d 7563 +00043e 7272 +00043f 6e65 +000440 0074 .db "get-current",0 +000441 0414 .dw VE_HEAD + .set VE_HEAD = VE_GET_CURRENT + XT_GET_CURRENT: +000442 f001 .dw DO_COLON + PFA_GET_CURRENT: +000443 f046 .dw XT_DOLITERAL +000444 0058 .dw CFG_CURRENT +000445 f371 .dw XT_FETCHE +000446 f026 .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: +000447 ff09 .dw $ff09 +000448 6567 +000449 2d74 +00044a 726f +00044b 6564 +00044c 0072 .db "get-order",0 +00044d 043a .dw VE_HEAD + .set VE_HEAD = VE_GET_ORDER + XT_GET_ORDER: +00044e f001 .dw DO_COLON + PFA_GET_ORDER: + .endif +00044f f046 .dw XT_DOLITERAL +000450 005c .dw CFG_ORDERLISTLEN +000451 03dc .dw XT_GET_STACK +000452 f026 .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: +000453 ff09 .dw $ff09 +000454 6663 +000455 2d67 +000456 726f +000457 6564 +000458 0072 .db "cfg-order",0 +000459 0447 .dw VE_HEAD + .set VE_HEAD = VE_CFG_ORDER + XT_CFG_ORDER: +00045a f054 .dw PFA_DOVARIABLE + PFA_CFG_ORDER: + .endif +00045b 005c .dw CFG_ORDERLISTLEN + .include "words/compare.asm" + + ; String + ; compares two strings in RAM + VE_COMPARE: +00045c ff07 .dw $ff07 +00045d 6f63 +00045e 706d +00045f 7261 +000460 0065 .db "compare",0 +000461 0453 .dw VE_HEAD + .set VE_HEAD = VE_COMPARE + XT_COMPARE: +000462 0463 .dw PFA_COMPARE + PFA_COMPARE: +000463 93bf push xh +000464 93af push xl +000465 018c movw temp0, tosl +000466 9189 +000467 9199 loadtos +000468 01dc movw xl, tosl +000469 9189 +00046a 9199 loadtos +00046b 019c movw temp2, tosl +00046c 9189 +00046d 9199 loadtos +00046e 01fc movw zl, tosl + PFA_COMPARE_LOOP: +00046f 90ed ld temp4, X+ +000470 90f1 ld temp5, Z+ +000471 14ef cp temp4, temp5 +000472 f451 brne PFA_COMPARE_NOTEQUAL +000473 950a dec temp0 +000474 f019 breq PFA_COMPARE_ENDREACHED2 +000475 952a dec temp2 +000476 f7c1 brne PFA_COMPARE_LOOP +000477 c001 rjmp PFA_COMPARE_ENDREACHED + PFA_COMPARE_ENDREACHED2: +000478 952a dec temp2 + PFA_COMPARE_ENDREACHED: +000479 2b02 or temp0, temp2 +00047a f411 brne PFA_COMPARE_CHECKLASTCHAR +00047b 2788 clr tosl +00047c c002 rjmp PFA_COMPARE_DONE + PFA_COMPARE_CHECKLASTCHAR: + PFA_COMPARE_NOTEQUAL: +00047d ef8f ser tosl +00047e c000 rjmp PFA_COMPARE_DONE + + PFA_COMPARE_DONE: +00047f 2f98 mov tosh, tosl +000480 91af pop xl +000481 91bf pop xh +000482 940c f005 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 045c .dw VE_HEAD + .set VE_HEAD = VE_NFA2LFA + XT_NFA2LFA: +00048a f001 .dw DO_COLON + PFA_NFA2LFA: +00048b fc8d .dw XT_NAME2STRING +00048c f241 .dw XT_1PLUS +00048d f216 .dw XT_2SLASH +00048e f1af .dw XT_PLUS +00048f f026 .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/dot-s.asm" + + ; Tools + ; stack dump + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_DOTS: +000490 ff02 .dw $ff02 +000491 732e .db ".s" +000492 0484 .dw VE_HEAD + .set VE_HEAD = VE_DOTS + XT_DOTS: +000493 f001 .dw DO_COLON + PFA_DOTS: + .endif +000494 fabc .dw XT_DEPTH +000495 f463 .dw XT_UDOT +000496 f7fd .dw XT_SPACE +000497 fabc .dw XT_DEPTH +000498 f166 .dw XT_ZERO +000499 029a .dw XT_QDOCHECK +00049a f03f .dw XT_DOCONDBRANCH +00049b 04a2 DEST(PFA_DOTS2) +00049c f2ad .dw XT_DODO + PFA_DOTS1: +00049d f2be .dw XT_I +00049e f4ca .dw XT_PICK +00049f f463 .dw XT_UDOT +0004a0 f2db .dw XT_DOLOOP +0004a1 049d DEST(PFA_DOTS1) + PFA_DOTS2: +0004a2 f026 .dw XT_EXIT + .include "words/spirw.asm" + + ; MCU + ; SPI exchange of 1 byte + VE_SPIRW: +0004a3 ff06 .dw $ff06 +0004a4 2163 +0004a5 7340 +0004a6 6970 .db "c!@spi" +0004a7 0490 .dw VE_HEAD + .set VE_HEAD = VE_SPIRW + XT_SPIRW: +0004a8 04a9 .dw PFA_SPIRW + PFA_SPIRW: +0004a9 d003 rcall do_spirw +0004aa 2799 clr tosh +0004ab 940c f005 jmp_ DO_NEXT + + do_spirw: +0004ad bd8e out_ SPDR, tosl + do_spirw1: +0004ae b50d in_ temp0, SPSR +0004af 7f08 cbr temp0,7 +0004b0 bd0d out_ SPSR, temp0 +0004b1 b50d in_ temp0, SPSR +0004b2 ff07 sbrs temp0, 7 +0004b3 cffa rjmp do_spirw1 ; wait until complete +0004b4 b58e in_ tosl, SPDR +0004b5 9508 ret + .include "words/n-spi.asm" + + ; MCU + ; read len bytes from SPI to addr + VE_N_SPIR: +0004b6 ff05 .dw $ff05 +0004b7 406e +0004b8 7073 +0004b9 0069 .db "n@spi",0 +0004ba 04a3 .dw VE_HEAD + .set VE_HEAD = VE_N_SPIR + XT_N_SPIR: +0004bb 04bc .dw PFA_N_SPIR + PFA_N_SPIR: +0004bc 018c movw temp0, tosl +0004bd 9189 +0004be 9199 loadtos +0004bf 01fc movw zl, tosl +0004c0 01c8 movw tosl, temp0 + PFA_N_SPIR_LOOP: +0004c1 bc2e out_ SPDR, zerol + PFA_N_SPIR_LOOP1: +0004c2 b52d in_ temp2, SPSR +0004c3 ff27 sbrs temp2, SPIF +0004c4 cffd rjmp PFA_N_SPIR_LOOP1 +0004c5 b52e in_ temp2, SPDR +0004c6 9321 st Z+, temp2 +0004c7 9701 sbiw tosl, 1 +0004c8 f7c1 brne PFA_N_SPIR_LOOP +0004c9 9189 +0004ca 9199 loadtos +0004cb 940c f005 jmp_ DO_NEXT + + ; ( addr len -- ) + ; MCU + ; write len bytes to SPI from addr + VE_N_SPIW: +0004cd ff05 .dw $ff05 +0004ce 216e +0004cf 7073 +0004d0 0069 .db "n!spi",0 +0004d1 04b6 .dw VE_HEAD + .set VE_HEAD = VE_N_SPIW + XT_N_SPIW: +0004d2 04d3 .dw PFA_N_SPIW + PFA_N_SPIW: +0004d3 018c movw temp0, tosl +0004d4 9189 +0004d5 9199 loadtos +0004d6 01fc movw zl, tosl +0004d7 01c8 movw tosl, temp0 + PFA_N_SPIW_LOOP: +0004d8 9121 ld temp2, Z+ +0004d9 bd2e out_ SPDR, temp2 + PFA_N_SPIW_LOOP1: +0004da b52d in_ temp2, SPSR +0004db ff27 sbrs temp2, SPIF +0004dc cffd rjmp PFA_N_SPIW_LOOP1 +0004dd b52e in_ temp2, SPDR ; ignore the data +0004de 9701 sbiw tosl, 1 +0004df f7c1 brne PFA_N_SPIW_LOOP +0004e0 9189 +0004e1 9199 loadtos +0004e2 940c f005 jmp_ DO_NEXT + .include "words/applturnkey.asm" + + ; R( -- ) + ; application specific turnkey action + VE_APPLTURNKEY: +0004e4 ff0b .dw $ff0b +0004e5 7061 +0004e6 6c70 +0004e7 7574 +0004e8 6e72 +0004e9 656b +0004ea 0079 .db "applturnkey",0 +0004eb 04cd .dw VE_HEAD + .set VE_HEAD = VE_APPLTURNKEY + XT_APPLTURNKEY: +0004ec f001 .dw DO_COLON + PFA_APPLTURNKEY: +0004ed 00da .dw XT_USART + + .if WANT_INTERRUPTS == 1 +0004ee f494 .dw XT_INTON + .endif +0004ef fb7f .dw XT_DOT_VER +0004f0 f7fd .dw XT_SPACE +0004f1 f55b .dw XT_F_CPU +0004f2 f046 .dw XT_DOLITERAL +0004f3 03e8 .dw 1000 +0004f4 f1d4 .dw XT_UMSLASHMOD +0004f5 f102 .dw XT_NIP +0004f6 f5f8 .dw XT_DECIMAL +0004f7 f73d .dw XT_DOT +0004f8 f788 .dw XT_DOSLITERAL +0004f9 0004 .dw 4 +0004fa 486b +0004fb 207a .db "kHz " +0004fc f7bb .dw XT_ITYPE +0004fd f026 .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: +0004fe ff0b .dw $ff0b +0004ff 6573 +000500 2d74 +000501 7563 +000502 7272 +000503 6e65 +000504 0074 .db "set-current",0 +000505 04e4 .dw VE_HEAD + .set VE_HEAD = VE_SET_CURRENT + XT_SET_CURRENT: +000506 f001 .dw DO_COLON + PFA_SET_CURRENT: +000507 f046 .dw XT_DOLITERAL +000508 0058 .dw CFG_CURRENT +000509 f34d .dw XT_STOREE +00050a f026 .dw XT_EXIT + .include "words/wordlist.asm" + + ; Search Order + ; create a new, empty wordlist + VE_WORDLIST: +00050b ff08 .dw $ff08 +00050c 6f77 +00050d 6472 +00050e 696c +00050f 7473 .db "wordlist" +000510 04fe .dw VE_HEAD + .set VE_HEAD = VE_WORDLIST + XT_WORDLIST: +000511 f001 .dw DO_COLON + PFA_WORDLIST: +000512 f5d2 .dw XT_EHERE +000513 f166 .dw XT_ZERO +000514 f0e1 .dw XT_OVER +000515 f34d .dw XT_STOREE +000516 f0c3 .dw XT_DUP +000517 f579 .dw XT_CELLPLUS +000518 fbb4 .dw XT_DOTO +000519 f5d3 .dw PFA_EHERE +00051a f026 .dw XT_EXIT + + .include "words/forth-wordlist.asm" + + ; Search Order + ; get the system default word list + VE_FORTHWORDLIST: +00051b ff0e .dw $ff0e +00051c 6f66 +00051d 7472 +00051e 2d68 +00051f 6f77 +000520 6472 +000521 696c +000522 7473 .db "forth-wordlist" +000523 050b .dw VE_HEAD + .set VE_HEAD = VE_FORTHWORDLIST + XT_FORTHWORDLIST: +000524 f054 .dw PFA_DOVARIABLE + PFA_FORTHWORDLIST: +000525 005a .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: +000526 ff09 .dw $ff09 +000527 6573 +000528 2d74 +000529 726f +00052a 6564 +00052b 0072 .db "set-order",0 +00052c 051b .dw VE_HEAD + .set VE_HEAD = VE_SET_ORDER + XT_SET_ORDER: +00052d f001 .dw DO_COLON + PFA_SET_ORDER: + .endif +00052e f046 .dw XT_DOLITERAL +00052f 005c .dw CFG_ORDERLISTLEN +000530 03fd .dw XT_SET_STACK +000531 f026 .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: +000532 ff0f .dw $ff0f +000533 6573 +000534 2d74 +000535 6572 +000536 6f63 +000537 6e67 +000538 7a69 +000539 7265 +00053a 0073 .db "set-recognizers",0 +00053b 0526 .dw VE_HEAD + .set VE_HEAD = VE_SET_RECOGNIZERS + XT_SET_RECOGNIZERS: +00053c f001 .dw DO_COLON + PFA_SET_RECOGNIZERS: + .endif +00053d f046 .dw XT_DOLITERAL +00053e 006e .dw CFG_RECOGNIZERLISTLEN +00053f 03fd .dw XT_SET_STACK +000540 f026 .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: +000541 ff0f .dw $ff0f +000542 6567 +000543 2d74 +000544 6572 +000545 6f63 +000546 6e67 +000547 7a69 +000548 7265 +000549 0073 .db "get-recognizers",0 +00054a 0532 .dw VE_HEAD + .set VE_HEAD = VE_GET_RECOGNIZERS + XT_GET_RECOGNIZERS: +00054b f001 .dw DO_COLON + PFA_GET_RECOGNIZERS: + .endif +00054c f046 .dw XT_DOLITERAL +00054d 006e .dw CFG_RECOGNIZERLISTLEN +00054e 03dc .dw XT_GET_STACK +00054f f026 .dw XT_EXIT + .include "words/code.asm" + + ; Compiler + ; create named entry in the dictionary, XT is the data field + VE_CODE: +000550 ff04 .dw $ff04 +000551 6f63 +000552 6564 .db "code" +000553 0541 .dw VE_HEAD + .set VE_HEAD = VE_CODE + XT_CODE: +000554 f001 .dw DO_COLON + PFA_CODE: +000555 01ad .dw XT_DOCREATE +000556 030d .dw XT_REVEAL +000557 f5c9 .dw XT_DP +000558 fbc6 .dw XT_ICELLPLUS +000559 01db .dw XT_COMMA +00055a f026 .dw XT_EXIT + .include "words/end-code.asm" + + ; Compiler + ; finish a code definition + VE_ENDCODE: +00055b ff08 .dw $ff08 +00055c 6e65 +00055d 2d64 +00055e 6f63 +00055f 6564 .db "end-code" +000560 0550 .dw VE_HEAD + .set VE_HEAD = VE_ENDCODE + XT_ENDCODE: +000561 f001 .dw DO_COLON + PFA_ENDCODE: +000562 01d0 .dw XT_COMPILE +000563 940c .dw $940c +000564 01d0 .dw XT_COMPILE +000565 f005 .dw DO_NEXT +000566 f026 .dw XT_EXIT + .include "words/marker.asm" + + ; System Value + ; The eeprom address until which MARKER saves and restores the eeprom data. + VE_MARKER: +000567 ff08 .dw $ff08 +000568 6d28 +000569 7261 +00056a 656b +00056b 2972 .db "(marker)" +00056c 055b .dw VE_HEAD + .set VE_HEAD = VE_MARKER + XT_MARKER: +00056d f081 .dw PFA_DOVALUE1 + PFA_MARKER: +00056e 007a .dw EE_MARKER +00056f fbcf .dw XT_EDEFERFETCH +000570 fbd9 .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: +000571 0008 .dw $0008 +000572 6f70 +000573 7473 +000574 6f70 +000575 656e .db "postpone" +000576 0567 .dw VE_HEAD + .set VE_HEAD = VE_POSTPONE + XT_POSTPONE: +000577 f001 .dw DO_COLON + PFA_POSTPONE: + .endif +000578 f9cf .dw XT_PARSENAME +000579 fae7 .dw XT_FORTHRECOGNIZER +00057a faf2 .dw XT_RECOGNIZE +00057b f0c3 .dw XT_DUP +00057c f111 .dw XT_TO_R +00057d fbc6 .dw XT_ICELLPLUS +00057e fbc6 .dw XT_ICELLPLUS +00057f f3e3 .dw XT_FETCHI +000580 f030 .dw XT_EXECUTE +000581 f108 .dw XT_R_FROM +000582 fbc6 .dw XT_ICELLPLUS +000583 f3e3 .dw XT_FETCHI +000584 01db .dw XT_COMMA +000585 f026 .dw XT_EXIT + .endif + .include "words/2r_fetch.asm" + + ; Stack + ; fetch content of TOR + VE_2R_FETCH: +000586 ff03 .dw $ff03 +000587 7232 +000588 0040 .db "2r@",0 +000589 0571 .dw VE_HEAD + .set VE_HEAD = VE_2R_FETCH + XT_2R_FETCH: +00058a 058b .dw PFA_2R_FETCH + PFA_2R_FETCH: +00058b 939a +00058c 938a savetos +00058d 91ef pop zl +00058e 91ff pop zh +00058f 918f pop tosl +000590 919f pop tosh +000591 939f push tosh +000592 938f push tosl +000593 93ff push zh +000594 93ef push zl +000595 939a +000596 938a savetos +000597 01cf movw tosl, zl +000598 940c f005 jmp_ DO_NEXT + + .set DPSTART = pc + .if(pc>AMFORTH_RO_SEG) + .endif + + .org AMFORTH_RO_SEG + .include "amforth-interpreter.asm" + + + DO_COLON: +00f001 93bf push XH +00f002 93af push XL ; PUSH IP +00f003 01db movw XL, wl +00f004 9611 adiw xl, 1 + DO_NEXT: + .if WANT_INTERRUPTS == 1 +00f005 14b2 cp isrflag, zerol +00f006 f499 brne DO_INTERRUPT + .endif +00f007 01fd movw zl, XL ; READ IP +00f008 2755 +00f009 0fee +00f00a 1fff +00f00b 1f55 +00f00c bf5b +00f00d 9167 +00f00e 9177 readflashcell wl, wh +00f00f 9611 adiw XL, 1 ; INC IP + + DO_EXECUTE: +00f010 01fb movw zl, wl +00f011 2755 +00f012 0fee +00f013 1fff +00f014 1f55 +00f015 bf5b +00f016 9107 +00f017 9117 readflashcell temp0,temp1 +00f018 01f8 movw zl, temp0 +00f019 9409 ijmp + + .if WANT_INTERRUPTS == 1 + DO_INTERRUPT: + ; here we deal with interrupts the forth way +00f01a 939a +00f01b 938a savetos +00f01c 2d8b mov tosl, isrflag +00f01d 2799 clr tosh +00f01e 24bb clr isrflag +00f01f eb6d ldi wl, LOW(XT_ISREXEC) +00f020 ef74 ldi wh, HIGH(XT_ISREXEC) +00f021 cfee rjmp DO_EXECUTE + .include "dict/nrww.inc" + + ; section together with the forth inner interpreter + + .include "words/exit.asm" + + ; Compiler + ; end of current colon word + VE_EXIT: +00f022 ff04 .dw $ff04 +00f023 7865 +00f024 7469 .db "exit" +00f025 0586 .dw VE_HEAD + .set VE_HEAD = VE_EXIT + XT_EXIT: +00f026 f027 .dw PFA_EXIT + PFA_EXIT: +00f027 91af pop XL +00f028 91bf pop XH +00f029 cfdb jmp_ DO_NEXT + .include "words/execute.asm" + + ; System + ; execute XT + VE_EXECUTE: +00f02a ff07 .dw $ff07 +00f02b 7865 +00f02c 6365 +00f02d 7475 +00f02e 0065 .db "execute",0 +00f02f f022 .dw VE_HEAD + .set VE_HEAD = VE_EXECUTE + XT_EXECUTE: +00f030 f031 .dw PFA_EXECUTE + PFA_EXECUTE: +00f031 01bc movw wl, tosl +00f032 9189 +00f033 9199 loadtos +00f034 cfdb 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: +00f035 f036 .dw PFA_DOBRANCH + PFA_DOBRANCH: +00f036 01fd movw zl, XL +00f037 2755 +00f038 0fee +00f039 1fff +00f03a 1f55 +00f03b bf5b +00f03c 91a7 +00f03d 91b7 readflashcell XL,XH +00f03e cfc6 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: +00f03f f040 .dw PFA_DOCONDBRANCH + PFA_DOCONDBRANCH: +00f040 2b98 or tosh, tosl +00f041 9189 +00f042 9199 loadtos +00f043 f391 brbs 1, PFA_DOBRANCH ; 1 is z flag; if tos is zero (false), do the branch +00f044 9611 adiw XL, 1 +00f045 cfbf 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: +00f046 f047 .dw PFA_DOLITERAL + PFA_DOLITERAL: +00f047 939a +00f048 938a savetos +00f049 01fd movw zl, xl +00f04a 2755 +00f04b 0fee +00f04c 1fff +00f04d 1f55 +00f04e bf5b +00f04f 9187 +00f050 9197 readflashcell tosl,tosh +00f051 9611 adiw xl, 1 +00f052 cfb2 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: +00f053 f054 .dw PFA_DOVARIABLE + PFA_DOVARIABLE: +00f054 939a +00f055 938a savetos +00f056 01fb movw zl, wl +00f057 9631 adiw zl,1 +00f058 2755 +00f059 0fee +00f05a 1fff +00f05b 1f55 +00f05c bf5b +00f05d 9187 +00f05e 9197 readflashcell tosl,tosh +00f05f cfa5 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: +00f060 f061 .dw PFA_DOCONSTANT + PFA_DOCONSTANT: +00f061 939a +00f062 938a savetos +00f063 01cb movw tosl, wl +00f064 9601 adiw tosl, 1 +00f065 cf9f 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: +00f066 f067 .dw PFA_DOUSER + PFA_DOUSER: +00f067 939a +00f068 938a savetos +00f069 01fb movw zl, wl +00f06a 9631 adiw zl, 1 +00f06b 2755 +00f06c 0fee +00f06d 1fff +00f06e 1f55 +00f06f bf5b +00f070 9187 +00f071 9197 readflashcell tosl,tosh +00f072 0d84 add tosl, upl +00f073 1d95 adc tosh, uph +00f074 cf90 jmp_ DO_NEXT + .include "words/do-value.asm" + + ; System + ; runtime of value + VE_DOVALUE: +00f075 ff07 .dw $ff07 +00f076 7628 +00f077 6c61 +00f078 6575 +00f079 0029 .db "(value)", 0 +00f07a f02a .dw VE_HEAD + .set VE_HEAD = VE_DOVALUE + XT_DOVALUE: +00f07b f001 .dw DO_COLON + PFA_DOVALUE: +00f07c 01ad .dw XT_DOCREATE +00f07d 030d .dw XT_REVEAL +00f07e 01d0 .dw XT_COMPILE +00f07f f081 .dw PFA_DOVALUE1 +00f080 f026 .dw XT_EXIT + PFA_DOVALUE1: +00f081 940e 0326 call_ DO_DODOES +00f083 f0c3 .dw XT_DUP +00f084 fbc6 .dw XT_ICELLPLUS +00f085 f3e3 .dw XT_FETCHI +00f086 f030 .dw XT_EXECUTE +00f087 f026 .dw XT_EXIT + + ; : (value) dup icell+ @i execute ; + .include "words/fetch.asm" + + ; Memory + ; read 1 cell from RAM address + VE_FETCH: +00f088 ff01 .dw $ff01 +00f089 0040 .db "@",0 +00f08a f075 .dw VE_HEAD + .set VE_HEAD = VE_FETCH + XT_FETCH: +00f08b f08c .dw PFA_FETCH + PFA_FETCH: + .if WANT_UNIFIED == 1 + .endif + PFA_FETCHRAM: +00f08c 01fc movw zl, tosl + ; low byte is read before the high byte +00f08d 9181 ld tosl, z+ +00f08e 9191 ld tosh, z+ +00f08f cf75 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: +00f090 ff01 .dw $ff01 +00f091 0021 .db "!",0 +00f092 f088 .dw VE_HEAD + .set VE_HEAD = VE_STORE + XT_STORE: +00f093 f094 .dw PFA_STORE + PFA_STORE: + .if WANT_UNIFIED == 1 + .endif + PFA_STORERAM: +00f094 01fc movw zl, tosl +00f095 9189 +00f096 9199 loadtos + ; the high byte is written before the low byte +00f097 8391 std Z+1, tosh +00f098 8380 std Z+0, tosl +00f099 9189 +00f09a 9199 loadtos +00f09b cf69 jmp_ DO_NEXT + .if WANT_UNIFIED == 1 + .endif + .include "words/cstore.asm" + + ; Memory + ; store a single byte to RAM address + VE_CSTORE: +00f09c ff02 .dw $ff02 +00f09d 2163 .db "c!" +00f09e f090 .dw VE_HEAD + .set VE_HEAD = VE_CSTORE + XT_CSTORE: +00f09f f0a0 .dw PFA_CSTORE + PFA_CSTORE: +00f0a0 01fc movw zl, tosl +00f0a1 9189 +00f0a2 9199 loadtos +00f0a3 8380 st Z, tosl +00f0a4 9189 +00f0a5 9199 loadtos +00f0a6 cf5e jmp_ DO_NEXT + .include "words/cfetch.asm" + + ; Memory + ; fetch a single byte from memory mapped locations + VE_CFETCH: +00f0a7 ff02 .dw $ff02 +00f0a8 4063 .db "c@" +00f0a9 f09c .dw VE_HEAD + .set VE_HEAD = VE_CFETCH + XT_CFETCH: +00f0aa f0ab .dw PFA_CFETCH + PFA_CFETCH: +00f0ab 01fc movw zl, tosl +00f0ac 2799 clr tosh +00f0ad 8180 ld tosl, Z +00f0ae cf56 jmp_ DO_NEXT + .include "words/fetch-u.asm" + + ; Memory + ; read 1 cell from USER area + VE_FETCHU: +00f0af ff02 .dw $ff02 +00f0b0 7540 .db "@u" +00f0b1 f0a7 .dw VE_HEAD + .set VE_HEAD = VE_FETCHU + XT_FETCHU: +00f0b2 f001 .dw DO_COLON + PFA_FETCHU: +00f0b3 f314 .dw XT_UP_FETCH +00f0b4 f1af .dw XT_PLUS +00f0b5 f08b .dw XT_FETCH +00f0b6 f026 .dw XT_EXIT + .include "words/store-u.asm" + + ; Memory + ; write n to USER area at offset + VE_STOREU: +00f0b7 ff02 .dw $ff02 +00f0b8 7521 .db "!u" +00f0b9 f0af .dw VE_HEAD + .set VE_HEAD = VE_STOREU + XT_STOREU: +00f0ba f001 .dw DO_COLON + PFA_STOREU: +00f0bb f314 .dw XT_UP_FETCH +00f0bc f1af .dw XT_PLUS +00f0bd f093 .dw XT_STORE +00f0be f026 .dw XT_EXIT + + ;;;;;;;;;;;;;;;;;;;;;;;;; + .include "words/dup.asm" + + ; Stack + ; duplicate TOS + VE_DUP: +00f0bf ff03 .dw $ff03 +00f0c0 7564 +00f0c1 0070 .db "dup",0 +00f0c2 f0b7 .dw VE_HEAD + .set VE_HEAD = VE_DUP + XT_DUP: +00f0c3 f0c4 .dw PFA_DUP + PFA_DUP: +00f0c4 939a +00f0c5 938a savetos +00f0c6 cf3e jmp_ DO_NEXT + .include "words/qdup.asm" + + ; Stack + ; duplicate TOS if non-zero + VE_QDUP: +00f0c7 ff04 .dw $ff04 +00f0c8 643f +00f0c9 7075 .db "?dup" +00f0ca f0bf .dw VE_HEAD + .set VE_HEAD = VE_QDUP + XT_QDUP: +00f0cb f0cc .dw PFA_QDUP + PFA_QDUP: +00f0cc 2f08 mov temp0, tosl +00f0cd 2b09 or temp0, tosh +00f0ce f011 breq PFA_QDUP1 +00f0cf 939a +00f0d0 938a savetos + PFA_QDUP1: +00f0d1 cf33 jmp_ DO_NEXT + .include "words/swap.asm" + + ; Stack + ; swaps the two top level stack cells + VE_SWAP: +00f0d2 ff04 .dw $ff04 +00f0d3 7773 +00f0d4 7061 .db "swap" +00f0d5 f0c7 .dw VE_HEAD + .set VE_HEAD = VE_SWAP + XT_SWAP: +00f0d6 f0d7 .dw PFA_SWAP + PFA_SWAP: +00f0d7 018c movw temp0, tosl +00f0d8 9189 +00f0d9 9199 loadtos +00f0da 931a st -Y, temp1 +00f0db 930a st -Y, temp0 +00f0dc cf28 jmp_ DO_NEXT + .include "words/over.asm" + + ; Stack + ; Place a copy of x1 on top of the stack + VE_OVER: +00f0dd ff04 .dw $ff04 +00f0de 766f +00f0df 7265 .db "over" +00f0e0 f0d2 .dw VE_HEAD + .set VE_HEAD = VE_OVER + XT_OVER: +00f0e1 f0e2 .dw PFA_OVER + PFA_OVER: +00f0e2 939a +00f0e3 938a savetos +00f0e4 818a ldd tosl, Y+2 +00f0e5 819b ldd tosh, Y+3 + +00f0e6 cf1e jmp_ DO_NEXT + .include "words/drop.asm" + + ; Stack + ; drop TOS + VE_DROP: +00f0e7 ff04 .dw $ff04 +00f0e8 7264 +00f0e9 706f .db "drop" +00f0ea f0dd .dw VE_HEAD + .set VE_HEAD = VE_DROP + XT_DROP: +00f0eb f0ec .dw PFA_DROP + PFA_DROP: +00f0ec 9189 +00f0ed 9199 loadtos +00f0ee cf16 jmp_ DO_NEXT + .include "words/rot.asm" + + ; Stack + ; rotate the three top level cells + VE_ROT: +00f0ef ff03 .dw $ff03 +00f0f0 6f72 +00f0f1 0074 .db "rot",0 +00f0f2 f0e7 .dw VE_HEAD + .set VE_HEAD = VE_ROT + XT_ROT: +00f0f3 f0f4 .dw PFA_ROT + PFA_ROT: +00f0f4 018c movw temp0, tosl +00f0f5 9129 ld temp2, Y+ +00f0f6 9139 ld temp3, Y+ +00f0f7 9189 +00f0f8 9199 loadtos + +00f0f9 933a st -Y, temp3 +00f0fa 932a st -Y, temp2 +00f0fb 931a st -Y, temp1 +00f0fc 930a st -Y, temp0 + +00f0fd cf07 jmp_ DO_NEXT + .include "words/nip.asm" + + ; Stack + ; Remove Second of Stack + VE_NIP: +00f0fe ff03 .dw $ff03 +00f0ff 696e +00f100 0070 .db "nip",0 +00f101 f0ef .dw VE_HEAD + .set VE_HEAD = VE_NIP + XT_NIP: +00f102 f103 .dw PFA_NIP + PFA_NIP: +00f103 9622 adiw yl, 2 +00f104 cf00 jmp_ DO_NEXT + ;;;;;;;;;;;;;;;;;;;;;;;;; + .include "words/r_from.asm" + + ; Stack + ; move TOR to TOS + VE_R_FROM: +00f105 ff02 .dw $ff02 +00f106 3e72 .db "r>" +00f107 f0fe .dw VE_HEAD + .set VE_HEAD = VE_R_FROM + XT_R_FROM: +00f108 f109 .dw PFA_R_FROM + PFA_R_FROM: +00f109 939a +00f10a 938a savetos +00f10b 918f pop tosl +00f10c 919f pop tosh +00f10d cef7 jmp_ DO_NEXT + .include "words/to_r.asm" + + ; Stack + ; move TOS to TOR + VE_TO_R: +00f10e ff02 .dw $ff02 +00f10f 723e .db ">r" +00f110 f105 .dw VE_HEAD + .set VE_HEAD = VE_TO_R + XT_TO_R: +00f111 f112 .dw PFA_TO_R + PFA_TO_R: +00f112 939f push tosh +00f113 938f push tosl +00f114 9189 +00f115 9199 loadtos +00f116 ceee jmp_ DO_NEXT + .include "words/r_fetch.asm" + + ; Stack + ; fetch content of TOR + VE_R_FETCH: +00f117 ff02 .dw $ff02 +00f118 4072 .db "r@" +00f119 f10e .dw VE_HEAD + .set VE_HEAD = VE_R_FETCH + XT_R_FETCH: +00f11a f11b .dw PFA_R_FETCH + PFA_R_FETCH: +00f11b 939a +00f11c 938a savetos +00f11d 918f pop tosl +00f11e 919f pop tosh +00f11f 939f push tosh +00f120 938f push tosl +00f121 cee3 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: +00f122 ff02 .dw $ff02 +00f123 3e3c .db "<>" +00f124 f117 .dw VE_HEAD + .set VE_HEAD = VE_NOTEQUAL + XT_NOTEQUAL: +00f125 f001 .dw DO_COLON + PFA_NOTEQUAL: + .endif + +00f126 fd9a +00f127 f12c +00f128 f026 .DW XT_EQUAL,XT_ZEROEQUAL,XT_EXIT + .include "words/equalzero.asm" + + ; Compare + ; compare with 0 (zero) + VE_ZEROEQUAL: +00f129 ff02 .dw $ff02 +00f12a 3d30 .db "0=" +00f12b f122 .dw VE_HEAD + .set VE_HEAD = VE_ZEROEQUAL + XT_ZEROEQUAL: +00f12c f12d .dw PFA_ZEROEQUAL + PFA_ZEROEQUAL: +00f12d 2b98 or tosh, tosl +00f12e f5d1 brne PFA_ZERO1 +00f12f c030 rjmp PFA_TRUE1 + .include "words/lesszero.asm" + + ; Compare + ; compare with zero + VE_ZEROLESS: +00f130 ff02 .dw $ff02 +00f131 3c30 .db "0<" +00f132 f129 .dw VE_HEAD + .set VE_HEAD = VE_ZEROLESS + XT_ZEROLESS: +00f133 f134 .dw PFA_ZEROLESS + PFA_ZEROLESS: +00f134 fd97 sbrc tosh,7 +00f135 c02a rjmp PFA_TRUE1 +00f136 c032 rjmp PFA_ZERO1 + .include "words/greaterzero.asm" + + ; Compare + ; true if n1 is greater than 0 + VE_GREATERZERO: +00f137 ff02 .dw $ff02 +00f138 3e30 .db "0>" +00f139 f130 .dw VE_HEAD + .set VE_HEAD = VE_GREATERZERO + XT_GREATERZERO: +00f13a f13b .dw PFA_GREATERZERO + PFA_GREATERZERO: +00f13b 1582 cp tosl, zerol +00f13c 0593 cpc tosh, zeroh +00f13d f15c brlt PFA_ZERO1 +00f13e f151 brbs 1, PFA_ZERO1 +00f13f c020 rjmp PFA_TRUE1 + .include "words/d-greaterzero.asm" + + ; Compare + ; compares if a double double cell number is greater 0 + VE_DGREATERZERO: +00f140 ff03 .dw $ff03 +00f141 3064 +00f142 003e .db "d0>",0 +00f143 f137 .dw VE_HEAD + .set VE_HEAD = VE_DGREATERZERO + XT_DGREATERZERO: +00f144 f145 .dw PFA_DGREATERZERO + PFA_DGREATERZERO: +00f145 1582 cp tosl, zerol +00f146 0593 cpc tosh, zeroh +00f147 9189 +00f148 9199 loadtos +00f149 0582 cpc tosl, zerol +00f14a 0593 cpc tosh, zeroh +00f14b f0ec brlt PFA_ZERO1 +00f14c f0e1 brbs 1, PFA_ZERO1 +00f14d c012 rjmp PFA_TRUE1 + .include "words/d-lesszero.asm" + + ; Compare + ; compares if a double double cell number is less than 0 + VE_DXT_ZEROLESS: +00f14e ff03 .dw $ff03 +00f14f 3064 +00f150 003c .db "d0<",0 +00f151 f140 .dw VE_HEAD + .set VE_HEAD = VE_DXT_ZEROLESS + XT_DXT_ZEROLESS: +00f152 f153 .dw PFA_DXT_ZEROLESS + PFA_DXT_ZEROLESS: +00f153 9622 adiw Y,2 +00f154 fd97 sbrc tosh,7 +00f155 940c f160 jmp PFA_TRUE1 +00f157 940c f169 jmp PFA_ZERO1 + + .include "words/true.asm" + + ; Arithmetics + ; leaves the value -1 (true) on TOS + VE_TRUE: +00f159 ff04 .dw $ff04 +00f15a 7274 +00f15b 6575 .db "true" +00f15c f14e .dw VE_HEAD + .set VE_HEAD = VE_TRUE + XT_TRUE: +00f15d f15e .dw PFA_TRUE + PFA_TRUE: +00f15e 939a +00f15f 938a savetos + PFA_TRUE1: +00f160 ef8f ser tosl +00f161 ef9f ser tosh +00f162 cea2 jmp_ DO_NEXT + .include "words/zero.asm" + + ; Arithmetics + ; place a value 0 on TOS + VE_ZERO: +00f163 ff01 .dw $ff01 +00f164 0030 .db "0",0 +00f165 f159 .dw VE_HEAD + .set VE_HEAD = VE_ZERO + XT_ZERO: +00f166 f167 .dw PFA_ZERO + PFA_ZERO: +00f167 939a +00f168 938a savetos + PFA_ZERO1: +00f169 01c1 movw tosl, zerol +00f16a ce9a jmp_ DO_NEXT + .include "words/uless.asm" + + ; Compare + ; true if u1 < u2 (unsigned) + VE_ULESS: +00f16b ff02 .dw $ff02 +00f16c 3c75 .db "u<" +00f16d f163 .dw VE_HEAD + .set VE_HEAD = VE_ULESS + XT_ULESS: +00f16e f16f .dw PFA_ULESS + PFA_ULESS: +00f16f 9129 ld temp2, Y+ +00f170 9139 ld temp3, Y+ +00f171 1782 cp tosl, temp2 +00f172 0793 cpc tosh, temp3 +00f173 f3a8 brlo PFA_ZERO1 +00f174 f3a1 brbs 1, PFA_ZERO1 +00f175 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: +00f176 ff02 .dw $ff02 +00f177 3e75 .db "u>" +00f178 f16b .dw VE_HEAD + .set VE_HEAD = VE_UGREATER + XT_UGREATER: +00f179 f001 .dw DO_COLON + PFA_UGREATER: + .endif +00f17a f0d6 .DW XT_SWAP +00f17b f16e .dw XT_ULESS +00f17c f026 .dw XT_EXIT + .include "words/less.asm" + + ; Compare + ; true if n1 is less than n2 + VE_LESS: +00f17d ff01 .dw $ff01 +00f17e 003c .db "<",0 +00f17f f176 .dw VE_HEAD + .set VE_HEAD = VE_LESS + XT_LESS: +00f180 f181 .dw PFA_LESS + PFA_LESS: +00f181 9129 ld temp2, Y+ +00f182 9139 ld temp3, Y+ +00f183 1728 cp temp2, tosl +00f184 0739 cpc temp3, tosh + PFA_LESSDONE: +00f185 f71c brge PFA_ZERO1 +00f186 cfd9 rjmp PFA_TRUE1 + .include "words/greater.asm" + + ; Compare + ; flag is true if n1 is greater than n2 + VE_GREATER: +00f187 ff01 .dw $ff01 +00f188 003e .db ">",0 +00f189 f17d .dw VE_HEAD + .set VE_HEAD = VE_GREATER + XT_GREATER: +00f18a f18b .dw PFA_GREATER + PFA_GREATER: +00f18b 9129 ld temp2, Y+ +00f18c 9139 ld temp3, Y+ +00f18d 1728 cp temp2, tosl +00f18e 0739 cpc temp3, tosh + PFA_GREATERDONE: +00f18f f2cc brlt PFA_ZERO1 +00f190 f2c1 brbs 1, PFA_ZERO1 +00f191 cfce rjmp PFA_TRUE1 + + .include "words/log2.asm" + + ; Arithmetics + ; logarithm to base 2 or highest set bitnumber + VE_LOG2: +00f192 ff04 .dw $ff04 +00f193 6f6c +00f194 3267 .db "log2" +00f195 f187 .dw VE_HEAD + .set VE_HEAD = VE_LOG2 + XT_LOG2: +00f196 f197 .dw PFA_LOG2 + PFA_LOG2: +00f197 01fc movw zl, tosl +00f198 2799 clr tosh +00f199 e180 ldi tosl, 16 + PFA_LOG2_1: +00f19a 958a dec tosl +00f19b f022 brmi PFA_LOG2_2 ; wrong data +00f19c 0fee lsl zl +00f19d 1fff rol zh +00f19e f7d8 brcc PFA_LOG2_1 +00f19f ce65 jmp_ DO_NEXT + + PFA_LOG2_2: +00f1a0 959a dec tosh +00f1a1 ce63 jmp_ DO_NEXT + .include "words/minus.asm" + + ; Arithmetics + ; subtract n2 from n1 + VE_MINUS: +00f1a2 ff01 .dw $ff01 +00f1a3 002d .db "-",0 +00f1a4 f192 .dw VE_HEAD + .set VE_HEAD = VE_MINUS + XT_MINUS: +00f1a5 f1a6 .dw PFA_MINUS + PFA_MINUS: +00f1a6 9109 ld temp0, Y+ +00f1a7 9119 ld temp1, Y+ +00f1a8 1b08 sub temp0, tosl +00f1a9 0b19 sbc temp1, tosh +00f1aa 01c8 movw tosl, temp0 +00f1ab ce59 jmp_ DO_NEXT + .include "words/plus.asm" + + ; Arithmetics + ; add n1 and n2 + VE_PLUS: +00f1ac ff01 .dw $ff01 +00f1ad 002b .db "+",0 +00f1ae f1a2 .dw VE_HEAD + .set VE_HEAD = VE_PLUS + XT_PLUS: +00f1af f1b0 .dw PFA_PLUS + PFA_PLUS: +00f1b0 9109 ld temp0, Y+ +00f1b1 9119 ld temp1, Y+ +00f1b2 0f80 add tosl, temp0 +00f1b3 1f91 adc tosh, temp1 +00f1b4 ce50 jmp_ DO_NEXT + .include "words/mstar.asm" + + ; Arithmetics + ; multiply 2 cells to a double cell + VE_MSTAR: +00f1b5 ff02 .dw $ff02 +00f1b6 2a6d .db "m*" +00f1b7 f1ac .dw VE_HEAD + .set VE_HEAD = VE_MSTAR + XT_MSTAR: +00f1b8 f1b9 .dw PFA_MSTAR + PFA_MSTAR: +00f1b9 018c movw temp0, tosl +00f1ba 9189 +00f1bb 9199 loadtos +00f1bc 019c movw temp2, tosl + ; high cell ah*bh +00f1bd 0231 muls temp3, temp1 +00f1be 0170 movw temp4, r0 + ; low cell al*bl +00f1bf 9f20 mul temp2, temp0 +00f1c0 01c0 movw tosl, r0 + ; signed ah*bl +00f1c1 0330 mulsu temp3, temp0 +00f1c2 08f3 sbc temp5, zeroh +00f1c3 0d90 add tosh, r0 +00f1c4 1ce1 adc temp4, r1 +00f1c5 1cf3 adc temp5, zeroh + + ; signed al*bh +00f1c6 0312 mulsu temp1, temp2 +00f1c7 08f3 sbc temp5, zeroh +00f1c8 0d90 add tosh, r0 +00f1c9 1ce1 adc temp4, r1 +00f1ca 1cf3 adc temp5, zeroh + +00f1cb 939a +00f1cc 938a savetos +00f1cd 01c7 movw tosl, temp4 +00f1ce ce36 jmp_ DO_NEXT + .include "words/umslashmod.asm" + + ; Arithmetics + ; unsigned division ud / u2 with remainder + VE_UMSLASHMOD: +00f1cf ff06 .dw $ff06 +00f1d0 6d75 +00f1d1 6d2f +00f1d2 646f .db "um/mod" +00f1d3 f1b5 .dw VE_HEAD + .set VE_HEAD = VE_UMSLASHMOD + XT_UMSLASHMOD: +00f1d4 f1d5 .dw PFA_UMSLASHMOD + PFA_UMSLASHMOD: +00f1d5 017c movw temp4, tosl + +00f1d6 9129 ld temp2, Y+ +00f1d7 9139 ld temp3, Y+ + +00f1d8 9109 ld temp0, Y+ +00f1d9 9119 ld temp1, Y+ + + ;; unsigned 32/16 -> 16r16 divide + + PFA_UMSLASHMODmod: + + ; set loop counter +00f1da e140 ldi temp6,$10 + + PFA_UMSLASHMODmod_loop: + ; shift left, saving high bit +00f1db 2755 clr temp7 +00f1dc 0f00 lsl temp0 +00f1dd 1f11 rol temp1 +00f1de 1f22 rol temp2 +00f1df 1f33 rol temp3 +00f1e0 1f55 rol temp7 + + ; try subtracting divisor +00f1e1 152e cp temp2, temp4 +00f1e2 053f cpc temp3, temp5 +00f1e3 0552 cpc temp7,zerol + +00f1e4 f018 brcs PFA_UMSLASHMODmod_loop_control + + PFA_UMSLASHMODmod_subtract: + ; dividend is large enough + ; do the subtraction for real + ; and set lowest bit +00f1e5 9503 inc temp0 +00f1e6 192e sub temp2, temp4 +00f1e7 093f sbc temp3, temp5 + + PFA_UMSLASHMODmod_loop_control: +00f1e8 954a dec temp6 +00f1e9 f789 brne PFA_UMSLASHMODmod_loop + + PFA_UMSLASHMODmod_done: + ; put remainder on stack +00f1ea 933a st -Y,temp3 +00f1eb 932a st -Y,temp2 + + ; put quotient on stack +00f1ec 01c8 movw tosl, temp0 +00f1ed ce17 jmp_ DO_NEXT + .include "words/umstar.asm" + + ; Arithmetics + ; multiply 2 unsigned cells to a double cell + VE_UMSTAR: +00f1ee ff03 .dw $ff03 +00f1ef 6d75 +00f1f0 002a .db "um*",0 +00f1f1 f1cf .dw VE_HEAD + .set VE_HEAD = VE_UMSTAR + XT_UMSTAR: +00f1f2 f1f3 .dw PFA_UMSTAR + PFA_UMSTAR: +00f1f3 018c movw temp0, tosl +00f1f4 9189 +00f1f5 9199 loadtos + ; result: (temp3*temp1)* 65536 + (temp3*temp0 + temp1*temp2) * 256 + (temp0 * temp2) + ; low bytes +00f1f6 9f80 mul tosl,temp0 +00f1f7 01f0 movw zl, r0 +00f1f8 2722 clr temp2 +00f1f9 2733 clr temp3 + ; middle bytes +00f1fa 9f90 mul tosh, temp0 +00f1fb 0df0 add zh, r0 +00f1fc 1d21 adc temp2, r1 +00f1fd 1d33 adc temp3, zeroh + +00f1fe 9f81 mul tosl, temp1 +00f1ff 0df0 add zh, r0 +00f200 1d21 adc temp2, r1 +00f201 1d33 adc temp3, zeroh + +00f202 9f91 mul tosh, temp1 +00f203 0d20 add temp2, r0 +00f204 1d31 adc temp3, r1 +00f205 01cf movw tosl, zl +00f206 939a +00f207 938a savetos +00f208 01c9 movw tosl, temp2 +00f209 cdfb jmp_ DO_NEXT + + .include "words/invert.asm" + + ; Arithmetics + ; 1-complement of TOS + VE_INVERT: +00f20a ff06 .dw $ff06 +00f20b 6e69 +00f20c 6576 +00f20d 7472 .db "invert" +00f20e f1ee .dw VE_HEAD + .set VE_HEAD = VE_INVERT + XT_INVERT: +00f20f f210 .dw PFA_INVERT + PFA_INVERT: +00f210 9580 com tosl +00f211 9590 com tosh +00f212 cdf2 jmp_ DO_NEXT + .include "words/2slash.asm" + + ; Arithmetics + ; arithmetic shift right + VE_2SLASH: +00f213 ff02 .dw $ff02 +00f214 2f32 .db "2/" +00f215 f20a .dw VE_HEAD + .set VE_HEAD = VE_2SLASH + XT_2SLASH: +00f216 f217 .dw PFA_2SLASH + PFA_2SLASH: +00f217 9595 asr tosh +00f218 9587 ror tosl +00f219 cdeb jmp_ DO_NEXT + .include "words/2star.asm" + + ; Arithmetics + ; arithmetic shift left, filling with zero + VE_2STAR: +00f21a ff02 .dw $ff02 +00f21b 2a32 .db "2*" +00f21c f213 .dw VE_HEAD + .set VE_HEAD = VE_2STAR + XT_2STAR: +00f21d f21e .dw PFA_2STAR + PFA_2STAR: +00f21e 0f88 lsl tosl +00f21f 1f99 rol tosh +00f220 cde4 jmp_ DO_NEXT + .include "words/and.asm" + + ; Logic + ; bitwise and + VE_AND: +00f221 ff03 .dw $ff03 +00f222 6e61 +00f223 0064 .db "and",0 +00f224 f21a .dw VE_HEAD + .set VE_HEAD = VE_AND + XT_AND: +00f225 f226 .dw PFA_AND + PFA_AND: +00f226 9109 ld temp0, Y+ +00f227 9119 ld temp1, Y+ +00f228 2380 and tosl, temp0 +00f229 2391 and tosh, temp1 +00f22a cdda jmp_ DO_NEXT + .include "words/or.asm" + + ; Logic + ; logical or + VE_OR: +00f22b ff02 .dw $ff02 +00f22c 726f .db "or" +00f22d f221 .dw VE_HEAD + .set VE_HEAD = VE_OR + XT_OR: +00f22e f22f .dw PFA_OR + PFA_OR: +00f22f 9109 ld temp0, Y+ +00f230 9119 ld temp1, Y+ +00f231 2b80 or tosl, temp0 +00f232 2b91 or tosh, temp1 +00f233 cdd1 jmp_ DO_NEXT + + .include "words/xor.asm" + + ; Logic + ; exclusive or + VE_XOR: +00f234 ff03 .dw $ff03 +00f235 6f78 +00f236 0072 .db "xor",0 +00f237 f22b .dw VE_HEAD + .set VE_HEAD = VE_XOR + XT_XOR: +00f238 f239 .dw PFA_XOR + PFA_XOR: +00f239 9109 ld temp0, Y+ +00f23a 9119 ld temp1, Y+ +00f23b 2780 eor tosl, temp0 +00f23c 2791 eor tosh, temp1 +00f23d cdc7 jmp_ DO_NEXT + + .include "words/1plus.asm" + + ; Arithmetics + ; optimized increment + VE_1PLUS: +00f23e ff02 .dw $ff02 +00f23f 2b31 .db "1+" +00f240 f234 .dw VE_HEAD + .set VE_HEAD = VE_1PLUS + XT_1PLUS: +00f241 f242 .dw PFA_1PLUS + PFA_1PLUS: +00f242 9601 adiw tosl,1 +00f243 cdc1 jmp_ DO_NEXT + .include "words/1minus.asm" + + ; Arithmetics + ; optimized decrement + VE_1MINUS: +00f244 ff02 .dw $ff02 +00f245 2d31 .db "1-" +00f246 f23e .dw VE_HEAD + .set VE_HEAD = VE_1MINUS + XT_1MINUS: +00f247 f248 .dw PFA_1MINUS + PFA_1MINUS: +00f248 9701 sbiw tosl, 1 +00f249 cdbb 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: +00f24a ff07 .dw $ff07 +00f24b 6e3f +00f24c 6765 +00f24d 7461 +../../common\words/q-negate.asm(11): warning: .cseg .db misalignment - padding zero byte +00f24e 0065 .db "?negate" +00f24f f244 .dw VE_HEAD + .set VE_HEAD = VE_QNEGATE + XT_QNEGATE: +00f250 f001 .dw DO_COLON + PFA_QNEGATE: + + .endif +00f251 f133 +00f252 f03f .DW XT_ZEROLESS,XT_DOCONDBRANCH +00f253 f255 DEST(QNEG1) +00f254 f65a .DW XT_NEGATE +00f255 f026 QNEG1: .DW XT_EXIT + .include "words/lshift.asm" + + ; Arithmetics + ; logically shift n1 left n2 times + VE_LSHIFT: +00f256 ff06 .dw $ff06 +00f257 736c +00f258 6968 +00f259 7466 .db "lshift" +00f25a f24a .dw VE_HEAD + .set VE_HEAD = VE_LSHIFT + XT_LSHIFT: +00f25b f25c .dw PFA_LSHIFT + PFA_LSHIFT: +00f25c 01fc movw zl, tosl +00f25d 9189 +00f25e 9199 loadtos + PFA_LSHIFT1: +00f25f 9731 sbiw zl, 1 +00f260 f01a brmi PFA_LSHIFT2 +00f261 0f88 lsl tosl +00f262 1f99 rol tosh +00f263 cffb rjmp PFA_LSHIFT1 + PFA_LSHIFT2: +00f264 cda0 jmp_ DO_NEXT + + .include "words/rshift.asm" + + ; Arithmetics + ; shift n1 n2-times logically right + VE_RSHIFT: +00f265 ff06 .dw $ff06 +00f266 7372 +00f267 6968 +00f268 7466 .db "rshift" +00f269 f256 .dw VE_HEAD + .set VE_HEAD = VE_RSHIFT + XT_RSHIFT: +00f26a f26b .dw PFA_RSHIFT + PFA_RSHIFT: +00f26b 01fc movw zl, tosl +00f26c 9189 +00f26d 9199 loadtos + PFA_RSHIFT1: +00f26e 9731 sbiw zl, 1 +00f26f f01a brmi PFA_RSHIFT2 +00f270 9596 lsr tosh +00f271 9587 ror tosl +00f272 cffb rjmp PFA_RSHIFT1 + PFA_RSHIFT2: +00f273 cd91 jmp_ DO_NEXT + + .include "words/plusstore.asm" + + ; Arithmetics + ; add n to content of RAM address a-addr + VE_PLUSSTORE: +00f274 ff02 .dw $ff02 +00f275 212b .db "+!" +00f276 f265 .dw VE_HEAD + .set VE_HEAD = VE_PLUSSTORE + XT_PLUSSTORE: +00f277 f278 .dw PFA_PLUSSTORE + PFA_PLUSSTORE: +00f278 01fc movw zl, tosl +00f279 9189 +00f27a 9199 loadtos +00f27b 8120 ldd temp2, Z+0 +00f27c 8131 ldd temp3, Z+1 +00f27d 0f82 add tosl, temp2 +00f27e 1f93 adc tosh, temp3 +00f27f 8380 std Z+0, tosl +00f280 8391 std Z+1, tosh +00f281 9189 +00f282 9199 loadtos +00f283 cd81 jmp_ DO_NEXT + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + .include "words/rpfetch.asm" + + ; Stack + ; current return stack pointer address + VE_RP_FETCH: +00f284 ff03 .dw $ff03 +00f285 7072 +00f286 0040 .db "rp@",0 +00f287 f274 .dw VE_HEAD + .set VE_HEAD = VE_RP_FETCH + XT_RP_FETCH: +00f288 f289 .dw PFA_RP_FETCH + PFA_RP_FETCH: +00f289 939a +00f28a 938a savetos +00f28b b78d in tosl, SPL +00f28c b79e in tosh, SPH +00f28d cd77 jmp_ DO_NEXT + .include "words/rpstore.asm" + + ; Stack + ; set return stack pointer + VE_RP_STORE: +00f28e ff03 .dw $ff03 +00f28f 7072 +00f290 0021 .db "rp!",0 +00f291 f284 .dw VE_HEAD + .set VE_HEAD = VE_RP_STORE + XT_RP_STORE: +00f292 f293 .dw PFA_RP_STORE + PFA_RP_STORE: +00f293 b72f in temp2, SREG +00f294 94f8 cli +00f295 bf8d out SPL, tosl +00f296 bf9e out SPH, tosh +00f297 bf2f out SREG, temp2 +00f298 9189 +00f299 9199 loadtos +00f29a cd6a jmp_ DO_NEXT + .include "words/spfetch.asm" + + ; Stack + ; current data stack pointer + VE_SP_FETCH: +00f29b ff03 .dw $ff03 +00f29c 7073 +00f29d 0040 .db "sp@",0 +00f29e f28e .dw VE_HEAD + .set VE_HEAD = VE_SP_FETCH + XT_SP_FETCH: +00f29f f2a0 .dw PFA_SP_FETCH + PFA_SP_FETCH: +00f2a0 939a +00f2a1 938a savetos +00f2a2 01ce movw tosl, yl +00f2a3 cd61 jmp_ DO_NEXT + .include "words/spstore.asm" + + ; Stack + ; set data stack pointer to addr + VE_SP_STORE: +00f2a4 ff03 .dw $ff03 +00f2a5 7073 +00f2a6 0021 .db "sp!",0 +00f2a7 f29b .dw VE_HEAD + .set VE_HEAD = VE_SP_STORE + XT_SP_STORE: +00f2a8 f2a9 .dw PFA_SP_STORE + PFA_SP_STORE: +00f2a9 01ec movw yl, tosl +00f2aa 9189 +00f2ab 9199 loadtos +00f2ac cd58 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: +00f2ad f2ae .dw PFA_DODO + PFA_DODO: +00f2ae 9129 ld temp2, Y+ +00f2af 9139 ld temp3, Y+ ; limit + PFA_DODO1: +00f2b0 e8e0 ldi zl, $80 +00f2b1 0f3e add temp3, zl +00f2b2 1b82 sub tosl, temp2 +00f2b3 0b93 sbc tosh, temp3 + +00f2b4 933f push temp3 +00f2b5 932f push temp2 ; limit ( --> limit + $8000) +00f2b6 939f push tosh +00f2b7 938f push tosl ; start -> index ( --> index - (limit - $8000) +00f2b8 9189 +00f2b9 9199 loadtos +00f2ba cd4a jmp_ DO_NEXT + .include "words/i.asm" + + ; Compiler + ; current loop counter + VE_I: +00f2bb ff01 .dw $FF01 +00f2bc 0069 .db "i",0 +00f2bd f2a4 .dw VE_HEAD + .set VE_HEAD = VE_I + XT_I: +00f2be f2bf .dw PFA_I + PFA_I: +00f2bf 939a +00f2c0 938a savetos +00f2c1 918f pop tosl +00f2c2 919f pop tosh ; index +00f2c3 91ef pop zl +00f2c4 91ff pop zh ; limit +00f2c5 93ff push zh +00f2c6 93ef push zl +00f2c7 939f push tosh +00f2c8 938f push tosl +00f2c9 0f8e add tosl, zl +00f2ca 1f9f adc tosh, zh +00f2cb cd39 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: +00f2cc f2cd .dw PFA_DOPLUSLOOP + PFA_DOPLUSLOOP: +00f2cd 91ef pop zl +00f2ce 91ff pop zh +00f2cf 0fe8 add zl, tosl +00f2d0 1ff9 adc zh, tosh +00f2d1 9189 +00f2d2 9199 loadtos +00f2d3 f01b brvs PFA_DOPLUSLOOP_LEAVE + ; next cycle + PFA_DOPLUSLOOP_NEXT: + ; next iteration +00f2d4 93ff push zh +00f2d5 93ef push zl +00f2d6 cd5f rjmp PFA_DOBRANCH ; read next cell from dictionary and jump to its destination + PFA_DOPLUSLOOP_LEAVE: +00f2d7 910f pop temp0 +00f2d8 911f pop temp1 ; remove limit +00f2d9 9611 adiw xl, 1 ; skip branch-back address +00f2da cd2a 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: +00f2db f2dc .dw PFA_DOLOOP + PFA_DOLOOP: +00f2dc 91ef pop zl +00f2dd 91ff pop zh +00f2de 9631 adiw zl,1 +00f2df f3bb brvs PFA_DOPLUSLOOP_LEAVE +00f2e0 cff3 jmp_ PFA_DOPLUSLOOP_NEXT + .include "words/unloop.asm" + + ; Compiler + ; remove loop-sys, exit the loop and continue execution after it + VE_UNLOOP: +00f2e1 ff06 .dw $ff06 +00f2e2 6e75 +00f2e3 6f6c +00f2e4 706f .db "unloop" +00f2e5 f2bb .dw VE_HEAD + .set VE_HEAD = VE_UNLOOP + XT_UNLOOP: +00f2e6 f2e7 .dw PFA_UNLOOP + PFA_UNLOOP: +00f2e7 911f pop temp1 +00f2e8 910f pop temp0 +00f2e9 911f pop temp1 +00f2ea 910f pop temp0 +00f2eb cd19 jmp_ DO_NEXT + + ;;;;;;;;;;;;;;;;;;;;;;;;;;; + + .include "words/cmove_g.asm" + + ; Memory + ; copy data in RAM from higher to lower addresses. + VE_CMOVE_G: +00f2ec ff06 .dw $ff06 +00f2ed 6d63 +00f2ee 766f +00f2ef 3e65 .db "cmove>" +00f2f0 f2e1 .dw VE_HEAD + .set VE_HEAD = VE_CMOVE_G + XT_CMOVE_G: +00f2f1 f2f2 .dw PFA_CMOVE_G + PFA_CMOVE_G: +00f2f2 93bf push xh +00f2f3 93af push xl +00f2f4 91e9 ld zl, Y+ +00f2f5 91f9 ld zh, Y+ ; addr-to +00f2f6 91a9 ld xl, Y+ +00f2f7 91b9 ld xh, Y+ ; addr-from +00f2f8 2f09 mov temp0, tosh +00f2f9 2b08 or temp0, tosl +00f2fa f041 brbs 1, PFA_CMOVE_G1 +00f2fb 0fe8 add zl, tosl +00f2fc 1ff9 adc zh, tosh +00f2fd 0fa8 add xl, tosl +00f2fe 1fb9 adc xh, tosh + PFA_CMOVE_G2: +00f2ff 911e ld temp1, -X +00f300 9312 st -Z, temp1 +00f301 9701 sbiw tosl, 1 +00f302 f7e1 brbc 1, PFA_CMOVE_G2 + PFA_CMOVE_G1: +00f303 91af pop xl +00f304 91bf pop xh +00f305 9189 +00f306 9199 loadtos +00f307 ccfd jmp_ DO_NEXT + .include "words/byteswap.asm" + + ; Arithmetics + ; exchange the bytes of the TOS + VE_BYTESWAP: +00f308 ff02 .dw $ff02 +00f309 3c3e .db "><" +00f30a f2ec .dw VE_HEAD + .set VE_HEAD = VE_BYTESWAP + XT_BYTESWAP: +00f30b f30c .dw PFA_BYTESWAP + PFA_BYTESWAP: +00f30c 2f09 mov temp0, tosh +00f30d 2f98 mov tosh, tosl +00f30e 2f80 mov tosl, temp0 +00f30f ccf5 jmp_ DO_NEXT + .include "words/up.asm" + + ; System Variable + ; get user area pointer + VE_UP_FETCH: +00f310 ff03 .dw $ff03 +00f311 7075 +00f312 0040 .db "up@",0 +00f313 f308 .dw VE_HEAD + .set VE_HEAD = VE_UP_FETCH + XT_UP_FETCH: +00f314 f315 .dw PFA_UP_FETCH + PFA_UP_FETCH: +00f315 939a +00f316 938a savetos +00f317 01c2 movw tosl, upl +00f318 ccec jmp_ DO_NEXT + + ; ( addr -- ) + ; System Variable + ; set user area pointer + VE_UP_STORE: +00f319 ff03 .dw $ff03 +00f31a 7075 +00f31b 0021 .db "up!",0 +00f31c f310 .dw VE_HEAD + .set VE_HEAD = VE_UP_STORE + XT_UP_STORE: +00f31d f31e .dw PFA_UP_STORE + PFA_UP_STORE: +00f31e 012c movw upl, tosl +00f31f 9189 +00f320 9199 loadtos +00f321 cce3 jmp_ DO_NEXT + .include "words/1ms.asm" + + ; Time + ; busy waits (almost) exactly 1 millisecond + VE_1MS: +00f322 ff03 .dw $ff03 +00f323 6d31 +00f324 0073 .db "1ms",0 +00f325 f319 .dw VE_HEAD + .set VE_HEAD = VE_1MS + XT_1MS: +00f326 f327 .dw PFA_1MS + PFA_1MS: +00f327 eae0 +00f328 e0ff +00f329 9731 +00f32a f7f1 delay 1000 +00f32b ccd9 jmp_ DO_NEXT + .include "words/2to_r.asm" + + ; Stack + ; move DTOS to TOR + VE_2TO_R: +00f32c ff03 .dw $ff03 +00f32d 3e32 +00f32e 0072 .db "2>r",0 +00f32f f322 .dw VE_HEAD + .set VE_HEAD = VE_2TO_R + XT_2TO_R: +00f330 f331 .dw PFA_2TO_R + PFA_2TO_R: +00f331 01fc movw zl, tosl +00f332 9189 +00f333 9199 loadtos +00f334 939f push tosh +00f335 938f push tosl +00f336 93ff push zh +00f337 93ef push zl +00f338 9189 +00f339 9199 loadtos +00f33a ccca jmp_ DO_NEXT + .include "words/2r_from.asm" + + ; Stack + ; move DTOR to TOS + VE_2R_FROM: +00f33b ff03 .dw $ff03 +00f33c 7232 +00f33d 003e .db "2r>",0 +00f33e f32c .dw VE_HEAD + .set VE_HEAD = VE_2R_FROM + XT_2R_FROM: +00f33f f340 .dw PFA_2R_FROM + PFA_2R_FROM: +00f340 939a +00f341 938a savetos +00f342 91ef pop zl +00f343 91ff pop zh +00f344 918f pop tosl +00f345 919f pop tosh +00f346 939a +00f347 938a savetos +00f348 01cf movw tosl, zl +00f349 ccbb jmp_ DO_NEXT + + .include "words/store-e.asm" + + ; Memory + ; write n (2bytes) to eeprom address + VE_STOREE: +00f34a ff02 .dw $ff02 +00f34b 6521 .db "!e" +00f34c f33b .dw VE_HEAD + .set VE_HEAD = VE_STOREE + XT_STOREE: +00f34d f34e .dw PFA_STOREE + PFA_STOREE: + .if WANT_UNIFIED == 1 + .endif + PFA_STOREE0: +00f34e 01fc movw zl, tosl +00f34f 9189 +00f350 9199 loadtos +00f351 b72f in_ temp2, SREG +00f352 94f8 cli +00f353 d028 rcall PFA_FETCHE2 +00f354 b500 in_ temp0, EEDR +00f355 1708 cp temp0,tosl +00f356 f009 breq PFA_STOREE3 +00f357 d00b rcall PFA_STOREE1 + PFA_STOREE3: +00f358 9631 adiw zl,1 +00f359 d022 rcall PFA_FETCHE2 +00f35a b500 in_ temp0, EEDR +00f35b 1709 cp temp0,tosh +00f35c f011 breq PFA_STOREE4 +00f35d 2f89 mov tosl, tosh +00f35e d004 rcall PFA_STOREE1 + PFA_STOREE4: +00f35f bf2f out_ SREG, temp2 +00f360 9189 +00f361 9199 loadtos +00f362 cca2 jmp_ DO_NEXT + + PFA_STOREE1: +00f363 99f9 sbic EECR, EEPE +00f364 cffe rjmp PFA_STOREE1 + + PFA_STOREE2: ; estore_wait_low_spm: +00f365 b707 in_ temp0, SPMCSR +00f366 fd00 sbrc temp0,SPMEN +00f367 cffd rjmp PFA_STOREE2 + +00f368 bdf2 out_ EEARH,zh +00f369 bde1 out_ EEARL,zl +00f36a bd80 out_ EEDR, tosl +00f36b 9afa sbi EECR,EEMPE +00f36c 9af9 sbi EECR,EEPE + +00f36d 9508 ret + .if WANT_UNIFIED == 1 + .endif + .include "words/fetch-e.asm" + + ; Memory + ; read 1 cell from eeprom + VE_FETCHE: +00f36e ff02 .dw $ff02 +00f36f 6540 .db "@e" +00f370 f34a .dw VE_HEAD + .set VE_HEAD = VE_FETCHE + XT_FETCHE: +00f371 f372 .dw PFA_FETCHE + PFA_FETCHE: + .if WANT_UNIFIED == 1 + .endif + PFA_FETCHE1: +00f372 b72f in_ temp2, SREG +00f373 94f8 cli +00f374 01fc movw zl, tosl +00f375 d006 rcall PFA_FETCHE2 +00f376 b580 in_ tosl, EEDR + +00f377 9631 adiw zl,1 + +00f378 d003 rcall PFA_FETCHE2 +00f379 b590 in_ tosh, EEDR +00f37a bf2f out_ SREG, temp2 +00f37b cc89 jmp_ DO_NEXT + + PFA_FETCHE2: +00f37c 99f9 sbic EECR, EEPE +00f37d cffe rjmp PFA_FETCHE2 + +00f37e bdf2 out_ EEARH,zh +00f37f bde1 out_ EEARL,zl + +00f380 9af8 sbi EECR,EERE +00f381 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: +00f382 ff02 .dw $ff02 +00f383 6921 .db "!i" +00f384 f36e .dw VE_HEAD + .set VE_HEAD = VE_STOREI + XT_STOREI: +00f385 fc2e .dw PFA_DODEFER1 + PFA_STOREI: +00f386 0078 .dw EE_STOREI +00f387 fbcf .dw XT_EDEFERFETCH +00f388 fbd9 .dw XT_EDEFERSTORE + .if FLASHEND > $10000 + .else + .include "words/store-i_nrww.asm" + + ; Memory + ; writes n to flash memory using assembly code (code to be placed in boot loader section) + VE_DO_STOREI_NRWW: +00f389 ff09 .dw $ff09 +00f38a 2128 +00f38b 2d69 +00f38c 726e +00f38d 7777 +00f38e 0029 .db "(!i-nrww)",0 +00f38f f382 .dw VE_HEAD + .set VE_HEAD = VE_DO_STOREI_NRWW + XT_DO_STOREI: +00f390 f391 .dw PFA_DO_STOREI_NRWW + PFA_DO_STOREI_NRWW: + ; store status register +00f391 b71f in temp1,SREG +00f392 931f push temp1 +00f393 94f8 cli + +00f394 019c movw temp2, tosl ; save the (word) address +00f395 9189 +00f396 9199 loadtos ; get the new value for the flash cell +00f397 93af push xl +00f398 93bf push xh +00f399 93cf push yl +00f39a 93df push yh +00f39b d009 rcall DO_STOREI_atmega +00f39c 91df pop yh +00f39d 91cf pop yl +00f39e 91bf pop xh +00f39f 91af pop xl + ; finally clear the stack +00f3a0 9189 +00f3a1 9199 loadtos +00f3a2 911f pop temp1 + ; restore status register (and interrupt enable flag) +00f3a3 bf1f out SREG,temp1 + +00f3a4 cc60 jmp_ DO_NEXT + + ; + DO_STOREI_atmega: + ; write data to temp page buffer + ; use the values in tosl/tosh at the + ; appropiate place +00f3a5 d010 rcall pageload + + ; erase page if needed + ; it is needed if a bit goes from 0 to 1 +00f3a6 94e0 com temp4 +00f3a7 94f0 com temp5 +00f3a8 218e and tosl, temp4 +00f3a9 219f and tosh, temp5 +00f3aa 2b98 or tosh, tosl +00f3ab f019 breq DO_STOREI_writepage +00f3ac 01f9 movw zl, temp2 +00f3ad e002 ldi temp0,(1<8000 + .include "dict/core_8k.inc" + + .include "words/n_to_r.asm" + + ; Stack + ; move n items from data stack to return stack + VE_N_TO_R: +00f3ed ff03 .dw $ff03 +00f3ee 3e6e +00f3ef 0072 .db "n>r",0 +00f3f0 f3e0 .dw VE_HEAD + .set VE_HEAD = VE_N_TO_R + XT_N_TO_R: +00f3f1 f3f2 .dw PFA_N_TO_R + PFA_N_TO_R: +00f3f2 01fc movw zl, tosl +00f3f3 2f08 mov temp0, tosl + PFA_N_TO_R1: +00f3f4 9189 +00f3f5 9199 loadtos +00f3f6 939f push tosh +00f3f7 938f push tosl +00f3f8 950a dec temp0 +00f3f9 f7d1 brne PFA_N_TO_R1 +00f3fa 93ef push zl +00f3fb 93ff push zh +00f3fc 9189 +00f3fd 9199 loadtos +00f3fe cc06 jmp_ DO_NEXT + .include "words/n_r_from.asm" + + ; Stack + ; move n items from return stack to data stack + VE_N_R_FROM: +00f3ff ff03 .dw $ff03 +00f400 726e +00f401 003e .db "nr>",0 +00f402 f3ed .dw VE_HEAD + .set VE_HEAD = VE_N_R_FROM + XT_N_R_FROM: +00f403 f404 .dw PFA_N_R_FROM + PFA_N_R_FROM: +00f404 939a +00f405 938a savetos +00f406 91ff pop zh +00f407 91ef pop zl +00f408 2f0e mov temp0, zl + PFA_N_R_FROM1: +00f409 918f pop tosl +00f40a 919f pop tosh +00f40b 939a +00f40c 938a savetos +00f40d 950a dec temp0 +00f40e f7d1 brne PFA_N_R_FROM1 +00f40f 01cf movw tosl, zl +00f410 cbf4 jmp_ DO_NEXT + + .include "words/d-2star.asm" + + ; Arithmetics + ; shift a double cell left + VE_D2STAR: +00f411 ff03 .dw $ff03 +00f412 3264 +00f413 002a .db "d2*",0 +00f414 f3ff .dw VE_HEAD + .set VE_HEAD = VE_D2STAR + XT_D2STAR: +00f415 f416 .dw PFA_D2STAR + PFA_D2STAR: +00f416 9109 ld temp0, Y+ +00f417 9119 ld temp1, Y+ +00f418 0f00 lsl temp0 +00f419 1f11 rol temp1 +00f41a 1f88 rol tosl +00f41b 1f99 rol tosh +00f41c 931a st -Y, temp1 +00f41d 930a st -Y, temp0 +00f41e cbe6 jmp_ DO_NEXT + .include "words/d-2slash.asm" + + ; Arithmetics + ; shift a double cell value right + VE_D2SLASH: +00f41f ff03 .dw $ff03 +00f420 3264 +00f421 002f .db "d2/",0 +00f422 f411 .dw VE_HEAD + .set VE_HEAD = VE_D2SLASH + XT_D2SLASH: +00f423 f424 .dw PFA_D2SLASH + PFA_D2SLASH: +00f424 9109 ld temp0, Y+ +00f425 9119 ld temp1, Y+ +00f426 9595 asr tosh +00f427 9587 ror tosl +00f428 9517 ror temp1 +00f429 9507 ror temp0 +00f42a 931a st -Y, temp1 +00f42b 930a st -Y, temp0 +00f42c cbd8 jmp_ DO_NEXT + .include "words/d-plus.asm" + + ; Arithmetics + ; add 2 double cell values + VE_DPLUS: +00f42d ff02 .dw $ff02 +00f42e 2b64 .db "d+" +00f42f f41f .dw VE_HEAD + .set VE_HEAD = VE_DPLUS + XT_DPLUS: +00f430 f431 .dw PFA_DPLUS + PFA_DPLUS: +00f431 9129 ld temp2, Y+ +00f432 9139 ld temp3, Y+ + +00f433 90e9 ld temp4, Y+ +00f434 90f9 ld temp5, Y+ +00f435 9149 ld temp6, Y+ +00f436 9159 ld temp7, Y+ + +00f437 0f24 add temp2, temp6 +00f438 1f35 adc temp3, temp7 +00f439 1d8e adc tosl, temp4 +00f43a 1d9f adc tosh, temp5 + +00f43b 933a st -Y, temp3 +00f43c 932a st -Y, temp2 +00f43d cbc7 jmp_ DO_NEXT + .include "words/d-minus.asm" + + ; Arithmetics + ; subtract d2 from d1 + VE_DMINUS: +00f43e ff02 .dw $ff02 +00f43f 2d64 .db "d-" +00f440 f42d .dw VE_HEAD + .set VE_HEAD = VE_DMINUS + XT_DMINUS: +00f441 f442 .dw PFA_DMINUS + PFA_DMINUS: +00f442 9129 ld temp2, Y+ +00f443 9139 ld temp3, Y+ + +00f444 90e9 ld temp4, Y+ +00f445 90f9 ld temp5, Y+ +00f446 9149 ld temp6, Y+ +00f447 9159 ld temp7, Y+ + +00f448 1b42 sub temp6, temp2 +00f449 0b53 sbc temp7, temp3 +00f44a 0ae8 sbc temp4, tosl +00f44b 0af9 sbc temp5, tosh + +00f44c 935a st -Y, temp7 +00f44d 934a st -Y, temp6 +00f44e 01c7 movw tosl, temp4 +00f44f cbb5 jmp_ DO_NEXT + .include "words/d-invert.asm" + + ; Arithmetics + ; invert all bits in the double cell value + VE_DINVERT: +00f450 ff07 .dw $ff07 +00f451 6964 +00f452 766e +00f453 7265 +00f454 0074 .db "dinvert",0 +00f455 f43e .dw VE_HEAD + .set VE_HEAD = VE_DINVERT + XT_DINVERT: +00f456 f457 .dw PFA_DINVERT + PFA_DINVERT: +00f457 9109 ld temp0, Y+ +00f458 9119 ld temp1, Y+ +00f459 9580 com tosl +00f45a 9590 com tosh +00f45b 9500 com temp0 +00f45c 9510 com temp1 +00f45d 931a st -Y, temp1 +00f45e 930a st -Y, temp0 +00f45f cba5 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: +00f460 ff02 .dw $ff02 +00f461 2e75 .db "u." +00f462 f450 .dw VE_HEAD + .set VE_HEAD = VE_UDOT + XT_UDOT: +00f463 f001 .dw DO_COLON + PFA_UDOT: + .endif +00f464 f166 .dw XT_ZERO +00f465 f745 .dw XT_UDDOT +00f466 f026 .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: +00f467 ff03 .dw $ff03 +00f468 2e75 +00f469 0072 .db "u.r",0 +00f46a f460 .dw VE_HEAD + .set VE_HEAD = VE_UDOTR + XT_UDOTR: +00f46b f001 .dw DO_COLON + PFA_UDOTR: + .endif +00f46c f166 .dw XT_ZERO +00f46d f0d6 .dw XT_SWAP +00f46e f74e .dw XT_UDDOTR +00f46f f026 .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: +00f470 ff0d .dw $ff0d +00f471 6873 +00f472 776f +00f473 772d +00f474 726f +00f475 6c64 +00f476 7369 +00f477 0074 .db "show-wordlist",0 +00f478 f467 .dw VE_HEAD + .set VE_HEAD = VE_SHOWWORDLIST + XT_SHOWWORDLIST: +00f479 f001 .dw DO_COLON + PFA_SHOWWORDLIST: + .endif +00f47a f046 .dw XT_DOLITERAL +00f47b f47f .dw XT_SHOWWORD +00f47c f0d6 .dw XT_SWAP +00f47d fc72 .dw XT_TRAVERSEWORDLIST +00f47e f026 .dw XT_EXIT + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + XT_SHOWWORD: +00f47f f001 .dw DO_COLON + PFA_SHOWWORD: + .endif +00f480 fc8d .dw XT_NAME2STRING +00f481 f7bb .dw XT_ITYPE +00f482 f7fd .dw XT_SPACE ; ( -- addr n) +00f483 f15d .dw XT_TRUE +00f484 f026 .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: +00f485 ff05 .dw $ff05 +00f486 6f77 +00f487 6472 +00f488 0073 .db "words",0 +00f489 f470 .dw VE_HEAD + .set VE_HEAD = VE_WORDS + XT_WORDS: +00f48a f001 .dw DO_COLON + PFA_WORDS: + .endif +00f48b f046 .dw XT_DOLITERAL +00f48c 005e .dw CFG_ORDERLISTLEN+2 +00f48d f371 .dw XT_FETCHE +00f48e f479 .dw XT_SHOWWORDLIST +00f48f f026 .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: +00f490 ff04 .dw $ff04 +00f491 692b +00f492 746e .db "+int" +00f493 f485 .dw VE_HEAD + .set VE_HEAD = VE_INTON + XT_INTON: +00f494 f495 .dw PFA_INTON + PFA_INTON: +00f495 9478 sei +00f496 cb6e jmp_ DO_NEXT + .include "words/int-off.asm" + + ; Interrupt + ; turns off all interrupts + VE_INTOFF: +00f497 ff04 .dw $ff04 +00f498 692d +00f499 746e .db "-int" +00f49a f490 .dw VE_HEAD + .set VE_HEAD = VE_INTOFF + XT_INTOFF: +00f49b f49c .dw PFA_INTOFF + PFA_INTOFF: +00f49c 94f8 cli +00f49d cb67 jmp_ DO_NEXT + .include "words/int-store.asm" + + ; Interrupt + ; stores XT as interrupt vector i + VE_INTSTORE: +00f49e ff04 .dw $ff04 +00f49f 6e69 +00f4a0 2174 .db "int!" +00f4a1 f497 .dw VE_HEAD + .set VE_HEAD = VE_INTSTORE + XT_INTSTORE: +00f4a2 f001 .dw DO_COLON + PFA_INTSTORE: +00f4a3 f046 .dw XT_DOLITERAL +00f4a4 0000 .dw intvec +00f4a5 f1af .dw XT_PLUS +00f4a6 f34d .dw XT_STOREE +00f4a7 f026 .dw XT_EXIT + .include "words/int-fetch.asm" + + ; Interrupt + ; fetches XT from interrupt vector i + VE_INTFETCH: +00f4a8 ff04 .dw $ff04 +00f4a9 6e69 +00f4aa 4074 .db "int@" +00f4ab f49e .dw VE_HEAD + .set VE_HEAD = VE_INTFETCH + XT_INTFETCH: +00f4ac f001 .dw DO_COLON + PFA_INTFETCH: +00f4ad f046 .dw XT_DOLITERAL +00f4ae 0000 .dw intvec +00f4af f1af .dw XT_PLUS +00f4b0 f371 .dw XT_FETCHE +00f4b1 f026 .dw XT_EXIT + .include "words/int-trap.asm" + + ; Interrupt + ; trigger an interrupt + VE_INTTRAP: +00f4b2 ff08 .dw $ff08 +00f4b3 6e69 +00f4b4 2d74 +00f4b5 7274 +00f4b6 7061 .db "int-trap" +00f4b7 f4a8 .dw VE_HEAD + .set VE_HEAD = VE_INTTRAP + XT_INTTRAP: +00f4b8 f4b9 .dw PFA_INTTRAP + PFA_INTTRAP: +00f4b9 2eb8 mov isrflag, tosl +00f4ba 9189 +00f4bb 9199 loadtos +00f4bc cb48 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: +00f4bd f001 .dw DO_COLON + PFA_ISREXEC: +00f4be f4ac .dw XT_INTFETCH +00f4bf f030 .dw XT_EXECUTE +00f4c0 f4c2 .dw XT_ISREND +00f4c1 f026 .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: +00f4c2 f4c3 .dw PFA_ISREND + PFA_ISREND: +00f4c3 d001 rcall PFA_ISREND1 ; clear the interrupt flag for the controller +00f4c4 cb40 jmp_ DO_NEXT + PFA_ISREND1: +00f4c5 9518 reti + .endif + + .include "words/pick.asm" + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_PICK: +00f4c6 ff04 .dw $ff04 +00f4c7 6970 +00f4c8 6b63 .db "pick" +00f4c9 f4b2 .dw VE_HEAD + .set VE_HEAD = VE_PICK + XT_PICK: +00f4ca f001 .dw DO_COLON + PFA_PICK: + .endif +00f4cb f241 .dw XT_1PLUS +00f4cc f573 .dw XT_CELLS +00f4cd f29f .dw XT_SP_FETCH +00f4ce f1af .dw XT_PLUS +00f4cf f08b .dw XT_FETCH +00f4d0 f026 .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: +00f4d1 0002 .dw $0002 +00f4d2 222e .db ".",$22 +00f4d3 f4c6 .dw VE_HEAD + .set VE_HEAD = VE_DOTSTRING + XT_DOTSTRING: +00f4d4 f001 .dw DO_COLON + PFA_DOTSTRING: + .endif +00f4d5 f4dc .dw XT_SQUOTE +00f4d6 01d0 .dw XT_COMPILE +00f4d7 f7bb .dw XT_ITYPE +00f4d8 f026 .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: +00f4d9 0002 .dw $0002 +00f4da 2273 .db "s",$22 +00f4db f4d1 .dw VE_HEAD + .set VE_HEAD = VE_SQUOTE + XT_SQUOTE: +00f4dc f001 .dw DO_COLON + PFA_SQUOTE: + .endif +00f4dd f046 .dw XT_DOLITERAL +00f4de 0022 .dw 34 ; 0x22 +00f4df f9a2 .dw XT_PARSE ; ( -- addr n) +00f4e0 f566 .dw XT_STATE +00f4e1 f08b .dw XT_FETCH +00f4e2 f03f .dw XT_DOCONDBRANCH +00f4e3 f4e5 DEST(PFA_SQUOTE1) +00f4e4 01fc .dw XT_SLITERAL + PFA_SQUOTE1: +00f4e5 f026 .dw XT_EXIT + + .include "words/fill.asm" + + ; Memory + ; fill u bytes memory beginning at a-addr with character c + VE_FILL: +00f4e6 ff04 .dw $ff04 +00f4e7 6966 +00f4e8 6c6c .db "fill" +00f4e9 f4d9 .dw VE_HEAD + .set VE_HEAD = VE_FILL + XT_FILL: +00f4ea f001 .dw DO_COLON + PFA_FILL: +00f4eb f0f3 .dw XT_ROT +00f4ec f0f3 .dw XT_ROT +00f4ed f0cb +00f4ee f03f .dw XT_QDUP,XT_DOCONDBRANCH +00f4ef f4f7 DEST(PFA_FILL2) +00f4f0 fd79 .dw XT_BOUNDS +00f4f1 f2ad .dw XT_DODO + PFA_FILL1: +00f4f2 f0c3 .dw XT_DUP +00f4f3 f2be .dw XT_I +00f4f4 f09f .dw XT_CSTORE ; ( -- c c-addr) +00f4f5 f2db .dw XT_DOLOOP +00f4f6 f4f2 .dw PFA_FILL1 + PFA_FILL2: +00f4f7 f0eb .dw XT_DROP +00f4f8 f026 .dw XT_EXIT + + .include "words/environment.asm" + + ; System Value + ; word list identifier of the environmental search list + VE_ENVIRONMENT: +00f4f9 ff0b .dw $ff0b +00f4fa 6e65 +00f4fb 6976 +00f4fc 6f72 +00f4fd 6d6e +00f4fe 6e65 +00f4ff 0074 .db "environment",0 +00f500 f4e6 .dw VE_HEAD + .set VE_HEAD = VE_ENVIRONMENT + XT_ENVIRONMENT: +00f501 f054 .dw PFA_DOVARIABLE + PFA_ENVIRONMENT: +00f502 0056 .dw CFG_ENVIRONMENT + .include "words/env-wordlists.asm" + + ; Environment + ; maximum number of wordlists in the dictionary search order + VE_ENVWORDLISTS: +00f503 ff09 .dw $ff09 +00f504 6f77 +00f505 6472 +00f506 696c +00f507 7473 +00f508 0073 .db "wordlists",0 +00f509 0000 .dw VE_ENVHEAD + .set VE_ENVHEAD = VE_ENVWORDLISTS + XT_ENVWORDLISTS: +00f50a f001 .dw DO_COLON + PFA_ENVWORDLISTS: +00f50b f046 .dw XT_DOLITERAL +00f50c 0008 .dw NUMWORDLISTS +00f50d f026 .dw XT_EXIT + .include "words/env-slashpad.asm" + + ; Environment + ; Size of the PAD buffer in bytes + VE_ENVSLASHPAD: +00f50e ff04 .dw $ff04 +00f50f 702f +00f510 6461 .db "/pad" +00f511 f503 .dw VE_ENVHEAD + .set VE_ENVHEAD = VE_ENVSLASHPAD + XT_ENVSLASHPAD: +00f512 f001 .dw DO_COLON + PFA_ENVSLASHPAD: +00f513 f29f .dw XT_SP_FETCH +00f514 f59f .dw XT_PAD +00f515 f1a5 .dw XT_MINUS +00f516 f026 .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: +00f517 ff05 .dw $ff05 +00f518 682f +00f519 6c6f +00f51a 0064 .db "/hold",0 +00f51b f50e .dw VE_ENVHEAD + .set VE_ENVHEAD = VE_ENVSLASHHOLD + XT_ENVSLASHHOLD: +00f51c f001 .dw DO_COLON + PFA_ENVSLASHHOLD: + .endif +00f51d f59f .dw XT_PAD +00f51e f5da .dw XT_HERE +00f51f f1a5 .dw XT_MINUS +00f520 f026 .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: +00f521 ff0a .dw $ff0a +00f522 6f66 +00f523 7472 +00f524 2d68 +00f525 616e +00f526 656d .db "forth-name" +00f527 f517 .dw VE_ENVHEAD + .set VE_ENVHEAD = VE_ENV_FORTHNAME + XT_ENV_FORTHNAME: +00f528 f001 .dw DO_COLON + PFA_EN_FORTHNAME: +00f529 f788 .dw XT_DOSLITERAL +00f52a 0007 .dw 7 + .endif +00f52b 6d61 +00f52c 6f66 +00f52d 7472 +../../common\words/env-forthname.asm(22): warning: .cseg .db misalignment - padding zero byte +00f52e 0068 .db "amforth" + .if cpu_msp430==1 + .endif +00f52f f026 .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: +00f530 ff07 .dw $ff07 +00f531 6576 +00f532 7372 +00f533 6f69 +00f534 006e .db "version",0 +00f535 f521 .dw VE_ENVHEAD + .set VE_ENVHEAD = VE_ENV_FORTHVERSION + XT_ENV_FORTHVERSION: +00f536 f001 .dw DO_COLON + PFA_EN_FORTHVERSION: + .endif +00f537 f046 .dw XT_DOLITERAL +00f538 0041 .dw 65 +00f539 f026 .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: +00f53a ff03 .dw $ff03 +00f53b 7063 +00f53c 0075 .db "cpu",0 +00f53d f530 .dw VE_ENVHEAD + .set VE_ENVHEAD = VE_ENV_CPU + XT_ENV_CPU: +00f53e f001 .dw DO_COLON + PFA_EN_CPU: + .endif +00f53f f046 .dw XT_DOLITERAL +00f540 0049 .dw mcu_name +00f541 f7e7 .dw XT_ICOUNT +00f542 f026 .dw XT_EXIT + .include "words/env-mcuinfo.asm" + + ; Environment + ; flash address of some CPU specific parameters + VE_ENV_MCUINFO: +00f543 ff08 .dw $ff08 +00f544 636d +00f545 2d75 +00f546 6e69 +00f547 6f66 .db "mcu-info" +00f548 f53a .dw VE_ENVHEAD + .set VE_ENVHEAD = VE_ENV_MCUINFO + XT_ENV_MCUINFO: +00f549 f001 .dw DO_COLON + PFA_EN_MCUINFO: +00f54a f046 .dw XT_DOLITERAL +00f54b 0045 .dw mcu_info +00f54c f026 .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: +00f54d ff05 .dw $ff05 +00f54e 752f +00f54f 6573 +00f550 0072 .db "/user",0 +00f551 f543 .dw VE_ENVHEAD + .set VE_ENVHEAD = VE_ENVUSERSIZE + XT_ENVUSERSIZE: +00f552 f001 .dw DO_COLON + PFA_ENVUSERSIZE: + .endif +00f553 f046 .dw XT_DOLITERAL +00f554 002c .dw SYSUSERSIZE + APPUSERSIZE +00f555 f026 .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: +00f556 ff05 .dw $ff05 +00f557 5f66 +00f558 7063 +00f559 0075 .db "f_cpu",0 +00f55a f4f9 .dw VE_HEAD + .set VE_HEAD = VE_F_CPU + XT_F_CPU: +00f55b f001 .dw DO_COLON + PFA_F_CPU: + .endif +00f55c f046 .dw XT_DOLITERAL +00f55d 2400 .dw (F_CPU % 65536) +00f55e f046 .dw XT_DOLITERAL +00f55f 00f4 .dw (F_CPU / 65536) +00f560 f026 .dw XT_EXIT + .include "words/state.asm" + + ; System Variable + ; system state + VE_STATE: +00f561 ff05 .dw $ff05 +00f562 7473 +00f563 7461 +00f564 0065 .db "state",0 +00f565 f556 .dw VE_HEAD + .set VE_HEAD = VE_STATE + XT_STATE: +00f566 f054 .dw PFA_DOVARIABLE + PFA_STATE: +00f567 013d .dw ram_state + + .dseg +00013d 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: +00f568 ff04 .dw $ff04 +00f569 6162 +00f56a 6573 .db "base" +00f56b f561 .dw VE_HEAD + .set VE_HEAD = VE_BASE + XT_BASE: +00f56c f067 .dw PFA_DOUSER + PFA_BASE: + .endif +00f56d 000c .dw USER_BASE + + .include "words/cells.asm" + + ; Arithmetics + ; n2 is the size in address units of n1 cells + VE_CELLS: +00f56e ff05 .dw $ff05 +00f56f 6563 +00f570 6c6c +00f571 0073 .db "cells",0 +00f572 f568 .dw VE_HEAD + .set VE_HEAD = VE_CELLS + XT_CELLS: +00f573 f21e .dw PFA_2STAR + .include "words/cellplus.asm" + + ; Arithmetics + ; add the size of an address-unit to a-addr1 + VE_CELLPLUS: +00f574 ff05 .dw $ff05 +00f575 6563 +00f576 6c6c +00f577 002b .db "cell+",0 +00f578 f56e .dw VE_HEAD + .set VE_HEAD = VE_CELLPLUS + XT_CELLPLUS: +00f579 f57a .dw PFA_CELLPLUS + PFA_CELLPLUS: +00f57a 9602 adiw tosl, CELLSIZE +00f57b ca89 jmp_ DO_NEXT + + .include "words/2dup.asm" + + ; Stack + ; Duplicate the 2 top elements + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_2DUP: +00f57c ff04 .dw $ff04 +00f57d 6432 +00f57e 7075 .db "2dup" +00f57f f574 .dw VE_HEAD + .set VE_HEAD = VE_2DUP + XT_2DUP: +00f580 f001 .dw DO_COLON + PFA_2DUP: + .endif + +00f581 f0e1 .dw XT_OVER +00f582 f0e1 .dw XT_OVER +00f583 f026 .dw XT_EXIT + .include "words/2drop.asm" + + ; Stack + ; Remove the 2 top elements + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_2DROP: +00f584 ff05 .dw $ff05 +00f585 6432 +00f586 6f72 +00f587 0070 .db "2drop",0 +00f588 f57c .dw VE_HEAD + .set VE_HEAD = VE_2DROP + XT_2DROP: +00f589 f001 .dw DO_COLON + PFA_2DROP: + .endif +00f58a f0eb .dw XT_DROP +00f58b f0eb .dw XT_DROP +00f58c f026 .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: +00f58d ff04 .dw $ff04 +00f58e 7574 +00f58f 6b63 .db "tuck" +00f590 f584 .dw VE_HEAD + .set VE_HEAD = VE_TUCK + XT_TUCK: +00f591 f001 .dw DO_COLON + PFA_TUCK: + .endif +00f592 f0d6 .dw XT_SWAP +00f593 f0e1 .dw XT_OVER +00f594 f026 .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: +00f595 ff03 .dw $ff03 +00f596 693e +00f597 006e .db ">in",0 +00f598 f58d .dw VE_HEAD + .set VE_HEAD = VE_TO_IN + XT_TO_IN: +00f599 f067 .dw PFA_DOUSER + PFA_TO_IN: + .endif +00f59a 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: +00f59b ff03 .dw $ff03 +00f59c 6170 +00f59d 0064 .db "pad",0 +00f59e f595 .dw VE_HEAD + .set VE_HEAD = VE_PAD + XT_PAD: +00f59f f001 .dw DO_COLON + PFA_PAD: + .endif +00f5a0 f5da .dw XT_HERE +00f5a1 f046 .dw XT_DOLITERAL +00f5a2 0028 .dw 40 +00f5a3 f1af .dw XT_PLUS +00f5a4 f026 .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: +00f5a5 ff04 .dw $ff04 +00f5a6 6d65 +00f5a7 7469 .db "emit" +00f5a8 f59b .dw VE_HEAD + .set VE_HEAD = VE_EMIT + XT_EMIT: +00f5a9 fc2e .dw PFA_DODEFER1 + PFA_EMIT: + .endif +00f5aa 000e .dw USER_EMIT +00f5ab fbf7 .dw XT_UDEFERFETCH +00f5ac fc03 .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: +00f5ad ff05 .dw $ff05 +00f5ae 6d65 +00f5af 7469 +00f5b0 003f .db "emit?",0 +00f5b1 f5a5 .dw VE_HEAD + .set VE_HEAD = VE_EMITQ + XT_EMITQ: +00f5b2 fc2e .dw PFA_DODEFER1 + PFA_EMITQ: + .endif +00f5b3 0010 .dw USER_EMITQ +00f5b4 fbf7 .dw XT_UDEFERFETCH +00f5b5 fc03 .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: +00f5b6 ff03 .dw $ff03 +00f5b7 656b +00f5b8 0079 .db "key",0 +00f5b9 f5ad .dw VE_HEAD + .set VE_HEAD = VE_KEY + XT_KEY: +00f5ba fc2e .dw PFA_DODEFER1 + PFA_KEY: + .endif +00f5bb 0012 .dw USER_KEY +00f5bc fbf7 .dw XT_UDEFERFETCH +00f5bd fc03 .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: +00f5be ff04 .dw $ff04 +00f5bf 656b +00f5c0 3f79 .db "key?" +00f5c1 f5b6 .dw VE_HEAD + .set VE_HEAD = VE_KEYQ + XT_KEYQ: +00f5c2 fc2e .dw PFA_DODEFER1 + PFA_KEYQ: + .endif +00f5c3 0014 .dw USER_KEYQ +00f5c4 fbf7 .dw XT_UDEFERFETCH +00f5c5 fc03 .dw XT_UDEFERSTORE + + .include "words/dp.asm" + + ; System Value + ; address of the next free dictionary cell + VE_DP: +00f5c6 ff02 .dw $ff02 +00f5c7 7064 .db "dp" +00f5c8 f5be .dw VE_HEAD + .set VE_HEAD = VE_DP + XT_DP: +00f5c9 f081 .dw PFA_DOVALUE1 + PFA_DP: +00f5ca 0048 .dw CFG_DP +00f5cb fbcf .dw XT_EDEFERFETCH +00f5cc fbd9 .dw XT_EDEFERSTORE + .include "words/ehere.asm" + + ; System Value + ; address of the next free address in eeprom + VE_EHERE: +00f5cd ff05 .dw $ff05 +00f5ce 6865 +00f5cf 7265 +00f5d0 0065 .db "ehere",0 +00f5d1 f5c6 .dw VE_HEAD + .set VE_HEAD = VE_EHERE + XT_EHERE: +00f5d2 f081 .dw PFA_DOVALUE1 + PFA_EHERE: +00f5d3 004c .dw EE_EHERE +00f5d4 fbcf .dw XT_EDEFERFETCH +00f5d5 fbd9 .dw XT_EDEFERSTORE + .include "words/here.asm" + + ; System Value + ; address of the next free data space (RAM) cell + VE_HERE: +00f5d6 ff04 .dw $ff04 +00f5d7 6568 +00f5d8 6572 .db "here" +00f5d9 f5cd .dw VE_HEAD + .set VE_HEAD = VE_HERE + XT_HERE: +00f5da f081 .dw PFA_DOVALUE1 + PFA_HERE: +00f5db 004a .dw EE_HERE +00f5dc fbcf .dw XT_EDEFERFETCH +00f5dd fbd9 .dw XT_EDEFERSTORE + .include "words/allot.asm" + + ; System + ; allocate or release memory in RAM + VE_ALLOT: +00f5de ff05 .dw $ff05 +00f5df 6c61 +00f5e0 6f6c +00f5e1 0074 .db "allot",0 +00f5e2 f5d6 .dw VE_HEAD + .set VE_HEAD = VE_ALLOT + XT_ALLOT: +00f5e3 f001 .dw DO_COLON + PFA_ALLOT: +00f5e4 f5da .dw XT_HERE +00f5e5 f1af .dw XT_PLUS +00f5e6 fbb4 .dw XT_DOTO +00f5e7 f5db .dw PFA_HERE +00f5e8 f026 .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: +00f5e9 ff03 .dw $ff03 +00f5ea 6962 +00f5eb 006e .db "bin",0 +00f5ec f5de .dw VE_HEAD + .set VE_HEAD = VE_BIN + XT_BIN: +00f5ed f001 .dw DO_COLON + PFA_BIN: + .endif +00f5ee fda6 .dw XT_TWO +00f5ef f56c .dw XT_BASE +00f5f0 f093 .dw XT_STORE +00f5f1 f026 .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: +00f5f2 ff07 .dw $ff07 +00f5f3 6564 +00f5f4 6963 +00f5f5 616d +00f5f6 006c .db "decimal",0 +00f5f7 f5e9 .dw VE_HEAD + .set VE_HEAD = VE_DECIMAL + XT_DECIMAL: +00f5f8 f001 .dw DO_COLON + PFA_DECIMAL: + .endif +00f5f9 f046 .dw XT_DOLITERAL +00f5fa 000a .dw 10 +00f5fb f56c .dw XT_BASE +00f5fc f093 .dw XT_STORE +00f5fd f026 .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: +00f5fe ff03 .dw $ff03 +00f5ff 6568 +00f600 0078 .db "hex",0 +00f601 f5f2 .dw VE_HEAD + .set VE_HEAD = VE_HEX + XT_HEX: +00f602 f001 .dw DO_COLON + PFA_HEX: + .endif +00f603 f046 .dw XT_DOLITERAL +00f604 0010 .dw 16 +00f605 f56c .dw XT_BASE +00f606 f093 .dw XT_STORE +00f607 f026 .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: +00f608 ff02 .dw $ff02 +00f609 6c62 .db "bl" +00f60a f5fe .dw VE_HEAD + .set VE_HEAD = VE_BL + XT_BL: +00f60b f054 .dw PFA_DOVARIABLE + PFA_BL: + .endif +00f60c 0020 .dw 32 + + .include "words/turnkey.asm" + + ; System Value + ; Deferred action during startup/reset + VE_TURNKEY: +00f60d ff07 .dw $ff07 +00f60e 7574 +00f60f 6e72 +00f610 656b +00f611 0079 .db "turnkey",0 +00f612 f608 .dw VE_HEAD + .set VE_HEAD = VE_TURNKEY + XT_TURNKEY: +00f613 fc2e .dw PFA_DODEFER1 + PFA_TURNKEY: +00f614 0054 .dw CFG_TURNKEY +00f615 fbcf .dw XT_EDEFERFETCH +00f616 fbd9 .dw XT_EDEFERSTORE + ;;;;;;;;;;;;;;;;;;;;;;;;;;;; + .include "words/slashmod.asm" + + ; Arithmetics + ; signed division n1/n2 with remainder and quotient + VE_SLASHMOD: +00f617 ff04 .dw $ff04 +00f618 6d2f +00f619 646f .db "/mod" +00f61a f60d .dw VE_HEAD + .set VE_HEAD = VE_SLASHMOD + XT_SLASHMOD: +00f61b f61c .dw PFA_SLASHMOD + PFA_SLASHMOD: +00f61c 019c movw temp2, tosl + +00f61d 9109 ld temp0, Y+ +00f61e 9119 ld temp1, Y+ + +00f61f 2f41 mov temp6,temp1 ;move dividend High to sign register +00f620 2743 eor temp6,temp3 ;xor divisor High with sign register +00f621 ff17 sbrs temp1,7 ;if MSB in dividend set +00f622 c004 rjmp PFA_SLASHMOD_1 +00f623 9510 com temp1 ; change sign of dividend +00f624 9500 com temp0 +00f625 5f0f subi temp0,low(-1) +00f626 4f1f sbci temp1,high(-1) + PFA_SLASHMOD_1: +00f627 ff37 sbrs temp3,7 ;if MSB in divisor set +00f628 c004 rjmp PFA_SLASHMOD_2 +00f629 9530 com temp3 ; change sign of divisor +00f62a 9520 com temp2 +00f62b 5f2f subi temp2,low(-1) +00f62c 4f3f sbci temp3,high(-1) +00f62d 24ee PFA_SLASHMOD_2: clr temp4 ;clear remainder Low byte +00f62e 18ff sub temp5,temp5;clear remainder High byte and carry +00f62f e151 ldi temp7,17 ;init loop counter + +00f630 1f00 PFA_SLASHMOD_3: rol temp0 ;shift left dividend +00f631 1f11 rol temp1 +00f632 955a dec temp7 ;decrement counter +00f633 f439 brne PFA_SLASHMOD_5 ;if done +00f634 ff47 sbrs temp6,7 ; if MSB in sign register set +00f635 c004 rjmp PFA_SLASHMOD_4 +00f636 9510 com temp1 ; change sign of result +00f637 9500 com temp0 +00f638 5f0f subi temp0,low(-1) +00f639 4f1f sbci temp1,high(-1) +00f63a c00b PFA_SLASHMOD_4: rjmp PFA_SLASHMODmod_done ; return +00f63b 1cee PFA_SLASHMOD_5: rol temp4 ;shift dividend into remainder +00f63c 1cff rol temp5 +00f63d 1ae2 sub temp4,temp2 ;remainder = remainder - divisor +00f63e 0af3 sbc temp5,temp3 ; +00f63f f420 brcc PFA_SLASHMOD_6 ;if result negative +00f640 0ee2 add temp4,temp2 ; restore remainder +00f641 1ef3 adc temp5,temp3 +00f642 9488 clc ; clear carry to be shifted into result +00f643 cfec rjmp PFA_SLASHMOD_3 ;else +00f644 9408 PFA_SLASHMOD_6: sec ; set carry to be shifted into result +00f645 cfea rjmp PFA_SLASHMOD_3 + + PFA_SLASHMODmod_done: + ; put remainder on stack +00f646 92fa st -Y,temp5 +00f647 92ea st -Y,temp4 + + ; put quotient on stack +00f648 01c8 movw tosl, temp0 +00f649 c9bb jmp_ DO_NEXT + .include "words/uslashmod.asm" + + ; Arithmetics + ; unsigned division with remainder + VE_USLASHMOD: +00f64a ff05 .dw $ff05 +00f64b 2f75 +00f64c 6f6d +00f64d 0064 .db "u/mod",0 +00f64e f617 .dw VE_HEAD + .set VE_HEAD = VE_USLASHMOD + XT_USLASHMOD: +00f64f f001 .dw DO_COLON + PFA_USLASHMOD: +00f650 f111 .dw XT_TO_R +00f651 f166 .dw XT_ZERO +00f652 f108 .dw XT_R_FROM +00f653 f1d4 .dw XT_UMSLASHMOD +00f654 f026 .dw XT_EXIT + .include "words/negate.asm" + + ; Logic + ; 2-complement + VE_NEGATE: +00f655 ff06 .dw $ff06 +00f656 656e +00f657 6167 +00f658 6574 .db "negate" +00f659 f64a .dw VE_HEAD + .set VE_HEAD = VE_NEGATE + XT_NEGATE: +00f65a f001 .dw DO_COLON + PFA_NEGATE: +00f65b f20f .dw XT_INVERT +00f65c f241 .dw XT_1PLUS +00f65d f026 .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: +00f65e ff01 .dw $ff01 +00f65f 002f .db "/",0 +00f660 f655 .dw VE_HEAD + .set VE_HEAD = VE_SLASH + XT_SLASH: +00f661 f001 .dw DO_COLON + PFA_SLASH: + .endif +00f662 f61b .dw XT_SLASHMOD +00f663 f102 .dw XT_NIP +00f664 f026 .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: +00f665 ff03 .dw $ff03 +00f666 6f6d +00f667 0064 .db "mod",0 +00f668 f65e .dw VE_HEAD + .set VE_HEAD = VE_MOD + XT_MOD: +00f669 f001 .dw DO_COLON + PFA_MOD: + .endif +00f66a f61b .dw XT_SLASHMOD +00f66b f0eb .dw XT_DROP +00f66c f026 .dw XT_EXIT + .include "words/abs.asm" + + ; DUP ?NEGATE ; + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_ABS: +00f66d ff03 .dw $ff03 +00f66e 6261 +00f66f 0073 .db "abs",0 +00f670 f665 .dw VE_HEAD + .set VE_HEAD = VE_ABS + XT_ABS: +00f671 f001 .dw DO_COLON + PFA_ABS: + + .endif + +00f672 f0c3 +00f673 f250 +00f674 f026 .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: +00f675 ff03 .dw $ff03 +00f676 696d +00f677 006e .db "min",0 +00f678 f66d .dw VE_HEAD + .set VE_HEAD = VE_MIN + XT_MIN: +00f679 f001 .dw DO_COLON + PFA_MIN: + .endif +00f67a f580 .dw XT_2DUP +00f67b f18a .dw XT_GREATER +00f67c f03f .dw XT_DOCONDBRANCH +00f67d f67f DEST(PFA_MIN1) +00f67e f0d6 .dw XT_SWAP + PFA_MIN1: +00f67f f0eb .dw XT_DROP +00f680 f026 .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: +00f681 ff03 .dw $ff03 +00f682 616d +00f683 0078 .db "max",0 +00f684 f675 .dw VE_HEAD + .set VE_HEAD = VE_MAX + XT_MAX: +00f685 f001 .dw DO_COLON + PFA_MAX: + + .endif +00f686 f580 .dw XT_2DUP +00f687 f180 .dw XT_LESS +00f688 f03f .dw XT_DOCONDBRANCH +00f689 f68b DEST(PFA_MAX1) +00f68a f0d6 .dw XT_SWAP + PFA_MAX1: +00f68b f0eb .dw XT_DROP +00f68c f026 .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: +00f68d ff06 .dw $ff06 +00f68e 6977 +00f68f 6874 +00f690 6e69 .db "within" +00f691 f681 .dw VE_HEAD + .set VE_HEAD = VE_WITHIN + XT_WITHIN: +00f692 f001 .dw DO_COLON + PFA_WITHIN: + .endif +00f693 f0e1 .dw XT_OVER +00f694 f1a5 .dw XT_MINUS +00f695 f111 .dw XT_TO_R +00f696 f1a5 .dw XT_MINUS +00f697 f108 .dw XT_R_FROM +00f698 f16e .dw XT_ULESS +00f699 f026 .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: +00f69a ff07 .dw $ff07 +00f69b 6f74 +00f69c 7075 +00f69d 6570 +00f69e 0072 .db "toupper",0 +00f69f f68d .dw VE_HEAD + .set VE_HEAD = VE_TOUPPER + XT_TOUPPER: +00f6a0 f001 .dw DO_COLON + PFA_TOUPPER: + .endif +00f6a1 f0c3 .dw XT_DUP +00f6a2 f046 .dw XT_DOLITERAL +00f6a3 0061 .dw 'a' +00f6a4 f046 .dw XT_DOLITERAL +00f6a5 007b .dw 'z'+1 +00f6a6 f692 .dw XT_WITHIN +00f6a7 f03f .dw XT_DOCONDBRANCH +00f6a8 f6ac DEST(PFA_TOUPPER0) +00f6a9 f046 .dw XT_DOLITERAL +00f6aa 00df .dw 223 ; inverse of 0x20: 0xdf +00f6ab f225 .dw XT_AND + PFA_TOUPPER0: +00f6ac f026 .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: +00f6ad ff07 .dw $ff07 +00f6ae 6f74 +00f6af 6f6c +00f6b0 6577 +00f6b1 0072 .db "tolower",0 +00f6b2 f69a .dw VE_HEAD + .set VE_HEAD = VE_TOLOWER + XT_TOLOWER: +00f6b3 f001 .dw DO_COLON + PFA_TOLOWER: + .endif +00f6b4 f0c3 .dw XT_DUP +00f6b5 f046 .dw XT_DOLITERAL +00f6b6 0041 .dw 'A' +00f6b7 f046 .dw XT_DOLITERAL +00f6b8 005b .dw 'Z'+1 +00f6b9 f692 .dw XT_WITHIN +00f6ba f03f .dw XT_DOCONDBRANCH +00f6bb f6bf DEST(PFA_TOLOWER0) +00f6bc f046 .dw XT_DOLITERAL +00f6bd 0020 .dw 32 +00f6be f22e .dw XT_OR + PFA_TOLOWER0: +00f6bf f026 .dw XT_EXIT + ;;;;;;;;;;;;;;;;;;;;;; + .include "words/hld.asm" + + ; Numeric IO + ; pointer to current write position in the Pictured Numeric Output buffer + VE_HLD: +00f6c0 ff03 .dw $ff03 +00f6c1 6c68 +00f6c2 0064 .db "hld",0 +00f6c3 f6ad .dw VE_HEAD + .set VE_HEAD = VE_HLD + XT_HLD: +00f6c4 f054 .dw PFA_DOVARIABLE + PFA_HLD: +00f6c5 013f .dw ram_hld + + .dseg +00013f 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: +00f6c6 ff04 .dw $ff04 +00f6c7 6f68 +00f6c8 646c .db "hold" +00f6c9 f6c0 .dw VE_HEAD + .set VE_HEAD = VE_HOLD + XT_HOLD: +00f6ca f001 .dw DO_COLON + PFA_HOLD: + .endif +00f6cb f6c4 .dw XT_HLD +00f6cc f0c3 .dw XT_DUP +00f6cd f08b .dw XT_FETCH +00f6ce f247 .dw XT_1MINUS +00f6cf f0c3 .dw XT_DUP +00f6d0 f111 .dw XT_TO_R +00f6d1 f0d6 .dw XT_SWAP +00f6d2 f093 .dw XT_STORE +00f6d3 f108 .dw XT_R_FROM +00f6d4 f09f .dw XT_CSTORE +00f6d5 f026 .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: +00f6d6 ff02 .dw $ff02 +00f6d7 233c .db "<#" +00f6d8 f6c6 .dw VE_HEAD + .set VE_HEAD = VE_L_SHARP + XT_L_SHARP: +00f6d9 f001 .dw DO_COLON + PFA_L_SHARP: + .endif +00f6da f59f .dw XT_PAD +00f6db f6c4 .dw XT_HLD +00f6dc f093 .dw XT_STORE +00f6dd f026 .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: +00f6de ff01 .dw $ff01 +00f6df 0023 .db "#",0 +00f6e0 f6d6 .dw VE_HEAD + .set VE_HEAD = VE_SHARP + XT_SHARP: +00f6e1 f001 .dw DO_COLON + PFA_SHARP: + .endif +00f6e2 f56c .dw XT_BASE +00f6e3 f08b .dw XT_FETCH +00f6e4 f75e .dw XT_UDSLASHMOD +00f6e5 f0f3 .dw XT_ROT +00f6e6 f046 .dw XT_DOLITERAL +00f6e7 0009 .dw 9 +00f6e8 f0e1 .dw XT_OVER +00f6e9 f180 .dw XT_LESS +00f6ea f03f .dw XT_DOCONDBRANCH +00f6eb f6ef DEST(PFA_SHARP1) +00f6ec f046 .dw XT_DOLITERAL +00f6ed 0007 .dw 7 +00f6ee f1af .dw XT_PLUS + PFA_SHARP1: +00f6ef f046 .dw XT_DOLITERAL +00f6f0 0030 .dw 48 ; ASCII 0 +00f6f1 f1af .dw XT_PLUS +00f6f2 f6ca .dw XT_HOLD +00f6f3 f026 .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: +00f6f4 ff02 .dw $ff02 +00f6f5 7323 .db "#s" +00f6f6 f6de .dw VE_HEAD + .set VE_HEAD = VE_SHARP_S + XT_SHARP_S: +00f6f7 f001 .dw DO_COLON + PFA_SHARP_S: + .endif + NUMS1: +00f6f8 f6e1 .dw XT_SHARP +00f6f9 f580 .dw XT_2DUP +00f6fa f22e .dw XT_OR +00f6fb f12c .dw XT_ZEROEQUAL +00f6fc f03f .dw XT_DOCONDBRANCH +00f6fd f6f8 DEST(NUMS1) ; PFA_SHARP_S +00f6fe f026 .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: +00f6ff ff02 .dw $ff02 +00f700 3e23 .db "#>" +00f701 f6f4 .dw VE_HEAD + .set VE_HEAD = VE_SHARP_G + XT_SHARP_G: +00f702 f001 .dw DO_COLON + PFA_SHARP_G: + .endif +00f703 f589 .dw XT_2DROP +00f704 f6c4 .dw XT_HLD +00f705 f08b .dw XT_FETCH +00f706 f59f .dw XT_PAD +00f707 f0e1 .dw XT_OVER +00f708 f1a5 .dw XT_MINUS +00f709 f026 .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: +00f70a ff04 .dw $ff04 +00f70b 6973 +00f70c 6e67 .db "sign" +00f70d f6ff .dw VE_HEAD + .set VE_HEAD = VE_SIGN + XT_SIGN: +00f70e f001 .dw DO_COLON + PFA_SIGN: + .endif +00f70f f133 .dw XT_ZEROLESS +00f710 f03f .dw XT_DOCONDBRANCH +00f711 f715 DEST(PFA_SIGN1) +00f712 f046 .dw XT_DOLITERAL +00f713 002d .dw 45 ; ascii - +00f714 f6ca .dw XT_HOLD + PFA_SIGN1: +00f715 f026 .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: +00f716 ff03 .dw $ff03 +00f717 2e64 +00f718 0072 .db "d.r",0 +00f719 f70a .dw VE_HEAD + .set VE_HEAD = VE_DDOTR + XT_DDOTR: +00f71a f001 .dw DO_COLON + PFA_DDOTR: + + .endif +00f71b f111 .dw XT_TO_R +00f71c f591 .dw XT_TUCK +00f71d fcef .dw XT_DABS +00f71e f6d9 .dw XT_L_SHARP +00f71f f6f7 .dw XT_SHARP_S +00f720 f0f3 .dw XT_ROT +00f721 f70e .dw XT_SIGN +00f722 f702 .dw XT_SHARP_G +00f723 f108 .dw XT_R_FROM +00f724 f0e1 .dw XT_OVER +00f725 f1a5 .dw XT_MINUS +00f726 f806 .dw XT_SPACES +00f727 f816 .dw XT_TYPE +00f728 f026 .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: +00f729 ff02 .dw $ff02 +00f72a 722e .db ".r" +00f72b f716 .dw VE_HEAD + .set VE_HEAD = VE_DOTR + XT_DOTR: +00f72c f001 .dw DO_COLON + PFA_DOTR: + + .endif +00f72d f111 .dw XT_TO_R +00f72e fd82 .dw XT_S2D +00f72f f108 .dw XT_R_FROM +00f730 f71a .dw XT_DDOTR +00f731 f026 .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: +00f732 ff02 .dw $ff02 +00f733 2e64 .db "d." +00f734 f729 .dw VE_HEAD + .set VE_HEAD = VE_DDOT + XT_DDOT: +00f735 f001 .dw DO_COLON + PFA_DDOT: + + .endif +00f736 f166 .dw XT_ZERO +00f737 f71a .dw XT_DDOTR +00f738 f7fd .dw XT_SPACE +00f739 f026 .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: +00f73a ff01 .dw $ff01 +00f73b 002e .db ".",0 +00f73c f732 .dw VE_HEAD + .set VE_HEAD = VE_DOT + XT_DOT: +00f73d f001 .dw DO_COLON + PFA_DOT: + .endif +00f73e fd82 .dw XT_S2D +00f73f f735 .dw XT_DDOT +00f740 f026 .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: +00f741 ff03 .dw $ff03 +00f742 6475 +00f743 002e .db "ud.",0 +00f744 f73a .dw VE_HEAD + .set VE_HEAD = VE_UDDOT + XT_UDDOT: +00f745 f001 .dw DO_COLON + PFA_UDDOT: + .endif +00f746 f166 .dw XT_ZERO +00f747 f74e .dw XT_UDDOTR +00f748 f7fd .dw XT_SPACE +00f749 f026 .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: +00f74a ff04 .dw $ff04 +00f74b 6475 +00f74c 722e .db "ud.r" +00f74d f741 .dw VE_HEAD + .set VE_HEAD = VE_UDDOTR + XT_UDDOTR: +00f74e f001 .dw DO_COLON + PFA_UDDOTR: + .endif +00f74f f111 .dw XT_TO_R +00f750 f6d9 .dw XT_L_SHARP +00f751 f6f7 .dw XT_SHARP_S +00f752 f702 .dw XT_SHARP_G +00f753 f108 .dw XT_R_FROM +00f754 f0e1 .dw XT_OVER +00f755 f1a5 .dw XT_MINUS +00f756 f806 .dw XT_SPACES +00f757 f816 .dw XT_TYPE +00f758 f026 .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: +00f759 ff06 .dw $ff06 +00f75a 6475 +00f75b 6d2f +00f75c 646f .db "ud/mod" +00f75d f74a .dw VE_HEAD + .set VE_HEAD = VE_UDSLASHMOD + XT_UDSLASHMOD: +00f75e f001 .dw DO_COLON + PFA_UDSLASHMOD: + .endif +00f75f f111 .dw XT_TO_R +00f760 f166 .dw XT_ZERO +00f761 f11a .dw XT_R_FETCH +00f762 f1d4 .dw XT_UMSLASHMOD +00f763 f108 .dw XT_R_FROM +00f764 f0d6 .dw XT_SWAP +00f765 f111 .dw XT_TO_R +00f766 f1d4 .dw XT_UMSLASHMOD +00f767 f108 .dw XT_R_FROM +00f768 f026 .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: +00f769 ff06 .dw $ff06 +00f76a 6964 +00f76b 6967 +00f76c 3f74 .db "digit?" +00f76d f759 .dw VE_HEAD + .set VE_HEAD = VE_DIGITQ + XT_DIGITQ: +00f76e f001 .dw DO_COLON + PFA_DIGITQ: + .endif +00f76f f6a0 .dw XT_TOUPPER +00f770 f0c3 +00f771 f046 +00f772 0039 +00f773 f18a +00f774 f046 +00f775 0100 .DW XT_DUP,XT_DOLITERAL,57,XT_GREATER,XT_DOLITERAL,256 +00f776 f225 +00f777 f1af +00f778 f0c3 +00f779 f046 +00f77a 0140 +00f77b f18a .DW XT_AND,XT_PLUS,XT_DUP,XT_DOLITERAL,320,XT_GREATER +00f77c f046 +00f77d 0107 +00f77e f225 +00f77f f1a5 +00f780 f046 +00f781 0030 .DW XT_DOLITERAL,263,XT_AND,XT_MINUS,XT_DOLITERAL,48 +00f782 f1a5 +00f783 f0c3 +00f784 f56c +00f785 f08b +00f786 f16e .DW XT_MINUS,XT_DUP,XT_BASE,XT_FETCH,XT_ULESS +00f787 f026 .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: +00f788 f001 .dw DO_COLON + PFA_DOSLITERAL: +00f789 f11a .dw XT_R_FETCH ; ( -- addr ) +00f78a f7e7 .dw XT_ICOUNT +00f78b f108 .dw XT_R_FROM +00f78c f0e1 .dw XT_OVER ; ( -- addr' n addr n) +00f78d f241 .dw XT_1PLUS +00f78e f216 .dw XT_2SLASH ; ( -- addr' n addr k ) +00f78f f1af .dw XT_PLUS ; ( -- addr' n addr'' ) +00f790 f241 .dw XT_1PLUS +00f791 f111 .dw XT_TO_R ; ( -- ) +00f792 f026 .dw XT_EXIT + .include "words/scomma.asm" + + ; Compiler + ; compiles a string from RAM to Flash + VE_SCOMMA: +00f793 ff02 .dw $ff02 +00f794 2c73 .db "s",$2c +00f795 f769 .dw VE_HEAD + .set VE_HEAD = VE_SCOMMA + XT_SCOMMA: +00f796 f001 .dw DO_COLON + PFA_SCOMMA: +00f797 f0c3 .dw XT_DUP +00f798 f79a .dw XT_DOSCOMMA +00f799 f026 .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: +00f79a f001 .dw DO_COLON + PFA_DOSCOMMA: +00f79b 01db .dw XT_COMMA +00f79c f0c3 .dw XT_DUP ; ( --addr len len) +00f79d f216 .dw XT_2SLASH ; ( -- addr len len/2 +00f79e f591 .dw XT_TUCK ; ( -- addr len/2 len len/2 +00f79f f21d .dw XT_2STAR ; ( -- addr len/2 len len' +00f7a0 f1a5 .dw XT_MINUS ; ( -- addr len/2 rem +00f7a1 f111 .dw XT_TO_R +00f7a2 f166 .dw XT_ZERO +00f7a3 029a .dw XT_QDOCHECK +00f7a4 f03f .dw XT_DOCONDBRANCH +00f7a5 f7ad .dw PFA_SCOMMA2 +00f7a6 f2ad .dw XT_DODO + PFA_SCOMMA1: +00f7a7 f0c3 .dw XT_DUP ; ( -- addr addr ) +00f7a8 f08b .dw XT_FETCH ; ( -- addr c1c2 ) +00f7a9 01db .dw XT_COMMA ; ( -- addr ) +00f7aa f579 .dw XT_CELLPLUS ; ( -- addr+cell ) +00f7ab f2db .dw XT_DOLOOP +00f7ac f7a7 .dw PFA_SCOMMA1 + PFA_SCOMMA2: +00f7ad f108 .dw XT_R_FROM +00f7ae f13a .dw XT_GREATERZERO +00f7af f03f .dw XT_DOCONDBRANCH +00f7b0 f7b4 .dw PFA_SCOMMA3 +00f7b1 f0c3 .dw XT_DUP ; well, tricky +00f7b2 f0aa .dw XT_CFETCH +00f7b3 01db .dw XT_COMMA + PFA_SCOMMA3: +00f7b4 f0eb .dw XT_DROP ; ( -- ) +00f7b5 f026 .dw XT_EXIT + .include "words/itype.asm" + + ; Tools + ; reads string from flash and prints it + VE_ITYPE: +00f7b6 ff05 .dw $ff05 +00f7b7 7469 +00f7b8 7079 +00f7b9 0065 .db "itype",0 +00f7ba f793 .dw VE_HEAD + .set VE_HEAD = VE_ITYPE + XT_ITYPE: +00f7bb f001 .dw DO_COLON + PFA_ITYPE: +00f7bc f0c3 .dw XT_DUP ; ( --addr len len) +00f7bd f216 .dw XT_2SLASH ; ( -- addr len len/2 +00f7be f591 .dw XT_TUCK ; ( -- addr len/2 len len/2 +00f7bf f21d .dw XT_2STAR ; ( -- addr len/2 len len' +00f7c0 f1a5 .dw XT_MINUS ; ( -- addr len/2 rem +00f7c1 f111 .dw XT_TO_R +00f7c2 f166 .dw XT_ZERO +00f7c3 029a .dw XT_QDOCHECK +00f7c4 f03f .dw XT_DOCONDBRANCH +00f7c5 f7cf .dw PFA_ITYPE2 +00f7c6 f2ad .dw XT_DODO + PFA_ITYPE1: +00f7c7 f0c3 .dw XT_DUP ; ( -- addr addr ) +00f7c8 f3e3 .dw XT_FETCHI ; ( -- addr c1c2 ) +00f7c9 f0c3 .dw XT_DUP +00f7ca f7dc .dw XT_LOWEMIT +00f7cb f7d8 .dw XT_HIEMIT +00f7cc f241 .dw XT_1PLUS ; ( -- addr+cell ) +00f7cd f2db .dw XT_DOLOOP +00f7ce f7c7 .dw PFA_ITYPE1 + PFA_ITYPE2: +00f7cf f108 .dw XT_R_FROM +00f7d0 f13a .dw XT_GREATERZERO +00f7d1 f03f .dw XT_DOCONDBRANCH +00f7d2 f7d6 .dw PFA_ITYPE3 +00f7d3 f0c3 .dw XT_DUP ; make sure the drop below has always something to do +00f7d4 f3e3 .dw XT_FETCHI +00f7d5 f7dc .dw XT_LOWEMIT + PFA_ITYPE3: +00f7d6 f0eb .dw XT_DROP +00f7d7 f026 .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: +00f7d8 f001 .dw DO_COLON + PFA_HIEMIT: +00f7d9 f30b .dw XT_BYTESWAP +00f7da f7dc .dw XT_LOWEMIT +00f7db f026 .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: +00f7dc f001 .dw DO_COLON + PFA_LOWEMIT: +00f7dd f046 .dw XT_DOLITERAL +00f7de 00ff .dw $00ff +00f7df f225 .dw XT_AND +00f7e0 f5a9 .dw XT_EMIT +00f7e1 f026 .dw XT_EXIT + .include "words/icount.asm" + + ; Tools + ; get count information out of a counted string in flash + VE_ICOUNT: +00f7e2 ff06 .dw $ff06 +00f7e3 6369 +00f7e4 756f +00f7e5 746e .db "icount" +00f7e6 f7b6 .dw VE_HEAD + .set VE_HEAD = VE_ICOUNT + XT_ICOUNT: +00f7e7 f001 .dw DO_COLON + PFA_ICOUNT: +00f7e8 f0c3 .dw XT_DUP +00f7e9 f241 .dw XT_1PLUS +00f7ea f0d6 .dw XT_SWAP +00f7eb f3e3 .dw XT_FETCHI +00f7ec f026 .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: +00f7ed ff02 .dw 0xff02 +00f7ee 7263 .db "cr" +00f7ef f7e2 .dw VE_HEAD + .set VE_HEAD = VE_CR + XT_CR: +00f7f0 f001 .dw DO_COLON + PFA_CR: + .endif + +00f7f1 f046 .dw XT_DOLITERAL +00f7f2 000d .dw 13 +00f7f3 f5a9 .dw XT_EMIT +00f7f4 f046 .dw XT_DOLITERAL +00f7f5 000a .dw 10 +00f7f6 f5a9 .dw XT_EMIT +00f7f7 f026 .dw XT_EXIT + .include "words/space.asm" + + ; Character IO + ; emits a space (bl) + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_SPACE: +00f7f8 ff05 .dw $ff05 +00f7f9 7073 +00f7fa 6361 +00f7fb 0065 .db "space",0 +00f7fc f7ed .dw VE_HEAD + .set VE_HEAD = VE_SPACE + XT_SPACE: +00f7fd f001 .dw DO_COLON + PFA_SPACE: + .endif +00f7fe f60b .dw XT_BL +00f7ff f5a9 .dw XT_EMIT +00f800 f026 .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: +00f801 ff06 .dw $ff06 +00f802 7073 +00f803 6361 +00f804 7365 .db "spaces" +00f805 f7f8 .dw VE_HEAD + .set VE_HEAD = VE_SPACES + XT_SPACES: +00f806 f001 .dw DO_COLON + PFA_SPACES: + + .endif + ;C SPACES n -- output n spaces + ; BEGIN DUP 0> WHILE SPACE 1- REPEAT DROP ; +00f807 f166 +00f808 f685 .DW XT_ZERO, XT_MAX +00f809 f0c3 +00f80a f03f SPCS1: .DW XT_DUP,XT_DOCONDBRANCH +00f80b f810 DEST(SPCS2) +00f80c f7fd +00f80d f247 +00f80e f035 .DW XT_SPACE,XT_1MINUS,XT_DOBRANCH +00f80f f809 DEST(SPCS1) +00f810 f0eb +00f811 f026 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: +00f812 ff04 .dw $ff04 +00f813 7974 +00f814 6570 .db "type" +00f815 f801 .dw VE_HEAD + .set VE_HEAD = VE_TYPE + XT_TYPE: +00f816 f001 .dw DO_COLON + PFA_TYPE: + + .endif +00f817 fd79 .dw XT_BOUNDS +00f818 029a .dw XT_QDOCHECK +00f819 f03f .dw XT_DOCONDBRANCH +00f81a f821 DEST(PFA_TYPE2) +00f81b f2ad .dw XT_DODO + PFA_TYPE1: +00f81c f2be .dw XT_I +00f81d f0aa .dw XT_CFETCH +00f81e f5a9 .dw XT_EMIT +00f81f f2db .dw XT_DOLOOP +00f820 f81c DEST(PFA_TYPE1) + PFA_TYPE2: +00f821 f026 .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: +00f822 ff01 .dw $ff01 +00f823 0027 .db "'",0 +00f824 f812 .dw VE_HEAD + .set VE_HEAD = VE_TICK + XT_TICK: +00f825 f001 .dw DO_COLON + PFA_TICK: + .endif +00f826 f9cf .dw XT_PARSENAME +00f827 fae7 .dw XT_FORTHRECOGNIZER +00f828 faf2 .dw XT_RECOGNIZE + ; a word is tickable unless DT:TOKEN is DT:NULL or + ; the interpret action is a NOOP +00f829 f0c3 .dw XT_DUP +00f82a fb65 .dw XT_DT_NULL +00f82b fd9a .dw XT_EQUAL +00f82c f0d6 .dw XT_SWAP +00f82d f3e3 .dw XT_FETCHI +00f82e f046 .dw XT_DOLITERAL +00f82f fb9a .dw XT_NOOP +00f830 fd9a .dw XT_EQUAL +00f831 f22e .dw XT_OR +00f832 f03f .dw XT_DOCONDBRANCH +00f833 f837 DEST(PFA_TICK1) +00f834 f046 .dw XT_DOLITERAL +00f835 fff3 .dw -13 +00f836 f85c .dw XT_THROW + PFA_TICK1: +00f837 f0eb .dw XT_DROP +00f838 f026 .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: +00f839 ff07 .dw $ff07 +00f83a 6168 +00f83b 646e +00f83c 656c +00f83d 0072 .db "handler",0 +00f83e f822 .dw VE_HEAD + .set VE_HEAD = VE_HANDLER + XT_HANDLER: +00f83f f067 .dw PFA_DOUSER + PFA_HANDLER: + .endif +00f840 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: +00f841 ff05 .dw $ff05 +00f842 6163 +00f843 6374 +00f844 0068 .db "catch",0 +00f845 f839 .dw VE_HEAD + .set VE_HEAD = VE_CATCH + XT_CATCH: +00f846 f001 .dw DO_COLON + PFA_CATCH: + .endif + + ; sp@ >r +00f847 f29f .dw XT_SP_FETCH +00f848 f111 .dw XT_TO_R + ; handler @ >r +00f849 f83f .dw XT_HANDLER +00f84a f08b .dw XT_FETCH +00f84b f111 .dw XT_TO_R + ; rp@ handler ! +00f84c f288 .dw XT_RP_FETCH +00f84d f83f .dw XT_HANDLER +00f84e f093 .dw XT_STORE +00f84f f030 .dw XT_EXECUTE + ; r> handler ! +00f850 f108 .dw XT_R_FROM +00f851 f83f .dw XT_HANDLER +00f852 f093 .dw XT_STORE +00f853 f108 .dw XT_R_FROM +00f854 f0eb .dw XT_DROP +00f855 f166 .dw XT_ZERO +00f856 f026 .dw XT_EXIT + .include "words/throw.asm" + + ; Exceptions + ; throw an exception + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_THROW: +00f857 ff05 .dw $ff05 +00f858 6874 +00f859 6f72 +00f85a 0077 .db "throw",0 +00f85b f841 .dw VE_HEAD + .set VE_HEAD = VE_THROW + XT_THROW: +00f85c f001 .dw DO_COLON + PFA_THROW: + .endif +00f85d f0c3 .dw XT_DUP +00f85e f12c .dw XT_ZEROEQUAL +00f85f f03f .dw XT_DOCONDBRANCH +00f860 f863 DEST(PFA_THROW1) +00f861 f0eb .dw XT_DROP +00f862 f026 .dw XT_EXIT + PFA_THROW1: +00f863 f83f .dw XT_HANDLER +00f864 f08b .dw XT_FETCH +00f865 f292 .dw XT_RP_STORE +00f866 f108 .dw XT_R_FROM +00f867 f83f .dw XT_HANDLER +00f868 f093 .dw XT_STORE +00f869 f108 .dw XT_R_FROM +00f86a f0d6 .dw XT_SWAP +00f86b f111 .dw XT_TO_R +00f86c f2a8 .dw XT_SP_STORE +00f86d f0eb .dw XT_DROP +00f86e f108 .dw XT_R_FROM +00f86f f026 .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: +00f870 ff05 .dw $ff05 +00f871 7363 +00f872 696b +00f873 0070 .db "cskip",0 +00f874 f857 .dw VE_HEAD + .set VE_HEAD = VE_CSKIP + XT_CSKIP: +00f875 f001 .dw DO_COLON + PFA_CSKIP: + .endif +00f876 f111 .dw XT_TO_R ; ( -- addr1 n1 ) + PFA_CSKIP1: +00f877 f0c3 .dw XT_DUP ; ( -- addr' n' n' ) +00f878 f03f .dw XT_DOCONDBRANCH ; ( -- addr' n') +00f879 f884 DEST(PFA_CSKIP2) +00f87a f0e1 .dw XT_OVER ; ( -- addr' n' addr' ) +00f87b f0aa .dw XT_CFETCH ; ( -- addr' n' c' ) +00f87c f11a .dw XT_R_FETCH ; ( -- addr' n' c' c ) +00f87d fd9a .dw XT_EQUAL ; ( -- addr' n' f ) +00f87e f03f .dw XT_DOCONDBRANCH ; ( -- addr' n') +00f87f f884 DEST(PFA_CSKIP2) +00f880 fda1 .dw XT_ONE +00f881 f9c0 .dw XT_SLASHSTRING +00f882 f035 .dw XT_DOBRANCH +00f883 f877 DEST(PFA_CSKIP1) + PFA_CSKIP2: +00f884 f108 .dw XT_R_FROM +00f885 f0eb .dw XT_DROP ; ( -- addr2 n2) +00f886 f026 .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: +00f887 ff05 .dw $ff05 +00f888 7363 +00f889 6163 +../../common\words/cscan.asm(12): warning: .cseg .db misalignment - padding zero byte +00f88a 006e .db "cscan" +00f88b f870 .dw VE_HEAD + .set VE_HEAD = VE_CSCAN + XT_CSCAN: +00f88c f001 .dw DO_COLON + PFA_CSCAN: + .endif +00f88d f111 .dw XT_TO_R +00f88e f0e1 .dw XT_OVER + PFA_CSCAN1: +00f88f f0c3 .dw XT_DUP +00f890 f0aa .dw XT_CFETCH +00f891 f11a .dw XT_R_FETCH +00f892 fd9a .dw XT_EQUAL +00f893 f12c .dw XT_ZEROEQUAL +00f894 f03f .dw XT_DOCONDBRANCH +00f895 f8a1 DEST(PFA_CSCAN2) +00f896 f0d6 .dw XT_SWAP +00f897 f247 .dw XT_1MINUS +00f898 f0d6 .dw XT_SWAP +00f899 f0e1 .dw XT_OVER +00f89a f133 .dw XT_ZEROLESS ; not negative +00f89b f12c .dw XT_ZEROEQUAL +00f89c f03f .dw XT_DOCONDBRANCH +00f89d f8a1 DEST(PFA_CSCAN2) +00f89e f241 .dw XT_1PLUS +00f89f f035 .dw XT_DOBRANCH +00f8a0 f88f DEST(PFA_CSCAN1) + PFA_CSCAN2: +00f8a1 f102 .dw XT_NIP +00f8a2 f0e1 .dw XT_OVER +00f8a3 f1a5 .dw XT_MINUS +00f8a4 f108 .dw XT_R_FROM +00f8a5 f0eb .dw XT_DROP +00f8a6 f026 .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: +00f8a7 ff06 .dw $ff06 +00f8a8 6361 +00f8a9 6563 +00f8aa 7470 .db "accept" +00f8ab f887 .dw VE_HEAD + .set VE_HEAD = VE_ACCEPT + XT_ACCEPT: +00f8ac f001 .dw DO_COLON + PFA_ACCEPT: + + .endif +00f8ad f0e1 +00f8ae f1af +00f8af f247 +00f8b0 f0e1 .DW XT_OVER,XT_PLUS,XT_1MINUS,XT_OVER +00f8b1 f5ba +00f8b2 f0c3 +00f8b3 f8ed +00f8b4 f12c +00f8b5 f03f ACC1: .DW XT_KEY,XT_DUP,XT_CRLFQ,XT_ZEROEQUAL,XT_DOCONDBRANCH +00f8b6 f8df DEST(ACC5) +00f8b7 f0c3 +00f8b8 f046 +00f8b9 0008 +00f8ba fd9a +00f8bb f03f .DW XT_DUP,XT_DOLITERAL,8,XT_EQUAL,XT_DOCONDBRANCH +00f8bc f8cf DEST(ACC3) +00f8bd f0eb +00f8be f0f3 +00f8bf f580 +00f8c0 f18a +00f8c1 f111 +00f8c2 f0f3 +00f8c3 f0f3 +00f8c4 f108 +00f8c5 f03f .DW XT_DROP,XT_ROT,XT_2DUP,XT_GREATER,XT_TO_R,XT_ROT,XT_ROT,XT_R_FROM,XT_DOCONDBRANCH +00f8c6 f8cd DEST(ACC6) +00f8c7 f8e5 +00f8c8 f247 +00f8c9 f111 +00f8ca f0e1 +00f8cb f108 +00f8cc 016d .DW XT_BS,XT_1MINUS,XT_TO_R,XT_OVER,XT_R_FROM,XT_UMAX +00f8cd f035 ACC6: .DW XT_DOBRANCH +00f8ce f8dd DEST(ACC4) + + + ACC3: ; check for remaining control characters, replace them with blank +00f8cf f0c3 .dw XT_DUP ; ( -- addr k k ) +00f8d0 f60b .dw XT_BL +00f8d1 f180 .dw XT_LESS +00f8d2 f03f .dw XT_DOCONDBRANCH +00f8d3 f8d6 DEST(PFA_ACCEPT6) +00f8d4 f0eb .dw XT_DROP +00f8d5 f60b .dw XT_BL + PFA_ACCEPT6: +00f8d6 f0c3 +00f8d7 f5a9 +00f8d8 f0e1 +00f8d9 f09f +00f8da f241 +00f8db f0e1 +00f8dc 0179 .DW XT_DUP,XT_EMIT,XT_OVER,XT_CSTORE,XT_1PLUS,XT_OVER,XT_UMIN +00f8dd f035 ACC4: .DW XT_DOBRANCH +00f8de f8b1 DEST(ACC1) +00f8df f0eb +00f8e0 f102 +00f8e1 f0d6 +00f8e2 f1a5 +00f8e3 f7f0 +00f8e4 f026 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: +00f8e5 f001 .dw DO_COLON + .endif +00f8e6 f046 .dw XT_DOLITERAL +00f8e7 0008 .dw 8 +00f8e8 f0c3 .dw XT_DUP +00f8e9 f5a9 .dw XT_EMIT +00f8ea f7fd .dw XT_SPACE +00f8eb f5a9 .dw XT_EMIT +00f8ec f026 .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: +00f8ed f001 .dw DO_COLON + .endif +00f8ee f0c3 .dw XT_DUP +00f8ef f046 .dw XT_DOLITERAL +00f8f0 000d .dw 13 +00f8f1 fd9a .dw XT_EQUAL +00f8f2 f0d6 .dw XT_SWAP +00f8f3 f046 .dw XT_DOLITERAL +00f8f4 000a .dw 10 +00f8f5 fd9a .dw XT_EQUAL +00f8f6 f22e .dw XT_OR +00f8f7 f026 .dw XT_EXIT + .include "words/refill.asm" + + ; System + ; refills the input buffer + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_REFILL: +00f8f8 ff06 .dw $ff06 +00f8f9 6572 +00f8fa 6966 +00f8fb 6c6c .db "refill" +00f8fc f8a7 .dw VE_HEAD + .set VE_HEAD = VE_REFILL + XT_REFILL: +00f8fd fc2e .dw PFA_DODEFER1 + PFA_REFILL: + .endif +00f8fe 001a .dw USER_REFILL +00f8ff fbf7 .dw XT_UDEFERFETCH +00f900 fc03 .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: +00f901 ff04 .dw $ff04 +00f902 6863 +00f903 7261 .db "char" +00f904 f8f8 .dw VE_HEAD + .set VE_HEAD = VE_CHAR + XT_CHAR: +00f905 f001 .dw DO_COLON + PFA_CHAR: + .endif +00f906 f9cf .dw XT_PARSENAME +00f907 f0eb .dw XT_DROP +00f908 f0aa .dw XT_CFETCH +00f909 f026 .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: +00f90a ff06 .dw $ff06 +00f90b 756e +00f90c 626d +00f90d 7265 .db "number" +00f90e f901 .dw VE_HEAD + .set VE_HEAD = VE_NUMBER + XT_NUMBER: +00f90f f001 .dw DO_COLON + PFA_NUMBER: + .endif +00f910 f56c .dw XT_BASE +00f911 f08b .dw XT_FETCH +00f912 f111 .dw XT_TO_R +00f913 f953 .dw XT_QSIGN +00f914 f111 .dw XT_TO_R +00f915 f966 .dw XT_SET_BASE +00f916 f953 .dw XT_QSIGN +00f917 f108 .dw XT_R_FROM +00f918 f22e .dw XT_OR +00f919 f111 .dw XT_TO_R + ; check whether something is left +00f91a f0c3 .dw XT_DUP +00f91b f12c .dw XT_ZEROEQUAL +00f91c f03f .dw XT_DOCONDBRANCH +00f91d f926 DEST(PFA_NUMBER0) + ; nothing is left. It cannot be a number at all +00f91e f589 .dw XT_2DROP +00f91f f108 .dw XT_R_FROM +00f920 f0eb .dw XT_DROP +00f921 f108 .dw XT_R_FROM +00f922 f56c .dw XT_BASE +00f923 f093 .dw XT_STORE +00f924 f166 .dw XT_ZERO +00f925 f026 .dw XT_EXIT + PFA_NUMBER0: +00f926 f330 .dw XT_2TO_R +00f927 f166 .dw XT_ZERO ; starting value +00f928 f166 .dw XT_ZERO +00f929 f33f .dw XT_2R_FROM +00f92a f984 .dw XT_TO_NUMBER ; ( 0. addr len -- d addr' len' + ; check length of the remaining string. + ; if zero: a single cell number is entered +00f92b f0cb .dw XT_QDUP +00f92c f03f .dw XT_DOCONDBRANCH +00f92d f948 DEST(PFA_NUMBER1) + ; if equal 1: mayba a trailing dot? --> double cell number +00f92e fda1 .dw XT_ONE +00f92f fd9a .dw XT_EQUAL +00f930 f03f .dw XT_DOCONDBRANCH +00f931 f93f DEST(PFA_NUMBER2) + ; excatly one character is left +00f932 f0aa .dw XT_CFETCH +00f933 f046 .dw XT_DOLITERAL +00f934 002e .dw 46 ; . +00f935 fd9a .dw XT_EQUAL +00f936 f03f .dw XT_DOCONDBRANCH +00f937 f940 DEST(PFA_NUMBER6) + ; its a double cell number + ; incorporate sign into number +00f938 f108 .dw XT_R_FROM +00f939 f03f .dw XT_DOCONDBRANCH +00f93a f93c DEST(PFA_NUMBER3) +00f93b fcfc .dw XT_DNEGATE + PFA_NUMBER3: +00f93c fda6 .dw XT_TWO +00f93d f035 .dw XT_DOBRANCH +00f93e f94e DEST(PFA_NUMBER5) + PFA_NUMBER2: +00f93f f0eb .dw XT_DROP + PFA_NUMBER6: +00f940 f589 .dw XT_2DROP +00f941 f108 .dw XT_R_FROM +00f942 f0eb .dw XT_DROP +00f943 f108 .dw XT_R_FROM +00f944 f56c .dw XT_BASE +00f945 f093 .dw XT_STORE +00f946 f166 .dw XT_ZERO +00f947 f026 .dw XT_EXIT + PFA_NUMBER1: +00f948 f589 .dw XT_2DROP ; remove the address + ; incorporate sign into number +00f949 f108 .dw XT_R_FROM +00f94a f03f .dw XT_DOCONDBRANCH +00f94b f94d DEST(PFA_NUMBER4) +00f94c f65a .dw XT_NEGATE + PFA_NUMBER4: +00f94d fda1 .dw XT_ONE + PFA_NUMBER5: +00f94e f108 .dw XT_R_FROM +00f94f f56c .dw XT_BASE +00f950 f093 .dw XT_STORE +00f951 f15d .dw XT_TRUE +00f952 f026 .dw XT_EXIT + .include "words/q-sign.asm" + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + XT_QSIGN: +00f953 f001 .dw DO_COLON + PFA_QSIGN: ; ( c -- ) + .endif +00f954 f0e1 .dw XT_OVER ; ( -- addr len addr ) +00f955 f0aa .dw XT_CFETCH +00f956 f046 .dw XT_DOLITERAL +00f957 002d .dw '-' +00f958 fd9a .dw XT_EQUAL ; ( -- addr len flag ) +00f959 f0c3 .dw XT_DUP +00f95a f111 .dw XT_TO_R +00f95b f03f .dw XT_DOCONDBRANCH +00f95c f95f DEST(PFA_NUMBERSIGN_DONE) +00f95d fda1 .dw XT_ONE ; skip sign character +00f95e f9c0 .dw XT_SLASHSTRING + PFA_NUMBERSIGN_DONE: +00f95f f108 .dw XT_R_FROM +00f960 f026 .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: +00f961 f061 .dw PFA_DOCONSTANT + .endif +00f962 000a +00f963 0010 +00f964 0002 +00f965 000a .dw 10,16,2,10 ; last one could a 8 instead. + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + XT_SET_BASE: +00f966 f001 .dw DO_COLON + PFA_SET_BASE: ; ( adr1 len1 -- adr2 len2 ) + .endif +00f967 f0e1 .dw XT_OVER +00f968 f0aa .dw XT_CFETCH +00f969 f046 .dw XT_DOLITERAL +00f96a 0023 .dw 35 +00f96b f1a5 .dw XT_MINUS +00f96c f0c3 .dw XT_DUP +00f96d f166 .dw XT_ZERO +00f96e f046 .dw XT_DOLITERAL +00f96f 0004 .dw 4 +00f970 f692 .dw XT_WITHIN +00f971 f03f .dw XT_DOCONDBRANCH +00f972 f97c DEST(SET_BASE1) + .if cpu_msp430==1 + .endif +00f973 f961 .dw XT_BASES +00f974 f1af .dw XT_PLUS +00f975 f3e3 .dw XT_FETCHI +00f976 f56c .dw XT_BASE +00f977 f093 .dw XT_STORE +00f978 fda1 .dw XT_ONE +00f979 f9c0 .dw XT_SLASHSTRING +00f97a f035 .dw XT_DOBRANCH +00f97b f97d DEST(SET_BASE2) + SET_BASE1: +00f97c f0eb .dw XT_DROP + SET_BASE2: +00f97d f026 .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: +00f97e ff07 .dw $ff07 +00f97f 6e3e +00f980 6d75 +00f981 6562 +00f982 0072 .db ">number",0 +00f983 f90a .dw VE_HEAD + .set VE_HEAD = VE_TO_NUMBER + XT_TO_NUMBER: +00f984 f001 .dw DO_COLON + + .endif + +00f985 f0c3 +00f986 f03f TONUM1: .DW XT_DUP,XT_DOCONDBRANCH +00f987 f99c DEST(TONUM3) +00f988 f0e1 +00f989 f0aa +00f98a f76e .DW XT_OVER,XT_CFETCH,XT_DIGITQ +00f98b f12c +00f98c f03f .DW XT_ZEROEQUAL,XT_DOCONDBRANCH +00f98d f990 DEST(TONUM2) +00f98e f0eb +00f98f f026 .DW XT_DROP,XT_EXIT +00f990 f111 +00f991 fd20 +00f992 f56c +00f993 f08b +00f994 015e TONUM2: .DW XT_TO_R,XT_2SWAP,XT_BASE,XT_FETCH,XT_UDSTAR +00f995 f108 +00f996 0156 +00f997 fd20 .DW XT_R_FROM,XT_MPLUS,XT_2SWAP +00f998 fda1 +00f999 f9c0 +00f99a f035 .DW XT_ONE,XT_SLASHSTRING,XT_DOBRANCH +00f99b f985 DEST(TONUM1) +00f99c f026 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: +00f99d ff05 .dw $ff05 +00f99e 6170 +00f99f 7372 +00f9a0 0065 .db "parse",0 +00f9a1 f97e .dw VE_HEAD + .set VE_HEAD = VE_PARSE + XT_PARSE: +00f9a2 f001 .dw DO_COLON + PFA_PARSE: + .endif +00f9a3 f111 .dw XT_TO_R ; ( -- ) +00f9a4 f9b6 .dw XT_SOURCE ; ( -- addr len) +00f9a5 f599 .dw XT_TO_IN ; ( -- addr len >in) +00f9a6 f08b .dw XT_FETCH +00f9a7 f9c0 .dw XT_SLASHSTRING ; ( -- addr' len' ) + +00f9a8 f108 .dw XT_R_FROM ; ( -- addr' len' c) +00f9a9 f88c .dw XT_CSCAN ; ( -- addr' len'') +00f9aa f0c3 .dw XT_DUP ; ( -- addr' len'' len'') +00f9ab f241 .dw XT_1PLUS +00f9ac f599 .dw XT_TO_IN ; ( -- addr' len'' len'' >in) +00f9ad f277 .dw XT_PLUSSTORE ; ( -- addr' len') +00f9ae fda1 .dw XT_ONE +00f9af f9c0 .dw XT_SLASHSTRING +00f9b0 f026 .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: +00f9b1 ff06 .dw $FF06 +00f9b2 6f73 +00f9b3 7275 +00f9b4 6563 .db "source" +00f9b5 f99d .dw VE_HEAD + .set VE_HEAD = VE_SOURCE + XT_SOURCE: +00f9b6 fc2e .dw PFA_DODEFER1 + PFA_SOURCE: + .endif +00f9b7 0016 .dw USER_SOURCE +00f9b8 fbf7 .dw XT_UDEFERFETCH +00f9b9 fc03 .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: +00f9ba ff07 .dw $ff07 +00f9bb 732f +00f9bc 7274 +00f9bd 6e69 +00f9be 0067 .db "/string",0 +00f9bf f9b1 .dw VE_HEAD + .set VE_HEAD = VE_SLASHSTRING + XT_SLASHSTRING: +00f9c0 f001 .dw DO_COLON + PFA_SLASHSTRING: + .endif +00f9c1 f0f3 .dw XT_ROT +00f9c2 f0e1 .dw XT_OVER +00f9c3 f1af .dw XT_PLUS +00f9c4 f0f3 .dw XT_ROT +00f9c5 f0f3 .dw XT_ROT +00f9c6 f1a5 .dw XT_MINUS +00f9c7 f026 .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: +00f9c8 ff0a .dw $FF0A +00f9c9 6170 +00f9ca 7372 +00f9cb 2d65 +00f9cc 616e +00f9cd 656d .db "parse-name" +00f9ce f9ba .dw VE_HEAD + .set VE_HEAD = VE_PARSENAME + XT_PARSENAME: +00f9cf f001 .dw DO_COLON + PFA_PARSENAME: + .endif +00f9d0 f60b .dw XT_BL +00f9d1 f9d3 .dw XT_SKIPSCANCHAR +00f9d2 f026 .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: +00f9d3 f001 .dw DO_COLON + PFA_SKIPSCANCHAR: + .endif +00f9d4 f111 .dw XT_TO_R +00f9d5 f9b6 .dw XT_SOURCE +00f9d6 f599 .dw XT_TO_IN +00f9d7 f08b .dw XT_FETCH +00f9d8 f9c0 .dw XT_SLASHSTRING + +00f9d9 f11a .dw XT_R_FETCH +00f9da f875 .dw XT_CSKIP +00f9db f108 .dw XT_R_FROM +00f9dc f88c .dw XT_CSCAN + + ; adjust >IN +00f9dd f580 .dw XT_2DUP +00f9de f1af .dw XT_PLUS +00f9df f9b6 .dw XT_SOURCE +00f9e0 f0eb .dw XT_DROP +00f9e1 f1a5 .dw XT_MINUS +00f9e2 f599 .dw XT_TO_IN +00f9e3 f093 .dw XT_STORE +00f9e4 f026 .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: +00f9e5 ff07 .dw $ff07 +00f9e6 6966 +00f9e7 646e +00f9e8 782d +00f9e9 0074 .db "find-xt",0 +00f9ea f9c8 .dw VE_HEAD + .set VE_HEAD = VE_FINDXT + XT_FINDXT: +00f9eb f001 .dw DO_COLON + PFA_FINDXT: + .endif +00f9ec f046 .dw XT_DOLITERAL +00f9ed f9f7 .dw XT_FINDXTA +00f9ee f046 .dw XT_DOLITERAL +00f9ef 005c .dw CFG_ORDERLISTLEN +00f9f0 041b .dw XT_MAPSTACK +00f9f1 f12c .dw XT_ZEROEQUAL +00f9f2 f03f .dw XT_DOCONDBRANCH +00f9f3 f9f6 DEST(PFA_FINDXT1) +00f9f4 f589 .dw XT_2DROP +00f9f5 f166 .dw XT_ZERO + PFA_FINDXT1: +00f9f6 f026 .dw XT_EXIT + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + + XT_FINDXTA: +00f9f7 f001 .dw DO_COLON + PFA_FINDXTA: + .endif +00f9f8 f111 .dw XT_TO_R +00f9f9 f580 .dw XT_2DUP +00f9fa f108 .dw XT_R_FROM +00f9fb fc40 .dw XT_SEARCH_WORDLIST +00f9fc f0c3 .dw XT_DUP +00f9fd f03f .dw XT_DOCONDBRANCH +00f9fe fa04 DEST(PFA_FINDXTA1) +00f9ff f111 .dw XT_TO_R +00fa00 f102 .dw XT_NIP +00fa01 f102 .dw XT_NIP +00fa02 f108 .dw XT_R_FROM +00fa03 f15d .dw XT_TRUE + PFA_FINDXTA1: +00fa04 f026 .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: +00fa05 f001 .dw DO_COLON + PFA_DEFAULT_PROMPTOK: +00fa06 f788 .dw XT_DOSLITERAL +00fa07 0003 .dw 3 +00fa08 6f20 +00fa09 006b .db " ok",0 + .endif +00fa0a f7bb .dw XT_ITYPE +00fa0b f026 .dw XT_EXIT + + ; ------------------------ + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_PROMPTOK: +00fa0c ff03 .dw $FF03 +00fa0d 6f2e +../../common\words/prompt-ok.asm(43): warning: .cseg .db misalignment - padding zero byte +00fa0e 006b .db ".ok" +00fa0f f9e5 .dw VE_HEAD + .set VE_HEAD = VE_PROMPTOK + XT_PROMPTOK: +00fa10 fc2e .dw PFA_DODEFER1 + PFA_PROMPTOK: + .endif +00fa11 001c .dw USER_P_OK +00fa12 fbf7 .dw XT_UDEFERFETCH +00fa13 fc03 .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: +00fa14 f001 .dw DO_COLON + PFA_DEFAULT_PROMPTREADY: +00fa15 f788 .dw XT_DOSLITERAL +00fa16 0002 .dw 2 +00fa17 203e .db "> " + .endif +00fa18 f7f0 .dw XT_CR +00fa19 f7bb .dw XT_ITYPE +00fa1a f026 .dw XT_EXIT + + ; ------------------------ + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_PROMPTREADY: +00fa1b ff06 .dw $FF06 +00fa1c 722e +00fa1d 6165 +00fa1e 7964 .db ".ready" +00fa1f fa0c .dw VE_HEAD + .set VE_HEAD = VE_PROMPTREADY + XT_PROMPTREADY: +00fa20 fc2e .dw PFA_DODEFER1 + PFA_PROMPTREADY: + .endif +00fa21 0020 .dw USER_P_RDY +00fa22 fbf7 .dw XT_UDEFERFETCH +00fa23 fc03 .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: +00fa24 f001 .dw DO_COLON + PFA_DEFAULT_PROMPTERROR: +00fa25 f788 .dw XT_DOSLITERAL +00fa26 0004 .dw 4 +00fa27 3f20 +00fa28 203f .db " ?? " + .endif +00fa29 f7bb .dw XT_ITYPE +00fa2a f56c .dw XT_BASE +00fa2b f08b .dw XT_FETCH +00fa2c f111 .dw XT_TO_R +00fa2d f5f8 .dw XT_DECIMAL +00fa2e f73d .dw XT_DOT +00fa2f f599 .dw XT_TO_IN +00fa30 f08b .dw XT_FETCH +00fa31 f73d .dw XT_DOT +00fa32 f108 .dw XT_R_FROM +00fa33 f56c .dw XT_BASE +00fa34 f093 .dw XT_STORE +00fa35 f026 .dw XT_EXIT + + ; ------------------------ + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_PROMPTERROR: +00fa36 ff06 .dw $FF06 +00fa37 652e +00fa38 7272 +00fa39 726f .db ".error" +00fa3a fa1b .dw VE_HEAD + .set VE_HEAD = VE_PROMPTERROR + XT_PROMPTERROR: +00fa3b fc2e .dw PFA_DODEFER1 + PFA_PROMPTERROR: + .endif +00fa3c 001e .dw USER_P_ERR +00fa3d fbf7 .dw XT_UDEFERFETCH +00fa3e fc03 .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: +00fa3f ff04 .dw $ff04 +00fa40 7571 +00fa41 7469 .db "quit" +00fa42 fa36 .dw VE_HEAD + .set VE_HEAD = VE_QUIT + XT_QUIT: +00fa43 f001 .dw DO_COLON + .endif + PFA_QUIT: +00fa44 02d0 +00fa45 02d7 +00fa46 f093 .dw XT_LP0,XT_LP,XT_STORE +00fa47 faa4 .dw XT_SP0 +00fa48 f2a8 .dw XT_SP_STORE +00fa49 fab1 .dw XT_RP0 +00fa4a f292 .dw XT_RP_STORE +00fa4b 0365 .dw XT_LBRACKET + + PFA_QUIT2: +00fa4c f566 .dw XT_STATE +00fa4d f08b .dw XT_FETCH +00fa4e f12c .dw XT_ZEROEQUAL +00fa4f f03f .dw XT_DOCONDBRANCH +00fa50 fa52 DEST(PFA_QUIT4) +00fa51 fa20 .dw XT_PROMPTREADY + PFA_QUIT4: +00fa52 f8fd .dw XT_REFILL +00fa53 f03f .dw XT_DOCONDBRANCH +00fa54 fa64 DEST(PFA_QUIT3) +00fa55 f046 .dw XT_DOLITERAL +00fa56 faca .dw XT_INTERPRET +00fa57 f846 .dw XT_CATCH +00fa58 f0cb .dw XT_QDUP +00fa59 f03f .dw XT_DOCONDBRANCH +00fa5a fa64 DEST(PFA_QUIT3) +00fa5b f0c3 .dw XT_DUP +00fa5c f046 .dw XT_DOLITERAL +00fa5d fffe .dw -2 +00fa5e f180 .dw XT_LESS +00fa5f f03f .dw XT_DOCONDBRANCH +00fa60 fa62 DEST(PFA_QUIT5) +00fa61 fa3b .dw XT_PROMPTERROR + PFA_QUIT5: +00fa62 f035 .dw XT_DOBRANCH +00fa63 fa44 DEST(PFA_QUIT) + PFA_QUIT3: +00fa64 fa10 .dw XT_PROMPTOK +00fa65 f035 .dw XT_DOBRANCH +00fa66 fa4c 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: +00fa67 ff05 .dw $ff05 +00fa68 6170 +00fa69 7375 +00fa6a 0065 .db "pause",0 +00fa6b fa3f .dw VE_HEAD + .set VE_HEAD = VE_PAUSE + XT_PAUSE: +00fa6c fc2e .dw PFA_DODEFER1 + PFA_PAUSE: +00fa6d 0141 .dw ram_pause +00fa6e fbe3 .dw XT_RDEFERFETCH +00fa6f fbed .dw XT_RDEFERSTORE + + .dseg +000141 ram_pause: .byte 2 + .cseg + .include "words/cold.asm" + + ; System + ; start up amforth. + VE_COLD: +00fa70 ff04 .dw $ff04 +00fa71 6f63 +00fa72 646c .db "cold" +00fa73 fa67 .dw VE_HEAD + .set VE_HEAD = VE_COLD + XT_COLD: +00fa74 fa75 .dw PFA_COLD + PFA_COLD: +00fa75 b6a4 in_ mcu_boot, MCUSR +00fa76 2422 clr zerol +00fa77 2433 clr zeroh +00fa78 24bb clr isrflag +00fa79 be24 out_ MCUSR, zerol + ; clear RAM +00fa7a e0e0 ldi zl, low(ramstart) +00fa7b e0f1 ldi zh, high(ramstart) + clearloop: +00fa7c 9221 st Z+, zerol +00fa7d 30e0 cpi zl, low(sram_size+ramstart) +00fa7e f7e9 brne clearloop +00fa7f 34f1 cpi zh, high(sram_size+ramstart) +00fa80 f7d9 brne clearloop + ; init first user data area + ; allocate space for User Area + .dseg +000143 ram_user1: .byte SYSUSERSIZE + APPUSERSIZE + .cseg +00fa81 e4e3 ldi zl, low(ram_user1) +00fa82 e0f1 ldi zh, high(ram_user1) +00fa83 012f movw upl, zl + ; init return stack pointer +00fa84 ef0f ldi temp0,low(rstackstart) +00fa85 bf0d out_ SPL,temp0 +00fa86 8304 std Z+4, temp0 +00fa87 e410 ldi temp1,high(rstackstart) +00fa88 bf1e out_ SPH,temp1 +00fa89 8315 std Z+5, temp1 + + ; init parameter stack pointer +00fa8a eacf ldi yl,low(stackstart) +00fa8b 83c6 std Z+6, yl +00fa8c e4d0 ldi yh,high(stackstart) +00fa8d 83d7 std Z+7, yh + + ; load Forth IP with starting word +00fa8e e9a7 ldi XL, low(PFA_WARM) +00fa8f efba ldi XH, high(PFA_WARM) + ; its a far jump... +00fa90 940c f005 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: +00fa92 ff04 .dw $ff04 +00fa93 6177 +00fa94 6d72 .db "warm" +00fa95 fa70 .dw VE_HEAD + .set VE_HEAD = VE_WARM + XT_WARM: +00fa96 f001 .dw DO_COLON + PFA_WARM: + .endif +00fa97 fd6b .dw XT_INIT_RAM +00fa98 f046 .dw XT_DOLITERAL +00fa99 fb9a .dw XT_NOOP +00fa9a f046 .dw XT_DOLITERAL +00fa9b fa6c .dw XT_PAUSE +00fa9c fc0e .dw XT_DEFERSTORE +00fa9d 0365 .dw XT_LBRACKET +00fa9e f613 .dw XT_TURNKEY +00fa9f fa43 .dw XT_QUIT ; never returns + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + .include "words/sp0.asm" + + ; Stack + ; start address of the data stack + VE_SP0: +00faa0 ff03 .dw $ff03 +00faa1 7073 +00faa2 0030 .db "sp0",0 +00faa3 fa92 .dw VE_HEAD + .set VE_HEAD = VE_SP0 + XT_SP0: +00faa4 f081 .dw PFA_DOVALUE1 + PFA_SP0: +00faa5 0006 .dw USER_SP0 +00faa6 fbf7 .dw XT_UDEFERFETCH +00faa7 fc03 .dw XT_UDEFERSTORE + + ; ( -- addr) + ; Stack + ; address of user variable to store top-of-stack for inactive tasks + VE_SP: +00faa8 ff02 .dw $ff02 +00faa9 7073 .db "sp" +00faaa faa0 .dw VE_HEAD + .set VE_HEAD = VE_SP + XT_SP: +00faab f067 .dw PFA_DOUSER + PFA_SP: +00faac 0008 .dw USER_SP + .include "words/rp0.asm" + + ; Stack + ; start address of return stack + VE_RP0: +00faad ff03 .dw $ff03 +00faae 7072 +00faaf 0030 .db "rp0",0 +00fab0 faa8 .dw VE_HEAD + .set VE_HEAD = VE_RP0 + XT_RP0: +00fab1 f001 .dw DO_COLON + PFA_RP0: +00fab2 fab5 .dw XT_DORP0 +00fab3 f08b .dw XT_FETCH +00fab4 f026 .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: +00fab5 f067 .dw PFA_DOUSER + PFA_DORP0: +00fab6 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: +00fab7 ff05 .dw $ff05 +00fab8 6564 +00fab9 7470 +00faba 0068 .db "depth",0 +00fabb faad .dw VE_HEAD + .set VE_HEAD = VE_DEPTH + XT_DEPTH: +00fabc f001 .dw DO_COLON + PFA_DEPTH: + .endif +00fabd faa4 .dw XT_SP0 +00fabe f29f .dw XT_SP_FETCH +00fabf f1a5 .dw XT_MINUS +00fac0 f216 .dw XT_2SLASH +00fac1 f247 .dw XT_1MINUS +00fac2 f026 .dw XT_EXIT + .include "words/interpret.asm" + + ; System + ; Interpret SOURCE word by word. + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_INTERPRET: +00fac3 ff09 .dw $ff09 +00fac4 6e69 +00fac5 6574 +00fac6 7072 +00fac7 6572 +00fac8 0074 .db "interpret",0 +00fac9 fab7 .dw VE_HEAD + .set VE_HEAD = VE_INTERPRET + XT_INTERPRET: +00faca f001 .dw DO_COLON + .endif + PFA_INTERPRET: +00facb f9cf .dw XT_PARSENAME ; ( -- addr len ) +00facc f0c3 .dw XT_DUP ; ( -- addr len flag) +00facd f03f .dw XT_DOCONDBRANCH +00face fadb DEST(PFA_INTERPRET2) +00facf fae7 .dw XT_FORTHRECOGNIZER +00fad0 faf2 .dw XT_RECOGNIZE +00fad1 f566 .dw XT_STATE +00fad2 f08b .dw XT_FETCH +00fad3 f03f .dw XT_DOCONDBRANCH +00fad4 fad6 DEST(PFA_INTERPRET1) +00fad5 fbc6 .dw XT_ICELLPLUS ; we need the compile action + PFA_INTERPRET1: +00fad6 f3e3 .dw XT_FETCHI +00fad7 f030 .dw XT_EXECUTE +00fad8 fb72 .dw XT_QSTACK +00fad9 f035 .dw XT_DOBRANCH +00fada facb DEST(PFA_INTERPRET) + PFA_INTERPRET2: +00fadb f589 .dw XT_2DROP +00fadc f026 .dw XT_EXIT + .include "words/forth-recognizer.asm" + + ; System Value + ; address of the next free data space (RAM) cell + VE_FORTHRECOGNIZER: +00fadd ff10 .dw $ff10 +00fade 6f66 +00fadf 7472 +00fae0 2d68 +00fae1 6572 +00fae2 6f63 +00fae3 6e67 +00fae4 7a69 +00fae5 7265 .db "forth-recognizer" +00fae6 fac3 .dw VE_HEAD + .set VE_HEAD = VE_FORTHRECOGNIZER + XT_FORTHRECOGNIZER: +00fae7 f081 .dw PFA_DOVALUE1 + PFA_FORTHRECOGNIZER: +00fae8 0050 .dw CFG_FORTHRECOGNIZER +00fae9 fbcf .dw XT_EDEFERFETCH +00faea fbd9 .dw XT_EDEFERSTORE + .include "words/recognize.asm" + + ; System + ; walk the recognizer stack + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_RECOGNIZE: +00faeb ff09 .dw $ff09 +00faec 6572 +00faed 6f63 +00faee 6e67 +00faef 7a69 +00faf0 0065 .db "recognize",0 +00faf1 fadd .dw VE_HEAD + .set VE_HEAD = VE_RECOGNIZE + XT_RECOGNIZE: +00faf2 f001 .dw DO_COLON + PFA_RECOGNIZE: + .endif +00faf3 f046 .dw XT_DOLITERAL +00faf4 fafd .dw XT_RECOGNIZE_A +00faf5 f0d6 .dw XT_SWAP +00faf6 041b .dw XT_MAPSTACK +00faf7 f12c .dw XT_ZEROEQUAL +00faf8 f03f .dw XT_DOCONDBRANCH +00faf9 fafc DEST(PFA_RECOGNIZE1) +00fafa f589 .dw XT_2DROP +00fafb fb65 .dw XT_DT_NULL + PFA_RECOGNIZE1: +00fafc f026 .dw XT_EXIT + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + ; ( addr len XT -- addr len [ dt:xt -1 | 0 ] ) + XT_RECOGNIZE_A: +00fafd f001 .dw DO_COLON + PFA_RECOGNIZE_A: + .endif +00fafe f0f3 .dw XT_ROT ; -- len xt addr +00faff f0f3 .dw XT_ROT ; -- xt addr len +00fb00 f580 .dw XT_2DUP +00fb01 f330 .dw XT_2TO_R +00fb02 f0f3 .dw XT_ROT ; -- addr len xt +00fb03 f030 .dw XT_EXECUTE ; -- i*x dt:* | dt:null +00fb04 f33f .dw XT_2R_FROM +00fb05 f0f3 .dw XT_ROT +00fb06 f0c3 .dw XT_DUP +00fb07 fb65 .dw XT_DT_NULL +00fb08 fd9a .dw XT_EQUAL +00fb09 f03f .dw XT_DOCONDBRANCH +00fb0a fb0e DEST(PFA_RECOGNIZE_A1) +00fb0b f0eb .dw XT_DROP +00fb0c f166 .dw XT_ZERO +00fb0d f026 .dw XT_EXIT + PFA_RECOGNIZE_A1: +00fb0e f102 .dw XT_NIP +00fb0f f102 .dw XT_NIP +00fb10 f15d .dw XT_TRUE +00fb11 f026 .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: +00fb12 ff06 .dw $ff06 +00fb13 7464 +00fb14 6e3a +00fb15 6d75 .db "dt:num" +00fb16 faeb .dw VE_HEAD + .set VE_HEAD = VE_DT_NUM + XT_DT_NUM: +00fb17 f061 .dw PFA_DOCONSTANT + PFA_DT_NUM: + .endif +00fb18 fb9a .dw XT_NOOP ; interpret +00fb19 01f1 .dw XT_LITERAL ; compile +00fb1a 01f1 .dw XT_LITERAL ; postpone + + ; ( -- addr ) + ; Interpreter + ; Method table for double cell integers + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_DT_DNUM: +00fb1b ff07 .dw $ff07 +00fb1c 7464 +00fb1d 643a +00fb1e 756e +00fb1f 006d .db "dt:dnum",0 +00fb20 fb12 .dw VE_HEAD + .set VE_HEAD = VE_DT_DNUM + XT_DT_DNUM: +00fb21 f061 .dw PFA_DOCONSTANT + PFA_DT_DNUM: + .endif +00fb22 fb9a .dw XT_NOOP ; interpret +00fb23 fd92 .dw XT_2LITERAL ; compile +00fb24 fd92 .dw XT_2LITERAL ; postpone + + ; ( addr len -- f ) + ; Interpreter + ; recognizer for integer numbers + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + + VE_REC_NUM: +00fb25 ff07 .dw $ff07 +00fb26 6572 +00fb27 3a63 +00fb28 756e +00fb29 006d .db "rec:num",0 +00fb2a fb1b .dw VE_HEAD + .set VE_HEAD = VE_REC_NUM + XT_REC_NUM: +00fb2b f001 .dw DO_COLON + PFA_REC_NUM: + .endif + ; try converting to a number +00fb2c f90f .dw XT_NUMBER +00fb2d f03f .dw XT_DOCONDBRANCH +00fb2e fb37 DEST(PFA_REC_NONUMBER) +00fb2f fda1 .dw XT_ONE +00fb30 fd9a .dw XT_EQUAL +00fb31 f03f .dw XT_DOCONDBRANCH +00fb32 fb35 DEST(PFA_REC_INTNUM2) +00fb33 fb17 .dw XT_DT_NUM +00fb34 f026 .dw XT_EXIT + PFA_REC_INTNUM2: +00fb35 fb21 .dw XT_DT_DNUM +00fb36 f026 .dw XT_EXIT + PFA_REC_NONUMBER: +00fb37 fb65 .dw XT_DT_NULL +00fb38 f026 .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: +00fb39 ff08 .dw $ff08 +00fb3a 6572 +00fb3b 3a63 +00fb3c 6966 +00fb3d 646e .db "rec:find" +00fb3e fb25 .dw VE_HEAD + .set VE_HEAD = VE_REC_FIND + XT_REC_FIND: +00fb3f f001 .dw DO_COLON + PFA_REC_FIND: + .endif +00fb40 f9eb .DW XT_FINDXT +00fb41 f0c3 .dw XT_DUP +00fb42 f12c .dw XT_ZEROEQUAL +00fb43 f03f .dw XT_DOCONDBRANCH +00fb44 fb48 DEST(PFA_REC_WORD_FOUND) +00fb45 f0eb .dw XT_DROP +00fb46 fb65 .dw XT_DT_NULL +00fb47 f026 .dw XT_EXIT + PFA_REC_WORD_FOUND: +00fb48 fb4f .dw XT_DT_XT + +00fb49 f026 .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: +00fb4a ff05 .dw $ff05 +00fb4b 7464 +00fb4c 783a +00fb4d 0074 .db "dt:xt",0 +00fb4e fb39 .dw VE_HEAD + .set VE_HEAD = VE_DT_XT + XT_DT_XT: +00fb4f f061 .dw PFA_DOCONSTANT + PFA_DT_XT: + .endif +00fb50 fb53 .dw XT_R_WORD_INTERPRET +00fb51 fb57 .dw XT_R_WORD_COMPILE +00fb52 fd92 .dw XT_2LITERAL + + ; ( XT flags -- ) + ; Interpreter + ; interpret method for WORD recognizer + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + XT_R_WORD_INTERPRET: +00fb53 f001 .dw DO_COLON + PFA_R_WORD_INTERPRET: + .endif +00fb54 f0eb .dw XT_DROP ; the flags are in the way +00fb55 f030 .dw XT_EXECUTE +00fb56 f026 .dw XT_EXIT + + ; ( XT flags -- ) + ; Interpreter + ; Compile method for WORD recognizer + .if cpu_msp430==1 + .endif + .if cpu_avr8==1 + XT_R_WORD_COMPILE: +00fb57 f001 .dw DO_COLON + PFA_R_WORD_COMPILE: + .endif +00fb58 f133 .dw XT_ZEROLESS +00fb59 f03f .dw XT_DOCONDBRANCH +00fb5a fb5d DEST(PFA_R_WORD_COMPILE1) +00fb5b 01db .dw XT_COMMA +00fb5c f026 .dw XT_EXIT + PFA_R_WORD_COMPILE1: +00fb5d f030 .dw XT_EXECUTE +00fb5e f026 .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: +00fb5f ff07 .dw $ff07 +00fb60 7464 +00fb61 6e3a +00fb62 6c75 +../../common\words/dt-null.asm(12): warning: .cseg .db misalignment - padding zero byte +00fb63 006c .db "dt:null" +00fb64 fb4a .dw VE_HEAD + .set VE_HEAD = VE_DT_NULL + XT_DT_NULL: +00fb65 f061 .dw PFA_DOCONSTANT + PFA_DT_NULL: + .endif +00fb66 fb69 .dw XT_FAIL ; interpret +00fb67 fb69 .dw XT_FAIL ; compile +00fb68 fb69 .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: +00fb69 f001 .dw DO_COLON + PFA_FAIL: + .endif +00fb6a f046 .dw XT_DOLITERAL +00fb6b fff3 .dw -13 +00fb6c f85c .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: +00fb6d ff06 .dw $ff06 +00fb6e 733f +00fb6f 6174 +00fb70 6b63 .db "?stack" +00fb71 fb5f .dw VE_HEAD + .set VE_HEAD = VE_QSTACK + XT_QSTACK: +00fb72 f001 .dw DO_COLON + PFA_QSTACK: + .endif +00fb73 fabc .dw XT_DEPTH +00fb74 f133 .dw XT_ZEROLESS +00fb75 f03f .dw XT_DOCONDBRANCH +00fb76 fb7a DEST(PFA_QSTACK1) +00fb77 f046 .dw XT_DOLITERAL +00fb78 fffc .dw -4 +00fb79 f85c .dw XT_THROW + PFA_QSTACK1: +00fb7a f026 .dw XT_EXIT + .include "words/ver.asm" + + ; Tools + ; print the version string + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_DOT_VER: +00fb7b ff03 .dw $ff03 +00fb7c 6576 +../../common\words/ver.asm(12): warning: .cseg .db misalignment - padding zero byte +00fb7d 0072 .db "ver" +00fb7e fb6d .dw VE_HEAD + .set VE_HEAD = VE_DOT_VER + XT_DOT_VER: +00fb7f f001 .dw DO_COLON + PFA_DOT_VER: + .endif +00fb80 f528 .dw XT_ENV_FORTHNAME +00fb81 f7bb .dw XT_ITYPE +00fb82 f7fd .dw XT_SPACE +00fb83 f56c .dw XT_BASE +00fb84 f08b .dw XT_FETCH + +00fb85 f536 .dw XT_ENV_FORTHVERSION +00fb86 f5f8 .dw XT_DECIMAL +00fb87 fd82 .dw XT_S2D +00fb88 f6d9 .dw XT_L_SHARP +00fb89 f6e1 .dw XT_SHARP +00fb8a f046 .dw XT_DOLITERAL +00fb8b 002e .dw '.' +00fb8c f6ca .dw XT_HOLD +00fb8d f6f7 .dw XT_SHARP_S +00fb8e f702 .dw XT_SHARP_G +00fb8f f816 .dw XT_TYPE +00fb90 f56c .dw XT_BASE +00fb91 f093 .dw XT_STORE +00fb92 f7fd .dw XT_SPACE +00fb93 f53e .dw XT_ENV_CPU +00fb94 f7bb .dw XT_ITYPE + +00fb95 f026 .dw XT_EXIT + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + .include "words/noop.asm" + + ; Tools + ; do nothing + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_NOOP: +00fb96 ff04 .dw $ff04 +00fb97 6f6e +00fb98 706f .db "noop" +00fb99 fb7b .dw VE_HEAD + .set VE_HEAD = VE_NOOP + XT_NOOP: +00fb9a f001 .dw DO_COLON + PFA_NOOP: + .endif +00fb9b f026 .DW XT_EXIT + .include "words/unused.asm" + + ; Tools + ; Amount of available RAM (incl. PAD) + VE_UNUSED: +00fb9c ff06 .dw $ff06 +00fb9d 6e75 +00fb9e 7375 +00fb9f 6465 .db "unused" +00fba0 fb96 .dw VE_HEAD + .set VE_HEAD = VE_UNUSED + XT_UNUSED: +00fba1 f001 .dw DO_COLON + PFA_UNUSED: +00fba2 f29f .dw XT_SP_FETCH +00fba3 f5da .dw XT_HERE +00fba4 f1a5 .dw XT_MINUS +00fba5 f026 .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: +00fba6 0002 .dw $0002 +00fba7 6f74 .db "to" +00fba8 fb9c .dw VE_HEAD + .set VE_HEAD = VE_TO + XT_TO: +00fba9 f001 .dw DO_COLON + PFA_TO: + .endif +00fbaa f825 .dw XT_TICK +00fbab fd8b .dw XT_TO_BODY +00fbac f566 .dw XT_STATE +00fbad f08b .dw XT_FETCH +00fbae f03f .dw XT_DOCONDBRANCH +00fbaf fbba DEST(PFA_TO1) +00fbb0 01d0 .dw XT_COMPILE +00fbb1 fbb4 .dw XT_DOTO +00fbb2 01db .dw XT_COMMA +00fbb3 f026 .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: +00fbb4 f001 .dw DO_COLON + PFA_DOTO: + .endif +00fbb5 f108 .dw XT_R_FROM +00fbb6 f0c3 .dw XT_DUP +00fbb7 fbc6 .dw XT_ICELLPLUS +00fbb8 f111 .dw XT_TO_R +00fbb9 f3e3 .dw XT_FETCHI + PFA_TO1: +00fbba f0c3 .dw XT_DUP +00fbbb fbc6 .dw XT_ICELLPLUS +00fbbc fbc6 .dw XT_ICELLPLUS +00fbbd f3e3 .dw XT_FETCHI +00fbbe f030 .dw XT_EXECUTE +00fbbf f026 .dw XT_EXIT + .include "words/i-cellplus.asm" + + ; Compiler + ; skip to the next cell in flash + VE_ICELLPLUS: +00fbc0 ff07 .dw $FF07 +00fbc1 2d69 +00fbc2 6563 +00fbc3 6c6c +00fbc4 002b .db "i-cell+",0 +00fbc5 fba6 .dw VE_HEAD + .set VE_HEAD = VE_ICELLPLUS + XT_ICELLPLUS: +00fbc6 f001 .dw DO_COLON + PFA_ICELLPLUS: +00fbc7 f241 .dw XT_1PLUS +00fbc8 f026 .dw XT_EXIT + + .include "words/edefer-fetch.asm" + + ; System + ; does the real defer@ for eeprom defers + VE_EDEFERFETCH: +00fbc9 ff07 .dw $ff07 +00fbca 6445 +00fbcb 6665 +00fbcc 7265 +00fbcd 0040 .db "Edefer@",0 +00fbce fbc0 .dw VE_HEAD + .set VE_HEAD = VE_EDEFERFETCH + XT_EDEFERFETCH: +00fbcf f001 .dw DO_COLON + PFA_EDEFERFETCH: +00fbd0 f3e3 .dw XT_FETCHI +00fbd1 f371 .dw XT_FETCHE +00fbd2 f026 .dw XT_EXIT + .include "words/edefer-store.asm" + + ; System + ; does the real defer! for eeprom defers + VE_EDEFERSTORE: +00fbd3 ff07 .dw $ff07 +00fbd4 6445 +00fbd5 6665 +00fbd6 7265 +00fbd7 0021 .db "Edefer!",0 +00fbd8 fbc9 .dw VE_HEAD + .set VE_HEAD = VE_EDEFERSTORE + XT_EDEFERSTORE: +00fbd9 f001 .dw DO_COLON + PFA_EDEFERSTORE: +00fbda f3e3 .dw XT_FETCHI +00fbdb f34d .dw XT_STOREE +00fbdc f026 .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: +00fbdd ff07 .dw $ff07 +00fbde 6452 +00fbdf 6665 +00fbe0 7265 +00fbe1 0040 .db "Rdefer@",0 +00fbe2 fbd3 .dw VE_HEAD + .set VE_HEAD = VE_RDEFERFETCH + XT_RDEFERFETCH: +00fbe3 f001 .dw DO_COLON + PFA_RDEFERFETCH: + .endif +00fbe4 f3e3 .dw XT_FETCHI +00fbe5 f08b .dw XT_FETCH +00fbe6 f026 .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: +00fbe7 ff07 .dw $ff07 +00fbe8 6452 +00fbe9 6665 +00fbea 7265 +00fbeb 0021 .db "Rdefer!",0 +00fbec fbdd .dw VE_HEAD + .set VE_HEAD = VE_RDEFERSTORE + XT_RDEFERSTORE: +00fbed f001 .dw DO_COLON + PFA_RDEFERSTORE: + .endif +00fbee f3e3 .dw XT_FETCHI +00fbef f093 .dw XT_STORE +00fbf0 f026 .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: +00fbf1 ff07 .dw $ff07 +00fbf2 6455 +00fbf3 6665 +00fbf4 7265 +00fbf5 0040 .db "Udefer@",0 +00fbf6 fbe7 .dw VE_HEAD + .set VE_HEAD = VE_UDEFERFETCH + XT_UDEFERFETCH: +00fbf7 f001 .dw DO_COLON + PFA_UDEFERFETCH: + .endif +00fbf8 f3e3 .dw XT_FETCHI +00fbf9 f314 .dw XT_UP_FETCH +00fbfa f1af .dw XT_PLUS +00fbfb f08b .dw XT_FETCH +00fbfc f026 .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: +00fbfd ff07 .dw $ff07 +00fbfe 6455 +00fbff 6665 +00fc00 7265 +00fc01 0021 .db "Udefer!",0 +00fc02 fbf1 .dw VE_HEAD + .set VE_HEAD = VE_UDEFERSTORE + XT_UDEFERSTORE: +00fc03 f001 .dw DO_COLON + PFA_UDEFERSTORE: + .endif + +00fc04 f3e3 .dw XT_FETCHI +00fc05 f314 .dw XT_UP_FETCH +00fc06 f1af .dw XT_PLUS +00fc07 f093 .dw XT_STORE +00fc08 f026 .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: +00fc09 ff06 .dw $ff06 +00fc0a 6564 +00fc0b 6566 +00fc0c 2172 .db "defer!" +00fc0d fbfd .dw VE_HEAD + .set VE_HEAD = VE_DEFERSTORE + XT_DEFERSTORE: +00fc0e f001 .dw DO_COLON + PFA_DEFERSTORE: + .endif +00fc0f fd8b .dw XT_TO_BODY +00fc10 f0c3 .dw XT_DUP +00fc11 fbc6 .dw XT_ICELLPLUS +00fc12 fbc6 .dw XT_ICELLPLUS +00fc13 f3e3 .dw XT_FETCHI +00fc14 f030 .dw XT_EXECUTE +00fc15 f026 .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: +00fc16 ff06 .dw $ff06 +00fc17 6564 +00fc18 6566 +00fc19 4072 .db "defer@" +00fc1a fc09 .dw VE_HEAD + .set VE_HEAD = VE_DEFERFETCH + XT_DEFERFETCH: +00fc1b f001 .dw DO_COLON + PFA_DEFERFETCH: + .endif +00fc1c fd8b .dw XT_TO_BODY +00fc1d f0c3 .dw XT_DUP +00fc1e fbc6 .dw XT_ICELLPLUS +00fc1f f3e3 .dw XT_FETCHI +00fc20 f030 .dw XT_EXECUTE +00fc21 f026 .dw XT_EXIT + .include "words/do-defer.asm" + + ; System + ; runtime of defer + VE_DODEFER: +00fc22 ff07 .dw $ff07 +00fc23 6428 +00fc24 6665 +00fc25 7265 +00fc26 0029 .db "(defer)", 0 +00fc27 fc16 .dw VE_HEAD + .set VE_HEAD = VE_DODEFER + XT_DODEFER: +00fc28 f001 .dw DO_COLON + PFA_DODEFER: +00fc29 01ad .dw XT_DOCREATE +00fc2a 030d .dw XT_REVEAL +00fc2b 01d0 .dw XT_COMPILE +00fc2c fc2e .dw PFA_DODEFER1 +00fc2d f026 .dw XT_EXIT + PFA_DODEFER1: +00fc2e 940e 0326 call_ DO_DODOES +00fc30 f0c3 .dw XT_DUP +00fc31 fbc6 .dw XT_ICELLPLUS +00fc32 f3e3 .dw XT_FETCHI +00fc33 f030 .dw XT_EXECUTE +00fc34 f030 .dw XT_EXECUTE +00fc35 f026 .dw XT_EXIT + + ; : (defer) dup i-cell+ @i execute execute ; + + + .include "words/search-wordlist.asm" + + ; Search Order + ; searches the word list wid for the word at c-addr/len + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_SEARCH_WORDLIST: +00fc36 ff0f .dw $ff0f +00fc37 6573 +00fc38 7261 +00fc39 6863 +00fc3a 772d +00fc3b 726f +00fc3c 6c64 +00fc3d 7369 +00fc3e 0074 .db "search-wordlist",0 +00fc3f fc22 .dw VE_HEAD + .set VE_HEAD = VE_SEARCH_WORDLIST + XT_SEARCH_WORDLIST: +00fc40 f001 .dw DO_COLON + PFA_SEARCH_WORDLIST: + .endif +00fc41 f111 .dw XT_TO_R +00fc42 f166 .dw XT_ZERO +00fc43 f046 .dw XT_DOLITERAL +00fc44 fc55 .dw XT_ISWORD +00fc45 f108 .dw XT_R_FROM +00fc46 fc72 .dw XT_TRAVERSEWORDLIST +00fc47 f0c3 .dw XT_DUP +00fc48 f12c .dw XT_ZEROEQUAL +00fc49 f03f .dw XT_DOCONDBRANCH +00fc4a fc4f DEST(PFA_SEARCH_WORDLIST1) +00fc4b f589 .dw XT_2DROP +00fc4c f0eb .dw XT_DROP +00fc4d f166 .dw XT_ZERO +00fc4e f026 .dw XT_EXIT + PFA_SEARCH_WORDLIST1: + ; ... get the XT ... +00fc4f f0c3 .dw XT_DUP +00fc50 fc99 .dw XT_NFA2CFA + ; .. and get the header flag +00fc51 f0d6 .dw XT_SWAP +00fc52 0193 .dw XT_NAME2FLAGS +00fc53 0181 .dw XT_IMMEDIATEQ +00fc54 f026 .dw XT_EXIT + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + XT_ISWORD: +00fc55 f001 .dw DO_COLON + PFA_ISWORD: + .endif + ; ( c-addr len 0 nt -- c-addr len 0 true| nt false ) +00fc56 f111 .dw XT_TO_R +00fc57 f0eb .dw XT_DROP +00fc58 f580 .dw XT_2DUP +00fc59 f11a .dw XT_R_FETCH ; -- addr len addr len nt +00fc5a fc8d .dw XT_NAME2STRING +00fc5b fca3 .dw XT_ICOMPARE ; (-- addr len f ) +00fc5c f03f .dw XT_DOCONDBRANCH +00fc5d fc63 DEST(PFA_ISWORD3) + ; not now +00fc5e f108 .dw XT_R_FROM +00fc5f f0eb .dw XT_DROP +00fc60 f166 .dw XT_ZERO +00fc61 f15d .dw XT_TRUE ; maybe next word +00fc62 f026 .dw XT_EXIT + PFA_ISWORD3: + ; we found the word, now clean up iteration data ... +00fc63 f589 .dw XT_2DROP +00fc64 f108 .dw XT_R_FROM +00fc65 f166 .dw XT_ZERO ; finish traverse-wordlist +00fc66 f026 .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: +00fc67 ff11 .dw $ff11 +00fc68 7274 +00fc69 7661 +00fc6a 7265 +00fc6b 6573 +00fc6c 772d +00fc6d 726f +00fc6e 6c64 +00fc6f 7369 +00fc70 0074 .db "traverse-wordlist",0 +00fc71 fc36 .dw VE_HEAD + .set VE_HEAD = VE_TRAVERSEWORDLIST + XT_TRAVERSEWORDLIST: +00fc72 f001 .dw DO_COLON + PFA_TRAVERSEWORDLIST: + + .endif +00fc73 f371 .dw XT_FETCHE + PFA_TRAVERSEWORDLIST1: +00fc74 f0c3 .dw XT_DUP ; ( -- xt nt nt ) +00fc75 f03f .dw XT_DOCONDBRANCH ; ( -- nt ) is nfa = counted string +00fc76 fc83 DEST(PFA_TRAVERSEWORDLIST2) +00fc77 f580 .dw XT_2DUP +00fc78 f330 .dw XT_2TO_R +00fc79 f0d6 .dw XT_SWAP +00fc7a f030 .dw XT_EXECUTE +00fc7b f33f .dw XT_2R_FROM +00fc7c f0f3 .dw XT_ROT +00fc7d f03f .dw XT_DOCONDBRANCH +00fc7e fc83 DEST(PFA_TRAVERSEWORDLIST2) +00fc7f 048a .dw XT_NFA2LFA +00fc80 f3e3 .dw XT_FETCHI +00fc81 f035 .dw XT_DOBRANCH ; ( -- addr ) +00fc82 fc74 DEST(PFA_TRAVERSEWORDLIST1) ; ( -- addr ) + PFA_TRAVERSEWORDLIST2: +00fc83 f589 .dw XT_2DROP +00fc84 f026 .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: +00fc85 ff0b .dw $ff0b +00fc86 616e +00fc87 656d +00fc88 733e +00fc89 7274 +00fc8a 6e69 +00fc8b 0067 .db "name>string",0 +00fc8c fc67 .dw VE_HEAD + .set VE_HEAD = VE_NAME2STRING + XT_NAME2STRING: +00fc8d f001 .dw DO_COLON + PFA_NAME2STRING: + + .endif +00fc8e f7e7 .dw XT_ICOUNT ; ( -- addr n ) +00fc8f f046 .dw XT_DOLITERAL +00fc90 00ff .dw 255 +00fc91 f225 .dw XT_AND ; mask immediate bit +00fc92 f026 .dw XT_EXIT + .include "words/nfa2cfa.asm" + + ; Tools + ; get the XT from a name token + VE_NFA2CFA: +00fc93 ff07 .dw $ff07 +00fc94 666e +00fc95 3e61 +00fc96 6663 +../../avr8\words/nfa2cfa.asm(6): warning: .cseg .db misalignment - padding zero byte +00fc97 0061 .db "nfa>cfa" +00fc98 fc85 .dw VE_HEAD + .set VE_HEAD = VE_NFA2CFA + XT_NFA2CFA: +00fc99 f001 .dw DO_COLON + PFA_NFA2CFA: +00fc9a 048a .dw XT_NFA2LFA ; skip to link field +00fc9b f241 .dw XT_1PLUS ; next is the execution token +00fc9c f026 .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: +00fc9d ff08 .dw $ff08 +00fc9e 6369 +00fc9f 6d6f +00fca0 6170 +00fca1 6572 .db "icompare" +00fca2 fc93 .dw VE_HEAD + .set VE_HEAD = VE_ICOMPARE + XT_ICOMPARE: +00fca3 f001 .dw DO_COLON + PFA_ICOMPARE: +00fca4 f111 .dw XT_TO_R ; ( -- r-addr r-len f-addr) +00fca5 f0e1 .dw XT_OVER ; ( -- r-addr r-len f-addr r-len) +00fca6 f108 .dw XT_R_FROM ; ( -- r-addr r-len f-addr r-len f-len ) +00fca7 f125 .dw XT_NOTEQUAL ; ( -- r-addr r-len f-addr flag ) +00fca8 f03f .dw XT_DOCONDBRANCH +00fca9 fcae .dw PFA_ICOMPARE_SAMELEN +00fcaa f589 .dw XT_2DROP +00fcab f0eb .dw XT_DROP +00fcac f15d .dw XT_TRUE +00fcad f026 .dw XT_EXIT + PFA_ICOMPARE_SAMELEN: +00fcae f0d6 .dw XT_SWAP ; ( -- r-addr f-addr len ) +00fcaf f166 .dw XT_ZERO +00fcb0 029a .dw XT_QDOCHECK +00fcb1 f03f .dw XT_DOCONDBRANCH +00fcb2 fcd1 .dw PFA_ICOMPARE_DONE +00fcb3 f2ad .dw XT_DODO + PFA_ICOMPARE_LOOP: + ; ( r-addr f-addr --) +00fcb4 f0e1 .dw XT_OVER +00fcb5 f08b .dw XT_FETCH + .if WANT_IGNORECASE == 1 + .endif +00fcb6 f0e1 .dw XT_OVER +00fcb7 f3e3 .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 +00fcb8 f0c3 .dw XT_DUP + ;.dw XT_BYTESWAP +00fcb9 f046 .dw XT_DOLITERAL +00fcba 0100 .dw $100 +00fcbb f16e .dw XT_ULESS +00fcbc f03f .dw XT_DOCONDBRANCH +00fcbd fcc2 .dw PFA_ICOMPARE_LASTCELL +00fcbe f0d6 .dw XT_SWAP +00fcbf f046 .dw XT_DOLITERAL +00fcc0 00ff .dw $00FF +00fcc1 f225 .dw XT_AND ; the final swap can be omitted + PFA_ICOMPARE_LASTCELL: +00fcc2 f125 .dw XT_NOTEQUAL +00fcc3 f03f .dw XT_DOCONDBRANCH +00fcc4 fcc9 .dw PFA_ICOMPARE_NEXTLOOP +00fcc5 f589 .dw XT_2DROP +00fcc6 f15d .dw XT_TRUE +00fcc7 f2e6 .dw XT_UNLOOP +00fcc8 f026 .dw XT_EXIT + PFA_ICOMPARE_NEXTLOOP: +00fcc9 f241 .dw XT_1PLUS +00fcca f0d6 .dw XT_SWAP +00fccb f579 .dw XT_CELLPLUS +00fccc f0d6 .dw XT_SWAP +00fccd f046 .dw XT_DOLITERAL +00fcce 0002 .dw 2 +00fccf f2cc .dw XT_DOPLUSLOOP +00fcd0 fcb4 .dw PFA_ICOMPARE_LOOP + PFA_ICOMPARE_DONE: +00fcd1 f589 .dw XT_2DROP +00fcd2 f166 .dw XT_ZERO +00fcd3 f026 .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: +00fcd4 ff01 .dw $ff01 +00fcd5 002a .db "*",0 +00fcd6 fc9d .dw VE_HEAD + .set VE_HEAD = VE_STAR + XT_STAR: +00fcd7 f001 .dw DO_COLON + PFA_STAR: + .endif + +00fcd8 f1b8 .dw XT_MSTAR +00fcd9 f0eb .dw XT_DROP +00fcda f026 .dw XT_EXIT + .include "words/j.asm" + + ; Compiler + ; loop counter of outer loop + VE_J: +00fcdb ff01 .dw $FF01 +00fcdc 006a .db "j",0 +00fcdd fcd4 .dw VE_HEAD + .set VE_HEAD = VE_J + XT_J: +00fcde f001 .dw DO_COLON + PFA_J: +00fcdf f288 .dw XT_RP_FETCH +00fce0 f046 .dw XT_DOLITERAL +00fce1 0007 .dw 7 +00fce2 f1af .dw XT_PLUS +00fce3 f08b .dw XT_FETCH +00fce4 f288 .dw XT_RP_FETCH +00fce5 f046 .dw XT_DOLITERAL +00fce6 0009 .dw 9 +00fce7 f1af .dw XT_PLUS +00fce8 f08b .dw XT_FETCH +00fce9 f1af .dw XT_PLUS +00fcea f026 .dw XT_EXIT + + .include "words/dabs.asm" + + ; Arithmetics + ; double cell absolute value + VE_DABS: +00fceb ff04 .dw $ff04 +00fcec 6164 +00fced 7362 .db "dabs" +00fcee fcdb .dw VE_HEAD + .set VE_HEAD = VE_DABS + XT_DABS: +00fcef f001 .dw DO_COLON + PFA_DABS: +00fcf0 f0c3 .dw XT_DUP +00fcf1 f133 .dw XT_ZEROLESS +00fcf2 f03f .dw XT_DOCONDBRANCH +00fcf3 fcf5 .dw PFA_DABS1 +00fcf4 fcfc .dw XT_DNEGATE + PFA_DABS1: +00fcf5 f026 .dw XT_EXIT + ; : dabs ( ud1 -- +d2 ) dup 0< if dnegate then ; + .include "words/dnegate.asm" + + ; Arithmetics + ; double cell negation + VE_DNEGATE: +00fcf6 ff07 .dw $ff07 +00fcf7 6e64 +00fcf8 6765 +00fcf9 7461 +00fcfa 0065 .db "dnegate",0 +00fcfb fceb .dw VE_HEAD + .set VE_HEAD = VE_DNEGATE + XT_DNEGATE: +00fcfc f001 .dw DO_COLON + PFA_DNEGATE: +00fcfd f456 .dw XT_DINVERT +00fcfe fda1 .dw XT_ONE +00fcff f166 .dw XT_ZERO +00fd00 f430 .dw XT_DPLUS +00fd01 f026 .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: +00fd02 ff05 .dw $ff05 +00fd03 6d63 +00fd04 766f +00fd05 0065 .db "cmove",0 +00fd06 fcf6 .dw VE_HEAD + .set VE_HEAD = VE_CMOVE + XT_CMOVE: +00fd07 fd08 .dw PFA_CMOVE + PFA_CMOVE: +00fd08 93bf push xh +00fd09 93af push xl +00fd0a 91e9 ld zl, Y+ +00fd0b 91f9 ld zh, Y+ ; addr-to +00fd0c 91a9 ld xl, Y+ +00fd0d 91b9 ld xh, Y+ ; addr-from +00fd0e 2f09 mov temp0, tosh +00fd0f 2b08 or temp0, tosl +00fd10 f021 brbs 1, PFA_CMOVE1 + PFA_CMOVE2: +00fd11 911d ld temp1, X+ +00fd12 9311 st Z+, temp1 +00fd13 9701 sbiw tosl, 1 +00fd14 f7e1 brbc 1, PFA_CMOVE2 + PFA_CMOVE1: +00fd15 91af pop xl +00fd16 91bf pop xh +00fd17 9189 +00fd18 9199 loadtos +00fd19 940c f005 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: +00fd1b ff05 .dw $ff05 +00fd1c 7332 +00fd1d 6177 +00fd1e 0070 .db "2swap",0 +00fd1f fd02 .dw VE_HEAD + .set VE_HEAD = VE_2SWAP + XT_2SWAP: +00fd20 f001 .dw DO_COLON + PFA_2SWAP: + + .endif +00fd21 f0f3 .dw XT_ROT +00fd22 f111 .dw XT_TO_R +00fd23 f0f3 .dw XT_ROT +00fd24 f108 .dw XT_R_FROM +00fd25 f026 .dw XT_EXIT + + .include "words/tib.asm" + + ; System + ; refills the input buffer + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_REFILLTIB: +00fd26 ff0a .dw $ff0a +00fd27 6572 +00fd28 6966 +00fd29 6c6c +00fd2a 742d +00fd2b 6269 .db "refill-tib" +00fd2c fd1b .dw VE_HEAD + .set VE_HEAD = VE_REFILLTIB + XT_REFILLTIB: +00fd2d f001 .dw DO_COLON + PFA_REFILLTIB: + .endif +00fd2e fd49 .dw XT_TIB +00fd2f f046 .dw XT_DOLITERAL +00fd30 005a .dw TIB_SIZE +00fd31 f8ac .dw XT_ACCEPT +00fd32 fd4f .dw XT_NUMBERTIB +00fd33 f093 .dw XT_STORE +00fd34 f166 .dw XT_ZERO +00fd35 f599 .dw XT_TO_IN +00fd36 f093 .dw XT_STORE +00fd37 f15d .dw XT_TRUE ; -1 +00fd38 f026 .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: +00fd39 ff0a .dw $FF0A +00fd3a 6f73 +00fd3b 7275 +00fd3c 6563 +00fd3d 742d +00fd3e 6269 .db "source-tib" +00fd3f fd26 .dw VE_HEAD + .set VE_HEAD = VE_SOURCETIB + XT_SOURCETIB: +00fd40 f001 .dw DO_COLON + PFA_SOURCETIB: + .endif +00fd41 fd49 .dw XT_TIB +00fd42 fd4f .dw XT_NUMBERTIB +00fd43 f08b .dw XT_FETCH +00fd44 f026 .dw XT_EXIT + + ; ( -- addr ) + ; System Variable + ; terminal input buffer address + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_TIB: +00fd45 ff03 .dw $ff03 +00fd46 6974 +00fd47 0062 .db "tib",0 +00fd48 fd39 .dw VE_HEAD + .set VE_HEAD = VE_TIB + XT_TIB: +00fd49 f054 .dw PFA_DOVARIABLE + PFA_TIB: +00fd4a 016f .dw ram_tib + .dseg +00016f 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: +00fd4b ff04 .dw $ff04 +00fd4c 7423 +00fd4d 6269 .db "#tib" +00fd4e fd45 .dw VE_HEAD + .set VE_HEAD = VE_NUMBERTIB + XT_NUMBERTIB: +00fd4f f054 .dw PFA_DOVARIABLE + PFA_NUMBERTIB: +00fd50 01c9 .dw ram_sharptib + .dseg +0001c9 ram_sharptib: .byte 2 + .cseg + .endif + + .include "words/init-ram.asm" + + ; Tools + ; copy len cells from eeprom to ram + VE_EE2RAM: +00fd51 ff06 .dw $ff06 +00fd52 6565 +00fd53 723e +00fd54 6d61 .db "ee>ram" +00fd55 fd4b .dw VE_HEAD + .set VE_HEAD = VE_EE2RAM + XT_EE2RAM: +00fd56 f001 .dw DO_COLON + PFA_EE2RAM: ; ( -- ) +00fd57 f166 .dw XT_ZERO +00fd58 f2ad .dw XT_DODO + PFA_EE2RAM_1: + ; ( -- e-addr r-addr ) +00fd59 f0e1 .dw XT_OVER +00fd5a f371 .dw XT_FETCHE +00fd5b f0e1 .dw XT_OVER +00fd5c f093 .dw XT_STORE +00fd5d f579 .dw XT_CELLPLUS +00fd5e f0d6 .dw XT_SWAP +00fd5f f579 .dw XT_CELLPLUS +00fd60 f0d6 .dw XT_SWAP +00fd61 f2db .dw XT_DOLOOP +00fd62 fd59 .dw PFA_EE2RAM_1 + PFA_EE2RAM_2: +00fd63 f589 .dw XT_2DROP +00fd64 f026 .dw XT_EXIT + + ; ( -- ) + ; Tools + ; setup the default user area from eeprom + VE_INIT_RAM: +00fd65 ff08 .dw $ff08 +00fd66 6e69 +00fd67 7469 +00fd68 722d +00fd69 6d61 .db "init-ram" +00fd6a fd51 .dw VE_HEAD + .set VE_HEAD = VE_INIT_RAM + XT_INIT_RAM: +00fd6b f001 .dw DO_COLON + PFA_INI_RAM: ; ( -- ) +00fd6c f046 .dw XT_DOLITERAL +00fd6d 007c .dw EE_INITUSER +00fd6e f314 .dw XT_UP_FETCH +00fd6f f046 .dw XT_DOLITERAL +00fd70 0022 .dw SYSUSERSIZE +00fd71 f216 .dw XT_2SLASH +00fd72 fd56 .dw XT_EE2RAM +00fd73 f026 .dw XT_EXIT + .include "dict/compiler2.inc" + + ; included almost independently from each other + ; on a include-per-use basis + ; + .if DICT_COMPILER2 == 0 + .endif + .include "words/bounds.asm" + + ; Tools + ; convert a string to an address range + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_BOUNDS: +00fd74 ff06 .dw $ff06 +00fd75 6f62 +00fd76 6e75 +00fd77 7364 .db "bounds" +00fd78 fd65 .dw VE_HEAD + .set VE_HEAD = VE_BOUNDS + XT_BOUNDS: +00fd79 f001 .dw DO_COLON + PFA_BOUNDS: + .endif +00fd7a f0e1 .dw XT_OVER +00fd7b f1af .dw XT_PLUS +00fd7c f0d6 .dw XT_SWAP +00fd7d f026 .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: +00fd7e ff03 .dw $ff03 +00fd7f 3e73 +00fd80 0064 .db "s>d",0 +00fd81 fd74 .dw VE_HEAD + .set VE_HEAD = VE_S2D + XT_S2D: +00fd82 f001 .dw DO_COLON + PFA_S2D: + .endif +00fd83 f0c3 .dw XT_DUP +00fd84 f133 .dw XT_ZEROLESS +00fd85 f026 .dw XT_EXIT + .include "words/to-body.asm" + + ; Core + ; get body from XT + VE_TO_BODY: +00fd86 ff05 .dw $ff05 +00fd87 623e +00fd88 646f +00fd89 0079 .db ">body",0 +00fd8a fd7e .dw VE_HEAD + .set VE_HEAD = VE_TO_BODY + XT_TO_BODY: +00fd8b f242 .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: +00fd8c 0008 .dw $0008 +00fd8d 6c32 +00fd8e 7469 +00fd8f 7265 +00fd90 6c61 .db "2literal" +00fd91 fd86 .dw VE_HEAD + .set VE_HEAD = VE_2LITERAL + XT_2LITERAL: +00fd92 f001 .dw DO_COLON + PFA_2LITERAL: + .endif +00fd93 f0d6 .dw XT_SWAP +00fd94 01f1 .dw XT_LITERAL +00fd95 01f1 .dw XT_LITERAL +00fd96 f026 .dw XT_EXIT + .include "words/equal.asm" + + ; Compare + ; compares two values for equality + VE_EQUAL: +00fd97 ff01 .dw $ff01 +00fd98 003d .db "=",0 +00fd99 fd8c .dw VE_HEAD + .set VE_HEAD = VE_EQUAL + XT_EQUAL: +00fd9a f001 .dw DO_COLON + PFA_EQUAL: +00fd9b f1a5 .dw XT_MINUS +00fd9c f12c .dw XT_ZEROEQUAL +00fd9d f026 .dw XT_EXIT + .include "words/num-constants.asm" + + .endif + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_ONE: +00fd9e ff01 .dw $ff01 +00fd9f 0031 .db "1",0 +00fda0 fd97 .dw VE_HEAD + .set VE_HEAD = VE_ONE + XT_ONE: +00fda1 f054 .dw PFA_DOVARIABLE + PFA_ONE: + .endif +00fda2 0001 .DW 1 + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_TWO: +00fda3 ff01 .dw $ff01 +00fda4 0032 .db "2",0 +00fda5 fd9e .dw VE_HEAD + .set VE_HEAD = VE_TWO + XT_TWO: +00fda6 f054 .dw PFA_DOVARIABLE + PFA_TWO: + .endif +00fda7 0002 .DW 2 + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_MINUSONE: +00fda8 ff02 .dw $ff02 +00fda9 312d .db "-1" +00fdaa fda3 .dw VE_HEAD + .set VE_HEAD = VE_MINUSONE + XT_MINUSONE: +00fdab f054 .dw PFA_DOVARIABLE + PFA_MINUSONE: + .endif +00fdac ffff .DW -1 + .include "dict_appl_core.inc" + + ; do not delete it! + + .set flashlast = pc + .if (pc>FLASHEND) + .endif + + .dseg + ; define a label for the 1st free ram address + HERESTART: + .eseg + .include "amforth-eeprom.inc" +000046 ff ff + ; some configs +000048 9a 05 CFG_DP: .dw DPSTART ; Dictionary Pointer +00004a cb 01 EE_HERE: .dw HERESTART ; Memory Allocation +00004c a0 00 EE_EHERE: .dw EHERESTART ; EEProm Memory Allocation +00004e 42 04 CFG_WLSCOPE: .dw XT_GET_CURRENT ; default wordlist scope +000050 6e 00 CFG_FORTHRECOGNIZER: .dw CFG_RECOGNIZERLISTLEN ; Recognizer word set + ; LEAVE stack is between data stack and return stack. +000052 b0 40 CFG_LP0: .dw stackstart+1 +000054 ec 04 CFG_TURNKEY: .dw XT_APPLTURNKEY ; TURNKEY +000056 4d f5 CFG_ENVIRONMENT:.dw VE_ENVHEAD ; environmental queries +000058 5a 00 CFG_CURRENT: .dw CFG_FORTHWORDLIST ; forth-wordlist +00005a a8 fd CFG_FORTHWORDLIST:.dw VE_HEAD ; pre-defined (compiled in) wordlist + CFG_ORDERLISTLEN: +00005c 01 00 .dw 1 + CFG_ORDERLIST: ; list of wordlist id, exactly numwordlist entries +00005e 5a 00 .dw CFG_FORTHWORDLIST ; get/set-order +000060 .byte (NUMWORDLISTS-1)*CELLSIZE ; one slot is already used + CFG_RECOGNIZERLISTLEN: +00006e 02 00 .dw 2 + CFG_RECOGNIZERLIST: +000070 3f fb .dw XT_REC_FIND +000072 2b fb .dw XT_REC_NUM +000074 .byte (NUMRECOGNIZERS-2)*CELLSIZE ; two slots are already used + + EE_STOREI: +000078 90 f3 .dw XT_DO_STOREI ; Store a cell into flash + + ; MARKER saves everything up to here. Nothing beyond gets saved + EE_MARKER: +00007a 7a 00 .dw EE_MARKER + + ; default user area + EE_INITUSER: +00007c 00 00 .dw 0 ; USER_STATE +00007e 00 00 .dw 0 ; USER_FOLLOWER +000080 ff 40 .dw rstackstart ; USER_RP +000082 af 40 .dw stackstart ; USER_SP0 +000084 af 40 .dw stackstart ; USER_SP + +000086 00 00 .dw 0 ; USER_HANDLER +000088 0a 00 .dw 10 ; USER_BASE + +00008a b6 00 .dw XT_TX ; USER_EMIT +00008c c4 00 .dw XT_TXQ ; USER_EMITQ +00008e 8b 00 .dw XT_RX ; USER_KEY +000090 a6 00 .dw XT_RXQ ; USER_KEYQ +000092 40 fd .dw XT_SOURCETIB ; USER_SOURCE +000094 00 00 .dw 0 ; USER_G_IN +000096 2d fd .dw XT_REFILLTIB ; USER_REFILL +000098 05 fa .dw XT_DEFAULT_PROMPTOK +00009a 24 fa .dw XT_DEFAULT_PROMPTERROR +00009c 14 fa .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: +00009e 19 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 + +"ATmega1284P" register use summary: +r0 : 25 r1 : 5 r2 : 10 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: 89 r17: 61 r18: 61 r19: 37 r20: 13 r21: 38 r22: 11 r23: 3 +r24: 212 r25: 145 r26: 28 r27: 17 r28: 7 r29: 4 r30: 90 r31: 49 +x : 4 y : 217 z : 50 +Registers used: 29 out of 35 (82.9%) + +"ATmega1284P" 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 : 3 brcs : 1 break : 0 breq : 6 brge : 1 brhc : 0 +brhs : 0 brid : 0 brie : 0 brlo : 1 brlt : 3 brmi : 3 +brne : 22 brpl : 0 brsh : 0 brtc : 0 brts : 0 brvc : 0 +brvs : 2 bset : 0 bst : 0 call : 2 cbi : 7 cbr : 1 +clc : 2 clh : 0 cli : 7 cln : 0 clr : 23 cls : 0 +clt : 0 clv : 0 clz : 0 com : 14 cp : 11 cpc : 10 +cpi : 2 cpse : 0 dec : 10 elpm : 16 eor : 3 fmul : 0 +fmuls : 0 fmulsu: 0 icall : 0 ijmp : 1 in : 25 inc : 3 +jmp : 14 ld : 145 ldd : 4 ldi : 41 lds : 1 lpm : 0 +lsl : 14 lsr : 2 mov : 16 movw : 72 mul : 5 muls : 1 +mulsu : 2 neg : 0 nop : 0 or : 9 ori : 2 out : 31 +pop : 49 push : 43 rcall : 48 ret : 7 reti : 1 rjmp : 105 +rol : 32 ror : 6 sbc : 9 sbci : 3 sbi : 8 sbic : 3 +sbis : 0 sbiw : 16 sbr : 0 sbrc : 5 sbrs : 7 sec : 1 +seh : 0 sei : 1 sen : 0 ser : 4 ses : 0 set : 0 +sev : 0 sez : 0 sleep : 0 spm : 2 st : 81 std : 8 +sts : 1 sub : 6 subi : 3 swap : 0 tst : 0 wdr : 0 + +Instructions used: 72 out of 114 (63.2%) + +"ATmega1284P" memory use summary [bytes]: +Segment Begin End Code Data Used Size Use% +--------------------------------------------------------------- +[.cseg] 0x000000 0x01fb5a 2156 14646 16802 131072 12.8% +[.dseg] 0x000100 0x0001cb 0 203 203 16384 1.2% +[.eseg] 0x000000 0x0000a0 0 160 160 4096 3.9% + +Assembly complete, 0 errors, 8 warnings diff --git a/amforth-6.5/appl/eval-pollin/p1284-16.map b/amforth-6.5/appl/eval-pollin/p1284-16.map new file mode 100644 index 0000000..81938c3 --- /dev/null +++ b/amforth-6.5/appl/eval-pollin/p1284-16.map @@ -0,0 +1,2253 @@ + +AVRASM ver. 2.1.52 p1284-16.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 00000097 +EQU SIGNATURE_002 00000005 +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 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 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 ADMUX 0000007c +EQU ADCSRB 0000007b +EQU ADCSRA 0000007a +EQU ADCH 00000079 +EQU ADCL 00000078 +EQU PCMSK3 00000073 +EQU TIMSK3 00000071 +EQU TIMSK2 00000070 +EQU TIMSK1 0000006f +EQU TIMSK0 0000006e +EQU PCMSK2 0000006d +EQU PCMSK1 0000006c +EQU PCMSK0 0000006b +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 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 TIFR3 00000018 +EQU TIFR2 00000017 +EQU TIFR1 00000016 +EQU TIFR0 00000015 +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 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 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 TOIE1 00000000 +EQU OCIE1A 00000001 +EQU OCIE1B 00000002 +EQU ICIE1 00000005 +EQU TOV1 00000000 +EQU OCF1A 00000001 +EQU OCF1B 00000002 +EQU ICF1 00000005 +EQU WGM10 00000000 +EQU PWM10 00000000 +EQU WGM11 00000001 +EQU PWM11 00000001 +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 CTC1 00000003 +EQU WGM13 00000004 +EQU ICES1 00000006 +EQU ICNC1 00000007 +EQU FOC1B 00000006 +EQU FOC1A 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 TOIE3 00000000 +EQU OCIE3A 00000001 +EQU OCIE3B 00000002 +EQU ICIE3 00000005 +EQU TOV3 00000000 +EQU OCF3A 00000001 +EQU OCF3B 00000002 +EQU ICF3 00000005 +EQU WGM30 00000000 +EQU WGM31 00000001 +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 FOC3B 00000006 +EQU FOC3A 00000007 +EQU OCR3AH0 00000000 +EQU OCR3AH1 00000001 +EQU OCR3AH2 00000002 +EQU OCR3AH3 00000003 +EQU OCR3AH4 00000004 +EQU OCR3AH5 00000005 +EQU OCR3AH6 00000006 +EQU OCR3AH7 00000007 +EQU OCR3AL0 00000000 +EQU OCR3AL1 00000001 +EQU OCR3AL2 00000002 +EQU OCR3AL3 00000003 +EQU OCR3AL4 00000004 +EQU OCR3AL5 00000005 +EQU OCR3AL6 00000006 +EQU OCR3AL7 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 ISC00 00000000 +EQU ISC01 00000001 +EQU ISC10 00000002 +EQU ISC11 00000003 +EQU ISC20 00000004 +EQU ISC21 00000005 +EQU INT0 00000000 +EQU INT1 00000001 +EQU INT2 00000002 +EQU INTF0 00000000 +EQU INTF1 00000001 +EQU INTF2 00000002 +EQU PCIE0 00000000 +EQU PCIE1 00000001 +EQU PCIE2 00000002 +EQU PCIE3 00000003 +EQU PCIF0 00000000 +EQU PCIF1 00000001 +EQU PCIF2 00000002 +EQU PCIF3 00000003 +EQU PCINT24 00000000 +EQU PCINT25 00000001 +EQU PCINT26 00000002 +EQU PCINT27 00000003 +EQU PCINT28 00000004 +EQU PCINT29 00000005 +EQU PCINT30 00000006 +EQU PCINT31 00000007 +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 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 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 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 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 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 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 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 WDP0 00000000 +EQU WDP1 00000001 +EQU WDP2 00000002 +EQU WDE 00000003 +EQU WDCE 00000004 +EQU WDP3 00000005 +EQU WDIE 00000006 +EQU WDIF 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 BODSE 00000005 +EQU BODS 00000006 +EQU PORF 00000000 +EQU EXTRF 00000001 +EQU BORF 00000002 +EQU WDRF 00000003 +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 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 PRADC 00000000 +EQU PRUSART0 00000001 +EQU PRSPI 00000002 +EQU PRTIM1 00000003 +EQU PRUSART1 00000004 +EQU PRTIM0 00000005 +EQU PRTIM2 00000006 +EQU PRTWI 00000007 +EQU PRTIM3 00000000 +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 0000ffff +EQU IOEND 000000ff +EQU SRAM_START 00000100 +EQU SRAM_SIZE 00004000 +EQU RAMEND 000040ff +EQU XRAMEND 00000000 +EQU E2END 00000fff +EQU EEPROMEND 00000fff +EQU EEADRBITS 0000000c +EQU NRWW_START_ADDR 0000f000 +EQU NRWW_STOP_ADDR 0000ffff +EQU RWW_START_ADDR 00000000 +EQU RWW_STOP_ADDR 0000efff +EQU PAGESIZE 00000080 +EQU FIRSTBOOTSTART 0000fe00 +EQU SECONDBOOTSTART 0000fc00 +EQU THIRDBOOTSTART 0000f800 +EQU FOURTHBOOTSTART 0000f000 +EQU SMALLBOOTSTART 0000fe00 +EQU LARGEBOOTSTART 0000f000 +EQU INT0addr 00000002 +EQU INT1addr 00000004 +EQU INT2addr 00000006 +EQU PCI0addr 00000008 +EQU PCI1addr 0000000a +EQU PCI2addr 0000000c +EQU PCI3addr 0000000e +EQU WDTaddr 00000010 +EQU OC2Aaddr 00000012 +EQU OC2Baddr 00000014 +EQU OVF2addr 00000016 +EQU ICP1addr 00000018 +EQU OC1Aaddr 0000001a +EQU OC1Baddr 0000001c +EQU OVF1addr 0000001e +EQU OC0Aaddr 00000020 +EQU OC0Baddr 00000022 +EQU OVF0addr 00000024 +EQU SPIaddr 00000026 +EQU URXC0addr 00000028 +EQU UDRE0addr 0000002a +EQU UTXC0addr 0000002c +EQU ACIaddr 0000002e +EQU ADCCaddr 00000030 +EQU ERDYaddr 00000032 +EQU TWIaddr 00000034 +EQU SPMRaddr 00000036 +EQU URXC1addr 00000038 +EQU UDRE1addr 0000003a +EQU UTXC1addr 0000003c +EQU ICP3addr 0000003e +EQU OC3Aaddr 00000040 +EQU OC3Baddr 00000042 +EQU OVF3addr 00000044 +EQU INT_VECTORS_SIZE 00000046 +EQU ramstart 00000100 +EQU CELLSIZE 00000002 +SET WANT_ANALOG_COMPARATOR 00000000 +SET WANT_USART0 00000000 +SET WANT_PORTA 00000000 +SET WANT_PORTB 00000000 +SET WANT_PORTC 00000000 +SET WANT_PORTD 00000000 +SET WANT_TIMER_COUNTER_0 00000000 +SET WANT_TIMER_COUNTER_1 00000000 +SET WANT_TIMER_COUNTER_2 00000000 +SET WANT_TIMER_COUNTER_3 00000000 +SET WANT_BOOT_LOAD 00000000 +SET WANT_EXTERNAL_INTERRUPT 00000000 +SET WANT_AD_CONVERTER 00000000 +SET WANT_JTAG 00000000 +SET WANT_EEPROM 00000000 +SET WANT_TWI 00000000 +SET WANT_USART1 00000000 +SET WANT_SPI 00000000 +SET WANT_WATCHDOG 00000000 +SET WANT_CPU 00000000 +EQU intvecsize 00000002 +EQU pclen 00000002 +CSEG isr 0000013c +EQU INTVECTORS 00000023 +CSEG mcu_info 00000045 +CSEG mcu_ramsize 00000045 +CSEG mcu_eepromsize 00000046 +CSEG mcu_maxdp 00000047 +CSEG mcu_numints 00000048 +CSEG mcu_name 00000049 +SET codestart 00000050 +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 000040ff +SET stackstart 000040af +SET NUMWORDLISTS 00000008 +SET NUMRECOGNIZERS 00000004 +SET BAUD 00009600 +SET BAUD_MAXERROR 0000001e +SET VE_HEAD 0000fda8 +SET VE_ENVHEAD 0000f54d +SET AMFORTH_RO_SEG 0000f001 +EQU F_CPU 00f42400 +EQU TIMER_INT 00000016 +EQU BAUDRATE_LOW 000000c4 +EQU BAUDRATE_HIGH 000000c5 +EQU USART_C 000000c2 +EQU USART_B 000000c1 +EQU USART_A 000000c0 +EQU USART_DATA 000000c6 +EQU URXCaddr 00000028 +EQU UDREaddr 0000002a +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 00000100 +DSEG usart_rx_in 00000110 +DSEG usart_rx_out 00000111 +CSEG VE_TO_RXBUF 00000050 +CSEG XT_TO_RXBUF 00000056 +CSEG PFA_rx_tobuf 00000057 +CSEG DO_NEXT 0000f005 +CSEG VE_ISR_RX 00000067 +CSEG XT_ISR_RX 0000006c +CSEG DO_COLON 0000f001 +CSEG usart_rx_isr 0000006d +CSEG XT_DOLITERAL 0000f046 +CSEG XT_CFETCH 0000f0aa +CSEG XT_DUP 0000f0c3 +CSEG XT_EQUAL 0000fd9a +CSEG XT_DOCONDBRANCH 0000f03f +CSEG usart_rx_isr1 00000077 +CSEG XT_COLD 0000fa74 +CSEG XT_EXIT 0000f026 +CSEG XT_USART_INIT_RX_BUFFER 00000079 +CSEG PFA_USART_INIT_RX_BUFFER 0000007a +CSEG XT_INTSTORE 0000f4a2 +CSEG XT_ZERO 0000f166 +CSEG XT_FILL 0000f4ea +CSEG VE_RX_BUFFER 00000086 +CSEG XT_RX_BUFFER 0000008b +CSEG PFA_RX_BUFFER 0000008c +CSEG XT_RXQ_BUFFER 000000a6 +CSEG XT_PLUS 0000f1af +CSEG XT_SWAP 0000f0d6 +CSEG XT_1PLUS 0000f241 +CSEG XT_AND 0000f225 +CSEG XT_CSTORE 0000f09f +CSEG VE_RXQ_BUFFER 000000a0 +CSEG PFA_RXQ_BUFFER 000000a7 +CSEG XT_PAUSE 0000fa6c +CSEG XT_NOTEQUAL 0000f125 +SET XT_RX 0000008b +SET XT_RXQ 000000a6 +SET XT_USART_INIT_RX 00000079 +CSEG VE_TX_POLL 000000b0 +CSEG XT_TX_POLL 000000b6 +CSEG PFA_TX_POLL 000000b7 +CSEG XT_TXQ_POLL 000000c4 +CSEG VE_TXQ_POLL 000000be +CSEG PFA_TXQ_POLL 000000c5 +SET XT_TX 000000b6 +SET XT_TXQ 000000c4 +SET XT_USART_INIT_TX 00000000 +CSEG VE_UBRR 000000cd +CSEG XT_UBRR 000000d1 +CSEG PFA_DOVALUE1 0000f081 +CSEG PFA_UBRR 000000d2 +ESEG EE_UBRRVAL 0000009e +CSEG XT_EDEFERFETCH 0000fbcf +CSEG XT_EDEFERSTORE 0000fbd9 +CSEG VE_USART 000000d5 +CSEG XT_USART 000000da +CSEG PFA_USART 000000db +CSEG XT_BYTESWAP 0000f30b +EQU OW_PORT 00000005 +EQU OW_BIT 00000004 +SET OW_DDR 00000004 +SET OW_PIN 00000003 +CSEG VE_OW_RESET 000000f0 +CSEG XT_OW_RESET 000000f6 +CSEG PFA_OW_RESET 000000f7 +SET cycles 00000000 +SET loop_cycles 00000fa0 +CSEG VE_OW_SLOT 00000114 +CSEG XT_OW_SLOT 0000011a +CSEG PFA_OW_SLOT 0000011b +CSEG PFA_OW_SLOT0 00000128 +SET AMFORTH_NRWW_SIZE 00001ffc +SET corepc 0000013c +CSEG PFA_COLD 0000fa75 +ESEG intvec 00000000 +DSEG intcnt 00000112 +CSEG VE_MPLUS 00000153 +CSEG XT_MPLUS 00000156 +CSEG PFA_MPLUS 00000157 +CSEG XT_S2D 0000fd82 +CSEG XT_DPLUS 0000f430 +CSEG VE_UDSTAR 0000015a +CSEG XT_UDSTAR 0000015e +CSEG PFA_UDSTAR 0000015f +CSEG XT_TO_R 0000f111 +CSEG XT_UMSTAR 0000f1f2 +CSEG XT_DROP 0000f0eb +CSEG XT_R_FROM 0000f108 +CSEG XT_ROT 0000f0f3 +CSEG VE_UMAX 00000169 +CSEG XT_UMAX 0000016d +CSEG PFA_UMAX 0000016e +CSEG XT_2DUP 0000f580 +CSEG XT_ULESS 0000f16e +CSEG UMAX1 00000173 +CSEG VE_UMIN 00000175 +CSEG XT_UMIN 00000179 +CSEG PFA_UMIN 0000017a +CSEG XT_UGREATER 0000f179 +CSEG UMIN1 0000017f +CSEG XT_IMMEDIATEQ 00000181 +CSEG PFA_IMMEDIATEQ 00000182 +CSEG XT_ZEROEQUAL 0000f12c +CSEG IMMEDIATEQ1 0000018a +CSEG XT_ONE 0000fda1 +CSEG XT_TRUE 0000f15d +CSEG VE_NAME2FLAGS 0000018c +CSEG XT_NAME2FLAGS 00000193 +CSEG PFA_NAME2FLAGS 00000194 +CSEG XT_FETCHI 0000f3e3 +CSEG VE_NEWEST 00000199 +CSEG XT_NEWEST 0000019e +CSEG PFA_DOVARIABLE 0000f054 +CSEG PFA_NEWEST 0000019f +DSEG ram_newest 00000135 +CSEG VE_LATEST 000001a0 +CSEG XT_LATEST 000001a5 +CSEG PFA_LATEST 000001a6 +DSEG ram_latest 00000139 +CSEG VE_DOCREATE 000001a7 +CSEG XT_DOCREATE 000001ad +CSEG PFA_DOCREATE 000001ae +CSEG XT_PARSENAME 0000f9cf +CSEG XT_WLSCOPE 00000304 +CSEG XT_CELLPLUS 0000f579 +CSEG XT_STORE 0000f093 +CSEG XT_HEADER 000002e9 +CSEG VE_BACKSLASH 000001b8 +CSEG XT_BACKSLASH 000001bb +CSEG PFA_BACKSLASH 000001bc +CSEG XT_SOURCE 0000f9b6 +CSEG XT_NIP 0000f102 +CSEG XT_TO_IN 0000f599 +CSEG VE_LPAREN 000001c1 +CSEG XT_LPAREN 000001c4 +CSEG PFA_LPAREN 000001c5 +CSEG XT_PARSE 0000f9a2 +CSEG XT_2DROP 0000f589 +CSEG VE_COMPILE 000001ca +CSEG XT_COMPILE 000001d0 +CSEG PFA_COMPILE 000001d1 +CSEG XT_ICELLPLUS 0000fbc6 +CSEG XT_COMMA 000001db +CSEG VE_COMMA 000001d8 +CSEG PFA_COMMA 000001dc +CSEG XT_DP 0000f5c9 +CSEG XT_STOREI 0000f385 +CSEG XT_DOTO 0000fbb4 +CSEG PFA_DP 0000f5ca +CSEG VE_BRACKETTICK 000001e3 +CSEG XT_BRACKETTICK 000001e7 +CSEG PFA_BRACKETTICK 000001e8 +CSEG XT_TICK 0000f825 +CSEG XT_LITERAL 000001f1 +CSEG VE_LITERAL 000001eb +CSEG PFA_LITERAL 000001f2 +CSEG VE_SLITERAL 000001f6 +CSEG XT_SLITERAL 000001fc +CSEG PFA_SLITERAL 000001fd +CSEG XT_DOSLITERAL 0000f788 +CSEG XT_SCOMMA 0000f796 +CSEG XT_GMARK 00000201 +CSEG PFA_GMARK 00000202 +CSEG XT_GRESOLVE 00000206 +CSEG PFA_GRESOLVE 00000207 +CSEG XT_QSTACK 0000fb72 +CSEG XT_LMARK 0000020c +CSEG PFA_LMARK 0000020d +CSEG XT_LRESOLVE 0000020f +CSEG PFA_LRESOLVE 00000210 +CSEG VE_AHEAD 00000213 +CSEG XT_AHEAD 00000218 +CSEG PFA_AHEAD 00000219 +CSEG XT_DOBRANCH 0000f035 +CSEG VE_IF 0000021d +CSEG XT_IF 00000220 +CSEG PFA_IF 00000221 +CSEG VE_ELSE 00000225 +CSEG XT_ELSE 00000229 +CSEG PFA_ELSE 0000022a +CSEG VE_THEN 00000230 +CSEG XT_THEN 00000234 +CSEG PFA_THEN 00000235 +CSEG VE_BEGIN 00000237 +CSEG XT_BEGIN 0000023c +CSEG PFA_BEGIN 0000023d +CSEG VE_WHILE 0000023f +CSEG XT_WHILE 00000244 +CSEG PFA_WHILE 00000245 +CSEG VE_REPEAT 00000248 +CSEG XT_REPEAT 0000024d +CSEG PFA_REPEAT 0000024e +CSEG XT_AGAIN 00000261 +CSEG VE_UNTIL 00000251 +CSEG XT_UNTIL 00000256 +CSEG PFA_UNTIL 00000257 +CSEG VE_AGAIN 0000025c +CSEG PFA_AGAIN 00000262 +CSEG VE_DO 00000266 +CSEG XT_DO 00000269 +CSEG PFA_DO 0000026a +CSEG XT_DODO 0000f2ad +CSEG XT_TO_L 000002c4 +CSEG VE_LOOP 00000270 +CSEG XT_LOOP 00000274 +CSEG PFA_LOOP 00000275 +CSEG XT_DOLOOP 0000f2db +CSEG XT_ENDLOOP 000002ab +CSEG VE_PLUSLOOP 00000279 +CSEG XT_PLUSLOOP 0000027e +CSEG PFA_PLUSLOOP 0000027f +CSEG XT_DOPLUSLOOP 0000f2cc +CSEG VE_LEAVE 00000283 +CSEG XT_LEAVE 00000288 +CSEG PFA_LEAVE 00000289 +CSEG XT_UNLOOP 0000f2e6 +CSEG VE_QDO 0000028e +CSEG XT_QDO 00000292 +CSEG PFA_QDO 00000293 +CSEG XT_QDOCHECK 0000029a +CSEG PFA_QDOCHECK 0000029b +CSEG PFA_QDOCHECK1 000002a2 +CSEG XT_INVERT 0000f20f +CSEG VE_ENDLOOP 000002a5 +CSEG PFA_ENDLOOP 000002ac +CSEG LOOP1 000002ad +CSEG XT_L_FROM 000002b8 +CSEG XT_QDUP 0000f0cb +CSEG LOOP2 000002b4 +CSEG VE_L_FROM 000002b5 +CSEG PFA_L_FROM 000002b9 +CSEG XT_LP 000002d7 +CSEG XT_FETCH 0000f08b +CSEG XT_PLUSSTORE 0000f277 +CSEG VE_TO_L 000002c1 +CSEG PFA_TO_L 000002c5 +CSEG XT_TWO 0000fda6 +CSEG VE_LP0 000002cc +CSEG XT_LP0 000002d0 +CSEG PFA_LP0 000002d1 +ESEG CFG_LP0 00000052 +CSEG VE_LP 000002d4 +CSEG PFA_LP 000002d8 +DSEG ram_lp 0000013b +CSEG VE_CREATE 000002d9 +CSEG XT_CREATE 000002de +CSEG PFA_CREATE 000002df +CSEG XT_REVEAL 0000030d +CSEG PFA_DOCONSTANT 0000f061 +CSEG VE_HEADER 000002e4 +CSEG PFA_HEADER 000002ea +CSEG XT_GREATERZERO 0000f13a +CSEG PFA_HEADER1 000002fb +CSEG XT_OR 0000f22e +CSEG XT_DOSCOMMA 0000f79a +CSEG XT_FETCHE 0000f371 +CSEG XT_THROW 0000f85c +CSEG VE_WLSCOPE 000002fe +CSEG PFA_DODEFER1 0000fc2e +CSEG PFA_WLSCOPE 00000305 +ESEG CFG_WLSCOPE 0000004e +CSEG VE_REVEAL 00000308 +CSEG PFA_REVEAL 0000030e +CSEG REVEAL1 00000318 +CSEG XT_STOREE 0000f34d +CSEG VE_DOES 00000319 +CSEG XT_DOES 0000031e +CSEG PFA_DOES 0000031f +CSEG XT_DODOES 00000331 +CSEG DO_DODOES 00000326 +CSEG PFA_DODOES 00000332 +CSEG XT_NFA2CFA 0000fc99 +CSEG VE_COLON 0000033a +CSEG XT_COLON 0000033d +CSEG PFA_COLON 0000033e +CSEG XT_COLONNONAME 00000348 +CSEG VE_COLONNONAME 00000342 +CSEG PFA_COLONNONAME 00000349 +CSEG XT_RBRACKET 0000035d +CSEG VE_SEMICOLON 00000351 +CSEG XT_SEMICOLON 00000354 +CSEG PFA_SEMICOLON 00000355 +CSEG XT_LBRACKET 00000365 +CSEG VE_RBRACKET 0000035a +CSEG PFA_RBRACKET 0000035e +CSEG XT_STATE 0000f566 +CSEG VE_LBRACKET 00000362 +CSEG PFA_LBRACKET 00000366 +CSEG VE_VARIABLE 0000036a +CSEG XT_VARIABLE 00000370 +CSEG PFA_VARIABLE 00000371 +CSEG XT_HERE 0000f5da +CSEG XT_CONSTANT 0000037c +CSEG XT_ALLOT 0000f5e3 +CSEG VE_CONSTANT 00000376 +CSEG PFA_CONSTANT 0000037d +CSEG VE_USER 00000383 +CSEG XT_USER 00000387 +CSEG PFA_USER 00000388 +CSEG PFA_DOUSER 0000f067 +CSEG VE_RECURSE 0000038e +CSEG XT_RECURSE 00000394 +CSEG PFA_RECURSE 00000395 +CSEG VE_IMMEDIATE 00000399 +CSEG XT_IMMEDIATE 000003a0 +CSEG PFA_IMMEDIATE 000003a1 +CSEG XT_GET_CURRENT 00000442 +CSEG VE_BRACKETCHAR 000003ab +CSEG XT_BRACKETCHAR 000003b0 +CSEG PFA_BRACKETCHAR 000003b1 +CSEG XT_CHAR 0000f905 +CSEG VE_ABORTQUOTE 000003b6 +CSEG XT_ABORTQUOTE 000003bb +CSEG PFA_ABORTQUOTE 000003bc +CSEG XT_SQUOTE 0000f4dc +CSEG XT_QABORT 000003cd +CSEG VE_ABORT 000003c0 +CSEG XT_ABORT 000003c5 +CSEG PFA_ABORT 000003c6 +CSEG VE_QABORT 000003c8 +CSEG PFA_QABORT 000003ce +CSEG QABO1 000003d3 +CSEG XT_ITYPE 0000f7bb +CSEG VE_GET_STACK 000003d5 +CSEG XT_GET_STACK 000003dc +CSEG PFA_N_FETCH_E2 000003f3 +CSEG PFA_N_FETCH_E1 000003e9 +CSEG XT_I 0000f2be +CSEG XT_1MINUS 0000f247 +CSEG XT_CELLS 0000f573 +CSEG XT_OVER 0000f0e1 +CSEG VE_SET_STACK 000003f6 +CSEG XT_SET_STACK 000003fd +CSEG PFA_SET_STACK 000003fe +CSEG XT_ZEROLESS 0000f133 +CSEG PFA_SET_STACK0 00000405 +CSEG PFA_SET_STACK2 00000412 +CSEG PFA_SET_STACK1 0000040d +CSEG XT_TUCK 0000f591 +CSEG VE_MAPSTACK 00000414 +CSEG XT_MAPSTACK 0000041b +CSEG PFA_MAPSTACK 0000041c +CSEG XT_BOUNDS 0000fd79 +CSEG PFA_MAPSTACK3 00000437 +CSEG PFA_MAPSTACK1 00000426 +CSEG XT_R_FETCH 0000f11a +CSEG XT_EXECUTE 0000f030 +CSEG PFA_MAPSTACK2 00000433 +CSEG VE_GET_CURRENT 0000043a +CSEG PFA_GET_CURRENT 00000443 +ESEG CFG_CURRENT 00000058 +CSEG VE_GET_ORDER 00000447 +CSEG XT_GET_ORDER 0000044e +CSEG PFA_GET_ORDER 0000044f +ESEG CFG_ORDERLISTLEN 0000005c +CSEG VE_CFG_ORDER 00000453 +CSEG XT_CFG_ORDER 0000045a +CSEG PFA_CFG_ORDER 0000045b +CSEG VE_COMPARE 0000045c +CSEG XT_COMPARE 00000462 +CSEG PFA_COMPARE 00000463 +CSEG PFA_COMPARE_LOOP 0000046f +CSEG PFA_COMPARE_NOTEQUAL 0000047d +CSEG PFA_COMPARE_ENDREACHED2 00000478 +CSEG PFA_COMPARE_ENDREACHED 00000479 +CSEG PFA_COMPARE_CHECKLASTCHAR 0000047d +CSEG PFA_COMPARE_DONE 0000047f +CSEG VE_NFA2LFA 00000484 +CSEG XT_NFA2LFA 0000048a +CSEG PFA_NFA2LFA 0000048b +CSEG XT_NAME2STRING 0000fc8d +CSEG XT_2SLASH 0000f216 +CSEG VE_DOTS 00000490 +CSEG XT_DOTS 00000493 +CSEG PFA_DOTS 00000494 +CSEG XT_DEPTH 0000fabc +CSEG XT_UDOT 0000f463 +CSEG XT_SPACE 0000f7fd +CSEG PFA_DOTS2 000004a2 +CSEG PFA_DOTS1 0000049d +CSEG XT_PICK 0000f4ca +CSEG VE_SPIRW 000004a3 +CSEG XT_SPIRW 000004a8 +CSEG PFA_SPIRW 000004a9 +CSEG do_spirw 000004ad +CSEG do_spirw1 000004ae +CSEG VE_N_SPIR 000004b6 +CSEG XT_N_SPIR 000004bb +CSEG PFA_N_SPIR 000004bc +CSEG PFA_N_SPIR_LOOP 000004c1 +CSEG PFA_N_SPIR_LOOP1 000004c2 +CSEG VE_N_SPIW 000004cd +CSEG XT_N_SPIW 000004d2 +CSEG PFA_N_SPIW 000004d3 +CSEG PFA_N_SPIW_LOOP 000004d8 +CSEG PFA_N_SPIW_LOOP1 000004da +CSEG VE_APPLTURNKEY 000004e4 +CSEG XT_APPLTURNKEY 000004ec +CSEG PFA_APPLTURNKEY 000004ed +CSEG XT_INTON 0000f494 +CSEG XT_DOT_VER 0000fb7f +CSEG XT_F_CPU 0000f55b +CSEG XT_UMSLASHMOD 0000f1d4 +CSEG XT_DECIMAL 0000f5f8 +CSEG XT_DOT 0000f73d +CSEG VE_SET_CURRENT 000004fe +CSEG XT_SET_CURRENT 00000506 +CSEG PFA_SET_CURRENT 00000507 +CSEG VE_WORDLIST 0000050b +CSEG XT_WORDLIST 00000511 +CSEG PFA_WORDLIST 00000512 +CSEG XT_EHERE 0000f5d2 +CSEG PFA_EHERE 0000f5d3 +CSEG VE_FORTHWORDLIST 0000051b +CSEG XT_FORTHWORDLIST 00000524 +CSEG PFA_FORTHWORDLIST 00000525 +ESEG CFG_FORTHWORDLIST 0000005a +CSEG VE_SET_ORDER 00000526 +CSEG XT_SET_ORDER 0000052d +CSEG PFA_SET_ORDER 0000052e +CSEG VE_SET_RECOGNIZERS 00000532 +CSEG XT_SET_RECOGNIZERS 0000053c +CSEG PFA_SET_RECOGNIZERS 0000053d +ESEG CFG_RECOGNIZERLISTLEN 0000006e +CSEG VE_GET_RECOGNIZERS 00000541 +CSEG XT_GET_RECOGNIZERS 0000054b +CSEG PFA_GET_RECOGNIZERS 0000054c +CSEG VE_CODE 00000550 +CSEG XT_CODE 00000554 +CSEG PFA_CODE 00000555 +CSEG VE_ENDCODE 0000055b +CSEG XT_ENDCODE 00000561 +CSEG PFA_ENDCODE 00000562 +CSEG VE_MARKER 00000567 +CSEG XT_MARKER 0000056d +CSEG PFA_MARKER 0000056e +ESEG EE_MARKER 0000007a +CSEG VE_POSTPONE 00000571 +CSEG XT_POSTPONE 00000577 +CSEG PFA_POSTPONE 00000578 +CSEG XT_FORTHRECOGNIZER 0000fae7 +CSEG XT_RECOGNIZE 0000faf2 +CSEG VE_2R_FETCH 00000586 +CSEG XT_2R_FETCH 0000058a +CSEG PFA_2R_FETCH 0000058b +SET DPSTART 0000059a +CSEG DO_INTERRUPT 0000f01a +CSEG DO_EXECUTE 0000f010 +CSEG XT_ISREXEC 0000f4bd +CSEG VE_EXIT 0000f022 +CSEG PFA_EXIT 0000f027 +CSEG VE_EXECUTE 0000f02a +CSEG PFA_EXECUTE 0000f031 +CSEG PFA_DOBRANCH 0000f036 +CSEG PFA_DOCONDBRANCH 0000f040 +CSEG PFA_DOLITERAL 0000f047 +CSEG XT_DOVARIABLE 0000f053 +CSEG XT_DOCONSTANT 0000f060 +CSEG XT_DOUSER 0000f066 +CSEG VE_DOVALUE 0000f075 +CSEG XT_DOVALUE 0000f07b +CSEG PFA_DOVALUE 0000f07c +CSEG VE_FETCH 0000f088 +CSEG PFA_FETCH 0000f08c +CSEG PFA_FETCHRAM 0000f08c +CSEG VE_STORE 0000f090 +CSEG PFA_STORE 0000f094 +CSEG PFA_STORERAM 0000f094 +CSEG VE_CSTORE 0000f09c +CSEG PFA_CSTORE 0000f0a0 +CSEG VE_CFETCH 0000f0a7 +CSEG PFA_CFETCH 0000f0ab +CSEG VE_FETCHU 0000f0af +CSEG XT_FETCHU 0000f0b2 +CSEG PFA_FETCHU 0000f0b3 +CSEG XT_UP_FETCH 0000f314 +CSEG VE_STOREU 0000f0b7 +CSEG XT_STOREU 0000f0ba +CSEG PFA_STOREU 0000f0bb +CSEG VE_DUP 0000f0bf +CSEG PFA_DUP 0000f0c4 +CSEG VE_QDUP 0000f0c7 +CSEG PFA_QDUP 0000f0cc +CSEG PFA_QDUP1 0000f0d1 +CSEG VE_SWAP 0000f0d2 +CSEG PFA_SWAP 0000f0d7 +CSEG VE_OVER 0000f0dd +CSEG PFA_OVER 0000f0e2 +CSEG VE_DROP 0000f0e7 +CSEG PFA_DROP 0000f0ec +CSEG VE_ROT 0000f0ef +CSEG PFA_ROT 0000f0f4 +CSEG VE_NIP 0000f0fe +CSEG PFA_NIP 0000f103 +CSEG VE_R_FROM 0000f105 +CSEG PFA_R_FROM 0000f109 +CSEG VE_TO_R 0000f10e +CSEG PFA_TO_R 0000f112 +CSEG VE_R_FETCH 0000f117 +CSEG PFA_R_FETCH 0000f11b +CSEG VE_NOTEQUAL 0000f122 +CSEG PFA_NOTEQUAL 0000f126 +CSEG VE_ZEROEQUAL 0000f129 +CSEG PFA_ZEROEQUAL 0000f12d +CSEG PFA_ZERO1 0000f169 +CSEG PFA_TRUE1 0000f160 +CSEG VE_ZEROLESS 0000f130 +CSEG PFA_ZEROLESS 0000f134 +CSEG VE_GREATERZERO 0000f137 +CSEG PFA_GREATERZERO 0000f13b +CSEG VE_DGREATERZERO 0000f140 +CSEG XT_DGREATERZERO 0000f144 +CSEG PFA_DGREATERZERO 0000f145 +CSEG VE_DXT_ZEROLESS 0000f14e +CSEG XT_DXT_ZEROLESS 0000f152 +CSEG PFA_DXT_ZEROLESS 0000f153 +CSEG VE_TRUE 0000f159 +CSEG PFA_TRUE 0000f15e +CSEG VE_ZERO 0000f163 +CSEG PFA_ZERO 0000f167 +CSEG VE_ULESS 0000f16b +CSEG PFA_ULESS 0000f16f +CSEG VE_UGREATER 0000f176 +CSEG PFA_UGREATER 0000f17a +CSEG VE_LESS 0000f17d +CSEG XT_LESS 0000f180 +CSEG PFA_LESS 0000f181 +CSEG PFA_LESSDONE 0000f185 +CSEG VE_GREATER 0000f187 +CSEG XT_GREATER 0000f18a +CSEG PFA_GREATER 0000f18b +CSEG PFA_GREATERDONE 0000f18f +CSEG VE_LOG2 0000f192 +CSEG XT_LOG2 0000f196 +CSEG PFA_LOG2 0000f197 +CSEG PFA_LOG2_1 0000f19a +CSEG PFA_LOG2_2 0000f1a0 +CSEG VE_MINUS 0000f1a2 +CSEG XT_MINUS 0000f1a5 +CSEG PFA_MINUS 0000f1a6 +CSEG VE_PLUS 0000f1ac +CSEG PFA_PLUS 0000f1b0 +CSEG VE_MSTAR 0000f1b5 +CSEG XT_MSTAR 0000f1b8 +CSEG PFA_MSTAR 0000f1b9 +CSEG VE_UMSLASHMOD 0000f1cf +CSEG PFA_UMSLASHMOD 0000f1d5 +CSEG PFA_UMSLASHMODmod 0000f1da +CSEG PFA_UMSLASHMODmod_loop 0000f1db +CSEG PFA_UMSLASHMODmod_loop_control 0000f1e8 +CSEG PFA_UMSLASHMODmod_subtract 0000f1e5 +CSEG PFA_UMSLASHMODmod_done 0000f1ea +CSEG VE_UMSTAR 0000f1ee +CSEG PFA_UMSTAR 0000f1f3 +CSEG VE_INVERT 0000f20a +CSEG PFA_INVERT 0000f210 +CSEG VE_2SLASH 0000f213 +CSEG PFA_2SLASH 0000f217 +CSEG VE_2STAR 0000f21a +CSEG XT_2STAR 0000f21d +CSEG PFA_2STAR 0000f21e +CSEG VE_AND 0000f221 +CSEG PFA_AND 0000f226 +CSEG VE_OR 0000f22b +CSEG PFA_OR 0000f22f +CSEG VE_XOR 0000f234 +CSEG XT_XOR 0000f238 +CSEG PFA_XOR 0000f239 +CSEG VE_1PLUS 0000f23e +CSEG PFA_1PLUS 0000f242 +CSEG VE_1MINUS 0000f244 +CSEG PFA_1MINUS 0000f248 +CSEG VE_QNEGATE 0000f24a +CSEG XT_QNEGATE 0000f250 +CSEG PFA_QNEGATE 0000f251 +CSEG QNEG1 0000f255 +CSEG XT_NEGATE 0000f65a +CSEG VE_LSHIFT 0000f256 +CSEG XT_LSHIFT 0000f25b +CSEG PFA_LSHIFT 0000f25c +CSEG PFA_LSHIFT1 0000f25f +CSEG PFA_LSHIFT2 0000f264 +CSEG VE_RSHIFT 0000f265 +CSEG XT_RSHIFT 0000f26a +CSEG PFA_RSHIFT 0000f26b +CSEG PFA_RSHIFT1 0000f26e +CSEG PFA_RSHIFT2 0000f273 +CSEG VE_PLUSSTORE 0000f274 +CSEG PFA_PLUSSTORE 0000f278 +CSEG VE_RP_FETCH 0000f284 +CSEG XT_RP_FETCH 0000f288 +CSEG PFA_RP_FETCH 0000f289 +CSEG VE_RP_STORE 0000f28e +CSEG XT_RP_STORE 0000f292 +CSEG PFA_RP_STORE 0000f293 +CSEG VE_SP_FETCH 0000f29b +CSEG XT_SP_FETCH 0000f29f +CSEG PFA_SP_FETCH 0000f2a0 +CSEG VE_SP_STORE 0000f2a4 +CSEG XT_SP_STORE 0000f2a8 +CSEG PFA_SP_STORE 0000f2a9 +CSEG PFA_DODO 0000f2ae +CSEG PFA_DODO1 0000f2b0 +CSEG VE_I 0000f2bb +CSEG PFA_I 0000f2bf +CSEG PFA_DOPLUSLOOP 0000f2cd +CSEG PFA_DOPLUSLOOP_LEAVE 0000f2d7 +CSEG PFA_DOPLUSLOOP_NEXT 0000f2d4 +CSEG PFA_DOLOOP 0000f2dc +CSEG VE_UNLOOP 0000f2e1 +CSEG PFA_UNLOOP 0000f2e7 +CSEG VE_CMOVE_G 0000f2ec +CSEG XT_CMOVE_G 0000f2f1 +CSEG PFA_CMOVE_G 0000f2f2 +CSEG PFA_CMOVE_G1 0000f303 +CSEG PFA_CMOVE_G2 0000f2ff +CSEG VE_BYTESWAP 0000f308 +CSEG PFA_BYTESWAP 0000f30c +CSEG VE_UP_FETCH 0000f310 +CSEG PFA_UP_FETCH 0000f315 +CSEG VE_UP_STORE 0000f319 +CSEG XT_UP_STORE 0000f31d +CSEG PFA_UP_STORE 0000f31e +CSEG VE_1MS 0000f322 +CSEG XT_1MS 0000f326 +CSEG PFA_1MS 0000f327 +CSEG VE_2TO_R 0000f32c +CSEG XT_2TO_R 0000f330 +CSEG PFA_2TO_R 0000f331 +CSEG VE_2R_FROM 0000f33b +CSEG XT_2R_FROM 0000f33f +CSEG PFA_2R_FROM 0000f340 +CSEG VE_STOREE 0000f34a +CSEG PFA_STOREE 0000f34e +CSEG PFA_STOREE0 0000f34e +CSEG PFA_FETCHE2 0000f37c +CSEG PFA_STOREE3 0000f358 +CSEG PFA_STOREE1 0000f363 +CSEG PFA_STOREE4 0000f35f +CSEG PFA_STOREE2 0000f365 +CSEG VE_FETCHE 0000f36e +CSEG PFA_FETCHE 0000f372 +CSEG PFA_FETCHE1 0000f372 +CSEG VE_STOREI 0000f382 +CSEG PFA_STOREI 0000f386 +ESEG EE_STOREI 00000078 +CSEG VE_DO_STOREI_NRWW 0000f389 +CSEG XT_DO_STOREI 0000f390 +CSEG PFA_DO_STOREI_NRWW 0000f391 +CSEG DO_STOREI_atmega 0000f3a5 +CSEG pageload 0000f3b6 +CSEG DO_STOREI_writepage 0000f3af +CSEG dospm 0000f3d2 +EQU pagemask ffffff80 +CSEG pageload_loop 0000f3bc +CSEG pageload_newdata 0000f3ca +CSEG pageload_cont 0000f3cc +CSEG pageload_done 0000f3d1 +CSEG dospm_wait_ee 0000f3d2 +CSEG dospm_wait_spm 0000f3d4 +CSEG VE_FETCHI 0000f3e0 +CSEG PFA_FETCHI 0000f3e4 +CSEG VE_N_TO_R 0000f3ed +CSEG XT_N_TO_R 0000f3f1 +CSEG PFA_N_TO_R 0000f3f2 +CSEG PFA_N_TO_R1 0000f3f4 +CSEG VE_N_R_FROM 0000f3ff +CSEG XT_N_R_FROM 0000f403 +CSEG PFA_N_R_FROM 0000f404 +CSEG PFA_N_R_FROM1 0000f409 +CSEG VE_D2STAR 0000f411 +CSEG XT_D2STAR 0000f415 +CSEG PFA_D2STAR 0000f416 +CSEG VE_D2SLASH 0000f41f +CSEG XT_D2SLASH 0000f423 +CSEG PFA_D2SLASH 0000f424 +CSEG VE_DPLUS 0000f42d +CSEG PFA_DPLUS 0000f431 +CSEG VE_DMINUS 0000f43e +CSEG XT_DMINUS 0000f441 +CSEG PFA_DMINUS 0000f442 +CSEG VE_DINVERT 0000f450 +CSEG XT_DINVERT 0000f456 +CSEG PFA_DINVERT 0000f457 +CSEG VE_UDOT 0000f460 +CSEG PFA_UDOT 0000f464 +CSEG XT_UDDOT 0000f745 +CSEG VE_UDOTR 0000f467 +CSEG XT_UDOTR 0000f46b +CSEG PFA_UDOTR 0000f46c +CSEG XT_UDDOTR 0000f74e +CSEG VE_SHOWWORDLIST 0000f470 +CSEG XT_SHOWWORDLIST 0000f479 +CSEG PFA_SHOWWORDLIST 0000f47a +CSEG XT_SHOWWORD 0000f47f +CSEG XT_TRAVERSEWORDLIST 0000fc72 +CSEG PFA_SHOWWORD 0000f480 +CSEG VE_WORDS 0000f485 +CSEG XT_WORDS 0000f48a +CSEG PFA_WORDS 0000f48b +CSEG VE_INTON 0000f490 +CSEG PFA_INTON 0000f495 +CSEG VE_INTOFF 0000f497 +CSEG XT_INTOFF 0000f49b +CSEG PFA_INTOFF 0000f49c +CSEG VE_INTSTORE 0000f49e +CSEG PFA_INTSTORE 0000f4a3 +CSEG VE_INTFETCH 0000f4a8 +CSEG XT_INTFETCH 0000f4ac +CSEG PFA_INTFETCH 0000f4ad +CSEG VE_INTTRAP 0000f4b2 +CSEG XT_INTTRAP 0000f4b8 +CSEG PFA_INTTRAP 0000f4b9 +CSEG PFA_ISREXEC 0000f4be +CSEG XT_ISREND 0000f4c2 +CSEG PFA_ISREND 0000f4c3 +CSEG PFA_ISREND1 0000f4c5 +CSEG VE_PICK 0000f4c6 +CSEG PFA_PICK 0000f4cb +CSEG VE_DOTSTRING 0000f4d1 +CSEG XT_DOTSTRING 0000f4d4 +CSEG PFA_DOTSTRING 0000f4d5 +CSEG VE_SQUOTE 0000f4d9 +CSEG PFA_SQUOTE 0000f4dd +CSEG PFA_SQUOTE1 0000f4e5 +CSEG VE_FILL 0000f4e6 +CSEG PFA_FILL 0000f4eb +CSEG PFA_FILL2 0000f4f7 +CSEG PFA_FILL1 0000f4f2 +CSEG VE_ENVIRONMENT 0000f4f9 +CSEG XT_ENVIRONMENT 0000f501 +CSEG PFA_ENVIRONMENT 0000f502 +ESEG CFG_ENVIRONMENT 00000056 +CSEG VE_ENVWORDLISTS 0000f503 +CSEG XT_ENVWORDLISTS 0000f50a +CSEG PFA_ENVWORDLISTS 0000f50b +CSEG VE_ENVSLASHPAD 0000f50e +CSEG XT_ENVSLASHPAD 0000f512 +CSEG PFA_ENVSLASHPAD 0000f513 +CSEG XT_PAD 0000f59f +CSEG VE_ENVSLASHHOLD 0000f517 +CSEG XT_ENVSLASHHOLD 0000f51c +CSEG PFA_ENVSLASHHOLD 0000f51d +CSEG VE_ENV_FORTHNAME 0000f521 +CSEG XT_ENV_FORTHNAME 0000f528 +CSEG PFA_EN_FORTHNAME 0000f529 +CSEG VE_ENV_FORTHVERSION 0000f530 +CSEG XT_ENV_FORTHVERSION 0000f536 +CSEG PFA_EN_FORTHVERSION 0000f537 +CSEG VE_ENV_CPU 0000f53a +CSEG XT_ENV_CPU 0000f53e +CSEG PFA_EN_CPU 0000f53f +CSEG XT_ICOUNT 0000f7e7 +CSEG VE_ENV_MCUINFO 0000f543 +CSEG XT_ENV_MCUINFO 0000f549 +CSEG PFA_EN_MCUINFO 0000f54a +CSEG VE_ENVUSERSIZE 0000f54d +CSEG XT_ENVUSERSIZE 0000f552 +CSEG PFA_ENVUSERSIZE 0000f553 +CSEG VE_F_CPU 0000f556 +CSEG PFA_F_CPU 0000f55c +CSEG VE_STATE 0000f561 +CSEG PFA_STATE 0000f567 +DSEG ram_state 0000013d +CSEG VE_BASE 0000f568 +CSEG XT_BASE 0000f56c +CSEG PFA_BASE 0000f56d +CSEG VE_CELLS 0000f56e +CSEG VE_CELLPLUS 0000f574 +CSEG PFA_CELLPLUS 0000f57a +CSEG VE_2DUP 0000f57c +CSEG PFA_2DUP 0000f581 +CSEG VE_2DROP 0000f584 +CSEG PFA_2DROP 0000f58a +CSEG VE_TUCK 0000f58d +CSEG PFA_TUCK 0000f592 +CSEG VE_TO_IN 0000f595 +CSEG PFA_TO_IN 0000f59a +CSEG VE_PAD 0000f59b +CSEG PFA_PAD 0000f5a0 +CSEG VE_EMIT 0000f5a5 +CSEG XT_EMIT 0000f5a9 +CSEG PFA_EMIT 0000f5aa +CSEG XT_UDEFERFETCH 0000fbf7 +CSEG XT_UDEFERSTORE 0000fc03 +CSEG VE_EMITQ 0000f5ad +CSEG XT_EMITQ 0000f5b2 +CSEG PFA_EMITQ 0000f5b3 +CSEG VE_KEY 0000f5b6 +CSEG XT_KEY 0000f5ba +CSEG PFA_KEY 0000f5bb +CSEG VE_KEYQ 0000f5be +CSEG XT_KEYQ 0000f5c2 +CSEG PFA_KEYQ 0000f5c3 +CSEG VE_DP 0000f5c6 +ESEG CFG_DP 00000048 +CSEG VE_EHERE 0000f5cd +ESEG EE_EHERE 0000004c +CSEG VE_HERE 0000f5d6 +CSEG PFA_HERE 0000f5db +ESEG EE_HERE 0000004a +CSEG VE_ALLOT 0000f5de +CSEG PFA_ALLOT 0000f5e4 +CSEG VE_BIN 0000f5e9 +CSEG XT_BIN 0000f5ed +CSEG PFA_BIN 0000f5ee +CSEG VE_DECIMAL 0000f5f2 +CSEG PFA_DECIMAL 0000f5f9 +CSEG VE_HEX 0000f5fe +CSEG XT_HEX 0000f602 +CSEG PFA_HEX 0000f603 +CSEG VE_BL 0000f608 +CSEG XT_BL 0000f60b +CSEG PFA_BL 0000f60c +CSEG VE_TURNKEY 0000f60d +CSEG XT_TURNKEY 0000f613 +CSEG PFA_TURNKEY 0000f614 +ESEG CFG_TURNKEY 00000054 +CSEG VE_SLASHMOD 0000f617 +CSEG XT_SLASHMOD 0000f61b +CSEG PFA_SLASHMOD 0000f61c +CSEG PFA_SLASHMOD_1 0000f627 +CSEG PFA_SLASHMOD_2 0000f62d +CSEG PFA_SLASHMOD_3 0000f630 +CSEG PFA_SLASHMOD_5 0000f63b +CSEG PFA_SLASHMOD_4 0000f63a +CSEG PFA_SLASHMODmod_done 0000f646 +CSEG PFA_SLASHMOD_6 0000f644 +CSEG VE_USLASHMOD 0000f64a +CSEG XT_USLASHMOD 0000f64f +CSEG PFA_USLASHMOD 0000f650 +CSEG VE_NEGATE 0000f655 +CSEG PFA_NEGATE 0000f65b +CSEG VE_SLASH 0000f65e +CSEG XT_SLASH 0000f661 +CSEG PFA_SLASH 0000f662 +CSEG VE_MOD 0000f665 +CSEG XT_MOD 0000f669 +CSEG PFA_MOD 0000f66a +CSEG VE_ABS 0000f66d +CSEG XT_ABS 0000f671 +CSEG PFA_ABS 0000f672 +CSEG VE_MIN 0000f675 +CSEG XT_MIN 0000f679 +CSEG PFA_MIN 0000f67a +CSEG PFA_MIN1 0000f67f +CSEG VE_MAX 0000f681 +CSEG XT_MAX 0000f685 +CSEG PFA_MAX 0000f686 +CSEG PFA_MAX1 0000f68b +CSEG VE_WITHIN 0000f68d +CSEG XT_WITHIN 0000f692 +CSEG PFA_WITHIN 0000f693 +CSEG VE_TOUPPER 0000f69a +CSEG XT_TOUPPER 0000f6a0 +CSEG PFA_TOUPPER 0000f6a1 +CSEG PFA_TOUPPER0 0000f6ac +CSEG VE_TOLOWER 0000f6ad +CSEG XT_TOLOWER 0000f6b3 +CSEG PFA_TOLOWER 0000f6b4 +CSEG PFA_TOLOWER0 0000f6bf +CSEG VE_HLD 0000f6c0 +CSEG XT_HLD 0000f6c4 +CSEG PFA_HLD 0000f6c5 +DSEG ram_hld 0000013f +CSEG VE_HOLD 0000f6c6 +CSEG XT_HOLD 0000f6ca +CSEG PFA_HOLD 0000f6cb +CSEG VE_L_SHARP 0000f6d6 +CSEG XT_L_SHARP 0000f6d9 +CSEG PFA_L_SHARP 0000f6da +CSEG VE_SHARP 0000f6de +CSEG XT_SHARP 0000f6e1 +CSEG PFA_SHARP 0000f6e2 +CSEG XT_UDSLASHMOD 0000f75e +CSEG PFA_SHARP1 0000f6ef +CSEG VE_SHARP_S 0000f6f4 +CSEG XT_SHARP_S 0000f6f7 +CSEG PFA_SHARP_S 0000f6f8 +CSEG NUMS1 0000f6f8 +CSEG VE_SHARP_G 0000f6ff +CSEG XT_SHARP_G 0000f702 +CSEG PFA_SHARP_G 0000f703 +CSEG VE_SIGN 0000f70a +CSEG XT_SIGN 0000f70e +CSEG PFA_SIGN 0000f70f +CSEG PFA_SIGN1 0000f715 +CSEG VE_DDOTR 0000f716 +CSEG XT_DDOTR 0000f71a +CSEG PFA_DDOTR 0000f71b +CSEG XT_DABS 0000fcef +CSEG XT_SPACES 0000f806 +CSEG XT_TYPE 0000f816 +CSEG VE_DOTR 0000f729 +CSEG XT_DOTR 0000f72c +CSEG PFA_DOTR 0000f72d +CSEG VE_DDOT 0000f732 +CSEG XT_DDOT 0000f735 +CSEG PFA_DDOT 0000f736 +CSEG VE_DOT 0000f73a +CSEG PFA_DOT 0000f73e +CSEG VE_UDDOT 0000f741 +CSEG PFA_UDDOT 0000f746 +CSEG VE_UDDOTR 0000f74a +CSEG PFA_UDDOTR 0000f74f +CSEG VE_UDSLASHMOD 0000f759 +CSEG PFA_UDSLASHMOD 0000f75f +CSEG VE_DIGITQ 0000f769 +CSEG XT_DIGITQ 0000f76e +CSEG PFA_DIGITQ 0000f76f +CSEG PFA_DOSLITERAL 0000f789 +CSEG VE_SCOMMA 0000f793 +CSEG PFA_SCOMMA 0000f797 +CSEG PFA_DOSCOMMA 0000f79b +CSEG PFA_SCOMMA2 0000f7ad +CSEG PFA_SCOMMA1 0000f7a7 +CSEG PFA_SCOMMA3 0000f7b4 +CSEG VE_ITYPE 0000f7b6 +CSEG PFA_ITYPE 0000f7bc +CSEG PFA_ITYPE2 0000f7cf +CSEG PFA_ITYPE1 0000f7c7 +CSEG XT_LOWEMIT 0000f7dc +CSEG XT_HIEMIT 0000f7d8 +CSEG PFA_ITYPE3 0000f7d6 +CSEG PFA_HIEMIT 0000f7d9 +CSEG PFA_LOWEMIT 0000f7dd +CSEG VE_ICOUNT 0000f7e2 +CSEG PFA_ICOUNT 0000f7e8 +CSEG VE_CR 0000f7ed +CSEG XT_CR 0000f7f0 +CSEG PFA_CR 0000f7f1 +CSEG VE_SPACE 0000f7f8 +CSEG PFA_SPACE 0000f7fe +CSEG VE_SPACES 0000f801 +CSEG PFA_SPACES 0000f807 +CSEG SPCS1 0000f809 +CSEG SPCS2 0000f810 +CSEG VE_TYPE 0000f812 +CSEG PFA_TYPE 0000f817 +CSEG PFA_TYPE2 0000f821 +CSEG PFA_TYPE1 0000f81c +CSEG VE_TICK 0000f822 +CSEG PFA_TICK 0000f826 +CSEG XT_DT_NULL 0000fb65 +CSEG XT_NOOP 0000fb9a +CSEG PFA_TICK1 0000f837 +CSEG VE_HANDLER 0000f839 +CSEG XT_HANDLER 0000f83f +CSEG PFA_HANDLER 0000f840 +CSEG VE_CATCH 0000f841 +CSEG XT_CATCH 0000f846 +CSEG PFA_CATCH 0000f847 +CSEG VE_THROW 0000f857 +CSEG PFA_THROW 0000f85d +CSEG PFA_THROW1 0000f863 +CSEG VE_CSKIP 0000f870 +CSEG XT_CSKIP 0000f875 +CSEG PFA_CSKIP 0000f876 +CSEG PFA_CSKIP1 0000f877 +CSEG PFA_CSKIP2 0000f884 +CSEG XT_SLASHSTRING 0000f9c0 +CSEG VE_CSCAN 0000f887 +CSEG XT_CSCAN 0000f88c +CSEG PFA_CSCAN 0000f88d +CSEG PFA_CSCAN1 0000f88f +CSEG PFA_CSCAN2 0000f8a1 +CSEG VE_ACCEPT 0000f8a7 +CSEG XT_ACCEPT 0000f8ac +CSEG PFA_ACCEPT 0000f8ad +CSEG ACC1 0000f8b1 +CSEG XT_CRLFQ 0000f8ed +CSEG ACC5 0000f8df +CSEG ACC3 0000f8cf +CSEG ACC6 0000f8cd +CSEG XT_BS 0000f8e5 +CSEG ACC4 0000f8dd +CSEG PFA_ACCEPT6 0000f8d6 +CSEG VE_REFILL 0000f8f8 +CSEG XT_REFILL 0000f8fd +CSEG PFA_REFILL 0000f8fe +CSEG VE_CHAR 0000f901 +CSEG PFA_CHAR 0000f906 +CSEG VE_NUMBER 0000f90a +CSEG XT_NUMBER 0000f90f +CSEG PFA_NUMBER 0000f910 +CSEG XT_QSIGN 0000f953 +CSEG XT_SET_BASE 0000f966 +CSEG PFA_NUMBER0 0000f926 +CSEG XT_TO_NUMBER 0000f984 +CSEG PFA_NUMBER1 0000f948 +CSEG PFA_NUMBER2 0000f93f +CSEG PFA_NUMBER6 0000f940 +CSEG PFA_NUMBER3 0000f93c +CSEG XT_DNEGATE 0000fcfc +CSEG PFA_NUMBER5 0000f94e +CSEG PFA_NUMBER4 0000f94d +CSEG PFA_QSIGN 0000f954 +CSEG PFA_NUMBERSIGN_DONE 0000f95f +CSEG XT_BASES 0000f961 +CSEG PFA_SET_BASE 0000f967 +CSEG SET_BASE1 0000f97c +CSEG SET_BASE2 0000f97d +CSEG VE_TO_NUMBER 0000f97e +CSEG TONUM1 0000f985 +CSEG TONUM3 0000f99c +CSEG TONUM2 0000f990 +CSEG XT_2SWAP 0000fd20 +CSEG VE_PARSE 0000f99d +CSEG PFA_PARSE 0000f9a3 +CSEG VE_SOURCE 0000f9b1 +CSEG PFA_SOURCE 0000f9b7 +CSEG VE_SLASHSTRING 0000f9ba +CSEG PFA_SLASHSTRING 0000f9c1 +CSEG VE_PARSENAME 0000f9c8 +CSEG PFA_PARSENAME 0000f9d0 +CSEG XT_SKIPSCANCHAR 0000f9d3 +CSEG PFA_SKIPSCANCHAR 0000f9d4 +CSEG VE_FINDXT 0000f9e5 +CSEG XT_FINDXT 0000f9eb +CSEG PFA_FINDXT 0000f9ec +CSEG XT_FINDXTA 0000f9f7 +CSEG PFA_FINDXT1 0000f9f6 +CSEG PFA_FINDXTA 0000f9f8 +CSEG XT_SEARCH_WORDLIST 0000fc40 +CSEG PFA_FINDXTA1 0000fa04 +CSEG XT_DEFAULT_PROMPTOK 0000fa05 +CSEG PFA_DEFAULT_PROMPTOK 0000fa06 +CSEG VE_PROMPTOK 0000fa0c +CSEG XT_PROMPTOK 0000fa10 +CSEG PFA_PROMPTOK 0000fa11 +CSEG XT_DEFAULT_PROMPTREADY 0000fa14 +CSEG PFA_DEFAULT_PROMPTREADY 0000fa15 +CSEG VE_PROMPTREADY 0000fa1b +CSEG XT_PROMPTREADY 0000fa20 +CSEG PFA_PROMPTREADY 0000fa21 +CSEG XT_DEFAULT_PROMPTERROR 0000fa24 +CSEG PFA_DEFAULT_PROMPTERROR 0000fa25 +CSEG VE_PROMPTERROR 0000fa36 +CSEG XT_PROMPTERROR 0000fa3b +CSEG PFA_PROMPTERROR 0000fa3c +CSEG VE_QUIT 0000fa3f +CSEG XT_QUIT 0000fa43 +CSEG PFA_QUIT 0000fa44 +CSEG XT_SP0 0000faa4 +CSEG XT_RP0 0000fab1 +CSEG PFA_QUIT2 0000fa4c +CSEG PFA_QUIT4 0000fa52 +CSEG PFA_QUIT3 0000fa64 +CSEG XT_INTERPRET 0000faca +CSEG PFA_QUIT5 0000fa62 +CSEG VE_PAUSE 0000fa67 +CSEG PFA_PAUSE 0000fa6d +DSEG ram_pause 00000141 +CSEG XT_RDEFERFETCH 0000fbe3 +CSEG XT_RDEFERSTORE 0000fbed +CSEG VE_COLD 0000fa70 +CSEG clearloop 0000fa7c +DSEG ram_user1 00000143 +CSEG PFA_WARM 0000fa97 +CSEG VE_WARM 0000fa92 +CSEG XT_WARM 0000fa96 +CSEG XT_INIT_RAM 0000fd6b +CSEG XT_DEFERSTORE 0000fc0e +CSEG VE_SP0 0000faa0 +CSEG PFA_SP0 0000faa5 +CSEG VE_SP 0000faa8 +CSEG XT_SP 0000faab +CSEG PFA_SP 0000faac +CSEG VE_RP0 0000faad +CSEG PFA_RP0 0000fab2 +CSEG XT_DORP0 0000fab5 +CSEG PFA_DORP0 0000fab6 +CSEG VE_DEPTH 0000fab7 +CSEG PFA_DEPTH 0000fabd +CSEG VE_INTERPRET 0000fac3 +CSEG PFA_INTERPRET 0000facb +CSEG PFA_INTERPRET2 0000fadb +CSEG PFA_INTERPRET1 0000fad6 +CSEG VE_FORTHRECOGNIZER 0000fadd +CSEG PFA_FORTHRECOGNIZER 0000fae8 +ESEG CFG_FORTHRECOGNIZER 00000050 +CSEG VE_RECOGNIZE 0000faeb +CSEG PFA_RECOGNIZE 0000faf3 +CSEG XT_RECOGNIZE_A 0000fafd +CSEG PFA_RECOGNIZE1 0000fafc +CSEG PFA_RECOGNIZE_A 0000fafe +CSEG PFA_RECOGNIZE_A1 0000fb0e +CSEG VE_DT_NUM 0000fb12 +CSEG XT_DT_NUM 0000fb17 +CSEG PFA_DT_NUM 0000fb18 +CSEG VE_DT_DNUM 0000fb1b +CSEG XT_DT_DNUM 0000fb21 +CSEG PFA_DT_DNUM 0000fb22 +CSEG XT_2LITERAL 0000fd92 +CSEG VE_REC_NUM 0000fb25 +CSEG XT_REC_NUM 0000fb2b +CSEG PFA_REC_NUM 0000fb2c +CSEG PFA_REC_NONUMBER 0000fb37 +CSEG PFA_REC_INTNUM2 0000fb35 +CSEG VE_REC_FIND 0000fb39 +CSEG XT_REC_FIND 0000fb3f +CSEG PFA_REC_FIND 0000fb40 +CSEG PFA_REC_WORD_FOUND 0000fb48 +CSEG XT_DT_XT 0000fb4f +CSEG VE_DT_XT 0000fb4a +CSEG PFA_DT_XT 0000fb50 +CSEG XT_R_WORD_INTERPRET 0000fb53 +CSEG XT_R_WORD_COMPILE 0000fb57 +CSEG PFA_R_WORD_INTERPRET 0000fb54 +CSEG PFA_R_WORD_COMPILE 0000fb58 +CSEG PFA_R_WORD_COMPILE1 0000fb5d +CSEG VE_DT_NULL 0000fb5f +CSEG PFA_DT_NULL 0000fb66 +CSEG XT_FAIL 0000fb69 +CSEG PFA_FAIL 0000fb6a +CSEG VE_QSTACK 0000fb6d +CSEG PFA_QSTACK 0000fb73 +CSEG PFA_QSTACK1 0000fb7a +CSEG VE_DOT_VER 0000fb7b +CSEG PFA_DOT_VER 0000fb80 +CSEG VE_NOOP 0000fb96 +CSEG PFA_NOOP 0000fb9b +CSEG VE_UNUSED 0000fb9c +CSEG XT_UNUSED 0000fba1 +CSEG PFA_UNUSED 0000fba2 +CSEG VE_TO 0000fba6 +CSEG XT_TO 0000fba9 +CSEG PFA_TO 0000fbaa +CSEG XT_TO_BODY 0000fd8b +CSEG PFA_TO1 0000fbba +CSEG PFA_DOTO 0000fbb5 +CSEG VE_ICELLPLUS 0000fbc0 +CSEG PFA_ICELLPLUS 0000fbc7 +CSEG VE_EDEFERFETCH 0000fbc9 +CSEG PFA_EDEFERFETCH 0000fbd0 +CSEG VE_EDEFERSTORE 0000fbd3 +CSEG PFA_EDEFERSTORE 0000fbda +CSEG VE_RDEFERFETCH 0000fbdd +CSEG PFA_RDEFERFETCH 0000fbe4 +CSEG VE_RDEFERSTORE 0000fbe7 +CSEG PFA_RDEFERSTORE 0000fbee +CSEG VE_UDEFERFETCH 0000fbf1 +CSEG PFA_UDEFERFETCH 0000fbf8 +CSEG VE_UDEFERSTORE 0000fbfd +CSEG PFA_UDEFERSTORE 0000fc04 +CSEG VE_DEFERSTORE 0000fc09 +CSEG PFA_DEFERSTORE 0000fc0f +CSEG VE_DEFERFETCH 0000fc16 +CSEG XT_DEFERFETCH 0000fc1b +CSEG PFA_DEFERFETCH 0000fc1c +CSEG VE_DODEFER 0000fc22 +CSEG XT_DODEFER 0000fc28 +CSEG PFA_DODEFER 0000fc29 +CSEG VE_SEARCH_WORDLIST 0000fc36 +CSEG PFA_SEARCH_WORDLIST 0000fc41 +CSEG XT_ISWORD 0000fc55 +CSEG PFA_SEARCH_WORDLIST1 0000fc4f +CSEG PFA_ISWORD 0000fc56 +CSEG XT_ICOMPARE 0000fca3 +CSEG PFA_ISWORD3 0000fc63 +CSEG VE_TRAVERSEWORDLIST 0000fc67 +CSEG PFA_TRAVERSEWORDLIST 0000fc73 +CSEG PFA_TRAVERSEWORDLIST1 0000fc74 +CSEG PFA_TRAVERSEWORDLIST2 0000fc83 +CSEG VE_NAME2STRING 0000fc85 +CSEG PFA_NAME2STRING 0000fc8e +CSEG VE_NFA2CFA 0000fc93 +CSEG PFA_NFA2CFA 0000fc9a +CSEG VE_ICOMPARE 0000fc9d +CSEG PFA_ICOMPARE 0000fca4 +CSEG PFA_ICOMPARE_SAMELEN 0000fcae +CSEG PFA_ICOMPARE_DONE 0000fcd1 +CSEG PFA_ICOMPARE_LOOP 0000fcb4 +CSEG PFA_ICOMPARE_LASTCELL 0000fcc2 +CSEG PFA_ICOMPARE_NEXTLOOP 0000fcc9 +CSEG VE_STAR 0000fcd4 +CSEG XT_STAR 0000fcd7 +CSEG PFA_STAR 0000fcd8 +CSEG VE_J 0000fcdb +CSEG XT_J 0000fcde +CSEG PFA_J 0000fcdf +CSEG VE_DABS 0000fceb +CSEG PFA_DABS 0000fcf0 +CSEG PFA_DABS1 0000fcf5 +CSEG VE_DNEGATE 0000fcf6 +CSEG PFA_DNEGATE 0000fcfd +CSEG VE_CMOVE 0000fd02 +CSEG XT_CMOVE 0000fd07 +CSEG PFA_CMOVE 0000fd08 +CSEG PFA_CMOVE1 0000fd15 +CSEG PFA_CMOVE2 0000fd11 +CSEG VE_2SWAP 0000fd1b +CSEG PFA_2SWAP 0000fd21 +CSEG VE_REFILLTIB 0000fd26 +CSEG XT_REFILLTIB 0000fd2d +CSEG PFA_REFILLTIB 0000fd2e +CSEG XT_TIB 0000fd49 +CSEG XT_NUMBERTIB 0000fd4f +CSEG VE_SOURCETIB 0000fd39 +CSEG XT_SOURCETIB 0000fd40 +CSEG PFA_SOURCETIB 0000fd41 +CSEG VE_TIB 0000fd45 +CSEG PFA_TIB 0000fd4a +DSEG ram_tib 0000016f +CSEG VE_NUMBERTIB 0000fd4b +CSEG PFA_NUMBERTIB 0000fd50 +DSEG ram_sharptib 000001c9 +CSEG VE_EE2RAM 0000fd51 +CSEG XT_EE2RAM 0000fd56 +CSEG PFA_EE2RAM 0000fd57 +CSEG PFA_EE2RAM_1 0000fd59 +CSEG PFA_EE2RAM_2 0000fd63 +CSEG VE_INIT_RAM 0000fd65 +CSEG PFA_INI_RAM 0000fd6c +ESEG EE_INITUSER 0000007c +CSEG VE_BOUNDS 0000fd74 +CSEG PFA_BOUNDS 0000fd7a +CSEG VE_S2D 0000fd7e +CSEG PFA_S2D 0000fd83 +CSEG VE_TO_BODY 0000fd86 +CSEG VE_2LITERAL 0000fd8c +CSEG PFA_2LITERAL 0000fd93 +CSEG VE_EQUAL 0000fd97 +CSEG PFA_EQUAL 0000fd9b +CSEG VE_ONE 0000fd9e +CSEG PFA_ONE 0000fda2 +CSEG VE_TWO 0000fda3 +CSEG PFA_TWO 0000fda7 +CSEG VE_MINUSONE 0000fda8 +CSEG XT_MINUSONE 0000fdab +CSEG PFA_MINUSONE 0000fdac +SET flashlast 0000fdad +DSEG HERESTART 000001cb +ESEG EHERESTART 000000a0 +ESEG CFG_ORDERLIST 0000005e +ESEG CFG_RECOGNIZERLIST 00000070 +EQU UBRR_VAL 00000019 +EQU BAUD_REAL 0000963d +EQU BAUD_ERROR 00000001 diff --git a/amforth-6.5/appl/eval-pollin/p1284-16.xml b/amforth-6.5/appl/eval-pollin/p1284-16.xml new file mode 100644 index 0000000..b712290 --- /dev/null +++ b/amforth-6.5/appl/eval-pollin/p1284-16.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + Uploading Hexfiles for p1284 - 16 + + + + Writing fuses + + + + diff --git a/amforth-6.5/appl/eval-pollin/p16-8.eep.hex b/amforth-6.5/appl/eval-pollin/p16-8.eep.hex new file mode 100644 index 0000000..c6b7ad6 --- /dev/null +++ b/amforth-6.5/appl/eval-pollin/p16-8.eep.hex @@ -0,0 +1,7 @@ +:10002A00FFFF020F1D018400150552001004540E33 +:0A003A00B7053E00EE1F01003E0076 +:060052000200AB0B970B4E +:10005C007E1F5E00000000005F040F040F04000010 +:10006C000A009800A6006D008800AC0D0000990DE8 +:08007C00990AB80AA80A0C0059 +:00000001FF diff --git a/amforth-6.5/appl/eval-pollin/p16-8.hex b/amforth-6.5/appl/eval-pollin/p16-8.hex new file mode 100644 index 0000000..c9756f7 --- /dev/null +++ b/amforth-6.5/appl/eval-pollin/p16-8.hex @@ -0,0 +1,625 @@ +:020000020000FC +:020004001BD10E +:0200080019D10C +:02000C0017D10A +:0200100015D108 +:0200140013D106 +:0200180011D104 +:02001C000FD102 +:020020000DD100 +:020024000BD1FE +:0200280009D1FC +:02002C0007D1FA +:0200300005D1F8 +:0200340003D1F6 +:0200380001D1F4 +:02003C00FFD0F3 +:02004000FDD0F1 +:02004400FBD0EF +:02004800F9D0ED +:02004C00F7D0EB +:10005000F5D00004000200381500080041546D6519 +:100060006761313607FF3E72782D627566000000C9 +:100070003900082F10917000E0E6F0E0E10FF31D69 +:10008000008313951F7010937000899199910C94BF +:10009000051C06FF6973722D72783200011C3D1C2D +:1000A0002C00981CB11C3D1C0300E01F361C59009D +:1000B000E00A3800201C011C3D1C4E003D1C1600AF +:1000C00013023D1C60003D1C1600541D5D02201CE7 +:1000D00006FF72782D6275664900011C8800361C87 +:1000E0006E003D1C7100981CB11C3D1C60009D1DE4 +:1000F000981CC41C2F1E3D1C0F00131E3D1C7100BC +:100100008D1C201C07FF72783F2D62756600680009 +:10011000011CD80A3D1C7100981C3D1C7000981CE5 +:10012000131D201C07FF74782D706F6C6C0082000B +:10013000011CA600361C99003D1C2C008D1C201CA7 +:1001400008FF74783F2D706F6C6C9200011CD80A08 +:100150003D1C2B00981C3D1C2000131E201C04FF7E +:1001600075627272A0006F1C82003B0C450C06FF8A +:100170002B7573617274AF00011C3D1C98003D1C0F +:100180002A008D1C3D1C06003D1CC0008D1CB300C8 +:10019000B11CF91E3D1C40008D1C3D1C29008D1C0E +:1001A0005B00201C08FF31772E7265736574B70001 +:1001B000D9009A938A93BC9AC498E0ECF3E0319703 +:1001C000F1F71FB7F894C49ABC98E0E8F0E03197D3 +:1001D000F1F786B384FF9FEF1FBFBC98C498E0E49B +:1001E000F3E03197F1F7892F0C94051C07FF317765 +:1001F0002E736C6F7400D200FD00C498BC9A1FB7B8 +:10020000F894ECE0F0E03197F1F78894879510F4DA +:10021000C49ABC98E2E1F0E03197F1F706B304FD2F +:100220008068E6E6F0E03197F1F7C49ABC98E4E024 +:0C023000F0E03197F1F71FBF0C94051CA3 +:040000000C94E10A71 +:10023C000A920FB60A920F900F900A94B02CFF936B +:10024C00EF93E2E7F0E00694E00DF31D00800394D9 +:10025C000082EF91FF9109900FBE0990089502FF63 +:10026C006D2BF600011CEE0D9C01201C03FF756428 +:10027C002A003501011CB11CFF1CE01DD91CC41C3B +:10028C00F61CE01DE11C9D1D201C04FF756D6178A2 +:10029C003C01011CEB055C1D361C5501C41CD91C12 +:1002AC00201C04FF756D696E4B01011CEB05671D6D +:1002BC00361C6101C41CD91C201C011C3D1C008077 +:1002CC00131E1A1D361C6C01E71F201C4B1D201C15 +:1002DC000AFF6E616D653E666C6167735701011CA8 +:1002EC00CB1F3D1C00FF131E201C03FF64322A0091 +:1002FC006E01800109911991000F111F881F991F20 +:10030C001A930A930C94051C03FF64322F007B0193 +:10031C008F010991199195958795179507951A93C2 +:10032C000A930C94051C02FF642B8A019D012991F0 +:10033C003991E990F99049915991240F351F8E1DEF +:10034C009F1D3A932A930C94051C02FF642D99016E +:10035C00AF0129913991E990F99049915991421B3A +:10036C00530BE80AF90A5A934A93C7010C94051CDB +:10037C0007FF64696E7665727400AB01C501099163 +:10038C00199180959095009510951A930A930C9459 +:10039C00051C02FF752EBE01011C541DB107201C4B +:1003AC0003FF752E7200CF01011C541DC41CBA072B +:1003BC00201C0DFF73686F772D776F72646C6973F7 +:1003CC007400D601011C3D1CEE01C41CDE0C201C6B +:1003DC00011CF90C270869084B1D201C05FF776FC1 +:1003EC0072647300DF01011C3D1C42005F1FE801B9 +:1003FC00201C04FF2B696E74F401040278940C9495 +:10040C00051C04FF2D696E74FF010C02F8940C940A +:10041C00051C04FF696E74210702011C3D1C0000C1 +:10042C009D1D3B1F201C04FF696E74400F02011CB4 +:10043C003D1C00009D1D5F1F201C08FF696E742D64 +:10044C007472617019022A02B82E899199910C94D8 +:10045C00051C011C1D022A1C3402201C350202D072 +:10046C000C94051C189504FF7069636B2302011C26 +:10047C002F1EDD058D1E9D1D791C201C02002E22B9 +:10048C003902011C4F02A3022708201C0200732210 +:10049C004402011C3D1C22000E0AD005791C361C9E +:1004AC005802CF02201C04FF66696C6C4C02011CC4 +:1004BC00E11CE11CB91C361C6A02E50D9B1EB11C2B +:1004CC00AC1E8D1CC91E6502D91C201C06FF6E6556 +:1004DC00776573745902481C870006FF6C6174655C +:1004EC0073746C02481C8B0008FF2863726561747E +:1004FC0065297302011C3B0AD703B11C7102E30589 +:10050C00811CBC037102811C201C01005C007A025E +:10051C00011C220AF01C0406811C201C010028006E +:10052C008B02011C3D1C29000E0AF405201C07FF40 +:10053C00636F6D70696C65009402011CF61CB11C34 +:10054C00320CFF1CCB1FAE02201C01FF2C009D02A5 +:10055C00011C3406731F34062F1E200C3506201C7C +:10056C0003005B275D00AB02011C9108C402201C38 +:10057C0007006C69746572616C00B602011CA30201 +:10058C003D1CAE02201C0800736C69746572616CB2 +:10059C00BE02011CA302F4070208201C011C340635 +:1005AC00A302FFFF201C011CDE0B3406C41C731FAE +:1005BC00201C011C3406201C011CDE0BAE02201C6E +:1005CC000500616865616400C902011CA3022F1C4F +:1005DC00D402201C02006966E602011CA302361C30 +:1005EC00D402201C0400656C7365F002011CA3028C +:1005FC002F1CD402C41CD902201C04007468656E24 +:10060C00F802011CD902201C0500626567696E00A6 +:10061C000303011CDF02201C05007768696C650070 +:10062C000A03011CF302C41C201C060072657065D1 +:10063C0061741203011C34030703201C0500756E42 +:10064C0074696C001B03011C3D1C361CAE02E202DB +:10065C00201C0500616761696E002403011CA30264 +:10066C002F1CE202201C0200646F2F03011CA3024A +:10067C009B1EDF02541D9703201C04006C6F6F70CF +:10068C003903011CA302C91E7E03201C05002B6C20 +:10069C006F6F70004303011CA302BA1E7E03201C63 +:1006AC0005006C65617665004C03011CA302D41E29 +:1006BC00EB029703201C03003F646F005603011CE0 +:1006CC00A3026D03F3023C03C41C9703201C011C02 +:1006DC00EB05E01FB11CFF1C361C7503F405F61C62 +:1006EC00FD1D201C07FF656E646C6F6F700061034D +:1006FC00011CE2028B03B91C361C870307032F1C59 +:10070C008003201C02FF6C3E7803011CAA03791C99 +:10071C00791C3D1CFEFFAA03651E201C02FF3E6CCB +:10072C008803011CEC1FAA03651EAA03791C811CFB +:10073C00201C03FF6C70300094036F1C36003B0CC4 +:10074C00450C02FF6C709F03481C8D0006FF637202 +:10075C0065617465A703011C8002E003A302521CAF +:10076C00201C06FF686561646572AC03011C3406CD +:10077C00FF1CFF1CB11C281D361CCE03B11C3D1CDC +:10078C0000FF1C1E0608F61C5F1FAE02F61C201C88 +:10079C003D1CF0FFC80807FF776C73636F70650032 +:1007AC00B7039A0C32003B0C450C06FF726576655C +:1007BC00616CD103011C7102E305791CB91C361C58 +:1007CC00EB037102791CC41C3B1F201C0500646FD9 +:1007DC0065733E00DB03011CA3020404A3020E9408 +:1007EC00A302F903201C9A938A93CB0101967F9163 +:1007FC006F91BF93AF93DB010C94051C011CF61C8D +:10080C007102E305791C5F1F050D731F201C01FF8E +:10081C003A00EC03011C80021B04D91C201C07FFAE +:10082C003A6E6F6E616D65000D04011C3406B11CCF +:10083C007802811CA302011C3004201C01003B0027 +:10084C001504011CA302201C3804E003201C01FF2A +:10085C005D002404011CE71FD005811C201C010035 +:10086C005B002D04011C541DD005811C201C08FFAD +:10087C007661726961626C653504011C45064F0432 +:10088C00EC1F4E06201C08FF636F6E7374616E7450 +:10089C003D04011C8002E003A302481CAE02201C94 +:1008AC0004FF757365724904011C8002E003A30206 +:1008BC00581CAE02201C07007265637572736500CC +:1008CC005604011C7802791CAE02201C09FF696DCC +:1008DC006D656469617465006104011C15055F1F19 +:1008EC00B11CCB1F3D1CFF7F131EC41C731F201C8F +:1008FC0006005B636861725D6C04011CA3023D1C05 +:10090C007109AE02201C060061626F7274227E04B3 +:10091C00011C4F02A302A004201C05FF61626F7230 +:10092C0074008904011C4B1DC80806FF3F61626FEF +:10093C0072749304011CE11C361CA604270898044D +:10094C00F405201C09FF6765742D737461636B00DB +:10095C009B04011CB11CE305C41C5F1FB11CFF1CD4 +:10096C00541DC41C6D03361CC6049B1EAC1E351EC8 +:10097C00DD05CF1C9D1D5F1FC41C4B1DBA1EBC0486 +:10098C00F405F61C201C09FF7365742D73746163E8 +:10099C006B00A804011CCF1C211D361CD8043D1C67 +:1009AC00FCFFC808EB053B1FC41C541D6D03361C13 +:1009BC00E5049B1EE305FC053B1FC91EE004D91C86 +:1009CC00201C09FF6D61702D737461636B00C90489 +:1009DC00011CB11CE305C41C5F1FDD05E50D6D0397 +:1009EC00361C0A059B1EAC1E5F1FC41CFF1C081D79 +:1009FC002A1CB91C361C0605F61CD91CD41E201C3E +:100A0C00F61CEC1FBA1EF904D91C541D201C0BFF3C +:100A1C006765742D63757272656E7400E704011C52 +:100A2C003D1C3C005F1F201C09FF6765742D6F7215 +:100A3C00646572000D05011C3D1C4000AF04201CB8 +:100A4C0009FF6366672D6F72646572001A05481C96 +:100A5C00400007FF636F6D706172650026053605F7 +:100A6C00BF93AF938C0189919991DC0189919991F4 +:100A7C009C0189919991FC01ED90F190EF1451F446 +:100A8C000A9519F02A95C1F701C02A95022B11F489 +:100A9C00882702C08FEF00C0982FAF91BF910C94A4 +:100AAC00051C07FF6E66613E6C6661002F05011C1C +:100ABC00F90C2F1E041E9D1D201C0BFF656E766904 +:100ACC00726F6E6D656E74005705481C3A0009FF15 +:100ADC00776F72646C69737473000000011C3D1CA9 +:100AEC000800201C04FF2F7061646D05011C8D1E15 +:100AFC000A06931D201C05FF2F686F6C6400780597 +:100B0C00011C0A064506931D201C0AFF666F7274B1 +:100B1C00682D6E616D658105011CF4070700616D20 +:100B2C00666F72746800201C07FF76657273696FBC +:100B3C006E008B05011C3D1C4100201C03FF6370E3 +:100B4C0075009A05011C3D1C2D005308201C08FF44 +:100B5C006D63752D696E666FA405011C3D1C290023 +:100B6C00201C05FF2F7573657200AD05011C3D1C23 +:100B7C002C00201C05FF665F637075006305011C6B +:100B8C003D1C00123D1C7A00201C05FF737461741F +:100B9C006500C005481C8F0004FF62617365CB05BE +:100BAC00581C0C0005FF63656C6C7300D2050C1EA1 +:100BBC0005FF63656C6C2B00D805E40502960C945C +:100BCC00051C04FF32647570DE05011CCF1CCF1CA4 +:100BDC00201C05FF3264726F7000E705011CD91CE4 +:100BEC00D91C201C04FF7475636BEF05011CC41C1D +:100BFC00CF1C201C03FF3E696E00F805581C180022 +:100C0C0003FF706164000006011C45063D1C2800B2 +:100C1C009D1D201C04FF656D697406069A0C0E0060 +:100C2C00630C6F0C05FF656D69743F0010069A0C20 +:100C3C001000630C6F0C03FF6B65790018069A0C9F +:100C4C001200630C6F0C04FF6B65793F21069A0C44 +:100C5C001400630C6F0C02FF647029066F1C2C00CF +:100C6C003B0C450C05FF65686572650031066F1C11 +:100C7C0030003B0C450C04FF6865726538066F1C30 +:100C8C002E003B0C450C05FF616C6C6F740041062B +:100C9C00011C45069D1D200C4606201C03FF6269A5 +:100CAC006E004906011CEC1FD605811C201C07FF99 +:100CBC00646563696D616C005406011C3D1C0A007F +:100CCC00D605811C201C03FF686578005D06011C9D +:100CDC003D1C1000D605811C201C02FF626C6906AD +:100CEC00481C200007FF7475726E6B6579007306E3 +:100CFC009A0C38003B0C450C04FF2F6D6F64780682 +:100D0C0087069C0109911991412F432717FF04C0B5 +:100D1C00109500950F5F1F4F37FF04C0309520953D +:100D2C002F5F3F4FEE24FF1851E1001F111F5A9502 +:100D3C0039F447FF04C0109500950F5F1F4F0BC08F +:100D4C00EE1CFF1CE21AF30A20F4E20EF31E889448 +:100D5C00ECCF0894EACFFA92EA92C8010C94051CE5 +:100D6C0005FF752F6D6F64008206011CFF1C541D5E +:100D7C00F61CC21D201C06FF6E6567617465B60605 +:100D8C00011CFD1D2F1E201C01FF2F00C106011C84 +:100D9C008606F01C201C03FF6D6F6400CA06011C44 +:100DAC008606D91C201C03FF61627300D106011C4E +:100DBC00B11C3E1E201C03FF6D696E00D906011C80 +:100DCC00EB05781D361CEB06C41CD91C201C03FF3C +:100DDC006D617800E106011CEB056E1D361CF706F3 +:100DEC00C41CD91C201C06FF77697468696EED065B +:100DFC00011CCF1C931DFF1C931DF61C5C1D201C9D +:100E0C0007FF746F757070657200F906011CB11CD8 +:100E1C003D1C61003D1C7B00FE06361C18073D1C6A +:100E2C00DF00131E201C07FF746F6C6F7765720058 +:100E3C000607011CB11C3D1C41003D1C5B00FE065D +:100E4C00361C2B073D1C20001C1E201C03FF686C4D +:100E5C0064001907481C910004FF686F6C642C0730 +:100E6C00011C3007B11C791C351EB11CFF1CC41CA5 +:100E7C00811CF61C8D1C201C02FF3C233207011C1C +:100E8C000A063007811C201C01FF23004207011CAD +:100E9C00D605791CCA07E11C3D1C0900CF1C6E1D30 +:100EAC00361C5B073D1C07009D1D3D1C30009D1D25 +:100EBC003607201C02FF23734A07011C4D07EB0564 +:100ECC001C1E1A1D361C6407201C02FF233E6007E3 +:100EDC00011CF4053007791C0A06CF1C931D201C3D +:100EEC0004FF7369676E6B07011C211D361C81079B +:100EFC003D1C2D003607201C03FF642E7200760764 +:100F0C00011CFF1CFC055B0D45076307E11C7A0700 +:100F1C006E07F61CCF1C931D72088208201C02FF62 +:100F2C002E728207011CFF1CEE0DF61C8607201C7E +:100F3C0002FF642E9507011C541D86076908201CAE +:100F4C0001FF2E009E07011CEE0DA107201C03FFC4 +:100F5C0075642E00A607011C541DBA076908201CD5 +:100F6C0004FF75642E72AD07011CFF1C4507630757 +:100F7C006E07F61CCF1C931D72088208201C06FFFE +:100F8C0075642F6D6F64B607011CFF1C541D081D82 +:100F9C00C21DF61CC41CFF1CC21DF61C201C06FF27 +:100FAC0064696769743FC507011C0C07B11C3D1CC3 +:100FBC003900781D3D1C0001131E9D1DB11C3D1CEC +:100FCC004001781D3D1C0701131E931D3D1C300074 +:100FDC00931DB11CD605791C5C1D201C011C081D21 +:100FEC005308F61CCF1C2F1E041E9D1D2F1EFF1C0C +:100FFC00201C02FF732CD507011CB11C0608201CF9 +:10100C00011CAE02B11C041EFC050B1E931DFF1C23 +:10101C00541D6D03361C19089B1EB11C791CAE02A5 +:10102C00E305C91E1308F61C281D361C2008B11C2C +:10103C00981CAE02D91C201C05FF697479706500E0 +:10104C00FF07011CB11C041EFC050B1E931DFF1C8D +:10105C00541D6D03361C3B089B1EB11CCB1FB11CD1 +:10106C00480844082F1EC91E3308F61C281D361CC0 +:10107C004208B11CCB1F4808D91C201C011CF91EAE +:10108C004808201C011C3D1CFF00131E1406201CCC +:10109C0006FF69636F756E742208011CB11C2F1E4C +:1010AC00C41CCB1F201C02FF63724E08011C3D1C8C +:1010BC000D0014063D1C0A001406201C05FF73705D +:1010CC00616365005908011C76061406201C06FF96 +:1010DC007370616365736408011C541DF106B11CC7 +:1010EC00361C7C086908351E2F1C7508D91C201C61 +:1010FC0004FF747970656D08011CE50D6D03361CD9 +:10110C008D089B1EAC1E981C1406C91E8808201C3A +:10111C0001FF27007E08011C3B0A600B360BB11C3B +:10112C00D10BE01FC41CCB1F3D1C060CE01F1C1E6A +:10113C00361CA3083D1CF3FFC808D91C201C07FF54 +:10114C0068616E646C6572008E08581C0A0005FF9D +:10115C00636174636800A508011C8D1EFF1CAB083D +:10116C00791CFF1C761EAB08811C2A1CF61CAB08D4 +:10117C00811CF61CD91C541D201C05FF7468726F51 +:10118C007700AD08011CB11C1A1D361CCF08D91CE8 +:10119C00201CAB08791C801EF61CAB08811CF61CAD +:1011AC00C41CFF1C961ED91CF61C201C05FF637367 +:1011BC006B697000C308011CFF1CB11C361CF008C5 +:1011CC00CF1C981C081DE01F361CF008E71F2C0ACA +:1011DC002F1CE308F61CD91C201C05FF63736361EC +:1011EC006E00DC08011CFF1CCF1CB11C981C081DD8 +:1011FC00E01F1A1D361C0D09C41C351EC41CCF1C47 +:10120C00211D1A1D361C0D092F1E2F1CFB08F01C4E +:10121C00CF1C931DF61CD91C201C06FF6163636553 +:10122C007074F308011CCF1C9D1D351ECF1C2506A8 +:10123C00B11C59091A1D361C4B09B11C3D1C080068 +:10124C00E01F361C3B09D91CE11CEB05781DFF1C6B +:10125C00E11CE11CF61C361C39095109351EFF1C1A +:10126C00CF1CF61C4F012F1C4909B11C76066E1DB4 +:10127C00361C4209D91C7606B11C1406CF1C8D1CD9 +:10128C002F1ECF1C5B012F1C1D09D91CF01CC41C6C +:10129C00931D5C08201C011C3D1C0800B11C14068D +:1012AC0069081406201C011CB11C3D1C0D00E01F1C +:1012BC00C41C3D1C0A00E01F1C1E201C06FF72658E +:1012CC0066696C6C13099A0C1A00630C6F0C04FFA2 +:1012DC00636861726409011C3B0AD91C981C201CB0 +:1012EC0006FF6E756D6265726D09011CD605791C61 +:1012FC00FF1CBF09FF1CD209BF09F61C1C1EFF1CDA +:10130C00B11C1A1D361C9209F405F61CD91CF61CCE +:10131C00D605811C541D201C1E1F541D541D2D1F31 +:10132C00F009B91C361CB409E71FE01F361CAB09C9 +:10133C00981C3D1C2E00E01F361CAC09F61C361CFC +:10134C00A809680DEC1F2F1CBA09D91CF405F61C52 +:10135C00D91CF61CD605811C541D201CF405F61C4A +:10136C00361CB909C606E71FF61CD605811C4B1D99 +:10137C00201C011CCF1C981C3D1C2D00E01FB11C17 +:10138C00FF1C361CCB09E71F2C0AF61C201C521C18 +:10139C000A00100002000A00011CCF1C981C3D1C06 +:1013AC002300931DB11C541D3D1C0400FE06361C6D +:1013BC00E809CD099D1DCB1FD605811CE71F2C0A02 +:1013CC002F1CE909D91C201C07FF3E6E756D626548 +:1013DC0072007609011CB11C361C080ACF1C981C23 +:1013EC00DA071A1D361CFC09D91C201CFF1C8C0D9D +:1013FC00D605791C4001F61C38018C0DE71F2C0A10 +:10140C002F1CF109201C05FF706172736500EA093D +:10141C00011CFF1C220A0406791C2C0AF61CF80875 +:10142C00B11C2F1E0406651EE71F2C0A201C06FF8C +:10143C00736F75726365090A9A0C1600630C6F0C56 +:10144C0007FF2F737472696E67001D0A011CE11C83 +:10145C00CF1C9D1DE11CE11C931D201C0AFF70611B +:10146C007273652D6E616D65260A011C76063F0A46 +:10147C00201C011CFF1C220A0406791C2C0A081DC6 +:10148C00E108F61CF808EB059D1D220AD91C931DDA +:10149C000406811C201C07FF66696E642D7874009D +:1014AC00340A011C3D1C630A3D1C4000EE041A1D4D +:1014BC00361C620AF405541D201C011CFF1CEB0594 +:1014CC00F61CAC0CB11C361C700AFF1CF01CF01C7A +:1014DC00F61C4B1D201C04FF71756974510A011C0C +:1014EC00A303AA03811C100B961E1D0B801E38042F +:1014FC00D005791C1A1D361C840AB40A6909361CDD +:10150C00960A3D1C6B0BB208B91C361C960AB11C12 +:10151C003D1CFEFF6E1D361C940ACF0A2F1C760A4A +:10152C00A40A2F1C7E0A011CF4070300206F6B0019 +:10153C002708201C03FF2E6F6B00710A9A0C1C00ED +:10154C00630C6F0C011CF40702003E205C0827089A +:10155C00201C06FF2E7265616479A00A9A0C20008B +:10156C00630C6F0C011CF4070400203F3F2027087C +:10157C00D605791CFF1C6306A9070406791CA9076C +:10158C00F61CD605811C201C06FF2E6572726F722C +:10159C00AF0A9A0C1E00630C6F0C05FF706175731B +:1015AC006500CA0A9A0C93004F0C590C04FF636F28 +:1015BC006C64D30AE10AA4B622243324BB2424BECF +:1015CC00E0E6F0E02192E036E9F7F430D9F7E5E90E +:1015DC00F0E02F010FE50DBF048314E01EBF15834F +:1015EC00CFE0C683D4E0D783A3E0BBE00C94051C0A +:1015FC0004FF7761726DDC0A011CD70D3D1C060CD3 +:10160C003D1CD80A7A0C38047E06750A03FF7370E9 +:10161C003000FE0A6F1C0600630C6F0C02FF737027 +:10162C000C0B581C080003FF72703000140B011CCB +:10163C00210B791C201C581C040005FF6465707478 +:10164C006800190B011C100B8D1E931D041E351EFA +:10165C00201C09FF7265636F676E697A6500230B46 +:10166C00011C3D1C410BC41CEE041A1D361C400B06 +:10167C00F405D10B201C011CE11CE11CEB051E1F09 +:10168C00E11C2A1C2D1FE11CB11CD10BE01F361CC8 +:10169C00520BD91C541D201CF01CF01C4B1D201C83 +:1016AC0010FF666F7274682D7265636F676E697A6E +:1016BC0065722F0B6F1C34003B0C450C09FF696ED7 +:1016CC007465727072657400560B011C3B0AB11C78 +:1016DC00361C7C0B600B360BD005791C361C770B3B +:1016EC00320CCB1F2A1CDE0B2F1C6C0BF405201CA0 +:1016FC0006FF64743A6E756D640B521C060CC402C2 +:10170C00C40207FF64743A646E756D007E0B521C44 +:10171C00060CD81FD81F07FF7265633A6E756D00F3 +:10172C00870B011C7B09361CA30BE71FE01F361C23 +:10173C00A10B830B201C8D0B201CD10B201C08FF34 +:10174C007265633A66696E64910B011C570AB11C91 +:10175C001A1D361CB40BD91CD10B201CBB0B201C26 +:10176C0005FF64743A787400A50B521CBF0BC30BB5 +:10177C00D81F011CD91C2A1C201C011C211D361C25 +:10178C00C90BAE02201C2A1C201C07FF64743A6E85 +:10179C00756C6C00B60B521CD50BD50BD50B011C04 +:1017AC003D1CF3FFC80806FF3F737461636BCB0BE2 +:1017BC00011C280B211D361CE60B3D1CFCFFC80828 +:1017CC00201C03FF76657200D90B011C92052708BB +:1017DC006908D605791CA0056306EE0D45074D0773 +:1017EC003D1C2E00360763076E078208D605811C48 +:1017FC006908A8052708201C04FF6E6F6F70E70BA3 +:10180C00011C201C06FF756E75736564020C011CAF +:10181C008D1E4506931D201C0200746F080C011CC4 +:10182C009108F70DD005791C361C260CA302200C50 +:10183C00AE02201C011CF61CB11C320CFF1CCB1F71 +:10184C00B11C320C320CCB1F2A1C201C07FF692D3B +:10185C0063656C6C2B00120C011C2F1E201C07FFE7 +:10186C0045646566657240002C0C011CCB1F5F1F24 +:10187C00201C07FF4564656665722100350C011C50 +:10188C00CB1F3B1F201C07FF52646566657240002E +:10189C003F0C011CCB1F791C201C07FF5264656692 +:1018AC0065722100490C011CCB1F811C201C07FFF9 +:1018BC005564656665724000530C011CCB1F021FFA +:1018CC009D1D791C201C07FF5564656665722100FF +:1018DC005D0C011CCB1F021F9D1D811C201C06FFD3 +:1018EC00646566657221690C011CF70DB11C320C24 +:1018FC00320CCB1F2A1C201C06FF646566657240E7 +:10190C00750C011CF70DB11C320CCB1F2A1C201CB2 +:10191C0007FF2864656665722900820C011C800231 +:10192C00E003A3029A0C201C0E94F903B11C320C98 +:10193C00CB1F2A1C2A1C201C0FFF73656172636865 +:10194C002D776F72646C697374008E0C011CFF1C14 +:10195C00541D3D1CC10CF61CDE0CB11C1A1D361C92 +:10196C00BB0CF405D91C541D201CB11C050DC41C4A +:10197C0075016301201C011CFF1CD91CEB05081D03 +:10198C00F90C0F0D361CCF0CF61CD91C541D4B1D1D +:10199C00201CF405F61C541D201C11FF747261767A +:1019AC00657273652D776F72646C69737400A20C29 +:1019BC00011C5F1FB11C361CEF0CEB051E1FC41C59 +:1019CC002A1C2D1FE11C361CEF0C5D05CB1F2F1C98 +:1019DC00E00CF405201C0BFF6E616D653E73747298 +:1019EC00696E6700D30C011C53083D1CFF00131ECD +:1019FC00201C07FF6E66613E63666100F10C011CE2 +:101A0C005D052F1E201C08FF69636F6D7061726588 +:101A1C00FF0C011CFF1CCF1CF61C131D361C1A0DD1 +:101A2C00F405D91C4B1D201CC41C541D6D03361C05 +:101A3C003D0D9B1ECF1C791CCF1CCB1FB11C3D1C1C +:101A4C0000015C1D361C2E0DC41C3D1CFF00131E1A +:101A5C00131D361C350DF4054B1DD41E201C2F1EDA +:101A6C00C41CE305C41C3D1C0200BA1E200DF40569 +:101A7C00541D201C01FF2A00090D011CA61DD91C98 +:101A8C00201C01FF6A00400D011C761E3D1C070046 +:101A9C009D1D791C761E3D1C09009D1D791C9D1DEC +:101AAC00201C04FF64616273470D011CB11C211DD5 +:101ABC00361C610D680D201C07FF646E6567617430 +:101ACC006500570D011CC401E71F541D9C01201C0F +:101ADC0005FF636D6F766500620D740DBF93AF9358 +:101AEC00E991F991A991B991092F082B21F01D9138 +:101AFC0011930197E1F7AF91BF91899199910C9452 +:101B0C00051C05FF3273776170006E0D011CE11C22 +:101B1C00FF1CE11CF61C201C0AFF726566696C6CCC +:101B2C002D746962870D011CB50D3D1C5A001809F6 +:101B3C00BB0D811C541D0406811C4B1D201C0AFF6F +:101B4C00736F757263652D746962920D011CB50D0E +:101B5C00BB0D791C201C03FF74696200A50D481C89 +:101B6C00C10004FF23746962B10D481C1B0106FF00 +:101B7C0065653E72616DB70D011C541D9B1ECF1C1B +:101B8C005F1FCF1C811CE305C41CE305C41CC91ECC +:101B9C00C50DF405201C08FF696E69742D72616D0A +:101BAC00BD0D011C3D1C6000021F3D1C2200041ECB +:101BBC00C20D201C06FF626F756E6473D10D011C83 +:101BCC00CF1C9D1DC41C201C03FF733E6400E00D44 +:101BDC00011CB11C211D201C05FF3E626F647900A5 +:101BEC00EA0D301E02FF2E73F20D011C280BD201E0 +:101BFC006908280B541D6D03361C0A0E9B1EAC1E67 +:101C0C003D02D201C91E050E201C06FF6321407344 +:101C1C007069F80D110E03D099270C94051C8FB91F +:101C2C000EB1087F0EB90EB107FFFACF8FB1089530 +:101C3C0005FF6E40737069000B0E240E8C018991A8 +:101C4C009991FC01C8012FB82EB127FFFDCF2FB100 +:101C5C0021930197C1F7899199910C94051C05FF6B +:101C6C006E21737069001E0E3B0E8C018991999147 +:101C7C00FC01C80121912FB92EB127FFFDCF2FB147 +:101C8C000197C1F7899199910C94051C0BFF617018 +:101C9C00706C7475726E6B657900350E011CBC002E +:101CAC000302EB0B6908C5053D1CE803C21DF01CC3 +:101CBC006306A907F40704006B487A202708201C48 +:101CCC000BFF7365742D63757272656E74004C0E28 +:101CDC00011C3D1C3C003B1F201C08FF776F7264ED +:101CEC006C697374660E011C3D06541DCF1C3B1FA2 +:101CFC00B11CE305200C3E06201C0EFF666F7274AF +:101D0C00682D776F72646C697374730E481C3E0097 +:101D1C0009FF7365742D6F7264657200830E011C6C +:101D2C003D1C4000D004201C0FFF7365742D7265A0 +:101D3C00636F676E697A657273008E0E011C3D1CB1 +:101D4C005200D004201C0FFF6765742D7265636F01 +:101D5C00676E697A657273009A0E011C3D1C520005 +:101D6C00AF04201C04FF636F6465A90E011C800284 +:101D7C00E0033406320CAE02201C08FF656E642DA5 +:101D8C00636F6465B80E011CA3020C94A302051CBE +:101D9C00201C08FF286D61726B657229C30E6F1CC5 +:101DAC005E003B0C450C0800706F7374706F6E65B1 +:101DBC00CF0E011C3B0A600B360BB11CFF1C320C06 +:101DCC00320CCB1F2A1CF61C320CCB1FAE02201C73 +:101DDC0003FF32724000D90EF30E9A938A93EF915F +:101DEC00FF918F919F919F938F93FF93EF939A9372 +:081DFC008A93CF010C94051C31 +:10380200BF93AF93DB011196B21469F4FD01EE0F81 +:10381200FF1F659175911196FB01EE0FFF1F059138 +:103822001591F80109949A938A938B2D9927BB24B9 +:103832006FE272E0F1CF04FF65786974EE0E211C2D +:10384200AF91BF91E1CF07FF65786563757465003D +:103852001C1C2B1CBC0189919991DECF301CFD01EF +:10386200EE0FFF1FA591B591CFCF371C982B8991F1 +:103872009991A9F31196C8CF3E1C9A938A93FD01A0 +:10388200EE0FFF1F859195911196BECF481C9A931A +:103892008A93FB013196EE0FFF1F85919591B4CF6C +:1038A200521C9A938A93CB010196AECF581C9A93DD +:1038B2008A93FB013196EE0FFF1F85919591840D3E +:1038C200951DA2CF07FF2876616C75652900241C1F +:1038D200011C8002E003A3026F1C201C0E94F9035A +:1038E200B11C320CCB1F2A1C201C01FF4000631CA0 +:1038F2007A1CFC018191919187CF01FF2100761CF6 +:10390200821CFC018991999191838083899199917B +:103912007BCF02FF63217E1C8E1CFC018991999151 +:1039220080838991999170CF02FF63408A1C991C10 +:10393200FC019927808168CF02FF4075951C011C0C +:10394200021F9D1D791C201C02FF21759D1C011C5C +:10395200021F9D1D811C201C03FF64757000A51CA5 +:10396200B21C9A938A9350CF04FF3F647570AD1CCA +:10397200BA1C082F092B11F09A938A9345CF04FFA2 +:1039820073776170B51CC51C8C01899199911A934A +:103992000A933ACF04FF6F766572C01CD01C9A93CB +:1039A2008A938A819B8130CF04FF64726F70CB1C33 +:1039B200DA1C8991999128CF03FF726F7400D51C8C +:1039C200E21C8C0129913991899199913A932A9318 +:1039D2001A930A9319CF03FF6E697000DD1CF11C64 +:1039E200229612CF02FF723EEC1CF71C9A938A9326 +:1039F2008F919F9109CF02FF3E72F31C001D9F938E +:103A02008F938991999100CF02FF7240FC1C091D8E +:103A12009A938A938F919F919F938F93F5CE02FFF2 +:103A22003C3E051D011CE01F1A1D201C02FF303DFB +:103A3200101D1B1D982BD1F530C002FF303C171D05 +:103A4200221D97FD2AC032C002FF303E1E1D291DD5 +:103A5200821593055CF151F120C003FF64303E00F2 +:103A6200251D331D82159305899199918205930530 +:103A7200ECF0E1F012C003FF64303C002E1D411D4A +:103A8200229697FD0C944E1D0C94571D04FF7472E0 +:103A920075653C1D4C1D9A938A938FEF9FEFB4CEB0 +:103AA20001FF3000471D551D9A938A93C101ACCE88 +:103AB20002FF753C511D5D1D2991399182179307B3 +:103AC200A8F3A1F3EACF02FF753E591D011CC41CE5 +:103AD2005C1D201C01FF3C00641D6F1D2991399162 +:103AE200281739071CF7D9CF01FF3E006B1D791D3E +:103AF2002991399128173907CCF2C1F2CECF04FFB0 +:103B02006C6F6732751D851DFC01992780E18A95CE +:103B120022F0EE0FFF1FD8F777CE9A9575CE01FFF0 +:103B22002D00801D941D09911991081B190BC801C4 +:103B32006BCE01FF2B00901D9E1D09911991800FE4 +:103B4200911F62CE02FF6D2A9A1DA71D8C018991D9 +:103B520099919C0131027001209FC0013003F3084A +:103B6200900DE11CF31C1203F308900DE11CF31CF1 +:103B72009A938A93C70148CE06FF756D2F6D6F64C5 +:103B8200A31DC31D7C01299139910991199140E12D +:103B92005527000F111F221F331F551F2E153F05DA +:103BA200520518F003952E193F094A9589F73A9361 +:103BB2002A93C80129CE03FF756D2A00BD1DE11DA0 +:103BC2008C0189919991809FF00122273327909F40 +:103BD200F00D211D331D819FF00D211D331D919F7D +:103BE200200D311DCF019A938A93C9010DCE06FF94 +:103BF200696E76657274DC1DFE1D8095909504CE0B +:103C020002FF322FF81D051E95958795FDCD02FF07 +:103C1200322A011E0C1E880F991FF6CD03FF616E1A +:103C22006400081E141E0991199180239123ECCD82 +:103C320002FF6F720F1E1D1E09911991802B912B8D +:103C4200E3CD03FF786F7200191E271E09911991A7 +:103C520080279127D9CD02FF312B221E301E0196DB +:103C6200D3CD02FF312D2C1E361E0197CDCD07FF7D +:103C72003F6E656761746500321E011C211D361C92 +:103C8200431EC606201C06FF6C7368696674381EE4 +:103C92004A1EFC018991999131971AF0880F991F58 +:103CA200FBCFB2CD06FF727368696674441E591E5B +:103CB200FC018991999131971AF096958795FBCFDE +:103CC200A3CD02FF2B21531E661EFC0189919991FF +:103CD20020813181820F931F8083918389919991F1 +:103CE20093CD03FF72704000621E771E9A938A93EF +:103CF2008DB79EB789CD03FF72702100721E811E9F +:103D02002FB7F8948DBF9EBF2FBF899199917CCD1B +:103D120003FF737040007C1E8E1E9A938A93CE011D +:103D220073CD03FF73702100891E971EEC018991E8 +:103D320099916ACD9C1E29913991E0E83E0F821B30 +:103D4200930B3F932F939F938F93899199915CCD7E +:103D520001FF6900921EAD1E9A938A938F919F91E3 +:103D6200EF91FF91FF93EF939F938F938E0F9F1F7E +:103D72004BCDBB1EEF91FF91E80FF91F89919991ED +:103D82001BF0FF93EF936BCD0F911F9111963CCDDA +:103D9200CA1EEF91FF913196BBF3F3CF06FF756E0A +:103DA2006C6F6F70A91ED51E1F910F911F910F91FD +:103DB2002BCD06FF636D6F76653ECF1EE01EBF936F +:103DC200AF93E991F991A991B991092F082B41F08B +:103DD200E80FF91FA80FB91F1E9112930197E1F77F +:103DE200AF91BF91899199910FCD02FF3E3CDA1EAE +:103DF200FA1E092F982F802F07CD03FF7570400000 +:103E0200F61E031F9A938A93C201FECC03FF7570BC +:103E12002100FE1E0C1F2C0189919991F5CC03FF04 +:103E2200316D7300071F151FE0EDF7E03197F1F7D1 +:103E3200EBCC03FF323E7200101F1F1FFC01899161 +:103E420099919F938F93FF93EF9389919991DCCCF2 +:103E520003FF32723E001A1F2E1F9A938A93EF912C +:103E6200FF918F919F919A938A93CF01CDCC02FFBC +:103E72002165291F3C1FFC01899199912FB7F89464 +:103E820028D00DB3081709F00BD0319622D00DB30C +:103E9200091711F0892F04D02FBF89919991B4CCC1 +:103EA200E199FECF07B700FDFDCFFFBBEEBB8DBB97 +:103EB200E29AE19A089502FF4065381F601F2FB70A +:103EC200F894FC0106D08DB3319603D09DB32FBF79 +:103ED2009BCCE199FECFFFBBEEBBE09A089502FFB7 +:103EE20021695C1F9A0C5C003B0C450C09FF2821E0 +:103EF200692D6E7277772900701F7F1F1FB71F937E +:103F0200F8949C0189919991AF93BF93CF93DF93DA +:103F120009D0DF91CF91BF91AF91899199911F9172 +:103F22001FBF72CC10D0E094F0948E219F21982B69 +:103F320019F0F90102E020D0F90104E01DD0F901E5 +:103F420000E11AD00895F901E07CFF7FEF01A0E4BF +:103F5200B0E0FE01EE0FFF1F45915591FE01E21701 +:103F6200F30711F00A0102C07A010C01002704D004 +:103F72002196119771F70895E199FECF17B710FDB9 +:103F8200FDCFEE0FFF1F016007BFE895089502FF06 +:103F92004069771FCC1FFC01EE0FFF1F85919591A1 +:103FA20033CC0800326C69746572616CC81F011CE5 +:103FB200C41CC402C402201C01FF3D00D21F011C0C +:103FC200931D1A1D201C01FF3100DD1F481C01003A +:103FD20001FF3200E41F481C020002FF2D31E91FDD +:043FE200481CFFFF79 +:00000001FF diff --git a/amforth-6.5/appl/eval-pollin/p16-8.lst b/amforth-6.5/appl/eval-pollin/p16-8.lst new file mode 100644 index 0000000..4cb21fb --- /dev/null +++ b/amforth-6.5/appl/eval-pollin/p16-8.lst @@ -0,0 +1,10363 @@ + +AVRASM ver. 2.1.52 p16-8.asm Sun Apr 30 20:10:14 2017 + +p16-8.asm(5): 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/atmega16\device.asm' +../../avr8/devices/atmega16\device.asm(5): Including file '../../avr8/Atmel/Appnotes2\m16def.inc' +p16-8.asm(14): Including file '../../avr8\drivers/usart.asm' +../../avr8\drivers/usart.asm(30): 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' +p16-8.asm(19): Including file '../../avr8\drivers/1wire.asm' +p16-8.asm(21): Including file '../../avr8\amforth.asm' +../../avr8\amforth.asm(12): Including file '../../avr8\drivers/generic-isr.asm' +../../avr8\amforth.asm(14): 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(13): Including file '../../avr8\dict/appl_2k.inc' +../../avr8\dict/appl_2k.inc(1): Including file '../../avr8\words/d-2star.asm' +../../avr8\dict/appl_2k.inc(2): Including file '../../avr8\words/d-2slash.asm' +../../avr8\dict/appl_2k.inc(3): Including file '../../avr8\words/d-plus.asm' +../../avr8\dict/appl_2k.inc(4): Including file '../../avr8\words/d-minus.asm' +../../avr8\dict/appl_2k.inc(5): Including file '../../avr8\words/d-invert.asm' +../../avr8\dict/appl_2k.inc(6): Including file '../../common\words/u-dot.asm' +../../avr8\dict/appl_2k.inc(7): Including file '../../common\words/u-dot-r.asm' +../../avr8\dict/appl_2k.inc(9): Including file '../../common\words/show-wordlist.asm' +../../avr8\dict/appl_2k.inc(10): Including file '../../common\words/words.asm' +../../avr8\dict/appl_2k.inc(11): 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/appl_2k.inc(13): Including file '../../common\words/pick.asm' +../../avr8\dict/appl_2k.inc(14): Including file '../../common\words/dot-quote.asm' +../../avr8\dict/appl_2k.inc(15): Including file '../../common\words/squote.asm' +../../avr8\dict/appl_2k.inc(17): Including file '../../avr8\words/fill.asm' +../../avr8\dict/appl_2k.inc(18): 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\dict/appl_2k.inc(20): Including file '../../avr8\words/environment.asm' +../../avr8\dict/appl_2k.inc(21): Including file '../../avr8\words/env-wordlists.asm' +../../avr8\dict/appl_2k.inc(22): Including file '../../avr8\words/env-slashpad.asm' +../../avr8\dict/appl_2k.inc(23): Including file '../../common\words/env-slashhold.asm' +../../avr8\dict/appl_2k.inc(24): Including file '../../common\words/env-forthname.asm' +../../avr8\dict/appl_2k.inc(25): Including file '../../common\words/env-forthversion.asm' +../../avr8\dict/appl_2k.inc(26): Including file '../../common\words/env-cpu.asm' +../../avr8\dict/appl_2k.inc(27): Including file '../../avr8\words/env-mcuinfo.asm' +../../avr8\dict/appl_2k.inc(28): Including file '../../common\words/env-usersize.asm' +../../avr8\dict/appl_2k.inc(30): Including file '../../common\words/f_cpu.asm' +../../avr8\dict/appl_2k.inc(31): Including file '../../avr8\words/state.asm' +../../avr8\dict/appl_2k.inc(32): Including file '../../common\words/base.asm' +../../avr8\dict/appl_2k.inc(34): Including file '../../avr8\words/cells.asm' +../../avr8\dict/appl_2k.inc(35): Including file '../../avr8\words/cellplus.asm' +../../avr8\dict/appl_2k.inc(37): Including file '../../common\words/2dup.asm' +../../avr8\dict/appl_2k.inc(38): Including file '../../common\words/2drop.asm' +../../avr8\dict/appl_2k.inc(40): Including file '../../common\words/tuck.asm' +../../avr8\dict/appl_2k.inc(42): Including file '../../common\words/to-in.asm' +../../avr8\dict/appl_2k.inc(43): Including file '../../common\words/pad.asm' +../../avr8\dict/appl_2k.inc(44): Including file '../../common\words/emit.asm' +../../avr8\dict/appl_2k.inc(45): Including file '../../common\words/emitq.asm' +../../avr8\dict/appl_2k.inc(46): Including file '../../common\words/key.asm' +../../avr8\dict/appl_2k.inc(47): Including file '../../common\words/keyq.asm' +../../avr8\dict/appl_2k.inc(49): Including file '../../avr8\words/dp.asm' +../../avr8\dict/appl_2k.inc(50): Including file '../../avr8\words/ehere.asm' +../../avr8\dict/appl_2k.inc(51): Including file '../../avr8\words/here.asm' +../../avr8\dict/appl_2k.inc(52): Including file '../../avr8\words/allot.asm' +../../avr8\dict/appl_2k.inc(54): Including file '../../common\words/bin.asm' +../../avr8\dict/appl_2k.inc(55): Including file '../../common\words/decimal.asm' +../../avr8\dict/appl_2k.inc(56): Including file '../../common\words/hex.asm' +../../avr8\dict/appl_2k.inc(57): Including file '../../common\words/bl.asm' +../../avr8\dict/appl_2k.inc(59): Including file '../../avr8\words/turnkey.asm' +../../avr8\dict/appl_2k.inc(61): Including file '../../avr8\words/slashmod.asm' +../../avr8\dict/appl_2k.inc(62): Including file '../../avr8\words/uslashmod.asm' +../../avr8\dict/appl_2k.inc(63): Including file '../../avr8\words/negate.asm' +../../avr8\dict/appl_2k.inc(64): Including file '../../common\words/slash.asm' +../../avr8\dict/appl_2k.inc(65): Including file '../../common\words/mod.asm' +../../avr8\dict/appl_2k.inc(66): Including file '../../common\words/abs.asm' +../../avr8\dict/appl_2k.inc(67): Including file '../../common\words/min.asm' +../../avr8\dict/appl_2k.inc(68): Including file '../../common\words/max.asm' +../../avr8\dict/appl_2k.inc(69): Including file '../../common\words/within.asm' +../../avr8\dict/appl_2k.inc(71): Including file '../../common\words/to-upper.asm' +../../avr8\dict/appl_2k.inc(72): Including file '../../common\words/to-lower.asm' +../../avr8\dict/appl_2k.inc(74): Including file '../../avr8\words/hld.asm' +../../avr8\dict/appl_2k.inc(75): Including file '../../common\words/hold.asm' +../../avr8\dict/appl_2k.inc(76): Including file '../../common\words/less-sharp.asm' +../../avr8\dict/appl_2k.inc(77): Including file '../../common\words/sharp.asm' +../../avr8\dict/appl_2k.inc(78): Including file '../../common\words/sharp-s.asm' +../../avr8\dict/appl_2k.inc(79): Including file '../../common\words/sharp-greater.asm' +../../avr8\dict/appl_2k.inc(80): Including file '../../common\words/sign.asm' +../../avr8\dict/appl_2k.inc(81): Including file '../../common\words/d-dot-r.asm' +../../avr8\dict/appl_2k.inc(82): Including file '../../common\words/dot-r.asm' +../../avr8\dict/appl_2k.inc(83): Including file '../../common\words/d-dot.asm' +../../avr8\dict/appl_2k.inc(84): Including file '../../common\words/dot.asm' +../../avr8\dict/appl_2k.inc(85): Including file '../../common\words/ud-dot.asm' +../../avr8\dict/appl_2k.inc(86): Including file '../../common\words/ud-dot-r.asm' +../../avr8\dict/appl_2k.inc(87): Including file '../../common\words/ud-slash-mod.asm' +../../avr8\dict/appl_2k.inc(88): Including file '../../common\words/digit-q.asm' +../../avr8\dict/appl_2k.inc(90): Including file '../../avr8\words/do-sliteral.asm' +../../avr8\dict/appl_2k.inc(91): Including file '../../avr8\words/scomma.asm' +../../avr8\dict/appl_2k.inc(92): Including file '../../avr8\words/itype.asm' +../../avr8\dict/appl_2k.inc(93): Including file '../../avr8\words/icount.asm' +../../avr8\dict/appl_2k.inc(94): Including file '../../common\words/cr.asm' +../../avr8\dict/appl_2k.inc(95): Including file '../../common\words/space.asm' +../../avr8\dict/appl_2k.inc(96): Including file '../../common\words/spaces.asm' +../../avr8\dict/appl_2k.inc(97): Including file '../../common\words/type.asm' +../../avr8\dict/appl_2k.inc(98): Including file '../../common\words/tick.asm' +../../avr8\dict/appl_2k.inc(100): Including file '../../common\words/handler.asm' +../../avr8\dict/appl_2k.inc(101): Including file '../../common\words/catch.asm' +../../avr8\dict/appl_2k.inc(102): Including file '../../common\words/throw.asm' +../../avr8\dict/appl_2k.inc(104): Including file '../../common\words/cskip.asm' +../../avr8\dict/appl_2k.inc(105): Including file '../../common\words/cscan.asm' +../../avr8\dict/appl_2k.inc(106): Including file '../../common\words/accept.asm' +../../avr8\dict/appl_2k.inc(107): Including file '../../common\words/refill.asm' +../../avr8\dict/appl_2k.inc(108): Including file '../../common\words/char.asm' +../../avr8\dict/appl_2k.inc(109): Including file '../../common\words/number.asm' +../../avr8\dict/appl_2k.inc(110): Including file '../../common\words/q-sign.asm' +../../avr8\dict/appl_2k.inc(111): Including file '../../common\words/set-base.asm' +../../avr8\dict/appl_2k.inc(112): Including file '../../common\words/to-number.asm' +../../avr8\dict/appl_2k.inc(113): Including file '../../common\words/parse.asm' +../../avr8\dict/appl_2k.inc(114): Including file '../../common\words/source.asm' +../../avr8\dict/appl_2k.inc(115): Including file '../../common\words/slash-string.asm' +../../avr8\dict/appl_2k.inc(116): Including file '../../common\words/parse-name.asm' +../../avr8\dict/appl_2k.inc(117): Including file '../../common\words/find-xt.asm' +../../avr8\dict/appl_2k.inc(119): Including file '../../common\words/quit.asm' +../../avr8\dict/appl_2k.inc(120): Including file '../../common\words/prompt-ok.asm' +../../avr8\dict/appl_2k.inc(121): Including file '../../common\words/prompt-ready.asm' +../../avr8\dict/appl_2k.inc(122): Including file '../../common\words/prompt-error.asm' +../../avr8\dict/appl_2k.inc(123): Including file '../../avr8\words/pause.asm' +../../avr8\dict/appl_2k.inc(124): Including file '../../avr8\words/cold.asm' +../../avr8\dict/appl_2k.inc(125): Including file '../../common\words/warm.asm' +../../avr8\dict/appl_2k.inc(127): Including file '../../avr8\words/sp0.asm' +../../avr8\dict/appl_2k.inc(128): Including file '../../avr8\words/rp0.asm' +../../avr8\dict/appl_2k.inc(129): Including file '../../common\words/depth.asm' +../../avr8\dict/appl_2k.inc(130): Including file '../../common\words/recognize.asm' +../../avr8\dict/appl_2k.inc(131): Including file '../../avr8\words/forth-recognizer.asm' +../../avr8\dict/appl_2k.inc(132): Including file '../../common\words/interpret.asm' +../../avr8\dict/appl_2k.inc(133): Including file '../../common\words/rec-intnum.asm' +../../avr8\dict/appl_2k.inc(134): Including file '../../common\words/rec-find.asm' +../../avr8\dict/appl_2k.inc(135): Including file '../../common\words/dt-null.asm' +../../avr8\dict/appl_2k.inc(137): Including file '../../common\words/q-stack.asm' +../../avr8\dict/appl_2k.inc(138): Including file '../../common\words/ver.asm' +../../avr8\dict/appl_2k.inc(140): Including file '../../common\words/noop.asm' +../../avr8\dict/appl_2k.inc(141): Including file '../../avr8\words/unused.asm' +../../avr8\dict/appl_2k.inc(143): Including file '../../common\words/to.asm' +../../avr8\dict/appl_2k.inc(144): Including file '../../avr8\words/i-cellplus.asm' +../../avr8\dict/appl_2k.inc(146): Including file '../../avr8\words/edefer-fetch.asm' +../../avr8\dict/appl_2k.inc(147): Including file '../../avr8\words/edefer-store.asm' +../../avr8\dict/appl_2k.inc(148): Including file '../../common\words/rdefer-fetch.asm' +../../avr8\dict/appl_2k.inc(149): Including file '../../common\words/rdefer-store.asm' +../../avr8\dict/appl_2k.inc(150): Including file '../../common\words/udefer-fetch.asm' +../../avr8\dict/appl_2k.inc(151): Including file '../../common\words/udefer-store.asm' +../../avr8\dict/appl_2k.inc(152): Including file '../../common\words/defer-store.asm' +../../avr8\dict/appl_2k.inc(153): Including file '../../common\words/defer-fetch.asm' +../../avr8\dict/appl_2k.inc(154): Including file '../../avr8\words/do-defer.asm' +../../avr8\dict/appl_2k.inc(156): Including file '../../common\words/search-wordlist.asm' +../../avr8\dict/appl_2k.inc(157): Including file '../../common\words/traverse-wordlist.asm' +../../avr8\dict/appl_2k.inc(158): Including file '../../common\words/name2string.asm' +../../avr8\dict/appl_2k.inc(159): Including file '../../avr8\words/nfa2cfa.asm' +../../avr8\dict/appl_2k.inc(160): Including file '../../avr8\words/icompare.asm' +../../avr8\dict/appl_2k.inc(162): Including file '../../common\words/star.asm' +../../avr8\dict/appl_2k.inc(163): Including file '../../avr8\words/j.asm' +../../avr8\dict/appl_2k.inc(165): Including file '../../avr8\words/dabs.asm' +../../avr8\dict/appl_2k.inc(166): Including file '../../avr8\words/dnegate.asm' +../../avr8\dict/appl_2k.inc(167): Including file '../../avr8\words/cmove.asm' +../../avr8\dict/appl_2k.inc(168): Including file '../../common\words/2swap.asm' +../../avr8\dict/appl_2k.inc(170): Including file '../../common\words/tib.asm' +../../avr8\dict/appl_2k.inc(172): Including file '../../avr8\words/init-ram.asm' +../../avr8\dict/appl_2k.inc(173): Including file '../../common\words/bounds.asm' +../../avr8\dict/appl_2k.inc(174): Including file '../../common\words/s-to-d.asm' +../../avr8\dict/appl_2k.inc(175): Including file '../../avr8\words/to-body.asm' +../../avr8\amforth.asm(15): Including file 'dict_appl.inc' +dict_appl.inc(3): Including file '../../common\words/dot-s.asm' +dict_appl.inc(4): Including file '../../avr8\words/spirw.asm' +dict_appl.inc(5): Including file '../../avr8\words/n-spi.asm' +dict_appl.inc(6): Including file 'words/applturnkey.asm' +dict_appl.inc(7): 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' +dict_appl.inc(8): Including file '../../avr8\words/2r_fetch.asm' +../../avr8\amforth.asm(23): Including file '../../avr8\amforth-interpreter.asm' +../../avr8\amforth.asm(24): 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(97): Including file '../../avr8\words/store-i_nrww.asm' +../../avr8\dict/nrww.inc(99): Including file '../../avr8\words/fetch-i.asm' +../../avr8\dict/nrww.inc(106): Including file '../../avr8\dict/core_2k.inc' +../../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.asm(25): Including file 'dict_appl_core.inc' +../../avr8\amforth.asm(36): Including file '../../avr8\amforth-eeprom.inc' + + + ; file see ../template/template.asm. You may want to + ; copy that file to this one and edit it afterwards. + + .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 = 96 + .equ CELLSIZE = 2 + .macro readflashcell + lsl zl + rol zh + lpm @0, Z+ + lpm @1, Z+ + .endmacro + .macro writeflashcell + lsl zl + rol zh + .endmacro + .set WANT_TIMER_COUNTER_0 = 0 + .set WANT_TIMER_COUNTER_1 = 0 + .set WANT_EXTERNAL_INTERRUPT = 0 + .set WANT_EEPROM = 0 + .set WANT_CPU = 0 + .set WANT_TIMER_COUNTER_2 = 0 + .set WANT_SPI = 0 + .set WANT_USART = 0 + .set WANT_TWI = 0 + .set WANT_ANALOG_COMPARATOR = 0 + .set WANT_AD_CONVERTER = 0 + .set WANT_JTAG = 0 + .set WANT_BOOT_LOAD = 0 + .set WANT_PORTA = 0 + .set WANT_PORTB = 0 + .set WANT_PORTC = 0 + .set WANT_PORTD = 0 + .set WANT_WATCHDOG = 0 + .equ intvecsize = 2 ; please verify; flash size: 16384 bytes + .equ pclen = 2 ; please verify + .overlap + .org 2 +000002 d11b rcall isr ; External Interrupt Request 0 + .org 4 +000004 d119 rcall isr ; External Interrupt Request 1 + .org 6 +000006 d117 rcall isr ; Timer/Counter2 Compare Match + .org 8 +000008 d115 rcall isr ; Timer/Counter2 Overflow + .org 10 +00000a d113 rcall isr ; Timer/Counter1 Capture Event + .org 12 +00000c d111 rcall isr ; Timer/Counter1 Compare Match A + .org 14 +00000e d10f rcall isr ; Timer/Counter1 Compare Match B + .org 16 +000010 d10d rcall isr ; Timer/Counter1 Overflow + .org 18 +000012 d10b rcall isr ; Timer/Counter0 Overflow + .org 20 +000014 d109 rcall isr ; Serial Transfer Complete + .org 22 +000016 d107 rcall isr ; USART, Rx Complete + .org 24 +000018 d105 rcall isr ; USART Data Register Empty + .org 26 +00001a d103 rcall isr ; USART, Tx Complete + .org 28 +00001c d101 rcall isr ; ADC Conversion Complete + .org 30 +00001e d0ff rcall isr ; EEPROM Ready + .org 32 +000020 d0fd rcall isr ; Analog Comparator + .org 34 +000022 d0fb rcall isr ; 2-wire Serial Interface + .org 36 +000024 d0f9 rcall isr ; External Interrupt Request 2 + .org 38 +000026 d0f7 rcall isr ; Timer/Counter0 Compare Match + .org 40 +000028 d0f5 rcall isr ; Store Program Memory Ready + .equ INTVECTORS = 21 + .nooverlap + + ; compatability layer (maybe empty) + .equ EEPE = EEWE + .equ EEMPE = EEMWE + + ; controller data area, environment query mcu-info + mcu_info: + mcu_ramsize: +000029 0400 .dw 1024 + mcu_eepromsize: +00002a 0200 .dw 512 + mcu_maxdp: +00002b 3800 .dw 14336 + mcu_numints: +00002c 0015 .dw 21 + mcu_name: +00002d 0008 .dw 8 +00002e 5441 +00002f 656d +000030 6167 +000031 3631 .db "ATmega16" + .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 + + .set AMFORTH_RO_SEG = NRWW_START_ADDR+1 + + ; cpu clock in hertz + .equ F_CPU = 8000000 + .set BAUD_MAXERROR = 30 + .equ TIMER_INT = OVF2addr + + .include "drivers/usart.asm" + + .equ BAUDRATE_LOW = UBRRL+$20 + .equ BAUDRATE_HIGH = UBRRH+$20 + .equ USART_C = UCSRC+$20 + .equ USART_B = UCSRB+$20 + .equ USART_A = UCSRA+$20 + .equ USART_DATA = UDR+$20 + .equ bm_USARTC_en = 1 << 7 + + ; some generic constants + .equ bm_USART_RXRD = 1 << RXC + .equ bm_USART_TXRD = 1 << UDRE + .equ bm_ENABLE_TX = 1 << TXEN + .equ bm_ENABLE_RX = 1 << RXEN + .equ bm_ENABLE_INT_RX = 1<rx-buf",0 +000037 0000 .dw VE_HEAD + .set VE_HEAD = VE_TO_RXBUF + XT_TO_RXBUF: +000038 0039 .dw PFA_rx_tobuf + PFA_rx_tobuf: +000039 2f08 mov temp0, tosl +00003a 9110 0070 lds temp1, usart_rx_in +00003c e6e0 ldi zl, low(usart_rx_data) +00003d e0f0 ldi zh, high(usart_rx_data) +00003e 0fe1 add zl, temp1 +00003f 1df3 adc zh, zeroh +000040 8300 st Z, temp0 +000041 9513 inc temp1 +000042 701f andi temp1,usart_rx_mask +000043 9310 0070 sts usart_rx_in, temp1 +000045 9189 +000046 9199 loadtos +000047 940c 1c05 jmp_ DO_NEXT + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ; setup with + ; ' isr-rx URXCaddr int! + VE_ISR_RX: +000049 ff06 .dw $ff06 +00004a 7369 +00004b 2d72 +00004c 7872 .db "isr-rx" +00004d 0032 .dw VE_HEAD + .set VE_HEAD = VE_ISR_RX + XT_ISR_RX: +00004e 1c01 .dw DO_COLON + usart_rx_isr: +00004f 1c3d .dw XT_DOLITERAL +000050 002c .dw usart_data +000051 1c98 .dw XT_CFETCH +000052 1cb1 .dw XT_DUP +000053 1c3d .dw XT_DOLITERAL +000054 0003 .dw 3 +000055 1fe0 .dw XT_EQUAL +000056 1c36 .dw XT_DOCONDBRANCH +000057 0059 .dw usart_rx_isr1 +000058 0ae0 .dw XT_COLD + usart_rx_isr1: +000059 0038 .dw XT_TO_RXBUF +00005a 1c20 .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: +00005b 1c01 .dw DO_COLON + PFA_USART_INIT_RX_BUFFER: ; ( -- ) +00005c 1c3d +00005d 004e .dw XT_DOLITERAL, XT_ISR_RX +00005e 1c3d +00005f 0016 .dw XT_DOLITERAL, URXCaddr +000060 0213 .dw XT_INTSTORE + +000061 1c3d .dw XT_DOLITERAL +000062 0060 .dw usart_rx_data +000063 1c3d .dw XT_DOLITERAL +000064 0016 .dw usart_rx_size + 6 +000065 1d54 .dw XT_ZERO +000066 025d .dw XT_FILL +000067 1c20 .dw XT_EXIT + + ; ( -- c) + ; MCU + ; get 1 character from input queue, wait if needed using interrupt driver + VE_RX_BUFFER: +000068 ff06 .dw $ff06 +000069 7872 +00006a 622d +00006b 6675 .db "rx-buf" +00006c 0049 .dw VE_HEAD + .set VE_HEAD = VE_RX_BUFFER + XT_RX_BUFFER: +00006d 1c01 .dw DO_COLON + PFA_RX_BUFFER: +00006e 0088 .dw XT_RXQ_BUFFER +00006f 1c36 .dw XT_DOCONDBRANCH +000070 006e .dw PFA_RX_BUFFER +000071 1c3d .dw XT_DOLITERAL +000072 0071 .dw usart_rx_out +000073 1c98 .dw XT_CFETCH +000074 1cb1 .dw XT_DUP +000075 1c3d .dw XT_DOLITERAL +000076 0060 .dw usart_rx_data +000077 1d9d .dw XT_PLUS +000078 1c98 .dw XT_CFETCH +000079 1cc4 .dw XT_SWAP +00007a 1e2f .dw XT_1PLUS +00007b 1c3d .dw XT_DOLITERAL +00007c 000f .dw usart_rx_mask +00007d 1e13 .dw XT_AND +00007e 1c3d .dw XT_DOLITERAL +00007f 0071 .dw usart_rx_out +000080 1c8d .dw XT_CSTORE +000081 1c20 .dw XT_EXIT + + ; ( -- f) + ; MCU + ; check if unread characters are in the input queue + VE_RXQ_BUFFER: +000082 ff07 .dw $ff07 +000083 7872 +000084 2d3f +000085 7562 +000086 0066 .db "rx?-buf",0 +000087 0068 .dw VE_HEAD + .set VE_HEAD = VE_RXQ_BUFFER + XT_RXQ_BUFFER: +000088 1c01 .dw DO_COLON + PFA_RXQ_BUFFER: +000089 0ad8 .dw XT_PAUSE +00008a 1c3d .dw XT_DOLITERAL +00008b 0071 .dw usart_rx_out +00008c 1c98 .dw XT_CFETCH +00008d 1c3d .dw XT_DOLITERAL +00008e 0070 .dw usart_rx_in +00008f 1c98 .dw XT_CFETCH +000090 1d13 .dw XT_NOTEQUAL +000091 1c20 .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: +000092 ff07 .dw $ff07 +000093 7874 +000094 702d +000095 6c6f +000096 006c .db "tx-poll",0 +000097 0082 .dw VE_HEAD + .set VE_HEAD = VE_TX_POLL + XT_TX_POLL: +000098 1c01 .dw DO_COLON + PFA_TX_POLL: + ; wait for data ready +000099 00a6 .dw XT_TXQ_POLL +00009a 1c36 .dw XT_DOCONDBRANCH +00009b 0099 .dw PFA_TX_POLL + ; send to usart +00009c 1c3d .dw XT_DOLITERAL +00009d 002c .dw USART_DATA +00009e 1c8d .dw XT_CSTORE +00009f 1c20 .dw XT_EXIT + + ; ( -- f) MCU + ; MCU + ; check if a character can be send using register poll + VE_TXQ_POLL: +0000a0 ff08 .dw $ff08 +0000a1 7874 +0000a2 2d3f +0000a3 6f70 +0000a4 6c6c .db "tx?-poll" +0000a5 0092 .dw VE_HEAD + .set VE_HEAD = VE_TXQ_POLL + XT_TXQ_POLL: +0000a6 1c01 .dw DO_COLON + PFA_TXQ_POLL: +0000a7 0ad8 .dw XT_PAUSE +0000a8 1c3d .dw XT_DOLITERAL +0000a9 002b .dw USART_A +0000aa 1c98 .dw XT_CFETCH +0000ab 1c3d .dw XT_DOLITERAL +0000ac 0020 .dw bm_USART_TXRD +0000ad 1e13 .dw XT_AND +0000ae 1c20 .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: +0000af ff04 .dw $ff04 +0000b0 6275 +0000b1 7272 .db "ubrr" +0000b2 00a0 .dw VE_HEAD + .set VE_HEAD = VE_UBRR + XT_UBRR: +0000b3 1c6f .dw PFA_DOVALUE1 + PFA_UBRR: ; ( -- ) +0000b4 0082 .dw EE_UBRRVAL +0000b5 0c3b .dw XT_EDEFERFETCH +0000b6 0c45 .dw XT_EDEFERSTORE + .include "words/usart.asm" + + ; MCU + ; initialize usart + VE_USART: +0000b7 ff06 .dw $ff06 +0000b8 752b +0000b9 6173 +0000ba 7472 .db "+usart" +0000bb 00af .dw VE_HEAD + .set VE_HEAD = VE_USART + XT_USART: +0000bc 1c01 .dw DO_COLON + PFA_USART: ; ( -- ) + +0000bd 1c3d .dw XT_DOLITERAL +0000be 0098 .dw USART_B_VALUE +0000bf 1c3d .dw XT_DOLITERAL +0000c0 002a .dw USART_B +0000c1 1c8d .dw XT_CSTORE + +0000c2 1c3d .dw XT_DOLITERAL +0000c3 0006 .dw USART_C_VALUE +0000c4 1c3d .dw XT_DOLITERAL +0000c5 00c0 .dw USART_C | bm_USARTC_en +0000c6 1c8d .dw XT_CSTORE + +0000c7 00b3 .dw XT_UBRR +0000c8 1cb1 .dw XT_DUP +0000c9 1ef9 .dw XT_BYTESWAP +0000ca 1c3d .dw XT_DOLITERAL +0000cb 0040 .dw BAUDRATE_HIGH +0000cc 1c8d .dw XT_CSTORE +0000cd 1c3d .dw XT_DOLITERAL +0000ce 0029 .dw BAUDRATE_LOW +0000cf 1c8d .dw XT_CSTORE + .if XT_USART_INIT_RX!=0 +0000d0 005b .dw XT_USART_INIT_RX + .endif + .if XT_USART_INIT_TX!=0 + .endif + +0000d1 1c20 .dw XT_EXIT + + ; settings for 1wire interface + .equ OW_PORT=PORTB + .EQU OW_BIT=4 + .include "drivers/1wire.asm" + + ; B. J. Rodriguez (MSP 430) + ; Matthias Trute (AVR Atmega) + ; COPYRIGHT + ; (c) 2012 Bradford J. Rodriguez for the 430 code and API + + ; adapted 430 assembly code to AVR + ; wishlist: + ; use a configurable pin at runtime, compatible with bitnames.frt + ; no external pull up, no external power supply for devices + ; ??? + ; + ;.EQU OW_BIT=4 + ;.equ OW_PORT=PORTE + .set OW_DDR=(OW_PORT-1) + .set OW_PIN=(OW_DDR-1) + + ;****f* 1W.RESET + ; NAME + ; 1W.RESET + ; SYNOPSIS + ; 1W.RESET ( -- f ) Initialize 1-wire devices; return true if present + ; DESCRIPTION + ; This configures the port pin used by the 1-wire interface, and then + ; sends an "initialize" sequence to the 1-wire devices. If any device + ; is present, it will be detected. + ; + ; Timing, per DS18B20 data sheet: + ; a) Output "0" (drive output low) for >480 usec. + ; b) Output "1" (let output float). + ; c) After 15 to 60 usec, device will drive pin low for 60 to 240 usec. + ; So, wait 75 usec and sample input. + ; d) Leave output high (floating) for at least 480 usec. + ;****** + ; ( -- f ) + ; Hardware + ; Initialize 1-wire devices; return true if present + VE_OW_RESET: +0000d2 ff08 .dw $ff08 +0000d3 7731 +0000d4 722e +0000d5 7365 +0000d6 7465 .db "1w.reset" +0000d7 00b7 .dw VE_HEAD + .set VE_HEAD = VE_OW_RESET + XT_OW_RESET: +0000d8 00d9 .dw PFA_OW_RESET + PFA_OW_RESET: +0000d9 939a +0000da 938a savetos + ; setup to output +0000db 9abc sbi OW_DDR, OW_BIT + ; Pull output low +0000dc 98c4 cbi OW_PORT, OW_BIT + ; Delay >480 usec +0000dd ece0 +0000de e0f3 +0000df 9731 +0000e0 f7f1 DELAY 480 + ; Critical timing period, disable interrupts. +0000e1 b71f in temp1, SREG +0000e2 94f8 cli + ; Pull output high +0000e3 9ac4 sbi OW_PORT, OW_BIT + ; make pin input, sends "1" +0000e4 98bc cbi OW_DDR, OW_BIT +0000e5 e8e0 +0000e6 e0f0 +0000e7 9731 +0000e8 f7f1 DELAY 64 ; delayB + ; Sample input pin, set TOS if input is zero +0000e9 b386 in tosl, OW_PIN +0000ea ff84 sbrs tosl, OW_BIT +0000eb ef9f ser tosh + ; End critical timing period, enable interrupts +0000ec bf1f out SREG, temp1 + ; release bus +0000ed 98bc cbi OW_DDR, OW_BIT +0000ee 98c4 cbi OW_PORT, OW_BIT + + ; Delay rest of 480 usec +0000ef e4e0 +0000f0 e0f3 +0000f1 9731 +0000f2 f7f1 DELAY 416 + ; we now have the result flag in TOS +0000f3 2f89 mov tosl, tosh +0000f4 940c 1c05 jmp_ DO_NEXT + + ;****f* 1W.SLOT + ; NAME + ; 1W.SLOT + ; SYNOPSIS + ; 1W.SLOT ( c -- c' ) Write and read one bit to/from 1-wire. + ; DESCRIPTION + ; The "touch byte" function is described in Dallas App Note 74. + ; It outputs a byte to the 1-wire pin, LSB first, and reads back + ; the state of the 1-wire pin after a suitable delay. + ; To read a byte, output $FF and read the reply data. + ; To write a byte, output that byte and discard the reply. + ; + ; This function performs one bit of the "touch" operation -- + ; one read/write "slot" in Dallas jargon. Perform this eight + ; times in a row to get the "touch byte" function. + ; + ; PARAMETERS + ; The input parameter is xxxxxxxxbbbbbbbo where + ; 'xxxxxxxx' are don't cares, + ; 'bbbbbbb' are bits to be shifted down, and + ; 'o' is the bit to be output in the slot. This must be 1 + ; to create a read slot. + ; + ; The returned value is xxxxxxxxibbbbbbb where + ; 'xxxxxxxx' are not known (the input shifted down 1 position), + ; 'i' is the bit read during the slot. This has no meaning + ; if it was a write slot. + ; 'bbbbbbb' are the 7 input bits, shifted down one position. + ; + ; This peculiar parameter usage allows OWTOUCH to be written as + ; OWSLOT OWSLOT OWSLOT OWSLOT OWSLOT OWSLOT OWSLOT OWSLOT + ; + ; NOTES + ; Interrupts are disabled during each bit. + + ; Timing, per DS18B20 data sheet: + ; a) Output "0" for start period. (> 1 us, < 15 us, typ. 6 us*) + ; b) Output data bit (0 or 1), open drain + ; c) After MS from start of cycle, sample input (15 to 60 us, typ. 25 us*) + ; d) After write-0 period from start of cycle, output "1" (>60 us) + ; e) After recovery period, loop or return. (> 1 us) + ; For writes, DS18B20 samples input 15 to 60 usec from start of cycle. + ; * "Typical" values are per App Note 132 for a 300m cable length. + + ; --------- ------------------------------- + ; \ / / + ; ------------------------------- + ; a b c d e + ; | 6us | 19us | 35us | 2us | + ;****** + ; ( c -- c' ) + ; Hardware + ; Write and read one bit to/from 1-wire. + VE_OW_SLOT: +0000f6 ff07 .dw $ff07 +0000f7 7731 +0000f8 732e +0000f9 6f6c +0000fa 0074 .db "1w.slot",0 +0000fb 00d2 .dw VE_HEAD + .set VE_HEAD = VE_OW_SLOT + XT_OW_SLOT: +0000fc 00fd .dw PFA_OW_SLOT + PFA_OW_SLOT: + ; pull low +0000fd 98c4 cbi OW_PORT, OW_BIT +0000fe 9abc sbi OW_DDR, OW_BIT + ; disable interrupts +0000ff b71f in temp1, SREG +000100 94f8 cli +000101 e0ec +000102 e0f0 +000103 9731 +000104 f7f1 DELAY 6 ; DELAY A + ; check bit +000105 9488 clc +000106 9587 ror tosl +000107 f410 brcc PFA_OW_SLOT0 ; a 0 keeps the bus low + ; release bus, a 1 is written +000108 9ac4 sbi OW_PORT, OW_BIT +000109 98bc cbi OW_DDR, OW_BIT + PFA_OW_SLOT0: + ; sample the input (no action required if zero) +00010a e1e2 +00010b e0f0 +00010c 9731 +00010d f7f1 DELAY 9 ; wait DELAY E to sample +00010e b306 in temp0, OW_PIN +00010f fd04 sbrc temp0, OW_BIT +000110 6880 ori tosl, $80 + +000111 e6e6 +000112 e0f0 +000113 9731 +000114 f7f1 DELAY 51 ; DELAY B +000115 9ac4 sbi OW_PORT, OW_BIT ; release bus +000116 98bc cbi OW_DDR, OW_BIT +000117 e0e4 +000118 e0f0 +000119 9731 +00011a f7f1 delay 2 + ; re-enable interrupts +00011b bf1f out SREG, temp1 +00011c 940c 1c05 jmp_ DO_NEXT + + .include "amforth.asm" + + ;;;; + ;;;; GPL V2 (only) + + .set AMFORTH_NRWW_SIZE=(FLASHEND-AMFORTH_RO_SEG)*2 + + .set corepc = pc + .org $0000 +000000 940c 0ae1 jmp_ PFA_COLD + + .org corepc + .include "drivers/generic-isr.asm" + + .eseg +000000 intvec: .byte INTVECTORS * CELLSIZE + .dseg +000072 intcnt: .byte INTVECTORS + .cseg + + ; interrupt routine gets called (again) by rcall! This gives the + ; address of the int-vector on the stack. + isr: +00011e 920a st -Y, r0 +00011f b60f in r0, SREG +000120 920a st -Y, r0 + .if (pclen==3) + .endif +000121 900f pop r0 +000122 900f pop r0 ; = intnum * intvectorsize + 1 (address following the rcall) +000123 940a dec r0 + .if intvecsize == 1 ; + .endif +000124 2cb0 mov isrflag, r0 +000125 93ff push zh +000126 93ef push zl +000127 e7e2 ldi zl, low(intcnt) +000128 e0f0 ldi zh, high(intcnt) +000129 9406 lsr r0 ; we use byte addresses in the counter array, not words +00012a 0de0 add zl, r0 +00012b 1df3 adc zh, zeroh +00012c 8000 ld r0, Z +00012d 9403 inc r0 +00012e 8200 st Z, r0 +00012f 91ef pop zl +000130 91ff pop zh + +000131 9009 ld r0, Y+ +000132 be0f out SREG, r0 +000133 9009 ld r0, Y+ +000134 9508 ret ; returns the interrupt, the rcall stack frame is removed! + ; no reti here, see words/isr-end.asm + ; lower part of the dictionary + .include "dict/rww.inc" + + + ; Arithmetics + ; add a number to a double cell + VE_MPLUS: +000135 ff02 .dw $ff02 +000136 2b6d .db "m+" +000137 00f6 .dw VE_HEAD + .set VE_HEAD = VE_MPLUS + XT_MPLUS: +000138 1c01 .dw DO_COLON + PFA_MPLUS: +000139 0dee .dw XT_S2D +00013a 019c .dw XT_DPLUS +00013b 1c20 .dw XT_EXIT + .include "words/ud-star.asm" + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_UDSTAR: +00013c ff03 .dw $ff03 +00013d 6475 +../../common\words/ud-star.asm(9): warning: .cseg .db misalignment - padding zero byte +00013e 002a .db "ud*" +00013f 0135 .dw VE_HEAD + .set VE_HEAD = VE_UDSTAR + XT_UDSTAR: +000140 1c01 .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 + ; + +000141 1cb1 +000142 1cff +000143 1de0 +000144 1cd9 .DW XT_DUP,XT_TO_R,XT_UMSTAR,XT_DROP +000145 1cc4 +000146 1cf6 +000147 1de0 +000148 1ce1 +000149 1d9d +00014a 1c20 .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: +00014b ff04 .dw $ff04 +00014c 6d75 +00014d 7861 .db "umax" +00014e 013c .dw VE_HEAD + .set VE_HEAD = VE_UMAX + XT_UMAX: +00014f 1c01 .dw DO_COLON + PFA_UMAX: + .endif + +000150 05eb +000151 1d5c .DW XT_2DUP,XT_ULESS +000152 1c36 .dw XT_DOCONDBRANCH +000153 0155 DEST(UMAX1) +000154 1cc4 .DW XT_SWAP +000155 1cd9 UMAX1: .DW XT_DROP +000156 1c20 .dw XT_EXIT + .include "words/umin.asm" + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_UMIN: +000157 ff04 .dw $ff04 +000158 6d75 +000159 6e69 .db "umin" +00015a 014b .dw VE_HEAD + .set VE_HEAD = VE_UMIN + XT_UMIN: +00015b 1c01 .dw DO_COLON + PFA_UMIN: + .endif +00015c 05eb +00015d 1d67 .DW XT_2DUP,XT_UGREATER +00015e 1c36 .dw XT_DOCONDBRANCH +00015f 0161 DEST(UMIN1) +000160 1cc4 .DW XT_SWAP +000161 1cd9 UMIN1: .DW XT_DROP +000162 1c20 .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: +000163 1c01 .dw DO_COLON + PFA_IMMEDIATEQ: +000164 1c3d .dw XT_DOLITERAL +000165 8000 .dw $8000 +000166 1e13 .dw XT_AND +000167 1d1a .dw XT_ZEROEQUAL +000168 1c36 .dw XT_DOCONDBRANCH +000169 016c DEST(IMMEDIATEQ1) +00016a 1fe7 .dw XT_ONE +00016b 1c20 .dw XT_EXIT + IMMEDIATEQ1: + ; not immediate +00016c 1d4b .dw XT_TRUE +00016d 1c20 .dw XT_EXIT + .include "words/name2flags.asm" + + ; Tools + ; get the flags from a name token + VE_NAME2FLAGS: +00016e ff0a .dw $ff0a +00016f 616e +000170 656d +000171 663e +000172 616c +000173 7367 .db "name>flags" +000174 0157 .dw VE_HEAD + .set VE_HEAD = VE_NAME2FLAGS + XT_NAME2FLAGS: +000175 1c01 .dw DO_COLON + PFA_NAME2FLAGS: +000176 1fcb .dw XT_FETCHI ; skip to link field +000177 1c3d .dw XT_DOLITERAL +000178 ff00 .dw $ff00 +000179 1e13 .dw XT_AND +00017a 1c20 .dw XT_EXIT + + .if AMFORTH_NRWW_SIZE > 8000 + .elif AMFORTH_NRWW_SIZE > 4000 + .elif AMFORTH_NRWW_SIZE > 2000 + .include "dict/appl_2k.inc" + + + ; Arithmetics + ; shift a double cell left + VE_D2STAR: +00017b ff03 .dw $ff03 +00017c 3264 +00017d 002a .db "d2*",0 +00017e 016e .dw VE_HEAD + .set VE_HEAD = VE_D2STAR + XT_D2STAR: +00017f 0180 .dw PFA_D2STAR + PFA_D2STAR: +000180 9109 ld temp0, Y+ +000181 9119 ld temp1, Y+ +000182 0f00 lsl temp0 +000183 1f11 rol temp1 +000184 1f88 rol tosl +000185 1f99 rol tosh +000186 931a st -Y, temp1 +000187 930a st -Y, temp0 +000188 940c 1c05 jmp_ DO_NEXT + .include "words/d-2slash.asm" + + ; Arithmetics + ; shift a double cell value right + VE_D2SLASH: +00018a ff03 .dw $ff03 +00018b 3264 +00018c 002f .db "d2/",0 +00018d 017b .dw VE_HEAD + .set VE_HEAD = VE_D2SLASH + XT_D2SLASH: +00018e 018f .dw PFA_D2SLASH + PFA_D2SLASH: +00018f 9109 ld temp0, Y+ +000190 9119 ld temp1, Y+ +000191 9595 asr tosh +000192 9587 ror tosl +000193 9517 ror temp1 +000194 9507 ror temp0 +000195 931a st -Y, temp1 +000196 930a st -Y, temp0 +000197 940c 1c05 jmp_ DO_NEXT + .include "words/d-plus.asm" + + ; Arithmetics + ; add 2 double cell values + VE_DPLUS: +000199 ff02 .dw $ff02 +00019a 2b64 .db "d+" +00019b 018a .dw VE_HEAD + .set VE_HEAD = VE_DPLUS + XT_DPLUS: +00019c 019d .dw PFA_DPLUS + PFA_DPLUS: +00019d 9129 ld temp2, Y+ +00019e 9139 ld temp3, Y+ + +00019f 90e9 ld temp4, Y+ +0001a0 90f9 ld temp5, Y+ +0001a1 9149 ld temp6, Y+ +0001a2 9159 ld temp7, Y+ + +0001a3 0f24 add temp2, temp6 +0001a4 1f35 adc temp3, temp7 +0001a5 1d8e adc tosl, temp4 +0001a6 1d9f adc tosh, temp5 + +0001a7 933a st -Y, temp3 +0001a8 932a st -Y, temp2 +0001a9 940c 1c05 jmp_ DO_NEXT + .include "words/d-minus.asm" + + ; Arithmetics + ; subtract d2 from d1 + VE_DMINUS: +0001ab ff02 .dw $ff02 +0001ac 2d64 .db "d-" +0001ad 0199 .dw VE_HEAD + .set VE_HEAD = VE_DMINUS + XT_DMINUS: +0001ae 01af .dw PFA_DMINUS + PFA_DMINUS: +0001af 9129 ld temp2, Y+ +0001b0 9139 ld temp3, Y+ + +0001b1 90e9 ld temp4, Y+ +0001b2 90f9 ld temp5, Y+ +0001b3 9149 ld temp6, Y+ +0001b4 9159 ld temp7, Y+ + +0001b5 1b42 sub temp6, temp2 +0001b6 0b53 sbc temp7, temp3 +0001b7 0ae8 sbc temp4, tosl +0001b8 0af9 sbc temp5, tosh + +0001b9 935a st -Y, temp7 +0001ba 934a st -Y, temp6 +0001bb 01c7 movw tosl, temp4 +0001bc 940c 1c05 jmp_ DO_NEXT + .include "words/d-invert.asm" + + ; Arithmetics + ; invert all bits in the double cell value + VE_DINVERT: +0001be ff07 .dw $ff07 +0001bf 6964 +0001c0 766e +0001c1 7265 +0001c2 0074 .db "dinvert",0 +0001c3 01ab .dw VE_HEAD + .set VE_HEAD = VE_DINVERT + XT_DINVERT: +0001c4 01c5 .dw PFA_DINVERT + PFA_DINVERT: +0001c5 9109 ld temp0, Y+ +0001c6 9119 ld temp1, Y+ +0001c7 9580 com tosl +0001c8 9590 com tosh +0001c9 9500 com temp0 +0001ca 9510 com temp1 +0001cb 931a st -Y, temp1 +0001cc 930a st -Y, temp0 +0001cd 940c 1c05 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: +0001cf ff02 .dw $ff02 +0001d0 2e75 .db "u." +0001d1 01be .dw VE_HEAD + .set VE_HEAD = VE_UDOT + XT_UDOT: +0001d2 1c01 .dw DO_COLON + PFA_UDOT: + .endif +0001d3 1d54 .dw XT_ZERO +0001d4 07b1 .dw XT_UDDOT +0001d5 1c20 .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: +0001d6 ff03 .dw $ff03 +0001d7 2e75 +0001d8 0072 .db "u.r",0 +0001d9 01cf .dw VE_HEAD + .set VE_HEAD = VE_UDOTR + XT_UDOTR: +0001da 1c01 .dw DO_COLON + PFA_UDOTR: + .endif +0001db 1d54 .dw XT_ZERO +0001dc 1cc4 .dw XT_SWAP +0001dd 07ba .dw XT_UDDOTR +0001de 1c20 .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: +0001df ff0d .dw $ff0d +0001e0 6873 +0001e1 776f +0001e2 772d +0001e3 726f +0001e4 6c64 +0001e5 7369 +0001e6 0074 .db "show-wordlist",0 +0001e7 01d6 .dw VE_HEAD + .set VE_HEAD = VE_SHOWWORDLIST + XT_SHOWWORDLIST: +0001e8 1c01 .dw DO_COLON + PFA_SHOWWORDLIST: + .endif +0001e9 1c3d .dw XT_DOLITERAL +0001ea 01ee .dw XT_SHOWWORD +0001eb 1cc4 .dw XT_SWAP +0001ec 0cde .dw XT_TRAVERSEWORDLIST +0001ed 1c20 .dw XT_EXIT + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + XT_SHOWWORD: +0001ee 1c01 .dw DO_COLON + PFA_SHOWWORD: + .endif +0001ef 0cf9 .dw XT_NAME2STRING +0001f0 0827 .dw XT_ITYPE +0001f1 0869 .dw XT_SPACE ; ( -- addr n) +0001f2 1d4b .dw XT_TRUE +0001f3 1c20 .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: +0001f4 ff05 .dw $ff05 +0001f5 6f77 +0001f6 6472 +0001f7 0073 .db "words",0 +0001f8 01df .dw VE_HEAD + .set VE_HEAD = VE_WORDS + XT_WORDS: +0001f9 1c01 .dw DO_COLON + PFA_WORDS: + .endif +0001fa 1c3d .dw XT_DOLITERAL +0001fb 0042 .dw CFG_ORDERLISTLEN+2 +0001fc 1f5f .dw XT_FETCHE +0001fd 01e8 .dw XT_SHOWWORDLIST +0001fe 1c20 .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: +0001ff ff04 .dw $ff04 +000200 692b +000201 746e .db "+int" +000202 01f4 .dw VE_HEAD + .set VE_HEAD = VE_INTON + XT_INTON: +000203 0204 .dw PFA_INTON + PFA_INTON: +000204 9478 sei +000205 940c 1c05 jmp_ DO_NEXT + .include "words/int-off.asm" + + ; Interrupt + ; turns off all interrupts + VE_INTOFF: +000207 ff04 .dw $ff04 +000208 692d +000209 746e .db "-int" +00020a 01ff .dw VE_HEAD + .set VE_HEAD = VE_INTOFF + XT_INTOFF: +00020b 020c .dw PFA_INTOFF + PFA_INTOFF: +00020c 94f8 cli +00020d 940c 1c05 jmp_ DO_NEXT + .include "words/int-store.asm" + + ; Interrupt + ; stores XT as interrupt vector i + VE_INTSTORE: +00020f ff04 .dw $ff04 +000210 6e69 +000211 2174 .db "int!" +000212 0207 .dw VE_HEAD + .set VE_HEAD = VE_INTSTORE + XT_INTSTORE: +000213 1c01 .dw DO_COLON + PFA_INTSTORE: +000214 1c3d .dw XT_DOLITERAL +000215 0000 .dw intvec +000216 1d9d .dw XT_PLUS +000217 1f3b .dw XT_STOREE +000218 1c20 .dw XT_EXIT + .include "words/int-fetch.asm" + + ; Interrupt + ; fetches XT from interrupt vector i + VE_INTFETCH: +000219 ff04 .dw $ff04 +00021a 6e69 +00021b 4074 .db "int@" +00021c 020f .dw VE_HEAD + .set VE_HEAD = VE_INTFETCH + XT_INTFETCH: +00021d 1c01 .dw DO_COLON + PFA_INTFETCH: +00021e 1c3d .dw XT_DOLITERAL +00021f 0000 .dw intvec +000220 1d9d .dw XT_PLUS +000221 1f5f .dw XT_FETCHE +000222 1c20 .dw XT_EXIT + .include "words/int-trap.asm" + + ; Interrupt + ; trigger an interrupt + VE_INTTRAP: +000223 ff08 .dw $ff08 +000224 6e69 +000225 2d74 +000226 7274 +000227 7061 .db "int-trap" +000228 0219 .dw VE_HEAD + .set VE_HEAD = VE_INTTRAP + XT_INTTRAP: +000229 022a .dw PFA_INTTRAP + PFA_INTTRAP: +00022a 2eb8 mov isrflag, tosl +00022b 9189 +00022c 9199 loadtos +00022d 940c 1c05 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: +00022f 1c01 .dw DO_COLON + PFA_ISREXEC: +000230 021d .dw XT_INTFETCH +000231 1c2a .dw XT_EXECUTE +000232 0234 .dw XT_ISREND +000233 1c20 .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: +000234 0235 .dw PFA_ISREND + PFA_ISREND: +000235 d002 rcall PFA_ISREND1 ; clear the interrupt flag for the controller +000236 940c 1c05 jmp_ DO_NEXT + PFA_ISREND1: +000238 9518 reti + .endif + + .include "words/pick.asm" + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_PICK: +000239 ff04 .dw $ff04 +00023a 6970 +00023b 6b63 .db "pick" +00023c 0223 .dw VE_HEAD + .set VE_HEAD = VE_PICK + XT_PICK: +00023d 1c01 .dw DO_COLON + PFA_PICK: + .endif +00023e 1e2f .dw XT_1PLUS +00023f 05dd .dw XT_CELLS +000240 1e8d .dw XT_SP_FETCH +000241 1d9d .dw XT_PLUS +000242 1c79 .dw XT_FETCH +000243 1c20 .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: +000244 0002 .dw $0002 +000245 222e .db ".",$22 +000246 0239 .dw VE_HEAD + .set VE_HEAD = VE_DOTSTRING + XT_DOTSTRING: +000247 1c01 .dw DO_COLON + PFA_DOTSTRING: + .endif +000248 024f .dw XT_SQUOTE +000249 02a3 .dw XT_COMPILE +00024a 0827 .dw XT_ITYPE +00024b 1c20 .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: +00024c 0002 .dw $0002 +00024d 2273 .db "s",$22 +00024e 0244 .dw VE_HEAD + .set VE_HEAD = VE_SQUOTE + XT_SQUOTE: +00024f 1c01 .dw DO_COLON + PFA_SQUOTE: + .endif +000250 1c3d .dw XT_DOLITERAL +000251 0022 .dw 34 ; 0x22 +000252 0a0e .dw XT_PARSE ; ( -- addr n) +000253 05d0 .dw XT_STATE +000254 1c79 .dw XT_FETCH +000255 1c36 .dw XT_DOCONDBRANCH +000256 0258 DEST(PFA_SQUOTE1) +000257 02cf .dw XT_SLITERAL + PFA_SQUOTE1: +000258 1c20 .dw XT_EXIT + + .include "words/fill.asm" + + ; Memory + ; fill u bytes memory beginning at a-addr with character c + VE_FILL: +000259 ff04 .dw $ff04 +00025a 6966 +00025b 6c6c .db "fill" +00025c 024c .dw VE_HEAD + .set VE_HEAD = VE_FILL + XT_FILL: +00025d 1c01 .dw DO_COLON + PFA_FILL: +00025e 1ce1 .dw XT_ROT +00025f 1ce1 .dw XT_ROT +000260 1cb9 +000261 1c36 .dw XT_QDUP,XT_DOCONDBRANCH +000262 026a DEST(PFA_FILL2) +000263 0de5 .dw XT_BOUNDS +000264 1e9b .dw XT_DODO + PFA_FILL1: +000265 1cb1 .dw XT_DUP +000266 1eac .dw XT_I +000267 1c8d .dw XT_CSTORE ; ( -- c c-addr) +000268 1ec9 .dw XT_DOLOOP +000269 0265 .dw PFA_FILL1 + PFA_FILL2: +00026a 1cd9 .dw XT_DROP +00026b 1c20 .dw XT_EXIT + .include "dict/compiler1.inc" + + .include "words/newest.asm" + + ; System Variable + ; system state + VE_NEWEST: +00026c ff06 .dw $ff06 +00026d 656e +00026e 6577 +00026f 7473 .db "newest" +000270 0259 .dw VE_HEAD + .set VE_HEAD = VE_NEWEST + XT_NEWEST: +000271 1c48 .dw PFA_DOVARIABLE + PFA_NEWEST: +000272 0087 .dw ram_newest + + .dseg +000087 ram_newest: .byte 4 + .include "words/latest.asm" + + ; System Variable + ; system state + VE_LATEST: +000273 ff06 .dw $ff06 +000274 616c +000275 6574 +000276 7473 .db "latest" +000277 026c .dw VE_HEAD + .set VE_HEAD = VE_LATEST + XT_LATEST: +000278 1c48 .dw PFA_DOVARIABLE + PFA_LATEST: +000279 008b .dw ram_latest + + .dseg +00008b 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: +00027a ff08 .dw $ff08 +00027b 6328 +00027c 6572 +00027d 7461 +00027e 2965 .db "(create)" +00027f 0273 .dw VE_HEAD + .set VE_HEAD = VE_DOCREATE + XT_DOCREATE: +000280 1c01 .dw DO_COLON + PFA_DOCREATE: + .endif +000281 0a3b +000282 03d7 .DW XT_PARSENAME,XT_WLSCOPE ; ( -- addr len wid) +000283 1cb1 +000284 0271 +000285 05e3 +000286 1c81 .DW XT_DUP,XT_NEWEST,XT_CELLPLUS,XT_STORE ; save the wid +000287 03bc +000288 0271 +000289 1c81 .DW XT_HEADER,XT_NEWEST,XT_STORE ; save the nt +00028a 1c20 .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: +00028b 0001 .dw $0001 +00028c 005c .db $5c,0 +00028d 027a .dw VE_HEAD + .set VE_HEAD = VE_BACKSLASH + XT_BACKSLASH: +00028e 1c01 .dw DO_COLON + PFA_BACKSLASH: + .endif +00028f 0a22 .dw XT_SOURCE +000290 1cf0 .dw XT_NIP +000291 0604 .dw XT_TO_IN +000292 1c81 .dw XT_STORE +000293 1c20 .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: +000294 0001 .dw $0001 +000295 0028 .db "(" ,0 +000296 028b .dw VE_HEAD + .set VE_HEAD = VE_LPAREN + XT_LPAREN: +000297 1c01 .dw DO_COLON + PFA_LPAREN: + .endif +000298 1c3d .dw XT_DOLITERAL +000299 0029 .dw ')' +00029a 0a0e .dw XT_PARSE +00029b 05f4 .dw XT_2DROP +00029c 1c20 .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: +00029d ff07 .dw $ff07 +00029e 6f63 +00029f 706d +0002a0 6c69 +0002a1 0065 .db "compile",0 +0002a2 0294 .dw VE_HEAD + .set VE_HEAD = VE_COMPILE + XT_COMPILE: +0002a3 1c01 .dw DO_COLON + PFA_COMPILE: + .endif +0002a4 1cf6 .dw XT_R_FROM +0002a5 1cb1 .dw XT_DUP +0002a6 0c32 .dw XT_ICELLPLUS +0002a7 1cff .dw XT_TO_R +0002a8 1fcb .dw XT_FETCHI +0002a9 02ae .dw XT_COMMA +0002aa 1c20 .dw XT_EXIT + .include "words/comma.asm" + + ; Dictionary + ; compile 16 bit into flash at DP + VE_COMMA: +0002ab ff01 .dw $ff01 +0002ac 002c .db ',',0 ; , +0002ad 029d .dw VE_HEAD + .set VE_HEAD = VE_COMMA + XT_COMMA: +0002ae 1c01 .dw DO_COLON + PFA_COMMA: +0002af 0634 .dw XT_DP +0002b0 1f73 .dw XT_STOREI +0002b1 0634 .dw XT_DP +0002b2 1e2f .dw XT_1PLUS +0002b3 0c20 .dw XT_DOTO +0002b4 0635 .dw PFA_DP +0002b5 1c20 .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: +0002b6 0003 .dw $0003 +0002b7 275b +0002b8 005d .db "[']",0 +0002b9 02ab .dw VE_HEAD + .set VE_HEAD = VE_BRACKETTICK + XT_BRACKETTICK: +0002ba 1c01 .dw DO_COLON + PFA_BRACKETTICK: + .endif +0002bb 0891 .dw XT_TICK +0002bc 02c4 .dw XT_LITERAL +0002bd 1c20 .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: +0002be 0007 .dw $0007 +0002bf 696c +0002c0 6574 +0002c1 6172 +0002c2 006c .db "literal",0 +0002c3 02b6 .dw VE_HEAD + .set VE_HEAD = VE_LITERAL + XT_LITERAL: +0002c4 1c01 .dw DO_COLON + PFA_LITERAL: + .endif +0002c5 02a3 .DW XT_COMPILE +0002c6 1c3d .DW XT_DOLITERAL +0002c7 02ae .DW XT_COMMA +0002c8 1c20 .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: +0002c9 0008 .dw $0008 +0002ca 6c73 +0002cb 7469 +0002cc 7265 +0002cd 6c61 .db "sliteral" +0002ce 02be .dw VE_HEAD + .set VE_HEAD = VE_SLITERAL + XT_SLITERAL: +0002cf 1c01 .dw DO_COLON + PFA_SLITERAL: + .endif +0002d0 02a3 .dw XT_COMPILE +0002d1 07f4 .dw XT_DOSLITERAL ; ( -- addr n) +0002d2 0802 .dw XT_SCOMMA +0002d3 1c20 .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: +0002d4 1c01 .dw DO_COLON + PFA_GMARK: +0002d5 0634 .dw XT_DP +0002d6 02a3 .dw XT_COMPILE +0002d7 ffff .dw -1 ; ffff does not erase flash +0002d8 1c20 .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: +0002d9 1c01 .dw DO_COLON + PFA_GRESOLVE: +0002da 0bde .dw XT_QSTACK +0002db 0634 .dw XT_DP +0002dc 1cc4 .dw XT_SWAP +0002dd 1f73 .dw XT_STOREI +0002de 1c20 .dw XT_EXIT + .include "words/l_mark.asm" + + ; Compiler + ; place destination for backward branch + ;VE_LMARK: + ; .dw $ff05 + ; .db "r if 2drop then r> invert ; + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + XT_QDOCHECK: +00036d 1c01 .dw DO_COLON + PFA_QDOCHECK: + .endif +00036e 05eb .dw XT_2DUP +00036f 1fe0 .dw XT_EQUAL +000370 1cb1 .dw XT_DUP +000371 1cff .dw XT_TO_R +000372 1c36 .dw XT_DOCONDBRANCH +000373 0375 DEST(PFA_QDOCHECK1) +000374 05f4 .dw XT_2DROP + PFA_QDOCHECK1: +000375 1cf6 .dw XT_R_FROM +000376 1dfd .dw XT_INVERT +000377 1c20 .dw XT_EXIT + .include "words/endloop.asm" + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_ENDLOOP: +000378 ff07 .dw $ff07 +000379 6e65 +00037a 6c64 +00037b 6f6f +00037c 0070 .db "endloop",0 +00037d 0361 .dw VE_HEAD + .set VE_HEAD = VE_ENDLOOP + XT_ENDLOOP: +00037e 1c01 .dw DO_COLON + PFA_ENDLOOP: + .endif + ;Z ENDLOOP adrs xt -- L: 0 a1 a2 .. aN -- + ; ?DUP WHILE POSTPONE THEN REPEAT ; + ; resolve LEAVEs + ; This is a common factor of LOOP and +LOOP. + +00037f 02e2 .DW XT_LRESOLVE +000380 038b +000381 1cb9 +000382 1c36 LOOP1: .DW XT_L_FROM,XT_QDUP,XT_DOCONDBRANCH +000383 0387 DEST(LOOP2) +000384 0307 .DW XT_THEN +000385 1c2f .dw XT_DOBRANCH +000386 0380 DEST(LOOP1) +000387 1c20 LOOP2: .DW XT_EXIT + ; leave address stack + .include "words/l-from.asm" + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_L_FROM: +000388 ff02 .dw $ff02 +000389 3e6c .db "l>" +00038a 0378 .dw VE_HEAD + .set VE_HEAD = VE_L_FROM + XT_L_FROM: +00038b 1c01 .dw DO_COLON + PFA_L_FROM: + + .endif + ;Z L> -- x L: x -- move from leave stack + ; LP @ @ -2 LP +! ; + +00038c 03aa .dw XT_LP +00038d 1c79 .dw XT_FETCH +00038e 1c79 .dw XT_FETCH +00038f 1c3d .dw XT_DOLITERAL +000390 fffe .dw -2 +000391 03aa .dw XT_LP +000392 1e65 .dw XT_PLUSSTORE +000393 1c20 .dw XT_EXIT + .include "words/to-l.asm" + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_TO_L: +000394 ff02 .dw $ff02 +000395 6c3e .db ">l" +000396 0388 .dw VE_HEAD + .set VE_HEAD = VE_TO_L + XT_TO_L: +000397 1c01 .dw DO_COLON + PFA_TO_L: + .endif + ;Z >L x -- L: -- x move to leave stack + ; CELL LP +! LP @ ! ; (L stack grows up) + +000398 1fec .dw XT_TWO +000399 03aa .dw XT_LP +00039a 1e65 .dw XT_PLUSSTORE +00039b 03aa .dw XT_LP +00039c 1c79 .dw XT_FETCH +00039d 1c81 .dw XT_STORE +00039e 1c20 .dw XT_EXIT + .include "words/lp0.asm" + + ; Stack + ; start address of leave stack + VE_LP0: +00039f ff03 .dw $ff03 +0003a0 706c +0003a1 0030 .db "lp0",0 +0003a2 0394 .dw VE_HEAD + .set VE_HEAD = VE_LP0 + XT_LP0: +0003a3 1c6f .dw PFA_DOVALUE1 + PFA_LP0: +0003a4 0036 .dw CFG_LP0 +0003a5 0c3b .dw XT_EDEFERFETCH +0003a6 0c45 .dw XT_EDEFERSTORE + .include "words/lp.asm" + + ; System Variable + ; leave stack pointer + VE_LP: +0003a7 ff02 .dw $ff02 +0003a8 706c .db "lp" +0003a9 039f .dw VE_HEAD + .set VE_HEAD = VE_LP + XT_LP: +0003aa 1c48 .dw PFA_DOVARIABLE + PFA_LP: +0003ab 008d .dw ram_lp + + .dseg +00008d 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: +0003ac ff06 .dw $ff06 +0003ad 7263 +0003ae 6165 +0003af 6574 .db "create" +0003b0 03a7 .dw VE_HEAD + .set VE_HEAD = VE_CREATE + XT_CREATE: +0003b1 1c01 .dw DO_COLON + PFA_CREATE: + .endif +0003b2 0280 .dw XT_DOCREATE +0003b3 03e0 .dw XT_REVEAL +0003b4 02a3 .dw XT_COMPILE +0003b5 1c52 .dw PFA_DOCONSTANT +0003b6 1c20 .dw XT_EXIT + .include "words/header.asm" + + ; Compiler + ; creates the vocabulary header without XT and data field (PF) in the wordlist wid + VE_HEADER: +0003b7 ff06 .dw $ff06 +0003b8 6568 +0003b9 6461 +0003ba 7265 .db "header" +0003bb 03ac .dw VE_HEAD + .set VE_HEAD = VE_HEADER + XT_HEADER: +0003bc 1c01 .dw DO_COLON + PFA_HEADER: +0003bd 0634 .dw XT_DP ; the new Name Field +0003be 1cff .dw XT_TO_R +0003bf 1cff .dw XT_TO_R ; ( R: NFA WID ) +0003c0 1cb1 .dw XT_DUP +0003c1 1d28 .dw XT_GREATERZERO +0003c2 1c36 .dw XT_DOCONDBRANCH +0003c3 03ce .dw PFA_HEADER1 +0003c4 1cb1 .dw XT_DUP +0003c5 1c3d .dw XT_DOLITERAL +0003c6 ff00 .dw $ff00 ; all flags are off (e.g. immediate) +0003c7 1e1c .dw XT_OR +0003c8 0806 .dw XT_DOSCOMMA + ; make the link to the previous entry in this wordlist +0003c9 1cf6 .dw XT_R_FROM +0003ca 1f5f .dw XT_FETCHE +0003cb 02ae .dw XT_COMMA +0003cc 1cf6 .dw XT_R_FROM +0003cd 1c20 .dw XT_EXIT + + PFA_HEADER1: + ; -16: attempt to use zero length string as a name +0003ce 1c3d .dw XT_DOLITERAL +0003cf fff0 .dw -16 +0003d0 08c8 .dw XT_THROW + + .include "words/wlscope.asm" + + ; Compiler + ; dynamically place a word in a wordlist. The word name may be changed. + VE_WLSCOPE: +0003d1 ff07 .dw $ff07 +0003d2 6c77 +0003d3 6373 +0003d4 706f +0003d5 0065 .db "wlscope",0 +0003d6 03b7 .dw VE_HEAD + .set VE_HEAD = VE_WLSCOPE + XT_WLSCOPE: +0003d7 0c9a .dw PFA_DODEFER1 + PFA_WLSCOPE: +0003d8 0032 .dw CFG_WLSCOPE +0003d9 0c3b .dw XT_EDEFERFETCH +0003da 0c45 .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: +0003db ff06 .dw $ff06 +0003dc 6572 +0003dd 6576 +0003de 6c61 .db "reveal" +0003df 03d1 .dw VE_HEAD + .set VE_HEAD = VE_REVEAL + XT_REVEAL: +0003e0 1c01 .dw DO_COLON + PFA_REVEAL: + .endif +0003e1 0271 +0003e2 05e3 +0003e3 1c79 .DW XT_NEWEST,XT_CELLPLUS,XT_FETCH ; only if wordlist is in use +0003e4 1cb9 +0003e5 1c36 .DW XT_QDUP,XT_DOCONDBRANCH +0003e6 03eb DEST(REVEAL1) +0003e7 0271 +0003e8 1c79 +0003e9 1cc4 +0003ea 1f3b .DW XT_NEWEST,XT_FETCH,XT_SWAP,XT_STOREE + ; .DW XT_ZERO,XT_NEWEST,XT_CELLPLUS,XT_STORE ; clean wordlist entry + REVEAL1: +0003eb 1c20 .DW XT_EXIT + .include "words/does.asm" + + ; Compiler + ; organize the XT replacement to call other colon code + VE_DOES: +0003ec 0005 .dw $0005 +0003ed 6f64 +0003ee 7365 +0003ef 003e .db "does>",0 +0003f0 03db .dw VE_HEAD + .set VE_HEAD = VE_DOES + XT_DOES: +0003f1 1c01 .dw DO_COLON + PFA_DOES: +0003f2 02a3 .dw XT_COMPILE +0003f3 0404 .dw XT_DODOES +0003f4 02a3 .dw XT_COMPILE ; create a code snippet to be used in an embedded XT +0003f5 940e .dw $940e ; the address of this compiled +0003f6 02a3 .dw XT_COMPILE ; code will replace the XT of the +0003f7 03f9 .dw DO_DODOES ; word that CREATE created +0003f8 1c20 .dw XT_EXIT ; + + DO_DODOES: ; ( -- PFA ) +0003f9 939a +0003fa 938a savetos +0003fb 01cb movw tosl, wl +0003fc 9601 adiw tosl, 1 + ; the following takes the address from a real uC-call + .if (pclen==3) + .endif +0003fd 917f pop wh +0003fe 916f pop wl + +0003ff 93bf push XH +000400 93af push XL +000401 01db movw XL, wl +000402 940c 1c05 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: +000404 1c01 .dw DO_COLON + PFA_DODOES: +000405 1cf6 .dw XT_R_FROM +000406 0271 .dw XT_NEWEST +000407 05e3 .dw XT_CELLPLUS +000408 1c79 .dw XT_FETCH +000409 1f5f .dw XT_FETCHE +00040a 0d05 .dw XT_NFA2CFA +00040b 1f73 .dw XT_STOREI +00040c 1c20 .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: +00040d ff01 .dw $ff01 +00040e 003a .db ":",0 +00040f 03ec .dw VE_HEAD + .set VE_HEAD = VE_COLON + XT_COLON: +000410 1c01 .dw DO_COLON + PFA_COLON: + .endif +000411 0280 .dw XT_DOCREATE +000412 041b .dw XT_COLONNONAME +000413 1cd9 .dw XT_DROP +000414 1c20 .dw XT_EXIT + .include "words/colon-noname.asm" + + ; Compiler + ; create an unnamed entry in the dictionary, XT is DO_COLON + VE_COLONNONAME: +000415 ff07 .dw $ff07 +000416 6e3a +000417 6e6f +000418 6d61 +000419 0065 .db ":noname",0 +00041a 040d .dw VE_HEAD + .set VE_HEAD = VE_COLONNONAME + XT_COLONNONAME: +00041b 1c01 .dw DO_COLON + PFA_COLONNONAME: +00041c 0634 .dw XT_DP +00041d 1cb1 .dw XT_DUP +00041e 0278 .dw XT_LATEST +00041f 1c81 .dw XT_STORE + +000420 02a3 .dw XT_COMPILE +000421 1c01 .dw DO_COLON + +000422 0430 .dw XT_RBRACKET +000423 1c20 .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: +000424 0001 .dw $0001 +000425 003b .db $3b,0 +000426 0415 .dw VE_HEAD + .set VE_HEAD = VE_SEMICOLON + XT_SEMICOLON: +000427 1c01 .dw DO_COLON + PFA_SEMICOLON: + .endif +000428 02a3 .dw XT_COMPILE +000429 1c20 .dw XT_EXIT +00042a 0438 .dw XT_LBRACKET +00042b 03e0 .dw XT_REVEAL +00042c 1c20 .dw XT_EXIT + .include "words/right-bracket.asm" + + ; Compiler + ; enter compiler mode + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_RBRACKET: +00042d ff01 .dw $ff01 +00042e 005d .db "]",0 +00042f 0424 .dw VE_HEAD + .set VE_HEAD = VE_RBRACKET + XT_RBRACKET: +000430 1c01 .dw DO_COLON + PFA_RBRACKET: + .endif +000431 1fe7 .dw XT_ONE +000432 05d0 .dw XT_STATE +000433 1c81 .dw XT_STORE +000434 1c20 .dw XT_EXIT + .include "words/left-bracket.asm" + + ; Compiler + ; enter interpreter mode + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_LBRACKET: +000435 0001 .dw $0001 +000436 005b .db "[",0 +000437 042d .dw VE_HEAD + .set VE_HEAD = VE_LBRACKET + XT_LBRACKET: +000438 1c01 .dw DO_COLON + PFA_LBRACKET: + .endif +000439 1d54 .dw XT_ZERO +00043a 05d0 .dw XT_STATE +00043b 1c81 .dw XT_STORE +00043c 1c20 .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: +00043d ff08 .dw $ff08 +00043e 6176 +00043f 6972 +000440 6261 +000441 656c .db "variable" +000442 0435 .dw VE_HEAD + .set VE_HEAD = VE_VARIABLE + XT_VARIABLE: +000443 1c01 .dw DO_COLON + PFA_VARIABLE: + .endif +000444 0645 .dw XT_HERE +000445 044f .dw XT_CONSTANT +000446 1fec .dw XT_TWO +000447 064e .dw XT_ALLOT +000448 1c20 .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: +000449 ff08 .dw $ff08 +00044a 6f63 +00044b 736e +00044c 6174 +00044d 746e .db "constant" +00044e 043d .dw VE_HEAD + .set VE_HEAD = VE_CONSTANT + XT_CONSTANT: +00044f 1c01 .dw DO_COLON + PFA_CONSTANT: + .endif +000450 0280 .dw XT_DOCREATE +000451 03e0 .dw XT_REVEAL +000452 02a3 .dw XT_COMPILE +000453 1c48 .dw PFA_DOVARIABLE +000454 02ae .dw XT_COMMA +000455 1c20 .dw XT_EXIT + .include "words/user.asm" + + ; Compiler + ; create a dictionary entry for a user variable at offset n + VE_USER: +000456 ff04 .dw $ff04 +000457 7375 +000458 7265 .db "user" +000459 0449 .dw VE_HEAD + .set VE_HEAD = VE_USER + XT_USER: +00045a 1c01 .dw DO_COLON + PFA_USER: +00045b 0280 .dw XT_DOCREATE +00045c 03e0 .dw XT_REVEAL + +00045d 02a3 .dw XT_COMPILE +00045e 1c58 .dw PFA_DOUSER +00045f 02ae .dw XT_COMMA +000460 1c20 .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: +000461 0007 .dw $0007 +000462 6572 +000463 7563 +000464 7372 +000465 0065 .db "recurse",0 +000466 0456 .dw VE_HEAD + .set VE_HEAD = VE_RECURSE + XT_RECURSE: +000467 1c01 .dw DO_COLON + PFA_RECURSE: + .endif +000468 0278 .dw XT_LATEST +000469 1c79 .dw XT_FETCH +00046a 02ae .dw XT_COMMA +00046b 1c20 .dw XT_EXIT + .include "words/immediate.asm" + + ; Compiler + ; set immediate flag for the most recent word definition + VE_IMMEDIATE: +00046c ff09 .dw $ff09 +00046d 6d69 +00046e 656d +00046f 6964 +000470 7461 +000471 0065 .db "immediate",0 +000472 0461 .dw VE_HEAD + .set VE_HEAD = VE_IMMEDIATE + XT_IMMEDIATE: +000473 1c01 .dw DO_COLON + PFA_IMMEDIATE: +000474 0515 .dw XT_GET_CURRENT +000475 1f5f .dw XT_FETCHE +000476 1cb1 .dw XT_DUP +000477 1fcb .dw XT_FETCHI +000478 1c3d .dw XT_DOLITERAL +000479 7fff .dw $7fff +00047a 1e13 .dw XT_AND +00047b 1cc4 .dw XT_SWAP +00047c 1f73 .dw XT_STOREI +00047d 1c20 .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: +00047e 0006 .dw $0006 +00047f 635b +000480 6168 +000481 5d72 .db "[char]" +000482 046c .dw VE_HEAD + .set VE_HEAD = VE_BRACKETCHAR + XT_BRACKETCHAR: +000483 1c01 .dw DO_COLON + PFA_BRACKETCHAR: + .endif +000484 02a3 .dw XT_COMPILE +000485 1c3d .dw XT_DOLITERAL +000486 0971 .dw XT_CHAR +000487 02ae .dw XT_COMMA +000488 1c20 .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: +000489 0006 .dw $0006 +00048a 6261 +00048b 726f +00048c 2274 .db "abort",'"' +00048d 047e .dw VE_HEAD + .set VE_HEAD = VE_ABORTQUOTE + XT_ABORTQUOTE: +00048e 1c01 .dw DO_COLON + PFA_ABORTQUOTE: + .endif +00048f 024f .dw XT_SQUOTE +000490 02a3 .dw XT_COMPILE +000491 04a0 .dw XT_QABORT +000492 1c20 .DW XT_EXIT + .include "words/abort.asm" + + ; Exceptions + ; send an exception -1 + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_ABORT: +000493 ff05 .dw $ff05 +000494 6261 +000495 726f +000496 0074 .db "abort",0 +000497 0489 .dw VE_HEAD + .set VE_HEAD = VE_ABORT + XT_ABORT: +000498 1c01 .dw DO_COLON + PFA_ABORT: + .endif +000499 1d4b .dw XT_TRUE +00049a 08c8 .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: +00049b ff06 .dw $ff06 +00049c 613f +00049d 6f62 +00049e 7472 .db "?abort" +00049f 0493 .dw VE_HEAD + .set VE_HEAD = VE_QABORT + XT_QABORT: +0004a0 1c01 .dw DO_COLON + PFA_QABORT: + + .endif +0004a1 1ce1 +0004a2 1c36 .DW XT_ROT,XT_DOCONDBRANCH +0004a3 04a6 DEST(QABO1) +0004a4 0827 +0004a5 0498 .DW XT_ITYPE,XT_ABORT +0004a6 05f4 +0004a7 1c20 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: +0004a8 ff09 .dw $ff09 +0004a9 6567 +0004aa 2d74 +0004ab 7473 +0004ac 6361 +0004ad 006b .db "get-stack",0 +0004ae 049b .dw VE_HEAD + .set VE_HEAD = VE_GET_STACK + XT_GET_STACK: +0004af 1c01 .dw DO_COLON + .endif +0004b0 1cb1 .dw XT_DUP +0004b1 05e3 .dw XT_CELLPLUS +0004b2 1cc4 .dw XT_SWAP +0004b3 1f5f .dw XT_FETCHE +0004b4 1cb1 .dw XT_DUP +0004b5 1cff .dw XT_TO_R +0004b6 1d54 .dw XT_ZERO +0004b7 1cc4 .dw XT_SWAP ; go from bigger to smaller addresses +0004b8 036d .dw XT_QDOCHECK +0004b9 1c36 .dw XT_DOCONDBRANCH +0004ba 04c6 DEST(PFA_N_FETCH_E2) +0004bb 1e9b .dw XT_DODO + PFA_N_FETCH_E1: + ; ( ee-addr ) +0004bc 1eac .dw XT_I +0004bd 1e35 .dw XT_1MINUS +0004be 05dd .dw XT_CELLS ; ( -- ee-addr i*2 ) +0004bf 1ccf .dw XT_OVER ; ( -- ee-addr i*2 ee-addr ) +0004c0 1d9d .dw XT_PLUS ; ( -- ee-addr ee-addr+i +0004c1 1f5f .dw XT_FETCHE ;( -- ee-addr item_i ) +0004c2 1cc4 .dw XT_SWAP ;( -- item_i ee-addr ) +0004c3 1d4b .dw XT_TRUE ; shortcut for -1 +0004c4 1eba .dw XT_DOPLUSLOOP +0004c5 04bc DEST(PFA_N_FETCH_E1) + PFA_N_FETCH_E2: +0004c6 05f4 .dw XT_2DROP +0004c7 1cf6 .dw XT_R_FROM +0004c8 1c20 .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: +0004c9 ff09 .dw $ff09 +0004ca 6573 +0004cb 2d74 +0004cc 7473 +0004cd 6361 +0004ce 006b .db "set-stack",0 +0004cf 04a8 .dw VE_HEAD + .set VE_HEAD = VE_SET_STACK + XT_SET_STACK: +0004d0 1c01 .dw DO_COLON + PFA_SET_STACK: + .endif +0004d1 1ccf .dw XT_OVER +0004d2 1d21 .dw XT_ZEROLESS +0004d3 1c36 .dw XT_DOCONDBRANCH +0004d4 04d8 DEST(PFA_SET_STACK0) +0004d5 1c3d .dw XT_DOLITERAL +0004d6 fffc .dw -4 +0004d7 08c8 .dw XT_THROW + PFA_SET_STACK0: +0004d8 05eb .dw XT_2DUP +0004d9 1f3b .dw XT_STOREE ; ( -- i_n .. i_0 n e-addr ) +0004da 1cc4 .dw XT_SWAP +0004db 1d54 .dw XT_ZERO +0004dc 036d .dw XT_QDOCHECK +0004dd 1c36 .dw XT_DOCONDBRANCH +0004de 04e5 DEST(PFA_SET_STACK2) +0004df 1e9b .dw XT_DODO + PFA_SET_STACK1: +0004e0 05e3 .dw XT_CELLPLUS ; ( -- i_x e-addr ) +0004e1 05fc .dw XT_TUCK ; ( -- e-addr i_x e-addr +0004e2 1f3b .dw XT_STOREE +0004e3 1ec9 .dw XT_DOLOOP +0004e4 04e0 DEST(PFA_SET_STACK1) + PFA_SET_STACK2: +0004e5 1cd9 .dw XT_DROP +0004e6 1c20 .dw XT_EXIT + + .include "words/map-stack.asm" + + ; Tools + ; Iterate over a stack + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_MAPSTACK: +0004e7 ff09 .dw $ff09 +0004e8 616d +0004e9 2d70 +0004ea 7473 +0004eb 6361 +0004ec 006b .db "map-stack",0 +0004ed 04c9 .dw VE_HEAD + .set VE_HEAD = VE_MAPSTACK + XT_MAPSTACK: +0004ee 1c01 .dw DO_COLON + PFA_MAPSTACK: + .endif +0004ef 1cb1 .dw XT_DUP +0004f0 05e3 .dw XT_CELLPLUS +0004f1 1cc4 .dw XT_SWAP +0004f2 1f5f .dw XT_FETCHE +0004f3 05dd .dw XT_CELLS +0004f4 0de5 .dw XT_BOUNDS +0004f5 036d .dw XT_QDOCHECK +0004f6 1c36 .dw XT_DOCONDBRANCH +0004f7 050a DEST(PFA_MAPSTACK3) +0004f8 1e9b .dw XT_DODO + PFA_MAPSTACK1: +0004f9 1eac .dw XT_I +0004fa 1f5f .dw XT_FETCHE ; -- i*x XT id +0004fb 1cc4 .dw XT_SWAP +0004fc 1cff .dw XT_TO_R +0004fd 1d08 .dw XT_R_FETCH +0004fe 1c2a .dw XT_EXECUTE ; i*x id -- j*y true | i*x false +0004ff 1cb9 .dw XT_QDUP +000500 1c36 .dw XT_DOCONDBRANCH +000501 0506 DEST(PFA_MAPSTACK2) +000502 1cf6 .dw XT_R_FROM +000503 1cd9 .dw XT_DROP +000504 1ed4 .dw XT_UNLOOP +000505 1c20 .dw XT_EXIT + PFA_MAPSTACK2: +000506 1cf6 .dw XT_R_FROM +000507 1fec .dw XT_TWO +000508 1eba .dw XT_DOPLUSLOOP +000509 04f9 DEST(PFA_MAPSTACK1) + PFA_MAPSTACK3: +00050a 1cd9 .dw XT_DROP +00050b 1d54 .dw XT_ZERO +00050c 1c20 .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: +00050d ff0b .dw $ff0b +00050e 6567 +00050f 2d74 +000510 7563 +000511 7272 +000512 6e65 +000513 0074 .db "get-current",0 +000514 04e7 .dw VE_HEAD + .set VE_HEAD = VE_GET_CURRENT + XT_GET_CURRENT: +000515 1c01 .dw DO_COLON + PFA_GET_CURRENT: +000516 1c3d .dw XT_DOLITERAL +000517 003c .dw CFG_CURRENT +000518 1f5f .dw XT_FETCHE +000519 1c20 .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: +00051a ff09 .dw $ff09 +00051b 6567 +00051c 2d74 +00051d 726f +00051e 6564 +00051f 0072 .db "get-order",0 +000520 050d .dw VE_HEAD + .set VE_HEAD = VE_GET_ORDER + XT_GET_ORDER: +000521 1c01 .dw DO_COLON + PFA_GET_ORDER: + .endif +000522 1c3d .dw XT_DOLITERAL +000523 0040 .dw CFG_ORDERLISTLEN +000524 04af .dw XT_GET_STACK +000525 1c20 .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: +000526 ff09 .dw $ff09 +000527 6663 +000528 2d67 +000529 726f +00052a 6564 +00052b 0072 .db "cfg-order",0 +00052c 051a .dw VE_HEAD + .set VE_HEAD = VE_CFG_ORDER + XT_CFG_ORDER: +00052d 1c48 .dw PFA_DOVARIABLE + PFA_CFG_ORDER: + .endif +00052e 0040 .dw CFG_ORDERLISTLEN + .include "words/compare.asm" + + ; String + ; compares two strings in RAM + VE_COMPARE: +00052f ff07 .dw $ff07 +000530 6f63 +000531 706d +000532 7261 +000533 0065 .db "compare",0 +000534 0526 .dw VE_HEAD + .set VE_HEAD = VE_COMPARE + XT_COMPARE: +000535 0536 .dw PFA_COMPARE + PFA_COMPARE: +000536 93bf push xh +000537 93af push xl +000538 018c movw temp0, tosl +000539 9189 +00053a 9199 loadtos +00053b 01dc movw xl, tosl +00053c 9189 +00053d 9199 loadtos +00053e 019c movw temp2, tosl +00053f 9189 +000540 9199 loadtos +000541 01fc movw zl, tosl + PFA_COMPARE_LOOP: +000542 90ed ld temp4, X+ +000543 90f1 ld temp5, Z+ +000544 14ef cp temp4, temp5 +000545 f451 brne PFA_COMPARE_NOTEQUAL +000546 950a dec temp0 +000547 f019 breq PFA_COMPARE_ENDREACHED2 +000548 952a dec temp2 +000549 f7c1 brne PFA_COMPARE_LOOP +00054a c001 rjmp PFA_COMPARE_ENDREACHED + PFA_COMPARE_ENDREACHED2: +00054b 952a dec temp2 + PFA_COMPARE_ENDREACHED: +00054c 2b02 or temp0, temp2 +00054d f411 brne PFA_COMPARE_CHECKLASTCHAR +00054e 2788 clr tosl +00054f c002 rjmp PFA_COMPARE_DONE + PFA_COMPARE_CHECKLASTCHAR: + PFA_COMPARE_NOTEQUAL: +000550 ef8f ser tosl +000551 c000 rjmp PFA_COMPARE_DONE + + PFA_COMPARE_DONE: +000552 2f98 mov tosh, tosl +000553 91af pop xl +000554 91bf pop xh +000555 940c 1c05 jmp_ DO_NEXT + .include "words/nfa2lfa.asm" + + ; System + ; get the link field address from the name field address + VE_NFA2LFA: +000557 ff07 .dw $ff07 +000558 666e +000559 3e61 +00055a 666c +00055b 0061 .db "nfa>lfa",0 +00055c 052f .dw VE_HEAD + .set VE_HEAD = VE_NFA2LFA + XT_NFA2LFA: +00055d 1c01 .dw DO_COLON + PFA_NFA2LFA: +00055e 0cf9 .dw XT_NAME2STRING +00055f 1e2f .dw XT_1PLUS +000560 1e04 .dw XT_2SLASH +000561 1d9d .dw XT_PLUS +000562 1c20 .dw XT_EXIT + + .include "words/environment.asm" + + ; System Value + ; word list identifier of the environmental search list + VE_ENVIRONMENT: +000563 ff0b .dw $ff0b +000564 6e65 +000565 6976 +000566 6f72 +000567 6d6e +000568 6e65 +000569 0074 .db "environment",0 +00056a 0557 .dw VE_HEAD + .set VE_HEAD = VE_ENVIRONMENT + XT_ENVIRONMENT: +00056b 1c48 .dw PFA_DOVARIABLE + PFA_ENVIRONMENT: +00056c 003a .dw CFG_ENVIRONMENT + .include "words/env-wordlists.asm" + + ; Environment + ; maximum number of wordlists in the dictionary search order + VE_ENVWORDLISTS: +00056d ff09 .dw $ff09 +00056e 6f77 +00056f 6472 +000570 696c +000571 7473 +000572 0073 .db "wordlists",0 +000573 0000 .dw VE_ENVHEAD + .set VE_ENVHEAD = VE_ENVWORDLISTS + XT_ENVWORDLISTS: +000574 1c01 .dw DO_COLON + PFA_ENVWORDLISTS: +000575 1c3d .dw XT_DOLITERAL +000576 0008 .dw NUMWORDLISTS +000577 1c20 .dw XT_EXIT + .include "words/env-slashpad.asm" + + ; Environment + ; Size of the PAD buffer in bytes + VE_ENVSLASHPAD: +000578 ff04 .dw $ff04 +000579 702f +00057a 6461 .db "/pad" +00057b 056d .dw VE_ENVHEAD + .set VE_ENVHEAD = VE_ENVSLASHPAD + XT_ENVSLASHPAD: +00057c 1c01 .dw DO_COLON + PFA_ENVSLASHPAD: +00057d 1e8d .dw XT_SP_FETCH +00057e 060a .dw XT_PAD +00057f 1d93 .dw XT_MINUS +000580 1c20 .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: +000581 ff05 .dw $ff05 +000582 682f +000583 6c6f +000584 0064 .db "/hold",0 +000585 0578 .dw VE_ENVHEAD + .set VE_ENVHEAD = VE_ENVSLASHHOLD + XT_ENVSLASHHOLD: +000586 1c01 .dw DO_COLON + PFA_ENVSLASHHOLD: + .endif +000587 060a .dw XT_PAD +000588 0645 .dw XT_HERE +000589 1d93 .dw XT_MINUS +00058a 1c20 .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: +00058b ff0a .dw $ff0a +00058c 6f66 +00058d 7472 +00058e 2d68 +00058f 616e +000590 656d .db "forth-name" +000591 0581 .dw VE_ENVHEAD + .set VE_ENVHEAD = VE_ENV_FORTHNAME + XT_ENV_FORTHNAME: +000592 1c01 .dw DO_COLON + PFA_EN_FORTHNAME: +000593 07f4 .dw XT_DOSLITERAL +000594 0007 .dw 7 + .endif +000595 6d61 +000596 6f66 +000597 7472 +../../common\words/env-forthname.asm(22): warning: .cseg .db misalignment - padding zero byte +000598 0068 .db "amforth" + .if cpu_msp430==1 + .endif +000599 1c20 .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: +00059a ff07 .dw $ff07 +00059b 6576 +00059c 7372 +00059d 6f69 +00059e 006e .db "version",0 +00059f 058b .dw VE_ENVHEAD + .set VE_ENVHEAD = VE_ENV_FORTHVERSION + XT_ENV_FORTHVERSION: +0005a0 1c01 .dw DO_COLON + PFA_EN_FORTHVERSION: + .endif +0005a1 1c3d .dw XT_DOLITERAL +0005a2 0041 .dw 65 +0005a3 1c20 .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: +0005a4 ff03 .dw $ff03 +0005a5 7063 +0005a6 0075 .db "cpu",0 +0005a7 059a .dw VE_ENVHEAD + .set VE_ENVHEAD = VE_ENV_CPU + XT_ENV_CPU: +0005a8 1c01 .dw DO_COLON + PFA_EN_CPU: + .endif +0005a9 1c3d .dw XT_DOLITERAL +0005aa 002d .dw mcu_name +0005ab 0853 .dw XT_ICOUNT +0005ac 1c20 .dw XT_EXIT + .include "words/env-mcuinfo.asm" + + ; Environment + ; flash address of some CPU specific parameters + VE_ENV_MCUINFO: +0005ad ff08 .dw $ff08 +0005ae 636d +0005af 2d75 +0005b0 6e69 +0005b1 6f66 .db "mcu-info" +0005b2 05a4 .dw VE_ENVHEAD + .set VE_ENVHEAD = VE_ENV_MCUINFO + XT_ENV_MCUINFO: +0005b3 1c01 .dw DO_COLON + PFA_EN_MCUINFO: +0005b4 1c3d .dw XT_DOLITERAL +0005b5 0029 .dw mcu_info +0005b6 1c20 .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: +0005b7 ff05 .dw $ff05 +0005b8 752f +0005b9 6573 +0005ba 0072 .db "/user",0 +0005bb 05ad .dw VE_ENVHEAD + .set VE_ENVHEAD = VE_ENVUSERSIZE + XT_ENVUSERSIZE: +0005bc 1c01 .dw DO_COLON + PFA_ENVUSERSIZE: + .endif +0005bd 1c3d .dw XT_DOLITERAL +0005be 002c .dw SYSUSERSIZE + APPUSERSIZE +0005bf 1c20 .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: +0005c0 ff05 .dw $ff05 +0005c1 5f66 +0005c2 7063 +0005c3 0075 .db "f_cpu",0 +0005c4 0563 .dw VE_HEAD + .set VE_HEAD = VE_F_CPU + XT_F_CPU: +0005c5 1c01 .dw DO_COLON + PFA_F_CPU: + .endif +0005c6 1c3d .dw XT_DOLITERAL +0005c7 1200 .dw (F_CPU % 65536) +0005c8 1c3d .dw XT_DOLITERAL +0005c9 007a .dw (F_CPU / 65536) +0005ca 1c20 .dw XT_EXIT + .include "words/state.asm" + + ; System Variable + ; system state + VE_STATE: +0005cb ff05 .dw $ff05 +0005cc 7473 +0005cd 7461 +0005ce 0065 .db "state",0 +0005cf 05c0 .dw VE_HEAD + .set VE_HEAD = VE_STATE + XT_STATE: +0005d0 1c48 .dw PFA_DOVARIABLE + PFA_STATE: +0005d1 008f .dw ram_state + + .dseg +00008f 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: +0005d2 ff04 .dw $ff04 +0005d3 6162 +0005d4 6573 .db "base" +0005d5 05cb .dw VE_HEAD + .set VE_HEAD = VE_BASE + XT_BASE: +0005d6 1c58 .dw PFA_DOUSER + PFA_BASE: + .endif +0005d7 000c .dw USER_BASE + + .include "words/cells.asm" + + ; Arithmetics + ; n2 is the size in address units of n1 cells + VE_CELLS: +0005d8 ff05 .dw $ff05 +0005d9 6563 +0005da 6c6c +0005db 0073 .db "cells",0 +0005dc 05d2 .dw VE_HEAD + .set VE_HEAD = VE_CELLS + XT_CELLS: +0005dd 1e0c .dw PFA_2STAR + .include "words/cellplus.asm" + + ; Arithmetics + ; add the size of an address-unit to a-addr1 + VE_CELLPLUS: +0005de ff05 .dw $ff05 +0005df 6563 +0005e0 6c6c +0005e1 002b .db "cell+",0 +0005e2 05d8 .dw VE_HEAD + .set VE_HEAD = VE_CELLPLUS + XT_CELLPLUS: +0005e3 05e4 .dw PFA_CELLPLUS + PFA_CELLPLUS: +0005e4 9602 adiw tosl, CELLSIZE +0005e5 940c 1c05 jmp_ DO_NEXT + + .include "words/2dup.asm" + + ; Stack + ; Duplicate the 2 top elements + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_2DUP: +0005e7 ff04 .dw $ff04 +0005e8 6432 +0005e9 7075 .db "2dup" +0005ea 05de .dw VE_HEAD + .set VE_HEAD = VE_2DUP + XT_2DUP: +0005eb 1c01 .dw DO_COLON + PFA_2DUP: + .endif + +0005ec 1ccf .dw XT_OVER +0005ed 1ccf .dw XT_OVER +0005ee 1c20 .dw XT_EXIT + .include "words/2drop.asm" + + ; Stack + ; Remove the 2 top elements + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_2DROP: +0005ef ff05 .dw $ff05 +0005f0 6432 +0005f1 6f72 +0005f2 0070 .db "2drop",0 +0005f3 05e7 .dw VE_HEAD + .set VE_HEAD = VE_2DROP + XT_2DROP: +0005f4 1c01 .dw DO_COLON + PFA_2DROP: + .endif +0005f5 1cd9 .dw XT_DROP +0005f6 1cd9 .dw XT_DROP +0005f7 1c20 .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: +0005f8 ff04 .dw $ff04 +0005f9 7574 +0005fa 6b63 .db "tuck" +0005fb 05ef .dw VE_HEAD + .set VE_HEAD = VE_TUCK + XT_TUCK: +0005fc 1c01 .dw DO_COLON + PFA_TUCK: + .endif +0005fd 1cc4 .dw XT_SWAP +0005fe 1ccf .dw XT_OVER +0005ff 1c20 .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: +000600 ff03 .dw $ff03 +000601 693e +000602 006e .db ">in",0 +000603 05f8 .dw VE_HEAD + .set VE_HEAD = VE_TO_IN + XT_TO_IN: +000604 1c58 .dw PFA_DOUSER + PFA_TO_IN: + .endif +000605 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: +000606 ff03 .dw $ff03 +000607 6170 +000608 0064 .db "pad",0 +000609 0600 .dw VE_HEAD + .set VE_HEAD = VE_PAD + XT_PAD: +00060a 1c01 .dw DO_COLON + PFA_PAD: + .endif +00060b 0645 .dw XT_HERE +00060c 1c3d .dw XT_DOLITERAL +00060d 0028 .dw 40 +00060e 1d9d .dw XT_PLUS +00060f 1c20 .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: +000610 ff04 .dw $ff04 +000611 6d65 +000612 7469 .db "emit" +000613 0606 .dw VE_HEAD + .set VE_HEAD = VE_EMIT + XT_EMIT: +000614 0c9a .dw PFA_DODEFER1 + PFA_EMIT: + .endif +000615 000e .dw USER_EMIT +000616 0c63 .dw XT_UDEFERFETCH +000617 0c6f .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: +000618 ff05 .dw $ff05 +000619 6d65 +00061a 7469 +00061b 003f .db "emit?",0 +00061c 0610 .dw VE_HEAD + .set VE_HEAD = VE_EMITQ + XT_EMITQ: +00061d 0c9a .dw PFA_DODEFER1 + PFA_EMITQ: + .endif +00061e 0010 .dw USER_EMITQ +00061f 0c63 .dw XT_UDEFERFETCH +000620 0c6f .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: +000621 ff03 .dw $ff03 +000622 656b +000623 0079 .db "key",0 +000624 0618 .dw VE_HEAD + .set VE_HEAD = VE_KEY + XT_KEY: +000625 0c9a .dw PFA_DODEFER1 + PFA_KEY: + .endif +000626 0012 .dw USER_KEY +000627 0c63 .dw XT_UDEFERFETCH +000628 0c6f .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: +000629 ff04 .dw $ff04 +00062a 656b +00062b 3f79 .db "key?" +00062c 0621 .dw VE_HEAD + .set VE_HEAD = VE_KEYQ + XT_KEYQ: +00062d 0c9a .dw PFA_DODEFER1 + PFA_KEYQ: + .endif +00062e 0014 .dw USER_KEYQ +00062f 0c63 .dw XT_UDEFERFETCH +000630 0c6f .dw XT_UDEFERSTORE + + .include "words/dp.asm" + + ; System Value + ; address of the next free dictionary cell + VE_DP: +000631 ff02 .dw $ff02 +000632 7064 .db "dp" +000633 0629 .dw VE_HEAD + .set VE_HEAD = VE_DP + XT_DP: +000634 1c6f .dw PFA_DOVALUE1 + PFA_DP: +000635 002c .dw CFG_DP +000636 0c3b .dw XT_EDEFERFETCH +000637 0c45 .dw XT_EDEFERSTORE + .include "words/ehere.asm" + + ; System Value + ; address of the next free address in eeprom + VE_EHERE: +000638 ff05 .dw $ff05 +000639 6865 +00063a 7265 +00063b 0065 .db "ehere",0 +00063c 0631 .dw VE_HEAD + .set VE_HEAD = VE_EHERE + XT_EHERE: +00063d 1c6f .dw PFA_DOVALUE1 + PFA_EHERE: +00063e 0030 .dw EE_EHERE +00063f 0c3b .dw XT_EDEFERFETCH +000640 0c45 .dw XT_EDEFERSTORE + .include "words/here.asm" + + ; System Value + ; address of the next free data space (RAM) cell + VE_HERE: +000641 ff04 .dw $ff04 +000642 6568 +000643 6572 .db "here" +000644 0638 .dw VE_HEAD + .set VE_HEAD = VE_HERE + XT_HERE: +000645 1c6f .dw PFA_DOVALUE1 + PFA_HERE: +000646 002e .dw EE_HERE +000647 0c3b .dw XT_EDEFERFETCH +000648 0c45 .dw XT_EDEFERSTORE + .include "words/allot.asm" + + ; System + ; allocate or release memory in RAM + VE_ALLOT: +000649 ff05 .dw $ff05 +00064a 6c61 +00064b 6f6c +00064c 0074 .db "allot",0 +00064d 0641 .dw VE_HEAD + .set VE_HEAD = VE_ALLOT + XT_ALLOT: +00064e 1c01 .dw DO_COLON + PFA_ALLOT: +00064f 0645 .dw XT_HERE +000650 1d9d .dw XT_PLUS +000651 0c20 .dw XT_DOTO +000652 0646 .dw PFA_HERE +000653 1c20 .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: +000654 ff03 .dw $ff03 +000655 6962 +000656 006e .db "bin",0 +000657 0649 .dw VE_HEAD + .set VE_HEAD = VE_BIN + XT_BIN: +000658 1c01 .dw DO_COLON + PFA_BIN: + .endif +000659 1fec .dw XT_TWO +00065a 05d6 .dw XT_BASE +00065b 1c81 .dw XT_STORE +00065c 1c20 .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: +00065d ff07 .dw $ff07 +00065e 6564 +00065f 6963 +000660 616d +000661 006c .db "decimal",0 +000662 0654 .dw VE_HEAD + .set VE_HEAD = VE_DECIMAL + XT_DECIMAL: +000663 1c01 .dw DO_COLON + PFA_DECIMAL: + .endif +000664 1c3d .dw XT_DOLITERAL +000665 000a .dw 10 +000666 05d6 .dw XT_BASE +000667 1c81 .dw XT_STORE +000668 1c20 .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: +000669 ff03 .dw $ff03 +00066a 6568 +00066b 0078 .db "hex",0 +00066c 065d .dw VE_HEAD + .set VE_HEAD = VE_HEX + XT_HEX: +00066d 1c01 .dw DO_COLON + PFA_HEX: + .endif +00066e 1c3d .dw XT_DOLITERAL +00066f 0010 .dw 16 +000670 05d6 .dw XT_BASE +000671 1c81 .dw XT_STORE +000672 1c20 .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: +000673 ff02 .dw $ff02 +000674 6c62 .db "bl" +000675 0669 .dw VE_HEAD + .set VE_HEAD = VE_BL + XT_BL: +000676 1c48 .dw PFA_DOVARIABLE + PFA_BL: + .endif +000677 0020 .dw 32 + + .include "words/turnkey.asm" + + ; System Value + ; Deferred action during startup/reset + VE_TURNKEY: +000678 ff07 .dw $ff07 +000679 7574 +00067a 6e72 +00067b 656b +00067c 0079 .db "turnkey",0 +00067d 0673 .dw VE_HEAD + .set VE_HEAD = VE_TURNKEY + XT_TURNKEY: +00067e 0c9a .dw PFA_DODEFER1 + PFA_TURNKEY: +00067f 0038 .dw CFG_TURNKEY +000680 0c3b .dw XT_EDEFERFETCH +000681 0c45 .dw XT_EDEFERSTORE + + .include "words/slashmod.asm" + + ; Arithmetics + ; signed division n1/n2 with remainder and quotient + VE_SLASHMOD: +000682 ff04 .dw $ff04 +000683 6d2f +000684 646f .db "/mod" +000685 0678 .dw VE_HEAD + .set VE_HEAD = VE_SLASHMOD + XT_SLASHMOD: +000686 0687 .dw PFA_SLASHMOD + PFA_SLASHMOD: +000687 019c movw temp2, tosl + +000688 9109 ld temp0, Y+ +000689 9119 ld temp1, Y+ + +00068a 2f41 mov temp6,temp1 ;move dividend High to sign register +00068b 2743 eor temp6,temp3 ;xor divisor High with sign register +00068c ff17 sbrs temp1,7 ;if MSB in dividend set +00068d c004 rjmp PFA_SLASHMOD_1 +00068e 9510 com temp1 ; change sign of dividend +00068f 9500 com temp0 +000690 5f0f subi temp0,low(-1) +000691 4f1f sbci temp1,high(-1) + PFA_SLASHMOD_1: +000692 ff37 sbrs temp3,7 ;if MSB in divisor set +000693 c004 rjmp PFA_SLASHMOD_2 +000694 9530 com temp3 ; change sign of divisor +000695 9520 com temp2 +000696 5f2f subi temp2,low(-1) +000697 4f3f sbci temp3,high(-1) +000698 24ee PFA_SLASHMOD_2: clr temp4 ;clear remainder Low byte +000699 18ff sub temp5,temp5;clear remainder High byte and carry +00069a e151 ldi temp7,17 ;init loop counter + +00069b 1f00 PFA_SLASHMOD_3: rol temp0 ;shift left dividend +00069c 1f11 rol temp1 +00069d 955a dec temp7 ;decrement counter +00069e f439 brne PFA_SLASHMOD_5 ;if done +00069f ff47 sbrs temp6,7 ; if MSB in sign register set +0006a0 c004 rjmp PFA_SLASHMOD_4 +0006a1 9510 com temp1 ; change sign of result +0006a2 9500 com temp0 +0006a3 5f0f subi temp0,low(-1) +0006a4 4f1f sbci temp1,high(-1) +0006a5 c00b PFA_SLASHMOD_4: rjmp PFA_SLASHMODmod_done ; return +0006a6 1cee PFA_SLASHMOD_5: rol temp4 ;shift dividend into remainder +0006a7 1cff rol temp5 +0006a8 1ae2 sub temp4,temp2 ;remainder = remainder - divisor +0006a9 0af3 sbc temp5,temp3 ; +0006aa f420 brcc PFA_SLASHMOD_6 ;if result negative +0006ab 0ee2 add temp4,temp2 ; restore remainder +0006ac 1ef3 adc temp5,temp3 +0006ad 9488 clc ; clear carry to be shifted into result +0006ae cfec rjmp PFA_SLASHMOD_3 ;else +0006af 9408 PFA_SLASHMOD_6: sec ; set carry to be shifted into result +0006b0 cfea rjmp PFA_SLASHMOD_3 + + PFA_SLASHMODmod_done: + ; put remainder on stack +0006b1 92fa st -Y,temp5 +0006b2 92ea st -Y,temp4 + + ; put quotient on stack +0006b3 01c8 movw tosl, temp0 +0006b4 940c 1c05 jmp_ DO_NEXT + .include "words/uslashmod.asm" + + ; Arithmetics + ; unsigned division with remainder + VE_USLASHMOD: +0006b6 ff05 .dw $ff05 +0006b7 2f75 +0006b8 6f6d +0006b9 0064 .db "u/mod",0 +0006ba 0682 .dw VE_HEAD + .set VE_HEAD = VE_USLASHMOD + XT_USLASHMOD: +0006bb 1c01 .dw DO_COLON + PFA_USLASHMOD: +0006bc 1cff .dw XT_TO_R +0006bd 1d54 .dw XT_ZERO +0006be 1cf6 .dw XT_R_FROM +0006bf 1dc2 .dw XT_UMSLASHMOD +0006c0 1c20 .dw XT_EXIT + .include "words/negate.asm" + + ; Logic + ; 2-complement + VE_NEGATE: +0006c1 ff06 .dw $ff06 +0006c2 656e +0006c3 6167 +0006c4 6574 .db "negate" +0006c5 06b6 .dw VE_HEAD + .set VE_HEAD = VE_NEGATE + XT_NEGATE: +0006c6 1c01 .dw DO_COLON + PFA_NEGATE: +0006c7 1dfd .dw XT_INVERT +0006c8 1e2f .dw XT_1PLUS +0006c9 1c20 .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: +0006ca ff01 .dw $ff01 +0006cb 002f .db "/",0 +0006cc 06c1 .dw VE_HEAD + .set VE_HEAD = VE_SLASH + XT_SLASH: +0006cd 1c01 .dw DO_COLON + PFA_SLASH: + .endif +0006ce 0686 .dw XT_SLASHMOD +0006cf 1cf0 .dw XT_NIP +0006d0 1c20 .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: +0006d1 ff03 .dw $ff03 +0006d2 6f6d +0006d3 0064 .db "mod",0 +0006d4 06ca .dw VE_HEAD + .set VE_HEAD = VE_MOD + XT_MOD: +0006d5 1c01 .dw DO_COLON + PFA_MOD: + .endif +0006d6 0686 .dw XT_SLASHMOD +0006d7 1cd9 .dw XT_DROP +0006d8 1c20 .dw XT_EXIT + .include "words/abs.asm" + + ; DUP ?NEGATE ; + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_ABS: +0006d9 ff03 .dw $ff03 +0006da 6261 +0006db 0073 .db "abs",0 +0006dc 06d1 .dw VE_HEAD + .set VE_HEAD = VE_ABS + XT_ABS: +0006dd 1c01 .dw DO_COLON + PFA_ABS: + + .endif + +0006de 1cb1 +0006df 1e3e +0006e0 1c20 .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: +0006e1 ff03 .dw $ff03 +0006e2 696d +0006e3 006e .db "min",0 +0006e4 06d9 .dw VE_HEAD + .set VE_HEAD = VE_MIN + XT_MIN: +0006e5 1c01 .dw DO_COLON + PFA_MIN: + .endif +0006e6 05eb .dw XT_2DUP +0006e7 1d78 .dw XT_GREATER +0006e8 1c36 .dw XT_DOCONDBRANCH +0006e9 06eb DEST(PFA_MIN1) +0006ea 1cc4 .dw XT_SWAP + PFA_MIN1: +0006eb 1cd9 .dw XT_DROP +0006ec 1c20 .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: +0006ed ff03 .dw $ff03 +0006ee 616d +0006ef 0078 .db "max",0 +0006f0 06e1 .dw VE_HEAD + .set VE_HEAD = VE_MAX + XT_MAX: +0006f1 1c01 .dw DO_COLON + PFA_MAX: + + .endif +0006f2 05eb .dw XT_2DUP +0006f3 1d6e .dw XT_LESS +0006f4 1c36 .dw XT_DOCONDBRANCH +0006f5 06f7 DEST(PFA_MAX1) +0006f6 1cc4 .dw XT_SWAP + PFA_MAX1: +0006f7 1cd9 .dw XT_DROP +0006f8 1c20 .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: +0006f9 ff06 .dw $ff06 +0006fa 6977 +0006fb 6874 +0006fc 6e69 .db "within" +0006fd 06ed .dw VE_HEAD + .set VE_HEAD = VE_WITHIN + XT_WITHIN: +0006fe 1c01 .dw DO_COLON + PFA_WITHIN: + .endif +0006ff 1ccf .dw XT_OVER +000700 1d93 .dw XT_MINUS +000701 1cff .dw XT_TO_R +000702 1d93 .dw XT_MINUS +000703 1cf6 .dw XT_R_FROM +000704 1d5c .dw XT_ULESS +000705 1c20 .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: +000706 ff07 .dw $ff07 +000707 6f74 +000708 7075 +000709 6570 +00070a 0072 .db "toupper",0 +00070b 06f9 .dw VE_HEAD + .set VE_HEAD = VE_TOUPPER + XT_TOUPPER: +00070c 1c01 .dw DO_COLON + PFA_TOUPPER: + .endif +00070d 1cb1 .dw XT_DUP +00070e 1c3d .dw XT_DOLITERAL +00070f 0061 .dw 'a' +000710 1c3d .dw XT_DOLITERAL +000711 007b .dw 'z'+1 +000712 06fe .dw XT_WITHIN +000713 1c36 .dw XT_DOCONDBRANCH +000714 0718 DEST(PFA_TOUPPER0) +000715 1c3d .dw XT_DOLITERAL +000716 00df .dw 223 ; inverse of 0x20: 0xdf +000717 1e13 .dw XT_AND + PFA_TOUPPER0: +000718 1c20 .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: +000719 ff07 .dw $ff07 +00071a 6f74 +00071b 6f6c +00071c 6577 +00071d 0072 .db "tolower",0 +00071e 0706 .dw VE_HEAD + .set VE_HEAD = VE_TOLOWER + XT_TOLOWER: +00071f 1c01 .dw DO_COLON + PFA_TOLOWER: + .endif +000720 1cb1 .dw XT_DUP +000721 1c3d .dw XT_DOLITERAL +000722 0041 .dw 'A' +000723 1c3d .dw XT_DOLITERAL +000724 005b .dw 'Z'+1 +000725 06fe .dw XT_WITHIN +000726 1c36 .dw XT_DOCONDBRANCH +000727 072b DEST(PFA_TOLOWER0) +000728 1c3d .dw XT_DOLITERAL +000729 0020 .dw 32 +00072a 1e1c .dw XT_OR + PFA_TOLOWER0: +00072b 1c20 .dw XT_EXIT + ;;;;;;;;;;;;;;;;;;;;;; + .include "words/hld.asm" + + ; Numeric IO + ; pointer to current write position in the Pictured Numeric Output buffer + VE_HLD: +00072c ff03 .dw $ff03 +00072d 6c68 +00072e 0064 .db "hld",0 +00072f 0719 .dw VE_HEAD + .set VE_HEAD = VE_HLD + XT_HLD: +000730 1c48 .dw PFA_DOVARIABLE + PFA_HLD: +000731 0091 .dw ram_hld + + .dseg +000091 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: +000732 ff04 .dw $ff04 +000733 6f68 +000734 646c .db "hold" +000735 072c .dw VE_HEAD + .set VE_HEAD = VE_HOLD + XT_HOLD: +000736 1c01 .dw DO_COLON + PFA_HOLD: + .endif +000737 0730 .dw XT_HLD +000738 1cb1 .dw XT_DUP +000739 1c79 .dw XT_FETCH +00073a 1e35 .dw XT_1MINUS +00073b 1cb1 .dw XT_DUP +00073c 1cff .dw XT_TO_R +00073d 1cc4 .dw XT_SWAP +00073e 1c81 .dw XT_STORE +00073f 1cf6 .dw XT_R_FROM +000740 1c8d .dw XT_CSTORE +000741 1c20 .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: +000742 ff02 .dw $ff02 +000743 233c .db "<#" +000744 0732 .dw VE_HEAD + .set VE_HEAD = VE_L_SHARP + XT_L_SHARP: +000745 1c01 .dw DO_COLON + PFA_L_SHARP: + .endif +000746 060a .dw XT_PAD +000747 0730 .dw XT_HLD +000748 1c81 .dw XT_STORE +000749 1c20 .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: +00074a ff01 .dw $ff01 +00074b 0023 .db "#",0 +00074c 0742 .dw VE_HEAD + .set VE_HEAD = VE_SHARP + XT_SHARP: +00074d 1c01 .dw DO_COLON + PFA_SHARP: + .endif +00074e 05d6 .dw XT_BASE +00074f 1c79 .dw XT_FETCH +000750 07ca .dw XT_UDSLASHMOD +000751 1ce1 .dw XT_ROT +000752 1c3d .dw XT_DOLITERAL +000753 0009 .dw 9 +000754 1ccf .dw XT_OVER +000755 1d6e .dw XT_LESS +000756 1c36 .dw XT_DOCONDBRANCH +000757 075b DEST(PFA_SHARP1) +000758 1c3d .dw XT_DOLITERAL +000759 0007 .dw 7 +00075a 1d9d .dw XT_PLUS + PFA_SHARP1: +00075b 1c3d .dw XT_DOLITERAL +00075c 0030 .dw 48 ; ASCII 0 +00075d 1d9d .dw XT_PLUS +00075e 0736 .dw XT_HOLD +00075f 1c20 .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: +000760 ff02 .dw $ff02 +000761 7323 .db "#s" +000762 074a .dw VE_HEAD + .set VE_HEAD = VE_SHARP_S + XT_SHARP_S: +000763 1c01 .dw DO_COLON + PFA_SHARP_S: + .endif + NUMS1: +000764 074d .dw XT_SHARP +000765 05eb .dw XT_2DUP +000766 1e1c .dw XT_OR +000767 1d1a .dw XT_ZEROEQUAL +000768 1c36 .dw XT_DOCONDBRANCH +000769 0764 DEST(NUMS1) ; PFA_SHARP_S +00076a 1c20 .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: +00076b ff02 .dw $ff02 +00076c 3e23 .db "#>" +00076d 0760 .dw VE_HEAD + .set VE_HEAD = VE_SHARP_G + XT_SHARP_G: +00076e 1c01 .dw DO_COLON + PFA_SHARP_G: + .endif +00076f 05f4 .dw XT_2DROP +000770 0730 .dw XT_HLD +000771 1c79 .dw XT_FETCH +000772 060a .dw XT_PAD +000773 1ccf .dw XT_OVER +000774 1d93 .dw XT_MINUS +000775 1c20 .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: +000776 ff04 .dw $ff04 +000777 6973 +000778 6e67 .db "sign" +000779 076b .dw VE_HEAD + .set VE_HEAD = VE_SIGN + XT_SIGN: +00077a 1c01 .dw DO_COLON + PFA_SIGN: + .endif +00077b 1d21 .dw XT_ZEROLESS +00077c 1c36 .dw XT_DOCONDBRANCH +00077d 0781 DEST(PFA_SIGN1) +00077e 1c3d .dw XT_DOLITERAL +00077f 002d .dw 45 ; ascii - +000780 0736 .dw XT_HOLD + PFA_SIGN1: +000781 1c20 .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: +000782 ff03 .dw $ff03 +000783 2e64 +000784 0072 .db "d.r",0 +000785 0776 .dw VE_HEAD + .set VE_HEAD = VE_DDOTR + XT_DDOTR: +000786 1c01 .dw DO_COLON + PFA_DDOTR: + + .endif +000787 1cff .dw XT_TO_R +000788 05fc .dw XT_TUCK +000789 0d5b .dw XT_DABS +00078a 0745 .dw XT_L_SHARP +00078b 0763 .dw XT_SHARP_S +00078c 1ce1 .dw XT_ROT +00078d 077a .dw XT_SIGN +00078e 076e .dw XT_SHARP_G +00078f 1cf6 .dw XT_R_FROM +000790 1ccf .dw XT_OVER +000791 1d93 .dw XT_MINUS +000792 0872 .dw XT_SPACES +000793 0882 .dw XT_TYPE +000794 1c20 .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: +000795 ff02 .dw $ff02 +000796 722e .db ".r" +000797 0782 .dw VE_HEAD + .set VE_HEAD = VE_DOTR + XT_DOTR: +000798 1c01 .dw DO_COLON + PFA_DOTR: + + .endif +000799 1cff .dw XT_TO_R +00079a 0dee .dw XT_S2D +00079b 1cf6 .dw XT_R_FROM +00079c 0786 .dw XT_DDOTR +00079d 1c20 .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: +00079e ff02 .dw $ff02 +00079f 2e64 .db "d." +0007a0 0795 .dw VE_HEAD + .set VE_HEAD = VE_DDOT + XT_DDOT: +0007a1 1c01 .dw DO_COLON + PFA_DDOT: + + .endif +0007a2 1d54 .dw XT_ZERO +0007a3 0786 .dw XT_DDOTR +0007a4 0869 .dw XT_SPACE +0007a5 1c20 .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: +0007a6 ff01 .dw $ff01 +0007a7 002e .db ".",0 +0007a8 079e .dw VE_HEAD + .set VE_HEAD = VE_DOT + XT_DOT: +0007a9 1c01 .dw DO_COLON + PFA_DOT: + .endif +0007aa 0dee .dw XT_S2D +0007ab 07a1 .dw XT_DDOT +0007ac 1c20 .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: +0007ad ff03 .dw $ff03 +0007ae 6475 +0007af 002e .db "ud.",0 +0007b0 07a6 .dw VE_HEAD + .set VE_HEAD = VE_UDDOT + XT_UDDOT: +0007b1 1c01 .dw DO_COLON + PFA_UDDOT: + .endif +0007b2 1d54 .dw XT_ZERO +0007b3 07ba .dw XT_UDDOTR +0007b4 0869 .dw XT_SPACE +0007b5 1c20 .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: +0007b6 ff04 .dw $ff04 +0007b7 6475 +0007b8 722e .db "ud.r" +0007b9 07ad .dw VE_HEAD + .set VE_HEAD = VE_UDDOTR + XT_UDDOTR: +0007ba 1c01 .dw DO_COLON + PFA_UDDOTR: + .endif +0007bb 1cff .dw XT_TO_R +0007bc 0745 .dw XT_L_SHARP +0007bd 0763 .dw XT_SHARP_S +0007be 076e .dw XT_SHARP_G +0007bf 1cf6 .dw XT_R_FROM +0007c0 1ccf .dw XT_OVER +0007c1 1d93 .dw XT_MINUS +0007c2 0872 .dw XT_SPACES +0007c3 0882 .dw XT_TYPE +0007c4 1c20 .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: +0007c5 ff06 .dw $ff06 +0007c6 6475 +0007c7 6d2f +0007c8 646f .db "ud/mod" +0007c9 07b6 .dw VE_HEAD + .set VE_HEAD = VE_UDSLASHMOD + XT_UDSLASHMOD: +0007ca 1c01 .dw DO_COLON + PFA_UDSLASHMOD: + .endif +0007cb 1cff .dw XT_TO_R +0007cc 1d54 .dw XT_ZERO +0007cd 1d08 .dw XT_R_FETCH +0007ce 1dc2 .dw XT_UMSLASHMOD +0007cf 1cf6 .dw XT_R_FROM +0007d0 1cc4 .dw XT_SWAP +0007d1 1cff .dw XT_TO_R +0007d2 1dc2 .dw XT_UMSLASHMOD +0007d3 1cf6 .dw XT_R_FROM +0007d4 1c20 .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: +0007d5 ff06 .dw $ff06 +0007d6 6964 +0007d7 6967 +0007d8 3f74 .db "digit?" +0007d9 07c5 .dw VE_HEAD + .set VE_HEAD = VE_DIGITQ + XT_DIGITQ: +0007da 1c01 .dw DO_COLON + PFA_DIGITQ: + .endif +0007db 070c .dw XT_TOUPPER +0007dc 1cb1 +0007dd 1c3d +0007de 0039 +0007df 1d78 +0007e0 1c3d +0007e1 0100 .DW XT_DUP,XT_DOLITERAL,57,XT_GREATER,XT_DOLITERAL,256 +0007e2 1e13 +0007e3 1d9d +0007e4 1cb1 +0007e5 1c3d +0007e6 0140 +0007e7 1d78 .DW XT_AND,XT_PLUS,XT_DUP,XT_DOLITERAL,320,XT_GREATER +0007e8 1c3d +0007e9 0107 +0007ea 1e13 +0007eb 1d93 +0007ec 1c3d +0007ed 0030 .DW XT_DOLITERAL,263,XT_AND,XT_MINUS,XT_DOLITERAL,48 +0007ee 1d93 +0007ef 1cb1 +0007f0 05d6 +0007f1 1c79 +0007f2 1d5c .DW XT_MINUS,XT_DUP,XT_BASE,XT_FETCH,XT_ULESS +0007f3 1c20 .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: +0007f4 1c01 .dw DO_COLON + PFA_DOSLITERAL: +0007f5 1d08 .dw XT_R_FETCH ; ( -- addr ) +0007f6 0853 .dw XT_ICOUNT +0007f7 1cf6 .dw XT_R_FROM +0007f8 1ccf .dw XT_OVER ; ( -- addr' n addr n) +0007f9 1e2f .dw XT_1PLUS +0007fa 1e04 .dw XT_2SLASH ; ( -- addr' n addr k ) +0007fb 1d9d .dw XT_PLUS ; ( -- addr' n addr'' ) +0007fc 1e2f .dw XT_1PLUS +0007fd 1cff .dw XT_TO_R ; ( -- ) +0007fe 1c20 .dw XT_EXIT + .include "words/scomma.asm" + + ; Compiler + ; compiles a string from RAM to Flash + VE_SCOMMA: +0007ff ff02 .dw $ff02 +000800 2c73 .db "s",$2c +000801 07d5 .dw VE_HEAD + .set VE_HEAD = VE_SCOMMA + XT_SCOMMA: +000802 1c01 .dw DO_COLON + PFA_SCOMMA: +000803 1cb1 .dw XT_DUP +000804 0806 .dw XT_DOSCOMMA +000805 1c20 .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: +000806 1c01 .dw DO_COLON + PFA_DOSCOMMA: +000807 02ae .dw XT_COMMA +000808 1cb1 .dw XT_DUP ; ( --addr len len) +000809 1e04 .dw XT_2SLASH ; ( -- addr len len/2 +00080a 05fc .dw XT_TUCK ; ( -- addr len/2 len len/2 +00080b 1e0b .dw XT_2STAR ; ( -- addr len/2 len len' +00080c 1d93 .dw XT_MINUS ; ( -- addr len/2 rem +00080d 1cff .dw XT_TO_R +00080e 1d54 .dw XT_ZERO +00080f 036d .dw XT_QDOCHECK +000810 1c36 .dw XT_DOCONDBRANCH +000811 0819 .dw PFA_SCOMMA2 +000812 1e9b .dw XT_DODO + PFA_SCOMMA1: +000813 1cb1 .dw XT_DUP ; ( -- addr addr ) +000814 1c79 .dw XT_FETCH ; ( -- addr c1c2 ) +000815 02ae .dw XT_COMMA ; ( -- addr ) +000816 05e3 .dw XT_CELLPLUS ; ( -- addr+cell ) +000817 1ec9 .dw XT_DOLOOP +000818 0813 .dw PFA_SCOMMA1 + PFA_SCOMMA2: +000819 1cf6 .dw XT_R_FROM +00081a 1d28 .dw XT_GREATERZERO +00081b 1c36 .dw XT_DOCONDBRANCH +00081c 0820 .dw PFA_SCOMMA3 +00081d 1cb1 .dw XT_DUP ; well, tricky +00081e 1c98 .dw XT_CFETCH +00081f 02ae .dw XT_COMMA + PFA_SCOMMA3: +000820 1cd9 .dw XT_DROP ; ( -- ) +000821 1c20 .dw XT_EXIT + .include "words/itype.asm" + + ; Tools + ; reads string from flash and prints it + VE_ITYPE: +000822 ff05 .dw $ff05 +000823 7469 +000824 7079 +000825 0065 .db "itype",0 +000826 07ff .dw VE_HEAD + .set VE_HEAD = VE_ITYPE + XT_ITYPE: +000827 1c01 .dw DO_COLON + PFA_ITYPE: +000828 1cb1 .dw XT_DUP ; ( --addr len len) +000829 1e04 .dw XT_2SLASH ; ( -- addr len len/2 +00082a 05fc .dw XT_TUCK ; ( -- addr len/2 len len/2 +00082b 1e0b .dw XT_2STAR ; ( -- addr len/2 len len' +00082c 1d93 .dw XT_MINUS ; ( -- addr len/2 rem +00082d 1cff .dw XT_TO_R +00082e 1d54 .dw XT_ZERO +00082f 036d .dw XT_QDOCHECK +000830 1c36 .dw XT_DOCONDBRANCH +000831 083b .dw PFA_ITYPE2 +000832 1e9b .dw XT_DODO + PFA_ITYPE1: +000833 1cb1 .dw XT_DUP ; ( -- addr addr ) +000834 1fcb .dw XT_FETCHI ; ( -- addr c1c2 ) +000835 1cb1 .dw XT_DUP +000836 0848 .dw XT_LOWEMIT +000837 0844 .dw XT_HIEMIT +000838 1e2f .dw XT_1PLUS ; ( -- addr+cell ) +000839 1ec9 .dw XT_DOLOOP +00083a 0833 .dw PFA_ITYPE1 + PFA_ITYPE2: +00083b 1cf6 .dw XT_R_FROM +00083c 1d28 .dw XT_GREATERZERO +00083d 1c36 .dw XT_DOCONDBRANCH +00083e 0842 .dw PFA_ITYPE3 +00083f 1cb1 .dw XT_DUP ; make sure the drop below has always something to do +000840 1fcb .dw XT_FETCHI +000841 0848 .dw XT_LOWEMIT + PFA_ITYPE3: +000842 1cd9 .dw XT_DROP +000843 1c20 .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: +000844 1c01 .dw DO_COLON + PFA_HIEMIT: +000845 1ef9 .dw XT_BYTESWAP +000846 0848 .dw XT_LOWEMIT +000847 1c20 .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: +000848 1c01 .dw DO_COLON + PFA_LOWEMIT: +000849 1c3d .dw XT_DOLITERAL +00084a 00ff .dw $00ff +00084b 1e13 .dw XT_AND +00084c 0614 .dw XT_EMIT +00084d 1c20 .dw XT_EXIT + .include "words/icount.asm" + + ; Tools + ; get count information out of a counted string in flash + VE_ICOUNT: +00084e ff06 .dw $ff06 +00084f 6369 +000850 756f +000851 746e .db "icount" +000852 0822 .dw VE_HEAD + .set VE_HEAD = VE_ICOUNT + XT_ICOUNT: +000853 1c01 .dw DO_COLON + PFA_ICOUNT: +000854 1cb1 .dw XT_DUP +000855 1e2f .dw XT_1PLUS +000856 1cc4 .dw XT_SWAP +000857 1fcb .dw XT_FETCHI +000858 1c20 .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: +000859 ff02 .dw 0xff02 +00085a 7263 .db "cr" +00085b 084e .dw VE_HEAD + .set VE_HEAD = VE_CR + XT_CR: +00085c 1c01 .dw DO_COLON + PFA_CR: + .endif + +00085d 1c3d .dw XT_DOLITERAL +00085e 000d .dw 13 +00085f 0614 .dw XT_EMIT +000860 1c3d .dw XT_DOLITERAL +000861 000a .dw 10 +000862 0614 .dw XT_EMIT +000863 1c20 .dw XT_EXIT + .include "words/space.asm" + + ; Character IO + ; emits a space (bl) + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_SPACE: +000864 ff05 .dw $ff05 +000865 7073 +000866 6361 +000867 0065 .db "space",0 +000868 0859 .dw VE_HEAD + .set VE_HEAD = VE_SPACE + XT_SPACE: +000869 1c01 .dw DO_COLON + PFA_SPACE: + .endif +00086a 0676 .dw XT_BL +00086b 0614 .dw XT_EMIT +00086c 1c20 .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: +00086d ff06 .dw $ff06 +00086e 7073 +00086f 6361 +000870 7365 .db "spaces" +000871 0864 .dw VE_HEAD + .set VE_HEAD = VE_SPACES + XT_SPACES: +000872 1c01 .dw DO_COLON + PFA_SPACES: + + .endif + ;C SPACES n -- output n spaces + ; BEGIN DUP 0> WHILE SPACE 1- REPEAT DROP ; +000873 1d54 +000874 06f1 .DW XT_ZERO, XT_MAX +000875 1cb1 +000876 1c36 SPCS1: .DW XT_DUP,XT_DOCONDBRANCH +000877 087c DEST(SPCS2) +000878 0869 +000879 1e35 +00087a 1c2f .DW XT_SPACE,XT_1MINUS,XT_DOBRANCH +00087b 0875 DEST(SPCS1) +00087c 1cd9 +00087d 1c20 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: +00087e ff04 .dw $ff04 +00087f 7974 +000880 6570 .db "type" +000881 086d .dw VE_HEAD + .set VE_HEAD = VE_TYPE + XT_TYPE: +000882 1c01 .dw DO_COLON + PFA_TYPE: + + .endif +000883 0de5 .dw XT_BOUNDS +000884 036d .dw XT_QDOCHECK +000885 1c36 .dw XT_DOCONDBRANCH +000886 088d DEST(PFA_TYPE2) +000887 1e9b .dw XT_DODO + PFA_TYPE1: +000888 1eac .dw XT_I +000889 1c98 .dw XT_CFETCH +00088a 0614 .dw XT_EMIT +00088b 1ec9 .dw XT_DOLOOP +00088c 0888 DEST(PFA_TYPE1) + PFA_TYPE2: +00088d 1c20 .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: +00088e ff01 .dw $ff01 +00088f 0027 .db "'",0 +000890 087e .dw VE_HEAD + .set VE_HEAD = VE_TICK + XT_TICK: +000891 1c01 .dw DO_COLON + PFA_TICK: + .endif +000892 0a3b .dw XT_PARSENAME +000893 0b60 .dw XT_FORTHRECOGNIZER +000894 0b36 .dw XT_RECOGNIZE + ; a word is tickable unless DT:TOKEN is DT:NULL or + ; the interpret action is a NOOP +000895 1cb1 .dw XT_DUP +000896 0bd1 .dw XT_DT_NULL +000897 1fe0 .dw XT_EQUAL +000898 1cc4 .dw XT_SWAP +000899 1fcb .dw XT_FETCHI +00089a 1c3d .dw XT_DOLITERAL +00089b 0c06 .dw XT_NOOP +00089c 1fe0 .dw XT_EQUAL +00089d 1e1c .dw XT_OR +00089e 1c36 .dw XT_DOCONDBRANCH +00089f 08a3 DEST(PFA_TICK1) +0008a0 1c3d .dw XT_DOLITERAL +0008a1 fff3 .dw -13 +0008a2 08c8 .dw XT_THROW + PFA_TICK1: +0008a3 1cd9 .dw XT_DROP +0008a4 1c20 .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: +0008a5 ff07 .dw $ff07 +0008a6 6168 +0008a7 646e +0008a8 656c +0008a9 0072 .db "handler",0 +0008aa 088e .dw VE_HEAD + .set VE_HEAD = VE_HANDLER + XT_HANDLER: +0008ab 1c58 .dw PFA_DOUSER + PFA_HANDLER: + .endif +0008ac 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: +0008ad ff05 .dw $ff05 +0008ae 6163 +0008af 6374 +0008b0 0068 .db "catch",0 +0008b1 08a5 .dw VE_HEAD + .set VE_HEAD = VE_CATCH + XT_CATCH: +0008b2 1c01 .dw DO_COLON + PFA_CATCH: + .endif + + ; sp@ >r +0008b3 1e8d .dw XT_SP_FETCH +0008b4 1cff .dw XT_TO_R + ; handler @ >r +0008b5 08ab .dw XT_HANDLER +0008b6 1c79 .dw XT_FETCH +0008b7 1cff .dw XT_TO_R + ; rp@ handler ! +0008b8 1e76 .dw XT_RP_FETCH +0008b9 08ab .dw XT_HANDLER +0008ba 1c81 .dw XT_STORE +0008bb 1c2a .dw XT_EXECUTE + ; r> handler ! +0008bc 1cf6 .dw XT_R_FROM +0008bd 08ab .dw XT_HANDLER +0008be 1c81 .dw XT_STORE +0008bf 1cf6 .dw XT_R_FROM +0008c0 1cd9 .dw XT_DROP +0008c1 1d54 .dw XT_ZERO +0008c2 1c20 .dw XT_EXIT + .include "words/throw.asm" + + ; Exceptions + ; throw an exception + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_THROW: +0008c3 ff05 .dw $ff05 +0008c4 6874 +0008c5 6f72 +0008c6 0077 .db "throw",0 +0008c7 08ad .dw VE_HEAD + .set VE_HEAD = VE_THROW + XT_THROW: +0008c8 1c01 .dw DO_COLON + PFA_THROW: + .endif +0008c9 1cb1 .dw XT_DUP +0008ca 1d1a .dw XT_ZEROEQUAL +0008cb 1c36 .dw XT_DOCONDBRANCH +0008cc 08cf DEST(PFA_THROW1) +0008cd 1cd9 .dw XT_DROP +0008ce 1c20 .dw XT_EXIT + PFA_THROW1: +0008cf 08ab .dw XT_HANDLER +0008d0 1c79 .dw XT_FETCH +0008d1 1e80 .dw XT_RP_STORE +0008d2 1cf6 .dw XT_R_FROM +0008d3 08ab .dw XT_HANDLER +0008d4 1c81 .dw XT_STORE +0008d5 1cf6 .dw XT_R_FROM +0008d6 1cc4 .dw XT_SWAP +0008d7 1cff .dw XT_TO_R +0008d8 1e96 .dw XT_SP_STORE +0008d9 1cd9 .dw XT_DROP +0008da 1cf6 .dw XT_R_FROM +0008db 1c20 .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: +0008dc ff05 .dw $ff05 +0008dd 7363 +0008de 696b +0008df 0070 .db "cskip",0 +0008e0 08c3 .dw VE_HEAD + .set VE_HEAD = VE_CSKIP + XT_CSKIP: +0008e1 1c01 .dw DO_COLON + PFA_CSKIP: + .endif +0008e2 1cff .dw XT_TO_R ; ( -- addr1 n1 ) + PFA_CSKIP1: +0008e3 1cb1 .dw XT_DUP ; ( -- addr' n' n' ) +0008e4 1c36 .dw XT_DOCONDBRANCH ; ( -- addr' n') +0008e5 08f0 DEST(PFA_CSKIP2) +0008e6 1ccf .dw XT_OVER ; ( -- addr' n' addr' ) +0008e7 1c98 .dw XT_CFETCH ; ( -- addr' n' c' ) +0008e8 1d08 .dw XT_R_FETCH ; ( -- addr' n' c' c ) +0008e9 1fe0 .dw XT_EQUAL ; ( -- addr' n' f ) +0008ea 1c36 .dw XT_DOCONDBRANCH ; ( -- addr' n') +0008eb 08f0 DEST(PFA_CSKIP2) +0008ec 1fe7 .dw XT_ONE +0008ed 0a2c .dw XT_SLASHSTRING +0008ee 1c2f .dw XT_DOBRANCH +0008ef 08e3 DEST(PFA_CSKIP1) + PFA_CSKIP2: +0008f0 1cf6 .dw XT_R_FROM +0008f1 1cd9 .dw XT_DROP ; ( -- addr2 n2) +0008f2 1c20 .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: +0008f3 ff05 .dw $ff05 +0008f4 7363 +0008f5 6163 +../../common\words/cscan.asm(12): warning: .cseg .db misalignment - padding zero byte +0008f6 006e .db "cscan" +0008f7 08dc .dw VE_HEAD + .set VE_HEAD = VE_CSCAN + XT_CSCAN: +0008f8 1c01 .dw DO_COLON + PFA_CSCAN: + .endif +0008f9 1cff .dw XT_TO_R +0008fa 1ccf .dw XT_OVER + PFA_CSCAN1: +0008fb 1cb1 .dw XT_DUP +0008fc 1c98 .dw XT_CFETCH +0008fd 1d08 .dw XT_R_FETCH +0008fe 1fe0 .dw XT_EQUAL +0008ff 1d1a .dw XT_ZEROEQUAL +000900 1c36 .dw XT_DOCONDBRANCH +000901 090d DEST(PFA_CSCAN2) +000902 1cc4 .dw XT_SWAP +000903 1e35 .dw XT_1MINUS +000904 1cc4 .dw XT_SWAP +000905 1ccf .dw XT_OVER +000906 1d21 .dw XT_ZEROLESS ; not negative +000907 1d1a .dw XT_ZEROEQUAL +000908 1c36 .dw XT_DOCONDBRANCH +000909 090d DEST(PFA_CSCAN2) +00090a 1e2f .dw XT_1PLUS +00090b 1c2f .dw XT_DOBRANCH +00090c 08fb DEST(PFA_CSCAN1) + PFA_CSCAN2: +00090d 1cf0 .dw XT_NIP +00090e 1ccf .dw XT_OVER +00090f 1d93 .dw XT_MINUS +000910 1cf6 .dw XT_R_FROM +000911 1cd9 .dw XT_DROP +000912 1c20 .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: +000913 ff06 .dw $ff06 +000914 6361 +000915 6563 +000916 7470 .db "accept" +000917 08f3 .dw VE_HEAD + .set VE_HEAD = VE_ACCEPT + XT_ACCEPT: +000918 1c01 .dw DO_COLON + PFA_ACCEPT: + + .endif +000919 1ccf +00091a 1d9d +00091b 1e35 +00091c 1ccf .DW XT_OVER,XT_PLUS,XT_1MINUS,XT_OVER +00091d 0625 +00091e 1cb1 +00091f 0959 +000920 1d1a +000921 1c36 ACC1: .DW XT_KEY,XT_DUP,XT_CRLFQ,XT_ZEROEQUAL,XT_DOCONDBRANCH +000922 094b DEST(ACC5) +000923 1cb1 +000924 1c3d +000925 0008 +000926 1fe0 +000927 1c36 .DW XT_DUP,XT_DOLITERAL,8,XT_EQUAL,XT_DOCONDBRANCH +000928 093b DEST(ACC3) +000929 1cd9 +00092a 1ce1 +00092b 05eb +00092c 1d78 +00092d 1cff +00092e 1ce1 +00092f 1ce1 +000930 1cf6 +000931 1c36 .DW XT_DROP,XT_ROT,XT_2DUP,XT_GREATER,XT_TO_R,XT_ROT,XT_ROT,XT_R_FROM,XT_DOCONDBRANCH +000932 0939 DEST(ACC6) +000933 0951 +000934 1e35 +000935 1cff +000936 1ccf +000937 1cf6 +000938 014f .DW XT_BS,XT_1MINUS,XT_TO_R,XT_OVER,XT_R_FROM,XT_UMAX +000939 1c2f ACC6: .DW XT_DOBRANCH +00093a 0949 DEST(ACC4) + + + ACC3: ; check for remaining control characters, replace them with blank +00093b 1cb1 .dw XT_DUP ; ( -- addr k k ) +00093c 0676 .dw XT_BL +00093d 1d6e .dw XT_LESS +00093e 1c36 .dw XT_DOCONDBRANCH +00093f 0942 DEST(PFA_ACCEPT6) +000940 1cd9 .dw XT_DROP +000941 0676 .dw XT_BL + PFA_ACCEPT6: +000942 1cb1 +000943 0614 +000944 1ccf +000945 1c8d +000946 1e2f +000947 1ccf +000948 015b .DW XT_DUP,XT_EMIT,XT_OVER,XT_CSTORE,XT_1PLUS,XT_OVER,XT_UMIN +000949 1c2f ACC4: .DW XT_DOBRANCH +00094a 091d DEST(ACC1) +00094b 1cd9 +00094c 1cf0 +00094d 1cc4 +00094e 1d93 +00094f 085c +000950 1c20 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: +000951 1c01 .dw DO_COLON + .endif +000952 1c3d .dw XT_DOLITERAL +000953 0008 .dw 8 +000954 1cb1 .dw XT_DUP +000955 0614 .dw XT_EMIT +000956 0869 .dw XT_SPACE +000957 0614 .dw XT_EMIT +000958 1c20 .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: +000959 1c01 .dw DO_COLON + .endif +00095a 1cb1 .dw XT_DUP +00095b 1c3d .dw XT_DOLITERAL +00095c 000d .dw 13 +00095d 1fe0 .dw XT_EQUAL +00095e 1cc4 .dw XT_SWAP +00095f 1c3d .dw XT_DOLITERAL +000960 000a .dw 10 +000961 1fe0 .dw XT_EQUAL +000962 1e1c .dw XT_OR +000963 1c20 .dw XT_EXIT + .include "words/refill.asm" + + ; System + ; refills the input buffer + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_REFILL: +000964 ff06 .dw $ff06 +000965 6572 +000966 6966 +000967 6c6c .db "refill" +000968 0913 .dw VE_HEAD + .set VE_HEAD = VE_REFILL + XT_REFILL: +000969 0c9a .dw PFA_DODEFER1 + PFA_REFILL: + .endif +00096a 001a .dw USER_REFILL +00096b 0c63 .dw XT_UDEFERFETCH +00096c 0c6f .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: +00096d ff04 .dw $ff04 +00096e 6863 +00096f 7261 .db "char" +000970 0964 .dw VE_HEAD + .set VE_HEAD = VE_CHAR + XT_CHAR: +000971 1c01 .dw DO_COLON + PFA_CHAR: + .endif +000972 0a3b .dw XT_PARSENAME +000973 1cd9 .dw XT_DROP +000974 1c98 .dw XT_CFETCH +000975 1c20 .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: +000976 ff06 .dw $ff06 +000977 756e +000978 626d +000979 7265 .db "number" +00097a 096d .dw VE_HEAD + .set VE_HEAD = VE_NUMBER + XT_NUMBER: +00097b 1c01 .dw DO_COLON + PFA_NUMBER: + .endif +00097c 05d6 .dw XT_BASE +00097d 1c79 .dw XT_FETCH +00097e 1cff .dw XT_TO_R +00097f 09bf .dw XT_QSIGN +000980 1cff .dw XT_TO_R +000981 09d2 .dw XT_SET_BASE +000982 09bf .dw XT_QSIGN +000983 1cf6 .dw XT_R_FROM +000984 1e1c .dw XT_OR +000985 1cff .dw XT_TO_R + ; check whether something is left +000986 1cb1 .dw XT_DUP +000987 1d1a .dw XT_ZEROEQUAL +000988 1c36 .dw XT_DOCONDBRANCH +000989 0992 DEST(PFA_NUMBER0) + ; nothing is left. It cannot be a number at all +00098a 05f4 .dw XT_2DROP +00098b 1cf6 .dw XT_R_FROM +00098c 1cd9 .dw XT_DROP +00098d 1cf6 .dw XT_R_FROM +00098e 05d6 .dw XT_BASE +00098f 1c81 .dw XT_STORE +000990 1d54 .dw XT_ZERO +000991 1c20 .dw XT_EXIT + PFA_NUMBER0: +000992 1f1e .dw XT_2TO_R +000993 1d54 .dw XT_ZERO ; starting value +000994 1d54 .dw XT_ZERO +000995 1f2d .dw XT_2R_FROM +000996 09f0 .dw XT_TO_NUMBER ; ( 0. addr len -- d addr' len' + ; check length of the remaining string. + ; if zero: a single cell number is entered +000997 1cb9 .dw XT_QDUP +000998 1c36 .dw XT_DOCONDBRANCH +000999 09b4 DEST(PFA_NUMBER1) + ; if equal 1: mayba a trailing dot? --> double cell number +00099a 1fe7 .dw XT_ONE +00099b 1fe0 .dw XT_EQUAL +00099c 1c36 .dw XT_DOCONDBRANCH +00099d 09ab DEST(PFA_NUMBER2) + ; excatly one character is left +00099e 1c98 .dw XT_CFETCH +00099f 1c3d .dw XT_DOLITERAL +0009a0 002e .dw 46 ; . +0009a1 1fe0 .dw XT_EQUAL +0009a2 1c36 .dw XT_DOCONDBRANCH +0009a3 09ac DEST(PFA_NUMBER6) + ; its a double cell number + ; incorporate sign into number +0009a4 1cf6 .dw XT_R_FROM +0009a5 1c36 .dw XT_DOCONDBRANCH +0009a6 09a8 DEST(PFA_NUMBER3) +0009a7 0d68 .dw XT_DNEGATE + PFA_NUMBER3: +0009a8 1fec .dw XT_TWO +0009a9 1c2f .dw XT_DOBRANCH +0009aa 09ba DEST(PFA_NUMBER5) + PFA_NUMBER2: +0009ab 1cd9 .dw XT_DROP + PFA_NUMBER6: +0009ac 05f4 .dw XT_2DROP +0009ad 1cf6 .dw XT_R_FROM +0009ae 1cd9 .dw XT_DROP +0009af 1cf6 .dw XT_R_FROM +0009b0 05d6 .dw XT_BASE +0009b1 1c81 .dw XT_STORE +0009b2 1d54 .dw XT_ZERO +0009b3 1c20 .dw XT_EXIT + PFA_NUMBER1: +0009b4 05f4 .dw XT_2DROP ; remove the address + ; incorporate sign into number +0009b5 1cf6 .dw XT_R_FROM +0009b6 1c36 .dw XT_DOCONDBRANCH +0009b7 09b9 DEST(PFA_NUMBER4) +0009b8 06c6 .dw XT_NEGATE + PFA_NUMBER4: +0009b9 1fe7 .dw XT_ONE + PFA_NUMBER5: +0009ba 1cf6 .dw XT_R_FROM +0009bb 05d6 .dw XT_BASE +0009bc 1c81 .dw XT_STORE +0009bd 1d4b .dw XT_TRUE +0009be 1c20 .dw XT_EXIT + .include "words/q-sign.asm" + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + XT_QSIGN: +0009bf 1c01 .dw DO_COLON + PFA_QSIGN: ; ( c -- ) + .endif +0009c0 1ccf .dw XT_OVER ; ( -- addr len addr ) +0009c1 1c98 .dw XT_CFETCH +0009c2 1c3d .dw XT_DOLITERAL +0009c3 002d .dw '-' +0009c4 1fe0 .dw XT_EQUAL ; ( -- addr len flag ) +0009c5 1cb1 .dw XT_DUP +0009c6 1cff .dw XT_TO_R +0009c7 1c36 .dw XT_DOCONDBRANCH +0009c8 09cb DEST(PFA_NUMBERSIGN_DONE) +0009c9 1fe7 .dw XT_ONE ; skip sign character +0009ca 0a2c .dw XT_SLASHSTRING + PFA_NUMBERSIGN_DONE: +0009cb 1cf6 .dw XT_R_FROM +0009cc 1c20 .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: +0009cd 1c52 .dw PFA_DOCONSTANT + .endif +0009ce 000a +0009cf 0010 +0009d0 0002 +0009d1 000a .dw 10,16,2,10 ; last one could a 8 instead. + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + XT_SET_BASE: +0009d2 1c01 .dw DO_COLON + PFA_SET_BASE: ; ( adr1 len1 -- adr2 len2 ) + .endif +0009d3 1ccf .dw XT_OVER +0009d4 1c98 .dw XT_CFETCH +0009d5 1c3d .dw XT_DOLITERAL +0009d6 0023 .dw 35 +0009d7 1d93 .dw XT_MINUS +0009d8 1cb1 .dw XT_DUP +0009d9 1d54 .dw XT_ZERO +0009da 1c3d .dw XT_DOLITERAL +0009db 0004 .dw 4 +0009dc 06fe .dw XT_WITHIN +0009dd 1c36 .dw XT_DOCONDBRANCH +0009de 09e8 DEST(SET_BASE1) + .if cpu_msp430==1 + .endif +0009df 09cd .dw XT_BASES +0009e0 1d9d .dw XT_PLUS +0009e1 1fcb .dw XT_FETCHI +0009e2 05d6 .dw XT_BASE +0009e3 1c81 .dw XT_STORE +0009e4 1fe7 .dw XT_ONE +0009e5 0a2c .dw XT_SLASHSTRING +0009e6 1c2f .dw XT_DOBRANCH +0009e7 09e9 DEST(SET_BASE2) + SET_BASE1: +0009e8 1cd9 .dw XT_DROP + SET_BASE2: +0009e9 1c20 .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: +0009ea ff07 .dw $ff07 +0009eb 6e3e +0009ec 6d75 +0009ed 6562 +0009ee 0072 .db ">number",0 +0009ef 0976 .dw VE_HEAD + .set VE_HEAD = VE_TO_NUMBER + XT_TO_NUMBER: +0009f0 1c01 .dw DO_COLON + + .endif + +0009f1 1cb1 +0009f2 1c36 TONUM1: .DW XT_DUP,XT_DOCONDBRANCH +0009f3 0a08 DEST(TONUM3) +0009f4 1ccf +0009f5 1c98 +0009f6 07da .DW XT_OVER,XT_CFETCH,XT_DIGITQ +0009f7 1d1a +0009f8 1c36 .DW XT_ZEROEQUAL,XT_DOCONDBRANCH +0009f9 09fc DEST(TONUM2) +0009fa 1cd9 +0009fb 1c20 .DW XT_DROP,XT_EXIT +0009fc 1cff +0009fd 0d8c +0009fe 05d6 +0009ff 1c79 +000a00 0140 TONUM2: .DW XT_TO_R,XT_2SWAP,XT_BASE,XT_FETCH,XT_UDSTAR +000a01 1cf6 +000a02 0138 +000a03 0d8c .DW XT_R_FROM,XT_MPLUS,XT_2SWAP +000a04 1fe7 +000a05 0a2c +000a06 1c2f .DW XT_ONE,XT_SLASHSTRING,XT_DOBRANCH +000a07 09f1 DEST(TONUM1) +000a08 1c20 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: +000a09 ff05 .dw $ff05 +000a0a 6170 +000a0b 7372 +000a0c 0065 .db "parse",0 +000a0d 09ea .dw VE_HEAD + .set VE_HEAD = VE_PARSE + XT_PARSE: +000a0e 1c01 .dw DO_COLON + PFA_PARSE: + .endif +000a0f 1cff .dw XT_TO_R ; ( -- ) +000a10 0a22 .dw XT_SOURCE ; ( -- addr len) +000a11 0604 .dw XT_TO_IN ; ( -- addr len >in) +000a12 1c79 .dw XT_FETCH +000a13 0a2c .dw XT_SLASHSTRING ; ( -- addr' len' ) + +000a14 1cf6 .dw XT_R_FROM ; ( -- addr' len' c) +000a15 08f8 .dw XT_CSCAN ; ( -- addr' len'') +000a16 1cb1 .dw XT_DUP ; ( -- addr' len'' len'') +000a17 1e2f .dw XT_1PLUS +000a18 0604 .dw XT_TO_IN ; ( -- addr' len'' len'' >in) +000a19 1e65 .dw XT_PLUSSTORE ; ( -- addr' len') +000a1a 1fe7 .dw XT_ONE +000a1b 0a2c .dw XT_SLASHSTRING +000a1c 1c20 .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: +000a1d ff06 .dw $FF06 +000a1e 6f73 +000a1f 7275 +000a20 6563 .db "source" +000a21 0a09 .dw VE_HEAD + .set VE_HEAD = VE_SOURCE + XT_SOURCE: +000a22 0c9a .dw PFA_DODEFER1 + PFA_SOURCE: + .endif +000a23 0016 .dw USER_SOURCE +000a24 0c63 .dw XT_UDEFERFETCH +000a25 0c6f .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: +000a26 ff07 .dw $ff07 +000a27 732f +000a28 7274 +000a29 6e69 +000a2a 0067 .db "/string",0 +000a2b 0a1d .dw VE_HEAD + .set VE_HEAD = VE_SLASHSTRING + XT_SLASHSTRING: +000a2c 1c01 .dw DO_COLON + PFA_SLASHSTRING: + .endif +000a2d 1ce1 .dw XT_ROT +000a2e 1ccf .dw XT_OVER +000a2f 1d9d .dw XT_PLUS +000a30 1ce1 .dw XT_ROT +000a31 1ce1 .dw XT_ROT +000a32 1d93 .dw XT_MINUS +000a33 1c20 .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: +000a34 ff0a .dw $FF0A +000a35 6170 +000a36 7372 +000a37 2d65 +000a38 616e +000a39 656d .db "parse-name" +000a3a 0a26 .dw VE_HEAD + .set VE_HEAD = VE_PARSENAME + XT_PARSENAME: +000a3b 1c01 .dw DO_COLON + PFA_PARSENAME: + .endif +000a3c 0676 .dw XT_BL +000a3d 0a3f .dw XT_SKIPSCANCHAR +000a3e 1c20 .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: +000a3f 1c01 .dw DO_COLON + PFA_SKIPSCANCHAR: + .endif +000a40 1cff .dw XT_TO_R +000a41 0a22 .dw XT_SOURCE +000a42 0604 .dw XT_TO_IN +000a43 1c79 .dw XT_FETCH +000a44 0a2c .dw XT_SLASHSTRING + +000a45 1d08 .dw XT_R_FETCH +000a46 08e1 .dw XT_CSKIP +000a47 1cf6 .dw XT_R_FROM +000a48 08f8 .dw XT_CSCAN + + ; adjust >IN +000a49 05eb .dw XT_2DUP +000a4a 1d9d .dw XT_PLUS +000a4b 0a22 .dw XT_SOURCE +000a4c 1cd9 .dw XT_DROP +000a4d 1d93 .dw XT_MINUS +000a4e 0604 .dw XT_TO_IN +000a4f 1c81 .dw XT_STORE +000a50 1c20 .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: +000a51 ff07 .dw $ff07 +000a52 6966 +000a53 646e +000a54 782d +000a55 0074 .db "find-xt",0 +000a56 0a34 .dw VE_HEAD + .set VE_HEAD = VE_FINDXT + XT_FINDXT: +000a57 1c01 .dw DO_COLON + PFA_FINDXT: + .endif +000a58 1c3d .dw XT_DOLITERAL +000a59 0a63 .dw XT_FINDXTA +000a5a 1c3d .dw XT_DOLITERAL +000a5b 0040 .dw CFG_ORDERLISTLEN +000a5c 04ee .dw XT_MAPSTACK +000a5d 1d1a .dw XT_ZEROEQUAL +000a5e 1c36 .dw XT_DOCONDBRANCH +000a5f 0a62 DEST(PFA_FINDXT1) +000a60 05f4 .dw XT_2DROP +000a61 1d54 .dw XT_ZERO + PFA_FINDXT1: +000a62 1c20 .dw XT_EXIT + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + + XT_FINDXTA: +000a63 1c01 .dw DO_COLON + PFA_FINDXTA: + .endif +000a64 1cff .dw XT_TO_R +000a65 05eb .dw XT_2DUP +000a66 1cf6 .dw XT_R_FROM +000a67 0cac .dw XT_SEARCH_WORDLIST +000a68 1cb1 .dw XT_DUP +000a69 1c36 .dw XT_DOCONDBRANCH +000a6a 0a70 DEST(PFA_FINDXTA1) +000a6b 1cff .dw XT_TO_R +000a6c 1cf0 .dw XT_NIP +000a6d 1cf0 .dw XT_NIP +000a6e 1cf6 .dw XT_R_FROM +000a6f 1d4b .dw XT_TRUE + PFA_FINDXTA1: +000a70 1c20 .dw XT_EXIT + + .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: +000a71 ff04 .dw $ff04 +000a72 7571 +000a73 7469 .db "quit" +000a74 0a51 .dw VE_HEAD + .set VE_HEAD = VE_QUIT + XT_QUIT: +000a75 1c01 .dw DO_COLON + .endif + PFA_QUIT: +000a76 03a3 +000a77 03aa +000a78 1c81 .dw XT_LP0,XT_LP,XT_STORE +000a79 0b10 .dw XT_SP0 +000a7a 1e96 .dw XT_SP_STORE +000a7b 0b1d .dw XT_RP0 +000a7c 1e80 .dw XT_RP_STORE +000a7d 0438 .dw XT_LBRACKET + + PFA_QUIT2: +000a7e 05d0 .dw XT_STATE +000a7f 1c79 .dw XT_FETCH +000a80 1d1a .dw XT_ZEROEQUAL +000a81 1c36 .dw XT_DOCONDBRANCH +000a82 0a84 DEST(PFA_QUIT4) +000a83 0ab4 .dw XT_PROMPTREADY + PFA_QUIT4: +000a84 0969 .dw XT_REFILL +000a85 1c36 .dw XT_DOCONDBRANCH +000a86 0a96 DEST(PFA_QUIT3) +000a87 1c3d .dw XT_DOLITERAL +000a88 0b6b .dw XT_INTERPRET +000a89 08b2 .dw XT_CATCH +000a8a 1cb9 .dw XT_QDUP +000a8b 1c36 .dw XT_DOCONDBRANCH +000a8c 0a96 DEST(PFA_QUIT3) +000a8d 1cb1 .dw XT_DUP +000a8e 1c3d .dw XT_DOLITERAL +000a8f fffe .dw -2 +000a90 1d6e .dw XT_LESS +000a91 1c36 .dw XT_DOCONDBRANCH +000a92 0a94 DEST(PFA_QUIT5) +000a93 0acf .dw XT_PROMPTERROR + PFA_QUIT5: +000a94 1c2f .dw XT_DOBRANCH +000a95 0a76 DEST(PFA_QUIT) + PFA_QUIT3: +000a96 0aa4 .dw XT_PROMPTOK +000a97 1c2f .dw XT_DOBRANCH +000a98 0a7e DEST(PFA_QUIT2) + ; .dw XT_EXIT ; never reached + + .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: +000a99 1c01 .dw DO_COLON + PFA_DEFAULT_PROMPTOK: +000a9a 07f4 .dw XT_DOSLITERAL +000a9b 0003 .dw 3 +000a9c 6f20 +000a9d 006b .db " ok",0 + .endif +000a9e 0827 .dw XT_ITYPE +000a9f 1c20 .dw XT_EXIT + + ; ------------------------ + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_PROMPTOK: +000aa0 ff03 .dw $FF03 +000aa1 6f2e +../../common\words/prompt-ok.asm(43): warning: .cseg .db misalignment - padding zero byte +000aa2 006b .db ".ok" +000aa3 0a71 .dw VE_HEAD + .set VE_HEAD = VE_PROMPTOK + XT_PROMPTOK: +000aa4 0c9a .dw PFA_DODEFER1 + PFA_PROMPTOK: + .endif +000aa5 001c .dw USER_P_OK +000aa6 0c63 .dw XT_UDEFERFETCH +000aa7 0c6f .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: +000aa8 1c01 .dw DO_COLON + PFA_DEFAULT_PROMPTREADY: +000aa9 07f4 .dw XT_DOSLITERAL +000aaa 0002 .dw 2 +000aab 203e .db "> " + .endif +000aac 085c .dw XT_CR +000aad 0827 .dw XT_ITYPE +000aae 1c20 .dw XT_EXIT + + ; ------------------------ + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_PROMPTREADY: +000aaf ff06 .dw $FF06 +000ab0 722e +000ab1 6165 +000ab2 7964 .db ".ready" +000ab3 0aa0 .dw VE_HEAD + .set VE_HEAD = VE_PROMPTREADY + XT_PROMPTREADY: +000ab4 0c9a .dw PFA_DODEFER1 + PFA_PROMPTREADY: + .endif +000ab5 0020 .dw USER_P_RDY +000ab6 0c63 .dw XT_UDEFERFETCH +000ab7 0c6f .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: +000ab8 1c01 .dw DO_COLON + PFA_DEFAULT_PROMPTERROR: +000ab9 07f4 .dw XT_DOSLITERAL +000aba 0004 .dw 4 +000abb 3f20 +000abc 203f .db " ?? " + .endif +000abd 0827 .dw XT_ITYPE +000abe 05d6 .dw XT_BASE +000abf 1c79 .dw XT_FETCH +000ac0 1cff .dw XT_TO_R +000ac1 0663 .dw XT_DECIMAL +000ac2 07a9 .dw XT_DOT +000ac3 0604 .dw XT_TO_IN +000ac4 1c79 .dw XT_FETCH +000ac5 07a9 .dw XT_DOT +000ac6 1cf6 .dw XT_R_FROM +000ac7 05d6 .dw XT_BASE +000ac8 1c81 .dw XT_STORE +000ac9 1c20 .dw XT_EXIT + + ; ------------------------ + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_PROMPTERROR: +000aca ff06 .dw $FF06 +000acb 652e +000acc 7272 +000acd 726f .db ".error" +000ace 0aaf .dw VE_HEAD + .set VE_HEAD = VE_PROMPTERROR + XT_PROMPTERROR: +000acf 0c9a .dw PFA_DODEFER1 + PFA_PROMPTERROR: + .endif +000ad0 001e .dw USER_P_ERR +000ad1 0c63 .dw XT_UDEFERFETCH +000ad2 0c6f .dw XT_UDEFERSTORE + .include "words/pause.asm" + + ; Multitasking + ; Fetch pause vector and execute it. may make a context/task switch + VE_PAUSE: +000ad3 ff05 .dw $ff05 +000ad4 6170 +000ad5 7375 +000ad6 0065 .db "pause",0 +000ad7 0aca .dw VE_HEAD + .set VE_HEAD = VE_PAUSE + XT_PAUSE: +000ad8 0c9a .dw PFA_DODEFER1 + PFA_PAUSE: +000ad9 0093 .dw ram_pause +000ada 0c4f .dw XT_RDEFERFETCH +000adb 0c59 .dw XT_RDEFERSTORE + + .dseg +000093 ram_pause: .byte 2 + .cseg + .include "words/cold.asm" + + ; System + ; start up amforth. + VE_COLD: +000adc ff04 .dw $ff04 +000add 6f63 +000ade 646c .db "cold" +000adf 0ad3 .dw VE_HEAD + .set VE_HEAD = VE_COLD + XT_COLD: +000ae0 0ae1 .dw PFA_COLD + PFA_COLD: +000ae1 b6a4 in_ mcu_boot, MCUSR +000ae2 2422 clr zerol +000ae3 2433 clr zeroh +000ae4 24bb clr isrflag +000ae5 be24 out_ MCUSR, zerol + ; clear RAM +000ae6 e6e0 ldi zl, low(ramstart) +000ae7 e0f0 ldi zh, high(ramstart) + clearloop: +000ae8 9221 st Z+, zerol +000ae9 36e0 cpi zl, low(sram_size+ramstart) +000aea f7e9 brne clearloop +000aeb 30f4 cpi zh, high(sram_size+ramstart) +000aec f7d9 brne clearloop + ; init first user data area + ; allocate space for User Area + .dseg +000095 ram_user1: .byte SYSUSERSIZE + APPUSERSIZE + .cseg +000aed e9e5 ldi zl, low(ram_user1) +000aee e0f0 ldi zh, high(ram_user1) +000aef 012f movw upl, zl + ; init return stack pointer +000af0 e50f ldi temp0,low(rstackstart) +000af1 bf0d out_ SPL,temp0 +000af2 8304 std Z+4, temp0 +000af3 e014 ldi temp1,high(rstackstart) +000af4 bf1e out_ SPH,temp1 +000af5 8315 std Z+5, temp1 + + ; init parameter stack pointer +000af6 e0cf ldi yl,low(stackstart) +000af7 83c6 std Z+6, yl +000af8 e0d4 ldi yh,high(stackstart) +000af9 83d7 std Z+7, yh + + ; load Forth IP with starting word +000afa e0a3 ldi XL, low(PFA_WARM) +000afb e0bb ldi XH, high(PFA_WARM) + ; its a far jump... +000afc 940c 1c05 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: +000afe ff04 .dw $ff04 +000aff 6177 +000b00 6d72 .db "warm" +000b01 0adc .dw VE_HEAD + .set VE_HEAD = VE_WARM + XT_WARM: +000b02 1c01 .dw DO_COLON + PFA_WARM: + .endif +000b03 0dd7 .dw XT_INIT_RAM +000b04 1c3d .dw XT_DOLITERAL +000b05 0c06 .dw XT_NOOP +000b06 1c3d .dw XT_DOLITERAL +000b07 0ad8 .dw XT_PAUSE +000b08 0c7a .dw XT_DEFERSTORE +000b09 0438 .dw XT_LBRACKET +000b0a 067e .dw XT_TURNKEY +000b0b 0a75 .dw XT_QUIT ; never returns + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + .include "words/sp0.asm" + + ; Stack + ; start address of the data stack + VE_SP0: +000b0c ff03 .dw $ff03 +000b0d 7073 +000b0e 0030 .db "sp0",0 +000b0f 0afe .dw VE_HEAD + .set VE_HEAD = VE_SP0 + XT_SP0: +000b10 1c6f .dw PFA_DOVALUE1 + PFA_SP0: +000b11 0006 .dw USER_SP0 +000b12 0c63 .dw XT_UDEFERFETCH +000b13 0c6f .dw XT_UDEFERSTORE + + ; ( -- addr) + ; Stack + ; address of user variable to store top-of-stack for inactive tasks + VE_SP: +000b14 ff02 .dw $ff02 +000b15 7073 .db "sp" +000b16 0b0c .dw VE_HEAD + .set VE_HEAD = VE_SP + XT_SP: +000b17 1c58 .dw PFA_DOUSER + PFA_SP: +000b18 0008 .dw USER_SP + .include "words/rp0.asm" + + ; Stack + ; start address of return stack + VE_RP0: +000b19 ff03 .dw $ff03 +000b1a 7072 +000b1b 0030 .db "rp0",0 +000b1c 0b14 .dw VE_HEAD + .set VE_HEAD = VE_RP0 + XT_RP0: +000b1d 1c01 .dw DO_COLON + PFA_RP0: +000b1e 0b21 .dw XT_DORP0 +000b1f 1c79 .dw XT_FETCH +000b20 1c20 .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: +000b21 1c58 .dw PFA_DOUSER + PFA_DORP0: +000b22 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: +000b23 ff05 .dw $ff05 +000b24 6564 +000b25 7470 +000b26 0068 .db "depth",0 +000b27 0b19 .dw VE_HEAD + .set VE_HEAD = VE_DEPTH + XT_DEPTH: +000b28 1c01 .dw DO_COLON + PFA_DEPTH: + .endif +000b29 0b10 .dw XT_SP0 +000b2a 1e8d .dw XT_SP_FETCH +000b2b 1d93 .dw XT_MINUS +000b2c 1e04 .dw XT_2SLASH +000b2d 1e35 .dw XT_1MINUS +000b2e 1c20 .dw XT_EXIT + .include "words/recognize.asm" + + ; System + ; walk the recognizer stack + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_RECOGNIZE: +000b2f ff09 .dw $ff09 +000b30 6572 +000b31 6f63 +000b32 6e67 +000b33 7a69 +000b34 0065 .db "recognize",0 +000b35 0b23 .dw VE_HEAD + .set VE_HEAD = VE_RECOGNIZE + XT_RECOGNIZE: +000b36 1c01 .dw DO_COLON + PFA_RECOGNIZE: + .endif +000b37 1c3d .dw XT_DOLITERAL +000b38 0b41 .dw XT_RECOGNIZE_A +000b39 1cc4 .dw XT_SWAP +000b3a 04ee .dw XT_MAPSTACK +000b3b 1d1a .dw XT_ZEROEQUAL +000b3c 1c36 .dw XT_DOCONDBRANCH +000b3d 0b40 DEST(PFA_RECOGNIZE1) +000b3e 05f4 .dw XT_2DROP +000b3f 0bd1 .dw XT_DT_NULL + PFA_RECOGNIZE1: +000b40 1c20 .dw XT_EXIT + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + ; ( addr len XT -- addr len [ dt:xt -1 | 0 ] ) + XT_RECOGNIZE_A: +000b41 1c01 .dw DO_COLON + PFA_RECOGNIZE_A: + .endif +000b42 1ce1 .dw XT_ROT ; -- len xt addr +000b43 1ce1 .dw XT_ROT ; -- xt addr len +000b44 05eb .dw XT_2DUP +000b45 1f1e .dw XT_2TO_R +000b46 1ce1 .dw XT_ROT ; -- addr len xt +000b47 1c2a .dw XT_EXECUTE ; -- i*x dt:* | dt:null +000b48 1f2d .dw XT_2R_FROM +000b49 1ce1 .dw XT_ROT +000b4a 1cb1 .dw XT_DUP +000b4b 0bd1 .dw XT_DT_NULL +000b4c 1fe0 .dw XT_EQUAL +000b4d 1c36 .dw XT_DOCONDBRANCH +000b4e 0b52 DEST(PFA_RECOGNIZE_A1) +000b4f 1cd9 .dw XT_DROP +000b50 1d54 .dw XT_ZERO +000b51 1c20 .dw XT_EXIT + PFA_RECOGNIZE_A1: +000b52 1cf0 .dw XT_NIP +000b53 1cf0 .dw XT_NIP +000b54 1d4b .dw XT_TRUE +000b55 1c20 .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/forth-recognizer.asm" + + ; System Value + ; address of the next free data space (RAM) cell + VE_FORTHRECOGNIZER: +000b56 ff10 .dw $ff10 +000b57 6f66 +000b58 7472 +000b59 2d68 +000b5a 6572 +000b5b 6f63 +000b5c 6e67 +000b5d 7a69 +000b5e 7265 .db "forth-recognizer" +000b5f 0b2f .dw VE_HEAD + .set VE_HEAD = VE_FORTHRECOGNIZER + XT_FORTHRECOGNIZER: +000b60 1c6f .dw PFA_DOVALUE1 + PFA_FORTHRECOGNIZER: +000b61 0034 .dw CFG_FORTHRECOGNIZER +000b62 0c3b .dw XT_EDEFERFETCH +000b63 0c45 .dw XT_EDEFERSTORE + .include "words/interpret.asm" + + ; System + ; Interpret SOURCE word by word. + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_INTERPRET: +000b64 ff09 .dw $ff09 +000b65 6e69 +000b66 6574 +000b67 7072 +000b68 6572 +000b69 0074 .db "interpret",0 +000b6a 0b56 .dw VE_HEAD + .set VE_HEAD = VE_INTERPRET + XT_INTERPRET: +000b6b 1c01 .dw DO_COLON + .endif + PFA_INTERPRET: +000b6c 0a3b .dw XT_PARSENAME ; ( -- addr len ) +000b6d 1cb1 .dw XT_DUP ; ( -- addr len flag) +000b6e 1c36 .dw XT_DOCONDBRANCH +000b6f 0b7c DEST(PFA_INTERPRET2) +000b70 0b60 .dw XT_FORTHRECOGNIZER +000b71 0b36 .dw XT_RECOGNIZE +000b72 05d0 .dw XT_STATE +000b73 1c79 .dw XT_FETCH +000b74 1c36 .dw XT_DOCONDBRANCH +000b75 0b77 DEST(PFA_INTERPRET1) +000b76 0c32 .dw XT_ICELLPLUS ; we need the compile action + PFA_INTERPRET1: +000b77 1fcb .dw XT_FETCHI +000b78 1c2a .dw XT_EXECUTE +000b79 0bde .dw XT_QSTACK +000b7a 1c2f .dw XT_DOBRANCH +000b7b 0b6c DEST(PFA_INTERPRET) + PFA_INTERPRET2: +000b7c 05f4 .dw XT_2DROP +000b7d 1c20 .dw XT_EXIT + .include "words/rec-intnum.asm" + + ; Interpreter + ; Method table for single cell integers + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_DT_NUM: +000b7e ff06 .dw $ff06 +000b7f 7464 +000b80 6e3a +000b81 6d75 .db "dt:num" +000b82 0b64 .dw VE_HEAD + .set VE_HEAD = VE_DT_NUM + XT_DT_NUM: +000b83 1c52 .dw PFA_DOCONSTANT + PFA_DT_NUM: + .endif +000b84 0c06 .dw XT_NOOP ; interpret +000b85 02c4 .dw XT_LITERAL ; compile +000b86 02c4 .dw XT_LITERAL ; postpone + + ; ( -- addr ) + ; Interpreter + ; Method table for double cell integers + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_DT_DNUM: +000b87 ff07 .dw $ff07 +000b88 7464 +000b89 643a +000b8a 756e +000b8b 006d .db "dt:dnum",0 +000b8c 0b7e .dw VE_HEAD + .set VE_HEAD = VE_DT_DNUM + XT_DT_DNUM: +000b8d 1c52 .dw PFA_DOCONSTANT + PFA_DT_DNUM: + .endif +000b8e 0c06 .dw XT_NOOP ; interpret +000b8f 1fd8 .dw XT_2LITERAL ; compile +000b90 1fd8 .dw XT_2LITERAL ; postpone + + ; ( addr len -- f ) + ; Interpreter + ; recognizer for integer numbers + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + + VE_REC_NUM: +000b91 ff07 .dw $ff07 +000b92 6572 +000b93 3a63 +000b94 756e +000b95 006d .db "rec:num",0 +000b96 0b87 .dw VE_HEAD + .set VE_HEAD = VE_REC_NUM + XT_REC_NUM: +000b97 1c01 .dw DO_COLON + PFA_REC_NUM: + .endif + ; try converting to a number +000b98 097b .dw XT_NUMBER +000b99 1c36 .dw XT_DOCONDBRANCH +000b9a 0ba3 DEST(PFA_REC_NONUMBER) +000b9b 1fe7 .dw XT_ONE +000b9c 1fe0 .dw XT_EQUAL +000b9d 1c36 .dw XT_DOCONDBRANCH +000b9e 0ba1 DEST(PFA_REC_INTNUM2) +000b9f 0b83 .dw XT_DT_NUM +000ba0 1c20 .dw XT_EXIT + PFA_REC_INTNUM2: +000ba1 0b8d .dw XT_DT_DNUM +000ba2 1c20 .dw XT_EXIT + PFA_REC_NONUMBER: +000ba3 0bd1 .dw XT_DT_NULL +000ba4 1c20 .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: +000ba5 ff08 .dw $ff08 +000ba6 6572 +000ba7 3a63 +000ba8 6966 +000ba9 646e .db "rec:find" +000baa 0b91 .dw VE_HEAD + .set VE_HEAD = VE_REC_FIND + XT_REC_FIND: +000bab 1c01 .dw DO_COLON + PFA_REC_FIND: + .endif +000bac 0a57 .DW XT_FINDXT +000bad 1cb1 .dw XT_DUP +000bae 1d1a .dw XT_ZEROEQUAL +000baf 1c36 .dw XT_DOCONDBRANCH +000bb0 0bb4 DEST(PFA_REC_WORD_FOUND) +000bb1 1cd9 .dw XT_DROP +000bb2 0bd1 .dw XT_DT_NULL +000bb3 1c20 .dw XT_EXIT + PFA_REC_WORD_FOUND: +000bb4 0bbb .dw XT_DT_XT + +000bb5 1c20 .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: +000bb6 ff05 .dw $ff05 +000bb7 7464 +000bb8 783a +000bb9 0074 .db "dt:xt",0 +000bba 0ba5 .dw VE_HEAD + .set VE_HEAD = VE_DT_XT + XT_DT_XT: +000bbb 1c52 .dw PFA_DOCONSTANT + PFA_DT_XT: + .endif +000bbc 0bbf .dw XT_R_WORD_INTERPRET +000bbd 0bc3 .dw XT_R_WORD_COMPILE +000bbe 1fd8 .dw XT_2LITERAL + + ; ( XT flags -- ) + ; Interpreter + ; interpret method for WORD recognizer + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + XT_R_WORD_INTERPRET: +000bbf 1c01 .dw DO_COLON + PFA_R_WORD_INTERPRET: + .endif +000bc0 1cd9 .dw XT_DROP ; the flags are in the way +000bc1 1c2a .dw XT_EXECUTE +000bc2 1c20 .dw XT_EXIT + + ; ( XT flags -- ) + ; Interpreter + ; Compile method for WORD recognizer + .if cpu_msp430==1 + .endif + .if cpu_avr8==1 + XT_R_WORD_COMPILE: +000bc3 1c01 .dw DO_COLON + PFA_R_WORD_COMPILE: + .endif +000bc4 1d21 .dw XT_ZEROLESS +000bc5 1c36 .dw XT_DOCONDBRANCH +000bc6 0bc9 DEST(PFA_R_WORD_COMPILE1) +000bc7 02ae .dw XT_COMMA +000bc8 1c20 .dw XT_EXIT + PFA_R_WORD_COMPILE1: +000bc9 1c2a .dw XT_EXECUTE +000bca 1c20 .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: +000bcb ff07 .dw $ff07 +000bcc 7464 +000bcd 6e3a +000bce 6c75 +../../common\words/dt-null.asm(12): warning: .cseg .db misalignment - padding zero byte +000bcf 006c .db "dt:null" +000bd0 0bb6 .dw VE_HEAD + .set VE_HEAD = VE_DT_NULL + XT_DT_NULL: +000bd1 1c52 .dw PFA_DOCONSTANT + PFA_DT_NULL: + .endif +000bd2 0bd5 .dw XT_FAIL ; interpret +000bd3 0bd5 .dw XT_FAIL ; compile +000bd4 0bd5 .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: +000bd5 1c01 .dw DO_COLON + PFA_FAIL: + .endif +000bd6 1c3d .dw XT_DOLITERAL +000bd7 fff3 .dw -13 +000bd8 08c8 .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: +000bd9 ff06 .dw $ff06 +000bda 733f +000bdb 6174 +000bdc 6b63 .db "?stack" +000bdd 0bcb .dw VE_HEAD + .set VE_HEAD = VE_QSTACK + XT_QSTACK: +000bde 1c01 .dw DO_COLON + PFA_QSTACK: + .endif +000bdf 0b28 .dw XT_DEPTH +000be0 1d21 .dw XT_ZEROLESS +000be1 1c36 .dw XT_DOCONDBRANCH +000be2 0be6 DEST(PFA_QSTACK1) +000be3 1c3d .dw XT_DOLITERAL +000be4 fffc .dw -4 +000be5 08c8 .dw XT_THROW + PFA_QSTACK1: +000be6 1c20 .dw XT_EXIT + .include "words/ver.asm" + + ; Tools + ; print the version string + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_DOT_VER: +000be7 ff03 .dw $ff03 +000be8 6576 +../../common\words/ver.asm(12): warning: .cseg .db misalignment - padding zero byte +000be9 0072 .db "ver" +000bea 0bd9 .dw VE_HEAD + .set VE_HEAD = VE_DOT_VER + XT_DOT_VER: +000beb 1c01 .dw DO_COLON + PFA_DOT_VER: + .endif +000bec 0592 .dw XT_ENV_FORTHNAME +000bed 0827 .dw XT_ITYPE +000bee 0869 .dw XT_SPACE +000bef 05d6 .dw XT_BASE +000bf0 1c79 .dw XT_FETCH + +000bf1 05a0 .dw XT_ENV_FORTHVERSION +000bf2 0663 .dw XT_DECIMAL +000bf3 0dee .dw XT_S2D +000bf4 0745 .dw XT_L_SHARP +000bf5 074d .dw XT_SHARP +000bf6 1c3d .dw XT_DOLITERAL +000bf7 002e .dw '.' +000bf8 0736 .dw XT_HOLD +000bf9 0763 .dw XT_SHARP_S +000bfa 076e .dw XT_SHARP_G +000bfb 0882 .dw XT_TYPE +000bfc 05d6 .dw XT_BASE +000bfd 1c81 .dw XT_STORE +000bfe 0869 .dw XT_SPACE +000bff 05a8 .dw XT_ENV_CPU +000c00 0827 .dw XT_ITYPE + +000c01 1c20 .dw XT_EXIT + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + .include "words/noop.asm" + + ; Tools + ; do nothing + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_NOOP: +000c02 ff04 .dw $ff04 +000c03 6f6e +000c04 706f .db "noop" +000c05 0be7 .dw VE_HEAD + .set VE_HEAD = VE_NOOP + XT_NOOP: +000c06 1c01 .dw DO_COLON + PFA_NOOP: + .endif +000c07 1c20 .DW XT_EXIT + .include "words/unused.asm" + + ; Tools + ; Amount of available RAM (incl. PAD) + VE_UNUSED: +000c08 ff06 .dw $ff06 +000c09 6e75 +000c0a 7375 +000c0b 6465 .db "unused" +000c0c 0c02 .dw VE_HEAD + .set VE_HEAD = VE_UNUSED + XT_UNUSED: +000c0d 1c01 .dw DO_COLON + PFA_UNUSED: +000c0e 1e8d .dw XT_SP_FETCH +000c0f 0645 .dw XT_HERE +000c10 1d93 .dw XT_MINUS +000c11 1c20 .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: +000c12 0002 .dw $0002 +000c13 6f74 .db "to" +000c14 0c08 .dw VE_HEAD + .set VE_HEAD = VE_TO + XT_TO: +000c15 1c01 .dw DO_COLON + PFA_TO: + .endif +000c16 0891 .dw XT_TICK +000c17 0df7 .dw XT_TO_BODY +000c18 05d0 .dw XT_STATE +000c19 1c79 .dw XT_FETCH +000c1a 1c36 .dw XT_DOCONDBRANCH +000c1b 0c26 DEST(PFA_TO1) +000c1c 02a3 .dw XT_COMPILE +000c1d 0c20 .dw XT_DOTO +000c1e 02ae .dw XT_COMMA +000c1f 1c20 .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: +000c20 1c01 .dw DO_COLON + PFA_DOTO: + .endif +000c21 1cf6 .dw XT_R_FROM +000c22 1cb1 .dw XT_DUP +000c23 0c32 .dw XT_ICELLPLUS +000c24 1cff .dw XT_TO_R +000c25 1fcb .dw XT_FETCHI + PFA_TO1: +000c26 1cb1 .dw XT_DUP +000c27 0c32 .dw XT_ICELLPLUS +000c28 0c32 .dw XT_ICELLPLUS +000c29 1fcb .dw XT_FETCHI +000c2a 1c2a .dw XT_EXECUTE +000c2b 1c20 .dw XT_EXIT + .include "words/i-cellplus.asm" + + ; Compiler + ; skip to the next cell in flash + VE_ICELLPLUS: +000c2c ff07 .dw $FF07 +000c2d 2d69 +000c2e 6563 +000c2f 6c6c +000c30 002b .db "i-cell+",0 +000c31 0c12 .dw VE_HEAD + .set VE_HEAD = VE_ICELLPLUS + XT_ICELLPLUS: +000c32 1c01 .dw DO_COLON + PFA_ICELLPLUS: +000c33 1e2f .dw XT_1PLUS +000c34 1c20 .dw XT_EXIT + + .include "words/edefer-fetch.asm" + + ; System + ; does the real defer@ for eeprom defers + VE_EDEFERFETCH: +000c35 ff07 .dw $ff07 +000c36 6445 +000c37 6665 +000c38 7265 +000c39 0040 .db "Edefer@",0 +000c3a 0c2c .dw VE_HEAD + .set VE_HEAD = VE_EDEFERFETCH + XT_EDEFERFETCH: +000c3b 1c01 .dw DO_COLON + PFA_EDEFERFETCH: +000c3c 1fcb .dw XT_FETCHI +000c3d 1f5f .dw XT_FETCHE +000c3e 1c20 .dw XT_EXIT + .include "words/edefer-store.asm" + + ; System + ; does the real defer! for eeprom defers + VE_EDEFERSTORE: +000c3f ff07 .dw $ff07 +000c40 6445 +000c41 6665 +000c42 7265 +000c43 0021 .db "Edefer!",0 +000c44 0c35 .dw VE_HEAD + .set VE_HEAD = VE_EDEFERSTORE + XT_EDEFERSTORE: +000c45 1c01 .dw DO_COLON + PFA_EDEFERSTORE: +000c46 1fcb .dw XT_FETCHI +000c47 1f3b .dw XT_STOREE +000c48 1c20 .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: +000c49 ff07 .dw $ff07 +000c4a 6452 +000c4b 6665 +000c4c 7265 +000c4d 0040 .db "Rdefer@",0 +000c4e 0c3f .dw VE_HEAD + .set VE_HEAD = VE_RDEFERFETCH + XT_RDEFERFETCH: +000c4f 1c01 .dw DO_COLON + PFA_RDEFERFETCH: + .endif +000c50 1fcb .dw XT_FETCHI +000c51 1c79 .dw XT_FETCH +000c52 1c20 .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: +000c53 ff07 .dw $ff07 +000c54 6452 +000c55 6665 +000c56 7265 +000c57 0021 .db "Rdefer!",0 +000c58 0c49 .dw VE_HEAD + .set VE_HEAD = VE_RDEFERSTORE + XT_RDEFERSTORE: +000c59 1c01 .dw DO_COLON + PFA_RDEFERSTORE: + .endif +000c5a 1fcb .dw XT_FETCHI +000c5b 1c81 .dw XT_STORE +000c5c 1c20 .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: +000c5d ff07 .dw $ff07 +000c5e 6455 +000c5f 6665 +000c60 7265 +000c61 0040 .db "Udefer@",0 +000c62 0c53 .dw VE_HEAD + .set VE_HEAD = VE_UDEFERFETCH + XT_UDEFERFETCH: +000c63 1c01 .dw DO_COLON + PFA_UDEFERFETCH: + .endif +000c64 1fcb .dw XT_FETCHI +000c65 1f02 .dw XT_UP_FETCH +000c66 1d9d .dw XT_PLUS +000c67 1c79 .dw XT_FETCH +000c68 1c20 .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: +000c69 ff07 .dw $ff07 +000c6a 6455 +000c6b 6665 +000c6c 7265 +000c6d 0021 .db "Udefer!",0 +000c6e 0c5d .dw VE_HEAD + .set VE_HEAD = VE_UDEFERSTORE + XT_UDEFERSTORE: +000c6f 1c01 .dw DO_COLON + PFA_UDEFERSTORE: + .endif + +000c70 1fcb .dw XT_FETCHI +000c71 1f02 .dw XT_UP_FETCH +000c72 1d9d .dw XT_PLUS +000c73 1c81 .dw XT_STORE +000c74 1c20 .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: +000c75 ff06 .dw $ff06 +000c76 6564 +000c77 6566 +000c78 2172 .db "defer!" +000c79 0c69 .dw VE_HEAD + .set VE_HEAD = VE_DEFERSTORE + XT_DEFERSTORE: +000c7a 1c01 .dw DO_COLON + PFA_DEFERSTORE: + .endif +000c7b 0df7 .dw XT_TO_BODY +000c7c 1cb1 .dw XT_DUP +000c7d 0c32 .dw XT_ICELLPLUS +000c7e 0c32 .dw XT_ICELLPLUS +000c7f 1fcb .dw XT_FETCHI +000c80 1c2a .dw XT_EXECUTE +000c81 1c20 .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: +000c82 ff06 .dw $ff06 +000c83 6564 +000c84 6566 +000c85 4072 .db "defer@" +000c86 0c75 .dw VE_HEAD + .set VE_HEAD = VE_DEFERFETCH + XT_DEFERFETCH: +000c87 1c01 .dw DO_COLON + PFA_DEFERFETCH: + .endif +000c88 0df7 .dw XT_TO_BODY +000c89 1cb1 .dw XT_DUP +000c8a 0c32 .dw XT_ICELLPLUS +000c8b 1fcb .dw XT_FETCHI +000c8c 1c2a .dw XT_EXECUTE +000c8d 1c20 .dw XT_EXIT + .include "words/do-defer.asm" + + ; System + ; runtime of defer + VE_DODEFER: +000c8e ff07 .dw $ff07 +000c8f 6428 +000c90 6665 +000c91 7265 +000c92 0029 .db "(defer)", 0 +000c93 0c82 .dw VE_HEAD + .set VE_HEAD = VE_DODEFER + XT_DODEFER: +000c94 1c01 .dw DO_COLON + PFA_DODEFER: +000c95 0280 .dw XT_DOCREATE +000c96 03e0 .dw XT_REVEAL +000c97 02a3 .dw XT_COMPILE +000c98 0c9a .dw PFA_DODEFER1 +000c99 1c20 .dw XT_EXIT + PFA_DODEFER1: +000c9a 940e 03f9 call_ DO_DODOES +000c9c 1cb1 .dw XT_DUP +000c9d 0c32 .dw XT_ICELLPLUS +000c9e 1fcb .dw XT_FETCHI +000c9f 1c2a .dw XT_EXECUTE +000ca0 1c2a .dw XT_EXECUTE +000ca1 1c20 .dw XT_EXIT + + ; : (defer) dup i-cell+ @i execute execute ; + + + .include "words/search-wordlist.asm" + + ; Search Order + ; searches the word list wid for the word at c-addr/len + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_SEARCH_WORDLIST: +000ca2 ff0f .dw $ff0f +000ca3 6573 +000ca4 7261 +000ca5 6863 +000ca6 772d +000ca7 726f +000ca8 6c64 +000ca9 7369 +000caa 0074 .db "search-wordlist",0 +000cab 0c8e .dw VE_HEAD + .set VE_HEAD = VE_SEARCH_WORDLIST + XT_SEARCH_WORDLIST: +000cac 1c01 .dw DO_COLON + PFA_SEARCH_WORDLIST: + .endif +000cad 1cff .dw XT_TO_R +000cae 1d54 .dw XT_ZERO +000caf 1c3d .dw XT_DOLITERAL +000cb0 0cc1 .dw XT_ISWORD +000cb1 1cf6 .dw XT_R_FROM +000cb2 0cde .dw XT_TRAVERSEWORDLIST +000cb3 1cb1 .dw XT_DUP +000cb4 1d1a .dw XT_ZEROEQUAL +000cb5 1c36 .dw XT_DOCONDBRANCH +000cb6 0cbb DEST(PFA_SEARCH_WORDLIST1) +000cb7 05f4 .dw XT_2DROP +000cb8 1cd9 .dw XT_DROP +000cb9 1d54 .dw XT_ZERO +000cba 1c20 .dw XT_EXIT + PFA_SEARCH_WORDLIST1: + ; ... get the XT ... +000cbb 1cb1 .dw XT_DUP +000cbc 0d05 .dw XT_NFA2CFA + ; .. and get the header flag +000cbd 1cc4 .dw XT_SWAP +000cbe 0175 .dw XT_NAME2FLAGS +000cbf 0163 .dw XT_IMMEDIATEQ +000cc0 1c20 .dw XT_EXIT + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + XT_ISWORD: +000cc1 1c01 .dw DO_COLON + PFA_ISWORD: + .endif + ; ( c-addr len 0 nt -- c-addr len 0 true| nt false ) +000cc2 1cff .dw XT_TO_R +000cc3 1cd9 .dw XT_DROP +000cc4 05eb .dw XT_2DUP +000cc5 1d08 .dw XT_R_FETCH ; -- addr len addr len nt +000cc6 0cf9 .dw XT_NAME2STRING +000cc7 0d0f .dw XT_ICOMPARE ; (-- addr len f ) +000cc8 1c36 .dw XT_DOCONDBRANCH +000cc9 0ccf DEST(PFA_ISWORD3) + ; not now +000cca 1cf6 .dw XT_R_FROM +000ccb 1cd9 .dw XT_DROP +000ccc 1d54 .dw XT_ZERO +000ccd 1d4b .dw XT_TRUE ; maybe next word +000cce 1c20 .dw XT_EXIT + PFA_ISWORD3: + ; we found the word, now clean up iteration data ... +000ccf 05f4 .dw XT_2DROP +000cd0 1cf6 .dw XT_R_FROM +000cd1 1d54 .dw XT_ZERO ; finish traverse-wordlist +000cd2 1c20 .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: +000cd3 ff11 .dw $ff11 +000cd4 7274 +000cd5 7661 +000cd6 7265 +000cd7 6573 +000cd8 772d +000cd9 726f +000cda 6c64 +000cdb 7369 +000cdc 0074 .db "traverse-wordlist",0 +000cdd 0ca2 .dw VE_HEAD + .set VE_HEAD = VE_TRAVERSEWORDLIST + XT_TRAVERSEWORDLIST: +000cde 1c01 .dw DO_COLON + PFA_TRAVERSEWORDLIST: + + .endif +000cdf 1f5f .dw XT_FETCHE + PFA_TRAVERSEWORDLIST1: +000ce0 1cb1 .dw XT_DUP ; ( -- xt nt nt ) +000ce1 1c36 .dw XT_DOCONDBRANCH ; ( -- nt ) is nfa = counted string +000ce2 0cef DEST(PFA_TRAVERSEWORDLIST2) +000ce3 05eb .dw XT_2DUP +000ce4 1f1e .dw XT_2TO_R +000ce5 1cc4 .dw XT_SWAP +000ce6 1c2a .dw XT_EXECUTE +000ce7 1f2d .dw XT_2R_FROM +000ce8 1ce1 .dw XT_ROT +000ce9 1c36 .dw XT_DOCONDBRANCH +000cea 0cef DEST(PFA_TRAVERSEWORDLIST2) +000ceb 055d .dw XT_NFA2LFA +000cec 1fcb .dw XT_FETCHI +000ced 1c2f .dw XT_DOBRANCH ; ( -- addr ) +000cee 0ce0 DEST(PFA_TRAVERSEWORDLIST1) ; ( -- addr ) + PFA_TRAVERSEWORDLIST2: +000cef 05f4 .dw XT_2DROP +000cf0 1c20 .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: +000cf1 ff0b .dw $ff0b +000cf2 616e +000cf3 656d +000cf4 733e +000cf5 7274 +000cf6 6e69 +000cf7 0067 .db "name>string",0 +000cf8 0cd3 .dw VE_HEAD + .set VE_HEAD = VE_NAME2STRING + XT_NAME2STRING: +000cf9 1c01 .dw DO_COLON + PFA_NAME2STRING: + + .endif +000cfa 0853 .dw XT_ICOUNT ; ( -- addr n ) +000cfb 1c3d .dw XT_DOLITERAL +000cfc 00ff .dw 255 +000cfd 1e13 .dw XT_AND ; mask immediate bit +000cfe 1c20 .dw XT_EXIT + .include "words/nfa2cfa.asm" + + ; Tools + ; get the XT from a name token + VE_NFA2CFA: +000cff ff07 .dw $ff07 +000d00 666e +000d01 3e61 +000d02 6663 +../../avr8\words/nfa2cfa.asm(6): warning: .cseg .db misalignment - padding zero byte +000d03 0061 .db "nfa>cfa" +000d04 0cf1 .dw VE_HEAD + .set VE_HEAD = VE_NFA2CFA + XT_NFA2CFA: +000d05 1c01 .dw DO_COLON + PFA_NFA2CFA: +000d06 055d .dw XT_NFA2LFA ; skip to link field +000d07 1e2f .dw XT_1PLUS ; next is the execution token +000d08 1c20 .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: +000d09 ff08 .dw $ff08 +000d0a 6369 +000d0b 6d6f +000d0c 6170 +000d0d 6572 .db "icompare" +000d0e 0cff .dw VE_HEAD + .set VE_HEAD = VE_ICOMPARE + XT_ICOMPARE: +000d0f 1c01 .dw DO_COLON + PFA_ICOMPARE: +000d10 1cff .dw XT_TO_R ; ( -- r-addr r-len f-addr) +000d11 1ccf .dw XT_OVER ; ( -- r-addr r-len f-addr r-len) +000d12 1cf6 .dw XT_R_FROM ; ( -- r-addr r-len f-addr r-len f-len ) +000d13 1d13 .dw XT_NOTEQUAL ; ( -- r-addr r-len f-addr flag ) +000d14 1c36 .dw XT_DOCONDBRANCH +000d15 0d1a .dw PFA_ICOMPARE_SAMELEN +000d16 05f4 .dw XT_2DROP +000d17 1cd9 .dw XT_DROP +000d18 1d4b .dw XT_TRUE +000d19 1c20 .dw XT_EXIT + PFA_ICOMPARE_SAMELEN: +000d1a 1cc4 .dw XT_SWAP ; ( -- r-addr f-addr len ) +000d1b 1d54 .dw XT_ZERO +000d1c 036d .dw XT_QDOCHECK +000d1d 1c36 .dw XT_DOCONDBRANCH +000d1e 0d3d .dw PFA_ICOMPARE_DONE +000d1f 1e9b .dw XT_DODO + PFA_ICOMPARE_LOOP: + ; ( r-addr f-addr --) +000d20 1ccf .dw XT_OVER +000d21 1c79 .dw XT_FETCH + .if WANT_IGNORECASE == 1 + .endif +000d22 1ccf .dw XT_OVER +000d23 1fcb .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 +000d24 1cb1 .dw XT_DUP + ;.dw XT_BYTESWAP +000d25 1c3d .dw XT_DOLITERAL +000d26 0100 .dw $100 +000d27 1d5c .dw XT_ULESS +000d28 1c36 .dw XT_DOCONDBRANCH +000d29 0d2e .dw PFA_ICOMPARE_LASTCELL +000d2a 1cc4 .dw XT_SWAP +000d2b 1c3d .dw XT_DOLITERAL +000d2c 00ff .dw $00FF +000d2d 1e13 .dw XT_AND ; the final swap can be omitted + PFA_ICOMPARE_LASTCELL: +000d2e 1d13 .dw XT_NOTEQUAL +000d2f 1c36 .dw XT_DOCONDBRANCH +000d30 0d35 .dw PFA_ICOMPARE_NEXTLOOP +000d31 05f4 .dw XT_2DROP +000d32 1d4b .dw XT_TRUE +000d33 1ed4 .dw XT_UNLOOP +000d34 1c20 .dw XT_EXIT + PFA_ICOMPARE_NEXTLOOP: +000d35 1e2f .dw XT_1PLUS +000d36 1cc4 .dw XT_SWAP +000d37 05e3 .dw XT_CELLPLUS +000d38 1cc4 .dw XT_SWAP +000d39 1c3d .dw XT_DOLITERAL +000d3a 0002 .dw 2 +000d3b 1eba .dw XT_DOPLUSLOOP +000d3c 0d20 .dw PFA_ICOMPARE_LOOP + PFA_ICOMPARE_DONE: +000d3d 05f4 .dw XT_2DROP +000d3e 1d54 .dw XT_ZERO +000d3f 1c20 .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: +000d40 ff01 .dw $ff01 +000d41 002a .db "*",0 +000d42 0d09 .dw VE_HEAD + .set VE_HEAD = VE_STAR + XT_STAR: +000d43 1c01 .dw DO_COLON + PFA_STAR: + .endif + +000d44 1da6 .dw XT_MSTAR +000d45 1cd9 .dw XT_DROP +000d46 1c20 .dw XT_EXIT + .include "words/j.asm" + + ; Compiler + ; loop counter of outer loop + VE_J: +000d47 ff01 .dw $FF01 +000d48 006a .db "j",0 +000d49 0d40 .dw VE_HEAD + .set VE_HEAD = VE_J + XT_J: +000d4a 1c01 .dw DO_COLON + PFA_J: +000d4b 1e76 .dw XT_RP_FETCH +000d4c 1c3d .dw XT_DOLITERAL +000d4d 0007 .dw 7 +000d4e 1d9d .dw XT_PLUS +000d4f 1c79 .dw XT_FETCH +000d50 1e76 .dw XT_RP_FETCH +000d51 1c3d .dw XT_DOLITERAL +000d52 0009 .dw 9 +000d53 1d9d .dw XT_PLUS +000d54 1c79 .dw XT_FETCH +000d55 1d9d .dw XT_PLUS +000d56 1c20 .dw XT_EXIT + + .include "words/dabs.asm" + + ; Arithmetics + ; double cell absolute value + VE_DABS: +000d57 ff04 .dw $ff04 +000d58 6164 +000d59 7362 .db "dabs" +000d5a 0d47 .dw VE_HEAD + .set VE_HEAD = VE_DABS + XT_DABS: +000d5b 1c01 .dw DO_COLON + PFA_DABS: +000d5c 1cb1 .dw XT_DUP +000d5d 1d21 .dw XT_ZEROLESS +000d5e 1c36 .dw XT_DOCONDBRANCH +000d5f 0d61 .dw PFA_DABS1 +000d60 0d68 .dw XT_DNEGATE + PFA_DABS1: +000d61 1c20 .dw XT_EXIT + ; : dabs ( ud1 -- +d2 ) dup 0< if dnegate then ; + .include "words/dnegate.asm" + + ; Arithmetics + ; double cell negation + VE_DNEGATE: +000d62 ff07 .dw $ff07 +000d63 6e64 +000d64 6765 +000d65 7461 +000d66 0065 .db "dnegate",0 +000d67 0d57 .dw VE_HEAD + .set VE_HEAD = VE_DNEGATE + XT_DNEGATE: +000d68 1c01 .dw DO_COLON + PFA_DNEGATE: +000d69 01c4 .dw XT_DINVERT +000d6a 1fe7 .dw XT_ONE +000d6b 1d54 .dw XT_ZERO +000d6c 019c .dw XT_DPLUS +000d6d 1c20 .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: +000d6e ff05 .dw $ff05 +000d6f 6d63 +000d70 766f +000d71 0065 .db "cmove",0 +000d72 0d62 .dw VE_HEAD + .set VE_HEAD = VE_CMOVE + XT_CMOVE: +000d73 0d74 .dw PFA_CMOVE + PFA_CMOVE: +000d74 93bf push xh +000d75 93af push xl +000d76 91e9 ld zl, Y+ +000d77 91f9 ld zh, Y+ ; addr-to +000d78 91a9 ld xl, Y+ +000d79 91b9 ld xh, Y+ ; addr-from +000d7a 2f09 mov temp0, tosh +000d7b 2b08 or temp0, tosl +000d7c f021 brbs 1, PFA_CMOVE1 + PFA_CMOVE2: +000d7d 911d ld temp1, X+ +000d7e 9311 st Z+, temp1 +000d7f 9701 sbiw tosl, 1 +000d80 f7e1 brbc 1, PFA_CMOVE2 + PFA_CMOVE1: +000d81 91af pop xl +000d82 91bf pop xh +000d83 9189 +000d84 9199 loadtos +000d85 940c 1c05 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: +000d87 ff05 .dw $ff05 +000d88 7332 +000d89 6177 +000d8a 0070 .db "2swap",0 +000d8b 0d6e .dw VE_HEAD + .set VE_HEAD = VE_2SWAP + XT_2SWAP: +000d8c 1c01 .dw DO_COLON + PFA_2SWAP: + + .endif +000d8d 1ce1 .dw XT_ROT +000d8e 1cff .dw XT_TO_R +000d8f 1ce1 .dw XT_ROT +000d90 1cf6 .dw XT_R_FROM +000d91 1c20 .dw XT_EXIT + + .include "words/tib.asm" + + ; System + ; refills the input buffer + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_REFILLTIB: +000d92 ff0a .dw $ff0a +000d93 6572 +000d94 6966 +000d95 6c6c +000d96 742d +000d97 6269 .db "refill-tib" +000d98 0d87 .dw VE_HEAD + .set VE_HEAD = VE_REFILLTIB + XT_REFILLTIB: +000d99 1c01 .dw DO_COLON + PFA_REFILLTIB: + .endif +000d9a 0db5 .dw XT_TIB +000d9b 1c3d .dw XT_DOLITERAL +000d9c 005a .dw TIB_SIZE +000d9d 0918 .dw XT_ACCEPT +000d9e 0dbb .dw XT_NUMBERTIB +000d9f 1c81 .dw XT_STORE +000da0 1d54 .dw XT_ZERO +000da1 0604 .dw XT_TO_IN +000da2 1c81 .dw XT_STORE +000da3 1d4b .dw XT_TRUE ; -1 +000da4 1c20 .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: +000da5 ff0a .dw $FF0A +000da6 6f73 +000da7 7275 +000da8 6563 +000da9 742d +000daa 6269 .db "source-tib" +000dab 0d92 .dw VE_HEAD + .set VE_HEAD = VE_SOURCETIB + XT_SOURCETIB: +000dac 1c01 .dw DO_COLON + PFA_SOURCETIB: + .endif +000dad 0db5 .dw XT_TIB +000dae 0dbb .dw XT_NUMBERTIB +000daf 1c79 .dw XT_FETCH +000db0 1c20 .dw XT_EXIT + + ; ( -- addr ) + ; System Variable + ; terminal input buffer address + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_TIB: +000db1 ff03 .dw $ff03 +000db2 6974 +000db3 0062 .db "tib",0 +000db4 0da5 .dw VE_HEAD + .set VE_HEAD = VE_TIB + XT_TIB: +000db5 1c48 .dw PFA_DOVARIABLE + PFA_TIB: +000db6 00c1 .dw ram_tib + .dseg +0000c1 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: +000db7 ff04 .dw $ff04 +000db8 7423 +000db9 6269 .db "#tib" +000dba 0db1 .dw VE_HEAD + .set VE_HEAD = VE_NUMBERTIB + XT_NUMBERTIB: +000dbb 1c48 .dw PFA_DOVARIABLE + PFA_NUMBERTIB: +000dbc 011b .dw ram_sharptib + .dseg +00011b ram_sharptib: .byte 2 + .cseg + .endif + + .include "words/init-ram.asm" + + ; Tools + ; copy len cells from eeprom to ram + VE_EE2RAM: +000dbd ff06 .dw $ff06 +000dbe 6565 +000dbf 723e +000dc0 6d61 .db "ee>ram" +000dc1 0db7 .dw VE_HEAD + .set VE_HEAD = VE_EE2RAM + XT_EE2RAM: +000dc2 1c01 .dw DO_COLON + PFA_EE2RAM: ; ( -- ) +000dc3 1d54 .dw XT_ZERO +000dc4 1e9b .dw XT_DODO + PFA_EE2RAM_1: + ; ( -- e-addr r-addr ) +000dc5 1ccf .dw XT_OVER +000dc6 1f5f .dw XT_FETCHE +000dc7 1ccf .dw XT_OVER +000dc8 1c81 .dw XT_STORE +000dc9 05e3 .dw XT_CELLPLUS +000dca 1cc4 .dw XT_SWAP +000dcb 05e3 .dw XT_CELLPLUS +000dcc 1cc4 .dw XT_SWAP +000dcd 1ec9 .dw XT_DOLOOP +000dce 0dc5 .dw PFA_EE2RAM_1 + PFA_EE2RAM_2: +000dcf 05f4 .dw XT_2DROP +000dd0 1c20 .dw XT_EXIT + + ; ( -- ) + ; Tools + ; setup the default user area from eeprom + VE_INIT_RAM: +000dd1 ff08 .dw $ff08 +000dd2 6e69 +000dd3 7469 +000dd4 722d +000dd5 6d61 .db "init-ram" +000dd6 0dbd .dw VE_HEAD + .set VE_HEAD = VE_INIT_RAM + XT_INIT_RAM: +000dd7 1c01 .dw DO_COLON + PFA_INI_RAM: ; ( -- ) +000dd8 1c3d .dw XT_DOLITERAL +000dd9 0060 .dw EE_INITUSER +000dda 1f02 .dw XT_UP_FETCH +000ddb 1c3d .dw XT_DOLITERAL +000ddc 0022 .dw SYSUSERSIZE +000ddd 1e04 .dw XT_2SLASH +000dde 0dc2 .dw XT_EE2RAM +000ddf 1c20 .dw XT_EXIT + .include "words/bounds.asm" + + ; Tools + ; convert a string to an address range + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_BOUNDS: +000de0 ff06 .dw $ff06 +000de1 6f62 +000de2 6e75 +000de3 7364 .db "bounds" +000de4 0dd1 .dw VE_HEAD + .set VE_HEAD = VE_BOUNDS + XT_BOUNDS: +000de5 1c01 .dw DO_COLON + PFA_BOUNDS: + .endif +000de6 1ccf .dw XT_OVER +000de7 1d9d .dw XT_PLUS +000de8 1cc4 .dw XT_SWAP +000de9 1c20 .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: +000dea ff03 .dw $ff03 +000deb 3e73 +000dec 0064 .db "s>d",0 +000ded 0de0 .dw VE_HEAD + .set VE_HEAD = VE_S2D + XT_S2D: +000dee 1c01 .dw DO_COLON + PFA_S2D: + .endif +000def 1cb1 .dw XT_DUP +000df0 1d21 .dw XT_ZEROLESS +000df1 1c20 .dw XT_EXIT + .include "words/to-body.asm" + + ; Core + ; get body from XT + VE_TO_BODY: +000df2 ff05 .dw $ff05 +000df3 623e +000df4 646f +000df5 0079 .db ">body",0 +000df6 0dea .dw VE_HEAD + .set VE_HEAD = VE_TO_BODY + XT_TO_BODY: +000df7 1e30 .dw PFA_1PLUS + .else + .endif + .include "dict_appl.inc" + + ; they may be moved to the core dictionary if needed + .include "words/dot-s.asm" + + ; Tools + ; stack dump + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_DOTS: +000df8 ff02 .dw $ff02 +000df9 732e .db ".s" +000dfa 0df2 .dw VE_HEAD + .set VE_HEAD = VE_DOTS + XT_DOTS: +000dfb 1c01 .dw DO_COLON + PFA_DOTS: + .endif +000dfc 0b28 .dw XT_DEPTH +000dfd 01d2 .dw XT_UDOT +000dfe 0869 .dw XT_SPACE +000dff 0b28 .dw XT_DEPTH +000e00 1d54 .dw XT_ZERO +000e01 036d .dw XT_QDOCHECK +000e02 1c36 .dw XT_DOCONDBRANCH +000e03 0e0a DEST(PFA_DOTS2) +000e04 1e9b .dw XT_DODO + PFA_DOTS1: +000e05 1eac .dw XT_I +000e06 023d .dw XT_PICK +000e07 01d2 .dw XT_UDOT +000e08 1ec9 .dw XT_DOLOOP +000e09 0e05 DEST(PFA_DOTS1) + PFA_DOTS2: +000e0a 1c20 .dw XT_EXIT + .include "words/spirw.asm" + + ; MCU + ; SPI exchange of 1 byte + VE_SPIRW: +000e0b ff06 .dw $ff06 +000e0c 2163 +000e0d 7340 +000e0e 6970 .db "c!@spi" +000e0f 0df8 .dw VE_HEAD + .set VE_HEAD = VE_SPIRW + XT_SPIRW: +000e10 0e11 .dw PFA_SPIRW + PFA_SPIRW: +000e11 d003 rcall do_spirw +000e12 2799 clr tosh +000e13 940c 1c05 jmp_ DO_NEXT + + do_spirw: +000e15 b98f out_ SPDR, tosl + do_spirw1: +000e16 b10e in_ temp0, SPSR +000e17 7f08 cbr temp0,7 +000e18 b90e out_ SPSR, temp0 +000e19 b10e in_ temp0, SPSR +000e1a ff07 sbrs temp0, 7 +000e1b cffa rjmp do_spirw1 ; wait until complete +000e1c b18f in_ tosl, SPDR +000e1d 9508 ret + .include "words/n-spi.asm" + + ; MCU + ; read len bytes from SPI to addr + VE_N_SPIR: +000e1e ff05 .dw $ff05 +000e1f 406e +000e20 7073 +000e21 0069 .db "n@spi",0 +000e22 0e0b .dw VE_HEAD + .set VE_HEAD = VE_N_SPIR + XT_N_SPIR: +000e23 0e24 .dw PFA_N_SPIR + PFA_N_SPIR: +000e24 018c movw temp0, tosl +000e25 9189 +000e26 9199 loadtos +000e27 01fc movw zl, tosl +000e28 01c8 movw tosl, temp0 + PFA_N_SPIR_LOOP: +000e29 b82f out_ SPDR, zerol + PFA_N_SPIR_LOOP1: +000e2a b12e in_ temp2, SPSR +000e2b ff27 sbrs temp2, SPIF +000e2c cffd rjmp PFA_N_SPIR_LOOP1 +000e2d b12f in_ temp2, SPDR +000e2e 9321 st Z+, temp2 +000e2f 9701 sbiw tosl, 1 +000e30 f7c1 brne PFA_N_SPIR_LOOP +000e31 9189 +000e32 9199 loadtos +000e33 940c 1c05 jmp_ DO_NEXT + + ; ( addr len -- ) + ; MCU + ; write len bytes to SPI from addr + VE_N_SPIW: +000e35 ff05 .dw $ff05 +000e36 216e +000e37 7073 +000e38 0069 .db "n!spi",0 +000e39 0e1e .dw VE_HEAD + .set VE_HEAD = VE_N_SPIW + XT_N_SPIW: +000e3a 0e3b .dw PFA_N_SPIW + PFA_N_SPIW: +000e3b 018c movw temp0, tosl +000e3c 9189 +000e3d 9199 loadtos +000e3e 01fc movw zl, tosl +000e3f 01c8 movw tosl, temp0 + PFA_N_SPIW_LOOP: +000e40 9121 ld temp2, Z+ +000e41 b92f out_ SPDR, temp2 + PFA_N_SPIW_LOOP1: +000e42 b12e in_ temp2, SPSR +000e43 ff27 sbrs temp2, SPIF +000e44 cffd rjmp PFA_N_SPIW_LOOP1 +000e45 b12f in_ temp2, SPDR ; ignore the data +000e46 9701 sbiw tosl, 1 +000e47 f7c1 brne PFA_N_SPIW_LOOP +000e48 9189 +000e49 9199 loadtos +000e4a 940c 1c05 jmp_ DO_NEXT + .include "words/applturnkey.asm" + + ; R( -- ) + ; application specific turnkey action + VE_APPLTURNKEY: +000e4c ff0b .dw $ff0b +000e4d 7061 +000e4e 6c70 +000e4f 7574 +000e50 6e72 +000e51 656b +000e52 0079 .db "applturnkey",0 +000e53 0e35 .dw VE_HEAD + .set VE_HEAD = VE_APPLTURNKEY + XT_APPLTURNKEY: +000e54 1c01 .dw DO_COLON + PFA_APPLTURNKEY: +000e55 00bc .dw XT_USART + + .if WANT_INTERRUPTS == 1 +000e56 0203 .dw XT_INTON + .endif +000e57 0beb .dw XT_DOT_VER +000e58 0869 .dw XT_SPACE +000e59 05c5 .dw XT_F_CPU +000e5a 1c3d .dw XT_DOLITERAL +000e5b 03e8 .dw 1000 +000e5c 1dc2 .dw XT_UMSLASHMOD +000e5d 1cf0 .dw XT_NIP +000e5e 0663 .dw XT_DECIMAL +000e5f 07a9 .dw XT_DOT +000e60 07f4 .dw XT_DOSLITERAL +000e61 0004 .dw 4 +000e62 486b +000e63 207a .db "kHz " +000e64 0827 .dw XT_ITYPE +000e65 1c20 .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: +000e66 ff0b .dw $ff0b +000e67 6573 +000e68 2d74 +000e69 7563 +000e6a 7272 +000e6b 6e65 +000e6c 0074 .db "set-current",0 +000e6d 0e4c .dw VE_HEAD + .set VE_HEAD = VE_SET_CURRENT + XT_SET_CURRENT: +000e6e 1c01 .dw DO_COLON + PFA_SET_CURRENT: +000e6f 1c3d .dw XT_DOLITERAL +000e70 003c .dw CFG_CURRENT +000e71 1f3b .dw XT_STOREE +000e72 1c20 .dw XT_EXIT + .include "words/wordlist.asm" + + ; Search Order + ; create a new, empty wordlist + VE_WORDLIST: +000e73 ff08 .dw $ff08 +000e74 6f77 +000e75 6472 +000e76 696c +000e77 7473 .db "wordlist" +000e78 0e66 .dw VE_HEAD + .set VE_HEAD = VE_WORDLIST + XT_WORDLIST: +000e79 1c01 .dw DO_COLON + PFA_WORDLIST: +000e7a 063d .dw XT_EHERE +000e7b 1d54 .dw XT_ZERO +000e7c 1ccf .dw XT_OVER +000e7d 1f3b .dw XT_STOREE +000e7e 1cb1 .dw XT_DUP +000e7f 05e3 .dw XT_CELLPLUS +000e80 0c20 .dw XT_DOTO +000e81 063e .dw PFA_EHERE +000e82 1c20 .dw XT_EXIT + + .include "words/forth-wordlist.asm" + + ; Search Order + ; get the system default word list + VE_FORTHWORDLIST: +000e83 ff0e .dw $ff0e +000e84 6f66 +000e85 7472 +000e86 2d68 +000e87 6f77 +000e88 6472 +000e89 696c +000e8a 7473 .db "forth-wordlist" +000e8b 0e73 .dw VE_HEAD + .set VE_HEAD = VE_FORTHWORDLIST + XT_FORTHWORDLIST: +000e8c 1c48 .dw PFA_DOVARIABLE + PFA_FORTHWORDLIST: +000e8d 003e .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: +000e8e ff09 .dw $ff09 +000e8f 6573 +000e90 2d74 +000e91 726f +000e92 6564 +000e93 0072 .db "set-order",0 +000e94 0e83 .dw VE_HEAD + .set VE_HEAD = VE_SET_ORDER + XT_SET_ORDER: +000e95 1c01 .dw DO_COLON + PFA_SET_ORDER: + .endif +000e96 1c3d .dw XT_DOLITERAL +000e97 0040 .dw CFG_ORDERLISTLEN +000e98 04d0 .dw XT_SET_STACK +000e99 1c20 .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: +000e9a ff0f .dw $ff0f +000e9b 6573 +000e9c 2d74 +000e9d 6572 +000e9e 6f63 +000e9f 6e67 +000ea0 7a69 +000ea1 7265 +000ea2 0073 .db "set-recognizers",0 +000ea3 0e8e .dw VE_HEAD + .set VE_HEAD = VE_SET_RECOGNIZERS + XT_SET_RECOGNIZERS: +000ea4 1c01 .dw DO_COLON + PFA_SET_RECOGNIZERS: + .endif +000ea5 1c3d .dw XT_DOLITERAL +000ea6 0052 .dw CFG_RECOGNIZERLISTLEN +000ea7 04d0 .dw XT_SET_STACK +000ea8 1c20 .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: +000ea9 ff0f .dw $ff0f +000eaa 6567 +000eab 2d74 +000eac 6572 +000ead 6f63 +000eae 6e67 +000eaf 7a69 +000eb0 7265 +000eb1 0073 .db "get-recognizers",0 +000eb2 0e9a .dw VE_HEAD + .set VE_HEAD = VE_GET_RECOGNIZERS + XT_GET_RECOGNIZERS: +000eb3 1c01 .dw DO_COLON + PFA_GET_RECOGNIZERS: + .endif +000eb4 1c3d .dw XT_DOLITERAL +000eb5 0052 .dw CFG_RECOGNIZERLISTLEN +000eb6 04af .dw XT_GET_STACK +000eb7 1c20 .dw XT_EXIT + .include "words/code.asm" + + ; Compiler + ; create named entry in the dictionary, XT is the data field + VE_CODE: +000eb8 ff04 .dw $ff04 +000eb9 6f63 +000eba 6564 .db "code" +000ebb 0ea9 .dw VE_HEAD + .set VE_HEAD = VE_CODE + XT_CODE: +000ebc 1c01 .dw DO_COLON + PFA_CODE: +000ebd 0280 .dw XT_DOCREATE +000ebe 03e0 .dw XT_REVEAL +000ebf 0634 .dw XT_DP +000ec0 0c32 .dw XT_ICELLPLUS +000ec1 02ae .dw XT_COMMA +000ec2 1c20 .dw XT_EXIT + .include "words/end-code.asm" + + ; Compiler + ; finish a code definition + VE_ENDCODE: +000ec3 ff08 .dw $ff08 +000ec4 6e65 +000ec5 2d64 +000ec6 6f63 +000ec7 6564 .db "end-code" +000ec8 0eb8 .dw VE_HEAD + .set VE_HEAD = VE_ENDCODE + XT_ENDCODE: +000ec9 1c01 .dw DO_COLON + PFA_ENDCODE: +000eca 02a3 .dw XT_COMPILE +000ecb 940c .dw $940c +000ecc 02a3 .dw XT_COMPILE +000ecd 1c05 .dw DO_NEXT +000ece 1c20 .dw XT_EXIT + .include "words/marker.asm" + + ; System Value + ; The eeprom address until which MARKER saves and restores the eeprom data. + VE_MARKER: +000ecf ff08 .dw $ff08 +000ed0 6d28 +000ed1 7261 +000ed2 656b +000ed3 2972 .db "(marker)" +000ed4 0ec3 .dw VE_HEAD + .set VE_HEAD = VE_MARKER + XT_MARKER: +000ed5 1c6f .dw PFA_DOVALUE1 + PFA_MARKER: +000ed6 005e .dw EE_MARKER +000ed7 0c3b .dw XT_EDEFERFETCH +000ed8 0c45 .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: +000ed9 0008 .dw $0008 +000eda 6f70 +000edb 7473 +000edc 6f70 +000edd 656e .db "postpone" +000ede 0ecf .dw VE_HEAD + .set VE_HEAD = VE_POSTPONE + XT_POSTPONE: +000edf 1c01 .dw DO_COLON + PFA_POSTPONE: + .endif +000ee0 0a3b .dw XT_PARSENAME +000ee1 0b60 .dw XT_FORTHRECOGNIZER +000ee2 0b36 .dw XT_RECOGNIZE +000ee3 1cb1 .dw XT_DUP +000ee4 1cff .dw XT_TO_R +000ee5 0c32 .dw XT_ICELLPLUS +000ee6 0c32 .dw XT_ICELLPLUS +000ee7 1fcb .dw XT_FETCHI +000ee8 1c2a .dw XT_EXECUTE +000ee9 1cf6 .dw XT_R_FROM +000eea 0c32 .dw XT_ICELLPLUS +000eeb 1fcb .dw XT_FETCHI +000eec 02ae .dw XT_COMMA +000eed 1c20 .dw XT_EXIT + .endif + .include "words/2r_fetch.asm" + + ; Stack + ; fetch content of TOR + VE_2R_FETCH: +000eee ff03 .dw $ff03 +000eef 7232 +000ef0 0040 .db "2r@",0 +000ef1 0ed9 .dw VE_HEAD + .set VE_HEAD = VE_2R_FETCH + XT_2R_FETCH: +000ef2 0ef3 .dw PFA_2R_FETCH + PFA_2R_FETCH: +000ef3 939a +000ef4 938a savetos +000ef5 91ef pop zl +000ef6 91ff pop zh +000ef7 918f pop tosl +000ef8 919f pop tosh +000ef9 939f push tosh +000efa 938f push tosl +000efb 93ff push zh +000efc 93ef push zl +000efd 939a +000efe 938a savetos +000eff 01cf movw tosl, zl +000f00 940c 1c05 jmp_ DO_NEXT + + .set DPSTART = pc + .if(pc>AMFORTH_RO_SEG) + .endif + + .org AMFORTH_RO_SEG + .include "amforth-interpreter.asm" + + + DO_COLON: +001c01 93bf push XH +001c02 93af push XL ; PUSH IP +001c03 01db movw XL, wl +001c04 9611 adiw xl, 1 + DO_NEXT: + .if WANT_INTERRUPTS == 1 +001c05 14b2 cp isrflag, zerol +001c06 f469 brne DO_INTERRUPT + .endif +001c07 01fd movw zl, XL ; READ IP +001c08 0fee +001c09 1fff +001c0a 9165 +001c0b 9175 readflashcell wl, wh +001c0c 9611 adiw XL, 1 ; INC IP + + DO_EXECUTE: +001c0d 01fb movw zl, wl +001c0e 0fee +001c0f 1fff +001c10 9105 +001c11 9115 readflashcell temp0,temp1 +001c12 01f8 movw zl, temp0 +001c13 9409 ijmp + + .if WANT_INTERRUPTS == 1 + DO_INTERRUPT: + ; here we deal with interrupts the forth way +001c14 939a +001c15 938a savetos +001c16 2d8b mov tosl, isrflag +001c17 2799 clr tosh +001c18 24bb clr isrflag +001c19 e26f ldi wl, LOW(XT_ISREXEC) +001c1a e072 ldi wh, HIGH(XT_ISREXEC) +001c1b cff1 rjmp DO_EXECUTE + .include "dict/nrww.inc" + + ; section together with the forth inner interpreter + + .include "words/exit.asm" + + ; Compiler + ; end of current colon word + VE_EXIT: +001c1c ff04 .dw $ff04 +001c1d 7865 +001c1e 7469 .db "exit" +001c1f 0eee .dw VE_HEAD + .set VE_HEAD = VE_EXIT + XT_EXIT: +001c20 1c21 .dw PFA_EXIT + PFA_EXIT: +001c21 91af pop XL +001c22 91bf pop XH +001c23 cfe1 jmp_ DO_NEXT + .include "words/execute.asm" + + ; System + ; execute XT + VE_EXECUTE: +001c24 ff07 .dw $ff07 +001c25 7865 +001c26 6365 +001c27 7475 +001c28 0065 .db "execute",0 +001c29 1c1c .dw VE_HEAD + .set VE_HEAD = VE_EXECUTE + XT_EXECUTE: +001c2a 1c2b .dw PFA_EXECUTE + PFA_EXECUTE: +001c2b 01bc movw wl, tosl +001c2c 9189 +001c2d 9199 loadtos +001c2e cfde 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: +001c2f 1c30 .dw PFA_DOBRANCH + PFA_DOBRANCH: +001c30 01fd movw zl, XL +001c31 0fee +001c32 1fff +001c33 91a5 +001c34 91b5 readflashcell XL,XH +001c35 cfcf 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: +001c36 1c37 .dw PFA_DOCONDBRANCH + PFA_DOCONDBRANCH: +001c37 2b98 or tosh, tosl +001c38 9189 +001c39 9199 loadtos +001c3a f3a9 brbs 1, PFA_DOBRANCH ; 1 is z flag; if tos is zero (false), do the branch +001c3b 9611 adiw XL, 1 +001c3c cfc8 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: +001c3d 1c3e .dw PFA_DOLITERAL + PFA_DOLITERAL: +001c3e 939a +001c3f 938a savetos +001c40 01fd movw zl, xl +001c41 0fee +001c42 1fff +001c43 9185 +001c44 9195 readflashcell tosl,tosh +001c45 9611 adiw xl, 1 +001c46 cfbe 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: +001c47 1c48 .dw PFA_DOVARIABLE + PFA_DOVARIABLE: +001c48 939a +001c49 938a savetos +001c4a 01fb movw zl, wl +001c4b 9631 adiw zl,1 +001c4c 0fee +001c4d 1fff +001c4e 9185 +001c4f 9195 readflashcell tosl,tosh +001c50 cfb4 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: +001c51 1c52 .dw PFA_DOCONSTANT + PFA_DOCONSTANT: +001c52 939a +001c53 938a savetos +001c54 01cb movw tosl, wl +001c55 9601 adiw tosl, 1 +001c56 cfae 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: +001c57 1c58 .dw PFA_DOUSER + PFA_DOUSER: +001c58 939a +001c59 938a savetos +001c5a 01fb movw zl, wl +001c5b 9631 adiw zl, 1 +001c5c 0fee +001c5d 1fff +001c5e 9185 +001c5f 9195 readflashcell tosl,tosh +001c60 0d84 add tosl, upl +001c61 1d95 adc tosh, uph +001c62 cfa2 jmp_ DO_NEXT + .include "words/do-value.asm" + + ; System + ; runtime of value + VE_DOVALUE: +001c63 ff07 .dw $ff07 +001c64 7628 +001c65 6c61 +001c66 6575 +001c67 0029 .db "(value)", 0 +001c68 1c24 .dw VE_HEAD + .set VE_HEAD = VE_DOVALUE + XT_DOVALUE: +001c69 1c01 .dw DO_COLON + PFA_DOVALUE: +001c6a 0280 .dw XT_DOCREATE +001c6b 03e0 .dw XT_REVEAL +001c6c 02a3 .dw XT_COMPILE +001c6d 1c6f .dw PFA_DOVALUE1 +001c6e 1c20 .dw XT_EXIT + PFA_DOVALUE1: +001c6f 940e 03f9 call_ DO_DODOES +001c71 1cb1 .dw XT_DUP +001c72 0c32 .dw XT_ICELLPLUS +001c73 1fcb .dw XT_FETCHI +001c74 1c2a .dw XT_EXECUTE +001c75 1c20 .dw XT_EXIT + + ; : (value) dup icell+ @i execute ; + .include "words/fetch.asm" + + ; Memory + ; read 1 cell from RAM address + VE_FETCH: +001c76 ff01 .dw $ff01 +001c77 0040 .db "@",0 +001c78 1c63 .dw VE_HEAD + .set VE_HEAD = VE_FETCH + XT_FETCH: +001c79 1c7a .dw PFA_FETCH + PFA_FETCH: + .if WANT_UNIFIED == 1 + .endif + PFA_FETCHRAM: +001c7a 01fc movw zl, tosl + ; low byte is read before the high byte +001c7b 9181 ld tosl, z+ +001c7c 9191 ld tosh, z+ +001c7d cf87 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: +001c7e ff01 .dw $ff01 +001c7f 0021 .db "!",0 +001c80 1c76 .dw VE_HEAD + .set VE_HEAD = VE_STORE + XT_STORE: +001c81 1c82 .dw PFA_STORE + PFA_STORE: + .if WANT_UNIFIED == 1 + .endif + PFA_STORERAM: +001c82 01fc movw zl, tosl +001c83 9189 +001c84 9199 loadtos + ; the high byte is written before the low byte +001c85 8391 std Z+1, tosh +001c86 8380 std Z+0, tosl +001c87 9189 +001c88 9199 loadtos +001c89 cf7b jmp_ DO_NEXT + .if WANT_UNIFIED == 1 + .endif + .include "words/cstore.asm" + + ; Memory + ; store a single byte to RAM address + VE_CSTORE: +001c8a ff02 .dw $ff02 +001c8b 2163 .db "c!" +001c8c 1c7e .dw VE_HEAD + .set VE_HEAD = VE_CSTORE + XT_CSTORE: +001c8d 1c8e .dw PFA_CSTORE + PFA_CSTORE: +001c8e 01fc movw zl, tosl +001c8f 9189 +001c90 9199 loadtos +001c91 8380 st Z, tosl +001c92 9189 +001c93 9199 loadtos +001c94 cf70 jmp_ DO_NEXT + .include "words/cfetch.asm" + + ; Memory + ; fetch a single byte from memory mapped locations + VE_CFETCH: +001c95 ff02 .dw $ff02 +001c96 4063 .db "c@" +001c97 1c8a .dw VE_HEAD + .set VE_HEAD = VE_CFETCH + XT_CFETCH: +001c98 1c99 .dw PFA_CFETCH + PFA_CFETCH: +001c99 01fc movw zl, tosl +001c9a 2799 clr tosh +001c9b 8180 ld tosl, Z +001c9c cf68 jmp_ DO_NEXT + .include "words/fetch-u.asm" + + ; Memory + ; read 1 cell from USER area + VE_FETCHU: +001c9d ff02 .dw $ff02 +001c9e 7540 .db "@u" +001c9f 1c95 .dw VE_HEAD + .set VE_HEAD = VE_FETCHU + XT_FETCHU: +001ca0 1c01 .dw DO_COLON + PFA_FETCHU: +001ca1 1f02 .dw XT_UP_FETCH +001ca2 1d9d .dw XT_PLUS +001ca3 1c79 .dw XT_FETCH +001ca4 1c20 .dw XT_EXIT + .include "words/store-u.asm" + + ; Memory + ; write n to USER area at offset + VE_STOREU: +001ca5 ff02 .dw $ff02 +001ca6 7521 .db "!u" +001ca7 1c9d .dw VE_HEAD + .set VE_HEAD = VE_STOREU + XT_STOREU: +001ca8 1c01 .dw DO_COLON + PFA_STOREU: +001ca9 1f02 .dw XT_UP_FETCH +001caa 1d9d .dw XT_PLUS +001cab 1c81 .dw XT_STORE +001cac 1c20 .dw XT_EXIT + + ;;;;;;;;;;;;;;;;;;;;;;;;; + .include "words/dup.asm" + + ; Stack + ; duplicate TOS + VE_DUP: +001cad ff03 .dw $ff03 +001cae 7564 +001caf 0070 .db "dup",0 +001cb0 1ca5 .dw VE_HEAD + .set VE_HEAD = VE_DUP + XT_DUP: +001cb1 1cb2 .dw PFA_DUP + PFA_DUP: +001cb2 939a +001cb3 938a savetos +001cb4 cf50 jmp_ DO_NEXT + .include "words/qdup.asm" + + ; Stack + ; duplicate TOS if non-zero + VE_QDUP: +001cb5 ff04 .dw $ff04 +001cb6 643f +001cb7 7075 .db "?dup" +001cb8 1cad .dw VE_HEAD + .set VE_HEAD = VE_QDUP + XT_QDUP: +001cb9 1cba .dw PFA_QDUP + PFA_QDUP: +001cba 2f08 mov temp0, tosl +001cbb 2b09 or temp0, tosh +001cbc f011 breq PFA_QDUP1 +001cbd 939a +001cbe 938a savetos + PFA_QDUP1: +001cbf cf45 jmp_ DO_NEXT + .include "words/swap.asm" + + ; Stack + ; swaps the two top level stack cells + VE_SWAP: +001cc0 ff04 .dw $ff04 +001cc1 7773 +001cc2 7061 .db "swap" +001cc3 1cb5 .dw VE_HEAD + .set VE_HEAD = VE_SWAP + XT_SWAP: +001cc4 1cc5 .dw PFA_SWAP + PFA_SWAP: +001cc5 018c movw temp0, tosl +001cc6 9189 +001cc7 9199 loadtos +001cc8 931a st -Y, temp1 +001cc9 930a st -Y, temp0 +001cca cf3a jmp_ DO_NEXT + .include "words/over.asm" + + ; Stack + ; Place a copy of x1 on top of the stack + VE_OVER: +001ccb ff04 .dw $ff04 +001ccc 766f +001ccd 7265 .db "over" +001cce 1cc0 .dw VE_HEAD + .set VE_HEAD = VE_OVER + XT_OVER: +001ccf 1cd0 .dw PFA_OVER + PFA_OVER: +001cd0 939a +001cd1 938a savetos +001cd2 818a ldd tosl, Y+2 +001cd3 819b ldd tosh, Y+3 + +001cd4 cf30 jmp_ DO_NEXT + .include "words/drop.asm" + + ; Stack + ; drop TOS + VE_DROP: +001cd5 ff04 .dw $ff04 +001cd6 7264 +001cd7 706f .db "drop" +001cd8 1ccb .dw VE_HEAD + .set VE_HEAD = VE_DROP + XT_DROP: +001cd9 1cda .dw PFA_DROP + PFA_DROP: +001cda 9189 +001cdb 9199 loadtos +001cdc cf28 jmp_ DO_NEXT + .include "words/rot.asm" + + ; Stack + ; rotate the three top level cells + VE_ROT: +001cdd ff03 .dw $ff03 +001cde 6f72 +001cdf 0074 .db "rot",0 +001ce0 1cd5 .dw VE_HEAD + .set VE_HEAD = VE_ROT + XT_ROT: +001ce1 1ce2 .dw PFA_ROT + PFA_ROT: +001ce2 018c movw temp0, tosl +001ce3 9129 ld temp2, Y+ +001ce4 9139 ld temp3, Y+ +001ce5 9189 +001ce6 9199 loadtos + +001ce7 933a st -Y, temp3 +001ce8 932a st -Y, temp2 +001ce9 931a st -Y, temp1 +001cea 930a st -Y, temp0 + +001ceb cf19 jmp_ DO_NEXT + .include "words/nip.asm" + + ; Stack + ; Remove Second of Stack + VE_NIP: +001cec ff03 .dw $ff03 +001ced 696e +001cee 0070 .db "nip",0 +001cef 1cdd .dw VE_HEAD + .set VE_HEAD = VE_NIP + XT_NIP: +001cf0 1cf1 .dw PFA_NIP + PFA_NIP: +001cf1 9622 adiw yl, 2 +001cf2 cf12 jmp_ DO_NEXT + ;;;;;;;;;;;;;;;;;;;;;;;;; + .include "words/r_from.asm" + + ; Stack + ; move TOR to TOS + VE_R_FROM: +001cf3 ff02 .dw $ff02 +001cf4 3e72 .db "r>" +001cf5 1cec .dw VE_HEAD + .set VE_HEAD = VE_R_FROM + XT_R_FROM: +001cf6 1cf7 .dw PFA_R_FROM + PFA_R_FROM: +001cf7 939a +001cf8 938a savetos +001cf9 918f pop tosl +001cfa 919f pop tosh +001cfb cf09 jmp_ DO_NEXT + .include "words/to_r.asm" + + ; Stack + ; move TOS to TOR + VE_TO_R: +001cfc ff02 .dw $ff02 +001cfd 723e .db ">r" +001cfe 1cf3 .dw VE_HEAD + .set VE_HEAD = VE_TO_R + XT_TO_R: +001cff 1d00 .dw PFA_TO_R + PFA_TO_R: +001d00 939f push tosh +001d01 938f push tosl +001d02 9189 +001d03 9199 loadtos +001d04 cf00 jmp_ DO_NEXT + .include "words/r_fetch.asm" + + ; Stack + ; fetch content of TOR + VE_R_FETCH: +001d05 ff02 .dw $ff02 +001d06 4072 .db "r@" +001d07 1cfc .dw VE_HEAD + .set VE_HEAD = VE_R_FETCH + XT_R_FETCH: +001d08 1d09 .dw PFA_R_FETCH + PFA_R_FETCH: +001d09 939a +001d0a 938a savetos +001d0b 918f pop tosl +001d0c 919f pop tosh +001d0d 939f push tosh +001d0e 938f push tosl +001d0f cef5 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: +001d10 ff02 .dw $ff02 +001d11 3e3c .db "<>" +001d12 1d05 .dw VE_HEAD + .set VE_HEAD = VE_NOTEQUAL + XT_NOTEQUAL: +001d13 1c01 .dw DO_COLON + PFA_NOTEQUAL: + .endif + +001d14 1fe0 +001d15 1d1a +001d16 1c20 .DW XT_EQUAL,XT_ZEROEQUAL,XT_EXIT + .include "words/equalzero.asm" + + ; Compare + ; compare with 0 (zero) + VE_ZEROEQUAL: +001d17 ff02 .dw $ff02 +001d18 3d30 .db "0=" +001d19 1d10 .dw VE_HEAD + .set VE_HEAD = VE_ZEROEQUAL + XT_ZEROEQUAL: +001d1a 1d1b .dw PFA_ZEROEQUAL + PFA_ZEROEQUAL: +001d1b 2b98 or tosh, tosl +001d1c f5d1 brne PFA_ZERO1 +001d1d c030 rjmp PFA_TRUE1 + .include "words/lesszero.asm" + + ; Compare + ; compare with zero + VE_ZEROLESS: +001d1e ff02 .dw $ff02 +001d1f 3c30 .db "0<" +001d20 1d17 .dw VE_HEAD + .set VE_HEAD = VE_ZEROLESS + XT_ZEROLESS: +001d21 1d22 .dw PFA_ZEROLESS + PFA_ZEROLESS: +001d22 fd97 sbrc tosh,7 +001d23 c02a rjmp PFA_TRUE1 +001d24 c032 rjmp PFA_ZERO1 + .include "words/greaterzero.asm" + + ; Compare + ; true if n1 is greater than 0 + VE_GREATERZERO: +001d25 ff02 .dw $ff02 +001d26 3e30 .db "0>" +001d27 1d1e .dw VE_HEAD + .set VE_HEAD = VE_GREATERZERO + XT_GREATERZERO: +001d28 1d29 .dw PFA_GREATERZERO + PFA_GREATERZERO: +001d29 1582 cp tosl, zerol +001d2a 0593 cpc tosh, zeroh +001d2b f15c brlt PFA_ZERO1 +001d2c f151 brbs 1, PFA_ZERO1 +001d2d c020 rjmp PFA_TRUE1 + .include "words/d-greaterzero.asm" + + ; Compare + ; compares if a double double cell number is greater 0 + VE_DGREATERZERO: +001d2e ff03 .dw $ff03 +001d2f 3064 +001d30 003e .db "d0>",0 +001d31 1d25 .dw VE_HEAD + .set VE_HEAD = VE_DGREATERZERO + XT_DGREATERZERO: +001d32 1d33 .dw PFA_DGREATERZERO + PFA_DGREATERZERO: +001d33 1582 cp tosl, zerol +001d34 0593 cpc tosh, zeroh +001d35 9189 +001d36 9199 loadtos +001d37 0582 cpc tosl, zerol +001d38 0593 cpc tosh, zeroh +001d39 f0ec brlt PFA_ZERO1 +001d3a f0e1 brbs 1, PFA_ZERO1 +001d3b c012 rjmp PFA_TRUE1 + .include "words/d-lesszero.asm" + + ; Compare + ; compares if a double double cell number is less than 0 + VE_DXT_ZEROLESS: +001d3c ff03 .dw $ff03 +001d3d 3064 +001d3e 003c .db "d0<",0 +001d3f 1d2e .dw VE_HEAD + .set VE_HEAD = VE_DXT_ZEROLESS + XT_DXT_ZEROLESS: +001d40 1d41 .dw PFA_DXT_ZEROLESS + PFA_DXT_ZEROLESS: +001d41 9622 adiw Y,2 +001d42 fd97 sbrc tosh,7 +001d43 940c 1d4e jmp PFA_TRUE1 +001d45 940c 1d57 jmp PFA_ZERO1 + + .include "words/true.asm" + + ; Arithmetics + ; leaves the value -1 (true) on TOS + VE_TRUE: +001d47 ff04 .dw $ff04 +001d48 7274 +001d49 6575 .db "true" +001d4a 1d3c .dw VE_HEAD + .set VE_HEAD = VE_TRUE + XT_TRUE: +001d4b 1d4c .dw PFA_TRUE + PFA_TRUE: +001d4c 939a +001d4d 938a savetos + PFA_TRUE1: +001d4e ef8f ser tosl +001d4f ef9f ser tosh +001d50 ceb4 jmp_ DO_NEXT + .include "words/zero.asm" + + ; Arithmetics + ; place a value 0 on TOS + VE_ZERO: +001d51 ff01 .dw $ff01 +001d52 0030 .db "0",0 +001d53 1d47 .dw VE_HEAD + .set VE_HEAD = VE_ZERO + XT_ZERO: +001d54 1d55 .dw PFA_ZERO + PFA_ZERO: +001d55 939a +001d56 938a savetos + PFA_ZERO1: +001d57 01c1 movw tosl, zerol +001d58 ceac jmp_ DO_NEXT + .include "words/uless.asm" + + ; Compare + ; true if u1 < u2 (unsigned) + VE_ULESS: +001d59 ff02 .dw $ff02 +001d5a 3c75 .db "u<" +001d5b 1d51 .dw VE_HEAD + .set VE_HEAD = VE_ULESS + XT_ULESS: +001d5c 1d5d .dw PFA_ULESS + PFA_ULESS: +001d5d 9129 ld temp2, Y+ +001d5e 9139 ld temp3, Y+ +001d5f 1782 cp tosl, temp2 +001d60 0793 cpc tosh, temp3 +001d61 f3a8 brlo PFA_ZERO1 +001d62 f3a1 brbs 1, PFA_ZERO1 +001d63 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: +001d64 ff02 .dw $ff02 +001d65 3e75 .db "u>" +001d66 1d59 .dw VE_HEAD + .set VE_HEAD = VE_UGREATER + XT_UGREATER: +001d67 1c01 .dw DO_COLON + PFA_UGREATER: + .endif +001d68 1cc4 .DW XT_SWAP +001d69 1d5c .dw XT_ULESS +001d6a 1c20 .dw XT_EXIT + .include "words/less.asm" + + ; Compare + ; true if n1 is less than n2 + VE_LESS: +001d6b ff01 .dw $ff01 +001d6c 003c .db "<",0 +001d6d 1d64 .dw VE_HEAD + .set VE_HEAD = VE_LESS + XT_LESS: +001d6e 1d6f .dw PFA_LESS + PFA_LESS: +001d6f 9129 ld temp2, Y+ +001d70 9139 ld temp3, Y+ +001d71 1728 cp temp2, tosl +001d72 0739 cpc temp3, tosh + PFA_LESSDONE: +001d73 f71c brge PFA_ZERO1 +001d74 cfd9 rjmp PFA_TRUE1 + .include "words/greater.asm" + + ; Compare + ; flag is true if n1 is greater than n2 + VE_GREATER: +001d75 ff01 .dw $ff01 +001d76 003e .db ">",0 +001d77 1d6b .dw VE_HEAD + .set VE_HEAD = VE_GREATER + XT_GREATER: +001d78 1d79 .dw PFA_GREATER + PFA_GREATER: +001d79 9129 ld temp2, Y+ +001d7a 9139 ld temp3, Y+ +001d7b 1728 cp temp2, tosl +001d7c 0739 cpc temp3, tosh + PFA_GREATERDONE: +001d7d f2cc brlt PFA_ZERO1 +001d7e f2c1 brbs 1, PFA_ZERO1 +001d7f cfce rjmp PFA_TRUE1 + + .include "words/log2.asm" + + ; Arithmetics + ; logarithm to base 2 or highest set bitnumber + VE_LOG2: +001d80 ff04 .dw $ff04 +001d81 6f6c +001d82 3267 .db "log2" +001d83 1d75 .dw VE_HEAD + .set VE_HEAD = VE_LOG2 + XT_LOG2: +001d84 1d85 .dw PFA_LOG2 + PFA_LOG2: +001d85 01fc movw zl, tosl +001d86 2799 clr tosh +001d87 e180 ldi tosl, 16 + PFA_LOG2_1: +001d88 958a dec tosl +001d89 f022 brmi PFA_LOG2_2 ; wrong data +001d8a 0fee lsl zl +001d8b 1fff rol zh +001d8c f7d8 brcc PFA_LOG2_1 +001d8d ce77 jmp_ DO_NEXT + + PFA_LOG2_2: +001d8e 959a dec tosh +001d8f ce75 jmp_ DO_NEXT + .include "words/minus.asm" + + ; Arithmetics + ; subtract n2 from n1 + VE_MINUS: +001d90 ff01 .dw $ff01 +001d91 002d .db "-",0 +001d92 1d80 .dw VE_HEAD + .set VE_HEAD = VE_MINUS + XT_MINUS: +001d93 1d94 .dw PFA_MINUS + PFA_MINUS: +001d94 9109 ld temp0, Y+ +001d95 9119 ld temp1, Y+ +001d96 1b08 sub temp0, tosl +001d97 0b19 sbc temp1, tosh +001d98 01c8 movw tosl, temp0 +001d99 ce6b jmp_ DO_NEXT + .include "words/plus.asm" + + ; Arithmetics + ; add n1 and n2 + VE_PLUS: +001d9a ff01 .dw $ff01 +001d9b 002b .db "+",0 +001d9c 1d90 .dw VE_HEAD + .set VE_HEAD = VE_PLUS + XT_PLUS: +001d9d 1d9e .dw PFA_PLUS + PFA_PLUS: +001d9e 9109 ld temp0, Y+ +001d9f 9119 ld temp1, Y+ +001da0 0f80 add tosl, temp0 +001da1 1f91 adc tosh, temp1 +001da2 ce62 jmp_ DO_NEXT + .include "words/mstar.asm" + + ; Arithmetics + ; multiply 2 cells to a double cell + VE_MSTAR: +001da3 ff02 .dw $ff02 +001da4 2a6d .db "m*" +001da5 1d9a .dw VE_HEAD + .set VE_HEAD = VE_MSTAR + XT_MSTAR: +001da6 1da7 .dw PFA_MSTAR + PFA_MSTAR: +001da7 018c movw temp0, tosl +001da8 9189 +001da9 9199 loadtos +001daa 019c movw temp2, tosl + ; high cell ah*bh +001dab 0231 muls temp3, temp1 +001dac 0170 movw temp4, r0 + ; low cell al*bl +001dad 9f20 mul temp2, temp0 +001dae 01c0 movw tosl, r0 + ; signed ah*bl +001daf 0330 mulsu temp3, temp0 +001db0 08f3 sbc temp5, zeroh +001db1 0d90 add tosh, r0 +001db2 1ce1 adc temp4, r1 +001db3 1cf3 adc temp5, zeroh + + ; signed al*bh +001db4 0312 mulsu temp1, temp2 +001db5 08f3 sbc temp5, zeroh +001db6 0d90 add tosh, r0 +001db7 1ce1 adc temp4, r1 +001db8 1cf3 adc temp5, zeroh + +001db9 939a +001dba 938a savetos +001dbb 01c7 movw tosl, temp4 +001dbc ce48 jmp_ DO_NEXT + .include "words/umslashmod.asm" + + ; Arithmetics + ; unsigned division ud / u2 with remainder + VE_UMSLASHMOD: +001dbd ff06 .dw $ff06 +001dbe 6d75 +001dbf 6d2f +001dc0 646f .db "um/mod" +001dc1 1da3 .dw VE_HEAD + .set VE_HEAD = VE_UMSLASHMOD + XT_UMSLASHMOD: +001dc2 1dc3 .dw PFA_UMSLASHMOD + PFA_UMSLASHMOD: +001dc3 017c movw temp4, tosl + +001dc4 9129 ld temp2, Y+ +001dc5 9139 ld temp3, Y+ + +001dc6 9109 ld temp0, Y+ +001dc7 9119 ld temp1, Y+ + + ;; unsigned 32/16 -> 16r16 divide + + PFA_UMSLASHMODmod: + + ; set loop counter +001dc8 e140 ldi temp6,$10 + + PFA_UMSLASHMODmod_loop: + ; shift left, saving high bit +001dc9 2755 clr temp7 +001dca 0f00 lsl temp0 +001dcb 1f11 rol temp1 +001dcc 1f22 rol temp2 +001dcd 1f33 rol temp3 +001dce 1f55 rol temp7 + + ; try subtracting divisor +001dcf 152e cp temp2, temp4 +001dd0 053f cpc temp3, temp5 +001dd1 0552 cpc temp7,zerol + +001dd2 f018 brcs PFA_UMSLASHMODmod_loop_control + + PFA_UMSLASHMODmod_subtract: + ; dividend is large enough + ; do the subtraction for real + ; and set lowest bit +001dd3 9503 inc temp0 +001dd4 192e sub temp2, temp4 +001dd5 093f sbc temp3, temp5 + + PFA_UMSLASHMODmod_loop_control: +001dd6 954a dec temp6 +001dd7 f789 brne PFA_UMSLASHMODmod_loop + + PFA_UMSLASHMODmod_done: + ; put remainder on stack +001dd8 933a st -Y,temp3 +001dd9 932a st -Y,temp2 + + ; put quotient on stack +001dda 01c8 movw tosl, temp0 +001ddb ce29 jmp_ DO_NEXT + .include "words/umstar.asm" + + ; Arithmetics + ; multiply 2 unsigned cells to a double cell + VE_UMSTAR: +001ddc ff03 .dw $ff03 +001ddd 6d75 +001dde 002a .db "um*",0 +001ddf 1dbd .dw VE_HEAD + .set VE_HEAD = VE_UMSTAR + XT_UMSTAR: +001de0 1de1 .dw PFA_UMSTAR + PFA_UMSTAR: +001de1 018c movw temp0, tosl +001de2 9189 +001de3 9199 loadtos + ; result: (temp3*temp1)* 65536 + (temp3*temp0 + temp1*temp2) * 256 + (temp0 * temp2) + ; low bytes +001de4 9f80 mul tosl,temp0 +001de5 01f0 movw zl, r0 +001de6 2722 clr temp2 +001de7 2733 clr temp3 + ; middle bytes +001de8 9f90 mul tosh, temp0 +001de9 0df0 add zh, r0 +001dea 1d21 adc temp2, r1 +001deb 1d33 adc temp3, zeroh + +001dec 9f81 mul tosl, temp1 +001ded 0df0 add zh, r0 +001dee 1d21 adc temp2, r1 +001def 1d33 adc temp3, zeroh + +001df0 9f91 mul tosh, temp1 +001df1 0d20 add temp2, r0 +001df2 1d31 adc temp3, r1 +001df3 01cf movw tosl, zl +001df4 939a +001df5 938a savetos +001df6 01c9 movw tosl, temp2 +001df7 ce0d jmp_ DO_NEXT + + .include "words/invert.asm" + + ; Arithmetics + ; 1-complement of TOS + VE_INVERT: +001df8 ff06 .dw $ff06 +001df9 6e69 +001dfa 6576 +001dfb 7472 .db "invert" +001dfc 1ddc .dw VE_HEAD + .set VE_HEAD = VE_INVERT + XT_INVERT: +001dfd 1dfe .dw PFA_INVERT + PFA_INVERT: +001dfe 9580 com tosl +001dff 9590 com tosh +001e00 ce04 jmp_ DO_NEXT + .include "words/2slash.asm" + + ; Arithmetics + ; arithmetic shift right + VE_2SLASH: +001e01 ff02 .dw $ff02 +001e02 2f32 .db "2/" +001e03 1df8 .dw VE_HEAD + .set VE_HEAD = VE_2SLASH + XT_2SLASH: +001e04 1e05 .dw PFA_2SLASH + PFA_2SLASH: +001e05 9595 asr tosh +001e06 9587 ror tosl +001e07 cdfd jmp_ DO_NEXT + .include "words/2star.asm" + + ; Arithmetics + ; arithmetic shift left, filling with zero + VE_2STAR: +001e08 ff02 .dw $ff02 +001e09 2a32 .db "2*" +001e0a 1e01 .dw VE_HEAD + .set VE_HEAD = VE_2STAR + XT_2STAR: +001e0b 1e0c .dw PFA_2STAR + PFA_2STAR: +001e0c 0f88 lsl tosl +001e0d 1f99 rol tosh +001e0e cdf6 jmp_ DO_NEXT + .include "words/and.asm" + + ; Logic + ; bitwise and + VE_AND: +001e0f ff03 .dw $ff03 +001e10 6e61 +001e11 0064 .db "and",0 +001e12 1e08 .dw VE_HEAD + .set VE_HEAD = VE_AND + XT_AND: +001e13 1e14 .dw PFA_AND + PFA_AND: +001e14 9109 ld temp0, Y+ +001e15 9119 ld temp1, Y+ +001e16 2380 and tosl, temp0 +001e17 2391 and tosh, temp1 +001e18 cdec jmp_ DO_NEXT + .include "words/or.asm" + + ; Logic + ; logical or + VE_OR: +001e19 ff02 .dw $ff02 +001e1a 726f .db "or" +001e1b 1e0f .dw VE_HEAD + .set VE_HEAD = VE_OR + XT_OR: +001e1c 1e1d .dw PFA_OR + PFA_OR: +001e1d 9109 ld temp0, Y+ +001e1e 9119 ld temp1, Y+ +001e1f 2b80 or tosl, temp0 +001e20 2b91 or tosh, temp1 +001e21 cde3 jmp_ DO_NEXT + + .include "words/xor.asm" + + ; Logic + ; exclusive or + VE_XOR: +001e22 ff03 .dw $ff03 +001e23 6f78 +001e24 0072 .db "xor",0 +001e25 1e19 .dw VE_HEAD + .set VE_HEAD = VE_XOR + XT_XOR: +001e26 1e27 .dw PFA_XOR + PFA_XOR: +001e27 9109 ld temp0, Y+ +001e28 9119 ld temp1, Y+ +001e29 2780 eor tosl, temp0 +001e2a 2791 eor tosh, temp1 +001e2b cdd9 jmp_ DO_NEXT + + .include "words/1plus.asm" + + ; Arithmetics + ; optimized increment + VE_1PLUS: +001e2c ff02 .dw $ff02 +001e2d 2b31 .db "1+" +001e2e 1e22 .dw VE_HEAD + .set VE_HEAD = VE_1PLUS + XT_1PLUS: +001e2f 1e30 .dw PFA_1PLUS + PFA_1PLUS: +001e30 9601 adiw tosl,1 +001e31 cdd3 jmp_ DO_NEXT + .include "words/1minus.asm" + + ; Arithmetics + ; optimized decrement + VE_1MINUS: +001e32 ff02 .dw $ff02 +001e33 2d31 .db "1-" +001e34 1e2c .dw VE_HEAD + .set VE_HEAD = VE_1MINUS + XT_1MINUS: +001e35 1e36 .dw PFA_1MINUS + PFA_1MINUS: +001e36 9701 sbiw tosl, 1 +001e37 cdcd 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: +001e38 ff07 .dw $ff07 +001e39 6e3f +001e3a 6765 +001e3b 7461 +../../common\words/q-negate.asm(11): warning: .cseg .db misalignment - padding zero byte +001e3c 0065 .db "?negate" +001e3d 1e32 .dw VE_HEAD + .set VE_HEAD = VE_QNEGATE + XT_QNEGATE: +001e3e 1c01 .dw DO_COLON + PFA_QNEGATE: + + .endif +001e3f 1d21 +001e40 1c36 .DW XT_ZEROLESS,XT_DOCONDBRANCH +001e41 1e43 DEST(QNEG1) +001e42 06c6 .DW XT_NEGATE +001e43 1c20 QNEG1: .DW XT_EXIT + .include "words/lshift.asm" + + ; Arithmetics + ; logically shift n1 left n2 times + VE_LSHIFT: +001e44 ff06 .dw $ff06 +001e45 736c +001e46 6968 +001e47 7466 .db "lshift" +001e48 1e38 .dw VE_HEAD + .set VE_HEAD = VE_LSHIFT + XT_LSHIFT: +001e49 1e4a .dw PFA_LSHIFT + PFA_LSHIFT: +001e4a 01fc movw zl, tosl +001e4b 9189 +001e4c 9199 loadtos + PFA_LSHIFT1: +001e4d 9731 sbiw zl, 1 +001e4e f01a brmi PFA_LSHIFT2 +001e4f 0f88 lsl tosl +001e50 1f99 rol tosh +001e51 cffb rjmp PFA_LSHIFT1 + PFA_LSHIFT2: +001e52 cdb2 jmp_ DO_NEXT + + .include "words/rshift.asm" + + ; Arithmetics + ; shift n1 n2-times logically right + VE_RSHIFT: +001e53 ff06 .dw $ff06 +001e54 7372 +001e55 6968 +001e56 7466 .db "rshift" +001e57 1e44 .dw VE_HEAD + .set VE_HEAD = VE_RSHIFT + XT_RSHIFT: +001e58 1e59 .dw PFA_RSHIFT + PFA_RSHIFT: +001e59 01fc movw zl, tosl +001e5a 9189 +001e5b 9199 loadtos + PFA_RSHIFT1: +001e5c 9731 sbiw zl, 1 +001e5d f01a brmi PFA_RSHIFT2 +001e5e 9596 lsr tosh +001e5f 9587 ror tosl +001e60 cffb rjmp PFA_RSHIFT1 + PFA_RSHIFT2: +001e61 cda3 jmp_ DO_NEXT + + .include "words/plusstore.asm" + + ; Arithmetics + ; add n to content of RAM address a-addr + VE_PLUSSTORE: +001e62 ff02 .dw $ff02 +001e63 212b .db "+!" +001e64 1e53 .dw VE_HEAD + .set VE_HEAD = VE_PLUSSTORE + XT_PLUSSTORE: +001e65 1e66 .dw PFA_PLUSSTORE + PFA_PLUSSTORE: +001e66 01fc movw zl, tosl +001e67 9189 +001e68 9199 loadtos +001e69 8120 ldd temp2, Z+0 +001e6a 8131 ldd temp3, Z+1 +001e6b 0f82 add tosl, temp2 +001e6c 1f93 adc tosh, temp3 +001e6d 8380 std Z+0, tosl +001e6e 8391 std Z+1, tosh +001e6f 9189 +001e70 9199 loadtos +001e71 cd93 jmp_ DO_NEXT + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + .include "words/rpfetch.asm" + + ; Stack + ; current return stack pointer address + VE_RP_FETCH: +001e72 ff03 .dw $ff03 +001e73 7072 +001e74 0040 .db "rp@",0 +001e75 1e62 .dw VE_HEAD + .set VE_HEAD = VE_RP_FETCH + XT_RP_FETCH: +001e76 1e77 .dw PFA_RP_FETCH + PFA_RP_FETCH: +001e77 939a +001e78 938a savetos +001e79 b78d in tosl, SPL +001e7a b79e in tosh, SPH +001e7b cd89 jmp_ DO_NEXT + .include "words/rpstore.asm" + + ; Stack + ; set return stack pointer + VE_RP_STORE: +001e7c ff03 .dw $ff03 +001e7d 7072 +001e7e 0021 .db "rp!",0 +001e7f 1e72 .dw VE_HEAD + .set VE_HEAD = VE_RP_STORE + XT_RP_STORE: +001e80 1e81 .dw PFA_RP_STORE + PFA_RP_STORE: +001e81 b72f in temp2, SREG +001e82 94f8 cli +001e83 bf8d out SPL, tosl +001e84 bf9e out SPH, tosh +001e85 bf2f out SREG, temp2 +001e86 9189 +001e87 9199 loadtos +001e88 cd7c jmp_ DO_NEXT + .include "words/spfetch.asm" + + ; Stack + ; current data stack pointer + VE_SP_FETCH: +001e89 ff03 .dw $ff03 +001e8a 7073 +001e8b 0040 .db "sp@",0 +001e8c 1e7c .dw VE_HEAD + .set VE_HEAD = VE_SP_FETCH + XT_SP_FETCH: +001e8d 1e8e .dw PFA_SP_FETCH + PFA_SP_FETCH: +001e8e 939a +001e8f 938a savetos +001e90 01ce movw tosl, yl +001e91 cd73 jmp_ DO_NEXT + .include "words/spstore.asm" + + ; Stack + ; set data stack pointer to addr + VE_SP_STORE: +001e92 ff03 .dw $ff03 +001e93 7073 +001e94 0021 .db "sp!",0 +001e95 1e89 .dw VE_HEAD + .set VE_HEAD = VE_SP_STORE + XT_SP_STORE: +001e96 1e97 .dw PFA_SP_STORE + PFA_SP_STORE: +001e97 01ec movw yl, tosl +001e98 9189 +001e99 9199 loadtos +001e9a cd6a 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: +001e9b 1e9c .dw PFA_DODO + PFA_DODO: +001e9c 9129 ld temp2, Y+ +001e9d 9139 ld temp3, Y+ ; limit + PFA_DODO1: +001e9e e8e0 ldi zl, $80 +001e9f 0f3e add temp3, zl +001ea0 1b82 sub tosl, temp2 +001ea1 0b93 sbc tosh, temp3 + +001ea2 933f push temp3 +001ea3 932f push temp2 ; limit ( --> limit + $8000) +001ea4 939f push tosh +001ea5 938f push tosl ; start -> index ( --> index - (limit - $8000) +001ea6 9189 +001ea7 9199 loadtos +001ea8 cd5c jmp_ DO_NEXT + .include "words/i.asm" + + ; Compiler + ; current loop counter + VE_I: +001ea9 ff01 .dw $FF01 +001eaa 0069 .db "i",0 +001eab 1e92 .dw VE_HEAD + .set VE_HEAD = VE_I + XT_I: +001eac 1ead .dw PFA_I + PFA_I: +001ead 939a +001eae 938a savetos +001eaf 918f pop tosl +001eb0 919f pop tosh ; index +001eb1 91ef pop zl +001eb2 91ff pop zh ; limit +001eb3 93ff push zh +001eb4 93ef push zl +001eb5 939f push tosh +001eb6 938f push tosl +001eb7 0f8e add tosl, zl +001eb8 1f9f adc tosh, zh +001eb9 cd4b 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: +001eba 1ebb .dw PFA_DOPLUSLOOP + PFA_DOPLUSLOOP: +001ebb 91ef pop zl +001ebc 91ff pop zh +001ebd 0fe8 add zl, tosl +001ebe 1ff9 adc zh, tosh +001ebf 9189 +001ec0 9199 loadtos +001ec1 f01b brvs PFA_DOPLUSLOOP_LEAVE + ; next cycle + PFA_DOPLUSLOOP_NEXT: + ; next iteration +001ec2 93ff push zh +001ec3 93ef push zl +001ec4 cd6b rjmp PFA_DOBRANCH ; read next cell from dictionary and jump to its destination + PFA_DOPLUSLOOP_LEAVE: +001ec5 910f pop temp0 +001ec6 911f pop temp1 ; remove limit +001ec7 9611 adiw xl, 1 ; skip branch-back address +001ec8 cd3c 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: +001ec9 1eca .dw PFA_DOLOOP + PFA_DOLOOP: +001eca 91ef pop zl +001ecb 91ff pop zh +001ecc 9631 adiw zl,1 +001ecd f3bb brvs PFA_DOPLUSLOOP_LEAVE +001ece cff3 jmp_ PFA_DOPLUSLOOP_NEXT + .include "words/unloop.asm" + + ; Compiler + ; remove loop-sys, exit the loop and continue execution after it + VE_UNLOOP: +001ecf ff06 .dw $ff06 +001ed0 6e75 +001ed1 6f6c +001ed2 706f .db "unloop" +001ed3 1ea9 .dw VE_HEAD + .set VE_HEAD = VE_UNLOOP + XT_UNLOOP: +001ed4 1ed5 .dw PFA_UNLOOP + PFA_UNLOOP: +001ed5 911f pop temp1 +001ed6 910f pop temp0 +001ed7 911f pop temp1 +001ed8 910f pop temp0 +001ed9 cd2b jmp_ DO_NEXT + + ;;;;;;;;;;;;;;;;;;;;;;;;;;; + + .include "words/cmove_g.asm" + + ; Memory + ; copy data in RAM from higher to lower addresses. + VE_CMOVE_G: +001eda ff06 .dw $ff06 +001edb 6d63 +001edc 766f +001edd 3e65 .db "cmove>" +001ede 1ecf .dw VE_HEAD + .set VE_HEAD = VE_CMOVE_G + XT_CMOVE_G: +001edf 1ee0 .dw PFA_CMOVE_G + PFA_CMOVE_G: +001ee0 93bf push xh +001ee1 93af push xl +001ee2 91e9 ld zl, Y+ +001ee3 91f9 ld zh, Y+ ; addr-to +001ee4 91a9 ld xl, Y+ +001ee5 91b9 ld xh, Y+ ; addr-from +001ee6 2f09 mov temp0, tosh +001ee7 2b08 or temp0, tosl +001ee8 f041 brbs 1, PFA_CMOVE_G1 +001ee9 0fe8 add zl, tosl +001eea 1ff9 adc zh, tosh +001eeb 0fa8 add xl, tosl +001eec 1fb9 adc xh, tosh + PFA_CMOVE_G2: +001eed 911e ld temp1, -X +001eee 9312 st -Z, temp1 +001eef 9701 sbiw tosl, 1 +001ef0 f7e1 brbc 1, PFA_CMOVE_G2 + PFA_CMOVE_G1: +001ef1 91af pop xl +001ef2 91bf pop xh +001ef3 9189 +001ef4 9199 loadtos +001ef5 cd0f jmp_ DO_NEXT + .include "words/byteswap.asm" + + ; Arithmetics + ; exchange the bytes of the TOS + VE_BYTESWAP: +001ef6 ff02 .dw $ff02 +001ef7 3c3e .db "><" +001ef8 1eda .dw VE_HEAD + .set VE_HEAD = VE_BYTESWAP + XT_BYTESWAP: +001ef9 1efa .dw PFA_BYTESWAP + PFA_BYTESWAP: +001efa 2f09 mov temp0, tosh +001efb 2f98 mov tosh, tosl +001efc 2f80 mov tosl, temp0 +001efd cd07 jmp_ DO_NEXT + .include "words/up.asm" + + ; System Variable + ; get user area pointer + VE_UP_FETCH: +001efe ff03 .dw $ff03 +001eff 7075 +001f00 0040 .db "up@",0 +001f01 1ef6 .dw VE_HEAD + .set VE_HEAD = VE_UP_FETCH + XT_UP_FETCH: +001f02 1f03 .dw PFA_UP_FETCH + PFA_UP_FETCH: +001f03 939a +001f04 938a savetos +001f05 01c2 movw tosl, upl +001f06 ccfe jmp_ DO_NEXT + + ; ( addr -- ) + ; System Variable + ; set user area pointer + VE_UP_STORE: +001f07 ff03 .dw $ff03 +001f08 7075 +001f09 0021 .db "up!",0 +001f0a 1efe .dw VE_HEAD + .set VE_HEAD = VE_UP_STORE + XT_UP_STORE: +001f0b 1f0c .dw PFA_UP_STORE + PFA_UP_STORE: +001f0c 012c movw upl, tosl +001f0d 9189 +001f0e 9199 loadtos +001f0f ccf5 jmp_ DO_NEXT + .include "words/1ms.asm" + + ; Time + ; busy waits (almost) exactly 1 millisecond + VE_1MS: +001f10 ff03 .dw $ff03 +001f11 6d31 +001f12 0073 .db "1ms",0 +001f13 1f07 .dw VE_HEAD + .set VE_HEAD = VE_1MS + XT_1MS: +001f14 1f15 .dw PFA_1MS + PFA_1MS: +001f15 ede0 +001f16 e0f7 +001f17 9731 +001f18 f7f1 delay 1000 +001f19 cceb jmp_ DO_NEXT + .include "words/2to_r.asm" + + ; Stack + ; move DTOS to TOR + VE_2TO_R: +001f1a ff03 .dw $ff03 +001f1b 3e32 +001f1c 0072 .db "2>r",0 +001f1d 1f10 .dw VE_HEAD + .set VE_HEAD = VE_2TO_R + XT_2TO_R: +001f1e 1f1f .dw PFA_2TO_R + PFA_2TO_R: +001f1f 01fc movw zl, tosl +001f20 9189 +001f21 9199 loadtos +001f22 939f push tosh +001f23 938f push tosl +001f24 93ff push zh +001f25 93ef push zl +001f26 9189 +001f27 9199 loadtos +001f28 ccdc jmp_ DO_NEXT + .include "words/2r_from.asm" + + ; Stack + ; move DTOR to TOS + VE_2R_FROM: +001f29 ff03 .dw $ff03 +001f2a 7232 +001f2b 003e .db "2r>",0 +001f2c 1f1a .dw VE_HEAD + .set VE_HEAD = VE_2R_FROM + XT_2R_FROM: +001f2d 1f2e .dw PFA_2R_FROM + PFA_2R_FROM: +001f2e 939a +001f2f 938a savetos +001f30 91ef pop zl +001f31 91ff pop zh +001f32 918f pop tosl +001f33 919f pop tosh +001f34 939a +001f35 938a savetos +001f36 01cf movw tosl, zl +001f37 cccd jmp_ DO_NEXT + + .include "words/store-e.asm" + + ; Memory + ; write n (2bytes) to eeprom address + VE_STOREE: +001f38 ff02 .dw $ff02 +001f39 6521 .db "!e" +001f3a 1f29 .dw VE_HEAD + .set VE_HEAD = VE_STOREE + XT_STOREE: +001f3b 1f3c .dw PFA_STOREE + PFA_STOREE: + .if WANT_UNIFIED == 1 + .endif + PFA_STOREE0: +001f3c 01fc movw zl, tosl +001f3d 9189 +001f3e 9199 loadtos +001f3f b72f in_ temp2, SREG +001f40 94f8 cli +001f41 d028 rcall PFA_FETCHE2 +001f42 b30d in_ temp0, EEDR +001f43 1708 cp temp0,tosl +001f44 f009 breq PFA_STOREE3 +001f45 d00b rcall PFA_STOREE1 + PFA_STOREE3: +001f46 9631 adiw zl,1 +001f47 d022 rcall PFA_FETCHE2 +001f48 b30d in_ temp0, EEDR +001f49 1709 cp temp0,tosh +001f4a f011 breq PFA_STOREE4 +001f4b 2f89 mov tosl, tosh +001f4c d004 rcall PFA_STOREE1 + PFA_STOREE4: +001f4d bf2f out_ SREG, temp2 +001f4e 9189 +001f4f 9199 loadtos +001f50 ccb4 jmp_ DO_NEXT + + PFA_STOREE1: +001f51 99e1 sbic EECR, EEPE +001f52 cffe rjmp PFA_STOREE1 + + PFA_STOREE2: ; estore_wait_low_spm: +001f53 b707 in_ temp0, SPMCSR +001f54 fd00 sbrc temp0,SPMEN +001f55 cffd rjmp PFA_STOREE2 + +001f56 bbff out_ EEARH,zh +001f57 bbee out_ EEARL,zl +001f58 bb8d out_ EEDR, tosl +001f59 9ae2 sbi EECR,EEMPE +001f5a 9ae1 sbi EECR,EEPE + +001f5b 9508 ret + .if WANT_UNIFIED == 1 + .endif + .include "words/fetch-e.asm" + + ; Memory + ; read 1 cell from eeprom + VE_FETCHE: +001f5c ff02 .dw $ff02 +001f5d 6540 .db "@e" +001f5e 1f38 .dw VE_HEAD + .set VE_HEAD = VE_FETCHE + XT_FETCHE: +001f5f 1f60 .dw PFA_FETCHE + PFA_FETCHE: + .if WANT_UNIFIED == 1 + .endif + PFA_FETCHE1: +001f60 b72f in_ temp2, SREG +001f61 94f8 cli +001f62 01fc movw zl, tosl +001f63 d006 rcall PFA_FETCHE2 +001f64 b38d in_ tosl, EEDR + +001f65 9631 adiw zl,1 + +001f66 d003 rcall PFA_FETCHE2 +001f67 b39d in_ tosh, EEDR +001f68 bf2f out_ SREG, temp2 +001f69 cc9b jmp_ DO_NEXT + + PFA_FETCHE2: +001f6a 99e1 sbic EECR, EEPE +001f6b cffe rjmp PFA_FETCHE2 + +001f6c bbff out_ EEARH,zh +001f6d bbee out_ EEARL,zl + +001f6e 9ae0 sbi EECR,EERE +001f6f 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: +001f70 ff02 .dw $ff02 +001f71 6921 .db "!i" +001f72 1f5c .dw VE_HEAD + .set VE_HEAD = VE_STOREI + XT_STOREI: +001f73 0c9a .dw PFA_DODEFER1 + PFA_STOREI: +001f74 005c .dw EE_STOREI +001f75 0c3b .dw XT_EDEFERFETCH +001f76 0c45 .dw XT_EDEFERSTORE + .if FLASHEND > $10000 + .else + .include "words/store-i_nrww.asm" + + ; Memory + ; writes n to flash memory using assembly code (code to be placed in boot loader section) + VE_DO_STOREI_NRWW: +001f77 ff09 .dw $ff09 +001f78 2128 +001f79 2d69 +001f7a 726e +001f7b 7777 +001f7c 0029 .db "(!i-nrww)",0 +001f7d 1f70 .dw VE_HEAD + .set VE_HEAD = VE_DO_STOREI_NRWW + XT_DO_STOREI: +001f7e 1f7f .dw PFA_DO_STOREI_NRWW + PFA_DO_STOREI_NRWW: + ; store status register +001f7f b71f in temp1,SREG +001f80 931f push temp1 +001f81 94f8 cli + +001f82 019c movw temp2, tosl ; save the (word) address +001f83 9189 +001f84 9199 loadtos ; get the new value for the flash cell +001f85 93af push xl +001f86 93bf push xh +001f87 93cf push yl +001f88 93df push yh +001f89 d009 rcall DO_STOREI_atmega +001f8a 91df pop yh +001f8b 91cf pop yl +001f8c 91bf pop xh +001f8d 91af pop xl + ; finally clear the stack +001f8e 9189 +001f8f 9199 loadtos +001f90 911f pop temp1 + ; restore status register (and interrupt enable flag) +001f91 bf1f out SREG,temp1 + +001f92 cc72 jmp_ DO_NEXT + + ; + DO_STOREI_atmega: + ; write data to temp page buffer + ; use the values in tosl/tosh at the + ; appropiate place +001f93 d010 rcall pageload + + ; erase page if needed + ; it is needed if a bit goes from 0 to 1 +001f94 94e0 com temp4 +001f95 94f0 com temp5 +001f96 218e and tosl, temp4 +001f97 219f and tosh, temp5 +001f98 2b98 or tosh, tosl +001f99 f019 breq DO_STOREI_writepage +001f9a 01f9 movw zl, temp2 +001f9b e002 ldi temp0,(1<8000 + .elif AMFORTH_NRWW_SIZE>4000 + .elif AMFORTH_NRWW_SIZE>2000 + .include "dict/core_2k.inc" + + .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: +001fd2 0008 .dw $0008 +001fd3 6c32 +001fd4 7469 +001fd5 7265 +001fd6 6c61 .db "2literal" +001fd7 1fc8 .dw VE_HEAD + .set VE_HEAD = VE_2LITERAL + XT_2LITERAL: +001fd8 1c01 .dw DO_COLON + PFA_2LITERAL: + .endif +001fd9 1cc4 .dw XT_SWAP +001fda 02c4 .dw XT_LITERAL +001fdb 02c4 .dw XT_LITERAL +001fdc 1c20 .dw XT_EXIT + .include "words/equal.asm" + + ; Compare + ; compares two values for equality + VE_EQUAL: +001fdd ff01 .dw $ff01 +001fde 003d .db "=",0 +001fdf 1fd2 .dw VE_HEAD + .set VE_HEAD = VE_EQUAL + XT_EQUAL: +001fe0 1c01 .dw DO_COLON + PFA_EQUAL: +001fe1 1d93 .dw XT_MINUS +001fe2 1d1a .dw XT_ZEROEQUAL +001fe3 1c20 .dw XT_EXIT + .include "words/num-constants.asm" + + .endif + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_ONE: +001fe4 ff01 .dw $ff01 +001fe5 0031 .db "1",0 +001fe6 1fdd .dw VE_HEAD + .set VE_HEAD = VE_ONE + XT_ONE: +001fe7 1c48 .dw PFA_DOVARIABLE + PFA_ONE: + .endif +001fe8 0001 .DW 1 + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_TWO: +001fe9 ff01 .dw $ff01 +001fea 0032 .db "2",0 +001feb 1fe4 .dw VE_HEAD + .set VE_HEAD = VE_TWO + XT_TWO: +001fec 1c48 .dw PFA_DOVARIABLE + PFA_TWO: + .endif +001fed 0002 .DW 2 + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_MINUSONE: +001fee ff02 .dw $ff02 +001fef 312d .db "-1" +001ff0 1fe9 .dw VE_HEAD + .set VE_HEAD = VE_MINUSONE + XT_MINUSONE: +001ff1 1c48 .dw PFA_DOVARIABLE + PFA_MINUSONE: + .endif +001ff2 ffff .DW -1 + .include "dict_appl_core.inc" + + ; do not delete it! + + .set flashlast = pc + .if (pc>FLASHEND) + .endif + + .dseg + ; define a label for the 1st free ram address + HERESTART: + .eseg + .include "amforth-eeprom.inc" +00002a ff ff + ; some configs +00002c 02 0f CFG_DP: .dw DPSTART ; Dictionary Pointer +00002e 1d 01 EE_HERE: .dw HERESTART ; Memory Allocation +000030 84 00 EE_EHERE: .dw EHERESTART ; EEProm Memory Allocation +000032 15 05 CFG_WLSCOPE: .dw XT_GET_CURRENT ; default wordlist scope +000034 52 00 CFG_FORTHRECOGNIZER: .dw CFG_RECOGNIZERLISTLEN ; Recognizer word set + ; LEAVE stack is between data stack and return stack. +000036 10 04 CFG_LP0: .dw stackstart+1 +000038 54 0e CFG_TURNKEY: .dw XT_APPLTURNKEY ; TURNKEY +00003a b7 05 CFG_ENVIRONMENT:.dw VE_ENVHEAD ; environmental queries +00003c 3e 00 CFG_CURRENT: .dw CFG_FORTHWORDLIST ; forth-wordlist +00003e ee 1f CFG_FORTHWORDLIST:.dw VE_HEAD ; pre-defined (compiled in) wordlist + CFG_ORDERLISTLEN: +000040 01 00 .dw 1 + CFG_ORDERLIST: ; list of wordlist id, exactly numwordlist entries +000042 3e 00 .dw CFG_FORTHWORDLIST ; get/set-order +000044 .byte (NUMWORDLISTS-1)*CELLSIZE ; one slot is already used + CFG_RECOGNIZERLISTLEN: +000052 02 00 .dw 2 + CFG_RECOGNIZERLIST: +000054 ab 0b .dw XT_REC_FIND +000056 97 0b .dw XT_REC_NUM +000058 .byte (NUMRECOGNIZERS-2)*CELLSIZE ; two slots are already used + + EE_STOREI: +00005c 7e 1f .dw XT_DO_STOREI ; Store a cell into flash + + ; MARKER saves everything up to here. Nothing beyond gets saved + EE_MARKER: +00005e 5e 00 .dw EE_MARKER + + ; default user area + EE_INITUSER: +000060 00 00 .dw 0 ; USER_STATE +000062 00 00 .dw 0 ; USER_FOLLOWER +000064 5f 04 .dw rstackstart ; USER_RP +000066 0f 04 .dw stackstart ; USER_SP0 +000068 0f 04 .dw stackstart ; USER_SP + +00006a 00 00 .dw 0 ; USER_HANDLER +00006c 0a 00 .dw 10 ; USER_BASE + +00006e 98 00 .dw XT_TX ; USER_EMIT +000070 a6 00 .dw XT_TXQ ; USER_EMITQ +000072 6d 00 .dw XT_RX ; USER_KEY +000074 88 00 .dw XT_RXQ ; USER_KEYQ +000076 ac 0d .dw XT_SOURCETIB ; USER_SOURCE +000078 00 00 .dw 0 ; USER_G_IN +00007a 99 0d .dw XT_REFILLTIB ; USER_REFILL +00007c 99 0a .dw XT_DEFAULT_PROMPTOK +00007e b8 0a .dw XT_DEFAULT_PROMPTERROR +000080 a8 0a .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: +000082 0c 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 + +"ATmega16" register use summary: +r0 : 25 r1 : 5 r2 : 10 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: 85 r17: 61 r18: 61 r19: 37 r20: 13 r21: 11 r22: 11 r23: 3 +r24: 203 r25: 139 r26: 28 r27: 17 r28: 7 r29: 4 r30: 85 r31: 47 +x : 4 y : 209 z : 50 +Registers used: 29 out of 35 (82.9%) + +"ATmega16" 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 : 3 brcs : 1 break : 0 breq : 6 brge : 1 brhc : 0 +brhs : 0 brid : 0 brie : 0 brlo : 1 brlt : 3 brmi : 3 +brne : 20 brpl : 0 brsh : 0 brtc : 0 brts : 0 brvc : 0 +brvs : 2 bset : 0 bst : 0 call : 2 cbi : 7 cbr : 1 +clc : 2 clh : 0 cli : 7 cln : 0 clr : 14 cls : 0 +clt : 0 clv : 0 clz : 0 com : 14 cp : 11 cpc : 10 +cpi : 2 cpse : 0 dec : 8 eor : 3 fmul : 0 fmuls : 0 +fmulsu: 0 icall : 0 ijmp : 1 in : 25 inc : 3 jmp : 25 +ld : 141 ldd : 4 ldi : 41 lds : 1 lpm : 16 lsl : 14 +lsr : 2 mov : 14 movw : 70 mul : 5 muls : 1 mulsu : 2 +neg : 0 nop : 0 or : 9 ori : 2 out : 22 pop : 45 +push : 39 rcall : 34 ret : 7 reti : 1 rjmp : 92 rol : 23 +ror : 6 sbc : 9 sbci : 3 sbi : 8 sbic : 3 sbis : 0 +sbiw : 16 sbr : 0 sbrc : 5 sbrs : 7 sec : 1 seh : 0 +sei : 1 sen : 0 ser : 4 ses : 0 set : 0 sev : 0 +sez : 0 sleep : 0 spm : 2 st : 77 std : 8 sts : 1 +sub : 6 subi : 3 swap : 0 tst : 0 wdr : 0 +Instructions used: 72 out of 113 (63.7%) + +"ATmega16" memory use summary [bytes]: +Segment Begin End Code Data Used Size Use% +--------------------------------------------------------------- +[.cseg] 0x000000 0x003fe6 2044 9642 11686 16384 71.3% +[.dseg] 0x000060 0x00011d 0 189 189 1024 18.5% +[.eseg] 0x000000 0x000084 0 132 132 512 25.8% + +Assembly complete, 0 errors, 8 warnings diff --git a/amforth-6.5/appl/eval-pollin/p16-8.map b/amforth-6.5/appl/eval-pollin/p16-8.map new file mode 100644 index 0000000..8e30021 --- /dev/null +++ b/amforth-6.5/appl/eval-pollin/p16-8.map @@ -0,0 +1,1961 @@ + +AVRASM ver. 2.1.52 p16-8.asm Sun Apr 30 20:10:14 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 00000094 +EQU SIGNATURE_002 00000003 +EQU SREG 0000003f +EQU SPL 0000003d +EQU SPH 0000003e +EQU OCR0 0000003c +EQU GICR 0000003b +EQU GIFR 0000003a +EQU TIMSK 00000039 +EQU TIFR 00000038 +EQU SPMCSR 00000037 +EQU TWCR 00000036 +EQU MCUCR 00000035 +EQU MCUCSR 00000034 +EQU TCCR0 00000033 +EQU TCNT0 00000032 +EQU OSCCAL 00000031 +EQU OCDR 00000031 +EQU SFIOR 00000030 +EQU TCCR1A 0000002f +EQU TCCR1B 0000002e +EQU TCNT1L 0000002c +EQU TCNT1H 0000002d +EQU OCR1AL 0000002a +EQU OCR1AH 0000002b +EQU OCR1BL 00000028 +EQU OCR1BH 00000029 +EQU ICR1L 00000026 +EQU ICR1H 00000027 +EQU TCCR2 00000025 +EQU TCNT2 00000024 +EQU OCR2 00000023 +EQU ASSR 00000022 +EQU WDTCR 00000021 +EQU UBRRH 00000020 +EQU UCSRC 00000020 +EQU EEARL 0000001e +EQU EEARH 0000001f +EQU EEDR 0000001d +EQU EECR 0000001c +EQU PORTA 0000001b +EQU DDRA 0000001a +EQU PINA 00000019 +EQU PORTB 00000018 +EQU DDRB 00000017 +EQU PINB 00000016 +EQU PORTC 00000015 +EQU DDRC 00000014 +EQU PINC 00000013 +EQU PORTD 00000012 +EQU DDRD 00000011 +EQU PIND 00000010 +EQU SPDR 0000000f +EQU SPSR 0000000e +EQU SPCR 0000000d +EQU UDR 0000000c +EQU UCSRA 0000000b +EQU UCSRB 0000000a +EQU UBRRL 00000009 +EQU ACSR 00000008 +EQU ADMUX 00000007 +EQU ADCSRA 00000006 +EQU ADCH 00000005 +EQU ADCL 00000004 +EQU TWDR 00000003 +EQU TWAR 00000002 +EQU TWSR 00000001 +EQU TWBR 00000000 +EQU CS00 00000000 +EQU CS01 00000001 +EQU CS02 00000002 +EQU WGM01 00000003 +EQU CTC0 00000003 +EQU COM00 00000004 +EQU COM01 00000005 +EQU WGM00 00000006 +EQU PWM0 00000006 +EQU FOC0 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 OCR0_0 00000000 +EQU OCR0_1 00000001 +EQU OCR0_2 00000002 +EQU OCR0_3 00000003 +EQU OCR0_4 00000004 +EQU OCR0_5 00000005 +EQU OCR0_6 00000006 +EQU OCR0_7 00000007 +EQU TOIE0 00000000 +EQU OCIE0 00000001 +EQU TOV0 00000000 +EQU OCF0 00000001 +EQU PSR10 00000000 +EQU TOIE1 00000002 +EQU OCIE1B 00000003 +EQU OCIE1A 00000004 +EQU TICIE1 00000005 +EQU TOV1 00000002 +EQU OCF1B 00000003 +EQU OCF1A 00000004 +EQU ICF1 00000005 +EQU WGM10 00000000 +EQU PWM10 00000000 +EQU WGM11 00000001 +EQU PWM11 00000001 +EQU FOC1B 00000002 +EQU FOC1A 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 CTC10 00000003 +EQU CTC1 00000003 +EQU WGM13 00000004 +EQU CTC11 00000004 +EQU ICES1 00000006 +EQU ICNC1 00000007 +EQU GIMSK 0000003b +EQU IVCE 00000000 +EQU IVSEL 00000001 +EQU INT2 00000005 +EQU INT0 00000006 +EQU INT1 00000007 +EQU INTF2 00000005 +EQU INTF0 00000006 +EQU INTF1 00000007 +EQU ISC00 00000000 +EQU ISC01 00000001 +EQU ISC10 00000002 +EQU ISC11 00000003 +EQU ISC2 00000006 +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 EEWE 00000001 +EQU EEMWE 00000002 +EQU EEWEE 00000002 +EQU EERIE 00000003 +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 SM0 00000004 +EQU SM1 00000005 +EQU SE 00000006 +EQU SM2 00000007 +EQU MCUSR 00000034 +EQU PORF 00000000 +EQU EXTRF 00000001 +EQU EXTREF 00000001 +EQU BORF 00000002 +EQU WDRF 00000003 +EQU JTRF 00000004 +EQU JTD 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 PSR2 00000001 +EQU PUD 00000002 +EQU TOIE2 00000006 +EQU OCIE2 00000007 +EQU TOV2 00000006 +EQU OCF2 00000007 +EQU CS20 00000000 +EQU CS21 00000001 +EQU CS22 00000002 +EQU WGM21 00000003 +EQU CTC2 00000003 +EQU COM20 00000004 +EQU COM21 00000005 +EQU WGM20 00000006 +EQU PWM2 00000006 +EQU FOC2 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 OCR2_0 00000000 +EQU OCR2_1 00000001 +EQU OCR2_2 00000002 +EQU OCR2_3 00000003 +EQU OCR2_4 00000004 +EQU OCR2_5 00000005 +EQU OCR2_6 00000006 +EQU OCR2_7 00000007 +EQU TCR2UB 00000000 +EQU OCR2UB 00000001 +EQU TCN2UB 00000002 +EQU AS2 00000003 +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 UDR0 00000000 +EQU UDR1 00000001 +EQU UDR2 00000002 +EQU UDR3 00000003 +EQU UDR4 00000004 +EQU UDR5 00000005 +EQU UDR6 00000006 +EQU UDR7 00000007 +EQU USR 0000000b +EQU MPCM 00000000 +EQU U2X 00000001 +EQU UPE 00000002 +EQU PE 00000002 +EQU DOR 00000003 +EQU FE 00000004 +EQU UDRE 00000005 +EQU TXC 00000006 +EQU RXC 00000007 +EQU UCR 0000000a +EQU TXB8 00000000 +EQU RXB8 00000001 +EQU UCSZ2 00000002 +EQU CHR9 00000002 +EQU TXEN 00000003 +EQU RXEN 00000004 +EQU UDRIE 00000005 +EQU TXCIE 00000006 +EQU RXCIE 00000007 +EQU UCPOL 00000000 +EQU UCSZ0 00000001 +EQU UCSZ1 00000002 +EQU USBS 00000003 +EQU UPM0 00000004 +EQU UPM1 00000005 +EQU UMSEL 00000006 +EQU URSEL 00000007 +EQU UBRRHI 00000020 +EQU I2BR 00000000 +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 I2CR 00000036 +EQU TWIE 00000000 +EQU I2IE 00000000 +EQU TWEN 00000002 +EQU I2EN 00000002 +EQU ENI2C 00000002 +EQU TWWC 00000003 +EQU I2WC 00000003 +EQU TWSTO 00000004 +EQU I2STO 00000004 +EQU TWSTA 00000005 +EQU I2STA 00000005 +EQU TWEA 00000006 +EQU I2EA 00000006 +EQU TWINT 00000007 +EQU I2INT 00000007 +EQU I2SR 00000001 +EQU TWPS0 00000000 +EQU TWS0 00000000 +EQU I2GCE 00000000 +EQU TWPS1 00000001 +EQU TWS1 00000001 +EQU TWS3 00000003 +EQU I2S3 00000003 +EQU TWS4 00000004 +EQU I2S4 00000004 +EQU TWS5 00000005 +EQU I2S5 00000005 +EQU TWS6 00000006 +EQU I2S6 00000006 +EQU TWS7 00000007 +EQU I2S7 00000007 +EQU I2DR 00000003 +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 I2AR 00000002 +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 ACME 00000003 +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 MUX0 00000000 +EQU MUX1 00000001 +EQU MUX2 00000002 +EQU MUX3 00000003 +EQU MUX4 00000004 +EQU ADLAR 00000005 +EQU REFS0 00000006 +EQU REFS1 00000007 +EQU ADCSR 00000006 +EQU ADPS0 00000000 +EQU ADPS1 00000001 +EQU ADPS2 00000002 +EQU ADIE 00000003 +EQU ADIF 00000004 +EQU ADATE 00000005 +EQU ADFR 00000005 +EQU ADSC 00000006 +EQU ADEN 00000007 +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 ADTS0 00000005 +EQU ADTS1 00000006 +EQU ADTS2 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 SPMCR 00000037 +EQU SPMEN 00000000 +EQU PGERS 00000001 +EQU PGWRT 00000002 +EQU BLBSET 00000003 +EQU RWWSRE 00000004 +EQU ASRE 00000004 +EQU RWWSB 00000006 +EQU ASB 00000006 +EQU SPMIE 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 WDP0 00000000 +EQU WDP1 00000001 +EQU WDP2 00000002 +EQU WDE 00000003 +EQU WDTOE 00000004 +EQU WDDE 00000004 +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 BODEN 00000006 +EQU BODLEVEL 00000007 +EQU BOOTRST 00000000 +EQU BOOTSZ0 00000001 +EQU BOOTSZ1 00000002 +EQU EESAVE 00000003 +EQU CKOPT 00000004 +EQU SPIEN 00000005 +EQU JTAGEN 00000006 +EQU OCDEN 00000007 +DEF XH r27 +DEF XL r26 +DEF YH r29 +DEF YL r28 +DEF ZH r31 +DEF ZL r30 +EQU FLASHEND 00001fff +EQU IOEND 0000003f +EQU SRAM_START 00000060 +EQU SRAM_SIZE 00000400 +EQU RAMEND 0000045f +EQU XRAMEND 00000000 +EQU E2END 000001ff +EQU EEPROMEND 000001ff +EQU EEADRBITS 00000009 +EQU NRWW_START_ADDR 00001c00 +EQU NRWW_STOP_ADDR 00001fff +EQU RWW_START_ADDR 00000000 +EQU RWW_STOP_ADDR 00001bff +EQU PAGESIZE 00000040 +EQU FIRSTBOOTSTART 00001f80 +EQU SECONDBOOTSTART 00001f00 +EQU THIRDBOOTSTART 00001e00 +EQU FOURTHBOOTSTART 00001c00 +EQU SMALLBOOTSTART 00001f80 +EQU LARGEBOOTSTART 00001c00 +EQU INT0addr 00000002 +EQU INT1addr 00000004 +EQU OC2addr 00000006 +EQU OVF2addr 00000008 +EQU ICP1addr 0000000a +EQU OC1Aaddr 0000000c +EQU OC1Baddr 0000000e +EQU OVF1addr 00000010 +EQU OVF0addr 00000012 +EQU SPIaddr 00000014 +EQU URXCaddr 00000016 +EQU UDREaddr 00000018 +EQU UTXCaddr 0000001a +EQU ADCCaddr 0000001c +EQU ERDYaddr 0000001e +EQU ACIaddr 00000020 +EQU TWIaddr 00000022 +EQU INT2addr 00000024 +EQU OC0addr 00000026 +EQU SPMRaddr 00000028 +EQU INT_VECTORS_SIZE 0000002a +EQU ramstart 00000060 +EQU CELLSIZE 00000002 +SET WANT_TIMER_COUNTER_0 00000000 +SET WANT_TIMER_COUNTER_1 00000000 +SET WANT_EXTERNAL_INTERRUPT 00000000 +SET WANT_EEPROM 00000000 +SET WANT_CPU 00000000 +SET WANT_TIMER_COUNTER_2 00000000 +SET WANT_SPI 00000000 +SET WANT_USART 00000000 +SET WANT_TWI 00000000 +SET WANT_ANALOG_COMPARATOR 00000000 +SET WANT_AD_CONVERTER 00000000 +SET WANT_JTAG 00000000 +SET WANT_BOOT_LOAD 00000000 +SET WANT_PORTA 00000000 +SET WANT_PORTB 00000000 +SET WANT_PORTC 00000000 +SET WANT_PORTD 00000000 +SET WANT_WATCHDOG 00000000 +EQU intvecsize 00000002 +EQU pclen 00000002 +CSEG isr 0000011e +EQU INTVECTORS 00000015 +EQU EEPE 00000001 +EQU EEMPE 00000002 +CSEG mcu_info 00000029 +CSEG mcu_ramsize 00000029 +CSEG mcu_eepromsize 0000002a +CSEG mcu_maxdp 0000002b +CSEG mcu_numints 0000002c +CSEG mcu_name 0000002d +SET codestart 00000032 +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 0000045f +SET stackstart 0000040f +SET NUMWORDLISTS 00000008 +SET NUMRECOGNIZERS 00000004 +SET BAUD 00009600 +SET BAUD_MAXERROR 0000001e +SET VE_HEAD 00001fee +SET VE_ENVHEAD 000005b7 +SET AMFORTH_RO_SEG 00001c01 +EQU F_CPU 007a1200 +EQU TIMER_INT 00000008 +EQU BAUDRATE_LOW 00000029 +EQU BAUDRATE_HIGH 00000040 +EQU USART_C 00000040 +EQU USART_B 0000002a +EQU USART_A 0000002b +EQU USART_DATA 0000002c +EQU bm_USARTC_en 00000080 +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_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 00000060 +DSEG usart_rx_in 00000070 +DSEG usart_rx_out 00000071 +CSEG VE_TO_RXBUF 00000032 +CSEG XT_TO_RXBUF 00000038 +CSEG PFA_rx_tobuf 00000039 +CSEG DO_NEXT 00001c05 +CSEG VE_ISR_RX 00000049 +CSEG XT_ISR_RX 0000004e +CSEG DO_COLON 00001c01 +CSEG usart_rx_isr 0000004f +CSEG XT_DOLITERAL 00001c3d +CSEG XT_CFETCH 00001c98 +CSEG XT_DUP 00001cb1 +CSEG XT_EQUAL 00001fe0 +CSEG XT_DOCONDBRANCH 00001c36 +CSEG usart_rx_isr1 00000059 +CSEG XT_COLD 00000ae0 +CSEG XT_EXIT 00001c20 +CSEG XT_USART_INIT_RX_BUFFER 0000005b +CSEG PFA_USART_INIT_RX_BUFFER 0000005c +CSEG XT_INTSTORE 00000213 +CSEG XT_ZERO 00001d54 +CSEG XT_FILL 0000025d +CSEG VE_RX_BUFFER 00000068 +CSEG XT_RX_BUFFER 0000006d +CSEG PFA_RX_BUFFER 0000006e +CSEG XT_RXQ_BUFFER 00000088 +CSEG XT_PLUS 00001d9d +CSEG XT_SWAP 00001cc4 +CSEG XT_1PLUS 00001e2f +CSEG XT_AND 00001e13 +CSEG XT_CSTORE 00001c8d +CSEG VE_RXQ_BUFFER 00000082 +CSEG PFA_RXQ_BUFFER 00000089 +CSEG XT_PAUSE 00000ad8 +CSEG XT_NOTEQUAL 00001d13 +SET XT_RX 0000006d +SET XT_RXQ 00000088 +SET XT_USART_INIT_RX 0000005b +CSEG VE_TX_POLL 00000092 +CSEG XT_TX_POLL 00000098 +CSEG PFA_TX_POLL 00000099 +CSEG XT_TXQ_POLL 000000a6 +CSEG VE_TXQ_POLL 000000a0 +CSEG PFA_TXQ_POLL 000000a7 +SET XT_TX 00000098 +SET XT_TXQ 000000a6 +SET XT_USART_INIT_TX 00000000 +CSEG VE_UBRR 000000af +CSEG XT_UBRR 000000b3 +CSEG PFA_DOVALUE1 00001c6f +CSEG PFA_UBRR 000000b4 +ESEG EE_UBRRVAL 00000082 +CSEG XT_EDEFERFETCH 00000c3b +CSEG XT_EDEFERSTORE 00000c45 +CSEG VE_USART 000000b7 +CSEG XT_USART 000000bc +CSEG PFA_USART 000000bd +CSEG XT_BYTESWAP 00001ef9 +EQU OW_PORT 00000018 +EQU OW_BIT 00000004 +SET OW_DDR 00000017 +SET OW_PIN 00000016 +CSEG VE_OW_RESET 000000d2 +CSEG XT_OW_RESET 000000d8 +CSEG PFA_OW_RESET 000000d9 +SET cycles 00000000 +SET loop_cycles 000007d0 +CSEG VE_OW_SLOT 000000f6 +CSEG XT_OW_SLOT 000000fc +CSEG PFA_OW_SLOT 000000fd +CSEG PFA_OW_SLOT0 0000010a +SET AMFORTH_NRWW_SIZE 000007fc +SET corepc 0000011e +CSEG PFA_COLD 00000ae1 +ESEG intvec 00000000 +DSEG intcnt 00000072 +CSEG VE_MPLUS 00000135 +CSEG XT_MPLUS 00000138 +CSEG PFA_MPLUS 00000139 +CSEG XT_S2D 00000dee +CSEG XT_DPLUS 0000019c +CSEG VE_UDSTAR 0000013c +CSEG XT_UDSTAR 00000140 +CSEG PFA_UDSTAR 00000141 +CSEG XT_TO_R 00001cff +CSEG XT_UMSTAR 00001de0 +CSEG XT_DROP 00001cd9 +CSEG XT_R_FROM 00001cf6 +CSEG XT_ROT 00001ce1 +CSEG VE_UMAX 0000014b +CSEG XT_UMAX 0000014f +CSEG PFA_UMAX 00000150 +CSEG XT_2DUP 000005eb +CSEG XT_ULESS 00001d5c +CSEG UMAX1 00000155 +CSEG VE_UMIN 00000157 +CSEG XT_UMIN 0000015b +CSEG PFA_UMIN 0000015c +CSEG XT_UGREATER 00001d67 +CSEG UMIN1 00000161 +CSEG XT_IMMEDIATEQ 00000163 +CSEG PFA_IMMEDIATEQ 00000164 +CSEG XT_ZEROEQUAL 00001d1a +CSEG IMMEDIATEQ1 0000016c +CSEG XT_ONE 00001fe7 +CSEG XT_TRUE 00001d4b +CSEG VE_NAME2FLAGS 0000016e +CSEG XT_NAME2FLAGS 00000175 +CSEG PFA_NAME2FLAGS 00000176 +CSEG XT_FETCHI 00001fcb +CSEG VE_D2STAR 0000017b +CSEG XT_D2STAR 0000017f +CSEG PFA_D2STAR 00000180 +CSEG VE_D2SLASH 0000018a +CSEG XT_D2SLASH 0000018e +CSEG PFA_D2SLASH 0000018f +CSEG VE_DPLUS 00000199 +CSEG PFA_DPLUS 0000019d +CSEG VE_DMINUS 000001ab +CSEG XT_DMINUS 000001ae +CSEG PFA_DMINUS 000001af +CSEG VE_DINVERT 000001be +CSEG XT_DINVERT 000001c4 +CSEG PFA_DINVERT 000001c5 +CSEG VE_UDOT 000001cf +CSEG XT_UDOT 000001d2 +CSEG PFA_UDOT 000001d3 +CSEG XT_UDDOT 000007b1 +CSEG VE_UDOTR 000001d6 +CSEG XT_UDOTR 000001da +CSEG PFA_UDOTR 000001db +CSEG XT_UDDOTR 000007ba +CSEG VE_SHOWWORDLIST 000001df +CSEG XT_SHOWWORDLIST 000001e8 +CSEG PFA_SHOWWORDLIST 000001e9 +CSEG XT_SHOWWORD 000001ee +CSEG XT_TRAVERSEWORDLIST 00000cde +CSEG PFA_SHOWWORD 000001ef +CSEG XT_NAME2STRING 00000cf9 +CSEG XT_ITYPE 00000827 +CSEG XT_SPACE 00000869 +CSEG VE_WORDS 000001f4 +CSEG XT_WORDS 000001f9 +CSEG PFA_WORDS 000001fa +ESEG CFG_ORDERLISTLEN 00000040 +CSEG XT_FETCHE 00001f5f +CSEG VE_INTON 000001ff +CSEG XT_INTON 00000203 +CSEG PFA_INTON 00000204 +CSEG VE_INTOFF 00000207 +CSEG XT_INTOFF 0000020b +CSEG PFA_INTOFF 0000020c +CSEG VE_INTSTORE 0000020f +CSEG PFA_INTSTORE 00000214 +CSEG XT_STOREE 00001f3b +CSEG VE_INTFETCH 00000219 +CSEG XT_INTFETCH 0000021d +CSEG PFA_INTFETCH 0000021e +CSEG VE_INTTRAP 00000223 +CSEG XT_INTTRAP 00000229 +CSEG PFA_INTTRAP 0000022a +CSEG XT_ISREXEC 0000022f +CSEG PFA_ISREXEC 00000230 +CSEG XT_EXECUTE 00001c2a +CSEG XT_ISREND 00000234 +CSEG PFA_ISREND 00000235 +CSEG PFA_ISREND1 00000238 +CSEG VE_PICK 00000239 +CSEG XT_PICK 0000023d +CSEG PFA_PICK 0000023e +CSEG XT_CELLS 000005dd +CSEG XT_SP_FETCH 00001e8d +CSEG XT_FETCH 00001c79 +CSEG VE_DOTSTRING 00000244 +CSEG XT_DOTSTRING 00000247 +CSEG PFA_DOTSTRING 00000248 +CSEG XT_SQUOTE 0000024f +CSEG XT_COMPILE 000002a3 +CSEG VE_SQUOTE 0000024c +CSEG PFA_SQUOTE 00000250 +CSEG XT_PARSE 00000a0e +CSEG XT_STATE 000005d0 +CSEG PFA_SQUOTE1 00000258 +CSEG XT_SLITERAL 000002cf +CSEG VE_FILL 00000259 +CSEG PFA_FILL 0000025e +CSEG XT_QDUP 00001cb9 +CSEG PFA_FILL2 0000026a +CSEG XT_BOUNDS 00000de5 +CSEG XT_DODO 00001e9b +CSEG PFA_FILL1 00000265 +CSEG XT_I 00001eac +CSEG XT_DOLOOP 00001ec9 +CSEG VE_NEWEST 0000026c +CSEG XT_NEWEST 00000271 +CSEG PFA_DOVARIABLE 00001c48 +CSEG PFA_NEWEST 00000272 +DSEG ram_newest 00000087 +CSEG VE_LATEST 00000273 +CSEG XT_LATEST 00000278 +CSEG PFA_LATEST 00000279 +DSEG ram_latest 0000008b +CSEG VE_DOCREATE 0000027a +CSEG XT_DOCREATE 00000280 +CSEG PFA_DOCREATE 00000281 +CSEG XT_PARSENAME 00000a3b +CSEG XT_WLSCOPE 000003d7 +CSEG XT_CELLPLUS 000005e3 +CSEG XT_STORE 00001c81 +CSEG XT_HEADER 000003bc +CSEG VE_BACKSLASH 0000028b +CSEG XT_BACKSLASH 0000028e +CSEG PFA_BACKSLASH 0000028f +CSEG XT_SOURCE 00000a22 +CSEG XT_NIP 00001cf0 +CSEG XT_TO_IN 00000604 +CSEG VE_LPAREN 00000294 +CSEG XT_LPAREN 00000297 +CSEG PFA_LPAREN 00000298 +CSEG XT_2DROP 000005f4 +CSEG VE_COMPILE 0000029d +CSEG PFA_COMPILE 000002a4 +CSEG XT_ICELLPLUS 00000c32 +CSEG XT_COMMA 000002ae +CSEG VE_COMMA 000002ab +CSEG PFA_COMMA 000002af +CSEG XT_DP 00000634 +CSEG XT_STOREI 00001f73 +CSEG XT_DOTO 00000c20 +CSEG PFA_DP 00000635 +CSEG VE_BRACKETTICK 000002b6 +CSEG XT_BRACKETTICK 000002ba +CSEG PFA_BRACKETTICK 000002bb +CSEG XT_TICK 00000891 +CSEG XT_LITERAL 000002c4 +CSEG VE_LITERAL 000002be +CSEG PFA_LITERAL 000002c5 +CSEG VE_SLITERAL 000002c9 +CSEG PFA_SLITERAL 000002d0 +CSEG XT_DOSLITERAL 000007f4 +CSEG XT_SCOMMA 00000802 +CSEG XT_GMARK 000002d4 +CSEG PFA_GMARK 000002d5 +CSEG XT_GRESOLVE 000002d9 +CSEG PFA_GRESOLVE 000002da +CSEG XT_QSTACK 00000bde +CSEG XT_LMARK 000002df +CSEG PFA_LMARK 000002e0 +CSEG XT_LRESOLVE 000002e2 +CSEG PFA_LRESOLVE 000002e3 +CSEG VE_AHEAD 000002e6 +CSEG XT_AHEAD 000002eb +CSEG PFA_AHEAD 000002ec +CSEG XT_DOBRANCH 00001c2f +CSEG VE_IF 000002f0 +CSEG XT_IF 000002f3 +CSEG PFA_IF 000002f4 +CSEG VE_ELSE 000002f8 +CSEG XT_ELSE 000002fc +CSEG PFA_ELSE 000002fd +CSEG VE_THEN 00000303 +CSEG XT_THEN 00000307 +CSEG PFA_THEN 00000308 +CSEG VE_BEGIN 0000030a +CSEG XT_BEGIN 0000030f +CSEG PFA_BEGIN 00000310 +CSEG VE_WHILE 00000312 +CSEG XT_WHILE 00000317 +CSEG PFA_WHILE 00000318 +CSEG VE_REPEAT 0000031b +CSEG XT_REPEAT 00000320 +CSEG PFA_REPEAT 00000321 +CSEG XT_AGAIN 00000334 +CSEG VE_UNTIL 00000324 +CSEG XT_UNTIL 00000329 +CSEG PFA_UNTIL 0000032a +CSEG VE_AGAIN 0000032f +CSEG PFA_AGAIN 00000335 +CSEG VE_DO 00000339 +CSEG XT_DO 0000033c +CSEG PFA_DO 0000033d +CSEG XT_TO_L 00000397 +CSEG VE_LOOP 00000343 +CSEG XT_LOOP 00000347 +CSEG PFA_LOOP 00000348 +CSEG XT_ENDLOOP 0000037e +CSEG VE_PLUSLOOP 0000034c +CSEG XT_PLUSLOOP 00000351 +CSEG PFA_PLUSLOOP 00000352 +CSEG XT_DOPLUSLOOP 00001eba +CSEG VE_LEAVE 00000356 +CSEG XT_LEAVE 0000035b +CSEG PFA_LEAVE 0000035c +CSEG XT_UNLOOP 00001ed4 +CSEG VE_QDO 00000361 +CSEG XT_QDO 00000365 +CSEG PFA_QDO 00000366 +CSEG XT_QDOCHECK 0000036d +CSEG PFA_QDOCHECK 0000036e +CSEG PFA_QDOCHECK1 00000375 +CSEG XT_INVERT 00001dfd +CSEG VE_ENDLOOP 00000378 +CSEG PFA_ENDLOOP 0000037f +CSEG LOOP1 00000380 +CSEG XT_L_FROM 0000038b +CSEG LOOP2 00000387 +CSEG VE_L_FROM 00000388 +CSEG PFA_L_FROM 0000038c +CSEG XT_LP 000003aa +CSEG XT_PLUSSTORE 00001e65 +CSEG VE_TO_L 00000394 +CSEG PFA_TO_L 00000398 +CSEG XT_TWO 00001fec +CSEG VE_LP0 0000039f +CSEG XT_LP0 000003a3 +CSEG PFA_LP0 000003a4 +ESEG CFG_LP0 00000036 +CSEG VE_LP 000003a7 +CSEG PFA_LP 000003ab +DSEG ram_lp 0000008d +CSEG VE_CREATE 000003ac +CSEG XT_CREATE 000003b1 +CSEG PFA_CREATE 000003b2 +CSEG XT_REVEAL 000003e0 +CSEG PFA_DOCONSTANT 00001c52 +CSEG VE_HEADER 000003b7 +CSEG PFA_HEADER 000003bd +CSEG XT_GREATERZERO 00001d28 +CSEG PFA_HEADER1 000003ce +CSEG XT_OR 00001e1c +CSEG XT_DOSCOMMA 00000806 +CSEG XT_THROW 000008c8 +CSEG VE_WLSCOPE 000003d1 +CSEG PFA_DODEFER1 00000c9a +CSEG PFA_WLSCOPE 000003d8 +ESEG CFG_WLSCOPE 00000032 +CSEG VE_REVEAL 000003db +CSEG PFA_REVEAL 000003e1 +CSEG REVEAL1 000003eb +CSEG VE_DOES 000003ec +CSEG XT_DOES 000003f1 +CSEG PFA_DOES 000003f2 +CSEG XT_DODOES 00000404 +CSEG DO_DODOES 000003f9 +CSEG PFA_DODOES 00000405 +CSEG XT_NFA2CFA 00000d05 +CSEG VE_COLON 0000040d +CSEG XT_COLON 00000410 +CSEG PFA_COLON 00000411 +CSEG XT_COLONNONAME 0000041b +CSEG VE_COLONNONAME 00000415 +CSEG PFA_COLONNONAME 0000041c +CSEG XT_RBRACKET 00000430 +CSEG VE_SEMICOLON 00000424 +CSEG XT_SEMICOLON 00000427 +CSEG PFA_SEMICOLON 00000428 +CSEG XT_LBRACKET 00000438 +CSEG VE_RBRACKET 0000042d +CSEG PFA_RBRACKET 00000431 +CSEG VE_LBRACKET 00000435 +CSEG PFA_LBRACKET 00000439 +CSEG VE_VARIABLE 0000043d +CSEG XT_VARIABLE 00000443 +CSEG PFA_VARIABLE 00000444 +CSEG XT_HERE 00000645 +CSEG XT_CONSTANT 0000044f +CSEG XT_ALLOT 0000064e +CSEG VE_CONSTANT 00000449 +CSEG PFA_CONSTANT 00000450 +CSEG VE_USER 00000456 +CSEG XT_USER 0000045a +CSEG PFA_USER 0000045b +CSEG PFA_DOUSER 00001c58 +CSEG VE_RECURSE 00000461 +CSEG XT_RECURSE 00000467 +CSEG PFA_RECURSE 00000468 +CSEG VE_IMMEDIATE 0000046c +CSEG XT_IMMEDIATE 00000473 +CSEG PFA_IMMEDIATE 00000474 +CSEG XT_GET_CURRENT 00000515 +CSEG VE_BRACKETCHAR 0000047e +CSEG XT_BRACKETCHAR 00000483 +CSEG PFA_BRACKETCHAR 00000484 +CSEG XT_CHAR 00000971 +CSEG VE_ABORTQUOTE 00000489 +CSEG XT_ABORTQUOTE 0000048e +CSEG PFA_ABORTQUOTE 0000048f +CSEG XT_QABORT 000004a0 +CSEG VE_ABORT 00000493 +CSEG XT_ABORT 00000498 +CSEG PFA_ABORT 00000499 +CSEG VE_QABORT 0000049b +CSEG PFA_QABORT 000004a1 +CSEG QABO1 000004a6 +CSEG VE_GET_STACK 000004a8 +CSEG XT_GET_STACK 000004af +CSEG PFA_N_FETCH_E2 000004c6 +CSEG PFA_N_FETCH_E1 000004bc +CSEG XT_1MINUS 00001e35 +CSEG XT_OVER 00001ccf +CSEG VE_SET_STACK 000004c9 +CSEG XT_SET_STACK 000004d0 +CSEG PFA_SET_STACK 000004d1 +CSEG XT_ZEROLESS 00001d21 +CSEG PFA_SET_STACK0 000004d8 +CSEG PFA_SET_STACK2 000004e5 +CSEG PFA_SET_STACK1 000004e0 +CSEG XT_TUCK 000005fc +CSEG VE_MAPSTACK 000004e7 +CSEG XT_MAPSTACK 000004ee +CSEG PFA_MAPSTACK 000004ef +CSEG PFA_MAPSTACK3 0000050a +CSEG PFA_MAPSTACK1 000004f9 +CSEG XT_R_FETCH 00001d08 +CSEG PFA_MAPSTACK2 00000506 +CSEG VE_GET_CURRENT 0000050d +CSEG PFA_GET_CURRENT 00000516 +ESEG CFG_CURRENT 0000003c +CSEG VE_GET_ORDER 0000051a +CSEG XT_GET_ORDER 00000521 +CSEG PFA_GET_ORDER 00000522 +CSEG VE_CFG_ORDER 00000526 +CSEG XT_CFG_ORDER 0000052d +CSEG PFA_CFG_ORDER 0000052e +CSEG VE_COMPARE 0000052f +CSEG XT_COMPARE 00000535 +CSEG PFA_COMPARE 00000536 +CSEG PFA_COMPARE_LOOP 00000542 +CSEG PFA_COMPARE_NOTEQUAL 00000550 +CSEG PFA_COMPARE_ENDREACHED2 0000054b +CSEG PFA_COMPARE_ENDREACHED 0000054c +CSEG PFA_COMPARE_CHECKLASTCHAR 00000550 +CSEG PFA_COMPARE_DONE 00000552 +CSEG VE_NFA2LFA 00000557 +CSEG XT_NFA2LFA 0000055d +CSEG PFA_NFA2LFA 0000055e +CSEG XT_2SLASH 00001e04 +CSEG VE_ENVIRONMENT 00000563 +CSEG XT_ENVIRONMENT 0000056b +CSEG PFA_ENVIRONMENT 0000056c +ESEG CFG_ENVIRONMENT 0000003a +CSEG VE_ENVWORDLISTS 0000056d +CSEG XT_ENVWORDLISTS 00000574 +CSEG PFA_ENVWORDLISTS 00000575 +CSEG VE_ENVSLASHPAD 00000578 +CSEG XT_ENVSLASHPAD 0000057c +CSEG PFA_ENVSLASHPAD 0000057d +CSEG XT_PAD 0000060a +CSEG XT_MINUS 00001d93 +CSEG VE_ENVSLASHHOLD 00000581 +CSEG XT_ENVSLASHHOLD 00000586 +CSEG PFA_ENVSLASHHOLD 00000587 +CSEG VE_ENV_FORTHNAME 0000058b +CSEG XT_ENV_FORTHNAME 00000592 +CSEG PFA_EN_FORTHNAME 00000593 +CSEG VE_ENV_FORTHVERSION 0000059a +CSEG XT_ENV_FORTHVERSION 000005a0 +CSEG PFA_EN_FORTHVERSION 000005a1 +CSEG VE_ENV_CPU 000005a4 +CSEG XT_ENV_CPU 000005a8 +CSEG PFA_EN_CPU 000005a9 +CSEG XT_ICOUNT 00000853 +CSEG VE_ENV_MCUINFO 000005ad +CSEG XT_ENV_MCUINFO 000005b3 +CSEG PFA_EN_MCUINFO 000005b4 +CSEG VE_ENVUSERSIZE 000005b7 +CSEG XT_ENVUSERSIZE 000005bc +CSEG PFA_ENVUSERSIZE 000005bd +CSEG VE_F_CPU 000005c0 +CSEG XT_F_CPU 000005c5 +CSEG PFA_F_CPU 000005c6 +CSEG VE_STATE 000005cb +CSEG PFA_STATE 000005d1 +DSEG ram_state 0000008f +CSEG VE_BASE 000005d2 +CSEG XT_BASE 000005d6 +CSEG PFA_BASE 000005d7 +CSEG VE_CELLS 000005d8 +CSEG PFA_2STAR 00001e0c +CSEG VE_CELLPLUS 000005de +CSEG PFA_CELLPLUS 000005e4 +CSEG VE_2DUP 000005e7 +CSEG PFA_2DUP 000005ec +CSEG VE_2DROP 000005ef +CSEG PFA_2DROP 000005f5 +CSEG VE_TUCK 000005f8 +CSEG PFA_TUCK 000005fd +CSEG VE_TO_IN 00000600 +CSEG PFA_TO_IN 00000605 +CSEG VE_PAD 00000606 +CSEG PFA_PAD 0000060b +CSEG VE_EMIT 00000610 +CSEG XT_EMIT 00000614 +CSEG PFA_EMIT 00000615 +CSEG XT_UDEFERFETCH 00000c63 +CSEG XT_UDEFERSTORE 00000c6f +CSEG VE_EMITQ 00000618 +CSEG XT_EMITQ 0000061d +CSEG PFA_EMITQ 0000061e +CSEG VE_KEY 00000621 +CSEG XT_KEY 00000625 +CSEG PFA_KEY 00000626 +CSEG VE_KEYQ 00000629 +CSEG XT_KEYQ 0000062d +CSEG PFA_KEYQ 0000062e +CSEG VE_DP 00000631 +ESEG CFG_DP 0000002c +CSEG VE_EHERE 00000638 +CSEG XT_EHERE 0000063d +CSEG PFA_EHERE 0000063e +ESEG EE_EHERE 00000030 +CSEG VE_HERE 00000641 +CSEG PFA_HERE 00000646 +ESEG EE_HERE 0000002e +CSEG VE_ALLOT 00000649 +CSEG PFA_ALLOT 0000064f +CSEG VE_BIN 00000654 +CSEG XT_BIN 00000658 +CSEG PFA_BIN 00000659 +CSEG VE_DECIMAL 0000065d +CSEG XT_DECIMAL 00000663 +CSEG PFA_DECIMAL 00000664 +CSEG VE_HEX 00000669 +CSEG XT_HEX 0000066d +CSEG PFA_HEX 0000066e +CSEG VE_BL 00000673 +CSEG XT_BL 00000676 +CSEG PFA_BL 00000677 +CSEG VE_TURNKEY 00000678 +CSEG XT_TURNKEY 0000067e +CSEG PFA_TURNKEY 0000067f +ESEG CFG_TURNKEY 00000038 +CSEG VE_SLASHMOD 00000682 +CSEG XT_SLASHMOD 00000686 +CSEG PFA_SLASHMOD 00000687 +CSEG PFA_SLASHMOD_1 00000692 +CSEG PFA_SLASHMOD_2 00000698 +CSEG PFA_SLASHMOD_3 0000069b +CSEG PFA_SLASHMOD_5 000006a6 +CSEG PFA_SLASHMOD_4 000006a5 +CSEG PFA_SLASHMODmod_done 000006b1 +CSEG PFA_SLASHMOD_6 000006af +CSEG VE_USLASHMOD 000006b6 +CSEG XT_USLASHMOD 000006bb +CSEG PFA_USLASHMOD 000006bc +CSEG XT_UMSLASHMOD 00001dc2 +CSEG VE_NEGATE 000006c1 +CSEG XT_NEGATE 000006c6 +CSEG PFA_NEGATE 000006c7 +CSEG VE_SLASH 000006ca +CSEG XT_SLASH 000006cd +CSEG PFA_SLASH 000006ce +CSEG VE_MOD 000006d1 +CSEG XT_MOD 000006d5 +CSEG PFA_MOD 000006d6 +CSEG VE_ABS 000006d9 +CSEG XT_ABS 000006dd +CSEG PFA_ABS 000006de +CSEG XT_QNEGATE 00001e3e +CSEG VE_MIN 000006e1 +CSEG XT_MIN 000006e5 +CSEG PFA_MIN 000006e6 +CSEG XT_GREATER 00001d78 +CSEG PFA_MIN1 000006eb +CSEG VE_MAX 000006ed +CSEG XT_MAX 000006f1 +CSEG PFA_MAX 000006f2 +CSEG XT_LESS 00001d6e +CSEG PFA_MAX1 000006f7 +CSEG VE_WITHIN 000006f9 +CSEG XT_WITHIN 000006fe +CSEG PFA_WITHIN 000006ff +CSEG VE_TOUPPER 00000706 +CSEG XT_TOUPPER 0000070c +CSEG PFA_TOUPPER 0000070d +CSEG PFA_TOUPPER0 00000718 +CSEG VE_TOLOWER 00000719 +CSEG XT_TOLOWER 0000071f +CSEG PFA_TOLOWER 00000720 +CSEG PFA_TOLOWER0 0000072b +CSEG VE_HLD 0000072c +CSEG XT_HLD 00000730 +CSEG PFA_HLD 00000731 +DSEG ram_hld 00000091 +CSEG VE_HOLD 00000732 +CSEG XT_HOLD 00000736 +CSEG PFA_HOLD 00000737 +CSEG VE_L_SHARP 00000742 +CSEG XT_L_SHARP 00000745 +CSEG PFA_L_SHARP 00000746 +CSEG VE_SHARP 0000074a +CSEG XT_SHARP 0000074d +CSEG PFA_SHARP 0000074e +CSEG XT_UDSLASHMOD 000007ca +CSEG PFA_SHARP1 0000075b +CSEG VE_SHARP_S 00000760 +CSEG XT_SHARP_S 00000763 +CSEG PFA_SHARP_S 00000764 +CSEG NUMS1 00000764 +CSEG VE_SHARP_G 0000076b +CSEG XT_SHARP_G 0000076e +CSEG PFA_SHARP_G 0000076f +CSEG VE_SIGN 00000776 +CSEG XT_SIGN 0000077a +CSEG PFA_SIGN 0000077b +CSEG PFA_SIGN1 00000781 +CSEG VE_DDOTR 00000782 +CSEG XT_DDOTR 00000786 +CSEG PFA_DDOTR 00000787 +CSEG XT_DABS 00000d5b +CSEG XT_SPACES 00000872 +CSEG XT_TYPE 00000882 +CSEG VE_DOTR 00000795 +CSEG XT_DOTR 00000798 +CSEG PFA_DOTR 00000799 +CSEG VE_DDOT 0000079e +CSEG XT_DDOT 000007a1 +CSEG PFA_DDOT 000007a2 +CSEG VE_DOT 000007a6 +CSEG XT_DOT 000007a9 +CSEG PFA_DOT 000007aa +CSEG VE_UDDOT 000007ad +CSEG PFA_UDDOT 000007b2 +CSEG VE_UDDOTR 000007b6 +CSEG PFA_UDDOTR 000007bb +CSEG VE_UDSLASHMOD 000007c5 +CSEG PFA_UDSLASHMOD 000007cb +CSEG VE_DIGITQ 000007d5 +CSEG XT_DIGITQ 000007da +CSEG PFA_DIGITQ 000007db +CSEG PFA_DOSLITERAL 000007f5 +CSEG VE_SCOMMA 000007ff +CSEG PFA_SCOMMA 00000803 +CSEG PFA_DOSCOMMA 00000807 +CSEG XT_2STAR 00001e0b +CSEG PFA_SCOMMA2 00000819 +CSEG PFA_SCOMMA1 00000813 +CSEG PFA_SCOMMA3 00000820 +CSEG VE_ITYPE 00000822 +CSEG PFA_ITYPE 00000828 +CSEG PFA_ITYPE2 0000083b +CSEG PFA_ITYPE1 00000833 +CSEG XT_LOWEMIT 00000848 +CSEG XT_HIEMIT 00000844 +CSEG PFA_ITYPE3 00000842 +CSEG PFA_HIEMIT 00000845 +CSEG PFA_LOWEMIT 00000849 +CSEG VE_ICOUNT 0000084e +CSEG PFA_ICOUNT 00000854 +CSEG VE_CR 00000859 +CSEG XT_CR 0000085c +CSEG PFA_CR 0000085d +CSEG VE_SPACE 00000864 +CSEG PFA_SPACE 0000086a +CSEG VE_SPACES 0000086d +CSEG PFA_SPACES 00000873 +CSEG SPCS1 00000875 +CSEG SPCS2 0000087c +CSEG VE_TYPE 0000087e +CSEG PFA_TYPE 00000883 +CSEG PFA_TYPE2 0000088d +CSEG PFA_TYPE1 00000888 +CSEG VE_TICK 0000088e +CSEG PFA_TICK 00000892 +CSEG XT_FORTHRECOGNIZER 00000b60 +CSEG XT_RECOGNIZE 00000b36 +CSEG XT_DT_NULL 00000bd1 +CSEG XT_NOOP 00000c06 +CSEG PFA_TICK1 000008a3 +CSEG VE_HANDLER 000008a5 +CSEG XT_HANDLER 000008ab +CSEG PFA_HANDLER 000008ac +CSEG VE_CATCH 000008ad +CSEG XT_CATCH 000008b2 +CSEG PFA_CATCH 000008b3 +CSEG XT_RP_FETCH 00001e76 +CSEG VE_THROW 000008c3 +CSEG PFA_THROW 000008c9 +CSEG PFA_THROW1 000008cf +CSEG XT_RP_STORE 00001e80 +CSEG XT_SP_STORE 00001e96 +CSEG VE_CSKIP 000008dc +CSEG XT_CSKIP 000008e1 +CSEG PFA_CSKIP 000008e2 +CSEG PFA_CSKIP1 000008e3 +CSEG PFA_CSKIP2 000008f0 +CSEG XT_SLASHSTRING 00000a2c +CSEG VE_CSCAN 000008f3 +CSEG XT_CSCAN 000008f8 +CSEG PFA_CSCAN 000008f9 +CSEG PFA_CSCAN1 000008fb +CSEG PFA_CSCAN2 0000090d +CSEG VE_ACCEPT 00000913 +CSEG XT_ACCEPT 00000918 +CSEG PFA_ACCEPT 00000919 +CSEG ACC1 0000091d +CSEG XT_CRLFQ 00000959 +CSEG ACC5 0000094b +CSEG ACC3 0000093b +CSEG ACC6 00000939 +CSEG XT_BS 00000951 +CSEG ACC4 00000949 +CSEG PFA_ACCEPT6 00000942 +CSEG VE_REFILL 00000964 +CSEG XT_REFILL 00000969 +CSEG PFA_REFILL 0000096a +CSEG VE_CHAR 0000096d +CSEG PFA_CHAR 00000972 +CSEG VE_NUMBER 00000976 +CSEG XT_NUMBER 0000097b +CSEG PFA_NUMBER 0000097c +CSEG XT_QSIGN 000009bf +CSEG XT_SET_BASE 000009d2 +CSEG PFA_NUMBER0 00000992 +CSEG XT_2TO_R 00001f1e +CSEG XT_2R_FROM 00001f2d +CSEG XT_TO_NUMBER 000009f0 +CSEG PFA_NUMBER1 000009b4 +CSEG PFA_NUMBER2 000009ab +CSEG PFA_NUMBER6 000009ac +CSEG PFA_NUMBER3 000009a8 +CSEG XT_DNEGATE 00000d68 +CSEG PFA_NUMBER5 000009ba +CSEG PFA_NUMBER4 000009b9 +CSEG PFA_QSIGN 000009c0 +CSEG PFA_NUMBERSIGN_DONE 000009cb +CSEG XT_BASES 000009cd +CSEG PFA_SET_BASE 000009d3 +CSEG SET_BASE1 000009e8 +CSEG SET_BASE2 000009e9 +CSEG VE_TO_NUMBER 000009ea +CSEG TONUM1 000009f1 +CSEG TONUM3 00000a08 +CSEG TONUM2 000009fc +CSEG XT_2SWAP 00000d8c +CSEG VE_PARSE 00000a09 +CSEG PFA_PARSE 00000a0f +CSEG VE_SOURCE 00000a1d +CSEG PFA_SOURCE 00000a23 +CSEG VE_SLASHSTRING 00000a26 +CSEG PFA_SLASHSTRING 00000a2d +CSEG VE_PARSENAME 00000a34 +CSEG PFA_PARSENAME 00000a3c +CSEG XT_SKIPSCANCHAR 00000a3f +CSEG PFA_SKIPSCANCHAR 00000a40 +CSEG VE_FINDXT 00000a51 +CSEG XT_FINDXT 00000a57 +CSEG PFA_FINDXT 00000a58 +CSEG XT_FINDXTA 00000a63 +CSEG PFA_FINDXT1 00000a62 +CSEG PFA_FINDXTA 00000a64 +CSEG XT_SEARCH_WORDLIST 00000cac +CSEG PFA_FINDXTA1 00000a70 +CSEG VE_QUIT 00000a71 +CSEG XT_QUIT 00000a75 +CSEG PFA_QUIT 00000a76 +CSEG XT_SP0 00000b10 +CSEG XT_RP0 00000b1d +CSEG PFA_QUIT2 00000a7e +CSEG PFA_QUIT4 00000a84 +CSEG XT_PROMPTREADY 00000ab4 +CSEG PFA_QUIT3 00000a96 +CSEG XT_INTERPRET 00000b6b +CSEG PFA_QUIT5 00000a94 +CSEG XT_PROMPTERROR 00000acf +CSEG XT_PROMPTOK 00000aa4 +CSEG XT_DEFAULT_PROMPTOK 00000a99 +CSEG PFA_DEFAULT_PROMPTOK 00000a9a +CSEG VE_PROMPTOK 00000aa0 +CSEG PFA_PROMPTOK 00000aa5 +CSEG XT_DEFAULT_PROMPTREADY 00000aa8 +CSEG PFA_DEFAULT_PROMPTREADY 00000aa9 +CSEG VE_PROMPTREADY 00000aaf +CSEG PFA_PROMPTREADY 00000ab5 +CSEG XT_DEFAULT_PROMPTERROR 00000ab8 +CSEG PFA_DEFAULT_PROMPTERROR 00000ab9 +CSEG VE_PROMPTERROR 00000aca +CSEG PFA_PROMPTERROR 00000ad0 +CSEG VE_PAUSE 00000ad3 +CSEG PFA_PAUSE 00000ad9 +DSEG ram_pause 00000093 +CSEG XT_RDEFERFETCH 00000c4f +CSEG XT_RDEFERSTORE 00000c59 +CSEG VE_COLD 00000adc +CSEG clearloop 00000ae8 +DSEG ram_user1 00000095 +CSEG PFA_WARM 00000b03 +CSEG VE_WARM 00000afe +CSEG XT_WARM 00000b02 +CSEG XT_INIT_RAM 00000dd7 +CSEG XT_DEFERSTORE 00000c7a +CSEG VE_SP0 00000b0c +CSEG PFA_SP0 00000b11 +CSEG VE_SP 00000b14 +CSEG XT_SP 00000b17 +CSEG PFA_SP 00000b18 +CSEG VE_RP0 00000b19 +CSEG PFA_RP0 00000b1e +CSEG XT_DORP0 00000b21 +CSEG PFA_DORP0 00000b22 +CSEG VE_DEPTH 00000b23 +CSEG XT_DEPTH 00000b28 +CSEG PFA_DEPTH 00000b29 +CSEG VE_RECOGNIZE 00000b2f +CSEG PFA_RECOGNIZE 00000b37 +CSEG XT_RECOGNIZE_A 00000b41 +CSEG PFA_RECOGNIZE1 00000b40 +CSEG PFA_RECOGNIZE_A 00000b42 +CSEG PFA_RECOGNIZE_A1 00000b52 +CSEG VE_FORTHRECOGNIZER 00000b56 +CSEG PFA_FORTHRECOGNIZER 00000b61 +ESEG CFG_FORTHRECOGNIZER 00000034 +CSEG VE_INTERPRET 00000b64 +CSEG PFA_INTERPRET 00000b6c +CSEG PFA_INTERPRET2 00000b7c +CSEG PFA_INTERPRET1 00000b77 +CSEG VE_DT_NUM 00000b7e +CSEG XT_DT_NUM 00000b83 +CSEG PFA_DT_NUM 00000b84 +CSEG VE_DT_DNUM 00000b87 +CSEG XT_DT_DNUM 00000b8d +CSEG PFA_DT_DNUM 00000b8e +CSEG XT_2LITERAL 00001fd8 +CSEG VE_REC_NUM 00000b91 +CSEG XT_REC_NUM 00000b97 +CSEG PFA_REC_NUM 00000b98 +CSEG PFA_REC_NONUMBER 00000ba3 +CSEG PFA_REC_INTNUM2 00000ba1 +CSEG VE_REC_FIND 00000ba5 +CSEG XT_REC_FIND 00000bab +CSEG PFA_REC_FIND 00000bac +CSEG PFA_REC_WORD_FOUND 00000bb4 +CSEG XT_DT_XT 00000bbb +CSEG VE_DT_XT 00000bb6 +CSEG PFA_DT_XT 00000bbc +CSEG XT_R_WORD_INTERPRET 00000bbf +CSEG XT_R_WORD_COMPILE 00000bc3 +CSEG PFA_R_WORD_INTERPRET 00000bc0 +CSEG PFA_R_WORD_COMPILE 00000bc4 +CSEG PFA_R_WORD_COMPILE1 00000bc9 +CSEG VE_DT_NULL 00000bcb +CSEG PFA_DT_NULL 00000bd2 +CSEG XT_FAIL 00000bd5 +CSEG PFA_FAIL 00000bd6 +CSEG VE_QSTACK 00000bd9 +CSEG PFA_QSTACK 00000bdf +CSEG PFA_QSTACK1 00000be6 +CSEG VE_DOT_VER 00000be7 +CSEG XT_DOT_VER 00000beb +CSEG PFA_DOT_VER 00000bec +CSEG VE_NOOP 00000c02 +CSEG PFA_NOOP 00000c07 +CSEG VE_UNUSED 00000c08 +CSEG XT_UNUSED 00000c0d +CSEG PFA_UNUSED 00000c0e +CSEG VE_TO 00000c12 +CSEG XT_TO 00000c15 +CSEG PFA_TO 00000c16 +CSEG XT_TO_BODY 00000df7 +CSEG PFA_TO1 00000c26 +CSEG PFA_DOTO 00000c21 +CSEG VE_ICELLPLUS 00000c2c +CSEG PFA_ICELLPLUS 00000c33 +CSEG VE_EDEFERFETCH 00000c35 +CSEG PFA_EDEFERFETCH 00000c3c +CSEG VE_EDEFERSTORE 00000c3f +CSEG PFA_EDEFERSTORE 00000c46 +CSEG VE_RDEFERFETCH 00000c49 +CSEG PFA_RDEFERFETCH 00000c50 +CSEG VE_RDEFERSTORE 00000c53 +CSEG PFA_RDEFERSTORE 00000c5a +CSEG VE_UDEFERFETCH 00000c5d +CSEG PFA_UDEFERFETCH 00000c64 +CSEG XT_UP_FETCH 00001f02 +CSEG VE_UDEFERSTORE 00000c69 +CSEG PFA_UDEFERSTORE 00000c70 +CSEG VE_DEFERSTORE 00000c75 +CSEG PFA_DEFERSTORE 00000c7b +CSEG VE_DEFERFETCH 00000c82 +CSEG XT_DEFERFETCH 00000c87 +CSEG PFA_DEFERFETCH 00000c88 +CSEG VE_DODEFER 00000c8e +CSEG XT_DODEFER 00000c94 +CSEG PFA_DODEFER 00000c95 +CSEG VE_SEARCH_WORDLIST 00000ca2 +CSEG PFA_SEARCH_WORDLIST 00000cad +CSEG XT_ISWORD 00000cc1 +CSEG PFA_SEARCH_WORDLIST1 00000cbb +CSEG PFA_ISWORD 00000cc2 +CSEG XT_ICOMPARE 00000d0f +CSEG PFA_ISWORD3 00000ccf +CSEG VE_TRAVERSEWORDLIST 00000cd3 +CSEG PFA_TRAVERSEWORDLIST 00000cdf +CSEG PFA_TRAVERSEWORDLIST1 00000ce0 +CSEG PFA_TRAVERSEWORDLIST2 00000cef +CSEG VE_NAME2STRING 00000cf1 +CSEG PFA_NAME2STRING 00000cfa +CSEG VE_NFA2CFA 00000cff +CSEG PFA_NFA2CFA 00000d06 +CSEG VE_ICOMPARE 00000d09 +CSEG PFA_ICOMPARE 00000d10 +CSEG PFA_ICOMPARE_SAMELEN 00000d1a +CSEG PFA_ICOMPARE_DONE 00000d3d +CSEG PFA_ICOMPARE_LOOP 00000d20 +CSEG PFA_ICOMPARE_LASTCELL 00000d2e +CSEG PFA_ICOMPARE_NEXTLOOP 00000d35 +CSEG VE_STAR 00000d40 +CSEG XT_STAR 00000d43 +CSEG PFA_STAR 00000d44 +CSEG XT_MSTAR 00001da6 +CSEG VE_J 00000d47 +CSEG XT_J 00000d4a +CSEG PFA_J 00000d4b +CSEG VE_DABS 00000d57 +CSEG PFA_DABS 00000d5c +CSEG PFA_DABS1 00000d61 +CSEG VE_DNEGATE 00000d62 +CSEG PFA_DNEGATE 00000d69 +CSEG VE_CMOVE 00000d6e +CSEG XT_CMOVE 00000d73 +CSEG PFA_CMOVE 00000d74 +CSEG PFA_CMOVE1 00000d81 +CSEG PFA_CMOVE2 00000d7d +CSEG VE_2SWAP 00000d87 +CSEG PFA_2SWAP 00000d8d +CSEG VE_REFILLTIB 00000d92 +CSEG XT_REFILLTIB 00000d99 +CSEG PFA_REFILLTIB 00000d9a +CSEG XT_TIB 00000db5 +CSEG XT_NUMBERTIB 00000dbb +CSEG VE_SOURCETIB 00000da5 +CSEG XT_SOURCETIB 00000dac +CSEG PFA_SOURCETIB 00000dad +CSEG VE_TIB 00000db1 +CSEG PFA_TIB 00000db6 +DSEG ram_tib 000000c1 +CSEG VE_NUMBERTIB 00000db7 +CSEG PFA_NUMBERTIB 00000dbc +DSEG ram_sharptib 0000011b +CSEG VE_EE2RAM 00000dbd +CSEG XT_EE2RAM 00000dc2 +CSEG PFA_EE2RAM 00000dc3 +CSEG PFA_EE2RAM_1 00000dc5 +CSEG PFA_EE2RAM_2 00000dcf +CSEG VE_INIT_RAM 00000dd1 +CSEG PFA_INI_RAM 00000dd8 +ESEG EE_INITUSER 00000060 +CSEG VE_BOUNDS 00000de0 +CSEG PFA_BOUNDS 00000de6 +CSEG VE_S2D 00000dea +CSEG PFA_S2D 00000def +CSEG VE_TO_BODY 00000df2 +CSEG PFA_1PLUS 00001e30 +CSEG VE_DOTS 00000df8 +CSEG XT_DOTS 00000dfb +CSEG PFA_DOTS 00000dfc +CSEG PFA_DOTS2 00000e0a +CSEG PFA_DOTS1 00000e05 +CSEG VE_SPIRW 00000e0b +CSEG XT_SPIRW 00000e10 +CSEG PFA_SPIRW 00000e11 +CSEG do_spirw 00000e15 +CSEG do_spirw1 00000e16 +CSEG VE_N_SPIR 00000e1e +CSEG XT_N_SPIR 00000e23 +CSEG PFA_N_SPIR 00000e24 +CSEG PFA_N_SPIR_LOOP 00000e29 +CSEG PFA_N_SPIR_LOOP1 00000e2a +CSEG VE_N_SPIW 00000e35 +CSEG XT_N_SPIW 00000e3a +CSEG PFA_N_SPIW 00000e3b +CSEG PFA_N_SPIW_LOOP 00000e40 +CSEG PFA_N_SPIW_LOOP1 00000e42 +CSEG VE_APPLTURNKEY 00000e4c +CSEG XT_APPLTURNKEY 00000e54 +CSEG PFA_APPLTURNKEY 00000e55 +CSEG VE_SET_CURRENT 00000e66 +CSEG XT_SET_CURRENT 00000e6e +CSEG PFA_SET_CURRENT 00000e6f +CSEG VE_WORDLIST 00000e73 +CSEG XT_WORDLIST 00000e79 +CSEG PFA_WORDLIST 00000e7a +CSEG VE_FORTHWORDLIST 00000e83 +CSEG XT_FORTHWORDLIST 00000e8c +CSEG PFA_FORTHWORDLIST 00000e8d +ESEG CFG_FORTHWORDLIST 0000003e +CSEG VE_SET_ORDER 00000e8e +CSEG XT_SET_ORDER 00000e95 +CSEG PFA_SET_ORDER 00000e96 +CSEG VE_SET_RECOGNIZERS 00000e9a +CSEG XT_SET_RECOGNIZERS 00000ea4 +CSEG PFA_SET_RECOGNIZERS 00000ea5 +ESEG CFG_RECOGNIZERLISTLEN 00000052 +CSEG VE_GET_RECOGNIZERS 00000ea9 +CSEG XT_GET_RECOGNIZERS 00000eb3 +CSEG PFA_GET_RECOGNIZERS 00000eb4 +CSEG VE_CODE 00000eb8 +CSEG XT_CODE 00000ebc +CSEG PFA_CODE 00000ebd +CSEG VE_ENDCODE 00000ec3 +CSEG XT_ENDCODE 00000ec9 +CSEG PFA_ENDCODE 00000eca +CSEG VE_MARKER 00000ecf +CSEG XT_MARKER 00000ed5 +CSEG PFA_MARKER 00000ed6 +ESEG EE_MARKER 0000005e +CSEG VE_POSTPONE 00000ed9 +CSEG XT_POSTPONE 00000edf +CSEG PFA_POSTPONE 00000ee0 +CSEG VE_2R_FETCH 00000eee +CSEG XT_2R_FETCH 00000ef2 +CSEG PFA_2R_FETCH 00000ef3 +SET DPSTART 00000f02 +CSEG DO_INTERRUPT 00001c14 +CSEG DO_EXECUTE 00001c0d +CSEG VE_EXIT 00001c1c +CSEG PFA_EXIT 00001c21 +CSEG VE_EXECUTE 00001c24 +CSEG PFA_EXECUTE 00001c2b +CSEG PFA_DOBRANCH 00001c30 +CSEG PFA_DOCONDBRANCH 00001c37 +CSEG PFA_DOLITERAL 00001c3e +CSEG XT_DOVARIABLE 00001c47 +CSEG XT_DOCONSTANT 00001c51 +CSEG XT_DOUSER 00001c57 +CSEG VE_DOVALUE 00001c63 +CSEG XT_DOVALUE 00001c69 +CSEG PFA_DOVALUE 00001c6a +CSEG VE_FETCH 00001c76 +CSEG PFA_FETCH 00001c7a +CSEG PFA_FETCHRAM 00001c7a +CSEG VE_STORE 00001c7e +CSEG PFA_STORE 00001c82 +CSEG PFA_STORERAM 00001c82 +CSEG VE_CSTORE 00001c8a +CSEG PFA_CSTORE 00001c8e +CSEG VE_CFETCH 00001c95 +CSEG PFA_CFETCH 00001c99 +CSEG VE_FETCHU 00001c9d +CSEG XT_FETCHU 00001ca0 +CSEG PFA_FETCHU 00001ca1 +CSEG VE_STOREU 00001ca5 +CSEG XT_STOREU 00001ca8 +CSEG PFA_STOREU 00001ca9 +CSEG VE_DUP 00001cad +CSEG PFA_DUP 00001cb2 +CSEG VE_QDUP 00001cb5 +CSEG PFA_QDUP 00001cba +CSEG PFA_QDUP1 00001cbf +CSEG VE_SWAP 00001cc0 +CSEG PFA_SWAP 00001cc5 +CSEG VE_OVER 00001ccb +CSEG PFA_OVER 00001cd0 +CSEG VE_DROP 00001cd5 +CSEG PFA_DROP 00001cda +CSEG VE_ROT 00001cdd +CSEG PFA_ROT 00001ce2 +CSEG VE_NIP 00001cec +CSEG PFA_NIP 00001cf1 +CSEG VE_R_FROM 00001cf3 +CSEG PFA_R_FROM 00001cf7 +CSEG VE_TO_R 00001cfc +CSEG PFA_TO_R 00001d00 +CSEG VE_R_FETCH 00001d05 +CSEG PFA_R_FETCH 00001d09 +CSEG VE_NOTEQUAL 00001d10 +CSEG PFA_NOTEQUAL 00001d14 +CSEG VE_ZEROEQUAL 00001d17 +CSEG PFA_ZEROEQUAL 00001d1b +CSEG PFA_ZERO1 00001d57 +CSEG PFA_TRUE1 00001d4e +CSEG VE_ZEROLESS 00001d1e +CSEG PFA_ZEROLESS 00001d22 +CSEG VE_GREATERZERO 00001d25 +CSEG PFA_GREATERZERO 00001d29 +CSEG VE_DGREATERZERO 00001d2e +CSEG XT_DGREATERZERO 00001d32 +CSEG PFA_DGREATERZERO 00001d33 +CSEG VE_DXT_ZEROLESS 00001d3c +CSEG XT_DXT_ZEROLESS 00001d40 +CSEG PFA_DXT_ZEROLESS 00001d41 +CSEG VE_TRUE 00001d47 +CSEG PFA_TRUE 00001d4c +CSEG VE_ZERO 00001d51 +CSEG PFA_ZERO 00001d55 +CSEG VE_ULESS 00001d59 +CSEG PFA_ULESS 00001d5d +CSEG VE_UGREATER 00001d64 +CSEG PFA_UGREATER 00001d68 +CSEG VE_LESS 00001d6b +CSEG PFA_LESS 00001d6f +CSEG PFA_LESSDONE 00001d73 +CSEG VE_GREATER 00001d75 +CSEG PFA_GREATER 00001d79 +CSEG PFA_GREATERDONE 00001d7d +CSEG VE_LOG2 00001d80 +CSEG XT_LOG2 00001d84 +CSEG PFA_LOG2 00001d85 +CSEG PFA_LOG2_1 00001d88 +CSEG PFA_LOG2_2 00001d8e +CSEG VE_MINUS 00001d90 +CSEG PFA_MINUS 00001d94 +CSEG VE_PLUS 00001d9a +CSEG PFA_PLUS 00001d9e +CSEG VE_MSTAR 00001da3 +CSEG PFA_MSTAR 00001da7 +CSEG VE_UMSLASHMOD 00001dbd +CSEG PFA_UMSLASHMOD 00001dc3 +CSEG PFA_UMSLASHMODmod 00001dc8 +CSEG PFA_UMSLASHMODmod_loop 00001dc9 +CSEG PFA_UMSLASHMODmod_loop_control 00001dd6 +CSEG PFA_UMSLASHMODmod_subtract 00001dd3 +CSEG PFA_UMSLASHMODmod_done 00001dd8 +CSEG VE_UMSTAR 00001ddc +CSEG PFA_UMSTAR 00001de1 +CSEG VE_INVERT 00001df8 +CSEG PFA_INVERT 00001dfe +CSEG VE_2SLASH 00001e01 +CSEG PFA_2SLASH 00001e05 +CSEG VE_2STAR 00001e08 +CSEG VE_AND 00001e0f +CSEG PFA_AND 00001e14 +CSEG VE_OR 00001e19 +CSEG PFA_OR 00001e1d +CSEG VE_XOR 00001e22 +CSEG XT_XOR 00001e26 +CSEG PFA_XOR 00001e27 +CSEG VE_1PLUS 00001e2c +CSEG VE_1MINUS 00001e32 +CSEG PFA_1MINUS 00001e36 +CSEG VE_QNEGATE 00001e38 +CSEG PFA_QNEGATE 00001e3f +CSEG QNEG1 00001e43 +CSEG VE_LSHIFT 00001e44 +CSEG XT_LSHIFT 00001e49 +CSEG PFA_LSHIFT 00001e4a +CSEG PFA_LSHIFT1 00001e4d +CSEG PFA_LSHIFT2 00001e52 +CSEG VE_RSHIFT 00001e53 +CSEG XT_RSHIFT 00001e58 +CSEG PFA_RSHIFT 00001e59 +CSEG PFA_RSHIFT1 00001e5c +CSEG PFA_RSHIFT2 00001e61 +CSEG VE_PLUSSTORE 00001e62 +CSEG PFA_PLUSSTORE 00001e66 +CSEG VE_RP_FETCH 00001e72 +CSEG PFA_RP_FETCH 00001e77 +CSEG VE_RP_STORE 00001e7c +CSEG PFA_RP_STORE 00001e81 +CSEG VE_SP_FETCH 00001e89 +CSEG PFA_SP_FETCH 00001e8e +CSEG VE_SP_STORE 00001e92 +CSEG PFA_SP_STORE 00001e97 +CSEG PFA_DODO 00001e9c +CSEG PFA_DODO1 00001e9e +CSEG VE_I 00001ea9 +CSEG PFA_I 00001ead +CSEG PFA_DOPLUSLOOP 00001ebb +CSEG PFA_DOPLUSLOOP_LEAVE 00001ec5 +CSEG PFA_DOPLUSLOOP_NEXT 00001ec2 +CSEG PFA_DOLOOP 00001eca +CSEG VE_UNLOOP 00001ecf +CSEG PFA_UNLOOP 00001ed5 +CSEG VE_CMOVE_G 00001eda +CSEG XT_CMOVE_G 00001edf +CSEG PFA_CMOVE_G 00001ee0 +CSEG PFA_CMOVE_G1 00001ef1 +CSEG PFA_CMOVE_G2 00001eed +CSEG VE_BYTESWAP 00001ef6 +CSEG PFA_BYTESWAP 00001efa +CSEG VE_UP_FETCH 00001efe +CSEG PFA_UP_FETCH 00001f03 +CSEG VE_UP_STORE 00001f07 +CSEG XT_UP_STORE 00001f0b +CSEG PFA_UP_STORE 00001f0c +CSEG VE_1MS 00001f10 +CSEG XT_1MS 00001f14 +CSEG PFA_1MS 00001f15 +CSEG VE_2TO_R 00001f1a +CSEG PFA_2TO_R 00001f1f +CSEG VE_2R_FROM 00001f29 +CSEG PFA_2R_FROM 00001f2e +CSEG VE_STOREE 00001f38 +CSEG PFA_STOREE 00001f3c +CSEG PFA_STOREE0 00001f3c +CSEG PFA_FETCHE2 00001f6a +CSEG PFA_STOREE3 00001f46 +CSEG PFA_STOREE1 00001f51 +CSEG PFA_STOREE4 00001f4d +CSEG PFA_STOREE2 00001f53 +CSEG VE_FETCHE 00001f5c +CSEG PFA_FETCHE 00001f60 +CSEG PFA_FETCHE1 00001f60 +CSEG VE_STOREI 00001f70 +CSEG PFA_STOREI 00001f74 +ESEG EE_STOREI 0000005c +CSEG VE_DO_STOREI_NRWW 00001f77 +CSEG XT_DO_STOREI 00001f7e +CSEG PFA_DO_STOREI_NRWW 00001f7f +CSEG DO_STOREI_atmega 00001f93 +CSEG pageload 00001fa4 +CSEG DO_STOREI_writepage 00001f9d +CSEG dospm 00001fbd +EQU pagemask ffffffc0 +CSEG pageload_loop 00001faa +CSEG pageload_newdata 00001fb5 +CSEG pageload_cont 00001fb7 +CSEG pageload_done 00001fbc +CSEG dospm_wait_ee 00001fbd +CSEG dospm_wait_spm 00001fbf +CSEG VE_FETCHI 00001fc8 +CSEG PFA_FETCHI 00001fcc +CSEG VE_2LITERAL 00001fd2 +CSEG PFA_2LITERAL 00001fd9 +CSEG VE_EQUAL 00001fdd +CSEG PFA_EQUAL 00001fe1 +CSEG VE_ONE 00001fe4 +CSEG PFA_ONE 00001fe8 +CSEG VE_TWO 00001fe9 +CSEG PFA_TWO 00001fed +CSEG VE_MINUSONE 00001fee +CSEG XT_MINUSONE 00001ff1 +CSEG PFA_MINUSONE 00001ff2 +SET flashlast 00001ff3 +DSEG HERESTART 0000011d +ESEG EHERESTART 00000084 +ESEG CFG_ORDERLIST 00000042 +ESEG CFG_RECOGNIZERLIST 00000054 +EQU UBRR_VAL 0000000c +EQU BAUD_REAL 0000963d +EQU BAUD_ERROR 00000001 diff --git a/amforth-6.5/appl/eval-pollin/p16-8.xml b/amforth-6.5/appl/eval-pollin/p16-8.xml new file mode 100644 index 0000000..eba211c --- /dev/null +++ b/amforth-6.5/appl/eval-pollin/p16-8.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + Uploading Hexfiles for p16-8 + + + + Writing fuses + + + + diff --git a/amforth-6.5/appl/eval-pollin/p32-16.xml b/amforth-6.5/appl/eval-pollin/p32-16.xml new file mode 100644 index 0000000..59444f3 --- /dev/null +++ b/amforth-6.5/appl/eval-pollin/p32-16.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + Uploading Hexfiles for p32-16 + + + + Download Hexfiles from p32-16 + + + + Writing fuses + + + + diff --git a/amforth-6.5/appl/eval-pollin/p32-8.eep.hex b/amforth-6.5/appl/eval-pollin/p32-8.eep.hex new file mode 100644 index 0000000..a59fb2c --- /dev/null +++ b/amforth-6.5/appl/eval-pollin/p32-8.eep.hex @@ -0,0 +1,7 @@ +:10002A00FFFF1B0B1D018400C309520010086D0A53 +:0A003A00F4023E00ED3F01003E001D +:06005200020065065106E4 +:10005C007E3B5E00000000005F080F080F080000E8 +:10006C000A009800A6006D0088006C02000059027E +:08007C00C93CE83CD83C0C0033 +:00000001FF diff --git a/amforth-6.5/appl/eval-pollin/p32-8.hex b/amforth-6.5/appl/eval-pollin/p32-8.hex new file mode 100644 index 0000000..91b0f2b --- /dev/null +++ b/amforth-6.5/appl/eval-pollin/p32-8.hex @@ -0,0 +1,628 @@ +:020000020000FC +:020004001BD10E +:0200080019D10C +:02000C0017D10A +:0200100015D108 +:0200140013D106 +:0200180011D104 +:02001C000FD102 +:020020000DD100 +:020024000BD1FE +:0200280009D1FC +:02002C0007D1FA +:0200300005D1F8 +:0200340003D1F6 +:0200380001D1F4 +:02003C00FFD0F3 +:02004000FDD0F1 +:02004400FBD0EF +:02004800F9D0ED +:02004C00F7D0EB +:10005000F5D00008000400701500080041546D65DB +:100060006761333207FF3E72782D627566000000CB +:100070003900082F10917000E0E6F0E0E10FF31D69 +:10008000008313951F7010937000899199910C94BF +:10009000053806FF6973722D7278320001383D38D9 +:1000A0002C009838B1383D380300DF3F363859000E +:1000B000383D3800203801383D384E003D381A00B0 +:1000C000A53C3D3860003D3816005439983E203834 +:1000D00006FF72782D62756649000138880036384F +:1000E0006E003D3871009838B1383D3860009D3958 +:1000F0009838C4382F3A3D380F00133A3D38710014 +:100100008D38203807FF72783F2D627566006800D1 +:100110000138303D3D38710098383D3870009838CE +:100120001339203807FF74782D706F6C6C008200D3 +:100130000138A600363899003D382C008D3820381B +:1001400008FF74783F2D706F6C6C92000138303D61 +:100150003D382B0098383D382000133A203804FFF2 +:1001600075627272A0006F388200A03DAA3D06FF42 +:100170002B7573617274AF0001383D3898003D38BB +:100180002A008D383D3806003D38C0008D38B30058 +:10019000B138F93A3D3840008D383D3829008D3866 +:1001A0005B00203808FF31772E7265736574B700E5 +:1001B000D9009A938A93BC9AC498E0ECF3E0319703 +:1001C000F1F71FB7F894C49ABC98E0E8F0E03197D3 +:1001D000F1F786B384FF9FEF1FBFBC98C498E0E49B +:1001E000F3E03197F1F7892F0C94053807FF317749 +:1001F0002E736C6F7400D200FD00C498BC9A1FB7B8 +:10020000F894ECE0F0E03197F1F78894879510F4DA +:10021000C49ABC98E2E1F0E03197F1F706B304FD2F +:100220008068E6E6F0E03197F1F7C49ABC98E4E024 +:0C023000F0E03197F1F71FBF0C94053887 +:040000000C94393DE6 +:10023C000A920FB60A920F900F900A94B02CFF936B +:10024C00EF93E2E7F0E00694E00DF31D00800394D9 +:10025C000082EF91FF9109900FBE0990089502FF63 +:10026C006D2BF6000138C73F153C203803FF756431 +:10027C002A0035010138B138FF38E039D938C43893 +:10028C00F638E039E1389D39203804FF756D617816 +:10029C003C010138C93E5C3936385501C438D9386F +:1002AC00203804FF756D696E4B010138C93E673902 +:1002BC0036386101C438D938203801383D380080CF +:1002CC00133A1A3936386C01E63F20384B3920384E +:1002DC000AFF6E616D653E666C616773570101388C +:1002EC00CB3B3D3800FF133A203803FF7665720094 +:1002FC006E010138CF02F803AE3FBD3E7938DD0206 +:10030C00413FC73F16031E033D382E00070334033D +:10031C003F032E04BD3E8138AE3FE502F803203882 +:10032C0004FF6E6F6F707B010138203806FF756E0D +:10033C0075736564960101388D3A233F93392038E3 +:10034C000200746F9C0101383D04D03FB73E7938F0 +:10035C003638BA015107B4015C0720380138F63839 +:10036C00B138C601FF38CB3BB138C601C601CB3B17 +:10037C002A38203807FF692D63656C6C2B00A601A9 +:10038C0001382F3A203808FF69636F6D7061726510 +:10039C00C0010138FF38CF38F63813393638DA0156 +:1003AC00D23ED9384B392038C43854391B0836382A +:1003BC00FD019B3ACF387938CF38CB3BB1383D383B +:1003CC0000015C393638EE01C4383D38FF00133A71 +:1003DC0013393638F501D23E4B39D43A20382F3AFE +:1003EC00C438903CC4383D380200BA3AE001D23EE1 +:1003FC005439203801FF2A00C9010138A639D938EF +:10040C00203801FF6A0000020138763A3D380700B7 +:10041C009D397938763A3D3809009D3979389D39BE +:10042C00203804FF6461627307020138B138213946 +:10043C00363821022802203807FF646E6567617424 +:10044C006500170201383B3CE63F5439153C203817 +:10045C0005FF636D6F76650022023402BF93AF9384 +:10046C00E991F991A991B991092F082B21F01D91CE +:10047C0011930197E1F7AF91BF91899199910C94E8 +:10048C00053805FF3273776170002E020138E138B0 +:10049C00FF38E138F63820380AFF726566696C6CF3 +:1004AC002D7469624702013875023D385A008D047B +:1004BC007B0281385439E23E81384B3920380AFFAF +:1004CC00736F757263652D7469625202013875021F +:1004DC007B027938203803FF746962006502483862 +:1004EC00870004FF2374696271024838E10006FF3B +:1004FC0065653E72616D7702013854399B3ACF388D +:10050C005F3BCF388138903CC438903CC438C93AF2 +:10051C008502D23E203808FF696E69742D72616DB8 +:10052C007D0201383D386000023B3D382200043A20 +:10053C00820220380BFF656E7669726F6E6D656E88 +:10054C007400910248383A0009FF776F72646C6945 +:10055C0073747300000001383D380800203804FF24 +:10056C002F706164AA0201388D3AE83E9339203825 +:10057C0005FF2F686F6C6400B5020138E83E233F1D +:10058C00933920380AFF666F7274682D6E616D6541 +:10059C00BE020138C5030700616D666F7274680096 +:1005AC00203807FF76657273696F6E00C8020138D8 +:1005BC003D384100203803FF63707500D7020138C5 +:1005CC003D382D002404203808FF6D63752D696EAD +:1005DC00666FE10201383D382900203805FF2F7580 +:1005EC0073657200EA0201383D382C00203803FF95 +:1005FC00686C6400A0024838E30004FF686F6C6408 +:10060C00FD0201380103B1387938353AB138FF3879 +:10061C00C4388138F6388D38203802FF3C23030368 +:10062C000138E83E01038138203801FF2300130311 +:10063C000138BD3E79389B03E1383D380900CF388D +:10064C006E3936382C033D3807009D393D38300063 +:10065C009D390703203802FF23731B0301381E0347 +:10066C00C93E1C3A1A3936383503203802FF233E6E +:10067C0031030138D23E01037938E83ECF38933943 +:10068C00203804FF7369676E3C0301382139363812 +:10069C0052033D382D000703203803FF642E7200EF +:1006AC0047030138FF38DA3E1B0216033403E138E6 +:1006BC004B033F03F638CF389339B73F2E0420381D +:1006CC0002FF2E7253030138FF38C73FF638570329 +:1006DC00203802FF642E6603013854395703AE3FAD +:1006EC00203801FF2E006F030138C73F72032038FA +:1006FC0003FF75642E007703013854398B03AE3F2A +:10070C00203804FF75642E727E030138FF381603FF +:10071C0034033F03F638CF389339B73F2E042038D3 +:10072C0006FF75642F6D6F6487030138FF385439E9 +:10073C000839C239F638C438FF38C239F63820388F +:10074C0006FF64696769743F96030138663FB138E8 +:10075C003D38390078393D380001133A9D39B138AC +:10076C003D38400178393D380701133A93393D380B +:10077C0030009339B138BD3E79385C3920380138B6 +:10078C0008392404F638CF382F3A043A9D392F3AD9 +:10079C00FF38203802FF732CA6030138B138D70379 +:1007AC00203801385C07B138043ADA3E0B3A9339F9 +:1007BC00FF3854391B083638EA039B3AB13879387C +:1007CC005C07903CC93AE403F63828393638F10313 +:1007DC00B13898385C07D938203805FF69747970BE +:1007EC006500D0030138B138043ADA3E0B3A93393C +:1007FC00FF3854391B0836380C049B3AB138CB3BC4 +:10080C00B138190415042F3AC93A0404F6382839BA +:10081C0036381304B138CB3B1904D9382038013899 +:10082C00F93A1904203801383D38FF00133AF23EEA +:10083C00203806FF69636F756E74F3030138B138A5 +:10084C002F3AC438CB3B203804FF747970651F04F1 +:10085C000138993F1B08363839049B3AAC3A983822 +:10086C00F23EC93A3404203801FF27002A0401382B +:10087C00B005F305FE05B1388B06DF3FC438CB3B22 +:10088C003D389A01DF3F1C3A36384F043D38F3FFB0 +:10089C00863DD938203805FF63736B6970003A04C4 +:1008AC000138FF38B13836386504CF3898380839F4 +:1008BC00DF3F36386504E63FA1052F385804F6387B +:1008CC00D938203805FF637363616E005104013819 +:1008DC00FF38CF38B13898380839DF3F1A393638F5 +:1008EC008204C438353AC438CF3821391A393638ED +:1008FC0082042F3A2F387004F038CF389339F638F9 +:10090C00D938203806FF6163636570746804013858 +:10091C00CF389D39353ACF38033FB138CE041A3928 +:10092C003638C004B1383D380800DF3F3638B004E3 +:10093C00D938E138C93E7839FF38E138E138F63832 +:10094C003638AE04C604353AFF38CF38F6384F0186 +:10095C002F38BE04B138543F6E393638B704D93805 +:10096C00543FB138F23ECF388D382F3ACF385B0137 +:10097C002F389204D938F038C4389339A13F203835 +:10098C0001383D380800B138F23EAE3FF23E203817 +:10099C000138B1383D380D00DF3FC4383D380A000E +:1009AC00DF3F1C3A203806FF726566696C6C880460 +:1009BC00FF3D1A00C83DD43D04FF63686172D90441 +:1009CC000138B005D9389838203806FF6E756D623D +:1009DC006572E2040138BD3E7938FF383405FF38C2 +:1009EC0047053405F6381C3AFF38B1381A39363811 +:1009FC000705D23EF638D938F638BD3E8138543921 +:100A0C0020381E3B543954392D3B6505B9383638DE +:100A1C002905E63FDF3F3638200598383D382E0053 +:100A2C00DF3F36382105F63836381D052802EB3FF6 +:100A3C002F382F05D938D23EF638D938F638BD3E86 +:100A4C00813854392038D23EF63836382E05273EB8 +:100A5C00E63FF638BD3E81384B3920380138CF3867 +:100A6C0098383D382D00DF3FB138FF383638400517 +:100A7C00E63FA105F638203852380A001000020073 +:100A8C000A000138CF3898383D3823009339B138F3 +:100A9C0054393D380400573E36385D0542059D39C2 +:100AAC00CB3BBD3E8138E63FA1052F385E05D938DA +:100ABC00203807FF3E6E756D62657200EB040138DD +:100ACC00B13836387D05CF389838AB031A393638FB +:100ADC007105D9382038FF384C02BD3E79384001B9 +:100AEC00F63838014C02E63FA1052F386605203850 +:100AFC0005FF7061727365005F050138FF3897055B +:100B0C00E23E7938A105F6386D04B1382F3AE23E51 +:100B1C00653AE63FA105203806FF736F7572636571 +:100B2C007E05FF3D1600C83DD43D07FF2F73747240 +:100B3C00696E670092050138E138CF389D39E1388C +:100B4C00E138933920380AFF70617273652D6E613C +:100B5C006D659B050138543FB40520380138FF38CA +:100B6C009705E23E7938A10508395604F6386D042C +:100B7C00C93E9D399705D9389339E23E81382038E2 +:100B8C0003FF73703000A9056F380600C83DD43DD3 +:100B9C0002FF7370C6055838080003FF72703000EE +:100BAC00CE050138DB05793820385838040005FFAC +:100BBC00646570746800D3050138CA058D3A9339A1 +:100BCC00043A353A203810FF666F7274682D7265DE +:100BDC00636F676E697A6572DD056F383400A03D0E +:100BEC00AA3D09FF7265636F676E697A6500E90556 +:100BFC0001383D380906C4389C091A3936380806BC +:100C0C00D23E8B0620380138E138E138C93E1E3B14 +:100C1C00E1382A382D3BE138B1388B06DF3F3638C6 +:100C2C001A06D93854392038F038F0384B39203876 +:100C3C0009FF696E7465727072657400F70501388E +:100C4C00B005B13836383606F305FE05B73E7938AF +:100C5C0036383106C601CB3B2A388B3F2F38260657 +:100C6C00D23E203806FF64743A6E756D1E065238FB +:100C7C009A017207720707FF64743A646E756D000F +:100C8C00380652389A01D73FD73F07FF7265633A4F +:100C9C006E756D0041060138F00436385D06E63F8E +:100CAC00DF3F36385B063D062038470620388B067A +:100CBC00203808FF7265633A66696E644B0601382A +:100CCC000007B1381A3936386E06D9388B062038F9 +:100CDC007506203805FF64743A7874005F06523844 +:100CEC0079067D06D73F0138D9382A3820380138A3 +:100CFC002139363883065C0720382A38203807FF1C +:100D0C0064743A6E756C6C00700652388F068F06E0 +:100D1C008F0601383D38F3FF863D0FFF7365617216 +:100D2C0063682D776F72646C697374008506013883 +:100D3C00FF3854393D38B206F638CF06B1381A3977 +:100D4C003638AC06D23ED93854392038B138F6068C +:100D5C00C4387501630120380138FF38D938C93ED1 +:100D6C000839EA06CF013638C006F638D938543976 +:100D7C004B392038D23EF6385439203811FF747272 +:100D8C006176657273652D776F72646C697374002C +:100D9C00930601385F3BB1383638E006C93E1E3B3E +:100DAC00C4382A382D3BE1383638E0060B0ACB3BE9 +:100DBC002F38D106D23E20380BFF6E616D653E7325 +:100DCC007472696E6700C406013824043D38FF0054 +:100DDC00133A203807FF6E66613E63666100E206D7 +:100DEC0001380B0A2F3A203807FF66696E642D789C +:100DFC007400F00601383D380C073D3840009C0962 +:100E0C001A3936380B07D23E543920380138FF389E +:100E1C00C93EF6389D06B13836381907FF38F03818 +:100E2C00F038F6384B39203806FF6E6577657374E9 +:100E3C00FA064838E50006FF6C61746573741A078E +:100E4C004838E90008FF2863726561746529210739 +:100E5C000138B0058508B1381F07903C81386A0805 +:100E6C001F078138203801005C00280701389705DE +:100E7C00F038E23E8138203801002800390701386B +:100E8C003D3829008305D23E203807FF636F6D7013 +:100E9C00696C650042070138F638B138C601FF3875 +:100EAC00CB3B5C07203801FF2C004B070138123F6D +:100EBC00733B123F2F3AB401133F203803005B27DA +:100ECC005D00590701383D047207203807006C6932 +:100EDC00746572616C006407013851073D385C071A +:100EEC0020380800736C69746572616C6C0701388A +:100EFC005107C503D30320380138123F5107FFFFB8 +:100F0C00203801388B3F123FC438733B20380138EE +:100F1C00123F203801388B3F5C0720380500616890 +:100F2C00656164007707013851072F388207203834 +:100F3C000200696694070138510736388207203859 +:100F4C000400656C73659E07013851072F388207C2 +:100F5C00C4388707203804007468656EA60701380A +:100F6C00870720380500626567696E00B107013894 +:100F7C008D07203805007768696C6500B807013863 +:100F8C00A107C43820380600726570656174C0070B +:100F9C000138E207B50720380500756E74696C00DE +:100FAC00C90701383D3836385C07900720380500F2 +:100FBC00616761696E00D207013851072F389007BD +:100FCC0020380200646FDD07013851079B3A8D070A +:100FDC0054394508203804006C6F6F70E7070138EE +:100FEC005107C93A2C08203805002B6C6F6F700024 +:100FFC00F10701385107BA3A2C08203805006C6506 +:10100C0061766500FA0701385107D43A990745080B +:10101C00203803003F646F000408013851071B0897 +:10102C00A107EA07C438450820380138C93EDF3F1C +:10103C00B138FF3836382308D23EF638FD3920381F +:10104C0007FF656E646C6F6F70000F0801389007B6 +:10105C003908B93836383508B5072F382E082038F6 +:10106C0002FF6C3E260801385808793879383D382B +:10107C00FEFF5808653A203802FF3E6C36080138EE +:10108C00EB3F5808653A580879388138203803FF07 +:10109C006C70300042086F383600A03DAA3D02FF4C +:1010AC006C704D084838EB0006FF6372656174651F +:1010BC00550801382E078E0851075238203806FF84 +:1010CC006865616465725A080138123FFF38FF3851 +:1010DC00B138283936387C08B1383D3800FF1C3A15 +:1010EC00D703F6385F3B5C07F63820383D38F0FF05 +:1010FC00863D07FF776C73636F7065006508FF3D75 +:10110C003200A03DAA3D06FF72657665616C7F08D2 +:10111C0001381F07903C7938B938363899081F07C1 +:10112C007938C4383B3B20380500646F65733E004A +:10113C00890801385107B20851070E945107A708C6 +:10114C0020389A938A93CB0101967F916F91BF932C +:10115C00AF93DB010C9405380138F6381F07903C2F +:10116C0079385F3BF606733B203801FF3A009A084A +:10117C0001382E07C908D938203807FF3A6E6F6E30 +:10118C00616D6500BB080138123FB1382607813804 +:10119C0051070138DE08203801003B00C308013834 +:1011AC0051072038E6088E08203801FF5D00D20870 +:1011BC000138E63FB73E8138203801005B00DB0880 +:1011CC0001385439B73E8138203808FF766172698E +:1011DC0061626C65E3080138233FFD08EB3F2C3F4F +:1011EC00203808FF636F6E7374616E74EB080138FE +:1011FC002E078E08510748385C07203804FF75739A +:10120C006572F70801382E078E08510758385C07AD +:10121C002038070072656375727365000409013824 +:10122C00260779385C07203809FF696D6D6564699C +:10123C00617465000F090138C3095F3BB138CB3BC2 +:10124C003D38FF7F133AC438733B203806005B638C +:10125C006861725D1A09013851073D38E6045C0774 +:10126C002038060061626F7274222C0901388A3EA4 +:10127C0051074E09203805FF61626F7274003709FF +:10128C0001384B39863D06FF3F61626F727441092C +:10129C000138E13836385409F8034609D23E203873 +:1012AC0009FF6765742D737461636B00490901381C +:1012BC00B138903CC4385F3BB138FF385439C4382E +:1012CC001B08363874099B3AAC3A353AC43ECF38D1 +:1012DC009D395F3BC4384B39BA3A6A09D23EF6386D +:1012EC00203809FF7365742D737461636B005609A4 +:1012FC000138CF382139363886093D38FCFF863D18 +:10130C00C93E3B3BC43854391B08363893099B3AC9 +:10131C00903CDA3E3B3BC93A8E09D938203809FF5C +:10132C006D61702D737461636B0077090138B1388E +:10133C00903CC4385F3BC43E993F1B083638B80913 +:10134C009B3AAC3A5F3BC438FF3808392A38B93875 +:10135C003638B409F638D938D43A2038F638EB3F59 +:10136C00BA3AA709D938543920380BFF6765742D60 +:10137C0063757272656E7400950901383D383C00D6 +:10138C005F3B203809FF6765742D6F7264657200CE +:10139C00BB0901383D3840005D09203809FF636600 +:1013AC00672D6F7264657200C8094838400007FFEA +:1013BC00636F6D7061726500D409E409BF93AF93DC +:1013CC008C0189919991DC01899199919C01899168 +:1013DC009991FC01ED90F190EF1451F40A9519F0EC +:1013EC002A95C1F701C02A95022B11F4882702C057 +:1013FC008FEF00C0982FAF91BF910C94053807FF69 +:10140C006E66613E6C666100DD090138EA062F3AB2 +:10141C00043A9D39203802FF2E73050A0138E20583 +:10142C000A3EAE3FE20554391B083638230A9B3A74 +:10143C00AC3A843C0A3EC93A1E0A203806FF6321A6 +:10144C0040737069110A2A0A03D099270C94053845 +:10145C008FB90EB1087F0EB90EB107FFFACF8FB15D +:10146C00089505FF6E4073706900240A3D0A8C01D3 +:10147C0089919991FC01C8012FB82EB127FFFDCF9E +:10148C002FB121930197C1F7899199910C9405384B +:10149C0005FF6E2173706900370A540A8C0189911B +:1014AC009991FC01C80121912FB92EB127FFFDCFD5 +:1014BC002FB10197C1F7899199910C9405380BFFC5 +:1014CC006170706C7475726E6B6579004E0A0138C0 +:1014DC00BC00973C7F01AE3FAC3E3D38E803C239BF +:1014EC00F038413F7A03C50304006B487A20F803B7 +:1014FC0020380BFF7365742D63757272656E740002 +:10150C00650A01383D383C003B3B203808FF776FBB +:10151C0072646C6973747F0A01381B3F5439CF387D +:10152C003B3BB138903CB4011C3F20380EFF666F3A +:10153C007274682D776F72646C6973748C0A483896 +:10154C003E0009FF7365742D6F72646572009C0A0E +:10155C0001383D3840007E0920380FFF7365742D2B +:10156C007265636F676E697A65727300A70A0138DA +:10157C003D3852007E0920380FFF6765742D726567 +:10158C00636F676E697A65727300B30A01383D3810 +:10159C0052005D09203804FF636F6465C20A01388C +:1015AC002E078E08123FC6015C07203808FF656EB7 +:1015BC00642D636F6465D10A013851070C9451078F +:1015CC000538203808FF286D61726B657229DC0ABA +:1015DC006F385E00A03DAA3D0800706F7374706F89 +:1015EC006E65E80A0138B005F305FE05B138FF3821 +:1015FC00C601C601CB3B2A38F638C601CB3B5C078B +:10160C00203803FF32724000F20A0C0B9A938A9333 +:10161C00EF91FF918F919F919F938F93FF93EF93F6 +:0A162C009A938A93CF010C940538BD +:10700200BF93AF93DB011196B21469F4FD01EE0F49 +:10701200FF1F659175911196FB01EE0FFF1F059100 +:107022001591F80109949A938A938B2D9927BB2481 +:1070320060EC7CE3F1CF04FF65786974070B2138BB +:10704200AF91BF91E1CF07FF657865637574650005 +:107052001C382B38BC0189919991DECF3038FD0163 +:10706200EE0FFF1FA591B591CFCF3738982B89919D +:107072009991A9F31196C8CF3E389A938A93FD014C +:10708200EE0FFF1F859195911196BECF48389A93C6 +:107092008A93FB013196EE0FFF1F85919591B4CF34 +:1070A20052389A938A93CB010196AECF58389A936D +:1070B2008A93FB013196EE0FFF1F85919591840D06 +:1070C200951DA2CF07FF2876616C756529002438CB +:1070D20001382E078E0851076F3820380E94A70802 +:1070E200B138C601CB3B2A38203801FF4000633853 +:1070F2007A38FC018191919187CF01FF2100763886 +:107102008238FC0189919991918380838991999127 +:107112007BCF02FF63217E388E38FC0189919991E1 +:1071220080838991999170CF02FF63408A389938A0 +:10713200FC019927808168CF02FF4075953801389C +:10714200023B9D397938203802FF21759D3801387C +:10715200023B9D398138203803FF64757000A538E1 +:10716200B2389A938A9350CF04FF3F647570AD385A +:10717200BA38082F092B11F09A938A9345CF04FF4E +:1071820073776170B538C5388C01899199911A93DA +:107192000A933ACF04FF6F766572C038D0389A935B +:1071A2008A938A819B8130CF04FF64726F70CB38DF +:1071B200DA388991999128CF03FF726F7400D5381C +:1071C200E2388C0129913991899199913A932A93C4 +:1071D2001A930A9319CF03FF6E697000DD38F138F4 +:1071E200229612CF02FF723EEC38F7389A938A93B6 +:1071F2008F919F9109CF02FF3E72F33800399F931E +:107202008F938991999100CF02FF7240FC3809391E +:107212009A938A938F919F919F938F93F5CE02FFBA +:107222003C3E05390138DF3F1A39203802FF303D34 +:1072320010391B39982BD1F530C002FF303C173979 +:10724200223997FD2AC032C002FF303E1E39293949 +:10725200821593055CF151F120C003FF64303E00BA +:1072620025393339821593058991999182059305C0 +:10727200ECF0E1F012C003FF64303C002E394139DA +:10728200229697FD0C944E390C94573904FF747270 +:1072920075653C394C399A938A938FEF9FEFB4CE40 +:1072A20001FF3000473955399A938A93C101ACCE18 +:1072B20002FF753C51395D39299139918217930743 +:1072C200A8F3A1F3EACF02FF753E59390138C43859 +:1072D2005C39203801FF3C0064396F3929913991BA +:1072E200281739071CF7D9CF01FF3E006B397939CE +:1072F2002991399128173907CCF2C1F2CECF04FF78 +:107302006C6F673275398539FC01992780E18A955E +:1073120022F0EE0FFF1FD8F777CE9A9575CE01FFB8 +:107322002D008039943909911991081B190BC80154 +:107332006BCE01FF2B0090399E3909911991800F74 +:10734200911F62CE02FF6D2A9A39A7398C01899169 +:1073520099919C0131027001209FC0013003F30812 +:10736200900DE11CF31C1203F308900DE11CF31CB9 +:107372009A938A93C70148CE06FF756D2F6D6F648D +:10738200A339C3397C01299139910991199140E1BD +:107392005527000F111F221F331F551F2E153F05A2 +:1073A200520518F003952E193F094A9589F73A9329 +:1073B2002A93C80129CE03FF756D2A00BD39E13930 +:1073C2008C0189919991809FF00122273327909F08 +:1073D200F00D211D331D819FF00D211D331D919F45 +:1073E200200D311DCF019A938A93C9010DCE06FF5C +:1073F200696E76657274DC39FE398095909504CE9B +:1074020002FF322FF839053A95958795FDCD02FF97 +:10741200322A013A0C3A880F991FF6CD03FF616EAA +:107422006400083A143A0991199180239123ECCD12 +:1074320002FF6F720F3A1D3A09911991802B912B1D +:10744200E3CD03FF786F7200193A273A0991199137 +:1074520080279127D9CD02FF312B223A303A01966B +:10746200D3CD02FF312D2C3A363A0197CDCD07FF0D +:107472003F6E656761746500323A013821393638EA +:10748200433A273E203806FF6C7368696674383ABF +:107492004A3AFC018991999131971AF0880F991F04 +:1074A200FBCFB2CD06FF727368696674443A593AEB +:1074B200FC018991999131971AF096958795FBCFA6 +:1074C200A3CD02FF2B21533A663AFC01899199918F +:1074D20020813181820F931F8083918389919991B9 +:1074E20093CD03FF72704000623A773A9A938A937F +:1074F2008DB79EB789CD03FF72702100723A813A2F +:107502002FB7F8948DBF9EBF2FBF899199917CCDE3 +:1075120003FF737040007C3A8E3A9A938A93CE01AD +:1075220073CD03FF73702100893A973AEC01899178 +:1075320099916ACD9C3A29913991E0E83E0F821BDC +:10754200930B3F932F939F938F93899199915CCD46 +:1075520001FF6900923AAD3A9A938A938F919F9173 +:10756200EF91FF91FF93EF939F938F938E0F9F1F46 +:107572004BCDBB3AEF91FF91E80FF91F8991999199 +:107582001BF0FF93EF936BCD0F911F9111963CCDA2 +:10759200CA3AEF91FF913196BBF3F3CF06FF756EB6 +:1075A2006C6F6F70A93AD53A1F910F911F910F918D +:1075B2002BCD06FF636D6F76653ECF3AE03ABF93FF +:1075C200AF93E991F991A991B991092F082B41F053 +:1075D200E80FF91FA80FB91F1E9112930197E1F747 +:1075E200AF91BF91899199910FCD02FF3E3CDA3A5A +:1075F200FA3A092F982F802F07CD03FF75704000AC +:10760200F63A033B9A938A93C201FECC03FF75704C +:107612002100FE3A0C3B2C0189919991F5CC03FF94 +:10762200316D7300073B153BE0EDF7E03197F1F761 +:10763200EBCC03FF323E7200103B1F3BFC018991F1 +:1076420099919F938F93FF93EF9389919991DCCCBA +:1076520003FF32723E001A3B2E3B9A938A93EF91BC +:10766200FF918F919F919A938A93CF01CDCC02FF84 +:107672002165293B3C3BFC01899199912FB7F894F4 +:1076820028D00DB3081709F00BD0319622D00DB3D4 +:10769200091711F0892F04D02FBF89919991B4CC89 +:1076A200E199FECF07B700FDFDCFFFBBEEBB8DBB5F +:1076B200E29AE19A089502FF4065383B603B2FB79A +:1076C200F894FC0106D08DB3319603D09DB32FBF41 +:1076D2009BCCE199FECFFFBBEEBBE09A089502FF7F +:1076E20021695C3BFF3D5C00A03DAA3D09FF2821CA +:1076F200692D6E7277772900703B7F3B1FB71F930E +:10770200F8949C0189919991AF93BF93CF93DF93A2 +:1077120009D0DF91CF91BF91AF91899199911F913A +:107722001FBF72CC10D0E094F0948E219F21982B31 +:1077320019F0F90102E020D0F90104E01DD0F901AD +:1077420000E11AD00895F901E07CFF7FEF01A0E487 +:10775200B0E0FE01EE0FFF1F45915591FE01E217C9 +:10776200F30711F00A0102C07A010C01002704D0CC +:107772002196119771F70895E199FECF17B710FD81 +:10778200FDCFEE0FFF1F016007BFE895089502FFCE +:107792004069773BCC3BFC01EE0FFF1F8591959131 +:1077A20033CC03FF6E3E7200C83BD73BFC01082F6F +:1077B200899199919F938F930A95D1F7EF93FF93B4 +:1077C2008991999121CC03FF6E723E00D23BE93B35 +:1077D2009A938A93FF91EF910E2F8F919F919A9393 +:1077E2008A930A95D1F7CF010FCC03FF64322A00A6 +:1077F200E43BFB3B09911991000F111F881F991F50 +:107802001A930A9301CC03FF64322F00F63B093C22 +:107812000991199195958795179507951A930A934A +:10782200F3CB02FF642B043C163C29913991E99079 +:10783200F99049915991240F351F8E1D9F1D3A933E +:107842002A93E2CB02FF642D123C273C2991399105 +:10785200E990F99049915991421B530BE80AF90AB0 +:107862005A934A93C701D0CB07FF64696E7665725B +:107872007400233C3C3C09911991809590950095A8 +:1078820010951A930A93C0CB04FF2F6D6F64353C99 +:107892004A3C9C0109911991412F432717FF04C0CB +:1078A200109500950F5F1F4F37FF04C0309520954C +:1078B2002F5F3F4FEE24FF1851E1001F111F5A9511 +:1078C20039F447FF04C0109500950F5F1F4F0BC09E +:1078D200EE1CFF1CE21AF30A20F4E20EF31E889457 +:1078E200ECCF0894EACFFA92EA92C8018DCB03FF5B +:1078F20061627300453C0138B1383E3A203804FFDA +:107902007069636B783C01382F3AC43E8D3A9D39D9 +:107912007938203805FF63656C6C2B00803C913C04 +:10792200029672CB04FF2B696E748B3C983C789460 +:107932006BCB04FF2D696E74933C9F3CF89464CB2F +:1079420004FF696E74219A3C01383D3800009D396C +:107952003B3B203804FF696E7440A13C01383D383E +:1079620000009D395F3B203808FF696E742D7472E8 +:107972006170AB3CBC3CB82E8991999145CB0138E2 +:10798200AF3C2A38C53C2038C63C01D03DCB1895C7 +:107992000138C5030300206F6B00F803203803FF92 +:1079A2002E6F6B00B53CFF3D1C00C83DD43D013835 +:1079B200C50302003E20A13FF803203806FF2E72C5 +:1079C20065616479D03CFF3D2000C83DD43D01385B +:1079D200C5030400203F3F20F803BD3E7938FF383D +:1079E200413F7A03E23E79387A03F638BD3E813868 +:1079F200203806FF2E6572726F72DF3CFF3D1E005B +:107A0200C83DD43D04FF71756974FA3C01385108D0 +:107A120058088138CA05963AD705803AE608B73E33 +:107A220079381A393638163DE43CDE043638283DBA +:107A32003D382506703DB9383638283DB1383D38D5 +:107A4200FEFF6E393638263DFF3C2F38083DD43CC8 +:107A52002F38103D05FF706175736500033DFF3DD2 +:107A6200ED00B43DBE3D04FF636F6C642B3D393DB8 +:107A7200A4B622243324BB2424BEE0E6F0E0219203 +:107A8200E036E9F7F830D9F7EFEEF0E02F010FE535 +:107A92000DBF048318E01EBF1583CFE0C683D8E074 +:107AA200D783AAE5BDE3B0CA04FF7761726D343DA6 +:107AB200013897023D389A013D38303DDF3DE608F6 +:107AC2005C3F073D07FF68616E646C657200553D5F +:107AD20058380A0005FF636174636800633D01382A +:107AE2008D3AFF38693D7938FF38763A693D8138F9 +:107AF2002A38F638693D8138F638D9385439203871 +:107B020005FF7468726F77006B3D0138B1381A391E +:107B120036388D3DD9382038693D7938803AF63883 +:107B2200693D8138F638C438FF38963AD938F63884 +:107B3200203807FF4564656665724000813D013863 +:107B4200CB3B5F3B203807FF4564656665722100C9 +:107B52009A3D0138CB3B3B3B203807FF52646566B8 +:107B620065724000A43D0138CB3B7938203807FFCD +:107B72005264656665722100AE3D0138CB3B8138A7 +:107B8200203807FF5564656665724000B83D0138CC +:107B9200CB3B023B9D397938203807FF5564656637 +:107BA20065722100C23D0138CB3B023B9D398138D1 +:107BB200203806FF646566657221CE3D0138D03FEC +:107BC200B138C601C601CB3B2A38203806FF6465AE +:107BD20066657240DA3D0138D03FB138C601CB3B11 +:107BE2002A38203807FF2864656665722900E73D58 +:107BF20001382E078E085107FF3D20380E94A70842 +:107C0200B138C601CB3B2A382A38203802FF752EFC +:107C1200F33D013854398203203803FF752E720078 +:107C2200073E01385439C4388B03203805FF752FBD +:107C32006D6F64000E3E0138FF385439F638C23990 +:107C4200203806FF6E6567617465173E0138FD399D +:107C52002F3A203801FF2F00223E0138493CF038EC +:107C6200203803FF6D6F64002B3E0138493CD93840 +:107C7200203803FF6D696E00323E0138C93E783903 +:107C82003638443EC438D938203803FF6D61780055 +:107C92003A3E0138C93E6E393638503EC438D9387A +:107CA200203806FF77697468696E463E0138CF381E +:107CB2009339FF389339F6385C3920380DFF7368F1 +:107CC2006F772D776F72646C69737400523E01385E +:107CD2003D386E3EC438CF0620380138EA06F80334 +:107CE200AE3F4B39203805FF776F726473005F3EF9 +:107CF20001383D3842005F3B683E203802002E22A8 +:107D0200743E01388A3E5107F8032038020073227C +:107D12007F3E01383D3822008305B73E7938363838 +:107D2200933E7D07203804FF66696C6C873E0138FC +:107D3200E138E138B9383638A53E993F9B3AB13837 +:107D4200AC3A8D38C93AA03ED938203805FF665F73 +:107D520063707500943E01383D3800123D387A0058 +:107D6200203805FF737461746500A73E48381B0113 +:107D720004FF62617365B23E58380C0005FF63650B +:107D82006C6C7300B93E0C3A04FF32647570BF3EEE +:107D92000138CF38CF38203805FF3264726F700057 +:107DA200C53E0138D938D938203804FF7475636B61 +:107DB200CD3E0138C438CF38203803FF3E696E000B +:107DC200D63E5838180003FF70616400DE3E013869 +:107DD200233F3D3828009D39203804FF656D6974C2 +:107DE200E43EFF3D0E00C83DD43D05FF656D69745C +:107DF2003F00EE3EFF3D1000C83DD43D03FF6B65E2 +:107E02007900F63EFF3D1200C83DD43D04FF6B658C +:107E1200793FFF3EFF3D1400C83DD43D02FF647030 +:107E2200073F6F382C00A03DAA3D05FF65686572CB +:107E320065000F3F6F383000A03DAA3D04FF686522 +:107E42007265163F6F382E00A03DAA3D05FF616C9A +:107E52006C6F74001F3F0138233F9D39B401243FEA +:107E6200203803FF62696E00273F0138EB3FBD3EB9 +:107E72008138203807FF646563696D616C00323FA9 +:107E820001383D380A00BD3E8138203803FF68655D +:107E920078003B3F01383D381000BD3E8138203824 +:107EA20002FF626C473F4838200007FF7475726E0C +:107EB2006B657900513FFF3D3800A03DAA3D07FFA9 +:107EC200746F757070657200563F0138B1383D3875 +:107ED20061003D387B00573E3638723F3D38DF0047 +:107EE200133A203807FF746F6C6F77657200603F3A +:107EF2000138B1383D3841003D385B00573E3638D5 +:107F0200853F3D3820001C3A203806FF3F737461DC +:107F1200636B733F0138E20521393638933F3D38B0 +:107F2200FCFF863D203806FF626F756E6473863FE4 +:107F32000138CF389D39C438203802FF6372943F2C +:107F420001383D380D00F23E3D380A00F23E20383D +:107F520005FF7370616365009E3F0138543FF23E36 +:107F6200203806FF737061636573A93F0138543985 +:107F72004A3EB1383638C13FAE3F353A2F38BA3F64 +:107F8200D938203803FF733E6400B23F0138B1385C +:107F92002139203805FF3E626F647900C33F303AD1 +:107FA2000800326C69746572616CCB3F0138C43869 +:107FB20072077207203801FF3D00D13F0138933923 +:107FC2001A39203801FF3100DC3F4838010001FF37 +:107FD2003200E33F4838020002FF2D31E83F4838C3 +:027FE200FFFF9F +:00000001FF diff --git a/amforth-6.5/appl/eval-pollin/p32-8.lst b/amforth-6.5/appl/eval-pollin/p32-8.lst new file mode 100644 index 0000000..0922f73 --- /dev/null +++ b/amforth-6.5/appl/eval-pollin/p32-8.lst @@ -0,0 +1,10420 @@ + +AVRASM ver. 2.1.52 p32-8.asm Sun Apr 30 20:10:14 2017 + +p32-8.asm(5): 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/atmega32\device.asm' +../../avr8/devices/atmega32\device.asm(5): Including file '../../avr8/Atmel/Appnotes2\m32def.inc' +p32-8.asm(14): Including file '../../avr8\drivers/usart.asm' +../../avr8\drivers/usart.asm(30): 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' +p32-8.asm(19): Including file '../../avr8\drivers/1wire.asm' +p32-8.asm(21): Including file '../../avr8\amforth.asm' +../../avr8\amforth.asm(12): Including file '../../avr8\drivers/generic-isr.asm' +../../avr8\amforth.asm(14): 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(11): Including file '../../avr8\dict/appl_4k.inc' +../../avr8\dict/appl_4k.inc(1): Including file '../../common\words/ver.asm' +../../avr8\dict/appl_4k.inc(4): Including file '../../common\words/noop.asm' +../../avr8\dict/appl_4k.inc(5): Including file '../../avr8\words/unused.asm' +../../avr8\dict/appl_4k.inc(6): Including file '../../common\words/to.asm' +../../avr8\dict/appl_4k.inc(7): Including file '../../avr8\words/i-cellplus.asm' +../../avr8\dict/appl_4k.inc(8): Including file '../../avr8\words/icompare.asm' +../../avr8\dict/appl_4k.inc(9): Including file '../../common\words/star.asm' +../../avr8\dict/appl_4k.inc(10): Including file '../../avr8\words/j.asm' +../../avr8\dict/appl_4k.inc(11): Including file '../../avr8\words/dabs.asm' +../../avr8\dict/appl_4k.inc(12): Including file '../../avr8\words/dnegate.asm' +../../avr8\dict/appl_4k.inc(13): Including file '../../avr8\words/cmove.asm' +../../avr8\dict/appl_4k.inc(14): Including file '../../common\words/2swap.asm' +../../avr8\dict/appl_4k.inc(15): Including file '../../common\words/tib.asm' +../../avr8\dict/appl_4k.inc(16): Including file '../../avr8\words/init-ram.asm' +../../avr8\dict/appl_4k.inc(20): Including file '../../avr8\words/environment.asm' +../../avr8\dict/appl_4k.inc(21): Including file '../../avr8\words/env-wordlists.asm' +../../avr8\dict/appl_4k.inc(22): Including file '../../avr8\words/env-slashpad.asm' +../../avr8\dict/appl_4k.inc(23): Including file '../../common\words/env-slashhold.asm' +../../avr8\dict/appl_4k.inc(24): Including file '../../common\words/env-forthname.asm' +../../avr8\dict/appl_4k.inc(25): Including file '../../common\words/env-forthversion.asm' +../../avr8\dict/appl_4k.inc(26): Including file '../../common\words/env-cpu.asm' +../../avr8\dict/appl_4k.inc(27): Including file '../../avr8\words/env-mcuinfo.asm' +../../avr8\dict/appl_4k.inc(28): Including file '../../common\words/env-usersize.asm' +../../avr8\dict/appl_4k.inc(30): Including file '../../avr8\words/hld.asm' +../../avr8\dict/appl_4k.inc(31): Including file '../../common\words/hold.asm' +../../avr8\dict/appl_4k.inc(32): Including file '../../common\words/less-sharp.asm' +../../avr8\dict/appl_4k.inc(33): Including file '../../common\words/sharp.asm' +../../avr8\dict/appl_4k.inc(34): Including file '../../common\words/sharp-s.asm' +../../avr8\dict/appl_4k.inc(35): Including file '../../common\words/sharp-greater.asm' +../../avr8\dict/appl_4k.inc(36): Including file '../../common\words/sign.asm' +../../avr8\dict/appl_4k.inc(37): Including file '../../common\words/d-dot-r.asm' +../../avr8\dict/appl_4k.inc(38): Including file '../../common\words/dot-r.asm' +../../avr8\dict/appl_4k.inc(39): Including file '../../common\words/d-dot.asm' +../../avr8\dict/appl_4k.inc(40): Including file '../../common\words/dot.asm' +../../avr8\dict/appl_4k.inc(41): Including file '../../common\words/ud-dot.asm' +../../avr8\dict/appl_4k.inc(42): Including file '../../common\words/ud-dot-r.asm' +../../avr8\dict/appl_4k.inc(43): Including file '../../common\words/ud-slash-mod.asm' +../../avr8\dict/appl_4k.inc(44): Including file '../../common\words/digit-q.asm' +../../avr8\dict/appl_4k.inc(46): Including file '../../avr8\words/do-sliteral.asm' +../../avr8\dict/appl_4k.inc(47): Including file '../../avr8\words/scomma.asm' +../../avr8\dict/appl_4k.inc(48): Including file '../../avr8\words/itype.asm' +../../avr8\dict/appl_4k.inc(49): Including file '../../avr8\words/icount.asm' +../../avr8\dict/appl_4k.inc(50): Including file '../../common\words/type.asm' +../../avr8\dict/appl_4k.inc(51): Including file '../../common\words/tick.asm' +../../avr8\dict/appl_4k.inc(53): Including file '../../common\words/cskip.asm' +../../avr8\dict/appl_4k.inc(54): Including file '../../common\words/cscan.asm' +../../avr8\dict/appl_4k.inc(55): Including file '../../common\words/accept.asm' +../../avr8\dict/appl_4k.inc(56): Including file '../../common\words/refill.asm' +../../avr8\dict/appl_4k.inc(57): Including file '../../common\words/char.asm' +../../avr8\dict/appl_4k.inc(58): Including file '../../common\words/number.asm' +../../avr8\dict/appl_4k.inc(59): Including file '../../common\words/q-sign.asm' +../../avr8\dict/appl_4k.inc(60): Including file '../../common\words/set-base.asm' +../../avr8\dict/appl_4k.inc(61): Including file '../../common\words/to-number.asm' +../../avr8\dict/appl_4k.inc(62): Including file '../../common\words/parse.asm' +../../avr8\dict/appl_4k.inc(63): Including file '../../common\words/source.asm' +../../avr8\dict/appl_4k.inc(64): Including file '../../common\words/slash-string.asm' +../../avr8\dict/appl_4k.inc(65): Including file '../../common\words/parse-name.asm' +../../avr8\dict/appl_4k.inc(66): Including file '../../avr8\words/sp0.asm' +../../avr8\dict/appl_4k.inc(67): Including file '../../avr8\words/rp0.asm' +../../avr8\dict/appl_4k.inc(68): Including file '../../common\words/depth.asm' +../../avr8\dict/appl_4k.inc(69): Including file '../../avr8\words/forth-recognizer.asm' +../../avr8\dict/appl_4k.inc(70): Including file '../../common\words/recognize.asm' +../../avr8\dict/appl_4k.inc(71): Including file '../../common\words/interpret.asm' +../../avr8\dict/appl_4k.inc(72): Including file '../../common\words/rec-intnum.asm' +../../avr8\dict/appl_4k.inc(73): Including file '../../common\words/rec-find.asm' +../../avr8\dict/appl_4k.inc(74): Including file '../../common\words/dt-null.asm' +../../avr8\dict/appl_4k.inc(75): Including file '../../common\words/search-wordlist.asm' +../../avr8\dict/appl_4k.inc(76): Including file '../../common\words/traverse-wordlist.asm' +../../avr8\dict/appl_4k.inc(77): Including file '../../common\words/name2string.asm' +../../avr8\dict/appl_4k.inc(78): Including file '../../avr8\words/nfa2cfa.asm' +../../avr8\dict/appl_4k.inc(79): Including file '../../common\words/find-xt.asm' +../../avr8\dict/appl_4k.inc(81): 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.asm(15): Including file 'dict_appl.inc' +dict_appl.inc(3): Including file '../../common\words/dot-s.asm' +dict_appl.inc(4): Including file '../../avr8\words/spirw.asm' +dict_appl.inc(5): Including file '../../avr8\words/n-spi.asm' +dict_appl.inc(6): Including file 'words/applturnkey.asm' +dict_appl.inc(7): 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' +dict_appl.inc(8): Including file '../../avr8\words/2r_fetch.asm' +../../avr8\amforth.asm(23): Including file '../../avr8\amforth-interpreter.asm' +../../avr8\amforth.asm(24): 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(97): Including file '../../avr8\words/store-i_nrww.asm' +../../avr8\dict/nrww.inc(99): Including file '../../avr8\words/fetch-i.asm' +../../avr8\dict/nrww.inc(104): Including file '../../avr8\dict/core_4k.inc' +../../avr8\dict/core_4k.inc(3): Including file '../../avr8\words/n_to_r.asm' +../../avr8\dict/core_4k.inc(4): Including file '../../avr8\words/n_r_from.asm' +../../avr8\dict/core_4k.inc(5): Including file '../../avr8\words/d-2star.asm' +../../avr8\dict/core_4k.inc(6): Including file '../../avr8\words/d-2slash.asm' +../../avr8\dict/core_4k.inc(7): Including file '../../avr8\words/d-plus.asm' +../../avr8\dict/core_4k.inc(8): Including file '../../avr8\words/d-minus.asm' +../../avr8\dict/core_4k.inc(9): Including file '../../avr8\words/d-invert.asm' +../../avr8\dict/core_4k.inc(10): Including file '../../avr8\words/slashmod.asm' +../../avr8\dict/core_4k.inc(11): Including file '../../common\words/abs.asm' +../../avr8\dict/core_4k.inc(12): Including file '../../common\words/pick.asm' +../../avr8\dict/core_4k.inc(13): Including file '../../avr8\words/cellplus.asm' +../../avr8\dict/core_4k.inc(14): 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_4k.inc(17): Including file '../../common\words/prompt-ok.asm' +../../avr8\dict/core_4k.inc(18): Including file '../../common\words/prompt-ready.asm' +../../avr8\dict/core_4k.inc(19): Including file '../../common\words/prompt-error.asm' +../../avr8\dict/core_4k.inc(21): Including file '../../common\words/quit.asm' +../../avr8\dict/core_4k.inc(22): Including file '../../avr8\words/pause.asm' +../../avr8\dict/core_4k.inc(23): Including file '../../avr8\words/cold.asm' +../../avr8\dict/core_4k.inc(24): Including file '../../common\words/warm.asm' +../../avr8\dict/core_4k.inc(26): Including file '../../common\words/handler.asm' +../../avr8\dict/core_4k.inc(27): Including file '../../common\words/catch.asm' +../../avr8\dict/core_4k.inc(28): Including file '../../common\words/throw.asm' +../../avr8\dict/core_4k.inc(31): Including file '../../avr8\words/edefer-fetch.asm' +../../avr8\dict/core_4k.inc(32): Including file '../../avr8\words/edefer-store.asm' +../../avr8\dict/core_4k.inc(33): Including file '../../common\words/rdefer-fetch.asm' +../../avr8\dict/core_4k.inc(34): Including file '../../common\words/rdefer-store.asm' +../../avr8\dict/core_4k.inc(35): Including file '../../common\words/udefer-fetch.asm' +../../avr8\dict/core_4k.inc(36): Including file '../../common\words/udefer-store.asm' +../../avr8\dict/core_4k.inc(37): Including file '../../common\words/defer-store.asm' +../../avr8\dict/core_4k.inc(38): Including file '../../common\words/defer-fetch.asm' +../../avr8\dict/core_4k.inc(39): Including file '../../avr8\words/do-defer.asm' +../../avr8\dict/core_4k.inc(41): Including file '../../common\words/u-dot.asm' +../../avr8\dict/core_4k.inc(42): Including file '../../common\words/u-dot-r.asm' +../../avr8\dict/core_4k.inc(45): Including file '../../avr8\words/uslashmod.asm' +../../avr8\dict/core_4k.inc(46): Including file '../../avr8\words/negate.asm' +../../avr8\dict/core_4k.inc(47): Including file '../../common\words/slash.asm' +../../avr8\dict/core_4k.inc(48): Including file '../../common\words/mod.asm' +../../avr8\dict/core_4k.inc(50): Including file '../../common\words/min.asm' +../../avr8\dict/core_4k.inc(51): Including file '../../common\words/max.asm' +../../avr8\dict/core_4k.inc(52): Including file '../../common\words/within.asm' +../../avr8\dict/core_4k.inc(54): Including file '../../common\words/show-wordlist.asm' +../../avr8\dict/core_4k.inc(55): Including file '../../common\words/words.asm' +../../avr8\dict/core_4k.inc(57): Including file '../../common\words/dot-quote.asm' +../../avr8\dict/core_4k.inc(58): Including file '../../common\words/squote.asm' +../../avr8\dict/core_4k.inc(59): Including file '../../avr8\words/fill.asm' +../../avr8\dict/core_4k.inc(61): Including file '../../common\words/f_cpu.asm' +../../avr8\dict/core_4k.inc(62): Including file '../../avr8\words/state.asm' +../../avr8\dict/core_4k.inc(63): Including file '../../common\words/base.asm' +../../avr8\dict/core_4k.inc(65): Including file '../../avr8\words/cells.asm' +../../avr8\dict/core_4k.inc(67): Including file '../../common\words/2dup.asm' +../../avr8\dict/core_4k.inc(68): Including file '../../common\words/2drop.asm' +../../avr8\dict/core_4k.inc(69): Including file '../../common\words/tuck.asm' +../../avr8\dict/core_4k.inc(71): Including file '../../common\words/to-in.asm' +../../avr8\dict/core_4k.inc(72): Including file '../../common\words/pad.asm' +../../avr8\dict/core_4k.inc(73): Including file '../../common\words/emit.asm' +../../avr8\dict/core_4k.inc(74): Including file '../../common\words/emitq.asm' +../../avr8\dict/core_4k.inc(75): Including file '../../common\words/key.asm' +../../avr8\dict/core_4k.inc(76): Including file '../../common\words/keyq.asm' +../../avr8\dict/core_4k.inc(78): Including file '../../avr8\words/dp.asm' +../../avr8\dict/core_4k.inc(79): Including file '../../avr8\words/ehere.asm' +../../avr8\dict/core_4k.inc(80): Including file '../../avr8\words/here.asm' +../../avr8\dict/core_4k.inc(81): Including file '../../avr8\words/allot.asm' +../../avr8\dict/core_4k.inc(83): Including file '../../common\words/bin.asm' +../../avr8\dict/core_4k.inc(84): Including file '../../common\words/decimal.asm' +../../avr8\dict/core_4k.inc(85): Including file '../../common\words/hex.asm' +../../avr8\dict/core_4k.inc(86): Including file '../../common\words/bl.asm' +../../avr8\dict/core_4k.inc(88): Including file '../../avr8\words/turnkey.asm' +../../avr8\dict/core_4k.inc(89): Including file '../../common\words/to-upper.asm' +../../avr8\dict/core_4k.inc(90): Including file '../../common\words/to-lower.asm' +../../avr8\dict/core_4k.inc(92): Including file '../../common\words/q-stack.asm' +../../avr8\dict/core_4k.inc(93): Including file '../../common\words/bounds.asm' +../../avr8\dict/core_4k.inc(94): Including file '../../common\words/cr.asm' +../../avr8\dict/core_4k.inc(95): Including file '../../common\words/space.asm' +../../avr8\dict/core_4k.inc(96): Including file '../../common\words/spaces.asm' +../../avr8\dict/core_4k.inc(97): Including file '../../common\words/s-to-d.asm' +../../avr8\dict/core_4k.inc(98): 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.asm(25): Including file 'dict_appl_core.inc' +../../avr8\amforth.asm(36): Including file '../../avr8\amforth-eeprom.inc' + + + ; file see ../template/template.asm. You may want to + ; copy that file to this one and edit it afterwards. + + .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 = 96 + .equ CELLSIZE = 2 + .macro readflashcell + lsl zl + rol zh + lpm @0, Z+ + lpm @1, Z+ + .endmacro + .macro writeflashcell + lsl zl + rol zh + .endmacro + .set WANT_EEPROM = 0 + .set WANT_WATCHDOG = 0 + .set WANT_EXTERNAL_INTERRUPT = 0 + .set WANT_TIMER_COUNTER_0 = 0 + .set WANT_TIMER_COUNTER_2 = 0 + .set WANT_TIMER_COUNTER_1 = 0 + .set WANT_SPI = 0 + .set WANT_USART = 0 + .set WANT_ANALOG_COMPARATOR = 0 + .set WANT_AD_CONVERTER = 0 + .set WANT_PORTA = 0 + .set WANT_PORTB = 0 + .set WANT_PORTC = 0 + .set WANT_PORTD = 0 + .set WANT_CPU = 0 + .set WANT_BOOT_LOAD = 0 + .set WANT_TWI = 0 + .equ intvecsize = 2 ; please verify; flash size: 32768 bytes + .equ pclen = 2 ; please verify + .overlap + .org 2 +000002 d11b rcall isr ; External Interrupt Request 0 + .org 4 +000004 d119 rcall isr ; External Interrupt Request 1 + .org 6 +000006 d117 rcall isr ; External Interrupt Request 2 + .org 8 +000008 d115 rcall isr ; Timer/Counter2 Compare Match + .org 10 +00000a d113 rcall isr ; Timer/Counter2 Overflow + .org 12 +00000c d111 rcall isr ; Timer/Counter1 Capture Event + .org 14 +00000e d10f rcall isr ; Timer/Counter1 Compare Match A + .org 16 +000010 d10d rcall isr ; Timer/Counter1 Compare Match B + .org 18 +000012 d10b rcall isr ; Timer/Counter1 Overflow + .org 20 +000014 d109 rcall isr ; Timer/Counter0 Compare Match + .org 22 +000016 d107 rcall isr ; Timer/Counter0 Overflow + .org 24 +000018 d105 rcall isr ; Serial Transfer Complete + .org 26 +00001a d103 rcall isr ; USART, Rx Complete + .org 28 +00001c d101 rcall isr ; USART Data Register Empty + .org 30 +00001e d0ff rcall isr ; USART, Tx Complete + .org 32 +000020 d0fd rcall isr ; ADC Conversion Complete + .org 34 +000022 d0fb rcall isr ; EEPROM Ready + .org 36 +000024 d0f9 rcall isr ; Analog Comparator + .org 38 +000026 d0f7 rcall isr ; 2-wire Serial Interface + .org 40 +000028 d0f5 rcall isr ; Store Program Memory Ready + .equ INTVECTORS = 21 + .nooverlap + + ; compatability layer (maybe empty) + .equ SPMCSR = SPMCR + .equ EEPE = EEWE + .equ EEMPE = EEMWE + + ; controller data area, environment query mcu-info + mcu_info: + mcu_ramsize: +000029 0800 .dw 2048 + mcu_eepromsize: +00002a 0400 .dw 1024 + mcu_maxdp: +00002b 7000 .dw 28672 + mcu_numints: +00002c 0015 .dw 21 + mcu_name: +00002d 0008 .dw 8 +00002e 5441 +00002f 656d +000030 6167 +000031 3233 .db "ATmega32" + .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 + + .set AMFORTH_RO_SEG = NRWW_START_ADDR+1 + + ; cpu clock in hertz + .equ F_CPU = 8000000 + .set BAUD_MAXERROR = 30 + .equ TIMER_INT = OVF2addr + + .include "drivers/usart.asm" + + .equ BAUDRATE_LOW = UBRRL+$20 + .equ BAUDRATE_HIGH = UBRRH+$20 + .equ USART_C = UCSRC+$20 + .equ USART_B = UCSRB+$20 + .equ USART_A = UCSRA+$20 + .equ USART_DATA = UDR+$20 + .equ bm_USARTC_en = 1 << 7 + + ; some generic constants + .equ bm_USART_RXRD = 1 << RXC + .equ bm_USART_TXRD = 1 << UDRE + .equ bm_ENABLE_TX = 1 << TXEN + .equ bm_ENABLE_RX = 1 << RXEN + .equ bm_ENABLE_INT_RX = 1<rx-buf",0 +000037 0000 .dw VE_HEAD + .set VE_HEAD = VE_TO_RXBUF + XT_TO_RXBUF: +000038 0039 .dw PFA_rx_tobuf + PFA_rx_tobuf: +000039 2f08 mov temp0, tosl +00003a 9110 0070 lds temp1, usart_rx_in +00003c e6e0 ldi zl, low(usart_rx_data) +00003d e0f0 ldi zh, high(usart_rx_data) +00003e 0fe1 add zl, temp1 +00003f 1df3 adc zh, zeroh +000040 8300 st Z, temp0 +000041 9513 inc temp1 +000042 701f andi temp1,usart_rx_mask +000043 9310 0070 sts usart_rx_in, temp1 +000045 9189 +000046 9199 loadtos +000047 940c 3805 jmp_ DO_NEXT + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ; setup with + ; ' isr-rx URXCaddr int! + VE_ISR_RX: +000049 ff06 .dw $ff06 +00004a 7369 +00004b 2d72 +00004c 7872 .db "isr-rx" +00004d 0032 .dw VE_HEAD + .set VE_HEAD = VE_ISR_RX + XT_ISR_RX: +00004e 3801 .dw DO_COLON + usart_rx_isr: +00004f 383d .dw XT_DOLITERAL +000050 002c .dw usart_data +000051 3898 .dw XT_CFETCH +000052 38b1 .dw XT_DUP +000053 383d .dw XT_DOLITERAL +000054 0003 .dw 3 +000055 3fdf .dw XT_EQUAL +000056 3836 .dw XT_DOCONDBRANCH +000057 0059 .dw usart_rx_isr1 +000058 3d38 .dw XT_COLD + usart_rx_isr1: +000059 0038 .dw XT_TO_RXBUF +00005a 3820 .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: +00005b 3801 .dw DO_COLON + PFA_USART_INIT_RX_BUFFER: ; ( -- ) +00005c 383d +00005d 004e .dw XT_DOLITERAL, XT_ISR_RX +00005e 383d +00005f 001a .dw XT_DOLITERAL, URXCaddr +000060 3ca5 .dw XT_INTSTORE + +000061 383d .dw XT_DOLITERAL +000062 0060 .dw usart_rx_data +000063 383d .dw XT_DOLITERAL +000064 0016 .dw usart_rx_size + 6 +000065 3954 .dw XT_ZERO +000066 3e98 .dw XT_FILL +000067 3820 .dw XT_EXIT + + ; ( -- c) + ; MCU + ; get 1 character from input queue, wait if needed using interrupt driver + VE_RX_BUFFER: +000068 ff06 .dw $ff06 +000069 7872 +00006a 622d +00006b 6675 .db "rx-buf" +00006c 0049 .dw VE_HEAD + .set VE_HEAD = VE_RX_BUFFER + XT_RX_BUFFER: +00006d 3801 .dw DO_COLON + PFA_RX_BUFFER: +00006e 0088 .dw XT_RXQ_BUFFER +00006f 3836 .dw XT_DOCONDBRANCH +000070 006e .dw PFA_RX_BUFFER +000071 383d .dw XT_DOLITERAL +000072 0071 .dw usart_rx_out +000073 3898 .dw XT_CFETCH +000074 38b1 .dw XT_DUP +000075 383d .dw XT_DOLITERAL +000076 0060 .dw usart_rx_data +000077 399d .dw XT_PLUS +000078 3898 .dw XT_CFETCH +000079 38c4 .dw XT_SWAP +00007a 3a2f .dw XT_1PLUS +00007b 383d .dw XT_DOLITERAL +00007c 000f .dw usart_rx_mask +00007d 3a13 .dw XT_AND +00007e 383d .dw XT_DOLITERAL +00007f 0071 .dw usart_rx_out +000080 388d .dw XT_CSTORE +000081 3820 .dw XT_EXIT + + ; ( -- f) + ; MCU + ; check if unread characters are in the input queue + VE_RXQ_BUFFER: +000082 ff07 .dw $ff07 +000083 7872 +000084 2d3f +000085 7562 +000086 0066 .db "rx?-buf",0 +000087 0068 .dw VE_HEAD + .set VE_HEAD = VE_RXQ_BUFFER + XT_RXQ_BUFFER: +000088 3801 .dw DO_COLON + PFA_RXQ_BUFFER: +000089 3d30 .dw XT_PAUSE +00008a 383d .dw XT_DOLITERAL +00008b 0071 .dw usart_rx_out +00008c 3898 .dw XT_CFETCH +00008d 383d .dw XT_DOLITERAL +00008e 0070 .dw usart_rx_in +00008f 3898 .dw XT_CFETCH +000090 3913 .dw XT_NOTEQUAL +000091 3820 .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: +000092 ff07 .dw $ff07 +000093 7874 +000094 702d +000095 6c6f +000096 006c .db "tx-poll",0 +000097 0082 .dw VE_HEAD + .set VE_HEAD = VE_TX_POLL + XT_TX_POLL: +000098 3801 .dw DO_COLON + PFA_TX_POLL: + ; wait for data ready +000099 00a6 .dw XT_TXQ_POLL +00009a 3836 .dw XT_DOCONDBRANCH +00009b 0099 .dw PFA_TX_POLL + ; send to usart +00009c 383d .dw XT_DOLITERAL +00009d 002c .dw USART_DATA +00009e 388d .dw XT_CSTORE +00009f 3820 .dw XT_EXIT + + ; ( -- f) MCU + ; MCU + ; check if a character can be send using register poll + VE_TXQ_POLL: +0000a0 ff08 .dw $ff08 +0000a1 7874 +0000a2 2d3f +0000a3 6f70 +0000a4 6c6c .db "tx?-poll" +0000a5 0092 .dw VE_HEAD + .set VE_HEAD = VE_TXQ_POLL + XT_TXQ_POLL: +0000a6 3801 .dw DO_COLON + PFA_TXQ_POLL: +0000a7 3d30 .dw XT_PAUSE +0000a8 383d .dw XT_DOLITERAL +0000a9 002b .dw USART_A +0000aa 3898 .dw XT_CFETCH +0000ab 383d .dw XT_DOLITERAL +0000ac 0020 .dw bm_USART_TXRD +0000ad 3a13 .dw XT_AND +0000ae 3820 .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: +0000af ff04 .dw $ff04 +0000b0 6275 +0000b1 7272 .db "ubrr" +0000b2 00a0 .dw VE_HEAD + .set VE_HEAD = VE_UBRR + XT_UBRR: +0000b3 386f .dw PFA_DOVALUE1 + PFA_UBRR: ; ( -- ) +0000b4 0082 .dw EE_UBRRVAL +0000b5 3da0 .dw XT_EDEFERFETCH +0000b6 3daa .dw XT_EDEFERSTORE + .include "words/usart.asm" + + ; MCU + ; initialize usart + VE_USART: +0000b7 ff06 .dw $ff06 +0000b8 752b +0000b9 6173 +0000ba 7472 .db "+usart" +0000bb 00af .dw VE_HEAD + .set VE_HEAD = VE_USART + XT_USART: +0000bc 3801 .dw DO_COLON + PFA_USART: ; ( -- ) + +0000bd 383d .dw XT_DOLITERAL +0000be 0098 .dw USART_B_VALUE +0000bf 383d .dw XT_DOLITERAL +0000c0 002a .dw USART_B +0000c1 388d .dw XT_CSTORE + +0000c2 383d .dw XT_DOLITERAL +0000c3 0006 .dw USART_C_VALUE +0000c4 383d .dw XT_DOLITERAL +0000c5 00c0 .dw USART_C | bm_USARTC_en +0000c6 388d .dw XT_CSTORE + +0000c7 00b3 .dw XT_UBRR +0000c8 38b1 .dw XT_DUP +0000c9 3af9 .dw XT_BYTESWAP +0000ca 383d .dw XT_DOLITERAL +0000cb 0040 .dw BAUDRATE_HIGH +0000cc 388d .dw XT_CSTORE +0000cd 383d .dw XT_DOLITERAL +0000ce 0029 .dw BAUDRATE_LOW +0000cf 388d .dw XT_CSTORE + .if XT_USART_INIT_RX!=0 +0000d0 005b .dw XT_USART_INIT_RX + .endif + .if XT_USART_INIT_TX!=0 + .endif + +0000d1 3820 .dw XT_EXIT + + ; settings for 1wire interface + .equ OW_PORT=PORTB + .EQU OW_BIT=4 + .include "drivers/1wire.asm" + + ; B. J. Rodriguez (MSP 430) + ; Matthias Trute (AVR Atmega) + ; COPYRIGHT + ; (c) 2012 Bradford J. Rodriguez for the 430 code and API + + ; adapted 430 assembly code to AVR + ; wishlist: + ; use a configurable pin at runtime, compatible with bitnames.frt + ; no external pull up, no external power supply for devices + ; ??? + ; + ;.EQU OW_BIT=4 + ;.equ OW_PORT=PORTE + .set OW_DDR=(OW_PORT-1) + .set OW_PIN=(OW_DDR-1) + + ;****f* 1W.RESET + ; NAME + ; 1W.RESET + ; SYNOPSIS + ; 1W.RESET ( -- f ) Initialize 1-wire devices; return true if present + ; DESCRIPTION + ; This configures the port pin used by the 1-wire interface, and then + ; sends an "initialize" sequence to the 1-wire devices. If any device + ; is present, it will be detected. + ; + ; Timing, per DS18B20 data sheet: + ; a) Output "0" (drive output low) for >480 usec. + ; b) Output "1" (let output float). + ; c) After 15 to 60 usec, device will drive pin low for 60 to 240 usec. + ; So, wait 75 usec and sample input. + ; d) Leave output high (floating) for at least 480 usec. + ;****** + ; ( -- f ) + ; Hardware + ; Initialize 1-wire devices; return true if present + VE_OW_RESET: +0000d2 ff08 .dw $ff08 +0000d3 7731 +0000d4 722e +0000d5 7365 +0000d6 7465 .db "1w.reset" +0000d7 00b7 .dw VE_HEAD + .set VE_HEAD = VE_OW_RESET + XT_OW_RESET: +0000d8 00d9 .dw PFA_OW_RESET + PFA_OW_RESET: +0000d9 939a +0000da 938a savetos + ; setup to output +0000db 9abc sbi OW_DDR, OW_BIT + ; Pull output low +0000dc 98c4 cbi OW_PORT, OW_BIT + ; Delay >480 usec +0000dd ece0 +0000de e0f3 +0000df 9731 +0000e0 f7f1 DELAY 480 + ; Critical timing period, disable interrupts. +0000e1 b71f in temp1, SREG +0000e2 94f8 cli + ; Pull output high +0000e3 9ac4 sbi OW_PORT, OW_BIT + ; make pin input, sends "1" +0000e4 98bc cbi OW_DDR, OW_BIT +0000e5 e8e0 +0000e6 e0f0 +0000e7 9731 +0000e8 f7f1 DELAY 64 ; delayB + ; Sample input pin, set TOS if input is zero +0000e9 b386 in tosl, OW_PIN +0000ea ff84 sbrs tosl, OW_BIT +0000eb ef9f ser tosh + ; End critical timing period, enable interrupts +0000ec bf1f out SREG, temp1 + ; release bus +0000ed 98bc cbi OW_DDR, OW_BIT +0000ee 98c4 cbi OW_PORT, OW_BIT + + ; Delay rest of 480 usec +0000ef e4e0 +0000f0 e0f3 +0000f1 9731 +0000f2 f7f1 DELAY 416 + ; we now have the result flag in TOS +0000f3 2f89 mov tosl, tosh +0000f4 940c 3805 jmp_ DO_NEXT + + ;****f* 1W.SLOT + ; NAME + ; 1W.SLOT + ; SYNOPSIS + ; 1W.SLOT ( c -- c' ) Write and read one bit to/from 1-wire. + ; DESCRIPTION + ; The "touch byte" function is described in Dallas App Note 74. + ; It outputs a byte to the 1-wire pin, LSB first, and reads back + ; the state of the 1-wire pin after a suitable delay. + ; To read a byte, output $FF and read the reply data. + ; To write a byte, output that byte and discard the reply. + ; + ; This function performs one bit of the "touch" operation -- + ; one read/write "slot" in Dallas jargon. Perform this eight + ; times in a row to get the "touch byte" function. + ; + ; PARAMETERS + ; The input parameter is xxxxxxxxbbbbbbbo where + ; 'xxxxxxxx' are don't cares, + ; 'bbbbbbb' are bits to be shifted down, and + ; 'o' is the bit to be output in the slot. This must be 1 + ; to create a read slot. + ; + ; The returned value is xxxxxxxxibbbbbbb where + ; 'xxxxxxxx' are not known (the input shifted down 1 position), + ; 'i' is the bit read during the slot. This has no meaning + ; if it was a write slot. + ; 'bbbbbbb' are the 7 input bits, shifted down one position. + ; + ; This peculiar parameter usage allows OWTOUCH to be written as + ; OWSLOT OWSLOT OWSLOT OWSLOT OWSLOT OWSLOT OWSLOT OWSLOT + ; + ; NOTES + ; Interrupts are disabled during each bit. + + ; Timing, per DS18B20 data sheet: + ; a) Output "0" for start period. (> 1 us, < 15 us, typ. 6 us*) + ; b) Output data bit (0 or 1), open drain + ; c) After MS from start of cycle, sample input (15 to 60 us, typ. 25 us*) + ; d) After write-0 period from start of cycle, output "1" (>60 us) + ; e) After recovery period, loop or return. (> 1 us) + ; For writes, DS18B20 samples input 15 to 60 usec from start of cycle. + ; * "Typical" values are per App Note 132 for a 300m cable length. + + ; --------- ------------------------------- + ; \ / / + ; ------------------------------- + ; a b c d e + ; | 6us | 19us | 35us | 2us | + ;****** + ; ( c -- c' ) + ; Hardware + ; Write and read one bit to/from 1-wire. + VE_OW_SLOT: +0000f6 ff07 .dw $ff07 +0000f7 7731 +0000f8 732e +0000f9 6f6c +0000fa 0074 .db "1w.slot",0 +0000fb 00d2 .dw VE_HEAD + .set VE_HEAD = VE_OW_SLOT + XT_OW_SLOT: +0000fc 00fd .dw PFA_OW_SLOT + PFA_OW_SLOT: + ; pull low +0000fd 98c4 cbi OW_PORT, OW_BIT +0000fe 9abc sbi OW_DDR, OW_BIT + ; disable interrupts +0000ff b71f in temp1, SREG +000100 94f8 cli +000101 e0ec +000102 e0f0 +000103 9731 +000104 f7f1 DELAY 6 ; DELAY A + ; check bit +000105 9488 clc +000106 9587 ror tosl +000107 f410 brcc PFA_OW_SLOT0 ; a 0 keeps the bus low + ; release bus, a 1 is written +000108 9ac4 sbi OW_PORT, OW_BIT +000109 98bc cbi OW_DDR, OW_BIT + PFA_OW_SLOT0: + ; sample the input (no action required if zero) +00010a e1e2 +00010b e0f0 +00010c 9731 +00010d f7f1 DELAY 9 ; wait DELAY E to sample +00010e b306 in temp0, OW_PIN +00010f fd04 sbrc temp0, OW_BIT +000110 6880 ori tosl, $80 + +000111 e6e6 +000112 e0f0 +000113 9731 +000114 f7f1 DELAY 51 ; DELAY B +000115 9ac4 sbi OW_PORT, OW_BIT ; release bus +000116 98bc cbi OW_DDR, OW_BIT +000117 e0e4 +000118 e0f0 +000119 9731 +00011a f7f1 delay 2 + ; re-enable interrupts +00011b bf1f out SREG, temp1 +00011c 940c 3805 jmp_ DO_NEXT + + .include "amforth.asm" + + ;;;; + ;;;; GPL V2 (only) + + .set AMFORTH_NRWW_SIZE=(FLASHEND-AMFORTH_RO_SEG)*2 + + .set corepc = pc + .org $0000 +000000 940c 3d39 jmp_ PFA_COLD + + .org corepc + .include "drivers/generic-isr.asm" + + .eseg +000000 intvec: .byte INTVECTORS * CELLSIZE + .dseg +000072 intcnt: .byte INTVECTORS + .cseg + + ; interrupt routine gets called (again) by rcall! This gives the + ; address of the int-vector on the stack. + isr: +00011e 920a st -Y, r0 +00011f b60f in r0, SREG +000120 920a st -Y, r0 + .if (pclen==3) + .endif +000121 900f pop r0 +000122 900f pop r0 ; = intnum * intvectorsize + 1 (address following the rcall) +000123 940a dec r0 + .if intvecsize == 1 ; + .endif +000124 2cb0 mov isrflag, r0 +000125 93ff push zh +000126 93ef push zl +000127 e7e2 ldi zl, low(intcnt) +000128 e0f0 ldi zh, high(intcnt) +000129 9406 lsr r0 ; we use byte addresses in the counter array, not words +00012a 0de0 add zl, r0 +00012b 1df3 adc zh, zeroh +00012c 8000 ld r0, Z +00012d 9403 inc r0 +00012e 8200 st Z, r0 +00012f 91ef pop zl +000130 91ff pop zh + +000131 9009 ld r0, Y+ +000132 be0f out SREG, r0 +000133 9009 ld r0, Y+ +000134 9508 ret ; returns the interrupt, the rcall stack frame is removed! + ; no reti here, see words/isr-end.asm + ; lower part of the dictionary + .include "dict/rww.inc" + + + ; Arithmetics + ; add a number to a double cell + VE_MPLUS: +000135 ff02 .dw $ff02 +000136 2b6d .db "m+" +000137 00f6 .dw VE_HEAD + .set VE_HEAD = VE_MPLUS + XT_MPLUS: +000138 3801 .dw DO_COLON + PFA_MPLUS: +000139 3fc7 .dw XT_S2D +00013a 3c15 .dw XT_DPLUS +00013b 3820 .dw XT_EXIT + .include "words/ud-star.asm" + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_UDSTAR: +00013c ff03 .dw $ff03 +00013d 6475 +../../common\words/ud-star.asm(9): warning: .cseg .db misalignment - padding zero byte +00013e 002a .db "ud*" +00013f 0135 .dw VE_HEAD + .set VE_HEAD = VE_UDSTAR + XT_UDSTAR: +000140 3801 .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 + ; + +000141 38b1 +000142 38ff +000143 39e0 +000144 38d9 .DW XT_DUP,XT_TO_R,XT_UMSTAR,XT_DROP +000145 38c4 +000146 38f6 +000147 39e0 +000148 38e1 +000149 399d +00014a 3820 .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: +00014b ff04 .dw $ff04 +00014c 6d75 +00014d 7861 .db "umax" +00014e 013c .dw VE_HEAD + .set VE_HEAD = VE_UMAX + XT_UMAX: +00014f 3801 .dw DO_COLON + PFA_UMAX: + .endif + +000150 3ec9 +000151 395c .DW XT_2DUP,XT_ULESS +000152 3836 .dw XT_DOCONDBRANCH +000153 0155 DEST(UMAX1) +000154 38c4 .DW XT_SWAP +000155 38d9 UMAX1: .DW XT_DROP +000156 3820 .dw XT_EXIT + .include "words/umin.asm" + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_UMIN: +000157 ff04 .dw $ff04 +000158 6d75 +000159 6e69 .db "umin" +00015a 014b .dw VE_HEAD + .set VE_HEAD = VE_UMIN + XT_UMIN: +00015b 3801 .dw DO_COLON + PFA_UMIN: + .endif +00015c 3ec9 +00015d 3967 .DW XT_2DUP,XT_UGREATER +00015e 3836 .dw XT_DOCONDBRANCH +00015f 0161 DEST(UMIN1) +000160 38c4 .DW XT_SWAP +000161 38d9 UMIN1: .DW XT_DROP +000162 3820 .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: +000163 3801 .dw DO_COLON + PFA_IMMEDIATEQ: +000164 383d .dw XT_DOLITERAL +000165 8000 .dw $8000 +000166 3a13 .dw XT_AND +000167 391a .dw XT_ZEROEQUAL +000168 3836 .dw XT_DOCONDBRANCH +000169 016c DEST(IMMEDIATEQ1) +00016a 3fe6 .dw XT_ONE +00016b 3820 .dw XT_EXIT + IMMEDIATEQ1: + ; not immediate +00016c 394b .dw XT_TRUE +00016d 3820 .dw XT_EXIT + .include "words/name2flags.asm" + + ; Tools + ; get the flags from a name token + VE_NAME2FLAGS: +00016e ff0a .dw $ff0a +00016f 616e +000170 656d +000171 663e +000172 616c +000173 7367 .db "name>flags" +000174 0157 .dw VE_HEAD + .set VE_HEAD = VE_NAME2FLAGS + XT_NAME2FLAGS: +000175 3801 .dw DO_COLON + PFA_NAME2FLAGS: +000176 3bcb .dw XT_FETCHI ; skip to link field +000177 383d .dw XT_DOLITERAL +000178 ff00 .dw $ff00 +000179 3a13 .dw XT_AND +00017a 3820 .dw XT_EXIT + + .if AMFORTH_NRWW_SIZE > 8000 + .elif AMFORTH_NRWW_SIZE > 4000 + .include "dict/appl_4k.inc" + + + ; Tools + ; print the version string + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_DOT_VER: +00017b ff03 .dw $ff03 +00017c 6576 +../../common\words/ver.asm(12): warning: .cseg .db misalignment - padding zero byte +00017d 0072 .db "ver" +00017e 016e .dw VE_HEAD + .set VE_HEAD = VE_DOT_VER + XT_DOT_VER: +00017f 3801 .dw DO_COLON + PFA_DOT_VER: + .endif +000180 02cf .dw XT_ENV_FORTHNAME +000181 03f8 .dw XT_ITYPE +000182 3fae .dw XT_SPACE +000183 3ebd .dw XT_BASE +000184 3879 .dw XT_FETCH + +000185 02dd .dw XT_ENV_FORTHVERSION +000186 3f41 .dw XT_DECIMAL +000187 3fc7 .dw XT_S2D +000188 0316 .dw XT_L_SHARP +000189 031e .dw XT_SHARP +00018a 383d .dw XT_DOLITERAL +00018b 002e .dw '.' +00018c 0307 .dw XT_HOLD +00018d 0334 .dw XT_SHARP_S +00018e 033f .dw XT_SHARP_G +00018f 042e .dw XT_TYPE +000190 3ebd .dw XT_BASE +000191 3881 .dw XT_STORE +000192 3fae .dw XT_SPACE +000193 02e5 .dw XT_ENV_CPU +000194 03f8 .dw XT_ITYPE + +000195 3820 .dw XT_EXIT + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + .include "words/noop.asm" + + ; Tools + ; do nothing + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_NOOP: +000196 ff04 .dw $ff04 +000197 6f6e +000198 706f .db "noop" +000199 017b .dw VE_HEAD + .set VE_HEAD = VE_NOOP + XT_NOOP: +00019a 3801 .dw DO_COLON + PFA_NOOP: + .endif +00019b 3820 .DW XT_EXIT + .include "words/unused.asm" + + ; Tools + ; Amount of available RAM (incl. PAD) + VE_UNUSED: +00019c ff06 .dw $ff06 +00019d 6e75 +00019e 7375 +00019f 6465 .db "unused" +0001a0 0196 .dw VE_HEAD + .set VE_HEAD = VE_UNUSED + XT_UNUSED: +0001a1 3801 .dw DO_COLON + PFA_UNUSED: +0001a2 3a8d .dw XT_SP_FETCH +0001a3 3f23 .dw XT_HERE +0001a4 3993 .dw XT_MINUS +0001a5 3820 .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: +0001a6 0002 .dw $0002 +0001a7 6f74 .db "to" +0001a8 019c .dw VE_HEAD + .set VE_HEAD = VE_TO + XT_TO: +0001a9 3801 .dw DO_COLON + PFA_TO: + .endif +0001aa 043d .dw XT_TICK +0001ab 3fd0 .dw XT_TO_BODY +0001ac 3eb7 .dw XT_STATE +0001ad 3879 .dw XT_FETCH +0001ae 3836 .dw XT_DOCONDBRANCH +0001af 01ba DEST(PFA_TO1) +0001b0 0751 .dw XT_COMPILE +0001b1 01b4 .dw XT_DOTO +0001b2 075c .dw XT_COMMA +0001b3 3820 .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: +0001b4 3801 .dw DO_COLON + PFA_DOTO: + .endif +0001b5 38f6 .dw XT_R_FROM +0001b6 38b1 .dw XT_DUP +0001b7 01c6 .dw XT_ICELLPLUS +0001b8 38ff .dw XT_TO_R +0001b9 3bcb .dw XT_FETCHI + PFA_TO1: +0001ba 38b1 .dw XT_DUP +0001bb 01c6 .dw XT_ICELLPLUS +0001bc 01c6 .dw XT_ICELLPLUS +0001bd 3bcb .dw XT_FETCHI +0001be 382a .dw XT_EXECUTE +0001bf 3820 .dw XT_EXIT + .include "words/i-cellplus.asm" + + ; Compiler + ; skip to the next cell in flash + VE_ICELLPLUS: +0001c0 ff07 .dw $FF07 +0001c1 2d69 +0001c2 6563 +0001c3 6c6c +0001c4 002b .db "i-cell+",0 +0001c5 01a6 .dw VE_HEAD + .set VE_HEAD = VE_ICELLPLUS + XT_ICELLPLUS: +0001c6 3801 .dw DO_COLON + PFA_ICELLPLUS: +0001c7 3a2f .dw XT_1PLUS +0001c8 3820 .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: +0001c9 ff08 .dw $ff08 +0001ca 6369 +0001cb 6d6f +0001cc 6170 +0001cd 6572 .db "icompare" +0001ce 01c0 .dw VE_HEAD + .set VE_HEAD = VE_ICOMPARE + XT_ICOMPARE: +0001cf 3801 .dw DO_COLON + PFA_ICOMPARE: +0001d0 38ff .dw XT_TO_R ; ( -- r-addr r-len f-addr) +0001d1 38cf .dw XT_OVER ; ( -- r-addr r-len f-addr r-len) +0001d2 38f6 .dw XT_R_FROM ; ( -- r-addr r-len f-addr r-len f-len ) +0001d3 3913 .dw XT_NOTEQUAL ; ( -- r-addr r-len f-addr flag ) +0001d4 3836 .dw XT_DOCONDBRANCH +0001d5 01da .dw PFA_ICOMPARE_SAMELEN +0001d6 3ed2 .dw XT_2DROP +0001d7 38d9 .dw XT_DROP +0001d8 394b .dw XT_TRUE +0001d9 3820 .dw XT_EXIT + PFA_ICOMPARE_SAMELEN: +0001da 38c4 .dw XT_SWAP ; ( -- r-addr f-addr len ) +0001db 3954 .dw XT_ZERO +0001dc 081b .dw XT_QDOCHECK +0001dd 3836 .dw XT_DOCONDBRANCH +0001de 01fd .dw PFA_ICOMPARE_DONE +0001df 3a9b .dw XT_DODO + PFA_ICOMPARE_LOOP: + ; ( r-addr f-addr --) +0001e0 38cf .dw XT_OVER +0001e1 3879 .dw XT_FETCH + .if WANT_IGNORECASE == 1 + .endif +0001e2 38cf .dw XT_OVER +0001e3 3bcb .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 +0001e4 38b1 .dw XT_DUP + ;.dw XT_BYTESWAP +0001e5 383d .dw XT_DOLITERAL +0001e6 0100 .dw $100 +0001e7 395c .dw XT_ULESS +0001e8 3836 .dw XT_DOCONDBRANCH +0001e9 01ee .dw PFA_ICOMPARE_LASTCELL +0001ea 38c4 .dw XT_SWAP +0001eb 383d .dw XT_DOLITERAL +0001ec 00ff .dw $00FF +0001ed 3a13 .dw XT_AND ; the final swap can be omitted + PFA_ICOMPARE_LASTCELL: +0001ee 3913 .dw XT_NOTEQUAL +0001ef 3836 .dw XT_DOCONDBRANCH +0001f0 01f5 .dw PFA_ICOMPARE_NEXTLOOP +0001f1 3ed2 .dw XT_2DROP +0001f2 394b .dw XT_TRUE +0001f3 3ad4 .dw XT_UNLOOP +0001f4 3820 .dw XT_EXIT + PFA_ICOMPARE_NEXTLOOP: +0001f5 3a2f .dw XT_1PLUS +0001f6 38c4 .dw XT_SWAP +0001f7 3c90 .dw XT_CELLPLUS +0001f8 38c4 .dw XT_SWAP +0001f9 383d .dw XT_DOLITERAL +0001fa 0002 .dw 2 +0001fb 3aba .dw XT_DOPLUSLOOP +0001fc 01e0 .dw PFA_ICOMPARE_LOOP + PFA_ICOMPARE_DONE: +0001fd 3ed2 .dw XT_2DROP +0001fe 3954 .dw XT_ZERO +0001ff 3820 .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: +000200 ff01 .dw $ff01 +000201 002a .db "*",0 +000202 01c9 .dw VE_HEAD + .set VE_HEAD = VE_STAR + XT_STAR: +000203 3801 .dw DO_COLON + PFA_STAR: + .endif + +000204 39a6 .dw XT_MSTAR +000205 38d9 .dw XT_DROP +000206 3820 .dw XT_EXIT + .include "words/j.asm" + + ; Compiler + ; loop counter of outer loop + VE_J: +000207 ff01 .dw $FF01 +000208 006a .db "j",0 +000209 0200 .dw VE_HEAD + .set VE_HEAD = VE_J + XT_J: +00020a 3801 .dw DO_COLON + PFA_J: +00020b 3a76 .dw XT_RP_FETCH +00020c 383d .dw XT_DOLITERAL +00020d 0007 .dw 7 +00020e 399d .dw XT_PLUS +00020f 3879 .dw XT_FETCH +000210 3a76 .dw XT_RP_FETCH +000211 383d .dw XT_DOLITERAL +000212 0009 .dw 9 +000213 399d .dw XT_PLUS +000214 3879 .dw XT_FETCH +000215 399d .dw XT_PLUS +000216 3820 .dw XT_EXIT + .include "words/dabs.asm" + + ; Arithmetics + ; double cell absolute value + VE_DABS: +000217 ff04 .dw $ff04 +000218 6164 +000219 7362 .db "dabs" +00021a 0207 .dw VE_HEAD + .set VE_HEAD = VE_DABS + XT_DABS: +00021b 3801 .dw DO_COLON + PFA_DABS: +00021c 38b1 .dw XT_DUP +00021d 3921 .dw XT_ZEROLESS +00021e 3836 .dw XT_DOCONDBRANCH +00021f 0221 .dw PFA_DABS1 +000220 0228 .dw XT_DNEGATE + PFA_DABS1: +000221 3820 .dw XT_EXIT + ; : dabs ( ud1 -- +d2 ) dup 0< if dnegate then ; + .include "words/dnegate.asm" + + ; Arithmetics + ; double cell negation + VE_DNEGATE: +000222 ff07 .dw $ff07 +000223 6e64 +000224 6765 +000225 7461 +000226 0065 .db "dnegate",0 +000227 0217 .dw VE_HEAD + .set VE_HEAD = VE_DNEGATE + XT_DNEGATE: +000228 3801 .dw DO_COLON + PFA_DNEGATE: +000229 3c3b .dw XT_DINVERT +00022a 3fe6 .dw XT_ONE +00022b 3954 .dw XT_ZERO +00022c 3c15 .dw XT_DPLUS +00022d 3820 .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: +00022e ff05 .dw $ff05 +00022f 6d63 +000230 766f +000231 0065 .db "cmove",0 +000232 0222 .dw VE_HEAD + .set VE_HEAD = VE_CMOVE + XT_CMOVE: +000233 0234 .dw PFA_CMOVE + PFA_CMOVE: +000234 93bf push xh +000235 93af push xl +000236 91e9 ld zl, Y+ +000237 91f9 ld zh, Y+ ; addr-to +000238 91a9 ld xl, Y+ +000239 91b9 ld xh, Y+ ; addr-from +00023a 2f09 mov temp0, tosh +00023b 2b08 or temp0, tosl +00023c f021 brbs 1, PFA_CMOVE1 + PFA_CMOVE2: +00023d 911d ld temp1, X+ +00023e 9311 st Z+, temp1 +00023f 9701 sbiw tosl, 1 +000240 f7e1 brbc 1, PFA_CMOVE2 + PFA_CMOVE1: +000241 91af pop xl +000242 91bf pop xh +000243 9189 +000244 9199 loadtos +000245 940c 3805 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: +000247 ff05 .dw $ff05 +000248 7332 +000249 6177 +00024a 0070 .db "2swap",0 +00024b 022e .dw VE_HEAD + .set VE_HEAD = VE_2SWAP + XT_2SWAP: +00024c 3801 .dw DO_COLON + PFA_2SWAP: + + .endif +00024d 38e1 .dw XT_ROT +00024e 38ff .dw XT_TO_R +00024f 38e1 .dw XT_ROT +000250 38f6 .dw XT_R_FROM +000251 3820 .dw XT_EXIT + .include "words/tib.asm" + + ; System + ; refills the input buffer + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_REFILLTIB: +000252 ff0a .dw $ff0a +000253 6572 +000254 6966 +000255 6c6c +000256 742d +000257 6269 .db "refill-tib" +000258 0247 .dw VE_HEAD + .set VE_HEAD = VE_REFILLTIB + XT_REFILLTIB: +000259 3801 .dw DO_COLON + PFA_REFILLTIB: + .endif +00025a 0275 .dw XT_TIB +00025b 383d .dw XT_DOLITERAL +00025c 005a .dw TIB_SIZE +00025d 048d .dw XT_ACCEPT +00025e 027b .dw XT_NUMBERTIB +00025f 3881 .dw XT_STORE +000260 3954 .dw XT_ZERO +000261 3ee2 .dw XT_TO_IN +000262 3881 .dw XT_STORE +000263 394b .dw XT_TRUE ; -1 +000264 3820 .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: +000265 ff0a .dw $FF0A +000266 6f73 +000267 7275 +000268 6563 +000269 742d +00026a 6269 .db "source-tib" +00026b 0252 .dw VE_HEAD + .set VE_HEAD = VE_SOURCETIB + XT_SOURCETIB: +00026c 3801 .dw DO_COLON + PFA_SOURCETIB: + .endif +00026d 0275 .dw XT_TIB +00026e 027b .dw XT_NUMBERTIB +00026f 3879 .dw XT_FETCH +000270 3820 .dw XT_EXIT + + ; ( -- addr ) + ; System Variable + ; terminal input buffer address + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_TIB: +000271 ff03 .dw $ff03 +000272 6974 +000273 0062 .db "tib",0 +000274 0265 .dw VE_HEAD + .set VE_HEAD = VE_TIB + XT_TIB: +000275 3848 .dw PFA_DOVARIABLE + PFA_TIB: +000276 0087 .dw ram_tib + .dseg +000087 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: +000277 ff04 .dw $ff04 +000278 7423 +000279 6269 .db "#tib" +00027a 0271 .dw VE_HEAD + .set VE_HEAD = VE_NUMBERTIB + XT_NUMBERTIB: +00027b 3848 .dw PFA_DOVARIABLE + PFA_NUMBERTIB: +00027c 00e1 .dw ram_sharptib + .dseg +0000e1 ram_sharptib: .byte 2 + .cseg + .endif + .include "words/init-ram.asm" + + ; Tools + ; copy len cells from eeprom to ram + VE_EE2RAM: +00027d ff06 .dw $ff06 +00027e 6565 +00027f 723e +000280 6d61 .db "ee>ram" +000281 0277 .dw VE_HEAD + .set VE_HEAD = VE_EE2RAM + XT_EE2RAM: +000282 3801 .dw DO_COLON + PFA_EE2RAM: ; ( -- ) +000283 3954 .dw XT_ZERO +000284 3a9b .dw XT_DODO + PFA_EE2RAM_1: + ; ( -- e-addr r-addr ) +000285 38cf .dw XT_OVER +000286 3b5f .dw XT_FETCHE +000287 38cf .dw XT_OVER +000288 3881 .dw XT_STORE +000289 3c90 .dw XT_CELLPLUS +00028a 38c4 .dw XT_SWAP +00028b 3c90 .dw XT_CELLPLUS +00028c 38c4 .dw XT_SWAP +00028d 3ac9 .dw XT_DOLOOP +00028e 0285 .dw PFA_EE2RAM_1 + PFA_EE2RAM_2: +00028f 3ed2 .dw XT_2DROP +000290 3820 .dw XT_EXIT + + ; ( -- ) + ; Tools + ; setup the default user area from eeprom + VE_INIT_RAM: +000291 ff08 .dw $ff08 +000292 6e69 +000293 7469 +000294 722d +000295 6d61 .db "init-ram" +000296 027d .dw VE_HEAD + .set VE_HEAD = VE_INIT_RAM + XT_INIT_RAM: +000297 3801 .dw DO_COLON + PFA_INI_RAM: ; ( -- ) +000298 383d .dw XT_DOLITERAL +000299 0060 .dw EE_INITUSER +00029a 3b02 .dw XT_UP_FETCH +00029b 383d .dw XT_DOLITERAL +00029c 0022 .dw SYSUSERSIZE +00029d 3a04 .dw XT_2SLASH +00029e 0282 .dw XT_EE2RAM +00029f 3820 .dw XT_EXIT + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + + .include "words/environment.asm" + + ; System Value + ; word list identifier of the environmental search list + VE_ENVIRONMENT: +0002a0 ff0b .dw $ff0b +0002a1 6e65 +0002a2 6976 +0002a3 6f72 +0002a4 6d6e +0002a5 6e65 +0002a6 0074 .db "environment",0 +0002a7 0291 .dw VE_HEAD + .set VE_HEAD = VE_ENVIRONMENT + XT_ENVIRONMENT: +0002a8 3848 .dw PFA_DOVARIABLE + PFA_ENVIRONMENT: +0002a9 003a .dw CFG_ENVIRONMENT + .include "words/env-wordlists.asm" + + ; Environment + ; maximum number of wordlists in the dictionary search order + VE_ENVWORDLISTS: +0002aa ff09 .dw $ff09 +0002ab 6f77 +0002ac 6472 +0002ad 696c +0002ae 7473 +0002af 0073 .db "wordlists",0 +0002b0 0000 .dw VE_ENVHEAD + .set VE_ENVHEAD = VE_ENVWORDLISTS + XT_ENVWORDLISTS: +0002b1 3801 .dw DO_COLON + PFA_ENVWORDLISTS: +0002b2 383d .dw XT_DOLITERAL +0002b3 0008 .dw NUMWORDLISTS +0002b4 3820 .dw XT_EXIT + .include "words/env-slashpad.asm" + + ; Environment + ; Size of the PAD buffer in bytes + VE_ENVSLASHPAD: +0002b5 ff04 .dw $ff04 +0002b6 702f +0002b7 6461 .db "/pad" +0002b8 02aa .dw VE_ENVHEAD + .set VE_ENVHEAD = VE_ENVSLASHPAD + XT_ENVSLASHPAD: +0002b9 3801 .dw DO_COLON + PFA_ENVSLASHPAD: +0002ba 3a8d .dw XT_SP_FETCH +0002bb 3ee8 .dw XT_PAD +0002bc 3993 .dw XT_MINUS +0002bd 3820 .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: +0002be ff05 .dw $ff05 +0002bf 682f +0002c0 6c6f +0002c1 0064 .db "/hold",0 +0002c2 02b5 .dw VE_ENVHEAD + .set VE_ENVHEAD = VE_ENVSLASHHOLD + XT_ENVSLASHHOLD: +0002c3 3801 .dw DO_COLON + PFA_ENVSLASHHOLD: + .endif +0002c4 3ee8 .dw XT_PAD +0002c5 3f23 .dw XT_HERE +0002c6 3993 .dw XT_MINUS +0002c7 3820 .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: +0002c8 ff0a .dw $ff0a +0002c9 6f66 +0002ca 7472 +0002cb 2d68 +0002cc 616e +0002cd 656d .db "forth-name" +0002ce 02be .dw VE_ENVHEAD + .set VE_ENVHEAD = VE_ENV_FORTHNAME + XT_ENV_FORTHNAME: +0002cf 3801 .dw DO_COLON + PFA_EN_FORTHNAME: +0002d0 03c5 .dw XT_DOSLITERAL +0002d1 0007 .dw 7 + .endif +0002d2 6d61 +0002d3 6f66 +0002d4 7472 +../../common\words/env-forthname.asm(22): warning: .cseg .db misalignment - padding zero byte +0002d5 0068 .db "amforth" + .if cpu_msp430==1 + .endif +0002d6 3820 .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: +0002d7 ff07 .dw $ff07 +0002d8 6576 +0002d9 7372 +0002da 6f69 +0002db 006e .db "version",0 +0002dc 02c8 .dw VE_ENVHEAD + .set VE_ENVHEAD = VE_ENV_FORTHVERSION + XT_ENV_FORTHVERSION: +0002dd 3801 .dw DO_COLON + PFA_EN_FORTHVERSION: + .endif +0002de 383d .dw XT_DOLITERAL +0002df 0041 .dw 65 +0002e0 3820 .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: +0002e1 ff03 .dw $ff03 +0002e2 7063 +0002e3 0075 .db "cpu",0 +0002e4 02d7 .dw VE_ENVHEAD + .set VE_ENVHEAD = VE_ENV_CPU + XT_ENV_CPU: +0002e5 3801 .dw DO_COLON + PFA_EN_CPU: + .endif +0002e6 383d .dw XT_DOLITERAL +0002e7 002d .dw mcu_name +0002e8 0424 .dw XT_ICOUNT +0002e9 3820 .dw XT_EXIT + .include "words/env-mcuinfo.asm" + + ; Environment + ; flash address of some CPU specific parameters + VE_ENV_MCUINFO: +0002ea ff08 .dw $ff08 +0002eb 636d +0002ec 2d75 +0002ed 6e69 +0002ee 6f66 .db "mcu-info" +0002ef 02e1 .dw VE_ENVHEAD + .set VE_ENVHEAD = VE_ENV_MCUINFO + XT_ENV_MCUINFO: +0002f0 3801 .dw DO_COLON + PFA_EN_MCUINFO: +0002f1 383d .dw XT_DOLITERAL +0002f2 0029 .dw mcu_info +0002f3 3820 .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: +0002f4 ff05 .dw $ff05 +0002f5 752f +0002f6 6573 +0002f7 0072 .db "/user",0 +0002f8 02ea .dw VE_ENVHEAD + .set VE_ENVHEAD = VE_ENVUSERSIZE + XT_ENVUSERSIZE: +0002f9 3801 .dw DO_COLON + PFA_ENVUSERSIZE: + .endif +0002fa 383d .dw XT_DOLITERAL +0002fb 002c .dw SYSUSERSIZE + APPUSERSIZE +0002fc 3820 .dw XT_EXIT + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + .include "words/hld.asm" + + ; Numeric IO + ; pointer to current write position in the Pictured Numeric Output buffer + VE_HLD: +0002fd ff03 .dw $ff03 +0002fe 6c68 +0002ff 0064 .db "hld",0 +000300 02a0 .dw VE_HEAD + .set VE_HEAD = VE_HLD + XT_HLD: +000301 3848 .dw PFA_DOVARIABLE + PFA_HLD: +000302 00e3 .dw ram_hld + + .dseg +0000e3 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: +000303 ff04 .dw $ff04 +000304 6f68 +000305 646c .db "hold" +000306 02fd .dw VE_HEAD + .set VE_HEAD = VE_HOLD + XT_HOLD: +000307 3801 .dw DO_COLON + PFA_HOLD: + .endif +000308 0301 .dw XT_HLD +000309 38b1 .dw XT_DUP +00030a 3879 .dw XT_FETCH +00030b 3a35 .dw XT_1MINUS +00030c 38b1 .dw XT_DUP +00030d 38ff .dw XT_TO_R +00030e 38c4 .dw XT_SWAP +00030f 3881 .dw XT_STORE +000310 38f6 .dw XT_R_FROM +000311 388d .dw XT_CSTORE +000312 3820 .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: +000313 ff02 .dw $ff02 +000314 233c .db "<#" +000315 0303 .dw VE_HEAD + .set VE_HEAD = VE_L_SHARP + XT_L_SHARP: +000316 3801 .dw DO_COLON + PFA_L_SHARP: + .endif +000317 3ee8 .dw XT_PAD +000318 0301 .dw XT_HLD +000319 3881 .dw XT_STORE +00031a 3820 .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: +00031b ff01 .dw $ff01 +00031c 0023 .db "#",0 +00031d 0313 .dw VE_HEAD + .set VE_HEAD = VE_SHARP + XT_SHARP: +00031e 3801 .dw DO_COLON + PFA_SHARP: + .endif +00031f 3ebd .dw XT_BASE +000320 3879 .dw XT_FETCH +000321 039b .dw XT_UDSLASHMOD +000322 38e1 .dw XT_ROT +000323 383d .dw XT_DOLITERAL +000324 0009 .dw 9 +000325 38cf .dw XT_OVER +000326 396e .dw XT_LESS +000327 3836 .dw XT_DOCONDBRANCH +000328 032c DEST(PFA_SHARP1) +000329 383d .dw XT_DOLITERAL +00032a 0007 .dw 7 +00032b 399d .dw XT_PLUS + PFA_SHARP1: +00032c 383d .dw XT_DOLITERAL +00032d 0030 .dw 48 ; ASCII 0 +00032e 399d .dw XT_PLUS +00032f 0307 .dw XT_HOLD +000330 3820 .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: +000331 ff02 .dw $ff02 +000332 7323 .db "#s" +000333 031b .dw VE_HEAD + .set VE_HEAD = VE_SHARP_S + XT_SHARP_S: +000334 3801 .dw DO_COLON + PFA_SHARP_S: + .endif + NUMS1: +000335 031e .dw XT_SHARP +000336 3ec9 .dw XT_2DUP +000337 3a1c .dw XT_OR +000338 391a .dw XT_ZEROEQUAL +000339 3836 .dw XT_DOCONDBRANCH +00033a 0335 DEST(NUMS1) ; PFA_SHARP_S +00033b 3820 .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: +00033c ff02 .dw $ff02 +00033d 3e23 .db "#>" +00033e 0331 .dw VE_HEAD + .set VE_HEAD = VE_SHARP_G + XT_SHARP_G: +00033f 3801 .dw DO_COLON + PFA_SHARP_G: + .endif +000340 3ed2 .dw XT_2DROP +000341 0301 .dw XT_HLD +000342 3879 .dw XT_FETCH +000343 3ee8 .dw XT_PAD +000344 38cf .dw XT_OVER +000345 3993 .dw XT_MINUS +000346 3820 .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: +000347 ff04 .dw $ff04 +000348 6973 +000349 6e67 .db "sign" +00034a 033c .dw VE_HEAD + .set VE_HEAD = VE_SIGN + XT_SIGN: +00034b 3801 .dw DO_COLON + PFA_SIGN: + .endif +00034c 3921 .dw XT_ZEROLESS +00034d 3836 .dw XT_DOCONDBRANCH +00034e 0352 DEST(PFA_SIGN1) +00034f 383d .dw XT_DOLITERAL +000350 002d .dw 45 ; ascii - +000351 0307 .dw XT_HOLD + PFA_SIGN1: +000352 3820 .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: +000353 ff03 .dw $ff03 +000354 2e64 +000355 0072 .db "d.r",0 +000356 0347 .dw VE_HEAD + .set VE_HEAD = VE_DDOTR + XT_DDOTR: +000357 3801 .dw DO_COLON + PFA_DDOTR: + + .endif +000358 38ff .dw XT_TO_R +000359 3eda .dw XT_TUCK +00035a 021b .dw XT_DABS +00035b 0316 .dw XT_L_SHARP +00035c 0334 .dw XT_SHARP_S +00035d 38e1 .dw XT_ROT +00035e 034b .dw XT_SIGN +00035f 033f .dw XT_SHARP_G +000360 38f6 .dw XT_R_FROM +000361 38cf .dw XT_OVER +000362 3993 .dw XT_MINUS +000363 3fb7 .dw XT_SPACES +000364 042e .dw XT_TYPE +000365 3820 .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: +000366 ff02 .dw $ff02 +000367 722e .db ".r" +000368 0353 .dw VE_HEAD + .set VE_HEAD = VE_DOTR + XT_DOTR: +000369 3801 .dw DO_COLON + PFA_DOTR: + + .endif +00036a 38ff .dw XT_TO_R +00036b 3fc7 .dw XT_S2D +00036c 38f6 .dw XT_R_FROM +00036d 0357 .dw XT_DDOTR +00036e 3820 .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: +00036f ff02 .dw $ff02 +000370 2e64 .db "d." +000371 0366 .dw VE_HEAD + .set VE_HEAD = VE_DDOT + XT_DDOT: +000372 3801 .dw DO_COLON + PFA_DDOT: + + .endif +000373 3954 .dw XT_ZERO +000374 0357 .dw XT_DDOTR +000375 3fae .dw XT_SPACE +000376 3820 .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: +000377 ff01 .dw $ff01 +000378 002e .db ".",0 +000379 036f .dw VE_HEAD + .set VE_HEAD = VE_DOT + XT_DOT: +00037a 3801 .dw DO_COLON + PFA_DOT: + .endif +00037b 3fc7 .dw XT_S2D +00037c 0372 .dw XT_DDOT +00037d 3820 .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: +00037e ff03 .dw $ff03 +00037f 6475 +000380 002e .db "ud.",0 +000381 0377 .dw VE_HEAD + .set VE_HEAD = VE_UDDOT + XT_UDDOT: +000382 3801 .dw DO_COLON + PFA_UDDOT: + .endif +000383 3954 .dw XT_ZERO +000384 038b .dw XT_UDDOTR +000385 3fae .dw XT_SPACE +000386 3820 .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: +000387 ff04 .dw $ff04 +000388 6475 +000389 722e .db "ud.r" +00038a 037e .dw VE_HEAD + .set VE_HEAD = VE_UDDOTR + XT_UDDOTR: +00038b 3801 .dw DO_COLON + PFA_UDDOTR: + .endif +00038c 38ff .dw XT_TO_R +00038d 0316 .dw XT_L_SHARP +00038e 0334 .dw XT_SHARP_S +00038f 033f .dw XT_SHARP_G +000390 38f6 .dw XT_R_FROM +000391 38cf .dw XT_OVER +000392 3993 .dw XT_MINUS +000393 3fb7 .dw XT_SPACES +000394 042e .dw XT_TYPE +000395 3820 .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: +000396 ff06 .dw $ff06 +000397 6475 +000398 6d2f +000399 646f .db "ud/mod" +00039a 0387 .dw VE_HEAD + .set VE_HEAD = VE_UDSLASHMOD + XT_UDSLASHMOD: +00039b 3801 .dw DO_COLON + PFA_UDSLASHMOD: + .endif +00039c 38ff .dw XT_TO_R +00039d 3954 .dw XT_ZERO +00039e 3908 .dw XT_R_FETCH +00039f 39c2 .dw XT_UMSLASHMOD +0003a0 38f6 .dw XT_R_FROM +0003a1 38c4 .dw XT_SWAP +0003a2 38ff .dw XT_TO_R +0003a3 39c2 .dw XT_UMSLASHMOD +0003a4 38f6 .dw XT_R_FROM +0003a5 3820 .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: +0003a6 ff06 .dw $ff06 +0003a7 6964 +0003a8 6967 +0003a9 3f74 .db "digit?" +0003aa 0396 .dw VE_HEAD + .set VE_HEAD = VE_DIGITQ + XT_DIGITQ: +0003ab 3801 .dw DO_COLON + PFA_DIGITQ: + .endif +0003ac 3f66 .dw XT_TOUPPER +0003ad 38b1 +0003ae 383d +0003af 0039 +0003b0 3978 +0003b1 383d +0003b2 0100 .DW XT_DUP,XT_DOLITERAL,57,XT_GREATER,XT_DOLITERAL,256 +0003b3 3a13 +0003b4 399d +0003b5 38b1 +0003b6 383d +0003b7 0140 +0003b8 3978 .DW XT_AND,XT_PLUS,XT_DUP,XT_DOLITERAL,320,XT_GREATER +0003b9 383d +0003ba 0107 +0003bb 3a13 +0003bc 3993 +0003bd 383d +0003be 0030 .DW XT_DOLITERAL,263,XT_AND,XT_MINUS,XT_DOLITERAL,48 +0003bf 3993 +0003c0 38b1 +0003c1 3ebd +0003c2 3879 +0003c3 395c .DW XT_MINUS,XT_DUP,XT_BASE,XT_FETCH,XT_ULESS +0003c4 3820 .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: +0003c5 3801 .dw DO_COLON + PFA_DOSLITERAL: +0003c6 3908 .dw XT_R_FETCH ; ( -- addr ) +0003c7 0424 .dw XT_ICOUNT +0003c8 38f6 .dw XT_R_FROM +0003c9 38cf .dw XT_OVER ; ( -- addr' n addr n) +0003ca 3a2f .dw XT_1PLUS +0003cb 3a04 .dw XT_2SLASH ; ( -- addr' n addr k ) +0003cc 399d .dw XT_PLUS ; ( -- addr' n addr'' ) +0003cd 3a2f .dw XT_1PLUS +0003ce 38ff .dw XT_TO_R ; ( -- ) +0003cf 3820 .dw XT_EXIT + .include "words/scomma.asm" + + ; Compiler + ; compiles a string from RAM to Flash + VE_SCOMMA: +0003d0 ff02 .dw $ff02 +0003d1 2c73 .db "s",$2c +0003d2 03a6 .dw VE_HEAD + .set VE_HEAD = VE_SCOMMA + XT_SCOMMA: +0003d3 3801 .dw DO_COLON + PFA_SCOMMA: +0003d4 38b1 .dw XT_DUP +0003d5 03d7 .dw XT_DOSCOMMA +0003d6 3820 .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: +0003d7 3801 .dw DO_COLON + PFA_DOSCOMMA: +0003d8 075c .dw XT_COMMA +0003d9 38b1 .dw XT_DUP ; ( --addr len len) +0003da 3a04 .dw XT_2SLASH ; ( -- addr len len/2 +0003db 3eda .dw XT_TUCK ; ( -- addr len/2 len len/2 +0003dc 3a0b .dw XT_2STAR ; ( -- addr len/2 len len' +0003dd 3993 .dw XT_MINUS ; ( -- addr len/2 rem +0003de 38ff .dw XT_TO_R +0003df 3954 .dw XT_ZERO +0003e0 081b .dw XT_QDOCHECK +0003e1 3836 .dw XT_DOCONDBRANCH +0003e2 03ea .dw PFA_SCOMMA2 +0003e3 3a9b .dw XT_DODO + PFA_SCOMMA1: +0003e4 38b1 .dw XT_DUP ; ( -- addr addr ) +0003e5 3879 .dw XT_FETCH ; ( -- addr c1c2 ) +0003e6 075c .dw XT_COMMA ; ( -- addr ) +0003e7 3c90 .dw XT_CELLPLUS ; ( -- addr+cell ) +0003e8 3ac9 .dw XT_DOLOOP +0003e9 03e4 .dw PFA_SCOMMA1 + PFA_SCOMMA2: +0003ea 38f6 .dw XT_R_FROM +0003eb 3928 .dw XT_GREATERZERO +0003ec 3836 .dw XT_DOCONDBRANCH +0003ed 03f1 .dw PFA_SCOMMA3 +0003ee 38b1 .dw XT_DUP ; well, tricky +0003ef 3898 .dw XT_CFETCH +0003f0 075c .dw XT_COMMA + PFA_SCOMMA3: +0003f1 38d9 .dw XT_DROP ; ( -- ) +0003f2 3820 .dw XT_EXIT + .include "words/itype.asm" + + ; Tools + ; reads string from flash and prints it + VE_ITYPE: +0003f3 ff05 .dw $ff05 +0003f4 7469 +0003f5 7079 +0003f6 0065 .db "itype",0 +0003f7 03d0 .dw VE_HEAD + .set VE_HEAD = VE_ITYPE + XT_ITYPE: +0003f8 3801 .dw DO_COLON + PFA_ITYPE: +0003f9 38b1 .dw XT_DUP ; ( --addr len len) +0003fa 3a04 .dw XT_2SLASH ; ( -- addr len len/2 +0003fb 3eda .dw XT_TUCK ; ( -- addr len/2 len len/2 +0003fc 3a0b .dw XT_2STAR ; ( -- addr len/2 len len' +0003fd 3993 .dw XT_MINUS ; ( -- addr len/2 rem +0003fe 38ff .dw XT_TO_R +0003ff 3954 .dw XT_ZERO +000400 081b .dw XT_QDOCHECK +000401 3836 .dw XT_DOCONDBRANCH +000402 040c .dw PFA_ITYPE2 +000403 3a9b .dw XT_DODO + PFA_ITYPE1: +000404 38b1 .dw XT_DUP ; ( -- addr addr ) +000405 3bcb .dw XT_FETCHI ; ( -- addr c1c2 ) +000406 38b1 .dw XT_DUP +000407 0419 .dw XT_LOWEMIT +000408 0415 .dw XT_HIEMIT +000409 3a2f .dw XT_1PLUS ; ( -- addr+cell ) +00040a 3ac9 .dw XT_DOLOOP +00040b 0404 .dw PFA_ITYPE1 + PFA_ITYPE2: +00040c 38f6 .dw XT_R_FROM +00040d 3928 .dw XT_GREATERZERO +00040e 3836 .dw XT_DOCONDBRANCH +00040f 0413 .dw PFA_ITYPE3 +000410 38b1 .dw XT_DUP ; make sure the drop below has always something to do +000411 3bcb .dw XT_FETCHI +000412 0419 .dw XT_LOWEMIT + PFA_ITYPE3: +000413 38d9 .dw XT_DROP +000414 3820 .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: +000415 3801 .dw DO_COLON + PFA_HIEMIT: +000416 3af9 .dw XT_BYTESWAP +000417 0419 .dw XT_LOWEMIT +000418 3820 .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: +000419 3801 .dw DO_COLON + PFA_LOWEMIT: +00041a 383d .dw XT_DOLITERAL +00041b 00ff .dw $00ff +00041c 3a13 .dw XT_AND +00041d 3ef2 .dw XT_EMIT +00041e 3820 .dw XT_EXIT + .include "words/icount.asm" + + ; Tools + ; get count information out of a counted string in flash + VE_ICOUNT: +00041f ff06 .dw $ff06 +000420 6369 +000421 756f +000422 746e .db "icount" +000423 03f3 .dw VE_HEAD + .set VE_HEAD = VE_ICOUNT + XT_ICOUNT: +000424 3801 .dw DO_COLON + PFA_ICOUNT: +000425 38b1 .dw XT_DUP +000426 3a2f .dw XT_1PLUS +000427 38c4 .dw XT_SWAP +000428 3bcb .dw XT_FETCHI +000429 3820 .dw XT_EXIT + .include "words/type.asm" + + ; Character IO + ; print a RAM based string + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_TYPE: +00042a ff04 .dw $ff04 +00042b 7974 +00042c 6570 .db "type" +00042d 041f .dw VE_HEAD + .set VE_HEAD = VE_TYPE + XT_TYPE: +00042e 3801 .dw DO_COLON + PFA_TYPE: + + .endif +00042f 3f99 .dw XT_BOUNDS +000430 081b .dw XT_QDOCHECK +000431 3836 .dw XT_DOCONDBRANCH +000432 0439 DEST(PFA_TYPE2) +000433 3a9b .dw XT_DODO + PFA_TYPE1: +000434 3aac .dw XT_I +000435 3898 .dw XT_CFETCH +000436 3ef2 .dw XT_EMIT +000437 3ac9 .dw XT_DOLOOP +000438 0434 DEST(PFA_TYPE1) + PFA_TYPE2: +000439 3820 .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: +00043a ff01 .dw $ff01 +00043b 0027 .db "'",0 +00043c 042a .dw VE_HEAD + .set VE_HEAD = VE_TICK + XT_TICK: +00043d 3801 .dw DO_COLON + PFA_TICK: + .endif +00043e 05b0 .dw XT_PARSENAME +00043f 05f3 .dw XT_FORTHRECOGNIZER +000440 05fe .dw XT_RECOGNIZE + ; a word is tickable unless DT:TOKEN is DT:NULL or + ; the interpret action is a NOOP +000441 38b1 .dw XT_DUP +000442 068b .dw XT_DT_NULL +000443 3fdf .dw XT_EQUAL +000444 38c4 .dw XT_SWAP +000445 3bcb .dw XT_FETCHI +000446 383d .dw XT_DOLITERAL +000447 019a .dw XT_NOOP +000448 3fdf .dw XT_EQUAL +000449 3a1c .dw XT_OR +00044a 3836 .dw XT_DOCONDBRANCH +00044b 044f DEST(PFA_TICK1) +00044c 383d .dw XT_DOLITERAL +00044d fff3 .dw -13 +00044e 3d86 .dw XT_THROW + PFA_TICK1: +00044f 38d9 .dw XT_DROP +000450 3820 .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: +000451 ff05 .dw $ff05 +000452 7363 +000453 696b +000454 0070 .db "cskip",0 +000455 043a .dw VE_HEAD + .set VE_HEAD = VE_CSKIP + XT_CSKIP: +000456 3801 .dw DO_COLON + PFA_CSKIP: + .endif +000457 38ff .dw XT_TO_R ; ( -- addr1 n1 ) + PFA_CSKIP1: +000458 38b1 .dw XT_DUP ; ( -- addr' n' n' ) +000459 3836 .dw XT_DOCONDBRANCH ; ( -- addr' n') +00045a 0465 DEST(PFA_CSKIP2) +00045b 38cf .dw XT_OVER ; ( -- addr' n' addr' ) +00045c 3898 .dw XT_CFETCH ; ( -- addr' n' c' ) +00045d 3908 .dw XT_R_FETCH ; ( -- addr' n' c' c ) +00045e 3fdf .dw XT_EQUAL ; ( -- addr' n' f ) +00045f 3836 .dw XT_DOCONDBRANCH ; ( -- addr' n') +000460 0465 DEST(PFA_CSKIP2) +000461 3fe6 .dw XT_ONE +000462 05a1 .dw XT_SLASHSTRING +000463 382f .dw XT_DOBRANCH +000464 0458 DEST(PFA_CSKIP1) + PFA_CSKIP2: +000465 38f6 .dw XT_R_FROM +000466 38d9 .dw XT_DROP ; ( -- addr2 n2) +000467 3820 .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: +000468 ff05 .dw $ff05 +000469 7363 +00046a 6163 +../../common\words/cscan.asm(12): warning: .cseg .db misalignment - padding zero byte +00046b 006e .db "cscan" +00046c 0451 .dw VE_HEAD + .set VE_HEAD = VE_CSCAN + XT_CSCAN: +00046d 3801 .dw DO_COLON + PFA_CSCAN: + .endif +00046e 38ff .dw XT_TO_R +00046f 38cf .dw XT_OVER + PFA_CSCAN1: +000470 38b1 .dw XT_DUP +000471 3898 .dw XT_CFETCH +000472 3908 .dw XT_R_FETCH +000473 3fdf .dw XT_EQUAL +000474 391a .dw XT_ZEROEQUAL +000475 3836 .dw XT_DOCONDBRANCH +000476 0482 DEST(PFA_CSCAN2) +000477 38c4 .dw XT_SWAP +000478 3a35 .dw XT_1MINUS +000479 38c4 .dw XT_SWAP +00047a 38cf .dw XT_OVER +00047b 3921 .dw XT_ZEROLESS ; not negative +00047c 391a .dw XT_ZEROEQUAL +00047d 3836 .dw XT_DOCONDBRANCH +00047e 0482 DEST(PFA_CSCAN2) +00047f 3a2f .dw XT_1PLUS +000480 382f .dw XT_DOBRANCH +000481 0470 DEST(PFA_CSCAN1) + PFA_CSCAN2: +000482 38f0 .dw XT_NIP +000483 38cf .dw XT_OVER +000484 3993 .dw XT_MINUS +000485 38f6 .dw XT_R_FROM +000486 38d9 .dw XT_DROP +000487 3820 .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: +000488 ff06 .dw $ff06 +000489 6361 +00048a 6563 +00048b 7470 .db "accept" +00048c 0468 .dw VE_HEAD + .set VE_HEAD = VE_ACCEPT + XT_ACCEPT: +00048d 3801 .dw DO_COLON + PFA_ACCEPT: + + .endif +00048e 38cf +00048f 399d +000490 3a35 +000491 38cf .DW XT_OVER,XT_PLUS,XT_1MINUS,XT_OVER +000492 3f03 +000493 38b1 +000494 04ce +000495 391a +000496 3836 ACC1: .DW XT_KEY,XT_DUP,XT_CRLFQ,XT_ZEROEQUAL,XT_DOCONDBRANCH +000497 04c0 DEST(ACC5) +000498 38b1 +000499 383d +00049a 0008 +00049b 3fdf +00049c 3836 .DW XT_DUP,XT_DOLITERAL,8,XT_EQUAL,XT_DOCONDBRANCH +00049d 04b0 DEST(ACC3) +00049e 38d9 +00049f 38e1 +0004a0 3ec9 +0004a1 3978 +0004a2 38ff +0004a3 38e1 +0004a4 38e1 +0004a5 38f6 +0004a6 3836 .DW XT_DROP,XT_ROT,XT_2DUP,XT_GREATER,XT_TO_R,XT_ROT,XT_ROT,XT_R_FROM,XT_DOCONDBRANCH +0004a7 04ae DEST(ACC6) +0004a8 04c6 +0004a9 3a35 +0004aa 38ff +0004ab 38cf +0004ac 38f6 +0004ad 014f .DW XT_BS,XT_1MINUS,XT_TO_R,XT_OVER,XT_R_FROM,XT_UMAX +0004ae 382f ACC6: .DW XT_DOBRANCH +0004af 04be DEST(ACC4) + + + ACC3: ; check for remaining control characters, replace them with blank +0004b0 38b1 .dw XT_DUP ; ( -- addr k k ) +0004b1 3f54 .dw XT_BL +0004b2 396e .dw XT_LESS +0004b3 3836 .dw XT_DOCONDBRANCH +0004b4 04b7 DEST(PFA_ACCEPT6) +0004b5 38d9 .dw XT_DROP +0004b6 3f54 .dw XT_BL + PFA_ACCEPT6: +0004b7 38b1 +0004b8 3ef2 +0004b9 38cf +0004ba 388d +0004bb 3a2f +0004bc 38cf +0004bd 015b .DW XT_DUP,XT_EMIT,XT_OVER,XT_CSTORE,XT_1PLUS,XT_OVER,XT_UMIN +0004be 382f ACC4: .DW XT_DOBRANCH +0004bf 0492 DEST(ACC1) +0004c0 38d9 +0004c1 38f0 +0004c2 38c4 +0004c3 3993 +0004c4 3fa1 +0004c5 3820 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: +0004c6 3801 .dw DO_COLON + .endif +0004c7 383d .dw XT_DOLITERAL +0004c8 0008 .dw 8 +0004c9 38b1 .dw XT_DUP +0004ca 3ef2 .dw XT_EMIT +0004cb 3fae .dw XT_SPACE +0004cc 3ef2 .dw XT_EMIT +0004cd 3820 .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: +0004ce 3801 .dw DO_COLON + .endif +0004cf 38b1 .dw XT_DUP +0004d0 383d .dw XT_DOLITERAL +0004d1 000d .dw 13 +0004d2 3fdf .dw XT_EQUAL +0004d3 38c4 .dw XT_SWAP +0004d4 383d .dw XT_DOLITERAL +0004d5 000a .dw 10 +0004d6 3fdf .dw XT_EQUAL +0004d7 3a1c .dw XT_OR +0004d8 3820 .dw XT_EXIT + .include "words/refill.asm" + + ; System + ; refills the input buffer + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_REFILL: +0004d9 ff06 .dw $ff06 +0004da 6572 +0004db 6966 +0004dc 6c6c .db "refill" +0004dd 0488 .dw VE_HEAD + .set VE_HEAD = VE_REFILL + XT_REFILL: +0004de 3dff .dw PFA_DODEFER1 + PFA_REFILL: + .endif +0004df 001a .dw USER_REFILL +0004e0 3dc8 .dw XT_UDEFERFETCH +0004e1 3dd4 .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: +0004e2 ff04 .dw $ff04 +0004e3 6863 +0004e4 7261 .db "char" +0004e5 04d9 .dw VE_HEAD + .set VE_HEAD = VE_CHAR + XT_CHAR: +0004e6 3801 .dw DO_COLON + PFA_CHAR: + .endif +0004e7 05b0 .dw XT_PARSENAME +0004e8 38d9 .dw XT_DROP +0004e9 3898 .dw XT_CFETCH +0004ea 3820 .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: +0004eb ff06 .dw $ff06 +0004ec 756e +0004ed 626d +0004ee 7265 .db "number" +0004ef 04e2 .dw VE_HEAD + .set VE_HEAD = VE_NUMBER + XT_NUMBER: +0004f0 3801 .dw DO_COLON + PFA_NUMBER: + .endif +0004f1 3ebd .dw XT_BASE +0004f2 3879 .dw XT_FETCH +0004f3 38ff .dw XT_TO_R +0004f4 0534 .dw XT_QSIGN +0004f5 38ff .dw XT_TO_R +0004f6 0547 .dw XT_SET_BASE +0004f7 0534 .dw XT_QSIGN +0004f8 38f6 .dw XT_R_FROM +0004f9 3a1c .dw XT_OR +0004fa 38ff .dw XT_TO_R + ; check whether something is left +0004fb 38b1 .dw XT_DUP +0004fc 391a .dw XT_ZEROEQUAL +0004fd 3836 .dw XT_DOCONDBRANCH +0004fe 0507 DEST(PFA_NUMBER0) + ; nothing is left. It cannot be a number at all +0004ff 3ed2 .dw XT_2DROP +000500 38f6 .dw XT_R_FROM +000501 38d9 .dw XT_DROP +000502 38f6 .dw XT_R_FROM +000503 3ebd .dw XT_BASE +000504 3881 .dw XT_STORE +000505 3954 .dw XT_ZERO +000506 3820 .dw XT_EXIT + PFA_NUMBER0: +000507 3b1e .dw XT_2TO_R +000508 3954 .dw XT_ZERO ; starting value +000509 3954 .dw XT_ZERO +00050a 3b2d .dw XT_2R_FROM +00050b 0565 .dw XT_TO_NUMBER ; ( 0. addr len -- d addr' len' + ; check length of the remaining string. + ; if zero: a single cell number is entered +00050c 38b9 .dw XT_QDUP +00050d 3836 .dw XT_DOCONDBRANCH +00050e 0529 DEST(PFA_NUMBER1) + ; if equal 1: mayba a trailing dot? --> double cell number +00050f 3fe6 .dw XT_ONE +000510 3fdf .dw XT_EQUAL +000511 3836 .dw XT_DOCONDBRANCH +000512 0520 DEST(PFA_NUMBER2) + ; excatly one character is left +000513 3898 .dw XT_CFETCH +000514 383d .dw XT_DOLITERAL +000515 002e .dw 46 ; . +000516 3fdf .dw XT_EQUAL +000517 3836 .dw XT_DOCONDBRANCH +000518 0521 DEST(PFA_NUMBER6) + ; its a double cell number + ; incorporate sign into number +000519 38f6 .dw XT_R_FROM +00051a 3836 .dw XT_DOCONDBRANCH +00051b 051d DEST(PFA_NUMBER3) +00051c 0228 .dw XT_DNEGATE + PFA_NUMBER3: +00051d 3feb .dw XT_TWO +00051e 382f .dw XT_DOBRANCH +00051f 052f DEST(PFA_NUMBER5) + PFA_NUMBER2: +000520 38d9 .dw XT_DROP + PFA_NUMBER6: +000521 3ed2 .dw XT_2DROP +000522 38f6 .dw XT_R_FROM +000523 38d9 .dw XT_DROP +000524 38f6 .dw XT_R_FROM +000525 3ebd .dw XT_BASE +000526 3881 .dw XT_STORE +000527 3954 .dw XT_ZERO +000528 3820 .dw XT_EXIT + PFA_NUMBER1: +000529 3ed2 .dw XT_2DROP ; remove the address + ; incorporate sign into number +00052a 38f6 .dw XT_R_FROM +00052b 3836 .dw XT_DOCONDBRANCH +00052c 052e DEST(PFA_NUMBER4) +00052d 3e27 .dw XT_NEGATE + PFA_NUMBER4: +00052e 3fe6 .dw XT_ONE + PFA_NUMBER5: +00052f 38f6 .dw XT_R_FROM +000530 3ebd .dw XT_BASE +000531 3881 .dw XT_STORE +000532 394b .dw XT_TRUE +000533 3820 .dw XT_EXIT + .include "words/q-sign.asm" + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + XT_QSIGN: +000534 3801 .dw DO_COLON + PFA_QSIGN: ; ( c -- ) + .endif +000535 38cf .dw XT_OVER ; ( -- addr len addr ) +000536 3898 .dw XT_CFETCH +000537 383d .dw XT_DOLITERAL +000538 002d .dw '-' +000539 3fdf .dw XT_EQUAL ; ( -- addr len flag ) +00053a 38b1 .dw XT_DUP +00053b 38ff .dw XT_TO_R +00053c 3836 .dw XT_DOCONDBRANCH +00053d 0540 DEST(PFA_NUMBERSIGN_DONE) +00053e 3fe6 .dw XT_ONE ; skip sign character +00053f 05a1 .dw XT_SLASHSTRING + PFA_NUMBERSIGN_DONE: +000540 38f6 .dw XT_R_FROM +000541 3820 .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: +000542 3852 .dw PFA_DOCONSTANT + .endif +000543 000a +000544 0010 +000545 0002 +000546 000a .dw 10,16,2,10 ; last one could a 8 instead. + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + XT_SET_BASE: +000547 3801 .dw DO_COLON + PFA_SET_BASE: ; ( adr1 len1 -- adr2 len2 ) + .endif +000548 38cf .dw XT_OVER +000549 3898 .dw XT_CFETCH +00054a 383d .dw XT_DOLITERAL +00054b 0023 .dw 35 +00054c 3993 .dw XT_MINUS +00054d 38b1 .dw XT_DUP +00054e 3954 .dw XT_ZERO +00054f 383d .dw XT_DOLITERAL +000550 0004 .dw 4 +000551 3e57 .dw XT_WITHIN +000552 3836 .dw XT_DOCONDBRANCH +000553 055d DEST(SET_BASE1) + .if cpu_msp430==1 + .endif +000554 0542 .dw XT_BASES +000555 399d .dw XT_PLUS +000556 3bcb .dw XT_FETCHI +000557 3ebd .dw XT_BASE +000558 3881 .dw XT_STORE +000559 3fe6 .dw XT_ONE +00055a 05a1 .dw XT_SLASHSTRING +00055b 382f .dw XT_DOBRANCH +00055c 055e DEST(SET_BASE2) + SET_BASE1: +00055d 38d9 .dw XT_DROP + SET_BASE2: +00055e 3820 .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: +00055f ff07 .dw $ff07 +000560 6e3e +000561 6d75 +000562 6562 +000563 0072 .db ">number",0 +000564 04eb .dw VE_HEAD + .set VE_HEAD = VE_TO_NUMBER + XT_TO_NUMBER: +000565 3801 .dw DO_COLON + + .endif + +000566 38b1 +000567 3836 TONUM1: .DW XT_DUP,XT_DOCONDBRANCH +000568 057d DEST(TONUM3) +000569 38cf +00056a 3898 +00056b 03ab .DW XT_OVER,XT_CFETCH,XT_DIGITQ +00056c 391a +00056d 3836 .DW XT_ZEROEQUAL,XT_DOCONDBRANCH +00056e 0571 DEST(TONUM2) +00056f 38d9 +000570 3820 .DW XT_DROP,XT_EXIT +000571 38ff +000572 024c +000573 3ebd +000574 3879 +000575 0140 TONUM2: .DW XT_TO_R,XT_2SWAP,XT_BASE,XT_FETCH,XT_UDSTAR +000576 38f6 +000577 0138 +000578 024c .DW XT_R_FROM,XT_MPLUS,XT_2SWAP +000579 3fe6 +00057a 05a1 +00057b 382f .DW XT_ONE,XT_SLASHSTRING,XT_DOBRANCH +00057c 0566 DEST(TONUM1) +00057d 3820 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: +00057e ff05 .dw $ff05 +00057f 6170 +000580 7372 +000581 0065 .db "parse",0 +000582 055f .dw VE_HEAD + .set VE_HEAD = VE_PARSE + XT_PARSE: +000583 3801 .dw DO_COLON + PFA_PARSE: + .endif +000584 38ff .dw XT_TO_R ; ( -- ) +000585 0597 .dw XT_SOURCE ; ( -- addr len) +000586 3ee2 .dw XT_TO_IN ; ( -- addr len >in) +000587 3879 .dw XT_FETCH +000588 05a1 .dw XT_SLASHSTRING ; ( -- addr' len' ) + +000589 38f6 .dw XT_R_FROM ; ( -- addr' len' c) +00058a 046d .dw XT_CSCAN ; ( -- addr' len'') +00058b 38b1 .dw XT_DUP ; ( -- addr' len'' len'') +00058c 3a2f .dw XT_1PLUS +00058d 3ee2 .dw XT_TO_IN ; ( -- addr' len'' len'' >in) +00058e 3a65 .dw XT_PLUSSTORE ; ( -- addr' len') +00058f 3fe6 .dw XT_ONE +000590 05a1 .dw XT_SLASHSTRING +000591 3820 .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: +000592 ff06 .dw $FF06 +000593 6f73 +000594 7275 +000595 6563 .db "source" +000596 057e .dw VE_HEAD + .set VE_HEAD = VE_SOURCE + XT_SOURCE: +000597 3dff .dw PFA_DODEFER1 + PFA_SOURCE: + .endif +000598 0016 .dw USER_SOURCE +000599 3dc8 .dw XT_UDEFERFETCH +00059a 3dd4 .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: +00059b ff07 .dw $ff07 +00059c 732f +00059d 7274 +00059e 6e69 +00059f 0067 .db "/string",0 +0005a0 0592 .dw VE_HEAD + .set VE_HEAD = VE_SLASHSTRING + XT_SLASHSTRING: +0005a1 3801 .dw DO_COLON + PFA_SLASHSTRING: + .endif +0005a2 38e1 .dw XT_ROT +0005a3 38cf .dw XT_OVER +0005a4 399d .dw XT_PLUS +0005a5 38e1 .dw XT_ROT +0005a6 38e1 .dw XT_ROT +0005a7 3993 .dw XT_MINUS +0005a8 3820 .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: +0005a9 ff0a .dw $FF0A +0005aa 6170 +0005ab 7372 +0005ac 2d65 +0005ad 616e +0005ae 656d .db "parse-name" +0005af 059b .dw VE_HEAD + .set VE_HEAD = VE_PARSENAME + XT_PARSENAME: +0005b0 3801 .dw DO_COLON + PFA_PARSENAME: + .endif +0005b1 3f54 .dw XT_BL +0005b2 05b4 .dw XT_SKIPSCANCHAR +0005b3 3820 .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: +0005b4 3801 .dw DO_COLON + PFA_SKIPSCANCHAR: + .endif +0005b5 38ff .dw XT_TO_R +0005b6 0597 .dw XT_SOURCE +0005b7 3ee2 .dw XT_TO_IN +0005b8 3879 .dw XT_FETCH +0005b9 05a1 .dw XT_SLASHSTRING + +0005ba 3908 .dw XT_R_FETCH +0005bb 0456 .dw XT_CSKIP +0005bc 38f6 .dw XT_R_FROM +0005bd 046d .dw XT_CSCAN + + ; adjust >IN +0005be 3ec9 .dw XT_2DUP +0005bf 399d .dw XT_PLUS +0005c0 0597 .dw XT_SOURCE +0005c1 38d9 .dw XT_DROP +0005c2 3993 .dw XT_MINUS +0005c3 3ee2 .dw XT_TO_IN +0005c4 3881 .dw XT_STORE +0005c5 3820 .dw XT_EXIT + .include "words/sp0.asm" + + ; Stack + ; start address of the data stack + VE_SP0: +0005c6 ff03 .dw $ff03 +0005c7 7073 +0005c8 0030 .db "sp0",0 +0005c9 05a9 .dw VE_HEAD + .set VE_HEAD = VE_SP0 + XT_SP0: +0005ca 386f .dw PFA_DOVALUE1 + PFA_SP0: +0005cb 0006 .dw USER_SP0 +0005cc 3dc8 .dw XT_UDEFERFETCH +0005cd 3dd4 .dw XT_UDEFERSTORE + + ; ( -- addr) + ; Stack + ; address of user variable to store top-of-stack for inactive tasks + VE_SP: +0005ce ff02 .dw $ff02 +0005cf 7073 .db "sp" +0005d0 05c6 .dw VE_HEAD + .set VE_HEAD = VE_SP + XT_SP: +0005d1 3858 .dw PFA_DOUSER + PFA_SP: +0005d2 0008 .dw USER_SP + .include "words/rp0.asm" + + ; Stack + ; start address of return stack + VE_RP0: +0005d3 ff03 .dw $ff03 +0005d4 7072 +0005d5 0030 .db "rp0",0 +0005d6 05ce .dw VE_HEAD + .set VE_HEAD = VE_RP0 + XT_RP0: +0005d7 3801 .dw DO_COLON + PFA_RP0: +0005d8 05db .dw XT_DORP0 +0005d9 3879 .dw XT_FETCH +0005da 3820 .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: +0005db 3858 .dw PFA_DOUSER + PFA_DORP0: +0005dc 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: +0005dd ff05 .dw $ff05 +0005de 6564 +0005df 7470 +0005e0 0068 .db "depth",0 +0005e1 05d3 .dw VE_HEAD + .set VE_HEAD = VE_DEPTH + XT_DEPTH: +0005e2 3801 .dw DO_COLON + PFA_DEPTH: + .endif +0005e3 05ca .dw XT_SP0 +0005e4 3a8d .dw XT_SP_FETCH +0005e5 3993 .dw XT_MINUS +0005e6 3a04 .dw XT_2SLASH +0005e7 3a35 .dw XT_1MINUS +0005e8 3820 .dw XT_EXIT + .include "words/forth-recognizer.asm" + + ; System Value + ; address of the next free data space (RAM) cell + VE_FORTHRECOGNIZER: +0005e9 ff10 .dw $ff10 +0005ea 6f66 +0005eb 7472 +0005ec 2d68 +0005ed 6572 +0005ee 6f63 +0005ef 6e67 +0005f0 7a69 +0005f1 7265 .db "forth-recognizer" +0005f2 05dd .dw VE_HEAD + .set VE_HEAD = VE_FORTHRECOGNIZER + XT_FORTHRECOGNIZER: +0005f3 386f .dw PFA_DOVALUE1 + PFA_FORTHRECOGNIZER: +0005f4 0034 .dw CFG_FORTHRECOGNIZER +0005f5 3da0 .dw XT_EDEFERFETCH +0005f6 3daa .dw XT_EDEFERSTORE + .include "words/recognize.asm" + + ; System + ; walk the recognizer stack + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_RECOGNIZE: +0005f7 ff09 .dw $ff09 +0005f8 6572 +0005f9 6f63 +0005fa 6e67 +0005fb 7a69 +0005fc 0065 .db "recognize",0 +0005fd 05e9 .dw VE_HEAD + .set VE_HEAD = VE_RECOGNIZE + XT_RECOGNIZE: +0005fe 3801 .dw DO_COLON + PFA_RECOGNIZE: + .endif +0005ff 383d .dw XT_DOLITERAL +000600 0609 .dw XT_RECOGNIZE_A +000601 38c4 .dw XT_SWAP +000602 099c .dw XT_MAPSTACK +000603 391a .dw XT_ZEROEQUAL +000604 3836 .dw XT_DOCONDBRANCH +000605 0608 DEST(PFA_RECOGNIZE1) +000606 3ed2 .dw XT_2DROP +000607 068b .dw XT_DT_NULL + PFA_RECOGNIZE1: +000608 3820 .dw XT_EXIT + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + ; ( addr len XT -- addr len [ dt:xt -1 | 0 ] ) + XT_RECOGNIZE_A: +000609 3801 .dw DO_COLON + PFA_RECOGNIZE_A: + .endif +00060a 38e1 .dw XT_ROT ; -- len xt addr +00060b 38e1 .dw XT_ROT ; -- xt addr len +00060c 3ec9 .dw XT_2DUP +00060d 3b1e .dw XT_2TO_R +00060e 38e1 .dw XT_ROT ; -- addr len xt +00060f 382a .dw XT_EXECUTE ; -- i*x dt:* | dt:null +000610 3b2d .dw XT_2R_FROM +000611 38e1 .dw XT_ROT +000612 38b1 .dw XT_DUP +000613 068b .dw XT_DT_NULL +000614 3fdf .dw XT_EQUAL +000615 3836 .dw XT_DOCONDBRANCH +000616 061a DEST(PFA_RECOGNIZE_A1) +000617 38d9 .dw XT_DROP +000618 3954 .dw XT_ZERO +000619 3820 .dw XT_EXIT + PFA_RECOGNIZE_A1: +00061a 38f0 .dw XT_NIP +00061b 38f0 .dw XT_NIP +00061c 394b .dw XT_TRUE +00061d 3820 .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/interpret.asm" + + ; System + ; Interpret SOURCE word by word. + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_INTERPRET: +00061e ff09 .dw $ff09 +00061f 6e69 +000620 6574 +000621 7072 +000622 6572 +000623 0074 .db "interpret",0 +000624 05f7 .dw VE_HEAD + .set VE_HEAD = VE_INTERPRET + XT_INTERPRET: +000625 3801 .dw DO_COLON + .endif + PFA_INTERPRET: +000626 05b0 .dw XT_PARSENAME ; ( -- addr len ) +000627 38b1 .dw XT_DUP ; ( -- addr len flag) +000628 3836 .dw XT_DOCONDBRANCH +000629 0636 DEST(PFA_INTERPRET2) +00062a 05f3 .dw XT_FORTHRECOGNIZER +00062b 05fe .dw XT_RECOGNIZE +00062c 3eb7 .dw XT_STATE +00062d 3879 .dw XT_FETCH +00062e 3836 .dw XT_DOCONDBRANCH +00062f 0631 DEST(PFA_INTERPRET1) +000630 01c6 .dw XT_ICELLPLUS ; we need the compile action + PFA_INTERPRET1: +000631 3bcb .dw XT_FETCHI +000632 382a .dw XT_EXECUTE +000633 3f8b .dw XT_QSTACK +000634 382f .dw XT_DOBRANCH +000635 0626 DEST(PFA_INTERPRET) + PFA_INTERPRET2: +000636 3ed2 .dw XT_2DROP +000637 3820 .dw XT_EXIT + .include "words/rec-intnum.asm" + + ; Interpreter + ; Method table for single cell integers + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_DT_NUM: +000638 ff06 .dw $ff06 +000639 7464 +00063a 6e3a +00063b 6d75 .db "dt:num" +00063c 061e .dw VE_HEAD + .set VE_HEAD = VE_DT_NUM + XT_DT_NUM: +00063d 3852 .dw PFA_DOCONSTANT + PFA_DT_NUM: + .endif +00063e 019a .dw XT_NOOP ; interpret +00063f 0772 .dw XT_LITERAL ; compile +000640 0772 .dw XT_LITERAL ; postpone + + ; ( -- addr ) + ; Interpreter + ; Method table for double cell integers + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_DT_DNUM: +000641 ff07 .dw $ff07 +000642 7464 +000643 643a +000644 756e +000645 006d .db "dt:dnum",0 +000646 0638 .dw VE_HEAD + .set VE_HEAD = VE_DT_DNUM + XT_DT_DNUM: +000647 3852 .dw PFA_DOCONSTANT + PFA_DT_DNUM: + .endif +000648 019a .dw XT_NOOP ; interpret +000649 3fd7 .dw XT_2LITERAL ; compile +00064a 3fd7 .dw XT_2LITERAL ; postpone + + ; ( addr len -- f ) + ; Interpreter + ; recognizer for integer numbers + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + + VE_REC_NUM: +00064b ff07 .dw $ff07 +00064c 6572 +00064d 3a63 +00064e 756e +00064f 006d .db "rec:num",0 +000650 0641 .dw VE_HEAD + .set VE_HEAD = VE_REC_NUM + XT_REC_NUM: +000651 3801 .dw DO_COLON + PFA_REC_NUM: + .endif + ; try converting to a number +000652 04f0 .dw XT_NUMBER +000653 3836 .dw XT_DOCONDBRANCH +000654 065d DEST(PFA_REC_NONUMBER) +000655 3fe6 .dw XT_ONE +000656 3fdf .dw XT_EQUAL +000657 3836 .dw XT_DOCONDBRANCH +000658 065b DEST(PFA_REC_INTNUM2) +000659 063d .dw XT_DT_NUM +00065a 3820 .dw XT_EXIT + PFA_REC_INTNUM2: +00065b 0647 .dw XT_DT_DNUM +00065c 3820 .dw XT_EXIT + PFA_REC_NONUMBER: +00065d 068b .dw XT_DT_NULL +00065e 3820 .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: +00065f ff08 .dw $ff08 +000660 6572 +000661 3a63 +000662 6966 +000663 646e .db "rec:find" +000664 064b .dw VE_HEAD + .set VE_HEAD = VE_REC_FIND + XT_REC_FIND: +000665 3801 .dw DO_COLON + PFA_REC_FIND: + .endif +000666 0700 .DW XT_FINDXT +000667 38b1 .dw XT_DUP +000668 391a .dw XT_ZEROEQUAL +000669 3836 .dw XT_DOCONDBRANCH +00066a 066e DEST(PFA_REC_WORD_FOUND) +00066b 38d9 .dw XT_DROP +00066c 068b .dw XT_DT_NULL +00066d 3820 .dw XT_EXIT + PFA_REC_WORD_FOUND: +00066e 0675 .dw XT_DT_XT + +00066f 3820 .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: +000670 ff05 .dw $ff05 +000671 7464 +000672 783a +000673 0074 .db "dt:xt",0 +000674 065f .dw VE_HEAD + .set VE_HEAD = VE_DT_XT + XT_DT_XT: +000675 3852 .dw PFA_DOCONSTANT + PFA_DT_XT: + .endif +000676 0679 .dw XT_R_WORD_INTERPRET +000677 067d .dw XT_R_WORD_COMPILE +000678 3fd7 .dw XT_2LITERAL + + ; ( XT flags -- ) + ; Interpreter + ; interpret method for WORD recognizer + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + XT_R_WORD_INTERPRET: +000679 3801 .dw DO_COLON + PFA_R_WORD_INTERPRET: + .endif +00067a 38d9 .dw XT_DROP ; the flags are in the way +00067b 382a .dw XT_EXECUTE +00067c 3820 .dw XT_EXIT + + ; ( XT flags -- ) + ; Interpreter + ; Compile method for WORD recognizer + .if cpu_msp430==1 + .endif + .if cpu_avr8==1 + XT_R_WORD_COMPILE: +00067d 3801 .dw DO_COLON + PFA_R_WORD_COMPILE: + .endif +00067e 3921 .dw XT_ZEROLESS +00067f 3836 .dw XT_DOCONDBRANCH +000680 0683 DEST(PFA_R_WORD_COMPILE1) +000681 075c .dw XT_COMMA +000682 3820 .dw XT_EXIT + PFA_R_WORD_COMPILE1: +000683 382a .dw XT_EXECUTE +000684 3820 .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: +000685 ff07 .dw $ff07 +000686 7464 +000687 6e3a +000688 6c75 +../../common\words/dt-null.asm(12): warning: .cseg .db misalignment - padding zero byte +000689 006c .db "dt:null" +00068a 0670 .dw VE_HEAD + .set VE_HEAD = VE_DT_NULL + XT_DT_NULL: +00068b 3852 .dw PFA_DOCONSTANT + PFA_DT_NULL: + .endif +00068c 068f .dw XT_FAIL ; interpret +00068d 068f .dw XT_FAIL ; compile +00068e 068f .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: +00068f 3801 .dw DO_COLON + PFA_FAIL: + .endif +000690 383d .dw XT_DOLITERAL +000691 fff3 .dw -13 +000692 3d86 .dw XT_THROW + .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: +000693 ff0f .dw $ff0f +000694 6573 +000695 7261 +000696 6863 +000697 772d +000698 726f +000699 6c64 +00069a 7369 +00069b 0074 .db "search-wordlist",0 +00069c 0685 .dw VE_HEAD + .set VE_HEAD = VE_SEARCH_WORDLIST + XT_SEARCH_WORDLIST: +00069d 3801 .dw DO_COLON + PFA_SEARCH_WORDLIST: + .endif +00069e 38ff .dw XT_TO_R +00069f 3954 .dw XT_ZERO +0006a0 383d .dw XT_DOLITERAL +0006a1 06b2 .dw XT_ISWORD +0006a2 38f6 .dw XT_R_FROM +0006a3 06cf .dw XT_TRAVERSEWORDLIST +0006a4 38b1 .dw XT_DUP +0006a5 391a .dw XT_ZEROEQUAL +0006a6 3836 .dw XT_DOCONDBRANCH +0006a7 06ac DEST(PFA_SEARCH_WORDLIST1) +0006a8 3ed2 .dw XT_2DROP +0006a9 38d9 .dw XT_DROP +0006aa 3954 .dw XT_ZERO +0006ab 3820 .dw XT_EXIT + PFA_SEARCH_WORDLIST1: + ; ... get the XT ... +0006ac 38b1 .dw XT_DUP +0006ad 06f6 .dw XT_NFA2CFA + ; .. and get the header flag +0006ae 38c4 .dw XT_SWAP +0006af 0175 .dw XT_NAME2FLAGS +0006b0 0163 .dw XT_IMMEDIATEQ +0006b1 3820 .dw XT_EXIT + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + XT_ISWORD: +0006b2 3801 .dw DO_COLON + PFA_ISWORD: + .endif + ; ( c-addr len 0 nt -- c-addr len 0 true| nt false ) +0006b3 38ff .dw XT_TO_R +0006b4 38d9 .dw XT_DROP +0006b5 3ec9 .dw XT_2DUP +0006b6 3908 .dw XT_R_FETCH ; -- addr len addr len nt +0006b7 06ea .dw XT_NAME2STRING +0006b8 01cf .dw XT_ICOMPARE ; (-- addr len f ) +0006b9 3836 .dw XT_DOCONDBRANCH +0006ba 06c0 DEST(PFA_ISWORD3) + ; not now +0006bb 38f6 .dw XT_R_FROM +0006bc 38d9 .dw XT_DROP +0006bd 3954 .dw XT_ZERO +0006be 394b .dw XT_TRUE ; maybe next word +0006bf 3820 .dw XT_EXIT + PFA_ISWORD3: + ; we found the word, now clean up iteration data ... +0006c0 3ed2 .dw XT_2DROP +0006c1 38f6 .dw XT_R_FROM +0006c2 3954 .dw XT_ZERO ; finish traverse-wordlist +0006c3 3820 .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: +0006c4 ff11 .dw $ff11 +0006c5 7274 +0006c6 7661 +0006c7 7265 +0006c8 6573 +0006c9 772d +0006ca 726f +0006cb 6c64 +0006cc 7369 +0006cd 0074 .db "traverse-wordlist",0 +0006ce 0693 .dw VE_HEAD + .set VE_HEAD = VE_TRAVERSEWORDLIST + XT_TRAVERSEWORDLIST: +0006cf 3801 .dw DO_COLON + PFA_TRAVERSEWORDLIST: + + .endif +0006d0 3b5f .dw XT_FETCHE + PFA_TRAVERSEWORDLIST1: +0006d1 38b1 .dw XT_DUP ; ( -- xt nt nt ) +0006d2 3836 .dw XT_DOCONDBRANCH ; ( -- nt ) is nfa = counted string +0006d3 06e0 DEST(PFA_TRAVERSEWORDLIST2) +0006d4 3ec9 .dw XT_2DUP +0006d5 3b1e .dw XT_2TO_R +0006d6 38c4 .dw XT_SWAP +0006d7 382a .dw XT_EXECUTE +0006d8 3b2d .dw XT_2R_FROM +0006d9 38e1 .dw XT_ROT +0006da 3836 .dw XT_DOCONDBRANCH +0006db 06e0 DEST(PFA_TRAVERSEWORDLIST2) +0006dc 0a0b .dw XT_NFA2LFA +0006dd 3bcb .dw XT_FETCHI +0006de 382f .dw XT_DOBRANCH ; ( -- addr ) +0006df 06d1 DEST(PFA_TRAVERSEWORDLIST1) ; ( -- addr ) + PFA_TRAVERSEWORDLIST2: +0006e0 3ed2 .dw XT_2DROP +0006e1 3820 .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: +0006e2 ff0b .dw $ff0b +0006e3 616e +0006e4 656d +0006e5 733e +0006e6 7274 +0006e7 6e69 +0006e8 0067 .db "name>string",0 +0006e9 06c4 .dw VE_HEAD + .set VE_HEAD = VE_NAME2STRING + XT_NAME2STRING: +0006ea 3801 .dw DO_COLON + PFA_NAME2STRING: + + .endif +0006eb 0424 .dw XT_ICOUNT ; ( -- addr n ) +0006ec 383d .dw XT_DOLITERAL +0006ed 00ff .dw 255 +0006ee 3a13 .dw XT_AND ; mask immediate bit +0006ef 3820 .dw XT_EXIT + .include "words/nfa2cfa.asm" + + ; Tools + ; get the XT from a name token + VE_NFA2CFA: +0006f0 ff07 .dw $ff07 +0006f1 666e +0006f2 3e61 +0006f3 6663 +../../avr8\words/nfa2cfa.asm(6): warning: .cseg .db misalignment - padding zero byte +0006f4 0061 .db "nfa>cfa" +0006f5 06e2 .dw VE_HEAD + .set VE_HEAD = VE_NFA2CFA + XT_NFA2CFA: +0006f6 3801 .dw DO_COLON + PFA_NFA2CFA: +0006f7 0a0b .dw XT_NFA2LFA ; skip to link field +0006f8 3a2f .dw XT_1PLUS ; next is the execution token +0006f9 3820 .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: +0006fa ff07 .dw $ff07 +0006fb 6966 +0006fc 646e +0006fd 782d +0006fe 0074 .db "find-xt",0 +0006ff 06f0 .dw VE_HEAD + .set VE_HEAD = VE_FINDXT + XT_FINDXT: +000700 3801 .dw DO_COLON + PFA_FINDXT: + .endif +000701 383d .dw XT_DOLITERAL +000702 070c .dw XT_FINDXTA +000703 383d .dw XT_DOLITERAL +000704 0040 .dw CFG_ORDERLISTLEN +000705 099c .dw XT_MAPSTACK +000706 391a .dw XT_ZEROEQUAL +000707 3836 .dw XT_DOCONDBRANCH +000708 070b DEST(PFA_FINDXT1) +000709 3ed2 .dw XT_2DROP +00070a 3954 .dw XT_ZERO + PFA_FINDXT1: +00070b 3820 .dw XT_EXIT + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + + XT_FINDXTA: +00070c 3801 .dw DO_COLON + PFA_FINDXTA: + .endif +00070d 38ff .dw XT_TO_R +00070e 3ec9 .dw XT_2DUP +00070f 38f6 .dw XT_R_FROM +000710 069d .dw XT_SEARCH_WORDLIST +000711 38b1 .dw XT_DUP +000712 3836 .dw XT_DOCONDBRANCH +000713 0719 DEST(PFA_FINDXTA1) +000714 38ff .dw XT_TO_R +000715 38f0 .dw XT_NIP +000716 38f0 .dw XT_NIP +000717 38f6 .dw XT_R_FROM +000718 394b .dw XT_TRUE + PFA_FINDXTA1: +000719 3820 .dw XT_EXIT + + .include "dict/compiler1.inc" + + .include "words/newest.asm" + + ; System Variable + ; system state + VE_NEWEST: +00071a ff06 .dw $ff06 +00071b 656e +00071c 6577 +00071d 7473 .db "newest" +00071e 06fa .dw VE_HEAD + .set VE_HEAD = VE_NEWEST + XT_NEWEST: +00071f 3848 .dw PFA_DOVARIABLE + PFA_NEWEST: +000720 00e5 .dw ram_newest + + .dseg +0000e5 ram_newest: .byte 4 + .include "words/latest.asm" + + ; System Variable + ; system state + VE_LATEST: +000721 ff06 .dw $ff06 +000722 616c +000723 6574 +000724 7473 .db "latest" +000725 071a .dw VE_HEAD + .set VE_HEAD = VE_LATEST + XT_LATEST: +000726 3848 .dw PFA_DOVARIABLE + PFA_LATEST: +000727 00e9 .dw ram_latest + + .dseg +0000e9 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: +000728 ff08 .dw $ff08 +000729 6328 +00072a 6572 +00072b 7461 +00072c 2965 .db "(create)" +00072d 0721 .dw VE_HEAD + .set VE_HEAD = VE_DOCREATE + XT_DOCREATE: +00072e 3801 .dw DO_COLON + PFA_DOCREATE: + .endif +00072f 05b0 +000730 0885 .DW XT_PARSENAME,XT_WLSCOPE ; ( -- addr len wid) +000731 38b1 +000732 071f +000733 3c90 +000734 3881 .DW XT_DUP,XT_NEWEST,XT_CELLPLUS,XT_STORE ; save the wid +000735 086a +000736 071f +000737 3881 .DW XT_HEADER,XT_NEWEST,XT_STORE ; save the nt +000738 3820 .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: +000739 0001 .dw $0001 +00073a 005c .db $5c,0 +00073b 0728 .dw VE_HEAD + .set VE_HEAD = VE_BACKSLASH + XT_BACKSLASH: +00073c 3801 .dw DO_COLON + PFA_BACKSLASH: + .endif +00073d 0597 .dw XT_SOURCE +00073e 38f0 .dw XT_NIP +00073f 3ee2 .dw XT_TO_IN +000740 3881 .dw XT_STORE +000741 3820 .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: +000742 0001 .dw $0001 +000743 0028 .db "(" ,0 +000744 0739 .dw VE_HEAD + .set VE_HEAD = VE_LPAREN + XT_LPAREN: +000745 3801 .dw DO_COLON + PFA_LPAREN: + .endif +000746 383d .dw XT_DOLITERAL +000747 0029 .dw ')' +000748 0583 .dw XT_PARSE +000749 3ed2 .dw XT_2DROP +00074a 3820 .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: +00074b ff07 .dw $ff07 +00074c 6f63 +00074d 706d +00074e 6c69 +00074f 0065 .db "compile",0 +000750 0742 .dw VE_HEAD + .set VE_HEAD = VE_COMPILE + XT_COMPILE: +000751 3801 .dw DO_COLON + PFA_COMPILE: + .endif +000752 38f6 .dw XT_R_FROM +000753 38b1 .dw XT_DUP +000754 01c6 .dw XT_ICELLPLUS +000755 38ff .dw XT_TO_R +000756 3bcb .dw XT_FETCHI +000757 075c .dw XT_COMMA +000758 3820 .dw XT_EXIT + .include "words/comma.asm" + + ; Dictionary + ; compile 16 bit into flash at DP + VE_COMMA: +000759 ff01 .dw $ff01 +00075a 002c .db ',',0 ; , +00075b 074b .dw VE_HEAD + .set VE_HEAD = VE_COMMA + XT_COMMA: +00075c 3801 .dw DO_COLON + PFA_COMMA: +00075d 3f12 .dw XT_DP +00075e 3b73 .dw XT_STOREI +00075f 3f12 .dw XT_DP +000760 3a2f .dw XT_1PLUS +000761 01b4 .dw XT_DOTO +000762 3f13 .dw PFA_DP +000763 3820 .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: +000764 0003 .dw $0003 +000765 275b +000766 005d .db "[']",0 +000767 0759 .dw VE_HEAD + .set VE_HEAD = VE_BRACKETTICK + XT_BRACKETTICK: +000768 3801 .dw DO_COLON + PFA_BRACKETTICK: + .endif +000769 043d .dw XT_TICK +00076a 0772 .dw XT_LITERAL +00076b 3820 .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: +00076c 0007 .dw $0007 +00076d 696c +00076e 6574 +00076f 6172 +000770 006c .db "literal",0 +000771 0764 .dw VE_HEAD + .set VE_HEAD = VE_LITERAL + XT_LITERAL: +000772 3801 .dw DO_COLON + PFA_LITERAL: + .endif +000773 0751 .DW XT_COMPILE +000774 383d .DW XT_DOLITERAL +000775 075c .DW XT_COMMA +000776 3820 .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: +000777 0008 .dw $0008 +000778 6c73 +000779 7469 +00077a 7265 +00077b 6c61 .db "sliteral" +00077c 076c .dw VE_HEAD + .set VE_HEAD = VE_SLITERAL + XT_SLITERAL: +00077d 3801 .dw DO_COLON + PFA_SLITERAL: + .endif +00077e 0751 .dw XT_COMPILE +00077f 03c5 .dw XT_DOSLITERAL ; ( -- addr n) +000780 03d3 .dw XT_SCOMMA +000781 3820 .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: +000782 3801 .dw DO_COLON + PFA_GMARK: +000783 3f12 .dw XT_DP +000784 0751 .dw XT_COMPILE +000785 ffff .dw -1 ; ffff does not erase flash +000786 3820 .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: +000787 3801 .dw DO_COLON + PFA_GRESOLVE: +000788 3f8b .dw XT_QSTACK +000789 3f12 .dw XT_DP +00078a 38c4 .dw XT_SWAP +00078b 3b73 .dw XT_STOREI +00078c 3820 .dw XT_EXIT + .include "words/l_mark.asm" + + ; Compiler + ; place destination for backward branch + ;VE_LMARK: + ; .dw $ff05 + ; .db "r if 2drop then r> invert ; + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + XT_QDOCHECK: +00081b 3801 .dw DO_COLON + PFA_QDOCHECK: + .endif +00081c 3ec9 .dw XT_2DUP +00081d 3fdf .dw XT_EQUAL +00081e 38b1 .dw XT_DUP +00081f 38ff .dw XT_TO_R +000820 3836 .dw XT_DOCONDBRANCH +000821 0823 DEST(PFA_QDOCHECK1) +000822 3ed2 .dw XT_2DROP + PFA_QDOCHECK1: +000823 38f6 .dw XT_R_FROM +000824 39fd .dw XT_INVERT +000825 3820 .dw XT_EXIT + .include "words/endloop.asm" + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_ENDLOOP: +000826 ff07 .dw $ff07 +000827 6e65 +000828 6c64 +000829 6f6f +00082a 0070 .db "endloop",0 +00082b 080f .dw VE_HEAD + .set VE_HEAD = VE_ENDLOOP + XT_ENDLOOP: +00082c 3801 .dw DO_COLON + PFA_ENDLOOP: + .endif + ;Z ENDLOOP adrs xt -- L: 0 a1 a2 .. aN -- + ; ?DUP WHILE POSTPONE THEN REPEAT ; + ; resolve LEAVEs + ; This is a common factor of LOOP and +LOOP. + +00082d 0790 .DW XT_LRESOLVE +00082e 0839 +00082f 38b9 +000830 3836 LOOP1: .DW XT_L_FROM,XT_QDUP,XT_DOCONDBRANCH +000831 0835 DEST(LOOP2) +000832 07b5 .DW XT_THEN +000833 382f .dw XT_DOBRANCH +000834 082e DEST(LOOP1) +000835 3820 LOOP2: .DW XT_EXIT + ; leave address stack + .include "words/l-from.asm" + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_L_FROM: +000836 ff02 .dw $ff02 +000837 3e6c .db "l>" +000838 0826 .dw VE_HEAD + .set VE_HEAD = VE_L_FROM + XT_L_FROM: +000839 3801 .dw DO_COLON + PFA_L_FROM: + + .endif + ;Z L> -- x L: x -- move from leave stack + ; LP @ @ -2 LP +! ; + +00083a 0858 .dw XT_LP +00083b 3879 .dw XT_FETCH +00083c 3879 .dw XT_FETCH +00083d 383d .dw XT_DOLITERAL +00083e fffe .dw -2 +00083f 0858 .dw XT_LP +000840 3a65 .dw XT_PLUSSTORE +000841 3820 .dw XT_EXIT + .include "words/to-l.asm" + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_TO_L: +000842 ff02 .dw $ff02 +000843 6c3e .db ">l" +000844 0836 .dw VE_HEAD + .set VE_HEAD = VE_TO_L + XT_TO_L: +000845 3801 .dw DO_COLON + PFA_TO_L: + .endif + ;Z >L x -- L: -- x move to leave stack + ; CELL LP +! LP @ ! ; (L stack grows up) + +000846 3feb .dw XT_TWO +000847 0858 .dw XT_LP +000848 3a65 .dw XT_PLUSSTORE +000849 0858 .dw XT_LP +00084a 3879 .dw XT_FETCH +00084b 3881 .dw XT_STORE +00084c 3820 .dw XT_EXIT + .include "words/lp0.asm" + + ; Stack + ; start address of leave stack + VE_LP0: +00084d ff03 .dw $ff03 +00084e 706c +00084f 0030 .db "lp0",0 +000850 0842 .dw VE_HEAD + .set VE_HEAD = VE_LP0 + XT_LP0: +000851 386f .dw PFA_DOVALUE1 + PFA_LP0: +000852 0036 .dw CFG_LP0 +000853 3da0 .dw XT_EDEFERFETCH +000854 3daa .dw XT_EDEFERSTORE + .include "words/lp.asm" + + ; System Variable + ; leave stack pointer + VE_LP: +000855 ff02 .dw $ff02 +000856 706c .db "lp" +000857 084d .dw VE_HEAD + .set VE_HEAD = VE_LP + XT_LP: +000858 3848 .dw PFA_DOVARIABLE + PFA_LP: +000859 00eb .dw ram_lp + + .dseg +0000eb 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: +00085a ff06 .dw $ff06 +00085b 7263 +00085c 6165 +00085d 6574 .db "create" +00085e 0855 .dw VE_HEAD + .set VE_HEAD = VE_CREATE + XT_CREATE: +00085f 3801 .dw DO_COLON + PFA_CREATE: + .endif +000860 072e .dw XT_DOCREATE +000861 088e .dw XT_REVEAL +000862 0751 .dw XT_COMPILE +000863 3852 .dw PFA_DOCONSTANT +000864 3820 .dw XT_EXIT + .include "words/header.asm" + + ; Compiler + ; creates the vocabulary header without XT and data field (PF) in the wordlist wid + VE_HEADER: +000865 ff06 .dw $ff06 +000866 6568 +000867 6461 +000868 7265 .db "header" +000869 085a .dw VE_HEAD + .set VE_HEAD = VE_HEADER + XT_HEADER: +00086a 3801 .dw DO_COLON + PFA_HEADER: +00086b 3f12 .dw XT_DP ; the new Name Field +00086c 38ff .dw XT_TO_R +00086d 38ff .dw XT_TO_R ; ( R: NFA WID ) +00086e 38b1 .dw XT_DUP +00086f 3928 .dw XT_GREATERZERO +000870 3836 .dw XT_DOCONDBRANCH +000871 087c .dw PFA_HEADER1 +000872 38b1 .dw XT_DUP +000873 383d .dw XT_DOLITERAL +000874 ff00 .dw $ff00 ; all flags are off (e.g. immediate) +000875 3a1c .dw XT_OR +000876 03d7 .dw XT_DOSCOMMA + ; make the link to the previous entry in this wordlist +000877 38f6 .dw XT_R_FROM +000878 3b5f .dw XT_FETCHE +000879 075c .dw XT_COMMA +00087a 38f6 .dw XT_R_FROM +00087b 3820 .dw XT_EXIT + + PFA_HEADER1: + ; -16: attempt to use zero length string as a name +00087c 383d .dw XT_DOLITERAL +00087d fff0 .dw -16 +00087e 3d86 .dw XT_THROW + + .include "words/wlscope.asm" + + ; Compiler + ; dynamically place a word in a wordlist. The word name may be changed. + VE_WLSCOPE: +00087f ff07 .dw $ff07 +000880 6c77 +000881 6373 +000882 706f +000883 0065 .db "wlscope",0 +000884 0865 .dw VE_HEAD + .set VE_HEAD = VE_WLSCOPE + XT_WLSCOPE: +000885 3dff .dw PFA_DODEFER1 + PFA_WLSCOPE: +000886 0032 .dw CFG_WLSCOPE +000887 3da0 .dw XT_EDEFERFETCH +000888 3daa .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: +000889 ff06 .dw $ff06 +00088a 6572 +00088b 6576 +00088c 6c61 .db "reveal" +00088d 087f .dw VE_HEAD + .set VE_HEAD = VE_REVEAL + XT_REVEAL: +00088e 3801 .dw DO_COLON + PFA_REVEAL: + .endif +00088f 071f +000890 3c90 +000891 3879 .DW XT_NEWEST,XT_CELLPLUS,XT_FETCH ; only if wordlist is in use +000892 38b9 +000893 3836 .DW XT_QDUP,XT_DOCONDBRANCH +000894 0899 DEST(REVEAL1) +000895 071f +000896 3879 +000897 38c4 +000898 3b3b .DW XT_NEWEST,XT_FETCH,XT_SWAP,XT_STOREE + ; .DW XT_ZERO,XT_NEWEST,XT_CELLPLUS,XT_STORE ; clean wordlist entry + REVEAL1: +000899 3820 .DW XT_EXIT + .include "words/does.asm" + + ; Compiler + ; organize the XT replacement to call other colon code + VE_DOES: +00089a 0005 .dw $0005 +00089b 6f64 +00089c 7365 +00089d 003e .db "does>",0 +00089e 0889 .dw VE_HEAD + .set VE_HEAD = VE_DOES + XT_DOES: +00089f 3801 .dw DO_COLON + PFA_DOES: +0008a0 0751 .dw XT_COMPILE +0008a1 08b2 .dw XT_DODOES +0008a2 0751 .dw XT_COMPILE ; create a code snippet to be used in an embedded XT +0008a3 940e .dw $940e ; the address of this compiled +0008a4 0751 .dw XT_COMPILE ; code will replace the XT of the +0008a5 08a7 .dw DO_DODOES ; word that CREATE created +0008a6 3820 .dw XT_EXIT ; + + DO_DODOES: ; ( -- PFA ) +0008a7 939a +0008a8 938a savetos +0008a9 01cb movw tosl, wl +0008aa 9601 adiw tosl, 1 + ; the following takes the address from a real uC-call + .if (pclen==3) + .endif +0008ab 917f pop wh +0008ac 916f pop wl + +0008ad 93bf push XH +0008ae 93af push XL +0008af 01db movw XL, wl +0008b0 940c 3805 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: +0008b2 3801 .dw DO_COLON + PFA_DODOES: +0008b3 38f6 .dw XT_R_FROM +0008b4 071f .dw XT_NEWEST +0008b5 3c90 .dw XT_CELLPLUS +0008b6 3879 .dw XT_FETCH +0008b7 3b5f .dw XT_FETCHE +0008b8 06f6 .dw XT_NFA2CFA +0008b9 3b73 .dw XT_STOREI +0008ba 3820 .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: +0008bb ff01 .dw $ff01 +0008bc 003a .db ":",0 +0008bd 089a .dw VE_HEAD + .set VE_HEAD = VE_COLON + XT_COLON: +0008be 3801 .dw DO_COLON + PFA_COLON: + .endif +0008bf 072e .dw XT_DOCREATE +0008c0 08c9 .dw XT_COLONNONAME +0008c1 38d9 .dw XT_DROP +0008c2 3820 .dw XT_EXIT + .include "words/colon-noname.asm" + + ; Compiler + ; create an unnamed entry in the dictionary, XT is DO_COLON + VE_COLONNONAME: +0008c3 ff07 .dw $ff07 +0008c4 6e3a +0008c5 6e6f +0008c6 6d61 +0008c7 0065 .db ":noname",0 +0008c8 08bb .dw VE_HEAD + .set VE_HEAD = VE_COLONNONAME + XT_COLONNONAME: +0008c9 3801 .dw DO_COLON + PFA_COLONNONAME: +0008ca 3f12 .dw XT_DP +0008cb 38b1 .dw XT_DUP +0008cc 0726 .dw XT_LATEST +0008cd 3881 .dw XT_STORE + +0008ce 0751 .dw XT_COMPILE +0008cf 3801 .dw DO_COLON + +0008d0 08de .dw XT_RBRACKET +0008d1 3820 .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: +0008d2 0001 .dw $0001 +0008d3 003b .db $3b,0 +0008d4 08c3 .dw VE_HEAD + .set VE_HEAD = VE_SEMICOLON + XT_SEMICOLON: +0008d5 3801 .dw DO_COLON + PFA_SEMICOLON: + .endif +0008d6 0751 .dw XT_COMPILE +0008d7 3820 .dw XT_EXIT +0008d8 08e6 .dw XT_LBRACKET +0008d9 088e .dw XT_REVEAL +0008da 3820 .dw XT_EXIT + .include "words/right-bracket.asm" + + ; Compiler + ; enter compiler mode + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_RBRACKET: +0008db ff01 .dw $ff01 +0008dc 005d .db "]",0 +0008dd 08d2 .dw VE_HEAD + .set VE_HEAD = VE_RBRACKET + XT_RBRACKET: +0008de 3801 .dw DO_COLON + PFA_RBRACKET: + .endif +0008df 3fe6 .dw XT_ONE +0008e0 3eb7 .dw XT_STATE +0008e1 3881 .dw XT_STORE +0008e2 3820 .dw XT_EXIT + .include "words/left-bracket.asm" + + ; Compiler + ; enter interpreter mode + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_LBRACKET: +0008e3 0001 .dw $0001 +0008e4 005b .db "[",0 +0008e5 08db .dw VE_HEAD + .set VE_HEAD = VE_LBRACKET + XT_LBRACKET: +0008e6 3801 .dw DO_COLON + PFA_LBRACKET: + .endif +0008e7 3954 .dw XT_ZERO +0008e8 3eb7 .dw XT_STATE +0008e9 3881 .dw XT_STORE +0008ea 3820 .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: +0008eb ff08 .dw $ff08 +0008ec 6176 +0008ed 6972 +0008ee 6261 +0008ef 656c .db "variable" +0008f0 08e3 .dw VE_HEAD + .set VE_HEAD = VE_VARIABLE + XT_VARIABLE: +0008f1 3801 .dw DO_COLON + PFA_VARIABLE: + .endif +0008f2 3f23 .dw XT_HERE +0008f3 08fd .dw XT_CONSTANT +0008f4 3feb .dw XT_TWO +0008f5 3f2c .dw XT_ALLOT +0008f6 3820 .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: +0008f7 ff08 .dw $ff08 +0008f8 6f63 +0008f9 736e +0008fa 6174 +0008fb 746e .db "constant" +0008fc 08eb .dw VE_HEAD + .set VE_HEAD = VE_CONSTANT + XT_CONSTANT: +0008fd 3801 .dw DO_COLON + PFA_CONSTANT: + .endif +0008fe 072e .dw XT_DOCREATE +0008ff 088e .dw XT_REVEAL +000900 0751 .dw XT_COMPILE +000901 3848 .dw PFA_DOVARIABLE +000902 075c .dw XT_COMMA +000903 3820 .dw XT_EXIT + .include "words/user.asm" + + ; Compiler + ; create a dictionary entry for a user variable at offset n + VE_USER: +000904 ff04 .dw $ff04 +000905 7375 +000906 7265 .db "user" +000907 08f7 .dw VE_HEAD + .set VE_HEAD = VE_USER + XT_USER: +000908 3801 .dw DO_COLON + PFA_USER: +000909 072e .dw XT_DOCREATE +00090a 088e .dw XT_REVEAL + +00090b 0751 .dw XT_COMPILE +00090c 3858 .dw PFA_DOUSER +00090d 075c .dw XT_COMMA +00090e 3820 .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: +00090f 0007 .dw $0007 +000910 6572 +000911 7563 +000912 7372 +000913 0065 .db "recurse",0 +000914 0904 .dw VE_HEAD + .set VE_HEAD = VE_RECURSE + XT_RECURSE: +000915 3801 .dw DO_COLON + PFA_RECURSE: + .endif +000916 0726 .dw XT_LATEST +000917 3879 .dw XT_FETCH +000918 075c .dw XT_COMMA +000919 3820 .dw XT_EXIT + .include "words/immediate.asm" + + ; Compiler + ; set immediate flag for the most recent word definition + VE_IMMEDIATE: +00091a ff09 .dw $ff09 +00091b 6d69 +00091c 656d +00091d 6964 +00091e 7461 +00091f 0065 .db "immediate",0 +000920 090f .dw VE_HEAD + .set VE_HEAD = VE_IMMEDIATE + XT_IMMEDIATE: +000921 3801 .dw DO_COLON + PFA_IMMEDIATE: +000922 09c3 .dw XT_GET_CURRENT +000923 3b5f .dw XT_FETCHE +000924 38b1 .dw XT_DUP +000925 3bcb .dw XT_FETCHI +000926 383d .dw XT_DOLITERAL +000927 7fff .dw $7fff +000928 3a13 .dw XT_AND +000929 38c4 .dw XT_SWAP +00092a 3b73 .dw XT_STOREI +00092b 3820 .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: +00092c 0006 .dw $0006 +00092d 635b +00092e 6168 +00092f 5d72 .db "[char]" +000930 091a .dw VE_HEAD + .set VE_HEAD = VE_BRACKETCHAR + XT_BRACKETCHAR: +000931 3801 .dw DO_COLON + PFA_BRACKETCHAR: + .endif +000932 0751 .dw XT_COMPILE +000933 383d .dw XT_DOLITERAL +000934 04e6 .dw XT_CHAR +000935 075c .dw XT_COMMA +000936 3820 .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: +000937 0006 .dw $0006 +000938 6261 +000939 726f +00093a 2274 .db "abort",'"' +00093b 092c .dw VE_HEAD + .set VE_HEAD = VE_ABORTQUOTE + XT_ABORTQUOTE: +00093c 3801 .dw DO_COLON + PFA_ABORTQUOTE: + .endif +00093d 3e8a .dw XT_SQUOTE +00093e 0751 .dw XT_COMPILE +00093f 094e .dw XT_QABORT +000940 3820 .DW XT_EXIT + .include "words/abort.asm" + + ; Exceptions + ; send an exception -1 + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_ABORT: +000941 ff05 .dw $ff05 +000942 6261 +000943 726f +000944 0074 .db "abort",0 +000945 0937 .dw VE_HEAD + .set VE_HEAD = VE_ABORT + XT_ABORT: +000946 3801 .dw DO_COLON + PFA_ABORT: + .endif +000947 394b .dw XT_TRUE +000948 3d86 .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: +000949 ff06 .dw $ff06 +00094a 613f +00094b 6f62 +00094c 7472 .db "?abort" +00094d 0941 .dw VE_HEAD + .set VE_HEAD = VE_QABORT + XT_QABORT: +00094e 3801 .dw DO_COLON + PFA_QABORT: + + .endif +00094f 38e1 +000950 3836 .DW XT_ROT,XT_DOCONDBRANCH +000951 0954 DEST(QABO1) +000952 03f8 +000953 0946 .DW XT_ITYPE,XT_ABORT +000954 3ed2 +000955 3820 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: +000956 ff09 .dw $ff09 +000957 6567 +000958 2d74 +000959 7473 +00095a 6361 +00095b 006b .db "get-stack",0 +00095c 0949 .dw VE_HEAD + .set VE_HEAD = VE_GET_STACK + XT_GET_STACK: +00095d 3801 .dw DO_COLON + .endif +00095e 38b1 .dw XT_DUP +00095f 3c90 .dw XT_CELLPLUS +000960 38c4 .dw XT_SWAP +000961 3b5f .dw XT_FETCHE +000962 38b1 .dw XT_DUP +000963 38ff .dw XT_TO_R +000964 3954 .dw XT_ZERO +000965 38c4 .dw XT_SWAP ; go from bigger to smaller addresses +000966 081b .dw XT_QDOCHECK +000967 3836 .dw XT_DOCONDBRANCH +000968 0974 DEST(PFA_N_FETCH_E2) +000969 3a9b .dw XT_DODO + PFA_N_FETCH_E1: + ; ( ee-addr ) +00096a 3aac .dw XT_I +00096b 3a35 .dw XT_1MINUS +00096c 3ec4 .dw XT_CELLS ; ( -- ee-addr i*2 ) +00096d 38cf .dw XT_OVER ; ( -- ee-addr i*2 ee-addr ) +00096e 399d .dw XT_PLUS ; ( -- ee-addr ee-addr+i +00096f 3b5f .dw XT_FETCHE ;( -- ee-addr item_i ) +000970 38c4 .dw XT_SWAP ;( -- item_i ee-addr ) +000971 394b .dw XT_TRUE ; shortcut for -1 +000972 3aba .dw XT_DOPLUSLOOP +000973 096a DEST(PFA_N_FETCH_E1) + PFA_N_FETCH_E2: +000974 3ed2 .dw XT_2DROP +000975 38f6 .dw XT_R_FROM +000976 3820 .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: +000977 ff09 .dw $ff09 +000978 6573 +000979 2d74 +00097a 7473 +00097b 6361 +00097c 006b .db "set-stack",0 +00097d 0956 .dw VE_HEAD + .set VE_HEAD = VE_SET_STACK + XT_SET_STACK: +00097e 3801 .dw DO_COLON + PFA_SET_STACK: + .endif +00097f 38cf .dw XT_OVER +000980 3921 .dw XT_ZEROLESS +000981 3836 .dw XT_DOCONDBRANCH +000982 0986 DEST(PFA_SET_STACK0) +000983 383d .dw XT_DOLITERAL +000984 fffc .dw -4 +000985 3d86 .dw XT_THROW + PFA_SET_STACK0: +000986 3ec9 .dw XT_2DUP +000987 3b3b .dw XT_STOREE ; ( -- i_n .. i_0 n e-addr ) +000988 38c4 .dw XT_SWAP +000989 3954 .dw XT_ZERO +00098a 081b .dw XT_QDOCHECK +00098b 3836 .dw XT_DOCONDBRANCH +00098c 0993 DEST(PFA_SET_STACK2) +00098d 3a9b .dw XT_DODO + PFA_SET_STACK1: +00098e 3c90 .dw XT_CELLPLUS ; ( -- i_x e-addr ) +00098f 3eda .dw XT_TUCK ; ( -- e-addr i_x e-addr +000990 3b3b .dw XT_STOREE +000991 3ac9 .dw XT_DOLOOP +000992 098e DEST(PFA_SET_STACK1) + PFA_SET_STACK2: +000993 38d9 .dw XT_DROP +000994 3820 .dw XT_EXIT + + .include "words/map-stack.asm" + + ; Tools + ; Iterate over a stack + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_MAPSTACK: +000995 ff09 .dw $ff09 +000996 616d +000997 2d70 +000998 7473 +000999 6361 +00099a 006b .db "map-stack",0 +00099b 0977 .dw VE_HEAD + .set VE_HEAD = VE_MAPSTACK + XT_MAPSTACK: +00099c 3801 .dw DO_COLON + PFA_MAPSTACK: + .endif +00099d 38b1 .dw XT_DUP +00099e 3c90 .dw XT_CELLPLUS +00099f 38c4 .dw XT_SWAP +0009a0 3b5f .dw XT_FETCHE +0009a1 3ec4 .dw XT_CELLS +0009a2 3f99 .dw XT_BOUNDS +0009a3 081b .dw XT_QDOCHECK +0009a4 3836 .dw XT_DOCONDBRANCH +0009a5 09b8 DEST(PFA_MAPSTACK3) +0009a6 3a9b .dw XT_DODO + PFA_MAPSTACK1: +0009a7 3aac .dw XT_I +0009a8 3b5f .dw XT_FETCHE ; -- i*x XT id +0009a9 38c4 .dw XT_SWAP +0009aa 38ff .dw XT_TO_R +0009ab 3908 .dw XT_R_FETCH +0009ac 382a .dw XT_EXECUTE ; i*x id -- j*y true | i*x false +0009ad 38b9 .dw XT_QDUP +0009ae 3836 .dw XT_DOCONDBRANCH +0009af 09b4 DEST(PFA_MAPSTACK2) +0009b0 38f6 .dw XT_R_FROM +0009b1 38d9 .dw XT_DROP +0009b2 3ad4 .dw XT_UNLOOP +0009b3 3820 .dw XT_EXIT + PFA_MAPSTACK2: +0009b4 38f6 .dw XT_R_FROM +0009b5 3feb .dw XT_TWO +0009b6 3aba .dw XT_DOPLUSLOOP +0009b7 09a7 DEST(PFA_MAPSTACK1) + PFA_MAPSTACK3: +0009b8 38d9 .dw XT_DROP +0009b9 3954 .dw XT_ZERO +0009ba 3820 .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: +0009bb ff0b .dw $ff0b +0009bc 6567 +0009bd 2d74 +0009be 7563 +0009bf 7272 +0009c0 6e65 +0009c1 0074 .db "get-current",0 +0009c2 0995 .dw VE_HEAD + .set VE_HEAD = VE_GET_CURRENT + XT_GET_CURRENT: +0009c3 3801 .dw DO_COLON + PFA_GET_CURRENT: +0009c4 383d .dw XT_DOLITERAL +0009c5 003c .dw CFG_CURRENT +0009c6 3b5f .dw XT_FETCHE +0009c7 3820 .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: +0009c8 ff09 .dw $ff09 +0009c9 6567 +0009ca 2d74 +0009cb 726f +0009cc 6564 +0009cd 0072 .db "get-order",0 +0009ce 09bb .dw VE_HEAD + .set VE_HEAD = VE_GET_ORDER + XT_GET_ORDER: +0009cf 3801 .dw DO_COLON + PFA_GET_ORDER: + .endif +0009d0 383d .dw XT_DOLITERAL +0009d1 0040 .dw CFG_ORDERLISTLEN +0009d2 095d .dw XT_GET_STACK +0009d3 3820 .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: +0009d4 ff09 .dw $ff09 +0009d5 6663 +0009d6 2d67 +0009d7 726f +0009d8 6564 +0009d9 0072 .db "cfg-order",0 +0009da 09c8 .dw VE_HEAD + .set VE_HEAD = VE_CFG_ORDER + XT_CFG_ORDER: +0009db 3848 .dw PFA_DOVARIABLE + PFA_CFG_ORDER: + .endif +0009dc 0040 .dw CFG_ORDERLISTLEN + .include "words/compare.asm" + + ; String + ; compares two strings in RAM + VE_COMPARE: +0009dd ff07 .dw $ff07 +0009de 6f63 +0009df 706d +0009e0 7261 +0009e1 0065 .db "compare",0 +0009e2 09d4 .dw VE_HEAD + .set VE_HEAD = VE_COMPARE + XT_COMPARE: +0009e3 09e4 .dw PFA_COMPARE + PFA_COMPARE: +0009e4 93bf push xh +0009e5 93af push xl +0009e6 018c movw temp0, tosl +0009e7 9189 +0009e8 9199 loadtos +0009e9 01dc movw xl, tosl +0009ea 9189 +0009eb 9199 loadtos +0009ec 019c movw temp2, tosl +0009ed 9189 +0009ee 9199 loadtos +0009ef 01fc movw zl, tosl + PFA_COMPARE_LOOP: +0009f0 90ed ld temp4, X+ +0009f1 90f1 ld temp5, Z+ +0009f2 14ef cp temp4, temp5 +0009f3 f451 brne PFA_COMPARE_NOTEQUAL +0009f4 950a dec temp0 +0009f5 f019 breq PFA_COMPARE_ENDREACHED2 +0009f6 952a dec temp2 +0009f7 f7c1 brne PFA_COMPARE_LOOP +0009f8 c001 rjmp PFA_COMPARE_ENDREACHED + PFA_COMPARE_ENDREACHED2: +0009f9 952a dec temp2 + PFA_COMPARE_ENDREACHED: +0009fa 2b02 or temp0, temp2 +0009fb f411 brne PFA_COMPARE_CHECKLASTCHAR +0009fc 2788 clr tosl +0009fd c002 rjmp PFA_COMPARE_DONE + PFA_COMPARE_CHECKLASTCHAR: + PFA_COMPARE_NOTEQUAL: +0009fe ef8f ser tosl +0009ff c000 rjmp PFA_COMPARE_DONE + + PFA_COMPARE_DONE: +000a00 2f98 mov tosh, tosl +000a01 91af pop xl +000a02 91bf pop xh +000a03 940c 3805 jmp_ DO_NEXT + .include "words/nfa2lfa.asm" + + ; System + ; get the link field address from the name field address + VE_NFA2LFA: +000a05 ff07 .dw $ff07 +000a06 666e +000a07 3e61 +000a08 666c +000a09 0061 .db "nfa>lfa",0 +000a0a 09dd .dw VE_HEAD + .set VE_HEAD = VE_NFA2LFA + XT_NFA2LFA: +000a0b 3801 .dw DO_COLON + PFA_NFA2LFA: +000a0c 06ea .dw XT_NAME2STRING +000a0d 3a2f .dw XT_1PLUS +000a0e 3a04 .dw XT_2SLASH +000a0f 399d .dw XT_PLUS +000a10 3820 .dw XT_EXIT + .elif AMFORTH_NRWW_SIZE > 2000 + .else + .endif + .include "dict_appl.inc" + + ; they may be moved to the core dictionary if needed + .include "words/dot-s.asm" + + ; Tools + ; stack dump + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_DOTS: +000a11 ff02 .dw $ff02 +000a12 732e .db ".s" +000a13 0a05 .dw VE_HEAD + .set VE_HEAD = VE_DOTS + XT_DOTS: +000a14 3801 .dw DO_COLON + PFA_DOTS: + .endif +000a15 05e2 .dw XT_DEPTH +000a16 3e0a .dw XT_UDOT +000a17 3fae .dw XT_SPACE +000a18 05e2 .dw XT_DEPTH +000a19 3954 .dw XT_ZERO +000a1a 081b .dw XT_QDOCHECK +000a1b 3836 .dw XT_DOCONDBRANCH +000a1c 0a23 DEST(PFA_DOTS2) +000a1d 3a9b .dw XT_DODO + PFA_DOTS1: +000a1e 3aac .dw XT_I +000a1f 3c84 .dw XT_PICK +000a20 3e0a .dw XT_UDOT +000a21 3ac9 .dw XT_DOLOOP +000a22 0a1e DEST(PFA_DOTS1) + PFA_DOTS2: +000a23 3820 .dw XT_EXIT + .include "words/spirw.asm" + + ; MCU + ; SPI exchange of 1 byte + VE_SPIRW: +000a24 ff06 .dw $ff06 +000a25 2163 +000a26 7340 +000a27 6970 .db "c!@spi" +000a28 0a11 .dw VE_HEAD + .set VE_HEAD = VE_SPIRW + XT_SPIRW: +000a29 0a2a .dw PFA_SPIRW + PFA_SPIRW: +000a2a d003 rcall do_spirw +000a2b 2799 clr tosh +000a2c 940c 3805 jmp_ DO_NEXT + + do_spirw: +000a2e b98f out_ SPDR, tosl + do_spirw1: +000a2f b10e in_ temp0, SPSR +000a30 7f08 cbr temp0,7 +000a31 b90e out_ SPSR, temp0 +000a32 b10e in_ temp0, SPSR +000a33 ff07 sbrs temp0, 7 +000a34 cffa rjmp do_spirw1 ; wait until complete +000a35 b18f in_ tosl, SPDR +000a36 9508 ret + .include "words/n-spi.asm" + + ; MCU + ; read len bytes from SPI to addr + VE_N_SPIR: +000a37 ff05 .dw $ff05 +000a38 406e +000a39 7073 +000a3a 0069 .db "n@spi",0 +000a3b 0a24 .dw VE_HEAD + .set VE_HEAD = VE_N_SPIR + XT_N_SPIR: +000a3c 0a3d .dw PFA_N_SPIR + PFA_N_SPIR: +000a3d 018c movw temp0, tosl +000a3e 9189 +000a3f 9199 loadtos +000a40 01fc movw zl, tosl +000a41 01c8 movw tosl, temp0 + PFA_N_SPIR_LOOP: +000a42 b82f out_ SPDR, zerol + PFA_N_SPIR_LOOP1: +000a43 b12e in_ temp2, SPSR +000a44 ff27 sbrs temp2, SPIF +000a45 cffd rjmp PFA_N_SPIR_LOOP1 +000a46 b12f in_ temp2, SPDR +000a47 9321 st Z+, temp2 +000a48 9701 sbiw tosl, 1 +000a49 f7c1 brne PFA_N_SPIR_LOOP +000a4a 9189 +000a4b 9199 loadtos +000a4c 940c 3805 jmp_ DO_NEXT + + ; ( addr len -- ) + ; MCU + ; write len bytes to SPI from addr + VE_N_SPIW: +000a4e ff05 .dw $ff05 +000a4f 216e +000a50 7073 +000a51 0069 .db "n!spi",0 +000a52 0a37 .dw VE_HEAD + .set VE_HEAD = VE_N_SPIW + XT_N_SPIW: +000a53 0a54 .dw PFA_N_SPIW + PFA_N_SPIW: +000a54 018c movw temp0, tosl +000a55 9189 +000a56 9199 loadtos +000a57 01fc movw zl, tosl +000a58 01c8 movw tosl, temp0 + PFA_N_SPIW_LOOP: +000a59 9121 ld temp2, Z+ +000a5a b92f out_ SPDR, temp2 + PFA_N_SPIW_LOOP1: +000a5b b12e in_ temp2, SPSR +000a5c ff27 sbrs temp2, SPIF +000a5d cffd rjmp PFA_N_SPIW_LOOP1 +000a5e b12f in_ temp2, SPDR ; ignore the data +000a5f 9701 sbiw tosl, 1 +000a60 f7c1 brne PFA_N_SPIW_LOOP +000a61 9189 +000a62 9199 loadtos +000a63 940c 3805 jmp_ DO_NEXT + .include "words/applturnkey.asm" + + ; R( -- ) + ; application specific turnkey action + VE_APPLTURNKEY: +000a65 ff0b .dw $ff0b +000a66 7061 +000a67 6c70 +000a68 7574 +000a69 6e72 +000a6a 656b +000a6b 0079 .db "applturnkey",0 +000a6c 0a4e .dw VE_HEAD + .set VE_HEAD = VE_APPLTURNKEY + XT_APPLTURNKEY: +000a6d 3801 .dw DO_COLON + PFA_APPLTURNKEY: +000a6e 00bc .dw XT_USART + + .if WANT_INTERRUPTS == 1 +000a6f 3c97 .dw XT_INTON + .endif +000a70 017f .dw XT_DOT_VER +000a71 3fae .dw XT_SPACE +000a72 3eac .dw XT_F_CPU +000a73 383d .dw XT_DOLITERAL +000a74 03e8 .dw 1000 +000a75 39c2 .dw XT_UMSLASHMOD +000a76 38f0 .dw XT_NIP +000a77 3f41 .dw XT_DECIMAL +000a78 037a .dw XT_DOT +000a79 03c5 .dw XT_DOSLITERAL +000a7a 0004 .dw 4 +000a7b 486b +000a7c 207a .db "kHz " +000a7d 03f8 .dw XT_ITYPE +000a7e 3820 .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: +000a7f ff0b .dw $ff0b +000a80 6573 +000a81 2d74 +000a82 7563 +000a83 7272 +000a84 6e65 +000a85 0074 .db "set-current",0 +000a86 0a65 .dw VE_HEAD + .set VE_HEAD = VE_SET_CURRENT + XT_SET_CURRENT: +000a87 3801 .dw DO_COLON + PFA_SET_CURRENT: +000a88 383d .dw XT_DOLITERAL +000a89 003c .dw CFG_CURRENT +000a8a 3b3b .dw XT_STOREE +000a8b 3820 .dw XT_EXIT + .include "words/wordlist.asm" + + ; Search Order + ; create a new, empty wordlist + VE_WORDLIST: +000a8c ff08 .dw $ff08 +000a8d 6f77 +000a8e 6472 +000a8f 696c +000a90 7473 .db "wordlist" +000a91 0a7f .dw VE_HEAD + .set VE_HEAD = VE_WORDLIST + XT_WORDLIST: +000a92 3801 .dw DO_COLON + PFA_WORDLIST: +000a93 3f1b .dw XT_EHERE +000a94 3954 .dw XT_ZERO +000a95 38cf .dw XT_OVER +000a96 3b3b .dw XT_STOREE +000a97 38b1 .dw XT_DUP +000a98 3c90 .dw XT_CELLPLUS +000a99 01b4 .dw XT_DOTO +000a9a 3f1c .dw PFA_EHERE +000a9b 3820 .dw XT_EXIT + + .include "words/forth-wordlist.asm" + + ; Search Order + ; get the system default word list + VE_FORTHWORDLIST: +000a9c ff0e .dw $ff0e +000a9d 6f66 +000a9e 7472 +000a9f 2d68 +000aa0 6f77 +000aa1 6472 +000aa2 696c +000aa3 7473 .db "forth-wordlist" +000aa4 0a8c .dw VE_HEAD + .set VE_HEAD = VE_FORTHWORDLIST + XT_FORTHWORDLIST: +000aa5 3848 .dw PFA_DOVARIABLE + PFA_FORTHWORDLIST: +000aa6 003e .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: +000aa7 ff09 .dw $ff09 +000aa8 6573 +000aa9 2d74 +000aaa 726f +000aab 6564 +000aac 0072 .db "set-order",0 +000aad 0a9c .dw VE_HEAD + .set VE_HEAD = VE_SET_ORDER + XT_SET_ORDER: +000aae 3801 .dw DO_COLON + PFA_SET_ORDER: + .endif +000aaf 383d .dw XT_DOLITERAL +000ab0 0040 .dw CFG_ORDERLISTLEN +000ab1 097e .dw XT_SET_STACK +000ab2 3820 .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: +000ab3 ff0f .dw $ff0f +000ab4 6573 +000ab5 2d74 +000ab6 6572 +000ab7 6f63 +000ab8 6e67 +000ab9 7a69 +000aba 7265 +000abb 0073 .db "set-recognizers",0 +000abc 0aa7 .dw VE_HEAD + .set VE_HEAD = VE_SET_RECOGNIZERS + XT_SET_RECOGNIZERS: +000abd 3801 .dw DO_COLON + PFA_SET_RECOGNIZERS: + .endif +000abe 383d .dw XT_DOLITERAL +000abf 0052 .dw CFG_RECOGNIZERLISTLEN +000ac0 097e .dw XT_SET_STACK +000ac1 3820 .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: +000ac2 ff0f .dw $ff0f +000ac3 6567 +000ac4 2d74 +000ac5 6572 +000ac6 6f63 +000ac7 6e67 +000ac8 7a69 +000ac9 7265 +000aca 0073 .db "get-recognizers",0 +000acb 0ab3 .dw VE_HEAD + .set VE_HEAD = VE_GET_RECOGNIZERS + XT_GET_RECOGNIZERS: +000acc 3801 .dw DO_COLON + PFA_GET_RECOGNIZERS: + .endif +000acd 383d .dw XT_DOLITERAL +000ace 0052 .dw CFG_RECOGNIZERLISTLEN +000acf 095d .dw XT_GET_STACK +000ad0 3820 .dw XT_EXIT + .include "words/code.asm" + + ; Compiler + ; create named entry in the dictionary, XT is the data field + VE_CODE: +000ad1 ff04 .dw $ff04 +000ad2 6f63 +000ad3 6564 .db "code" +000ad4 0ac2 .dw VE_HEAD + .set VE_HEAD = VE_CODE + XT_CODE: +000ad5 3801 .dw DO_COLON + PFA_CODE: +000ad6 072e .dw XT_DOCREATE +000ad7 088e .dw XT_REVEAL +000ad8 3f12 .dw XT_DP +000ad9 01c6 .dw XT_ICELLPLUS +000ada 075c .dw XT_COMMA +000adb 3820 .dw XT_EXIT + .include "words/end-code.asm" + + ; Compiler + ; finish a code definition + VE_ENDCODE: +000adc ff08 .dw $ff08 +000add 6e65 +000ade 2d64 +000adf 6f63 +000ae0 6564 .db "end-code" +000ae1 0ad1 .dw VE_HEAD + .set VE_HEAD = VE_ENDCODE + XT_ENDCODE: +000ae2 3801 .dw DO_COLON + PFA_ENDCODE: +000ae3 0751 .dw XT_COMPILE +000ae4 940c .dw $940c +000ae5 0751 .dw XT_COMPILE +000ae6 3805 .dw DO_NEXT +000ae7 3820 .dw XT_EXIT + .include "words/marker.asm" + + ; System Value + ; The eeprom address until which MARKER saves and restores the eeprom data. + VE_MARKER: +000ae8 ff08 .dw $ff08 +000ae9 6d28 +000aea 7261 +000aeb 656b +000aec 2972 .db "(marker)" +000aed 0adc .dw VE_HEAD + .set VE_HEAD = VE_MARKER + XT_MARKER: +000aee 386f .dw PFA_DOVALUE1 + PFA_MARKER: +000aef 005e .dw EE_MARKER +000af0 3da0 .dw XT_EDEFERFETCH +000af1 3daa .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: +000af2 0008 .dw $0008 +000af3 6f70 +000af4 7473 +000af5 6f70 +000af6 656e .db "postpone" +000af7 0ae8 .dw VE_HEAD + .set VE_HEAD = VE_POSTPONE + XT_POSTPONE: +000af8 3801 .dw DO_COLON + PFA_POSTPONE: + .endif +000af9 05b0 .dw XT_PARSENAME +000afa 05f3 .dw XT_FORTHRECOGNIZER +000afb 05fe .dw XT_RECOGNIZE +000afc 38b1 .dw XT_DUP +000afd 38ff .dw XT_TO_R +000afe 01c6 .dw XT_ICELLPLUS +000aff 01c6 .dw XT_ICELLPLUS +000b00 3bcb .dw XT_FETCHI +000b01 382a .dw XT_EXECUTE +000b02 38f6 .dw XT_R_FROM +000b03 01c6 .dw XT_ICELLPLUS +000b04 3bcb .dw XT_FETCHI +000b05 075c .dw XT_COMMA +000b06 3820 .dw XT_EXIT + .endif + .include "words/2r_fetch.asm" + + ; Stack + ; fetch content of TOR + VE_2R_FETCH: +000b07 ff03 .dw $ff03 +000b08 7232 +000b09 0040 .db "2r@",0 +000b0a 0af2 .dw VE_HEAD + .set VE_HEAD = VE_2R_FETCH + XT_2R_FETCH: +000b0b 0b0c .dw PFA_2R_FETCH + PFA_2R_FETCH: +000b0c 939a +000b0d 938a savetos +000b0e 91ef pop zl +000b0f 91ff pop zh +000b10 918f pop tosl +000b11 919f pop tosh +000b12 939f push tosh +000b13 938f push tosl +000b14 93ff push zh +000b15 93ef push zl +000b16 939a +000b17 938a savetos +000b18 01cf movw tosl, zl +000b19 940c 3805 jmp_ DO_NEXT + + .set DPSTART = pc + .if(pc>AMFORTH_RO_SEG) + .endif + + .org AMFORTH_RO_SEG + .include "amforth-interpreter.asm" + + + DO_COLON: +003801 93bf push XH +003802 93af push XL ; PUSH IP +003803 01db movw XL, wl +003804 9611 adiw xl, 1 + DO_NEXT: + .if WANT_INTERRUPTS == 1 +003805 14b2 cp isrflag, zerol +003806 f469 brne DO_INTERRUPT + .endif +003807 01fd movw zl, XL ; READ IP +003808 0fee +003809 1fff +00380a 9165 +00380b 9175 readflashcell wl, wh +00380c 9611 adiw XL, 1 ; INC IP + + DO_EXECUTE: +00380d 01fb movw zl, wl +00380e 0fee +00380f 1fff +003810 9105 +003811 9115 readflashcell temp0,temp1 +003812 01f8 movw zl, temp0 +003813 9409 ijmp + + .if WANT_INTERRUPTS == 1 + DO_INTERRUPT: + ; here we deal with interrupts the forth way +003814 939a +003815 938a savetos +003816 2d8b mov tosl, isrflag +003817 2799 clr tosh +003818 24bb clr isrflag +003819 ec60 ldi wl, LOW(XT_ISREXEC) +00381a e37c ldi wh, HIGH(XT_ISREXEC) +00381b cff1 rjmp DO_EXECUTE + .include "dict/nrww.inc" + + ; section together with the forth inner interpreter + + .include "words/exit.asm" + + ; Compiler + ; end of current colon word + VE_EXIT: +00381c ff04 .dw $ff04 +00381d 7865 +00381e 7469 .db "exit" +00381f 0b07 .dw VE_HEAD + .set VE_HEAD = VE_EXIT + XT_EXIT: +003820 3821 .dw PFA_EXIT + PFA_EXIT: +003821 91af pop XL +003822 91bf pop XH +003823 cfe1 jmp_ DO_NEXT + .include "words/execute.asm" + + ; System + ; execute XT + VE_EXECUTE: +003824 ff07 .dw $ff07 +003825 7865 +003826 6365 +003827 7475 +003828 0065 .db "execute",0 +003829 381c .dw VE_HEAD + .set VE_HEAD = VE_EXECUTE + XT_EXECUTE: +00382a 382b .dw PFA_EXECUTE + PFA_EXECUTE: +00382b 01bc movw wl, tosl +00382c 9189 +00382d 9199 loadtos +00382e cfde 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: +00382f 3830 .dw PFA_DOBRANCH + PFA_DOBRANCH: +003830 01fd movw zl, XL +003831 0fee +003832 1fff +003833 91a5 +003834 91b5 readflashcell XL,XH +003835 cfcf 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: +003836 3837 .dw PFA_DOCONDBRANCH + PFA_DOCONDBRANCH: +003837 2b98 or tosh, tosl +003838 9189 +003839 9199 loadtos +00383a f3a9 brbs 1, PFA_DOBRANCH ; 1 is z flag; if tos is zero (false), do the branch +00383b 9611 adiw XL, 1 +00383c cfc8 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: +00383d 383e .dw PFA_DOLITERAL + PFA_DOLITERAL: +00383e 939a +00383f 938a savetos +003840 01fd movw zl, xl +003841 0fee +003842 1fff +003843 9185 +003844 9195 readflashcell tosl,tosh +003845 9611 adiw xl, 1 +003846 cfbe 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: +003847 3848 .dw PFA_DOVARIABLE + PFA_DOVARIABLE: +003848 939a +003849 938a savetos +00384a 01fb movw zl, wl +00384b 9631 adiw zl,1 +00384c 0fee +00384d 1fff +00384e 9185 +00384f 9195 readflashcell tosl,tosh +003850 cfb4 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: +003851 3852 .dw PFA_DOCONSTANT + PFA_DOCONSTANT: +003852 939a +003853 938a savetos +003854 01cb movw tosl, wl +003855 9601 adiw tosl, 1 +003856 cfae 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: +003857 3858 .dw PFA_DOUSER + PFA_DOUSER: +003858 939a +003859 938a savetos +00385a 01fb movw zl, wl +00385b 9631 adiw zl, 1 +00385c 0fee +00385d 1fff +00385e 9185 +00385f 9195 readflashcell tosl,tosh +003860 0d84 add tosl, upl +003861 1d95 adc tosh, uph +003862 cfa2 jmp_ DO_NEXT + .include "words/do-value.asm" + + ; System + ; runtime of value + VE_DOVALUE: +003863 ff07 .dw $ff07 +003864 7628 +003865 6c61 +003866 6575 +003867 0029 .db "(value)", 0 +003868 3824 .dw VE_HEAD + .set VE_HEAD = VE_DOVALUE + XT_DOVALUE: +003869 3801 .dw DO_COLON + PFA_DOVALUE: +00386a 072e .dw XT_DOCREATE +00386b 088e .dw XT_REVEAL +00386c 0751 .dw XT_COMPILE +00386d 386f .dw PFA_DOVALUE1 +00386e 3820 .dw XT_EXIT + PFA_DOVALUE1: +00386f 940e 08a7 call_ DO_DODOES +003871 38b1 .dw XT_DUP +003872 01c6 .dw XT_ICELLPLUS +003873 3bcb .dw XT_FETCHI +003874 382a .dw XT_EXECUTE +003875 3820 .dw XT_EXIT + + ; : (value) dup icell+ @i execute ; + .include "words/fetch.asm" + + ; Memory + ; read 1 cell from RAM address + VE_FETCH: +003876 ff01 .dw $ff01 +003877 0040 .db "@",0 +003878 3863 .dw VE_HEAD + .set VE_HEAD = VE_FETCH + XT_FETCH: +003879 387a .dw PFA_FETCH + PFA_FETCH: + .if WANT_UNIFIED == 1 + .endif + PFA_FETCHRAM: +00387a 01fc movw zl, tosl + ; low byte is read before the high byte +00387b 9181 ld tosl, z+ +00387c 9191 ld tosh, z+ +00387d cf87 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: +00387e ff01 .dw $ff01 +00387f 0021 .db "!",0 +003880 3876 .dw VE_HEAD + .set VE_HEAD = VE_STORE + XT_STORE: +003881 3882 .dw PFA_STORE + PFA_STORE: + .if WANT_UNIFIED == 1 + .endif + PFA_STORERAM: +003882 01fc movw zl, tosl +003883 9189 +003884 9199 loadtos + ; the high byte is written before the low byte +003885 8391 std Z+1, tosh +003886 8380 std Z+0, tosl +003887 9189 +003888 9199 loadtos +003889 cf7b jmp_ DO_NEXT + .if WANT_UNIFIED == 1 + .endif + .include "words/cstore.asm" + + ; Memory + ; store a single byte to RAM address + VE_CSTORE: +00388a ff02 .dw $ff02 +00388b 2163 .db "c!" +00388c 387e .dw VE_HEAD + .set VE_HEAD = VE_CSTORE + XT_CSTORE: +00388d 388e .dw PFA_CSTORE + PFA_CSTORE: +00388e 01fc movw zl, tosl +00388f 9189 +003890 9199 loadtos +003891 8380 st Z, tosl +003892 9189 +003893 9199 loadtos +003894 cf70 jmp_ DO_NEXT + .include "words/cfetch.asm" + + ; Memory + ; fetch a single byte from memory mapped locations + VE_CFETCH: +003895 ff02 .dw $ff02 +003896 4063 .db "c@" +003897 388a .dw VE_HEAD + .set VE_HEAD = VE_CFETCH + XT_CFETCH: +003898 3899 .dw PFA_CFETCH + PFA_CFETCH: +003899 01fc movw zl, tosl +00389a 2799 clr tosh +00389b 8180 ld tosl, Z +00389c cf68 jmp_ DO_NEXT + .include "words/fetch-u.asm" + + ; Memory + ; read 1 cell from USER area + VE_FETCHU: +00389d ff02 .dw $ff02 +00389e 7540 .db "@u" +00389f 3895 .dw VE_HEAD + .set VE_HEAD = VE_FETCHU + XT_FETCHU: +0038a0 3801 .dw DO_COLON + PFA_FETCHU: +0038a1 3b02 .dw XT_UP_FETCH +0038a2 399d .dw XT_PLUS +0038a3 3879 .dw XT_FETCH +0038a4 3820 .dw XT_EXIT + .include "words/store-u.asm" + + ; Memory + ; write n to USER area at offset + VE_STOREU: +0038a5 ff02 .dw $ff02 +0038a6 7521 .db "!u" +0038a7 389d .dw VE_HEAD + .set VE_HEAD = VE_STOREU + XT_STOREU: +0038a8 3801 .dw DO_COLON + PFA_STOREU: +0038a9 3b02 .dw XT_UP_FETCH +0038aa 399d .dw XT_PLUS +0038ab 3881 .dw XT_STORE +0038ac 3820 .dw XT_EXIT + + ;;;;;;;;;;;;;;;;;;;;;;;;; + .include "words/dup.asm" + + ; Stack + ; duplicate TOS + VE_DUP: +0038ad ff03 .dw $ff03 +0038ae 7564 +0038af 0070 .db "dup",0 +0038b0 38a5 .dw VE_HEAD + .set VE_HEAD = VE_DUP + XT_DUP: +0038b1 38b2 .dw PFA_DUP + PFA_DUP: +0038b2 939a +0038b3 938a savetos +0038b4 cf50 jmp_ DO_NEXT + .include "words/qdup.asm" + + ; Stack + ; duplicate TOS if non-zero + VE_QDUP: +0038b5 ff04 .dw $ff04 +0038b6 643f +0038b7 7075 .db "?dup" +0038b8 38ad .dw VE_HEAD + .set VE_HEAD = VE_QDUP + XT_QDUP: +0038b9 38ba .dw PFA_QDUP + PFA_QDUP: +0038ba 2f08 mov temp0, tosl +0038bb 2b09 or temp0, tosh +0038bc f011 breq PFA_QDUP1 +0038bd 939a +0038be 938a savetos + PFA_QDUP1: +0038bf cf45 jmp_ DO_NEXT + .include "words/swap.asm" + + ; Stack + ; swaps the two top level stack cells + VE_SWAP: +0038c0 ff04 .dw $ff04 +0038c1 7773 +0038c2 7061 .db "swap" +0038c3 38b5 .dw VE_HEAD + .set VE_HEAD = VE_SWAP + XT_SWAP: +0038c4 38c5 .dw PFA_SWAP + PFA_SWAP: +0038c5 018c movw temp0, tosl +0038c6 9189 +0038c7 9199 loadtos +0038c8 931a st -Y, temp1 +0038c9 930a st -Y, temp0 +0038ca cf3a jmp_ DO_NEXT + .include "words/over.asm" + + ; Stack + ; Place a copy of x1 on top of the stack + VE_OVER: +0038cb ff04 .dw $ff04 +0038cc 766f +0038cd 7265 .db "over" +0038ce 38c0 .dw VE_HEAD + .set VE_HEAD = VE_OVER + XT_OVER: +0038cf 38d0 .dw PFA_OVER + PFA_OVER: +0038d0 939a +0038d1 938a savetos +0038d2 818a ldd tosl, Y+2 +0038d3 819b ldd tosh, Y+3 + +0038d4 cf30 jmp_ DO_NEXT + .include "words/drop.asm" + + ; Stack + ; drop TOS + VE_DROP: +0038d5 ff04 .dw $ff04 +0038d6 7264 +0038d7 706f .db "drop" +0038d8 38cb .dw VE_HEAD + .set VE_HEAD = VE_DROP + XT_DROP: +0038d9 38da .dw PFA_DROP + PFA_DROP: +0038da 9189 +0038db 9199 loadtos +0038dc cf28 jmp_ DO_NEXT + .include "words/rot.asm" + + ; Stack + ; rotate the three top level cells + VE_ROT: +0038dd ff03 .dw $ff03 +0038de 6f72 +0038df 0074 .db "rot",0 +0038e0 38d5 .dw VE_HEAD + .set VE_HEAD = VE_ROT + XT_ROT: +0038e1 38e2 .dw PFA_ROT + PFA_ROT: +0038e2 018c movw temp0, tosl +0038e3 9129 ld temp2, Y+ +0038e4 9139 ld temp3, Y+ +0038e5 9189 +0038e6 9199 loadtos + +0038e7 933a st -Y, temp3 +0038e8 932a st -Y, temp2 +0038e9 931a st -Y, temp1 +0038ea 930a st -Y, temp0 + +0038eb cf19 jmp_ DO_NEXT + .include "words/nip.asm" + + ; Stack + ; Remove Second of Stack + VE_NIP: +0038ec ff03 .dw $ff03 +0038ed 696e +0038ee 0070 .db "nip",0 +0038ef 38dd .dw VE_HEAD + .set VE_HEAD = VE_NIP + XT_NIP: +0038f0 38f1 .dw PFA_NIP + PFA_NIP: +0038f1 9622 adiw yl, 2 +0038f2 cf12 jmp_ DO_NEXT + ;;;;;;;;;;;;;;;;;;;;;;;;; + .include "words/r_from.asm" + + ; Stack + ; move TOR to TOS + VE_R_FROM: +0038f3 ff02 .dw $ff02 +0038f4 3e72 .db "r>" +0038f5 38ec .dw VE_HEAD + .set VE_HEAD = VE_R_FROM + XT_R_FROM: +0038f6 38f7 .dw PFA_R_FROM + PFA_R_FROM: +0038f7 939a +0038f8 938a savetos +0038f9 918f pop tosl +0038fa 919f pop tosh +0038fb cf09 jmp_ DO_NEXT + .include "words/to_r.asm" + + ; Stack + ; move TOS to TOR + VE_TO_R: +0038fc ff02 .dw $ff02 +0038fd 723e .db ">r" +0038fe 38f3 .dw VE_HEAD + .set VE_HEAD = VE_TO_R + XT_TO_R: +0038ff 3900 .dw PFA_TO_R + PFA_TO_R: +003900 939f push tosh +003901 938f push tosl +003902 9189 +003903 9199 loadtos +003904 cf00 jmp_ DO_NEXT + .include "words/r_fetch.asm" + + ; Stack + ; fetch content of TOR + VE_R_FETCH: +003905 ff02 .dw $ff02 +003906 4072 .db "r@" +003907 38fc .dw VE_HEAD + .set VE_HEAD = VE_R_FETCH + XT_R_FETCH: +003908 3909 .dw PFA_R_FETCH + PFA_R_FETCH: +003909 939a +00390a 938a savetos +00390b 918f pop tosl +00390c 919f pop tosh +00390d 939f push tosh +00390e 938f push tosl +00390f cef5 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: +003910 ff02 .dw $ff02 +003911 3e3c .db "<>" +003912 3905 .dw VE_HEAD + .set VE_HEAD = VE_NOTEQUAL + XT_NOTEQUAL: +003913 3801 .dw DO_COLON + PFA_NOTEQUAL: + .endif + +003914 3fdf +003915 391a +003916 3820 .DW XT_EQUAL,XT_ZEROEQUAL,XT_EXIT + .include "words/equalzero.asm" + + ; Compare + ; compare with 0 (zero) + VE_ZEROEQUAL: +003917 ff02 .dw $ff02 +003918 3d30 .db "0=" +003919 3910 .dw VE_HEAD + .set VE_HEAD = VE_ZEROEQUAL + XT_ZEROEQUAL: +00391a 391b .dw PFA_ZEROEQUAL + PFA_ZEROEQUAL: +00391b 2b98 or tosh, tosl +00391c f5d1 brne PFA_ZERO1 +00391d c030 rjmp PFA_TRUE1 + .include "words/lesszero.asm" + + ; Compare + ; compare with zero + VE_ZEROLESS: +00391e ff02 .dw $ff02 +00391f 3c30 .db "0<" +003920 3917 .dw VE_HEAD + .set VE_HEAD = VE_ZEROLESS + XT_ZEROLESS: +003921 3922 .dw PFA_ZEROLESS + PFA_ZEROLESS: +003922 fd97 sbrc tosh,7 +003923 c02a rjmp PFA_TRUE1 +003924 c032 rjmp PFA_ZERO1 + .include "words/greaterzero.asm" + + ; Compare + ; true if n1 is greater than 0 + VE_GREATERZERO: +003925 ff02 .dw $ff02 +003926 3e30 .db "0>" +003927 391e .dw VE_HEAD + .set VE_HEAD = VE_GREATERZERO + XT_GREATERZERO: +003928 3929 .dw PFA_GREATERZERO + PFA_GREATERZERO: +003929 1582 cp tosl, zerol +00392a 0593 cpc tosh, zeroh +00392b f15c brlt PFA_ZERO1 +00392c f151 brbs 1, PFA_ZERO1 +00392d c020 rjmp PFA_TRUE1 + .include "words/d-greaterzero.asm" + + ; Compare + ; compares if a double double cell number is greater 0 + VE_DGREATERZERO: +00392e ff03 .dw $ff03 +00392f 3064 +003930 003e .db "d0>",0 +003931 3925 .dw VE_HEAD + .set VE_HEAD = VE_DGREATERZERO + XT_DGREATERZERO: +003932 3933 .dw PFA_DGREATERZERO + PFA_DGREATERZERO: +003933 1582 cp tosl, zerol +003934 0593 cpc tosh, zeroh +003935 9189 +003936 9199 loadtos +003937 0582 cpc tosl, zerol +003938 0593 cpc tosh, zeroh +003939 f0ec brlt PFA_ZERO1 +00393a f0e1 brbs 1, PFA_ZERO1 +00393b c012 rjmp PFA_TRUE1 + .include "words/d-lesszero.asm" + + ; Compare + ; compares if a double double cell number is less than 0 + VE_DXT_ZEROLESS: +00393c ff03 .dw $ff03 +00393d 3064 +00393e 003c .db "d0<",0 +00393f 392e .dw VE_HEAD + .set VE_HEAD = VE_DXT_ZEROLESS + XT_DXT_ZEROLESS: +003940 3941 .dw PFA_DXT_ZEROLESS + PFA_DXT_ZEROLESS: +003941 9622 adiw Y,2 +003942 fd97 sbrc tosh,7 +003943 940c 394e jmp PFA_TRUE1 +003945 940c 3957 jmp PFA_ZERO1 + + .include "words/true.asm" + + ; Arithmetics + ; leaves the value -1 (true) on TOS + VE_TRUE: +003947 ff04 .dw $ff04 +003948 7274 +003949 6575 .db "true" +00394a 393c .dw VE_HEAD + .set VE_HEAD = VE_TRUE + XT_TRUE: +00394b 394c .dw PFA_TRUE + PFA_TRUE: +00394c 939a +00394d 938a savetos + PFA_TRUE1: +00394e ef8f ser tosl +00394f ef9f ser tosh +003950 ceb4 jmp_ DO_NEXT + .include "words/zero.asm" + + ; Arithmetics + ; place a value 0 on TOS + VE_ZERO: +003951 ff01 .dw $ff01 +003952 0030 .db "0",0 +003953 3947 .dw VE_HEAD + .set VE_HEAD = VE_ZERO + XT_ZERO: +003954 3955 .dw PFA_ZERO + PFA_ZERO: +003955 939a +003956 938a savetos + PFA_ZERO1: +003957 01c1 movw tosl, zerol +003958 ceac jmp_ DO_NEXT + .include "words/uless.asm" + + ; Compare + ; true if u1 < u2 (unsigned) + VE_ULESS: +003959 ff02 .dw $ff02 +00395a 3c75 .db "u<" +00395b 3951 .dw VE_HEAD + .set VE_HEAD = VE_ULESS + XT_ULESS: +00395c 395d .dw PFA_ULESS + PFA_ULESS: +00395d 9129 ld temp2, Y+ +00395e 9139 ld temp3, Y+ +00395f 1782 cp tosl, temp2 +003960 0793 cpc tosh, temp3 +003961 f3a8 brlo PFA_ZERO1 +003962 f3a1 brbs 1, PFA_ZERO1 +003963 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: +003964 ff02 .dw $ff02 +003965 3e75 .db "u>" +003966 3959 .dw VE_HEAD + .set VE_HEAD = VE_UGREATER + XT_UGREATER: +003967 3801 .dw DO_COLON + PFA_UGREATER: + .endif +003968 38c4 .DW XT_SWAP +003969 395c .dw XT_ULESS +00396a 3820 .dw XT_EXIT + .include "words/less.asm" + + ; Compare + ; true if n1 is less than n2 + VE_LESS: +00396b ff01 .dw $ff01 +00396c 003c .db "<",0 +00396d 3964 .dw VE_HEAD + .set VE_HEAD = VE_LESS + XT_LESS: +00396e 396f .dw PFA_LESS + PFA_LESS: +00396f 9129 ld temp2, Y+ +003970 9139 ld temp3, Y+ +003971 1728 cp temp2, tosl +003972 0739 cpc temp3, tosh + PFA_LESSDONE: +003973 f71c brge PFA_ZERO1 +003974 cfd9 rjmp PFA_TRUE1 + .include "words/greater.asm" + + ; Compare + ; flag is true if n1 is greater than n2 + VE_GREATER: +003975 ff01 .dw $ff01 +003976 003e .db ">",0 +003977 396b .dw VE_HEAD + .set VE_HEAD = VE_GREATER + XT_GREATER: +003978 3979 .dw PFA_GREATER + PFA_GREATER: +003979 9129 ld temp2, Y+ +00397a 9139 ld temp3, Y+ +00397b 1728 cp temp2, tosl +00397c 0739 cpc temp3, tosh + PFA_GREATERDONE: +00397d f2cc brlt PFA_ZERO1 +00397e f2c1 brbs 1, PFA_ZERO1 +00397f cfce rjmp PFA_TRUE1 + + .include "words/log2.asm" + + ; Arithmetics + ; logarithm to base 2 or highest set bitnumber + VE_LOG2: +003980 ff04 .dw $ff04 +003981 6f6c +003982 3267 .db "log2" +003983 3975 .dw VE_HEAD + .set VE_HEAD = VE_LOG2 + XT_LOG2: +003984 3985 .dw PFA_LOG2 + PFA_LOG2: +003985 01fc movw zl, tosl +003986 2799 clr tosh +003987 e180 ldi tosl, 16 + PFA_LOG2_1: +003988 958a dec tosl +003989 f022 brmi PFA_LOG2_2 ; wrong data +00398a 0fee lsl zl +00398b 1fff rol zh +00398c f7d8 brcc PFA_LOG2_1 +00398d ce77 jmp_ DO_NEXT + + PFA_LOG2_2: +00398e 959a dec tosh +00398f ce75 jmp_ DO_NEXT + .include "words/minus.asm" + + ; Arithmetics + ; subtract n2 from n1 + VE_MINUS: +003990 ff01 .dw $ff01 +003991 002d .db "-",0 +003992 3980 .dw VE_HEAD + .set VE_HEAD = VE_MINUS + XT_MINUS: +003993 3994 .dw PFA_MINUS + PFA_MINUS: +003994 9109 ld temp0, Y+ +003995 9119 ld temp1, Y+ +003996 1b08 sub temp0, tosl +003997 0b19 sbc temp1, tosh +003998 01c8 movw tosl, temp0 +003999 ce6b jmp_ DO_NEXT + .include "words/plus.asm" + + ; Arithmetics + ; add n1 and n2 + VE_PLUS: +00399a ff01 .dw $ff01 +00399b 002b .db "+",0 +00399c 3990 .dw VE_HEAD + .set VE_HEAD = VE_PLUS + XT_PLUS: +00399d 399e .dw PFA_PLUS + PFA_PLUS: +00399e 9109 ld temp0, Y+ +00399f 9119 ld temp1, Y+ +0039a0 0f80 add tosl, temp0 +0039a1 1f91 adc tosh, temp1 +0039a2 ce62 jmp_ DO_NEXT + .include "words/mstar.asm" + + ; Arithmetics + ; multiply 2 cells to a double cell + VE_MSTAR: +0039a3 ff02 .dw $ff02 +0039a4 2a6d .db "m*" +0039a5 399a .dw VE_HEAD + .set VE_HEAD = VE_MSTAR + XT_MSTAR: +0039a6 39a7 .dw PFA_MSTAR + PFA_MSTAR: +0039a7 018c movw temp0, tosl +0039a8 9189 +0039a9 9199 loadtos +0039aa 019c movw temp2, tosl + ; high cell ah*bh +0039ab 0231 muls temp3, temp1 +0039ac 0170 movw temp4, r0 + ; low cell al*bl +0039ad 9f20 mul temp2, temp0 +0039ae 01c0 movw tosl, r0 + ; signed ah*bl +0039af 0330 mulsu temp3, temp0 +0039b0 08f3 sbc temp5, zeroh +0039b1 0d90 add tosh, r0 +0039b2 1ce1 adc temp4, r1 +0039b3 1cf3 adc temp5, zeroh + + ; signed al*bh +0039b4 0312 mulsu temp1, temp2 +0039b5 08f3 sbc temp5, zeroh +0039b6 0d90 add tosh, r0 +0039b7 1ce1 adc temp4, r1 +0039b8 1cf3 adc temp5, zeroh + +0039b9 939a +0039ba 938a savetos +0039bb 01c7 movw tosl, temp4 +0039bc ce48 jmp_ DO_NEXT + .include "words/umslashmod.asm" + + ; Arithmetics + ; unsigned division ud / u2 with remainder + VE_UMSLASHMOD: +0039bd ff06 .dw $ff06 +0039be 6d75 +0039bf 6d2f +0039c0 646f .db "um/mod" +0039c1 39a3 .dw VE_HEAD + .set VE_HEAD = VE_UMSLASHMOD + XT_UMSLASHMOD: +0039c2 39c3 .dw PFA_UMSLASHMOD + PFA_UMSLASHMOD: +0039c3 017c movw temp4, tosl + +0039c4 9129 ld temp2, Y+ +0039c5 9139 ld temp3, Y+ + +0039c6 9109 ld temp0, Y+ +0039c7 9119 ld temp1, Y+ + + ;; unsigned 32/16 -> 16r16 divide + + PFA_UMSLASHMODmod: + + ; set loop counter +0039c8 e140 ldi temp6,$10 + + PFA_UMSLASHMODmod_loop: + ; shift left, saving high bit +0039c9 2755 clr temp7 +0039ca 0f00 lsl temp0 +0039cb 1f11 rol temp1 +0039cc 1f22 rol temp2 +0039cd 1f33 rol temp3 +0039ce 1f55 rol temp7 + + ; try subtracting divisor +0039cf 152e cp temp2, temp4 +0039d0 053f cpc temp3, temp5 +0039d1 0552 cpc temp7,zerol + +0039d2 f018 brcs PFA_UMSLASHMODmod_loop_control + + PFA_UMSLASHMODmod_subtract: + ; dividend is large enough + ; do the subtraction for real + ; and set lowest bit +0039d3 9503 inc temp0 +0039d4 192e sub temp2, temp4 +0039d5 093f sbc temp3, temp5 + + PFA_UMSLASHMODmod_loop_control: +0039d6 954a dec temp6 +0039d7 f789 brne PFA_UMSLASHMODmod_loop + + PFA_UMSLASHMODmod_done: + ; put remainder on stack +0039d8 933a st -Y,temp3 +0039d9 932a st -Y,temp2 + + ; put quotient on stack +0039da 01c8 movw tosl, temp0 +0039db ce29 jmp_ DO_NEXT + .include "words/umstar.asm" + + ; Arithmetics + ; multiply 2 unsigned cells to a double cell + VE_UMSTAR: +0039dc ff03 .dw $ff03 +0039dd 6d75 +0039de 002a .db "um*",0 +0039df 39bd .dw VE_HEAD + .set VE_HEAD = VE_UMSTAR + XT_UMSTAR: +0039e0 39e1 .dw PFA_UMSTAR + PFA_UMSTAR: +0039e1 018c movw temp0, tosl +0039e2 9189 +0039e3 9199 loadtos + ; result: (temp3*temp1)* 65536 + (temp3*temp0 + temp1*temp2) * 256 + (temp0 * temp2) + ; low bytes +0039e4 9f80 mul tosl,temp0 +0039e5 01f0 movw zl, r0 +0039e6 2722 clr temp2 +0039e7 2733 clr temp3 + ; middle bytes +0039e8 9f90 mul tosh, temp0 +0039e9 0df0 add zh, r0 +0039ea 1d21 adc temp2, r1 +0039eb 1d33 adc temp3, zeroh + +0039ec 9f81 mul tosl, temp1 +0039ed 0df0 add zh, r0 +0039ee 1d21 adc temp2, r1 +0039ef 1d33 adc temp3, zeroh + +0039f0 9f91 mul tosh, temp1 +0039f1 0d20 add temp2, r0 +0039f2 1d31 adc temp3, r1 +0039f3 01cf movw tosl, zl +0039f4 939a +0039f5 938a savetos +0039f6 01c9 movw tosl, temp2 +0039f7 ce0d jmp_ DO_NEXT + + .include "words/invert.asm" + + ; Arithmetics + ; 1-complement of TOS + VE_INVERT: +0039f8 ff06 .dw $ff06 +0039f9 6e69 +0039fa 6576 +0039fb 7472 .db "invert" +0039fc 39dc .dw VE_HEAD + .set VE_HEAD = VE_INVERT + XT_INVERT: +0039fd 39fe .dw PFA_INVERT + PFA_INVERT: +0039fe 9580 com tosl +0039ff 9590 com tosh +003a00 ce04 jmp_ DO_NEXT + .include "words/2slash.asm" + + ; Arithmetics + ; arithmetic shift right + VE_2SLASH: +003a01 ff02 .dw $ff02 +003a02 2f32 .db "2/" +003a03 39f8 .dw VE_HEAD + .set VE_HEAD = VE_2SLASH + XT_2SLASH: +003a04 3a05 .dw PFA_2SLASH + PFA_2SLASH: +003a05 9595 asr tosh +003a06 9587 ror tosl +003a07 cdfd jmp_ DO_NEXT + .include "words/2star.asm" + + ; Arithmetics + ; arithmetic shift left, filling with zero + VE_2STAR: +003a08 ff02 .dw $ff02 +003a09 2a32 .db "2*" +003a0a 3a01 .dw VE_HEAD + .set VE_HEAD = VE_2STAR + XT_2STAR: +003a0b 3a0c .dw PFA_2STAR + PFA_2STAR: +003a0c 0f88 lsl tosl +003a0d 1f99 rol tosh +003a0e cdf6 jmp_ DO_NEXT + .include "words/and.asm" + + ; Logic + ; bitwise and + VE_AND: +003a0f ff03 .dw $ff03 +003a10 6e61 +003a11 0064 .db "and",0 +003a12 3a08 .dw VE_HEAD + .set VE_HEAD = VE_AND + XT_AND: +003a13 3a14 .dw PFA_AND + PFA_AND: +003a14 9109 ld temp0, Y+ +003a15 9119 ld temp1, Y+ +003a16 2380 and tosl, temp0 +003a17 2391 and tosh, temp1 +003a18 cdec jmp_ DO_NEXT + .include "words/or.asm" + + ; Logic + ; logical or + VE_OR: +003a19 ff02 .dw $ff02 +003a1a 726f .db "or" +003a1b 3a0f .dw VE_HEAD + .set VE_HEAD = VE_OR + XT_OR: +003a1c 3a1d .dw PFA_OR + PFA_OR: +003a1d 9109 ld temp0, Y+ +003a1e 9119 ld temp1, Y+ +003a1f 2b80 or tosl, temp0 +003a20 2b91 or tosh, temp1 +003a21 cde3 jmp_ DO_NEXT + + .include "words/xor.asm" + + ; Logic + ; exclusive or + VE_XOR: +003a22 ff03 .dw $ff03 +003a23 6f78 +003a24 0072 .db "xor",0 +003a25 3a19 .dw VE_HEAD + .set VE_HEAD = VE_XOR + XT_XOR: +003a26 3a27 .dw PFA_XOR + PFA_XOR: +003a27 9109 ld temp0, Y+ +003a28 9119 ld temp1, Y+ +003a29 2780 eor tosl, temp0 +003a2a 2791 eor tosh, temp1 +003a2b cdd9 jmp_ DO_NEXT + + .include "words/1plus.asm" + + ; Arithmetics + ; optimized increment + VE_1PLUS: +003a2c ff02 .dw $ff02 +003a2d 2b31 .db "1+" +003a2e 3a22 .dw VE_HEAD + .set VE_HEAD = VE_1PLUS + XT_1PLUS: +003a2f 3a30 .dw PFA_1PLUS + PFA_1PLUS: +003a30 9601 adiw tosl,1 +003a31 cdd3 jmp_ DO_NEXT + .include "words/1minus.asm" + + ; Arithmetics + ; optimized decrement + VE_1MINUS: +003a32 ff02 .dw $ff02 +003a33 2d31 .db "1-" +003a34 3a2c .dw VE_HEAD + .set VE_HEAD = VE_1MINUS + XT_1MINUS: +003a35 3a36 .dw PFA_1MINUS + PFA_1MINUS: +003a36 9701 sbiw tosl, 1 +003a37 cdcd 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: +003a38 ff07 .dw $ff07 +003a39 6e3f +003a3a 6765 +003a3b 7461 +../../common\words/q-negate.asm(11): warning: .cseg .db misalignment - padding zero byte +003a3c 0065 .db "?negate" +003a3d 3a32 .dw VE_HEAD + .set VE_HEAD = VE_QNEGATE + XT_QNEGATE: +003a3e 3801 .dw DO_COLON + PFA_QNEGATE: + + .endif +003a3f 3921 +003a40 3836 .DW XT_ZEROLESS,XT_DOCONDBRANCH +003a41 3a43 DEST(QNEG1) +003a42 3e27 .DW XT_NEGATE +003a43 3820 QNEG1: .DW XT_EXIT + .include "words/lshift.asm" + + ; Arithmetics + ; logically shift n1 left n2 times + VE_LSHIFT: +003a44 ff06 .dw $ff06 +003a45 736c +003a46 6968 +003a47 7466 .db "lshift" +003a48 3a38 .dw VE_HEAD + .set VE_HEAD = VE_LSHIFT + XT_LSHIFT: +003a49 3a4a .dw PFA_LSHIFT + PFA_LSHIFT: +003a4a 01fc movw zl, tosl +003a4b 9189 +003a4c 9199 loadtos + PFA_LSHIFT1: +003a4d 9731 sbiw zl, 1 +003a4e f01a brmi PFA_LSHIFT2 +003a4f 0f88 lsl tosl +003a50 1f99 rol tosh +003a51 cffb rjmp PFA_LSHIFT1 + PFA_LSHIFT2: +003a52 cdb2 jmp_ DO_NEXT + + .include "words/rshift.asm" + + ; Arithmetics + ; shift n1 n2-times logically right + VE_RSHIFT: +003a53 ff06 .dw $ff06 +003a54 7372 +003a55 6968 +003a56 7466 .db "rshift" +003a57 3a44 .dw VE_HEAD + .set VE_HEAD = VE_RSHIFT + XT_RSHIFT: +003a58 3a59 .dw PFA_RSHIFT + PFA_RSHIFT: +003a59 01fc movw zl, tosl +003a5a 9189 +003a5b 9199 loadtos + PFA_RSHIFT1: +003a5c 9731 sbiw zl, 1 +003a5d f01a brmi PFA_RSHIFT2 +003a5e 9596 lsr tosh +003a5f 9587 ror tosl +003a60 cffb rjmp PFA_RSHIFT1 + PFA_RSHIFT2: +003a61 cda3 jmp_ DO_NEXT + + .include "words/plusstore.asm" + + ; Arithmetics + ; add n to content of RAM address a-addr + VE_PLUSSTORE: +003a62 ff02 .dw $ff02 +003a63 212b .db "+!" +003a64 3a53 .dw VE_HEAD + .set VE_HEAD = VE_PLUSSTORE + XT_PLUSSTORE: +003a65 3a66 .dw PFA_PLUSSTORE + PFA_PLUSSTORE: +003a66 01fc movw zl, tosl +003a67 9189 +003a68 9199 loadtos +003a69 8120 ldd temp2, Z+0 +003a6a 8131 ldd temp3, Z+1 +003a6b 0f82 add tosl, temp2 +003a6c 1f93 adc tosh, temp3 +003a6d 8380 std Z+0, tosl +003a6e 8391 std Z+1, tosh +003a6f 9189 +003a70 9199 loadtos +003a71 cd93 jmp_ DO_NEXT + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + .include "words/rpfetch.asm" + + ; Stack + ; current return stack pointer address + VE_RP_FETCH: +003a72 ff03 .dw $ff03 +003a73 7072 +003a74 0040 .db "rp@",0 +003a75 3a62 .dw VE_HEAD + .set VE_HEAD = VE_RP_FETCH + XT_RP_FETCH: +003a76 3a77 .dw PFA_RP_FETCH + PFA_RP_FETCH: +003a77 939a +003a78 938a savetos +003a79 b78d in tosl, SPL +003a7a b79e in tosh, SPH +003a7b cd89 jmp_ DO_NEXT + .include "words/rpstore.asm" + + ; Stack + ; set return stack pointer + VE_RP_STORE: +003a7c ff03 .dw $ff03 +003a7d 7072 +003a7e 0021 .db "rp!",0 +003a7f 3a72 .dw VE_HEAD + .set VE_HEAD = VE_RP_STORE + XT_RP_STORE: +003a80 3a81 .dw PFA_RP_STORE + PFA_RP_STORE: +003a81 b72f in temp2, SREG +003a82 94f8 cli +003a83 bf8d out SPL, tosl +003a84 bf9e out SPH, tosh +003a85 bf2f out SREG, temp2 +003a86 9189 +003a87 9199 loadtos +003a88 cd7c jmp_ DO_NEXT + .include "words/spfetch.asm" + + ; Stack + ; current data stack pointer + VE_SP_FETCH: +003a89 ff03 .dw $ff03 +003a8a 7073 +003a8b 0040 .db "sp@",0 +003a8c 3a7c .dw VE_HEAD + .set VE_HEAD = VE_SP_FETCH + XT_SP_FETCH: +003a8d 3a8e .dw PFA_SP_FETCH + PFA_SP_FETCH: +003a8e 939a +003a8f 938a savetos +003a90 01ce movw tosl, yl +003a91 cd73 jmp_ DO_NEXT + .include "words/spstore.asm" + + ; Stack + ; set data stack pointer to addr + VE_SP_STORE: +003a92 ff03 .dw $ff03 +003a93 7073 +003a94 0021 .db "sp!",0 +003a95 3a89 .dw VE_HEAD + .set VE_HEAD = VE_SP_STORE + XT_SP_STORE: +003a96 3a97 .dw PFA_SP_STORE + PFA_SP_STORE: +003a97 01ec movw yl, tosl +003a98 9189 +003a99 9199 loadtos +003a9a cd6a 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: +003a9b 3a9c .dw PFA_DODO + PFA_DODO: +003a9c 9129 ld temp2, Y+ +003a9d 9139 ld temp3, Y+ ; limit + PFA_DODO1: +003a9e e8e0 ldi zl, $80 +003a9f 0f3e add temp3, zl +003aa0 1b82 sub tosl, temp2 +003aa1 0b93 sbc tosh, temp3 + +003aa2 933f push temp3 +003aa3 932f push temp2 ; limit ( --> limit + $8000) +003aa4 939f push tosh +003aa5 938f push tosl ; start -> index ( --> index - (limit - $8000) +003aa6 9189 +003aa7 9199 loadtos +003aa8 cd5c jmp_ DO_NEXT + .include "words/i.asm" + + ; Compiler + ; current loop counter + VE_I: +003aa9 ff01 .dw $FF01 +003aaa 0069 .db "i",0 +003aab 3a92 .dw VE_HEAD + .set VE_HEAD = VE_I + XT_I: +003aac 3aad .dw PFA_I + PFA_I: +003aad 939a +003aae 938a savetos +003aaf 918f pop tosl +003ab0 919f pop tosh ; index +003ab1 91ef pop zl +003ab2 91ff pop zh ; limit +003ab3 93ff push zh +003ab4 93ef push zl +003ab5 939f push tosh +003ab6 938f push tosl +003ab7 0f8e add tosl, zl +003ab8 1f9f adc tosh, zh +003ab9 cd4b 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: +003aba 3abb .dw PFA_DOPLUSLOOP + PFA_DOPLUSLOOP: +003abb 91ef pop zl +003abc 91ff pop zh +003abd 0fe8 add zl, tosl +003abe 1ff9 adc zh, tosh +003abf 9189 +003ac0 9199 loadtos +003ac1 f01b brvs PFA_DOPLUSLOOP_LEAVE + ; next cycle + PFA_DOPLUSLOOP_NEXT: + ; next iteration +003ac2 93ff push zh +003ac3 93ef push zl +003ac4 cd6b rjmp PFA_DOBRANCH ; read next cell from dictionary and jump to its destination + PFA_DOPLUSLOOP_LEAVE: +003ac5 910f pop temp0 +003ac6 911f pop temp1 ; remove limit +003ac7 9611 adiw xl, 1 ; skip branch-back address +003ac8 cd3c 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: +003ac9 3aca .dw PFA_DOLOOP + PFA_DOLOOP: +003aca 91ef pop zl +003acb 91ff pop zh +003acc 9631 adiw zl,1 +003acd f3bb brvs PFA_DOPLUSLOOP_LEAVE +003ace cff3 jmp_ PFA_DOPLUSLOOP_NEXT + .include "words/unloop.asm" + + ; Compiler + ; remove loop-sys, exit the loop and continue execution after it + VE_UNLOOP: +003acf ff06 .dw $ff06 +003ad0 6e75 +003ad1 6f6c +003ad2 706f .db "unloop" +003ad3 3aa9 .dw VE_HEAD + .set VE_HEAD = VE_UNLOOP + XT_UNLOOP: +003ad4 3ad5 .dw PFA_UNLOOP + PFA_UNLOOP: +003ad5 911f pop temp1 +003ad6 910f pop temp0 +003ad7 911f pop temp1 +003ad8 910f pop temp0 +003ad9 cd2b jmp_ DO_NEXT + + ;;;;;;;;;;;;;;;;;;;;;;;;;;; + + .include "words/cmove_g.asm" + + ; Memory + ; copy data in RAM from higher to lower addresses. + VE_CMOVE_G: +003ada ff06 .dw $ff06 +003adb 6d63 +003adc 766f +003add 3e65 .db "cmove>" +003ade 3acf .dw VE_HEAD + .set VE_HEAD = VE_CMOVE_G + XT_CMOVE_G: +003adf 3ae0 .dw PFA_CMOVE_G + PFA_CMOVE_G: +003ae0 93bf push xh +003ae1 93af push xl +003ae2 91e9 ld zl, Y+ +003ae3 91f9 ld zh, Y+ ; addr-to +003ae4 91a9 ld xl, Y+ +003ae5 91b9 ld xh, Y+ ; addr-from +003ae6 2f09 mov temp0, tosh +003ae7 2b08 or temp0, tosl +003ae8 f041 brbs 1, PFA_CMOVE_G1 +003ae9 0fe8 add zl, tosl +003aea 1ff9 adc zh, tosh +003aeb 0fa8 add xl, tosl +003aec 1fb9 adc xh, tosh + PFA_CMOVE_G2: +003aed 911e ld temp1, -X +003aee 9312 st -Z, temp1 +003aef 9701 sbiw tosl, 1 +003af0 f7e1 brbc 1, PFA_CMOVE_G2 + PFA_CMOVE_G1: +003af1 91af pop xl +003af2 91bf pop xh +003af3 9189 +003af4 9199 loadtos +003af5 cd0f jmp_ DO_NEXT + .include "words/byteswap.asm" + + ; Arithmetics + ; exchange the bytes of the TOS + VE_BYTESWAP: +003af6 ff02 .dw $ff02 +003af7 3c3e .db "><" +003af8 3ada .dw VE_HEAD + .set VE_HEAD = VE_BYTESWAP + XT_BYTESWAP: +003af9 3afa .dw PFA_BYTESWAP + PFA_BYTESWAP: +003afa 2f09 mov temp0, tosh +003afb 2f98 mov tosh, tosl +003afc 2f80 mov tosl, temp0 +003afd cd07 jmp_ DO_NEXT + .include "words/up.asm" + + ; System Variable + ; get user area pointer + VE_UP_FETCH: +003afe ff03 .dw $ff03 +003aff 7075 +003b00 0040 .db "up@",0 +003b01 3af6 .dw VE_HEAD + .set VE_HEAD = VE_UP_FETCH + XT_UP_FETCH: +003b02 3b03 .dw PFA_UP_FETCH + PFA_UP_FETCH: +003b03 939a +003b04 938a savetos +003b05 01c2 movw tosl, upl +003b06 ccfe jmp_ DO_NEXT + + ; ( addr -- ) + ; System Variable + ; set user area pointer + VE_UP_STORE: +003b07 ff03 .dw $ff03 +003b08 7075 +003b09 0021 .db "up!",0 +003b0a 3afe .dw VE_HEAD + .set VE_HEAD = VE_UP_STORE + XT_UP_STORE: +003b0b 3b0c .dw PFA_UP_STORE + PFA_UP_STORE: +003b0c 012c movw upl, tosl +003b0d 9189 +003b0e 9199 loadtos +003b0f ccf5 jmp_ DO_NEXT + .include "words/1ms.asm" + + ; Time + ; busy waits (almost) exactly 1 millisecond + VE_1MS: +003b10 ff03 .dw $ff03 +003b11 6d31 +003b12 0073 .db "1ms",0 +003b13 3b07 .dw VE_HEAD + .set VE_HEAD = VE_1MS + XT_1MS: +003b14 3b15 .dw PFA_1MS + PFA_1MS: +003b15 ede0 +003b16 e0f7 +003b17 9731 +003b18 f7f1 delay 1000 +003b19 cceb jmp_ DO_NEXT + .include "words/2to_r.asm" + + ; Stack + ; move DTOS to TOR + VE_2TO_R: +003b1a ff03 .dw $ff03 +003b1b 3e32 +003b1c 0072 .db "2>r",0 +003b1d 3b10 .dw VE_HEAD + .set VE_HEAD = VE_2TO_R + XT_2TO_R: +003b1e 3b1f .dw PFA_2TO_R + PFA_2TO_R: +003b1f 01fc movw zl, tosl +003b20 9189 +003b21 9199 loadtos +003b22 939f push tosh +003b23 938f push tosl +003b24 93ff push zh +003b25 93ef push zl +003b26 9189 +003b27 9199 loadtos +003b28 ccdc jmp_ DO_NEXT + .include "words/2r_from.asm" + + ; Stack + ; move DTOR to TOS + VE_2R_FROM: +003b29 ff03 .dw $ff03 +003b2a 7232 +003b2b 003e .db "2r>",0 +003b2c 3b1a .dw VE_HEAD + .set VE_HEAD = VE_2R_FROM + XT_2R_FROM: +003b2d 3b2e .dw PFA_2R_FROM + PFA_2R_FROM: +003b2e 939a +003b2f 938a savetos +003b30 91ef pop zl +003b31 91ff pop zh +003b32 918f pop tosl +003b33 919f pop tosh +003b34 939a +003b35 938a savetos +003b36 01cf movw tosl, zl +003b37 cccd jmp_ DO_NEXT + + .include "words/store-e.asm" + + ; Memory + ; write n (2bytes) to eeprom address + VE_STOREE: +003b38 ff02 .dw $ff02 +003b39 6521 .db "!e" +003b3a 3b29 .dw VE_HEAD + .set VE_HEAD = VE_STOREE + XT_STOREE: +003b3b 3b3c .dw PFA_STOREE + PFA_STOREE: + .if WANT_UNIFIED == 1 + .endif + PFA_STOREE0: +003b3c 01fc movw zl, tosl +003b3d 9189 +003b3e 9199 loadtos +003b3f b72f in_ temp2, SREG +003b40 94f8 cli +003b41 d028 rcall PFA_FETCHE2 +003b42 b30d in_ temp0, EEDR +003b43 1708 cp temp0,tosl +003b44 f009 breq PFA_STOREE3 +003b45 d00b rcall PFA_STOREE1 + PFA_STOREE3: +003b46 9631 adiw zl,1 +003b47 d022 rcall PFA_FETCHE2 +003b48 b30d in_ temp0, EEDR +003b49 1709 cp temp0,tosh +003b4a f011 breq PFA_STOREE4 +003b4b 2f89 mov tosl, tosh +003b4c d004 rcall PFA_STOREE1 + PFA_STOREE4: +003b4d bf2f out_ SREG, temp2 +003b4e 9189 +003b4f 9199 loadtos +003b50 ccb4 jmp_ DO_NEXT + + PFA_STOREE1: +003b51 99e1 sbic EECR, EEPE +003b52 cffe rjmp PFA_STOREE1 + + PFA_STOREE2: ; estore_wait_low_spm: +003b53 b707 in_ temp0, SPMCSR +003b54 fd00 sbrc temp0,SPMEN +003b55 cffd rjmp PFA_STOREE2 + +003b56 bbff out_ EEARH,zh +003b57 bbee out_ EEARL,zl +003b58 bb8d out_ EEDR, tosl +003b59 9ae2 sbi EECR,EEMPE +003b5a 9ae1 sbi EECR,EEPE + +003b5b 9508 ret + .if WANT_UNIFIED == 1 + .endif + .include "words/fetch-e.asm" + + ; Memory + ; read 1 cell from eeprom + VE_FETCHE: +003b5c ff02 .dw $ff02 +003b5d 6540 .db "@e" +003b5e 3b38 .dw VE_HEAD + .set VE_HEAD = VE_FETCHE + XT_FETCHE: +003b5f 3b60 .dw PFA_FETCHE + PFA_FETCHE: + .if WANT_UNIFIED == 1 + .endif + PFA_FETCHE1: +003b60 b72f in_ temp2, SREG +003b61 94f8 cli +003b62 01fc movw zl, tosl +003b63 d006 rcall PFA_FETCHE2 +003b64 b38d in_ tosl, EEDR + +003b65 9631 adiw zl,1 + +003b66 d003 rcall PFA_FETCHE2 +003b67 b39d in_ tosh, EEDR +003b68 bf2f out_ SREG, temp2 +003b69 cc9b jmp_ DO_NEXT + + PFA_FETCHE2: +003b6a 99e1 sbic EECR, EEPE +003b6b cffe rjmp PFA_FETCHE2 + +003b6c bbff out_ EEARH,zh +003b6d bbee out_ EEARL,zl + +003b6e 9ae0 sbi EECR,EERE +003b6f 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: +003b70 ff02 .dw $ff02 +003b71 6921 .db "!i" +003b72 3b5c .dw VE_HEAD + .set VE_HEAD = VE_STOREI + XT_STOREI: +003b73 3dff .dw PFA_DODEFER1 + PFA_STOREI: +003b74 005c .dw EE_STOREI +003b75 3da0 .dw XT_EDEFERFETCH +003b76 3daa .dw XT_EDEFERSTORE + .if FLASHEND > $10000 + .else + .include "words/store-i_nrww.asm" + + ; Memory + ; writes n to flash memory using assembly code (code to be placed in boot loader section) + VE_DO_STOREI_NRWW: +003b77 ff09 .dw $ff09 +003b78 2128 +003b79 2d69 +003b7a 726e +003b7b 7777 +003b7c 0029 .db "(!i-nrww)",0 +003b7d 3b70 .dw VE_HEAD + .set VE_HEAD = VE_DO_STOREI_NRWW + XT_DO_STOREI: +003b7e 3b7f .dw PFA_DO_STOREI_NRWW + PFA_DO_STOREI_NRWW: + ; store status register +003b7f b71f in temp1,SREG +003b80 931f push temp1 +003b81 94f8 cli + +003b82 019c movw temp2, tosl ; save the (word) address +003b83 9189 +003b84 9199 loadtos ; get the new value for the flash cell +003b85 93af push xl +003b86 93bf push xh +003b87 93cf push yl +003b88 93df push yh +003b89 d009 rcall DO_STOREI_atmega +003b8a 91df pop yh +003b8b 91cf pop yl +003b8c 91bf pop xh +003b8d 91af pop xl + ; finally clear the stack +003b8e 9189 +003b8f 9199 loadtos +003b90 911f pop temp1 + ; restore status register (and interrupt enable flag) +003b91 bf1f out SREG,temp1 + +003b92 cc72 jmp_ DO_NEXT + + ; + DO_STOREI_atmega: + ; write data to temp page buffer + ; use the values in tosl/tosh at the + ; appropiate place +003b93 d010 rcall pageload + + ; erase page if needed + ; it is needed if a bit goes from 0 to 1 +003b94 94e0 com temp4 +003b95 94f0 com temp5 +003b96 218e and tosl, temp4 +003b97 219f and tosh, temp5 +003b98 2b98 or tosh, tosl +003b99 f019 breq DO_STOREI_writepage +003b9a 01f9 movw zl, temp2 +003b9b e002 ldi temp0,(1<8000 + .elif AMFORTH_NRWW_SIZE>4000 + .include "dict/core_4k.inc" + + ; in a short distance to DO_NEXT + .include "words/n_to_r.asm" + + ; Stack + ; move n items from data stack to return stack + VE_N_TO_R: +003bd2 ff03 .dw $ff03 +003bd3 3e6e +003bd4 0072 .db "n>r",0 +003bd5 3bc8 .dw VE_HEAD + .set VE_HEAD = VE_N_TO_R + XT_N_TO_R: +003bd6 3bd7 .dw PFA_N_TO_R + PFA_N_TO_R: +003bd7 01fc movw zl, tosl +003bd8 2f08 mov temp0, tosl + PFA_N_TO_R1: +003bd9 9189 +003bda 9199 loadtos +003bdb 939f push tosh +003bdc 938f push tosl +003bdd 950a dec temp0 +003bde f7d1 brne PFA_N_TO_R1 +003bdf 93ef push zl +003be0 93ff push zh +003be1 9189 +003be2 9199 loadtos +003be3 cc21 jmp_ DO_NEXT + .include "words/n_r_from.asm" + + ; Stack + ; move n items from return stack to data stack + VE_N_R_FROM: +003be4 ff03 .dw $ff03 +003be5 726e +003be6 003e .db "nr>",0 +003be7 3bd2 .dw VE_HEAD + .set VE_HEAD = VE_N_R_FROM + XT_N_R_FROM: +003be8 3be9 .dw PFA_N_R_FROM + PFA_N_R_FROM: +003be9 939a +003bea 938a savetos +003beb 91ff pop zh +003bec 91ef pop zl +003bed 2f0e mov temp0, zl + PFA_N_R_FROM1: +003bee 918f pop tosl +003bef 919f pop tosh +003bf0 939a +003bf1 938a savetos +003bf2 950a dec temp0 +003bf3 f7d1 brne PFA_N_R_FROM1 +003bf4 01cf movw tosl, zl +003bf5 cc0f jmp_ DO_NEXT + .include "words/d-2star.asm" + + ; Arithmetics + ; shift a double cell left + VE_D2STAR: +003bf6 ff03 .dw $ff03 +003bf7 3264 +003bf8 002a .db "d2*",0 +003bf9 3be4 .dw VE_HEAD + .set VE_HEAD = VE_D2STAR + XT_D2STAR: +003bfa 3bfb .dw PFA_D2STAR + PFA_D2STAR: +003bfb 9109 ld temp0, Y+ +003bfc 9119 ld temp1, Y+ +003bfd 0f00 lsl temp0 +003bfe 1f11 rol temp1 +003bff 1f88 rol tosl +003c00 1f99 rol tosh +003c01 931a st -Y, temp1 +003c02 930a st -Y, temp0 +003c03 cc01 jmp_ DO_NEXT + .include "words/d-2slash.asm" + + ; Arithmetics + ; shift a double cell value right + VE_D2SLASH: +003c04 ff03 .dw $ff03 +003c05 3264 +003c06 002f .db "d2/",0 +003c07 3bf6 .dw VE_HEAD + .set VE_HEAD = VE_D2SLASH + XT_D2SLASH: +003c08 3c09 .dw PFA_D2SLASH + PFA_D2SLASH: +003c09 9109 ld temp0, Y+ +003c0a 9119 ld temp1, Y+ +003c0b 9595 asr tosh +003c0c 9587 ror tosl +003c0d 9517 ror temp1 +003c0e 9507 ror temp0 +003c0f 931a st -Y, temp1 +003c10 930a st -Y, temp0 +003c11 cbf3 jmp_ DO_NEXT + .include "words/d-plus.asm" + + ; Arithmetics + ; add 2 double cell values + VE_DPLUS: +003c12 ff02 .dw $ff02 +003c13 2b64 .db "d+" +003c14 3c04 .dw VE_HEAD + .set VE_HEAD = VE_DPLUS + XT_DPLUS: +003c15 3c16 .dw PFA_DPLUS + PFA_DPLUS: +003c16 9129 ld temp2, Y+ +003c17 9139 ld temp3, Y+ + +003c18 90e9 ld temp4, Y+ +003c19 90f9 ld temp5, Y+ +003c1a 9149 ld temp6, Y+ +003c1b 9159 ld temp7, Y+ + +003c1c 0f24 add temp2, temp6 +003c1d 1f35 adc temp3, temp7 +003c1e 1d8e adc tosl, temp4 +003c1f 1d9f adc tosh, temp5 + +003c20 933a st -Y, temp3 +003c21 932a st -Y, temp2 +003c22 cbe2 jmp_ DO_NEXT + .include "words/d-minus.asm" + + ; Arithmetics + ; subtract d2 from d1 + VE_DMINUS: +003c23 ff02 .dw $ff02 +003c24 2d64 .db "d-" +003c25 3c12 .dw VE_HEAD + .set VE_HEAD = VE_DMINUS + XT_DMINUS: +003c26 3c27 .dw PFA_DMINUS + PFA_DMINUS: +003c27 9129 ld temp2, Y+ +003c28 9139 ld temp3, Y+ + +003c29 90e9 ld temp4, Y+ +003c2a 90f9 ld temp5, Y+ +003c2b 9149 ld temp6, Y+ +003c2c 9159 ld temp7, Y+ + +003c2d 1b42 sub temp6, temp2 +003c2e 0b53 sbc temp7, temp3 +003c2f 0ae8 sbc temp4, tosl +003c30 0af9 sbc temp5, tosh + +003c31 935a st -Y, temp7 +003c32 934a st -Y, temp6 +003c33 01c7 movw tosl, temp4 +003c34 cbd0 jmp_ DO_NEXT + .include "words/d-invert.asm" + + ; Arithmetics + ; invert all bits in the double cell value + VE_DINVERT: +003c35 ff07 .dw $ff07 +003c36 6964 +003c37 766e +003c38 7265 +003c39 0074 .db "dinvert",0 +003c3a 3c23 .dw VE_HEAD + .set VE_HEAD = VE_DINVERT + XT_DINVERT: +003c3b 3c3c .dw PFA_DINVERT + PFA_DINVERT: +003c3c 9109 ld temp0, Y+ +003c3d 9119 ld temp1, Y+ +003c3e 9580 com tosl +003c3f 9590 com tosh +003c40 9500 com temp0 +003c41 9510 com temp1 +003c42 931a st -Y, temp1 +003c43 930a st -Y, temp0 +003c44 cbc0 jmp_ DO_NEXT + .include "words/slashmod.asm" + + ; Arithmetics + ; signed division n1/n2 with remainder and quotient + VE_SLASHMOD: +003c45 ff04 .dw $ff04 +003c46 6d2f +003c47 646f .db "/mod" +003c48 3c35 .dw VE_HEAD + .set VE_HEAD = VE_SLASHMOD + XT_SLASHMOD: +003c49 3c4a .dw PFA_SLASHMOD + PFA_SLASHMOD: +003c4a 019c movw temp2, tosl + +003c4b 9109 ld temp0, Y+ +003c4c 9119 ld temp1, Y+ + +003c4d 2f41 mov temp6,temp1 ;move dividend High to sign register +003c4e 2743 eor temp6,temp3 ;xor divisor High with sign register +003c4f ff17 sbrs temp1,7 ;if MSB in dividend set +003c50 c004 rjmp PFA_SLASHMOD_1 +003c51 9510 com temp1 ; change sign of dividend +003c52 9500 com temp0 +003c53 5f0f subi temp0,low(-1) +003c54 4f1f sbci temp1,high(-1) + PFA_SLASHMOD_1: +003c55 ff37 sbrs temp3,7 ;if MSB in divisor set +003c56 c004 rjmp PFA_SLASHMOD_2 +003c57 9530 com temp3 ; change sign of divisor +003c58 9520 com temp2 +003c59 5f2f subi temp2,low(-1) +003c5a 4f3f sbci temp3,high(-1) +003c5b 24ee PFA_SLASHMOD_2: clr temp4 ;clear remainder Low byte +003c5c 18ff sub temp5,temp5;clear remainder High byte and carry +003c5d e151 ldi temp7,17 ;init loop counter + +003c5e 1f00 PFA_SLASHMOD_3: rol temp0 ;shift left dividend +003c5f 1f11 rol temp1 +003c60 955a dec temp7 ;decrement counter +003c61 f439 brne PFA_SLASHMOD_5 ;if done +003c62 ff47 sbrs temp6,7 ; if MSB in sign register set +003c63 c004 rjmp PFA_SLASHMOD_4 +003c64 9510 com temp1 ; change sign of result +003c65 9500 com temp0 +003c66 5f0f subi temp0,low(-1) +003c67 4f1f sbci temp1,high(-1) +003c68 c00b PFA_SLASHMOD_4: rjmp PFA_SLASHMODmod_done ; return +003c69 1cee PFA_SLASHMOD_5: rol temp4 ;shift dividend into remainder +003c6a 1cff rol temp5 +003c6b 1ae2 sub temp4,temp2 ;remainder = remainder - divisor +003c6c 0af3 sbc temp5,temp3 ; +003c6d f420 brcc PFA_SLASHMOD_6 ;if result negative +003c6e 0ee2 add temp4,temp2 ; restore remainder +003c6f 1ef3 adc temp5,temp3 +003c70 9488 clc ; clear carry to be shifted into result +003c71 cfec rjmp PFA_SLASHMOD_3 ;else +003c72 9408 PFA_SLASHMOD_6: sec ; set carry to be shifted into result +003c73 cfea rjmp PFA_SLASHMOD_3 + + PFA_SLASHMODmod_done: + ; put remainder on stack +003c74 92fa st -Y,temp5 +003c75 92ea st -Y,temp4 + + ; put quotient on stack +003c76 01c8 movw tosl, temp0 +003c77 cb8d jmp_ DO_NEXT + .include "words/abs.asm" + + ; DUP ?NEGATE ; + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_ABS: +003c78 ff03 .dw $ff03 +003c79 6261 +003c7a 0073 .db "abs",0 +003c7b 3c45 .dw VE_HEAD + .set VE_HEAD = VE_ABS + XT_ABS: +003c7c 3801 .dw DO_COLON + PFA_ABS: + + .endif + +003c7d 38b1 +003c7e 3a3e +003c7f 3820 .DW XT_DUP,XT_QNEGATE,XT_EXIT + .include "words/pick.asm" + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_PICK: +003c80 ff04 .dw $ff04 +003c81 6970 +003c82 6b63 .db "pick" +003c83 3c78 .dw VE_HEAD + .set VE_HEAD = VE_PICK + XT_PICK: +003c84 3801 .dw DO_COLON + PFA_PICK: + .endif +003c85 3a2f .dw XT_1PLUS +003c86 3ec4 .dw XT_CELLS +003c87 3a8d .dw XT_SP_FETCH +003c88 399d .dw XT_PLUS +003c89 3879 .dw XT_FETCH +003c8a 3820 .dw XT_EXIT + .include "words/cellplus.asm" + + ; Arithmetics + ; add the size of an address-unit to a-addr1 + VE_CELLPLUS: +003c8b ff05 .dw $ff05 +003c8c 6563 +003c8d 6c6c +003c8e 002b .db "cell+",0 +003c8f 3c80 .dw VE_HEAD + .set VE_HEAD = VE_CELLPLUS + XT_CELLPLUS: +003c90 3c91 .dw PFA_CELLPLUS + PFA_CELLPLUS: +003c91 9602 adiw tosl, CELLSIZE +003c92 cb72 jmp_ DO_NEXT + .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: +003c93 ff04 .dw $ff04 +003c94 692b +003c95 746e .db "+int" +003c96 3c8b .dw VE_HEAD + .set VE_HEAD = VE_INTON + XT_INTON: +003c97 3c98 .dw PFA_INTON + PFA_INTON: +003c98 9478 sei +003c99 cb6b jmp_ DO_NEXT + .include "words/int-off.asm" + + ; Interrupt + ; turns off all interrupts + VE_INTOFF: +003c9a ff04 .dw $ff04 +003c9b 692d +003c9c 746e .db "-int" +003c9d 3c93 .dw VE_HEAD + .set VE_HEAD = VE_INTOFF + XT_INTOFF: +003c9e 3c9f .dw PFA_INTOFF + PFA_INTOFF: +003c9f 94f8 cli +003ca0 cb64 jmp_ DO_NEXT + .include "words/int-store.asm" + + ; Interrupt + ; stores XT as interrupt vector i + VE_INTSTORE: +003ca1 ff04 .dw $ff04 +003ca2 6e69 +003ca3 2174 .db "int!" +003ca4 3c9a .dw VE_HEAD + .set VE_HEAD = VE_INTSTORE + XT_INTSTORE: +003ca5 3801 .dw DO_COLON + PFA_INTSTORE: +003ca6 383d .dw XT_DOLITERAL +003ca7 0000 .dw intvec +003ca8 399d .dw XT_PLUS +003ca9 3b3b .dw XT_STOREE +003caa 3820 .dw XT_EXIT + .include "words/int-fetch.asm" + + ; Interrupt + ; fetches XT from interrupt vector i + VE_INTFETCH: +003cab ff04 .dw $ff04 +003cac 6e69 +003cad 4074 .db "int@" +003cae 3ca1 .dw VE_HEAD + .set VE_HEAD = VE_INTFETCH + XT_INTFETCH: +003caf 3801 .dw DO_COLON + PFA_INTFETCH: +003cb0 383d .dw XT_DOLITERAL +003cb1 0000 .dw intvec +003cb2 399d .dw XT_PLUS +003cb3 3b5f .dw XT_FETCHE +003cb4 3820 .dw XT_EXIT + .include "words/int-trap.asm" + + ; Interrupt + ; trigger an interrupt + VE_INTTRAP: +003cb5 ff08 .dw $ff08 +003cb6 6e69 +003cb7 2d74 +003cb8 7274 +003cb9 7061 .db "int-trap" +003cba 3cab .dw VE_HEAD + .set VE_HEAD = VE_INTTRAP + XT_INTTRAP: +003cbb 3cbc .dw PFA_INTTRAP + PFA_INTTRAP: +003cbc 2eb8 mov isrflag, tosl +003cbd 9189 +003cbe 9199 loadtos +003cbf cb45 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: +003cc0 3801 .dw DO_COLON + PFA_ISREXEC: +003cc1 3caf .dw XT_INTFETCH +003cc2 382a .dw XT_EXECUTE +003cc3 3cc5 .dw XT_ISREND +003cc4 3820 .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: +003cc5 3cc6 .dw PFA_ISREND + PFA_ISREND: +003cc6 d001 rcall PFA_ISREND1 ; clear the interrupt flag for the controller +003cc7 cb3d jmp_ DO_NEXT + PFA_ISREND1: +003cc8 9518 reti + .endif + + ; now the relocatable colon words + .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: +003cc9 3801 .dw DO_COLON + PFA_DEFAULT_PROMPTOK: +003cca 03c5 .dw XT_DOSLITERAL +003ccb 0003 .dw 3 +003ccc 6f20 +003ccd 006b .db " ok",0 + .endif +003cce 03f8 .dw XT_ITYPE +003ccf 3820 .dw XT_EXIT + + ; ------------------------ + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_PROMPTOK: +003cd0 ff03 .dw $FF03 +003cd1 6f2e +../../common\words/prompt-ok.asm(43): warning: .cseg .db misalignment - padding zero byte +003cd2 006b .db ".ok" +003cd3 3cb5 .dw VE_HEAD + .set VE_HEAD = VE_PROMPTOK + XT_PROMPTOK: +003cd4 3dff .dw PFA_DODEFER1 + PFA_PROMPTOK: + .endif +003cd5 001c .dw USER_P_OK +003cd6 3dc8 .dw XT_UDEFERFETCH +003cd7 3dd4 .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: +003cd8 3801 .dw DO_COLON + PFA_DEFAULT_PROMPTREADY: +003cd9 03c5 .dw XT_DOSLITERAL +003cda 0002 .dw 2 +003cdb 203e .db "> " + .endif +003cdc 3fa1 .dw XT_CR +003cdd 03f8 .dw XT_ITYPE +003cde 3820 .dw XT_EXIT + + ; ------------------------ + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_PROMPTREADY: +003cdf ff06 .dw $FF06 +003ce0 722e +003ce1 6165 +003ce2 7964 .db ".ready" +003ce3 3cd0 .dw VE_HEAD + .set VE_HEAD = VE_PROMPTREADY + XT_PROMPTREADY: +003ce4 3dff .dw PFA_DODEFER1 + PFA_PROMPTREADY: + .endif +003ce5 0020 .dw USER_P_RDY +003ce6 3dc8 .dw XT_UDEFERFETCH +003ce7 3dd4 .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: +003ce8 3801 .dw DO_COLON + PFA_DEFAULT_PROMPTERROR: +003ce9 03c5 .dw XT_DOSLITERAL +003cea 0004 .dw 4 +003ceb 3f20 +003cec 203f .db " ?? " + .endif +003ced 03f8 .dw XT_ITYPE +003cee 3ebd .dw XT_BASE +003cef 3879 .dw XT_FETCH +003cf0 38ff .dw XT_TO_R +003cf1 3f41 .dw XT_DECIMAL +003cf2 037a .dw XT_DOT +003cf3 3ee2 .dw XT_TO_IN +003cf4 3879 .dw XT_FETCH +003cf5 037a .dw XT_DOT +003cf6 38f6 .dw XT_R_FROM +003cf7 3ebd .dw XT_BASE +003cf8 3881 .dw XT_STORE +003cf9 3820 .dw XT_EXIT + + ; ------------------------ + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_PROMPTERROR: +003cfa ff06 .dw $FF06 +003cfb 652e +003cfc 7272 +003cfd 726f .db ".error" +003cfe 3cdf .dw VE_HEAD + .set VE_HEAD = VE_PROMPTERROR + XT_PROMPTERROR: +003cff 3dff .dw PFA_DODEFER1 + PFA_PROMPTERROR: + .endif +003d00 001e .dw USER_P_ERR +003d01 3dc8 .dw XT_UDEFERFETCH +003d02 3dd4 .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: +003d03 ff04 .dw $ff04 +003d04 7571 +003d05 7469 .db "quit" +003d06 3cfa .dw VE_HEAD + .set VE_HEAD = VE_QUIT + XT_QUIT: +003d07 3801 .dw DO_COLON + .endif + PFA_QUIT: +003d08 0851 +003d09 0858 +003d0a 3881 .dw XT_LP0,XT_LP,XT_STORE +003d0b 05ca .dw XT_SP0 +003d0c 3a96 .dw XT_SP_STORE +003d0d 05d7 .dw XT_RP0 +003d0e 3a80 .dw XT_RP_STORE +003d0f 08e6 .dw XT_LBRACKET + + PFA_QUIT2: +003d10 3eb7 .dw XT_STATE +003d11 3879 .dw XT_FETCH +003d12 391a .dw XT_ZEROEQUAL +003d13 3836 .dw XT_DOCONDBRANCH +003d14 3d16 DEST(PFA_QUIT4) +003d15 3ce4 .dw XT_PROMPTREADY + PFA_QUIT4: +003d16 04de .dw XT_REFILL +003d17 3836 .dw XT_DOCONDBRANCH +003d18 3d28 DEST(PFA_QUIT3) +003d19 383d .dw XT_DOLITERAL +003d1a 0625 .dw XT_INTERPRET +003d1b 3d70 .dw XT_CATCH +003d1c 38b9 .dw XT_QDUP +003d1d 3836 .dw XT_DOCONDBRANCH +003d1e 3d28 DEST(PFA_QUIT3) +003d1f 38b1 .dw XT_DUP +003d20 383d .dw XT_DOLITERAL +003d21 fffe .dw -2 +003d22 396e .dw XT_LESS +003d23 3836 .dw XT_DOCONDBRANCH +003d24 3d26 DEST(PFA_QUIT5) +003d25 3cff .dw XT_PROMPTERROR + PFA_QUIT5: +003d26 382f .dw XT_DOBRANCH +003d27 3d08 DEST(PFA_QUIT) + PFA_QUIT3: +003d28 3cd4 .dw XT_PROMPTOK +003d29 382f .dw XT_DOBRANCH +003d2a 3d10 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: +003d2b ff05 .dw $ff05 +003d2c 6170 +003d2d 7375 +003d2e 0065 .db "pause",0 +003d2f 3d03 .dw VE_HEAD + .set VE_HEAD = VE_PAUSE + XT_PAUSE: +003d30 3dff .dw PFA_DODEFER1 + PFA_PAUSE: +003d31 00ed .dw ram_pause +003d32 3db4 .dw XT_RDEFERFETCH +003d33 3dbe .dw XT_RDEFERSTORE + + .dseg +0000ed ram_pause: .byte 2 + .cseg + .include "words/cold.asm" + + ; System + ; start up amforth. + VE_COLD: +003d34 ff04 .dw $ff04 +003d35 6f63 +003d36 646c .db "cold" +003d37 3d2b .dw VE_HEAD + .set VE_HEAD = VE_COLD + XT_COLD: +003d38 3d39 .dw PFA_COLD + PFA_COLD: +003d39 b6a4 in_ mcu_boot, MCUSR +003d3a 2422 clr zerol +003d3b 2433 clr zeroh +003d3c 24bb clr isrflag +003d3d be24 out_ MCUSR, zerol + ; clear RAM +003d3e e6e0 ldi zl, low(ramstart) +003d3f e0f0 ldi zh, high(ramstart) + clearloop: +003d40 9221 st Z+, zerol +003d41 36e0 cpi zl, low(sram_size+ramstart) +003d42 f7e9 brne clearloop +003d43 30f8 cpi zh, high(sram_size+ramstart) +003d44 f7d9 brne clearloop + ; init first user data area + ; allocate space for User Area + .dseg +0000ef ram_user1: .byte SYSUSERSIZE + APPUSERSIZE + .cseg +003d45 eeef ldi zl, low(ram_user1) +003d46 e0f0 ldi zh, high(ram_user1) +003d47 012f movw upl, zl + ; init return stack pointer +003d48 e50f ldi temp0,low(rstackstart) +003d49 bf0d out_ SPL,temp0 +003d4a 8304 std Z+4, temp0 +003d4b e018 ldi temp1,high(rstackstart) +003d4c bf1e out_ SPH,temp1 +003d4d 8315 std Z+5, temp1 + + ; init parameter stack pointer +003d4e e0cf ldi yl,low(stackstart) +003d4f 83c6 std Z+6, yl +003d50 e0d8 ldi yh,high(stackstart) +003d51 83d7 std Z+7, yh + + ; load Forth IP with starting word +003d52 e5aa ldi XL, low(PFA_WARM) +003d53 e3bd ldi XH, high(PFA_WARM) + ; its a far jump... +003d54 cab0 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: +003d55 ff04 .dw $ff04 +003d56 6177 +003d57 6d72 .db "warm" +003d58 3d34 .dw VE_HEAD + .set VE_HEAD = VE_WARM + XT_WARM: +003d59 3801 .dw DO_COLON + PFA_WARM: + .endif +003d5a 0297 .dw XT_INIT_RAM +003d5b 383d .dw XT_DOLITERAL +003d5c 019a .dw XT_NOOP +003d5d 383d .dw XT_DOLITERAL +003d5e 3d30 .dw XT_PAUSE +003d5f 3ddf .dw XT_DEFERSTORE +003d60 08e6 .dw XT_LBRACKET +003d61 3f5c .dw XT_TURNKEY +003d62 3d07 .dw XT_QUIT ; never returns + + .include "words/handler.asm" + + ; Exceptions + ; USER variable used by catch/throw + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_HANDLER: +003d63 ff07 .dw $ff07 +003d64 6168 +003d65 646e +003d66 656c +003d67 0072 .db "handler",0 +003d68 3d55 .dw VE_HEAD + .set VE_HEAD = VE_HANDLER + XT_HANDLER: +003d69 3858 .dw PFA_DOUSER + PFA_HANDLER: + .endif +003d6a 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: +003d6b ff05 .dw $ff05 +003d6c 6163 +003d6d 6374 +003d6e 0068 .db "catch",0 +003d6f 3d63 .dw VE_HEAD + .set VE_HEAD = VE_CATCH + XT_CATCH: +003d70 3801 .dw DO_COLON + PFA_CATCH: + .endif + + ; sp@ >r +003d71 3a8d .dw XT_SP_FETCH +003d72 38ff .dw XT_TO_R + ; handler @ >r +003d73 3d69 .dw XT_HANDLER +003d74 3879 .dw XT_FETCH +003d75 38ff .dw XT_TO_R + ; rp@ handler ! +003d76 3a76 .dw XT_RP_FETCH +003d77 3d69 .dw XT_HANDLER +003d78 3881 .dw XT_STORE +003d79 382a .dw XT_EXECUTE + ; r> handler ! +003d7a 38f6 .dw XT_R_FROM +003d7b 3d69 .dw XT_HANDLER +003d7c 3881 .dw XT_STORE +003d7d 38f6 .dw XT_R_FROM +003d7e 38d9 .dw XT_DROP +003d7f 3954 .dw XT_ZERO +003d80 3820 .dw XT_EXIT + .include "words/throw.asm" + + ; Exceptions + ; throw an exception + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_THROW: +003d81 ff05 .dw $ff05 +003d82 6874 +003d83 6f72 +003d84 0077 .db "throw",0 +003d85 3d6b .dw VE_HEAD + .set VE_HEAD = VE_THROW + XT_THROW: +003d86 3801 .dw DO_COLON + PFA_THROW: + .endif +003d87 38b1 .dw XT_DUP +003d88 391a .dw XT_ZEROEQUAL +003d89 3836 .dw XT_DOCONDBRANCH +003d8a 3d8d DEST(PFA_THROW1) +003d8b 38d9 .dw XT_DROP +003d8c 3820 .dw XT_EXIT + PFA_THROW1: +003d8d 3d69 .dw XT_HANDLER +003d8e 3879 .dw XT_FETCH +003d8f 3a80 .dw XT_RP_STORE +003d90 38f6 .dw XT_R_FROM +003d91 3d69 .dw XT_HANDLER +003d92 3881 .dw XT_STORE +003d93 38f6 .dw XT_R_FROM +003d94 38c4 .dw XT_SWAP +003d95 38ff .dw XT_TO_R +003d96 3a96 .dw XT_SP_STORE +003d97 38d9 .dw XT_DROP +003d98 38f6 .dw XT_R_FROM +003d99 3820 .dw XT_EXIT + + + + .include "words/edefer-fetch.asm" + + ; System + ; does the real defer@ for eeprom defers + VE_EDEFERFETCH: +003d9a ff07 .dw $ff07 +003d9b 6445 +003d9c 6665 +003d9d 7265 +003d9e 0040 .db "Edefer@",0 +003d9f 3d81 .dw VE_HEAD + .set VE_HEAD = VE_EDEFERFETCH + XT_EDEFERFETCH: +003da0 3801 .dw DO_COLON + PFA_EDEFERFETCH: +003da1 3bcb .dw XT_FETCHI +003da2 3b5f .dw XT_FETCHE +003da3 3820 .dw XT_EXIT + .include "words/edefer-store.asm" + + ; System + ; does the real defer! for eeprom defers + VE_EDEFERSTORE: +003da4 ff07 .dw $ff07 +003da5 6445 +003da6 6665 +003da7 7265 +003da8 0021 .db "Edefer!",0 +003da9 3d9a .dw VE_HEAD + .set VE_HEAD = VE_EDEFERSTORE + XT_EDEFERSTORE: +003daa 3801 .dw DO_COLON + PFA_EDEFERSTORE: +003dab 3bcb .dw XT_FETCHI +003dac 3b3b .dw XT_STOREE +003dad 3820 .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: +003dae ff07 .dw $ff07 +003daf 6452 +003db0 6665 +003db1 7265 +003db2 0040 .db "Rdefer@",0 +003db3 3da4 .dw VE_HEAD + .set VE_HEAD = VE_RDEFERFETCH + XT_RDEFERFETCH: +003db4 3801 .dw DO_COLON + PFA_RDEFERFETCH: + .endif +003db5 3bcb .dw XT_FETCHI +003db6 3879 .dw XT_FETCH +003db7 3820 .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: +003db8 ff07 .dw $ff07 +003db9 6452 +003dba 6665 +003dbb 7265 +003dbc 0021 .db "Rdefer!",0 +003dbd 3dae .dw VE_HEAD + .set VE_HEAD = VE_RDEFERSTORE + XT_RDEFERSTORE: +003dbe 3801 .dw DO_COLON + PFA_RDEFERSTORE: + .endif +003dbf 3bcb .dw XT_FETCHI +003dc0 3881 .dw XT_STORE +003dc1 3820 .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: +003dc2 ff07 .dw $ff07 +003dc3 6455 +003dc4 6665 +003dc5 7265 +003dc6 0040 .db "Udefer@",0 +003dc7 3db8 .dw VE_HEAD + .set VE_HEAD = VE_UDEFERFETCH + XT_UDEFERFETCH: +003dc8 3801 .dw DO_COLON + PFA_UDEFERFETCH: + .endif +003dc9 3bcb .dw XT_FETCHI +003dca 3b02 .dw XT_UP_FETCH +003dcb 399d .dw XT_PLUS +003dcc 3879 .dw XT_FETCH +003dcd 3820 .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: +003dce ff07 .dw $ff07 +003dcf 6455 +003dd0 6665 +003dd1 7265 +003dd2 0021 .db "Udefer!",0 +003dd3 3dc2 .dw VE_HEAD + .set VE_HEAD = VE_UDEFERSTORE + XT_UDEFERSTORE: +003dd4 3801 .dw DO_COLON + PFA_UDEFERSTORE: + .endif + +003dd5 3bcb .dw XT_FETCHI +003dd6 3b02 .dw XT_UP_FETCH +003dd7 399d .dw XT_PLUS +003dd8 3881 .dw XT_STORE +003dd9 3820 .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: +003dda ff06 .dw $ff06 +003ddb 6564 +003ddc 6566 +003ddd 2172 .db "defer!" +003dde 3dce .dw VE_HEAD + .set VE_HEAD = VE_DEFERSTORE + XT_DEFERSTORE: +003ddf 3801 .dw DO_COLON + PFA_DEFERSTORE: + .endif +003de0 3fd0 .dw XT_TO_BODY +003de1 38b1 .dw XT_DUP +003de2 01c6 .dw XT_ICELLPLUS +003de3 01c6 .dw XT_ICELLPLUS +003de4 3bcb .dw XT_FETCHI +003de5 382a .dw XT_EXECUTE +003de6 3820 .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: +003de7 ff06 .dw $ff06 +003de8 6564 +003de9 6566 +003dea 4072 .db "defer@" +003deb 3dda .dw VE_HEAD + .set VE_HEAD = VE_DEFERFETCH + XT_DEFERFETCH: +003dec 3801 .dw DO_COLON + PFA_DEFERFETCH: + .endif +003ded 3fd0 .dw XT_TO_BODY +003dee 38b1 .dw XT_DUP +003def 01c6 .dw XT_ICELLPLUS +003df0 3bcb .dw XT_FETCHI +003df1 382a .dw XT_EXECUTE +003df2 3820 .dw XT_EXIT + .include "words/do-defer.asm" + + ; System + ; runtime of defer + VE_DODEFER: +003df3 ff07 .dw $ff07 +003df4 6428 +003df5 6665 +003df6 7265 +003df7 0029 .db "(defer)", 0 +003df8 3de7 .dw VE_HEAD + .set VE_HEAD = VE_DODEFER + XT_DODEFER: +003df9 3801 .dw DO_COLON + PFA_DODEFER: +003dfa 072e .dw XT_DOCREATE +003dfb 088e .dw XT_REVEAL +003dfc 0751 .dw XT_COMPILE +003dfd 3dff .dw PFA_DODEFER1 +003dfe 3820 .dw XT_EXIT + PFA_DODEFER1: +003dff 940e 08a7 call_ DO_DODOES +003e01 38b1 .dw XT_DUP +003e02 01c6 .dw XT_ICELLPLUS +003e03 3bcb .dw XT_FETCHI +003e04 382a .dw XT_EXECUTE +003e05 382a .dw XT_EXECUTE +003e06 3820 .dw XT_EXIT + + ; : (defer) dup i-cell+ @i execute execute ; + + + .include "words/u-dot.asm" + + ; Numeric IO + ; unsigned PNO with single cell numbers + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_UDOT: +003e07 ff02 .dw $ff02 +003e08 2e75 .db "u." +003e09 3df3 .dw VE_HEAD + .set VE_HEAD = VE_UDOT + XT_UDOT: +003e0a 3801 .dw DO_COLON + PFA_UDOT: + .endif +003e0b 3954 .dw XT_ZERO +003e0c 0382 .dw XT_UDDOT +003e0d 3820 .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: +003e0e ff03 .dw $ff03 +003e0f 2e75 +003e10 0072 .db "u.r",0 +003e11 3e07 .dw VE_HEAD + .set VE_HEAD = VE_UDOTR + XT_UDOTR: +003e12 3801 .dw DO_COLON + PFA_UDOTR: + .endif +003e13 3954 .dw XT_ZERO +003e14 38c4 .dw XT_SWAP +003e15 038b .dw XT_UDDOTR +003e16 3820 .dw XT_EXIT + ; : u.r ( s n -- ) 0 swap ud.r ; + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;; + .include "words/uslashmod.asm" + + ; Arithmetics + ; unsigned division with remainder + VE_USLASHMOD: +003e17 ff05 .dw $ff05 +003e18 2f75 +003e19 6f6d +003e1a 0064 .db "u/mod",0 +003e1b 3e0e .dw VE_HEAD + .set VE_HEAD = VE_USLASHMOD + XT_USLASHMOD: +003e1c 3801 .dw DO_COLON + PFA_USLASHMOD: +003e1d 38ff .dw XT_TO_R +003e1e 3954 .dw XT_ZERO +003e1f 38f6 .dw XT_R_FROM +003e20 39c2 .dw XT_UMSLASHMOD +003e21 3820 .dw XT_EXIT + .include "words/negate.asm" + + ; Logic + ; 2-complement + VE_NEGATE: +003e22 ff06 .dw $ff06 +003e23 656e +003e24 6167 +003e25 6574 .db "negate" +003e26 3e17 .dw VE_HEAD + .set VE_HEAD = VE_NEGATE + XT_NEGATE: +003e27 3801 .dw DO_COLON + PFA_NEGATE: +003e28 39fd .dw XT_INVERT +003e29 3a2f .dw XT_1PLUS +003e2a 3820 .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: +003e2b ff01 .dw $ff01 +003e2c 002f .db "/",0 +003e2d 3e22 .dw VE_HEAD + .set VE_HEAD = VE_SLASH + XT_SLASH: +003e2e 3801 .dw DO_COLON + PFA_SLASH: + .endif +003e2f 3c49 .dw XT_SLASHMOD +003e30 38f0 .dw XT_NIP +003e31 3820 .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: +003e32 ff03 .dw $ff03 +003e33 6f6d +003e34 0064 .db "mod",0 +003e35 3e2b .dw VE_HEAD + .set VE_HEAD = VE_MOD + XT_MOD: +003e36 3801 .dw DO_COLON + PFA_MOD: + .endif +003e37 3c49 .dw XT_SLASHMOD +003e38 38d9 .dw XT_DROP +003e39 3820 .dw 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: +003e3a ff03 .dw $ff03 +003e3b 696d +003e3c 006e .db "min",0 +003e3d 3e32 .dw VE_HEAD + .set VE_HEAD = VE_MIN + XT_MIN: +003e3e 3801 .dw DO_COLON + PFA_MIN: + .endif +003e3f 3ec9 .dw XT_2DUP +003e40 3978 .dw XT_GREATER +003e41 3836 .dw XT_DOCONDBRANCH +003e42 3e44 DEST(PFA_MIN1) +003e43 38c4 .dw XT_SWAP + PFA_MIN1: +003e44 38d9 .dw XT_DROP +003e45 3820 .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: +003e46 ff03 .dw $ff03 +003e47 616d +003e48 0078 .db "max",0 +003e49 3e3a .dw VE_HEAD + .set VE_HEAD = VE_MAX + XT_MAX: +003e4a 3801 .dw DO_COLON + PFA_MAX: + + .endif +003e4b 3ec9 .dw XT_2DUP +003e4c 396e .dw XT_LESS +003e4d 3836 .dw XT_DOCONDBRANCH +003e4e 3e50 DEST(PFA_MAX1) +003e4f 38c4 .dw XT_SWAP + PFA_MAX1: +003e50 38d9 .dw XT_DROP +003e51 3820 .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: +003e52 ff06 .dw $ff06 +003e53 6977 +003e54 6874 +003e55 6e69 .db "within" +003e56 3e46 .dw VE_HEAD + .set VE_HEAD = VE_WITHIN + XT_WITHIN: +003e57 3801 .dw DO_COLON + PFA_WITHIN: + .endif +003e58 38cf .dw XT_OVER +003e59 3993 .dw XT_MINUS +003e5a 38ff .dw XT_TO_R +003e5b 3993 .dw XT_MINUS +003e5c 38f6 .dw XT_R_FROM +003e5d 395c .dw XT_ULESS +003e5e 3820 .dw XT_EXIT + + .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: +003e5f ff0d .dw $ff0d +003e60 6873 +003e61 776f +003e62 772d +003e63 726f +003e64 6c64 +003e65 7369 +003e66 0074 .db "show-wordlist",0 +003e67 3e52 .dw VE_HEAD + .set VE_HEAD = VE_SHOWWORDLIST + XT_SHOWWORDLIST: +003e68 3801 .dw DO_COLON + PFA_SHOWWORDLIST: + .endif +003e69 383d .dw XT_DOLITERAL +003e6a 3e6e .dw XT_SHOWWORD +003e6b 38c4 .dw XT_SWAP +003e6c 06cf .dw XT_TRAVERSEWORDLIST +003e6d 3820 .dw XT_EXIT + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + XT_SHOWWORD: +003e6e 3801 .dw DO_COLON + PFA_SHOWWORD: + .endif +003e6f 06ea .dw XT_NAME2STRING +003e70 03f8 .dw XT_ITYPE +003e71 3fae .dw XT_SPACE ; ( -- addr n) +003e72 394b .dw XT_TRUE +003e73 3820 .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: +003e74 ff05 .dw $ff05 +003e75 6f77 +003e76 6472 +003e77 0073 .db "words",0 +003e78 3e5f .dw VE_HEAD + .set VE_HEAD = VE_WORDS + XT_WORDS: +003e79 3801 .dw DO_COLON + PFA_WORDS: + .endif +003e7a 383d .dw XT_DOLITERAL +003e7b 0042 .dw CFG_ORDERLISTLEN+2 +003e7c 3b5f .dw XT_FETCHE +003e7d 3e68 .dw XT_SHOWWORDLIST +003e7e 3820 .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: +003e7f 0002 .dw $0002 +003e80 222e .db ".",$22 +003e81 3e74 .dw VE_HEAD + .set VE_HEAD = VE_DOTSTRING + XT_DOTSTRING: +003e82 3801 .dw DO_COLON + PFA_DOTSTRING: + .endif +003e83 3e8a .dw XT_SQUOTE +003e84 0751 .dw XT_COMPILE +003e85 03f8 .dw XT_ITYPE +003e86 3820 .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: +003e87 0002 .dw $0002 +003e88 2273 .db "s",$22 +003e89 3e7f .dw VE_HEAD + .set VE_HEAD = VE_SQUOTE + XT_SQUOTE: +003e8a 3801 .dw DO_COLON + PFA_SQUOTE: + .endif +003e8b 383d .dw XT_DOLITERAL +003e8c 0022 .dw 34 ; 0x22 +003e8d 0583 .dw XT_PARSE ; ( -- addr n) +003e8e 3eb7 .dw XT_STATE +003e8f 3879 .dw XT_FETCH +003e90 3836 .dw XT_DOCONDBRANCH +003e91 3e93 DEST(PFA_SQUOTE1) +003e92 077d .dw XT_SLITERAL + PFA_SQUOTE1: +003e93 3820 .dw XT_EXIT + .include "words/fill.asm" + + ; Memory + ; fill u bytes memory beginning at a-addr with character c + VE_FILL: +003e94 ff04 .dw $ff04 +003e95 6966 +003e96 6c6c .db "fill" +003e97 3e87 .dw VE_HEAD + .set VE_HEAD = VE_FILL + XT_FILL: +003e98 3801 .dw DO_COLON + PFA_FILL: +003e99 38e1 .dw XT_ROT +003e9a 38e1 .dw XT_ROT +003e9b 38b9 +003e9c 3836 .dw XT_QDUP,XT_DOCONDBRANCH +003e9d 3ea5 DEST(PFA_FILL2) +003e9e 3f99 .dw XT_BOUNDS +003e9f 3a9b .dw XT_DODO + PFA_FILL1: +003ea0 38b1 .dw XT_DUP +003ea1 3aac .dw XT_I +003ea2 388d .dw XT_CSTORE ; ( -- c c-addr) +003ea3 3ac9 .dw XT_DOLOOP +003ea4 3ea0 .dw PFA_FILL1 + PFA_FILL2: +003ea5 38d9 .dw XT_DROP +003ea6 3820 .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: +003ea7 ff05 .dw $ff05 +003ea8 5f66 +003ea9 7063 +003eaa 0075 .db "f_cpu",0 +003eab 3e94 .dw VE_HEAD + .set VE_HEAD = VE_F_CPU + XT_F_CPU: +003eac 3801 .dw DO_COLON + PFA_F_CPU: + .endif +003ead 383d .dw XT_DOLITERAL +003eae 1200 .dw (F_CPU % 65536) +003eaf 383d .dw XT_DOLITERAL +003eb0 007a .dw (F_CPU / 65536) +003eb1 3820 .dw XT_EXIT + .include "words/state.asm" + + ; System Variable + ; system state + VE_STATE: +003eb2 ff05 .dw $ff05 +003eb3 7473 +003eb4 7461 +003eb5 0065 .db "state",0 +003eb6 3ea7 .dw VE_HEAD + .set VE_HEAD = VE_STATE + XT_STATE: +003eb7 3848 .dw PFA_DOVARIABLE + PFA_STATE: +003eb8 011b .dw ram_state + + .dseg +00011b 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: +003eb9 ff04 .dw $ff04 +003eba 6162 +003ebb 6573 .db "base" +003ebc 3eb2 .dw VE_HEAD + .set VE_HEAD = VE_BASE + XT_BASE: +003ebd 3858 .dw PFA_DOUSER + PFA_BASE: + .endif +003ebe 000c .dw USER_BASE + + .include "words/cells.asm" + + ; Arithmetics + ; n2 is the size in address units of n1 cells + VE_CELLS: +003ebf ff05 .dw $ff05 +003ec0 6563 +003ec1 6c6c +003ec2 0073 .db "cells",0 +003ec3 3eb9 .dw VE_HEAD + .set VE_HEAD = VE_CELLS + XT_CELLS: +003ec4 3a0c .dw PFA_2STAR + + .include "words/2dup.asm" + + ; Stack + ; Duplicate the 2 top elements + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_2DUP: +003ec5 ff04 .dw $ff04 +003ec6 6432 +003ec7 7075 .db "2dup" +003ec8 3ebf .dw VE_HEAD + .set VE_HEAD = VE_2DUP + XT_2DUP: +003ec9 3801 .dw DO_COLON + PFA_2DUP: + .endif + +003eca 38cf .dw XT_OVER +003ecb 38cf .dw XT_OVER +003ecc 3820 .dw XT_EXIT + .include "words/2drop.asm" + + ; Stack + ; Remove the 2 top elements + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_2DROP: +003ecd ff05 .dw $ff05 +003ece 6432 +003ecf 6f72 +003ed0 0070 .db "2drop",0 +003ed1 3ec5 .dw VE_HEAD + .set VE_HEAD = VE_2DROP + XT_2DROP: +003ed2 3801 .dw DO_COLON + PFA_2DROP: + .endif +003ed3 38d9 .dw XT_DROP +003ed4 38d9 .dw XT_DROP +003ed5 3820 .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: +003ed6 ff04 .dw $ff04 +003ed7 7574 +003ed8 6b63 .db "tuck" +003ed9 3ecd .dw VE_HEAD + .set VE_HEAD = VE_TUCK + XT_TUCK: +003eda 3801 .dw DO_COLON + PFA_TUCK: + .endif +003edb 38c4 .dw XT_SWAP +003edc 38cf .dw XT_OVER +003edd 3820 .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: +003ede ff03 .dw $ff03 +003edf 693e +003ee0 006e .db ">in",0 +003ee1 3ed6 .dw VE_HEAD + .set VE_HEAD = VE_TO_IN + XT_TO_IN: +003ee2 3858 .dw PFA_DOUSER + PFA_TO_IN: + .endif +003ee3 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: +003ee4 ff03 .dw $ff03 +003ee5 6170 +003ee6 0064 .db "pad",0 +003ee7 3ede .dw VE_HEAD + .set VE_HEAD = VE_PAD + XT_PAD: +003ee8 3801 .dw DO_COLON + PFA_PAD: + .endif +003ee9 3f23 .dw XT_HERE +003eea 383d .dw XT_DOLITERAL +003eeb 0028 .dw 40 +003eec 399d .dw XT_PLUS +003eed 3820 .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: +003eee ff04 .dw $ff04 +003eef 6d65 +003ef0 7469 .db "emit" +003ef1 3ee4 .dw VE_HEAD + .set VE_HEAD = VE_EMIT + XT_EMIT: +003ef2 3dff .dw PFA_DODEFER1 + PFA_EMIT: + .endif +003ef3 000e .dw USER_EMIT +003ef4 3dc8 .dw XT_UDEFERFETCH +003ef5 3dd4 .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: +003ef6 ff05 .dw $ff05 +003ef7 6d65 +003ef8 7469 +003ef9 003f .db "emit?",0 +003efa 3eee .dw VE_HEAD + .set VE_HEAD = VE_EMITQ + XT_EMITQ: +003efb 3dff .dw PFA_DODEFER1 + PFA_EMITQ: + .endif +003efc 0010 .dw USER_EMITQ +003efd 3dc8 .dw XT_UDEFERFETCH +003efe 3dd4 .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: +003eff ff03 .dw $ff03 +003f00 656b +003f01 0079 .db "key",0 +003f02 3ef6 .dw VE_HEAD + .set VE_HEAD = VE_KEY + XT_KEY: +003f03 3dff .dw PFA_DODEFER1 + PFA_KEY: + .endif +003f04 0012 .dw USER_KEY +003f05 3dc8 .dw XT_UDEFERFETCH +003f06 3dd4 .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: +003f07 ff04 .dw $ff04 +003f08 656b +003f09 3f79 .db "key?" +003f0a 3eff .dw VE_HEAD + .set VE_HEAD = VE_KEYQ + XT_KEYQ: +003f0b 3dff .dw PFA_DODEFER1 + PFA_KEYQ: + .endif +003f0c 0014 .dw USER_KEYQ +003f0d 3dc8 .dw XT_UDEFERFETCH +003f0e 3dd4 .dw XT_UDEFERSTORE + + .include "words/dp.asm" + + ; System Value + ; address of the next free dictionary cell + VE_DP: +003f0f ff02 .dw $ff02 +003f10 7064 .db "dp" +003f11 3f07 .dw VE_HEAD + .set VE_HEAD = VE_DP + XT_DP: +003f12 386f .dw PFA_DOVALUE1 + PFA_DP: +003f13 002c .dw CFG_DP +003f14 3da0 .dw XT_EDEFERFETCH +003f15 3daa .dw XT_EDEFERSTORE + .include "words/ehere.asm" + + ; System Value + ; address of the next free address in eeprom + VE_EHERE: +003f16 ff05 .dw $ff05 +003f17 6865 +003f18 7265 +003f19 0065 .db "ehere",0 +003f1a 3f0f .dw VE_HEAD + .set VE_HEAD = VE_EHERE + XT_EHERE: +003f1b 386f .dw PFA_DOVALUE1 + PFA_EHERE: +003f1c 0030 .dw EE_EHERE +003f1d 3da0 .dw XT_EDEFERFETCH +003f1e 3daa .dw XT_EDEFERSTORE + .include "words/here.asm" + + ; System Value + ; address of the next free data space (RAM) cell + VE_HERE: +003f1f ff04 .dw $ff04 +003f20 6568 +003f21 6572 .db "here" +003f22 3f16 .dw VE_HEAD + .set VE_HEAD = VE_HERE + XT_HERE: +003f23 386f .dw PFA_DOVALUE1 + PFA_HERE: +003f24 002e .dw EE_HERE +003f25 3da0 .dw XT_EDEFERFETCH +003f26 3daa .dw XT_EDEFERSTORE + .include "words/allot.asm" + + ; System + ; allocate or release memory in RAM + VE_ALLOT: +003f27 ff05 .dw $ff05 +003f28 6c61 +003f29 6f6c +003f2a 0074 .db "allot",0 +003f2b 3f1f .dw VE_HEAD + .set VE_HEAD = VE_ALLOT + XT_ALLOT: +003f2c 3801 .dw DO_COLON + PFA_ALLOT: +003f2d 3f23 .dw XT_HERE +003f2e 399d .dw XT_PLUS +003f2f 01b4 .dw XT_DOTO +003f30 3f24 .dw PFA_HERE +003f31 3820 .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: +003f32 ff03 .dw $ff03 +003f33 6962 +003f34 006e .db "bin",0 +003f35 3f27 .dw VE_HEAD + .set VE_HEAD = VE_BIN + XT_BIN: +003f36 3801 .dw DO_COLON + PFA_BIN: + .endif +003f37 3feb .dw XT_TWO +003f38 3ebd .dw XT_BASE +003f39 3881 .dw XT_STORE +003f3a 3820 .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: +003f3b ff07 .dw $ff07 +003f3c 6564 +003f3d 6963 +003f3e 616d +003f3f 006c .db "decimal",0 +003f40 3f32 .dw VE_HEAD + .set VE_HEAD = VE_DECIMAL + XT_DECIMAL: +003f41 3801 .dw DO_COLON + PFA_DECIMAL: + .endif +003f42 383d .dw XT_DOLITERAL +003f43 000a .dw 10 +003f44 3ebd .dw XT_BASE +003f45 3881 .dw XT_STORE +003f46 3820 .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: +003f47 ff03 .dw $ff03 +003f48 6568 +003f49 0078 .db "hex",0 +003f4a 3f3b .dw VE_HEAD + .set VE_HEAD = VE_HEX + XT_HEX: +003f4b 3801 .dw DO_COLON + PFA_HEX: + .endif +003f4c 383d .dw XT_DOLITERAL +003f4d 0010 .dw 16 +003f4e 3ebd .dw XT_BASE +003f4f 3881 .dw XT_STORE +003f50 3820 .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: +003f51 ff02 .dw $ff02 +003f52 6c62 .db "bl" +003f53 3f47 .dw VE_HEAD + .set VE_HEAD = VE_BL + XT_BL: +003f54 3848 .dw PFA_DOVARIABLE + PFA_BL: + .endif +003f55 0020 .dw 32 + + .include "words/turnkey.asm" + + ; System Value + ; Deferred action during startup/reset + VE_TURNKEY: +003f56 ff07 .dw $ff07 +003f57 7574 +003f58 6e72 +003f59 656b +003f5a 0079 .db "turnkey",0 +003f5b 3f51 .dw VE_HEAD + .set VE_HEAD = VE_TURNKEY + XT_TURNKEY: +003f5c 3dff .dw PFA_DODEFER1 + PFA_TURNKEY: +003f5d 0038 .dw CFG_TURNKEY +003f5e 3da0 .dw XT_EDEFERFETCH +003f5f 3daa .dw XT_EDEFERSTORE + .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: +003f60 ff07 .dw $ff07 +003f61 6f74 +003f62 7075 +003f63 6570 +003f64 0072 .db "toupper",0 +003f65 3f56 .dw VE_HEAD + .set VE_HEAD = VE_TOUPPER + XT_TOUPPER: +003f66 3801 .dw DO_COLON + PFA_TOUPPER: + .endif +003f67 38b1 .dw XT_DUP +003f68 383d .dw XT_DOLITERAL +003f69 0061 .dw 'a' +003f6a 383d .dw XT_DOLITERAL +003f6b 007b .dw 'z'+1 +003f6c 3e57 .dw XT_WITHIN +003f6d 3836 .dw XT_DOCONDBRANCH +003f6e 3f72 DEST(PFA_TOUPPER0) +003f6f 383d .dw XT_DOLITERAL +003f70 00df .dw 223 ; inverse of 0x20: 0xdf +003f71 3a13 .dw XT_AND + PFA_TOUPPER0: +003f72 3820 .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: +003f73 ff07 .dw $ff07 +003f74 6f74 +003f75 6f6c +003f76 6577 +003f77 0072 .db "tolower",0 +003f78 3f60 .dw VE_HEAD + .set VE_HEAD = VE_TOLOWER + XT_TOLOWER: +003f79 3801 .dw DO_COLON + PFA_TOLOWER: + .endif +003f7a 38b1 .dw XT_DUP +003f7b 383d .dw XT_DOLITERAL +003f7c 0041 .dw 'A' +003f7d 383d .dw XT_DOLITERAL +003f7e 005b .dw 'Z'+1 +003f7f 3e57 .dw XT_WITHIN +003f80 3836 .dw XT_DOCONDBRANCH +003f81 3f85 DEST(PFA_TOLOWER0) +003f82 383d .dw XT_DOLITERAL +003f83 0020 .dw 32 +003f84 3a1c .dw XT_OR + PFA_TOLOWER0: +003f85 3820 .dw XT_EXIT + + .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: +003f86 ff06 .dw $ff06 +003f87 733f +003f88 6174 +003f89 6b63 .db "?stack" +003f8a 3f73 .dw VE_HEAD + .set VE_HEAD = VE_QSTACK + XT_QSTACK: +003f8b 3801 .dw DO_COLON + PFA_QSTACK: + .endif +003f8c 05e2 .dw XT_DEPTH +003f8d 3921 .dw XT_ZEROLESS +003f8e 3836 .dw XT_DOCONDBRANCH +003f8f 3f93 DEST(PFA_QSTACK1) +003f90 383d .dw XT_DOLITERAL +003f91 fffc .dw -4 +003f92 3d86 .dw XT_THROW + PFA_QSTACK1: +003f93 3820 .dw XT_EXIT + .include "words/bounds.asm" + + ; Tools + ; convert a string to an address range + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_BOUNDS: +003f94 ff06 .dw $ff06 +003f95 6f62 +003f96 6e75 +003f97 7364 .db "bounds" +003f98 3f86 .dw VE_HEAD + .set VE_HEAD = VE_BOUNDS + XT_BOUNDS: +003f99 3801 .dw DO_COLON + PFA_BOUNDS: + .endif +003f9a 38cf .dw XT_OVER +003f9b 399d .dw XT_PLUS +003f9c 38c4 .dw XT_SWAP +003f9d 3820 .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: +003f9e ff02 .dw 0xff02 +003f9f 7263 .db "cr" +003fa0 3f94 .dw VE_HEAD + .set VE_HEAD = VE_CR + XT_CR: +003fa1 3801 .dw DO_COLON + PFA_CR: + .endif + +003fa2 383d .dw XT_DOLITERAL +003fa3 000d .dw 13 +003fa4 3ef2 .dw XT_EMIT +003fa5 383d .dw XT_DOLITERAL +003fa6 000a .dw 10 +003fa7 3ef2 .dw XT_EMIT +003fa8 3820 .dw XT_EXIT + .include "words/space.asm" + + ; Character IO + ; emits a space (bl) + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_SPACE: +003fa9 ff05 .dw $ff05 +003faa 7073 +003fab 6361 +003fac 0065 .db "space",0 +003fad 3f9e .dw VE_HEAD + .set VE_HEAD = VE_SPACE + XT_SPACE: +003fae 3801 .dw DO_COLON + PFA_SPACE: + .endif +003faf 3f54 .dw XT_BL +003fb0 3ef2 .dw XT_EMIT +003fb1 3820 .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: +003fb2 ff06 .dw $ff06 +003fb3 7073 +003fb4 6361 +003fb5 7365 .db "spaces" +003fb6 3fa9 .dw VE_HEAD + .set VE_HEAD = VE_SPACES + XT_SPACES: +003fb7 3801 .dw DO_COLON + PFA_SPACES: + + .endif + ;C SPACES n -- output n spaces + ; BEGIN DUP 0> WHILE SPACE 1- REPEAT DROP ; +003fb8 3954 +003fb9 3e4a .DW XT_ZERO, XT_MAX +003fba 38b1 +003fbb 3836 SPCS1: .DW XT_DUP,XT_DOCONDBRANCH +003fbc 3fc1 DEST(SPCS2) +003fbd 3fae +003fbe 3a35 +003fbf 382f .DW XT_SPACE,XT_1MINUS,XT_DOBRANCH +003fc0 3fba DEST(SPCS1) +003fc1 38d9 +003fc2 3820 SPCS2: .DW XT_DROP,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: +003fc3 ff03 .dw $ff03 +003fc4 3e73 +003fc5 0064 .db "s>d",0 +003fc6 3fb2 .dw VE_HEAD + .set VE_HEAD = VE_S2D + XT_S2D: +003fc7 3801 .dw DO_COLON + PFA_S2D: + .endif +003fc8 38b1 .dw XT_DUP +003fc9 3921 .dw XT_ZEROLESS +003fca 3820 .dw XT_EXIT + .include "words/to-body.asm" + + ; Core + ; get body from XT + VE_TO_BODY: +003fcb ff05 .dw $ff05 +003fcc 623e +003fcd 646f +003fce 0079 .db ">body",0 +003fcf 3fc3 .dw VE_HEAD + .set VE_HEAD = VE_TO_BODY + XT_TO_BODY: +003fd0 3a30 .dw PFA_1PLUS + .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: +003fd1 0008 .dw $0008 +003fd2 6c32 +003fd3 7469 +003fd4 7265 +003fd5 6c61 .db "2literal" +003fd6 3fcb .dw VE_HEAD + .set VE_HEAD = VE_2LITERAL + XT_2LITERAL: +003fd7 3801 .dw DO_COLON + PFA_2LITERAL: + .endif +003fd8 38c4 .dw XT_SWAP +003fd9 0772 .dw XT_LITERAL +003fda 0772 .dw XT_LITERAL +003fdb 3820 .dw XT_EXIT + .include "words/equal.asm" + + ; Compare + ; compares two values for equality + VE_EQUAL: +003fdc ff01 .dw $ff01 +003fdd 003d .db "=",0 +003fde 3fd1 .dw VE_HEAD + .set VE_HEAD = VE_EQUAL + XT_EQUAL: +003fdf 3801 .dw DO_COLON + PFA_EQUAL: +003fe0 3993 .dw XT_MINUS +003fe1 391a .dw XT_ZEROEQUAL +003fe2 3820 .dw XT_EXIT + .include "words/num-constants.asm" + + .endif + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_ONE: +003fe3 ff01 .dw $ff01 +003fe4 0031 .db "1",0 +003fe5 3fdc .dw VE_HEAD + .set VE_HEAD = VE_ONE + XT_ONE: +003fe6 3848 .dw PFA_DOVARIABLE + PFA_ONE: + .endif +003fe7 0001 .DW 1 + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_TWO: +003fe8 ff01 .dw $ff01 +003fe9 0032 .db "2",0 +003fea 3fe3 .dw VE_HEAD + .set VE_HEAD = VE_TWO + XT_TWO: +003feb 3848 .dw PFA_DOVARIABLE + PFA_TWO: + .endif +003fec 0002 .DW 2 + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_MINUSONE: +003fed ff02 .dw $ff02 +003fee 312d .db "-1" +003fef 3fe8 .dw VE_HEAD + .set VE_HEAD = VE_MINUSONE + XT_MINUSONE: +003ff0 3848 .dw PFA_DOVARIABLE + PFA_MINUSONE: + .endif +003ff1 ffff .DW -1 + .include "dict_appl_core.inc" + + ; do not delete it! + + .set flashlast = pc + .if (pc>FLASHEND) + .endif + + .dseg + ; define a label for the 1st free ram address + HERESTART: + .eseg + .include "amforth-eeprom.inc" +00002a ff ff + ; some configs +00002c 1b 0b CFG_DP: .dw DPSTART ; Dictionary Pointer +00002e 1d 01 EE_HERE: .dw HERESTART ; Memory Allocation +000030 84 00 EE_EHERE: .dw EHERESTART ; EEProm Memory Allocation +000032 c3 09 CFG_WLSCOPE: .dw XT_GET_CURRENT ; default wordlist scope +000034 52 00 CFG_FORTHRECOGNIZER: .dw CFG_RECOGNIZERLISTLEN ; Recognizer word set + ; LEAVE stack is between data stack and return stack. +000036 10 08 CFG_LP0: .dw stackstart+1 +000038 6d 0a CFG_TURNKEY: .dw XT_APPLTURNKEY ; TURNKEY +00003a f4 02 CFG_ENVIRONMENT:.dw VE_ENVHEAD ; environmental queries +00003c 3e 00 CFG_CURRENT: .dw CFG_FORTHWORDLIST ; forth-wordlist +00003e ed 3f CFG_FORTHWORDLIST:.dw VE_HEAD ; pre-defined (compiled in) wordlist + CFG_ORDERLISTLEN: +000040 01 00 .dw 1 + CFG_ORDERLIST: ; list of wordlist id, exactly numwordlist entries +000042 3e 00 .dw CFG_FORTHWORDLIST ; get/set-order +000044 .byte (NUMWORDLISTS-1)*CELLSIZE ; one slot is already used + CFG_RECOGNIZERLISTLEN: +000052 02 00 .dw 2 + CFG_RECOGNIZERLIST: +000054 65 06 .dw XT_REC_FIND +000056 51 06 .dw XT_REC_NUM +000058 .byte (NUMRECOGNIZERS-2)*CELLSIZE ; two slots are already used + + EE_STOREI: +00005c 7e 3b .dw XT_DO_STOREI ; Store a cell into flash + + ; MARKER saves everything up to here. Nothing beyond gets saved + EE_MARKER: +00005e 5e 00 .dw EE_MARKER + + ; default user area + EE_INITUSER: +000060 00 00 .dw 0 ; USER_STATE +000062 00 00 .dw 0 ; USER_FOLLOWER +000064 5f 08 .dw rstackstart ; USER_RP +000066 0f 08 .dw stackstart ; USER_SP0 +000068 0f 08 .dw stackstart ; USER_SP + +00006a 00 00 .dw 0 ; USER_HANDLER +00006c 0a 00 .dw 10 ; USER_BASE + +00006e 98 00 .dw XT_TX ; USER_EMIT +000070 a6 00 .dw XT_TXQ ; USER_EMITQ +000072 6d 00 .dw XT_RX ; USER_KEY +000074 88 00 .dw XT_RXQ ; USER_KEYQ +000076 6c 02 .dw XT_SOURCETIB ; USER_SOURCE +000078 00 00 .dw 0 ; USER_G_IN +00007a 59 02 .dw XT_REFILLTIB ; USER_REFILL +00007c c9 3c .dw XT_DEFAULT_PROMPTOK +00007e e8 3c .dw XT_DEFAULT_PROMPTERROR +000080 d8 3c .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: +000082 0c 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 + +"ATmega32" register use summary: +r0 : 25 r1 : 5 r2 : 10 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: 89 r17: 61 r18: 61 r19: 37 r20: 13 r21: 11 r22: 11 r23: 3 +r24: 212 r25: 145 r26: 28 r27: 17 r28: 7 r29: 4 r30: 90 r31: 49 +x : 4 y : 217 z : 50 +Registers used: 29 out of 35 (82.9%) + +"ATmega32" 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 : 3 brcs : 1 break : 0 breq : 6 brge : 1 brhc : 0 +brhs : 0 brid : 0 brie : 0 brlo : 1 brlt : 3 brmi : 3 +brne : 22 brpl : 0 brsh : 0 brtc : 0 brts : 0 brvc : 0 +brvs : 2 bset : 0 bst : 0 call : 2 cbi : 7 cbr : 1 +clc : 2 clh : 0 cli : 7 cln : 0 clr : 14 cls : 0 +clt : 0 clv : 0 clz : 0 com : 14 cp : 11 cpc : 10 +cpi : 2 cpse : 0 dec : 10 eor : 3 fmul : 0 fmuls : 0 +fmulsu: 0 icall : 0 ijmp : 1 in : 25 inc : 3 jmp : 13 +ld : 145 ldd : 4 ldi : 41 lds : 1 lpm : 16 lsl : 14 +lsr : 2 mov : 16 movw : 72 mul : 5 muls : 1 mulsu : 2 +neg : 0 nop : 0 or : 9 ori : 2 out : 22 pop : 49 +push : 43 rcall : 34 ret : 7 reti : 1 rjmp : 106 rol : 23 +ror : 6 sbc : 9 sbci : 3 sbi : 8 sbic : 3 sbis : 0 +sbiw : 16 sbr : 0 sbrc : 5 sbrs : 7 sec : 1 seh : 0 +sei : 1 sen : 0 ser : 4 ses : 0 set : 0 sev : 0 +sez : 0 sleep : 0 spm : 2 st : 81 std : 8 sts : 1 +sub : 6 subi : 3 swap : 0 tst : 0 wdr : 0 +Instructions used: 72 out of 113 (63.7%) + +"ATmega32" memory use summary [bytes]: +Segment Begin End Code Data Used Size Use% +--------------------------------------------------------------- +[.cseg] 0x000000 0x007fe4 2072 11708 13780 32768 42.1% +[.dseg] 0x000060 0x00011d 0 189 189 2048 9.2% +[.eseg] 0x000000 0x000084 0 132 132 1024 12.9% + +Assembly complete, 0 errors, 8 warnings diff --git a/amforth-6.5/appl/eval-pollin/p32-8.map b/amforth-6.5/appl/eval-pollin/p32-8.map new file mode 100644 index 0000000..8968a65 --- /dev/null +++ b/amforth-6.5/appl/eval-pollin/p32-8.map @@ -0,0 +1,1933 @@ + +AVRASM ver. 2.1.52 p32-8.asm Sun Apr 30 20:10:14 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 00000095 +EQU SIGNATURE_002 00000002 +EQU SREG 0000003f +EQU SPL 0000003d +EQU SPH 0000003e +EQU OCR0 0000003c +EQU GICR 0000003b +EQU GIFR 0000003a +EQU TIMSK 00000039 +EQU TIFR 00000038 +EQU SPMCR 00000037 +EQU TWCR 00000036 +EQU MCUCR 00000035 +EQU MCUCSR 00000034 +EQU TCCR0 00000033 +EQU TCNT0 00000032 +EQU OSCCAL 00000031 +EQU OCDR 00000031 +EQU SFIOR 00000030 +EQU TCCR1A 0000002f +EQU TCCR1B 0000002e +EQU TCNT1L 0000002c +EQU TCNT1H 0000002d +EQU OCR1AL 0000002a +EQU OCR1AH 0000002b +EQU OCR1BL 00000028 +EQU OCR1BH 00000029 +EQU ICR1L 00000026 +EQU ICR1H 00000027 +EQU TCCR2 00000025 +EQU TCNT2 00000024 +EQU OCR2 00000023 +EQU ASSR 00000022 +EQU WDTCR 00000021 +EQU UBRRH 00000020 +EQU UCSRC 00000020 +EQU EEARL 0000001e +EQU EEARH 0000001f +EQU EEDR 0000001d +EQU EECR 0000001c +EQU PORTA 0000001b +EQU DDRA 0000001a +EQU PINA 00000019 +EQU PORTB 00000018 +EQU DDRB 00000017 +EQU PINB 00000016 +EQU PORTC 00000015 +EQU DDRC 00000014 +EQU PINC 00000013 +EQU PORTD 00000012 +EQU DDRD 00000011 +EQU PIND 00000010 +EQU SPDR 0000000f +EQU SPSR 0000000e +EQU SPCR 0000000d +EQU UDR 0000000c +EQU UCSRA 0000000b +EQU UCSRB 0000000a +EQU UBRRL 00000009 +EQU ACSR 00000008 +EQU ADMUX 00000007 +EQU ADCSRA 00000006 +EQU ADCH 00000005 +EQU ADCL 00000004 +EQU TWDR 00000003 +EQU TWAR 00000002 +EQU TWSR 00000001 +EQU TWBR 00000000 +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 EEWE 00000001 +EQU EEMWE 00000002 +EQU EERIE 00000003 +EQU WDP0 00000000 +EQU WDP1 00000001 +EQU WDP2 00000002 +EQU WDE 00000003 +EQU WDTOE 00000004 +EQU WDDE 00000004 +EQU GIMSK 0000003b +EQU IVCE 00000000 +EQU IVSEL 00000001 +EQU INT2 00000005 +EQU INT0 00000006 +EQU INT1 00000007 +EQU INTF2 00000005 +EQU INTF0 00000006 +EQU INTF1 00000007 +EQU ISC00 00000000 +EQU ISC01 00000001 +EQU ISC10 00000002 +EQU ISC11 00000003 +EQU ISC2 00000006 +EQU CS00 00000000 +EQU CS01 00000001 +EQU CS02 00000002 +EQU WGM01 00000003 +EQU CTC0 00000003 +EQU COM00 00000004 +EQU COM01 00000005 +EQU WGM00 00000006 +EQU PWM0 00000006 +EQU FOC0 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 OCR0_0 00000000 +EQU OCR0_1 00000001 +EQU OCR0_2 00000002 +EQU OCR0_3 00000003 +EQU OCR0_4 00000004 +EQU OCR0_5 00000005 +EQU OCR0_6 00000006 +EQU OCR0_7 00000007 +EQU TOIE0 00000000 +EQU OCIE0 00000001 +EQU TOV0 00000000 +EQU OCF0 00000001 +EQU TOIE2 00000006 +EQU OCIE2 00000007 +EQU TOV2 00000006 +EQU OCF2 00000007 +EQU CS20 00000000 +EQU CS21 00000001 +EQU CS22 00000002 +EQU WGM21 00000003 +EQU CTC2 00000003 +EQU COM20 00000004 +EQU COM21 00000005 +EQU WGM20 00000006 +EQU PWM2 00000006 +EQU FOC2 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 OCR2_0 00000000 +EQU OCR2_1 00000001 +EQU OCR2_2 00000002 +EQU OCR2_3 00000003 +EQU OCR2_4 00000004 +EQU OCR2_5 00000005 +EQU OCR2_6 00000006 +EQU OCR2_7 00000007 +EQU TCR2UB 00000000 +EQU OCR2UB 00000001 +EQU TCN2UB 00000002 +EQU AS2 00000003 +EQU TOIE1 00000002 +EQU OCIE1B 00000003 +EQU OCIE1A 00000004 +EQU TICIE1 00000005 +EQU TOV1 00000002 +EQU OCF1B 00000003 +EQU OCF1A 00000004 +EQU ICF1 00000005 +EQU WGM10 00000000 +EQU PWM10 00000000 +EQU WGM11 00000001 +EQU PWM11 00000001 +EQU FOC1B 00000002 +EQU FOC1A 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 CTC10 00000003 +EQU CTC1 00000003 +EQU WGM13 00000004 +EQU CTC11 00000004 +EQU ICES1 00000006 +EQU ICNC1 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 UDR0 00000000 +EQU UDR1 00000001 +EQU UDR2 00000002 +EQU UDR3 00000003 +EQU UDR4 00000004 +EQU UDR5 00000005 +EQU UDR6 00000006 +EQU UDR7 00000007 +EQU USR 0000000b +EQU MPCM 00000000 +EQU U2X 00000001 +EQU UPE 00000002 +EQU PE 00000002 +EQU DOR 00000003 +EQU FE 00000004 +EQU UDRE 00000005 +EQU TXC 00000006 +EQU RXC 00000007 +EQU UCR 0000000a +EQU TXB8 00000000 +EQU RXB8 00000001 +EQU UCSZ2 00000002 +EQU CHR9 00000002 +EQU TXEN 00000003 +EQU RXEN 00000004 +EQU UDRIE 00000005 +EQU TXCIE 00000006 +EQU RXCIE 00000007 +EQU UCPOL 00000000 +EQU UCSZ0 00000001 +EQU UCSZ1 00000002 +EQU USBS 00000003 +EQU UPM0 00000004 +EQU UPM1 00000005 +EQU UMSEL 00000006 +EQU URSEL 00000007 +EQU UBRRHI 00000020 +EQU ACME 00000003 +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 MUX0 00000000 +EQU MUX1 00000001 +EQU MUX2 00000002 +EQU MUX3 00000003 +EQU MUX4 00000004 +EQU ADLAR 00000005 +EQU REFS0 00000006 +EQU REFS1 00000007 +EQU ADCSR 00000006 +EQU ADPS0 00000000 +EQU ADPS1 00000001 +EQU ADPS2 00000002 +EQU ADIE 00000003 +EQU ADIF 00000004 +EQU ADATE 00000005 +EQU ADFR 00000005 +EQU ADSC 00000006 +EQU ADEN 00000007 +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 ADTS0 00000005 +EQU ADTS1 00000006 +EQU ADTS2 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 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 SM0 00000004 +EQU SM1 00000005 +EQU SM2 00000006 +EQU SE 00000007 +EQU MCUSR 00000034 +EQU PORF 00000000 +EQU EXTRF 00000001 +EQU BORF 00000002 +EQU WDRF 00000003 +EQU JTRF 00000004 +EQU JTD 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 PSR10 00000000 +EQU PSR2 00000001 +EQU PUD 00000002 +EQU SPMEN 00000000 +EQU PGERS 00000001 +EQU PGWRT 00000002 +EQU BLBSET 00000003 +EQU RWWSRE 00000004 +EQU ASRE 00000004 +EQU RWWSB 00000006 +EQU ASB 00000006 +EQU SPMIE 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 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 BODEN 00000006 +EQU BODLEVEL 00000007 +EQU BOOTRST 00000000 +EQU BOOTSZ0 00000001 +EQU BOOTSZ1 00000002 +EQU EESAVE 00000003 +EQU SPIEN 00000005 +EQU JTAGEN 00000006 +EQU OCDEN 00000007 +DEF XH r27 +DEF XL r26 +DEF YH r29 +DEF YL r28 +DEF ZH r31 +DEF ZL r30 +EQU FLASHEND 00003fff +EQU IOEND 0000003f +EQU SRAM_START 00000060 +EQU SRAM_SIZE 00000800 +EQU RAMEND 0000085f +EQU XRAMEND 00000000 +EQU E2END 000003ff +EQU EEPROMEND 000003ff +EQU EEADRBITS 0000000a +EQU NRWW_START_ADDR 00003800 +EQU NRWW_STOP_ADDR 00003fff +EQU RWW_START_ADDR 00000000 +EQU RWW_STOP_ADDR 000037ff +EQU PAGESIZE 00000040 +EQU FIRSTBOOTSTART 00003f00 +EQU SECONDBOOTSTART 00003e00 +EQU THIRDBOOTSTART 00003c00 +EQU FOURTHBOOTSTART 00003800 +EQU SMALLBOOTSTART 00003f00 +EQU LARGEBOOTSTART 00003800 +EQU INT0addr 00000002 +EQU INT1addr 00000004 +EQU INT2addr 00000006 +EQU OC2addr 00000008 +EQU OVF2addr 0000000a +EQU ICP1addr 0000000c +EQU OC1Aaddr 0000000e +EQU OC1Baddr 00000010 +EQU OVF1addr 00000012 +EQU OC0addr 00000014 +EQU OVF0addr 00000016 +EQU SPIaddr 00000018 +EQU URXCaddr 0000001a +EQU UDREaddr 0000001c +EQU UTXCaddr 0000001e +EQU ADCCaddr 00000020 +EQU ERDYaddr 00000022 +EQU ACIaddr 00000024 +EQU TWIaddr 00000026 +EQU SPMRaddr 00000028 +EQU INT_VECTORS_SIZE 0000002a +EQU ramstart 00000060 +EQU CELLSIZE 00000002 +SET WANT_EEPROM 00000000 +SET WANT_WATCHDOG 00000000 +SET WANT_EXTERNAL_INTERRUPT 00000000 +SET WANT_TIMER_COUNTER_0 00000000 +SET WANT_TIMER_COUNTER_2 00000000 +SET WANT_TIMER_COUNTER_1 00000000 +SET WANT_SPI 00000000 +SET WANT_USART 00000000 +SET WANT_ANALOG_COMPARATOR 00000000 +SET WANT_AD_CONVERTER 00000000 +SET WANT_PORTA 00000000 +SET WANT_PORTB 00000000 +SET WANT_PORTC 00000000 +SET WANT_PORTD 00000000 +SET WANT_CPU 00000000 +SET WANT_BOOT_LOAD 00000000 +SET WANT_TWI 00000000 +EQU intvecsize 00000002 +EQU pclen 00000002 +CSEG isr 0000011e +EQU INTVECTORS 00000015 +EQU SPMCSR 00000037 +EQU EEPE 00000001 +EQU EEMPE 00000002 +CSEG mcu_info 00000029 +CSEG mcu_ramsize 00000029 +CSEG mcu_eepromsize 0000002a +CSEG mcu_maxdp 0000002b +CSEG mcu_numints 0000002c +CSEG mcu_name 0000002d +SET codestart 00000032 +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 0000085f +SET stackstart 0000080f +SET NUMWORDLISTS 00000008 +SET NUMRECOGNIZERS 00000004 +SET BAUD 00009600 +SET BAUD_MAXERROR 0000001e +SET VE_HEAD 00003fed +SET VE_ENVHEAD 000002f4 +SET AMFORTH_RO_SEG 00003801 +EQU F_CPU 007a1200 +EQU TIMER_INT 0000000a +EQU BAUDRATE_LOW 00000029 +EQU BAUDRATE_HIGH 00000040 +EQU USART_C 00000040 +EQU USART_B 0000002a +EQU USART_A 0000002b +EQU USART_DATA 0000002c +EQU bm_USARTC_en 00000080 +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_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 00000060 +DSEG usart_rx_in 00000070 +DSEG usart_rx_out 00000071 +CSEG VE_TO_RXBUF 00000032 +CSEG XT_TO_RXBUF 00000038 +CSEG PFA_rx_tobuf 00000039 +CSEG DO_NEXT 00003805 +CSEG VE_ISR_RX 00000049 +CSEG XT_ISR_RX 0000004e +CSEG DO_COLON 00003801 +CSEG usart_rx_isr 0000004f +CSEG XT_DOLITERAL 0000383d +CSEG XT_CFETCH 00003898 +CSEG XT_DUP 000038b1 +CSEG XT_EQUAL 00003fdf +CSEG XT_DOCONDBRANCH 00003836 +CSEG usart_rx_isr1 00000059 +CSEG XT_COLD 00003d38 +CSEG XT_EXIT 00003820 +CSEG XT_USART_INIT_RX_BUFFER 0000005b +CSEG PFA_USART_INIT_RX_BUFFER 0000005c +CSEG XT_INTSTORE 00003ca5 +CSEG XT_ZERO 00003954 +CSEG XT_FILL 00003e98 +CSEG VE_RX_BUFFER 00000068 +CSEG XT_RX_BUFFER 0000006d +CSEG PFA_RX_BUFFER 0000006e +CSEG XT_RXQ_BUFFER 00000088 +CSEG XT_PLUS 0000399d +CSEG XT_SWAP 000038c4 +CSEG XT_1PLUS 00003a2f +CSEG XT_AND 00003a13 +CSEG XT_CSTORE 0000388d +CSEG VE_RXQ_BUFFER 00000082 +CSEG PFA_RXQ_BUFFER 00000089 +CSEG XT_PAUSE 00003d30 +CSEG XT_NOTEQUAL 00003913 +SET XT_RX 0000006d +SET XT_RXQ 00000088 +SET XT_USART_INIT_RX 0000005b +CSEG VE_TX_POLL 00000092 +CSEG XT_TX_POLL 00000098 +CSEG PFA_TX_POLL 00000099 +CSEG XT_TXQ_POLL 000000a6 +CSEG VE_TXQ_POLL 000000a0 +CSEG PFA_TXQ_POLL 000000a7 +SET XT_TX 00000098 +SET XT_TXQ 000000a6 +SET XT_USART_INIT_TX 00000000 +CSEG VE_UBRR 000000af +CSEG XT_UBRR 000000b3 +CSEG PFA_DOVALUE1 0000386f +CSEG PFA_UBRR 000000b4 +ESEG EE_UBRRVAL 00000082 +CSEG XT_EDEFERFETCH 00003da0 +CSEG XT_EDEFERSTORE 00003daa +CSEG VE_USART 000000b7 +CSEG XT_USART 000000bc +CSEG PFA_USART 000000bd +CSEG XT_BYTESWAP 00003af9 +EQU OW_PORT 00000018 +EQU OW_BIT 00000004 +SET OW_DDR 00000017 +SET OW_PIN 00000016 +CSEG VE_OW_RESET 000000d2 +CSEG XT_OW_RESET 000000d8 +CSEG PFA_OW_RESET 000000d9 +SET cycles 00000000 +SET loop_cycles 000007d0 +CSEG VE_OW_SLOT 000000f6 +CSEG XT_OW_SLOT 000000fc +CSEG PFA_OW_SLOT 000000fd +CSEG PFA_OW_SLOT0 0000010a +SET AMFORTH_NRWW_SIZE 00000ffc +SET corepc 0000011e +CSEG PFA_COLD 00003d39 +ESEG intvec 00000000 +DSEG intcnt 00000072 +CSEG VE_MPLUS 00000135 +CSEG XT_MPLUS 00000138 +CSEG PFA_MPLUS 00000139 +CSEG XT_S2D 00003fc7 +CSEG XT_DPLUS 00003c15 +CSEG VE_UDSTAR 0000013c +CSEG XT_UDSTAR 00000140 +CSEG PFA_UDSTAR 00000141 +CSEG XT_TO_R 000038ff +CSEG XT_UMSTAR 000039e0 +CSEG XT_DROP 000038d9 +CSEG XT_R_FROM 000038f6 +CSEG XT_ROT 000038e1 +CSEG VE_UMAX 0000014b +CSEG XT_UMAX 0000014f +CSEG PFA_UMAX 00000150 +CSEG XT_2DUP 00003ec9 +CSEG XT_ULESS 0000395c +CSEG UMAX1 00000155 +CSEG VE_UMIN 00000157 +CSEG XT_UMIN 0000015b +CSEG PFA_UMIN 0000015c +CSEG XT_UGREATER 00003967 +CSEG UMIN1 00000161 +CSEG XT_IMMEDIATEQ 00000163 +CSEG PFA_IMMEDIATEQ 00000164 +CSEG XT_ZEROEQUAL 0000391a +CSEG IMMEDIATEQ1 0000016c +CSEG XT_ONE 00003fe6 +CSEG XT_TRUE 0000394b +CSEG VE_NAME2FLAGS 0000016e +CSEG XT_NAME2FLAGS 00000175 +CSEG PFA_NAME2FLAGS 00000176 +CSEG XT_FETCHI 00003bcb +CSEG VE_DOT_VER 0000017b +CSEG XT_DOT_VER 0000017f +CSEG PFA_DOT_VER 00000180 +CSEG XT_ENV_FORTHNAME 000002cf +CSEG XT_ITYPE 000003f8 +CSEG XT_SPACE 00003fae +CSEG XT_BASE 00003ebd +CSEG XT_FETCH 00003879 +CSEG XT_ENV_FORTHVERSION 000002dd +CSEG XT_DECIMAL 00003f41 +CSEG XT_L_SHARP 00000316 +CSEG XT_SHARP 0000031e +CSEG XT_HOLD 00000307 +CSEG XT_SHARP_S 00000334 +CSEG XT_SHARP_G 0000033f +CSEG XT_TYPE 0000042e +CSEG XT_STORE 00003881 +CSEG XT_ENV_CPU 000002e5 +CSEG VE_NOOP 00000196 +CSEG XT_NOOP 0000019a +CSEG PFA_NOOP 0000019b +CSEG VE_UNUSED 0000019c +CSEG XT_UNUSED 000001a1 +CSEG PFA_UNUSED 000001a2 +CSEG XT_SP_FETCH 00003a8d +CSEG XT_HERE 00003f23 +CSEG XT_MINUS 00003993 +CSEG VE_TO 000001a6 +CSEG XT_TO 000001a9 +CSEG PFA_TO 000001aa +CSEG XT_TICK 0000043d +CSEG XT_TO_BODY 00003fd0 +CSEG XT_STATE 00003eb7 +CSEG PFA_TO1 000001ba +CSEG XT_COMPILE 00000751 +CSEG XT_DOTO 000001b4 +CSEG XT_COMMA 0000075c +CSEG PFA_DOTO 000001b5 +CSEG XT_ICELLPLUS 000001c6 +CSEG XT_EXECUTE 0000382a +CSEG VE_ICELLPLUS 000001c0 +CSEG PFA_ICELLPLUS 000001c7 +CSEG VE_ICOMPARE 000001c9 +CSEG XT_ICOMPARE 000001cf +CSEG PFA_ICOMPARE 000001d0 +CSEG XT_OVER 000038cf +CSEG PFA_ICOMPARE_SAMELEN 000001da +CSEG XT_2DROP 00003ed2 +CSEG XT_QDOCHECK 0000081b +CSEG PFA_ICOMPARE_DONE 000001fd +CSEG XT_DODO 00003a9b +CSEG PFA_ICOMPARE_LOOP 000001e0 +CSEG PFA_ICOMPARE_LASTCELL 000001ee +CSEG PFA_ICOMPARE_NEXTLOOP 000001f5 +CSEG XT_UNLOOP 00003ad4 +CSEG XT_CELLPLUS 00003c90 +CSEG XT_DOPLUSLOOP 00003aba +CSEG VE_STAR 00000200 +CSEG XT_STAR 00000203 +CSEG PFA_STAR 00000204 +CSEG XT_MSTAR 000039a6 +CSEG VE_J 00000207 +CSEG XT_J 0000020a +CSEG PFA_J 0000020b +CSEG XT_RP_FETCH 00003a76 +CSEG VE_DABS 00000217 +CSEG XT_DABS 0000021b +CSEG PFA_DABS 0000021c +CSEG XT_ZEROLESS 00003921 +CSEG PFA_DABS1 00000221 +CSEG XT_DNEGATE 00000228 +CSEG VE_DNEGATE 00000222 +CSEG PFA_DNEGATE 00000229 +CSEG XT_DINVERT 00003c3b +CSEG VE_CMOVE 0000022e +CSEG XT_CMOVE 00000233 +CSEG PFA_CMOVE 00000234 +CSEG PFA_CMOVE1 00000241 +CSEG PFA_CMOVE2 0000023d +CSEG VE_2SWAP 00000247 +CSEG XT_2SWAP 0000024c +CSEG PFA_2SWAP 0000024d +CSEG VE_REFILLTIB 00000252 +CSEG XT_REFILLTIB 00000259 +CSEG PFA_REFILLTIB 0000025a +CSEG XT_TIB 00000275 +CSEG XT_ACCEPT 0000048d +CSEG XT_NUMBERTIB 0000027b +CSEG XT_TO_IN 00003ee2 +CSEG VE_SOURCETIB 00000265 +CSEG XT_SOURCETIB 0000026c +CSEG PFA_SOURCETIB 0000026d +CSEG VE_TIB 00000271 +CSEG PFA_DOVARIABLE 00003848 +CSEG PFA_TIB 00000276 +DSEG ram_tib 00000087 +CSEG VE_NUMBERTIB 00000277 +CSEG PFA_NUMBERTIB 0000027c +DSEG ram_sharptib 000000e1 +CSEG VE_EE2RAM 0000027d +CSEG XT_EE2RAM 00000282 +CSEG PFA_EE2RAM 00000283 +CSEG PFA_EE2RAM_1 00000285 +CSEG XT_FETCHE 00003b5f +CSEG XT_DOLOOP 00003ac9 +CSEG PFA_EE2RAM_2 0000028f +CSEG VE_INIT_RAM 00000291 +CSEG XT_INIT_RAM 00000297 +CSEG PFA_INI_RAM 00000298 +ESEG EE_INITUSER 00000060 +CSEG XT_UP_FETCH 00003b02 +CSEG XT_2SLASH 00003a04 +CSEG VE_ENVIRONMENT 000002a0 +CSEG XT_ENVIRONMENT 000002a8 +CSEG PFA_ENVIRONMENT 000002a9 +ESEG CFG_ENVIRONMENT 0000003a +CSEG VE_ENVWORDLISTS 000002aa +CSEG XT_ENVWORDLISTS 000002b1 +CSEG PFA_ENVWORDLISTS 000002b2 +CSEG VE_ENVSLASHPAD 000002b5 +CSEG XT_ENVSLASHPAD 000002b9 +CSEG PFA_ENVSLASHPAD 000002ba +CSEG XT_PAD 00003ee8 +CSEG VE_ENVSLASHHOLD 000002be +CSEG XT_ENVSLASHHOLD 000002c3 +CSEG PFA_ENVSLASHHOLD 000002c4 +CSEG VE_ENV_FORTHNAME 000002c8 +CSEG PFA_EN_FORTHNAME 000002d0 +CSEG XT_DOSLITERAL 000003c5 +CSEG VE_ENV_FORTHVERSION 000002d7 +CSEG PFA_EN_FORTHVERSION 000002de +CSEG VE_ENV_CPU 000002e1 +CSEG PFA_EN_CPU 000002e6 +CSEG XT_ICOUNT 00000424 +CSEG VE_ENV_MCUINFO 000002ea +CSEG XT_ENV_MCUINFO 000002f0 +CSEG PFA_EN_MCUINFO 000002f1 +CSEG VE_ENVUSERSIZE 000002f4 +CSEG XT_ENVUSERSIZE 000002f9 +CSEG PFA_ENVUSERSIZE 000002fa +CSEG VE_HLD 000002fd +CSEG XT_HLD 00000301 +CSEG PFA_HLD 00000302 +DSEG ram_hld 000000e3 +CSEG VE_HOLD 00000303 +CSEG PFA_HOLD 00000308 +CSEG XT_1MINUS 00003a35 +CSEG VE_L_SHARP 00000313 +CSEG PFA_L_SHARP 00000317 +CSEG VE_SHARP 0000031b +CSEG PFA_SHARP 0000031f +CSEG XT_UDSLASHMOD 0000039b +CSEG XT_LESS 0000396e +CSEG PFA_SHARP1 0000032c +CSEG VE_SHARP_S 00000331 +CSEG PFA_SHARP_S 00000335 +CSEG NUMS1 00000335 +CSEG XT_OR 00003a1c +CSEG VE_SHARP_G 0000033c +CSEG PFA_SHARP_G 00000340 +CSEG VE_SIGN 00000347 +CSEG XT_SIGN 0000034b +CSEG PFA_SIGN 0000034c +CSEG PFA_SIGN1 00000352 +CSEG VE_DDOTR 00000353 +CSEG XT_DDOTR 00000357 +CSEG PFA_DDOTR 00000358 +CSEG XT_TUCK 00003eda +CSEG XT_SPACES 00003fb7 +CSEG VE_DOTR 00000366 +CSEG XT_DOTR 00000369 +CSEG PFA_DOTR 0000036a +CSEG VE_DDOT 0000036f +CSEG XT_DDOT 00000372 +CSEG PFA_DDOT 00000373 +CSEG VE_DOT 00000377 +CSEG XT_DOT 0000037a +CSEG PFA_DOT 0000037b +CSEG VE_UDDOT 0000037e +CSEG XT_UDDOT 00000382 +CSEG PFA_UDDOT 00000383 +CSEG XT_UDDOTR 0000038b +CSEG VE_UDDOTR 00000387 +CSEG PFA_UDDOTR 0000038c +CSEG VE_UDSLASHMOD 00000396 +CSEG PFA_UDSLASHMOD 0000039c +CSEG XT_R_FETCH 00003908 +CSEG XT_UMSLASHMOD 000039c2 +CSEG VE_DIGITQ 000003a6 +CSEG XT_DIGITQ 000003ab +CSEG PFA_DIGITQ 000003ac +CSEG XT_TOUPPER 00003f66 +CSEG XT_GREATER 00003978 +CSEG PFA_DOSLITERAL 000003c6 +CSEG VE_SCOMMA 000003d0 +CSEG XT_SCOMMA 000003d3 +CSEG PFA_SCOMMA 000003d4 +CSEG XT_DOSCOMMA 000003d7 +CSEG PFA_DOSCOMMA 000003d8 +CSEG XT_2STAR 00003a0b +CSEG PFA_SCOMMA2 000003ea +CSEG PFA_SCOMMA1 000003e4 +CSEG XT_GREATERZERO 00003928 +CSEG PFA_SCOMMA3 000003f1 +CSEG VE_ITYPE 000003f3 +CSEG PFA_ITYPE 000003f9 +CSEG PFA_ITYPE2 0000040c +CSEG PFA_ITYPE1 00000404 +CSEG XT_LOWEMIT 00000419 +CSEG XT_HIEMIT 00000415 +CSEG PFA_ITYPE3 00000413 +CSEG PFA_HIEMIT 00000416 +CSEG PFA_LOWEMIT 0000041a +CSEG XT_EMIT 00003ef2 +CSEG VE_ICOUNT 0000041f +CSEG PFA_ICOUNT 00000425 +CSEG VE_TYPE 0000042a +CSEG PFA_TYPE 0000042f +CSEG XT_BOUNDS 00003f99 +CSEG PFA_TYPE2 00000439 +CSEG PFA_TYPE1 00000434 +CSEG XT_I 00003aac +CSEG VE_TICK 0000043a +CSEG PFA_TICK 0000043e +CSEG XT_PARSENAME 000005b0 +CSEG XT_FORTHRECOGNIZER 000005f3 +CSEG XT_RECOGNIZE 000005fe +CSEG XT_DT_NULL 0000068b +CSEG PFA_TICK1 0000044f +CSEG XT_THROW 00003d86 +CSEG VE_CSKIP 00000451 +CSEG XT_CSKIP 00000456 +CSEG PFA_CSKIP 00000457 +CSEG PFA_CSKIP1 00000458 +CSEG PFA_CSKIP2 00000465 +CSEG XT_SLASHSTRING 000005a1 +CSEG XT_DOBRANCH 0000382f +CSEG VE_CSCAN 00000468 +CSEG XT_CSCAN 0000046d +CSEG PFA_CSCAN 0000046e +CSEG PFA_CSCAN1 00000470 +CSEG PFA_CSCAN2 00000482 +CSEG XT_NIP 000038f0 +CSEG VE_ACCEPT 00000488 +CSEG PFA_ACCEPT 0000048e +CSEG ACC1 00000492 +CSEG XT_KEY 00003f03 +CSEG XT_CRLFQ 000004ce +CSEG ACC5 000004c0 +CSEG ACC3 000004b0 +CSEG ACC6 000004ae +CSEG XT_BS 000004c6 +CSEG ACC4 000004be +CSEG XT_BL 00003f54 +CSEG PFA_ACCEPT6 000004b7 +CSEG XT_CR 00003fa1 +CSEG VE_REFILL 000004d9 +CSEG XT_REFILL 000004de +CSEG PFA_DODEFER1 00003dff +CSEG PFA_REFILL 000004df +CSEG XT_UDEFERFETCH 00003dc8 +CSEG XT_UDEFERSTORE 00003dd4 +CSEG VE_CHAR 000004e2 +CSEG XT_CHAR 000004e6 +CSEG PFA_CHAR 000004e7 +CSEG VE_NUMBER 000004eb +CSEG XT_NUMBER 000004f0 +CSEG PFA_NUMBER 000004f1 +CSEG XT_QSIGN 00000534 +CSEG XT_SET_BASE 00000547 +CSEG PFA_NUMBER0 00000507 +CSEG XT_2TO_R 00003b1e +CSEG XT_2R_FROM 00003b2d +CSEG XT_TO_NUMBER 00000565 +CSEG XT_QDUP 000038b9 +CSEG PFA_NUMBER1 00000529 +CSEG PFA_NUMBER2 00000520 +CSEG PFA_NUMBER6 00000521 +CSEG PFA_NUMBER3 0000051d +CSEG XT_TWO 00003feb +CSEG PFA_NUMBER5 0000052f +CSEG PFA_NUMBER4 0000052e +CSEG XT_NEGATE 00003e27 +CSEG PFA_QSIGN 00000535 +CSEG PFA_NUMBERSIGN_DONE 00000540 +CSEG XT_BASES 00000542 +CSEG PFA_DOCONSTANT 00003852 +CSEG PFA_SET_BASE 00000548 +CSEG XT_WITHIN 00003e57 +CSEG SET_BASE1 0000055d +CSEG SET_BASE2 0000055e +CSEG VE_TO_NUMBER 0000055f +CSEG TONUM1 00000566 +CSEG TONUM3 0000057d +CSEG TONUM2 00000571 +CSEG VE_PARSE 0000057e +CSEG XT_PARSE 00000583 +CSEG PFA_PARSE 00000584 +CSEG XT_SOURCE 00000597 +CSEG XT_PLUSSTORE 00003a65 +CSEG VE_SOURCE 00000592 +CSEG PFA_SOURCE 00000598 +CSEG VE_SLASHSTRING 0000059b +CSEG PFA_SLASHSTRING 000005a2 +CSEG VE_PARSENAME 000005a9 +CSEG PFA_PARSENAME 000005b1 +CSEG XT_SKIPSCANCHAR 000005b4 +CSEG PFA_SKIPSCANCHAR 000005b5 +CSEG VE_SP0 000005c6 +CSEG XT_SP0 000005ca +CSEG PFA_SP0 000005cb +CSEG VE_SP 000005ce +CSEG XT_SP 000005d1 +CSEG PFA_DOUSER 00003858 +CSEG PFA_SP 000005d2 +CSEG VE_RP0 000005d3 +CSEG XT_RP0 000005d7 +CSEG PFA_RP0 000005d8 +CSEG XT_DORP0 000005db +CSEG PFA_DORP0 000005dc +CSEG VE_DEPTH 000005dd +CSEG XT_DEPTH 000005e2 +CSEG PFA_DEPTH 000005e3 +CSEG VE_FORTHRECOGNIZER 000005e9 +CSEG PFA_FORTHRECOGNIZER 000005f4 +ESEG CFG_FORTHRECOGNIZER 00000034 +CSEG VE_RECOGNIZE 000005f7 +CSEG PFA_RECOGNIZE 000005ff +CSEG XT_RECOGNIZE_A 00000609 +CSEG XT_MAPSTACK 0000099c +CSEG PFA_RECOGNIZE1 00000608 +CSEG PFA_RECOGNIZE_A 0000060a +CSEG PFA_RECOGNIZE_A1 0000061a +CSEG VE_INTERPRET 0000061e +CSEG XT_INTERPRET 00000625 +CSEG PFA_INTERPRET 00000626 +CSEG PFA_INTERPRET2 00000636 +CSEG PFA_INTERPRET1 00000631 +CSEG XT_QSTACK 00003f8b +CSEG VE_DT_NUM 00000638 +CSEG XT_DT_NUM 0000063d +CSEG PFA_DT_NUM 0000063e +CSEG XT_LITERAL 00000772 +CSEG VE_DT_DNUM 00000641 +CSEG XT_DT_DNUM 00000647 +CSEG PFA_DT_DNUM 00000648 +CSEG XT_2LITERAL 00003fd7 +CSEG VE_REC_NUM 0000064b +CSEG XT_REC_NUM 00000651 +CSEG PFA_REC_NUM 00000652 +CSEG PFA_REC_NONUMBER 0000065d +CSEG PFA_REC_INTNUM2 0000065b +CSEG VE_REC_FIND 0000065f +CSEG XT_REC_FIND 00000665 +CSEG PFA_REC_FIND 00000666 +CSEG XT_FINDXT 00000700 +CSEG PFA_REC_WORD_FOUND 0000066e +CSEG XT_DT_XT 00000675 +CSEG VE_DT_XT 00000670 +CSEG PFA_DT_XT 00000676 +CSEG XT_R_WORD_INTERPRET 00000679 +CSEG XT_R_WORD_COMPILE 0000067d +CSEG PFA_R_WORD_INTERPRET 0000067a +CSEG PFA_R_WORD_COMPILE 0000067e +CSEG PFA_R_WORD_COMPILE1 00000683 +CSEG VE_DT_NULL 00000685 +CSEG PFA_DT_NULL 0000068c +CSEG XT_FAIL 0000068f +CSEG PFA_FAIL 00000690 +CSEG VE_SEARCH_WORDLIST 00000693 +CSEG XT_SEARCH_WORDLIST 0000069d +CSEG PFA_SEARCH_WORDLIST 0000069e +CSEG XT_ISWORD 000006b2 +CSEG XT_TRAVERSEWORDLIST 000006cf +CSEG PFA_SEARCH_WORDLIST1 000006ac +CSEG XT_NFA2CFA 000006f6 +CSEG PFA_ISWORD 000006b3 +CSEG XT_NAME2STRING 000006ea +CSEG PFA_ISWORD3 000006c0 +CSEG VE_TRAVERSEWORDLIST 000006c4 +CSEG PFA_TRAVERSEWORDLIST 000006d0 +CSEG PFA_TRAVERSEWORDLIST1 000006d1 +CSEG PFA_TRAVERSEWORDLIST2 000006e0 +CSEG XT_NFA2LFA 00000a0b +CSEG VE_NAME2STRING 000006e2 +CSEG PFA_NAME2STRING 000006eb +CSEG VE_NFA2CFA 000006f0 +CSEG PFA_NFA2CFA 000006f7 +CSEG VE_FINDXT 000006fa +CSEG PFA_FINDXT 00000701 +CSEG XT_FINDXTA 0000070c +ESEG CFG_ORDERLISTLEN 00000040 +CSEG PFA_FINDXT1 0000070b +CSEG PFA_FINDXTA 0000070d +CSEG PFA_FINDXTA1 00000719 +CSEG VE_NEWEST 0000071a +CSEG XT_NEWEST 0000071f +CSEG PFA_NEWEST 00000720 +DSEG ram_newest 000000e5 +CSEG VE_LATEST 00000721 +CSEG XT_LATEST 00000726 +CSEG PFA_LATEST 00000727 +DSEG ram_latest 000000e9 +CSEG VE_DOCREATE 00000728 +CSEG XT_DOCREATE 0000072e +CSEG PFA_DOCREATE 0000072f +CSEG XT_WLSCOPE 00000885 +CSEG XT_HEADER 0000086a +CSEG VE_BACKSLASH 00000739 +CSEG XT_BACKSLASH 0000073c +CSEG PFA_BACKSLASH 0000073d +CSEG VE_LPAREN 00000742 +CSEG XT_LPAREN 00000745 +CSEG PFA_LPAREN 00000746 +CSEG VE_COMPILE 0000074b +CSEG PFA_COMPILE 00000752 +CSEG VE_COMMA 00000759 +CSEG PFA_COMMA 0000075d +CSEG XT_DP 00003f12 +CSEG XT_STOREI 00003b73 +CSEG PFA_DP 00003f13 +CSEG VE_BRACKETTICK 00000764 +CSEG XT_BRACKETTICK 00000768 +CSEG PFA_BRACKETTICK 00000769 +CSEG VE_LITERAL 0000076c +CSEG PFA_LITERAL 00000773 +CSEG VE_SLITERAL 00000777 +CSEG XT_SLITERAL 0000077d +CSEG PFA_SLITERAL 0000077e +CSEG XT_GMARK 00000782 +CSEG PFA_GMARK 00000783 +CSEG XT_GRESOLVE 00000787 +CSEG PFA_GRESOLVE 00000788 +CSEG XT_LMARK 0000078d +CSEG PFA_LMARK 0000078e +CSEG XT_LRESOLVE 00000790 +CSEG PFA_LRESOLVE 00000791 +CSEG VE_AHEAD 00000794 +CSEG XT_AHEAD 00000799 +CSEG PFA_AHEAD 0000079a +CSEG VE_IF 0000079e +CSEG XT_IF 000007a1 +CSEG PFA_IF 000007a2 +CSEG VE_ELSE 000007a6 +CSEG XT_ELSE 000007aa +CSEG PFA_ELSE 000007ab +CSEG VE_THEN 000007b1 +CSEG XT_THEN 000007b5 +CSEG PFA_THEN 000007b6 +CSEG VE_BEGIN 000007b8 +CSEG XT_BEGIN 000007bd +CSEG PFA_BEGIN 000007be +CSEG VE_WHILE 000007c0 +CSEG XT_WHILE 000007c5 +CSEG PFA_WHILE 000007c6 +CSEG VE_REPEAT 000007c9 +CSEG XT_REPEAT 000007ce +CSEG PFA_REPEAT 000007cf +CSEG XT_AGAIN 000007e2 +CSEG VE_UNTIL 000007d2 +CSEG XT_UNTIL 000007d7 +CSEG PFA_UNTIL 000007d8 +CSEG VE_AGAIN 000007dd +CSEG PFA_AGAIN 000007e3 +CSEG VE_DO 000007e7 +CSEG XT_DO 000007ea +CSEG PFA_DO 000007eb +CSEG XT_TO_L 00000845 +CSEG VE_LOOP 000007f1 +CSEG XT_LOOP 000007f5 +CSEG PFA_LOOP 000007f6 +CSEG XT_ENDLOOP 0000082c +CSEG VE_PLUSLOOP 000007fa +CSEG XT_PLUSLOOP 000007ff +CSEG PFA_PLUSLOOP 00000800 +CSEG VE_LEAVE 00000804 +CSEG XT_LEAVE 00000809 +CSEG PFA_LEAVE 0000080a +CSEG VE_QDO 0000080f +CSEG XT_QDO 00000813 +CSEG PFA_QDO 00000814 +CSEG PFA_QDOCHECK 0000081c +CSEG PFA_QDOCHECK1 00000823 +CSEG XT_INVERT 000039fd +CSEG VE_ENDLOOP 00000826 +CSEG PFA_ENDLOOP 0000082d +CSEG LOOP1 0000082e +CSEG XT_L_FROM 00000839 +CSEG LOOP2 00000835 +CSEG VE_L_FROM 00000836 +CSEG PFA_L_FROM 0000083a +CSEG XT_LP 00000858 +CSEG VE_TO_L 00000842 +CSEG PFA_TO_L 00000846 +CSEG VE_LP0 0000084d +CSEG XT_LP0 00000851 +CSEG PFA_LP0 00000852 +ESEG CFG_LP0 00000036 +CSEG VE_LP 00000855 +CSEG PFA_LP 00000859 +DSEG ram_lp 000000eb +CSEG VE_CREATE 0000085a +CSEG XT_CREATE 0000085f +CSEG PFA_CREATE 00000860 +CSEG XT_REVEAL 0000088e +CSEG VE_HEADER 00000865 +CSEG PFA_HEADER 0000086b +CSEG PFA_HEADER1 0000087c +CSEG VE_WLSCOPE 0000087f +CSEG PFA_WLSCOPE 00000886 +ESEG CFG_WLSCOPE 00000032 +CSEG VE_REVEAL 00000889 +CSEG PFA_REVEAL 0000088f +CSEG REVEAL1 00000899 +CSEG XT_STOREE 00003b3b +CSEG VE_DOES 0000089a +CSEG XT_DOES 0000089f +CSEG PFA_DOES 000008a0 +CSEG XT_DODOES 000008b2 +CSEG DO_DODOES 000008a7 +CSEG PFA_DODOES 000008b3 +CSEG VE_COLON 000008bb +CSEG XT_COLON 000008be +CSEG PFA_COLON 000008bf +CSEG XT_COLONNONAME 000008c9 +CSEG VE_COLONNONAME 000008c3 +CSEG PFA_COLONNONAME 000008ca +CSEG XT_RBRACKET 000008de +CSEG VE_SEMICOLON 000008d2 +CSEG XT_SEMICOLON 000008d5 +CSEG PFA_SEMICOLON 000008d6 +CSEG XT_LBRACKET 000008e6 +CSEG VE_RBRACKET 000008db +CSEG PFA_RBRACKET 000008df +CSEG VE_LBRACKET 000008e3 +CSEG PFA_LBRACKET 000008e7 +CSEG VE_VARIABLE 000008eb +CSEG XT_VARIABLE 000008f1 +CSEG PFA_VARIABLE 000008f2 +CSEG XT_CONSTANT 000008fd +CSEG XT_ALLOT 00003f2c +CSEG VE_CONSTANT 000008f7 +CSEG PFA_CONSTANT 000008fe +CSEG VE_USER 00000904 +CSEG XT_USER 00000908 +CSEG PFA_USER 00000909 +CSEG VE_RECURSE 0000090f +CSEG XT_RECURSE 00000915 +CSEG PFA_RECURSE 00000916 +CSEG VE_IMMEDIATE 0000091a +CSEG XT_IMMEDIATE 00000921 +CSEG PFA_IMMEDIATE 00000922 +CSEG XT_GET_CURRENT 000009c3 +CSEG VE_BRACKETCHAR 0000092c +CSEG XT_BRACKETCHAR 00000931 +CSEG PFA_BRACKETCHAR 00000932 +CSEG VE_ABORTQUOTE 00000937 +CSEG XT_ABORTQUOTE 0000093c +CSEG PFA_ABORTQUOTE 0000093d +CSEG XT_SQUOTE 00003e8a +CSEG XT_QABORT 0000094e +CSEG VE_ABORT 00000941 +CSEG XT_ABORT 00000946 +CSEG PFA_ABORT 00000947 +CSEG VE_QABORT 00000949 +CSEG PFA_QABORT 0000094f +CSEG QABO1 00000954 +CSEG VE_GET_STACK 00000956 +CSEG XT_GET_STACK 0000095d +CSEG PFA_N_FETCH_E2 00000974 +CSEG PFA_N_FETCH_E1 0000096a +CSEG XT_CELLS 00003ec4 +CSEG VE_SET_STACK 00000977 +CSEG XT_SET_STACK 0000097e +CSEG PFA_SET_STACK 0000097f +CSEG PFA_SET_STACK0 00000986 +CSEG PFA_SET_STACK2 00000993 +CSEG PFA_SET_STACK1 0000098e +CSEG VE_MAPSTACK 00000995 +CSEG PFA_MAPSTACK 0000099d +CSEG PFA_MAPSTACK3 000009b8 +CSEG PFA_MAPSTACK1 000009a7 +CSEG PFA_MAPSTACK2 000009b4 +CSEG VE_GET_CURRENT 000009bb +CSEG PFA_GET_CURRENT 000009c4 +ESEG CFG_CURRENT 0000003c +CSEG VE_GET_ORDER 000009c8 +CSEG XT_GET_ORDER 000009cf +CSEG PFA_GET_ORDER 000009d0 +CSEG VE_CFG_ORDER 000009d4 +CSEG XT_CFG_ORDER 000009db +CSEG PFA_CFG_ORDER 000009dc +CSEG VE_COMPARE 000009dd +CSEG XT_COMPARE 000009e3 +CSEG PFA_COMPARE 000009e4 +CSEG PFA_COMPARE_LOOP 000009f0 +CSEG PFA_COMPARE_NOTEQUAL 000009fe +CSEG PFA_COMPARE_ENDREACHED2 000009f9 +CSEG PFA_COMPARE_ENDREACHED 000009fa +CSEG PFA_COMPARE_CHECKLASTCHAR 000009fe +CSEG PFA_COMPARE_DONE 00000a00 +CSEG VE_NFA2LFA 00000a05 +CSEG PFA_NFA2LFA 00000a0c +CSEG VE_DOTS 00000a11 +CSEG XT_DOTS 00000a14 +CSEG PFA_DOTS 00000a15 +CSEG XT_UDOT 00003e0a +CSEG PFA_DOTS2 00000a23 +CSEG PFA_DOTS1 00000a1e +CSEG XT_PICK 00003c84 +CSEG VE_SPIRW 00000a24 +CSEG XT_SPIRW 00000a29 +CSEG PFA_SPIRW 00000a2a +CSEG do_spirw 00000a2e +CSEG do_spirw1 00000a2f +CSEG VE_N_SPIR 00000a37 +CSEG XT_N_SPIR 00000a3c +CSEG PFA_N_SPIR 00000a3d +CSEG PFA_N_SPIR_LOOP 00000a42 +CSEG PFA_N_SPIR_LOOP1 00000a43 +CSEG VE_N_SPIW 00000a4e +CSEG XT_N_SPIW 00000a53 +CSEG PFA_N_SPIW 00000a54 +CSEG PFA_N_SPIW_LOOP 00000a59 +CSEG PFA_N_SPIW_LOOP1 00000a5b +CSEG VE_APPLTURNKEY 00000a65 +CSEG XT_APPLTURNKEY 00000a6d +CSEG PFA_APPLTURNKEY 00000a6e +CSEG XT_INTON 00003c97 +CSEG XT_F_CPU 00003eac +CSEG VE_SET_CURRENT 00000a7f +CSEG XT_SET_CURRENT 00000a87 +CSEG PFA_SET_CURRENT 00000a88 +CSEG VE_WORDLIST 00000a8c +CSEG XT_WORDLIST 00000a92 +CSEG PFA_WORDLIST 00000a93 +CSEG XT_EHERE 00003f1b +CSEG PFA_EHERE 00003f1c +CSEG VE_FORTHWORDLIST 00000a9c +CSEG XT_FORTHWORDLIST 00000aa5 +CSEG PFA_FORTHWORDLIST 00000aa6 +ESEG CFG_FORTHWORDLIST 0000003e +CSEG VE_SET_ORDER 00000aa7 +CSEG XT_SET_ORDER 00000aae +CSEG PFA_SET_ORDER 00000aaf +CSEG VE_SET_RECOGNIZERS 00000ab3 +CSEG XT_SET_RECOGNIZERS 00000abd +CSEG PFA_SET_RECOGNIZERS 00000abe +ESEG CFG_RECOGNIZERLISTLEN 00000052 +CSEG VE_GET_RECOGNIZERS 00000ac2 +CSEG XT_GET_RECOGNIZERS 00000acc +CSEG PFA_GET_RECOGNIZERS 00000acd +CSEG VE_CODE 00000ad1 +CSEG XT_CODE 00000ad5 +CSEG PFA_CODE 00000ad6 +CSEG VE_ENDCODE 00000adc +CSEG XT_ENDCODE 00000ae2 +CSEG PFA_ENDCODE 00000ae3 +CSEG VE_MARKER 00000ae8 +CSEG XT_MARKER 00000aee +CSEG PFA_MARKER 00000aef +ESEG EE_MARKER 0000005e +CSEG VE_POSTPONE 00000af2 +CSEG XT_POSTPONE 00000af8 +CSEG PFA_POSTPONE 00000af9 +CSEG VE_2R_FETCH 00000b07 +CSEG XT_2R_FETCH 00000b0b +CSEG PFA_2R_FETCH 00000b0c +SET DPSTART 00000b1b +CSEG DO_INTERRUPT 00003814 +CSEG DO_EXECUTE 0000380d +CSEG XT_ISREXEC 00003cc0 +CSEG VE_EXIT 0000381c +CSEG PFA_EXIT 00003821 +CSEG VE_EXECUTE 00003824 +CSEG PFA_EXECUTE 0000382b +CSEG PFA_DOBRANCH 00003830 +CSEG PFA_DOCONDBRANCH 00003837 +CSEG PFA_DOLITERAL 0000383e +CSEG XT_DOVARIABLE 00003847 +CSEG XT_DOCONSTANT 00003851 +CSEG XT_DOUSER 00003857 +CSEG VE_DOVALUE 00003863 +CSEG XT_DOVALUE 00003869 +CSEG PFA_DOVALUE 0000386a +CSEG VE_FETCH 00003876 +CSEG PFA_FETCH 0000387a +CSEG PFA_FETCHRAM 0000387a +CSEG VE_STORE 0000387e +CSEG PFA_STORE 00003882 +CSEG PFA_STORERAM 00003882 +CSEG VE_CSTORE 0000388a +CSEG PFA_CSTORE 0000388e +CSEG VE_CFETCH 00003895 +CSEG PFA_CFETCH 00003899 +CSEG VE_FETCHU 0000389d +CSEG XT_FETCHU 000038a0 +CSEG PFA_FETCHU 000038a1 +CSEG VE_STOREU 000038a5 +CSEG XT_STOREU 000038a8 +CSEG PFA_STOREU 000038a9 +CSEG VE_DUP 000038ad +CSEG PFA_DUP 000038b2 +CSEG VE_QDUP 000038b5 +CSEG PFA_QDUP 000038ba +CSEG PFA_QDUP1 000038bf +CSEG VE_SWAP 000038c0 +CSEG PFA_SWAP 000038c5 +CSEG VE_OVER 000038cb +CSEG PFA_OVER 000038d0 +CSEG VE_DROP 000038d5 +CSEG PFA_DROP 000038da +CSEG VE_ROT 000038dd +CSEG PFA_ROT 000038e2 +CSEG VE_NIP 000038ec +CSEG PFA_NIP 000038f1 +CSEG VE_R_FROM 000038f3 +CSEG PFA_R_FROM 000038f7 +CSEG VE_TO_R 000038fc +CSEG PFA_TO_R 00003900 +CSEG VE_R_FETCH 00003905 +CSEG PFA_R_FETCH 00003909 +CSEG VE_NOTEQUAL 00003910 +CSEG PFA_NOTEQUAL 00003914 +CSEG VE_ZEROEQUAL 00003917 +CSEG PFA_ZEROEQUAL 0000391b +CSEG PFA_ZERO1 00003957 +CSEG PFA_TRUE1 0000394e +CSEG VE_ZEROLESS 0000391e +CSEG PFA_ZEROLESS 00003922 +CSEG VE_GREATERZERO 00003925 +CSEG PFA_GREATERZERO 00003929 +CSEG VE_DGREATERZERO 0000392e +CSEG XT_DGREATERZERO 00003932 +CSEG PFA_DGREATERZERO 00003933 +CSEG VE_DXT_ZEROLESS 0000393c +CSEG XT_DXT_ZEROLESS 00003940 +CSEG PFA_DXT_ZEROLESS 00003941 +CSEG VE_TRUE 00003947 +CSEG PFA_TRUE 0000394c +CSEG VE_ZERO 00003951 +CSEG PFA_ZERO 00003955 +CSEG VE_ULESS 00003959 +CSEG PFA_ULESS 0000395d +CSEG VE_UGREATER 00003964 +CSEG PFA_UGREATER 00003968 +CSEG VE_LESS 0000396b +CSEG PFA_LESS 0000396f +CSEG PFA_LESSDONE 00003973 +CSEG VE_GREATER 00003975 +CSEG PFA_GREATER 00003979 +CSEG PFA_GREATERDONE 0000397d +CSEG VE_LOG2 00003980 +CSEG XT_LOG2 00003984 +CSEG PFA_LOG2 00003985 +CSEG PFA_LOG2_1 00003988 +CSEG PFA_LOG2_2 0000398e +CSEG VE_MINUS 00003990 +CSEG PFA_MINUS 00003994 +CSEG VE_PLUS 0000399a +CSEG PFA_PLUS 0000399e +CSEG VE_MSTAR 000039a3 +CSEG PFA_MSTAR 000039a7 +CSEG VE_UMSLASHMOD 000039bd +CSEG PFA_UMSLASHMOD 000039c3 +CSEG PFA_UMSLASHMODmod 000039c8 +CSEG PFA_UMSLASHMODmod_loop 000039c9 +CSEG PFA_UMSLASHMODmod_loop_control 000039d6 +CSEG PFA_UMSLASHMODmod_subtract 000039d3 +CSEG PFA_UMSLASHMODmod_done 000039d8 +CSEG VE_UMSTAR 000039dc +CSEG PFA_UMSTAR 000039e1 +CSEG VE_INVERT 000039f8 +CSEG PFA_INVERT 000039fe +CSEG VE_2SLASH 00003a01 +CSEG PFA_2SLASH 00003a05 +CSEG VE_2STAR 00003a08 +CSEG PFA_2STAR 00003a0c +CSEG VE_AND 00003a0f +CSEG PFA_AND 00003a14 +CSEG VE_OR 00003a19 +CSEG PFA_OR 00003a1d +CSEG VE_XOR 00003a22 +CSEG XT_XOR 00003a26 +CSEG PFA_XOR 00003a27 +CSEG VE_1PLUS 00003a2c +CSEG PFA_1PLUS 00003a30 +CSEG VE_1MINUS 00003a32 +CSEG PFA_1MINUS 00003a36 +CSEG VE_QNEGATE 00003a38 +CSEG XT_QNEGATE 00003a3e +CSEG PFA_QNEGATE 00003a3f +CSEG QNEG1 00003a43 +CSEG VE_LSHIFT 00003a44 +CSEG XT_LSHIFT 00003a49 +CSEG PFA_LSHIFT 00003a4a +CSEG PFA_LSHIFT1 00003a4d +CSEG PFA_LSHIFT2 00003a52 +CSEG VE_RSHIFT 00003a53 +CSEG XT_RSHIFT 00003a58 +CSEG PFA_RSHIFT 00003a59 +CSEG PFA_RSHIFT1 00003a5c +CSEG PFA_RSHIFT2 00003a61 +CSEG VE_PLUSSTORE 00003a62 +CSEG PFA_PLUSSTORE 00003a66 +CSEG VE_RP_FETCH 00003a72 +CSEG PFA_RP_FETCH 00003a77 +CSEG VE_RP_STORE 00003a7c +CSEG XT_RP_STORE 00003a80 +CSEG PFA_RP_STORE 00003a81 +CSEG VE_SP_FETCH 00003a89 +CSEG PFA_SP_FETCH 00003a8e +CSEG VE_SP_STORE 00003a92 +CSEG XT_SP_STORE 00003a96 +CSEG PFA_SP_STORE 00003a97 +CSEG PFA_DODO 00003a9c +CSEG PFA_DODO1 00003a9e +CSEG VE_I 00003aa9 +CSEG PFA_I 00003aad +CSEG PFA_DOPLUSLOOP 00003abb +CSEG PFA_DOPLUSLOOP_LEAVE 00003ac5 +CSEG PFA_DOPLUSLOOP_NEXT 00003ac2 +CSEG PFA_DOLOOP 00003aca +CSEG VE_UNLOOP 00003acf +CSEG PFA_UNLOOP 00003ad5 +CSEG VE_CMOVE_G 00003ada +CSEG XT_CMOVE_G 00003adf +CSEG PFA_CMOVE_G 00003ae0 +CSEG PFA_CMOVE_G1 00003af1 +CSEG PFA_CMOVE_G2 00003aed +CSEG VE_BYTESWAP 00003af6 +CSEG PFA_BYTESWAP 00003afa +CSEG VE_UP_FETCH 00003afe +CSEG PFA_UP_FETCH 00003b03 +CSEG VE_UP_STORE 00003b07 +CSEG XT_UP_STORE 00003b0b +CSEG PFA_UP_STORE 00003b0c +CSEG VE_1MS 00003b10 +CSEG XT_1MS 00003b14 +CSEG PFA_1MS 00003b15 +CSEG VE_2TO_R 00003b1a +CSEG PFA_2TO_R 00003b1f +CSEG VE_2R_FROM 00003b29 +CSEG PFA_2R_FROM 00003b2e +CSEG VE_STOREE 00003b38 +CSEG PFA_STOREE 00003b3c +CSEG PFA_STOREE0 00003b3c +CSEG PFA_FETCHE2 00003b6a +CSEG PFA_STOREE3 00003b46 +CSEG PFA_STOREE1 00003b51 +CSEG PFA_STOREE4 00003b4d +CSEG PFA_STOREE2 00003b53 +CSEG VE_FETCHE 00003b5c +CSEG PFA_FETCHE 00003b60 +CSEG PFA_FETCHE1 00003b60 +CSEG VE_STOREI 00003b70 +CSEG PFA_STOREI 00003b74 +ESEG EE_STOREI 0000005c +CSEG VE_DO_STOREI_NRWW 00003b77 +CSEG XT_DO_STOREI 00003b7e +CSEG PFA_DO_STOREI_NRWW 00003b7f +CSEG DO_STOREI_atmega 00003b93 +CSEG pageload 00003ba4 +CSEG DO_STOREI_writepage 00003b9d +CSEG dospm 00003bbd +EQU pagemask ffffffc0 +CSEG pageload_loop 00003baa +CSEG pageload_newdata 00003bb5 +CSEG pageload_cont 00003bb7 +CSEG pageload_done 00003bbc +CSEG dospm_wait_ee 00003bbd +CSEG dospm_wait_spm 00003bbf +CSEG VE_FETCHI 00003bc8 +CSEG PFA_FETCHI 00003bcc +CSEG VE_N_TO_R 00003bd2 +CSEG XT_N_TO_R 00003bd6 +CSEG PFA_N_TO_R 00003bd7 +CSEG PFA_N_TO_R1 00003bd9 +CSEG VE_N_R_FROM 00003be4 +CSEG XT_N_R_FROM 00003be8 +CSEG PFA_N_R_FROM 00003be9 +CSEG PFA_N_R_FROM1 00003bee +CSEG VE_D2STAR 00003bf6 +CSEG XT_D2STAR 00003bfa +CSEG PFA_D2STAR 00003bfb +CSEG VE_D2SLASH 00003c04 +CSEG XT_D2SLASH 00003c08 +CSEG PFA_D2SLASH 00003c09 +CSEG VE_DPLUS 00003c12 +CSEG PFA_DPLUS 00003c16 +CSEG VE_DMINUS 00003c23 +CSEG XT_DMINUS 00003c26 +CSEG PFA_DMINUS 00003c27 +CSEG VE_DINVERT 00003c35 +CSEG PFA_DINVERT 00003c3c +CSEG VE_SLASHMOD 00003c45 +CSEG XT_SLASHMOD 00003c49 +CSEG PFA_SLASHMOD 00003c4a +CSEG PFA_SLASHMOD_1 00003c55 +CSEG PFA_SLASHMOD_2 00003c5b +CSEG PFA_SLASHMOD_3 00003c5e +CSEG PFA_SLASHMOD_5 00003c69 +CSEG PFA_SLASHMOD_4 00003c68 +CSEG PFA_SLASHMODmod_done 00003c74 +CSEG PFA_SLASHMOD_6 00003c72 +CSEG VE_ABS 00003c78 +CSEG XT_ABS 00003c7c +CSEG PFA_ABS 00003c7d +CSEG VE_PICK 00003c80 +CSEG PFA_PICK 00003c85 +CSEG VE_CELLPLUS 00003c8b +CSEG PFA_CELLPLUS 00003c91 +CSEG VE_INTON 00003c93 +CSEG PFA_INTON 00003c98 +CSEG VE_INTOFF 00003c9a +CSEG XT_INTOFF 00003c9e +CSEG PFA_INTOFF 00003c9f +CSEG VE_INTSTORE 00003ca1 +CSEG PFA_INTSTORE 00003ca6 +CSEG VE_INTFETCH 00003cab +CSEG XT_INTFETCH 00003caf +CSEG PFA_INTFETCH 00003cb0 +CSEG VE_INTTRAP 00003cb5 +CSEG XT_INTTRAP 00003cbb +CSEG PFA_INTTRAP 00003cbc +CSEG PFA_ISREXEC 00003cc1 +CSEG XT_ISREND 00003cc5 +CSEG PFA_ISREND 00003cc6 +CSEG PFA_ISREND1 00003cc8 +CSEG XT_DEFAULT_PROMPTOK 00003cc9 +CSEG PFA_DEFAULT_PROMPTOK 00003cca +CSEG VE_PROMPTOK 00003cd0 +CSEG XT_PROMPTOK 00003cd4 +CSEG PFA_PROMPTOK 00003cd5 +CSEG XT_DEFAULT_PROMPTREADY 00003cd8 +CSEG PFA_DEFAULT_PROMPTREADY 00003cd9 +CSEG VE_PROMPTREADY 00003cdf +CSEG XT_PROMPTREADY 00003ce4 +CSEG PFA_PROMPTREADY 00003ce5 +CSEG XT_DEFAULT_PROMPTERROR 00003ce8 +CSEG PFA_DEFAULT_PROMPTERROR 00003ce9 +CSEG VE_PROMPTERROR 00003cfa +CSEG XT_PROMPTERROR 00003cff +CSEG PFA_PROMPTERROR 00003d00 +CSEG VE_QUIT 00003d03 +CSEG XT_QUIT 00003d07 +CSEG PFA_QUIT 00003d08 +CSEG PFA_QUIT2 00003d10 +CSEG PFA_QUIT4 00003d16 +CSEG PFA_QUIT3 00003d28 +CSEG XT_CATCH 00003d70 +CSEG PFA_QUIT5 00003d26 +CSEG VE_PAUSE 00003d2b +CSEG PFA_PAUSE 00003d31 +DSEG ram_pause 000000ed +CSEG XT_RDEFERFETCH 00003db4 +CSEG XT_RDEFERSTORE 00003dbe +CSEG VE_COLD 00003d34 +CSEG clearloop 00003d40 +DSEG ram_user1 000000ef +CSEG PFA_WARM 00003d5a +CSEG VE_WARM 00003d55 +CSEG XT_WARM 00003d59 +CSEG XT_DEFERSTORE 00003ddf +CSEG XT_TURNKEY 00003f5c +CSEG VE_HANDLER 00003d63 +CSEG XT_HANDLER 00003d69 +CSEG PFA_HANDLER 00003d6a +CSEG VE_CATCH 00003d6b +CSEG PFA_CATCH 00003d71 +CSEG VE_THROW 00003d81 +CSEG PFA_THROW 00003d87 +CSEG PFA_THROW1 00003d8d +CSEG VE_EDEFERFETCH 00003d9a +CSEG PFA_EDEFERFETCH 00003da1 +CSEG VE_EDEFERSTORE 00003da4 +CSEG PFA_EDEFERSTORE 00003dab +CSEG VE_RDEFERFETCH 00003dae +CSEG PFA_RDEFERFETCH 00003db5 +CSEG VE_RDEFERSTORE 00003db8 +CSEG PFA_RDEFERSTORE 00003dbf +CSEG VE_UDEFERFETCH 00003dc2 +CSEG PFA_UDEFERFETCH 00003dc9 +CSEG VE_UDEFERSTORE 00003dce +CSEG PFA_UDEFERSTORE 00003dd5 +CSEG VE_DEFERSTORE 00003dda +CSEG PFA_DEFERSTORE 00003de0 +CSEG VE_DEFERFETCH 00003de7 +CSEG XT_DEFERFETCH 00003dec +CSEG PFA_DEFERFETCH 00003ded +CSEG VE_DODEFER 00003df3 +CSEG XT_DODEFER 00003df9 +CSEG PFA_DODEFER 00003dfa +CSEG VE_UDOT 00003e07 +CSEG PFA_UDOT 00003e0b +CSEG VE_UDOTR 00003e0e +CSEG XT_UDOTR 00003e12 +CSEG PFA_UDOTR 00003e13 +CSEG VE_USLASHMOD 00003e17 +CSEG XT_USLASHMOD 00003e1c +CSEG PFA_USLASHMOD 00003e1d +CSEG VE_NEGATE 00003e22 +CSEG PFA_NEGATE 00003e28 +CSEG VE_SLASH 00003e2b +CSEG XT_SLASH 00003e2e +CSEG PFA_SLASH 00003e2f +CSEG VE_MOD 00003e32 +CSEG XT_MOD 00003e36 +CSEG PFA_MOD 00003e37 +CSEG VE_MIN 00003e3a +CSEG XT_MIN 00003e3e +CSEG PFA_MIN 00003e3f +CSEG PFA_MIN1 00003e44 +CSEG VE_MAX 00003e46 +CSEG XT_MAX 00003e4a +CSEG PFA_MAX 00003e4b +CSEG PFA_MAX1 00003e50 +CSEG VE_WITHIN 00003e52 +CSEG PFA_WITHIN 00003e58 +CSEG VE_SHOWWORDLIST 00003e5f +CSEG XT_SHOWWORDLIST 00003e68 +CSEG PFA_SHOWWORDLIST 00003e69 +CSEG XT_SHOWWORD 00003e6e +CSEG PFA_SHOWWORD 00003e6f +CSEG VE_WORDS 00003e74 +CSEG XT_WORDS 00003e79 +CSEG PFA_WORDS 00003e7a +CSEG VE_DOTSTRING 00003e7f +CSEG XT_DOTSTRING 00003e82 +CSEG PFA_DOTSTRING 00003e83 +CSEG VE_SQUOTE 00003e87 +CSEG PFA_SQUOTE 00003e8b +CSEG PFA_SQUOTE1 00003e93 +CSEG VE_FILL 00003e94 +CSEG PFA_FILL 00003e99 +CSEG PFA_FILL2 00003ea5 +CSEG PFA_FILL1 00003ea0 +CSEG VE_F_CPU 00003ea7 +CSEG PFA_F_CPU 00003ead +CSEG VE_STATE 00003eb2 +CSEG PFA_STATE 00003eb8 +DSEG ram_state 0000011b +CSEG VE_BASE 00003eb9 +CSEG PFA_BASE 00003ebe +CSEG VE_CELLS 00003ebf +CSEG VE_2DUP 00003ec5 +CSEG PFA_2DUP 00003eca +CSEG VE_2DROP 00003ecd +CSEG PFA_2DROP 00003ed3 +CSEG VE_TUCK 00003ed6 +CSEG PFA_TUCK 00003edb +CSEG VE_TO_IN 00003ede +CSEG PFA_TO_IN 00003ee3 +CSEG VE_PAD 00003ee4 +CSEG PFA_PAD 00003ee9 +CSEG VE_EMIT 00003eee +CSEG PFA_EMIT 00003ef3 +CSEG VE_EMITQ 00003ef6 +CSEG XT_EMITQ 00003efb +CSEG PFA_EMITQ 00003efc +CSEG VE_KEY 00003eff +CSEG PFA_KEY 00003f04 +CSEG VE_KEYQ 00003f07 +CSEG XT_KEYQ 00003f0b +CSEG PFA_KEYQ 00003f0c +CSEG VE_DP 00003f0f +ESEG CFG_DP 0000002c +CSEG VE_EHERE 00003f16 +ESEG EE_EHERE 00000030 +CSEG VE_HERE 00003f1f +CSEG PFA_HERE 00003f24 +ESEG EE_HERE 0000002e +CSEG VE_ALLOT 00003f27 +CSEG PFA_ALLOT 00003f2d +CSEG VE_BIN 00003f32 +CSEG XT_BIN 00003f36 +CSEG PFA_BIN 00003f37 +CSEG VE_DECIMAL 00003f3b +CSEG PFA_DECIMAL 00003f42 +CSEG VE_HEX 00003f47 +CSEG XT_HEX 00003f4b +CSEG PFA_HEX 00003f4c +CSEG VE_BL 00003f51 +CSEG PFA_BL 00003f55 +CSEG VE_TURNKEY 00003f56 +CSEG PFA_TURNKEY 00003f5d +ESEG CFG_TURNKEY 00000038 +CSEG VE_TOUPPER 00003f60 +CSEG PFA_TOUPPER 00003f67 +CSEG PFA_TOUPPER0 00003f72 +CSEG VE_TOLOWER 00003f73 +CSEG XT_TOLOWER 00003f79 +CSEG PFA_TOLOWER 00003f7a +CSEG PFA_TOLOWER0 00003f85 +CSEG VE_QSTACK 00003f86 +CSEG PFA_QSTACK 00003f8c +CSEG PFA_QSTACK1 00003f93 +CSEG VE_BOUNDS 00003f94 +CSEG PFA_BOUNDS 00003f9a +CSEG VE_CR 00003f9e +CSEG PFA_CR 00003fa2 +CSEG VE_SPACE 00003fa9 +CSEG PFA_SPACE 00003faf +CSEG VE_SPACES 00003fb2 +CSEG PFA_SPACES 00003fb8 +CSEG SPCS1 00003fba +CSEG SPCS2 00003fc1 +CSEG VE_S2D 00003fc3 +CSEG PFA_S2D 00003fc8 +CSEG VE_TO_BODY 00003fcb +CSEG VE_2LITERAL 00003fd1 +CSEG PFA_2LITERAL 00003fd8 +CSEG VE_EQUAL 00003fdc +CSEG PFA_EQUAL 00003fe0 +CSEG VE_ONE 00003fe3 +CSEG PFA_ONE 00003fe7 +CSEG VE_TWO 00003fe8 +CSEG PFA_TWO 00003fec +CSEG VE_MINUSONE 00003fed +CSEG XT_MINUSONE 00003ff0 +CSEG PFA_MINUSONE 00003ff1 +SET flashlast 00003ff2 +DSEG HERESTART 0000011d +ESEG EHERESTART 00000084 +ESEG CFG_ORDERLIST 00000042 +ESEG CFG_RECOGNIZERLIST 00000054 +EQU UBRR_VAL 0000000c +EQU BAUD_REAL 0000963d +EQU BAUD_ERROR 00000001 diff --git a/amforth-6.5/appl/eval-pollin/p32-8.xml b/amforth-6.5/appl/eval-pollin/p32-8.xml new file mode 100644 index 0000000..1fa114a --- /dev/null +++ b/amforth-6.5/appl/eval-pollin/p32-8.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + Uploading Hexfiles for p32-8 + + + + Writing fuses + + + + diff --git a/amforth-6.5/appl/eval-pollin/p328-16.eep.hex b/amforth-6.5/appl/eval-pollin/p328-16.eep.hex new file mode 100644 index 0000000..ae05b64 --- /dev/null +++ b/amforth-6.5/appl/eval-pollin/p328-16.eep.hex @@ -0,0 +1,7 @@ +:10003400FFFF260BC2018E00CE095C00B008780ACF +:0A004400FF024800ED3F01004800F4 +:06005C00020070065C06C4 +:100066007E3B680000000000FF08AF08AF080000F4 +:100076000A00A300B1007800930077020000640232 +:08008600C93CE83CD83C19001C +:00000001FF diff --git a/amforth-6.5/appl/eval-pollin/p328-16.hex b/amforth-6.5/appl/eval-pollin/p328-16.hex new file mode 100644 index 0000000..b754f68 --- /dev/null +++ b/amforth-6.5/appl/eval-pollin/p328-16.hex @@ -0,0 +1,633 @@ +:020000020000FC +:0200040026D103 +:0200080024D101 +:02000C0022D1FF +:0200100020D1FD +:020014001ED1FB +:020018001CD1F9 +:02001C001AD1F7 +:0200200018D1F5 +:0200240016D1F3 +:0200280014D1F1 +:02002C0012D1EF +:0200300010D1ED +:020034000ED1EB +:020038000CD1E9 +:02003C000AD1E7 +:0200400008D1E5 +:0200440006D1E3 +:0200480004D1E1 +:02004C0002D1DF +:0200500000D1DD +:02005400FED0DC +:02005800FCD0DA +:02005C00FAD0D8 +:02006000F8D0D6 +:10006400F6D00008000400701A000A0041546D65BF +:1000740067613332385007FF3E72782D627566002F +:1000840000004400082F10911001E0E0F1E0E10FBE +:10009400F31D008313951F7010931001899199919A +:1000A4000C94053806FF6973722D72783D0001388F +:1000B4003D38C6009838B1383D380300DF3F363844 +:1000C4006400383D4300203801383D3859003D383C +:1000D4002400A53C3D3800013D3816005439983EB3 +:1000E400203806FF72782D6275665400013893003B +:1000F400363879003D3811019838B1383D3800015F +:100104009D399838C4382F3A3D380F00133A3D389A +:1001140011018D38203807FF72783F2D6275660013 +:1001240073000138303D3D38110198383D381001D5 +:1001340098381339203807FF74782D706F6C6C0071 +:100144008D000138B1003638A4003D38C6008D3822 +:10015400203808FF74783F2D706F6C6C9D00013857 +:10016400303D3D38C00098383D382000133A2038DF +:1001740004FF75627272AB006F388C00A03DAA3D1B +:1001840006FF2B7573617274BA0001383D3898000C +:100194003D38C1008D383D3806003D38C2008D38E9 +:1001A400BE00B138F93A3D38C5008D383D38C40039 +:1001B4008D386600203808FF31772E7265736574B8 +:1001C400C200E4009A938A93249A2C98E0E8F7E01A +:1001D4003197F1F71FB7F8942C9A2498E0E0F1E0F6 +:1001E4003197F1F783B184FF9FEF1FBF24982C98B8 +:1001F400E0E8F6E03197F1F7892F0C94053807FF12 +:1002040031772E736C6F7400DD0008012C98249AEA +:100214001FB7F894E8E1F0E03197F1F788948795F7 +:1002240010F42C9A2498E4E2F0E03197F1F703B14A +:1002340004FD8068ECECF0E03197F1F72C9A2498F7 +:0E024400E8E0F0E03197F1F71FBF0C940538A9 +:040000000C94393DE6 +:100252000A920FB60A920F900F900A94B02CFF9355 +:10026200EF93E2E1F1E00694E00DF31D00800394C8 +:100272000082EF91FF9109900FBE0990089502FF4D +:100282006D2B01010138C73F153C203803FF75640F +:100292002A0040010138B138FF38E039D938C43872 +:1002A200F638E039E1389D39203804FF756D617800 +:1002B20047010138C93E5C3936386001C438D93843 +:1002C200203804FF756D696E56010138C93E6739E1 +:1002D20036386C01C438D938203801383D380080AE +:1002E200133A1A3936387701E63F20384B3920382D +:1002F2000AFF6E616D653E666C616773620101386B +:10030200CB3B3D3800FF133A203803FF766572007D +:1003120079010138DA020304AE3FBD3E7938E802C2 +:10032200413FC73F210329033D382E0012033F03FB +:100332004A033904BD3E8138AE3FF002030420383F +:1003420004FF6E6F6F7086010138203806FF756EEC +:1003520075736564A10101388D3A233F93392038C2 +:100362000200746FA70101384804D03FB73E7938C4 +:100372003638C5015C07BF01670720380138F638F7 +:10038200B138D101FF38CB3BB138D101D101CB3BE0 +:100392002A38203807FF692D63656C6C2B00B10188 +:1003A20001382F3A203808FF69636F6D70617265FA +:1003B200CB010138FF38CF38F63813393638E5012A +:1003C200D23ED9384B392038C43854392608363809 +:1003D20008029B3ACF387938CF38CB3BB1383D3819 +:1003E20000015C393638F901C4383D38FF00133A50 +:1003F200133936380002D23E4B39D43A20382F3ADC +:10040200C438903CC4383D380200BA3AEB01D23EBF +:100412005439203801FF2A00D4010138A639D938CD +:10042200203801FF6A000B020138763A3D38070096 +:100432009D397938763A3D3809009D3979389D39A8 +:10044200203804FF6461627312020138B138213925 +:1004520036382C023302203807FF646E65676174F8 +:100462006500220201383B3CE63F5439153C2038F6 +:1004720005FF636D6F7665002D023F02BF93AF9358 +:10048200E991F991A991B991092F082B21F01D91B8 +:1004920011930197E1F7AF91BF91899199910C94D2 +:1004A200053805FF32737761700039020138E1388F +:1004B200FF38E138F63820380AFF726566696C6CDD +:1004C2002D7469625202013880023D385A00980444 +:1004D200860281385439E23E81384B3920380AFF8E +:1004E200736F757263652D7469625D0201388002F3 +:1004F20086027938203803FF746962007002483836 +:100502002C0104FF237469627C024838860106FFCD +:1005120065653E72616D8202013854399B3ACF386B +:100522005F3BCF388138903CC438903CC438C93ADC +:100532009002D23E203808FF696E69742D72616D97 +:10054200880201383D386A00023B3D382200043AF5 +:100552008D0220380BFF656E7669726F6E6D656E67 +:1005620074009C024838440009FF776F72646C691A +:1005720073747300000001383D380800203804FF0E +:100582002F706164B50201388D3AE83E9339203804 +:1005920005FF2F686F6C6400C0020138E83E233FFC +:1005A200933920380AFF666F7274682D6E616D652B +:1005B200C9020138D0030700616D666F727468006A +:1005C200203807FF76657273696F6E00D3020138B7 +:1005D2003D384100203803FF63707500E2020138A4 +:1005E2003D3837002F04203808FF6D63752D696E82 +:1005F200666FEC0201383D383300203805FF2F7555 +:1006020073657200F50201383D382C00203803FF73 +:10061200686C6400AB024838880104FF686F6C6440 +:10062200080301380C03B1387938353AB138FF384C +:10063200C4388138F6388D38203802FF3C230E0347 +:100642000138E83E0C038138203801FF23001E03E5 +:100652000138BD3E7938A603E1383D380900CF386C +:100662006E39363837033D3807009D393D38300042 +:100672009D391203203802FF237326030138290310 +:10068200C93E1C3A1A3936384003203802FF233E4D +:100692003C030138D23E0C037938E83ECF38933917 +:1006A200203804FF7369676E4703013821393638F1 +:1006B2005D033D382D001203203803FF642E7200C3 +:1006C20052030138FF38DA3E260221033F03E138A4 +:1006D20056034A03F638CF389339B73F39042038E6 +:1006E20002FF2E725E030138FF38C73FF6386203FD +:1006F200203802FF642E7103013854396203AE3F81 +:10070200203801FF2E007A030138C73F7D032038CD +:1007120003FF75642E008203013854399603AE3FFD +:10072200203804FF75642E7289030138FF382103D3 +:100732003F034A03F638CF389339B73F390420389C +:1007420006FF75642F6D6F6492030138FF385439C8 +:100752000839C239F638C438FF38C239F638203879 +:1007620006FF64696769743FA1030138663FB138C7 +:100772003D38390078393D380001133A9D39B13896 +:100782003D38400178393D380701133A93393D38F5 +:1007920030009339B138BD3E79385C3920380138A0 +:1007A20008392F04F638CF382F3A043A9D392F3AB8 +:1007B200FF38203802FF732CB1030138B138E2034D +:1007C200203801386707B138043ADA3E0B3A9339D8 +:1007D200FF38543926083638F5039B3AB138793850 +:1007E2006707903CC93AEF03F63828393638FC03DC +:1007F200B13898386707D938203805FF697479709D +:100802006500DB030138B138043ADA3E0B3A93391A +:10081200FF3854392608363817049B3AB138CB3B97 +:10082200B138240420042F3AC93A0F04F638283983 +:1008320036381E04B138CB3B2404D938203801386D +:10084200F93A2404203801383D38FF00133AF23EC9 +:10085200203806FF69636F756E74FE030138B13884 +:100862002F3AC438CB3B203804FF747970652A04D0 +:100872000138993F2608363844049B3AAC3A9838F6 +:10088200F23EC93A3F04203801FF270035040138FF +:10089200BB05FE050906B1389606DF3FC438CB3BDF +:1008A2003D38A501DF3F1C3A36385A043D38F3FF84 +:1008B200863DD938203805FF63736B6970004504A3 +:1008C2000138FF38B13836387004CF3898380839D3 +:1008D200DF3F36387004E63FAC052F386304F63844 +:1008E200D938203805FF637363616E005C040138F8 +:1008F200FF38CF38B13898380839DF3F1A393638DF +:100902008D04C438353AC438CF3821391A393638CB +:100912008D042F3A2F387B04F038CF389339F638CC +:10092200D938203806FF6163636570747304013837 +:10093200CF389D39353ACF38033FB138D9041A3907 +:100942003638CB04B1383D380800DF3F3638BB04B7 +:10095200D938E138C93E7839FF38E138E138F6381C +:100962003638B904D104353AFF38CF38F6385A014F +:100972002F38C904B138543F6E393638C204D938D9 +:10098200543FB138F23ECF388D382F3ACF38660116 +:100992002F389D04D938F038C4389339A13F203814 +:1009A20001383D380800B138F23EAE3FF23E203801 +:1009B2000138B1383D380D00DF3FC4383D380A00F8 +:1009C200DF3F1C3A203806FF726566696C6C93043F +:1009D200FF3D1A00C83DD43D04FF63686172E40420 +:1009E2000138BB05D9389838203806FF6E756D621C +:1009F2006572ED040138BD3E7938FF383F05FF3896 +:100A020052053F05F6381C3AFF38B1381A393638E4 +:100A12001205D23EF638D938F638BD3E81385439FF +:100A220020381E3B543954392D3B7005B9383638BD +:100A32003405E63FDF3F36382B0598383D382E0027 +:100A4200DF3F36382C05F638363828053302EB3FBF +:100A52002F383A05D938D23EF638D938F638BD3E65 +:100A6200813854392038D23EF63836383905273E97 +:100A7200E63FF638BD3E81384B3920380138CF3851 +:100A820098383D382D00DF3FB138FF3836384B05F6 +:100A9200E63FAC05F638203852380A001000020052 +:100AA2000A000138CF3898383D3823009339B138DD +:100AB20054393D380400573E363868054D059D3996 +:100AC200CB3BBD3E8138E63FAC052F386905D938AE +:100AD200203807FF3E6E756D62657200F6040138BC +:100AE200B13836388805CF389838B6031A393638CF +:100AF2007C05D9382038FF385702BD3E79384B0182 +:100B0200F63843015702E63FAC052F38710520380D +:100B120005FF7061727365006A050138FF38A2052E +:100B2200E23E7938AC05F6387804B1382F3AE23E25 +:100B3200653AE63FAC05203806FF736F7572636550 +:100B42008905FF3D1600C83DD43D07FF2F7374721F +:100B5200696E67009D050138E138CF389D39E1386B +:100B6200E138933920380AFF70617273652D6E6126 +:100B72006D65A6050138543FBF0520380138FF389E +:100B8200A205E23E7938AC0508396104F6387804EA +:100B9200C93E9D39A205D9389339E23E81382038C1 +:100BA20003FF73703000B4056F380600C83DD43DB2 +:100BB20002FF7370D1055838080003FF72703000CD +:100BC200D9050138E605793820385838040005FF80 +:100BD200646570746800DE050138D5058D3A933975 +:100BE200043A353A203810FF666F7274682D7265C8 +:100BF200636F676E697A6572E8056F383E00A03DE3 +:100C0200AA3D09FF7265636F676E697A6500F40534 +:100C120001383D381406C438A7091A393638130684 +:100C2200D23E960620380138E138E138C93E1E3BF3 +:100C3200E1382A382D3BE138B1389606DF3F3638A5 +:100C42002506D93854392038F038F0384B39203855 +:100C520009FF696E7465727072657400020601386C +:100C6200BB05B13836384106FE050906B73E79386C +:100C720036383C06D101CB3B2A388B3F2F38310620 +:100C8200D23E203806FF64743A6E756D29065238DA +:100C9200A5017D077D0707FF64743A646E756D00D8 +:100CA20043065238A501D73FD73F07FF7265633A23 +:100CB2006E756D004C060138FB0436386806E63F57 +:100CC200DF3F363866064806203852062038960638 +:100CD200203808FF7265633A66696E645606013809 +:100CE2000B07B1381A3936387906D93896062038C2 +:100CF2008006203805FF64743A7874006A06523818 +:100D020084068806D73F0138D9382A382038013876 +:100D1200213936388E06670720382A38203807FFEF +:100D220064743A6E756C6C007B0652389A069A06A9 +:100D32009A0601383D38F3FF863D0FFF73656172F5 +:100D420063682D776F72646C697374009006013862 +:100D5200FF3854393D38BD06F638DA06B1381A394B +:100D62003638B706D23ED93854392038B13801075F +:100D7200C43880016E0120380138FF38D938C93EA5 +:100D82000839F506DA013638CB06F638D93854393F +:100D92004B392038D23EF6385439203811FF74725C +:100DA2006176657273652D776F72646C6973740016 +:100DB2009E0601385F3BB1383638EB06C93E1E3B12 +:100DC200C4382A382D3BE1383638EB06160ACB3BBD +:100DD2002F38DC06D23E20380BFF6E616D653E7304 +:100DE2007472696E6700CF0601382F043D38FF0028 +:100DF200133A203807FF6E66613E63666100ED06B6 +:100E02000138160A2F3A203807FF66696E642D787A +:100E12007400FB0601383D3817073D384A00A70920 +:100E22001A3936381607D23E543920380138FF387D +:100E3200C93EF638A806B13836382407FF38F038EC +:100E4200F038F6384B39203806FF6E6577657374D3 +:100E5200050748388A0106FF6C61746573742507BB +:100E620048388E0108FF28637265617465292C0772 +:100E72000138BB059008B1382A07903C81387508C3 +:100E82002A078138203801005C0033070138A205A7 +:100E9200F038E23E8138203801002800440701384A +:100EA2003D3829008E05D23E203807FF636F6D70F2 +:100EB200696C65004D070138F638B138D101FF3849 +:100EC200CB3B6707203801FF2C0056070138123F41 +:100ED200733B123F2F3ABF01133F203803005B27B9 +:100EE2005D006407013848047D07203807006C69FB +:100EF200746572616C006F0701385C073D386707E3 +:100F020020380800736C69746572616C7707013868 +:100F12005C07D003DE0320380138123F5C07FFFF75 +:100F2200203801388B3F123FC438733B20380138D8 +:100F3200123F203801388B3F67072038050061686F +:100F420065616400820701385C072F388D072038FD +:100F5200020069669F0701385C0736388D07203822 +:100F62000400656C7365A90701385C072F388D078B +:100F7200C4389207203804007468656EB1070138DE +:100F8200920720380500626567696E00BC07013868 +:100F92009807203805007768696C6500C307013837 +:100FA200AC07C43820380600726570656174CB07DF +:100FB2000138ED07C00720380500756E74696C00B2 +:100FC200D40701383D38363867079B0720380500BB +:100FD200616761696E00DD0701385C072F389B0786 +:100FE20020380200646FE80701385C079B3A9807D3 +:100FF20054395008203804006C6F6F70F2070138C2 +:101002005C07C93A3708203805002B6C6F6F7000F7 +:10101200FC0701385C07BA3A3708203805006C65CE +:1010220061766500050801385C07D43AA4075008C8 +:10103200203803003F646F000F0801385C07260860 +:10104200AC07F507C438500820380138C93EDF3FE5 +:10105200B138FF3836382E08D23EF638FD392038FE +:1010620007FF656E646C6F6F70001A0801389B078A +:101072004408B93836384008C0072F3839082038B4 +:1010820002FF6C3E310801386308793879383D38FF +:10109200FEFF6308653A203802FF3E6C41080138C2 +:1010A200EB3F6308653A630879388138203803FFDB +:1010B2006C7030004D086F384000A03DAA3D02FF21 +:1010C2006C7058084838900106FF63726561746558 +:1010D20060080138390799085C075238203806FF42 +:1010E20068656164657265080138123FFF38FF3830 +:1010F200B138283936388708B1383D3800FF1C3AF4 +:10110200E203F6385F3B6707F63820383D38F0FFD8 +:10111200863D07FF776C73636F7065007008FF3D53 +:101122003C00A03DAA3D06FF72657665616C8A08A7 +:1011320001382A07903C7938B9383638A4082A078A +:101142007938C4383B3B20380500646F65733E0034 +:10115200940801385C07BD085C070E945C07B2086E +:1011620020389A938A93CB0101967F916F91BF9316 +:10117200AF93DB010C9405380138F6382A07903C0E +:1011820079385F3B0107733B203801FF3A00A5081D +:1011920001383907D408D938203807FF3A6E6F6E04 +:1011A200616D6500C6080138123FB13831078138D8 +:1011B2005C070138E908203801003B00CE080138FD +:1011C2005C072038F1089908203801FF5D00DD082E +:1011D2000138E63FB73E8138203801005B00E6085F +:1011E20001385439B73E8138203808FF7661726978 +:1011F20061626C65EE080138233F0809EB3F2C3F22 +:10120200203808FF636F6E7374616E74F6080138DC +:10121200390799085C0748386707203804FF757357 +:10122200657202090138390799085C07583867075F +:101232002038070072656375727365000F09013803 +:10124200310779386707203809FF696D6D65646970 +:10125200617465001A090138CE095F3BB138CB3B96 +:101262003D38FF7F133AC438733B203806005B6376 +:101272006861725D250901385C073D38F104670732 +:101282002038060061626F727422370901388A3E83 +:101292005C075909203805FF61626F7274004209C8 +:1012A20001384B39863D06FF3F61626F72744C090B +:1012B2000138E13836385F0903045109D23E20383B +:1012C20009FF6765742D737461636B0054090138FB +:1012D200B138903CC4385F3BB138FF385439C43818 +:1012E200260836387F099B3AAC3A353AC43ECF38A5 +:1012F2009D395F3BC4384B39BA3A7509D23EF6384C +:10130200203809FF7365742D737461636B00610982 +:101312000138CF382139363891093D38FCFF863DF6 +:10132200C93E3B3BC4385439260836389E099B3A9D +:10133200903CDA3E3B3BC93A9909D938203809FF3B +:101342006D61702D737461636B0082090138B1386D +:10135200903CC4385F3BC43E993F26083638C309E7 +:101362009B3AAC3A5F3BC438FF3808392A38B9385F +:101372003638BF09F638D938D43A2038F638EB3F38 +:10138200BA3AB209D938543920380BFF6765742D3F +:1013920063757272656E7400A00901383D384600AB +:1013A2005F3B203809FF6765742D6F7264657200B8 +:1013B200C60901383D384A006809203809FF6366CA +:1013C200672D6F7264657200D30948384A0007FFBF +:1013D200636F6D7061726500DF09EF09BF93AF93B0 +:1013E2008C0189919991DC01899199919C01899152 +:1013F2009991FC01ED90F190EF1451F40A9519F0D6 +:101402002A95C1F701C02A95022B11F4882702C040 +:101412008FEF00C0982FAF91BF910C94053807FF52 +:101422006E66613E6C666100E8090138F5062F3A86 +:10143200043A9D39203802FF2E73100A0138ED0557 +:101442000A3EAE3FED055439260836382E0A9B3A3D +:10145200AC3A843C0A3EC93A290A203806FF632185 +:10146200407370691C0A350A03D099270C94053819 +:101472008EBD0DB5087F0DBD0DB507FFFACF8EB538 +:10148200089505FF6E40737069002F0A480A8C01A7 +:1014920089919991FC01C8012EBC2DB527FFFDCF82 +:1014A2002EB521930197C1F7899199910C94053832 +:1014B20005FF6E2173706900420A5F0A8C018991EF +:1014C2009991FC01C80121912EBD2DB527FFFDCFB9 +:1014D2002EB50197C1F7899199910C9405380BFFAC +:1014E2006170706C7475726E6B657900590A01389F +:1014F200C700973C8A01AE3FAC3E3D38E803C23993 +:10150200F038413F8503D00304006B487A2003047E +:1015120020380BFF7365742D63757272656E7400EB +:10152200700A01383D3846003B3B203808FF776F90 +:1015320072646C6973748A0A01381B3F5439CF385C +:101542003B3BB138903CBF011C3F20380EFF666F19 +:101552007274682D776F72646C697374970A483875 +:10156200480009FF7365742D6F7264657200A70AE3 +:1015720001383D384A00890920380FFF7365742D00 +:101582007265636F676E697A65727300B20A0138B9 +:101592003D385C00890920380FFF6765742D72653C +:1015A200636F676E697A65727300BE0A01383D38EF +:1015B2005C006809203804FF636F6465CD0A013856 +:1015C20039079908123FD1016707203808FF656E75 +:1015D200642D636F6465DC0A01385C070C945C0758 +:1015E2000538203808FF286D61726B657229E70A99 +:1015F2006F386800A03DAA3D0800706F7374706F69 +:101602006E65F30A0138BB05FE050906B138FF38DD +:10161200D101D101CB3B2A38F638D101CB3B670748 +:10162200203803FF32724000FD0A170B9A938A9307 +:10163200EF91FF918F919F919F938F93FF93EF93E0 +:0A1642009A938A93CF010C940538A7 +:10700200BF93AF93DB011196B21469F4FD01EE0F49 +:10701200FF1F659175911196FB01EE0FFF1F059100 +:107022001591F80109949A938A938B2D9927BB2481 +:1070320060EC7CE3F1CF04FF65786974120B2138B0 +:10704200AF91BF91E1CF07FF657865637574650005 +:107052001C382B38BC0189919991DECF3038FD0163 +:10706200EE0FFF1FA591B591CFCF3738982B89919D +:107072009991A9F31196C8CF3E389A938A93FD014C +:10708200EE0FFF1F859195911196BECF48389A93C6 +:107092008A93FB013196EE0FFF1F85919591B4CF34 +:1070A20052389A938A93CB010196AECF58389A936D +:1070B2008A93FB013196EE0FFF1F85919591840D06 +:1070C200951DA2CF07FF2876616C756529002438CB +:1070D2000138390799085C076F3820380E94B208D6 +:1070E200B138D101CB3B2A38203801FF4000633848 +:1070F2007A38FC018191919187CF01FF2100763886 +:107102008238FC0189919991918380838991999127 +:107112007BCF02FF63217E388E38FC0189919991E1 +:1071220080838991999170CF02FF63408A389938A0 +:10713200FC019927808168CF02FF4075953801389C +:10714200023B9D397938203802FF21759D3801387C +:10715200023B9D398138203803FF64757000A538E1 +:10716200B2389A938A9350CF04FF3F647570AD385A +:10717200BA38082F092B11F09A938A9345CF04FF4E +:1071820073776170B538C5388C01899199911A93DA +:107192000A933ACF04FF6F766572C038D0389A935B +:1071A2008A938A819B8130CF04FF64726F70CB38DF +:1071B200DA388991999128CF03FF726F7400D5381C +:1071C200E2388C0129913991899199913A932A93C4 +:1071D2001A930A9319CF03FF6E697000DD38F138F4 +:1071E200229612CF02FF723EEC38F7389A938A93B6 +:1071F2008F919F9109CF02FF3E72F33800399F931E +:107202008F938991999100CF02FF7240FC3809391E +:107212009A938A938F919F919F938F93F5CE02FFBA +:107222003C3E05390138DF3F1A39203802FF303D34 +:1072320010391B39982BD1F530C002FF303C173979 +:10724200223997FD2AC032C002FF303E1E39293949 +:10725200821593055CF151F120C003FF64303E00BA +:1072620025393339821593058991999182059305C0 +:10727200ECF0E1F012C003FF64303C002E394139DA +:10728200229697FD0C944E390C94573904FF747270 +:1072920075653C394C399A938A938FEF9FEFB4CE40 +:1072A20001FF3000473955399A938A93C101ACCE18 +:1072B20002FF753C51395D39299139918217930743 +:1072C200A8F3A1F3EACF02FF753E59390138C43859 +:1072D2005C39203801FF3C0064396F3929913991BA +:1072E200281739071CF7D9CF01FF3E006B397939CE +:1072F2002991399128173907CCF2C1F2CECF04FF78 +:107302006C6F673275398539FC01992780E18A955E +:1073120022F0EE0FFF1FD8F777CE9A9575CE01FFB8 +:107322002D008039943909911991081B190BC80154 +:107332006BCE01FF2B0090399E3909911991800F74 +:10734200911F62CE02FF6D2A9A39A7398C01899169 +:1073520099919C0131027001209FC0013003F30812 +:10736200900DE11CF31C1203F308900DE11CF31CB9 +:107372009A938A93C70148CE06FF756D2F6D6F648D +:10738200A339C3397C01299139910991199140E1BD +:107392005527000F111F221F331F551F2E153F05A2 +:1073A200520518F003952E193F094A9589F73A9329 +:1073B2002A93C80129CE03FF756D2A00BD39E13930 +:1073C2008C0189919991809FF00122273327909F08 +:1073D200F00D211D331D819FF00D211D331D919F45 +:1073E200200D311DCF019A938A93C9010DCE06FF5C +:1073F200696E76657274DC39FE398095909504CE9B +:1074020002FF322FF839053A95958795FDCD02FF97 +:10741200322A013A0C3A880F991FF6CD03FF616EAA +:107422006400083A143A0991199180239123ECCD12 +:1074320002FF6F720F3A1D3A09911991802B912B1D +:10744200E3CD03FF786F7200193A273A0991199137 +:1074520080279127D9CD02FF312B223A303A01966B +:10746200D3CD02FF312D2C3A363A0197CDCD07FF0D +:107472003F6E656761746500323A013821393638EA +:10748200433A273E203806FF6C7368696674383ABF +:107492004A3AFC018991999131971AF0880F991F04 +:1074A200FBCFB2CD06FF727368696674443A593AEB +:1074B200FC018991999131971AF096958795FBCFA6 +:1074C200A3CD02FF2B21533A663AFC01899199918F +:1074D20020813181820F931F8083918389919991B9 +:1074E20093CD03FF72704000623A773A9A938A937F +:1074F2008DB79EB789CD03FF72702100723A813A2F +:107502002FB7F8948DBF9EBF2FBF899199917CCDE3 +:1075120003FF737040007C3A8E3A9A938A93CE01AD +:1075220073CD03FF73702100893A973AEC01899178 +:1075320099916ACD9C3A29913991E0E83E0F821BDC +:10754200930B3F932F939F938F93899199915CCD46 +:1075520001FF6900923AAD3A9A938A938F919F9173 +:10756200EF91FF91FF93EF939F938F938E0F9F1F46 +:107572004BCDBB3AEF91FF91E80FF91F8991999199 +:107582001BF0FF93EF936BCD0F911F9111963CCDA2 +:10759200CA3AEF91FF913196BBF3F3CF06FF756EB6 +:1075A2006C6F6F70A93AD53A1F910F911F910F918D +:1075B2002BCD06FF636D6F76653ECF3AE03ABF93FF +:1075C200AF93E991F991A991B991092F082B41F053 +:1075D200E80FF91FA80FB91F1E9112930197E1F747 +:1075E200AF91BF91899199910FCD02FF3E3CDA3A5A +:1075F200FA3A092F982F802F07CD03FF75704000AC +:10760200F63A033B9A938A93C201FECC03FF75704C +:107612002100FE3A0C3B2C0189919991F5CC03FF94 +:10762200316D7300073B153BE0EAFFE03197F1F75C +:10763200EBCC03FF323E7200103B1F3BFC018991F1 +:1076420099919F938F93FF93EF9389919991DCCCBA +:1076520003FF32723E001A3B2E3B9A938A93EF91BC +:10766200FF918F919F919A938A93CF01CDCC02FF84 +:107672002165293B3C3BFC01899199912FB7F894F4 +:1076820028D000B5081709F00BD0319622D000B5EA +:10769200091711F0892F04D02FBF89919991B4CC89 +:1076A200F999FECF07B700FDFDCFF2BDE1BD80BD68 +:1076B200FA9AF99A089502FF4065383B603B2FB76A +:1076C200F894FC0106D080B5319603D090B52FBF57 +:1076D2009BCCF999FECFF2BDE1BDF89A089502FF65 +:1076E20021695C3BFF3D6600A03DAA3D09FF2821C0 +:1076F200692D6E7277772900703B7F3B1FB71F930E +:10770200F8949C0189919991AF93BF93CF93DF93A2 +:1077120009D0DF91CF91BF91AF91899199911F913A +:107722001FBF72CC10D0E094F0948E219F21982B31 +:1077320019F0F90102E020D0F90104E01DD0F901AD +:1077420000E11AD00895F901E07CFF7FEF01A0E487 +:10775200B0E0FE01EE0FFF1F45915591FE01E217C9 +:10776200F30711F00A0102C07A010C01002704D0CC +:107772002196119771F70895F999FECF17B710FD69 +:10778200FDCFEE0FFF1F016007BFE895089502FFCE +:107792004069773BCC3BFC01EE0FFF1F8591959131 +:1077A20033CC03FF6E3E7200C83BD73BFC01082F6F +:1077B200899199919F938F930A95D1F7EF93FF93B4 +:1077C2008991999121CC03FF6E723E00D23BE93B35 +:1077D2009A938A93FF91EF910E2F8F919F919A9393 +:1077E2008A930A95D1F7CF010FCC03FF64322A00A6 +:1077F200E43BFB3B09911991000F111F881F991F50 +:107802001A930A9301CC03FF64322F00F63B093C22 +:107812000991199195958795179507951A930A934A +:10782200F3CB02FF642B043C163C29913991E99079 +:10783200F99049915991240F351F8E1D9F1D3A933E +:107842002A93E2CB02FF642D123C273C2991399105 +:10785200E990F99049915991421B530BE80AF90AB0 +:107862005A934A93C701D0CB07FF64696E7665725B +:107872007400233C3C3C09911991809590950095A8 +:1078820010951A930A93C0CB04FF2F6D6F64353C99 +:107892004A3C9C0109911991412F432717FF04C0CB +:1078A200109500950F5F1F4F37FF04C0309520954C +:1078B2002F5F3F4FEE24FF1851E1001F111F5A9511 +:1078C20039F447FF04C0109500950F5F1F4F0BC09E +:1078D200EE1CFF1CE21AF30A20F4E20EF31E889457 +:1078E200ECCF0894EACFFA92EA92C8018DCB03FF5B +:1078F20061627300453C0138B1383E3A203804FFDA +:107902007069636B783C01382F3AC43E8D3A9D39D9 +:107912007938203805FF63656C6C2B00803C913C04 +:10792200029672CB04FF2B696E748B3C983C789460 +:107932006BCB04FF2D696E74933C9F3CF89464CB2F +:1079420004FF696E74219A3C01383D3800009D396C +:107952003B3B203804FF696E7440A13C01383D383E +:1079620000009D395F3B203808FF696E742D7472E8 +:107972006170AB3CBC3CB82E8991999145CB0138E2 +:10798200AF3C2A38C53C2038C63C01D03DCB1895C7 +:107992000138D0030300206F6B000304203803FF7B +:1079A2002E6F6B00B53CFF3D1C00C83DD43D013835 +:1079B200D00302003E20A13F0304203806FF2E72AE +:1079C20065616479D03CFF3D2000C83DD43D01385B +:1079D200D0030400203F3F200304BD3E7938FF3826 +:1079E200413F8503E23E79388503F638BD3E813852 +:1079F200203806FF2E6572726F72DF3CFF3D1E005B +:107A0200C83DD43D04FF71756974FA3C01385C08C5 +:107A120063088138D505963AE205803AF108B73E07 +:107A220079381A393638163DE43CE9043638283DAF +:107A32003D383006703DB9383638283DB1383D38CA +:107A4200FEFF6E393638263DFF3C2F38083DD43CC8 +:107A52002F38103D05FF706175736500033DFF3DD2 +:107A62009201B43DBE3D04FF636F6C642B3D393D12 +:107A7200A4B622243324BB2424BEE0E0F1E0219208 +:107A8200E030E9F7F930D9F7E4E9F1E02F010FEF3F +:107A92000DBF048318E01EBF1583CFEAC683D8E06A +:107AA200D783AAE5BDE3B0CA04FF7761726D343DA6 +:107AB2000138A2023D38A5013D38303DDF3DF108D5 +:107AC2005C3F073D07FF68616E646C657200553D5F +:107AD20058380A0005FF636174636800633D01382A +:107AE2008D3AFF38693D7938FF38763A693D8138F9 +:107AF2002A38F638693D8138F638D9385439203871 +:107B020005FF7468726F77006B3D0138B1381A391E +:107B120036388D3DD9382038693D7938803AF63883 +:107B2200693D8138F638C438FF38963AD938F63884 +:107B3200203807FF4564656665724000813D013863 +:107B4200CB3B5F3B203807FF4564656665722100C9 +:107B52009A3D0138CB3B3B3B203807FF52646566B8 +:107B620065724000A43D0138CB3B7938203807FFCD +:107B72005264656665722100AE3D0138CB3B8138A7 +:107B8200203807FF5564656665724000B83D0138CC +:107B9200CB3B023B9D397938203807FF5564656637 +:107BA20065722100C23D0138CB3B023B9D398138D1 +:107BB200203806FF646566657221CE3D0138D03FEC +:107BC200B138D101D101CB3B2A38203806FF646598 +:107BD20066657240DA3D0138D03FB138D101CB3B06 +:107BE2002A38203807FF2864656665722900E73D58 +:107BF2000138390799085C07FF3D20380E94B20816 +:107C0200B138D101CB3B2A382A38203802FF752EF1 +:107C1200F33D013854398D03203803FF752E72006D +:107C2200073E01385439C4389603203805FF752FB2 +:107C32006D6F64000E3E0138FF385439F638C23990 +:107C4200203806FF6E6567617465173E0138FD399D +:107C52002F3A203801FF2F00223E0138493CF038EC +:107C6200203803FF6D6F64002B3E0138493CD93840 +:107C7200203803FF6D696E00323E0138C93E783903 +:107C82003638443EC438D938203803FF6D61780055 +:107C92003A3E0138C93E6E393638503EC438D9387A +:107CA200203806FF77697468696E463E0138CF381E +:107CB2009339FF389339F6385C3920380DFF7368F1 +:107CC2006F772D776F72646C69737400523E01385E +:107CD2003D386E3EC438DA0620380138F506030412 +:107CE200AE3F4B39203805FF776F726473005F3EF9 +:107CF20001383D384C005F3B683E203802002E229E +:107D0200743E01388A3E5C07030420380200732265 +:107D12007F3E01383D3822008E05B73E793836382D +:107D2200933E8807203804FF66696C6C873E0138F1 +:107D3200E138E138B9383638A53E993F9B3AB13837 +:107D4200AC3A8D38C93AA03ED938203805FF665F73 +:107D520063707500943E01383D3800243D38F400CC +:107D6200203805FF737461746500A73E4838C0016E +:107D720004FF62617365B23E58380C0005FF63650B +:107D82006C6C7300B93E0C3A04FF32647570BF3EEE +:107D92000138CF38CF38203805FF3264726F700057 +:107DA200C53E0138D938D938203804FF7475636B61 +:107DB200CD3E0138C438CF38203803FF3E696E000B +:107DC200D63E5838180003FF70616400DE3E013869 +:107DD200233F3D3828009D39203804FF656D6974C2 +:107DE200E43EFF3D0E00C83DD43D05FF656D69745C +:107DF2003F00EE3EFF3D1000C83DD43D03FF6B65E2 +:107E02007900F63EFF3D1200C83DD43D04FF6B658C +:107E1200793FFF3EFF3D1400C83DD43D02FF647030 +:107E2200073F6F383600A03DAA3D05FF65686572C1 +:107E320065000F3F6F383A00A03DAA3D04FF686518 +:107E42007265163F6F383800A03DAA3D05FF616C90 +:107E52006C6F74001F3F0138233F9D39BF01243FDF +:107E6200203803FF62696E00273F0138EB3FBD3EB9 +:107E72008138203807FF646563696D616C00323FA9 +:107E820001383D380A00BD3E8138203803FF68655D +:107E920078003B3F01383D381000BD3E8138203824 +:107EA20002FF626C473F4838200007FF7475726E0C +:107EB2006B657900513FFF3D4200A03DAA3D07FF9F +:107EC200746F757070657200563F0138B1383D3875 +:107ED20061003D387B00573E3638723F3D38DF0047 +:107EE200133A203807FF746F6C6F77657200603F3A +:107EF2000138B1383D3841003D385B00573E3638D5 +:107F0200853F3D3820001C3A203806FF3F737461DC +:107F1200636B733F0138ED0521393638933F3D38A5 +:107F2200FCFF863D203806FF626F756E6473863FE4 +:107F32000138CF389D39C438203802FF6372943F2C +:107F420001383D380D00F23E3D380A00F23E20383D +:107F520005FF7370616365009E3F0138543FF23E36 +:107F6200203806FF737061636573A93F0138543985 +:107F72004A3EB1383638C13FAE3F353A2F38BA3F64 +:107F8200D938203803FF733E6400B23F0138B1385C +:107F92002139203805FF3E626F647900C33F303AD1 +:107FA2000800326C69746572616CCB3F0138C43869 +:107FB2007D077D07203801FF3D00D13F013893390D +:107FC2001A39203801FF3100DC3F4838010001FF37 +:107FD2003200E33F4838020002FF2D31E83F4838C3 +:027FE200FFFF9F +:00000001FF diff --git a/amforth-6.5/appl/eval-pollin/p328-16.lst b/amforth-6.5/appl/eval-pollin/p328-16.lst new file mode 100644 index 0000000..da486f0 --- /dev/null +++ b/amforth-6.5/appl/eval-pollin/p328-16.lst @@ -0,0 +1,10427 @@ + +AVRASM ver. 2.1.52 p328-16.asm Sun Apr 30 20:10:15 2017 + +p328-16.asm(5): 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/atmega328p\device.asm' +../../avr8/devices/atmega328p\device.asm(5): Including file '../../avr8/Atmel/Appnotes2\m328Pdef.inc' +p328-16.asm(14): Including file '../../avr8\drivers/usart_0.asm' +../../avr8\drivers/usart_0.asm(32): 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' +p328-16.asm(19): Including file '../../avr8\drivers/1wire.asm' +p328-16.asm(21): Including file '../../avr8\amforth.asm' +../../avr8\amforth.asm(12): Including file '../../avr8\drivers/generic-isr.asm' +../../avr8\amforth.asm(14): 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(11): Including file '../../avr8\dict/appl_4k.inc' +../../avr8\dict/appl_4k.inc(1): Including file '../../common\words/ver.asm' +../../avr8\dict/appl_4k.inc(4): Including file '../../common\words/noop.asm' +../../avr8\dict/appl_4k.inc(5): Including file '../../avr8\words/unused.asm' +../../avr8\dict/appl_4k.inc(6): Including file '../../common\words/to.asm' +../../avr8\dict/appl_4k.inc(7): Including file '../../avr8\words/i-cellplus.asm' +../../avr8\dict/appl_4k.inc(8): Including file '../../avr8\words/icompare.asm' +../../avr8\dict/appl_4k.inc(9): Including file '../../common\words/star.asm' +../../avr8\dict/appl_4k.inc(10): Including file '../../avr8\words/j.asm' +../../avr8\dict/appl_4k.inc(11): Including file '../../avr8\words/dabs.asm' +../../avr8\dict/appl_4k.inc(12): Including file '../../avr8\words/dnegate.asm' +../../avr8\dict/appl_4k.inc(13): Including file '../../avr8\words/cmove.asm' +../../avr8\dict/appl_4k.inc(14): Including file '../../common\words/2swap.asm' +../../avr8\dict/appl_4k.inc(15): Including file '../../common\words/tib.asm' +../../avr8\dict/appl_4k.inc(16): Including file '../../avr8\words/init-ram.asm' +../../avr8\dict/appl_4k.inc(20): Including file '../../avr8\words/environment.asm' +../../avr8\dict/appl_4k.inc(21): Including file '../../avr8\words/env-wordlists.asm' +../../avr8\dict/appl_4k.inc(22): Including file '../../avr8\words/env-slashpad.asm' +../../avr8\dict/appl_4k.inc(23): Including file '../../common\words/env-slashhold.asm' +../../avr8\dict/appl_4k.inc(24): Including file '../../common\words/env-forthname.asm' +../../avr8\dict/appl_4k.inc(25): Including file '../../common\words/env-forthversion.asm' +../../avr8\dict/appl_4k.inc(26): Including file '../../common\words/env-cpu.asm' +../../avr8\dict/appl_4k.inc(27): Including file '../../avr8\words/env-mcuinfo.asm' +../../avr8\dict/appl_4k.inc(28): Including file '../../common\words/env-usersize.asm' +../../avr8\dict/appl_4k.inc(30): Including file '../../avr8\words/hld.asm' +../../avr8\dict/appl_4k.inc(31): Including file '../../common\words/hold.asm' +../../avr8\dict/appl_4k.inc(32): Including file '../../common\words/less-sharp.asm' +../../avr8\dict/appl_4k.inc(33): Including file '../../common\words/sharp.asm' +../../avr8\dict/appl_4k.inc(34): Including file '../../common\words/sharp-s.asm' +../../avr8\dict/appl_4k.inc(35): Including file '../../common\words/sharp-greater.asm' +../../avr8\dict/appl_4k.inc(36): Including file '../../common\words/sign.asm' +../../avr8\dict/appl_4k.inc(37): Including file '../../common\words/d-dot-r.asm' +../../avr8\dict/appl_4k.inc(38): Including file '../../common\words/dot-r.asm' +../../avr8\dict/appl_4k.inc(39): Including file '../../common\words/d-dot.asm' +../../avr8\dict/appl_4k.inc(40): Including file '../../common\words/dot.asm' +../../avr8\dict/appl_4k.inc(41): Including file '../../common\words/ud-dot.asm' +../../avr8\dict/appl_4k.inc(42): Including file '../../common\words/ud-dot-r.asm' +../../avr8\dict/appl_4k.inc(43): Including file '../../common\words/ud-slash-mod.asm' +../../avr8\dict/appl_4k.inc(44): Including file '../../common\words/digit-q.asm' +../../avr8\dict/appl_4k.inc(46): Including file '../../avr8\words/do-sliteral.asm' +../../avr8\dict/appl_4k.inc(47): Including file '../../avr8\words/scomma.asm' +../../avr8\dict/appl_4k.inc(48): Including file '../../avr8\words/itype.asm' +../../avr8\dict/appl_4k.inc(49): Including file '../../avr8\words/icount.asm' +../../avr8\dict/appl_4k.inc(50): Including file '../../common\words/type.asm' +../../avr8\dict/appl_4k.inc(51): Including file '../../common\words/tick.asm' +../../avr8\dict/appl_4k.inc(53): Including file '../../common\words/cskip.asm' +../../avr8\dict/appl_4k.inc(54): Including file '../../common\words/cscan.asm' +../../avr8\dict/appl_4k.inc(55): Including file '../../common\words/accept.asm' +../../avr8\dict/appl_4k.inc(56): Including file '../../common\words/refill.asm' +../../avr8\dict/appl_4k.inc(57): Including file '../../common\words/char.asm' +../../avr8\dict/appl_4k.inc(58): Including file '../../common\words/number.asm' +../../avr8\dict/appl_4k.inc(59): Including file '../../common\words/q-sign.asm' +../../avr8\dict/appl_4k.inc(60): Including file '../../common\words/set-base.asm' +../../avr8\dict/appl_4k.inc(61): Including file '../../common\words/to-number.asm' +../../avr8\dict/appl_4k.inc(62): Including file '../../common\words/parse.asm' +../../avr8\dict/appl_4k.inc(63): Including file '../../common\words/source.asm' +../../avr8\dict/appl_4k.inc(64): Including file '../../common\words/slash-string.asm' +../../avr8\dict/appl_4k.inc(65): Including file '../../common\words/parse-name.asm' +../../avr8\dict/appl_4k.inc(66): Including file '../../avr8\words/sp0.asm' +../../avr8\dict/appl_4k.inc(67): Including file '../../avr8\words/rp0.asm' +../../avr8\dict/appl_4k.inc(68): Including file '../../common\words/depth.asm' +../../avr8\dict/appl_4k.inc(69): Including file '../../avr8\words/forth-recognizer.asm' +../../avr8\dict/appl_4k.inc(70): Including file '../../common\words/recognize.asm' +../../avr8\dict/appl_4k.inc(71): Including file '../../common\words/interpret.asm' +../../avr8\dict/appl_4k.inc(72): Including file '../../common\words/rec-intnum.asm' +../../avr8\dict/appl_4k.inc(73): Including file '../../common\words/rec-find.asm' +../../avr8\dict/appl_4k.inc(74): Including file '../../common\words/dt-null.asm' +../../avr8\dict/appl_4k.inc(75): Including file '../../common\words/search-wordlist.asm' +../../avr8\dict/appl_4k.inc(76): Including file '../../common\words/traverse-wordlist.asm' +../../avr8\dict/appl_4k.inc(77): Including file '../../common\words/name2string.asm' +../../avr8\dict/appl_4k.inc(78): Including file '../../avr8\words/nfa2cfa.asm' +../../avr8\dict/appl_4k.inc(79): Including file '../../common\words/find-xt.asm' +../../avr8\dict/appl_4k.inc(81): 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.asm(15): Including file 'dict_appl.inc' +dict_appl.inc(3): Including file '../../common\words/dot-s.asm' +dict_appl.inc(4): Including file '../../avr8\words/spirw.asm' +dict_appl.inc(5): Including file '../../avr8\words/n-spi.asm' +dict_appl.inc(6): Including file 'words/applturnkey.asm' +dict_appl.inc(7): 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' +dict_appl.inc(8): Including file '../../avr8\words/2r_fetch.asm' +../../avr8\amforth.asm(23): Including file '../../avr8\amforth-interpreter.asm' +../../avr8\amforth.asm(24): 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(97): Including file '../../avr8\words/store-i_nrww.asm' +../../avr8\dict/nrww.inc(99): Including file '../../avr8\words/fetch-i.asm' +../../avr8\dict/nrww.inc(104): Including file '../../avr8\dict/core_4k.inc' +../../avr8\dict/core_4k.inc(3): Including file '../../avr8\words/n_to_r.asm' +../../avr8\dict/core_4k.inc(4): Including file '../../avr8\words/n_r_from.asm' +../../avr8\dict/core_4k.inc(5): Including file '../../avr8\words/d-2star.asm' +../../avr8\dict/core_4k.inc(6): Including file '../../avr8\words/d-2slash.asm' +../../avr8\dict/core_4k.inc(7): Including file '../../avr8\words/d-plus.asm' +../../avr8\dict/core_4k.inc(8): Including file '../../avr8\words/d-minus.asm' +../../avr8\dict/core_4k.inc(9): Including file '../../avr8\words/d-invert.asm' +../../avr8\dict/core_4k.inc(10): Including file '../../avr8\words/slashmod.asm' +../../avr8\dict/core_4k.inc(11): Including file '../../common\words/abs.asm' +../../avr8\dict/core_4k.inc(12): Including file '../../common\words/pick.asm' +../../avr8\dict/core_4k.inc(13): Including file '../../avr8\words/cellplus.asm' +../../avr8\dict/core_4k.inc(14): 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_4k.inc(17): Including file '../../common\words/prompt-ok.asm' +../../avr8\dict/core_4k.inc(18): Including file '../../common\words/prompt-ready.asm' +../../avr8\dict/core_4k.inc(19): Including file '../../common\words/prompt-error.asm' +../../avr8\dict/core_4k.inc(21): Including file '../../common\words/quit.asm' +../../avr8\dict/core_4k.inc(22): Including file '../../avr8\words/pause.asm' +../../avr8\dict/core_4k.inc(23): Including file '../../avr8\words/cold.asm' +../../avr8\dict/core_4k.inc(24): Including file '../../common\words/warm.asm' +../../avr8\dict/core_4k.inc(26): Including file '../../common\words/handler.asm' +../../avr8\dict/core_4k.inc(27): Including file '../../common\words/catch.asm' +../../avr8\dict/core_4k.inc(28): Including file '../../common\words/throw.asm' +../../avr8\dict/core_4k.inc(31): Including file '../../avr8\words/edefer-fetch.asm' +../../avr8\dict/core_4k.inc(32): Including file '../../avr8\words/edefer-store.asm' +../../avr8\dict/core_4k.inc(33): Including file '../../common\words/rdefer-fetch.asm' +../../avr8\dict/core_4k.inc(34): Including file '../../common\words/rdefer-store.asm' +../../avr8\dict/core_4k.inc(35): Including file '../../common\words/udefer-fetch.asm' +../../avr8\dict/core_4k.inc(36): Including file '../../common\words/udefer-store.asm' +../../avr8\dict/core_4k.inc(37): Including file '../../common\words/defer-store.asm' +../../avr8\dict/core_4k.inc(38): Including file '../../common\words/defer-fetch.asm' +../../avr8\dict/core_4k.inc(39): Including file '../../avr8\words/do-defer.asm' +../../avr8\dict/core_4k.inc(41): Including file '../../common\words/u-dot.asm' +../../avr8\dict/core_4k.inc(42): Including file '../../common\words/u-dot-r.asm' +../../avr8\dict/core_4k.inc(45): Including file '../../avr8\words/uslashmod.asm' +../../avr8\dict/core_4k.inc(46): Including file '../../avr8\words/negate.asm' +../../avr8\dict/core_4k.inc(47): Including file '../../common\words/slash.asm' +../../avr8\dict/core_4k.inc(48): Including file '../../common\words/mod.asm' +../../avr8\dict/core_4k.inc(50): Including file '../../common\words/min.asm' +../../avr8\dict/core_4k.inc(51): Including file '../../common\words/max.asm' +../../avr8\dict/core_4k.inc(52): Including file '../../common\words/within.asm' +../../avr8\dict/core_4k.inc(54): Including file '../../common\words/show-wordlist.asm' +../../avr8\dict/core_4k.inc(55): Including file '../../common\words/words.asm' +../../avr8\dict/core_4k.inc(57): Including file '../../common\words/dot-quote.asm' +../../avr8\dict/core_4k.inc(58): Including file '../../common\words/squote.asm' +../../avr8\dict/core_4k.inc(59): Including file '../../avr8\words/fill.asm' +../../avr8\dict/core_4k.inc(61): Including file '../../common\words/f_cpu.asm' +../../avr8\dict/core_4k.inc(62): Including file '../../avr8\words/state.asm' +../../avr8\dict/core_4k.inc(63): Including file '../../common\words/base.asm' +../../avr8\dict/core_4k.inc(65): Including file '../../avr8\words/cells.asm' +../../avr8\dict/core_4k.inc(67): Including file '../../common\words/2dup.asm' +../../avr8\dict/core_4k.inc(68): Including file '../../common\words/2drop.asm' +../../avr8\dict/core_4k.inc(69): Including file '../../common\words/tuck.asm' +../../avr8\dict/core_4k.inc(71): Including file '../../common\words/to-in.asm' +../../avr8\dict/core_4k.inc(72): Including file '../../common\words/pad.asm' +../../avr8\dict/core_4k.inc(73): Including file '../../common\words/emit.asm' +../../avr8\dict/core_4k.inc(74): Including file '../../common\words/emitq.asm' +../../avr8\dict/core_4k.inc(75): Including file '../../common\words/key.asm' +../../avr8\dict/core_4k.inc(76): Including file '../../common\words/keyq.asm' +../../avr8\dict/core_4k.inc(78): Including file '../../avr8\words/dp.asm' +../../avr8\dict/core_4k.inc(79): Including file '../../avr8\words/ehere.asm' +../../avr8\dict/core_4k.inc(80): Including file '../../avr8\words/here.asm' +../../avr8\dict/core_4k.inc(81): Including file '../../avr8\words/allot.asm' +../../avr8\dict/core_4k.inc(83): Including file '../../common\words/bin.asm' +../../avr8\dict/core_4k.inc(84): Including file '../../common\words/decimal.asm' +../../avr8\dict/core_4k.inc(85): Including file '../../common\words/hex.asm' +../../avr8\dict/core_4k.inc(86): Including file '../../common\words/bl.asm' +../../avr8\dict/core_4k.inc(88): Including file '../../avr8\words/turnkey.asm' +../../avr8\dict/core_4k.inc(89): Including file '../../common\words/to-upper.asm' +../../avr8\dict/core_4k.inc(90): Including file '../../common\words/to-lower.asm' +../../avr8\dict/core_4k.inc(92): Including file '../../common\words/q-stack.asm' +../../avr8\dict/core_4k.inc(93): Including file '../../common\words/bounds.asm' +../../avr8\dict/core_4k.inc(94): Including file '../../common\words/cr.asm' +../../avr8\dict/core_4k.inc(95): Including file '../../common\words/space.asm' +../../avr8\dict/core_4k.inc(96): Including file '../../common\words/spaces.asm' +../../avr8\dict/core_4k.inc(97): Including file '../../common\words/s-to-d.asm' +../../avr8\dict/core_4k.inc(98): 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.asm(25): Including file 'dict_appl_core.inc' +../../avr8\amforth.asm(36): Including file '../../avr8\amforth-eeprom.inc' + + + ; file see ../template/template.asm. You may want to + ; copy that file to this one and edit it afterwards. + + .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 = 256 + .equ CELLSIZE = 2 + .macro readflashcell + lsl zl + rol zh + lpm @0, Z+ + lpm @1, Z+ + .endmacro + .macro writeflashcell + lsl zl + rol zh + .endmacro + .set WANT_USART0 = 0 + .set WANT_TWI = 0 + .set WANT_TIMER_COUNTER_1 = 0 + .set WANT_TIMER_COUNTER_2 = 0 + .set WANT_AD_CONVERTER = 0 + .set WANT_ANALOG_COMPARATOR = 0 + .set WANT_PORTB = 0 + .set WANT_PORTC = 0 + .set WANT_PORTD = 0 + .set WANT_TIMER_COUNTER_0 = 0 + .set WANT_EXTERNAL_INTERRUPT = 0 + .set WANT_SPI = 0 + .set WANT_WATCHDOG = 0 + .set WANT_CPU = 0 + .set WANT_EEPROM = 0 + .equ intvecsize = 2 ; please verify; flash size: 32768 bytes + .equ pclen = 2 ; please verify + .overlap + .org 2 +000002 d126 rcall isr ; External Interrupt Request 0 + .org 4 +000004 d124 rcall isr ; External Interrupt Request 1 + .org 6 +000006 d122 rcall isr ; Pin Change Interrupt Request 0 + .org 8 +000008 d120 rcall isr ; Pin Change Interrupt Request 0 + .org 10 +00000a d11e rcall isr ; Pin Change Interrupt Request 1 + .org 12 +00000c d11c rcall isr ; Watchdog Time-out Interrupt + .org 14 +00000e d11a rcall isr ; Timer/Counter2 Compare Match A + .org 16 +000010 d118 rcall isr ; Timer/Counter2 Compare Match A + .org 18 +000012 d116 rcall isr ; Timer/Counter2 Overflow + .org 20 +000014 d114 rcall isr ; Timer/Counter1 Capture Event + .org 22 +000016 d112 rcall isr ; Timer/Counter1 Compare Match A + .org 24 +000018 d110 rcall isr ; Timer/Counter1 Compare Match B + .org 26 +00001a d10e rcall isr ; Timer/Counter1 Overflow + .org 28 +00001c d10c rcall isr ; TimerCounter0 Compare Match A + .org 30 +00001e d10a rcall isr ; TimerCounter0 Compare Match B + .org 32 +000020 d108 rcall isr ; Timer/Couner0 Overflow + .org 34 +000022 d106 rcall isr ; SPI Serial Transfer Complete + .org 36 +000024 d104 rcall isr ; USART Rx Complete + .org 38 +000026 d102 rcall isr ; USART, Data Register Empty + .org 40 +000028 d100 rcall isr ; USART Tx Complete + .org 42 +00002a d0fe rcall isr ; ADC Conversion Complete + .org 44 +00002c d0fc rcall isr ; EEPROM Ready + .org 46 +00002e d0fa rcall isr ; Analog Comparator + .org 48 +000030 d0f8 rcall isr ; Two-wire Serial Interface + .org 50 +000032 d0f6 rcall isr ; Store Program Memory Read + .equ INTVECTORS = 26 + .nooverlap + + ; compatability layer (maybe empty) + .equ SPMEN = SELFPRGEN + + ; controller data area, environment query mcu-info + mcu_info: + mcu_ramsize: +000033 0800 .dw 2048 + mcu_eepromsize: +000034 0400 .dw 1024 + mcu_maxdp: +000035 7000 .dw 28672 + mcu_numints: +000036 001a .dw 26 + mcu_name: +000037 000a .dw 10 +000038 5441 +000039 656d +00003a 6167 +00003b 3233 +00003c 5038 .db "ATmega328P" + .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 + + .set AMFORTH_RO_SEG = NRWW_START_ADDR+1 + + ; cpu clock in hertz + .equ F_CPU = 16000000 + .set BAUD_MAXERROR = 30 + .equ TIMER_INT = OVF2addr + + .include "drivers/usart_0.asm" + + .equ BAUDRATE_HIGH = UBRR0H + .equ USART_C = UCSR0C + .equ USART_B = UCSR0B + .equ USART_A = UCSR0A + .equ USART_DATA = UDR0 + .ifndef URXCaddr + .endif + + .equ bm_USART_RXRD = 1 << RXC0 + .equ bm_USART_TXRD = 1 << UDRE0 + .equ bm_ENABLE_TX = 1 << TXEN0 + .equ bm_ENABLE_RX = 1 << RXEN0 + .equ bm_ENABLE_INT_RX = 1<rx-buf",0 +000042 0000 .dw VE_HEAD + .set VE_HEAD = VE_TO_RXBUF + XT_TO_RXBUF: +000043 0044 .dw PFA_rx_tobuf + PFA_rx_tobuf: +000044 2f08 mov temp0, tosl +000045 9110 0110 lds temp1, usart_rx_in +000047 e0e0 ldi zl, low(usart_rx_data) +000048 e0f1 ldi zh, high(usart_rx_data) +000049 0fe1 add zl, temp1 +00004a 1df3 adc zh, zeroh +00004b 8300 st Z, temp0 +00004c 9513 inc temp1 +00004d 701f andi temp1,usart_rx_mask +00004e 9310 0110 sts usart_rx_in, temp1 +000050 9189 +000051 9199 loadtos +000052 940c 3805 jmp_ DO_NEXT + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ; setup with + ; ' isr-rx URXCaddr int! + VE_ISR_RX: +000054 ff06 .dw $ff06 +000055 7369 +000056 2d72 +000057 7872 .db "isr-rx" +000058 003d .dw VE_HEAD + .set VE_HEAD = VE_ISR_RX + XT_ISR_RX: +000059 3801 .dw DO_COLON + usart_rx_isr: +00005a 383d .dw XT_DOLITERAL +00005b 00c6 .dw usart_data +00005c 3898 .dw XT_CFETCH +00005d 38b1 .dw XT_DUP +00005e 383d .dw XT_DOLITERAL +00005f 0003 .dw 3 +000060 3fdf .dw XT_EQUAL +000061 3836 .dw XT_DOCONDBRANCH +000062 0064 .dw usart_rx_isr1 +000063 3d38 .dw XT_COLD + usart_rx_isr1: +000064 0043 .dw XT_TO_RXBUF +000065 3820 .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: +000066 3801 .dw DO_COLON + PFA_USART_INIT_RX_BUFFER: ; ( -- ) +000067 383d +000068 0059 .dw XT_DOLITERAL, XT_ISR_RX +000069 383d +00006a 0024 .dw XT_DOLITERAL, URXCaddr +00006b 3ca5 .dw XT_INTSTORE + +00006c 383d .dw XT_DOLITERAL +00006d 0100 .dw usart_rx_data +00006e 383d .dw XT_DOLITERAL +00006f 0016 .dw usart_rx_size + 6 +000070 3954 .dw XT_ZERO +000071 3e98 .dw XT_FILL +000072 3820 .dw XT_EXIT + + ; ( -- c) + ; MCU + ; get 1 character from input queue, wait if needed using interrupt driver + VE_RX_BUFFER: +000073 ff06 .dw $ff06 +000074 7872 +000075 622d +000076 6675 .db "rx-buf" +000077 0054 .dw VE_HEAD + .set VE_HEAD = VE_RX_BUFFER + XT_RX_BUFFER: +000078 3801 .dw DO_COLON + PFA_RX_BUFFER: +000079 0093 .dw XT_RXQ_BUFFER +00007a 3836 .dw XT_DOCONDBRANCH +00007b 0079 .dw PFA_RX_BUFFER +00007c 383d .dw XT_DOLITERAL +00007d 0111 .dw usart_rx_out +00007e 3898 .dw XT_CFETCH +00007f 38b1 .dw XT_DUP +000080 383d .dw XT_DOLITERAL +000081 0100 .dw usart_rx_data +000082 399d .dw XT_PLUS +000083 3898 .dw XT_CFETCH +000084 38c4 .dw XT_SWAP +000085 3a2f .dw XT_1PLUS +000086 383d .dw XT_DOLITERAL +000087 000f .dw usart_rx_mask +000088 3a13 .dw XT_AND +000089 383d .dw XT_DOLITERAL +00008a 0111 .dw usart_rx_out +00008b 388d .dw XT_CSTORE +00008c 3820 .dw XT_EXIT + + ; ( -- f) + ; MCU + ; check if unread characters are in the input queue + VE_RXQ_BUFFER: +00008d ff07 .dw $ff07 +00008e 7872 +00008f 2d3f +000090 7562 +000091 0066 .db "rx?-buf",0 +000092 0073 .dw VE_HEAD + .set VE_HEAD = VE_RXQ_BUFFER + XT_RXQ_BUFFER: +000093 3801 .dw DO_COLON + PFA_RXQ_BUFFER: +000094 3d30 .dw XT_PAUSE +000095 383d .dw XT_DOLITERAL +000096 0111 .dw usart_rx_out +000097 3898 .dw XT_CFETCH +000098 383d .dw XT_DOLITERAL +000099 0110 .dw usart_rx_in +00009a 3898 .dw XT_CFETCH +00009b 3913 .dw XT_NOTEQUAL +00009c 3820 .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: +00009d ff07 .dw $ff07 +00009e 7874 +00009f 702d +0000a0 6c6f +0000a1 006c .db "tx-poll",0 +0000a2 008d .dw VE_HEAD + .set VE_HEAD = VE_TX_POLL + XT_TX_POLL: +0000a3 3801 .dw DO_COLON + PFA_TX_POLL: + ; wait for data ready +0000a4 00b1 .dw XT_TXQ_POLL +0000a5 3836 .dw XT_DOCONDBRANCH +0000a6 00a4 .dw PFA_TX_POLL + ; send to usart +0000a7 383d .dw XT_DOLITERAL +0000a8 00c6 .dw USART_DATA +0000a9 388d .dw XT_CSTORE +0000aa 3820 .dw XT_EXIT + + ; ( -- f) MCU + ; MCU + ; check if a character can be send using register poll + VE_TXQ_POLL: +0000ab ff08 .dw $ff08 +0000ac 7874 +0000ad 2d3f +0000ae 6f70 +0000af 6c6c .db "tx?-poll" +0000b0 009d .dw VE_HEAD + .set VE_HEAD = VE_TXQ_POLL + XT_TXQ_POLL: +0000b1 3801 .dw DO_COLON + PFA_TXQ_POLL: +0000b2 3d30 .dw XT_PAUSE +0000b3 383d .dw XT_DOLITERAL +0000b4 00c0 .dw USART_A +0000b5 3898 .dw XT_CFETCH +0000b6 383d .dw XT_DOLITERAL +0000b7 0020 .dw bm_USART_TXRD +0000b8 3a13 .dw XT_AND +0000b9 3820 .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: +0000ba ff04 .dw $ff04 +0000bb 6275 +0000bc 7272 .db "ubrr" +0000bd 00ab .dw VE_HEAD + .set VE_HEAD = VE_UBRR + XT_UBRR: +0000be 386f .dw PFA_DOVALUE1 + PFA_UBRR: ; ( -- ) +0000bf 008c .dw EE_UBRRVAL +0000c0 3da0 .dw XT_EDEFERFETCH +0000c1 3daa .dw XT_EDEFERSTORE + .include "words/usart.asm" + + ; MCU + ; initialize usart + VE_USART: +0000c2 ff06 .dw $ff06 +0000c3 752b +0000c4 6173 +0000c5 7472 .db "+usart" +0000c6 00ba .dw VE_HEAD + .set VE_HEAD = VE_USART + XT_USART: +0000c7 3801 .dw DO_COLON + PFA_USART: ; ( -- ) + +0000c8 383d .dw XT_DOLITERAL +0000c9 0098 .dw USART_B_VALUE +0000ca 383d .dw XT_DOLITERAL +0000cb 00c1 .dw USART_B +0000cc 388d .dw XT_CSTORE + +0000cd 383d .dw XT_DOLITERAL +0000ce 0006 .dw USART_C_VALUE +0000cf 383d .dw XT_DOLITERAL +0000d0 00c2 .dw USART_C | bm_USARTC_en +0000d1 388d .dw XT_CSTORE + +0000d2 00be .dw XT_UBRR +0000d3 38b1 .dw XT_DUP +0000d4 3af9 .dw XT_BYTESWAP +0000d5 383d .dw XT_DOLITERAL +0000d6 00c5 .dw BAUDRATE_HIGH +0000d7 388d .dw XT_CSTORE +0000d8 383d .dw XT_DOLITERAL +0000d9 00c4 .dw BAUDRATE_LOW +0000da 388d .dw XT_CSTORE + .if XT_USART_INIT_RX!=0 +0000db 0066 .dw XT_USART_INIT_RX + .endif + .if XT_USART_INIT_TX!=0 + .endif + +0000dc 3820 .dw XT_EXIT + + ; settings for 1wire interface + .equ OW_PORT=PORTB + .EQU OW_BIT=4 + .include "drivers/1wire.asm" + + ; B. J. Rodriguez (MSP 430) + ; Matthias Trute (AVR Atmega) + ; COPYRIGHT + ; (c) 2012 Bradford J. Rodriguez for the 430 code and API + + ; adapted 430 assembly code to AVR + ; wishlist: + ; use a configurable pin at runtime, compatible with bitnames.frt + ; no external pull up, no external power supply for devices + ; ??? + ; + ;.EQU OW_BIT=4 + ;.equ OW_PORT=PORTE + .set OW_DDR=(OW_PORT-1) + .set OW_PIN=(OW_DDR-1) + + ;****f* 1W.RESET + ; NAME + ; 1W.RESET + ; SYNOPSIS + ; 1W.RESET ( -- f ) Initialize 1-wire devices; return true if present + ; DESCRIPTION + ; This configures the port pin used by the 1-wire interface, and then + ; sends an "initialize" sequence to the 1-wire devices. If any device + ; is present, it will be detected. + ; + ; Timing, per DS18B20 data sheet: + ; a) Output "0" (drive output low) for >480 usec. + ; b) Output "1" (let output float). + ; c) After 15 to 60 usec, device will drive pin low for 60 to 240 usec. + ; So, wait 75 usec and sample input. + ; d) Leave output high (floating) for at least 480 usec. + ;****** + ; ( -- f ) + ; Hardware + ; Initialize 1-wire devices; return true if present + VE_OW_RESET: +0000dd ff08 .dw $ff08 +0000de 7731 +0000df 722e +0000e0 7365 +0000e1 7465 .db "1w.reset" +0000e2 00c2 .dw VE_HEAD + .set VE_HEAD = VE_OW_RESET + XT_OW_RESET: +0000e3 00e4 .dw PFA_OW_RESET + PFA_OW_RESET: +0000e4 939a +0000e5 938a savetos + ; setup to output +0000e6 9a24 sbi OW_DDR, OW_BIT + ; Pull output low +0000e7 982c cbi OW_PORT, OW_BIT + ; Delay >480 usec +0000e8 e8e0 +0000e9 e0f7 +0000ea 9731 +0000eb f7f1 DELAY 480 + ; Critical timing period, disable interrupts. +0000ec b71f in temp1, SREG +0000ed 94f8 cli + ; Pull output high +0000ee 9a2c sbi OW_PORT, OW_BIT + ; make pin input, sends "1" +0000ef 9824 cbi OW_DDR, OW_BIT +0000f0 e0e0 +0000f1 e0f1 +0000f2 9731 +0000f3 f7f1 DELAY 64 ; delayB + ; Sample input pin, set TOS if input is zero +0000f4 b183 in tosl, OW_PIN +0000f5 ff84 sbrs tosl, OW_BIT +0000f6 ef9f ser tosh + ; End critical timing period, enable interrupts +0000f7 bf1f out SREG, temp1 + ; release bus +0000f8 9824 cbi OW_DDR, OW_BIT +0000f9 982c cbi OW_PORT, OW_BIT + + ; Delay rest of 480 usec +0000fa e8e0 +0000fb e0f6 +0000fc 9731 +0000fd f7f1 DELAY 416 + ; we now have the result flag in TOS +0000fe 2f89 mov tosl, tosh +0000ff 940c 3805 jmp_ DO_NEXT + + ;****f* 1W.SLOT + ; NAME + ; 1W.SLOT + ; SYNOPSIS + ; 1W.SLOT ( c -- c' ) Write and read one bit to/from 1-wire. + ; DESCRIPTION + ; The "touch byte" function is described in Dallas App Note 74. + ; It outputs a byte to the 1-wire pin, LSB first, and reads back + ; the state of the 1-wire pin after a suitable delay. + ; To read a byte, output $FF and read the reply data. + ; To write a byte, output that byte and discard the reply. + ; + ; This function performs one bit of the "touch" operation -- + ; one read/write "slot" in Dallas jargon. Perform this eight + ; times in a row to get the "touch byte" function. + ; + ; PARAMETERS + ; The input parameter is xxxxxxxxbbbbbbbo where + ; 'xxxxxxxx' are don't cares, + ; 'bbbbbbb' are bits to be shifted down, and + ; 'o' is the bit to be output in the slot. This must be 1 + ; to create a read slot. + ; + ; The returned value is xxxxxxxxibbbbbbb where + ; 'xxxxxxxx' are not known (the input shifted down 1 position), + ; 'i' is the bit read during the slot. This has no meaning + ; if it was a write slot. + ; 'bbbbbbb' are the 7 input bits, shifted down one position. + ; + ; This peculiar parameter usage allows OWTOUCH to be written as + ; OWSLOT OWSLOT OWSLOT OWSLOT OWSLOT OWSLOT OWSLOT OWSLOT + ; + ; NOTES + ; Interrupts are disabled during each bit. + + ; Timing, per DS18B20 data sheet: + ; a) Output "0" for start period. (> 1 us, < 15 us, typ. 6 us*) + ; b) Output data bit (0 or 1), open drain + ; c) After MS from start of cycle, sample input (15 to 60 us, typ. 25 us*) + ; d) After write-0 period from start of cycle, output "1" (>60 us) + ; e) After recovery period, loop or return. (> 1 us) + ; For writes, DS18B20 samples input 15 to 60 usec from start of cycle. + ; * "Typical" values are per App Note 132 for a 300m cable length. + + ; --------- ------------------------------- + ; \ / / + ; ------------------------------- + ; a b c d e + ; | 6us | 19us | 35us | 2us | + ;****** + ; ( c -- c' ) + ; Hardware + ; Write and read one bit to/from 1-wire. + VE_OW_SLOT: +000101 ff07 .dw $ff07 +000102 7731 +000103 732e +000104 6f6c +000105 0074 .db "1w.slot",0 +000106 00dd .dw VE_HEAD + .set VE_HEAD = VE_OW_SLOT + XT_OW_SLOT: +000107 0108 .dw PFA_OW_SLOT + PFA_OW_SLOT: + ; pull low +000108 982c cbi OW_PORT, OW_BIT +000109 9a24 sbi OW_DDR, OW_BIT + ; disable interrupts +00010a b71f in temp1, SREG +00010b 94f8 cli +00010c e1e8 +00010d e0f0 +00010e 9731 +00010f f7f1 DELAY 6 ; DELAY A + ; check bit +000110 9488 clc +000111 9587 ror tosl +000112 f410 brcc PFA_OW_SLOT0 ; a 0 keeps the bus low + ; release bus, a 1 is written +000113 9a2c sbi OW_PORT, OW_BIT +000114 9824 cbi OW_DDR, OW_BIT + PFA_OW_SLOT0: + ; sample the input (no action required if zero) +000115 e2e4 +000116 e0f0 +000117 9731 +000118 f7f1 DELAY 9 ; wait DELAY E to sample +000119 b103 in temp0, OW_PIN +00011a fd04 sbrc temp0, OW_BIT +00011b 6880 ori tosl, $80 + +00011c ecec +00011d e0f0 +00011e 9731 +00011f f7f1 DELAY 51 ; DELAY B +000120 9a2c sbi OW_PORT, OW_BIT ; release bus +000121 9824 cbi OW_DDR, OW_BIT +000122 e0e8 +000123 e0f0 +000124 9731 +000125 f7f1 delay 2 + ; re-enable interrupts +000126 bf1f out SREG, temp1 +000127 940c 3805 jmp_ DO_NEXT + + .include "amforth.asm" + + ;;;; + ;;;; GPL V2 (only) + + .set AMFORTH_NRWW_SIZE=(FLASHEND-AMFORTH_RO_SEG)*2 + + .set corepc = pc + .org $0000 +000000 940c 3d39 jmp_ PFA_COLD + + .org corepc + .include "drivers/generic-isr.asm" + + .eseg +000000 intvec: .byte INTVECTORS * CELLSIZE + .dseg +000112 intcnt: .byte INTVECTORS + .cseg + + ; interrupt routine gets called (again) by rcall! This gives the + ; address of the int-vector on the stack. + isr: +000129 920a st -Y, r0 +00012a b60f in r0, SREG +00012b 920a st -Y, r0 + .if (pclen==3) + .endif +00012c 900f pop r0 +00012d 900f pop r0 ; = intnum * intvectorsize + 1 (address following the rcall) +00012e 940a dec r0 + .if intvecsize == 1 ; + .endif +00012f 2cb0 mov isrflag, r0 +000130 93ff push zh +000131 93ef push zl +000132 e1e2 ldi zl, low(intcnt) +000133 e0f1 ldi zh, high(intcnt) +000134 9406 lsr r0 ; we use byte addresses in the counter array, not words +000135 0de0 add zl, r0 +000136 1df3 adc zh, zeroh +000137 8000 ld r0, Z +000138 9403 inc r0 +000139 8200 st Z, r0 +00013a 91ef pop zl +00013b 91ff pop zh + +00013c 9009 ld r0, Y+ +00013d be0f out SREG, r0 +00013e 9009 ld r0, Y+ +00013f 9508 ret ; returns the interrupt, the rcall stack frame is removed! + ; no reti here, see words/isr-end.asm + ; lower part of the dictionary + .include "dict/rww.inc" + + + ; Arithmetics + ; add a number to a double cell + VE_MPLUS: +000140 ff02 .dw $ff02 +000141 2b6d .db "m+" +000142 0101 .dw VE_HEAD + .set VE_HEAD = VE_MPLUS + XT_MPLUS: +000143 3801 .dw DO_COLON + PFA_MPLUS: +000144 3fc7 .dw XT_S2D +000145 3c15 .dw XT_DPLUS +000146 3820 .dw XT_EXIT + .include "words/ud-star.asm" + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_UDSTAR: +000147 ff03 .dw $ff03 +000148 6475 +../../common\words/ud-star.asm(9): warning: .cseg .db misalignment - padding zero byte +000149 002a .db "ud*" +00014a 0140 .dw VE_HEAD + .set VE_HEAD = VE_UDSTAR + XT_UDSTAR: +00014b 3801 .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 + ; + +00014c 38b1 +00014d 38ff +00014e 39e0 +00014f 38d9 .DW XT_DUP,XT_TO_R,XT_UMSTAR,XT_DROP +000150 38c4 +000151 38f6 +000152 39e0 +000153 38e1 +000154 399d +000155 3820 .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: +000156 ff04 .dw $ff04 +000157 6d75 +000158 7861 .db "umax" +000159 0147 .dw VE_HEAD + .set VE_HEAD = VE_UMAX + XT_UMAX: +00015a 3801 .dw DO_COLON + PFA_UMAX: + .endif + +00015b 3ec9 +00015c 395c .DW XT_2DUP,XT_ULESS +00015d 3836 .dw XT_DOCONDBRANCH +00015e 0160 DEST(UMAX1) +00015f 38c4 .DW XT_SWAP +000160 38d9 UMAX1: .DW XT_DROP +000161 3820 .dw XT_EXIT + .include "words/umin.asm" + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_UMIN: +000162 ff04 .dw $ff04 +000163 6d75 +000164 6e69 .db "umin" +000165 0156 .dw VE_HEAD + .set VE_HEAD = VE_UMIN + XT_UMIN: +000166 3801 .dw DO_COLON + PFA_UMIN: + .endif +000167 3ec9 +000168 3967 .DW XT_2DUP,XT_UGREATER +000169 3836 .dw XT_DOCONDBRANCH +00016a 016c DEST(UMIN1) +00016b 38c4 .DW XT_SWAP +00016c 38d9 UMIN1: .DW XT_DROP +00016d 3820 .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: +00016e 3801 .dw DO_COLON + PFA_IMMEDIATEQ: +00016f 383d .dw XT_DOLITERAL +000170 8000 .dw $8000 +000171 3a13 .dw XT_AND +000172 391a .dw XT_ZEROEQUAL +000173 3836 .dw XT_DOCONDBRANCH +000174 0177 DEST(IMMEDIATEQ1) +000175 3fe6 .dw XT_ONE +000176 3820 .dw XT_EXIT + IMMEDIATEQ1: + ; not immediate +000177 394b .dw XT_TRUE +000178 3820 .dw XT_EXIT + .include "words/name2flags.asm" + + ; Tools + ; get the flags from a name token + VE_NAME2FLAGS: +000179 ff0a .dw $ff0a +00017a 616e +00017b 656d +00017c 663e +00017d 616c +00017e 7367 .db "name>flags" +00017f 0162 .dw VE_HEAD + .set VE_HEAD = VE_NAME2FLAGS + XT_NAME2FLAGS: +000180 3801 .dw DO_COLON + PFA_NAME2FLAGS: +000181 3bcb .dw XT_FETCHI ; skip to link field +000182 383d .dw XT_DOLITERAL +000183 ff00 .dw $ff00 +000184 3a13 .dw XT_AND +000185 3820 .dw XT_EXIT + + .if AMFORTH_NRWW_SIZE > 8000 + .elif AMFORTH_NRWW_SIZE > 4000 + .include "dict/appl_4k.inc" + + + ; Tools + ; print the version string + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_DOT_VER: +000186 ff03 .dw $ff03 +000187 6576 +../../common\words/ver.asm(12): warning: .cseg .db misalignment - padding zero byte +000188 0072 .db "ver" +000189 0179 .dw VE_HEAD + .set VE_HEAD = VE_DOT_VER + XT_DOT_VER: +00018a 3801 .dw DO_COLON + PFA_DOT_VER: + .endif +00018b 02da .dw XT_ENV_FORTHNAME +00018c 0403 .dw XT_ITYPE +00018d 3fae .dw XT_SPACE +00018e 3ebd .dw XT_BASE +00018f 3879 .dw XT_FETCH + +000190 02e8 .dw XT_ENV_FORTHVERSION +000191 3f41 .dw XT_DECIMAL +000192 3fc7 .dw XT_S2D +000193 0321 .dw XT_L_SHARP +000194 0329 .dw XT_SHARP +000195 383d .dw XT_DOLITERAL +000196 002e .dw '.' +000197 0312 .dw XT_HOLD +000198 033f .dw XT_SHARP_S +000199 034a .dw XT_SHARP_G +00019a 0439 .dw XT_TYPE +00019b 3ebd .dw XT_BASE +00019c 3881 .dw XT_STORE +00019d 3fae .dw XT_SPACE +00019e 02f0 .dw XT_ENV_CPU +00019f 0403 .dw XT_ITYPE + +0001a0 3820 .dw XT_EXIT + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + .include "words/noop.asm" + + ; Tools + ; do nothing + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_NOOP: +0001a1 ff04 .dw $ff04 +0001a2 6f6e +0001a3 706f .db "noop" +0001a4 0186 .dw VE_HEAD + .set VE_HEAD = VE_NOOP + XT_NOOP: +0001a5 3801 .dw DO_COLON + PFA_NOOP: + .endif +0001a6 3820 .DW XT_EXIT + .include "words/unused.asm" + + ; Tools + ; Amount of available RAM (incl. PAD) + VE_UNUSED: +0001a7 ff06 .dw $ff06 +0001a8 6e75 +0001a9 7375 +0001aa 6465 .db "unused" +0001ab 01a1 .dw VE_HEAD + .set VE_HEAD = VE_UNUSED + XT_UNUSED: +0001ac 3801 .dw DO_COLON + PFA_UNUSED: +0001ad 3a8d .dw XT_SP_FETCH +0001ae 3f23 .dw XT_HERE +0001af 3993 .dw XT_MINUS +0001b0 3820 .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: +0001b1 0002 .dw $0002 +0001b2 6f74 .db "to" +0001b3 01a7 .dw VE_HEAD + .set VE_HEAD = VE_TO + XT_TO: +0001b4 3801 .dw DO_COLON + PFA_TO: + .endif +0001b5 0448 .dw XT_TICK +0001b6 3fd0 .dw XT_TO_BODY +0001b7 3eb7 .dw XT_STATE +0001b8 3879 .dw XT_FETCH +0001b9 3836 .dw XT_DOCONDBRANCH +0001ba 01c5 DEST(PFA_TO1) +0001bb 075c .dw XT_COMPILE +0001bc 01bf .dw XT_DOTO +0001bd 0767 .dw XT_COMMA +0001be 3820 .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: +0001bf 3801 .dw DO_COLON + PFA_DOTO: + .endif +0001c0 38f6 .dw XT_R_FROM +0001c1 38b1 .dw XT_DUP +0001c2 01d1 .dw XT_ICELLPLUS +0001c3 38ff .dw XT_TO_R +0001c4 3bcb .dw XT_FETCHI + PFA_TO1: +0001c5 38b1 .dw XT_DUP +0001c6 01d1 .dw XT_ICELLPLUS +0001c7 01d1 .dw XT_ICELLPLUS +0001c8 3bcb .dw XT_FETCHI +0001c9 382a .dw XT_EXECUTE +0001ca 3820 .dw XT_EXIT + .include "words/i-cellplus.asm" + + ; Compiler + ; skip to the next cell in flash + VE_ICELLPLUS: +0001cb ff07 .dw $FF07 +0001cc 2d69 +0001cd 6563 +0001ce 6c6c +0001cf 002b .db "i-cell+",0 +0001d0 01b1 .dw VE_HEAD + .set VE_HEAD = VE_ICELLPLUS + XT_ICELLPLUS: +0001d1 3801 .dw DO_COLON + PFA_ICELLPLUS: +0001d2 3a2f .dw XT_1PLUS +0001d3 3820 .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: +0001d4 ff08 .dw $ff08 +0001d5 6369 +0001d6 6d6f +0001d7 6170 +0001d8 6572 .db "icompare" +0001d9 01cb .dw VE_HEAD + .set VE_HEAD = VE_ICOMPARE + XT_ICOMPARE: +0001da 3801 .dw DO_COLON + PFA_ICOMPARE: +0001db 38ff .dw XT_TO_R ; ( -- r-addr r-len f-addr) +0001dc 38cf .dw XT_OVER ; ( -- r-addr r-len f-addr r-len) +0001dd 38f6 .dw XT_R_FROM ; ( -- r-addr r-len f-addr r-len f-len ) +0001de 3913 .dw XT_NOTEQUAL ; ( -- r-addr r-len f-addr flag ) +0001df 3836 .dw XT_DOCONDBRANCH +0001e0 01e5 .dw PFA_ICOMPARE_SAMELEN +0001e1 3ed2 .dw XT_2DROP +0001e2 38d9 .dw XT_DROP +0001e3 394b .dw XT_TRUE +0001e4 3820 .dw XT_EXIT + PFA_ICOMPARE_SAMELEN: +0001e5 38c4 .dw XT_SWAP ; ( -- r-addr f-addr len ) +0001e6 3954 .dw XT_ZERO +0001e7 0826 .dw XT_QDOCHECK +0001e8 3836 .dw XT_DOCONDBRANCH +0001e9 0208 .dw PFA_ICOMPARE_DONE +0001ea 3a9b .dw XT_DODO + PFA_ICOMPARE_LOOP: + ; ( r-addr f-addr --) +0001eb 38cf .dw XT_OVER +0001ec 3879 .dw XT_FETCH + .if WANT_IGNORECASE == 1 + .endif +0001ed 38cf .dw XT_OVER +0001ee 3bcb .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 +0001ef 38b1 .dw XT_DUP + ;.dw XT_BYTESWAP +0001f0 383d .dw XT_DOLITERAL +0001f1 0100 .dw $100 +0001f2 395c .dw XT_ULESS +0001f3 3836 .dw XT_DOCONDBRANCH +0001f4 01f9 .dw PFA_ICOMPARE_LASTCELL +0001f5 38c4 .dw XT_SWAP +0001f6 383d .dw XT_DOLITERAL +0001f7 00ff .dw $00FF +0001f8 3a13 .dw XT_AND ; the final swap can be omitted + PFA_ICOMPARE_LASTCELL: +0001f9 3913 .dw XT_NOTEQUAL +0001fa 3836 .dw XT_DOCONDBRANCH +0001fb 0200 .dw PFA_ICOMPARE_NEXTLOOP +0001fc 3ed2 .dw XT_2DROP +0001fd 394b .dw XT_TRUE +0001fe 3ad4 .dw XT_UNLOOP +0001ff 3820 .dw XT_EXIT + PFA_ICOMPARE_NEXTLOOP: +000200 3a2f .dw XT_1PLUS +000201 38c4 .dw XT_SWAP +000202 3c90 .dw XT_CELLPLUS +000203 38c4 .dw XT_SWAP +000204 383d .dw XT_DOLITERAL +000205 0002 .dw 2 +000206 3aba .dw XT_DOPLUSLOOP +000207 01eb .dw PFA_ICOMPARE_LOOP + PFA_ICOMPARE_DONE: +000208 3ed2 .dw XT_2DROP +000209 3954 .dw XT_ZERO +00020a 3820 .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: +00020b ff01 .dw $ff01 +00020c 002a .db "*",0 +00020d 01d4 .dw VE_HEAD + .set VE_HEAD = VE_STAR + XT_STAR: +00020e 3801 .dw DO_COLON + PFA_STAR: + .endif + +00020f 39a6 .dw XT_MSTAR +000210 38d9 .dw XT_DROP +000211 3820 .dw XT_EXIT + .include "words/j.asm" + + ; Compiler + ; loop counter of outer loop + VE_J: +000212 ff01 .dw $FF01 +000213 006a .db "j",0 +000214 020b .dw VE_HEAD + .set VE_HEAD = VE_J + XT_J: +000215 3801 .dw DO_COLON + PFA_J: +000216 3a76 .dw XT_RP_FETCH +000217 383d .dw XT_DOLITERAL +000218 0007 .dw 7 +000219 399d .dw XT_PLUS +00021a 3879 .dw XT_FETCH +00021b 3a76 .dw XT_RP_FETCH +00021c 383d .dw XT_DOLITERAL +00021d 0009 .dw 9 +00021e 399d .dw XT_PLUS +00021f 3879 .dw XT_FETCH +000220 399d .dw XT_PLUS +000221 3820 .dw XT_EXIT + .include "words/dabs.asm" + + ; Arithmetics + ; double cell absolute value + VE_DABS: +000222 ff04 .dw $ff04 +000223 6164 +000224 7362 .db "dabs" +000225 0212 .dw VE_HEAD + .set VE_HEAD = VE_DABS + XT_DABS: +000226 3801 .dw DO_COLON + PFA_DABS: +000227 38b1 .dw XT_DUP +000228 3921 .dw XT_ZEROLESS +000229 3836 .dw XT_DOCONDBRANCH +00022a 022c .dw PFA_DABS1 +00022b 0233 .dw XT_DNEGATE + PFA_DABS1: +00022c 3820 .dw XT_EXIT + ; : dabs ( ud1 -- +d2 ) dup 0< if dnegate then ; + .include "words/dnegate.asm" + + ; Arithmetics + ; double cell negation + VE_DNEGATE: +00022d ff07 .dw $ff07 +00022e 6e64 +00022f 6765 +000230 7461 +000231 0065 .db "dnegate",0 +000232 0222 .dw VE_HEAD + .set VE_HEAD = VE_DNEGATE + XT_DNEGATE: +000233 3801 .dw DO_COLON + PFA_DNEGATE: +000234 3c3b .dw XT_DINVERT +000235 3fe6 .dw XT_ONE +000236 3954 .dw XT_ZERO +000237 3c15 .dw XT_DPLUS +000238 3820 .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: +000239 ff05 .dw $ff05 +00023a 6d63 +00023b 766f +00023c 0065 .db "cmove",0 +00023d 022d .dw VE_HEAD + .set VE_HEAD = VE_CMOVE + XT_CMOVE: +00023e 023f .dw PFA_CMOVE + PFA_CMOVE: +00023f 93bf push xh +000240 93af push xl +000241 91e9 ld zl, Y+ +000242 91f9 ld zh, Y+ ; addr-to +000243 91a9 ld xl, Y+ +000244 91b9 ld xh, Y+ ; addr-from +000245 2f09 mov temp0, tosh +000246 2b08 or temp0, tosl +000247 f021 brbs 1, PFA_CMOVE1 + PFA_CMOVE2: +000248 911d ld temp1, X+ +000249 9311 st Z+, temp1 +00024a 9701 sbiw tosl, 1 +00024b f7e1 brbc 1, PFA_CMOVE2 + PFA_CMOVE1: +00024c 91af pop xl +00024d 91bf pop xh +00024e 9189 +00024f 9199 loadtos +000250 940c 3805 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: +000252 ff05 .dw $ff05 +000253 7332 +000254 6177 +000255 0070 .db "2swap",0 +000256 0239 .dw VE_HEAD + .set VE_HEAD = VE_2SWAP + XT_2SWAP: +000257 3801 .dw DO_COLON + PFA_2SWAP: + + .endif +000258 38e1 .dw XT_ROT +000259 38ff .dw XT_TO_R +00025a 38e1 .dw XT_ROT +00025b 38f6 .dw XT_R_FROM +00025c 3820 .dw XT_EXIT + .include "words/tib.asm" + + ; System + ; refills the input buffer + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_REFILLTIB: +00025d ff0a .dw $ff0a +00025e 6572 +00025f 6966 +000260 6c6c +000261 742d +000262 6269 .db "refill-tib" +000263 0252 .dw VE_HEAD + .set VE_HEAD = VE_REFILLTIB + XT_REFILLTIB: +000264 3801 .dw DO_COLON + PFA_REFILLTIB: + .endif +000265 0280 .dw XT_TIB +000266 383d .dw XT_DOLITERAL +000267 005a .dw TIB_SIZE +000268 0498 .dw XT_ACCEPT +000269 0286 .dw XT_NUMBERTIB +00026a 3881 .dw XT_STORE +00026b 3954 .dw XT_ZERO +00026c 3ee2 .dw XT_TO_IN +00026d 3881 .dw XT_STORE +00026e 394b .dw XT_TRUE ; -1 +00026f 3820 .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: +000270 ff0a .dw $FF0A +000271 6f73 +000272 7275 +000273 6563 +000274 742d +000275 6269 .db "source-tib" +000276 025d .dw VE_HEAD + .set VE_HEAD = VE_SOURCETIB + XT_SOURCETIB: +000277 3801 .dw DO_COLON + PFA_SOURCETIB: + .endif +000278 0280 .dw XT_TIB +000279 0286 .dw XT_NUMBERTIB +00027a 3879 .dw XT_FETCH +00027b 3820 .dw XT_EXIT + + ; ( -- addr ) + ; System Variable + ; terminal input buffer address + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_TIB: +00027c ff03 .dw $ff03 +00027d 6974 +00027e 0062 .db "tib",0 +00027f 0270 .dw VE_HEAD + .set VE_HEAD = VE_TIB + XT_TIB: +000280 3848 .dw PFA_DOVARIABLE + PFA_TIB: +000281 012c .dw ram_tib + .dseg +00012c 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: +000282 ff04 .dw $ff04 +000283 7423 +000284 6269 .db "#tib" +000285 027c .dw VE_HEAD + .set VE_HEAD = VE_NUMBERTIB + XT_NUMBERTIB: +000286 3848 .dw PFA_DOVARIABLE + PFA_NUMBERTIB: +000287 0186 .dw ram_sharptib + .dseg +000186 ram_sharptib: .byte 2 + .cseg + .endif + .include "words/init-ram.asm" + + ; Tools + ; copy len cells from eeprom to ram + VE_EE2RAM: +000288 ff06 .dw $ff06 +000289 6565 +00028a 723e +00028b 6d61 .db "ee>ram" +00028c 0282 .dw VE_HEAD + .set VE_HEAD = VE_EE2RAM + XT_EE2RAM: +00028d 3801 .dw DO_COLON + PFA_EE2RAM: ; ( -- ) +00028e 3954 .dw XT_ZERO +00028f 3a9b .dw XT_DODO + PFA_EE2RAM_1: + ; ( -- e-addr r-addr ) +000290 38cf .dw XT_OVER +000291 3b5f .dw XT_FETCHE +000292 38cf .dw XT_OVER +000293 3881 .dw XT_STORE +000294 3c90 .dw XT_CELLPLUS +000295 38c4 .dw XT_SWAP +000296 3c90 .dw XT_CELLPLUS +000297 38c4 .dw XT_SWAP +000298 3ac9 .dw XT_DOLOOP +000299 0290 .dw PFA_EE2RAM_1 + PFA_EE2RAM_2: +00029a 3ed2 .dw XT_2DROP +00029b 3820 .dw XT_EXIT + + ; ( -- ) + ; Tools + ; setup the default user area from eeprom + VE_INIT_RAM: +00029c ff08 .dw $ff08 +00029d 6e69 +00029e 7469 +00029f 722d +0002a0 6d61 .db "init-ram" +0002a1 0288 .dw VE_HEAD + .set VE_HEAD = VE_INIT_RAM + XT_INIT_RAM: +0002a2 3801 .dw DO_COLON + PFA_INI_RAM: ; ( -- ) +0002a3 383d .dw XT_DOLITERAL +0002a4 006a .dw EE_INITUSER +0002a5 3b02 .dw XT_UP_FETCH +0002a6 383d .dw XT_DOLITERAL +0002a7 0022 .dw SYSUSERSIZE +0002a8 3a04 .dw XT_2SLASH +0002a9 028d .dw XT_EE2RAM +0002aa 3820 .dw XT_EXIT + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + + .include "words/environment.asm" + + ; System Value + ; word list identifier of the environmental search list + VE_ENVIRONMENT: +0002ab ff0b .dw $ff0b +0002ac 6e65 +0002ad 6976 +0002ae 6f72 +0002af 6d6e +0002b0 6e65 +0002b1 0074 .db "environment",0 +0002b2 029c .dw VE_HEAD + .set VE_HEAD = VE_ENVIRONMENT + XT_ENVIRONMENT: +0002b3 3848 .dw PFA_DOVARIABLE + PFA_ENVIRONMENT: +0002b4 0044 .dw CFG_ENVIRONMENT + .include "words/env-wordlists.asm" + + ; Environment + ; maximum number of wordlists in the dictionary search order + VE_ENVWORDLISTS: +0002b5 ff09 .dw $ff09 +0002b6 6f77 +0002b7 6472 +0002b8 696c +0002b9 7473 +0002ba 0073 .db "wordlists",0 +0002bb 0000 .dw VE_ENVHEAD + .set VE_ENVHEAD = VE_ENVWORDLISTS + XT_ENVWORDLISTS: +0002bc 3801 .dw DO_COLON + PFA_ENVWORDLISTS: +0002bd 383d .dw XT_DOLITERAL +0002be 0008 .dw NUMWORDLISTS +0002bf 3820 .dw XT_EXIT + .include "words/env-slashpad.asm" + + ; Environment + ; Size of the PAD buffer in bytes + VE_ENVSLASHPAD: +0002c0 ff04 .dw $ff04 +0002c1 702f +0002c2 6461 .db "/pad" +0002c3 02b5 .dw VE_ENVHEAD + .set VE_ENVHEAD = VE_ENVSLASHPAD + XT_ENVSLASHPAD: +0002c4 3801 .dw DO_COLON + PFA_ENVSLASHPAD: +0002c5 3a8d .dw XT_SP_FETCH +0002c6 3ee8 .dw XT_PAD +0002c7 3993 .dw XT_MINUS +0002c8 3820 .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: +0002c9 ff05 .dw $ff05 +0002ca 682f +0002cb 6c6f +0002cc 0064 .db "/hold",0 +0002cd 02c0 .dw VE_ENVHEAD + .set VE_ENVHEAD = VE_ENVSLASHHOLD + XT_ENVSLASHHOLD: +0002ce 3801 .dw DO_COLON + PFA_ENVSLASHHOLD: + .endif +0002cf 3ee8 .dw XT_PAD +0002d0 3f23 .dw XT_HERE +0002d1 3993 .dw XT_MINUS +0002d2 3820 .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: +0002d3 ff0a .dw $ff0a +0002d4 6f66 +0002d5 7472 +0002d6 2d68 +0002d7 616e +0002d8 656d .db "forth-name" +0002d9 02c9 .dw VE_ENVHEAD + .set VE_ENVHEAD = VE_ENV_FORTHNAME + XT_ENV_FORTHNAME: +0002da 3801 .dw DO_COLON + PFA_EN_FORTHNAME: +0002db 03d0 .dw XT_DOSLITERAL +0002dc 0007 .dw 7 + .endif +0002dd 6d61 +0002de 6f66 +0002df 7472 +../../common\words/env-forthname.asm(22): warning: .cseg .db misalignment - padding zero byte +0002e0 0068 .db "amforth" + .if cpu_msp430==1 + .endif +0002e1 3820 .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: +0002e2 ff07 .dw $ff07 +0002e3 6576 +0002e4 7372 +0002e5 6f69 +0002e6 006e .db "version",0 +0002e7 02d3 .dw VE_ENVHEAD + .set VE_ENVHEAD = VE_ENV_FORTHVERSION + XT_ENV_FORTHVERSION: +0002e8 3801 .dw DO_COLON + PFA_EN_FORTHVERSION: + .endif +0002e9 383d .dw XT_DOLITERAL +0002ea 0041 .dw 65 +0002eb 3820 .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: +0002ec ff03 .dw $ff03 +0002ed 7063 +0002ee 0075 .db "cpu",0 +0002ef 02e2 .dw VE_ENVHEAD + .set VE_ENVHEAD = VE_ENV_CPU + XT_ENV_CPU: +0002f0 3801 .dw DO_COLON + PFA_EN_CPU: + .endif +0002f1 383d .dw XT_DOLITERAL +0002f2 0037 .dw mcu_name +0002f3 042f .dw XT_ICOUNT +0002f4 3820 .dw XT_EXIT + .include "words/env-mcuinfo.asm" + + ; Environment + ; flash address of some CPU specific parameters + VE_ENV_MCUINFO: +0002f5 ff08 .dw $ff08 +0002f6 636d +0002f7 2d75 +0002f8 6e69 +0002f9 6f66 .db "mcu-info" +0002fa 02ec .dw VE_ENVHEAD + .set VE_ENVHEAD = VE_ENV_MCUINFO + XT_ENV_MCUINFO: +0002fb 3801 .dw DO_COLON + PFA_EN_MCUINFO: +0002fc 383d .dw XT_DOLITERAL +0002fd 0033 .dw mcu_info +0002fe 3820 .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: +0002ff ff05 .dw $ff05 +000300 752f +000301 6573 +000302 0072 .db "/user",0 +000303 02f5 .dw VE_ENVHEAD + .set VE_ENVHEAD = VE_ENVUSERSIZE + XT_ENVUSERSIZE: +000304 3801 .dw DO_COLON + PFA_ENVUSERSIZE: + .endif +000305 383d .dw XT_DOLITERAL +000306 002c .dw SYSUSERSIZE + APPUSERSIZE +000307 3820 .dw XT_EXIT + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + .include "words/hld.asm" + + ; Numeric IO + ; pointer to current write position in the Pictured Numeric Output buffer + VE_HLD: +000308 ff03 .dw $ff03 +000309 6c68 +00030a 0064 .db "hld",0 +00030b 02ab .dw VE_HEAD + .set VE_HEAD = VE_HLD + XT_HLD: +00030c 3848 .dw PFA_DOVARIABLE + PFA_HLD: +00030d 0188 .dw ram_hld + + .dseg +000188 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: +00030e ff04 .dw $ff04 +00030f 6f68 +000310 646c .db "hold" +000311 0308 .dw VE_HEAD + .set VE_HEAD = VE_HOLD + XT_HOLD: +000312 3801 .dw DO_COLON + PFA_HOLD: + .endif +000313 030c .dw XT_HLD +000314 38b1 .dw XT_DUP +000315 3879 .dw XT_FETCH +000316 3a35 .dw XT_1MINUS +000317 38b1 .dw XT_DUP +000318 38ff .dw XT_TO_R +000319 38c4 .dw XT_SWAP +00031a 3881 .dw XT_STORE +00031b 38f6 .dw XT_R_FROM +00031c 388d .dw XT_CSTORE +00031d 3820 .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: +00031e ff02 .dw $ff02 +00031f 233c .db "<#" +000320 030e .dw VE_HEAD + .set VE_HEAD = VE_L_SHARP + XT_L_SHARP: +000321 3801 .dw DO_COLON + PFA_L_SHARP: + .endif +000322 3ee8 .dw XT_PAD +000323 030c .dw XT_HLD +000324 3881 .dw XT_STORE +000325 3820 .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: +000326 ff01 .dw $ff01 +000327 0023 .db "#",0 +000328 031e .dw VE_HEAD + .set VE_HEAD = VE_SHARP + XT_SHARP: +000329 3801 .dw DO_COLON + PFA_SHARP: + .endif +00032a 3ebd .dw XT_BASE +00032b 3879 .dw XT_FETCH +00032c 03a6 .dw XT_UDSLASHMOD +00032d 38e1 .dw XT_ROT +00032e 383d .dw XT_DOLITERAL +00032f 0009 .dw 9 +000330 38cf .dw XT_OVER +000331 396e .dw XT_LESS +000332 3836 .dw XT_DOCONDBRANCH +000333 0337 DEST(PFA_SHARP1) +000334 383d .dw XT_DOLITERAL +000335 0007 .dw 7 +000336 399d .dw XT_PLUS + PFA_SHARP1: +000337 383d .dw XT_DOLITERAL +000338 0030 .dw 48 ; ASCII 0 +000339 399d .dw XT_PLUS +00033a 0312 .dw XT_HOLD +00033b 3820 .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: +00033c ff02 .dw $ff02 +00033d 7323 .db "#s" +00033e 0326 .dw VE_HEAD + .set VE_HEAD = VE_SHARP_S + XT_SHARP_S: +00033f 3801 .dw DO_COLON + PFA_SHARP_S: + .endif + NUMS1: +000340 0329 .dw XT_SHARP +000341 3ec9 .dw XT_2DUP +000342 3a1c .dw XT_OR +000343 391a .dw XT_ZEROEQUAL +000344 3836 .dw XT_DOCONDBRANCH +000345 0340 DEST(NUMS1) ; PFA_SHARP_S +000346 3820 .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: +000347 ff02 .dw $ff02 +000348 3e23 .db "#>" +000349 033c .dw VE_HEAD + .set VE_HEAD = VE_SHARP_G + XT_SHARP_G: +00034a 3801 .dw DO_COLON + PFA_SHARP_G: + .endif +00034b 3ed2 .dw XT_2DROP +00034c 030c .dw XT_HLD +00034d 3879 .dw XT_FETCH +00034e 3ee8 .dw XT_PAD +00034f 38cf .dw XT_OVER +000350 3993 .dw XT_MINUS +000351 3820 .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: +000352 ff04 .dw $ff04 +000353 6973 +000354 6e67 .db "sign" +000355 0347 .dw VE_HEAD + .set VE_HEAD = VE_SIGN + XT_SIGN: +000356 3801 .dw DO_COLON + PFA_SIGN: + .endif +000357 3921 .dw XT_ZEROLESS +000358 3836 .dw XT_DOCONDBRANCH +000359 035d DEST(PFA_SIGN1) +00035a 383d .dw XT_DOLITERAL +00035b 002d .dw 45 ; ascii - +00035c 0312 .dw XT_HOLD + PFA_SIGN1: +00035d 3820 .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: +00035e ff03 .dw $ff03 +00035f 2e64 +000360 0072 .db "d.r",0 +000361 0352 .dw VE_HEAD + .set VE_HEAD = VE_DDOTR + XT_DDOTR: +000362 3801 .dw DO_COLON + PFA_DDOTR: + + .endif +000363 38ff .dw XT_TO_R +000364 3eda .dw XT_TUCK +000365 0226 .dw XT_DABS +000366 0321 .dw XT_L_SHARP +000367 033f .dw XT_SHARP_S +000368 38e1 .dw XT_ROT +000369 0356 .dw XT_SIGN +00036a 034a .dw XT_SHARP_G +00036b 38f6 .dw XT_R_FROM +00036c 38cf .dw XT_OVER +00036d 3993 .dw XT_MINUS +00036e 3fb7 .dw XT_SPACES +00036f 0439 .dw XT_TYPE +000370 3820 .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: +000371 ff02 .dw $ff02 +000372 722e .db ".r" +000373 035e .dw VE_HEAD + .set VE_HEAD = VE_DOTR + XT_DOTR: +000374 3801 .dw DO_COLON + PFA_DOTR: + + .endif +000375 38ff .dw XT_TO_R +000376 3fc7 .dw XT_S2D +000377 38f6 .dw XT_R_FROM +000378 0362 .dw XT_DDOTR +000379 3820 .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: +00037a ff02 .dw $ff02 +00037b 2e64 .db "d." +00037c 0371 .dw VE_HEAD + .set VE_HEAD = VE_DDOT + XT_DDOT: +00037d 3801 .dw DO_COLON + PFA_DDOT: + + .endif +00037e 3954 .dw XT_ZERO +00037f 0362 .dw XT_DDOTR +000380 3fae .dw XT_SPACE +000381 3820 .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: +000382 ff01 .dw $ff01 +000383 002e .db ".",0 +000384 037a .dw VE_HEAD + .set VE_HEAD = VE_DOT + XT_DOT: +000385 3801 .dw DO_COLON + PFA_DOT: + .endif +000386 3fc7 .dw XT_S2D +000387 037d .dw XT_DDOT +000388 3820 .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: +000389 ff03 .dw $ff03 +00038a 6475 +00038b 002e .db "ud.",0 +00038c 0382 .dw VE_HEAD + .set VE_HEAD = VE_UDDOT + XT_UDDOT: +00038d 3801 .dw DO_COLON + PFA_UDDOT: + .endif +00038e 3954 .dw XT_ZERO +00038f 0396 .dw XT_UDDOTR +000390 3fae .dw XT_SPACE +000391 3820 .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: +000392 ff04 .dw $ff04 +000393 6475 +000394 722e .db "ud.r" +000395 0389 .dw VE_HEAD + .set VE_HEAD = VE_UDDOTR + XT_UDDOTR: +000396 3801 .dw DO_COLON + PFA_UDDOTR: + .endif +000397 38ff .dw XT_TO_R +000398 0321 .dw XT_L_SHARP +000399 033f .dw XT_SHARP_S +00039a 034a .dw XT_SHARP_G +00039b 38f6 .dw XT_R_FROM +00039c 38cf .dw XT_OVER +00039d 3993 .dw XT_MINUS +00039e 3fb7 .dw XT_SPACES +00039f 0439 .dw XT_TYPE +0003a0 3820 .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: +0003a1 ff06 .dw $ff06 +0003a2 6475 +0003a3 6d2f +0003a4 646f .db "ud/mod" +0003a5 0392 .dw VE_HEAD + .set VE_HEAD = VE_UDSLASHMOD + XT_UDSLASHMOD: +0003a6 3801 .dw DO_COLON + PFA_UDSLASHMOD: + .endif +0003a7 38ff .dw XT_TO_R +0003a8 3954 .dw XT_ZERO +0003a9 3908 .dw XT_R_FETCH +0003aa 39c2 .dw XT_UMSLASHMOD +0003ab 38f6 .dw XT_R_FROM +0003ac 38c4 .dw XT_SWAP +0003ad 38ff .dw XT_TO_R +0003ae 39c2 .dw XT_UMSLASHMOD +0003af 38f6 .dw XT_R_FROM +0003b0 3820 .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: +0003b1 ff06 .dw $ff06 +0003b2 6964 +0003b3 6967 +0003b4 3f74 .db "digit?" +0003b5 03a1 .dw VE_HEAD + .set VE_HEAD = VE_DIGITQ + XT_DIGITQ: +0003b6 3801 .dw DO_COLON + PFA_DIGITQ: + .endif +0003b7 3f66 .dw XT_TOUPPER +0003b8 38b1 +0003b9 383d +0003ba 0039 +0003bb 3978 +0003bc 383d +0003bd 0100 .DW XT_DUP,XT_DOLITERAL,57,XT_GREATER,XT_DOLITERAL,256 +0003be 3a13 +0003bf 399d +0003c0 38b1 +0003c1 383d +0003c2 0140 +0003c3 3978 .DW XT_AND,XT_PLUS,XT_DUP,XT_DOLITERAL,320,XT_GREATER +0003c4 383d +0003c5 0107 +0003c6 3a13 +0003c7 3993 +0003c8 383d +0003c9 0030 .DW XT_DOLITERAL,263,XT_AND,XT_MINUS,XT_DOLITERAL,48 +0003ca 3993 +0003cb 38b1 +0003cc 3ebd +0003cd 3879 +0003ce 395c .DW XT_MINUS,XT_DUP,XT_BASE,XT_FETCH,XT_ULESS +0003cf 3820 .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: +0003d0 3801 .dw DO_COLON + PFA_DOSLITERAL: +0003d1 3908 .dw XT_R_FETCH ; ( -- addr ) +0003d2 042f .dw XT_ICOUNT +0003d3 38f6 .dw XT_R_FROM +0003d4 38cf .dw XT_OVER ; ( -- addr' n addr n) +0003d5 3a2f .dw XT_1PLUS +0003d6 3a04 .dw XT_2SLASH ; ( -- addr' n addr k ) +0003d7 399d .dw XT_PLUS ; ( -- addr' n addr'' ) +0003d8 3a2f .dw XT_1PLUS +0003d9 38ff .dw XT_TO_R ; ( -- ) +0003da 3820 .dw XT_EXIT + .include "words/scomma.asm" + + ; Compiler + ; compiles a string from RAM to Flash + VE_SCOMMA: +0003db ff02 .dw $ff02 +0003dc 2c73 .db "s",$2c +0003dd 03b1 .dw VE_HEAD + .set VE_HEAD = VE_SCOMMA + XT_SCOMMA: +0003de 3801 .dw DO_COLON + PFA_SCOMMA: +0003df 38b1 .dw XT_DUP +0003e0 03e2 .dw XT_DOSCOMMA +0003e1 3820 .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: +0003e2 3801 .dw DO_COLON + PFA_DOSCOMMA: +0003e3 0767 .dw XT_COMMA +0003e4 38b1 .dw XT_DUP ; ( --addr len len) +0003e5 3a04 .dw XT_2SLASH ; ( -- addr len len/2 +0003e6 3eda .dw XT_TUCK ; ( -- addr len/2 len len/2 +0003e7 3a0b .dw XT_2STAR ; ( -- addr len/2 len len' +0003e8 3993 .dw XT_MINUS ; ( -- addr len/2 rem +0003e9 38ff .dw XT_TO_R +0003ea 3954 .dw XT_ZERO +0003eb 0826 .dw XT_QDOCHECK +0003ec 3836 .dw XT_DOCONDBRANCH +0003ed 03f5 .dw PFA_SCOMMA2 +0003ee 3a9b .dw XT_DODO + PFA_SCOMMA1: +0003ef 38b1 .dw XT_DUP ; ( -- addr addr ) +0003f0 3879 .dw XT_FETCH ; ( -- addr c1c2 ) +0003f1 0767 .dw XT_COMMA ; ( -- addr ) +0003f2 3c90 .dw XT_CELLPLUS ; ( -- addr+cell ) +0003f3 3ac9 .dw XT_DOLOOP +0003f4 03ef .dw PFA_SCOMMA1 + PFA_SCOMMA2: +0003f5 38f6 .dw XT_R_FROM +0003f6 3928 .dw XT_GREATERZERO +0003f7 3836 .dw XT_DOCONDBRANCH +0003f8 03fc .dw PFA_SCOMMA3 +0003f9 38b1 .dw XT_DUP ; well, tricky +0003fa 3898 .dw XT_CFETCH +0003fb 0767 .dw XT_COMMA + PFA_SCOMMA3: +0003fc 38d9 .dw XT_DROP ; ( -- ) +0003fd 3820 .dw XT_EXIT + .include "words/itype.asm" + + ; Tools + ; reads string from flash and prints it + VE_ITYPE: +0003fe ff05 .dw $ff05 +0003ff 7469 +000400 7079 +000401 0065 .db "itype",0 +000402 03db .dw VE_HEAD + .set VE_HEAD = VE_ITYPE + XT_ITYPE: +000403 3801 .dw DO_COLON + PFA_ITYPE: +000404 38b1 .dw XT_DUP ; ( --addr len len) +000405 3a04 .dw XT_2SLASH ; ( -- addr len len/2 +000406 3eda .dw XT_TUCK ; ( -- addr len/2 len len/2 +000407 3a0b .dw XT_2STAR ; ( -- addr len/2 len len' +000408 3993 .dw XT_MINUS ; ( -- addr len/2 rem +000409 38ff .dw XT_TO_R +00040a 3954 .dw XT_ZERO +00040b 0826 .dw XT_QDOCHECK +00040c 3836 .dw XT_DOCONDBRANCH +00040d 0417 .dw PFA_ITYPE2 +00040e 3a9b .dw XT_DODO + PFA_ITYPE1: +00040f 38b1 .dw XT_DUP ; ( -- addr addr ) +000410 3bcb .dw XT_FETCHI ; ( -- addr c1c2 ) +000411 38b1 .dw XT_DUP +000412 0424 .dw XT_LOWEMIT +000413 0420 .dw XT_HIEMIT +000414 3a2f .dw XT_1PLUS ; ( -- addr+cell ) +000415 3ac9 .dw XT_DOLOOP +000416 040f .dw PFA_ITYPE1 + PFA_ITYPE2: +000417 38f6 .dw XT_R_FROM +000418 3928 .dw XT_GREATERZERO +000419 3836 .dw XT_DOCONDBRANCH +00041a 041e .dw PFA_ITYPE3 +00041b 38b1 .dw XT_DUP ; make sure the drop below has always something to do +00041c 3bcb .dw XT_FETCHI +00041d 0424 .dw XT_LOWEMIT + PFA_ITYPE3: +00041e 38d9 .dw XT_DROP +00041f 3820 .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: +000420 3801 .dw DO_COLON + PFA_HIEMIT: +000421 3af9 .dw XT_BYTESWAP +000422 0424 .dw XT_LOWEMIT +000423 3820 .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: +000424 3801 .dw DO_COLON + PFA_LOWEMIT: +000425 383d .dw XT_DOLITERAL +000426 00ff .dw $00ff +000427 3a13 .dw XT_AND +000428 3ef2 .dw XT_EMIT +000429 3820 .dw XT_EXIT + .include "words/icount.asm" + + ; Tools + ; get count information out of a counted string in flash + VE_ICOUNT: +00042a ff06 .dw $ff06 +00042b 6369 +00042c 756f +00042d 746e .db "icount" +00042e 03fe .dw VE_HEAD + .set VE_HEAD = VE_ICOUNT + XT_ICOUNT: +00042f 3801 .dw DO_COLON + PFA_ICOUNT: +000430 38b1 .dw XT_DUP +000431 3a2f .dw XT_1PLUS +000432 38c4 .dw XT_SWAP +000433 3bcb .dw XT_FETCHI +000434 3820 .dw XT_EXIT + .include "words/type.asm" + + ; Character IO + ; print a RAM based string + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_TYPE: +000435 ff04 .dw $ff04 +000436 7974 +000437 6570 .db "type" +000438 042a .dw VE_HEAD + .set VE_HEAD = VE_TYPE + XT_TYPE: +000439 3801 .dw DO_COLON + PFA_TYPE: + + .endif +00043a 3f99 .dw XT_BOUNDS +00043b 0826 .dw XT_QDOCHECK +00043c 3836 .dw XT_DOCONDBRANCH +00043d 0444 DEST(PFA_TYPE2) +00043e 3a9b .dw XT_DODO + PFA_TYPE1: +00043f 3aac .dw XT_I +000440 3898 .dw XT_CFETCH +000441 3ef2 .dw XT_EMIT +000442 3ac9 .dw XT_DOLOOP +000443 043f DEST(PFA_TYPE1) + PFA_TYPE2: +000444 3820 .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: +000445 ff01 .dw $ff01 +000446 0027 .db "'",0 +000447 0435 .dw VE_HEAD + .set VE_HEAD = VE_TICK + XT_TICK: +000448 3801 .dw DO_COLON + PFA_TICK: + .endif +000449 05bb .dw XT_PARSENAME +00044a 05fe .dw XT_FORTHRECOGNIZER +00044b 0609 .dw XT_RECOGNIZE + ; a word is tickable unless DT:TOKEN is DT:NULL or + ; the interpret action is a NOOP +00044c 38b1 .dw XT_DUP +00044d 0696 .dw XT_DT_NULL +00044e 3fdf .dw XT_EQUAL +00044f 38c4 .dw XT_SWAP +000450 3bcb .dw XT_FETCHI +000451 383d .dw XT_DOLITERAL +000452 01a5 .dw XT_NOOP +000453 3fdf .dw XT_EQUAL +000454 3a1c .dw XT_OR +000455 3836 .dw XT_DOCONDBRANCH +000456 045a DEST(PFA_TICK1) +000457 383d .dw XT_DOLITERAL +000458 fff3 .dw -13 +000459 3d86 .dw XT_THROW + PFA_TICK1: +00045a 38d9 .dw XT_DROP +00045b 3820 .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: +00045c ff05 .dw $ff05 +00045d 7363 +00045e 696b +00045f 0070 .db "cskip",0 +000460 0445 .dw VE_HEAD + .set VE_HEAD = VE_CSKIP + XT_CSKIP: +000461 3801 .dw DO_COLON + PFA_CSKIP: + .endif +000462 38ff .dw XT_TO_R ; ( -- addr1 n1 ) + PFA_CSKIP1: +000463 38b1 .dw XT_DUP ; ( -- addr' n' n' ) +000464 3836 .dw XT_DOCONDBRANCH ; ( -- addr' n') +000465 0470 DEST(PFA_CSKIP2) +000466 38cf .dw XT_OVER ; ( -- addr' n' addr' ) +000467 3898 .dw XT_CFETCH ; ( -- addr' n' c' ) +000468 3908 .dw XT_R_FETCH ; ( -- addr' n' c' c ) +000469 3fdf .dw XT_EQUAL ; ( -- addr' n' f ) +00046a 3836 .dw XT_DOCONDBRANCH ; ( -- addr' n') +00046b 0470 DEST(PFA_CSKIP2) +00046c 3fe6 .dw XT_ONE +00046d 05ac .dw XT_SLASHSTRING +00046e 382f .dw XT_DOBRANCH +00046f 0463 DEST(PFA_CSKIP1) + PFA_CSKIP2: +000470 38f6 .dw XT_R_FROM +000471 38d9 .dw XT_DROP ; ( -- addr2 n2) +000472 3820 .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: +000473 ff05 .dw $ff05 +000474 7363 +000475 6163 +../../common\words/cscan.asm(12): warning: .cseg .db misalignment - padding zero byte +000476 006e .db "cscan" +000477 045c .dw VE_HEAD + .set VE_HEAD = VE_CSCAN + XT_CSCAN: +000478 3801 .dw DO_COLON + PFA_CSCAN: + .endif +000479 38ff .dw XT_TO_R +00047a 38cf .dw XT_OVER + PFA_CSCAN1: +00047b 38b1 .dw XT_DUP +00047c 3898 .dw XT_CFETCH +00047d 3908 .dw XT_R_FETCH +00047e 3fdf .dw XT_EQUAL +00047f 391a .dw XT_ZEROEQUAL +000480 3836 .dw XT_DOCONDBRANCH +000481 048d DEST(PFA_CSCAN2) +000482 38c4 .dw XT_SWAP +000483 3a35 .dw XT_1MINUS +000484 38c4 .dw XT_SWAP +000485 38cf .dw XT_OVER +000486 3921 .dw XT_ZEROLESS ; not negative +000487 391a .dw XT_ZEROEQUAL +000488 3836 .dw XT_DOCONDBRANCH +000489 048d DEST(PFA_CSCAN2) +00048a 3a2f .dw XT_1PLUS +00048b 382f .dw XT_DOBRANCH +00048c 047b DEST(PFA_CSCAN1) + PFA_CSCAN2: +00048d 38f0 .dw XT_NIP +00048e 38cf .dw XT_OVER +00048f 3993 .dw XT_MINUS +000490 38f6 .dw XT_R_FROM +000491 38d9 .dw XT_DROP +000492 3820 .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: +000493 ff06 .dw $ff06 +000494 6361 +000495 6563 +000496 7470 .db "accept" +000497 0473 .dw VE_HEAD + .set VE_HEAD = VE_ACCEPT + XT_ACCEPT: +000498 3801 .dw DO_COLON + PFA_ACCEPT: + + .endif +000499 38cf +00049a 399d +00049b 3a35 +00049c 38cf .DW XT_OVER,XT_PLUS,XT_1MINUS,XT_OVER +00049d 3f03 +00049e 38b1 +00049f 04d9 +0004a0 391a +0004a1 3836 ACC1: .DW XT_KEY,XT_DUP,XT_CRLFQ,XT_ZEROEQUAL,XT_DOCONDBRANCH +0004a2 04cb DEST(ACC5) +0004a3 38b1 +0004a4 383d +0004a5 0008 +0004a6 3fdf +0004a7 3836 .DW XT_DUP,XT_DOLITERAL,8,XT_EQUAL,XT_DOCONDBRANCH +0004a8 04bb DEST(ACC3) +0004a9 38d9 +0004aa 38e1 +0004ab 3ec9 +0004ac 3978 +0004ad 38ff +0004ae 38e1 +0004af 38e1 +0004b0 38f6 +0004b1 3836 .DW XT_DROP,XT_ROT,XT_2DUP,XT_GREATER,XT_TO_R,XT_ROT,XT_ROT,XT_R_FROM,XT_DOCONDBRANCH +0004b2 04b9 DEST(ACC6) +0004b3 04d1 +0004b4 3a35 +0004b5 38ff +0004b6 38cf +0004b7 38f6 +0004b8 015a .DW XT_BS,XT_1MINUS,XT_TO_R,XT_OVER,XT_R_FROM,XT_UMAX +0004b9 382f ACC6: .DW XT_DOBRANCH +0004ba 04c9 DEST(ACC4) + + + ACC3: ; check for remaining control characters, replace them with blank +0004bb 38b1 .dw XT_DUP ; ( -- addr k k ) +0004bc 3f54 .dw XT_BL +0004bd 396e .dw XT_LESS +0004be 3836 .dw XT_DOCONDBRANCH +0004bf 04c2 DEST(PFA_ACCEPT6) +0004c0 38d9 .dw XT_DROP +0004c1 3f54 .dw XT_BL + PFA_ACCEPT6: +0004c2 38b1 +0004c3 3ef2 +0004c4 38cf +0004c5 388d +0004c6 3a2f +0004c7 38cf +0004c8 0166 .DW XT_DUP,XT_EMIT,XT_OVER,XT_CSTORE,XT_1PLUS,XT_OVER,XT_UMIN +0004c9 382f ACC4: .DW XT_DOBRANCH +0004ca 049d DEST(ACC1) +0004cb 38d9 +0004cc 38f0 +0004cd 38c4 +0004ce 3993 +0004cf 3fa1 +0004d0 3820 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: +0004d1 3801 .dw DO_COLON + .endif +0004d2 383d .dw XT_DOLITERAL +0004d3 0008 .dw 8 +0004d4 38b1 .dw XT_DUP +0004d5 3ef2 .dw XT_EMIT +0004d6 3fae .dw XT_SPACE +0004d7 3ef2 .dw XT_EMIT +0004d8 3820 .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: +0004d9 3801 .dw DO_COLON + .endif +0004da 38b1 .dw XT_DUP +0004db 383d .dw XT_DOLITERAL +0004dc 000d .dw 13 +0004dd 3fdf .dw XT_EQUAL +0004de 38c4 .dw XT_SWAP +0004df 383d .dw XT_DOLITERAL +0004e0 000a .dw 10 +0004e1 3fdf .dw XT_EQUAL +0004e2 3a1c .dw XT_OR +0004e3 3820 .dw XT_EXIT + .include "words/refill.asm" + + ; System + ; refills the input buffer + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_REFILL: +0004e4 ff06 .dw $ff06 +0004e5 6572 +0004e6 6966 +0004e7 6c6c .db "refill" +0004e8 0493 .dw VE_HEAD + .set VE_HEAD = VE_REFILL + XT_REFILL: +0004e9 3dff .dw PFA_DODEFER1 + PFA_REFILL: + .endif +0004ea 001a .dw USER_REFILL +0004eb 3dc8 .dw XT_UDEFERFETCH +0004ec 3dd4 .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: +0004ed ff04 .dw $ff04 +0004ee 6863 +0004ef 7261 .db "char" +0004f0 04e4 .dw VE_HEAD + .set VE_HEAD = VE_CHAR + XT_CHAR: +0004f1 3801 .dw DO_COLON + PFA_CHAR: + .endif +0004f2 05bb .dw XT_PARSENAME +0004f3 38d9 .dw XT_DROP +0004f4 3898 .dw XT_CFETCH +0004f5 3820 .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: +0004f6 ff06 .dw $ff06 +0004f7 756e +0004f8 626d +0004f9 7265 .db "number" +0004fa 04ed .dw VE_HEAD + .set VE_HEAD = VE_NUMBER + XT_NUMBER: +0004fb 3801 .dw DO_COLON + PFA_NUMBER: + .endif +0004fc 3ebd .dw XT_BASE +0004fd 3879 .dw XT_FETCH +0004fe 38ff .dw XT_TO_R +0004ff 053f .dw XT_QSIGN +000500 38ff .dw XT_TO_R +000501 0552 .dw XT_SET_BASE +000502 053f .dw XT_QSIGN +000503 38f6 .dw XT_R_FROM +000504 3a1c .dw XT_OR +000505 38ff .dw XT_TO_R + ; check whether something is left +000506 38b1 .dw XT_DUP +000507 391a .dw XT_ZEROEQUAL +000508 3836 .dw XT_DOCONDBRANCH +000509 0512 DEST(PFA_NUMBER0) + ; nothing is left. It cannot be a number at all +00050a 3ed2 .dw XT_2DROP +00050b 38f6 .dw XT_R_FROM +00050c 38d9 .dw XT_DROP +00050d 38f6 .dw XT_R_FROM +00050e 3ebd .dw XT_BASE +00050f 3881 .dw XT_STORE +000510 3954 .dw XT_ZERO +000511 3820 .dw XT_EXIT + PFA_NUMBER0: +000512 3b1e .dw XT_2TO_R +000513 3954 .dw XT_ZERO ; starting value +000514 3954 .dw XT_ZERO +000515 3b2d .dw XT_2R_FROM +000516 0570 .dw XT_TO_NUMBER ; ( 0. addr len -- d addr' len' + ; check length of the remaining string. + ; if zero: a single cell number is entered +000517 38b9 .dw XT_QDUP +000518 3836 .dw XT_DOCONDBRANCH +000519 0534 DEST(PFA_NUMBER1) + ; if equal 1: mayba a trailing dot? --> double cell number +00051a 3fe6 .dw XT_ONE +00051b 3fdf .dw XT_EQUAL +00051c 3836 .dw XT_DOCONDBRANCH +00051d 052b DEST(PFA_NUMBER2) + ; excatly one character is left +00051e 3898 .dw XT_CFETCH +00051f 383d .dw XT_DOLITERAL +000520 002e .dw 46 ; . +000521 3fdf .dw XT_EQUAL +000522 3836 .dw XT_DOCONDBRANCH +000523 052c DEST(PFA_NUMBER6) + ; its a double cell number + ; incorporate sign into number +000524 38f6 .dw XT_R_FROM +000525 3836 .dw XT_DOCONDBRANCH +000526 0528 DEST(PFA_NUMBER3) +000527 0233 .dw XT_DNEGATE + PFA_NUMBER3: +000528 3feb .dw XT_TWO +000529 382f .dw XT_DOBRANCH +00052a 053a DEST(PFA_NUMBER5) + PFA_NUMBER2: +00052b 38d9 .dw XT_DROP + PFA_NUMBER6: +00052c 3ed2 .dw XT_2DROP +00052d 38f6 .dw XT_R_FROM +00052e 38d9 .dw XT_DROP +00052f 38f6 .dw XT_R_FROM +000530 3ebd .dw XT_BASE +000531 3881 .dw XT_STORE +000532 3954 .dw XT_ZERO +000533 3820 .dw XT_EXIT + PFA_NUMBER1: +000534 3ed2 .dw XT_2DROP ; remove the address + ; incorporate sign into number +000535 38f6 .dw XT_R_FROM +000536 3836 .dw XT_DOCONDBRANCH +000537 0539 DEST(PFA_NUMBER4) +000538 3e27 .dw XT_NEGATE + PFA_NUMBER4: +000539 3fe6 .dw XT_ONE + PFA_NUMBER5: +00053a 38f6 .dw XT_R_FROM +00053b 3ebd .dw XT_BASE +00053c 3881 .dw XT_STORE +00053d 394b .dw XT_TRUE +00053e 3820 .dw XT_EXIT + .include "words/q-sign.asm" + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + XT_QSIGN: +00053f 3801 .dw DO_COLON + PFA_QSIGN: ; ( c -- ) + .endif +000540 38cf .dw XT_OVER ; ( -- addr len addr ) +000541 3898 .dw XT_CFETCH +000542 383d .dw XT_DOLITERAL +000543 002d .dw '-' +000544 3fdf .dw XT_EQUAL ; ( -- addr len flag ) +000545 38b1 .dw XT_DUP +000546 38ff .dw XT_TO_R +000547 3836 .dw XT_DOCONDBRANCH +000548 054b DEST(PFA_NUMBERSIGN_DONE) +000549 3fe6 .dw XT_ONE ; skip sign character +00054a 05ac .dw XT_SLASHSTRING + PFA_NUMBERSIGN_DONE: +00054b 38f6 .dw XT_R_FROM +00054c 3820 .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: +00054d 3852 .dw PFA_DOCONSTANT + .endif +00054e 000a +00054f 0010 +000550 0002 +000551 000a .dw 10,16,2,10 ; last one could a 8 instead. + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + XT_SET_BASE: +000552 3801 .dw DO_COLON + PFA_SET_BASE: ; ( adr1 len1 -- adr2 len2 ) + .endif +000553 38cf .dw XT_OVER +000554 3898 .dw XT_CFETCH +000555 383d .dw XT_DOLITERAL +000556 0023 .dw 35 +000557 3993 .dw XT_MINUS +000558 38b1 .dw XT_DUP +000559 3954 .dw XT_ZERO +00055a 383d .dw XT_DOLITERAL +00055b 0004 .dw 4 +00055c 3e57 .dw XT_WITHIN +00055d 3836 .dw XT_DOCONDBRANCH +00055e 0568 DEST(SET_BASE1) + .if cpu_msp430==1 + .endif +00055f 054d .dw XT_BASES +000560 399d .dw XT_PLUS +000561 3bcb .dw XT_FETCHI +000562 3ebd .dw XT_BASE +000563 3881 .dw XT_STORE +000564 3fe6 .dw XT_ONE +000565 05ac .dw XT_SLASHSTRING +000566 382f .dw XT_DOBRANCH +000567 0569 DEST(SET_BASE2) + SET_BASE1: +000568 38d9 .dw XT_DROP + SET_BASE2: +000569 3820 .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: +00056a ff07 .dw $ff07 +00056b 6e3e +00056c 6d75 +00056d 6562 +00056e 0072 .db ">number",0 +00056f 04f6 .dw VE_HEAD + .set VE_HEAD = VE_TO_NUMBER + XT_TO_NUMBER: +000570 3801 .dw DO_COLON + + .endif + +000571 38b1 +000572 3836 TONUM1: .DW XT_DUP,XT_DOCONDBRANCH +000573 0588 DEST(TONUM3) +000574 38cf +000575 3898 +000576 03b6 .DW XT_OVER,XT_CFETCH,XT_DIGITQ +000577 391a +000578 3836 .DW XT_ZEROEQUAL,XT_DOCONDBRANCH +000579 057c DEST(TONUM2) +00057a 38d9 +00057b 3820 .DW XT_DROP,XT_EXIT +00057c 38ff +00057d 0257 +00057e 3ebd +00057f 3879 +000580 014b TONUM2: .DW XT_TO_R,XT_2SWAP,XT_BASE,XT_FETCH,XT_UDSTAR +000581 38f6 +000582 0143 +000583 0257 .DW XT_R_FROM,XT_MPLUS,XT_2SWAP +000584 3fe6 +000585 05ac +000586 382f .DW XT_ONE,XT_SLASHSTRING,XT_DOBRANCH +000587 0571 DEST(TONUM1) +000588 3820 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: +000589 ff05 .dw $ff05 +00058a 6170 +00058b 7372 +00058c 0065 .db "parse",0 +00058d 056a .dw VE_HEAD + .set VE_HEAD = VE_PARSE + XT_PARSE: +00058e 3801 .dw DO_COLON + PFA_PARSE: + .endif +00058f 38ff .dw XT_TO_R ; ( -- ) +000590 05a2 .dw XT_SOURCE ; ( -- addr len) +000591 3ee2 .dw XT_TO_IN ; ( -- addr len >in) +000592 3879 .dw XT_FETCH +000593 05ac .dw XT_SLASHSTRING ; ( -- addr' len' ) + +000594 38f6 .dw XT_R_FROM ; ( -- addr' len' c) +000595 0478 .dw XT_CSCAN ; ( -- addr' len'') +000596 38b1 .dw XT_DUP ; ( -- addr' len'' len'') +000597 3a2f .dw XT_1PLUS +000598 3ee2 .dw XT_TO_IN ; ( -- addr' len'' len'' >in) +000599 3a65 .dw XT_PLUSSTORE ; ( -- addr' len') +00059a 3fe6 .dw XT_ONE +00059b 05ac .dw XT_SLASHSTRING +00059c 3820 .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: +00059d ff06 .dw $FF06 +00059e 6f73 +00059f 7275 +0005a0 6563 .db "source" +0005a1 0589 .dw VE_HEAD + .set VE_HEAD = VE_SOURCE + XT_SOURCE: +0005a2 3dff .dw PFA_DODEFER1 + PFA_SOURCE: + .endif +0005a3 0016 .dw USER_SOURCE +0005a4 3dc8 .dw XT_UDEFERFETCH +0005a5 3dd4 .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: +0005a6 ff07 .dw $ff07 +0005a7 732f +0005a8 7274 +0005a9 6e69 +0005aa 0067 .db "/string",0 +0005ab 059d .dw VE_HEAD + .set VE_HEAD = VE_SLASHSTRING + XT_SLASHSTRING: +0005ac 3801 .dw DO_COLON + PFA_SLASHSTRING: + .endif +0005ad 38e1 .dw XT_ROT +0005ae 38cf .dw XT_OVER +0005af 399d .dw XT_PLUS +0005b0 38e1 .dw XT_ROT +0005b1 38e1 .dw XT_ROT +0005b2 3993 .dw XT_MINUS +0005b3 3820 .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: +0005b4 ff0a .dw $FF0A +0005b5 6170 +0005b6 7372 +0005b7 2d65 +0005b8 616e +0005b9 656d .db "parse-name" +0005ba 05a6 .dw VE_HEAD + .set VE_HEAD = VE_PARSENAME + XT_PARSENAME: +0005bb 3801 .dw DO_COLON + PFA_PARSENAME: + .endif +0005bc 3f54 .dw XT_BL +0005bd 05bf .dw XT_SKIPSCANCHAR +0005be 3820 .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: +0005bf 3801 .dw DO_COLON + PFA_SKIPSCANCHAR: + .endif +0005c0 38ff .dw XT_TO_R +0005c1 05a2 .dw XT_SOURCE +0005c2 3ee2 .dw XT_TO_IN +0005c3 3879 .dw XT_FETCH +0005c4 05ac .dw XT_SLASHSTRING + +0005c5 3908 .dw XT_R_FETCH +0005c6 0461 .dw XT_CSKIP +0005c7 38f6 .dw XT_R_FROM +0005c8 0478 .dw XT_CSCAN + + ; adjust >IN +0005c9 3ec9 .dw XT_2DUP +0005ca 399d .dw XT_PLUS +0005cb 05a2 .dw XT_SOURCE +0005cc 38d9 .dw XT_DROP +0005cd 3993 .dw XT_MINUS +0005ce 3ee2 .dw XT_TO_IN +0005cf 3881 .dw XT_STORE +0005d0 3820 .dw XT_EXIT + .include "words/sp0.asm" + + ; Stack + ; start address of the data stack + VE_SP0: +0005d1 ff03 .dw $ff03 +0005d2 7073 +0005d3 0030 .db "sp0",0 +0005d4 05b4 .dw VE_HEAD + .set VE_HEAD = VE_SP0 + XT_SP0: +0005d5 386f .dw PFA_DOVALUE1 + PFA_SP0: +0005d6 0006 .dw USER_SP0 +0005d7 3dc8 .dw XT_UDEFERFETCH +0005d8 3dd4 .dw XT_UDEFERSTORE + + ; ( -- addr) + ; Stack + ; address of user variable to store top-of-stack for inactive tasks + VE_SP: +0005d9 ff02 .dw $ff02 +0005da 7073 .db "sp" +0005db 05d1 .dw VE_HEAD + .set VE_HEAD = VE_SP + XT_SP: +0005dc 3858 .dw PFA_DOUSER + PFA_SP: +0005dd 0008 .dw USER_SP + .include "words/rp0.asm" + + ; Stack + ; start address of return stack + VE_RP0: +0005de ff03 .dw $ff03 +0005df 7072 +0005e0 0030 .db "rp0",0 +0005e1 05d9 .dw VE_HEAD + .set VE_HEAD = VE_RP0 + XT_RP0: +0005e2 3801 .dw DO_COLON + PFA_RP0: +0005e3 05e6 .dw XT_DORP0 +0005e4 3879 .dw XT_FETCH +0005e5 3820 .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: +0005e6 3858 .dw PFA_DOUSER + PFA_DORP0: +0005e7 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: +0005e8 ff05 .dw $ff05 +0005e9 6564 +0005ea 7470 +0005eb 0068 .db "depth",0 +0005ec 05de .dw VE_HEAD + .set VE_HEAD = VE_DEPTH + XT_DEPTH: +0005ed 3801 .dw DO_COLON + PFA_DEPTH: + .endif +0005ee 05d5 .dw XT_SP0 +0005ef 3a8d .dw XT_SP_FETCH +0005f0 3993 .dw XT_MINUS +0005f1 3a04 .dw XT_2SLASH +0005f2 3a35 .dw XT_1MINUS +0005f3 3820 .dw XT_EXIT + .include "words/forth-recognizer.asm" + + ; System Value + ; address of the next free data space (RAM) cell + VE_FORTHRECOGNIZER: +0005f4 ff10 .dw $ff10 +0005f5 6f66 +0005f6 7472 +0005f7 2d68 +0005f8 6572 +0005f9 6f63 +0005fa 6e67 +0005fb 7a69 +0005fc 7265 .db "forth-recognizer" +0005fd 05e8 .dw VE_HEAD + .set VE_HEAD = VE_FORTHRECOGNIZER + XT_FORTHRECOGNIZER: +0005fe 386f .dw PFA_DOVALUE1 + PFA_FORTHRECOGNIZER: +0005ff 003e .dw CFG_FORTHRECOGNIZER +000600 3da0 .dw XT_EDEFERFETCH +000601 3daa .dw XT_EDEFERSTORE + .include "words/recognize.asm" + + ; System + ; walk the recognizer stack + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_RECOGNIZE: +000602 ff09 .dw $ff09 +000603 6572 +000604 6f63 +000605 6e67 +000606 7a69 +000607 0065 .db "recognize",0 +000608 05f4 .dw VE_HEAD + .set VE_HEAD = VE_RECOGNIZE + XT_RECOGNIZE: +000609 3801 .dw DO_COLON + PFA_RECOGNIZE: + .endif +00060a 383d .dw XT_DOLITERAL +00060b 0614 .dw XT_RECOGNIZE_A +00060c 38c4 .dw XT_SWAP +00060d 09a7 .dw XT_MAPSTACK +00060e 391a .dw XT_ZEROEQUAL +00060f 3836 .dw XT_DOCONDBRANCH +000610 0613 DEST(PFA_RECOGNIZE1) +000611 3ed2 .dw XT_2DROP +000612 0696 .dw XT_DT_NULL + PFA_RECOGNIZE1: +000613 3820 .dw XT_EXIT + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + ; ( addr len XT -- addr len [ dt:xt -1 | 0 ] ) + XT_RECOGNIZE_A: +000614 3801 .dw DO_COLON + PFA_RECOGNIZE_A: + .endif +000615 38e1 .dw XT_ROT ; -- len xt addr +000616 38e1 .dw XT_ROT ; -- xt addr len +000617 3ec9 .dw XT_2DUP +000618 3b1e .dw XT_2TO_R +000619 38e1 .dw XT_ROT ; -- addr len xt +00061a 382a .dw XT_EXECUTE ; -- i*x dt:* | dt:null +00061b 3b2d .dw XT_2R_FROM +00061c 38e1 .dw XT_ROT +00061d 38b1 .dw XT_DUP +00061e 0696 .dw XT_DT_NULL +00061f 3fdf .dw XT_EQUAL +000620 3836 .dw XT_DOCONDBRANCH +000621 0625 DEST(PFA_RECOGNIZE_A1) +000622 38d9 .dw XT_DROP +000623 3954 .dw XT_ZERO +000624 3820 .dw XT_EXIT + PFA_RECOGNIZE_A1: +000625 38f0 .dw XT_NIP +000626 38f0 .dw XT_NIP +000627 394b .dw XT_TRUE +000628 3820 .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/interpret.asm" + + ; System + ; Interpret SOURCE word by word. + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_INTERPRET: +000629 ff09 .dw $ff09 +00062a 6e69 +00062b 6574 +00062c 7072 +00062d 6572 +00062e 0074 .db "interpret",0 +00062f 0602 .dw VE_HEAD + .set VE_HEAD = VE_INTERPRET + XT_INTERPRET: +000630 3801 .dw DO_COLON + .endif + PFA_INTERPRET: +000631 05bb .dw XT_PARSENAME ; ( -- addr len ) +000632 38b1 .dw XT_DUP ; ( -- addr len flag) +000633 3836 .dw XT_DOCONDBRANCH +000634 0641 DEST(PFA_INTERPRET2) +000635 05fe .dw XT_FORTHRECOGNIZER +000636 0609 .dw XT_RECOGNIZE +000637 3eb7 .dw XT_STATE +000638 3879 .dw XT_FETCH +000639 3836 .dw XT_DOCONDBRANCH +00063a 063c DEST(PFA_INTERPRET1) +00063b 01d1 .dw XT_ICELLPLUS ; we need the compile action + PFA_INTERPRET1: +00063c 3bcb .dw XT_FETCHI +00063d 382a .dw XT_EXECUTE +00063e 3f8b .dw XT_QSTACK +00063f 382f .dw XT_DOBRANCH +000640 0631 DEST(PFA_INTERPRET) + PFA_INTERPRET2: +000641 3ed2 .dw XT_2DROP +000642 3820 .dw XT_EXIT + .include "words/rec-intnum.asm" + + ; Interpreter + ; Method table for single cell integers + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_DT_NUM: +000643 ff06 .dw $ff06 +000644 7464 +000645 6e3a +000646 6d75 .db "dt:num" +000647 0629 .dw VE_HEAD + .set VE_HEAD = VE_DT_NUM + XT_DT_NUM: +000648 3852 .dw PFA_DOCONSTANT + PFA_DT_NUM: + .endif +000649 01a5 .dw XT_NOOP ; interpret +00064a 077d .dw XT_LITERAL ; compile +00064b 077d .dw XT_LITERAL ; postpone + + ; ( -- addr ) + ; Interpreter + ; Method table for double cell integers + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_DT_DNUM: +00064c ff07 .dw $ff07 +00064d 7464 +00064e 643a +00064f 756e +000650 006d .db "dt:dnum",0 +000651 0643 .dw VE_HEAD + .set VE_HEAD = VE_DT_DNUM + XT_DT_DNUM: +000652 3852 .dw PFA_DOCONSTANT + PFA_DT_DNUM: + .endif +000653 01a5 .dw XT_NOOP ; interpret +000654 3fd7 .dw XT_2LITERAL ; compile +000655 3fd7 .dw XT_2LITERAL ; postpone + + ; ( addr len -- f ) + ; Interpreter + ; recognizer for integer numbers + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + + VE_REC_NUM: +000656 ff07 .dw $ff07 +000657 6572 +000658 3a63 +000659 756e +00065a 006d .db "rec:num",0 +00065b 064c .dw VE_HEAD + .set VE_HEAD = VE_REC_NUM + XT_REC_NUM: +00065c 3801 .dw DO_COLON + PFA_REC_NUM: + .endif + ; try converting to a number +00065d 04fb .dw XT_NUMBER +00065e 3836 .dw XT_DOCONDBRANCH +00065f 0668 DEST(PFA_REC_NONUMBER) +000660 3fe6 .dw XT_ONE +000661 3fdf .dw XT_EQUAL +000662 3836 .dw XT_DOCONDBRANCH +000663 0666 DEST(PFA_REC_INTNUM2) +000664 0648 .dw XT_DT_NUM +000665 3820 .dw XT_EXIT + PFA_REC_INTNUM2: +000666 0652 .dw XT_DT_DNUM +000667 3820 .dw XT_EXIT + PFA_REC_NONUMBER: +000668 0696 .dw XT_DT_NULL +000669 3820 .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: +00066a ff08 .dw $ff08 +00066b 6572 +00066c 3a63 +00066d 6966 +00066e 646e .db "rec:find" +00066f 0656 .dw VE_HEAD + .set VE_HEAD = VE_REC_FIND + XT_REC_FIND: +000670 3801 .dw DO_COLON + PFA_REC_FIND: + .endif +000671 070b .DW XT_FINDXT +000672 38b1 .dw XT_DUP +000673 391a .dw XT_ZEROEQUAL +000674 3836 .dw XT_DOCONDBRANCH +000675 0679 DEST(PFA_REC_WORD_FOUND) +000676 38d9 .dw XT_DROP +000677 0696 .dw XT_DT_NULL +000678 3820 .dw XT_EXIT + PFA_REC_WORD_FOUND: +000679 0680 .dw XT_DT_XT + +00067a 3820 .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: +00067b ff05 .dw $ff05 +00067c 7464 +00067d 783a +00067e 0074 .db "dt:xt",0 +00067f 066a .dw VE_HEAD + .set VE_HEAD = VE_DT_XT + XT_DT_XT: +000680 3852 .dw PFA_DOCONSTANT + PFA_DT_XT: + .endif +000681 0684 .dw XT_R_WORD_INTERPRET +000682 0688 .dw XT_R_WORD_COMPILE +000683 3fd7 .dw XT_2LITERAL + + ; ( XT flags -- ) + ; Interpreter + ; interpret method for WORD recognizer + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + XT_R_WORD_INTERPRET: +000684 3801 .dw DO_COLON + PFA_R_WORD_INTERPRET: + .endif +000685 38d9 .dw XT_DROP ; the flags are in the way +000686 382a .dw XT_EXECUTE +000687 3820 .dw XT_EXIT + + ; ( XT flags -- ) + ; Interpreter + ; Compile method for WORD recognizer + .if cpu_msp430==1 + .endif + .if cpu_avr8==1 + XT_R_WORD_COMPILE: +000688 3801 .dw DO_COLON + PFA_R_WORD_COMPILE: + .endif +000689 3921 .dw XT_ZEROLESS +00068a 3836 .dw XT_DOCONDBRANCH +00068b 068e DEST(PFA_R_WORD_COMPILE1) +00068c 0767 .dw XT_COMMA +00068d 3820 .dw XT_EXIT + PFA_R_WORD_COMPILE1: +00068e 382a .dw XT_EXECUTE +00068f 3820 .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: +000690 ff07 .dw $ff07 +000691 7464 +000692 6e3a +000693 6c75 +../../common\words/dt-null.asm(12): warning: .cseg .db misalignment - padding zero byte +000694 006c .db "dt:null" +000695 067b .dw VE_HEAD + .set VE_HEAD = VE_DT_NULL + XT_DT_NULL: +000696 3852 .dw PFA_DOCONSTANT + PFA_DT_NULL: + .endif +000697 069a .dw XT_FAIL ; interpret +000698 069a .dw XT_FAIL ; compile +000699 069a .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: +00069a 3801 .dw DO_COLON + PFA_FAIL: + .endif +00069b 383d .dw XT_DOLITERAL +00069c fff3 .dw -13 +00069d 3d86 .dw XT_THROW + .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: +00069e ff0f .dw $ff0f +00069f 6573 +0006a0 7261 +0006a1 6863 +0006a2 772d +0006a3 726f +0006a4 6c64 +0006a5 7369 +0006a6 0074 .db "search-wordlist",0 +0006a7 0690 .dw VE_HEAD + .set VE_HEAD = VE_SEARCH_WORDLIST + XT_SEARCH_WORDLIST: +0006a8 3801 .dw DO_COLON + PFA_SEARCH_WORDLIST: + .endif +0006a9 38ff .dw XT_TO_R +0006aa 3954 .dw XT_ZERO +0006ab 383d .dw XT_DOLITERAL +0006ac 06bd .dw XT_ISWORD +0006ad 38f6 .dw XT_R_FROM +0006ae 06da .dw XT_TRAVERSEWORDLIST +0006af 38b1 .dw XT_DUP +0006b0 391a .dw XT_ZEROEQUAL +0006b1 3836 .dw XT_DOCONDBRANCH +0006b2 06b7 DEST(PFA_SEARCH_WORDLIST1) +0006b3 3ed2 .dw XT_2DROP +0006b4 38d9 .dw XT_DROP +0006b5 3954 .dw XT_ZERO +0006b6 3820 .dw XT_EXIT + PFA_SEARCH_WORDLIST1: + ; ... get the XT ... +0006b7 38b1 .dw XT_DUP +0006b8 0701 .dw XT_NFA2CFA + ; .. and get the header flag +0006b9 38c4 .dw XT_SWAP +0006ba 0180 .dw XT_NAME2FLAGS +0006bb 016e .dw XT_IMMEDIATEQ +0006bc 3820 .dw XT_EXIT + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + XT_ISWORD: +0006bd 3801 .dw DO_COLON + PFA_ISWORD: + .endif + ; ( c-addr len 0 nt -- c-addr len 0 true| nt false ) +0006be 38ff .dw XT_TO_R +0006bf 38d9 .dw XT_DROP +0006c0 3ec9 .dw XT_2DUP +0006c1 3908 .dw XT_R_FETCH ; -- addr len addr len nt +0006c2 06f5 .dw XT_NAME2STRING +0006c3 01da .dw XT_ICOMPARE ; (-- addr len f ) +0006c4 3836 .dw XT_DOCONDBRANCH +0006c5 06cb DEST(PFA_ISWORD3) + ; not now +0006c6 38f6 .dw XT_R_FROM +0006c7 38d9 .dw XT_DROP +0006c8 3954 .dw XT_ZERO +0006c9 394b .dw XT_TRUE ; maybe next word +0006ca 3820 .dw XT_EXIT + PFA_ISWORD3: + ; we found the word, now clean up iteration data ... +0006cb 3ed2 .dw XT_2DROP +0006cc 38f6 .dw XT_R_FROM +0006cd 3954 .dw XT_ZERO ; finish traverse-wordlist +0006ce 3820 .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: +0006cf ff11 .dw $ff11 +0006d0 7274 +0006d1 7661 +0006d2 7265 +0006d3 6573 +0006d4 772d +0006d5 726f +0006d6 6c64 +0006d7 7369 +0006d8 0074 .db "traverse-wordlist",0 +0006d9 069e .dw VE_HEAD + .set VE_HEAD = VE_TRAVERSEWORDLIST + XT_TRAVERSEWORDLIST: +0006da 3801 .dw DO_COLON + PFA_TRAVERSEWORDLIST: + + .endif +0006db 3b5f .dw XT_FETCHE + PFA_TRAVERSEWORDLIST1: +0006dc 38b1 .dw XT_DUP ; ( -- xt nt nt ) +0006dd 3836 .dw XT_DOCONDBRANCH ; ( -- nt ) is nfa = counted string +0006de 06eb DEST(PFA_TRAVERSEWORDLIST2) +0006df 3ec9 .dw XT_2DUP +0006e0 3b1e .dw XT_2TO_R +0006e1 38c4 .dw XT_SWAP +0006e2 382a .dw XT_EXECUTE +0006e3 3b2d .dw XT_2R_FROM +0006e4 38e1 .dw XT_ROT +0006e5 3836 .dw XT_DOCONDBRANCH +0006e6 06eb DEST(PFA_TRAVERSEWORDLIST2) +0006e7 0a16 .dw XT_NFA2LFA +0006e8 3bcb .dw XT_FETCHI +0006e9 382f .dw XT_DOBRANCH ; ( -- addr ) +0006ea 06dc DEST(PFA_TRAVERSEWORDLIST1) ; ( -- addr ) + PFA_TRAVERSEWORDLIST2: +0006eb 3ed2 .dw XT_2DROP +0006ec 3820 .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: +0006ed ff0b .dw $ff0b +0006ee 616e +0006ef 656d +0006f0 733e +0006f1 7274 +0006f2 6e69 +0006f3 0067 .db "name>string",0 +0006f4 06cf .dw VE_HEAD + .set VE_HEAD = VE_NAME2STRING + XT_NAME2STRING: +0006f5 3801 .dw DO_COLON + PFA_NAME2STRING: + + .endif +0006f6 042f .dw XT_ICOUNT ; ( -- addr n ) +0006f7 383d .dw XT_DOLITERAL +0006f8 00ff .dw 255 +0006f9 3a13 .dw XT_AND ; mask immediate bit +0006fa 3820 .dw XT_EXIT + .include "words/nfa2cfa.asm" + + ; Tools + ; get the XT from a name token + VE_NFA2CFA: +0006fb ff07 .dw $ff07 +0006fc 666e +0006fd 3e61 +0006fe 6663 +../../avr8\words/nfa2cfa.asm(6): warning: .cseg .db misalignment - padding zero byte +0006ff 0061 .db "nfa>cfa" +000700 06ed .dw VE_HEAD + .set VE_HEAD = VE_NFA2CFA + XT_NFA2CFA: +000701 3801 .dw DO_COLON + PFA_NFA2CFA: +000702 0a16 .dw XT_NFA2LFA ; skip to link field +000703 3a2f .dw XT_1PLUS ; next is the execution token +000704 3820 .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: +000705 ff07 .dw $ff07 +000706 6966 +000707 646e +000708 782d +000709 0074 .db "find-xt",0 +00070a 06fb .dw VE_HEAD + .set VE_HEAD = VE_FINDXT + XT_FINDXT: +00070b 3801 .dw DO_COLON + PFA_FINDXT: + .endif +00070c 383d .dw XT_DOLITERAL +00070d 0717 .dw XT_FINDXTA +00070e 383d .dw XT_DOLITERAL +00070f 004a .dw CFG_ORDERLISTLEN +000710 09a7 .dw XT_MAPSTACK +000711 391a .dw XT_ZEROEQUAL +000712 3836 .dw XT_DOCONDBRANCH +000713 0716 DEST(PFA_FINDXT1) +000714 3ed2 .dw XT_2DROP +000715 3954 .dw XT_ZERO + PFA_FINDXT1: +000716 3820 .dw XT_EXIT + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + + XT_FINDXTA: +000717 3801 .dw DO_COLON + PFA_FINDXTA: + .endif +000718 38ff .dw XT_TO_R +000719 3ec9 .dw XT_2DUP +00071a 38f6 .dw XT_R_FROM +00071b 06a8 .dw XT_SEARCH_WORDLIST +00071c 38b1 .dw XT_DUP +00071d 3836 .dw XT_DOCONDBRANCH +00071e 0724 DEST(PFA_FINDXTA1) +00071f 38ff .dw XT_TO_R +000720 38f0 .dw XT_NIP +000721 38f0 .dw XT_NIP +000722 38f6 .dw XT_R_FROM +000723 394b .dw XT_TRUE + PFA_FINDXTA1: +000724 3820 .dw XT_EXIT + + .include "dict/compiler1.inc" + + .include "words/newest.asm" + + ; System Variable + ; system state + VE_NEWEST: +000725 ff06 .dw $ff06 +000726 656e +000727 6577 +000728 7473 .db "newest" +000729 0705 .dw VE_HEAD + .set VE_HEAD = VE_NEWEST + XT_NEWEST: +00072a 3848 .dw PFA_DOVARIABLE + PFA_NEWEST: +00072b 018a .dw ram_newest + + .dseg +00018a ram_newest: .byte 4 + .include "words/latest.asm" + + ; System Variable + ; system state + VE_LATEST: +00072c ff06 .dw $ff06 +00072d 616c +00072e 6574 +00072f 7473 .db "latest" +000730 0725 .dw VE_HEAD + .set VE_HEAD = VE_LATEST + XT_LATEST: +000731 3848 .dw PFA_DOVARIABLE + PFA_LATEST: +000732 018e .dw ram_latest + + .dseg +00018e 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: +000733 ff08 .dw $ff08 +000734 6328 +000735 6572 +000736 7461 +000737 2965 .db "(create)" +000738 072c .dw VE_HEAD + .set VE_HEAD = VE_DOCREATE + XT_DOCREATE: +000739 3801 .dw DO_COLON + PFA_DOCREATE: + .endif +00073a 05bb +00073b 0890 .DW XT_PARSENAME,XT_WLSCOPE ; ( -- addr len wid) +00073c 38b1 +00073d 072a +00073e 3c90 +00073f 3881 .DW XT_DUP,XT_NEWEST,XT_CELLPLUS,XT_STORE ; save the wid +000740 0875 +000741 072a +000742 3881 .DW XT_HEADER,XT_NEWEST,XT_STORE ; save the nt +000743 3820 .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: +000744 0001 .dw $0001 +000745 005c .db $5c,0 +000746 0733 .dw VE_HEAD + .set VE_HEAD = VE_BACKSLASH + XT_BACKSLASH: +000747 3801 .dw DO_COLON + PFA_BACKSLASH: + .endif +000748 05a2 .dw XT_SOURCE +000749 38f0 .dw XT_NIP +00074a 3ee2 .dw XT_TO_IN +00074b 3881 .dw XT_STORE +00074c 3820 .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: +00074d 0001 .dw $0001 +00074e 0028 .db "(" ,0 +00074f 0744 .dw VE_HEAD + .set VE_HEAD = VE_LPAREN + XT_LPAREN: +000750 3801 .dw DO_COLON + PFA_LPAREN: + .endif +000751 383d .dw XT_DOLITERAL +000752 0029 .dw ')' +000753 058e .dw XT_PARSE +000754 3ed2 .dw XT_2DROP +000755 3820 .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: +000756 ff07 .dw $ff07 +000757 6f63 +000758 706d +000759 6c69 +00075a 0065 .db "compile",0 +00075b 074d .dw VE_HEAD + .set VE_HEAD = VE_COMPILE + XT_COMPILE: +00075c 3801 .dw DO_COLON + PFA_COMPILE: + .endif +00075d 38f6 .dw XT_R_FROM +00075e 38b1 .dw XT_DUP +00075f 01d1 .dw XT_ICELLPLUS +000760 38ff .dw XT_TO_R +000761 3bcb .dw XT_FETCHI +000762 0767 .dw XT_COMMA +000763 3820 .dw XT_EXIT + .include "words/comma.asm" + + ; Dictionary + ; compile 16 bit into flash at DP + VE_COMMA: +000764 ff01 .dw $ff01 +000765 002c .db ',',0 ; , +000766 0756 .dw VE_HEAD + .set VE_HEAD = VE_COMMA + XT_COMMA: +000767 3801 .dw DO_COLON + PFA_COMMA: +000768 3f12 .dw XT_DP +000769 3b73 .dw XT_STOREI +00076a 3f12 .dw XT_DP +00076b 3a2f .dw XT_1PLUS +00076c 01bf .dw XT_DOTO +00076d 3f13 .dw PFA_DP +00076e 3820 .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: +00076f 0003 .dw $0003 +000770 275b +000771 005d .db "[']",0 +000772 0764 .dw VE_HEAD + .set VE_HEAD = VE_BRACKETTICK + XT_BRACKETTICK: +000773 3801 .dw DO_COLON + PFA_BRACKETTICK: + .endif +000774 0448 .dw XT_TICK +000775 077d .dw XT_LITERAL +000776 3820 .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: +000777 0007 .dw $0007 +000778 696c +000779 6574 +00077a 6172 +00077b 006c .db "literal",0 +00077c 076f .dw VE_HEAD + .set VE_HEAD = VE_LITERAL + XT_LITERAL: +00077d 3801 .dw DO_COLON + PFA_LITERAL: + .endif +00077e 075c .DW XT_COMPILE +00077f 383d .DW XT_DOLITERAL +000780 0767 .DW XT_COMMA +000781 3820 .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: +000782 0008 .dw $0008 +000783 6c73 +000784 7469 +000785 7265 +000786 6c61 .db "sliteral" +000787 0777 .dw VE_HEAD + .set VE_HEAD = VE_SLITERAL + XT_SLITERAL: +000788 3801 .dw DO_COLON + PFA_SLITERAL: + .endif +000789 075c .dw XT_COMPILE +00078a 03d0 .dw XT_DOSLITERAL ; ( -- addr n) +00078b 03de .dw XT_SCOMMA +00078c 3820 .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: +00078d 3801 .dw DO_COLON + PFA_GMARK: +00078e 3f12 .dw XT_DP +00078f 075c .dw XT_COMPILE +000790 ffff .dw -1 ; ffff does not erase flash +000791 3820 .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: +000792 3801 .dw DO_COLON + PFA_GRESOLVE: +000793 3f8b .dw XT_QSTACK +000794 3f12 .dw XT_DP +000795 38c4 .dw XT_SWAP +000796 3b73 .dw XT_STOREI +000797 3820 .dw XT_EXIT + .include "words/l_mark.asm" + + ; Compiler + ; place destination for backward branch + ;VE_LMARK: + ; .dw $ff05 + ; .db "r if 2drop then r> invert ; + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + XT_QDOCHECK: +000826 3801 .dw DO_COLON + PFA_QDOCHECK: + .endif +000827 3ec9 .dw XT_2DUP +000828 3fdf .dw XT_EQUAL +000829 38b1 .dw XT_DUP +00082a 38ff .dw XT_TO_R +00082b 3836 .dw XT_DOCONDBRANCH +00082c 082e DEST(PFA_QDOCHECK1) +00082d 3ed2 .dw XT_2DROP + PFA_QDOCHECK1: +00082e 38f6 .dw XT_R_FROM +00082f 39fd .dw XT_INVERT +000830 3820 .dw XT_EXIT + .include "words/endloop.asm" + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_ENDLOOP: +000831 ff07 .dw $ff07 +000832 6e65 +000833 6c64 +000834 6f6f +000835 0070 .db "endloop",0 +000836 081a .dw VE_HEAD + .set VE_HEAD = VE_ENDLOOP + XT_ENDLOOP: +000837 3801 .dw DO_COLON + PFA_ENDLOOP: + .endif + ;Z ENDLOOP adrs xt -- L: 0 a1 a2 .. aN -- + ; ?DUP WHILE POSTPONE THEN REPEAT ; + ; resolve LEAVEs + ; This is a common factor of LOOP and +LOOP. + +000838 079b .DW XT_LRESOLVE +000839 0844 +00083a 38b9 +00083b 3836 LOOP1: .DW XT_L_FROM,XT_QDUP,XT_DOCONDBRANCH +00083c 0840 DEST(LOOP2) +00083d 07c0 .DW XT_THEN +00083e 382f .dw XT_DOBRANCH +00083f 0839 DEST(LOOP1) +000840 3820 LOOP2: .DW XT_EXIT + ; leave address stack + .include "words/l-from.asm" + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_L_FROM: +000841 ff02 .dw $ff02 +000842 3e6c .db "l>" +000843 0831 .dw VE_HEAD + .set VE_HEAD = VE_L_FROM + XT_L_FROM: +000844 3801 .dw DO_COLON + PFA_L_FROM: + + .endif + ;Z L> -- x L: x -- move from leave stack + ; LP @ @ -2 LP +! ; + +000845 0863 .dw XT_LP +000846 3879 .dw XT_FETCH +000847 3879 .dw XT_FETCH +000848 383d .dw XT_DOLITERAL +000849 fffe .dw -2 +00084a 0863 .dw XT_LP +00084b 3a65 .dw XT_PLUSSTORE +00084c 3820 .dw XT_EXIT + .include "words/to-l.asm" + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_TO_L: +00084d ff02 .dw $ff02 +00084e 6c3e .db ">l" +00084f 0841 .dw VE_HEAD + .set VE_HEAD = VE_TO_L + XT_TO_L: +000850 3801 .dw DO_COLON + PFA_TO_L: + .endif + ;Z >L x -- L: -- x move to leave stack + ; CELL LP +! LP @ ! ; (L stack grows up) + +000851 3feb .dw XT_TWO +000852 0863 .dw XT_LP +000853 3a65 .dw XT_PLUSSTORE +000854 0863 .dw XT_LP +000855 3879 .dw XT_FETCH +000856 3881 .dw XT_STORE +000857 3820 .dw XT_EXIT + .include "words/lp0.asm" + + ; Stack + ; start address of leave stack + VE_LP0: +000858 ff03 .dw $ff03 +000859 706c +00085a 0030 .db "lp0",0 +00085b 084d .dw VE_HEAD + .set VE_HEAD = VE_LP0 + XT_LP0: +00085c 386f .dw PFA_DOVALUE1 + PFA_LP0: +00085d 0040 .dw CFG_LP0 +00085e 3da0 .dw XT_EDEFERFETCH +00085f 3daa .dw XT_EDEFERSTORE + .include "words/lp.asm" + + ; System Variable + ; leave stack pointer + VE_LP: +000860 ff02 .dw $ff02 +000861 706c .db "lp" +000862 0858 .dw VE_HEAD + .set VE_HEAD = VE_LP + XT_LP: +000863 3848 .dw PFA_DOVARIABLE + PFA_LP: +000864 0190 .dw ram_lp + + .dseg +000190 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: +000865 ff06 .dw $ff06 +000866 7263 +000867 6165 +000868 6574 .db "create" +000869 0860 .dw VE_HEAD + .set VE_HEAD = VE_CREATE + XT_CREATE: +00086a 3801 .dw DO_COLON + PFA_CREATE: + .endif +00086b 0739 .dw XT_DOCREATE +00086c 0899 .dw XT_REVEAL +00086d 075c .dw XT_COMPILE +00086e 3852 .dw PFA_DOCONSTANT +00086f 3820 .dw XT_EXIT + .include "words/header.asm" + + ; Compiler + ; creates the vocabulary header without XT and data field (PF) in the wordlist wid + VE_HEADER: +000870 ff06 .dw $ff06 +000871 6568 +000872 6461 +000873 7265 .db "header" +000874 0865 .dw VE_HEAD + .set VE_HEAD = VE_HEADER + XT_HEADER: +000875 3801 .dw DO_COLON + PFA_HEADER: +000876 3f12 .dw XT_DP ; the new Name Field +000877 38ff .dw XT_TO_R +000878 38ff .dw XT_TO_R ; ( R: NFA WID ) +000879 38b1 .dw XT_DUP +00087a 3928 .dw XT_GREATERZERO +00087b 3836 .dw XT_DOCONDBRANCH +00087c 0887 .dw PFA_HEADER1 +00087d 38b1 .dw XT_DUP +00087e 383d .dw XT_DOLITERAL +00087f ff00 .dw $ff00 ; all flags are off (e.g. immediate) +000880 3a1c .dw XT_OR +000881 03e2 .dw XT_DOSCOMMA + ; make the link to the previous entry in this wordlist +000882 38f6 .dw XT_R_FROM +000883 3b5f .dw XT_FETCHE +000884 0767 .dw XT_COMMA +000885 38f6 .dw XT_R_FROM +000886 3820 .dw XT_EXIT + + PFA_HEADER1: + ; -16: attempt to use zero length string as a name +000887 383d .dw XT_DOLITERAL +000888 fff0 .dw -16 +000889 3d86 .dw XT_THROW + + .include "words/wlscope.asm" + + ; Compiler + ; dynamically place a word in a wordlist. The word name may be changed. + VE_WLSCOPE: +00088a ff07 .dw $ff07 +00088b 6c77 +00088c 6373 +00088d 706f +00088e 0065 .db "wlscope",0 +00088f 0870 .dw VE_HEAD + .set VE_HEAD = VE_WLSCOPE + XT_WLSCOPE: +000890 3dff .dw PFA_DODEFER1 + PFA_WLSCOPE: +000891 003c .dw CFG_WLSCOPE +000892 3da0 .dw XT_EDEFERFETCH +000893 3daa .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: +000894 ff06 .dw $ff06 +000895 6572 +000896 6576 +000897 6c61 .db "reveal" +000898 088a .dw VE_HEAD + .set VE_HEAD = VE_REVEAL + XT_REVEAL: +000899 3801 .dw DO_COLON + PFA_REVEAL: + .endif +00089a 072a +00089b 3c90 +00089c 3879 .DW XT_NEWEST,XT_CELLPLUS,XT_FETCH ; only if wordlist is in use +00089d 38b9 +00089e 3836 .DW XT_QDUP,XT_DOCONDBRANCH +00089f 08a4 DEST(REVEAL1) +0008a0 072a +0008a1 3879 +0008a2 38c4 +0008a3 3b3b .DW XT_NEWEST,XT_FETCH,XT_SWAP,XT_STOREE + ; .DW XT_ZERO,XT_NEWEST,XT_CELLPLUS,XT_STORE ; clean wordlist entry + REVEAL1: +0008a4 3820 .DW XT_EXIT + .include "words/does.asm" + + ; Compiler + ; organize the XT replacement to call other colon code + VE_DOES: +0008a5 0005 .dw $0005 +0008a6 6f64 +0008a7 7365 +0008a8 003e .db "does>",0 +0008a9 0894 .dw VE_HEAD + .set VE_HEAD = VE_DOES + XT_DOES: +0008aa 3801 .dw DO_COLON + PFA_DOES: +0008ab 075c .dw XT_COMPILE +0008ac 08bd .dw XT_DODOES +0008ad 075c .dw XT_COMPILE ; create a code snippet to be used in an embedded XT +0008ae 940e .dw $940e ; the address of this compiled +0008af 075c .dw XT_COMPILE ; code will replace the XT of the +0008b0 08b2 .dw DO_DODOES ; word that CREATE created +0008b1 3820 .dw XT_EXIT ; + + DO_DODOES: ; ( -- PFA ) +0008b2 939a +0008b3 938a savetos +0008b4 01cb movw tosl, wl +0008b5 9601 adiw tosl, 1 + ; the following takes the address from a real uC-call + .if (pclen==3) + .endif +0008b6 917f pop wh +0008b7 916f pop wl + +0008b8 93bf push XH +0008b9 93af push XL +0008ba 01db movw XL, wl +0008bb 940c 3805 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: +0008bd 3801 .dw DO_COLON + PFA_DODOES: +0008be 38f6 .dw XT_R_FROM +0008bf 072a .dw XT_NEWEST +0008c0 3c90 .dw XT_CELLPLUS +0008c1 3879 .dw XT_FETCH +0008c2 3b5f .dw XT_FETCHE +0008c3 0701 .dw XT_NFA2CFA +0008c4 3b73 .dw XT_STOREI +0008c5 3820 .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: +0008c6 ff01 .dw $ff01 +0008c7 003a .db ":",0 +0008c8 08a5 .dw VE_HEAD + .set VE_HEAD = VE_COLON + XT_COLON: +0008c9 3801 .dw DO_COLON + PFA_COLON: + .endif +0008ca 0739 .dw XT_DOCREATE +0008cb 08d4 .dw XT_COLONNONAME +0008cc 38d9 .dw XT_DROP +0008cd 3820 .dw XT_EXIT + .include "words/colon-noname.asm" + + ; Compiler + ; create an unnamed entry in the dictionary, XT is DO_COLON + VE_COLONNONAME: +0008ce ff07 .dw $ff07 +0008cf 6e3a +0008d0 6e6f +0008d1 6d61 +0008d2 0065 .db ":noname",0 +0008d3 08c6 .dw VE_HEAD + .set VE_HEAD = VE_COLONNONAME + XT_COLONNONAME: +0008d4 3801 .dw DO_COLON + PFA_COLONNONAME: +0008d5 3f12 .dw XT_DP +0008d6 38b1 .dw XT_DUP +0008d7 0731 .dw XT_LATEST +0008d8 3881 .dw XT_STORE + +0008d9 075c .dw XT_COMPILE +0008da 3801 .dw DO_COLON + +0008db 08e9 .dw XT_RBRACKET +0008dc 3820 .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: +0008dd 0001 .dw $0001 +0008de 003b .db $3b,0 +0008df 08ce .dw VE_HEAD + .set VE_HEAD = VE_SEMICOLON + XT_SEMICOLON: +0008e0 3801 .dw DO_COLON + PFA_SEMICOLON: + .endif +0008e1 075c .dw XT_COMPILE +0008e2 3820 .dw XT_EXIT +0008e3 08f1 .dw XT_LBRACKET +0008e4 0899 .dw XT_REVEAL +0008e5 3820 .dw XT_EXIT + .include "words/right-bracket.asm" + + ; Compiler + ; enter compiler mode + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_RBRACKET: +0008e6 ff01 .dw $ff01 +0008e7 005d .db "]",0 +0008e8 08dd .dw VE_HEAD + .set VE_HEAD = VE_RBRACKET + XT_RBRACKET: +0008e9 3801 .dw DO_COLON + PFA_RBRACKET: + .endif +0008ea 3fe6 .dw XT_ONE +0008eb 3eb7 .dw XT_STATE +0008ec 3881 .dw XT_STORE +0008ed 3820 .dw XT_EXIT + .include "words/left-bracket.asm" + + ; Compiler + ; enter interpreter mode + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_LBRACKET: +0008ee 0001 .dw $0001 +0008ef 005b .db "[",0 +0008f0 08e6 .dw VE_HEAD + .set VE_HEAD = VE_LBRACKET + XT_LBRACKET: +0008f1 3801 .dw DO_COLON + PFA_LBRACKET: + .endif +0008f2 3954 .dw XT_ZERO +0008f3 3eb7 .dw XT_STATE +0008f4 3881 .dw XT_STORE +0008f5 3820 .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: +0008f6 ff08 .dw $ff08 +0008f7 6176 +0008f8 6972 +0008f9 6261 +0008fa 656c .db "variable" +0008fb 08ee .dw VE_HEAD + .set VE_HEAD = VE_VARIABLE + XT_VARIABLE: +0008fc 3801 .dw DO_COLON + PFA_VARIABLE: + .endif +0008fd 3f23 .dw XT_HERE +0008fe 0908 .dw XT_CONSTANT +0008ff 3feb .dw XT_TWO +000900 3f2c .dw XT_ALLOT +000901 3820 .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: +000902 ff08 .dw $ff08 +000903 6f63 +000904 736e +000905 6174 +000906 746e .db "constant" +000907 08f6 .dw VE_HEAD + .set VE_HEAD = VE_CONSTANT + XT_CONSTANT: +000908 3801 .dw DO_COLON + PFA_CONSTANT: + .endif +000909 0739 .dw XT_DOCREATE +00090a 0899 .dw XT_REVEAL +00090b 075c .dw XT_COMPILE +00090c 3848 .dw PFA_DOVARIABLE +00090d 0767 .dw XT_COMMA +00090e 3820 .dw XT_EXIT + .include "words/user.asm" + + ; Compiler + ; create a dictionary entry for a user variable at offset n + VE_USER: +00090f ff04 .dw $ff04 +000910 7375 +000911 7265 .db "user" +000912 0902 .dw VE_HEAD + .set VE_HEAD = VE_USER + XT_USER: +000913 3801 .dw DO_COLON + PFA_USER: +000914 0739 .dw XT_DOCREATE +000915 0899 .dw XT_REVEAL + +000916 075c .dw XT_COMPILE +000917 3858 .dw PFA_DOUSER +000918 0767 .dw XT_COMMA +000919 3820 .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: +00091a 0007 .dw $0007 +00091b 6572 +00091c 7563 +00091d 7372 +00091e 0065 .db "recurse",0 +00091f 090f .dw VE_HEAD + .set VE_HEAD = VE_RECURSE + XT_RECURSE: +000920 3801 .dw DO_COLON + PFA_RECURSE: + .endif +000921 0731 .dw XT_LATEST +000922 3879 .dw XT_FETCH +000923 0767 .dw XT_COMMA +000924 3820 .dw XT_EXIT + .include "words/immediate.asm" + + ; Compiler + ; set immediate flag for the most recent word definition + VE_IMMEDIATE: +000925 ff09 .dw $ff09 +000926 6d69 +000927 656d +000928 6964 +000929 7461 +00092a 0065 .db "immediate",0 +00092b 091a .dw VE_HEAD + .set VE_HEAD = VE_IMMEDIATE + XT_IMMEDIATE: +00092c 3801 .dw DO_COLON + PFA_IMMEDIATE: +00092d 09ce .dw XT_GET_CURRENT +00092e 3b5f .dw XT_FETCHE +00092f 38b1 .dw XT_DUP +000930 3bcb .dw XT_FETCHI +000931 383d .dw XT_DOLITERAL +000932 7fff .dw $7fff +000933 3a13 .dw XT_AND +000934 38c4 .dw XT_SWAP +000935 3b73 .dw XT_STOREI +000936 3820 .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: +000937 0006 .dw $0006 +000938 635b +000939 6168 +00093a 5d72 .db "[char]" +00093b 0925 .dw VE_HEAD + .set VE_HEAD = VE_BRACKETCHAR + XT_BRACKETCHAR: +00093c 3801 .dw DO_COLON + PFA_BRACKETCHAR: + .endif +00093d 075c .dw XT_COMPILE +00093e 383d .dw XT_DOLITERAL +00093f 04f1 .dw XT_CHAR +000940 0767 .dw XT_COMMA +000941 3820 .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: +000942 0006 .dw $0006 +000943 6261 +000944 726f +000945 2274 .db "abort",'"' +000946 0937 .dw VE_HEAD + .set VE_HEAD = VE_ABORTQUOTE + XT_ABORTQUOTE: +000947 3801 .dw DO_COLON + PFA_ABORTQUOTE: + .endif +000948 3e8a .dw XT_SQUOTE +000949 075c .dw XT_COMPILE +00094a 0959 .dw XT_QABORT +00094b 3820 .DW XT_EXIT + .include "words/abort.asm" + + ; Exceptions + ; send an exception -1 + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_ABORT: +00094c ff05 .dw $ff05 +00094d 6261 +00094e 726f +00094f 0074 .db "abort",0 +000950 0942 .dw VE_HEAD + .set VE_HEAD = VE_ABORT + XT_ABORT: +000951 3801 .dw DO_COLON + PFA_ABORT: + .endif +000952 394b .dw XT_TRUE +000953 3d86 .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: +000954 ff06 .dw $ff06 +000955 613f +000956 6f62 +000957 7472 .db "?abort" +000958 094c .dw VE_HEAD + .set VE_HEAD = VE_QABORT + XT_QABORT: +000959 3801 .dw DO_COLON + PFA_QABORT: + + .endif +00095a 38e1 +00095b 3836 .DW XT_ROT,XT_DOCONDBRANCH +00095c 095f DEST(QABO1) +00095d 0403 +00095e 0951 .DW XT_ITYPE,XT_ABORT +00095f 3ed2 +000960 3820 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: +000961 ff09 .dw $ff09 +000962 6567 +000963 2d74 +000964 7473 +000965 6361 +000966 006b .db "get-stack",0 +000967 0954 .dw VE_HEAD + .set VE_HEAD = VE_GET_STACK + XT_GET_STACK: +000968 3801 .dw DO_COLON + .endif +000969 38b1 .dw XT_DUP +00096a 3c90 .dw XT_CELLPLUS +00096b 38c4 .dw XT_SWAP +00096c 3b5f .dw XT_FETCHE +00096d 38b1 .dw XT_DUP +00096e 38ff .dw XT_TO_R +00096f 3954 .dw XT_ZERO +000970 38c4 .dw XT_SWAP ; go from bigger to smaller addresses +000971 0826 .dw XT_QDOCHECK +000972 3836 .dw XT_DOCONDBRANCH +000973 097f DEST(PFA_N_FETCH_E2) +000974 3a9b .dw XT_DODO + PFA_N_FETCH_E1: + ; ( ee-addr ) +000975 3aac .dw XT_I +000976 3a35 .dw XT_1MINUS +000977 3ec4 .dw XT_CELLS ; ( -- ee-addr i*2 ) +000978 38cf .dw XT_OVER ; ( -- ee-addr i*2 ee-addr ) +000979 399d .dw XT_PLUS ; ( -- ee-addr ee-addr+i +00097a 3b5f .dw XT_FETCHE ;( -- ee-addr item_i ) +00097b 38c4 .dw XT_SWAP ;( -- item_i ee-addr ) +00097c 394b .dw XT_TRUE ; shortcut for -1 +00097d 3aba .dw XT_DOPLUSLOOP +00097e 0975 DEST(PFA_N_FETCH_E1) + PFA_N_FETCH_E2: +00097f 3ed2 .dw XT_2DROP +000980 38f6 .dw XT_R_FROM +000981 3820 .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: +000982 ff09 .dw $ff09 +000983 6573 +000984 2d74 +000985 7473 +000986 6361 +000987 006b .db "set-stack",0 +000988 0961 .dw VE_HEAD + .set VE_HEAD = VE_SET_STACK + XT_SET_STACK: +000989 3801 .dw DO_COLON + PFA_SET_STACK: + .endif +00098a 38cf .dw XT_OVER +00098b 3921 .dw XT_ZEROLESS +00098c 3836 .dw XT_DOCONDBRANCH +00098d 0991 DEST(PFA_SET_STACK0) +00098e 383d .dw XT_DOLITERAL +00098f fffc .dw -4 +000990 3d86 .dw XT_THROW + PFA_SET_STACK0: +000991 3ec9 .dw XT_2DUP +000992 3b3b .dw XT_STOREE ; ( -- i_n .. i_0 n e-addr ) +000993 38c4 .dw XT_SWAP +000994 3954 .dw XT_ZERO +000995 0826 .dw XT_QDOCHECK +000996 3836 .dw XT_DOCONDBRANCH +000997 099e DEST(PFA_SET_STACK2) +000998 3a9b .dw XT_DODO + PFA_SET_STACK1: +000999 3c90 .dw XT_CELLPLUS ; ( -- i_x e-addr ) +00099a 3eda .dw XT_TUCK ; ( -- e-addr i_x e-addr +00099b 3b3b .dw XT_STOREE +00099c 3ac9 .dw XT_DOLOOP +00099d 0999 DEST(PFA_SET_STACK1) + PFA_SET_STACK2: +00099e 38d9 .dw XT_DROP +00099f 3820 .dw XT_EXIT + + .include "words/map-stack.asm" + + ; Tools + ; Iterate over a stack + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_MAPSTACK: +0009a0 ff09 .dw $ff09 +0009a1 616d +0009a2 2d70 +0009a3 7473 +0009a4 6361 +0009a5 006b .db "map-stack",0 +0009a6 0982 .dw VE_HEAD + .set VE_HEAD = VE_MAPSTACK + XT_MAPSTACK: +0009a7 3801 .dw DO_COLON + PFA_MAPSTACK: + .endif +0009a8 38b1 .dw XT_DUP +0009a9 3c90 .dw XT_CELLPLUS +0009aa 38c4 .dw XT_SWAP +0009ab 3b5f .dw XT_FETCHE +0009ac 3ec4 .dw XT_CELLS +0009ad 3f99 .dw XT_BOUNDS +0009ae 0826 .dw XT_QDOCHECK +0009af 3836 .dw XT_DOCONDBRANCH +0009b0 09c3 DEST(PFA_MAPSTACK3) +0009b1 3a9b .dw XT_DODO + PFA_MAPSTACK1: +0009b2 3aac .dw XT_I +0009b3 3b5f .dw XT_FETCHE ; -- i*x XT id +0009b4 38c4 .dw XT_SWAP +0009b5 38ff .dw XT_TO_R +0009b6 3908 .dw XT_R_FETCH +0009b7 382a .dw XT_EXECUTE ; i*x id -- j*y true | i*x false +0009b8 38b9 .dw XT_QDUP +0009b9 3836 .dw XT_DOCONDBRANCH +0009ba 09bf DEST(PFA_MAPSTACK2) +0009bb 38f6 .dw XT_R_FROM +0009bc 38d9 .dw XT_DROP +0009bd 3ad4 .dw XT_UNLOOP +0009be 3820 .dw XT_EXIT + PFA_MAPSTACK2: +0009bf 38f6 .dw XT_R_FROM +0009c0 3feb .dw XT_TWO +0009c1 3aba .dw XT_DOPLUSLOOP +0009c2 09b2 DEST(PFA_MAPSTACK1) + PFA_MAPSTACK3: +0009c3 38d9 .dw XT_DROP +0009c4 3954 .dw XT_ZERO +0009c5 3820 .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: +0009c6 ff0b .dw $ff0b +0009c7 6567 +0009c8 2d74 +0009c9 7563 +0009ca 7272 +0009cb 6e65 +0009cc 0074 .db "get-current",0 +0009cd 09a0 .dw VE_HEAD + .set VE_HEAD = VE_GET_CURRENT + XT_GET_CURRENT: +0009ce 3801 .dw DO_COLON + PFA_GET_CURRENT: +0009cf 383d .dw XT_DOLITERAL +0009d0 0046 .dw CFG_CURRENT +0009d1 3b5f .dw XT_FETCHE +0009d2 3820 .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: +0009d3 ff09 .dw $ff09 +0009d4 6567 +0009d5 2d74 +0009d6 726f +0009d7 6564 +0009d8 0072 .db "get-order",0 +0009d9 09c6 .dw VE_HEAD + .set VE_HEAD = VE_GET_ORDER + XT_GET_ORDER: +0009da 3801 .dw DO_COLON + PFA_GET_ORDER: + .endif +0009db 383d .dw XT_DOLITERAL +0009dc 004a .dw CFG_ORDERLISTLEN +0009dd 0968 .dw XT_GET_STACK +0009de 3820 .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: +0009df ff09 .dw $ff09 +0009e0 6663 +0009e1 2d67 +0009e2 726f +0009e3 6564 +0009e4 0072 .db "cfg-order",0 +0009e5 09d3 .dw VE_HEAD + .set VE_HEAD = VE_CFG_ORDER + XT_CFG_ORDER: +0009e6 3848 .dw PFA_DOVARIABLE + PFA_CFG_ORDER: + .endif +0009e7 004a .dw CFG_ORDERLISTLEN + .include "words/compare.asm" + + ; String + ; compares two strings in RAM + VE_COMPARE: +0009e8 ff07 .dw $ff07 +0009e9 6f63 +0009ea 706d +0009eb 7261 +0009ec 0065 .db "compare",0 +0009ed 09df .dw VE_HEAD + .set VE_HEAD = VE_COMPARE + XT_COMPARE: +0009ee 09ef .dw PFA_COMPARE + PFA_COMPARE: +0009ef 93bf push xh +0009f0 93af push xl +0009f1 018c movw temp0, tosl +0009f2 9189 +0009f3 9199 loadtos +0009f4 01dc movw xl, tosl +0009f5 9189 +0009f6 9199 loadtos +0009f7 019c movw temp2, tosl +0009f8 9189 +0009f9 9199 loadtos +0009fa 01fc movw zl, tosl + PFA_COMPARE_LOOP: +0009fb 90ed ld temp4, X+ +0009fc 90f1 ld temp5, Z+ +0009fd 14ef cp temp4, temp5 +0009fe f451 brne PFA_COMPARE_NOTEQUAL +0009ff 950a dec temp0 +000a00 f019 breq PFA_COMPARE_ENDREACHED2 +000a01 952a dec temp2 +000a02 f7c1 brne PFA_COMPARE_LOOP +000a03 c001 rjmp PFA_COMPARE_ENDREACHED + PFA_COMPARE_ENDREACHED2: +000a04 952a dec temp2 + PFA_COMPARE_ENDREACHED: +000a05 2b02 or temp0, temp2 +000a06 f411 brne PFA_COMPARE_CHECKLASTCHAR +000a07 2788 clr tosl +000a08 c002 rjmp PFA_COMPARE_DONE + PFA_COMPARE_CHECKLASTCHAR: + PFA_COMPARE_NOTEQUAL: +000a09 ef8f ser tosl +000a0a c000 rjmp PFA_COMPARE_DONE + + PFA_COMPARE_DONE: +000a0b 2f98 mov tosh, tosl +000a0c 91af pop xl +000a0d 91bf pop xh +000a0e 940c 3805 jmp_ DO_NEXT + .include "words/nfa2lfa.asm" + + ; System + ; get the link field address from the name field address + VE_NFA2LFA: +000a10 ff07 .dw $ff07 +000a11 666e +000a12 3e61 +000a13 666c +000a14 0061 .db "nfa>lfa",0 +000a15 09e8 .dw VE_HEAD + .set VE_HEAD = VE_NFA2LFA + XT_NFA2LFA: +000a16 3801 .dw DO_COLON + PFA_NFA2LFA: +000a17 06f5 .dw XT_NAME2STRING +000a18 3a2f .dw XT_1PLUS +000a19 3a04 .dw XT_2SLASH +000a1a 399d .dw XT_PLUS +000a1b 3820 .dw XT_EXIT + .elif AMFORTH_NRWW_SIZE > 2000 + .else + .endif + .include "dict_appl.inc" + + ; they may be moved to the core dictionary if needed + .include "words/dot-s.asm" + + ; Tools + ; stack dump + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_DOTS: +000a1c ff02 .dw $ff02 +000a1d 732e .db ".s" +000a1e 0a10 .dw VE_HEAD + .set VE_HEAD = VE_DOTS + XT_DOTS: +000a1f 3801 .dw DO_COLON + PFA_DOTS: + .endif +000a20 05ed .dw XT_DEPTH +000a21 3e0a .dw XT_UDOT +000a22 3fae .dw XT_SPACE +000a23 05ed .dw XT_DEPTH +000a24 3954 .dw XT_ZERO +000a25 0826 .dw XT_QDOCHECK +000a26 3836 .dw XT_DOCONDBRANCH +000a27 0a2e DEST(PFA_DOTS2) +000a28 3a9b .dw XT_DODO + PFA_DOTS1: +000a29 3aac .dw XT_I +000a2a 3c84 .dw XT_PICK +000a2b 3e0a .dw XT_UDOT +000a2c 3ac9 .dw XT_DOLOOP +000a2d 0a29 DEST(PFA_DOTS1) + PFA_DOTS2: +000a2e 3820 .dw XT_EXIT + .include "words/spirw.asm" + + ; MCU + ; SPI exchange of 1 byte + VE_SPIRW: +000a2f ff06 .dw $ff06 +000a30 2163 +000a31 7340 +000a32 6970 .db "c!@spi" +000a33 0a1c .dw VE_HEAD + .set VE_HEAD = VE_SPIRW + XT_SPIRW: +000a34 0a35 .dw PFA_SPIRW + PFA_SPIRW: +000a35 d003 rcall do_spirw +000a36 2799 clr tosh +000a37 940c 3805 jmp_ DO_NEXT + + do_spirw: +000a39 bd8e out_ SPDR, tosl + do_spirw1: +000a3a b50d in_ temp0, SPSR +000a3b 7f08 cbr temp0,7 +000a3c bd0d out_ SPSR, temp0 +000a3d b50d in_ temp0, SPSR +000a3e ff07 sbrs temp0, 7 +000a3f cffa rjmp do_spirw1 ; wait until complete +000a40 b58e in_ tosl, SPDR +000a41 9508 ret + .include "words/n-spi.asm" + + ; MCU + ; read len bytes from SPI to addr + VE_N_SPIR: +000a42 ff05 .dw $ff05 +000a43 406e +000a44 7073 +000a45 0069 .db "n@spi",0 +000a46 0a2f .dw VE_HEAD + .set VE_HEAD = VE_N_SPIR + XT_N_SPIR: +000a47 0a48 .dw PFA_N_SPIR + PFA_N_SPIR: +000a48 018c movw temp0, tosl +000a49 9189 +000a4a 9199 loadtos +000a4b 01fc movw zl, tosl +000a4c 01c8 movw tosl, temp0 + PFA_N_SPIR_LOOP: +000a4d bc2e out_ SPDR, zerol + PFA_N_SPIR_LOOP1: +000a4e b52d in_ temp2, SPSR +000a4f ff27 sbrs temp2, SPIF +000a50 cffd rjmp PFA_N_SPIR_LOOP1 +000a51 b52e in_ temp2, SPDR +000a52 9321 st Z+, temp2 +000a53 9701 sbiw tosl, 1 +000a54 f7c1 brne PFA_N_SPIR_LOOP +000a55 9189 +000a56 9199 loadtos +000a57 940c 3805 jmp_ DO_NEXT + + ; ( addr len -- ) + ; MCU + ; write len bytes to SPI from addr + VE_N_SPIW: +000a59 ff05 .dw $ff05 +000a5a 216e +000a5b 7073 +000a5c 0069 .db "n!spi",0 +000a5d 0a42 .dw VE_HEAD + .set VE_HEAD = VE_N_SPIW + XT_N_SPIW: +000a5e 0a5f .dw PFA_N_SPIW + PFA_N_SPIW: +000a5f 018c movw temp0, tosl +000a60 9189 +000a61 9199 loadtos +000a62 01fc movw zl, tosl +000a63 01c8 movw tosl, temp0 + PFA_N_SPIW_LOOP: +000a64 9121 ld temp2, Z+ +000a65 bd2e out_ SPDR, temp2 + PFA_N_SPIW_LOOP1: +000a66 b52d in_ temp2, SPSR +000a67 ff27 sbrs temp2, SPIF +000a68 cffd rjmp PFA_N_SPIW_LOOP1 +000a69 b52e in_ temp2, SPDR ; ignore the data +000a6a 9701 sbiw tosl, 1 +000a6b f7c1 brne PFA_N_SPIW_LOOP +000a6c 9189 +000a6d 9199 loadtos +000a6e 940c 3805 jmp_ DO_NEXT + .include "words/applturnkey.asm" + + ; R( -- ) + ; application specific turnkey action + VE_APPLTURNKEY: +000a70 ff0b .dw $ff0b +000a71 7061 +000a72 6c70 +000a73 7574 +000a74 6e72 +000a75 656b +000a76 0079 .db "applturnkey",0 +000a77 0a59 .dw VE_HEAD + .set VE_HEAD = VE_APPLTURNKEY + XT_APPLTURNKEY: +000a78 3801 .dw DO_COLON + PFA_APPLTURNKEY: +000a79 00c7 .dw XT_USART + + .if WANT_INTERRUPTS == 1 +000a7a 3c97 .dw XT_INTON + .endif +000a7b 018a .dw XT_DOT_VER +000a7c 3fae .dw XT_SPACE +000a7d 3eac .dw XT_F_CPU +000a7e 383d .dw XT_DOLITERAL +000a7f 03e8 .dw 1000 +000a80 39c2 .dw XT_UMSLASHMOD +000a81 38f0 .dw XT_NIP +000a82 3f41 .dw XT_DECIMAL +000a83 0385 .dw XT_DOT +000a84 03d0 .dw XT_DOSLITERAL +000a85 0004 .dw 4 +000a86 486b +000a87 207a .db "kHz " +000a88 0403 .dw XT_ITYPE +000a89 3820 .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: +000a8a ff0b .dw $ff0b +000a8b 6573 +000a8c 2d74 +000a8d 7563 +000a8e 7272 +000a8f 6e65 +000a90 0074 .db "set-current",0 +000a91 0a70 .dw VE_HEAD + .set VE_HEAD = VE_SET_CURRENT + XT_SET_CURRENT: +000a92 3801 .dw DO_COLON + PFA_SET_CURRENT: +000a93 383d .dw XT_DOLITERAL +000a94 0046 .dw CFG_CURRENT +000a95 3b3b .dw XT_STOREE +000a96 3820 .dw XT_EXIT + .include "words/wordlist.asm" + + ; Search Order + ; create a new, empty wordlist + VE_WORDLIST: +000a97 ff08 .dw $ff08 +000a98 6f77 +000a99 6472 +000a9a 696c +000a9b 7473 .db "wordlist" +000a9c 0a8a .dw VE_HEAD + .set VE_HEAD = VE_WORDLIST + XT_WORDLIST: +000a9d 3801 .dw DO_COLON + PFA_WORDLIST: +000a9e 3f1b .dw XT_EHERE +000a9f 3954 .dw XT_ZERO +000aa0 38cf .dw XT_OVER +000aa1 3b3b .dw XT_STOREE +000aa2 38b1 .dw XT_DUP +000aa3 3c90 .dw XT_CELLPLUS +000aa4 01bf .dw XT_DOTO +000aa5 3f1c .dw PFA_EHERE +000aa6 3820 .dw XT_EXIT + + .include "words/forth-wordlist.asm" + + ; Search Order + ; get the system default word list + VE_FORTHWORDLIST: +000aa7 ff0e .dw $ff0e +000aa8 6f66 +000aa9 7472 +000aaa 2d68 +000aab 6f77 +000aac 6472 +000aad 696c +000aae 7473 .db "forth-wordlist" +000aaf 0a97 .dw VE_HEAD + .set VE_HEAD = VE_FORTHWORDLIST + XT_FORTHWORDLIST: +000ab0 3848 .dw PFA_DOVARIABLE + PFA_FORTHWORDLIST: +000ab1 0048 .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: +000ab2 ff09 .dw $ff09 +000ab3 6573 +000ab4 2d74 +000ab5 726f +000ab6 6564 +000ab7 0072 .db "set-order",0 +000ab8 0aa7 .dw VE_HEAD + .set VE_HEAD = VE_SET_ORDER + XT_SET_ORDER: +000ab9 3801 .dw DO_COLON + PFA_SET_ORDER: + .endif +000aba 383d .dw XT_DOLITERAL +000abb 004a .dw CFG_ORDERLISTLEN +000abc 0989 .dw XT_SET_STACK +000abd 3820 .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: +000abe ff0f .dw $ff0f +000abf 6573 +000ac0 2d74 +000ac1 6572 +000ac2 6f63 +000ac3 6e67 +000ac4 7a69 +000ac5 7265 +000ac6 0073 .db "set-recognizers",0 +000ac7 0ab2 .dw VE_HEAD + .set VE_HEAD = VE_SET_RECOGNIZERS + XT_SET_RECOGNIZERS: +000ac8 3801 .dw DO_COLON + PFA_SET_RECOGNIZERS: + .endif +000ac9 383d .dw XT_DOLITERAL +000aca 005c .dw CFG_RECOGNIZERLISTLEN +000acb 0989 .dw XT_SET_STACK +000acc 3820 .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: +000acd ff0f .dw $ff0f +000ace 6567 +000acf 2d74 +000ad0 6572 +000ad1 6f63 +000ad2 6e67 +000ad3 7a69 +000ad4 7265 +000ad5 0073 .db "get-recognizers",0 +000ad6 0abe .dw VE_HEAD + .set VE_HEAD = VE_GET_RECOGNIZERS + XT_GET_RECOGNIZERS: +000ad7 3801 .dw DO_COLON + PFA_GET_RECOGNIZERS: + .endif +000ad8 383d .dw XT_DOLITERAL +000ad9 005c .dw CFG_RECOGNIZERLISTLEN +000ada 0968 .dw XT_GET_STACK +000adb 3820 .dw XT_EXIT + .include "words/code.asm" + + ; Compiler + ; create named entry in the dictionary, XT is the data field + VE_CODE: +000adc ff04 .dw $ff04 +000add 6f63 +000ade 6564 .db "code" +000adf 0acd .dw VE_HEAD + .set VE_HEAD = VE_CODE + XT_CODE: +000ae0 3801 .dw DO_COLON + PFA_CODE: +000ae1 0739 .dw XT_DOCREATE +000ae2 0899 .dw XT_REVEAL +000ae3 3f12 .dw XT_DP +000ae4 01d1 .dw XT_ICELLPLUS +000ae5 0767 .dw XT_COMMA +000ae6 3820 .dw XT_EXIT + .include "words/end-code.asm" + + ; Compiler + ; finish a code definition + VE_ENDCODE: +000ae7 ff08 .dw $ff08 +000ae8 6e65 +000ae9 2d64 +000aea 6f63 +000aeb 6564 .db "end-code" +000aec 0adc .dw VE_HEAD + .set VE_HEAD = VE_ENDCODE + XT_ENDCODE: +000aed 3801 .dw DO_COLON + PFA_ENDCODE: +000aee 075c .dw XT_COMPILE +000aef 940c .dw $940c +000af0 075c .dw XT_COMPILE +000af1 3805 .dw DO_NEXT +000af2 3820 .dw XT_EXIT + .include "words/marker.asm" + + ; System Value + ; The eeprom address until which MARKER saves and restores the eeprom data. + VE_MARKER: +000af3 ff08 .dw $ff08 +000af4 6d28 +000af5 7261 +000af6 656b +000af7 2972 .db "(marker)" +000af8 0ae7 .dw VE_HEAD + .set VE_HEAD = VE_MARKER + XT_MARKER: +000af9 386f .dw PFA_DOVALUE1 + PFA_MARKER: +000afa 0068 .dw EE_MARKER +000afb 3da0 .dw XT_EDEFERFETCH +000afc 3daa .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: +000afd 0008 .dw $0008 +000afe 6f70 +000aff 7473 +000b00 6f70 +000b01 656e .db "postpone" +000b02 0af3 .dw VE_HEAD + .set VE_HEAD = VE_POSTPONE + XT_POSTPONE: +000b03 3801 .dw DO_COLON + PFA_POSTPONE: + .endif +000b04 05bb .dw XT_PARSENAME +000b05 05fe .dw XT_FORTHRECOGNIZER +000b06 0609 .dw XT_RECOGNIZE +000b07 38b1 .dw XT_DUP +000b08 38ff .dw XT_TO_R +000b09 01d1 .dw XT_ICELLPLUS +000b0a 01d1 .dw XT_ICELLPLUS +000b0b 3bcb .dw XT_FETCHI +000b0c 382a .dw XT_EXECUTE +000b0d 38f6 .dw XT_R_FROM +000b0e 01d1 .dw XT_ICELLPLUS +000b0f 3bcb .dw XT_FETCHI +000b10 0767 .dw XT_COMMA +000b11 3820 .dw XT_EXIT + .endif + .include "words/2r_fetch.asm" + + ; Stack + ; fetch content of TOR + VE_2R_FETCH: +000b12 ff03 .dw $ff03 +000b13 7232 +000b14 0040 .db "2r@",0 +000b15 0afd .dw VE_HEAD + .set VE_HEAD = VE_2R_FETCH + XT_2R_FETCH: +000b16 0b17 .dw PFA_2R_FETCH + PFA_2R_FETCH: +000b17 939a +000b18 938a savetos +000b19 91ef pop zl +000b1a 91ff pop zh +000b1b 918f pop tosl +000b1c 919f pop tosh +000b1d 939f push tosh +000b1e 938f push tosl +000b1f 93ff push zh +000b20 93ef push zl +000b21 939a +000b22 938a savetos +000b23 01cf movw tosl, zl +000b24 940c 3805 jmp_ DO_NEXT + + .set DPSTART = pc + .if(pc>AMFORTH_RO_SEG) + .endif + + .org AMFORTH_RO_SEG + .include "amforth-interpreter.asm" + + + DO_COLON: +003801 93bf push XH +003802 93af push XL ; PUSH IP +003803 01db movw XL, wl +003804 9611 adiw xl, 1 + DO_NEXT: + .if WANT_INTERRUPTS == 1 +003805 14b2 cp isrflag, zerol +003806 f469 brne DO_INTERRUPT + .endif +003807 01fd movw zl, XL ; READ IP +003808 0fee +003809 1fff +00380a 9165 +00380b 9175 readflashcell wl, wh +00380c 9611 adiw XL, 1 ; INC IP + + DO_EXECUTE: +00380d 01fb movw zl, wl +00380e 0fee +00380f 1fff +003810 9105 +003811 9115 readflashcell temp0,temp1 +003812 01f8 movw zl, temp0 +003813 9409 ijmp + + .if WANT_INTERRUPTS == 1 + DO_INTERRUPT: + ; here we deal with interrupts the forth way +003814 939a +003815 938a savetos +003816 2d8b mov tosl, isrflag +003817 2799 clr tosh +003818 24bb clr isrflag +003819 ec60 ldi wl, LOW(XT_ISREXEC) +00381a e37c ldi wh, HIGH(XT_ISREXEC) +00381b cff1 rjmp DO_EXECUTE + .include "dict/nrww.inc" + + ; section together with the forth inner interpreter + + .include "words/exit.asm" + + ; Compiler + ; end of current colon word + VE_EXIT: +00381c ff04 .dw $ff04 +00381d 7865 +00381e 7469 .db "exit" +00381f 0b12 .dw VE_HEAD + .set VE_HEAD = VE_EXIT + XT_EXIT: +003820 3821 .dw PFA_EXIT + PFA_EXIT: +003821 91af pop XL +003822 91bf pop XH +003823 cfe1 jmp_ DO_NEXT + .include "words/execute.asm" + + ; System + ; execute XT + VE_EXECUTE: +003824 ff07 .dw $ff07 +003825 7865 +003826 6365 +003827 7475 +003828 0065 .db "execute",0 +003829 381c .dw VE_HEAD + .set VE_HEAD = VE_EXECUTE + XT_EXECUTE: +00382a 382b .dw PFA_EXECUTE + PFA_EXECUTE: +00382b 01bc movw wl, tosl +00382c 9189 +00382d 9199 loadtos +00382e cfde 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: +00382f 3830 .dw PFA_DOBRANCH + PFA_DOBRANCH: +003830 01fd movw zl, XL +003831 0fee +003832 1fff +003833 91a5 +003834 91b5 readflashcell XL,XH +003835 cfcf 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: +003836 3837 .dw PFA_DOCONDBRANCH + PFA_DOCONDBRANCH: +003837 2b98 or tosh, tosl +003838 9189 +003839 9199 loadtos +00383a f3a9 brbs 1, PFA_DOBRANCH ; 1 is z flag; if tos is zero (false), do the branch +00383b 9611 adiw XL, 1 +00383c cfc8 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: +00383d 383e .dw PFA_DOLITERAL + PFA_DOLITERAL: +00383e 939a +00383f 938a savetos +003840 01fd movw zl, xl +003841 0fee +003842 1fff +003843 9185 +003844 9195 readflashcell tosl,tosh +003845 9611 adiw xl, 1 +003846 cfbe 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: +003847 3848 .dw PFA_DOVARIABLE + PFA_DOVARIABLE: +003848 939a +003849 938a savetos +00384a 01fb movw zl, wl +00384b 9631 adiw zl,1 +00384c 0fee +00384d 1fff +00384e 9185 +00384f 9195 readflashcell tosl,tosh +003850 cfb4 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: +003851 3852 .dw PFA_DOCONSTANT + PFA_DOCONSTANT: +003852 939a +003853 938a savetos +003854 01cb movw tosl, wl +003855 9601 adiw tosl, 1 +003856 cfae 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: +003857 3858 .dw PFA_DOUSER + PFA_DOUSER: +003858 939a +003859 938a savetos +00385a 01fb movw zl, wl +00385b 9631 adiw zl, 1 +00385c 0fee +00385d 1fff +00385e 9185 +00385f 9195 readflashcell tosl,tosh +003860 0d84 add tosl, upl +003861 1d95 adc tosh, uph +003862 cfa2 jmp_ DO_NEXT + .include "words/do-value.asm" + + ; System + ; runtime of value + VE_DOVALUE: +003863 ff07 .dw $ff07 +003864 7628 +003865 6c61 +003866 6575 +003867 0029 .db "(value)", 0 +003868 3824 .dw VE_HEAD + .set VE_HEAD = VE_DOVALUE + XT_DOVALUE: +003869 3801 .dw DO_COLON + PFA_DOVALUE: +00386a 0739 .dw XT_DOCREATE +00386b 0899 .dw XT_REVEAL +00386c 075c .dw XT_COMPILE +00386d 386f .dw PFA_DOVALUE1 +00386e 3820 .dw XT_EXIT + PFA_DOVALUE1: +00386f 940e 08b2 call_ DO_DODOES +003871 38b1 .dw XT_DUP +003872 01d1 .dw XT_ICELLPLUS +003873 3bcb .dw XT_FETCHI +003874 382a .dw XT_EXECUTE +003875 3820 .dw XT_EXIT + + ; : (value) dup icell+ @i execute ; + .include "words/fetch.asm" + + ; Memory + ; read 1 cell from RAM address + VE_FETCH: +003876 ff01 .dw $ff01 +003877 0040 .db "@",0 +003878 3863 .dw VE_HEAD + .set VE_HEAD = VE_FETCH + XT_FETCH: +003879 387a .dw PFA_FETCH + PFA_FETCH: + .if WANT_UNIFIED == 1 + .endif + PFA_FETCHRAM: +00387a 01fc movw zl, tosl + ; low byte is read before the high byte +00387b 9181 ld tosl, z+ +00387c 9191 ld tosh, z+ +00387d cf87 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: +00387e ff01 .dw $ff01 +00387f 0021 .db "!",0 +003880 3876 .dw VE_HEAD + .set VE_HEAD = VE_STORE + XT_STORE: +003881 3882 .dw PFA_STORE + PFA_STORE: + .if WANT_UNIFIED == 1 + .endif + PFA_STORERAM: +003882 01fc movw zl, tosl +003883 9189 +003884 9199 loadtos + ; the high byte is written before the low byte +003885 8391 std Z+1, tosh +003886 8380 std Z+0, tosl +003887 9189 +003888 9199 loadtos +003889 cf7b jmp_ DO_NEXT + .if WANT_UNIFIED == 1 + .endif + .include "words/cstore.asm" + + ; Memory + ; store a single byte to RAM address + VE_CSTORE: +00388a ff02 .dw $ff02 +00388b 2163 .db "c!" +00388c 387e .dw VE_HEAD + .set VE_HEAD = VE_CSTORE + XT_CSTORE: +00388d 388e .dw PFA_CSTORE + PFA_CSTORE: +00388e 01fc movw zl, tosl +00388f 9189 +003890 9199 loadtos +003891 8380 st Z, tosl +003892 9189 +003893 9199 loadtos +003894 cf70 jmp_ DO_NEXT + .include "words/cfetch.asm" + + ; Memory + ; fetch a single byte from memory mapped locations + VE_CFETCH: +003895 ff02 .dw $ff02 +003896 4063 .db "c@" +003897 388a .dw VE_HEAD + .set VE_HEAD = VE_CFETCH + XT_CFETCH: +003898 3899 .dw PFA_CFETCH + PFA_CFETCH: +003899 01fc movw zl, tosl +00389a 2799 clr tosh +00389b 8180 ld tosl, Z +00389c cf68 jmp_ DO_NEXT + .include "words/fetch-u.asm" + + ; Memory + ; read 1 cell from USER area + VE_FETCHU: +00389d ff02 .dw $ff02 +00389e 7540 .db "@u" +00389f 3895 .dw VE_HEAD + .set VE_HEAD = VE_FETCHU + XT_FETCHU: +0038a0 3801 .dw DO_COLON + PFA_FETCHU: +0038a1 3b02 .dw XT_UP_FETCH +0038a2 399d .dw XT_PLUS +0038a3 3879 .dw XT_FETCH +0038a4 3820 .dw XT_EXIT + .include "words/store-u.asm" + + ; Memory + ; write n to USER area at offset + VE_STOREU: +0038a5 ff02 .dw $ff02 +0038a6 7521 .db "!u" +0038a7 389d .dw VE_HEAD + .set VE_HEAD = VE_STOREU + XT_STOREU: +0038a8 3801 .dw DO_COLON + PFA_STOREU: +0038a9 3b02 .dw XT_UP_FETCH +0038aa 399d .dw XT_PLUS +0038ab 3881 .dw XT_STORE +0038ac 3820 .dw XT_EXIT + + ;;;;;;;;;;;;;;;;;;;;;;;;; + .include "words/dup.asm" + + ; Stack + ; duplicate TOS + VE_DUP: +0038ad ff03 .dw $ff03 +0038ae 7564 +0038af 0070 .db "dup",0 +0038b0 38a5 .dw VE_HEAD + .set VE_HEAD = VE_DUP + XT_DUP: +0038b1 38b2 .dw PFA_DUP + PFA_DUP: +0038b2 939a +0038b3 938a savetos +0038b4 cf50 jmp_ DO_NEXT + .include "words/qdup.asm" + + ; Stack + ; duplicate TOS if non-zero + VE_QDUP: +0038b5 ff04 .dw $ff04 +0038b6 643f +0038b7 7075 .db "?dup" +0038b8 38ad .dw VE_HEAD + .set VE_HEAD = VE_QDUP + XT_QDUP: +0038b9 38ba .dw PFA_QDUP + PFA_QDUP: +0038ba 2f08 mov temp0, tosl +0038bb 2b09 or temp0, tosh +0038bc f011 breq PFA_QDUP1 +0038bd 939a +0038be 938a savetos + PFA_QDUP1: +0038bf cf45 jmp_ DO_NEXT + .include "words/swap.asm" + + ; Stack + ; swaps the two top level stack cells + VE_SWAP: +0038c0 ff04 .dw $ff04 +0038c1 7773 +0038c2 7061 .db "swap" +0038c3 38b5 .dw VE_HEAD + .set VE_HEAD = VE_SWAP + XT_SWAP: +0038c4 38c5 .dw PFA_SWAP + PFA_SWAP: +0038c5 018c movw temp0, tosl +0038c6 9189 +0038c7 9199 loadtos +0038c8 931a st -Y, temp1 +0038c9 930a st -Y, temp0 +0038ca cf3a jmp_ DO_NEXT + .include "words/over.asm" + + ; Stack + ; Place a copy of x1 on top of the stack + VE_OVER: +0038cb ff04 .dw $ff04 +0038cc 766f +0038cd 7265 .db "over" +0038ce 38c0 .dw VE_HEAD + .set VE_HEAD = VE_OVER + XT_OVER: +0038cf 38d0 .dw PFA_OVER + PFA_OVER: +0038d0 939a +0038d1 938a savetos +0038d2 818a ldd tosl, Y+2 +0038d3 819b ldd tosh, Y+3 + +0038d4 cf30 jmp_ DO_NEXT + .include "words/drop.asm" + + ; Stack + ; drop TOS + VE_DROP: +0038d5 ff04 .dw $ff04 +0038d6 7264 +0038d7 706f .db "drop" +0038d8 38cb .dw VE_HEAD + .set VE_HEAD = VE_DROP + XT_DROP: +0038d9 38da .dw PFA_DROP + PFA_DROP: +0038da 9189 +0038db 9199 loadtos +0038dc cf28 jmp_ DO_NEXT + .include "words/rot.asm" + + ; Stack + ; rotate the three top level cells + VE_ROT: +0038dd ff03 .dw $ff03 +0038de 6f72 +0038df 0074 .db "rot",0 +0038e0 38d5 .dw VE_HEAD + .set VE_HEAD = VE_ROT + XT_ROT: +0038e1 38e2 .dw PFA_ROT + PFA_ROT: +0038e2 018c movw temp0, tosl +0038e3 9129 ld temp2, Y+ +0038e4 9139 ld temp3, Y+ +0038e5 9189 +0038e6 9199 loadtos + +0038e7 933a st -Y, temp3 +0038e8 932a st -Y, temp2 +0038e9 931a st -Y, temp1 +0038ea 930a st -Y, temp0 + +0038eb cf19 jmp_ DO_NEXT + .include "words/nip.asm" + + ; Stack + ; Remove Second of Stack + VE_NIP: +0038ec ff03 .dw $ff03 +0038ed 696e +0038ee 0070 .db "nip",0 +0038ef 38dd .dw VE_HEAD + .set VE_HEAD = VE_NIP + XT_NIP: +0038f0 38f1 .dw PFA_NIP + PFA_NIP: +0038f1 9622 adiw yl, 2 +0038f2 cf12 jmp_ DO_NEXT + ;;;;;;;;;;;;;;;;;;;;;;;;; + .include "words/r_from.asm" + + ; Stack + ; move TOR to TOS + VE_R_FROM: +0038f3 ff02 .dw $ff02 +0038f4 3e72 .db "r>" +0038f5 38ec .dw VE_HEAD + .set VE_HEAD = VE_R_FROM + XT_R_FROM: +0038f6 38f7 .dw PFA_R_FROM + PFA_R_FROM: +0038f7 939a +0038f8 938a savetos +0038f9 918f pop tosl +0038fa 919f pop tosh +0038fb cf09 jmp_ DO_NEXT + .include "words/to_r.asm" + + ; Stack + ; move TOS to TOR + VE_TO_R: +0038fc ff02 .dw $ff02 +0038fd 723e .db ">r" +0038fe 38f3 .dw VE_HEAD + .set VE_HEAD = VE_TO_R + XT_TO_R: +0038ff 3900 .dw PFA_TO_R + PFA_TO_R: +003900 939f push tosh +003901 938f push tosl +003902 9189 +003903 9199 loadtos +003904 cf00 jmp_ DO_NEXT + .include "words/r_fetch.asm" + + ; Stack + ; fetch content of TOR + VE_R_FETCH: +003905 ff02 .dw $ff02 +003906 4072 .db "r@" +003907 38fc .dw VE_HEAD + .set VE_HEAD = VE_R_FETCH + XT_R_FETCH: +003908 3909 .dw PFA_R_FETCH + PFA_R_FETCH: +003909 939a +00390a 938a savetos +00390b 918f pop tosl +00390c 919f pop tosh +00390d 939f push tosh +00390e 938f push tosl +00390f cef5 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: +003910 ff02 .dw $ff02 +003911 3e3c .db "<>" +003912 3905 .dw VE_HEAD + .set VE_HEAD = VE_NOTEQUAL + XT_NOTEQUAL: +003913 3801 .dw DO_COLON + PFA_NOTEQUAL: + .endif + +003914 3fdf +003915 391a +003916 3820 .DW XT_EQUAL,XT_ZEROEQUAL,XT_EXIT + .include "words/equalzero.asm" + + ; Compare + ; compare with 0 (zero) + VE_ZEROEQUAL: +003917 ff02 .dw $ff02 +003918 3d30 .db "0=" +003919 3910 .dw VE_HEAD + .set VE_HEAD = VE_ZEROEQUAL + XT_ZEROEQUAL: +00391a 391b .dw PFA_ZEROEQUAL + PFA_ZEROEQUAL: +00391b 2b98 or tosh, tosl +00391c f5d1 brne PFA_ZERO1 +00391d c030 rjmp PFA_TRUE1 + .include "words/lesszero.asm" + + ; Compare + ; compare with zero + VE_ZEROLESS: +00391e ff02 .dw $ff02 +00391f 3c30 .db "0<" +003920 3917 .dw VE_HEAD + .set VE_HEAD = VE_ZEROLESS + XT_ZEROLESS: +003921 3922 .dw PFA_ZEROLESS + PFA_ZEROLESS: +003922 fd97 sbrc tosh,7 +003923 c02a rjmp PFA_TRUE1 +003924 c032 rjmp PFA_ZERO1 + .include "words/greaterzero.asm" + + ; Compare + ; true if n1 is greater than 0 + VE_GREATERZERO: +003925 ff02 .dw $ff02 +003926 3e30 .db "0>" +003927 391e .dw VE_HEAD + .set VE_HEAD = VE_GREATERZERO + XT_GREATERZERO: +003928 3929 .dw PFA_GREATERZERO + PFA_GREATERZERO: +003929 1582 cp tosl, zerol +00392a 0593 cpc tosh, zeroh +00392b f15c brlt PFA_ZERO1 +00392c f151 brbs 1, PFA_ZERO1 +00392d c020 rjmp PFA_TRUE1 + .include "words/d-greaterzero.asm" + + ; Compare + ; compares if a double double cell number is greater 0 + VE_DGREATERZERO: +00392e ff03 .dw $ff03 +00392f 3064 +003930 003e .db "d0>",0 +003931 3925 .dw VE_HEAD + .set VE_HEAD = VE_DGREATERZERO + XT_DGREATERZERO: +003932 3933 .dw PFA_DGREATERZERO + PFA_DGREATERZERO: +003933 1582 cp tosl, zerol +003934 0593 cpc tosh, zeroh +003935 9189 +003936 9199 loadtos +003937 0582 cpc tosl, zerol +003938 0593 cpc tosh, zeroh +003939 f0ec brlt PFA_ZERO1 +00393a f0e1 brbs 1, PFA_ZERO1 +00393b c012 rjmp PFA_TRUE1 + .include "words/d-lesszero.asm" + + ; Compare + ; compares if a double double cell number is less than 0 + VE_DXT_ZEROLESS: +00393c ff03 .dw $ff03 +00393d 3064 +00393e 003c .db "d0<",0 +00393f 392e .dw VE_HEAD + .set VE_HEAD = VE_DXT_ZEROLESS + XT_DXT_ZEROLESS: +003940 3941 .dw PFA_DXT_ZEROLESS + PFA_DXT_ZEROLESS: +003941 9622 adiw Y,2 +003942 fd97 sbrc tosh,7 +003943 940c 394e jmp PFA_TRUE1 +003945 940c 3957 jmp PFA_ZERO1 + + .include "words/true.asm" + + ; Arithmetics + ; leaves the value -1 (true) on TOS + VE_TRUE: +003947 ff04 .dw $ff04 +003948 7274 +003949 6575 .db "true" +00394a 393c .dw VE_HEAD + .set VE_HEAD = VE_TRUE + XT_TRUE: +00394b 394c .dw PFA_TRUE + PFA_TRUE: +00394c 939a +00394d 938a savetos + PFA_TRUE1: +00394e ef8f ser tosl +00394f ef9f ser tosh +003950 ceb4 jmp_ DO_NEXT + .include "words/zero.asm" + + ; Arithmetics + ; place a value 0 on TOS + VE_ZERO: +003951 ff01 .dw $ff01 +003952 0030 .db "0",0 +003953 3947 .dw VE_HEAD + .set VE_HEAD = VE_ZERO + XT_ZERO: +003954 3955 .dw PFA_ZERO + PFA_ZERO: +003955 939a +003956 938a savetos + PFA_ZERO1: +003957 01c1 movw tosl, zerol +003958 ceac jmp_ DO_NEXT + .include "words/uless.asm" + + ; Compare + ; true if u1 < u2 (unsigned) + VE_ULESS: +003959 ff02 .dw $ff02 +00395a 3c75 .db "u<" +00395b 3951 .dw VE_HEAD + .set VE_HEAD = VE_ULESS + XT_ULESS: +00395c 395d .dw PFA_ULESS + PFA_ULESS: +00395d 9129 ld temp2, Y+ +00395e 9139 ld temp3, Y+ +00395f 1782 cp tosl, temp2 +003960 0793 cpc tosh, temp3 +003961 f3a8 brlo PFA_ZERO1 +003962 f3a1 brbs 1, PFA_ZERO1 +003963 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: +003964 ff02 .dw $ff02 +003965 3e75 .db "u>" +003966 3959 .dw VE_HEAD + .set VE_HEAD = VE_UGREATER + XT_UGREATER: +003967 3801 .dw DO_COLON + PFA_UGREATER: + .endif +003968 38c4 .DW XT_SWAP +003969 395c .dw XT_ULESS +00396a 3820 .dw XT_EXIT + .include "words/less.asm" + + ; Compare + ; true if n1 is less than n2 + VE_LESS: +00396b ff01 .dw $ff01 +00396c 003c .db "<",0 +00396d 3964 .dw VE_HEAD + .set VE_HEAD = VE_LESS + XT_LESS: +00396e 396f .dw PFA_LESS + PFA_LESS: +00396f 9129 ld temp2, Y+ +003970 9139 ld temp3, Y+ +003971 1728 cp temp2, tosl +003972 0739 cpc temp3, tosh + PFA_LESSDONE: +003973 f71c brge PFA_ZERO1 +003974 cfd9 rjmp PFA_TRUE1 + .include "words/greater.asm" + + ; Compare + ; flag is true if n1 is greater than n2 + VE_GREATER: +003975 ff01 .dw $ff01 +003976 003e .db ">",0 +003977 396b .dw VE_HEAD + .set VE_HEAD = VE_GREATER + XT_GREATER: +003978 3979 .dw PFA_GREATER + PFA_GREATER: +003979 9129 ld temp2, Y+ +00397a 9139 ld temp3, Y+ +00397b 1728 cp temp2, tosl +00397c 0739 cpc temp3, tosh + PFA_GREATERDONE: +00397d f2cc brlt PFA_ZERO1 +00397e f2c1 brbs 1, PFA_ZERO1 +00397f cfce rjmp PFA_TRUE1 + + .include "words/log2.asm" + + ; Arithmetics + ; logarithm to base 2 or highest set bitnumber + VE_LOG2: +003980 ff04 .dw $ff04 +003981 6f6c +003982 3267 .db "log2" +003983 3975 .dw VE_HEAD + .set VE_HEAD = VE_LOG2 + XT_LOG2: +003984 3985 .dw PFA_LOG2 + PFA_LOG2: +003985 01fc movw zl, tosl +003986 2799 clr tosh +003987 e180 ldi tosl, 16 + PFA_LOG2_1: +003988 958a dec tosl +003989 f022 brmi PFA_LOG2_2 ; wrong data +00398a 0fee lsl zl +00398b 1fff rol zh +00398c f7d8 brcc PFA_LOG2_1 +00398d ce77 jmp_ DO_NEXT + + PFA_LOG2_2: +00398e 959a dec tosh +00398f ce75 jmp_ DO_NEXT + .include "words/minus.asm" + + ; Arithmetics + ; subtract n2 from n1 + VE_MINUS: +003990 ff01 .dw $ff01 +003991 002d .db "-",0 +003992 3980 .dw VE_HEAD + .set VE_HEAD = VE_MINUS + XT_MINUS: +003993 3994 .dw PFA_MINUS + PFA_MINUS: +003994 9109 ld temp0, Y+ +003995 9119 ld temp1, Y+ +003996 1b08 sub temp0, tosl +003997 0b19 sbc temp1, tosh +003998 01c8 movw tosl, temp0 +003999 ce6b jmp_ DO_NEXT + .include "words/plus.asm" + + ; Arithmetics + ; add n1 and n2 + VE_PLUS: +00399a ff01 .dw $ff01 +00399b 002b .db "+",0 +00399c 3990 .dw VE_HEAD + .set VE_HEAD = VE_PLUS + XT_PLUS: +00399d 399e .dw PFA_PLUS + PFA_PLUS: +00399e 9109 ld temp0, Y+ +00399f 9119 ld temp1, Y+ +0039a0 0f80 add tosl, temp0 +0039a1 1f91 adc tosh, temp1 +0039a2 ce62 jmp_ DO_NEXT + .include "words/mstar.asm" + + ; Arithmetics + ; multiply 2 cells to a double cell + VE_MSTAR: +0039a3 ff02 .dw $ff02 +0039a4 2a6d .db "m*" +0039a5 399a .dw VE_HEAD + .set VE_HEAD = VE_MSTAR + XT_MSTAR: +0039a6 39a7 .dw PFA_MSTAR + PFA_MSTAR: +0039a7 018c movw temp0, tosl +0039a8 9189 +0039a9 9199 loadtos +0039aa 019c movw temp2, tosl + ; high cell ah*bh +0039ab 0231 muls temp3, temp1 +0039ac 0170 movw temp4, r0 + ; low cell al*bl +0039ad 9f20 mul temp2, temp0 +0039ae 01c0 movw tosl, r0 + ; signed ah*bl +0039af 0330 mulsu temp3, temp0 +0039b0 08f3 sbc temp5, zeroh +0039b1 0d90 add tosh, r0 +0039b2 1ce1 adc temp4, r1 +0039b3 1cf3 adc temp5, zeroh + + ; signed al*bh +0039b4 0312 mulsu temp1, temp2 +0039b5 08f3 sbc temp5, zeroh +0039b6 0d90 add tosh, r0 +0039b7 1ce1 adc temp4, r1 +0039b8 1cf3 adc temp5, zeroh + +0039b9 939a +0039ba 938a savetos +0039bb 01c7 movw tosl, temp4 +0039bc ce48 jmp_ DO_NEXT + .include "words/umslashmod.asm" + + ; Arithmetics + ; unsigned division ud / u2 with remainder + VE_UMSLASHMOD: +0039bd ff06 .dw $ff06 +0039be 6d75 +0039bf 6d2f +0039c0 646f .db "um/mod" +0039c1 39a3 .dw VE_HEAD + .set VE_HEAD = VE_UMSLASHMOD + XT_UMSLASHMOD: +0039c2 39c3 .dw PFA_UMSLASHMOD + PFA_UMSLASHMOD: +0039c3 017c movw temp4, tosl + +0039c4 9129 ld temp2, Y+ +0039c5 9139 ld temp3, Y+ + +0039c6 9109 ld temp0, Y+ +0039c7 9119 ld temp1, Y+ + + ;; unsigned 32/16 -> 16r16 divide + + PFA_UMSLASHMODmod: + + ; set loop counter +0039c8 e140 ldi temp6,$10 + + PFA_UMSLASHMODmod_loop: + ; shift left, saving high bit +0039c9 2755 clr temp7 +0039ca 0f00 lsl temp0 +0039cb 1f11 rol temp1 +0039cc 1f22 rol temp2 +0039cd 1f33 rol temp3 +0039ce 1f55 rol temp7 + + ; try subtracting divisor +0039cf 152e cp temp2, temp4 +0039d0 053f cpc temp3, temp5 +0039d1 0552 cpc temp7,zerol + +0039d2 f018 brcs PFA_UMSLASHMODmod_loop_control + + PFA_UMSLASHMODmod_subtract: + ; dividend is large enough + ; do the subtraction for real + ; and set lowest bit +0039d3 9503 inc temp0 +0039d4 192e sub temp2, temp4 +0039d5 093f sbc temp3, temp5 + + PFA_UMSLASHMODmod_loop_control: +0039d6 954a dec temp6 +0039d7 f789 brne PFA_UMSLASHMODmod_loop + + PFA_UMSLASHMODmod_done: + ; put remainder on stack +0039d8 933a st -Y,temp3 +0039d9 932a st -Y,temp2 + + ; put quotient on stack +0039da 01c8 movw tosl, temp0 +0039db ce29 jmp_ DO_NEXT + .include "words/umstar.asm" + + ; Arithmetics + ; multiply 2 unsigned cells to a double cell + VE_UMSTAR: +0039dc ff03 .dw $ff03 +0039dd 6d75 +0039de 002a .db "um*",0 +0039df 39bd .dw VE_HEAD + .set VE_HEAD = VE_UMSTAR + XT_UMSTAR: +0039e0 39e1 .dw PFA_UMSTAR + PFA_UMSTAR: +0039e1 018c movw temp0, tosl +0039e2 9189 +0039e3 9199 loadtos + ; result: (temp3*temp1)* 65536 + (temp3*temp0 + temp1*temp2) * 256 + (temp0 * temp2) + ; low bytes +0039e4 9f80 mul tosl,temp0 +0039e5 01f0 movw zl, r0 +0039e6 2722 clr temp2 +0039e7 2733 clr temp3 + ; middle bytes +0039e8 9f90 mul tosh, temp0 +0039e9 0df0 add zh, r0 +0039ea 1d21 adc temp2, r1 +0039eb 1d33 adc temp3, zeroh + +0039ec 9f81 mul tosl, temp1 +0039ed 0df0 add zh, r0 +0039ee 1d21 adc temp2, r1 +0039ef 1d33 adc temp3, zeroh + +0039f0 9f91 mul tosh, temp1 +0039f1 0d20 add temp2, r0 +0039f2 1d31 adc temp3, r1 +0039f3 01cf movw tosl, zl +0039f4 939a +0039f5 938a savetos +0039f6 01c9 movw tosl, temp2 +0039f7 ce0d jmp_ DO_NEXT + + .include "words/invert.asm" + + ; Arithmetics + ; 1-complement of TOS + VE_INVERT: +0039f8 ff06 .dw $ff06 +0039f9 6e69 +0039fa 6576 +0039fb 7472 .db "invert" +0039fc 39dc .dw VE_HEAD + .set VE_HEAD = VE_INVERT + XT_INVERT: +0039fd 39fe .dw PFA_INVERT + PFA_INVERT: +0039fe 9580 com tosl +0039ff 9590 com tosh +003a00 ce04 jmp_ DO_NEXT + .include "words/2slash.asm" + + ; Arithmetics + ; arithmetic shift right + VE_2SLASH: +003a01 ff02 .dw $ff02 +003a02 2f32 .db "2/" +003a03 39f8 .dw VE_HEAD + .set VE_HEAD = VE_2SLASH + XT_2SLASH: +003a04 3a05 .dw PFA_2SLASH + PFA_2SLASH: +003a05 9595 asr tosh +003a06 9587 ror tosl +003a07 cdfd jmp_ DO_NEXT + .include "words/2star.asm" + + ; Arithmetics + ; arithmetic shift left, filling with zero + VE_2STAR: +003a08 ff02 .dw $ff02 +003a09 2a32 .db "2*" +003a0a 3a01 .dw VE_HEAD + .set VE_HEAD = VE_2STAR + XT_2STAR: +003a0b 3a0c .dw PFA_2STAR + PFA_2STAR: +003a0c 0f88 lsl tosl +003a0d 1f99 rol tosh +003a0e cdf6 jmp_ DO_NEXT + .include "words/and.asm" + + ; Logic + ; bitwise and + VE_AND: +003a0f ff03 .dw $ff03 +003a10 6e61 +003a11 0064 .db "and",0 +003a12 3a08 .dw VE_HEAD + .set VE_HEAD = VE_AND + XT_AND: +003a13 3a14 .dw PFA_AND + PFA_AND: +003a14 9109 ld temp0, Y+ +003a15 9119 ld temp1, Y+ +003a16 2380 and tosl, temp0 +003a17 2391 and tosh, temp1 +003a18 cdec jmp_ DO_NEXT + .include "words/or.asm" + + ; Logic + ; logical or + VE_OR: +003a19 ff02 .dw $ff02 +003a1a 726f .db "or" +003a1b 3a0f .dw VE_HEAD + .set VE_HEAD = VE_OR + XT_OR: +003a1c 3a1d .dw PFA_OR + PFA_OR: +003a1d 9109 ld temp0, Y+ +003a1e 9119 ld temp1, Y+ +003a1f 2b80 or tosl, temp0 +003a20 2b91 or tosh, temp1 +003a21 cde3 jmp_ DO_NEXT + + .include "words/xor.asm" + + ; Logic + ; exclusive or + VE_XOR: +003a22 ff03 .dw $ff03 +003a23 6f78 +003a24 0072 .db "xor",0 +003a25 3a19 .dw VE_HEAD + .set VE_HEAD = VE_XOR + XT_XOR: +003a26 3a27 .dw PFA_XOR + PFA_XOR: +003a27 9109 ld temp0, Y+ +003a28 9119 ld temp1, Y+ +003a29 2780 eor tosl, temp0 +003a2a 2791 eor tosh, temp1 +003a2b cdd9 jmp_ DO_NEXT + + .include "words/1plus.asm" + + ; Arithmetics + ; optimized increment + VE_1PLUS: +003a2c ff02 .dw $ff02 +003a2d 2b31 .db "1+" +003a2e 3a22 .dw VE_HEAD + .set VE_HEAD = VE_1PLUS + XT_1PLUS: +003a2f 3a30 .dw PFA_1PLUS + PFA_1PLUS: +003a30 9601 adiw tosl,1 +003a31 cdd3 jmp_ DO_NEXT + .include "words/1minus.asm" + + ; Arithmetics + ; optimized decrement + VE_1MINUS: +003a32 ff02 .dw $ff02 +003a33 2d31 .db "1-" +003a34 3a2c .dw VE_HEAD + .set VE_HEAD = VE_1MINUS + XT_1MINUS: +003a35 3a36 .dw PFA_1MINUS + PFA_1MINUS: +003a36 9701 sbiw tosl, 1 +003a37 cdcd 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: +003a38 ff07 .dw $ff07 +003a39 6e3f +003a3a 6765 +003a3b 7461 +../../common\words/q-negate.asm(11): warning: .cseg .db misalignment - padding zero byte +003a3c 0065 .db "?negate" +003a3d 3a32 .dw VE_HEAD + .set VE_HEAD = VE_QNEGATE + XT_QNEGATE: +003a3e 3801 .dw DO_COLON + PFA_QNEGATE: + + .endif +003a3f 3921 +003a40 3836 .DW XT_ZEROLESS,XT_DOCONDBRANCH +003a41 3a43 DEST(QNEG1) +003a42 3e27 .DW XT_NEGATE +003a43 3820 QNEG1: .DW XT_EXIT + .include "words/lshift.asm" + + ; Arithmetics + ; logically shift n1 left n2 times + VE_LSHIFT: +003a44 ff06 .dw $ff06 +003a45 736c +003a46 6968 +003a47 7466 .db "lshift" +003a48 3a38 .dw VE_HEAD + .set VE_HEAD = VE_LSHIFT + XT_LSHIFT: +003a49 3a4a .dw PFA_LSHIFT + PFA_LSHIFT: +003a4a 01fc movw zl, tosl +003a4b 9189 +003a4c 9199 loadtos + PFA_LSHIFT1: +003a4d 9731 sbiw zl, 1 +003a4e f01a brmi PFA_LSHIFT2 +003a4f 0f88 lsl tosl +003a50 1f99 rol tosh +003a51 cffb rjmp PFA_LSHIFT1 + PFA_LSHIFT2: +003a52 cdb2 jmp_ DO_NEXT + + .include "words/rshift.asm" + + ; Arithmetics + ; shift n1 n2-times logically right + VE_RSHIFT: +003a53 ff06 .dw $ff06 +003a54 7372 +003a55 6968 +003a56 7466 .db "rshift" +003a57 3a44 .dw VE_HEAD + .set VE_HEAD = VE_RSHIFT + XT_RSHIFT: +003a58 3a59 .dw PFA_RSHIFT + PFA_RSHIFT: +003a59 01fc movw zl, tosl +003a5a 9189 +003a5b 9199 loadtos + PFA_RSHIFT1: +003a5c 9731 sbiw zl, 1 +003a5d f01a brmi PFA_RSHIFT2 +003a5e 9596 lsr tosh +003a5f 9587 ror tosl +003a60 cffb rjmp PFA_RSHIFT1 + PFA_RSHIFT2: +003a61 cda3 jmp_ DO_NEXT + + .include "words/plusstore.asm" + + ; Arithmetics + ; add n to content of RAM address a-addr + VE_PLUSSTORE: +003a62 ff02 .dw $ff02 +003a63 212b .db "+!" +003a64 3a53 .dw VE_HEAD + .set VE_HEAD = VE_PLUSSTORE + XT_PLUSSTORE: +003a65 3a66 .dw PFA_PLUSSTORE + PFA_PLUSSTORE: +003a66 01fc movw zl, tosl +003a67 9189 +003a68 9199 loadtos +003a69 8120 ldd temp2, Z+0 +003a6a 8131 ldd temp3, Z+1 +003a6b 0f82 add tosl, temp2 +003a6c 1f93 adc tosh, temp3 +003a6d 8380 std Z+0, tosl +003a6e 8391 std Z+1, tosh +003a6f 9189 +003a70 9199 loadtos +003a71 cd93 jmp_ DO_NEXT + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + .include "words/rpfetch.asm" + + ; Stack + ; current return stack pointer address + VE_RP_FETCH: +003a72 ff03 .dw $ff03 +003a73 7072 +003a74 0040 .db "rp@",0 +003a75 3a62 .dw VE_HEAD + .set VE_HEAD = VE_RP_FETCH + XT_RP_FETCH: +003a76 3a77 .dw PFA_RP_FETCH + PFA_RP_FETCH: +003a77 939a +003a78 938a savetos +003a79 b78d in tosl, SPL +003a7a b79e in tosh, SPH +003a7b cd89 jmp_ DO_NEXT + .include "words/rpstore.asm" + + ; Stack + ; set return stack pointer + VE_RP_STORE: +003a7c ff03 .dw $ff03 +003a7d 7072 +003a7e 0021 .db "rp!",0 +003a7f 3a72 .dw VE_HEAD + .set VE_HEAD = VE_RP_STORE + XT_RP_STORE: +003a80 3a81 .dw PFA_RP_STORE + PFA_RP_STORE: +003a81 b72f in temp2, SREG +003a82 94f8 cli +003a83 bf8d out SPL, tosl +003a84 bf9e out SPH, tosh +003a85 bf2f out SREG, temp2 +003a86 9189 +003a87 9199 loadtos +003a88 cd7c jmp_ DO_NEXT + .include "words/spfetch.asm" + + ; Stack + ; current data stack pointer + VE_SP_FETCH: +003a89 ff03 .dw $ff03 +003a8a 7073 +003a8b 0040 .db "sp@",0 +003a8c 3a7c .dw VE_HEAD + .set VE_HEAD = VE_SP_FETCH + XT_SP_FETCH: +003a8d 3a8e .dw PFA_SP_FETCH + PFA_SP_FETCH: +003a8e 939a +003a8f 938a savetos +003a90 01ce movw tosl, yl +003a91 cd73 jmp_ DO_NEXT + .include "words/spstore.asm" + + ; Stack + ; set data stack pointer to addr + VE_SP_STORE: +003a92 ff03 .dw $ff03 +003a93 7073 +003a94 0021 .db "sp!",0 +003a95 3a89 .dw VE_HEAD + .set VE_HEAD = VE_SP_STORE + XT_SP_STORE: +003a96 3a97 .dw PFA_SP_STORE + PFA_SP_STORE: +003a97 01ec movw yl, tosl +003a98 9189 +003a99 9199 loadtos +003a9a cd6a 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: +003a9b 3a9c .dw PFA_DODO + PFA_DODO: +003a9c 9129 ld temp2, Y+ +003a9d 9139 ld temp3, Y+ ; limit + PFA_DODO1: +003a9e e8e0 ldi zl, $80 +003a9f 0f3e add temp3, zl +003aa0 1b82 sub tosl, temp2 +003aa1 0b93 sbc tosh, temp3 + +003aa2 933f push temp3 +003aa3 932f push temp2 ; limit ( --> limit + $8000) +003aa4 939f push tosh +003aa5 938f push tosl ; start -> index ( --> index - (limit - $8000) +003aa6 9189 +003aa7 9199 loadtos +003aa8 cd5c jmp_ DO_NEXT + .include "words/i.asm" + + ; Compiler + ; current loop counter + VE_I: +003aa9 ff01 .dw $FF01 +003aaa 0069 .db "i",0 +003aab 3a92 .dw VE_HEAD + .set VE_HEAD = VE_I + XT_I: +003aac 3aad .dw PFA_I + PFA_I: +003aad 939a +003aae 938a savetos +003aaf 918f pop tosl +003ab0 919f pop tosh ; index +003ab1 91ef pop zl +003ab2 91ff pop zh ; limit +003ab3 93ff push zh +003ab4 93ef push zl +003ab5 939f push tosh +003ab6 938f push tosl +003ab7 0f8e add tosl, zl +003ab8 1f9f adc tosh, zh +003ab9 cd4b 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: +003aba 3abb .dw PFA_DOPLUSLOOP + PFA_DOPLUSLOOP: +003abb 91ef pop zl +003abc 91ff pop zh +003abd 0fe8 add zl, tosl +003abe 1ff9 adc zh, tosh +003abf 9189 +003ac0 9199 loadtos +003ac1 f01b brvs PFA_DOPLUSLOOP_LEAVE + ; next cycle + PFA_DOPLUSLOOP_NEXT: + ; next iteration +003ac2 93ff push zh +003ac3 93ef push zl +003ac4 cd6b rjmp PFA_DOBRANCH ; read next cell from dictionary and jump to its destination + PFA_DOPLUSLOOP_LEAVE: +003ac5 910f pop temp0 +003ac6 911f pop temp1 ; remove limit +003ac7 9611 adiw xl, 1 ; skip branch-back address +003ac8 cd3c 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: +003ac9 3aca .dw PFA_DOLOOP + PFA_DOLOOP: +003aca 91ef pop zl +003acb 91ff pop zh +003acc 9631 adiw zl,1 +003acd f3bb brvs PFA_DOPLUSLOOP_LEAVE +003ace cff3 jmp_ PFA_DOPLUSLOOP_NEXT + .include "words/unloop.asm" + + ; Compiler + ; remove loop-sys, exit the loop and continue execution after it + VE_UNLOOP: +003acf ff06 .dw $ff06 +003ad0 6e75 +003ad1 6f6c +003ad2 706f .db "unloop" +003ad3 3aa9 .dw VE_HEAD + .set VE_HEAD = VE_UNLOOP + XT_UNLOOP: +003ad4 3ad5 .dw PFA_UNLOOP + PFA_UNLOOP: +003ad5 911f pop temp1 +003ad6 910f pop temp0 +003ad7 911f pop temp1 +003ad8 910f pop temp0 +003ad9 cd2b jmp_ DO_NEXT + + ;;;;;;;;;;;;;;;;;;;;;;;;;;; + + .include "words/cmove_g.asm" + + ; Memory + ; copy data in RAM from higher to lower addresses. + VE_CMOVE_G: +003ada ff06 .dw $ff06 +003adb 6d63 +003adc 766f +003add 3e65 .db "cmove>" +003ade 3acf .dw VE_HEAD + .set VE_HEAD = VE_CMOVE_G + XT_CMOVE_G: +003adf 3ae0 .dw PFA_CMOVE_G + PFA_CMOVE_G: +003ae0 93bf push xh +003ae1 93af push xl +003ae2 91e9 ld zl, Y+ +003ae3 91f9 ld zh, Y+ ; addr-to +003ae4 91a9 ld xl, Y+ +003ae5 91b9 ld xh, Y+ ; addr-from +003ae6 2f09 mov temp0, tosh +003ae7 2b08 or temp0, tosl +003ae8 f041 brbs 1, PFA_CMOVE_G1 +003ae9 0fe8 add zl, tosl +003aea 1ff9 adc zh, tosh +003aeb 0fa8 add xl, tosl +003aec 1fb9 adc xh, tosh + PFA_CMOVE_G2: +003aed 911e ld temp1, -X +003aee 9312 st -Z, temp1 +003aef 9701 sbiw tosl, 1 +003af0 f7e1 brbc 1, PFA_CMOVE_G2 + PFA_CMOVE_G1: +003af1 91af pop xl +003af2 91bf pop xh +003af3 9189 +003af4 9199 loadtos +003af5 cd0f jmp_ DO_NEXT + .include "words/byteswap.asm" + + ; Arithmetics + ; exchange the bytes of the TOS + VE_BYTESWAP: +003af6 ff02 .dw $ff02 +003af7 3c3e .db "><" +003af8 3ada .dw VE_HEAD + .set VE_HEAD = VE_BYTESWAP + XT_BYTESWAP: +003af9 3afa .dw PFA_BYTESWAP + PFA_BYTESWAP: +003afa 2f09 mov temp0, tosh +003afb 2f98 mov tosh, tosl +003afc 2f80 mov tosl, temp0 +003afd cd07 jmp_ DO_NEXT + .include "words/up.asm" + + ; System Variable + ; get user area pointer + VE_UP_FETCH: +003afe ff03 .dw $ff03 +003aff 7075 +003b00 0040 .db "up@",0 +003b01 3af6 .dw VE_HEAD + .set VE_HEAD = VE_UP_FETCH + XT_UP_FETCH: +003b02 3b03 .dw PFA_UP_FETCH + PFA_UP_FETCH: +003b03 939a +003b04 938a savetos +003b05 01c2 movw tosl, upl +003b06 ccfe jmp_ DO_NEXT + + ; ( addr -- ) + ; System Variable + ; set user area pointer + VE_UP_STORE: +003b07 ff03 .dw $ff03 +003b08 7075 +003b09 0021 .db "up!",0 +003b0a 3afe .dw VE_HEAD + .set VE_HEAD = VE_UP_STORE + XT_UP_STORE: +003b0b 3b0c .dw PFA_UP_STORE + PFA_UP_STORE: +003b0c 012c movw upl, tosl +003b0d 9189 +003b0e 9199 loadtos +003b0f ccf5 jmp_ DO_NEXT + .include "words/1ms.asm" + + ; Time + ; busy waits (almost) exactly 1 millisecond + VE_1MS: +003b10 ff03 .dw $ff03 +003b11 6d31 +003b12 0073 .db "1ms",0 +003b13 3b07 .dw VE_HEAD + .set VE_HEAD = VE_1MS + XT_1MS: +003b14 3b15 .dw PFA_1MS + PFA_1MS: +003b15 eae0 +003b16 e0ff +003b17 9731 +003b18 f7f1 delay 1000 +003b19 cceb jmp_ DO_NEXT + .include "words/2to_r.asm" + + ; Stack + ; move DTOS to TOR + VE_2TO_R: +003b1a ff03 .dw $ff03 +003b1b 3e32 +003b1c 0072 .db "2>r",0 +003b1d 3b10 .dw VE_HEAD + .set VE_HEAD = VE_2TO_R + XT_2TO_R: +003b1e 3b1f .dw PFA_2TO_R + PFA_2TO_R: +003b1f 01fc movw zl, tosl +003b20 9189 +003b21 9199 loadtos +003b22 939f push tosh +003b23 938f push tosl +003b24 93ff push zh +003b25 93ef push zl +003b26 9189 +003b27 9199 loadtos +003b28 ccdc jmp_ DO_NEXT + .include "words/2r_from.asm" + + ; Stack + ; move DTOR to TOS + VE_2R_FROM: +003b29 ff03 .dw $ff03 +003b2a 7232 +003b2b 003e .db "2r>",0 +003b2c 3b1a .dw VE_HEAD + .set VE_HEAD = VE_2R_FROM + XT_2R_FROM: +003b2d 3b2e .dw PFA_2R_FROM + PFA_2R_FROM: +003b2e 939a +003b2f 938a savetos +003b30 91ef pop zl +003b31 91ff pop zh +003b32 918f pop tosl +003b33 919f pop tosh +003b34 939a +003b35 938a savetos +003b36 01cf movw tosl, zl +003b37 cccd jmp_ DO_NEXT + + .include "words/store-e.asm" + + ; Memory + ; write n (2bytes) to eeprom address + VE_STOREE: +003b38 ff02 .dw $ff02 +003b39 6521 .db "!e" +003b3a 3b29 .dw VE_HEAD + .set VE_HEAD = VE_STOREE + XT_STOREE: +003b3b 3b3c .dw PFA_STOREE + PFA_STOREE: + .if WANT_UNIFIED == 1 + .endif + PFA_STOREE0: +003b3c 01fc movw zl, tosl +003b3d 9189 +003b3e 9199 loadtos +003b3f b72f in_ temp2, SREG +003b40 94f8 cli +003b41 d028 rcall PFA_FETCHE2 +003b42 b500 in_ temp0, EEDR +003b43 1708 cp temp0,tosl +003b44 f009 breq PFA_STOREE3 +003b45 d00b rcall PFA_STOREE1 + PFA_STOREE3: +003b46 9631 adiw zl,1 +003b47 d022 rcall PFA_FETCHE2 +003b48 b500 in_ temp0, EEDR +003b49 1709 cp temp0,tosh +003b4a f011 breq PFA_STOREE4 +003b4b 2f89 mov tosl, tosh +003b4c d004 rcall PFA_STOREE1 + PFA_STOREE4: +003b4d bf2f out_ SREG, temp2 +003b4e 9189 +003b4f 9199 loadtos +003b50 ccb4 jmp_ DO_NEXT + + PFA_STOREE1: +003b51 99f9 sbic EECR, EEPE +003b52 cffe rjmp PFA_STOREE1 + + PFA_STOREE2: ; estore_wait_low_spm: +003b53 b707 in_ temp0, SPMCSR +003b54 fd00 sbrc temp0,SPMEN +003b55 cffd rjmp PFA_STOREE2 + +003b56 bdf2 out_ EEARH,zh +003b57 bde1 out_ EEARL,zl +003b58 bd80 out_ EEDR, tosl +003b59 9afa sbi EECR,EEMPE +003b5a 9af9 sbi EECR,EEPE + +003b5b 9508 ret + .if WANT_UNIFIED == 1 + .endif + .include "words/fetch-e.asm" + + ; Memory + ; read 1 cell from eeprom + VE_FETCHE: +003b5c ff02 .dw $ff02 +003b5d 6540 .db "@e" +003b5e 3b38 .dw VE_HEAD + .set VE_HEAD = VE_FETCHE + XT_FETCHE: +003b5f 3b60 .dw PFA_FETCHE + PFA_FETCHE: + .if WANT_UNIFIED == 1 + .endif + PFA_FETCHE1: +003b60 b72f in_ temp2, SREG +003b61 94f8 cli +003b62 01fc movw zl, tosl +003b63 d006 rcall PFA_FETCHE2 +003b64 b580 in_ tosl, EEDR + +003b65 9631 adiw zl,1 + +003b66 d003 rcall PFA_FETCHE2 +003b67 b590 in_ tosh, EEDR +003b68 bf2f out_ SREG, temp2 +003b69 cc9b jmp_ DO_NEXT + + PFA_FETCHE2: +003b6a 99f9 sbic EECR, EEPE +003b6b cffe rjmp PFA_FETCHE2 + +003b6c bdf2 out_ EEARH,zh +003b6d bde1 out_ EEARL,zl + +003b6e 9af8 sbi EECR,EERE +003b6f 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: +003b70 ff02 .dw $ff02 +003b71 6921 .db "!i" +003b72 3b5c .dw VE_HEAD + .set VE_HEAD = VE_STOREI + XT_STOREI: +003b73 3dff .dw PFA_DODEFER1 + PFA_STOREI: +003b74 0066 .dw EE_STOREI +003b75 3da0 .dw XT_EDEFERFETCH +003b76 3daa .dw XT_EDEFERSTORE + .if FLASHEND > $10000 + .else + .include "words/store-i_nrww.asm" + + ; Memory + ; writes n to flash memory using assembly code (code to be placed in boot loader section) + VE_DO_STOREI_NRWW: +003b77 ff09 .dw $ff09 +003b78 2128 +003b79 2d69 +003b7a 726e +003b7b 7777 +003b7c 0029 .db "(!i-nrww)",0 +003b7d 3b70 .dw VE_HEAD + .set VE_HEAD = VE_DO_STOREI_NRWW + XT_DO_STOREI: +003b7e 3b7f .dw PFA_DO_STOREI_NRWW + PFA_DO_STOREI_NRWW: + ; store status register +003b7f b71f in temp1,SREG +003b80 931f push temp1 +003b81 94f8 cli + +003b82 019c movw temp2, tosl ; save the (word) address +003b83 9189 +003b84 9199 loadtos ; get the new value for the flash cell +003b85 93af push xl +003b86 93bf push xh +003b87 93cf push yl +003b88 93df push yh +003b89 d009 rcall DO_STOREI_atmega +003b8a 91df pop yh +003b8b 91cf pop yl +003b8c 91bf pop xh +003b8d 91af pop xl + ; finally clear the stack +003b8e 9189 +003b8f 9199 loadtos +003b90 911f pop temp1 + ; restore status register (and interrupt enable flag) +003b91 bf1f out SREG,temp1 + +003b92 cc72 jmp_ DO_NEXT + + ; + DO_STOREI_atmega: + ; write data to temp page buffer + ; use the values in tosl/tosh at the + ; appropiate place +003b93 d010 rcall pageload + + ; erase page if needed + ; it is needed if a bit goes from 0 to 1 +003b94 94e0 com temp4 +003b95 94f0 com temp5 +003b96 218e and tosl, temp4 +003b97 219f and tosh, temp5 +003b98 2b98 or tosh, tosl +003b99 f019 breq DO_STOREI_writepage +003b9a 01f9 movw zl, temp2 +003b9b e002 ldi temp0,(1<8000 + .elif AMFORTH_NRWW_SIZE>4000 + .include "dict/core_4k.inc" + + ; in a short distance to DO_NEXT + .include "words/n_to_r.asm" + + ; Stack + ; move n items from data stack to return stack + VE_N_TO_R: +003bd2 ff03 .dw $ff03 +003bd3 3e6e +003bd4 0072 .db "n>r",0 +003bd5 3bc8 .dw VE_HEAD + .set VE_HEAD = VE_N_TO_R + XT_N_TO_R: +003bd6 3bd7 .dw PFA_N_TO_R + PFA_N_TO_R: +003bd7 01fc movw zl, tosl +003bd8 2f08 mov temp0, tosl + PFA_N_TO_R1: +003bd9 9189 +003bda 9199 loadtos +003bdb 939f push tosh +003bdc 938f push tosl +003bdd 950a dec temp0 +003bde f7d1 brne PFA_N_TO_R1 +003bdf 93ef push zl +003be0 93ff push zh +003be1 9189 +003be2 9199 loadtos +003be3 cc21 jmp_ DO_NEXT + .include "words/n_r_from.asm" + + ; Stack + ; move n items from return stack to data stack + VE_N_R_FROM: +003be4 ff03 .dw $ff03 +003be5 726e +003be6 003e .db "nr>",0 +003be7 3bd2 .dw VE_HEAD + .set VE_HEAD = VE_N_R_FROM + XT_N_R_FROM: +003be8 3be9 .dw PFA_N_R_FROM + PFA_N_R_FROM: +003be9 939a +003bea 938a savetos +003beb 91ff pop zh +003bec 91ef pop zl +003bed 2f0e mov temp0, zl + PFA_N_R_FROM1: +003bee 918f pop tosl +003bef 919f pop tosh +003bf0 939a +003bf1 938a savetos +003bf2 950a dec temp0 +003bf3 f7d1 brne PFA_N_R_FROM1 +003bf4 01cf movw tosl, zl +003bf5 cc0f jmp_ DO_NEXT + .include "words/d-2star.asm" + + ; Arithmetics + ; shift a double cell left + VE_D2STAR: +003bf6 ff03 .dw $ff03 +003bf7 3264 +003bf8 002a .db "d2*",0 +003bf9 3be4 .dw VE_HEAD + .set VE_HEAD = VE_D2STAR + XT_D2STAR: +003bfa 3bfb .dw PFA_D2STAR + PFA_D2STAR: +003bfb 9109 ld temp0, Y+ +003bfc 9119 ld temp1, Y+ +003bfd 0f00 lsl temp0 +003bfe 1f11 rol temp1 +003bff 1f88 rol tosl +003c00 1f99 rol tosh +003c01 931a st -Y, temp1 +003c02 930a st -Y, temp0 +003c03 cc01 jmp_ DO_NEXT + .include "words/d-2slash.asm" + + ; Arithmetics + ; shift a double cell value right + VE_D2SLASH: +003c04 ff03 .dw $ff03 +003c05 3264 +003c06 002f .db "d2/",0 +003c07 3bf6 .dw VE_HEAD + .set VE_HEAD = VE_D2SLASH + XT_D2SLASH: +003c08 3c09 .dw PFA_D2SLASH + PFA_D2SLASH: +003c09 9109 ld temp0, Y+ +003c0a 9119 ld temp1, Y+ +003c0b 9595 asr tosh +003c0c 9587 ror tosl +003c0d 9517 ror temp1 +003c0e 9507 ror temp0 +003c0f 931a st -Y, temp1 +003c10 930a st -Y, temp0 +003c11 cbf3 jmp_ DO_NEXT + .include "words/d-plus.asm" + + ; Arithmetics + ; add 2 double cell values + VE_DPLUS: +003c12 ff02 .dw $ff02 +003c13 2b64 .db "d+" +003c14 3c04 .dw VE_HEAD + .set VE_HEAD = VE_DPLUS + XT_DPLUS: +003c15 3c16 .dw PFA_DPLUS + PFA_DPLUS: +003c16 9129 ld temp2, Y+ +003c17 9139 ld temp3, Y+ + +003c18 90e9 ld temp4, Y+ +003c19 90f9 ld temp5, Y+ +003c1a 9149 ld temp6, Y+ +003c1b 9159 ld temp7, Y+ + +003c1c 0f24 add temp2, temp6 +003c1d 1f35 adc temp3, temp7 +003c1e 1d8e adc tosl, temp4 +003c1f 1d9f adc tosh, temp5 + +003c20 933a st -Y, temp3 +003c21 932a st -Y, temp2 +003c22 cbe2 jmp_ DO_NEXT + .include "words/d-minus.asm" + + ; Arithmetics + ; subtract d2 from d1 + VE_DMINUS: +003c23 ff02 .dw $ff02 +003c24 2d64 .db "d-" +003c25 3c12 .dw VE_HEAD + .set VE_HEAD = VE_DMINUS + XT_DMINUS: +003c26 3c27 .dw PFA_DMINUS + PFA_DMINUS: +003c27 9129 ld temp2, Y+ +003c28 9139 ld temp3, Y+ + +003c29 90e9 ld temp4, Y+ +003c2a 90f9 ld temp5, Y+ +003c2b 9149 ld temp6, Y+ +003c2c 9159 ld temp7, Y+ + +003c2d 1b42 sub temp6, temp2 +003c2e 0b53 sbc temp7, temp3 +003c2f 0ae8 sbc temp4, tosl +003c30 0af9 sbc temp5, tosh + +003c31 935a st -Y, temp7 +003c32 934a st -Y, temp6 +003c33 01c7 movw tosl, temp4 +003c34 cbd0 jmp_ DO_NEXT + .include "words/d-invert.asm" + + ; Arithmetics + ; invert all bits in the double cell value + VE_DINVERT: +003c35 ff07 .dw $ff07 +003c36 6964 +003c37 766e +003c38 7265 +003c39 0074 .db "dinvert",0 +003c3a 3c23 .dw VE_HEAD + .set VE_HEAD = VE_DINVERT + XT_DINVERT: +003c3b 3c3c .dw PFA_DINVERT + PFA_DINVERT: +003c3c 9109 ld temp0, Y+ +003c3d 9119 ld temp1, Y+ +003c3e 9580 com tosl +003c3f 9590 com tosh +003c40 9500 com temp0 +003c41 9510 com temp1 +003c42 931a st -Y, temp1 +003c43 930a st -Y, temp0 +003c44 cbc0 jmp_ DO_NEXT + .include "words/slashmod.asm" + + ; Arithmetics + ; signed division n1/n2 with remainder and quotient + VE_SLASHMOD: +003c45 ff04 .dw $ff04 +003c46 6d2f +003c47 646f .db "/mod" +003c48 3c35 .dw VE_HEAD + .set VE_HEAD = VE_SLASHMOD + XT_SLASHMOD: +003c49 3c4a .dw PFA_SLASHMOD + PFA_SLASHMOD: +003c4a 019c movw temp2, tosl + +003c4b 9109 ld temp0, Y+ +003c4c 9119 ld temp1, Y+ + +003c4d 2f41 mov temp6,temp1 ;move dividend High to sign register +003c4e 2743 eor temp6,temp3 ;xor divisor High with sign register +003c4f ff17 sbrs temp1,7 ;if MSB in dividend set +003c50 c004 rjmp PFA_SLASHMOD_1 +003c51 9510 com temp1 ; change sign of dividend +003c52 9500 com temp0 +003c53 5f0f subi temp0,low(-1) +003c54 4f1f sbci temp1,high(-1) + PFA_SLASHMOD_1: +003c55 ff37 sbrs temp3,7 ;if MSB in divisor set +003c56 c004 rjmp PFA_SLASHMOD_2 +003c57 9530 com temp3 ; change sign of divisor +003c58 9520 com temp2 +003c59 5f2f subi temp2,low(-1) +003c5a 4f3f sbci temp3,high(-1) +003c5b 24ee PFA_SLASHMOD_2: clr temp4 ;clear remainder Low byte +003c5c 18ff sub temp5,temp5;clear remainder High byte and carry +003c5d e151 ldi temp7,17 ;init loop counter + +003c5e 1f00 PFA_SLASHMOD_3: rol temp0 ;shift left dividend +003c5f 1f11 rol temp1 +003c60 955a dec temp7 ;decrement counter +003c61 f439 brne PFA_SLASHMOD_5 ;if done +003c62 ff47 sbrs temp6,7 ; if MSB in sign register set +003c63 c004 rjmp PFA_SLASHMOD_4 +003c64 9510 com temp1 ; change sign of result +003c65 9500 com temp0 +003c66 5f0f subi temp0,low(-1) +003c67 4f1f sbci temp1,high(-1) +003c68 c00b PFA_SLASHMOD_4: rjmp PFA_SLASHMODmod_done ; return +003c69 1cee PFA_SLASHMOD_5: rol temp4 ;shift dividend into remainder +003c6a 1cff rol temp5 +003c6b 1ae2 sub temp4,temp2 ;remainder = remainder - divisor +003c6c 0af3 sbc temp5,temp3 ; +003c6d f420 brcc PFA_SLASHMOD_6 ;if result negative +003c6e 0ee2 add temp4,temp2 ; restore remainder +003c6f 1ef3 adc temp5,temp3 +003c70 9488 clc ; clear carry to be shifted into result +003c71 cfec rjmp PFA_SLASHMOD_3 ;else +003c72 9408 PFA_SLASHMOD_6: sec ; set carry to be shifted into result +003c73 cfea rjmp PFA_SLASHMOD_3 + + PFA_SLASHMODmod_done: + ; put remainder on stack +003c74 92fa st -Y,temp5 +003c75 92ea st -Y,temp4 + + ; put quotient on stack +003c76 01c8 movw tosl, temp0 +003c77 cb8d jmp_ DO_NEXT + .include "words/abs.asm" + + ; DUP ?NEGATE ; + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_ABS: +003c78 ff03 .dw $ff03 +003c79 6261 +003c7a 0073 .db "abs",0 +003c7b 3c45 .dw VE_HEAD + .set VE_HEAD = VE_ABS + XT_ABS: +003c7c 3801 .dw DO_COLON + PFA_ABS: + + .endif + +003c7d 38b1 +003c7e 3a3e +003c7f 3820 .DW XT_DUP,XT_QNEGATE,XT_EXIT + .include "words/pick.asm" + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_PICK: +003c80 ff04 .dw $ff04 +003c81 6970 +003c82 6b63 .db "pick" +003c83 3c78 .dw VE_HEAD + .set VE_HEAD = VE_PICK + XT_PICK: +003c84 3801 .dw DO_COLON + PFA_PICK: + .endif +003c85 3a2f .dw XT_1PLUS +003c86 3ec4 .dw XT_CELLS +003c87 3a8d .dw XT_SP_FETCH +003c88 399d .dw XT_PLUS +003c89 3879 .dw XT_FETCH +003c8a 3820 .dw XT_EXIT + .include "words/cellplus.asm" + + ; Arithmetics + ; add the size of an address-unit to a-addr1 + VE_CELLPLUS: +003c8b ff05 .dw $ff05 +003c8c 6563 +003c8d 6c6c +003c8e 002b .db "cell+",0 +003c8f 3c80 .dw VE_HEAD + .set VE_HEAD = VE_CELLPLUS + XT_CELLPLUS: +003c90 3c91 .dw PFA_CELLPLUS + PFA_CELLPLUS: +003c91 9602 adiw tosl, CELLSIZE +003c92 cb72 jmp_ DO_NEXT + .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: +003c93 ff04 .dw $ff04 +003c94 692b +003c95 746e .db "+int" +003c96 3c8b .dw VE_HEAD + .set VE_HEAD = VE_INTON + XT_INTON: +003c97 3c98 .dw PFA_INTON + PFA_INTON: +003c98 9478 sei +003c99 cb6b jmp_ DO_NEXT + .include "words/int-off.asm" + + ; Interrupt + ; turns off all interrupts + VE_INTOFF: +003c9a ff04 .dw $ff04 +003c9b 692d +003c9c 746e .db "-int" +003c9d 3c93 .dw VE_HEAD + .set VE_HEAD = VE_INTOFF + XT_INTOFF: +003c9e 3c9f .dw PFA_INTOFF + PFA_INTOFF: +003c9f 94f8 cli +003ca0 cb64 jmp_ DO_NEXT + .include "words/int-store.asm" + + ; Interrupt + ; stores XT as interrupt vector i + VE_INTSTORE: +003ca1 ff04 .dw $ff04 +003ca2 6e69 +003ca3 2174 .db "int!" +003ca4 3c9a .dw VE_HEAD + .set VE_HEAD = VE_INTSTORE + XT_INTSTORE: +003ca5 3801 .dw DO_COLON + PFA_INTSTORE: +003ca6 383d .dw XT_DOLITERAL +003ca7 0000 .dw intvec +003ca8 399d .dw XT_PLUS +003ca9 3b3b .dw XT_STOREE +003caa 3820 .dw XT_EXIT + .include "words/int-fetch.asm" + + ; Interrupt + ; fetches XT from interrupt vector i + VE_INTFETCH: +003cab ff04 .dw $ff04 +003cac 6e69 +003cad 4074 .db "int@" +003cae 3ca1 .dw VE_HEAD + .set VE_HEAD = VE_INTFETCH + XT_INTFETCH: +003caf 3801 .dw DO_COLON + PFA_INTFETCH: +003cb0 383d .dw XT_DOLITERAL +003cb1 0000 .dw intvec +003cb2 399d .dw XT_PLUS +003cb3 3b5f .dw XT_FETCHE +003cb4 3820 .dw XT_EXIT + .include "words/int-trap.asm" + + ; Interrupt + ; trigger an interrupt + VE_INTTRAP: +003cb5 ff08 .dw $ff08 +003cb6 6e69 +003cb7 2d74 +003cb8 7274 +003cb9 7061 .db "int-trap" +003cba 3cab .dw VE_HEAD + .set VE_HEAD = VE_INTTRAP + XT_INTTRAP: +003cbb 3cbc .dw PFA_INTTRAP + PFA_INTTRAP: +003cbc 2eb8 mov isrflag, tosl +003cbd 9189 +003cbe 9199 loadtos +003cbf cb45 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: +003cc0 3801 .dw DO_COLON + PFA_ISREXEC: +003cc1 3caf .dw XT_INTFETCH +003cc2 382a .dw XT_EXECUTE +003cc3 3cc5 .dw XT_ISREND +003cc4 3820 .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: +003cc5 3cc6 .dw PFA_ISREND + PFA_ISREND: +003cc6 d001 rcall PFA_ISREND1 ; clear the interrupt flag for the controller +003cc7 cb3d jmp_ DO_NEXT + PFA_ISREND1: +003cc8 9518 reti + .endif + + ; now the relocatable colon words + .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: +003cc9 3801 .dw DO_COLON + PFA_DEFAULT_PROMPTOK: +003cca 03d0 .dw XT_DOSLITERAL +003ccb 0003 .dw 3 +003ccc 6f20 +003ccd 006b .db " ok",0 + .endif +003cce 0403 .dw XT_ITYPE +003ccf 3820 .dw XT_EXIT + + ; ------------------------ + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_PROMPTOK: +003cd0 ff03 .dw $FF03 +003cd1 6f2e +../../common\words/prompt-ok.asm(43): warning: .cseg .db misalignment - padding zero byte +003cd2 006b .db ".ok" +003cd3 3cb5 .dw VE_HEAD + .set VE_HEAD = VE_PROMPTOK + XT_PROMPTOK: +003cd4 3dff .dw PFA_DODEFER1 + PFA_PROMPTOK: + .endif +003cd5 001c .dw USER_P_OK +003cd6 3dc8 .dw XT_UDEFERFETCH +003cd7 3dd4 .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: +003cd8 3801 .dw DO_COLON + PFA_DEFAULT_PROMPTREADY: +003cd9 03d0 .dw XT_DOSLITERAL +003cda 0002 .dw 2 +003cdb 203e .db "> " + .endif +003cdc 3fa1 .dw XT_CR +003cdd 0403 .dw XT_ITYPE +003cde 3820 .dw XT_EXIT + + ; ------------------------ + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_PROMPTREADY: +003cdf ff06 .dw $FF06 +003ce0 722e +003ce1 6165 +003ce2 7964 .db ".ready" +003ce3 3cd0 .dw VE_HEAD + .set VE_HEAD = VE_PROMPTREADY + XT_PROMPTREADY: +003ce4 3dff .dw PFA_DODEFER1 + PFA_PROMPTREADY: + .endif +003ce5 0020 .dw USER_P_RDY +003ce6 3dc8 .dw XT_UDEFERFETCH +003ce7 3dd4 .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: +003ce8 3801 .dw DO_COLON + PFA_DEFAULT_PROMPTERROR: +003ce9 03d0 .dw XT_DOSLITERAL +003cea 0004 .dw 4 +003ceb 3f20 +003cec 203f .db " ?? " + .endif +003ced 0403 .dw XT_ITYPE +003cee 3ebd .dw XT_BASE +003cef 3879 .dw XT_FETCH +003cf0 38ff .dw XT_TO_R +003cf1 3f41 .dw XT_DECIMAL +003cf2 0385 .dw XT_DOT +003cf3 3ee2 .dw XT_TO_IN +003cf4 3879 .dw XT_FETCH +003cf5 0385 .dw XT_DOT +003cf6 38f6 .dw XT_R_FROM +003cf7 3ebd .dw XT_BASE +003cf8 3881 .dw XT_STORE +003cf9 3820 .dw XT_EXIT + + ; ------------------------ + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_PROMPTERROR: +003cfa ff06 .dw $FF06 +003cfb 652e +003cfc 7272 +003cfd 726f .db ".error" +003cfe 3cdf .dw VE_HEAD + .set VE_HEAD = VE_PROMPTERROR + XT_PROMPTERROR: +003cff 3dff .dw PFA_DODEFER1 + PFA_PROMPTERROR: + .endif +003d00 001e .dw USER_P_ERR +003d01 3dc8 .dw XT_UDEFERFETCH +003d02 3dd4 .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: +003d03 ff04 .dw $ff04 +003d04 7571 +003d05 7469 .db "quit" +003d06 3cfa .dw VE_HEAD + .set VE_HEAD = VE_QUIT + XT_QUIT: +003d07 3801 .dw DO_COLON + .endif + PFA_QUIT: +003d08 085c +003d09 0863 +003d0a 3881 .dw XT_LP0,XT_LP,XT_STORE +003d0b 05d5 .dw XT_SP0 +003d0c 3a96 .dw XT_SP_STORE +003d0d 05e2 .dw XT_RP0 +003d0e 3a80 .dw XT_RP_STORE +003d0f 08f1 .dw XT_LBRACKET + + PFA_QUIT2: +003d10 3eb7 .dw XT_STATE +003d11 3879 .dw XT_FETCH +003d12 391a .dw XT_ZEROEQUAL +003d13 3836 .dw XT_DOCONDBRANCH +003d14 3d16 DEST(PFA_QUIT4) +003d15 3ce4 .dw XT_PROMPTREADY + PFA_QUIT4: +003d16 04e9 .dw XT_REFILL +003d17 3836 .dw XT_DOCONDBRANCH +003d18 3d28 DEST(PFA_QUIT3) +003d19 383d .dw XT_DOLITERAL +003d1a 0630 .dw XT_INTERPRET +003d1b 3d70 .dw XT_CATCH +003d1c 38b9 .dw XT_QDUP +003d1d 3836 .dw XT_DOCONDBRANCH +003d1e 3d28 DEST(PFA_QUIT3) +003d1f 38b1 .dw XT_DUP +003d20 383d .dw XT_DOLITERAL +003d21 fffe .dw -2 +003d22 396e .dw XT_LESS +003d23 3836 .dw XT_DOCONDBRANCH +003d24 3d26 DEST(PFA_QUIT5) +003d25 3cff .dw XT_PROMPTERROR + PFA_QUIT5: +003d26 382f .dw XT_DOBRANCH +003d27 3d08 DEST(PFA_QUIT) + PFA_QUIT3: +003d28 3cd4 .dw XT_PROMPTOK +003d29 382f .dw XT_DOBRANCH +003d2a 3d10 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: +003d2b ff05 .dw $ff05 +003d2c 6170 +003d2d 7375 +003d2e 0065 .db "pause",0 +003d2f 3d03 .dw VE_HEAD + .set VE_HEAD = VE_PAUSE + XT_PAUSE: +003d30 3dff .dw PFA_DODEFER1 + PFA_PAUSE: +003d31 0192 .dw ram_pause +003d32 3db4 .dw XT_RDEFERFETCH +003d33 3dbe .dw XT_RDEFERSTORE + + .dseg +000192 ram_pause: .byte 2 + .cseg + .include "words/cold.asm" + + ; System + ; start up amforth. + VE_COLD: +003d34 ff04 .dw $ff04 +003d35 6f63 +003d36 646c .db "cold" +003d37 3d2b .dw VE_HEAD + .set VE_HEAD = VE_COLD + XT_COLD: +003d38 3d39 .dw PFA_COLD + PFA_COLD: +003d39 b6a4 in_ mcu_boot, MCUSR +003d3a 2422 clr zerol +003d3b 2433 clr zeroh +003d3c 24bb clr isrflag +003d3d be24 out_ MCUSR, zerol + ; clear RAM +003d3e e0e0 ldi zl, low(ramstart) +003d3f e0f1 ldi zh, high(ramstart) + clearloop: +003d40 9221 st Z+, zerol +003d41 30e0 cpi zl, low(sram_size+ramstart) +003d42 f7e9 brne clearloop +003d43 30f9 cpi zh, high(sram_size+ramstart) +003d44 f7d9 brne clearloop + ; init first user data area + ; allocate space for User Area + .dseg +000194 ram_user1: .byte SYSUSERSIZE + APPUSERSIZE + .cseg +003d45 e9e4 ldi zl, low(ram_user1) +003d46 e0f1 ldi zh, high(ram_user1) +003d47 012f movw upl, zl + ; init return stack pointer +003d48 ef0f ldi temp0,low(rstackstart) +003d49 bf0d out_ SPL,temp0 +003d4a 8304 std Z+4, temp0 +003d4b e018 ldi temp1,high(rstackstart) +003d4c bf1e out_ SPH,temp1 +003d4d 8315 std Z+5, temp1 + + ; init parameter stack pointer +003d4e eacf ldi yl,low(stackstart) +003d4f 83c6 std Z+6, yl +003d50 e0d8 ldi yh,high(stackstart) +003d51 83d7 std Z+7, yh + + ; load Forth IP with starting word +003d52 e5aa ldi XL, low(PFA_WARM) +003d53 e3bd ldi XH, high(PFA_WARM) + ; its a far jump... +003d54 cab0 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: +003d55 ff04 .dw $ff04 +003d56 6177 +003d57 6d72 .db "warm" +003d58 3d34 .dw VE_HEAD + .set VE_HEAD = VE_WARM + XT_WARM: +003d59 3801 .dw DO_COLON + PFA_WARM: + .endif +003d5a 02a2 .dw XT_INIT_RAM +003d5b 383d .dw XT_DOLITERAL +003d5c 01a5 .dw XT_NOOP +003d5d 383d .dw XT_DOLITERAL +003d5e 3d30 .dw XT_PAUSE +003d5f 3ddf .dw XT_DEFERSTORE +003d60 08f1 .dw XT_LBRACKET +003d61 3f5c .dw XT_TURNKEY +003d62 3d07 .dw XT_QUIT ; never returns + + .include "words/handler.asm" + + ; Exceptions + ; USER variable used by catch/throw + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_HANDLER: +003d63 ff07 .dw $ff07 +003d64 6168 +003d65 646e +003d66 656c +003d67 0072 .db "handler",0 +003d68 3d55 .dw VE_HEAD + .set VE_HEAD = VE_HANDLER + XT_HANDLER: +003d69 3858 .dw PFA_DOUSER + PFA_HANDLER: + .endif +003d6a 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: +003d6b ff05 .dw $ff05 +003d6c 6163 +003d6d 6374 +003d6e 0068 .db "catch",0 +003d6f 3d63 .dw VE_HEAD + .set VE_HEAD = VE_CATCH + XT_CATCH: +003d70 3801 .dw DO_COLON + PFA_CATCH: + .endif + + ; sp@ >r +003d71 3a8d .dw XT_SP_FETCH +003d72 38ff .dw XT_TO_R + ; handler @ >r +003d73 3d69 .dw XT_HANDLER +003d74 3879 .dw XT_FETCH +003d75 38ff .dw XT_TO_R + ; rp@ handler ! +003d76 3a76 .dw XT_RP_FETCH +003d77 3d69 .dw XT_HANDLER +003d78 3881 .dw XT_STORE +003d79 382a .dw XT_EXECUTE + ; r> handler ! +003d7a 38f6 .dw XT_R_FROM +003d7b 3d69 .dw XT_HANDLER +003d7c 3881 .dw XT_STORE +003d7d 38f6 .dw XT_R_FROM +003d7e 38d9 .dw XT_DROP +003d7f 3954 .dw XT_ZERO +003d80 3820 .dw XT_EXIT + .include "words/throw.asm" + + ; Exceptions + ; throw an exception + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_THROW: +003d81 ff05 .dw $ff05 +003d82 6874 +003d83 6f72 +003d84 0077 .db "throw",0 +003d85 3d6b .dw VE_HEAD + .set VE_HEAD = VE_THROW + XT_THROW: +003d86 3801 .dw DO_COLON + PFA_THROW: + .endif +003d87 38b1 .dw XT_DUP +003d88 391a .dw XT_ZEROEQUAL +003d89 3836 .dw XT_DOCONDBRANCH +003d8a 3d8d DEST(PFA_THROW1) +003d8b 38d9 .dw XT_DROP +003d8c 3820 .dw XT_EXIT + PFA_THROW1: +003d8d 3d69 .dw XT_HANDLER +003d8e 3879 .dw XT_FETCH +003d8f 3a80 .dw XT_RP_STORE +003d90 38f6 .dw XT_R_FROM +003d91 3d69 .dw XT_HANDLER +003d92 3881 .dw XT_STORE +003d93 38f6 .dw XT_R_FROM +003d94 38c4 .dw XT_SWAP +003d95 38ff .dw XT_TO_R +003d96 3a96 .dw XT_SP_STORE +003d97 38d9 .dw XT_DROP +003d98 38f6 .dw XT_R_FROM +003d99 3820 .dw XT_EXIT + + + + .include "words/edefer-fetch.asm" + + ; System + ; does the real defer@ for eeprom defers + VE_EDEFERFETCH: +003d9a ff07 .dw $ff07 +003d9b 6445 +003d9c 6665 +003d9d 7265 +003d9e 0040 .db "Edefer@",0 +003d9f 3d81 .dw VE_HEAD + .set VE_HEAD = VE_EDEFERFETCH + XT_EDEFERFETCH: +003da0 3801 .dw DO_COLON + PFA_EDEFERFETCH: +003da1 3bcb .dw XT_FETCHI +003da2 3b5f .dw XT_FETCHE +003da3 3820 .dw XT_EXIT + .include "words/edefer-store.asm" + + ; System + ; does the real defer! for eeprom defers + VE_EDEFERSTORE: +003da4 ff07 .dw $ff07 +003da5 6445 +003da6 6665 +003da7 7265 +003da8 0021 .db "Edefer!",0 +003da9 3d9a .dw VE_HEAD + .set VE_HEAD = VE_EDEFERSTORE + XT_EDEFERSTORE: +003daa 3801 .dw DO_COLON + PFA_EDEFERSTORE: +003dab 3bcb .dw XT_FETCHI +003dac 3b3b .dw XT_STOREE +003dad 3820 .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: +003dae ff07 .dw $ff07 +003daf 6452 +003db0 6665 +003db1 7265 +003db2 0040 .db "Rdefer@",0 +003db3 3da4 .dw VE_HEAD + .set VE_HEAD = VE_RDEFERFETCH + XT_RDEFERFETCH: +003db4 3801 .dw DO_COLON + PFA_RDEFERFETCH: + .endif +003db5 3bcb .dw XT_FETCHI +003db6 3879 .dw XT_FETCH +003db7 3820 .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: +003db8 ff07 .dw $ff07 +003db9 6452 +003dba 6665 +003dbb 7265 +003dbc 0021 .db "Rdefer!",0 +003dbd 3dae .dw VE_HEAD + .set VE_HEAD = VE_RDEFERSTORE + XT_RDEFERSTORE: +003dbe 3801 .dw DO_COLON + PFA_RDEFERSTORE: + .endif +003dbf 3bcb .dw XT_FETCHI +003dc0 3881 .dw XT_STORE +003dc1 3820 .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: +003dc2 ff07 .dw $ff07 +003dc3 6455 +003dc4 6665 +003dc5 7265 +003dc6 0040 .db "Udefer@",0 +003dc7 3db8 .dw VE_HEAD + .set VE_HEAD = VE_UDEFERFETCH + XT_UDEFERFETCH: +003dc8 3801 .dw DO_COLON + PFA_UDEFERFETCH: + .endif +003dc9 3bcb .dw XT_FETCHI +003dca 3b02 .dw XT_UP_FETCH +003dcb 399d .dw XT_PLUS +003dcc 3879 .dw XT_FETCH +003dcd 3820 .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: +003dce ff07 .dw $ff07 +003dcf 6455 +003dd0 6665 +003dd1 7265 +003dd2 0021 .db "Udefer!",0 +003dd3 3dc2 .dw VE_HEAD + .set VE_HEAD = VE_UDEFERSTORE + XT_UDEFERSTORE: +003dd4 3801 .dw DO_COLON + PFA_UDEFERSTORE: + .endif + +003dd5 3bcb .dw XT_FETCHI +003dd6 3b02 .dw XT_UP_FETCH +003dd7 399d .dw XT_PLUS +003dd8 3881 .dw XT_STORE +003dd9 3820 .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: +003dda ff06 .dw $ff06 +003ddb 6564 +003ddc 6566 +003ddd 2172 .db "defer!" +003dde 3dce .dw VE_HEAD + .set VE_HEAD = VE_DEFERSTORE + XT_DEFERSTORE: +003ddf 3801 .dw DO_COLON + PFA_DEFERSTORE: + .endif +003de0 3fd0 .dw XT_TO_BODY +003de1 38b1 .dw XT_DUP +003de2 01d1 .dw XT_ICELLPLUS +003de3 01d1 .dw XT_ICELLPLUS +003de4 3bcb .dw XT_FETCHI +003de5 382a .dw XT_EXECUTE +003de6 3820 .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: +003de7 ff06 .dw $ff06 +003de8 6564 +003de9 6566 +003dea 4072 .db "defer@" +003deb 3dda .dw VE_HEAD + .set VE_HEAD = VE_DEFERFETCH + XT_DEFERFETCH: +003dec 3801 .dw DO_COLON + PFA_DEFERFETCH: + .endif +003ded 3fd0 .dw XT_TO_BODY +003dee 38b1 .dw XT_DUP +003def 01d1 .dw XT_ICELLPLUS +003df0 3bcb .dw XT_FETCHI +003df1 382a .dw XT_EXECUTE +003df2 3820 .dw XT_EXIT + .include "words/do-defer.asm" + + ; System + ; runtime of defer + VE_DODEFER: +003df3 ff07 .dw $ff07 +003df4 6428 +003df5 6665 +003df6 7265 +003df7 0029 .db "(defer)", 0 +003df8 3de7 .dw VE_HEAD + .set VE_HEAD = VE_DODEFER + XT_DODEFER: +003df9 3801 .dw DO_COLON + PFA_DODEFER: +003dfa 0739 .dw XT_DOCREATE +003dfb 0899 .dw XT_REVEAL +003dfc 075c .dw XT_COMPILE +003dfd 3dff .dw PFA_DODEFER1 +003dfe 3820 .dw XT_EXIT + PFA_DODEFER1: +003dff 940e 08b2 call_ DO_DODOES +003e01 38b1 .dw XT_DUP +003e02 01d1 .dw XT_ICELLPLUS +003e03 3bcb .dw XT_FETCHI +003e04 382a .dw XT_EXECUTE +003e05 382a .dw XT_EXECUTE +003e06 3820 .dw XT_EXIT + + ; : (defer) dup i-cell+ @i execute execute ; + + + .include "words/u-dot.asm" + + ; Numeric IO + ; unsigned PNO with single cell numbers + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_UDOT: +003e07 ff02 .dw $ff02 +003e08 2e75 .db "u." +003e09 3df3 .dw VE_HEAD + .set VE_HEAD = VE_UDOT + XT_UDOT: +003e0a 3801 .dw DO_COLON + PFA_UDOT: + .endif +003e0b 3954 .dw XT_ZERO +003e0c 038d .dw XT_UDDOT +003e0d 3820 .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: +003e0e ff03 .dw $ff03 +003e0f 2e75 +003e10 0072 .db "u.r",0 +003e11 3e07 .dw VE_HEAD + .set VE_HEAD = VE_UDOTR + XT_UDOTR: +003e12 3801 .dw DO_COLON + PFA_UDOTR: + .endif +003e13 3954 .dw XT_ZERO +003e14 38c4 .dw XT_SWAP +003e15 0396 .dw XT_UDDOTR +003e16 3820 .dw XT_EXIT + ; : u.r ( s n -- ) 0 swap ud.r ; + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;; + .include "words/uslashmod.asm" + + ; Arithmetics + ; unsigned division with remainder + VE_USLASHMOD: +003e17 ff05 .dw $ff05 +003e18 2f75 +003e19 6f6d +003e1a 0064 .db "u/mod",0 +003e1b 3e0e .dw VE_HEAD + .set VE_HEAD = VE_USLASHMOD + XT_USLASHMOD: +003e1c 3801 .dw DO_COLON + PFA_USLASHMOD: +003e1d 38ff .dw XT_TO_R +003e1e 3954 .dw XT_ZERO +003e1f 38f6 .dw XT_R_FROM +003e20 39c2 .dw XT_UMSLASHMOD +003e21 3820 .dw XT_EXIT + .include "words/negate.asm" + + ; Logic + ; 2-complement + VE_NEGATE: +003e22 ff06 .dw $ff06 +003e23 656e +003e24 6167 +003e25 6574 .db "negate" +003e26 3e17 .dw VE_HEAD + .set VE_HEAD = VE_NEGATE + XT_NEGATE: +003e27 3801 .dw DO_COLON + PFA_NEGATE: +003e28 39fd .dw XT_INVERT +003e29 3a2f .dw XT_1PLUS +003e2a 3820 .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: +003e2b ff01 .dw $ff01 +003e2c 002f .db "/",0 +003e2d 3e22 .dw VE_HEAD + .set VE_HEAD = VE_SLASH + XT_SLASH: +003e2e 3801 .dw DO_COLON + PFA_SLASH: + .endif +003e2f 3c49 .dw XT_SLASHMOD +003e30 38f0 .dw XT_NIP +003e31 3820 .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: +003e32 ff03 .dw $ff03 +003e33 6f6d +003e34 0064 .db "mod",0 +003e35 3e2b .dw VE_HEAD + .set VE_HEAD = VE_MOD + XT_MOD: +003e36 3801 .dw DO_COLON + PFA_MOD: + .endif +003e37 3c49 .dw XT_SLASHMOD +003e38 38d9 .dw XT_DROP +003e39 3820 .dw 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: +003e3a ff03 .dw $ff03 +003e3b 696d +003e3c 006e .db "min",0 +003e3d 3e32 .dw VE_HEAD + .set VE_HEAD = VE_MIN + XT_MIN: +003e3e 3801 .dw DO_COLON + PFA_MIN: + .endif +003e3f 3ec9 .dw XT_2DUP +003e40 3978 .dw XT_GREATER +003e41 3836 .dw XT_DOCONDBRANCH +003e42 3e44 DEST(PFA_MIN1) +003e43 38c4 .dw XT_SWAP + PFA_MIN1: +003e44 38d9 .dw XT_DROP +003e45 3820 .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: +003e46 ff03 .dw $ff03 +003e47 616d +003e48 0078 .db "max",0 +003e49 3e3a .dw VE_HEAD + .set VE_HEAD = VE_MAX + XT_MAX: +003e4a 3801 .dw DO_COLON + PFA_MAX: + + .endif +003e4b 3ec9 .dw XT_2DUP +003e4c 396e .dw XT_LESS +003e4d 3836 .dw XT_DOCONDBRANCH +003e4e 3e50 DEST(PFA_MAX1) +003e4f 38c4 .dw XT_SWAP + PFA_MAX1: +003e50 38d9 .dw XT_DROP +003e51 3820 .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: +003e52 ff06 .dw $ff06 +003e53 6977 +003e54 6874 +003e55 6e69 .db "within" +003e56 3e46 .dw VE_HEAD + .set VE_HEAD = VE_WITHIN + XT_WITHIN: +003e57 3801 .dw DO_COLON + PFA_WITHIN: + .endif +003e58 38cf .dw XT_OVER +003e59 3993 .dw XT_MINUS +003e5a 38ff .dw XT_TO_R +003e5b 3993 .dw XT_MINUS +003e5c 38f6 .dw XT_R_FROM +003e5d 395c .dw XT_ULESS +003e5e 3820 .dw XT_EXIT + + .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: +003e5f ff0d .dw $ff0d +003e60 6873 +003e61 776f +003e62 772d +003e63 726f +003e64 6c64 +003e65 7369 +003e66 0074 .db "show-wordlist",0 +003e67 3e52 .dw VE_HEAD + .set VE_HEAD = VE_SHOWWORDLIST + XT_SHOWWORDLIST: +003e68 3801 .dw DO_COLON + PFA_SHOWWORDLIST: + .endif +003e69 383d .dw XT_DOLITERAL +003e6a 3e6e .dw XT_SHOWWORD +003e6b 38c4 .dw XT_SWAP +003e6c 06da .dw XT_TRAVERSEWORDLIST +003e6d 3820 .dw XT_EXIT + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + XT_SHOWWORD: +003e6e 3801 .dw DO_COLON + PFA_SHOWWORD: + .endif +003e6f 06f5 .dw XT_NAME2STRING +003e70 0403 .dw XT_ITYPE +003e71 3fae .dw XT_SPACE ; ( -- addr n) +003e72 394b .dw XT_TRUE +003e73 3820 .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: +003e74 ff05 .dw $ff05 +003e75 6f77 +003e76 6472 +003e77 0073 .db "words",0 +003e78 3e5f .dw VE_HEAD + .set VE_HEAD = VE_WORDS + XT_WORDS: +003e79 3801 .dw DO_COLON + PFA_WORDS: + .endif +003e7a 383d .dw XT_DOLITERAL +003e7b 004c .dw CFG_ORDERLISTLEN+2 +003e7c 3b5f .dw XT_FETCHE +003e7d 3e68 .dw XT_SHOWWORDLIST +003e7e 3820 .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: +003e7f 0002 .dw $0002 +003e80 222e .db ".",$22 +003e81 3e74 .dw VE_HEAD + .set VE_HEAD = VE_DOTSTRING + XT_DOTSTRING: +003e82 3801 .dw DO_COLON + PFA_DOTSTRING: + .endif +003e83 3e8a .dw XT_SQUOTE +003e84 075c .dw XT_COMPILE +003e85 0403 .dw XT_ITYPE +003e86 3820 .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: +003e87 0002 .dw $0002 +003e88 2273 .db "s",$22 +003e89 3e7f .dw VE_HEAD + .set VE_HEAD = VE_SQUOTE + XT_SQUOTE: +003e8a 3801 .dw DO_COLON + PFA_SQUOTE: + .endif +003e8b 383d .dw XT_DOLITERAL +003e8c 0022 .dw 34 ; 0x22 +003e8d 058e .dw XT_PARSE ; ( -- addr n) +003e8e 3eb7 .dw XT_STATE +003e8f 3879 .dw XT_FETCH +003e90 3836 .dw XT_DOCONDBRANCH +003e91 3e93 DEST(PFA_SQUOTE1) +003e92 0788 .dw XT_SLITERAL + PFA_SQUOTE1: +003e93 3820 .dw XT_EXIT + .include "words/fill.asm" + + ; Memory + ; fill u bytes memory beginning at a-addr with character c + VE_FILL: +003e94 ff04 .dw $ff04 +003e95 6966 +003e96 6c6c .db "fill" +003e97 3e87 .dw VE_HEAD + .set VE_HEAD = VE_FILL + XT_FILL: +003e98 3801 .dw DO_COLON + PFA_FILL: +003e99 38e1 .dw XT_ROT +003e9a 38e1 .dw XT_ROT +003e9b 38b9 +003e9c 3836 .dw XT_QDUP,XT_DOCONDBRANCH +003e9d 3ea5 DEST(PFA_FILL2) +003e9e 3f99 .dw XT_BOUNDS +003e9f 3a9b .dw XT_DODO + PFA_FILL1: +003ea0 38b1 .dw XT_DUP +003ea1 3aac .dw XT_I +003ea2 388d .dw XT_CSTORE ; ( -- c c-addr) +003ea3 3ac9 .dw XT_DOLOOP +003ea4 3ea0 .dw PFA_FILL1 + PFA_FILL2: +003ea5 38d9 .dw XT_DROP +003ea6 3820 .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: +003ea7 ff05 .dw $ff05 +003ea8 5f66 +003ea9 7063 +003eaa 0075 .db "f_cpu",0 +003eab 3e94 .dw VE_HEAD + .set VE_HEAD = VE_F_CPU + XT_F_CPU: +003eac 3801 .dw DO_COLON + PFA_F_CPU: + .endif +003ead 383d .dw XT_DOLITERAL +003eae 2400 .dw (F_CPU % 65536) +003eaf 383d .dw XT_DOLITERAL +003eb0 00f4 .dw (F_CPU / 65536) +003eb1 3820 .dw XT_EXIT + .include "words/state.asm" + + ; System Variable + ; system state + VE_STATE: +003eb2 ff05 .dw $ff05 +003eb3 7473 +003eb4 7461 +003eb5 0065 .db "state",0 +003eb6 3ea7 .dw VE_HEAD + .set VE_HEAD = VE_STATE + XT_STATE: +003eb7 3848 .dw PFA_DOVARIABLE + PFA_STATE: +003eb8 01c0 .dw ram_state + + .dseg +0001c0 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: +003eb9 ff04 .dw $ff04 +003eba 6162 +003ebb 6573 .db "base" +003ebc 3eb2 .dw VE_HEAD + .set VE_HEAD = VE_BASE + XT_BASE: +003ebd 3858 .dw PFA_DOUSER + PFA_BASE: + .endif +003ebe 000c .dw USER_BASE + + .include "words/cells.asm" + + ; Arithmetics + ; n2 is the size in address units of n1 cells + VE_CELLS: +003ebf ff05 .dw $ff05 +003ec0 6563 +003ec1 6c6c +003ec2 0073 .db "cells",0 +003ec3 3eb9 .dw VE_HEAD + .set VE_HEAD = VE_CELLS + XT_CELLS: +003ec4 3a0c .dw PFA_2STAR + + .include "words/2dup.asm" + + ; Stack + ; Duplicate the 2 top elements + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_2DUP: +003ec5 ff04 .dw $ff04 +003ec6 6432 +003ec7 7075 .db "2dup" +003ec8 3ebf .dw VE_HEAD + .set VE_HEAD = VE_2DUP + XT_2DUP: +003ec9 3801 .dw DO_COLON + PFA_2DUP: + .endif + +003eca 38cf .dw XT_OVER +003ecb 38cf .dw XT_OVER +003ecc 3820 .dw XT_EXIT + .include "words/2drop.asm" + + ; Stack + ; Remove the 2 top elements + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_2DROP: +003ecd ff05 .dw $ff05 +003ece 6432 +003ecf 6f72 +003ed0 0070 .db "2drop",0 +003ed1 3ec5 .dw VE_HEAD + .set VE_HEAD = VE_2DROP + XT_2DROP: +003ed2 3801 .dw DO_COLON + PFA_2DROP: + .endif +003ed3 38d9 .dw XT_DROP +003ed4 38d9 .dw XT_DROP +003ed5 3820 .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: +003ed6 ff04 .dw $ff04 +003ed7 7574 +003ed8 6b63 .db "tuck" +003ed9 3ecd .dw VE_HEAD + .set VE_HEAD = VE_TUCK + XT_TUCK: +003eda 3801 .dw DO_COLON + PFA_TUCK: + .endif +003edb 38c4 .dw XT_SWAP +003edc 38cf .dw XT_OVER +003edd 3820 .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: +003ede ff03 .dw $ff03 +003edf 693e +003ee0 006e .db ">in",0 +003ee1 3ed6 .dw VE_HEAD + .set VE_HEAD = VE_TO_IN + XT_TO_IN: +003ee2 3858 .dw PFA_DOUSER + PFA_TO_IN: + .endif +003ee3 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: +003ee4 ff03 .dw $ff03 +003ee5 6170 +003ee6 0064 .db "pad",0 +003ee7 3ede .dw VE_HEAD + .set VE_HEAD = VE_PAD + XT_PAD: +003ee8 3801 .dw DO_COLON + PFA_PAD: + .endif +003ee9 3f23 .dw XT_HERE +003eea 383d .dw XT_DOLITERAL +003eeb 0028 .dw 40 +003eec 399d .dw XT_PLUS +003eed 3820 .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: +003eee ff04 .dw $ff04 +003eef 6d65 +003ef0 7469 .db "emit" +003ef1 3ee4 .dw VE_HEAD + .set VE_HEAD = VE_EMIT + XT_EMIT: +003ef2 3dff .dw PFA_DODEFER1 + PFA_EMIT: + .endif +003ef3 000e .dw USER_EMIT +003ef4 3dc8 .dw XT_UDEFERFETCH +003ef5 3dd4 .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: +003ef6 ff05 .dw $ff05 +003ef7 6d65 +003ef8 7469 +003ef9 003f .db "emit?",0 +003efa 3eee .dw VE_HEAD + .set VE_HEAD = VE_EMITQ + XT_EMITQ: +003efb 3dff .dw PFA_DODEFER1 + PFA_EMITQ: + .endif +003efc 0010 .dw USER_EMITQ +003efd 3dc8 .dw XT_UDEFERFETCH +003efe 3dd4 .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: +003eff ff03 .dw $ff03 +003f00 656b +003f01 0079 .db "key",0 +003f02 3ef6 .dw VE_HEAD + .set VE_HEAD = VE_KEY + XT_KEY: +003f03 3dff .dw PFA_DODEFER1 + PFA_KEY: + .endif +003f04 0012 .dw USER_KEY +003f05 3dc8 .dw XT_UDEFERFETCH +003f06 3dd4 .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: +003f07 ff04 .dw $ff04 +003f08 656b +003f09 3f79 .db "key?" +003f0a 3eff .dw VE_HEAD + .set VE_HEAD = VE_KEYQ + XT_KEYQ: +003f0b 3dff .dw PFA_DODEFER1 + PFA_KEYQ: + .endif +003f0c 0014 .dw USER_KEYQ +003f0d 3dc8 .dw XT_UDEFERFETCH +003f0e 3dd4 .dw XT_UDEFERSTORE + + .include "words/dp.asm" + + ; System Value + ; address of the next free dictionary cell + VE_DP: +003f0f ff02 .dw $ff02 +003f10 7064 .db "dp" +003f11 3f07 .dw VE_HEAD + .set VE_HEAD = VE_DP + XT_DP: +003f12 386f .dw PFA_DOVALUE1 + PFA_DP: +003f13 0036 .dw CFG_DP +003f14 3da0 .dw XT_EDEFERFETCH +003f15 3daa .dw XT_EDEFERSTORE + .include "words/ehere.asm" + + ; System Value + ; address of the next free address in eeprom + VE_EHERE: +003f16 ff05 .dw $ff05 +003f17 6865 +003f18 7265 +003f19 0065 .db "ehere",0 +003f1a 3f0f .dw VE_HEAD + .set VE_HEAD = VE_EHERE + XT_EHERE: +003f1b 386f .dw PFA_DOVALUE1 + PFA_EHERE: +003f1c 003a .dw EE_EHERE +003f1d 3da0 .dw XT_EDEFERFETCH +003f1e 3daa .dw XT_EDEFERSTORE + .include "words/here.asm" + + ; System Value + ; address of the next free data space (RAM) cell + VE_HERE: +003f1f ff04 .dw $ff04 +003f20 6568 +003f21 6572 .db "here" +003f22 3f16 .dw VE_HEAD + .set VE_HEAD = VE_HERE + XT_HERE: +003f23 386f .dw PFA_DOVALUE1 + PFA_HERE: +003f24 0038 .dw EE_HERE +003f25 3da0 .dw XT_EDEFERFETCH +003f26 3daa .dw XT_EDEFERSTORE + .include "words/allot.asm" + + ; System + ; allocate or release memory in RAM + VE_ALLOT: +003f27 ff05 .dw $ff05 +003f28 6c61 +003f29 6f6c +003f2a 0074 .db "allot",0 +003f2b 3f1f .dw VE_HEAD + .set VE_HEAD = VE_ALLOT + XT_ALLOT: +003f2c 3801 .dw DO_COLON + PFA_ALLOT: +003f2d 3f23 .dw XT_HERE +003f2e 399d .dw XT_PLUS +003f2f 01bf .dw XT_DOTO +003f30 3f24 .dw PFA_HERE +003f31 3820 .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: +003f32 ff03 .dw $ff03 +003f33 6962 +003f34 006e .db "bin",0 +003f35 3f27 .dw VE_HEAD + .set VE_HEAD = VE_BIN + XT_BIN: +003f36 3801 .dw DO_COLON + PFA_BIN: + .endif +003f37 3feb .dw XT_TWO +003f38 3ebd .dw XT_BASE +003f39 3881 .dw XT_STORE +003f3a 3820 .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: +003f3b ff07 .dw $ff07 +003f3c 6564 +003f3d 6963 +003f3e 616d +003f3f 006c .db "decimal",0 +003f40 3f32 .dw VE_HEAD + .set VE_HEAD = VE_DECIMAL + XT_DECIMAL: +003f41 3801 .dw DO_COLON + PFA_DECIMAL: + .endif +003f42 383d .dw XT_DOLITERAL +003f43 000a .dw 10 +003f44 3ebd .dw XT_BASE +003f45 3881 .dw XT_STORE +003f46 3820 .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: +003f47 ff03 .dw $ff03 +003f48 6568 +003f49 0078 .db "hex",0 +003f4a 3f3b .dw VE_HEAD + .set VE_HEAD = VE_HEX + XT_HEX: +003f4b 3801 .dw DO_COLON + PFA_HEX: + .endif +003f4c 383d .dw XT_DOLITERAL +003f4d 0010 .dw 16 +003f4e 3ebd .dw XT_BASE +003f4f 3881 .dw XT_STORE +003f50 3820 .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: +003f51 ff02 .dw $ff02 +003f52 6c62 .db "bl" +003f53 3f47 .dw VE_HEAD + .set VE_HEAD = VE_BL + XT_BL: +003f54 3848 .dw PFA_DOVARIABLE + PFA_BL: + .endif +003f55 0020 .dw 32 + + .include "words/turnkey.asm" + + ; System Value + ; Deferred action during startup/reset + VE_TURNKEY: +003f56 ff07 .dw $ff07 +003f57 7574 +003f58 6e72 +003f59 656b +003f5a 0079 .db "turnkey",0 +003f5b 3f51 .dw VE_HEAD + .set VE_HEAD = VE_TURNKEY + XT_TURNKEY: +003f5c 3dff .dw PFA_DODEFER1 + PFA_TURNKEY: +003f5d 0042 .dw CFG_TURNKEY +003f5e 3da0 .dw XT_EDEFERFETCH +003f5f 3daa .dw XT_EDEFERSTORE + .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: +003f60 ff07 .dw $ff07 +003f61 6f74 +003f62 7075 +003f63 6570 +003f64 0072 .db "toupper",0 +003f65 3f56 .dw VE_HEAD + .set VE_HEAD = VE_TOUPPER + XT_TOUPPER: +003f66 3801 .dw DO_COLON + PFA_TOUPPER: + .endif +003f67 38b1 .dw XT_DUP +003f68 383d .dw XT_DOLITERAL +003f69 0061 .dw 'a' +003f6a 383d .dw XT_DOLITERAL +003f6b 007b .dw 'z'+1 +003f6c 3e57 .dw XT_WITHIN +003f6d 3836 .dw XT_DOCONDBRANCH +003f6e 3f72 DEST(PFA_TOUPPER0) +003f6f 383d .dw XT_DOLITERAL +003f70 00df .dw 223 ; inverse of 0x20: 0xdf +003f71 3a13 .dw XT_AND + PFA_TOUPPER0: +003f72 3820 .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: +003f73 ff07 .dw $ff07 +003f74 6f74 +003f75 6f6c +003f76 6577 +003f77 0072 .db "tolower",0 +003f78 3f60 .dw VE_HEAD + .set VE_HEAD = VE_TOLOWER + XT_TOLOWER: +003f79 3801 .dw DO_COLON + PFA_TOLOWER: + .endif +003f7a 38b1 .dw XT_DUP +003f7b 383d .dw XT_DOLITERAL +003f7c 0041 .dw 'A' +003f7d 383d .dw XT_DOLITERAL +003f7e 005b .dw 'Z'+1 +003f7f 3e57 .dw XT_WITHIN +003f80 3836 .dw XT_DOCONDBRANCH +003f81 3f85 DEST(PFA_TOLOWER0) +003f82 383d .dw XT_DOLITERAL +003f83 0020 .dw 32 +003f84 3a1c .dw XT_OR + PFA_TOLOWER0: +003f85 3820 .dw XT_EXIT + + .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: +003f86 ff06 .dw $ff06 +003f87 733f +003f88 6174 +003f89 6b63 .db "?stack" +003f8a 3f73 .dw VE_HEAD + .set VE_HEAD = VE_QSTACK + XT_QSTACK: +003f8b 3801 .dw DO_COLON + PFA_QSTACK: + .endif +003f8c 05ed .dw XT_DEPTH +003f8d 3921 .dw XT_ZEROLESS +003f8e 3836 .dw XT_DOCONDBRANCH +003f8f 3f93 DEST(PFA_QSTACK1) +003f90 383d .dw XT_DOLITERAL +003f91 fffc .dw -4 +003f92 3d86 .dw XT_THROW + PFA_QSTACK1: +003f93 3820 .dw XT_EXIT + .include "words/bounds.asm" + + ; Tools + ; convert a string to an address range + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_BOUNDS: +003f94 ff06 .dw $ff06 +003f95 6f62 +003f96 6e75 +003f97 7364 .db "bounds" +003f98 3f86 .dw VE_HEAD + .set VE_HEAD = VE_BOUNDS + XT_BOUNDS: +003f99 3801 .dw DO_COLON + PFA_BOUNDS: + .endif +003f9a 38cf .dw XT_OVER +003f9b 399d .dw XT_PLUS +003f9c 38c4 .dw XT_SWAP +003f9d 3820 .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: +003f9e ff02 .dw 0xff02 +003f9f 7263 .db "cr" +003fa0 3f94 .dw VE_HEAD + .set VE_HEAD = VE_CR + XT_CR: +003fa1 3801 .dw DO_COLON + PFA_CR: + .endif + +003fa2 383d .dw XT_DOLITERAL +003fa3 000d .dw 13 +003fa4 3ef2 .dw XT_EMIT +003fa5 383d .dw XT_DOLITERAL +003fa6 000a .dw 10 +003fa7 3ef2 .dw XT_EMIT +003fa8 3820 .dw XT_EXIT + .include "words/space.asm" + + ; Character IO + ; emits a space (bl) + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_SPACE: +003fa9 ff05 .dw $ff05 +003faa 7073 +003fab 6361 +003fac 0065 .db "space",0 +003fad 3f9e .dw VE_HEAD + .set VE_HEAD = VE_SPACE + XT_SPACE: +003fae 3801 .dw DO_COLON + PFA_SPACE: + .endif +003faf 3f54 .dw XT_BL +003fb0 3ef2 .dw XT_EMIT +003fb1 3820 .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: +003fb2 ff06 .dw $ff06 +003fb3 7073 +003fb4 6361 +003fb5 7365 .db "spaces" +003fb6 3fa9 .dw VE_HEAD + .set VE_HEAD = VE_SPACES + XT_SPACES: +003fb7 3801 .dw DO_COLON + PFA_SPACES: + + .endif + ;C SPACES n -- output n spaces + ; BEGIN DUP 0> WHILE SPACE 1- REPEAT DROP ; +003fb8 3954 +003fb9 3e4a .DW XT_ZERO, XT_MAX +003fba 38b1 +003fbb 3836 SPCS1: .DW XT_DUP,XT_DOCONDBRANCH +003fbc 3fc1 DEST(SPCS2) +003fbd 3fae +003fbe 3a35 +003fbf 382f .DW XT_SPACE,XT_1MINUS,XT_DOBRANCH +003fc0 3fba DEST(SPCS1) +003fc1 38d9 +003fc2 3820 SPCS2: .DW XT_DROP,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: +003fc3 ff03 .dw $ff03 +003fc4 3e73 +003fc5 0064 .db "s>d",0 +003fc6 3fb2 .dw VE_HEAD + .set VE_HEAD = VE_S2D + XT_S2D: +003fc7 3801 .dw DO_COLON + PFA_S2D: + .endif +003fc8 38b1 .dw XT_DUP +003fc9 3921 .dw XT_ZEROLESS +003fca 3820 .dw XT_EXIT + .include "words/to-body.asm" + + ; Core + ; get body from XT + VE_TO_BODY: +003fcb ff05 .dw $ff05 +003fcc 623e +003fcd 646f +003fce 0079 .db ">body",0 +003fcf 3fc3 .dw VE_HEAD + .set VE_HEAD = VE_TO_BODY + XT_TO_BODY: +003fd0 3a30 .dw PFA_1PLUS + .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: +003fd1 0008 .dw $0008 +003fd2 6c32 +003fd3 7469 +003fd4 7265 +003fd5 6c61 .db "2literal" +003fd6 3fcb .dw VE_HEAD + .set VE_HEAD = VE_2LITERAL + XT_2LITERAL: +003fd7 3801 .dw DO_COLON + PFA_2LITERAL: + .endif +003fd8 38c4 .dw XT_SWAP +003fd9 077d .dw XT_LITERAL +003fda 077d .dw XT_LITERAL +003fdb 3820 .dw XT_EXIT + .include "words/equal.asm" + + ; Compare + ; compares two values for equality + VE_EQUAL: +003fdc ff01 .dw $ff01 +003fdd 003d .db "=",0 +003fde 3fd1 .dw VE_HEAD + .set VE_HEAD = VE_EQUAL + XT_EQUAL: +003fdf 3801 .dw DO_COLON + PFA_EQUAL: +003fe0 3993 .dw XT_MINUS +003fe1 391a .dw XT_ZEROEQUAL +003fe2 3820 .dw XT_EXIT + .include "words/num-constants.asm" + + .endif + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_ONE: +003fe3 ff01 .dw $ff01 +003fe4 0031 .db "1",0 +003fe5 3fdc .dw VE_HEAD + .set VE_HEAD = VE_ONE + XT_ONE: +003fe6 3848 .dw PFA_DOVARIABLE + PFA_ONE: + .endif +003fe7 0001 .DW 1 + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_TWO: +003fe8 ff01 .dw $ff01 +003fe9 0032 .db "2",0 +003fea 3fe3 .dw VE_HEAD + .set VE_HEAD = VE_TWO + XT_TWO: +003feb 3848 .dw PFA_DOVARIABLE + PFA_TWO: + .endif +003fec 0002 .DW 2 + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_MINUSONE: +003fed ff02 .dw $ff02 +003fee 312d .db "-1" +003fef 3fe8 .dw VE_HEAD + .set VE_HEAD = VE_MINUSONE + XT_MINUSONE: +003ff0 3848 .dw PFA_DOVARIABLE + PFA_MINUSONE: + .endif +003ff1 ffff .DW -1 + .include "dict_appl_core.inc" + + ; do not delete it! + + .set flashlast = pc + .if (pc>FLASHEND) + .endif + + .dseg + ; define a label for the 1st free ram address + HERESTART: + .eseg + .include "amforth-eeprom.inc" +000034 ff ff + ; some configs +000036 26 0b CFG_DP: .dw DPSTART ; Dictionary Pointer +000038 c2 01 EE_HERE: .dw HERESTART ; Memory Allocation +00003a 8e 00 EE_EHERE: .dw EHERESTART ; EEProm Memory Allocation +00003c ce 09 CFG_WLSCOPE: .dw XT_GET_CURRENT ; default wordlist scope +00003e 5c 00 CFG_FORTHRECOGNIZER: .dw CFG_RECOGNIZERLISTLEN ; Recognizer word set + ; LEAVE stack is between data stack and return stack. +000040 b0 08 CFG_LP0: .dw stackstart+1 +000042 78 0a CFG_TURNKEY: .dw XT_APPLTURNKEY ; TURNKEY +000044 ff 02 CFG_ENVIRONMENT:.dw VE_ENVHEAD ; environmental queries +000046 48 00 CFG_CURRENT: .dw CFG_FORTHWORDLIST ; forth-wordlist +000048 ed 3f CFG_FORTHWORDLIST:.dw VE_HEAD ; pre-defined (compiled in) wordlist + CFG_ORDERLISTLEN: +00004a 01 00 .dw 1 + CFG_ORDERLIST: ; list of wordlist id, exactly numwordlist entries +00004c 48 00 .dw CFG_FORTHWORDLIST ; get/set-order +00004e .byte (NUMWORDLISTS-1)*CELLSIZE ; one slot is already used + CFG_RECOGNIZERLISTLEN: +00005c 02 00 .dw 2 + CFG_RECOGNIZERLIST: +00005e 70 06 .dw XT_REC_FIND +000060 5c 06 .dw XT_REC_NUM +000062 .byte (NUMRECOGNIZERS-2)*CELLSIZE ; two slots are already used + + EE_STOREI: +000066 7e 3b .dw XT_DO_STOREI ; Store a cell into flash + + ; MARKER saves everything up to here. Nothing beyond gets saved + EE_MARKER: +000068 68 00 .dw EE_MARKER + + ; default user area + EE_INITUSER: +00006a 00 00 .dw 0 ; USER_STATE +00006c 00 00 .dw 0 ; USER_FOLLOWER +00006e ff 08 .dw rstackstart ; USER_RP +000070 af 08 .dw stackstart ; USER_SP0 +000072 af 08 .dw stackstart ; USER_SP + +000074 00 00 .dw 0 ; USER_HANDLER +000076 0a 00 .dw 10 ; USER_BASE + +000078 a3 00 .dw XT_TX ; USER_EMIT +00007a b1 00 .dw XT_TXQ ; USER_EMITQ +00007c 78 00 .dw XT_RX ; USER_KEY +00007e 93 00 .dw XT_RXQ ; USER_KEYQ +000080 77 02 .dw XT_SOURCETIB ; USER_SOURCE +000082 00 00 .dw 0 ; USER_G_IN +000084 64 02 .dw XT_REFILLTIB ; USER_REFILL +000086 c9 3c .dw XT_DEFAULT_PROMPTOK +000088 e8 3c .dw XT_DEFAULT_PROMPTERROR +00008a d8 3c .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: +00008c 19 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 + +"ATmega328P" register use summary: +r0 : 25 r1 : 5 r2 : 10 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: 89 r17: 61 r18: 61 r19: 37 r20: 13 r21: 11 r22: 11 r23: 3 +r24: 212 r25: 145 r26: 28 r27: 17 r28: 7 r29: 4 r30: 90 r31: 49 +x : 4 y : 217 z : 50 +Registers used: 29 out of 35 (82.9%) + +"ATmega328P" 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 : 3 brcs : 1 break : 0 breq : 6 brge : 1 brhc : 0 +brhs : 0 brid : 0 brie : 0 brlo : 1 brlt : 3 brmi : 3 +brne : 22 brpl : 0 brsh : 0 brtc : 0 brts : 0 brvc : 0 +brvs : 2 bset : 0 bst : 0 call : 2 cbi : 7 cbr : 1 +clc : 2 clh : 0 cli : 7 cln : 0 clr : 14 cls : 0 +clt : 0 clv : 0 clz : 0 com : 14 cp : 11 cpc : 10 +cpi : 2 cpse : 0 dec : 10 eor : 3 fmul : 0 fmuls : 0 +fmulsu: 0 icall : 0 ijmp : 1 in : 25 inc : 3 jmp : 13 +ld : 145 ldd : 4 ldi : 41 lds : 1 lpm : 16 lsl : 14 +lsr : 2 mov : 16 movw : 72 mul : 5 muls : 1 mulsu : 2 +neg : 0 nop : 0 or : 9 ori : 2 out : 22 pop : 49 +push : 43 rcall : 39 ret : 7 reti : 1 rjmp : 106 rol : 23 +ror : 6 sbc : 9 sbci : 3 sbi : 8 sbic : 3 sbis : 0 +sbiw : 16 sbr : 0 sbrc : 5 sbrs : 7 sec : 1 seh : 0 +sei : 1 sen : 0 ser : 4 ses : 0 set : 0 sev : 0 +sez : 0 sleep : 0 spm : 2 st : 81 std : 8 sts : 1 +sub : 6 subi : 3 swap : 0 tst : 0 wdr : 0 +Instructions used: 72 out of 113 (63.7%) + +"ATmega328P" memory use summary [bytes]: +Segment Begin End Code Data Used Size Use% +--------------------------------------------------------------- +[.cseg] 0x000000 0x007fe4 2082 11710 13792 32768 42.1% +[.dseg] 0x000100 0x0001c2 0 194 194 2048 9.5% +[.eseg] 0x000000 0x00008e 0 142 142 1024 13.9% + +Assembly complete, 0 errors, 8 warnings diff --git a/amforth-6.5/appl/eval-pollin/p328-16.map b/amforth-6.5/appl/eval-pollin/p328-16.map new file mode 100644 index 0000000..4d9ad44 --- /dev/null +++ b/amforth-6.5/appl/eval-pollin/p328-16.map @@ -0,0 +1,2054 @@ + +AVRASM ver. 2.1.52 p328-16.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 00000095 +EQU SIGNATURE_002 0000000f +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 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 ADMUX 0000007c +EQU ADCSRB 0000007b +EQU ADCSRA 0000007a +EQU ADCH 00000079 +EQU ADCL 00000078 +EQU TIMSK2 00000070 +EQU TIMSK1 0000006f +EQU TIMSK0 0000006e +EQU PCMSK1 0000006c +EQU PCMSK2 0000006d +EQU PCMSK0 0000006b +EQU EICRA 00000069 +EQU PCICR 00000068 +EQU OSCCAL 00000066 +EQU PRR 00000064 +EQU CLKPR 00000061 +EQU WDTCSR 00000060 +EQU SREG 0000003f +EQU SPL 0000003d +EQU SPH 0000003e +EQU SPMCSR 00000037 +EQU MCUCR 00000035 +EQU MCUSR 00000034 +EQU SMCR 00000033 +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 TIFR2 00000017 +EQU TIFR1 00000016 +EQU TIFR0 00000015 +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 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 TOIE1 00000000 +EQU OCIE1A 00000001 +EQU OCIE1B 00000002 +EQU ICIE1 00000005 +EQU TOV1 00000000 +EQU OCF1A 00000001 +EQU OCF1B 00000002 +EQU ICF1 00000005 +EQU WGM10 00000000 +EQU WGM11 00000001 +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 FOC1B 00000006 +EQU FOC1A 00000007 +EQU PSRSYNC 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 MUX0 00000000 +EQU MUX1 00000001 +EQU MUX2 00000002 +EQU MUX3 00000003 +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 ACME 00000006 +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 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 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 DDC0 00000000 +EQU DDC1 00000001 +EQU DDC2 00000002 +EQU DDC3 00000003 +EQU DDC4 00000004 +EQU DDC5 00000005 +EQU DDC6 00000006 +EQU PINC0 00000000 +EQU PINC1 00000001 +EQU PINC2 00000002 +EQU PINC3 00000003 +EQU PINC4 00000004 +EQU PINC5 00000005 +EQU PINC6 00000006 +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 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 PSR10 00000000 +EQU ISC00 00000000 +EQU ISC01 00000001 +EQU ISC10 00000002 +EQU ISC11 00000003 +EQU INT0 00000000 +EQU INT1 00000001 +EQU INTF0 00000000 +EQU INTF1 00000001 +EQU PCIE0 00000000 +EQU PCIE1 00000001 +EQU PCIE2 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 PCINT0 00000000 +EQU PCINT1 00000001 +EQU PCINT2 00000002 +EQU PCINT3 00000003 +EQU PCINT4 00000004 +EQU PCINT5 00000005 +EQU PCINT6 00000006 +EQU PCINT7 00000007 +EQU PCIF0 00000000 +EQU PCIF1 00000001 +EQU PCIF2 00000002 +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 WDP0 00000000 +EQU WDP1 00000001 +EQU WDP2 00000002 +EQU WDE 00000003 +EQU WDCE 00000004 +EQU WDP3 00000005 +EQU WDIE 00000006 +EQU WDIF 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 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 SELFPRGEN 00000000 +EQU PGERS 00000001 +EQU PGWRT 00000002 +EQU BLBSET 00000003 +EQU RWWSRE 00000004 +EQU RWWSB 00000006 +EQU SPMIE 00000007 +EQU IVCE 00000000 +EQU IVSEL 00000001 +EQU PUD 00000004 +EQU BODSE 00000005 +EQU BODS 00000006 +EQU PORF 00000000 +EQU EXTRF 00000001 +EQU EXTREF 00000001 +EQU BORF 00000002 +EQU WDRF 00000003 +EQU SE 00000000 +EQU SM0 00000001 +EQU SM1 00000002 +EQU SM2 00000003 +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 PRADC 00000000 +EQU PRUSART0 00000001 +EQU PRSPI 00000002 +EQU PRTIM1 00000003 +EQU PRTIM0 00000005 +EQU PRTIM2 00000006 +EQU PRTWI 00000007 +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 EEAR8 00000000 +EQU EEAR9 00000001 +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 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 DWEN 00000006 +EQU RSTDISBL 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 00003fff +EQU IOEND 000000ff +EQU SRAM_START 00000100 +EQU SRAM_SIZE 00000800 +EQU RAMEND 000008ff +EQU XRAMEND 00000000 +EQU E2END 000003ff +EQU EEPROMEND 000003ff +EQU EEADRBITS 0000000a +EQU NRWW_START_ADDR 00003800 +EQU NRWW_STOP_ADDR 00003fff +EQU RWW_START_ADDR 00000000 +EQU RWW_STOP_ADDR 000037ff +EQU PAGESIZE 00000040 +EQU FIRSTBOOTSTART 00003f00 +EQU SECONDBOOTSTART 00003e00 +EQU THIRDBOOTSTART 00003c00 +EQU FOURTHBOOTSTART 00003800 +EQU SMALLBOOTSTART 00003f00 +EQU LARGEBOOTSTART 00003800 +EQU INT0addr 00000002 +EQU INT1addr 00000004 +EQU PCI0addr 00000006 +EQU PCI1addr 00000008 +EQU PCI2addr 0000000a +EQU WDTaddr 0000000c +EQU OC2Aaddr 0000000e +EQU OC2Baddr 00000010 +EQU OVF2addr 00000012 +EQU ICP1addr 00000014 +EQU OC1Aaddr 00000016 +EQU OC1Baddr 00000018 +EQU OVF1addr 0000001a +EQU OC0Aaddr 0000001c +EQU OC0Baddr 0000001e +EQU OVF0addr 00000020 +EQU SPIaddr 00000022 +EQU URXCaddr 00000024 +EQU UDREaddr 00000026 +EQU UTXCaddr 00000028 +EQU ADCCaddr 0000002a +EQU ERDYaddr 0000002c +EQU ACIaddr 0000002e +EQU TWIaddr 00000030 +EQU SPMRaddr 00000032 +EQU INT_VECTORS_SIZE 00000034 +EQU ramstart 00000100 +EQU CELLSIZE 00000002 +SET WANT_USART0 00000000 +SET WANT_TWI 00000000 +SET WANT_TIMER_COUNTER_1 00000000 +SET WANT_TIMER_COUNTER_2 00000000 +SET WANT_AD_CONVERTER 00000000 +SET WANT_ANALOG_COMPARATOR 00000000 +SET WANT_PORTB 00000000 +SET WANT_PORTC 00000000 +SET WANT_PORTD 00000000 +SET WANT_TIMER_COUNTER_0 00000000 +SET WANT_EXTERNAL_INTERRUPT 00000000 +SET WANT_SPI 00000000 +SET WANT_WATCHDOG 00000000 +SET WANT_CPU 00000000 +SET WANT_EEPROM 00000000 +EQU intvecsize 00000002 +EQU pclen 00000002 +CSEG isr 00000129 +EQU INTVECTORS 0000001a +EQU SPMEN 00000000 +CSEG mcu_info 00000033 +CSEG mcu_ramsize 00000033 +CSEG mcu_eepromsize 00000034 +CSEG mcu_maxdp 00000035 +CSEG mcu_numints 00000036 +CSEG mcu_name 00000037 +SET codestart 0000003d +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 000008ff +SET stackstart 000008af +SET NUMWORDLISTS 00000008 +SET NUMRECOGNIZERS 00000004 +SET BAUD 00009600 +SET BAUD_MAXERROR 0000001e +SET VE_HEAD 00003fed +SET VE_ENVHEAD 000002ff +SET AMFORTH_RO_SEG 00003801 +EQU F_CPU 00f42400 +EQU TIMER_INT 00000012 +EQU BAUDRATE_LOW 000000c4 +EQU BAUDRATE_HIGH 000000c5 +EQU USART_C 000000c2 +EQU USART_B 000000c1 +EQU USART_A 000000c0 +EQU USART_DATA 000000c6 +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 00000100 +DSEG usart_rx_in 00000110 +DSEG usart_rx_out 00000111 +CSEG VE_TO_RXBUF 0000003d +CSEG XT_TO_RXBUF 00000043 +CSEG PFA_rx_tobuf 00000044 +CSEG DO_NEXT 00003805 +CSEG VE_ISR_RX 00000054 +CSEG XT_ISR_RX 00000059 +CSEG DO_COLON 00003801 +CSEG usart_rx_isr 0000005a +CSEG XT_DOLITERAL 0000383d +CSEG XT_CFETCH 00003898 +CSEG XT_DUP 000038b1 +CSEG XT_EQUAL 00003fdf +CSEG XT_DOCONDBRANCH 00003836 +CSEG usart_rx_isr1 00000064 +CSEG XT_COLD 00003d38 +CSEG XT_EXIT 00003820 +CSEG XT_USART_INIT_RX_BUFFER 00000066 +CSEG PFA_USART_INIT_RX_BUFFER 00000067 +CSEG XT_INTSTORE 00003ca5 +CSEG XT_ZERO 00003954 +CSEG XT_FILL 00003e98 +CSEG VE_RX_BUFFER 00000073 +CSEG XT_RX_BUFFER 00000078 +CSEG PFA_RX_BUFFER 00000079 +CSEG XT_RXQ_BUFFER 00000093 +CSEG XT_PLUS 0000399d +CSEG XT_SWAP 000038c4 +CSEG XT_1PLUS 00003a2f +CSEG XT_AND 00003a13 +CSEG XT_CSTORE 0000388d +CSEG VE_RXQ_BUFFER 0000008d +CSEG PFA_RXQ_BUFFER 00000094 +CSEG XT_PAUSE 00003d30 +CSEG XT_NOTEQUAL 00003913 +SET XT_RX 00000078 +SET XT_RXQ 00000093 +SET XT_USART_INIT_RX 00000066 +CSEG VE_TX_POLL 0000009d +CSEG XT_TX_POLL 000000a3 +CSEG PFA_TX_POLL 000000a4 +CSEG XT_TXQ_POLL 000000b1 +CSEG VE_TXQ_POLL 000000ab +CSEG PFA_TXQ_POLL 000000b2 +SET XT_TX 000000a3 +SET XT_TXQ 000000b1 +SET XT_USART_INIT_TX 00000000 +CSEG VE_UBRR 000000ba +CSEG XT_UBRR 000000be +CSEG PFA_DOVALUE1 0000386f +CSEG PFA_UBRR 000000bf +ESEG EE_UBRRVAL 0000008c +CSEG XT_EDEFERFETCH 00003da0 +CSEG XT_EDEFERSTORE 00003daa +CSEG VE_USART 000000c2 +CSEG XT_USART 000000c7 +CSEG PFA_USART 000000c8 +CSEG XT_BYTESWAP 00003af9 +EQU OW_PORT 00000005 +EQU OW_BIT 00000004 +SET OW_DDR 00000004 +SET OW_PIN 00000003 +CSEG VE_OW_RESET 000000dd +CSEG XT_OW_RESET 000000e3 +CSEG PFA_OW_RESET 000000e4 +SET cycles 00000000 +SET loop_cycles 00000fa0 +CSEG VE_OW_SLOT 00000101 +CSEG XT_OW_SLOT 00000107 +CSEG PFA_OW_SLOT 00000108 +CSEG PFA_OW_SLOT0 00000115 +SET AMFORTH_NRWW_SIZE 00000ffc +SET corepc 00000129 +CSEG PFA_COLD 00003d39 +ESEG intvec 00000000 +DSEG intcnt 00000112 +CSEG VE_MPLUS 00000140 +CSEG XT_MPLUS 00000143 +CSEG PFA_MPLUS 00000144 +CSEG XT_S2D 00003fc7 +CSEG XT_DPLUS 00003c15 +CSEG VE_UDSTAR 00000147 +CSEG XT_UDSTAR 0000014b +CSEG PFA_UDSTAR 0000014c +CSEG XT_TO_R 000038ff +CSEG XT_UMSTAR 000039e0 +CSEG XT_DROP 000038d9 +CSEG XT_R_FROM 000038f6 +CSEG XT_ROT 000038e1 +CSEG VE_UMAX 00000156 +CSEG XT_UMAX 0000015a +CSEG PFA_UMAX 0000015b +CSEG XT_2DUP 00003ec9 +CSEG XT_ULESS 0000395c +CSEG UMAX1 00000160 +CSEG VE_UMIN 00000162 +CSEG XT_UMIN 00000166 +CSEG PFA_UMIN 00000167 +CSEG XT_UGREATER 00003967 +CSEG UMIN1 0000016c +CSEG XT_IMMEDIATEQ 0000016e +CSEG PFA_IMMEDIATEQ 0000016f +CSEG XT_ZEROEQUAL 0000391a +CSEG IMMEDIATEQ1 00000177 +CSEG XT_ONE 00003fe6 +CSEG XT_TRUE 0000394b +CSEG VE_NAME2FLAGS 00000179 +CSEG XT_NAME2FLAGS 00000180 +CSEG PFA_NAME2FLAGS 00000181 +CSEG XT_FETCHI 00003bcb +CSEG VE_DOT_VER 00000186 +CSEG XT_DOT_VER 0000018a +CSEG PFA_DOT_VER 0000018b +CSEG XT_ENV_FORTHNAME 000002da +CSEG XT_ITYPE 00000403 +CSEG XT_SPACE 00003fae +CSEG XT_BASE 00003ebd +CSEG XT_FETCH 00003879 +CSEG XT_ENV_FORTHVERSION 000002e8 +CSEG XT_DECIMAL 00003f41 +CSEG XT_L_SHARP 00000321 +CSEG XT_SHARP 00000329 +CSEG XT_HOLD 00000312 +CSEG XT_SHARP_S 0000033f +CSEG XT_SHARP_G 0000034a +CSEG XT_TYPE 00000439 +CSEG XT_STORE 00003881 +CSEG XT_ENV_CPU 000002f0 +CSEG VE_NOOP 000001a1 +CSEG XT_NOOP 000001a5 +CSEG PFA_NOOP 000001a6 +CSEG VE_UNUSED 000001a7 +CSEG XT_UNUSED 000001ac +CSEG PFA_UNUSED 000001ad +CSEG XT_SP_FETCH 00003a8d +CSEG XT_HERE 00003f23 +CSEG XT_MINUS 00003993 +CSEG VE_TO 000001b1 +CSEG XT_TO 000001b4 +CSEG PFA_TO 000001b5 +CSEG XT_TICK 00000448 +CSEG XT_TO_BODY 00003fd0 +CSEG XT_STATE 00003eb7 +CSEG PFA_TO1 000001c5 +CSEG XT_COMPILE 0000075c +CSEG XT_DOTO 000001bf +CSEG XT_COMMA 00000767 +CSEG PFA_DOTO 000001c0 +CSEG XT_ICELLPLUS 000001d1 +CSEG XT_EXECUTE 0000382a +CSEG VE_ICELLPLUS 000001cb +CSEG PFA_ICELLPLUS 000001d2 +CSEG VE_ICOMPARE 000001d4 +CSEG XT_ICOMPARE 000001da +CSEG PFA_ICOMPARE 000001db +CSEG XT_OVER 000038cf +CSEG PFA_ICOMPARE_SAMELEN 000001e5 +CSEG XT_2DROP 00003ed2 +CSEG XT_QDOCHECK 00000826 +CSEG PFA_ICOMPARE_DONE 00000208 +CSEG XT_DODO 00003a9b +CSEG PFA_ICOMPARE_LOOP 000001eb +CSEG PFA_ICOMPARE_LASTCELL 000001f9 +CSEG PFA_ICOMPARE_NEXTLOOP 00000200 +CSEG XT_UNLOOP 00003ad4 +CSEG XT_CELLPLUS 00003c90 +CSEG XT_DOPLUSLOOP 00003aba +CSEG VE_STAR 0000020b +CSEG XT_STAR 0000020e +CSEG PFA_STAR 0000020f +CSEG XT_MSTAR 000039a6 +CSEG VE_J 00000212 +CSEG XT_J 00000215 +CSEG PFA_J 00000216 +CSEG XT_RP_FETCH 00003a76 +CSEG VE_DABS 00000222 +CSEG XT_DABS 00000226 +CSEG PFA_DABS 00000227 +CSEG XT_ZEROLESS 00003921 +CSEG PFA_DABS1 0000022c +CSEG XT_DNEGATE 00000233 +CSEG VE_DNEGATE 0000022d +CSEG PFA_DNEGATE 00000234 +CSEG XT_DINVERT 00003c3b +CSEG VE_CMOVE 00000239 +CSEG XT_CMOVE 0000023e +CSEG PFA_CMOVE 0000023f +CSEG PFA_CMOVE1 0000024c +CSEG PFA_CMOVE2 00000248 +CSEG VE_2SWAP 00000252 +CSEG XT_2SWAP 00000257 +CSEG PFA_2SWAP 00000258 +CSEG VE_REFILLTIB 0000025d +CSEG XT_REFILLTIB 00000264 +CSEG PFA_REFILLTIB 00000265 +CSEG XT_TIB 00000280 +CSEG XT_ACCEPT 00000498 +CSEG XT_NUMBERTIB 00000286 +CSEG XT_TO_IN 00003ee2 +CSEG VE_SOURCETIB 00000270 +CSEG XT_SOURCETIB 00000277 +CSEG PFA_SOURCETIB 00000278 +CSEG VE_TIB 0000027c +CSEG PFA_DOVARIABLE 00003848 +CSEG PFA_TIB 00000281 +DSEG ram_tib 0000012c +CSEG VE_NUMBERTIB 00000282 +CSEG PFA_NUMBERTIB 00000287 +DSEG ram_sharptib 00000186 +CSEG VE_EE2RAM 00000288 +CSEG XT_EE2RAM 0000028d +CSEG PFA_EE2RAM 0000028e +CSEG PFA_EE2RAM_1 00000290 +CSEG XT_FETCHE 00003b5f +CSEG XT_DOLOOP 00003ac9 +CSEG PFA_EE2RAM_2 0000029a +CSEG VE_INIT_RAM 0000029c +CSEG XT_INIT_RAM 000002a2 +CSEG PFA_INI_RAM 000002a3 +ESEG EE_INITUSER 0000006a +CSEG XT_UP_FETCH 00003b02 +CSEG XT_2SLASH 00003a04 +CSEG VE_ENVIRONMENT 000002ab +CSEG XT_ENVIRONMENT 000002b3 +CSEG PFA_ENVIRONMENT 000002b4 +ESEG CFG_ENVIRONMENT 00000044 +CSEG VE_ENVWORDLISTS 000002b5 +CSEG XT_ENVWORDLISTS 000002bc +CSEG PFA_ENVWORDLISTS 000002bd +CSEG VE_ENVSLASHPAD 000002c0 +CSEG XT_ENVSLASHPAD 000002c4 +CSEG PFA_ENVSLASHPAD 000002c5 +CSEG XT_PAD 00003ee8 +CSEG VE_ENVSLASHHOLD 000002c9 +CSEG XT_ENVSLASHHOLD 000002ce +CSEG PFA_ENVSLASHHOLD 000002cf +CSEG VE_ENV_FORTHNAME 000002d3 +CSEG PFA_EN_FORTHNAME 000002db +CSEG XT_DOSLITERAL 000003d0 +CSEG VE_ENV_FORTHVERSION 000002e2 +CSEG PFA_EN_FORTHVERSION 000002e9 +CSEG VE_ENV_CPU 000002ec +CSEG PFA_EN_CPU 000002f1 +CSEG XT_ICOUNT 0000042f +CSEG VE_ENV_MCUINFO 000002f5 +CSEG XT_ENV_MCUINFO 000002fb +CSEG PFA_EN_MCUINFO 000002fc +CSEG VE_ENVUSERSIZE 000002ff +CSEG XT_ENVUSERSIZE 00000304 +CSEG PFA_ENVUSERSIZE 00000305 +CSEG VE_HLD 00000308 +CSEG XT_HLD 0000030c +CSEG PFA_HLD 0000030d +DSEG ram_hld 00000188 +CSEG VE_HOLD 0000030e +CSEG PFA_HOLD 00000313 +CSEG XT_1MINUS 00003a35 +CSEG VE_L_SHARP 0000031e +CSEG PFA_L_SHARP 00000322 +CSEG VE_SHARP 00000326 +CSEG PFA_SHARP 0000032a +CSEG XT_UDSLASHMOD 000003a6 +CSEG XT_LESS 0000396e +CSEG PFA_SHARP1 00000337 +CSEG VE_SHARP_S 0000033c +CSEG PFA_SHARP_S 00000340 +CSEG NUMS1 00000340 +CSEG XT_OR 00003a1c +CSEG VE_SHARP_G 00000347 +CSEG PFA_SHARP_G 0000034b +CSEG VE_SIGN 00000352 +CSEG XT_SIGN 00000356 +CSEG PFA_SIGN 00000357 +CSEG PFA_SIGN1 0000035d +CSEG VE_DDOTR 0000035e +CSEG XT_DDOTR 00000362 +CSEG PFA_DDOTR 00000363 +CSEG XT_TUCK 00003eda +CSEG XT_SPACES 00003fb7 +CSEG VE_DOTR 00000371 +CSEG XT_DOTR 00000374 +CSEG PFA_DOTR 00000375 +CSEG VE_DDOT 0000037a +CSEG XT_DDOT 0000037d +CSEG PFA_DDOT 0000037e +CSEG VE_DOT 00000382 +CSEG XT_DOT 00000385 +CSEG PFA_DOT 00000386 +CSEG VE_UDDOT 00000389 +CSEG XT_UDDOT 0000038d +CSEG PFA_UDDOT 0000038e +CSEG XT_UDDOTR 00000396 +CSEG VE_UDDOTR 00000392 +CSEG PFA_UDDOTR 00000397 +CSEG VE_UDSLASHMOD 000003a1 +CSEG PFA_UDSLASHMOD 000003a7 +CSEG XT_R_FETCH 00003908 +CSEG XT_UMSLASHMOD 000039c2 +CSEG VE_DIGITQ 000003b1 +CSEG XT_DIGITQ 000003b6 +CSEG PFA_DIGITQ 000003b7 +CSEG XT_TOUPPER 00003f66 +CSEG XT_GREATER 00003978 +CSEG PFA_DOSLITERAL 000003d1 +CSEG VE_SCOMMA 000003db +CSEG XT_SCOMMA 000003de +CSEG PFA_SCOMMA 000003df +CSEG XT_DOSCOMMA 000003e2 +CSEG PFA_DOSCOMMA 000003e3 +CSEG XT_2STAR 00003a0b +CSEG PFA_SCOMMA2 000003f5 +CSEG PFA_SCOMMA1 000003ef +CSEG XT_GREATERZERO 00003928 +CSEG PFA_SCOMMA3 000003fc +CSEG VE_ITYPE 000003fe +CSEG PFA_ITYPE 00000404 +CSEG PFA_ITYPE2 00000417 +CSEG PFA_ITYPE1 0000040f +CSEG XT_LOWEMIT 00000424 +CSEG XT_HIEMIT 00000420 +CSEG PFA_ITYPE3 0000041e +CSEG PFA_HIEMIT 00000421 +CSEG PFA_LOWEMIT 00000425 +CSEG XT_EMIT 00003ef2 +CSEG VE_ICOUNT 0000042a +CSEG PFA_ICOUNT 00000430 +CSEG VE_TYPE 00000435 +CSEG PFA_TYPE 0000043a +CSEG XT_BOUNDS 00003f99 +CSEG PFA_TYPE2 00000444 +CSEG PFA_TYPE1 0000043f +CSEG XT_I 00003aac +CSEG VE_TICK 00000445 +CSEG PFA_TICK 00000449 +CSEG XT_PARSENAME 000005bb +CSEG XT_FORTHRECOGNIZER 000005fe +CSEG XT_RECOGNIZE 00000609 +CSEG XT_DT_NULL 00000696 +CSEG PFA_TICK1 0000045a +CSEG XT_THROW 00003d86 +CSEG VE_CSKIP 0000045c +CSEG XT_CSKIP 00000461 +CSEG PFA_CSKIP 00000462 +CSEG PFA_CSKIP1 00000463 +CSEG PFA_CSKIP2 00000470 +CSEG XT_SLASHSTRING 000005ac +CSEG XT_DOBRANCH 0000382f +CSEG VE_CSCAN 00000473 +CSEG XT_CSCAN 00000478 +CSEG PFA_CSCAN 00000479 +CSEG PFA_CSCAN1 0000047b +CSEG PFA_CSCAN2 0000048d +CSEG XT_NIP 000038f0 +CSEG VE_ACCEPT 00000493 +CSEG PFA_ACCEPT 00000499 +CSEG ACC1 0000049d +CSEG XT_KEY 00003f03 +CSEG XT_CRLFQ 000004d9 +CSEG ACC5 000004cb +CSEG ACC3 000004bb +CSEG ACC6 000004b9 +CSEG XT_BS 000004d1 +CSEG ACC4 000004c9 +CSEG XT_BL 00003f54 +CSEG PFA_ACCEPT6 000004c2 +CSEG XT_CR 00003fa1 +CSEG VE_REFILL 000004e4 +CSEG XT_REFILL 000004e9 +CSEG PFA_DODEFER1 00003dff +CSEG PFA_REFILL 000004ea +CSEG XT_UDEFERFETCH 00003dc8 +CSEG XT_UDEFERSTORE 00003dd4 +CSEG VE_CHAR 000004ed +CSEG XT_CHAR 000004f1 +CSEG PFA_CHAR 000004f2 +CSEG VE_NUMBER 000004f6 +CSEG XT_NUMBER 000004fb +CSEG PFA_NUMBER 000004fc +CSEG XT_QSIGN 0000053f +CSEG XT_SET_BASE 00000552 +CSEG PFA_NUMBER0 00000512 +CSEG XT_2TO_R 00003b1e +CSEG XT_2R_FROM 00003b2d +CSEG XT_TO_NUMBER 00000570 +CSEG XT_QDUP 000038b9 +CSEG PFA_NUMBER1 00000534 +CSEG PFA_NUMBER2 0000052b +CSEG PFA_NUMBER6 0000052c +CSEG PFA_NUMBER3 00000528 +CSEG XT_TWO 00003feb +CSEG PFA_NUMBER5 0000053a +CSEG PFA_NUMBER4 00000539 +CSEG XT_NEGATE 00003e27 +CSEG PFA_QSIGN 00000540 +CSEG PFA_NUMBERSIGN_DONE 0000054b +CSEG XT_BASES 0000054d +CSEG PFA_DOCONSTANT 00003852 +CSEG PFA_SET_BASE 00000553 +CSEG XT_WITHIN 00003e57 +CSEG SET_BASE1 00000568 +CSEG SET_BASE2 00000569 +CSEG VE_TO_NUMBER 0000056a +CSEG TONUM1 00000571 +CSEG TONUM3 00000588 +CSEG TONUM2 0000057c +CSEG VE_PARSE 00000589 +CSEG XT_PARSE 0000058e +CSEG PFA_PARSE 0000058f +CSEG XT_SOURCE 000005a2 +CSEG XT_PLUSSTORE 00003a65 +CSEG VE_SOURCE 0000059d +CSEG PFA_SOURCE 000005a3 +CSEG VE_SLASHSTRING 000005a6 +CSEG PFA_SLASHSTRING 000005ad +CSEG VE_PARSENAME 000005b4 +CSEG PFA_PARSENAME 000005bc +CSEG XT_SKIPSCANCHAR 000005bf +CSEG PFA_SKIPSCANCHAR 000005c0 +CSEG VE_SP0 000005d1 +CSEG XT_SP0 000005d5 +CSEG PFA_SP0 000005d6 +CSEG VE_SP 000005d9 +CSEG XT_SP 000005dc +CSEG PFA_DOUSER 00003858 +CSEG PFA_SP 000005dd +CSEG VE_RP0 000005de +CSEG XT_RP0 000005e2 +CSEG PFA_RP0 000005e3 +CSEG XT_DORP0 000005e6 +CSEG PFA_DORP0 000005e7 +CSEG VE_DEPTH 000005e8 +CSEG XT_DEPTH 000005ed +CSEG PFA_DEPTH 000005ee +CSEG VE_FORTHRECOGNIZER 000005f4 +CSEG PFA_FORTHRECOGNIZER 000005ff +ESEG CFG_FORTHRECOGNIZER 0000003e +CSEG VE_RECOGNIZE 00000602 +CSEG PFA_RECOGNIZE 0000060a +CSEG XT_RECOGNIZE_A 00000614 +CSEG XT_MAPSTACK 000009a7 +CSEG PFA_RECOGNIZE1 00000613 +CSEG PFA_RECOGNIZE_A 00000615 +CSEG PFA_RECOGNIZE_A1 00000625 +CSEG VE_INTERPRET 00000629 +CSEG XT_INTERPRET 00000630 +CSEG PFA_INTERPRET 00000631 +CSEG PFA_INTERPRET2 00000641 +CSEG PFA_INTERPRET1 0000063c +CSEG XT_QSTACK 00003f8b +CSEG VE_DT_NUM 00000643 +CSEG XT_DT_NUM 00000648 +CSEG PFA_DT_NUM 00000649 +CSEG XT_LITERAL 0000077d +CSEG VE_DT_DNUM 0000064c +CSEG XT_DT_DNUM 00000652 +CSEG PFA_DT_DNUM 00000653 +CSEG XT_2LITERAL 00003fd7 +CSEG VE_REC_NUM 00000656 +CSEG XT_REC_NUM 0000065c +CSEG PFA_REC_NUM 0000065d +CSEG PFA_REC_NONUMBER 00000668 +CSEG PFA_REC_INTNUM2 00000666 +CSEG VE_REC_FIND 0000066a +CSEG XT_REC_FIND 00000670 +CSEG PFA_REC_FIND 00000671 +CSEG XT_FINDXT 0000070b +CSEG PFA_REC_WORD_FOUND 00000679 +CSEG XT_DT_XT 00000680 +CSEG VE_DT_XT 0000067b +CSEG PFA_DT_XT 00000681 +CSEG XT_R_WORD_INTERPRET 00000684 +CSEG XT_R_WORD_COMPILE 00000688 +CSEG PFA_R_WORD_INTERPRET 00000685 +CSEG PFA_R_WORD_COMPILE 00000689 +CSEG PFA_R_WORD_COMPILE1 0000068e +CSEG VE_DT_NULL 00000690 +CSEG PFA_DT_NULL 00000697 +CSEG XT_FAIL 0000069a +CSEG PFA_FAIL 0000069b +CSEG VE_SEARCH_WORDLIST 0000069e +CSEG XT_SEARCH_WORDLIST 000006a8 +CSEG PFA_SEARCH_WORDLIST 000006a9 +CSEG XT_ISWORD 000006bd +CSEG XT_TRAVERSEWORDLIST 000006da +CSEG PFA_SEARCH_WORDLIST1 000006b7 +CSEG XT_NFA2CFA 00000701 +CSEG PFA_ISWORD 000006be +CSEG XT_NAME2STRING 000006f5 +CSEG PFA_ISWORD3 000006cb +CSEG VE_TRAVERSEWORDLIST 000006cf +CSEG PFA_TRAVERSEWORDLIST 000006db +CSEG PFA_TRAVERSEWORDLIST1 000006dc +CSEG PFA_TRAVERSEWORDLIST2 000006eb +CSEG XT_NFA2LFA 00000a16 +CSEG VE_NAME2STRING 000006ed +CSEG PFA_NAME2STRING 000006f6 +CSEG VE_NFA2CFA 000006fb +CSEG PFA_NFA2CFA 00000702 +CSEG VE_FINDXT 00000705 +CSEG PFA_FINDXT 0000070c +CSEG XT_FINDXTA 00000717 +ESEG CFG_ORDERLISTLEN 0000004a +CSEG PFA_FINDXT1 00000716 +CSEG PFA_FINDXTA 00000718 +CSEG PFA_FINDXTA1 00000724 +CSEG VE_NEWEST 00000725 +CSEG XT_NEWEST 0000072a +CSEG PFA_NEWEST 0000072b +DSEG ram_newest 0000018a +CSEG VE_LATEST 0000072c +CSEG XT_LATEST 00000731 +CSEG PFA_LATEST 00000732 +DSEG ram_latest 0000018e +CSEG VE_DOCREATE 00000733 +CSEG XT_DOCREATE 00000739 +CSEG PFA_DOCREATE 0000073a +CSEG XT_WLSCOPE 00000890 +CSEG XT_HEADER 00000875 +CSEG VE_BACKSLASH 00000744 +CSEG XT_BACKSLASH 00000747 +CSEG PFA_BACKSLASH 00000748 +CSEG VE_LPAREN 0000074d +CSEG XT_LPAREN 00000750 +CSEG PFA_LPAREN 00000751 +CSEG VE_COMPILE 00000756 +CSEG PFA_COMPILE 0000075d +CSEG VE_COMMA 00000764 +CSEG PFA_COMMA 00000768 +CSEG XT_DP 00003f12 +CSEG XT_STOREI 00003b73 +CSEG PFA_DP 00003f13 +CSEG VE_BRACKETTICK 0000076f +CSEG XT_BRACKETTICK 00000773 +CSEG PFA_BRACKETTICK 00000774 +CSEG VE_LITERAL 00000777 +CSEG PFA_LITERAL 0000077e +CSEG VE_SLITERAL 00000782 +CSEG XT_SLITERAL 00000788 +CSEG PFA_SLITERAL 00000789 +CSEG XT_GMARK 0000078d +CSEG PFA_GMARK 0000078e +CSEG XT_GRESOLVE 00000792 +CSEG PFA_GRESOLVE 00000793 +CSEG XT_LMARK 00000798 +CSEG PFA_LMARK 00000799 +CSEG XT_LRESOLVE 0000079b +CSEG PFA_LRESOLVE 0000079c +CSEG VE_AHEAD 0000079f +CSEG XT_AHEAD 000007a4 +CSEG PFA_AHEAD 000007a5 +CSEG VE_IF 000007a9 +CSEG XT_IF 000007ac +CSEG PFA_IF 000007ad +CSEG VE_ELSE 000007b1 +CSEG XT_ELSE 000007b5 +CSEG PFA_ELSE 000007b6 +CSEG VE_THEN 000007bc +CSEG XT_THEN 000007c0 +CSEG PFA_THEN 000007c1 +CSEG VE_BEGIN 000007c3 +CSEG XT_BEGIN 000007c8 +CSEG PFA_BEGIN 000007c9 +CSEG VE_WHILE 000007cb +CSEG XT_WHILE 000007d0 +CSEG PFA_WHILE 000007d1 +CSEG VE_REPEAT 000007d4 +CSEG XT_REPEAT 000007d9 +CSEG PFA_REPEAT 000007da +CSEG XT_AGAIN 000007ed +CSEG VE_UNTIL 000007dd +CSEG XT_UNTIL 000007e2 +CSEG PFA_UNTIL 000007e3 +CSEG VE_AGAIN 000007e8 +CSEG PFA_AGAIN 000007ee +CSEG VE_DO 000007f2 +CSEG XT_DO 000007f5 +CSEG PFA_DO 000007f6 +CSEG XT_TO_L 00000850 +CSEG VE_LOOP 000007fc +CSEG XT_LOOP 00000800 +CSEG PFA_LOOP 00000801 +CSEG XT_ENDLOOP 00000837 +CSEG VE_PLUSLOOP 00000805 +CSEG XT_PLUSLOOP 0000080a +CSEG PFA_PLUSLOOP 0000080b +CSEG VE_LEAVE 0000080f +CSEG XT_LEAVE 00000814 +CSEG PFA_LEAVE 00000815 +CSEG VE_QDO 0000081a +CSEG XT_QDO 0000081e +CSEG PFA_QDO 0000081f +CSEG PFA_QDOCHECK 00000827 +CSEG PFA_QDOCHECK1 0000082e +CSEG XT_INVERT 000039fd +CSEG VE_ENDLOOP 00000831 +CSEG PFA_ENDLOOP 00000838 +CSEG LOOP1 00000839 +CSEG XT_L_FROM 00000844 +CSEG LOOP2 00000840 +CSEG VE_L_FROM 00000841 +CSEG PFA_L_FROM 00000845 +CSEG XT_LP 00000863 +CSEG VE_TO_L 0000084d +CSEG PFA_TO_L 00000851 +CSEG VE_LP0 00000858 +CSEG XT_LP0 0000085c +CSEG PFA_LP0 0000085d +ESEG CFG_LP0 00000040 +CSEG VE_LP 00000860 +CSEG PFA_LP 00000864 +DSEG ram_lp 00000190 +CSEG VE_CREATE 00000865 +CSEG XT_CREATE 0000086a +CSEG PFA_CREATE 0000086b +CSEG XT_REVEAL 00000899 +CSEG VE_HEADER 00000870 +CSEG PFA_HEADER 00000876 +CSEG PFA_HEADER1 00000887 +CSEG VE_WLSCOPE 0000088a +CSEG PFA_WLSCOPE 00000891 +ESEG CFG_WLSCOPE 0000003c +CSEG VE_REVEAL 00000894 +CSEG PFA_REVEAL 0000089a +CSEG REVEAL1 000008a4 +CSEG XT_STOREE 00003b3b +CSEG VE_DOES 000008a5 +CSEG XT_DOES 000008aa +CSEG PFA_DOES 000008ab +CSEG XT_DODOES 000008bd +CSEG DO_DODOES 000008b2 +CSEG PFA_DODOES 000008be +CSEG VE_COLON 000008c6 +CSEG XT_COLON 000008c9 +CSEG PFA_COLON 000008ca +CSEG XT_COLONNONAME 000008d4 +CSEG VE_COLONNONAME 000008ce +CSEG PFA_COLONNONAME 000008d5 +CSEG XT_RBRACKET 000008e9 +CSEG VE_SEMICOLON 000008dd +CSEG XT_SEMICOLON 000008e0 +CSEG PFA_SEMICOLON 000008e1 +CSEG XT_LBRACKET 000008f1 +CSEG VE_RBRACKET 000008e6 +CSEG PFA_RBRACKET 000008ea +CSEG VE_LBRACKET 000008ee +CSEG PFA_LBRACKET 000008f2 +CSEG VE_VARIABLE 000008f6 +CSEG XT_VARIABLE 000008fc +CSEG PFA_VARIABLE 000008fd +CSEG XT_CONSTANT 00000908 +CSEG XT_ALLOT 00003f2c +CSEG VE_CONSTANT 00000902 +CSEG PFA_CONSTANT 00000909 +CSEG VE_USER 0000090f +CSEG XT_USER 00000913 +CSEG PFA_USER 00000914 +CSEG VE_RECURSE 0000091a +CSEG XT_RECURSE 00000920 +CSEG PFA_RECURSE 00000921 +CSEG VE_IMMEDIATE 00000925 +CSEG XT_IMMEDIATE 0000092c +CSEG PFA_IMMEDIATE 0000092d +CSEG XT_GET_CURRENT 000009ce +CSEG VE_BRACKETCHAR 00000937 +CSEG XT_BRACKETCHAR 0000093c +CSEG PFA_BRACKETCHAR 0000093d +CSEG VE_ABORTQUOTE 00000942 +CSEG XT_ABORTQUOTE 00000947 +CSEG PFA_ABORTQUOTE 00000948 +CSEG XT_SQUOTE 00003e8a +CSEG XT_QABORT 00000959 +CSEG VE_ABORT 0000094c +CSEG XT_ABORT 00000951 +CSEG PFA_ABORT 00000952 +CSEG VE_QABORT 00000954 +CSEG PFA_QABORT 0000095a +CSEG QABO1 0000095f +CSEG VE_GET_STACK 00000961 +CSEG XT_GET_STACK 00000968 +CSEG PFA_N_FETCH_E2 0000097f +CSEG PFA_N_FETCH_E1 00000975 +CSEG XT_CELLS 00003ec4 +CSEG VE_SET_STACK 00000982 +CSEG XT_SET_STACK 00000989 +CSEG PFA_SET_STACK 0000098a +CSEG PFA_SET_STACK0 00000991 +CSEG PFA_SET_STACK2 0000099e +CSEG PFA_SET_STACK1 00000999 +CSEG VE_MAPSTACK 000009a0 +CSEG PFA_MAPSTACK 000009a8 +CSEG PFA_MAPSTACK3 000009c3 +CSEG PFA_MAPSTACK1 000009b2 +CSEG PFA_MAPSTACK2 000009bf +CSEG VE_GET_CURRENT 000009c6 +CSEG PFA_GET_CURRENT 000009cf +ESEG CFG_CURRENT 00000046 +CSEG VE_GET_ORDER 000009d3 +CSEG XT_GET_ORDER 000009da +CSEG PFA_GET_ORDER 000009db +CSEG VE_CFG_ORDER 000009df +CSEG XT_CFG_ORDER 000009e6 +CSEG PFA_CFG_ORDER 000009e7 +CSEG VE_COMPARE 000009e8 +CSEG XT_COMPARE 000009ee +CSEG PFA_COMPARE 000009ef +CSEG PFA_COMPARE_LOOP 000009fb +CSEG PFA_COMPARE_NOTEQUAL 00000a09 +CSEG PFA_COMPARE_ENDREACHED2 00000a04 +CSEG PFA_COMPARE_ENDREACHED 00000a05 +CSEG PFA_COMPARE_CHECKLASTCHAR 00000a09 +CSEG PFA_COMPARE_DONE 00000a0b +CSEG VE_NFA2LFA 00000a10 +CSEG PFA_NFA2LFA 00000a17 +CSEG VE_DOTS 00000a1c +CSEG XT_DOTS 00000a1f +CSEG PFA_DOTS 00000a20 +CSEG XT_UDOT 00003e0a +CSEG PFA_DOTS2 00000a2e +CSEG PFA_DOTS1 00000a29 +CSEG XT_PICK 00003c84 +CSEG VE_SPIRW 00000a2f +CSEG XT_SPIRW 00000a34 +CSEG PFA_SPIRW 00000a35 +CSEG do_spirw 00000a39 +CSEG do_spirw1 00000a3a +CSEG VE_N_SPIR 00000a42 +CSEG XT_N_SPIR 00000a47 +CSEG PFA_N_SPIR 00000a48 +CSEG PFA_N_SPIR_LOOP 00000a4d +CSEG PFA_N_SPIR_LOOP1 00000a4e +CSEG VE_N_SPIW 00000a59 +CSEG XT_N_SPIW 00000a5e +CSEG PFA_N_SPIW 00000a5f +CSEG PFA_N_SPIW_LOOP 00000a64 +CSEG PFA_N_SPIW_LOOP1 00000a66 +CSEG VE_APPLTURNKEY 00000a70 +CSEG XT_APPLTURNKEY 00000a78 +CSEG PFA_APPLTURNKEY 00000a79 +CSEG XT_INTON 00003c97 +CSEG XT_F_CPU 00003eac +CSEG VE_SET_CURRENT 00000a8a +CSEG XT_SET_CURRENT 00000a92 +CSEG PFA_SET_CURRENT 00000a93 +CSEG VE_WORDLIST 00000a97 +CSEG XT_WORDLIST 00000a9d +CSEG PFA_WORDLIST 00000a9e +CSEG XT_EHERE 00003f1b +CSEG PFA_EHERE 00003f1c +CSEG VE_FORTHWORDLIST 00000aa7 +CSEG XT_FORTHWORDLIST 00000ab0 +CSEG PFA_FORTHWORDLIST 00000ab1 +ESEG CFG_FORTHWORDLIST 00000048 +CSEG VE_SET_ORDER 00000ab2 +CSEG XT_SET_ORDER 00000ab9 +CSEG PFA_SET_ORDER 00000aba +CSEG VE_SET_RECOGNIZERS 00000abe +CSEG XT_SET_RECOGNIZERS 00000ac8 +CSEG PFA_SET_RECOGNIZERS 00000ac9 +ESEG CFG_RECOGNIZERLISTLEN 0000005c +CSEG VE_GET_RECOGNIZERS 00000acd +CSEG XT_GET_RECOGNIZERS 00000ad7 +CSEG PFA_GET_RECOGNIZERS 00000ad8 +CSEG VE_CODE 00000adc +CSEG XT_CODE 00000ae0 +CSEG PFA_CODE 00000ae1 +CSEG VE_ENDCODE 00000ae7 +CSEG XT_ENDCODE 00000aed +CSEG PFA_ENDCODE 00000aee +CSEG VE_MARKER 00000af3 +CSEG XT_MARKER 00000af9 +CSEG PFA_MARKER 00000afa +ESEG EE_MARKER 00000068 +CSEG VE_POSTPONE 00000afd +CSEG XT_POSTPONE 00000b03 +CSEG PFA_POSTPONE 00000b04 +CSEG VE_2R_FETCH 00000b12 +CSEG XT_2R_FETCH 00000b16 +CSEG PFA_2R_FETCH 00000b17 +SET DPSTART 00000b26 +CSEG DO_INTERRUPT 00003814 +CSEG DO_EXECUTE 0000380d +CSEG XT_ISREXEC 00003cc0 +CSEG VE_EXIT 0000381c +CSEG PFA_EXIT 00003821 +CSEG VE_EXECUTE 00003824 +CSEG PFA_EXECUTE 0000382b +CSEG PFA_DOBRANCH 00003830 +CSEG PFA_DOCONDBRANCH 00003837 +CSEG PFA_DOLITERAL 0000383e +CSEG XT_DOVARIABLE 00003847 +CSEG XT_DOCONSTANT 00003851 +CSEG XT_DOUSER 00003857 +CSEG VE_DOVALUE 00003863 +CSEG XT_DOVALUE 00003869 +CSEG PFA_DOVALUE 0000386a +CSEG VE_FETCH 00003876 +CSEG PFA_FETCH 0000387a +CSEG PFA_FETCHRAM 0000387a +CSEG VE_STORE 0000387e +CSEG PFA_STORE 00003882 +CSEG PFA_STORERAM 00003882 +CSEG VE_CSTORE 0000388a +CSEG PFA_CSTORE 0000388e +CSEG VE_CFETCH 00003895 +CSEG PFA_CFETCH 00003899 +CSEG VE_FETCHU 0000389d +CSEG XT_FETCHU 000038a0 +CSEG PFA_FETCHU 000038a1 +CSEG VE_STOREU 000038a5 +CSEG XT_STOREU 000038a8 +CSEG PFA_STOREU 000038a9 +CSEG VE_DUP 000038ad +CSEG PFA_DUP 000038b2 +CSEG VE_QDUP 000038b5 +CSEG PFA_QDUP 000038ba +CSEG PFA_QDUP1 000038bf +CSEG VE_SWAP 000038c0 +CSEG PFA_SWAP 000038c5 +CSEG VE_OVER 000038cb +CSEG PFA_OVER 000038d0 +CSEG VE_DROP 000038d5 +CSEG PFA_DROP 000038da +CSEG VE_ROT 000038dd +CSEG PFA_ROT 000038e2 +CSEG VE_NIP 000038ec +CSEG PFA_NIP 000038f1 +CSEG VE_R_FROM 000038f3 +CSEG PFA_R_FROM 000038f7 +CSEG VE_TO_R 000038fc +CSEG PFA_TO_R 00003900 +CSEG VE_R_FETCH 00003905 +CSEG PFA_R_FETCH 00003909 +CSEG VE_NOTEQUAL 00003910 +CSEG PFA_NOTEQUAL 00003914 +CSEG VE_ZEROEQUAL 00003917 +CSEG PFA_ZEROEQUAL 0000391b +CSEG PFA_ZERO1 00003957 +CSEG PFA_TRUE1 0000394e +CSEG VE_ZEROLESS 0000391e +CSEG PFA_ZEROLESS 00003922 +CSEG VE_GREATERZERO 00003925 +CSEG PFA_GREATERZERO 00003929 +CSEG VE_DGREATERZERO 0000392e +CSEG XT_DGREATERZERO 00003932 +CSEG PFA_DGREATERZERO 00003933 +CSEG VE_DXT_ZEROLESS 0000393c +CSEG XT_DXT_ZEROLESS 00003940 +CSEG PFA_DXT_ZEROLESS 00003941 +CSEG VE_TRUE 00003947 +CSEG PFA_TRUE 0000394c +CSEG VE_ZERO 00003951 +CSEG PFA_ZERO 00003955 +CSEG VE_ULESS 00003959 +CSEG PFA_ULESS 0000395d +CSEG VE_UGREATER 00003964 +CSEG PFA_UGREATER 00003968 +CSEG VE_LESS 0000396b +CSEG PFA_LESS 0000396f +CSEG PFA_LESSDONE 00003973 +CSEG VE_GREATER 00003975 +CSEG PFA_GREATER 00003979 +CSEG PFA_GREATERDONE 0000397d +CSEG VE_LOG2 00003980 +CSEG XT_LOG2 00003984 +CSEG PFA_LOG2 00003985 +CSEG PFA_LOG2_1 00003988 +CSEG PFA_LOG2_2 0000398e +CSEG VE_MINUS 00003990 +CSEG PFA_MINUS 00003994 +CSEG VE_PLUS 0000399a +CSEG PFA_PLUS 0000399e +CSEG VE_MSTAR 000039a3 +CSEG PFA_MSTAR 000039a7 +CSEG VE_UMSLASHMOD 000039bd +CSEG PFA_UMSLASHMOD 000039c3 +CSEG PFA_UMSLASHMODmod 000039c8 +CSEG PFA_UMSLASHMODmod_loop 000039c9 +CSEG PFA_UMSLASHMODmod_loop_control 000039d6 +CSEG PFA_UMSLASHMODmod_subtract 000039d3 +CSEG PFA_UMSLASHMODmod_done 000039d8 +CSEG VE_UMSTAR 000039dc +CSEG PFA_UMSTAR 000039e1 +CSEG VE_INVERT 000039f8 +CSEG PFA_INVERT 000039fe +CSEG VE_2SLASH 00003a01 +CSEG PFA_2SLASH 00003a05 +CSEG VE_2STAR 00003a08 +CSEG PFA_2STAR 00003a0c +CSEG VE_AND 00003a0f +CSEG PFA_AND 00003a14 +CSEG VE_OR 00003a19 +CSEG PFA_OR 00003a1d +CSEG VE_XOR 00003a22 +CSEG XT_XOR 00003a26 +CSEG PFA_XOR 00003a27 +CSEG VE_1PLUS 00003a2c +CSEG PFA_1PLUS 00003a30 +CSEG VE_1MINUS 00003a32 +CSEG PFA_1MINUS 00003a36 +CSEG VE_QNEGATE 00003a38 +CSEG XT_QNEGATE 00003a3e +CSEG PFA_QNEGATE 00003a3f +CSEG QNEG1 00003a43 +CSEG VE_LSHIFT 00003a44 +CSEG XT_LSHIFT 00003a49 +CSEG PFA_LSHIFT 00003a4a +CSEG PFA_LSHIFT1 00003a4d +CSEG PFA_LSHIFT2 00003a52 +CSEG VE_RSHIFT 00003a53 +CSEG XT_RSHIFT 00003a58 +CSEG PFA_RSHIFT 00003a59 +CSEG PFA_RSHIFT1 00003a5c +CSEG PFA_RSHIFT2 00003a61 +CSEG VE_PLUSSTORE 00003a62 +CSEG PFA_PLUSSTORE 00003a66 +CSEG VE_RP_FETCH 00003a72 +CSEG PFA_RP_FETCH 00003a77 +CSEG VE_RP_STORE 00003a7c +CSEG XT_RP_STORE 00003a80 +CSEG PFA_RP_STORE 00003a81 +CSEG VE_SP_FETCH 00003a89 +CSEG PFA_SP_FETCH 00003a8e +CSEG VE_SP_STORE 00003a92 +CSEG XT_SP_STORE 00003a96 +CSEG PFA_SP_STORE 00003a97 +CSEG PFA_DODO 00003a9c +CSEG PFA_DODO1 00003a9e +CSEG VE_I 00003aa9 +CSEG PFA_I 00003aad +CSEG PFA_DOPLUSLOOP 00003abb +CSEG PFA_DOPLUSLOOP_LEAVE 00003ac5 +CSEG PFA_DOPLUSLOOP_NEXT 00003ac2 +CSEG PFA_DOLOOP 00003aca +CSEG VE_UNLOOP 00003acf +CSEG PFA_UNLOOP 00003ad5 +CSEG VE_CMOVE_G 00003ada +CSEG XT_CMOVE_G 00003adf +CSEG PFA_CMOVE_G 00003ae0 +CSEG PFA_CMOVE_G1 00003af1 +CSEG PFA_CMOVE_G2 00003aed +CSEG VE_BYTESWAP 00003af6 +CSEG PFA_BYTESWAP 00003afa +CSEG VE_UP_FETCH 00003afe +CSEG PFA_UP_FETCH 00003b03 +CSEG VE_UP_STORE 00003b07 +CSEG XT_UP_STORE 00003b0b +CSEG PFA_UP_STORE 00003b0c +CSEG VE_1MS 00003b10 +CSEG XT_1MS 00003b14 +CSEG PFA_1MS 00003b15 +CSEG VE_2TO_R 00003b1a +CSEG PFA_2TO_R 00003b1f +CSEG VE_2R_FROM 00003b29 +CSEG PFA_2R_FROM 00003b2e +CSEG VE_STOREE 00003b38 +CSEG PFA_STOREE 00003b3c +CSEG PFA_STOREE0 00003b3c +CSEG PFA_FETCHE2 00003b6a +CSEG PFA_STOREE3 00003b46 +CSEG PFA_STOREE1 00003b51 +CSEG PFA_STOREE4 00003b4d +CSEG PFA_STOREE2 00003b53 +CSEG VE_FETCHE 00003b5c +CSEG PFA_FETCHE 00003b60 +CSEG PFA_FETCHE1 00003b60 +CSEG VE_STOREI 00003b70 +CSEG PFA_STOREI 00003b74 +ESEG EE_STOREI 00000066 +CSEG VE_DO_STOREI_NRWW 00003b77 +CSEG XT_DO_STOREI 00003b7e +CSEG PFA_DO_STOREI_NRWW 00003b7f +CSEG DO_STOREI_atmega 00003b93 +CSEG pageload 00003ba4 +CSEG DO_STOREI_writepage 00003b9d +CSEG dospm 00003bbd +EQU pagemask ffffffc0 +CSEG pageload_loop 00003baa +CSEG pageload_newdata 00003bb5 +CSEG pageload_cont 00003bb7 +CSEG pageload_done 00003bbc +CSEG dospm_wait_ee 00003bbd +CSEG dospm_wait_spm 00003bbf +CSEG VE_FETCHI 00003bc8 +CSEG PFA_FETCHI 00003bcc +CSEG VE_N_TO_R 00003bd2 +CSEG XT_N_TO_R 00003bd6 +CSEG PFA_N_TO_R 00003bd7 +CSEG PFA_N_TO_R1 00003bd9 +CSEG VE_N_R_FROM 00003be4 +CSEG XT_N_R_FROM 00003be8 +CSEG PFA_N_R_FROM 00003be9 +CSEG PFA_N_R_FROM1 00003bee +CSEG VE_D2STAR 00003bf6 +CSEG XT_D2STAR 00003bfa +CSEG PFA_D2STAR 00003bfb +CSEG VE_D2SLASH 00003c04 +CSEG XT_D2SLASH 00003c08 +CSEG PFA_D2SLASH 00003c09 +CSEG VE_DPLUS 00003c12 +CSEG PFA_DPLUS 00003c16 +CSEG VE_DMINUS 00003c23 +CSEG XT_DMINUS 00003c26 +CSEG PFA_DMINUS 00003c27 +CSEG VE_DINVERT 00003c35 +CSEG PFA_DINVERT 00003c3c +CSEG VE_SLASHMOD 00003c45 +CSEG XT_SLASHMOD 00003c49 +CSEG PFA_SLASHMOD 00003c4a +CSEG PFA_SLASHMOD_1 00003c55 +CSEG PFA_SLASHMOD_2 00003c5b +CSEG PFA_SLASHMOD_3 00003c5e +CSEG PFA_SLASHMOD_5 00003c69 +CSEG PFA_SLASHMOD_4 00003c68 +CSEG PFA_SLASHMODmod_done 00003c74 +CSEG PFA_SLASHMOD_6 00003c72 +CSEG VE_ABS 00003c78 +CSEG XT_ABS 00003c7c +CSEG PFA_ABS 00003c7d +CSEG VE_PICK 00003c80 +CSEG PFA_PICK 00003c85 +CSEG VE_CELLPLUS 00003c8b +CSEG PFA_CELLPLUS 00003c91 +CSEG VE_INTON 00003c93 +CSEG PFA_INTON 00003c98 +CSEG VE_INTOFF 00003c9a +CSEG XT_INTOFF 00003c9e +CSEG PFA_INTOFF 00003c9f +CSEG VE_INTSTORE 00003ca1 +CSEG PFA_INTSTORE 00003ca6 +CSEG VE_INTFETCH 00003cab +CSEG XT_INTFETCH 00003caf +CSEG PFA_INTFETCH 00003cb0 +CSEG VE_INTTRAP 00003cb5 +CSEG XT_INTTRAP 00003cbb +CSEG PFA_INTTRAP 00003cbc +CSEG PFA_ISREXEC 00003cc1 +CSEG XT_ISREND 00003cc5 +CSEG PFA_ISREND 00003cc6 +CSEG PFA_ISREND1 00003cc8 +CSEG XT_DEFAULT_PROMPTOK 00003cc9 +CSEG PFA_DEFAULT_PROMPTOK 00003cca +CSEG VE_PROMPTOK 00003cd0 +CSEG XT_PROMPTOK 00003cd4 +CSEG PFA_PROMPTOK 00003cd5 +CSEG XT_DEFAULT_PROMPTREADY 00003cd8 +CSEG PFA_DEFAULT_PROMPTREADY 00003cd9 +CSEG VE_PROMPTREADY 00003cdf +CSEG XT_PROMPTREADY 00003ce4 +CSEG PFA_PROMPTREADY 00003ce5 +CSEG XT_DEFAULT_PROMPTERROR 00003ce8 +CSEG PFA_DEFAULT_PROMPTERROR 00003ce9 +CSEG VE_PROMPTERROR 00003cfa +CSEG XT_PROMPTERROR 00003cff +CSEG PFA_PROMPTERROR 00003d00 +CSEG VE_QUIT 00003d03 +CSEG XT_QUIT 00003d07 +CSEG PFA_QUIT 00003d08 +CSEG PFA_QUIT2 00003d10 +CSEG PFA_QUIT4 00003d16 +CSEG PFA_QUIT3 00003d28 +CSEG XT_CATCH 00003d70 +CSEG PFA_QUIT5 00003d26 +CSEG VE_PAUSE 00003d2b +CSEG PFA_PAUSE 00003d31 +DSEG ram_pause 00000192 +CSEG XT_RDEFERFETCH 00003db4 +CSEG XT_RDEFERSTORE 00003dbe +CSEG VE_COLD 00003d34 +CSEG clearloop 00003d40 +DSEG ram_user1 00000194 +CSEG PFA_WARM 00003d5a +CSEG VE_WARM 00003d55 +CSEG XT_WARM 00003d59 +CSEG XT_DEFERSTORE 00003ddf +CSEG XT_TURNKEY 00003f5c +CSEG VE_HANDLER 00003d63 +CSEG XT_HANDLER 00003d69 +CSEG PFA_HANDLER 00003d6a +CSEG VE_CATCH 00003d6b +CSEG PFA_CATCH 00003d71 +CSEG VE_THROW 00003d81 +CSEG PFA_THROW 00003d87 +CSEG PFA_THROW1 00003d8d +CSEG VE_EDEFERFETCH 00003d9a +CSEG PFA_EDEFERFETCH 00003da1 +CSEG VE_EDEFERSTORE 00003da4 +CSEG PFA_EDEFERSTORE 00003dab +CSEG VE_RDEFERFETCH 00003dae +CSEG PFA_RDEFERFETCH 00003db5 +CSEG VE_RDEFERSTORE 00003db8 +CSEG PFA_RDEFERSTORE 00003dbf +CSEG VE_UDEFERFETCH 00003dc2 +CSEG PFA_UDEFERFETCH 00003dc9 +CSEG VE_UDEFERSTORE 00003dce +CSEG PFA_UDEFERSTORE 00003dd5 +CSEG VE_DEFERSTORE 00003dda +CSEG PFA_DEFERSTORE 00003de0 +CSEG VE_DEFERFETCH 00003de7 +CSEG XT_DEFERFETCH 00003dec +CSEG PFA_DEFERFETCH 00003ded +CSEG VE_DODEFER 00003df3 +CSEG XT_DODEFER 00003df9 +CSEG PFA_DODEFER 00003dfa +CSEG VE_UDOT 00003e07 +CSEG PFA_UDOT 00003e0b +CSEG VE_UDOTR 00003e0e +CSEG XT_UDOTR 00003e12 +CSEG PFA_UDOTR 00003e13 +CSEG VE_USLASHMOD 00003e17 +CSEG XT_USLASHMOD 00003e1c +CSEG PFA_USLASHMOD 00003e1d +CSEG VE_NEGATE 00003e22 +CSEG PFA_NEGATE 00003e28 +CSEG VE_SLASH 00003e2b +CSEG XT_SLASH 00003e2e +CSEG PFA_SLASH 00003e2f +CSEG VE_MOD 00003e32 +CSEG XT_MOD 00003e36 +CSEG PFA_MOD 00003e37 +CSEG VE_MIN 00003e3a +CSEG XT_MIN 00003e3e +CSEG PFA_MIN 00003e3f +CSEG PFA_MIN1 00003e44 +CSEG VE_MAX 00003e46 +CSEG XT_MAX 00003e4a +CSEG PFA_MAX 00003e4b +CSEG PFA_MAX1 00003e50 +CSEG VE_WITHIN 00003e52 +CSEG PFA_WITHIN 00003e58 +CSEG VE_SHOWWORDLIST 00003e5f +CSEG XT_SHOWWORDLIST 00003e68 +CSEG PFA_SHOWWORDLIST 00003e69 +CSEG XT_SHOWWORD 00003e6e +CSEG PFA_SHOWWORD 00003e6f +CSEG VE_WORDS 00003e74 +CSEG XT_WORDS 00003e79 +CSEG PFA_WORDS 00003e7a +CSEG VE_DOTSTRING 00003e7f +CSEG XT_DOTSTRING 00003e82 +CSEG PFA_DOTSTRING 00003e83 +CSEG VE_SQUOTE 00003e87 +CSEG PFA_SQUOTE 00003e8b +CSEG PFA_SQUOTE1 00003e93 +CSEG VE_FILL 00003e94 +CSEG PFA_FILL 00003e99 +CSEG PFA_FILL2 00003ea5 +CSEG PFA_FILL1 00003ea0 +CSEG VE_F_CPU 00003ea7 +CSEG PFA_F_CPU 00003ead +CSEG VE_STATE 00003eb2 +CSEG PFA_STATE 00003eb8 +DSEG ram_state 000001c0 +CSEG VE_BASE 00003eb9 +CSEG PFA_BASE 00003ebe +CSEG VE_CELLS 00003ebf +CSEG VE_2DUP 00003ec5 +CSEG PFA_2DUP 00003eca +CSEG VE_2DROP 00003ecd +CSEG PFA_2DROP 00003ed3 +CSEG VE_TUCK 00003ed6 +CSEG PFA_TUCK 00003edb +CSEG VE_TO_IN 00003ede +CSEG PFA_TO_IN 00003ee3 +CSEG VE_PAD 00003ee4 +CSEG PFA_PAD 00003ee9 +CSEG VE_EMIT 00003eee +CSEG PFA_EMIT 00003ef3 +CSEG VE_EMITQ 00003ef6 +CSEG XT_EMITQ 00003efb +CSEG PFA_EMITQ 00003efc +CSEG VE_KEY 00003eff +CSEG PFA_KEY 00003f04 +CSEG VE_KEYQ 00003f07 +CSEG XT_KEYQ 00003f0b +CSEG PFA_KEYQ 00003f0c +CSEG VE_DP 00003f0f +ESEG CFG_DP 00000036 +CSEG VE_EHERE 00003f16 +ESEG EE_EHERE 0000003a +CSEG VE_HERE 00003f1f +CSEG PFA_HERE 00003f24 +ESEG EE_HERE 00000038 +CSEG VE_ALLOT 00003f27 +CSEG PFA_ALLOT 00003f2d +CSEG VE_BIN 00003f32 +CSEG XT_BIN 00003f36 +CSEG PFA_BIN 00003f37 +CSEG VE_DECIMAL 00003f3b +CSEG PFA_DECIMAL 00003f42 +CSEG VE_HEX 00003f47 +CSEG XT_HEX 00003f4b +CSEG PFA_HEX 00003f4c +CSEG VE_BL 00003f51 +CSEG PFA_BL 00003f55 +CSEG VE_TURNKEY 00003f56 +CSEG PFA_TURNKEY 00003f5d +ESEG CFG_TURNKEY 00000042 +CSEG VE_TOUPPER 00003f60 +CSEG PFA_TOUPPER 00003f67 +CSEG PFA_TOUPPER0 00003f72 +CSEG VE_TOLOWER 00003f73 +CSEG XT_TOLOWER 00003f79 +CSEG PFA_TOLOWER 00003f7a +CSEG PFA_TOLOWER0 00003f85 +CSEG VE_QSTACK 00003f86 +CSEG PFA_QSTACK 00003f8c +CSEG PFA_QSTACK1 00003f93 +CSEG VE_BOUNDS 00003f94 +CSEG PFA_BOUNDS 00003f9a +CSEG VE_CR 00003f9e +CSEG PFA_CR 00003fa2 +CSEG VE_SPACE 00003fa9 +CSEG PFA_SPACE 00003faf +CSEG VE_SPACES 00003fb2 +CSEG PFA_SPACES 00003fb8 +CSEG SPCS1 00003fba +CSEG SPCS2 00003fc1 +CSEG VE_S2D 00003fc3 +CSEG PFA_S2D 00003fc8 +CSEG VE_TO_BODY 00003fcb +CSEG VE_2LITERAL 00003fd1 +CSEG PFA_2LITERAL 00003fd8 +CSEG VE_EQUAL 00003fdc +CSEG PFA_EQUAL 00003fe0 +CSEG VE_ONE 00003fe3 +CSEG PFA_ONE 00003fe7 +CSEG VE_TWO 00003fe8 +CSEG PFA_TWO 00003fec +CSEG VE_MINUSONE 00003fed +CSEG XT_MINUSONE 00003ff0 +CSEG PFA_MINUSONE 00003ff1 +SET flashlast 00003ff2 +DSEG HERESTART 000001c2 +ESEG EHERESTART 0000008e +ESEG CFG_ORDERLIST 0000004c +ESEG CFG_RECOGNIZERLIST 0000005e +EQU UBRR_VAL 00000019 +EQU BAUD_REAL 0000963d +EQU BAUD_ERROR 00000001 diff --git a/amforth-6.5/appl/eval-pollin/p328-16.xml b/amforth-6.5/appl/eval-pollin/p328-16.xml new file mode 100644 index 0000000..1d8cdb5 --- /dev/null +++ b/amforth-6.5/appl/eval-pollin/p328-16.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + Uploading Hexfiles for p328-16 + + + + Writing fuses + + + + diff --git a/amforth-6.5/appl/eval-pollin/p644-16.eep.hex b/amforth-6.5/appl/eval-pollin/p644-16.eep.hex new file mode 100644 index 0000000..f9365bf --- /dev/null +++ b/amforth-6.5/appl/eval-pollin/p644-16.eep.hex @@ -0,0 +1,7 @@ +:10003800FFFF8B05C401920033046000B010DD049B +:0A00480032754C008D7D01004C0064 +:060060000200247B107B6E +:10006A007E736C0000000000FF10AF10AF1000009C +:10007A000A00A700B5007C009700257D0000127DCC +:08008A00EA79097AF9791900FD +:00000001FF diff --git a/amforth-6.5/appl/eval-pollin/p644-16.hex b/amforth-6.5/appl/eval-pollin/p644-16.hex new file mode 100644 index 0000000..3da58b1 --- /dev/null +++ b/amforth-6.5/appl/eval-pollin/p644-16.hex @@ -0,0 +1,635 @@ +:020000020000FC +:020004002AD1FF +:0200080028D1FD +:02000C0026D1FB +:0200100024D1F9 +:0200140022D1F7 +:0200180020D1F5 +:02001C001ED1F3 +:020020001CD1F1 +:020024001AD1EF +:0200280018D1ED +:02002C0016D1EB +:0200300014D1E9 +:0200340012D1E7 +:0200380010D1E5 +:02003C000ED1E3 +:020040000CD1E1 +:020044000AD1DF +:0200480008D1DD +:02004C0006D1DB +:0200500004D1D9 +:0200540002D1D7 +:0200580000D1D5 +:02005C00FED0D4 +:02006000FCD0D2 +:02006400FAD0D0 +:02006800F8D0CE +:10006C00F6D00010000800E01C00090041546D653A +:10007C0067613634340007FF3E72782D6275660076 +:10008C0000004800082F10911001E0E0F1E0E10FB2 +:10009C00F31D008313951F70109310018991999192 +:1000AC000C94057006FF6973722D72784100017013 +:1000BC003D70C6009870B1703D7003007F7D367046 +:1000CC006800597A4700207001703D705D003D70EA +:1000DC00280087743D7000013D7016005471CF7478 +:1000EC00207006FF72782D627566580001709700BB +:1000FC0036707D003D7011019870B1703D7000013B +:10010C009D719870C4702F723D700F0013723D700A +:10011C0011018D70207007FF72783F2D627566009B +:10012C0077000170517A3D70110198703D7010018B +:10013C0098701371207007FF74782D706F6C6C00C1 +:10014C0091000170B5003670A8003D70C6008D702E +:10015C00207008FF74783F2D706F6C6CA1000170DB +:10016C00517A3D70C00098703D7020001372207061 +:10017C0004FF75627272AF006F709000B47BBE7B2F +:10018C0006FF2B7573617274BE0001703D70980090 +:10019C003D70C1008D703D7006003D70C2008D70C9 +:1001AC00C200B170F9723D70C5008D703D70C40015 +:1001BC008D706A00207008FF31772E72657365743C +:1001CC00C600E8009A938A93249A2C98E0E8F7E00A +:1001DC003197F1F71FB7F8942C9A2498E0E0F1E0EE +:1001EC003197F1F783B184FF9FEF1FBF24982C98B0 +:1001FC00E0E8F6E03197F1F7892F0C94057007FFD2 +:10020C0031772E736C6F7400E1000C012C98249ADA +:10021C001FB7F894E8E1F0E03197F1F788948795EF +:10022C0010F42C9A2498E4E2F0E03197F1F703B142 +:10023C0004FD8068ECECF0E03197F1F72C9A2498EF +:0E024C00E8E0F0E03197F1F71FBF0C94057069 +:040000000C945A7A88 +:10025A000A920FB60A920F900F900A94B02CFF934D +:10026A00EF93E2E1F1E00694E00DF31D00800394C0 +:10027A000082EF91FF9109900FBE0990089502FF45 +:10028A006D2B05010170677D1574207003FF75647D +:10029A002A0044010170B170FF70E071D970C47016 +:1002AA00F670E071E1709D71207004FF756D6178E0 +:1002BA004B01017065755C7136706401C470D97048 +:1002CA00207004FF756D696E5A010170657567715A +:1002DA0036707001C470D970207001703D70008052 +:1002EA0013721A7136707B01867D20704B712070F3 +:1002FA000AFF6E616D653E666C6167736601017027 +:10030A00CB733D7000FF1372207006FF6E65776530 +:10031A0073747D0148702E0106FF6C6174657374F5 +:10032A008A014870320108FF286372656174652981 +:10033A0091010170B479F502B1708F015E75817017 +:10034A00DA028F018170207001005C00980101704F +:10035A009B79F0707E758170207001002800A901D8 +:10036A0001703D70290087796E75207007FF636FF1 +:10037A006D70696C6500B2010170F670B170AB7B8B +:10038A00FF70CB73CC01207001FF2C00BB01017000 +:10039A00AE757373AE752F72997BAF7520700300BB +:1003AA005B275D00C90101700A78E201207007002D +:1003BA006C69746572616C00D4010170C1013D7091 +:1003CA00CC0120700800736C69746572616CDC0181 +:1003DA000170C1016D777B7720700170AE75C10124 +:1003EA00FFFF20700170577BAE75C4707373207065 +:1003FA000170AE7520700170577BCC01207005002A +:10040A00616865616400E7010170C1012F70F20142 +:10041A0020700200696604020170C1013670F2019F +:10042A0020700400656C73650E020170C1012F70A3 +:10043A00F201C470F701207004007468656E160238 +:10044A000170F70120700500626567696E0021027C +:10045A000170FD01207005007768696C650028024B +:10046A0001701102C47020700600726570656174B3 +:10047A00300201705202250220700500756E7469FF +:10048A006C00390201703D703670CC010002207098 +:10049A000500616761696E0042020170C1012F7037 +:1004AA00000220700200646F4D020170C1019B724C +:1004BA00FD015471B502207004006C6F6F70570211 +:1004CA000170C101C9729C02207005002B6C6F6F0C +:1004DA00700061020170C101BA729C0220700500AD +:1004EA006C65617665006A020170C101D472090205 +:1004FA00B502207003003F646F0074020170C101ED +:10050A008B0211025A02C470B5022070017065751F +:10051A007F7DB170FF70367093026E75F670FD7153 +:10052A00207007FF656E646C6F6F70007F02017048 +:10053A000002A902B9703670A50225022F709E0228 +:10054A00207002FF6C3E96020170C80279707970C1 +:10055A003D70FEFFC8026572207002FF3E6CA60263 +:10056A0001708B7DC8026572C80279708170207033 +:10057A0003FF6C703000B2026F704400B47BBE7B24 +:10058A0002FF6C70BD024870340106FF6372656138 +:10059A007465C50201709E01FE02C101527020708D +:1005AA0006FF686561646572CA020170AE75FF7004 +:1005BA00FF70B17028713670EC02B1703D7000FFA7 +:1005CA001C727F77F6705F73CC01F67020703D70F5 +:1005DA00F0FF417807FF776C73636F706500D5028F +:1005EA00137C4000B47BBE7B06FF72657665616C46 +:1005FA00EF0201708F015E757970B9703670090368 +:10060A008F017970C4703B7320700500646F657345 +:10061A003E00F9020170C1012203C1010E94C10119 +:10062A00170320709A938A93CB0101967F916F9159 +:10063A00BF93AF93DB010C9405700170F6708F01C4 +:10064A005E7579705F737E7C7373207001FF3A0068 +:10065A000A0301709E013903D970207007FF3A6EB0 +:10066A006F6E616D65002B030170AE75B1709601F6 +:10067A008170C10101704E03207001003B003303F9 +:10068A000170C10120705603FE02207001FF5D0057 +:10069A0042030170867D4B758170207001005B00FA +:1006AA004B03017054714B758170207008FF76619D +:1006BA00726961626C6553030170BF756D038B7D4E +:1006CA00C875207008FF636F6E7374616E745B0384 +:1006DA0001709E01FE02C1014870CC01207004FF26 +:1006EA0075736572670301709E01FE02C10158703D +:1006FA00CC0120700700726563757273650074031C +:10070A00017096017970CC01207009FF696D6D65E1 +:10071A006469617465007F03017033045F73B170AB +:10072A00CB733D70FF7F1372C47073732070060021 +:10073A005B636861725D8A030170C1013D70EA788A +:10074A00CC012070060061626F7274229C030170F2 +:10075A00C174C101BE03207005FF61626F7274002B +:10076A00A70301704B71417806FF3F61626F727493 +:10077A00B1030170E1703670C403A077B6036E75D9 +:10078A00207009FF6765742D737461636B00B90388 +:10079A000170B1705E75C4705F73B170FF7054718F +:1007AA00C4708B023670E4039B72AC723572587552 +:1007BA00CF709D715F73C4704B71BA72DA036E7534 +:1007CA00F670207009FF7365742D737461636B0092 +:1007DA00C6030170CF7021713670F6033D70FCFFBD +:1007EA00417865753B73C47054718B02367003048B +:1007FA009B725E7576753B73C972FE03D970207061 +:10080A0009FF6D61702D737461636B00E7030170FA +:10081A00B1705E75C4705F7358755E7D8B023670F9 +:10082A0028049B72AC725F73C470FF7008712A70DF +:10083A00B97036702404F670D970D4722070F670CC +:10084A008B7DBA721704D970547120700BFF6765DB +:10085A00742D63757272656E7400050401703D70C3 +:10086A004A005F73207009FF6765742D6F726465B3 +:10087A0072002B0401703D704E00CD03207009FFF9 +:10088A006366672D6F7264657200380448704E00A3 +:10089A0007FF636F6D706172650044045404BF936F +:1008AA00AF938C0189919991DC01899199919C016D +:1008BA0089919991FC01ED90F190EF1451F40A9508 +:1008CA0019F02A95C1F701C02A95022B11F488273D +:1008DA0002C08FEF00C0982FAF91BF910C940570A2 +:1008EA0007FF6E66613E6C6661004D040170727CA2 +:1008FA002F7204729D71207002FF2E7375040170AD +:10090A00A17A4874E277A17A54718B023670930403 +:10091A009B72AC72AF744874C9728E04207006FF61 +:10092A0063214073706981049A0403D099270C9457 +:10093A0005708EBD0DB5087F0DBD0DB507FFFACF49 +:10094A008EB5089505FF6E40737069009404AD0476 +:10095A008C0189919991FC01C8012EBC2DB527FF04 +:10096A00FDCF2EB521930197C1F7899199910C94E6 +:10097A00057005FF6E2173706900A704C4048C0119 +:10098A0089919991FC01C80121912EBD2DB527FFAE +:10099A00FDCF2EB50197C1F7899199910C940570F5 +:1009AA000BFF6170706C7475726E6B657900BE04B2 +:1009BA000170CB007974647BE27740753D70E8037F +:1009CA00C271F070DD7522776D7704006B487A206A +:1009DA00A07720700BFF7365742D63757272656E54 +:1009EA007400D50401703D704A003B73207008FF03 +:1009FA00776F72646C697374EF040170B775547120 +:100A0A00CF703B73B1705E75997BB87520700EFF1D +:100A1A00666F7274682D776F72646C697374FC0404 +:100A2A0048704C0009FF7365742D6F72646572001B +:100A3A000C0501703D704E00EE0320700FFF7365C8 +:100A4A00742D7265636F676E697A65727300170534 +:100A5A0001703D706000EE0320700FFF6765742D12 +:100A6A007265636F676E697A657273002305017038 +:100A7A003D706000CD03207004FF636F646532052A +:100A8A0001709E01FE02AE75AB7BCC01207008FF9F +:100A9A00656E642D636F646541050170C1010C9434 +:100AAA00C1010570207008FF286D61726B6572299B +:100ABA004C056F706C00B47BBE7B0800706F73745A +:100ACA00706F6E6558050170B479CC7AD77AB170B7 +:100ADA00FF70AB7BAB7BCB732A70F670AB7BCB73AF +:100AEA00CC01207003FF3272400062057C059A93A4 +:100AFA008A93EF91FF918F919F919F938F93FF9389 +:0C0B0A00EF939A938A93CF010C9405702E +:10E00200BF93AF93DB011196B21469F4FD01EE0FD9 +:10E01200FF1F659175911196FB01EE0FFF1F059190 +:10E022001591F80109949A938A938B2D9927BB2411 +:10E0320062EA74E7F1CF04FF6578697477052170AD +:10E04200AF91BF91E1CF07FF657865637574650095 +:10E052001C702B70BC0189919991DECF3070FD014B +:10E06200EE0FFF1FA591B591CFCF3770982B8991F5 +:10E072009991A9F31196C8CF3E709A938A93FD01A4 +:10E08200EE0FFF1F859195911196BECF48709A931E +:10E092008A93FB013196EE0FFF1F85919591B4CFC4 +:10E0A20052709A938A93CB010196AECF58709A938D +:10E0B2008A93FB013196EE0FFF1F85919591840D96 +:10E0C200951DA2CF07FF2876616C75652900247023 +:10E0D20001709E01FE02C1016F7020700E94170341 +:10E0E200B170AB7BCB732A70207001FF400063706C +:10E0F2007A70FC018191919187CF01FF21007670A6 +:10E102008270FC018991999191838083899199917F +:10E112007BCF02FF63217E708E70FC018991999101 +:10E1220080838991999170CF02FF63408A709970C0 +:10E13200FC019927808168CF02FF407595700170BC +:10E1420002739D717970207002FF21759D700170BC +:10E1520002739D718170207003FF64757000A57059 +:10E16200B2709A938A9350CF04FF3F647570AD707A +:10E17200BA70082F092B11F09A938A9345CF04FFA6 +:10E1820073776170B570C5708C01899199911A93FA +:10E192000A933ACF04FF6F766572C070D0709A937B +:10E1A2008A938A819B8130CF04FF64726F70CB7037 +:10E1B200DA708991999128CF03FF726F7400D5703C +:10E1C200E2708C0129913991899199913A932A931C +:10E1D2001A930A9319CF03FF6E697000DD70F17014 +:10E1E200229612CF02FF723EEC70F7709A938A93D6 +:10E1F2008F919F9109CF02FF3E72F37000719F933E +:10E202008F938991999100CF02FF7240FC7009713E +:10E212009A938A938F919F919F938F93F5CE02FF4A +:10E222003C3E057101707F7D1A71207002FF303D06 +:10E2320010711B71982BD1F530C002FF303C177161 +:10E24200227197FD2AC032C002FF303E1E71297131 +:10E25200821593055CF151F120C003FF64303E004A +:10E2620025713371821593058991999182059305E0 +:10E27200ECF0E1F012C003FF64303C002E714171FA +:10E28200229697FD0C944E710C94577104FF747290 +:10E2920075653C714C719A938A938FEF9FEFB4CE60 +:10E2A20001FF3000477155719A938A93C101ACCE38 +:10E2B20002FF753C51715D71299139918217930763 +:10E2C200A8F3A1F3EACF02FF753E59710170C47041 +:10E2D2005C71207001FF3C0064716F71299139916A +:10E2E200281739071CF7D9CF01FF3E006B717971EE +:10E2F2002991399128173907CCF2C1F2CECF04FF08 +:10E302006C6F673275718571FC01992780E18A957E +:10E3120022F0EE0FFF1FD8F777CE9A9575CE01FF48 +:10E322002D008071947109911991081B190BC80174 +:10E332006BCE01FF2B0090719E7109911991800F94 +:10E34200911F62CE02FF6D2A9A71A7718C01899189 +:10E3520099919C0131027001209FC0013003F308A2 +:10E36200900DE11CF31C1203F308900DE11CF31C49 +:10E372009A938A93C70148CE06FF756D2F6D6F641D +:10E38200A371C3717C01299139910991199140E1DD +:10E392005527000F111F221F331F551F2E153F0532 +:10E3A200520518F003952E193F094A9589F73A93B9 +:10E3B2002A93C80129CE03FF756D2A00BD71E17150 +:10E3C2008C0189919991809FF00122273327909F98 +:10E3D200F00D211D331D819FF00D211D331D919FD5 +:10E3E200200D311DCF019A938A93C9010DCE06FFEC +:10E3F200696E76657274DC71FE718095909504CEBB +:10E4020002FF322FF871057295958795FDCD02FFB7 +:10E41200322A01720C72880F991FF6CD03FF616ECA +:10E422006400087214720991199180239123ECCD32 +:10E4320002FF6F720F721D7209911991802B912B3D +:10E44200E3CD03FF786F7200197227720991199157 +:10E4520080279127D9CD02FF312B2272307201968B +:10E46200D3CD02FF312D2C7236720197CDCD07FF2D +:10E472003F6E65676174650032720170217136709A +:10E4820043723F76207006FF6C7368696674387257 +:10E492004A72FC018991999131971AF0880F991F5C +:10E4A200FBCFB2CD06FF727368696674447259720B +:10E4B200FC018991999131971AF096958795FBCF36 +:10E4C200A3CD02FF2B2153726672FC0189919991AF +:10E4D20020813181820F931F808391838991999149 +:10E4E20093CD03FF72704000627277729A938A939F +:10E4F2008DB79EB789CD03FF72702100727281724F +:10E502002FB7F8948DBF9EBF2FBF899199917CCD73 +:10E5120003FF737040007C728E729A938A93CE01CD +:10E5220073CD03FF7370210089729772EC01899198 +:10E5320099916ACD9C7229913991E0E83E0F821B34 +:10E54200930B3F932F939F938F93899199915CCDD6 +:10E5520001FF69009272AD729A938A938F919F9193 +:10E56200EF91FF91FF93EF939F938F938E0F9F1FD6 +:10E572004BCDBB72EF91FF91E80FF91F89919991F1 +:10E582001BF0FF93EF936BCD0F911F9111963CCD32 +:10E59200CA72EF91FF913196BBF3F3CF06FF756E0E +:10E5A2006C6F6F70A972D5721F910F911F910F91AD +:10E5B2002BCD06FF636D6F76653ECF72E072BF931F +:10E5C200AF93E991F991A991B991092F082B41F0E3 +:10E5D200E80FF91FA80FB91F1E9112930197E1F7D7 +:10E5E200AF91BF91899199910FCD02FF3E3CDA72B2 +:10E5F200FA72092F982F802F07CD03FF7570400004 +:10E60200F67203739A938A93C201FECC03FF75706C +:10E612002100FE720C732C0189919991F5CC03FFB4 +:10E62200316D730007731573E0EAFFE03197F1F77C +:10E63200EBCC03FF323E720010731F73FC01899111 +:10E6420099919F938F93FF93EF9389919991DCCC4A +:10E6520003FF32723E001A732E739A938A93EF91DC +:10E66200FF918F919F919A938A93CF01CDCC02FF14 +:10E67200216529733C73FC01899199912FB7F89414 +:10E6820028D000B5081709F00BD0319622D000B57A +:10E69200091711F0892F04D02FBF89919991B4CC19 +:10E6A200F999FECF07B700FDFDCFF2BDE1BD80BDF8 +:10E6B200FA9AF99A089502FF4065387360732FB78A +:10E6C200F894FC0106D080B5319603D090B52FBFE7 +:10E6D2009BCCF999FECFF2BDE1BDF89A089502FFF5 +:10E6E20021695C73137C6A00B47BBE7B09FF28211D +:10E6F200692D6E727777290070737F731FB71F932E +:10E70200F8949C0189919991AF93BF93CF93DF9332 +:10E7120009D0DF91CF91BF91AF91899199911F91CA +:10E722001FBF72CC10D0E094F0948E219F21982BC1 +:10E7320019F0F90102E020D0F90104E01DD0F9013D +:10E7420000E11AD00895F901E078FF7FEF01A0E817 +:10E75200B0E0FE01EE0FFF1F45915591FE01E21759 +:10E76200F30711F00A0102C07A010C01002704D05C +:10E772002196119771F70895F999FECF17B710FDF9 +:10E78200FDCFEE0FFF1F016007BFE895089502FF5E +:10E7920040697773CC73FC01EE0FFF1F8591959151 +:10E7A20033CC03FF6E3E7200C873D773FC01082F8F +:10E7B200899199919F938F930A95D1F7EF93FF9344 +:10E7C2008991999121CC03FF6E723E00D273E97355 +:10E7D2009A938A93FF91EF910E2F8F919F919A9323 +:10E7E2008A930A95D1F7CF010FCC03FF64322A0036 +:10E7F200E473FB7309911991000F111F881F991F70 +:10E802001A930A9301CC03FF64322F00F673097442 +:10E812000991199195958795179507951A930A93DA +:10E82200F3CB02FF642B0474167429913991E99099 +:10E83200F99049915991240F351F8E1D9F1D3A93CE +:10E842002A93E2CB02FF642D127427742991399125 +:10E85200E990F99049915991421B530BE80AF90A40 +:10E862005A934A93C701D0CB07FF64696E766572EB +:10E87200740023743C7409911991809590950095C8 +:10E8820010951A930A93C0CB02FF752E357401704E +:10E8920054712A77207003FF752E7200457401703F +:10E8A2005471C470337720700DFF73686F772D77C2 +:10E8B2006F72646C697374004C7401703D7064749F +:10E8C200C470577C20700170727CA077E2774B7124 +:10E8D200207005FF776F72647300557401703D708C +:10E8E20050005F735E74207004FF2B696E746A744B +:10E8F2007A74789489CB04FF2D696E74757481746F +:10E90200F89482CB04FF696E74217C7401703D70AF +:10E9120000009D713B73207004FF696E7440837424 +:10E9220001703D7000009D715F73207008FF696E79 +:10E93200742D747261708D749E74B82E8991999140 +:10E9420063CB017091742A70A7742070A87401D0EF +:10E952005BCB189504FF7069636B977401702F721B +:10E9620058758D729D717970207002002E22AB74E1 +:10E972000170C174C101A077207002007322B674C5 +:10E9820001703D70220087794B7579703670CA74B8 +:10E99200ED01207004FF66696C6CBE740170E17059 +:10E9A200E170B9703670DC745E7D9B72B170AC72CE +:10E9B2008D70C972D774D97020700BFF656E76693D +:10E9C200726F6E6D656E7400CB744870480009FFFB +:10E9D200776F72646C6973747300000001703D702C +:10E9E2000800207004FF2F706164E87401708D725A +:10E9F20084759371207005FF2F686F6C6400F37447 +:10EA020001708475BF75937120700AFF666F72740E +:10EA1200682D6E616D65FC7401706D770700616D24 +:10EA2200666F72746800207007FF76657273696F93 +:10EA32006E00067501703D704100207003FF637027 +:10EA42007500157501703D703B00CC77207008FF92 +:10EA52006D63752D696E666F1F7501703D703700AD +:10EA6200207005FF2F7573657200287501703D7067 +:10EA72002C00207005FF665F63707500DE74017004 +:10EA82003D7000243D70F400207005FF73746174C2 +:10EA920065003B754870360104FF62617365467517 +:10EAA20058700C0005FF63656C6C73004D750C7239 +:10EAB20005FF63656C6C2B0053755F750296A4CAE3 +:10EAC20004FF3264757059750170CF70CF70207079 +:10EAD20005FF3264726F700061750170D970D97070 +:10EAE200207004FF7475636B69750170C470CF7018 +:10EAF200207003FF3E696E0072755870180003FFA4 +:10EB0200706164007A750170BF753D7028009D7157 +:10EB1200207004FF656D69748075137C0E00DC7BC8 +:10EB2200E87B05FF656D69743F008A75137C1000F0 +:10EB3200DC7BE87B03FF6B6579009275137C120026 +:10EB4200DC7BE87B04FF6B65793F9B75137C1400CB +:10EB5200DC7BE87B02FF6470A3756F703A00B47BC4 +:10EB6200BE7B05FF656865726500AB756F703E0020 +:10EB7200B47BBE7B04FF68657265B2756F703C0042 +:10EB8200B47BBE7B05FF616C6C6F7400BB7501705A +:10EB9200BF759D71997BC075207003FF62696E001D +:10EBA200C37501708B7D51758170207007FF64659C +:10EBB20063696D616C00CE7501703D700A0051751C +:10EBC2008170207003FF68657800D77501703D7011 +:10EBD200100051758170207002FF626CE3754870FD +:10EBE200200007FF7475726E6B657900ED75137CFA +:10EBF2004600B47BBE7B04FF2F6D6F64F275017615 +:10EC02009C0109911991412F432717FF04C01095C8 +:10EC120000950F5F1F4F37FF04C0309520952F5F7F +:10EC22003F4FEE24FF1851E1001F111F5A9539F48E +:10EC320047FF04C0109500950F5F1F4F0BC0EE1CDD +:10EC4200FF1CE21AF30A20F4E20EF31E8894ECCFC2 +:10EC52000894EACFFA92EA92C801D6C905FF752F45 +:10EC62006D6F6400FC750170FF705471F670C271B3 +:10EC7200207006FF6E65676174652F760170FD7105 +:10EC82002F72207001FF2F003A7601700076F0702B +:10EC9200207003FF6D6F6400437601700076D970B7 +:10ECA200207003FF616273004A760170B1703E7298 +:10ECB200207003FF6D696E00527601706575787180 +:10ECC20036706476C470D970207003FF6D6178006D +:10ECD2005A76017065756E7136707076C470D9702F +:10ECE200207006FF77697468696E66760170CF706E +:10ECF2009371FF709371F6705C71207007FF746FEF +:10ED020075707065720072760170B1703D7061004D +:10ED12003D707B007776367091763D70DF0013721E +:10ED2200207007FF746F6C6F776572007F760170D9 +:10ED3200B1703D7041003D705B0077763670A4760D +:10ED42003D7020001C72207003FF686C6400927694 +:10ED52004870380104FF686F6C64A5760170A9766B +:10ED6200B17079703572B170FF70C4708170F670D5 +:10ED72008D70207002FF3C23AB7601708475A976FA +:10ED82008170207001FF2300BB760170517579708C +:10ED92004377E1703D700900CF706E713670D476A2 +:10EDA2003D7007009D713D7030009D71AF762070FF +:10EDB20002FF2373C3760170C67665751C721A71E1 +:10EDC2003670DD76207002FF233ED97601706E75B3 +:10EDD200A97679708475CF709371207004FF73697E +:10EDE200676EE476017021713670FA763D702D00FF +:10EDF200AF76207003FF642E7200EF760170FF7011 +:10EE02007675D47CBE76DC76E170F376E776F670C2 +:10EE1200CF709371EB77FB77207002FF2E72FB7637 +:10EE22000170FF70677DF670FF76207002FF642E1E +:10EE32000E7701705471FF76E277207001FF2E0089 +:10EE420017770170677D1A77207003FF75642E00B3 +:10EE52001F77017054713377E277207004FF756475 +:10EE62002E7226770170FF70BE76DC76E776F6703A +:10EE7200CF709371EB77FB77207006FF75642F6D6F +:10EE82006F642F770170FF7054710871C271F67050 +:10EE9200C470FF70C271F670207006FF6469676902 +:10EEA200743F3E7701708576B1703D70390078719C +:10EEB2003D70000113729D71B1703D704001787117 +:10EEC2003D700701137293713D7030009371B17000 +:10EED200517579705C71207001700871CC77F67091 +:10EEE200CF702F7204729D712F72FF70207002FF1B +:10EEF200732C4E770170B1707F7720700170CC0156 +:10EF0200B170047276750B729371FF7054718B023B +:10EF1200367092779B72B1707970CC015E75C9724E +:10EF22008C77F670287136709977B1709870CC0131 +:10EF3200D970207005FF6974797065007877017067 +:10EF4200B170047276750B729371FF7054718B02FB +:10EF52003670B4779B72B170CB73B170C177BD77E5 +:10EF62002F72C972AC77F67028713670BB77B170A8 +:10EF7200CB73C177D97020700170F972C17720709C +:10EF820001703D70FF0013728E75207006FF696379 +:10EF92006F756E749B770170B1702F72C470CB73F2 +:10EFA200207002FF6372C77701703D700D008E758D +:10EFB2003D700A008E75207005FF737061636500F5 +:10EFC200D2770170F0758E75207006FF73706163E1 +:10EFD2006573DD77017054716A76B1703670F577BA +:10EFE200E27735722F70EE77D970207004FF747952 +:10EFF2007065E67701705E7D8B02367006789B72D3 +:10F00200AC7298708E75C9720178207001FF27006A +:10F01200F7770170B479CC7AD77AB1704A7B7F7D69 +:10F02200C470CB733D707F7B7F7D1C7236701C7801 +:10F032003D70F3FF4178D970207007FF68616E64FC +:10F042006C657200077858700A0005FF636174638B +:10F0520068001E7801708D72FF7024787970FF70DD +:10F062007672247881702A70F67024788170F67036 +:10F07200D9705471207005FF7468726F770026781A +:10F082000170B1701A7136704878D9702070247886 +:10F0920079708072F67024788170F670C470FF7097 +:10F0A2009672D970F670207005FF63736B697000F9 +:10F0B2003C780170FF70B17036706978CF709870CB +:10F0C20008717F7D36706978867DA5792F705C78AE +:10F0D200F670D970207005FF637363616E00557816 +:10F0E2000170FF70CF70B170987008717F7D1A71D6 +:10F0F20036708678C4703572C470CF7021711A71FF +:10F10200367086782F722F707478F070CF7093718A +:10F11200F670D970207006FF6163636570746C7855 +:10F122000170CF709D713572CF709F75B170D278BA +:10F132001A713670C478B1703D7008007F7D3670E8 +:10F14200B478D970E17065757871FF70E170E17023 +:10F15200F6703670B278CA783572FF70CF70F6707A +:10F162005E012F70C278B170F0756E713670BB7827 +:10F17200D970F075B1708E75CF708D702F72CF709F +:10F182006A012F709678D970F070C4709371D57738 +:10F19200207001703D700800B1708E75E2778E7537 +:10F1A20020700170B1703D700D007F7DC4703D70A4 +:10F1B2000A007F7D1C72207006FF726566696C6CA6 +:10F1C2008C78137C1A00DC7BE87B04FF6368617235 +:10F1D200DD780170B479D9709870207006FF6E7571 +:10F1E2006D626572E678017051757970FF703879D9 +:10F1F200FF704B793879F6701C72FF70B1701A711A +:10F2020036700B796E75F670D970F6705175817023 +:10F21200547120701E73547154712D736979B970D1 +:10F2220036702D79867D7F7D3670247998703D7099 +:10F232002E007F7D36702579F67036702179E17C5B +:10F242008B7D2F703379D9706E75F670D970F67028 +:10F2520051758170547120706E75F6703670327906 +:10F262003F76867DF670517581704B71207001700A +:10F27200CF7098703D702D007F7DB170FF70367039 +:10F282004479867DA579F670207052700A001000CC +:10F2920002000A000170CF7098703D7023009371D4 +:10F2A200B17054713D700400777636706179467999 +:10F2B2009D71CB7351758170867DA5792F706279AE +:10F2C200D970207007FF3E6E756D62657200EF782F +:10F2D2000170B17036708179CF70987053771A715E +:10F2E20036707579D9702070FF70057D517579700F +:10F2F2004F01F6704701057D867DA5792F706A79E9 +:10F30200207005FF70617273650063790170FF7090 +:10F312009B797E757970A579F6707178B1702F72CC +:10F322007E756572867DA579207006FF736F757292 +:10F3320063658279137C1600DC7BE87B07FF2F7301 +:10F342007472696E670096790170E170CF709D7179 +:10F35200E170E170937120700AFF70617273652D24 +:10F362006E616D659F790170F075B87920700170DA +:10F37200FF709B797E757970A57908715A78F6705D +:10F38200717865759D719B79D97093717E75817065 +:10F39200207007FF66696E642D787400AD79017084 +:10F3A2003D70DC793D704E000C041A713670DB79C9 +:10F3B2006E75547120700170FF706575F670257C52 +:10F3C200B1703670E979FF70F070F070F6704B71C1 +:10F3D200207001706D770300206F6B00A0772070A2 +:10F3E20003FF2E6F6B00CA79137C1C00DC7BE87B69 +:10F3F20001706D7702003E20D577A077207006FF5E +:10F402002E7265616479F179137C2000DC7BE87BE4 +:10F4120001706D770400203F3F20A077517579700D +:10F42200FF70DD7522777E7579702277F6705175DF +:10F432008170207006FF2E6572726F72007A137CE3 +:10F442001E00DC7BE87B04FF717569741B7A017016 +:10F45200C102C8028170897A9672967A80725603C6 +:10F462004B7579701A713670377A057AE278367090 +:10F47200497A3D70AF7A2B78B9703670497AB1709B +:10F482003D70FEFF6E713670477A207A2F70297AAE +:10F49200F5792F70317A05FF706175736500247AF2 +:10F4A200137C3A01C87BD27B04FF636F6C644C7A95 +:10F4B2005A7AA4B622243324BB2424BEE0E0F1E02D +:10F4C2002192E030E9F7F131D9F7ECE3F1E02F01D5 +:10F4D2000FEF0DBF048310E11EBF1583CFEAC68371 +:10F4E200D0E1D783ACE7BAE70C94057004FF7761EB +:10F4F200726D557A0170507D3D707F7B3D70517AFF +:10F50200F37B5603F875287A03FF73703000777A1D +:10F512006F700600DC7BE87B02FF7370857A58709F +:10F52200080003FF727030008D7A01709A7A797048 +:10F5320020705870040005FF646570746800927A48 +:10F542000170897A8D72937104723572207009FF8D +:10F55200696E74657270726574009C7A0170B47918 +:10F56200B1703670C07ACC7AD77A4B7579703670B2 +:10F57200BB7AAB7BCB732A70577B2F70B07A6E75D8 +:10F58200207010FF666F7274682D7265636F676E0C +:10F59200697A6572A87A6F704200B47BBE7B09FFFC +:10F5A2007265636F676E697A6500C27A01703D7039 +:10F5B200E27AC4700C041A713670E17A6E754A7B75 +:10F5C20020700170E170E17065751E73E1702A7040 +:10F5D2002D73E170B1704A7B7F7D3670F37AD970FA +:10F5E20054712070F070F0704B71207006FF6474DB +:10F5F2003A6E756DD07A52707F7BE201E20107FFAD +:10F6020064743A646E756D00F77A52707F7B777D11 +:10F61200777D07FF7265633A6E756D00007B01703E +:10F62200F47836701C7B867D7F7D36701A7BFC7A7F +:10F632002070067B20704A7B207008FF7265633A57 +:10F6420066696E640A7B0170D079B1701A71367086 +:10F652002D7BD9704A7B2070347B207005FF647447 +:10F662003A7874001E7B5270387B3C7B777D017048 +:10F67200D9702A702070017021713670427BCC01E2 +:10F6820020702A70207007FF64743A6E756C6C00EB +:10F692002F7B52704E7B4E7B4E7B01703D70F3FF91 +:10F6A200417806FF3F737461636B447B0170A17AFA +:10F6B200217136705F7B3D70FCFF4178207003FF43 +:10F6C20076657200527B01700D75A077E2775175F5 +:10F6D20079701B75DD75677DBE76C6763D702E002E +:10F6E200AF76DC76E776FB7751758170E27723752A +:10F6F200A077207004FF6E6F6F70607B01702070C6 +:10F7020006FF756E757365647B7B01708D72BF75C4 +:10F71200937120700200746F817B01700A78707D92 +:10F722004B75797036709F7BC101997BCC0120703B +:10F732000170F670B170AB7BFF70CB73B170AB7BB5 +:10F74200AB7BCB732A70207007FF692D63656C6CED +:10F752002B008B7B01702F72207007FF456465665A +:10F7620065724000A57B0170CB735F73207007FF49 +:10F772004564656665722100AE7B0170CB733B7395 +:10F78200207007FF5264656665724000B87B0170A5 +:10F79200CB737970207007FF526465666572210031 +:10F7A200C27B0170CB738170207007FF5564656660 +:10F7B20065724000CC7B0170CB7302739D717970CE +:10F7C200207007FF5564656665722100D67B017063 +:10F7D200CB7302739D718170207006FF646566654C +:10F7E2007221E27B0170707DB170AB7BAB7BCB731E +:10F7F2002A70207006FF646566657240EE7B0170B8 +:10F80200707DB170AB7BCB732A70207007FF2864C8 +:10F81200656665722900FB7B01709E01FE02C101D3 +:10F82200137C20700E941703B170AB7BCB732A70DC +:10F832002A7020700FFF7365617263682D776F7293 +:10F84200646C69737400077C0170FF7054713D70C1 +:10F852003A7CF670577CB1701A713670347C6E75D2 +:10F86200D97054712070B1707E7CC47084017201B1 +:10F8720020700170FF70D97065750871727C887C88 +:10F882003670487CF670D97054714B7120706E7569 +:10F89200F6705471207011FF74726176657273652F +:10F8A2002D776F72646C697374001B7C01705F73D7 +:10F8B200B1703670687C65751E73C4702A702D73C2 +:10F8C200E1703670687C7B04CB732F70597C6E7547 +:10F8D20020700BFF6E616D653E737472696E670016 +:10F8E2004C7C0170CC773D70FF001372207007FFD3 +:10F8F2006E66613E636661006A7C01707B042F72F2 +:10F90200207008FF69636F6D70617265787C0170A9 +:10F91200FF70CF70F67013713670937C6E75D9706C +:10F922004B712070C47054718B023670B67C9B721E +:10F93200CF707970CF70CB73B1703D7000015C7184 +:10F942003670A77CC4703D70FF001372137136705D +:10F95200AE7C6E754B71D47220702F72C4705E755E +:10F96200C4703D700200BA72997C6E755471207039 +:10F9720001FF2A00827C0170A671D970207001FFFC +:10F982006A00B97C017076723D7007009D717970D2 +:10F9920076723D7009009D7179709D71207004FF2F +:10F9A20064616273C07C0170B17021713670DA7C5F +:10F9B200E17C207007FF646E656761746500D07C2E +:10F9C20001703B74867D54711574207005FF636D60 +:10F9D2006F766500DB7CED7CBF93AF93E991F99183 +:10F9E200A991B991092F082B21F01D91119301972B +:10F9F200E1F7AF91BF91899199910C94057005FF40 +:10FA0200327377617000E77C0170E170FF70E17022 +:10FA1200F67020700AFF726566696C6C2D746962FB +:10FA2200007D01702E7D3D705A009178347D817089 +:10FA320054717E7581704B7120700AFF736F7572FD +:10FA420063652D7469620B7D01702E7D347D797042 +:10FA5200207003FF746962001E7D4870680104FF14 +:10FA6200237469622A7D4870C20106FF65653E7291 +:10FA7200616D307D017054719B72CF705F73CF7076 +:10FA820081705E75C4705E75C470C9723E7D6E759C +:10FA9200207008FF696E69742D72616D367D017088 +:10FAA2003D706E0002733D70220004723B7D207037 +:10FAB20006FF626F756E64734A7D0170CF709D712F +:10FAC200C470207003FF733E6400597D0170B170F1 +:10FAD2002171207005FF3E626F647900637D307290 +:10FAE2000800326C69746572616C6B7D0170C47060 +:10FAF200E201E201207001FF3D00717D017093710E +:10FB02001A71207001FF31007C7D4870010001FFF5 +:10FB12003200837D4870020002FF2D31887D4870DB +:02FB2200FFFFE3 +:00000001FF diff --git a/amforth-6.5/appl/eval-pollin/p644-16.lst b/amforth-6.5/appl/eval-pollin/p644-16.lst new file mode 100644 index 0000000..2c8872a --- /dev/null +++ b/amforth-6.5/appl/eval-pollin/p644-16.lst @@ -0,0 +1,10444 @@ + +AVRASM ver. 2.1.52 p644-16.asm Sun Apr 30 20:10:15 2017 + +p644-16.asm(5): 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/atmega644\device.asm' +../../avr8/devices/atmega644\device.asm(5): Including file '../../avr8/Atmel/Appnotes2\m644def.inc' +p644-16.asm(14): Including file '../../avr8\drivers/usart_0.asm' +../../avr8\drivers/usart_0.asm(32): 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' +p644-16.asm(19): Including file '../../avr8\drivers/1wire.asm' +p644-16.asm(21): Including file '../../avr8\amforth.asm' +../../avr8\amforth.asm(12): Including file '../../avr8\drivers/generic-isr.asm' +../../avr8\amforth.asm(14): 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.asm(15): Including file 'dict_appl.inc' +dict_appl.inc(3): Including file '../../common\words/dot-s.asm' +dict_appl.inc(4): Including file '../../avr8\words/spirw.asm' +dict_appl.inc(5): Including file '../../avr8\words/n-spi.asm' +dict_appl.inc(6): Including file 'words/applturnkey.asm' +dict_appl.inc(7): 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' +dict_appl.inc(8): Including file '../../avr8\words/2r_fetch.asm' +../../avr8\amforth.asm(23): Including file '../../avr8\amforth-interpreter.asm' +../../avr8\amforth.asm(24): 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(97): Including file '../../avr8\words/store-i_nrww.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/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.asm(25): Including file 'dict_appl_core.inc' +../../avr8\amforth.asm(36): Including file '../../avr8\amforth-eeprom.inc' + + + ; file see ../template/template.asm. You may want to + ; copy that file to this one and edit it afterwards. + + .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 = 256 + .equ CELLSIZE = 2 + .macro readflashcell + lsl zl + rol zh + lpm @0, Z+ + lpm @1, Z+ + .endmacro + .macro writeflashcell + lsl zl + rol zh + .endmacro + .set WANT_ANALOG_COMPARATOR = 0 + .set WANT_USART0 = 0 + .set WANT_PORTA = 0 + .set WANT_PORTB = 0 + .set WANT_PORTC = 0 + .set WANT_PORTD = 0 + .set WANT_TIMER_COUNTER_0 = 0 + .set WANT_TIMER_COUNTER_2 = 0 + .set WANT_WATCHDOG = 0 + .set WANT_JTAG = 0 + .set WANT_BOOT_LOAD = 0 + .set WANT_EXTERNAL_INTERRUPT = 0 + .set WANT_AD_CONVERTER = 0 + .set WANT_TIMER_COUNTER_1 = 0 + .set WANT_EEPROM = 0 + .set WANT_TWI = 0 + .set WANT_SPI = 0 + .set WANT_CPU = 0 + .equ intvecsize = 2 ; please verify; flash size: 65536 bytes + .equ pclen = 2 ; please verify + .overlap + .org 2 +000002 d12a rcall isr ; External Interrupt Request 0 + .org 4 +000004 d128 rcall isr ; External Interrupt Request 1 + .org 6 +000006 d126 rcall isr ; External Interrupt Request 2 + .org 8 +000008 d124 rcall isr ; Pin Change Interrupt Request 0 + .org 10 +00000a d122 rcall isr ; Pin Change Interrupt Request 1 + .org 12 +00000c d120 rcall isr ; Pin Change Interrupt Request 2 + .org 14 +00000e d11e rcall isr ; Pin Change Interrupt Request 3 + .org 16 +000010 d11c rcall isr ; Watchdog Time-out Interrupt + .org 18 +000012 d11a rcall isr ; Timer/Counter2 Compare Match A + .org 20 +000014 d118 rcall isr ; Timer/Counter2 Compare Match B + .org 22 +000016 d116 rcall isr ; Timer/Counter2 Overflow + .org 24 +000018 d114 rcall isr ; Timer/Counter1 Capture Event + .org 26 +00001a d112 rcall isr ; Timer/Counter1 Compare Match A + .org 28 +00001c d110 rcall isr ; Timer/Counter1 Compare Match B + .org 30 +00001e d10e rcall isr ; Timer/Counter1 Overflow + .org 32 +000020 d10c rcall isr ; Timer/Counter0 Compare Match A + .org 34 +000022 d10a rcall isr ; Timer/Counter0 Compare Match B + .org 36 +000024 d108 rcall isr ; Timer/Counter0 Overflow + .org 38 +000026 d106 rcall isr ; SPI Serial Transfer Complete + .org 40 +000028 d104 rcall isr ; USART0, Rx Complete + .org 42 +00002a d102 rcall isr ; USART0 Data register Empty + .org 44 +00002c d100 rcall isr ; USART0, Tx Complete + .org 46 +00002e d0fe rcall isr ; Analog Comparator + .org 48 +000030 d0fc rcall isr ; ADC Conversion Complete + .org 50 +000032 d0fa rcall isr ; EEPROM Ready + .org 52 +000034 d0f8 rcall isr ; 2-wire Serial Interface + .org 54 +000036 d0f6 rcall isr ; Store Program Memory Read + .equ INTVECTORS = 28 + .nooverlap + + ; compatability layer (maybe empty) + + ; controller data area, environment query mcu-info + mcu_info: + mcu_ramsize: +000037 1000 .dw 4096 + mcu_eepromsize: +000038 0800 .dw 2048 + mcu_maxdp: +000039 e000 .dw 57344 + mcu_numints: +00003a 001c .dw 28 + mcu_name: +00003b 0009 .dw 9 +00003c 5441 +00003d 656d +00003e 6167 +00003f 3436 +000040 0034 .db "ATmega644",0 + .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 + + .set AMFORTH_RO_SEG = NRWW_START_ADDR+1 + + ; cpu clock in hertz + .equ F_CPU = 16000000 + .set BAUD_MAXERROR = 30 + .equ TIMER_INT = OVF2addr + + .include "drivers/usart_0.asm" + + .equ BAUDRATE_HIGH = UBRR0H + .equ USART_C = UCSR0C + .equ USART_B = UCSR0B + .equ USART_A = UCSR0A + .equ USART_DATA = UDR0 + .ifndef URXCaddr + .equ URXCaddr = URXC0addr + .equ UDREaddr = UDRE0addr + .endif + + .equ bm_USART_RXRD = 1 << RXC0 + .equ bm_USART_TXRD = 1 << UDRE0 + .equ bm_ENABLE_TX = 1 << TXEN0 + .equ bm_ENABLE_RX = 1 << RXEN0 + .equ bm_ENABLE_INT_RX = 1<rx-buf",0 +000046 0000 .dw VE_HEAD + .set VE_HEAD = VE_TO_RXBUF + XT_TO_RXBUF: +000047 0048 .dw PFA_rx_tobuf + PFA_rx_tobuf: +000048 2f08 mov temp0, tosl +000049 9110 0110 lds temp1, usart_rx_in +00004b e0e0 ldi zl, low(usart_rx_data) +00004c e0f1 ldi zh, high(usart_rx_data) +00004d 0fe1 add zl, temp1 +00004e 1df3 adc zh, zeroh +00004f 8300 st Z, temp0 +000050 9513 inc temp1 +000051 701f andi temp1,usart_rx_mask +000052 9310 0110 sts usart_rx_in, temp1 +000054 9189 +000055 9199 loadtos +000056 940c 7005 jmp_ DO_NEXT + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ; setup with + ; ' isr-rx URXCaddr int! + VE_ISR_RX: +000058 ff06 .dw $ff06 +000059 7369 +00005a 2d72 +00005b 7872 .db "isr-rx" +00005c 0041 .dw VE_HEAD + .set VE_HEAD = VE_ISR_RX + XT_ISR_RX: +00005d 7001 .dw DO_COLON + usart_rx_isr: +00005e 703d .dw XT_DOLITERAL +00005f 00c6 .dw usart_data +000060 7098 .dw XT_CFETCH +000061 70b1 .dw XT_DUP +000062 703d .dw XT_DOLITERAL +000063 0003 .dw 3 +000064 7d7f .dw XT_EQUAL +000065 7036 .dw XT_DOCONDBRANCH +000066 0068 .dw usart_rx_isr1 +000067 7a59 .dw XT_COLD + usart_rx_isr1: +000068 0047 .dw XT_TO_RXBUF +000069 7020 .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: +00006a 7001 .dw DO_COLON + PFA_USART_INIT_RX_BUFFER: ; ( -- ) +00006b 703d +00006c 005d .dw XT_DOLITERAL, XT_ISR_RX +00006d 703d +00006e 0028 .dw XT_DOLITERAL, URXCaddr +00006f 7487 .dw XT_INTSTORE + +000070 703d .dw XT_DOLITERAL +000071 0100 .dw usart_rx_data +000072 703d .dw XT_DOLITERAL +000073 0016 .dw usart_rx_size + 6 +000074 7154 .dw XT_ZERO +000075 74cf .dw XT_FILL +000076 7020 .dw XT_EXIT + + ; ( -- c) + ; MCU + ; get 1 character from input queue, wait if needed using interrupt driver + VE_RX_BUFFER: +000077 ff06 .dw $ff06 +000078 7872 +000079 622d +00007a 6675 .db "rx-buf" +00007b 0058 .dw VE_HEAD + .set VE_HEAD = VE_RX_BUFFER + XT_RX_BUFFER: +00007c 7001 .dw DO_COLON + PFA_RX_BUFFER: +00007d 0097 .dw XT_RXQ_BUFFER +00007e 7036 .dw XT_DOCONDBRANCH +00007f 007d .dw PFA_RX_BUFFER +000080 703d .dw XT_DOLITERAL +000081 0111 .dw usart_rx_out +000082 7098 .dw XT_CFETCH +000083 70b1 .dw XT_DUP +000084 703d .dw XT_DOLITERAL +000085 0100 .dw usart_rx_data +000086 719d .dw XT_PLUS +000087 7098 .dw XT_CFETCH +000088 70c4 .dw XT_SWAP +000089 722f .dw XT_1PLUS +00008a 703d .dw XT_DOLITERAL +00008b 000f .dw usart_rx_mask +00008c 7213 .dw XT_AND +00008d 703d .dw XT_DOLITERAL +00008e 0111 .dw usart_rx_out +00008f 708d .dw XT_CSTORE +000090 7020 .dw XT_EXIT + + ; ( -- f) + ; MCU + ; check if unread characters are in the input queue + VE_RXQ_BUFFER: +000091 ff07 .dw $ff07 +000092 7872 +000093 2d3f +000094 7562 +000095 0066 .db "rx?-buf",0 +000096 0077 .dw VE_HEAD + .set VE_HEAD = VE_RXQ_BUFFER + XT_RXQ_BUFFER: +000097 7001 .dw DO_COLON + PFA_RXQ_BUFFER: +000098 7a51 .dw XT_PAUSE +000099 703d .dw XT_DOLITERAL +00009a 0111 .dw usart_rx_out +00009b 7098 .dw XT_CFETCH +00009c 703d .dw XT_DOLITERAL +00009d 0110 .dw usart_rx_in +00009e 7098 .dw XT_CFETCH +00009f 7113 .dw XT_NOTEQUAL +0000a0 7020 .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: +0000a1 ff07 .dw $ff07 +0000a2 7874 +0000a3 702d +0000a4 6c6f +0000a5 006c .db "tx-poll",0 +0000a6 0091 .dw VE_HEAD + .set VE_HEAD = VE_TX_POLL + XT_TX_POLL: +0000a7 7001 .dw DO_COLON + PFA_TX_POLL: + ; wait for data ready +0000a8 00b5 .dw XT_TXQ_POLL +0000a9 7036 .dw XT_DOCONDBRANCH +0000aa 00a8 .dw PFA_TX_POLL + ; send to usart +0000ab 703d .dw XT_DOLITERAL +0000ac 00c6 .dw USART_DATA +0000ad 708d .dw XT_CSTORE +0000ae 7020 .dw XT_EXIT + + ; ( -- f) MCU + ; MCU + ; check if a character can be send using register poll + VE_TXQ_POLL: +0000af ff08 .dw $ff08 +0000b0 7874 +0000b1 2d3f +0000b2 6f70 +0000b3 6c6c .db "tx?-poll" +0000b4 00a1 .dw VE_HEAD + .set VE_HEAD = VE_TXQ_POLL + XT_TXQ_POLL: +0000b5 7001 .dw DO_COLON + PFA_TXQ_POLL: +0000b6 7a51 .dw XT_PAUSE +0000b7 703d .dw XT_DOLITERAL +0000b8 00c0 .dw USART_A +0000b9 7098 .dw XT_CFETCH +0000ba 703d .dw XT_DOLITERAL +0000bb 0020 .dw bm_USART_TXRD +0000bc 7213 .dw XT_AND +0000bd 7020 .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: +0000be ff04 .dw $ff04 +0000bf 6275 +0000c0 7272 .db "ubrr" +0000c1 00af .dw VE_HEAD + .set VE_HEAD = VE_UBRR + XT_UBRR: +0000c2 706f .dw PFA_DOVALUE1 + PFA_UBRR: ; ( -- ) +0000c3 0090 .dw EE_UBRRVAL +0000c4 7bb4 .dw XT_EDEFERFETCH +0000c5 7bbe .dw XT_EDEFERSTORE + .include "words/usart.asm" + + ; MCU + ; initialize usart + VE_USART: +0000c6 ff06 .dw $ff06 +0000c7 752b +0000c8 6173 +0000c9 7472 .db "+usart" +0000ca 00be .dw VE_HEAD + .set VE_HEAD = VE_USART + XT_USART: +0000cb 7001 .dw DO_COLON + PFA_USART: ; ( -- ) + +0000cc 703d .dw XT_DOLITERAL +0000cd 0098 .dw USART_B_VALUE +0000ce 703d .dw XT_DOLITERAL +0000cf 00c1 .dw USART_B +0000d0 708d .dw XT_CSTORE + +0000d1 703d .dw XT_DOLITERAL +0000d2 0006 .dw USART_C_VALUE +0000d3 703d .dw XT_DOLITERAL +0000d4 00c2 .dw USART_C | bm_USARTC_en +0000d5 708d .dw XT_CSTORE + +0000d6 00c2 .dw XT_UBRR +0000d7 70b1 .dw XT_DUP +0000d8 72f9 .dw XT_BYTESWAP +0000d9 703d .dw XT_DOLITERAL +0000da 00c5 .dw BAUDRATE_HIGH +0000db 708d .dw XT_CSTORE +0000dc 703d .dw XT_DOLITERAL +0000dd 00c4 .dw BAUDRATE_LOW +0000de 708d .dw XT_CSTORE + .if XT_USART_INIT_RX!=0 +0000df 006a .dw XT_USART_INIT_RX + .endif + .if XT_USART_INIT_TX!=0 + .endif + +0000e0 7020 .dw XT_EXIT + + ; settings for 1wire interface + .equ OW_PORT=PORTB + .EQU OW_BIT=4 + .include "drivers/1wire.asm" + + ; B. J. Rodriguez (MSP 430) + ; Matthias Trute (AVR Atmega) + ; COPYRIGHT + ; (c) 2012 Bradford J. Rodriguez for the 430 code and API + + ; adapted 430 assembly code to AVR + ; wishlist: + ; use a configurable pin at runtime, compatible with bitnames.frt + ; no external pull up, no external power supply for devices + ; ??? + ; + ;.EQU OW_BIT=4 + ;.equ OW_PORT=PORTE + .set OW_DDR=(OW_PORT-1) + .set OW_PIN=(OW_DDR-1) + + ;****f* 1W.RESET + ; NAME + ; 1W.RESET + ; SYNOPSIS + ; 1W.RESET ( -- f ) Initialize 1-wire devices; return true if present + ; DESCRIPTION + ; This configures the port pin used by the 1-wire interface, and then + ; sends an "initialize" sequence to the 1-wire devices. If any device + ; is present, it will be detected. + ; + ; Timing, per DS18B20 data sheet: + ; a) Output "0" (drive output low) for >480 usec. + ; b) Output "1" (let output float). + ; c) After 15 to 60 usec, device will drive pin low for 60 to 240 usec. + ; So, wait 75 usec and sample input. + ; d) Leave output high (floating) for at least 480 usec. + ;****** + ; ( -- f ) + ; Hardware + ; Initialize 1-wire devices; return true if present + VE_OW_RESET: +0000e1 ff08 .dw $ff08 +0000e2 7731 +0000e3 722e +0000e4 7365 +0000e5 7465 .db "1w.reset" +0000e6 00c6 .dw VE_HEAD + .set VE_HEAD = VE_OW_RESET + XT_OW_RESET: +0000e7 00e8 .dw PFA_OW_RESET + PFA_OW_RESET: +0000e8 939a +0000e9 938a savetos + ; setup to output +0000ea 9a24 sbi OW_DDR, OW_BIT + ; Pull output low +0000eb 982c cbi OW_PORT, OW_BIT + ; Delay >480 usec +0000ec e8e0 +0000ed e0f7 +0000ee 9731 +0000ef f7f1 DELAY 480 + ; Critical timing period, disable interrupts. +0000f0 b71f in temp1, SREG +0000f1 94f8 cli + ; Pull output high +0000f2 9a2c sbi OW_PORT, OW_BIT + ; make pin input, sends "1" +0000f3 9824 cbi OW_DDR, OW_BIT +0000f4 e0e0 +0000f5 e0f1 +0000f6 9731 +0000f7 f7f1 DELAY 64 ; delayB + ; Sample input pin, set TOS if input is zero +0000f8 b183 in tosl, OW_PIN +0000f9 ff84 sbrs tosl, OW_BIT +0000fa ef9f ser tosh + ; End critical timing period, enable interrupts +0000fb bf1f out SREG, temp1 + ; release bus +0000fc 9824 cbi OW_DDR, OW_BIT +0000fd 982c cbi OW_PORT, OW_BIT + + ; Delay rest of 480 usec +0000fe e8e0 +0000ff e0f6 +000100 9731 +000101 f7f1 DELAY 416 + ; we now have the result flag in TOS +000102 2f89 mov tosl, tosh +000103 940c 7005 jmp_ DO_NEXT + + ;****f* 1W.SLOT + ; NAME + ; 1W.SLOT + ; SYNOPSIS + ; 1W.SLOT ( c -- c' ) Write and read one bit to/from 1-wire. + ; DESCRIPTION + ; The "touch byte" function is described in Dallas App Note 74. + ; It outputs a byte to the 1-wire pin, LSB first, and reads back + ; the state of the 1-wire pin after a suitable delay. + ; To read a byte, output $FF and read the reply data. + ; To write a byte, output that byte and discard the reply. + ; + ; This function performs one bit of the "touch" operation -- + ; one read/write "slot" in Dallas jargon. Perform this eight + ; times in a row to get the "touch byte" function. + ; + ; PARAMETERS + ; The input parameter is xxxxxxxxbbbbbbbo where + ; 'xxxxxxxx' are don't cares, + ; 'bbbbbbb' are bits to be shifted down, and + ; 'o' is the bit to be output in the slot. This must be 1 + ; to create a read slot. + ; + ; The returned value is xxxxxxxxibbbbbbb where + ; 'xxxxxxxx' are not known (the input shifted down 1 position), + ; 'i' is the bit read during the slot. This has no meaning + ; if it was a write slot. + ; 'bbbbbbb' are the 7 input bits, shifted down one position. + ; + ; This peculiar parameter usage allows OWTOUCH to be written as + ; OWSLOT OWSLOT OWSLOT OWSLOT OWSLOT OWSLOT OWSLOT OWSLOT + ; + ; NOTES + ; Interrupts are disabled during each bit. + + ; Timing, per DS18B20 data sheet: + ; a) Output "0" for start period. (> 1 us, < 15 us, typ. 6 us*) + ; b) Output data bit (0 or 1), open drain + ; c) After MS from start of cycle, sample input (15 to 60 us, typ. 25 us*) + ; d) After write-0 period from start of cycle, output "1" (>60 us) + ; e) After recovery period, loop or return. (> 1 us) + ; For writes, DS18B20 samples input 15 to 60 usec from start of cycle. + ; * "Typical" values are per App Note 132 for a 300m cable length. + + ; --------- ------------------------------- + ; \ / / + ; ------------------------------- + ; a b c d e + ; | 6us | 19us | 35us | 2us | + ;****** + ; ( c -- c' ) + ; Hardware + ; Write and read one bit to/from 1-wire. + VE_OW_SLOT: +000105 ff07 .dw $ff07 +000106 7731 +000107 732e +000108 6f6c +000109 0074 .db "1w.slot",0 +00010a 00e1 .dw VE_HEAD + .set VE_HEAD = VE_OW_SLOT + XT_OW_SLOT: +00010b 010c .dw PFA_OW_SLOT + PFA_OW_SLOT: + ; pull low +00010c 982c cbi OW_PORT, OW_BIT +00010d 9a24 sbi OW_DDR, OW_BIT + ; disable interrupts +00010e b71f in temp1, SREG +00010f 94f8 cli +000110 e1e8 +000111 e0f0 +000112 9731 +000113 f7f1 DELAY 6 ; DELAY A + ; check bit +000114 9488 clc +000115 9587 ror tosl +000116 f410 brcc PFA_OW_SLOT0 ; a 0 keeps the bus low + ; release bus, a 1 is written +000117 9a2c sbi OW_PORT, OW_BIT +000118 9824 cbi OW_DDR, OW_BIT + PFA_OW_SLOT0: + ; sample the input (no action required if zero) +000119 e2e4 +00011a e0f0 +00011b 9731 +00011c f7f1 DELAY 9 ; wait DELAY E to sample +00011d b103 in temp0, OW_PIN +00011e fd04 sbrc temp0, OW_BIT +00011f 6880 ori tosl, $80 + +000120 ecec +000121 e0f0 +000122 9731 +000123 f7f1 DELAY 51 ; DELAY B +000124 9a2c sbi OW_PORT, OW_BIT ; release bus +000125 9824 cbi OW_DDR, OW_BIT +000126 e0e8 +000127 e0f0 +000128 9731 +000129 f7f1 delay 2 + ; re-enable interrupts +00012a bf1f out SREG, temp1 +00012b 940c 7005 jmp_ DO_NEXT + + .include "amforth.asm" + + ;;;; + ;;;; GPL V2 (only) + + .set AMFORTH_NRWW_SIZE=(FLASHEND-AMFORTH_RO_SEG)*2 + + .set corepc = pc + .org $0000 +000000 940c 7a5a jmp_ PFA_COLD + + .org corepc + .include "drivers/generic-isr.asm" + + .eseg +000000 intvec: .byte INTVECTORS * CELLSIZE + .dseg +000112 intcnt: .byte INTVECTORS + .cseg + + ; interrupt routine gets called (again) by rcall! This gives the + ; address of the int-vector on the stack. + isr: +00012d 920a st -Y, r0 +00012e b60f in r0, SREG +00012f 920a st -Y, r0 + .if (pclen==3) + .endif +000130 900f pop r0 +000131 900f pop r0 ; = intnum * intvectorsize + 1 (address following the rcall) +000132 940a dec r0 + .if intvecsize == 1 ; + .endif +000133 2cb0 mov isrflag, r0 +000134 93ff push zh +000135 93ef push zl +000136 e1e2 ldi zl, low(intcnt) +000137 e0f1 ldi zh, high(intcnt) +000138 9406 lsr r0 ; we use byte addresses in the counter array, not words +000139 0de0 add zl, r0 +00013a 1df3 adc zh, zeroh +00013b 8000 ld r0, Z +00013c 9403 inc r0 +00013d 8200 st Z, r0 +00013e 91ef pop zl +00013f 91ff pop zh + +000140 9009 ld r0, Y+ +000141 be0f out SREG, r0 +000142 9009 ld r0, Y+ +000143 9508 ret ; returns the interrupt, the rcall stack frame is removed! + ; no reti here, see words/isr-end.asm + ; lower part of the dictionary + .include "dict/rww.inc" + + + ; Arithmetics + ; add a number to a double cell + VE_MPLUS: +000144 ff02 .dw $ff02 +000145 2b6d .db "m+" +000146 0105 .dw VE_HEAD + .set VE_HEAD = VE_MPLUS + XT_MPLUS: +000147 7001 .dw DO_COLON + PFA_MPLUS: +000148 7d67 .dw XT_S2D +000149 7415 .dw XT_DPLUS +00014a 7020 .dw XT_EXIT + .include "words/ud-star.asm" + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_UDSTAR: +00014b ff03 .dw $ff03 +00014c 6475 +../../common\words/ud-star.asm(9): warning: .cseg .db misalignment - padding zero byte +00014d 002a .db "ud*" +00014e 0144 .dw VE_HEAD + .set VE_HEAD = VE_UDSTAR + XT_UDSTAR: +00014f 7001 .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 + ; + +000150 70b1 +000151 70ff +000152 71e0 +000153 70d9 .DW XT_DUP,XT_TO_R,XT_UMSTAR,XT_DROP +000154 70c4 +000155 70f6 +000156 71e0 +000157 70e1 +000158 719d +000159 7020 .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: +00015a ff04 .dw $ff04 +00015b 6d75 +00015c 7861 .db "umax" +00015d 014b .dw VE_HEAD + .set VE_HEAD = VE_UMAX + XT_UMAX: +00015e 7001 .dw DO_COLON + PFA_UMAX: + .endif + +00015f 7565 +000160 715c .DW XT_2DUP,XT_ULESS +000161 7036 .dw XT_DOCONDBRANCH +000162 0164 DEST(UMAX1) +000163 70c4 .DW XT_SWAP +000164 70d9 UMAX1: .DW XT_DROP +000165 7020 .dw XT_EXIT + .include "words/umin.asm" + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_UMIN: +000166 ff04 .dw $ff04 +000167 6d75 +000168 6e69 .db "umin" +000169 015a .dw VE_HEAD + .set VE_HEAD = VE_UMIN + XT_UMIN: +00016a 7001 .dw DO_COLON + PFA_UMIN: + .endif +00016b 7565 +00016c 7167 .DW XT_2DUP,XT_UGREATER +00016d 7036 .dw XT_DOCONDBRANCH +00016e 0170 DEST(UMIN1) +00016f 70c4 .DW XT_SWAP +000170 70d9 UMIN1: .DW XT_DROP +000171 7020 .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: +000172 7001 .dw DO_COLON + PFA_IMMEDIATEQ: +000173 703d .dw XT_DOLITERAL +000174 8000 .dw $8000 +000175 7213 .dw XT_AND +000176 711a .dw XT_ZEROEQUAL +000177 7036 .dw XT_DOCONDBRANCH +000178 017b DEST(IMMEDIATEQ1) +000179 7d86 .dw XT_ONE +00017a 7020 .dw XT_EXIT + IMMEDIATEQ1: + ; not immediate +00017b 714b .dw XT_TRUE +00017c 7020 .dw XT_EXIT + .include "words/name2flags.asm" + + ; Tools + ; get the flags from a name token + VE_NAME2FLAGS: +00017d ff0a .dw $ff0a +00017e 616e +00017f 656d +000180 663e +000181 616c +000182 7367 .db "name>flags" +000183 0166 .dw VE_HEAD + .set VE_HEAD = VE_NAME2FLAGS + XT_NAME2FLAGS: +000184 7001 .dw DO_COLON + PFA_NAME2FLAGS: +000185 73cb .dw XT_FETCHI ; skip to link field +000186 703d .dw XT_DOLITERAL +000187 ff00 .dw $ff00 +000188 7213 .dw XT_AND +000189 7020 .dw XT_EXIT + + .if AMFORTH_NRWW_SIZE > 8000 + .include "dict/appl_8k.inc" + + + .include "words/newest.asm" + + ; System Variable + ; system state + VE_NEWEST: +00018a ff06 .dw $ff06 +00018b 656e +00018c 6577 +00018d 7473 .db "newest" +00018e 017d .dw VE_HEAD + .set VE_HEAD = VE_NEWEST + XT_NEWEST: +00018f 7048 .dw PFA_DOVARIABLE + PFA_NEWEST: +000190 012e .dw ram_newest + + .dseg +00012e ram_newest: .byte 4 + .include "words/latest.asm" + + ; System Variable + ; system state + VE_LATEST: +000191 ff06 .dw $ff06 +000192 616c +000193 6574 +000194 7473 .db "latest" +000195 018a .dw VE_HEAD + .set VE_HEAD = VE_LATEST + XT_LATEST: +000196 7048 .dw PFA_DOVARIABLE + PFA_LATEST: +000197 0132 .dw ram_latest + + .dseg +000132 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: +000198 ff08 .dw $ff08 +000199 6328 +00019a 6572 +00019b 7461 +00019c 2965 .db "(create)" +00019d 0191 .dw VE_HEAD + .set VE_HEAD = VE_DOCREATE + XT_DOCREATE: +00019e 7001 .dw DO_COLON + PFA_DOCREATE: + .endif +00019f 79b4 +0001a0 02f5 .DW XT_PARSENAME,XT_WLSCOPE ; ( -- addr len wid) +0001a1 70b1 +0001a2 018f +0001a3 755e +0001a4 7081 .DW XT_DUP,XT_NEWEST,XT_CELLPLUS,XT_STORE ; save the wid +0001a5 02da +0001a6 018f +0001a7 7081 .DW XT_HEADER,XT_NEWEST,XT_STORE ; save the nt +0001a8 7020 .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: +0001a9 0001 .dw $0001 +0001aa 005c .db $5c,0 +0001ab 0198 .dw VE_HEAD + .set VE_HEAD = VE_BACKSLASH + XT_BACKSLASH: +0001ac 7001 .dw DO_COLON + PFA_BACKSLASH: + .endif +0001ad 799b .dw XT_SOURCE +0001ae 70f0 .dw XT_NIP +0001af 757e .dw XT_TO_IN +0001b0 7081 .dw XT_STORE +0001b1 7020 .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: +0001b2 0001 .dw $0001 +0001b3 0028 .db "(" ,0 +0001b4 01a9 .dw VE_HEAD + .set VE_HEAD = VE_LPAREN + XT_LPAREN: +0001b5 7001 .dw DO_COLON + PFA_LPAREN: + .endif +0001b6 703d .dw XT_DOLITERAL +0001b7 0029 .dw ')' +0001b8 7987 .dw XT_PARSE +0001b9 756e .dw XT_2DROP +0001ba 7020 .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: +0001bb ff07 .dw $ff07 +0001bc 6f63 +0001bd 706d +0001be 6c69 +0001bf 0065 .db "compile",0 +0001c0 01b2 .dw VE_HEAD + .set VE_HEAD = VE_COMPILE + XT_COMPILE: +0001c1 7001 .dw DO_COLON + PFA_COMPILE: + .endif +0001c2 70f6 .dw XT_R_FROM +0001c3 70b1 .dw XT_DUP +0001c4 7bab .dw XT_ICELLPLUS +0001c5 70ff .dw XT_TO_R +0001c6 73cb .dw XT_FETCHI +0001c7 01cc .dw XT_COMMA +0001c8 7020 .dw XT_EXIT + .include "words/comma.asm" + + ; Dictionary + ; compile 16 bit into flash at DP + VE_COMMA: +0001c9 ff01 .dw $ff01 +0001ca 002c .db ',',0 ; , +0001cb 01bb .dw VE_HEAD + .set VE_HEAD = VE_COMMA + XT_COMMA: +0001cc 7001 .dw DO_COLON + PFA_COMMA: +0001cd 75ae .dw XT_DP +0001ce 7373 .dw XT_STOREI +0001cf 75ae .dw XT_DP +0001d0 722f .dw XT_1PLUS +0001d1 7b99 .dw XT_DOTO +0001d2 75af .dw PFA_DP +0001d3 7020 .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: +0001d4 0003 .dw $0003 +0001d5 275b +0001d6 005d .db "[']",0 +0001d7 01c9 .dw VE_HEAD + .set VE_HEAD = VE_BRACKETTICK + XT_BRACKETTICK: +0001d8 7001 .dw DO_COLON + PFA_BRACKETTICK: + .endif +0001d9 780a .dw XT_TICK +0001da 01e2 .dw XT_LITERAL +0001db 7020 .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: +0001dc 0007 .dw $0007 +0001dd 696c +0001de 6574 +0001df 6172 +0001e0 006c .db "literal",0 +0001e1 01d4 .dw VE_HEAD + .set VE_HEAD = VE_LITERAL + XT_LITERAL: +0001e2 7001 .dw DO_COLON + PFA_LITERAL: + .endif +0001e3 01c1 .DW XT_COMPILE +0001e4 703d .DW XT_DOLITERAL +0001e5 01cc .DW XT_COMMA +0001e6 7020 .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: +0001e7 0008 .dw $0008 +0001e8 6c73 +0001e9 7469 +0001ea 7265 +0001eb 6c61 .db "sliteral" +0001ec 01dc .dw VE_HEAD + .set VE_HEAD = VE_SLITERAL + XT_SLITERAL: +0001ed 7001 .dw DO_COLON + PFA_SLITERAL: + .endif +0001ee 01c1 .dw XT_COMPILE +0001ef 776d .dw XT_DOSLITERAL ; ( -- addr n) +0001f0 777b .dw XT_SCOMMA +0001f1 7020 .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: +0001f2 7001 .dw DO_COLON + PFA_GMARK: +0001f3 75ae .dw XT_DP +0001f4 01c1 .dw XT_COMPILE +0001f5 ffff .dw -1 ; ffff does not erase flash +0001f6 7020 .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: +0001f7 7001 .dw DO_COLON + PFA_GRESOLVE: +0001f8 7b57 .dw XT_QSTACK +0001f9 75ae .dw XT_DP +0001fa 70c4 .dw XT_SWAP +0001fb 7373 .dw XT_STOREI +0001fc 7020 .dw XT_EXIT + .include "words/l_mark.asm" + + ; Compiler + ; place destination for backward branch + ;VE_LMARK: + ; .dw $ff05 + ; .db "r if 2drop then r> invert ; + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + XT_QDOCHECK: +00028b 7001 .dw DO_COLON + PFA_QDOCHECK: + .endif +00028c 7565 .dw XT_2DUP +00028d 7d7f .dw XT_EQUAL +00028e 70b1 .dw XT_DUP +00028f 70ff .dw XT_TO_R +000290 7036 .dw XT_DOCONDBRANCH +000291 0293 DEST(PFA_QDOCHECK1) +000292 756e .dw XT_2DROP + PFA_QDOCHECK1: +000293 70f6 .dw XT_R_FROM +000294 71fd .dw XT_INVERT +000295 7020 .dw XT_EXIT + .include "words/endloop.asm" + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_ENDLOOP: +000296 ff07 .dw $ff07 +000297 6e65 +000298 6c64 +000299 6f6f +00029a 0070 .db "endloop",0 +00029b 027f .dw VE_HEAD + .set VE_HEAD = VE_ENDLOOP + XT_ENDLOOP: +00029c 7001 .dw DO_COLON + PFA_ENDLOOP: + .endif + ;Z ENDLOOP adrs xt -- L: 0 a1 a2 .. aN -- + ; ?DUP WHILE POSTPONE THEN REPEAT ; + ; resolve LEAVEs + ; This is a common factor of LOOP and +LOOP. + +00029d 0200 .DW XT_LRESOLVE +00029e 02a9 +00029f 70b9 +0002a0 7036 LOOP1: .DW XT_L_FROM,XT_QDUP,XT_DOCONDBRANCH +0002a1 02a5 DEST(LOOP2) +0002a2 0225 .DW XT_THEN +0002a3 702f .dw XT_DOBRANCH +0002a4 029e DEST(LOOP1) +0002a5 7020 LOOP2: .DW XT_EXIT + ; leave address stack + .include "words/l-from.asm" + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_L_FROM: +0002a6 ff02 .dw $ff02 +0002a7 3e6c .db "l>" +0002a8 0296 .dw VE_HEAD + .set VE_HEAD = VE_L_FROM + XT_L_FROM: +0002a9 7001 .dw DO_COLON + PFA_L_FROM: + + .endif + ;Z L> -- x L: x -- move from leave stack + ; LP @ @ -2 LP +! ; + +0002aa 02c8 .dw XT_LP +0002ab 7079 .dw XT_FETCH +0002ac 7079 .dw XT_FETCH +0002ad 703d .dw XT_DOLITERAL +0002ae fffe .dw -2 +0002af 02c8 .dw XT_LP +0002b0 7265 .dw XT_PLUSSTORE +0002b1 7020 .dw XT_EXIT + .include "words/to-l.asm" + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_TO_L: +0002b2 ff02 .dw $ff02 +0002b3 6c3e .db ">l" +0002b4 02a6 .dw VE_HEAD + .set VE_HEAD = VE_TO_L + XT_TO_L: +0002b5 7001 .dw DO_COLON + PFA_TO_L: + .endif + ;Z >L x -- L: -- x move to leave stack + ; CELL LP +! LP @ ! ; (L stack grows up) + +0002b6 7d8b .dw XT_TWO +0002b7 02c8 .dw XT_LP +0002b8 7265 .dw XT_PLUSSTORE +0002b9 02c8 .dw XT_LP +0002ba 7079 .dw XT_FETCH +0002bb 7081 .dw XT_STORE +0002bc 7020 .dw XT_EXIT + .include "words/lp0.asm" + + ; Stack + ; start address of leave stack + VE_LP0: +0002bd ff03 .dw $ff03 +0002be 706c +0002bf 0030 .db "lp0",0 +0002c0 02b2 .dw VE_HEAD + .set VE_HEAD = VE_LP0 + XT_LP0: +0002c1 706f .dw PFA_DOVALUE1 + PFA_LP0: +0002c2 0044 .dw CFG_LP0 +0002c3 7bb4 .dw XT_EDEFERFETCH +0002c4 7bbe .dw XT_EDEFERSTORE + .include "words/lp.asm" + + ; System Variable + ; leave stack pointer + VE_LP: +0002c5 ff02 .dw $ff02 +0002c6 706c .db "lp" +0002c7 02bd .dw VE_HEAD + .set VE_HEAD = VE_LP + XT_LP: +0002c8 7048 .dw PFA_DOVARIABLE + PFA_LP: +0002c9 0134 .dw ram_lp + + .dseg +000134 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: +0002ca ff06 .dw $ff06 +0002cb 7263 +0002cc 6165 +0002cd 6574 .db "create" +0002ce 02c5 .dw VE_HEAD + .set VE_HEAD = VE_CREATE + XT_CREATE: +0002cf 7001 .dw DO_COLON + PFA_CREATE: + .endif +0002d0 019e .dw XT_DOCREATE +0002d1 02fe .dw XT_REVEAL +0002d2 01c1 .dw XT_COMPILE +0002d3 7052 .dw PFA_DOCONSTANT +0002d4 7020 .dw XT_EXIT + .include "words/header.asm" + + ; Compiler + ; creates the vocabulary header without XT and data field (PF) in the wordlist wid + VE_HEADER: +0002d5 ff06 .dw $ff06 +0002d6 6568 +0002d7 6461 +0002d8 7265 .db "header" +0002d9 02ca .dw VE_HEAD + .set VE_HEAD = VE_HEADER + XT_HEADER: +0002da 7001 .dw DO_COLON + PFA_HEADER: +0002db 75ae .dw XT_DP ; the new Name Field +0002dc 70ff .dw XT_TO_R +0002dd 70ff .dw XT_TO_R ; ( R: NFA WID ) +0002de 70b1 .dw XT_DUP +0002df 7128 .dw XT_GREATERZERO +0002e0 7036 .dw XT_DOCONDBRANCH +0002e1 02ec .dw PFA_HEADER1 +0002e2 70b1 .dw XT_DUP +0002e3 703d .dw XT_DOLITERAL +0002e4 ff00 .dw $ff00 ; all flags are off (e.g. immediate) +0002e5 721c .dw XT_OR +0002e6 777f .dw XT_DOSCOMMA + ; make the link to the previous entry in this wordlist +0002e7 70f6 .dw XT_R_FROM +0002e8 735f .dw XT_FETCHE +0002e9 01cc .dw XT_COMMA +0002ea 70f6 .dw XT_R_FROM +0002eb 7020 .dw XT_EXIT + + PFA_HEADER1: + ; -16: attempt to use zero length string as a name +0002ec 703d .dw XT_DOLITERAL +0002ed fff0 .dw -16 +0002ee 7841 .dw XT_THROW + + .include "words/wlscope.asm" + + ; Compiler + ; dynamically place a word in a wordlist. The word name may be changed. + VE_WLSCOPE: +0002ef ff07 .dw $ff07 +0002f0 6c77 +0002f1 6373 +0002f2 706f +0002f3 0065 .db "wlscope",0 +0002f4 02d5 .dw VE_HEAD + .set VE_HEAD = VE_WLSCOPE + XT_WLSCOPE: +0002f5 7c13 .dw PFA_DODEFER1 + PFA_WLSCOPE: +0002f6 0040 .dw CFG_WLSCOPE +0002f7 7bb4 .dw XT_EDEFERFETCH +0002f8 7bbe .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: +0002f9 ff06 .dw $ff06 +0002fa 6572 +0002fb 6576 +0002fc 6c61 .db "reveal" +0002fd 02ef .dw VE_HEAD + .set VE_HEAD = VE_REVEAL + XT_REVEAL: +0002fe 7001 .dw DO_COLON + PFA_REVEAL: + .endif +0002ff 018f +000300 755e +000301 7079 .DW XT_NEWEST,XT_CELLPLUS,XT_FETCH ; only if wordlist is in use +000302 70b9 +000303 7036 .DW XT_QDUP,XT_DOCONDBRANCH +000304 0309 DEST(REVEAL1) +000305 018f +000306 7079 +000307 70c4 +000308 733b .DW XT_NEWEST,XT_FETCH,XT_SWAP,XT_STOREE + ; .DW XT_ZERO,XT_NEWEST,XT_CELLPLUS,XT_STORE ; clean wordlist entry + REVEAL1: +000309 7020 .DW XT_EXIT + .include "words/does.asm" + + ; Compiler + ; organize the XT replacement to call other colon code + VE_DOES: +00030a 0005 .dw $0005 +00030b 6f64 +00030c 7365 +00030d 003e .db "does>",0 +00030e 02f9 .dw VE_HEAD + .set VE_HEAD = VE_DOES + XT_DOES: +00030f 7001 .dw DO_COLON + PFA_DOES: +000310 01c1 .dw XT_COMPILE +000311 0322 .dw XT_DODOES +000312 01c1 .dw XT_COMPILE ; create a code snippet to be used in an embedded XT +000313 940e .dw $940e ; the address of this compiled +000314 01c1 .dw XT_COMPILE ; code will replace the XT of the +000315 0317 .dw DO_DODOES ; word that CREATE created +000316 7020 .dw XT_EXIT ; + + DO_DODOES: ; ( -- PFA ) +000317 939a +000318 938a savetos +000319 01cb movw tosl, wl +00031a 9601 adiw tosl, 1 + ; the following takes the address from a real uC-call + .if (pclen==3) + .endif +00031b 917f pop wh +00031c 916f pop wl + +00031d 93bf push XH +00031e 93af push XL +00031f 01db movw XL, wl +000320 940c 7005 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: +000322 7001 .dw DO_COLON + PFA_DODOES: +000323 70f6 .dw XT_R_FROM +000324 018f .dw XT_NEWEST +000325 755e .dw XT_CELLPLUS +000326 7079 .dw XT_FETCH +000327 735f .dw XT_FETCHE +000328 7c7e .dw XT_NFA2CFA +000329 7373 .dw XT_STOREI +00032a 7020 .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: +00032b ff01 .dw $ff01 +00032c 003a .db ":",0 +00032d 030a .dw VE_HEAD + .set VE_HEAD = VE_COLON + XT_COLON: +00032e 7001 .dw DO_COLON + PFA_COLON: + .endif +00032f 019e .dw XT_DOCREATE +000330 0339 .dw XT_COLONNONAME +000331 70d9 .dw XT_DROP +000332 7020 .dw XT_EXIT + .include "words/colon-noname.asm" + + ; Compiler + ; create an unnamed entry in the dictionary, XT is DO_COLON + VE_COLONNONAME: +000333 ff07 .dw $ff07 +000334 6e3a +000335 6e6f +000336 6d61 +000337 0065 .db ":noname",0 +000338 032b .dw VE_HEAD + .set VE_HEAD = VE_COLONNONAME + XT_COLONNONAME: +000339 7001 .dw DO_COLON + PFA_COLONNONAME: +00033a 75ae .dw XT_DP +00033b 70b1 .dw XT_DUP +00033c 0196 .dw XT_LATEST +00033d 7081 .dw XT_STORE + +00033e 01c1 .dw XT_COMPILE +00033f 7001 .dw DO_COLON + +000340 034e .dw XT_RBRACKET +000341 7020 .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: +000342 0001 .dw $0001 +000343 003b .db $3b,0 +000344 0333 .dw VE_HEAD + .set VE_HEAD = VE_SEMICOLON + XT_SEMICOLON: +000345 7001 .dw DO_COLON + PFA_SEMICOLON: + .endif +000346 01c1 .dw XT_COMPILE +000347 7020 .dw XT_EXIT +000348 0356 .dw XT_LBRACKET +000349 02fe .dw XT_REVEAL +00034a 7020 .dw XT_EXIT + .include "words/right-bracket.asm" + + ; Compiler + ; enter compiler mode + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_RBRACKET: +00034b ff01 .dw $ff01 +00034c 005d .db "]",0 +00034d 0342 .dw VE_HEAD + .set VE_HEAD = VE_RBRACKET + XT_RBRACKET: +00034e 7001 .dw DO_COLON + PFA_RBRACKET: + .endif +00034f 7d86 .dw XT_ONE +000350 754b .dw XT_STATE +000351 7081 .dw XT_STORE +000352 7020 .dw XT_EXIT + .include "words/left-bracket.asm" + + ; Compiler + ; enter interpreter mode + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_LBRACKET: +000353 0001 .dw $0001 +000354 005b .db "[",0 +000355 034b .dw VE_HEAD + .set VE_HEAD = VE_LBRACKET + XT_LBRACKET: +000356 7001 .dw DO_COLON + PFA_LBRACKET: + .endif +000357 7154 .dw XT_ZERO +000358 754b .dw XT_STATE +000359 7081 .dw XT_STORE +00035a 7020 .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: +00035b ff08 .dw $ff08 +00035c 6176 +00035d 6972 +00035e 6261 +00035f 656c .db "variable" +000360 0353 .dw VE_HEAD + .set VE_HEAD = VE_VARIABLE + XT_VARIABLE: +000361 7001 .dw DO_COLON + PFA_VARIABLE: + .endif +000362 75bf .dw XT_HERE +000363 036d .dw XT_CONSTANT +000364 7d8b .dw XT_TWO +000365 75c8 .dw XT_ALLOT +000366 7020 .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: +000367 ff08 .dw $ff08 +000368 6f63 +000369 736e +00036a 6174 +00036b 746e .db "constant" +00036c 035b .dw VE_HEAD + .set VE_HEAD = VE_CONSTANT + XT_CONSTANT: +00036d 7001 .dw DO_COLON + PFA_CONSTANT: + .endif +00036e 019e .dw XT_DOCREATE +00036f 02fe .dw XT_REVEAL +000370 01c1 .dw XT_COMPILE +000371 7048 .dw PFA_DOVARIABLE +000372 01cc .dw XT_COMMA +000373 7020 .dw XT_EXIT + .include "words/user.asm" + + ; Compiler + ; create a dictionary entry for a user variable at offset n + VE_USER: +000374 ff04 .dw $ff04 +000375 7375 +000376 7265 .db "user" +000377 0367 .dw VE_HEAD + .set VE_HEAD = VE_USER + XT_USER: +000378 7001 .dw DO_COLON + PFA_USER: +000379 019e .dw XT_DOCREATE +00037a 02fe .dw XT_REVEAL + +00037b 01c1 .dw XT_COMPILE +00037c 7058 .dw PFA_DOUSER +00037d 01cc .dw XT_COMMA +00037e 7020 .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: +00037f 0007 .dw $0007 +000380 6572 +000381 7563 +000382 7372 +000383 0065 .db "recurse",0 +000384 0374 .dw VE_HEAD + .set VE_HEAD = VE_RECURSE + XT_RECURSE: +000385 7001 .dw DO_COLON + PFA_RECURSE: + .endif +000386 0196 .dw XT_LATEST +000387 7079 .dw XT_FETCH +000388 01cc .dw XT_COMMA +000389 7020 .dw XT_EXIT + .include "words/immediate.asm" + + ; Compiler + ; set immediate flag for the most recent word definition + VE_IMMEDIATE: +00038a ff09 .dw $ff09 +00038b 6d69 +00038c 656d +00038d 6964 +00038e 7461 +00038f 0065 .db "immediate",0 +000390 037f .dw VE_HEAD + .set VE_HEAD = VE_IMMEDIATE + XT_IMMEDIATE: +000391 7001 .dw DO_COLON + PFA_IMMEDIATE: +000392 0433 .dw XT_GET_CURRENT +000393 735f .dw XT_FETCHE +000394 70b1 .dw XT_DUP +000395 73cb .dw XT_FETCHI +000396 703d .dw XT_DOLITERAL +000397 7fff .dw $7fff +000398 7213 .dw XT_AND +000399 70c4 .dw XT_SWAP +00039a 7373 .dw XT_STOREI +00039b 7020 .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: +00039c 0006 .dw $0006 +00039d 635b +00039e 6168 +00039f 5d72 .db "[char]" +0003a0 038a .dw VE_HEAD + .set VE_HEAD = VE_BRACKETCHAR + XT_BRACKETCHAR: +0003a1 7001 .dw DO_COLON + PFA_BRACKETCHAR: + .endif +0003a2 01c1 .dw XT_COMPILE +0003a3 703d .dw XT_DOLITERAL +0003a4 78ea .dw XT_CHAR +0003a5 01cc .dw XT_COMMA +0003a6 7020 .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: +0003a7 0006 .dw $0006 +0003a8 6261 +0003a9 726f +0003aa 2274 .db "abort",'"' +0003ab 039c .dw VE_HEAD + .set VE_HEAD = VE_ABORTQUOTE + XT_ABORTQUOTE: +0003ac 7001 .dw DO_COLON + PFA_ABORTQUOTE: + .endif +0003ad 74c1 .dw XT_SQUOTE +0003ae 01c1 .dw XT_COMPILE +0003af 03be .dw XT_QABORT +0003b0 7020 .DW XT_EXIT + .include "words/abort.asm" + + ; Exceptions + ; send an exception -1 + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_ABORT: +0003b1 ff05 .dw $ff05 +0003b2 6261 +0003b3 726f +0003b4 0074 .db "abort",0 +0003b5 03a7 .dw VE_HEAD + .set VE_HEAD = VE_ABORT + XT_ABORT: +0003b6 7001 .dw DO_COLON + PFA_ABORT: + .endif +0003b7 714b .dw XT_TRUE +0003b8 7841 .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: +0003b9 ff06 .dw $ff06 +0003ba 613f +0003bb 6f62 +0003bc 7472 .db "?abort" +0003bd 03b1 .dw VE_HEAD + .set VE_HEAD = VE_QABORT + XT_QABORT: +0003be 7001 .dw DO_COLON + PFA_QABORT: + + .endif +0003bf 70e1 +0003c0 7036 .DW XT_ROT,XT_DOCONDBRANCH +0003c1 03c4 DEST(QABO1) +0003c2 77a0 +0003c3 03b6 .DW XT_ITYPE,XT_ABORT +0003c4 756e +0003c5 7020 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: +0003c6 ff09 .dw $ff09 +0003c7 6567 +0003c8 2d74 +0003c9 7473 +0003ca 6361 +0003cb 006b .db "get-stack",0 +0003cc 03b9 .dw VE_HEAD + .set VE_HEAD = VE_GET_STACK + XT_GET_STACK: +0003cd 7001 .dw DO_COLON + .endif +0003ce 70b1 .dw XT_DUP +0003cf 755e .dw XT_CELLPLUS +0003d0 70c4 .dw XT_SWAP +0003d1 735f .dw XT_FETCHE +0003d2 70b1 .dw XT_DUP +0003d3 70ff .dw XT_TO_R +0003d4 7154 .dw XT_ZERO +0003d5 70c4 .dw XT_SWAP ; go from bigger to smaller addresses +0003d6 028b .dw XT_QDOCHECK +0003d7 7036 .dw XT_DOCONDBRANCH +0003d8 03e4 DEST(PFA_N_FETCH_E2) +0003d9 729b .dw XT_DODO + PFA_N_FETCH_E1: + ; ( ee-addr ) +0003da 72ac .dw XT_I +0003db 7235 .dw XT_1MINUS +0003dc 7558 .dw XT_CELLS ; ( -- ee-addr i*2 ) +0003dd 70cf .dw XT_OVER ; ( -- ee-addr i*2 ee-addr ) +0003de 719d .dw XT_PLUS ; ( -- ee-addr ee-addr+i +0003df 735f .dw XT_FETCHE ;( -- ee-addr item_i ) +0003e0 70c4 .dw XT_SWAP ;( -- item_i ee-addr ) +0003e1 714b .dw XT_TRUE ; shortcut for -1 +0003e2 72ba .dw XT_DOPLUSLOOP +0003e3 03da DEST(PFA_N_FETCH_E1) + PFA_N_FETCH_E2: +0003e4 756e .dw XT_2DROP +0003e5 70f6 .dw XT_R_FROM +0003e6 7020 .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: +0003e7 ff09 .dw $ff09 +0003e8 6573 +0003e9 2d74 +0003ea 7473 +0003eb 6361 +0003ec 006b .db "set-stack",0 +0003ed 03c6 .dw VE_HEAD + .set VE_HEAD = VE_SET_STACK + XT_SET_STACK: +0003ee 7001 .dw DO_COLON + PFA_SET_STACK: + .endif +0003ef 70cf .dw XT_OVER +0003f0 7121 .dw XT_ZEROLESS +0003f1 7036 .dw XT_DOCONDBRANCH +0003f2 03f6 DEST(PFA_SET_STACK0) +0003f3 703d .dw XT_DOLITERAL +0003f4 fffc .dw -4 +0003f5 7841 .dw XT_THROW + PFA_SET_STACK0: +0003f6 7565 .dw XT_2DUP +0003f7 733b .dw XT_STOREE ; ( -- i_n .. i_0 n e-addr ) +0003f8 70c4 .dw XT_SWAP +0003f9 7154 .dw XT_ZERO +0003fa 028b .dw XT_QDOCHECK +0003fb 7036 .dw XT_DOCONDBRANCH +0003fc 0403 DEST(PFA_SET_STACK2) +0003fd 729b .dw XT_DODO + PFA_SET_STACK1: +0003fe 755e .dw XT_CELLPLUS ; ( -- i_x e-addr ) +0003ff 7576 .dw XT_TUCK ; ( -- e-addr i_x e-addr +000400 733b .dw XT_STOREE +000401 72c9 .dw XT_DOLOOP +000402 03fe DEST(PFA_SET_STACK1) + PFA_SET_STACK2: +000403 70d9 .dw XT_DROP +000404 7020 .dw XT_EXIT + + .include "words/map-stack.asm" + + ; Tools + ; Iterate over a stack + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_MAPSTACK: +000405 ff09 .dw $ff09 +000406 616d +000407 2d70 +000408 7473 +000409 6361 +00040a 006b .db "map-stack",0 +00040b 03e7 .dw VE_HEAD + .set VE_HEAD = VE_MAPSTACK + XT_MAPSTACK: +00040c 7001 .dw DO_COLON + PFA_MAPSTACK: + .endif +00040d 70b1 .dw XT_DUP +00040e 755e .dw XT_CELLPLUS +00040f 70c4 .dw XT_SWAP +000410 735f .dw XT_FETCHE +000411 7558 .dw XT_CELLS +000412 7d5e .dw XT_BOUNDS +000413 028b .dw XT_QDOCHECK +000414 7036 .dw XT_DOCONDBRANCH +000415 0428 DEST(PFA_MAPSTACK3) +000416 729b .dw XT_DODO + PFA_MAPSTACK1: +000417 72ac .dw XT_I +000418 735f .dw XT_FETCHE ; -- i*x XT id +000419 70c4 .dw XT_SWAP +00041a 70ff .dw XT_TO_R +00041b 7108 .dw XT_R_FETCH +00041c 702a .dw XT_EXECUTE ; i*x id -- j*y true | i*x false +00041d 70b9 .dw XT_QDUP +00041e 7036 .dw XT_DOCONDBRANCH +00041f 0424 DEST(PFA_MAPSTACK2) +000420 70f6 .dw XT_R_FROM +000421 70d9 .dw XT_DROP +000422 72d4 .dw XT_UNLOOP +000423 7020 .dw XT_EXIT + PFA_MAPSTACK2: +000424 70f6 .dw XT_R_FROM +000425 7d8b .dw XT_TWO +000426 72ba .dw XT_DOPLUSLOOP +000427 0417 DEST(PFA_MAPSTACK1) + PFA_MAPSTACK3: +000428 70d9 .dw XT_DROP +000429 7154 .dw XT_ZERO +00042a 7020 .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: +00042b ff0b .dw $ff0b +00042c 6567 +00042d 2d74 +00042e 7563 +00042f 7272 +000430 6e65 +000431 0074 .db "get-current",0 +000432 0405 .dw VE_HEAD + .set VE_HEAD = VE_GET_CURRENT + XT_GET_CURRENT: +000433 7001 .dw DO_COLON + PFA_GET_CURRENT: +000434 703d .dw XT_DOLITERAL +000435 004a .dw CFG_CURRENT +000436 735f .dw XT_FETCHE +000437 7020 .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: +000438 ff09 .dw $ff09 +000439 6567 +00043a 2d74 +00043b 726f +00043c 6564 +00043d 0072 .db "get-order",0 +00043e 042b .dw VE_HEAD + .set VE_HEAD = VE_GET_ORDER + XT_GET_ORDER: +00043f 7001 .dw DO_COLON + PFA_GET_ORDER: + .endif +000440 703d .dw XT_DOLITERAL +000441 004e .dw CFG_ORDERLISTLEN +000442 03cd .dw XT_GET_STACK +000443 7020 .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: +000444 ff09 .dw $ff09 +000445 6663 +000446 2d67 +000447 726f +000448 6564 +000449 0072 .db "cfg-order",0 +00044a 0438 .dw VE_HEAD + .set VE_HEAD = VE_CFG_ORDER + XT_CFG_ORDER: +00044b 7048 .dw PFA_DOVARIABLE + PFA_CFG_ORDER: + .endif +00044c 004e .dw CFG_ORDERLISTLEN + .include "words/compare.asm" + + ; String + ; compares two strings in RAM + VE_COMPARE: +00044d ff07 .dw $ff07 +00044e 6f63 +00044f 706d +000450 7261 +000451 0065 .db "compare",0 +000452 0444 .dw VE_HEAD + .set VE_HEAD = VE_COMPARE + XT_COMPARE: +000453 0454 .dw PFA_COMPARE + PFA_COMPARE: +000454 93bf push xh +000455 93af push xl +000456 018c movw temp0, tosl +000457 9189 +000458 9199 loadtos +000459 01dc movw xl, tosl +00045a 9189 +00045b 9199 loadtos +00045c 019c movw temp2, tosl +00045d 9189 +00045e 9199 loadtos +00045f 01fc movw zl, tosl + PFA_COMPARE_LOOP: +000460 90ed ld temp4, X+ +000461 90f1 ld temp5, Z+ +000462 14ef cp temp4, temp5 +000463 f451 brne PFA_COMPARE_NOTEQUAL +000464 950a dec temp0 +000465 f019 breq PFA_COMPARE_ENDREACHED2 +000466 952a dec temp2 +000467 f7c1 brne PFA_COMPARE_LOOP +000468 c001 rjmp PFA_COMPARE_ENDREACHED + PFA_COMPARE_ENDREACHED2: +000469 952a dec temp2 + PFA_COMPARE_ENDREACHED: +00046a 2b02 or temp0, temp2 +00046b f411 brne PFA_COMPARE_CHECKLASTCHAR +00046c 2788 clr tosl +00046d c002 rjmp PFA_COMPARE_DONE + PFA_COMPARE_CHECKLASTCHAR: + PFA_COMPARE_NOTEQUAL: +00046e ef8f ser tosl +00046f c000 rjmp PFA_COMPARE_DONE + + PFA_COMPARE_DONE: +000470 2f98 mov tosh, tosl +000471 91af pop xl +000472 91bf pop xh +000473 940c 7005 jmp_ DO_NEXT + .include "words/nfa2lfa.asm" + + ; System + ; get the link field address from the name field address + VE_NFA2LFA: +000475 ff07 .dw $ff07 +000476 666e +000477 3e61 +000478 666c +000479 0061 .db "nfa>lfa",0 +00047a 044d .dw VE_HEAD + .set VE_HEAD = VE_NFA2LFA + XT_NFA2LFA: +00047b 7001 .dw DO_COLON + PFA_NFA2LFA: +00047c 7c72 .dw XT_NAME2STRING +00047d 722f .dw XT_1PLUS +00047e 7204 .dw XT_2SLASH +00047f 719d .dw XT_PLUS +000480 7020 .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/dot-s.asm" + + ; Tools + ; stack dump + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_DOTS: +000481 ff02 .dw $ff02 +000482 732e .db ".s" +000483 0475 .dw VE_HEAD + .set VE_HEAD = VE_DOTS + XT_DOTS: +000484 7001 .dw DO_COLON + PFA_DOTS: + .endif +000485 7aa1 .dw XT_DEPTH +000486 7448 .dw XT_UDOT +000487 77e2 .dw XT_SPACE +000488 7aa1 .dw XT_DEPTH +000489 7154 .dw XT_ZERO +00048a 028b .dw XT_QDOCHECK +00048b 7036 .dw XT_DOCONDBRANCH +00048c 0493 DEST(PFA_DOTS2) +00048d 729b .dw XT_DODO + PFA_DOTS1: +00048e 72ac .dw XT_I +00048f 74af .dw XT_PICK +000490 7448 .dw XT_UDOT +000491 72c9 .dw XT_DOLOOP +000492 048e DEST(PFA_DOTS1) + PFA_DOTS2: +000493 7020 .dw XT_EXIT + .include "words/spirw.asm" + + ; MCU + ; SPI exchange of 1 byte + VE_SPIRW: +000494 ff06 .dw $ff06 +000495 2163 +000496 7340 +000497 6970 .db "c!@spi" +000498 0481 .dw VE_HEAD + .set VE_HEAD = VE_SPIRW + XT_SPIRW: +000499 049a .dw PFA_SPIRW + PFA_SPIRW: +00049a d003 rcall do_spirw +00049b 2799 clr tosh +00049c 940c 7005 jmp_ DO_NEXT + + do_spirw: +00049e bd8e out_ SPDR, tosl + do_spirw1: +00049f b50d in_ temp0, SPSR +0004a0 7f08 cbr temp0,7 +0004a1 bd0d out_ SPSR, temp0 +0004a2 b50d in_ temp0, SPSR +0004a3 ff07 sbrs temp0, 7 +0004a4 cffa rjmp do_spirw1 ; wait until complete +0004a5 b58e in_ tosl, SPDR +0004a6 9508 ret + .include "words/n-spi.asm" + + ; MCU + ; read len bytes from SPI to addr + VE_N_SPIR: +0004a7 ff05 .dw $ff05 +0004a8 406e +0004a9 7073 +0004aa 0069 .db "n@spi",0 +0004ab 0494 .dw VE_HEAD + .set VE_HEAD = VE_N_SPIR + XT_N_SPIR: +0004ac 04ad .dw PFA_N_SPIR + PFA_N_SPIR: +0004ad 018c movw temp0, tosl +0004ae 9189 +0004af 9199 loadtos +0004b0 01fc movw zl, tosl +0004b1 01c8 movw tosl, temp0 + PFA_N_SPIR_LOOP: +0004b2 bc2e out_ SPDR, zerol + PFA_N_SPIR_LOOP1: +0004b3 b52d in_ temp2, SPSR +0004b4 ff27 sbrs temp2, SPIF +0004b5 cffd rjmp PFA_N_SPIR_LOOP1 +0004b6 b52e in_ temp2, SPDR +0004b7 9321 st Z+, temp2 +0004b8 9701 sbiw tosl, 1 +0004b9 f7c1 brne PFA_N_SPIR_LOOP +0004ba 9189 +0004bb 9199 loadtos +0004bc 940c 7005 jmp_ DO_NEXT + + ; ( addr len -- ) + ; MCU + ; write len bytes to SPI from addr + VE_N_SPIW: +0004be ff05 .dw $ff05 +0004bf 216e +0004c0 7073 +0004c1 0069 .db "n!spi",0 +0004c2 04a7 .dw VE_HEAD + .set VE_HEAD = VE_N_SPIW + XT_N_SPIW: +0004c3 04c4 .dw PFA_N_SPIW + PFA_N_SPIW: +0004c4 018c movw temp0, tosl +0004c5 9189 +0004c6 9199 loadtos +0004c7 01fc movw zl, tosl +0004c8 01c8 movw tosl, temp0 + PFA_N_SPIW_LOOP: +0004c9 9121 ld temp2, Z+ +0004ca bd2e out_ SPDR, temp2 + PFA_N_SPIW_LOOP1: +0004cb b52d in_ temp2, SPSR +0004cc ff27 sbrs temp2, SPIF +0004cd cffd rjmp PFA_N_SPIW_LOOP1 +0004ce b52e in_ temp2, SPDR ; ignore the data +0004cf 9701 sbiw tosl, 1 +0004d0 f7c1 brne PFA_N_SPIW_LOOP +0004d1 9189 +0004d2 9199 loadtos +0004d3 940c 7005 jmp_ DO_NEXT + .include "words/applturnkey.asm" + + ; R( -- ) + ; application specific turnkey action + VE_APPLTURNKEY: +0004d5 ff0b .dw $ff0b +0004d6 7061 +0004d7 6c70 +0004d8 7574 +0004d9 6e72 +0004da 656b +0004db 0079 .db "applturnkey",0 +0004dc 04be .dw VE_HEAD + .set VE_HEAD = VE_APPLTURNKEY + XT_APPLTURNKEY: +0004dd 7001 .dw DO_COLON + PFA_APPLTURNKEY: +0004de 00cb .dw XT_USART + + .if WANT_INTERRUPTS == 1 +0004df 7479 .dw XT_INTON + .endif +0004e0 7b64 .dw XT_DOT_VER +0004e1 77e2 .dw XT_SPACE +0004e2 7540 .dw XT_F_CPU +0004e3 703d .dw XT_DOLITERAL +0004e4 03e8 .dw 1000 +0004e5 71c2 .dw XT_UMSLASHMOD +0004e6 70f0 .dw XT_NIP +0004e7 75dd .dw XT_DECIMAL +0004e8 7722 .dw XT_DOT +0004e9 776d .dw XT_DOSLITERAL +0004ea 0004 .dw 4 +0004eb 486b +0004ec 207a .db "kHz " +0004ed 77a0 .dw XT_ITYPE +0004ee 7020 .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: +0004ef ff0b .dw $ff0b +0004f0 6573 +0004f1 2d74 +0004f2 7563 +0004f3 7272 +0004f4 6e65 +0004f5 0074 .db "set-current",0 +0004f6 04d5 .dw VE_HEAD + .set VE_HEAD = VE_SET_CURRENT + XT_SET_CURRENT: +0004f7 7001 .dw DO_COLON + PFA_SET_CURRENT: +0004f8 703d .dw XT_DOLITERAL +0004f9 004a .dw CFG_CURRENT +0004fa 733b .dw XT_STOREE +0004fb 7020 .dw XT_EXIT + .include "words/wordlist.asm" + + ; Search Order + ; create a new, empty wordlist + VE_WORDLIST: +0004fc ff08 .dw $ff08 +0004fd 6f77 +0004fe 6472 +0004ff 696c +000500 7473 .db "wordlist" +000501 04ef .dw VE_HEAD + .set VE_HEAD = VE_WORDLIST + XT_WORDLIST: +000502 7001 .dw DO_COLON + PFA_WORDLIST: +000503 75b7 .dw XT_EHERE +000504 7154 .dw XT_ZERO +000505 70cf .dw XT_OVER +000506 733b .dw XT_STOREE +000507 70b1 .dw XT_DUP +000508 755e .dw XT_CELLPLUS +000509 7b99 .dw XT_DOTO +00050a 75b8 .dw PFA_EHERE +00050b 7020 .dw XT_EXIT + + .include "words/forth-wordlist.asm" + + ; Search Order + ; get the system default word list + VE_FORTHWORDLIST: +00050c ff0e .dw $ff0e +00050d 6f66 +00050e 7472 +00050f 2d68 +000510 6f77 +000511 6472 +000512 696c +000513 7473 .db "forth-wordlist" +000514 04fc .dw VE_HEAD + .set VE_HEAD = VE_FORTHWORDLIST + XT_FORTHWORDLIST: +000515 7048 .dw PFA_DOVARIABLE + PFA_FORTHWORDLIST: +000516 004c .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: +000517 ff09 .dw $ff09 +000518 6573 +000519 2d74 +00051a 726f +00051b 6564 +00051c 0072 .db "set-order",0 +00051d 050c .dw VE_HEAD + .set VE_HEAD = VE_SET_ORDER + XT_SET_ORDER: +00051e 7001 .dw DO_COLON + PFA_SET_ORDER: + .endif +00051f 703d .dw XT_DOLITERAL +000520 004e .dw CFG_ORDERLISTLEN +000521 03ee .dw XT_SET_STACK +000522 7020 .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: +000523 ff0f .dw $ff0f +000524 6573 +000525 2d74 +000526 6572 +000527 6f63 +000528 6e67 +000529 7a69 +00052a 7265 +00052b 0073 .db "set-recognizers",0 +00052c 0517 .dw VE_HEAD + .set VE_HEAD = VE_SET_RECOGNIZERS + XT_SET_RECOGNIZERS: +00052d 7001 .dw DO_COLON + PFA_SET_RECOGNIZERS: + .endif +00052e 703d .dw XT_DOLITERAL +00052f 0060 .dw CFG_RECOGNIZERLISTLEN +000530 03ee .dw XT_SET_STACK +000531 7020 .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: +000532 ff0f .dw $ff0f +000533 6567 +000534 2d74 +000535 6572 +000536 6f63 +000537 6e67 +000538 7a69 +000539 7265 +00053a 0073 .db "get-recognizers",0 +00053b 0523 .dw VE_HEAD + .set VE_HEAD = VE_GET_RECOGNIZERS + XT_GET_RECOGNIZERS: +00053c 7001 .dw DO_COLON + PFA_GET_RECOGNIZERS: + .endif +00053d 703d .dw XT_DOLITERAL +00053e 0060 .dw CFG_RECOGNIZERLISTLEN +00053f 03cd .dw XT_GET_STACK +000540 7020 .dw XT_EXIT + .include "words/code.asm" + + ; Compiler + ; create named entry in the dictionary, XT is the data field + VE_CODE: +000541 ff04 .dw $ff04 +000542 6f63 +000543 6564 .db "code" +000544 0532 .dw VE_HEAD + .set VE_HEAD = VE_CODE + XT_CODE: +000545 7001 .dw DO_COLON + PFA_CODE: +000546 019e .dw XT_DOCREATE +000547 02fe .dw XT_REVEAL +000548 75ae .dw XT_DP +000549 7bab .dw XT_ICELLPLUS +00054a 01cc .dw XT_COMMA +00054b 7020 .dw XT_EXIT + .include "words/end-code.asm" + + ; Compiler + ; finish a code definition + VE_ENDCODE: +00054c ff08 .dw $ff08 +00054d 6e65 +00054e 2d64 +00054f 6f63 +000550 6564 .db "end-code" +000551 0541 .dw VE_HEAD + .set VE_HEAD = VE_ENDCODE + XT_ENDCODE: +000552 7001 .dw DO_COLON + PFA_ENDCODE: +000553 01c1 .dw XT_COMPILE +000554 940c .dw $940c +000555 01c1 .dw XT_COMPILE +000556 7005 .dw DO_NEXT +000557 7020 .dw XT_EXIT + .include "words/marker.asm" + + ; System Value + ; The eeprom address until which MARKER saves and restores the eeprom data. + VE_MARKER: +000558 ff08 .dw $ff08 +000559 6d28 +00055a 7261 +00055b 656b +00055c 2972 .db "(marker)" +00055d 054c .dw VE_HEAD + .set VE_HEAD = VE_MARKER + XT_MARKER: +00055e 706f .dw PFA_DOVALUE1 + PFA_MARKER: +00055f 006c .dw EE_MARKER +000560 7bb4 .dw XT_EDEFERFETCH +000561 7bbe .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: +000562 0008 .dw $0008 +000563 6f70 +000564 7473 +000565 6f70 +000566 656e .db "postpone" +000567 0558 .dw VE_HEAD + .set VE_HEAD = VE_POSTPONE + XT_POSTPONE: +000568 7001 .dw DO_COLON + PFA_POSTPONE: + .endif +000569 79b4 .dw XT_PARSENAME +00056a 7acc .dw XT_FORTHRECOGNIZER +00056b 7ad7 .dw XT_RECOGNIZE +00056c 70b1 .dw XT_DUP +00056d 70ff .dw XT_TO_R +00056e 7bab .dw XT_ICELLPLUS +00056f 7bab .dw XT_ICELLPLUS +000570 73cb .dw XT_FETCHI +000571 702a .dw XT_EXECUTE +000572 70f6 .dw XT_R_FROM +000573 7bab .dw XT_ICELLPLUS +000574 73cb .dw XT_FETCHI +000575 01cc .dw XT_COMMA +000576 7020 .dw XT_EXIT + .endif + .include "words/2r_fetch.asm" + + ; Stack + ; fetch content of TOR + VE_2R_FETCH: +000577 ff03 .dw $ff03 +000578 7232 +000579 0040 .db "2r@",0 +00057a 0562 .dw VE_HEAD + .set VE_HEAD = VE_2R_FETCH + XT_2R_FETCH: +00057b 057c .dw PFA_2R_FETCH + PFA_2R_FETCH: +00057c 939a +00057d 938a savetos +00057e 91ef pop zl +00057f 91ff pop zh +000580 918f pop tosl +000581 919f pop tosh +000582 939f push tosh +000583 938f push tosl +000584 93ff push zh +000585 93ef push zl +000586 939a +000587 938a savetos +000588 01cf movw tosl, zl +000589 940c 7005 jmp_ DO_NEXT + + .set DPSTART = pc + .if(pc>AMFORTH_RO_SEG) + .endif + + .org AMFORTH_RO_SEG + .include "amforth-interpreter.asm" + + + DO_COLON: +007001 93bf push XH +007002 93af push XL ; PUSH IP +007003 01db movw XL, wl +007004 9611 adiw xl, 1 + DO_NEXT: + .if WANT_INTERRUPTS == 1 +007005 14b2 cp isrflag, zerol +007006 f469 brne DO_INTERRUPT + .endif +007007 01fd movw zl, XL ; READ IP +007008 0fee +007009 1fff +00700a 9165 +00700b 9175 readflashcell wl, wh +00700c 9611 adiw XL, 1 ; INC IP + + DO_EXECUTE: +00700d 01fb movw zl, wl +00700e 0fee +00700f 1fff +007010 9105 +007011 9115 readflashcell temp0,temp1 +007012 01f8 movw zl, temp0 +007013 9409 ijmp + + .if WANT_INTERRUPTS == 1 + DO_INTERRUPT: + ; here we deal with interrupts the forth way +007014 939a +007015 938a savetos +007016 2d8b mov tosl, isrflag +007017 2799 clr tosh +007018 24bb clr isrflag +007019 ea62 ldi wl, LOW(XT_ISREXEC) +00701a e774 ldi wh, HIGH(XT_ISREXEC) +00701b cff1 rjmp DO_EXECUTE + .include "dict/nrww.inc" + + ; section together with the forth inner interpreter + + .include "words/exit.asm" + + ; Compiler + ; end of current colon word + VE_EXIT: +00701c ff04 .dw $ff04 +00701d 7865 +00701e 7469 .db "exit" +00701f 0577 .dw VE_HEAD + .set VE_HEAD = VE_EXIT + XT_EXIT: +007020 7021 .dw PFA_EXIT + PFA_EXIT: +007021 91af pop XL +007022 91bf pop XH +007023 cfe1 jmp_ DO_NEXT + .include "words/execute.asm" + + ; System + ; execute XT + VE_EXECUTE: +007024 ff07 .dw $ff07 +007025 7865 +007026 6365 +007027 7475 +007028 0065 .db "execute",0 +007029 701c .dw VE_HEAD + .set VE_HEAD = VE_EXECUTE + XT_EXECUTE: +00702a 702b .dw PFA_EXECUTE + PFA_EXECUTE: +00702b 01bc movw wl, tosl +00702c 9189 +00702d 9199 loadtos +00702e cfde 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: +00702f 7030 .dw PFA_DOBRANCH + PFA_DOBRANCH: +007030 01fd movw zl, XL +007031 0fee +007032 1fff +007033 91a5 +007034 91b5 readflashcell XL,XH +007035 cfcf 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: +007036 7037 .dw PFA_DOCONDBRANCH + PFA_DOCONDBRANCH: +007037 2b98 or tosh, tosl +007038 9189 +007039 9199 loadtos +00703a f3a9 brbs 1, PFA_DOBRANCH ; 1 is z flag; if tos is zero (false), do the branch +00703b 9611 adiw XL, 1 +00703c cfc8 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: +00703d 703e .dw PFA_DOLITERAL + PFA_DOLITERAL: +00703e 939a +00703f 938a savetos +007040 01fd movw zl, xl +007041 0fee +007042 1fff +007043 9185 +007044 9195 readflashcell tosl,tosh +007045 9611 adiw xl, 1 +007046 cfbe 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: +007047 7048 .dw PFA_DOVARIABLE + PFA_DOVARIABLE: +007048 939a +007049 938a savetos +00704a 01fb movw zl, wl +00704b 9631 adiw zl,1 +00704c 0fee +00704d 1fff +00704e 9185 +00704f 9195 readflashcell tosl,tosh +007050 cfb4 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: +007051 7052 .dw PFA_DOCONSTANT + PFA_DOCONSTANT: +007052 939a +007053 938a savetos +007054 01cb movw tosl, wl +007055 9601 adiw tosl, 1 +007056 cfae 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: +007057 7058 .dw PFA_DOUSER + PFA_DOUSER: +007058 939a +007059 938a savetos +00705a 01fb movw zl, wl +00705b 9631 adiw zl, 1 +00705c 0fee +00705d 1fff +00705e 9185 +00705f 9195 readflashcell tosl,tosh +007060 0d84 add tosl, upl +007061 1d95 adc tosh, uph +007062 cfa2 jmp_ DO_NEXT + .include "words/do-value.asm" + + ; System + ; runtime of value + VE_DOVALUE: +007063 ff07 .dw $ff07 +007064 7628 +007065 6c61 +007066 6575 +007067 0029 .db "(value)", 0 +007068 7024 .dw VE_HEAD + .set VE_HEAD = VE_DOVALUE + XT_DOVALUE: +007069 7001 .dw DO_COLON + PFA_DOVALUE: +00706a 019e .dw XT_DOCREATE +00706b 02fe .dw XT_REVEAL +00706c 01c1 .dw XT_COMPILE +00706d 706f .dw PFA_DOVALUE1 +00706e 7020 .dw XT_EXIT + PFA_DOVALUE1: +00706f 940e 0317 call_ DO_DODOES +007071 70b1 .dw XT_DUP +007072 7bab .dw XT_ICELLPLUS +007073 73cb .dw XT_FETCHI +007074 702a .dw XT_EXECUTE +007075 7020 .dw XT_EXIT + + ; : (value) dup icell+ @i execute ; + .include "words/fetch.asm" + + ; Memory + ; read 1 cell from RAM address + VE_FETCH: +007076 ff01 .dw $ff01 +007077 0040 .db "@",0 +007078 7063 .dw VE_HEAD + .set VE_HEAD = VE_FETCH + XT_FETCH: +007079 707a .dw PFA_FETCH + PFA_FETCH: + .if WANT_UNIFIED == 1 + .endif + PFA_FETCHRAM: +00707a 01fc movw zl, tosl + ; low byte is read before the high byte +00707b 9181 ld tosl, z+ +00707c 9191 ld tosh, z+ +00707d cf87 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: +00707e ff01 .dw $ff01 +00707f 0021 .db "!",0 +007080 7076 .dw VE_HEAD + .set VE_HEAD = VE_STORE + XT_STORE: +007081 7082 .dw PFA_STORE + PFA_STORE: + .if WANT_UNIFIED == 1 + .endif + PFA_STORERAM: +007082 01fc movw zl, tosl +007083 9189 +007084 9199 loadtos + ; the high byte is written before the low byte +007085 8391 std Z+1, tosh +007086 8380 std Z+0, tosl +007087 9189 +007088 9199 loadtos +007089 cf7b jmp_ DO_NEXT + .if WANT_UNIFIED == 1 + .endif + .include "words/cstore.asm" + + ; Memory + ; store a single byte to RAM address + VE_CSTORE: +00708a ff02 .dw $ff02 +00708b 2163 .db "c!" +00708c 707e .dw VE_HEAD + .set VE_HEAD = VE_CSTORE + XT_CSTORE: +00708d 708e .dw PFA_CSTORE + PFA_CSTORE: +00708e 01fc movw zl, tosl +00708f 9189 +007090 9199 loadtos +007091 8380 st Z, tosl +007092 9189 +007093 9199 loadtos +007094 cf70 jmp_ DO_NEXT + .include "words/cfetch.asm" + + ; Memory + ; fetch a single byte from memory mapped locations + VE_CFETCH: +007095 ff02 .dw $ff02 +007096 4063 .db "c@" +007097 708a .dw VE_HEAD + .set VE_HEAD = VE_CFETCH + XT_CFETCH: +007098 7099 .dw PFA_CFETCH + PFA_CFETCH: +007099 01fc movw zl, tosl +00709a 2799 clr tosh +00709b 8180 ld tosl, Z +00709c cf68 jmp_ DO_NEXT + .include "words/fetch-u.asm" + + ; Memory + ; read 1 cell from USER area + VE_FETCHU: +00709d ff02 .dw $ff02 +00709e 7540 .db "@u" +00709f 7095 .dw VE_HEAD + .set VE_HEAD = VE_FETCHU + XT_FETCHU: +0070a0 7001 .dw DO_COLON + PFA_FETCHU: +0070a1 7302 .dw XT_UP_FETCH +0070a2 719d .dw XT_PLUS +0070a3 7079 .dw XT_FETCH +0070a4 7020 .dw XT_EXIT + .include "words/store-u.asm" + + ; Memory + ; write n to USER area at offset + VE_STOREU: +0070a5 ff02 .dw $ff02 +0070a6 7521 .db "!u" +0070a7 709d .dw VE_HEAD + .set VE_HEAD = VE_STOREU + XT_STOREU: +0070a8 7001 .dw DO_COLON + PFA_STOREU: +0070a9 7302 .dw XT_UP_FETCH +0070aa 719d .dw XT_PLUS +0070ab 7081 .dw XT_STORE +0070ac 7020 .dw XT_EXIT + + ;;;;;;;;;;;;;;;;;;;;;;;;; + .include "words/dup.asm" + + ; Stack + ; duplicate TOS + VE_DUP: +0070ad ff03 .dw $ff03 +0070ae 7564 +0070af 0070 .db "dup",0 +0070b0 70a5 .dw VE_HEAD + .set VE_HEAD = VE_DUP + XT_DUP: +0070b1 70b2 .dw PFA_DUP + PFA_DUP: +0070b2 939a +0070b3 938a savetos +0070b4 cf50 jmp_ DO_NEXT + .include "words/qdup.asm" + + ; Stack + ; duplicate TOS if non-zero + VE_QDUP: +0070b5 ff04 .dw $ff04 +0070b6 643f +0070b7 7075 .db "?dup" +0070b8 70ad .dw VE_HEAD + .set VE_HEAD = VE_QDUP + XT_QDUP: +0070b9 70ba .dw PFA_QDUP + PFA_QDUP: +0070ba 2f08 mov temp0, tosl +0070bb 2b09 or temp0, tosh +0070bc f011 breq PFA_QDUP1 +0070bd 939a +0070be 938a savetos + PFA_QDUP1: +0070bf cf45 jmp_ DO_NEXT + .include "words/swap.asm" + + ; Stack + ; swaps the two top level stack cells + VE_SWAP: +0070c0 ff04 .dw $ff04 +0070c1 7773 +0070c2 7061 .db "swap" +0070c3 70b5 .dw VE_HEAD + .set VE_HEAD = VE_SWAP + XT_SWAP: +0070c4 70c5 .dw PFA_SWAP + PFA_SWAP: +0070c5 018c movw temp0, tosl +0070c6 9189 +0070c7 9199 loadtos +0070c8 931a st -Y, temp1 +0070c9 930a st -Y, temp0 +0070ca cf3a jmp_ DO_NEXT + .include "words/over.asm" + + ; Stack + ; Place a copy of x1 on top of the stack + VE_OVER: +0070cb ff04 .dw $ff04 +0070cc 766f +0070cd 7265 .db "over" +0070ce 70c0 .dw VE_HEAD + .set VE_HEAD = VE_OVER + XT_OVER: +0070cf 70d0 .dw PFA_OVER + PFA_OVER: +0070d0 939a +0070d1 938a savetos +0070d2 818a ldd tosl, Y+2 +0070d3 819b ldd tosh, Y+3 + +0070d4 cf30 jmp_ DO_NEXT + .include "words/drop.asm" + + ; Stack + ; drop TOS + VE_DROP: +0070d5 ff04 .dw $ff04 +0070d6 7264 +0070d7 706f .db "drop" +0070d8 70cb .dw VE_HEAD + .set VE_HEAD = VE_DROP + XT_DROP: +0070d9 70da .dw PFA_DROP + PFA_DROP: +0070da 9189 +0070db 9199 loadtos +0070dc cf28 jmp_ DO_NEXT + .include "words/rot.asm" + + ; Stack + ; rotate the three top level cells + VE_ROT: +0070dd ff03 .dw $ff03 +0070de 6f72 +0070df 0074 .db "rot",0 +0070e0 70d5 .dw VE_HEAD + .set VE_HEAD = VE_ROT + XT_ROT: +0070e1 70e2 .dw PFA_ROT + PFA_ROT: +0070e2 018c movw temp0, tosl +0070e3 9129 ld temp2, Y+ +0070e4 9139 ld temp3, Y+ +0070e5 9189 +0070e6 9199 loadtos + +0070e7 933a st -Y, temp3 +0070e8 932a st -Y, temp2 +0070e9 931a st -Y, temp1 +0070ea 930a st -Y, temp0 + +0070eb cf19 jmp_ DO_NEXT + .include "words/nip.asm" + + ; Stack + ; Remove Second of Stack + VE_NIP: +0070ec ff03 .dw $ff03 +0070ed 696e +0070ee 0070 .db "nip",0 +0070ef 70dd .dw VE_HEAD + .set VE_HEAD = VE_NIP + XT_NIP: +0070f0 70f1 .dw PFA_NIP + PFA_NIP: +0070f1 9622 adiw yl, 2 +0070f2 cf12 jmp_ DO_NEXT + ;;;;;;;;;;;;;;;;;;;;;;;;; + .include "words/r_from.asm" + + ; Stack + ; move TOR to TOS + VE_R_FROM: +0070f3 ff02 .dw $ff02 +0070f4 3e72 .db "r>" +0070f5 70ec .dw VE_HEAD + .set VE_HEAD = VE_R_FROM + XT_R_FROM: +0070f6 70f7 .dw PFA_R_FROM + PFA_R_FROM: +0070f7 939a +0070f8 938a savetos +0070f9 918f pop tosl +0070fa 919f pop tosh +0070fb cf09 jmp_ DO_NEXT + .include "words/to_r.asm" + + ; Stack + ; move TOS to TOR + VE_TO_R: +0070fc ff02 .dw $ff02 +0070fd 723e .db ">r" +0070fe 70f3 .dw VE_HEAD + .set VE_HEAD = VE_TO_R + XT_TO_R: +0070ff 7100 .dw PFA_TO_R + PFA_TO_R: +007100 939f push tosh +007101 938f push tosl +007102 9189 +007103 9199 loadtos +007104 cf00 jmp_ DO_NEXT + .include "words/r_fetch.asm" + + ; Stack + ; fetch content of TOR + VE_R_FETCH: +007105 ff02 .dw $ff02 +007106 4072 .db "r@" +007107 70fc .dw VE_HEAD + .set VE_HEAD = VE_R_FETCH + XT_R_FETCH: +007108 7109 .dw PFA_R_FETCH + PFA_R_FETCH: +007109 939a +00710a 938a savetos +00710b 918f pop tosl +00710c 919f pop tosh +00710d 939f push tosh +00710e 938f push tosl +00710f cef5 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: +007110 ff02 .dw $ff02 +007111 3e3c .db "<>" +007112 7105 .dw VE_HEAD + .set VE_HEAD = VE_NOTEQUAL + XT_NOTEQUAL: +007113 7001 .dw DO_COLON + PFA_NOTEQUAL: + .endif + +007114 7d7f +007115 711a +007116 7020 .DW XT_EQUAL,XT_ZEROEQUAL,XT_EXIT + .include "words/equalzero.asm" + + ; Compare + ; compare with 0 (zero) + VE_ZEROEQUAL: +007117 ff02 .dw $ff02 +007118 3d30 .db "0=" +007119 7110 .dw VE_HEAD + .set VE_HEAD = VE_ZEROEQUAL + XT_ZEROEQUAL: +00711a 711b .dw PFA_ZEROEQUAL + PFA_ZEROEQUAL: +00711b 2b98 or tosh, tosl +00711c f5d1 brne PFA_ZERO1 +00711d c030 rjmp PFA_TRUE1 + .include "words/lesszero.asm" + + ; Compare + ; compare with zero + VE_ZEROLESS: +00711e ff02 .dw $ff02 +00711f 3c30 .db "0<" +007120 7117 .dw VE_HEAD + .set VE_HEAD = VE_ZEROLESS + XT_ZEROLESS: +007121 7122 .dw PFA_ZEROLESS + PFA_ZEROLESS: +007122 fd97 sbrc tosh,7 +007123 c02a rjmp PFA_TRUE1 +007124 c032 rjmp PFA_ZERO1 + .include "words/greaterzero.asm" + + ; Compare + ; true if n1 is greater than 0 + VE_GREATERZERO: +007125 ff02 .dw $ff02 +007126 3e30 .db "0>" +007127 711e .dw VE_HEAD + .set VE_HEAD = VE_GREATERZERO + XT_GREATERZERO: +007128 7129 .dw PFA_GREATERZERO + PFA_GREATERZERO: +007129 1582 cp tosl, zerol +00712a 0593 cpc tosh, zeroh +00712b f15c brlt PFA_ZERO1 +00712c f151 brbs 1, PFA_ZERO1 +00712d c020 rjmp PFA_TRUE1 + .include "words/d-greaterzero.asm" + + ; Compare + ; compares if a double double cell number is greater 0 + VE_DGREATERZERO: +00712e ff03 .dw $ff03 +00712f 3064 +007130 003e .db "d0>",0 +007131 7125 .dw VE_HEAD + .set VE_HEAD = VE_DGREATERZERO + XT_DGREATERZERO: +007132 7133 .dw PFA_DGREATERZERO + PFA_DGREATERZERO: +007133 1582 cp tosl, zerol +007134 0593 cpc tosh, zeroh +007135 9189 +007136 9199 loadtos +007137 0582 cpc tosl, zerol +007138 0593 cpc tosh, zeroh +007139 f0ec brlt PFA_ZERO1 +00713a f0e1 brbs 1, PFA_ZERO1 +00713b c012 rjmp PFA_TRUE1 + .include "words/d-lesszero.asm" + + ; Compare + ; compares if a double double cell number is less than 0 + VE_DXT_ZEROLESS: +00713c ff03 .dw $ff03 +00713d 3064 +00713e 003c .db "d0<",0 +00713f 712e .dw VE_HEAD + .set VE_HEAD = VE_DXT_ZEROLESS + XT_DXT_ZEROLESS: +007140 7141 .dw PFA_DXT_ZEROLESS + PFA_DXT_ZEROLESS: +007141 9622 adiw Y,2 +007142 fd97 sbrc tosh,7 +007143 940c 714e jmp PFA_TRUE1 +007145 940c 7157 jmp PFA_ZERO1 + + .include "words/true.asm" + + ; Arithmetics + ; leaves the value -1 (true) on TOS + VE_TRUE: +007147 ff04 .dw $ff04 +007148 7274 +007149 6575 .db "true" +00714a 713c .dw VE_HEAD + .set VE_HEAD = VE_TRUE + XT_TRUE: +00714b 714c .dw PFA_TRUE + PFA_TRUE: +00714c 939a +00714d 938a savetos + PFA_TRUE1: +00714e ef8f ser tosl +00714f ef9f ser tosh +007150 ceb4 jmp_ DO_NEXT + .include "words/zero.asm" + + ; Arithmetics + ; place a value 0 on TOS + VE_ZERO: +007151 ff01 .dw $ff01 +007152 0030 .db "0",0 +007153 7147 .dw VE_HEAD + .set VE_HEAD = VE_ZERO + XT_ZERO: +007154 7155 .dw PFA_ZERO + PFA_ZERO: +007155 939a +007156 938a savetos + PFA_ZERO1: +007157 01c1 movw tosl, zerol +007158 ceac jmp_ DO_NEXT + .include "words/uless.asm" + + ; Compare + ; true if u1 < u2 (unsigned) + VE_ULESS: +007159 ff02 .dw $ff02 +00715a 3c75 .db "u<" +00715b 7151 .dw VE_HEAD + .set VE_HEAD = VE_ULESS + XT_ULESS: +00715c 715d .dw PFA_ULESS + PFA_ULESS: +00715d 9129 ld temp2, Y+ +00715e 9139 ld temp3, Y+ +00715f 1782 cp tosl, temp2 +007160 0793 cpc tosh, temp3 +007161 f3a8 brlo PFA_ZERO1 +007162 f3a1 brbs 1, PFA_ZERO1 +007163 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: +007164 ff02 .dw $ff02 +007165 3e75 .db "u>" +007166 7159 .dw VE_HEAD + .set VE_HEAD = VE_UGREATER + XT_UGREATER: +007167 7001 .dw DO_COLON + PFA_UGREATER: + .endif +007168 70c4 .DW XT_SWAP +007169 715c .dw XT_ULESS +00716a 7020 .dw XT_EXIT + .include "words/less.asm" + + ; Compare + ; true if n1 is less than n2 + VE_LESS: +00716b ff01 .dw $ff01 +00716c 003c .db "<",0 +00716d 7164 .dw VE_HEAD + .set VE_HEAD = VE_LESS + XT_LESS: +00716e 716f .dw PFA_LESS + PFA_LESS: +00716f 9129 ld temp2, Y+ +007170 9139 ld temp3, Y+ +007171 1728 cp temp2, tosl +007172 0739 cpc temp3, tosh + PFA_LESSDONE: +007173 f71c brge PFA_ZERO1 +007174 cfd9 rjmp PFA_TRUE1 + .include "words/greater.asm" + + ; Compare + ; flag is true if n1 is greater than n2 + VE_GREATER: +007175 ff01 .dw $ff01 +007176 003e .db ">",0 +007177 716b .dw VE_HEAD + .set VE_HEAD = VE_GREATER + XT_GREATER: +007178 7179 .dw PFA_GREATER + PFA_GREATER: +007179 9129 ld temp2, Y+ +00717a 9139 ld temp3, Y+ +00717b 1728 cp temp2, tosl +00717c 0739 cpc temp3, tosh + PFA_GREATERDONE: +00717d f2cc brlt PFA_ZERO1 +00717e f2c1 brbs 1, PFA_ZERO1 +00717f cfce rjmp PFA_TRUE1 + + .include "words/log2.asm" + + ; Arithmetics + ; logarithm to base 2 or highest set bitnumber + VE_LOG2: +007180 ff04 .dw $ff04 +007181 6f6c +007182 3267 .db "log2" +007183 7175 .dw VE_HEAD + .set VE_HEAD = VE_LOG2 + XT_LOG2: +007184 7185 .dw PFA_LOG2 + PFA_LOG2: +007185 01fc movw zl, tosl +007186 2799 clr tosh +007187 e180 ldi tosl, 16 + PFA_LOG2_1: +007188 958a dec tosl +007189 f022 brmi PFA_LOG2_2 ; wrong data +00718a 0fee lsl zl +00718b 1fff rol zh +00718c f7d8 brcc PFA_LOG2_1 +00718d ce77 jmp_ DO_NEXT + + PFA_LOG2_2: +00718e 959a dec tosh +00718f ce75 jmp_ DO_NEXT + .include "words/minus.asm" + + ; Arithmetics + ; subtract n2 from n1 + VE_MINUS: +007190 ff01 .dw $ff01 +007191 002d .db "-",0 +007192 7180 .dw VE_HEAD + .set VE_HEAD = VE_MINUS + XT_MINUS: +007193 7194 .dw PFA_MINUS + PFA_MINUS: +007194 9109 ld temp0, Y+ +007195 9119 ld temp1, Y+ +007196 1b08 sub temp0, tosl +007197 0b19 sbc temp1, tosh +007198 01c8 movw tosl, temp0 +007199 ce6b jmp_ DO_NEXT + .include "words/plus.asm" + + ; Arithmetics + ; add n1 and n2 + VE_PLUS: +00719a ff01 .dw $ff01 +00719b 002b .db "+",0 +00719c 7190 .dw VE_HEAD + .set VE_HEAD = VE_PLUS + XT_PLUS: +00719d 719e .dw PFA_PLUS + PFA_PLUS: +00719e 9109 ld temp0, Y+ +00719f 9119 ld temp1, Y+ +0071a0 0f80 add tosl, temp0 +0071a1 1f91 adc tosh, temp1 +0071a2 ce62 jmp_ DO_NEXT + .include "words/mstar.asm" + + ; Arithmetics + ; multiply 2 cells to a double cell + VE_MSTAR: +0071a3 ff02 .dw $ff02 +0071a4 2a6d .db "m*" +0071a5 719a .dw VE_HEAD + .set VE_HEAD = VE_MSTAR + XT_MSTAR: +0071a6 71a7 .dw PFA_MSTAR + PFA_MSTAR: +0071a7 018c movw temp0, tosl +0071a8 9189 +0071a9 9199 loadtos +0071aa 019c movw temp2, tosl + ; high cell ah*bh +0071ab 0231 muls temp3, temp1 +0071ac 0170 movw temp4, r0 + ; low cell al*bl +0071ad 9f20 mul temp2, temp0 +0071ae 01c0 movw tosl, r0 + ; signed ah*bl +0071af 0330 mulsu temp3, temp0 +0071b0 08f3 sbc temp5, zeroh +0071b1 0d90 add tosh, r0 +0071b2 1ce1 adc temp4, r1 +0071b3 1cf3 adc temp5, zeroh + + ; signed al*bh +0071b4 0312 mulsu temp1, temp2 +0071b5 08f3 sbc temp5, zeroh +0071b6 0d90 add tosh, r0 +0071b7 1ce1 adc temp4, r1 +0071b8 1cf3 adc temp5, zeroh + +0071b9 939a +0071ba 938a savetos +0071bb 01c7 movw tosl, temp4 +0071bc ce48 jmp_ DO_NEXT + .include "words/umslashmod.asm" + + ; Arithmetics + ; unsigned division ud / u2 with remainder + VE_UMSLASHMOD: +0071bd ff06 .dw $ff06 +0071be 6d75 +0071bf 6d2f +0071c0 646f .db "um/mod" +0071c1 71a3 .dw VE_HEAD + .set VE_HEAD = VE_UMSLASHMOD + XT_UMSLASHMOD: +0071c2 71c3 .dw PFA_UMSLASHMOD + PFA_UMSLASHMOD: +0071c3 017c movw temp4, tosl + +0071c4 9129 ld temp2, Y+ +0071c5 9139 ld temp3, Y+ + +0071c6 9109 ld temp0, Y+ +0071c7 9119 ld temp1, Y+ + + ;; unsigned 32/16 -> 16r16 divide + + PFA_UMSLASHMODmod: + + ; set loop counter +0071c8 e140 ldi temp6,$10 + + PFA_UMSLASHMODmod_loop: + ; shift left, saving high bit +0071c9 2755 clr temp7 +0071ca 0f00 lsl temp0 +0071cb 1f11 rol temp1 +0071cc 1f22 rol temp2 +0071cd 1f33 rol temp3 +0071ce 1f55 rol temp7 + + ; try subtracting divisor +0071cf 152e cp temp2, temp4 +0071d0 053f cpc temp3, temp5 +0071d1 0552 cpc temp7,zerol + +0071d2 f018 brcs PFA_UMSLASHMODmod_loop_control + + PFA_UMSLASHMODmod_subtract: + ; dividend is large enough + ; do the subtraction for real + ; and set lowest bit +0071d3 9503 inc temp0 +0071d4 192e sub temp2, temp4 +0071d5 093f sbc temp3, temp5 + + PFA_UMSLASHMODmod_loop_control: +0071d6 954a dec temp6 +0071d7 f789 brne PFA_UMSLASHMODmod_loop + + PFA_UMSLASHMODmod_done: + ; put remainder on stack +0071d8 933a st -Y,temp3 +0071d9 932a st -Y,temp2 + + ; put quotient on stack +0071da 01c8 movw tosl, temp0 +0071db ce29 jmp_ DO_NEXT + .include "words/umstar.asm" + + ; Arithmetics + ; multiply 2 unsigned cells to a double cell + VE_UMSTAR: +0071dc ff03 .dw $ff03 +0071dd 6d75 +0071de 002a .db "um*",0 +0071df 71bd .dw VE_HEAD + .set VE_HEAD = VE_UMSTAR + XT_UMSTAR: +0071e0 71e1 .dw PFA_UMSTAR + PFA_UMSTAR: +0071e1 018c movw temp0, tosl +0071e2 9189 +0071e3 9199 loadtos + ; result: (temp3*temp1)* 65536 + (temp3*temp0 + temp1*temp2) * 256 + (temp0 * temp2) + ; low bytes +0071e4 9f80 mul tosl,temp0 +0071e5 01f0 movw zl, r0 +0071e6 2722 clr temp2 +0071e7 2733 clr temp3 + ; middle bytes +0071e8 9f90 mul tosh, temp0 +0071e9 0df0 add zh, r0 +0071ea 1d21 adc temp2, r1 +0071eb 1d33 adc temp3, zeroh + +0071ec 9f81 mul tosl, temp1 +0071ed 0df0 add zh, r0 +0071ee 1d21 adc temp2, r1 +0071ef 1d33 adc temp3, zeroh + +0071f0 9f91 mul tosh, temp1 +0071f1 0d20 add temp2, r0 +0071f2 1d31 adc temp3, r1 +0071f3 01cf movw tosl, zl +0071f4 939a +0071f5 938a savetos +0071f6 01c9 movw tosl, temp2 +0071f7 ce0d jmp_ DO_NEXT + + .include "words/invert.asm" + + ; Arithmetics + ; 1-complement of TOS + VE_INVERT: +0071f8 ff06 .dw $ff06 +0071f9 6e69 +0071fa 6576 +0071fb 7472 .db "invert" +0071fc 71dc .dw VE_HEAD + .set VE_HEAD = VE_INVERT + XT_INVERT: +0071fd 71fe .dw PFA_INVERT + PFA_INVERT: +0071fe 9580 com tosl +0071ff 9590 com tosh +007200 ce04 jmp_ DO_NEXT + .include "words/2slash.asm" + + ; Arithmetics + ; arithmetic shift right + VE_2SLASH: +007201 ff02 .dw $ff02 +007202 2f32 .db "2/" +007203 71f8 .dw VE_HEAD + .set VE_HEAD = VE_2SLASH + XT_2SLASH: +007204 7205 .dw PFA_2SLASH + PFA_2SLASH: +007205 9595 asr tosh +007206 9587 ror tosl +007207 cdfd jmp_ DO_NEXT + .include "words/2star.asm" + + ; Arithmetics + ; arithmetic shift left, filling with zero + VE_2STAR: +007208 ff02 .dw $ff02 +007209 2a32 .db "2*" +00720a 7201 .dw VE_HEAD + .set VE_HEAD = VE_2STAR + XT_2STAR: +00720b 720c .dw PFA_2STAR + PFA_2STAR: +00720c 0f88 lsl tosl +00720d 1f99 rol tosh +00720e cdf6 jmp_ DO_NEXT + .include "words/and.asm" + + ; Logic + ; bitwise and + VE_AND: +00720f ff03 .dw $ff03 +007210 6e61 +007211 0064 .db "and",0 +007212 7208 .dw VE_HEAD + .set VE_HEAD = VE_AND + XT_AND: +007213 7214 .dw PFA_AND + PFA_AND: +007214 9109 ld temp0, Y+ +007215 9119 ld temp1, Y+ +007216 2380 and tosl, temp0 +007217 2391 and tosh, temp1 +007218 cdec jmp_ DO_NEXT + .include "words/or.asm" + + ; Logic + ; logical or + VE_OR: +007219 ff02 .dw $ff02 +00721a 726f .db "or" +00721b 720f .dw VE_HEAD + .set VE_HEAD = VE_OR + XT_OR: +00721c 721d .dw PFA_OR + PFA_OR: +00721d 9109 ld temp0, Y+ +00721e 9119 ld temp1, Y+ +00721f 2b80 or tosl, temp0 +007220 2b91 or tosh, temp1 +007221 cde3 jmp_ DO_NEXT + + .include "words/xor.asm" + + ; Logic + ; exclusive or + VE_XOR: +007222 ff03 .dw $ff03 +007223 6f78 +007224 0072 .db "xor",0 +007225 7219 .dw VE_HEAD + .set VE_HEAD = VE_XOR + XT_XOR: +007226 7227 .dw PFA_XOR + PFA_XOR: +007227 9109 ld temp0, Y+ +007228 9119 ld temp1, Y+ +007229 2780 eor tosl, temp0 +00722a 2791 eor tosh, temp1 +00722b cdd9 jmp_ DO_NEXT + + .include "words/1plus.asm" + + ; Arithmetics + ; optimized increment + VE_1PLUS: +00722c ff02 .dw $ff02 +00722d 2b31 .db "1+" +00722e 7222 .dw VE_HEAD + .set VE_HEAD = VE_1PLUS + XT_1PLUS: +00722f 7230 .dw PFA_1PLUS + PFA_1PLUS: +007230 9601 adiw tosl,1 +007231 cdd3 jmp_ DO_NEXT + .include "words/1minus.asm" + + ; Arithmetics + ; optimized decrement + VE_1MINUS: +007232 ff02 .dw $ff02 +007233 2d31 .db "1-" +007234 722c .dw VE_HEAD + .set VE_HEAD = VE_1MINUS + XT_1MINUS: +007235 7236 .dw PFA_1MINUS + PFA_1MINUS: +007236 9701 sbiw tosl, 1 +007237 cdcd 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: +007238 ff07 .dw $ff07 +007239 6e3f +00723a 6765 +00723b 7461 +../../common\words/q-negate.asm(11): warning: .cseg .db misalignment - padding zero byte +00723c 0065 .db "?negate" +00723d 7232 .dw VE_HEAD + .set VE_HEAD = VE_QNEGATE + XT_QNEGATE: +00723e 7001 .dw DO_COLON + PFA_QNEGATE: + + .endif +00723f 7121 +007240 7036 .DW XT_ZEROLESS,XT_DOCONDBRANCH +007241 7243 DEST(QNEG1) +007242 763f .DW XT_NEGATE +007243 7020 QNEG1: .DW XT_EXIT + .include "words/lshift.asm" + + ; Arithmetics + ; logically shift n1 left n2 times + VE_LSHIFT: +007244 ff06 .dw $ff06 +007245 736c +007246 6968 +007247 7466 .db "lshift" +007248 7238 .dw VE_HEAD + .set VE_HEAD = VE_LSHIFT + XT_LSHIFT: +007249 724a .dw PFA_LSHIFT + PFA_LSHIFT: +00724a 01fc movw zl, tosl +00724b 9189 +00724c 9199 loadtos + PFA_LSHIFT1: +00724d 9731 sbiw zl, 1 +00724e f01a brmi PFA_LSHIFT2 +00724f 0f88 lsl tosl +007250 1f99 rol tosh +007251 cffb rjmp PFA_LSHIFT1 + PFA_LSHIFT2: +007252 cdb2 jmp_ DO_NEXT + + .include "words/rshift.asm" + + ; Arithmetics + ; shift n1 n2-times logically right + VE_RSHIFT: +007253 ff06 .dw $ff06 +007254 7372 +007255 6968 +007256 7466 .db "rshift" +007257 7244 .dw VE_HEAD + .set VE_HEAD = VE_RSHIFT + XT_RSHIFT: +007258 7259 .dw PFA_RSHIFT + PFA_RSHIFT: +007259 01fc movw zl, tosl +00725a 9189 +00725b 9199 loadtos + PFA_RSHIFT1: +00725c 9731 sbiw zl, 1 +00725d f01a brmi PFA_RSHIFT2 +00725e 9596 lsr tosh +00725f 9587 ror tosl +007260 cffb rjmp PFA_RSHIFT1 + PFA_RSHIFT2: +007261 cda3 jmp_ DO_NEXT + + .include "words/plusstore.asm" + + ; Arithmetics + ; add n to content of RAM address a-addr + VE_PLUSSTORE: +007262 ff02 .dw $ff02 +007263 212b .db "+!" +007264 7253 .dw VE_HEAD + .set VE_HEAD = VE_PLUSSTORE + XT_PLUSSTORE: +007265 7266 .dw PFA_PLUSSTORE + PFA_PLUSSTORE: +007266 01fc movw zl, tosl +007267 9189 +007268 9199 loadtos +007269 8120 ldd temp2, Z+0 +00726a 8131 ldd temp3, Z+1 +00726b 0f82 add tosl, temp2 +00726c 1f93 adc tosh, temp3 +00726d 8380 std Z+0, tosl +00726e 8391 std Z+1, tosh +00726f 9189 +007270 9199 loadtos +007271 cd93 jmp_ DO_NEXT + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + .include "words/rpfetch.asm" + + ; Stack + ; current return stack pointer address + VE_RP_FETCH: +007272 ff03 .dw $ff03 +007273 7072 +007274 0040 .db "rp@",0 +007275 7262 .dw VE_HEAD + .set VE_HEAD = VE_RP_FETCH + XT_RP_FETCH: +007276 7277 .dw PFA_RP_FETCH + PFA_RP_FETCH: +007277 939a +007278 938a savetos +007279 b78d in tosl, SPL +00727a b79e in tosh, SPH +00727b cd89 jmp_ DO_NEXT + .include "words/rpstore.asm" + + ; Stack + ; set return stack pointer + VE_RP_STORE: +00727c ff03 .dw $ff03 +00727d 7072 +00727e 0021 .db "rp!",0 +00727f 7272 .dw VE_HEAD + .set VE_HEAD = VE_RP_STORE + XT_RP_STORE: +007280 7281 .dw PFA_RP_STORE + PFA_RP_STORE: +007281 b72f in temp2, SREG +007282 94f8 cli +007283 bf8d out SPL, tosl +007284 bf9e out SPH, tosh +007285 bf2f out SREG, temp2 +007286 9189 +007287 9199 loadtos +007288 cd7c jmp_ DO_NEXT + .include "words/spfetch.asm" + + ; Stack + ; current data stack pointer + VE_SP_FETCH: +007289 ff03 .dw $ff03 +00728a 7073 +00728b 0040 .db "sp@",0 +00728c 727c .dw VE_HEAD + .set VE_HEAD = VE_SP_FETCH + XT_SP_FETCH: +00728d 728e .dw PFA_SP_FETCH + PFA_SP_FETCH: +00728e 939a +00728f 938a savetos +007290 01ce movw tosl, yl +007291 cd73 jmp_ DO_NEXT + .include "words/spstore.asm" + + ; Stack + ; set data stack pointer to addr + VE_SP_STORE: +007292 ff03 .dw $ff03 +007293 7073 +007294 0021 .db "sp!",0 +007295 7289 .dw VE_HEAD + .set VE_HEAD = VE_SP_STORE + XT_SP_STORE: +007296 7297 .dw PFA_SP_STORE + PFA_SP_STORE: +007297 01ec movw yl, tosl +007298 9189 +007299 9199 loadtos +00729a cd6a 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: +00729b 729c .dw PFA_DODO + PFA_DODO: +00729c 9129 ld temp2, Y+ +00729d 9139 ld temp3, Y+ ; limit + PFA_DODO1: +00729e e8e0 ldi zl, $80 +00729f 0f3e add temp3, zl +0072a0 1b82 sub tosl, temp2 +0072a1 0b93 sbc tosh, temp3 + +0072a2 933f push temp3 +0072a3 932f push temp2 ; limit ( --> limit + $8000) +0072a4 939f push tosh +0072a5 938f push tosl ; start -> index ( --> index - (limit - $8000) +0072a6 9189 +0072a7 9199 loadtos +0072a8 cd5c jmp_ DO_NEXT + .include "words/i.asm" + + ; Compiler + ; current loop counter + VE_I: +0072a9 ff01 .dw $FF01 +0072aa 0069 .db "i",0 +0072ab 7292 .dw VE_HEAD + .set VE_HEAD = VE_I + XT_I: +0072ac 72ad .dw PFA_I + PFA_I: +0072ad 939a +0072ae 938a savetos +0072af 918f pop tosl +0072b0 919f pop tosh ; index +0072b1 91ef pop zl +0072b2 91ff pop zh ; limit +0072b3 93ff push zh +0072b4 93ef push zl +0072b5 939f push tosh +0072b6 938f push tosl +0072b7 0f8e add tosl, zl +0072b8 1f9f adc tosh, zh +0072b9 cd4b 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: +0072ba 72bb .dw PFA_DOPLUSLOOP + PFA_DOPLUSLOOP: +0072bb 91ef pop zl +0072bc 91ff pop zh +0072bd 0fe8 add zl, tosl +0072be 1ff9 adc zh, tosh +0072bf 9189 +0072c0 9199 loadtos +0072c1 f01b brvs PFA_DOPLUSLOOP_LEAVE + ; next cycle + PFA_DOPLUSLOOP_NEXT: + ; next iteration +0072c2 93ff push zh +0072c3 93ef push zl +0072c4 cd6b rjmp PFA_DOBRANCH ; read next cell from dictionary and jump to its destination + PFA_DOPLUSLOOP_LEAVE: +0072c5 910f pop temp0 +0072c6 911f pop temp1 ; remove limit +0072c7 9611 adiw xl, 1 ; skip branch-back address +0072c8 cd3c 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: +0072c9 72ca .dw PFA_DOLOOP + PFA_DOLOOP: +0072ca 91ef pop zl +0072cb 91ff pop zh +0072cc 9631 adiw zl,1 +0072cd f3bb brvs PFA_DOPLUSLOOP_LEAVE +0072ce cff3 jmp_ PFA_DOPLUSLOOP_NEXT + .include "words/unloop.asm" + + ; Compiler + ; remove loop-sys, exit the loop and continue execution after it + VE_UNLOOP: +0072cf ff06 .dw $ff06 +0072d0 6e75 +0072d1 6f6c +0072d2 706f .db "unloop" +0072d3 72a9 .dw VE_HEAD + .set VE_HEAD = VE_UNLOOP + XT_UNLOOP: +0072d4 72d5 .dw PFA_UNLOOP + PFA_UNLOOP: +0072d5 911f pop temp1 +0072d6 910f pop temp0 +0072d7 911f pop temp1 +0072d8 910f pop temp0 +0072d9 cd2b jmp_ DO_NEXT + + ;;;;;;;;;;;;;;;;;;;;;;;;;;; + + .include "words/cmove_g.asm" + + ; Memory + ; copy data in RAM from higher to lower addresses. + VE_CMOVE_G: +0072da ff06 .dw $ff06 +0072db 6d63 +0072dc 766f +0072dd 3e65 .db "cmove>" +0072de 72cf .dw VE_HEAD + .set VE_HEAD = VE_CMOVE_G + XT_CMOVE_G: +0072df 72e0 .dw PFA_CMOVE_G + PFA_CMOVE_G: +0072e0 93bf push xh +0072e1 93af push xl +0072e2 91e9 ld zl, Y+ +0072e3 91f9 ld zh, Y+ ; addr-to +0072e4 91a9 ld xl, Y+ +0072e5 91b9 ld xh, Y+ ; addr-from +0072e6 2f09 mov temp0, tosh +0072e7 2b08 or temp0, tosl +0072e8 f041 brbs 1, PFA_CMOVE_G1 +0072e9 0fe8 add zl, tosl +0072ea 1ff9 adc zh, tosh +0072eb 0fa8 add xl, tosl +0072ec 1fb9 adc xh, tosh + PFA_CMOVE_G2: +0072ed 911e ld temp1, -X +0072ee 9312 st -Z, temp1 +0072ef 9701 sbiw tosl, 1 +0072f0 f7e1 brbc 1, PFA_CMOVE_G2 + PFA_CMOVE_G1: +0072f1 91af pop xl +0072f2 91bf pop xh +0072f3 9189 +0072f4 9199 loadtos +0072f5 cd0f jmp_ DO_NEXT + .include "words/byteswap.asm" + + ; Arithmetics + ; exchange the bytes of the TOS + VE_BYTESWAP: +0072f6 ff02 .dw $ff02 +0072f7 3c3e .db "><" +0072f8 72da .dw VE_HEAD + .set VE_HEAD = VE_BYTESWAP + XT_BYTESWAP: +0072f9 72fa .dw PFA_BYTESWAP + PFA_BYTESWAP: +0072fa 2f09 mov temp0, tosh +0072fb 2f98 mov tosh, tosl +0072fc 2f80 mov tosl, temp0 +0072fd cd07 jmp_ DO_NEXT + .include "words/up.asm" + + ; System Variable + ; get user area pointer + VE_UP_FETCH: +0072fe ff03 .dw $ff03 +0072ff 7075 +007300 0040 .db "up@",0 +007301 72f6 .dw VE_HEAD + .set VE_HEAD = VE_UP_FETCH + XT_UP_FETCH: +007302 7303 .dw PFA_UP_FETCH + PFA_UP_FETCH: +007303 939a +007304 938a savetos +007305 01c2 movw tosl, upl +007306 ccfe jmp_ DO_NEXT + + ; ( addr -- ) + ; System Variable + ; set user area pointer + VE_UP_STORE: +007307 ff03 .dw $ff03 +007308 7075 +007309 0021 .db "up!",0 +00730a 72fe .dw VE_HEAD + .set VE_HEAD = VE_UP_STORE + XT_UP_STORE: +00730b 730c .dw PFA_UP_STORE + PFA_UP_STORE: +00730c 012c movw upl, tosl +00730d 9189 +00730e 9199 loadtos +00730f ccf5 jmp_ DO_NEXT + .include "words/1ms.asm" + + ; Time + ; busy waits (almost) exactly 1 millisecond + VE_1MS: +007310 ff03 .dw $ff03 +007311 6d31 +007312 0073 .db "1ms",0 +007313 7307 .dw VE_HEAD + .set VE_HEAD = VE_1MS + XT_1MS: +007314 7315 .dw PFA_1MS + PFA_1MS: +007315 eae0 +007316 e0ff +007317 9731 +007318 f7f1 delay 1000 +007319 cceb jmp_ DO_NEXT + .include "words/2to_r.asm" + + ; Stack + ; move DTOS to TOR + VE_2TO_R: +00731a ff03 .dw $ff03 +00731b 3e32 +00731c 0072 .db "2>r",0 +00731d 7310 .dw VE_HEAD + .set VE_HEAD = VE_2TO_R + XT_2TO_R: +00731e 731f .dw PFA_2TO_R + PFA_2TO_R: +00731f 01fc movw zl, tosl +007320 9189 +007321 9199 loadtos +007322 939f push tosh +007323 938f push tosl +007324 93ff push zh +007325 93ef push zl +007326 9189 +007327 9199 loadtos +007328 ccdc jmp_ DO_NEXT + .include "words/2r_from.asm" + + ; Stack + ; move DTOR to TOS + VE_2R_FROM: +007329 ff03 .dw $ff03 +00732a 7232 +00732b 003e .db "2r>",0 +00732c 731a .dw VE_HEAD + .set VE_HEAD = VE_2R_FROM + XT_2R_FROM: +00732d 732e .dw PFA_2R_FROM + PFA_2R_FROM: +00732e 939a +00732f 938a savetos +007330 91ef pop zl +007331 91ff pop zh +007332 918f pop tosl +007333 919f pop tosh +007334 939a +007335 938a savetos +007336 01cf movw tosl, zl +007337 cccd jmp_ DO_NEXT + + .include "words/store-e.asm" + + ; Memory + ; write n (2bytes) to eeprom address + VE_STOREE: +007338 ff02 .dw $ff02 +007339 6521 .db "!e" +00733a 7329 .dw VE_HEAD + .set VE_HEAD = VE_STOREE + XT_STOREE: +00733b 733c .dw PFA_STOREE + PFA_STOREE: + .if WANT_UNIFIED == 1 + .endif + PFA_STOREE0: +00733c 01fc movw zl, tosl +00733d 9189 +00733e 9199 loadtos +00733f b72f in_ temp2, SREG +007340 94f8 cli +007341 d028 rcall PFA_FETCHE2 +007342 b500 in_ temp0, EEDR +007343 1708 cp temp0,tosl +007344 f009 breq PFA_STOREE3 +007345 d00b rcall PFA_STOREE1 + PFA_STOREE3: +007346 9631 adiw zl,1 +007347 d022 rcall PFA_FETCHE2 +007348 b500 in_ temp0, EEDR +007349 1709 cp temp0,tosh +00734a f011 breq PFA_STOREE4 +00734b 2f89 mov tosl, tosh +00734c d004 rcall PFA_STOREE1 + PFA_STOREE4: +00734d bf2f out_ SREG, temp2 +00734e 9189 +00734f 9199 loadtos +007350 ccb4 jmp_ DO_NEXT + + PFA_STOREE1: +007351 99f9 sbic EECR, EEPE +007352 cffe rjmp PFA_STOREE1 + + PFA_STOREE2: ; estore_wait_low_spm: +007353 b707 in_ temp0, SPMCSR +007354 fd00 sbrc temp0,SPMEN +007355 cffd rjmp PFA_STOREE2 + +007356 bdf2 out_ EEARH,zh +007357 bde1 out_ EEARL,zl +007358 bd80 out_ EEDR, tosl +007359 9afa sbi EECR,EEMPE +00735a 9af9 sbi EECR,EEPE + +00735b 9508 ret + .if WANT_UNIFIED == 1 + .endif + .include "words/fetch-e.asm" + + ; Memory + ; read 1 cell from eeprom + VE_FETCHE: +00735c ff02 .dw $ff02 +00735d 6540 .db "@e" +00735e 7338 .dw VE_HEAD + .set VE_HEAD = VE_FETCHE + XT_FETCHE: +00735f 7360 .dw PFA_FETCHE + PFA_FETCHE: + .if WANT_UNIFIED == 1 + .endif + PFA_FETCHE1: +007360 b72f in_ temp2, SREG +007361 94f8 cli +007362 01fc movw zl, tosl +007363 d006 rcall PFA_FETCHE2 +007364 b580 in_ tosl, EEDR + +007365 9631 adiw zl,1 + +007366 d003 rcall PFA_FETCHE2 +007367 b590 in_ tosh, EEDR +007368 bf2f out_ SREG, temp2 +007369 cc9b jmp_ DO_NEXT + + PFA_FETCHE2: +00736a 99f9 sbic EECR, EEPE +00736b cffe rjmp PFA_FETCHE2 + +00736c bdf2 out_ EEARH,zh +00736d bde1 out_ EEARL,zl + +00736e 9af8 sbi EECR,EERE +00736f 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: +007370 ff02 .dw $ff02 +007371 6921 .db "!i" +007372 735c .dw VE_HEAD + .set VE_HEAD = VE_STOREI + XT_STOREI: +007373 7c13 .dw PFA_DODEFER1 + PFA_STOREI: +007374 006a .dw EE_STOREI +007375 7bb4 .dw XT_EDEFERFETCH +007376 7bbe .dw XT_EDEFERSTORE + .if FLASHEND > $10000 + .else + .include "words/store-i_nrww.asm" + + ; Memory + ; writes n to flash memory using assembly code (code to be placed in boot loader section) + VE_DO_STOREI_NRWW: +007377 ff09 .dw $ff09 +007378 2128 +007379 2d69 +00737a 726e +00737b 7777 +00737c 0029 .db "(!i-nrww)",0 +00737d 7370 .dw VE_HEAD + .set VE_HEAD = VE_DO_STOREI_NRWW + XT_DO_STOREI: +00737e 737f .dw PFA_DO_STOREI_NRWW + PFA_DO_STOREI_NRWW: + ; store status register +00737f b71f in temp1,SREG +007380 931f push temp1 +007381 94f8 cli + +007382 019c movw temp2, tosl ; save the (word) address +007383 9189 +007384 9199 loadtos ; get the new value for the flash cell +007385 93af push xl +007386 93bf push xh +007387 93cf push yl +007388 93df push yh +007389 d009 rcall DO_STOREI_atmega +00738a 91df pop yh +00738b 91cf pop yl +00738c 91bf pop xh +00738d 91af pop xl + ; finally clear the stack +00738e 9189 +00738f 9199 loadtos +007390 911f pop temp1 + ; restore status register (and interrupt enable flag) +007391 bf1f out SREG,temp1 + +007392 cc72 jmp_ DO_NEXT + + ; + DO_STOREI_atmega: + ; write data to temp page buffer + ; use the values in tosl/tosh at the + ; appropiate place +007393 d010 rcall pageload + + ; erase page if needed + ; it is needed if a bit goes from 0 to 1 +007394 94e0 com temp4 +007395 94f0 com temp5 +007396 218e and tosl, temp4 +007397 219f and tosh, temp5 +007398 2b98 or tosh, tosl +007399 f019 breq DO_STOREI_writepage +00739a 01f9 movw zl, temp2 +00739b e002 ldi temp0,(1<8000 + .include "dict/core_8k.inc" + + .include "words/n_to_r.asm" + + ; Stack + ; move n items from data stack to return stack + VE_N_TO_R: +0073d2 ff03 .dw $ff03 +0073d3 3e6e +0073d4 0072 .db "n>r",0 +0073d5 73c8 .dw VE_HEAD + .set VE_HEAD = VE_N_TO_R + XT_N_TO_R: +0073d6 73d7 .dw PFA_N_TO_R + PFA_N_TO_R: +0073d7 01fc movw zl, tosl +0073d8 2f08 mov temp0, tosl + PFA_N_TO_R1: +0073d9 9189 +0073da 9199 loadtos +0073db 939f push tosh +0073dc 938f push tosl +0073dd 950a dec temp0 +0073de f7d1 brne PFA_N_TO_R1 +0073df 93ef push zl +0073e0 93ff push zh +0073e1 9189 +0073e2 9199 loadtos +0073e3 cc21 jmp_ DO_NEXT + .include "words/n_r_from.asm" + + ; Stack + ; move n items from return stack to data stack + VE_N_R_FROM: +0073e4 ff03 .dw $ff03 +0073e5 726e +0073e6 003e .db "nr>",0 +0073e7 73d2 .dw VE_HEAD + .set VE_HEAD = VE_N_R_FROM + XT_N_R_FROM: +0073e8 73e9 .dw PFA_N_R_FROM + PFA_N_R_FROM: +0073e9 939a +0073ea 938a savetos +0073eb 91ff pop zh +0073ec 91ef pop zl +0073ed 2f0e mov temp0, zl + PFA_N_R_FROM1: +0073ee 918f pop tosl +0073ef 919f pop tosh +0073f0 939a +0073f1 938a savetos +0073f2 950a dec temp0 +0073f3 f7d1 brne PFA_N_R_FROM1 +0073f4 01cf movw tosl, zl +0073f5 cc0f jmp_ DO_NEXT + + .include "words/d-2star.asm" + + ; Arithmetics + ; shift a double cell left + VE_D2STAR: +0073f6 ff03 .dw $ff03 +0073f7 3264 +0073f8 002a .db "d2*",0 +0073f9 73e4 .dw VE_HEAD + .set VE_HEAD = VE_D2STAR + XT_D2STAR: +0073fa 73fb .dw PFA_D2STAR + PFA_D2STAR: +0073fb 9109 ld temp0, Y+ +0073fc 9119 ld temp1, Y+ +0073fd 0f00 lsl temp0 +0073fe 1f11 rol temp1 +0073ff 1f88 rol tosl +007400 1f99 rol tosh +007401 931a st -Y, temp1 +007402 930a st -Y, temp0 +007403 cc01 jmp_ DO_NEXT + .include "words/d-2slash.asm" + + ; Arithmetics + ; shift a double cell value right + VE_D2SLASH: +007404 ff03 .dw $ff03 +007405 3264 +007406 002f .db "d2/",0 +007407 73f6 .dw VE_HEAD + .set VE_HEAD = VE_D2SLASH + XT_D2SLASH: +007408 7409 .dw PFA_D2SLASH + PFA_D2SLASH: +007409 9109 ld temp0, Y+ +00740a 9119 ld temp1, Y+ +00740b 9595 asr tosh +00740c 9587 ror tosl +00740d 9517 ror temp1 +00740e 9507 ror temp0 +00740f 931a st -Y, temp1 +007410 930a st -Y, temp0 +007411 cbf3 jmp_ DO_NEXT + .include "words/d-plus.asm" + + ; Arithmetics + ; add 2 double cell values + VE_DPLUS: +007412 ff02 .dw $ff02 +007413 2b64 .db "d+" +007414 7404 .dw VE_HEAD + .set VE_HEAD = VE_DPLUS + XT_DPLUS: +007415 7416 .dw PFA_DPLUS + PFA_DPLUS: +007416 9129 ld temp2, Y+ +007417 9139 ld temp3, Y+ + +007418 90e9 ld temp4, Y+ +007419 90f9 ld temp5, Y+ +00741a 9149 ld temp6, Y+ +00741b 9159 ld temp7, Y+ + +00741c 0f24 add temp2, temp6 +00741d 1f35 adc temp3, temp7 +00741e 1d8e adc tosl, temp4 +00741f 1d9f adc tosh, temp5 + +007420 933a st -Y, temp3 +007421 932a st -Y, temp2 +007422 cbe2 jmp_ DO_NEXT + .include "words/d-minus.asm" + + ; Arithmetics + ; subtract d2 from d1 + VE_DMINUS: +007423 ff02 .dw $ff02 +007424 2d64 .db "d-" +007425 7412 .dw VE_HEAD + .set VE_HEAD = VE_DMINUS + XT_DMINUS: +007426 7427 .dw PFA_DMINUS + PFA_DMINUS: +007427 9129 ld temp2, Y+ +007428 9139 ld temp3, Y+ + +007429 90e9 ld temp4, Y+ +00742a 90f9 ld temp5, Y+ +00742b 9149 ld temp6, Y+ +00742c 9159 ld temp7, Y+ + +00742d 1b42 sub temp6, temp2 +00742e 0b53 sbc temp7, temp3 +00742f 0ae8 sbc temp4, tosl +007430 0af9 sbc temp5, tosh + +007431 935a st -Y, temp7 +007432 934a st -Y, temp6 +007433 01c7 movw tosl, temp4 +007434 cbd0 jmp_ DO_NEXT + .include "words/d-invert.asm" + + ; Arithmetics + ; invert all bits in the double cell value + VE_DINVERT: +007435 ff07 .dw $ff07 +007436 6964 +007437 766e +007438 7265 +007439 0074 .db "dinvert",0 +00743a 7423 .dw VE_HEAD + .set VE_HEAD = VE_DINVERT + XT_DINVERT: +00743b 743c .dw PFA_DINVERT + PFA_DINVERT: +00743c 9109 ld temp0, Y+ +00743d 9119 ld temp1, Y+ +00743e 9580 com tosl +00743f 9590 com tosh +007440 9500 com temp0 +007441 9510 com temp1 +007442 931a st -Y, temp1 +007443 930a st -Y, temp0 +007444 cbc0 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: +007445 ff02 .dw $ff02 +007446 2e75 .db "u." +007447 7435 .dw VE_HEAD + .set VE_HEAD = VE_UDOT + XT_UDOT: +007448 7001 .dw DO_COLON + PFA_UDOT: + .endif +007449 7154 .dw XT_ZERO +00744a 772a .dw XT_UDDOT +00744b 7020 .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: +00744c ff03 .dw $ff03 +00744d 2e75 +00744e 0072 .db "u.r",0 +00744f 7445 .dw VE_HEAD + .set VE_HEAD = VE_UDOTR + XT_UDOTR: +007450 7001 .dw DO_COLON + PFA_UDOTR: + .endif +007451 7154 .dw XT_ZERO +007452 70c4 .dw XT_SWAP +007453 7733 .dw XT_UDDOTR +007454 7020 .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: +007455 ff0d .dw $ff0d +007456 6873 +007457 776f +007458 772d +007459 726f +00745a 6c64 +00745b 7369 +00745c 0074 .db "show-wordlist",0 +00745d 744c .dw VE_HEAD + .set VE_HEAD = VE_SHOWWORDLIST + XT_SHOWWORDLIST: +00745e 7001 .dw DO_COLON + PFA_SHOWWORDLIST: + .endif +00745f 703d .dw XT_DOLITERAL +007460 7464 .dw XT_SHOWWORD +007461 70c4 .dw XT_SWAP +007462 7c57 .dw XT_TRAVERSEWORDLIST +007463 7020 .dw XT_EXIT + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + XT_SHOWWORD: +007464 7001 .dw DO_COLON + PFA_SHOWWORD: + .endif +007465 7c72 .dw XT_NAME2STRING +007466 77a0 .dw XT_ITYPE +007467 77e2 .dw XT_SPACE ; ( -- addr n) +007468 714b .dw XT_TRUE +007469 7020 .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: +00746a ff05 .dw $ff05 +00746b 6f77 +00746c 6472 +00746d 0073 .db "words",0 +00746e 7455 .dw VE_HEAD + .set VE_HEAD = VE_WORDS + XT_WORDS: +00746f 7001 .dw DO_COLON + PFA_WORDS: + .endif +007470 703d .dw XT_DOLITERAL +007471 0050 .dw CFG_ORDERLISTLEN+2 +007472 735f .dw XT_FETCHE +007473 745e .dw XT_SHOWWORDLIST +007474 7020 .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: +007475 ff04 .dw $ff04 +007476 692b +007477 746e .db "+int" +007478 746a .dw VE_HEAD + .set VE_HEAD = VE_INTON + XT_INTON: +007479 747a .dw PFA_INTON + PFA_INTON: +00747a 9478 sei +00747b cb89 jmp_ DO_NEXT + .include "words/int-off.asm" + + ; Interrupt + ; turns off all interrupts + VE_INTOFF: +00747c ff04 .dw $ff04 +00747d 692d +00747e 746e .db "-int" +00747f 7475 .dw VE_HEAD + .set VE_HEAD = VE_INTOFF + XT_INTOFF: +007480 7481 .dw PFA_INTOFF + PFA_INTOFF: +007481 94f8 cli +007482 cb82 jmp_ DO_NEXT + .include "words/int-store.asm" + + ; Interrupt + ; stores XT as interrupt vector i + VE_INTSTORE: +007483 ff04 .dw $ff04 +007484 6e69 +007485 2174 .db "int!" +007486 747c .dw VE_HEAD + .set VE_HEAD = VE_INTSTORE + XT_INTSTORE: +007487 7001 .dw DO_COLON + PFA_INTSTORE: +007488 703d .dw XT_DOLITERAL +007489 0000 .dw intvec +00748a 719d .dw XT_PLUS +00748b 733b .dw XT_STOREE +00748c 7020 .dw XT_EXIT + .include "words/int-fetch.asm" + + ; Interrupt + ; fetches XT from interrupt vector i + VE_INTFETCH: +00748d ff04 .dw $ff04 +00748e 6e69 +00748f 4074 .db "int@" +007490 7483 .dw VE_HEAD + .set VE_HEAD = VE_INTFETCH + XT_INTFETCH: +007491 7001 .dw DO_COLON + PFA_INTFETCH: +007492 703d .dw XT_DOLITERAL +007493 0000 .dw intvec +007494 719d .dw XT_PLUS +007495 735f .dw XT_FETCHE +007496 7020 .dw XT_EXIT + .include "words/int-trap.asm" + + ; Interrupt + ; trigger an interrupt + VE_INTTRAP: +007497 ff08 .dw $ff08 +007498 6e69 +007499 2d74 +00749a 7274 +00749b 7061 .db "int-trap" +00749c 748d .dw VE_HEAD + .set VE_HEAD = VE_INTTRAP + XT_INTTRAP: +00749d 749e .dw PFA_INTTRAP + PFA_INTTRAP: +00749e 2eb8 mov isrflag, tosl +00749f 9189 +0074a0 9199 loadtos +0074a1 cb63 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: +0074a2 7001 .dw DO_COLON + PFA_ISREXEC: +0074a3 7491 .dw XT_INTFETCH +0074a4 702a .dw XT_EXECUTE +0074a5 74a7 .dw XT_ISREND +0074a6 7020 .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: +0074a7 74a8 .dw PFA_ISREND + PFA_ISREND: +0074a8 d001 rcall PFA_ISREND1 ; clear the interrupt flag for the controller +0074a9 cb5b jmp_ DO_NEXT + PFA_ISREND1: +0074aa 9518 reti + .endif + + .include "words/pick.asm" + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_PICK: +0074ab ff04 .dw $ff04 +0074ac 6970 +0074ad 6b63 .db "pick" +0074ae 7497 .dw VE_HEAD + .set VE_HEAD = VE_PICK + XT_PICK: +0074af 7001 .dw DO_COLON + PFA_PICK: + .endif +0074b0 722f .dw XT_1PLUS +0074b1 7558 .dw XT_CELLS +0074b2 728d .dw XT_SP_FETCH +0074b3 719d .dw XT_PLUS +0074b4 7079 .dw XT_FETCH +0074b5 7020 .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: +0074b6 0002 .dw $0002 +0074b7 222e .db ".",$22 +0074b8 74ab .dw VE_HEAD + .set VE_HEAD = VE_DOTSTRING + XT_DOTSTRING: +0074b9 7001 .dw DO_COLON + PFA_DOTSTRING: + .endif +0074ba 74c1 .dw XT_SQUOTE +0074bb 01c1 .dw XT_COMPILE +0074bc 77a0 .dw XT_ITYPE +0074bd 7020 .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: +0074be 0002 .dw $0002 +0074bf 2273 .db "s",$22 +0074c0 74b6 .dw VE_HEAD + .set VE_HEAD = VE_SQUOTE + XT_SQUOTE: +0074c1 7001 .dw DO_COLON + PFA_SQUOTE: + .endif +0074c2 703d .dw XT_DOLITERAL +0074c3 0022 .dw 34 ; 0x22 +0074c4 7987 .dw XT_PARSE ; ( -- addr n) +0074c5 754b .dw XT_STATE +0074c6 7079 .dw XT_FETCH +0074c7 7036 .dw XT_DOCONDBRANCH +0074c8 74ca DEST(PFA_SQUOTE1) +0074c9 01ed .dw XT_SLITERAL + PFA_SQUOTE1: +0074ca 7020 .dw XT_EXIT + + .include "words/fill.asm" + + ; Memory + ; fill u bytes memory beginning at a-addr with character c + VE_FILL: +0074cb ff04 .dw $ff04 +0074cc 6966 +0074cd 6c6c .db "fill" +0074ce 74be .dw VE_HEAD + .set VE_HEAD = VE_FILL + XT_FILL: +0074cf 7001 .dw DO_COLON + PFA_FILL: +0074d0 70e1 .dw XT_ROT +0074d1 70e1 .dw XT_ROT +0074d2 70b9 +0074d3 7036 .dw XT_QDUP,XT_DOCONDBRANCH +0074d4 74dc DEST(PFA_FILL2) +0074d5 7d5e .dw XT_BOUNDS +0074d6 729b .dw XT_DODO + PFA_FILL1: +0074d7 70b1 .dw XT_DUP +0074d8 72ac .dw XT_I +0074d9 708d .dw XT_CSTORE ; ( -- c c-addr) +0074da 72c9 .dw XT_DOLOOP +0074db 74d7 .dw PFA_FILL1 + PFA_FILL2: +0074dc 70d9 .dw XT_DROP +0074dd 7020 .dw XT_EXIT + + .include "words/environment.asm" + + ; System Value + ; word list identifier of the environmental search list + VE_ENVIRONMENT: +0074de ff0b .dw $ff0b +0074df 6e65 +0074e0 6976 +0074e1 6f72 +0074e2 6d6e +0074e3 6e65 +0074e4 0074 .db "environment",0 +0074e5 74cb .dw VE_HEAD + .set VE_HEAD = VE_ENVIRONMENT + XT_ENVIRONMENT: +0074e6 7048 .dw PFA_DOVARIABLE + PFA_ENVIRONMENT: +0074e7 0048 .dw CFG_ENVIRONMENT + .include "words/env-wordlists.asm" + + ; Environment + ; maximum number of wordlists in the dictionary search order + VE_ENVWORDLISTS: +0074e8 ff09 .dw $ff09 +0074e9 6f77 +0074ea 6472 +0074eb 696c +0074ec 7473 +0074ed 0073 .db "wordlists",0 +0074ee 0000 .dw VE_ENVHEAD + .set VE_ENVHEAD = VE_ENVWORDLISTS + XT_ENVWORDLISTS: +0074ef 7001 .dw DO_COLON + PFA_ENVWORDLISTS: +0074f0 703d .dw XT_DOLITERAL +0074f1 0008 .dw NUMWORDLISTS +0074f2 7020 .dw XT_EXIT + .include "words/env-slashpad.asm" + + ; Environment + ; Size of the PAD buffer in bytes + VE_ENVSLASHPAD: +0074f3 ff04 .dw $ff04 +0074f4 702f +0074f5 6461 .db "/pad" +0074f6 74e8 .dw VE_ENVHEAD + .set VE_ENVHEAD = VE_ENVSLASHPAD + XT_ENVSLASHPAD: +0074f7 7001 .dw DO_COLON + PFA_ENVSLASHPAD: +0074f8 728d .dw XT_SP_FETCH +0074f9 7584 .dw XT_PAD +0074fa 7193 .dw XT_MINUS +0074fb 7020 .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: +0074fc ff05 .dw $ff05 +0074fd 682f +0074fe 6c6f +0074ff 0064 .db "/hold",0 +007500 74f3 .dw VE_ENVHEAD + .set VE_ENVHEAD = VE_ENVSLASHHOLD + XT_ENVSLASHHOLD: +007501 7001 .dw DO_COLON + PFA_ENVSLASHHOLD: + .endif +007502 7584 .dw XT_PAD +007503 75bf .dw XT_HERE +007504 7193 .dw XT_MINUS +007505 7020 .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: +007506 ff0a .dw $ff0a +007507 6f66 +007508 7472 +007509 2d68 +00750a 616e +00750b 656d .db "forth-name" +00750c 74fc .dw VE_ENVHEAD + .set VE_ENVHEAD = VE_ENV_FORTHNAME + XT_ENV_FORTHNAME: +00750d 7001 .dw DO_COLON + PFA_EN_FORTHNAME: +00750e 776d .dw XT_DOSLITERAL +00750f 0007 .dw 7 + .endif +007510 6d61 +007511 6f66 +007512 7472 +../../common\words/env-forthname.asm(22): warning: .cseg .db misalignment - padding zero byte +007513 0068 .db "amforth" + .if cpu_msp430==1 + .endif +007514 7020 .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: +007515 ff07 .dw $ff07 +007516 6576 +007517 7372 +007518 6f69 +007519 006e .db "version",0 +00751a 7506 .dw VE_ENVHEAD + .set VE_ENVHEAD = VE_ENV_FORTHVERSION + XT_ENV_FORTHVERSION: +00751b 7001 .dw DO_COLON + PFA_EN_FORTHVERSION: + .endif +00751c 703d .dw XT_DOLITERAL +00751d 0041 .dw 65 +00751e 7020 .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: +00751f ff03 .dw $ff03 +007520 7063 +007521 0075 .db "cpu",0 +007522 7515 .dw VE_ENVHEAD + .set VE_ENVHEAD = VE_ENV_CPU + XT_ENV_CPU: +007523 7001 .dw DO_COLON + PFA_EN_CPU: + .endif +007524 703d .dw XT_DOLITERAL +007525 003b .dw mcu_name +007526 77cc .dw XT_ICOUNT +007527 7020 .dw XT_EXIT + .include "words/env-mcuinfo.asm" + + ; Environment + ; flash address of some CPU specific parameters + VE_ENV_MCUINFO: +007528 ff08 .dw $ff08 +007529 636d +00752a 2d75 +00752b 6e69 +00752c 6f66 .db "mcu-info" +00752d 751f .dw VE_ENVHEAD + .set VE_ENVHEAD = VE_ENV_MCUINFO + XT_ENV_MCUINFO: +00752e 7001 .dw DO_COLON + PFA_EN_MCUINFO: +00752f 703d .dw XT_DOLITERAL +007530 0037 .dw mcu_info +007531 7020 .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: +007532 ff05 .dw $ff05 +007533 752f +007534 6573 +007535 0072 .db "/user",0 +007536 7528 .dw VE_ENVHEAD + .set VE_ENVHEAD = VE_ENVUSERSIZE + XT_ENVUSERSIZE: +007537 7001 .dw DO_COLON + PFA_ENVUSERSIZE: + .endif +007538 703d .dw XT_DOLITERAL +007539 002c .dw SYSUSERSIZE + APPUSERSIZE +00753a 7020 .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: +00753b ff05 .dw $ff05 +00753c 5f66 +00753d 7063 +00753e 0075 .db "f_cpu",0 +00753f 74de .dw VE_HEAD + .set VE_HEAD = VE_F_CPU + XT_F_CPU: +007540 7001 .dw DO_COLON + PFA_F_CPU: + .endif +007541 703d .dw XT_DOLITERAL +007542 2400 .dw (F_CPU % 65536) +007543 703d .dw XT_DOLITERAL +007544 00f4 .dw (F_CPU / 65536) +007545 7020 .dw XT_EXIT + .include "words/state.asm" + + ; System Variable + ; system state + VE_STATE: +007546 ff05 .dw $ff05 +007547 7473 +007548 7461 +007549 0065 .db "state",0 +00754a 753b .dw VE_HEAD + .set VE_HEAD = VE_STATE + XT_STATE: +00754b 7048 .dw PFA_DOVARIABLE + PFA_STATE: +00754c 0136 .dw ram_state + + .dseg +000136 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: +00754d ff04 .dw $ff04 +00754e 6162 +00754f 6573 .db "base" +007550 7546 .dw VE_HEAD + .set VE_HEAD = VE_BASE + XT_BASE: +007551 7058 .dw PFA_DOUSER + PFA_BASE: + .endif +007552 000c .dw USER_BASE + + .include "words/cells.asm" + + ; Arithmetics + ; n2 is the size in address units of n1 cells + VE_CELLS: +007553 ff05 .dw $ff05 +007554 6563 +007555 6c6c +007556 0073 .db "cells",0 +007557 754d .dw VE_HEAD + .set VE_HEAD = VE_CELLS + XT_CELLS: +007558 720c .dw PFA_2STAR + .include "words/cellplus.asm" + + ; Arithmetics + ; add the size of an address-unit to a-addr1 + VE_CELLPLUS: +007559 ff05 .dw $ff05 +00755a 6563 +00755b 6c6c +00755c 002b .db "cell+",0 +00755d 7553 .dw VE_HEAD + .set VE_HEAD = VE_CELLPLUS + XT_CELLPLUS: +00755e 755f .dw PFA_CELLPLUS + PFA_CELLPLUS: +00755f 9602 adiw tosl, CELLSIZE +007560 caa4 jmp_ DO_NEXT + + .include "words/2dup.asm" + + ; Stack + ; Duplicate the 2 top elements + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_2DUP: +007561 ff04 .dw $ff04 +007562 6432 +007563 7075 .db "2dup" +007564 7559 .dw VE_HEAD + .set VE_HEAD = VE_2DUP + XT_2DUP: +007565 7001 .dw DO_COLON + PFA_2DUP: + .endif + +007566 70cf .dw XT_OVER +007567 70cf .dw XT_OVER +007568 7020 .dw XT_EXIT + .include "words/2drop.asm" + + ; Stack + ; Remove the 2 top elements + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_2DROP: +007569 ff05 .dw $ff05 +00756a 6432 +00756b 6f72 +00756c 0070 .db "2drop",0 +00756d 7561 .dw VE_HEAD + .set VE_HEAD = VE_2DROP + XT_2DROP: +00756e 7001 .dw DO_COLON + PFA_2DROP: + .endif +00756f 70d9 .dw XT_DROP +007570 70d9 .dw XT_DROP +007571 7020 .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: +007572 ff04 .dw $ff04 +007573 7574 +007574 6b63 .db "tuck" +007575 7569 .dw VE_HEAD + .set VE_HEAD = VE_TUCK + XT_TUCK: +007576 7001 .dw DO_COLON + PFA_TUCK: + .endif +007577 70c4 .dw XT_SWAP +007578 70cf .dw XT_OVER +007579 7020 .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: +00757a ff03 .dw $ff03 +00757b 693e +00757c 006e .db ">in",0 +00757d 7572 .dw VE_HEAD + .set VE_HEAD = VE_TO_IN + XT_TO_IN: +00757e 7058 .dw PFA_DOUSER + PFA_TO_IN: + .endif +00757f 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: +007580 ff03 .dw $ff03 +007581 6170 +007582 0064 .db "pad",0 +007583 757a .dw VE_HEAD + .set VE_HEAD = VE_PAD + XT_PAD: +007584 7001 .dw DO_COLON + PFA_PAD: + .endif +007585 75bf .dw XT_HERE +007586 703d .dw XT_DOLITERAL +007587 0028 .dw 40 +007588 719d .dw XT_PLUS +007589 7020 .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: +00758a ff04 .dw $ff04 +00758b 6d65 +00758c 7469 .db "emit" +00758d 7580 .dw VE_HEAD + .set VE_HEAD = VE_EMIT + XT_EMIT: +00758e 7c13 .dw PFA_DODEFER1 + PFA_EMIT: + .endif +00758f 000e .dw USER_EMIT +007590 7bdc .dw XT_UDEFERFETCH +007591 7be8 .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: +007592 ff05 .dw $ff05 +007593 6d65 +007594 7469 +007595 003f .db "emit?",0 +007596 758a .dw VE_HEAD + .set VE_HEAD = VE_EMITQ + XT_EMITQ: +007597 7c13 .dw PFA_DODEFER1 + PFA_EMITQ: + .endif +007598 0010 .dw USER_EMITQ +007599 7bdc .dw XT_UDEFERFETCH +00759a 7be8 .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: +00759b ff03 .dw $ff03 +00759c 656b +00759d 0079 .db "key",0 +00759e 7592 .dw VE_HEAD + .set VE_HEAD = VE_KEY + XT_KEY: +00759f 7c13 .dw PFA_DODEFER1 + PFA_KEY: + .endif +0075a0 0012 .dw USER_KEY +0075a1 7bdc .dw XT_UDEFERFETCH +0075a2 7be8 .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: +0075a3 ff04 .dw $ff04 +0075a4 656b +0075a5 3f79 .db "key?" +0075a6 759b .dw VE_HEAD + .set VE_HEAD = VE_KEYQ + XT_KEYQ: +0075a7 7c13 .dw PFA_DODEFER1 + PFA_KEYQ: + .endif +0075a8 0014 .dw USER_KEYQ +0075a9 7bdc .dw XT_UDEFERFETCH +0075aa 7be8 .dw XT_UDEFERSTORE + + .include "words/dp.asm" + + ; System Value + ; address of the next free dictionary cell + VE_DP: +0075ab ff02 .dw $ff02 +0075ac 7064 .db "dp" +0075ad 75a3 .dw VE_HEAD + .set VE_HEAD = VE_DP + XT_DP: +0075ae 706f .dw PFA_DOVALUE1 + PFA_DP: +0075af 003a .dw CFG_DP +0075b0 7bb4 .dw XT_EDEFERFETCH +0075b1 7bbe .dw XT_EDEFERSTORE + .include "words/ehere.asm" + + ; System Value + ; address of the next free address in eeprom + VE_EHERE: +0075b2 ff05 .dw $ff05 +0075b3 6865 +0075b4 7265 +0075b5 0065 .db "ehere",0 +0075b6 75ab .dw VE_HEAD + .set VE_HEAD = VE_EHERE + XT_EHERE: +0075b7 706f .dw PFA_DOVALUE1 + PFA_EHERE: +0075b8 003e .dw EE_EHERE +0075b9 7bb4 .dw XT_EDEFERFETCH +0075ba 7bbe .dw XT_EDEFERSTORE + .include "words/here.asm" + + ; System Value + ; address of the next free data space (RAM) cell + VE_HERE: +0075bb ff04 .dw $ff04 +0075bc 6568 +0075bd 6572 .db "here" +0075be 75b2 .dw VE_HEAD + .set VE_HEAD = VE_HERE + XT_HERE: +0075bf 706f .dw PFA_DOVALUE1 + PFA_HERE: +0075c0 003c .dw EE_HERE +0075c1 7bb4 .dw XT_EDEFERFETCH +0075c2 7bbe .dw XT_EDEFERSTORE + .include "words/allot.asm" + + ; System + ; allocate or release memory in RAM + VE_ALLOT: +0075c3 ff05 .dw $ff05 +0075c4 6c61 +0075c5 6f6c +0075c6 0074 .db "allot",0 +0075c7 75bb .dw VE_HEAD + .set VE_HEAD = VE_ALLOT + XT_ALLOT: +0075c8 7001 .dw DO_COLON + PFA_ALLOT: +0075c9 75bf .dw XT_HERE +0075ca 719d .dw XT_PLUS +0075cb 7b99 .dw XT_DOTO +0075cc 75c0 .dw PFA_HERE +0075cd 7020 .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: +0075ce ff03 .dw $ff03 +0075cf 6962 +0075d0 006e .db "bin",0 +0075d1 75c3 .dw VE_HEAD + .set VE_HEAD = VE_BIN + XT_BIN: +0075d2 7001 .dw DO_COLON + PFA_BIN: + .endif +0075d3 7d8b .dw XT_TWO +0075d4 7551 .dw XT_BASE +0075d5 7081 .dw XT_STORE +0075d6 7020 .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: +0075d7 ff07 .dw $ff07 +0075d8 6564 +0075d9 6963 +0075da 616d +0075db 006c .db "decimal",0 +0075dc 75ce .dw VE_HEAD + .set VE_HEAD = VE_DECIMAL + XT_DECIMAL: +0075dd 7001 .dw DO_COLON + PFA_DECIMAL: + .endif +0075de 703d .dw XT_DOLITERAL +0075df 000a .dw 10 +0075e0 7551 .dw XT_BASE +0075e1 7081 .dw XT_STORE +0075e2 7020 .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: +0075e3 ff03 .dw $ff03 +0075e4 6568 +0075e5 0078 .db "hex",0 +0075e6 75d7 .dw VE_HEAD + .set VE_HEAD = VE_HEX + XT_HEX: +0075e7 7001 .dw DO_COLON + PFA_HEX: + .endif +0075e8 703d .dw XT_DOLITERAL +0075e9 0010 .dw 16 +0075ea 7551 .dw XT_BASE +0075eb 7081 .dw XT_STORE +0075ec 7020 .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: +0075ed ff02 .dw $ff02 +0075ee 6c62 .db "bl" +0075ef 75e3 .dw VE_HEAD + .set VE_HEAD = VE_BL + XT_BL: +0075f0 7048 .dw PFA_DOVARIABLE + PFA_BL: + .endif +0075f1 0020 .dw 32 + + .include "words/turnkey.asm" + + ; System Value + ; Deferred action during startup/reset + VE_TURNKEY: +0075f2 ff07 .dw $ff07 +0075f3 7574 +0075f4 6e72 +0075f5 656b +0075f6 0079 .db "turnkey",0 +0075f7 75ed .dw VE_HEAD + .set VE_HEAD = VE_TURNKEY + XT_TURNKEY: +0075f8 7c13 .dw PFA_DODEFER1 + PFA_TURNKEY: +0075f9 0046 .dw CFG_TURNKEY +0075fa 7bb4 .dw XT_EDEFERFETCH +0075fb 7bbe .dw XT_EDEFERSTORE + ;;;;;;;;;;;;;;;;;;;;;;;;;;;; + .include "words/slashmod.asm" + + ; Arithmetics + ; signed division n1/n2 with remainder and quotient + VE_SLASHMOD: +0075fc ff04 .dw $ff04 +0075fd 6d2f +0075fe 646f .db "/mod" +0075ff 75f2 .dw VE_HEAD + .set VE_HEAD = VE_SLASHMOD + XT_SLASHMOD: +007600 7601 .dw PFA_SLASHMOD + PFA_SLASHMOD: +007601 019c movw temp2, tosl + +007602 9109 ld temp0, Y+ +007603 9119 ld temp1, Y+ + +007604 2f41 mov temp6,temp1 ;move dividend High to sign register +007605 2743 eor temp6,temp3 ;xor divisor High with sign register +007606 ff17 sbrs temp1,7 ;if MSB in dividend set +007607 c004 rjmp PFA_SLASHMOD_1 +007608 9510 com temp1 ; change sign of dividend +007609 9500 com temp0 +00760a 5f0f subi temp0,low(-1) +00760b 4f1f sbci temp1,high(-1) + PFA_SLASHMOD_1: +00760c ff37 sbrs temp3,7 ;if MSB in divisor set +00760d c004 rjmp PFA_SLASHMOD_2 +00760e 9530 com temp3 ; change sign of divisor +00760f 9520 com temp2 +007610 5f2f subi temp2,low(-1) +007611 4f3f sbci temp3,high(-1) +007612 24ee PFA_SLASHMOD_2: clr temp4 ;clear remainder Low byte +007613 18ff sub temp5,temp5;clear remainder High byte and carry +007614 e151 ldi temp7,17 ;init loop counter + +007615 1f00 PFA_SLASHMOD_3: rol temp0 ;shift left dividend +007616 1f11 rol temp1 +007617 955a dec temp7 ;decrement counter +007618 f439 brne PFA_SLASHMOD_5 ;if done +007619 ff47 sbrs temp6,7 ; if MSB in sign register set +00761a c004 rjmp PFA_SLASHMOD_4 +00761b 9510 com temp1 ; change sign of result +00761c 9500 com temp0 +00761d 5f0f subi temp0,low(-1) +00761e 4f1f sbci temp1,high(-1) +00761f c00b PFA_SLASHMOD_4: rjmp PFA_SLASHMODmod_done ; return +007620 1cee PFA_SLASHMOD_5: rol temp4 ;shift dividend into remainder +007621 1cff rol temp5 +007622 1ae2 sub temp4,temp2 ;remainder = remainder - divisor +007623 0af3 sbc temp5,temp3 ; +007624 f420 brcc PFA_SLASHMOD_6 ;if result negative +007625 0ee2 add temp4,temp2 ; restore remainder +007626 1ef3 adc temp5,temp3 +007627 9488 clc ; clear carry to be shifted into result +007628 cfec rjmp PFA_SLASHMOD_3 ;else +007629 9408 PFA_SLASHMOD_6: sec ; set carry to be shifted into result +00762a cfea rjmp PFA_SLASHMOD_3 + + PFA_SLASHMODmod_done: + ; put remainder on stack +00762b 92fa st -Y,temp5 +00762c 92ea st -Y,temp4 + + ; put quotient on stack +00762d 01c8 movw tosl, temp0 +00762e c9d6 jmp_ DO_NEXT + .include "words/uslashmod.asm" + + ; Arithmetics + ; unsigned division with remainder + VE_USLASHMOD: +00762f ff05 .dw $ff05 +007630 2f75 +007631 6f6d +007632 0064 .db "u/mod",0 +007633 75fc .dw VE_HEAD + .set VE_HEAD = VE_USLASHMOD + XT_USLASHMOD: +007634 7001 .dw DO_COLON + PFA_USLASHMOD: +007635 70ff .dw XT_TO_R +007636 7154 .dw XT_ZERO +007637 70f6 .dw XT_R_FROM +007638 71c2 .dw XT_UMSLASHMOD +007639 7020 .dw XT_EXIT + .include "words/negate.asm" + + ; Logic + ; 2-complement + VE_NEGATE: +00763a ff06 .dw $ff06 +00763b 656e +00763c 6167 +00763d 6574 .db "negate" +00763e 762f .dw VE_HEAD + .set VE_HEAD = VE_NEGATE + XT_NEGATE: +00763f 7001 .dw DO_COLON + PFA_NEGATE: +007640 71fd .dw XT_INVERT +007641 722f .dw XT_1PLUS +007642 7020 .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: +007643 ff01 .dw $ff01 +007644 002f .db "/",0 +007645 763a .dw VE_HEAD + .set VE_HEAD = VE_SLASH + XT_SLASH: +007646 7001 .dw DO_COLON + PFA_SLASH: + .endif +007647 7600 .dw XT_SLASHMOD +007648 70f0 .dw XT_NIP +007649 7020 .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: +00764a ff03 .dw $ff03 +00764b 6f6d +00764c 0064 .db "mod",0 +00764d 7643 .dw VE_HEAD + .set VE_HEAD = VE_MOD + XT_MOD: +00764e 7001 .dw DO_COLON + PFA_MOD: + .endif +00764f 7600 .dw XT_SLASHMOD +007650 70d9 .dw XT_DROP +007651 7020 .dw XT_EXIT + .include "words/abs.asm" + + ; DUP ?NEGATE ; + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_ABS: +007652 ff03 .dw $ff03 +007653 6261 +007654 0073 .db "abs",0 +007655 764a .dw VE_HEAD + .set VE_HEAD = VE_ABS + XT_ABS: +007656 7001 .dw DO_COLON + PFA_ABS: + + .endif + +007657 70b1 +007658 723e +007659 7020 .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: +00765a ff03 .dw $ff03 +00765b 696d +00765c 006e .db "min",0 +00765d 7652 .dw VE_HEAD + .set VE_HEAD = VE_MIN + XT_MIN: +00765e 7001 .dw DO_COLON + PFA_MIN: + .endif +00765f 7565 .dw XT_2DUP +007660 7178 .dw XT_GREATER +007661 7036 .dw XT_DOCONDBRANCH +007662 7664 DEST(PFA_MIN1) +007663 70c4 .dw XT_SWAP + PFA_MIN1: +007664 70d9 .dw XT_DROP +007665 7020 .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: +007666 ff03 .dw $ff03 +007667 616d +007668 0078 .db "max",0 +007669 765a .dw VE_HEAD + .set VE_HEAD = VE_MAX + XT_MAX: +00766a 7001 .dw DO_COLON + PFA_MAX: + + .endif +00766b 7565 .dw XT_2DUP +00766c 716e .dw XT_LESS +00766d 7036 .dw XT_DOCONDBRANCH +00766e 7670 DEST(PFA_MAX1) +00766f 70c4 .dw XT_SWAP + PFA_MAX1: +007670 70d9 .dw XT_DROP +007671 7020 .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: +007672 ff06 .dw $ff06 +007673 6977 +007674 6874 +007675 6e69 .db "within" +007676 7666 .dw VE_HEAD + .set VE_HEAD = VE_WITHIN + XT_WITHIN: +007677 7001 .dw DO_COLON + PFA_WITHIN: + .endif +007678 70cf .dw XT_OVER +007679 7193 .dw XT_MINUS +00767a 70ff .dw XT_TO_R +00767b 7193 .dw XT_MINUS +00767c 70f6 .dw XT_R_FROM +00767d 715c .dw XT_ULESS +00767e 7020 .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: +00767f ff07 .dw $ff07 +007680 6f74 +007681 7075 +007682 6570 +007683 0072 .db "toupper",0 +007684 7672 .dw VE_HEAD + .set VE_HEAD = VE_TOUPPER + XT_TOUPPER: +007685 7001 .dw DO_COLON + PFA_TOUPPER: + .endif +007686 70b1 .dw XT_DUP +007687 703d .dw XT_DOLITERAL +007688 0061 .dw 'a' +007689 703d .dw XT_DOLITERAL +00768a 007b .dw 'z'+1 +00768b 7677 .dw XT_WITHIN +00768c 7036 .dw XT_DOCONDBRANCH +00768d 7691 DEST(PFA_TOUPPER0) +00768e 703d .dw XT_DOLITERAL +00768f 00df .dw 223 ; inverse of 0x20: 0xdf +007690 7213 .dw XT_AND + PFA_TOUPPER0: +007691 7020 .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: +007692 ff07 .dw $ff07 +007693 6f74 +007694 6f6c +007695 6577 +007696 0072 .db "tolower",0 +007697 767f .dw VE_HEAD + .set VE_HEAD = VE_TOLOWER + XT_TOLOWER: +007698 7001 .dw DO_COLON + PFA_TOLOWER: + .endif +007699 70b1 .dw XT_DUP +00769a 703d .dw XT_DOLITERAL +00769b 0041 .dw 'A' +00769c 703d .dw XT_DOLITERAL +00769d 005b .dw 'Z'+1 +00769e 7677 .dw XT_WITHIN +00769f 7036 .dw XT_DOCONDBRANCH +0076a0 76a4 DEST(PFA_TOLOWER0) +0076a1 703d .dw XT_DOLITERAL +0076a2 0020 .dw 32 +0076a3 721c .dw XT_OR + PFA_TOLOWER0: +0076a4 7020 .dw XT_EXIT + ;;;;;;;;;;;;;;;;;;;;;; + .include "words/hld.asm" + + ; Numeric IO + ; pointer to current write position in the Pictured Numeric Output buffer + VE_HLD: +0076a5 ff03 .dw $ff03 +0076a6 6c68 +0076a7 0064 .db "hld",0 +0076a8 7692 .dw VE_HEAD + .set VE_HEAD = VE_HLD + XT_HLD: +0076a9 7048 .dw PFA_DOVARIABLE + PFA_HLD: +0076aa 0138 .dw ram_hld + + .dseg +000138 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: +0076ab ff04 .dw $ff04 +0076ac 6f68 +0076ad 646c .db "hold" +0076ae 76a5 .dw VE_HEAD + .set VE_HEAD = VE_HOLD + XT_HOLD: +0076af 7001 .dw DO_COLON + PFA_HOLD: + .endif +0076b0 76a9 .dw XT_HLD +0076b1 70b1 .dw XT_DUP +0076b2 7079 .dw XT_FETCH +0076b3 7235 .dw XT_1MINUS +0076b4 70b1 .dw XT_DUP +0076b5 70ff .dw XT_TO_R +0076b6 70c4 .dw XT_SWAP +0076b7 7081 .dw XT_STORE +0076b8 70f6 .dw XT_R_FROM +0076b9 708d .dw XT_CSTORE +0076ba 7020 .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: +0076bb ff02 .dw $ff02 +0076bc 233c .db "<#" +0076bd 76ab .dw VE_HEAD + .set VE_HEAD = VE_L_SHARP + XT_L_SHARP: +0076be 7001 .dw DO_COLON + PFA_L_SHARP: + .endif +0076bf 7584 .dw XT_PAD +0076c0 76a9 .dw XT_HLD +0076c1 7081 .dw XT_STORE +0076c2 7020 .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: +0076c3 ff01 .dw $ff01 +0076c4 0023 .db "#",0 +0076c5 76bb .dw VE_HEAD + .set VE_HEAD = VE_SHARP + XT_SHARP: +0076c6 7001 .dw DO_COLON + PFA_SHARP: + .endif +0076c7 7551 .dw XT_BASE +0076c8 7079 .dw XT_FETCH +0076c9 7743 .dw XT_UDSLASHMOD +0076ca 70e1 .dw XT_ROT +0076cb 703d .dw XT_DOLITERAL +0076cc 0009 .dw 9 +0076cd 70cf .dw XT_OVER +0076ce 716e .dw XT_LESS +0076cf 7036 .dw XT_DOCONDBRANCH +0076d0 76d4 DEST(PFA_SHARP1) +0076d1 703d .dw XT_DOLITERAL +0076d2 0007 .dw 7 +0076d3 719d .dw XT_PLUS + PFA_SHARP1: +0076d4 703d .dw XT_DOLITERAL +0076d5 0030 .dw 48 ; ASCII 0 +0076d6 719d .dw XT_PLUS +0076d7 76af .dw XT_HOLD +0076d8 7020 .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: +0076d9 ff02 .dw $ff02 +0076da 7323 .db "#s" +0076db 76c3 .dw VE_HEAD + .set VE_HEAD = VE_SHARP_S + XT_SHARP_S: +0076dc 7001 .dw DO_COLON + PFA_SHARP_S: + .endif + NUMS1: +0076dd 76c6 .dw XT_SHARP +0076de 7565 .dw XT_2DUP +0076df 721c .dw XT_OR +0076e0 711a .dw XT_ZEROEQUAL +0076e1 7036 .dw XT_DOCONDBRANCH +0076e2 76dd DEST(NUMS1) ; PFA_SHARP_S +0076e3 7020 .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: +0076e4 ff02 .dw $ff02 +0076e5 3e23 .db "#>" +0076e6 76d9 .dw VE_HEAD + .set VE_HEAD = VE_SHARP_G + XT_SHARP_G: +0076e7 7001 .dw DO_COLON + PFA_SHARP_G: + .endif +0076e8 756e .dw XT_2DROP +0076e9 76a9 .dw XT_HLD +0076ea 7079 .dw XT_FETCH +0076eb 7584 .dw XT_PAD +0076ec 70cf .dw XT_OVER +0076ed 7193 .dw XT_MINUS +0076ee 7020 .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: +0076ef ff04 .dw $ff04 +0076f0 6973 +0076f1 6e67 .db "sign" +0076f2 76e4 .dw VE_HEAD + .set VE_HEAD = VE_SIGN + XT_SIGN: +0076f3 7001 .dw DO_COLON + PFA_SIGN: + .endif +0076f4 7121 .dw XT_ZEROLESS +0076f5 7036 .dw XT_DOCONDBRANCH +0076f6 76fa DEST(PFA_SIGN1) +0076f7 703d .dw XT_DOLITERAL +0076f8 002d .dw 45 ; ascii - +0076f9 76af .dw XT_HOLD + PFA_SIGN1: +0076fa 7020 .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: +0076fb ff03 .dw $ff03 +0076fc 2e64 +0076fd 0072 .db "d.r",0 +0076fe 76ef .dw VE_HEAD + .set VE_HEAD = VE_DDOTR + XT_DDOTR: +0076ff 7001 .dw DO_COLON + PFA_DDOTR: + + .endif +007700 70ff .dw XT_TO_R +007701 7576 .dw XT_TUCK +007702 7cd4 .dw XT_DABS +007703 76be .dw XT_L_SHARP +007704 76dc .dw XT_SHARP_S +007705 70e1 .dw XT_ROT +007706 76f3 .dw XT_SIGN +007707 76e7 .dw XT_SHARP_G +007708 70f6 .dw XT_R_FROM +007709 70cf .dw XT_OVER +00770a 7193 .dw XT_MINUS +00770b 77eb .dw XT_SPACES +00770c 77fb .dw XT_TYPE +00770d 7020 .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: +00770e ff02 .dw $ff02 +00770f 722e .db ".r" +007710 76fb .dw VE_HEAD + .set VE_HEAD = VE_DOTR + XT_DOTR: +007711 7001 .dw DO_COLON + PFA_DOTR: + + .endif +007712 70ff .dw XT_TO_R +007713 7d67 .dw XT_S2D +007714 70f6 .dw XT_R_FROM +007715 76ff .dw XT_DDOTR +007716 7020 .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: +007717 ff02 .dw $ff02 +007718 2e64 .db "d." +007719 770e .dw VE_HEAD + .set VE_HEAD = VE_DDOT + XT_DDOT: +00771a 7001 .dw DO_COLON + PFA_DDOT: + + .endif +00771b 7154 .dw XT_ZERO +00771c 76ff .dw XT_DDOTR +00771d 77e2 .dw XT_SPACE +00771e 7020 .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: +00771f ff01 .dw $ff01 +007720 002e .db ".",0 +007721 7717 .dw VE_HEAD + .set VE_HEAD = VE_DOT + XT_DOT: +007722 7001 .dw DO_COLON + PFA_DOT: + .endif +007723 7d67 .dw XT_S2D +007724 771a .dw XT_DDOT +007725 7020 .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: +007726 ff03 .dw $ff03 +007727 6475 +007728 002e .db "ud.",0 +007729 771f .dw VE_HEAD + .set VE_HEAD = VE_UDDOT + XT_UDDOT: +00772a 7001 .dw DO_COLON + PFA_UDDOT: + .endif +00772b 7154 .dw XT_ZERO +00772c 7733 .dw XT_UDDOTR +00772d 77e2 .dw XT_SPACE +00772e 7020 .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: +00772f ff04 .dw $ff04 +007730 6475 +007731 722e .db "ud.r" +007732 7726 .dw VE_HEAD + .set VE_HEAD = VE_UDDOTR + XT_UDDOTR: +007733 7001 .dw DO_COLON + PFA_UDDOTR: + .endif +007734 70ff .dw XT_TO_R +007735 76be .dw XT_L_SHARP +007736 76dc .dw XT_SHARP_S +007737 76e7 .dw XT_SHARP_G +007738 70f6 .dw XT_R_FROM +007739 70cf .dw XT_OVER +00773a 7193 .dw XT_MINUS +00773b 77eb .dw XT_SPACES +00773c 77fb .dw XT_TYPE +00773d 7020 .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: +00773e ff06 .dw $ff06 +00773f 6475 +007740 6d2f +007741 646f .db "ud/mod" +007742 772f .dw VE_HEAD + .set VE_HEAD = VE_UDSLASHMOD + XT_UDSLASHMOD: +007743 7001 .dw DO_COLON + PFA_UDSLASHMOD: + .endif +007744 70ff .dw XT_TO_R +007745 7154 .dw XT_ZERO +007746 7108 .dw XT_R_FETCH +007747 71c2 .dw XT_UMSLASHMOD +007748 70f6 .dw XT_R_FROM +007749 70c4 .dw XT_SWAP +00774a 70ff .dw XT_TO_R +00774b 71c2 .dw XT_UMSLASHMOD +00774c 70f6 .dw XT_R_FROM +00774d 7020 .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: +00774e ff06 .dw $ff06 +00774f 6964 +007750 6967 +007751 3f74 .db "digit?" +007752 773e .dw VE_HEAD + .set VE_HEAD = VE_DIGITQ + XT_DIGITQ: +007753 7001 .dw DO_COLON + PFA_DIGITQ: + .endif +007754 7685 .dw XT_TOUPPER +007755 70b1 +007756 703d +007757 0039 +007758 7178 +007759 703d +00775a 0100 .DW XT_DUP,XT_DOLITERAL,57,XT_GREATER,XT_DOLITERAL,256 +00775b 7213 +00775c 719d +00775d 70b1 +00775e 703d +00775f 0140 +007760 7178 .DW XT_AND,XT_PLUS,XT_DUP,XT_DOLITERAL,320,XT_GREATER +007761 703d +007762 0107 +007763 7213 +007764 7193 +007765 703d +007766 0030 .DW XT_DOLITERAL,263,XT_AND,XT_MINUS,XT_DOLITERAL,48 +007767 7193 +007768 70b1 +007769 7551 +00776a 7079 +00776b 715c .DW XT_MINUS,XT_DUP,XT_BASE,XT_FETCH,XT_ULESS +00776c 7020 .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: +00776d 7001 .dw DO_COLON + PFA_DOSLITERAL: +00776e 7108 .dw XT_R_FETCH ; ( -- addr ) +00776f 77cc .dw XT_ICOUNT +007770 70f6 .dw XT_R_FROM +007771 70cf .dw XT_OVER ; ( -- addr' n addr n) +007772 722f .dw XT_1PLUS +007773 7204 .dw XT_2SLASH ; ( -- addr' n addr k ) +007774 719d .dw XT_PLUS ; ( -- addr' n addr'' ) +007775 722f .dw XT_1PLUS +007776 70ff .dw XT_TO_R ; ( -- ) +007777 7020 .dw XT_EXIT + .include "words/scomma.asm" + + ; Compiler + ; compiles a string from RAM to Flash + VE_SCOMMA: +007778 ff02 .dw $ff02 +007779 2c73 .db "s",$2c +00777a 774e .dw VE_HEAD + .set VE_HEAD = VE_SCOMMA + XT_SCOMMA: +00777b 7001 .dw DO_COLON + PFA_SCOMMA: +00777c 70b1 .dw XT_DUP +00777d 777f .dw XT_DOSCOMMA +00777e 7020 .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: +00777f 7001 .dw DO_COLON + PFA_DOSCOMMA: +007780 01cc .dw XT_COMMA +007781 70b1 .dw XT_DUP ; ( --addr len len) +007782 7204 .dw XT_2SLASH ; ( -- addr len len/2 +007783 7576 .dw XT_TUCK ; ( -- addr len/2 len len/2 +007784 720b .dw XT_2STAR ; ( -- addr len/2 len len' +007785 7193 .dw XT_MINUS ; ( -- addr len/2 rem +007786 70ff .dw XT_TO_R +007787 7154 .dw XT_ZERO +007788 028b .dw XT_QDOCHECK +007789 7036 .dw XT_DOCONDBRANCH +00778a 7792 .dw PFA_SCOMMA2 +00778b 729b .dw XT_DODO + PFA_SCOMMA1: +00778c 70b1 .dw XT_DUP ; ( -- addr addr ) +00778d 7079 .dw XT_FETCH ; ( -- addr c1c2 ) +00778e 01cc .dw XT_COMMA ; ( -- addr ) +00778f 755e .dw XT_CELLPLUS ; ( -- addr+cell ) +007790 72c9 .dw XT_DOLOOP +007791 778c .dw PFA_SCOMMA1 + PFA_SCOMMA2: +007792 70f6 .dw XT_R_FROM +007793 7128 .dw XT_GREATERZERO +007794 7036 .dw XT_DOCONDBRANCH +007795 7799 .dw PFA_SCOMMA3 +007796 70b1 .dw XT_DUP ; well, tricky +007797 7098 .dw XT_CFETCH +007798 01cc .dw XT_COMMA + PFA_SCOMMA3: +007799 70d9 .dw XT_DROP ; ( -- ) +00779a 7020 .dw XT_EXIT + .include "words/itype.asm" + + ; Tools + ; reads string from flash and prints it + VE_ITYPE: +00779b ff05 .dw $ff05 +00779c 7469 +00779d 7079 +00779e 0065 .db "itype",0 +00779f 7778 .dw VE_HEAD + .set VE_HEAD = VE_ITYPE + XT_ITYPE: +0077a0 7001 .dw DO_COLON + PFA_ITYPE: +0077a1 70b1 .dw XT_DUP ; ( --addr len len) +0077a2 7204 .dw XT_2SLASH ; ( -- addr len len/2 +0077a3 7576 .dw XT_TUCK ; ( -- addr len/2 len len/2 +0077a4 720b .dw XT_2STAR ; ( -- addr len/2 len len' +0077a5 7193 .dw XT_MINUS ; ( -- addr len/2 rem +0077a6 70ff .dw XT_TO_R +0077a7 7154 .dw XT_ZERO +0077a8 028b .dw XT_QDOCHECK +0077a9 7036 .dw XT_DOCONDBRANCH +0077aa 77b4 .dw PFA_ITYPE2 +0077ab 729b .dw XT_DODO + PFA_ITYPE1: +0077ac 70b1 .dw XT_DUP ; ( -- addr addr ) +0077ad 73cb .dw XT_FETCHI ; ( -- addr c1c2 ) +0077ae 70b1 .dw XT_DUP +0077af 77c1 .dw XT_LOWEMIT +0077b0 77bd .dw XT_HIEMIT +0077b1 722f .dw XT_1PLUS ; ( -- addr+cell ) +0077b2 72c9 .dw XT_DOLOOP +0077b3 77ac .dw PFA_ITYPE1 + PFA_ITYPE2: +0077b4 70f6 .dw XT_R_FROM +0077b5 7128 .dw XT_GREATERZERO +0077b6 7036 .dw XT_DOCONDBRANCH +0077b7 77bb .dw PFA_ITYPE3 +0077b8 70b1 .dw XT_DUP ; make sure the drop below has always something to do +0077b9 73cb .dw XT_FETCHI +0077ba 77c1 .dw XT_LOWEMIT + PFA_ITYPE3: +0077bb 70d9 .dw XT_DROP +0077bc 7020 .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: +0077bd 7001 .dw DO_COLON + PFA_HIEMIT: +0077be 72f9 .dw XT_BYTESWAP +0077bf 77c1 .dw XT_LOWEMIT +0077c0 7020 .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: +0077c1 7001 .dw DO_COLON + PFA_LOWEMIT: +0077c2 703d .dw XT_DOLITERAL +0077c3 00ff .dw $00ff +0077c4 7213 .dw XT_AND +0077c5 758e .dw XT_EMIT +0077c6 7020 .dw XT_EXIT + .include "words/icount.asm" + + ; Tools + ; get count information out of a counted string in flash + VE_ICOUNT: +0077c7 ff06 .dw $ff06 +0077c8 6369 +0077c9 756f +0077ca 746e .db "icount" +0077cb 779b .dw VE_HEAD + .set VE_HEAD = VE_ICOUNT + XT_ICOUNT: +0077cc 7001 .dw DO_COLON + PFA_ICOUNT: +0077cd 70b1 .dw XT_DUP +0077ce 722f .dw XT_1PLUS +0077cf 70c4 .dw XT_SWAP +0077d0 73cb .dw XT_FETCHI +0077d1 7020 .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: +0077d2 ff02 .dw 0xff02 +0077d3 7263 .db "cr" +0077d4 77c7 .dw VE_HEAD + .set VE_HEAD = VE_CR + XT_CR: +0077d5 7001 .dw DO_COLON + PFA_CR: + .endif + +0077d6 703d .dw XT_DOLITERAL +0077d7 000d .dw 13 +0077d8 758e .dw XT_EMIT +0077d9 703d .dw XT_DOLITERAL +0077da 000a .dw 10 +0077db 758e .dw XT_EMIT +0077dc 7020 .dw XT_EXIT + .include "words/space.asm" + + ; Character IO + ; emits a space (bl) + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_SPACE: +0077dd ff05 .dw $ff05 +0077de 7073 +0077df 6361 +0077e0 0065 .db "space",0 +0077e1 77d2 .dw VE_HEAD + .set VE_HEAD = VE_SPACE + XT_SPACE: +0077e2 7001 .dw DO_COLON + PFA_SPACE: + .endif +0077e3 75f0 .dw XT_BL +0077e4 758e .dw XT_EMIT +0077e5 7020 .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: +0077e6 ff06 .dw $ff06 +0077e7 7073 +0077e8 6361 +0077e9 7365 .db "spaces" +0077ea 77dd .dw VE_HEAD + .set VE_HEAD = VE_SPACES + XT_SPACES: +0077eb 7001 .dw DO_COLON + PFA_SPACES: + + .endif + ;C SPACES n -- output n spaces + ; BEGIN DUP 0> WHILE SPACE 1- REPEAT DROP ; +0077ec 7154 +0077ed 766a .DW XT_ZERO, XT_MAX +0077ee 70b1 +0077ef 7036 SPCS1: .DW XT_DUP,XT_DOCONDBRANCH +0077f0 77f5 DEST(SPCS2) +0077f1 77e2 +0077f2 7235 +0077f3 702f .DW XT_SPACE,XT_1MINUS,XT_DOBRANCH +0077f4 77ee DEST(SPCS1) +0077f5 70d9 +0077f6 7020 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: +0077f7 ff04 .dw $ff04 +0077f8 7974 +0077f9 6570 .db "type" +0077fa 77e6 .dw VE_HEAD + .set VE_HEAD = VE_TYPE + XT_TYPE: +0077fb 7001 .dw DO_COLON + PFA_TYPE: + + .endif +0077fc 7d5e .dw XT_BOUNDS +0077fd 028b .dw XT_QDOCHECK +0077fe 7036 .dw XT_DOCONDBRANCH +0077ff 7806 DEST(PFA_TYPE2) +007800 729b .dw XT_DODO + PFA_TYPE1: +007801 72ac .dw XT_I +007802 7098 .dw XT_CFETCH +007803 758e .dw XT_EMIT +007804 72c9 .dw XT_DOLOOP +007805 7801 DEST(PFA_TYPE1) + PFA_TYPE2: +007806 7020 .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: +007807 ff01 .dw $ff01 +007808 0027 .db "'",0 +007809 77f7 .dw VE_HEAD + .set VE_HEAD = VE_TICK + XT_TICK: +00780a 7001 .dw DO_COLON + PFA_TICK: + .endif +00780b 79b4 .dw XT_PARSENAME +00780c 7acc .dw XT_FORTHRECOGNIZER +00780d 7ad7 .dw XT_RECOGNIZE + ; a word is tickable unless DT:TOKEN is DT:NULL or + ; the interpret action is a NOOP +00780e 70b1 .dw XT_DUP +00780f 7b4a .dw XT_DT_NULL +007810 7d7f .dw XT_EQUAL +007811 70c4 .dw XT_SWAP +007812 73cb .dw XT_FETCHI +007813 703d .dw XT_DOLITERAL +007814 7b7f .dw XT_NOOP +007815 7d7f .dw XT_EQUAL +007816 721c .dw XT_OR +007817 7036 .dw XT_DOCONDBRANCH +007818 781c DEST(PFA_TICK1) +007819 703d .dw XT_DOLITERAL +00781a fff3 .dw -13 +00781b 7841 .dw XT_THROW + PFA_TICK1: +00781c 70d9 .dw XT_DROP +00781d 7020 .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: +00781e ff07 .dw $ff07 +00781f 6168 +007820 646e +007821 656c +007822 0072 .db "handler",0 +007823 7807 .dw VE_HEAD + .set VE_HEAD = VE_HANDLER + XT_HANDLER: +007824 7058 .dw PFA_DOUSER + PFA_HANDLER: + .endif +007825 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: +007826 ff05 .dw $ff05 +007827 6163 +007828 6374 +007829 0068 .db "catch",0 +00782a 781e .dw VE_HEAD + .set VE_HEAD = VE_CATCH + XT_CATCH: +00782b 7001 .dw DO_COLON + PFA_CATCH: + .endif + + ; sp@ >r +00782c 728d .dw XT_SP_FETCH +00782d 70ff .dw XT_TO_R + ; handler @ >r +00782e 7824 .dw XT_HANDLER +00782f 7079 .dw XT_FETCH +007830 70ff .dw XT_TO_R + ; rp@ handler ! +007831 7276 .dw XT_RP_FETCH +007832 7824 .dw XT_HANDLER +007833 7081 .dw XT_STORE +007834 702a .dw XT_EXECUTE + ; r> handler ! +007835 70f6 .dw XT_R_FROM +007836 7824 .dw XT_HANDLER +007837 7081 .dw XT_STORE +007838 70f6 .dw XT_R_FROM +007839 70d9 .dw XT_DROP +00783a 7154 .dw XT_ZERO +00783b 7020 .dw XT_EXIT + .include "words/throw.asm" + + ; Exceptions + ; throw an exception + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_THROW: +00783c ff05 .dw $ff05 +00783d 6874 +00783e 6f72 +00783f 0077 .db "throw",0 +007840 7826 .dw VE_HEAD + .set VE_HEAD = VE_THROW + XT_THROW: +007841 7001 .dw DO_COLON + PFA_THROW: + .endif +007842 70b1 .dw XT_DUP +007843 711a .dw XT_ZEROEQUAL +007844 7036 .dw XT_DOCONDBRANCH +007845 7848 DEST(PFA_THROW1) +007846 70d9 .dw XT_DROP +007847 7020 .dw XT_EXIT + PFA_THROW1: +007848 7824 .dw XT_HANDLER +007849 7079 .dw XT_FETCH +00784a 7280 .dw XT_RP_STORE +00784b 70f6 .dw XT_R_FROM +00784c 7824 .dw XT_HANDLER +00784d 7081 .dw XT_STORE +00784e 70f6 .dw XT_R_FROM +00784f 70c4 .dw XT_SWAP +007850 70ff .dw XT_TO_R +007851 7296 .dw XT_SP_STORE +007852 70d9 .dw XT_DROP +007853 70f6 .dw XT_R_FROM +007854 7020 .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: +007855 ff05 .dw $ff05 +007856 7363 +007857 696b +007858 0070 .db "cskip",0 +007859 783c .dw VE_HEAD + .set VE_HEAD = VE_CSKIP + XT_CSKIP: +00785a 7001 .dw DO_COLON + PFA_CSKIP: + .endif +00785b 70ff .dw XT_TO_R ; ( -- addr1 n1 ) + PFA_CSKIP1: +00785c 70b1 .dw XT_DUP ; ( -- addr' n' n' ) +00785d 7036 .dw XT_DOCONDBRANCH ; ( -- addr' n') +00785e 7869 DEST(PFA_CSKIP2) +00785f 70cf .dw XT_OVER ; ( -- addr' n' addr' ) +007860 7098 .dw XT_CFETCH ; ( -- addr' n' c' ) +007861 7108 .dw XT_R_FETCH ; ( -- addr' n' c' c ) +007862 7d7f .dw XT_EQUAL ; ( -- addr' n' f ) +007863 7036 .dw XT_DOCONDBRANCH ; ( -- addr' n') +007864 7869 DEST(PFA_CSKIP2) +007865 7d86 .dw XT_ONE +007866 79a5 .dw XT_SLASHSTRING +007867 702f .dw XT_DOBRANCH +007868 785c DEST(PFA_CSKIP1) + PFA_CSKIP2: +007869 70f6 .dw XT_R_FROM +00786a 70d9 .dw XT_DROP ; ( -- addr2 n2) +00786b 7020 .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: +00786c ff05 .dw $ff05 +00786d 7363 +00786e 6163 +../../common\words/cscan.asm(12): warning: .cseg .db misalignment - padding zero byte +00786f 006e .db "cscan" +007870 7855 .dw VE_HEAD + .set VE_HEAD = VE_CSCAN + XT_CSCAN: +007871 7001 .dw DO_COLON + PFA_CSCAN: + .endif +007872 70ff .dw XT_TO_R +007873 70cf .dw XT_OVER + PFA_CSCAN1: +007874 70b1 .dw XT_DUP +007875 7098 .dw XT_CFETCH +007876 7108 .dw XT_R_FETCH +007877 7d7f .dw XT_EQUAL +007878 711a .dw XT_ZEROEQUAL +007879 7036 .dw XT_DOCONDBRANCH +00787a 7886 DEST(PFA_CSCAN2) +00787b 70c4 .dw XT_SWAP +00787c 7235 .dw XT_1MINUS +00787d 70c4 .dw XT_SWAP +00787e 70cf .dw XT_OVER +00787f 7121 .dw XT_ZEROLESS ; not negative +007880 711a .dw XT_ZEROEQUAL +007881 7036 .dw XT_DOCONDBRANCH +007882 7886 DEST(PFA_CSCAN2) +007883 722f .dw XT_1PLUS +007884 702f .dw XT_DOBRANCH +007885 7874 DEST(PFA_CSCAN1) + PFA_CSCAN2: +007886 70f0 .dw XT_NIP +007887 70cf .dw XT_OVER +007888 7193 .dw XT_MINUS +007889 70f6 .dw XT_R_FROM +00788a 70d9 .dw XT_DROP +00788b 7020 .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: +00788c ff06 .dw $ff06 +00788d 6361 +00788e 6563 +00788f 7470 .db "accept" +007890 786c .dw VE_HEAD + .set VE_HEAD = VE_ACCEPT + XT_ACCEPT: +007891 7001 .dw DO_COLON + PFA_ACCEPT: + + .endif +007892 70cf +007893 719d +007894 7235 +007895 70cf .DW XT_OVER,XT_PLUS,XT_1MINUS,XT_OVER +007896 759f +007897 70b1 +007898 78d2 +007899 711a +00789a 7036 ACC1: .DW XT_KEY,XT_DUP,XT_CRLFQ,XT_ZEROEQUAL,XT_DOCONDBRANCH +00789b 78c4 DEST(ACC5) +00789c 70b1 +00789d 703d +00789e 0008 +00789f 7d7f +0078a0 7036 .DW XT_DUP,XT_DOLITERAL,8,XT_EQUAL,XT_DOCONDBRANCH +0078a1 78b4 DEST(ACC3) +0078a2 70d9 +0078a3 70e1 +0078a4 7565 +0078a5 7178 +0078a6 70ff +0078a7 70e1 +0078a8 70e1 +0078a9 70f6 +0078aa 7036 .DW XT_DROP,XT_ROT,XT_2DUP,XT_GREATER,XT_TO_R,XT_ROT,XT_ROT,XT_R_FROM,XT_DOCONDBRANCH +0078ab 78b2 DEST(ACC6) +0078ac 78ca +0078ad 7235 +0078ae 70ff +0078af 70cf +0078b0 70f6 +0078b1 015e .DW XT_BS,XT_1MINUS,XT_TO_R,XT_OVER,XT_R_FROM,XT_UMAX +0078b2 702f ACC6: .DW XT_DOBRANCH +0078b3 78c2 DEST(ACC4) + + + ACC3: ; check for remaining control characters, replace them with blank +0078b4 70b1 .dw XT_DUP ; ( -- addr k k ) +0078b5 75f0 .dw XT_BL +0078b6 716e .dw XT_LESS +0078b7 7036 .dw XT_DOCONDBRANCH +0078b8 78bb DEST(PFA_ACCEPT6) +0078b9 70d9 .dw XT_DROP +0078ba 75f0 .dw XT_BL + PFA_ACCEPT6: +0078bb 70b1 +0078bc 758e +0078bd 70cf +0078be 708d +0078bf 722f +0078c0 70cf +0078c1 016a .DW XT_DUP,XT_EMIT,XT_OVER,XT_CSTORE,XT_1PLUS,XT_OVER,XT_UMIN +0078c2 702f ACC4: .DW XT_DOBRANCH +0078c3 7896 DEST(ACC1) +0078c4 70d9 +0078c5 70f0 +0078c6 70c4 +0078c7 7193 +0078c8 77d5 +0078c9 7020 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: +0078ca 7001 .dw DO_COLON + .endif +0078cb 703d .dw XT_DOLITERAL +0078cc 0008 .dw 8 +0078cd 70b1 .dw XT_DUP +0078ce 758e .dw XT_EMIT +0078cf 77e2 .dw XT_SPACE +0078d0 758e .dw XT_EMIT +0078d1 7020 .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: +0078d2 7001 .dw DO_COLON + .endif +0078d3 70b1 .dw XT_DUP +0078d4 703d .dw XT_DOLITERAL +0078d5 000d .dw 13 +0078d6 7d7f .dw XT_EQUAL +0078d7 70c4 .dw XT_SWAP +0078d8 703d .dw XT_DOLITERAL +0078d9 000a .dw 10 +0078da 7d7f .dw XT_EQUAL +0078db 721c .dw XT_OR +0078dc 7020 .dw XT_EXIT + .include "words/refill.asm" + + ; System + ; refills the input buffer + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_REFILL: +0078dd ff06 .dw $ff06 +0078de 6572 +0078df 6966 +0078e0 6c6c .db "refill" +0078e1 788c .dw VE_HEAD + .set VE_HEAD = VE_REFILL + XT_REFILL: +0078e2 7c13 .dw PFA_DODEFER1 + PFA_REFILL: + .endif +0078e3 001a .dw USER_REFILL +0078e4 7bdc .dw XT_UDEFERFETCH +0078e5 7be8 .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: +0078e6 ff04 .dw $ff04 +0078e7 6863 +0078e8 7261 .db "char" +0078e9 78dd .dw VE_HEAD + .set VE_HEAD = VE_CHAR + XT_CHAR: +0078ea 7001 .dw DO_COLON + PFA_CHAR: + .endif +0078eb 79b4 .dw XT_PARSENAME +0078ec 70d9 .dw XT_DROP +0078ed 7098 .dw XT_CFETCH +0078ee 7020 .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: +0078ef ff06 .dw $ff06 +0078f0 756e +0078f1 626d +0078f2 7265 .db "number" +0078f3 78e6 .dw VE_HEAD + .set VE_HEAD = VE_NUMBER + XT_NUMBER: +0078f4 7001 .dw DO_COLON + PFA_NUMBER: + .endif +0078f5 7551 .dw XT_BASE +0078f6 7079 .dw XT_FETCH +0078f7 70ff .dw XT_TO_R +0078f8 7938 .dw XT_QSIGN +0078f9 70ff .dw XT_TO_R +0078fa 794b .dw XT_SET_BASE +0078fb 7938 .dw XT_QSIGN +0078fc 70f6 .dw XT_R_FROM +0078fd 721c .dw XT_OR +0078fe 70ff .dw XT_TO_R + ; check whether something is left +0078ff 70b1 .dw XT_DUP +007900 711a .dw XT_ZEROEQUAL +007901 7036 .dw XT_DOCONDBRANCH +007902 790b DEST(PFA_NUMBER0) + ; nothing is left. It cannot be a number at all +007903 756e .dw XT_2DROP +007904 70f6 .dw XT_R_FROM +007905 70d9 .dw XT_DROP +007906 70f6 .dw XT_R_FROM +007907 7551 .dw XT_BASE +007908 7081 .dw XT_STORE +007909 7154 .dw XT_ZERO +00790a 7020 .dw XT_EXIT + PFA_NUMBER0: +00790b 731e .dw XT_2TO_R +00790c 7154 .dw XT_ZERO ; starting value +00790d 7154 .dw XT_ZERO +00790e 732d .dw XT_2R_FROM +00790f 7969 .dw XT_TO_NUMBER ; ( 0. addr len -- d addr' len' + ; check length of the remaining string. + ; if zero: a single cell number is entered +007910 70b9 .dw XT_QDUP +007911 7036 .dw XT_DOCONDBRANCH +007912 792d DEST(PFA_NUMBER1) + ; if equal 1: mayba a trailing dot? --> double cell number +007913 7d86 .dw XT_ONE +007914 7d7f .dw XT_EQUAL +007915 7036 .dw XT_DOCONDBRANCH +007916 7924 DEST(PFA_NUMBER2) + ; excatly one character is left +007917 7098 .dw XT_CFETCH +007918 703d .dw XT_DOLITERAL +007919 002e .dw 46 ; . +00791a 7d7f .dw XT_EQUAL +00791b 7036 .dw XT_DOCONDBRANCH +00791c 7925 DEST(PFA_NUMBER6) + ; its a double cell number + ; incorporate sign into number +00791d 70f6 .dw XT_R_FROM +00791e 7036 .dw XT_DOCONDBRANCH +00791f 7921 DEST(PFA_NUMBER3) +007920 7ce1 .dw XT_DNEGATE + PFA_NUMBER3: +007921 7d8b .dw XT_TWO +007922 702f .dw XT_DOBRANCH +007923 7933 DEST(PFA_NUMBER5) + PFA_NUMBER2: +007924 70d9 .dw XT_DROP + PFA_NUMBER6: +007925 756e .dw XT_2DROP +007926 70f6 .dw XT_R_FROM +007927 70d9 .dw XT_DROP +007928 70f6 .dw XT_R_FROM +007929 7551 .dw XT_BASE +00792a 7081 .dw XT_STORE +00792b 7154 .dw XT_ZERO +00792c 7020 .dw XT_EXIT + PFA_NUMBER1: +00792d 756e .dw XT_2DROP ; remove the address + ; incorporate sign into number +00792e 70f6 .dw XT_R_FROM +00792f 7036 .dw XT_DOCONDBRANCH +007930 7932 DEST(PFA_NUMBER4) +007931 763f .dw XT_NEGATE + PFA_NUMBER4: +007932 7d86 .dw XT_ONE + PFA_NUMBER5: +007933 70f6 .dw XT_R_FROM +007934 7551 .dw XT_BASE +007935 7081 .dw XT_STORE +007936 714b .dw XT_TRUE +007937 7020 .dw XT_EXIT + .include "words/q-sign.asm" + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + XT_QSIGN: +007938 7001 .dw DO_COLON + PFA_QSIGN: ; ( c -- ) + .endif +007939 70cf .dw XT_OVER ; ( -- addr len addr ) +00793a 7098 .dw XT_CFETCH +00793b 703d .dw XT_DOLITERAL +00793c 002d .dw '-' +00793d 7d7f .dw XT_EQUAL ; ( -- addr len flag ) +00793e 70b1 .dw XT_DUP +00793f 70ff .dw XT_TO_R +007940 7036 .dw XT_DOCONDBRANCH +007941 7944 DEST(PFA_NUMBERSIGN_DONE) +007942 7d86 .dw XT_ONE ; skip sign character +007943 79a5 .dw XT_SLASHSTRING + PFA_NUMBERSIGN_DONE: +007944 70f6 .dw XT_R_FROM +007945 7020 .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: +007946 7052 .dw PFA_DOCONSTANT + .endif +007947 000a +007948 0010 +007949 0002 +00794a 000a .dw 10,16,2,10 ; last one could a 8 instead. + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + XT_SET_BASE: +00794b 7001 .dw DO_COLON + PFA_SET_BASE: ; ( adr1 len1 -- adr2 len2 ) + .endif +00794c 70cf .dw XT_OVER +00794d 7098 .dw XT_CFETCH +00794e 703d .dw XT_DOLITERAL +00794f 0023 .dw 35 +007950 7193 .dw XT_MINUS +007951 70b1 .dw XT_DUP +007952 7154 .dw XT_ZERO +007953 703d .dw XT_DOLITERAL +007954 0004 .dw 4 +007955 7677 .dw XT_WITHIN +007956 7036 .dw XT_DOCONDBRANCH +007957 7961 DEST(SET_BASE1) + .if cpu_msp430==1 + .endif +007958 7946 .dw XT_BASES +007959 719d .dw XT_PLUS +00795a 73cb .dw XT_FETCHI +00795b 7551 .dw XT_BASE +00795c 7081 .dw XT_STORE +00795d 7d86 .dw XT_ONE +00795e 79a5 .dw XT_SLASHSTRING +00795f 702f .dw XT_DOBRANCH +007960 7962 DEST(SET_BASE2) + SET_BASE1: +007961 70d9 .dw XT_DROP + SET_BASE2: +007962 7020 .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: +007963 ff07 .dw $ff07 +007964 6e3e +007965 6d75 +007966 6562 +007967 0072 .db ">number",0 +007968 78ef .dw VE_HEAD + .set VE_HEAD = VE_TO_NUMBER + XT_TO_NUMBER: +007969 7001 .dw DO_COLON + + .endif + +00796a 70b1 +00796b 7036 TONUM1: .DW XT_DUP,XT_DOCONDBRANCH +00796c 7981 DEST(TONUM3) +00796d 70cf +00796e 7098 +00796f 7753 .DW XT_OVER,XT_CFETCH,XT_DIGITQ +007970 711a +007971 7036 .DW XT_ZEROEQUAL,XT_DOCONDBRANCH +007972 7975 DEST(TONUM2) +007973 70d9 +007974 7020 .DW XT_DROP,XT_EXIT +007975 70ff +007976 7d05 +007977 7551 +007978 7079 +007979 014f TONUM2: .DW XT_TO_R,XT_2SWAP,XT_BASE,XT_FETCH,XT_UDSTAR +00797a 70f6 +00797b 0147 +00797c 7d05 .DW XT_R_FROM,XT_MPLUS,XT_2SWAP +00797d 7d86 +00797e 79a5 +00797f 702f .DW XT_ONE,XT_SLASHSTRING,XT_DOBRANCH +007980 796a DEST(TONUM1) +007981 7020 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: +007982 ff05 .dw $ff05 +007983 6170 +007984 7372 +007985 0065 .db "parse",0 +007986 7963 .dw VE_HEAD + .set VE_HEAD = VE_PARSE + XT_PARSE: +007987 7001 .dw DO_COLON + PFA_PARSE: + .endif +007988 70ff .dw XT_TO_R ; ( -- ) +007989 799b .dw XT_SOURCE ; ( -- addr len) +00798a 757e .dw XT_TO_IN ; ( -- addr len >in) +00798b 7079 .dw XT_FETCH +00798c 79a5 .dw XT_SLASHSTRING ; ( -- addr' len' ) + +00798d 70f6 .dw XT_R_FROM ; ( -- addr' len' c) +00798e 7871 .dw XT_CSCAN ; ( -- addr' len'') +00798f 70b1 .dw XT_DUP ; ( -- addr' len'' len'') +007990 722f .dw XT_1PLUS +007991 757e .dw XT_TO_IN ; ( -- addr' len'' len'' >in) +007992 7265 .dw XT_PLUSSTORE ; ( -- addr' len') +007993 7d86 .dw XT_ONE +007994 79a5 .dw XT_SLASHSTRING +007995 7020 .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: +007996 ff06 .dw $FF06 +007997 6f73 +007998 7275 +007999 6563 .db "source" +00799a 7982 .dw VE_HEAD + .set VE_HEAD = VE_SOURCE + XT_SOURCE: +00799b 7c13 .dw PFA_DODEFER1 + PFA_SOURCE: + .endif +00799c 0016 .dw USER_SOURCE +00799d 7bdc .dw XT_UDEFERFETCH +00799e 7be8 .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: +00799f ff07 .dw $ff07 +0079a0 732f +0079a1 7274 +0079a2 6e69 +0079a3 0067 .db "/string",0 +0079a4 7996 .dw VE_HEAD + .set VE_HEAD = VE_SLASHSTRING + XT_SLASHSTRING: +0079a5 7001 .dw DO_COLON + PFA_SLASHSTRING: + .endif +0079a6 70e1 .dw XT_ROT +0079a7 70cf .dw XT_OVER +0079a8 719d .dw XT_PLUS +0079a9 70e1 .dw XT_ROT +0079aa 70e1 .dw XT_ROT +0079ab 7193 .dw XT_MINUS +0079ac 7020 .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: +0079ad ff0a .dw $FF0A +0079ae 6170 +0079af 7372 +0079b0 2d65 +0079b1 616e +0079b2 656d .db "parse-name" +0079b3 799f .dw VE_HEAD + .set VE_HEAD = VE_PARSENAME + XT_PARSENAME: +0079b4 7001 .dw DO_COLON + PFA_PARSENAME: + .endif +0079b5 75f0 .dw XT_BL +0079b6 79b8 .dw XT_SKIPSCANCHAR +0079b7 7020 .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: +0079b8 7001 .dw DO_COLON + PFA_SKIPSCANCHAR: + .endif +0079b9 70ff .dw XT_TO_R +0079ba 799b .dw XT_SOURCE +0079bb 757e .dw XT_TO_IN +0079bc 7079 .dw XT_FETCH +0079bd 79a5 .dw XT_SLASHSTRING + +0079be 7108 .dw XT_R_FETCH +0079bf 785a .dw XT_CSKIP +0079c0 70f6 .dw XT_R_FROM +0079c1 7871 .dw XT_CSCAN + + ; adjust >IN +0079c2 7565 .dw XT_2DUP +0079c3 719d .dw XT_PLUS +0079c4 799b .dw XT_SOURCE +0079c5 70d9 .dw XT_DROP +0079c6 7193 .dw XT_MINUS +0079c7 757e .dw XT_TO_IN +0079c8 7081 .dw XT_STORE +0079c9 7020 .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: +0079ca ff07 .dw $ff07 +0079cb 6966 +0079cc 646e +0079cd 782d +0079ce 0074 .db "find-xt",0 +0079cf 79ad .dw VE_HEAD + .set VE_HEAD = VE_FINDXT + XT_FINDXT: +0079d0 7001 .dw DO_COLON + PFA_FINDXT: + .endif +0079d1 703d .dw XT_DOLITERAL +0079d2 79dc .dw XT_FINDXTA +0079d3 703d .dw XT_DOLITERAL +0079d4 004e .dw CFG_ORDERLISTLEN +0079d5 040c .dw XT_MAPSTACK +0079d6 711a .dw XT_ZEROEQUAL +0079d7 7036 .dw XT_DOCONDBRANCH +0079d8 79db DEST(PFA_FINDXT1) +0079d9 756e .dw XT_2DROP +0079da 7154 .dw XT_ZERO + PFA_FINDXT1: +0079db 7020 .dw XT_EXIT + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + + XT_FINDXTA: +0079dc 7001 .dw DO_COLON + PFA_FINDXTA: + .endif +0079dd 70ff .dw XT_TO_R +0079de 7565 .dw XT_2DUP +0079df 70f6 .dw XT_R_FROM +0079e0 7c25 .dw XT_SEARCH_WORDLIST +0079e1 70b1 .dw XT_DUP +0079e2 7036 .dw XT_DOCONDBRANCH +0079e3 79e9 DEST(PFA_FINDXTA1) +0079e4 70ff .dw XT_TO_R +0079e5 70f0 .dw XT_NIP +0079e6 70f0 .dw XT_NIP +0079e7 70f6 .dw XT_R_FROM +0079e8 714b .dw XT_TRUE + PFA_FINDXTA1: +0079e9 7020 .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: +0079ea 7001 .dw DO_COLON + PFA_DEFAULT_PROMPTOK: +0079eb 776d .dw XT_DOSLITERAL +0079ec 0003 .dw 3 +0079ed 6f20 +0079ee 006b .db " ok",0 + .endif +0079ef 77a0 .dw XT_ITYPE +0079f0 7020 .dw XT_EXIT + + ; ------------------------ + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_PROMPTOK: +0079f1 ff03 .dw $FF03 +0079f2 6f2e +../../common\words/prompt-ok.asm(43): warning: .cseg .db misalignment - padding zero byte +0079f3 006b .db ".ok" +0079f4 79ca .dw VE_HEAD + .set VE_HEAD = VE_PROMPTOK + XT_PROMPTOK: +0079f5 7c13 .dw PFA_DODEFER1 + PFA_PROMPTOK: + .endif +0079f6 001c .dw USER_P_OK +0079f7 7bdc .dw XT_UDEFERFETCH +0079f8 7be8 .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: +0079f9 7001 .dw DO_COLON + PFA_DEFAULT_PROMPTREADY: +0079fa 776d .dw XT_DOSLITERAL +0079fb 0002 .dw 2 +0079fc 203e .db "> " + .endif +0079fd 77d5 .dw XT_CR +0079fe 77a0 .dw XT_ITYPE +0079ff 7020 .dw XT_EXIT + + ; ------------------------ + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_PROMPTREADY: +007a00 ff06 .dw $FF06 +007a01 722e +007a02 6165 +007a03 7964 .db ".ready" +007a04 79f1 .dw VE_HEAD + .set VE_HEAD = VE_PROMPTREADY + XT_PROMPTREADY: +007a05 7c13 .dw PFA_DODEFER1 + PFA_PROMPTREADY: + .endif +007a06 0020 .dw USER_P_RDY +007a07 7bdc .dw XT_UDEFERFETCH +007a08 7be8 .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: +007a09 7001 .dw DO_COLON + PFA_DEFAULT_PROMPTERROR: +007a0a 776d .dw XT_DOSLITERAL +007a0b 0004 .dw 4 +007a0c 3f20 +007a0d 203f .db " ?? " + .endif +007a0e 77a0 .dw XT_ITYPE +007a0f 7551 .dw XT_BASE +007a10 7079 .dw XT_FETCH +007a11 70ff .dw XT_TO_R +007a12 75dd .dw XT_DECIMAL +007a13 7722 .dw XT_DOT +007a14 757e .dw XT_TO_IN +007a15 7079 .dw XT_FETCH +007a16 7722 .dw XT_DOT +007a17 70f6 .dw XT_R_FROM +007a18 7551 .dw XT_BASE +007a19 7081 .dw XT_STORE +007a1a 7020 .dw XT_EXIT + + ; ------------------------ + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_PROMPTERROR: +007a1b ff06 .dw $FF06 +007a1c 652e +007a1d 7272 +007a1e 726f .db ".error" +007a1f 7a00 .dw VE_HEAD + .set VE_HEAD = VE_PROMPTERROR + XT_PROMPTERROR: +007a20 7c13 .dw PFA_DODEFER1 + PFA_PROMPTERROR: + .endif +007a21 001e .dw USER_P_ERR +007a22 7bdc .dw XT_UDEFERFETCH +007a23 7be8 .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: +007a24 ff04 .dw $ff04 +007a25 7571 +007a26 7469 .db "quit" +007a27 7a1b .dw VE_HEAD + .set VE_HEAD = VE_QUIT + XT_QUIT: +007a28 7001 .dw DO_COLON + .endif + PFA_QUIT: +007a29 02c1 +007a2a 02c8 +007a2b 7081 .dw XT_LP0,XT_LP,XT_STORE +007a2c 7a89 .dw XT_SP0 +007a2d 7296 .dw XT_SP_STORE +007a2e 7a96 .dw XT_RP0 +007a2f 7280 .dw XT_RP_STORE +007a30 0356 .dw XT_LBRACKET + + PFA_QUIT2: +007a31 754b .dw XT_STATE +007a32 7079 .dw XT_FETCH +007a33 711a .dw XT_ZEROEQUAL +007a34 7036 .dw XT_DOCONDBRANCH +007a35 7a37 DEST(PFA_QUIT4) +007a36 7a05 .dw XT_PROMPTREADY + PFA_QUIT4: +007a37 78e2 .dw XT_REFILL +007a38 7036 .dw XT_DOCONDBRANCH +007a39 7a49 DEST(PFA_QUIT3) +007a3a 703d .dw XT_DOLITERAL +007a3b 7aaf .dw XT_INTERPRET +007a3c 782b .dw XT_CATCH +007a3d 70b9 .dw XT_QDUP +007a3e 7036 .dw XT_DOCONDBRANCH +007a3f 7a49 DEST(PFA_QUIT3) +007a40 70b1 .dw XT_DUP +007a41 703d .dw XT_DOLITERAL +007a42 fffe .dw -2 +007a43 716e .dw XT_LESS +007a44 7036 .dw XT_DOCONDBRANCH +007a45 7a47 DEST(PFA_QUIT5) +007a46 7a20 .dw XT_PROMPTERROR + PFA_QUIT5: +007a47 702f .dw XT_DOBRANCH +007a48 7a29 DEST(PFA_QUIT) + PFA_QUIT3: +007a49 79f5 .dw XT_PROMPTOK +007a4a 702f .dw XT_DOBRANCH +007a4b 7a31 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: +007a4c ff05 .dw $ff05 +007a4d 6170 +007a4e 7375 +007a4f 0065 .db "pause",0 +007a50 7a24 .dw VE_HEAD + .set VE_HEAD = VE_PAUSE + XT_PAUSE: +007a51 7c13 .dw PFA_DODEFER1 + PFA_PAUSE: +007a52 013a .dw ram_pause +007a53 7bc8 .dw XT_RDEFERFETCH +007a54 7bd2 .dw XT_RDEFERSTORE + + .dseg +00013a ram_pause: .byte 2 + .cseg + .include "words/cold.asm" + + ; System + ; start up amforth. + VE_COLD: +007a55 ff04 .dw $ff04 +007a56 6f63 +007a57 646c .db "cold" +007a58 7a4c .dw VE_HEAD + .set VE_HEAD = VE_COLD + XT_COLD: +007a59 7a5a .dw PFA_COLD + PFA_COLD: +007a5a b6a4 in_ mcu_boot, MCUSR +007a5b 2422 clr zerol +007a5c 2433 clr zeroh +007a5d 24bb clr isrflag +007a5e be24 out_ MCUSR, zerol + ; clear RAM +007a5f e0e0 ldi zl, low(ramstart) +007a60 e0f1 ldi zh, high(ramstart) + clearloop: +007a61 9221 st Z+, zerol +007a62 30e0 cpi zl, low(sram_size+ramstart) +007a63 f7e9 brne clearloop +007a64 31f1 cpi zh, high(sram_size+ramstart) +007a65 f7d9 brne clearloop + ; init first user data area + ; allocate space for User Area + .dseg +00013c ram_user1: .byte SYSUSERSIZE + APPUSERSIZE + .cseg +007a66 e3ec ldi zl, low(ram_user1) +007a67 e0f1 ldi zh, high(ram_user1) +007a68 012f movw upl, zl + ; init return stack pointer +007a69 ef0f ldi temp0,low(rstackstart) +007a6a bf0d out_ SPL,temp0 +007a6b 8304 std Z+4, temp0 +007a6c e110 ldi temp1,high(rstackstart) +007a6d bf1e out_ SPH,temp1 +007a6e 8315 std Z+5, temp1 + + ; init parameter stack pointer +007a6f eacf ldi yl,low(stackstart) +007a70 83c6 std Z+6, yl +007a71 e1d0 ldi yh,high(stackstart) +007a72 83d7 std Z+7, yh + + ; load Forth IP with starting word +007a73 e7ac ldi XL, low(PFA_WARM) +007a74 e7ba ldi XH, high(PFA_WARM) + ; its a far jump... +007a75 940c 7005 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: +007a77 ff04 .dw $ff04 +007a78 6177 +007a79 6d72 .db "warm" +007a7a 7a55 .dw VE_HEAD + .set VE_HEAD = VE_WARM + XT_WARM: +007a7b 7001 .dw DO_COLON + PFA_WARM: + .endif +007a7c 7d50 .dw XT_INIT_RAM +007a7d 703d .dw XT_DOLITERAL +007a7e 7b7f .dw XT_NOOP +007a7f 703d .dw XT_DOLITERAL +007a80 7a51 .dw XT_PAUSE +007a81 7bf3 .dw XT_DEFERSTORE +007a82 0356 .dw XT_LBRACKET +007a83 75f8 .dw XT_TURNKEY +007a84 7a28 .dw XT_QUIT ; never returns + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + .include "words/sp0.asm" + + ; Stack + ; start address of the data stack + VE_SP0: +007a85 ff03 .dw $ff03 +007a86 7073 +007a87 0030 .db "sp0",0 +007a88 7a77 .dw VE_HEAD + .set VE_HEAD = VE_SP0 + XT_SP0: +007a89 706f .dw PFA_DOVALUE1 + PFA_SP0: +007a8a 0006 .dw USER_SP0 +007a8b 7bdc .dw XT_UDEFERFETCH +007a8c 7be8 .dw XT_UDEFERSTORE + + ; ( -- addr) + ; Stack + ; address of user variable to store top-of-stack for inactive tasks + VE_SP: +007a8d ff02 .dw $ff02 +007a8e 7073 .db "sp" +007a8f 7a85 .dw VE_HEAD + .set VE_HEAD = VE_SP + XT_SP: +007a90 7058 .dw PFA_DOUSER + PFA_SP: +007a91 0008 .dw USER_SP + .include "words/rp0.asm" + + ; Stack + ; start address of return stack + VE_RP0: +007a92 ff03 .dw $ff03 +007a93 7072 +007a94 0030 .db "rp0",0 +007a95 7a8d .dw VE_HEAD + .set VE_HEAD = VE_RP0 + XT_RP0: +007a96 7001 .dw DO_COLON + PFA_RP0: +007a97 7a9a .dw XT_DORP0 +007a98 7079 .dw XT_FETCH +007a99 7020 .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: +007a9a 7058 .dw PFA_DOUSER + PFA_DORP0: +007a9b 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: +007a9c ff05 .dw $ff05 +007a9d 6564 +007a9e 7470 +007a9f 0068 .db "depth",0 +007aa0 7a92 .dw VE_HEAD + .set VE_HEAD = VE_DEPTH + XT_DEPTH: +007aa1 7001 .dw DO_COLON + PFA_DEPTH: + .endif +007aa2 7a89 .dw XT_SP0 +007aa3 728d .dw XT_SP_FETCH +007aa4 7193 .dw XT_MINUS +007aa5 7204 .dw XT_2SLASH +007aa6 7235 .dw XT_1MINUS +007aa7 7020 .dw XT_EXIT + .include "words/interpret.asm" + + ; System + ; Interpret SOURCE word by word. + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_INTERPRET: +007aa8 ff09 .dw $ff09 +007aa9 6e69 +007aaa 6574 +007aab 7072 +007aac 6572 +007aad 0074 .db "interpret",0 +007aae 7a9c .dw VE_HEAD + .set VE_HEAD = VE_INTERPRET + XT_INTERPRET: +007aaf 7001 .dw DO_COLON + .endif + PFA_INTERPRET: +007ab0 79b4 .dw XT_PARSENAME ; ( -- addr len ) +007ab1 70b1 .dw XT_DUP ; ( -- addr len flag) +007ab2 7036 .dw XT_DOCONDBRANCH +007ab3 7ac0 DEST(PFA_INTERPRET2) +007ab4 7acc .dw XT_FORTHRECOGNIZER +007ab5 7ad7 .dw XT_RECOGNIZE +007ab6 754b .dw XT_STATE +007ab7 7079 .dw XT_FETCH +007ab8 7036 .dw XT_DOCONDBRANCH +007ab9 7abb DEST(PFA_INTERPRET1) +007aba 7bab .dw XT_ICELLPLUS ; we need the compile action + PFA_INTERPRET1: +007abb 73cb .dw XT_FETCHI +007abc 702a .dw XT_EXECUTE +007abd 7b57 .dw XT_QSTACK +007abe 702f .dw XT_DOBRANCH +007abf 7ab0 DEST(PFA_INTERPRET) + PFA_INTERPRET2: +007ac0 756e .dw XT_2DROP +007ac1 7020 .dw XT_EXIT + .include "words/forth-recognizer.asm" + + ; System Value + ; address of the next free data space (RAM) cell + VE_FORTHRECOGNIZER: +007ac2 ff10 .dw $ff10 +007ac3 6f66 +007ac4 7472 +007ac5 2d68 +007ac6 6572 +007ac7 6f63 +007ac8 6e67 +007ac9 7a69 +007aca 7265 .db "forth-recognizer" +007acb 7aa8 .dw VE_HEAD + .set VE_HEAD = VE_FORTHRECOGNIZER + XT_FORTHRECOGNIZER: +007acc 706f .dw PFA_DOVALUE1 + PFA_FORTHRECOGNIZER: +007acd 0042 .dw CFG_FORTHRECOGNIZER +007ace 7bb4 .dw XT_EDEFERFETCH +007acf 7bbe .dw XT_EDEFERSTORE + .include "words/recognize.asm" + + ; System + ; walk the recognizer stack + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_RECOGNIZE: +007ad0 ff09 .dw $ff09 +007ad1 6572 +007ad2 6f63 +007ad3 6e67 +007ad4 7a69 +007ad5 0065 .db "recognize",0 +007ad6 7ac2 .dw VE_HEAD + .set VE_HEAD = VE_RECOGNIZE + XT_RECOGNIZE: +007ad7 7001 .dw DO_COLON + PFA_RECOGNIZE: + .endif +007ad8 703d .dw XT_DOLITERAL +007ad9 7ae2 .dw XT_RECOGNIZE_A +007ada 70c4 .dw XT_SWAP +007adb 040c .dw XT_MAPSTACK +007adc 711a .dw XT_ZEROEQUAL +007add 7036 .dw XT_DOCONDBRANCH +007ade 7ae1 DEST(PFA_RECOGNIZE1) +007adf 756e .dw XT_2DROP +007ae0 7b4a .dw XT_DT_NULL + PFA_RECOGNIZE1: +007ae1 7020 .dw XT_EXIT + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + ; ( addr len XT -- addr len [ dt:xt -1 | 0 ] ) + XT_RECOGNIZE_A: +007ae2 7001 .dw DO_COLON + PFA_RECOGNIZE_A: + .endif +007ae3 70e1 .dw XT_ROT ; -- len xt addr +007ae4 70e1 .dw XT_ROT ; -- xt addr len +007ae5 7565 .dw XT_2DUP +007ae6 731e .dw XT_2TO_R +007ae7 70e1 .dw XT_ROT ; -- addr len xt +007ae8 702a .dw XT_EXECUTE ; -- i*x dt:* | dt:null +007ae9 732d .dw XT_2R_FROM +007aea 70e1 .dw XT_ROT +007aeb 70b1 .dw XT_DUP +007aec 7b4a .dw XT_DT_NULL +007aed 7d7f .dw XT_EQUAL +007aee 7036 .dw XT_DOCONDBRANCH +007aef 7af3 DEST(PFA_RECOGNIZE_A1) +007af0 70d9 .dw XT_DROP +007af1 7154 .dw XT_ZERO +007af2 7020 .dw XT_EXIT + PFA_RECOGNIZE_A1: +007af3 70f0 .dw XT_NIP +007af4 70f0 .dw XT_NIP +007af5 714b .dw XT_TRUE +007af6 7020 .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: +007af7 ff06 .dw $ff06 +007af8 7464 +007af9 6e3a +007afa 6d75 .db "dt:num" +007afb 7ad0 .dw VE_HEAD + .set VE_HEAD = VE_DT_NUM + XT_DT_NUM: +007afc 7052 .dw PFA_DOCONSTANT + PFA_DT_NUM: + .endif +007afd 7b7f .dw XT_NOOP ; interpret +007afe 01e2 .dw XT_LITERAL ; compile +007aff 01e2 .dw XT_LITERAL ; postpone + + ; ( -- addr ) + ; Interpreter + ; Method table for double cell integers + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_DT_DNUM: +007b00 ff07 .dw $ff07 +007b01 7464 +007b02 643a +007b03 756e +007b04 006d .db "dt:dnum",0 +007b05 7af7 .dw VE_HEAD + .set VE_HEAD = VE_DT_DNUM + XT_DT_DNUM: +007b06 7052 .dw PFA_DOCONSTANT + PFA_DT_DNUM: + .endif +007b07 7b7f .dw XT_NOOP ; interpret +007b08 7d77 .dw XT_2LITERAL ; compile +007b09 7d77 .dw XT_2LITERAL ; postpone + + ; ( addr len -- f ) + ; Interpreter + ; recognizer for integer numbers + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + + VE_REC_NUM: +007b0a ff07 .dw $ff07 +007b0b 6572 +007b0c 3a63 +007b0d 756e +007b0e 006d .db "rec:num",0 +007b0f 7b00 .dw VE_HEAD + .set VE_HEAD = VE_REC_NUM + XT_REC_NUM: +007b10 7001 .dw DO_COLON + PFA_REC_NUM: + .endif + ; try converting to a number +007b11 78f4 .dw XT_NUMBER +007b12 7036 .dw XT_DOCONDBRANCH +007b13 7b1c DEST(PFA_REC_NONUMBER) +007b14 7d86 .dw XT_ONE +007b15 7d7f .dw XT_EQUAL +007b16 7036 .dw XT_DOCONDBRANCH +007b17 7b1a DEST(PFA_REC_INTNUM2) +007b18 7afc .dw XT_DT_NUM +007b19 7020 .dw XT_EXIT + PFA_REC_INTNUM2: +007b1a 7b06 .dw XT_DT_DNUM +007b1b 7020 .dw XT_EXIT + PFA_REC_NONUMBER: +007b1c 7b4a .dw XT_DT_NULL +007b1d 7020 .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: +007b1e ff08 .dw $ff08 +007b1f 6572 +007b20 3a63 +007b21 6966 +007b22 646e .db "rec:find" +007b23 7b0a .dw VE_HEAD + .set VE_HEAD = VE_REC_FIND + XT_REC_FIND: +007b24 7001 .dw DO_COLON + PFA_REC_FIND: + .endif +007b25 79d0 .DW XT_FINDXT +007b26 70b1 .dw XT_DUP +007b27 711a .dw XT_ZEROEQUAL +007b28 7036 .dw XT_DOCONDBRANCH +007b29 7b2d DEST(PFA_REC_WORD_FOUND) +007b2a 70d9 .dw XT_DROP +007b2b 7b4a .dw XT_DT_NULL +007b2c 7020 .dw XT_EXIT + PFA_REC_WORD_FOUND: +007b2d 7b34 .dw XT_DT_XT + +007b2e 7020 .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: +007b2f ff05 .dw $ff05 +007b30 7464 +007b31 783a +007b32 0074 .db "dt:xt",0 +007b33 7b1e .dw VE_HEAD + .set VE_HEAD = VE_DT_XT + XT_DT_XT: +007b34 7052 .dw PFA_DOCONSTANT + PFA_DT_XT: + .endif +007b35 7b38 .dw XT_R_WORD_INTERPRET +007b36 7b3c .dw XT_R_WORD_COMPILE +007b37 7d77 .dw XT_2LITERAL + + ; ( XT flags -- ) + ; Interpreter + ; interpret method for WORD recognizer + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + XT_R_WORD_INTERPRET: +007b38 7001 .dw DO_COLON + PFA_R_WORD_INTERPRET: + .endif +007b39 70d9 .dw XT_DROP ; the flags are in the way +007b3a 702a .dw XT_EXECUTE +007b3b 7020 .dw XT_EXIT + + ; ( XT flags -- ) + ; Interpreter + ; Compile method for WORD recognizer + .if cpu_msp430==1 + .endif + .if cpu_avr8==1 + XT_R_WORD_COMPILE: +007b3c 7001 .dw DO_COLON + PFA_R_WORD_COMPILE: + .endif +007b3d 7121 .dw XT_ZEROLESS +007b3e 7036 .dw XT_DOCONDBRANCH +007b3f 7b42 DEST(PFA_R_WORD_COMPILE1) +007b40 01cc .dw XT_COMMA +007b41 7020 .dw XT_EXIT + PFA_R_WORD_COMPILE1: +007b42 702a .dw XT_EXECUTE +007b43 7020 .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: +007b44 ff07 .dw $ff07 +007b45 7464 +007b46 6e3a +007b47 6c75 +../../common\words/dt-null.asm(12): warning: .cseg .db misalignment - padding zero byte +007b48 006c .db "dt:null" +007b49 7b2f .dw VE_HEAD + .set VE_HEAD = VE_DT_NULL + XT_DT_NULL: +007b4a 7052 .dw PFA_DOCONSTANT + PFA_DT_NULL: + .endif +007b4b 7b4e .dw XT_FAIL ; interpret +007b4c 7b4e .dw XT_FAIL ; compile +007b4d 7b4e .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: +007b4e 7001 .dw DO_COLON + PFA_FAIL: + .endif +007b4f 703d .dw XT_DOLITERAL +007b50 fff3 .dw -13 +007b51 7841 .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: +007b52 ff06 .dw $ff06 +007b53 733f +007b54 6174 +007b55 6b63 .db "?stack" +007b56 7b44 .dw VE_HEAD + .set VE_HEAD = VE_QSTACK + XT_QSTACK: +007b57 7001 .dw DO_COLON + PFA_QSTACK: + .endif +007b58 7aa1 .dw XT_DEPTH +007b59 7121 .dw XT_ZEROLESS +007b5a 7036 .dw XT_DOCONDBRANCH +007b5b 7b5f DEST(PFA_QSTACK1) +007b5c 703d .dw XT_DOLITERAL +007b5d fffc .dw -4 +007b5e 7841 .dw XT_THROW + PFA_QSTACK1: +007b5f 7020 .dw XT_EXIT + .include "words/ver.asm" + + ; Tools + ; print the version string + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_DOT_VER: +007b60 ff03 .dw $ff03 +007b61 6576 +../../common\words/ver.asm(12): warning: .cseg .db misalignment - padding zero byte +007b62 0072 .db "ver" +007b63 7b52 .dw VE_HEAD + .set VE_HEAD = VE_DOT_VER + XT_DOT_VER: +007b64 7001 .dw DO_COLON + PFA_DOT_VER: + .endif +007b65 750d .dw XT_ENV_FORTHNAME +007b66 77a0 .dw XT_ITYPE +007b67 77e2 .dw XT_SPACE +007b68 7551 .dw XT_BASE +007b69 7079 .dw XT_FETCH + +007b6a 751b .dw XT_ENV_FORTHVERSION +007b6b 75dd .dw XT_DECIMAL +007b6c 7d67 .dw XT_S2D +007b6d 76be .dw XT_L_SHARP +007b6e 76c6 .dw XT_SHARP +007b6f 703d .dw XT_DOLITERAL +007b70 002e .dw '.' +007b71 76af .dw XT_HOLD +007b72 76dc .dw XT_SHARP_S +007b73 76e7 .dw XT_SHARP_G +007b74 77fb .dw XT_TYPE +007b75 7551 .dw XT_BASE +007b76 7081 .dw XT_STORE +007b77 77e2 .dw XT_SPACE +007b78 7523 .dw XT_ENV_CPU +007b79 77a0 .dw XT_ITYPE + +007b7a 7020 .dw XT_EXIT + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + .include "words/noop.asm" + + ; Tools + ; do nothing + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_NOOP: +007b7b ff04 .dw $ff04 +007b7c 6f6e +007b7d 706f .db "noop" +007b7e 7b60 .dw VE_HEAD + .set VE_HEAD = VE_NOOP + XT_NOOP: +007b7f 7001 .dw DO_COLON + PFA_NOOP: + .endif +007b80 7020 .DW XT_EXIT + .include "words/unused.asm" + + ; Tools + ; Amount of available RAM (incl. PAD) + VE_UNUSED: +007b81 ff06 .dw $ff06 +007b82 6e75 +007b83 7375 +007b84 6465 .db "unused" +007b85 7b7b .dw VE_HEAD + .set VE_HEAD = VE_UNUSED + XT_UNUSED: +007b86 7001 .dw DO_COLON + PFA_UNUSED: +007b87 728d .dw XT_SP_FETCH +007b88 75bf .dw XT_HERE +007b89 7193 .dw XT_MINUS +007b8a 7020 .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: +007b8b 0002 .dw $0002 +007b8c 6f74 .db "to" +007b8d 7b81 .dw VE_HEAD + .set VE_HEAD = VE_TO + XT_TO: +007b8e 7001 .dw DO_COLON + PFA_TO: + .endif +007b8f 780a .dw XT_TICK +007b90 7d70 .dw XT_TO_BODY +007b91 754b .dw XT_STATE +007b92 7079 .dw XT_FETCH +007b93 7036 .dw XT_DOCONDBRANCH +007b94 7b9f DEST(PFA_TO1) +007b95 01c1 .dw XT_COMPILE +007b96 7b99 .dw XT_DOTO +007b97 01cc .dw XT_COMMA +007b98 7020 .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: +007b99 7001 .dw DO_COLON + PFA_DOTO: + .endif +007b9a 70f6 .dw XT_R_FROM +007b9b 70b1 .dw XT_DUP +007b9c 7bab .dw XT_ICELLPLUS +007b9d 70ff .dw XT_TO_R +007b9e 73cb .dw XT_FETCHI + PFA_TO1: +007b9f 70b1 .dw XT_DUP +007ba0 7bab .dw XT_ICELLPLUS +007ba1 7bab .dw XT_ICELLPLUS +007ba2 73cb .dw XT_FETCHI +007ba3 702a .dw XT_EXECUTE +007ba4 7020 .dw XT_EXIT + .include "words/i-cellplus.asm" + + ; Compiler + ; skip to the next cell in flash + VE_ICELLPLUS: +007ba5 ff07 .dw $FF07 +007ba6 2d69 +007ba7 6563 +007ba8 6c6c +007ba9 002b .db "i-cell+",0 +007baa 7b8b .dw VE_HEAD + .set VE_HEAD = VE_ICELLPLUS + XT_ICELLPLUS: +007bab 7001 .dw DO_COLON + PFA_ICELLPLUS: +007bac 722f .dw XT_1PLUS +007bad 7020 .dw XT_EXIT + + .include "words/edefer-fetch.asm" + + ; System + ; does the real defer@ for eeprom defers + VE_EDEFERFETCH: +007bae ff07 .dw $ff07 +007baf 6445 +007bb0 6665 +007bb1 7265 +007bb2 0040 .db "Edefer@",0 +007bb3 7ba5 .dw VE_HEAD + .set VE_HEAD = VE_EDEFERFETCH + XT_EDEFERFETCH: +007bb4 7001 .dw DO_COLON + PFA_EDEFERFETCH: +007bb5 73cb .dw XT_FETCHI +007bb6 735f .dw XT_FETCHE +007bb7 7020 .dw XT_EXIT + .include "words/edefer-store.asm" + + ; System + ; does the real defer! for eeprom defers + VE_EDEFERSTORE: +007bb8 ff07 .dw $ff07 +007bb9 6445 +007bba 6665 +007bbb 7265 +007bbc 0021 .db "Edefer!",0 +007bbd 7bae .dw VE_HEAD + .set VE_HEAD = VE_EDEFERSTORE + XT_EDEFERSTORE: +007bbe 7001 .dw DO_COLON + PFA_EDEFERSTORE: +007bbf 73cb .dw XT_FETCHI +007bc0 733b .dw XT_STOREE +007bc1 7020 .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: +007bc2 ff07 .dw $ff07 +007bc3 6452 +007bc4 6665 +007bc5 7265 +007bc6 0040 .db "Rdefer@",0 +007bc7 7bb8 .dw VE_HEAD + .set VE_HEAD = VE_RDEFERFETCH + XT_RDEFERFETCH: +007bc8 7001 .dw DO_COLON + PFA_RDEFERFETCH: + .endif +007bc9 73cb .dw XT_FETCHI +007bca 7079 .dw XT_FETCH +007bcb 7020 .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: +007bcc ff07 .dw $ff07 +007bcd 6452 +007bce 6665 +007bcf 7265 +007bd0 0021 .db "Rdefer!",0 +007bd1 7bc2 .dw VE_HEAD + .set VE_HEAD = VE_RDEFERSTORE + XT_RDEFERSTORE: +007bd2 7001 .dw DO_COLON + PFA_RDEFERSTORE: + .endif +007bd3 73cb .dw XT_FETCHI +007bd4 7081 .dw XT_STORE +007bd5 7020 .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: +007bd6 ff07 .dw $ff07 +007bd7 6455 +007bd8 6665 +007bd9 7265 +007bda 0040 .db "Udefer@",0 +007bdb 7bcc .dw VE_HEAD + .set VE_HEAD = VE_UDEFERFETCH + XT_UDEFERFETCH: +007bdc 7001 .dw DO_COLON + PFA_UDEFERFETCH: + .endif +007bdd 73cb .dw XT_FETCHI +007bde 7302 .dw XT_UP_FETCH +007bdf 719d .dw XT_PLUS +007be0 7079 .dw XT_FETCH +007be1 7020 .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: +007be2 ff07 .dw $ff07 +007be3 6455 +007be4 6665 +007be5 7265 +007be6 0021 .db "Udefer!",0 +007be7 7bd6 .dw VE_HEAD + .set VE_HEAD = VE_UDEFERSTORE + XT_UDEFERSTORE: +007be8 7001 .dw DO_COLON + PFA_UDEFERSTORE: + .endif + +007be9 73cb .dw XT_FETCHI +007bea 7302 .dw XT_UP_FETCH +007beb 719d .dw XT_PLUS +007bec 7081 .dw XT_STORE +007bed 7020 .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: +007bee ff06 .dw $ff06 +007bef 6564 +007bf0 6566 +007bf1 2172 .db "defer!" +007bf2 7be2 .dw VE_HEAD + .set VE_HEAD = VE_DEFERSTORE + XT_DEFERSTORE: +007bf3 7001 .dw DO_COLON + PFA_DEFERSTORE: + .endif +007bf4 7d70 .dw XT_TO_BODY +007bf5 70b1 .dw XT_DUP +007bf6 7bab .dw XT_ICELLPLUS +007bf7 7bab .dw XT_ICELLPLUS +007bf8 73cb .dw XT_FETCHI +007bf9 702a .dw XT_EXECUTE +007bfa 7020 .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: +007bfb ff06 .dw $ff06 +007bfc 6564 +007bfd 6566 +007bfe 4072 .db "defer@" +007bff 7bee .dw VE_HEAD + .set VE_HEAD = VE_DEFERFETCH + XT_DEFERFETCH: +007c00 7001 .dw DO_COLON + PFA_DEFERFETCH: + .endif +007c01 7d70 .dw XT_TO_BODY +007c02 70b1 .dw XT_DUP +007c03 7bab .dw XT_ICELLPLUS +007c04 73cb .dw XT_FETCHI +007c05 702a .dw XT_EXECUTE +007c06 7020 .dw XT_EXIT + .include "words/do-defer.asm" + + ; System + ; runtime of defer + VE_DODEFER: +007c07 ff07 .dw $ff07 +007c08 6428 +007c09 6665 +007c0a 7265 +007c0b 0029 .db "(defer)", 0 +007c0c 7bfb .dw VE_HEAD + .set VE_HEAD = VE_DODEFER + XT_DODEFER: +007c0d 7001 .dw DO_COLON + PFA_DODEFER: +007c0e 019e .dw XT_DOCREATE +007c0f 02fe .dw XT_REVEAL +007c10 01c1 .dw XT_COMPILE +007c11 7c13 .dw PFA_DODEFER1 +007c12 7020 .dw XT_EXIT + PFA_DODEFER1: +007c13 940e 0317 call_ DO_DODOES +007c15 70b1 .dw XT_DUP +007c16 7bab .dw XT_ICELLPLUS +007c17 73cb .dw XT_FETCHI +007c18 702a .dw XT_EXECUTE +007c19 702a .dw XT_EXECUTE +007c1a 7020 .dw XT_EXIT + + ; : (defer) dup i-cell+ @i execute execute ; + + + .include "words/search-wordlist.asm" + + ; Search Order + ; searches the word list wid for the word at c-addr/len + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_SEARCH_WORDLIST: +007c1b ff0f .dw $ff0f +007c1c 6573 +007c1d 7261 +007c1e 6863 +007c1f 772d +007c20 726f +007c21 6c64 +007c22 7369 +007c23 0074 .db "search-wordlist",0 +007c24 7c07 .dw VE_HEAD + .set VE_HEAD = VE_SEARCH_WORDLIST + XT_SEARCH_WORDLIST: +007c25 7001 .dw DO_COLON + PFA_SEARCH_WORDLIST: + .endif +007c26 70ff .dw XT_TO_R +007c27 7154 .dw XT_ZERO +007c28 703d .dw XT_DOLITERAL +007c29 7c3a .dw XT_ISWORD +007c2a 70f6 .dw XT_R_FROM +007c2b 7c57 .dw XT_TRAVERSEWORDLIST +007c2c 70b1 .dw XT_DUP +007c2d 711a .dw XT_ZEROEQUAL +007c2e 7036 .dw XT_DOCONDBRANCH +007c2f 7c34 DEST(PFA_SEARCH_WORDLIST1) +007c30 756e .dw XT_2DROP +007c31 70d9 .dw XT_DROP +007c32 7154 .dw XT_ZERO +007c33 7020 .dw XT_EXIT + PFA_SEARCH_WORDLIST1: + ; ... get the XT ... +007c34 70b1 .dw XT_DUP +007c35 7c7e .dw XT_NFA2CFA + ; .. and get the header flag +007c36 70c4 .dw XT_SWAP +007c37 0184 .dw XT_NAME2FLAGS +007c38 0172 .dw XT_IMMEDIATEQ +007c39 7020 .dw XT_EXIT + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + XT_ISWORD: +007c3a 7001 .dw DO_COLON + PFA_ISWORD: + .endif + ; ( c-addr len 0 nt -- c-addr len 0 true| nt false ) +007c3b 70ff .dw XT_TO_R +007c3c 70d9 .dw XT_DROP +007c3d 7565 .dw XT_2DUP +007c3e 7108 .dw XT_R_FETCH ; -- addr len addr len nt +007c3f 7c72 .dw XT_NAME2STRING +007c40 7c88 .dw XT_ICOMPARE ; (-- addr len f ) +007c41 7036 .dw XT_DOCONDBRANCH +007c42 7c48 DEST(PFA_ISWORD3) + ; not now +007c43 70f6 .dw XT_R_FROM +007c44 70d9 .dw XT_DROP +007c45 7154 .dw XT_ZERO +007c46 714b .dw XT_TRUE ; maybe next word +007c47 7020 .dw XT_EXIT + PFA_ISWORD3: + ; we found the word, now clean up iteration data ... +007c48 756e .dw XT_2DROP +007c49 70f6 .dw XT_R_FROM +007c4a 7154 .dw XT_ZERO ; finish traverse-wordlist +007c4b 7020 .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: +007c4c ff11 .dw $ff11 +007c4d 7274 +007c4e 7661 +007c4f 7265 +007c50 6573 +007c51 772d +007c52 726f +007c53 6c64 +007c54 7369 +007c55 0074 .db "traverse-wordlist",0 +007c56 7c1b .dw VE_HEAD + .set VE_HEAD = VE_TRAVERSEWORDLIST + XT_TRAVERSEWORDLIST: +007c57 7001 .dw DO_COLON + PFA_TRAVERSEWORDLIST: + + .endif +007c58 735f .dw XT_FETCHE + PFA_TRAVERSEWORDLIST1: +007c59 70b1 .dw XT_DUP ; ( -- xt nt nt ) +007c5a 7036 .dw XT_DOCONDBRANCH ; ( -- nt ) is nfa = counted string +007c5b 7c68 DEST(PFA_TRAVERSEWORDLIST2) +007c5c 7565 .dw XT_2DUP +007c5d 731e .dw XT_2TO_R +007c5e 70c4 .dw XT_SWAP +007c5f 702a .dw XT_EXECUTE +007c60 732d .dw XT_2R_FROM +007c61 70e1 .dw XT_ROT +007c62 7036 .dw XT_DOCONDBRANCH +007c63 7c68 DEST(PFA_TRAVERSEWORDLIST2) +007c64 047b .dw XT_NFA2LFA +007c65 73cb .dw XT_FETCHI +007c66 702f .dw XT_DOBRANCH ; ( -- addr ) +007c67 7c59 DEST(PFA_TRAVERSEWORDLIST1) ; ( -- addr ) + PFA_TRAVERSEWORDLIST2: +007c68 756e .dw XT_2DROP +007c69 7020 .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: +007c6a ff0b .dw $ff0b +007c6b 616e +007c6c 656d +007c6d 733e +007c6e 7274 +007c6f 6e69 +007c70 0067 .db "name>string",0 +007c71 7c4c .dw VE_HEAD + .set VE_HEAD = VE_NAME2STRING + XT_NAME2STRING: +007c72 7001 .dw DO_COLON + PFA_NAME2STRING: + + .endif +007c73 77cc .dw XT_ICOUNT ; ( -- addr n ) +007c74 703d .dw XT_DOLITERAL +007c75 00ff .dw 255 +007c76 7213 .dw XT_AND ; mask immediate bit +007c77 7020 .dw XT_EXIT + .include "words/nfa2cfa.asm" + + ; Tools + ; get the XT from a name token + VE_NFA2CFA: +007c78 ff07 .dw $ff07 +007c79 666e +007c7a 3e61 +007c7b 6663 +../../avr8\words/nfa2cfa.asm(6): warning: .cseg .db misalignment - padding zero byte +007c7c 0061 .db "nfa>cfa" +007c7d 7c6a .dw VE_HEAD + .set VE_HEAD = VE_NFA2CFA + XT_NFA2CFA: +007c7e 7001 .dw DO_COLON + PFA_NFA2CFA: +007c7f 047b .dw XT_NFA2LFA ; skip to link field +007c80 722f .dw XT_1PLUS ; next is the execution token +007c81 7020 .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: +007c82 ff08 .dw $ff08 +007c83 6369 +007c84 6d6f +007c85 6170 +007c86 6572 .db "icompare" +007c87 7c78 .dw VE_HEAD + .set VE_HEAD = VE_ICOMPARE + XT_ICOMPARE: +007c88 7001 .dw DO_COLON + PFA_ICOMPARE: +007c89 70ff .dw XT_TO_R ; ( -- r-addr r-len f-addr) +007c8a 70cf .dw XT_OVER ; ( -- r-addr r-len f-addr r-len) +007c8b 70f6 .dw XT_R_FROM ; ( -- r-addr r-len f-addr r-len f-len ) +007c8c 7113 .dw XT_NOTEQUAL ; ( -- r-addr r-len f-addr flag ) +007c8d 7036 .dw XT_DOCONDBRANCH +007c8e 7c93 .dw PFA_ICOMPARE_SAMELEN +007c8f 756e .dw XT_2DROP +007c90 70d9 .dw XT_DROP +007c91 714b .dw XT_TRUE +007c92 7020 .dw XT_EXIT + PFA_ICOMPARE_SAMELEN: +007c93 70c4 .dw XT_SWAP ; ( -- r-addr f-addr len ) +007c94 7154 .dw XT_ZERO +007c95 028b .dw XT_QDOCHECK +007c96 7036 .dw XT_DOCONDBRANCH +007c97 7cb6 .dw PFA_ICOMPARE_DONE +007c98 729b .dw XT_DODO + PFA_ICOMPARE_LOOP: + ; ( r-addr f-addr --) +007c99 70cf .dw XT_OVER +007c9a 7079 .dw XT_FETCH + .if WANT_IGNORECASE == 1 + .endif +007c9b 70cf .dw XT_OVER +007c9c 73cb .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 +007c9d 70b1 .dw XT_DUP + ;.dw XT_BYTESWAP +007c9e 703d .dw XT_DOLITERAL +007c9f 0100 .dw $100 +007ca0 715c .dw XT_ULESS +007ca1 7036 .dw XT_DOCONDBRANCH +007ca2 7ca7 .dw PFA_ICOMPARE_LASTCELL +007ca3 70c4 .dw XT_SWAP +007ca4 703d .dw XT_DOLITERAL +007ca5 00ff .dw $00FF +007ca6 7213 .dw XT_AND ; the final swap can be omitted + PFA_ICOMPARE_LASTCELL: +007ca7 7113 .dw XT_NOTEQUAL +007ca8 7036 .dw XT_DOCONDBRANCH +007ca9 7cae .dw PFA_ICOMPARE_NEXTLOOP +007caa 756e .dw XT_2DROP +007cab 714b .dw XT_TRUE +007cac 72d4 .dw XT_UNLOOP +007cad 7020 .dw XT_EXIT + PFA_ICOMPARE_NEXTLOOP: +007cae 722f .dw XT_1PLUS +007caf 70c4 .dw XT_SWAP +007cb0 755e .dw XT_CELLPLUS +007cb1 70c4 .dw XT_SWAP +007cb2 703d .dw XT_DOLITERAL +007cb3 0002 .dw 2 +007cb4 72ba .dw XT_DOPLUSLOOP +007cb5 7c99 .dw PFA_ICOMPARE_LOOP + PFA_ICOMPARE_DONE: +007cb6 756e .dw XT_2DROP +007cb7 7154 .dw XT_ZERO +007cb8 7020 .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: +007cb9 ff01 .dw $ff01 +007cba 002a .db "*",0 +007cbb 7c82 .dw VE_HEAD + .set VE_HEAD = VE_STAR + XT_STAR: +007cbc 7001 .dw DO_COLON + PFA_STAR: + .endif + +007cbd 71a6 .dw XT_MSTAR +007cbe 70d9 .dw XT_DROP +007cbf 7020 .dw XT_EXIT + .include "words/j.asm" + + ; Compiler + ; loop counter of outer loop + VE_J: +007cc0 ff01 .dw $FF01 +007cc1 006a .db "j",0 +007cc2 7cb9 .dw VE_HEAD + .set VE_HEAD = VE_J + XT_J: +007cc3 7001 .dw DO_COLON + PFA_J: +007cc4 7276 .dw XT_RP_FETCH +007cc5 703d .dw XT_DOLITERAL +007cc6 0007 .dw 7 +007cc7 719d .dw XT_PLUS +007cc8 7079 .dw XT_FETCH +007cc9 7276 .dw XT_RP_FETCH +007cca 703d .dw XT_DOLITERAL +007ccb 0009 .dw 9 +007ccc 719d .dw XT_PLUS +007ccd 7079 .dw XT_FETCH +007cce 719d .dw XT_PLUS +007ccf 7020 .dw XT_EXIT + + .include "words/dabs.asm" + + ; Arithmetics + ; double cell absolute value + VE_DABS: +007cd0 ff04 .dw $ff04 +007cd1 6164 +007cd2 7362 .db "dabs" +007cd3 7cc0 .dw VE_HEAD + .set VE_HEAD = VE_DABS + XT_DABS: +007cd4 7001 .dw DO_COLON + PFA_DABS: +007cd5 70b1 .dw XT_DUP +007cd6 7121 .dw XT_ZEROLESS +007cd7 7036 .dw XT_DOCONDBRANCH +007cd8 7cda .dw PFA_DABS1 +007cd9 7ce1 .dw XT_DNEGATE + PFA_DABS1: +007cda 7020 .dw XT_EXIT + ; : dabs ( ud1 -- +d2 ) dup 0< if dnegate then ; + .include "words/dnegate.asm" + + ; Arithmetics + ; double cell negation + VE_DNEGATE: +007cdb ff07 .dw $ff07 +007cdc 6e64 +007cdd 6765 +007cde 7461 +007cdf 0065 .db "dnegate",0 +007ce0 7cd0 .dw VE_HEAD + .set VE_HEAD = VE_DNEGATE + XT_DNEGATE: +007ce1 7001 .dw DO_COLON + PFA_DNEGATE: +007ce2 743b .dw XT_DINVERT +007ce3 7d86 .dw XT_ONE +007ce4 7154 .dw XT_ZERO +007ce5 7415 .dw XT_DPLUS +007ce6 7020 .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: +007ce7 ff05 .dw $ff05 +007ce8 6d63 +007ce9 766f +007cea 0065 .db "cmove",0 +007ceb 7cdb .dw VE_HEAD + .set VE_HEAD = VE_CMOVE + XT_CMOVE: +007cec 7ced .dw PFA_CMOVE + PFA_CMOVE: +007ced 93bf push xh +007cee 93af push xl +007cef 91e9 ld zl, Y+ +007cf0 91f9 ld zh, Y+ ; addr-to +007cf1 91a9 ld xl, Y+ +007cf2 91b9 ld xh, Y+ ; addr-from +007cf3 2f09 mov temp0, tosh +007cf4 2b08 or temp0, tosl +007cf5 f021 brbs 1, PFA_CMOVE1 + PFA_CMOVE2: +007cf6 911d ld temp1, X+ +007cf7 9311 st Z+, temp1 +007cf8 9701 sbiw tosl, 1 +007cf9 f7e1 brbc 1, PFA_CMOVE2 + PFA_CMOVE1: +007cfa 91af pop xl +007cfb 91bf pop xh +007cfc 9189 +007cfd 9199 loadtos +007cfe 940c 7005 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: +007d00 ff05 .dw $ff05 +007d01 7332 +007d02 6177 +007d03 0070 .db "2swap",0 +007d04 7ce7 .dw VE_HEAD + .set VE_HEAD = VE_2SWAP + XT_2SWAP: +007d05 7001 .dw DO_COLON + PFA_2SWAP: + + .endif +007d06 70e1 .dw XT_ROT +007d07 70ff .dw XT_TO_R +007d08 70e1 .dw XT_ROT +007d09 70f6 .dw XT_R_FROM +007d0a 7020 .dw XT_EXIT + + .include "words/tib.asm" + + ; System + ; refills the input buffer + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_REFILLTIB: +007d0b ff0a .dw $ff0a +007d0c 6572 +007d0d 6966 +007d0e 6c6c +007d0f 742d +007d10 6269 .db "refill-tib" +007d11 7d00 .dw VE_HEAD + .set VE_HEAD = VE_REFILLTIB + XT_REFILLTIB: +007d12 7001 .dw DO_COLON + PFA_REFILLTIB: + .endif +007d13 7d2e .dw XT_TIB +007d14 703d .dw XT_DOLITERAL +007d15 005a .dw TIB_SIZE +007d16 7891 .dw XT_ACCEPT +007d17 7d34 .dw XT_NUMBERTIB +007d18 7081 .dw XT_STORE +007d19 7154 .dw XT_ZERO +007d1a 757e .dw XT_TO_IN +007d1b 7081 .dw XT_STORE +007d1c 714b .dw XT_TRUE ; -1 +007d1d 7020 .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: +007d1e ff0a .dw $FF0A +007d1f 6f73 +007d20 7275 +007d21 6563 +007d22 742d +007d23 6269 .db "source-tib" +007d24 7d0b .dw VE_HEAD + .set VE_HEAD = VE_SOURCETIB + XT_SOURCETIB: +007d25 7001 .dw DO_COLON + PFA_SOURCETIB: + .endif +007d26 7d2e .dw XT_TIB +007d27 7d34 .dw XT_NUMBERTIB +007d28 7079 .dw XT_FETCH +007d29 7020 .dw XT_EXIT + + ; ( -- addr ) + ; System Variable + ; terminal input buffer address + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_TIB: +007d2a ff03 .dw $ff03 +007d2b 6974 +007d2c 0062 .db "tib",0 +007d2d 7d1e .dw VE_HEAD + .set VE_HEAD = VE_TIB + XT_TIB: +007d2e 7048 .dw PFA_DOVARIABLE + PFA_TIB: +007d2f 0168 .dw ram_tib + .dseg +000168 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: +007d30 ff04 .dw $ff04 +007d31 7423 +007d32 6269 .db "#tib" +007d33 7d2a .dw VE_HEAD + .set VE_HEAD = VE_NUMBERTIB + XT_NUMBERTIB: +007d34 7048 .dw PFA_DOVARIABLE + PFA_NUMBERTIB: +007d35 01c2 .dw ram_sharptib + .dseg +0001c2 ram_sharptib: .byte 2 + .cseg + .endif + + .include "words/init-ram.asm" + + ; Tools + ; copy len cells from eeprom to ram + VE_EE2RAM: +007d36 ff06 .dw $ff06 +007d37 6565 +007d38 723e +007d39 6d61 .db "ee>ram" +007d3a 7d30 .dw VE_HEAD + .set VE_HEAD = VE_EE2RAM + XT_EE2RAM: +007d3b 7001 .dw DO_COLON + PFA_EE2RAM: ; ( -- ) +007d3c 7154 .dw XT_ZERO +007d3d 729b .dw XT_DODO + PFA_EE2RAM_1: + ; ( -- e-addr r-addr ) +007d3e 70cf .dw XT_OVER +007d3f 735f .dw XT_FETCHE +007d40 70cf .dw XT_OVER +007d41 7081 .dw XT_STORE +007d42 755e .dw XT_CELLPLUS +007d43 70c4 .dw XT_SWAP +007d44 755e .dw XT_CELLPLUS +007d45 70c4 .dw XT_SWAP +007d46 72c9 .dw XT_DOLOOP +007d47 7d3e .dw PFA_EE2RAM_1 + PFA_EE2RAM_2: +007d48 756e .dw XT_2DROP +007d49 7020 .dw XT_EXIT + + ; ( -- ) + ; Tools + ; setup the default user area from eeprom + VE_INIT_RAM: +007d4a ff08 .dw $ff08 +007d4b 6e69 +007d4c 7469 +007d4d 722d +007d4e 6d61 .db "init-ram" +007d4f 7d36 .dw VE_HEAD + .set VE_HEAD = VE_INIT_RAM + XT_INIT_RAM: +007d50 7001 .dw DO_COLON + PFA_INI_RAM: ; ( -- ) +007d51 703d .dw XT_DOLITERAL +007d52 006e .dw EE_INITUSER +007d53 7302 .dw XT_UP_FETCH +007d54 703d .dw XT_DOLITERAL +007d55 0022 .dw SYSUSERSIZE +007d56 7204 .dw XT_2SLASH +007d57 7d3b .dw XT_EE2RAM +007d58 7020 .dw XT_EXIT + .include "dict/compiler2.inc" + + ; included almost independently from each other + ; on a include-per-use basis + ; + .if DICT_COMPILER2 == 0 + .endif + .include "words/bounds.asm" + + ; Tools + ; convert a string to an address range + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_BOUNDS: +007d59 ff06 .dw $ff06 +007d5a 6f62 +007d5b 6e75 +007d5c 7364 .db "bounds" +007d5d 7d4a .dw VE_HEAD + .set VE_HEAD = VE_BOUNDS + XT_BOUNDS: +007d5e 7001 .dw DO_COLON + PFA_BOUNDS: + .endif +007d5f 70cf .dw XT_OVER +007d60 719d .dw XT_PLUS +007d61 70c4 .dw XT_SWAP +007d62 7020 .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: +007d63 ff03 .dw $ff03 +007d64 3e73 +007d65 0064 .db "s>d",0 +007d66 7d59 .dw VE_HEAD + .set VE_HEAD = VE_S2D + XT_S2D: +007d67 7001 .dw DO_COLON + PFA_S2D: + .endif +007d68 70b1 .dw XT_DUP +007d69 7121 .dw XT_ZEROLESS +007d6a 7020 .dw XT_EXIT + .include "words/to-body.asm" + + ; Core + ; get body from XT + VE_TO_BODY: +007d6b ff05 .dw $ff05 +007d6c 623e +007d6d 646f +007d6e 0079 .db ">body",0 +007d6f 7d63 .dw VE_HEAD + .set VE_HEAD = VE_TO_BODY + XT_TO_BODY: +007d70 7230 .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: +007d71 0008 .dw $0008 +007d72 6c32 +007d73 7469 +007d74 7265 +007d75 6c61 .db "2literal" +007d76 7d6b .dw VE_HEAD + .set VE_HEAD = VE_2LITERAL + XT_2LITERAL: +007d77 7001 .dw DO_COLON + PFA_2LITERAL: + .endif +007d78 70c4 .dw XT_SWAP +007d79 01e2 .dw XT_LITERAL +007d7a 01e2 .dw XT_LITERAL +007d7b 7020 .dw XT_EXIT + .include "words/equal.asm" + + ; Compare + ; compares two values for equality + VE_EQUAL: +007d7c ff01 .dw $ff01 +007d7d 003d .db "=",0 +007d7e 7d71 .dw VE_HEAD + .set VE_HEAD = VE_EQUAL + XT_EQUAL: +007d7f 7001 .dw DO_COLON + PFA_EQUAL: +007d80 7193 .dw XT_MINUS +007d81 711a .dw XT_ZEROEQUAL +007d82 7020 .dw XT_EXIT + .include "words/num-constants.asm" + + .endif + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_ONE: +007d83 ff01 .dw $ff01 +007d84 0031 .db "1",0 +007d85 7d7c .dw VE_HEAD + .set VE_HEAD = VE_ONE + XT_ONE: +007d86 7048 .dw PFA_DOVARIABLE + PFA_ONE: + .endif +007d87 0001 .DW 1 + + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_TWO: +007d88 ff01 .dw $ff01 +007d89 0032 .db "2",0 +007d8a 7d83 .dw VE_HEAD + .set VE_HEAD = VE_TWO + XT_TWO: +007d8b 7048 .dw PFA_DOVARIABLE + PFA_TWO: + .endif +007d8c 0002 .DW 2 + .if cpu_msp430==1 + .endif + + .if cpu_avr8==1 + VE_MINUSONE: +007d8d ff02 .dw $ff02 +007d8e 312d .db "-1" +007d8f 7d88 .dw VE_HEAD + .set VE_HEAD = VE_MINUSONE + XT_MINUSONE: +007d90 7048 .dw PFA_DOVARIABLE + PFA_MINUSONE: + .endif +007d91 ffff .DW -1 + .include "dict_appl_core.inc" + + ; do not delete it! + + .set flashlast = pc + .if (pc>FLASHEND) + .endif + + .dseg + ; define a label for the 1st free ram address + HERESTART: + .eseg + .include "amforth-eeprom.inc" +000038 ff ff + ; some configs +00003a 8b 05 CFG_DP: .dw DPSTART ; Dictionary Pointer +00003c c4 01 EE_HERE: .dw HERESTART ; Memory Allocation +00003e 92 00 EE_EHERE: .dw EHERESTART ; EEProm Memory Allocation +000040 33 04 CFG_WLSCOPE: .dw XT_GET_CURRENT ; default wordlist scope +000042 60 00 CFG_FORTHRECOGNIZER: .dw CFG_RECOGNIZERLISTLEN ; Recognizer word set + ; LEAVE stack is between data stack and return stack. +000044 b0 10 CFG_LP0: .dw stackstart+1 +000046 dd 04 CFG_TURNKEY: .dw XT_APPLTURNKEY ; TURNKEY +000048 32 75 CFG_ENVIRONMENT:.dw VE_ENVHEAD ; environmental queries +00004a 4c 00 CFG_CURRENT: .dw CFG_FORTHWORDLIST ; forth-wordlist +00004c 8d 7d CFG_FORTHWORDLIST:.dw VE_HEAD ; pre-defined (compiled in) wordlist + CFG_ORDERLISTLEN: +00004e 01 00 .dw 1 + CFG_ORDERLIST: ; list of wordlist id, exactly numwordlist entries +000050 4c 00 .dw CFG_FORTHWORDLIST ; get/set-order +000052 .byte (NUMWORDLISTS-1)*CELLSIZE ; one slot is already used + CFG_RECOGNIZERLISTLEN: +000060 02 00 .dw 2 + CFG_RECOGNIZERLIST: +000062 24 7b .dw XT_REC_FIND +000064 10 7b .dw XT_REC_NUM +000066 .byte (NUMRECOGNIZERS-2)*CELLSIZE ; two slots are already used + + EE_STOREI: +00006a 7e 73 .dw XT_DO_STOREI ; Store a cell into flash + + ; MARKER saves everything up to here. Nothing beyond gets saved + EE_MARKER: +00006c 6c 00 .dw EE_MARKER + + ; default user area + EE_INITUSER: +00006e 00 00 .dw 0 ; USER_STATE +000070 00 00 .dw 0 ; USER_FOLLOWER +000072 ff 10 .dw rstackstart ; USER_RP +000074 af 10 .dw stackstart ; USER_SP0 +000076 af 10 .dw stackstart ; USER_SP + +000078 00 00 .dw 0 ; USER_HANDLER +00007a 0a 00 .dw 10 ; USER_BASE + +00007c a7 00 .dw XT_TX ; USER_EMIT +00007e b5 00 .dw XT_TXQ ; USER_EMITQ +000080 7c 00 .dw XT_RX ; USER_KEY +000082 97 00 .dw XT_RXQ ; USER_KEYQ +000084 25 7d .dw XT_SOURCETIB ; USER_SOURCE +000086 00 00 .dw 0 ; USER_G_IN +000088 12 7d .dw XT_REFILLTIB ; USER_REFILL +00008a ea 79 .dw XT_DEFAULT_PROMPTOK +00008c 09 7a .dw XT_DEFAULT_PROMPTERROR +00008e f9 79 .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: +000090 19 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 + +"ATmega644" register use summary: +r0 : 25 r1 : 5 r2 : 10 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: 89 r17: 61 r18: 61 r19: 37 r20: 13 r21: 11 r22: 11 r23: 3 +r24: 212 r25: 145 r26: 28 r27: 17 r28: 7 r29: 4 r30: 90 r31: 49 +x : 4 y : 217 z : 50 +Registers used: 29 out of 35 (82.9%) + +"ATmega644" 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 : 3 brcs : 1 break : 0 breq : 6 brge : 1 brhc : 0 +brhs : 0 brid : 0 brie : 0 brlo : 1 brlt : 3 brmi : 3 +brne : 22 brpl : 0 brsh : 0 brtc : 0 brts : 0 brvc : 0 +brvs : 2 bset : 0 bst : 0 call : 2 cbi : 7 cbr : 1 +clc : 2 clh : 0 cli : 7 cln : 0 clr : 14 cls : 0 +clt : 0 clv : 0 clz : 0 com : 14 cp : 11 cpc : 10 +cpi : 2 cpse : 0 dec : 10 eor : 3 fmul : 0 fmuls : 0 +fmulsu: 0 icall : 0 ijmp : 1 in : 25 inc : 3 jmp : 14 +ld : 145 ldd : 4 ldi : 41 lds : 1 lpm : 16 lsl : 14 +lsr : 2 mov : 16 movw : 72 mul : 5 muls : 1 mulsu : 2 +neg : 0 nop : 0 or : 9 ori : 2 out : 22 pop : 49 +push : 43 rcall : 41 ret : 7 reti : 1 rjmp : 105 rol : 23 +ror : 6 sbc : 9 sbci : 3 sbi : 8 sbic : 3 sbis : 0 +sbiw : 16 sbr : 0 sbrc : 5 sbrs : 7 sec : 1 seh : 0 +sei : 1 sen : 0 ser : 4 ses : 0 set : 0 sev : 0 +sez : 0 sleep : 0 spm : 2 st : 81 std : 8 sts : 1 +sub : 6 subi : 3 swap : 0 tst : 0 wdr : 0 +Instructions used: 72 out of 113 (63.7%) + +"ATmega644" memory use summary [bytes]: +Segment Begin End Code Data Used Size Use% +--------------------------------------------------------------- +[.cseg] 0x000000 0x00fb24 2088 14590 16678 65536 25.4% +[.dseg] 0x000100 0x0001c4 0 196 196 4096 4.8% +[.eseg] 0x000000 0x000092 0 146 146 2048 7.1% + +Assembly complete, 0 errors, 8 warnings diff --git a/amforth-6.5/appl/eval-pollin/p644-16.map b/amforth-6.5/appl/eval-pollin/p644-16.map new file mode 100644 index 0000000..414fea5 --- /dev/null +++ b/amforth-6.5/appl/eval-pollin/p644-16.map @@ -0,0 +1,2133 @@ + +AVRASM ver. 2.1.52 p644-16.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 00000096 +EQU SIGNATURE_002 00000009 +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 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 ADMUX 0000007c +EQU ADCSRB 0000007b +EQU ADCSRA 0000007a +EQU ADCH 00000079 +EQU ADCL 00000078 +EQU PCMSK3 00000073 +EQU TIMSK2 00000070 +EQU TIMSK1 0000006f +EQU TIMSK0 0000006e +EQU PCMSK2 0000006d +EQU PCMSK1 0000006c +EQU PCMSK0 0000006b +EQU EICRA 00000069 +EQU PCICR 00000068 +EQU OSCCAL 00000066 +EQU PRR 00000064 +EQU CLKPR 00000061 +EQU WDTCSR 00000060 +EQU SREG 0000003f +EQU SPL 0000003d +EQU SPH 0000003e +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 TIFR2 00000017 +EQU TIFR1 00000016 +EQU TIFR0 00000015 +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 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 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 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 SPMEN 00000000 +EQU PGERS 00000001 +EQU PGWRT 00000002 +EQU BLBSET 00000003 +EQU RWWSRE 00000004 +EQU SIGRD 00000005 +EQU RWWSB 00000006 +EQU SPMIE 00000007 +EQU ISC00 00000000 +EQU ISC01 00000001 +EQU ISC10 00000002 +EQU ISC11 00000003 +EQU ISC20 00000004 +EQU ISC21 00000005 +EQU INT0 00000000 +EQU INT1 00000001 +EQU INT2 00000002 +EQU INTF0 00000000 +EQU INTF1 00000001 +EQU INTF2 00000002 +EQU PCIE0 00000000 +EQU PCIE1 00000001 +EQU PCIE2 00000002 +EQU PCIE3 00000003 +EQU PCIF0 00000000 +EQU PCIF1 00000001 +EQU PCIF2 00000002 +EQU PCIF3 00000003 +EQU PCINT24 00000000 +EQU PCINT25 00000001 +EQU PCINT26 00000002 +EQU PCINT27 00000003 +EQU PCINT28 00000004 +EQU PCINT29 00000005 +EQU PCINT30 00000006 +EQU PCINT31 00000007 +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 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 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 TOIE1 00000000 +EQU OCIE1A 00000001 +EQU OCIE1B 00000002 +EQU ICIE1 00000005 +EQU TOV1 00000000 +EQU OCF1A 00000001 +EQU OCF1B 00000002 +EQU ICF1 00000005 +EQU WGM10 00000000 +EQU PWM10 00000000 +EQU WGM11 00000001 +EQU PWM11 00000001 +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 CTC1 00000003 +EQU WGM13 00000004 +EQU ICES1 00000006 +EQU ICNC1 00000007 +EQU FOC1B 00000006 +EQU FOC1A 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 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 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 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 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 PRADC 00000000 +EQU PRUSART0 00000001 +EQU PRSPI 00000002 +EQU PRTIM1 00000003 +EQU PRTIM0 00000005 +EQU PRTIM2 00000006 +EQU PRTWI 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 00007fff +EQU IOEND 000000ff +EQU SRAM_START 00000100 +EQU SRAM_SIZE 00001000 +EQU RAMEND 000010ff +EQU XRAMEND 00000000 +EQU E2END 000007ff +EQU EEPROMEND 000007ff +EQU EEADRBITS 0000000b +EQU NRWW_START_ADDR 00007000 +EQU NRWW_STOP_ADDR 00007fff +EQU RWW_START_ADDR 00000000 +EQU RWW_STOP_ADDR 00006fff +EQU PAGESIZE 00000080 +EQU FIRSTBOOTSTART 00007e00 +EQU SECONDBOOTSTART 00007c00 +EQU THIRDBOOTSTART 00007800 +EQU FOURTHBOOTSTART 00007000 +EQU SMALLBOOTSTART 00007e00 +EQU LARGEBOOTSTART 00007000 +EQU INT0addr 00000002 +EQU INT1addr 00000004 +EQU INT2addr 00000006 +EQU PCI0addr 00000008 +EQU PCI1addr 0000000a +EQU PCI2addr 0000000c +EQU PCI3addr 0000000e +EQU WDTaddr 00000010 +EQU OC2Aaddr 00000012 +EQU OC2Baddr 00000014 +EQU OVF2addr 00000016 +EQU ICP1addr 00000018 +EQU OC1Aaddr 0000001a +EQU OC1Baddr 0000001c +EQU OVF1addr 0000001e +EQU OC0Aaddr 00000020 +EQU OC0Baddr 00000022 +EQU OVF0addr 00000024 +EQU SPIaddr 00000026 +EQU URXC0addr 00000028 +EQU UDRE0addr 0000002a +EQU UTXC0addr 0000002c +EQU ACIaddr 0000002e +EQU ADCCaddr 00000030 +EQU ERDYaddr 00000032 +EQU TWIaddr 00000034 +EQU SPMRaddr 00000036 +EQU INT_VECTORS_SIZE 00000038 +EQU ramstart 00000100 +EQU CELLSIZE 00000002 +SET WANT_ANALOG_COMPARATOR 00000000 +SET WANT_USART0 00000000 +SET WANT_PORTA 00000000 +SET WANT_PORTB 00000000 +SET WANT_PORTC 00000000 +SET WANT_PORTD 00000000 +SET WANT_TIMER_COUNTER_0 00000000 +SET WANT_TIMER_COUNTER_2 00000000 +SET WANT_WATCHDOG 00000000 +SET WANT_JTAG 00000000 +SET WANT_BOOT_LOAD 00000000 +SET WANT_EXTERNAL_INTERRUPT 00000000 +SET WANT_AD_CONVERTER 00000000 +SET WANT_TIMER_COUNTER_1 00000000 +SET WANT_EEPROM 00000000 +SET WANT_TWI 00000000 +SET WANT_SPI 00000000 +SET WANT_CPU 00000000 +EQU intvecsize 00000002 +EQU pclen 00000002 +CSEG isr 0000012d +EQU INTVECTORS 0000001c +CSEG mcu_info 00000037 +CSEG mcu_ramsize 00000037 +CSEG mcu_eepromsize 00000038 +CSEG mcu_maxdp 00000039 +CSEG mcu_numints 0000003a +CSEG mcu_name 0000003b +SET codestart 00000041 +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 000010ff +SET stackstart 000010af +SET NUMWORDLISTS 00000008 +SET NUMRECOGNIZERS 00000004 +SET BAUD 00009600 +SET BAUD_MAXERROR 0000001e +SET VE_HEAD 00007d8d +SET VE_ENVHEAD 00007532 +SET AMFORTH_RO_SEG 00007001 +EQU F_CPU 00f42400 +EQU TIMER_INT 00000016 +EQU BAUDRATE_LOW 000000c4 +EQU BAUDRATE_HIGH 000000c5 +EQU USART_C 000000c2 +EQU USART_B 000000c1 +EQU USART_A 000000c0 +EQU USART_DATA 000000c6 +EQU URXCaddr 00000028 +EQU UDREaddr 0000002a +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 00000100 +DSEG usart_rx_in 00000110 +DSEG usart_rx_out 00000111 +CSEG VE_TO_RXBUF 00000041 +CSEG XT_TO_RXBUF 00000047 +CSEG PFA_rx_tobuf 00000048 +CSEG DO_NEXT 00007005 +CSEG VE_ISR_RX 00000058 +CSEG XT_ISR_RX 0000005d +CSEG DO_COLON 00007001 +CSEG usart_rx_isr 0000005e +CSEG XT_DOLITERAL 0000703d +CSEG XT_CFETCH 00007098 +CSEG XT_DUP 000070b1 +CSEG XT_EQUAL 00007d7f +CSEG XT_DOCONDBRANCH 00007036 +CSEG usart_rx_isr1 00000068 +CSEG XT_COLD 00007a59 +CSEG XT_EXIT 00007020 +CSEG XT_USART_INIT_RX_BUFFER 0000006a +CSEG PFA_USART_INIT_RX_BUFFER 0000006b +CSEG XT_INTSTORE 00007487 +CSEG XT_ZERO 00007154 +CSEG XT_FILL 000074cf +CSEG VE_RX_BUFFER 00000077 +CSEG XT_RX_BUFFER 0000007c +CSEG PFA_RX_BUFFER 0000007d +CSEG XT_RXQ_BUFFER 00000097 +CSEG XT_PLUS 0000719d +CSEG XT_SWAP 000070c4 +CSEG XT_1PLUS 0000722f +CSEG XT_AND 00007213 +CSEG XT_CSTORE 0000708d +CSEG VE_RXQ_BUFFER 00000091 +CSEG PFA_RXQ_BUFFER 00000098 +CSEG XT_PAUSE 00007a51 +CSEG XT_NOTEQUAL 00007113 +SET XT_RX 0000007c +SET XT_RXQ 00000097 +SET XT_USART_INIT_RX 0000006a +CSEG VE_TX_POLL 000000a1 +CSEG XT_TX_POLL 000000a7 +CSEG PFA_TX_POLL 000000a8 +CSEG XT_TXQ_POLL 000000b5 +CSEG VE_TXQ_POLL 000000af +CSEG PFA_TXQ_POLL 000000b6 +SET XT_TX 000000a7 +SET XT_TXQ 000000b5 +SET XT_USART_INIT_TX 00000000 +CSEG VE_UBRR 000000be +CSEG XT_UBRR 000000c2 +CSEG PFA_DOVALUE1 0000706f +CSEG PFA_UBRR 000000c3 +ESEG EE_UBRRVAL 00000090 +CSEG XT_EDEFERFETCH 00007bb4 +CSEG XT_EDEFERSTORE 00007bbe +CSEG VE_USART 000000c6 +CSEG XT_USART 000000cb +CSEG PFA_USART 000000cc +CSEG XT_BYTESWAP 000072f9 +EQU OW_PORT 00000005 +EQU OW_BIT 00000004 +SET OW_DDR 00000004 +SET OW_PIN 00000003 +CSEG VE_OW_RESET 000000e1 +CSEG XT_OW_RESET 000000e7 +CSEG PFA_OW_RESET 000000e8 +SET cycles 00000000 +SET loop_cycles 00000fa0 +CSEG VE_OW_SLOT 00000105 +CSEG XT_OW_SLOT 0000010b +CSEG PFA_OW_SLOT 0000010c +CSEG PFA_OW_SLOT0 00000119 +SET AMFORTH_NRWW_SIZE 00001ffc +SET corepc 0000012d +CSEG PFA_COLD 00007a5a +ESEG intvec 00000000 +DSEG intcnt 00000112 +CSEG VE_MPLUS 00000144 +CSEG XT_MPLUS 00000147 +CSEG PFA_MPLUS 00000148 +CSEG XT_S2D 00007d67 +CSEG XT_DPLUS 00007415 +CSEG VE_UDSTAR 0000014b +CSEG XT_UDSTAR 0000014f +CSEG PFA_UDSTAR 00000150 +CSEG XT_TO_R 000070ff +CSEG XT_UMSTAR 000071e0 +CSEG XT_DROP 000070d9 +CSEG XT_R_FROM 000070f6 +CSEG XT_ROT 000070e1 +CSEG VE_UMAX 0000015a +CSEG XT_UMAX 0000015e +CSEG PFA_UMAX 0000015f +CSEG XT_2DUP 00007565 +CSEG XT_ULESS 0000715c +CSEG UMAX1 00000164 +CSEG VE_UMIN 00000166 +CSEG XT_UMIN 0000016a +CSEG PFA_UMIN 0000016b +CSEG XT_UGREATER 00007167 +CSEG UMIN1 00000170 +CSEG XT_IMMEDIATEQ 00000172 +CSEG PFA_IMMEDIATEQ 00000173 +CSEG XT_ZEROEQUAL 0000711a +CSEG IMMEDIATEQ1 0000017b +CSEG XT_ONE 00007d86 +CSEG XT_TRUE 0000714b +CSEG VE_NAME2FLAGS 0000017d +CSEG XT_NAME2FLAGS 00000184 +CSEG PFA_NAME2FLAGS 00000185 +CSEG XT_FETCHI 000073cb +CSEG VE_NEWEST 0000018a +CSEG XT_NEWEST 0000018f +CSEG PFA_DOVARIABLE 00007048 +CSEG PFA_NEWEST 00000190 +DSEG ram_newest 0000012e +CSEG VE_LATEST 00000191 +CSEG XT_LATEST 00000196 +CSEG PFA_LATEST 00000197 +DSEG ram_latest 00000132 +CSEG VE_DOCREATE 00000198 +CSEG XT_DOCREATE 0000019e +CSEG PFA_DOCREATE 0000019f +CSEG XT_PARSENAME 000079b4 +CSEG XT_WLSCOPE 000002f5 +CSEG XT_CELLPLUS 0000755e +CSEG XT_STORE 00007081 +CSEG XT_HEADER 000002da +CSEG VE_BACKSLASH 000001a9 +CSEG XT_BACKSLASH 000001ac +CSEG PFA_BACKSLASH 000001ad +CSEG XT_SOURCE 0000799b +CSEG XT_NIP 000070f0 +CSEG XT_TO_IN 0000757e +CSEG VE_LPAREN 000001b2 +CSEG XT_LPAREN 000001b5 +CSEG PFA_LPAREN 000001b6 +CSEG XT_PARSE 00007987 +CSEG XT_2DROP 0000756e +CSEG VE_COMPILE 000001bb +CSEG XT_COMPILE 000001c1 +CSEG PFA_COMPILE 000001c2 +CSEG XT_ICELLPLUS 00007bab +CSEG XT_COMMA 000001cc +CSEG VE_COMMA 000001c9 +CSEG PFA_COMMA 000001cd +CSEG XT_DP 000075ae +CSEG XT_STOREI 00007373 +CSEG XT_DOTO 00007b99 +CSEG PFA_DP 000075af +CSEG VE_BRACKETTICK 000001d4 +CSEG XT_BRACKETTICK 000001d8 +CSEG PFA_BRACKETTICK 000001d9 +CSEG XT_TICK 0000780a +CSEG XT_LITERAL 000001e2 +CSEG VE_LITERAL 000001dc +CSEG PFA_LITERAL 000001e3 +CSEG VE_SLITERAL 000001e7 +CSEG XT_SLITERAL 000001ed +CSEG PFA_SLITERAL 000001ee +CSEG XT_DOSLITERAL 0000776d +CSEG XT_SCOMMA 0000777b +CSEG XT_GMARK 000001f2 +CSEG PFA_GMARK 000001f3 +CSEG XT_GRESOLVE 000001f7 +CSEG PFA_GRESOLVE 000001f8 +CSEG XT_QSTACK 00007b57 +CSEG XT_LMARK 000001fd +CSEG PFA_LMARK 000001fe +CSEG XT_LRESOLVE 00000200 +CSEG PFA_LRESOLVE 00000201 +CSEG VE_AHEAD 00000204 +CSEG XT_AHEAD 00000209 +CSEG PFA_AHEAD 0000020a +CSEG XT_DOBRANCH 0000702f +CSEG VE_IF 0000020e +CSEG XT_IF 00000211 +CSEG PFA_IF 00000212 +CSEG VE_ELSE 00000216 +CSEG XT_ELSE 0000021a +CSEG PFA_ELSE 0000021b +CSEG VE_THEN 00000221 +CSEG XT_THEN 00000225 +CSEG PFA_THEN 00000226 +CSEG VE_BEGIN 00000228 +CSEG XT_BEGIN 0000022d +CSEG PFA_BEGIN 0000022e +CSEG VE_WHILE 00000230 +CSEG XT_WHILE 00000235 +CSEG PFA_WHILE 00000236 +CSEG VE_REPEAT 00000239 +CSEG XT_REPEAT 0000023e +CSEG PFA_REPEAT 0000023f +CSEG XT_AGAIN 00000252 +CSEG VE_UNTIL 00000242 +CSEG XT_UNTIL 00000247 +CSEG PFA_UNTIL 00000248 +CSEG VE_AGAIN 0000024d +CSEG PFA_AGAIN 00000253 +CSEG VE_DO 00000257 +CSEG XT_DO 0000025a +CSEG PFA_DO 0000025b +CSEG XT_DODO 0000729b +CSEG XT_TO_L 000002b5 +CSEG VE_LOOP 00000261 +CSEG XT_LOOP 00000265 +CSEG PFA_LOOP 00000266 +CSEG XT_DOLOOP 000072c9 +CSEG XT_ENDLOOP 0000029c +CSEG VE_PLUSLOOP 0000026a +CSEG XT_PLUSLOOP 0000026f +CSEG PFA_PLUSLOOP 00000270 +CSEG XT_DOPLUSLOOP 000072ba +CSEG VE_LEAVE 00000274 +CSEG XT_LEAVE 00000279 +CSEG PFA_LEAVE 0000027a +CSEG XT_UNLOOP 000072d4 +CSEG VE_QDO 0000027f +CSEG XT_QDO 00000283 +CSEG PFA_QDO 00000284 +CSEG XT_QDOCHECK 0000028b +CSEG PFA_QDOCHECK 0000028c +CSEG PFA_QDOCHECK1 00000293 +CSEG XT_INVERT 000071fd +CSEG VE_ENDLOOP 00000296 +CSEG PFA_ENDLOOP 0000029d +CSEG LOOP1 0000029e +CSEG XT_L_FROM 000002a9 +CSEG XT_QDUP 000070b9 +CSEG LOOP2 000002a5 +CSEG VE_L_FROM 000002a6 +CSEG PFA_L_FROM 000002aa +CSEG XT_LP 000002c8 +CSEG XT_FETCH 00007079 +CSEG XT_PLUSSTORE 00007265 +CSEG VE_TO_L 000002b2 +CSEG PFA_TO_L 000002b6 +CSEG XT_TWO 00007d8b +CSEG VE_LP0 000002bd +CSEG XT_LP0 000002c1 +CSEG PFA_LP0 000002c2 +ESEG CFG_LP0 00000044 +CSEG VE_LP 000002c5 +CSEG PFA_LP 000002c9 +DSEG ram_lp 00000134 +CSEG VE_CREATE 000002ca +CSEG XT_CREATE 000002cf +CSEG PFA_CREATE 000002d0 +CSEG XT_REVEAL 000002fe +CSEG PFA_DOCONSTANT 00007052 +CSEG VE_HEADER 000002d5 +CSEG PFA_HEADER 000002db +CSEG XT_GREATERZERO 00007128 +CSEG PFA_HEADER1 000002ec +CSEG XT_OR 0000721c +CSEG XT_DOSCOMMA 0000777f +CSEG XT_FETCHE 0000735f +CSEG XT_THROW 00007841 +CSEG VE_WLSCOPE 000002ef +CSEG PFA_DODEFER1 00007c13 +CSEG PFA_WLSCOPE 000002f6 +ESEG CFG_WLSCOPE 00000040 +CSEG VE_REVEAL 000002f9 +CSEG PFA_REVEAL 000002ff +CSEG REVEAL1 00000309 +CSEG XT_STOREE 0000733b +CSEG VE_DOES 0000030a +CSEG XT_DOES 0000030f +CSEG PFA_DOES 00000310 +CSEG XT_DODOES 00000322 +CSEG DO_DODOES 00000317 +CSEG PFA_DODOES 00000323 +CSEG XT_NFA2CFA 00007c7e +CSEG VE_COLON 0000032b +CSEG XT_COLON 0000032e +CSEG PFA_COLON 0000032f +CSEG XT_COLONNONAME 00000339 +CSEG VE_COLONNONAME 00000333 +CSEG PFA_COLONNONAME 0000033a +CSEG XT_RBRACKET 0000034e +CSEG VE_SEMICOLON 00000342 +CSEG XT_SEMICOLON 00000345 +CSEG PFA_SEMICOLON 00000346 +CSEG XT_LBRACKET 00000356 +CSEG VE_RBRACKET 0000034b +CSEG PFA_RBRACKET 0000034f +CSEG XT_STATE 0000754b +CSEG VE_LBRACKET 00000353 +CSEG PFA_LBRACKET 00000357 +CSEG VE_VARIABLE 0000035b +CSEG XT_VARIABLE 00000361 +CSEG PFA_VARIABLE 00000362 +CSEG XT_HERE 000075bf +CSEG XT_CONSTANT 0000036d +CSEG XT_ALLOT 000075c8 +CSEG VE_CONSTANT 00000367 +CSEG PFA_CONSTANT 0000036e +CSEG VE_USER 00000374 +CSEG XT_USER 00000378 +CSEG PFA_USER 00000379 +CSEG PFA_DOUSER 00007058 +CSEG VE_RECURSE 0000037f +CSEG XT_RECURSE 00000385 +CSEG PFA_RECURSE 00000386 +CSEG VE_IMMEDIATE 0000038a +CSEG XT_IMMEDIATE 00000391 +CSEG PFA_IMMEDIATE 00000392 +CSEG XT_GET_CURRENT 00000433 +CSEG VE_BRACKETCHAR 0000039c +CSEG XT_BRACKETCHAR 000003a1 +CSEG PFA_BRACKETCHAR 000003a2 +CSEG XT_CHAR 000078ea +CSEG VE_ABORTQUOTE 000003a7 +CSEG XT_ABORTQUOTE 000003ac +CSEG PFA_ABORTQUOTE 000003ad +CSEG XT_SQUOTE 000074c1 +CSEG XT_QABORT 000003be +CSEG VE_ABORT 000003b1 +CSEG XT_ABORT 000003b6 +CSEG PFA_ABORT 000003b7 +CSEG VE_QABORT 000003b9 +CSEG PFA_QABORT 000003bf +CSEG QABO1 000003c4 +CSEG XT_ITYPE 000077a0 +CSEG VE_GET_STACK 000003c6 +CSEG XT_GET_STACK 000003cd +CSEG PFA_N_FETCH_E2 000003e4 +CSEG PFA_N_FETCH_E1 000003da +CSEG XT_I 000072ac +CSEG XT_1MINUS 00007235 +CSEG XT_CELLS 00007558 +CSEG XT_OVER 000070cf +CSEG VE_SET_STACK 000003e7 +CSEG XT_SET_STACK 000003ee +CSEG PFA_SET_STACK 000003ef +CSEG XT_ZEROLESS 00007121 +CSEG PFA_SET_STACK0 000003f6 +CSEG PFA_SET_STACK2 00000403 +CSEG PFA_SET_STACK1 000003fe +CSEG XT_TUCK 00007576 +CSEG VE_MAPSTACK 00000405 +CSEG XT_MAPSTACK 0000040c +CSEG PFA_MAPSTACK 0000040d +CSEG XT_BOUNDS 00007d5e +CSEG PFA_MAPSTACK3 00000428 +CSEG PFA_MAPSTACK1 00000417 +CSEG XT_R_FETCH 00007108 +CSEG XT_EXECUTE 0000702a +CSEG PFA_MAPSTACK2 00000424 +CSEG VE_GET_CURRENT 0000042b +CSEG PFA_GET_CURRENT 00000434 +ESEG CFG_CURRENT 0000004a +CSEG VE_GET_ORDER 00000438 +CSEG XT_GET_ORDER 0000043f +CSEG PFA_GET_ORDER 00000440 +ESEG CFG_ORDERLISTLEN 0000004e +CSEG VE_CFG_ORDER 00000444 +CSEG XT_CFG_ORDER 0000044b +CSEG PFA_CFG_ORDER 0000044c +CSEG VE_COMPARE 0000044d +CSEG XT_COMPARE 00000453 +CSEG PFA_COMPARE 00000454 +CSEG PFA_COMPARE_LOOP 00000460 +CSEG PFA_COMPARE_NOTEQUAL 0000046e +CSEG PFA_COMPARE_ENDREACHED2 00000469 +CSEG PFA_COMPARE_ENDREACHED 0000046a +CSEG PFA_COMPARE_CHECKLASTCHAR 0000046e +CSEG PFA_COMPARE_DONE 00000470 +CSEG VE_NFA2LFA 00000475 +CSEG XT_NFA2LFA 0000047b +CSEG PFA_NFA2LFA 0000047c +CSEG XT_NAME2STRING 00007c72 +CSEG XT_2SLASH 00007204 +CSEG VE_DOTS 00000481 +CSEG XT_DOTS 00000484 +CSEG PFA_DOTS 00000485 +CSEG XT_DEPTH 00007aa1 +CSEG XT_UDOT 00007448 +CSEG XT_SPACE 000077e2 +CSEG PFA_DOTS2 00000493 +CSEG PFA_DOTS1 0000048e +CSEG XT_PICK 000074af +CSEG VE_SPIRW 00000494 +CSEG XT_SPIRW 00000499 +CSEG PFA_SPIRW 0000049a +CSEG do_spirw 0000049e +CSEG do_spirw1 0000049f +CSEG VE_N_SPIR 000004a7 +CSEG XT_N_SPIR 000004ac +CSEG PFA_N_SPIR 000004ad +CSEG PFA_N_SPIR_LOOP 000004b2 +CSEG PFA_N_SPIR_LOOP1 000004b3 +CSEG VE_N_SPIW 000004be +CSEG XT_N_SPIW 000004c3 +CSEG PFA_N_SPIW 000004c4 +CSEG PFA_N_SPIW_LOOP 000004c9 +CSEG PFA_N_SPIW_LOOP1 000004cb +CSEG VE_APPLTURNKEY 000004d5 +CSEG XT_APPLTURNKEY 000004dd +CSEG PFA_APPLTURNKEY 000004de +CSEG XT_INTON 00007479 +CSEG XT_DOT_VER 00007b64 +CSEG XT_F_CPU 00007540 +CSEG XT_UMSLASHMOD 000071c2 +CSEG XT_DECIMAL 000075dd +CSEG XT_DOT 00007722 +CSEG VE_SET_CURRENT 000004ef +CSEG XT_SET_CURRENT 000004f7 +CSEG PFA_SET_CURRENT 000004f8 +CSEG VE_WORDLIST 000004fc +CSEG XT_WORDLIST 00000502 +CSEG PFA_WORDLIST 00000503 +CSEG XT_EHERE 000075b7 +CSEG PFA_EHERE 000075b8 +CSEG VE_FORTHWORDLIST 0000050c +CSEG XT_FORTHWORDLIST 00000515 +CSEG PFA_FORTHWORDLIST 00000516 +ESEG CFG_FORTHWORDLIST 0000004c +CSEG VE_SET_ORDER 00000517 +CSEG XT_SET_ORDER 0000051e +CSEG PFA_SET_ORDER 0000051f +CSEG VE_SET_RECOGNIZERS 00000523 +CSEG XT_SET_RECOGNIZERS 0000052d +CSEG PFA_SET_RECOGNIZERS 0000052e +ESEG CFG_RECOGNIZERLISTLEN 00000060 +CSEG VE_GET_RECOGNIZERS 00000532 +CSEG XT_GET_RECOGNIZERS 0000053c +CSEG PFA_GET_RECOGNIZERS 0000053d +CSEG VE_CODE 00000541 +CSEG XT_CODE 00000545 +CSEG PFA_CODE 00000546 +CSEG VE_ENDCODE 0000054c +CSEG XT_ENDCODE 00000552 +CSEG PFA_ENDCODE 00000553 +CSEG VE_MARKER 00000558 +CSEG XT_MARKER 0000055e +CSEG PFA_MARKER 0000055f +ESEG EE_MARKER 0000006c +CSEG VE_POSTPONE 00000562 +CSEG XT_POSTPONE 00000568 +CSEG PFA_POSTPONE 00000569 +CSEG XT_FORTHRECOGNIZER 00007acc +CSEG XT_RECOGNIZE 00007ad7 +CSEG VE_2R_FETCH 00000577 +CSEG XT_2R_FETCH 0000057b +CSEG PFA_2R_FETCH 0000057c +SET DPSTART 0000058b +CSEG DO_INTERRUPT 00007014 +CSEG DO_EXECUTE 0000700d +CSEG XT_ISREXEC 000074a2 +CSEG VE_EXIT 0000701c +CSEG PFA_EXIT 00007021 +CSEG VE_EXECUTE 00007024 +CSEG PFA_EXECUTE 0000702b +CSEG PFA_DOBRANCH 00007030 +CSEG PFA_DOCONDBRANCH 00007037 +CSEG PFA_DOLITERAL 0000703e +CSEG XT_DOVARIABLE 00007047 +CSEG XT_DOCONSTANT 00007051 +CSEG XT_DOUSER 00007057 +CSEG VE_DOVALUE 00007063 +CSEG XT_DOVALUE 00007069 +CSEG PFA_DOVALUE 0000706a +CSEG VE_FETCH 00007076 +CSEG PFA_FETCH 0000707a +CSEG PFA_FETCHRAM 0000707a +CSEG VE_STORE 0000707e +CSEG PFA_STORE 00007082 +CSEG PFA_STORERAM 00007082 +CSEG VE_CSTORE 0000708a +CSEG PFA_CSTORE 0000708e +CSEG VE_CFETCH 00007095 +CSEG PFA_CFETCH 00007099 +CSEG VE_FETCHU 0000709d +CSEG XT_FETCHU 000070a0 +CSEG PFA_FETCHU 000070a1 +CSEG XT_UP_FETCH 00007302 +CSEG VE_STOREU 000070a5 +CSEG XT_STOREU 000070a8 +CSEG PFA_STOREU 000070a9 +CSEG VE_DUP 000070ad +CSEG PFA_DUP 000070b2 +CSEG VE_QDUP 000070b5 +CSEG PFA_QDUP 000070ba +CSEG PFA_QDUP1 000070bf +CSEG VE_SWAP 000070c0 +CSEG PFA_SWAP 000070c5 +CSEG VE_OVER 000070cb +CSEG PFA_OVER 000070d0 +CSEG VE_DROP 000070d5 +CSEG PFA_DROP 000070da +CSEG VE_ROT 000070dd +CSEG PFA_ROT 000070e2 +CSEG VE_NIP 000070ec +CSEG PFA_NIP 000070f1 +CSEG VE_R_FROM 000070f3 +CSEG PFA_R_FROM 000070f7 +CSEG VE_TO_R 000070fc +CSEG PFA_TO_R 00007100 +CSEG VE_R_FETCH 00007105 +CSEG PFA_R_FETCH 00007109 +CSEG VE_NOTEQUAL 00007110 +CSEG PFA_NOTEQUAL 00007114 +CSEG VE_ZEROEQUAL 00007117 +CSEG PFA_ZEROEQUAL 0000711b +CSEG PFA_ZERO1 00007157 +CSEG PFA_TRUE1 0000714e +CSEG VE_ZEROLESS 0000711e +CSEG PFA_ZEROLESS 00007122 +CSEG VE_GREATERZERO 00007125 +CSEG PFA_GREATERZERO 00007129 +CSEG VE_DGREATERZERO 0000712e +CSEG XT_DGREATERZERO 00007132 +CSEG PFA_DGREATERZERO 00007133 +CSEG VE_DXT_ZEROLESS 0000713c +CSEG XT_DXT_ZEROLESS 00007140 +CSEG PFA_DXT_ZEROLESS 00007141 +CSEG VE_TRUE 00007147 +CSEG PFA_TRUE 0000714c +CSEG VE_ZERO 00007151 +CSEG PFA_ZERO 00007155 +CSEG VE_ULESS 00007159 +CSEG PFA_ULESS 0000715d +CSEG VE_UGREATER 00007164 +CSEG PFA_UGREATER 00007168 +CSEG VE_LESS 0000716b +CSEG XT_LESS 0000716e +CSEG PFA_LESS 0000716f +CSEG PFA_LESSDONE 00007173 +CSEG VE_GREATER 00007175 +CSEG XT_GREATER 00007178 +CSEG PFA_GREATER 00007179 +CSEG PFA_GREATERDONE 0000717d +CSEG VE_LOG2 00007180 +CSEG XT_LOG2 00007184 +CSEG PFA_LOG2 00007185 +CSEG PFA_LOG2_1 00007188 +CSEG PFA_LOG2_2 0000718e +CSEG VE_MINUS 00007190 +CSEG XT_MINUS 00007193 +CSEG PFA_MINUS 00007194 +CSEG VE_PLUS 0000719a +CSEG PFA_PLUS 0000719e +CSEG VE_MSTAR 000071a3 +CSEG XT_MSTAR 000071a6 +CSEG PFA_MSTAR 000071a7 +CSEG VE_UMSLASHMOD 000071bd +CSEG PFA_UMSLASHMOD 000071c3 +CSEG PFA_UMSLASHMODmod 000071c8 +CSEG PFA_UMSLASHMODmod_loop 000071c9 +CSEG PFA_UMSLASHMODmod_loop_control 000071d6 +CSEG PFA_UMSLASHMODmod_subtract 000071d3 +CSEG PFA_UMSLASHMODmod_done 000071d8 +CSEG VE_UMSTAR 000071dc +CSEG PFA_UMSTAR 000071e1 +CSEG VE_INVERT 000071f8 +CSEG PFA_INVERT 000071fe +CSEG VE_2SLASH 00007201 +CSEG PFA_2SLASH 00007205 +CSEG VE_2STAR 00007208 +CSEG XT_2STAR 0000720b +CSEG PFA_2STAR 0000720c +CSEG VE_AND 0000720f +CSEG PFA_AND 00007214 +CSEG VE_OR 00007219 +CSEG PFA_OR 0000721d +CSEG VE_XOR 00007222 +CSEG XT_XOR 00007226 +CSEG PFA_XOR 00007227 +CSEG VE_1PLUS 0000722c +CSEG PFA_1PLUS 00007230 +CSEG VE_1MINUS 00007232 +CSEG PFA_1MINUS 00007236 +CSEG VE_QNEGATE 00007238 +CSEG XT_QNEGATE 0000723e +CSEG PFA_QNEGATE 0000723f +CSEG QNEG1 00007243 +CSEG XT_NEGATE 0000763f +CSEG VE_LSHIFT 00007244 +CSEG XT_LSHIFT 00007249 +CSEG PFA_LSHIFT 0000724a +CSEG PFA_LSHIFT1 0000724d +CSEG PFA_LSHIFT2 00007252 +CSEG VE_RSHIFT 00007253 +CSEG XT_RSHIFT 00007258 +CSEG PFA_RSHIFT 00007259 +CSEG PFA_RSHIFT1 0000725c +CSEG PFA_RSHIFT2 00007261 +CSEG VE_PLUSSTORE 00007262 +CSEG PFA_PLUSSTORE 00007266 +CSEG VE_RP_FETCH 00007272 +CSEG XT_RP_FETCH 00007276 +CSEG PFA_RP_FETCH 00007277 +CSEG VE_RP_STORE 0000727c +CSEG XT_RP_STORE 00007280 +CSEG PFA_RP_STORE 00007281 +CSEG VE_SP_FETCH 00007289 +CSEG XT_SP_FETCH 0000728d +CSEG PFA_SP_FETCH 0000728e +CSEG VE_SP_STORE 00007292 +CSEG XT_SP_STORE 00007296 +CSEG PFA_SP_STORE 00007297 +CSEG PFA_DODO 0000729c +CSEG PFA_DODO1 0000729e +CSEG VE_I 000072a9 +CSEG PFA_I 000072ad +CSEG PFA_DOPLUSLOOP 000072bb +CSEG PFA_DOPLUSLOOP_LEAVE 000072c5 +CSEG PFA_DOPLUSLOOP_NEXT 000072c2 +CSEG PFA_DOLOOP 000072ca +CSEG VE_UNLOOP 000072cf +CSEG PFA_UNLOOP 000072d5 +CSEG VE_CMOVE_G 000072da +CSEG XT_CMOVE_G 000072df +CSEG PFA_CMOVE_G 000072e0 +CSEG PFA_CMOVE_G1 000072f1 +CSEG PFA_CMOVE_G2 000072ed +CSEG VE_BYTESWAP 000072f6 +CSEG PFA_BYTESWAP 000072fa +CSEG VE_UP_FETCH 000072fe +CSEG PFA_UP_FETCH 00007303 +CSEG VE_UP_STORE 00007307 +CSEG XT_UP_STORE 0000730b +CSEG PFA_UP_STORE 0000730c +CSEG VE_1MS 00007310 +CSEG XT_1MS 00007314 +CSEG PFA_1MS 00007315 +CSEG VE_2TO_R 0000731a +CSEG XT_2TO_R 0000731e +CSEG PFA_2TO_R 0000731f +CSEG VE_2R_FROM 00007329 +CSEG XT_2R_FROM 0000732d +CSEG PFA_2R_FROM 0000732e +CSEG VE_STOREE 00007338 +CSEG PFA_STOREE 0000733c +CSEG PFA_STOREE0 0000733c +CSEG PFA_FETCHE2 0000736a +CSEG PFA_STOREE3 00007346 +CSEG PFA_STOREE1 00007351 +CSEG PFA_STOREE4 0000734d +CSEG PFA_STOREE2 00007353 +CSEG VE_FETCHE 0000735c +CSEG PFA_FETCHE 00007360 +CSEG PFA_FETCHE1 00007360 +CSEG VE_STOREI 00007370 +CSEG PFA_STOREI 00007374 +ESEG EE_STOREI 0000006a +CSEG VE_DO_STOREI_NRWW 00007377 +CSEG XT_DO_STOREI 0000737e +CSEG PFA_DO_STOREI_NRWW 0000737f +CSEG DO_STOREI_atmega 00007393 +CSEG pageload 000073a4 +CSEG DO_STOREI_writepage 0000739d +CSEG dospm 000073bd +EQU pagemask ffffff80 +CSEG pageload_loop 000073aa +CSEG pageload_newdata 000073b5 +CSEG pageload_cont 000073b7 +CSEG pageload_done 000073bc +CSEG dospm_wait_ee 000073bd +CSEG dospm_wait_spm 000073bf +CSEG VE_FETCHI 000073c8 +CSEG PFA_FETCHI 000073cc +CSEG VE_N_TO_R 000073d2 +CSEG XT_N_TO_R 000073d6 +CSEG PFA_N_TO_R 000073d7 +CSEG PFA_N_TO_R1 000073d9 +CSEG VE_N_R_FROM 000073e4 +CSEG XT_N_R_FROM 000073e8 +CSEG PFA_N_R_FROM 000073e9 +CSEG PFA_N_R_FROM1 000073ee +CSEG VE_D2STAR 000073f6 +CSEG XT_D2STAR 000073fa +CSEG PFA_D2STAR 000073fb +CSEG VE_D2SLASH 00007404 +CSEG XT_D2SLASH 00007408 +CSEG PFA_D2SLASH 00007409 +CSEG VE_DPLUS 00007412 +CSEG PFA_DPLUS 00007416 +CSEG VE_DMINUS 00007423 +CSEG XT_DMINUS 00007426 +CSEG PFA_DMINUS 00007427 +CSEG VE_DINVERT 00007435 +CSEG XT_DINVERT 0000743b +CSEG PFA_DINVERT 0000743c +CSEG VE_UDOT 00007445 +CSEG PFA_UDOT 00007449 +CSEG XT_UDDOT 0000772a +CSEG VE_UDOTR 0000744c +CSEG XT_UDOTR 00007450 +CSEG PFA_UDOTR 00007451 +CSEG XT_UDDOTR 00007733 +CSEG VE_SHOWWORDLIST 00007455 +CSEG XT_SHOWWORDLIST 0000745e +CSEG PFA_SHOWWORDLIST 0000745f +CSEG XT_SHOWWORD 00007464 +CSEG XT_TRAVERSEWORDLIST 00007c57 +CSEG PFA_SHOWWORD 00007465 +CSEG VE_WORDS 0000746a +CSEG XT_WORDS 0000746f +CSEG PFA_WORDS 00007470 +CSEG VE_INTON 00007475 +CSEG PFA_INTON 0000747a +CSEG VE_INTOFF 0000747c +CSEG XT_INTOFF 00007480 +CSEG PFA_INTOFF 00007481 +CSEG VE_INTSTORE 00007483 +CSEG PFA_INTSTORE 00007488 +CSEG VE_INTFETCH 0000748d +CSEG XT_INTFETCH 00007491 +CSEG PFA_INTFETCH 00007492 +CSEG VE_INTTRAP 00007497 +CSEG XT_INTTRAP 0000749d +CSEG PFA_INTTRAP 0000749e +CSEG PFA_ISREXEC 000074a3 +CSEG XT_ISREND 000074a7 +CSEG PFA_ISREND 000074a8 +CSEG PFA_ISREND1 000074aa +CSEG VE_PICK 000074ab +CSEG PFA_PICK 000074b0 +CSEG VE_DOTSTRING 000074b6 +CSEG XT_DOTSTRING 000074b9 +CSEG PFA_DOTSTRING 000074ba +CSEG VE_SQUOTE 000074be +CSEG PFA_SQUOTE 000074c2 +CSEG PFA_SQUOTE1 000074ca +CSEG VE_FILL 000074cb +CSEG PFA_FILL 000074d0 +CSEG PFA_FILL2 000074dc +CSEG PFA_FILL1 000074d7 +CSEG VE_ENVIRONMENT 000074de +CSEG XT_ENVIRONMENT 000074e6 +CSEG PFA_ENVIRONMENT 000074e7 +ESEG CFG_ENVIRONMENT 00000048 +CSEG VE_ENVWORDLISTS 000074e8 +CSEG XT_ENVWORDLISTS 000074ef +CSEG PFA_ENVWORDLISTS 000074f0 +CSEG VE_ENVSLASHPAD 000074f3 +CSEG XT_ENVSLASHPAD 000074f7 +CSEG PFA_ENVSLASHPAD 000074f8 +CSEG XT_PAD 00007584 +CSEG VE_ENVSLASHHOLD 000074fc +CSEG XT_ENVSLASHHOLD 00007501 +CSEG PFA_ENVSLASHHOLD 00007502 +CSEG VE_ENV_FORTHNAME 00007506 +CSEG XT_ENV_FORTHNAME 0000750d +CSEG PFA_EN_FORTHNAME 0000750e +CSEG VE_ENV_FORTHVERSION 00007515 +CSEG XT_ENV_FORTHVERSION 0000751b +CSEG PFA_EN_FORTHVERSION 0000751c +CSEG VE_ENV_CPU 0000751f +CSEG XT_ENV_CPU 00007523 +CSEG PFA_EN_CPU 00007524 +CSEG XT_ICOUNT 000077cc +CSEG VE_ENV_MCUINFO 00007528 +CSEG XT_ENV_MCUINFO 0000752e +CSEG PFA_EN_MCUINFO 0000752f +CSEG VE_ENVUSERSIZE 00007532 +CSEG XT_ENVUSERSIZE 00007537 +CSEG PFA_ENVUSERSIZE 00007538 +CSEG VE_F_CPU 0000753b +CSEG PFA_F_CPU 00007541 +CSEG VE_STATE 00007546 +CSEG PFA_STATE 0000754c +DSEG ram_state 00000136 +CSEG VE_BASE 0000754d +CSEG XT_BASE 00007551 +CSEG PFA_BASE 00007552 +CSEG VE_CELLS 00007553 +CSEG VE_CELLPLUS 00007559 +CSEG PFA_CELLPLUS 0000755f +CSEG VE_2DUP 00007561 +CSEG PFA_2DUP 00007566 +CSEG VE_2DROP 00007569 +CSEG PFA_2DROP 0000756f +CSEG VE_TUCK 00007572 +CSEG PFA_TUCK 00007577 +CSEG VE_TO_IN 0000757a +CSEG PFA_TO_IN 0000757f +CSEG VE_PAD 00007580 +CSEG PFA_PAD 00007585 +CSEG VE_EMIT 0000758a +CSEG XT_EMIT 0000758e +CSEG PFA_EMIT 0000758f +CSEG XT_UDEFERFETCH 00007bdc +CSEG XT_UDEFERSTORE 00007be8 +CSEG VE_EMITQ 00007592 +CSEG XT_EMITQ 00007597 +CSEG PFA_EMITQ 00007598 +CSEG VE_KEY 0000759b +CSEG XT_KEY 0000759f +CSEG PFA_KEY 000075a0 +CSEG VE_KEYQ 000075a3 +CSEG XT_KEYQ 000075a7 +CSEG PFA_KEYQ 000075a8 +CSEG VE_DP 000075ab +ESEG CFG_DP 0000003a +CSEG VE_EHERE 000075b2 +ESEG EE_EHERE 0000003e +CSEG VE_HERE 000075bb +CSEG PFA_HERE 000075c0 +ESEG EE_HERE 0000003c +CSEG VE_ALLOT 000075c3 +CSEG PFA_ALLOT 000075c9 +CSEG VE_BIN 000075ce +CSEG XT_BIN 000075d2 +CSEG PFA_BIN 000075d3 +CSEG VE_DECIMAL 000075d7 +CSEG PFA_DECIMAL 000075de +CSEG VE_HEX 000075e3 +CSEG XT_HEX 000075e7 +CSEG PFA_HEX 000075e8 +CSEG VE_BL 000075ed +CSEG XT_BL 000075f0 +CSEG PFA_BL 000075f1 +CSEG VE_TURNKEY 000075f2 +CSEG XT_TURNKEY 000075f8 +CSEG PFA_TURNKEY 000075f9 +ESEG CFG_TURNKEY 00000046 +CSEG VE_SLASHMOD 000075fc +CSEG XT_SLASHMOD 00007600 +CSEG PFA_SLASHMOD 00007601 +CSEG PFA_SLASHMOD_1 0000760c +CSEG PFA_SLASHMOD_2 00007612 +CSEG PFA_SLASHMOD_3 00007615 +CSEG PFA_SLASHMOD_5 00007620 +CSEG PFA_SLASHMOD_4 0000761f +CSEG PFA_SLASHMODmod_done 0000762b +CSEG PFA_SLASHMOD_6 00007629 +CSEG VE_USLASHMOD 0000762f +CSEG XT_USLASHMOD 00007634 +CSEG PFA_USLASHMOD 00007635 +CSEG VE_NEGATE 0000763a +CSEG PFA_NEGATE 00007640 +CSEG VE_SLASH 00007643 +CSEG XT_SLASH 00007646 +CSEG PFA_SLASH 00007647 +CSEG VE_MOD 0000764a +CSEG XT_MOD 0000764e +CSEG PFA_MOD 0000764f +CSEG VE_ABS 00007652 +CSEG XT_ABS 00007656 +CSEG PFA_ABS 00007657 +CSEG VE_MIN 0000765a +CSEG XT_MIN 0000765e +CSEG PFA_MIN 0000765f +CSEG PFA_MIN1 00007664 +CSEG VE_MAX 00007666 +CSEG XT_MAX 0000766a +CSEG PFA_MAX 0000766b +CSEG PFA_MAX1 00007670 +CSEG VE_WITHIN 00007672 +CSEG XT_WITHIN 00007677 +CSEG PFA_WITHIN 00007678 +CSEG VE_TOUPPER 0000767f +CSEG XT_TOUPPER 00007685 +CSEG PFA_TOUPPER 00007686 +CSEG PFA_TOUPPER0 00007691 +CSEG VE_TOLOWER 00007692 +CSEG XT_TOLOWER 00007698 +CSEG PFA_TOLOWER 00007699 +CSEG PFA_TOLOWER0 000076a4 +CSEG VE_HLD 000076a5 +CSEG XT_HLD 000076a9 +CSEG PFA_HLD 000076aa +DSEG ram_hld 00000138 +CSEG VE_HOLD 000076ab +CSEG XT_HOLD 000076af +CSEG PFA_HOLD 000076b0 +CSEG VE_L_SHARP 000076bb +CSEG XT_L_SHARP 000076be +CSEG PFA_L_SHARP 000076bf +CSEG VE_SHARP 000076c3 +CSEG XT_SHARP 000076c6 +CSEG PFA_SHARP 000076c7 +CSEG XT_UDSLASHMOD 00007743 +CSEG PFA_SHARP1 000076d4 +CSEG VE_SHARP_S 000076d9 +CSEG XT_SHARP_S 000076dc +CSEG PFA_SHARP_S 000076dd +CSEG NUMS1 000076dd +CSEG VE_SHARP_G 000076e4 +CSEG XT_SHARP_G 000076e7 +CSEG PFA_SHARP_G 000076e8 +CSEG VE_SIGN 000076ef +CSEG XT_SIGN 000076f3 +CSEG PFA_SIGN 000076f4 +CSEG PFA_SIGN1 000076fa +CSEG VE_DDOTR 000076fb +CSEG XT_DDOTR 000076ff +CSEG PFA_DDOTR 00007700 +CSEG XT_DABS 00007cd4 +CSEG XT_SPACES 000077eb +CSEG XT_TYPE 000077fb +CSEG VE_DOTR 0000770e +CSEG XT_DOTR 00007711 +CSEG PFA_DOTR 00007712 +CSEG VE_DDOT 00007717 +CSEG XT_DDOT 0000771a +CSEG PFA_DDOT 0000771b +CSEG VE_DOT 0000771f +CSEG PFA_DOT 00007723 +CSEG VE_UDDOT 00007726 +CSEG PFA_UDDOT 0000772b +CSEG VE_UDDOTR 0000772f +CSEG PFA_UDDOTR 00007734 +CSEG VE_UDSLASHMOD 0000773e +CSEG PFA_UDSLASHMOD 00007744 +CSEG VE_DIGITQ 0000774e +CSEG XT_DIGITQ 00007753 +CSEG PFA_DIGITQ 00007754 +CSEG PFA_DOSLITERAL 0000776e +CSEG VE_SCOMMA 00007778 +CSEG PFA_SCOMMA 0000777c +CSEG PFA_DOSCOMMA 00007780 +CSEG PFA_SCOMMA2 00007792 +CSEG PFA_SCOMMA1 0000778c +CSEG PFA_SCOMMA3 00007799 +CSEG VE_ITYPE 0000779b +CSEG PFA_ITYPE 000077a1 +CSEG PFA_ITYPE2 000077b4 +CSEG PFA_ITYPE1 000077ac +CSEG XT_LOWEMIT 000077c1 +CSEG XT_HIEMIT 000077bd +CSEG PFA_ITYPE3 000077bb +CSEG PFA_HIEMIT 000077be +CSEG PFA_LOWEMIT 000077c2 +CSEG VE_ICOUNT 000077c7 +CSEG PFA_ICOUNT 000077cd +CSEG VE_CR 000077d2 +CSEG XT_CR 000077d5 +CSEG PFA_CR 000077d6 +CSEG VE_SPACE 000077dd +CSEG PFA_SPACE 000077e3 +CSEG VE_SPACES 000077e6 +CSEG PFA_SPACES 000077ec +CSEG SPCS1 000077ee +CSEG SPCS2 000077f5 +CSEG VE_TYPE 000077f7 +CSEG PFA_TYPE 000077fc +CSEG PFA_TYPE2 00007806 +CSEG PFA_TYPE1 00007801 +CSEG VE_TICK 00007807 +CSEG PFA_TICK 0000780b +CSEG XT_DT_NULL 00007b4a +CSEG XT_NOOP 00007b7f +CSEG PFA_TICK1 0000781c +CSEG VE_HANDLER 0000781e +CSEG XT_HANDLER 00007824 +CSEG PFA_HANDLER 00007825 +CSEG VE_CATCH 00007826 +CSEG XT_CATCH 0000782b +CSEG PFA_CATCH 0000782c +CSEG VE_THROW 0000783c +CSEG PFA_THROW 00007842 +CSEG PFA_THROW1 00007848 +CSEG VE_CSKIP 00007855 +CSEG XT_CSKIP 0000785a +CSEG PFA_CSKIP 0000785b +CSEG PFA_CSKIP1 0000785c +CSEG PFA_CSKIP2 00007869 +CSEG XT_SLASHSTRING 000079a5 +CSEG VE_CSCAN 0000786c +CSEG XT_CSCAN 00007871 +CSEG PFA_CSCAN 00007872 +CSEG PFA_CSCAN1 00007874 +CSEG PFA_CSCAN2 00007886 +CSEG VE_ACCEPT 0000788c +CSEG XT_ACCEPT 00007891 +CSEG PFA_ACCEPT 00007892 +CSEG ACC1 00007896 +CSEG XT_CRLFQ 000078d2 +CSEG ACC5 000078c4 +CSEG ACC3 000078b4 +CSEG ACC6 000078b2 +CSEG XT_BS 000078ca +CSEG ACC4 000078c2 +CSEG PFA_ACCEPT6 000078bb +CSEG VE_REFILL 000078dd +CSEG XT_REFILL 000078e2 +CSEG PFA_REFILL 000078e3 +CSEG VE_CHAR 000078e6 +CSEG PFA_CHAR 000078eb +CSEG VE_NUMBER 000078ef +CSEG XT_NUMBER 000078f4 +CSEG PFA_NUMBER 000078f5 +CSEG XT_QSIGN 00007938 +CSEG XT_SET_BASE 0000794b +CSEG PFA_NUMBER0 0000790b +CSEG XT_TO_NUMBER 00007969 +CSEG PFA_NUMBER1 0000792d +CSEG PFA_NUMBER2 00007924 +CSEG PFA_NUMBER6 00007925 +CSEG PFA_NUMBER3 00007921 +CSEG XT_DNEGATE 00007ce1 +CSEG PFA_NUMBER5 00007933 +CSEG PFA_NUMBER4 00007932 +CSEG PFA_QSIGN 00007939 +CSEG PFA_NUMBERSIGN_DONE 00007944 +CSEG XT_BASES 00007946 +CSEG PFA_SET_BASE 0000794c +CSEG SET_BASE1 00007961 +CSEG SET_BASE2 00007962 +CSEG VE_TO_NUMBER 00007963 +CSEG TONUM1 0000796a +CSEG TONUM3 00007981 +CSEG TONUM2 00007975 +CSEG XT_2SWAP 00007d05 +CSEG VE_PARSE 00007982 +CSEG PFA_PARSE 00007988 +CSEG VE_SOURCE 00007996 +CSEG PFA_SOURCE 0000799c +CSEG VE_SLASHSTRING 0000799f +CSEG PFA_SLASHSTRING 000079a6 +CSEG VE_PARSENAME 000079ad +CSEG PFA_PARSENAME 000079b5 +CSEG XT_SKIPSCANCHAR 000079b8 +CSEG PFA_SKIPSCANCHAR 000079b9 +CSEG VE_FINDXT 000079ca +CSEG XT_FINDXT 000079d0 +CSEG PFA_FINDXT 000079d1 +CSEG XT_FINDXTA 000079dc +CSEG PFA_FINDXT1 000079db +CSEG PFA_FINDXTA 000079dd +CSEG XT_SEARCH_WORDLIST 00007c25 +CSEG PFA_FINDXTA1 000079e9 +CSEG XT_DEFAULT_PROMPTOK 000079ea +CSEG PFA_DEFAULT_PROMPTOK 000079eb +CSEG VE_PROMPTOK 000079f1 +CSEG XT_PROMPTOK 000079f5 +CSEG PFA_PROMPTOK 000079f6 +CSEG XT_DEFAULT_PROMPTREADY 000079f9 +CSEG PFA_DEFAULT_PROMPTREADY 000079fa +CSEG VE_PROMPTREADY 00007a00 +CSEG XT_PROMPTREADY 00007a05 +CSEG PFA_PROMPTREADY 00007a06 +CSEG XT_DEFAULT_PROMPTERROR 00007a09 +CSEG PFA_DEFAULT_PROMPTERROR 00007a0a +CSEG VE_PROMPTERROR 00007a1b +CSEG XT_PROMPTERROR 00007a20 +CSEG PFA_PROMPTERROR 00007a21 +CSEG VE_QUIT 00007a24 +CSEG XT_QUIT 00007a28 +CSEG PFA_QUIT 00007a29 +CSEG XT_SP0 00007a89 +CSEG XT_RP0 00007a96 +CSEG PFA_QUIT2 00007a31 +CSEG PFA_QUIT4 00007a37 +CSEG PFA_QUIT3 00007a49 +CSEG XT_INTERPRET 00007aaf +CSEG PFA_QUIT5 00007a47 +CSEG VE_PAUSE 00007a4c +CSEG PFA_PAUSE 00007a52 +DSEG ram_pause 0000013a +CSEG XT_RDEFERFETCH 00007bc8 +CSEG XT_RDEFERSTORE 00007bd2 +CSEG VE_COLD 00007a55 +CSEG clearloop 00007a61 +DSEG ram_user1 0000013c +CSEG PFA_WARM 00007a7c +CSEG VE_WARM 00007a77 +CSEG XT_WARM 00007a7b +CSEG XT_INIT_RAM 00007d50 +CSEG XT_DEFERSTORE 00007bf3 +CSEG VE_SP0 00007a85 +CSEG PFA_SP0 00007a8a +CSEG VE_SP 00007a8d +CSEG XT_SP 00007a90 +CSEG PFA_SP 00007a91 +CSEG VE_RP0 00007a92 +CSEG PFA_RP0 00007a97 +CSEG XT_DORP0 00007a9a +CSEG PFA_DORP0 00007a9b +CSEG VE_DEPTH 00007a9c +CSEG PFA_DEPTH 00007aa2 +CSEG VE_INTERPRET 00007aa8 +CSEG PFA_INTERPRET 00007ab0 +CSEG PFA_INTERPRET2 00007ac0 +CSEG PFA_INTERPRET1 00007abb +CSEG VE_FORTHRECOGNIZER 00007ac2 +CSEG PFA_FORTHRECOGNIZER 00007acd +ESEG CFG_FORTHRECOGNIZER 00000042 +CSEG VE_RECOGNIZE 00007ad0 +CSEG PFA_RECOGNIZE 00007ad8 +CSEG XT_RECOGNIZE_A 00007ae2 +CSEG PFA_RECOGNIZE1 00007ae1 +CSEG PFA_RECOGNIZE_A 00007ae3 +CSEG PFA_RECOGNIZE_A1 00007af3 +CSEG VE_DT_NUM 00007af7 +CSEG XT_DT_NUM 00007afc +CSEG PFA_DT_NUM 00007afd +CSEG VE_DT_DNUM 00007b00 +CSEG XT_DT_DNUM 00007b06 +CSEG PFA_DT_DNUM 00007b07 +CSEG XT_2LITERAL 00007d77 +CSEG VE_REC_NUM 00007b0a +CSEG XT_REC_NUM 00007b10 +CSEG PFA_REC_NUM 00007b11 +CSEG PFA_REC_NONUMBER 00007b1c +CSEG PFA_REC_INTNUM2 00007b1a +CSEG VE_REC_FIND 00007b1e +CSEG XT_REC_FIND 00007b24 +CSEG PFA_REC_FIND 00007b25 +CSEG PFA_REC_WORD_FOUND 00007b2d +CSEG XT_DT_XT 00007b34 +CSEG VE_DT_XT 00007b2f +CSEG PFA_DT_XT 00007b35 +CSEG XT_R_WORD_INTERPRET 00007b38 +CSEG XT_R_WORD_COMPILE 00007b3c +CSEG PFA_R_WORD_INTERPRET 00007b39 +CSEG PFA_R_WORD_COMPILE 00007b3d +CSEG PFA_R_WORD_COMPILE1 00007b42 +CSEG VE_DT_NULL 00007b44 +CSEG PFA_DT_NULL 00007b4b +CSEG XT_FAIL 00007b4e +CSEG PFA_FAIL 00007b4f +CSEG VE_QSTACK 00007b52 +CSEG PFA_QSTACK 00007b58 +CSEG PFA_QSTACK1 00007b5f +CSEG VE_DOT_VER 00007b60 +CSEG PFA_DOT_VER 00007b65 +CSEG VE_NOOP 00007b7b +CSEG PFA_NOOP 00007b80 +CSEG VE_UNUSED 00007b81 +CSEG XT_UNUSED 00007b86 +CSEG PFA_UNUSED 00007b87 +CSEG VE_TO 00007b8b +CSEG XT_TO 00007b8e +CSEG PFA_TO 00007b8f +CSEG XT_TO_BODY 00007d70 +CSEG PFA_TO1 00007b9f +CSEG PFA_DOTO 00007b9a +CSEG VE_ICELLPLUS 00007ba5 +CSEG PFA_ICELLPLUS 00007bac +CSEG VE_EDEFERFETCH 00007bae +CSEG PFA_EDEFERFETCH 00007bb5 +CSEG VE_EDEFERSTORE 00007bb8 +CSEG PFA_EDEFERSTORE 00007bbf +CSEG VE_RDEFERFETCH 00007bc2 +CSEG PFA_RDEFERFETCH 00007bc9 +CSEG VE_RDEFERSTORE 00007bcc +CSEG PFA_RDEFERSTORE 00007bd3 +CSEG VE_UDEFERFETCH 00007bd6 +CSEG PFA_UDEFERFETCH 00007bdd +CSEG VE_UDEFERSTORE 00007be2 +CSEG PFA_UDEFERSTORE 00007be9 +CSEG VE_DEFERSTORE 00007bee +CSEG PFA_DEFERSTORE 00007bf4 +CSEG VE_DEFERFETCH 00007bfb +CSEG XT_DEFERFETCH 00007c00 +CSEG PFA_DEFERFETCH 00007c01 +CSEG VE_DODEFER 00007c07 +CSEG XT_DODEFER 00007c0d +CSEG PFA_DODEFER 00007c0e +CSEG VE_SEARCH_WORDLIST 00007c1b +CSEG PFA_SEARCH_WORDLIST 00007c26 +CSEG XT_ISWORD 00007c3a +CSEG PFA_SEARCH_WORDLIST1 00007c34 +CSEG PFA_ISWORD 00007c3b +CSEG XT_ICOMPARE 00007c88 +CSEG PFA_ISWORD3 00007c48 +CSEG VE_TRAVERSEWORDLIST 00007c4c +CSEG PFA_TRAVERSEWORDLIST 00007c58 +CSEG PFA_TRAVERSEWORDLIST1 00007c59 +CSEG PFA_TRAVERSEWORDLIST2 00007c68 +CSEG VE_NAME2STRING 00007c6a +CSEG PFA_NAME2STRING 00007c73 +CSEG VE_NFA2CFA 00007c78 +CSEG PFA_NFA2CFA 00007c7f +CSEG VE_ICOMPARE 00007c82 +CSEG PFA_ICOMPARE 00007c89 +CSEG PFA_ICOMPARE_SAMELEN 00007c93 +CSEG PFA_ICOMPARE_DONE 00007cb6 +CSEG PFA_ICOMPARE_LOOP 00007c99 +CSEG PFA_ICOMPARE_LASTCELL 00007ca7 +CSEG PFA_ICOMPARE_NEXTLOOP 00007cae +CSEG VE_STAR 00007cb9 +CSEG XT_STAR 00007cbc +CSEG PFA_STAR 00007cbd +CSEG VE_J 00007cc0 +CSEG XT_J 00007cc3 +CSEG PFA_J 00007cc4 +CSEG VE_DABS 00007cd0 +CSEG PFA_DABS 00007cd5 +CSEG PFA_DABS1 00007cda +CSEG VE_DNEGATE 00007cdb +CSEG PFA_DNEGATE 00007ce2 +CSEG VE_CMOVE 00007ce7 +CSEG XT_CMOVE 00007cec +CSEG PFA_CMOVE 00007ced +CSEG PFA_CMOVE1 00007cfa +CSEG PFA_CMOVE2 00007cf6 +CSEG VE_2SWAP 00007d00 +CSEG PFA_2SWAP 00007d06 +CSEG VE_REFILLTIB 00007d0b +CSEG XT_REFILLTIB 00007d12 +CSEG PFA_REFILLTIB 00007d13 +CSEG XT_TIB 00007d2e +CSEG XT_NUMBERTIB 00007d34 +CSEG VE_SOURCETIB 00007d1e +CSEG XT_SOURCETIB 00007d25 +CSEG PFA_SOURCETIB 00007d26 +CSEG VE_TIB 00007d2a +CSEG PFA_TIB 00007d2f +DSEG ram_tib 00000168 +CSEG VE_NUMBERTIB 00007d30 +CSEG PFA_NUMBERTIB 00007d35 +DSEG ram_sharptib 000001c2 +CSEG VE_EE2RAM 00007d36 +CSEG XT_EE2RAM 00007d3b +CSEG PFA_EE2RAM 00007d3c +CSEG PFA_EE2RAM_1 00007d3e +CSEG PFA_EE2RAM_2 00007d48 +CSEG VE_INIT_RAM 00007d4a +CSEG PFA_INI_RAM 00007d51 +ESEG EE_INITUSER 0000006e +CSEG VE_BOUNDS 00007d59 +CSEG PFA_BOUNDS 00007d5f +CSEG VE_S2D 00007d63 +CSEG PFA_S2D 00007d68 +CSEG VE_TO_BODY 00007d6b +CSEG VE_2LITERAL 00007d71 +CSEG PFA_2LITERAL 00007d78 +CSEG VE_EQUAL 00007d7c +CSEG PFA_EQUAL 00007d80 +CSEG VE_ONE 00007d83 +CSEG PFA_ONE 00007d87 +CSEG VE_TWO 00007d88 +CSEG PFA_TWO 00007d8c +CSEG VE_MINUSONE 00007d8d +CSEG XT_MINUSONE 00007d90 +CSEG PFA_MINUSONE 00007d91 +SET flashlast 00007d92 +DSEG HERESTART 000001c4 +ESEG EHERESTART 00000092 +ESEG CFG_ORDERLIST 00000050 +ESEG CFG_RECOGNIZERLIST 00000062 +EQU UBRR_VAL 00000019 +EQU BAUD_REAL 0000963d +EQU BAUD_ERROR 00000001 diff --git a/amforth-6.5/appl/eval-pollin/p644-16.xml b/amforth-6.5/appl/eval-pollin/p644-16.xml new file mode 100644 index 0000000..2fc587c --- /dev/null +++ b/amforth-6.5/appl/eval-pollin/p644-16.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + Uploading Hexfiles for p644 - 16 + + + + diff --git a/amforth-6.5/appl/eval-pollin/p8-12.xml b/amforth-6.5/appl/eval-pollin/p8-12.xml new file mode 100644 index 0000000..aae5de9 --- /dev/null +++ b/amforth-6.5/appl/eval-pollin/p8-12.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + Uploading Hexfiles for p8-12 + + + diff --git a/amforth-6.5/appl/eval-pollin/pollin.asm b/amforth-6.5/appl/eval-pollin/pollin.asm new file mode 100644 index 0000000..de3d0d2 --- /dev/null +++ b/amforth-6.5/appl/eval-pollin/pollin.asm @@ -0,0 +1,21 @@ +; for a description, what can be done in this +; file see ../template/template.asm. You may want to +; copy that file to this one and edit it afterwards. + +.include "preamble.inc" + +.set AMFORTH_RO_SEG = NRWW_START_ADDR+1 + +; cpu clock in hertz +.equ F_CPU = @F_CPU@ +.set BAUD_MAXERROR = 30 +.equ TIMER_INT = OVF2addr + +.include "drivers/usart@USART@.asm" + +; settings for 1wire interface +.equ OW_PORT=PORTB +.EQU OW_BIT=4 +.include "drivers/1wire.asm" + +.include "amforth.asm" diff --git a/amforth-6.5/appl/eval-pollin/words/applturnkey.asm b/amforth-6.5/appl/eval-pollin/words/applturnkey.asm new file mode 100644 index 0000000..5e6b279 --- /dev/null +++ b/amforth-6.5/appl/eval-pollin/words/applturnkey.asm @@ -0,0 +1,30 @@ +; ( -- ) System +; R( -- ) +; application specific turnkey action +VE_APPLTURNKEY: + .dw $ff0b + .db "applturnkey",0 + .dw VE_HEAD + .set VE_HEAD = VE_APPLTURNKEY +XT_APPLTURNKEY: + .dw DO_COLON +PFA_APPLTURNKEY: + .dw XT_USART + +.if WANT_INTERRUPTS == 1 + .dw XT_INTON +.endif + .dw XT_DOT_VER + .dw XT_SPACE + .dw XT_F_CPU + .dw XT_DOLITERAL + .dw 1000 + .dw XT_UMSLASHMOD + .dw XT_NIP + .dw XT_DECIMAL + .dw XT_DOT + .dw XT_DOSLITERAL + .dw 4 + .db "kHz " + .dw XT_ITYPE + .dw XT_EXIT -- cgit v1.2.3