aboutsummaryrefslogtreecommitdiff
path: root/amforth-6.5/appl/eval-pollin
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2017-08-19 12:15:28 +0200
committerDimitri Sokolyuk <demon@dim13.org>2017-08-19 12:15:28 +0200
commit67d25d837ac55f28a366c0a3b262e439a6e75fc3 (patch)
treedf7715c7724c5935ab87c807f3b8b4ef529315e3 /amforth-6.5/appl/eval-pollin
parente0d6784e89dba33226c0edb815bb974486fa7c48 (diff)
Add AmForth
Diffstat (limited to 'amforth-6.5/appl/eval-pollin')
-rw-r--r--amforth-6.5/appl/eval-pollin/blocks/hd44780.frt115
-rw-r--r--amforth-6.5/appl/eval-pollin/blocks/hello-world.frt81
-rw-r--r--amforth-6.5/appl/eval-pollin/blocks/netio.frt32
-rw-r--r--amforth-6.5/appl/eval-pollin/build.xml15
-rw-r--r--amforth-6.5/appl/eval-pollin/dict_appl.inc8
-rw-r--r--amforth-6.5/appl/eval-pollin/dict_appl_core.inc2
-rw-r--r--amforth-6.5/appl/eval-pollin/p1284-16.eep.hex7
-rw-r--r--amforth-6.5/appl/eval-pollin/p1284-16.hex646
-rw-r--r--amforth-6.5/appl/eval-pollin/p1284-16.lst10495
-rw-r--r--amforth-6.5/appl/eval-pollin/p1284-16.map2253
-rw-r--r--amforth-6.5/appl/eval-pollin/p1284-16.xml36
-rw-r--r--amforth-6.5/appl/eval-pollin/p16-8.eep.hex7
-rw-r--r--amforth-6.5/appl/eval-pollin/p16-8.hex625
-rw-r--r--amforth-6.5/appl/eval-pollin/p16-8.lst10363
-rw-r--r--amforth-6.5/appl/eval-pollin/p16-8.map1961
-rw-r--r--amforth-6.5/appl/eval-pollin/p16-8.xml36
-rw-r--r--amforth-6.5/appl/eval-pollin/p32-16.xml45
-rw-r--r--amforth-6.5/appl/eval-pollin/p32-8.eep.hex7
-rw-r--r--amforth-6.5/appl/eval-pollin/p32-8.hex628
-rw-r--r--amforth-6.5/appl/eval-pollin/p32-8.lst10420
-rw-r--r--amforth-6.5/appl/eval-pollin/p32-8.map1933
-rw-r--r--amforth-6.5/appl/eval-pollin/p32-8.xml35
-rw-r--r--amforth-6.5/appl/eval-pollin/p328-16.eep.hex7
-rw-r--r--amforth-6.5/appl/eval-pollin/p328-16.hex633
-rw-r--r--amforth-6.5/appl/eval-pollin/p328-16.lst10427
-rw-r--r--amforth-6.5/appl/eval-pollin/p328-16.map2054
-rw-r--r--amforth-6.5/appl/eval-pollin/p328-16.xml36
-rw-r--r--amforth-6.5/appl/eval-pollin/p644-16.eep.hex7
-rw-r--r--amforth-6.5/appl/eval-pollin/p644-16.hex635
-rw-r--r--amforth-6.5/appl/eval-pollin/p644-16.lst10444
-rw-r--r--amforth-6.5/appl/eval-pollin/p644-16.map2133
-rw-r--r--amforth-6.5/appl/eval-pollin/p644-16.xml27
-rw-r--r--amforth-6.5/appl/eval-pollin/p8-12.xml25
-rw-r--r--amforth-6.5/appl/eval-pollin/pollin.asm21
-rw-r--r--amforth-6.5/appl/eval-pollin/words/applturnkey.asm30
35 files changed, 66229 insertions, 0 deletions
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
+ : ><spi ( x -- x' )
+ dup >< 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 @@
+<!-- make multiple targets with antelope -->
+<project name="pollins" basedir="." default="Help">
+ <import file="../avr-build.xml"/>
+ <import file="p328-16.xml"/>
+ <import file="p16-8.xml"/>
+ <import file="p32-16.xml"/>
+ <import file="p32-8.xml"/>
+ <import file="p644-16.xml"/>
+ <import file="p1284-16.xml"/>
+ <import file="p8-12.xml"/>
+
+ <target name="compile" depends="p16-8.hex, p32-8.hex, p328-16.hex, p1284-16.hex, p644-16.hex">
+
+ </target>
+</project>
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<<RXCIE0
+ .equ bm_ENABLE_INT_TX = 1<<UDRIE0
+
+ .equ bm_USARTC_en = 0
+ .equ bm_ASYNC = 0 << 6
+ .equ bm_SYNC = 1 << 6
+ .equ bm_NO_PARITY = 0 << 4
+ .equ bm_EVEN_PARITY = 2 << 4
+ .equ bm_ODD_PARITY = 3 << 4
+ .equ bm_1STOPBIT = 0 << 3
+ .equ bm_2STOPBIT = 1 << 3
+ .equ bm_5BIT = 0 << 1
+ .equ bm_6BIT = 1 << 1
+ .equ bm_7BIT = 2 << 1
+ .equ bm_8BIT = 3 << 1
+
+ .include "drivers/usart_common.asm"
+
+ .set USART_C_VALUE = bm_ASYNC | bm_NO_PARITY | bm_1STOPBIT | bm_8BIT
+ .if WANT_INTERRUPTS == 0
+ .if WANT_ISR_RX == 1
+ .endif
+ .endif
+
+ .if WANT_ISR_RX == 1
+ .set USART_B_VALUE = bm_ENABLE_TX | bm_ENABLE_RX | bm_ENABLE_INT_RX
+ .include "drivers/usart-rx-buffer.asm"
+
+
+ ; sizes have to be powers of 2!
+ .equ usart_rx_size = $10
+ .equ usart_rx_mask = usart_rx_size - 1
+ .dseg
+000100 usart_rx_data: .byte usart_rx_size
+000110 usart_rx_in: .byte 1
+000111 usart_rx_out: .byte 1
+ .cseg
+
+ VE_TO_RXBUF:
+000050 ff07 .dw $ff07
+000051 723e
+000052 2d78
+000053 7562
+000054 0066 .db ">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 "<mark"
+ ; .dw VE_HEAD
+ ; .set VE_HEAD = VE_LMARK
+ XT_LMARK:
+00020c f001 .dw DO_COLON
+ PFA_LMARK:
+00020d f5c9 .dw XT_DP
+00020e f026 .dw XT_EXIT
+ .include "words/l_resolve.asm"
+
+ ; Compiler
+ ; resolve backward branch
+ ;VE_LRESOLVE:
+ ; .dw $ff08
+ ; .db "<resolve"
+ ; .dw VE_HEAD
+ ; .set VE_HEAD = VE_LRESOLVE
+ XT_LRESOLVE:
+00020f f001 .dw DO_COLON
+ PFA_LRESOLVE:
+000210 fb72 .dw XT_QSTACK
+000211 01db .dw XT_COMMA
+000212 f026 .dw XT_EXIT
+
+ .include "words/ahead.asm"
+
+ ; Compiler
+ ; do a unconditional branch
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_AHEAD:
+000213 0005 .dw $0005
+000214 6861
+000215 6165
+000216 0064 .db "ahead",0
+000217 01f6 .dw VE_HEAD
+ .set VE_HEAD = VE_AHEAD
+ XT_AHEAD:
+000218 f001 .dw DO_COLON
+ PFA_AHEAD:
+ .endif
+000219 01d0 .dw XT_COMPILE
+00021a f035 .dw XT_DOBRANCH
+00021b 0201 .dw XT_GMARK
+00021c f026 .dw XT_EXIT
+ .include "words/if.asm"
+
+ ; Compiler
+ ; start conditional branch
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_IF:
+00021d 0002 .dw $0002
+00021e 6669 .db "if"
+00021f 0213 .dw VE_HEAD
+ .set VE_HEAD = VE_IF
+ XT_IF:
+000220 f001 .dw DO_COLON
+ PFA_IF:
+ .endif
+000221 01d0 .dw XT_COMPILE
+000222 f03f .dw XT_DOCONDBRANCH
+000223 0201 .dw XT_GMARK
+000224 f026 .dw XT_EXIT
+ .include "words/else.asm"
+
+ ; Compiler
+ ; resolve the forward reference and place a new unresolved forward reference
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_ELSE:
+000225 0004 .dw $0004
+000226 6c65
+000227 6573 .db "else"
+000228 021d .dw VE_HEAD
+ .set VE_HEAD = VE_ELSE
+ XT_ELSE:
+000229 f001 .dw DO_COLON
+ PFA_ELSE:
+ .endif
+00022a 01d0 .dw XT_COMPILE
+00022b f035 .dw XT_DOBRANCH
+00022c 0201 .dw XT_GMARK
+00022d f0d6 .dw XT_SWAP
+00022e 0206 .dw XT_GRESOLVE
+00022f f026 .dw XT_EXIT
+ .include "words/then.asm"
+
+ ; Compiler
+ ; finish if
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_THEN:
+000230 0004 .dw $0004
+000231 6874
+000232 6e65 .db "then"
+000233 0225 .dw VE_HEAD
+ .set VE_HEAD = VE_THEN
+ XT_THEN:
+000234 f001 .dw DO_COLON
+ PFA_THEN:
+ .endif
+000235 0206 .dw XT_GRESOLVE
+000236 f026 .dw XT_EXIT
+ .include "words/begin.asm"
+
+ ; Compiler
+ ; put the next location for a transfer of control onto the control flow stack
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_BEGIN:
+000237 0005 .dw $0005
+000238 6562
+000239 6967
+00023a 006e .db "begin",0
+00023b 0230 .dw VE_HEAD
+ .set VE_HEAD = VE_BEGIN
+ XT_BEGIN:
+00023c f001 .dw DO_COLON
+ PFA_BEGIN:
+ .endif
+00023d 020c .dw XT_LMARK
+00023e f026 .dw XT_EXIT
+ .include "words/while.asm"
+
+ ; Compiler
+ ; at runtime skip until repeat if non-true
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_WHILE:
+00023f 0005 .dw $0005
+000240 6877
+000241 6c69
+000242 0065 .db "while",0
+000243 0237 .dw VE_HEAD
+ .set VE_HEAD = VE_WHILE
+ XT_WHILE:
+000244 f001 .dw DO_COLON
+ PFA_WHILE:
+ .endif
+000245 0220 .dw XT_IF
+000246 f0d6 .dw XT_SWAP
+000247 f026 .dw XT_EXIT
+ .include "words/repeat.asm"
+
+ ; Compiler
+ ; continue execution at dest, resolve orig
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_REPEAT:
+000248 0006 .dw $0006
+000249 6572
+00024a 6570
+00024b 7461 .db "repeat"
+00024c 023f .dw VE_HEAD
+ .set VE_HEAD = VE_REPEAT
+ XT_REPEAT:
+00024d f001 .dw DO_COLON
+ PFA_REPEAT:
+ .endif
+00024e 0261 .dw XT_AGAIN
+00024f 0234 .dw XT_THEN
+000250 f026 .dw XT_EXIT
+ .include "words/until.asm"
+
+ ; Compiler
+ ; finish begin with conditional branch, leaves the loop if true flag at runtime
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_UNTIL:
+000251 0005 .dw $0005
+000252 6e75
+000253 6974
+000254 006c .db "until",0
+000255 0248 .dw VE_HEAD
+ .set VE_HEAD = VE_UNTIL
+ XT_UNTIL:
+000256 f001 .dw DO_COLON
+ PFA_UNTIL:
+ .endif
+000257 f046 .dw XT_DOLITERAL
+000258 f03f .dw XT_DOCONDBRANCH
+000259 01db .dw XT_COMMA
+
+00025a 020f .dw XT_LRESOLVE
+00025b f026 .dw XT_EXIT
+ .include "words/again.asm"
+
+ ; Compiler
+ ; compile a jump back to dest
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_AGAIN:
+00025c 0005 .dw $0005
+00025d 6761
+00025e 6961
+00025f 006e .db "again",0
+000260 0251 .dw VE_HEAD
+ .set VE_HEAD = VE_AGAIN
+ XT_AGAIN:
+000261 f001 .dw DO_COLON
+ PFA_AGAIN:
+ .endif
+000262 01d0 .dw XT_COMPILE
+000263 f035 .dw XT_DOBRANCH
+000264 020f .dw XT_LRESOLVE
+000265 f026 .dw XT_EXIT
+ .include "words/do.asm"
+
+ ; Compiler
+ ; start do .. [+]loop
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_DO:
+000266 0002 .dw $0002
+000267 6f64 .db "do"
+000268 025c .dw VE_HEAD
+ .set VE_HEAD = VE_DO
+ XT_DO:
+000269 f001 .dw DO_COLON
+ PFA_DO:
+
+ .endif
+00026a 01d0 .dw XT_COMPILE
+00026b f2ad .dw XT_DODO
+00026c 020c .dw XT_LMARK
+00026d f166 .dw XT_ZERO
+00026e 02c4 .dw XT_TO_L
+00026f f026 .dw XT_EXIT
+ .include "words/loop.asm"
+
+ ; Compiler
+ ; compile (loop) and resolve the backward branch
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_LOOP:
+000270 0004 .dw $0004
+000271 6f6c
+000272 706f .db "loop"
+000273 0266 .dw VE_HEAD
+ .set VE_HEAD = VE_LOOP
+ XT_LOOP:
+000274 f001 .dw DO_COLON
+ PFA_LOOP:
+ .endif
+000275 01d0 .dw XT_COMPILE
+000276 f2db .dw XT_DOLOOP
+000277 02ab .dw XT_ENDLOOP
+000278 f026 .dw XT_EXIT
+ .include "words/plusloop.asm"
+
+ ; Compiler
+ ; compile (+loop) and resolve branches
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_PLUSLOOP:
+000279 0005 .dw $0005
+00027a 6c2b
+00027b 6f6f
+00027c 0070 .db "+loop",0
+00027d 0270 .dw VE_HEAD
+ .set VE_HEAD = VE_PLUSLOOP
+ XT_PLUSLOOP:
+00027e f001 .dw DO_COLON
+ PFA_PLUSLOOP:
+ .endif
+00027f 01d0 .dw XT_COMPILE
+000280 f2cc .dw XT_DOPLUSLOOP
+000281 02ab .dw XT_ENDLOOP
+000282 f026 .dw XT_EXIT
+ .include "words/leave.asm"
+
+ ; Compiler
+ ; immediatly leave the current DO..LOOP
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_LEAVE:
+000283 0005 .dw $0005
+000284 656c
+000285 7661
+000286 0065 .db "leave",0
+000287 0279 .dw VE_HEAD
+ .set VE_HEAD = VE_LEAVE
+ XT_LEAVE:
+000288 f001 .dw DO_COLON
+ PFA_LEAVE:
+ .endif
+000289 01d0
+00028a f2e6 .DW XT_COMPILE,XT_UNLOOP
+00028b 0218
+00028c 02c4
+00028d f026 .DW XT_AHEAD,XT_TO_L,XT_EXIT
+ .include "words/qdo.asm"
+
+ ; Compiler
+ ; start a ?do .. [+]loop control structure
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+
+ VE_QDO:
+00028e 0003 .dw $0003
+00028f 643f
+000290 006f .db "?do",0
+000291 0283 .dw VE_HEAD
+ .set VE_HEAD = VE_QDO
+ XT_QDO:
+000292 f001 .dw DO_COLON
+ PFA_QDO:
+ .endif
+000293 01d0 .dw XT_COMPILE
+000294 029a .dw XT_QDOCHECK
+000295 0220 .dw XT_IF
+000296 0269 .dw XT_DO
+000297 f0d6 .dw XT_SWAP ; DO sets a 0 marker on the leave stack
+000298 02c4 .dw XT_TO_L ; then follows at the end.
+000299 f026 .dw XT_EXIT
+
+ ; there is no special runtime for ?do, the do runtime
+ ; gets wrapped with the sequence
+ ; ... ?do-check if do ..... loop then
+ ; with
+ ; : ?do-check ( n1 n2 -- n1 n2 true | false )
+ ; 2dup = dup >r if 2drop then r> invert ;
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ XT_QDOCHECK:
+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 --
+ ; <resolve backward loop
+ ; BEGIN L> ?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) <builds does> 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<<PGERS)
+00f3ae d023 rcall dospm
+
+ DO_STOREI_writepage:
+ ; write page
+00f3af 01f9 movw zl, temp2
+00f3b0 e004 ldi temp0,(1<<PGWRT)
+00f3b1 d020 rcall dospm
+
+ ; reenable RWW section
+00f3b2 01f9 movw zl, temp2
+00f3b3 e100 ldi temp0,(1<<RWWSRE)
+00f3b4 d01d rcall dospm
+00f3b5 9508 ret
+
+ ; load the desired page
+ .equ pagemask = ~ ( PAGESIZE - 1 )
+ pageload:
+00f3b6 01f9 movw zl, temp2
+ ; get the beginning of page
+00f3b7 78e0 andi zl,low(pagemask)
+00f3b8 7fff andi zh,high(pagemask)
+00f3b9 01ef movw y, z
+ ; loop counter (in words)
+00f3ba e8a0 ldi xl,low(pagesize)
+00f3bb e0b0 ldi xh,high(pagesize)
+ pageload_loop:
+ ; we need the current flash value anyways
+00f3bc 01fe movw z, y
+00f3bd 2755
+00f3be 0fee
+00f3bf 1fff
+00f3c0 1f55
+00f3c1 bf5b
+00f3c2 9147
+00f3c3 9157 readflashcell temp6, temp7 ; destroys Z
+ ; now check: if Z points to the same cell as temp2/3, we want the new data
+00f3c4 01fe movw z, y
+00f3c5 17e2 cp zl, temp2
+00f3c6 07f3 cpc zh, temp3
+00f3c7 f011 breq pageload_newdata
+00f3c8 010a movw r0, temp6
+00f3c9 c002 rjmp pageload_cont
+ pageload_newdata:
+00f3ca 017a movw temp4, temp6
+00f3cb 010c movw r0, tosl
+ pageload_cont:
+00f3cc 2700 clr temp0
+00f3cd d004 rcall dospm
+00f3ce 9621 adiw y, 1
+00f3cf 9711 sbiw x, 1
+00f3d0 f759 brne pageload_loop
+
+ pageload_done:
+00f3d1 9508 ret
+
+
+ ;; dospm
+ ;;
+ ;; execute spm instruction
+ ;; temp0 holds the value for SPMCR
+
+ dospm:
+ dospm_wait_ee:
+00f3d2 99f9 sbic EECR, EEPE
+00f3d3 cffe rjmp dospm_wait_ee
+ dospm_wait_spm:
+00f3d4 b717 in_ temp1, SPMCSR
+00f3d5 fd10 sbrc temp1, SPMEN
+00f3d6 cffd rjmp dospm_wait_spm
+
+ ; turn the word addres into a byte address
+00f3d7 2755
+00f3d8 0fee
+00f3d9 1fff
+00f3da 1f55
+00f3db bf5b writeflashcell
+ ; execute spm
+00f3dc 6001 ori temp0, (1<<SPMEN)
+00f3dd bf07 out_ SPMCSR,temp0
+00f3de 95e8 spm
+00f3df 9508 ret
+ .endif
+ .include "words/fetch-i.asm"
+
+ ; Memory
+ ; read 1 cell from flash
+ VE_FETCHI:
+00f3e0 ff02 .dw $ff02
+00f3e1 6940 .db "@i"
+00f3e2 f389 .dw VE_HEAD
+ .set VE_HEAD = VE_FETCHI
+ XT_FETCHI:
+00f3e3 f3e4 .dw PFA_FETCHI
+ PFA_FETCHI:
+00f3e4 01fc movw zl, tosl
+00f3e5 2755
+00f3e6 0fee
+00f3e7 1fff
+00f3e8 1f55
+00f3e9 bf5b
+00f3ea 9187
+00f3eb 9197 readflashcell tosl,tosh
+00f3ec cc18 jmp_ DO_NEXT
+
+ .if AMFORTH_NRWW_SIZE>8000
+ .include "dict/core_8k.inc"
+
+ .include "words/n_to_r.asm"
+
+ ; Stack
+ ; move n items from data stack to return stack
+ VE_N_TO_R:
+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) <builds does> dup i-cell+ @i execute execute ;
+
+
+ .include "words/search-wordlist.asm"
+
+ ; Search Order
+ ; searches the word list wid for the word at c-addr/len
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_SEARCH_WORDLIST:
+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 @@
+<project name="pollins-1284-16" basedir="." default="Help">
+ <target name="p1284-16.asm">
+ <copy tofile="p1284-16.asm" file="pollin.asm" overwrite="true">
+ <filterset>
+ <filter token="F_CPU" value="16000000"/>
+ <filter token="USART" value="_0"/>
+ </filterset>
+ </copy>
+ </target>
+
+ <target name="p1284-16.hex" depends="p1284-16.asm" description="Hexfiles for p1284-16">
+ <avrasm2 projectname="p1284-16" mcu="atmega1284p"/>
+ <delete file="p1284-16.asm"/>
+ </target>
+
+ <target name="p1284-16" depends="p1284-16.hex" description="Atmega1284 @ 16 MHz">
+ <echo>Uploading Hexfiles for p1284 - 16</echo>
+ <avrdude
+ type="stk200"
+ mcu="atmega1284p"
+ flashfile="p1284-16.hex"
+ eepromfile="p1284-16.eep.hex"
+ />
+ </target>
+ <target name="p1284-16.fuses" description="Set fuses for P16-8">
+ <echo>Writing fuses</echo>
+ <avrdude-3fuses
+ type="${programmer}"
+ mcu="${mcu}"
+ efuse="0xff"
+ hfuse="0x99"
+ lfuse="0xc6"
+ />
+ </target>
+
+</project>
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<<RXCIE
+ .equ bm_ENABLE_INT_TX = 1<<UDRE
+
+ .equ bm_ASYNC = 0 << 6
+ .equ bm_SYNC = 1 << 6
+ .equ bm_NO_PARITY = 0 << 4
+ .equ bm_EVEN_PARITY = 2 << 4
+ .equ bm_ODD_PARITY = 3 << 4
+ .equ bm_1STOPBIT = 0 << 3
+ .equ bm_2STOPBIT = 1 << 3
+ .equ bm_5BIT = 0 << 1
+ .equ bm_6BIT = 1 << 1
+ .equ bm_7BIT = 2 << 1
+ .equ bm_8BIT = 3 << 1
+
+ .include "drivers/usart_common.asm"
+
+ .set USART_C_VALUE = bm_ASYNC | bm_NO_PARITY | bm_1STOPBIT | bm_8BIT
+ .if WANT_INTERRUPTS == 0
+ .if WANT_ISR_RX == 1
+ .endif
+ .endif
+
+ .if WANT_ISR_RX == 1
+ .set USART_B_VALUE = bm_ENABLE_TX | bm_ENABLE_RX | bm_ENABLE_INT_RX
+ .include "drivers/usart-rx-buffer.asm"
+
+
+ ; sizes have to be powers of 2!
+ .equ usart_rx_size = $10
+ .equ usart_rx_mask = usart_rx_size - 1
+ .dseg
+000060 usart_rx_data: .byte usart_rx_size
+000070 usart_rx_in: .byte 1
+000071 usart_rx_out: .byte 1
+ .cseg
+
+ VE_TO_RXBUF:
+000032 ff07 .dw $ff07
+000033 723e
+000034 2d78
+000035 7562
+000036 0066 .db ">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 "<mark"
+ ; .dw VE_HEAD
+ ; .set VE_HEAD = VE_LMARK
+ XT_LMARK:
+0002df 1c01 .dw DO_COLON
+ PFA_LMARK:
+0002e0 0634 .dw XT_DP
+0002e1 1c20 .dw XT_EXIT
+ .include "words/l_resolve.asm"
+
+ ; Compiler
+ ; resolve backward branch
+ ;VE_LRESOLVE:
+ ; .dw $ff08
+ ; .db "<resolve"
+ ; .dw VE_HEAD
+ ; .set VE_HEAD = VE_LRESOLVE
+ XT_LRESOLVE:
+0002e2 1c01 .dw DO_COLON
+ PFA_LRESOLVE:
+0002e3 0bde .dw XT_QSTACK
+0002e4 02ae .dw XT_COMMA
+0002e5 1c20 .dw XT_EXIT
+
+ .include "words/ahead.asm"
+
+ ; Compiler
+ ; do a unconditional branch
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_AHEAD:
+0002e6 0005 .dw $0005
+0002e7 6861
+0002e8 6165
+0002e9 0064 .db "ahead",0
+0002ea 02c9 .dw VE_HEAD
+ .set VE_HEAD = VE_AHEAD
+ XT_AHEAD:
+0002eb 1c01 .dw DO_COLON
+ PFA_AHEAD:
+ .endif
+0002ec 02a3 .dw XT_COMPILE
+0002ed 1c2f .dw XT_DOBRANCH
+0002ee 02d4 .dw XT_GMARK
+0002ef 1c20 .dw XT_EXIT
+ .include "words/if.asm"
+
+ ; Compiler
+ ; start conditional branch
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_IF:
+0002f0 0002 .dw $0002
+0002f1 6669 .db "if"
+0002f2 02e6 .dw VE_HEAD
+ .set VE_HEAD = VE_IF
+ XT_IF:
+0002f3 1c01 .dw DO_COLON
+ PFA_IF:
+ .endif
+0002f4 02a3 .dw XT_COMPILE
+0002f5 1c36 .dw XT_DOCONDBRANCH
+0002f6 02d4 .dw XT_GMARK
+0002f7 1c20 .dw XT_EXIT
+ .include "words/else.asm"
+
+ ; Compiler
+ ; resolve the forward reference and place a new unresolved forward reference
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_ELSE:
+0002f8 0004 .dw $0004
+0002f9 6c65
+0002fa 6573 .db "else"
+0002fb 02f0 .dw VE_HEAD
+ .set VE_HEAD = VE_ELSE
+ XT_ELSE:
+0002fc 1c01 .dw DO_COLON
+ PFA_ELSE:
+ .endif
+0002fd 02a3 .dw XT_COMPILE
+0002fe 1c2f .dw XT_DOBRANCH
+0002ff 02d4 .dw XT_GMARK
+000300 1cc4 .dw XT_SWAP
+000301 02d9 .dw XT_GRESOLVE
+000302 1c20 .dw XT_EXIT
+ .include "words/then.asm"
+
+ ; Compiler
+ ; finish if
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_THEN:
+000303 0004 .dw $0004
+000304 6874
+000305 6e65 .db "then"
+000306 02f8 .dw VE_HEAD
+ .set VE_HEAD = VE_THEN
+ XT_THEN:
+000307 1c01 .dw DO_COLON
+ PFA_THEN:
+ .endif
+000308 02d9 .dw XT_GRESOLVE
+000309 1c20 .dw XT_EXIT
+ .include "words/begin.asm"
+
+ ; Compiler
+ ; put the next location for a transfer of control onto the control flow stack
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_BEGIN:
+00030a 0005 .dw $0005
+00030b 6562
+00030c 6967
+00030d 006e .db "begin",0
+00030e 0303 .dw VE_HEAD
+ .set VE_HEAD = VE_BEGIN
+ XT_BEGIN:
+00030f 1c01 .dw DO_COLON
+ PFA_BEGIN:
+ .endif
+000310 02df .dw XT_LMARK
+000311 1c20 .dw XT_EXIT
+ .include "words/while.asm"
+
+ ; Compiler
+ ; at runtime skip until repeat if non-true
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_WHILE:
+000312 0005 .dw $0005
+000313 6877
+000314 6c69
+000315 0065 .db "while",0
+000316 030a .dw VE_HEAD
+ .set VE_HEAD = VE_WHILE
+ XT_WHILE:
+000317 1c01 .dw DO_COLON
+ PFA_WHILE:
+ .endif
+000318 02f3 .dw XT_IF
+000319 1cc4 .dw XT_SWAP
+00031a 1c20 .dw XT_EXIT
+ .include "words/repeat.asm"
+
+ ; Compiler
+ ; continue execution at dest, resolve orig
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_REPEAT:
+00031b 0006 .dw $0006
+00031c 6572
+00031d 6570
+00031e 7461 .db "repeat"
+00031f 0312 .dw VE_HEAD
+ .set VE_HEAD = VE_REPEAT
+ XT_REPEAT:
+000320 1c01 .dw DO_COLON
+ PFA_REPEAT:
+ .endif
+000321 0334 .dw XT_AGAIN
+000322 0307 .dw XT_THEN
+000323 1c20 .dw XT_EXIT
+ .include "words/until.asm"
+
+ ; Compiler
+ ; finish begin with conditional branch, leaves the loop if true flag at runtime
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_UNTIL:
+000324 0005 .dw $0005
+000325 6e75
+000326 6974
+000327 006c .db "until",0
+000328 031b .dw VE_HEAD
+ .set VE_HEAD = VE_UNTIL
+ XT_UNTIL:
+000329 1c01 .dw DO_COLON
+ PFA_UNTIL:
+ .endif
+00032a 1c3d .dw XT_DOLITERAL
+00032b 1c36 .dw XT_DOCONDBRANCH
+00032c 02ae .dw XT_COMMA
+
+00032d 02e2 .dw XT_LRESOLVE
+00032e 1c20 .dw XT_EXIT
+ .include "words/again.asm"
+
+ ; Compiler
+ ; compile a jump back to dest
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_AGAIN:
+00032f 0005 .dw $0005
+000330 6761
+000331 6961
+000332 006e .db "again",0
+000333 0324 .dw VE_HEAD
+ .set VE_HEAD = VE_AGAIN
+ XT_AGAIN:
+000334 1c01 .dw DO_COLON
+ PFA_AGAIN:
+ .endif
+000335 02a3 .dw XT_COMPILE
+000336 1c2f .dw XT_DOBRANCH
+000337 02e2 .dw XT_LRESOLVE
+000338 1c20 .dw XT_EXIT
+ .include "words/do.asm"
+
+ ; Compiler
+ ; start do .. [+]loop
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_DO:
+000339 0002 .dw $0002
+00033a 6f64 .db "do"
+00033b 032f .dw VE_HEAD
+ .set VE_HEAD = VE_DO
+ XT_DO:
+00033c 1c01 .dw DO_COLON
+ PFA_DO:
+
+ .endif
+00033d 02a3 .dw XT_COMPILE
+00033e 1e9b .dw XT_DODO
+00033f 02df .dw XT_LMARK
+000340 1d54 .dw XT_ZERO
+000341 0397 .dw XT_TO_L
+000342 1c20 .dw XT_EXIT
+ .include "words/loop.asm"
+
+ ; Compiler
+ ; compile (loop) and resolve the backward branch
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_LOOP:
+000343 0004 .dw $0004
+000344 6f6c
+000345 706f .db "loop"
+000346 0339 .dw VE_HEAD
+ .set VE_HEAD = VE_LOOP
+ XT_LOOP:
+000347 1c01 .dw DO_COLON
+ PFA_LOOP:
+ .endif
+000348 02a3 .dw XT_COMPILE
+000349 1ec9 .dw XT_DOLOOP
+00034a 037e .dw XT_ENDLOOP
+00034b 1c20 .dw XT_EXIT
+ .include "words/plusloop.asm"
+
+ ; Compiler
+ ; compile (+loop) and resolve branches
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_PLUSLOOP:
+00034c 0005 .dw $0005
+00034d 6c2b
+00034e 6f6f
+00034f 0070 .db "+loop",0
+000350 0343 .dw VE_HEAD
+ .set VE_HEAD = VE_PLUSLOOP
+ XT_PLUSLOOP:
+000351 1c01 .dw DO_COLON
+ PFA_PLUSLOOP:
+ .endif
+000352 02a3 .dw XT_COMPILE
+000353 1eba .dw XT_DOPLUSLOOP
+000354 037e .dw XT_ENDLOOP
+000355 1c20 .dw XT_EXIT
+ .include "words/leave.asm"
+
+ ; Compiler
+ ; immediatly leave the current DO..LOOP
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_LEAVE:
+000356 0005 .dw $0005
+000357 656c
+000358 7661
+000359 0065 .db "leave",0
+00035a 034c .dw VE_HEAD
+ .set VE_HEAD = VE_LEAVE
+ XT_LEAVE:
+00035b 1c01 .dw DO_COLON
+ PFA_LEAVE:
+ .endif
+00035c 02a3
+00035d 1ed4 .DW XT_COMPILE,XT_UNLOOP
+00035e 02eb
+00035f 0397
+000360 1c20 .DW XT_AHEAD,XT_TO_L,XT_EXIT
+ .include "words/qdo.asm"
+
+ ; Compiler
+ ; start a ?do .. [+]loop control structure
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+
+ VE_QDO:
+000361 0003 .dw $0003
+000362 643f
+000363 006f .db "?do",0
+000364 0356 .dw VE_HEAD
+ .set VE_HEAD = VE_QDO
+ XT_QDO:
+000365 1c01 .dw DO_COLON
+ PFA_QDO:
+ .endif
+000366 02a3 .dw XT_COMPILE
+000367 036d .dw XT_QDOCHECK
+000368 02f3 .dw XT_IF
+000369 033c .dw XT_DO
+00036a 1cc4 .dw XT_SWAP ; DO sets a 0 marker on the leave stack
+00036b 0397 .dw XT_TO_L ; then follows at the end.
+00036c 1c20 .dw XT_EXIT
+
+ ; there is no special runtime for ?do, the do runtime
+ ; gets wrapped with the sequence
+ ; ... ?do-check if do ..... loop then
+ ; with
+ ; : ?do-check ( n1 n2 -- n1 n2 true | false )
+ ; 2dup = dup >r if 2drop then r> invert ;
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ XT_QDOCHECK:
+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 --
+ ; <resolve backward loop
+ ; BEGIN L> ?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) <builds does> dup i-cell+ @i execute execute ;
+
+
+ .include "words/search-wordlist.asm"
+
+ ; Search Order
+ ; searches the word list wid for the word at c-addr/len
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_SEARCH_WORDLIST:
+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) <builds does> 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<<PGERS)
+001f9c d020 rcall dospm
+
+ DO_STOREI_writepage:
+ ; write page
+001f9d 01f9 movw zl, temp2
+001f9e e004 ldi temp0,(1<<PGWRT)
+001f9f d01d rcall dospm
+
+ ; reenable RWW section
+001fa0 01f9 movw zl, temp2
+001fa1 e100 ldi temp0,(1<<RWWSRE)
+001fa2 d01a rcall dospm
+001fa3 9508 ret
+
+ ; load the desired page
+ .equ pagemask = ~ ( PAGESIZE - 1 )
+ pageload:
+001fa4 01f9 movw zl, temp2
+ ; get the beginning of page
+001fa5 7ce0 andi zl,low(pagemask)
+001fa6 7fff andi zh,high(pagemask)
+001fa7 01ef movw y, z
+ ; loop counter (in words)
+001fa8 e4a0 ldi xl,low(pagesize)
+001fa9 e0b0 ldi xh,high(pagesize)
+ pageload_loop:
+ ; we need the current flash value anyways
+001faa 01fe movw z, y
+001fab 0fee
+001fac 1fff
+001fad 9145
+001fae 9155 readflashcell temp6, temp7 ; destroys Z
+ ; now check: if Z points to the same cell as temp2/3, we want the new data
+001faf 01fe movw z, y
+001fb0 17e2 cp zl, temp2
+001fb1 07f3 cpc zh, temp3
+001fb2 f011 breq pageload_newdata
+001fb3 010a movw r0, temp6
+001fb4 c002 rjmp pageload_cont
+ pageload_newdata:
+001fb5 017a movw temp4, temp6
+001fb6 010c movw r0, tosl
+ pageload_cont:
+001fb7 2700 clr temp0
+001fb8 d004 rcall dospm
+001fb9 9621 adiw y, 1
+001fba 9711 sbiw x, 1
+001fbb f771 brne pageload_loop
+
+ pageload_done:
+001fbc 9508 ret
+
+
+ ;; dospm
+ ;;
+ ;; execute spm instruction
+ ;; temp0 holds the value for SPMCR
+
+ dospm:
+ dospm_wait_ee:
+001fbd 99e1 sbic EECR, EEPE
+001fbe cffe rjmp dospm_wait_ee
+ dospm_wait_spm:
+001fbf b717 in_ temp1, SPMCSR
+001fc0 fd10 sbrc temp1, SPMEN
+001fc1 cffd rjmp dospm_wait_spm
+
+ ; turn the word addres into a byte address
+001fc2 0fee
+001fc3 1fff writeflashcell
+ ; execute spm
+001fc4 6001 ori temp0, (1<<SPMEN)
+001fc5 bf07 out_ SPMCSR,temp0
+001fc6 95e8 spm
+001fc7 9508 ret
+ .endif
+ .include "words/fetch-i.asm"
+
+ ; Memory
+ ; read 1 cell from flash
+ VE_FETCHI:
+001fc8 ff02 .dw $ff02
+001fc9 6940 .db "@i"
+001fca 1f77 .dw VE_HEAD
+ .set VE_HEAD = VE_FETCHI
+ XT_FETCHI:
+001fcb 1fcc .dw PFA_FETCHI
+ PFA_FETCHI:
+001fcc 01fc movw zl, tosl
+001fcd 0fee
+001fce 1fff
+001fcf 9185
+001fd0 9195 readflashcell tosl,tosh
+001fd1 cc33 jmp_ DO_NEXT
+
+ .if AMFORTH_NRWW_SIZE>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 @@
+<project name="pollins-16-8" basedir="." default="Help">
+
+ <target name="p16-8.asm">
+ <copy tofile="p16-8.asm" file="pollin.asm" overwrite="true">
+ <filterset>
+ <filter token="F_CPU" value="8000000"/>
+ <filter token="USART" value=""/>
+ </filterset>
+ </copy>
+ </target>
+
+ <target name="p16-8.hex" depends="p16-8.asm" description="Hexfiles for p16-8">
+ <avrasm2 projectname="p16-8" mcu="atmega16"/>
+ <delete file="p16-8.asm"/>
+
+ </target>
+
+ <target name="p16-8" depends="p16-8.hex" description="Atmega16 @ 8 MHz">
+ <echo>Uploading Hexfiles for p16-8</echo>
+ <avrdude
+ type="stk200"
+ mcu="atmega16"
+ flashfile="p16-8.hex"
+ eepromfile="p16-8.eep.hex" />
+ </target>
+ <target name="p16-8.fuses" description="Set fuses for P16-8">
+ <echo>Writing fuses</echo>
+ <avrdude-2fuses
+ type="stk200"
+ mcu="atmega16"
+ hfuse="0x99"
+ lfuse="0xff"
+ />
+ </target>
+
+</project>
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 @@
+<project name="pollins-32-16" basedir="." default="Help">
+
+ <target name="p32-16.asm">
+ <copy tofile="p32-16.asm" file="pollin.asm" overwrite="true">
+ <filterset>
+ <filter token="F_CPU" value="16000000"/>
+ <filter token="USART" value=""/>
+ </filterset>
+ </copy>
+ </target>
+
+ <target name="p32-16.hex" depends="p32-16.asm" description="Hexfiles for p32-16">
+ <avrasm2 projectname="p32-16" mcu="atmega32"/>
+ <delete file="p32-16.asm"/>
+ </target>
+
+ <target name="p32-16" depends="p32-16.hex" description="Atmega32 @ 16 MHz">
+ <echo>Uploading Hexfiles for p32-16</echo>
+ <avrdude
+ type="stk200"
+ mcu="atmega32"
+ flashfile="p32-16.hex"
+ eepromfile="p32-16.eep.hex"
+ />
+ </target>
+ <target name="p32-16.back" description="Atmega32 @ 16 MHz">
+ <echo>Download Hexfiles from p32-16</echo>
+ <avrdude-back
+ type="stk200"
+ mcu="atmega32"
+ flashfile="p32-16.hex"
+ eepromfile="p32-16.eep.hex"
+ />
+ </target>
+ <target name="p32-16.fuses" description="Set fuses for P32-16">
+ <echo>Writing fuses</echo>
+ <avrdude-2fuses
+ type="stk200"
+ mcu="atmega32"
+ hfuse="0x99"
+ lfuse="0xff"
+ />
+ </target>
+
+</project>
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<<RXCIE
+ .equ bm_ENABLE_INT_TX = 1<<UDRE
+
+ .equ bm_ASYNC = 0 << 6
+ .equ bm_SYNC = 1 << 6
+ .equ bm_NO_PARITY = 0 << 4
+ .equ bm_EVEN_PARITY = 2 << 4
+ .equ bm_ODD_PARITY = 3 << 4
+ .equ bm_1STOPBIT = 0 << 3
+ .equ bm_2STOPBIT = 1 << 3
+ .equ bm_5BIT = 0 << 1
+ .equ bm_6BIT = 1 << 1
+ .equ bm_7BIT = 2 << 1
+ .equ bm_8BIT = 3 << 1
+
+ .include "drivers/usart_common.asm"
+
+ .set USART_C_VALUE = bm_ASYNC | bm_NO_PARITY | bm_1STOPBIT | bm_8BIT
+ .if WANT_INTERRUPTS == 0
+ .if WANT_ISR_RX == 1
+ .endif
+ .endif
+
+ .if WANT_ISR_RX == 1
+ .set USART_B_VALUE = bm_ENABLE_TX | bm_ENABLE_RX | bm_ENABLE_INT_RX
+ .include "drivers/usart-rx-buffer.asm"
+
+
+ ; sizes have to be powers of 2!
+ .equ usart_rx_size = $10
+ .equ usart_rx_mask = usart_rx_size - 1
+ .dseg
+000060 usart_rx_data: .byte usart_rx_size
+000070 usart_rx_in: .byte 1
+000071 usart_rx_out: .byte 1
+ .cseg
+
+ VE_TO_RXBUF:
+000032 ff07 .dw $ff07
+000033 723e
+000034 2d78
+000035 7562
+000036 0066 .db ">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 "<mark"
+ ; .dw VE_HEAD
+ ; .set VE_HEAD = VE_LMARK
+ XT_LMARK:
+00078d 3801 .dw DO_COLON
+ PFA_LMARK:
+00078e 3f12 .dw XT_DP
+00078f 3820 .dw XT_EXIT
+ .include "words/l_resolve.asm"
+
+ ; Compiler
+ ; resolve backward branch
+ ;VE_LRESOLVE:
+ ; .dw $ff08
+ ; .db "<resolve"
+ ; .dw VE_HEAD
+ ; .set VE_HEAD = VE_LRESOLVE
+ XT_LRESOLVE:
+000790 3801 .dw DO_COLON
+ PFA_LRESOLVE:
+000791 3f8b .dw XT_QSTACK
+000792 075c .dw XT_COMMA
+000793 3820 .dw XT_EXIT
+
+ .include "words/ahead.asm"
+
+ ; Compiler
+ ; do a unconditional branch
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_AHEAD:
+000794 0005 .dw $0005
+000795 6861
+000796 6165
+000797 0064 .db "ahead",0
+000798 0777 .dw VE_HEAD
+ .set VE_HEAD = VE_AHEAD
+ XT_AHEAD:
+000799 3801 .dw DO_COLON
+ PFA_AHEAD:
+ .endif
+00079a 0751 .dw XT_COMPILE
+00079b 382f .dw XT_DOBRANCH
+00079c 0782 .dw XT_GMARK
+00079d 3820 .dw XT_EXIT
+ .include "words/if.asm"
+
+ ; Compiler
+ ; start conditional branch
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_IF:
+00079e 0002 .dw $0002
+00079f 6669 .db "if"
+0007a0 0794 .dw VE_HEAD
+ .set VE_HEAD = VE_IF
+ XT_IF:
+0007a1 3801 .dw DO_COLON
+ PFA_IF:
+ .endif
+0007a2 0751 .dw XT_COMPILE
+0007a3 3836 .dw XT_DOCONDBRANCH
+0007a4 0782 .dw XT_GMARK
+0007a5 3820 .dw XT_EXIT
+ .include "words/else.asm"
+
+ ; Compiler
+ ; resolve the forward reference and place a new unresolved forward reference
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_ELSE:
+0007a6 0004 .dw $0004
+0007a7 6c65
+0007a8 6573 .db "else"
+0007a9 079e .dw VE_HEAD
+ .set VE_HEAD = VE_ELSE
+ XT_ELSE:
+0007aa 3801 .dw DO_COLON
+ PFA_ELSE:
+ .endif
+0007ab 0751 .dw XT_COMPILE
+0007ac 382f .dw XT_DOBRANCH
+0007ad 0782 .dw XT_GMARK
+0007ae 38c4 .dw XT_SWAP
+0007af 0787 .dw XT_GRESOLVE
+0007b0 3820 .dw XT_EXIT
+ .include "words/then.asm"
+
+ ; Compiler
+ ; finish if
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_THEN:
+0007b1 0004 .dw $0004
+0007b2 6874
+0007b3 6e65 .db "then"
+0007b4 07a6 .dw VE_HEAD
+ .set VE_HEAD = VE_THEN
+ XT_THEN:
+0007b5 3801 .dw DO_COLON
+ PFA_THEN:
+ .endif
+0007b6 0787 .dw XT_GRESOLVE
+0007b7 3820 .dw XT_EXIT
+ .include "words/begin.asm"
+
+ ; Compiler
+ ; put the next location for a transfer of control onto the control flow stack
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_BEGIN:
+0007b8 0005 .dw $0005
+0007b9 6562
+0007ba 6967
+0007bb 006e .db "begin",0
+0007bc 07b1 .dw VE_HEAD
+ .set VE_HEAD = VE_BEGIN
+ XT_BEGIN:
+0007bd 3801 .dw DO_COLON
+ PFA_BEGIN:
+ .endif
+0007be 078d .dw XT_LMARK
+0007bf 3820 .dw XT_EXIT
+ .include "words/while.asm"
+
+ ; Compiler
+ ; at runtime skip until repeat if non-true
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_WHILE:
+0007c0 0005 .dw $0005
+0007c1 6877
+0007c2 6c69
+0007c3 0065 .db "while",0
+0007c4 07b8 .dw VE_HEAD
+ .set VE_HEAD = VE_WHILE
+ XT_WHILE:
+0007c5 3801 .dw DO_COLON
+ PFA_WHILE:
+ .endif
+0007c6 07a1 .dw XT_IF
+0007c7 38c4 .dw XT_SWAP
+0007c8 3820 .dw XT_EXIT
+ .include "words/repeat.asm"
+
+ ; Compiler
+ ; continue execution at dest, resolve orig
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_REPEAT:
+0007c9 0006 .dw $0006
+0007ca 6572
+0007cb 6570
+0007cc 7461 .db "repeat"
+0007cd 07c0 .dw VE_HEAD
+ .set VE_HEAD = VE_REPEAT
+ XT_REPEAT:
+0007ce 3801 .dw DO_COLON
+ PFA_REPEAT:
+ .endif
+0007cf 07e2 .dw XT_AGAIN
+0007d0 07b5 .dw XT_THEN
+0007d1 3820 .dw XT_EXIT
+ .include "words/until.asm"
+
+ ; Compiler
+ ; finish begin with conditional branch, leaves the loop if true flag at runtime
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_UNTIL:
+0007d2 0005 .dw $0005
+0007d3 6e75
+0007d4 6974
+0007d5 006c .db "until",0
+0007d6 07c9 .dw VE_HEAD
+ .set VE_HEAD = VE_UNTIL
+ XT_UNTIL:
+0007d7 3801 .dw DO_COLON
+ PFA_UNTIL:
+ .endif
+0007d8 383d .dw XT_DOLITERAL
+0007d9 3836 .dw XT_DOCONDBRANCH
+0007da 075c .dw XT_COMMA
+
+0007db 0790 .dw XT_LRESOLVE
+0007dc 3820 .dw XT_EXIT
+ .include "words/again.asm"
+
+ ; Compiler
+ ; compile a jump back to dest
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_AGAIN:
+0007dd 0005 .dw $0005
+0007de 6761
+0007df 6961
+0007e0 006e .db "again",0
+0007e1 07d2 .dw VE_HEAD
+ .set VE_HEAD = VE_AGAIN
+ XT_AGAIN:
+0007e2 3801 .dw DO_COLON
+ PFA_AGAIN:
+ .endif
+0007e3 0751 .dw XT_COMPILE
+0007e4 382f .dw XT_DOBRANCH
+0007e5 0790 .dw XT_LRESOLVE
+0007e6 3820 .dw XT_EXIT
+ .include "words/do.asm"
+
+ ; Compiler
+ ; start do .. [+]loop
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_DO:
+0007e7 0002 .dw $0002
+0007e8 6f64 .db "do"
+0007e9 07dd .dw VE_HEAD
+ .set VE_HEAD = VE_DO
+ XT_DO:
+0007ea 3801 .dw DO_COLON
+ PFA_DO:
+
+ .endif
+0007eb 0751 .dw XT_COMPILE
+0007ec 3a9b .dw XT_DODO
+0007ed 078d .dw XT_LMARK
+0007ee 3954 .dw XT_ZERO
+0007ef 0845 .dw XT_TO_L
+0007f0 3820 .dw XT_EXIT
+ .include "words/loop.asm"
+
+ ; Compiler
+ ; compile (loop) and resolve the backward branch
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_LOOP:
+0007f1 0004 .dw $0004
+0007f2 6f6c
+0007f3 706f .db "loop"
+0007f4 07e7 .dw VE_HEAD
+ .set VE_HEAD = VE_LOOP
+ XT_LOOP:
+0007f5 3801 .dw DO_COLON
+ PFA_LOOP:
+ .endif
+0007f6 0751 .dw XT_COMPILE
+0007f7 3ac9 .dw XT_DOLOOP
+0007f8 082c .dw XT_ENDLOOP
+0007f9 3820 .dw XT_EXIT
+ .include "words/plusloop.asm"
+
+ ; Compiler
+ ; compile (+loop) and resolve branches
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_PLUSLOOP:
+0007fa 0005 .dw $0005
+0007fb 6c2b
+0007fc 6f6f
+0007fd 0070 .db "+loop",0
+0007fe 07f1 .dw VE_HEAD
+ .set VE_HEAD = VE_PLUSLOOP
+ XT_PLUSLOOP:
+0007ff 3801 .dw DO_COLON
+ PFA_PLUSLOOP:
+ .endif
+000800 0751 .dw XT_COMPILE
+000801 3aba .dw XT_DOPLUSLOOP
+000802 082c .dw XT_ENDLOOP
+000803 3820 .dw XT_EXIT
+ .include "words/leave.asm"
+
+ ; Compiler
+ ; immediatly leave the current DO..LOOP
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_LEAVE:
+000804 0005 .dw $0005
+000805 656c
+000806 7661
+000807 0065 .db "leave",0
+000808 07fa .dw VE_HEAD
+ .set VE_HEAD = VE_LEAVE
+ XT_LEAVE:
+000809 3801 .dw DO_COLON
+ PFA_LEAVE:
+ .endif
+00080a 0751
+00080b 3ad4 .DW XT_COMPILE,XT_UNLOOP
+00080c 0799
+00080d 0845
+00080e 3820 .DW XT_AHEAD,XT_TO_L,XT_EXIT
+ .include "words/qdo.asm"
+
+ ; Compiler
+ ; start a ?do .. [+]loop control structure
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+
+ VE_QDO:
+00080f 0003 .dw $0003
+000810 643f
+000811 006f .db "?do",0
+000812 0804 .dw VE_HEAD
+ .set VE_HEAD = VE_QDO
+ XT_QDO:
+000813 3801 .dw DO_COLON
+ PFA_QDO:
+ .endif
+000814 0751 .dw XT_COMPILE
+000815 081b .dw XT_QDOCHECK
+000816 07a1 .dw XT_IF
+000817 07ea .dw XT_DO
+000818 38c4 .dw XT_SWAP ; DO sets a 0 marker on the leave stack
+000819 0845 .dw XT_TO_L ; then follows at the end.
+00081a 3820 .dw XT_EXIT
+
+ ; there is no special runtime for ?do, the do runtime
+ ; gets wrapped with the sequence
+ ; ... ?do-check if do ..... loop then
+ ; with
+ ; : ?do-check ( n1 n2 -- n1 n2 true | false )
+ ; 2dup = dup >r if 2drop then r> invert ;
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ XT_QDOCHECK:
+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 --
+ ; <resolve backward loop
+ ; BEGIN L> ?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) <builds does> 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<<PGERS)
+003b9c d020 rcall dospm
+
+ DO_STOREI_writepage:
+ ; write page
+003b9d 01f9 movw zl, temp2
+003b9e e004 ldi temp0,(1<<PGWRT)
+003b9f d01d rcall dospm
+
+ ; reenable RWW section
+003ba0 01f9 movw zl, temp2
+003ba1 e100 ldi temp0,(1<<RWWSRE)
+003ba2 d01a rcall dospm
+003ba3 9508 ret
+
+ ; load the desired page
+ .equ pagemask = ~ ( PAGESIZE - 1 )
+ pageload:
+003ba4 01f9 movw zl, temp2
+ ; get the beginning of page
+003ba5 7ce0 andi zl,low(pagemask)
+003ba6 7fff andi zh,high(pagemask)
+003ba7 01ef movw y, z
+ ; loop counter (in words)
+003ba8 e4a0 ldi xl,low(pagesize)
+003ba9 e0b0 ldi xh,high(pagesize)
+ pageload_loop:
+ ; we need the current flash value anyways
+003baa 01fe movw z, y
+003bab 0fee
+003bac 1fff
+003bad 9145
+003bae 9155 readflashcell temp6, temp7 ; destroys Z
+ ; now check: if Z points to the same cell as temp2/3, we want the new data
+003baf 01fe movw z, y
+003bb0 17e2 cp zl, temp2
+003bb1 07f3 cpc zh, temp3
+003bb2 f011 breq pageload_newdata
+003bb3 010a movw r0, temp6
+003bb4 c002 rjmp pageload_cont
+ pageload_newdata:
+003bb5 017a movw temp4, temp6
+003bb6 010c movw r0, tosl
+ pageload_cont:
+003bb7 2700 clr temp0
+003bb8 d004 rcall dospm
+003bb9 9621 adiw y, 1
+003bba 9711 sbiw x, 1
+003bbb f771 brne pageload_loop
+
+ pageload_done:
+003bbc 9508 ret
+
+
+ ;; dospm
+ ;;
+ ;; execute spm instruction
+ ;; temp0 holds the value for SPMCR
+
+ dospm:
+ dospm_wait_ee:
+003bbd 99e1 sbic EECR, EEPE
+003bbe cffe rjmp dospm_wait_ee
+ dospm_wait_spm:
+003bbf b717 in_ temp1, SPMCSR
+003bc0 fd10 sbrc temp1, SPMEN
+003bc1 cffd rjmp dospm_wait_spm
+
+ ; turn the word addres into a byte address
+003bc2 0fee
+003bc3 1fff writeflashcell
+ ; execute spm
+003bc4 6001 ori temp0, (1<<SPMEN)
+003bc5 bf07 out_ SPMCSR,temp0
+003bc6 95e8 spm
+003bc7 9508 ret
+ .endif
+ .include "words/fetch-i.asm"
+
+ ; Memory
+ ; read 1 cell from flash
+ VE_FETCHI:
+003bc8 ff02 .dw $ff02
+003bc9 6940 .db "@i"
+003bca 3b77 .dw VE_HEAD
+ .set VE_HEAD = VE_FETCHI
+ XT_FETCHI:
+003bcb 3bcc .dw PFA_FETCHI
+ PFA_FETCHI:
+003bcc 01fc movw zl, tosl
+003bcd 0fee
+003bce 1fff
+003bcf 9185
+003bd0 9195 readflashcell tosl,tosh
+003bd1 cc33 jmp_ DO_NEXT
+
+ .if AMFORTH_NRWW_SIZE>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) <builds does> 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 @@
+<project name="pollins-32-8" basedir="." default="Help">
+ <target name="p32-8.asm">
+ <copy tofile="p32-8.asm" file="pollin.asm" overwrite="true">
+ <filterset>
+ <filter token="F_CPU" value="8000000"/>
+ <filter token="USART" value=""/>
+ </filterset>
+ </copy>
+ </target>
+
+ <target name="p32-8.hex" depends="p32-8.asm" description="Hexfiles for p32-8">
+ <avrasm2 projectname="p32-8" mcu="atmega32"/>
+ <delete file="p32-8.asm"/>
+ </target>
+
+ <target name="p32-8" depends="p32-8.hex" description="Atmega32 @ 8 MHz">
+ <echo>Uploading Hexfiles for p32-8</echo>
+ <avrdude
+ type="stk200"
+ mcu="atmega32"
+ flashfile="p32-8.hex"
+ eepromfile="p32-8.eep.hex"
+ />
+ </target>
+ <target name="p32-8.fuses" description="Set fuses for P32-8">
+ <echo>Writing fuses</echo>
+ <avrdude-2fuses
+ type="${programmer}"
+ mcu="${mcu}"
+ hfuse="0x99"
+ lfuse="0xff"
+ />
+ </target>
+
+</project>
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<<RXCIE0
+ .equ bm_ENABLE_INT_TX = 1<<UDRIE0
+
+ .equ bm_USARTC_en = 0
+ .equ bm_ASYNC = 0 << 6
+ .equ bm_SYNC = 1 << 6
+ .equ bm_NO_PARITY = 0 << 4
+ .equ bm_EVEN_PARITY = 2 << 4
+ .equ bm_ODD_PARITY = 3 << 4
+ .equ bm_1STOPBIT = 0 << 3
+ .equ bm_2STOPBIT = 1 << 3
+ .equ bm_5BIT = 0 << 1
+ .equ bm_6BIT = 1 << 1
+ .equ bm_7BIT = 2 << 1
+ .equ bm_8BIT = 3 << 1
+
+ .include "drivers/usart_common.asm"
+
+ .set USART_C_VALUE = bm_ASYNC | bm_NO_PARITY | bm_1STOPBIT | bm_8BIT
+ .if WANT_INTERRUPTS == 0
+ .if WANT_ISR_RX == 1
+ .endif
+ .endif
+
+ .if WANT_ISR_RX == 1
+ .set USART_B_VALUE = bm_ENABLE_TX | bm_ENABLE_RX | bm_ENABLE_INT_RX
+ .include "drivers/usart-rx-buffer.asm"
+
+
+ ; sizes have to be powers of 2!
+ .equ usart_rx_size = $10
+ .equ usart_rx_mask = usart_rx_size - 1
+ .dseg
+000100 usart_rx_data: .byte usart_rx_size
+000110 usart_rx_in: .byte 1
+000111 usart_rx_out: .byte 1
+ .cseg
+
+ VE_TO_RXBUF:
+00003d ff07 .dw $ff07
+00003e 723e
+00003f 2d78
+000040 7562
+000041 0066 .db ">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 "<mark"
+ ; .dw VE_HEAD
+ ; .set VE_HEAD = VE_LMARK
+ XT_LMARK:
+000798 3801 .dw DO_COLON
+ PFA_LMARK:
+000799 3f12 .dw XT_DP
+00079a 3820 .dw XT_EXIT
+ .include "words/l_resolve.asm"
+
+ ; Compiler
+ ; resolve backward branch
+ ;VE_LRESOLVE:
+ ; .dw $ff08
+ ; .db "<resolve"
+ ; .dw VE_HEAD
+ ; .set VE_HEAD = VE_LRESOLVE
+ XT_LRESOLVE:
+00079b 3801 .dw DO_COLON
+ PFA_LRESOLVE:
+00079c 3f8b .dw XT_QSTACK
+00079d 0767 .dw XT_COMMA
+00079e 3820 .dw XT_EXIT
+
+ .include "words/ahead.asm"
+
+ ; Compiler
+ ; do a unconditional branch
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_AHEAD:
+00079f 0005 .dw $0005
+0007a0 6861
+0007a1 6165
+0007a2 0064 .db "ahead",0
+0007a3 0782 .dw VE_HEAD
+ .set VE_HEAD = VE_AHEAD
+ XT_AHEAD:
+0007a4 3801 .dw DO_COLON
+ PFA_AHEAD:
+ .endif
+0007a5 075c .dw XT_COMPILE
+0007a6 382f .dw XT_DOBRANCH
+0007a7 078d .dw XT_GMARK
+0007a8 3820 .dw XT_EXIT
+ .include "words/if.asm"
+
+ ; Compiler
+ ; start conditional branch
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_IF:
+0007a9 0002 .dw $0002
+0007aa 6669 .db "if"
+0007ab 079f .dw VE_HEAD
+ .set VE_HEAD = VE_IF
+ XT_IF:
+0007ac 3801 .dw DO_COLON
+ PFA_IF:
+ .endif
+0007ad 075c .dw XT_COMPILE
+0007ae 3836 .dw XT_DOCONDBRANCH
+0007af 078d .dw XT_GMARK
+0007b0 3820 .dw XT_EXIT
+ .include "words/else.asm"
+
+ ; Compiler
+ ; resolve the forward reference and place a new unresolved forward reference
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_ELSE:
+0007b1 0004 .dw $0004
+0007b2 6c65
+0007b3 6573 .db "else"
+0007b4 07a9 .dw VE_HEAD
+ .set VE_HEAD = VE_ELSE
+ XT_ELSE:
+0007b5 3801 .dw DO_COLON
+ PFA_ELSE:
+ .endif
+0007b6 075c .dw XT_COMPILE
+0007b7 382f .dw XT_DOBRANCH
+0007b8 078d .dw XT_GMARK
+0007b9 38c4 .dw XT_SWAP
+0007ba 0792 .dw XT_GRESOLVE
+0007bb 3820 .dw XT_EXIT
+ .include "words/then.asm"
+
+ ; Compiler
+ ; finish if
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_THEN:
+0007bc 0004 .dw $0004
+0007bd 6874
+0007be 6e65 .db "then"
+0007bf 07b1 .dw VE_HEAD
+ .set VE_HEAD = VE_THEN
+ XT_THEN:
+0007c0 3801 .dw DO_COLON
+ PFA_THEN:
+ .endif
+0007c1 0792 .dw XT_GRESOLVE
+0007c2 3820 .dw XT_EXIT
+ .include "words/begin.asm"
+
+ ; Compiler
+ ; put the next location for a transfer of control onto the control flow stack
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_BEGIN:
+0007c3 0005 .dw $0005
+0007c4 6562
+0007c5 6967
+0007c6 006e .db "begin",0
+0007c7 07bc .dw VE_HEAD
+ .set VE_HEAD = VE_BEGIN
+ XT_BEGIN:
+0007c8 3801 .dw DO_COLON
+ PFA_BEGIN:
+ .endif
+0007c9 0798 .dw XT_LMARK
+0007ca 3820 .dw XT_EXIT
+ .include "words/while.asm"
+
+ ; Compiler
+ ; at runtime skip until repeat if non-true
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_WHILE:
+0007cb 0005 .dw $0005
+0007cc 6877
+0007cd 6c69
+0007ce 0065 .db "while",0
+0007cf 07c3 .dw VE_HEAD
+ .set VE_HEAD = VE_WHILE
+ XT_WHILE:
+0007d0 3801 .dw DO_COLON
+ PFA_WHILE:
+ .endif
+0007d1 07ac .dw XT_IF
+0007d2 38c4 .dw XT_SWAP
+0007d3 3820 .dw XT_EXIT
+ .include "words/repeat.asm"
+
+ ; Compiler
+ ; continue execution at dest, resolve orig
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_REPEAT:
+0007d4 0006 .dw $0006
+0007d5 6572
+0007d6 6570
+0007d7 7461 .db "repeat"
+0007d8 07cb .dw VE_HEAD
+ .set VE_HEAD = VE_REPEAT
+ XT_REPEAT:
+0007d9 3801 .dw DO_COLON
+ PFA_REPEAT:
+ .endif
+0007da 07ed .dw XT_AGAIN
+0007db 07c0 .dw XT_THEN
+0007dc 3820 .dw XT_EXIT
+ .include "words/until.asm"
+
+ ; Compiler
+ ; finish begin with conditional branch, leaves the loop if true flag at runtime
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_UNTIL:
+0007dd 0005 .dw $0005
+0007de 6e75
+0007df 6974
+0007e0 006c .db "until",0
+0007e1 07d4 .dw VE_HEAD
+ .set VE_HEAD = VE_UNTIL
+ XT_UNTIL:
+0007e2 3801 .dw DO_COLON
+ PFA_UNTIL:
+ .endif
+0007e3 383d .dw XT_DOLITERAL
+0007e4 3836 .dw XT_DOCONDBRANCH
+0007e5 0767 .dw XT_COMMA
+
+0007e6 079b .dw XT_LRESOLVE
+0007e7 3820 .dw XT_EXIT
+ .include "words/again.asm"
+
+ ; Compiler
+ ; compile a jump back to dest
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_AGAIN:
+0007e8 0005 .dw $0005
+0007e9 6761
+0007ea 6961
+0007eb 006e .db "again",0
+0007ec 07dd .dw VE_HEAD
+ .set VE_HEAD = VE_AGAIN
+ XT_AGAIN:
+0007ed 3801 .dw DO_COLON
+ PFA_AGAIN:
+ .endif
+0007ee 075c .dw XT_COMPILE
+0007ef 382f .dw XT_DOBRANCH
+0007f0 079b .dw XT_LRESOLVE
+0007f1 3820 .dw XT_EXIT
+ .include "words/do.asm"
+
+ ; Compiler
+ ; start do .. [+]loop
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_DO:
+0007f2 0002 .dw $0002
+0007f3 6f64 .db "do"
+0007f4 07e8 .dw VE_HEAD
+ .set VE_HEAD = VE_DO
+ XT_DO:
+0007f5 3801 .dw DO_COLON
+ PFA_DO:
+
+ .endif
+0007f6 075c .dw XT_COMPILE
+0007f7 3a9b .dw XT_DODO
+0007f8 0798 .dw XT_LMARK
+0007f9 3954 .dw XT_ZERO
+0007fa 0850 .dw XT_TO_L
+0007fb 3820 .dw XT_EXIT
+ .include "words/loop.asm"
+
+ ; Compiler
+ ; compile (loop) and resolve the backward branch
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_LOOP:
+0007fc 0004 .dw $0004
+0007fd 6f6c
+0007fe 706f .db "loop"
+0007ff 07f2 .dw VE_HEAD
+ .set VE_HEAD = VE_LOOP
+ XT_LOOP:
+000800 3801 .dw DO_COLON
+ PFA_LOOP:
+ .endif
+000801 075c .dw XT_COMPILE
+000802 3ac9 .dw XT_DOLOOP
+000803 0837 .dw XT_ENDLOOP
+000804 3820 .dw XT_EXIT
+ .include "words/plusloop.asm"
+
+ ; Compiler
+ ; compile (+loop) and resolve branches
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_PLUSLOOP:
+000805 0005 .dw $0005
+000806 6c2b
+000807 6f6f
+000808 0070 .db "+loop",0
+000809 07fc .dw VE_HEAD
+ .set VE_HEAD = VE_PLUSLOOP
+ XT_PLUSLOOP:
+00080a 3801 .dw DO_COLON
+ PFA_PLUSLOOP:
+ .endif
+00080b 075c .dw XT_COMPILE
+00080c 3aba .dw XT_DOPLUSLOOP
+00080d 0837 .dw XT_ENDLOOP
+00080e 3820 .dw XT_EXIT
+ .include "words/leave.asm"
+
+ ; Compiler
+ ; immediatly leave the current DO..LOOP
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_LEAVE:
+00080f 0005 .dw $0005
+000810 656c
+000811 7661
+000812 0065 .db "leave",0
+000813 0805 .dw VE_HEAD
+ .set VE_HEAD = VE_LEAVE
+ XT_LEAVE:
+000814 3801 .dw DO_COLON
+ PFA_LEAVE:
+ .endif
+000815 075c
+000816 3ad4 .DW XT_COMPILE,XT_UNLOOP
+000817 07a4
+000818 0850
+000819 3820 .DW XT_AHEAD,XT_TO_L,XT_EXIT
+ .include "words/qdo.asm"
+
+ ; Compiler
+ ; start a ?do .. [+]loop control structure
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+
+ VE_QDO:
+00081a 0003 .dw $0003
+00081b 643f
+00081c 006f .db "?do",0
+00081d 080f .dw VE_HEAD
+ .set VE_HEAD = VE_QDO
+ XT_QDO:
+00081e 3801 .dw DO_COLON
+ PFA_QDO:
+ .endif
+00081f 075c .dw XT_COMPILE
+000820 0826 .dw XT_QDOCHECK
+000821 07ac .dw XT_IF
+000822 07f5 .dw XT_DO
+000823 38c4 .dw XT_SWAP ; DO sets a 0 marker on the leave stack
+000824 0850 .dw XT_TO_L ; then follows at the end.
+000825 3820 .dw XT_EXIT
+
+ ; there is no special runtime for ?do, the do runtime
+ ; gets wrapped with the sequence
+ ; ... ?do-check if do ..... loop then
+ ; with
+ ; : ?do-check ( n1 n2 -- n1 n2 true | false )
+ ; 2dup = dup >r if 2drop then r> invert ;
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ XT_QDOCHECK:
+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 --
+ ; <resolve backward loop
+ ; BEGIN L> ?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) <builds does> 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<<PGERS)
+003b9c d020 rcall dospm
+
+ DO_STOREI_writepage:
+ ; write page
+003b9d 01f9 movw zl, temp2
+003b9e e004 ldi temp0,(1<<PGWRT)
+003b9f d01d rcall dospm
+
+ ; reenable RWW section
+003ba0 01f9 movw zl, temp2
+003ba1 e100 ldi temp0,(1<<RWWSRE)
+003ba2 d01a rcall dospm
+003ba3 9508 ret
+
+ ; load the desired page
+ .equ pagemask = ~ ( PAGESIZE - 1 )
+ pageload:
+003ba4 01f9 movw zl, temp2
+ ; get the beginning of page
+003ba5 7ce0 andi zl,low(pagemask)
+003ba6 7fff andi zh,high(pagemask)
+003ba7 01ef movw y, z
+ ; loop counter (in words)
+003ba8 e4a0 ldi xl,low(pagesize)
+003ba9 e0b0 ldi xh,high(pagesize)
+ pageload_loop:
+ ; we need the current flash value anyways
+003baa 01fe movw z, y
+003bab 0fee
+003bac 1fff
+003bad 9145
+003bae 9155 readflashcell temp6, temp7 ; destroys Z
+ ; now check: if Z points to the same cell as temp2/3, we want the new data
+003baf 01fe movw z, y
+003bb0 17e2 cp zl, temp2
+003bb1 07f3 cpc zh, temp3
+003bb2 f011 breq pageload_newdata
+003bb3 010a movw r0, temp6
+003bb4 c002 rjmp pageload_cont
+ pageload_newdata:
+003bb5 017a movw temp4, temp6
+003bb6 010c movw r0, tosl
+ pageload_cont:
+003bb7 2700 clr temp0
+003bb8 d004 rcall dospm
+003bb9 9621 adiw y, 1
+003bba 9711 sbiw x, 1
+003bbb f771 brne pageload_loop
+
+ pageload_done:
+003bbc 9508 ret
+
+
+ ;; dospm
+ ;;
+ ;; execute spm instruction
+ ;; temp0 holds the value for SPMCR
+
+ dospm:
+ dospm_wait_ee:
+003bbd 99f9 sbic EECR, EEPE
+003bbe cffe rjmp dospm_wait_ee
+ dospm_wait_spm:
+003bbf b717 in_ temp1, SPMCSR
+003bc0 fd10 sbrc temp1, SPMEN
+003bc1 cffd rjmp dospm_wait_spm
+
+ ; turn the word addres into a byte address
+003bc2 0fee
+003bc3 1fff writeflashcell
+ ; execute spm
+003bc4 6001 ori temp0, (1<<SPMEN)
+003bc5 bf07 out_ SPMCSR,temp0
+003bc6 95e8 spm
+003bc7 9508 ret
+ .endif
+ .include "words/fetch-i.asm"
+
+ ; Memory
+ ; read 1 cell from flash
+ VE_FETCHI:
+003bc8 ff02 .dw $ff02
+003bc9 6940 .db "@i"
+003bca 3b77 .dw VE_HEAD
+ .set VE_HEAD = VE_FETCHI
+ XT_FETCHI:
+003bcb 3bcc .dw PFA_FETCHI
+ PFA_FETCHI:
+003bcc 01fc movw zl, tosl
+003bcd 0fee
+003bce 1fff
+003bcf 9185
+003bd0 9195 readflashcell tosl,tosh
+003bd1 cc33 jmp_ DO_NEXT
+
+ .if AMFORTH_NRWW_SIZE>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) <builds does> 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 @@
+<project name="pollins-328-16" basedir="." default="Help">
+ <target name="p328-16.asm">
+ <copy tofile="p328-16.asm" file="pollin.asm" overwrite="true">
+ <filterset>
+ <filter token="F_CPU" value="16000000"/>
+ <filter token="USART" value="_0"/>
+ </filterset>
+ </copy>
+ </target>
+
+ <target name="p328-16.hex" depends="p328-16.asm" description="Hexfiles for p328-16">
+ <avrasm2 projectname="p328-16" mcu="atmega328p"/>
+ <delete file="p328-16.asm"/>
+ </target>
+
+ <target name="p328-16" depends="p328-16.hex" description="Atmega328 @ 16 MHz">
+ <echo>Uploading Hexfiles for p328-16</echo>
+ <avrdude
+ type="stk200"
+ mcu="atmega328p"
+ flashfile="p328-16.hex"
+ eepromfile="p328-16.eep.hex"
+ />
+ </target>
+ <target name="p328-16.fuses" description="Set fuses for P16-8">
+ <echo>Writing fuses</echo>
+ <avrdude-3fuses
+ type="${programmer}"
+ mcu="${mcu}"
+ efuse="0xff"
+ hfuse="0xd9"
+ lfuse="0xc6"
+ />
+ </target>
+
+</project>
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<<RXCIE0
+ .equ bm_ENABLE_INT_TX = 1<<UDRIE0
+
+ .equ bm_USARTC_en = 0
+ .equ bm_ASYNC = 0 << 6
+ .equ bm_SYNC = 1 << 6
+ .equ bm_NO_PARITY = 0 << 4
+ .equ bm_EVEN_PARITY = 2 << 4
+ .equ bm_ODD_PARITY = 3 << 4
+ .equ bm_1STOPBIT = 0 << 3
+ .equ bm_2STOPBIT = 1 << 3
+ .equ bm_5BIT = 0 << 1
+ .equ bm_6BIT = 1 << 1
+ .equ bm_7BIT = 2 << 1
+ .equ bm_8BIT = 3 << 1
+
+ .include "drivers/usart_common.asm"
+
+ .set USART_C_VALUE = bm_ASYNC | bm_NO_PARITY | bm_1STOPBIT | bm_8BIT
+ .if WANT_INTERRUPTS == 0
+ .if WANT_ISR_RX == 1
+ .endif
+ .endif
+
+ .if WANT_ISR_RX == 1
+ .set USART_B_VALUE = bm_ENABLE_TX | bm_ENABLE_RX | bm_ENABLE_INT_RX
+ .include "drivers/usart-rx-buffer.asm"
+
+
+ ; sizes have to be powers of 2!
+ .equ usart_rx_size = $10
+ .equ usart_rx_mask = usart_rx_size - 1
+ .dseg
+000100 usart_rx_data: .byte usart_rx_size
+000110 usart_rx_in: .byte 1
+000111 usart_rx_out: .byte 1
+ .cseg
+
+ VE_TO_RXBUF:
+000041 ff07 .dw $ff07
+000042 723e
+000043 2d78
+000044 7562
+000045 0066 .db ">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 "<mark"
+ ; .dw VE_HEAD
+ ; .set VE_HEAD = VE_LMARK
+ XT_LMARK:
+0001fd 7001 .dw DO_COLON
+ PFA_LMARK:
+0001fe 75ae .dw XT_DP
+0001ff 7020 .dw XT_EXIT
+ .include "words/l_resolve.asm"
+
+ ; Compiler
+ ; resolve backward branch
+ ;VE_LRESOLVE:
+ ; .dw $ff08
+ ; .db "<resolve"
+ ; .dw VE_HEAD
+ ; .set VE_HEAD = VE_LRESOLVE
+ XT_LRESOLVE:
+000200 7001 .dw DO_COLON
+ PFA_LRESOLVE:
+000201 7b57 .dw XT_QSTACK
+000202 01cc .dw XT_COMMA
+000203 7020 .dw XT_EXIT
+
+ .include "words/ahead.asm"
+
+ ; Compiler
+ ; do a unconditional branch
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_AHEAD:
+000204 0005 .dw $0005
+000205 6861
+000206 6165
+000207 0064 .db "ahead",0
+000208 01e7 .dw VE_HEAD
+ .set VE_HEAD = VE_AHEAD
+ XT_AHEAD:
+000209 7001 .dw DO_COLON
+ PFA_AHEAD:
+ .endif
+00020a 01c1 .dw XT_COMPILE
+00020b 702f .dw XT_DOBRANCH
+00020c 01f2 .dw XT_GMARK
+00020d 7020 .dw XT_EXIT
+ .include "words/if.asm"
+
+ ; Compiler
+ ; start conditional branch
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_IF:
+00020e 0002 .dw $0002
+00020f 6669 .db "if"
+000210 0204 .dw VE_HEAD
+ .set VE_HEAD = VE_IF
+ XT_IF:
+000211 7001 .dw DO_COLON
+ PFA_IF:
+ .endif
+000212 01c1 .dw XT_COMPILE
+000213 7036 .dw XT_DOCONDBRANCH
+000214 01f2 .dw XT_GMARK
+000215 7020 .dw XT_EXIT
+ .include "words/else.asm"
+
+ ; Compiler
+ ; resolve the forward reference and place a new unresolved forward reference
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_ELSE:
+000216 0004 .dw $0004
+000217 6c65
+000218 6573 .db "else"
+000219 020e .dw VE_HEAD
+ .set VE_HEAD = VE_ELSE
+ XT_ELSE:
+00021a 7001 .dw DO_COLON
+ PFA_ELSE:
+ .endif
+00021b 01c1 .dw XT_COMPILE
+00021c 702f .dw XT_DOBRANCH
+00021d 01f2 .dw XT_GMARK
+00021e 70c4 .dw XT_SWAP
+00021f 01f7 .dw XT_GRESOLVE
+000220 7020 .dw XT_EXIT
+ .include "words/then.asm"
+
+ ; Compiler
+ ; finish if
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_THEN:
+000221 0004 .dw $0004
+000222 6874
+000223 6e65 .db "then"
+000224 0216 .dw VE_HEAD
+ .set VE_HEAD = VE_THEN
+ XT_THEN:
+000225 7001 .dw DO_COLON
+ PFA_THEN:
+ .endif
+000226 01f7 .dw XT_GRESOLVE
+000227 7020 .dw XT_EXIT
+ .include "words/begin.asm"
+
+ ; Compiler
+ ; put the next location for a transfer of control onto the control flow stack
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_BEGIN:
+000228 0005 .dw $0005
+000229 6562
+00022a 6967
+00022b 006e .db "begin",0
+00022c 0221 .dw VE_HEAD
+ .set VE_HEAD = VE_BEGIN
+ XT_BEGIN:
+00022d 7001 .dw DO_COLON
+ PFA_BEGIN:
+ .endif
+00022e 01fd .dw XT_LMARK
+00022f 7020 .dw XT_EXIT
+ .include "words/while.asm"
+
+ ; Compiler
+ ; at runtime skip until repeat if non-true
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_WHILE:
+000230 0005 .dw $0005
+000231 6877
+000232 6c69
+000233 0065 .db "while",0
+000234 0228 .dw VE_HEAD
+ .set VE_HEAD = VE_WHILE
+ XT_WHILE:
+000235 7001 .dw DO_COLON
+ PFA_WHILE:
+ .endif
+000236 0211 .dw XT_IF
+000237 70c4 .dw XT_SWAP
+000238 7020 .dw XT_EXIT
+ .include "words/repeat.asm"
+
+ ; Compiler
+ ; continue execution at dest, resolve orig
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_REPEAT:
+000239 0006 .dw $0006
+00023a 6572
+00023b 6570
+00023c 7461 .db "repeat"
+00023d 0230 .dw VE_HEAD
+ .set VE_HEAD = VE_REPEAT
+ XT_REPEAT:
+00023e 7001 .dw DO_COLON
+ PFA_REPEAT:
+ .endif
+00023f 0252 .dw XT_AGAIN
+000240 0225 .dw XT_THEN
+000241 7020 .dw XT_EXIT
+ .include "words/until.asm"
+
+ ; Compiler
+ ; finish begin with conditional branch, leaves the loop if true flag at runtime
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_UNTIL:
+000242 0005 .dw $0005
+000243 6e75
+000244 6974
+000245 006c .db "until",0
+000246 0239 .dw VE_HEAD
+ .set VE_HEAD = VE_UNTIL
+ XT_UNTIL:
+000247 7001 .dw DO_COLON
+ PFA_UNTIL:
+ .endif
+000248 703d .dw XT_DOLITERAL
+000249 7036 .dw XT_DOCONDBRANCH
+00024a 01cc .dw XT_COMMA
+
+00024b 0200 .dw XT_LRESOLVE
+00024c 7020 .dw XT_EXIT
+ .include "words/again.asm"
+
+ ; Compiler
+ ; compile a jump back to dest
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_AGAIN:
+00024d 0005 .dw $0005
+00024e 6761
+00024f 6961
+000250 006e .db "again",0
+000251 0242 .dw VE_HEAD
+ .set VE_HEAD = VE_AGAIN
+ XT_AGAIN:
+000252 7001 .dw DO_COLON
+ PFA_AGAIN:
+ .endif
+000253 01c1 .dw XT_COMPILE
+000254 702f .dw XT_DOBRANCH
+000255 0200 .dw XT_LRESOLVE
+000256 7020 .dw XT_EXIT
+ .include "words/do.asm"
+
+ ; Compiler
+ ; start do .. [+]loop
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_DO:
+000257 0002 .dw $0002
+000258 6f64 .db "do"
+000259 024d .dw VE_HEAD
+ .set VE_HEAD = VE_DO
+ XT_DO:
+00025a 7001 .dw DO_COLON
+ PFA_DO:
+
+ .endif
+00025b 01c1 .dw XT_COMPILE
+00025c 729b .dw XT_DODO
+00025d 01fd .dw XT_LMARK
+00025e 7154 .dw XT_ZERO
+00025f 02b5 .dw XT_TO_L
+000260 7020 .dw XT_EXIT
+ .include "words/loop.asm"
+
+ ; Compiler
+ ; compile (loop) and resolve the backward branch
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_LOOP:
+000261 0004 .dw $0004
+000262 6f6c
+000263 706f .db "loop"
+000264 0257 .dw VE_HEAD
+ .set VE_HEAD = VE_LOOP
+ XT_LOOP:
+000265 7001 .dw DO_COLON
+ PFA_LOOP:
+ .endif
+000266 01c1 .dw XT_COMPILE
+000267 72c9 .dw XT_DOLOOP
+000268 029c .dw XT_ENDLOOP
+000269 7020 .dw XT_EXIT
+ .include "words/plusloop.asm"
+
+ ; Compiler
+ ; compile (+loop) and resolve branches
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_PLUSLOOP:
+00026a 0005 .dw $0005
+00026b 6c2b
+00026c 6f6f
+00026d 0070 .db "+loop",0
+00026e 0261 .dw VE_HEAD
+ .set VE_HEAD = VE_PLUSLOOP
+ XT_PLUSLOOP:
+00026f 7001 .dw DO_COLON
+ PFA_PLUSLOOP:
+ .endif
+000270 01c1 .dw XT_COMPILE
+000271 72ba .dw XT_DOPLUSLOOP
+000272 029c .dw XT_ENDLOOP
+000273 7020 .dw XT_EXIT
+ .include "words/leave.asm"
+
+ ; Compiler
+ ; immediatly leave the current DO..LOOP
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_LEAVE:
+000274 0005 .dw $0005
+000275 656c
+000276 7661
+000277 0065 .db "leave",0
+000278 026a .dw VE_HEAD
+ .set VE_HEAD = VE_LEAVE
+ XT_LEAVE:
+000279 7001 .dw DO_COLON
+ PFA_LEAVE:
+ .endif
+00027a 01c1
+00027b 72d4 .DW XT_COMPILE,XT_UNLOOP
+00027c 0209
+00027d 02b5
+00027e 7020 .DW XT_AHEAD,XT_TO_L,XT_EXIT
+ .include "words/qdo.asm"
+
+ ; Compiler
+ ; start a ?do .. [+]loop control structure
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+
+ VE_QDO:
+00027f 0003 .dw $0003
+000280 643f
+000281 006f .db "?do",0
+000282 0274 .dw VE_HEAD
+ .set VE_HEAD = VE_QDO
+ XT_QDO:
+000283 7001 .dw DO_COLON
+ PFA_QDO:
+ .endif
+000284 01c1 .dw XT_COMPILE
+000285 028b .dw XT_QDOCHECK
+000286 0211 .dw XT_IF
+000287 025a .dw XT_DO
+000288 70c4 .dw XT_SWAP ; DO sets a 0 marker on the leave stack
+000289 02b5 .dw XT_TO_L ; then follows at the end.
+00028a 7020 .dw XT_EXIT
+
+ ; there is no special runtime for ?do, the do runtime
+ ; gets wrapped with the sequence
+ ; ... ?do-check if do ..... loop then
+ ; with
+ ; : ?do-check ( n1 n2 -- n1 n2 true | false )
+ ; 2dup = dup >r if 2drop then r> invert ;
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ XT_QDOCHECK:
+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 --
+ ; <resolve backward loop
+ ; BEGIN L> ?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) <builds does> 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<<PGERS)
+00739c d020 rcall dospm
+
+ DO_STOREI_writepage:
+ ; write page
+00739d 01f9 movw zl, temp2
+00739e e004 ldi temp0,(1<<PGWRT)
+00739f d01d rcall dospm
+
+ ; reenable RWW section
+0073a0 01f9 movw zl, temp2
+0073a1 e100 ldi temp0,(1<<RWWSRE)
+0073a2 d01a rcall dospm
+0073a3 9508 ret
+
+ ; load the desired page
+ .equ pagemask = ~ ( PAGESIZE - 1 )
+ pageload:
+0073a4 01f9 movw zl, temp2
+ ; get the beginning of page
+0073a5 78e0 andi zl,low(pagemask)
+0073a6 7fff andi zh,high(pagemask)
+0073a7 01ef movw y, z
+ ; loop counter (in words)
+0073a8 e8a0 ldi xl,low(pagesize)
+0073a9 e0b0 ldi xh,high(pagesize)
+ pageload_loop:
+ ; we need the current flash value anyways
+0073aa 01fe movw z, y
+0073ab 0fee
+0073ac 1fff
+0073ad 9145
+0073ae 9155 readflashcell temp6, temp7 ; destroys Z
+ ; now check: if Z points to the same cell as temp2/3, we want the new data
+0073af 01fe movw z, y
+0073b0 17e2 cp zl, temp2
+0073b1 07f3 cpc zh, temp3
+0073b2 f011 breq pageload_newdata
+0073b3 010a movw r0, temp6
+0073b4 c002 rjmp pageload_cont
+ pageload_newdata:
+0073b5 017a movw temp4, temp6
+0073b6 010c movw r0, tosl
+ pageload_cont:
+0073b7 2700 clr temp0
+0073b8 d004 rcall dospm
+0073b9 9621 adiw y, 1
+0073ba 9711 sbiw x, 1
+0073bb f771 brne pageload_loop
+
+ pageload_done:
+0073bc 9508 ret
+
+
+ ;; dospm
+ ;;
+ ;; execute spm instruction
+ ;; temp0 holds the value for SPMCR
+
+ dospm:
+ dospm_wait_ee:
+0073bd 99f9 sbic EECR, EEPE
+0073be cffe rjmp dospm_wait_ee
+ dospm_wait_spm:
+0073bf b717 in_ temp1, SPMCSR
+0073c0 fd10 sbrc temp1, SPMEN
+0073c1 cffd rjmp dospm_wait_spm
+
+ ; turn the word addres into a byte address
+0073c2 0fee
+0073c3 1fff writeflashcell
+ ; execute spm
+0073c4 6001 ori temp0, (1<<SPMEN)
+0073c5 bf07 out_ SPMCSR,temp0
+0073c6 95e8 spm
+0073c7 9508 ret
+ .endif
+ .include "words/fetch-i.asm"
+
+ ; Memory
+ ; read 1 cell from flash
+ VE_FETCHI:
+0073c8 ff02 .dw $ff02
+0073c9 6940 .db "@i"
+0073ca 7377 .dw VE_HEAD
+ .set VE_HEAD = VE_FETCHI
+ XT_FETCHI:
+0073cb 73cc .dw PFA_FETCHI
+ PFA_FETCHI:
+0073cc 01fc movw zl, tosl
+0073cd 0fee
+0073ce 1fff
+0073cf 9185
+0073d0 9195 readflashcell tosl,tosh
+0073d1 cc33 jmp_ DO_NEXT
+
+ .if AMFORTH_NRWW_SIZE>8000
+ .include "dict/core_8k.inc"
+
+ .include "words/n_to_r.asm"
+
+ ; Stack
+ ; move n items from data stack to return stack
+ VE_N_TO_R:
+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) <builds does> dup i-cell+ @i execute execute ;
+
+
+ .include "words/search-wordlist.asm"
+
+ ; Search Order
+ ; searches the word list wid for the word at c-addr/len
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_SEARCH_WORDLIST:
+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 @@
+<project name="pollins-644-16" basedir="." default="Help">
+
+ <target name="p644-16.asm">
+ <copy tofile="p644-16.asm" file="pollin.asm" overwrite="true">
+ <filterset>
+ <filter token="F_CPU" value="16000000"/>
+ <filter token="USART" value="_0"/>
+ </filterset>
+ </copy>
+ </target>
+
+ <target name="p644-16.hex" depends="p644-16.asm" description="Hexfiles for p644-16">
+ <avrasm2 projectname="p644-16" mcu="atmega644"/>
+ <delete file="p644-16.asm"/>
+ </target>
+
+ <target name="p644-16" depends="p644-16.hex" description="Atmega644 @ 16 MHz">
+ <echo>Uploading Hexfiles for p644 - 16</echo>
+ <avrdude
+ type="mysmartusb"
+ mcu="atmega644"
+ flashfile="p644-16.hex"
+ eepromfile="p644-16.eep.hex"
+ />
+ </target>
+
+</project>
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 @@
+<project name="pollins-8-12" basedir="." default="Help">
+
+ <target name="p8-12.asm">
+ <copy tofile="p8-12.asm" file="pollin.asm" overwrite="true">
+ <filterset>
+ <filter token="F_CPU" value="12000000"/>
+ <filter token="USART" value=""/>
+ </filterset>
+ </copy>
+ </target>
+ <target name="p8-12.hex" description="Hexfiles for p8-12" depends="p8-12.asm">
+ <avrasm2 projectname="p8-12" mcu="atmega88"/>
+
+ </target>
+
+ <target name="p8-12" depends="p8-12.hex" description="Atmega8 @ 12 MHz">
+ <echo>Uploading Hexfiles for p8-12</echo>
+ <avrdude
+ type="stk200"
+ mcu="atmega88"
+ flashfile="p8-12.hex"
+ eepromfile="p8-12.eep.hex"
+ />
+ </target>
+</project>
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