aboutsummaryrefslogtreecommitdiff
path: root/amforth-6.5/appl/arduino
diff options
context:
space:
mode:
Diffstat (limited to 'amforth-6.5/appl/arduino')
-rw-r--r--amforth-6.5/appl/arduino/Makefile191
-rw-r--r--amforth-6.5/appl/arduino/blocks/led-mega.frt38
-rw-r--r--amforth-6.5/appl/arduino/blocks/led-mega.readme114
-rw-r--r--amforth-6.5/appl/arduino/blocks/ports-leonardo.frt74
-rw-r--r--amforth-6.5/appl/arduino/blocks/ports-mega128.frt104
-rw-r--r--amforth-6.5/appl/arduino/blocks/ports-standard.frt49
-rw-r--r--amforth-6.5/appl/arduino/blocks/test_danger_shield.fs437
-rw-r--r--amforth-6.5/appl/arduino/blocks/wiring_analog.frt65
-rw-r--r--amforth-6.5/appl/arduino/build.xml95
-rw-r--r--amforth-6.5/appl/arduino/dict_appl.inc7
-rw-r--r--amforth-6.5/appl/arduino/dict_appl_core.inc2
-rw-r--r--amforth-6.5/appl/arduino/diecimila.asm9
-rw-r--r--amforth-6.5/appl/arduino/duemilanove.asm13
-rw-r--r--amforth-6.5/appl/arduino/duemilanove.eep.hex7
-rw-r--r--amforth-6.5/appl/arduino/duemilanove.hex613
-rw-r--r--amforth-6.5/appl/arduino/duemilanove.lst10094
-rw-r--r--amforth-6.5/appl/arduino/duemilanove.map2021
-rw-r--r--amforth-6.5/appl/arduino/leonardo.asm15
-rw-r--r--amforth-6.5/appl/arduino/leonardo.eep.hex7
-rw-r--r--amforth-6.5/appl/arduino/leonardo.hex630
-rw-r--r--amforth-6.5/appl/arduino/leonardo.lst10136
-rw-r--r--amforth-6.5/appl/arduino/leonardo.map2333
-rw-r--r--amforth-6.5/appl/arduino/mega128.asm18
-rw-r--r--amforth-6.5/appl/arduino/mega128.eep.hex7
-rw-r--r--amforth-6.5/appl/arduino/mega128.hex657
-rw-r--r--amforth-6.5/appl/arduino/mega128.lst10415
-rw-r--r--amforth-6.5/appl/arduino/mega128.map2715
-rw-r--r--amforth-6.5/appl/arduino/readme.txt50
-rw-r--r--amforth-6.5/appl/arduino/sanguino.asm10
-rw-r--r--amforth-6.5/appl/arduino/uno.asm15
-rw-r--r--amforth-6.5/appl/arduino/uno.eep.hex7
-rw-r--r--amforth-6.5/appl/arduino/uno.hex620
-rw-r--r--amforth-6.5/appl/arduino/uno.lst10263
-rw-r--r--amforth-6.5/appl/arduino/uno.map2030
-rw-r--r--amforth-6.5/appl/arduino/words/applturnkey.asm25
35 files changed, 53886 insertions, 0 deletions
diff --git a/amforth-6.5/appl/arduino/Makefile b/amforth-6.5/appl/arduino/Makefile
new file mode 100644
index 0000000..acec7c8
--- /dev/null
+++ b/amforth-6.5/appl/arduino/Makefile
@@ -0,0 +1,191 @@
+# Simple makefile for building the
+# Arduino amforth vor various targets
+
+# Examples of usage for Arduino leonardo:
+#
+# 1) Assemble the whole flash and eemprom files
+# make leonardo.hex
+#
+# 2) Backup the current flash & eeprom values
+# make leonardo.bak
+#
+# 3) Erase the whole MCU Flash
+# make leonardo.era
+#
+# 4) Upload the new firmware using the hex file generated
+# make leonardo
+#
+# 5) Set the appropiate MCU fuses
+# make leonardo.fuse
+#
+# 6) Clear files (except backup)
+# make leonardo.clr
+
+
+SHELL=/bin/bash
+
+##############################
+# TARGET DEPENDANT VARIABLES #
+##############################
+
+# 1) MCU should be identical to the device
+# Look at the .../avr8/devices/ folder
+# 2) PART is the device model passed to avrdude.
+# 3) LFUSE, HFUSE, EFUSE are the device-specific fuses
+# there is a useful fuse calc tool at:
+# http://www.engbedded.com/fusecalc/
+# --------------------------------------
+# Example fuse settings for 'leonardo'
+# Low Fuse LFUSE=0xFF
+# - No Div8 prescaler,
+# - No ouptput Clock,
+# - Low Crystal mode: >=8 MHz + start-up time: 16K CK cycles + 65 ms
+# High Fuse HFUSE=0xD9
+# - Enable Serial Programming & Downloading
+# - Bootsize 2048 words (4096 bytes)
+# Extended Fuse EFUSE=0xF9
+# - Brown-out detection @ 3.5V
+# - no Hardware Boot Vector (=boot at $0000)
+# --------------------------------------
+
+leonardo: PART=m32u4
+leonardo.hex: MCU=atmega32u4
+leonardo.era: PART=m32u4
+leonardo.bak: PART=m32u4
+leonardo.fuse: PART=m32u4
+leonardo.fuse: LFUSE=0xFF
+leonardo.fuse: HFUSE=0xD9
+leonardo.fuse: EFUSE=0xE9
+
+uno: PART=m328p
+uno.hex: MCU=atmega328p
+uno.era: PART=m328p
+uno.bak: PART=m328p
+uno.fuse: PART=m328p
+uno.fuse: LFUSE=0xFF
+uno.fuse: HFUSE=0xD9
+uno.fuse: EFUSE=0x05
+
+mega128: PART=m1280
+mega128.hex: MCU=atmega1280
+mega128.era: PART=m1280
+mega128.bak: PART=m1280
+mega128.fuse: PART=m1280
+mega128.fuse: LFUSE=0xFF
+mega128.fuse: HFUSE=0xD9
+mega128.fuse: EFUSE=0xF7
+
+sanguino: PART=m644p
+sanguino.hex: MCU=atmega644p
+sanguino.era: PART=m644p
+sanguino.bak: PART=m644p
+sanguino.fuse: PART=m644p
+sanguino.fuse: LFUSE=0xFF
+sanguino.fuse: HFUSE=0xF9
+sanguino.fuse: EFUSE=0xFD
+
+duemilanove: PART=m328p
+duemilanove.hex: MCU=atmega328p
+duemilanove.era: PART=m328p
+duemilanove.bak: PART=m328p
+duemilanove.fuse: PART=m328p
+duemilanove.fuse: LFUSE=0xFF
+duemilanove.fuse: HFUSE=0xD9
+duemilanove.fuse: EFUSE=0x05
+
+diecimila: PART=m168
+diecimila.hex: MCU=atmega168
+diecimila.era: PART=m168
+diecimila.bak: PART=m168
+diecimila.fuse: PART=m168
+diecimila.fuse: LFUSE=0xFF
+diecimila.fuse: HFUSE=0xDD
+diecimila.fuse: EFUSE=0xF9
+
+# AMFORTH VERSION TO USE
+# 'code' for trunk and x.y for the releases (i.e 5.0)
+#VERSION=5.0
+VERSION=code
+CORE=$(AMFORTH)/avr8
+
+# directories
+ATMEL=$(AMFORTH)/avr8/Atmel
+
+# ------------------------
+# PROGRAMMER CONFIGURATION
+# ------------------------
+
+PROGRAMMER=avrisp2
+PORT=/dev/ttyUSB0
+
+AVRDUDE=avrdude
+AVRDUDE_FLAGS=-q -P $(PORT) -c $(PROGRAMMER)
+
+# ----------------
+# ASSEMBLER TO USE
+# ----------------
+
+AS_INCLUDE=-I $(ATMEL)/Appnotes2 -I$(CORE) -I$(CORE)/devices/ -I$(AMFORTH)/common
+
+ASM=wine $(ATMEL)/avrasm2.exe
+# flags Specific to avrasm2.exe
+AS_FLAGS=$(AS_INCLUDE) -fI -v0
+
+#ASM=avra $(AS_FLAGS)
+
+#--------------------------
+# Generic assemble patterns
+#--------------------------
+
+# Assemble the target
+%.hex : %.asm
+ @echo "Producing Hexfiles for Arduino $*"
+ @$(ASM) $(AS_FLAGS) -I $(CORE)/devices/$(MCU) -e $*.eep.hex -m $*.map -l $*.lst $<
+
+# Flash the target
+% : %.hex
+ @echo "Uploading Hexfiles to Arduino $*"
+ $(AVRDUDE) $(AVRDUDE_FLAGS) -p $(PART) -e -U flash:w:$*.hex:i -U eeprom:w:$*.eep.hex:i
+
+# Set the fuse bits
+%.fuse :
+ @echo "Setting fuses to Arduino $*"
+ $(AVRDUDE) $(AVRDUDE_FLAGS) -p $(PART) -U efuse:w:$(EFUSE):m -U hfuse:w:$(HFUSE):m -U lfuse:w:$(LFUSE):m
+
+# Erase the whole MCU
+%.era :
+ @echo "Erasing entire Arduino $*"
+ $(AVRDUDE) $(AVRDUDE_FLAGS) -p $(PART) -e
+
+# Clear assembled & auxilars files
+%.clr:
+ @echo "Cleaning all aux files"
+ @rm -f $*.hex ; rm -f $*.eep.hex ; rm -f $*.lst ; rm -f $*.map ; rm -f $*.cof ; rm -f $*.obj
+
+# Backup arduino Flash & EEPROM files
+%.bak:
+ @echo "Backup Flash & EEPRON from Arduino $*"
+ $(AVRDUDE) $(AVRDUDE_FLAGS) -p $(PART) -U flash:r:$*.hex.bak:i -U eeprom:r:$*.eep.hex.bak:i
+
+# ----------------------------------------------------------
+
+GENERIC_DEPENDECIES=*.inc words/*.asm $(CORE)/*.asm $(CORE)/words/*.asm $(CORE)/drivers/*.asm
+
+# Assemble all targets is the default action
+
+TARGET = leonardo.hex uno.hex duemilanove.hex mega128.hex sanguino.hex diecimila.hex
+
+%.asm: MCU=atmega328p
+
+default: $(TARGET)
+
+$(TARGET) : $(GENERIC_DEPENDENCIES) $(CORE)/devices/*/*.asm $(CORE)/devices/*/*.inc
+
+
+# Cleans everything
+clean:
+ rm -f *.hex ; rm -f *.eep.hex ; rm -f *.lst ; rm -f *.map ; rm -f *.cof ; rm -f *.obj
+
+# All other rules are target specific and must be typed one by one
+# as shown in the top.
+
diff --git a/amforth-6.5/appl/arduino/blocks/led-mega.frt b/amforth-6.5/appl/arduino/blocks/led-mega.frt
new file mode 100644
index 0000000..ada5b36
--- /dev/null
+++ b/amforth-6.5/appl/arduino/blocks/led-mega.frt
@@ -0,0 +1,38 @@
+\ let the led at digital-13 aka PortB.7 blink
+
+\
+$25 constant PORTB
+$24 constant DDRB
+
+\ initialize the Port: change to output mode
+: led-init
+ $80 DDRB c!
+;
+
+\ turn the led on
+: led-on
+ $80 PORTB c!
+;
+
+\ turn the led off
+: led-off
+ 0 PORTB c!
+;
+
+\ let led blink once
+: led-blink
+ led-on 500 ms led-off 500 ms
+;
+
+\ let led blink until a keystroke
+: blink
+ ." press any key to stop "
+ begin
+ led-blink
+ key?
+ until
+ key drop \ we do not want to keep this key stroke
+;
+
+\ and do it....
+led-init blink
diff --git a/amforth-6.5/appl/arduino/blocks/led-mega.readme b/amforth-6.5/appl/arduino/blocks/led-mega.readme
new file mode 100644
index 0000000..cc56aff
--- /dev/null
+++ b/amforth-6.5/appl/arduino/blocks/led-mega.readme
@@ -0,0 +1,114 @@
+The example for the blinking LED works on every arduino with a LED
+attached to Digital-13. It is tested on a arduino mega only however.
+
+What does the code do? It lets the LED blink and
+gives some hints for using and enjoying amforth.
+
+
+First: it defines a few constants:
+
+$25 constant PORTB
+$24 constant DDRB
+
+The arduino uses its own numbering schema for pins, but
+for now we use the atmega ones: digial-13 is the same as
+bit 7 of PORT-B. Port B has three registers, we need only
+two of them: The Data Direction Register (DDR) and the PORT
+(Output) Register. The third register is used for reading
+from the port (PIN).
+
+To quickly test the hardware enter the following commands
+
+$80 DDRB c! $80 PORTB c! <enter>
+
+The led turns on. With
+
+0 PORTB c!
+
+the led turns off. You can repeat these commands and watch the LED.
+
+The next step is to define some commands and use them. And add some
+more features that makes live easier.
+
+Forth usually uses many small words which do exactly one thing.
+When entering forth commands take care that every word is
+seperated by at least one space. In forth almost every character
+can be used as part of a command name.
+
+The first command in this example sets up the Data Direction Register
+to make the LED Port an output pin. In arduino sketch it would be
+void setup() { pinMode(13, OUTPUT); }
+
+: led-init $80 DDRB c! ;
+
+By entering the command line the interpreter will learn a new command:
+led-init. This command can be called immediatly after the command prompt
+says OK. And it can be used in further command definitions.
+
+It writes the 8bit number 128 (hex 80) to the register DDRB (hex 24)
+as defined above. This makes the 7th bit of PORTB an Output pin.
+
+Calling our newly defined word does not change anything
+visible. But with the next word, the LED will turn on
+
+: led-on $80 PORTB c! ;
+
+Here the 7th bit will be set to 1, and that makes the led to be connected
+to VCC (5V) and it will turn on (the LED is connected to ground already).
+
+If the led-on command does not turn on the LED just call the
+led-init command (again). The led-init is needed after an reset
+or power cycle as well.
+
+Now that the led is active, we want a command to turn it off. One solution
+is to repeat the command from above: 0 PORTB c! . Smarter is a new command
+word:
+
+: led-off 0 PORTB c! ;
+
+You can now use the newly defined commands to turn the led on and off:
+
+ led-on led-off led-on led-off
+
+(since there is no timing involved yet, you may not even see the led glow)
+
+Our next word will simplify this, saves many keystrokes, and gives the
+real blink experience:
+
+: led-blink
+ led-on 500 ms led-off 500 ms
+;
+
+Calling this command will turn the led on, waits half a second, turn it
+off again and waits again half a second before returning to the command
+prompt.
+
+With a command line like
+
+led-blink led-blink led-blink
+
+The led will blink for a few seconds.
+
+To make it blink "forever", the next word is helpful
+
+: blink-forever
+ ." press any key to stop "
+ begin
+ led-blink
+ key?
+ until
+ key drop \ we do not want to keep this key stroke
+;
+
+This wird prints some text ("press any key to stop) and starts a loop.
+This loop lets the led blink one and checks for a keystroke. If no key
+is pressed, the loops is repeated. If a key is pressed, the loop is
+finished. The last two commands are housekeeping: read the key pressed
+and forget it. Otherwise the key pressed would be the first character
+of the next command line.
+
+The advantage of defining many words is that you can test them immediatly.
+Thus any further code can rely on words already being tested and that
+makes debugging alot easier. The drawback of that many words? You need
+more code space for the names of the commmands. There is no real speed
+penalty however.
diff --git a/amforth-6.5/appl/arduino/blocks/ports-leonardo.frt b/amforth-6.5/appl/arduino/blocks/ports-leonardo.frt
new file mode 100644
index 0000000..54d1117
--- /dev/null
+++ b/amforth-6.5/appl/arduino/blocks/ports-leonardo.frt
@@ -0,0 +1,74 @@
+\
+\ port definitions for Atmegas as found on the Arduino Standard
+\ Atmega168, Atmega328p
+\
+decimal
+
+
+};
+
+PORTD 2 portpin: digital.0
+PORTD 3 portpin: digital.1
+PORTD 1 portpin: digital.2
+PORTD 0 portpin: digital.3
+PORTD 4 portpin: digital.4
+PORTC 6 portpin: digital.5
+PORTD 7 portpin: digital.6
+PORTE 6 portpin: digital.7
+
+PORTB 4 portpin: digital.8
+PORTB 5 portpin: digital.9
+PORTB 6 portpin: digital.10
+PORTB 7 portpin: digital.11
+PORTD 6 portpin: digital.12
+PORTC 7 portpin: digital.13
+
+PORTB 3 portpin: digital.14
+PORTB 1 portpin: digital.15
+PORTB 2 portpin: digital.16
+PORTB 0 portpin: digital.17
+PORTF 7 portpin: digital.18
+PORTF 6 portpin: digital.19
+
+PORTF 5 portpin: digital.20
+PORTF 4 portpin: digital.21
+PORTF 1 portpin: digital.22
+PORTF 0 portpin: digital.23
+PORTD 4 portpin: digital.24
+PORTD 7 portpin: digital.25
+PORTB 4 portpin: digital.26
+PORTB 5 portpin: digital.27
+PORTB 6 portpin: digital.28
+PORTD 6 portpin: digital.29
+
+PORTD 5 portpin: TXLED
+PORTB 0 portpin: RXLED
+PORTE 2 portpin: HWB
+
+\ some digital ports have an alternative use
+\ synonym is available since amforth 5.0
+
+synonym SPI:SS digital.17
+synonym SPI:MOSI digital.16
+synonym SPI:MISO digital.14
+synonym SPI:SCK digital.15
+
+synonym TWI:SDA digital.2
+synonym TWI:SCL digital.3
+synonym SERIAL:RX digital.0
+synonym SERIAL:TX digital.1
+synonym LED_BUILTIN digital.13
+
+synonym analog.0 digital.18
+synonym analog.1 digital.19
+synonym analog.2 digital.20
+synonym analog.3 digital.21
+synonym analog.4 digital.22
+synonym analog.5 digital.23
+
+synonym analog.6 digital.24
+synonym analog.7 digital.25
+synonym analog.8 digital.26
+synonym analog.9 digital.27
+synonym analog.10 digital.28
+synonym analog.11 digital.29
diff --git a/amforth-6.5/appl/arduino/blocks/ports-mega128.frt b/amforth-6.5/appl/arduino/blocks/ports-mega128.frt
new file mode 100644
index 0000000..61a32df
--- /dev/null
+++ b/amforth-6.5/appl/arduino/blocks/ports-mega128.frt
@@ -0,0 +1,104 @@
+\
+\ port definitions for Atmega128 as found on the Arduino Mega128
+\
+decimal
+PORTE 0 portpin: digital.0 \ PE 0 ** 0 ** USART0_RX
+PORTE 1 portpin: digital.1 \ PE 1 ** 1 ** USART0_TX
+PORTE 4 portpin: digital.2 \ PE 4 ** 2 ** PWM2
+PORTE 5 portpin: digital.3 \ PE 5 ** 3 ** PWM3
+PORTG 5 portpin: digital.4 \ PG 5 ** 4 ** PWM4
+PORTE 3 portpin: digital.5 \ PE 3 ** 5 ** PWM5
+PORTH 3 portpin: digital.6 \ PH 3 ** 6 ** PWM6
+PORTH 4 portpin: digital.7 \ PH 4 ** 7 ** PWM7
+PORTH 5 portpin: digital.8 \ PH 5 ** 8 ** PWM8
+PORTH 6 portpin: digital.9 \ PH 6 ** 9 ** PWM9
+PORTB 4 portpin: digital.10 \ PB 4 ** 10 ** PWM10
+PORTB 5 portpin: digital.11 \ PB 5 ** 11 ** PWM11
+PORTB 6 portpin: digital.12 \ PB 6 ** 12 ** PWM12
+PORTB 7 portpin: digital.13 \ PB 7 ** 13 ** PWM13
+PORTJ 2 portpin: digital.14 \ PJ 1 ** 14 ** USART3_TX
+PORTJ 0 portpin: digital.15 \ PJ 0 ** 15 ** USART3_RX
+PORTH 2 portpin: digital.16 \ PH 1 ** 16 ** USART2_TX
+PORTH 0 portpin: digital.17 \ PH 0 ** 17 ** USART2_RX
+PORTD 3 portpin: digital.18 \ PD 3 ** 18 ** USART1_TX
+PORTD 2 portpin: digital.19 \ PD 2 ** 19 ** USART1_RX
+PORTD 1 portpin: digital.20 \ PD 1 ** 20 ** I2C_SDA
+PORTD 0 portpin: digital.21 \ PD 0 ** 21 ** I2C_SCL
+PORTA 0 portpin: digital.22 \ PA 0 ** 22 ** D22
+PORTA 1 portpin: digital.23 \ PA 1 ** 23 ** D23
+PORTA 2 portpin: digital.24 \ PA 2 ** 24 ** D24
+PORTA 3 portpin: digital.25 \ PA 3 ** 25 ** D25
+PORTA 4 portpin: digital.26 \ PA 4 ** 26 ** D26
+PORTA 5 portpin: digital.27 \ PA 5 ** 27 ** D27
+PORTA 6 portpin: digital.28 \ PA 6 ** 28 ** D28
+PORTA 7 portpin: digital.29 \ PA 7 ** 29 ** D29
+PORTC 8 portpin: digital.30 \ PC 7 ** 30 ** D30
+PORTC 6 portpin: digital.31 \ PC 6 ** 31 ** D31
+PORTC 5 portpin: digital.32 \ PC 5 ** 32 ** D32
+PORTC 4 portpin: digital.33 \ PC 4 ** 33 ** D33
+PORTC 3 portpin: digital.34 \ PC 3 ** 34 ** D34
+PORTC 2 portpin: digital.35 \ PC 2 ** 35 ** D35
+PORTC 1 portpin: digital.36 \ PC 1 ** 36 ** D36
+PORTC 0 portpin: digital.37 \ PC 0 ** 37 ** D37
+PORTD 7 portpin: digital.38 \ PD 7 ** 38 ** D38
+PORTG 2 portpin: digital.39 \ PG 2 ** 39 ** D39
+PORTG 1 portpin: digital.40 \ PG 1 ** 40 ** D40
+PORTG 0 portpin: digital.41 \ PG 0 ** 41 ** D41
+PORTL 7 portpin: digital.42 \ PL 7 ** 42 ** D42
+PORTL 6 portpin: digital.43 \ PL 6 ** 43 ** D43
+PORTL 5 portpin: digital.44 \ PL 5 ** 44 ** D44
+PORTL 4 portpin: digital.45 \ PL 4 ** 45 ** D45
+PORTL 3 portpin: digital.46 \ PL 3 ** 46 ** D46
+PORTL 2 portpin: digital.47 \ PL 2 ** 47 ** D47
+PORTL 1 portpin: digital.48 \ PL 1 ** 48 ** D48
+PORTL 0 portpin: digital.49 \ PL 0 ** 49 ** D49
+PORTB 3 portpin: digital.50 \ PB 3 ** 50 ** SPI_MISO
+PORTB 2 portpin: digital.51 \ PB 2 ** 51 ** SPI_MOSI
+PORTB 1 portpin: digital.52 \ PB 1 ** 52 ** SPI_SCK
+PORTB 0 portpin: digital.53 \ PB 0 ** 53 ** SPI_SS
+PORTF 0 portpin: digital.54 \ PF 0 ** 54 ** A0
+PORTF 1 portpin: digital.55 \ PF 1 ** 55 ** A1
+PORTF 2 portpin: digital.56 \ PF 2 ** 56 ** A2
+PORTF 3 portpin: digital.57 \ PF 3 ** 57 ** A3
+PORTF 4 portpin: digital.58 \ PF 4 ** 58 ** A4
+PORTF 5 portpin: digital.59 \ PF 5 ** 59 ** A5
+PORTF 6 portpin: digital.60 \ PF 6 ** 60 ** A6
+PORTF 7 portpin: digital.61 \ PF 7 ** 61 ** A7
+PORTK 0 portpin: digital.62 \ PK 0 ** 62 ** A8
+PORTK 1 portpin: digital.63 \ PK 1 ** 63 ** A9
+PORTK 2 portpin: digital.64 \ PK 2 ** 64 ** A10
+PORTK 3 portpin: digital.65 \ PK 3 ** 65 ** A11
+PORTK 4 portpin: digital.66 \ PK 4 ** 66 ** A12
+PORTK 5 portpin: digital.67 \ PK 5 ** 67 ** A13
+PORTK 6 portpin: digital.68 \ PK 6 ** 68 ** A14
+PORTK 7 portpin: digital.69 \ PK 7 ** 69 ** A15
+
+\ some digital ports have an alternative use
+\ synonym is available since amforth 5.0
+
+synonym analog.0 digital.54
+synonym analog.1 digital.55
+synonym analog.2 digital.56
+synonym analog.3 digital.57
+synonym analog.4 digital.58
+synonym analog.5 digital.59
+synonym analog.6 digital.60
+synonym analog.7 digital.61
+synonym analog.8 digital.62
+synonym analog.9 digital.63
+synonym analog.10 digital.64
+synonym analog.11 digital.65
+synonym analog.12 digital.66
+synonym analog.13 digital.67
+synonym analog.14 digital.68
+synonym analog.15 digital.69
+synonym SPI:SS digital.53
+synonym SPI:MOSI digital.51
+synonym SPI:MISO digital.50
+synonym SPI:SCK digital.52
+synonym TWI:SDA digital.20
+synonym TWI:SCL digital.21
+synonym LED_BUILTIN digital.13
+
+synonym SERIAL:RX digital.0
+synonym SERIAL:TX digital.1 \ No newline at end of file
diff --git a/amforth-6.5/appl/arduino/blocks/ports-standard.frt b/amforth-6.5/appl/arduino/blocks/ports-standard.frt
new file mode 100644
index 0000000..5f2e2de
--- /dev/null
+++ b/amforth-6.5/appl/arduino/blocks/ports-standard.frt
@@ -0,0 +1,49 @@
+\
+\ port definitions for Atmegas as found on the Arduino Standard
+\ Atmega168, Atmega328p
+\
+decimal
+
+PORTD 0 portpin: digital.0
+PORTD 1 portpin: digital.1
+PORTD 2 portpin: digital.2
+PORTD 3 portpin: digital.3
+PORTD 4 portpin: digital.4
+PORTD 5 portpin: digital.5
+PORTD 6 portpin: digital.6
+PORTD 7 portpin: digital.7
+
+PORTB 0 portpin: digital.8
+PORTB 1 portpin: digital.9
+PORTB 2 portpin: digital.10
+PORTB 3 portpin: digital.11
+PORTB 4 portpin: digital.12
+PORTB 5 portpin: digital.13
+
+PORTC 0 portpin: digital.14
+PORTC 1 portpin: digital.15
+PORTC 2 portpin: digital.16
+PORTC 3 portpin: digital.17
+PORTC 4 portpin: digital.18
+PORTC 5 portpin: digital.19
+
+\ some digital ports have an alternative use
+\ synonym is available since amforth 5.0
+synonym SPI:SS digital.10
+synonym SPI:MOSI digital.11
+synonym SPI:MISO digital.12
+synonym SPI:SCK digital.13
+synonym TWI:SDA digital.18
+synonym TWI:SCL digital.19
+synonym LED_BUILTIN digital.13
+synonym SERIAL:RX digital.0
+synonym SERIAL:TX digital.1
+synonym analog.0 digital.14
+synonym analog.1 digital.15
+synonym analog.2 digital.16
+synonym analog.3 digital.17
+synonym analog.4 digital.18
+synonym analog.5 digital.19
+\ not on all chips but defined in arduino sources
+synonym analog.6 digital.20
+synonym analog.7 digital.21
diff --git a/amforth-6.5/appl/arduino/blocks/test_danger_shield.fs b/amforth-6.5/appl/arduino/blocks/test_danger_shield.fs
new file mode 100644
index 0000000..0b6d493
--- /dev/null
+++ b/amforth-6.5/appl/arduino/blocks/test_danger_shield.fs
@@ -0,0 +1,437 @@
+\ 2011-03-06 EW
+\ test arduino duemilanove + danger shield
+
+\ hw layout
+\ arduino | atmega328p | danger shield
+\ D0 | PD0 rx |
+\ D1 | PD1 tx |
+\ D2 | PD2 int0 |
+\ D3 | PD3 int1 oc2b | bz (buzzer)
+\ D4 | PD4 t0 | sr_in (shift register DS)
+\ D5 | PD5 t1 oc0b | led1
+\ D6 | PD6 oc0a | led2
+\ D7 | PD7 | sr_latch (shift register /OE)
+\ |
+\ D8 | PB0 icp | sr_clk (shift register SH_CP)
+\ D9 | PB1 oc1a |
+\ D10 | PB2 /ss oc1b | sw1 (switch)
+\ D11 | PB3 mosi oc2a | sw2 (switch)
+\ D12 | PB4 miso | sw3 (switch)
+\ D13 | PB5 sck |
+\ |
+\ A0 | PC0 adc0 | sl3 (slider)
+\ A1 | PC1 adc1 | sl2 (slider)
+\ A2 | PC2 adc2 | sl1 (slider)
+\ A3 | PC3 adc3 | light (photo cell)
+\ A4 | PC4 adc4 scl | temp (temperature)
+\ A5 | PC5 adc5 sda | knock (buzzer 2)
+
+\ make marker
+
+marker --start--
+
+decimal
+
+PORTB 2 portpin: sw1
+PORTB 3 portpin: sw2
+PORTB 4 portpin: sw3
+
+PORTD 5 portpin: led1
+PORTD 6 portpin: led2
+
+PORTD 3 portpin: bz
+
+PORTC 2 portpin: sl1
+PORTC 1 portpin: sl2
+PORTC 0 portpin: sl3
+
+PORTC 3 portpin: photocell
+PORTC 4 portpin: thermometer
+PORTC 5 portpin: knocksensor
+
+PORTD 4 portpin: sr_in
+PORTD 7 portpin: sr_oe \ output enable
+PORTB 0 portpin: sr_cl
+
+variable 1delay 20 1delay !
+: msg_quit
+ ." press switch 1 (D10) to quit" cr
+;
+
+
+\ --- switches -----------------------------------------------
+: sw1?
+ sw1 pin_low? if
+ 20 ms \ very simple debounce
+ sw1 pin_low? if
+ -1
+ else
+ 0
+ then
+ else
+ 0
+ then
+;
+
+\ --- buzzer -------------------------------------------------
+
+\ 2 ms T_period =^= 500 Hz
+: buzz ( cycles -- )
+ 0 ?do bz low 1ms bz high 1ms loop
+;
+
+\ --- analog digital converter -------------------------------
+\ --- adc ---
+
+: or! dup c@ rot or swap c! ;
+
+\ pin>pos
+\ convert bitmask of portpin: back to value (bitposition)
+: pin>pos ( pinmask portaddr -- pos )
+ drop ( -- pinmask )
+ log2 ( -- pos_of_most_significant_bit )
+;
+
+: adc.init ( -- )
+ \ ADMUX
+ \ A_ref is NOT connected externally
+ \ ==> need to set bit REFS0 in register ADMUX
+ [ 1 5 lshift \ ADLAR
+ 1 6 lshift or \ REFS0
+ ] literal ADMUX c!
+ \ ADCSRA
+ [ 1 7 lshift \ ADEN ADC enabled
+ 1 2 lshift or \ ADPS2 prescaler = 128
+ 1 1 lshift or \ ADPS1 .
+ 1 or \ ADPS0 .
+ ] literal ADCSRA c!
+;
+: adc.init.pin ( bitmask portaddr -- )
+ over over high
+ pin_input
+;
+
+1 6 lshift constant ADSC_MSK \ ADStartConversion bitmask
+: adc.start
+ \ start conversion
+ ADSC_MSK ADCSRA or!
+;
+: adc.wait
+ \ wait for completion of conversion
+ begin
+ ADCSRA c@ ADSC_MSK and 0=
+ until
+;
+: adc.channel! ( channel -- )
+ 7 and \ clip channel to 0..7
+ ADMUX c@ 7 invert and \ read ADMUX, clear old channel
+ or \ add new channel
+ ADMUX c! \ write
+;
+: adc.get10 ( channel -- a )
+ adc.channel! adc.start adc.wait
+\ 10 bit
+ ADCL c@
+ ADCH c@ 8 lshift + 6 rshift
+;
+: adc.get ( channel -- a )
+ adc.channel! adc.start adc.wait
+\ 8 bit
+ ADCH c@
+;
+
+\ --- shift register -----------------------------------------
+
+\ --- shift register ---
+
+: bit>sr ( bit -- )
+ if sr_in high else sr_in low then
+ sr_cl high noop sr_cl low noop
+;
+
+: get.bit ( byte pos -- bit )
+ 1 swap lshift \ -- byte bitmask
+ and \ -- bit
+;
+
+\ clock one byte out, MSB first!
+: byte>sr ( byte -- )
+ 8 0 do
+ dup 7 i - \ 7 6 5 ... 0: MSB first!
+ get.bit
+ bit>sr
+ loop
+ drop
+;
+
+: >7seg
+ invert
+ byte>sr
+ sr_oe low noop sr_oe high
+;
+
+
+create HexDigits
+$3f , \ 0
+$06 , \ 1
+$5b , \ 2
+$4f , \ 3
+$66 , \ 4
+$6d , \ 5
+$7d , \ 6
+$07 , \ 7
+$7f , \ 8
+$6f , \ 9
+$77 , \ A
+$7c , \ b
+$58 , \ c
+$5e , \ d
+$79 , \ E
+$71 , \ F
+
+$80 constant dec.point
+: emit.7seg ( n -- )
+ dup 0 $F within if
+ HexDigits + i@ >7seg
+ else
+ drop
+ then
+;
+
+\ --- convert thermometer reading --------------------------
+
+: >T
+ 51 -
+ 100 256 */
+ 25 +
+;
+
+: .T
+ thermometer pin>pos adc.get dup . space >T . cr
+;
+
+
+\ --- test functions ---------------------------------------
+: test_switches
+ ." press switch 2,3 to light up led 1,2" cr
+ msg_quit
+
+ begin
+ sw2 pin_low? if led1 high else led1 low then
+ sw3 pin_low? if led2 high else led2 low then
+ sw1? until
+;
+
+: test_buzzer
+ ." press switch 2 (D11) to test buzzer" cr
+ msg_quit
+ begin
+ sw2 pin_low? if 500 buzz then
+ sw1? until
+;
+
+: test_sliders
+ ." move sliders" cr
+ msg_quit
+ begin
+ sl1 pin>pos adc.get 4 u0.r space space
+ sl2 pin>pos adc.get 4 u0.r space space
+ sl3 pin>pos adc.get 4 u0.r $0d emit
+ 1delay @ ms
+ sw1? until
+ cr
+;
+
+: test_photocell
+ ." light/shadow photocell" cr
+ msg_quit
+ begin
+ photocell pin>pos adc.get 4 u0.r $0d emit
+ 1delay @ ms
+ sw1? until
+ cr
+;
+
+: test_thermometer
+ ." warm/cool thermometer" cr
+ msg_quit
+ begin
+ thermometer pin>pos adc.get 4 u0.r $0d emit
+ 1delay @ ms
+ sw1? until
+ cr
+;
+
+
+: test_bits.7seg
+ 8 0 do
+ 1 i lshift >7seg
+ 500 ms
+ loop
+;
+: test_emit.7seg
+ $10 0 do
+ i emit.7seg
+ 500 ms
+ loop
+;
+: test_7seg
+ ." show single segments on 7seg" cr
+ test_bits.7seg
+ 1000 ms
+ ." show hex numbers on 7seg" cr
+ test_emit.7seg
+ 1000 ms
+;
+
+\ --- main: init, run --------------------------------------
+: init
+ 20 1delay !
+
+ led1 pin_output
+ led2 pin_output
+ bz pin_output
+
+ sw1 pin_input
+ sw2 pin_input
+ sw3 pin_input
+
+ adc.init
+ sl1 adc.init.pin
+ sl2 adc.init.pin
+ sl3 adc.init.pin
+ photocell adc.init.pin
+ thermometer adc.init.pin
+ knocksensor adc.init.pin
+
+ sr_in high sr_in pin_output
+ sr_oe high sr_oe pin_output
+ sr_cl low sr_cl pin_output
+ $ff >7seg
+;
+
+
+\ --- pwm: timer/counter0, led1,2 ---
+\ D5 | PD5 t1 oc0b | led1
+\ D6 | PD6 oc0a | led2
+\ timer/counter0
+\ fast pwm mode
+\ TCCR0A bits
+\ . COM0A[1,0] = 1,0 (non inverted mode)
+\ . COM0B[1,0] = 1,0 (non inverted mode)
+\ . WGM0[1,0] = 1,1 (mode3: fast pwm)
+\ TCCR0B bits
+\ . CS[2,1,0] = 0,1,1 (clk_io/64)
+
+\ TIMSK0 TIFR0 TCNT0 TCCR0B TCCR0A OCR0B OCR0A
+
+: pwm.leds.init
+ 0 TCNT0 c! \ clear counter
+ led1 high led1 pin_output
+ led2 high led2 pin_output
+ \ TCCR0A = COM0A1 | COM0B1 | WGM01 | WGM00
+ %10100011 TCCR0A c!
+ \ TCCR0B = CS1 | CS0
+ %00000011 TCCR0B c!
+;
+\ control brightness via registers
+\ OCR0A (D6)
+\ OCR0B (D5)
+
+variable pwm5
+variable pwm6
+: test_leds_pwm
+ pwm.leds.init
+ 0 pwm5 !
+ $ff pwm6 !
+ begin
+ pwm5 @ 1+ $00ff and dup pwm5 ! OCR0B c!
+ pwm6 @ 1- $00ff and dup pwm6 ! OCR0A c!
+ 10 ms
+ key? until
+
+;
+
+: test_leds_pwm_slider
+ pwm.leds.init
+ \ adc.init
+ \ sl1 adc.init.pin
+ \ sl2 adc.init.pin
+ begin
+ sl1 pin>pos adc.get OCR0B c!
+ sl2 pin>pos adc.get OCR0A c!
+ 1 ms
+ key? until
+;
+
+
+\ --- pwm: timer/counter2, buzzer ---
+\ D3 | PD3 int1 oc2b | bz
+
+\ timer/counter2
+\ clear timer on compare match, ctc mode
+\ TCCR2A bits
+\ . COM2B[1,0] = 0,1 (non inverted mode)
+\ . WGM2[1,0] = 1,0 (mode2: ctc)
+\ TCCR2B bits
+\ . CS[2,1,0] = 1,1,1 (clk_t2s/256)
+
+\ TIMSK0 TIFR0 TCNT0 TCCR0B TCCR0A OCR0B OCR0A
+
+: pwm.bz.init
+ 0 TCNT2 c! \ clear counter
+ bz high bz pin_output
+
+ \ TCCR2A = COM0B0 | WGM01
+ %00010010 TCCR2A c!
+ \ TCCR2B = CS1 | CS0
+ %00000110 TCCR0B c!
+;
+\ control frequency via register
+\ OCR2A
+
+: test_bz_pwm
+ pwm.bz.init
+ $20 OCR2A c! 200 ms
+ $30 OCR2A c! 200 ms
+ $40 OCR2A c! 200 ms
+ $0 OCR2A c!
+;
+
+
+\ --- --- ---
+
+variable state
+8 constant max_state
+
+: run
+
+ init
+ 0 state !
+
+ ." press switch 1 (D10) for next test" cr
+ begin
+
+ sw1? if
+ state @ 1+
+ dup max_state > if drop 0 then
+ dup state !
+ . cr
+ then
+
+\ state @ 0 = ( do nothing )
+
+ state @ 1 = if test_switches then
+ state @ 2 = if test_buzzer then
+ state @ 3 = if test_sliders then
+ state @ 4 = if test_photocell then
+ state @ 5 = if test_thermometer then
+ state @ 6 = if test_7seg 1 state +! then
+
+ \ wait some
+ 1delay @ 5 * ms
+
+ key? until
+;
+
+\ fin
diff --git a/amforth-6.5/appl/arduino/blocks/wiring_analog.frt b/amforth-6.5/appl/arduino/blocks/wiring_analog.frt
new file mode 100644
index 0000000..e3faa9a
--- /dev/null
+++ b/amforth-6.5/appl/arduino/blocks/wiring_analog.frt
@@ -0,0 +1,65 @@
+\ analog read functions for arduino.
+\
+\ usage
+\ once (in turnkey): adc.init (sets up the subsystem)
+\ repeated: analog.X analog_read ( -- n)
+\
+
+\ \\\\\\\\\\\\\\\\\\\\\\\\\\\
+\ HELPER ROUTINES \
+\ \\\\\\\\\\\\\\\\\\\\\\\\\\\
+\ pin>channel
+\ convert bitmask of portpin: back to value (bitposition)
+: pin>channel ( pinmask portaddr -- pos )
+ drop ( -- pinmask )
+ log2 ( -- pos_of_most_significant_bit )
+;
+
+: adc.init ( -- )
+ \ ADMUX
+ \ A_ref is NOT connected externally
+ \ ==> need to set bit REFS0 in register ADMUX
+ [ 0 5 lshift \ ADLAR off, makes read operation simpler
+ 1 6 lshift or \ REFS0
+ ] literal ADMUX c!
+ \ ADCSRA
+ [ 1 7 lshift \ ADEN ADC enabled
+ 1 2 lshift or \ ADPS2 prescaler = 128
+ 1 1 lshift or \ ADPS1 .
+ 1 or \ ADPS0 .
+ ] literal ADCSRA c!
+;
+: adc.init.pin ( bitmask portaddr -- )
+ over over high
+ pin_input
+;
+
+1 6 lshift constant ADSC_MSK \ ADStartConversion bitmask
+: adc.start
+ \ start conversion
+ ADSC_MSK ADCSRA high
+;
+: adc.wait
+ \ wait for completion of conversion
+ begin
+ ADCSRA c@ ADSC_MSK and 0=
+ until
+;
+: adc.channel! ( channel -- )
+ 7 and \ clip channel to 0..7
+ ADMUX c@ 7 invert and \ read ADMUX, clear old channel
+ or \ add new channel
+ ADMUX c! \ write
+;
+
+: adc.get ( namedpin -- a )
+ pin>channel adc.channel! adc.start adc.wait
+ ADC @ \ always 10bit
+;
+
+\ make sure the ports are set up and do one
+\ conversion.
+: analog_read ( pinmask portaddr -- n )
+ 2dup adc.init.pin
+ adc.get
+;
diff --git a/amforth-6.5/appl/arduino/build.xml b/amforth-6.5/appl/arduino/build.xml
new file mode 100644
index 0000000..7affe8e
--- /dev/null
+++ b/amforth-6.5/appl/arduino/build.xml
@@ -0,0 +1,95 @@
+<!-- make multiple targets with antelope -->
+<project name="ForthDuino" basedir="." default="Help">
+ <import file="../avr-build.xml"/>
+
+ <target name="uno.hex" description="Hexfiles for Arduino UNO (Atmega 328P) www.arduino.cc">
+ <avrasm2 projectname="uno" mcu="atmega328p"/>
+ </target>
+
+ <target name="uno" depends="uno.hex" description="Arduino UNO Board www.arduino.cc">
+ <echo>Uploading Hexfiles to Arduino UNO</echo>
+ <avrdude
+ type="avrisp2"
+ mcu="m328p"
+ flashfile="uno.hex"
+ eepromfile="uno.eep.hex"
+ />
+ </target>
+ <target name="uno.fuses" description="Set fuses for UNO">
+ <echo>Writing fuses</echo>
+ <avrdude-3fuses
+ type="avrisp2"
+ mcu="m328p"
+ efuse="0x05"
+ hfuse="0xd9"
+ lfuse="0xff"
+ />
+ </target>
+
+ <target name="leonardo.hex" description="Hexfiles for Arduino Leonardo (Atmega 32U4) www.arduino.cc">
+ <avrasm2 projectname="leonardo" mcu="atmega32u4"/>
+ </target>
+
+ <target name="leonardo" depends="leonardo.hex" description="Arduino Leonardo Board www.arduino.cc">
+ <echo>Uploading Hexfiles to Arduino Leonardo</echo>
+ <avrdude
+ type="avrisp2"
+ mcu="m32u4"
+ flashfile="leonardo.hex"
+ eepromfile="leonardo.eep.hex"
+ />
+ </target>
+ <target name="leonardo.fuses" description="Set fuses for LEONARDO">
+ <echo>Writing fuses</echo>
+ <avrdude-3fuses
+ type="avrisp2"
+ mcu="m32u4"
+ efuse="0xc7"
+ hfuse="0x99"
+ lfuse="0xcf"
+ />
+ </target>
+
+ <target name="mega128.hex" description="Hexfiles for Arduino Mega Board (Atmega1280) www.arduino.cc">
+ <avrasm2 projectname="mega128" mcu="atmega1280"/>
+ </target>
+
+ <target name="mega128" depends="mega128.hex" description="Arduino Mega Board www.arduino.cc">
+ <echo>Uploading Hexfiles to Arduino mega128</echo>
+ <avrdude
+ type="avrisp2"
+ mcu="m1280"
+ flashfile="mega128.hex"
+ eepromfile="mega128.eep.hex"
+ />
+ </target>
+
+ <target name="duemilanove.hex" description="Hexfiles for Arduino Duemilanove Board (Atmega 328P) www.arduino.cc">
+ <avrasm2 projectname="duemilanove" mcu="atmega328p"/>
+ </target>
+
+ <target name="duemilanove" depends="duemilanove.hex" description="Arduino Duemilanove Board www.arduino.cc">
+ <echo>Uploading Hexfiles to Arduino Duemilanove</echo>
+ <avrdude
+ type="stk200"
+ mcu="m328p"
+ flashfile="duemilanove.hex"
+ eepromfile="duemilanove.eep.hex"
+ />
+ </target>
+ <target name="diecimila.hex" description="Hexfiles for Arduino Diecimila Board (Atmega168) www.arduino.cc">
+ <avrasm2 projectname="diecimila" mcu="atmega168"/>
+ </target>
+
+ <target name="diecimila" depends="diecimila.hex" description="Arduino Diecimila Board www.arduino.cc">
+ <echo>Uploading Hexfiles to Arduino Diecimila</echo>
+ <avrdude
+ type="avrisp2"
+ mcu="m168"
+ flashfile="diecimila.hex"
+ eepromfile="diecimila.eep.hex"
+ />
+ </target>
+
+ <target name="compile" depends="uno.hex, mega128.hex, duemilanove.hex, leonardo.hex"/>
+</project>
diff --git a/amforth-6.5/appl/arduino/dict_appl.inc b/amforth-6.5/appl/arduino/dict_appl.inc
new file mode 100644
index 0000000..6a828ca
--- /dev/null
+++ b/amforth-6.5/appl/arduino/dict_appl.inc
@@ -0,0 +1,7 @@
+; this dictionary contains optional words
+; they may be moved to the core dictionary if needed
+
+.include "dict/compiler2.inc" ; additional words for the compiler
+
+.include "words/applturnkey.asm"
+
diff --git a/amforth-6.5/appl/arduino/dict_appl_core.inc b/amforth-6.5/appl/arduino/dict_appl_core.inc
new file mode 100644
index 0000000..93c0d8a
--- /dev/null
+++ b/amforth-6.5/appl/arduino/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/arduino/diecimila.asm b/amforth-6.5/appl/arduino/diecimila.asm
new file mode 100644
index 0000000..b04b52f
--- /dev/null
+++ b/amforth-6.5/appl/arduino/diecimila.asm
@@ -0,0 +1,9 @@
+.include "preamble.inc"
+
+.set WANT_IGNORECASE = 1
+
+.equ F_CPU = 16000000
+.include "drivers/usart_0.asm"
+
+; include the whole source tree.
+.include "amforth.asm"
diff --git a/amforth-6.5/appl/arduino/duemilanove.asm b/amforth-6.5/appl/arduino/duemilanove.asm
new file mode 100644
index 0000000..c8750ef
--- /dev/null
+++ b/amforth-6.5/appl/arduino/duemilanove.asm
@@ -0,0 +1,13 @@
+; 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 WANT_IGNORECASE = 1
+
+; cpu clock in hertz
+.equ F_CPU = 16000000
+.include "drivers/usart_0.asm"
+
+.include "amforth.asm"
diff --git a/amforth-6.5/appl/arduino/duemilanove.eep.hex b/amforth-6.5/appl/arduino/duemilanove.eep.hex
new file mode 100644
index 0000000..c5d5bac
--- /dev/null
+++ b/amforth-6.5/appl/arduino/duemilanove.eep.hex
@@ -0,0 +1,7 @@
+:10003400FFFF7F0AC2018E0093095C00B008710AB9
+:0A004400C4024800EC3F0100480030
+:06005C000200350621063A
+:100066007D3B680000000000FF08AF08AF080000F5
+:100076000A00A300B100780093003C0200002902A8
+:08008600C83CE73CD73C19001F
+:00000001FF
diff --git a/amforth-6.5/appl/arduino/duemilanove.hex b/amforth-6.5/appl/arduino/duemilanove.hex
new file mode 100644
index 0000000..f6f0783
--- /dev/null
+++ b/amforth-6.5/appl/arduino/duemilanove.hex
@@ -0,0 +1,613 @@
+:020000020000FC
+:02000400DAD050
+:02000800D8D04E
+:02000C00D6D04C
+:02001000D4D04A
+:02001400D2D048
+:02001800D0D046
+:02001C00CED044
+:02002000CCD042
+:02002400CAD040
+:02002800C8D03E
+:02002C00C6D03C
+:02003000C4D03A
+:02003400C2D038
+:02003800C0D036
+:02003C00BED034
+:02004000BCD032
+:02004400BAD030
+:02004800B8D02E
+:02004C00B6D02C
+:02005000B4D02A
+:02005400B2D028
+:02005800B0D026
+:02005C00AED024
+:02006000ACD022
+:10006400AAD00008000400701A000A0041546D650B
+:1000740067613332385007FF3E72782D627566002F
+:1000840000004400082F10911001E0E0F1E0E10FBE
+:10009400F31D008313951F7010931001899199919A
+:1000A4000C94043806FF6973722D72783D00003891
+:1000B4003C38C6009738B0383C380300DE3F35384A
+:1000C4006400373D43001F3800383C3859003C3841
+:1000D4002400A43C3C3800013C3816005339973EB8
+:1000E4001F3806FF72782D6275665400003893003D
+:1000F400353879003C3811019738B0383C38000164
+:100104009C399738C3382E3A3C380F00123A3C38A1
+:1001140011018C381F3807FF72783F2D6275660015
+:10012400730000382F3D3C38110197383C381001DA
+:10013400973812391F3807FF74782D706F6C6C0074
+:100144008D000038B1003538A4003C38C6008C3826
+:100154001F3808FF74783F2D706F6C6C9D00003859
+:100164002F3D3C38C00097383C382000123A1F38E5
+:1001740004FF75627272AB006E388C009F3DA93D1E
+:1001840006FF2B7573617274BA0000383C3898000E
+:100194003C38C1008C383C3806003C38C2008C38EE
+:1001A400BE00B038F83A3C38C5008C383C38C4003E
+:0601B4008C3866001F38C4
+:040000000C94383DE7
+:1001BA000A920FB60A920F900F900A94B02CFF93EE
+:1001CA00EF93E2E1F1E00694E00DF31D0080039461
+:1001DA000082EF91FF9109900FBE0990089502FFE6
+:1001EA006D2BC2000038C63F143C1F3803FF7564EC
+:1001FA002A00F4000038B038FE38DF39D838C3385E
+:10020A00F538DF39E0389C391F3804FF756D61789D
+:10021A00FB000038C83E5B3935381401C338D8387A
+:10022A001F3804FF756D696E0A010038C83E6639C9
+:10023A0035382001C338D8381F3800383C38008098
+:10024A00123A193935382B01E53F1F384A391F3818
+:10025A000AFF6E616D653E666C6167731601003850
+:10026A00CA3B3C3800FF123A1F3803FF766572001A
+:10027A002D0100389F02C803AD3FBC3E7838AD025D
+:10028A00403FC63FE602EE023C382E00D702040386
+:10029A000F03FE03BC3E8038AD3FB502C8031F38CA
+:1002AA0004FF6E6F6F703A0100381F3806FF756ED3
+:1002BA0075736564550100388C3A223F92391F38AC
+:1002CA000200746F5B0100380D04CF3FB63E7838E8
+:1002DA0035387901210773012C071F380038F538A2
+:1002EA00B0388501FE38CA3BB03885018501CA3B62
+:1002FA0029381F3807FF692D63656C6C2B0065016F
+:10030A0000382E3A1F3808FF69636F6D7061726595
+:10031A007F010038FE38CE38F53812393538990160
+:10032A00D13ED8384A391F38C3385339EB073538E4
+:10033A00BE019A3ACE387838C101CE38CA3BC101DB
+:10034A00B0383C3800015B393538AF01C3383C3826
+:10035A00FF00123A12393538B601D13E4A39D33A3A
+:10036A001F382E3AC3388F3CC3383C380200B93A9A
+:10037A009F01D13E53391F380038B0383C38FF004E
+:10038A00123A783FC338F83A3C38FF00123A783FBD
+:10039A00F83A1B3A1F3801FF2A0088010038A539AC
+:1003AA00D8381F3801FF6A00D0010038753A3C3846
+:1003BA0007009C397838753A3C3809009C397838F6
+:1003CA009C391F3804FF64616273D7010038B03862
+:1003DA0020393538F101F8011F3807FF646E656767
+:1003EA0061746500E70100383A3CE53F5339143C33
+:1003FA001F3805FF636D6F766500F2010402BF9333
+:10040A00AF93E991F991A991B991092F082B21F09C
+:10041A001D9111930197E1F7AF91BF91899199913C
+:10042A000C94043805FF327377617000FE010038BE
+:10043A00E038FE38E038F5381F380AFF7265666919
+:10044A006C6C2D7469621702003845023C385A00F8
+:10045A005D044B0280385339E13E80384A391F38EF
+:10046A000AFF736F757263652D7469622202003820
+:10047A0045024B0278381F3803FF7469620035025F
+:10048A0047382C0104FF2374696241024738860108
+:10049A0006FF65653E72616D4702003853399A3A24
+:1004AA00CE385E3BCE3880388F3CC3388F3CC33859
+:1004BA00C83A5502D13E1F3808FF696E69742D7219
+:1004CA00616D4D0200383C386A00013B3C3822001D
+:1004DA00033A52021F380BFF656E7669726F6E6DB2
+:1004EA00656E740061024738440009FF776F7264D1
+:1004FA006C6973747300000000383C3808001F38B8
+:10050A0004FF2F7061647A0200388C3AE73E923910
+:10051A001F3805FF2F686F6C640085020038E73EBC
+:10052A00223F92391F380AFF666F7274682D6E6116
+:10053A006D658E02003895030700616D666F7274EF
+:10054A0068001F3807FF76657273696F6E0098023C
+:10055A0000383C3841001F3803FF63707500A7025A
+:10056A0000383C383700F4031F3808FF6D63752DD7
+:10057A00696E666FB10200383C3833001F3805FFD8
+:10058A002F7573657200BA0200383C382C001F3888
+:10059A0003FF686C640070024738880104FF686FC3
+:1005AA006C64CD020038D102B0387838343AB038A9
+:1005BA00FE38C3388038F5388C381F3802FF3C23A0
+:1005CA00D3020038E73ED10280381F3801FF2300EA
+:1005DA00E3020038BC3E78386B03E0383C38090047
+:1005EA00CE386D393538FC023C3807009C393C3826
+:1005FA0030009C39D7021F3802FF2373EB02003800
+:10060A00EE02C83E1B3A1939353805031F3802FF76
+:10061A00233E01030038D13ED1027838E73ECE3876
+:10062A0092391F3804FF7369676E0C03003820394A
+:10063A00353822033C382D00D7021F3803FF642EB9
+:10064A00720017030038FE38D93EEB01E6020403B4
+:10065A00E0381B030F03F538CE389239B63FFE0354
+:10066A001F3802FF2E7223030038FE38C63FF538C2
+:10067A0027031F3802FF642E360300385339270335
+:10068A00AD3F1F3801FF2E003F030038C63F42032B
+:10069A001F3803FF75642E004703003853395B0384
+:1006AA00AD3F1F3804FF75642E724E030038FE38C2
+:1006BA00E60204030F03F538CE389239B63FFE033B
+:1006CA001F3806FF75642F6D6F6457030038FE38B4
+:1006DA0053390739C139F538C338FE38C139F538C5
+:1006EA001F3806FF64696769743F66030038653F0F
+:1006FA00B0383C38390077393C380001123A9C3915
+:10070A00B0383C38400177393C380701123A9239FF
+:10071A003C3830009239B038BC3E78385B391F38E3
+:10072A0000380739F403F538CE382E3A033A9C39A3
+:10073A002E3AFE381F3802FF732C76030038B03881
+:10074A00A7031F3800382C07B038033AD93E0A3AB3
+:10075A009239FE385339EB073538BA039A3AB0382A
+:10076A0078382C078F3CC83AB403F538273935381E
+:10077A00C103B03897382C07D8381F3805FF697479
+:10078A0079706500A0030038B038033AD93E0A3AB6
+:10079A009239FE385339EB073538DC039A3AB038C8
+:1007AA00CA3BB038E903E5032E3AC83AD403F53810
+:1007BA0027393538E303B038CA3BE903D8381F383C
+:1007CA000038F83AE9031F3800383C38FF00123A7B
+:1007DA00F13E1F3806FF69636F756E74C3030038F4
+:1007EA00B0382E3AC338CA3B1F3804FF7479706593
+:1007FA00EF030038983FEB07353809049A3AAB3AC9
+:10080A009738F13EC83A04041F3801FF2700FA035B
+:10081A0000388005C305CE05B0385B06DE3FC33815
+:10082A00CA3B3C385901DE3F1B3A35381F043C3875
+:10083A00F3FF853DD8381F3805FF63736B69700075
+:10084A000A040038FE38B03835383504CE389738BF
+:10085A000739DE3F35383504E53F71052E3828045F
+:10086A00F538D8381F3805FF637363616E002104B9
+:10087A000038FE38CE38B03897380739DE3F193994
+:10088A0035385204C338343AC338CE382039193986
+:10089A00353852042E3A2E384004EF38CE38923981
+:1008AA00F538D8381F3806FF6163636570743804F9
+:1008BA000038CE389C39343ACE38023FB0389E04DC
+:1008CA00193935389004B0383C380800DE3F3538DD
+:1008DA008004D838E038C83E7739FE38E038E03846
+:1008EA00F53835387E049604343AFE38CE38F53871
+:1008FA000E012E388E04B038533F6D3935388704CF
+:10090A00D838533FB038F13ECE388C382E3ACE38EC
+:10091A001A012E386204D838EF38C3389239A03F0A
+:10092A001F3800383C380800B038F13EAD3FF13E80
+:10093A001F380038B0383C380D00DE3FC3383C3829
+:10094A000A00DE3F1B3A1F3806FF726566696C6C47
+:10095A005804FE3D1A00C73DD33D04FF6368617227
+:10096A00A90400388005D83897381F3806FF6E75F5
+:10097A006D626572B2040038BC3E7838FE380405F0
+:10098A00FE3817050405F5381B3AFE38B038193910
+:10099A003538D704D13EF538D838F538BC3E8038DA
+:1009AA0053391F381D3B533953392C3B3505B83859
+:1009BA003538F904E53FDE3F3538F00497383C38DE
+:1009CA002E00DE3F3538F104F5383538ED04F801EC
+:1009DA00EA3F2E38FF04D838D13EF538D838F538F2
+:1009EA00BC3E803853391F38D13EF5383538FE04BD
+:1009FA00263EE53FF538BC3E80384A391F38003874
+:100A0A00CE3897383C382D00DE3FB038FE383538BE
+:100A1A001005E53F7105F5381F3851380A001000F6
+:100A2A0002000A000038CE3897383C382300923941
+:100A3A00B03853393C380400563E35382D05120576
+:100A4A009C39CA3BBC3E8038E53F71052E382E05DD
+:100A5A00D8381F3807FF3E6E756D62657200BB0499
+:100A6A000038B03835384D05CE3897387B031939F8
+:100A7A0035384105D8381F38FE381C02BC3E783854
+:100A8A00FF00F538F7001C02E53F71052E383605E0
+:100A9A001F3805FF7061727365002F050038FE3834
+:100AAA006705E13E78387105F5383D04B0382E3ACD
+:100ABA00E13E643AE53F71051F3806FF736F7572B0
+:100ACA0063654E05FE3D1600C73DD33D07FF2F73F4
+:100ADA007472696E670062050038E038CE389C3956
+:100AEA00E038E03892391F380AFF70617273652D59
+:100AFA006E616D656B050038533F84051F380038F9
+:100B0A00FE386705E13E7838710507392604F5385D
+:100B1A003D04C83E9C396705D8389239E13E803891
+:100B2A001F3803FF7370300079056E380600C73D21
+:100B3A00D33D02FF737096055738080003FF7270A1
+:100B4A0030009E050038AB0578381F385738040046
+:100B5A0005FF646570746800A30500389A058C3A2D
+:100B6A009239033A343A1F3810FF666F7274682D4F
+:100B7A007265636F676E697A6572AD056E383E009D
+:100B8A009F3DA93D09FF7265636F676E697A6500CB
+:100B9A00B90500383C38D905C3386C0919393538D4
+:100BAA00D805D13E5B061F380038E038E038C83E29
+:100BBA001D3BE03829382C3BE038B0385B06DE3F75
+:100BCA003538EA05D83853391F38EF38EF384A39FB
+:100BDA001F3809FF696E7465727072657400C70503
+:100BEA0000388005B03835380606C305CE05B63E4E
+:100BFA007838353801068501CA3B29388A3F2E38AC
+:100C0A00F605D13E1F3806FF64743A6E756DEE051F
+:100C1A00513859014207420707FF64743A646E75F6
+:100C2A006D00080651385901D63FD63F07FF726555
+:100C3A00633A6E756D0011060038C00435382D060A
+:100C4A00E53FDE3F35382B060D061F3817061F38DD
+:100C5A005B061F3808FF7265633A66696E641B0695
+:100C6A000038D006B038193935383E06D8385B0610
+:100C7A001F3845061F3805FF64743A7874002F063A
+:100C8A00513849064D06D63F0038D83829381F381A
+:100C9A0000382039353853062C071F3829381F38B1
+:100CAA0007FF64743A6E756C6C00400651385F0633
+:100CBA005F065F0600383C38F3FF853D0FFF73651A
+:100CCA00617263682D776F72646C6973740055067C
+:100CDA000038FE3853393C388206F5389F06B0385A
+:100CEA00193935387C06D13ED83853391F38B038CF
+:100CFA00C606C338340122011F380038FE38D838F6
+:100D0A00C83E0739BA068E0135389006F538D83804
+:100D1A0053394A391F38D13EF53853391F3811FF34
+:100D2A0074726176657273652D776F72646C69731C
+:100D3A007400630600385E3BB0383538B006C83EEA
+:100D4A001D3BC33829382C3BE0383538B006DB095F
+:100D5A00CA3B2E38A106D13E1F380BFF6E616D6566
+:100D6A003E737472696E670094060038F4033C3867
+:100D7A00FF00123A1F3807FF6E66613E6366610024
+:100D8A00B2060038DB092E3A1F3807FF66696E641F
+:100D9A002D787400C00600383C38DC063C384A001E
+:100DAA006C0919393538DB06D13E53391F380038FA
+:100DBA00FE38C83EF5386D06B0383538E906FE38D3
+:100DCA00EF38EF38F5384A391F3806FF6E65776510
+:100DDA007374CA0647388A0106FF6C6174657374B6
+:100DEA00EA0647388E0108FF28637265617465292F
+:100DFA00F106003880055508B038EF068F3C803878
+:100E0A003A08EF0680381F3801005C00F8060038FF
+:100E1A006705EF38E13E80381F38010028000907CE
+:100E2A0000383C3829005305D13E1F3807FF636F4D
+:100E3A006D70696C650012070038F538B0388501A5
+:100E4A00FE38CA3B2C071F3801FF2C001B0700384D
+:100E5A00113F723B113F2E3A7301123F1F380300B4
+:100E6A005B275D00290700380D0442071F38070079
+:100E7A006C69746572616C003407003821073C386C
+:100E8A002C071F380800736C69746572616C3C0723
+:100E9A00003821079503A3031F380038113F2107A3
+:100EAA00FFFF1F3800388A3F113FC338723B1F3893
+:100EBA000038113F1F3800388A3F2C071F380500B9
+:100ECA006168656164004707003821072E385207B8
+:100EDA001F3802006966640700382107353852074F
+:100EEA001F380400656C73656E07003821072E38B9
+:100EFA005207C33857071F3804007468656E7607AF
+:100F0A00003857071F380500626567696E00810758
+:100F1A0000385D071F3805007768696C6500880727
+:100F2A0000387107C3381F3806007265706561742E
+:100F3A0090070038B20785071F380500756E746977
+:100F4A006C00990700383C3835382C0760071F3881
+:100F5A000500616761696E00A207003821072E3813
+:100F6A0060071F380200646FAD07003821079A3AFC
+:100F7A005D07533915081F3804006C6F6F70B70787
+:100F8A0000382107C83AFC071F3805002B6C6F6F21
+:100F9A007000C10700382107B93AFC071F3805005D
+:100FAA006C6561766500CA0700382107D33A69077C
+:100FBA0015081F3803003F646F00D4070038210763
+:100FCA00EB077107BA07C33815081F380038C83E3F
+:100FDA00DE3FB038FE383538F307D13EF538FC39F4
+:100FEA001F3807FF656E646C6F6F7000DF0700388B
+:100FFA0060070908B8383538050885072E38FE070E
+:10100A001F3802FF6C3EF60700382808783878380F
+:10101A003C38FEFF2808643A1F3802FF3E6C060877
+:10102A000038EA3F2808643A2808783880381F3898
+:10103A0003FF6C70300012086E3840009F3DA93DD6
+:10104A0002FF6C701D084738900106FF63726561E4
+:10105A00746525080038FE065E08210751381F38D6
+:10106A0006FF6865616465722A080038113FFE3818
+:10107A00FE38B038273935384C08B0383C3800FFCC
+:10108A001B3AA703F5385E3B2C07F5381F383C3866
+:10109A00F0FF853D07FF776C73636F706500350855
+:1010AA00FE3D3C009F3DA93D06FF72657665616C79
+:1010BA004F080038EF068F3C7838B8383538690859
+:1010CA00EF067838C3383A3B1F380500646F6573FA
+:1010DA003E00590800382107820821070E9421078B
+:1010EA0077081F389A938A93CB0101967F916F9163
+:1010FA00BF93AF93DB010C9404380038F538EF0640
+:10110A008F3C78385E3BC606723B1F3801FF3A00B7
+:10111A006A080038FE069908D8381F3807FF3A6E61
+:10112A006F6E616D65008B080038113FB038F606A6
+:10113A00803821070038AE081F3801003B009308A9
+:10114A00003821071F38B6085E081F3801FF5D0006
+:10115A00A2080038E53FB63E80381F3801005B0020
+:10116A00AB0800385339B63E80381F3808FF76611D
+:10117A00726961626C65B3080038223FCD08EA3FA4
+:10118A002B3F1F3808FF636F6E7374616E74BB0860
+:10119A000038FE065E08210747382C071F3804FF6F
+:1011AA0075736572C7080038FE065E08210757384E
+:1011BA002C071F3807007265637572736500D408BF
+:1011CA000038F60678382C071F3809FF696D6D65F7
+:1011DA00646961746500DF08003893095E3BB038C2
+:1011EA00CA3B3C38FF7F123AC338723B1F380600AD
+:1011FA005B636861725DEA08003821073C38B6040F
+:10120A002C071F38060061626F727422FC080038CE
+:10121A00893E21071E091F3805FF61626F7274003B
+:10122A00070900384A39853D06FF3F61626F7274CB
+:10123A0011090038E03835382409C8031609D13EA7
+:10124A001F3809FF6765742D737461636B00190990
+:10125A000038B0388F3CC3385E3BB038FE3853395B
+:10126A00C338EB07353844099A3AAB3A343AC33EA5
+:10127A00CE389C395E3BC3384A39B93A3A09D13E2D
+:10128A00F5381F3809FF7365742D737461636B0039
+:10129A0026090038CE382039353856093C38FCFF43
+:1012AA00853DC83E3A3BC3385339EB0735386309A5
+:1012BA009A3A8F3CD93E3A3BC83A5E09D8381F3829
+:1012CA0009FF6D61702D737461636B004709003803
+:1012DA00B0388F3CC3385E3BC33E983FEB07353886
+:1012EA0088099A3AAB3A5E3BC338FE38073929383F
+:1012FA00B83835388409F538D838D33A1F38F5382C
+:10130A00EA3FB93A7709D83853391F380BFF67656E
+:10131A00742D63757272656E7400650900383C3805
+:10132A0046005E3B1F3809FF6765742D6F7264655E
+:10133A0072008B0900383C384A002D091F3809FF12
+:10134A006366672D6F7264657200980947384A00B0
+:10135A0007FF636F6D7061726500A409B409BF93DA
+:10136A00AF938C0189919991DC01899199919C01A2
+:10137A0089919991FC01ED90F190EF1451F40A953D
+:10138A0019F02A95C1F701C02A95022B11F4882772
+:10139A0002C08FEF00C0982FAF91BF910C94043810
+:1013AA0007FF6E66613E6C666100AD090038BA06D9
+:1013BA002E3A033A9C391F380BFF7365742D6375F7
+:1013CA007272656E7400D50900383C3846003A3BA3
+:1013DA001F3808FF776F72646C697374E10900380B
+:1013EA001A3F5339CE383A3BB0388F3C73011B3F12
+:1013FA001F380EFF666F7274682D776F72646C699E
+:10140A007374EE094738480009FF7365742D6F72CB
+:10141A0064657200FE0900383C384A004E091F38DC
+:10142A000FFF7365742D7265636F676E697A6572F3
+:10143A007300090A00383C385C004E091F380FFF58
+:10144A006765742D7265636F676E697A657273007A
+:10145A00150A00383C385C002D091F3804FF636FF9
+:10146A006465240A0038FE065E08113F85012C07D0
+:10147A001F3808FF656E642D636F6465330A003890
+:10148A0021070C94210704381F3808FF286D617260
+:10149A006B6572293E0A6E3868009F3DA93D0800B7
+:1014AA00706F7374706F6E654A0A00388005C305E1
+:1014BA00CE05B038FE3885018501CA3B2938F53892
+:1014CA008501CA3B2C071F380BFF6170706C74755D
+:1014DA00726E6B657900540A0038C700963C3E016B
+:1014EA00AD3F95030A00466F7274686475696E6F42
+:0414FA00C8031F38CC
+:10700000BF93AF93DB011196B21469F4FD01EE0F4B
+:10701000FF1F659175911196FB01EE0FFF1F059102
+:107020001591F80109949A938A938B2D9927BB2483
+:107030006FEB7CE3F1CF04FF65786974690A20384F
+:10704000AF91BF91E1CF07FF657865637574650007
+:107050001B382A38BC0189919991DECF2F38FD0168
+:10706000EE0FFF1FA591B591CFCF3638982B8991A0
+:107070009991A9F31196C8CF3D389A938A93FD014F
+:10708000EE0FFF1F859195911196BECF47389A93C9
+:107090008A93FB013196EE0FFF1F85919591B4CF36
+:1070A00051389A938A93CB010196AECF57389A9371
+:1070B0008A93FB013196EE0FFF1F85919591840D08
+:1070C000951DA2CF07FF2876616C756529002338CE
+:1070D0000038FE065E0821076E381F380E947708C8
+:1070E000B0388501CA3B29381F3801FF400062389B
+:1070F0007938FC018191919187CF01FF210075388A
+:107100008138FC018991999191838083899199912A
+:107110007BCF02FF63217D388D38FC0189919991E5
+:1071200080838991999170CF02FF634089389838A4
+:10713000FC019927808168CF02FF407594380038A0
+:10714000013B9C3978381F3802FF21759C38003884
+:10715000013B9C3980381F3803FF64757000A438E8
+:10716000B1389A938A9350CF04FF3F647570AC385E
+:10717000B938082F092B11F09A938A9345CF04FF51
+:1071800073776170B438C4388C01899199911A93DE
+:107190000A933ACF04FF6F766572BF38CF389A935F
+:1071A0008A938A819B8130CF04FF64726F70CA38E2
+:1071B000D9388991999128CF03FF726F7400D43820
+:1071C000E1388C0129913991899199913A932A93C7
+:1071D0001A930A9319CF03FF6E697000DC38F038F8
+:1071E000229612CF02FF723EEB38F6389A938A93BA
+:1071F0008F919F9109CF02FF3E72F238FF389F9323
+:107200008F938991999100CF02FF7240FB38083922
+:107210009A938A938F919F919F938F93F5CE02FFBC
+:107220003C3E04390038DE3F19391F3802FF303D3B
+:107230000F391A39982BD1F530C002FF303C16397E
+:10724000213997FD2AC032C002FF303E1D3928394E
+:10725000821593055CF151F120C003FF64303E00BC
+:1072600024393239821593058991999182059305C4
+:10727000ECF0E1F012C003FF64303C002D394039DE
+:10728000229697FD0C944D390C94563904FF747274
+:1072900075653B394B399A938A938FEF9FEFB4CE44
+:1072A00001FF3000463954399A938A93C101ACCE1C
+:1072B00002FF753C50395C39299139918217930747
+:1072C000A8F3A1F3EACF02FF753E58390038C3385E
+:1072D0005B391F3801FF3C0063396E3929913991C0
+:1072E000281739071CF7D9CF01FF3E006A397839D2
+:1072F0002991399128173907CCF2C1F2CECF04FF7A
+:107300006C6F673274398439FC01992780E18A9562
+:1073100022F0EE0FFF1FD8F777CE9A9575CE01FFBA
+:107320002D007F39933909911991081B190BC80158
+:107330006BCE01FF2B008F399D3909911991800F78
+:10734000911F62CE02FF6D2A9939A6398C0189916D
+:1073500099919C0131027001209FC0013003F30814
+:10736000900DE11CF31C1203F308900DE11CF31CBB
+:107370009A938A93C70148CE06FF756D2F6D6F648F
+:10738000A239C2397C01299139910991199140E1C1
+:107390005527000F111F221F331F551F2E153F05A4
+:1073A000520518F003952E193F094A9589F73A932B
+:1073B0002A93C80129CE03FF756D2A00BC39E03934
+:1073C0008C0189919991809FF00122273327909F0A
+:1073D000F00D211D331D819FF00D211D331D919F47
+:1073E000200D311DCF019A938A93C9010DCE06FF5E
+:1073F000696E76657274DB39FD398095909504CE9F
+:1074000002FF322FF739043A95958795FDCD02FF9B
+:10741000322A003A0B3A880F991FF6CD03FF616EAE
+:107420006400073A133A0991199180239123ECCD16
+:1074300002FF6F720E3A1C3A09911991802B912B21
+:10744000E3CD03FF786F7200183A263A099119913B
+:1074500080279127D9CD02FF312B213A2F3A01966F
+:10746000D3CD02FF312D2B3A353A0197CDCD07FF11
+:107470003F6E656761746500313A003820393538F0
+:10748000423A263E1F3806FF6C7368696674373AC5
+:10749000493AFC018991999131971AF0880F991F07
+:1074A000FBCFB2CD06FF727368696674433A583AEF
+:1074B000FC018991999131971AF096958795FBCFA8
+:1074C000A3CD02FF2B21523A653AFC018991999193
+:1074D00020813181820F931F8083918389919991BB
+:1074E00093CD03FF72704000613A763A9A938A9383
+:1074F0008DB79EB789CD03FF72702100713A803A33
+:107500002FB7F8948DBF9EBF2FBF899199917CCDE5
+:1075100003FF737040007B3A8D3A9A938A93CE01B1
+:1075200073CD03FF73702100883A963AEC0189917C
+:1075300099916ACD9B3A29913991E0E83E0F821BDF
+:10754000930B3F932F939F938F93899199915CCD48
+:1075500001FF6900913AAC3A9A938A938F919F9177
+:10756000EF91FF91FF93EF939F938F938E0F9F1F48
+:107570004BCDBA3AEF91FF91E80FF91F899199919C
+:107580001BF0FF93EF936BCD0F911F9111963CCDA4
+:10759000C93AEF91FF913196BBF3F3CF06FF756EB9
+:1075A0006C6F6F70A83AD43A1F910F911F910F9191
+:1075B0002BCD06FF636D6F76653ECE3ADF3ABF9303
+:1075C000AF93E991F991A991B991092F082B41F055
+:1075D000E80FF91FA80FB91F1E9112930197E1F749
+:1075E000AF91BF91899199910FCD02FF3E3CD93A5D
+:1075F000F93A092F982F802F07CD03FF75704000AF
+:10760000F53A023B9A938A93C201FECC03FF757050
+:107610002100FD3A0B3B2C0189919991F5CC03FF98
+:10762000316D7300063B143BE0EAFFE03197F1F760
+:10763000EBCC03FF323E72000F3B1E3BFC018991F5
+:1076400099919F938F93FF93EF9389919991DCCCBC
+:1076500003FF32723E00193B2D3B9A938A93EF91C0
+:10766000FF918F919F919A938A93CF01CDCC02FF86
+:107670002165283B3B3BFC01899199912FB7F894F8
+:1076800028D000B5081709F00BD0319622D000B5EC
+:10769000091711F0892F04D02FBF89919991B4CC8B
+:1076A000F999FECF07B700FDFDCFF2BDE1BD80BD6A
+:1076B000FA9AF99A089502FF4065373B5F3B2FB76E
+:1076C000F894FC0106D080B5319603D090B52FBF59
+:1076D0009BCCF999FECFF2BDE1BDF89A089502FF67
+:1076E00021695B3BFE3D66009F3DA93D09FF2821C6
+:1076F000692D6E72777729006F3B7E3B1FB71F9312
+:10770000F8949C0189919991AF93BF93CF93DF93A4
+:1077100009D0DF91CF91BF91AF91899199911F913C
+:107720001FBF72CC10D0E094F0948E219F21982B33
+:1077300019F0F90102E020D0F90104E01DD0F901AF
+:1077400000E11AD00895F901E07CFF7FEF01A0E489
+:10775000B0E0FE01EE0FFF1F45915591FE01E217CB
+:10776000F30711F00A0102C07A010C01002704D0CE
+:107770002196119771F70895F999FECF17B710FD6B
+:10778000FDCFEE0FFF1F016007BFE895089502FFD0
+:107790004069763BCB3BFC01EE0FFF1F8591959135
+:1077A00033CC03FF6E3E7200C73BD63BFC01082F73
+:1077B000899199919F938F930A95D1F7EF93FF93B6
+:1077C0008991999121CC03FF6E723E00D13BE83B39
+:1077D0009A938A93FF91EF910E2F8F919F919A9395
+:1077E0008A930A95D1F7CF010FCC03FF64322A00A8
+:1077F000E33BFA3B09911991000F111F881F991F54
+:107800001A930A9301CC03FF64322F00F53B083C26
+:107810000991199195958795179507951A930A934C
+:10782000F3CB02FF642B033C153C29913991E9907D
+:10783000F99049915991240F351F8E1D9F1D3A9340
+:107840002A93E2CB02FF642D113C263C2991399109
+:10785000E990F99049915991421B530BE80AF90AB2
+:107860005A934A93C701D0CB07FF64696E7665725D
+:107870007400223C3B3C09911991809590950095AC
+:1078800010951A930A93C0CB04FF2F6D6F64343C9C
+:10789000493C9C0109911991412F432717FF04C0CE
+:1078A000109500950F5F1F4F37FF04C0309520954E
+:1078B0002F5F3F4FEE24FF1851E1001F111F5A9513
+:1078C00039F447FF04C0109500950F5F1F4F0BC0A0
+:1078D000EE1CFF1CE21AF30A20F4E20EF31E889459
+:1078E000ECCF0894EACFFA92EA92C8018DCB03FF5D
+:1078F00061627300443C0038B0383D3A1F3804FFE1
+:107900007069636B773C00382E3AC33E8C3A9C39E1
+:1079100078381F3805FF63656C6C2B007F3C903C0A
+:10792000029672CB04FF2B696E748A3C973C789464
+:107930006BCB04FF2D696E74923C9E3CF89464CB33
+:1079400004FF696E7421993C00383C3800009C3972
+:107950003A3B1F3804FF696E7440A03C00383C3845
+:1079600000009C395E3B1F3808FF696E742D7472ED
+:107970006170AA3CBB3CB82E8991999145CB0038E7
+:10798000AE3C2938C43C1F38C53C01D03DCB1895CE
+:10799000003895030300206F6B00C8031F3803FFF6
+:1079A0002E6F6B00B43CFE3D1C00C73DD33D00383C
+:1079B000950302003E20A03FC8031F3806FF2E7229
+:1079C00065616479CF3CFE3D2000C73DD33D003862
+:1079D00095030400203F3F20C803BC3E7838FE38A2
+:1079E000403F4A03E13E78384A03F538BC3E8038D0
+:1079F0001F3806FF2E6572726F72DE3CFE3D1E0060
+:107A0000C73DD33D04FF71756974F93C0038210806
+:107A1000280880389A05953AA7057F3AB608B63EF9
+:107A2000783819393538153DE33CAE043538273DF3
+:107A30003C38F5056F3DB8383538273DB0383C380F
+:107A4000FEFF6D393538253DFE3C2E38073DD33CD1
+:107A50002E380F3D05FF706175736500023DFE3DD8
+:107A60009201B33DBD3D04FF636F6C642A3D383D18
+:107A7000A4B622243324BB2424BEE0E0F1E021920A
+:107A8000E030E9F7F930D9F7E4E9F1E02F010FEF41
+:107A90000DBF048318E01EBF1583CFEAC683D8E06C
+:107AA000D783A9E5BDE3B0CA04FF7761726D333DAA
+:107AB000003867023C3859013C382F3DDE3DB6089E
+:107AC0005B3F063D07FF68616E646C657200543D64
+:107AD00057380A0005FF636174636800623D00382F
+:107AE0008C3AFE38683D7838FE38753A683D803803
+:107AF0002938F538683D8038F538D83853391F387B
+:107B000005FF7468726F77006A3D0038B038193924
+:107B100035388C3DD8381F38683D78387F3AF5388D
+:107B2000683D8038F538C338FE38953AD838F5388E
+:107B30001F3807FF4564656665724000803D003868
+:107B4000CA3B5E3B1F3807FF4564656665722100CE
+:107B5000993D0038CA3B3A3B1F3807FF52646566BF
+:107B600065724000A33D0038CA3B78381F3807FFD4
+:107B70005264656665722100AD3D0038CA3B8038AD
+:107B80001F3807FF5564656665724000B73D0038D1
+:107B9000CA3B013B9C3978381F3807FF556465663E
+:107BA00065722100C13D0038CA3B013B9C398038D9
+:107BB0001F3806FF646566657221CD3D0038CF3FF2
+:107BC000B03885018501CA3B29381F3806FF646536
+:107BD00066657240D93D0038CF3FB0388501CA3B59
+:107BE00029381F3807FF2864656665722900E63D5D
+:107BF0000038FE065E082107FE3D1F380E94770808
+:107C0000B0388501CA3B293829381F3802FF752E44
+:107C1000F23D0038533952031F3803FF752E7200AE
+:107C2000063E00385339C3385B031F3805FF752FF4
+:107C30006D6F64000D3E0038FE385339F538C13998
+:107C40001F3806FF6E6567617465163E0038FC39A3
+:107C50002E3A1F3801FF2F00213E0038483CEF38F4
+:107C60001F3803FF6D6F64002A3E0038483CD83847
+:107C70001F3803FF6D696E00313E0038C83E77390A
+:107C80003538433EC338D8381F3803FF6D6178005C
+:107C9000393E0038C83E6D3935384F3EC338D83884
+:107CA0001F3806FF77697468696E453E0038CE3824
+:107CB0009239FE389239F5385B391F380DFF7368F9
+:107CC0006F772D776F72646C69737400513E003862
+:107CD0003C386D3EC3389F061F380038BA06C803CB
+:107CE000AD3F4A391F3805FF776F726473005E3EFF
+:107CF00000383C384C005E3B673E1F3802002E22A5
+:107D0000733E0038893E2107C8031F3802007322E2
+:107D10007E3E00383C3822005305B63E7838353870
+:107D2000923E4D071F3804FF66696C6C863E003832
+:107D3000E038E038B8383538A43E983F9A3AB03841
+:107D4000AB3A8C38C83A9F3ED8381F3805FF665F7B
+:107D500063707500933E00383C3800243C38F400D2
+:107D60001F3805FF737461746500A63E4738C00173
+:107D700004FF62617365B13E57380C0005FF63650F
+:107D80006C6C7300B83E0B3A04FF32647570BE3EF3
+:107D90000038CE38CE381F3805FF3264726F70005D
+:107DA000C43E0038D838D8381F3804FF7475636B68
+:107DB000CC3E0038C338CE381F3803FF3E696E0012
+:107DC000D53E5738180003FF70616400DD3E00386F
+:107DD000223F3C3828009C391F3804FF656D6974C8
+:107DE000E33EFE3D0E00C73DD33D05FF656D697462
+:107DF0003F00ED3EFE3D1000C73DD33D03FF6B65E8
+:107E00007900F53EFE3D1200C73DD33D04FF6B6592
+:107E1000793FFE3EFE3D1400C73DD33D02FF647036
+:107E2000063F6E3836009F3DA93D05FF65686572C7
+:107E300065000E3F6E383A009F3DA93D04FF68651E
+:107E40007265153F6E3838009F3DA93D05FF616C96
+:107E50006C6F74001E3F0038223F9C397301233F32
+:107E60001F3803FF62696E00263F0038EA3FBC3EC0
+:107E700080381F3807FF646563696D616C00313FAE
+:107E800000383C380A00BC3E80381F3803FF686564
+:107E900078003A3F00383C381000BC3E80381F382C
+:107EA00002FF626C463F4738200007FF7475726E10
+:107EB0006B657900503FFE3D42009F3DA93D07FFA5
+:107EC000746F757070657200553F0038B0383C387B
+:107ED00061003C387B00563E3538713F3C38DF004E
+:107EE000123A1F3807FF746F6C6F776572005F3F3F
+:107EF0000038B0383C3841003C385B00563E3538DD
+:107F0000843F3C3820001B3A1F3806FF3F737461E2
+:107F1000636B723F0038B20520393538923F3C38E8
+:107F2000FCFF853D1F3806FF626F756E6473853FE9
+:107F30000038CE389C39C3381F3802FF6372933F34
+:107F400000383C380D00F13E3C380A00F13E1F3845
+:107F500005FF7370616365009D3F0038533FF13E3C
+:107F60001F3806FF737061636573A83F003853398B
+:107F7000493EB0383538C03FAD3F343A2E38B93F6E
+:107F8000D8381F3803FF733E6400B13F0038B03863
+:107F900020391F3805FF3E626F647900C23F2F3AD7
+:107FA0000800326C69746572616CCA3F0038C3386E
+:107FB000420742071F3801FF3D00D03F0038923989
+:107FC00019391F3801FF3100DB3F4738010001FF3D
+:107FD0003200E23F4738020002FF2D31E73F4738C9
+:027FE000FFFFA1
+:00000001FF
diff --git a/amforth-6.5/appl/arduino/duemilanove.lst b/amforth-6.5/appl/arduino/duemilanove.lst
new file mode 100644
index 0000000..e2162c3
--- /dev/null
+++ b/amforth-6.5/appl/arduino/duemilanove.lst
@@ -0,0 +1,10094 @@
+
+AVRASM ver. 2.1.52 duemilanove.asm Sun Apr 30 20:10:13 2017
+
+duemilanove.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'
+duemilanove.asm(11): 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'
+duemilanove.asm(13): 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(4): 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(6): Including file 'words/applturnkey.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 d0da rcall isr ; External Interrupt Request 0
+ .org 4
+000004 d0d8 rcall isr ; External Interrupt Request 1
+ .org 6
+000006 d0d6 rcall isr ; Pin Change Interrupt Request 0
+ .org 8
+000008 d0d4 rcall isr ; Pin Change Interrupt Request 0
+ .org 10
+00000a d0d2 rcall isr ; Pin Change Interrupt Request 1
+ .org 12
+00000c d0d0 rcall isr ; Watchdog Time-out Interrupt
+ .org 14
+00000e d0ce rcall isr ; Timer/Counter2 Compare Match A
+ .org 16
+000010 d0cc rcall isr ; Timer/Counter2 Compare Match A
+ .org 18
+000012 d0ca rcall isr ; Timer/Counter2 Overflow
+ .org 20
+000014 d0c8 rcall isr ; Timer/Counter1 Capture Event
+ .org 22
+000016 d0c6 rcall isr ; Timer/Counter1 Compare Match A
+ .org 24
+000018 d0c4 rcall isr ; Timer/Counter1 Compare Match B
+ .org 26
+00001a d0c2 rcall isr ; Timer/Counter1 Overflow
+ .org 28
+00001c d0c0 rcall isr ; TimerCounter0 Compare Match A
+ .org 30
+00001e d0be rcall isr ; TimerCounter0 Compare Match B
+ .org 32
+000020 d0bc rcall isr ; Timer/Couner0 Overflow
+ .org 34
+000022 d0ba rcall isr ; SPI Serial Transfer Complete
+ .org 36
+000024 d0b8 rcall isr ; USART Rx Complete
+ .org 38
+000026 d0b6 rcall isr ; USART, Data Register Empty
+ .org 40
+000028 d0b4 rcall isr ; USART Tx Complete
+ .org 42
+00002a d0b2 rcall isr ; ADC Conversion Complete
+ .org 44
+00002c d0b0 rcall isr ; EEPROM Ready
+ .org 46
+00002e d0ae rcall isr ; Analog Comparator
+ .org 48
+000030 d0ac rcall isr ; Two-wire Serial Interface
+ .org 50
+000032 d0aa 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 WANT_IGNORECASE = 1
+
+ ; cpu clock in hertz
+ .equ F_CPU = 16000000
+ .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 3804 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 3800 .dw DO_COLON
+ usart_rx_isr:
+00005a 383c .dw XT_DOLITERAL
+00005b 00c6 .dw usart_data
+00005c 3897 .dw XT_CFETCH
+00005d 38b0 .dw XT_DUP
+00005e 383c .dw XT_DOLITERAL
+00005f 0003 .dw 3
+000060 3fde .dw XT_EQUAL
+000061 3835 .dw XT_DOCONDBRANCH
+000062 0064 .dw usart_rx_isr1
+000063 3d37 .dw XT_COLD
+ usart_rx_isr1:
+000064 0043 .dw XT_TO_RXBUF
+000065 381f .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 3800 .dw DO_COLON
+ PFA_USART_INIT_RX_BUFFER: ; ( -- )
+000067 383c
+000068 0059 .dw XT_DOLITERAL, XT_ISR_RX
+000069 383c
+00006a 0024 .dw XT_DOLITERAL, URXCaddr
+00006b 3ca4 .dw XT_INTSTORE
+
+00006c 383c .dw XT_DOLITERAL
+00006d 0100 .dw usart_rx_data
+00006e 383c .dw XT_DOLITERAL
+00006f 0016 .dw usart_rx_size + 6
+000070 3953 .dw XT_ZERO
+000071 3e97 .dw XT_FILL
+000072 381f .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 3800 .dw DO_COLON
+ PFA_RX_BUFFER:
+000079 0093 .dw XT_RXQ_BUFFER
+00007a 3835 .dw XT_DOCONDBRANCH
+00007b 0079 .dw PFA_RX_BUFFER
+00007c 383c .dw XT_DOLITERAL
+00007d 0111 .dw usart_rx_out
+00007e 3897 .dw XT_CFETCH
+00007f 38b0 .dw XT_DUP
+000080 383c .dw XT_DOLITERAL
+000081 0100 .dw usart_rx_data
+000082 399c .dw XT_PLUS
+000083 3897 .dw XT_CFETCH
+000084 38c3 .dw XT_SWAP
+000085 3a2e .dw XT_1PLUS
+000086 383c .dw XT_DOLITERAL
+000087 000f .dw usart_rx_mask
+000088 3a12 .dw XT_AND
+000089 383c .dw XT_DOLITERAL
+00008a 0111 .dw usart_rx_out
+00008b 388c .dw XT_CSTORE
+00008c 381f .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 3800 .dw DO_COLON
+ PFA_RXQ_BUFFER:
+000094 3d2f .dw XT_PAUSE
+000095 383c .dw XT_DOLITERAL
+000096 0111 .dw usart_rx_out
+000097 3897 .dw XT_CFETCH
+000098 383c .dw XT_DOLITERAL
+000099 0110 .dw usart_rx_in
+00009a 3897 .dw XT_CFETCH
+00009b 3912 .dw XT_NOTEQUAL
+00009c 381f .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 3800 .dw DO_COLON
+ PFA_TX_POLL:
+ ; wait for data ready
+0000a4 00b1 .dw XT_TXQ_POLL
+0000a5 3835 .dw XT_DOCONDBRANCH
+0000a6 00a4 .dw PFA_TX_POLL
+ ; send to usart
+0000a7 383c .dw XT_DOLITERAL
+0000a8 00c6 .dw USART_DATA
+0000a9 388c .dw XT_CSTORE
+0000aa 381f .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 3800 .dw DO_COLON
+ PFA_TXQ_POLL:
+0000b2 3d2f .dw XT_PAUSE
+0000b3 383c .dw XT_DOLITERAL
+0000b4 00c0 .dw USART_A
+0000b5 3897 .dw XT_CFETCH
+0000b6 383c .dw XT_DOLITERAL
+0000b7 0020 .dw bm_USART_TXRD
+0000b8 3a12 .dw XT_AND
+0000b9 381f .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 386e .dw PFA_DOVALUE1
+ PFA_UBRR: ; ( -- )
+0000bf 008c .dw EE_UBRRVAL
+0000c0 3d9f .dw XT_EDEFERFETCH
+0000c1 3da9 .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 3800 .dw DO_COLON
+ PFA_USART: ; ( -- )
+
+0000c8 383c .dw XT_DOLITERAL
+0000c9 0098 .dw USART_B_VALUE
+0000ca 383c .dw XT_DOLITERAL
+0000cb 00c1 .dw USART_B
+0000cc 388c .dw XT_CSTORE
+
+0000cd 383c .dw XT_DOLITERAL
+0000ce 0006 .dw USART_C_VALUE
+0000cf 383c .dw XT_DOLITERAL
+0000d0 00c2 .dw USART_C | bm_USARTC_en
+0000d1 388c .dw XT_CSTORE
+
+0000d2 00be .dw XT_UBRR
+0000d3 38b0 .dw XT_DUP
+0000d4 3af8 .dw XT_BYTESWAP
+0000d5 383c .dw XT_DOLITERAL
+0000d6 00c5 .dw BAUDRATE_HIGH
+0000d7 388c .dw XT_CSTORE
+0000d8 383c .dw XT_DOLITERAL
+0000d9 00c4 .dw BAUDRATE_LOW
+0000da 388c .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 381f .dw XT_EXIT
+
+ .include "amforth.asm"
+
+ ;;;;
+ ;;;; GPL V2 (only)
+
+ .set AMFORTH_NRWW_SIZE=(FLASHEND-AMFORTH_RO_SEG)*2
+
+ .set corepc = pc
+ .org $0000
+000000 940c 3d38 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:
+0000dd 920a st -Y, r0
+0000de b60f in r0, SREG
+0000df 920a st -Y, r0
+ .if (pclen==3)
+ .endif
+0000e0 900f pop r0
+0000e1 900f pop r0 ; = intnum * intvectorsize + 1 (address following the rcall)
+0000e2 940a dec r0
+ .if intvecsize == 1 ;
+ .endif
+0000e3 2cb0 mov isrflag, r0
+0000e4 93ff push zh
+0000e5 93ef push zl
+0000e6 e1e2 ldi zl, low(intcnt)
+0000e7 e0f1 ldi zh, high(intcnt)
+0000e8 9406 lsr r0 ; we use byte addresses in the counter array, not words
+0000e9 0de0 add zl, r0
+0000ea 1df3 adc zh, zeroh
+0000eb 8000 ld r0, Z
+0000ec 9403 inc r0
+0000ed 8200 st Z, r0
+0000ee 91ef pop zl
+0000ef 91ff pop zh
+
+0000f0 9009 ld r0, Y+
+0000f1 be0f out SREG, r0
+0000f2 9009 ld r0, Y+
+0000f3 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:
+0000f4 ff02 .dw $ff02
+0000f5 2b6d .db "m+"
+0000f6 00c2 .dw VE_HEAD
+ .set VE_HEAD = VE_MPLUS
+ XT_MPLUS:
+0000f7 3800 .dw DO_COLON
+ PFA_MPLUS:
+0000f8 3fc6 .dw XT_S2D
+0000f9 3c14 .dw XT_DPLUS
+0000fa 381f .dw XT_EXIT
+ .include "words/ud-star.asm"
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_UDSTAR:
+0000fb ff03 .dw $ff03
+0000fc 6475
+../../common\words/ud-star.asm(9): warning: .cseg .db misalignment - padding zero byte
+0000fd 002a .db "ud*"
+0000fe 00f4 .dw VE_HEAD
+ .set VE_HEAD = VE_UDSTAR
+ XT_UDSTAR:
+0000ff 3800 .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 + ;
+
+000100 38b0
+000101 38fe
+000102 39df
+000103 38d8 .DW XT_DUP,XT_TO_R,XT_UMSTAR,XT_DROP
+000104 38c3
+000105 38f5
+000106 39df
+000107 38e0
+000108 399c
+000109 381f .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:
+00010a ff04 .dw $ff04
+00010b 6d75
+00010c 7861 .db "umax"
+00010d 00fb .dw VE_HEAD
+ .set VE_HEAD = VE_UMAX
+ XT_UMAX:
+00010e 3800 .dw DO_COLON
+ PFA_UMAX:
+ .endif
+
+00010f 3ec8
+000110 395b .DW XT_2DUP,XT_ULESS
+000111 3835 .dw XT_DOCONDBRANCH
+000112 0114 DEST(UMAX1)
+000113 38c3 .DW XT_SWAP
+000114 38d8 UMAX1: .DW XT_DROP
+000115 381f .dw XT_EXIT
+ .include "words/umin.asm"
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_UMIN:
+000116 ff04 .dw $ff04
+000117 6d75
+000118 6e69 .db "umin"
+000119 010a .dw VE_HEAD
+ .set VE_HEAD = VE_UMIN
+ XT_UMIN:
+00011a 3800 .dw DO_COLON
+ PFA_UMIN:
+ .endif
+00011b 3ec8
+00011c 3966 .DW XT_2DUP,XT_UGREATER
+00011d 3835 .dw XT_DOCONDBRANCH
+00011e 0120 DEST(UMIN1)
+00011f 38c3 .DW XT_SWAP
+000120 38d8 UMIN1: .DW XT_DROP
+000121 381f .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:
+000122 3800 .dw DO_COLON
+ PFA_IMMEDIATEQ:
+000123 383c .dw XT_DOLITERAL
+000124 8000 .dw $8000
+000125 3a12 .dw XT_AND
+000126 3919 .dw XT_ZEROEQUAL
+000127 3835 .dw XT_DOCONDBRANCH
+000128 012b DEST(IMMEDIATEQ1)
+000129 3fe5 .dw XT_ONE
+00012a 381f .dw XT_EXIT
+ IMMEDIATEQ1:
+ ; not immediate
+00012b 394a .dw XT_TRUE
+00012c 381f .dw XT_EXIT
+ .include "words/name2flags.asm"
+
+ ; Tools
+ ; get the flags from a name token
+ VE_NAME2FLAGS:
+00012d ff0a .dw $ff0a
+00012e 616e
+00012f 656d
+000130 663e
+000131 616c
+000132 7367 .db "name>flags"
+000133 0116 .dw VE_HEAD
+ .set VE_HEAD = VE_NAME2FLAGS
+ XT_NAME2FLAGS:
+000134 3800 .dw DO_COLON
+ PFA_NAME2FLAGS:
+000135 3bca .dw XT_FETCHI ; skip to link field
+000136 383c .dw XT_DOLITERAL
+000137 ff00 .dw $ff00
+000138 3a12 .dw XT_AND
+000139 381f .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:
+00013a ff03 .dw $ff03
+00013b 6576
+../../common\words/ver.asm(12): warning: .cseg .db misalignment - padding zero byte
+00013c 0072 .db "ver"
+00013d 012d .dw VE_HEAD
+ .set VE_HEAD = VE_DOT_VER
+ XT_DOT_VER:
+00013e 3800 .dw DO_COLON
+ PFA_DOT_VER:
+ .endif
+00013f 029f .dw XT_ENV_FORTHNAME
+000140 03c8 .dw XT_ITYPE
+000141 3fad .dw XT_SPACE
+000142 3ebc .dw XT_BASE
+000143 3878 .dw XT_FETCH
+
+000144 02ad .dw XT_ENV_FORTHVERSION
+000145 3f40 .dw XT_DECIMAL
+000146 3fc6 .dw XT_S2D
+000147 02e6 .dw XT_L_SHARP
+000148 02ee .dw XT_SHARP
+000149 383c .dw XT_DOLITERAL
+00014a 002e .dw '.'
+00014b 02d7 .dw XT_HOLD
+00014c 0304 .dw XT_SHARP_S
+00014d 030f .dw XT_SHARP_G
+00014e 03fe .dw XT_TYPE
+00014f 3ebc .dw XT_BASE
+000150 3880 .dw XT_STORE
+000151 3fad .dw XT_SPACE
+000152 02b5 .dw XT_ENV_CPU
+000153 03c8 .dw XT_ITYPE
+
+000154 381f .dw XT_EXIT
+
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+ .include "words/noop.asm"
+
+ ; Tools
+ ; do nothing
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_NOOP:
+000155 ff04 .dw $ff04
+000156 6f6e
+000157 706f .db "noop"
+000158 013a .dw VE_HEAD
+ .set VE_HEAD = VE_NOOP
+ XT_NOOP:
+000159 3800 .dw DO_COLON
+ PFA_NOOP:
+ .endif
+00015a 381f .DW XT_EXIT
+ .include "words/unused.asm"
+
+ ; Tools
+ ; Amount of available RAM (incl. PAD)
+ VE_UNUSED:
+00015b ff06 .dw $ff06
+00015c 6e75
+00015d 7375
+00015e 6465 .db "unused"
+00015f 0155 .dw VE_HEAD
+ .set VE_HEAD = VE_UNUSED
+ XT_UNUSED:
+000160 3800 .dw DO_COLON
+ PFA_UNUSED:
+000161 3a8c .dw XT_SP_FETCH
+000162 3f22 .dw XT_HERE
+000163 3992 .dw XT_MINUS
+000164 381f .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:
+000165 0002 .dw $0002
+000166 6f74 .db "to"
+000167 015b .dw VE_HEAD
+ .set VE_HEAD = VE_TO
+ XT_TO:
+000168 3800 .dw DO_COLON
+ PFA_TO:
+ .endif
+000169 040d .dw XT_TICK
+00016a 3fcf .dw XT_TO_BODY
+00016b 3eb6 .dw XT_STATE
+00016c 3878 .dw XT_FETCH
+00016d 3835 .dw XT_DOCONDBRANCH
+00016e 0179 DEST(PFA_TO1)
+00016f 0721 .dw XT_COMPILE
+000170 0173 .dw XT_DOTO
+000171 072c .dw XT_COMMA
+000172 381f .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:
+000173 3800 .dw DO_COLON
+ PFA_DOTO:
+ .endif
+000174 38f5 .dw XT_R_FROM
+000175 38b0 .dw XT_DUP
+000176 0185 .dw XT_ICELLPLUS
+000177 38fe .dw XT_TO_R
+000178 3bca .dw XT_FETCHI
+ PFA_TO1:
+000179 38b0 .dw XT_DUP
+00017a 0185 .dw XT_ICELLPLUS
+00017b 0185 .dw XT_ICELLPLUS
+00017c 3bca .dw XT_FETCHI
+00017d 3829 .dw XT_EXECUTE
+00017e 381f .dw XT_EXIT
+ .include "words/i-cellplus.asm"
+
+ ; Compiler
+ ; skip to the next cell in flash
+ VE_ICELLPLUS:
+00017f ff07 .dw $FF07
+000180 2d69
+000181 6563
+000182 6c6c
+000183 002b .db "i-cell+",0
+000184 0165 .dw VE_HEAD
+ .set VE_HEAD = VE_ICELLPLUS
+ XT_ICELLPLUS:
+000185 3800 .dw DO_COLON
+ PFA_ICELLPLUS:
+000186 3a2e .dw XT_1PLUS
+000187 381f .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:
+000188 ff08 .dw $ff08
+000189 6369
+00018a 6d6f
+00018b 6170
+00018c 6572 .db "icompare"
+00018d 017f .dw VE_HEAD
+ .set VE_HEAD = VE_ICOMPARE
+ XT_ICOMPARE:
+00018e 3800 .dw DO_COLON
+ PFA_ICOMPARE:
+00018f 38fe .dw XT_TO_R ; ( -- r-addr r-len f-addr)
+000190 38ce .dw XT_OVER ; ( -- r-addr r-len f-addr r-len)
+000191 38f5 .dw XT_R_FROM ; ( -- r-addr r-len f-addr r-len f-len )
+000192 3912 .dw XT_NOTEQUAL ; ( -- r-addr r-len f-addr flag )
+000193 3835 .dw XT_DOCONDBRANCH
+000194 0199 .dw PFA_ICOMPARE_SAMELEN
+000195 3ed1 .dw XT_2DROP
+000196 38d8 .dw XT_DROP
+000197 394a .dw XT_TRUE
+000198 381f .dw XT_EXIT
+ PFA_ICOMPARE_SAMELEN:
+000199 38c3 .dw XT_SWAP ; ( -- r-addr f-addr len )
+00019a 3953 .dw XT_ZERO
+00019b 07eb .dw XT_QDOCHECK
+00019c 3835 .dw XT_DOCONDBRANCH
+00019d 01be .dw PFA_ICOMPARE_DONE
+00019e 3a9a .dw XT_DODO
+ PFA_ICOMPARE_LOOP:
+ ; ( r-addr f-addr --)
+00019f 38ce .dw XT_OVER
+0001a0 3878 .dw XT_FETCH
+ .if WANT_IGNORECASE == 1
+0001a1 01c1 .dw XT_ICOMPARE_LC
+ .endif
+0001a2 38ce .dw XT_OVER
+0001a3 3bca .dw XT_FETCHI ; ( -- r-addr f-addr r-cc f- cc)
+ .if WANT_IGNORECASE == 1
+0001a4 01c1 .dw XT_ICOMPARE_LC
+ .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
+0001a5 38b0 .dw XT_DUP
+ ;.dw XT_BYTESWAP
+0001a6 383c .dw XT_DOLITERAL
+0001a7 0100 .dw $100
+0001a8 395b .dw XT_ULESS
+0001a9 3835 .dw XT_DOCONDBRANCH
+0001aa 01af .dw PFA_ICOMPARE_LASTCELL
+0001ab 38c3 .dw XT_SWAP
+0001ac 383c .dw XT_DOLITERAL
+0001ad 00ff .dw $00FF
+0001ae 3a12 .dw XT_AND ; the final swap can be omitted
+ PFA_ICOMPARE_LASTCELL:
+0001af 3912 .dw XT_NOTEQUAL
+0001b0 3835 .dw XT_DOCONDBRANCH
+0001b1 01b6 .dw PFA_ICOMPARE_NEXTLOOP
+0001b2 3ed1 .dw XT_2DROP
+0001b3 394a .dw XT_TRUE
+0001b4 3ad3 .dw XT_UNLOOP
+0001b5 381f .dw XT_EXIT
+ PFA_ICOMPARE_NEXTLOOP:
+0001b6 3a2e .dw XT_1PLUS
+0001b7 38c3 .dw XT_SWAP
+0001b8 3c8f .dw XT_CELLPLUS
+0001b9 38c3 .dw XT_SWAP
+0001ba 383c .dw XT_DOLITERAL
+0001bb 0002 .dw 2
+0001bc 3ab9 .dw XT_DOPLUSLOOP
+0001bd 019f .dw PFA_ICOMPARE_LOOP
+ PFA_ICOMPARE_DONE:
+0001be 3ed1 .dw XT_2DROP
+0001bf 3953 .dw XT_ZERO
+0001c0 381f .dw XT_EXIT
+
+ .if WANT_IGNORECASE == 1
+ ; ( cc1 cc2 -- f)
+ ; Tools
+ ; compares two packed characters
+ ;VE_ICOMPARELC:
+ ; .dw $ff08
+ ; .db "icompare-lower"
+ ; .dw VE_HEAD
+ ; .set VE_HEAD = VE_ICOMPARELC
+ XT_ICOMPARE_LC:
+0001c1 3800 .dw DO_COLON
+ PFA_ICOMPARE_LC:
+0001c2 38b0 .dw XT_DUP
+0001c3 383c .dw XT_DOLITERAL
+0001c4 00ff .dw $00ff
+0001c5 3a12 .dw XT_AND
+0001c6 3f78 .dw XT_TOLOWER
+0001c7 38c3 .dw XT_SWAP
+0001c8 3af8 .dw XT_BYTESWAP
+0001c9 383c .dw XT_DOLITERAL
+0001ca 00ff .dw $00ff
+0001cb 3a12 .dw XT_AND
+0001cc 3f78 .dw XT_TOLOWER
+0001cd 3af8 .dw XT_BYTESWAP
+0001ce 3a1b .dw XT_OR
+0001cf 381f .dw XT_EXIT
+ .endif
+ .include "words/star.asm"
+
+ ; Arithmetics
+ ; multiply routine
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_STAR:
+0001d0 ff01 .dw $ff01
+0001d1 002a .db "*",0
+0001d2 0188 .dw VE_HEAD
+ .set VE_HEAD = VE_STAR
+ XT_STAR:
+0001d3 3800 .dw DO_COLON
+ PFA_STAR:
+ .endif
+
+0001d4 39a5 .dw XT_MSTAR
+0001d5 38d8 .dw XT_DROP
+0001d6 381f .dw XT_EXIT
+ .include "words/j.asm"
+
+ ; Compiler
+ ; loop counter of outer loop
+ VE_J:
+0001d7 ff01 .dw $FF01
+0001d8 006a .db "j",0
+0001d9 01d0 .dw VE_HEAD
+ .set VE_HEAD = VE_J
+ XT_J:
+0001da 3800 .dw DO_COLON
+ PFA_J:
+0001db 3a75 .dw XT_RP_FETCH
+0001dc 383c .dw XT_DOLITERAL
+0001dd 0007 .dw 7
+0001de 399c .dw XT_PLUS
+0001df 3878 .dw XT_FETCH
+0001e0 3a75 .dw XT_RP_FETCH
+0001e1 383c .dw XT_DOLITERAL
+0001e2 0009 .dw 9
+0001e3 399c .dw XT_PLUS
+0001e4 3878 .dw XT_FETCH
+0001e5 399c .dw XT_PLUS
+0001e6 381f .dw XT_EXIT
+ .include "words/dabs.asm"
+
+ ; Arithmetics
+ ; double cell absolute value
+ VE_DABS:
+0001e7 ff04 .dw $ff04
+0001e8 6164
+0001e9 7362 .db "dabs"
+0001ea 01d7 .dw VE_HEAD
+ .set VE_HEAD = VE_DABS
+ XT_DABS:
+0001eb 3800 .dw DO_COLON
+ PFA_DABS:
+0001ec 38b0 .dw XT_DUP
+0001ed 3920 .dw XT_ZEROLESS
+0001ee 3835 .dw XT_DOCONDBRANCH
+0001ef 01f1 .dw PFA_DABS1
+0001f0 01f8 .dw XT_DNEGATE
+ PFA_DABS1:
+0001f1 381f .dw XT_EXIT
+ ; : dabs ( ud1 -- +d2 ) dup 0< if dnegate then ;
+ .include "words/dnegate.asm"
+
+ ; Arithmetics
+ ; double cell negation
+ VE_DNEGATE:
+0001f2 ff07 .dw $ff07
+0001f3 6e64
+0001f4 6765
+0001f5 7461
+0001f6 0065 .db "dnegate",0
+0001f7 01e7 .dw VE_HEAD
+ .set VE_HEAD = VE_DNEGATE
+ XT_DNEGATE:
+0001f8 3800 .dw DO_COLON
+ PFA_DNEGATE:
+0001f9 3c3a .dw XT_DINVERT
+0001fa 3fe5 .dw XT_ONE
+0001fb 3953 .dw XT_ZERO
+0001fc 3c14 .dw XT_DPLUS
+0001fd 381f .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:
+0001fe ff05 .dw $ff05
+0001ff 6d63
+000200 766f
+000201 0065 .db "cmove",0
+000202 01f2 .dw VE_HEAD
+ .set VE_HEAD = VE_CMOVE
+ XT_CMOVE:
+000203 0204 .dw PFA_CMOVE
+ PFA_CMOVE:
+000204 93bf push xh
+000205 93af push xl
+000206 91e9 ld zl, Y+
+000207 91f9 ld zh, Y+ ; addr-to
+000208 91a9 ld xl, Y+
+000209 91b9 ld xh, Y+ ; addr-from
+00020a 2f09 mov temp0, tosh
+00020b 2b08 or temp0, tosl
+00020c f021 brbs 1, PFA_CMOVE1
+ PFA_CMOVE2:
+00020d 911d ld temp1, X+
+00020e 9311 st Z+, temp1
+00020f 9701 sbiw tosl, 1
+000210 f7e1 brbc 1, PFA_CMOVE2
+ PFA_CMOVE1:
+000211 91af pop xl
+000212 91bf pop xh
+000213 9189
+000214 9199 loadtos
+000215 940c 3804 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:
+000217 ff05 .dw $ff05
+000218 7332
+000219 6177
+00021a 0070 .db "2swap",0
+00021b 01fe .dw VE_HEAD
+ .set VE_HEAD = VE_2SWAP
+ XT_2SWAP:
+00021c 3800 .dw DO_COLON
+ PFA_2SWAP:
+
+ .endif
+00021d 38e0 .dw XT_ROT
+00021e 38fe .dw XT_TO_R
+00021f 38e0 .dw XT_ROT
+000220 38f5 .dw XT_R_FROM
+000221 381f .dw XT_EXIT
+ .include "words/tib.asm"
+
+ ; System
+ ; refills the input buffer
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_REFILLTIB:
+000222 ff0a .dw $ff0a
+000223 6572
+000224 6966
+000225 6c6c
+000226 742d
+000227 6269 .db "refill-tib"
+000228 0217 .dw VE_HEAD
+ .set VE_HEAD = VE_REFILLTIB
+ XT_REFILLTIB:
+000229 3800 .dw DO_COLON
+ PFA_REFILLTIB:
+ .endif
+00022a 0245 .dw XT_TIB
+00022b 383c .dw XT_DOLITERAL
+00022c 005a .dw TIB_SIZE
+00022d 045d .dw XT_ACCEPT
+00022e 024b .dw XT_NUMBERTIB
+00022f 3880 .dw XT_STORE
+000230 3953 .dw XT_ZERO
+000231 3ee1 .dw XT_TO_IN
+000232 3880 .dw XT_STORE
+000233 394a .dw XT_TRUE ; -1
+000234 381f .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:
+000235 ff0a .dw $FF0A
+000236 6f73
+000237 7275
+000238 6563
+000239 742d
+00023a 6269 .db "source-tib"
+00023b 0222 .dw VE_HEAD
+ .set VE_HEAD = VE_SOURCETIB
+ XT_SOURCETIB:
+00023c 3800 .dw DO_COLON
+ PFA_SOURCETIB:
+ .endif
+00023d 0245 .dw XT_TIB
+00023e 024b .dw XT_NUMBERTIB
+00023f 3878 .dw XT_FETCH
+000240 381f .dw XT_EXIT
+
+ ; ( -- addr )
+ ; System Variable
+ ; terminal input buffer address
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_TIB:
+000241 ff03 .dw $ff03
+000242 6974
+000243 0062 .db "tib",0
+000244 0235 .dw VE_HEAD
+ .set VE_HEAD = VE_TIB
+ XT_TIB:
+000245 3847 .dw PFA_DOVARIABLE
+ PFA_TIB:
+000246 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:
+000247 ff04 .dw $ff04
+000248 7423
+000249 6269 .db "#tib"
+00024a 0241 .dw VE_HEAD
+ .set VE_HEAD = VE_NUMBERTIB
+ XT_NUMBERTIB:
+00024b 3847 .dw PFA_DOVARIABLE
+ PFA_NUMBERTIB:
+00024c 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:
+00024d ff06 .dw $ff06
+00024e 6565
+00024f 723e
+000250 6d61 .db "ee>ram"
+000251 0247 .dw VE_HEAD
+ .set VE_HEAD = VE_EE2RAM
+ XT_EE2RAM:
+000252 3800 .dw DO_COLON
+ PFA_EE2RAM: ; ( -- )
+000253 3953 .dw XT_ZERO
+000254 3a9a .dw XT_DODO
+ PFA_EE2RAM_1:
+ ; ( -- e-addr r-addr )
+000255 38ce .dw XT_OVER
+000256 3b5e .dw XT_FETCHE
+000257 38ce .dw XT_OVER
+000258 3880 .dw XT_STORE
+000259 3c8f .dw XT_CELLPLUS
+00025a 38c3 .dw XT_SWAP
+00025b 3c8f .dw XT_CELLPLUS
+00025c 38c3 .dw XT_SWAP
+00025d 3ac8 .dw XT_DOLOOP
+00025e 0255 .dw PFA_EE2RAM_1
+ PFA_EE2RAM_2:
+00025f 3ed1 .dw XT_2DROP
+000260 381f .dw XT_EXIT
+
+ ; ( -- )
+ ; Tools
+ ; setup the default user area from eeprom
+ VE_INIT_RAM:
+000261 ff08 .dw $ff08
+000262 6e69
+000263 7469
+000264 722d
+000265 6d61 .db "init-ram"
+000266 024d .dw VE_HEAD
+ .set VE_HEAD = VE_INIT_RAM
+ XT_INIT_RAM:
+000267 3800 .dw DO_COLON
+ PFA_INI_RAM: ; ( -- )
+000268 383c .dw XT_DOLITERAL
+000269 006a .dw EE_INITUSER
+00026a 3b01 .dw XT_UP_FETCH
+00026b 383c .dw XT_DOLITERAL
+00026c 0022 .dw SYSUSERSIZE
+00026d 3a03 .dw XT_2SLASH
+00026e 0252 .dw XT_EE2RAM
+00026f 381f .dw XT_EXIT
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+
+ .include "words/environment.asm"
+
+ ; System Value
+ ; word list identifier of the environmental search list
+ VE_ENVIRONMENT:
+000270 ff0b .dw $ff0b
+000271 6e65
+000272 6976
+000273 6f72
+000274 6d6e
+000275 6e65
+000276 0074 .db "environment",0
+000277 0261 .dw VE_HEAD
+ .set VE_HEAD = VE_ENVIRONMENT
+ XT_ENVIRONMENT:
+000278 3847 .dw PFA_DOVARIABLE
+ PFA_ENVIRONMENT:
+000279 0044 .dw CFG_ENVIRONMENT
+ .include "words/env-wordlists.asm"
+
+ ; Environment
+ ; maximum number of wordlists in the dictionary search order
+ VE_ENVWORDLISTS:
+00027a ff09 .dw $ff09
+00027b 6f77
+00027c 6472
+00027d 696c
+00027e 7473
+00027f 0073 .db "wordlists",0
+000280 0000 .dw VE_ENVHEAD
+ .set VE_ENVHEAD = VE_ENVWORDLISTS
+ XT_ENVWORDLISTS:
+000281 3800 .dw DO_COLON
+ PFA_ENVWORDLISTS:
+000282 383c .dw XT_DOLITERAL
+000283 0008 .dw NUMWORDLISTS
+000284 381f .dw XT_EXIT
+ .include "words/env-slashpad.asm"
+
+ ; Environment
+ ; Size of the PAD buffer in bytes
+ VE_ENVSLASHPAD:
+000285 ff04 .dw $ff04
+000286 702f
+000287 6461 .db "/pad"
+000288 027a .dw VE_ENVHEAD
+ .set VE_ENVHEAD = VE_ENVSLASHPAD
+ XT_ENVSLASHPAD:
+000289 3800 .dw DO_COLON
+ PFA_ENVSLASHPAD:
+00028a 3a8c .dw XT_SP_FETCH
+00028b 3ee7 .dw XT_PAD
+00028c 3992 .dw XT_MINUS
+00028d 381f .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:
+00028e ff05 .dw $ff05
+00028f 682f
+000290 6c6f
+000291 0064 .db "/hold",0
+000292 0285 .dw VE_ENVHEAD
+ .set VE_ENVHEAD = VE_ENVSLASHHOLD
+ XT_ENVSLASHHOLD:
+000293 3800 .dw DO_COLON
+ PFA_ENVSLASHHOLD:
+ .endif
+000294 3ee7 .dw XT_PAD
+000295 3f22 .dw XT_HERE
+000296 3992 .dw XT_MINUS
+000297 381f .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:
+000298 ff0a .dw $ff0a
+000299 6f66
+00029a 7472
+00029b 2d68
+00029c 616e
+00029d 656d .db "forth-name"
+00029e 028e .dw VE_ENVHEAD
+ .set VE_ENVHEAD = VE_ENV_FORTHNAME
+ XT_ENV_FORTHNAME:
+00029f 3800 .dw DO_COLON
+ PFA_EN_FORTHNAME:
+0002a0 0395 .dw XT_DOSLITERAL
+0002a1 0007 .dw 7
+ .endif
+0002a2 6d61
+0002a3 6f66
+0002a4 7472
+../../common\words/env-forthname.asm(22): warning: .cseg .db misalignment - padding zero byte
+0002a5 0068 .db "amforth"
+ .if cpu_msp430==1
+ .endif
+0002a6 381f .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:
+0002a7 ff07 .dw $ff07
+0002a8 6576
+0002a9 7372
+0002aa 6f69
+0002ab 006e .db "version",0
+0002ac 0298 .dw VE_ENVHEAD
+ .set VE_ENVHEAD = VE_ENV_FORTHVERSION
+ XT_ENV_FORTHVERSION:
+0002ad 3800 .dw DO_COLON
+ PFA_EN_FORTHVERSION:
+ .endif
+0002ae 383c .dw XT_DOLITERAL
+0002af 0041 .dw 65
+0002b0 381f .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:
+0002b1 ff03 .dw $ff03
+0002b2 7063
+0002b3 0075 .db "cpu",0
+0002b4 02a7 .dw VE_ENVHEAD
+ .set VE_ENVHEAD = VE_ENV_CPU
+ XT_ENV_CPU:
+0002b5 3800 .dw DO_COLON
+ PFA_EN_CPU:
+ .endif
+0002b6 383c .dw XT_DOLITERAL
+0002b7 0037 .dw mcu_name
+0002b8 03f4 .dw XT_ICOUNT
+0002b9 381f .dw XT_EXIT
+ .include "words/env-mcuinfo.asm"
+
+ ; Environment
+ ; flash address of some CPU specific parameters
+ VE_ENV_MCUINFO:
+0002ba ff08 .dw $ff08
+0002bb 636d
+0002bc 2d75
+0002bd 6e69
+0002be 6f66 .db "mcu-info"
+0002bf 02b1 .dw VE_ENVHEAD
+ .set VE_ENVHEAD = VE_ENV_MCUINFO
+ XT_ENV_MCUINFO:
+0002c0 3800 .dw DO_COLON
+ PFA_EN_MCUINFO:
+0002c1 383c .dw XT_DOLITERAL
+0002c2 0033 .dw mcu_info
+0002c3 381f .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:
+0002c4 ff05 .dw $ff05
+0002c5 752f
+0002c6 6573
+0002c7 0072 .db "/user",0
+0002c8 02ba .dw VE_ENVHEAD
+ .set VE_ENVHEAD = VE_ENVUSERSIZE
+ XT_ENVUSERSIZE:
+0002c9 3800 .dw DO_COLON
+ PFA_ENVUSERSIZE:
+ .endif
+0002ca 383c .dw XT_DOLITERAL
+0002cb 002c .dw SYSUSERSIZE + APPUSERSIZE
+0002cc 381f .dw XT_EXIT
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+ .include "words/hld.asm"
+
+ ; Numeric IO
+ ; pointer to current write position in the Pictured Numeric Output buffer
+ VE_HLD:
+0002cd ff03 .dw $ff03
+0002ce 6c68
+0002cf 0064 .db "hld",0
+0002d0 0270 .dw VE_HEAD
+ .set VE_HEAD = VE_HLD
+ XT_HLD:
+0002d1 3847 .dw PFA_DOVARIABLE
+ PFA_HLD:
+0002d2 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:
+0002d3 ff04 .dw $ff04
+0002d4 6f68
+0002d5 646c .db "hold"
+0002d6 02cd .dw VE_HEAD
+ .set VE_HEAD = VE_HOLD
+ XT_HOLD:
+0002d7 3800 .dw DO_COLON
+ PFA_HOLD:
+ .endif
+0002d8 02d1 .dw XT_HLD
+0002d9 38b0 .dw XT_DUP
+0002da 3878 .dw XT_FETCH
+0002db 3a34 .dw XT_1MINUS
+0002dc 38b0 .dw XT_DUP
+0002dd 38fe .dw XT_TO_R
+0002de 38c3 .dw XT_SWAP
+0002df 3880 .dw XT_STORE
+0002e0 38f5 .dw XT_R_FROM
+0002e1 388c .dw XT_CSTORE
+0002e2 381f .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:
+0002e3 ff02 .dw $ff02
+0002e4 233c .db "<#"
+0002e5 02d3 .dw VE_HEAD
+ .set VE_HEAD = VE_L_SHARP
+ XT_L_SHARP:
+0002e6 3800 .dw DO_COLON
+ PFA_L_SHARP:
+ .endif
+0002e7 3ee7 .dw XT_PAD
+0002e8 02d1 .dw XT_HLD
+0002e9 3880 .dw XT_STORE
+0002ea 381f .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:
+0002eb ff01 .dw $ff01
+0002ec 0023 .db "#",0
+0002ed 02e3 .dw VE_HEAD
+ .set VE_HEAD = VE_SHARP
+ XT_SHARP:
+0002ee 3800 .dw DO_COLON
+ PFA_SHARP:
+ .endif
+0002ef 3ebc .dw XT_BASE
+0002f0 3878 .dw XT_FETCH
+0002f1 036b .dw XT_UDSLASHMOD
+0002f2 38e0 .dw XT_ROT
+0002f3 383c .dw XT_DOLITERAL
+0002f4 0009 .dw 9
+0002f5 38ce .dw XT_OVER
+0002f6 396d .dw XT_LESS
+0002f7 3835 .dw XT_DOCONDBRANCH
+0002f8 02fc DEST(PFA_SHARP1)
+0002f9 383c .dw XT_DOLITERAL
+0002fa 0007 .dw 7
+0002fb 399c .dw XT_PLUS
+ PFA_SHARP1:
+0002fc 383c .dw XT_DOLITERAL
+0002fd 0030 .dw 48 ; ASCII 0
+0002fe 399c .dw XT_PLUS
+0002ff 02d7 .dw XT_HOLD
+000300 381f .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:
+000301 ff02 .dw $ff02
+000302 7323 .db "#s"
+000303 02eb .dw VE_HEAD
+ .set VE_HEAD = VE_SHARP_S
+ XT_SHARP_S:
+000304 3800 .dw DO_COLON
+ PFA_SHARP_S:
+ .endif
+ NUMS1:
+000305 02ee .dw XT_SHARP
+000306 3ec8 .dw XT_2DUP
+000307 3a1b .dw XT_OR
+000308 3919 .dw XT_ZEROEQUAL
+000309 3835 .dw XT_DOCONDBRANCH
+00030a 0305 DEST(NUMS1) ; PFA_SHARP_S
+00030b 381f .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:
+00030c ff02 .dw $ff02
+00030d 3e23 .db "#>"
+00030e 0301 .dw VE_HEAD
+ .set VE_HEAD = VE_SHARP_G
+ XT_SHARP_G:
+00030f 3800 .dw DO_COLON
+ PFA_SHARP_G:
+ .endif
+000310 3ed1 .dw XT_2DROP
+000311 02d1 .dw XT_HLD
+000312 3878 .dw XT_FETCH
+000313 3ee7 .dw XT_PAD
+000314 38ce .dw XT_OVER
+000315 3992 .dw XT_MINUS
+000316 381f .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:
+000317 ff04 .dw $ff04
+000318 6973
+000319 6e67 .db "sign"
+00031a 030c .dw VE_HEAD
+ .set VE_HEAD = VE_SIGN
+ XT_SIGN:
+00031b 3800 .dw DO_COLON
+ PFA_SIGN:
+ .endif
+00031c 3920 .dw XT_ZEROLESS
+00031d 3835 .dw XT_DOCONDBRANCH
+00031e 0322 DEST(PFA_SIGN1)
+00031f 383c .dw XT_DOLITERAL
+000320 002d .dw 45 ; ascii -
+000321 02d7 .dw XT_HOLD
+ PFA_SIGN1:
+000322 381f .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:
+000323 ff03 .dw $ff03
+000324 2e64
+000325 0072 .db "d.r",0
+000326 0317 .dw VE_HEAD
+ .set VE_HEAD = VE_DDOTR
+ XT_DDOTR:
+000327 3800 .dw DO_COLON
+ PFA_DDOTR:
+
+ .endif
+000328 38fe .dw XT_TO_R
+000329 3ed9 .dw XT_TUCK
+00032a 01eb .dw XT_DABS
+00032b 02e6 .dw XT_L_SHARP
+00032c 0304 .dw XT_SHARP_S
+00032d 38e0 .dw XT_ROT
+00032e 031b .dw XT_SIGN
+00032f 030f .dw XT_SHARP_G
+000330 38f5 .dw XT_R_FROM
+000331 38ce .dw XT_OVER
+000332 3992 .dw XT_MINUS
+000333 3fb6 .dw XT_SPACES
+000334 03fe .dw XT_TYPE
+000335 381f .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:
+000336 ff02 .dw $ff02
+000337 722e .db ".r"
+000338 0323 .dw VE_HEAD
+ .set VE_HEAD = VE_DOTR
+ XT_DOTR:
+000339 3800 .dw DO_COLON
+ PFA_DOTR:
+
+ .endif
+00033a 38fe .dw XT_TO_R
+00033b 3fc6 .dw XT_S2D
+00033c 38f5 .dw XT_R_FROM
+00033d 0327 .dw XT_DDOTR
+00033e 381f .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:
+00033f ff02 .dw $ff02
+000340 2e64 .db "d."
+000341 0336 .dw VE_HEAD
+ .set VE_HEAD = VE_DDOT
+ XT_DDOT:
+000342 3800 .dw DO_COLON
+ PFA_DDOT:
+
+ .endif
+000343 3953 .dw XT_ZERO
+000344 0327 .dw XT_DDOTR
+000345 3fad .dw XT_SPACE
+000346 381f .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:
+000347 ff01 .dw $ff01
+000348 002e .db ".",0
+000349 033f .dw VE_HEAD
+ .set VE_HEAD = VE_DOT
+ XT_DOT:
+00034a 3800 .dw DO_COLON
+ PFA_DOT:
+ .endif
+00034b 3fc6 .dw XT_S2D
+00034c 0342 .dw XT_DDOT
+00034d 381f .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:
+00034e ff03 .dw $ff03
+00034f 6475
+000350 002e .db "ud.",0
+000351 0347 .dw VE_HEAD
+ .set VE_HEAD = VE_UDDOT
+ XT_UDDOT:
+000352 3800 .dw DO_COLON
+ PFA_UDDOT:
+ .endif
+000353 3953 .dw XT_ZERO
+000354 035b .dw XT_UDDOTR
+000355 3fad .dw XT_SPACE
+000356 381f .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:
+000357 ff04 .dw $ff04
+000358 6475
+000359 722e .db "ud.r"
+00035a 034e .dw VE_HEAD
+ .set VE_HEAD = VE_UDDOTR
+ XT_UDDOTR:
+00035b 3800 .dw DO_COLON
+ PFA_UDDOTR:
+ .endif
+00035c 38fe .dw XT_TO_R
+00035d 02e6 .dw XT_L_SHARP
+00035e 0304 .dw XT_SHARP_S
+00035f 030f .dw XT_SHARP_G
+000360 38f5 .dw XT_R_FROM
+000361 38ce .dw XT_OVER
+000362 3992 .dw XT_MINUS
+000363 3fb6 .dw XT_SPACES
+000364 03fe .dw XT_TYPE
+000365 381f .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:
+000366 ff06 .dw $ff06
+000367 6475
+000368 6d2f
+000369 646f .db "ud/mod"
+00036a 0357 .dw VE_HEAD
+ .set VE_HEAD = VE_UDSLASHMOD
+ XT_UDSLASHMOD:
+00036b 3800 .dw DO_COLON
+ PFA_UDSLASHMOD:
+ .endif
+00036c 38fe .dw XT_TO_R
+00036d 3953 .dw XT_ZERO
+00036e 3907 .dw XT_R_FETCH
+00036f 39c1 .dw XT_UMSLASHMOD
+000370 38f5 .dw XT_R_FROM
+000371 38c3 .dw XT_SWAP
+000372 38fe .dw XT_TO_R
+000373 39c1 .dw XT_UMSLASHMOD
+000374 38f5 .dw XT_R_FROM
+000375 381f .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:
+000376 ff06 .dw $ff06
+000377 6964
+000378 6967
+000379 3f74 .db "digit?"
+00037a 0366 .dw VE_HEAD
+ .set VE_HEAD = VE_DIGITQ
+ XT_DIGITQ:
+00037b 3800 .dw DO_COLON
+ PFA_DIGITQ:
+ .endif
+00037c 3f65 .dw XT_TOUPPER
+00037d 38b0
+00037e 383c
+00037f 0039
+000380 3977
+000381 383c
+000382 0100 .DW XT_DUP,XT_DOLITERAL,57,XT_GREATER,XT_DOLITERAL,256
+000383 3a12
+000384 399c
+000385 38b0
+000386 383c
+000387 0140
+000388 3977 .DW XT_AND,XT_PLUS,XT_DUP,XT_DOLITERAL,320,XT_GREATER
+000389 383c
+00038a 0107
+00038b 3a12
+00038c 3992
+00038d 383c
+00038e 0030 .DW XT_DOLITERAL,263,XT_AND,XT_MINUS,XT_DOLITERAL,48
+00038f 3992
+000390 38b0
+000391 3ebc
+000392 3878
+000393 395b .DW XT_MINUS,XT_DUP,XT_BASE,XT_FETCH,XT_ULESS
+000394 381f .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:
+000395 3800 .dw DO_COLON
+ PFA_DOSLITERAL:
+000396 3907 .dw XT_R_FETCH ; ( -- addr )
+000397 03f4 .dw XT_ICOUNT
+000398 38f5 .dw XT_R_FROM
+000399 38ce .dw XT_OVER ; ( -- addr' n addr n)
+00039a 3a2e .dw XT_1PLUS
+00039b 3a03 .dw XT_2SLASH ; ( -- addr' n addr k )
+00039c 399c .dw XT_PLUS ; ( -- addr' n addr'' )
+00039d 3a2e .dw XT_1PLUS
+00039e 38fe .dw XT_TO_R ; ( -- )
+00039f 381f .dw XT_EXIT
+ .include "words/scomma.asm"
+
+ ; Compiler
+ ; compiles a string from RAM to Flash
+ VE_SCOMMA:
+0003a0 ff02 .dw $ff02
+0003a1 2c73 .db "s",$2c
+0003a2 0376 .dw VE_HEAD
+ .set VE_HEAD = VE_SCOMMA
+ XT_SCOMMA:
+0003a3 3800 .dw DO_COLON
+ PFA_SCOMMA:
+0003a4 38b0 .dw XT_DUP
+0003a5 03a7 .dw XT_DOSCOMMA
+0003a6 381f .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:
+0003a7 3800 .dw DO_COLON
+ PFA_DOSCOMMA:
+0003a8 072c .dw XT_COMMA
+0003a9 38b0 .dw XT_DUP ; ( --addr len len)
+0003aa 3a03 .dw XT_2SLASH ; ( -- addr len len/2
+0003ab 3ed9 .dw XT_TUCK ; ( -- addr len/2 len len/2
+0003ac 3a0a .dw XT_2STAR ; ( -- addr len/2 len len'
+0003ad 3992 .dw XT_MINUS ; ( -- addr len/2 rem
+0003ae 38fe .dw XT_TO_R
+0003af 3953 .dw XT_ZERO
+0003b0 07eb .dw XT_QDOCHECK
+0003b1 3835 .dw XT_DOCONDBRANCH
+0003b2 03ba .dw PFA_SCOMMA2
+0003b3 3a9a .dw XT_DODO
+ PFA_SCOMMA1:
+0003b4 38b0 .dw XT_DUP ; ( -- addr addr )
+0003b5 3878 .dw XT_FETCH ; ( -- addr c1c2 )
+0003b6 072c .dw XT_COMMA ; ( -- addr )
+0003b7 3c8f .dw XT_CELLPLUS ; ( -- addr+cell )
+0003b8 3ac8 .dw XT_DOLOOP
+0003b9 03b4 .dw PFA_SCOMMA1
+ PFA_SCOMMA2:
+0003ba 38f5 .dw XT_R_FROM
+0003bb 3927 .dw XT_GREATERZERO
+0003bc 3835 .dw XT_DOCONDBRANCH
+0003bd 03c1 .dw PFA_SCOMMA3
+0003be 38b0 .dw XT_DUP ; well, tricky
+0003bf 3897 .dw XT_CFETCH
+0003c0 072c .dw XT_COMMA
+ PFA_SCOMMA3:
+0003c1 38d8 .dw XT_DROP ; ( -- )
+0003c2 381f .dw XT_EXIT
+ .include "words/itype.asm"
+
+ ; Tools
+ ; reads string from flash and prints it
+ VE_ITYPE:
+0003c3 ff05 .dw $ff05
+0003c4 7469
+0003c5 7079
+0003c6 0065 .db "itype",0
+0003c7 03a0 .dw VE_HEAD
+ .set VE_HEAD = VE_ITYPE
+ XT_ITYPE:
+0003c8 3800 .dw DO_COLON
+ PFA_ITYPE:
+0003c9 38b0 .dw XT_DUP ; ( --addr len len)
+0003ca 3a03 .dw XT_2SLASH ; ( -- addr len len/2
+0003cb 3ed9 .dw XT_TUCK ; ( -- addr len/2 len len/2
+0003cc 3a0a .dw XT_2STAR ; ( -- addr len/2 len len'
+0003cd 3992 .dw XT_MINUS ; ( -- addr len/2 rem
+0003ce 38fe .dw XT_TO_R
+0003cf 3953 .dw XT_ZERO
+0003d0 07eb .dw XT_QDOCHECK
+0003d1 3835 .dw XT_DOCONDBRANCH
+0003d2 03dc .dw PFA_ITYPE2
+0003d3 3a9a .dw XT_DODO
+ PFA_ITYPE1:
+0003d4 38b0 .dw XT_DUP ; ( -- addr addr )
+0003d5 3bca .dw XT_FETCHI ; ( -- addr c1c2 )
+0003d6 38b0 .dw XT_DUP
+0003d7 03e9 .dw XT_LOWEMIT
+0003d8 03e5 .dw XT_HIEMIT
+0003d9 3a2e .dw XT_1PLUS ; ( -- addr+cell )
+0003da 3ac8 .dw XT_DOLOOP
+0003db 03d4 .dw PFA_ITYPE1
+ PFA_ITYPE2:
+0003dc 38f5 .dw XT_R_FROM
+0003dd 3927 .dw XT_GREATERZERO
+0003de 3835 .dw XT_DOCONDBRANCH
+0003df 03e3 .dw PFA_ITYPE3
+0003e0 38b0 .dw XT_DUP ; make sure the drop below has always something to do
+0003e1 3bca .dw XT_FETCHI
+0003e2 03e9 .dw XT_LOWEMIT
+ PFA_ITYPE3:
+0003e3 38d8 .dw XT_DROP
+0003e4 381f .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:
+0003e5 3800 .dw DO_COLON
+ PFA_HIEMIT:
+0003e6 3af8 .dw XT_BYTESWAP
+0003e7 03e9 .dw XT_LOWEMIT
+0003e8 381f .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:
+0003e9 3800 .dw DO_COLON
+ PFA_LOWEMIT:
+0003ea 383c .dw XT_DOLITERAL
+0003eb 00ff .dw $00ff
+0003ec 3a12 .dw XT_AND
+0003ed 3ef1 .dw XT_EMIT
+0003ee 381f .dw XT_EXIT
+ .include "words/icount.asm"
+
+ ; Tools
+ ; get count information out of a counted string in flash
+ VE_ICOUNT:
+0003ef ff06 .dw $ff06
+0003f0 6369
+0003f1 756f
+0003f2 746e .db "icount"
+0003f3 03c3 .dw VE_HEAD
+ .set VE_HEAD = VE_ICOUNT
+ XT_ICOUNT:
+0003f4 3800 .dw DO_COLON
+ PFA_ICOUNT:
+0003f5 38b0 .dw XT_DUP
+0003f6 3a2e .dw XT_1PLUS
+0003f7 38c3 .dw XT_SWAP
+0003f8 3bca .dw XT_FETCHI
+0003f9 381f .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:
+0003fa ff04 .dw $ff04
+0003fb 7974
+0003fc 6570 .db "type"
+0003fd 03ef .dw VE_HEAD
+ .set VE_HEAD = VE_TYPE
+ XT_TYPE:
+0003fe 3800 .dw DO_COLON
+ PFA_TYPE:
+
+ .endif
+0003ff 3f98 .dw XT_BOUNDS
+000400 07eb .dw XT_QDOCHECK
+000401 3835 .dw XT_DOCONDBRANCH
+000402 0409 DEST(PFA_TYPE2)
+000403 3a9a .dw XT_DODO
+ PFA_TYPE1:
+000404 3aab .dw XT_I
+000405 3897 .dw XT_CFETCH
+000406 3ef1 .dw XT_EMIT
+000407 3ac8 .dw XT_DOLOOP
+000408 0404 DEST(PFA_TYPE1)
+ PFA_TYPE2:
+000409 381f .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:
+00040a ff01 .dw $ff01
+00040b 0027 .db "'",0
+00040c 03fa .dw VE_HEAD
+ .set VE_HEAD = VE_TICK
+ XT_TICK:
+00040d 3800 .dw DO_COLON
+ PFA_TICK:
+ .endif
+00040e 0580 .dw XT_PARSENAME
+00040f 05c3 .dw XT_FORTHRECOGNIZER
+000410 05ce .dw XT_RECOGNIZE
+ ; a word is tickable unless DT:TOKEN is DT:NULL or
+ ; the interpret action is a NOOP
+000411 38b0 .dw XT_DUP
+000412 065b .dw XT_DT_NULL
+000413 3fde .dw XT_EQUAL
+000414 38c3 .dw XT_SWAP
+000415 3bca .dw XT_FETCHI
+000416 383c .dw XT_DOLITERAL
+000417 0159 .dw XT_NOOP
+000418 3fde .dw XT_EQUAL
+000419 3a1b .dw XT_OR
+00041a 3835 .dw XT_DOCONDBRANCH
+00041b 041f DEST(PFA_TICK1)
+00041c 383c .dw XT_DOLITERAL
+00041d fff3 .dw -13
+00041e 3d85 .dw XT_THROW
+ PFA_TICK1:
+00041f 38d8 .dw XT_DROP
+000420 381f .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:
+000421 ff05 .dw $ff05
+000422 7363
+000423 696b
+000424 0070 .db "cskip",0
+000425 040a .dw VE_HEAD
+ .set VE_HEAD = VE_CSKIP
+ XT_CSKIP:
+000426 3800 .dw DO_COLON
+ PFA_CSKIP:
+ .endif
+000427 38fe .dw XT_TO_R ; ( -- addr1 n1 )
+ PFA_CSKIP1:
+000428 38b0 .dw XT_DUP ; ( -- addr' n' n' )
+000429 3835 .dw XT_DOCONDBRANCH ; ( -- addr' n')
+00042a 0435 DEST(PFA_CSKIP2)
+00042b 38ce .dw XT_OVER ; ( -- addr' n' addr' )
+00042c 3897 .dw XT_CFETCH ; ( -- addr' n' c' )
+00042d 3907 .dw XT_R_FETCH ; ( -- addr' n' c' c )
+00042e 3fde .dw XT_EQUAL ; ( -- addr' n' f )
+00042f 3835 .dw XT_DOCONDBRANCH ; ( -- addr' n')
+000430 0435 DEST(PFA_CSKIP2)
+000431 3fe5 .dw XT_ONE
+000432 0571 .dw XT_SLASHSTRING
+000433 382e .dw XT_DOBRANCH
+000434 0428 DEST(PFA_CSKIP1)
+ PFA_CSKIP2:
+000435 38f5 .dw XT_R_FROM
+000436 38d8 .dw XT_DROP ; ( -- addr2 n2)
+000437 381f .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:
+000438 ff05 .dw $ff05
+000439 7363
+00043a 6163
+../../common\words/cscan.asm(12): warning: .cseg .db misalignment - padding zero byte
+00043b 006e .db "cscan"
+00043c 0421 .dw VE_HEAD
+ .set VE_HEAD = VE_CSCAN
+ XT_CSCAN:
+00043d 3800 .dw DO_COLON
+ PFA_CSCAN:
+ .endif
+00043e 38fe .dw XT_TO_R
+00043f 38ce .dw XT_OVER
+ PFA_CSCAN1:
+000440 38b0 .dw XT_DUP
+000441 3897 .dw XT_CFETCH
+000442 3907 .dw XT_R_FETCH
+000443 3fde .dw XT_EQUAL
+000444 3919 .dw XT_ZEROEQUAL
+000445 3835 .dw XT_DOCONDBRANCH
+000446 0452 DEST(PFA_CSCAN2)
+000447 38c3 .dw XT_SWAP
+000448 3a34 .dw XT_1MINUS
+000449 38c3 .dw XT_SWAP
+00044a 38ce .dw XT_OVER
+00044b 3920 .dw XT_ZEROLESS ; not negative
+00044c 3919 .dw XT_ZEROEQUAL
+00044d 3835 .dw XT_DOCONDBRANCH
+00044e 0452 DEST(PFA_CSCAN2)
+00044f 3a2e .dw XT_1PLUS
+000450 382e .dw XT_DOBRANCH
+000451 0440 DEST(PFA_CSCAN1)
+ PFA_CSCAN2:
+000452 38ef .dw XT_NIP
+000453 38ce .dw XT_OVER
+000454 3992 .dw XT_MINUS
+000455 38f5 .dw XT_R_FROM
+000456 38d8 .dw XT_DROP
+000457 381f .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:
+000458 ff06 .dw $ff06
+000459 6361
+00045a 6563
+00045b 7470 .db "accept"
+00045c 0438 .dw VE_HEAD
+ .set VE_HEAD = VE_ACCEPT
+ XT_ACCEPT:
+00045d 3800 .dw DO_COLON
+ PFA_ACCEPT:
+
+ .endif
+00045e 38ce
+00045f 399c
+000460 3a34
+000461 38ce .DW XT_OVER,XT_PLUS,XT_1MINUS,XT_OVER
+000462 3f02
+000463 38b0
+000464 049e
+000465 3919
+000466 3835 ACC1: .DW XT_KEY,XT_DUP,XT_CRLFQ,XT_ZEROEQUAL,XT_DOCONDBRANCH
+000467 0490 DEST(ACC5)
+000468 38b0
+000469 383c
+00046a 0008
+00046b 3fde
+00046c 3835 .DW XT_DUP,XT_DOLITERAL,8,XT_EQUAL,XT_DOCONDBRANCH
+00046d 0480 DEST(ACC3)
+00046e 38d8
+00046f 38e0
+000470 3ec8
+000471 3977
+000472 38fe
+000473 38e0
+000474 38e0
+000475 38f5
+000476 3835 .DW XT_DROP,XT_ROT,XT_2DUP,XT_GREATER,XT_TO_R,XT_ROT,XT_ROT,XT_R_FROM,XT_DOCONDBRANCH
+000477 047e DEST(ACC6)
+000478 0496
+000479 3a34
+00047a 38fe
+00047b 38ce
+00047c 38f5
+00047d 010e .DW XT_BS,XT_1MINUS,XT_TO_R,XT_OVER,XT_R_FROM,XT_UMAX
+00047e 382e ACC6: .DW XT_DOBRANCH
+00047f 048e DEST(ACC4)
+
+
+ ACC3: ; check for remaining control characters, replace them with blank
+000480 38b0 .dw XT_DUP ; ( -- addr k k )
+000481 3f53 .dw XT_BL
+000482 396d .dw XT_LESS
+000483 3835 .dw XT_DOCONDBRANCH
+000484 0487 DEST(PFA_ACCEPT6)
+000485 38d8 .dw XT_DROP
+000486 3f53 .dw XT_BL
+ PFA_ACCEPT6:
+000487 38b0
+000488 3ef1
+000489 38ce
+00048a 388c
+00048b 3a2e
+00048c 38ce
+00048d 011a .DW XT_DUP,XT_EMIT,XT_OVER,XT_CSTORE,XT_1PLUS,XT_OVER,XT_UMIN
+00048e 382e ACC4: .DW XT_DOBRANCH
+00048f 0462 DEST(ACC1)
+000490 38d8
+000491 38ef
+000492 38c3
+000493 3992
+000494 3fa0
+000495 381f 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:
+000496 3800 .dw DO_COLON
+ .endif
+000497 383c .dw XT_DOLITERAL
+000498 0008 .dw 8
+000499 38b0 .dw XT_DUP
+00049a 3ef1 .dw XT_EMIT
+00049b 3fad .dw XT_SPACE
+00049c 3ef1 .dw XT_EMIT
+00049d 381f .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:
+00049e 3800 .dw DO_COLON
+ .endif
+00049f 38b0 .dw XT_DUP
+0004a0 383c .dw XT_DOLITERAL
+0004a1 000d .dw 13
+0004a2 3fde .dw XT_EQUAL
+0004a3 38c3 .dw XT_SWAP
+0004a4 383c .dw XT_DOLITERAL
+0004a5 000a .dw 10
+0004a6 3fde .dw XT_EQUAL
+0004a7 3a1b .dw XT_OR
+0004a8 381f .dw XT_EXIT
+ .include "words/refill.asm"
+
+ ; System
+ ; refills the input buffer
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_REFILL:
+0004a9 ff06 .dw $ff06
+0004aa 6572
+0004ab 6966
+0004ac 6c6c .db "refill"
+0004ad 0458 .dw VE_HEAD
+ .set VE_HEAD = VE_REFILL
+ XT_REFILL:
+0004ae 3dfe .dw PFA_DODEFER1
+ PFA_REFILL:
+ .endif
+0004af 001a .dw USER_REFILL
+0004b0 3dc7 .dw XT_UDEFERFETCH
+0004b1 3dd3 .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:
+0004b2 ff04 .dw $ff04
+0004b3 6863
+0004b4 7261 .db "char"
+0004b5 04a9 .dw VE_HEAD
+ .set VE_HEAD = VE_CHAR
+ XT_CHAR:
+0004b6 3800 .dw DO_COLON
+ PFA_CHAR:
+ .endif
+0004b7 0580 .dw XT_PARSENAME
+0004b8 38d8 .dw XT_DROP
+0004b9 3897 .dw XT_CFETCH
+0004ba 381f .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:
+0004bb ff06 .dw $ff06
+0004bc 756e
+0004bd 626d
+0004be 7265 .db "number"
+0004bf 04b2 .dw VE_HEAD
+ .set VE_HEAD = VE_NUMBER
+ XT_NUMBER:
+0004c0 3800 .dw DO_COLON
+ PFA_NUMBER:
+ .endif
+0004c1 3ebc .dw XT_BASE
+0004c2 3878 .dw XT_FETCH
+0004c3 38fe .dw XT_TO_R
+0004c4 0504 .dw XT_QSIGN
+0004c5 38fe .dw XT_TO_R
+0004c6 0517 .dw XT_SET_BASE
+0004c7 0504 .dw XT_QSIGN
+0004c8 38f5 .dw XT_R_FROM
+0004c9 3a1b .dw XT_OR
+0004ca 38fe .dw XT_TO_R
+ ; check whether something is left
+0004cb 38b0 .dw XT_DUP
+0004cc 3919 .dw XT_ZEROEQUAL
+0004cd 3835 .dw XT_DOCONDBRANCH
+0004ce 04d7 DEST(PFA_NUMBER0)
+ ; nothing is left. It cannot be a number at all
+0004cf 3ed1 .dw XT_2DROP
+0004d0 38f5 .dw XT_R_FROM
+0004d1 38d8 .dw XT_DROP
+0004d2 38f5 .dw XT_R_FROM
+0004d3 3ebc .dw XT_BASE
+0004d4 3880 .dw XT_STORE
+0004d5 3953 .dw XT_ZERO
+0004d6 381f .dw XT_EXIT
+ PFA_NUMBER0:
+0004d7 3b1d .dw XT_2TO_R
+0004d8 3953 .dw XT_ZERO ; starting value
+0004d9 3953 .dw XT_ZERO
+0004da 3b2c .dw XT_2R_FROM
+0004db 0535 .dw XT_TO_NUMBER ; ( 0. addr len -- d addr' len'
+ ; check length of the remaining string.
+ ; if zero: a single cell number is entered
+0004dc 38b8 .dw XT_QDUP
+0004dd 3835 .dw XT_DOCONDBRANCH
+0004de 04f9 DEST(PFA_NUMBER1)
+ ; if equal 1: mayba a trailing dot? --> double cell number
+0004df 3fe5 .dw XT_ONE
+0004e0 3fde .dw XT_EQUAL
+0004e1 3835 .dw XT_DOCONDBRANCH
+0004e2 04f0 DEST(PFA_NUMBER2)
+ ; excatly one character is left
+0004e3 3897 .dw XT_CFETCH
+0004e4 383c .dw XT_DOLITERAL
+0004e5 002e .dw 46 ; .
+0004e6 3fde .dw XT_EQUAL
+0004e7 3835 .dw XT_DOCONDBRANCH
+0004e8 04f1 DEST(PFA_NUMBER6)
+ ; its a double cell number
+ ; incorporate sign into number
+0004e9 38f5 .dw XT_R_FROM
+0004ea 3835 .dw XT_DOCONDBRANCH
+0004eb 04ed DEST(PFA_NUMBER3)
+0004ec 01f8 .dw XT_DNEGATE
+ PFA_NUMBER3:
+0004ed 3fea .dw XT_TWO
+0004ee 382e .dw XT_DOBRANCH
+0004ef 04ff DEST(PFA_NUMBER5)
+ PFA_NUMBER2:
+0004f0 38d8 .dw XT_DROP
+ PFA_NUMBER6:
+0004f1 3ed1 .dw XT_2DROP
+0004f2 38f5 .dw XT_R_FROM
+0004f3 38d8 .dw XT_DROP
+0004f4 38f5 .dw XT_R_FROM
+0004f5 3ebc .dw XT_BASE
+0004f6 3880 .dw XT_STORE
+0004f7 3953 .dw XT_ZERO
+0004f8 381f .dw XT_EXIT
+ PFA_NUMBER1:
+0004f9 3ed1 .dw XT_2DROP ; remove the address
+ ; incorporate sign into number
+0004fa 38f5 .dw XT_R_FROM
+0004fb 3835 .dw XT_DOCONDBRANCH
+0004fc 04fe DEST(PFA_NUMBER4)
+0004fd 3e26 .dw XT_NEGATE
+ PFA_NUMBER4:
+0004fe 3fe5 .dw XT_ONE
+ PFA_NUMBER5:
+0004ff 38f5 .dw XT_R_FROM
+000500 3ebc .dw XT_BASE
+000501 3880 .dw XT_STORE
+000502 394a .dw XT_TRUE
+000503 381f .dw XT_EXIT
+ .include "words/q-sign.asm"
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ XT_QSIGN:
+000504 3800 .dw DO_COLON
+ PFA_QSIGN: ; ( c -- )
+ .endif
+000505 38ce .dw XT_OVER ; ( -- addr len addr )
+000506 3897 .dw XT_CFETCH
+000507 383c .dw XT_DOLITERAL
+000508 002d .dw '-'
+000509 3fde .dw XT_EQUAL ; ( -- addr len flag )
+00050a 38b0 .dw XT_DUP
+00050b 38fe .dw XT_TO_R
+00050c 3835 .dw XT_DOCONDBRANCH
+00050d 0510 DEST(PFA_NUMBERSIGN_DONE)
+00050e 3fe5 .dw XT_ONE ; skip sign character
+00050f 0571 .dw XT_SLASHSTRING
+ PFA_NUMBERSIGN_DONE:
+000510 38f5 .dw XT_R_FROM
+000511 381f .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:
+000512 3851 .dw PFA_DOCONSTANT
+ .endif
+000513 000a
+000514 0010
+000515 0002
+000516 000a .dw 10,16,2,10 ; last one could a 8 instead.
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ XT_SET_BASE:
+000517 3800 .dw DO_COLON
+ PFA_SET_BASE: ; ( adr1 len1 -- adr2 len2 )
+ .endif
+000518 38ce .dw XT_OVER
+000519 3897 .dw XT_CFETCH
+00051a 383c .dw XT_DOLITERAL
+00051b 0023 .dw 35
+00051c 3992 .dw XT_MINUS
+00051d 38b0 .dw XT_DUP
+00051e 3953 .dw XT_ZERO
+00051f 383c .dw XT_DOLITERAL
+000520 0004 .dw 4
+000521 3e56 .dw XT_WITHIN
+000522 3835 .dw XT_DOCONDBRANCH
+000523 052d DEST(SET_BASE1)
+ .if cpu_msp430==1
+ .endif
+000524 0512 .dw XT_BASES
+000525 399c .dw XT_PLUS
+000526 3bca .dw XT_FETCHI
+000527 3ebc .dw XT_BASE
+000528 3880 .dw XT_STORE
+000529 3fe5 .dw XT_ONE
+00052a 0571 .dw XT_SLASHSTRING
+00052b 382e .dw XT_DOBRANCH
+00052c 052e DEST(SET_BASE2)
+ SET_BASE1:
+00052d 38d8 .dw XT_DROP
+ SET_BASE2:
+00052e 381f .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:
+00052f ff07 .dw $ff07
+000530 6e3e
+000531 6d75
+000532 6562
+000533 0072 .db ">number",0
+000534 04bb .dw VE_HEAD
+ .set VE_HEAD = VE_TO_NUMBER
+ XT_TO_NUMBER:
+000535 3800 .dw DO_COLON
+
+ .endif
+
+000536 38b0
+000537 3835 TONUM1: .DW XT_DUP,XT_DOCONDBRANCH
+000538 054d DEST(TONUM3)
+000539 38ce
+00053a 3897
+00053b 037b .DW XT_OVER,XT_CFETCH,XT_DIGITQ
+00053c 3919
+00053d 3835 .DW XT_ZEROEQUAL,XT_DOCONDBRANCH
+00053e 0541 DEST(TONUM2)
+00053f 38d8
+000540 381f .DW XT_DROP,XT_EXIT
+000541 38fe
+000542 021c
+000543 3ebc
+000544 3878
+000545 00ff TONUM2: .DW XT_TO_R,XT_2SWAP,XT_BASE,XT_FETCH,XT_UDSTAR
+000546 38f5
+000547 00f7
+000548 021c .DW XT_R_FROM,XT_MPLUS,XT_2SWAP
+000549 3fe5
+00054a 0571
+00054b 382e .DW XT_ONE,XT_SLASHSTRING,XT_DOBRANCH
+00054c 0536 DEST(TONUM1)
+00054d 381f 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:
+00054e ff05 .dw $ff05
+00054f 6170
+000550 7372
+000551 0065 .db "parse",0
+000552 052f .dw VE_HEAD
+ .set VE_HEAD = VE_PARSE
+ XT_PARSE:
+000553 3800 .dw DO_COLON
+ PFA_PARSE:
+ .endif
+000554 38fe .dw XT_TO_R ; ( -- )
+000555 0567 .dw XT_SOURCE ; ( -- addr len)
+000556 3ee1 .dw XT_TO_IN ; ( -- addr len >in)
+000557 3878 .dw XT_FETCH
+000558 0571 .dw XT_SLASHSTRING ; ( -- addr' len' )
+
+000559 38f5 .dw XT_R_FROM ; ( -- addr' len' c)
+00055a 043d .dw XT_CSCAN ; ( -- addr' len'')
+00055b 38b0 .dw XT_DUP ; ( -- addr' len'' len'')
+00055c 3a2e .dw XT_1PLUS
+00055d 3ee1 .dw XT_TO_IN ; ( -- addr' len'' len'' >in)
+00055e 3a64 .dw XT_PLUSSTORE ; ( -- addr' len')
+00055f 3fe5 .dw XT_ONE
+000560 0571 .dw XT_SLASHSTRING
+000561 381f .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:
+000562 ff06 .dw $FF06
+000563 6f73
+000564 7275
+000565 6563 .db "source"
+000566 054e .dw VE_HEAD
+ .set VE_HEAD = VE_SOURCE
+ XT_SOURCE:
+000567 3dfe .dw PFA_DODEFER1
+ PFA_SOURCE:
+ .endif
+000568 0016 .dw USER_SOURCE
+000569 3dc7 .dw XT_UDEFERFETCH
+00056a 3dd3 .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:
+00056b ff07 .dw $ff07
+00056c 732f
+00056d 7274
+00056e 6e69
+00056f 0067 .db "/string",0
+000570 0562 .dw VE_HEAD
+ .set VE_HEAD = VE_SLASHSTRING
+ XT_SLASHSTRING:
+000571 3800 .dw DO_COLON
+ PFA_SLASHSTRING:
+ .endif
+000572 38e0 .dw XT_ROT
+000573 38ce .dw XT_OVER
+000574 399c .dw XT_PLUS
+000575 38e0 .dw XT_ROT
+000576 38e0 .dw XT_ROT
+000577 3992 .dw XT_MINUS
+000578 381f .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:
+000579 ff0a .dw $FF0A
+00057a 6170
+00057b 7372
+00057c 2d65
+00057d 616e
+00057e 656d .db "parse-name"
+00057f 056b .dw VE_HEAD
+ .set VE_HEAD = VE_PARSENAME
+ XT_PARSENAME:
+000580 3800 .dw DO_COLON
+ PFA_PARSENAME:
+ .endif
+000581 3f53 .dw XT_BL
+000582 0584 .dw XT_SKIPSCANCHAR
+000583 381f .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:
+000584 3800 .dw DO_COLON
+ PFA_SKIPSCANCHAR:
+ .endif
+000585 38fe .dw XT_TO_R
+000586 0567 .dw XT_SOURCE
+000587 3ee1 .dw XT_TO_IN
+000588 3878 .dw XT_FETCH
+000589 0571 .dw XT_SLASHSTRING
+
+00058a 3907 .dw XT_R_FETCH
+00058b 0426 .dw XT_CSKIP
+00058c 38f5 .dw XT_R_FROM
+00058d 043d .dw XT_CSCAN
+
+ ; adjust >IN
+00058e 3ec8 .dw XT_2DUP
+00058f 399c .dw XT_PLUS
+000590 0567 .dw XT_SOURCE
+000591 38d8 .dw XT_DROP
+000592 3992 .dw XT_MINUS
+000593 3ee1 .dw XT_TO_IN
+000594 3880 .dw XT_STORE
+000595 381f .dw XT_EXIT
+ .include "words/sp0.asm"
+
+ ; Stack
+ ; start address of the data stack
+ VE_SP0:
+000596 ff03 .dw $ff03
+000597 7073
+000598 0030 .db "sp0",0
+000599 0579 .dw VE_HEAD
+ .set VE_HEAD = VE_SP0
+ XT_SP0:
+00059a 386e .dw PFA_DOVALUE1
+ PFA_SP0:
+00059b 0006 .dw USER_SP0
+00059c 3dc7 .dw XT_UDEFERFETCH
+00059d 3dd3 .dw XT_UDEFERSTORE
+
+ ; ( -- addr)
+ ; Stack
+ ; address of user variable to store top-of-stack for inactive tasks
+ VE_SP:
+00059e ff02 .dw $ff02
+00059f 7073 .db "sp"
+0005a0 0596 .dw VE_HEAD
+ .set VE_HEAD = VE_SP
+ XT_SP:
+0005a1 3857 .dw PFA_DOUSER
+ PFA_SP:
+0005a2 0008 .dw USER_SP
+ .include "words/rp0.asm"
+
+ ; Stack
+ ; start address of return stack
+ VE_RP0:
+0005a3 ff03 .dw $ff03
+0005a4 7072
+0005a5 0030 .db "rp0",0
+0005a6 059e .dw VE_HEAD
+ .set VE_HEAD = VE_RP0
+ XT_RP0:
+0005a7 3800 .dw DO_COLON
+ PFA_RP0:
+0005a8 05ab .dw XT_DORP0
+0005a9 3878 .dw XT_FETCH
+0005aa 381f .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:
+0005ab 3857 .dw PFA_DOUSER
+ PFA_DORP0:
+0005ac 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:
+0005ad ff05 .dw $ff05
+0005ae 6564
+0005af 7470
+0005b0 0068 .db "depth",0
+0005b1 05a3 .dw VE_HEAD
+ .set VE_HEAD = VE_DEPTH
+ XT_DEPTH:
+0005b2 3800 .dw DO_COLON
+ PFA_DEPTH:
+ .endif
+0005b3 059a .dw XT_SP0
+0005b4 3a8c .dw XT_SP_FETCH
+0005b5 3992 .dw XT_MINUS
+0005b6 3a03 .dw XT_2SLASH
+0005b7 3a34 .dw XT_1MINUS
+0005b8 381f .dw XT_EXIT
+ .include "words/forth-recognizer.asm"
+
+ ; System Value
+ ; address of the next free data space (RAM) cell
+ VE_FORTHRECOGNIZER:
+0005b9 ff10 .dw $ff10
+0005ba 6f66
+0005bb 7472
+0005bc 2d68
+0005bd 6572
+0005be 6f63
+0005bf 6e67
+0005c0 7a69
+0005c1 7265 .db "forth-recognizer"
+0005c2 05ad .dw VE_HEAD
+ .set VE_HEAD = VE_FORTHRECOGNIZER
+ XT_FORTHRECOGNIZER:
+0005c3 386e .dw PFA_DOVALUE1
+ PFA_FORTHRECOGNIZER:
+0005c4 003e .dw CFG_FORTHRECOGNIZER
+0005c5 3d9f .dw XT_EDEFERFETCH
+0005c6 3da9 .dw XT_EDEFERSTORE
+ .include "words/recognize.asm"
+
+ ; System
+ ; walk the recognizer stack
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_RECOGNIZE:
+0005c7 ff09 .dw $ff09
+0005c8 6572
+0005c9 6f63
+0005ca 6e67
+0005cb 7a69
+0005cc 0065 .db "recognize",0
+0005cd 05b9 .dw VE_HEAD
+ .set VE_HEAD = VE_RECOGNIZE
+ XT_RECOGNIZE:
+0005ce 3800 .dw DO_COLON
+ PFA_RECOGNIZE:
+ .endif
+0005cf 383c .dw XT_DOLITERAL
+0005d0 05d9 .dw XT_RECOGNIZE_A
+0005d1 38c3 .dw XT_SWAP
+0005d2 096c .dw XT_MAPSTACK
+0005d3 3919 .dw XT_ZEROEQUAL
+0005d4 3835 .dw XT_DOCONDBRANCH
+0005d5 05d8 DEST(PFA_RECOGNIZE1)
+0005d6 3ed1 .dw XT_2DROP
+0005d7 065b .dw XT_DT_NULL
+ PFA_RECOGNIZE1:
+0005d8 381f .dw XT_EXIT
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ ; ( addr len XT -- addr len [ dt:xt -1 | 0 ] )
+ XT_RECOGNIZE_A:
+0005d9 3800 .dw DO_COLON
+ PFA_RECOGNIZE_A:
+ .endif
+0005da 38e0 .dw XT_ROT ; -- len xt addr
+0005db 38e0 .dw XT_ROT ; -- xt addr len
+0005dc 3ec8 .dw XT_2DUP
+0005dd 3b1d .dw XT_2TO_R
+0005de 38e0 .dw XT_ROT ; -- addr len xt
+0005df 3829 .dw XT_EXECUTE ; -- i*x dt:* | dt:null
+0005e0 3b2c .dw XT_2R_FROM
+0005e1 38e0 .dw XT_ROT
+0005e2 38b0 .dw XT_DUP
+0005e3 065b .dw XT_DT_NULL
+0005e4 3fde .dw XT_EQUAL
+0005e5 3835 .dw XT_DOCONDBRANCH
+0005e6 05ea DEST(PFA_RECOGNIZE_A1)
+0005e7 38d8 .dw XT_DROP
+0005e8 3953 .dw XT_ZERO
+0005e9 381f .dw XT_EXIT
+ PFA_RECOGNIZE_A1:
+0005ea 38ef .dw XT_NIP
+0005eb 38ef .dw XT_NIP
+0005ec 394a .dw XT_TRUE
+0005ed 381f .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:
+0005ee ff09 .dw $ff09
+0005ef 6e69
+0005f0 6574
+0005f1 7072
+0005f2 6572
+0005f3 0074 .db "interpret",0
+0005f4 05c7 .dw VE_HEAD
+ .set VE_HEAD = VE_INTERPRET
+ XT_INTERPRET:
+0005f5 3800 .dw DO_COLON
+ .endif
+ PFA_INTERPRET:
+0005f6 0580 .dw XT_PARSENAME ; ( -- addr len )
+0005f7 38b0 .dw XT_DUP ; ( -- addr len flag)
+0005f8 3835 .dw XT_DOCONDBRANCH
+0005f9 0606 DEST(PFA_INTERPRET2)
+0005fa 05c3 .dw XT_FORTHRECOGNIZER
+0005fb 05ce .dw XT_RECOGNIZE
+0005fc 3eb6 .dw XT_STATE
+0005fd 3878 .dw XT_FETCH
+0005fe 3835 .dw XT_DOCONDBRANCH
+0005ff 0601 DEST(PFA_INTERPRET1)
+000600 0185 .dw XT_ICELLPLUS ; we need the compile action
+ PFA_INTERPRET1:
+000601 3bca .dw XT_FETCHI
+000602 3829 .dw XT_EXECUTE
+000603 3f8a .dw XT_QSTACK
+000604 382e .dw XT_DOBRANCH
+000605 05f6 DEST(PFA_INTERPRET)
+ PFA_INTERPRET2:
+000606 3ed1 .dw XT_2DROP
+000607 381f .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:
+000608 ff06 .dw $ff06
+000609 7464
+00060a 6e3a
+00060b 6d75 .db "dt:num"
+00060c 05ee .dw VE_HEAD
+ .set VE_HEAD = VE_DT_NUM
+ XT_DT_NUM:
+00060d 3851 .dw PFA_DOCONSTANT
+ PFA_DT_NUM:
+ .endif
+00060e 0159 .dw XT_NOOP ; interpret
+00060f 0742 .dw XT_LITERAL ; compile
+000610 0742 .dw XT_LITERAL ; postpone
+
+ ; ( -- addr )
+ ; Interpreter
+ ; Method table for double cell integers
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_DT_DNUM:
+000611 ff07 .dw $ff07
+000612 7464
+000613 643a
+000614 756e
+000615 006d .db "dt:dnum",0
+000616 0608 .dw VE_HEAD
+ .set VE_HEAD = VE_DT_DNUM
+ XT_DT_DNUM:
+000617 3851 .dw PFA_DOCONSTANT
+ PFA_DT_DNUM:
+ .endif
+000618 0159 .dw XT_NOOP ; interpret
+000619 3fd6 .dw XT_2LITERAL ; compile
+00061a 3fd6 .dw XT_2LITERAL ; postpone
+
+ ; ( addr len -- f )
+ ; Interpreter
+ ; recognizer for integer numbers
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+
+ VE_REC_NUM:
+00061b ff07 .dw $ff07
+00061c 6572
+00061d 3a63
+00061e 756e
+00061f 006d .db "rec:num",0
+000620 0611 .dw VE_HEAD
+ .set VE_HEAD = VE_REC_NUM
+ XT_REC_NUM:
+000621 3800 .dw DO_COLON
+ PFA_REC_NUM:
+ .endif
+ ; try converting to a number
+000622 04c0 .dw XT_NUMBER
+000623 3835 .dw XT_DOCONDBRANCH
+000624 062d DEST(PFA_REC_NONUMBER)
+000625 3fe5 .dw XT_ONE
+000626 3fde .dw XT_EQUAL
+000627 3835 .dw XT_DOCONDBRANCH
+000628 062b DEST(PFA_REC_INTNUM2)
+000629 060d .dw XT_DT_NUM
+00062a 381f .dw XT_EXIT
+ PFA_REC_INTNUM2:
+00062b 0617 .dw XT_DT_DNUM
+00062c 381f .dw XT_EXIT
+ PFA_REC_NONUMBER:
+00062d 065b .dw XT_DT_NULL
+00062e 381f .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:
+00062f ff08 .dw $ff08
+000630 6572
+000631 3a63
+000632 6966
+000633 646e .db "rec:find"
+000634 061b .dw VE_HEAD
+ .set VE_HEAD = VE_REC_FIND
+ XT_REC_FIND:
+000635 3800 .dw DO_COLON
+ PFA_REC_FIND:
+ .endif
+000636 06d0 .DW XT_FINDXT
+000637 38b0 .dw XT_DUP
+000638 3919 .dw XT_ZEROEQUAL
+000639 3835 .dw XT_DOCONDBRANCH
+00063a 063e DEST(PFA_REC_WORD_FOUND)
+00063b 38d8 .dw XT_DROP
+00063c 065b .dw XT_DT_NULL
+00063d 381f .dw XT_EXIT
+ PFA_REC_WORD_FOUND:
+00063e 0645 .dw XT_DT_XT
+
+00063f 381f .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:
+000640 ff05 .dw $ff05
+000641 7464
+000642 783a
+000643 0074 .db "dt:xt",0
+000644 062f .dw VE_HEAD
+ .set VE_HEAD = VE_DT_XT
+ XT_DT_XT:
+000645 3851 .dw PFA_DOCONSTANT
+ PFA_DT_XT:
+ .endif
+000646 0649 .dw XT_R_WORD_INTERPRET
+000647 064d .dw XT_R_WORD_COMPILE
+000648 3fd6 .dw XT_2LITERAL
+
+ ; ( XT flags -- )
+ ; Interpreter
+ ; interpret method for WORD recognizer
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ XT_R_WORD_INTERPRET:
+000649 3800 .dw DO_COLON
+ PFA_R_WORD_INTERPRET:
+ .endif
+00064a 38d8 .dw XT_DROP ; the flags are in the way
+00064b 3829 .dw XT_EXECUTE
+00064c 381f .dw XT_EXIT
+
+ ; ( XT flags -- )
+ ; Interpreter
+ ; Compile method for WORD recognizer
+ .if cpu_msp430==1
+ .endif
+ .if cpu_avr8==1
+ XT_R_WORD_COMPILE:
+00064d 3800 .dw DO_COLON
+ PFA_R_WORD_COMPILE:
+ .endif
+00064e 3920 .dw XT_ZEROLESS
+00064f 3835 .dw XT_DOCONDBRANCH
+000650 0653 DEST(PFA_R_WORD_COMPILE1)
+000651 072c .dw XT_COMMA
+000652 381f .dw XT_EXIT
+ PFA_R_WORD_COMPILE1:
+000653 3829 .dw XT_EXECUTE
+000654 381f .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:
+000655 ff07 .dw $ff07
+000656 7464
+000657 6e3a
+000658 6c75
+../../common\words/dt-null.asm(12): warning: .cseg .db misalignment - padding zero byte
+000659 006c .db "dt:null"
+00065a 0640 .dw VE_HEAD
+ .set VE_HEAD = VE_DT_NULL
+ XT_DT_NULL:
+00065b 3851 .dw PFA_DOCONSTANT
+ PFA_DT_NULL:
+ .endif
+00065c 065f .dw XT_FAIL ; interpret
+00065d 065f .dw XT_FAIL ; compile
+00065e 065f .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:
+00065f 3800 .dw DO_COLON
+ PFA_FAIL:
+ .endif
+000660 383c .dw XT_DOLITERAL
+000661 fff3 .dw -13
+000662 3d85 .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:
+000663 ff0f .dw $ff0f
+000664 6573
+000665 7261
+000666 6863
+000667 772d
+000668 726f
+000669 6c64
+00066a 7369
+00066b 0074 .db "search-wordlist",0
+00066c 0655 .dw VE_HEAD
+ .set VE_HEAD = VE_SEARCH_WORDLIST
+ XT_SEARCH_WORDLIST:
+00066d 3800 .dw DO_COLON
+ PFA_SEARCH_WORDLIST:
+ .endif
+00066e 38fe .dw XT_TO_R
+00066f 3953 .dw XT_ZERO
+000670 383c .dw XT_DOLITERAL
+000671 0682 .dw XT_ISWORD
+000672 38f5 .dw XT_R_FROM
+000673 069f .dw XT_TRAVERSEWORDLIST
+000674 38b0 .dw XT_DUP
+000675 3919 .dw XT_ZEROEQUAL
+000676 3835 .dw XT_DOCONDBRANCH
+000677 067c DEST(PFA_SEARCH_WORDLIST1)
+000678 3ed1 .dw XT_2DROP
+000679 38d8 .dw XT_DROP
+00067a 3953 .dw XT_ZERO
+00067b 381f .dw XT_EXIT
+ PFA_SEARCH_WORDLIST1:
+ ; ... get the XT ...
+00067c 38b0 .dw XT_DUP
+00067d 06c6 .dw XT_NFA2CFA
+ ; .. and get the header flag
+00067e 38c3 .dw XT_SWAP
+00067f 0134 .dw XT_NAME2FLAGS
+000680 0122 .dw XT_IMMEDIATEQ
+000681 381f .dw XT_EXIT
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ XT_ISWORD:
+000682 3800 .dw DO_COLON
+ PFA_ISWORD:
+ .endif
+ ; ( c-addr len 0 nt -- c-addr len 0 true| nt false )
+000683 38fe .dw XT_TO_R
+000684 38d8 .dw XT_DROP
+000685 3ec8 .dw XT_2DUP
+000686 3907 .dw XT_R_FETCH ; -- addr len addr len nt
+000687 06ba .dw XT_NAME2STRING
+000688 018e .dw XT_ICOMPARE ; (-- addr len f )
+000689 3835 .dw XT_DOCONDBRANCH
+00068a 0690 DEST(PFA_ISWORD3)
+ ; not now
+00068b 38f5 .dw XT_R_FROM
+00068c 38d8 .dw XT_DROP
+00068d 3953 .dw XT_ZERO
+00068e 394a .dw XT_TRUE ; maybe next word
+00068f 381f .dw XT_EXIT
+ PFA_ISWORD3:
+ ; we found the word, now clean up iteration data ...
+000690 3ed1 .dw XT_2DROP
+000691 38f5 .dw XT_R_FROM
+000692 3953 .dw XT_ZERO ; finish traverse-wordlist
+000693 381f .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:
+000694 ff11 .dw $ff11
+000695 7274
+000696 7661
+000697 7265
+000698 6573
+000699 772d
+00069a 726f
+00069b 6c64
+00069c 7369
+00069d 0074 .db "traverse-wordlist",0
+00069e 0663 .dw VE_HEAD
+ .set VE_HEAD = VE_TRAVERSEWORDLIST
+ XT_TRAVERSEWORDLIST:
+00069f 3800 .dw DO_COLON
+ PFA_TRAVERSEWORDLIST:
+
+ .endif
+0006a0 3b5e .dw XT_FETCHE
+ PFA_TRAVERSEWORDLIST1:
+0006a1 38b0 .dw XT_DUP ; ( -- xt nt nt )
+0006a2 3835 .dw XT_DOCONDBRANCH ; ( -- nt ) is nfa = counted string
+0006a3 06b0 DEST(PFA_TRAVERSEWORDLIST2)
+0006a4 3ec8 .dw XT_2DUP
+0006a5 3b1d .dw XT_2TO_R
+0006a6 38c3 .dw XT_SWAP
+0006a7 3829 .dw XT_EXECUTE
+0006a8 3b2c .dw XT_2R_FROM
+0006a9 38e0 .dw XT_ROT
+0006aa 3835 .dw XT_DOCONDBRANCH
+0006ab 06b0 DEST(PFA_TRAVERSEWORDLIST2)
+0006ac 09db .dw XT_NFA2LFA
+0006ad 3bca .dw XT_FETCHI
+0006ae 382e .dw XT_DOBRANCH ; ( -- addr )
+0006af 06a1 DEST(PFA_TRAVERSEWORDLIST1) ; ( -- addr )
+ PFA_TRAVERSEWORDLIST2:
+0006b0 3ed1 .dw XT_2DROP
+0006b1 381f .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:
+0006b2 ff0b .dw $ff0b
+0006b3 616e
+0006b4 656d
+0006b5 733e
+0006b6 7274
+0006b7 6e69
+0006b8 0067 .db "name>string",0
+0006b9 0694 .dw VE_HEAD
+ .set VE_HEAD = VE_NAME2STRING
+ XT_NAME2STRING:
+0006ba 3800 .dw DO_COLON
+ PFA_NAME2STRING:
+
+ .endif
+0006bb 03f4 .dw XT_ICOUNT ; ( -- addr n )
+0006bc 383c .dw XT_DOLITERAL
+0006bd 00ff .dw 255
+0006be 3a12 .dw XT_AND ; mask immediate bit
+0006bf 381f .dw XT_EXIT
+ .include "words/nfa2cfa.asm"
+
+ ; Tools
+ ; get the XT from a name token
+ VE_NFA2CFA:
+0006c0 ff07 .dw $ff07
+0006c1 666e
+0006c2 3e61
+0006c3 6663
+../../avr8\words/nfa2cfa.asm(6): warning: .cseg .db misalignment - padding zero byte
+0006c4 0061 .db "nfa>cfa"
+0006c5 06b2 .dw VE_HEAD
+ .set VE_HEAD = VE_NFA2CFA
+ XT_NFA2CFA:
+0006c6 3800 .dw DO_COLON
+ PFA_NFA2CFA:
+0006c7 09db .dw XT_NFA2LFA ; skip to link field
+0006c8 3a2e .dw XT_1PLUS ; next is the execution token
+0006c9 381f .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:
+0006ca ff07 .dw $ff07
+0006cb 6966
+0006cc 646e
+0006cd 782d
+0006ce 0074 .db "find-xt",0
+0006cf 06c0 .dw VE_HEAD
+ .set VE_HEAD = VE_FINDXT
+ XT_FINDXT:
+0006d0 3800 .dw DO_COLON
+ PFA_FINDXT:
+ .endif
+0006d1 383c .dw XT_DOLITERAL
+0006d2 06dc .dw XT_FINDXTA
+0006d3 383c .dw XT_DOLITERAL
+0006d4 004a .dw CFG_ORDERLISTLEN
+0006d5 096c .dw XT_MAPSTACK
+0006d6 3919 .dw XT_ZEROEQUAL
+0006d7 3835 .dw XT_DOCONDBRANCH
+0006d8 06db DEST(PFA_FINDXT1)
+0006d9 3ed1 .dw XT_2DROP
+0006da 3953 .dw XT_ZERO
+ PFA_FINDXT1:
+0006db 381f .dw XT_EXIT
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+
+ XT_FINDXTA:
+0006dc 3800 .dw DO_COLON
+ PFA_FINDXTA:
+ .endif
+0006dd 38fe .dw XT_TO_R
+0006de 3ec8 .dw XT_2DUP
+0006df 38f5 .dw XT_R_FROM
+0006e0 066d .dw XT_SEARCH_WORDLIST
+0006e1 38b0 .dw XT_DUP
+0006e2 3835 .dw XT_DOCONDBRANCH
+0006e3 06e9 DEST(PFA_FINDXTA1)
+0006e4 38fe .dw XT_TO_R
+0006e5 38ef .dw XT_NIP
+0006e6 38ef .dw XT_NIP
+0006e7 38f5 .dw XT_R_FROM
+0006e8 394a .dw XT_TRUE
+ PFA_FINDXTA1:
+0006e9 381f .dw XT_EXIT
+
+ .include "dict/compiler1.inc"
+
+ .include "words/newest.asm"
+
+ ; System Variable
+ ; system state
+ VE_NEWEST:
+0006ea ff06 .dw $ff06
+0006eb 656e
+0006ec 6577
+0006ed 7473 .db "newest"
+0006ee 06ca .dw VE_HEAD
+ .set VE_HEAD = VE_NEWEST
+ XT_NEWEST:
+0006ef 3847 .dw PFA_DOVARIABLE
+ PFA_NEWEST:
+0006f0 018a .dw ram_newest
+
+ .dseg
+00018a ram_newest: .byte 4
+ .include "words/latest.asm"
+
+ ; System Variable
+ ; system state
+ VE_LATEST:
+0006f1 ff06 .dw $ff06
+0006f2 616c
+0006f3 6574
+0006f4 7473 .db "latest"
+0006f5 06ea .dw VE_HEAD
+ .set VE_HEAD = VE_LATEST
+ XT_LATEST:
+0006f6 3847 .dw PFA_DOVARIABLE
+ PFA_LATEST:
+0006f7 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:
+0006f8 ff08 .dw $ff08
+0006f9 6328
+0006fa 6572
+0006fb 7461
+0006fc 2965 .db "(create)"
+0006fd 06f1 .dw VE_HEAD
+ .set VE_HEAD = VE_DOCREATE
+ XT_DOCREATE:
+0006fe 3800 .dw DO_COLON
+ PFA_DOCREATE:
+ .endif
+0006ff 0580
+000700 0855 .DW XT_PARSENAME,XT_WLSCOPE ; ( -- addr len wid)
+000701 38b0
+000702 06ef
+000703 3c8f
+000704 3880 .DW XT_DUP,XT_NEWEST,XT_CELLPLUS,XT_STORE ; save the wid
+000705 083a
+000706 06ef
+000707 3880 .DW XT_HEADER,XT_NEWEST,XT_STORE ; save the nt
+000708 381f .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:
+000709 0001 .dw $0001
+00070a 005c .db $5c,0
+00070b 06f8 .dw VE_HEAD
+ .set VE_HEAD = VE_BACKSLASH
+ XT_BACKSLASH:
+00070c 3800 .dw DO_COLON
+ PFA_BACKSLASH:
+ .endif
+00070d 0567 .dw XT_SOURCE
+00070e 38ef .dw XT_NIP
+00070f 3ee1 .dw XT_TO_IN
+000710 3880 .dw XT_STORE
+000711 381f .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:
+000712 0001 .dw $0001
+000713 0028 .db "(" ,0
+000714 0709 .dw VE_HEAD
+ .set VE_HEAD = VE_LPAREN
+ XT_LPAREN:
+000715 3800 .dw DO_COLON
+ PFA_LPAREN:
+ .endif
+000716 383c .dw XT_DOLITERAL
+000717 0029 .dw ')'
+000718 0553 .dw XT_PARSE
+000719 3ed1 .dw XT_2DROP
+00071a 381f .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:
+00071b ff07 .dw $ff07
+00071c 6f63
+00071d 706d
+00071e 6c69
+00071f 0065 .db "compile",0
+000720 0712 .dw VE_HEAD
+ .set VE_HEAD = VE_COMPILE
+ XT_COMPILE:
+000721 3800 .dw DO_COLON
+ PFA_COMPILE:
+ .endif
+000722 38f5 .dw XT_R_FROM
+000723 38b0 .dw XT_DUP
+000724 0185 .dw XT_ICELLPLUS
+000725 38fe .dw XT_TO_R
+000726 3bca .dw XT_FETCHI
+000727 072c .dw XT_COMMA
+000728 381f .dw XT_EXIT
+ .include "words/comma.asm"
+
+ ; Dictionary
+ ; compile 16 bit into flash at DP
+ VE_COMMA:
+000729 ff01 .dw $ff01
+00072a 002c .db ',',0 ; ,
+00072b 071b .dw VE_HEAD
+ .set VE_HEAD = VE_COMMA
+ XT_COMMA:
+00072c 3800 .dw DO_COLON
+ PFA_COMMA:
+00072d 3f11 .dw XT_DP
+00072e 3b72 .dw XT_STOREI
+00072f 3f11 .dw XT_DP
+000730 3a2e .dw XT_1PLUS
+000731 0173 .dw XT_DOTO
+000732 3f12 .dw PFA_DP
+000733 381f .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:
+000734 0003 .dw $0003
+000735 275b
+000736 005d .db "[']",0
+000737 0729 .dw VE_HEAD
+ .set VE_HEAD = VE_BRACKETTICK
+ XT_BRACKETTICK:
+000738 3800 .dw DO_COLON
+ PFA_BRACKETTICK:
+ .endif
+000739 040d .dw XT_TICK
+00073a 0742 .dw XT_LITERAL
+00073b 381f .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:
+00073c 0007 .dw $0007
+00073d 696c
+00073e 6574
+00073f 6172
+000740 006c .db "literal",0
+000741 0734 .dw VE_HEAD
+ .set VE_HEAD = VE_LITERAL
+ XT_LITERAL:
+000742 3800 .dw DO_COLON
+ PFA_LITERAL:
+ .endif
+000743 0721 .DW XT_COMPILE
+000744 383c .DW XT_DOLITERAL
+000745 072c .DW XT_COMMA
+000746 381f .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:
+000747 0008 .dw $0008
+000748 6c73
+000749 7469
+00074a 7265
+00074b 6c61 .db "sliteral"
+00074c 073c .dw VE_HEAD
+ .set VE_HEAD = VE_SLITERAL
+ XT_SLITERAL:
+00074d 3800 .dw DO_COLON
+ PFA_SLITERAL:
+ .endif
+00074e 0721 .dw XT_COMPILE
+00074f 0395 .dw XT_DOSLITERAL ; ( -- addr n)
+000750 03a3 .dw XT_SCOMMA
+000751 381f .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:
+000752 3800 .dw DO_COLON
+ PFA_GMARK:
+000753 3f11 .dw XT_DP
+000754 0721 .dw XT_COMPILE
+000755 ffff .dw -1 ; ffff does not erase flash
+000756 381f .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:
+000757 3800 .dw DO_COLON
+ PFA_GRESOLVE:
+000758 3f8a .dw XT_QSTACK
+000759 3f11 .dw XT_DP
+00075a 38c3 .dw XT_SWAP
+00075b 3b72 .dw XT_STOREI
+00075c 381f .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:
+00075d 3800 .dw DO_COLON
+ PFA_LMARK:
+00075e 3f11 .dw XT_DP
+00075f 381f .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:
+000760 3800 .dw DO_COLON
+ PFA_LRESOLVE:
+000761 3f8a .dw XT_QSTACK
+000762 072c .dw XT_COMMA
+000763 381f .dw XT_EXIT
+
+ .include "words/ahead.asm"
+
+ ; Compiler
+ ; do a unconditional branch
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_AHEAD:
+000764 0005 .dw $0005
+000765 6861
+000766 6165
+000767 0064 .db "ahead",0
+000768 0747 .dw VE_HEAD
+ .set VE_HEAD = VE_AHEAD
+ XT_AHEAD:
+000769 3800 .dw DO_COLON
+ PFA_AHEAD:
+ .endif
+00076a 0721 .dw XT_COMPILE
+00076b 382e .dw XT_DOBRANCH
+00076c 0752 .dw XT_GMARK
+00076d 381f .dw XT_EXIT
+ .include "words/if.asm"
+
+ ; Compiler
+ ; start conditional branch
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_IF:
+00076e 0002 .dw $0002
+00076f 6669 .db "if"
+000770 0764 .dw VE_HEAD
+ .set VE_HEAD = VE_IF
+ XT_IF:
+000771 3800 .dw DO_COLON
+ PFA_IF:
+ .endif
+000772 0721 .dw XT_COMPILE
+000773 3835 .dw XT_DOCONDBRANCH
+000774 0752 .dw XT_GMARK
+000775 381f .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:
+000776 0004 .dw $0004
+000777 6c65
+000778 6573 .db "else"
+000779 076e .dw VE_HEAD
+ .set VE_HEAD = VE_ELSE
+ XT_ELSE:
+00077a 3800 .dw DO_COLON
+ PFA_ELSE:
+ .endif
+00077b 0721 .dw XT_COMPILE
+00077c 382e .dw XT_DOBRANCH
+00077d 0752 .dw XT_GMARK
+00077e 38c3 .dw XT_SWAP
+00077f 0757 .dw XT_GRESOLVE
+000780 381f .dw XT_EXIT
+ .include "words/then.asm"
+
+ ; Compiler
+ ; finish if
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_THEN:
+000781 0004 .dw $0004
+000782 6874
+000783 6e65 .db "then"
+000784 0776 .dw VE_HEAD
+ .set VE_HEAD = VE_THEN
+ XT_THEN:
+000785 3800 .dw DO_COLON
+ PFA_THEN:
+ .endif
+000786 0757 .dw XT_GRESOLVE
+000787 381f .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:
+000788 0005 .dw $0005
+000789 6562
+00078a 6967
+00078b 006e .db "begin",0
+00078c 0781 .dw VE_HEAD
+ .set VE_HEAD = VE_BEGIN
+ XT_BEGIN:
+00078d 3800 .dw DO_COLON
+ PFA_BEGIN:
+ .endif
+00078e 075d .dw XT_LMARK
+00078f 381f .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:
+000790 0005 .dw $0005
+000791 6877
+000792 6c69
+000793 0065 .db "while",0
+000794 0788 .dw VE_HEAD
+ .set VE_HEAD = VE_WHILE
+ XT_WHILE:
+000795 3800 .dw DO_COLON
+ PFA_WHILE:
+ .endif
+000796 0771 .dw XT_IF
+000797 38c3 .dw XT_SWAP
+000798 381f .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:
+000799 0006 .dw $0006
+00079a 6572
+00079b 6570
+00079c 7461 .db "repeat"
+00079d 0790 .dw VE_HEAD
+ .set VE_HEAD = VE_REPEAT
+ XT_REPEAT:
+00079e 3800 .dw DO_COLON
+ PFA_REPEAT:
+ .endif
+00079f 07b2 .dw XT_AGAIN
+0007a0 0785 .dw XT_THEN
+0007a1 381f .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:
+0007a2 0005 .dw $0005
+0007a3 6e75
+0007a4 6974
+0007a5 006c .db "until",0
+0007a6 0799 .dw VE_HEAD
+ .set VE_HEAD = VE_UNTIL
+ XT_UNTIL:
+0007a7 3800 .dw DO_COLON
+ PFA_UNTIL:
+ .endif
+0007a8 383c .dw XT_DOLITERAL
+0007a9 3835 .dw XT_DOCONDBRANCH
+0007aa 072c .dw XT_COMMA
+
+0007ab 0760 .dw XT_LRESOLVE
+0007ac 381f .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:
+0007ad 0005 .dw $0005
+0007ae 6761
+0007af 6961
+0007b0 006e .db "again",0
+0007b1 07a2 .dw VE_HEAD
+ .set VE_HEAD = VE_AGAIN
+ XT_AGAIN:
+0007b2 3800 .dw DO_COLON
+ PFA_AGAIN:
+ .endif
+0007b3 0721 .dw XT_COMPILE
+0007b4 382e .dw XT_DOBRANCH
+0007b5 0760 .dw XT_LRESOLVE
+0007b6 381f .dw XT_EXIT
+ .include "words/do.asm"
+
+ ; Compiler
+ ; start do .. [+]loop
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_DO:
+0007b7 0002 .dw $0002
+0007b8 6f64 .db "do"
+0007b9 07ad .dw VE_HEAD
+ .set VE_HEAD = VE_DO
+ XT_DO:
+0007ba 3800 .dw DO_COLON
+ PFA_DO:
+
+ .endif
+0007bb 0721 .dw XT_COMPILE
+0007bc 3a9a .dw XT_DODO
+0007bd 075d .dw XT_LMARK
+0007be 3953 .dw XT_ZERO
+0007bf 0815 .dw XT_TO_L
+0007c0 381f .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:
+0007c1 0004 .dw $0004
+0007c2 6f6c
+0007c3 706f .db "loop"
+0007c4 07b7 .dw VE_HEAD
+ .set VE_HEAD = VE_LOOP
+ XT_LOOP:
+0007c5 3800 .dw DO_COLON
+ PFA_LOOP:
+ .endif
+0007c6 0721 .dw XT_COMPILE
+0007c7 3ac8 .dw XT_DOLOOP
+0007c8 07fc .dw XT_ENDLOOP
+0007c9 381f .dw XT_EXIT
+ .include "words/plusloop.asm"
+
+ ; Compiler
+ ; compile (+loop) and resolve branches
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_PLUSLOOP:
+0007ca 0005 .dw $0005
+0007cb 6c2b
+0007cc 6f6f
+0007cd 0070 .db "+loop",0
+0007ce 07c1 .dw VE_HEAD
+ .set VE_HEAD = VE_PLUSLOOP
+ XT_PLUSLOOP:
+0007cf 3800 .dw DO_COLON
+ PFA_PLUSLOOP:
+ .endif
+0007d0 0721 .dw XT_COMPILE
+0007d1 3ab9 .dw XT_DOPLUSLOOP
+0007d2 07fc .dw XT_ENDLOOP
+0007d3 381f .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:
+0007d4 0005 .dw $0005
+0007d5 656c
+0007d6 7661
+0007d7 0065 .db "leave",0
+0007d8 07ca .dw VE_HEAD
+ .set VE_HEAD = VE_LEAVE
+ XT_LEAVE:
+0007d9 3800 .dw DO_COLON
+ PFA_LEAVE:
+ .endif
+0007da 0721
+0007db 3ad3 .DW XT_COMPILE,XT_UNLOOP
+0007dc 0769
+0007dd 0815
+0007de 381f .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:
+0007df 0003 .dw $0003
+0007e0 643f
+0007e1 006f .db "?do",0
+0007e2 07d4 .dw VE_HEAD
+ .set VE_HEAD = VE_QDO
+ XT_QDO:
+0007e3 3800 .dw DO_COLON
+ PFA_QDO:
+ .endif
+0007e4 0721 .dw XT_COMPILE
+0007e5 07eb .dw XT_QDOCHECK
+0007e6 0771 .dw XT_IF
+0007e7 07ba .dw XT_DO
+0007e8 38c3 .dw XT_SWAP ; DO sets a 0 marker on the leave stack
+0007e9 0815 .dw XT_TO_L ; then follows at the end.
+0007ea 381f .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:
+0007eb 3800 .dw DO_COLON
+ PFA_QDOCHECK:
+ .endif
+0007ec 3ec8 .dw XT_2DUP
+0007ed 3fde .dw XT_EQUAL
+0007ee 38b0 .dw XT_DUP
+0007ef 38fe .dw XT_TO_R
+0007f0 3835 .dw XT_DOCONDBRANCH
+0007f1 07f3 DEST(PFA_QDOCHECK1)
+0007f2 3ed1 .dw XT_2DROP
+ PFA_QDOCHECK1:
+0007f3 38f5 .dw XT_R_FROM
+0007f4 39fc .dw XT_INVERT
+0007f5 381f .dw XT_EXIT
+ .include "words/endloop.asm"
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_ENDLOOP:
+0007f6 ff07 .dw $ff07
+0007f7 6e65
+0007f8 6c64
+0007f9 6f6f
+0007fa 0070 .db "endloop",0
+0007fb 07df .dw VE_HEAD
+ .set VE_HEAD = VE_ENDLOOP
+ XT_ENDLOOP:
+0007fc 3800 .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.
+
+0007fd 0760 .DW XT_LRESOLVE
+0007fe 0809
+0007ff 38b8
+000800 3835 LOOP1: .DW XT_L_FROM,XT_QDUP,XT_DOCONDBRANCH
+000801 0805 DEST(LOOP2)
+000802 0785 .DW XT_THEN
+000803 382e .dw XT_DOBRANCH
+000804 07fe DEST(LOOP1)
+000805 381f LOOP2: .DW XT_EXIT
+ ; leave address stack
+ .include "words/l-from.asm"
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_L_FROM:
+000806 ff02 .dw $ff02
+000807 3e6c .db "l>"
+000808 07f6 .dw VE_HEAD
+ .set VE_HEAD = VE_L_FROM
+ XT_L_FROM:
+000809 3800 .dw DO_COLON
+ PFA_L_FROM:
+
+ .endif
+ ;Z L> -- x L: x -- move from leave stack
+ ; LP @ @ -2 LP +! ;
+
+00080a 0828 .dw XT_LP
+00080b 3878 .dw XT_FETCH
+00080c 3878 .dw XT_FETCH
+00080d 383c .dw XT_DOLITERAL
+00080e fffe .dw -2
+00080f 0828 .dw XT_LP
+000810 3a64 .dw XT_PLUSSTORE
+000811 381f .dw XT_EXIT
+ .include "words/to-l.asm"
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_TO_L:
+000812 ff02 .dw $ff02
+000813 6c3e .db ">l"
+000814 0806 .dw VE_HEAD
+ .set VE_HEAD = VE_TO_L
+ XT_TO_L:
+000815 3800 .dw DO_COLON
+ PFA_TO_L:
+ .endif
+ ;Z >L x -- L: -- x move to leave stack
+ ; CELL LP +! LP @ ! ; (L stack grows up)
+
+000816 3fea .dw XT_TWO
+000817 0828 .dw XT_LP
+000818 3a64 .dw XT_PLUSSTORE
+000819 0828 .dw XT_LP
+00081a 3878 .dw XT_FETCH
+00081b 3880 .dw XT_STORE
+00081c 381f .dw XT_EXIT
+ .include "words/lp0.asm"
+
+ ; Stack
+ ; start address of leave stack
+ VE_LP0:
+00081d ff03 .dw $ff03
+00081e 706c
+00081f 0030 .db "lp0",0
+000820 0812 .dw VE_HEAD
+ .set VE_HEAD = VE_LP0
+ XT_LP0:
+000821 386e .dw PFA_DOVALUE1
+ PFA_LP0:
+000822 0040 .dw CFG_LP0
+000823 3d9f .dw XT_EDEFERFETCH
+000824 3da9 .dw XT_EDEFERSTORE
+ .include "words/lp.asm"
+
+ ; System Variable
+ ; leave stack pointer
+ VE_LP:
+000825 ff02 .dw $ff02
+000826 706c .db "lp"
+000827 081d .dw VE_HEAD
+ .set VE_HEAD = VE_LP
+ XT_LP:
+000828 3847 .dw PFA_DOVARIABLE
+ PFA_LP:
+000829 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:
+00082a ff06 .dw $ff06
+00082b 7263
+00082c 6165
+00082d 6574 .db "create"
+00082e 0825 .dw VE_HEAD
+ .set VE_HEAD = VE_CREATE
+ XT_CREATE:
+00082f 3800 .dw DO_COLON
+ PFA_CREATE:
+ .endif
+000830 06fe .dw XT_DOCREATE
+000831 085e .dw XT_REVEAL
+000832 0721 .dw XT_COMPILE
+000833 3851 .dw PFA_DOCONSTANT
+000834 381f .dw XT_EXIT
+ .include "words/header.asm"
+
+ ; Compiler
+ ; creates the vocabulary header without XT and data field (PF) in the wordlist wid
+ VE_HEADER:
+000835 ff06 .dw $ff06
+000836 6568
+000837 6461
+000838 7265 .db "header"
+000839 082a .dw VE_HEAD
+ .set VE_HEAD = VE_HEADER
+ XT_HEADER:
+00083a 3800 .dw DO_COLON
+ PFA_HEADER:
+00083b 3f11 .dw XT_DP ; the new Name Field
+00083c 38fe .dw XT_TO_R
+00083d 38fe .dw XT_TO_R ; ( R: NFA WID )
+00083e 38b0 .dw XT_DUP
+00083f 3927 .dw XT_GREATERZERO
+000840 3835 .dw XT_DOCONDBRANCH
+000841 084c .dw PFA_HEADER1
+000842 38b0 .dw XT_DUP
+000843 383c .dw XT_DOLITERAL
+000844 ff00 .dw $ff00 ; all flags are off (e.g. immediate)
+000845 3a1b .dw XT_OR
+000846 03a7 .dw XT_DOSCOMMA
+ ; make the link to the previous entry in this wordlist
+000847 38f5 .dw XT_R_FROM
+000848 3b5e .dw XT_FETCHE
+000849 072c .dw XT_COMMA
+00084a 38f5 .dw XT_R_FROM
+00084b 381f .dw XT_EXIT
+
+ PFA_HEADER1:
+ ; -16: attempt to use zero length string as a name
+00084c 383c .dw XT_DOLITERAL
+00084d fff0 .dw -16
+00084e 3d85 .dw XT_THROW
+
+ .include "words/wlscope.asm"
+
+ ; Compiler
+ ; dynamically place a word in a wordlist. The word name may be changed.
+ VE_WLSCOPE:
+00084f ff07 .dw $ff07
+000850 6c77
+000851 6373
+000852 706f
+000853 0065 .db "wlscope",0
+000854 0835 .dw VE_HEAD
+ .set VE_HEAD = VE_WLSCOPE
+ XT_WLSCOPE:
+000855 3dfe .dw PFA_DODEFER1
+ PFA_WLSCOPE:
+000856 003c .dw CFG_WLSCOPE
+000857 3d9f .dw XT_EDEFERFETCH
+000858 3da9 .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:
+000859 ff06 .dw $ff06
+00085a 6572
+00085b 6576
+00085c 6c61 .db "reveal"
+00085d 084f .dw VE_HEAD
+ .set VE_HEAD = VE_REVEAL
+ XT_REVEAL:
+00085e 3800 .dw DO_COLON
+ PFA_REVEAL:
+ .endif
+00085f 06ef
+000860 3c8f
+000861 3878 .DW XT_NEWEST,XT_CELLPLUS,XT_FETCH ; only if wordlist is in use
+000862 38b8
+000863 3835 .DW XT_QDUP,XT_DOCONDBRANCH
+000864 0869 DEST(REVEAL1)
+000865 06ef
+000866 3878
+000867 38c3
+000868 3b3a .DW XT_NEWEST,XT_FETCH,XT_SWAP,XT_STOREE
+ ; .DW XT_ZERO,XT_NEWEST,XT_CELLPLUS,XT_STORE ; clean wordlist entry
+ REVEAL1:
+000869 381f .DW XT_EXIT
+ .include "words/does.asm"
+
+ ; Compiler
+ ; organize the XT replacement to call other colon code
+ VE_DOES:
+00086a 0005 .dw $0005
+00086b 6f64
+00086c 7365
+00086d 003e .db "does>",0
+00086e 0859 .dw VE_HEAD
+ .set VE_HEAD = VE_DOES
+ XT_DOES:
+00086f 3800 .dw DO_COLON
+ PFA_DOES:
+000870 0721 .dw XT_COMPILE
+000871 0882 .dw XT_DODOES
+000872 0721 .dw XT_COMPILE ; create a code snippet to be used in an embedded XT
+000873 940e .dw $940e ; the address of this compiled
+000874 0721 .dw XT_COMPILE ; code will replace the XT of the
+000875 0877 .dw DO_DODOES ; word that CREATE created
+000876 381f .dw XT_EXIT ;
+
+ DO_DODOES: ; ( -- PFA )
+000877 939a
+000878 938a savetos
+000879 01cb movw tosl, wl
+00087a 9601 adiw tosl, 1
+ ; the following takes the address from a real uC-call
+ .if (pclen==3)
+ .endif
+00087b 917f pop wh
+00087c 916f pop wl
+
+00087d 93bf push XH
+00087e 93af push XL
+00087f 01db movw XL, wl
+000880 940c 3804 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:
+000882 3800 .dw DO_COLON
+ PFA_DODOES:
+000883 38f5 .dw XT_R_FROM
+000884 06ef .dw XT_NEWEST
+000885 3c8f .dw XT_CELLPLUS
+000886 3878 .dw XT_FETCH
+000887 3b5e .dw XT_FETCHE
+000888 06c6 .dw XT_NFA2CFA
+000889 3b72 .dw XT_STOREI
+00088a 381f .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:
+00088b ff01 .dw $ff01
+00088c 003a .db ":",0
+00088d 086a .dw VE_HEAD
+ .set VE_HEAD = VE_COLON
+ XT_COLON:
+00088e 3800 .dw DO_COLON
+ PFA_COLON:
+ .endif
+00088f 06fe .dw XT_DOCREATE
+000890 0899 .dw XT_COLONNONAME
+000891 38d8 .dw XT_DROP
+000892 381f .dw XT_EXIT
+ .include "words/colon-noname.asm"
+
+ ; Compiler
+ ; create an unnamed entry in the dictionary, XT is DO_COLON
+ VE_COLONNONAME:
+000893 ff07 .dw $ff07
+000894 6e3a
+000895 6e6f
+000896 6d61
+000897 0065 .db ":noname",0
+000898 088b .dw VE_HEAD
+ .set VE_HEAD = VE_COLONNONAME
+ XT_COLONNONAME:
+000899 3800 .dw DO_COLON
+ PFA_COLONNONAME:
+00089a 3f11 .dw XT_DP
+00089b 38b0 .dw XT_DUP
+00089c 06f6 .dw XT_LATEST
+00089d 3880 .dw XT_STORE
+
+00089e 0721 .dw XT_COMPILE
+00089f 3800 .dw DO_COLON
+
+0008a0 08ae .dw XT_RBRACKET
+0008a1 381f .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:
+0008a2 0001 .dw $0001
+0008a3 003b .db $3b,0
+0008a4 0893 .dw VE_HEAD
+ .set VE_HEAD = VE_SEMICOLON
+ XT_SEMICOLON:
+0008a5 3800 .dw DO_COLON
+ PFA_SEMICOLON:
+ .endif
+0008a6 0721 .dw XT_COMPILE
+0008a7 381f .dw XT_EXIT
+0008a8 08b6 .dw XT_LBRACKET
+0008a9 085e .dw XT_REVEAL
+0008aa 381f .dw XT_EXIT
+ .include "words/right-bracket.asm"
+
+ ; Compiler
+ ; enter compiler mode
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_RBRACKET:
+0008ab ff01 .dw $ff01
+0008ac 005d .db "]",0
+0008ad 08a2 .dw VE_HEAD
+ .set VE_HEAD = VE_RBRACKET
+ XT_RBRACKET:
+0008ae 3800 .dw DO_COLON
+ PFA_RBRACKET:
+ .endif
+0008af 3fe5 .dw XT_ONE
+0008b0 3eb6 .dw XT_STATE
+0008b1 3880 .dw XT_STORE
+0008b2 381f .dw XT_EXIT
+ .include "words/left-bracket.asm"
+
+ ; Compiler
+ ; enter interpreter mode
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_LBRACKET:
+0008b3 0001 .dw $0001
+0008b4 005b .db "[",0
+0008b5 08ab .dw VE_HEAD
+ .set VE_HEAD = VE_LBRACKET
+ XT_LBRACKET:
+0008b6 3800 .dw DO_COLON
+ PFA_LBRACKET:
+ .endif
+0008b7 3953 .dw XT_ZERO
+0008b8 3eb6 .dw XT_STATE
+0008b9 3880 .dw XT_STORE
+0008ba 381f .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:
+0008bb ff08 .dw $ff08
+0008bc 6176
+0008bd 6972
+0008be 6261
+0008bf 656c .db "variable"
+0008c0 08b3 .dw VE_HEAD
+ .set VE_HEAD = VE_VARIABLE
+ XT_VARIABLE:
+0008c1 3800 .dw DO_COLON
+ PFA_VARIABLE:
+ .endif
+0008c2 3f22 .dw XT_HERE
+0008c3 08cd .dw XT_CONSTANT
+0008c4 3fea .dw XT_TWO
+0008c5 3f2b .dw XT_ALLOT
+0008c6 381f .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:
+0008c7 ff08 .dw $ff08
+0008c8 6f63
+0008c9 736e
+0008ca 6174
+0008cb 746e .db "constant"
+0008cc 08bb .dw VE_HEAD
+ .set VE_HEAD = VE_CONSTANT
+ XT_CONSTANT:
+0008cd 3800 .dw DO_COLON
+ PFA_CONSTANT:
+ .endif
+0008ce 06fe .dw XT_DOCREATE
+0008cf 085e .dw XT_REVEAL
+0008d0 0721 .dw XT_COMPILE
+0008d1 3847 .dw PFA_DOVARIABLE
+0008d2 072c .dw XT_COMMA
+0008d3 381f .dw XT_EXIT
+ .include "words/user.asm"
+
+ ; Compiler
+ ; create a dictionary entry for a user variable at offset n
+ VE_USER:
+0008d4 ff04 .dw $ff04
+0008d5 7375
+0008d6 7265 .db "user"
+0008d7 08c7 .dw VE_HEAD
+ .set VE_HEAD = VE_USER
+ XT_USER:
+0008d8 3800 .dw DO_COLON
+ PFA_USER:
+0008d9 06fe .dw XT_DOCREATE
+0008da 085e .dw XT_REVEAL
+
+0008db 0721 .dw XT_COMPILE
+0008dc 3857 .dw PFA_DOUSER
+0008dd 072c .dw XT_COMMA
+0008de 381f .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:
+0008df 0007 .dw $0007
+0008e0 6572
+0008e1 7563
+0008e2 7372
+0008e3 0065 .db "recurse",0
+0008e4 08d4 .dw VE_HEAD
+ .set VE_HEAD = VE_RECURSE
+ XT_RECURSE:
+0008e5 3800 .dw DO_COLON
+ PFA_RECURSE:
+ .endif
+0008e6 06f6 .dw XT_LATEST
+0008e7 3878 .dw XT_FETCH
+0008e8 072c .dw XT_COMMA
+0008e9 381f .dw XT_EXIT
+ .include "words/immediate.asm"
+
+ ; Compiler
+ ; set immediate flag for the most recent word definition
+ VE_IMMEDIATE:
+0008ea ff09 .dw $ff09
+0008eb 6d69
+0008ec 656d
+0008ed 6964
+0008ee 7461
+0008ef 0065 .db "immediate",0
+0008f0 08df .dw VE_HEAD
+ .set VE_HEAD = VE_IMMEDIATE
+ XT_IMMEDIATE:
+0008f1 3800 .dw DO_COLON
+ PFA_IMMEDIATE:
+0008f2 0993 .dw XT_GET_CURRENT
+0008f3 3b5e .dw XT_FETCHE
+0008f4 38b0 .dw XT_DUP
+0008f5 3bca .dw XT_FETCHI
+0008f6 383c .dw XT_DOLITERAL
+0008f7 7fff .dw $7fff
+0008f8 3a12 .dw XT_AND
+0008f9 38c3 .dw XT_SWAP
+0008fa 3b72 .dw XT_STOREI
+0008fb 381f .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:
+0008fc 0006 .dw $0006
+0008fd 635b
+0008fe 6168
+0008ff 5d72 .db "[char]"
+000900 08ea .dw VE_HEAD
+ .set VE_HEAD = VE_BRACKETCHAR
+ XT_BRACKETCHAR:
+000901 3800 .dw DO_COLON
+ PFA_BRACKETCHAR:
+ .endif
+000902 0721 .dw XT_COMPILE
+000903 383c .dw XT_DOLITERAL
+000904 04b6 .dw XT_CHAR
+000905 072c .dw XT_COMMA
+000906 381f .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:
+000907 0006 .dw $0006
+000908 6261
+000909 726f
+00090a 2274 .db "abort",'"'
+00090b 08fc .dw VE_HEAD
+ .set VE_HEAD = VE_ABORTQUOTE
+ XT_ABORTQUOTE:
+00090c 3800 .dw DO_COLON
+ PFA_ABORTQUOTE:
+ .endif
+00090d 3e89 .dw XT_SQUOTE
+00090e 0721 .dw XT_COMPILE
+00090f 091e .dw XT_QABORT
+000910 381f .DW XT_EXIT
+ .include "words/abort.asm"
+
+ ; Exceptions
+ ; send an exception -1
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_ABORT:
+000911 ff05 .dw $ff05
+000912 6261
+000913 726f
+000914 0074 .db "abort",0
+000915 0907 .dw VE_HEAD
+ .set VE_HEAD = VE_ABORT
+ XT_ABORT:
+000916 3800 .dw DO_COLON
+ PFA_ABORT:
+ .endif
+000917 394a .dw XT_TRUE
+000918 3d85 .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:
+000919 ff06 .dw $ff06
+00091a 613f
+00091b 6f62
+00091c 7472 .db "?abort"
+00091d 0911 .dw VE_HEAD
+ .set VE_HEAD = VE_QABORT
+ XT_QABORT:
+00091e 3800 .dw DO_COLON
+ PFA_QABORT:
+
+ .endif
+00091f 38e0
+000920 3835 .DW XT_ROT,XT_DOCONDBRANCH
+000921 0924 DEST(QABO1)
+000922 03c8
+000923 0916 .DW XT_ITYPE,XT_ABORT
+000924 3ed1
+000925 381f 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:
+000926 ff09 .dw $ff09
+000927 6567
+000928 2d74
+000929 7473
+00092a 6361
+00092b 006b .db "get-stack",0
+00092c 0919 .dw VE_HEAD
+ .set VE_HEAD = VE_GET_STACK
+ XT_GET_STACK:
+00092d 3800 .dw DO_COLON
+ .endif
+00092e 38b0 .dw XT_DUP
+00092f 3c8f .dw XT_CELLPLUS
+000930 38c3 .dw XT_SWAP
+000931 3b5e .dw XT_FETCHE
+000932 38b0 .dw XT_DUP
+000933 38fe .dw XT_TO_R
+000934 3953 .dw XT_ZERO
+000935 38c3 .dw XT_SWAP ; go from bigger to smaller addresses
+000936 07eb .dw XT_QDOCHECK
+000937 3835 .dw XT_DOCONDBRANCH
+000938 0944 DEST(PFA_N_FETCH_E2)
+000939 3a9a .dw XT_DODO
+ PFA_N_FETCH_E1:
+ ; ( ee-addr )
+00093a 3aab .dw XT_I
+00093b 3a34 .dw XT_1MINUS
+00093c 3ec3 .dw XT_CELLS ; ( -- ee-addr i*2 )
+00093d 38ce .dw XT_OVER ; ( -- ee-addr i*2 ee-addr )
+00093e 399c .dw XT_PLUS ; ( -- ee-addr ee-addr+i
+00093f 3b5e .dw XT_FETCHE ;( -- ee-addr item_i )
+000940 38c3 .dw XT_SWAP ;( -- item_i ee-addr )
+000941 394a .dw XT_TRUE ; shortcut for -1
+000942 3ab9 .dw XT_DOPLUSLOOP
+000943 093a DEST(PFA_N_FETCH_E1)
+ PFA_N_FETCH_E2:
+000944 3ed1 .dw XT_2DROP
+000945 38f5 .dw XT_R_FROM
+000946 381f .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:
+000947 ff09 .dw $ff09
+000948 6573
+000949 2d74
+00094a 7473
+00094b 6361
+00094c 006b .db "set-stack",0
+00094d 0926 .dw VE_HEAD
+ .set VE_HEAD = VE_SET_STACK
+ XT_SET_STACK:
+00094e 3800 .dw DO_COLON
+ PFA_SET_STACK:
+ .endif
+00094f 38ce .dw XT_OVER
+000950 3920 .dw XT_ZEROLESS
+000951 3835 .dw XT_DOCONDBRANCH
+000952 0956 DEST(PFA_SET_STACK0)
+000953 383c .dw XT_DOLITERAL
+000954 fffc .dw -4
+000955 3d85 .dw XT_THROW
+ PFA_SET_STACK0:
+000956 3ec8 .dw XT_2DUP
+000957 3b3a .dw XT_STOREE ; ( -- i_n .. i_0 n e-addr )
+000958 38c3 .dw XT_SWAP
+000959 3953 .dw XT_ZERO
+00095a 07eb .dw XT_QDOCHECK
+00095b 3835 .dw XT_DOCONDBRANCH
+00095c 0963 DEST(PFA_SET_STACK2)
+00095d 3a9a .dw XT_DODO
+ PFA_SET_STACK1:
+00095e 3c8f .dw XT_CELLPLUS ; ( -- i_x e-addr )
+00095f 3ed9 .dw XT_TUCK ; ( -- e-addr i_x e-addr
+000960 3b3a .dw XT_STOREE
+000961 3ac8 .dw XT_DOLOOP
+000962 095e DEST(PFA_SET_STACK1)
+ PFA_SET_STACK2:
+000963 38d8 .dw XT_DROP
+000964 381f .dw XT_EXIT
+
+ .include "words/map-stack.asm"
+
+ ; Tools
+ ; Iterate over a stack
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_MAPSTACK:
+000965 ff09 .dw $ff09
+000966 616d
+000967 2d70
+000968 7473
+000969 6361
+00096a 006b .db "map-stack",0
+00096b 0947 .dw VE_HEAD
+ .set VE_HEAD = VE_MAPSTACK
+ XT_MAPSTACK:
+00096c 3800 .dw DO_COLON
+ PFA_MAPSTACK:
+ .endif
+00096d 38b0 .dw XT_DUP
+00096e 3c8f .dw XT_CELLPLUS
+00096f 38c3 .dw XT_SWAP
+000970 3b5e .dw XT_FETCHE
+000971 3ec3 .dw XT_CELLS
+000972 3f98 .dw XT_BOUNDS
+000973 07eb .dw XT_QDOCHECK
+000974 3835 .dw XT_DOCONDBRANCH
+000975 0988 DEST(PFA_MAPSTACK3)
+000976 3a9a .dw XT_DODO
+ PFA_MAPSTACK1:
+000977 3aab .dw XT_I
+000978 3b5e .dw XT_FETCHE ; -- i*x XT id
+000979 38c3 .dw XT_SWAP
+00097a 38fe .dw XT_TO_R
+00097b 3907 .dw XT_R_FETCH
+00097c 3829 .dw XT_EXECUTE ; i*x id -- j*y true | i*x false
+00097d 38b8 .dw XT_QDUP
+00097e 3835 .dw XT_DOCONDBRANCH
+00097f 0984 DEST(PFA_MAPSTACK2)
+000980 38f5 .dw XT_R_FROM
+000981 38d8 .dw XT_DROP
+000982 3ad3 .dw XT_UNLOOP
+000983 381f .dw XT_EXIT
+ PFA_MAPSTACK2:
+000984 38f5 .dw XT_R_FROM
+000985 3fea .dw XT_TWO
+000986 3ab9 .dw XT_DOPLUSLOOP
+000987 0977 DEST(PFA_MAPSTACK1)
+ PFA_MAPSTACK3:
+000988 38d8 .dw XT_DROP
+000989 3953 .dw XT_ZERO
+00098a 381f .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:
+00098b ff0b .dw $ff0b
+00098c 6567
+00098d 2d74
+00098e 7563
+00098f 7272
+000990 6e65
+000991 0074 .db "get-current",0
+000992 0965 .dw VE_HEAD
+ .set VE_HEAD = VE_GET_CURRENT
+ XT_GET_CURRENT:
+000993 3800 .dw DO_COLON
+ PFA_GET_CURRENT:
+000994 383c .dw XT_DOLITERAL
+000995 0046 .dw CFG_CURRENT
+000996 3b5e .dw XT_FETCHE
+000997 381f .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:
+000998 ff09 .dw $ff09
+000999 6567
+00099a 2d74
+00099b 726f
+00099c 6564
+00099d 0072 .db "get-order",0
+00099e 098b .dw VE_HEAD
+ .set VE_HEAD = VE_GET_ORDER
+ XT_GET_ORDER:
+00099f 3800 .dw DO_COLON
+ PFA_GET_ORDER:
+ .endif
+0009a0 383c .dw XT_DOLITERAL
+0009a1 004a .dw CFG_ORDERLISTLEN
+0009a2 092d .dw XT_GET_STACK
+0009a3 381f .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:
+0009a4 ff09 .dw $ff09
+0009a5 6663
+0009a6 2d67
+0009a7 726f
+0009a8 6564
+0009a9 0072 .db "cfg-order",0
+0009aa 0998 .dw VE_HEAD
+ .set VE_HEAD = VE_CFG_ORDER
+ XT_CFG_ORDER:
+0009ab 3847 .dw PFA_DOVARIABLE
+ PFA_CFG_ORDER:
+ .endif
+0009ac 004a .dw CFG_ORDERLISTLEN
+ .include "words/compare.asm"
+
+ ; String
+ ; compares two strings in RAM
+ VE_COMPARE:
+0009ad ff07 .dw $ff07
+0009ae 6f63
+0009af 706d
+0009b0 7261
+0009b1 0065 .db "compare",0
+0009b2 09a4 .dw VE_HEAD
+ .set VE_HEAD = VE_COMPARE
+ XT_COMPARE:
+0009b3 09b4 .dw PFA_COMPARE
+ PFA_COMPARE:
+0009b4 93bf push xh
+0009b5 93af push xl
+0009b6 018c movw temp0, tosl
+0009b7 9189
+0009b8 9199 loadtos
+0009b9 01dc movw xl, tosl
+0009ba 9189
+0009bb 9199 loadtos
+0009bc 019c movw temp2, tosl
+0009bd 9189
+0009be 9199 loadtos
+0009bf 01fc movw zl, tosl
+ PFA_COMPARE_LOOP:
+0009c0 90ed ld temp4, X+
+0009c1 90f1 ld temp5, Z+
+0009c2 14ef cp temp4, temp5
+0009c3 f451 brne PFA_COMPARE_NOTEQUAL
+0009c4 950a dec temp0
+0009c5 f019 breq PFA_COMPARE_ENDREACHED2
+0009c6 952a dec temp2
+0009c7 f7c1 brne PFA_COMPARE_LOOP
+0009c8 c001 rjmp PFA_COMPARE_ENDREACHED
+ PFA_COMPARE_ENDREACHED2:
+0009c9 952a dec temp2
+ PFA_COMPARE_ENDREACHED:
+0009ca 2b02 or temp0, temp2
+0009cb f411 brne PFA_COMPARE_CHECKLASTCHAR
+0009cc 2788 clr tosl
+0009cd c002 rjmp PFA_COMPARE_DONE
+ PFA_COMPARE_CHECKLASTCHAR:
+ PFA_COMPARE_NOTEQUAL:
+0009ce ef8f ser tosl
+0009cf c000 rjmp PFA_COMPARE_DONE
+
+ PFA_COMPARE_DONE:
+0009d0 2f98 mov tosh, tosl
+0009d1 91af pop xl
+0009d2 91bf pop xh
+0009d3 940c 3804 jmp_ DO_NEXT
+ .include "words/nfa2lfa.asm"
+
+ ; System
+ ; get the link field address from the name field address
+ VE_NFA2LFA:
+0009d5 ff07 .dw $ff07
+0009d6 666e
+0009d7 3e61
+0009d8 666c
+0009d9 0061 .db "nfa>lfa",0
+0009da 09ad .dw VE_HEAD
+ .set VE_HEAD = VE_NFA2LFA
+ XT_NFA2LFA:
+0009db 3800 .dw DO_COLON
+ PFA_NFA2LFA:
+0009dc 06ba .dw XT_NAME2STRING
+0009dd 3a2e .dw XT_1PLUS
+0009de 3a03 .dw XT_2SLASH
+0009df 399c .dw XT_PLUS
+0009e0 381f .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 "dict/compiler2.inc" ; additional words for the compiler
+
+ ; 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:
+0009e1 ff0b .dw $ff0b
+0009e2 6573
+0009e3 2d74
+0009e4 7563
+0009e5 7272
+0009e6 6e65
+0009e7 0074 .db "set-current",0
+0009e8 09d5 .dw VE_HEAD
+ .set VE_HEAD = VE_SET_CURRENT
+ XT_SET_CURRENT:
+0009e9 3800 .dw DO_COLON
+ PFA_SET_CURRENT:
+0009ea 383c .dw XT_DOLITERAL
+0009eb 0046 .dw CFG_CURRENT
+0009ec 3b3a .dw XT_STOREE
+0009ed 381f .dw XT_EXIT
+ .include "words/wordlist.asm"
+
+ ; Search Order
+ ; create a new, empty wordlist
+ VE_WORDLIST:
+0009ee ff08 .dw $ff08
+0009ef 6f77
+0009f0 6472
+0009f1 696c
+0009f2 7473 .db "wordlist"
+0009f3 09e1 .dw VE_HEAD
+ .set VE_HEAD = VE_WORDLIST
+ XT_WORDLIST:
+0009f4 3800 .dw DO_COLON
+ PFA_WORDLIST:
+0009f5 3f1a .dw XT_EHERE
+0009f6 3953 .dw XT_ZERO
+0009f7 38ce .dw XT_OVER
+0009f8 3b3a .dw XT_STOREE
+0009f9 38b0 .dw XT_DUP
+0009fa 3c8f .dw XT_CELLPLUS
+0009fb 0173 .dw XT_DOTO
+0009fc 3f1b .dw PFA_EHERE
+0009fd 381f .dw XT_EXIT
+
+ .include "words/forth-wordlist.asm"
+
+ ; Search Order
+ ; get the system default word list
+ VE_FORTHWORDLIST:
+0009fe ff0e .dw $ff0e
+0009ff 6f66
+000a00 7472
+000a01 2d68
+000a02 6f77
+000a03 6472
+000a04 696c
+000a05 7473 .db "forth-wordlist"
+000a06 09ee .dw VE_HEAD
+ .set VE_HEAD = VE_FORTHWORDLIST
+ XT_FORTHWORDLIST:
+000a07 3847 .dw PFA_DOVARIABLE
+ PFA_FORTHWORDLIST:
+000a08 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:
+000a09 ff09 .dw $ff09
+000a0a 6573
+000a0b 2d74
+000a0c 726f
+000a0d 6564
+000a0e 0072 .db "set-order",0
+000a0f 09fe .dw VE_HEAD
+ .set VE_HEAD = VE_SET_ORDER
+ XT_SET_ORDER:
+000a10 3800 .dw DO_COLON
+ PFA_SET_ORDER:
+ .endif
+000a11 383c .dw XT_DOLITERAL
+000a12 004a .dw CFG_ORDERLISTLEN
+000a13 094e .dw XT_SET_STACK
+000a14 381f .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:
+000a15 ff0f .dw $ff0f
+000a16 6573
+000a17 2d74
+000a18 6572
+000a19 6f63
+000a1a 6e67
+000a1b 7a69
+000a1c 7265
+000a1d 0073 .db "set-recognizers",0
+000a1e 0a09 .dw VE_HEAD
+ .set VE_HEAD = VE_SET_RECOGNIZERS
+ XT_SET_RECOGNIZERS:
+000a1f 3800 .dw DO_COLON
+ PFA_SET_RECOGNIZERS:
+ .endif
+000a20 383c .dw XT_DOLITERAL
+000a21 005c .dw CFG_RECOGNIZERLISTLEN
+000a22 094e .dw XT_SET_STACK
+000a23 381f .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:
+000a24 ff0f .dw $ff0f
+000a25 6567
+000a26 2d74
+000a27 6572
+000a28 6f63
+000a29 6e67
+000a2a 7a69
+000a2b 7265
+000a2c 0073 .db "get-recognizers",0
+000a2d 0a15 .dw VE_HEAD
+ .set VE_HEAD = VE_GET_RECOGNIZERS
+ XT_GET_RECOGNIZERS:
+000a2e 3800 .dw DO_COLON
+ PFA_GET_RECOGNIZERS:
+ .endif
+000a2f 383c .dw XT_DOLITERAL
+000a30 005c .dw CFG_RECOGNIZERLISTLEN
+000a31 092d .dw XT_GET_STACK
+000a32 381f .dw XT_EXIT
+ .include "words/code.asm"
+
+ ; Compiler
+ ; create named entry in the dictionary, XT is the data field
+ VE_CODE:
+000a33 ff04 .dw $ff04
+000a34 6f63
+000a35 6564 .db "code"
+000a36 0a24 .dw VE_HEAD
+ .set VE_HEAD = VE_CODE
+ XT_CODE:
+000a37 3800 .dw DO_COLON
+ PFA_CODE:
+000a38 06fe .dw XT_DOCREATE
+000a39 085e .dw XT_REVEAL
+000a3a 3f11 .dw XT_DP
+000a3b 0185 .dw XT_ICELLPLUS
+000a3c 072c .dw XT_COMMA
+000a3d 381f .dw XT_EXIT
+ .include "words/end-code.asm"
+
+ ; Compiler
+ ; finish a code definition
+ VE_ENDCODE:
+000a3e ff08 .dw $ff08
+000a3f 6e65
+000a40 2d64
+000a41 6f63
+000a42 6564 .db "end-code"
+000a43 0a33 .dw VE_HEAD
+ .set VE_HEAD = VE_ENDCODE
+ XT_ENDCODE:
+000a44 3800 .dw DO_COLON
+ PFA_ENDCODE:
+000a45 0721 .dw XT_COMPILE
+000a46 940c .dw $940c
+000a47 0721 .dw XT_COMPILE
+000a48 3804 .dw DO_NEXT
+000a49 381f .dw XT_EXIT
+ .include "words/marker.asm"
+
+ ; System Value
+ ; The eeprom address until which MARKER saves and restores the eeprom data.
+ VE_MARKER:
+000a4a ff08 .dw $ff08
+000a4b 6d28
+000a4c 7261
+000a4d 656b
+000a4e 2972 .db "(marker)"
+000a4f 0a3e .dw VE_HEAD
+ .set VE_HEAD = VE_MARKER
+ XT_MARKER:
+000a50 386e .dw PFA_DOVALUE1
+ PFA_MARKER:
+000a51 0068 .dw EE_MARKER
+000a52 3d9f .dw XT_EDEFERFETCH
+000a53 3da9 .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:
+000a54 0008 .dw $0008
+000a55 6f70
+000a56 7473
+000a57 6f70
+000a58 656e .db "postpone"
+000a59 0a4a .dw VE_HEAD
+ .set VE_HEAD = VE_POSTPONE
+ XT_POSTPONE:
+000a5a 3800 .dw DO_COLON
+ PFA_POSTPONE:
+ .endif
+000a5b 0580 .dw XT_PARSENAME
+000a5c 05c3 .dw XT_FORTHRECOGNIZER
+000a5d 05ce .dw XT_RECOGNIZE
+000a5e 38b0 .dw XT_DUP
+000a5f 38fe .dw XT_TO_R
+000a60 0185 .dw XT_ICELLPLUS
+000a61 0185 .dw XT_ICELLPLUS
+000a62 3bca .dw XT_FETCHI
+000a63 3829 .dw XT_EXECUTE
+000a64 38f5 .dw XT_R_FROM
+000a65 0185 .dw XT_ICELLPLUS
+000a66 3bca .dw XT_FETCHI
+000a67 072c .dw XT_COMMA
+000a68 381f .dw XT_EXIT
+ .endif
+
+ .include "words/applturnkey.asm"
+
+ ; R( -- )
+ ; application specific turnkey action
+ VE_APPLTURNKEY:
+000a69 ff0b .dw $ff0b
+000a6a 7061
+000a6b 6c70
+000a6c 7574
+000a6d 6e72
+000a6e 656b
+000a6f 0079 .db "applturnkey",0
+000a70 0a54 .dw VE_HEAD
+ .set VE_HEAD = VE_APPLTURNKEY
+ XT_APPLTURNKEY:
+000a71 3800 .dw DO_COLON
+ PFA_APPLTURNKEY:
+000a72 00c7 .dw XT_USART
+
+ .if WANT_INTERRUPTS == 1
+000a73 3c96 .dw XT_INTON
+ .endif
+
+000a74 013e .dw XT_DOT_VER
+000a75 3fad .dw XT_SPACE
+000a76 0395 .dw XT_DOSLITERAL
+000a77 000a .dw 10
+000a78 6f46
+000a79 7472
+000a7a 6468
+000a7b 6975
+000a7c 6f6e .db "Forthduino"
+000a7d 03c8 .dw XT_ITYPE
+
+000a7e 381f .dw XT_EXIT
+
+
+ .set DPSTART = pc
+ .if(pc>AMFORTH_RO_SEG)
+ .endif
+
+ .org AMFORTH_RO_SEG
+ .include "amforth-interpreter.asm"
+
+
+ DO_COLON:
+003800 93bf push XH
+003801 93af push XL ; PUSH IP
+003802 01db movw XL, wl
+003803 9611 adiw xl, 1
+ DO_NEXT:
+ .if WANT_INTERRUPTS == 1
+003804 14b2 cp isrflag, zerol
+003805 f469 brne DO_INTERRUPT
+ .endif
+003806 01fd movw zl, XL ; READ IP
+003807 0fee
+003808 1fff
+003809 9165
+00380a 9175 readflashcell wl, wh
+00380b 9611 adiw XL, 1 ; INC IP
+
+ DO_EXECUTE:
+00380c 01fb movw zl, wl
+00380d 0fee
+00380e 1fff
+00380f 9105
+003810 9115 readflashcell temp0,temp1
+003811 01f8 movw zl, temp0
+003812 9409 ijmp
+
+ .if WANT_INTERRUPTS == 1
+ DO_INTERRUPT:
+ ; here we deal with interrupts the forth way
+003813 939a
+003814 938a savetos
+003815 2d8b mov tosl, isrflag
+003816 2799 clr tosh
+003817 24bb clr isrflag
+003818 eb6f ldi wl, LOW(XT_ISREXEC)
+003819 e37c ldi wh, HIGH(XT_ISREXEC)
+00381a 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:
+00381b ff04 .dw $ff04
+00381c 7865
+00381d 7469 .db "exit"
+00381e 0a69 .dw VE_HEAD
+ .set VE_HEAD = VE_EXIT
+ XT_EXIT:
+00381f 3820 .dw PFA_EXIT
+ PFA_EXIT:
+003820 91af pop XL
+003821 91bf pop XH
+003822 cfe1 jmp_ DO_NEXT
+ .include "words/execute.asm"
+
+ ; System
+ ; execute XT
+ VE_EXECUTE:
+003823 ff07 .dw $ff07
+003824 7865
+003825 6365
+003826 7475
+003827 0065 .db "execute",0
+003828 381b .dw VE_HEAD
+ .set VE_HEAD = VE_EXECUTE
+ XT_EXECUTE:
+003829 382a .dw PFA_EXECUTE
+ PFA_EXECUTE:
+00382a 01bc movw wl, tosl
+00382b 9189
+00382c 9199 loadtos
+00382d 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:
+00382e 382f .dw PFA_DOBRANCH
+ PFA_DOBRANCH:
+00382f 01fd movw zl, XL
+003830 0fee
+003831 1fff
+003832 91a5
+003833 91b5 readflashcell XL,XH
+003834 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:
+003835 3836 .dw PFA_DOCONDBRANCH
+ PFA_DOCONDBRANCH:
+003836 2b98 or tosh, tosl
+003837 9189
+003838 9199 loadtos
+003839 f3a9 brbs 1, PFA_DOBRANCH ; 1 is z flag; if tos is zero (false), do the branch
+00383a 9611 adiw XL, 1
+00383b 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:
+00383c 383d .dw PFA_DOLITERAL
+ PFA_DOLITERAL:
+00383d 939a
+00383e 938a savetos
+00383f 01fd movw zl, xl
+003840 0fee
+003841 1fff
+003842 9185
+003843 9195 readflashcell tosl,tosh
+003844 9611 adiw xl, 1
+003845 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:
+003846 3847 .dw PFA_DOVARIABLE
+ PFA_DOVARIABLE:
+003847 939a
+003848 938a savetos
+003849 01fb movw zl, wl
+00384a 9631 adiw zl,1
+00384b 0fee
+00384c 1fff
+00384d 9185
+00384e 9195 readflashcell tosl,tosh
+00384f 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:
+003850 3851 .dw PFA_DOCONSTANT
+ PFA_DOCONSTANT:
+003851 939a
+003852 938a savetos
+003853 01cb movw tosl, wl
+003854 9601 adiw tosl, 1
+003855 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:
+003856 3857 .dw PFA_DOUSER
+ PFA_DOUSER:
+003857 939a
+003858 938a savetos
+003859 01fb movw zl, wl
+00385a 9631 adiw zl, 1
+00385b 0fee
+00385c 1fff
+00385d 9185
+00385e 9195 readflashcell tosl,tosh
+00385f 0d84 add tosl, upl
+003860 1d95 adc tosh, uph
+003861 cfa2 jmp_ DO_NEXT
+ .include "words/do-value.asm"
+
+ ; System
+ ; runtime of value
+ VE_DOVALUE:
+003862 ff07 .dw $ff07
+003863 7628
+003864 6c61
+003865 6575
+003866 0029 .db "(value)", 0
+003867 3823 .dw VE_HEAD
+ .set VE_HEAD = VE_DOVALUE
+ XT_DOVALUE:
+003868 3800 .dw DO_COLON
+ PFA_DOVALUE:
+003869 06fe .dw XT_DOCREATE
+00386a 085e .dw XT_REVEAL
+00386b 0721 .dw XT_COMPILE
+00386c 386e .dw PFA_DOVALUE1
+00386d 381f .dw XT_EXIT
+ PFA_DOVALUE1:
+00386e 940e 0877 call_ DO_DODOES
+003870 38b0 .dw XT_DUP
+003871 0185 .dw XT_ICELLPLUS
+003872 3bca .dw XT_FETCHI
+003873 3829 .dw XT_EXECUTE
+003874 381f .dw XT_EXIT
+
+ ; : (value) <builds does> dup icell+ @i execute ;
+ .include "words/fetch.asm"
+
+ ; Memory
+ ; read 1 cell from RAM address
+ VE_FETCH:
+003875 ff01 .dw $ff01
+003876 0040 .db "@",0
+003877 3862 .dw VE_HEAD
+ .set VE_HEAD = VE_FETCH
+ XT_FETCH:
+003878 3879 .dw PFA_FETCH
+ PFA_FETCH:
+ .if WANT_UNIFIED == 1
+ .endif
+ PFA_FETCHRAM:
+003879 01fc movw zl, tosl
+ ; low byte is read before the high byte
+00387a 9181 ld tosl, z+
+00387b 9191 ld tosh, z+
+00387c 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:
+00387d ff01 .dw $ff01
+00387e 0021 .db "!",0
+00387f 3875 .dw VE_HEAD
+ .set VE_HEAD = VE_STORE
+ XT_STORE:
+003880 3881 .dw PFA_STORE
+ PFA_STORE:
+ .if WANT_UNIFIED == 1
+ .endif
+ PFA_STORERAM:
+003881 01fc movw zl, tosl
+003882 9189
+003883 9199 loadtos
+ ; the high byte is written before the low byte
+003884 8391 std Z+1, tosh
+003885 8380 std Z+0, tosl
+003886 9189
+003887 9199 loadtos
+003888 cf7b jmp_ DO_NEXT
+ .if WANT_UNIFIED == 1
+ .endif
+ .include "words/cstore.asm"
+
+ ; Memory
+ ; store a single byte to RAM address
+ VE_CSTORE:
+003889 ff02 .dw $ff02
+00388a 2163 .db "c!"
+00388b 387d .dw VE_HEAD
+ .set VE_HEAD = VE_CSTORE
+ XT_CSTORE:
+00388c 388d .dw PFA_CSTORE
+ PFA_CSTORE:
+00388d 01fc movw zl, tosl
+00388e 9189
+00388f 9199 loadtos
+003890 8380 st Z, tosl
+003891 9189
+003892 9199 loadtos
+003893 cf70 jmp_ DO_NEXT
+ .include "words/cfetch.asm"
+
+ ; Memory
+ ; fetch a single byte from memory mapped locations
+ VE_CFETCH:
+003894 ff02 .dw $ff02
+003895 4063 .db "c@"
+003896 3889 .dw VE_HEAD
+ .set VE_HEAD = VE_CFETCH
+ XT_CFETCH:
+003897 3898 .dw PFA_CFETCH
+ PFA_CFETCH:
+003898 01fc movw zl, tosl
+003899 2799 clr tosh
+00389a 8180 ld tosl, Z
+00389b cf68 jmp_ DO_NEXT
+ .include "words/fetch-u.asm"
+
+ ; Memory
+ ; read 1 cell from USER area
+ VE_FETCHU:
+00389c ff02 .dw $ff02
+00389d 7540 .db "@u"
+00389e 3894 .dw VE_HEAD
+ .set VE_HEAD = VE_FETCHU
+ XT_FETCHU:
+00389f 3800 .dw DO_COLON
+ PFA_FETCHU:
+0038a0 3b01 .dw XT_UP_FETCH
+0038a1 399c .dw XT_PLUS
+0038a2 3878 .dw XT_FETCH
+0038a3 381f .dw XT_EXIT
+ .include "words/store-u.asm"
+
+ ; Memory
+ ; write n to USER area at offset
+ VE_STOREU:
+0038a4 ff02 .dw $ff02
+0038a5 7521 .db "!u"
+0038a6 389c .dw VE_HEAD
+ .set VE_HEAD = VE_STOREU
+ XT_STOREU:
+0038a7 3800 .dw DO_COLON
+ PFA_STOREU:
+0038a8 3b01 .dw XT_UP_FETCH
+0038a9 399c .dw XT_PLUS
+0038aa 3880 .dw XT_STORE
+0038ab 381f .dw XT_EXIT
+
+ ;;;;;;;;;;;;;;;;;;;;;;;;;
+ .include "words/dup.asm"
+
+ ; Stack
+ ; duplicate TOS
+ VE_DUP:
+0038ac ff03 .dw $ff03
+0038ad 7564
+0038ae 0070 .db "dup",0
+0038af 38a4 .dw VE_HEAD
+ .set VE_HEAD = VE_DUP
+ XT_DUP:
+0038b0 38b1 .dw PFA_DUP
+ PFA_DUP:
+0038b1 939a
+0038b2 938a savetos
+0038b3 cf50 jmp_ DO_NEXT
+ .include "words/qdup.asm"
+
+ ; Stack
+ ; duplicate TOS if non-zero
+ VE_QDUP:
+0038b4 ff04 .dw $ff04
+0038b5 643f
+0038b6 7075 .db "?dup"
+0038b7 38ac .dw VE_HEAD
+ .set VE_HEAD = VE_QDUP
+ XT_QDUP:
+0038b8 38b9 .dw PFA_QDUP
+ PFA_QDUP:
+0038b9 2f08 mov temp0, tosl
+0038ba 2b09 or temp0, tosh
+0038bb f011 breq PFA_QDUP1
+0038bc 939a
+0038bd 938a savetos
+ PFA_QDUP1:
+0038be cf45 jmp_ DO_NEXT
+ .include "words/swap.asm"
+
+ ; Stack
+ ; swaps the two top level stack cells
+ VE_SWAP:
+0038bf ff04 .dw $ff04
+0038c0 7773
+0038c1 7061 .db "swap"
+0038c2 38b4 .dw VE_HEAD
+ .set VE_HEAD = VE_SWAP
+ XT_SWAP:
+0038c3 38c4 .dw PFA_SWAP
+ PFA_SWAP:
+0038c4 018c movw temp0, tosl
+0038c5 9189
+0038c6 9199 loadtos
+0038c7 931a st -Y, temp1
+0038c8 930a st -Y, temp0
+0038c9 cf3a jmp_ DO_NEXT
+ .include "words/over.asm"
+
+ ; Stack
+ ; Place a copy of x1 on top of the stack
+ VE_OVER:
+0038ca ff04 .dw $ff04
+0038cb 766f
+0038cc 7265 .db "over"
+0038cd 38bf .dw VE_HEAD
+ .set VE_HEAD = VE_OVER
+ XT_OVER:
+0038ce 38cf .dw PFA_OVER
+ PFA_OVER:
+0038cf 939a
+0038d0 938a savetos
+0038d1 818a ldd tosl, Y+2
+0038d2 819b ldd tosh, Y+3
+
+0038d3 cf30 jmp_ DO_NEXT
+ .include "words/drop.asm"
+
+ ; Stack
+ ; drop TOS
+ VE_DROP:
+0038d4 ff04 .dw $ff04
+0038d5 7264
+0038d6 706f .db "drop"
+0038d7 38ca .dw VE_HEAD
+ .set VE_HEAD = VE_DROP
+ XT_DROP:
+0038d8 38d9 .dw PFA_DROP
+ PFA_DROP:
+0038d9 9189
+0038da 9199 loadtos
+0038db cf28 jmp_ DO_NEXT
+ .include "words/rot.asm"
+
+ ; Stack
+ ; rotate the three top level cells
+ VE_ROT:
+0038dc ff03 .dw $ff03
+0038dd 6f72
+0038de 0074 .db "rot",0
+0038df 38d4 .dw VE_HEAD
+ .set VE_HEAD = VE_ROT
+ XT_ROT:
+0038e0 38e1 .dw PFA_ROT
+ PFA_ROT:
+0038e1 018c movw temp0, tosl
+0038e2 9129 ld temp2, Y+
+0038e3 9139 ld temp3, Y+
+0038e4 9189
+0038e5 9199 loadtos
+
+0038e6 933a st -Y, temp3
+0038e7 932a st -Y, temp2
+0038e8 931a st -Y, temp1
+0038e9 930a st -Y, temp0
+
+0038ea cf19 jmp_ DO_NEXT
+ .include "words/nip.asm"
+
+ ; Stack
+ ; Remove Second of Stack
+ VE_NIP:
+0038eb ff03 .dw $ff03
+0038ec 696e
+0038ed 0070 .db "nip",0
+0038ee 38dc .dw VE_HEAD
+ .set VE_HEAD = VE_NIP
+ XT_NIP:
+0038ef 38f0 .dw PFA_NIP
+ PFA_NIP:
+0038f0 9622 adiw yl, 2
+0038f1 cf12 jmp_ DO_NEXT
+ ;;;;;;;;;;;;;;;;;;;;;;;;;
+ .include "words/r_from.asm"
+
+ ; Stack
+ ; move TOR to TOS
+ VE_R_FROM:
+0038f2 ff02 .dw $ff02
+0038f3 3e72 .db "r>"
+0038f4 38eb .dw VE_HEAD
+ .set VE_HEAD = VE_R_FROM
+ XT_R_FROM:
+0038f5 38f6 .dw PFA_R_FROM
+ PFA_R_FROM:
+0038f6 939a
+0038f7 938a savetos
+0038f8 918f pop tosl
+0038f9 919f pop tosh
+0038fa cf09 jmp_ DO_NEXT
+ .include "words/to_r.asm"
+
+ ; Stack
+ ; move TOS to TOR
+ VE_TO_R:
+0038fb ff02 .dw $ff02
+0038fc 723e .db ">r"
+0038fd 38f2 .dw VE_HEAD
+ .set VE_HEAD = VE_TO_R
+ XT_TO_R:
+0038fe 38ff .dw PFA_TO_R
+ PFA_TO_R:
+0038ff 939f push tosh
+003900 938f push tosl
+003901 9189
+003902 9199 loadtos
+003903 cf00 jmp_ DO_NEXT
+ .include "words/r_fetch.asm"
+
+ ; Stack
+ ; fetch content of TOR
+ VE_R_FETCH:
+003904 ff02 .dw $ff02
+003905 4072 .db "r@"
+003906 38fb .dw VE_HEAD
+ .set VE_HEAD = VE_R_FETCH
+ XT_R_FETCH:
+003907 3908 .dw PFA_R_FETCH
+ PFA_R_FETCH:
+003908 939a
+003909 938a savetos
+00390a 918f pop tosl
+00390b 919f pop tosh
+00390c 939f push tosh
+00390d 938f push tosl
+00390e 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:
+00390f ff02 .dw $ff02
+003910 3e3c .db "<>"
+003911 3904 .dw VE_HEAD
+ .set VE_HEAD = VE_NOTEQUAL
+ XT_NOTEQUAL:
+003912 3800 .dw DO_COLON
+ PFA_NOTEQUAL:
+ .endif
+
+003913 3fde
+003914 3919
+003915 381f .DW XT_EQUAL,XT_ZEROEQUAL,XT_EXIT
+ .include "words/equalzero.asm"
+
+ ; Compare
+ ; compare with 0 (zero)
+ VE_ZEROEQUAL:
+003916 ff02 .dw $ff02
+003917 3d30 .db "0="
+003918 390f .dw VE_HEAD
+ .set VE_HEAD = VE_ZEROEQUAL
+ XT_ZEROEQUAL:
+003919 391a .dw PFA_ZEROEQUAL
+ PFA_ZEROEQUAL:
+00391a 2b98 or tosh, tosl
+00391b f5d1 brne PFA_ZERO1
+00391c c030 rjmp PFA_TRUE1
+ .include "words/lesszero.asm"
+
+ ; Compare
+ ; compare with zero
+ VE_ZEROLESS:
+00391d ff02 .dw $ff02
+00391e 3c30 .db "0<"
+00391f 3916 .dw VE_HEAD
+ .set VE_HEAD = VE_ZEROLESS
+ XT_ZEROLESS:
+003920 3921 .dw PFA_ZEROLESS
+ PFA_ZEROLESS:
+003921 fd97 sbrc tosh,7
+003922 c02a rjmp PFA_TRUE1
+003923 c032 rjmp PFA_ZERO1
+ .include "words/greaterzero.asm"
+
+ ; Compare
+ ; true if n1 is greater than 0
+ VE_GREATERZERO:
+003924 ff02 .dw $ff02
+003925 3e30 .db "0>"
+003926 391d .dw VE_HEAD
+ .set VE_HEAD = VE_GREATERZERO
+ XT_GREATERZERO:
+003927 3928 .dw PFA_GREATERZERO
+ PFA_GREATERZERO:
+003928 1582 cp tosl, zerol
+003929 0593 cpc tosh, zeroh
+00392a f15c brlt PFA_ZERO1
+00392b f151 brbs 1, PFA_ZERO1
+00392c c020 rjmp PFA_TRUE1
+ .include "words/d-greaterzero.asm"
+
+ ; Compare
+ ; compares if a double double cell number is greater 0
+ VE_DGREATERZERO:
+00392d ff03 .dw $ff03
+00392e 3064
+00392f 003e .db "d0>",0
+003930 3924 .dw VE_HEAD
+ .set VE_HEAD = VE_DGREATERZERO
+ XT_DGREATERZERO:
+003931 3932 .dw PFA_DGREATERZERO
+ PFA_DGREATERZERO:
+003932 1582 cp tosl, zerol
+003933 0593 cpc tosh, zeroh
+003934 9189
+003935 9199 loadtos
+003936 0582 cpc tosl, zerol
+003937 0593 cpc tosh, zeroh
+003938 f0ec brlt PFA_ZERO1
+003939 f0e1 brbs 1, PFA_ZERO1
+00393a c012 rjmp PFA_TRUE1
+ .include "words/d-lesszero.asm"
+
+ ; Compare
+ ; compares if a double double cell number is less than 0
+ VE_DXT_ZEROLESS:
+00393b ff03 .dw $ff03
+00393c 3064
+00393d 003c .db "d0<",0
+00393e 392d .dw VE_HEAD
+ .set VE_HEAD = VE_DXT_ZEROLESS
+ XT_DXT_ZEROLESS:
+00393f 3940 .dw PFA_DXT_ZEROLESS
+ PFA_DXT_ZEROLESS:
+003940 9622 adiw Y,2
+003941 fd97 sbrc tosh,7
+003942 940c 394d jmp PFA_TRUE1
+003944 940c 3956 jmp PFA_ZERO1
+
+ .include "words/true.asm"
+
+ ; Arithmetics
+ ; leaves the value -1 (true) on TOS
+ VE_TRUE:
+003946 ff04 .dw $ff04
+003947 7274
+003948 6575 .db "true"
+003949 393b .dw VE_HEAD
+ .set VE_HEAD = VE_TRUE
+ XT_TRUE:
+00394a 394b .dw PFA_TRUE
+ PFA_TRUE:
+00394b 939a
+00394c 938a savetos
+ PFA_TRUE1:
+00394d ef8f ser tosl
+00394e ef9f ser tosh
+00394f ceb4 jmp_ DO_NEXT
+ .include "words/zero.asm"
+
+ ; Arithmetics
+ ; place a value 0 on TOS
+ VE_ZERO:
+003950 ff01 .dw $ff01
+003951 0030 .db "0",0
+003952 3946 .dw VE_HEAD
+ .set VE_HEAD = VE_ZERO
+ XT_ZERO:
+003953 3954 .dw PFA_ZERO
+ PFA_ZERO:
+003954 939a
+003955 938a savetos
+ PFA_ZERO1:
+003956 01c1 movw tosl, zerol
+003957 ceac jmp_ DO_NEXT
+ .include "words/uless.asm"
+
+ ; Compare
+ ; true if u1 < u2 (unsigned)
+ VE_ULESS:
+003958 ff02 .dw $ff02
+003959 3c75 .db "u<"
+00395a 3950 .dw VE_HEAD
+ .set VE_HEAD = VE_ULESS
+ XT_ULESS:
+00395b 395c .dw PFA_ULESS
+ PFA_ULESS:
+00395c 9129 ld temp2, Y+
+00395d 9139 ld temp3, Y+
+00395e 1782 cp tosl, temp2
+00395f 0793 cpc tosh, temp3
+003960 f3a8 brlo PFA_ZERO1
+003961 f3a1 brbs 1, PFA_ZERO1
+003962 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:
+003963 ff02 .dw $ff02
+003964 3e75 .db "u>"
+003965 3958 .dw VE_HEAD
+ .set VE_HEAD = VE_UGREATER
+ XT_UGREATER:
+003966 3800 .dw DO_COLON
+ PFA_UGREATER:
+ .endif
+003967 38c3 .DW XT_SWAP
+003968 395b .dw XT_ULESS
+003969 381f .dw XT_EXIT
+ .include "words/less.asm"
+
+ ; Compare
+ ; true if n1 is less than n2
+ VE_LESS:
+00396a ff01 .dw $ff01
+00396b 003c .db "<",0
+00396c 3963 .dw VE_HEAD
+ .set VE_HEAD = VE_LESS
+ XT_LESS:
+00396d 396e .dw PFA_LESS
+ PFA_LESS:
+00396e 9129 ld temp2, Y+
+00396f 9139 ld temp3, Y+
+003970 1728 cp temp2, tosl
+003971 0739 cpc temp3, tosh
+ PFA_LESSDONE:
+003972 f71c brge PFA_ZERO1
+003973 cfd9 rjmp PFA_TRUE1
+ .include "words/greater.asm"
+
+ ; Compare
+ ; flag is true if n1 is greater than n2
+ VE_GREATER:
+003974 ff01 .dw $ff01
+003975 003e .db ">",0
+003976 396a .dw VE_HEAD
+ .set VE_HEAD = VE_GREATER
+ XT_GREATER:
+003977 3978 .dw PFA_GREATER
+ PFA_GREATER:
+003978 9129 ld temp2, Y+
+003979 9139 ld temp3, Y+
+00397a 1728 cp temp2, tosl
+00397b 0739 cpc temp3, tosh
+ PFA_GREATERDONE:
+00397c f2cc brlt PFA_ZERO1
+00397d f2c1 brbs 1, PFA_ZERO1
+00397e cfce rjmp PFA_TRUE1
+
+ .include "words/log2.asm"
+
+ ; Arithmetics
+ ; logarithm to base 2 or highest set bitnumber
+ VE_LOG2:
+00397f ff04 .dw $ff04
+003980 6f6c
+003981 3267 .db "log2"
+003982 3974 .dw VE_HEAD
+ .set VE_HEAD = VE_LOG2
+ XT_LOG2:
+003983 3984 .dw PFA_LOG2
+ PFA_LOG2:
+003984 01fc movw zl, tosl
+003985 2799 clr tosh
+003986 e180 ldi tosl, 16
+ PFA_LOG2_1:
+003987 958a dec tosl
+003988 f022 brmi PFA_LOG2_2 ; wrong data
+003989 0fee lsl zl
+00398a 1fff rol zh
+00398b f7d8 brcc PFA_LOG2_1
+00398c ce77 jmp_ DO_NEXT
+
+ PFA_LOG2_2:
+00398d 959a dec tosh
+00398e ce75 jmp_ DO_NEXT
+ .include "words/minus.asm"
+
+ ; Arithmetics
+ ; subtract n2 from n1
+ VE_MINUS:
+00398f ff01 .dw $ff01
+003990 002d .db "-",0
+003991 397f .dw VE_HEAD
+ .set VE_HEAD = VE_MINUS
+ XT_MINUS:
+003992 3993 .dw PFA_MINUS
+ PFA_MINUS:
+003993 9109 ld temp0, Y+
+003994 9119 ld temp1, Y+
+003995 1b08 sub temp0, tosl
+003996 0b19 sbc temp1, tosh
+003997 01c8 movw tosl, temp0
+003998 ce6b jmp_ DO_NEXT
+ .include "words/plus.asm"
+
+ ; Arithmetics
+ ; add n1 and n2
+ VE_PLUS:
+003999 ff01 .dw $ff01
+00399a 002b .db "+",0
+00399b 398f .dw VE_HEAD
+ .set VE_HEAD = VE_PLUS
+ XT_PLUS:
+00399c 399d .dw PFA_PLUS
+ PFA_PLUS:
+00399d 9109 ld temp0, Y+
+00399e 9119 ld temp1, Y+
+00399f 0f80 add tosl, temp0
+0039a0 1f91 adc tosh, temp1
+0039a1 ce62 jmp_ DO_NEXT
+ .include "words/mstar.asm"
+
+ ; Arithmetics
+ ; multiply 2 cells to a double cell
+ VE_MSTAR:
+0039a2 ff02 .dw $ff02
+0039a3 2a6d .db "m*"
+0039a4 3999 .dw VE_HEAD
+ .set VE_HEAD = VE_MSTAR
+ XT_MSTAR:
+0039a5 39a6 .dw PFA_MSTAR
+ PFA_MSTAR:
+0039a6 018c movw temp0, tosl
+0039a7 9189
+0039a8 9199 loadtos
+0039a9 019c movw temp2, tosl
+ ; high cell ah*bh
+0039aa 0231 muls temp3, temp1
+0039ab 0170 movw temp4, r0
+ ; low cell al*bl
+0039ac 9f20 mul temp2, temp0
+0039ad 01c0 movw tosl, r0
+ ; signed ah*bl
+0039ae 0330 mulsu temp3, temp0
+0039af 08f3 sbc temp5, zeroh
+0039b0 0d90 add tosh, r0
+0039b1 1ce1 adc temp4, r1
+0039b2 1cf3 adc temp5, zeroh
+
+ ; signed al*bh
+0039b3 0312 mulsu temp1, temp2
+0039b4 08f3 sbc temp5, zeroh
+0039b5 0d90 add tosh, r0
+0039b6 1ce1 adc temp4, r1
+0039b7 1cf3 adc temp5, zeroh
+
+0039b8 939a
+0039b9 938a savetos
+0039ba 01c7 movw tosl, temp4
+0039bb ce48 jmp_ DO_NEXT
+ .include "words/umslashmod.asm"
+
+ ; Arithmetics
+ ; unsigned division ud / u2 with remainder
+ VE_UMSLASHMOD:
+0039bc ff06 .dw $ff06
+0039bd 6d75
+0039be 6d2f
+0039bf 646f .db "um/mod"
+0039c0 39a2 .dw VE_HEAD
+ .set VE_HEAD = VE_UMSLASHMOD
+ XT_UMSLASHMOD:
+0039c1 39c2 .dw PFA_UMSLASHMOD
+ PFA_UMSLASHMOD:
+0039c2 017c movw temp4, tosl
+
+0039c3 9129 ld temp2, Y+
+0039c4 9139 ld temp3, Y+
+
+0039c5 9109 ld temp0, Y+
+0039c6 9119 ld temp1, Y+
+
+ ;; unsigned 32/16 -> 16r16 divide
+
+ PFA_UMSLASHMODmod:
+
+ ; set loop counter
+0039c7 e140 ldi temp6,$10
+
+ PFA_UMSLASHMODmod_loop:
+ ; shift left, saving high bit
+0039c8 2755 clr temp7
+0039c9 0f00 lsl temp0
+0039ca 1f11 rol temp1
+0039cb 1f22 rol temp2
+0039cc 1f33 rol temp3
+0039cd 1f55 rol temp7
+
+ ; try subtracting divisor
+0039ce 152e cp temp2, temp4
+0039cf 053f cpc temp3, temp5
+0039d0 0552 cpc temp7,zerol
+
+0039d1 f018 brcs PFA_UMSLASHMODmod_loop_control
+
+ PFA_UMSLASHMODmod_subtract:
+ ; dividend is large enough
+ ; do the subtraction for real
+ ; and set lowest bit
+0039d2 9503 inc temp0
+0039d3 192e sub temp2, temp4
+0039d4 093f sbc temp3, temp5
+
+ PFA_UMSLASHMODmod_loop_control:
+0039d5 954a dec temp6
+0039d6 f789 brne PFA_UMSLASHMODmod_loop
+
+ PFA_UMSLASHMODmod_done:
+ ; put remainder on stack
+0039d7 933a st -Y,temp3
+0039d8 932a st -Y,temp2
+
+ ; put quotient on stack
+0039d9 01c8 movw tosl, temp0
+0039da ce29 jmp_ DO_NEXT
+ .include "words/umstar.asm"
+
+ ; Arithmetics
+ ; multiply 2 unsigned cells to a double cell
+ VE_UMSTAR:
+0039db ff03 .dw $ff03
+0039dc 6d75
+0039dd 002a .db "um*",0
+0039de 39bc .dw VE_HEAD
+ .set VE_HEAD = VE_UMSTAR
+ XT_UMSTAR:
+0039df 39e0 .dw PFA_UMSTAR
+ PFA_UMSTAR:
+0039e0 018c movw temp0, tosl
+0039e1 9189
+0039e2 9199 loadtos
+ ; result: (temp3*temp1)* 65536 + (temp3*temp0 + temp1*temp2) * 256 + (temp0 * temp2)
+ ; low bytes
+0039e3 9f80 mul tosl,temp0
+0039e4 01f0 movw zl, r0
+0039e5 2722 clr temp2
+0039e6 2733 clr temp3
+ ; middle bytes
+0039e7 9f90 mul tosh, temp0
+0039e8 0df0 add zh, r0
+0039e9 1d21 adc temp2, r1
+0039ea 1d33 adc temp3, zeroh
+
+0039eb 9f81 mul tosl, temp1
+0039ec 0df0 add zh, r0
+0039ed 1d21 adc temp2, r1
+0039ee 1d33 adc temp3, zeroh
+
+0039ef 9f91 mul tosh, temp1
+0039f0 0d20 add temp2, r0
+0039f1 1d31 adc temp3, r1
+0039f2 01cf movw tosl, zl
+0039f3 939a
+0039f4 938a savetos
+0039f5 01c9 movw tosl, temp2
+0039f6 ce0d jmp_ DO_NEXT
+
+ .include "words/invert.asm"
+
+ ; Arithmetics
+ ; 1-complement of TOS
+ VE_INVERT:
+0039f7 ff06 .dw $ff06
+0039f8 6e69
+0039f9 6576
+0039fa 7472 .db "invert"
+0039fb 39db .dw VE_HEAD
+ .set VE_HEAD = VE_INVERT
+ XT_INVERT:
+0039fc 39fd .dw PFA_INVERT
+ PFA_INVERT:
+0039fd 9580 com tosl
+0039fe 9590 com tosh
+0039ff ce04 jmp_ DO_NEXT
+ .include "words/2slash.asm"
+
+ ; Arithmetics
+ ; arithmetic shift right
+ VE_2SLASH:
+003a00 ff02 .dw $ff02
+003a01 2f32 .db "2/"
+003a02 39f7 .dw VE_HEAD
+ .set VE_HEAD = VE_2SLASH
+ XT_2SLASH:
+003a03 3a04 .dw PFA_2SLASH
+ PFA_2SLASH:
+003a04 9595 asr tosh
+003a05 9587 ror tosl
+003a06 cdfd jmp_ DO_NEXT
+ .include "words/2star.asm"
+
+ ; Arithmetics
+ ; arithmetic shift left, filling with zero
+ VE_2STAR:
+003a07 ff02 .dw $ff02
+003a08 2a32 .db "2*"
+003a09 3a00 .dw VE_HEAD
+ .set VE_HEAD = VE_2STAR
+ XT_2STAR:
+003a0a 3a0b .dw PFA_2STAR
+ PFA_2STAR:
+003a0b 0f88 lsl tosl
+003a0c 1f99 rol tosh
+003a0d cdf6 jmp_ DO_NEXT
+ .include "words/and.asm"
+
+ ; Logic
+ ; bitwise and
+ VE_AND:
+003a0e ff03 .dw $ff03
+003a0f 6e61
+003a10 0064 .db "and",0
+003a11 3a07 .dw VE_HEAD
+ .set VE_HEAD = VE_AND
+ XT_AND:
+003a12 3a13 .dw PFA_AND
+ PFA_AND:
+003a13 9109 ld temp0, Y+
+003a14 9119 ld temp1, Y+
+003a15 2380 and tosl, temp0
+003a16 2391 and tosh, temp1
+003a17 cdec jmp_ DO_NEXT
+ .include "words/or.asm"
+
+ ; Logic
+ ; logical or
+ VE_OR:
+003a18 ff02 .dw $ff02
+003a19 726f .db "or"
+003a1a 3a0e .dw VE_HEAD
+ .set VE_HEAD = VE_OR
+ XT_OR:
+003a1b 3a1c .dw PFA_OR
+ PFA_OR:
+003a1c 9109 ld temp0, Y+
+003a1d 9119 ld temp1, Y+
+003a1e 2b80 or tosl, temp0
+003a1f 2b91 or tosh, temp1
+003a20 cde3 jmp_ DO_NEXT
+
+ .include "words/xor.asm"
+
+ ; Logic
+ ; exclusive or
+ VE_XOR:
+003a21 ff03 .dw $ff03
+003a22 6f78
+003a23 0072 .db "xor",0
+003a24 3a18 .dw VE_HEAD
+ .set VE_HEAD = VE_XOR
+ XT_XOR:
+003a25 3a26 .dw PFA_XOR
+ PFA_XOR:
+003a26 9109 ld temp0, Y+
+003a27 9119 ld temp1, Y+
+003a28 2780 eor tosl, temp0
+003a29 2791 eor tosh, temp1
+003a2a cdd9 jmp_ DO_NEXT
+
+ .include "words/1plus.asm"
+
+ ; Arithmetics
+ ; optimized increment
+ VE_1PLUS:
+003a2b ff02 .dw $ff02
+003a2c 2b31 .db "1+"
+003a2d 3a21 .dw VE_HEAD
+ .set VE_HEAD = VE_1PLUS
+ XT_1PLUS:
+003a2e 3a2f .dw PFA_1PLUS
+ PFA_1PLUS:
+003a2f 9601 adiw tosl,1
+003a30 cdd3 jmp_ DO_NEXT
+ .include "words/1minus.asm"
+
+ ; Arithmetics
+ ; optimized decrement
+ VE_1MINUS:
+003a31 ff02 .dw $ff02
+003a32 2d31 .db "1-"
+003a33 3a2b .dw VE_HEAD
+ .set VE_HEAD = VE_1MINUS
+ XT_1MINUS:
+003a34 3a35 .dw PFA_1MINUS
+ PFA_1MINUS:
+003a35 9701 sbiw tosl, 1
+003a36 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:
+003a37 ff07 .dw $ff07
+003a38 6e3f
+003a39 6765
+003a3a 7461
+../../common\words/q-negate.asm(11): warning: .cseg .db misalignment - padding zero byte
+003a3b 0065 .db "?negate"
+003a3c 3a31 .dw VE_HEAD
+ .set VE_HEAD = VE_QNEGATE
+ XT_QNEGATE:
+003a3d 3800 .dw DO_COLON
+ PFA_QNEGATE:
+
+ .endif
+003a3e 3920
+003a3f 3835 .DW XT_ZEROLESS,XT_DOCONDBRANCH
+003a40 3a42 DEST(QNEG1)
+003a41 3e26 .DW XT_NEGATE
+003a42 381f QNEG1: .DW XT_EXIT
+ .include "words/lshift.asm"
+
+ ; Arithmetics
+ ; logically shift n1 left n2 times
+ VE_LSHIFT:
+003a43 ff06 .dw $ff06
+003a44 736c
+003a45 6968
+003a46 7466 .db "lshift"
+003a47 3a37 .dw VE_HEAD
+ .set VE_HEAD = VE_LSHIFT
+ XT_LSHIFT:
+003a48 3a49 .dw PFA_LSHIFT
+ PFA_LSHIFT:
+003a49 01fc movw zl, tosl
+003a4a 9189
+003a4b 9199 loadtos
+ PFA_LSHIFT1:
+003a4c 9731 sbiw zl, 1
+003a4d f01a brmi PFA_LSHIFT2
+003a4e 0f88 lsl tosl
+003a4f 1f99 rol tosh
+003a50 cffb rjmp PFA_LSHIFT1
+ PFA_LSHIFT2:
+003a51 cdb2 jmp_ DO_NEXT
+
+ .include "words/rshift.asm"
+
+ ; Arithmetics
+ ; shift n1 n2-times logically right
+ VE_RSHIFT:
+003a52 ff06 .dw $ff06
+003a53 7372
+003a54 6968
+003a55 7466 .db "rshift"
+003a56 3a43 .dw VE_HEAD
+ .set VE_HEAD = VE_RSHIFT
+ XT_RSHIFT:
+003a57 3a58 .dw PFA_RSHIFT
+ PFA_RSHIFT:
+003a58 01fc movw zl, tosl
+003a59 9189
+003a5a 9199 loadtos
+ PFA_RSHIFT1:
+003a5b 9731 sbiw zl, 1
+003a5c f01a brmi PFA_RSHIFT2
+003a5d 9596 lsr tosh
+003a5e 9587 ror tosl
+003a5f cffb rjmp PFA_RSHIFT1
+ PFA_RSHIFT2:
+003a60 cda3 jmp_ DO_NEXT
+
+ .include "words/plusstore.asm"
+
+ ; Arithmetics
+ ; add n to content of RAM address a-addr
+ VE_PLUSSTORE:
+003a61 ff02 .dw $ff02
+003a62 212b .db "+!"
+003a63 3a52 .dw VE_HEAD
+ .set VE_HEAD = VE_PLUSSTORE
+ XT_PLUSSTORE:
+003a64 3a65 .dw PFA_PLUSSTORE
+ PFA_PLUSSTORE:
+003a65 01fc movw zl, tosl
+003a66 9189
+003a67 9199 loadtos
+003a68 8120 ldd temp2, Z+0
+003a69 8131 ldd temp3, Z+1
+003a6a 0f82 add tosl, temp2
+003a6b 1f93 adc tosh, temp3
+003a6c 8380 std Z+0, tosl
+003a6d 8391 std Z+1, tosh
+003a6e 9189
+003a6f 9199 loadtos
+003a70 cd93 jmp_ DO_NEXT
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+ .include "words/rpfetch.asm"
+
+ ; Stack
+ ; current return stack pointer address
+ VE_RP_FETCH:
+003a71 ff03 .dw $ff03
+003a72 7072
+003a73 0040 .db "rp@",0
+003a74 3a61 .dw VE_HEAD
+ .set VE_HEAD = VE_RP_FETCH
+ XT_RP_FETCH:
+003a75 3a76 .dw PFA_RP_FETCH
+ PFA_RP_FETCH:
+003a76 939a
+003a77 938a savetos
+003a78 b78d in tosl, SPL
+003a79 b79e in tosh, SPH
+003a7a cd89 jmp_ DO_NEXT
+ .include "words/rpstore.asm"
+
+ ; Stack
+ ; set return stack pointer
+ VE_RP_STORE:
+003a7b ff03 .dw $ff03
+003a7c 7072
+003a7d 0021 .db "rp!",0
+003a7e 3a71 .dw VE_HEAD
+ .set VE_HEAD = VE_RP_STORE
+ XT_RP_STORE:
+003a7f 3a80 .dw PFA_RP_STORE
+ PFA_RP_STORE:
+003a80 b72f in temp2, SREG
+003a81 94f8 cli
+003a82 bf8d out SPL, tosl
+003a83 bf9e out SPH, tosh
+003a84 bf2f out SREG, temp2
+003a85 9189
+003a86 9199 loadtos
+003a87 cd7c jmp_ DO_NEXT
+ .include "words/spfetch.asm"
+
+ ; Stack
+ ; current data stack pointer
+ VE_SP_FETCH:
+003a88 ff03 .dw $ff03
+003a89 7073
+003a8a 0040 .db "sp@",0
+003a8b 3a7b .dw VE_HEAD
+ .set VE_HEAD = VE_SP_FETCH
+ XT_SP_FETCH:
+003a8c 3a8d .dw PFA_SP_FETCH
+ PFA_SP_FETCH:
+003a8d 939a
+003a8e 938a savetos
+003a8f 01ce movw tosl, yl
+003a90 cd73 jmp_ DO_NEXT
+ .include "words/spstore.asm"
+
+ ; Stack
+ ; set data stack pointer to addr
+ VE_SP_STORE:
+003a91 ff03 .dw $ff03
+003a92 7073
+003a93 0021 .db "sp!",0
+003a94 3a88 .dw VE_HEAD
+ .set VE_HEAD = VE_SP_STORE
+ XT_SP_STORE:
+003a95 3a96 .dw PFA_SP_STORE
+ PFA_SP_STORE:
+003a96 01ec movw yl, tosl
+003a97 9189
+003a98 9199 loadtos
+003a99 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:
+003a9a 3a9b .dw PFA_DODO
+ PFA_DODO:
+003a9b 9129 ld temp2, Y+
+003a9c 9139 ld temp3, Y+ ; limit
+ PFA_DODO1:
+003a9d e8e0 ldi zl, $80
+003a9e 0f3e add temp3, zl
+003a9f 1b82 sub tosl, temp2
+003aa0 0b93 sbc tosh, temp3
+
+003aa1 933f push temp3
+003aa2 932f push temp2 ; limit ( --> limit + $8000)
+003aa3 939f push tosh
+003aa4 938f push tosl ; start -> index ( --> index - (limit - $8000)
+003aa5 9189
+003aa6 9199 loadtos
+003aa7 cd5c jmp_ DO_NEXT
+ .include "words/i.asm"
+
+ ; Compiler
+ ; current loop counter
+ VE_I:
+003aa8 ff01 .dw $FF01
+003aa9 0069 .db "i",0
+003aaa 3a91 .dw VE_HEAD
+ .set VE_HEAD = VE_I
+ XT_I:
+003aab 3aac .dw PFA_I
+ PFA_I:
+003aac 939a
+003aad 938a savetos
+003aae 918f pop tosl
+003aaf 919f pop tosh ; index
+003ab0 91ef pop zl
+003ab1 91ff pop zh ; limit
+003ab2 93ff push zh
+003ab3 93ef push zl
+003ab4 939f push tosh
+003ab5 938f push tosl
+003ab6 0f8e add tosl, zl
+003ab7 1f9f adc tosh, zh
+003ab8 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:
+003ab9 3aba .dw PFA_DOPLUSLOOP
+ PFA_DOPLUSLOOP:
+003aba 91ef pop zl
+003abb 91ff pop zh
+003abc 0fe8 add zl, tosl
+003abd 1ff9 adc zh, tosh
+003abe 9189
+003abf 9199 loadtos
+003ac0 f01b brvs PFA_DOPLUSLOOP_LEAVE
+ ; next cycle
+ PFA_DOPLUSLOOP_NEXT:
+ ; next iteration
+003ac1 93ff push zh
+003ac2 93ef push zl
+003ac3 cd6b rjmp PFA_DOBRANCH ; read next cell from dictionary and jump to its destination
+ PFA_DOPLUSLOOP_LEAVE:
+003ac4 910f pop temp0
+003ac5 911f pop temp1 ; remove limit
+003ac6 9611 adiw xl, 1 ; skip branch-back address
+003ac7 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:
+003ac8 3ac9 .dw PFA_DOLOOP
+ PFA_DOLOOP:
+003ac9 91ef pop zl
+003aca 91ff pop zh
+003acb 9631 adiw zl,1
+003acc f3bb brvs PFA_DOPLUSLOOP_LEAVE
+003acd cff3 jmp_ PFA_DOPLUSLOOP_NEXT
+ .include "words/unloop.asm"
+
+ ; Compiler
+ ; remove loop-sys, exit the loop and continue execution after it
+ VE_UNLOOP:
+003ace ff06 .dw $ff06
+003acf 6e75
+003ad0 6f6c
+003ad1 706f .db "unloop"
+003ad2 3aa8 .dw VE_HEAD
+ .set VE_HEAD = VE_UNLOOP
+ XT_UNLOOP:
+003ad3 3ad4 .dw PFA_UNLOOP
+ PFA_UNLOOP:
+003ad4 911f pop temp1
+003ad5 910f pop temp0
+003ad6 911f pop temp1
+003ad7 910f pop temp0
+003ad8 cd2b jmp_ DO_NEXT
+
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+ .include "words/cmove_g.asm"
+
+ ; Memory
+ ; copy data in RAM from higher to lower addresses.
+ VE_CMOVE_G:
+003ad9 ff06 .dw $ff06
+003ada 6d63
+003adb 766f
+003adc 3e65 .db "cmove>"
+003add 3ace .dw VE_HEAD
+ .set VE_HEAD = VE_CMOVE_G
+ XT_CMOVE_G:
+003ade 3adf .dw PFA_CMOVE_G
+ PFA_CMOVE_G:
+003adf 93bf push xh
+003ae0 93af push xl
+003ae1 91e9 ld zl, Y+
+003ae2 91f9 ld zh, Y+ ; addr-to
+003ae3 91a9 ld xl, Y+
+003ae4 91b9 ld xh, Y+ ; addr-from
+003ae5 2f09 mov temp0, tosh
+003ae6 2b08 or temp0, tosl
+003ae7 f041 brbs 1, PFA_CMOVE_G1
+003ae8 0fe8 add zl, tosl
+003ae9 1ff9 adc zh, tosh
+003aea 0fa8 add xl, tosl
+003aeb 1fb9 adc xh, tosh
+ PFA_CMOVE_G2:
+003aec 911e ld temp1, -X
+003aed 9312 st -Z, temp1
+003aee 9701 sbiw tosl, 1
+003aef f7e1 brbc 1, PFA_CMOVE_G2
+ PFA_CMOVE_G1:
+003af0 91af pop xl
+003af1 91bf pop xh
+003af2 9189
+003af3 9199 loadtos
+003af4 cd0f jmp_ DO_NEXT
+ .include "words/byteswap.asm"
+
+ ; Arithmetics
+ ; exchange the bytes of the TOS
+ VE_BYTESWAP:
+003af5 ff02 .dw $ff02
+003af6 3c3e .db "><"
+003af7 3ad9 .dw VE_HEAD
+ .set VE_HEAD = VE_BYTESWAP
+ XT_BYTESWAP:
+003af8 3af9 .dw PFA_BYTESWAP
+ PFA_BYTESWAP:
+003af9 2f09 mov temp0, tosh
+003afa 2f98 mov tosh, tosl
+003afb 2f80 mov tosl, temp0
+003afc cd07 jmp_ DO_NEXT
+ .include "words/up.asm"
+
+ ; System Variable
+ ; get user area pointer
+ VE_UP_FETCH:
+003afd ff03 .dw $ff03
+003afe 7075
+003aff 0040 .db "up@",0
+003b00 3af5 .dw VE_HEAD
+ .set VE_HEAD = VE_UP_FETCH
+ XT_UP_FETCH:
+003b01 3b02 .dw PFA_UP_FETCH
+ PFA_UP_FETCH:
+003b02 939a
+003b03 938a savetos
+003b04 01c2 movw tosl, upl
+003b05 ccfe jmp_ DO_NEXT
+
+ ; ( addr -- )
+ ; System Variable
+ ; set user area pointer
+ VE_UP_STORE:
+003b06 ff03 .dw $ff03
+003b07 7075
+003b08 0021 .db "up!",0
+003b09 3afd .dw VE_HEAD
+ .set VE_HEAD = VE_UP_STORE
+ XT_UP_STORE:
+003b0a 3b0b .dw PFA_UP_STORE
+ PFA_UP_STORE:
+003b0b 012c movw upl, tosl
+003b0c 9189
+003b0d 9199 loadtos
+003b0e ccf5 jmp_ DO_NEXT
+ .include "words/1ms.asm"
+
+ ; Time
+ ; busy waits (almost) exactly 1 millisecond
+ VE_1MS:
+003b0f ff03 .dw $ff03
+003b10 6d31
+003b11 0073 .db "1ms",0
+003b12 3b06 .dw VE_HEAD
+ .set VE_HEAD = VE_1MS
+ XT_1MS:
+003b13 3b14 .dw PFA_1MS
+ PFA_1MS:
+003b14 eae0
+003b15 e0ff
+003b16 9731
+003b17 f7f1 delay 1000
+003b18 cceb jmp_ DO_NEXT
+ .include "words/2to_r.asm"
+
+ ; Stack
+ ; move DTOS to TOR
+ VE_2TO_R:
+003b19 ff03 .dw $ff03
+003b1a 3e32
+003b1b 0072 .db "2>r",0
+003b1c 3b0f .dw VE_HEAD
+ .set VE_HEAD = VE_2TO_R
+ XT_2TO_R:
+003b1d 3b1e .dw PFA_2TO_R
+ PFA_2TO_R:
+003b1e 01fc movw zl, tosl
+003b1f 9189
+003b20 9199 loadtos
+003b21 939f push tosh
+003b22 938f push tosl
+003b23 93ff push zh
+003b24 93ef push zl
+003b25 9189
+003b26 9199 loadtos
+003b27 ccdc jmp_ DO_NEXT
+ .include "words/2r_from.asm"
+
+ ; Stack
+ ; move DTOR to TOS
+ VE_2R_FROM:
+003b28 ff03 .dw $ff03
+003b29 7232
+003b2a 003e .db "2r>",0
+003b2b 3b19 .dw VE_HEAD
+ .set VE_HEAD = VE_2R_FROM
+ XT_2R_FROM:
+003b2c 3b2d .dw PFA_2R_FROM
+ PFA_2R_FROM:
+003b2d 939a
+003b2e 938a savetos
+003b2f 91ef pop zl
+003b30 91ff pop zh
+003b31 918f pop tosl
+003b32 919f pop tosh
+003b33 939a
+003b34 938a savetos
+003b35 01cf movw tosl, zl
+003b36 cccd jmp_ DO_NEXT
+
+ .include "words/store-e.asm"
+
+ ; Memory
+ ; write n (2bytes) to eeprom address
+ VE_STOREE:
+003b37 ff02 .dw $ff02
+003b38 6521 .db "!e"
+003b39 3b28 .dw VE_HEAD
+ .set VE_HEAD = VE_STOREE
+ XT_STOREE:
+003b3a 3b3b .dw PFA_STOREE
+ PFA_STOREE:
+ .if WANT_UNIFIED == 1
+ .endif
+ PFA_STOREE0:
+003b3b 01fc movw zl, tosl
+003b3c 9189
+003b3d 9199 loadtos
+003b3e b72f in_ temp2, SREG
+003b3f 94f8 cli
+003b40 d028 rcall PFA_FETCHE2
+003b41 b500 in_ temp0, EEDR
+003b42 1708 cp temp0,tosl
+003b43 f009 breq PFA_STOREE3
+003b44 d00b rcall PFA_STOREE1
+ PFA_STOREE3:
+003b45 9631 adiw zl,1
+003b46 d022 rcall PFA_FETCHE2
+003b47 b500 in_ temp0, EEDR
+003b48 1709 cp temp0,tosh
+003b49 f011 breq PFA_STOREE4
+003b4a 2f89 mov tosl, tosh
+003b4b d004 rcall PFA_STOREE1
+ PFA_STOREE4:
+003b4c bf2f out_ SREG, temp2
+003b4d 9189
+003b4e 9199 loadtos
+003b4f ccb4 jmp_ DO_NEXT
+
+ PFA_STOREE1:
+003b50 99f9 sbic EECR, EEPE
+003b51 cffe rjmp PFA_STOREE1
+
+ PFA_STOREE2: ; estore_wait_low_spm:
+003b52 b707 in_ temp0, SPMCSR
+003b53 fd00 sbrc temp0,SPMEN
+003b54 cffd rjmp PFA_STOREE2
+
+003b55 bdf2 out_ EEARH,zh
+003b56 bde1 out_ EEARL,zl
+003b57 bd80 out_ EEDR, tosl
+003b58 9afa sbi EECR,EEMPE
+003b59 9af9 sbi EECR,EEPE
+
+003b5a 9508 ret
+ .if WANT_UNIFIED == 1
+ .endif
+ .include "words/fetch-e.asm"
+
+ ; Memory
+ ; read 1 cell from eeprom
+ VE_FETCHE:
+003b5b ff02 .dw $ff02
+003b5c 6540 .db "@e"
+003b5d 3b37 .dw VE_HEAD
+ .set VE_HEAD = VE_FETCHE
+ XT_FETCHE:
+003b5e 3b5f .dw PFA_FETCHE
+ PFA_FETCHE:
+ .if WANT_UNIFIED == 1
+ .endif
+ PFA_FETCHE1:
+003b5f b72f in_ temp2, SREG
+003b60 94f8 cli
+003b61 01fc movw zl, tosl
+003b62 d006 rcall PFA_FETCHE2
+003b63 b580 in_ tosl, EEDR
+
+003b64 9631 adiw zl,1
+
+003b65 d003 rcall PFA_FETCHE2
+003b66 b590 in_ tosh, EEDR
+003b67 bf2f out_ SREG, temp2
+003b68 cc9b jmp_ DO_NEXT
+
+ PFA_FETCHE2:
+003b69 99f9 sbic EECR, EEPE
+003b6a cffe rjmp PFA_FETCHE2
+
+003b6b bdf2 out_ EEARH,zh
+003b6c bde1 out_ EEARL,zl
+
+003b6d 9af8 sbi EECR,EERE
+003b6e 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:
+003b6f ff02 .dw $ff02
+003b70 6921 .db "!i"
+003b71 3b5b .dw VE_HEAD
+ .set VE_HEAD = VE_STOREI
+ XT_STOREI:
+003b72 3dfe .dw PFA_DODEFER1
+ PFA_STOREI:
+003b73 0066 .dw EE_STOREI
+003b74 3d9f .dw XT_EDEFERFETCH
+003b75 3da9 .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:
+003b76 ff09 .dw $ff09
+003b77 2128
+003b78 2d69
+003b79 726e
+003b7a 7777
+003b7b 0029 .db "(!i-nrww)",0
+003b7c 3b6f .dw VE_HEAD
+ .set VE_HEAD = VE_DO_STOREI_NRWW
+ XT_DO_STOREI:
+003b7d 3b7e .dw PFA_DO_STOREI_NRWW
+ PFA_DO_STOREI_NRWW:
+ ; store status register
+003b7e b71f in temp1,SREG
+003b7f 931f push temp1
+003b80 94f8 cli
+
+003b81 019c movw temp2, tosl ; save the (word) address
+003b82 9189
+003b83 9199 loadtos ; get the new value for the flash cell
+003b84 93af push xl
+003b85 93bf push xh
+003b86 93cf push yl
+003b87 93df push yh
+003b88 d009 rcall DO_STOREI_atmega
+003b89 91df pop yh
+003b8a 91cf pop yl
+003b8b 91bf pop xh
+003b8c 91af pop xl
+ ; finally clear the stack
+003b8d 9189
+003b8e 9199 loadtos
+003b8f 911f pop temp1
+ ; restore status register (and interrupt enable flag)
+003b90 bf1f out SREG,temp1
+
+003b91 cc72 jmp_ DO_NEXT
+
+ ;
+ DO_STOREI_atmega:
+ ; write data to temp page buffer
+ ; use the values in tosl/tosh at the
+ ; appropiate place
+003b92 d010 rcall pageload
+
+ ; erase page if needed
+ ; it is needed if a bit goes from 0 to 1
+003b93 94e0 com temp4
+003b94 94f0 com temp5
+003b95 218e and tosl, temp4
+003b96 219f and tosh, temp5
+003b97 2b98 or tosh, tosl
+003b98 f019 breq DO_STOREI_writepage
+003b99 01f9 movw zl, temp2
+003b9a e002 ldi temp0,(1<<PGERS)
+003b9b d020 rcall dospm
+
+ DO_STOREI_writepage:
+ ; write page
+003b9c 01f9 movw zl, temp2
+003b9d e004 ldi temp0,(1<<PGWRT)
+003b9e d01d rcall dospm
+
+ ; reenable RWW section
+003b9f 01f9 movw zl, temp2
+003ba0 e100 ldi temp0,(1<<RWWSRE)
+003ba1 d01a rcall dospm
+003ba2 9508 ret
+
+ ; load the desired page
+ .equ pagemask = ~ ( PAGESIZE - 1 )
+ pageload:
+003ba3 01f9 movw zl, temp2
+ ; get the beginning of page
+003ba4 7ce0 andi zl,low(pagemask)
+003ba5 7fff andi zh,high(pagemask)
+003ba6 01ef movw y, z
+ ; loop counter (in words)
+003ba7 e4a0 ldi xl,low(pagesize)
+003ba8 e0b0 ldi xh,high(pagesize)
+ pageload_loop:
+ ; we need the current flash value anyways
+003ba9 01fe movw z, y
+003baa 0fee
+003bab 1fff
+003bac 9145
+003bad 9155 readflashcell temp6, temp7 ; destroys Z
+ ; now check: if Z points to the same cell as temp2/3, we want the new data
+003bae 01fe movw z, y
+003baf 17e2 cp zl, temp2
+003bb0 07f3 cpc zh, temp3
+003bb1 f011 breq pageload_newdata
+003bb2 010a movw r0, temp6
+003bb3 c002 rjmp pageload_cont
+ pageload_newdata:
+003bb4 017a movw temp4, temp6
+003bb5 010c movw r0, tosl
+ pageload_cont:
+003bb6 2700 clr temp0
+003bb7 d004 rcall dospm
+003bb8 9621 adiw y, 1
+003bb9 9711 sbiw x, 1
+003bba f771 brne pageload_loop
+
+ pageload_done:
+003bbb 9508 ret
+
+
+ ;; dospm
+ ;;
+ ;; execute spm instruction
+ ;; temp0 holds the value for SPMCR
+
+ dospm:
+ dospm_wait_ee:
+003bbc 99f9 sbic EECR, EEPE
+003bbd cffe rjmp dospm_wait_ee
+ dospm_wait_spm:
+003bbe b717 in_ temp1, SPMCSR
+003bbf fd10 sbrc temp1, SPMEN
+003bc0 cffd rjmp dospm_wait_spm
+
+ ; turn the word addres into a byte address
+003bc1 0fee
+003bc2 1fff writeflashcell
+ ; execute spm
+003bc3 6001 ori temp0, (1<<SPMEN)
+003bc4 bf07 out_ SPMCSR,temp0
+003bc5 95e8 spm
+003bc6 9508 ret
+ .endif
+ .include "words/fetch-i.asm"
+
+ ; Memory
+ ; read 1 cell from flash
+ VE_FETCHI:
+003bc7 ff02 .dw $ff02
+003bc8 6940 .db "@i"
+003bc9 3b76 .dw VE_HEAD
+ .set VE_HEAD = VE_FETCHI
+ XT_FETCHI:
+003bca 3bcb .dw PFA_FETCHI
+ PFA_FETCHI:
+003bcb 01fc movw zl, tosl
+003bcc 0fee
+003bcd 1fff
+003bce 9185
+003bcf 9195 readflashcell tosl,tosh
+003bd0 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:
+003bd1 ff03 .dw $ff03
+003bd2 3e6e
+003bd3 0072 .db "n>r",0
+003bd4 3bc7 .dw VE_HEAD
+ .set VE_HEAD = VE_N_TO_R
+ XT_N_TO_R:
+003bd5 3bd6 .dw PFA_N_TO_R
+ PFA_N_TO_R:
+003bd6 01fc movw zl, tosl
+003bd7 2f08 mov temp0, tosl
+ PFA_N_TO_R1:
+003bd8 9189
+003bd9 9199 loadtos
+003bda 939f push tosh
+003bdb 938f push tosl
+003bdc 950a dec temp0
+003bdd f7d1 brne PFA_N_TO_R1
+003bde 93ef push zl
+003bdf 93ff push zh
+003be0 9189
+003be1 9199 loadtos
+003be2 cc21 jmp_ DO_NEXT
+ .include "words/n_r_from.asm"
+
+ ; Stack
+ ; move n items from return stack to data stack
+ VE_N_R_FROM:
+003be3 ff03 .dw $ff03
+003be4 726e
+003be5 003e .db "nr>",0
+003be6 3bd1 .dw VE_HEAD
+ .set VE_HEAD = VE_N_R_FROM
+ XT_N_R_FROM:
+003be7 3be8 .dw PFA_N_R_FROM
+ PFA_N_R_FROM:
+003be8 939a
+003be9 938a savetos
+003bea 91ff pop zh
+003beb 91ef pop zl
+003bec 2f0e mov temp0, zl
+ PFA_N_R_FROM1:
+003bed 918f pop tosl
+003bee 919f pop tosh
+003bef 939a
+003bf0 938a savetos
+003bf1 950a dec temp0
+003bf2 f7d1 brne PFA_N_R_FROM1
+003bf3 01cf movw tosl, zl
+003bf4 cc0f jmp_ DO_NEXT
+ .include "words/d-2star.asm"
+
+ ; Arithmetics
+ ; shift a double cell left
+ VE_D2STAR:
+003bf5 ff03 .dw $ff03
+003bf6 3264
+003bf7 002a .db "d2*",0
+003bf8 3be3 .dw VE_HEAD
+ .set VE_HEAD = VE_D2STAR
+ XT_D2STAR:
+003bf9 3bfa .dw PFA_D2STAR
+ PFA_D2STAR:
+003bfa 9109 ld temp0, Y+
+003bfb 9119 ld temp1, Y+
+003bfc 0f00 lsl temp0
+003bfd 1f11 rol temp1
+003bfe 1f88 rol tosl
+003bff 1f99 rol tosh
+003c00 931a st -Y, temp1
+003c01 930a st -Y, temp0
+003c02 cc01 jmp_ DO_NEXT
+ .include "words/d-2slash.asm"
+
+ ; Arithmetics
+ ; shift a double cell value right
+ VE_D2SLASH:
+003c03 ff03 .dw $ff03
+003c04 3264
+003c05 002f .db "d2/",0
+003c06 3bf5 .dw VE_HEAD
+ .set VE_HEAD = VE_D2SLASH
+ XT_D2SLASH:
+003c07 3c08 .dw PFA_D2SLASH
+ PFA_D2SLASH:
+003c08 9109 ld temp0, Y+
+003c09 9119 ld temp1, Y+
+003c0a 9595 asr tosh
+003c0b 9587 ror tosl
+003c0c 9517 ror temp1
+003c0d 9507 ror temp0
+003c0e 931a st -Y, temp1
+003c0f 930a st -Y, temp0
+003c10 cbf3 jmp_ DO_NEXT
+ .include "words/d-plus.asm"
+
+ ; Arithmetics
+ ; add 2 double cell values
+ VE_DPLUS:
+003c11 ff02 .dw $ff02
+003c12 2b64 .db "d+"
+003c13 3c03 .dw VE_HEAD
+ .set VE_HEAD = VE_DPLUS
+ XT_DPLUS:
+003c14 3c15 .dw PFA_DPLUS
+ PFA_DPLUS:
+003c15 9129 ld temp2, Y+
+003c16 9139 ld temp3, Y+
+
+003c17 90e9 ld temp4, Y+
+003c18 90f9 ld temp5, Y+
+003c19 9149 ld temp6, Y+
+003c1a 9159 ld temp7, Y+
+
+003c1b 0f24 add temp2, temp6
+003c1c 1f35 adc temp3, temp7
+003c1d 1d8e adc tosl, temp4
+003c1e 1d9f adc tosh, temp5
+
+003c1f 933a st -Y, temp3
+003c20 932a st -Y, temp2
+003c21 cbe2 jmp_ DO_NEXT
+ .include "words/d-minus.asm"
+
+ ; Arithmetics
+ ; subtract d2 from d1
+ VE_DMINUS:
+003c22 ff02 .dw $ff02
+003c23 2d64 .db "d-"
+003c24 3c11 .dw VE_HEAD
+ .set VE_HEAD = VE_DMINUS
+ XT_DMINUS:
+003c25 3c26 .dw PFA_DMINUS
+ PFA_DMINUS:
+003c26 9129 ld temp2, Y+
+003c27 9139 ld temp3, Y+
+
+003c28 90e9 ld temp4, Y+
+003c29 90f9 ld temp5, Y+
+003c2a 9149 ld temp6, Y+
+003c2b 9159 ld temp7, Y+
+
+003c2c 1b42 sub temp6, temp2
+003c2d 0b53 sbc temp7, temp3
+003c2e 0ae8 sbc temp4, tosl
+003c2f 0af9 sbc temp5, tosh
+
+003c30 935a st -Y, temp7
+003c31 934a st -Y, temp6
+003c32 01c7 movw tosl, temp4
+003c33 cbd0 jmp_ DO_NEXT
+ .include "words/d-invert.asm"
+
+ ; Arithmetics
+ ; invert all bits in the double cell value
+ VE_DINVERT:
+003c34 ff07 .dw $ff07
+003c35 6964
+003c36 766e
+003c37 7265
+003c38 0074 .db "dinvert",0
+003c39 3c22 .dw VE_HEAD
+ .set VE_HEAD = VE_DINVERT
+ XT_DINVERT:
+003c3a 3c3b .dw PFA_DINVERT
+ PFA_DINVERT:
+003c3b 9109 ld temp0, Y+
+003c3c 9119 ld temp1, Y+
+003c3d 9580 com tosl
+003c3e 9590 com tosh
+003c3f 9500 com temp0
+003c40 9510 com temp1
+003c41 931a st -Y, temp1
+003c42 930a st -Y, temp0
+003c43 cbc0 jmp_ DO_NEXT
+ .include "words/slashmod.asm"
+
+ ; Arithmetics
+ ; signed division n1/n2 with remainder and quotient
+ VE_SLASHMOD:
+003c44 ff04 .dw $ff04
+003c45 6d2f
+003c46 646f .db "/mod"
+003c47 3c34 .dw VE_HEAD
+ .set VE_HEAD = VE_SLASHMOD
+ XT_SLASHMOD:
+003c48 3c49 .dw PFA_SLASHMOD
+ PFA_SLASHMOD:
+003c49 019c movw temp2, tosl
+
+003c4a 9109 ld temp0, Y+
+003c4b 9119 ld temp1, Y+
+
+003c4c 2f41 mov temp6,temp1 ;move dividend High to sign register
+003c4d 2743 eor temp6,temp3 ;xor divisor High with sign register
+003c4e ff17 sbrs temp1,7 ;if MSB in dividend set
+003c4f c004 rjmp PFA_SLASHMOD_1
+003c50 9510 com temp1 ; change sign of dividend
+003c51 9500 com temp0
+003c52 5f0f subi temp0,low(-1)
+003c53 4f1f sbci temp1,high(-1)
+ PFA_SLASHMOD_1:
+003c54 ff37 sbrs temp3,7 ;if MSB in divisor set
+003c55 c004 rjmp PFA_SLASHMOD_2
+003c56 9530 com temp3 ; change sign of divisor
+003c57 9520 com temp2
+003c58 5f2f subi temp2,low(-1)
+003c59 4f3f sbci temp3,high(-1)
+003c5a 24ee PFA_SLASHMOD_2: clr temp4 ;clear remainder Low byte
+003c5b 18ff sub temp5,temp5;clear remainder High byte and carry
+003c5c e151 ldi temp7,17 ;init loop counter
+
+003c5d 1f00 PFA_SLASHMOD_3: rol temp0 ;shift left dividend
+003c5e 1f11 rol temp1
+003c5f 955a dec temp7 ;decrement counter
+003c60 f439 brne PFA_SLASHMOD_5 ;if done
+003c61 ff47 sbrs temp6,7 ; if MSB in sign register set
+003c62 c004 rjmp PFA_SLASHMOD_4
+003c63 9510 com temp1 ; change sign of result
+003c64 9500 com temp0
+003c65 5f0f subi temp0,low(-1)
+003c66 4f1f sbci temp1,high(-1)
+003c67 c00b PFA_SLASHMOD_4: rjmp PFA_SLASHMODmod_done ; return
+003c68 1cee PFA_SLASHMOD_5: rol temp4 ;shift dividend into remainder
+003c69 1cff rol temp5
+003c6a 1ae2 sub temp4,temp2 ;remainder = remainder - divisor
+003c6b 0af3 sbc temp5,temp3 ;
+003c6c f420 brcc PFA_SLASHMOD_6 ;if result negative
+003c6d 0ee2 add temp4,temp2 ; restore remainder
+003c6e 1ef3 adc temp5,temp3
+003c6f 9488 clc ; clear carry to be shifted into result
+003c70 cfec rjmp PFA_SLASHMOD_3 ;else
+003c71 9408 PFA_SLASHMOD_6: sec ; set carry to be shifted into result
+003c72 cfea rjmp PFA_SLASHMOD_3
+
+ PFA_SLASHMODmod_done:
+ ; put remainder on stack
+003c73 92fa st -Y,temp5
+003c74 92ea st -Y,temp4
+
+ ; put quotient on stack
+003c75 01c8 movw tosl, temp0
+003c76 cb8d jmp_ DO_NEXT
+ .include "words/abs.asm"
+
+ ; DUP ?NEGATE ;
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_ABS:
+003c77 ff03 .dw $ff03
+003c78 6261
+003c79 0073 .db "abs",0
+003c7a 3c44 .dw VE_HEAD
+ .set VE_HEAD = VE_ABS
+ XT_ABS:
+003c7b 3800 .dw DO_COLON
+ PFA_ABS:
+
+ .endif
+
+003c7c 38b0
+003c7d 3a3d
+003c7e 381f .DW XT_DUP,XT_QNEGATE,XT_EXIT
+ .include "words/pick.asm"
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_PICK:
+003c7f ff04 .dw $ff04
+003c80 6970
+003c81 6b63 .db "pick"
+003c82 3c77 .dw VE_HEAD
+ .set VE_HEAD = VE_PICK
+ XT_PICK:
+003c83 3800 .dw DO_COLON
+ PFA_PICK:
+ .endif
+003c84 3a2e .dw XT_1PLUS
+003c85 3ec3 .dw XT_CELLS
+003c86 3a8c .dw XT_SP_FETCH
+003c87 399c .dw XT_PLUS
+003c88 3878 .dw XT_FETCH
+003c89 381f .dw XT_EXIT
+ .include "words/cellplus.asm"
+
+ ; Arithmetics
+ ; add the size of an address-unit to a-addr1
+ VE_CELLPLUS:
+003c8a ff05 .dw $ff05
+003c8b 6563
+003c8c 6c6c
+003c8d 002b .db "cell+",0
+003c8e 3c7f .dw VE_HEAD
+ .set VE_HEAD = VE_CELLPLUS
+ XT_CELLPLUS:
+003c8f 3c90 .dw PFA_CELLPLUS
+ PFA_CELLPLUS:
+003c90 9602 adiw tosl, CELLSIZE
+003c91 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:
+003c92 ff04 .dw $ff04
+003c93 692b
+003c94 746e .db "+int"
+003c95 3c8a .dw VE_HEAD
+ .set VE_HEAD = VE_INTON
+ XT_INTON:
+003c96 3c97 .dw PFA_INTON
+ PFA_INTON:
+003c97 9478 sei
+003c98 cb6b jmp_ DO_NEXT
+ .include "words/int-off.asm"
+
+ ; Interrupt
+ ; turns off all interrupts
+ VE_INTOFF:
+003c99 ff04 .dw $ff04
+003c9a 692d
+003c9b 746e .db "-int"
+003c9c 3c92 .dw VE_HEAD
+ .set VE_HEAD = VE_INTOFF
+ XT_INTOFF:
+003c9d 3c9e .dw PFA_INTOFF
+ PFA_INTOFF:
+003c9e 94f8 cli
+003c9f cb64 jmp_ DO_NEXT
+ .include "words/int-store.asm"
+
+ ; Interrupt
+ ; stores XT as interrupt vector i
+ VE_INTSTORE:
+003ca0 ff04 .dw $ff04
+003ca1 6e69
+003ca2 2174 .db "int!"
+003ca3 3c99 .dw VE_HEAD
+ .set VE_HEAD = VE_INTSTORE
+ XT_INTSTORE:
+003ca4 3800 .dw DO_COLON
+ PFA_INTSTORE:
+003ca5 383c .dw XT_DOLITERAL
+003ca6 0000 .dw intvec
+003ca7 399c .dw XT_PLUS
+003ca8 3b3a .dw XT_STOREE
+003ca9 381f .dw XT_EXIT
+ .include "words/int-fetch.asm"
+
+ ; Interrupt
+ ; fetches XT from interrupt vector i
+ VE_INTFETCH:
+003caa ff04 .dw $ff04
+003cab 6e69
+003cac 4074 .db "int@"
+003cad 3ca0 .dw VE_HEAD
+ .set VE_HEAD = VE_INTFETCH
+ XT_INTFETCH:
+003cae 3800 .dw DO_COLON
+ PFA_INTFETCH:
+003caf 383c .dw XT_DOLITERAL
+003cb0 0000 .dw intvec
+003cb1 399c .dw XT_PLUS
+003cb2 3b5e .dw XT_FETCHE
+003cb3 381f .dw XT_EXIT
+ .include "words/int-trap.asm"
+
+ ; Interrupt
+ ; trigger an interrupt
+ VE_INTTRAP:
+003cb4 ff08 .dw $ff08
+003cb5 6e69
+003cb6 2d74
+003cb7 7274
+003cb8 7061 .db "int-trap"
+003cb9 3caa .dw VE_HEAD
+ .set VE_HEAD = VE_INTTRAP
+ XT_INTTRAP:
+003cba 3cbb .dw PFA_INTTRAP
+ PFA_INTTRAP:
+003cbb 2eb8 mov isrflag, tosl
+003cbc 9189
+003cbd 9199 loadtos
+003cbe 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:
+003cbf 3800 .dw DO_COLON
+ PFA_ISREXEC:
+003cc0 3cae .dw XT_INTFETCH
+003cc1 3829 .dw XT_EXECUTE
+003cc2 3cc4 .dw XT_ISREND
+003cc3 381f .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:
+003cc4 3cc5 .dw PFA_ISREND
+ PFA_ISREND:
+003cc5 d001 rcall PFA_ISREND1 ; clear the interrupt flag for the controller
+003cc6 cb3d jmp_ DO_NEXT
+ PFA_ISREND1:
+003cc7 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:
+003cc8 3800 .dw DO_COLON
+ PFA_DEFAULT_PROMPTOK:
+003cc9 0395 .dw XT_DOSLITERAL
+003cca 0003 .dw 3
+003ccb 6f20
+003ccc 006b .db " ok",0
+ .endif
+003ccd 03c8 .dw XT_ITYPE
+003cce 381f .dw XT_EXIT
+
+ ; ------------------------
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_PROMPTOK:
+003ccf ff03 .dw $FF03
+003cd0 6f2e
+../../common\words/prompt-ok.asm(43): warning: .cseg .db misalignment - padding zero byte
+003cd1 006b .db ".ok"
+003cd2 3cb4 .dw VE_HEAD
+ .set VE_HEAD = VE_PROMPTOK
+ XT_PROMPTOK:
+003cd3 3dfe .dw PFA_DODEFER1
+ PFA_PROMPTOK:
+ .endif
+003cd4 001c .dw USER_P_OK
+003cd5 3dc7 .dw XT_UDEFERFETCH
+003cd6 3dd3 .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:
+003cd7 3800 .dw DO_COLON
+ PFA_DEFAULT_PROMPTREADY:
+003cd8 0395 .dw XT_DOSLITERAL
+003cd9 0002 .dw 2
+003cda 203e .db "> "
+ .endif
+003cdb 3fa0 .dw XT_CR
+003cdc 03c8 .dw XT_ITYPE
+003cdd 381f .dw XT_EXIT
+
+ ; ------------------------
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_PROMPTREADY:
+003cde ff06 .dw $FF06
+003cdf 722e
+003ce0 6165
+003ce1 7964 .db ".ready"
+003ce2 3ccf .dw VE_HEAD
+ .set VE_HEAD = VE_PROMPTREADY
+ XT_PROMPTREADY:
+003ce3 3dfe .dw PFA_DODEFER1
+ PFA_PROMPTREADY:
+ .endif
+003ce4 0020 .dw USER_P_RDY
+003ce5 3dc7 .dw XT_UDEFERFETCH
+003ce6 3dd3 .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:
+003ce7 3800 .dw DO_COLON
+ PFA_DEFAULT_PROMPTERROR:
+003ce8 0395 .dw XT_DOSLITERAL
+003ce9 0004 .dw 4
+003cea 3f20
+003ceb 203f .db " ?? "
+ .endif
+003cec 03c8 .dw XT_ITYPE
+003ced 3ebc .dw XT_BASE
+003cee 3878 .dw XT_FETCH
+003cef 38fe .dw XT_TO_R
+003cf0 3f40 .dw XT_DECIMAL
+003cf1 034a .dw XT_DOT
+003cf2 3ee1 .dw XT_TO_IN
+003cf3 3878 .dw XT_FETCH
+003cf4 034a .dw XT_DOT
+003cf5 38f5 .dw XT_R_FROM
+003cf6 3ebc .dw XT_BASE
+003cf7 3880 .dw XT_STORE
+003cf8 381f .dw XT_EXIT
+
+ ; ------------------------
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_PROMPTERROR:
+003cf9 ff06 .dw $FF06
+003cfa 652e
+003cfb 7272
+003cfc 726f .db ".error"
+003cfd 3cde .dw VE_HEAD
+ .set VE_HEAD = VE_PROMPTERROR
+ XT_PROMPTERROR:
+003cfe 3dfe .dw PFA_DODEFER1
+ PFA_PROMPTERROR:
+ .endif
+003cff 001e .dw USER_P_ERR
+003d00 3dc7 .dw XT_UDEFERFETCH
+003d01 3dd3 .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:
+003d02 ff04 .dw $ff04
+003d03 7571
+003d04 7469 .db "quit"
+003d05 3cf9 .dw VE_HEAD
+ .set VE_HEAD = VE_QUIT
+ XT_QUIT:
+003d06 3800 .dw DO_COLON
+ .endif
+ PFA_QUIT:
+003d07 0821
+003d08 0828
+003d09 3880 .dw XT_LP0,XT_LP,XT_STORE
+003d0a 059a .dw XT_SP0
+003d0b 3a95 .dw XT_SP_STORE
+003d0c 05a7 .dw XT_RP0
+003d0d 3a7f .dw XT_RP_STORE
+003d0e 08b6 .dw XT_LBRACKET
+
+ PFA_QUIT2:
+003d0f 3eb6 .dw XT_STATE
+003d10 3878 .dw XT_FETCH
+003d11 3919 .dw XT_ZEROEQUAL
+003d12 3835 .dw XT_DOCONDBRANCH
+003d13 3d15 DEST(PFA_QUIT4)
+003d14 3ce3 .dw XT_PROMPTREADY
+ PFA_QUIT4:
+003d15 04ae .dw XT_REFILL
+003d16 3835 .dw XT_DOCONDBRANCH
+003d17 3d27 DEST(PFA_QUIT3)
+003d18 383c .dw XT_DOLITERAL
+003d19 05f5 .dw XT_INTERPRET
+003d1a 3d6f .dw XT_CATCH
+003d1b 38b8 .dw XT_QDUP
+003d1c 3835 .dw XT_DOCONDBRANCH
+003d1d 3d27 DEST(PFA_QUIT3)
+003d1e 38b0 .dw XT_DUP
+003d1f 383c .dw XT_DOLITERAL
+003d20 fffe .dw -2
+003d21 396d .dw XT_LESS
+003d22 3835 .dw XT_DOCONDBRANCH
+003d23 3d25 DEST(PFA_QUIT5)
+003d24 3cfe .dw XT_PROMPTERROR
+ PFA_QUIT5:
+003d25 382e .dw XT_DOBRANCH
+003d26 3d07 DEST(PFA_QUIT)
+ PFA_QUIT3:
+003d27 3cd3 .dw XT_PROMPTOK
+003d28 382e .dw XT_DOBRANCH
+003d29 3d0f 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:
+003d2a ff05 .dw $ff05
+003d2b 6170
+003d2c 7375
+003d2d 0065 .db "pause",0
+003d2e 3d02 .dw VE_HEAD
+ .set VE_HEAD = VE_PAUSE
+ XT_PAUSE:
+003d2f 3dfe .dw PFA_DODEFER1
+ PFA_PAUSE:
+003d30 0192 .dw ram_pause
+003d31 3db3 .dw XT_RDEFERFETCH
+003d32 3dbd .dw XT_RDEFERSTORE
+
+ .dseg
+000192 ram_pause: .byte 2
+ .cseg
+ .include "words/cold.asm"
+
+ ; System
+ ; start up amforth.
+ VE_COLD:
+003d33 ff04 .dw $ff04
+003d34 6f63
+003d35 646c .db "cold"
+003d36 3d2a .dw VE_HEAD
+ .set VE_HEAD = VE_COLD
+ XT_COLD:
+003d37 3d38 .dw PFA_COLD
+ PFA_COLD:
+003d38 b6a4 in_ mcu_boot, MCUSR
+003d39 2422 clr zerol
+003d3a 2433 clr zeroh
+003d3b 24bb clr isrflag
+003d3c be24 out_ MCUSR, zerol
+ ; clear RAM
+003d3d e0e0 ldi zl, low(ramstart)
+003d3e e0f1 ldi zh, high(ramstart)
+ clearloop:
+003d3f 9221 st Z+, zerol
+003d40 30e0 cpi zl, low(sram_size+ramstart)
+003d41 f7e9 brne clearloop
+003d42 30f9 cpi zh, high(sram_size+ramstart)
+003d43 f7d9 brne clearloop
+ ; init first user data area
+ ; allocate space for User Area
+ .dseg
+000194 ram_user1: .byte SYSUSERSIZE + APPUSERSIZE
+ .cseg
+003d44 e9e4 ldi zl, low(ram_user1)
+003d45 e0f1 ldi zh, high(ram_user1)
+003d46 012f movw upl, zl
+ ; init return stack pointer
+003d47 ef0f ldi temp0,low(rstackstart)
+003d48 bf0d out_ SPL,temp0
+003d49 8304 std Z+4, temp0
+003d4a e018 ldi temp1,high(rstackstart)
+003d4b bf1e out_ SPH,temp1
+003d4c 8315 std Z+5, temp1
+
+ ; init parameter stack pointer
+003d4d eacf ldi yl,low(stackstart)
+003d4e 83c6 std Z+6, yl
+003d4f e0d8 ldi yh,high(stackstart)
+003d50 83d7 std Z+7, yh
+
+ ; load Forth IP with starting word
+003d51 e5a9 ldi XL, low(PFA_WARM)
+003d52 e3bd ldi XH, high(PFA_WARM)
+ ; its a far jump...
+003d53 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:
+003d54 ff04 .dw $ff04
+003d55 6177
+003d56 6d72 .db "warm"
+003d57 3d33 .dw VE_HEAD
+ .set VE_HEAD = VE_WARM
+ XT_WARM:
+003d58 3800 .dw DO_COLON
+ PFA_WARM:
+ .endif
+003d59 0267 .dw XT_INIT_RAM
+003d5a 383c .dw XT_DOLITERAL
+003d5b 0159 .dw XT_NOOP
+003d5c 383c .dw XT_DOLITERAL
+003d5d 3d2f .dw XT_PAUSE
+003d5e 3dde .dw XT_DEFERSTORE
+003d5f 08b6 .dw XT_LBRACKET
+003d60 3f5b .dw XT_TURNKEY
+003d61 3d06 .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:
+003d62 ff07 .dw $ff07
+003d63 6168
+003d64 646e
+003d65 656c
+003d66 0072 .db "handler",0
+003d67 3d54 .dw VE_HEAD
+ .set VE_HEAD = VE_HANDLER
+ XT_HANDLER:
+003d68 3857 .dw PFA_DOUSER
+ PFA_HANDLER:
+ .endif
+003d69 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:
+003d6a ff05 .dw $ff05
+003d6b 6163
+003d6c 6374
+003d6d 0068 .db "catch",0
+003d6e 3d62 .dw VE_HEAD
+ .set VE_HEAD = VE_CATCH
+ XT_CATCH:
+003d6f 3800 .dw DO_COLON
+ PFA_CATCH:
+ .endif
+
+ ; sp@ >r
+003d70 3a8c .dw XT_SP_FETCH
+003d71 38fe .dw XT_TO_R
+ ; handler @ >r
+003d72 3d68 .dw XT_HANDLER
+003d73 3878 .dw XT_FETCH
+003d74 38fe .dw XT_TO_R
+ ; rp@ handler !
+003d75 3a75 .dw XT_RP_FETCH
+003d76 3d68 .dw XT_HANDLER
+003d77 3880 .dw XT_STORE
+003d78 3829 .dw XT_EXECUTE
+ ; r> handler !
+003d79 38f5 .dw XT_R_FROM
+003d7a 3d68 .dw XT_HANDLER
+003d7b 3880 .dw XT_STORE
+003d7c 38f5 .dw XT_R_FROM
+003d7d 38d8 .dw XT_DROP
+003d7e 3953 .dw XT_ZERO
+003d7f 381f .dw XT_EXIT
+ .include "words/throw.asm"
+
+ ; Exceptions
+ ; throw an exception
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_THROW:
+003d80 ff05 .dw $ff05
+003d81 6874
+003d82 6f72
+003d83 0077 .db "throw",0
+003d84 3d6a .dw VE_HEAD
+ .set VE_HEAD = VE_THROW
+ XT_THROW:
+003d85 3800 .dw DO_COLON
+ PFA_THROW:
+ .endif
+003d86 38b0 .dw XT_DUP
+003d87 3919 .dw XT_ZEROEQUAL
+003d88 3835 .dw XT_DOCONDBRANCH
+003d89 3d8c DEST(PFA_THROW1)
+003d8a 38d8 .dw XT_DROP
+003d8b 381f .dw XT_EXIT
+ PFA_THROW1:
+003d8c 3d68 .dw XT_HANDLER
+003d8d 3878 .dw XT_FETCH
+003d8e 3a7f .dw XT_RP_STORE
+003d8f 38f5 .dw XT_R_FROM
+003d90 3d68 .dw XT_HANDLER
+003d91 3880 .dw XT_STORE
+003d92 38f5 .dw XT_R_FROM
+003d93 38c3 .dw XT_SWAP
+003d94 38fe .dw XT_TO_R
+003d95 3a95 .dw XT_SP_STORE
+003d96 38d8 .dw XT_DROP
+003d97 38f5 .dw XT_R_FROM
+003d98 381f .dw XT_EXIT
+
+
+
+ .include "words/edefer-fetch.asm"
+
+ ; System
+ ; does the real defer@ for eeprom defers
+ VE_EDEFERFETCH:
+003d99 ff07 .dw $ff07
+003d9a 6445
+003d9b 6665
+003d9c 7265
+003d9d 0040 .db "Edefer@",0
+003d9e 3d80 .dw VE_HEAD
+ .set VE_HEAD = VE_EDEFERFETCH
+ XT_EDEFERFETCH:
+003d9f 3800 .dw DO_COLON
+ PFA_EDEFERFETCH:
+003da0 3bca .dw XT_FETCHI
+003da1 3b5e .dw XT_FETCHE
+003da2 381f .dw XT_EXIT
+ .include "words/edefer-store.asm"
+
+ ; System
+ ; does the real defer! for eeprom defers
+ VE_EDEFERSTORE:
+003da3 ff07 .dw $ff07
+003da4 6445
+003da5 6665
+003da6 7265
+003da7 0021 .db "Edefer!",0
+003da8 3d99 .dw VE_HEAD
+ .set VE_HEAD = VE_EDEFERSTORE
+ XT_EDEFERSTORE:
+003da9 3800 .dw DO_COLON
+ PFA_EDEFERSTORE:
+003daa 3bca .dw XT_FETCHI
+003dab 3b3a .dw XT_STOREE
+003dac 381f .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:
+003dad ff07 .dw $ff07
+003dae 6452
+003daf 6665
+003db0 7265
+003db1 0040 .db "Rdefer@",0
+003db2 3da3 .dw VE_HEAD
+ .set VE_HEAD = VE_RDEFERFETCH
+ XT_RDEFERFETCH:
+003db3 3800 .dw DO_COLON
+ PFA_RDEFERFETCH:
+ .endif
+003db4 3bca .dw XT_FETCHI
+003db5 3878 .dw XT_FETCH
+003db6 381f .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:
+003db7 ff07 .dw $ff07
+003db8 6452
+003db9 6665
+003dba 7265
+003dbb 0021 .db "Rdefer!",0
+003dbc 3dad .dw VE_HEAD
+ .set VE_HEAD = VE_RDEFERSTORE
+ XT_RDEFERSTORE:
+003dbd 3800 .dw DO_COLON
+ PFA_RDEFERSTORE:
+ .endif
+003dbe 3bca .dw XT_FETCHI
+003dbf 3880 .dw XT_STORE
+003dc0 381f .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:
+003dc1 ff07 .dw $ff07
+003dc2 6455
+003dc3 6665
+003dc4 7265
+003dc5 0040 .db "Udefer@",0
+003dc6 3db7 .dw VE_HEAD
+ .set VE_HEAD = VE_UDEFERFETCH
+ XT_UDEFERFETCH:
+003dc7 3800 .dw DO_COLON
+ PFA_UDEFERFETCH:
+ .endif
+003dc8 3bca .dw XT_FETCHI
+003dc9 3b01 .dw XT_UP_FETCH
+003dca 399c .dw XT_PLUS
+003dcb 3878 .dw XT_FETCH
+003dcc 381f .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:
+003dcd ff07 .dw $ff07
+003dce 6455
+003dcf 6665
+003dd0 7265
+003dd1 0021 .db "Udefer!",0
+003dd2 3dc1 .dw VE_HEAD
+ .set VE_HEAD = VE_UDEFERSTORE
+ XT_UDEFERSTORE:
+003dd3 3800 .dw DO_COLON
+ PFA_UDEFERSTORE:
+ .endif
+
+003dd4 3bca .dw XT_FETCHI
+003dd5 3b01 .dw XT_UP_FETCH
+003dd6 399c .dw XT_PLUS
+003dd7 3880 .dw XT_STORE
+003dd8 381f .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:
+003dd9 ff06 .dw $ff06
+003dda 6564
+003ddb 6566
+003ddc 2172 .db "defer!"
+003ddd 3dcd .dw VE_HEAD
+ .set VE_HEAD = VE_DEFERSTORE
+ XT_DEFERSTORE:
+003dde 3800 .dw DO_COLON
+ PFA_DEFERSTORE:
+ .endif
+003ddf 3fcf .dw XT_TO_BODY
+003de0 38b0 .dw XT_DUP
+003de1 0185 .dw XT_ICELLPLUS
+003de2 0185 .dw XT_ICELLPLUS
+003de3 3bca .dw XT_FETCHI
+003de4 3829 .dw XT_EXECUTE
+003de5 381f .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:
+003de6 ff06 .dw $ff06
+003de7 6564
+003de8 6566
+003de9 4072 .db "defer@"
+003dea 3dd9 .dw VE_HEAD
+ .set VE_HEAD = VE_DEFERFETCH
+ XT_DEFERFETCH:
+003deb 3800 .dw DO_COLON
+ PFA_DEFERFETCH:
+ .endif
+003dec 3fcf .dw XT_TO_BODY
+003ded 38b0 .dw XT_DUP
+003dee 0185 .dw XT_ICELLPLUS
+003def 3bca .dw XT_FETCHI
+003df0 3829 .dw XT_EXECUTE
+003df1 381f .dw XT_EXIT
+ .include "words/do-defer.asm"
+
+ ; System
+ ; runtime of defer
+ VE_DODEFER:
+003df2 ff07 .dw $ff07
+003df3 6428
+003df4 6665
+003df5 7265
+003df6 0029 .db "(defer)", 0
+003df7 3de6 .dw VE_HEAD
+ .set VE_HEAD = VE_DODEFER
+ XT_DODEFER:
+003df8 3800 .dw DO_COLON
+ PFA_DODEFER:
+003df9 06fe .dw XT_DOCREATE
+003dfa 085e .dw XT_REVEAL
+003dfb 0721 .dw XT_COMPILE
+003dfc 3dfe .dw PFA_DODEFER1
+003dfd 381f .dw XT_EXIT
+ PFA_DODEFER1:
+003dfe 940e 0877 call_ DO_DODOES
+003e00 38b0 .dw XT_DUP
+003e01 0185 .dw XT_ICELLPLUS
+003e02 3bca .dw XT_FETCHI
+003e03 3829 .dw XT_EXECUTE
+003e04 3829 .dw XT_EXECUTE
+003e05 381f .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:
+003e06 ff02 .dw $ff02
+003e07 2e75 .db "u."
+003e08 3df2 .dw VE_HEAD
+ .set VE_HEAD = VE_UDOT
+ XT_UDOT:
+003e09 3800 .dw DO_COLON
+ PFA_UDOT:
+ .endif
+003e0a 3953 .dw XT_ZERO
+003e0b 0352 .dw XT_UDDOT
+003e0c 381f .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:
+003e0d ff03 .dw $ff03
+003e0e 2e75
+003e0f 0072 .db "u.r",0
+003e10 3e06 .dw VE_HEAD
+ .set VE_HEAD = VE_UDOTR
+ XT_UDOTR:
+003e11 3800 .dw DO_COLON
+ PFA_UDOTR:
+ .endif
+003e12 3953 .dw XT_ZERO
+003e13 38c3 .dw XT_SWAP
+003e14 035b .dw XT_UDDOTR
+003e15 381f .dw XT_EXIT
+ ; : u.r ( s n -- ) 0 swap ud.r ;
+
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+ .include "words/uslashmod.asm"
+
+ ; Arithmetics
+ ; unsigned division with remainder
+ VE_USLASHMOD:
+003e16 ff05 .dw $ff05
+003e17 2f75
+003e18 6f6d
+003e19 0064 .db "u/mod",0
+003e1a 3e0d .dw VE_HEAD
+ .set VE_HEAD = VE_USLASHMOD
+ XT_USLASHMOD:
+003e1b 3800 .dw DO_COLON
+ PFA_USLASHMOD:
+003e1c 38fe .dw XT_TO_R
+003e1d 3953 .dw XT_ZERO
+003e1e 38f5 .dw XT_R_FROM
+003e1f 39c1 .dw XT_UMSLASHMOD
+003e20 381f .dw XT_EXIT
+ .include "words/negate.asm"
+
+ ; Logic
+ ; 2-complement
+ VE_NEGATE:
+003e21 ff06 .dw $ff06
+003e22 656e
+003e23 6167
+003e24 6574 .db "negate"
+003e25 3e16 .dw VE_HEAD
+ .set VE_HEAD = VE_NEGATE
+ XT_NEGATE:
+003e26 3800 .dw DO_COLON
+ PFA_NEGATE:
+003e27 39fc .dw XT_INVERT
+003e28 3a2e .dw XT_1PLUS
+003e29 381f .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:
+003e2a ff01 .dw $ff01
+003e2b 002f .db "/",0
+003e2c 3e21 .dw VE_HEAD
+ .set VE_HEAD = VE_SLASH
+ XT_SLASH:
+003e2d 3800 .dw DO_COLON
+ PFA_SLASH:
+ .endif
+003e2e 3c48 .dw XT_SLASHMOD
+003e2f 38ef .dw XT_NIP
+003e30 381f .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:
+003e31 ff03 .dw $ff03
+003e32 6f6d
+003e33 0064 .db "mod",0
+003e34 3e2a .dw VE_HEAD
+ .set VE_HEAD = VE_MOD
+ XT_MOD:
+003e35 3800 .dw DO_COLON
+ PFA_MOD:
+ .endif
+003e36 3c48 .dw XT_SLASHMOD
+003e37 38d8 .dw XT_DROP
+003e38 381f .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:
+003e39 ff03 .dw $ff03
+003e3a 696d
+003e3b 006e .db "min",0
+003e3c 3e31 .dw VE_HEAD
+ .set VE_HEAD = VE_MIN
+ XT_MIN:
+003e3d 3800 .dw DO_COLON
+ PFA_MIN:
+ .endif
+003e3e 3ec8 .dw XT_2DUP
+003e3f 3977 .dw XT_GREATER
+003e40 3835 .dw XT_DOCONDBRANCH
+003e41 3e43 DEST(PFA_MIN1)
+003e42 38c3 .dw XT_SWAP
+ PFA_MIN1:
+003e43 38d8 .dw XT_DROP
+003e44 381f .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:
+003e45 ff03 .dw $ff03
+003e46 616d
+003e47 0078 .db "max",0
+003e48 3e39 .dw VE_HEAD
+ .set VE_HEAD = VE_MAX
+ XT_MAX:
+003e49 3800 .dw DO_COLON
+ PFA_MAX:
+
+ .endif
+003e4a 3ec8 .dw XT_2DUP
+003e4b 396d .dw XT_LESS
+003e4c 3835 .dw XT_DOCONDBRANCH
+003e4d 3e4f DEST(PFA_MAX1)
+003e4e 38c3 .dw XT_SWAP
+ PFA_MAX1:
+003e4f 38d8 .dw XT_DROP
+003e50 381f .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:
+003e51 ff06 .dw $ff06
+003e52 6977
+003e53 6874
+003e54 6e69 .db "within"
+003e55 3e45 .dw VE_HEAD
+ .set VE_HEAD = VE_WITHIN
+ XT_WITHIN:
+003e56 3800 .dw DO_COLON
+ PFA_WITHIN:
+ .endif
+003e57 38ce .dw XT_OVER
+003e58 3992 .dw XT_MINUS
+003e59 38fe .dw XT_TO_R
+003e5a 3992 .dw XT_MINUS
+003e5b 38f5 .dw XT_R_FROM
+003e5c 395b .dw XT_ULESS
+003e5d 381f .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:
+003e5e ff0d .dw $ff0d
+003e5f 6873
+003e60 776f
+003e61 772d
+003e62 726f
+003e63 6c64
+003e64 7369
+003e65 0074 .db "show-wordlist",0
+003e66 3e51 .dw VE_HEAD
+ .set VE_HEAD = VE_SHOWWORDLIST
+ XT_SHOWWORDLIST:
+003e67 3800 .dw DO_COLON
+ PFA_SHOWWORDLIST:
+ .endif
+003e68 383c .dw XT_DOLITERAL
+003e69 3e6d .dw XT_SHOWWORD
+003e6a 38c3 .dw XT_SWAP
+003e6b 069f .dw XT_TRAVERSEWORDLIST
+003e6c 381f .dw XT_EXIT
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ XT_SHOWWORD:
+003e6d 3800 .dw DO_COLON
+ PFA_SHOWWORD:
+ .endif
+003e6e 06ba .dw XT_NAME2STRING
+003e6f 03c8 .dw XT_ITYPE
+003e70 3fad .dw XT_SPACE ; ( -- addr n)
+003e71 394a .dw XT_TRUE
+003e72 381f .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:
+003e73 ff05 .dw $ff05
+003e74 6f77
+003e75 6472
+003e76 0073 .db "words",0
+003e77 3e5e .dw VE_HEAD
+ .set VE_HEAD = VE_WORDS
+ XT_WORDS:
+003e78 3800 .dw DO_COLON
+ PFA_WORDS:
+ .endif
+003e79 383c .dw XT_DOLITERAL
+003e7a 004c .dw CFG_ORDERLISTLEN+2
+003e7b 3b5e .dw XT_FETCHE
+003e7c 3e67 .dw XT_SHOWWORDLIST
+003e7d 381f .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:
+003e7e 0002 .dw $0002
+003e7f 222e .db ".",$22
+003e80 3e73 .dw VE_HEAD
+ .set VE_HEAD = VE_DOTSTRING
+ XT_DOTSTRING:
+003e81 3800 .dw DO_COLON
+ PFA_DOTSTRING:
+ .endif
+003e82 3e89 .dw XT_SQUOTE
+003e83 0721 .dw XT_COMPILE
+003e84 03c8 .dw XT_ITYPE
+003e85 381f .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:
+003e86 0002 .dw $0002
+003e87 2273 .db "s",$22
+003e88 3e7e .dw VE_HEAD
+ .set VE_HEAD = VE_SQUOTE
+ XT_SQUOTE:
+003e89 3800 .dw DO_COLON
+ PFA_SQUOTE:
+ .endif
+003e8a 383c .dw XT_DOLITERAL
+003e8b 0022 .dw 34 ; 0x22
+003e8c 0553 .dw XT_PARSE ; ( -- addr n)
+003e8d 3eb6 .dw XT_STATE
+003e8e 3878 .dw XT_FETCH
+003e8f 3835 .dw XT_DOCONDBRANCH
+003e90 3e92 DEST(PFA_SQUOTE1)
+003e91 074d .dw XT_SLITERAL
+ PFA_SQUOTE1:
+003e92 381f .dw XT_EXIT
+ .include "words/fill.asm"
+
+ ; Memory
+ ; fill u bytes memory beginning at a-addr with character c
+ VE_FILL:
+003e93 ff04 .dw $ff04
+003e94 6966
+003e95 6c6c .db "fill"
+003e96 3e86 .dw VE_HEAD
+ .set VE_HEAD = VE_FILL
+ XT_FILL:
+003e97 3800 .dw DO_COLON
+ PFA_FILL:
+003e98 38e0 .dw XT_ROT
+003e99 38e0 .dw XT_ROT
+003e9a 38b8
+003e9b 3835 .dw XT_QDUP,XT_DOCONDBRANCH
+003e9c 3ea4 DEST(PFA_FILL2)
+003e9d 3f98 .dw XT_BOUNDS
+003e9e 3a9a .dw XT_DODO
+ PFA_FILL1:
+003e9f 38b0 .dw XT_DUP
+003ea0 3aab .dw XT_I
+003ea1 388c .dw XT_CSTORE ; ( -- c c-addr)
+003ea2 3ac8 .dw XT_DOLOOP
+003ea3 3e9f .dw PFA_FILL1
+ PFA_FILL2:
+003ea4 38d8 .dw XT_DROP
+003ea5 381f .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:
+003ea6 ff05 .dw $ff05
+003ea7 5f66
+003ea8 7063
+003ea9 0075 .db "f_cpu",0
+003eaa 3e93 .dw VE_HEAD
+ .set VE_HEAD = VE_F_CPU
+ XT_F_CPU:
+003eab 3800 .dw DO_COLON
+ PFA_F_CPU:
+ .endif
+003eac 383c .dw XT_DOLITERAL
+003ead 2400 .dw (F_CPU % 65536)
+003eae 383c .dw XT_DOLITERAL
+003eaf 00f4 .dw (F_CPU / 65536)
+003eb0 381f .dw XT_EXIT
+ .include "words/state.asm"
+
+ ; System Variable
+ ; system state
+ VE_STATE:
+003eb1 ff05 .dw $ff05
+003eb2 7473
+003eb3 7461
+003eb4 0065 .db "state",0
+003eb5 3ea6 .dw VE_HEAD
+ .set VE_HEAD = VE_STATE
+ XT_STATE:
+003eb6 3847 .dw PFA_DOVARIABLE
+ PFA_STATE:
+003eb7 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:
+003eb8 ff04 .dw $ff04
+003eb9 6162
+003eba 6573 .db "base"
+003ebb 3eb1 .dw VE_HEAD
+ .set VE_HEAD = VE_BASE
+ XT_BASE:
+003ebc 3857 .dw PFA_DOUSER
+ PFA_BASE:
+ .endif
+003ebd 000c .dw USER_BASE
+
+ .include "words/cells.asm"
+
+ ; Arithmetics
+ ; n2 is the size in address units of n1 cells
+ VE_CELLS:
+003ebe ff05 .dw $ff05
+003ebf 6563
+003ec0 6c6c
+003ec1 0073 .db "cells",0
+003ec2 3eb8 .dw VE_HEAD
+ .set VE_HEAD = VE_CELLS
+ XT_CELLS:
+003ec3 3a0b .dw PFA_2STAR
+
+ .include "words/2dup.asm"
+
+ ; Stack
+ ; Duplicate the 2 top elements
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_2DUP:
+003ec4 ff04 .dw $ff04
+003ec5 6432
+003ec6 7075 .db "2dup"
+003ec7 3ebe .dw VE_HEAD
+ .set VE_HEAD = VE_2DUP
+ XT_2DUP:
+003ec8 3800 .dw DO_COLON
+ PFA_2DUP:
+ .endif
+
+003ec9 38ce .dw XT_OVER
+003eca 38ce .dw XT_OVER
+003ecb 381f .dw XT_EXIT
+ .include "words/2drop.asm"
+
+ ; Stack
+ ; Remove the 2 top elements
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_2DROP:
+003ecc ff05 .dw $ff05
+003ecd 6432
+003ece 6f72
+003ecf 0070 .db "2drop",0
+003ed0 3ec4 .dw VE_HEAD
+ .set VE_HEAD = VE_2DROP
+ XT_2DROP:
+003ed1 3800 .dw DO_COLON
+ PFA_2DROP:
+ .endif
+003ed2 38d8 .dw XT_DROP
+003ed3 38d8 .dw XT_DROP
+003ed4 381f .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:
+003ed5 ff04 .dw $ff04
+003ed6 7574
+003ed7 6b63 .db "tuck"
+003ed8 3ecc .dw VE_HEAD
+ .set VE_HEAD = VE_TUCK
+ XT_TUCK:
+003ed9 3800 .dw DO_COLON
+ PFA_TUCK:
+ .endif
+003eda 38c3 .dw XT_SWAP
+003edb 38ce .dw XT_OVER
+003edc 381f .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:
+003edd ff03 .dw $ff03
+003ede 693e
+003edf 006e .db ">in",0
+003ee0 3ed5 .dw VE_HEAD
+ .set VE_HEAD = VE_TO_IN
+ XT_TO_IN:
+003ee1 3857 .dw PFA_DOUSER
+ PFA_TO_IN:
+ .endif
+003ee2 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:
+003ee3 ff03 .dw $ff03
+003ee4 6170
+003ee5 0064 .db "pad",0
+003ee6 3edd .dw VE_HEAD
+ .set VE_HEAD = VE_PAD
+ XT_PAD:
+003ee7 3800 .dw DO_COLON
+ PFA_PAD:
+ .endif
+003ee8 3f22 .dw XT_HERE
+003ee9 383c .dw XT_DOLITERAL
+003eea 0028 .dw 40
+003eeb 399c .dw XT_PLUS
+003eec 381f .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:
+003eed ff04 .dw $ff04
+003eee 6d65
+003eef 7469 .db "emit"
+003ef0 3ee3 .dw VE_HEAD
+ .set VE_HEAD = VE_EMIT
+ XT_EMIT:
+003ef1 3dfe .dw PFA_DODEFER1
+ PFA_EMIT:
+ .endif
+003ef2 000e .dw USER_EMIT
+003ef3 3dc7 .dw XT_UDEFERFETCH
+003ef4 3dd3 .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:
+003ef5 ff05 .dw $ff05
+003ef6 6d65
+003ef7 7469
+003ef8 003f .db "emit?",0
+003ef9 3eed .dw VE_HEAD
+ .set VE_HEAD = VE_EMITQ
+ XT_EMITQ:
+003efa 3dfe .dw PFA_DODEFER1
+ PFA_EMITQ:
+ .endif
+003efb 0010 .dw USER_EMITQ
+003efc 3dc7 .dw XT_UDEFERFETCH
+003efd 3dd3 .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:
+003efe ff03 .dw $ff03
+003eff 656b
+003f00 0079 .db "key",0
+003f01 3ef5 .dw VE_HEAD
+ .set VE_HEAD = VE_KEY
+ XT_KEY:
+003f02 3dfe .dw PFA_DODEFER1
+ PFA_KEY:
+ .endif
+003f03 0012 .dw USER_KEY
+003f04 3dc7 .dw XT_UDEFERFETCH
+003f05 3dd3 .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:
+003f06 ff04 .dw $ff04
+003f07 656b
+003f08 3f79 .db "key?"
+003f09 3efe .dw VE_HEAD
+ .set VE_HEAD = VE_KEYQ
+ XT_KEYQ:
+003f0a 3dfe .dw PFA_DODEFER1
+ PFA_KEYQ:
+ .endif
+003f0b 0014 .dw USER_KEYQ
+003f0c 3dc7 .dw XT_UDEFERFETCH
+003f0d 3dd3 .dw XT_UDEFERSTORE
+
+ .include "words/dp.asm"
+
+ ; System Value
+ ; address of the next free dictionary cell
+ VE_DP:
+003f0e ff02 .dw $ff02
+003f0f 7064 .db "dp"
+003f10 3f06 .dw VE_HEAD
+ .set VE_HEAD = VE_DP
+ XT_DP:
+003f11 386e .dw PFA_DOVALUE1
+ PFA_DP:
+003f12 0036 .dw CFG_DP
+003f13 3d9f .dw XT_EDEFERFETCH
+003f14 3da9 .dw XT_EDEFERSTORE
+ .include "words/ehere.asm"
+
+ ; System Value
+ ; address of the next free address in eeprom
+ VE_EHERE:
+003f15 ff05 .dw $ff05
+003f16 6865
+003f17 7265
+003f18 0065 .db "ehere",0
+003f19 3f0e .dw VE_HEAD
+ .set VE_HEAD = VE_EHERE
+ XT_EHERE:
+003f1a 386e .dw PFA_DOVALUE1
+ PFA_EHERE:
+003f1b 003a .dw EE_EHERE
+003f1c 3d9f .dw XT_EDEFERFETCH
+003f1d 3da9 .dw XT_EDEFERSTORE
+ .include "words/here.asm"
+
+ ; System Value
+ ; address of the next free data space (RAM) cell
+ VE_HERE:
+003f1e ff04 .dw $ff04
+003f1f 6568
+003f20 6572 .db "here"
+003f21 3f15 .dw VE_HEAD
+ .set VE_HEAD = VE_HERE
+ XT_HERE:
+003f22 386e .dw PFA_DOVALUE1
+ PFA_HERE:
+003f23 0038 .dw EE_HERE
+003f24 3d9f .dw XT_EDEFERFETCH
+003f25 3da9 .dw XT_EDEFERSTORE
+ .include "words/allot.asm"
+
+ ; System
+ ; allocate or release memory in RAM
+ VE_ALLOT:
+003f26 ff05 .dw $ff05
+003f27 6c61
+003f28 6f6c
+003f29 0074 .db "allot",0
+003f2a 3f1e .dw VE_HEAD
+ .set VE_HEAD = VE_ALLOT
+ XT_ALLOT:
+003f2b 3800 .dw DO_COLON
+ PFA_ALLOT:
+003f2c 3f22 .dw XT_HERE
+003f2d 399c .dw XT_PLUS
+003f2e 0173 .dw XT_DOTO
+003f2f 3f23 .dw PFA_HERE
+003f30 381f .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:
+003f31 ff03 .dw $ff03
+003f32 6962
+003f33 006e .db "bin",0
+003f34 3f26 .dw VE_HEAD
+ .set VE_HEAD = VE_BIN
+ XT_BIN:
+003f35 3800 .dw DO_COLON
+ PFA_BIN:
+ .endif
+003f36 3fea .dw XT_TWO
+003f37 3ebc .dw XT_BASE
+003f38 3880 .dw XT_STORE
+003f39 381f .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:
+003f3a ff07 .dw $ff07
+003f3b 6564
+003f3c 6963
+003f3d 616d
+003f3e 006c .db "decimal",0
+003f3f 3f31 .dw VE_HEAD
+ .set VE_HEAD = VE_DECIMAL
+ XT_DECIMAL:
+003f40 3800 .dw DO_COLON
+ PFA_DECIMAL:
+ .endif
+003f41 383c .dw XT_DOLITERAL
+003f42 000a .dw 10
+003f43 3ebc .dw XT_BASE
+003f44 3880 .dw XT_STORE
+003f45 381f .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:
+003f46 ff03 .dw $ff03
+003f47 6568
+003f48 0078 .db "hex",0
+003f49 3f3a .dw VE_HEAD
+ .set VE_HEAD = VE_HEX
+ XT_HEX:
+003f4a 3800 .dw DO_COLON
+ PFA_HEX:
+ .endif
+003f4b 383c .dw XT_DOLITERAL
+003f4c 0010 .dw 16
+003f4d 3ebc .dw XT_BASE
+003f4e 3880 .dw XT_STORE
+003f4f 381f .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:
+003f50 ff02 .dw $ff02
+003f51 6c62 .db "bl"
+003f52 3f46 .dw VE_HEAD
+ .set VE_HEAD = VE_BL
+ XT_BL:
+003f53 3847 .dw PFA_DOVARIABLE
+ PFA_BL:
+ .endif
+003f54 0020 .dw 32
+
+ .include "words/turnkey.asm"
+
+ ; System Value
+ ; Deferred action during startup/reset
+ VE_TURNKEY:
+003f55 ff07 .dw $ff07
+003f56 7574
+003f57 6e72
+003f58 656b
+003f59 0079 .db "turnkey",0
+003f5a 3f50 .dw VE_HEAD
+ .set VE_HEAD = VE_TURNKEY
+ XT_TURNKEY:
+003f5b 3dfe .dw PFA_DODEFER1
+ PFA_TURNKEY:
+003f5c 0042 .dw CFG_TURNKEY
+003f5d 3d9f .dw XT_EDEFERFETCH
+003f5e 3da9 .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:
+003f5f ff07 .dw $ff07
+003f60 6f74
+003f61 7075
+003f62 6570
+003f63 0072 .db "toupper",0
+003f64 3f55 .dw VE_HEAD
+ .set VE_HEAD = VE_TOUPPER
+ XT_TOUPPER:
+003f65 3800 .dw DO_COLON
+ PFA_TOUPPER:
+ .endif
+003f66 38b0 .dw XT_DUP
+003f67 383c .dw XT_DOLITERAL
+003f68 0061 .dw 'a'
+003f69 383c .dw XT_DOLITERAL
+003f6a 007b .dw 'z'+1
+003f6b 3e56 .dw XT_WITHIN
+003f6c 3835 .dw XT_DOCONDBRANCH
+003f6d 3f71 DEST(PFA_TOUPPER0)
+003f6e 383c .dw XT_DOLITERAL
+003f6f 00df .dw 223 ; inverse of 0x20: 0xdf
+003f70 3a12 .dw XT_AND
+ PFA_TOUPPER0:
+003f71 381f .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:
+003f72 ff07 .dw $ff07
+003f73 6f74
+003f74 6f6c
+003f75 6577
+003f76 0072 .db "tolower",0
+003f77 3f5f .dw VE_HEAD
+ .set VE_HEAD = VE_TOLOWER
+ XT_TOLOWER:
+003f78 3800 .dw DO_COLON
+ PFA_TOLOWER:
+ .endif
+003f79 38b0 .dw XT_DUP
+003f7a 383c .dw XT_DOLITERAL
+003f7b 0041 .dw 'A'
+003f7c 383c .dw XT_DOLITERAL
+003f7d 005b .dw 'Z'+1
+003f7e 3e56 .dw XT_WITHIN
+003f7f 3835 .dw XT_DOCONDBRANCH
+003f80 3f84 DEST(PFA_TOLOWER0)
+003f81 383c .dw XT_DOLITERAL
+003f82 0020 .dw 32
+003f83 3a1b .dw XT_OR
+ PFA_TOLOWER0:
+003f84 381f .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:
+003f85 ff06 .dw $ff06
+003f86 733f
+003f87 6174
+003f88 6b63 .db "?stack"
+003f89 3f72 .dw VE_HEAD
+ .set VE_HEAD = VE_QSTACK
+ XT_QSTACK:
+003f8a 3800 .dw DO_COLON
+ PFA_QSTACK:
+ .endif
+003f8b 05b2 .dw XT_DEPTH
+003f8c 3920 .dw XT_ZEROLESS
+003f8d 3835 .dw XT_DOCONDBRANCH
+003f8e 3f92 DEST(PFA_QSTACK1)
+003f8f 383c .dw XT_DOLITERAL
+003f90 fffc .dw -4
+003f91 3d85 .dw XT_THROW
+ PFA_QSTACK1:
+003f92 381f .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:
+003f93 ff06 .dw $ff06
+003f94 6f62
+003f95 6e75
+003f96 7364 .db "bounds"
+003f97 3f85 .dw VE_HEAD
+ .set VE_HEAD = VE_BOUNDS
+ XT_BOUNDS:
+003f98 3800 .dw DO_COLON
+ PFA_BOUNDS:
+ .endif
+003f99 38ce .dw XT_OVER
+003f9a 399c .dw XT_PLUS
+003f9b 38c3 .dw XT_SWAP
+003f9c 381f .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:
+003f9d ff02 .dw 0xff02
+003f9e 7263 .db "cr"
+003f9f 3f93 .dw VE_HEAD
+ .set VE_HEAD = VE_CR
+ XT_CR:
+003fa0 3800 .dw DO_COLON
+ PFA_CR:
+ .endif
+
+003fa1 383c .dw XT_DOLITERAL
+003fa2 000d .dw 13
+003fa3 3ef1 .dw XT_EMIT
+003fa4 383c .dw XT_DOLITERAL
+003fa5 000a .dw 10
+003fa6 3ef1 .dw XT_EMIT
+003fa7 381f .dw XT_EXIT
+ .include "words/space.asm"
+
+ ; Character IO
+ ; emits a space (bl)
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_SPACE:
+003fa8 ff05 .dw $ff05
+003fa9 7073
+003faa 6361
+003fab 0065 .db "space",0
+003fac 3f9d .dw VE_HEAD
+ .set VE_HEAD = VE_SPACE
+ XT_SPACE:
+003fad 3800 .dw DO_COLON
+ PFA_SPACE:
+ .endif
+003fae 3f53 .dw XT_BL
+003faf 3ef1 .dw XT_EMIT
+003fb0 381f .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:
+003fb1 ff06 .dw $ff06
+003fb2 7073
+003fb3 6361
+003fb4 7365 .db "spaces"
+003fb5 3fa8 .dw VE_HEAD
+ .set VE_HEAD = VE_SPACES
+ XT_SPACES:
+003fb6 3800 .dw DO_COLON
+ PFA_SPACES:
+
+ .endif
+ ;C SPACES n -- output n spaces
+ ; BEGIN DUP 0> WHILE SPACE 1- REPEAT DROP ;
+003fb7 3953
+003fb8 3e49 .DW XT_ZERO, XT_MAX
+003fb9 38b0
+003fba 3835 SPCS1: .DW XT_DUP,XT_DOCONDBRANCH
+003fbb 3fc0 DEST(SPCS2)
+003fbc 3fad
+003fbd 3a34
+003fbe 382e .DW XT_SPACE,XT_1MINUS,XT_DOBRANCH
+003fbf 3fb9 DEST(SPCS1)
+003fc0 38d8
+003fc1 381f 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:
+003fc2 ff03 .dw $ff03
+003fc3 3e73
+003fc4 0064 .db "s>d",0
+003fc5 3fb1 .dw VE_HEAD
+ .set VE_HEAD = VE_S2D
+ XT_S2D:
+003fc6 3800 .dw DO_COLON
+ PFA_S2D:
+ .endif
+003fc7 38b0 .dw XT_DUP
+003fc8 3920 .dw XT_ZEROLESS
+003fc9 381f .dw XT_EXIT
+ .include "words/to-body.asm"
+
+ ; Core
+ ; get body from XT
+ VE_TO_BODY:
+003fca ff05 .dw $ff05
+003fcb 623e
+003fcc 646f
+003fcd 0079 .db ">body",0
+003fce 3fc2 .dw VE_HEAD
+ .set VE_HEAD = VE_TO_BODY
+ XT_TO_BODY:
+003fcf 3a2f .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:
+003fd0 0008 .dw $0008
+003fd1 6c32
+003fd2 7469
+003fd3 7265
+003fd4 6c61 .db "2literal"
+003fd5 3fca .dw VE_HEAD
+ .set VE_HEAD = VE_2LITERAL
+ XT_2LITERAL:
+003fd6 3800 .dw DO_COLON
+ PFA_2LITERAL:
+ .endif
+003fd7 38c3 .dw XT_SWAP
+003fd8 0742 .dw XT_LITERAL
+003fd9 0742 .dw XT_LITERAL
+003fda 381f .dw XT_EXIT
+ .include "words/equal.asm"
+
+ ; Compare
+ ; compares two values for equality
+ VE_EQUAL:
+003fdb ff01 .dw $ff01
+003fdc 003d .db "=",0
+003fdd 3fd0 .dw VE_HEAD
+ .set VE_HEAD = VE_EQUAL
+ XT_EQUAL:
+003fde 3800 .dw DO_COLON
+ PFA_EQUAL:
+003fdf 3992 .dw XT_MINUS
+003fe0 3919 .dw XT_ZEROEQUAL
+003fe1 381f .dw XT_EXIT
+ .include "words/num-constants.asm"
+
+ .endif
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_ONE:
+003fe2 ff01 .dw $ff01
+003fe3 0031 .db "1",0
+003fe4 3fdb .dw VE_HEAD
+ .set VE_HEAD = VE_ONE
+ XT_ONE:
+003fe5 3847 .dw PFA_DOVARIABLE
+ PFA_ONE:
+ .endif
+003fe6 0001 .DW 1
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_TWO:
+003fe7 ff01 .dw $ff01
+003fe8 0032 .db "2",0
+003fe9 3fe2 .dw VE_HEAD
+ .set VE_HEAD = VE_TWO
+ XT_TWO:
+003fea 3847 .dw PFA_DOVARIABLE
+ PFA_TWO:
+ .endif
+003feb 0002 .DW 2
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_MINUSONE:
+003fec ff02 .dw $ff02
+003fed 312d .db "-1"
+003fee 3fe7 .dw VE_HEAD
+ .set VE_HEAD = VE_MINUSONE
+ XT_MINUSONE:
+003fef 3847 .dw PFA_DOVARIABLE
+ PFA_MINUSONE:
+ .endif
+003ff0 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 7f 0a 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 93 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 71 0a CFG_TURNKEY: .dw XT_APPLTURNKEY ; TURNKEY
+000044 c4 02 CFG_ENVIRONMENT:.dw VE_ENVHEAD ; environmental queries
+000046 48 00 CFG_CURRENT: .dw CFG_FORTHWORDLIST ; forth-wordlist
+000048 ec 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 35 06 .dw XT_REC_FIND
+000060 21 06 .dw XT_REC_NUM
+000062 .byte (NUMRECOGNIZERS-2)*CELLSIZE ; two slots are already used
+
+ EE_STOREI:
+000066 7d 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 3c 02 .dw XT_SOURCETIB ; USER_SOURCE
+000082 00 00 .dw 0 ; USER_G_IN
+000084 29 02 .dw XT_REFILLTIB ; USER_REFILL
+000086 c8 3c .dw XT_DEFAULT_PROMPTOK
+000088 e7 3c .dw XT_DEFAULT_PROMPTERROR
+00008a d7 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 : 9 r3 : 12 r4 : 4 r5 : 1 r6 : 0 r7 : 0
+r8 : 0 r9 : 0 r10: 1 r11: 6 r12: 0 r13: 0 r14: 22 r15: 20
+r16: 78 r17: 57 r18: 52 r19: 37 r20: 13 r21: 11 r22: 11 r23: 3
+r24: 187 r25: 133 r26: 28 r27: 17 r28: 7 r29: 4 r30: 78 r31: 40
+x : 4 y : 203 z : 41
+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 : 2 brcs : 1 break : 0 breq : 6 brge : 1 brhc : 0
+brhs : 0 brid : 0 brie : 0 brlo : 1 brlt : 3 brmi : 3
+brne : 13 brpl : 0 brsh : 0 brtc : 0 brts : 0 brvc : 0
+brvs : 2 bset : 0 bst : 0 call : 2 cbi : 0 cbr : 0
+clc : 1 clh : 0 cli : 5 cln : 0 clr : 13 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 : 14 inc : 3 jmp : 7
+ld : 136 ldd : 4 ldi : 27 lds : 1 lpm : 16 lsl : 14
+lsr : 2 mov : 15 movw : 65 mul : 5 muls : 1 mulsu : 2
+neg : 0 nop : 0 or : 9 ori : 1 out : 16 pop : 45
+push : 39 rcall : 38 ret : 6 reti : 1 rjmp : 103 rol : 23
+ror : 5 sbc : 9 sbci : 3 sbi : 3 sbic : 3 sbis : 0
+sbiw : 7 sbr : 0 sbrc : 4 sbrs : 3 sec : 1 seh : 0
+sei : 1 sen : 0 ser : 3 ses : 0 set : 0 sev : 0
+sez : 0 sleep : 0 spm : 2 st : 74 std : 8 sts : 1
+sub : 6 subi : 3 swap : 0 tst : 0 wdr : 0
+Instructions used: 70 out of 113 (61.9%)
+
+"ATmega328P" memory use summary [bytes]:
+Segment Begin End Code Data Used Size Use%
+---------------------------------------------------------------
+[.cseg] 0x000000 0x007fe2 1834 11624 13458 32768 41.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/arduino/duemilanove.map b/amforth-6.5/appl/arduino/duemilanove.map
new file mode 100644
index 0000000..0184ed7
--- /dev/null
+++ b/amforth-6.5/appl/arduino/duemilanove.map
@@ -0,0 +1,2021 @@
+
+AVRASM ver. 2.1.52 duemilanove.asm Sun Apr 30 20:10:13 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 000000dd
+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 00000001
+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 0000000a
+SET VE_HEAD 00003fec
+SET VE_ENVHEAD 000002c4
+SET AMFORTH_RO_SEG 00003800
+EQU F_CPU 00f42400
+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 00003804
+CSEG VE_ISR_RX 00000054
+CSEG XT_ISR_RX 00000059
+CSEG DO_COLON 00003800
+CSEG usart_rx_isr 0000005a
+CSEG XT_DOLITERAL 0000383c
+CSEG XT_CFETCH 00003897
+CSEG XT_DUP 000038b0
+CSEG XT_EQUAL 00003fde
+CSEG XT_DOCONDBRANCH 00003835
+CSEG usart_rx_isr1 00000064
+CSEG XT_COLD 00003d37
+CSEG XT_EXIT 0000381f
+CSEG XT_USART_INIT_RX_BUFFER 00000066
+CSEG PFA_USART_INIT_RX_BUFFER 00000067
+CSEG XT_INTSTORE 00003ca4
+CSEG XT_ZERO 00003953
+CSEG XT_FILL 00003e97
+CSEG VE_RX_BUFFER 00000073
+CSEG XT_RX_BUFFER 00000078
+CSEG PFA_RX_BUFFER 00000079
+CSEG XT_RXQ_BUFFER 00000093
+CSEG XT_PLUS 0000399c
+CSEG XT_SWAP 000038c3
+CSEG XT_1PLUS 00003a2e
+CSEG XT_AND 00003a12
+CSEG XT_CSTORE 0000388c
+CSEG VE_RXQ_BUFFER 0000008d
+CSEG PFA_RXQ_BUFFER 00000094
+CSEG XT_PAUSE 00003d2f
+CSEG XT_NOTEQUAL 00003912
+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 0000386e
+CSEG PFA_UBRR 000000bf
+ESEG EE_UBRRVAL 0000008c
+CSEG XT_EDEFERFETCH 00003d9f
+CSEG XT_EDEFERSTORE 00003da9
+CSEG VE_USART 000000c2
+CSEG XT_USART 000000c7
+CSEG PFA_USART 000000c8
+CSEG XT_BYTESWAP 00003af8
+SET AMFORTH_NRWW_SIZE 00000ffe
+SET corepc 000000dd
+CSEG PFA_COLD 00003d38
+ESEG intvec 00000000
+DSEG intcnt 00000112
+CSEG VE_MPLUS 000000f4
+CSEG XT_MPLUS 000000f7
+CSEG PFA_MPLUS 000000f8
+CSEG XT_S2D 00003fc6
+CSEG XT_DPLUS 00003c14
+CSEG VE_UDSTAR 000000fb
+CSEG XT_UDSTAR 000000ff
+CSEG PFA_UDSTAR 00000100
+CSEG XT_TO_R 000038fe
+CSEG XT_UMSTAR 000039df
+CSEG XT_DROP 000038d8
+CSEG XT_R_FROM 000038f5
+CSEG XT_ROT 000038e0
+CSEG VE_UMAX 0000010a
+CSEG XT_UMAX 0000010e
+CSEG PFA_UMAX 0000010f
+CSEG XT_2DUP 00003ec8
+CSEG XT_ULESS 0000395b
+CSEG UMAX1 00000114
+CSEG VE_UMIN 00000116
+CSEG XT_UMIN 0000011a
+CSEG PFA_UMIN 0000011b
+CSEG XT_UGREATER 00003966
+CSEG UMIN1 00000120
+CSEG XT_IMMEDIATEQ 00000122
+CSEG PFA_IMMEDIATEQ 00000123
+CSEG XT_ZEROEQUAL 00003919
+CSEG IMMEDIATEQ1 0000012b
+CSEG XT_ONE 00003fe5
+CSEG XT_TRUE 0000394a
+CSEG VE_NAME2FLAGS 0000012d
+CSEG XT_NAME2FLAGS 00000134
+CSEG PFA_NAME2FLAGS 00000135
+CSEG XT_FETCHI 00003bca
+CSEG VE_DOT_VER 0000013a
+CSEG XT_DOT_VER 0000013e
+CSEG PFA_DOT_VER 0000013f
+CSEG XT_ENV_FORTHNAME 0000029f
+CSEG XT_ITYPE 000003c8
+CSEG XT_SPACE 00003fad
+CSEG XT_BASE 00003ebc
+CSEG XT_FETCH 00003878
+CSEG XT_ENV_FORTHVERSION 000002ad
+CSEG XT_DECIMAL 00003f40
+CSEG XT_L_SHARP 000002e6
+CSEG XT_SHARP 000002ee
+CSEG XT_HOLD 000002d7
+CSEG XT_SHARP_S 00000304
+CSEG XT_SHARP_G 0000030f
+CSEG XT_TYPE 000003fe
+CSEG XT_STORE 00003880
+CSEG XT_ENV_CPU 000002b5
+CSEG VE_NOOP 00000155
+CSEG XT_NOOP 00000159
+CSEG PFA_NOOP 0000015a
+CSEG VE_UNUSED 0000015b
+CSEG XT_UNUSED 00000160
+CSEG PFA_UNUSED 00000161
+CSEG XT_SP_FETCH 00003a8c
+CSEG XT_HERE 00003f22
+CSEG XT_MINUS 00003992
+CSEG VE_TO 00000165
+CSEG XT_TO 00000168
+CSEG PFA_TO 00000169
+CSEG XT_TICK 0000040d
+CSEG XT_TO_BODY 00003fcf
+CSEG XT_STATE 00003eb6
+CSEG PFA_TO1 00000179
+CSEG XT_COMPILE 00000721
+CSEG XT_DOTO 00000173
+CSEG XT_COMMA 0000072c
+CSEG PFA_DOTO 00000174
+CSEG XT_ICELLPLUS 00000185
+CSEG XT_EXECUTE 00003829
+CSEG VE_ICELLPLUS 0000017f
+CSEG PFA_ICELLPLUS 00000186
+CSEG VE_ICOMPARE 00000188
+CSEG XT_ICOMPARE 0000018e
+CSEG PFA_ICOMPARE 0000018f
+CSEG XT_OVER 000038ce
+CSEG PFA_ICOMPARE_SAMELEN 00000199
+CSEG XT_2DROP 00003ed1
+CSEG XT_QDOCHECK 000007eb
+CSEG PFA_ICOMPARE_DONE 000001be
+CSEG XT_DODO 00003a9a
+CSEG PFA_ICOMPARE_LOOP 0000019f
+CSEG XT_ICOMPARE_LC 000001c1
+CSEG PFA_ICOMPARE_LASTCELL 000001af
+CSEG PFA_ICOMPARE_NEXTLOOP 000001b6
+CSEG XT_UNLOOP 00003ad3
+CSEG XT_CELLPLUS 00003c8f
+CSEG XT_DOPLUSLOOP 00003ab9
+CSEG PFA_ICOMPARE_LC 000001c2
+CSEG XT_TOLOWER 00003f78
+CSEG XT_OR 00003a1b
+CSEG VE_STAR 000001d0
+CSEG XT_STAR 000001d3
+CSEG PFA_STAR 000001d4
+CSEG XT_MSTAR 000039a5
+CSEG VE_J 000001d7
+CSEG XT_J 000001da
+CSEG PFA_J 000001db
+CSEG XT_RP_FETCH 00003a75
+CSEG VE_DABS 000001e7
+CSEG XT_DABS 000001eb
+CSEG PFA_DABS 000001ec
+CSEG XT_ZEROLESS 00003920
+CSEG PFA_DABS1 000001f1
+CSEG XT_DNEGATE 000001f8
+CSEG VE_DNEGATE 000001f2
+CSEG PFA_DNEGATE 000001f9
+CSEG XT_DINVERT 00003c3a
+CSEG VE_CMOVE 000001fe
+CSEG XT_CMOVE 00000203
+CSEG PFA_CMOVE 00000204
+CSEG PFA_CMOVE1 00000211
+CSEG PFA_CMOVE2 0000020d
+CSEG VE_2SWAP 00000217
+CSEG XT_2SWAP 0000021c
+CSEG PFA_2SWAP 0000021d
+CSEG VE_REFILLTIB 00000222
+CSEG XT_REFILLTIB 00000229
+CSEG PFA_REFILLTIB 0000022a
+CSEG XT_TIB 00000245
+CSEG XT_ACCEPT 0000045d
+CSEG XT_NUMBERTIB 0000024b
+CSEG XT_TO_IN 00003ee1
+CSEG VE_SOURCETIB 00000235
+CSEG XT_SOURCETIB 0000023c
+CSEG PFA_SOURCETIB 0000023d
+CSEG VE_TIB 00000241
+CSEG PFA_DOVARIABLE 00003847
+CSEG PFA_TIB 00000246
+DSEG ram_tib 0000012c
+CSEG VE_NUMBERTIB 00000247
+CSEG PFA_NUMBERTIB 0000024c
+DSEG ram_sharptib 00000186
+CSEG VE_EE2RAM 0000024d
+CSEG XT_EE2RAM 00000252
+CSEG PFA_EE2RAM 00000253
+CSEG PFA_EE2RAM_1 00000255
+CSEG XT_FETCHE 00003b5e
+CSEG XT_DOLOOP 00003ac8
+CSEG PFA_EE2RAM_2 0000025f
+CSEG VE_INIT_RAM 00000261
+CSEG XT_INIT_RAM 00000267
+CSEG PFA_INI_RAM 00000268
+ESEG EE_INITUSER 0000006a
+CSEG XT_UP_FETCH 00003b01
+CSEG XT_2SLASH 00003a03
+CSEG VE_ENVIRONMENT 00000270
+CSEG XT_ENVIRONMENT 00000278
+CSEG PFA_ENVIRONMENT 00000279
+ESEG CFG_ENVIRONMENT 00000044
+CSEG VE_ENVWORDLISTS 0000027a
+CSEG XT_ENVWORDLISTS 00000281
+CSEG PFA_ENVWORDLISTS 00000282
+CSEG VE_ENVSLASHPAD 00000285
+CSEG XT_ENVSLASHPAD 00000289
+CSEG PFA_ENVSLASHPAD 0000028a
+CSEG XT_PAD 00003ee7
+CSEG VE_ENVSLASHHOLD 0000028e
+CSEG XT_ENVSLASHHOLD 00000293
+CSEG PFA_ENVSLASHHOLD 00000294
+CSEG VE_ENV_FORTHNAME 00000298
+CSEG PFA_EN_FORTHNAME 000002a0
+CSEG XT_DOSLITERAL 00000395
+CSEG VE_ENV_FORTHVERSION 000002a7
+CSEG PFA_EN_FORTHVERSION 000002ae
+CSEG VE_ENV_CPU 000002b1
+CSEG PFA_EN_CPU 000002b6
+CSEG XT_ICOUNT 000003f4
+CSEG VE_ENV_MCUINFO 000002ba
+CSEG XT_ENV_MCUINFO 000002c0
+CSEG PFA_EN_MCUINFO 000002c1
+CSEG VE_ENVUSERSIZE 000002c4
+CSEG XT_ENVUSERSIZE 000002c9
+CSEG PFA_ENVUSERSIZE 000002ca
+CSEG VE_HLD 000002cd
+CSEG XT_HLD 000002d1
+CSEG PFA_HLD 000002d2
+DSEG ram_hld 00000188
+CSEG VE_HOLD 000002d3
+CSEG PFA_HOLD 000002d8
+CSEG XT_1MINUS 00003a34
+CSEG VE_L_SHARP 000002e3
+CSEG PFA_L_SHARP 000002e7
+CSEG VE_SHARP 000002eb
+CSEG PFA_SHARP 000002ef
+CSEG XT_UDSLASHMOD 0000036b
+CSEG XT_LESS 0000396d
+CSEG PFA_SHARP1 000002fc
+CSEG VE_SHARP_S 00000301
+CSEG PFA_SHARP_S 00000305
+CSEG NUMS1 00000305
+CSEG VE_SHARP_G 0000030c
+CSEG PFA_SHARP_G 00000310
+CSEG VE_SIGN 00000317
+CSEG XT_SIGN 0000031b
+CSEG PFA_SIGN 0000031c
+CSEG PFA_SIGN1 00000322
+CSEG VE_DDOTR 00000323
+CSEG XT_DDOTR 00000327
+CSEG PFA_DDOTR 00000328
+CSEG XT_TUCK 00003ed9
+CSEG XT_SPACES 00003fb6
+CSEG VE_DOTR 00000336
+CSEG XT_DOTR 00000339
+CSEG PFA_DOTR 0000033a
+CSEG VE_DDOT 0000033f
+CSEG XT_DDOT 00000342
+CSEG PFA_DDOT 00000343
+CSEG VE_DOT 00000347
+CSEG XT_DOT 0000034a
+CSEG PFA_DOT 0000034b
+CSEG VE_UDDOT 0000034e
+CSEG XT_UDDOT 00000352
+CSEG PFA_UDDOT 00000353
+CSEG XT_UDDOTR 0000035b
+CSEG VE_UDDOTR 00000357
+CSEG PFA_UDDOTR 0000035c
+CSEG VE_UDSLASHMOD 00000366
+CSEG PFA_UDSLASHMOD 0000036c
+CSEG XT_R_FETCH 00003907
+CSEG XT_UMSLASHMOD 000039c1
+CSEG VE_DIGITQ 00000376
+CSEG XT_DIGITQ 0000037b
+CSEG PFA_DIGITQ 0000037c
+CSEG XT_TOUPPER 00003f65
+CSEG XT_GREATER 00003977
+CSEG PFA_DOSLITERAL 00000396
+CSEG VE_SCOMMA 000003a0
+CSEG XT_SCOMMA 000003a3
+CSEG PFA_SCOMMA 000003a4
+CSEG XT_DOSCOMMA 000003a7
+CSEG PFA_DOSCOMMA 000003a8
+CSEG XT_2STAR 00003a0a
+CSEG PFA_SCOMMA2 000003ba
+CSEG PFA_SCOMMA1 000003b4
+CSEG XT_GREATERZERO 00003927
+CSEG PFA_SCOMMA3 000003c1
+CSEG VE_ITYPE 000003c3
+CSEG PFA_ITYPE 000003c9
+CSEG PFA_ITYPE2 000003dc
+CSEG PFA_ITYPE1 000003d4
+CSEG XT_LOWEMIT 000003e9
+CSEG XT_HIEMIT 000003e5
+CSEG PFA_ITYPE3 000003e3
+CSEG PFA_HIEMIT 000003e6
+CSEG PFA_LOWEMIT 000003ea
+CSEG XT_EMIT 00003ef1
+CSEG VE_ICOUNT 000003ef
+CSEG PFA_ICOUNT 000003f5
+CSEG VE_TYPE 000003fa
+CSEG PFA_TYPE 000003ff
+CSEG XT_BOUNDS 00003f98
+CSEG PFA_TYPE2 00000409
+CSEG PFA_TYPE1 00000404
+CSEG XT_I 00003aab
+CSEG VE_TICK 0000040a
+CSEG PFA_TICK 0000040e
+CSEG XT_PARSENAME 00000580
+CSEG XT_FORTHRECOGNIZER 000005c3
+CSEG XT_RECOGNIZE 000005ce
+CSEG XT_DT_NULL 0000065b
+CSEG PFA_TICK1 0000041f
+CSEG XT_THROW 00003d85
+CSEG VE_CSKIP 00000421
+CSEG XT_CSKIP 00000426
+CSEG PFA_CSKIP 00000427
+CSEG PFA_CSKIP1 00000428
+CSEG PFA_CSKIP2 00000435
+CSEG XT_SLASHSTRING 00000571
+CSEG XT_DOBRANCH 0000382e
+CSEG VE_CSCAN 00000438
+CSEG XT_CSCAN 0000043d
+CSEG PFA_CSCAN 0000043e
+CSEG PFA_CSCAN1 00000440
+CSEG PFA_CSCAN2 00000452
+CSEG XT_NIP 000038ef
+CSEG VE_ACCEPT 00000458
+CSEG PFA_ACCEPT 0000045e
+CSEG ACC1 00000462
+CSEG XT_KEY 00003f02
+CSEG XT_CRLFQ 0000049e
+CSEG ACC5 00000490
+CSEG ACC3 00000480
+CSEG ACC6 0000047e
+CSEG XT_BS 00000496
+CSEG ACC4 0000048e
+CSEG XT_BL 00003f53
+CSEG PFA_ACCEPT6 00000487
+CSEG XT_CR 00003fa0
+CSEG VE_REFILL 000004a9
+CSEG XT_REFILL 000004ae
+CSEG PFA_DODEFER1 00003dfe
+CSEG PFA_REFILL 000004af
+CSEG XT_UDEFERFETCH 00003dc7
+CSEG XT_UDEFERSTORE 00003dd3
+CSEG VE_CHAR 000004b2
+CSEG XT_CHAR 000004b6
+CSEG PFA_CHAR 000004b7
+CSEG VE_NUMBER 000004bb
+CSEG XT_NUMBER 000004c0
+CSEG PFA_NUMBER 000004c1
+CSEG XT_QSIGN 00000504
+CSEG XT_SET_BASE 00000517
+CSEG PFA_NUMBER0 000004d7
+CSEG XT_2TO_R 00003b1d
+CSEG XT_2R_FROM 00003b2c
+CSEG XT_TO_NUMBER 00000535
+CSEG XT_QDUP 000038b8
+CSEG PFA_NUMBER1 000004f9
+CSEG PFA_NUMBER2 000004f0
+CSEG PFA_NUMBER6 000004f1
+CSEG PFA_NUMBER3 000004ed
+CSEG XT_TWO 00003fea
+CSEG PFA_NUMBER5 000004ff
+CSEG PFA_NUMBER4 000004fe
+CSEG XT_NEGATE 00003e26
+CSEG PFA_QSIGN 00000505
+CSEG PFA_NUMBERSIGN_DONE 00000510
+CSEG XT_BASES 00000512
+CSEG PFA_DOCONSTANT 00003851
+CSEG PFA_SET_BASE 00000518
+CSEG XT_WITHIN 00003e56
+CSEG SET_BASE1 0000052d
+CSEG SET_BASE2 0000052e
+CSEG VE_TO_NUMBER 0000052f
+CSEG TONUM1 00000536
+CSEG TONUM3 0000054d
+CSEG TONUM2 00000541
+CSEG VE_PARSE 0000054e
+CSEG XT_PARSE 00000553
+CSEG PFA_PARSE 00000554
+CSEG XT_SOURCE 00000567
+CSEG XT_PLUSSTORE 00003a64
+CSEG VE_SOURCE 00000562
+CSEG PFA_SOURCE 00000568
+CSEG VE_SLASHSTRING 0000056b
+CSEG PFA_SLASHSTRING 00000572
+CSEG VE_PARSENAME 00000579
+CSEG PFA_PARSENAME 00000581
+CSEG XT_SKIPSCANCHAR 00000584
+CSEG PFA_SKIPSCANCHAR 00000585
+CSEG VE_SP0 00000596
+CSEG XT_SP0 0000059a
+CSEG PFA_SP0 0000059b
+CSEG VE_SP 0000059e
+CSEG XT_SP 000005a1
+CSEG PFA_DOUSER 00003857
+CSEG PFA_SP 000005a2
+CSEG VE_RP0 000005a3
+CSEG XT_RP0 000005a7
+CSEG PFA_RP0 000005a8
+CSEG XT_DORP0 000005ab
+CSEG PFA_DORP0 000005ac
+CSEG VE_DEPTH 000005ad
+CSEG XT_DEPTH 000005b2
+CSEG PFA_DEPTH 000005b3
+CSEG VE_FORTHRECOGNIZER 000005b9
+CSEG PFA_FORTHRECOGNIZER 000005c4
+ESEG CFG_FORTHRECOGNIZER 0000003e
+CSEG VE_RECOGNIZE 000005c7
+CSEG PFA_RECOGNIZE 000005cf
+CSEG XT_RECOGNIZE_A 000005d9
+CSEG XT_MAPSTACK 0000096c
+CSEG PFA_RECOGNIZE1 000005d8
+CSEG PFA_RECOGNIZE_A 000005da
+CSEG PFA_RECOGNIZE_A1 000005ea
+CSEG VE_INTERPRET 000005ee
+CSEG XT_INTERPRET 000005f5
+CSEG PFA_INTERPRET 000005f6
+CSEG PFA_INTERPRET2 00000606
+CSEG PFA_INTERPRET1 00000601
+CSEG XT_QSTACK 00003f8a
+CSEG VE_DT_NUM 00000608
+CSEG XT_DT_NUM 0000060d
+CSEG PFA_DT_NUM 0000060e
+CSEG XT_LITERAL 00000742
+CSEG VE_DT_DNUM 00000611
+CSEG XT_DT_DNUM 00000617
+CSEG PFA_DT_DNUM 00000618
+CSEG XT_2LITERAL 00003fd6
+CSEG VE_REC_NUM 0000061b
+CSEG XT_REC_NUM 00000621
+CSEG PFA_REC_NUM 00000622
+CSEG PFA_REC_NONUMBER 0000062d
+CSEG PFA_REC_INTNUM2 0000062b
+CSEG VE_REC_FIND 0000062f
+CSEG XT_REC_FIND 00000635
+CSEG PFA_REC_FIND 00000636
+CSEG XT_FINDXT 000006d0
+CSEG PFA_REC_WORD_FOUND 0000063e
+CSEG XT_DT_XT 00000645
+CSEG VE_DT_XT 00000640
+CSEG PFA_DT_XT 00000646
+CSEG XT_R_WORD_INTERPRET 00000649
+CSEG XT_R_WORD_COMPILE 0000064d
+CSEG PFA_R_WORD_INTERPRET 0000064a
+CSEG PFA_R_WORD_COMPILE 0000064e
+CSEG PFA_R_WORD_COMPILE1 00000653
+CSEG VE_DT_NULL 00000655
+CSEG PFA_DT_NULL 0000065c
+CSEG XT_FAIL 0000065f
+CSEG PFA_FAIL 00000660
+CSEG VE_SEARCH_WORDLIST 00000663
+CSEG XT_SEARCH_WORDLIST 0000066d
+CSEG PFA_SEARCH_WORDLIST 0000066e
+CSEG XT_ISWORD 00000682
+CSEG XT_TRAVERSEWORDLIST 0000069f
+CSEG PFA_SEARCH_WORDLIST1 0000067c
+CSEG XT_NFA2CFA 000006c6
+CSEG PFA_ISWORD 00000683
+CSEG XT_NAME2STRING 000006ba
+CSEG PFA_ISWORD3 00000690
+CSEG VE_TRAVERSEWORDLIST 00000694
+CSEG PFA_TRAVERSEWORDLIST 000006a0
+CSEG PFA_TRAVERSEWORDLIST1 000006a1
+CSEG PFA_TRAVERSEWORDLIST2 000006b0
+CSEG XT_NFA2LFA 000009db
+CSEG VE_NAME2STRING 000006b2
+CSEG PFA_NAME2STRING 000006bb
+CSEG VE_NFA2CFA 000006c0
+CSEG PFA_NFA2CFA 000006c7
+CSEG VE_FINDXT 000006ca
+CSEG PFA_FINDXT 000006d1
+CSEG XT_FINDXTA 000006dc
+ESEG CFG_ORDERLISTLEN 0000004a
+CSEG PFA_FINDXT1 000006db
+CSEG PFA_FINDXTA 000006dd
+CSEG PFA_FINDXTA1 000006e9
+CSEG VE_NEWEST 000006ea
+CSEG XT_NEWEST 000006ef
+CSEG PFA_NEWEST 000006f0
+DSEG ram_newest 0000018a
+CSEG VE_LATEST 000006f1
+CSEG XT_LATEST 000006f6
+CSEG PFA_LATEST 000006f7
+DSEG ram_latest 0000018e
+CSEG VE_DOCREATE 000006f8
+CSEG XT_DOCREATE 000006fe
+CSEG PFA_DOCREATE 000006ff
+CSEG XT_WLSCOPE 00000855
+CSEG XT_HEADER 0000083a
+CSEG VE_BACKSLASH 00000709
+CSEG XT_BACKSLASH 0000070c
+CSEG PFA_BACKSLASH 0000070d
+CSEG VE_LPAREN 00000712
+CSEG XT_LPAREN 00000715
+CSEG PFA_LPAREN 00000716
+CSEG VE_COMPILE 0000071b
+CSEG PFA_COMPILE 00000722
+CSEG VE_COMMA 00000729
+CSEG PFA_COMMA 0000072d
+CSEG XT_DP 00003f11
+CSEG XT_STOREI 00003b72
+CSEG PFA_DP 00003f12
+CSEG VE_BRACKETTICK 00000734
+CSEG XT_BRACKETTICK 00000738
+CSEG PFA_BRACKETTICK 00000739
+CSEG VE_LITERAL 0000073c
+CSEG PFA_LITERAL 00000743
+CSEG VE_SLITERAL 00000747
+CSEG XT_SLITERAL 0000074d
+CSEG PFA_SLITERAL 0000074e
+CSEG XT_GMARK 00000752
+CSEG PFA_GMARK 00000753
+CSEG XT_GRESOLVE 00000757
+CSEG PFA_GRESOLVE 00000758
+CSEG XT_LMARK 0000075d
+CSEG PFA_LMARK 0000075e
+CSEG XT_LRESOLVE 00000760
+CSEG PFA_LRESOLVE 00000761
+CSEG VE_AHEAD 00000764
+CSEG XT_AHEAD 00000769
+CSEG PFA_AHEAD 0000076a
+CSEG VE_IF 0000076e
+CSEG XT_IF 00000771
+CSEG PFA_IF 00000772
+CSEG VE_ELSE 00000776
+CSEG XT_ELSE 0000077a
+CSEG PFA_ELSE 0000077b
+CSEG VE_THEN 00000781
+CSEG XT_THEN 00000785
+CSEG PFA_THEN 00000786
+CSEG VE_BEGIN 00000788
+CSEG XT_BEGIN 0000078d
+CSEG PFA_BEGIN 0000078e
+CSEG VE_WHILE 00000790
+CSEG XT_WHILE 00000795
+CSEG PFA_WHILE 00000796
+CSEG VE_REPEAT 00000799
+CSEG XT_REPEAT 0000079e
+CSEG PFA_REPEAT 0000079f
+CSEG XT_AGAIN 000007b2
+CSEG VE_UNTIL 000007a2
+CSEG XT_UNTIL 000007a7
+CSEG PFA_UNTIL 000007a8
+CSEG VE_AGAIN 000007ad
+CSEG PFA_AGAIN 000007b3
+CSEG VE_DO 000007b7
+CSEG XT_DO 000007ba
+CSEG PFA_DO 000007bb
+CSEG XT_TO_L 00000815
+CSEG VE_LOOP 000007c1
+CSEG XT_LOOP 000007c5
+CSEG PFA_LOOP 000007c6
+CSEG XT_ENDLOOP 000007fc
+CSEG VE_PLUSLOOP 000007ca
+CSEG XT_PLUSLOOP 000007cf
+CSEG PFA_PLUSLOOP 000007d0
+CSEG VE_LEAVE 000007d4
+CSEG XT_LEAVE 000007d9
+CSEG PFA_LEAVE 000007da
+CSEG VE_QDO 000007df
+CSEG XT_QDO 000007e3
+CSEG PFA_QDO 000007e4
+CSEG PFA_QDOCHECK 000007ec
+CSEG PFA_QDOCHECK1 000007f3
+CSEG XT_INVERT 000039fc
+CSEG VE_ENDLOOP 000007f6
+CSEG PFA_ENDLOOP 000007fd
+CSEG LOOP1 000007fe
+CSEG XT_L_FROM 00000809
+CSEG LOOP2 00000805
+CSEG VE_L_FROM 00000806
+CSEG PFA_L_FROM 0000080a
+CSEG XT_LP 00000828
+CSEG VE_TO_L 00000812
+CSEG PFA_TO_L 00000816
+CSEG VE_LP0 0000081d
+CSEG XT_LP0 00000821
+CSEG PFA_LP0 00000822
+ESEG CFG_LP0 00000040
+CSEG VE_LP 00000825
+CSEG PFA_LP 00000829
+DSEG ram_lp 00000190
+CSEG VE_CREATE 0000082a
+CSEG XT_CREATE 0000082f
+CSEG PFA_CREATE 00000830
+CSEG XT_REVEAL 0000085e
+CSEG VE_HEADER 00000835
+CSEG PFA_HEADER 0000083b
+CSEG PFA_HEADER1 0000084c
+CSEG VE_WLSCOPE 0000084f
+CSEG PFA_WLSCOPE 00000856
+ESEG CFG_WLSCOPE 0000003c
+CSEG VE_REVEAL 00000859
+CSEG PFA_REVEAL 0000085f
+CSEG REVEAL1 00000869
+CSEG XT_STOREE 00003b3a
+CSEG VE_DOES 0000086a
+CSEG XT_DOES 0000086f
+CSEG PFA_DOES 00000870
+CSEG XT_DODOES 00000882
+CSEG DO_DODOES 00000877
+CSEG PFA_DODOES 00000883
+CSEG VE_COLON 0000088b
+CSEG XT_COLON 0000088e
+CSEG PFA_COLON 0000088f
+CSEG XT_COLONNONAME 00000899
+CSEG VE_COLONNONAME 00000893
+CSEG PFA_COLONNONAME 0000089a
+CSEG XT_RBRACKET 000008ae
+CSEG VE_SEMICOLON 000008a2
+CSEG XT_SEMICOLON 000008a5
+CSEG PFA_SEMICOLON 000008a6
+CSEG XT_LBRACKET 000008b6
+CSEG VE_RBRACKET 000008ab
+CSEG PFA_RBRACKET 000008af
+CSEG VE_LBRACKET 000008b3
+CSEG PFA_LBRACKET 000008b7
+CSEG VE_VARIABLE 000008bb
+CSEG XT_VARIABLE 000008c1
+CSEG PFA_VARIABLE 000008c2
+CSEG XT_CONSTANT 000008cd
+CSEG XT_ALLOT 00003f2b
+CSEG VE_CONSTANT 000008c7
+CSEG PFA_CONSTANT 000008ce
+CSEG VE_USER 000008d4
+CSEG XT_USER 000008d8
+CSEG PFA_USER 000008d9
+CSEG VE_RECURSE 000008df
+CSEG XT_RECURSE 000008e5
+CSEG PFA_RECURSE 000008e6
+CSEG VE_IMMEDIATE 000008ea
+CSEG XT_IMMEDIATE 000008f1
+CSEG PFA_IMMEDIATE 000008f2
+CSEG XT_GET_CURRENT 00000993
+CSEG VE_BRACKETCHAR 000008fc
+CSEG XT_BRACKETCHAR 00000901
+CSEG PFA_BRACKETCHAR 00000902
+CSEG VE_ABORTQUOTE 00000907
+CSEG XT_ABORTQUOTE 0000090c
+CSEG PFA_ABORTQUOTE 0000090d
+CSEG XT_SQUOTE 00003e89
+CSEG XT_QABORT 0000091e
+CSEG VE_ABORT 00000911
+CSEG XT_ABORT 00000916
+CSEG PFA_ABORT 00000917
+CSEG VE_QABORT 00000919
+CSEG PFA_QABORT 0000091f
+CSEG QABO1 00000924
+CSEG VE_GET_STACK 00000926
+CSEG XT_GET_STACK 0000092d
+CSEG PFA_N_FETCH_E2 00000944
+CSEG PFA_N_FETCH_E1 0000093a
+CSEG XT_CELLS 00003ec3
+CSEG VE_SET_STACK 00000947
+CSEG XT_SET_STACK 0000094e
+CSEG PFA_SET_STACK 0000094f
+CSEG PFA_SET_STACK0 00000956
+CSEG PFA_SET_STACK2 00000963
+CSEG PFA_SET_STACK1 0000095e
+CSEG VE_MAPSTACK 00000965
+CSEG PFA_MAPSTACK 0000096d
+CSEG PFA_MAPSTACK3 00000988
+CSEG PFA_MAPSTACK1 00000977
+CSEG PFA_MAPSTACK2 00000984
+CSEG VE_GET_CURRENT 0000098b
+CSEG PFA_GET_CURRENT 00000994
+ESEG CFG_CURRENT 00000046
+CSEG VE_GET_ORDER 00000998
+CSEG XT_GET_ORDER 0000099f
+CSEG PFA_GET_ORDER 000009a0
+CSEG VE_CFG_ORDER 000009a4
+CSEG XT_CFG_ORDER 000009ab
+CSEG PFA_CFG_ORDER 000009ac
+CSEG VE_COMPARE 000009ad
+CSEG XT_COMPARE 000009b3
+CSEG PFA_COMPARE 000009b4
+CSEG PFA_COMPARE_LOOP 000009c0
+CSEG PFA_COMPARE_NOTEQUAL 000009ce
+CSEG PFA_COMPARE_ENDREACHED2 000009c9
+CSEG PFA_COMPARE_ENDREACHED 000009ca
+CSEG PFA_COMPARE_CHECKLASTCHAR 000009ce
+CSEG PFA_COMPARE_DONE 000009d0
+CSEG VE_NFA2LFA 000009d5
+CSEG PFA_NFA2LFA 000009dc
+CSEG VE_SET_CURRENT 000009e1
+CSEG XT_SET_CURRENT 000009e9
+CSEG PFA_SET_CURRENT 000009ea
+CSEG VE_WORDLIST 000009ee
+CSEG XT_WORDLIST 000009f4
+CSEG PFA_WORDLIST 000009f5
+CSEG XT_EHERE 00003f1a
+CSEG PFA_EHERE 00003f1b
+CSEG VE_FORTHWORDLIST 000009fe
+CSEG XT_FORTHWORDLIST 00000a07
+CSEG PFA_FORTHWORDLIST 00000a08
+ESEG CFG_FORTHWORDLIST 00000048
+CSEG VE_SET_ORDER 00000a09
+CSEG XT_SET_ORDER 00000a10
+CSEG PFA_SET_ORDER 00000a11
+CSEG VE_SET_RECOGNIZERS 00000a15
+CSEG XT_SET_RECOGNIZERS 00000a1f
+CSEG PFA_SET_RECOGNIZERS 00000a20
+ESEG CFG_RECOGNIZERLISTLEN 0000005c
+CSEG VE_GET_RECOGNIZERS 00000a24
+CSEG XT_GET_RECOGNIZERS 00000a2e
+CSEG PFA_GET_RECOGNIZERS 00000a2f
+CSEG VE_CODE 00000a33
+CSEG XT_CODE 00000a37
+CSEG PFA_CODE 00000a38
+CSEG VE_ENDCODE 00000a3e
+CSEG XT_ENDCODE 00000a44
+CSEG PFA_ENDCODE 00000a45
+CSEG VE_MARKER 00000a4a
+CSEG XT_MARKER 00000a50
+CSEG PFA_MARKER 00000a51
+ESEG EE_MARKER 00000068
+CSEG VE_POSTPONE 00000a54
+CSEG XT_POSTPONE 00000a5a
+CSEG PFA_POSTPONE 00000a5b
+CSEG VE_APPLTURNKEY 00000a69
+CSEG XT_APPLTURNKEY 00000a71
+CSEG PFA_APPLTURNKEY 00000a72
+CSEG XT_INTON 00003c96
+SET DPSTART 00000a7f
+CSEG DO_INTERRUPT 00003813
+CSEG DO_EXECUTE 0000380c
+CSEG XT_ISREXEC 00003cbf
+CSEG VE_EXIT 0000381b
+CSEG PFA_EXIT 00003820
+CSEG VE_EXECUTE 00003823
+CSEG PFA_EXECUTE 0000382a
+CSEG PFA_DOBRANCH 0000382f
+CSEG PFA_DOCONDBRANCH 00003836
+CSEG PFA_DOLITERAL 0000383d
+CSEG XT_DOVARIABLE 00003846
+CSEG XT_DOCONSTANT 00003850
+CSEG XT_DOUSER 00003856
+CSEG VE_DOVALUE 00003862
+CSEG XT_DOVALUE 00003868
+CSEG PFA_DOVALUE 00003869
+CSEG VE_FETCH 00003875
+CSEG PFA_FETCH 00003879
+CSEG PFA_FETCHRAM 00003879
+CSEG VE_STORE 0000387d
+CSEG PFA_STORE 00003881
+CSEG PFA_STORERAM 00003881
+CSEG VE_CSTORE 00003889
+CSEG PFA_CSTORE 0000388d
+CSEG VE_CFETCH 00003894
+CSEG PFA_CFETCH 00003898
+CSEG VE_FETCHU 0000389c
+CSEG XT_FETCHU 0000389f
+CSEG PFA_FETCHU 000038a0
+CSEG VE_STOREU 000038a4
+CSEG XT_STOREU 000038a7
+CSEG PFA_STOREU 000038a8
+CSEG VE_DUP 000038ac
+CSEG PFA_DUP 000038b1
+CSEG VE_QDUP 000038b4
+CSEG PFA_QDUP 000038b9
+CSEG PFA_QDUP1 000038be
+CSEG VE_SWAP 000038bf
+CSEG PFA_SWAP 000038c4
+CSEG VE_OVER 000038ca
+CSEG PFA_OVER 000038cf
+CSEG VE_DROP 000038d4
+CSEG PFA_DROP 000038d9
+CSEG VE_ROT 000038dc
+CSEG PFA_ROT 000038e1
+CSEG VE_NIP 000038eb
+CSEG PFA_NIP 000038f0
+CSEG VE_R_FROM 000038f2
+CSEG PFA_R_FROM 000038f6
+CSEG VE_TO_R 000038fb
+CSEG PFA_TO_R 000038ff
+CSEG VE_R_FETCH 00003904
+CSEG PFA_R_FETCH 00003908
+CSEG VE_NOTEQUAL 0000390f
+CSEG PFA_NOTEQUAL 00003913
+CSEG VE_ZEROEQUAL 00003916
+CSEG PFA_ZEROEQUAL 0000391a
+CSEG PFA_ZERO1 00003956
+CSEG PFA_TRUE1 0000394d
+CSEG VE_ZEROLESS 0000391d
+CSEG PFA_ZEROLESS 00003921
+CSEG VE_GREATERZERO 00003924
+CSEG PFA_GREATERZERO 00003928
+CSEG VE_DGREATERZERO 0000392d
+CSEG XT_DGREATERZERO 00003931
+CSEG PFA_DGREATERZERO 00003932
+CSEG VE_DXT_ZEROLESS 0000393b
+CSEG XT_DXT_ZEROLESS 0000393f
+CSEG PFA_DXT_ZEROLESS 00003940
+CSEG VE_TRUE 00003946
+CSEG PFA_TRUE 0000394b
+CSEG VE_ZERO 00003950
+CSEG PFA_ZERO 00003954
+CSEG VE_ULESS 00003958
+CSEG PFA_ULESS 0000395c
+CSEG VE_UGREATER 00003963
+CSEG PFA_UGREATER 00003967
+CSEG VE_LESS 0000396a
+CSEG PFA_LESS 0000396e
+CSEG PFA_LESSDONE 00003972
+CSEG VE_GREATER 00003974
+CSEG PFA_GREATER 00003978
+CSEG PFA_GREATERDONE 0000397c
+CSEG VE_LOG2 0000397f
+CSEG XT_LOG2 00003983
+CSEG PFA_LOG2 00003984
+CSEG PFA_LOG2_1 00003987
+CSEG PFA_LOG2_2 0000398d
+CSEG VE_MINUS 0000398f
+CSEG PFA_MINUS 00003993
+CSEG VE_PLUS 00003999
+CSEG PFA_PLUS 0000399d
+CSEG VE_MSTAR 000039a2
+CSEG PFA_MSTAR 000039a6
+CSEG VE_UMSLASHMOD 000039bc
+CSEG PFA_UMSLASHMOD 000039c2
+CSEG PFA_UMSLASHMODmod 000039c7
+CSEG PFA_UMSLASHMODmod_loop 000039c8
+CSEG PFA_UMSLASHMODmod_loop_control 000039d5
+CSEG PFA_UMSLASHMODmod_subtract 000039d2
+CSEG PFA_UMSLASHMODmod_done 000039d7
+CSEG VE_UMSTAR 000039db
+CSEG PFA_UMSTAR 000039e0
+CSEG VE_INVERT 000039f7
+CSEG PFA_INVERT 000039fd
+CSEG VE_2SLASH 00003a00
+CSEG PFA_2SLASH 00003a04
+CSEG VE_2STAR 00003a07
+CSEG PFA_2STAR 00003a0b
+CSEG VE_AND 00003a0e
+CSEG PFA_AND 00003a13
+CSEG VE_OR 00003a18
+CSEG PFA_OR 00003a1c
+CSEG VE_XOR 00003a21
+CSEG XT_XOR 00003a25
+CSEG PFA_XOR 00003a26
+CSEG VE_1PLUS 00003a2b
+CSEG PFA_1PLUS 00003a2f
+CSEG VE_1MINUS 00003a31
+CSEG PFA_1MINUS 00003a35
+CSEG VE_QNEGATE 00003a37
+CSEG XT_QNEGATE 00003a3d
+CSEG PFA_QNEGATE 00003a3e
+CSEG QNEG1 00003a42
+CSEG VE_LSHIFT 00003a43
+CSEG XT_LSHIFT 00003a48
+CSEG PFA_LSHIFT 00003a49
+CSEG PFA_LSHIFT1 00003a4c
+CSEG PFA_LSHIFT2 00003a51
+CSEG VE_RSHIFT 00003a52
+CSEG XT_RSHIFT 00003a57
+CSEG PFA_RSHIFT 00003a58
+CSEG PFA_RSHIFT1 00003a5b
+CSEG PFA_RSHIFT2 00003a60
+CSEG VE_PLUSSTORE 00003a61
+CSEG PFA_PLUSSTORE 00003a65
+CSEG VE_RP_FETCH 00003a71
+CSEG PFA_RP_FETCH 00003a76
+CSEG VE_RP_STORE 00003a7b
+CSEG XT_RP_STORE 00003a7f
+CSEG PFA_RP_STORE 00003a80
+CSEG VE_SP_FETCH 00003a88
+CSEG PFA_SP_FETCH 00003a8d
+CSEG VE_SP_STORE 00003a91
+CSEG XT_SP_STORE 00003a95
+CSEG PFA_SP_STORE 00003a96
+CSEG PFA_DODO 00003a9b
+CSEG PFA_DODO1 00003a9d
+CSEG VE_I 00003aa8
+CSEG PFA_I 00003aac
+CSEG PFA_DOPLUSLOOP 00003aba
+CSEG PFA_DOPLUSLOOP_LEAVE 00003ac4
+CSEG PFA_DOPLUSLOOP_NEXT 00003ac1
+CSEG PFA_DOLOOP 00003ac9
+CSEG VE_UNLOOP 00003ace
+CSEG PFA_UNLOOP 00003ad4
+CSEG VE_CMOVE_G 00003ad9
+CSEG XT_CMOVE_G 00003ade
+CSEG PFA_CMOVE_G 00003adf
+CSEG PFA_CMOVE_G1 00003af0
+CSEG PFA_CMOVE_G2 00003aec
+CSEG VE_BYTESWAP 00003af5
+CSEG PFA_BYTESWAP 00003af9
+CSEG VE_UP_FETCH 00003afd
+CSEG PFA_UP_FETCH 00003b02
+CSEG VE_UP_STORE 00003b06
+CSEG XT_UP_STORE 00003b0a
+CSEG PFA_UP_STORE 00003b0b
+CSEG VE_1MS 00003b0f
+CSEG XT_1MS 00003b13
+CSEG PFA_1MS 00003b14
+SET cycles 00000000
+SET loop_cycles 00000fa0
+CSEG VE_2TO_R 00003b19
+CSEG PFA_2TO_R 00003b1e
+CSEG VE_2R_FROM 00003b28
+CSEG PFA_2R_FROM 00003b2d
+CSEG VE_STOREE 00003b37
+CSEG PFA_STOREE 00003b3b
+CSEG PFA_STOREE0 00003b3b
+CSEG PFA_FETCHE2 00003b69
+CSEG PFA_STOREE3 00003b45
+CSEG PFA_STOREE1 00003b50
+CSEG PFA_STOREE4 00003b4c
+CSEG PFA_STOREE2 00003b52
+CSEG VE_FETCHE 00003b5b
+CSEG PFA_FETCHE 00003b5f
+CSEG PFA_FETCHE1 00003b5f
+CSEG VE_STOREI 00003b6f
+CSEG PFA_STOREI 00003b73
+ESEG EE_STOREI 00000066
+CSEG VE_DO_STOREI_NRWW 00003b76
+CSEG XT_DO_STOREI 00003b7d
+CSEG PFA_DO_STOREI_NRWW 00003b7e
+CSEG DO_STOREI_atmega 00003b92
+CSEG pageload 00003ba3
+CSEG DO_STOREI_writepage 00003b9c
+CSEG dospm 00003bbc
+EQU pagemask ffffffc0
+CSEG pageload_loop 00003ba9
+CSEG pageload_newdata 00003bb4
+CSEG pageload_cont 00003bb6
+CSEG pageload_done 00003bbb
+CSEG dospm_wait_ee 00003bbc
+CSEG dospm_wait_spm 00003bbe
+CSEG VE_FETCHI 00003bc7
+CSEG PFA_FETCHI 00003bcb
+CSEG VE_N_TO_R 00003bd1
+CSEG XT_N_TO_R 00003bd5
+CSEG PFA_N_TO_R 00003bd6
+CSEG PFA_N_TO_R1 00003bd8
+CSEG VE_N_R_FROM 00003be3
+CSEG XT_N_R_FROM 00003be7
+CSEG PFA_N_R_FROM 00003be8
+CSEG PFA_N_R_FROM1 00003bed
+CSEG VE_D2STAR 00003bf5
+CSEG XT_D2STAR 00003bf9
+CSEG PFA_D2STAR 00003bfa
+CSEG VE_D2SLASH 00003c03
+CSEG XT_D2SLASH 00003c07
+CSEG PFA_D2SLASH 00003c08
+CSEG VE_DPLUS 00003c11
+CSEG PFA_DPLUS 00003c15
+CSEG VE_DMINUS 00003c22
+CSEG XT_DMINUS 00003c25
+CSEG PFA_DMINUS 00003c26
+CSEG VE_DINVERT 00003c34
+CSEG PFA_DINVERT 00003c3b
+CSEG VE_SLASHMOD 00003c44
+CSEG XT_SLASHMOD 00003c48
+CSEG PFA_SLASHMOD 00003c49
+CSEG PFA_SLASHMOD_1 00003c54
+CSEG PFA_SLASHMOD_2 00003c5a
+CSEG PFA_SLASHMOD_3 00003c5d
+CSEG PFA_SLASHMOD_5 00003c68
+CSEG PFA_SLASHMOD_4 00003c67
+CSEG PFA_SLASHMODmod_done 00003c73
+CSEG PFA_SLASHMOD_6 00003c71
+CSEG VE_ABS 00003c77
+CSEG XT_ABS 00003c7b
+CSEG PFA_ABS 00003c7c
+CSEG VE_PICK 00003c7f
+CSEG XT_PICK 00003c83
+CSEG PFA_PICK 00003c84
+CSEG VE_CELLPLUS 00003c8a
+CSEG PFA_CELLPLUS 00003c90
+CSEG VE_INTON 00003c92
+CSEG PFA_INTON 00003c97
+CSEG VE_INTOFF 00003c99
+CSEG XT_INTOFF 00003c9d
+CSEG PFA_INTOFF 00003c9e
+CSEG VE_INTSTORE 00003ca0
+CSEG PFA_INTSTORE 00003ca5
+CSEG VE_INTFETCH 00003caa
+CSEG XT_INTFETCH 00003cae
+CSEG PFA_INTFETCH 00003caf
+CSEG VE_INTTRAP 00003cb4
+CSEG XT_INTTRAP 00003cba
+CSEG PFA_INTTRAP 00003cbb
+CSEG PFA_ISREXEC 00003cc0
+CSEG XT_ISREND 00003cc4
+CSEG PFA_ISREND 00003cc5
+CSEG PFA_ISREND1 00003cc7
+CSEG XT_DEFAULT_PROMPTOK 00003cc8
+CSEG PFA_DEFAULT_PROMPTOK 00003cc9
+CSEG VE_PROMPTOK 00003ccf
+CSEG XT_PROMPTOK 00003cd3
+CSEG PFA_PROMPTOK 00003cd4
+CSEG XT_DEFAULT_PROMPTREADY 00003cd7
+CSEG PFA_DEFAULT_PROMPTREADY 00003cd8
+CSEG VE_PROMPTREADY 00003cde
+CSEG XT_PROMPTREADY 00003ce3
+CSEG PFA_PROMPTREADY 00003ce4
+CSEG XT_DEFAULT_PROMPTERROR 00003ce7
+CSEG PFA_DEFAULT_PROMPTERROR 00003ce8
+CSEG VE_PROMPTERROR 00003cf9
+CSEG XT_PROMPTERROR 00003cfe
+CSEG PFA_PROMPTERROR 00003cff
+CSEG VE_QUIT 00003d02
+CSEG XT_QUIT 00003d06
+CSEG PFA_QUIT 00003d07
+CSEG PFA_QUIT2 00003d0f
+CSEG PFA_QUIT4 00003d15
+CSEG PFA_QUIT3 00003d27
+CSEG XT_CATCH 00003d6f
+CSEG PFA_QUIT5 00003d25
+CSEG VE_PAUSE 00003d2a
+CSEG PFA_PAUSE 00003d30
+DSEG ram_pause 00000192
+CSEG XT_RDEFERFETCH 00003db3
+CSEG XT_RDEFERSTORE 00003dbd
+CSEG VE_COLD 00003d33
+CSEG clearloop 00003d3f
+DSEG ram_user1 00000194
+CSEG PFA_WARM 00003d59
+CSEG VE_WARM 00003d54
+CSEG XT_WARM 00003d58
+CSEG XT_DEFERSTORE 00003dde
+CSEG XT_TURNKEY 00003f5b
+CSEG VE_HANDLER 00003d62
+CSEG XT_HANDLER 00003d68
+CSEG PFA_HANDLER 00003d69
+CSEG VE_CATCH 00003d6a
+CSEG PFA_CATCH 00003d70
+CSEG VE_THROW 00003d80
+CSEG PFA_THROW 00003d86
+CSEG PFA_THROW1 00003d8c
+CSEG VE_EDEFERFETCH 00003d99
+CSEG PFA_EDEFERFETCH 00003da0
+CSEG VE_EDEFERSTORE 00003da3
+CSEG PFA_EDEFERSTORE 00003daa
+CSEG VE_RDEFERFETCH 00003dad
+CSEG PFA_RDEFERFETCH 00003db4
+CSEG VE_RDEFERSTORE 00003db7
+CSEG PFA_RDEFERSTORE 00003dbe
+CSEG VE_UDEFERFETCH 00003dc1
+CSEG PFA_UDEFERFETCH 00003dc8
+CSEG VE_UDEFERSTORE 00003dcd
+CSEG PFA_UDEFERSTORE 00003dd4
+CSEG VE_DEFERSTORE 00003dd9
+CSEG PFA_DEFERSTORE 00003ddf
+CSEG VE_DEFERFETCH 00003de6
+CSEG XT_DEFERFETCH 00003deb
+CSEG PFA_DEFERFETCH 00003dec
+CSEG VE_DODEFER 00003df2
+CSEG XT_DODEFER 00003df8
+CSEG PFA_DODEFER 00003df9
+CSEG VE_UDOT 00003e06
+CSEG XT_UDOT 00003e09
+CSEG PFA_UDOT 00003e0a
+CSEG VE_UDOTR 00003e0d
+CSEG XT_UDOTR 00003e11
+CSEG PFA_UDOTR 00003e12
+CSEG VE_USLASHMOD 00003e16
+CSEG XT_USLASHMOD 00003e1b
+CSEG PFA_USLASHMOD 00003e1c
+CSEG VE_NEGATE 00003e21
+CSEG PFA_NEGATE 00003e27
+CSEG VE_SLASH 00003e2a
+CSEG XT_SLASH 00003e2d
+CSEG PFA_SLASH 00003e2e
+CSEG VE_MOD 00003e31
+CSEG XT_MOD 00003e35
+CSEG PFA_MOD 00003e36
+CSEG VE_MIN 00003e39
+CSEG XT_MIN 00003e3d
+CSEG PFA_MIN 00003e3e
+CSEG PFA_MIN1 00003e43
+CSEG VE_MAX 00003e45
+CSEG XT_MAX 00003e49
+CSEG PFA_MAX 00003e4a
+CSEG PFA_MAX1 00003e4f
+CSEG VE_WITHIN 00003e51
+CSEG PFA_WITHIN 00003e57
+CSEG VE_SHOWWORDLIST 00003e5e
+CSEG XT_SHOWWORDLIST 00003e67
+CSEG PFA_SHOWWORDLIST 00003e68
+CSEG XT_SHOWWORD 00003e6d
+CSEG PFA_SHOWWORD 00003e6e
+CSEG VE_WORDS 00003e73
+CSEG XT_WORDS 00003e78
+CSEG PFA_WORDS 00003e79
+CSEG VE_DOTSTRING 00003e7e
+CSEG XT_DOTSTRING 00003e81
+CSEG PFA_DOTSTRING 00003e82
+CSEG VE_SQUOTE 00003e86
+CSEG PFA_SQUOTE 00003e8a
+CSEG PFA_SQUOTE1 00003e92
+CSEG VE_FILL 00003e93
+CSEG PFA_FILL 00003e98
+CSEG PFA_FILL2 00003ea4
+CSEG PFA_FILL1 00003e9f
+CSEG VE_F_CPU 00003ea6
+CSEG XT_F_CPU 00003eab
+CSEG PFA_F_CPU 00003eac
+CSEG VE_STATE 00003eb1
+CSEG PFA_STATE 00003eb7
+DSEG ram_state 000001c0
+CSEG VE_BASE 00003eb8
+CSEG PFA_BASE 00003ebd
+CSEG VE_CELLS 00003ebe
+CSEG VE_2DUP 00003ec4
+CSEG PFA_2DUP 00003ec9
+CSEG VE_2DROP 00003ecc
+CSEG PFA_2DROP 00003ed2
+CSEG VE_TUCK 00003ed5
+CSEG PFA_TUCK 00003eda
+CSEG VE_TO_IN 00003edd
+CSEG PFA_TO_IN 00003ee2
+CSEG VE_PAD 00003ee3
+CSEG PFA_PAD 00003ee8
+CSEG VE_EMIT 00003eed
+CSEG PFA_EMIT 00003ef2
+CSEG VE_EMITQ 00003ef5
+CSEG XT_EMITQ 00003efa
+CSEG PFA_EMITQ 00003efb
+CSEG VE_KEY 00003efe
+CSEG PFA_KEY 00003f03
+CSEG VE_KEYQ 00003f06
+CSEG XT_KEYQ 00003f0a
+CSEG PFA_KEYQ 00003f0b
+CSEG VE_DP 00003f0e
+ESEG CFG_DP 00000036
+CSEG VE_EHERE 00003f15
+ESEG EE_EHERE 0000003a
+CSEG VE_HERE 00003f1e
+CSEG PFA_HERE 00003f23
+ESEG EE_HERE 00000038
+CSEG VE_ALLOT 00003f26
+CSEG PFA_ALLOT 00003f2c
+CSEG VE_BIN 00003f31
+CSEG XT_BIN 00003f35
+CSEG PFA_BIN 00003f36
+CSEG VE_DECIMAL 00003f3a
+CSEG PFA_DECIMAL 00003f41
+CSEG VE_HEX 00003f46
+CSEG XT_HEX 00003f4a
+CSEG PFA_HEX 00003f4b
+CSEG VE_BL 00003f50
+CSEG PFA_BL 00003f54
+CSEG VE_TURNKEY 00003f55
+CSEG PFA_TURNKEY 00003f5c
+ESEG CFG_TURNKEY 00000042
+CSEG VE_TOUPPER 00003f5f
+CSEG PFA_TOUPPER 00003f66
+CSEG PFA_TOUPPER0 00003f71
+CSEG VE_TOLOWER 00003f72
+CSEG PFA_TOLOWER 00003f79
+CSEG PFA_TOLOWER0 00003f84
+CSEG VE_QSTACK 00003f85
+CSEG PFA_QSTACK 00003f8b
+CSEG PFA_QSTACK1 00003f92
+CSEG VE_BOUNDS 00003f93
+CSEG PFA_BOUNDS 00003f99
+CSEG VE_CR 00003f9d
+CSEG PFA_CR 00003fa1
+CSEG VE_SPACE 00003fa8
+CSEG PFA_SPACE 00003fae
+CSEG VE_SPACES 00003fb1
+CSEG PFA_SPACES 00003fb7
+CSEG SPCS1 00003fb9
+CSEG SPCS2 00003fc0
+CSEG VE_S2D 00003fc2
+CSEG PFA_S2D 00003fc7
+CSEG VE_TO_BODY 00003fca
+CSEG VE_2LITERAL 00003fd0
+CSEG PFA_2LITERAL 00003fd7
+CSEG VE_EQUAL 00003fdb
+CSEG PFA_EQUAL 00003fdf
+CSEG VE_ONE 00003fe2
+CSEG PFA_ONE 00003fe6
+CSEG VE_TWO 00003fe7
+CSEG PFA_TWO 00003feb
+CSEG VE_MINUSONE 00003fec
+CSEG XT_MINUSONE 00003fef
+CSEG PFA_MINUSONE 00003ff0
+SET flashlast 00003ff1
+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/arduino/leonardo.asm b/amforth-6.5/appl/arduino/leonardo.asm
new file mode 100644
index 0000000..d915dec
--- /dev/null
+++ b/amforth-6.5/appl/arduino/leonardo.asm
@@ -0,0 +1,15 @@
+; 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"
+
+; letters the same. Set to 0 if you do not want it
+.set WANT_IGNORECASE = 1
+
+; cpu clock in hertz
+.equ F_CPU = 16000000
+
+.include "drivers/usart_1.asm"
+
+.include "amforth.asm"
diff --git a/amforth-6.5/appl/arduino/leonardo.eep.hex b/amforth-6.5/appl/arduino/leonardo.eep.hex
new file mode 100644
index 0000000..9449707
--- /dev/null
+++ b/amforth-6.5/appl/arduino/leonardo.eep.hex
@@ -0,0 +1,7 @@
+:10005600FFFFA10AD301B000B5097E00B00A930ADA
+:0A006600E6026A00EC3F01006A00A8
+:06007E00020057064306D4
+:100088007D3B8A0000000000FF0AAF0AAF0A0000AB
+:100098000A00C500D3009A00B5005E0200004B02BA
+:0800A800C83CE73CD73C1900FD
+:00000001FF
diff --git a/amforth-6.5/appl/arduino/leonardo.hex b/amforth-6.5/appl/arduino/leonardo.hex
new file mode 100644
index 0000000..2b1ad5e
--- /dev/null
+++ b/amforth-6.5/appl/arduino/leonardo.hex
@@ -0,0 +1,630 @@
+:020000020000FC
+:02000400FCD02E
+:02000800FAD02C
+:02000C00F8D02A
+:02001000F6D028
+:02001400F4D026
+:02001800F2D024
+:02001C00F0D022
+:02002000EED020
+:02002400ECD01E
+:02002800EAD01C
+:02002C00E8D01A
+:02003000E6D018
+:02003400E4D016
+:02003800E2D014
+:02003C00E0D012
+:02004000DED010
+:02004400DCD00E
+:02004800DAD00C
+:02004C00D8D00A
+:02005000D6D008
+:02005400D4D006
+:02005800D2D004
+:02005C00D0D002
+:02006000CED000
+:02006400CCD0FE
+:02006800CAD0FC
+:02006C00C8D0FA
+:02007000C6D0F8
+:02007400C4D0F6
+:02007800C2D0F4
+:02007C00C0D0F2
+:02008000BED0F0
+:02008400BCD0EE
+:02008800BAD0EC
+:02008C00B8D0EA
+:02009000B6D0E8
+:02009400B4D0E6
+:02009800B2D0E4
+:02009C00B0D0E2
+:0200A000AED0E0
+:0200A400ACD0DE
+:1000A800AAD0000A000400702B000A0041546D65B4
+:1000B80067613332553407FF3E72782D62756600EA
+:1000C80000006600082F10911001E0E0F1E0E10F58
+:1000D800F31D008313951F70109310018991999156
+:1000E8000C94043806FF6973722D72785F0000382B
+:1000F8003C38CE009738B0383C380300DE3F3538FE
+:100108008600373D65001F3800383C387B003C3896
+:100118003200A43C3C3800013C3816005339973E65
+:100128001F3806FF72782D62756676000038B500B4
+:1001380035389B003C3811019738B0383C380001FD
+:100148009C399738C3382E3A3C380F00123A3C385D
+:1001580011018C381F3807FF72783F2D62756600D1
+:10016800950000382F3D3C38110197383C38100174
+:10017800973812391F3807FF74782D706F6C6C0030
+:10018800AF000038D3003538C6003C38CE008C3874
+:100198001F3808FF74783F2D706F6C6CBF000038F3
+:1001A8002F3D3C38C80097383C382000123A1F3899
+:1001B80004FF75627272CD006E38AE009F3DA93D96
+:1001C80006FF2B7573617274DC0000383C389800A8
+:1001D8003C38C9008C383C3806003C38CA008C389A
+:1001E800E000B038F83A3C38CD008C383C38CC00C8
+:0601F8008C3888001F385E
+:040000000C94383DE7
+:1001FE000A920FB60A920F900F900A94B02CFF93AA
+:10020E00EF93E2E1F1E00694E00DF31D008003941C
+:10021E000082EF91FF9109900FBE0990089502FFA1
+:10022E006D2BE4000038C63F143C1F3803FF756485
+:10023E002A0016010038B038FE38DF39D838C338F6
+:10024E00F538DF39E0389C391F3804FF756D617859
+:10025E001D010038C83E5B3935383601C338D838F1
+:10026E001F3804FF756D696E2C010038C83E663963
+:10027E0035384201C338D8381F3800383C38008032
+:10028E00123A193935384D01E53F1F384A391F38B2
+:10029E000AFF6E616D653E666C61677338010038EA
+:1002AE00CA3B3C3800FF123A1F3803FF76657200D6
+:1002BE004F010038C102EA03AD3FBC3E7838CF0291
+:1002CE00403FC63F080310033C382E00F9022603B8
+:1002DE0031032004BC3E8038AD3FD702EA031F38FD
+:1002EE0004FF6E6F6F705C0100381F3806FF756E6D
+:1002FE0075736564770100388C3A223F92391F3846
+:10030E000200746F7D0100382F04CF3FB63E78385F
+:10031E0035389B01430795014E071F380038F538D5
+:10032E00B038A701FE38CA3BB038A701A701CA3BB7
+:10033E0029381F3807FF692D63656C6C2B00870108
+:10034E0000382E3A1F3808FF69636F6D7061726551
+:10035E00A1010038FE38CE38F53812393538BB01D8
+:10036E00D13ED8384A391F38C33853390D0835387D
+:10037E00E0019A3ACE387838E301CE38CA3BE30131
+:10038E00B0383C3800015B393538D101C3383C38C0
+:10039E00FF00123A12393538D801D13E4A39D33AD4
+:1003AE001F382E3AC3388F3CC3383C380200B93A56
+:1003BE00C101D13E53391F380038B0383C38FF00E8
+:1003CE00123A783FC338F83A3C38FF00123A783F79
+:1003DE00F83A1B3A1F3801FF2A00AA010038A53946
+:1003EE00D8381F3801FF6A00F2010038753A3C38E0
+:1003FE0007009C397838753A3C3809009C397838B2
+:10040E009C391F3804FF64616273F9010038B038FB
+:10041E002039353813021A021F3807FF646E6567DC
+:10042E0061746500090200383A3CE53F5339143CCB
+:10043E001F3805FF636D6F76650014022602BF93A9
+:10044E00AF93E991F991A991B991092F082B21F058
+:10045E001D9111930197E1F7AF91BF9189919991F8
+:10046E000C94043805FF3273776170002002003857
+:10047E00E038FE38E038F5381F380AFF72656669D5
+:10048E006C6C2D7469623902003867023C385A0070
+:10049E007F046D0280385339E13E80384A391F3867
+:1004AE000AFF736F757263652D74696244020038BA
+:1004BE0067026D0278381F3803FF746962005702B5
+:1004CE0047383D0104FF2374696263024738970180
+:1004DE0006FF65653E72616D6902003853399A3ABE
+:1004EE00CE385E3BCE3880388F3CC3388F3CC33815
+:1004FE00C83A7702D13E1F3808FF696E69742D72B3
+:10050E00616D6F0200383C388C00013B3C38220094
+:10051E00033A74021F380BFF656E7669726F6E6D4B
+:10052E00656E740083024738660009FF776F726448
+:10053E006C6973747300000000383C3808001F3873
+:10054E0004FF2F7061649C0200388C3AE73E9239AA
+:10055E001F3805FF2F686F6C6400A7020038E73E56
+:10056E00223F92391F380AFF666F7274682D6E61D2
+:10057E006D65B0020038B7030700616D666F727467
+:10058E0068001F3807FF76657273696F6E00BA02D6
+:10059E0000383C3841001F3803FF63707500C902F4
+:1005AE0000383C38590016041F3808FF6D63752D4E
+:1005BE00696E666FD30200383C3855001F3805FF50
+:1005CE002F7573657200DC0200383C382C001F3822
+:1005DE0003FF686C640092024738990104FF686F4C
+:1005EE006C64EF020038F302B0387838343AB03821
+:1005FE00FE38C3388038F5388C381F3802FF3C235C
+:10060E00F5020038E73EF30280381F3801FF230061
+:10061E0005030038BC3E78388D03E0383C380900BD
+:10062E00CE386D3935381E033C3807009C393C38BE
+:10063E0030009C39F9021F3802FF23730D03003876
+:10064E001003C83E1B3A1939353827031F3802FFED
+:10065E00233E23030038D13EF3027838E73ECE38EE
+:10066E0092391F3804FF7369676E2E0300382039E4
+:10067E00353844033C382D00F9021F3803FF642E31
+:10068E00720039030038FE38D93E0D0208032603E6
+:10069E00E0383D033103F538CE389239B63F2004A9
+:1006AE001F3802FF2E7245030038FE38C63FF5385C
+:1006BE0049031F3802FF642E58030038533949038B
+:1006CE00AD3F1F3801FF2E0061030038C63F6403A3
+:1006DE001F3803FF75642E006903003853397D03FC
+:1006EE00AD3F1F3804FF75642E7270030038FE385C
+:1006FE00080326033103F538CE389239B63F20046D
+:10070E001F3806FF75642F6D6F6479030038FE384D
+:10071E0053390739C139F538C338FE38C139F53880
+:10072E001F3806FF64696769743F88030038653FA8
+:10073E00B0383C38390077393C380001123A9C39D0
+:10074E00B0383C38400177393C380701123A9239BB
+:10075E003C3830009239B038BC3E78385B391F389F
+:10076E00003807391604F538CE382E3A033A9C393C
+:10077E002E3AFE381F3802FF732C98030038B0381B
+:10078E00C9031F3800384E07B038033AD93E0A3A2B
+:10079E009239FE3853390D083538DC039A3AB038A1
+:1007AE0078384E078F3CC83AD603F5382739353896
+:1007BE00E303B03897384E07D8381F3805FF6974F1
+:1007CE0079706500C2030038B038033AD93E0A3A50
+:1007DE009239FE3853390D083538FE039A3AB0383F
+:1007EE00CA3BB0380B0407042E3AC83AF603F53864
+:1007FE00273935380504B038CA3B0B04D8381F38B2
+:10080E000038F83A0B041F3800383C38FF00123A13
+:10081E00F13E1F3806FF69636F756E74E50300388D
+:10082E00B0382E3AC338CA3B1F3804FF747970654E
+:10083E0011040038983F0D0835382B049A3AAB3A1C
+:10084E009738F13EC83A26041F3801FF27001C04D2
+:10085E000038A205E505F005B0387D06DE3FC33849
+:10086E00CA3B3C387B01DE3F1B3A353841043C38ED
+:10087E00F3FF853DD8381F3805FF63736B69700031
+:10088E002C040038FE38B03835385704CE38973837
+:10089E000739DE3F35385704E53F93052E384A04B5
+:1008AE00F538D8381F3805FF637363616E00430453
+:1008BE000038FE38CE38B03897380739DE3F193950
+:1008CE0035387404C338343AC338CE382039193920
+:1008DE00353874042E3A2E386204EF38CE389239F9
+:1008EE00F538D8381F3806FF6163636570745A0493
+:1008FE000038CE389C39343ACE38023FB038C00476
+:10090E0019393538B204B0383C380800DE3F353876
+:10091E00A204D838E038C83E7739FE38E038E038DF
+:10092E00F5383538A004B804343AFE38CE38F538E8
+:10093E0030012E38B004B038533F6D393538A90424
+:10094E00D838533FB038F13ECE388C382E3ACE38A8
+:10095E003C012E388404D838EF38C3389239A03F82
+:10096E001F3800383C380800B038F13EAD3FF13E3C
+:10097E001F380038B0383C380D00DE3FC3383C38E5
+:10098E000A00DE3F1B3A1F3806FF726566696C6C03
+:10099E007A04FE3D1A00C73DD33D04FF63686172C1
+:1009AE00CB040038A205D83897381F3806FF6E756D
+:1009BE006D626572D4040038BC3E7838FE38260568
+:1009CE00FE3839052605F5381B3AFE38B038193988
+:1009DE003538F904D13EF538D838F538BC3E803874
+:1009EE0053391F381D3B533953392C3B5705B838F3
+:1009FE0035381B05E53FDE3F3538120597383C3854
+:100A0E002E00DE3F35381305F53835380F051A023E
+:100A1E00EA3F2E382105D838D13EF538D838F5388A
+:100A2E00BC3E803853391F38D13EF5383538200555
+:100A3E00263EE53FF538BC3E80384A391F3800382F
+:100A4E00CE3897383C382D00DE3FB038FE3835387A
+:100A5E003205E53F9305F5381F3851380A0010006E
+:100A6E0002000A000038CE3897383C3823009239FD
+:100A7E00B03853393C380400563E35384F053405EE
+:100A8E009C39CA3BBC3E8038E53F93052E38500555
+:100A9E00D8381F3807FF3E6E756D62657200DD0433
+:100AAE000038B03835386F05CE3897389D03193970
+:100ABE0035386305D8381F38FE383E02BC3E7838CC
+:100ACE002101F53819013E02E53F93052E385805F0
+:100ADE001F3805FF70617273650051050038FE38CE
+:100AEE008905E13E78389305F5385F04B0382E3A23
+:100AFE00E13E643AE53F93051F3806FF736F75724A
+:100B0E0063657005FE3D1600C73DD33D07FF2F738D
+:100B1E007472696E670084050038E038CE389C39EF
+:100B2E00E038E03892391F380AFF70617273652D14
+:100B3E006E616D658D050038533FA6051F38003870
+:100B4E00FE388905E13E7838930507394804F538B3
+:100B5E005F04C83E9C398905D8389239E13E803809
+:100B6E001F3803FF737030009B056E380600C73DBB
+:100B7E00D33D02FF7370B8055738080003FF72703B
+:100B8E003000C0050038CD0578381F3857380400BE
+:100B9E0005FF646570746800C5050038BC058C3AA5
+:100BAE009239033A343A1F3810FF666F7274682D0B
+:100BBE007265636F676E697A6572CF056E38600015
+:100BCE009F3DA93D09FF7265636F676E697A650087
+:100BDE00DB0500383C38FB05C3388E09193935382A
+:100BEE00FA05D13E7D061F380038E038E038C83EA1
+:100BFE001D3BE03829382C3BE038B0387D06DE3F0F
+:100C0E0035380C06D83853391F38EF38EF384A3993
+:100C1E001F3809FF696E7465727072657400E9059C
+:100C2E000038A205B03835382806E505F005B63E81
+:100C3E00783835382306A701CA3B29388A3F2E3823
+:100C4E001806D13E1F3806FF64743A6E756D100695
+:100C5E0051387B016407640707FF64743A646E754C
+:100C6E006D002A0651387B01D63FD63F07FF7265CD
+:100C7E00633A6E756D0033060038E20435384F0660
+:100C8E00E53FDE3F35384D062F061F3839061F3833
+:100C9E007D061F3808FF7265633A66696E643D060D
+:100CAE000038F206B038193935386006D8387D0666
+:100CBE001F3867061F3805FF64743A7874005106B2
+:100CCE0051386B066F06D63F0038D83829381F3892
+:100CDE0000382039353875064E071F3829381F3829
+:100CEE0007FF64743A6E756C6C00620651388106AB
+:100CFE008106810600383C38F3FF853D0FFF736592
+:100D0E00617263682D776F72646C69737400770615
+:100D1E000038FE3853393C38A406F538C106B038D1
+:100D2E00193935389E06D13ED83853391F38B03868
+:100D3E00E806C338560144011F380038FE38D8384B
+:100D4E00C83E0739DC06B0013538B206F538D8385A
+:100D5E0053394A391F38D13EF53853391F3811FFF0
+:100D6E0074726176657273652D776F72646C6973D8
+:100D7E007400850600385E3BB0383538D206C83E62
+:100D8E001D3BC33829382C3BE0383538D206FD09D7
+:100D9E00CA3B2E38C306D13E1F380BFF6E616D6500
+:100DAE003E737472696E6700B606003816043C38DE
+:100DBE00FF00123A1F3807FF6E66613E63666100E0
+:100DCE00D4060038FD092E3A1F3807FF66696E6497
+:100DDE002D787400E20600383C38FE063C386C0074
+:100DEE008E0919393538FD06D13E53391F38003872
+:100DFE00FE38C83EF5388F06B03835380B07FE384A
+:100E0E00EF38EF38F5384A391F3806FF6E657765CB
+:100E1E007374EC0647389B0106FF6C61746573743E
+:100E2E000C0747389F0108FF2863726561746529B6
+:100E3E0013070038A2057708B03811078F3C8038A9
+:100E4E005C08110780381F3801005C001A07003853
+:100E5E008905EF38E13E80381F38010028002B0746
+:100E6E0000383C3829007505D13E1F3807FF636FE7
+:100E7E006D70696C650034070038F538B038A7011D
+:100E8E00FE38CA3B4E071F3801FF2C003D070038C5
+:100E9E00113F723B113F2E3A9501123F1F3803004E
+:100EAE005B275D004B0700382F0464071F380700CF
+:100EBE006C69746572616C005607003843073C38E4
+:100ECE004E071F380800736C69746572616C5E079B
+:100EDE0000384307B703C5031F380038113F4307D7
+:100EEE00FFFF1F3800388A3F113FC338723B1F384F
+:100EFE000038113F1F3800388A3F4E071F38050053
+:100F0E006168656164006907003843072E3874070D
+:100F1E001F380200696686070038430735387407A4
+:100F2E001F380400656C73659007003843072E3830
+:100F3E007407C33879071F3804007468656E980704
+:100F4E00003879071F380500626567696E00A307D0
+:100F5E0000387F071F3805007768696C6500AA079F
+:100F6E0000389307C3381F380600726570656174C8
+:100F7E00B2070038D407A7071F380500756E7469CD
+:100F8E006C00BB0700383C3835384E0782071F38D7
+:100F9E000500616761696E00C407003843072E388B
+:100FAE0082071F380200646FCF07003843079A3A52
+:100FBE007F07533937081F3804006C6F6F70D907DD
+:100FCE0000384307C83A1E081F3805002B6C6F6F98
+:100FDE007000E30700384307B93A1E081F380500B2
+:100FEE006C6561766500EC0700384307D33A8B07D2
+:100FFE0037081F3803003F646F00F60700384307B9
+:10100E000D089307DC07C33837081F380038C83E71
+:10101E00DE3FB038FE3835381508D13EF538FC398C
+:10102E001F3807FF656E646C6F6F70000108003823
+:10103E0082072B08B83835382708A7072E3820081E
+:10104E001F3802FF6C3E180800384A087838783886
+:10105E003C38FEFF4A08643A1F3802FF3E6C2808EF
+:10106E000038EA3F4A08643A4A08783880381F3810
+:10107E0003FF6C70300034086E3862009F3DA93D4E
+:10108E0002FF6C703F084738A10106FF637265616D
+:10109E0074654708003820078008430751381F3809
+:1010AE0006FF6865616465724C080038113FFE38B2
+:1010BE00FE38B038273935386E08B0383C3800FF66
+:1010CE001B3AC903F5385E3B4E07F5381F383C38DE
+:1010DE00F0FF853D07FF776C73636F7065005708EF
+:1010EE00FE3D5E009F3DA93D06FF72657665616C13
+:1010FE007108003811078F3C7838B83835388B08AE
+:10110E0011077838C3383A3B1F380500646F657392
+:10111E003E007B0800384307A40843070E9443079C
+:10112E0099081F389A938A93CB0101967F916F91FC
+:10113E00BF93AF93DB010C9404380038F5381107D8
+:10114E008F3C78385E3BE806723B1F3801FF3A0051
+:10115E008C0800382007BB08D8381F3807FF3A6EB6
+:10116E006F6E616D6500AD080038113FB03818071D
+:10117E00803843070038D0081F3801003B00B508FF
+:10118E00003843071F38D80880081F3801FF5D005C
+:10119E00C4080038E53FB63E80381F3801005B00BA
+:1011AE00CD0800385339B63E80381F3808FF7661B7
+:1011BE00726961626C65D5080038223FEF08EA3F1C
+:1011CE002B3F1F3808FF636F6E7374616E74DD08FA
+:1011DE00003820078008430747384E071F3804FFA2
+:1011EE0075736572E9080038200780084307573881
+:1011FE004E071F3807007265637572736500F60837
+:10120E000038180778384E071F3809FF696D6D656D
+:10121E0064696174650001090038B5095E3BB03838
+:10122E00CA3B3C38FF7F123AC338723B1F38060068
+:10123E005B636861725D0C09003843073C38D80463
+:10124E004E071F38060061626F7274221E09003845
+:10125E00893E430740091F3805FF61626F727400B3
+:10126E00290900384A39853D06FF3F61626F727465
+:10127E0033090038E03835384609EA033809D13EDB
+:10128E001F3809FF6765742D737461636B003B092A
+:10129E000038B0388F3CC3385E3BB038FE38533917
+:1012AE00C3380D08353866099A3AAB3A343AC33E1C
+:1012BE00CE389C395E3BC3384A39B93A5C09D13EC7
+:1012CE00F5381F3809FF7365742D737461636B00F5
+:1012DE0048090038CE382039353878093C38FCFFBB
+:1012EE00853DC83E3A3BC33853390D08353885091C
+:1012FE009A3A8F3CD93E3A3BC83A8009D8381F38C3
+:10130E0009FF6D61702D737461636B00690900389C
+:10131E00B0388F3CC3385E3BC33E983F0D0835381E
+:10132E00AA099A3AAB3A5E3BC338FE3807392938D8
+:10133E00B8383538A609F538D838D33A1F38F538C5
+:10134E00EA3FB93A9909D83853391F380BFF676508
+:10135E00742D63757272656E7400870900383C389F
+:10136E0068005E3B1F3809FF6765742D6F726465F8
+:10137E007200AD0900383C386C004F091F3809FF68
+:10138E006366672D6F7264657200BA0947386C0028
+:10139E0007FF636F6D7061726500C609D609BF9352
+:1013AE00AF938C0189919991DC01899199919C015E
+:1013BE0089919991FC01ED90F190EF1451F40A95F9
+:1013CE0019F02A95C1F701C02A95022B11F488272E
+:1013DE0002C08FEF00C0982FAF91BF910C940438CC
+:1013EE0007FF6E66613E6C666100CF090038DC0651
+:1013FE002E3A033A9C391F380BFF7365742D6375B3
+:10140E007272656E7400F70900383C3868003A3B1A
+:10141E001F3808FF776F72646C697374030A0038A3
+:10142E001A3F5339CE383A3BB0388F3C95011B3FAB
+:10143E001F380EFF666F7274682D776F72646C6959
+:10144E007374100A47386A0009FF7365742D6F7242
+:10145E0064657200200A00383C386C0070091F3831
+:10146E000FFF7365742D7265636F676E697A6572AF
+:10147E0073002B0A00383C387E0070091F380FFFAE
+:10148E006765742D7265636F676E697A6572730036
+:10149E00370A00383C387E004F091F3804FF636F4F
+:1014AE006465460A003820078008113FA7014E07E1
+:1014BE001F3808FF656E642D636F6465550A00382A
+:1014CE0043070C94430704381F3808FF286D6172D8
+:1014DE006B657229600A6E388A009F3DA93D08002F
+:1014EE00706F7374706F6E656C0A0038A205E50537
+:1014FE00F005B038FE38A701A701CA3B2938F538E8
+:10150E00A701CA3B4E071F380BFF6170706C7475D4
+:10151E00726E6B657900760A0038E900963C6001C0
+:10152E00AD3FB7030A00466F7274686475696E6FDB
+:04153E00EA031F3865
+:10700000BF93AF93DB011196B21469F4FD01EE0F4B
+:10701000FF1F659175911196FB01EE0FFF1F059102
+:107020001591F80109949A938A938B2D9927BB2483
+:107030006FEB7CE3F1CF04FF657869748B0A20382D
+:10704000AF91BF91E1CF07FF657865637574650007
+:107050001B382A38BC0189919991DECF2F38FD0168
+:10706000EE0FFF1FA591B591CFCF3638982B8991A0
+:107070009991A9F31196C8CF3D389A938A93FD014F
+:10708000EE0FFF1F859195911196BECF47389A93C9
+:107090008A93FB013196EE0FFF1F85919591B4CF36
+:1070A00051389A938A93CB010196AECF57389A9371
+:1070B0008A93FB013196EE0FFF1F85919591840D08
+:1070C000951DA2CF07FF2876616C756529002338CE
+:1070D00000382007800843076E381F380E9499083F
+:1070E000B038A701CA3B29381F3801FF4000623879
+:1070F0007938FC018191919187CF01FF210075388A
+:107100008138FC018991999191838083899199912A
+:107110007BCF02FF63217D388D38FC0189919991E5
+:1071200080838991999170CF02FF634089389838A4
+:10713000FC019927808168CF02FF407594380038A0
+:10714000013B9C3978381F3802FF21759C38003884
+:10715000013B9C3980381F3803FF64757000A438E8
+:10716000B1389A938A9350CF04FF3F647570AC385E
+:10717000B938082F092B11F09A938A9345CF04FF51
+:1071800073776170B438C4388C01899199911A93DE
+:107190000A933ACF04FF6F766572BF38CF389A935F
+:1071A0008A938A819B8130CF04FF64726F70CA38E2
+:1071B000D9388991999128CF03FF726F7400D43820
+:1071C000E1388C0129913991899199913A932A93C7
+:1071D0001A930A9319CF03FF6E697000DC38F038F8
+:1071E000229612CF02FF723EEB38F6389A938A93BA
+:1071F0008F919F9109CF02FF3E72F238FF389F9323
+:107200008F938991999100CF02FF7240FB38083922
+:107210009A938A938F919F919F938F93F5CE02FFBC
+:107220003C3E04390038DE3F19391F3802FF303D3B
+:107230000F391A39982BD1F530C002FF303C16397E
+:10724000213997FD2AC032C002FF303E1D3928394E
+:10725000821593055CF151F120C003FF64303E00BC
+:1072600024393239821593058991999182059305C4
+:10727000ECF0E1F012C003FF64303C002D394039DE
+:10728000229697FD0C944D390C94563904FF747274
+:1072900075653B394B399A938A938FEF9FEFB4CE44
+:1072A00001FF3000463954399A938A93C101ACCE1C
+:1072B00002FF753C50395C39299139918217930747
+:1072C000A8F3A1F3EACF02FF753E58390038C3385E
+:1072D0005B391F3801FF3C0063396E3929913991C0
+:1072E000281739071CF7D9CF01FF3E006A397839D2
+:1072F0002991399128173907CCF2C1F2CECF04FF7A
+:107300006C6F673274398439FC01992780E18A9562
+:1073100022F0EE0FFF1FD8F777CE9A9575CE01FFBA
+:107320002D007F39933909911991081B190BC80158
+:107330006BCE01FF2B008F399D3909911991800F78
+:10734000911F62CE02FF6D2A9939A6398C0189916D
+:1073500099919C0131027001209FC0013003F30814
+:10736000900DE11CF31C1203F308900DE11CF31CBB
+:107370009A938A93C70148CE06FF756D2F6D6F648F
+:10738000A239C2397C01299139910991199140E1C1
+:107390005527000F111F221F331F551F2E153F05A4
+:1073A000520518F003952E193F094A9589F73A932B
+:1073B0002A93C80129CE03FF756D2A00BC39E03934
+:1073C0008C0189919991809FF00122273327909F0A
+:1073D000F00D211D331D819FF00D211D331D919F47
+:1073E000200D311DCF019A938A93C9010DCE06FF5E
+:1073F000696E76657274DB39FD398095909504CE9F
+:1074000002FF322FF739043A95958795FDCD02FF9B
+:10741000322A003A0B3A880F991FF6CD03FF616EAE
+:107420006400073A133A0991199180239123ECCD16
+:1074300002FF6F720E3A1C3A09911991802B912B21
+:10744000E3CD03FF786F7200183A263A099119913B
+:1074500080279127D9CD02FF312B213A2F3A01966F
+:10746000D3CD02FF312D2B3A353A0197CDCD07FF11
+:107470003F6E656761746500313A003820393538F0
+:10748000423A263E1F3806FF6C7368696674373AC5
+:10749000493AFC018991999131971AF0880F991F07
+:1074A000FBCFB2CD06FF727368696674433A583AEF
+:1074B000FC018991999131971AF096958795FBCFA8
+:1074C000A3CD02FF2B21523A653AFC018991999193
+:1074D00020813181820F931F8083918389919991BB
+:1074E00093CD03FF72704000613A763A9A938A9383
+:1074F0008DB79EB789CD03FF72702100713A803A33
+:107500002FB7F8948DBF9EBF2FBF899199917CCDE5
+:1075100003FF737040007B3A8D3A9A938A93CE01B1
+:1075200073CD03FF73702100883A963AEC0189917C
+:1075300099916ACD9B3A29913991E0E83E0F821BDF
+:10754000930B3F932F939F938F93899199915CCD48
+:1075500001FF6900913AAC3A9A938A938F919F9177
+:10756000EF91FF91FF93EF939F938F938E0F9F1F48
+:107570004BCDBA3AEF91FF91E80FF91F899199919C
+:107580001BF0FF93EF936BCD0F911F9111963CCDA4
+:10759000C93AEF91FF913196BBF3F3CF06FF756EB9
+:1075A0006C6F6F70A83AD43A1F910F911F910F9191
+:1075B0002BCD06FF636D6F76653ECE3ADF3ABF9303
+:1075C000AF93E991F991A991B991092F082B41F055
+:1075D000E80FF91FA80FB91F1E9112930197E1F749
+:1075E000AF91BF91899199910FCD02FF3E3CD93A5D
+:1075F000F93A092F982F802F07CD03FF75704000AF
+:10760000F53A023B9A938A93C201FECC03FF757050
+:107610002100FD3A0B3B2C0189919991F5CC03FF98
+:10762000316D7300063B143BE0EAFFE03197F1F760
+:10763000EBCC03FF323E72000F3B1E3BFC018991F5
+:1076400099919F938F93FF93EF9389919991DCCCBC
+:1076500003FF32723E00193B2D3B9A938A93EF91C0
+:10766000FF918F919F919A938A93CF01CDCC02FF86
+:107670002165283B3B3BFC01899199912FB7F894F8
+:1076800028D000B5081709F00BD0319622D000B5EC
+:10769000091711F0892F04D02FBF89919991B4CC8B
+:1076A000F999FECF07B700FDFDCFF2BDE1BD80BD6A
+:1076B000FA9AF99A089502FF4065373B5F3B2FB76E
+:1076C000F894FC0106D080B5319603D090B52FBF59
+:1076D0009BCCF999FECFF2BDE1BDF89A089502FF67
+:1076E00021695B3BFE3D88009F3DA93D09FF2821A4
+:1076F000692D6E72777729006F3B7E3B1FB71F9312
+:10770000F8949C0189919991AF93BF93CF93DF93A4
+:1077100009D0DF91CF91BF91AF91899199911F913C
+:107720001FBF72CC10D0E094F0948E219F21982B33
+:1077300019F0F90102E020D0F90104E01DD0F901AF
+:1077400000E11AD00895F901E07CFF7FEF01A0E489
+:10775000B0E0FE01EE0FFF1F45915591FE01E217CB
+:10776000F30711F00A0102C07A010C01002704D0CE
+:107770002196119771F70895F999FECF17B710FD6B
+:10778000FDCFEE0FFF1F016007BFE895089502FFD0
+:107790004069763BCB3BFC01EE0FFF1F8591959135
+:1077A00033CC03FF6E3E7200C73BD63BFC01082F73
+:1077B000899199919F938F930A95D1F7EF93FF93B6
+:1077C0008991999121CC03FF6E723E00D13BE83B39
+:1077D0009A938A93FF91EF910E2F8F919F919A9395
+:1077E0008A930A95D1F7CF010FCC03FF64322A00A8
+:1077F000E33BFA3B09911991000F111F881F991F54
+:107800001A930A9301CC03FF64322F00F53B083C26
+:107810000991199195958795179507951A930A934C
+:10782000F3CB02FF642B033C153C29913991E9907D
+:10783000F99049915991240F351F8E1D9F1D3A9340
+:107840002A93E2CB02FF642D113C263C2991399109
+:10785000E990F99049915991421B530BE80AF90AB2
+:107860005A934A93C701D0CB07FF64696E7665725D
+:107870007400223C3B3C09911991809590950095AC
+:1078800010951A930A93C0CB04FF2F6D6F64343C9C
+:10789000493C9C0109911991412F432717FF04C0CE
+:1078A000109500950F5F1F4F37FF04C0309520954E
+:1078B0002F5F3F4FEE24FF1851E1001F111F5A9513
+:1078C00039F447FF04C0109500950F5F1F4F0BC0A0
+:1078D000EE1CFF1CE21AF30A20F4E20EF31E889459
+:1078E000ECCF0894EACFFA92EA92C8018DCB03FF5D
+:1078F00061627300443C0038B0383D3A1F3804FFE1
+:107900007069636B773C00382E3AC33E8C3A9C39E1
+:1079100078381F3805FF63656C6C2B007F3C903C0A
+:10792000029672CB04FF2B696E748A3C973C789464
+:107930006BCB04FF2D696E74923C9E3CF89464CB33
+:1079400004FF696E7421993C00383C3800009C3972
+:107950003A3B1F3804FF696E7440A03C00383C3845
+:1079600000009C395E3B1F3808FF696E742D7472ED
+:107970006170AA3CBB3CB82E8991999145CB0038E7
+:10798000AE3C2938C43C1F38C53C01D03DCB1895CE
+:107990000038B7030300206F6B00EA031F3803FFB2
+:1079A0002E6F6B00B43CFE3D1C00C73DD33D00383C
+:1079B000B70302003E20A03FEA031F3806FF2E72E5
+:1079C00065616479CF3CFE3D2000C73DD33D003862
+:1079D000B7030400203F3F20EA03BC3E7838FE385E
+:1079E000403F6C03E13E78386C03F538BC3E80388C
+:1079F0001F3806FF2E6572726F72DE3CFE3D1E0060
+:107A0000C73DD33D04FF71756974F93C00384308E4
+:107A10004A088038BC05953AC9057F3AD808B63E71
+:107A2000783819393538153DE33CD0043538273DD1
+:107A30003C3817066F3DB8383538273DB0383C38EC
+:107A4000FEFF6D393538253DFE3C2E38073DD33CD1
+:107A50002E380F3D05FF706175736500023DFE3DD8
+:107A6000A301B33DBD3D04FF636F6C642A3D383D07
+:107A7000A4B622243324BB2424BEE0E0F1E021920A
+:107A8000E030E9F7FB30D9F7E5EAF1E02F010FEF3D
+:107A90000DBF04831AE01EBF1583CFEAC683DAE068
+:107AA000D783A9E5BDE3B0CA04FF7761726D333DAA
+:107AB000003889023C387B013C382F3DDE3DD80838
+:107AC0005B3F063D07FF68616E646C657200543D64
+:107AD00057380A0005FF636174636800623D00382F
+:107AE0008C3AFE38683D7838FE38753A683D803803
+:107AF0002938F538683D8038F538D83853391F387B
+:107B000005FF7468726F77006A3D0038B038193924
+:107B100035388C3DD8381F38683D78387F3AF5388D
+:107B2000683D8038F538C338FE38953AD838F5388E
+:107B30001F3807FF4564656665724000803D003868
+:107B4000CA3B5E3B1F3807FF4564656665722100CE
+:107B5000993D0038CA3B3A3B1F3807FF52646566BF
+:107B600065724000A33D0038CA3B78381F3807FFD4
+:107B70005264656665722100AD3D0038CA3B8038AD
+:107B80001F3807FF5564656665724000B73D0038D1
+:107B9000CA3B013B9C3978381F3807FF556465663E
+:107BA00065722100C13D0038CA3B013B9C398038D9
+:107BB0001F3806FF646566657221CD3D0038CF3FF2
+:107BC000B038A701A701CA3B29381F3806FF6465F2
+:107BD00066657240D93D0038CF3FB038A701CA3B37
+:107BE00029381F3807FF2864656665722900E63D5D
+:107BF0000038200780084307FE3D1F380E9499087F
+:107C0000B038A701CA3B293829381F3802FF752E22
+:107C1000F23D0038533974031F3803FF752E72008C
+:107C2000063E00385339C3387D031F3805FF752FD2
+:107C30006D6F64000D3E0038FE385339F538C13998
+:107C40001F3806FF6E6567617465163E0038FC39A3
+:107C50002E3A1F3801FF2F00213E0038483CEF38F4
+:107C60001F3803FF6D6F64002A3E0038483CD83847
+:107C70001F3803FF6D696E00313E0038C83E77390A
+:107C80003538433EC338D8381F3803FF6D6178005C
+:107C9000393E0038C83E6D3935384F3EC338D83884
+:107CA0001F3806FF77697468696E453E0038CE3824
+:107CB0009239FE389239F5385B391F380DFF7368F9
+:107CC0006F772D776F72646C69737400513E003862
+:107CD0003C386D3EC338C1061F380038DC06EA0365
+:107CE000AD3F4A391F3805FF776F726473005E3EFF
+:107CF00000383C386E005E3B673E1F3802002E2283
+:107D0000733E0038893E4307EA031F38020073229E
+:107D10007E3E00383C3822007505B63E783835384E
+:107D2000923E6F071F3804FF66696C6C863E003810
+:107D3000E038E038B8383538A43E983F9A3AB03841
+:107D4000AB3A8C38C83A9F3ED8381F3805FF665F7B
+:107D500063707500933E00383C3800243C38F400D2
+:107D60001F3805FF737461746500A63E4738D10162
+:107D700004FF62617365B13E57380C0005FF63650F
+:107D80006C6C7300B83E0B3A04FF32647570BE3EF3
+:107D90000038CE38CE381F3805FF3264726F70005D
+:107DA000C43E0038D838D8381F3804FF7475636B68
+:107DB000CC3E0038C338CE381F3803FF3E696E0012
+:107DC000D53E5738180003FF70616400DD3E00386F
+:107DD000223F3C3828009C391F3804FF656D6974C8
+:107DE000E33EFE3D0E00C73DD33D05FF656D697462
+:107DF0003F00ED3EFE3D1000C73DD33D03FF6B65E8
+:107E00007900F53EFE3D1200C73DD33D04FF6B6592
+:107E1000793FFE3EFE3D1400C73DD33D02FF647036
+:107E2000063F6E3858009F3DA93D05FF65686572A5
+:107E300065000E3F6E385C009F3DA93D04FF6865FC
+:107E40007265153F6E385A009F3DA93D05FF616C74
+:107E50006C6F74001E3F0038223F9C399501233F10
+:107E60001F3803FF62696E00263F0038EA3FBC3EC0
+:107E700080381F3807FF646563696D616C00313FAE
+:107E800000383C380A00BC3E80381F3803FF686564
+:107E900078003A3F00383C381000BC3E80381F382C
+:107EA00002FF626C463F4738200007FF7475726E10
+:107EB0006B657900503FFE3D64009F3DA93D07FF83
+:107EC000746F757070657200553F0038B0383C387B
+:107ED00061003C387B00563E3538713F3C38DF004E
+:107EE000123A1F3807FF746F6C6F776572005F3F3F
+:107EF0000038B0383C3841003C385B00563E3538DD
+:107F0000843F3C3820001B3A1F3806FF3F737461E2
+:107F1000636B723F0038D40520393538923F3C38C6
+:107F2000FCFF853D1F3806FF626F756E6473853FE9
+:107F30000038CE389C39C3381F3802FF6372933F34
+:107F400000383C380D00F13E3C380A00F13E1F3845
+:107F500005FF7370616365009D3F0038533FF13E3C
+:107F60001F3806FF737061636573A83F003853398B
+:107F7000493EB0383538C03FAD3F343A2E38B93F6E
+:107F8000D8381F3803FF733E6400B13F0038B03863
+:107F900020391F3805FF3E626F647900C23F2F3AD7
+:107FA0000800326C69746572616CCA3F0038C3386E
+:107FB000640764071F3801FF3D00D03F0038923945
+:107FC00019391F3801FF3100DB3F4738010001FF3D
+:107FD0003200E23F4738020002FF2D31E73F4738C9
+:027FE000FFFFA1
+:00000001FF
diff --git a/amforth-6.5/appl/arduino/leonardo.lst b/amforth-6.5/appl/arduino/leonardo.lst
new file mode 100644
index 0000000..f90efff
--- /dev/null
+++ b/amforth-6.5/appl/arduino/leonardo.lst
@@ -0,0 +1,10136 @@
+
+AVRASM ver. 2.1.52 leonardo.asm Sun Apr 30 20:10:13 2017
+
+leonardo.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/atmega32u4\device.asm'
+../../avr8/devices/atmega32u4\device.asm(5): Including file '../../avr8/Atmel/Appnotes2\m32U4def.inc'
+leonardo.asm(13): Including file '../../avr8\drivers/usart_1.asm'
+../../avr8\drivers/usart_1.asm(31): Including file '../../avr8\drivers/usart_common.asm'
+../../avr8\drivers/usart_common.asm(11): Including file '../../avr8\drivers/usart-rx-buffer.asm'
+../../avr8\drivers/usart_common.asm(24): Including file '../../avr8\words/usart-tx-poll.asm'
+../../avr8\drivers/usart_common.asm(29): Including file '../../avr8\words/ubrr.asm'
+../../avr8\drivers/usart_common.asm(30): Including file '../../avr8\words/usart.asm'
+leonardo.asm(15): 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(4): 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(6): Including file 'words/applturnkey.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_WATCHDOG = 0
+ .set WANT_PORTD = 0
+ .set WANT_SPI = 0
+ .set WANT_USART1 = 0
+ .set WANT_BOOT_LOAD = 0
+ .set WANT_EEPROM = 0
+ .set WANT_TIMER_COUNTER_0 = 0
+ .set WANT_TIMER_COUNTER_3 = 0
+ .set WANT_TIMER_COUNTER_1 = 0
+ .set WANT_JTAG = 0
+ .set WANT_EXTERNAL_INTERRUPT = 0
+ .set WANT_TIMER_COUNTER_4 = 0
+ .set WANT_PORTB = 0
+ .set WANT_PORTC = 0
+ .set WANT_PORTE = 0
+ .set WANT_PORTF = 0
+ .set WANT_AD_CONVERTER = 0
+ .set WANT_ANALOG_COMPARATOR = 0
+ .set WANT_CPU = 0
+ .set WANT_PLL = 0
+ .set WANT_USB_DEVICE = 0
+ .equ intvecsize = 2 ; please verify; flash size: 32768 bytes
+ .equ pclen = 2 ; please verify
+ .overlap
+ .org 2
+000002 d0fc rcall isr ; External Interrupt Request 0
+ .org 4
+000004 d0fa rcall isr ; External Interrupt Request 1
+ .org 6
+000006 d0f8 rcall isr ; External Interrupt Request 2
+ .org 8
+000008 d0f6 rcall isr ; External Interrupt Request 3
+ .org 10
+00000a d0f4 rcall isr ; Reserved1
+ .org 12
+00000c d0f2 rcall isr ; Reserved2
+ .org 14
+00000e d0f0 rcall isr ; External Interrupt Request 6
+ .org 16
+000010 d0ee rcall isr ; Reserved3
+ .org 18
+000012 d0ec rcall isr ; Pin Change Interrupt Request 0
+ .org 20
+000014 d0ea rcall isr ; USB General Interrupt Request
+ .org 22
+000016 d0e8 rcall isr ; USB Endpoint/Pipe Interrupt Communication Request
+ .org 24
+000018 d0e6 rcall isr ; Watchdog Time-out Interrupt
+ .org 26
+00001a d0e4 rcall isr ; Reserved4
+ .org 28
+00001c d0e2 rcall isr ; Reserved5
+ .org 30
+00001e d0e0 rcall isr ; Reserved6
+ .org 32
+000020 d0de rcall isr ; Timer/Counter1 Capture Event
+ .org 34
+000022 d0dc rcall isr ; Timer/Counter1 Compare Match A
+ .org 36
+000024 d0da rcall isr ; Timer/Counter1 Compare Match B
+ .org 38
+000026 d0d8 rcall isr ; Timer/Counter1 Compare Match C
+ .org 40
+000028 d0d6 rcall isr ; Timer/Counter1 Overflow
+ .org 42
+00002a d0d4 rcall isr ; Timer/Counter0 Compare Match A
+ .org 44
+00002c d0d2 rcall isr ; Timer/Counter0 Compare Match B
+ .org 46
+00002e d0d0 rcall isr ; Timer/Counter0 Overflow
+ .org 48
+000030 d0ce rcall isr ; SPI Serial Transfer Complete
+ .org 50
+000032 d0cc rcall isr ; USART1, Rx Complete
+ .org 52
+000034 d0ca rcall isr ; USART1 Data register Empty
+ .org 54
+000036 d0c8 rcall isr ; USART1, Tx Complete
+ .org 56
+000038 d0c6 rcall isr ; Analog Comparator
+ .org 58
+00003a d0c4 rcall isr ; ADC Conversion Complete
+ .org 60
+00003c d0c2 rcall isr ; EEPROM Ready
+ .org 62
+00003e d0c0 rcall isr ; Timer/Counter3 Capture Event
+ .org 64
+000040 d0be rcall isr ; Timer/Counter3 Compare Match A
+ .org 66
+000042 d0bc rcall isr ; Timer/Counter3 Compare Match B
+ .org 68
+000044 d0ba rcall isr ; Timer/Counter3 Compare Match C
+ .org 70
+000046 d0b8 rcall isr ; Timer/Counter3 Overflow
+ .org 72
+000048 d0b6 rcall isr ; 2-wire Serial Interface
+ .org 74
+00004a d0b4 rcall isr ; Store Program Memory Read
+ .org 76
+00004c d0b2 rcall isr ; Timer/Counter4 Compare Match A
+ .org 78
+00004e d0b0 rcall isr ; Timer/Counter4 Compare Match B
+ .org 80
+000050 d0ae rcall isr ; Timer/Counter4 Compare Match D
+ .org 82
+000052 d0ac rcall isr ; Timer/Counter4 Overflow
+ .org 84
+000054 d0aa rcall isr ; Timer/Counter4 Fault Protection Interrupt
+ .equ INTVECTORS = 43
+ .nooverlap
+
+ ; compatability layer (maybe empty)
+
+ ; controller data area, environment query mcu-info
+ mcu_info:
+ mcu_ramsize:
+000055 0a00 .dw 2560
+ mcu_eepromsize:
+000056 0400 .dw 1024
+ mcu_maxdp:
+000057 7000 .dw 28672
+ mcu_numints:
+000058 002b .dw 43
+ mcu_name:
+000059 000a .dw 10
+00005a 5441
+00005b 656d
+00005c 6167
+00005d 3233
+00005e 3455 .db "ATmega32U4"
+ .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
+
+ ; letters the same. Set to 0 if you do not want it
+ .set WANT_IGNORECASE = 1
+
+ ; cpu clock in hertz
+ .equ F_CPU = 16000000
+
+ .include "drivers/usart_1.asm"
+
+ .equ BAUDRATE_HIGH = UBRR1H
+ .equ USART_C = UCSR1C
+ .equ USART_B = UCSR1B
+ .equ USART_A = UCSR1A
+ .equ USART_DATA = UDR1
+
+ .equ URXCaddr = URXC1addr
+ .equ UDREaddr = UDRE1addr
+
+ .equ bm_USART_RXRD = 1 << RXC1
+ .equ bm_USART_TXRD = 1 << UDRE1
+ .equ bm_ENABLE_TX = 1 << TXEN1
+ .equ bm_ENABLE_RX = 1 << RXEN1
+ .equ bm_ENABLE_INT_RX = 1<<RXCIE1
+ .equ bm_ENABLE_INT_TX = 1<<UDRIE1
+
+ .equ bm_USARTC_en = 0
+ .equ bm_ASYNC = 0 << 6
+ .equ bm_SYNC = 1 << 6
+ .equ bm_NO_PARITY = 0 << 4
+ .equ bm_EVEN_PARITY = 2 << 4
+ .equ bm_ODD_PARITY = 3 << 4
+ .equ bm_1STOPBIT = 0 << 3
+ .equ bm_2STOPBIT = 1 << 3
+ .equ bm_5BIT = 0 << 1
+ .equ bm_6BIT = 1 << 1
+ .equ bm_7BIT = 2 << 1
+ .equ bm_8BIT = 3 << 1
+
+ .include "drivers/usart_common.asm"
+
+ .set USART_C_VALUE = bm_ASYNC | bm_NO_PARITY | bm_1STOPBIT | bm_8BIT
+ .if WANT_INTERRUPTS == 0
+ .if WANT_ISR_RX == 1
+ .endif
+ .endif
+
+ .if WANT_ISR_RX == 1
+ .set USART_B_VALUE = bm_ENABLE_TX | bm_ENABLE_RX | bm_ENABLE_INT_RX
+ .include "drivers/usart-rx-buffer.asm"
+
+
+ ; sizes have to be powers of 2!
+ .equ usart_rx_size = $10
+ .equ usart_rx_mask = usart_rx_size - 1
+ .dseg
+000100 usart_rx_data: .byte usart_rx_size
+000110 usart_rx_in: .byte 1
+000111 usart_rx_out: .byte 1
+ .cseg
+
+ VE_TO_RXBUF:
+00005f ff07 .dw $ff07
+000060 723e
+000061 2d78
+000062 7562
+000063 0066 .db ">rx-buf",0
+000064 0000 .dw VE_HEAD
+ .set VE_HEAD = VE_TO_RXBUF
+ XT_TO_RXBUF:
+000065 0066 .dw PFA_rx_tobuf
+ PFA_rx_tobuf:
+000066 2f08 mov temp0, tosl
+000067 9110 0110 lds temp1, usart_rx_in
+000069 e0e0 ldi zl, low(usart_rx_data)
+00006a e0f1 ldi zh, high(usart_rx_data)
+00006b 0fe1 add zl, temp1
+00006c 1df3 adc zh, zeroh
+00006d 8300 st Z, temp0
+00006e 9513 inc temp1
+00006f 701f andi temp1,usart_rx_mask
+000070 9310 0110 sts usart_rx_in, temp1
+000072 9189
+000073 9199 loadtos
+000074 940c 3804 jmp_ DO_NEXT
+
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+ ; setup with
+ ; ' isr-rx URXCaddr int!
+ VE_ISR_RX:
+000076 ff06 .dw $ff06
+000077 7369
+000078 2d72
+000079 7872 .db "isr-rx"
+00007a 005f .dw VE_HEAD
+ .set VE_HEAD = VE_ISR_RX
+ XT_ISR_RX:
+00007b 3800 .dw DO_COLON
+ usart_rx_isr:
+00007c 383c .dw XT_DOLITERAL
+00007d 00ce .dw usart_data
+00007e 3897 .dw XT_CFETCH
+00007f 38b0 .dw XT_DUP
+000080 383c .dw XT_DOLITERAL
+000081 0003 .dw 3
+000082 3fde .dw XT_EQUAL
+000083 3835 .dw XT_DOCONDBRANCH
+000084 0086 .dw usart_rx_isr1
+000085 3d37 .dw XT_COLD
+ usart_rx_isr1:
+000086 0065 .dw XT_TO_RXBUF
+000087 381f .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:
+000088 3800 .dw DO_COLON
+ PFA_USART_INIT_RX_BUFFER: ; ( -- )
+000089 383c
+00008a 007b .dw XT_DOLITERAL, XT_ISR_RX
+00008b 383c
+00008c 0032 .dw XT_DOLITERAL, URXCaddr
+00008d 3ca4 .dw XT_INTSTORE
+
+00008e 383c .dw XT_DOLITERAL
+00008f 0100 .dw usart_rx_data
+000090 383c .dw XT_DOLITERAL
+000091 0016 .dw usart_rx_size + 6
+000092 3953 .dw XT_ZERO
+000093 3e97 .dw XT_FILL
+000094 381f .dw XT_EXIT
+
+ ; ( -- c)
+ ; MCU
+ ; get 1 character from input queue, wait if needed using interrupt driver
+ VE_RX_BUFFER:
+000095 ff06 .dw $ff06
+000096 7872
+000097 622d
+000098 6675 .db "rx-buf"
+000099 0076 .dw VE_HEAD
+ .set VE_HEAD = VE_RX_BUFFER
+ XT_RX_BUFFER:
+00009a 3800 .dw DO_COLON
+ PFA_RX_BUFFER:
+00009b 00b5 .dw XT_RXQ_BUFFER
+00009c 3835 .dw XT_DOCONDBRANCH
+00009d 009b .dw PFA_RX_BUFFER
+00009e 383c .dw XT_DOLITERAL
+00009f 0111 .dw usart_rx_out
+0000a0 3897 .dw XT_CFETCH
+0000a1 38b0 .dw XT_DUP
+0000a2 383c .dw XT_DOLITERAL
+0000a3 0100 .dw usart_rx_data
+0000a4 399c .dw XT_PLUS
+0000a5 3897 .dw XT_CFETCH
+0000a6 38c3 .dw XT_SWAP
+0000a7 3a2e .dw XT_1PLUS
+0000a8 383c .dw XT_DOLITERAL
+0000a9 000f .dw usart_rx_mask
+0000aa 3a12 .dw XT_AND
+0000ab 383c .dw XT_DOLITERAL
+0000ac 0111 .dw usart_rx_out
+0000ad 388c .dw XT_CSTORE
+0000ae 381f .dw XT_EXIT
+
+ ; ( -- f)
+ ; MCU
+ ; check if unread characters are in the input queue
+ VE_RXQ_BUFFER:
+0000af ff07 .dw $ff07
+0000b0 7872
+0000b1 2d3f
+0000b2 7562
+0000b3 0066 .db "rx?-buf",0
+0000b4 0095 .dw VE_HEAD
+ .set VE_HEAD = VE_RXQ_BUFFER
+ XT_RXQ_BUFFER:
+0000b5 3800 .dw DO_COLON
+ PFA_RXQ_BUFFER:
+0000b6 3d2f .dw XT_PAUSE
+0000b7 383c .dw XT_DOLITERAL
+0000b8 0111 .dw usart_rx_out
+0000b9 3897 .dw XT_CFETCH
+0000ba 383c .dw XT_DOLITERAL
+0000bb 0110 .dw usart_rx_in
+0000bc 3897 .dw XT_CFETCH
+0000bd 3912 .dw XT_NOTEQUAL
+0000be 381f .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:
+0000bf ff07 .dw $ff07
+0000c0 7874
+0000c1 702d
+0000c2 6c6f
+0000c3 006c .db "tx-poll",0
+0000c4 00af .dw VE_HEAD
+ .set VE_HEAD = VE_TX_POLL
+ XT_TX_POLL:
+0000c5 3800 .dw DO_COLON
+ PFA_TX_POLL:
+ ; wait for data ready
+0000c6 00d3 .dw XT_TXQ_POLL
+0000c7 3835 .dw XT_DOCONDBRANCH
+0000c8 00c6 .dw PFA_TX_POLL
+ ; send to usart
+0000c9 383c .dw XT_DOLITERAL
+0000ca 00ce .dw USART_DATA
+0000cb 388c .dw XT_CSTORE
+0000cc 381f .dw XT_EXIT
+
+ ; ( -- f) MCU
+ ; MCU
+ ; check if a character can be send using register poll
+ VE_TXQ_POLL:
+0000cd ff08 .dw $ff08
+0000ce 7874
+0000cf 2d3f
+0000d0 6f70
+0000d1 6c6c .db "tx?-poll"
+0000d2 00bf .dw VE_HEAD
+ .set VE_HEAD = VE_TXQ_POLL
+ XT_TXQ_POLL:
+0000d3 3800 .dw DO_COLON
+ PFA_TXQ_POLL:
+0000d4 3d2f .dw XT_PAUSE
+0000d5 383c .dw XT_DOLITERAL
+0000d6 00c8 .dw USART_A
+0000d7 3897 .dw XT_CFETCH
+0000d8 383c .dw XT_DOLITERAL
+0000d9 0020 .dw bm_USART_TXRD
+0000da 3a12 .dw XT_AND
+0000db 381f .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:
+0000dc ff04 .dw $ff04
+0000dd 6275
+0000de 7272 .db "ubrr"
+0000df 00cd .dw VE_HEAD
+ .set VE_HEAD = VE_UBRR
+ XT_UBRR:
+0000e0 386e .dw PFA_DOVALUE1
+ PFA_UBRR: ; ( -- )
+0000e1 00ae .dw EE_UBRRVAL
+0000e2 3d9f .dw XT_EDEFERFETCH
+0000e3 3da9 .dw XT_EDEFERSTORE
+ .include "words/usart.asm"
+
+ ; MCU
+ ; initialize usart
+ VE_USART:
+0000e4 ff06 .dw $ff06
+0000e5 752b
+0000e6 6173
+0000e7 7472 .db "+usart"
+0000e8 00dc .dw VE_HEAD
+ .set VE_HEAD = VE_USART
+ XT_USART:
+0000e9 3800 .dw DO_COLON
+ PFA_USART: ; ( -- )
+
+0000ea 383c .dw XT_DOLITERAL
+0000eb 0098 .dw USART_B_VALUE
+0000ec 383c .dw XT_DOLITERAL
+0000ed 00c9 .dw USART_B
+0000ee 388c .dw XT_CSTORE
+
+0000ef 383c .dw XT_DOLITERAL
+0000f0 0006 .dw USART_C_VALUE
+0000f1 383c .dw XT_DOLITERAL
+0000f2 00ca .dw USART_C | bm_USARTC_en
+0000f3 388c .dw XT_CSTORE
+
+0000f4 00e0 .dw XT_UBRR
+0000f5 38b0 .dw XT_DUP
+0000f6 3af8 .dw XT_BYTESWAP
+0000f7 383c .dw XT_DOLITERAL
+0000f8 00cd .dw BAUDRATE_HIGH
+0000f9 388c .dw XT_CSTORE
+0000fa 383c .dw XT_DOLITERAL
+0000fb 00cc .dw BAUDRATE_LOW
+0000fc 388c .dw XT_CSTORE
+ .if XT_USART_INIT_RX!=0
+0000fd 0088 .dw XT_USART_INIT_RX
+ .endif
+ .if XT_USART_INIT_TX!=0
+ .endif
+
+0000fe 381f .dw XT_EXIT
+
+ .include "amforth.asm"
+
+ ;;;;
+ ;;;; GPL V2 (only)
+
+ .set AMFORTH_NRWW_SIZE=(FLASHEND-AMFORTH_RO_SEG)*2
+
+ .set corepc = pc
+ .org $0000
+000000 940c 3d38 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:
+0000ff 920a st -Y, r0
+000100 b60f in r0, SREG
+000101 920a st -Y, r0
+ .if (pclen==3)
+ .endif
+000102 900f pop r0
+000103 900f pop r0 ; = intnum * intvectorsize + 1 (address following the rcall)
+000104 940a dec r0
+ .if intvecsize == 1 ;
+ .endif
+000105 2cb0 mov isrflag, r0
+000106 93ff push zh
+000107 93ef push zl
+000108 e1e2 ldi zl, low(intcnt)
+000109 e0f1 ldi zh, high(intcnt)
+00010a 9406 lsr r0 ; we use byte addresses in the counter array, not words
+00010b 0de0 add zl, r0
+00010c 1df3 adc zh, zeroh
+00010d 8000 ld r0, Z
+00010e 9403 inc r0
+00010f 8200 st Z, r0
+000110 91ef pop zl
+000111 91ff pop zh
+
+000112 9009 ld r0, Y+
+000113 be0f out SREG, r0
+000114 9009 ld r0, Y+
+000115 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:
+000116 ff02 .dw $ff02
+000117 2b6d .db "m+"
+000118 00e4 .dw VE_HEAD
+ .set VE_HEAD = VE_MPLUS
+ XT_MPLUS:
+000119 3800 .dw DO_COLON
+ PFA_MPLUS:
+00011a 3fc6 .dw XT_S2D
+00011b 3c14 .dw XT_DPLUS
+00011c 381f .dw XT_EXIT
+ .include "words/ud-star.asm"
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_UDSTAR:
+00011d ff03 .dw $ff03
+00011e 6475
+../../common\words/ud-star.asm(9): warning: .cseg .db misalignment - padding zero byte
+00011f 002a .db "ud*"
+000120 0116 .dw VE_HEAD
+ .set VE_HEAD = VE_UDSTAR
+ XT_UDSTAR:
+000121 3800 .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 + ;
+
+000122 38b0
+000123 38fe
+000124 39df
+000125 38d8 .DW XT_DUP,XT_TO_R,XT_UMSTAR,XT_DROP
+000126 38c3
+000127 38f5
+000128 39df
+000129 38e0
+00012a 399c
+00012b 381f .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:
+00012c ff04 .dw $ff04
+00012d 6d75
+00012e 7861 .db "umax"
+00012f 011d .dw VE_HEAD
+ .set VE_HEAD = VE_UMAX
+ XT_UMAX:
+000130 3800 .dw DO_COLON
+ PFA_UMAX:
+ .endif
+
+000131 3ec8
+000132 395b .DW XT_2DUP,XT_ULESS
+000133 3835 .dw XT_DOCONDBRANCH
+000134 0136 DEST(UMAX1)
+000135 38c3 .DW XT_SWAP
+000136 38d8 UMAX1: .DW XT_DROP
+000137 381f .dw XT_EXIT
+ .include "words/umin.asm"
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_UMIN:
+000138 ff04 .dw $ff04
+000139 6d75
+00013a 6e69 .db "umin"
+00013b 012c .dw VE_HEAD
+ .set VE_HEAD = VE_UMIN
+ XT_UMIN:
+00013c 3800 .dw DO_COLON
+ PFA_UMIN:
+ .endif
+00013d 3ec8
+00013e 3966 .DW XT_2DUP,XT_UGREATER
+00013f 3835 .dw XT_DOCONDBRANCH
+000140 0142 DEST(UMIN1)
+000141 38c3 .DW XT_SWAP
+000142 38d8 UMIN1: .DW XT_DROP
+000143 381f .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:
+000144 3800 .dw DO_COLON
+ PFA_IMMEDIATEQ:
+000145 383c .dw XT_DOLITERAL
+000146 8000 .dw $8000
+000147 3a12 .dw XT_AND
+000148 3919 .dw XT_ZEROEQUAL
+000149 3835 .dw XT_DOCONDBRANCH
+00014a 014d DEST(IMMEDIATEQ1)
+00014b 3fe5 .dw XT_ONE
+00014c 381f .dw XT_EXIT
+ IMMEDIATEQ1:
+ ; not immediate
+00014d 394a .dw XT_TRUE
+00014e 381f .dw XT_EXIT
+ .include "words/name2flags.asm"
+
+ ; Tools
+ ; get the flags from a name token
+ VE_NAME2FLAGS:
+00014f ff0a .dw $ff0a
+000150 616e
+000151 656d
+000152 663e
+000153 616c
+000154 7367 .db "name>flags"
+000155 0138 .dw VE_HEAD
+ .set VE_HEAD = VE_NAME2FLAGS
+ XT_NAME2FLAGS:
+000156 3800 .dw DO_COLON
+ PFA_NAME2FLAGS:
+000157 3bca .dw XT_FETCHI ; skip to link field
+000158 383c .dw XT_DOLITERAL
+000159 ff00 .dw $ff00
+00015a 3a12 .dw XT_AND
+00015b 381f .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:
+00015c ff03 .dw $ff03
+00015d 6576
+../../common\words/ver.asm(12): warning: .cseg .db misalignment - padding zero byte
+00015e 0072 .db "ver"
+00015f 014f .dw VE_HEAD
+ .set VE_HEAD = VE_DOT_VER
+ XT_DOT_VER:
+000160 3800 .dw DO_COLON
+ PFA_DOT_VER:
+ .endif
+000161 02c1 .dw XT_ENV_FORTHNAME
+000162 03ea .dw XT_ITYPE
+000163 3fad .dw XT_SPACE
+000164 3ebc .dw XT_BASE
+000165 3878 .dw XT_FETCH
+
+000166 02cf .dw XT_ENV_FORTHVERSION
+000167 3f40 .dw XT_DECIMAL
+000168 3fc6 .dw XT_S2D
+000169 0308 .dw XT_L_SHARP
+00016a 0310 .dw XT_SHARP
+00016b 383c .dw XT_DOLITERAL
+00016c 002e .dw '.'
+00016d 02f9 .dw XT_HOLD
+00016e 0326 .dw XT_SHARP_S
+00016f 0331 .dw XT_SHARP_G
+000170 0420 .dw XT_TYPE
+000171 3ebc .dw XT_BASE
+000172 3880 .dw XT_STORE
+000173 3fad .dw XT_SPACE
+000174 02d7 .dw XT_ENV_CPU
+000175 03ea .dw XT_ITYPE
+
+000176 381f .dw XT_EXIT
+
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+ .include "words/noop.asm"
+
+ ; Tools
+ ; do nothing
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_NOOP:
+000177 ff04 .dw $ff04
+000178 6f6e
+000179 706f .db "noop"
+00017a 015c .dw VE_HEAD
+ .set VE_HEAD = VE_NOOP
+ XT_NOOP:
+00017b 3800 .dw DO_COLON
+ PFA_NOOP:
+ .endif
+00017c 381f .DW XT_EXIT
+ .include "words/unused.asm"
+
+ ; Tools
+ ; Amount of available RAM (incl. PAD)
+ VE_UNUSED:
+00017d ff06 .dw $ff06
+00017e 6e75
+00017f 7375
+000180 6465 .db "unused"
+000181 0177 .dw VE_HEAD
+ .set VE_HEAD = VE_UNUSED
+ XT_UNUSED:
+000182 3800 .dw DO_COLON
+ PFA_UNUSED:
+000183 3a8c .dw XT_SP_FETCH
+000184 3f22 .dw XT_HERE
+000185 3992 .dw XT_MINUS
+000186 381f .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:
+000187 0002 .dw $0002
+000188 6f74 .db "to"
+000189 017d .dw VE_HEAD
+ .set VE_HEAD = VE_TO
+ XT_TO:
+00018a 3800 .dw DO_COLON
+ PFA_TO:
+ .endif
+00018b 042f .dw XT_TICK
+00018c 3fcf .dw XT_TO_BODY
+00018d 3eb6 .dw XT_STATE
+00018e 3878 .dw XT_FETCH
+00018f 3835 .dw XT_DOCONDBRANCH
+000190 019b DEST(PFA_TO1)
+000191 0743 .dw XT_COMPILE
+000192 0195 .dw XT_DOTO
+000193 074e .dw XT_COMMA
+000194 381f .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:
+000195 3800 .dw DO_COLON
+ PFA_DOTO:
+ .endif
+000196 38f5 .dw XT_R_FROM
+000197 38b0 .dw XT_DUP
+000198 01a7 .dw XT_ICELLPLUS
+000199 38fe .dw XT_TO_R
+00019a 3bca .dw XT_FETCHI
+ PFA_TO1:
+00019b 38b0 .dw XT_DUP
+00019c 01a7 .dw XT_ICELLPLUS
+00019d 01a7 .dw XT_ICELLPLUS
+00019e 3bca .dw XT_FETCHI
+00019f 3829 .dw XT_EXECUTE
+0001a0 381f .dw XT_EXIT
+ .include "words/i-cellplus.asm"
+
+ ; Compiler
+ ; skip to the next cell in flash
+ VE_ICELLPLUS:
+0001a1 ff07 .dw $FF07
+0001a2 2d69
+0001a3 6563
+0001a4 6c6c
+0001a5 002b .db "i-cell+",0
+0001a6 0187 .dw VE_HEAD
+ .set VE_HEAD = VE_ICELLPLUS
+ XT_ICELLPLUS:
+0001a7 3800 .dw DO_COLON
+ PFA_ICELLPLUS:
+0001a8 3a2e .dw XT_1PLUS
+0001a9 381f .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:
+0001aa ff08 .dw $ff08
+0001ab 6369
+0001ac 6d6f
+0001ad 6170
+0001ae 6572 .db "icompare"
+0001af 01a1 .dw VE_HEAD
+ .set VE_HEAD = VE_ICOMPARE
+ XT_ICOMPARE:
+0001b0 3800 .dw DO_COLON
+ PFA_ICOMPARE:
+0001b1 38fe .dw XT_TO_R ; ( -- r-addr r-len f-addr)
+0001b2 38ce .dw XT_OVER ; ( -- r-addr r-len f-addr r-len)
+0001b3 38f5 .dw XT_R_FROM ; ( -- r-addr r-len f-addr r-len f-len )
+0001b4 3912 .dw XT_NOTEQUAL ; ( -- r-addr r-len f-addr flag )
+0001b5 3835 .dw XT_DOCONDBRANCH
+0001b6 01bb .dw PFA_ICOMPARE_SAMELEN
+0001b7 3ed1 .dw XT_2DROP
+0001b8 38d8 .dw XT_DROP
+0001b9 394a .dw XT_TRUE
+0001ba 381f .dw XT_EXIT
+ PFA_ICOMPARE_SAMELEN:
+0001bb 38c3 .dw XT_SWAP ; ( -- r-addr f-addr len )
+0001bc 3953 .dw XT_ZERO
+0001bd 080d .dw XT_QDOCHECK
+0001be 3835 .dw XT_DOCONDBRANCH
+0001bf 01e0 .dw PFA_ICOMPARE_DONE
+0001c0 3a9a .dw XT_DODO
+ PFA_ICOMPARE_LOOP:
+ ; ( r-addr f-addr --)
+0001c1 38ce .dw XT_OVER
+0001c2 3878 .dw XT_FETCH
+ .if WANT_IGNORECASE == 1
+0001c3 01e3 .dw XT_ICOMPARE_LC
+ .endif
+0001c4 38ce .dw XT_OVER
+0001c5 3bca .dw XT_FETCHI ; ( -- r-addr f-addr r-cc f- cc)
+ .if WANT_IGNORECASE == 1
+0001c6 01e3 .dw XT_ICOMPARE_LC
+ .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
+0001c7 38b0 .dw XT_DUP
+ ;.dw XT_BYTESWAP
+0001c8 383c .dw XT_DOLITERAL
+0001c9 0100 .dw $100
+0001ca 395b .dw XT_ULESS
+0001cb 3835 .dw XT_DOCONDBRANCH
+0001cc 01d1 .dw PFA_ICOMPARE_LASTCELL
+0001cd 38c3 .dw XT_SWAP
+0001ce 383c .dw XT_DOLITERAL
+0001cf 00ff .dw $00FF
+0001d0 3a12 .dw XT_AND ; the final swap can be omitted
+ PFA_ICOMPARE_LASTCELL:
+0001d1 3912 .dw XT_NOTEQUAL
+0001d2 3835 .dw XT_DOCONDBRANCH
+0001d3 01d8 .dw PFA_ICOMPARE_NEXTLOOP
+0001d4 3ed1 .dw XT_2DROP
+0001d5 394a .dw XT_TRUE
+0001d6 3ad3 .dw XT_UNLOOP
+0001d7 381f .dw XT_EXIT
+ PFA_ICOMPARE_NEXTLOOP:
+0001d8 3a2e .dw XT_1PLUS
+0001d9 38c3 .dw XT_SWAP
+0001da 3c8f .dw XT_CELLPLUS
+0001db 38c3 .dw XT_SWAP
+0001dc 383c .dw XT_DOLITERAL
+0001dd 0002 .dw 2
+0001de 3ab9 .dw XT_DOPLUSLOOP
+0001df 01c1 .dw PFA_ICOMPARE_LOOP
+ PFA_ICOMPARE_DONE:
+0001e0 3ed1 .dw XT_2DROP
+0001e1 3953 .dw XT_ZERO
+0001e2 381f .dw XT_EXIT
+
+ .if WANT_IGNORECASE == 1
+ ; ( cc1 cc2 -- f)
+ ; Tools
+ ; compares two packed characters
+ ;VE_ICOMPARELC:
+ ; .dw $ff08
+ ; .db "icompare-lower"
+ ; .dw VE_HEAD
+ ; .set VE_HEAD = VE_ICOMPARELC
+ XT_ICOMPARE_LC:
+0001e3 3800 .dw DO_COLON
+ PFA_ICOMPARE_LC:
+0001e4 38b0 .dw XT_DUP
+0001e5 383c .dw XT_DOLITERAL
+0001e6 00ff .dw $00ff
+0001e7 3a12 .dw XT_AND
+0001e8 3f78 .dw XT_TOLOWER
+0001e9 38c3 .dw XT_SWAP
+0001ea 3af8 .dw XT_BYTESWAP
+0001eb 383c .dw XT_DOLITERAL
+0001ec 00ff .dw $00ff
+0001ed 3a12 .dw XT_AND
+0001ee 3f78 .dw XT_TOLOWER
+0001ef 3af8 .dw XT_BYTESWAP
+0001f0 3a1b .dw XT_OR
+0001f1 381f .dw XT_EXIT
+ .endif
+ .include "words/star.asm"
+
+ ; Arithmetics
+ ; multiply routine
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_STAR:
+0001f2 ff01 .dw $ff01
+0001f3 002a .db "*",0
+0001f4 01aa .dw VE_HEAD
+ .set VE_HEAD = VE_STAR
+ XT_STAR:
+0001f5 3800 .dw DO_COLON
+ PFA_STAR:
+ .endif
+
+0001f6 39a5 .dw XT_MSTAR
+0001f7 38d8 .dw XT_DROP
+0001f8 381f .dw XT_EXIT
+ .include "words/j.asm"
+
+ ; Compiler
+ ; loop counter of outer loop
+ VE_J:
+0001f9 ff01 .dw $FF01
+0001fa 006a .db "j",0
+0001fb 01f2 .dw VE_HEAD
+ .set VE_HEAD = VE_J
+ XT_J:
+0001fc 3800 .dw DO_COLON
+ PFA_J:
+0001fd 3a75 .dw XT_RP_FETCH
+0001fe 383c .dw XT_DOLITERAL
+0001ff 0007 .dw 7
+000200 399c .dw XT_PLUS
+000201 3878 .dw XT_FETCH
+000202 3a75 .dw XT_RP_FETCH
+000203 383c .dw XT_DOLITERAL
+000204 0009 .dw 9
+000205 399c .dw XT_PLUS
+000206 3878 .dw XT_FETCH
+000207 399c .dw XT_PLUS
+000208 381f .dw XT_EXIT
+ .include "words/dabs.asm"
+
+ ; Arithmetics
+ ; double cell absolute value
+ VE_DABS:
+000209 ff04 .dw $ff04
+00020a 6164
+00020b 7362 .db "dabs"
+00020c 01f9 .dw VE_HEAD
+ .set VE_HEAD = VE_DABS
+ XT_DABS:
+00020d 3800 .dw DO_COLON
+ PFA_DABS:
+00020e 38b0 .dw XT_DUP
+00020f 3920 .dw XT_ZEROLESS
+000210 3835 .dw XT_DOCONDBRANCH
+000211 0213 .dw PFA_DABS1
+000212 021a .dw XT_DNEGATE
+ PFA_DABS1:
+000213 381f .dw XT_EXIT
+ ; : dabs ( ud1 -- +d2 ) dup 0< if dnegate then ;
+ .include "words/dnegate.asm"
+
+ ; Arithmetics
+ ; double cell negation
+ VE_DNEGATE:
+000214 ff07 .dw $ff07
+000215 6e64
+000216 6765
+000217 7461
+000218 0065 .db "dnegate",0
+000219 0209 .dw VE_HEAD
+ .set VE_HEAD = VE_DNEGATE
+ XT_DNEGATE:
+00021a 3800 .dw DO_COLON
+ PFA_DNEGATE:
+00021b 3c3a .dw XT_DINVERT
+00021c 3fe5 .dw XT_ONE
+00021d 3953 .dw XT_ZERO
+00021e 3c14 .dw XT_DPLUS
+00021f 381f .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:
+000220 ff05 .dw $ff05
+000221 6d63
+000222 766f
+000223 0065 .db "cmove",0
+000224 0214 .dw VE_HEAD
+ .set VE_HEAD = VE_CMOVE
+ XT_CMOVE:
+000225 0226 .dw PFA_CMOVE
+ PFA_CMOVE:
+000226 93bf push xh
+000227 93af push xl
+000228 91e9 ld zl, Y+
+000229 91f9 ld zh, Y+ ; addr-to
+00022a 91a9 ld xl, Y+
+00022b 91b9 ld xh, Y+ ; addr-from
+00022c 2f09 mov temp0, tosh
+00022d 2b08 or temp0, tosl
+00022e f021 brbs 1, PFA_CMOVE1
+ PFA_CMOVE2:
+00022f 911d ld temp1, X+
+000230 9311 st Z+, temp1
+000231 9701 sbiw tosl, 1
+000232 f7e1 brbc 1, PFA_CMOVE2
+ PFA_CMOVE1:
+000233 91af pop xl
+000234 91bf pop xh
+000235 9189
+000236 9199 loadtos
+000237 940c 3804 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:
+000239 ff05 .dw $ff05
+00023a 7332
+00023b 6177
+00023c 0070 .db "2swap",0
+00023d 0220 .dw VE_HEAD
+ .set VE_HEAD = VE_2SWAP
+ XT_2SWAP:
+00023e 3800 .dw DO_COLON
+ PFA_2SWAP:
+
+ .endif
+00023f 38e0 .dw XT_ROT
+000240 38fe .dw XT_TO_R
+000241 38e0 .dw XT_ROT
+000242 38f5 .dw XT_R_FROM
+000243 381f .dw XT_EXIT
+ .include "words/tib.asm"
+
+ ; System
+ ; refills the input buffer
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_REFILLTIB:
+000244 ff0a .dw $ff0a
+000245 6572
+000246 6966
+000247 6c6c
+000248 742d
+000249 6269 .db "refill-tib"
+00024a 0239 .dw VE_HEAD
+ .set VE_HEAD = VE_REFILLTIB
+ XT_REFILLTIB:
+00024b 3800 .dw DO_COLON
+ PFA_REFILLTIB:
+ .endif
+00024c 0267 .dw XT_TIB
+00024d 383c .dw XT_DOLITERAL
+00024e 005a .dw TIB_SIZE
+00024f 047f .dw XT_ACCEPT
+000250 026d .dw XT_NUMBERTIB
+000251 3880 .dw XT_STORE
+000252 3953 .dw XT_ZERO
+000253 3ee1 .dw XT_TO_IN
+000254 3880 .dw XT_STORE
+000255 394a .dw XT_TRUE ; -1
+000256 381f .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:
+000257 ff0a .dw $FF0A
+000258 6f73
+000259 7275
+00025a 6563
+00025b 742d
+00025c 6269 .db "source-tib"
+00025d 0244 .dw VE_HEAD
+ .set VE_HEAD = VE_SOURCETIB
+ XT_SOURCETIB:
+00025e 3800 .dw DO_COLON
+ PFA_SOURCETIB:
+ .endif
+00025f 0267 .dw XT_TIB
+000260 026d .dw XT_NUMBERTIB
+000261 3878 .dw XT_FETCH
+000262 381f .dw XT_EXIT
+
+ ; ( -- addr )
+ ; System Variable
+ ; terminal input buffer address
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_TIB:
+000263 ff03 .dw $ff03
+000264 6974
+000265 0062 .db "tib",0
+000266 0257 .dw VE_HEAD
+ .set VE_HEAD = VE_TIB
+ XT_TIB:
+000267 3847 .dw PFA_DOVARIABLE
+ PFA_TIB:
+000268 013d .dw ram_tib
+ .dseg
+00013d 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:
+000269 ff04 .dw $ff04
+00026a 7423
+00026b 6269 .db "#tib"
+00026c 0263 .dw VE_HEAD
+ .set VE_HEAD = VE_NUMBERTIB
+ XT_NUMBERTIB:
+00026d 3847 .dw PFA_DOVARIABLE
+ PFA_NUMBERTIB:
+00026e 0197 .dw ram_sharptib
+ .dseg
+000197 ram_sharptib: .byte 2
+ .cseg
+ .endif
+ .include "words/init-ram.asm"
+
+ ; Tools
+ ; copy len cells from eeprom to ram
+ VE_EE2RAM:
+00026f ff06 .dw $ff06
+000270 6565
+000271 723e
+000272 6d61 .db "ee>ram"
+000273 0269 .dw VE_HEAD
+ .set VE_HEAD = VE_EE2RAM
+ XT_EE2RAM:
+000274 3800 .dw DO_COLON
+ PFA_EE2RAM: ; ( -- )
+000275 3953 .dw XT_ZERO
+000276 3a9a .dw XT_DODO
+ PFA_EE2RAM_1:
+ ; ( -- e-addr r-addr )
+000277 38ce .dw XT_OVER
+000278 3b5e .dw XT_FETCHE
+000279 38ce .dw XT_OVER
+00027a 3880 .dw XT_STORE
+00027b 3c8f .dw XT_CELLPLUS
+00027c 38c3 .dw XT_SWAP
+00027d 3c8f .dw XT_CELLPLUS
+00027e 38c3 .dw XT_SWAP
+00027f 3ac8 .dw XT_DOLOOP
+000280 0277 .dw PFA_EE2RAM_1
+ PFA_EE2RAM_2:
+000281 3ed1 .dw XT_2DROP
+000282 381f .dw XT_EXIT
+
+ ; ( -- )
+ ; Tools
+ ; setup the default user area from eeprom
+ VE_INIT_RAM:
+000283 ff08 .dw $ff08
+000284 6e69
+000285 7469
+000286 722d
+000287 6d61 .db "init-ram"
+000288 026f .dw VE_HEAD
+ .set VE_HEAD = VE_INIT_RAM
+ XT_INIT_RAM:
+000289 3800 .dw DO_COLON
+ PFA_INI_RAM: ; ( -- )
+00028a 383c .dw XT_DOLITERAL
+00028b 008c .dw EE_INITUSER
+00028c 3b01 .dw XT_UP_FETCH
+00028d 383c .dw XT_DOLITERAL
+00028e 0022 .dw SYSUSERSIZE
+00028f 3a03 .dw XT_2SLASH
+000290 0274 .dw XT_EE2RAM
+000291 381f .dw XT_EXIT
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+
+ .include "words/environment.asm"
+
+ ; System Value
+ ; word list identifier of the environmental search list
+ VE_ENVIRONMENT:
+000292 ff0b .dw $ff0b
+000293 6e65
+000294 6976
+000295 6f72
+000296 6d6e
+000297 6e65
+000298 0074 .db "environment",0
+000299 0283 .dw VE_HEAD
+ .set VE_HEAD = VE_ENVIRONMENT
+ XT_ENVIRONMENT:
+00029a 3847 .dw PFA_DOVARIABLE
+ PFA_ENVIRONMENT:
+00029b 0066 .dw CFG_ENVIRONMENT
+ .include "words/env-wordlists.asm"
+
+ ; Environment
+ ; maximum number of wordlists in the dictionary search order
+ VE_ENVWORDLISTS:
+00029c ff09 .dw $ff09
+00029d 6f77
+00029e 6472
+00029f 696c
+0002a0 7473
+0002a1 0073 .db "wordlists",0
+0002a2 0000 .dw VE_ENVHEAD
+ .set VE_ENVHEAD = VE_ENVWORDLISTS
+ XT_ENVWORDLISTS:
+0002a3 3800 .dw DO_COLON
+ PFA_ENVWORDLISTS:
+0002a4 383c .dw XT_DOLITERAL
+0002a5 0008 .dw NUMWORDLISTS
+0002a6 381f .dw XT_EXIT
+ .include "words/env-slashpad.asm"
+
+ ; Environment
+ ; Size of the PAD buffer in bytes
+ VE_ENVSLASHPAD:
+0002a7 ff04 .dw $ff04
+0002a8 702f
+0002a9 6461 .db "/pad"
+0002aa 029c .dw VE_ENVHEAD
+ .set VE_ENVHEAD = VE_ENVSLASHPAD
+ XT_ENVSLASHPAD:
+0002ab 3800 .dw DO_COLON
+ PFA_ENVSLASHPAD:
+0002ac 3a8c .dw XT_SP_FETCH
+0002ad 3ee7 .dw XT_PAD
+0002ae 3992 .dw XT_MINUS
+0002af 381f .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:
+0002b0 ff05 .dw $ff05
+0002b1 682f
+0002b2 6c6f
+0002b3 0064 .db "/hold",0
+0002b4 02a7 .dw VE_ENVHEAD
+ .set VE_ENVHEAD = VE_ENVSLASHHOLD
+ XT_ENVSLASHHOLD:
+0002b5 3800 .dw DO_COLON
+ PFA_ENVSLASHHOLD:
+ .endif
+0002b6 3ee7 .dw XT_PAD
+0002b7 3f22 .dw XT_HERE
+0002b8 3992 .dw XT_MINUS
+0002b9 381f .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:
+0002ba ff0a .dw $ff0a
+0002bb 6f66
+0002bc 7472
+0002bd 2d68
+0002be 616e
+0002bf 656d .db "forth-name"
+0002c0 02b0 .dw VE_ENVHEAD
+ .set VE_ENVHEAD = VE_ENV_FORTHNAME
+ XT_ENV_FORTHNAME:
+0002c1 3800 .dw DO_COLON
+ PFA_EN_FORTHNAME:
+0002c2 03b7 .dw XT_DOSLITERAL
+0002c3 0007 .dw 7
+ .endif
+0002c4 6d61
+0002c5 6f66
+0002c6 7472
+../../common\words/env-forthname.asm(22): warning: .cseg .db misalignment - padding zero byte
+0002c7 0068 .db "amforth"
+ .if cpu_msp430==1
+ .endif
+0002c8 381f .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:
+0002c9 ff07 .dw $ff07
+0002ca 6576
+0002cb 7372
+0002cc 6f69
+0002cd 006e .db "version",0
+0002ce 02ba .dw VE_ENVHEAD
+ .set VE_ENVHEAD = VE_ENV_FORTHVERSION
+ XT_ENV_FORTHVERSION:
+0002cf 3800 .dw DO_COLON
+ PFA_EN_FORTHVERSION:
+ .endif
+0002d0 383c .dw XT_DOLITERAL
+0002d1 0041 .dw 65
+0002d2 381f .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:
+0002d3 ff03 .dw $ff03
+0002d4 7063
+0002d5 0075 .db "cpu",0
+0002d6 02c9 .dw VE_ENVHEAD
+ .set VE_ENVHEAD = VE_ENV_CPU
+ XT_ENV_CPU:
+0002d7 3800 .dw DO_COLON
+ PFA_EN_CPU:
+ .endif
+0002d8 383c .dw XT_DOLITERAL
+0002d9 0059 .dw mcu_name
+0002da 0416 .dw XT_ICOUNT
+0002db 381f .dw XT_EXIT
+ .include "words/env-mcuinfo.asm"
+
+ ; Environment
+ ; flash address of some CPU specific parameters
+ VE_ENV_MCUINFO:
+0002dc ff08 .dw $ff08
+0002dd 636d
+0002de 2d75
+0002df 6e69
+0002e0 6f66 .db "mcu-info"
+0002e1 02d3 .dw VE_ENVHEAD
+ .set VE_ENVHEAD = VE_ENV_MCUINFO
+ XT_ENV_MCUINFO:
+0002e2 3800 .dw DO_COLON
+ PFA_EN_MCUINFO:
+0002e3 383c .dw XT_DOLITERAL
+0002e4 0055 .dw mcu_info
+0002e5 381f .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:
+0002e6 ff05 .dw $ff05
+0002e7 752f
+0002e8 6573
+0002e9 0072 .db "/user",0
+0002ea 02dc .dw VE_ENVHEAD
+ .set VE_ENVHEAD = VE_ENVUSERSIZE
+ XT_ENVUSERSIZE:
+0002eb 3800 .dw DO_COLON
+ PFA_ENVUSERSIZE:
+ .endif
+0002ec 383c .dw XT_DOLITERAL
+0002ed 002c .dw SYSUSERSIZE + APPUSERSIZE
+0002ee 381f .dw XT_EXIT
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+ .include "words/hld.asm"
+
+ ; Numeric IO
+ ; pointer to current write position in the Pictured Numeric Output buffer
+ VE_HLD:
+0002ef ff03 .dw $ff03
+0002f0 6c68
+0002f1 0064 .db "hld",0
+0002f2 0292 .dw VE_HEAD
+ .set VE_HEAD = VE_HLD
+ XT_HLD:
+0002f3 3847 .dw PFA_DOVARIABLE
+ PFA_HLD:
+0002f4 0199 .dw ram_hld
+
+ .dseg
+000199 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:
+0002f5 ff04 .dw $ff04
+0002f6 6f68
+0002f7 646c .db "hold"
+0002f8 02ef .dw VE_HEAD
+ .set VE_HEAD = VE_HOLD
+ XT_HOLD:
+0002f9 3800 .dw DO_COLON
+ PFA_HOLD:
+ .endif
+0002fa 02f3 .dw XT_HLD
+0002fb 38b0 .dw XT_DUP
+0002fc 3878 .dw XT_FETCH
+0002fd 3a34 .dw XT_1MINUS
+0002fe 38b0 .dw XT_DUP
+0002ff 38fe .dw XT_TO_R
+000300 38c3 .dw XT_SWAP
+000301 3880 .dw XT_STORE
+000302 38f5 .dw XT_R_FROM
+000303 388c .dw XT_CSTORE
+000304 381f .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:
+000305 ff02 .dw $ff02
+000306 233c .db "<#"
+000307 02f5 .dw VE_HEAD
+ .set VE_HEAD = VE_L_SHARP
+ XT_L_SHARP:
+000308 3800 .dw DO_COLON
+ PFA_L_SHARP:
+ .endif
+000309 3ee7 .dw XT_PAD
+00030a 02f3 .dw XT_HLD
+00030b 3880 .dw XT_STORE
+00030c 381f .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:
+00030d ff01 .dw $ff01
+00030e 0023 .db "#",0
+00030f 0305 .dw VE_HEAD
+ .set VE_HEAD = VE_SHARP
+ XT_SHARP:
+000310 3800 .dw DO_COLON
+ PFA_SHARP:
+ .endif
+000311 3ebc .dw XT_BASE
+000312 3878 .dw XT_FETCH
+000313 038d .dw XT_UDSLASHMOD
+000314 38e0 .dw XT_ROT
+000315 383c .dw XT_DOLITERAL
+000316 0009 .dw 9
+000317 38ce .dw XT_OVER
+000318 396d .dw XT_LESS
+000319 3835 .dw XT_DOCONDBRANCH
+00031a 031e DEST(PFA_SHARP1)
+00031b 383c .dw XT_DOLITERAL
+00031c 0007 .dw 7
+00031d 399c .dw XT_PLUS
+ PFA_SHARP1:
+00031e 383c .dw XT_DOLITERAL
+00031f 0030 .dw 48 ; ASCII 0
+000320 399c .dw XT_PLUS
+000321 02f9 .dw XT_HOLD
+000322 381f .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:
+000323 ff02 .dw $ff02
+000324 7323 .db "#s"
+000325 030d .dw VE_HEAD
+ .set VE_HEAD = VE_SHARP_S
+ XT_SHARP_S:
+000326 3800 .dw DO_COLON
+ PFA_SHARP_S:
+ .endif
+ NUMS1:
+000327 0310 .dw XT_SHARP
+000328 3ec8 .dw XT_2DUP
+000329 3a1b .dw XT_OR
+00032a 3919 .dw XT_ZEROEQUAL
+00032b 3835 .dw XT_DOCONDBRANCH
+00032c 0327 DEST(NUMS1) ; PFA_SHARP_S
+00032d 381f .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:
+00032e ff02 .dw $ff02
+00032f 3e23 .db "#>"
+000330 0323 .dw VE_HEAD
+ .set VE_HEAD = VE_SHARP_G
+ XT_SHARP_G:
+000331 3800 .dw DO_COLON
+ PFA_SHARP_G:
+ .endif
+000332 3ed1 .dw XT_2DROP
+000333 02f3 .dw XT_HLD
+000334 3878 .dw XT_FETCH
+000335 3ee7 .dw XT_PAD
+000336 38ce .dw XT_OVER
+000337 3992 .dw XT_MINUS
+000338 381f .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:
+000339 ff04 .dw $ff04
+00033a 6973
+00033b 6e67 .db "sign"
+00033c 032e .dw VE_HEAD
+ .set VE_HEAD = VE_SIGN
+ XT_SIGN:
+00033d 3800 .dw DO_COLON
+ PFA_SIGN:
+ .endif
+00033e 3920 .dw XT_ZEROLESS
+00033f 3835 .dw XT_DOCONDBRANCH
+000340 0344 DEST(PFA_SIGN1)
+000341 383c .dw XT_DOLITERAL
+000342 002d .dw 45 ; ascii -
+000343 02f9 .dw XT_HOLD
+ PFA_SIGN1:
+000344 381f .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:
+000345 ff03 .dw $ff03
+000346 2e64
+000347 0072 .db "d.r",0
+000348 0339 .dw VE_HEAD
+ .set VE_HEAD = VE_DDOTR
+ XT_DDOTR:
+000349 3800 .dw DO_COLON
+ PFA_DDOTR:
+
+ .endif
+00034a 38fe .dw XT_TO_R
+00034b 3ed9 .dw XT_TUCK
+00034c 020d .dw XT_DABS
+00034d 0308 .dw XT_L_SHARP
+00034e 0326 .dw XT_SHARP_S
+00034f 38e0 .dw XT_ROT
+000350 033d .dw XT_SIGN
+000351 0331 .dw XT_SHARP_G
+000352 38f5 .dw XT_R_FROM
+000353 38ce .dw XT_OVER
+000354 3992 .dw XT_MINUS
+000355 3fb6 .dw XT_SPACES
+000356 0420 .dw XT_TYPE
+000357 381f .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:
+000358 ff02 .dw $ff02
+000359 722e .db ".r"
+00035a 0345 .dw VE_HEAD
+ .set VE_HEAD = VE_DOTR
+ XT_DOTR:
+00035b 3800 .dw DO_COLON
+ PFA_DOTR:
+
+ .endif
+00035c 38fe .dw XT_TO_R
+00035d 3fc6 .dw XT_S2D
+00035e 38f5 .dw XT_R_FROM
+00035f 0349 .dw XT_DDOTR
+000360 381f .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:
+000361 ff02 .dw $ff02
+000362 2e64 .db "d."
+000363 0358 .dw VE_HEAD
+ .set VE_HEAD = VE_DDOT
+ XT_DDOT:
+000364 3800 .dw DO_COLON
+ PFA_DDOT:
+
+ .endif
+000365 3953 .dw XT_ZERO
+000366 0349 .dw XT_DDOTR
+000367 3fad .dw XT_SPACE
+000368 381f .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:
+000369 ff01 .dw $ff01
+00036a 002e .db ".",0
+00036b 0361 .dw VE_HEAD
+ .set VE_HEAD = VE_DOT
+ XT_DOT:
+00036c 3800 .dw DO_COLON
+ PFA_DOT:
+ .endif
+00036d 3fc6 .dw XT_S2D
+00036e 0364 .dw XT_DDOT
+00036f 381f .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:
+000370 ff03 .dw $ff03
+000371 6475
+000372 002e .db "ud.",0
+000373 0369 .dw VE_HEAD
+ .set VE_HEAD = VE_UDDOT
+ XT_UDDOT:
+000374 3800 .dw DO_COLON
+ PFA_UDDOT:
+ .endif
+000375 3953 .dw XT_ZERO
+000376 037d .dw XT_UDDOTR
+000377 3fad .dw XT_SPACE
+000378 381f .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:
+000379 ff04 .dw $ff04
+00037a 6475
+00037b 722e .db "ud.r"
+00037c 0370 .dw VE_HEAD
+ .set VE_HEAD = VE_UDDOTR
+ XT_UDDOTR:
+00037d 3800 .dw DO_COLON
+ PFA_UDDOTR:
+ .endif
+00037e 38fe .dw XT_TO_R
+00037f 0308 .dw XT_L_SHARP
+000380 0326 .dw XT_SHARP_S
+000381 0331 .dw XT_SHARP_G
+000382 38f5 .dw XT_R_FROM
+000383 38ce .dw XT_OVER
+000384 3992 .dw XT_MINUS
+000385 3fb6 .dw XT_SPACES
+000386 0420 .dw XT_TYPE
+000387 381f .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:
+000388 ff06 .dw $ff06
+000389 6475
+00038a 6d2f
+00038b 646f .db "ud/mod"
+00038c 0379 .dw VE_HEAD
+ .set VE_HEAD = VE_UDSLASHMOD
+ XT_UDSLASHMOD:
+00038d 3800 .dw DO_COLON
+ PFA_UDSLASHMOD:
+ .endif
+00038e 38fe .dw XT_TO_R
+00038f 3953 .dw XT_ZERO
+000390 3907 .dw XT_R_FETCH
+000391 39c1 .dw XT_UMSLASHMOD
+000392 38f5 .dw XT_R_FROM
+000393 38c3 .dw XT_SWAP
+000394 38fe .dw XT_TO_R
+000395 39c1 .dw XT_UMSLASHMOD
+000396 38f5 .dw XT_R_FROM
+000397 381f .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:
+000398 ff06 .dw $ff06
+000399 6964
+00039a 6967
+00039b 3f74 .db "digit?"
+00039c 0388 .dw VE_HEAD
+ .set VE_HEAD = VE_DIGITQ
+ XT_DIGITQ:
+00039d 3800 .dw DO_COLON
+ PFA_DIGITQ:
+ .endif
+00039e 3f65 .dw XT_TOUPPER
+00039f 38b0
+0003a0 383c
+0003a1 0039
+0003a2 3977
+0003a3 383c
+0003a4 0100 .DW XT_DUP,XT_DOLITERAL,57,XT_GREATER,XT_DOLITERAL,256
+0003a5 3a12
+0003a6 399c
+0003a7 38b0
+0003a8 383c
+0003a9 0140
+0003aa 3977 .DW XT_AND,XT_PLUS,XT_DUP,XT_DOLITERAL,320,XT_GREATER
+0003ab 383c
+0003ac 0107
+0003ad 3a12
+0003ae 3992
+0003af 383c
+0003b0 0030 .DW XT_DOLITERAL,263,XT_AND,XT_MINUS,XT_DOLITERAL,48
+0003b1 3992
+0003b2 38b0
+0003b3 3ebc
+0003b4 3878
+0003b5 395b .DW XT_MINUS,XT_DUP,XT_BASE,XT_FETCH,XT_ULESS
+0003b6 381f .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:
+0003b7 3800 .dw DO_COLON
+ PFA_DOSLITERAL:
+0003b8 3907 .dw XT_R_FETCH ; ( -- addr )
+0003b9 0416 .dw XT_ICOUNT
+0003ba 38f5 .dw XT_R_FROM
+0003bb 38ce .dw XT_OVER ; ( -- addr' n addr n)
+0003bc 3a2e .dw XT_1PLUS
+0003bd 3a03 .dw XT_2SLASH ; ( -- addr' n addr k )
+0003be 399c .dw XT_PLUS ; ( -- addr' n addr'' )
+0003bf 3a2e .dw XT_1PLUS
+0003c0 38fe .dw XT_TO_R ; ( -- )
+0003c1 381f .dw XT_EXIT
+ .include "words/scomma.asm"
+
+ ; Compiler
+ ; compiles a string from RAM to Flash
+ VE_SCOMMA:
+0003c2 ff02 .dw $ff02
+0003c3 2c73 .db "s",$2c
+0003c4 0398 .dw VE_HEAD
+ .set VE_HEAD = VE_SCOMMA
+ XT_SCOMMA:
+0003c5 3800 .dw DO_COLON
+ PFA_SCOMMA:
+0003c6 38b0 .dw XT_DUP
+0003c7 03c9 .dw XT_DOSCOMMA
+0003c8 381f .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:
+0003c9 3800 .dw DO_COLON
+ PFA_DOSCOMMA:
+0003ca 074e .dw XT_COMMA
+0003cb 38b0 .dw XT_DUP ; ( --addr len len)
+0003cc 3a03 .dw XT_2SLASH ; ( -- addr len len/2
+0003cd 3ed9 .dw XT_TUCK ; ( -- addr len/2 len len/2
+0003ce 3a0a .dw XT_2STAR ; ( -- addr len/2 len len'
+0003cf 3992 .dw XT_MINUS ; ( -- addr len/2 rem
+0003d0 38fe .dw XT_TO_R
+0003d1 3953 .dw XT_ZERO
+0003d2 080d .dw XT_QDOCHECK
+0003d3 3835 .dw XT_DOCONDBRANCH
+0003d4 03dc .dw PFA_SCOMMA2
+0003d5 3a9a .dw XT_DODO
+ PFA_SCOMMA1:
+0003d6 38b0 .dw XT_DUP ; ( -- addr addr )
+0003d7 3878 .dw XT_FETCH ; ( -- addr c1c2 )
+0003d8 074e .dw XT_COMMA ; ( -- addr )
+0003d9 3c8f .dw XT_CELLPLUS ; ( -- addr+cell )
+0003da 3ac8 .dw XT_DOLOOP
+0003db 03d6 .dw PFA_SCOMMA1
+ PFA_SCOMMA2:
+0003dc 38f5 .dw XT_R_FROM
+0003dd 3927 .dw XT_GREATERZERO
+0003de 3835 .dw XT_DOCONDBRANCH
+0003df 03e3 .dw PFA_SCOMMA3
+0003e0 38b0 .dw XT_DUP ; well, tricky
+0003e1 3897 .dw XT_CFETCH
+0003e2 074e .dw XT_COMMA
+ PFA_SCOMMA3:
+0003e3 38d8 .dw XT_DROP ; ( -- )
+0003e4 381f .dw XT_EXIT
+ .include "words/itype.asm"
+
+ ; Tools
+ ; reads string from flash and prints it
+ VE_ITYPE:
+0003e5 ff05 .dw $ff05
+0003e6 7469
+0003e7 7079
+0003e8 0065 .db "itype",0
+0003e9 03c2 .dw VE_HEAD
+ .set VE_HEAD = VE_ITYPE
+ XT_ITYPE:
+0003ea 3800 .dw DO_COLON
+ PFA_ITYPE:
+0003eb 38b0 .dw XT_DUP ; ( --addr len len)
+0003ec 3a03 .dw XT_2SLASH ; ( -- addr len len/2
+0003ed 3ed9 .dw XT_TUCK ; ( -- addr len/2 len len/2
+0003ee 3a0a .dw XT_2STAR ; ( -- addr len/2 len len'
+0003ef 3992 .dw XT_MINUS ; ( -- addr len/2 rem
+0003f0 38fe .dw XT_TO_R
+0003f1 3953 .dw XT_ZERO
+0003f2 080d .dw XT_QDOCHECK
+0003f3 3835 .dw XT_DOCONDBRANCH
+0003f4 03fe .dw PFA_ITYPE2
+0003f5 3a9a .dw XT_DODO
+ PFA_ITYPE1:
+0003f6 38b0 .dw XT_DUP ; ( -- addr addr )
+0003f7 3bca .dw XT_FETCHI ; ( -- addr c1c2 )
+0003f8 38b0 .dw XT_DUP
+0003f9 040b .dw XT_LOWEMIT
+0003fa 0407 .dw XT_HIEMIT
+0003fb 3a2e .dw XT_1PLUS ; ( -- addr+cell )
+0003fc 3ac8 .dw XT_DOLOOP
+0003fd 03f6 .dw PFA_ITYPE1
+ PFA_ITYPE2:
+0003fe 38f5 .dw XT_R_FROM
+0003ff 3927 .dw XT_GREATERZERO
+000400 3835 .dw XT_DOCONDBRANCH
+000401 0405 .dw PFA_ITYPE3
+000402 38b0 .dw XT_DUP ; make sure the drop below has always something to do
+000403 3bca .dw XT_FETCHI
+000404 040b .dw XT_LOWEMIT
+ PFA_ITYPE3:
+000405 38d8 .dw XT_DROP
+000406 381f .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:
+000407 3800 .dw DO_COLON
+ PFA_HIEMIT:
+000408 3af8 .dw XT_BYTESWAP
+000409 040b .dw XT_LOWEMIT
+00040a 381f .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:
+00040b 3800 .dw DO_COLON
+ PFA_LOWEMIT:
+00040c 383c .dw XT_DOLITERAL
+00040d 00ff .dw $00ff
+00040e 3a12 .dw XT_AND
+00040f 3ef1 .dw XT_EMIT
+000410 381f .dw XT_EXIT
+ .include "words/icount.asm"
+
+ ; Tools
+ ; get count information out of a counted string in flash
+ VE_ICOUNT:
+000411 ff06 .dw $ff06
+000412 6369
+000413 756f
+000414 746e .db "icount"
+000415 03e5 .dw VE_HEAD
+ .set VE_HEAD = VE_ICOUNT
+ XT_ICOUNT:
+000416 3800 .dw DO_COLON
+ PFA_ICOUNT:
+000417 38b0 .dw XT_DUP
+000418 3a2e .dw XT_1PLUS
+000419 38c3 .dw XT_SWAP
+00041a 3bca .dw XT_FETCHI
+00041b 381f .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:
+00041c ff04 .dw $ff04
+00041d 7974
+00041e 6570 .db "type"
+00041f 0411 .dw VE_HEAD
+ .set VE_HEAD = VE_TYPE
+ XT_TYPE:
+000420 3800 .dw DO_COLON
+ PFA_TYPE:
+
+ .endif
+000421 3f98 .dw XT_BOUNDS
+000422 080d .dw XT_QDOCHECK
+000423 3835 .dw XT_DOCONDBRANCH
+000424 042b DEST(PFA_TYPE2)
+000425 3a9a .dw XT_DODO
+ PFA_TYPE1:
+000426 3aab .dw XT_I
+000427 3897 .dw XT_CFETCH
+000428 3ef1 .dw XT_EMIT
+000429 3ac8 .dw XT_DOLOOP
+00042a 0426 DEST(PFA_TYPE1)
+ PFA_TYPE2:
+00042b 381f .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:
+00042c ff01 .dw $ff01
+00042d 0027 .db "'",0
+00042e 041c .dw VE_HEAD
+ .set VE_HEAD = VE_TICK
+ XT_TICK:
+00042f 3800 .dw DO_COLON
+ PFA_TICK:
+ .endif
+000430 05a2 .dw XT_PARSENAME
+000431 05e5 .dw XT_FORTHRECOGNIZER
+000432 05f0 .dw XT_RECOGNIZE
+ ; a word is tickable unless DT:TOKEN is DT:NULL or
+ ; the interpret action is a NOOP
+000433 38b0 .dw XT_DUP
+000434 067d .dw XT_DT_NULL
+000435 3fde .dw XT_EQUAL
+000436 38c3 .dw XT_SWAP
+000437 3bca .dw XT_FETCHI
+000438 383c .dw XT_DOLITERAL
+000439 017b .dw XT_NOOP
+00043a 3fde .dw XT_EQUAL
+00043b 3a1b .dw XT_OR
+00043c 3835 .dw XT_DOCONDBRANCH
+00043d 0441 DEST(PFA_TICK1)
+00043e 383c .dw XT_DOLITERAL
+00043f fff3 .dw -13
+000440 3d85 .dw XT_THROW
+ PFA_TICK1:
+000441 38d8 .dw XT_DROP
+000442 381f .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:
+000443 ff05 .dw $ff05
+000444 7363
+000445 696b
+000446 0070 .db "cskip",0
+000447 042c .dw VE_HEAD
+ .set VE_HEAD = VE_CSKIP
+ XT_CSKIP:
+000448 3800 .dw DO_COLON
+ PFA_CSKIP:
+ .endif
+000449 38fe .dw XT_TO_R ; ( -- addr1 n1 )
+ PFA_CSKIP1:
+00044a 38b0 .dw XT_DUP ; ( -- addr' n' n' )
+00044b 3835 .dw XT_DOCONDBRANCH ; ( -- addr' n')
+00044c 0457 DEST(PFA_CSKIP2)
+00044d 38ce .dw XT_OVER ; ( -- addr' n' addr' )
+00044e 3897 .dw XT_CFETCH ; ( -- addr' n' c' )
+00044f 3907 .dw XT_R_FETCH ; ( -- addr' n' c' c )
+000450 3fde .dw XT_EQUAL ; ( -- addr' n' f )
+000451 3835 .dw XT_DOCONDBRANCH ; ( -- addr' n')
+000452 0457 DEST(PFA_CSKIP2)
+000453 3fe5 .dw XT_ONE
+000454 0593 .dw XT_SLASHSTRING
+000455 382e .dw XT_DOBRANCH
+000456 044a DEST(PFA_CSKIP1)
+ PFA_CSKIP2:
+000457 38f5 .dw XT_R_FROM
+000458 38d8 .dw XT_DROP ; ( -- addr2 n2)
+000459 381f .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:
+00045a ff05 .dw $ff05
+00045b 7363
+00045c 6163
+../../common\words/cscan.asm(12): warning: .cseg .db misalignment - padding zero byte
+00045d 006e .db "cscan"
+00045e 0443 .dw VE_HEAD
+ .set VE_HEAD = VE_CSCAN
+ XT_CSCAN:
+00045f 3800 .dw DO_COLON
+ PFA_CSCAN:
+ .endif
+000460 38fe .dw XT_TO_R
+000461 38ce .dw XT_OVER
+ PFA_CSCAN1:
+000462 38b0 .dw XT_DUP
+000463 3897 .dw XT_CFETCH
+000464 3907 .dw XT_R_FETCH
+000465 3fde .dw XT_EQUAL
+000466 3919 .dw XT_ZEROEQUAL
+000467 3835 .dw XT_DOCONDBRANCH
+000468 0474 DEST(PFA_CSCAN2)
+000469 38c3 .dw XT_SWAP
+00046a 3a34 .dw XT_1MINUS
+00046b 38c3 .dw XT_SWAP
+00046c 38ce .dw XT_OVER
+00046d 3920 .dw XT_ZEROLESS ; not negative
+00046e 3919 .dw XT_ZEROEQUAL
+00046f 3835 .dw XT_DOCONDBRANCH
+000470 0474 DEST(PFA_CSCAN2)
+000471 3a2e .dw XT_1PLUS
+000472 382e .dw XT_DOBRANCH
+000473 0462 DEST(PFA_CSCAN1)
+ PFA_CSCAN2:
+000474 38ef .dw XT_NIP
+000475 38ce .dw XT_OVER
+000476 3992 .dw XT_MINUS
+000477 38f5 .dw XT_R_FROM
+000478 38d8 .dw XT_DROP
+000479 381f .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:
+00047a ff06 .dw $ff06
+00047b 6361
+00047c 6563
+00047d 7470 .db "accept"
+00047e 045a .dw VE_HEAD
+ .set VE_HEAD = VE_ACCEPT
+ XT_ACCEPT:
+00047f 3800 .dw DO_COLON
+ PFA_ACCEPT:
+
+ .endif
+000480 38ce
+000481 399c
+000482 3a34
+000483 38ce .DW XT_OVER,XT_PLUS,XT_1MINUS,XT_OVER
+000484 3f02
+000485 38b0
+000486 04c0
+000487 3919
+000488 3835 ACC1: .DW XT_KEY,XT_DUP,XT_CRLFQ,XT_ZEROEQUAL,XT_DOCONDBRANCH
+000489 04b2 DEST(ACC5)
+00048a 38b0
+00048b 383c
+00048c 0008
+00048d 3fde
+00048e 3835 .DW XT_DUP,XT_DOLITERAL,8,XT_EQUAL,XT_DOCONDBRANCH
+00048f 04a2 DEST(ACC3)
+000490 38d8
+000491 38e0
+000492 3ec8
+000493 3977
+000494 38fe
+000495 38e0
+000496 38e0
+000497 38f5
+000498 3835 .DW XT_DROP,XT_ROT,XT_2DUP,XT_GREATER,XT_TO_R,XT_ROT,XT_ROT,XT_R_FROM,XT_DOCONDBRANCH
+000499 04a0 DEST(ACC6)
+00049a 04b8
+00049b 3a34
+00049c 38fe
+00049d 38ce
+00049e 38f5
+00049f 0130 .DW XT_BS,XT_1MINUS,XT_TO_R,XT_OVER,XT_R_FROM,XT_UMAX
+0004a0 382e ACC6: .DW XT_DOBRANCH
+0004a1 04b0 DEST(ACC4)
+
+
+ ACC3: ; check for remaining control characters, replace them with blank
+0004a2 38b0 .dw XT_DUP ; ( -- addr k k )
+0004a3 3f53 .dw XT_BL
+0004a4 396d .dw XT_LESS
+0004a5 3835 .dw XT_DOCONDBRANCH
+0004a6 04a9 DEST(PFA_ACCEPT6)
+0004a7 38d8 .dw XT_DROP
+0004a8 3f53 .dw XT_BL
+ PFA_ACCEPT6:
+0004a9 38b0
+0004aa 3ef1
+0004ab 38ce
+0004ac 388c
+0004ad 3a2e
+0004ae 38ce
+0004af 013c .DW XT_DUP,XT_EMIT,XT_OVER,XT_CSTORE,XT_1PLUS,XT_OVER,XT_UMIN
+0004b0 382e ACC4: .DW XT_DOBRANCH
+0004b1 0484 DEST(ACC1)
+0004b2 38d8
+0004b3 38ef
+0004b4 38c3
+0004b5 3992
+0004b6 3fa0
+0004b7 381f 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:
+0004b8 3800 .dw DO_COLON
+ .endif
+0004b9 383c .dw XT_DOLITERAL
+0004ba 0008 .dw 8
+0004bb 38b0 .dw XT_DUP
+0004bc 3ef1 .dw XT_EMIT
+0004bd 3fad .dw XT_SPACE
+0004be 3ef1 .dw XT_EMIT
+0004bf 381f .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:
+0004c0 3800 .dw DO_COLON
+ .endif
+0004c1 38b0 .dw XT_DUP
+0004c2 383c .dw XT_DOLITERAL
+0004c3 000d .dw 13
+0004c4 3fde .dw XT_EQUAL
+0004c5 38c3 .dw XT_SWAP
+0004c6 383c .dw XT_DOLITERAL
+0004c7 000a .dw 10
+0004c8 3fde .dw XT_EQUAL
+0004c9 3a1b .dw XT_OR
+0004ca 381f .dw XT_EXIT
+ .include "words/refill.asm"
+
+ ; System
+ ; refills the input buffer
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_REFILL:
+0004cb ff06 .dw $ff06
+0004cc 6572
+0004cd 6966
+0004ce 6c6c .db "refill"
+0004cf 047a .dw VE_HEAD
+ .set VE_HEAD = VE_REFILL
+ XT_REFILL:
+0004d0 3dfe .dw PFA_DODEFER1
+ PFA_REFILL:
+ .endif
+0004d1 001a .dw USER_REFILL
+0004d2 3dc7 .dw XT_UDEFERFETCH
+0004d3 3dd3 .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:
+0004d4 ff04 .dw $ff04
+0004d5 6863
+0004d6 7261 .db "char"
+0004d7 04cb .dw VE_HEAD
+ .set VE_HEAD = VE_CHAR
+ XT_CHAR:
+0004d8 3800 .dw DO_COLON
+ PFA_CHAR:
+ .endif
+0004d9 05a2 .dw XT_PARSENAME
+0004da 38d8 .dw XT_DROP
+0004db 3897 .dw XT_CFETCH
+0004dc 381f .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:
+0004dd ff06 .dw $ff06
+0004de 756e
+0004df 626d
+0004e0 7265 .db "number"
+0004e1 04d4 .dw VE_HEAD
+ .set VE_HEAD = VE_NUMBER
+ XT_NUMBER:
+0004e2 3800 .dw DO_COLON
+ PFA_NUMBER:
+ .endif
+0004e3 3ebc .dw XT_BASE
+0004e4 3878 .dw XT_FETCH
+0004e5 38fe .dw XT_TO_R
+0004e6 0526 .dw XT_QSIGN
+0004e7 38fe .dw XT_TO_R
+0004e8 0539 .dw XT_SET_BASE
+0004e9 0526 .dw XT_QSIGN
+0004ea 38f5 .dw XT_R_FROM
+0004eb 3a1b .dw XT_OR
+0004ec 38fe .dw XT_TO_R
+ ; check whether something is left
+0004ed 38b0 .dw XT_DUP
+0004ee 3919 .dw XT_ZEROEQUAL
+0004ef 3835 .dw XT_DOCONDBRANCH
+0004f0 04f9 DEST(PFA_NUMBER0)
+ ; nothing is left. It cannot be a number at all
+0004f1 3ed1 .dw XT_2DROP
+0004f2 38f5 .dw XT_R_FROM
+0004f3 38d8 .dw XT_DROP
+0004f4 38f5 .dw XT_R_FROM
+0004f5 3ebc .dw XT_BASE
+0004f6 3880 .dw XT_STORE
+0004f7 3953 .dw XT_ZERO
+0004f8 381f .dw XT_EXIT
+ PFA_NUMBER0:
+0004f9 3b1d .dw XT_2TO_R
+0004fa 3953 .dw XT_ZERO ; starting value
+0004fb 3953 .dw XT_ZERO
+0004fc 3b2c .dw XT_2R_FROM
+0004fd 0557 .dw XT_TO_NUMBER ; ( 0. addr len -- d addr' len'
+ ; check length of the remaining string.
+ ; if zero: a single cell number is entered
+0004fe 38b8 .dw XT_QDUP
+0004ff 3835 .dw XT_DOCONDBRANCH
+000500 051b DEST(PFA_NUMBER1)
+ ; if equal 1: mayba a trailing dot? --> double cell number
+000501 3fe5 .dw XT_ONE
+000502 3fde .dw XT_EQUAL
+000503 3835 .dw XT_DOCONDBRANCH
+000504 0512 DEST(PFA_NUMBER2)
+ ; excatly one character is left
+000505 3897 .dw XT_CFETCH
+000506 383c .dw XT_DOLITERAL
+000507 002e .dw 46 ; .
+000508 3fde .dw XT_EQUAL
+000509 3835 .dw XT_DOCONDBRANCH
+00050a 0513 DEST(PFA_NUMBER6)
+ ; its a double cell number
+ ; incorporate sign into number
+00050b 38f5 .dw XT_R_FROM
+00050c 3835 .dw XT_DOCONDBRANCH
+00050d 050f DEST(PFA_NUMBER3)
+00050e 021a .dw XT_DNEGATE
+ PFA_NUMBER3:
+00050f 3fea .dw XT_TWO
+000510 382e .dw XT_DOBRANCH
+000511 0521 DEST(PFA_NUMBER5)
+ PFA_NUMBER2:
+000512 38d8 .dw XT_DROP
+ PFA_NUMBER6:
+000513 3ed1 .dw XT_2DROP
+000514 38f5 .dw XT_R_FROM
+000515 38d8 .dw XT_DROP
+000516 38f5 .dw XT_R_FROM
+000517 3ebc .dw XT_BASE
+000518 3880 .dw XT_STORE
+000519 3953 .dw XT_ZERO
+00051a 381f .dw XT_EXIT
+ PFA_NUMBER1:
+00051b 3ed1 .dw XT_2DROP ; remove the address
+ ; incorporate sign into number
+00051c 38f5 .dw XT_R_FROM
+00051d 3835 .dw XT_DOCONDBRANCH
+00051e 0520 DEST(PFA_NUMBER4)
+00051f 3e26 .dw XT_NEGATE
+ PFA_NUMBER4:
+000520 3fe5 .dw XT_ONE
+ PFA_NUMBER5:
+000521 38f5 .dw XT_R_FROM
+000522 3ebc .dw XT_BASE
+000523 3880 .dw XT_STORE
+000524 394a .dw XT_TRUE
+000525 381f .dw XT_EXIT
+ .include "words/q-sign.asm"
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ XT_QSIGN:
+000526 3800 .dw DO_COLON
+ PFA_QSIGN: ; ( c -- )
+ .endif
+000527 38ce .dw XT_OVER ; ( -- addr len addr )
+000528 3897 .dw XT_CFETCH
+000529 383c .dw XT_DOLITERAL
+00052a 002d .dw '-'
+00052b 3fde .dw XT_EQUAL ; ( -- addr len flag )
+00052c 38b0 .dw XT_DUP
+00052d 38fe .dw XT_TO_R
+00052e 3835 .dw XT_DOCONDBRANCH
+00052f 0532 DEST(PFA_NUMBERSIGN_DONE)
+000530 3fe5 .dw XT_ONE ; skip sign character
+000531 0593 .dw XT_SLASHSTRING
+ PFA_NUMBERSIGN_DONE:
+000532 38f5 .dw XT_R_FROM
+000533 381f .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:
+000534 3851 .dw PFA_DOCONSTANT
+ .endif
+000535 000a
+000536 0010
+000537 0002
+000538 000a .dw 10,16,2,10 ; last one could a 8 instead.
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ XT_SET_BASE:
+000539 3800 .dw DO_COLON
+ PFA_SET_BASE: ; ( adr1 len1 -- adr2 len2 )
+ .endif
+00053a 38ce .dw XT_OVER
+00053b 3897 .dw XT_CFETCH
+00053c 383c .dw XT_DOLITERAL
+00053d 0023 .dw 35
+00053e 3992 .dw XT_MINUS
+00053f 38b0 .dw XT_DUP
+000540 3953 .dw XT_ZERO
+000541 383c .dw XT_DOLITERAL
+000542 0004 .dw 4
+000543 3e56 .dw XT_WITHIN
+000544 3835 .dw XT_DOCONDBRANCH
+000545 054f DEST(SET_BASE1)
+ .if cpu_msp430==1
+ .endif
+000546 0534 .dw XT_BASES
+000547 399c .dw XT_PLUS
+000548 3bca .dw XT_FETCHI
+000549 3ebc .dw XT_BASE
+00054a 3880 .dw XT_STORE
+00054b 3fe5 .dw XT_ONE
+00054c 0593 .dw XT_SLASHSTRING
+00054d 382e .dw XT_DOBRANCH
+00054e 0550 DEST(SET_BASE2)
+ SET_BASE1:
+00054f 38d8 .dw XT_DROP
+ SET_BASE2:
+000550 381f .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:
+000551 ff07 .dw $ff07
+000552 6e3e
+000553 6d75
+000554 6562
+000555 0072 .db ">number",0
+000556 04dd .dw VE_HEAD
+ .set VE_HEAD = VE_TO_NUMBER
+ XT_TO_NUMBER:
+000557 3800 .dw DO_COLON
+
+ .endif
+
+000558 38b0
+000559 3835 TONUM1: .DW XT_DUP,XT_DOCONDBRANCH
+00055a 056f DEST(TONUM3)
+00055b 38ce
+00055c 3897
+00055d 039d .DW XT_OVER,XT_CFETCH,XT_DIGITQ
+00055e 3919
+00055f 3835 .DW XT_ZEROEQUAL,XT_DOCONDBRANCH
+000560 0563 DEST(TONUM2)
+000561 38d8
+000562 381f .DW XT_DROP,XT_EXIT
+000563 38fe
+000564 023e
+000565 3ebc
+000566 3878
+000567 0121 TONUM2: .DW XT_TO_R,XT_2SWAP,XT_BASE,XT_FETCH,XT_UDSTAR
+000568 38f5
+000569 0119
+00056a 023e .DW XT_R_FROM,XT_MPLUS,XT_2SWAP
+00056b 3fe5
+00056c 0593
+00056d 382e .DW XT_ONE,XT_SLASHSTRING,XT_DOBRANCH
+00056e 0558 DEST(TONUM1)
+00056f 381f 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:
+000570 ff05 .dw $ff05
+000571 6170
+000572 7372
+000573 0065 .db "parse",0
+000574 0551 .dw VE_HEAD
+ .set VE_HEAD = VE_PARSE
+ XT_PARSE:
+000575 3800 .dw DO_COLON
+ PFA_PARSE:
+ .endif
+000576 38fe .dw XT_TO_R ; ( -- )
+000577 0589 .dw XT_SOURCE ; ( -- addr len)
+000578 3ee1 .dw XT_TO_IN ; ( -- addr len >in)
+000579 3878 .dw XT_FETCH
+00057a 0593 .dw XT_SLASHSTRING ; ( -- addr' len' )
+
+00057b 38f5 .dw XT_R_FROM ; ( -- addr' len' c)
+00057c 045f .dw XT_CSCAN ; ( -- addr' len'')
+00057d 38b0 .dw XT_DUP ; ( -- addr' len'' len'')
+00057e 3a2e .dw XT_1PLUS
+00057f 3ee1 .dw XT_TO_IN ; ( -- addr' len'' len'' >in)
+000580 3a64 .dw XT_PLUSSTORE ; ( -- addr' len')
+000581 3fe5 .dw XT_ONE
+000582 0593 .dw XT_SLASHSTRING
+000583 381f .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:
+000584 ff06 .dw $FF06
+000585 6f73
+000586 7275
+000587 6563 .db "source"
+000588 0570 .dw VE_HEAD
+ .set VE_HEAD = VE_SOURCE
+ XT_SOURCE:
+000589 3dfe .dw PFA_DODEFER1
+ PFA_SOURCE:
+ .endif
+00058a 0016 .dw USER_SOURCE
+00058b 3dc7 .dw XT_UDEFERFETCH
+00058c 3dd3 .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:
+00058d ff07 .dw $ff07
+00058e 732f
+00058f 7274
+000590 6e69
+000591 0067 .db "/string",0
+000592 0584 .dw VE_HEAD
+ .set VE_HEAD = VE_SLASHSTRING
+ XT_SLASHSTRING:
+000593 3800 .dw DO_COLON
+ PFA_SLASHSTRING:
+ .endif
+000594 38e0 .dw XT_ROT
+000595 38ce .dw XT_OVER
+000596 399c .dw XT_PLUS
+000597 38e0 .dw XT_ROT
+000598 38e0 .dw XT_ROT
+000599 3992 .dw XT_MINUS
+00059a 381f .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:
+00059b ff0a .dw $FF0A
+00059c 6170
+00059d 7372
+00059e 2d65
+00059f 616e
+0005a0 656d .db "parse-name"
+0005a1 058d .dw VE_HEAD
+ .set VE_HEAD = VE_PARSENAME
+ XT_PARSENAME:
+0005a2 3800 .dw DO_COLON
+ PFA_PARSENAME:
+ .endif
+0005a3 3f53 .dw XT_BL
+0005a4 05a6 .dw XT_SKIPSCANCHAR
+0005a5 381f .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:
+0005a6 3800 .dw DO_COLON
+ PFA_SKIPSCANCHAR:
+ .endif
+0005a7 38fe .dw XT_TO_R
+0005a8 0589 .dw XT_SOURCE
+0005a9 3ee1 .dw XT_TO_IN
+0005aa 3878 .dw XT_FETCH
+0005ab 0593 .dw XT_SLASHSTRING
+
+0005ac 3907 .dw XT_R_FETCH
+0005ad 0448 .dw XT_CSKIP
+0005ae 38f5 .dw XT_R_FROM
+0005af 045f .dw XT_CSCAN
+
+ ; adjust >IN
+0005b0 3ec8 .dw XT_2DUP
+0005b1 399c .dw XT_PLUS
+0005b2 0589 .dw XT_SOURCE
+0005b3 38d8 .dw XT_DROP
+0005b4 3992 .dw XT_MINUS
+0005b5 3ee1 .dw XT_TO_IN
+0005b6 3880 .dw XT_STORE
+0005b7 381f .dw XT_EXIT
+ .include "words/sp0.asm"
+
+ ; Stack
+ ; start address of the data stack
+ VE_SP0:
+0005b8 ff03 .dw $ff03
+0005b9 7073
+0005ba 0030 .db "sp0",0
+0005bb 059b .dw VE_HEAD
+ .set VE_HEAD = VE_SP0
+ XT_SP0:
+0005bc 386e .dw PFA_DOVALUE1
+ PFA_SP0:
+0005bd 0006 .dw USER_SP0
+0005be 3dc7 .dw XT_UDEFERFETCH
+0005bf 3dd3 .dw XT_UDEFERSTORE
+
+ ; ( -- addr)
+ ; Stack
+ ; address of user variable to store top-of-stack for inactive tasks
+ VE_SP:
+0005c0 ff02 .dw $ff02
+0005c1 7073 .db "sp"
+0005c2 05b8 .dw VE_HEAD
+ .set VE_HEAD = VE_SP
+ XT_SP:
+0005c3 3857 .dw PFA_DOUSER
+ PFA_SP:
+0005c4 0008 .dw USER_SP
+ .include "words/rp0.asm"
+
+ ; Stack
+ ; start address of return stack
+ VE_RP0:
+0005c5 ff03 .dw $ff03
+0005c6 7072
+0005c7 0030 .db "rp0",0
+0005c8 05c0 .dw VE_HEAD
+ .set VE_HEAD = VE_RP0
+ XT_RP0:
+0005c9 3800 .dw DO_COLON
+ PFA_RP0:
+0005ca 05cd .dw XT_DORP0
+0005cb 3878 .dw XT_FETCH
+0005cc 381f .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:
+0005cd 3857 .dw PFA_DOUSER
+ PFA_DORP0:
+0005ce 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:
+0005cf ff05 .dw $ff05
+0005d0 6564
+0005d1 7470
+0005d2 0068 .db "depth",0
+0005d3 05c5 .dw VE_HEAD
+ .set VE_HEAD = VE_DEPTH
+ XT_DEPTH:
+0005d4 3800 .dw DO_COLON
+ PFA_DEPTH:
+ .endif
+0005d5 05bc .dw XT_SP0
+0005d6 3a8c .dw XT_SP_FETCH
+0005d7 3992 .dw XT_MINUS
+0005d8 3a03 .dw XT_2SLASH
+0005d9 3a34 .dw XT_1MINUS
+0005da 381f .dw XT_EXIT
+ .include "words/forth-recognizer.asm"
+
+ ; System Value
+ ; address of the next free data space (RAM) cell
+ VE_FORTHRECOGNIZER:
+0005db ff10 .dw $ff10
+0005dc 6f66
+0005dd 7472
+0005de 2d68
+0005df 6572
+0005e0 6f63
+0005e1 6e67
+0005e2 7a69
+0005e3 7265 .db "forth-recognizer"
+0005e4 05cf .dw VE_HEAD
+ .set VE_HEAD = VE_FORTHRECOGNIZER
+ XT_FORTHRECOGNIZER:
+0005e5 386e .dw PFA_DOVALUE1
+ PFA_FORTHRECOGNIZER:
+0005e6 0060 .dw CFG_FORTHRECOGNIZER
+0005e7 3d9f .dw XT_EDEFERFETCH
+0005e8 3da9 .dw XT_EDEFERSTORE
+ .include "words/recognize.asm"
+
+ ; System
+ ; walk the recognizer stack
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_RECOGNIZE:
+0005e9 ff09 .dw $ff09
+0005ea 6572
+0005eb 6f63
+0005ec 6e67
+0005ed 7a69
+0005ee 0065 .db "recognize",0
+0005ef 05db .dw VE_HEAD
+ .set VE_HEAD = VE_RECOGNIZE
+ XT_RECOGNIZE:
+0005f0 3800 .dw DO_COLON
+ PFA_RECOGNIZE:
+ .endif
+0005f1 383c .dw XT_DOLITERAL
+0005f2 05fb .dw XT_RECOGNIZE_A
+0005f3 38c3 .dw XT_SWAP
+0005f4 098e .dw XT_MAPSTACK
+0005f5 3919 .dw XT_ZEROEQUAL
+0005f6 3835 .dw XT_DOCONDBRANCH
+0005f7 05fa DEST(PFA_RECOGNIZE1)
+0005f8 3ed1 .dw XT_2DROP
+0005f9 067d .dw XT_DT_NULL
+ PFA_RECOGNIZE1:
+0005fa 381f .dw XT_EXIT
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ ; ( addr len XT -- addr len [ dt:xt -1 | 0 ] )
+ XT_RECOGNIZE_A:
+0005fb 3800 .dw DO_COLON
+ PFA_RECOGNIZE_A:
+ .endif
+0005fc 38e0 .dw XT_ROT ; -- len xt addr
+0005fd 38e0 .dw XT_ROT ; -- xt addr len
+0005fe 3ec8 .dw XT_2DUP
+0005ff 3b1d .dw XT_2TO_R
+000600 38e0 .dw XT_ROT ; -- addr len xt
+000601 3829 .dw XT_EXECUTE ; -- i*x dt:* | dt:null
+000602 3b2c .dw XT_2R_FROM
+000603 38e0 .dw XT_ROT
+000604 38b0 .dw XT_DUP
+000605 067d .dw XT_DT_NULL
+000606 3fde .dw XT_EQUAL
+000607 3835 .dw XT_DOCONDBRANCH
+000608 060c DEST(PFA_RECOGNIZE_A1)
+000609 38d8 .dw XT_DROP
+00060a 3953 .dw XT_ZERO
+00060b 381f .dw XT_EXIT
+ PFA_RECOGNIZE_A1:
+00060c 38ef .dw XT_NIP
+00060d 38ef .dw XT_NIP
+00060e 394a .dw XT_TRUE
+00060f 381f .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:
+000610 ff09 .dw $ff09
+000611 6e69
+000612 6574
+000613 7072
+000614 6572
+000615 0074 .db "interpret",0
+000616 05e9 .dw VE_HEAD
+ .set VE_HEAD = VE_INTERPRET
+ XT_INTERPRET:
+000617 3800 .dw DO_COLON
+ .endif
+ PFA_INTERPRET:
+000618 05a2 .dw XT_PARSENAME ; ( -- addr len )
+000619 38b0 .dw XT_DUP ; ( -- addr len flag)
+00061a 3835 .dw XT_DOCONDBRANCH
+00061b 0628 DEST(PFA_INTERPRET2)
+00061c 05e5 .dw XT_FORTHRECOGNIZER
+00061d 05f0 .dw XT_RECOGNIZE
+00061e 3eb6 .dw XT_STATE
+00061f 3878 .dw XT_FETCH
+000620 3835 .dw XT_DOCONDBRANCH
+000621 0623 DEST(PFA_INTERPRET1)
+000622 01a7 .dw XT_ICELLPLUS ; we need the compile action
+ PFA_INTERPRET1:
+000623 3bca .dw XT_FETCHI
+000624 3829 .dw XT_EXECUTE
+000625 3f8a .dw XT_QSTACK
+000626 382e .dw XT_DOBRANCH
+000627 0618 DEST(PFA_INTERPRET)
+ PFA_INTERPRET2:
+000628 3ed1 .dw XT_2DROP
+000629 381f .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:
+00062a ff06 .dw $ff06
+00062b 7464
+00062c 6e3a
+00062d 6d75 .db "dt:num"
+00062e 0610 .dw VE_HEAD
+ .set VE_HEAD = VE_DT_NUM
+ XT_DT_NUM:
+00062f 3851 .dw PFA_DOCONSTANT
+ PFA_DT_NUM:
+ .endif
+000630 017b .dw XT_NOOP ; interpret
+000631 0764 .dw XT_LITERAL ; compile
+000632 0764 .dw XT_LITERAL ; postpone
+
+ ; ( -- addr )
+ ; Interpreter
+ ; Method table for double cell integers
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_DT_DNUM:
+000633 ff07 .dw $ff07
+000634 7464
+000635 643a
+000636 756e
+000637 006d .db "dt:dnum",0
+000638 062a .dw VE_HEAD
+ .set VE_HEAD = VE_DT_DNUM
+ XT_DT_DNUM:
+000639 3851 .dw PFA_DOCONSTANT
+ PFA_DT_DNUM:
+ .endif
+00063a 017b .dw XT_NOOP ; interpret
+00063b 3fd6 .dw XT_2LITERAL ; compile
+00063c 3fd6 .dw XT_2LITERAL ; postpone
+
+ ; ( addr len -- f )
+ ; Interpreter
+ ; recognizer for integer numbers
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+
+ VE_REC_NUM:
+00063d ff07 .dw $ff07
+00063e 6572
+00063f 3a63
+000640 756e
+000641 006d .db "rec:num",0
+000642 0633 .dw VE_HEAD
+ .set VE_HEAD = VE_REC_NUM
+ XT_REC_NUM:
+000643 3800 .dw DO_COLON
+ PFA_REC_NUM:
+ .endif
+ ; try converting to a number
+000644 04e2 .dw XT_NUMBER
+000645 3835 .dw XT_DOCONDBRANCH
+000646 064f DEST(PFA_REC_NONUMBER)
+000647 3fe5 .dw XT_ONE
+000648 3fde .dw XT_EQUAL
+000649 3835 .dw XT_DOCONDBRANCH
+00064a 064d DEST(PFA_REC_INTNUM2)
+00064b 062f .dw XT_DT_NUM
+00064c 381f .dw XT_EXIT
+ PFA_REC_INTNUM2:
+00064d 0639 .dw XT_DT_DNUM
+00064e 381f .dw XT_EXIT
+ PFA_REC_NONUMBER:
+00064f 067d .dw XT_DT_NULL
+000650 381f .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:
+000651 ff08 .dw $ff08
+000652 6572
+000653 3a63
+000654 6966
+000655 646e .db "rec:find"
+000656 063d .dw VE_HEAD
+ .set VE_HEAD = VE_REC_FIND
+ XT_REC_FIND:
+000657 3800 .dw DO_COLON
+ PFA_REC_FIND:
+ .endif
+000658 06f2 .DW XT_FINDXT
+000659 38b0 .dw XT_DUP
+00065a 3919 .dw XT_ZEROEQUAL
+00065b 3835 .dw XT_DOCONDBRANCH
+00065c 0660 DEST(PFA_REC_WORD_FOUND)
+00065d 38d8 .dw XT_DROP
+00065e 067d .dw XT_DT_NULL
+00065f 381f .dw XT_EXIT
+ PFA_REC_WORD_FOUND:
+000660 0667 .dw XT_DT_XT
+
+000661 381f .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:
+000662 ff05 .dw $ff05
+000663 7464
+000664 783a
+000665 0074 .db "dt:xt",0
+000666 0651 .dw VE_HEAD
+ .set VE_HEAD = VE_DT_XT
+ XT_DT_XT:
+000667 3851 .dw PFA_DOCONSTANT
+ PFA_DT_XT:
+ .endif
+000668 066b .dw XT_R_WORD_INTERPRET
+000669 066f .dw XT_R_WORD_COMPILE
+00066a 3fd6 .dw XT_2LITERAL
+
+ ; ( XT flags -- )
+ ; Interpreter
+ ; interpret method for WORD recognizer
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ XT_R_WORD_INTERPRET:
+00066b 3800 .dw DO_COLON
+ PFA_R_WORD_INTERPRET:
+ .endif
+00066c 38d8 .dw XT_DROP ; the flags are in the way
+00066d 3829 .dw XT_EXECUTE
+00066e 381f .dw XT_EXIT
+
+ ; ( XT flags -- )
+ ; Interpreter
+ ; Compile method for WORD recognizer
+ .if cpu_msp430==1
+ .endif
+ .if cpu_avr8==1
+ XT_R_WORD_COMPILE:
+00066f 3800 .dw DO_COLON
+ PFA_R_WORD_COMPILE:
+ .endif
+000670 3920 .dw XT_ZEROLESS
+000671 3835 .dw XT_DOCONDBRANCH
+000672 0675 DEST(PFA_R_WORD_COMPILE1)
+000673 074e .dw XT_COMMA
+000674 381f .dw XT_EXIT
+ PFA_R_WORD_COMPILE1:
+000675 3829 .dw XT_EXECUTE
+000676 381f .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:
+000677 ff07 .dw $ff07
+000678 7464
+000679 6e3a
+00067a 6c75
+../../common\words/dt-null.asm(12): warning: .cseg .db misalignment - padding zero byte
+00067b 006c .db "dt:null"
+00067c 0662 .dw VE_HEAD
+ .set VE_HEAD = VE_DT_NULL
+ XT_DT_NULL:
+00067d 3851 .dw PFA_DOCONSTANT
+ PFA_DT_NULL:
+ .endif
+00067e 0681 .dw XT_FAIL ; interpret
+00067f 0681 .dw XT_FAIL ; compile
+000680 0681 .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:
+000681 3800 .dw DO_COLON
+ PFA_FAIL:
+ .endif
+000682 383c .dw XT_DOLITERAL
+000683 fff3 .dw -13
+000684 3d85 .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:
+000685 ff0f .dw $ff0f
+000686 6573
+000687 7261
+000688 6863
+000689 772d
+00068a 726f
+00068b 6c64
+00068c 7369
+00068d 0074 .db "search-wordlist",0
+00068e 0677 .dw VE_HEAD
+ .set VE_HEAD = VE_SEARCH_WORDLIST
+ XT_SEARCH_WORDLIST:
+00068f 3800 .dw DO_COLON
+ PFA_SEARCH_WORDLIST:
+ .endif
+000690 38fe .dw XT_TO_R
+000691 3953 .dw XT_ZERO
+000692 383c .dw XT_DOLITERAL
+000693 06a4 .dw XT_ISWORD
+000694 38f5 .dw XT_R_FROM
+000695 06c1 .dw XT_TRAVERSEWORDLIST
+000696 38b0 .dw XT_DUP
+000697 3919 .dw XT_ZEROEQUAL
+000698 3835 .dw XT_DOCONDBRANCH
+000699 069e DEST(PFA_SEARCH_WORDLIST1)
+00069a 3ed1 .dw XT_2DROP
+00069b 38d8 .dw XT_DROP
+00069c 3953 .dw XT_ZERO
+00069d 381f .dw XT_EXIT
+ PFA_SEARCH_WORDLIST1:
+ ; ... get the XT ...
+00069e 38b0 .dw XT_DUP
+00069f 06e8 .dw XT_NFA2CFA
+ ; .. and get the header flag
+0006a0 38c3 .dw XT_SWAP
+0006a1 0156 .dw XT_NAME2FLAGS
+0006a2 0144 .dw XT_IMMEDIATEQ
+0006a3 381f .dw XT_EXIT
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ XT_ISWORD:
+0006a4 3800 .dw DO_COLON
+ PFA_ISWORD:
+ .endif
+ ; ( c-addr len 0 nt -- c-addr len 0 true| nt false )
+0006a5 38fe .dw XT_TO_R
+0006a6 38d8 .dw XT_DROP
+0006a7 3ec8 .dw XT_2DUP
+0006a8 3907 .dw XT_R_FETCH ; -- addr len addr len nt
+0006a9 06dc .dw XT_NAME2STRING
+0006aa 01b0 .dw XT_ICOMPARE ; (-- addr len f )
+0006ab 3835 .dw XT_DOCONDBRANCH
+0006ac 06b2 DEST(PFA_ISWORD3)
+ ; not now
+0006ad 38f5 .dw XT_R_FROM
+0006ae 38d8 .dw XT_DROP
+0006af 3953 .dw XT_ZERO
+0006b0 394a .dw XT_TRUE ; maybe next word
+0006b1 381f .dw XT_EXIT
+ PFA_ISWORD3:
+ ; we found the word, now clean up iteration data ...
+0006b2 3ed1 .dw XT_2DROP
+0006b3 38f5 .dw XT_R_FROM
+0006b4 3953 .dw XT_ZERO ; finish traverse-wordlist
+0006b5 381f .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:
+0006b6 ff11 .dw $ff11
+0006b7 7274
+0006b8 7661
+0006b9 7265
+0006ba 6573
+0006bb 772d
+0006bc 726f
+0006bd 6c64
+0006be 7369
+0006bf 0074 .db "traverse-wordlist",0
+0006c0 0685 .dw VE_HEAD
+ .set VE_HEAD = VE_TRAVERSEWORDLIST
+ XT_TRAVERSEWORDLIST:
+0006c1 3800 .dw DO_COLON
+ PFA_TRAVERSEWORDLIST:
+
+ .endif
+0006c2 3b5e .dw XT_FETCHE
+ PFA_TRAVERSEWORDLIST1:
+0006c3 38b0 .dw XT_DUP ; ( -- xt nt nt )
+0006c4 3835 .dw XT_DOCONDBRANCH ; ( -- nt ) is nfa = counted string
+0006c5 06d2 DEST(PFA_TRAVERSEWORDLIST2)
+0006c6 3ec8 .dw XT_2DUP
+0006c7 3b1d .dw XT_2TO_R
+0006c8 38c3 .dw XT_SWAP
+0006c9 3829 .dw XT_EXECUTE
+0006ca 3b2c .dw XT_2R_FROM
+0006cb 38e0 .dw XT_ROT
+0006cc 3835 .dw XT_DOCONDBRANCH
+0006cd 06d2 DEST(PFA_TRAVERSEWORDLIST2)
+0006ce 09fd .dw XT_NFA2LFA
+0006cf 3bca .dw XT_FETCHI
+0006d0 382e .dw XT_DOBRANCH ; ( -- addr )
+0006d1 06c3 DEST(PFA_TRAVERSEWORDLIST1) ; ( -- addr )
+ PFA_TRAVERSEWORDLIST2:
+0006d2 3ed1 .dw XT_2DROP
+0006d3 381f .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:
+0006d4 ff0b .dw $ff0b
+0006d5 616e
+0006d6 656d
+0006d7 733e
+0006d8 7274
+0006d9 6e69
+0006da 0067 .db "name>string",0
+0006db 06b6 .dw VE_HEAD
+ .set VE_HEAD = VE_NAME2STRING
+ XT_NAME2STRING:
+0006dc 3800 .dw DO_COLON
+ PFA_NAME2STRING:
+
+ .endif
+0006dd 0416 .dw XT_ICOUNT ; ( -- addr n )
+0006de 383c .dw XT_DOLITERAL
+0006df 00ff .dw 255
+0006e0 3a12 .dw XT_AND ; mask immediate bit
+0006e1 381f .dw XT_EXIT
+ .include "words/nfa2cfa.asm"
+
+ ; Tools
+ ; get the XT from a name token
+ VE_NFA2CFA:
+0006e2 ff07 .dw $ff07
+0006e3 666e
+0006e4 3e61
+0006e5 6663
+../../avr8\words/nfa2cfa.asm(6): warning: .cseg .db misalignment - padding zero byte
+0006e6 0061 .db "nfa>cfa"
+0006e7 06d4 .dw VE_HEAD
+ .set VE_HEAD = VE_NFA2CFA
+ XT_NFA2CFA:
+0006e8 3800 .dw DO_COLON
+ PFA_NFA2CFA:
+0006e9 09fd .dw XT_NFA2LFA ; skip to link field
+0006ea 3a2e .dw XT_1PLUS ; next is the execution token
+0006eb 381f .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:
+0006ec ff07 .dw $ff07
+0006ed 6966
+0006ee 646e
+0006ef 782d
+0006f0 0074 .db "find-xt",0
+0006f1 06e2 .dw VE_HEAD
+ .set VE_HEAD = VE_FINDXT
+ XT_FINDXT:
+0006f2 3800 .dw DO_COLON
+ PFA_FINDXT:
+ .endif
+0006f3 383c .dw XT_DOLITERAL
+0006f4 06fe .dw XT_FINDXTA
+0006f5 383c .dw XT_DOLITERAL
+0006f6 006c .dw CFG_ORDERLISTLEN
+0006f7 098e .dw XT_MAPSTACK
+0006f8 3919 .dw XT_ZEROEQUAL
+0006f9 3835 .dw XT_DOCONDBRANCH
+0006fa 06fd DEST(PFA_FINDXT1)
+0006fb 3ed1 .dw XT_2DROP
+0006fc 3953 .dw XT_ZERO
+ PFA_FINDXT1:
+0006fd 381f .dw XT_EXIT
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+
+ XT_FINDXTA:
+0006fe 3800 .dw DO_COLON
+ PFA_FINDXTA:
+ .endif
+0006ff 38fe .dw XT_TO_R
+000700 3ec8 .dw XT_2DUP
+000701 38f5 .dw XT_R_FROM
+000702 068f .dw XT_SEARCH_WORDLIST
+000703 38b0 .dw XT_DUP
+000704 3835 .dw XT_DOCONDBRANCH
+000705 070b DEST(PFA_FINDXTA1)
+000706 38fe .dw XT_TO_R
+000707 38ef .dw XT_NIP
+000708 38ef .dw XT_NIP
+000709 38f5 .dw XT_R_FROM
+00070a 394a .dw XT_TRUE
+ PFA_FINDXTA1:
+00070b 381f .dw XT_EXIT
+
+ .include "dict/compiler1.inc"
+
+ .include "words/newest.asm"
+
+ ; System Variable
+ ; system state
+ VE_NEWEST:
+00070c ff06 .dw $ff06
+00070d 656e
+00070e 6577
+00070f 7473 .db "newest"
+000710 06ec .dw VE_HEAD
+ .set VE_HEAD = VE_NEWEST
+ XT_NEWEST:
+000711 3847 .dw PFA_DOVARIABLE
+ PFA_NEWEST:
+000712 019b .dw ram_newest
+
+ .dseg
+00019b ram_newest: .byte 4
+ .include "words/latest.asm"
+
+ ; System Variable
+ ; system state
+ VE_LATEST:
+000713 ff06 .dw $ff06
+000714 616c
+000715 6574
+000716 7473 .db "latest"
+000717 070c .dw VE_HEAD
+ .set VE_HEAD = VE_LATEST
+ XT_LATEST:
+000718 3847 .dw PFA_DOVARIABLE
+ PFA_LATEST:
+000719 019f .dw ram_latest
+
+ .dseg
+00019f 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:
+00071a ff08 .dw $ff08
+00071b 6328
+00071c 6572
+00071d 7461
+00071e 2965 .db "(create)"
+00071f 0713 .dw VE_HEAD
+ .set VE_HEAD = VE_DOCREATE
+ XT_DOCREATE:
+000720 3800 .dw DO_COLON
+ PFA_DOCREATE:
+ .endif
+000721 05a2
+000722 0877 .DW XT_PARSENAME,XT_WLSCOPE ; ( -- addr len wid)
+000723 38b0
+000724 0711
+000725 3c8f
+000726 3880 .DW XT_DUP,XT_NEWEST,XT_CELLPLUS,XT_STORE ; save the wid
+000727 085c
+000728 0711
+000729 3880 .DW XT_HEADER,XT_NEWEST,XT_STORE ; save the nt
+00072a 381f .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:
+00072b 0001 .dw $0001
+00072c 005c .db $5c,0
+00072d 071a .dw VE_HEAD
+ .set VE_HEAD = VE_BACKSLASH
+ XT_BACKSLASH:
+00072e 3800 .dw DO_COLON
+ PFA_BACKSLASH:
+ .endif
+00072f 0589 .dw XT_SOURCE
+000730 38ef .dw XT_NIP
+000731 3ee1 .dw XT_TO_IN
+000732 3880 .dw XT_STORE
+000733 381f .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:
+000734 0001 .dw $0001
+000735 0028 .db "(" ,0
+000736 072b .dw VE_HEAD
+ .set VE_HEAD = VE_LPAREN
+ XT_LPAREN:
+000737 3800 .dw DO_COLON
+ PFA_LPAREN:
+ .endif
+000738 383c .dw XT_DOLITERAL
+000739 0029 .dw ')'
+00073a 0575 .dw XT_PARSE
+00073b 3ed1 .dw XT_2DROP
+00073c 381f .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:
+00073d ff07 .dw $ff07
+00073e 6f63
+00073f 706d
+000740 6c69
+000741 0065 .db "compile",0
+000742 0734 .dw VE_HEAD
+ .set VE_HEAD = VE_COMPILE
+ XT_COMPILE:
+000743 3800 .dw DO_COLON
+ PFA_COMPILE:
+ .endif
+000744 38f5 .dw XT_R_FROM
+000745 38b0 .dw XT_DUP
+000746 01a7 .dw XT_ICELLPLUS
+000747 38fe .dw XT_TO_R
+000748 3bca .dw XT_FETCHI
+000749 074e .dw XT_COMMA
+00074a 381f .dw XT_EXIT
+ .include "words/comma.asm"
+
+ ; Dictionary
+ ; compile 16 bit into flash at DP
+ VE_COMMA:
+00074b ff01 .dw $ff01
+00074c 002c .db ',',0 ; ,
+00074d 073d .dw VE_HEAD
+ .set VE_HEAD = VE_COMMA
+ XT_COMMA:
+00074e 3800 .dw DO_COLON
+ PFA_COMMA:
+00074f 3f11 .dw XT_DP
+000750 3b72 .dw XT_STOREI
+000751 3f11 .dw XT_DP
+000752 3a2e .dw XT_1PLUS
+000753 0195 .dw XT_DOTO
+000754 3f12 .dw PFA_DP
+000755 381f .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:
+000756 0003 .dw $0003
+000757 275b
+000758 005d .db "[']",0
+000759 074b .dw VE_HEAD
+ .set VE_HEAD = VE_BRACKETTICK
+ XT_BRACKETTICK:
+00075a 3800 .dw DO_COLON
+ PFA_BRACKETTICK:
+ .endif
+00075b 042f .dw XT_TICK
+00075c 0764 .dw XT_LITERAL
+00075d 381f .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:
+00075e 0007 .dw $0007
+00075f 696c
+000760 6574
+000761 6172
+000762 006c .db "literal",0
+000763 0756 .dw VE_HEAD
+ .set VE_HEAD = VE_LITERAL
+ XT_LITERAL:
+000764 3800 .dw DO_COLON
+ PFA_LITERAL:
+ .endif
+000765 0743 .DW XT_COMPILE
+000766 383c .DW XT_DOLITERAL
+000767 074e .DW XT_COMMA
+000768 381f .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:
+000769 0008 .dw $0008
+00076a 6c73
+00076b 7469
+00076c 7265
+00076d 6c61 .db "sliteral"
+00076e 075e .dw VE_HEAD
+ .set VE_HEAD = VE_SLITERAL
+ XT_SLITERAL:
+00076f 3800 .dw DO_COLON
+ PFA_SLITERAL:
+ .endif
+000770 0743 .dw XT_COMPILE
+000771 03b7 .dw XT_DOSLITERAL ; ( -- addr n)
+000772 03c5 .dw XT_SCOMMA
+000773 381f .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:
+000774 3800 .dw DO_COLON
+ PFA_GMARK:
+000775 3f11 .dw XT_DP
+000776 0743 .dw XT_COMPILE
+000777 ffff .dw -1 ; ffff does not erase flash
+000778 381f .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:
+000779 3800 .dw DO_COLON
+ PFA_GRESOLVE:
+00077a 3f8a .dw XT_QSTACK
+00077b 3f11 .dw XT_DP
+00077c 38c3 .dw XT_SWAP
+00077d 3b72 .dw XT_STOREI
+00077e 381f .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:
+00077f 3800 .dw DO_COLON
+ PFA_LMARK:
+000780 3f11 .dw XT_DP
+000781 381f .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:
+000782 3800 .dw DO_COLON
+ PFA_LRESOLVE:
+000783 3f8a .dw XT_QSTACK
+000784 074e .dw XT_COMMA
+000785 381f .dw XT_EXIT
+
+ .include "words/ahead.asm"
+
+ ; Compiler
+ ; do a unconditional branch
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_AHEAD:
+000786 0005 .dw $0005
+000787 6861
+000788 6165
+000789 0064 .db "ahead",0
+00078a 0769 .dw VE_HEAD
+ .set VE_HEAD = VE_AHEAD
+ XT_AHEAD:
+00078b 3800 .dw DO_COLON
+ PFA_AHEAD:
+ .endif
+00078c 0743 .dw XT_COMPILE
+00078d 382e .dw XT_DOBRANCH
+00078e 0774 .dw XT_GMARK
+00078f 381f .dw XT_EXIT
+ .include "words/if.asm"
+
+ ; Compiler
+ ; start conditional branch
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_IF:
+000790 0002 .dw $0002
+000791 6669 .db "if"
+000792 0786 .dw VE_HEAD
+ .set VE_HEAD = VE_IF
+ XT_IF:
+000793 3800 .dw DO_COLON
+ PFA_IF:
+ .endif
+000794 0743 .dw XT_COMPILE
+000795 3835 .dw XT_DOCONDBRANCH
+000796 0774 .dw XT_GMARK
+000797 381f .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:
+000798 0004 .dw $0004
+000799 6c65
+00079a 6573 .db "else"
+00079b 0790 .dw VE_HEAD
+ .set VE_HEAD = VE_ELSE
+ XT_ELSE:
+00079c 3800 .dw DO_COLON
+ PFA_ELSE:
+ .endif
+00079d 0743 .dw XT_COMPILE
+00079e 382e .dw XT_DOBRANCH
+00079f 0774 .dw XT_GMARK
+0007a0 38c3 .dw XT_SWAP
+0007a1 0779 .dw XT_GRESOLVE
+0007a2 381f .dw XT_EXIT
+ .include "words/then.asm"
+
+ ; Compiler
+ ; finish if
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_THEN:
+0007a3 0004 .dw $0004
+0007a4 6874
+0007a5 6e65 .db "then"
+0007a6 0798 .dw VE_HEAD
+ .set VE_HEAD = VE_THEN
+ XT_THEN:
+0007a7 3800 .dw DO_COLON
+ PFA_THEN:
+ .endif
+0007a8 0779 .dw XT_GRESOLVE
+0007a9 381f .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:
+0007aa 0005 .dw $0005
+0007ab 6562
+0007ac 6967
+0007ad 006e .db "begin",0
+0007ae 07a3 .dw VE_HEAD
+ .set VE_HEAD = VE_BEGIN
+ XT_BEGIN:
+0007af 3800 .dw DO_COLON
+ PFA_BEGIN:
+ .endif
+0007b0 077f .dw XT_LMARK
+0007b1 381f .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:
+0007b2 0005 .dw $0005
+0007b3 6877
+0007b4 6c69
+0007b5 0065 .db "while",0
+0007b6 07aa .dw VE_HEAD
+ .set VE_HEAD = VE_WHILE
+ XT_WHILE:
+0007b7 3800 .dw DO_COLON
+ PFA_WHILE:
+ .endif
+0007b8 0793 .dw XT_IF
+0007b9 38c3 .dw XT_SWAP
+0007ba 381f .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:
+0007bb 0006 .dw $0006
+0007bc 6572
+0007bd 6570
+0007be 7461 .db "repeat"
+0007bf 07b2 .dw VE_HEAD
+ .set VE_HEAD = VE_REPEAT
+ XT_REPEAT:
+0007c0 3800 .dw DO_COLON
+ PFA_REPEAT:
+ .endif
+0007c1 07d4 .dw XT_AGAIN
+0007c2 07a7 .dw XT_THEN
+0007c3 381f .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:
+0007c4 0005 .dw $0005
+0007c5 6e75
+0007c6 6974
+0007c7 006c .db "until",0
+0007c8 07bb .dw VE_HEAD
+ .set VE_HEAD = VE_UNTIL
+ XT_UNTIL:
+0007c9 3800 .dw DO_COLON
+ PFA_UNTIL:
+ .endif
+0007ca 383c .dw XT_DOLITERAL
+0007cb 3835 .dw XT_DOCONDBRANCH
+0007cc 074e .dw XT_COMMA
+
+0007cd 0782 .dw XT_LRESOLVE
+0007ce 381f .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:
+0007cf 0005 .dw $0005
+0007d0 6761
+0007d1 6961
+0007d2 006e .db "again",0
+0007d3 07c4 .dw VE_HEAD
+ .set VE_HEAD = VE_AGAIN
+ XT_AGAIN:
+0007d4 3800 .dw DO_COLON
+ PFA_AGAIN:
+ .endif
+0007d5 0743 .dw XT_COMPILE
+0007d6 382e .dw XT_DOBRANCH
+0007d7 0782 .dw XT_LRESOLVE
+0007d8 381f .dw XT_EXIT
+ .include "words/do.asm"
+
+ ; Compiler
+ ; start do .. [+]loop
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_DO:
+0007d9 0002 .dw $0002
+0007da 6f64 .db "do"
+0007db 07cf .dw VE_HEAD
+ .set VE_HEAD = VE_DO
+ XT_DO:
+0007dc 3800 .dw DO_COLON
+ PFA_DO:
+
+ .endif
+0007dd 0743 .dw XT_COMPILE
+0007de 3a9a .dw XT_DODO
+0007df 077f .dw XT_LMARK
+0007e0 3953 .dw XT_ZERO
+0007e1 0837 .dw XT_TO_L
+0007e2 381f .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:
+0007e3 0004 .dw $0004
+0007e4 6f6c
+0007e5 706f .db "loop"
+0007e6 07d9 .dw VE_HEAD
+ .set VE_HEAD = VE_LOOP
+ XT_LOOP:
+0007e7 3800 .dw DO_COLON
+ PFA_LOOP:
+ .endif
+0007e8 0743 .dw XT_COMPILE
+0007e9 3ac8 .dw XT_DOLOOP
+0007ea 081e .dw XT_ENDLOOP
+0007eb 381f .dw XT_EXIT
+ .include "words/plusloop.asm"
+
+ ; Compiler
+ ; compile (+loop) and resolve branches
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_PLUSLOOP:
+0007ec 0005 .dw $0005
+0007ed 6c2b
+0007ee 6f6f
+0007ef 0070 .db "+loop",0
+0007f0 07e3 .dw VE_HEAD
+ .set VE_HEAD = VE_PLUSLOOP
+ XT_PLUSLOOP:
+0007f1 3800 .dw DO_COLON
+ PFA_PLUSLOOP:
+ .endif
+0007f2 0743 .dw XT_COMPILE
+0007f3 3ab9 .dw XT_DOPLUSLOOP
+0007f4 081e .dw XT_ENDLOOP
+0007f5 381f .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:
+0007f6 0005 .dw $0005
+0007f7 656c
+0007f8 7661
+0007f9 0065 .db "leave",0
+0007fa 07ec .dw VE_HEAD
+ .set VE_HEAD = VE_LEAVE
+ XT_LEAVE:
+0007fb 3800 .dw DO_COLON
+ PFA_LEAVE:
+ .endif
+0007fc 0743
+0007fd 3ad3 .DW XT_COMPILE,XT_UNLOOP
+0007fe 078b
+0007ff 0837
+000800 381f .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:
+000801 0003 .dw $0003
+000802 643f
+000803 006f .db "?do",0
+000804 07f6 .dw VE_HEAD
+ .set VE_HEAD = VE_QDO
+ XT_QDO:
+000805 3800 .dw DO_COLON
+ PFA_QDO:
+ .endif
+000806 0743 .dw XT_COMPILE
+000807 080d .dw XT_QDOCHECK
+000808 0793 .dw XT_IF
+000809 07dc .dw XT_DO
+00080a 38c3 .dw XT_SWAP ; DO sets a 0 marker on the leave stack
+00080b 0837 .dw XT_TO_L ; then follows at the end.
+00080c 381f .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:
+00080d 3800 .dw DO_COLON
+ PFA_QDOCHECK:
+ .endif
+00080e 3ec8 .dw XT_2DUP
+00080f 3fde .dw XT_EQUAL
+000810 38b0 .dw XT_DUP
+000811 38fe .dw XT_TO_R
+000812 3835 .dw XT_DOCONDBRANCH
+000813 0815 DEST(PFA_QDOCHECK1)
+000814 3ed1 .dw XT_2DROP
+ PFA_QDOCHECK1:
+000815 38f5 .dw XT_R_FROM
+000816 39fc .dw XT_INVERT
+000817 381f .dw XT_EXIT
+ .include "words/endloop.asm"
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_ENDLOOP:
+000818 ff07 .dw $ff07
+000819 6e65
+00081a 6c64
+00081b 6f6f
+00081c 0070 .db "endloop",0
+00081d 0801 .dw VE_HEAD
+ .set VE_HEAD = VE_ENDLOOP
+ XT_ENDLOOP:
+00081e 3800 .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.
+
+00081f 0782 .DW XT_LRESOLVE
+000820 082b
+000821 38b8
+000822 3835 LOOP1: .DW XT_L_FROM,XT_QDUP,XT_DOCONDBRANCH
+000823 0827 DEST(LOOP2)
+000824 07a7 .DW XT_THEN
+000825 382e .dw XT_DOBRANCH
+000826 0820 DEST(LOOP1)
+000827 381f LOOP2: .DW XT_EXIT
+ ; leave address stack
+ .include "words/l-from.asm"
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_L_FROM:
+000828 ff02 .dw $ff02
+000829 3e6c .db "l>"
+00082a 0818 .dw VE_HEAD
+ .set VE_HEAD = VE_L_FROM
+ XT_L_FROM:
+00082b 3800 .dw DO_COLON
+ PFA_L_FROM:
+
+ .endif
+ ;Z L> -- x L: x -- move from leave stack
+ ; LP @ @ -2 LP +! ;
+
+00082c 084a .dw XT_LP
+00082d 3878 .dw XT_FETCH
+00082e 3878 .dw XT_FETCH
+00082f 383c .dw XT_DOLITERAL
+000830 fffe .dw -2
+000831 084a .dw XT_LP
+000832 3a64 .dw XT_PLUSSTORE
+000833 381f .dw XT_EXIT
+ .include "words/to-l.asm"
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_TO_L:
+000834 ff02 .dw $ff02
+000835 6c3e .db ">l"
+000836 0828 .dw VE_HEAD
+ .set VE_HEAD = VE_TO_L
+ XT_TO_L:
+000837 3800 .dw DO_COLON
+ PFA_TO_L:
+ .endif
+ ;Z >L x -- L: -- x move to leave stack
+ ; CELL LP +! LP @ ! ; (L stack grows up)
+
+000838 3fea .dw XT_TWO
+000839 084a .dw XT_LP
+00083a 3a64 .dw XT_PLUSSTORE
+00083b 084a .dw XT_LP
+00083c 3878 .dw XT_FETCH
+00083d 3880 .dw XT_STORE
+00083e 381f .dw XT_EXIT
+ .include "words/lp0.asm"
+
+ ; Stack
+ ; start address of leave stack
+ VE_LP0:
+00083f ff03 .dw $ff03
+000840 706c
+000841 0030 .db "lp0",0
+000842 0834 .dw VE_HEAD
+ .set VE_HEAD = VE_LP0
+ XT_LP0:
+000843 386e .dw PFA_DOVALUE1
+ PFA_LP0:
+000844 0062 .dw CFG_LP0
+000845 3d9f .dw XT_EDEFERFETCH
+000846 3da9 .dw XT_EDEFERSTORE
+ .include "words/lp.asm"
+
+ ; System Variable
+ ; leave stack pointer
+ VE_LP:
+000847 ff02 .dw $ff02
+000848 706c .db "lp"
+000849 083f .dw VE_HEAD
+ .set VE_HEAD = VE_LP
+ XT_LP:
+00084a 3847 .dw PFA_DOVARIABLE
+ PFA_LP:
+00084b 01a1 .dw ram_lp
+
+ .dseg
+0001a1 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:
+00084c ff06 .dw $ff06
+00084d 7263
+00084e 6165
+00084f 6574 .db "create"
+000850 0847 .dw VE_HEAD
+ .set VE_HEAD = VE_CREATE
+ XT_CREATE:
+000851 3800 .dw DO_COLON
+ PFA_CREATE:
+ .endif
+000852 0720 .dw XT_DOCREATE
+000853 0880 .dw XT_REVEAL
+000854 0743 .dw XT_COMPILE
+000855 3851 .dw PFA_DOCONSTANT
+000856 381f .dw XT_EXIT
+ .include "words/header.asm"
+
+ ; Compiler
+ ; creates the vocabulary header without XT and data field (PF) in the wordlist wid
+ VE_HEADER:
+000857 ff06 .dw $ff06
+000858 6568
+000859 6461
+00085a 7265 .db "header"
+00085b 084c .dw VE_HEAD
+ .set VE_HEAD = VE_HEADER
+ XT_HEADER:
+00085c 3800 .dw DO_COLON
+ PFA_HEADER:
+00085d 3f11 .dw XT_DP ; the new Name Field
+00085e 38fe .dw XT_TO_R
+00085f 38fe .dw XT_TO_R ; ( R: NFA WID )
+000860 38b0 .dw XT_DUP
+000861 3927 .dw XT_GREATERZERO
+000862 3835 .dw XT_DOCONDBRANCH
+000863 086e .dw PFA_HEADER1
+000864 38b0 .dw XT_DUP
+000865 383c .dw XT_DOLITERAL
+000866 ff00 .dw $ff00 ; all flags are off (e.g. immediate)
+000867 3a1b .dw XT_OR
+000868 03c9 .dw XT_DOSCOMMA
+ ; make the link to the previous entry in this wordlist
+000869 38f5 .dw XT_R_FROM
+00086a 3b5e .dw XT_FETCHE
+00086b 074e .dw XT_COMMA
+00086c 38f5 .dw XT_R_FROM
+00086d 381f .dw XT_EXIT
+
+ PFA_HEADER1:
+ ; -16: attempt to use zero length string as a name
+00086e 383c .dw XT_DOLITERAL
+00086f fff0 .dw -16
+000870 3d85 .dw XT_THROW
+
+ .include "words/wlscope.asm"
+
+ ; Compiler
+ ; dynamically place a word in a wordlist. The word name may be changed.
+ VE_WLSCOPE:
+000871 ff07 .dw $ff07
+000872 6c77
+000873 6373
+000874 706f
+000875 0065 .db "wlscope",0
+000876 0857 .dw VE_HEAD
+ .set VE_HEAD = VE_WLSCOPE
+ XT_WLSCOPE:
+000877 3dfe .dw PFA_DODEFER1
+ PFA_WLSCOPE:
+000878 005e .dw CFG_WLSCOPE
+000879 3d9f .dw XT_EDEFERFETCH
+00087a 3da9 .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:
+00087b ff06 .dw $ff06
+00087c 6572
+00087d 6576
+00087e 6c61 .db "reveal"
+00087f 0871 .dw VE_HEAD
+ .set VE_HEAD = VE_REVEAL
+ XT_REVEAL:
+000880 3800 .dw DO_COLON
+ PFA_REVEAL:
+ .endif
+000881 0711
+000882 3c8f
+000883 3878 .DW XT_NEWEST,XT_CELLPLUS,XT_FETCH ; only if wordlist is in use
+000884 38b8
+000885 3835 .DW XT_QDUP,XT_DOCONDBRANCH
+000886 088b DEST(REVEAL1)
+000887 0711
+000888 3878
+000889 38c3
+00088a 3b3a .DW XT_NEWEST,XT_FETCH,XT_SWAP,XT_STOREE
+ ; .DW XT_ZERO,XT_NEWEST,XT_CELLPLUS,XT_STORE ; clean wordlist entry
+ REVEAL1:
+00088b 381f .DW XT_EXIT
+ .include "words/does.asm"
+
+ ; Compiler
+ ; organize the XT replacement to call other colon code
+ VE_DOES:
+00088c 0005 .dw $0005
+00088d 6f64
+00088e 7365
+00088f 003e .db "does>",0
+000890 087b .dw VE_HEAD
+ .set VE_HEAD = VE_DOES
+ XT_DOES:
+000891 3800 .dw DO_COLON
+ PFA_DOES:
+000892 0743 .dw XT_COMPILE
+000893 08a4 .dw XT_DODOES
+000894 0743 .dw XT_COMPILE ; create a code snippet to be used in an embedded XT
+000895 940e .dw $940e ; the address of this compiled
+000896 0743 .dw XT_COMPILE ; code will replace the XT of the
+000897 0899 .dw DO_DODOES ; word that CREATE created
+000898 381f .dw XT_EXIT ;
+
+ DO_DODOES: ; ( -- PFA )
+000899 939a
+00089a 938a savetos
+00089b 01cb movw tosl, wl
+00089c 9601 adiw tosl, 1
+ ; the following takes the address from a real uC-call
+ .if (pclen==3)
+ .endif
+00089d 917f pop wh
+00089e 916f pop wl
+
+00089f 93bf push XH
+0008a0 93af push XL
+0008a1 01db movw XL, wl
+0008a2 940c 3804 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:
+0008a4 3800 .dw DO_COLON
+ PFA_DODOES:
+0008a5 38f5 .dw XT_R_FROM
+0008a6 0711 .dw XT_NEWEST
+0008a7 3c8f .dw XT_CELLPLUS
+0008a8 3878 .dw XT_FETCH
+0008a9 3b5e .dw XT_FETCHE
+0008aa 06e8 .dw XT_NFA2CFA
+0008ab 3b72 .dw XT_STOREI
+0008ac 381f .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:
+0008ad ff01 .dw $ff01
+0008ae 003a .db ":",0
+0008af 088c .dw VE_HEAD
+ .set VE_HEAD = VE_COLON
+ XT_COLON:
+0008b0 3800 .dw DO_COLON
+ PFA_COLON:
+ .endif
+0008b1 0720 .dw XT_DOCREATE
+0008b2 08bb .dw XT_COLONNONAME
+0008b3 38d8 .dw XT_DROP
+0008b4 381f .dw XT_EXIT
+ .include "words/colon-noname.asm"
+
+ ; Compiler
+ ; create an unnamed entry in the dictionary, XT is DO_COLON
+ VE_COLONNONAME:
+0008b5 ff07 .dw $ff07
+0008b6 6e3a
+0008b7 6e6f
+0008b8 6d61
+0008b9 0065 .db ":noname",0
+0008ba 08ad .dw VE_HEAD
+ .set VE_HEAD = VE_COLONNONAME
+ XT_COLONNONAME:
+0008bb 3800 .dw DO_COLON
+ PFA_COLONNONAME:
+0008bc 3f11 .dw XT_DP
+0008bd 38b0 .dw XT_DUP
+0008be 0718 .dw XT_LATEST
+0008bf 3880 .dw XT_STORE
+
+0008c0 0743 .dw XT_COMPILE
+0008c1 3800 .dw DO_COLON
+
+0008c2 08d0 .dw XT_RBRACKET
+0008c3 381f .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:
+0008c4 0001 .dw $0001
+0008c5 003b .db $3b,0
+0008c6 08b5 .dw VE_HEAD
+ .set VE_HEAD = VE_SEMICOLON
+ XT_SEMICOLON:
+0008c7 3800 .dw DO_COLON
+ PFA_SEMICOLON:
+ .endif
+0008c8 0743 .dw XT_COMPILE
+0008c9 381f .dw XT_EXIT
+0008ca 08d8 .dw XT_LBRACKET
+0008cb 0880 .dw XT_REVEAL
+0008cc 381f .dw XT_EXIT
+ .include "words/right-bracket.asm"
+
+ ; Compiler
+ ; enter compiler mode
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_RBRACKET:
+0008cd ff01 .dw $ff01
+0008ce 005d .db "]",0
+0008cf 08c4 .dw VE_HEAD
+ .set VE_HEAD = VE_RBRACKET
+ XT_RBRACKET:
+0008d0 3800 .dw DO_COLON
+ PFA_RBRACKET:
+ .endif
+0008d1 3fe5 .dw XT_ONE
+0008d2 3eb6 .dw XT_STATE
+0008d3 3880 .dw XT_STORE
+0008d4 381f .dw XT_EXIT
+ .include "words/left-bracket.asm"
+
+ ; Compiler
+ ; enter interpreter mode
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_LBRACKET:
+0008d5 0001 .dw $0001
+0008d6 005b .db "[",0
+0008d7 08cd .dw VE_HEAD
+ .set VE_HEAD = VE_LBRACKET
+ XT_LBRACKET:
+0008d8 3800 .dw DO_COLON
+ PFA_LBRACKET:
+ .endif
+0008d9 3953 .dw XT_ZERO
+0008da 3eb6 .dw XT_STATE
+0008db 3880 .dw XT_STORE
+0008dc 381f .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:
+0008dd ff08 .dw $ff08
+0008de 6176
+0008df 6972
+0008e0 6261
+0008e1 656c .db "variable"
+0008e2 08d5 .dw VE_HEAD
+ .set VE_HEAD = VE_VARIABLE
+ XT_VARIABLE:
+0008e3 3800 .dw DO_COLON
+ PFA_VARIABLE:
+ .endif
+0008e4 3f22 .dw XT_HERE
+0008e5 08ef .dw XT_CONSTANT
+0008e6 3fea .dw XT_TWO
+0008e7 3f2b .dw XT_ALLOT
+0008e8 381f .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:
+0008e9 ff08 .dw $ff08
+0008ea 6f63
+0008eb 736e
+0008ec 6174
+0008ed 746e .db "constant"
+0008ee 08dd .dw VE_HEAD
+ .set VE_HEAD = VE_CONSTANT
+ XT_CONSTANT:
+0008ef 3800 .dw DO_COLON
+ PFA_CONSTANT:
+ .endif
+0008f0 0720 .dw XT_DOCREATE
+0008f1 0880 .dw XT_REVEAL
+0008f2 0743 .dw XT_COMPILE
+0008f3 3847 .dw PFA_DOVARIABLE
+0008f4 074e .dw XT_COMMA
+0008f5 381f .dw XT_EXIT
+ .include "words/user.asm"
+
+ ; Compiler
+ ; create a dictionary entry for a user variable at offset n
+ VE_USER:
+0008f6 ff04 .dw $ff04
+0008f7 7375
+0008f8 7265 .db "user"
+0008f9 08e9 .dw VE_HEAD
+ .set VE_HEAD = VE_USER
+ XT_USER:
+0008fa 3800 .dw DO_COLON
+ PFA_USER:
+0008fb 0720 .dw XT_DOCREATE
+0008fc 0880 .dw XT_REVEAL
+
+0008fd 0743 .dw XT_COMPILE
+0008fe 3857 .dw PFA_DOUSER
+0008ff 074e .dw XT_COMMA
+000900 381f .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:
+000901 0007 .dw $0007
+000902 6572
+000903 7563
+000904 7372
+000905 0065 .db "recurse",0
+000906 08f6 .dw VE_HEAD
+ .set VE_HEAD = VE_RECURSE
+ XT_RECURSE:
+000907 3800 .dw DO_COLON
+ PFA_RECURSE:
+ .endif
+000908 0718 .dw XT_LATEST
+000909 3878 .dw XT_FETCH
+00090a 074e .dw XT_COMMA
+00090b 381f .dw XT_EXIT
+ .include "words/immediate.asm"
+
+ ; Compiler
+ ; set immediate flag for the most recent word definition
+ VE_IMMEDIATE:
+00090c ff09 .dw $ff09
+00090d 6d69
+00090e 656d
+00090f 6964
+000910 7461
+000911 0065 .db "immediate",0
+000912 0901 .dw VE_HEAD
+ .set VE_HEAD = VE_IMMEDIATE
+ XT_IMMEDIATE:
+000913 3800 .dw DO_COLON
+ PFA_IMMEDIATE:
+000914 09b5 .dw XT_GET_CURRENT
+000915 3b5e .dw XT_FETCHE
+000916 38b0 .dw XT_DUP
+000917 3bca .dw XT_FETCHI
+000918 383c .dw XT_DOLITERAL
+000919 7fff .dw $7fff
+00091a 3a12 .dw XT_AND
+00091b 38c3 .dw XT_SWAP
+00091c 3b72 .dw XT_STOREI
+00091d 381f .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:
+00091e 0006 .dw $0006
+00091f 635b
+000920 6168
+000921 5d72 .db "[char]"
+000922 090c .dw VE_HEAD
+ .set VE_HEAD = VE_BRACKETCHAR
+ XT_BRACKETCHAR:
+000923 3800 .dw DO_COLON
+ PFA_BRACKETCHAR:
+ .endif
+000924 0743 .dw XT_COMPILE
+000925 383c .dw XT_DOLITERAL
+000926 04d8 .dw XT_CHAR
+000927 074e .dw XT_COMMA
+000928 381f .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:
+000929 0006 .dw $0006
+00092a 6261
+00092b 726f
+00092c 2274 .db "abort",'"'
+00092d 091e .dw VE_HEAD
+ .set VE_HEAD = VE_ABORTQUOTE
+ XT_ABORTQUOTE:
+00092e 3800 .dw DO_COLON
+ PFA_ABORTQUOTE:
+ .endif
+00092f 3e89 .dw XT_SQUOTE
+000930 0743 .dw XT_COMPILE
+000931 0940 .dw XT_QABORT
+000932 381f .DW XT_EXIT
+ .include "words/abort.asm"
+
+ ; Exceptions
+ ; send an exception -1
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_ABORT:
+000933 ff05 .dw $ff05
+000934 6261
+000935 726f
+000936 0074 .db "abort",0
+000937 0929 .dw VE_HEAD
+ .set VE_HEAD = VE_ABORT
+ XT_ABORT:
+000938 3800 .dw DO_COLON
+ PFA_ABORT:
+ .endif
+000939 394a .dw XT_TRUE
+00093a 3d85 .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:
+00093b ff06 .dw $ff06
+00093c 613f
+00093d 6f62
+00093e 7472 .db "?abort"
+00093f 0933 .dw VE_HEAD
+ .set VE_HEAD = VE_QABORT
+ XT_QABORT:
+000940 3800 .dw DO_COLON
+ PFA_QABORT:
+
+ .endif
+000941 38e0
+000942 3835 .DW XT_ROT,XT_DOCONDBRANCH
+000943 0946 DEST(QABO1)
+000944 03ea
+000945 0938 .DW XT_ITYPE,XT_ABORT
+000946 3ed1
+000947 381f 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:
+000948 ff09 .dw $ff09
+000949 6567
+00094a 2d74
+00094b 7473
+00094c 6361
+00094d 006b .db "get-stack",0
+00094e 093b .dw VE_HEAD
+ .set VE_HEAD = VE_GET_STACK
+ XT_GET_STACK:
+00094f 3800 .dw DO_COLON
+ .endif
+000950 38b0 .dw XT_DUP
+000951 3c8f .dw XT_CELLPLUS
+000952 38c3 .dw XT_SWAP
+000953 3b5e .dw XT_FETCHE
+000954 38b0 .dw XT_DUP
+000955 38fe .dw XT_TO_R
+000956 3953 .dw XT_ZERO
+000957 38c3 .dw XT_SWAP ; go from bigger to smaller addresses
+000958 080d .dw XT_QDOCHECK
+000959 3835 .dw XT_DOCONDBRANCH
+00095a 0966 DEST(PFA_N_FETCH_E2)
+00095b 3a9a .dw XT_DODO
+ PFA_N_FETCH_E1:
+ ; ( ee-addr )
+00095c 3aab .dw XT_I
+00095d 3a34 .dw XT_1MINUS
+00095e 3ec3 .dw XT_CELLS ; ( -- ee-addr i*2 )
+00095f 38ce .dw XT_OVER ; ( -- ee-addr i*2 ee-addr )
+000960 399c .dw XT_PLUS ; ( -- ee-addr ee-addr+i
+000961 3b5e .dw XT_FETCHE ;( -- ee-addr item_i )
+000962 38c3 .dw XT_SWAP ;( -- item_i ee-addr )
+000963 394a .dw XT_TRUE ; shortcut for -1
+000964 3ab9 .dw XT_DOPLUSLOOP
+000965 095c DEST(PFA_N_FETCH_E1)
+ PFA_N_FETCH_E2:
+000966 3ed1 .dw XT_2DROP
+000967 38f5 .dw XT_R_FROM
+000968 381f .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:
+000969 ff09 .dw $ff09
+00096a 6573
+00096b 2d74
+00096c 7473
+00096d 6361
+00096e 006b .db "set-stack",0
+00096f 0948 .dw VE_HEAD
+ .set VE_HEAD = VE_SET_STACK
+ XT_SET_STACK:
+000970 3800 .dw DO_COLON
+ PFA_SET_STACK:
+ .endif
+000971 38ce .dw XT_OVER
+000972 3920 .dw XT_ZEROLESS
+000973 3835 .dw XT_DOCONDBRANCH
+000974 0978 DEST(PFA_SET_STACK0)
+000975 383c .dw XT_DOLITERAL
+000976 fffc .dw -4
+000977 3d85 .dw XT_THROW
+ PFA_SET_STACK0:
+000978 3ec8 .dw XT_2DUP
+000979 3b3a .dw XT_STOREE ; ( -- i_n .. i_0 n e-addr )
+00097a 38c3 .dw XT_SWAP
+00097b 3953 .dw XT_ZERO
+00097c 080d .dw XT_QDOCHECK
+00097d 3835 .dw XT_DOCONDBRANCH
+00097e 0985 DEST(PFA_SET_STACK2)
+00097f 3a9a .dw XT_DODO
+ PFA_SET_STACK1:
+000980 3c8f .dw XT_CELLPLUS ; ( -- i_x e-addr )
+000981 3ed9 .dw XT_TUCK ; ( -- e-addr i_x e-addr
+000982 3b3a .dw XT_STOREE
+000983 3ac8 .dw XT_DOLOOP
+000984 0980 DEST(PFA_SET_STACK1)
+ PFA_SET_STACK2:
+000985 38d8 .dw XT_DROP
+000986 381f .dw XT_EXIT
+
+ .include "words/map-stack.asm"
+
+ ; Tools
+ ; Iterate over a stack
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_MAPSTACK:
+000987 ff09 .dw $ff09
+000988 616d
+000989 2d70
+00098a 7473
+00098b 6361
+00098c 006b .db "map-stack",0
+00098d 0969 .dw VE_HEAD
+ .set VE_HEAD = VE_MAPSTACK
+ XT_MAPSTACK:
+00098e 3800 .dw DO_COLON
+ PFA_MAPSTACK:
+ .endif
+00098f 38b0 .dw XT_DUP
+000990 3c8f .dw XT_CELLPLUS
+000991 38c3 .dw XT_SWAP
+000992 3b5e .dw XT_FETCHE
+000993 3ec3 .dw XT_CELLS
+000994 3f98 .dw XT_BOUNDS
+000995 080d .dw XT_QDOCHECK
+000996 3835 .dw XT_DOCONDBRANCH
+000997 09aa DEST(PFA_MAPSTACK3)
+000998 3a9a .dw XT_DODO
+ PFA_MAPSTACK1:
+000999 3aab .dw XT_I
+00099a 3b5e .dw XT_FETCHE ; -- i*x XT id
+00099b 38c3 .dw XT_SWAP
+00099c 38fe .dw XT_TO_R
+00099d 3907 .dw XT_R_FETCH
+00099e 3829 .dw XT_EXECUTE ; i*x id -- j*y true | i*x false
+00099f 38b8 .dw XT_QDUP
+0009a0 3835 .dw XT_DOCONDBRANCH
+0009a1 09a6 DEST(PFA_MAPSTACK2)
+0009a2 38f5 .dw XT_R_FROM
+0009a3 38d8 .dw XT_DROP
+0009a4 3ad3 .dw XT_UNLOOP
+0009a5 381f .dw XT_EXIT
+ PFA_MAPSTACK2:
+0009a6 38f5 .dw XT_R_FROM
+0009a7 3fea .dw XT_TWO
+0009a8 3ab9 .dw XT_DOPLUSLOOP
+0009a9 0999 DEST(PFA_MAPSTACK1)
+ PFA_MAPSTACK3:
+0009aa 38d8 .dw XT_DROP
+0009ab 3953 .dw XT_ZERO
+0009ac 381f .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:
+0009ad ff0b .dw $ff0b
+0009ae 6567
+0009af 2d74
+0009b0 7563
+0009b1 7272
+0009b2 6e65
+0009b3 0074 .db "get-current",0
+0009b4 0987 .dw VE_HEAD
+ .set VE_HEAD = VE_GET_CURRENT
+ XT_GET_CURRENT:
+0009b5 3800 .dw DO_COLON
+ PFA_GET_CURRENT:
+0009b6 383c .dw XT_DOLITERAL
+0009b7 0068 .dw CFG_CURRENT
+0009b8 3b5e .dw XT_FETCHE
+0009b9 381f .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:
+0009ba ff09 .dw $ff09
+0009bb 6567
+0009bc 2d74
+0009bd 726f
+0009be 6564
+0009bf 0072 .db "get-order",0
+0009c0 09ad .dw VE_HEAD
+ .set VE_HEAD = VE_GET_ORDER
+ XT_GET_ORDER:
+0009c1 3800 .dw DO_COLON
+ PFA_GET_ORDER:
+ .endif
+0009c2 383c .dw XT_DOLITERAL
+0009c3 006c .dw CFG_ORDERLISTLEN
+0009c4 094f .dw XT_GET_STACK
+0009c5 381f .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:
+0009c6 ff09 .dw $ff09
+0009c7 6663
+0009c8 2d67
+0009c9 726f
+0009ca 6564
+0009cb 0072 .db "cfg-order",0
+0009cc 09ba .dw VE_HEAD
+ .set VE_HEAD = VE_CFG_ORDER
+ XT_CFG_ORDER:
+0009cd 3847 .dw PFA_DOVARIABLE
+ PFA_CFG_ORDER:
+ .endif
+0009ce 006c .dw CFG_ORDERLISTLEN
+ .include "words/compare.asm"
+
+ ; String
+ ; compares two strings in RAM
+ VE_COMPARE:
+0009cf ff07 .dw $ff07
+0009d0 6f63
+0009d1 706d
+0009d2 7261
+0009d3 0065 .db "compare",0
+0009d4 09c6 .dw VE_HEAD
+ .set VE_HEAD = VE_COMPARE
+ XT_COMPARE:
+0009d5 09d6 .dw PFA_COMPARE
+ PFA_COMPARE:
+0009d6 93bf push xh
+0009d7 93af push xl
+0009d8 018c movw temp0, tosl
+0009d9 9189
+0009da 9199 loadtos
+0009db 01dc movw xl, tosl
+0009dc 9189
+0009dd 9199 loadtos
+0009de 019c movw temp2, tosl
+0009df 9189
+0009e0 9199 loadtos
+0009e1 01fc movw zl, tosl
+ PFA_COMPARE_LOOP:
+0009e2 90ed ld temp4, X+
+0009e3 90f1 ld temp5, Z+
+0009e4 14ef cp temp4, temp5
+0009e5 f451 brne PFA_COMPARE_NOTEQUAL
+0009e6 950a dec temp0
+0009e7 f019 breq PFA_COMPARE_ENDREACHED2
+0009e8 952a dec temp2
+0009e9 f7c1 brne PFA_COMPARE_LOOP
+0009ea c001 rjmp PFA_COMPARE_ENDREACHED
+ PFA_COMPARE_ENDREACHED2:
+0009eb 952a dec temp2
+ PFA_COMPARE_ENDREACHED:
+0009ec 2b02 or temp0, temp2
+0009ed f411 brne PFA_COMPARE_CHECKLASTCHAR
+0009ee 2788 clr tosl
+0009ef c002 rjmp PFA_COMPARE_DONE
+ PFA_COMPARE_CHECKLASTCHAR:
+ PFA_COMPARE_NOTEQUAL:
+0009f0 ef8f ser tosl
+0009f1 c000 rjmp PFA_COMPARE_DONE
+
+ PFA_COMPARE_DONE:
+0009f2 2f98 mov tosh, tosl
+0009f3 91af pop xl
+0009f4 91bf pop xh
+0009f5 940c 3804 jmp_ DO_NEXT
+ .include "words/nfa2lfa.asm"
+
+ ; System
+ ; get the link field address from the name field address
+ VE_NFA2LFA:
+0009f7 ff07 .dw $ff07
+0009f8 666e
+0009f9 3e61
+0009fa 666c
+0009fb 0061 .db "nfa>lfa",0
+0009fc 09cf .dw VE_HEAD
+ .set VE_HEAD = VE_NFA2LFA
+ XT_NFA2LFA:
+0009fd 3800 .dw DO_COLON
+ PFA_NFA2LFA:
+0009fe 06dc .dw XT_NAME2STRING
+0009ff 3a2e .dw XT_1PLUS
+000a00 3a03 .dw XT_2SLASH
+000a01 399c .dw XT_PLUS
+000a02 381f .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 "dict/compiler2.inc" ; additional words for the compiler
+
+ ; 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:
+000a03 ff0b .dw $ff0b
+000a04 6573
+000a05 2d74
+000a06 7563
+000a07 7272
+000a08 6e65
+000a09 0074 .db "set-current",0
+000a0a 09f7 .dw VE_HEAD
+ .set VE_HEAD = VE_SET_CURRENT
+ XT_SET_CURRENT:
+000a0b 3800 .dw DO_COLON
+ PFA_SET_CURRENT:
+000a0c 383c .dw XT_DOLITERAL
+000a0d 0068 .dw CFG_CURRENT
+000a0e 3b3a .dw XT_STOREE
+000a0f 381f .dw XT_EXIT
+ .include "words/wordlist.asm"
+
+ ; Search Order
+ ; create a new, empty wordlist
+ VE_WORDLIST:
+000a10 ff08 .dw $ff08
+000a11 6f77
+000a12 6472
+000a13 696c
+000a14 7473 .db "wordlist"
+000a15 0a03 .dw VE_HEAD
+ .set VE_HEAD = VE_WORDLIST
+ XT_WORDLIST:
+000a16 3800 .dw DO_COLON
+ PFA_WORDLIST:
+000a17 3f1a .dw XT_EHERE
+000a18 3953 .dw XT_ZERO
+000a19 38ce .dw XT_OVER
+000a1a 3b3a .dw XT_STOREE
+000a1b 38b0 .dw XT_DUP
+000a1c 3c8f .dw XT_CELLPLUS
+000a1d 0195 .dw XT_DOTO
+000a1e 3f1b .dw PFA_EHERE
+000a1f 381f .dw XT_EXIT
+
+ .include "words/forth-wordlist.asm"
+
+ ; Search Order
+ ; get the system default word list
+ VE_FORTHWORDLIST:
+000a20 ff0e .dw $ff0e
+000a21 6f66
+000a22 7472
+000a23 2d68
+000a24 6f77
+000a25 6472
+000a26 696c
+000a27 7473 .db "forth-wordlist"
+000a28 0a10 .dw VE_HEAD
+ .set VE_HEAD = VE_FORTHWORDLIST
+ XT_FORTHWORDLIST:
+000a29 3847 .dw PFA_DOVARIABLE
+ PFA_FORTHWORDLIST:
+000a2a 006a .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:
+000a2b ff09 .dw $ff09
+000a2c 6573
+000a2d 2d74
+000a2e 726f
+000a2f 6564
+000a30 0072 .db "set-order",0
+000a31 0a20 .dw VE_HEAD
+ .set VE_HEAD = VE_SET_ORDER
+ XT_SET_ORDER:
+000a32 3800 .dw DO_COLON
+ PFA_SET_ORDER:
+ .endif
+000a33 383c .dw XT_DOLITERAL
+000a34 006c .dw CFG_ORDERLISTLEN
+000a35 0970 .dw XT_SET_STACK
+000a36 381f .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:
+000a37 ff0f .dw $ff0f
+000a38 6573
+000a39 2d74
+000a3a 6572
+000a3b 6f63
+000a3c 6e67
+000a3d 7a69
+000a3e 7265
+000a3f 0073 .db "set-recognizers",0
+000a40 0a2b .dw VE_HEAD
+ .set VE_HEAD = VE_SET_RECOGNIZERS
+ XT_SET_RECOGNIZERS:
+000a41 3800 .dw DO_COLON
+ PFA_SET_RECOGNIZERS:
+ .endif
+000a42 383c .dw XT_DOLITERAL
+000a43 007e .dw CFG_RECOGNIZERLISTLEN
+000a44 0970 .dw XT_SET_STACK
+000a45 381f .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:
+000a46 ff0f .dw $ff0f
+000a47 6567
+000a48 2d74
+000a49 6572
+000a4a 6f63
+000a4b 6e67
+000a4c 7a69
+000a4d 7265
+000a4e 0073 .db "get-recognizers",0
+000a4f 0a37 .dw VE_HEAD
+ .set VE_HEAD = VE_GET_RECOGNIZERS
+ XT_GET_RECOGNIZERS:
+000a50 3800 .dw DO_COLON
+ PFA_GET_RECOGNIZERS:
+ .endif
+000a51 383c .dw XT_DOLITERAL
+000a52 007e .dw CFG_RECOGNIZERLISTLEN
+000a53 094f .dw XT_GET_STACK
+000a54 381f .dw XT_EXIT
+ .include "words/code.asm"
+
+ ; Compiler
+ ; create named entry in the dictionary, XT is the data field
+ VE_CODE:
+000a55 ff04 .dw $ff04
+000a56 6f63
+000a57 6564 .db "code"
+000a58 0a46 .dw VE_HEAD
+ .set VE_HEAD = VE_CODE
+ XT_CODE:
+000a59 3800 .dw DO_COLON
+ PFA_CODE:
+000a5a 0720 .dw XT_DOCREATE
+000a5b 0880 .dw XT_REVEAL
+000a5c 3f11 .dw XT_DP
+000a5d 01a7 .dw XT_ICELLPLUS
+000a5e 074e .dw XT_COMMA
+000a5f 381f .dw XT_EXIT
+ .include "words/end-code.asm"
+
+ ; Compiler
+ ; finish a code definition
+ VE_ENDCODE:
+000a60 ff08 .dw $ff08
+000a61 6e65
+000a62 2d64
+000a63 6f63
+000a64 6564 .db "end-code"
+000a65 0a55 .dw VE_HEAD
+ .set VE_HEAD = VE_ENDCODE
+ XT_ENDCODE:
+000a66 3800 .dw DO_COLON
+ PFA_ENDCODE:
+000a67 0743 .dw XT_COMPILE
+000a68 940c .dw $940c
+000a69 0743 .dw XT_COMPILE
+000a6a 3804 .dw DO_NEXT
+000a6b 381f .dw XT_EXIT
+ .include "words/marker.asm"
+
+ ; System Value
+ ; The eeprom address until which MARKER saves and restores the eeprom data.
+ VE_MARKER:
+000a6c ff08 .dw $ff08
+000a6d 6d28
+000a6e 7261
+000a6f 656b
+000a70 2972 .db "(marker)"
+000a71 0a60 .dw VE_HEAD
+ .set VE_HEAD = VE_MARKER
+ XT_MARKER:
+000a72 386e .dw PFA_DOVALUE1
+ PFA_MARKER:
+000a73 008a .dw EE_MARKER
+000a74 3d9f .dw XT_EDEFERFETCH
+000a75 3da9 .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:
+000a76 0008 .dw $0008
+000a77 6f70
+000a78 7473
+000a79 6f70
+000a7a 656e .db "postpone"
+000a7b 0a6c .dw VE_HEAD
+ .set VE_HEAD = VE_POSTPONE
+ XT_POSTPONE:
+000a7c 3800 .dw DO_COLON
+ PFA_POSTPONE:
+ .endif
+000a7d 05a2 .dw XT_PARSENAME
+000a7e 05e5 .dw XT_FORTHRECOGNIZER
+000a7f 05f0 .dw XT_RECOGNIZE
+000a80 38b0 .dw XT_DUP
+000a81 38fe .dw XT_TO_R
+000a82 01a7 .dw XT_ICELLPLUS
+000a83 01a7 .dw XT_ICELLPLUS
+000a84 3bca .dw XT_FETCHI
+000a85 3829 .dw XT_EXECUTE
+000a86 38f5 .dw XT_R_FROM
+000a87 01a7 .dw XT_ICELLPLUS
+000a88 3bca .dw XT_FETCHI
+000a89 074e .dw XT_COMMA
+000a8a 381f .dw XT_EXIT
+ .endif
+
+ .include "words/applturnkey.asm"
+
+ ; R( -- )
+ ; application specific turnkey action
+ VE_APPLTURNKEY:
+000a8b ff0b .dw $ff0b
+000a8c 7061
+000a8d 6c70
+000a8e 7574
+000a8f 6e72
+000a90 656b
+000a91 0079 .db "applturnkey",0
+000a92 0a76 .dw VE_HEAD
+ .set VE_HEAD = VE_APPLTURNKEY
+ XT_APPLTURNKEY:
+000a93 3800 .dw DO_COLON
+ PFA_APPLTURNKEY:
+000a94 00e9 .dw XT_USART
+
+ .if WANT_INTERRUPTS == 1
+000a95 3c96 .dw XT_INTON
+ .endif
+
+000a96 0160 .dw XT_DOT_VER
+000a97 3fad .dw XT_SPACE
+000a98 03b7 .dw XT_DOSLITERAL
+000a99 000a .dw 10
+000a9a 6f46
+000a9b 7472
+000a9c 6468
+000a9d 6975
+000a9e 6f6e .db "Forthduino"
+000a9f 03ea .dw XT_ITYPE
+
+000aa0 381f .dw XT_EXIT
+
+
+ .set DPSTART = pc
+ .if(pc>AMFORTH_RO_SEG)
+ .endif
+
+ .org AMFORTH_RO_SEG
+ .include "amforth-interpreter.asm"
+
+
+ DO_COLON:
+003800 93bf push XH
+003801 93af push XL ; PUSH IP
+003802 01db movw XL, wl
+003803 9611 adiw xl, 1
+ DO_NEXT:
+ .if WANT_INTERRUPTS == 1
+003804 14b2 cp isrflag, zerol
+003805 f469 brne DO_INTERRUPT
+ .endif
+003806 01fd movw zl, XL ; READ IP
+003807 0fee
+003808 1fff
+003809 9165
+00380a 9175 readflashcell wl, wh
+00380b 9611 adiw XL, 1 ; INC IP
+
+ DO_EXECUTE:
+00380c 01fb movw zl, wl
+00380d 0fee
+00380e 1fff
+00380f 9105
+003810 9115 readflashcell temp0,temp1
+003811 01f8 movw zl, temp0
+003812 9409 ijmp
+
+ .if WANT_INTERRUPTS == 1
+ DO_INTERRUPT:
+ ; here we deal with interrupts the forth way
+003813 939a
+003814 938a savetos
+003815 2d8b mov tosl, isrflag
+003816 2799 clr tosh
+003817 24bb clr isrflag
+003818 eb6f ldi wl, LOW(XT_ISREXEC)
+003819 e37c ldi wh, HIGH(XT_ISREXEC)
+00381a 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:
+00381b ff04 .dw $ff04
+00381c 7865
+00381d 7469 .db "exit"
+00381e 0a8b .dw VE_HEAD
+ .set VE_HEAD = VE_EXIT
+ XT_EXIT:
+00381f 3820 .dw PFA_EXIT
+ PFA_EXIT:
+003820 91af pop XL
+003821 91bf pop XH
+003822 cfe1 jmp_ DO_NEXT
+ .include "words/execute.asm"
+
+ ; System
+ ; execute XT
+ VE_EXECUTE:
+003823 ff07 .dw $ff07
+003824 7865
+003825 6365
+003826 7475
+003827 0065 .db "execute",0
+003828 381b .dw VE_HEAD
+ .set VE_HEAD = VE_EXECUTE
+ XT_EXECUTE:
+003829 382a .dw PFA_EXECUTE
+ PFA_EXECUTE:
+00382a 01bc movw wl, tosl
+00382b 9189
+00382c 9199 loadtos
+00382d 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:
+00382e 382f .dw PFA_DOBRANCH
+ PFA_DOBRANCH:
+00382f 01fd movw zl, XL
+003830 0fee
+003831 1fff
+003832 91a5
+003833 91b5 readflashcell XL,XH
+003834 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:
+003835 3836 .dw PFA_DOCONDBRANCH
+ PFA_DOCONDBRANCH:
+003836 2b98 or tosh, tosl
+003837 9189
+003838 9199 loadtos
+003839 f3a9 brbs 1, PFA_DOBRANCH ; 1 is z flag; if tos is zero (false), do the branch
+00383a 9611 adiw XL, 1
+00383b 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:
+00383c 383d .dw PFA_DOLITERAL
+ PFA_DOLITERAL:
+00383d 939a
+00383e 938a savetos
+00383f 01fd movw zl, xl
+003840 0fee
+003841 1fff
+003842 9185
+003843 9195 readflashcell tosl,tosh
+003844 9611 adiw xl, 1
+003845 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:
+003846 3847 .dw PFA_DOVARIABLE
+ PFA_DOVARIABLE:
+003847 939a
+003848 938a savetos
+003849 01fb movw zl, wl
+00384a 9631 adiw zl,1
+00384b 0fee
+00384c 1fff
+00384d 9185
+00384e 9195 readflashcell tosl,tosh
+00384f 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:
+003850 3851 .dw PFA_DOCONSTANT
+ PFA_DOCONSTANT:
+003851 939a
+003852 938a savetos
+003853 01cb movw tosl, wl
+003854 9601 adiw tosl, 1
+003855 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:
+003856 3857 .dw PFA_DOUSER
+ PFA_DOUSER:
+003857 939a
+003858 938a savetos
+003859 01fb movw zl, wl
+00385a 9631 adiw zl, 1
+00385b 0fee
+00385c 1fff
+00385d 9185
+00385e 9195 readflashcell tosl,tosh
+00385f 0d84 add tosl, upl
+003860 1d95 adc tosh, uph
+003861 cfa2 jmp_ DO_NEXT
+ .include "words/do-value.asm"
+
+ ; System
+ ; runtime of value
+ VE_DOVALUE:
+003862 ff07 .dw $ff07
+003863 7628
+003864 6c61
+003865 6575
+003866 0029 .db "(value)", 0
+003867 3823 .dw VE_HEAD
+ .set VE_HEAD = VE_DOVALUE
+ XT_DOVALUE:
+003868 3800 .dw DO_COLON
+ PFA_DOVALUE:
+003869 0720 .dw XT_DOCREATE
+00386a 0880 .dw XT_REVEAL
+00386b 0743 .dw XT_COMPILE
+00386c 386e .dw PFA_DOVALUE1
+00386d 381f .dw XT_EXIT
+ PFA_DOVALUE1:
+00386e 940e 0899 call_ DO_DODOES
+003870 38b0 .dw XT_DUP
+003871 01a7 .dw XT_ICELLPLUS
+003872 3bca .dw XT_FETCHI
+003873 3829 .dw XT_EXECUTE
+003874 381f .dw XT_EXIT
+
+ ; : (value) <builds does> dup icell+ @i execute ;
+ .include "words/fetch.asm"
+
+ ; Memory
+ ; read 1 cell from RAM address
+ VE_FETCH:
+003875 ff01 .dw $ff01
+003876 0040 .db "@",0
+003877 3862 .dw VE_HEAD
+ .set VE_HEAD = VE_FETCH
+ XT_FETCH:
+003878 3879 .dw PFA_FETCH
+ PFA_FETCH:
+ .if WANT_UNIFIED == 1
+ .endif
+ PFA_FETCHRAM:
+003879 01fc movw zl, tosl
+ ; low byte is read before the high byte
+00387a 9181 ld tosl, z+
+00387b 9191 ld tosh, z+
+00387c 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:
+00387d ff01 .dw $ff01
+00387e 0021 .db "!",0
+00387f 3875 .dw VE_HEAD
+ .set VE_HEAD = VE_STORE
+ XT_STORE:
+003880 3881 .dw PFA_STORE
+ PFA_STORE:
+ .if WANT_UNIFIED == 1
+ .endif
+ PFA_STORERAM:
+003881 01fc movw zl, tosl
+003882 9189
+003883 9199 loadtos
+ ; the high byte is written before the low byte
+003884 8391 std Z+1, tosh
+003885 8380 std Z+0, tosl
+003886 9189
+003887 9199 loadtos
+003888 cf7b jmp_ DO_NEXT
+ .if WANT_UNIFIED == 1
+ .endif
+ .include "words/cstore.asm"
+
+ ; Memory
+ ; store a single byte to RAM address
+ VE_CSTORE:
+003889 ff02 .dw $ff02
+00388a 2163 .db "c!"
+00388b 387d .dw VE_HEAD
+ .set VE_HEAD = VE_CSTORE
+ XT_CSTORE:
+00388c 388d .dw PFA_CSTORE
+ PFA_CSTORE:
+00388d 01fc movw zl, tosl
+00388e 9189
+00388f 9199 loadtos
+003890 8380 st Z, tosl
+003891 9189
+003892 9199 loadtos
+003893 cf70 jmp_ DO_NEXT
+ .include "words/cfetch.asm"
+
+ ; Memory
+ ; fetch a single byte from memory mapped locations
+ VE_CFETCH:
+003894 ff02 .dw $ff02
+003895 4063 .db "c@"
+003896 3889 .dw VE_HEAD
+ .set VE_HEAD = VE_CFETCH
+ XT_CFETCH:
+003897 3898 .dw PFA_CFETCH
+ PFA_CFETCH:
+003898 01fc movw zl, tosl
+003899 2799 clr tosh
+00389a 8180 ld tosl, Z
+00389b cf68 jmp_ DO_NEXT
+ .include "words/fetch-u.asm"
+
+ ; Memory
+ ; read 1 cell from USER area
+ VE_FETCHU:
+00389c ff02 .dw $ff02
+00389d 7540 .db "@u"
+00389e 3894 .dw VE_HEAD
+ .set VE_HEAD = VE_FETCHU
+ XT_FETCHU:
+00389f 3800 .dw DO_COLON
+ PFA_FETCHU:
+0038a0 3b01 .dw XT_UP_FETCH
+0038a1 399c .dw XT_PLUS
+0038a2 3878 .dw XT_FETCH
+0038a3 381f .dw XT_EXIT
+ .include "words/store-u.asm"
+
+ ; Memory
+ ; write n to USER area at offset
+ VE_STOREU:
+0038a4 ff02 .dw $ff02
+0038a5 7521 .db "!u"
+0038a6 389c .dw VE_HEAD
+ .set VE_HEAD = VE_STOREU
+ XT_STOREU:
+0038a7 3800 .dw DO_COLON
+ PFA_STOREU:
+0038a8 3b01 .dw XT_UP_FETCH
+0038a9 399c .dw XT_PLUS
+0038aa 3880 .dw XT_STORE
+0038ab 381f .dw XT_EXIT
+
+ ;;;;;;;;;;;;;;;;;;;;;;;;;
+ .include "words/dup.asm"
+
+ ; Stack
+ ; duplicate TOS
+ VE_DUP:
+0038ac ff03 .dw $ff03
+0038ad 7564
+0038ae 0070 .db "dup",0
+0038af 38a4 .dw VE_HEAD
+ .set VE_HEAD = VE_DUP
+ XT_DUP:
+0038b0 38b1 .dw PFA_DUP
+ PFA_DUP:
+0038b1 939a
+0038b2 938a savetos
+0038b3 cf50 jmp_ DO_NEXT
+ .include "words/qdup.asm"
+
+ ; Stack
+ ; duplicate TOS if non-zero
+ VE_QDUP:
+0038b4 ff04 .dw $ff04
+0038b5 643f
+0038b6 7075 .db "?dup"
+0038b7 38ac .dw VE_HEAD
+ .set VE_HEAD = VE_QDUP
+ XT_QDUP:
+0038b8 38b9 .dw PFA_QDUP
+ PFA_QDUP:
+0038b9 2f08 mov temp0, tosl
+0038ba 2b09 or temp0, tosh
+0038bb f011 breq PFA_QDUP1
+0038bc 939a
+0038bd 938a savetos
+ PFA_QDUP1:
+0038be cf45 jmp_ DO_NEXT
+ .include "words/swap.asm"
+
+ ; Stack
+ ; swaps the two top level stack cells
+ VE_SWAP:
+0038bf ff04 .dw $ff04
+0038c0 7773
+0038c1 7061 .db "swap"
+0038c2 38b4 .dw VE_HEAD
+ .set VE_HEAD = VE_SWAP
+ XT_SWAP:
+0038c3 38c4 .dw PFA_SWAP
+ PFA_SWAP:
+0038c4 018c movw temp0, tosl
+0038c5 9189
+0038c6 9199 loadtos
+0038c7 931a st -Y, temp1
+0038c8 930a st -Y, temp0
+0038c9 cf3a jmp_ DO_NEXT
+ .include "words/over.asm"
+
+ ; Stack
+ ; Place a copy of x1 on top of the stack
+ VE_OVER:
+0038ca ff04 .dw $ff04
+0038cb 766f
+0038cc 7265 .db "over"
+0038cd 38bf .dw VE_HEAD
+ .set VE_HEAD = VE_OVER
+ XT_OVER:
+0038ce 38cf .dw PFA_OVER
+ PFA_OVER:
+0038cf 939a
+0038d0 938a savetos
+0038d1 818a ldd tosl, Y+2
+0038d2 819b ldd tosh, Y+3
+
+0038d3 cf30 jmp_ DO_NEXT
+ .include "words/drop.asm"
+
+ ; Stack
+ ; drop TOS
+ VE_DROP:
+0038d4 ff04 .dw $ff04
+0038d5 7264
+0038d6 706f .db "drop"
+0038d7 38ca .dw VE_HEAD
+ .set VE_HEAD = VE_DROP
+ XT_DROP:
+0038d8 38d9 .dw PFA_DROP
+ PFA_DROP:
+0038d9 9189
+0038da 9199 loadtos
+0038db cf28 jmp_ DO_NEXT
+ .include "words/rot.asm"
+
+ ; Stack
+ ; rotate the three top level cells
+ VE_ROT:
+0038dc ff03 .dw $ff03
+0038dd 6f72
+0038de 0074 .db "rot",0
+0038df 38d4 .dw VE_HEAD
+ .set VE_HEAD = VE_ROT
+ XT_ROT:
+0038e0 38e1 .dw PFA_ROT
+ PFA_ROT:
+0038e1 018c movw temp0, tosl
+0038e2 9129 ld temp2, Y+
+0038e3 9139 ld temp3, Y+
+0038e4 9189
+0038e5 9199 loadtos
+
+0038e6 933a st -Y, temp3
+0038e7 932a st -Y, temp2
+0038e8 931a st -Y, temp1
+0038e9 930a st -Y, temp0
+
+0038ea cf19 jmp_ DO_NEXT
+ .include "words/nip.asm"
+
+ ; Stack
+ ; Remove Second of Stack
+ VE_NIP:
+0038eb ff03 .dw $ff03
+0038ec 696e
+0038ed 0070 .db "nip",0
+0038ee 38dc .dw VE_HEAD
+ .set VE_HEAD = VE_NIP
+ XT_NIP:
+0038ef 38f0 .dw PFA_NIP
+ PFA_NIP:
+0038f0 9622 adiw yl, 2
+0038f1 cf12 jmp_ DO_NEXT
+ ;;;;;;;;;;;;;;;;;;;;;;;;;
+ .include "words/r_from.asm"
+
+ ; Stack
+ ; move TOR to TOS
+ VE_R_FROM:
+0038f2 ff02 .dw $ff02
+0038f3 3e72 .db "r>"
+0038f4 38eb .dw VE_HEAD
+ .set VE_HEAD = VE_R_FROM
+ XT_R_FROM:
+0038f5 38f6 .dw PFA_R_FROM
+ PFA_R_FROM:
+0038f6 939a
+0038f7 938a savetos
+0038f8 918f pop tosl
+0038f9 919f pop tosh
+0038fa cf09 jmp_ DO_NEXT
+ .include "words/to_r.asm"
+
+ ; Stack
+ ; move TOS to TOR
+ VE_TO_R:
+0038fb ff02 .dw $ff02
+0038fc 723e .db ">r"
+0038fd 38f2 .dw VE_HEAD
+ .set VE_HEAD = VE_TO_R
+ XT_TO_R:
+0038fe 38ff .dw PFA_TO_R
+ PFA_TO_R:
+0038ff 939f push tosh
+003900 938f push tosl
+003901 9189
+003902 9199 loadtos
+003903 cf00 jmp_ DO_NEXT
+ .include "words/r_fetch.asm"
+
+ ; Stack
+ ; fetch content of TOR
+ VE_R_FETCH:
+003904 ff02 .dw $ff02
+003905 4072 .db "r@"
+003906 38fb .dw VE_HEAD
+ .set VE_HEAD = VE_R_FETCH
+ XT_R_FETCH:
+003907 3908 .dw PFA_R_FETCH
+ PFA_R_FETCH:
+003908 939a
+003909 938a savetos
+00390a 918f pop tosl
+00390b 919f pop tosh
+00390c 939f push tosh
+00390d 938f push tosl
+00390e 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:
+00390f ff02 .dw $ff02
+003910 3e3c .db "<>"
+003911 3904 .dw VE_HEAD
+ .set VE_HEAD = VE_NOTEQUAL
+ XT_NOTEQUAL:
+003912 3800 .dw DO_COLON
+ PFA_NOTEQUAL:
+ .endif
+
+003913 3fde
+003914 3919
+003915 381f .DW XT_EQUAL,XT_ZEROEQUAL,XT_EXIT
+ .include "words/equalzero.asm"
+
+ ; Compare
+ ; compare with 0 (zero)
+ VE_ZEROEQUAL:
+003916 ff02 .dw $ff02
+003917 3d30 .db "0="
+003918 390f .dw VE_HEAD
+ .set VE_HEAD = VE_ZEROEQUAL
+ XT_ZEROEQUAL:
+003919 391a .dw PFA_ZEROEQUAL
+ PFA_ZEROEQUAL:
+00391a 2b98 or tosh, tosl
+00391b f5d1 brne PFA_ZERO1
+00391c c030 rjmp PFA_TRUE1
+ .include "words/lesszero.asm"
+
+ ; Compare
+ ; compare with zero
+ VE_ZEROLESS:
+00391d ff02 .dw $ff02
+00391e 3c30 .db "0<"
+00391f 3916 .dw VE_HEAD
+ .set VE_HEAD = VE_ZEROLESS
+ XT_ZEROLESS:
+003920 3921 .dw PFA_ZEROLESS
+ PFA_ZEROLESS:
+003921 fd97 sbrc tosh,7
+003922 c02a rjmp PFA_TRUE1
+003923 c032 rjmp PFA_ZERO1
+ .include "words/greaterzero.asm"
+
+ ; Compare
+ ; true if n1 is greater than 0
+ VE_GREATERZERO:
+003924 ff02 .dw $ff02
+003925 3e30 .db "0>"
+003926 391d .dw VE_HEAD
+ .set VE_HEAD = VE_GREATERZERO
+ XT_GREATERZERO:
+003927 3928 .dw PFA_GREATERZERO
+ PFA_GREATERZERO:
+003928 1582 cp tosl, zerol
+003929 0593 cpc tosh, zeroh
+00392a f15c brlt PFA_ZERO1
+00392b f151 brbs 1, PFA_ZERO1
+00392c c020 rjmp PFA_TRUE1
+ .include "words/d-greaterzero.asm"
+
+ ; Compare
+ ; compares if a double double cell number is greater 0
+ VE_DGREATERZERO:
+00392d ff03 .dw $ff03
+00392e 3064
+00392f 003e .db "d0>",0
+003930 3924 .dw VE_HEAD
+ .set VE_HEAD = VE_DGREATERZERO
+ XT_DGREATERZERO:
+003931 3932 .dw PFA_DGREATERZERO
+ PFA_DGREATERZERO:
+003932 1582 cp tosl, zerol
+003933 0593 cpc tosh, zeroh
+003934 9189
+003935 9199 loadtos
+003936 0582 cpc tosl, zerol
+003937 0593 cpc tosh, zeroh
+003938 f0ec brlt PFA_ZERO1
+003939 f0e1 brbs 1, PFA_ZERO1
+00393a c012 rjmp PFA_TRUE1
+ .include "words/d-lesszero.asm"
+
+ ; Compare
+ ; compares if a double double cell number is less than 0
+ VE_DXT_ZEROLESS:
+00393b ff03 .dw $ff03
+00393c 3064
+00393d 003c .db "d0<",0
+00393e 392d .dw VE_HEAD
+ .set VE_HEAD = VE_DXT_ZEROLESS
+ XT_DXT_ZEROLESS:
+00393f 3940 .dw PFA_DXT_ZEROLESS
+ PFA_DXT_ZEROLESS:
+003940 9622 adiw Y,2
+003941 fd97 sbrc tosh,7
+003942 940c 394d jmp PFA_TRUE1
+003944 940c 3956 jmp PFA_ZERO1
+
+ .include "words/true.asm"
+
+ ; Arithmetics
+ ; leaves the value -1 (true) on TOS
+ VE_TRUE:
+003946 ff04 .dw $ff04
+003947 7274
+003948 6575 .db "true"
+003949 393b .dw VE_HEAD
+ .set VE_HEAD = VE_TRUE
+ XT_TRUE:
+00394a 394b .dw PFA_TRUE
+ PFA_TRUE:
+00394b 939a
+00394c 938a savetos
+ PFA_TRUE1:
+00394d ef8f ser tosl
+00394e ef9f ser tosh
+00394f ceb4 jmp_ DO_NEXT
+ .include "words/zero.asm"
+
+ ; Arithmetics
+ ; place a value 0 on TOS
+ VE_ZERO:
+003950 ff01 .dw $ff01
+003951 0030 .db "0",0
+003952 3946 .dw VE_HEAD
+ .set VE_HEAD = VE_ZERO
+ XT_ZERO:
+003953 3954 .dw PFA_ZERO
+ PFA_ZERO:
+003954 939a
+003955 938a savetos
+ PFA_ZERO1:
+003956 01c1 movw tosl, zerol
+003957 ceac jmp_ DO_NEXT
+ .include "words/uless.asm"
+
+ ; Compare
+ ; true if u1 < u2 (unsigned)
+ VE_ULESS:
+003958 ff02 .dw $ff02
+003959 3c75 .db "u<"
+00395a 3950 .dw VE_HEAD
+ .set VE_HEAD = VE_ULESS
+ XT_ULESS:
+00395b 395c .dw PFA_ULESS
+ PFA_ULESS:
+00395c 9129 ld temp2, Y+
+00395d 9139 ld temp3, Y+
+00395e 1782 cp tosl, temp2
+00395f 0793 cpc tosh, temp3
+003960 f3a8 brlo PFA_ZERO1
+003961 f3a1 brbs 1, PFA_ZERO1
+003962 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:
+003963 ff02 .dw $ff02
+003964 3e75 .db "u>"
+003965 3958 .dw VE_HEAD
+ .set VE_HEAD = VE_UGREATER
+ XT_UGREATER:
+003966 3800 .dw DO_COLON
+ PFA_UGREATER:
+ .endif
+003967 38c3 .DW XT_SWAP
+003968 395b .dw XT_ULESS
+003969 381f .dw XT_EXIT
+ .include "words/less.asm"
+
+ ; Compare
+ ; true if n1 is less than n2
+ VE_LESS:
+00396a ff01 .dw $ff01
+00396b 003c .db "<",0
+00396c 3963 .dw VE_HEAD
+ .set VE_HEAD = VE_LESS
+ XT_LESS:
+00396d 396e .dw PFA_LESS
+ PFA_LESS:
+00396e 9129 ld temp2, Y+
+00396f 9139 ld temp3, Y+
+003970 1728 cp temp2, tosl
+003971 0739 cpc temp3, tosh
+ PFA_LESSDONE:
+003972 f71c brge PFA_ZERO1
+003973 cfd9 rjmp PFA_TRUE1
+ .include "words/greater.asm"
+
+ ; Compare
+ ; flag is true if n1 is greater than n2
+ VE_GREATER:
+003974 ff01 .dw $ff01
+003975 003e .db ">",0
+003976 396a .dw VE_HEAD
+ .set VE_HEAD = VE_GREATER
+ XT_GREATER:
+003977 3978 .dw PFA_GREATER
+ PFA_GREATER:
+003978 9129 ld temp2, Y+
+003979 9139 ld temp3, Y+
+00397a 1728 cp temp2, tosl
+00397b 0739 cpc temp3, tosh
+ PFA_GREATERDONE:
+00397c f2cc brlt PFA_ZERO1
+00397d f2c1 brbs 1, PFA_ZERO1
+00397e cfce rjmp PFA_TRUE1
+
+ .include "words/log2.asm"
+
+ ; Arithmetics
+ ; logarithm to base 2 or highest set bitnumber
+ VE_LOG2:
+00397f ff04 .dw $ff04
+003980 6f6c
+003981 3267 .db "log2"
+003982 3974 .dw VE_HEAD
+ .set VE_HEAD = VE_LOG2
+ XT_LOG2:
+003983 3984 .dw PFA_LOG2
+ PFA_LOG2:
+003984 01fc movw zl, tosl
+003985 2799 clr tosh
+003986 e180 ldi tosl, 16
+ PFA_LOG2_1:
+003987 958a dec tosl
+003988 f022 brmi PFA_LOG2_2 ; wrong data
+003989 0fee lsl zl
+00398a 1fff rol zh
+00398b f7d8 brcc PFA_LOG2_1
+00398c ce77 jmp_ DO_NEXT
+
+ PFA_LOG2_2:
+00398d 959a dec tosh
+00398e ce75 jmp_ DO_NEXT
+ .include "words/minus.asm"
+
+ ; Arithmetics
+ ; subtract n2 from n1
+ VE_MINUS:
+00398f ff01 .dw $ff01
+003990 002d .db "-",0
+003991 397f .dw VE_HEAD
+ .set VE_HEAD = VE_MINUS
+ XT_MINUS:
+003992 3993 .dw PFA_MINUS
+ PFA_MINUS:
+003993 9109 ld temp0, Y+
+003994 9119 ld temp1, Y+
+003995 1b08 sub temp0, tosl
+003996 0b19 sbc temp1, tosh
+003997 01c8 movw tosl, temp0
+003998 ce6b jmp_ DO_NEXT
+ .include "words/plus.asm"
+
+ ; Arithmetics
+ ; add n1 and n2
+ VE_PLUS:
+003999 ff01 .dw $ff01
+00399a 002b .db "+",0
+00399b 398f .dw VE_HEAD
+ .set VE_HEAD = VE_PLUS
+ XT_PLUS:
+00399c 399d .dw PFA_PLUS
+ PFA_PLUS:
+00399d 9109 ld temp0, Y+
+00399e 9119 ld temp1, Y+
+00399f 0f80 add tosl, temp0
+0039a0 1f91 adc tosh, temp1
+0039a1 ce62 jmp_ DO_NEXT
+ .include "words/mstar.asm"
+
+ ; Arithmetics
+ ; multiply 2 cells to a double cell
+ VE_MSTAR:
+0039a2 ff02 .dw $ff02
+0039a3 2a6d .db "m*"
+0039a4 3999 .dw VE_HEAD
+ .set VE_HEAD = VE_MSTAR
+ XT_MSTAR:
+0039a5 39a6 .dw PFA_MSTAR
+ PFA_MSTAR:
+0039a6 018c movw temp0, tosl
+0039a7 9189
+0039a8 9199 loadtos
+0039a9 019c movw temp2, tosl
+ ; high cell ah*bh
+0039aa 0231 muls temp3, temp1
+0039ab 0170 movw temp4, r0
+ ; low cell al*bl
+0039ac 9f20 mul temp2, temp0
+0039ad 01c0 movw tosl, r0
+ ; signed ah*bl
+0039ae 0330 mulsu temp3, temp0
+0039af 08f3 sbc temp5, zeroh
+0039b0 0d90 add tosh, r0
+0039b1 1ce1 adc temp4, r1
+0039b2 1cf3 adc temp5, zeroh
+
+ ; signed al*bh
+0039b3 0312 mulsu temp1, temp2
+0039b4 08f3 sbc temp5, zeroh
+0039b5 0d90 add tosh, r0
+0039b6 1ce1 adc temp4, r1
+0039b7 1cf3 adc temp5, zeroh
+
+0039b8 939a
+0039b9 938a savetos
+0039ba 01c7 movw tosl, temp4
+0039bb ce48 jmp_ DO_NEXT
+ .include "words/umslashmod.asm"
+
+ ; Arithmetics
+ ; unsigned division ud / u2 with remainder
+ VE_UMSLASHMOD:
+0039bc ff06 .dw $ff06
+0039bd 6d75
+0039be 6d2f
+0039bf 646f .db "um/mod"
+0039c0 39a2 .dw VE_HEAD
+ .set VE_HEAD = VE_UMSLASHMOD
+ XT_UMSLASHMOD:
+0039c1 39c2 .dw PFA_UMSLASHMOD
+ PFA_UMSLASHMOD:
+0039c2 017c movw temp4, tosl
+
+0039c3 9129 ld temp2, Y+
+0039c4 9139 ld temp3, Y+
+
+0039c5 9109 ld temp0, Y+
+0039c6 9119 ld temp1, Y+
+
+ ;; unsigned 32/16 -> 16r16 divide
+
+ PFA_UMSLASHMODmod:
+
+ ; set loop counter
+0039c7 e140 ldi temp6,$10
+
+ PFA_UMSLASHMODmod_loop:
+ ; shift left, saving high bit
+0039c8 2755 clr temp7
+0039c9 0f00 lsl temp0
+0039ca 1f11 rol temp1
+0039cb 1f22 rol temp2
+0039cc 1f33 rol temp3
+0039cd 1f55 rol temp7
+
+ ; try subtracting divisor
+0039ce 152e cp temp2, temp4
+0039cf 053f cpc temp3, temp5
+0039d0 0552 cpc temp7,zerol
+
+0039d1 f018 brcs PFA_UMSLASHMODmod_loop_control
+
+ PFA_UMSLASHMODmod_subtract:
+ ; dividend is large enough
+ ; do the subtraction for real
+ ; and set lowest bit
+0039d2 9503 inc temp0
+0039d3 192e sub temp2, temp4
+0039d4 093f sbc temp3, temp5
+
+ PFA_UMSLASHMODmod_loop_control:
+0039d5 954a dec temp6
+0039d6 f789 brne PFA_UMSLASHMODmod_loop
+
+ PFA_UMSLASHMODmod_done:
+ ; put remainder on stack
+0039d7 933a st -Y,temp3
+0039d8 932a st -Y,temp2
+
+ ; put quotient on stack
+0039d9 01c8 movw tosl, temp0
+0039da ce29 jmp_ DO_NEXT
+ .include "words/umstar.asm"
+
+ ; Arithmetics
+ ; multiply 2 unsigned cells to a double cell
+ VE_UMSTAR:
+0039db ff03 .dw $ff03
+0039dc 6d75
+0039dd 002a .db "um*",0
+0039de 39bc .dw VE_HEAD
+ .set VE_HEAD = VE_UMSTAR
+ XT_UMSTAR:
+0039df 39e0 .dw PFA_UMSTAR
+ PFA_UMSTAR:
+0039e0 018c movw temp0, tosl
+0039e1 9189
+0039e2 9199 loadtos
+ ; result: (temp3*temp1)* 65536 + (temp3*temp0 + temp1*temp2) * 256 + (temp0 * temp2)
+ ; low bytes
+0039e3 9f80 mul tosl,temp0
+0039e4 01f0 movw zl, r0
+0039e5 2722 clr temp2
+0039e6 2733 clr temp3
+ ; middle bytes
+0039e7 9f90 mul tosh, temp0
+0039e8 0df0 add zh, r0
+0039e9 1d21 adc temp2, r1
+0039ea 1d33 adc temp3, zeroh
+
+0039eb 9f81 mul tosl, temp1
+0039ec 0df0 add zh, r0
+0039ed 1d21 adc temp2, r1
+0039ee 1d33 adc temp3, zeroh
+
+0039ef 9f91 mul tosh, temp1
+0039f0 0d20 add temp2, r0
+0039f1 1d31 adc temp3, r1
+0039f2 01cf movw tosl, zl
+0039f3 939a
+0039f4 938a savetos
+0039f5 01c9 movw tosl, temp2
+0039f6 ce0d jmp_ DO_NEXT
+
+ .include "words/invert.asm"
+
+ ; Arithmetics
+ ; 1-complement of TOS
+ VE_INVERT:
+0039f7 ff06 .dw $ff06
+0039f8 6e69
+0039f9 6576
+0039fa 7472 .db "invert"
+0039fb 39db .dw VE_HEAD
+ .set VE_HEAD = VE_INVERT
+ XT_INVERT:
+0039fc 39fd .dw PFA_INVERT
+ PFA_INVERT:
+0039fd 9580 com tosl
+0039fe 9590 com tosh
+0039ff ce04 jmp_ DO_NEXT
+ .include "words/2slash.asm"
+
+ ; Arithmetics
+ ; arithmetic shift right
+ VE_2SLASH:
+003a00 ff02 .dw $ff02
+003a01 2f32 .db "2/"
+003a02 39f7 .dw VE_HEAD
+ .set VE_HEAD = VE_2SLASH
+ XT_2SLASH:
+003a03 3a04 .dw PFA_2SLASH
+ PFA_2SLASH:
+003a04 9595 asr tosh
+003a05 9587 ror tosl
+003a06 cdfd jmp_ DO_NEXT
+ .include "words/2star.asm"
+
+ ; Arithmetics
+ ; arithmetic shift left, filling with zero
+ VE_2STAR:
+003a07 ff02 .dw $ff02
+003a08 2a32 .db "2*"
+003a09 3a00 .dw VE_HEAD
+ .set VE_HEAD = VE_2STAR
+ XT_2STAR:
+003a0a 3a0b .dw PFA_2STAR
+ PFA_2STAR:
+003a0b 0f88 lsl tosl
+003a0c 1f99 rol tosh
+003a0d cdf6 jmp_ DO_NEXT
+ .include "words/and.asm"
+
+ ; Logic
+ ; bitwise and
+ VE_AND:
+003a0e ff03 .dw $ff03
+003a0f 6e61
+003a10 0064 .db "and",0
+003a11 3a07 .dw VE_HEAD
+ .set VE_HEAD = VE_AND
+ XT_AND:
+003a12 3a13 .dw PFA_AND
+ PFA_AND:
+003a13 9109 ld temp0, Y+
+003a14 9119 ld temp1, Y+
+003a15 2380 and tosl, temp0
+003a16 2391 and tosh, temp1
+003a17 cdec jmp_ DO_NEXT
+ .include "words/or.asm"
+
+ ; Logic
+ ; logical or
+ VE_OR:
+003a18 ff02 .dw $ff02
+003a19 726f .db "or"
+003a1a 3a0e .dw VE_HEAD
+ .set VE_HEAD = VE_OR
+ XT_OR:
+003a1b 3a1c .dw PFA_OR
+ PFA_OR:
+003a1c 9109 ld temp0, Y+
+003a1d 9119 ld temp1, Y+
+003a1e 2b80 or tosl, temp0
+003a1f 2b91 or tosh, temp1
+003a20 cde3 jmp_ DO_NEXT
+
+ .include "words/xor.asm"
+
+ ; Logic
+ ; exclusive or
+ VE_XOR:
+003a21 ff03 .dw $ff03
+003a22 6f78
+003a23 0072 .db "xor",0
+003a24 3a18 .dw VE_HEAD
+ .set VE_HEAD = VE_XOR
+ XT_XOR:
+003a25 3a26 .dw PFA_XOR
+ PFA_XOR:
+003a26 9109 ld temp0, Y+
+003a27 9119 ld temp1, Y+
+003a28 2780 eor tosl, temp0
+003a29 2791 eor tosh, temp1
+003a2a cdd9 jmp_ DO_NEXT
+
+ .include "words/1plus.asm"
+
+ ; Arithmetics
+ ; optimized increment
+ VE_1PLUS:
+003a2b ff02 .dw $ff02
+003a2c 2b31 .db "1+"
+003a2d 3a21 .dw VE_HEAD
+ .set VE_HEAD = VE_1PLUS
+ XT_1PLUS:
+003a2e 3a2f .dw PFA_1PLUS
+ PFA_1PLUS:
+003a2f 9601 adiw tosl,1
+003a30 cdd3 jmp_ DO_NEXT
+ .include "words/1minus.asm"
+
+ ; Arithmetics
+ ; optimized decrement
+ VE_1MINUS:
+003a31 ff02 .dw $ff02
+003a32 2d31 .db "1-"
+003a33 3a2b .dw VE_HEAD
+ .set VE_HEAD = VE_1MINUS
+ XT_1MINUS:
+003a34 3a35 .dw PFA_1MINUS
+ PFA_1MINUS:
+003a35 9701 sbiw tosl, 1
+003a36 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:
+003a37 ff07 .dw $ff07
+003a38 6e3f
+003a39 6765
+003a3a 7461
+../../common\words/q-negate.asm(11): warning: .cseg .db misalignment - padding zero byte
+003a3b 0065 .db "?negate"
+003a3c 3a31 .dw VE_HEAD
+ .set VE_HEAD = VE_QNEGATE
+ XT_QNEGATE:
+003a3d 3800 .dw DO_COLON
+ PFA_QNEGATE:
+
+ .endif
+003a3e 3920
+003a3f 3835 .DW XT_ZEROLESS,XT_DOCONDBRANCH
+003a40 3a42 DEST(QNEG1)
+003a41 3e26 .DW XT_NEGATE
+003a42 381f QNEG1: .DW XT_EXIT
+ .include "words/lshift.asm"
+
+ ; Arithmetics
+ ; logically shift n1 left n2 times
+ VE_LSHIFT:
+003a43 ff06 .dw $ff06
+003a44 736c
+003a45 6968
+003a46 7466 .db "lshift"
+003a47 3a37 .dw VE_HEAD
+ .set VE_HEAD = VE_LSHIFT
+ XT_LSHIFT:
+003a48 3a49 .dw PFA_LSHIFT
+ PFA_LSHIFT:
+003a49 01fc movw zl, tosl
+003a4a 9189
+003a4b 9199 loadtos
+ PFA_LSHIFT1:
+003a4c 9731 sbiw zl, 1
+003a4d f01a brmi PFA_LSHIFT2
+003a4e 0f88 lsl tosl
+003a4f 1f99 rol tosh
+003a50 cffb rjmp PFA_LSHIFT1
+ PFA_LSHIFT2:
+003a51 cdb2 jmp_ DO_NEXT
+
+ .include "words/rshift.asm"
+
+ ; Arithmetics
+ ; shift n1 n2-times logically right
+ VE_RSHIFT:
+003a52 ff06 .dw $ff06
+003a53 7372
+003a54 6968
+003a55 7466 .db "rshift"
+003a56 3a43 .dw VE_HEAD
+ .set VE_HEAD = VE_RSHIFT
+ XT_RSHIFT:
+003a57 3a58 .dw PFA_RSHIFT
+ PFA_RSHIFT:
+003a58 01fc movw zl, tosl
+003a59 9189
+003a5a 9199 loadtos
+ PFA_RSHIFT1:
+003a5b 9731 sbiw zl, 1
+003a5c f01a brmi PFA_RSHIFT2
+003a5d 9596 lsr tosh
+003a5e 9587 ror tosl
+003a5f cffb rjmp PFA_RSHIFT1
+ PFA_RSHIFT2:
+003a60 cda3 jmp_ DO_NEXT
+
+ .include "words/plusstore.asm"
+
+ ; Arithmetics
+ ; add n to content of RAM address a-addr
+ VE_PLUSSTORE:
+003a61 ff02 .dw $ff02
+003a62 212b .db "+!"
+003a63 3a52 .dw VE_HEAD
+ .set VE_HEAD = VE_PLUSSTORE
+ XT_PLUSSTORE:
+003a64 3a65 .dw PFA_PLUSSTORE
+ PFA_PLUSSTORE:
+003a65 01fc movw zl, tosl
+003a66 9189
+003a67 9199 loadtos
+003a68 8120 ldd temp2, Z+0
+003a69 8131 ldd temp3, Z+1
+003a6a 0f82 add tosl, temp2
+003a6b 1f93 adc tosh, temp3
+003a6c 8380 std Z+0, tosl
+003a6d 8391 std Z+1, tosh
+003a6e 9189
+003a6f 9199 loadtos
+003a70 cd93 jmp_ DO_NEXT
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+ .include "words/rpfetch.asm"
+
+ ; Stack
+ ; current return stack pointer address
+ VE_RP_FETCH:
+003a71 ff03 .dw $ff03
+003a72 7072
+003a73 0040 .db "rp@",0
+003a74 3a61 .dw VE_HEAD
+ .set VE_HEAD = VE_RP_FETCH
+ XT_RP_FETCH:
+003a75 3a76 .dw PFA_RP_FETCH
+ PFA_RP_FETCH:
+003a76 939a
+003a77 938a savetos
+003a78 b78d in tosl, SPL
+003a79 b79e in tosh, SPH
+003a7a cd89 jmp_ DO_NEXT
+ .include "words/rpstore.asm"
+
+ ; Stack
+ ; set return stack pointer
+ VE_RP_STORE:
+003a7b ff03 .dw $ff03
+003a7c 7072
+003a7d 0021 .db "rp!",0
+003a7e 3a71 .dw VE_HEAD
+ .set VE_HEAD = VE_RP_STORE
+ XT_RP_STORE:
+003a7f 3a80 .dw PFA_RP_STORE
+ PFA_RP_STORE:
+003a80 b72f in temp2, SREG
+003a81 94f8 cli
+003a82 bf8d out SPL, tosl
+003a83 bf9e out SPH, tosh
+003a84 bf2f out SREG, temp2
+003a85 9189
+003a86 9199 loadtos
+003a87 cd7c jmp_ DO_NEXT
+ .include "words/spfetch.asm"
+
+ ; Stack
+ ; current data stack pointer
+ VE_SP_FETCH:
+003a88 ff03 .dw $ff03
+003a89 7073
+003a8a 0040 .db "sp@",0
+003a8b 3a7b .dw VE_HEAD
+ .set VE_HEAD = VE_SP_FETCH
+ XT_SP_FETCH:
+003a8c 3a8d .dw PFA_SP_FETCH
+ PFA_SP_FETCH:
+003a8d 939a
+003a8e 938a savetos
+003a8f 01ce movw tosl, yl
+003a90 cd73 jmp_ DO_NEXT
+ .include "words/spstore.asm"
+
+ ; Stack
+ ; set data stack pointer to addr
+ VE_SP_STORE:
+003a91 ff03 .dw $ff03
+003a92 7073
+003a93 0021 .db "sp!",0
+003a94 3a88 .dw VE_HEAD
+ .set VE_HEAD = VE_SP_STORE
+ XT_SP_STORE:
+003a95 3a96 .dw PFA_SP_STORE
+ PFA_SP_STORE:
+003a96 01ec movw yl, tosl
+003a97 9189
+003a98 9199 loadtos
+003a99 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:
+003a9a 3a9b .dw PFA_DODO
+ PFA_DODO:
+003a9b 9129 ld temp2, Y+
+003a9c 9139 ld temp3, Y+ ; limit
+ PFA_DODO1:
+003a9d e8e0 ldi zl, $80
+003a9e 0f3e add temp3, zl
+003a9f 1b82 sub tosl, temp2
+003aa0 0b93 sbc tosh, temp3
+
+003aa1 933f push temp3
+003aa2 932f push temp2 ; limit ( --> limit + $8000)
+003aa3 939f push tosh
+003aa4 938f push tosl ; start -> index ( --> index - (limit - $8000)
+003aa5 9189
+003aa6 9199 loadtos
+003aa7 cd5c jmp_ DO_NEXT
+ .include "words/i.asm"
+
+ ; Compiler
+ ; current loop counter
+ VE_I:
+003aa8 ff01 .dw $FF01
+003aa9 0069 .db "i",0
+003aaa 3a91 .dw VE_HEAD
+ .set VE_HEAD = VE_I
+ XT_I:
+003aab 3aac .dw PFA_I
+ PFA_I:
+003aac 939a
+003aad 938a savetos
+003aae 918f pop tosl
+003aaf 919f pop tosh ; index
+003ab0 91ef pop zl
+003ab1 91ff pop zh ; limit
+003ab2 93ff push zh
+003ab3 93ef push zl
+003ab4 939f push tosh
+003ab5 938f push tosl
+003ab6 0f8e add tosl, zl
+003ab7 1f9f adc tosh, zh
+003ab8 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:
+003ab9 3aba .dw PFA_DOPLUSLOOP
+ PFA_DOPLUSLOOP:
+003aba 91ef pop zl
+003abb 91ff pop zh
+003abc 0fe8 add zl, tosl
+003abd 1ff9 adc zh, tosh
+003abe 9189
+003abf 9199 loadtos
+003ac0 f01b brvs PFA_DOPLUSLOOP_LEAVE
+ ; next cycle
+ PFA_DOPLUSLOOP_NEXT:
+ ; next iteration
+003ac1 93ff push zh
+003ac2 93ef push zl
+003ac3 cd6b rjmp PFA_DOBRANCH ; read next cell from dictionary and jump to its destination
+ PFA_DOPLUSLOOP_LEAVE:
+003ac4 910f pop temp0
+003ac5 911f pop temp1 ; remove limit
+003ac6 9611 adiw xl, 1 ; skip branch-back address
+003ac7 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:
+003ac8 3ac9 .dw PFA_DOLOOP
+ PFA_DOLOOP:
+003ac9 91ef pop zl
+003aca 91ff pop zh
+003acb 9631 adiw zl,1
+003acc f3bb brvs PFA_DOPLUSLOOP_LEAVE
+003acd cff3 jmp_ PFA_DOPLUSLOOP_NEXT
+ .include "words/unloop.asm"
+
+ ; Compiler
+ ; remove loop-sys, exit the loop and continue execution after it
+ VE_UNLOOP:
+003ace ff06 .dw $ff06
+003acf 6e75
+003ad0 6f6c
+003ad1 706f .db "unloop"
+003ad2 3aa8 .dw VE_HEAD
+ .set VE_HEAD = VE_UNLOOP
+ XT_UNLOOP:
+003ad3 3ad4 .dw PFA_UNLOOP
+ PFA_UNLOOP:
+003ad4 911f pop temp1
+003ad5 910f pop temp0
+003ad6 911f pop temp1
+003ad7 910f pop temp0
+003ad8 cd2b jmp_ DO_NEXT
+
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+ .include "words/cmove_g.asm"
+
+ ; Memory
+ ; copy data in RAM from higher to lower addresses.
+ VE_CMOVE_G:
+003ad9 ff06 .dw $ff06
+003ada 6d63
+003adb 766f
+003adc 3e65 .db "cmove>"
+003add 3ace .dw VE_HEAD
+ .set VE_HEAD = VE_CMOVE_G
+ XT_CMOVE_G:
+003ade 3adf .dw PFA_CMOVE_G
+ PFA_CMOVE_G:
+003adf 93bf push xh
+003ae0 93af push xl
+003ae1 91e9 ld zl, Y+
+003ae2 91f9 ld zh, Y+ ; addr-to
+003ae3 91a9 ld xl, Y+
+003ae4 91b9 ld xh, Y+ ; addr-from
+003ae5 2f09 mov temp0, tosh
+003ae6 2b08 or temp0, tosl
+003ae7 f041 brbs 1, PFA_CMOVE_G1
+003ae8 0fe8 add zl, tosl
+003ae9 1ff9 adc zh, tosh
+003aea 0fa8 add xl, tosl
+003aeb 1fb9 adc xh, tosh
+ PFA_CMOVE_G2:
+003aec 911e ld temp1, -X
+003aed 9312 st -Z, temp1
+003aee 9701 sbiw tosl, 1
+003aef f7e1 brbc 1, PFA_CMOVE_G2
+ PFA_CMOVE_G1:
+003af0 91af pop xl
+003af1 91bf pop xh
+003af2 9189
+003af3 9199 loadtos
+003af4 cd0f jmp_ DO_NEXT
+ .include "words/byteswap.asm"
+
+ ; Arithmetics
+ ; exchange the bytes of the TOS
+ VE_BYTESWAP:
+003af5 ff02 .dw $ff02
+003af6 3c3e .db "><"
+003af7 3ad9 .dw VE_HEAD
+ .set VE_HEAD = VE_BYTESWAP
+ XT_BYTESWAP:
+003af8 3af9 .dw PFA_BYTESWAP
+ PFA_BYTESWAP:
+003af9 2f09 mov temp0, tosh
+003afa 2f98 mov tosh, tosl
+003afb 2f80 mov tosl, temp0
+003afc cd07 jmp_ DO_NEXT
+ .include "words/up.asm"
+
+ ; System Variable
+ ; get user area pointer
+ VE_UP_FETCH:
+003afd ff03 .dw $ff03
+003afe 7075
+003aff 0040 .db "up@",0
+003b00 3af5 .dw VE_HEAD
+ .set VE_HEAD = VE_UP_FETCH
+ XT_UP_FETCH:
+003b01 3b02 .dw PFA_UP_FETCH
+ PFA_UP_FETCH:
+003b02 939a
+003b03 938a savetos
+003b04 01c2 movw tosl, upl
+003b05 ccfe jmp_ DO_NEXT
+
+ ; ( addr -- )
+ ; System Variable
+ ; set user area pointer
+ VE_UP_STORE:
+003b06 ff03 .dw $ff03
+003b07 7075
+003b08 0021 .db "up!",0
+003b09 3afd .dw VE_HEAD
+ .set VE_HEAD = VE_UP_STORE
+ XT_UP_STORE:
+003b0a 3b0b .dw PFA_UP_STORE
+ PFA_UP_STORE:
+003b0b 012c movw upl, tosl
+003b0c 9189
+003b0d 9199 loadtos
+003b0e ccf5 jmp_ DO_NEXT
+ .include "words/1ms.asm"
+
+ ; Time
+ ; busy waits (almost) exactly 1 millisecond
+ VE_1MS:
+003b0f ff03 .dw $ff03
+003b10 6d31
+003b11 0073 .db "1ms",0
+003b12 3b06 .dw VE_HEAD
+ .set VE_HEAD = VE_1MS
+ XT_1MS:
+003b13 3b14 .dw PFA_1MS
+ PFA_1MS:
+003b14 eae0
+003b15 e0ff
+003b16 9731
+003b17 f7f1 delay 1000
+003b18 cceb jmp_ DO_NEXT
+ .include "words/2to_r.asm"
+
+ ; Stack
+ ; move DTOS to TOR
+ VE_2TO_R:
+003b19 ff03 .dw $ff03
+003b1a 3e32
+003b1b 0072 .db "2>r",0
+003b1c 3b0f .dw VE_HEAD
+ .set VE_HEAD = VE_2TO_R
+ XT_2TO_R:
+003b1d 3b1e .dw PFA_2TO_R
+ PFA_2TO_R:
+003b1e 01fc movw zl, tosl
+003b1f 9189
+003b20 9199 loadtos
+003b21 939f push tosh
+003b22 938f push tosl
+003b23 93ff push zh
+003b24 93ef push zl
+003b25 9189
+003b26 9199 loadtos
+003b27 ccdc jmp_ DO_NEXT
+ .include "words/2r_from.asm"
+
+ ; Stack
+ ; move DTOR to TOS
+ VE_2R_FROM:
+003b28 ff03 .dw $ff03
+003b29 7232
+003b2a 003e .db "2r>",0
+003b2b 3b19 .dw VE_HEAD
+ .set VE_HEAD = VE_2R_FROM
+ XT_2R_FROM:
+003b2c 3b2d .dw PFA_2R_FROM
+ PFA_2R_FROM:
+003b2d 939a
+003b2e 938a savetos
+003b2f 91ef pop zl
+003b30 91ff pop zh
+003b31 918f pop tosl
+003b32 919f pop tosh
+003b33 939a
+003b34 938a savetos
+003b35 01cf movw tosl, zl
+003b36 cccd jmp_ DO_NEXT
+
+ .include "words/store-e.asm"
+
+ ; Memory
+ ; write n (2bytes) to eeprom address
+ VE_STOREE:
+003b37 ff02 .dw $ff02
+003b38 6521 .db "!e"
+003b39 3b28 .dw VE_HEAD
+ .set VE_HEAD = VE_STOREE
+ XT_STOREE:
+003b3a 3b3b .dw PFA_STOREE
+ PFA_STOREE:
+ .if WANT_UNIFIED == 1
+ .endif
+ PFA_STOREE0:
+003b3b 01fc movw zl, tosl
+003b3c 9189
+003b3d 9199 loadtos
+003b3e b72f in_ temp2, SREG
+003b3f 94f8 cli
+003b40 d028 rcall PFA_FETCHE2
+003b41 b500 in_ temp0, EEDR
+003b42 1708 cp temp0,tosl
+003b43 f009 breq PFA_STOREE3
+003b44 d00b rcall PFA_STOREE1
+ PFA_STOREE3:
+003b45 9631 adiw zl,1
+003b46 d022 rcall PFA_FETCHE2
+003b47 b500 in_ temp0, EEDR
+003b48 1709 cp temp0,tosh
+003b49 f011 breq PFA_STOREE4
+003b4a 2f89 mov tosl, tosh
+003b4b d004 rcall PFA_STOREE1
+ PFA_STOREE4:
+003b4c bf2f out_ SREG, temp2
+003b4d 9189
+003b4e 9199 loadtos
+003b4f ccb4 jmp_ DO_NEXT
+
+ PFA_STOREE1:
+003b50 99f9 sbic EECR, EEPE
+003b51 cffe rjmp PFA_STOREE1
+
+ PFA_STOREE2: ; estore_wait_low_spm:
+003b52 b707 in_ temp0, SPMCSR
+003b53 fd00 sbrc temp0,SPMEN
+003b54 cffd rjmp PFA_STOREE2
+
+003b55 bdf2 out_ EEARH,zh
+003b56 bde1 out_ EEARL,zl
+003b57 bd80 out_ EEDR, tosl
+003b58 9afa sbi EECR,EEMPE
+003b59 9af9 sbi EECR,EEPE
+
+003b5a 9508 ret
+ .if WANT_UNIFIED == 1
+ .endif
+ .include "words/fetch-e.asm"
+
+ ; Memory
+ ; read 1 cell from eeprom
+ VE_FETCHE:
+003b5b ff02 .dw $ff02
+003b5c 6540 .db "@e"
+003b5d 3b37 .dw VE_HEAD
+ .set VE_HEAD = VE_FETCHE
+ XT_FETCHE:
+003b5e 3b5f .dw PFA_FETCHE
+ PFA_FETCHE:
+ .if WANT_UNIFIED == 1
+ .endif
+ PFA_FETCHE1:
+003b5f b72f in_ temp2, SREG
+003b60 94f8 cli
+003b61 01fc movw zl, tosl
+003b62 d006 rcall PFA_FETCHE2
+003b63 b580 in_ tosl, EEDR
+
+003b64 9631 adiw zl,1
+
+003b65 d003 rcall PFA_FETCHE2
+003b66 b590 in_ tosh, EEDR
+003b67 bf2f out_ SREG, temp2
+003b68 cc9b jmp_ DO_NEXT
+
+ PFA_FETCHE2:
+003b69 99f9 sbic EECR, EEPE
+003b6a cffe rjmp PFA_FETCHE2
+
+003b6b bdf2 out_ EEARH,zh
+003b6c bde1 out_ EEARL,zl
+
+003b6d 9af8 sbi EECR,EERE
+003b6e 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:
+003b6f ff02 .dw $ff02
+003b70 6921 .db "!i"
+003b71 3b5b .dw VE_HEAD
+ .set VE_HEAD = VE_STOREI
+ XT_STOREI:
+003b72 3dfe .dw PFA_DODEFER1
+ PFA_STOREI:
+003b73 0088 .dw EE_STOREI
+003b74 3d9f .dw XT_EDEFERFETCH
+003b75 3da9 .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:
+003b76 ff09 .dw $ff09
+003b77 2128
+003b78 2d69
+003b79 726e
+003b7a 7777
+003b7b 0029 .db "(!i-nrww)",0
+003b7c 3b6f .dw VE_HEAD
+ .set VE_HEAD = VE_DO_STOREI_NRWW
+ XT_DO_STOREI:
+003b7d 3b7e .dw PFA_DO_STOREI_NRWW
+ PFA_DO_STOREI_NRWW:
+ ; store status register
+003b7e b71f in temp1,SREG
+003b7f 931f push temp1
+003b80 94f8 cli
+
+003b81 019c movw temp2, tosl ; save the (word) address
+003b82 9189
+003b83 9199 loadtos ; get the new value for the flash cell
+003b84 93af push xl
+003b85 93bf push xh
+003b86 93cf push yl
+003b87 93df push yh
+003b88 d009 rcall DO_STOREI_atmega
+003b89 91df pop yh
+003b8a 91cf pop yl
+003b8b 91bf pop xh
+003b8c 91af pop xl
+ ; finally clear the stack
+003b8d 9189
+003b8e 9199 loadtos
+003b8f 911f pop temp1
+ ; restore status register (and interrupt enable flag)
+003b90 bf1f out SREG,temp1
+
+003b91 cc72 jmp_ DO_NEXT
+
+ ;
+ DO_STOREI_atmega:
+ ; write data to temp page buffer
+ ; use the values in tosl/tosh at the
+ ; appropiate place
+003b92 d010 rcall pageload
+
+ ; erase page if needed
+ ; it is needed if a bit goes from 0 to 1
+003b93 94e0 com temp4
+003b94 94f0 com temp5
+003b95 218e and tosl, temp4
+003b96 219f and tosh, temp5
+003b97 2b98 or tosh, tosl
+003b98 f019 breq DO_STOREI_writepage
+003b99 01f9 movw zl, temp2
+003b9a e002 ldi temp0,(1<<PGERS)
+003b9b d020 rcall dospm
+
+ DO_STOREI_writepage:
+ ; write page
+003b9c 01f9 movw zl, temp2
+003b9d e004 ldi temp0,(1<<PGWRT)
+003b9e d01d rcall dospm
+
+ ; reenable RWW section
+003b9f 01f9 movw zl, temp2
+003ba0 e100 ldi temp0,(1<<RWWSRE)
+003ba1 d01a rcall dospm
+003ba2 9508 ret
+
+ ; load the desired page
+ .equ pagemask = ~ ( PAGESIZE - 1 )
+ pageload:
+003ba3 01f9 movw zl, temp2
+ ; get the beginning of page
+003ba4 7ce0 andi zl,low(pagemask)
+003ba5 7fff andi zh,high(pagemask)
+003ba6 01ef movw y, z
+ ; loop counter (in words)
+003ba7 e4a0 ldi xl,low(pagesize)
+003ba8 e0b0 ldi xh,high(pagesize)
+ pageload_loop:
+ ; we need the current flash value anyways
+003ba9 01fe movw z, y
+003baa 0fee
+003bab 1fff
+003bac 9145
+003bad 9155 readflashcell temp6, temp7 ; destroys Z
+ ; now check: if Z points to the same cell as temp2/3, we want the new data
+003bae 01fe movw z, y
+003baf 17e2 cp zl, temp2
+003bb0 07f3 cpc zh, temp3
+003bb1 f011 breq pageload_newdata
+003bb2 010a movw r0, temp6
+003bb3 c002 rjmp pageload_cont
+ pageload_newdata:
+003bb4 017a movw temp4, temp6
+003bb5 010c movw r0, tosl
+ pageload_cont:
+003bb6 2700 clr temp0
+003bb7 d004 rcall dospm
+003bb8 9621 adiw y, 1
+003bb9 9711 sbiw x, 1
+003bba f771 brne pageload_loop
+
+ pageload_done:
+003bbb 9508 ret
+
+
+ ;; dospm
+ ;;
+ ;; execute spm instruction
+ ;; temp0 holds the value for SPMCR
+
+ dospm:
+ dospm_wait_ee:
+003bbc 99f9 sbic EECR, EEPE
+003bbd cffe rjmp dospm_wait_ee
+ dospm_wait_spm:
+003bbe b717 in_ temp1, SPMCSR
+003bbf fd10 sbrc temp1, SPMEN
+003bc0 cffd rjmp dospm_wait_spm
+
+ ; turn the word addres into a byte address
+003bc1 0fee
+003bc2 1fff writeflashcell
+ ; execute spm
+003bc3 6001 ori temp0, (1<<SPMEN)
+003bc4 bf07 out_ SPMCSR,temp0
+003bc5 95e8 spm
+003bc6 9508 ret
+ .endif
+ .include "words/fetch-i.asm"
+
+ ; Memory
+ ; read 1 cell from flash
+ VE_FETCHI:
+003bc7 ff02 .dw $ff02
+003bc8 6940 .db "@i"
+003bc9 3b76 .dw VE_HEAD
+ .set VE_HEAD = VE_FETCHI
+ XT_FETCHI:
+003bca 3bcb .dw PFA_FETCHI
+ PFA_FETCHI:
+003bcb 01fc movw zl, tosl
+003bcc 0fee
+003bcd 1fff
+003bce 9185
+003bcf 9195 readflashcell tosl,tosh
+003bd0 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:
+003bd1 ff03 .dw $ff03
+003bd2 3e6e
+003bd3 0072 .db "n>r",0
+003bd4 3bc7 .dw VE_HEAD
+ .set VE_HEAD = VE_N_TO_R
+ XT_N_TO_R:
+003bd5 3bd6 .dw PFA_N_TO_R
+ PFA_N_TO_R:
+003bd6 01fc movw zl, tosl
+003bd7 2f08 mov temp0, tosl
+ PFA_N_TO_R1:
+003bd8 9189
+003bd9 9199 loadtos
+003bda 939f push tosh
+003bdb 938f push tosl
+003bdc 950a dec temp0
+003bdd f7d1 brne PFA_N_TO_R1
+003bde 93ef push zl
+003bdf 93ff push zh
+003be0 9189
+003be1 9199 loadtos
+003be2 cc21 jmp_ DO_NEXT
+ .include "words/n_r_from.asm"
+
+ ; Stack
+ ; move n items from return stack to data stack
+ VE_N_R_FROM:
+003be3 ff03 .dw $ff03
+003be4 726e
+003be5 003e .db "nr>",0
+003be6 3bd1 .dw VE_HEAD
+ .set VE_HEAD = VE_N_R_FROM
+ XT_N_R_FROM:
+003be7 3be8 .dw PFA_N_R_FROM
+ PFA_N_R_FROM:
+003be8 939a
+003be9 938a savetos
+003bea 91ff pop zh
+003beb 91ef pop zl
+003bec 2f0e mov temp0, zl
+ PFA_N_R_FROM1:
+003bed 918f pop tosl
+003bee 919f pop tosh
+003bef 939a
+003bf0 938a savetos
+003bf1 950a dec temp0
+003bf2 f7d1 brne PFA_N_R_FROM1
+003bf3 01cf movw tosl, zl
+003bf4 cc0f jmp_ DO_NEXT
+ .include "words/d-2star.asm"
+
+ ; Arithmetics
+ ; shift a double cell left
+ VE_D2STAR:
+003bf5 ff03 .dw $ff03
+003bf6 3264
+003bf7 002a .db "d2*",0
+003bf8 3be3 .dw VE_HEAD
+ .set VE_HEAD = VE_D2STAR
+ XT_D2STAR:
+003bf9 3bfa .dw PFA_D2STAR
+ PFA_D2STAR:
+003bfa 9109 ld temp0, Y+
+003bfb 9119 ld temp1, Y+
+003bfc 0f00 lsl temp0
+003bfd 1f11 rol temp1
+003bfe 1f88 rol tosl
+003bff 1f99 rol tosh
+003c00 931a st -Y, temp1
+003c01 930a st -Y, temp0
+003c02 cc01 jmp_ DO_NEXT
+ .include "words/d-2slash.asm"
+
+ ; Arithmetics
+ ; shift a double cell value right
+ VE_D2SLASH:
+003c03 ff03 .dw $ff03
+003c04 3264
+003c05 002f .db "d2/",0
+003c06 3bf5 .dw VE_HEAD
+ .set VE_HEAD = VE_D2SLASH
+ XT_D2SLASH:
+003c07 3c08 .dw PFA_D2SLASH
+ PFA_D2SLASH:
+003c08 9109 ld temp0, Y+
+003c09 9119 ld temp1, Y+
+003c0a 9595 asr tosh
+003c0b 9587 ror tosl
+003c0c 9517 ror temp1
+003c0d 9507 ror temp0
+003c0e 931a st -Y, temp1
+003c0f 930a st -Y, temp0
+003c10 cbf3 jmp_ DO_NEXT
+ .include "words/d-plus.asm"
+
+ ; Arithmetics
+ ; add 2 double cell values
+ VE_DPLUS:
+003c11 ff02 .dw $ff02
+003c12 2b64 .db "d+"
+003c13 3c03 .dw VE_HEAD
+ .set VE_HEAD = VE_DPLUS
+ XT_DPLUS:
+003c14 3c15 .dw PFA_DPLUS
+ PFA_DPLUS:
+003c15 9129 ld temp2, Y+
+003c16 9139 ld temp3, Y+
+
+003c17 90e9 ld temp4, Y+
+003c18 90f9 ld temp5, Y+
+003c19 9149 ld temp6, Y+
+003c1a 9159 ld temp7, Y+
+
+003c1b 0f24 add temp2, temp6
+003c1c 1f35 adc temp3, temp7
+003c1d 1d8e adc tosl, temp4
+003c1e 1d9f adc tosh, temp5
+
+003c1f 933a st -Y, temp3
+003c20 932a st -Y, temp2
+003c21 cbe2 jmp_ DO_NEXT
+ .include "words/d-minus.asm"
+
+ ; Arithmetics
+ ; subtract d2 from d1
+ VE_DMINUS:
+003c22 ff02 .dw $ff02
+003c23 2d64 .db "d-"
+003c24 3c11 .dw VE_HEAD
+ .set VE_HEAD = VE_DMINUS
+ XT_DMINUS:
+003c25 3c26 .dw PFA_DMINUS
+ PFA_DMINUS:
+003c26 9129 ld temp2, Y+
+003c27 9139 ld temp3, Y+
+
+003c28 90e9 ld temp4, Y+
+003c29 90f9 ld temp5, Y+
+003c2a 9149 ld temp6, Y+
+003c2b 9159 ld temp7, Y+
+
+003c2c 1b42 sub temp6, temp2
+003c2d 0b53 sbc temp7, temp3
+003c2e 0ae8 sbc temp4, tosl
+003c2f 0af9 sbc temp5, tosh
+
+003c30 935a st -Y, temp7
+003c31 934a st -Y, temp6
+003c32 01c7 movw tosl, temp4
+003c33 cbd0 jmp_ DO_NEXT
+ .include "words/d-invert.asm"
+
+ ; Arithmetics
+ ; invert all bits in the double cell value
+ VE_DINVERT:
+003c34 ff07 .dw $ff07
+003c35 6964
+003c36 766e
+003c37 7265
+003c38 0074 .db "dinvert",0
+003c39 3c22 .dw VE_HEAD
+ .set VE_HEAD = VE_DINVERT
+ XT_DINVERT:
+003c3a 3c3b .dw PFA_DINVERT
+ PFA_DINVERT:
+003c3b 9109 ld temp0, Y+
+003c3c 9119 ld temp1, Y+
+003c3d 9580 com tosl
+003c3e 9590 com tosh
+003c3f 9500 com temp0
+003c40 9510 com temp1
+003c41 931a st -Y, temp1
+003c42 930a st -Y, temp0
+003c43 cbc0 jmp_ DO_NEXT
+ .include "words/slashmod.asm"
+
+ ; Arithmetics
+ ; signed division n1/n2 with remainder and quotient
+ VE_SLASHMOD:
+003c44 ff04 .dw $ff04
+003c45 6d2f
+003c46 646f .db "/mod"
+003c47 3c34 .dw VE_HEAD
+ .set VE_HEAD = VE_SLASHMOD
+ XT_SLASHMOD:
+003c48 3c49 .dw PFA_SLASHMOD
+ PFA_SLASHMOD:
+003c49 019c movw temp2, tosl
+
+003c4a 9109 ld temp0, Y+
+003c4b 9119 ld temp1, Y+
+
+003c4c 2f41 mov temp6,temp1 ;move dividend High to sign register
+003c4d 2743 eor temp6,temp3 ;xor divisor High with sign register
+003c4e ff17 sbrs temp1,7 ;if MSB in dividend set
+003c4f c004 rjmp PFA_SLASHMOD_1
+003c50 9510 com temp1 ; change sign of dividend
+003c51 9500 com temp0
+003c52 5f0f subi temp0,low(-1)
+003c53 4f1f sbci temp1,high(-1)
+ PFA_SLASHMOD_1:
+003c54 ff37 sbrs temp3,7 ;if MSB in divisor set
+003c55 c004 rjmp PFA_SLASHMOD_2
+003c56 9530 com temp3 ; change sign of divisor
+003c57 9520 com temp2
+003c58 5f2f subi temp2,low(-1)
+003c59 4f3f sbci temp3,high(-1)
+003c5a 24ee PFA_SLASHMOD_2: clr temp4 ;clear remainder Low byte
+003c5b 18ff sub temp5,temp5;clear remainder High byte and carry
+003c5c e151 ldi temp7,17 ;init loop counter
+
+003c5d 1f00 PFA_SLASHMOD_3: rol temp0 ;shift left dividend
+003c5e 1f11 rol temp1
+003c5f 955a dec temp7 ;decrement counter
+003c60 f439 brne PFA_SLASHMOD_5 ;if done
+003c61 ff47 sbrs temp6,7 ; if MSB in sign register set
+003c62 c004 rjmp PFA_SLASHMOD_4
+003c63 9510 com temp1 ; change sign of result
+003c64 9500 com temp0
+003c65 5f0f subi temp0,low(-1)
+003c66 4f1f sbci temp1,high(-1)
+003c67 c00b PFA_SLASHMOD_4: rjmp PFA_SLASHMODmod_done ; return
+003c68 1cee PFA_SLASHMOD_5: rol temp4 ;shift dividend into remainder
+003c69 1cff rol temp5
+003c6a 1ae2 sub temp4,temp2 ;remainder = remainder - divisor
+003c6b 0af3 sbc temp5,temp3 ;
+003c6c f420 brcc PFA_SLASHMOD_6 ;if result negative
+003c6d 0ee2 add temp4,temp2 ; restore remainder
+003c6e 1ef3 adc temp5,temp3
+003c6f 9488 clc ; clear carry to be shifted into result
+003c70 cfec rjmp PFA_SLASHMOD_3 ;else
+003c71 9408 PFA_SLASHMOD_6: sec ; set carry to be shifted into result
+003c72 cfea rjmp PFA_SLASHMOD_3
+
+ PFA_SLASHMODmod_done:
+ ; put remainder on stack
+003c73 92fa st -Y,temp5
+003c74 92ea st -Y,temp4
+
+ ; put quotient on stack
+003c75 01c8 movw tosl, temp0
+003c76 cb8d jmp_ DO_NEXT
+ .include "words/abs.asm"
+
+ ; DUP ?NEGATE ;
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_ABS:
+003c77 ff03 .dw $ff03
+003c78 6261
+003c79 0073 .db "abs",0
+003c7a 3c44 .dw VE_HEAD
+ .set VE_HEAD = VE_ABS
+ XT_ABS:
+003c7b 3800 .dw DO_COLON
+ PFA_ABS:
+
+ .endif
+
+003c7c 38b0
+003c7d 3a3d
+003c7e 381f .DW XT_DUP,XT_QNEGATE,XT_EXIT
+ .include "words/pick.asm"
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_PICK:
+003c7f ff04 .dw $ff04
+003c80 6970
+003c81 6b63 .db "pick"
+003c82 3c77 .dw VE_HEAD
+ .set VE_HEAD = VE_PICK
+ XT_PICK:
+003c83 3800 .dw DO_COLON
+ PFA_PICK:
+ .endif
+003c84 3a2e .dw XT_1PLUS
+003c85 3ec3 .dw XT_CELLS
+003c86 3a8c .dw XT_SP_FETCH
+003c87 399c .dw XT_PLUS
+003c88 3878 .dw XT_FETCH
+003c89 381f .dw XT_EXIT
+ .include "words/cellplus.asm"
+
+ ; Arithmetics
+ ; add the size of an address-unit to a-addr1
+ VE_CELLPLUS:
+003c8a ff05 .dw $ff05
+003c8b 6563
+003c8c 6c6c
+003c8d 002b .db "cell+",0
+003c8e 3c7f .dw VE_HEAD
+ .set VE_HEAD = VE_CELLPLUS
+ XT_CELLPLUS:
+003c8f 3c90 .dw PFA_CELLPLUS
+ PFA_CELLPLUS:
+003c90 9602 adiw tosl, CELLSIZE
+003c91 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:
+003c92 ff04 .dw $ff04
+003c93 692b
+003c94 746e .db "+int"
+003c95 3c8a .dw VE_HEAD
+ .set VE_HEAD = VE_INTON
+ XT_INTON:
+003c96 3c97 .dw PFA_INTON
+ PFA_INTON:
+003c97 9478 sei
+003c98 cb6b jmp_ DO_NEXT
+ .include "words/int-off.asm"
+
+ ; Interrupt
+ ; turns off all interrupts
+ VE_INTOFF:
+003c99 ff04 .dw $ff04
+003c9a 692d
+003c9b 746e .db "-int"
+003c9c 3c92 .dw VE_HEAD
+ .set VE_HEAD = VE_INTOFF
+ XT_INTOFF:
+003c9d 3c9e .dw PFA_INTOFF
+ PFA_INTOFF:
+003c9e 94f8 cli
+003c9f cb64 jmp_ DO_NEXT
+ .include "words/int-store.asm"
+
+ ; Interrupt
+ ; stores XT as interrupt vector i
+ VE_INTSTORE:
+003ca0 ff04 .dw $ff04
+003ca1 6e69
+003ca2 2174 .db "int!"
+003ca3 3c99 .dw VE_HEAD
+ .set VE_HEAD = VE_INTSTORE
+ XT_INTSTORE:
+003ca4 3800 .dw DO_COLON
+ PFA_INTSTORE:
+003ca5 383c .dw XT_DOLITERAL
+003ca6 0000 .dw intvec
+003ca7 399c .dw XT_PLUS
+003ca8 3b3a .dw XT_STOREE
+003ca9 381f .dw XT_EXIT
+ .include "words/int-fetch.asm"
+
+ ; Interrupt
+ ; fetches XT from interrupt vector i
+ VE_INTFETCH:
+003caa ff04 .dw $ff04
+003cab 6e69
+003cac 4074 .db "int@"
+003cad 3ca0 .dw VE_HEAD
+ .set VE_HEAD = VE_INTFETCH
+ XT_INTFETCH:
+003cae 3800 .dw DO_COLON
+ PFA_INTFETCH:
+003caf 383c .dw XT_DOLITERAL
+003cb0 0000 .dw intvec
+003cb1 399c .dw XT_PLUS
+003cb2 3b5e .dw XT_FETCHE
+003cb3 381f .dw XT_EXIT
+ .include "words/int-trap.asm"
+
+ ; Interrupt
+ ; trigger an interrupt
+ VE_INTTRAP:
+003cb4 ff08 .dw $ff08
+003cb5 6e69
+003cb6 2d74
+003cb7 7274
+003cb8 7061 .db "int-trap"
+003cb9 3caa .dw VE_HEAD
+ .set VE_HEAD = VE_INTTRAP
+ XT_INTTRAP:
+003cba 3cbb .dw PFA_INTTRAP
+ PFA_INTTRAP:
+003cbb 2eb8 mov isrflag, tosl
+003cbc 9189
+003cbd 9199 loadtos
+003cbe 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:
+003cbf 3800 .dw DO_COLON
+ PFA_ISREXEC:
+003cc0 3cae .dw XT_INTFETCH
+003cc1 3829 .dw XT_EXECUTE
+003cc2 3cc4 .dw XT_ISREND
+003cc3 381f .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:
+003cc4 3cc5 .dw PFA_ISREND
+ PFA_ISREND:
+003cc5 d001 rcall PFA_ISREND1 ; clear the interrupt flag for the controller
+003cc6 cb3d jmp_ DO_NEXT
+ PFA_ISREND1:
+003cc7 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:
+003cc8 3800 .dw DO_COLON
+ PFA_DEFAULT_PROMPTOK:
+003cc9 03b7 .dw XT_DOSLITERAL
+003cca 0003 .dw 3
+003ccb 6f20
+003ccc 006b .db " ok",0
+ .endif
+003ccd 03ea .dw XT_ITYPE
+003cce 381f .dw XT_EXIT
+
+ ; ------------------------
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_PROMPTOK:
+003ccf ff03 .dw $FF03
+003cd0 6f2e
+../../common\words/prompt-ok.asm(43): warning: .cseg .db misalignment - padding zero byte
+003cd1 006b .db ".ok"
+003cd2 3cb4 .dw VE_HEAD
+ .set VE_HEAD = VE_PROMPTOK
+ XT_PROMPTOK:
+003cd3 3dfe .dw PFA_DODEFER1
+ PFA_PROMPTOK:
+ .endif
+003cd4 001c .dw USER_P_OK
+003cd5 3dc7 .dw XT_UDEFERFETCH
+003cd6 3dd3 .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:
+003cd7 3800 .dw DO_COLON
+ PFA_DEFAULT_PROMPTREADY:
+003cd8 03b7 .dw XT_DOSLITERAL
+003cd9 0002 .dw 2
+003cda 203e .db "> "
+ .endif
+003cdb 3fa0 .dw XT_CR
+003cdc 03ea .dw XT_ITYPE
+003cdd 381f .dw XT_EXIT
+
+ ; ------------------------
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_PROMPTREADY:
+003cde ff06 .dw $FF06
+003cdf 722e
+003ce0 6165
+003ce1 7964 .db ".ready"
+003ce2 3ccf .dw VE_HEAD
+ .set VE_HEAD = VE_PROMPTREADY
+ XT_PROMPTREADY:
+003ce3 3dfe .dw PFA_DODEFER1
+ PFA_PROMPTREADY:
+ .endif
+003ce4 0020 .dw USER_P_RDY
+003ce5 3dc7 .dw XT_UDEFERFETCH
+003ce6 3dd3 .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:
+003ce7 3800 .dw DO_COLON
+ PFA_DEFAULT_PROMPTERROR:
+003ce8 03b7 .dw XT_DOSLITERAL
+003ce9 0004 .dw 4
+003cea 3f20
+003ceb 203f .db " ?? "
+ .endif
+003cec 03ea .dw XT_ITYPE
+003ced 3ebc .dw XT_BASE
+003cee 3878 .dw XT_FETCH
+003cef 38fe .dw XT_TO_R
+003cf0 3f40 .dw XT_DECIMAL
+003cf1 036c .dw XT_DOT
+003cf2 3ee1 .dw XT_TO_IN
+003cf3 3878 .dw XT_FETCH
+003cf4 036c .dw XT_DOT
+003cf5 38f5 .dw XT_R_FROM
+003cf6 3ebc .dw XT_BASE
+003cf7 3880 .dw XT_STORE
+003cf8 381f .dw XT_EXIT
+
+ ; ------------------------
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_PROMPTERROR:
+003cf9 ff06 .dw $FF06
+003cfa 652e
+003cfb 7272
+003cfc 726f .db ".error"
+003cfd 3cde .dw VE_HEAD
+ .set VE_HEAD = VE_PROMPTERROR
+ XT_PROMPTERROR:
+003cfe 3dfe .dw PFA_DODEFER1
+ PFA_PROMPTERROR:
+ .endif
+003cff 001e .dw USER_P_ERR
+003d00 3dc7 .dw XT_UDEFERFETCH
+003d01 3dd3 .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:
+003d02 ff04 .dw $ff04
+003d03 7571
+003d04 7469 .db "quit"
+003d05 3cf9 .dw VE_HEAD
+ .set VE_HEAD = VE_QUIT
+ XT_QUIT:
+003d06 3800 .dw DO_COLON
+ .endif
+ PFA_QUIT:
+003d07 0843
+003d08 084a
+003d09 3880 .dw XT_LP0,XT_LP,XT_STORE
+003d0a 05bc .dw XT_SP0
+003d0b 3a95 .dw XT_SP_STORE
+003d0c 05c9 .dw XT_RP0
+003d0d 3a7f .dw XT_RP_STORE
+003d0e 08d8 .dw XT_LBRACKET
+
+ PFA_QUIT2:
+003d0f 3eb6 .dw XT_STATE
+003d10 3878 .dw XT_FETCH
+003d11 3919 .dw XT_ZEROEQUAL
+003d12 3835 .dw XT_DOCONDBRANCH
+003d13 3d15 DEST(PFA_QUIT4)
+003d14 3ce3 .dw XT_PROMPTREADY
+ PFA_QUIT4:
+003d15 04d0 .dw XT_REFILL
+003d16 3835 .dw XT_DOCONDBRANCH
+003d17 3d27 DEST(PFA_QUIT3)
+003d18 383c .dw XT_DOLITERAL
+003d19 0617 .dw XT_INTERPRET
+003d1a 3d6f .dw XT_CATCH
+003d1b 38b8 .dw XT_QDUP
+003d1c 3835 .dw XT_DOCONDBRANCH
+003d1d 3d27 DEST(PFA_QUIT3)
+003d1e 38b0 .dw XT_DUP
+003d1f 383c .dw XT_DOLITERAL
+003d20 fffe .dw -2
+003d21 396d .dw XT_LESS
+003d22 3835 .dw XT_DOCONDBRANCH
+003d23 3d25 DEST(PFA_QUIT5)
+003d24 3cfe .dw XT_PROMPTERROR
+ PFA_QUIT5:
+003d25 382e .dw XT_DOBRANCH
+003d26 3d07 DEST(PFA_QUIT)
+ PFA_QUIT3:
+003d27 3cd3 .dw XT_PROMPTOK
+003d28 382e .dw XT_DOBRANCH
+003d29 3d0f 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:
+003d2a ff05 .dw $ff05
+003d2b 6170
+003d2c 7375
+003d2d 0065 .db "pause",0
+003d2e 3d02 .dw VE_HEAD
+ .set VE_HEAD = VE_PAUSE
+ XT_PAUSE:
+003d2f 3dfe .dw PFA_DODEFER1
+ PFA_PAUSE:
+003d30 01a3 .dw ram_pause
+003d31 3db3 .dw XT_RDEFERFETCH
+003d32 3dbd .dw XT_RDEFERSTORE
+
+ .dseg
+0001a3 ram_pause: .byte 2
+ .cseg
+ .include "words/cold.asm"
+
+ ; System
+ ; start up amforth.
+ VE_COLD:
+003d33 ff04 .dw $ff04
+003d34 6f63
+003d35 646c .db "cold"
+003d36 3d2a .dw VE_HEAD
+ .set VE_HEAD = VE_COLD
+ XT_COLD:
+003d37 3d38 .dw PFA_COLD
+ PFA_COLD:
+003d38 b6a4 in_ mcu_boot, MCUSR
+003d39 2422 clr zerol
+003d3a 2433 clr zeroh
+003d3b 24bb clr isrflag
+003d3c be24 out_ MCUSR, zerol
+ ; clear RAM
+003d3d e0e0 ldi zl, low(ramstart)
+003d3e e0f1 ldi zh, high(ramstart)
+ clearloop:
+003d3f 9221 st Z+, zerol
+003d40 30e0 cpi zl, low(sram_size+ramstart)
+003d41 f7e9 brne clearloop
+003d42 30fb cpi zh, high(sram_size+ramstart)
+003d43 f7d9 brne clearloop
+ ; init first user data area
+ ; allocate space for User Area
+ .dseg
+0001a5 ram_user1: .byte SYSUSERSIZE + APPUSERSIZE
+ .cseg
+003d44 eae5 ldi zl, low(ram_user1)
+003d45 e0f1 ldi zh, high(ram_user1)
+003d46 012f movw upl, zl
+ ; init return stack pointer
+003d47 ef0f ldi temp0,low(rstackstart)
+003d48 bf0d out_ SPL,temp0
+003d49 8304 std Z+4, temp0
+003d4a e01a ldi temp1,high(rstackstart)
+003d4b bf1e out_ SPH,temp1
+003d4c 8315 std Z+5, temp1
+
+ ; init parameter stack pointer
+003d4d eacf ldi yl,low(stackstart)
+003d4e 83c6 std Z+6, yl
+003d4f e0da ldi yh,high(stackstart)
+003d50 83d7 std Z+7, yh
+
+ ; load Forth IP with starting word
+003d51 e5a9 ldi XL, low(PFA_WARM)
+003d52 e3bd ldi XH, high(PFA_WARM)
+ ; its a far jump...
+003d53 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:
+003d54 ff04 .dw $ff04
+003d55 6177
+003d56 6d72 .db "warm"
+003d57 3d33 .dw VE_HEAD
+ .set VE_HEAD = VE_WARM
+ XT_WARM:
+003d58 3800 .dw DO_COLON
+ PFA_WARM:
+ .endif
+003d59 0289 .dw XT_INIT_RAM
+003d5a 383c .dw XT_DOLITERAL
+003d5b 017b .dw XT_NOOP
+003d5c 383c .dw XT_DOLITERAL
+003d5d 3d2f .dw XT_PAUSE
+003d5e 3dde .dw XT_DEFERSTORE
+003d5f 08d8 .dw XT_LBRACKET
+003d60 3f5b .dw XT_TURNKEY
+003d61 3d06 .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:
+003d62 ff07 .dw $ff07
+003d63 6168
+003d64 646e
+003d65 656c
+003d66 0072 .db "handler",0
+003d67 3d54 .dw VE_HEAD
+ .set VE_HEAD = VE_HANDLER
+ XT_HANDLER:
+003d68 3857 .dw PFA_DOUSER
+ PFA_HANDLER:
+ .endif
+003d69 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:
+003d6a ff05 .dw $ff05
+003d6b 6163
+003d6c 6374
+003d6d 0068 .db "catch",0
+003d6e 3d62 .dw VE_HEAD
+ .set VE_HEAD = VE_CATCH
+ XT_CATCH:
+003d6f 3800 .dw DO_COLON
+ PFA_CATCH:
+ .endif
+
+ ; sp@ >r
+003d70 3a8c .dw XT_SP_FETCH
+003d71 38fe .dw XT_TO_R
+ ; handler @ >r
+003d72 3d68 .dw XT_HANDLER
+003d73 3878 .dw XT_FETCH
+003d74 38fe .dw XT_TO_R
+ ; rp@ handler !
+003d75 3a75 .dw XT_RP_FETCH
+003d76 3d68 .dw XT_HANDLER
+003d77 3880 .dw XT_STORE
+003d78 3829 .dw XT_EXECUTE
+ ; r> handler !
+003d79 38f5 .dw XT_R_FROM
+003d7a 3d68 .dw XT_HANDLER
+003d7b 3880 .dw XT_STORE
+003d7c 38f5 .dw XT_R_FROM
+003d7d 38d8 .dw XT_DROP
+003d7e 3953 .dw XT_ZERO
+003d7f 381f .dw XT_EXIT
+ .include "words/throw.asm"
+
+ ; Exceptions
+ ; throw an exception
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_THROW:
+003d80 ff05 .dw $ff05
+003d81 6874
+003d82 6f72
+003d83 0077 .db "throw",0
+003d84 3d6a .dw VE_HEAD
+ .set VE_HEAD = VE_THROW
+ XT_THROW:
+003d85 3800 .dw DO_COLON
+ PFA_THROW:
+ .endif
+003d86 38b0 .dw XT_DUP
+003d87 3919 .dw XT_ZEROEQUAL
+003d88 3835 .dw XT_DOCONDBRANCH
+003d89 3d8c DEST(PFA_THROW1)
+003d8a 38d8 .dw XT_DROP
+003d8b 381f .dw XT_EXIT
+ PFA_THROW1:
+003d8c 3d68 .dw XT_HANDLER
+003d8d 3878 .dw XT_FETCH
+003d8e 3a7f .dw XT_RP_STORE
+003d8f 38f5 .dw XT_R_FROM
+003d90 3d68 .dw XT_HANDLER
+003d91 3880 .dw XT_STORE
+003d92 38f5 .dw XT_R_FROM
+003d93 38c3 .dw XT_SWAP
+003d94 38fe .dw XT_TO_R
+003d95 3a95 .dw XT_SP_STORE
+003d96 38d8 .dw XT_DROP
+003d97 38f5 .dw XT_R_FROM
+003d98 381f .dw XT_EXIT
+
+
+
+ .include "words/edefer-fetch.asm"
+
+ ; System
+ ; does the real defer@ for eeprom defers
+ VE_EDEFERFETCH:
+003d99 ff07 .dw $ff07
+003d9a 6445
+003d9b 6665
+003d9c 7265
+003d9d 0040 .db "Edefer@",0
+003d9e 3d80 .dw VE_HEAD
+ .set VE_HEAD = VE_EDEFERFETCH
+ XT_EDEFERFETCH:
+003d9f 3800 .dw DO_COLON
+ PFA_EDEFERFETCH:
+003da0 3bca .dw XT_FETCHI
+003da1 3b5e .dw XT_FETCHE
+003da2 381f .dw XT_EXIT
+ .include "words/edefer-store.asm"
+
+ ; System
+ ; does the real defer! for eeprom defers
+ VE_EDEFERSTORE:
+003da3 ff07 .dw $ff07
+003da4 6445
+003da5 6665
+003da6 7265
+003da7 0021 .db "Edefer!",0
+003da8 3d99 .dw VE_HEAD
+ .set VE_HEAD = VE_EDEFERSTORE
+ XT_EDEFERSTORE:
+003da9 3800 .dw DO_COLON
+ PFA_EDEFERSTORE:
+003daa 3bca .dw XT_FETCHI
+003dab 3b3a .dw XT_STOREE
+003dac 381f .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:
+003dad ff07 .dw $ff07
+003dae 6452
+003daf 6665
+003db0 7265
+003db1 0040 .db "Rdefer@",0
+003db2 3da3 .dw VE_HEAD
+ .set VE_HEAD = VE_RDEFERFETCH
+ XT_RDEFERFETCH:
+003db3 3800 .dw DO_COLON
+ PFA_RDEFERFETCH:
+ .endif
+003db4 3bca .dw XT_FETCHI
+003db5 3878 .dw XT_FETCH
+003db6 381f .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:
+003db7 ff07 .dw $ff07
+003db8 6452
+003db9 6665
+003dba 7265
+003dbb 0021 .db "Rdefer!",0
+003dbc 3dad .dw VE_HEAD
+ .set VE_HEAD = VE_RDEFERSTORE
+ XT_RDEFERSTORE:
+003dbd 3800 .dw DO_COLON
+ PFA_RDEFERSTORE:
+ .endif
+003dbe 3bca .dw XT_FETCHI
+003dbf 3880 .dw XT_STORE
+003dc0 381f .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:
+003dc1 ff07 .dw $ff07
+003dc2 6455
+003dc3 6665
+003dc4 7265
+003dc5 0040 .db "Udefer@",0
+003dc6 3db7 .dw VE_HEAD
+ .set VE_HEAD = VE_UDEFERFETCH
+ XT_UDEFERFETCH:
+003dc7 3800 .dw DO_COLON
+ PFA_UDEFERFETCH:
+ .endif
+003dc8 3bca .dw XT_FETCHI
+003dc9 3b01 .dw XT_UP_FETCH
+003dca 399c .dw XT_PLUS
+003dcb 3878 .dw XT_FETCH
+003dcc 381f .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:
+003dcd ff07 .dw $ff07
+003dce 6455
+003dcf 6665
+003dd0 7265
+003dd1 0021 .db "Udefer!",0
+003dd2 3dc1 .dw VE_HEAD
+ .set VE_HEAD = VE_UDEFERSTORE
+ XT_UDEFERSTORE:
+003dd3 3800 .dw DO_COLON
+ PFA_UDEFERSTORE:
+ .endif
+
+003dd4 3bca .dw XT_FETCHI
+003dd5 3b01 .dw XT_UP_FETCH
+003dd6 399c .dw XT_PLUS
+003dd7 3880 .dw XT_STORE
+003dd8 381f .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:
+003dd9 ff06 .dw $ff06
+003dda 6564
+003ddb 6566
+003ddc 2172 .db "defer!"
+003ddd 3dcd .dw VE_HEAD
+ .set VE_HEAD = VE_DEFERSTORE
+ XT_DEFERSTORE:
+003dde 3800 .dw DO_COLON
+ PFA_DEFERSTORE:
+ .endif
+003ddf 3fcf .dw XT_TO_BODY
+003de0 38b0 .dw XT_DUP
+003de1 01a7 .dw XT_ICELLPLUS
+003de2 01a7 .dw XT_ICELLPLUS
+003de3 3bca .dw XT_FETCHI
+003de4 3829 .dw XT_EXECUTE
+003de5 381f .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:
+003de6 ff06 .dw $ff06
+003de7 6564
+003de8 6566
+003de9 4072 .db "defer@"
+003dea 3dd9 .dw VE_HEAD
+ .set VE_HEAD = VE_DEFERFETCH
+ XT_DEFERFETCH:
+003deb 3800 .dw DO_COLON
+ PFA_DEFERFETCH:
+ .endif
+003dec 3fcf .dw XT_TO_BODY
+003ded 38b0 .dw XT_DUP
+003dee 01a7 .dw XT_ICELLPLUS
+003def 3bca .dw XT_FETCHI
+003df0 3829 .dw XT_EXECUTE
+003df1 381f .dw XT_EXIT
+ .include "words/do-defer.asm"
+
+ ; System
+ ; runtime of defer
+ VE_DODEFER:
+003df2 ff07 .dw $ff07
+003df3 6428
+003df4 6665
+003df5 7265
+003df6 0029 .db "(defer)", 0
+003df7 3de6 .dw VE_HEAD
+ .set VE_HEAD = VE_DODEFER
+ XT_DODEFER:
+003df8 3800 .dw DO_COLON
+ PFA_DODEFER:
+003df9 0720 .dw XT_DOCREATE
+003dfa 0880 .dw XT_REVEAL
+003dfb 0743 .dw XT_COMPILE
+003dfc 3dfe .dw PFA_DODEFER1
+003dfd 381f .dw XT_EXIT
+ PFA_DODEFER1:
+003dfe 940e 0899 call_ DO_DODOES
+003e00 38b0 .dw XT_DUP
+003e01 01a7 .dw XT_ICELLPLUS
+003e02 3bca .dw XT_FETCHI
+003e03 3829 .dw XT_EXECUTE
+003e04 3829 .dw XT_EXECUTE
+003e05 381f .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:
+003e06 ff02 .dw $ff02
+003e07 2e75 .db "u."
+003e08 3df2 .dw VE_HEAD
+ .set VE_HEAD = VE_UDOT
+ XT_UDOT:
+003e09 3800 .dw DO_COLON
+ PFA_UDOT:
+ .endif
+003e0a 3953 .dw XT_ZERO
+003e0b 0374 .dw XT_UDDOT
+003e0c 381f .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:
+003e0d ff03 .dw $ff03
+003e0e 2e75
+003e0f 0072 .db "u.r",0
+003e10 3e06 .dw VE_HEAD
+ .set VE_HEAD = VE_UDOTR
+ XT_UDOTR:
+003e11 3800 .dw DO_COLON
+ PFA_UDOTR:
+ .endif
+003e12 3953 .dw XT_ZERO
+003e13 38c3 .dw XT_SWAP
+003e14 037d .dw XT_UDDOTR
+003e15 381f .dw XT_EXIT
+ ; : u.r ( s n -- ) 0 swap ud.r ;
+
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+ .include "words/uslashmod.asm"
+
+ ; Arithmetics
+ ; unsigned division with remainder
+ VE_USLASHMOD:
+003e16 ff05 .dw $ff05
+003e17 2f75
+003e18 6f6d
+003e19 0064 .db "u/mod",0
+003e1a 3e0d .dw VE_HEAD
+ .set VE_HEAD = VE_USLASHMOD
+ XT_USLASHMOD:
+003e1b 3800 .dw DO_COLON
+ PFA_USLASHMOD:
+003e1c 38fe .dw XT_TO_R
+003e1d 3953 .dw XT_ZERO
+003e1e 38f5 .dw XT_R_FROM
+003e1f 39c1 .dw XT_UMSLASHMOD
+003e20 381f .dw XT_EXIT
+ .include "words/negate.asm"
+
+ ; Logic
+ ; 2-complement
+ VE_NEGATE:
+003e21 ff06 .dw $ff06
+003e22 656e
+003e23 6167
+003e24 6574 .db "negate"
+003e25 3e16 .dw VE_HEAD
+ .set VE_HEAD = VE_NEGATE
+ XT_NEGATE:
+003e26 3800 .dw DO_COLON
+ PFA_NEGATE:
+003e27 39fc .dw XT_INVERT
+003e28 3a2e .dw XT_1PLUS
+003e29 381f .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:
+003e2a ff01 .dw $ff01
+003e2b 002f .db "/",0
+003e2c 3e21 .dw VE_HEAD
+ .set VE_HEAD = VE_SLASH
+ XT_SLASH:
+003e2d 3800 .dw DO_COLON
+ PFA_SLASH:
+ .endif
+003e2e 3c48 .dw XT_SLASHMOD
+003e2f 38ef .dw XT_NIP
+003e30 381f .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:
+003e31 ff03 .dw $ff03
+003e32 6f6d
+003e33 0064 .db "mod",0
+003e34 3e2a .dw VE_HEAD
+ .set VE_HEAD = VE_MOD
+ XT_MOD:
+003e35 3800 .dw DO_COLON
+ PFA_MOD:
+ .endif
+003e36 3c48 .dw XT_SLASHMOD
+003e37 38d8 .dw XT_DROP
+003e38 381f .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:
+003e39 ff03 .dw $ff03
+003e3a 696d
+003e3b 006e .db "min",0
+003e3c 3e31 .dw VE_HEAD
+ .set VE_HEAD = VE_MIN
+ XT_MIN:
+003e3d 3800 .dw DO_COLON
+ PFA_MIN:
+ .endif
+003e3e 3ec8 .dw XT_2DUP
+003e3f 3977 .dw XT_GREATER
+003e40 3835 .dw XT_DOCONDBRANCH
+003e41 3e43 DEST(PFA_MIN1)
+003e42 38c3 .dw XT_SWAP
+ PFA_MIN1:
+003e43 38d8 .dw XT_DROP
+003e44 381f .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:
+003e45 ff03 .dw $ff03
+003e46 616d
+003e47 0078 .db "max",0
+003e48 3e39 .dw VE_HEAD
+ .set VE_HEAD = VE_MAX
+ XT_MAX:
+003e49 3800 .dw DO_COLON
+ PFA_MAX:
+
+ .endif
+003e4a 3ec8 .dw XT_2DUP
+003e4b 396d .dw XT_LESS
+003e4c 3835 .dw XT_DOCONDBRANCH
+003e4d 3e4f DEST(PFA_MAX1)
+003e4e 38c3 .dw XT_SWAP
+ PFA_MAX1:
+003e4f 38d8 .dw XT_DROP
+003e50 381f .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:
+003e51 ff06 .dw $ff06
+003e52 6977
+003e53 6874
+003e54 6e69 .db "within"
+003e55 3e45 .dw VE_HEAD
+ .set VE_HEAD = VE_WITHIN
+ XT_WITHIN:
+003e56 3800 .dw DO_COLON
+ PFA_WITHIN:
+ .endif
+003e57 38ce .dw XT_OVER
+003e58 3992 .dw XT_MINUS
+003e59 38fe .dw XT_TO_R
+003e5a 3992 .dw XT_MINUS
+003e5b 38f5 .dw XT_R_FROM
+003e5c 395b .dw XT_ULESS
+003e5d 381f .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:
+003e5e ff0d .dw $ff0d
+003e5f 6873
+003e60 776f
+003e61 772d
+003e62 726f
+003e63 6c64
+003e64 7369
+003e65 0074 .db "show-wordlist",0
+003e66 3e51 .dw VE_HEAD
+ .set VE_HEAD = VE_SHOWWORDLIST
+ XT_SHOWWORDLIST:
+003e67 3800 .dw DO_COLON
+ PFA_SHOWWORDLIST:
+ .endif
+003e68 383c .dw XT_DOLITERAL
+003e69 3e6d .dw XT_SHOWWORD
+003e6a 38c3 .dw XT_SWAP
+003e6b 06c1 .dw XT_TRAVERSEWORDLIST
+003e6c 381f .dw XT_EXIT
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ XT_SHOWWORD:
+003e6d 3800 .dw DO_COLON
+ PFA_SHOWWORD:
+ .endif
+003e6e 06dc .dw XT_NAME2STRING
+003e6f 03ea .dw XT_ITYPE
+003e70 3fad .dw XT_SPACE ; ( -- addr n)
+003e71 394a .dw XT_TRUE
+003e72 381f .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:
+003e73 ff05 .dw $ff05
+003e74 6f77
+003e75 6472
+003e76 0073 .db "words",0
+003e77 3e5e .dw VE_HEAD
+ .set VE_HEAD = VE_WORDS
+ XT_WORDS:
+003e78 3800 .dw DO_COLON
+ PFA_WORDS:
+ .endif
+003e79 383c .dw XT_DOLITERAL
+003e7a 006e .dw CFG_ORDERLISTLEN+2
+003e7b 3b5e .dw XT_FETCHE
+003e7c 3e67 .dw XT_SHOWWORDLIST
+003e7d 381f .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:
+003e7e 0002 .dw $0002
+003e7f 222e .db ".",$22
+003e80 3e73 .dw VE_HEAD
+ .set VE_HEAD = VE_DOTSTRING
+ XT_DOTSTRING:
+003e81 3800 .dw DO_COLON
+ PFA_DOTSTRING:
+ .endif
+003e82 3e89 .dw XT_SQUOTE
+003e83 0743 .dw XT_COMPILE
+003e84 03ea .dw XT_ITYPE
+003e85 381f .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:
+003e86 0002 .dw $0002
+003e87 2273 .db "s",$22
+003e88 3e7e .dw VE_HEAD
+ .set VE_HEAD = VE_SQUOTE
+ XT_SQUOTE:
+003e89 3800 .dw DO_COLON
+ PFA_SQUOTE:
+ .endif
+003e8a 383c .dw XT_DOLITERAL
+003e8b 0022 .dw 34 ; 0x22
+003e8c 0575 .dw XT_PARSE ; ( -- addr n)
+003e8d 3eb6 .dw XT_STATE
+003e8e 3878 .dw XT_FETCH
+003e8f 3835 .dw XT_DOCONDBRANCH
+003e90 3e92 DEST(PFA_SQUOTE1)
+003e91 076f .dw XT_SLITERAL
+ PFA_SQUOTE1:
+003e92 381f .dw XT_EXIT
+ .include "words/fill.asm"
+
+ ; Memory
+ ; fill u bytes memory beginning at a-addr with character c
+ VE_FILL:
+003e93 ff04 .dw $ff04
+003e94 6966
+003e95 6c6c .db "fill"
+003e96 3e86 .dw VE_HEAD
+ .set VE_HEAD = VE_FILL
+ XT_FILL:
+003e97 3800 .dw DO_COLON
+ PFA_FILL:
+003e98 38e0 .dw XT_ROT
+003e99 38e0 .dw XT_ROT
+003e9a 38b8
+003e9b 3835 .dw XT_QDUP,XT_DOCONDBRANCH
+003e9c 3ea4 DEST(PFA_FILL2)
+003e9d 3f98 .dw XT_BOUNDS
+003e9e 3a9a .dw XT_DODO
+ PFA_FILL1:
+003e9f 38b0 .dw XT_DUP
+003ea0 3aab .dw XT_I
+003ea1 388c .dw XT_CSTORE ; ( -- c c-addr)
+003ea2 3ac8 .dw XT_DOLOOP
+003ea3 3e9f .dw PFA_FILL1
+ PFA_FILL2:
+003ea4 38d8 .dw XT_DROP
+003ea5 381f .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:
+003ea6 ff05 .dw $ff05
+003ea7 5f66
+003ea8 7063
+003ea9 0075 .db "f_cpu",0
+003eaa 3e93 .dw VE_HEAD
+ .set VE_HEAD = VE_F_CPU
+ XT_F_CPU:
+003eab 3800 .dw DO_COLON
+ PFA_F_CPU:
+ .endif
+003eac 383c .dw XT_DOLITERAL
+003ead 2400 .dw (F_CPU % 65536)
+003eae 383c .dw XT_DOLITERAL
+003eaf 00f4 .dw (F_CPU / 65536)
+003eb0 381f .dw XT_EXIT
+ .include "words/state.asm"
+
+ ; System Variable
+ ; system state
+ VE_STATE:
+003eb1 ff05 .dw $ff05
+003eb2 7473
+003eb3 7461
+003eb4 0065 .db "state",0
+003eb5 3ea6 .dw VE_HEAD
+ .set VE_HEAD = VE_STATE
+ XT_STATE:
+003eb6 3847 .dw PFA_DOVARIABLE
+ PFA_STATE:
+003eb7 01d1 .dw ram_state
+
+ .dseg
+0001d1 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:
+003eb8 ff04 .dw $ff04
+003eb9 6162
+003eba 6573 .db "base"
+003ebb 3eb1 .dw VE_HEAD
+ .set VE_HEAD = VE_BASE
+ XT_BASE:
+003ebc 3857 .dw PFA_DOUSER
+ PFA_BASE:
+ .endif
+003ebd 000c .dw USER_BASE
+
+ .include "words/cells.asm"
+
+ ; Arithmetics
+ ; n2 is the size in address units of n1 cells
+ VE_CELLS:
+003ebe ff05 .dw $ff05
+003ebf 6563
+003ec0 6c6c
+003ec1 0073 .db "cells",0
+003ec2 3eb8 .dw VE_HEAD
+ .set VE_HEAD = VE_CELLS
+ XT_CELLS:
+003ec3 3a0b .dw PFA_2STAR
+
+ .include "words/2dup.asm"
+
+ ; Stack
+ ; Duplicate the 2 top elements
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_2DUP:
+003ec4 ff04 .dw $ff04
+003ec5 6432
+003ec6 7075 .db "2dup"
+003ec7 3ebe .dw VE_HEAD
+ .set VE_HEAD = VE_2DUP
+ XT_2DUP:
+003ec8 3800 .dw DO_COLON
+ PFA_2DUP:
+ .endif
+
+003ec9 38ce .dw XT_OVER
+003eca 38ce .dw XT_OVER
+003ecb 381f .dw XT_EXIT
+ .include "words/2drop.asm"
+
+ ; Stack
+ ; Remove the 2 top elements
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_2DROP:
+003ecc ff05 .dw $ff05
+003ecd 6432
+003ece 6f72
+003ecf 0070 .db "2drop",0
+003ed0 3ec4 .dw VE_HEAD
+ .set VE_HEAD = VE_2DROP
+ XT_2DROP:
+003ed1 3800 .dw DO_COLON
+ PFA_2DROP:
+ .endif
+003ed2 38d8 .dw XT_DROP
+003ed3 38d8 .dw XT_DROP
+003ed4 381f .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:
+003ed5 ff04 .dw $ff04
+003ed6 7574
+003ed7 6b63 .db "tuck"
+003ed8 3ecc .dw VE_HEAD
+ .set VE_HEAD = VE_TUCK
+ XT_TUCK:
+003ed9 3800 .dw DO_COLON
+ PFA_TUCK:
+ .endif
+003eda 38c3 .dw XT_SWAP
+003edb 38ce .dw XT_OVER
+003edc 381f .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:
+003edd ff03 .dw $ff03
+003ede 693e
+003edf 006e .db ">in",0
+003ee0 3ed5 .dw VE_HEAD
+ .set VE_HEAD = VE_TO_IN
+ XT_TO_IN:
+003ee1 3857 .dw PFA_DOUSER
+ PFA_TO_IN:
+ .endif
+003ee2 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:
+003ee3 ff03 .dw $ff03
+003ee4 6170
+003ee5 0064 .db "pad",0
+003ee6 3edd .dw VE_HEAD
+ .set VE_HEAD = VE_PAD
+ XT_PAD:
+003ee7 3800 .dw DO_COLON
+ PFA_PAD:
+ .endif
+003ee8 3f22 .dw XT_HERE
+003ee9 383c .dw XT_DOLITERAL
+003eea 0028 .dw 40
+003eeb 399c .dw XT_PLUS
+003eec 381f .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:
+003eed ff04 .dw $ff04
+003eee 6d65
+003eef 7469 .db "emit"
+003ef0 3ee3 .dw VE_HEAD
+ .set VE_HEAD = VE_EMIT
+ XT_EMIT:
+003ef1 3dfe .dw PFA_DODEFER1
+ PFA_EMIT:
+ .endif
+003ef2 000e .dw USER_EMIT
+003ef3 3dc7 .dw XT_UDEFERFETCH
+003ef4 3dd3 .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:
+003ef5 ff05 .dw $ff05
+003ef6 6d65
+003ef7 7469
+003ef8 003f .db "emit?",0
+003ef9 3eed .dw VE_HEAD
+ .set VE_HEAD = VE_EMITQ
+ XT_EMITQ:
+003efa 3dfe .dw PFA_DODEFER1
+ PFA_EMITQ:
+ .endif
+003efb 0010 .dw USER_EMITQ
+003efc 3dc7 .dw XT_UDEFERFETCH
+003efd 3dd3 .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:
+003efe ff03 .dw $ff03
+003eff 656b
+003f00 0079 .db "key",0
+003f01 3ef5 .dw VE_HEAD
+ .set VE_HEAD = VE_KEY
+ XT_KEY:
+003f02 3dfe .dw PFA_DODEFER1
+ PFA_KEY:
+ .endif
+003f03 0012 .dw USER_KEY
+003f04 3dc7 .dw XT_UDEFERFETCH
+003f05 3dd3 .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:
+003f06 ff04 .dw $ff04
+003f07 656b
+003f08 3f79 .db "key?"
+003f09 3efe .dw VE_HEAD
+ .set VE_HEAD = VE_KEYQ
+ XT_KEYQ:
+003f0a 3dfe .dw PFA_DODEFER1
+ PFA_KEYQ:
+ .endif
+003f0b 0014 .dw USER_KEYQ
+003f0c 3dc7 .dw XT_UDEFERFETCH
+003f0d 3dd3 .dw XT_UDEFERSTORE
+
+ .include "words/dp.asm"
+
+ ; System Value
+ ; address of the next free dictionary cell
+ VE_DP:
+003f0e ff02 .dw $ff02
+003f0f 7064 .db "dp"
+003f10 3f06 .dw VE_HEAD
+ .set VE_HEAD = VE_DP
+ XT_DP:
+003f11 386e .dw PFA_DOVALUE1
+ PFA_DP:
+003f12 0058 .dw CFG_DP
+003f13 3d9f .dw XT_EDEFERFETCH
+003f14 3da9 .dw XT_EDEFERSTORE
+ .include "words/ehere.asm"
+
+ ; System Value
+ ; address of the next free address in eeprom
+ VE_EHERE:
+003f15 ff05 .dw $ff05
+003f16 6865
+003f17 7265
+003f18 0065 .db "ehere",0
+003f19 3f0e .dw VE_HEAD
+ .set VE_HEAD = VE_EHERE
+ XT_EHERE:
+003f1a 386e .dw PFA_DOVALUE1
+ PFA_EHERE:
+003f1b 005c .dw EE_EHERE
+003f1c 3d9f .dw XT_EDEFERFETCH
+003f1d 3da9 .dw XT_EDEFERSTORE
+ .include "words/here.asm"
+
+ ; System Value
+ ; address of the next free data space (RAM) cell
+ VE_HERE:
+003f1e ff04 .dw $ff04
+003f1f 6568
+003f20 6572 .db "here"
+003f21 3f15 .dw VE_HEAD
+ .set VE_HEAD = VE_HERE
+ XT_HERE:
+003f22 386e .dw PFA_DOVALUE1
+ PFA_HERE:
+003f23 005a .dw EE_HERE
+003f24 3d9f .dw XT_EDEFERFETCH
+003f25 3da9 .dw XT_EDEFERSTORE
+ .include "words/allot.asm"
+
+ ; System
+ ; allocate or release memory in RAM
+ VE_ALLOT:
+003f26 ff05 .dw $ff05
+003f27 6c61
+003f28 6f6c
+003f29 0074 .db "allot",0
+003f2a 3f1e .dw VE_HEAD
+ .set VE_HEAD = VE_ALLOT
+ XT_ALLOT:
+003f2b 3800 .dw DO_COLON
+ PFA_ALLOT:
+003f2c 3f22 .dw XT_HERE
+003f2d 399c .dw XT_PLUS
+003f2e 0195 .dw XT_DOTO
+003f2f 3f23 .dw PFA_HERE
+003f30 381f .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:
+003f31 ff03 .dw $ff03
+003f32 6962
+003f33 006e .db "bin",0
+003f34 3f26 .dw VE_HEAD
+ .set VE_HEAD = VE_BIN
+ XT_BIN:
+003f35 3800 .dw DO_COLON
+ PFA_BIN:
+ .endif
+003f36 3fea .dw XT_TWO
+003f37 3ebc .dw XT_BASE
+003f38 3880 .dw XT_STORE
+003f39 381f .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:
+003f3a ff07 .dw $ff07
+003f3b 6564
+003f3c 6963
+003f3d 616d
+003f3e 006c .db "decimal",0
+003f3f 3f31 .dw VE_HEAD
+ .set VE_HEAD = VE_DECIMAL
+ XT_DECIMAL:
+003f40 3800 .dw DO_COLON
+ PFA_DECIMAL:
+ .endif
+003f41 383c .dw XT_DOLITERAL
+003f42 000a .dw 10
+003f43 3ebc .dw XT_BASE
+003f44 3880 .dw XT_STORE
+003f45 381f .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:
+003f46 ff03 .dw $ff03
+003f47 6568
+003f48 0078 .db "hex",0
+003f49 3f3a .dw VE_HEAD
+ .set VE_HEAD = VE_HEX
+ XT_HEX:
+003f4a 3800 .dw DO_COLON
+ PFA_HEX:
+ .endif
+003f4b 383c .dw XT_DOLITERAL
+003f4c 0010 .dw 16
+003f4d 3ebc .dw XT_BASE
+003f4e 3880 .dw XT_STORE
+003f4f 381f .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:
+003f50 ff02 .dw $ff02
+003f51 6c62 .db "bl"
+003f52 3f46 .dw VE_HEAD
+ .set VE_HEAD = VE_BL
+ XT_BL:
+003f53 3847 .dw PFA_DOVARIABLE
+ PFA_BL:
+ .endif
+003f54 0020 .dw 32
+
+ .include "words/turnkey.asm"
+
+ ; System Value
+ ; Deferred action during startup/reset
+ VE_TURNKEY:
+003f55 ff07 .dw $ff07
+003f56 7574
+003f57 6e72
+003f58 656b
+003f59 0079 .db "turnkey",0
+003f5a 3f50 .dw VE_HEAD
+ .set VE_HEAD = VE_TURNKEY
+ XT_TURNKEY:
+003f5b 3dfe .dw PFA_DODEFER1
+ PFA_TURNKEY:
+003f5c 0064 .dw CFG_TURNKEY
+003f5d 3d9f .dw XT_EDEFERFETCH
+003f5e 3da9 .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:
+003f5f ff07 .dw $ff07
+003f60 6f74
+003f61 7075
+003f62 6570
+003f63 0072 .db "toupper",0
+003f64 3f55 .dw VE_HEAD
+ .set VE_HEAD = VE_TOUPPER
+ XT_TOUPPER:
+003f65 3800 .dw DO_COLON
+ PFA_TOUPPER:
+ .endif
+003f66 38b0 .dw XT_DUP
+003f67 383c .dw XT_DOLITERAL
+003f68 0061 .dw 'a'
+003f69 383c .dw XT_DOLITERAL
+003f6a 007b .dw 'z'+1
+003f6b 3e56 .dw XT_WITHIN
+003f6c 3835 .dw XT_DOCONDBRANCH
+003f6d 3f71 DEST(PFA_TOUPPER0)
+003f6e 383c .dw XT_DOLITERAL
+003f6f 00df .dw 223 ; inverse of 0x20: 0xdf
+003f70 3a12 .dw XT_AND
+ PFA_TOUPPER0:
+003f71 381f .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:
+003f72 ff07 .dw $ff07
+003f73 6f74
+003f74 6f6c
+003f75 6577
+003f76 0072 .db "tolower",0
+003f77 3f5f .dw VE_HEAD
+ .set VE_HEAD = VE_TOLOWER
+ XT_TOLOWER:
+003f78 3800 .dw DO_COLON
+ PFA_TOLOWER:
+ .endif
+003f79 38b0 .dw XT_DUP
+003f7a 383c .dw XT_DOLITERAL
+003f7b 0041 .dw 'A'
+003f7c 383c .dw XT_DOLITERAL
+003f7d 005b .dw 'Z'+1
+003f7e 3e56 .dw XT_WITHIN
+003f7f 3835 .dw XT_DOCONDBRANCH
+003f80 3f84 DEST(PFA_TOLOWER0)
+003f81 383c .dw XT_DOLITERAL
+003f82 0020 .dw 32
+003f83 3a1b .dw XT_OR
+ PFA_TOLOWER0:
+003f84 381f .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:
+003f85 ff06 .dw $ff06
+003f86 733f
+003f87 6174
+003f88 6b63 .db "?stack"
+003f89 3f72 .dw VE_HEAD
+ .set VE_HEAD = VE_QSTACK
+ XT_QSTACK:
+003f8a 3800 .dw DO_COLON
+ PFA_QSTACK:
+ .endif
+003f8b 05d4 .dw XT_DEPTH
+003f8c 3920 .dw XT_ZEROLESS
+003f8d 3835 .dw XT_DOCONDBRANCH
+003f8e 3f92 DEST(PFA_QSTACK1)
+003f8f 383c .dw XT_DOLITERAL
+003f90 fffc .dw -4
+003f91 3d85 .dw XT_THROW
+ PFA_QSTACK1:
+003f92 381f .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:
+003f93 ff06 .dw $ff06
+003f94 6f62
+003f95 6e75
+003f96 7364 .db "bounds"
+003f97 3f85 .dw VE_HEAD
+ .set VE_HEAD = VE_BOUNDS
+ XT_BOUNDS:
+003f98 3800 .dw DO_COLON
+ PFA_BOUNDS:
+ .endif
+003f99 38ce .dw XT_OVER
+003f9a 399c .dw XT_PLUS
+003f9b 38c3 .dw XT_SWAP
+003f9c 381f .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:
+003f9d ff02 .dw 0xff02
+003f9e 7263 .db "cr"
+003f9f 3f93 .dw VE_HEAD
+ .set VE_HEAD = VE_CR
+ XT_CR:
+003fa0 3800 .dw DO_COLON
+ PFA_CR:
+ .endif
+
+003fa1 383c .dw XT_DOLITERAL
+003fa2 000d .dw 13
+003fa3 3ef1 .dw XT_EMIT
+003fa4 383c .dw XT_DOLITERAL
+003fa5 000a .dw 10
+003fa6 3ef1 .dw XT_EMIT
+003fa7 381f .dw XT_EXIT
+ .include "words/space.asm"
+
+ ; Character IO
+ ; emits a space (bl)
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_SPACE:
+003fa8 ff05 .dw $ff05
+003fa9 7073
+003faa 6361
+003fab 0065 .db "space",0
+003fac 3f9d .dw VE_HEAD
+ .set VE_HEAD = VE_SPACE
+ XT_SPACE:
+003fad 3800 .dw DO_COLON
+ PFA_SPACE:
+ .endif
+003fae 3f53 .dw XT_BL
+003faf 3ef1 .dw XT_EMIT
+003fb0 381f .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:
+003fb1 ff06 .dw $ff06
+003fb2 7073
+003fb3 6361
+003fb4 7365 .db "spaces"
+003fb5 3fa8 .dw VE_HEAD
+ .set VE_HEAD = VE_SPACES
+ XT_SPACES:
+003fb6 3800 .dw DO_COLON
+ PFA_SPACES:
+
+ .endif
+ ;C SPACES n -- output n spaces
+ ; BEGIN DUP 0> WHILE SPACE 1- REPEAT DROP ;
+003fb7 3953
+003fb8 3e49 .DW XT_ZERO, XT_MAX
+003fb9 38b0
+003fba 3835 SPCS1: .DW XT_DUP,XT_DOCONDBRANCH
+003fbb 3fc0 DEST(SPCS2)
+003fbc 3fad
+003fbd 3a34
+003fbe 382e .DW XT_SPACE,XT_1MINUS,XT_DOBRANCH
+003fbf 3fb9 DEST(SPCS1)
+003fc0 38d8
+003fc1 381f 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:
+003fc2 ff03 .dw $ff03
+003fc3 3e73
+003fc4 0064 .db "s>d",0
+003fc5 3fb1 .dw VE_HEAD
+ .set VE_HEAD = VE_S2D
+ XT_S2D:
+003fc6 3800 .dw DO_COLON
+ PFA_S2D:
+ .endif
+003fc7 38b0 .dw XT_DUP
+003fc8 3920 .dw XT_ZEROLESS
+003fc9 381f .dw XT_EXIT
+ .include "words/to-body.asm"
+
+ ; Core
+ ; get body from XT
+ VE_TO_BODY:
+003fca ff05 .dw $ff05
+003fcb 623e
+003fcc 646f
+003fcd 0079 .db ">body",0
+003fce 3fc2 .dw VE_HEAD
+ .set VE_HEAD = VE_TO_BODY
+ XT_TO_BODY:
+003fcf 3a2f .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:
+003fd0 0008 .dw $0008
+003fd1 6c32
+003fd2 7469
+003fd3 7265
+003fd4 6c61 .db "2literal"
+003fd5 3fca .dw VE_HEAD
+ .set VE_HEAD = VE_2LITERAL
+ XT_2LITERAL:
+003fd6 3800 .dw DO_COLON
+ PFA_2LITERAL:
+ .endif
+003fd7 38c3 .dw XT_SWAP
+003fd8 0764 .dw XT_LITERAL
+003fd9 0764 .dw XT_LITERAL
+003fda 381f .dw XT_EXIT
+ .include "words/equal.asm"
+
+ ; Compare
+ ; compares two values for equality
+ VE_EQUAL:
+003fdb ff01 .dw $ff01
+003fdc 003d .db "=",0
+003fdd 3fd0 .dw VE_HEAD
+ .set VE_HEAD = VE_EQUAL
+ XT_EQUAL:
+003fde 3800 .dw DO_COLON
+ PFA_EQUAL:
+003fdf 3992 .dw XT_MINUS
+003fe0 3919 .dw XT_ZEROEQUAL
+003fe1 381f .dw XT_EXIT
+ .include "words/num-constants.asm"
+
+ .endif
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_ONE:
+003fe2 ff01 .dw $ff01
+003fe3 0031 .db "1",0
+003fe4 3fdb .dw VE_HEAD
+ .set VE_HEAD = VE_ONE
+ XT_ONE:
+003fe5 3847 .dw PFA_DOVARIABLE
+ PFA_ONE:
+ .endif
+003fe6 0001 .DW 1
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_TWO:
+003fe7 ff01 .dw $ff01
+003fe8 0032 .db "2",0
+003fe9 3fe2 .dw VE_HEAD
+ .set VE_HEAD = VE_TWO
+ XT_TWO:
+003fea 3847 .dw PFA_DOVARIABLE
+ PFA_TWO:
+ .endif
+003feb 0002 .DW 2
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_MINUSONE:
+003fec ff02 .dw $ff02
+003fed 312d .db "-1"
+003fee 3fe7 .dw VE_HEAD
+ .set VE_HEAD = VE_MINUSONE
+ XT_MINUSONE:
+003fef 3847 .dw PFA_DOVARIABLE
+ PFA_MINUSONE:
+ .endif
+003ff0 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"
+000056 ff ff
+ ; some configs
+000058 a1 0a CFG_DP: .dw DPSTART ; Dictionary Pointer
+00005a d3 01 EE_HERE: .dw HERESTART ; Memory Allocation
+00005c b0 00 EE_EHERE: .dw EHERESTART ; EEProm Memory Allocation
+00005e b5 09 CFG_WLSCOPE: .dw XT_GET_CURRENT ; default wordlist scope
+000060 7e 00 CFG_FORTHRECOGNIZER: .dw CFG_RECOGNIZERLISTLEN ; Recognizer word set
+ ; LEAVE stack is between data stack and return stack.
+000062 b0 0a CFG_LP0: .dw stackstart+1
+000064 93 0a CFG_TURNKEY: .dw XT_APPLTURNKEY ; TURNKEY
+000066 e6 02 CFG_ENVIRONMENT:.dw VE_ENVHEAD ; environmental queries
+000068 6a 00 CFG_CURRENT: .dw CFG_FORTHWORDLIST ; forth-wordlist
+00006a ec 3f CFG_FORTHWORDLIST:.dw VE_HEAD ; pre-defined (compiled in) wordlist
+ CFG_ORDERLISTLEN:
+00006c 01 00 .dw 1
+ CFG_ORDERLIST: ; list of wordlist id, exactly numwordlist entries
+00006e 6a 00 .dw CFG_FORTHWORDLIST ; get/set-order
+000070 .byte (NUMWORDLISTS-1)*CELLSIZE ; one slot is already used
+ CFG_RECOGNIZERLISTLEN:
+00007e 02 00 .dw 2
+ CFG_RECOGNIZERLIST:
+000080 57 06 .dw XT_REC_FIND
+000082 43 06 .dw XT_REC_NUM
+000084 .byte (NUMRECOGNIZERS-2)*CELLSIZE ; two slots are already used
+
+ EE_STOREI:
+000088 7d 3b .dw XT_DO_STOREI ; Store a cell into flash
+
+ ; MARKER saves everything up to here. Nothing beyond gets saved
+ EE_MARKER:
+00008a 8a 00 .dw EE_MARKER
+
+ ; default user area
+ EE_INITUSER:
+00008c 00 00 .dw 0 ; USER_STATE
+00008e 00 00 .dw 0 ; USER_FOLLOWER
+000090 ff 0a .dw rstackstart ; USER_RP
+000092 af 0a .dw stackstart ; USER_SP0
+000094 af 0a .dw stackstart ; USER_SP
+
+000096 00 00 .dw 0 ; USER_HANDLER
+000098 0a 00 .dw 10 ; USER_BASE
+
+00009a c5 00 .dw XT_TX ; USER_EMIT
+00009c d3 00 .dw XT_TXQ ; USER_EMITQ
+00009e 9a 00 .dw XT_RX ; USER_KEY
+0000a0 b5 00 .dw XT_RXQ ; USER_KEYQ
+0000a2 5e 02 .dw XT_SOURCETIB ; USER_SOURCE
+0000a4 00 00 .dw 0 ; USER_G_IN
+0000a6 4b 02 .dw XT_REFILLTIB ; USER_REFILL
+0000a8 c8 3c .dw XT_DEFAULT_PROMPTOK
+0000aa e7 3c .dw XT_DEFAULT_PROMPTERROR
+0000ac d7 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:
+0000ae 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
+
+"ATmega32U4" register use summary:
+r0 : 25 r1 : 5 r2 : 9 r3 : 12 r4 : 4 r5 : 1 r6 : 0 r7 : 0
+r8 : 0 r9 : 0 r10: 1 r11: 6 r12: 0 r13: 0 r14: 22 r15: 20
+r16: 78 r17: 57 r18: 52 r19: 37 r20: 13 r21: 11 r22: 11 r23: 3
+r24: 187 r25: 133 r26: 28 r27: 17 r28: 7 r29: 4 r30: 78 r31: 40
+x : 4 y : 203 z : 41
+Registers used: 29 out of 35 (82.9%)
+
+"ATmega32U4" instruction use summary:
+.lds : 0 .sts : 0 adc : 22 add : 17 adiw : 17 and : 4
+andi : 3 asr : 2 bclr : 0 bld : 0 brbc : 2 brbs : 7
+brcc : 2 brcs : 1 break : 0 breq : 6 brge : 1 brhc : 0
+brhs : 0 brid : 0 brie : 0 brlo : 1 brlt : 3 brmi : 3
+brne : 13 brpl : 0 brsh : 0 brtc : 0 brts : 0 brvc : 0
+brvs : 2 bset : 0 bst : 0 call : 2 cbi : 0 cbr : 0
+clc : 1 clh : 0 cli : 5 cln : 0 clr : 13 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 : 14 inc : 3 jmp : 7
+ld : 136 ldd : 4 ldi : 27 lds : 1 lpm : 16 lsl : 14
+lsr : 2 mov : 15 movw : 65 mul : 5 muls : 1 mulsu : 2
+neg : 0 nop : 0 or : 9 ori : 1 out : 16 pop : 45
+push : 39 rcall : 55 ret : 6 reti : 1 rjmp : 103 rol : 23
+ror : 5 sbc : 9 sbci : 3 sbi : 3 sbic : 3 sbis : 0
+sbiw : 7 sbr : 0 sbrc : 4 sbrs : 3 sec : 1 seh : 0
+sei : 1 sen : 0 ser : 3 ses : 0 set : 0 sev : 0
+sez : 0 sleep : 0 spm : 2 st : 74 std : 8 sts : 1
+sub : 6 subi : 3 swap : 0 tst : 0 wdr : 0
+Instructions used: 70 out of 113 (61.9%)
+
+"ATmega32U4" memory use summary [bytes]:
+Segment Begin End Code Data Used Size Use%
+---------------------------------------------------------------
+[.cseg] 0x000000 0x007fe2 1868 11624 13492 32768 41.2%
+[.dseg] 0x000100 0x0001d3 0 211 211 2560 8.2%
+[.eseg] 0x000000 0x0000b0 0 176 176 1024 17.2%
+
+Assembly complete, 0 errors, 8 warnings
diff --git a/amforth-6.5/appl/arduino/leonardo.map b/amforth-6.5/appl/arduino/leonardo.map
new file mode 100644
index 0000000..621045c
--- /dev/null
+++ b/amforth-6.5/appl/arduino/leonardo.map
@@ -0,0 +1,2333 @@
+
+AVRASM ver. 2.1.52 leonardo.asm Sun Apr 30 20:10:13 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 00000087
+EQU PLLCSR 00000029
+EQU PLLFRQ 00000032
+EQU UEINT 000000f4
+EQU UEBCHX 000000f3
+EQU UEBCLX 000000f2
+EQU UEDATX 000000f1
+EQU UEIENX 000000f0
+EQU UESTA1X 000000ef
+EQU UESTA0X 000000ee
+EQU UECFG1X 000000ed
+EQU UECFG0X 000000ec
+EQU UECONX 000000eb
+EQU UERST 000000ea
+EQU UENUM 000000e9
+EQU UEINTX 000000e8
+EQU UDMFN 000000e6
+EQU UDFNUMH 000000e5
+EQU UDFNUML 000000e4
+EQU UDADDR 000000e3
+EQU UDIEN 000000e2
+EQU UDINT 000000e1
+EQU UDCON 000000e0
+EQU USBINT 000000da
+EQU USBSTA 000000d9
+EQU USBCON 000000d8
+EQU UHWCON 000000d7
+EQU UDR1 000000ce
+EQU UBRR1L 000000cc
+EQU UBRR1H 000000cd
+EQU UCSR1C 000000ca
+EQU UCSR1B 000000c9
+EQU UCSR1A 000000c8
+EQU TWAMR 000000bd
+EQU TWCR 000000bc
+EQU TWDR 000000bb
+EQU TWAR 000000ba
+EQU TWSR 000000b9
+EQU TWBR 000000b8
+EQU OCR3CL 0000009c
+EQU OCR3CH 0000009d
+EQU OCR3BL 0000009a
+EQU OCR3BH 0000009b
+EQU OCR3AL 00000098
+EQU OCR3AH 00000099
+EQU ICR3L 00000096
+EQU ICR3H 00000097
+EQU TCNT3L 00000094
+EQU TCNT3H 00000095
+EQU TCCR3C 00000092
+EQU TCCR3B 00000091
+EQU TCCR3A 00000090
+EQU OCR1CL 0000008c
+EQU OCR1CH 0000008d
+EQU OCR1BL 0000008a
+EQU OCR1BH 0000008b
+EQU OCR1AL 00000088
+EQU OCR1AH 00000089
+EQU ICR1L 00000086
+EQU ICR1H 00000087
+EQU TCNT1L 00000084
+EQU TCNT1H 00000085
+EQU TCCR1C 00000082
+EQU TCCR1B 00000081
+EQU TCCR1A 00000080
+EQU DIDR1 0000007f
+EQU DIDR0 0000007e
+EQU DIDR2 0000007d
+EQU ADMUX 0000007c
+EQU ADCSRB 0000007b
+EQU ADCSRA 0000007a
+EQU ADCH 00000079
+EQU ADCL 00000078
+EQU TIMSK4 00000072
+EQU TIMSK3 00000071
+EQU TIMSK1 0000006f
+EQU TIMSK0 0000006e
+EQU PCMSK0 0000006b
+EQU EICRB 0000006a
+EQU EICRA 00000069
+EQU PCICR 00000068
+EQU OSCCAL 00000066
+EQU RCCTRL 00000067
+EQU PRR1 00000065
+EQU PRR0 00000064
+EQU CLKPR 00000061
+EQU WDTCSR 00000060
+EQU SREG 0000003f
+EQU SPL 0000003d
+EQU SPH 0000003e
+EQU EIND 0000003c
+EQU 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 TIFR4 00000019
+EQU TIFR3 00000018
+EQU TIFR2 00000017
+EQU TIFR1 00000016
+EQU TIFR0 00000015
+EQU PORTF 00000011
+EQU DDRF 00000010
+EQU PINF 0000000f
+EQU PORTE 0000000e
+EQU DDRE 0000000d
+EQU PINE 0000000c
+EQU PORTD 0000000b
+EQU DDRD 0000000a
+EQU PIND 00000009
+EQU PORTC 00000008
+EQU DDRC 00000007
+EQU PINC 00000006
+EQU PORTB 00000005
+EQU DDRB 00000004
+EQU PINB 00000003
+EQU DT4 000000d4
+EQU OCR4D 000000d2
+EQU OCR4C 000000d1
+EQU OCR4B 000000d0
+EQU OCR4A 000000cf
+EQU TCCR4E 000000c4
+EQU TCCR4D 000000c3
+EQU TCCR4C 000000c2
+EQU TCCR4B 000000c1
+EQU TCCR4A 000000c0
+EQU TC4H 000000bf
+EQU TCNT4 000000be
+EQU CLKSEL1 000000c6
+EQU CLKSEL0 000000c5
+EQU CLKSTA 000000c7
+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 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 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 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 SPMEN 00000000
+EQU PGERS 00000001
+EQU PGWRT 00000002
+EQU BLBSET 00000003
+EQU RWWSRE 00000004
+EQU SIGRD 00000005
+EQU RWWSB 00000006
+EQU SPMIE 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 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 TOIE3 00000000
+EQU OCIE3A 00000001
+EQU OCIE3B 00000002
+EQU OCIE3C 00000003
+EQU ICIE3 00000005
+EQU TOV3 00000000
+EQU OCF3A 00000001
+EQU OCF3B 00000002
+EQU OCF3C 00000003
+EQU ICF3 00000005
+EQU WGM30 00000000
+EQU WGM31 00000001
+EQU COM3C0 00000002
+EQU COM3C1 00000003
+EQU COM3B0 00000004
+EQU COM3B1 00000005
+EQU COM3A0 00000006
+EQU COM3A1 00000007
+EQU CS30 00000000
+EQU CS31 00000001
+EQU CS32 00000002
+EQU WGM32 00000003
+EQU WGM33 00000004
+EQU ICES3 00000006
+EQU ICNC3 00000007
+EQU FOC3C 00000005
+EQU FOC3B 00000006
+EQU FOC3A 00000007
+EQU TOIE1 00000000
+EQU OCIE1A 00000001
+EQU OCIE1B 00000002
+EQU OCIE1C 00000003
+EQU ICIE1 00000005
+EQU TOV1 00000000
+EQU OCF1A 00000001
+EQU OCF1B 00000002
+EQU OCF1C 00000003
+EQU ICF1 00000005
+EQU WGM10 00000000
+EQU WGM11 00000001
+EQU COM1C0 00000002
+EQU COM1C1 00000003
+EQU COM1B0 00000004
+EQU COM1B1 00000005
+EQU COM1A0 00000006
+EQU COM1A1 00000007
+EQU CS10 00000000
+EQU CS11 00000001
+EQU CS12 00000002
+EQU WGM12 00000003
+EQU WGM13 00000004
+EQU ICES1 00000006
+EQU ICNC1 00000007
+EQU FOC1C 00000005
+EQU FOC1B 00000006
+EQU FOC1A 00000007
+EQU OCDR0 00000000
+EQU OCDR1 00000001
+EQU OCDR2 00000002
+EQU OCDR3 00000003
+EQU OCDR4 00000004
+EQU OCDR5 00000005
+EQU OCDR6 00000006
+EQU OCDR7 00000007
+EQU IDRD 00000007
+EQU JTD 00000007
+EQU JTRF 00000004
+EQU ISC00 00000000
+EQU ISC01 00000001
+EQU ISC10 00000002
+EQU ISC11 00000003
+EQU ISC20 00000004
+EQU ISC21 00000005
+EQU ISC30 00000006
+EQU ISC31 00000007
+EQU ISC40 00000000
+EQU ISC41 00000001
+EQU ISC50 00000002
+EQU ISC51 00000003
+EQU ISC60 00000004
+EQU ISC61 00000005
+EQU ISC70 00000006
+EQU ISC71 00000007
+EQU INT0 00000000
+EQU INT1 00000001
+EQU INT2 00000002
+EQU INT3 00000003
+EQU INT4 00000004
+EQU INT5 00000005
+EQU INT6 00000006
+EQU INT7 00000007
+EQU INTF0 00000000
+EQU INTF1 00000001
+EQU INTF2 00000002
+EQU INTF3 00000003
+EQU INTF4 00000004
+EQU INTF5 00000005
+EQU INTF6 00000006
+EQU INTF7 00000007
+EQU PCIE0 00000000
+EQU PCIF0 00000000
+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 DT4L0 00000000
+EQU DT4L1 00000001
+EQU DT4L2 00000002
+EQU DT4L3 00000003
+EQU DT4L4 00000004
+EQU DT4L5 00000005
+EQU DT4L6 00000006
+EQU DT4L7 00000007
+EQU TOV4 00000002
+EQU OCF4B 00000005
+EQU OCF4A 00000006
+EQU OCF4D 00000007
+EQU TOIE4 00000002
+EQU OCIE4B 00000005
+EQU OCIE4A 00000006
+EQU OCIE4D 00000007
+EQU OCR4D0 00000000
+EQU OCR4D1 00000001
+EQU OCR4D2 00000002
+EQU OCR4D3 00000003
+EQU OCR4D4 00000004
+EQU OCR4D5 00000005
+EQU OCR4D6 00000006
+EQU OCR4D7 00000007
+EQU OCR4C0 00000000
+EQU OCR4C1 00000001
+EQU OCR4C2 00000002
+EQU OCR4C3 00000003
+EQU OCR4C4 00000004
+EQU OCR4C5 00000005
+EQU OCR4C6 00000006
+EQU OCR4C7 00000007
+EQU OCR4B0 00000000
+EQU OCR4B1 00000001
+EQU OCR4B2 00000002
+EQU OCR4B3 00000003
+EQU OCR4B4 00000004
+EQU OCR4B5 00000005
+EQU OCR4B6 00000006
+EQU OCR4B7 00000007
+EQU OCR4A0 00000000
+EQU OCR4A1 00000001
+EQU OCR4A2 00000002
+EQU OCR4A3 00000003
+EQU OCR4A4 00000004
+EQU OCR4A5 00000005
+EQU OCR4A6 00000006
+EQU OCR4A7 00000007
+EQU TC48 00000000
+EQU TC49 00000001
+EQU TC410 00000002
+EQU TC40 00000000
+EQU TC41 00000001
+EQU TC42 00000002
+EQU TC43 00000003
+EQU TC44 00000004
+EQU TC45 00000005
+EQU TC46 00000006
+EQU TC47 00000007
+EQU OC4OE0 00000000
+EQU OC4OE1 00000001
+EQU OC4OE2 00000002
+EQU OC4OE3 00000003
+EQU OC4OE4 00000004
+EQU OC4OE5 00000005
+EQU ENHC4 00000006
+EQU TLOCK4 00000007
+EQU WGM40 00000000
+EQU WGM41 00000001
+EQU FPF4 00000002
+EQU FPAC4 00000003
+EQU FPES4 00000004
+EQU FPNC4 00000005
+EQU FPEN4 00000006
+EQU FPIE4 00000007
+EQU PWM4D 00000000
+EQU FOC4D 00000001
+EQU COM4D0 00000002
+EQU COM4D1 00000003
+EQU COM4B0S 00000004
+EQU COM4B1S 00000005
+EQU COM4A0S 00000006
+EQU COM4A1S 00000007
+EQU CS40 00000000
+EQU CS41 00000001
+EQU CS42 00000002
+EQU CS43 00000003
+EQU DTPS40 00000004
+EQU DTPS41 00000005
+EQU PSR4 00000006
+EQU PWM4X 00000007
+EQU PWM4B 00000000
+EQU PWM4A 00000001
+EQU FOC4B 00000002
+EQU FOC4A 00000003
+EQU COM4B0 00000004
+EQU COM4B1 00000005
+EQU COM4A0 00000006
+EQU COM4A1 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 PORTC6 00000006
+EQU PC6 00000006
+EQU PORTC7 00000007
+EQU PC7 00000007
+EQU DDC6 00000006
+EQU DDC7 00000007
+EQU PINC6 00000006
+EQU PINC7 00000007
+EQU PORTE2 00000002
+EQU PE2 00000002
+EQU PORTE6 00000006
+EQU PE6 00000006
+EQU DDE2 00000002
+EQU DDE6 00000006
+EQU PINE2 00000002
+EQU PINE6 00000006
+EQU PORTF0 00000000
+EQU PF0 00000000
+EQU PORTF1 00000001
+EQU PF1 00000001
+EQU PORTF4 00000004
+EQU PF4 00000004
+EQU PORTF5 00000005
+EQU PF5 00000005
+EQU PORTF6 00000006
+EQU PF6 00000006
+EQU PORTF7 00000007
+EQU PF7 00000007
+EQU DDF0 00000000
+EQU DDF1 00000001
+EQU DDF4 00000004
+EQU DDF5 00000005
+EQU DDF6 00000006
+EQU DDF7 00000007
+EQU PINF0 00000000
+EQU PINF1 00000001
+EQU PINF4 00000004
+EQU PINF5 00000005
+EQU PINF6 00000006
+EQU PINF7 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 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 00000000
+EQU ADTS1 00000001
+EQU ADTS2 00000002
+EQU ADTS3 00000004
+EQU MUX5 00000005
+EQU ADHSM 00000007
+EQU ADC0D 00000000
+EQU ADC1D 00000001
+EQU ADC2D 00000002
+EQU ADC3D 00000003
+EQU ADC4D 00000004
+EQU ADC5D 00000005
+EQU ADC6D 00000006
+EQU ADC7D 00000007
+EQU ADC8D 00000000
+EQU ADC9D 00000001
+EQU ADC10D 00000002
+EQU ADC11D 00000003
+EQU ADC12D 00000004
+EQU ADC13D 00000005
+EQU 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 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 RCFREQ 00000000
+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 EIND0 00000000
+EQU GPIOR20 00000000
+EQU GPIOR21 00000001
+EQU GPIOR22 00000002
+EQU GPIOR23 00000003
+EQU GPIOR24 00000004
+EQU GPIOR25 00000005
+EQU GPIOR26 00000006
+EQU GPIOR27 00000007
+EQU GPIOR10 00000000
+EQU GPIOR11 00000001
+EQU GPIOR12 00000002
+EQU GPIOR13 00000003
+EQU GPIOR14 00000004
+EQU GPIOR15 00000005
+EQU GPIOR16 00000006
+EQU GPIOR17 00000007
+EQU GPIOR00 00000000
+EQU GPIOR01 00000001
+EQU GPIOR02 00000002
+EQU GPIOR03 00000003
+EQU GPIOR04 00000004
+EQU GPIOR05 00000005
+EQU GPIOR06 00000006
+EQU GPIOR07 00000007
+EQU PRUSART1 00000000
+EQU PRTIM3 00000003
+EQU PRUSB 00000007
+EQU PRADC 00000000
+EQU PRUSART0 00000001
+EQU PRSPI 00000002
+EQU PRTIM1 00000003
+EQU PRTIM0 00000005
+EQU PRTIM2 00000006
+EQU PRTWI 00000007
+EQU EXTON 00000000
+EQU RCON 00000001
+EQU CLKS 00000000
+EQU EXTE 00000002
+EQU RCE 00000003
+EQU EXSUT0 00000004
+EQU EXSUT1 00000005
+EQU RCSUT0 00000006
+EQU RCSUT1 00000007
+EQU EXCKSEL0 00000000
+EQU EXCKSEL1 00000001
+EQU EXCKSEL2 00000002
+EQU EXCKSEL3 00000003
+EQU RCCKSEL0 00000004
+EQU RCCKSEL1 00000005
+EQU RCCKSEL2 00000006
+EQU RCCKSEL3 00000007
+EQU PLOCK 00000000
+EQU PLLE 00000001
+EQU PINDIV 00000004
+EQU PDIV0 00000000
+EQU PDIV1 00000001
+EQU PDIV2 00000002
+EQU PDIV3 00000003
+EQU PLLTM0 00000004
+EQU PLLTM1 00000005
+EQU PLLUSB 00000006
+EQU PINMUX 00000007
+EQU VBUSTE 00000000
+EQU OTGPADE 00000004
+EQU FRZCLK 00000005
+EQU USBE 00000007
+EQU DETACH 00000000
+EQU RMWKUP 00000001
+EQU LSM 00000002
+EQU RSTCPU 00000003
+EQU SUSPI 00000000
+EQU SOFI 00000002
+EQU EORSTI 00000003
+EQU WAKEUPI 00000004
+EQU EORSMI 00000005
+EQU UPRSMI 00000006
+EQU SUSPE 00000000
+EQU SOFE 00000002
+EQU EORSTE 00000003
+EQU WAKEUPE 00000004
+EQU EORSME 00000005
+EQU UPRSME 00000006
+EQU UADD0 00000000
+EQU UADD1 00000001
+EQU UADD2 00000002
+EQU UADD3 00000003
+EQU UADD4 00000004
+EQU UADD5 00000005
+EQU UADD6 00000006
+EQU ADDEN 00000007
+EQU FNUM0 00000000
+EQU FNUM1 00000001
+EQU FNUM2 00000002
+EQU FNUM3 00000003
+EQU FNUM4 00000004
+EQU FNUM5 00000005
+EQU FNUM6 00000006
+EQU FNUM7 00000007
+EQU FNUM8 00000000
+EQU FNUM9 00000001
+EQU FNUM10 00000002
+EQU FNCERR 00000004
+EQU TXINI 00000000
+EQU STALLEDI 00000001
+EQU RXOUTI 00000002
+EQU RXSTPI 00000003
+EQU NAKOUTI 00000004
+EQU RWAL 00000005
+EQU NAKINI 00000006
+EQU FIFOCON 00000007
+EQU UENUM_0 00000000
+EQU UENUM_1 00000001
+EQU UENUM_2 00000002
+EQU EPRST0 00000000
+EQU EPRST1 00000001
+EQU EPRST2 00000002
+EQU EPRST3 00000003
+EQU EPRST4 00000004
+EQU EPRST5 00000005
+EQU EPRST6 00000006
+EQU EPEN 00000000
+EQU RSTDT 00000003
+EQU STALLRQC 00000004
+EQU STALLRQ 00000005
+EQU EPDIR 00000000
+EQU EPTYPE0 00000006
+EQU EPTYPE1 00000007
+EQU ALLOC 00000001
+EQU EPBK0 00000002
+EQU EPBK1 00000003
+EQU EPSIZE0 00000004
+EQU EPSIZE1 00000005
+EQU EPSIZE2 00000006
+EQU NBUSYBK0 00000000
+EQU NBUSYBK1 00000001
+EQU DTSEQ0 00000002
+EQU DTSEQ1 00000003
+EQU UNDERFI 00000005
+EQU OVERFI 00000006
+EQU CFGOK 00000007
+EQU CURRBK0 00000000
+EQU CURRBK1 00000001
+EQU CTRLDIR 00000002
+EQU TXINE 00000000
+EQU STALLEDE 00000001
+EQU RXOUTE 00000002
+EQU RXSTPE 00000003
+EQU NAKOUTE 00000004
+EQU NAKINE 00000006
+EQU FLERRE 00000007
+EQU DAT0 00000000
+EQU DAT1 00000001
+EQU DAT2 00000002
+EQU DAT3 00000003
+EQU DAT4 00000004
+EQU DAT5 00000005
+EQU DAT6 00000006
+EQU DAT7 00000007
+EQU BYCT0 00000000
+EQU BYCT1 00000001
+EQU BYCT2 00000002
+EQU BYCT3 00000003
+EQU BYCT4 00000004
+EQU BYCT5 00000005
+EQU BYCT6 00000006
+EQU BYCT7 00000007
+EQU EPINT0 00000000
+EQU EPINT1 00000001
+EQU EPINT2 00000002
+EQU EPINT3 00000003
+EQU EPINT4 00000004
+EQU EPINT5 00000005
+EQU EPINT6 00000006
+EQU VBUSTI 00000000
+EQU VBUS 00000000
+EQU SPEED 00000003
+EQU UVREGE 00000000
+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 TWGCE 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
+EQU HWBE 00000003
+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 00000a00
+EQU RAMEND 00000aff
+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 INT3addr 00000008
+EQU Reserved1addr 0000000a
+EQU Reserved2addr 0000000c
+EQU INT6addr 0000000e
+EQU Reserved3addr 00000010
+EQU PCI0addr 00000012
+EQU USB_GENaddr 00000014
+EQU USB_COMaddr 00000016
+EQU WDTaddr 00000018
+EQU Reserved4addr 0000001a
+EQU Reserved5addr 0000001c
+EQU Reserved6addr 0000001e
+EQU ICP1addr 00000020
+EQU OC1Aaddr 00000022
+EQU OC1Baddr 00000024
+EQU OC1Caddr 00000026
+EQU OVF1addr 00000028
+EQU OC0Aaddr 0000002a
+EQU OC0Baddr 0000002c
+EQU OVF0addr 0000002e
+EQU SPIaddr 00000030
+EQU URXC1addr 00000032
+EQU UDRE1addr 00000034
+EQU UTXC1addr 00000036
+EQU ACIaddr 00000038
+EQU ADCCaddr 0000003a
+EQU ERDYaddr 0000003c
+EQU ICP3addr 0000003e
+EQU OC3Aaddr 00000040
+EQU OC3Baddr 00000042
+EQU OC3Caddr 00000044
+EQU OVF3addr 00000046
+EQU TWIaddr 00000048
+EQU SPMRaddr 0000004a
+EQU OC4Aaddr 0000004c
+EQU OC4Baddr 0000004e
+EQU OC4Daddr 00000050
+EQU OVF4addr 00000052
+EQU TIMER4_FPFaddr 00000054
+EQU INT_VECTORS_SIZE 00000056
+EQU ramstart 00000100
+EQU CELLSIZE 00000002
+SET WANT_WATCHDOG 00000000
+SET WANT_PORTD 00000000
+SET WANT_SPI 00000000
+SET WANT_USART1 00000000
+SET WANT_BOOT_LOAD 00000000
+SET WANT_EEPROM 00000000
+SET WANT_TIMER_COUNTER_0 00000000
+SET WANT_TIMER_COUNTER_3 00000000
+SET WANT_TIMER_COUNTER_1 00000000
+SET WANT_JTAG 00000000
+SET WANT_EXTERNAL_INTERRUPT 00000000
+SET WANT_TIMER_COUNTER_4 00000000
+SET WANT_PORTB 00000000
+SET WANT_PORTC 00000000
+SET WANT_PORTE 00000000
+SET WANT_PORTF 00000000
+SET WANT_AD_CONVERTER 00000000
+SET WANT_ANALOG_COMPARATOR 00000000
+SET WANT_CPU 00000000
+SET WANT_PLL 00000000
+SET WANT_USB_DEVICE 00000000
+EQU intvecsize 00000002
+EQU pclen 00000002
+CSEG isr 000000ff
+EQU INTVECTORS 0000002b
+CSEG mcu_info 00000055
+CSEG mcu_ramsize 00000055
+CSEG mcu_eepromsize 00000056
+CSEG mcu_maxdp 00000057
+CSEG mcu_numints 00000058
+CSEG mcu_name 00000059
+SET codestart 0000005f
+SET WANT_INTERRUPTS 00000001
+SET WANT_INTERRUPT_COUNTERS 00000000
+SET WANT_ISR_RX 00000001
+SET WANT_IGNORECASE 00000001
+SET WANT_UNIFIED 00000000
+SET TIB_SIZE 0000005a
+SET APPUSERSIZE 0000000a
+SET rstackstart 00000aff
+SET stackstart 00000aaf
+SET NUMWORDLISTS 00000008
+SET NUMRECOGNIZERS 00000004
+SET BAUD 00009600
+SET BAUD_MAXERROR 0000000a
+SET VE_HEAD 00003fec
+SET VE_ENVHEAD 000002e6
+SET AMFORTH_RO_SEG 00003800
+EQU F_CPU 00f42400
+EQU BAUDRATE_LOW 000000cc
+EQU BAUDRATE_HIGH 000000cd
+EQU USART_C 000000ca
+EQU USART_B 000000c9
+EQU USART_A 000000c8
+EQU USART_DATA 000000ce
+EQU URXCaddr 00000032
+EQU UDREaddr 00000034
+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 0000005f
+CSEG XT_TO_RXBUF 00000065
+CSEG PFA_rx_tobuf 00000066
+CSEG DO_NEXT 00003804
+CSEG VE_ISR_RX 00000076
+CSEG XT_ISR_RX 0000007b
+CSEG DO_COLON 00003800
+CSEG usart_rx_isr 0000007c
+CSEG XT_DOLITERAL 0000383c
+CSEG XT_CFETCH 00003897
+CSEG XT_DUP 000038b0
+CSEG XT_EQUAL 00003fde
+CSEG XT_DOCONDBRANCH 00003835
+CSEG usart_rx_isr1 00000086
+CSEG XT_COLD 00003d37
+CSEG XT_EXIT 0000381f
+CSEG XT_USART_INIT_RX_BUFFER 00000088
+CSEG PFA_USART_INIT_RX_BUFFER 00000089
+CSEG XT_INTSTORE 00003ca4
+CSEG XT_ZERO 00003953
+CSEG XT_FILL 00003e97
+CSEG VE_RX_BUFFER 00000095
+CSEG XT_RX_BUFFER 0000009a
+CSEG PFA_RX_BUFFER 0000009b
+CSEG XT_RXQ_BUFFER 000000b5
+CSEG XT_PLUS 0000399c
+CSEG XT_SWAP 000038c3
+CSEG XT_1PLUS 00003a2e
+CSEG XT_AND 00003a12
+CSEG XT_CSTORE 0000388c
+CSEG VE_RXQ_BUFFER 000000af
+CSEG PFA_RXQ_BUFFER 000000b6
+CSEG XT_PAUSE 00003d2f
+CSEG XT_NOTEQUAL 00003912
+SET XT_RX 0000009a
+SET XT_RXQ 000000b5
+SET XT_USART_INIT_RX 00000088
+CSEG VE_TX_POLL 000000bf
+CSEG XT_TX_POLL 000000c5
+CSEG PFA_TX_POLL 000000c6
+CSEG XT_TXQ_POLL 000000d3
+CSEG VE_TXQ_POLL 000000cd
+CSEG PFA_TXQ_POLL 000000d4
+SET XT_TX 000000c5
+SET XT_TXQ 000000d3
+SET XT_USART_INIT_TX 00000000
+CSEG VE_UBRR 000000dc
+CSEG XT_UBRR 000000e0
+CSEG PFA_DOVALUE1 0000386e
+CSEG PFA_UBRR 000000e1
+ESEG EE_UBRRVAL 000000ae
+CSEG XT_EDEFERFETCH 00003d9f
+CSEG XT_EDEFERSTORE 00003da9
+CSEG VE_USART 000000e4
+CSEG XT_USART 000000e9
+CSEG PFA_USART 000000ea
+CSEG XT_BYTESWAP 00003af8
+SET AMFORTH_NRWW_SIZE 00000ffe
+SET corepc 000000ff
+CSEG PFA_COLD 00003d38
+ESEG intvec 00000000
+DSEG intcnt 00000112
+CSEG VE_MPLUS 00000116
+CSEG XT_MPLUS 00000119
+CSEG PFA_MPLUS 0000011a
+CSEG XT_S2D 00003fc6
+CSEG XT_DPLUS 00003c14
+CSEG VE_UDSTAR 0000011d
+CSEG XT_UDSTAR 00000121
+CSEG PFA_UDSTAR 00000122
+CSEG XT_TO_R 000038fe
+CSEG XT_UMSTAR 000039df
+CSEG XT_DROP 000038d8
+CSEG XT_R_FROM 000038f5
+CSEG XT_ROT 000038e0
+CSEG VE_UMAX 0000012c
+CSEG XT_UMAX 00000130
+CSEG PFA_UMAX 00000131
+CSEG XT_2DUP 00003ec8
+CSEG XT_ULESS 0000395b
+CSEG UMAX1 00000136
+CSEG VE_UMIN 00000138
+CSEG XT_UMIN 0000013c
+CSEG PFA_UMIN 0000013d
+CSEG XT_UGREATER 00003966
+CSEG UMIN1 00000142
+CSEG XT_IMMEDIATEQ 00000144
+CSEG PFA_IMMEDIATEQ 00000145
+CSEG XT_ZEROEQUAL 00003919
+CSEG IMMEDIATEQ1 0000014d
+CSEG XT_ONE 00003fe5
+CSEG XT_TRUE 0000394a
+CSEG VE_NAME2FLAGS 0000014f
+CSEG XT_NAME2FLAGS 00000156
+CSEG PFA_NAME2FLAGS 00000157
+CSEG XT_FETCHI 00003bca
+CSEG VE_DOT_VER 0000015c
+CSEG XT_DOT_VER 00000160
+CSEG PFA_DOT_VER 00000161
+CSEG XT_ENV_FORTHNAME 000002c1
+CSEG XT_ITYPE 000003ea
+CSEG XT_SPACE 00003fad
+CSEG XT_BASE 00003ebc
+CSEG XT_FETCH 00003878
+CSEG XT_ENV_FORTHVERSION 000002cf
+CSEG XT_DECIMAL 00003f40
+CSEG XT_L_SHARP 00000308
+CSEG XT_SHARP 00000310
+CSEG XT_HOLD 000002f9
+CSEG XT_SHARP_S 00000326
+CSEG XT_SHARP_G 00000331
+CSEG XT_TYPE 00000420
+CSEG XT_STORE 00003880
+CSEG XT_ENV_CPU 000002d7
+CSEG VE_NOOP 00000177
+CSEG XT_NOOP 0000017b
+CSEG PFA_NOOP 0000017c
+CSEG VE_UNUSED 0000017d
+CSEG XT_UNUSED 00000182
+CSEG PFA_UNUSED 00000183
+CSEG XT_SP_FETCH 00003a8c
+CSEG XT_HERE 00003f22
+CSEG XT_MINUS 00003992
+CSEG VE_TO 00000187
+CSEG XT_TO 0000018a
+CSEG PFA_TO 0000018b
+CSEG XT_TICK 0000042f
+CSEG XT_TO_BODY 00003fcf
+CSEG XT_STATE 00003eb6
+CSEG PFA_TO1 0000019b
+CSEG XT_COMPILE 00000743
+CSEG XT_DOTO 00000195
+CSEG XT_COMMA 0000074e
+CSEG PFA_DOTO 00000196
+CSEG XT_ICELLPLUS 000001a7
+CSEG XT_EXECUTE 00003829
+CSEG VE_ICELLPLUS 000001a1
+CSEG PFA_ICELLPLUS 000001a8
+CSEG VE_ICOMPARE 000001aa
+CSEG XT_ICOMPARE 000001b0
+CSEG PFA_ICOMPARE 000001b1
+CSEG XT_OVER 000038ce
+CSEG PFA_ICOMPARE_SAMELEN 000001bb
+CSEG XT_2DROP 00003ed1
+CSEG XT_QDOCHECK 0000080d
+CSEG PFA_ICOMPARE_DONE 000001e0
+CSEG XT_DODO 00003a9a
+CSEG PFA_ICOMPARE_LOOP 000001c1
+CSEG XT_ICOMPARE_LC 000001e3
+CSEG PFA_ICOMPARE_LASTCELL 000001d1
+CSEG PFA_ICOMPARE_NEXTLOOP 000001d8
+CSEG XT_UNLOOP 00003ad3
+CSEG XT_CELLPLUS 00003c8f
+CSEG XT_DOPLUSLOOP 00003ab9
+CSEG PFA_ICOMPARE_LC 000001e4
+CSEG XT_TOLOWER 00003f78
+CSEG XT_OR 00003a1b
+CSEG VE_STAR 000001f2
+CSEG XT_STAR 000001f5
+CSEG PFA_STAR 000001f6
+CSEG XT_MSTAR 000039a5
+CSEG VE_J 000001f9
+CSEG XT_J 000001fc
+CSEG PFA_J 000001fd
+CSEG XT_RP_FETCH 00003a75
+CSEG VE_DABS 00000209
+CSEG XT_DABS 0000020d
+CSEG PFA_DABS 0000020e
+CSEG XT_ZEROLESS 00003920
+CSEG PFA_DABS1 00000213
+CSEG XT_DNEGATE 0000021a
+CSEG VE_DNEGATE 00000214
+CSEG PFA_DNEGATE 0000021b
+CSEG XT_DINVERT 00003c3a
+CSEG VE_CMOVE 00000220
+CSEG XT_CMOVE 00000225
+CSEG PFA_CMOVE 00000226
+CSEG PFA_CMOVE1 00000233
+CSEG PFA_CMOVE2 0000022f
+CSEG VE_2SWAP 00000239
+CSEG XT_2SWAP 0000023e
+CSEG PFA_2SWAP 0000023f
+CSEG VE_REFILLTIB 00000244
+CSEG XT_REFILLTIB 0000024b
+CSEG PFA_REFILLTIB 0000024c
+CSEG XT_TIB 00000267
+CSEG XT_ACCEPT 0000047f
+CSEG XT_NUMBERTIB 0000026d
+CSEG XT_TO_IN 00003ee1
+CSEG VE_SOURCETIB 00000257
+CSEG XT_SOURCETIB 0000025e
+CSEG PFA_SOURCETIB 0000025f
+CSEG VE_TIB 00000263
+CSEG PFA_DOVARIABLE 00003847
+CSEG PFA_TIB 00000268
+DSEG ram_tib 0000013d
+CSEG VE_NUMBERTIB 00000269
+CSEG PFA_NUMBERTIB 0000026e
+DSEG ram_sharptib 00000197
+CSEG VE_EE2RAM 0000026f
+CSEG XT_EE2RAM 00000274
+CSEG PFA_EE2RAM 00000275
+CSEG PFA_EE2RAM_1 00000277
+CSEG XT_FETCHE 00003b5e
+CSEG XT_DOLOOP 00003ac8
+CSEG PFA_EE2RAM_2 00000281
+CSEG VE_INIT_RAM 00000283
+CSEG XT_INIT_RAM 00000289
+CSEG PFA_INI_RAM 0000028a
+ESEG EE_INITUSER 0000008c
+CSEG XT_UP_FETCH 00003b01
+CSEG XT_2SLASH 00003a03
+CSEG VE_ENVIRONMENT 00000292
+CSEG XT_ENVIRONMENT 0000029a
+CSEG PFA_ENVIRONMENT 0000029b
+ESEG CFG_ENVIRONMENT 00000066
+CSEG VE_ENVWORDLISTS 0000029c
+CSEG XT_ENVWORDLISTS 000002a3
+CSEG PFA_ENVWORDLISTS 000002a4
+CSEG VE_ENVSLASHPAD 000002a7
+CSEG XT_ENVSLASHPAD 000002ab
+CSEG PFA_ENVSLASHPAD 000002ac
+CSEG XT_PAD 00003ee7
+CSEG VE_ENVSLASHHOLD 000002b0
+CSEG XT_ENVSLASHHOLD 000002b5
+CSEG PFA_ENVSLASHHOLD 000002b6
+CSEG VE_ENV_FORTHNAME 000002ba
+CSEG PFA_EN_FORTHNAME 000002c2
+CSEG XT_DOSLITERAL 000003b7
+CSEG VE_ENV_FORTHVERSION 000002c9
+CSEG PFA_EN_FORTHVERSION 000002d0
+CSEG VE_ENV_CPU 000002d3
+CSEG PFA_EN_CPU 000002d8
+CSEG XT_ICOUNT 00000416
+CSEG VE_ENV_MCUINFO 000002dc
+CSEG XT_ENV_MCUINFO 000002e2
+CSEG PFA_EN_MCUINFO 000002e3
+CSEG VE_ENVUSERSIZE 000002e6
+CSEG XT_ENVUSERSIZE 000002eb
+CSEG PFA_ENVUSERSIZE 000002ec
+CSEG VE_HLD 000002ef
+CSEG XT_HLD 000002f3
+CSEG PFA_HLD 000002f4
+DSEG ram_hld 00000199
+CSEG VE_HOLD 000002f5
+CSEG PFA_HOLD 000002fa
+CSEG XT_1MINUS 00003a34
+CSEG VE_L_SHARP 00000305
+CSEG PFA_L_SHARP 00000309
+CSEG VE_SHARP 0000030d
+CSEG PFA_SHARP 00000311
+CSEG XT_UDSLASHMOD 0000038d
+CSEG XT_LESS 0000396d
+CSEG PFA_SHARP1 0000031e
+CSEG VE_SHARP_S 00000323
+CSEG PFA_SHARP_S 00000327
+CSEG NUMS1 00000327
+CSEG VE_SHARP_G 0000032e
+CSEG PFA_SHARP_G 00000332
+CSEG VE_SIGN 00000339
+CSEG XT_SIGN 0000033d
+CSEG PFA_SIGN 0000033e
+CSEG PFA_SIGN1 00000344
+CSEG VE_DDOTR 00000345
+CSEG XT_DDOTR 00000349
+CSEG PFA_DDOTR 0000034a
+CSEG XT_TUCK 00003ed9
+CSEG XT_SPACES 00003fb6
+CSEG VE_DOTR 00000358
+CSEG XT_DOTR 0000035b
+CSEG PFA_DOTR 0000035c
+CSEG VE_DDOT 00000361
+CSEG XT_DDOT 00000364
+CSEG PFA_DDOT 00000365
+CSEG VE_DOT 00000369
+CSEG XT_DOT 0000036c
+CSEG PFA_DOT 0000036d
+CSEG VE_UDDOT 00000370
+CSEG XT_UDDOT 00000374
+CSEG PFA_UDDOT 00000375
+CSEG XT_UDDOTR 0000037d
+CSEG VE_UDDOTR 00000379
+CSEG PFA_UDDOTR 0000037e
+CSEG VE_UDSLASHMOD 00000388
+CSEG PFA_UDSLASHMOD 0000038e
+CSEG XT_R_FETCH 00003907
+CSEG XT_UMSLASHMOD 000039c1
+CSEG VE_DIGITQ 00000398
+CSEG XT_DIGITQ 0000039d
+CSEG PFA_DIGITQ 0000039e
+CSEG XT_TOUPPER 00003f65
+CSEG XT_GREATER 00003977
+CSEG PFA_DOSLITERAL 000003b8
+CSEG VE_SCOMMA 000003c2
+CSEG XT_SCOMMA 000003c5
+CSEG PFA_SCOMMA 000003c6
+CSEG XT_DOSCOMMA 000003c9
+CSEG PFA_DOSCOMMA 000003ca
+CSEG XT_2STAR 00003a0a
+CSEG PFA_SCOMMA2 000003dc
+CSEG PFA_SCOMMA1 000003d6
+CSEG XT_GREATERZERO 00003927
+CSEG PFA_SCOMMA3 000003e3
+CSEG VE_ITYPE 000003e5
+CSEG PFA_ITYPE 000003eb
+CSEG PFA_ITYPE2 000003fe
+CSEG PFA_ITYPE1 000003f6
+CSEG XT_LOWEMIT 0000040b
+CSEG XT_HIEMIT 00000407
+CSEG PFA_ITYPE3 00000405
+CSEG PFA_HIEMIT 00000408
+CSEG PFA_LOWEMIT 0000040c
+CSEG XT_EMIT 00003ef1
+CSEG VE_ICOUNT 00000411
+CSEG PFA_ICOUNT 00000417
+CSEG VE_TYPE 0000041c
+CSEG PFA_TYPE 00000421
+CSEG XT_BOUNDS 00003f98
+CSEG PFA_TYPE2 0000042b
+CSEG PFA_TYPE1 00000426
+CSEG XT_I 00003aab
+CSEG VE_TICK 0000042c
+CSEG PFA_TICK 00000430
+CSEG XT_PARSENAME 000005a2
+CSEG XT_FORTHRECOGNIZER 000005e5
+CSEG XT_RECOGNIZE 000005f0
+CSEG XT_DT_NULL 0000067d
+CSEG PFA_TICK1 00000441
+CSEG XT_THROW 00003d85
+CSEG VE_CSKIP 00000443
+CSEG XT_CSKIP 00000448
+CSEG PFA_CSKIP 00000449
+CSEG PFA_CSKIP1 0000044a
+CSEG PFA_CSKIP2 00000457
+CSEG XT_SLASHSTRING 00000593
+CSEG XT_DOBRANCH 0000382e
+CSEG VE_CSCAN 0000045a
+CSEG XT_CSCAN 0000045f
+CSEG PFA_CSCAN 00000460
+CSEG PFA_CSCAN1 00000462
+CSEG PFA_CSCAN2 00000474
+CSEG XT_NIP 000038ef
+CSEG VE_ACCEPT 0000047a
+CSEG PFA_ACCEPT 00000480
+CSEG ACC1 00000484
+CSEG XT_KEY 00003f02
+CSEG XT_CRLFQ 000004c0
+CSEG ACC5 000004b2
+CSEG ACC3 000004a2
+CSEG ACC6 000004a0
+CSEG XT_BS 000004b8
+CSEG ACC4 000004b0
+CSEG XT_BL 00003f53
+CSEG PFA_ACCEPT6 000004a9
+CSEG XT_CR 00003fa0
+CSEG VE_REFILL 000004cb
+CSEG XT_REFILL 000004d0
+CSEG PFA_DODEFER1 00003dfe
+CSEG PFA_REFILL 000004d1
+CSEG XT_UDEFERFETCH 00003dc7
+CSEG XT_UDEFERSTORE 00003dd3
+CSEG VE_CHAR 000004d4
+CSEG XT_CHAR 000004d8
+CSEG PFA_CHAR 000004d9
+CSEG VE_NUMBER 000004dd
+CSEG XT_NUMBER 000004e2
+CSEG PFA_NUMBER 000004e3
+CSEG XT_QSIGN 00000526
+CSEG XT_SET_BASE 00000539
+CSEG PFA_NUMBER0 000004f9
+CSEG XT_2TO_R 00003b1d
+CSEG XT_2R_FROM 00003b2c
+CSEG XT_TO_NUMBER 00000557
+CSEG XT_QDUP 000038b8
+CSEG PFA_NUMBER1 0000051b
+CSEG PFA_NUMBER2 00000512
+CSEG PFA_NUMBER6 00000513
+CSEG PFA_NUMBER3 0000050f
+CSEG XT_TWO 00003fea
+CSEG PFA_NUMBER5 00000521
+CSEG PFA_NUMBER4 00000520
+CSEG XT_NEGATE 00003e26
+CSEG PFA_QSIGN 00000527
+CSEG PFA_NUMBERSIGN_DONE 00000532
+CSEG XT_BASES 00000534
+CSEG PFA_DOCONSTANT 00003851
+CSEG PFA_SET_BASE 0000053a
+CSEG XT_WITHIN 00003e56
+CSEG SET_BASE1 0000054f
+CSEG SET_BASE2 00000550
+CSEG VE_TO_NUMBER 00000551
+CSEG TONUM1 00000558
+CSEG TONUM3 0000056f
+CSEG TONUM2 00000563
+CSEG VE_PARSE 00000570
+CSEG XT_PARSE 00000575
+CSEG PFA_PARSE 00000576
+CSEG XT_SOURCE 00000589
+CSEG XT_PLUSSTORE 00003a64
+CSEG VE_SOURCE 00000584
+CSEG PFA_SOURCE 0000058a
+CSEG VE_SLASHSTRING 0000058d
+CSEG PFA_SLASHSTRING 00000594
+CSEG VE_PARSENAME 0000059b
+CSEG PFA_PARSENAME 000005a3
+CSEG XT_SKIPSCANCHAR 000005a6
+CSEG PFA_SKIPSCANCHAR 000005a7
+CSEG VE_SP0 000005b8
+CSEG XT_SP0 000005bc
+CSEG PFA_SP0 000005bd
+CSEG VE_SP 000005c0
+CSEG XT_SP 000005c3
+CSEG PFA_DOUSER 00003857
+CSEG PFA_SP 000005c4
+CSEG VE_RP0 000005c5
+CSEG XT_RP0 000005c9
+CSEG PFA_RP0 000005ca
+CSEG XT_DORP0 000005cd
+CSEG PFA_DORP0 000005ce
+CSEG VE_DEPTH 000005cf
+CSEG XT_DEPTH 000005d4
+CSEG PFA_DEPTH 000005d5
+CSEG VE_FORTHRECOGNIZER 000005db
+CSEG PFA_FORTHRECOGNIZER 000005e6
+ESEG CFG_FORTHRECOGNIZER 00000060
+CSEG VE_RECOGNIZE 000005e9
+CSEG PFA_RECOGNIZE 000005f1
+CSEG XT_RECOGNIZE_A 000005fb
+CSEG XT_MAPSTACK 0000098e
+CSEG PFA_RECOGNIZE1 000005fa
+CSEG PFA_RECOGNIZE_A 000005fc
+CSEG PFA_RECOGNIZE_A1 0000060c
+CSEG VE_INTERPRET 00000610
+CSEG XT_INTERPRET 00000617
+CSEG PFA_INTERPRET 00000618
+CSEG PFA_INTERPRET2 00000628
+CSEG PFA_INTERPRET1 00000623
+CSEG XT_QSTACK 00003f8a
+CSEG VE_DT_NUM 0000062a
+CSEG XT_DT_NUM 0000062f
+CSEG PFA_DT_NUM 00000630
+CSEG XT_LITERAL 00000764
+CSEG VE_DT_DNUM 00000633
+CSEG XT_DT_DNUM 00000639
+CSEG PFA_DT_DNUM 0000063a
+CSEG XT_2LITERAL 00003fd6
+CSEG VE_REC_NUM 0000063d
+CSEG XT_REC_NUM 00000643
+CSEG PFA_REC_NUM 00000644
+CSEG PFA_REC_NONUMBER 0000064f
+CSEG PFA_REC_INTNUM2 0000064d
+CSEG VE_REC_FIND 00000651
+CSEG XT_REC_FIND 00000657
+CSEG PFA_REC_FIND 00000658
+CSEG XT_FINDXT 000006f2
+CSEG PFA_REC_WORD_FOUND 00000660
+CSEG XT_DT_XT 00000667
+CSEG VE_DT_XT 00000662
+CSEG PFA_DT_XT 00000668
+CSEG XT_R_WORD_INTERPRET 0000066b
+CSEG XT_R_WORD_COMPILE 0000066f
+CSEG PFA_R_WORD_INTERPRET 0000066c
+CSEG PFA_R_WORD_COMPILE 00000670
+CSEG PFA_R_WORD_COMPILE1 00000675
+CSEG VE_DT_NULL 00000677
+CSEG PFA_DT_NULL 0000067e
+CSEG XT_FAIL 00000681
+CSEG PFA_FAIL 00000682
+CSEG VE_SEARCH_WORDLIST 00000685
+CSEG XT_SEARCH_WORDLIST 0000068f
+CSEG PFA_SEARCH_WORDLIST 00000690
+CSEG XT_ISWORD 000006a4
+CSEG XT_TRAVERSEWORDLIST 000006c1
+CSEG PFA_SEARCH_WORDLIST1 0000069e
+CSEG XT_NFA2CFA 000006e8
+CSEG PFA_ISWORD 000006a5
+CSEG XT_NAME2STRING 000006dc
+CSEG PFA_ISWORD3 000006b2
+CSEG VE_TRAVERSEWORDLIST 000006b6
+CSEG PFA_TRAVERSEWORDLIST 000006c2
+CSEG PFA_TRAVERSEWORDLIST1 000006c3
+CSEG PFA_TRAVERSEWORDLIST2 000006d2
+CSEG XT_NFA2LFA 000009fd
+CSEG VE_NAME2STRING 000006d4
+CSEG PFA_NAME2STRING 000006dd
+CSEG VE_NFA2CFA 000006e2
+CSEG PFA_NFA2CFA 000006e9
+CSEG VE_FINDXT 000006ec
+CSEG PFA_FINDXT 000006f3
+CSEG XT_FINDXTA 000006fe
+ESEG CFG_ORDERLISTLEN 0000006c
+CSEG PFA_FINDXT1 000006fd
+CSEG PFA_FINDXTA 000006ff
+CSEG PFA_FINDXTA1 0000070b
+CSEG VE_NEWEST 0000070c
+CSEG XT_NEWEST 00000711
+CSEG PFA_NEWEST 00000712
+DSEG ram_newest 0000019b
+CSEG VE_LATEST 00000713
+CSEG XT_LATEST 00000718
+CSEG PFA_LATEST 00000719
+DSEG ram_latest 0000019f
+CSEG VE_DOCREATE 0000071a
+CSEG XT_DOCREATE 00000720
+CSEG PFA_DOCREATE 00000721
+CSEG XT_WLSCOPE 00000877
+CSEG XT_HEADER 0000085c
+CSEG VE_BACKSLASH 0000072b
+CSEG XT_BACKSLASH 0000072e
+CSEG PFA_BACKSLASH 0000072f
+CSEG VE_LPAREN 00000734
+CSEG XT_LPAREN 00000737
+CSEG PFA_LPAREN 00000738
+CSEG VE_COMPILE 0000073d
+CSEG PFA_COMPILE 00000744
+CSEG VE_COMMA 0000074b
+CSEG PFA_COMMA 0000074f
+CSEG XT_DP 00003f11
+CSEG XT_STOREI 00003b72
+CSEG PFA_DP 00003f12
+CSEG VE_BRACKETTICK 00000756
+CSEG XT_BRACKETTICK 0000075a
+CSEG PFA_BRACKETTICK 0000075b
+CSEG VE_LITERAL 0000075e
+CSEG PFA_LITERAL 00000765
+CSEG VE_SLITERAL 00000769
+CSEG XT_SLITERAL 0000076f
+CSEG PFA_SLITERAL 00000770
+CSEG XT_GMARK 00000774
+CSEG PFA_GMARK 00000775
+CSEG XT_GRESOLVE 00000779
+CSEG PFA_GRESOLVE 0000077a
+CSEG XT_LMARK 0000077f
+CSEG PFA_LMARK 00000780
+CSEG XT_LRESOLVE 00000782
+CSEG PFA_LRESOLVE 00000783
+CSEG VE_AHEAD 00000786
+CSEG XT_AHEAD 0000078b
+CSEG PFA_AHEAD 0000078c
+CSEG VE_IF 00000790
+CSEG XT_IF 00000793
+CSEG PFA_IF 00000794
+CSEG VE_ELSE 00000798
+CSEG XT_ELSE 0000079c
+CSEG PFA_ELSE 0000079d
+CSEG VE_THEN 000007a3
+CSEG XT_THEN 000007a7
+CSEG PFA_THEN 000007a8
+CSEG VE_BEGIN 000007aa
+CSEG XT_BEGIN 000007af
+CSEG PFA_BEGIN 000007b0
+CSEG VE_WHILE 000007b2
+CSEG XT_WHILE 000007b7
+CSEG PFA_WHILE 000007b8
+CSEG VE_REPEAT 000007bb
+CSEG XT_REPEAT 000007c0
+CSEG PFA_REPEAT 000007c1
+CSEG XT_AGAIN 000007d4
+CSEG VE_UNTIL 000007c4
+CSEG XT_UNTIL 000007c9
+CSEG PFA_UNTIL 000007ca
+CSEG VE_AGAIN 000007cf
+CSEG PFA_AGAIN 000007d5
+CSEG VE_DO 000007d9
+CSEG XT_DO 000007dc
+CSEG PFA_DO 000007dd
+CSEG XT_TO_L 00000837
+CSEG VE_LOOP 000007e3
+CSEG XT_LOOP 000007e7
+CSEG PFA_LOOP 000007e8
+CSEG XT_ENDLOOP 0000081e
+CSEG VE_PLUSLOOP 000007ec
+CSEG XT_PLUSLOOP 000007f1
+CSEG PFA_PLUSLOOP 000007f2
+CSEG VE_LEAVE 000007f6
+CSEG XT_LEAVE 000007fb
+CSEG PFA_LEAVE 000007fc
+CSEG VE_QDO 00000801
+CSEG XT_QDO 00000805
+CSEG PFA_QDO 00000806
+CSEG PFA_QDOCHECK 0000080e
+CSEG PFA_QDOCHECK1 00000815
+CSEG XT_INVERT 000039fc
+CSEG VE_ENDLOOP 00000818
+CSEG PFA_ENDLOOP 0000081f
+CSEG LOOP1 00000820
+CSEG XT_L_FROM 0000082b
+CSEG LOOP2 00000827
+CSEG VE_L_FROM 00000828
+CSEG PFA_L_FROM 0000082c
+CSEG XT_LP 0000084a
+CSEG VE_TO_L 00000834
+CSEG PFA_TO_L 00000838
+CSEG VE_LP0 0000083f
+CSEG XT_LP0 00000843
+CSEG PFA_LP0 00000844
+ESEG CFG_LP0 00000062
+CSEG VE_LP 00000847
+CSEG PFA_LP 0000084b
+DSEG ram_lp 000001a1
+CSEG VE_CREATE 0000084c
+CSEG XT_CREATE 00000851
+CSEG PFA_CREATE 00000852
+CSEG XT_REVEAL 00000880
+CSEG VE_HEADER 00000857
+CSEG PFA_HEADER 0000085d
+CSEG PFA_HEADER1 0000086e
+CSEG VE_WLSCOPE 00000871
+CSEG PFA_WLSCOPE 00000878
+ESEG CFG_WLSCOPE 0000005e
+CSEG VE_REVEAL 0000087b
+CSEG PFA_REVEAL 00000881
+CSEG REVEAL1 0000088b
+CSEG XT_STOREE 00003b3a
+CSEG VE_DOES 0000088c
+CSEG XT_DOES 00000891
+CSEG PFA_DOES 00000892
+CSEG XT_DODOES 000008a4
+CSEG DO_DODOES 00000899
+CSEG PFA_DODOES 000008a5
+CSEG VE_COLON 000008ad
+CSEG XT_COLON 000008b0
+CSEG PFA_COLON 000008b1
+CSEG XT_COLONNONAME 000008bb
+CSEG VE_COLONNONAME 000008b5
+CSEG PFA_COLONNONAME 000008bc
+CSEG XT_RBRACKET 000008d0
+CSEG VE_SEMICOLON 000008c4
+CSEG XT_SEMICOLON 000008c7
+CSEG PFA_SEMICOLON 000008c8
+CSEG XT_LBRACKET 000008d8
+CSEG VE_RBRACKET 000008cd
+CSEG PFA_RBRACKET 000008d1
+CSEG VE_LBRACKET 000008d5
+CSEG PFA_LBRACKET 000008d9
+CSEG VE_VARIABLE 000008dd
+CSEG XT_VARIABLE 000008e3
+CSEG PFA_VARIABLE 000008e4
+CSEG XT_CONSTANT 000008ef
+CSEG XT_ALLOT 00003f2b
+CSEG VE_CONSTANT 000008e9
+CSEG PFA_CONSTANT 000008f0
+CSEG VE_USER 000008f6
+CSEG XT_USER 000008fa
+CSEG PFA_USER 000008fb
+CSEG VE_RECURSE 00000901
+CSEG XT_RECURSE 00000907
+CSEG PFA_RECURSE 00000908
+CSEG VE_IMMEDIATE 0000090c
+CSEG XT_IMMEDIATE 00000913
+CSEG PFA_IMMEDIATE 00000914
+CSEG XT_GET_CURRENT 000009b5
+CSEG VE_BRACKETCHAR 0000091e
+CSEG XT_BRACKETCHAR 00000923
+CSEG PFA_BRACKETCHAR 00000924
+CSEG VE_ABORTQUOTE 00000929
+CSEG XT_ABORTQUOTE 0000092e
+CSEG PFA_ABORTQUOTE 0000092f
+CSEG XT_SQUOTE 00003e89
+CSEG XT_QABORT 00000940
+CSEG VE_ABORT 00000933
+CSEG XT_ABORT 00000938
+CSEG PFA_ABORT 00000939
+CSEG VE_QABORT 0000093b
+CSEG PFA_QABORT 00000941
+CSEG QABO1 00000946
+CSEG VE_GET_STACK 00000948
+CSEG XT_GET_STACK 0000094f
+CSEG PFA_N_FETCH_E2 00000966
+CSEG PFA_N_FETCH_E1 0000095c
+CSEG XT_CELLS 00003ec3
+CSEG VE_SET_STACK 00000969
+CSEG XT_SET_STACK 00000970
+CSEG PFA_SET_STACK 00000971
+CSEG PFA_SET_STACK0 00000978
+CSEG PFA_SET_STACK2 00000985
+CSEG PFA_SET_STACK1 00000980
+CSEG VE_MAPSTACK 00000987
+CSEG PFA_MAPSTACK 0000098f
+CSEG PFA_MAPSTACK3 000009aa
+CSEG PFA_MAPSTACK1 00000999
+CSEG PFA_MAPSTACK2 000009a6
+CSEG VE_GET_CURRENT 000009ad
+CSEG PFA_GET_CURRENT 000009b6
+ESEG CFG_CURRENT 00000068
+CSEG VE_GET_ORDER 000009ba
+CSEG XT_GET_ORDER 000009c1
+CSEG PFA_GET_ORDER 000009c2
+CSEG VE_CFG_ORDER 000009c6
+CSEG XT_CFG_ORDER 000009cd
+CSEG PFA_CFG_ORDER 000009ce
+CSEG VE_COMPARE 000009cf
+CSEG XT_COMPARE 000009d5
+CSEG PFA_COMPARE 000009d6
+CSEG PFA_COMPARE_LOOP 000009e2
+CSEG PFA_COMPARE_NOTEQUAL 000009f0
+CSEG PFA_COMPARE_ENDREACHED2 000009eb
+CSEG PFA_COMPARE_ENDREACHED 000009ec
+CSEG PFA_COMPARE_CHECKLASTCHAR 000009f0
+CSEG PFA_COMPARE_DONE 000009f2
+CSEG VE_NFA2LFA 000009f7
+CSEG PFA_NFA2LFA 000009fe
+CSEG VE_SET_CURRENT 00000a03
+CSEG XT_SET_CURRENT 00000a0b
+CSEG PFA_SET_CURRENT 00000a0c
+CSEG VE_WORDLIST 00000a10
+CSEG XT_WORDLIST 00000a16
+CSEG PFA_WORDLIST 00000a17
+CSEG XT_EHERE 00003f1a
+CSEG PFA_EHERE 00003f1b
+CSEG VE_FORTHWORDLIST 00000a20
+CSEG XT_FORTHWORDLIST 00000a29
+CSEG PFA_FORTHWORDLIST 00000a2a
+ESEG CFG_FORTHWORDLIST 0000006a
+CSEG VE_SET_ORDER 00000a2b
+CSEG XT_SET_ORDER 00000a32
+CSEG PFA_SET_ORDER 00000a33
+CSEG VE_SET_RECOGNIZERS 00000a37
+CSEG XT_SET_RECOGNIZERS 00000a41
+CSEG PFA_SET_RECOGNIZERS 00000a42
+ESEG CFG_RECOGNIZERLISTLEN 0000007e
+CSEG VE_GET_RECOGNIZERS 00000a46
+CSEG XT_GET_RECOGNIZERS 00000a50
+CSEG PFA_GET_RECOGNIZERS 00000a51
+CSEG VE_CODE 00000a55
+CSEG XT_CODE 00000a59
+CSEG PFA_CODE 00000a5a
+CSEG VE_ENDCODE 00000a60
+CSEG XT_ENDCODE 00000a66
+CSEG PFA_ENDCODE 00000a67
+CSEG VE_MARKER 00000a6c
+CSEG XT_MARKER 00000a72
+CSEG PFA_MARKER 00000a73
+ESEG EE_MARKER 0000008a
+CSEG VE_POSTPONE 00000a76
+CSEG XT_POSTPONE 00000a7c
+CSEG PFA_POSTPONE 00000a7d
+CSEG VE_APPLTURNKEY 00000a8b
+CSEG XT_APPLTURNKEY 00000a93
+CSEG PFA_APPLTURNKEY 00000a94
+CSEG XT_INTON 00003c96
+SET DPSTART 00000aa1
+CSEG DO_INTERRUPT 00003813
+CSEG DO_EXECUTE 0000380c
+CSEG XT_ISREXEC 00003cbf
+CSEG VE_EXIT 0000381b
+CSEG PFA_EXIT 00003820
+CSEG VE_EXECUTE 00003823
+CSEG PFA_EXECUTE 0000382a
+CSEG PFA_DOBRANCH 0000382f
+CSEG PFA_DOCONDBRANCH 00003836
+CSEG PFA_DOLITERAL 0000383d
+CSEG XT_DOVARIABLE 00003846
+CSEG XT_DOCONSTANT 00003850
+CSEG XT_DOUSER 00003856
+CSEG VE_DOVALUE 00003862
+CSEG XT_DOVALUE 00003868
+CSEG PFA_DOVALUE 00003869
+CSEG VE_FETCH 00003875
+CSEG PFA_FETCH 00003879
+CSEG PFA_FETCHRAM 00003879
+CSEG VE_STORE 0000387d
+CSEG PFA_STORE 00003881
+CSEG PFA_STORERAM 00003881
+CSEG VE_CSTORE 00003889
+CSEG PFA_CSTORE 0000388d
+CSEG VE_CFETCH 00003894
+CSEG PFA_CFETCH 00003898
+CSEG VE_FETCHU 0000389c
+CSEG XT_FETCHU 0000389f
+CSEG PFA_FETCHU 000038a0
+CSEG VE_STOREU 000038a4
+CSEG XT_STOREU 000038a7
+CSEG PFA_STOREU 000038a8
+CSEG VE_DUP 000038ac
+CSEG PFA_DUP 000038b1
+CSEG VE_QDUP 000038b4
+CSEG PFA_QDUP 000038b9
+CSEG PFA_QDUP1 000038be
+CSEG VE_SWAP 000038bf
+CSEG PFA_SWAP 000038c4
+CSEG VE_OVER 000038ca
+CSEG PFA_OVER 000038cf
+CSEG VE_DROP 000038d4
+CSEG PFA_DROP 000038d9
+CSEG VE_ROT 000038dc
+CSEG PFA_ROT 000038e1
+CSEG VE_NIP 000038eb
+CSEG PFA_NIP 000038f0
+CSEG VE_R_FROM 000038f2
+CSEG PFA_R_FROM 000038f6
+CSEG VE_TO_R 000038fb
+CSEG PFA_TO_R 000038ff
+CSEG VE_R_FETCH 00003904
+CSEG PFA_R_FETCH 00003908
+CSEG VE_NOTEQUAL 0000390f
+CSEG PFA_NOTEQUAL 00003913
+CSEG VE_ZEROEQUAL 00003916
+CSEG PFA_ZEROEQUAL 0000391a
+CSEG PFA_ZERO1 00003956
+CSEG PFA_TRUE1 0000394d
+CSEG VE_ZEROLESS 0000391d
+CSEG PFA_ZEROLESS 00003921
+CSEG VE_GREATERZERO 00003924
+CSEG PFA_GREATERZERO 00003928
+CSEG VE_DGREATERZERO 0000392d
+CSEG XT_DGREATERZERO 00003931
+CSEG PFA_DGREATERZERO 00003932
+CSEG VE_DXT_ZEROLESS 0000393b
+CSEG XT_DXT_ZEROLESS 0000393f
+CSEG PFA_DXT_ZEROLESS 00003940
+CSEG VE_TRUE 00003946
+CSEG PFA_TRUE 0000394b
+CSEG VE_ZERO 00003950
+CSEG PFA_ZERO 00003954
+CSEG VE_ULESS 00003958
+CSEG PFA_ULESS 0000395c
+CSEG VE_UGREATER 00003963
+CSEG PFA_UGREATER 00003967
+CSEG VE_LESS 0000396a
+CSEG PFA_LESS 0000396e
+CSEG PFA_LESSDONE 00003972
+CSEG VE_GREATER 00003974
+CSEG PFA_GREATER 00003978
+CSEG PFA_GREATERDONE 0000397c
+CSEG VE_LOG2 0000397f
+CSEG XT_LOG2 00003983
+CSEG PFA_LOG2 00003984
+CSEG PFA_LOG2_1 00003987
+CSEG PFA_LOG2_2 0000398d
+CSEG VE_MINUS 0000398f
+CSEG PFA_MINUS 00003993
+CSEG VE_PLUS 00003999
+CSEG PFA_PLUS 0000399d
+CSEG VE_MSTAR 000039a2
+CSEG PFA_MSTAR 000039a6
+CSEG VE_UMSLASHMOD 000039bc
+CSEG PFA_UMSLASHMOD 000039c2
+CSEG PFA_UMSLASHMODmod 000039c7
+CSEG PFA_UMSLASHMODmod_loop 000039c8
+CSEG PFA_UMSLASHMODmod_loop_control 000039d5
+CSEG PFA_UMSLASHMODmod_subtract 000039d2
+CSEG PFA_UMSLASHMODmod_done 000039d7
+CSEG VE_UMSTAR 000039db
+CSEG PFA_UMSTAR 000039e0
+CSEG VE_INVERT 000039f7
+CSEG PFA_INVERT 000039fd
+CSEG VE_2SLASH 00003a00
+CSEG PFA_2SLASH 00003a04
+CSEG VE_2STAR 00003a07
+CSEG PFA_2STAR 00003a0b
+CSEG VE_AND 00003a0e
+CSEG PFA_AND 00003a13
+CSEG VE_OR 00003a18
+CSEG PFA_OR 00003a1c
+CSEG VE_XOR 00003a21
+CSEG XT_XOR 00003a25
+CSEG PFA_XOR 00003a26
+CSEG VE_1PLUS 00003a2b
+CSEG PFA_1PLUS 00003a2f
+CSEG VE_1MINUS 00003a31
+CSEG PFA_1MINUS 00003a35
+CSEG VE_QNEGATE 00003a37
+CSEG XT_QNEGATE 00003a3d
+CSEG PFA_QNEGATE 00003a3e
+CSEG QNEG1 00003a42
+CSEG VE_LSHIFT 00003a43
+CSEG XT_LSHIFT 00003a48
+CSEG PFA_LSHIFT 00003a49
+CSEG PFA_LSHIFT1 00003a4c
+CSEG PFA_LSHIFT2 00003a51
+CSEG VE_RSHIFT 00003a52
+CSEG XT_RSHIFT 00003a57
+CSEG PFA_RSHIFT 00003a58
+CSEG PFA_RSHIFT1 00003a5b
+CSEG PFA_RSHIFT2 00003a60
+CSEG VE_PLUSSTORE 00003a61
+CSEG PFA_PLUSSTORE 00003a65
+CSEG VE_RP_FETCH 00003a71
+CSEG PFA_RP_FETCH 00003a76
+CSEG VE_RP_STORE 00003a7b
+CSEG XT_RP_STORE 00003a7f
+CSEG PFA_RP_STORE 00003a80
+CSEG VE_SP_FETCH 00003a88
+CSEG PFA_SP_FETCH 00003a8d
+CSEG VE_SP_STORE 00003a91
+CSEG XT_SP_STORE 00003a95
+CSEG PFA_SP_STORE 00003a96
+CSEG PFA_DODO 00003a9b
+CSEG PFA_DODO1 00003a9d
+CSEG VE_I 00003aa8
+CSEG PFA_I 00003aac
+CSEG PFA_DOPLUSLOOP 00003aba
+CSEG PFA_DOPLUSLOOP_LEAVE 00003ac4
+CSEG PFA_DOPLUSLOOP_NEXT 00003ac1
+CSEG PFA_DOLOOP 00003ac9
+CSEG VE_UNLOOP 00003ace
+CSEG PFA_UNLOOP 00003ad4
+CSEG VE_CMOVE_G 00003ad9
+CSEG XT_CMOVE_G 00003ade
+CSEG PFA_CMOVE_G 00003adf
+CSEG PFA_CMOVE_G1 00003af0
+CSEG PFA_CMOVE_G2 00003aec
+CSEG VE_BYTESWAP 00003af5
+CSEG PFA_BYTESWAP 00003af9
+CSEG VE_UP_FETCH 00003afd
+CSEG PFA_UP_FETCH 00003b02
+CSEG VE_UP_STORE 00003b06
+CSEG XT_UP_STORE 00003b0a
+CSEG PFA_UP_STORE 00003b0b
+CSEG VE_1MS 00003b0f
+CSEG XT_1MS 00003b13
+CSEG PFA_1MS 00003b14
+SET cycles 00000000
+SET loop_cycles 00000fa0
+CSEG VE_2TO_R 00003b19
+CSEG PFA_2TO_R 00003b1e
+CSEG VE_2R_FROM 00003b28
+CSEG PFA_2R_FROM 00003b2d
+CSEG VE_STOREE 00003b37
+CSEG PFA_STOREE 00003b3b
+CSEG PFA_STOREE0 00003b3b
+CSEG PFA_FETCHE2 00003b69
+CSEG PFA_STOREE3 00003b45
+CSEG PFA_STOREE1 00003b50
+CSEG PFA_STOREE4 00003b4c
+CSEG PFA_STOREE2 00003b52
+CSEG VE_FETCHE 00003b5b
+CSEG PFA_FETCHE 00003b5f
+CSEG PFA_FETCHE1 00003b5f
+CSEG VE_STOREI 00003b6f
+CSEG PFA_STOREI 00003b73
+ESEG EE_STOREI 00000088
+CSEG VE_DO_STOREI_NRWW 00003b76
+CSEG XT_DO_STOREI 00003b7d
+CSEG PFA_DO_STOREI_NRWW 00003b7e
+CSEG DO_STOREI_atmega 00003b92
+CSEG pageload 00003ba3
+CSEG DO_STOREI_writepage 00003b9c
+CSEG dospm 00003bbc
+EQU pagemask ffffffc0
+CSEG pageload_loop 00003ba9
+CSEG pageload_newdata 00003bb4
+CSEG pageload_cont 00003bb6
+CSEG pageload_done 00003bbb
+CSEG dospm_wait_ee 00003bbc
+CSEG dospm_wait_spm 00003bbe
+CSEG VE_FETCHI 00003bc7
+CSEG PFA_FETCHI 00003bcb
+CSEG VE_N_TO_R 00003bd1
+CSEG XT_N_TO_R 00003bd5
+CSEG PFA_N_TO_R 00003bd6
+CSEG PFA_N_TO_R1 00003bd8
+CSEG VE_N_R_FROM 00003be3
+CSEG XT_N_R_FROM 00003be7
+CSEG PFA_N_R_FROM 00003be8
+CSEG PFA_N_R_FROM1 00003bed
+CSEG VE_D2STAR 00003bf5
+CSEG XT_D2STAR 00003bf9
+CSEG PFA_D2STAR 00003bfa
+CSEG VE_D2SLASH 00003c03
+CSEG XT_D2SLASH 00003c07
+CSEG PFA_D2SLASH 00003c08
+CSEG VE_DPLUS 00003c11
+CSEG PFA_DPLUS 00003c15
+CSEG VE_DMINUS 00003c22
+CSEG XT_DMINUS 00003c25
+CSEG PFA_DMINUS 00003c26
+CSEG VE_DINVERT 00003c34
+CSEG PFA_DINVERT 00003c3b
+CSEG VE_SLASHMOD 00003c44
+CSEG XT_SLASHMOD 00003c48
+CSEG PFA_SLASHMOD 00003c49
+CSEG PFA_SLASHMOD_1 00003c54
+CSEG PFA_SLASHMOD_2 00003c5a
+CSEG PFA_SLASHMOD_3 00003c5d
+CSEG PFA_SLASHMOD_5 00003c68
+CSEG PFA_SLASHMOD_4 00003c67
+CSEG PFA_SLASHMODmod_done 00003c73
+CSEG PFA_SLASHMOD_6 00003c71
+CSEG VE_ABS 00003c77
+CSEG XT_ABS 00003c7b
+CSEG PFA_ABS 00003c7c
+CSEG VE_PICK 00003c7f
+CSEG XT_PICK 00003c83
+CSEG PFA_PICK 00003c84
+CSEG VE_CELLPLUS 00003c8a
+CSEG PFA_CELLPLUS 00003c90
+CSEG VE_INTON 00003c92
+CSEG PFA_INTON 00003c97
+CSEG VE_INTOFF 00003c99
+CSEG XT_INTOFF 00003c9d
+CSEG PFA_INTOFF 00003c9e
+CSEG VE_INTSTORE 00003ca0
+CSEG PFA_INTSTORE 00003ca5
+CSEG VE_INTFETCH 00003caa
+CSEG XT_INTFETCH 00003cae
+CSEG PFA_INTFETCH 00003caf
+CSEG VE_INTTRAP 00003cb4
+CSEG XT_INTTRAP 00003cba
+CSEG PFA_INTTRAP 00003cbb
+CSEG PFA_ISREXEC 00003cc0
+CSEG XT_ISREND 00003cc4
+CSEG PFA_ISREND 00003cc5
+CSEG PFA_ISREND1 00003cc7
+CSEG XT_DEFAULT_PROMPTOK 00003cc8
+CSEG PFA_DEFAULT_PROMPTOK 00003cc9
+CSEG VE_PROMPTOK 00003ccf
+CSEG XT_PROMPTOK 00003cd3
+CSEG PFA_PROMPTOK 00003cd4
+CSEG XT_DEFAULT_PROMPTREADY 00003cd7
+CSEG PFA_DEFAULT_PROMPTREADY 00003cd8
+CSEG VE_PROMPTREADY 00003cde
+CSEG XT_PROMPTREADY 00003ce3
+CSEG PFA_PROMPTREADY 00003ce4
+CSEG XT_DEFAULT_PROMPTERROR 00003ce7
+CSEG PFA_DEFAULT_PROMPTERROR 00003ce8
+CSEG VE_PROMPTERROR 00003cf9
+CSEG XT_PROMPTERROR 00003cfe
+CSEG PFA_PROMPTERROR 00003cff
+CSEG VE_QUIT 00003d02
+CSEG XT_QUIT 00003d06
+CSEG PFA_QUIT 00003d07
+CSEG PFA_QUIT2 00003d0f
+CSEG PFA_QUIT4 00003d15
+CSEG PFA_QUIT3 00003d27
+CSEG XT_CATCH 00003d6f
+CSEG PFA_QUIT5 00003d25
+CSEG VE_PAUSE 00003d2a
+CSEG PFA_PAUSE 00003d30
+DSEG ram_pause 000001a3
+CSEG XT_RDEFERFETCH 00003db3
+CSEG XT_RDEFERSTORE 00003dbd
+CSEG VE_COLD 00003d33
+CSEG clearloop 00003d3f
+DSEG ram_user1 000001a5
+CSEG PFA_WARM 00003d59
+CSEG VE_WARM 00003d54
+CSEG XT_WARM 00003d58
+CSEG XT_DEFERSTORE 00003dde
+CSEG XT_TURNKEY 00003f5b
+CSEG VE_HANDLER 00003d62
+CSEG XT_HANDLER 00003d68
+CSEG PFA_HANDLER 00003d69
+CSEG VE_CATCH 00003d6a
+CSEG PFA_CATCH 00003d70
+CSEG VE_THROW 00003d80
+CSEG PFA_THROW 00003d86
+CSEG PFA_THROW1 00003d8c
+CSEG VE_EDEFERFETCH 00003d99
+CSEG PFA_EDEFERFETCH 00003da0
+CSEG VE_EDEFERSTORE 00003da3
+CSEG PFA_EDEFERSTORE 00003daa
+CSEG VE_RDEFERFETCH 00003dad
+CSEG PFA_RDEFERFETCH 00003db4
+CSEG VE_RDEFERSTORE 00003db7
+CSEG PFA_RDEFERSTORE 00003dbe
+CSEG VE_UDEFERFETCH 00003dc1
+CSEG PFA_UDEFERFETCH 00003dc8
+CSEG VE_UDEFERSTORE 00003dcd
+CSEG PFA_UDEFERSTORE 00003dd4
+CSEG VE_DEFERSTORE 00003dd9
+CSEG PFA_DEFERSTORE 00003ddf
+CSEG VE_DEFERFETCH 00003de6
+CSEG XT_DEFERFETCH 00003deb
+CSEG PFA_DEFERFETCH 00003dec
+CSEG VE_DODEFER 00003df2
+CSEG XT_DODEFER 00003df8
+CSEG PFA_DODEFER 00003df9
+CSEG VE_UDOT 00003e06
+CSEG XT_UDOT 00003e09
+CSEG PFA_UDOT 00003e0a
+CSEG VE_UDOTR 00003e0d
+CSEG XT_UDOTR 00003e11
+CSEG PFA_UDOTR 00003e12
+CSEG VE_USLASHMOD 00003e16
+CSEG XT_USLASHMOD 00003e1b
+CSEG PFA_USLASHMOD 00003e1c
+CSEG VE_NEGATE 00003e21
+CSEG PFA_NEGATE 00003e27
+CSEG VE_SLASH 00003e2a
+CSEG XT_SLASH 00003e2d
+CSEG PFA_SLASH 00003e2e
+CSEG VE_MOD 00003e31
+CSEG XT_MOD 00003e35
+CSEG PFA_MOD 00003e36
+CSEG VE_MIN 00003e39
+CSEG XT_MIN 00003e3d
+CSEG PFA_MIN 00003e3e
+CSEG PFA_MIN1 00003e43
+CSEG VE_MAX 00003e45
+CSEG XT_MAX 00003e49
+CSEG PFA_MAX 00003e4a
+CSEG PFA_MAX1 00003e4f
+CSEG VE_WITHIN 00003e51
+CSEG PFA_WITHIN 00003e57
+CSEG VE_SHOWWORDLIST 00003e5e
+CSEG XT_SHOWWORDLIST 00003e67
+CSEG PFA_SHOWWORDLIST 00003e68
+CSEG XT_SHOWWORD 00003e6d
+CSEG PFA_SHOWWORD 00003e6e
+CSEG VE_WORDS 00003e73
+CSEG XT_WORDS 00003e78
+CSEG PFA_WORDS 00003e79
+CSEG VE_DOTSTRING 00003e7e
+CSEG XT_DOTSTRING 00003e81
+CSEG PFA_DOTSTRING 00003e82
+CSEG VE_SQUOTE 00003e86
+CSEG PFA_SQUOTE 00003e8a
+CSEG PFA_SQUOTE1 00003e92
+CSEG VE_FILL 00003e93
+CSEG PFA_FILL 00003e98
+CSEG PFA_FILL2 00003ea4
+CSEG PFA_FILL1 00003e9f
+CSEG VE_F_CPU 00003ea6
+CSEG XT_F_CPU 00003eab
+CSEG PFA_F_CPU 00003eac
+CSEG VE_STATE 00003eb1
+CSEG PFA_STATE 00003eb7
+DSEG ram_state 000001d1
+CSEG VE_BASE 00003eb8
+CSEG PFA_BASE 00003ebd
+CSEG VE_CELLS 00003ebe
+CSEG VE_2DUP 00003ec4
+CSEG PFA_2DUP 00003ec9
+CSEG VE_2DROP 00003ecc
+CSEG PFA_2DROP 00003ed2
+CSEG VE_TUCK 00003ed5
+CSEG PFA_TUCK 00003eda
+CSEG VE_TO_IN 00003edd
+CSEG PFA_TO_IN 00003ee2
+CSEG VE_PAD 00003ee3
+CSEG PFA_PAD 00003ee8
+CSEG VE_EMIT 00003eed
+CSEG PFA_EMIT 00003ef2
+CSEG VE_EMITQ 00003ef5
+CSEG XT_EMITQ 00003efa
+CSEG PFA_EMITQ 00003efb
+CSEG VE_KEY 00003efe
+CSEG PFA_KEY 00003f03
+CSEG VE_KEYQ 00003f06
+CSEG XT_KEYQ 00003f0a
+CSEG PFA_KEYQ 00003f0b
+CSEG VE_DP 00003f0e
+ESEG CFG_DP 00000058
+CSEG VE_EHERE 00003f15
+ESEG EE_EHERE 0000005c
+CSEG VE_HERE 00003f1e
+CSEG PFA_HERE 00003f23
+ESEG EE_HERE 0000005a
+CSEG VE_ALLOT 00003f26
+CSEG PFA_ALLOT 00003f2c
+CSEG VE_BIN 00003f31
+CSEG XT_BIN 00003f35
+CSEG PFA_BIN 00003f36
+CSEG VE_DECIMAL 00003f3a
+CSEG PFA_DECIMAL 00003f41
+CSEG VE_HEX 00003f46
+CSEG XT_HEX 00003f4a
+CSEG PFA_HEX 00003f4b
+CSEG VE_BL 00003f50
+CSEG PFA_BL 00003f54
+CSEG VE_TURNKEY 00003f55
+CSEG PFA_TURNKEY 00003f5c
+ESEG CFG_TURNKEY 00000064
+CSEG VE_TOUPPER 00003f5f
+CSEG PFA_TOUPPER 00003f66
+CSEG PFA_TOUPPER0 00003f71
+CSEG VE_TOLOWER 00003f72
+CSEG PFA_TOLOWER 00003f79
+CSEG PFA_TOLOWER0 00003f84
+CSEG VE_QSTACK 00003f85
+CSEG PFA_QSTACK 00003f8b
+CSEG PFA_QSTACK1 00003f92
+CSEG VE_BOUNDS 00003f93
+CSEG PFA_BOUNDS 00003f99
+CSEG VE_CR 00003f9d
+CSEG PFA_CR 00003fa1
+CSEG VE_SPACE 00003fa8
+CSEG PFA_SPACE 00003fae
+CSEG VE_SPACES 00003fb1
+CSEG PFA_SPACES 00003fb7
+CSEG SPCS1 00003fb9
+CSEG SPCS2 00003fc0
+CSEG VE_S2D 00003fc2
+CSEG PFA_S2D 00003fc7
+CSEG VE_TO_BODY 00003fca
+CSEG VE_2LITERAL 00003fd0
+CSEG PFA_2LITERAL 00003fd7
+CSEG VE_EQUAL 00003fdb
+CSEG PFA_EQUAL 00003fdf
+CSEG VE_ONE 00003fe2
+CSEG PFA_ONE 00003fe6
+CSEG VE_TWO 00003fe7
+CSEG PFA_TWO 00003feb
+CSEG VE_MINUSONE 00003fec
+CSEG XT_MINUSONE 00003fef
+CSEG PFA_MINUSONE 00003ff0
+SET flashlast 00003ff1
+DSEG HERESTART 000001d3
+ESEG EHERESTART 000000b0
+ESEG CFG_ORDERLIST 0000006e
+ESEG CFG_RECOGNIZERLIST 00000080
+EQU UBRR_VAL 00000019
+EQU BAUD_REAL 0000963d
+EQU BAUD_ERROR 00000001
diff --git a/amforth-6.5/appl/arduino/mega128.asm b/amforth-6.5/appl/arduino/mega128.asm
new file mode 100644
index 0000000..4b8dc0e
--- /dev/null
+++ b/amforth-6.5/appl/arduino/mega128.asm
@@ -0,0 +1,18 @@
+; 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 WANT_IGNORECASE = 1
+
+.equ F_CPU = 16000000
+.include "drivers/usart_0.asm"
+
+; settings for 1wire interface, if desired
+.equ OW_PORT=PORTE
+.EQU OW_BIT=4
+.include "drivers/1wire.asm"
+
+; include the whole source tree.
+.include "amforth.asm"
diff --git a/amforth-6.5/appl/arduino/mega128.eep.hex b/amforth-6.5/appl/arduino/mega128.eep.hex
new file mode 100644
index 0000000..1ecf1c5
--- /dev/null
+++ b/amforth-6.5/appl/arduino/mega128.eep.hex
@@ -0,0 +1,7 @@
+:10007200FFFF5905E102CC006D049A00B0214B0547
+:0A0082004CF58600B8FD0100860071
+:06009A0002003EFB2AFB00
+:1000A4008FF3A60000000000FF21AF21AF21000064
+:1000B4000A00E100EF00B600D10050FD00003DFD54
+:0800C40004FA23FA13FA1900F3
+:00000001FF
diff --git a/amforth-6.5/appl/arduino/mega128.hex b/amforth-6.5/appl/arduino/mega128.hex
new file mode 100644
index 0000000..1f30b38
--- /dev/null
+++ b/amforth-6.5/appl/arduino/mega128.hex
@@ -0,0 +1,657 @@
+:020000020000FC
+:0200040064D1C5
+:0200080062D1C3
+:02000C0060D1C1
+:020010005ED1BF
+:020014005CD1BD
+:020018005AD1BB
+:02001C0058D1B9
+:0200200056D1B7
+:0200240054D1B5
+:0200280052D1B3
+:02002C0050D1B1
+:020030004ED1AF
+:020034004CD1AD
+:020038004AD1AB
+:02003C0048D1A9
+:0200400046D1A7
+:0200440044D1A5
+:0200480042D1A3
+:02004C0040D1A1
+:020050003ED19F
+:020054003CD19D
+:020058003AD19B
+:02005C0038D199
+:0200600036D197
+:0200640034D195
+:0200680032D193
+:02006C0030D191
+:020070002ED18F
+:020074002CD18D
+:020078002AD18B
+:02007C0028D189
+:0200800026D187
+:0200840024D185
+:0200880022D183
+:02008C0020D181
+:020090001ED17F
+:020094001CD17D
+:020098001AD17B
+:02009C0018D179
+:0200A00016D177
+:0200A40014D175
+:0200A80012D173
+:0200AC0010D171
+:0200B0000ED16F
+:0200B4000CD16D
+:0200B8000AD16B
+:0200BC0008D169
+:0200C00006D167
+:0200C40004D165
+:0200C80002D163
+:0200CC0000D161
+:0200D000FED060
+:0200D400FCD05E
+:0200D800FAD05C
+:0200DC00F8D05A
+:1000E000F6D000200010FFFF39000A0041546D6572
+:1000F00067613132383007FF3E72782D62756600D5
+:1001000000008200082F10911002E0E0F2E0E10F01
+:10011000F31D008313951F7010931002899199911C
+:100120000C9404F006FF6973722D72787B0000F066
+:1001300045F0C600A9F0C2F045F00300AAFD3EF06C
+:10014000A20073FA810025F000F045F0970045F019
+:100150003200A1F445F0000245F0160065F1E9F423
+:1001600025F006FF72782D627566920000F0D100CE
+:100170003EF0B70045F01102A9F0C2F045F00002D0
+:10018000AEF1A9F0D5F040F245F00F0024F245F0B1
+:1001900011029EF025F007FF72783F2D6275660010
+:1001A000B10000F06BFA45F01102A9F045F0100221
+:1001B000A9F024F125F007FF74782D706F6C6C00A6
+:1001C000CB0000F0EF003EF0E20045F0C6009EF0EC
+:1001D00025F008FF74783F2D706F6C6CDB0000F029
+:1001E0006BFA45F0C000A9F045F0200024F225F09C
+:1001F00004FF75627272E90080F0CA00CEFBD8FB82
+:1002000006FF2B7573617274F80000F045F09800DA
+:1002100045F0C1009EF045F0060045F0C2009EF09A
+:10022000FC00C2F00AF345F0C5009EF045F0C400A2
+:100230009EF0A40025F008FF31772E726573657477
+:10024000000122019A938A936C9A7498E0E8F7E08F
+:100250003197F1F71FB7F894749A6C98E0E0F1E0E9
+:100260003197F1F78CB184FF9FEF1FBF6C987498A2
+:10027000E0E8F6E03197F1F7892F0C9404F007FFDE
+:1002800031772E736C6F74001B01460174986C9A61
+:100290001FB7F894E8E1F0E03197F1F7889487957B
+:1002A00010F4749A6C98E4E2F0E03197F1F70CB135
+:1002B00004FD8068ECECF0E03197F1F7749A6C98EB
+:0E02C000E8E0F0E03197F1F71FBF0C9404F076
+:040000000C9474FAEE
+:1002CE000A920FB60A920F900F900A94B02CFF93D9
+:1002DE00EF93E2E1F2E00694E00DF31D008003944B
+:1002EE000082EF91FF9109900FBE0990089502FFD1
+:1002FE006D2B3F0100F092FD2FF425F003FF756486
+:10030E002A007E0100F0C2F010F1F1F1EAF0D5F012
+:10031E0007F1F1F1F2F0AEF125F004FF756D6178A1
+:10032E00850100F07FF56DF13EF09E01D5F0EAF00B
+:10033E0025F004FF756D696E940100F07FF578F17C
+:10034E003EF0AA01D5F0EAF025F000F045F000806D
+:10035E0024F22BF13EF0B501B1FD25F05CF125F054
+:10036E000AFF6E616D653E666C616773A00100F0F9
+:10037E00E2F345F000FF24F225F006FF6E65776587
+:10038E007374B70153F04B0206FF6C61746573749E
+:10039E00C40153F04F0208FF28637265617465292A
+:1003AE00CB0100F0CEF92F03C2F0C90178F592F01F
+:1003BE001403C90192F025F001005C00D20100F097
+:1003CE00B5F901F198F592F025F001002800E3014E
+:1003DE0000F045F02900A1F988F525F007FF636FBD
+:1003EE006D70696C6500EC0100F007F1C2F0C5FBA1
+:1003FE0010F1E2F3060225F001FF2C00F50100F0EA
+:10040E00C8F584F3C8F540F2B3FBC9F525F0030037
+:10041E005B275D00030200F024F81C0225F00700A4
+:10042E006C69746572616C000E0200F0FB0145F0A0
+:10043E00060225F00800736C69746572616C160211
+:10044E0000F0FB0187F795F725F000F0C8F5FB01EA
+:10045E00FFFF25F000F071FBC8F5D5F084F325F011
+:10046E0000F0C8F525F000F071FB060225F005003E
+:10047E00616865616400210200F0FB0134F02C021A
+:10048E0025F0020069663E0200F0FB013EF02C02F0
+:10049E0025F00400656C7365480200F0FB0134F032
+:1004AE002C02D5F0310225F004007468656E5002FE
+:1004BE0000F0310225F00500626567696E005B028F
+:1004CE0000F0370225F005007768696C650062025E
+:1004DE0000F04B02D5F025F0060072657065617470
+:1004EE006A0200F08C025F0225F00500756E7469D9
+:1004FE006C00730200F045F03EF006023A0225F061
+:10050E000500616761696E007C0200F0FB0134F04A
+:10051E003A0225F00200646F870200F0FB01ACF294
+:10052E00370265F1EF0225F004006C6F6F709102D7
+:10053E0000F0FB01DAF2D60225F005002B6C6F6F8E
+:10054E0070009B0200F0FB01CBF2D60225F00500F5
+:10055E006C6561766500A40200F0FB01E5F24302D2
+:10056E00EF0225F003003F646F00AE0200F0FB01C6
+:10057E00C5024B029402D5F0EF0225F000F07FF594
+:10058E00AAFDC2F010F13EF0CD0288F507F10EF291
+:10059E0025F007FF656E646C6F6F7000B90200F096
+:1005AE003A02E302CAF03EF0DF025F0234F0D802F4
+:1005BE0025F002FF6C3ED00200F002038AF08AF0B2
+:1005CE0045F0FEFF020376F225F002FF3E6CE002DC
+:1005DE0000F0B6FD020376F202038AF092F025F0E7
+:1005EE0003FF6C703000EC0280F07E00CEFBD8FB77
+:1005FE0002FF6C70F70253F0510206FF63726561E1
+:10060E007465FF0200F0D8013803FB0160F025F09D
+:10061E0006FF686561646572040300F0C8F510F1A9
+:10062E0010F1C2F039F13EF02603C2F045F000FFA2
+:10063E002DF299F707F170F3060207F125F045F058
+:10064E00F0FF5BF807FF776C73636F7065000F0345
+:10065E002DFC7A00CEFBD8FB06FF72657665616CC9
+:10066E00290300F0C90178F58AF0CAF03EF0430381
+:10067E00C9018AF0D5F04CF325F00500646F65735F
+:10068E003E00330300F0FB015C03FB010E94FB0103
+:10069E00510325F09A938A93CB0101967F916F9126
+:1006AE00BF93AF93DB010C9404F000F007F1C90186
+:1006BE0078F58AF070F398FC84F325F001FF3A0088
+:1006CE00440300F0D8017303EAF025F007FF3A6EF9
+:1006DE006F6E616D6500650300F0C8F5C2F0D00164
+:1006EE0092F0FB0100F0880325F001003B006D0342
+:1006FE0000F0FB0125F09003380325F001FF5D00AB
+:10070E007C0300F0B1FD65F592F025F001005B0071
+:10071E00850300F065F165F592F025F008FF76612E
+:10072E00726961626C658D0300F0D9F5A703B6FDA1
+:10073E00E2F525F008FF636F6E7374616E749503B6
+:10074E0000F0D8013803FB0153F0060225F004FF38
+:10075E0075736572A10300F0D8013803FB0166F0D2
+:10076E00060225F007007265637572736500AE03AD
+:10077E0000F0D0018AF0060225F009FF696D6D6563
+:10078E00646961746500B90300F06D0470F3C2F022
+:10079E00E2F345F0FF7F24F2D5F084F325F0060056
+:1007AE005B636861725DC40300F0FB0145F004F900
+:1007BE00060225F0060061626F727422D60300F005
+:1007CE00DBF4FB01F80325F005FF61626F72740024
+:1007DE00E10300F05CF15BF806FF3F61626F72743B
+:1007EE00EB0300F0F2F03EF0FE03BAF7F00388F5EB
+:1007FE0025F009FF6765742D737461636B00F30355
+:10080E0000F0C2F078F5D5F070F3C2F010F165F19A
+:10081E00D5F0C5023EF01E04ACF2BDF246F272F502
+:10082E00E0F0AEF170F3D5F05CF1CBF2140488F584
+:10083E0007F125F009FF7365742D737461636B0006
+:10084E00000400F0E0F032F13EF0300445F0FCFF21
+:10085E005BF87FF54CF3D5F065F1C5023EF03D0433
+:10086E00ACF278F590F54CF3DAF23804EAF025F0B4
+:10087E0009FF6D61702D737461636B00210400F0CC
+:10088E00C2F078F5D5F070F372F589FDC5023EF031
+:10089E006204ACF2BDF270F3D5F010F119F12FF045
+:1008AE00CAF03EF05E0407F1EAF0E5F225F007F13A
+:1008BE00B6FDCBF25104EAF065F125F00BFF67654A
+:1008CE00742D63757272656E74003F0400F045F00E
+:1008DE00840070F325F009FF6765742D6F726465EF
+:1008EE007200650400F045F08800070425F009FF4A
+:1008FE006366672D6F7264657200720453F0880030
+:10090E0007FF636F6D70617265007E048E04BF9386
+:10091E00AF938C0189919991DC01899199919C01F8
+:10092E0089919991FC01ED90F190EF1451F40A9593
+:10093E0019F02A95C1F701C02A95022B11F48827C8
+:10094E0002C08FEF00C0982FAF91BF910C9404F0AE
+:10095E0007FF6E66613E6C666100870400F08CFCDA
+:10096E0040F215F2AEF125F00BFF7365742D637531
+:10097E007272656E7400AF0400F045F084004CF3A3
+:10098E0025F008FF776F72646C697374BB0400F016
+:10099E00D1F565F1E0F04CF3C2F078F5B3FBD2F58A
+:1009AE0025F00EFF666F7274682D776F72646C6936
+:1009BE007374C80453F0860009FF7365742D6F724B
+:1009CE0064657200D80400F045F08800280425F014
+:1009DE000FFF7365742D7265636F676E697A65724A
+:1009EE007300E30400F045F09A00280425F00FFF91
+:1009FE006765742D7265636F676E697A65727300D1
+:100A0E00EF0400F045F09A00070425F004FF636F31
+:100A1E006465FE0400F0D8013803C8F5C5FB060274
+:100A2E0025F008FF656E642D636F64650D0500F09B
+:100A3E00FB010C94FB0104F025F008FF286D617298
+:100A4E006B657229180580F0A600CEFBD8FB080056
+:100A5E00706F7374706F6E65240500F0CEF9E6FA50
+:100A6E00F1FAC2F010F1C5FBC5FBE2F32FF007F16E
+:100A7E00C5FBE2F3060225F00BFF6170706C747516
+:100A8E00726E6B6579002E0500F0050193F47EFB06
+:100A9E00FCF787F70A00466F7274686475696E6FAB
+:040AAE00BAF725F07E
+:020000021000EC
+:10E00000BF93AF93DB011196B21499F4FD0155272C
+:10E01000EE0FFF1F551F5BBF679177911196FB01B4
+:10E020005527EE0FFF1F551F5BBF07911791F80192
+:10E0300009949A938A938B2D9927BB246CEB74EFE8
+:10E04000EECF04FF65786974430526F0AF91BF9168
+:10E05000DBCF07FF657865637574650021F030F0EC
+:10E06000BC0189919991DBCF35F0FD015527EE0F69
+:10E07000FF1F551F5BBFA791B791C6CF3FF0982BED
+:10E080008991999191F31196BFCF46F09A938A9313
+:10E09000FD015527EE0FFF1F551F5BBF879197911D
+:10E0A0001196B2CF53F09A938A93FB01319655277C
+:10E0B000EE0FFF1F551F5BBF87919791A5CF60F0B3
+:10E0C0009A938A93CB0101969FCF66F09A938A9395
+:10E0D000FB0131965527EE0FFF1F551F5BBF879140
+:10E0E0009791840D951D90CF07FF2876616C75651B
+:10E0F000290029F000F0D8013803FB0180F025F059
+:10E100000E945103C2F0C5FBE2F32FF025F001FF9E
+:10E11000400074F08BF0FC018191919175CF01FF6B
+:10E12000210087F093F0FC0189919991918380837C
+:10E130008991999169CF02FF63218FF09FF0FC01D3
+:10E14000899199918083899199915ECF02FF634073
+:10E150009BF0AAF0FC019927808156CF02FF407501
+:10E16000A6F000F013F3AEF18AF025F002FF21755E
+:10E17000AEF000F013F3AEF192F025F003FF6475FA
+:10E180007000B6F0C3F09A938A933ECF04FF3F64C9
+:10E190007570BEF0CBF0082F092B11F09A938A937B
+:10E1A00033CF04FF73776170C6F0D6F08C0189918C
+:10E1B00099911A930A9328CF04FF6F766572D1F074
+:10E1C000E1F09A938A938A819B811ECF04FF647247
+:10E1D0006F70DCF0EBF08991999116CF03FF726FAD
+:10E1E0007400E6F0F3F08C012991399189919991AD
+:10E1F0003A932A931A930A9307CF03FF6E6970002C
+:10E20000EEF002F1229600CF02FF723EFDF008F11F
+:10E210009A938A938F919F91F7CE02FF3E7204F1F9
+:10E2200011F19F938F9389919991EECE02FF7240E5
+:10E230000DF11AF19A938A938F919F919F938F93E7
+:10E24000E3CE02FF3C3E16F100F0AAFD2BF125F0D3
+:10E2500002FF303D21F12CF1982BD1F530C002FFA7
+:10E26000303C28F133F197FD2AC032C002FF303E26
+:10E270002FF13AF1821593055CF151F120C003FFB3
+:10E2800064303E0036F144F18215930589919991ED
+:10E2900082059305ECF0E1F012C003FF64303C000E
+:10E2A0003FF152F1229697FD0C945FF10C9468F1C6
+:10E2B00004FF747275654DF15DF19A938A938FEF47
+:10E2C0009FEFA2CE01FF300058F166F19A938A9336
+:10E2D000C1019ACE02FF753C62F16EF1299139912C
+:10E2E00082179307A8F3A1F3EACF02FF753E6AF104
+:10E2F00000F0D5F06DF125F001FF3C0075F180F1E3
+:10E3000029913991281739071CF7D9CF01FF3E0011
+:10E310007CF18AF12991399128173907CCF2C1F2A1
+:10E32000CECF04FF6C6F673286F196F1FC0199271E
+:10E3300080E18A9522F0EE0FFF1FD8F765CE9A95FF
+:10E3400063CE01FF2D0091F1A5F109911991081BF0
+:10E35000190BC80159CE01FF2B00A1F1AFF10991B2
+:10E360001991800F911F50CE02FF6D2AABF1B8F1C9
+:10E370008C01899199919C0131027001209FC0010B
+:10E380003003F308900DE11CF31C1203F308900D09
+:10E39000E11CF31C9A938A93C70136CE06FF756D74
+:10E3A0002F6D6F64B4F1D4F17C01299139910991F9
+:10E3B000199140E15527000F111F221F331F551FD0
+:10E3C0002E153F05520518F003952E193F094A9561
+:10E3D00089F73A932A93C80117CE03FF756D2A0077
+:10E3E000CEF1F2F18C0189919991809FF001222761
+:10E3F0003327909FF00D211D331D819FF00D211DAE
+:10E40000331D919F200D311DCF019A938A93C9012D
+:10E41000FBCD06FF696E76657274EDF10FF28095A3
+:10E420009095F2CD02FF322F09F216F2959587955D
+:10E43000EBCD02FF322A12F21DF2880F991FE4CDB4
+:10E4400003FF616E640019F225F20991199180238E
+:10E450009123DACD02FF6F7220F22EF20991199109
+:10E46000802B912BD1CD03FF786F72002AF238F206
+:10E470000991199180279127C7CD02FF312B33F2E3
+:10E4800041F20196C1CD02FF312D3DF247F20197D5
+:10E49000BBCD07FF3F6E65676174650043F200F016
+:10E4A00032F13EF054F259F625F006FF6C736869BC
+:10E4B000667449F25BF2FC018991999131971AF0E7
+:10E4C000880F991FFBCFA0CD06FF72736869667431
+:10E4D00055F26AF2FC018991999131971AF096955B
+:10E4E0008795FBCF91CD02FF2B2164F277F2FC01DF
+:10E4F0008991999120813181820F931F808391832B
+:10E500008991999181CD03FF7270400073F288F276
+:10E510009A938A938DB79EB777CD03FF72702100CF
+:10E5200083F292F22FB7F8948DBF9EBF2FBF8991CF
+:10E5300099916ACD03FF737040008DF29FF29A9318
+:10E540008A93CE0161CD03FF737021009AF2A8F285
+:10E55000EC018991999158CDADF229913991E0E87A
+:10E560003E0F821B930B3F932F939F938F93899121
+:10E5700099914ACD01FF6900A3F2BEF29A938A9362
+:10E580008F919F91EF91FF91FF93EF939F938F93C3
+:10E590008E0F9F1F39CDCCF2EF91FF91E80FF91F3D
+:10E5A000899199911BF0FF93EF935FCD0F911F918C
+:10E5B00011962ACDDBF2EF91FF913196BBF3F3CFA9
+:10E5C00006FF756E6C6F6F70BAF2E6F21F910F91D5
+:10E5D0001F910F9119CD06FF636D6F76653EE0F2D6
+:10E5E000F1F2BF93AF93E991F991A991B991092FF4
+:10E5F000082B41F0E80FF91FA80FB91F1E911293C5
+:10E600000197E1F7AF91BF9189919991FDCC02FFFC
+:10E610003E3CEBF20BF3092F982F802FF5CC03FF34
+:10E620007570400007F314F39A938A93C201ECCCFF
+:10E6300003FF757021000FF31DF32C01899199914F
+:10E64000E3CC03FF316D730018F326F3E0EAFFE03B
+:10E650003197F1F7D9CC03FF323E720021F330F34A
+:10E66000FC01899199919F938F93FF93EF938991E7
+:10E670009991CACC03FF32723E002BF33FF39A9379
+:10E680008A93EF91FF918F919F919A938A93CF01F3
+:10E69000BBCC02FF21653AF34DF3FC0189919991BE
+:10E6A0002FB7F89428D000B5081709F00BD0319691
+:10E6B00022D000B5091711F0892F04D02FBF8991FE
+:10E6C0009991A2CCF999FECF07B700FDFDCFF2BD1D
+:10E6D000E1BD80BDFA9AF99A089502FF406549F3B9
+:10E6E00071F32FB7F894FC0106D080B5319603D0B2
+:10E6F00090B52FBF89CCF999FECFF2BDE1BDF89A54
+:10E70000089502FF21696DF32DFCA400CEFBD8FB18
+:10E7100009FF2821692D6E727777290081F390F324
+:10E720001FB71F93F8949C0189919991AF93BF9360
+:10E73000CF93DF9309D0DF91CF91BF91AF918991B2
+:10E7400099911F911FBF60CC10D0E094F0948E215E
+:10E750009F21982B19F0F90102E023D0F90104E080
+:10E7600020D0F90100E11DD00895F901E078FF7F84
+:10E77000EF01A0E8B0E0FE015527EE0FFF1F551F87
+:10E780005BBF47915791FE01E217F30711F00A01B1
+:10E7900002C07A010C01002704D02196119759F785
+:10E7A0000895F999FECF17B710FDFDCF5527EE0F4D
+:10E7B000FF1F551F5BBF016007BFE895089502FF6B
+:10E7C000406988F3E3F3FC015527EE0FFF1F551F47
+:10E7D0005BBF8791979118CC03FF6E3E7200DFF309
+:10E7E000F1F3FC01082F899199919F938F930A95DA
+:10E7F000D1F7EF93FF938991999106CC03FF6E7245
+:10E800003E00ECF303F49A938A93FF91EF910E2F5D
+:10E810008F919F919A938A930A95D1F7CF01F4CB68
+:10E8200003FF64322A00FEF315F409911991000FD9
+:10E83000111F881F991F1A930A93E6CB03FF6432B6
+:10E840002F0010F423F40991199195958795179548
+:10E8500007951A930A93D8CB02FF642B1EF430F469
+:10E8600029913991E990F99049915991240F351FD7
+:10E870008E1D9F1D3A932A93C7CB02FF642D2CF463
+:10E8800041F429913991E990F99049915991421BAC
+:10E89000530BE80AF90A5A934A93C701B5CB07FF0D
+:10E8A00064696E76657274003DF456F409911991AD
+:10E8B00080959095009510951A930A93A5CB02FF29
+:10E8C000752E4FF400F065F144F725F003FF752E27
+:10E8D00072005FF400F065F1D5F04DF725F00DFF03
+:10E8E00073686F772D776F72646C6973740066F468
+:10E8F00000F045F07EF4D5F071FC25F000F08CFCC2
+:10E90000BAF7FCF75CF125F005FF776F72647300CE
+:10E910006FF400F045F08A0070F378F425F004FFFE
+:10E920002B696E7484F494F478946ECB04FF2D6993
+:10E930006E748FF49BF4F89467CB04FF696E7421B6
+:10E9400096F400F045F00000AEF14CF325F004FF22
+:10E95000696E74409DF400F045F00000AEF170F374
+:10E9600025F008FF696E742D74726170A7F4B8F415
+:10E97000B82E8991999148CB00F0ABF42FF0C1F4F7
+:10E9800025F0C2F401D040CB189504FF7069636B89
+:10E99000B1F400F040F272F59EF2AEF18AF025F08B
+:10E9A00002002E22C5F400F0DBF4FB01BAF725F0DB
+:10E9B00002007322D0F400F045F02200A1F965F5C1
+:10E9C0008AF03EF0E4F4270225F004FF66696C6CDF
+:10E9D000D8F400F0F2F0F2F0CAF03EF0F6F489FD5F
+:10E9E000ACF2C2F0BDF29EF0DAF2F1F4EAF025F0FA
+:10E9F0000BFF656E7669726F6E6D656E7400E5F47F
+:10EA000053F0820009FF776F72646C69737473004E
+:10EA1000000000F045F0080025F004FF2F7061644D
+:10EA200002F500F09EF29EF5A4F125F005FF2F6897
+:10EA30006F6C64000DF500F09EF5D9F5A4F125F09A
+:10EA40000AFF666F7274682D6E616D6516F500F0D1
+:10EA500087F70700616D666F7274680025F007FF25
+:10EA600076657273696F6E0020F500F045F0410025
+:10EA700025F003FF637075002FF500F045F0750079
+:10EA8000E6F725F008FF6D63752D696E666F39F541
+:10EA900000F045F0710025F005FF2F7573657200D9
+:10EAA00042F500F045F02C0025F005FF665F63702D
+:10EAB0007500F8F400F045F0002445F0F40025F06E
+:10EAC00005FF73746174650055F553F0530204FF3C
+:10EAD0006261736560F566F00C0005FF63656C6C40
+:10EAE000730067F51DF205FF63656C6C2B006DF517
+:10EAF00079F5029689CA04FF3264757073F500F0E7
+:10EB0000E0F0E0F025F005FF3264726F70007BF5F5
+:10EB100000F0EAF0EAF025F004FF7475636B83F50A
+:10EB200000F0D5F0E0F025F003FF3E696E008CF5B3
+:10EB300066F0180003FF7061640094F500F0D9F5E9
+:10EB400045F02800AEF125F004FF656D69749AF573
+:10EB50002DFC0E00F6FB02FC05FF656D69743F009D
+:10EB6000A4F52DFC1000F6FB02FC03FF6B65790099
+:10EB7000ACF52DFC1200F6FB02FC04FF6B65793F3F
+:10EB8000B5F52DFC1400F6FB02FC02FF6470BDF528
+:10EB900080F07400CEFBD8FB05FF656865726500E8
+:10EBA000C5F580F07800CEFBD8FB04FF6865726580
+:10EBB000CCF580F07600CEFBD8FB05FF616C6C6F66
+:10EBC0007400D5F500F0D9F5AEF1B3FBDAF525F018
+:10EBD00003FF62696E00DDF500F0B6FD6BF592F0A3
+:10EBE00025F007FF646563696D616C00E8F500F06E
+:10EBF00045F00A006BF592F025F003FF6865780098
+:10EC0000F1F500F045F010006BF592F025F002FFF1
+:10EC1000626CFDF553F0200007FF7475726E6B6532
+:10EC2000790007F62DFC8000CEFBD8FB04FF2F6D8A
+:10EC30006F640CF61BF69C0109911991412F432733
+:10EC400017FF04C0109500950F5F1F4F37FF04C0DA
+:10EC5000309520952F5F3F4FEE24FF1851E1001FA4
+:10EC6000111F5A9539F447FF04C0109500950F5FA6
+:10EC70001F4F0BC0EE1CFF1CE21AF30A20F4E20E39
+:10EC8000F31E8894ECCF0894EACFFA92EA92C80176
+:10EC9000BBC905FF752F6D6F640016F600F010F10B
+:10ECA00065F107F1D3F125F006FF6E6567617465C4
+:10ECB00049F600F00EF240F225F001FF2F0054F665
+:10ECC00000F01AF601F125F003FF6D6F64005DF6A8
+:10ECD00000F01AF6EAF025F003FF6162730064F6B3
+:10ECE00000F0C2F04FF225F003FF6D696E006CF684
+:10ECF00000F07FF589F13EF07EF6D5F0EAF025F0E0
+:10ED000003FF6D61780074F600F07FF57FF13EF04F
+:10ED10008AF6D5F0EAF025F006FF77697468696E27
+:10ED200080F600F0E0F0A4F110F1A4F107F16DF12C
+:10ED300025F007FF746F7570706572008CF600F037
+:10ED4000C2F045F0610045F07B0091F63EF0ABF675
+:10ED500045F0DF0024F225F007FF746F6C6F7765D4
+:10ED6000720099F600F0C2F045F0410045F05B00FA
+:10ED700091F63EF0BEF645F020002DF225F003FF9F
+:10ED8000686C6400ACF653F0550204FF686F6C6465
+:10ED9000BFF600F0C3F6C2F08AF046F2C2F010F1FE
+:10EDA000D5F092F007F19EF025F002FF3C23C5F666
+:10EDB00000F09EF5C3F692F025F001FF2300D5F692
+:10EDC00000F06BF58AF05DF7F2F045F00900E0F035
+:10EDD0007FF13EF0EEF645F00700AEF145F0300071
+:10EDE000AEF1C9F625F002FF2373DDF600F0E0F680
+:10EDF0007FF52DF22BF13EF0F7F625F002FF233ED2
+:10EE0000F3F600F088F5C3F68AF09EF5E0F0A4F181
+:10EE100025F004FF7369676EFEF600F032F13EF0F4
+:10EE200014F745F02D00C9F625F003FF642E72009B
+:10EE300009F700F010F190F5FFFCD8F6F6F6F2F0C5
+:10EE40000DF701F707F1E0F0A4F105F815F825F04A
+:10EE500002FF2E7215F700F010F192FD07F119F77D
+:10EE600025F002FF642E28F700F065F119F7FCF792
+:10EE700025F001FF2E0031F700F092FD34F725F068
+:10EE800003FF75642E0039F700F065F14DF7FCF7CC
+:10EE900025F004FF75642E7240F700F010F1D8F6EB
+:10EEA000F6F601F707F1E0F0A4F105F815F825F002
+:10EEB00006FF75642F6D6F6449F700F010F165F17E
+:10EEC00019F1D3F107F1D5F010F1D3F107F125F0E5
+:10EED00006FF64696769743F58F700F09FF6C2F057
+:10EEE00045F0390089F145F0000124F2AEF1C2F09D
+:10EEF00045F0400189F145F0070124F2A4F145F005
+:10EF00003000A4F1C2F06BF58AF06DF125F000F04D
+:10EF100019F1E6F707F1E0F040F215F2AEF140F238
+:10EF200010F125F002FF732C68F700F0C2F099F79A
+:10EF300025F000F00602C2F015F290F51CF2A4F1E3
+:10EF400010F165F1C5023EF0ACF7ACF2C2F08AF008
+:10EF5000060278F5DAF2A6F707F139F13EF0B3F7D9
+:10EF6000C2F0A9F00602EAF025F005FF6974797095
+:10EF7000650092F700F0C2F015F290F51CF2A4F1D2
+:10EF800010F165F1C5023EF0CEF7ACF2C2F0E2F34B
+:10EF9000C2F0DBF7D7F740F2DAF2C6F707F139F142
+:10EFA0003EF0D5F7C2F0E2F3DBF7EAF025F000F02F
+:10EFB0000AF3DBF725F000F045F0FF0024F2A8F596
+:10EFC00025F006FF69636F756E74B5F700F0C2F047
+:10EFD00040F2D5F0E2F325F002FF6372E1F700F0B2
+:10EFE00045F00D00A8F545F00A00A8F525F005FF4D
+:10EFF000737061636500ECF700F00AF6A8F525F080
+:10F0000006FF737061636573F7F700F065F184F6CE
+:10F01000C2F03EF00FF8FCF746F234F008F8EAF0E0
+:10F0200025F004FF7479706500F800F089FDC502D1
+:10F030003EF020F8ACF2BDF2A9F0A8F5DAF21BF828
+:10F0400025F001FF270011F800F0CEF9E6FAF1FAF9
+:10F05000C2F064FBAAFDD5F0E2F345F099FBAAFDEE
+:10F060002DF23EF036F845F0F3FF5BF8EAF025F0BC
+:10F0700007FF68616E646C65720021F866F00A0033
+:10F0800005FF63617463680038F800F09EF210F1C8
+:10F090003EF88AF010F187F23EF892F02FF007F177
+:10F0A0003EF892F007F1EAF065F125F005FF74688B
+:10F0B000726F770040F800F0C2F02BF13EF062F87A
+:10F0C000EAF025F03EF88AF091F207F13EF892F06E
+:10F0D00007F1D5F010F1A7F2EAF007F125F005FFEE
+:10F0E00063736B69700056F800F010F1C2F03EF0E7
+:10F0F00083F8E0F0A9F019F1AAFD3EF083F8B1FD24
+:10F10000BFF934F076F807F1EAF025F005FF6373F4
+:10F1100063616E006FF800F010F1E0F0C2F0A9F04A
+:10F1200019F1AAFD2BF13EF0A0F8D5F046F2D5F08A
+:10F13000E0F032F12BF13EF0A0F840F234F08EF81E
+:10F1400001F1E0F0A4F107F1EAF025F006FF6163B8
+:10F150006365707486F800F0E0F0AEF146F2E0F01E
+:10F16000B9F5C2F0ECF82BF13EF0DEF8C2F045F054
+:10F170000800AAFD3EF0CEF8EAF0F2F07FF589F142
+:10F1800010F1F2F0F2F007F13EF0CCF8E4F846F2BC
+:10F1900010F1E0F007F1980134F0DCF8C2F00AF663
+:10F1A0007FF13EF0D5F8EAF00AF6C2F0A8F5E0F0FB
+:10F1B0009EF040F2E0F0A40134F0B0F8EAF001F182
+:10F1C000D5F0A4F1EFF725F000F045F00800C2F00B
+:10F1D000A8F5FCF7A8F525F000F0C2F045F00D0009
+:10F1E000AAFDD5F045F00A00AAFD2DF225F006FF94
+:10F1F000726566696C6CA6F82DFC1A00F6FB02FCC1
+:10F2000004FF63686172F7F800F0CEF9EAF0A9F044
+:10F2100025F006FF6E756D62657200F900F06BF502
+:10F220008AF010F152F910F165F952F907F12DF257
+:10F2300010F1C2F02BF13EF025F988F507F1EAF064
+:10F2400007F16BF592F065F125F02FF365F165F1AB
+:10F250003EF383F9CAF03EF047F9B1FDAAFD3EF056
+:10F260003EF9A9F045F02E00AAFD3EF03FF907F166
+:10F270003EF03BF90CFDB6FD34F04DF9EAF088F5AF
+:10F2800007F1EAF007F16BF592F065F125F088F5EA
+:10F2900007F13EF04CF959F6B1FD07F16BF592F02C
+:10F2A0005CF125F000F0E0F0A9F045F02D00AAFD9A
+:10F2B000C2F010F13EF05EF9B1FDBFF907F125F0A3
+:10F2C00060F00A00100002000A0000F0E0F0A9F06F
+:10F2D00045F02300A4F1C2F065F145F0040091F679
+:10F2E0003EF07BF960F9AEF1E2F36BF592F0B1FD1F
+:10F2F000BFF934F07CF9EAF025F007FF3E6E756D3A
+:10F300006265720009F900F0C2F03EF09BF9E0F08E
+:10F31000A9F06DF72BF13EF08FF9EAF025F010F12E
+:10F3200030FD6BF58AF0890107F1810130FDB1FDF7
+:10F33000BFF934F084F925F005FF70617273650040
+:10F340007DF900F010F1B5F998F58AF0BFF907F1F1
+:10F350008BF8C2F040F298F576F2B1FDBFF925F0D6
+:10F3600006FF736F757263659CF92DFC1600F6FB42
+:10F3700002FC07FF2F737472696E6700B0F900F02A
+:10F38000F2F0E0F0AEF1F2F0F2F0A4F125F00AFFB5
+:10F3900070617273652D6E616D65B9F900F00AF6E2
+:10F3A000D2F925F000F010F1B5F998F58AF0BFF91F
+:10F3B00019F174F807F18BF87FF5AEF1B5F9EAF0C1
+:10F3C000A4F198F592F025F007FF66696E642D7838
+:10F3D0007400C7F900F045F0F6F945F088004604DE
+:10F3E0002BF13EF0F5F988F565F125F000F010F10C
+:10F3F0007FF507F13FFCC2F03EF003FA10F101F196
+:10F4000001F107F15CF125F000F087F70300206FB0
+:10F410006B00BAF725F003FF2E6F6B00E4F92DFCAB
+:10F420001C00F6FB02FC00F087F702003E20EFF71D
+:10F43000BAF725F006FF2E72656164790BFA2DFC90
+:10F440002000F6FB02FC00F087F70400203F3F207D
+:10F45000BAF76BF58AF010F1F7F53CF798F58AF0FA
+:10F460003CF707F16BF592F025F006FF2E657272FE
+:10F470006F721AFA2DFC1E00F6FB02FC04FF717578
+:10F48000697435FA00F0FB02020392F0A3FAA7F2C6
+:10F49000B0FA91F2900365F58AF02BF13EF051FA43
+:10F4A0001FFAFCF83EF063FA45F0C9FA45F8CAF0D5
+:10F4B0003EF063FAC2F045F0FEFF7FF13EF061FAE4
+:10F4C0003AFA34F043FA0FFA34F04BFA05FF706160
+:10F4D000757365003EFA2DFC5702E2FBECFB04FF5E
+:10F4E000636F6C6466FA74FAA4B622243324BB24D6
+:10F4F00024BEE0E0F2E02192E030E9F7F232D9F701
+:10F50000E9E5F2E02F010FEF0DBF048311E21EBF0A
+:10F510001583CFEAC683D1E2D783A6E9BAEF0C946C
+:10F5200004F004FF7761726D6FFA00F07BFD45F027
+:10F5300099FB45F06BFA0DFC900312F642FA03FFBB
+:10F540007370300091FA80F00600F6FB02FC02FFB7
+:10F5500073709FFA66F0080003FF72703000A7FA1C
+:10F5600000F0B4FA8AF025F066F0040005FF646547
+:10F5700070746800ACFA00F0A3FA9EF2A4F115F2E0
+:10F5800046F225F009FF696E746572707265740049
+:10F59000B6FA00F0CEF9C2F03EF0DAFAE6FAF1FA85
+:10F5A00065F58AF03EF0D5FAC5FBE2F32FF071FB6A
+:10F5B00034F0CAFA88F525F010FF666F7274682D72
+:10F5C0007265636F676E697A6572C2FA80F07C005B
+:10F5D000CEFBD8FB09FF7265636F676E697A6500C1
+:10F5E000DCFA00F045F0FCFAD5F046042BF13EF0D1
+:10F5F000FBFA88F564FB25F000F0F2F0F2F07FF5FD
+:10F600002FF3F2F02FF03EF3F2F0C2F064FBAAFD0C
+:10F610003EF00DFBEAF065F125F001F101F15CF13E
+:10F6200025F006FF64743A6E756DEAFA60F099FB96
+:10F630001C021C0207FF64743A646E756D0011FBB6
+:10F6400060F099FBA2FDA2FD07FF7265633A6E753B
+:10F650006D001AFB00F00EF93EF036FBB1FDAAFD7D
+:10F660003EF034FB16FB25F020FB25F064FB25F073
+:10F6700008FF7265633A66696E6424FB00F0EAF97C
+:10F68000C2F02BF13EF047FBEAF064FB25F04EFBA5
+:10F6900025F005FF64743A78740038FB60F052FB83
+:10F6A00056FBA2FD00F0EAF02FF025F000F032F159
+:10F6B0003EF05CFB060225F02FF025F007FF647496
+:10F6C0003A6E756C6C0049FB60F068FB68FB68FB88
+:10F6D00000F045F0F3FF5BF806FF3F737461636B66
+:10F6E0005EFB00F0BBFA32F13EF079FB45F0FCFF27
+:10F6F0005BF825F003FF766572006CFB00F027F5E0
+:10F70000BAF7FCF76BF58AF035F5F7F592FDD8F608
+:10F71000E0F645F02E00C9F6F6F601F715F86BF5A0
+:10F7200092F0FCF73DF5BAF725F004FF6E6F6F70AD
+:10F730007AFB00F025F006FF756E7573656495FB26
+:10F7400000F09EF2D9F5A4F125F00200746F9BFB46
+:10F7500000F024F89BFD65F58AF03EF0B9FBFB0153
+:10F76000B3FB060225F000F007F1C2F0C5FB10F173
+:10F77000E2F3C2F0C5FBC5FBE2F32FF025F007FF73
+:10F78000692D63656C6C2B00A5FB00F040F225F041
+:10F7900007FF4564656665724000BFFB00F0E2F359
+:10F7A00070F325F007FF4564656665722100C8FBAC
+:10F7B00000F0E2F34CF325F007FF526465666572D2
+:10F7C0004000D2FB00F0E2F38AF025F007FF52641C
+:10F7D000656665722100DCFB00F0E2F392F025F033
+:10F7E00007FF5564656665724000E6FB00F0E2F3D2
+:10F7F00013F3AEF18AF025F007FF55646566657274
+:10F800002100F0FB00F0E2F313F3AEF192F025F0EB
+:10F8100006FF646566657221FCFB00F09BFDC2F08B
+:10F82000C5FBC5FBE2F32FF025F006FF64656665B6
+:10F83000724008FC00F09BFDC2F0C5FBE2F32FF024
+:10F8400025F007FF286465666572290015FC00F045
+:10F85000D8013803FB012DFC25F00E945103C2F0B2
+:10F86000C5FBE2F32FF02FF025F00FFF73656172F7
+:10F8700063682D776F72646C6973740021FC00F00B
+:10F8800010F165F145F054FC07F171FCC2F02BF169
+:10F890003EF04EFC88F5EAF065F125F0C2F098FCE8
+:10F8A000D5F0BE01AC0125F000F010F1EAF07FF5D3
+:10F8B00019F18CFCA2FC3EF062FC07F1EAF065F164
+:10F8C0005CF125F088F507F165F125F011FF747200
+:10F8D0006176657273652D776F72646C69737400FD
+:10F8E00035FC00F070F3C2F03EF082FC7FF52FF3A0
+:10F8F000D5F02FF03EF3F2F03EF082FCB504E2F3D7
+:10F9000034F073FC88F525F00BFF6E616D653E7376
+:10F910007472696E670066FC00F0E6F745F0FF0060
+:10F9200024F225F007FF6E66613E6366610084FC89
+:10F9300000F0B50440F225F008FF69636F6D706157
+:10F94000726592FC00F010F1E0F007F124F13EF056
+:10F95000ADFC88F5EAF05CF125F0D5F065F1C50263
+:10F960003EF0D2FCACF2E0F08AF0D5FCE0F0E2F33D
+:10F97000D5FCC2F045F000016DF13EF0C3FCD5F0BE
+:10F9800045F0FF0024F224F13EF0CAFC88F55CF15A
+:10F99000E5F225F040F2D5F078F5D5F045F002001B
+:10F9A000CBF2B3FC88F565F125F000F0C2F045F02C
+:10F9B000FF0024F2B2F6D5F00AF345F0FF0024F27E
+:10F9C000B2F60AF32DF225F001FF2A009CFC00F0AC
+:10F9D000B7F1EAF025F001FF6A00E4FC00F087F2DD
+:10F9E00045F00700AEF18AF087F245F00900AEF16C
+:10F9F0008AF0AEF125F004FF64616273EBFC00F065
+:10FA0000C2F032F13EF005FD0CFD25F007FF646EFB
+:10FA1000656761746500FBFC00F055F4B1FD65F1AC
+:10FA20002FF425F005FF636D6F76650006FD18FD68
+:10FA3000BF93AF93E991F991A991B991092F082B3F
+:10FA400021F01D9111930197E1F7AF91BF91899139
+:10FA500099910C9404F005FF32737761700012FDE8
+:10FA600000F0F2F010F1F2F007F125F00AFF7265F4
+:10FA700066696C6C2D7469622BFD00F059FD45F0D0
+:10FA80005A00ABF85FFD92F065F198F592F05CF1E9
+:10FA900025F00AFF736F757263652D74696236FD18
+:10FAA00000F059FD5FFD8AF025F003FF74696200E4
+:10FAB00049FD53F0850204FF2374696255FD53F03C
+:10FAC000DF0206FF65653E72616D5BFD00F065F16A
+:10FAD000ACF2E0F070F3E0F092F078F5D5F078F564
+:10FAE000D5F0DAF269FD88F525F008FF696E6974D2
+:10FAF0002D72616D61FD00F045F0A80013F345F033
+:10FB0000220015F266FD25F006FF626F756E6473C4
+:10FB100075FD00F0E0F0AEF1D5F025F003FF733E87
+:10FB2000640084FD00F0C2F032F125F005FF3E6272
+:10FB30006F6479008EFD41F20800326C6974657261
+:10FB4000616C96FD00F0D5F01C021C0225F001FF4F
+:10FB50003D009CFD00F0A4F12BF125F001FF3100E8
+:10FB6000A7FD53F0010001FF3200AEFD53F002008B
+:0AFB700002FF2D31B3FD53F0FFFF3B
+:00000001FF
diff --git a/amforth-6.5/appl/arduino/mega128.lst b/amforth-6.5/appl/arduino/mega128.lst
new file mode 100644
index 0000000..9166a69
--- /dev/null
+++ b/amforth-6.5/appl/arduino/mega128.lst
@@ -0,0 +1,10415 @@
+
+AVRASM ver. 2.1.52 mega128.asm Sun Apr 30 20:10:13 2017
+
+mega128.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/atmega1280\device.asm'
+../../avr8/devices/atmega1280\device.asm(5): Including file '../../avr8/Atmel/Appnotes2\m1280def.inc'
+mega128.asm(10): 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'
+mega128.asm(15): Including file '../../avr8\drivers/1wire.asm'
+mega128.asm(18): 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(4): 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(6): Including file 'words/applturnkey.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 = 512
+ .equ CELLSIZE = 2
+ .macro readflashcell
+ clr temp7
+ lsl zl
+ rol zh
+ rol temp7
+ out_ RAMPZ, temp7
+ elpm @0, Z+
+ elpm @1, Z+
+ .endmacro
+ .macro writeflashcell
+ clr temp7
+ lsl zl
+ rol zh
+ rol temp7
+ out_ RAMPZ, temp7
+ .endmacro
+ .set WANT_ANALOG_COMPARATOR = 0
+ .set WANT_USART0 = 0
+ .set WANT_TWI = 0
+ .set WANT_SPI = 0
+ .set WANT_PORTA = 0
+ .set WANT_PORTB = 0
+ .set WANT_PORTC = 0
+ .set WANT_PORTD = 0
+ .set WANT_PORTE = 0
+ .set WANT_PORTF = 0
+ .set WANT_PORTG = 0
+ .set WANT_PORTH = 0
+ .set WANT_PORTJ = 0
+ .set WANT_PORTK = 0
+ .set WANT_PORTL = 0
+ .set WANT_TIMER_COUNTER_0 = 0
+ .set WANT_TIMER_COUNTER_2 = 0
+ .set WANT_WATCHDOG = 0
+ .set WANT_USART1 = 0
+ .set WANT_EEPROM = 0
+ .set WANT_TIMER_COUNTER_5 = 0
+ .set WANT_TIMER_COUNTER_4 = 0
+ .set WANT_TIMER_COUNTER_3 = 0
+ .set WANT_TIMER_COUNTER_1 = 0
+ .set WANT_JTAG = 0
+ .set WANT_EXTERNAL_INTERRUPT = 0
+ .set WANT_CPU = 0
+ .set WANT_AD_CONVERTER = 0
+ .set WANT_BOOT_LOAD = 0
+ .set WANT_USART2 = 0
+ .set WANT_USART3 = 0
+ .equ intvecsize = 2 ; please verify; flash size: 131072 bytes
+ .equ pclen = 2 ; please verify
+ .overlap
+ .org 2
+000002 d164 rcall isr ; External Interrupt Request 0
+ .org 4
+000004 d162 rcall isr ; External Interrupt Request 1
+ .org 6
+000006 d160 rcall isr ; External Interrupt Request 2
+ .org 8
+000008 d15e rcall isr ; External Interrupt Request 3
+ .org 10
+00000a d15c rcall isr ; External Interrupt Request 4
+ .org 12
+00000c d15a rcall isr ; External Interrupt Request 5
+ .org 14
+00000e d158 rcall isr ; External Interrupt Request 6
+ .org 16
+000010 d156 rcall isr ; External Interrupt Request 7
+ .org 18
+000012 d154 rcall isr ; Pin Change Interrupt Request 0
+ .org 20
+000014 d152 rcall isr ; Pin Change Interrupt Request 1
+ .org 22
+000016 d150 rcall isr ; Pin Change Interrupt Request 2
+ .org 24
+000018 d14e rcall isr ; Watchdog Time-out Interrupt
+ .org 26
+00001a d14c rcall isr ; Timer/Counter2 Compare Match A
+ .org 28
+00001c d14a rcall isr ; Timer/Counter2 Compare Match B
+ .org 30
+00001e d148 rcall isr ; Timer/Counter2 Overflow
+ .org 32
+000020 d146 rcall isr ; Timer/Counter1 Capture Event
+ .org 34
+000022 d144 rcall isr ; Timer/Counter1 Compare Match A
+ .org 36
+000024 d142 rcall isr ; Timer/Counter1 Compare Match B
+ .org 38
+000026 d140 rcall isr ; Timer/Counter1 Compare Match C
+ .org 40
+000028 d13e rcall isr ; Timer/Counter1 Overflow
+ .org 42
+00002a d13c rcall isr ; Timer/Counter0 Compare Match A
+ .org 44
+00002c d13a rcall isr ; Timer/Counter0 Compare Match B
+ .org 46
+00002e d138 rcall isr ; Timer/Counter0 Overflow
+ .org 48
+000030 d136 rcall isr ; SPI Serial Transfer Complete
+ .org 50
+000032 d134 rcall isr ; USART0, Rx Complete
+ .org 52
+000034 d132 rcall isr ; USART0 Data register Empty
+ .org 54
+000036 d130 rcall isr ; USART0, Tx Complete
+ .org 56
+000038 d12e rcall isr ; Analog Comparator
+ .org 58
+00003a d12c rcall isr ; ADC Conversion Complete
+ .org 60
+00003c d12a rcall isr ; EEPROM Ready
+ .org 62
+00003e d128 rcall isr ; Timer/Counter3 Capture Event
+ .org 64
+000040 d126 rcall isr ; Timer/Counter3 Compare Match A
+ .org 66
+000042 d124 rcall isr ; Timer/Counter3 Compare Match B
+ .org 68
+000044 d122 rcall isr ; Timer/Counter3 Compare Match C
+ .org 70
+000046 d120 rcall isr ; Timer/Counter3 Overflow
+ .org 72
+000048 d11e rcall isr ; USART1, Rx Complete
+ .org 74
+00004a d11c rcall isr ; USART1 Data register Empty
+ .org 76
+00004c d11a rcall isr ; USART1, Tx Complete
+ .org 78
+00004e d118 rcall isr ; 2-wire Serial Interface
+ .org 80
+000050 d116 rcall isr ; Store Program Memory Read
+ .org 82
+000052 d114 rcall isr ; Timer/Counter4 Capture Event
+ .org 84
+000054 d112 rcall isr ; Timer/Counter4 Compare Match A
+ .org 86
+000056 d110 rcall isr ; Timer/Counter4 Compare Match B
+ .org 88
+000058 d10e rcall isr ; Timer/Counter4 Compare Match C
+ .org 90
+00005a d10c rcall isr ; Timer/Counter4 Overflow
+ .org 92
+00005c d10a rcall isr ; Timer/Counter5 Capture Event
+ .org 94
+00005e d108 rcall isr ; Timer/Counter5 Compare Match A
+ .org 96
+000060 d106 rcall isr ; Timer/Counter5 Compare Match B
+ .org 98
+000062 d104 rcall isr ; Timer/Counter5 Compare Match C
+ .org 100
+000064 d102 rcall isr ; Timer/Counter5 Overflow
+ .org 102
+000066 d100 rcall isr ; USART2, Rx Complete
+ .org 104
+000068 d0fe rcall isr ; USART2 Data register Empty
+ .org 106
+00006a d0fc rcall isr ; USART2, Tx Complete
+ .org 108
+00006c d0fa rcall isr ; USART3, Rx Complete
+ .org 110
+00006e d0f8 rcall isr ; USART3 Data register Empty
+ .org 112
+000070 d0f6 rcall isr ; USART3, Tx Complete
+ .equ INTVECTORS = 57
+ .nooverlap
+
+ ; compatability layer (maybe empty)
+
+ ; controller data area, environment query mcu-info
+ mcu_info:
+ mcu_ramsize:
+000071 2000 .dw 8192
+ mcu_eepromsize:
+000072 1000 .dw 4096
+ mcu_maxdp:
+000073 ffff .dw 65535
+ mcu_numints:
+000074 0039 .dw 57
+ mcu_name:
+000075 000a .dw 10
+000076 5441
+000077 656d
+000078 6167
+000079 3231
+00007a 3038 .db "ATmega1280"
+ .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 WANT_IGNORECASE = 1
+
+ .equ F_CPU = 16000000
+ .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
+000200 usart_rx_data: .byte usart_rx_size
+000210 usart_rx_in: .byte 1
+000211 usart_rx_out: .byte 1
+ .cseg
+
+ VE_TO_RXBUF:
+00007b ff07 .dw $ff07
+00007c 723e
+00007d 2d78
+00007e 7562
+00007f 0066 .db ">rx-buf",0
+000080 0000 .dw VE_HEAD
+ .set VE_HEAD = VE_TO_RXBUF
+ XT_TO_RXBUF:
+000081 0082 .dw PFA_rx_tobuf
+ PFA_rx_tobuf:
+000082 2f08 mov temp0, tosl
+000083 9110 0210 lds temp1, usart_rx_in
+000085 e0e0 ldi zl, low(usart_rx_data)
+000086 e0f2 ldi zh, high(usart_rx_data)
+000087 0fe1 add zl, temp1
+000088 1df3 adc zh, zeroh
+000089 8300 st Z, temp0
+00008a 9513 inc temp1
+00008b 701f andi temp1,usart_rx_mask
+00008c 9310 0210 sts usart_rx_in, temp1
+00008e 9189
+00008f 9199 loadtos
+000090 940c f004 jmp_ DO_NEXT
+
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+ ; setup with
+ ; ' isr-rx URXCaddr int!
+ VE_ISR_RX:
+000092 ff06 .dw $ff06
+000093 7369
+000094 2d72
+000095 7872 .db "isr-rx"
+000096 007b .dw VE_HEAD
+ .set VE_HEAD = VE_ISR_RX
+ XT_ISR_RX:
+000097 f000 .dw DO_COLON
+ usart_rx_isr:
+000098 f045 .dw XT_DOLITERAL
+000099 00c6 .dw usart_data
+00009a f0a9 .dw XT_CFETCH
+00009b f0c2 .dw XT_DUP
+00009c f045 .dw XT_DOLITERAL
+00009d 0003 .dw 3
+00009e fdaa .dw XT_EQUAL
+00009f f03e .dw XT_DOCONDBRANCH
+0000a0 00a2 .dw usart_rx_isr1
+0000a1 fa73 .dw XT_COLD
+ usart_rx_isr1:
+0000a2 0081 .dw XT_TO_RXBUF
+0000a3 f025 .dw XT_EXIT
+
+ ; ( -- ) Hardware Access
+ ; R( --)
+ ; initialize usart
+ ;VE_USART_INIT_RXBUFFER:
+ ; .dw $ff0x
+ ; .db "+usart-buffer"
+ ; .dw VE_HEAD
+ ; .set VE_HEAD = VE_USART_INIT_RXBUFFER
+ XT_USART_INIT_RX_BUFFER:
+0000a4 f000 .dw DO_COLON
+ PFA_USART_INIT_RX_BUFFER: ; ( -- )
+0000a5 f045
+0000a6 0097 .dw XT_DOLITERAL, XT_ISR_RX
+0000a7 f045
+0000a8 0032 .dw XT_DOLITERAL, URXCaddr
+0000a9 f4a1 .dw XT_INTSTORE
+
+0000aa f045 .dw XT_DOLITERAL
+0000ab 0200 .dw usart_rx_data
+0000ac f045 .dw XT_DOLITERAL
+0000ad 0016 .dw usart_rx_size + 6
+0000ae f165 .dw XT_ZERO
+0000af f4e9 .dw XT_FILL
+0000b0 f025 .dw XT_EXIT
+
+ ; ( -- c)
+ ; MCU
+ ; get 1 character from input queue, wait if needed using interrupt driver
+ VE_RX_BUFFER:
+0000b1 ff06 .dw $ff06
+0000b2 7872
+0000b3 622d
+0000b4 6675 .db "rx-buf"
+0000b5 0092 .dw VE_HEAD
+ .set VE_HEAD = VE_RX_BUFFER
+ XT_RX_BUFFER:
+0000b6 f000 .dw DO_COLON
+ PFA_RX_BUFFER:
+0000b7 00d1 .dw XT_RXQ_BUFFER
+0000b8 f03e .dw XT_DOCONDBRANCH
+0000b9 00b7 .dw PFA_RX_BUFFER
+0000ba f045 .dw XT_DOLITERAL
+0000bb 0211 .dw usart_rx_out
+0000bc f0a9 .dw XT_CFETCH
+0000bd f0c2 .dw XT_DUP
+0000be f045 .dw XT_DOLITERAL
+0000bf 0200 .dw usart_rx_data
+0000c0 f1ae .dw XT_PLUS
+0000c1 f0a9 .dw XT_CFETCH
+0000c2 f0d5 .dw XT_SWAP
+0000c3 f240 .dw XT_1PLUS
+0000c4 f045 .dw XT_DOLITERAL
+0000c5 000f .dw usart_rx_mask
+0000c6 f224 .dw XT_AND
+0000c7 f045 .dw XT_DOLITERAL
+0000c8 0211 .dw usart_rx_out
+0000c9 f09e .dw XT_CSTORE
+0000ca f025 .dw XT_EXIT
+
+ ; ( -- f)
+ ; MCU
+ ; check if unread characters are in the input queue
+ VE_RXQ_BUFFER:
+0000cb ff07 .dw $ff07
+0000cc 7872
+0000cd 2d3f
+0000ce 7562
+0000cf 0066 .db "rx?-buf",0
+0000d0 00b1 .dw VE_HEAD
+ .set VE_HEAD = VE_RXQ_BUFFER
+ XT_RXQ_BUFFER:
+0000d1 f000 .dw DO_COLON
+ PFA_RXQ_BUFFER:
+0000d2 fa6b .dw XT_PAUSE
+0000d3 f045 .dw XT_DOLITERAL
+0000d4 0211 .dw usart_rx_out
+0000d5 f0a9 .dw XT_CFETCH
+0000d6 f045 .dw XT_DOLITERAL
+0000d7 0210 .dw usart_rx_in
+0000d8 f0a9 .dw XT_CFETCH
+0000d9 f124 .dw XT_NOTEQUAL
+0000da f025 .dw XT_EXIT
+ ; .include "drivers/timer-usart-isr.asm"
+ .set XT_RX = XT_RX_BUFFER
+ .set XT_RXQ = XT_RXQ_BUFFER
+ .set XT_USART_INIT_RX = XT_USART_INIT_RX_BUFFER
+ .else
+ .endif
+
+ .include "words/usart-tx-poll.asm"
+
+ ; MCU
+ ; check availability and send one character to the terminal using register poll
+ VE_TX_POLL:
+0000db ff07 .dw $ff07
+0000dc 7874
+0000dd 702d
+0000de 6c6f
+0000df 006c .db "tx-poll",0
+0000e0 00cb .dw VE_HEAD
+ .set VE_HEAD = VE_TX_POLL
+ XT_TX_POLL:
+0000e1 f000 .dw DO_COLON
+ PFA_TX_POLL:
+ ; wait for data ready
+0000e2 00ef .dw XT_TXQ_POLL
+0000e3 f03e .dw XT_DOCONDBRANCH
+0000e4 00e2 .dw PFA_TX_POLL
+ ; send to usart
+0000e5 f045 .dw XT_DOLITERAL
+0000e6 00c6 .dw USART_DATA
+0000e7 f09e .dw XT_CSTORE
+0000e8 f025 .dw XT_EXIT
+
+ ; ( -- f) MCU
+ ; MCU
+ ; check if a character can be send using register poll
+ VE_TXQ_POLL:
+0000e9 ff08 .dw $ff08
+0000ea 7874
+0000eb 2d3f
+0000ec 6f70
+0000ed 6c6c .db "tx?-poll"
+0000ee 00db .dw VE_HEAD
+ .set VE_HEAD = VE_TXQ_POLL
+ XT_TXQ_POLL:
+0000ef f000 .dw DO_COLON
+ PFA_TXQ_POLL:
+0000f0 fa6b .dw XT_PAUSE
+0000f1 f045 .dw XT_DOLITERAL
+0000f2 00c0 .dw USART_A
+0000f3 f0a9 .dw XT_CFETCH
+0000f4 f045 .dw XT_DOLITERAL
+0000f5 0020 .dw bm_USART_TXRD
+0000f6 f224 .dw XT_AND
+0000f7 f025 .dw XT_EXIT
+ .set XT_TX = XT_TX_POLL
+ .set XT_TXQ = XT_TXQ_POLL
+ .set XT_USART_INIT_TX = 0
+
+ .include "words/ubrr.asm"
+
+ ; MCU
+ ; returns usart UBRR settings
+ VE_UBRR:
+0000f8 ff04 .dw $ff04
+0000f9 6275
+0000fa 7272 .db "ubrr"
+0000fb 00e9 .dw VE_HEAD
+ .set VE_HEAD = VE_UBRR
+ XT_UBRR:
+0000fc f080 .dw PFA_DOVALUE1
+ PFA_UBRR: ; ( -- )
+0000fd 00ca .dw EE_UBRRVAL
+0000fe fbce .dw XT_EDEFERFETCH
+0000ff fbd8 .dw XT_EDEFERSTORE
+ .include "words/usart.asm"
+
+ ; MCU
+ ; initialize usart
+ VE_USART:
+000100 ff06 .dw $ff06
+000101 752b
+000102 6173
+000103 7472 .db "+usart"
+000104 00f8 .dw VE_HEAD
+ .set VE_HEAD = VE_USART
+ XT_USART:
+000105 f000 .dw DO_COLON
+ PFA_USART: ; ( -- )
+
+000106 f045 .dw XT_DOLITERAL
+000107 0098 .dw USART_B_VALUE
+000108 f045 .dw XT_DOLITERAL
+000109 00c1 .dw USART_B
+00010a f09e .dw XT_CSTORE
+
+00010b f045 .dw XT_DOLITERAL
+00010c 0006 .dw USART_C_VALUE
+00010d f045 .dw XT_DOLITERAL
+00010e 00c2 .dw USART_C | bm_USARTC_en
+00010f f09e .dw XT_CSTORE
+
+000110 00fc .dw XT_UBRR
+000111 f0c2 .dw XT_DUP
+000112 f30a .dw XT_BYTESWAP
+000113 f045 .dw XT_DOLITERAL
+000114 00c5 .dw BAUDRATE_HIGH
+000115 f09e .dw XT_CSTORE
+000116 f045 .dw XT_DOLITERAL
+000117 00c4 .dw BAUDRATE_LOW
+000118 f09e .dw XT_CSTORE
+ .if XT_USART_INIT_RX!=0
+000119 00a4 .dw XT_USART_INIT_RX
+ .endif
+ .if XT_USART_INIT_TX!=0
+ .endif
+
+00011a f025 .dw XT_EXIT
+
+ ; settings for 1wire interface, if desired
+ .equ OW_PORT=PORTE
+ .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:
+00011b ff08 .dw $ff08
+00011c 7731
+00011d 722e
+00011e 7365
+00011f 7465 .db "1w.reset"
+000120 0100 .dw VE_HEAD
+ .set VE_HEAD = VE_OW_RESET
+ XT_OW_RESET:
+000121 0122 .dw PFA_OW_RESET
+ PFA_OW_RESET:
+000122 939a
+000123 938a savetos
+ ; setup to output
+000124 9a6c sbi OW_DDR, OW_BIT
+ ; Pull output low
+000125 9874 cbi OW_PORT, OW_BIT
+ ; Delay >480 usec
+000126 e8e0
+000127 e0f7
+000128 9731
+000129 f7f1 DELAY 480
+ ; Critical timing period, disable interrupts.
+00012a b71f in temp1, SREG
+00012b 94f8 cli
+ ; Pull output high
+00012c 9a74 sbi OW_PORT, OW_BIT
+ ; make pin input, sends "1"
+00012d 986c cbi OW_DDR, OW_BIT
+00012e e0e0
+00012f e0f1
+000130 9731
+000131 f7f1 DELAY 64 ; delayB
+ ; Sample input pin, set TOS if input is zero
+000132 b18c in tosl, OW_PIN
+000133 ff84 sbrs tosl, OW_BIT
+000134 ef9f ser tosh
+ ; End critical timing period, enable interrupts
+000135 bf1f out SREG, temp1
+ ; release bus
+000136 986c cbi OW_DDR, OW_BIT
+000137 9874 cbi OW_PORT, OW_BIT
+
+ ; Delay rest of 480 usec
+000138 e8e0
+000139 e0f6
+00013a 9731
+00013b f7f1 DELAY 416
+ ; we now have the result flag in TOS
+00013c 2f89 mov tosl, tosh
+00013d 940c f004 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:
+00013f ff07 .dw $ff07
+000140 7731
+000141 732e
+000142 6f6c
+000143 0074 .db "1w.slot",0
+000144 011b .dw VE_HEAD
+ .set VE_HEAD = VE_OW_SLOT
+ XT_OW_SLOT:
+000145 0146 .dw PFA_OW_SLOT
+ PFA_OW_SLOT:
+ ; pull low
+000146 9874 cbi OW_PORT, OW_BIT
+000147 9a6c sbi OW_DDR, OW_BIT
+ ; disable interrupts
+000148 b71f in temp1, SREG
+000149 94f8 cli
+00014a e1e8
+00014b e0f0
+00014c 9731
+00014d f7f1 DELAY 6 ; DELAY A
+ ; check bit
+00014e 9488 clc
+00014f 9587 ror tosl
+000150 f410 brcc PFA_OW_SLOT0 ; a 0 keeps the bus low
+ ; release bus, a 1 is written
+000151 9a74 sbi OW_PORT, OW_BIT
+000152 986c cbi OW_DDR, OW_BIT
+ PFA_OW_SLOT0:
+ ; sample the input (no action required if zero)
+000153 e2e4
+000154 e0f0
+000155 9731
+000156 f7f1 DELAY 9 ; wait DELAY E to sample
+000157 b10c in temp0, OW_PIN
+000158 fd04 sbrc temp0, OW_BIT
+000159 6880 ori tosl, $80
+
+00015a ecec
+00015b e0f0
+00015c 9731
+00015d f7f1 DELAY 51 ; DELAY B
+00015e 9a74 sbi OW_PORT, OW_BIT ; release bus
+00015f 986c cbi OW_DDR, OW_BIT
+000160 e0e8
+000161 e0f0
+000162 9731
+000163 f7f1 delay 2
+ ; re-enable interrupts
+000164 bf1f out SREG, temp1
+000165 940c f004 jmp_ DO_NEXT
+
+ ; include the whole source tree.
+ .include "amforth.asm"
+
+ ;;;;
+ ;;;; GPL V2 (only)
+
+ .set AMFORTH_NRWW_SIZE=(FLASHEND-AMFORTH_RO_SEG)*2
+
+ .set corepc = pc
+ .org $0000
+000000 940c fa74 jmp_ PFA_COLD
+
+ .org corepc
+ .include "drivers/generic-isr.asm"
+
+ .eseg
+000000 intvec: .byte INTVECTORS * CELLSIZE
+ .dseg
+000212 intcnt: .byte INTVECTORS
+ .cseg
+
+ ; interrupt routine gets called (again) by rcall! This gives the
+ ; address of the int-vector on the stack.
+ isr:
+000167 920a st -Y, r0
+000168 b60f in r0, SREG
+000169 920a st -Y, r0
+ .if (pclen==3)
+ .endif
+00016a 900f pop r0
+00016b 900f pop r0 ; = intnum * intvectorsize + 1 (address following the rcall)
+00016c 940a dec r0
+ .if intvecsize == 1 ;
+ .endif
+00016d 2cb0 mov isrflag, r0
+00016e 93ff push zh
+00016f 93ef push zl
+000170 e1e2 ldi zl, low(intcnt)
+000171 e0f2 ldi zh, high(intcnt)
+000172 9406 lsr r0 ; we use byte addresses in the counter array, not words
+000173 0de0 add zl, r0
+000174 1df3 adc zh, zeroh
+000175 8000 ld r0, Z
+000176 9403 inc r0
+000177 8200 st Z, r0
+000178 91ef pop zl
+000179 91ff pop zh
+
+00017a 9009 ld r0, Y+
+00017b be0f out SREG, r0
+00017c 9009 ld r0, Y+
+00017d 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:
+00017e ff02 .dw $ff02
+00017f 2b6d .db "m+"
+000180 013f .dw VE_HEAD
+ .set VE_HEAD = VE_MPLUS
+ XT_MPLUS:
+000181 f000 .dw DO_COLON
+ PFA_MPLUS:
+000182 fd92 .dw XT_S2D
+000183 f42f .dw XT_DPLUS
+000184 f025 .dw XT_EXIT
+ .include "words/ud-star.asm"
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_UDSTAR:
+000185 ff03 .dw $ff03
+000186 6475
+../../common\words/ud-star.asm(9): warning: .cseg .db misalignment - padding zero byte
+000187 002a .db "ud*"
+000188 017e .dw VE_HEAD
+ .set VE_HEAD = VE_UDSTAR
+ XT_UDSTAR:
+000189 f000 .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 + ;
+
+00018a f0c2
+00018b f110
+00018c f1f1
+00018d f0ea .DW XT_DUP,XT_TO_R,XT_UMSTAR,XT_DROP
+00018e f0d5
+00018f f107
+000190 f1f1
+000191 f0f2
+000192 f1ae
+000193 f025 .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:
+000194 ff04 .dw $ff04
+000195 6d75
+000196 7861 .db "umax"
+000197 0185 .dw VE_HEAD
+ .set VE_HEAD = VE_UMAX
+ XT_UMAX:
+000198 f000 .dw DO_COLON
+ PFA_UMAX:
+ .endif
+
+000199 f57f
+00019a f16d .DW XT_2DUP,XT_ULESS
+00019b f03e .dw XT_DOCONDBRANCH
+00019c 019e DEST(UMAX1)
+00019d f0d5 .DW XT_SWAP
+00019e f0ea UMAX1: .DW XT_DROP
+00019f f025 .dw XT_EXIT
+ .include "words/umin.asm"
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_UMIN:
+0001a0 ff04 .dw $ff04
+0001a1 6d75
+0001a2 6e69 .db "umin"
+0001a3 0194 .dw VE_HEAD
+ .set VE_HEAD = VE_UMIN
+ XT_UMIN:
+0001a4 f000 .dw DO_COLON
+ PFA_UMIN:
+ .endif
+0001a5 f57f
+0001a6 f178 .DW XT_2DUP,XT_UGREATER
+0001a7 f03e .dw XT_DOCONDBRANCH
+0001a8 01aa DEST(UMIN1)
+0001a9 f0d5 .DW XT_SWAP
+0001aa f0ea UMIN1: .DW XT_DROP
+0001ab f025 .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:
+0001ac f000 .dw DO_COLON
+ PFA_IMMEDIATEQ:
+0001ad f045 .dw XT_DOLITERAL
+0001ae 8000 .dw $8000
+0001af f224 .dw XT_AND
+0001b0 f12b .dw XT_ZEROEQUAL
+0001b1 f03e .dw XT_DOCONDBRANCH
+0001b2 01b5 DEST(IMMEDIATEQ1)
+0001b3 fdb1 .dw XT_ONE
+0001b4 f025 .dw XT_EXIT
+ IMMEDIATEQ1:
+ ; not immediate
+0001b5 f15c .dw XT_TRUE
+0001b6 f025 .dw XT_EXIT
+ .include "words/name2flags.asm"
+
+ ; Tools
+ ; get the flags from a name token
+ VE_NAME2FLAGS:
+0001b7 ff0a .dw $ff0a
+0001b8 616e
+0001b9 656d
+0001ba 663e
+0001bb 616c
+0001bc 7367 .db "name>flags"
+0001bd 01a0 .dw VE_HEAD
+ .set VE_HEAD = VE_NAME2FLAGS
+ XT_NAME2FLAGS:
+0001be f000 .dw DO_COLON
+ PFA_NAME2FLAGS:
+0001bf f3e2 .dw XT_FETCHI ; skip to link field
+0001c0 f045 .dw XT_DOLITERAL
+0001c1 ff00 .dw $ff00
+0001c2 f224 .dw XT_AND
+0001c3 f025 .dw XT_EXIT
+
+ .if AMFORTH_NRWW_SIZE > 8000
+ .include "dict/appl_8k.inc"
+
+
+ .include "words/newest.asm"
+
+ ; System Variable
+ ; system state
+ VE_NEWEST:
+0001c4 ff06 .dw $ff06
+0001c5 656e
+0001c6 6577
+0001c7 7473 .db "newest"
+0001c8 01b7 .dw VE_HEAD
+ .set VE_HEAD = VE_NEWEST
+ XT_NEWEST:
+0001c9 f053 .dw PFA_DOVARIABLE
+ PFA_NEWEST:
+0001ca 024b .dw ram_newest
+
+ .dseg
+00024b ram_newest: .byte 4
+ .include "words/latest.asm"
+
+ ; System Variable
+ ; system state
+ VE_LATEST:
+0001cb ff06 .dw $ff06
+0001cc 616c
+0001cd 6574
+0001ce 7473 .db "latest"
+0001cf 01c4 .dw VE_HEAD
+ .set VE_HEAD = VE_LATEST
+ XT_LATEST:
+0001d0 f053 .dw PFA_DOVARIABLE
+ PFA_LATEST:
+0001d1 024f .dw ram_latest
+
+ .dseg
+00024f ram_latest: .byte 2
+ .include "words/do-create.asm"
+
+ ; Compiler
+ ; parse the input and create an empty vocabulary entry without XT and data field (PF)
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_DOCREATE:
+0001d2 ff08 .dw $ff08
+0001d3 6328
+0001d4 6572
+0001d5 7461
+0001d6 2965 .db "(create)"
+0001d7 01cb .dw VE_HEAD
+ .set VE_HEAD = VE_DOCREATE
+ XT_DOCREATE:
+0001d8 f000 .dw DO_COLON
+ PFA_DOCREATE:
+ .endif
+0001d9 f9ce
+0001da 032f .DW XT_PARSENAME,XT_WLSCOPE ; ( -- addr len wid)
+0001db f0c2
+0001dc 01c9
+0001dd f578
+0001de f092 .DW XT_DUP,XT_NEWEST,XT_CELLPLUS,XT_STORE ; save the wid
+0001df 0314
+0001e0 01c9
+0001e1 f092 .DW XT_HEADER,XT_NEWEST,XT_STORE ; save the nt
+0001e2 f025 .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:
+0001e3 0001 .dw $0001
+0001e4 005c .db $5c,0
+0001e5 01d2 .dw VE_HEAD
+ .set VE_HEAD = VE_BACKSLASH
+ XT_BACKSLASH:
+0001e6 f000 .dw DO_COLON
+ PFA_BACKSLASH:
+ .endif
+0001e7 f9b5 .dw XT_SOURCE
+0001e8 f101 .dw XT_NIP
+0001e9 f598 .dw XT_TO_IN
+0001ea f092 .dw XT_STORE
+0001eb f025 .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:
+0001ec 0001 .dw $0001
+0001ed 0028 .db "(" ,0
+0001ee 01e3 .dw VE_HEAD
+ .set VE_HEAD = VE_LPAREN
+ XT_LPAREN:
+0001ef f000 .dw DO_COLON
+ PFA_LPAREN:
+ .endif
+0001f0 f045 .dw XT_DOLITERAL
+0001f1 0029 .dw ')'
+0001f2 f9a1 .dw XT_PARSE
+0001f3 f588 .dw XT_2DROP
+0001f4 f025 .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:
+0001f5 ff07 .dw $ff07
+0001f6 6f63
+0001f7 706d
+0001f8 6c69
+0001f9 0065 .db "compile",0
+0001fa 01ec .dw VE_HEAD
+ .set VE_HEAD = VE_COMPILE
+ XT_COMPILE:
+0001fb f000 .dw DO_COLON
+ PFA_COMPILE:
+ .endif
+0001fc f107 .dw XT_R_FROM
+0001fd f0c2 .dw XT_DUP
+0001fe fbc5 .dw XT_ICELLPLUS
+0001ff f110 .dw XT_TO_R
+000200 f3e2 .dw XT_FETCHI
+000201 0206 .dw XT_COMMA
+000202 f025 .dw XT_EXIT
+ .include "words/comma.asm"
+
+ ; Dictionary
+ ; compile 16 bit into flash at DP
+ VE_COMMA:
+000203 ff01 .dw $ff01
+000204 002c .db ',',0 ; ,
+000205 01f5 .dw VE_HEAD
+ .set VE_HEAD = VE_COMMA
+ XT_COMMA:
+000206 f000 .dw DO_COLON
+ PFA_COMMA:
+000207 f5c8 .dw XT_DP
+000208 f384 .dw XT_STOREI
+000209 f5c8 .dw XT_DP
+00020a f240 .dw XT_1PLUS
+00020b fbb3 .dw XT_DOTO
+00020c f5c9 .dw PFA_DP
+00020d f025 .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:
+00020e 0003 .dw $0003
+00020f 275b
+000210 005d .db "[']",0
+000211 0203 .dw VE_HEAD
+ .set VE_HEAD = VE_BRACKETTICK
+ XT_BRACKETTICK:
+000212 f000 .dw DO_COLON
+ PFA_BRACKETTICK:
+ .endif
+000213 f824 .dw XT_TICK
+000214 021c .dw XT_LITERAL
+000215 f025 .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:
+000216 0007 .dw $0007
+000217 696c
+000218 6574
+000219 6172
+00021a 006c .db "literal",0
+00021b 020e .dw VE_HEAD
+ .set VE_HEAD = VE_LITERAL
+ XT_LITERAL:
+00021c f000 .dw DO_COLON
+ PFA_LITERAL:
+ .endif
+00021d 01fb .DW XT_COMPILE
+00021e f045 .DW XT_DOLITERAL
+00021f 0206 .DW XT_COMMA
+000220 f025 .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:
+000221 0008 .dw $0008
+000222 6c73
+000223 7469
+000224 7265
+000225 6c61 .db "sliteral"
+000226 0216 .dw VE_HEAD
+ .set VE_HEAD = VE_SLITERAL
+ XT_SLITERAL:
+000227 f000 .dw DO_COLON
+ PFA_SLITERAL:
+ .endif
+000228 01fb .dw XT_COMPILE
+000229 f787 .dw XT_DOSLITERAL ; ( -- addr n)
+00022a f795 .dw XT_SCOMMA
+00022b f025 .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:
+00022c f000 .dw DO_COLON
+ PFA_GMARK:
+00022d f5c8 .dw XT_DP
+00022e 01fb .dw XT_COMPILE
+00022f ffff .dw -1 ; ffff does not erase flash
+000230 f025 .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:
+000231 f000 .dw DO_COLON
+ PFA_GRESOLVE:
+000232 fb71 .dw XT_QSTACK
+000233 f5c8 .dw XT_DP
+000234 f0d5 .dw XT_SWAP
+000235 f384 .dw XT_STOREI
+000236 f025 .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:
+000237 f000 .dw DO_COLON
+ PFA_LMARK:
+000238 f5c8 .dw XT_DP
+000239 f025 .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:
+00023a f000 .dw DO_COLON
+ PFA_LRESOLVE:
+00023b fb71 .dw XT_QSTACK
+00023c 0206 .dw XT_COMMA
+00023d f025 .dw XT_EXIT
+
+ .include "words/ahead.asm"
+
+ ; Compiler
+ ; do a unconditional branch
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_AHEAD:
+00023e 0005 .dw $0005
+00023f 6861
+000240 6165
+000241 0064 .db "ahead",0
+000242 0221 .dw VE_HEAD
+ .set VE_HEAD = VE_AHEAD
+ XT_AHEAD:
+000243 f000 .dw DO_COLON
+ PFA_AHEAD:
+ .endif
+000244 01fb .dw XT_COMPILE
+000245 f034 .dw XT_DOBRANCH
+000246 022c .dw XT_GMARK
+000247 f025 .dw XT_EXIT
+ .include "words/if.asm"
+
+ ; Compiler
+ ; start conditional branch
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_IF:
+000248 0002 .dw $0002
+000249 6669 .db "if"
+00024a 023e .dw VE_HEAD
+ .set VE_HEAD = VE_IF
+ XT_IF:
+00024b f000 .dw DO_COLON
+ PFA_IF:
+ .endif
+00024c 01fb .dw XT_COMPILE
+00024d f03e .dw XT_DOCONDBRANCH
+00024e 022c .dw XT_GMARK
+00024f f025 .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:
+000250 0004 .dw $0004
+000251 6c65
+000252 6573 .db "else"
+000253 0248 .dw VE_HEAD
+ .set VE_HEAD = VE_ELSE
+ XT_ELSE:
+000254 f000 .dw DO_COLON
+ PFA_ELSE:
+ .endif
+000255 01fb .dw XT_COMPILE
+000256 f034 .dw XT_DOBRANCH
+000257 022c .dw XT_GMARK
+000258 f0d5 .dw XT_SWAP
+000259 0231 .dw XT_GRESOLVE
+00025a f025 .dw XT_EXIT
+ .include "words/then.asm"
+
+ ; Compiler
+ ; finish if
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_THEN:
+00025b 0004 .dw $0004
+00025c 6874
+00025d 6e65 .db "then"
+00025e 0250 .dw VE_HEAD
+ .set VE_HEAD = VE_THEN
+ XT_THEN:
+00025f f000 .dw DO_COLON
+ PFA_THEN:
+ .endif
+000260 0231 .dw XT_GRESOLVE
+000261 f025 .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:
+000262 0005 .dw $0005
+000263 6562
+000264 6967
+000265 006e .db "begin",0
+000266 025b .dw VE_HEAD
+ .set VE_HEAD = VE_BEGIN
+ XT_BEGIN:
+000267 f000 .dw DO_COLON
+ PFA_BEGIN:
+ .endif
+000268 0237 .dw XT_LMARK
+000269 f025 .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:
+00026a 0005 .dw $0005
+00026b 6877
+00026c 6c69
+00026d 0065 .db "while",0
+00026e 0262 .dw VE_HEAD
+ .set VE_HEAD = VE_WHILE
+ XT_WHILE:
+00026f f000 .dw DO_COLON
+ PFA_WHILE:
+ .endif
+000270 024b .dw XT_IF
+000271 f0d5 .dw XT_SWAP
+000272 f025 .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:
+000273 0006 .dw $0006
+000274 6572
+000275 6570
+000276 7461 .db "repeat"
+000277 026a .dw VE_HEAD
+ .set VE_HEAD = VE_REPEAT
+ XT_REPEAT:
+000278 f000 .dw DO_COLON
+ PFA_REPEAT:
+ .endif
+000279 028c .dw XT_AGAIN
+00027a 025f .dw XT_THEN
+00027b f025 .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:
+00027c 0005 .dw $0005
+00027d 6e75
+00027e 6974
+00027f 006c .db "until",0
+000280 0273 .dw VE_HEAD
+ .set VE_HEAD = VE_UNTIL
+ XT_UNTIL:
+000281 f000 .dw DO_COLON
+ PFA_UNTIL:
+ .endif
+000282 f045 .dw XT_DOLITERAL
+000283 f03e .dw XT_DOCONDBRANCH
+000284 0206 .dw XT_COMMA
+
+000285 023a .dw XT_LRESOLVE
+000286 f025 .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:
+000287 0005 .dw $0005
+000288 6761
+000289 6961
+00028a 006e .db "again",0
+00028b 027c .dw VE_HEAD
+ .set VE_HEAD = VE_AGAIN
+ XT_AGAIN:
+00028c f000 .dw DO_COLON
+ PFA_AGAIN:
+ .endif
+00028d 01fb .dw XT_COMPILE
+00028e f034 .dw XT_DOBRANCH
+00028f 023a .dw XT_LRESOLVE
+000290 f025 .dw XT_EXIT
+ .include "words/do.asm"
+
+ ; Compiler
+ ; start do .. [+]loop
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_DO:
+000291 0002 .dw $0002
+000292 6f64 .db "do"
+000293 0287 .dw VE_HEAD
+ .set VE_HEAD = VE_DO
+ XT_DO:
+000294 f000 .dw DO_COLON
+ PFA_DO:
+
+ .endif
+000295 01fb .dw XT_COMPILE
+000296 f2ac .dw XT_DODO
+000297 0237 .dw XT_LMARK
+000298 f165 .dw XT_ZERO
+000299 02ef .dw XT_TO_L
+00029a f025 .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:
+00029b 0004 .dw $0004
+00029c 6f6c
+00029d 706f .db "loop"
+00029e 0291 .dw VE_HEAD
+ .set VE_HEAD = VE_LOOP
+ XT_LOOP:
+00029f f000 .dw DO_COLON
+ PFA_LOOP:
+ .endif
+0002a0 01fb .dw XT_COMPILE
+0002a1 f2da .dw XT_DOLOOP
+0002a2 02d6 .dw XT_ENDLOOP
+0002a3 f025 .dw XT_EXIT
+ .include "words/plusloop.asm"
+
+ ; Compiler
+ ; compile (+loop) and resolve branches
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_PLUSLOOP:
+0002a4 0005 .dw $0005
+0002a5 6c2b
+0002a6 6f6f
+0002a7 0070 .db "+loop",0
+0002a8 029b .dw VE_HEAD
+ .set VE_HEAD = VE_PLUSLOOP
+ XT_PLUSLOOP:
+0002a9 f000 .dw DO_COLON
+ PFA_PLUSLOOP:
+ .endif
+0002aa 01fb .dw XT_COMPILE
+0002ab f2cb .dw XT_DOPLUSLOOP
+0002ac 02d6 .dw XT_ENDLOOP
+0002ad f025 .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:
+0002ae 0005 .dw $0005
+0002af 656c
+0002b0 7661
+0002b1 0065 .db "leave",0
+0002b2 02a4 .dw VE_HEAD
+ .set VE_HEAD = VE_LEAVE
+ XT_LEAVE:
+0002b3 f000 .dw DO_COLON
+ PFA_LEAVE:
+ .endif
+0002b4 01fb
+0002b5 f2e5 .DW XT_COMPILE,XT_UNLOOP
+0002b6 0243
+0002b7 02ef
+0002b8 f025 .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:
+0002b9 0003 .dw $0003
+0002ba 643f
+0002bb 006f .db "?do",0
+0002bc 02ae .dw VE_HEAD
+ .set VE_HEAD = VE_QDO
+ XT_QDO:
+0002bd f000 .dw DO_COLON
+ PFA_QDO:
+ .endif
+0002be 01fb .dw XT_COMPILE
+0002bf 02c5 .dw XT_QDOCHECK
+0002c0 024b .dw XT_IF
+0002c1 0294 .dw XT_DO
+0002c2 f0d5 .dw XT_SWAP ; DO sets a 0 marker on the leave stack
+0002c3 02ef .dw XT_TO_L ; then follows at the end.
+0002c4 f025 .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:
+0002c5 f000 .dw DO_COLON
+ PFA_QDOCHECK:
+ .endif
+0002c6 f57f .dw XT_2DUP
+0002c7 fdaa .dw XT_EQUAL
+0002c8 f0c2 .dw XT_DUP
+0002c9 f110 .dw XT_TO_R
+0002ca f03e .dw XT_DOCONDBRANCH
+0002cb 02cd DEST(PFA_QDOCHECK1)
+0002cc f588 .dw XT_2DROP
+ PFA_QDOCHECK1:
+0002cd f107 .dw XT_R_FROM
+0002ce f20e .dw XT_INVERT
+0002cf f025 .dw XT_EXIT
+ .include "words/endloop.asm"
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_ENDLOOP:
+0002d0 ff07 .dw $ff07
+0002d1 6e65
+0002d2 6c64
+0002d3 6f6f
+0002d4 0070 .db "endloop",0
+0002d5 02b9 .dw VE_HEAD
+ .set VE_HEAD = VE_ENDLOOP
+ XT_ENDLOOP:
+0002d6 f000 .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.
+
+0002d7 023a .DW XT_LRESOLVE
+0002d8 02e3
+0002d9 f0ca
+0002da f03e LOOP1: .DW XT_L_FROM,XT_QDUP,XT_DOCONDBRANCH
+0002db 02df DEST(LOOP2)
+0002dc 025f .DW XT_THEN
+0002dd f034 .dw XT_DOBRANCH
+0002de 02d8 DEST(LOOP1)
+0002df f025 LOOP2: .DW XT_EXIT
+ ; leave address stack
+ .include "words/l-from.asm"
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_L_FROM:
+0002e0 ff02 .dw $ff02
+0002e1 3e6c .db "l>"
+0002e2 02d0 .dw VE_HEAD
+ .set VE_HEAD = VE_L_FROM
+ XT_L_FROM:
+0002e3 f000 .dw DO_COLON
+ PFA_L_FROM:
+
+ .endif
+ ;Z L> -- x L: x -- move from leave stack
+ ; LP @ @ -2 LP +! ;
+
+0002e4 0302 .dw XT_LP
+0002e5 f08a .dw XT_FETCH
+0002e6 f08a .dw XT_FETCH
+0002e7 f045 .dw XT_DOLITERAL
+0002e8 fffe .dw -2
+0002e9 0302 .dw XT_LP
+0002ea f276 .dw XT_PLUSSTORE
+0002eb f025 .dw XT_EXIT
+ .include "words/to-l.asm"
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_TO_L:
+0002ec ff02 .dw $ff02
+0002ed 6c3e .db ">l"
+0002ee 02e0 .dw VE_HEAD
+ .set VE_HEAD = VE_TO_L
+ XT_TO_L:
+0002ef f000 .dw DO_COLON
+ PFA_TO_L:
+ .endif
+ ;Z >L x -- L: -- x move to leave stack
+ ; CELL LP +! LP @ ! ; (L stack grows up)
+
+0002f0 fdb6 .dw XT_TWO
+0002f1 0302 .dw XT_LP
+0002f2 f276 .dw XT_PLUSSTORE
+0002f3 0302 .dw XT_LP
+0002f4 f08a .dw XT_FETCH
+0002f5 f092 .dw XT_STORE
+0002f6 f025 .dw XT_EXIT
+ .include "words/lp0.asm"
+
+ ; Stack
+ ; start address of leave stack
+ VE_LP0:
+0002f7 ff03 .dw $ff03
+0002f8 706c
+0002f9 0030 .db "lp0",0
+0002fa 02ec .dw VE_HEAD
+ .set VE_HEAD = VE_LP0
+ XT_LP0:
+0002fb f080 .dw PFA_DOVALUE1
+ PFA_LP0:
+0002fc 007e .dw CFG_LP0
+0002fd fbce .dw XT_EDEFERFETCH
+0002fe fbd8 .dw XT_EDEFERSTORE
+ .include "words/lp.asm"
+
+ ; System Variable
+ ; leave stack pointer
+ VE_LP:
+0002ff ff02 .dw $ff02
+000300 706c .db "lp"
+000301 02f7 .dw VE_HEAD
+ .set VE_HEAD = VE_LP
+ XT_LP:
+000302 f053 .dw PFA_DOVARIABLE
+ PFA_LP:
+000303 0251 .dw ram_lp
+
+ .dseg
+000251 ram_lp: .byte 2
+ .cseg
+
+
+ .include "words/create.asm"
+
+ ; Dictionary
+ ; create a dictionary header. XT is (constant), with the address of the data field of name
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_CREATE:
+000304 ff06 .dw $ff06
+000305 7263
+000306 6165
+000307 6574 .db "create"
+000308 02ff .dw VE_HEAD
+ .set VE_HEAD = VE_CREATE
+ XT_CREATE:
+000309 f000 .dw DO_COLON
+ PFA_CREATE:
+ .endif
+00030a 01d8 .dw XT_DOCREATE
+00030b 0338 .dw XT_REVEAL
+00030c 01fb .dw XT_COMPILE
+00030d f060 .dw PFA_DOCONSTANT
+00030e f025 .dw XT_EXIT
+ .include "words/header.asm"
+
+ ; Compiler
+ ; creates the vocabulary header without XT and data field (PF) in the wordlist wid
+ VE_HEADER:
+00030f ff06 .dw $ff06
+000310 6568
+000311 6461
+000312 7265 .db "header"
+000313 0304 .dw VE_HEAD
+ .set VE_HEAD = VE_HEADER
+ XT_HEADER:
+000314 f000 .dw DO_COLON
+ PFA_HEADER:
+000315 f5c8 .dw XT_DP ; the new Name Field
+000316 f110 .dw XT_TO_R
+000317 f110 .dw XT_TO_R ; ( R: NFA WID )
+000318 f0c2 .dw XT_DUP
+000319 f139 .dw XT_GREATERZERO
+00031a f03e .dw XT_DOCONDBRANCH
+00031b 0326 .dw PFA_HEADER1
+00031c f0c2 .dw XT_DUP
+00031d f045 .dw XT_DOLITERAL
+00031e ff00 .dw $ff00 ; all flags are off (e.g. immediate)
+00031f f22d .dw XT_OR
+000320 f799 .dw XT_DOSCOMMA
+ ; make the link to the previous entry in this wordlist
+000321 f107 .dw XT_R_FROM
+000322 f370 .dw XT_FETCHE
+000323 0206 .dw XT_COMMA
+000324 f107 .dw XT_R_FROM
+000325 f025 .dw XT_EXIT
+
+ PFA_HEADER1:
+ ; -16: attempt to use zero length string as a name
+000326 f045 .dw XT_DOLITERAL
+000327 fff0 .dw -16
+000328 f85b .dw XT_THROW
+
+ .include "words/wlscope.asm"
+
+ ; Compiler
+ ; dynamically place a word in a wordlist. The word name may be changed.
+ VE_WLSCOPE:
+000329 ff07 .dw $ff07
+00032a 6c77
+00032b 6373
+00032c 706f
+00032d 0065 .db "wlscope",0
+00032e 030f .dw VE_HEAD
+ .set VE_HEAD = VE_WLSCOPE
+ XT_WLSCOPE:
+00032f fc2d .dw PFA_DODEFER1
+ PFA_WLSCOPE:
+000330 007a .dw CFG_WLSCOPE
+000331 fbce .dw XT_EDEFERFETCH
+000332 fbd8 .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:
+000333 ff06 .dw $ff06
+000334 6572
+000335 6576
+000336 6c61 .db "reveal"
+000337 0329 .dw VE_HEAD
+ .set VE_HEAD = VE_REVEAL
+ XT_REVEAL:
+000338 f000 .dw DO_COLON
+ PFA_REVEAL:
+ .endif
+000339 01c9
+00033a f578
+00033b f08a .DW XT_NEWEST,XT_CELLPLUS,XT_FETCH ; only if wordlist is in use
+00033c f0ca
+00033d f03e .DW XT_QDUP,XT_DOCONDBRANCH
+00033e 0343 DEST(REVEAL1)
+00033f 01c9
+000340 f08a
+000341 f0d5
+000342 f34c .DW XT_NEWEST,XT_FETCH,XT_SWAP,XT_STOREE
+ ; .DW XT_ZERO,XT_NEWEST,XT_CELLPLUS,XT_STORE ; clean wordlist entry
+ REVEAL1:
+000343 f025 .DW XT_EXIT
+ .include "words/does.asm"
+
+ ; Compiler
+ ; organize the XT replacement to call other colon code
+ VE_DOES:
+000344 0005 .dw $0005
+000345 6f64
+000346 7365
+000347 003e .db "does>",0
+000348 0333 .dw VE_HEAD
+ .set VE_HEAD = VE_DOES
+ XT_DOES:
+000349 f000 .dw DO_COLON
+ PFA_DOES:
+00034a 01fb .dw XT_COMPILE
+00034b 035c .dw XT_DODOES
+00034c 01fb .dw XT_COMPILE ; create a code snippet to be used in an embedded XT
+00034d 940e .dw $940e ; the address of this compiled
+00034e 01fb .dw XT_COMPILE ; code will replace the XT of the
+00034f 0351 .dw DO_DODOES ; word that CREATE created
+000350 f025 .dw XT_EXIT ;
+
+ DO_DODOES: ; ( -- PFA )
+000351 939a
+000352 938a savetos
+000353 01cb movw tosl, wl
+000354 9601 adiw tosl, 1
+ ; the following takes the address from a real uC-call
+ .if (pclen==3)
+ .endif
+000355 917f pop wh
+000356 916f pop wl
+
+000357 93bf push XH
+000358 93af push XL
+000359 01db movw XL, wl
+00035a 940c f004 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:
+00035c f000 .dw DO_COLON
+ PFA_DODOES:
+00035d f107 .dw XT_R_FROM
+00035e 01c9 .dw XT_NEWEST
+00035f f578 .dw XT_CELLPLUS
+000360 f08a .dw XT_FETCH
+000361 f370 .dw XT_FETCHE
+000362 fc98 .dw XT_NFA2CFA
+000363 f384 .dw XT_STOREI
+000364 f025 .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:
+000365 ff01 .dw $ff01
+000366 003a .db ":",0
+000367 0344 .dw VE_HEAD
+ .set VE_HEAD = VE_COLON
+ XT_COLON:
+000368 f000 .dw DO_COLON
+ PFA_COLON:
+ .endif
+000369 01d8 .dw XT_DOCREATE
+00036a 0373 .dw XT_COLONNONAME
+00036b f0ea .dw XT_DROP
+00036c f025 .dw XT_EXIT
+ .include "words/colon-noname.asm"
+
+ ; Compiler
+ ; create an unnamed entry in the dictionary, XT is DO_COLON
+ VE_COLONNONAME:
+00036d ff07 .dw $ff07
+00036e 6e3a
+00036f 6e6f
+000370 6d61
+000371 0065 .db ":noname",0
+000372 0365 .dw VE_HEAD
+ .set VE_HEAD = VE_COLONNONAME
+ XT_COLONNONAME:
+000373 f000 .dw DO_COLON
+ PFA_COLONNONAME:
+000374 f5c8 .dw XT_DP
+000375 f0c2 .dw XT_DUP
+000376 01d0 .dw XT_LATEST
+000377 f092 .dw XT_STORE
+
+000378 01fb .dw XT_COMPILE
+000379 f000 .dw DO_COLON
+
+00037a 0388 .dw XT_RBRACKET
+00037b f025 .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:
+00037c 0001 .dw $0001
+00037d 003b .db $3b,0
+00037e 036d .dw VE_HEAD
+ .set VE_HEAD = VE_SEMICOLON
+ XT_SEMICOLON:
+00037f f000 .dw DO_COLON
+ PFA_SEMICOLON:
+ .endif
+000380 01fb .dw XT_COMPILE
+000381 f025 .dw XT_EXIT
+000382 0390 .dw XT_LBRACKET
+000383 0338 .dw XT_REVEAL
+000384 f025 .dw XT_EXIT
+ .include "words/right-bracket.asm"
+
+ ; Compiler
+ ; enter compiler mode
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_RBRACKET:
+000385 ff01 .dw $ff01
+000386 005d .db "]",0
+000387 037c .dw VE_HEAD
+ .set VE_HEAD = VE_RBRACKET
+ XT_RBRACKET:
+000388 f000 .dw DO_COLON
+ PFA_RBRACKET:
+ .endif
+000389 fdb1 .dw XT_ONE
+00038a f565 .dw XT_STATE
+00038b f092 .dw XT_STORE
+00038c f025 .dw XT_EXIT
+ .include "words/left-bracket.asm"
+
+ ; Compiler
+ ; enter interpreter mode
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_LBRACKET:
+00038d 0001 .dw $0001
+00038e 005b .db "[",0
+00038f 0385 .dw VE_HEAD
+ .set VE_HEAD = VE_LBRACKET
+ XT_LBRACKET:
+000390 f000 .dw DO_COLON
+ PFA_LBRACKET:
+ .endif
+000391 f165 .dw XT_ZERO
+000392 f565 .dw XT_STATE
+000393 f092 .dw XT_STORE
+000394 f025 .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:
+000395 ff08 .dw $ff08
+000396 6176
+000397 6972
+000398 6261
+000399 656c .db "variable"
+00039a 038d .dw VE_HEAD
+ .set VE_HEAD = VE_VARIABLE
+ XT_VARIABLE:
+00039b f000 .dw DO_COLON
+ PFA_VARIABLE:
+ .endif
+00039c f5d9 .dw XT_HERE
+00039d 03a7 .dw XT_CONSTANT
+00039e fdb6 .dw XT_TWO
+00039f f5e2 .dw XT_ALLOT
+0003a0 f025 .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:
+0003a1 ff08 .dw $ff08
+0003a2 6f63
+0003a3 736e
+0003a4 6174
+0003a5 746e .db "constant"
+0003a6 0395 .dw VE_HEAD
+ .set VE_HEAD = VE_CONSTANT
+ XT_CONSTANT:
+0003a7 f000 .dw DO_COLON
+ PFA_CONSTANT:
+ .endif
+0003a8 01d8 .dw XT_DOCREATE
+0003a9 0338 .dw XT_REVEAL
+0003aa 01fb .dw XT_COMPILE
+0003ab f053 .dw PFA_DOVARIABLE
+0003ac 0206 .dw XT_COMMA
+0003ad f025 .dw XT_EXIT
+ .include "words/user.asm"
+
+ ; Compiler
+ ; create a dictionary entry for a user variable at offset n
+ VE_USER:
+0003ae ff04 .dw $ff04
+0003af 7375
+0003b0 7265 .db "user"
+0003b1 03a1 .dw VE_HEAD
+ .set VE_HEAD = VE_USER
+ XT_USER:
+0003b2 f000 .dw DO_COLON
+ PFA_USER:
+0003b3 01d8 .dw XT_DOCREATE
+0003b4 0338 .dw XT_REVEAL
+
+0003b5 01fb .dw XT_COMPILE
+0003b6 f066 .dw PFA_DOUSER
+0003b7 0206 .dw XT_COMMA
+0003b8 f025 .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:
+0003b9 0007 .dw $0007
+0003ba 6572
+0003bb 7563
+0003bc 7372
+0003bd 0065 .db "recurse",0
+0003be 03ae .dw VE_HEAD
+ .set VE_HEAD = VE_RECURSE
+ XT_RECURSE:
+0003bf f000 .dw DO_COLON
+ PFA_RECURSE:
+ .endif
+0003c0 01d0 .dw XT_LATEST
+0003c1 f08a .dw XT_FETCH
+0003c2 0206 .dw XT_COMMA
+0003c3 f025 .dw XT_EXIT
+ .include "words/immediate.asm"
+
+ ; Compiler
+ ; set immediate flag for the most recent word definition
+ VE_IMMEDIATE:
+0003c4 ff09 .dw $ff09
+0003c5 6d69
+0003c6 656d
+0003c7 6964
+0003c8 7461
+0003c9 0065 .db "immediate",0
+0003ca 03b9 .dw VE_HEAD
+ .set VE_HEAD = VE_IMMEDIATE
+ XT_IMMEDIATE:
+0003cb f000 .dw DO_COLON
+ PFA_IMMEDIATE:
+0003cc 046d .dw XT_GET_CURRENT
+0003cd f370 .dw XT_FETCHE
+0003ce f0c2 .dw XT_DUP
+0003cf f3e2 .dw XT_FETCHI
+0003d0 f045 .dw XT_DOLITERAL
+0003d1 7fff .dw $7fff
+0003d2 f224 .dw XT_AND
+0003d3 f0d5 .dw XT_SWAP
+0003d4 f384 .dw XT_STOREI
+0003d5 f025 .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:
+0003d6 0006 .dw $0006
+0003d7 635b
+0003d8 6168
+0003d9 5d72 .db "[char]"
+0003da 03c4 .dw VE_HEAD
+ .set VE_HEAD = VE_BRACKETCHAR
+ XT_BRACKETCHAR:
+0003db f000 .dw DO_COLON
+ PFA_BRACKETCHAR:
+ .endif
+0003dc 01fb .dw XT_COMPILE
+0003dd f045 .dw XT_DOLITERAL
+0003de f904 .dw XT_CHAR
+0003df 0206 .dw XT_COMMA
+0003e0 f025 .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:
+0003e1 0006 .dw $0006
+0003e2 6261
+0003e3 726f
+0003e4 2274 .db "abort",'"'
+0003e5 03d6 .dw VE_HEAD
+ .set VE_HEAD = VE_ABORTQUOTE
+ XT_ABORTQUOTE:
+0003e6 f000 .dw DO_COLON
+ PFA_ABORTQUOTE:
+ .endif
+0003e7 f4db .dw XT_SQUOTE
+0003e8 01fb .dw XT_COMPILE
+0003e9 03f8 .dw XT_QABORT
+0003ea f025 .DW XT_EXIT
+ .include "words/abort.asm"
+
+ ; Exceptions
+ ; send an exception -1
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_ABORT:
+0003eb ff05 .dw $ff05
+0003ec 6261
+0003ed 726f
+0003ee 0074 .db "abort",0
+0003ef 03e1 .dw VE_HEAD
+ .set VE_HEAD = VE_ABORT
+ XT_ABORT:
+0003f0 f000 .dw DO_COLON
+ PFA_ABORT:
+ .endif
+0003f1 f15c .dw XT_TRUE
+0003f2 f85b .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:
+0003f3 ff06 .dw $ff06
+0003f4 613f
+0003f5 6f62
+0003f6 7472 .db "?abort"
+0003f7 03eb .dw VE_HEAD
+ .set VE_HEAD = VE_QABORT
+ XT_QABORT:
+0003f8 f000 .dw DO_COLON
+ PFA_QABORT:
+
+ .endif
+0003f9 f0f2
+0003fa f03e .DW XT_ROT,XT_DOCONDBRANCH
+0003fb 03fe DEST(QABO1)
+0003fc f7ba
+0003fd 03f0 .DW XT_ITYPE,XT_ABORT
+0003fe f588
+0003ff f025 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:
+000400 ff09 .dw $ff09
+000401 6567
+000402 2d74
+000403 7473
+000404 6361
+000405 006b .db "get-stack",0
+000406 03f3 .dw VE_HEAD
+ .set VE_HEAD = VE_GET_STACK
+ XT_GET_STACK:
+000407 f000 .dw DO_COLON
+ .endif
+000408 f0c2 .dw XT_DUP
+000409 f578 .dw XT_CELLPLUS
+00040a f0d5 .dw XT_SWAP
+00040b f370 .dw XT_FETCHE
+00040c f0c2 .dw XT_DUP
+00040d f110 .dw XT_TO_R
+00040e f165 .dw XT_ZERO
+00040f f0d5 .dw XT_SWAP ; go from bigger to smaller addresses
+000410 02c5 .dw XT_QDOCHECK
+000411 f03e .dw XT_DOCONDBRANCH
+000412 041e DEST(PFA_N_FETCH_E2)
+000413 f2ac .dw XT_DODO
+ PFA_N_FETCH_E1:
+ ; ( ee-addr )
+000414 f2bd .dw XT_I
+000415 f246 .dw XT_1MINUS
+000416 f572 .dw XT_CELLS ; ( -- ee-addr i*2 )
+000417 f0e0 .dw XT_OVER ; ( -- ee-addr i*2 ee-addr )
+000418 f1ae .dw XT_PLUS ; ( -- ee-addr ee-addr+i
+000419 f370 .dw XT_FETCHE ;( -- ee-addr item_i )
+00041a f0d5 .dw XT_SWAP ;( -- item_i ee-addr )
+00041b f15c .dw XT_TRUE ; shortcut for -1
+00041c f2cb .dw XT_DOPLUSLOOP
+00041d 0414 DEST(PFA_N_FETCH_E1)
+ PFA_N_FETCH_E2:
+00041e f588 .dw XT_2DROP
+00041f f107 .dw XT_R_FROM
+000420 f025 .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:
+000421 ff09 .dw $ff09
+000422 6573
+000423 2d74
+000424 7473
+000425 6361
+000426 006b .db "set-stack",0
+000427 0400 .dw VE_HEAD
+ .set VE_HEAD = VE_SET_STACK
+ XT_SET_STACK:
+000428 f000 .dw DO_COLON
+ PFA_SET_STACK:
+ .endif
+000429 f0e0 .dw XT_OVER
+00042a f132 .dw XT_ZEROLESS
+00042b f03e .dw XT_DOCONDBRANCH
+00042c 0430 DEST(PFA_SET_STACK0)
+00042d f045 .dw XT_DOLITERAL
+00042e fffc .dw -4
+00042f f85b .dw XT_THROW
+ PFA_SET_STACK0:
+000430 f57f .dw XT_2DUP
+000431 f34c .dw XT_STOREE ; ( -- i_n .. i_0 n e-addr )
+000432 f0d5 .dw XT_SWAP
+000433 f165 .dw XT_ZERO
+000434 02c5 .dw XT_QDOCHECK
+000435 f03e .dw XT_DOCONDBRANCH
+000436 043d DEST(PFA_SET_STACK2)
+000437 f2ac .dw XT_DODO
+ PFA_SET_STACK1:
+000438 f578 .dw XT_CELLPLUS ; ( -- i_x e-addr )
+000439 f590 .dw XT_TUCK ; ( -- e-addr i_x e-addr
+00043a f34c .dw XT_STOREE
+00043b f2da .dw XT_DOLOOP
+00043c 0438 DEST(PFA_SET_STACK1)
+ PFA_SET_STACK2:
+00043d f0ea .dw XT_DROP
+00043e f025 .dw XT_EXIT
+
+ .include "words/map-stack.asm"
+
+ ; Tools
+ ; Iterate over a stack
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_MAPSTACK:
+00043f ff09 .dw $ff09
+000440 616d
+000441 2d70
+000442 7473
+000443 6361
+000444 006b .db "map-stack",0
+000445 0421 .dw VE_HEAD
+ .set VE_HEAD = VE_MAPSTACK
+ XT_MAPSTACK:
+000446 f000 .dw DO_COLON
+ PFA_MAPSTACK:
+ .endif
+000447 f0c2 .dw XT_DUP
+000448 f578 .dw XT_CELLPLUS
+000449 f0d5 .dw XT_SWAP
+00044a f370 .dw XT_FETCHE
+00044b f572 .dw XT_CELLS
+00044c fd89 .dw XT_BOUNDS
+00044d 02c5 .dw XT_QDOCHECK
+00044e f03e .dw XT_DOCONDBRANCH
+00044f 0462 DEST(PFA_MAPSTACK3)
+000450 f2ac .dw XT_DODO
+ PFA_MAPSTACK1:
+000451 f2bd .dw XT_I
+000452 f370 .dw XT_FETCHE ; -- i*x XT id
+000453 f0d5 .dw XT_SWAP
+000454 f110 .dw XT_TO_R
+000455 f119 .dw XT_R_FETCH
+000456 f02f .dw XT_EXECUTE ; i*x id -- j*y true | i*x false
+000457 f0ca .dw XT_QDUP
+000458 f03e .dw XT_DOCONDBRANCH
+000459 045e DEST(PFA_MAPSTACK2)
+00045a f107 .dw XT_R_FROM
+00045b f0ea .dw XT_DROP
+00045c f2e5 .dw XT_UNLOOP
+00045d f025 .dw XT_EXIT
+ PFA_MAPSTACK2:
+00045e f107 .dw XT_R_FROM
+00045f fdb6 .dw XT_TWO
+000460 f2cb .dw XT_DOPLUSLOOP
+000461 0451 DEST(PFA_MAPSTACK1)
+ PFA_MAPSTACK3:
+000462 f0ea .dw XT_DROP
+000463 f165 .dw XT_ZERO
+000464 f025 .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:
+000465 ff0b .dw $ff0b
+000466 6567
+000467 2d74
+000468 7563
+000469 7272
+00046a 6e65
+00046b 0074 .db "get-current",0
+00046c 043f .dw VE_HEAD
+ .set VE_HEAD = VE_GET_CURRENT
+ XT_GET_CURRENT:
+00046d f000 .dw DO_COLON
+ PFA_GET_CURRENT:
+00046e f045 .dw XT_DOLITERAL
+00046f 0084 .dw CFG_CURRENT
+000470 f370 .dw XT_FETCHE
+000471 f025 .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:
+000472 ff09 .dw $ff09
+000473 6567
+000474 2d74
+000475 726f
+000476 6564
+000477 0072 .db "get-order",0
+000478 0465 .dw VE_HEAD
+ .set VE_HEAD = VE_GET_ORDER
+ XT_GET_ORDER:
+000479 f000 .dw DO_COLON
+ PFA_GET_ORDER:
+ .endif
+00047a f045 .dw XT_DOLITERAL
+00047b 0088 .dw CFG_ORDERLISTLEN
+00047c 0407 .dw XT_GET_STACK
+00047d f025 .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:
+00047e ff09 .dw $ff09
+00047f 6663
+000480 2d67
+000481 726f
+000482 6564
+000483 0072 .db "cfg-order",0
+000484 0472 .dw VE_HEAD
+ .set VE_HEAD = VE_CFG_ORDER
+ XT_CFG_ORDER:
+000485 f053 .dw PFA_DOVARIABLE
+ PFA_CFG_ORDER:
+ .endif
+000486 0088 .dw CFG_ORDERLISTLEN
+ .include "words/compare.asm"
+
+ ; String
+ ; compares two strings in RAM
+ VE_COMPARE:
+000487 ff07 .dw $ff07
+000488 6f63
+000489 706d
+00048a 7261
+00048b 0065 .db "compare",0
+00048c 047e .dw VE_HEAD
+ .set VE_HEAD = VE_COMPARE
+ XT_COMPARE:
+00048d 048e .dw PFA_COMPARE
+ PFA_COMPARE:
+00048e 93bf push xh
+00048f 93af push xl
+000490 018c movw temp0, tosl
+000491 9189
+000492 9199 loadtos
+000493 01dc movw xl, tosl
+000494 9189
+000495 9199 loadtos
+000496 019c movw temp2, tosl
+000497 9189
+000498 9199 loadtos
+000499 01fc movw zl, tosl
+ PFA_COMPARE_LOOP:
+00049a 90ed ld temp4, X+
+00049b 90f1 ld temp5, Z+
+00049c 14ef cp temp4, temp5
+00049d f451 brne PFA_COMPARE_NOTEQUAL
+00049e 950a dec temp0
+00049f f019 breq PFA_COMPARE_ENDREACHED2
+0004a0 952a dec temp2
+0004a1 f7c1 brne PFA_COMPARE_LOOP
+0004a2 c001 rjmp PFA_COMPARE_ENDREACHED
+ PFA_COMPARE_ENDREACHED2:
+0004a3 952a dec temp2
+ PFA_COMPARE_ENDREACHED:
+0004a4 2b02 or temp0, temp2
+0004a5 f411 brne PFA_COMPARE_CHECKLASTCHAR
+0004a6 2788 clr tosl
+0004a7 c002 rjmp PFA_COMPARE_DONE
+ PFA_COMPARE_CHECKLASTCHAR:
+ PFA_COMPARE_NOTEQUAL:
+0004a8 ef8f ser tosl
+0004a9 c000 rjmp PFA_COMPARE_DONE
+
+ PFA_COMPARE_DONE:
+0004aa 2f98 mov tosh, tosl
+0004ab 91af pop xl
+0004ac 91bf pop xh
+0004ad 940c f004 jmp_ DO_NEXT
+ .include "words/nfa2lfa.asm"
+
+ ; System
+ ; get the link field address from the name field address
+ VE_NFA2LFA:
+0004af ff07 .dw $ff07
+0004b0 666e
+0004b1 3e61
+0004b2 666c
+0004b3 0061 .db "nfa>lfa",0
+0004b4 0487 .dw VE_HEAD
+ .set VE_HEAD = VE_NFA2LFA
+ XT_NFA2LFA:
+0004b5 f000 .dw DO_COLON
+ PFA_NFA2LFA:
+0004b6 fc8c .dw XT_NAME2STRING
+0004b7 f240 .dw XT_1PLUS
+0004b8 f215 .dw XT_2SLASH
+0004b9 f1ae .dw XT_PLUS
+0004ba f025 .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 "dict/compiler2.inc" ; additional words for the compiler
+
+ ; 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:
+0004bb ff0b .dw $ff0b
+0004bc 6573
+0004bd 2d74
+0004be 7563
+0004bf 7272
+0004c0 6e65
+0004c1 0074 .db "set-current",0
+0004c2 04af .dw VE_HEAD
+ .set VE_HEAD = VE_SET_CURRENT
+ XT_SET_CURRENT:
+0004c3 f000 .dw DO_COLON
+ PFA_SET_CURRENT:
+0004c4 f045 .dw XT_DOLITERAL
+0004c5 0084 .dw CFG_CURRENT
+0004c6 f34c .dw XT_STOREE
+0004c7 f025 .dw XT_EXIT
+ .include "words/wordlist.asm"
+
+ ; Search Order
+ ; create a new, empty wordlist
+ VE_WORDLIST:
+0004c8 ff08 .dw $ff08
+0004c9 6f77
+0004ca 6472
+0004cb 696c
+0004cc 7473 .db "wordlist"
+0004cd 04bb .dw VE_HEAD
+ .set VE_HEAD = VE_WORDLIST
+ XT_WORDLIST:
+0004ce f000 .dw DO_COLON
+ PFA_WORDLIST:
+0004cf f5d1 .dw XT_EHERE
+0004d0 f165 .dw XT_ZERO
+0004d1 f0e0 .dw XT_OVER
+0004d2 f34c .dw XT_STOREE
+0004d3 f0c2 .dw XT_DUP
+0004d4 f578 .dw XT_CELLPLUS
+0004d5 fbb3 .dw XT_DOTO
+0004d6 f5d2 .dw PFA_EHERE
+0004d7 f025 .dw XT_EXIT
+
+ .include "words/forth-wordlist.asm"
+
+ ; Search Order
+ ; get the system default word list
+ VE_FORTHWORDLIST:
+0004d8 ff0e .dw $ff0e
+0004d9 6f66
+0004da 7472
+0004db 2d68
+0004dc 6f77
+0004dd 6472
+0004de 696c
+0004df 7473 .db "forth-wordlist"
+0004e0 04c8 .dw VE_HEAD
+ .set VE_HEAD = VE_FORTHWORDLIST
+ XT_FORTHWORDLIST:
+0004e1 f053 .dw PFA_DOVARIABLE
+ PFA_FORTHWORDLIST:
+0004e2 0086 .dw CFG_FORTHWORDLIST
+ .include "words/set-order.asm"
+
+ ; Search Order
+ ; replace the search order list
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_SET_ORDER:
+0004e3 ff09 .dw $ff09
+0004e4 6573
+0004e5 2d74
+0004e6 726f
+0004e7 6564
+0004e8 0072 .db "set-order",0
+0004e9 04d8 .dw VE_HEAD
+ .set VE_HEAD = VE_SET_ORDER
+ XT_SET_ORDER:
+0004ea f000 .dw DO_COLON
+ PFA_SET_ORDER:
+ .endif
+0004eb f045 .dw XT_DOLITERAL
+0004ec 0088 .dw CFG_ORDERLISTLEN
+0004ed 0428 .dw XT_SET_STACK
+0004ee f025 .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:
+0004ef ff0f .dw $ff0f
+0004f0 6573
+0004f1 2d74
+0004f2 6572
+0004f3 6f63
+0004f4 6e67
+0004f5 7a69
+0004f6 7265
+0004f7 0073 .db "set-recognizers",0
+0004f8 04e3 .dw VE_HEAD
+ .set VE_HEAD = VE_SET_RECOGNIZERS
+ XT_SET_RECOGNIZERS:
+0004f9 f000 .dw DO_COLON
+ PFA_SET_RECOGNIZERS:
+ .endif
+0004fa f045 .dw XT_DOLITERAL
+0004fb 009a .dw CFG_RECOGNIZERLISTLEN
+0004fc 0428 .dw XT_SET_STACK
+0004fd f025 .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:
+0004fe ff0f .dw $ff0f
+0004ff 6567
+000500 2d74
+000501 6572
+000502 6f63
+000503 6e67
+000504 7a69
+000505 7265
+000506 0073 .db "get-recognizers",0
+000507 04ef .dw VE_HEAD
+ .set VE_HEAD = VE_GET_RECOGNIZERS
+ XT_GET_RECOGNIZERS:
+000508 f000 .dw DO_COLON
+ PFA_GET_RECOGNIZERS:
+ .endif
+000509 f045 .dw XT_DOLITERAL
+00050a 009a .dw CFG_RECOGNIZERLISTLEN
+00050b 0407 .dw XT_GET_STACK
+00050c f025 .dw XT_EXIT
+ .include "words/code.asm"
+
+ ; Compiler
+ ; create named entry in the dictionary, XT is the data field
+ VE_CODE:
+00050d ff04 .dw $ff04
+00050e 6f63
+00050f 6564 .db "code"
+000510 04fe .dw VE_HEAD
+ .set VE_HEAD = VE_CODE
+ XT_CODE:
+000511 f000 .dw DO_COLON
+ PFA_CODE:
+000512 01d8 .dw XT_DOCREATE
+000513 0338 .dw XT_REVEAL
+000514 f5c8 .dw XT_DP
+000515 fbc5 .dw XT_ICELLPLUS
+000516 0206 .dw XT_COMMA
+000517 f025 .dw XT_EXIT
+ .include "words/end-code.asm"
+
+ ; Compiler
+ ; finish a code definition
+ VE_ENDCODE:
+000518 ff08 .dw $ff08
+000519 6e65
+00051a 2d64
+00051b 6f63
+00051c 6564 .db "end-code"
+00051d 050d .dw VE_HEAD
+ .set VE_HEAD = VE_ENDCODE
+ XT_ENDCODE:
+00051e f000 .dw DO_COLON
+ PFA_ENDCODE:
+00051f 01fb .dw XT_COMPILE
+000520 940c .dw $940c
+000521 01fb .dw XT_COMPILE
+000522 f004 .dw DO_NEXT
+000523 f025 .dw XT_EXIT
+ .include "words/marker.asm"
+
+ ; System Value
+ ; The eeprom address until which MARKER saves and restores the eeprom data.
+ VE_MARKER:
+000524 ff08 .dw $ff08
+000525 6d28
+000526 7261
+000527 656b
+000528 2972 .db "(marker)"
+000529 0518 .dw VE_HEAD
+ .set VE_HEAD = VE_MARKER
+ XT_MARKER:
+00052a f080 .dw PFA_DOVALUE1
+ PFA_MARKER:
+00052b 00a6 .dw EE_MARKER
+00052c fbce .dw XT_EDEFERFETCH
+00052d fbd8 .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:
+00052e 0008 .dw $0008
+00052f 6f70
+000530 7473
+000531 6f70
+000532 656e .db "postpone"
+000533 0524 .dw VE_HEAD
+ .set VE_HEAD = VE_POSTPONE
+ XT_POSTPONE:
+000534 f000 .dw DO_COLON
+ PFA_POSTPONE:
+ .endif
+000535 f9ce .dw XT_PARSENAME
+000536 fae6 .dw XT_FORTHRECOGNIZER
+000537 faf1 .dw XT_RECOGNIZE
+000538 f0c2 .dw XT_DUP
+000539 f110 .dw XT_TO_R
+00053a fbc5 .dw XT_ICELLPLUS
+00053b fbc5 .dw XT_ICELLPLUS
+00053c f3e2 .dw XT_FETCHI
+00053d f02f .dw XT_EXECUTE
+00053e f107 .dw XT_R_FROM
+00053f fbc5 .dw XT_ICELLPLUS
+000540 f3e2 .dw XT_FETCHI
+000541 0206 .dw XT_COMMA
+000542 f025 .dw XT_EXIT
+ .endif
+
+ .include "words/applturnkey.asm"
+
+ ; R( -- )
+ ; application specific turnkey action
+ VE_APPLTURNKEY:
+000543 ff0b .dw $ff0b
+000544 7061
+000545 6c70
+000546 7574
+000547 6e72
+000548 656b
+000549 0079 .db "applturnkey",0
+00054a 052e .dw VE_HEAD
+ .set VE_HEAD = VE_APPLTURNKEY
+ XT_APPLTURNKEY:
+00054b f000 .dw DO_COLON
+ PFA_APPLTURNKEY:
+00054c 0105 .dw XT_USART
+
+ .if WANT_INTERRUPTS == 1
+00054d f493 .dw XT_INTON
+ .endif
+
+00054e fb7e .dw XT_DOT_VER
+00054f f7fc .dw XT_SPACE
+000550 f787 .dw XT_DOSLITERAL
+000551 000a .dw 10
+000552 6f46
+000553 7472
+000554 6468
+000555 6975
+000556 6f6e .db "Forthduino"
+000557 f7ba .dw XT_ITYPE
+
+000558 f025 .dw XT_EXIT
+
+
+ .set DPSTART = pc
+ .if(pc>AMFORTH_RO_SEG)
+ .endif
+
+ .org AMFORTH_RO_SEG
+ .include "amforth-interpreter.asm"
+
+
+ DO_COLON:
+00f000 93bf push XH
+00f001 93af push XL ; PUSH IP
+00f002 01db movw XL, wl
+00f003 9611 adiw xl, 1
+ DO_NEXT:
+ .if WANT_INTERRUPTS == 1
+00f004 14b2 cp isrflag, zerol
+00f005 f499 brne DO_INTERRUPT
+ .endif
+00f006 01fd movw zl, XL ; READ IP
+00f007 2755
+00f008 0fee
+00f009 1fff
+00f00a 1f55
+00f00b bf5b
+00f00c 9167
+00f00d 9177 readflashcell wl, wh
+00f00e 9611 adiw XL, 1 ; INC IP
+
+ DO_EXECUTE:
+00f00f 01fb movw zl, wl
+00f010 2755
+00f011 0fee
+00f012 1fff
+00f013 1f55
+00f014 bf5b
+00f015 9107
+00f016 9117 readflashcell temp0,temp1
+00f017 01f8 movw zl, temp0
+00f018 9409 ijmp
+
+ .if WANT_INTERRUPTS == 1
+ DO_INTERRUPT:
+ ; here we deal with interrupts the forth way
+00f019 939a
+00f01a 938a savetos
+00f01b 2d8b mov tosl, isrflag
+00f01c 2799 clr tosh
+00f01d 24bb clr isrflag
+00f01e eb6c ldi wl, LOW(XT_ISREXEC)
+00f01f ef74 ldi wh, HIGH(XT_ISREXEC)
+00f020 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:
+00f021 ff04 .dw $ff04
+00f022 7865
+00f023 7469 .db "exit"
+00f024 0543 .dw VE_HEAD
+ .set VE_HEAD = VE_EXIT
+ XT_EXIT:
+00f025 f026 .dw PFA_EXIT
+ PFA_EXIT:
+00f026 91af pop XL
+00f027 91bf pop XH
+00f028 cfdb jmp_ DO_NEXT
+ .include "words/execute.asm"
+
+ ; System
+ ; execute XT
+ VE_EXECUTE:
+00f029 ff07 .dw $ff07
+00f02a 7865
+00f02b 6365
+00f02c 7475
+00f02d 0065 .db "execute",0
+00f02e f021 .dw VE_HEAD
+ .set VE_HEAD = VE_EXECUTE
+ XT_EXECUTE:
+00f02f f030 .dw PFA_EXECUTE
+ PFA_EXECUTE:
+00f030 01bc movw wl, tosl
+00f031 9189
+00f032 9199 loadtos
+00f033 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:
+00f034 f035 .dw PFA_DOBRANCH
+ PFA_DOBRANCH:
+00f035 01fd movw zl, XL
+00f036 2755
+00f037 0fee
+00f038 1fff
+00f039 1f55
+00f03a bf5b
+00f03b 91a7
+00f03c 91b7 readflashcell XL,XH
+00f03d 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:
+00f03e f03f .dw PFA_DOCONDBRANCH
+ PFA_DOCONDBRANCH:
+00f03f 2b98 or tosh, tosl
+00f040 9189
+00f041 9199 loadtos
+00f042 f391 brbs 1, PFA_DOBRANCH ; 1 is z flag; if tos is zero (false), do the branch
+00f043 9611 adiw XL, 1
+00f044 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:
+00f045 f046 .dw PFA_DOLITERAL
+ PFA_DOLITERAL:
+00f046 939a
+00f047 938a savetos
+00f048 01fd movw zl, xl
+00f049 2755
+00f04a 0fee
+00f04b 1fff
+00f04c 1f55
+00f04d bf5b
+00f04e 9187
+00f04f 9197 readflashcell tosl,tosh
+00f050 9611 adiw xl, 1
+00f051 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:
+00f052 f053 .dw PFA_DOVARIABLE
+ PFA_DOVARIABLE:
+00f053 939a
+00f054 938a savetos
+00f055 01fb movw zl, wl
+00f056 9631 adiw zl,1
+00f057 2755
+00f058 0fee
+00f059 1fff
+00f05a 1f55
+00f05b bf5b
+00f05c 9187
+00f05d 9197 readflashcell tosl,tosh
+00f05e 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:
+00f05f f060 .dw PFA_DOCONSTANT
+ PFA_DOCONSTANT:
+00f060 939a
+00f061 938a savetos
+00f062 01cb movw tosl, wl
+00f063 9601 adiw tosl, 1
+00f064 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:
+00f065 f066 .dw PFA_DOUSER
+ PFA_DOUSER:
+00f066 939a
+00f067 938a savetos
+00f068 01fb movw zl, wl
+00f069 9631 adiw zl, 1
+00f06a 2755
+00f06b 0fee
+00f06c 1fff
+00f06d 1f55
+00f06e bf5b
+00f06f 9187
+00f070 9197 readflashcell tosl,tosh
+00f071 0d84 add tosl, upl
+00f072 1d95 adc tosh, uph
+00f073 cf90 jmp_ DO_NEXT
+ .include "words/do-value.asm"
+
+ ; System
+ ; runtime of value
+ VE_DOVALUE:
+00f074 ff07 .dw $ff07
+00f075 7628
+00f076 6c61
+00f077 6575
+00f078 0029 .db "(value)", 0
+00f079 f029 .dw VE_HEAD
+ .set VE_HEAD = VE_DOVALUE
+ XT_DOVALUE:
+00f07a f000 .dw DO_COLON
+ PFA_DOVALUE:
+00f07b 01d8 .dw XT_DOCREATE
+00f07c 0338 .dw XT_REVEAL
+00f07d 01fb .dw XT_COMPILE
+00f07e f080 .dw PFA_DOVALUE1
+00f07f f025 .dw XT_EXIT
+ PFA_DOVALUE1:
+00f080 940e 0351 call_ DO_DODOES
+00f082 f0c2 .dw XT_DUP
+00f083 fbc5 .dw XT_ICELLPLUS
+00f084 f3e2 .dw XT_FETCHI
+00f085 f02f .dw XT_EXECUTE
+00f086 f025 .dw XT_EXIT
+
+ ; : (value) <builds does> dup icell+ @i execute ;
+ .include "words/fetch.asm"
+
+ ; Memory
+ ; read 1 cell from RAM address
+ VE_FETCH:
+00f087 ff01 .dw $ff01
+00f088 0040 .db "@",0
+00f089 f074 .dw VE_HEAD
+ .set VE_HEAD = VE_FETCH
+ XT_FETCH:
+00f08a f08b .dw PFA_FETCH
+ PFA_FETCH:
+ .if WANT_UNIFIED == 1
+ .endif
+ PFA_FETCHRAM:
+00f08b 01fc movw zl, tosl
+ ; low byte is read before the high byte
+00f08c 9181 ld tosl, z+
+00f08d 9191 ld tosh, z+
+00f08e 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:
+00f08f ff01 .dw $ff01
+00f090 0021 .db "!",0
+00f091 f087 .dw VE_HEAD
+ .set VE_HEAD = VE_STORE
+ XT_STORE:
+00f092 f093 .dw PFA_STORE
+ PFA_STORE:
+ .if WANT_UNIFIED == 1
+ .endif
+ PFA_STORERAM:
+00f093 01fc movw zl, tosl
+00f094 9189
+00f095 9199 loadtos
+ ; the high byte is written before the low byte
+00f096 8391 std Z+1, tosh
+00f097 8380 std Z+0, tosl
+00f098 9189
+00f099 9199 loadtos
+00f09a cf69 jmp_ DO_NEXT
+ .if WANT_UNIFIED == 1
+ .endif
+ .include "words/cstore.asm"
+
+ ; Memory
+ ; store a single byte to RAM address
+ VE_CSTORE:
+00f09b ff02 .dw $ff02
+00f09c 2163 .db "c!"
+00f09d f08f .dw VE_HEAD
+ .set VE_HEAD = VE_CSTORE
+ XT_CSTORE:
+00f09e f09f .dw PFA_CSTORE
+ PFA_CSTORE:
+00f09f 01fc movw zl, tosl
+00f0a0 9189
+00f0a1 9199 loadtos
+00f0a2 8380 st Z, tosl
+00f0a3 9189
+00f0a4 9199 loadtos
+00f0a5 cf5e jmp_ DO_NEXT
+ .include "words/cfetch.asm"
+
+ ; Memory
+ ; fetch a single byte from memory mapped locations
+ VE_CFETCH:
+00f0a6 ff02 .dw $ff02
+00f0a7 4063 .db "c@"
+00f0a8 f09b .dw VE_HEAD
+ .set VE_HEAD = VE_CFETCH
+ XT_CFETCH:
+00f0a9 f0aa .dw PFA_CFETCH
+ PFA_CFETCH:
+00f0aa 01fc movw zl, tosl
+00f0ab 2799 clr tosh
+00f0ac 8180 ld tosl, Z
+00f0ad cf56 jmp_ DO_NEXT
+ .include "words/fetch-u.asm"
+
+ ; Memory
+ ; read 1 cell from USER area
+ VE_FETCHU:
+00f0ae ff02 .dw $ff02
+00f0af 7540 .db "@u"
+00f0b0 f0a6 .dw VE_HEAD
+ .set VE_HEAD = VE_FETCHU
+ XT_FETCHU:
+00f0b1 f000 .dw DO_COLON
+ PFA_FETCHU:
+00f0b2 f313 .dw XT_UP_FETCH
+00f0b3 f1ae .dw XT_PLUS
+00f0b4 f08a .dw XT_FETCH
+00f0b5 f025 .dw XT_EXIT
+ .include "words/store-u.asm"
+
+ ; Memory
+ ; write n to USER area at offset
+ VE_STOREU:
+00f0b6 ff02 .dw $ff02
+00f0b7 7521 .db "!u"
+00f0b8 f0ae .dw VE_HEAD
+ .set VE_HEAD = VE_STOREU
+ XT_STOREU:
+00f0b9 f000 .dw DO_COLON
+ PFA_STOREU:
+00f0ba f313 .dw XT_UP_FETCH
+00f0bb f1ae .dw XT_PLUS
+00f0bc f092 .dw XT_STORE
+00f0bd f025 .dw XT_EXIT
+
+ ;;;;;;;;;;;;;;;;;;;;;;;;;
+ .include "words/dup.asm"
+
+ ; Stack
+ ; duplicate TOS
+ VE_DUP:
+00f0be ff03 .dw $ff03
+00f0bf 7564
+00f0c0 0070 .db "dup",0
+00f0c1 f0b6 .dw VE_HEAD
+ .set VE_HEAD = VE_DUP
+ XT_DUP:
+00f0c2 f0c3 .dw PFA_DUP
+ PFA_DUP:
+00f0c3 939a
+00f0c4 938a savetos
+00f0c5 cf3e jmp_ DO_NEXT
+ .include "words/qdup.asm"
+
+ ; Stack
+ ; duplicate TOS if non-zero
+ VE_QDUP:
+00f0c6 ff04 .dw $ff04
+00f0c7 643f
+00f0c8 7075 .db "?dup"
+00f0c9 f0be .dw VE_HEAD
+ .set VE_HEAD = VE_QDUP
+ XT_QDUP:
+00f0ca f0cb .dw PFA_QDUP
+ PFA_QDUP:
+00f0cb 2f08 mov temp0, tosl
+00f0cc 2b09 or temp0, tosh
+00f0cd f011 breq PFA_QDUP1
+00f0ce 939a
+00f0cf 938a savetos
+ PFA_QDUP1:
+00f0d0 cf33 jmp_ DO_NEXT
+ .include "words/swap.asm"
+
+ ; Stack
+ ; swaps the two top level stack cells
+ VE_SWAP:
+00f0d1 ff04 .dw $ff04
+00f0d2 7773
+00f0d3 7061 .db "swap"
+00f0d4 f0c6 .dw VE_HEAD
+ .set VE_HEAD = VE_SWAP
+ XT_SWAP:
+00f0d5 f0d6 .dw PFA_SWAP
+ PFA_SWAP:
+00f0d6 018c movw temp0, tosl
+00f0d7 9189
+00f0d8 9199 loadtos
+00f0d9 931a st -Y, temp1
+00f0da 930a st -Y, temp0
+00f0db cf28 jmp_ DO_NEXT
+ .include "words/over.asm"
+
+ ; Stack
+ ; Place a copy of x1 on top of the stack
+ VE_OVER:
+00f0dc ff04 .dw $ff04
+00f0dd 766f
+00f0de 7265 .db "over"
+00f0df f0d1 .dw VE_HEAD
+ .set VE_HEAD = VE_OVER
+ XT_OVER:
+00f0e0 f0e1 .dw PFA_OVER
+ PFA_OVER:
+00f0e1 939a
+00f0e2 938a savetos
+00f0e3 818a ldd tosl, Y+2
+00f0e4 819b ldd tosh, Y+3
+
+00f0e5 cf1e jmp_ DO_NEXT
+ .include "words/drop.asm"
+
+ ; Stack
+ ; drop TOS
+ VE_DROP:
+00f0e6 ff04 .dw $ff04
+00f0e7 7264
+00f0e8 706f .db "drop"
+00f0e9 f0dc .dw VE_HEAD
+ .set VE_HEAD = VE_DROP
+ XT_DROP:
+00f0ea f0eb .dw PFA_DROP
+ PFA_DROP:
+00f0eb 9189
+00f0ec 9199 loadtos
+00f0ed cf16 jmp_ DO_NEXT
+ .include "words/rot.asm"
+
+ ; Stack
+ ; rotate the three top level cells
+ VE_ROT:
+00f0ee ff03 .dw $ff03
+00f0ef 6f72
+00f0f0 0074 .db "rot",0
+00f0f1 f0e6 .dw VE_HEAD
+ .set VE_HEAD = VE_ROT
+ XT_ROT:
+00f0f2 f0f3 .dw PFA_ROT
+ PFA_ROT:
+00f0f3 018c movw temp0, tosl
+00f0f4 9129 ld temp2, Y+
+00f0f5 9139 ld temp3, Y+
+00f0f6 9189
+00f0f7 9199 loadtos
+
+00f0f8 933a st -Y, temp3
+00f0f9 932a st -Y, temp2
+00f0fa 931a st -Y, temp1
+00f0fb 930a st -Y, temp0
+
+00f0fc cf07 jmp_ DO_NEXT
+ .include "words/nip.asm"
+
+ ; Stack
+ ; Remove Second of Stack
+ VE_NIP:
+00f0fd ff03 .dw $ff03
+00f0fe 696e
+00f0ff 0070 .db "nip",0
+00f100 f0ee .dw VE_HEAD
+ .set VE_HEAD = VE_NIP
+ XT_NIP:
+00f101 f102 .dw PFA_NIP
+ PFA_NIP:
+00f102 9622 adiw yl, 2
+00f103 cf00 jmp_ DO_NEXT
+ ;;;;;;;;;;;;;;;;;;;;;;;;;
+ .include "words/r_from.asm"
+
+ ; Stack
+ ; move TOR to TOS
+ VE_R_FROM:
+00f104 ff02 .dw $ff02
+00f105 3e72 .db "r>"
+00f106 f0fd .dw VE_HEAD
+ .set VE_HEAD = VE_R_FROM
+ XT_R_FROM:
+00f107 f108 .dw PFA_R_FROM
+ PFA_R_FROM:
+00f108 939a
+00f109 938a savetos
+00f10a 918f pop tosl
+00f10b 919f pop tosh
+00f10c cef7 jmp_ DO_NEXT
+ .include "words/to_r.asm"
+
+ ; Stack
+ ; move TOS to TOR
+ VE_TO_R:
+00f10d ff02 .dw $ff02
+00f10e 723e .db ">r"
+00f10f f104 .dw VE_HEAD
+ .set VE_HEAD = VE_TO_R
+ XT_TO_R:
+00f110 f111 .dw PFA_TO_R
+ PFA_TO_R:
+00f111 939f push tosh
+00f112 938f push tosl
+00f113 9189
+00f114 9199 loadtos
+00f115 ceee jmp_ DO_NEXT
+ .include "words/r_fetch.asm"
+
+ ; Stack
+ ; fetch content of TOR
+ VE_R_FETCH:
+00f116 ff02 .dw $ff02
+00f117 4072 .db "r@"
+00f118 f10d .dw VE_HEAD
+ .set VE_HEAD = VE_R_FETCH
+ XT_R_FETCH:
+00f119 f11a .dw PFA_R_FETCH
+ PFA_R_FETCH:
+00f11a 939a
+00f11b 938a savetos
+00f11c 918f pop tosl
+00f11d 919f pop tosh
+00f11e 939f push tosh
+00f11f 938f push tosl
+00f120 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:
+00f121 ff02 .dw $ff02
+00f122 3e3c .db "<>"
+00f123 f116 .dw VE_HEAD
+ .set VE_HEAD = VE_NOTEQUAL
+ XT_NOTEQUAL:
+00f124 f000 .dw DO_COLON
+ PFA_NOTEQUAL:
+ .endif
+
+00f125 fdaa
+00f126 f12b
+00f127 f025 .DW XT_EQUAL,XT_ZEROEQUAL,XT_EXIT
+ .include "words/equalzero.asm"
+
+ ; Compare
+ ; compare with 0 (zero)
+ VE_ZEROEQUAL:
+00f128 ff02 .dw $ff02
+00f129 3d30 .db "0="
+00f12a f121 .dw VE_HEAD
+ .set VE_HEAD = VE_ZEROEQUAL
+ XT_ZEROEQUAL:
+00f12b f12c .dw PFA_ZEROEQUAL
+ PFA_ZEROEQUAL:
+00f12c 2b98 or tosh, tosl
+00f12d f5d1 brne PFA_ZERO1
+00f12e c030 rjmp PFA_TRUE1
+ .include "words/lesszero.asm"
+
+ ; Compare
+ ; compare with zero
+ VE_ZEROLESS:
+00f12f ff02 .dw $ff02
+00f130 3c30 .db "0<"
+00f131 f128 .dw VE_HEAD
+ .set VE_HEAD = VE_ZEROLESS
+ XT_ZEROLESS:
+00f132 f133 .dw PFA_ZEROLESS
+ PFA_ZEROLESS:
+00f133 fd97 sbrc tosh,7
+00f134 c02a rjmp PFA_TRUE1
+00f135 c032 rjmp PFA_ZERO1
+ .include "words/greaterzero.asm"
+
+ ; Compare
+ ; true if n1 is greater than 0
+ VE_GREATERZERO:
+00f136 ff02 .dw $ff02
+00f137 3e30 .db "0>"
+00f138 f12f .dw VE_HEAD
+ .set VE_HEAD = VE_GREATERZERO
+ XT_GREATERZERO:
+00f139 f13a .dw PFA_GREATERZERO
+ PFA_GREATERZERO:
+00f13a 1582 cp tosl, zerol
+00f13b 0593 cpc tosh, zeroh
+00f13c f15c brlt PFA_ZERO1
+00f13d f151 brbs 1, PFA_ZERO1
+00f13e c020 rjmp PFA_TRUE1
+ .include "words/d-greaterzero.asm"
+
+ ; Compare
+ ; compares if a double double cell number is greater 0
+ VE_DGREATERZERO:
+00f13f ff03 .dw $ff03
+00f140 3064
+00f141 003e .db "d0>",0
+00f142 f136 .dw VE_HEAD
+ .set VE_HEAD = VE_DGREATERZERO
+ XT_DGREATERZERO:
+00f143 f144 .dw PFA_DGREATERZERO
+ PFA_DGREATERZERO:
+00f144 1582 cp tosl, zerol
+00f145 0593 cpc tosh, zeroh
+00f146 9189
+00f147 9199 loadtos
+00f148 0582 cpc tosl, zerol
+00f149 0593 cpc tosh, zeroh
+00f14a f0ec brlt PFA_ZERO1
+00f14b f0e1 brbs 1, PFA_ZERO1
+00f14c c012 rjmp PFA_TRUE1
+ .include "words/d-lesszero.asm"
+
+ ; Compare
+ ; compares if a double double cell number is less than 0
+ VE_DXT_ZEROLESS:
+00f14d ff03 .dw $ff03
+00f14e 3064
+00f14f 003c .db "d0<",0
+00f150 f13f .dw VE_HEAD
+ .set VE_HEAD = VE_DXT_ZEROLESS
+ XT_DXT_ZEROLESS:
+00f151 f152 .dw PFA_DXT_ZEROLESS
+ PFA_DXT_ZEROLESS:
+00f152 9622 adiw Y,2
+00f153 fd97 sbrc tosh,7
+00f154 940c f15f jmp PFA_TRUE1
+00f156 940c f168 jmp PFA_ZERO1
+
+ .include "words/true.asm"
+
+ ; Arithmetics
+ ; leaves the value -1 (true) on TOS
+ VE_TRUE:
+00f158 ff04 .dw $ff04
+00f159 7274
+00f15a 6575 .db "true"
+00f15b f14d .dw VE_HEAD
+ .set VE_HEAD = VE_TRUE
+ XT_TRUE:
+00f15c f15d .dw PFA_TRUE
+ PFA_TRUE:
+00f15d 939a
+00f15e 938a savetos
+ PFA_TRUE1:
+00f15f ef8f ser tosl
+00f160 ef9f ser tosh
+00f161 cea2 jmp_ DO_NEXT
+ .include "words/zero.asm"
+
+ ; Arithmetics
+ ; place a value 0 on TOS
+ VE_ZERO:
+00f162 ff01 .dw $ff01
+00f163 0030 .db "0",0
+00f164 f158 .dw VE_HEAD
+ .set VE_HEAD = VE_ZERO
+ XT_ZERO:
+00f165 f166 .dw PFA_ZERO
+ PFA_ZERO:
+00f166 939a
+00f167 938a savetos
+ PFA_ZERO1:
+00f168 01c1 movw tosl, zerol
+00f169 ce9a jmp_ DO_NEXT
+ .include "words/uless.asm"
+
+ ; Compare
+ ; true if u1 < u2 (unsigned)
+ VE_ULESS:
+00f16a ff02 .dw $ff02
+00f16b 3c75 .db "u<"
+00f16c f162 .dw VE_HEAD
+ .set VE_HEAD = VE_ULESS
+ XT_ULESS:
+00f16d f16e .dw PFA_ULESS
+ PFA_ULESS:
+00f16e 9129 ld temp2, Y+
+00f16f 9139 ld temp3, Y+
+00f170 1782 cp tosl, temp2
+00f171 0793 cpc tosh, temp3
+00f172 f3a8 brlo PFA_ZERO1
+00f173 f3a1 brbs 1, PFA_ZERO1
+00f174 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:
+00f175 ff02 .dw $ff02
+00f176 3e75 .db "u>"
+00f177 f16a .dw VE_HEAD
+ .set VE_HEAD = VE_UGREATER
+ XT_UGREATER:
+00f178 f000 .dw DO_COLON
+ PFA_UGREATER:
+ .endif
+00f179 f0d5 .DW XT_SWAP
+00f17a f16d .dw XT_ULESS
+00f17b f025 .dw XT_EXIT
+ .include "words/less.asm"
+
+ ; Compare
+ ; true if n1 is less than n2
+ VE_LESS:
+00f17c ff01 .dw $ff01
+00f17d 003c .db "<",0
+00f17e f175 .dw VE_HEAD
+ .set VE_HEAD = VE_LESS
+ XT_LESS:
+00f17f f180 .dw PFA_LESS
+ PFA_LESS:
+00f180 9129 ld temp2, Y+
+00f181 9139 ld temp3, Y+
+00f182 1728 cp temp2, tosl
+00f183 0739 cpc temp3, tosh
+ PFA_LESSDONE:
+00f184 f71c brge PFA_ZERO1
+00f185 cfd9 rjmp PFA_TRUE1
+ .include "words/greater.asm"
+
+ ; Compare
+ ; flag is true if n1 is greater than n2
+ VE_GREATER:
+00f186 ff01 .dw $ff01
+00f187 003e .db ">",0
+00f188 f17c .dw VE_HEAD
+ .set VE_HEAD = VE_GREATER
+ XT_GREATER:
+00f189 f18a .dw PFA_GREATER
+ PFA_GREATER:
+00f18a 9129 ld temp2, Y+
+00f18b 9139 ld temp3, Y+
+00f18c 1728 cp temp2, tosl
+00f18d 0739 cpc temp3, tosh
+ PFA_GREATERDONE:
+00f18e f2cc brlt PFA_ZERO1
+00f18f f2c1 brbs 1, PFA_ZERO1
+00f190 cfce rjmp PFA_TRUE1
+
+ .include "words/log2.asm"
+
+ ; Arithmetics
+ ; logarithm to base 2 or highest set bitnumber
+ VE_LOG2:
+00f191 ff04 .dw $ff04
+00f192 6f6c
+00f193 3267 .db "log2"
+00f194 f186 .dw VE_HEAD
+ .set VE_HEAD = VE_LOG2
+ XT_LOG2:
+00f195 f196 .dw PFA_LOG2
+ PFA_LOG2:
+00f196 01fc movw zl, tosl
+00f197 2799 clr tosh
+00f198 e180 ldi tosl, 16
+ PFA_LOG2_1:
+00f199 958a dec tosl
+00f19a f022 brmi PFA_LOG2_2 ; wrong data
+00f19b 0fee lsl zl
+00f19c 1fff rol zh
+00f19d f7d8 brcc PFA_LOG2_1
+00f19e ce65 jmp_ DO_NEXT
+
+ PFA_LOG2_2:
+00f19f 959a dec tosh
+00f1a0 ce63 jmp_ DO_NEXT
+ .include "words/minus.asm"
+
+ ; Arithmetics
+ ; subtract n2 from n1
+ VE_MINUS:
+00f1a1 ff01 .dw $ff01
+00f1a2 002d .db "-",0
+00f1a3 f191 .dw VE_HEAD
+ .set VE_HEAD = VE_MINUS
+ XT_MINUS:
+00f1a4 f1a5 .dw PFA_MINUS
+ PFA_MINUS:
+00f1a5 9109 ld temp0, Y+
+00f1a6 9119 ld temp1, Y+
+00f1a7 1b08 sub temp0, tosl
+00f1a8 0b19 sbc temp1, tosh
+00f1a9 01c8 movw tosl, temp0
+00f1aa ce59 jmp_ DO_NEXT
+ .include "words/plus.asm"
+
+ ; Arithmetics
+ ; add n1 and n2
+ VE_PLUS:
+00f1ab ff01 .dw $ff01
+00f1ac 002b .db "+",0
+00f1ad f1a1 .dw VE_HEAD
+ .set VE_HEAD = VE_PLUS
+ XT_PLUS:
+00f1ae f1af .dw PFA_PLUS
+ PFA_PLUS:
+00f1af 9109 ld temp0, Y+
+00f1b0 9119 ld temp1, Y+
+00f1b1 0f80 add tosl, temp0
+00f1b2 1f91 adc tosh, temp1
+00f1b3 ce50 jmp_ DO_NEXT
+ .include "words/mstar.asm"
+
+ ; Arithmetics
+ ; multiply 2 cells to a double cell
+ VE_MSTAR:
+00f1b4 ff02 .dw $ff02
+00f1b5 2a6d .db "m*"
+00f1b6 f1ab .dw VE_HEAD
+ .set VE_HEAD = VE_MSTAR
+ XT_MSTAR:
+00f1b7 f1b8 .dw PFA_MSTAR
+ PFA_MSTAR:
+00f1b8 018c movw temp0, tosl
+00f1b9 9189
+00f1ba 9199 loadtos
+00f1bb 019c movw temp2, tosl
+ ; high cell ah*bh
+00f1bc 0231 muls temp3, temp1
+00f1bd 0170 movw temp4, r0
+ ; low cell al*bl
+00f1be 9f20 mul temp2, temp0
+00f1bf 01c0 movw tosl, r0
+ ; signed ah*bl
+00f1c0 0330 mulsu temp3, temp0
+00f1c1 08f3 sbc temp5, zeroh
+00f1c2 0d90 add tosh, r0
+00f1c3 1ce1 adc temp4, r1
+00f1c4 1cf3 adc temp5, zeroh
+
+ ; signed al*bh
+00f1c5 0312 mulsu temp1, temp2
+00f1c6 08f3 sbc temp5, zeroh
+00f1c7 0d90 add tosh, r0
+00f1c8 1ce1 adc temp4, r1
+00f1c9 1cf3 adc temp5, zeroh
+
+00f1ca 939a
+00f1cb 938a savetos
+00f1cc 01c7 movw tosl, temp4
+00f1cd ce36 jmp_ DO_NEXT
+ .include "words/umslashmod.asm"
+
+ ; Arithmetics
+ ; unsigned division ud / u2 with remainder
+ VE_UMSLASHMOD:
+00f1ce ff06 .dw $ff06
+00f1cf 6d75
+00f1d0 6d2f
+00f1d1 646f .db "um/mod"
+00f1d2 f1b4 .dw VE_HEAD
+ .set VE_HEAD = VE_UMSLASHMOD
+ XT_UMSLASHMOD:
+00f1d3 f1d4 .dw PFA_UMSLASHMOD
+ PFA_UMSLASHMOD:
+00f1d4 017c movw temp4, tosl
+
+00f1d5 9129 ld temp2, Y+
+00f1d6 9139 ld temp3, Y+
+
+00f1d7 9109 ld temp0, Y+
+00f1d8 9119 ld temp1, Y+
+
+ ;; unsigned 32/16 -> 16r16 divide
+
+ PFA_UMSLASHMODmod:
+
+ ; set loop counter
+00f1d9 e140 ldi temp6,$10
+
+ PFA_UMSLASHMODmod_loop:
+ ; shift left, saving high bit
+00f1da 2755 clr temp7
+00f1db 0f00 lsl temp0
+00f1dc 1f11 rol temp1
+00f1dd 1f22 rol temp2
+00f1de 1f33 rol temp3
+00f1df 1f55 rol temp7
+
+ ; try subtracting divisor
+00f1e0 152e cp temp2, temp4
+00f1e1 053f cpc temp3, temp5
+00f1e2 0552 cpc temp7,zerol
+
+00f1e3 f018 brcs PFA_UMSLASHMODmod_loop_control
+
+ PFA_UMSLASHMODmod_subtract:
+ ; dividend is large enough
+ ; do the subtraction for real
+ ; and set lowest bit
+00f1e4 9503 inc temp0
+00f1e5 192e sub temp2, temp4
+00f1e6 093f sbc temp3, temp5
+
+ PFA_UMSLASHMODmod_loop_control:
+00f1e7 954a dec temp6
+00f1e8 f789 brne PFA_UMSLASHMODmod_loop
+
+ PFA_UMSLASHMODmod_done:
+ ; put remainder on stack
+00f1e9 933a st -Y,temp3
+00f1ea 932a st -Y,temp2
+
+ ; put quotient on stack
+00f1eb 01c8 movw tosl, temp0
+00f1ec ce17 jmp_ DO_NEXT
+ .include "words/umstar.asm"
+
+ ; Arithmetics
+ ; multiply 2 unsigned cells to a double cell
+ VE_UMSTAR:
+00f1ed ff03 .dw $ff03
+00f1ee 6d75
+00f1ef 002a .db "um*",0
+00f1f0 f1ce .dw VE_HEAD
+ .set VE_HEAD = VE_UMSTAR
+ XT_UMSTAR:
+00f1f1 f1f2 .dw PFA_UMSTAR
+ PFA_UMSTAR:
+00f1f2 018c movw temp0, tosl
+00f1f3 9189
+00f1f4 9199 loadtos
+ ; result: (temp3*temp1)* 65536 + (temp3*temp0 + temp1*temp2) * 256 + (temp0 * temp2)
+ ; low bytes
+00f1f5 9f80 mul tosl,temp0
+00f1f6 01f0 movw zl, r0
+00f1f7 2722 clr temp2
+00f1f8 2733 clr temp3
+ ; middle bytes
+00f1f9 9f90 mul tosh, temp0
+00f1fa 0df0 add zh, r0
+00f1fb 1d21 adc temp2, r1
+00f1fc 1d33 adc temp3, zeroh
+
+00f1fd 9f81 mul tosl, temp1
+00f1fe 0df0 add zh, r0
+00f1ff 1d21 adc temp2, r1
+00f200 1d33 adc temp3, zeroh
+
+00f201 9f91 mul tosh, temp1
+00f202 0d20 add temp2, r0
+00f203 1d31 adc temp3, r1
+00f204 01cf movw tosl, zl
+00f205 939a
+00f206 938a savetos
+00f207 01c9 movw tosl, temp2
+00f208 cdfb jmp_ DO_NEXT
+
+ .include "words/invert.asm"
+
+ ; Arithmetics
+ ; 1-complement of TOS
+ VE_INVERT:
+00f209 ff06 .dw $ff06
+00f20a 6e69
+00f20b 6576
+00f20c 7472 .db "invert"
+00f20d f1ed .dw VE_HEAD
+ .set VE_HEAD = VE_INVERT
+ XT_INVERT:
+00f20e f20f .dw PFA_INVERT
+ PFA_INVERT:
+00f20f 9580 com tosl
+00f210 9590 com tosh
+00f211 cdf2 jmp_ DO_NEXT
+ .include "words/2slash.asm"
+
+ ; Arithmetics
+ ; arithmetic shift right
+ VE_2SLASH:
+00f212 ff02 .dw $ff02
+00f213 2f32 .db "2/"
+00f214 f209 .dw VE_HEAD
+ .set VE_HEAD = VE_2SLASH
+ XT_2SLASH:
+00f215 f216 .dw PFA_2SLASH
+ PFA_2SLASH:
+00f216 9595 asr tosh
+00f217 9587 ror tosl
+00f218 cdeb jmp_ DO_NEXT
+ .include "words/2star.asm"
+
+ ; Arithmetics
+ ; arithmetic shift left, filling with zero
+ VE_2STAR:
+00f219 ff02 .dw $ff02
+00f21a 2a32 .db "2*"
+00f21b f212 .dw VE_HEAD
+ .set VE_HEAD = VE_2STAR
+ XT_2STAR:
+00f21c f21d .dw PFA_2STAR
+ PFA_2STAR:
+00f21d 0f88 lsl tosl
+00f21e 1f99 rol tosh
+00f21f cde4 jmp_ DO_NEXT
+ .include "words/and.asm"
+
+ ; Logic
+ ; bitwise and
+ VE_AND:
+00f220 ff03 .dw $ff03
+00f221 6e61
+00f222 0064 .db "and",0
+00f223 f219 .dw VE_HEAD
+ .set VE_HEAD = VE_AND
+ XT_AND:
+00f224 f225 .dw PFA_AND
+ PFA_AND:
+00f225 9109 ld temp0, Y+
+00f226 9119 ld temp1, Y+
+00f227 2380 and tosl, temp0
+00f228 2391 and tosh, temp1
+00f229 cdda jmp_ DO_NEXT
+ .include "words/or.asm"
+
+ ; Logic
+ ; logical or
+ VE_OR:
+00f22a ff02 .dw $ff02
+00f22b 726f .db "or"
+00f22c f220 .dw VE_HEAD
+ .set VE_HEAD = VE_OR
+ XT_OR:
+00f22d f22e .dw PFA_OR
+ PFA_OR:
+00f22e 9109 ld temp0, Y+
+00f22f 9119 ld temp1, Y+
+00f230 2b80 or tosl, temp0
+00f231 2b91 or tosh, temp1
+00f232 cdd1 jmp_ DO_NEXT
+
+ .include "words/xor.asm"
+
+ ; Logic
+ ; exclusive or
+ VE_XOR:
+00f233 ff03 .dw $ff03
+00f234 6f78
+00f235 0072 .db "xor",0
+00f236 f22a .dw VE_HEAD
+ .set VE_HEAD = VE_XOR
+ XT_XOR:
+00f237 f238 .dw PFA_XOR
+ PFA_XOR:
+00f238 9109 ld temp0, Y+
+00f239 9119 ld temp1, Y+
+00f23a 2780 eor tosl, temp0
+00f23b 2791 eor tosh, temp1
+00f23c cdc7 jmp_ DO_NEXT
+
+ .include "words/1plus.asm"
+
+ ; Arithmetics
+ ; optimized increment
+ VE_1PLUS:
+00f23d ff02 .dw $ff02
+00f23e 2b31 .db "1+"
+00f23f f233 .dw VE_HEAD
+ .set VE_HEAD = VE_1PLUS
+ XT_1PLUS:
+00f240 f241 .dw PFA_1PLUS
+ PFA_1PLUS:
+00f241 9601 adiw tosl,1
+00f242 cdc1 jmp_ DO_NEXT
+ .include "words/1minus.asm"
+
+ ; Arithmetics
+ ; optimized decrement
+ VE_1MINUS:
+00f243 ff02 .dw $ff02
+00f244 2d31 .db "1-"
+00f245 f23d .dw VE_HEAD
+ .set VE_HEAD = VE_1MINUS
+ XT_1MINUS:
+00f246 f247 .dw PFA_1MINUS
+ PFA_1MINUS:
+00f247 9701 sbiw tosl, 1
+00f248 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:
+00f249 ff07 .dw $ff07
+00f24a 6e3f
+00f24b 6765
+00f24c 7461
+../../common\words/q-negate.asm(11): warning: .cseg .db misalignment - padding zero byte
+00f24d 0065 .db "?negate"
+00f24e f243 .dw VE_HEAD
+ .set VE_HEAD = VE_QNEGATE
+ XT_QNEGATE:
+00f24f f000 .dw DO_COLON
+ PFA_QNEGATE:
+
+ .endif
+00f250 f132
+00f251 f03e .DW XT_ZEROLESS,XT_DOCONDBRANCH
+00f252 f254 DEST(QNEG1)
+00f253 f659 .DW XT_NEGATE
+00f254 f025 QNEG1: .DW XT_EXIT
+ .include "words/lshift.asm"
+
+ ; Arithmetics
+ ; logically shift n1 left n2 times
+ VE_LSHIFT:
+00f255 ff06 .dw $ff06
+00f256 736c
+00f257 6968
+00f258 7466 .db "lshift"
+00f259 f249 .dw VE_HEAD
+ .set VE_HEAD = VE_LSHIFT
+ XT_LSHIFT:
+00f25a f25b .dw PFA_LSHIFT
+ PFA_LSHIFT:
+00f25b 01fc movw zl, tosl
+00f25c 9189
+00f25d 9199 loadtos
+ PFA_LSHIFT1:
+00f25e 9731 sbiw zl, 1
+00f25f f01a brmi PFA_LSHIFT2
+00f260 0f88 lsl tosl
+00f261 1f99 rol tosh
+00f262 cffb rjmp PFA_LSHIFT1
+ PFA_LSHIFT2:
+00f263 cda0 jmp_ DO_NEXT
+
+ .include "words/rshift.asm"
+
+ ; Arithmetics
+ ; shift n1 n2-times logically right
+ VE_RSHIFT:
+00f264 ff06 .dw $ff06
+00f265 7372
+00f266 6968
+00f267 7466 .db "rshift"
+00f268 f255 .dw VE_HEAD
+ .set VE_HEAD = VE_RSHIFT
+ XT_RSHIFT:
+00f269 f26a .dw PFA_RSHIFT
+ PFA_RSHIFT:
+00f26a 01fc movw zl, tosl
+00f26b 9189
+00f26c 9199 loadtos
+ PFA_RSHIFT1:
+00f26d 9731 sbiw zl, 1
+00f26e f01a brmi PFA_RSHIFT2
+00f26f 9596 lsr tosh
+00f270 9587 ror tosl
+00f271 cffb rjmp PFA_RSHIFT1
+ PFA_RSHIFT2:
+00f272 cd91 jmp_ DO_NEXT
+
+ .include "words/plusstore.asm"
+
+ ; Arithmetics
+ ; add n to content of RAM address a-addr
+ VE_PLUSSTORE:
+00f273 ff02 .dw $ff02
+00f274 212b .db "+!"
+00f275 f264 .dw VE_HEAD
+ .set VE_HEAD = VE_PLUSSTORE
+ XT_PLUSSTORE:
+00f276 f277 .dw PFA_PLUSSTORE
+ PFA_PLUSSTORE:
+00f277 01fc movw zl, tosl
+00f278 9189
+00f279 9199 loadtos
+00f27a 8120 ldd temp2, Z+0
+00f27b 8131 ldd temp3, Z+1
+00f27c 0f82 add tosl, temp2
+00f27d 1f93 adc tosh, temp3
+00f27e 8380 std Z+0, tosl
+00f27f 8391 std Z+1, tosh
+00f280 9189
+00f281 9199 loadtos
+00f282 cd81 jmp_ DO_NEXT
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+ .include "words/rpfetch.asm"
+
+ ; Stack
+ ; current return stack pointer address
+ VE_RP_FETCH:
+00f283 ff03 .dw $ff03
+00f284 7072
+00f285 0040 .db "rp@",0
+00f286 f273 .dw VE_HEAD
+ .set VE_HEAD = VE_RP_FETCH
+ XT_RP_FETCH:
+00f287 f288 .dw PFA_RP_FETCH
+ PFA_RP_FETCH:
+00f288 939a
+00f289 938a savetos
+00f28a b78d in tosl, SPL
+00f28b b79e in tosh, SPH
+00f28c cd77 jmp_ DO_NEXT
+ .include "words/rpstore.asm"
+
+ ; Stack
+ ; set return stack pointer
+ VE_RP_STORE:
+00f28d ff03 .dw $ff03
+00f28e 7072
+00f28f 0021 .db "rp!",0
+00f290 f283 .dw VE_HEAD
+ .set VE_HEAD = VE_RP_STORE
+ XT_RP_STORE:
+00f291 f292 .dw PFA_RP_STORE
+ PFA_RP_STORE:
+00f292 b72f in temp2, SREG
+00f293 94f8 cli
+00f294 bf8d out SPL, tosl
+00f295 bf9e out SPH, tosh
+00f296 bf2f out SREG, temp2
+00f297 9189
+00f298 9199 loadtos
+00f299 cd6a jmp_ DO_NEXT
+ .include "words/spfetch.asm"
+
+ ; Stack
+ ; current data stack pointer
+ VE_SP_FETCH:
+00f29a ff03 .dw $ff03
+00f29b 7073
+00f29c 0040 .db "sp@",0
+00f29d f28d .dw VE_HEAD
+ .set VE_HEAD = VE_SP_FETCH
+ XT_SP_FETCH:
+00f29e f29f .dw PFA_SP_FETCH
+ PFA_SP_FETCH:
+00f29f 939a
+00f2a0 938a savetos
+00f2a1 01ce movw tosl, yl
+00f2a2 cd61 jmp_ DO_NEXT
+ .include "words/spstore.asm"
+
+ ; Stack
+ ; set data stack pointer to addr
+ VE_SP_STORE:
+00f2a3 ff03 .dw $ff03
+00f2a4 7073
+00f2a5 0021 .db "sp!",0
+00f2a6 f29a .dw VE_HEAD
+ .set VE_HEAD = VE_SP_STORE
+ XT_SP_STORE:
+00f2a7 f2a8 .dw PFA_SP_STORE
+ PFA_SP_STORE:
+00f2a8 01ec movw yl, tosl
+00f2a9 9189
+00f2aa 9199 loadtos
+00f2ab 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:
+00f2ac f2ad .dw PFA_DODO
+ PFA_DODO:
+00f2ad 9129 ld temp2, Y+
+00f2ae 9139 ld temp3, Y+ ; limit
+ PFA_DODO1:
+00f2af e8e0 ldi zl, $80
+00f2b0 0f3e add temp3, zl
+00f2b1 1b82 sub tosl, temp2
+00f2b2 0b93 sbc tosh, temp3
+
+00f2b3 933f push temp3
+00f2b4 932f push temp2 ; limit ( --> limit + $8000)
+00f2b5 939f push tosh
+00f2b6 938f push tosl ; start -> index ( --> index - (limit - $8000)
+00f2b7 9189
+00f2b8 9199 loadtos
+00f2b9 cd4a jmp_ DO_NEXT
+ .include "words/i.asm"
+
+ ; Compiler
+ ; current loop counter
+ VE_I:
+00f2ba ff01 .dw $FF01
+00f2bb 0069 .db "i",0
+00f2bc f2a3 .dw VE_HEAD
+ .set VE_HEAD = VE_I
+ XT_I:
+00f2bd f2be .dw PFA_I
+ PFA_I:
+00f2be 939a
+00f2bf 938a savetos
+00f2c0 918f pop tosl
+00f2c1 919f pop tosh ; index
+00f2c2 91ef pop zl
+00f2c3 91ff pop zh ; limit
+00f2c4 93ff push zh
+00f2c5 93ef push zl
+00f2c6 939f push tosh
+00f2c7 938f push tosl
+00f2c8 0f8e add tosl, zl
+00f2c9 1f9f adc tosh, zh
+00f2ca 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:
+00f2cb f2cc .dw PFA_DOPLUSLOOP
+ PFA_DOPLUSLOOP:
+00f2cc 91ef pop zl
+00f2cd 91ff pop zh
+00f2ce 0fe8 add zl, tosl
+00f2cf 1ff9 adc zh, tosh
+00f2d0 9189
+00f2d1 9199 loadtos
+00f2d2 f01b brvs PFA_DOPLUSLOOP_LEAVE
+ ; next cycle
+ PFA_DOPLUSLOOP_NEXT:
+ ; next iteration
+00f2d3 93ff push zh
+00f2d4 93ef push zl
+00f2d5 cd5f rjmp PFA_DOBRANCH ; read next cell from dictionary and jump to its destination
+ PFA_DOPLUSLOOP_LEAVE:
+00f2d6 910f pop temp0
+00f2d7 911f pop temp1 ; remove limit
+00f2d8 9611 adiw xl, 1 ; skip branch-back address
+00f2d9 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:
+00f2da f2db .dw PFA_DOLOOP
+ PFA_DOLOOP:
+00f2db 91ef pop zl
+00f2dc 91ff pop zh
+00f2dd 9631 adiw zl,1
+00f2de f3bb brvs PFA_DOPLUSLOOP_LEAVE
+00f2df cff3 jmp_ PFA_DOPLUSLOOP_NEXT
+ .include "words/unloop.asm"
+
+ ; Compiler
+ ; remove loop-sys, exit the loop and continue execution after it
+ VE_UNLOOP:
+00f2e0 ff06 .dw $ff06
+00f2e1 6e75
+00f2e2 6f6c
+00f2e3 706f .db "unloop"
+00f2e4 f2ba .dw VE_HEAD
+ .set VE_HEAD = VE_UNLOOP
+ XT_UNLOOP:
+00f2e5 f2e6 .dw PFA_UNLOOP
+ PFA_UNLOOP:
+00f2e6 911f pop temp1
+00f2e7 910f pop temp0
+00f2e8 911f pop temp1
+00f2e9 910f pop temp0
+00f2ea cd19 jmp_ DO_NEXT
+
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+ .include "words/cmove_g.asm"
+
+ ; Memory
+ ; copy data in RAM from higher to lower addresses.
+ VE_CMOVE_G:
+00f2eb ff06 .dw $ff06
+00f2ec 6d63
+00f2ed 766f
+00f2ee 3e65 .db "cmove>"
+00f2ef f2e0 .dw VE_HEAD
+ .set VE_HEAD = VE_CMOVE_G
+ XT_CMOVE_G:
+00f2f0 f2f1 .dw PFA_CMOVE_G
+ PFA_CMOVE_G:
+00f2f1 93bf push xh
+00f2f2 93af push xl
+00f2f3 91e9 ld zl, Y+
+00f2f4 91f9 ld zh, Y+ ; addr-to
+00f2f5 91a9 ld xl, Y+
+00f2f6 91b9 ld xh, Y+ ; addr-from
+00f2f7 2f09 mov temp0, tosh
+00f2f8 2b08 or temp0, tosl
+00f2f9 f041 brbs 1, PFA_CMOVE_G1
+00f2fa 0fe8 add zl, tosl
+00f2fb 1ff9 adc zh, tosh
+00f2fc 0fa8 add xl, tosl
+00f2fd 1fb9 adc xh, tosh
+ PFA_CMOVE_G2:
+00f2fe 911e ld temp1, -X
+00f2ff 9312 st -Z, temp1
+00f300 9701 sbiw tosl, 1
+00f301 f7e1 brbc 1, PFA_CMOVE_G2
+ PFA_CMOVE_G1:
+00f302 91af pop xl
+00f303 91bf pop xh
+00f304 9189
+00f305 9199 loadtos
+00f306 ccfd jmp_ DO_NEXT
+ .include "words/byteswap.asm"
+
+ ; Arithmetics
+ ; exchange the bytes of the TOS
+ VE_BYTESWAP:
+00f307 ff02 .dw $ff02
+00f308 3c3e .db "><"
+00f309 f2eb .dw VE_HEAD
+ .set VE_HEAD = VE_BYTESWAP
+ XT_BYTESWAP:
+00f30a f30b .dw PFA_BYTESWAP
+ PFA_BYTESWAP:
+00f30b 2f09 mov temp0, tosh
+00f30c 2f98 mov tosh, tosl
+00f30d 2f80 mov tosl, temp0
+00f30e ccf5 jmp_ DO_NEXT
+ .include "words/up.asm"
+
+ ; System Variable
+ ; get user area pointer
+ VE_UP_FETCH:
+00f30f ff03 .dw $ff03
+00f310 7075
+00f311 0040 .db "up@",0
+00f312 f307 .dw VE_HEAD
+ .set VE_HEAD = VE_UP_FETCH
+ XT_UP_FETCH:
+00f313 f314 .dw PFA_UP_FETCH
+ PFA_UP_FETCH:
+00f314 939a
+00f315 938a savetos
+00f316 01c2 movw tosl, upl
+00f317 ccec jmp_ DO_NEXT
+
+ ; ( addr -- )
+ ; System Variable
+ ; set user area pointer
+ VE_UP_STORE:
+00f318 ff03 .dw $ff03
+00f319 7075
+00f31a 0021 .db "up!",0
+00f31b f30f .dw VE_HEAD
+ .set VE_HEAD = VE_UP_STORE
+ XT_UP_STORE:
+00f31c f31d .dw PFA_UP_STORE
+ PFA_UP_STORE:
+00f31d 012c movw upl, tosl
+00f31e 9189
+00f31f 9199 loadtos
+00f320 cce3 jmp_ DO_NEXT
+ .include "words/1ms.asm"
+
+ ; Time
+ ; busy waits (almost) exactly 1 millisecond
+ VE_1MS:
+00f321 ff03 .dw $ff03
+00f322 6d31
+00f323 0073 .db "1ms",0
+00f324 f318 .dw VE_HEAD
+ .set VE_HEAD = VE_1MS
+ XT_1MS:
+00f325 f326 .dw PFA_1MS
+ PFA_1MS:
+00f326 eae0
+00f327 e0ff
+00f328 9731
+00f329 f7f1 delay 1000
+00f32a ccd9 jmp_ DO_NEXT
+ .include "words/2to_r.asm"
+
+ ; Stack
+ ; move DTOS to TOR
+ VE_2TO_R:
+00f32b ff03 .dw $ff03
+00f32c 3e32
+00f32d 0072 .db "2>r",0
+00f32e f321 .dw VE_HEAD
+ .set VE_HEAD = VE_2TO_R
+ XT_2TO_R:
+00f32f f330 .dw PFA_2TO_R
+ PFA_2TO_R:
+00f330 01fc movw zl, tosl
+00f331 9189
+00f332 9199 loadtos
+00f333 939f push tosh
+00f334 938f push tosl
+00f335 93ff push zh
+00f336 93ef push zl
+00f337 9189
+00f338 9199 loadtos
+00f339 ccca jmp_ DO_NEXT
+ .include "words/2r_from.asm"
+
+ ; Stack
+ ; move DTOR to TOS
+ VE_2R_FROM:
+00f33a ff03 .dw $ff03
+00f33b 7232
+00f33c 003e .db "2r>",0
+00f33d f32b .dw VE_HEAD
+ .set VE_HEAD = VE_2R_FROM
+ XT_2R_FROM:
+00f33e f33f .dw PFA_2R_FROM
+ PFA_2R_FROM:
+00f33f 939a
+00f340 938a savetos
+00f341 91ef pop zl
+00f342 91ff pop zh
+00f343 918f pop tosl
+00f344 919f pop tosh
+00f345 939a
+00f346 938a savetos
+00f347 01cf movw tosl, zl
+00f348 ccbb jmp_ DO_NEXT
+
+ .include "words/store-e.asm"
+
+ ; Memory
+ ; write n (2bytes) to eeprom address
+ VE_STOREE:
+00f349 ff02 .dw $ff02
+00f34a 6521 .db "!e"
+00f34b f33a .dw VE_HEAD
+ .set VE_HEAD = VE_STOREE
+ XT_STOREE:
+00f34c f34d .dw PFA_STOREE
+ PFA_STOREE:
+ .if WANT_UNIFIED == 1
+ .endif
+ PFA_STOREE0:
+00f34d 01fc movw zl, tosl
+00f34e 9189
+00f34f 9199 loadtos
+00f350 b72f in_ temp2, SREG
+00f351 94f8 cli
+00f352 d028 rcall PFA_FETCHE2
+00f353 b500 in_ temp0, EEDR
+00f354 1708 cp temp0,tosl
+00f355 f009 breq PFA_STOREE3
+00f356 d00b rcall PFA_STOREE1
+ PFA_STOREE3:
+00f357 9631 adiw zl,1
+00f358 d022 rcall PFA_FETCHE2
+00f359 b500 in_ temp0, EEDR
+00f35a 1709 cp temp0,tosh
+00f35b f011 breq PFA_STOREE4
+00f35c 2f89 mov tosl, tosh
+00f35d d004 rcall PFA_STOREE1
+ PFA_STOREE4:
+00f35e bf2f out_ SREG, temp2
+00f35f 9189
+00f360 9199 loadtos
+00f361 cca2 jmp_ DO_NEXT
+
+ PFA_STOREE1:
+00f362 99f9 sbic EECR, EEPE
+00f363 cffe rjmp PFA_STOREE1
+
+ PFA_STOREE2: ; estore_wait_low_spm:
+00f364 b707 in_ temp0, SPMCSR
+00f365 fd00 sbrc temp0,SPMEN
+00f366 cffd rjmp PFA_STOREE2
+
+00f367 bdf2 out_ EEARH,zh
+00f368 bde1 out_ EEARL,zl
+00f369 bd80 out_ EEDR, tosl
+00f36a 9afa sbi EECR,EEMPE
+00f36b 9af9 sbi EECR,EEPE
+
+00f36c 9508 ret
+ .if WANT_UNIFIED == 1
+ .endif
+ .include "words/fetch-e.asm"
+
+ ; Memory
+ ; read 1 cell from eeprom
+ VE_FETCHE:
+00f36d ff02 .dw $ff02
+00f36e 6540 .db "@e"
+00f36f f349 .dw VE_HEAD
+ .set VE_HEAD = VE_FETCHE
+ XT_FETCHE:
+00f370 f371 .dw PFA_FETCHE
+ PFA_FETCHE:
+ .if WANT_UNIFIED == 1
+ .endif
+ PFA_FETCHE1:
+00f371 b72f in_ temp2, SREG
+00f372 94f8 cli
+00f373 01fc movw zl, tosl
+00f374 d006 rcall PFA_FETCHE2
+00f375 b580 in_ tosl, EEDR
+
+00f376 9631 adiw zl,1
+
+00f377 d003 rcall PFA_FETCHE2
+00f378 b590 in_ tosh, EEDR
+00f379 bf2f out_ SREG, temp2
+00f37a cc89 jmp_ DO_NEXT
+
+ PFA_FETCHE2:
+00f37b 99f9 sbic EECR, EEPE
+00f37c cffe rjmp PFA_FETCHE2
+
+00f37d bdf2 out_ EEARH,zh
+00f37e bde1 out_ EEARL,zl
+
+00f37f 9af8 sbi EECR,EERE
+00f380 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:
+00f381 ff02 .dw $ff02
+00f382 6921 .db "!i"
+00f383 f36d .dw VE_HEAD
+ .set VE_HEAD = VE_STOREI
+ XT_STOREI:
+00f384 fc2d .dw PFA_DODEFER1
+ PFA_STOREI:
+00f385 00a4 .dw EE_STOREI
+00f386 fbce .dw XT_EDEFERFETCH
+00f387 fbd8 .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:
+00f388 ff09 .dw $ff09
+00f389 2128
+00f38a 2d69
+00f38b 726e
+00f38c 7777
+00f38d 0029 .db "(!i-nrww)",0
+00f38e f381 .dw VE_HEAD
+ .set VE_HEAD = VE_DO_STOREI_NRWW
+ XT_DO_STOREI:
+00f38f f390 .dw PFA_DO_STOREI_NRWW
+ PFA_DO_STOREI_NRWW:
+ ; store status register
+00f390 b71f in temp1,SREG
+00f391 931f push temp1
+00f392 94f8 cli
+
+00f393 019c movw temp2, tosl ; save the (word) address
+00f394 9189
+00f395 9199 loadtos ; get the new value for the flash cell
+00f396 93af push xl
+00f397 93bf push xh
+00f398 93cf push yl
+00f399 93df push yh
+00f39a d009 rcall DO_STOREI_atmega
+00f39b 91df pop yh
+00f39c 91cf pop yl
+00f39d 91bf pop xh
+00f39e 91af pop xl
+ ; finally clear the stack
+00f39f 9189
+00f3a0 9199 loadtos
+00f3a1 911f pop temp1
+ ; restore status register (and interrupt enable flag)
+00f3a2 bf1f out SREG,temp1
+
+00f3a3 cc60 jmp_ DO_NEXT
+
+ ;
+ DO_STOREI_atmega:
+ ; write data to temp page buffer
+ ; use the values in tosl/tosh at the
+ ; appropiate place
+00f3a4 d010 rcall pageload
+
+ ; erase page if needed
+ ; it is needed if a bit goes from 0 to 1
+00f3a5 94e0 com temp4
+00f3a6 94f0 com temp5
+00f3a7 218e and tosl, temp4
+00f3a8 219f and tosh, temp5
+00f3a9 2b98 or tosh, tosl
+00f3aa f019 breq DO_STOREI_writepage
+00f3ab 01f9 movw zl, temp2
+00f3ac e002 ldi temp0,(1<<PGERS)
+00f3ad d023 rcall dospm
+
+ DO_STOREI_writepage:
+ ; write page
+00f3ae 01f9 movw zl, temp2
+00f3af e004 ldi temp0,(1<<PGWRT)
+00f3b0 d020 rcall dospm
+
+ ; reenable RWW section
+00f3b1 01f9 movw zl, temp2
+00f3b2 e100 ldi temp0,(1<<RWWSRE)
+00f3b3 d01d rcall dospm
+00f3b4 9508 ret
+
+ ; load the desired page
+ .equ pagemask = ~ ( PAGESIZE - 1 )
+ pageload:
+00f3b5 01f9 movw zl, temp2
+ ; get the beginning of page
+00f3b6 78e0 andi zl,low(pagemask)
+00f3b7 7fff andi zh,high(pagemask)
+00f3b8 01ef movw y, z
+ ; loop counter (in words)
+00f3b9 e8a0 ldi xl,low(pagesize)
+00f3ba e0b0 ldi xh,high(pagesize)
+ pageload_loop:
+ ; we need the current flash value anyways
+00f3bb 01fe movw z, y
+00f3bc 2755
+00f3bd 0fee
+00f3be 1fff
+00f3bf 1f55
+00f3c0 bf5b
+00f3c1 9147
+00f3c2 9157 readflashcell temp6, temp7 ; destroys Z
+ ; now check: if Z points to the same cell as temp2/3, we want the new data
+00f3c3 01fe movw z, y
+00f3c4 17e2 cp zl, temp2
+00f3c5 07f3 cpc zh, temp3
+00f3c6 f011 breq pageload_newdata
+00f3c7 010a movw r0, temp6
+00f3c8 c002 rjmp pageload_cont
+ pageload_newdata:
+00f3c9 017a movw temp4, temp6
+00f3ca 010c movw r0, tosl
+ pageload_cont:
+00f3cb 2700 clr temp0
+00f3cc d004 rcall dospm
+00f3cd 9621 adiw y, 1
+00f3ce 9711 sbiw x, 1
+00f3cf f759 brne pageload_loop
+
+ pageload_done:
+00f3d0 9508 ret
+
+
+ ;; dospm
+ ;;
+ ;; execute spm instruction
+ ;; temp0 holds the value for SPMCR
+
+ dospm:
+ dospm_wait_ee:
+00f3d1 99f9 sbic EECR, EEPE
+00f3d2 cffe rjmp dospm_wait_ee
+ dospm_wait_spm:
+00f3d3 b717 in_ temp1, SPMCSR
+00f3d4 fd10 sbrc temp1, SPMEN
+00f3d5 cffd rjmp dospm_wait_spm
+
+ ; turn the word addres into a byte address
+00f3d6 2755
+00f3d7 0fee
+00f3d8 1fff
+00f3d9 1f55
+00f3da bf5b writeflashcell
+ ; execute spm
+00f3db 6001 ori temp0, (1<<SPMEN)
+00f3dc bf07 out_ SPMCSR,temp0
+00f3dd 95e8 spm
+00f3de 9508 ret
+ .endif
+ .include "words/fetch-i.asm"
+
+ ; Memory
+ ; read 1 cell from flash
+ VE_FETCHI:
+00f3df ff02 .dw $ff02
+00f3e0 6940 .db "@i"
+00f3e1 f388 .dw VE_HEAD
+ .set VE_HEAD = VE_FETCHI
+ XT_FETCHI:
+00f3e2 f3e3 .dw PFA_FETCHI
+ PFA_FETCHI:
+00f3e3 01fc movw zl, tosl
+00f3e4 2755
+00f3e5 0fee
+00f3e6 1fff
+00f3e7 1f55
+00f3e8 bf5b
+00f3e9 9187
+00f3ea 9197 readflashcell tosl,tosh
+00f3eb 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:
+00f3ec ff03 .dw $ff03
+00f3ed 3e6e
+00f3ee 0072 .db "n>r",0
+00f3ef f3df .dw VE_HEAD
+ .set VE_HEAD = VE_N_TO_R
+ XT_N_TO_R:
+00f3f0 f3f1 .dw PFA_N_TO_R
+ PFA_N_TO_R:
+00f3f1 01fc movw zl, tosl
+00f3f2 2f08 mov temp0, tosl
+ PFA_N_TO_R1:
+00f3f3 9189
+00f3f4 9199 loadtos
+00f3f5 939f push tosh
+00f3f6 938f push tosl
+00f3f7 950a dec temp0
+00f3f8 f7d1 brne PFA_N_TO_R1
+00f3f9 93ef push zl
+00f3fa 93ff push zh
+00f3fb 9189
+00f3fc 9199 loadtos
+00f3fd cc06 jmp_ DO_NEXT
+ .include "words/n_r_from.asm"
+
+ ; Stack
+ ; move n items from return stack to data stack
+ VE_N_R_FROM:
+00f3fe ff03 .dw $ff03
+00f3ff 726e
+00f400 003e .db "nr>",0
+00f401 f3ec .dw VE_HEAD
+ .set VE_HEAD = VE_N_R_FROM
+ XT_N_R_FROM:
+00f402 f403 .dw PFA_N_R_FROM
+ PFA_N_R_FROM:
+00f403 939a
+00f404 938a savetos
+00f405 91ff pop zh
+00f406 91ef pop zl
+00f407 2f0e mov temp0, zl
+ PFA_N_R_FROM1:
+00f408 918f pop tosl
+00f409 919f pop tosh
+00f40a 939a
+00f40b 938a savetos
+00f40c 950a dec temp0
+00f40d f7d1 brne PFA_N_R_FROM1
+00f40e 01cf movw tosl, zl
+00f40f cbf4 jmp_ DO_NEXT
+
+ .include "words/d-2star.asm"
+
+ ; Arithmetics
+ ; shift a double cell left
+ VE_D2STAR:
+00f410 ff03 .dw $ff03
+00f411 3264
+00f412 002a .db "d2*",0
+00f413 f3fe .dw VE_HEAD
+ .set VE_HEAD = VE_D2STAR
+ XT_D2STAR:
+00f414 f415 .dw PFA_D2STAR
+ PFA_D2STAR:
+00f415 9109 ld temp0, Y+
+00f416 9119 ld temp1, Y+
+00f417 0f00 lsl temp0
+00f418 1f11 rol temp1
+00f419 1f88 rol tosl
+00f41a 1f99 rol tosh
+00f41b 931a st -Y, temp1
+00f41c 930a st -Y, temp0
+00f41d cbe6 jmp_ DO_NEXT
+ .include "words/d-2slash.asm"
+
+ ; Arithmetics
+ ; shift a double cell value right
+ VE_D2SLASH:
+00f41e ff03 .dw $ff03
+00f41f 3264
+00f420 002f .db "d2/",0
+00f421 f410 .dw VE_HEAD
+ .set VE_HEAD = VE_D2SLASH
+ XT_D2SLASH:
+00f422 f423 .dw PFA_D2SLASH
+ PFA_D2SLASH:
+00f423 9109 ld temp0, Y+
+00f424 9119 ld temp1, Y+
+00f425 9595 asr tosh
+00f426 9587 ror tosl
+00f427 9517 ror temp1
+00f428 9507 ror temp0
+00f429 931a st -Y, temp1
+00f42a 930a st -Y, temp0
+00f42b cbd8 jmp_ DO_NEXT
+ .include "words/d-plus.asm"
+
+ ; Arithmetics
+ ; add 2 double cell values
+ VE_DPLUS:
+00f42c ff02 .dw $ff02
+00f42d 2b64 .db "d+"
+00f42e f41e .dw VE_HEAD
+ .set VE_HEAD = VE_DPLUS
+ XT_DPLUS:
+00f42f f430 .dw PFA_DPLUS
+ PFA_DPLUS:
+00f430 9129 ld temp2, Y+
+00f431 9139 ld temp3, Y+
+
+00f432 90e9 ld temp4, Y+
+00f433 90f9 ld temp5, Y+
+00f434 9149 ld temp6, Y+
+00f435 9159 ld temp7, Y+
+
+00f436 0f24 add temp2, temp6
+00f437 1f35 adc temp3, temp7
+00f438 1d8e adc tosl, temp4
+00f439 1d9f adc tosh, temp5
+
+00f43a 933a st -Y, temp3
+00f43b 932a st -Y, temp2
+00f43c cbc7 jmp_ DO_NEXT
+ .include "words/d-minus.asm"
+
+ ; Arithmetics
+ ; subtract d2 from d1
+ VE_DMINUS:
+00f43d ff02 .dw $ff02
+00f43e 2d64 .db "d-"
+00f43f f42c .dw VE_HEAD
+ .set VE_HEAD = VE_DMINUS
+ XT_DMINUS:
+00f440 f441 .dw PFA_DMINUS
+ PFA_DMINUS:
+00f441 9129 ld temp2, Y+
+00f442 9139 ld temp3, Y+
+
+00f443 90e9 ld temp4, Y+
+00f444 90f9 ld temp5, Y+
+00f445 9149 ld temp6, Y+
+00f446 9159 ld temp7, Y+
+
+00f447 1b42 sub temp6, temp2
+00f448 0b53 sbc temp7, temp3
+00f449 0ae8 sbc temp4, tosl
+00f44a 0af9 sbc temp5, tosh
+
+00f44b 935a st -Y, temp7
+00f44c 934a st -Y, temp6
+00f44d 01c7 movw tosl, temp4
+00f44e cbb5 jmp_ DO_NEXT
+ .include "words/d-invert.asm"
+
+ ; Arithmetics
+ ; invert all bits in the double cell value
+ VE_DINVERT:
+00f44f ff07 .dw $ff07
+00f450 6964
+00f451 766e
+00f452 7265
+00f453 0074 .db "dinvert",0
+00f454 f43d .dw VE_HEAD
+ .set VE_HEAD = VE_DINVERT
+ XT_DINVERT:
+00f455 f456 .dw PFA_DINVERT
+ PFA_DINVERT:
+00f456 9109 ld temp0, Y+
+00f457 9119 ld temp1, Y+
+00f458 9580 com tosl
+00f459 9590 com tosh
+00f45a 9500 com temp0
+00f45b 9510 com temp1
+00f45c 931a st -Y, temp1
+00f45d 930a st -Y, temp0
+00f45e 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:
+00f45f ff02 .dw $ff02
+00f460 2e75 .db "u."
+00f461 f44f .dw VE_HEAD
+ .set VE_HEAD = VE_UDOT
+ XT_UDOT:
+00f462 f000 .dw DO_COLON
+ PFA_UDOT:
+ .endif
+00f463 f165 .dw XT_ZERO
+00f464 f744 .dw XT_UDDOT
+00f465 f025 .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:
+00f466 ff03 .dw $ff03
+00f467 2e75
+00f468 0072 .db "u.r",0
+00f469 f45f .dw VE_HEAD
+ .set VE_HEAD = VE_UDOTR
+ XT_UDOTR:
+00f46a f000 .dw DO_COLON
+ PFA_UDOTR:
+ .endif
+00f46b f165 .dw XT_ZERO
+00f46c f0d5 .dw XT_SWAP
+00f46d f74d .dw XT_UDDOTR
+00f46e f025 .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:
+00f46f ff0d .dw $ff0d
+00f470 6873
+00f471 776f
+00f472 772d
+00f473 726f
+00f474 6c64
+00f475 7369
+00f476 0074 .db "show-wordlist",0
+00f477 f466 .dw VE_HEAD
+ .set VE_HEAD = VE_SHOWWORDLIST
+ XT_SHOWWORDLIST:
+00f478 f000 .dw DO_COLON
+ PFA_SHOWWORDLIST:
+ .endif
+00f479 f045 .dw XT_DOLITERAL
+00f47a f47e .dw XT_SHOWWORD
+00f47b f0d5 .dw XT_SWAP
+00f47c fc71 .dw XT_TRAVERSEWORDLIST
+00f47d f025 .dw XT_EXIT
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ XT_SHOWWORD:
+00f47e f000 .dw DO_COLON
+ PFA_SHOWWORD:
+ .endif
+00f47f fc8c .dw XT_NAME2STRING
+00f480 f7ba .dw XT_ITYPE
+00f481 f7fc .dw XT_SPACE ; ( -- addr n)
+00f482 f15c .dw XT_TRUE
+00f483 f025 .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:
+00f484 ff05 .dw $ff05
+00f485 6f77
+00f486 6472
+00f487 0073 .db "words",0
+00f488 f46f .dw VE_HEAD
+ .set VE_HEAD = VE_WORDS
+ XT_WORDS:
+00f489 f000 .dw DO_COLON
+ PFA_WORDS:
+ .endif
+00f48a f045 .dw XT_DOLITERAL
+00f48b 008a .dw CFG_ORDERLISTLEN+2
+00f48c f370 .dw XT_FETCHE
+00f48d f478 .dw XT_SHOWWORDLIST
+00f48e f025 .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:
+00f48f ff04 .dw $ff04
+00f490 692b
+00f491 746e .db "+int"
+00f492 f484 .dw VE_HEAD
+ .set VE_HEAD = VE_INTON
+ XT_INTON:
+00f493 f494 .dw PFA_INTON
+ PFA_INTON:
+00f494 9478 sei
+00f495 cb6e jmp_ DO_NEXT
+ .include "words/int-off.asm"
+
+ ; Interrupt
+ ; turns off all interrupts
+ VE_INTOFF:
+00f496 ff04 .dw $ff04
+00f497 692d
+00f498 746e .db "-int"
+00f499 f48f .dw VE_HEAD
+ .set VE_HEAD = VE_INTOFF
+ XT_INTOFF:
+00f49a f49b .dw PFA_INTOFF
+ PFA_INTOFF:
+00f49b 94f8 cli
+00f49c cb67 jmp_ DO_NEXT
+ .include "words/int-store.asm"
+
+ ; Interrupt
+ ; stores XT as interrupt vector i
+ VE_INTSTORE:
+00f49d ff04 .dw $ff04
+00f49e 6e69
+00f49f 2174 .db "int!"
+00f4a0 f496 .dw VE_HEAD
+ .set VE_HEAD = VE_INTSTORE
+ XT_INTSTORE:
+00f4a1 f000 .dw DO_COLON
+ PFA_INTSTORE:
+00f4a2 f045 .dw XT_DOLITERAL
+00f4a3 0000 .dw intvec
+00f4a4 f1ae .dw XT_PLUS
+00f4a5 f34c .dw XT_STOREE
+00f4a6 f025 .dw XT_EXIT
+ .include "words/int-fetch.asm"
+
+ ; Interrupt
+ ; fetches XT from interrupt vector i
+ VE_INTFETCH:
+00f4a7 ff04 .dw $ff04
+00f4a8 6e69
+00f4a9 4074 .db "int@"
+00f4aa f49d .dw VE_HEAD
+ .set VE_HEAD = VE_INTFETCH
+ XT_INTFETCH:
+00f4ab f000 .dw DO_COLON
+ PFA_INTFETCH:
+00f4ac f045 .dw XT_DOLITERAL
+00f4ad 0000 .dw intvec
+00f4ae f1ae .dw XT_PLUS
+00f4af f370 .dw XT_FETCHE
+00f4b0 f025 .dw XT_EXIT
+ .include "words/int-trap.asm"
+
+ ; Interrupt
+ ; trigger an interrupt
+ VE_INTTRAP:
+00f4b1 ff08 .dw $ff08
+00f4b2 6e69
+00f4b3 2d74
+00f4b4 7274
+00f4b5 7061 .db "int-trap"
+00f4b6 f4a7 .dw VE_HEAD
+ .set VE_HEAD = VE_INTTRAP
+ XT_INTTRAP:
+00f4b7 f4b8 .dw PFA_INTTRAP
+ PFA_INTTRAP:
+00f4b8 2eb8 mov isrflag, tosl
+00f4b9 9189
+00f4ba 9199 loadtos
+00f4bb 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:
+00f4bc f000 .dw DO_COLON
+ PFA_ISREXEC:
+00f4bd f4ab .dw XT_INTFETCH
+00f4be f02f .dw XT_EXECUTE
+00f4bf f4c1 .dw XT_ISREND
+00f4c0 f025 .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:
+00f4c1 f4c2 .dw PFA_ISREND
+ PFA_ISREND:
+00f4c2 d001 rcall PFA_ISREND1 ; clear the interrupt flag for the controller
+00f4c3 cb40 jmp_ DO_NEXT
+ PFA_ISREND1:
+00f4c4 9518 reti
+ .endif
+
+ .include "words/pick.asm"
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_PICK:
+00f4c5 ff04 .dw $ff04
+00f4c6 6970
+00f4c7 6b63 .db "pick"
+00f4c8 f4b1 .dw VE_HEAD
+ .set VE_HEAD = VE_PICK
+ XT_PICK:
+00f4c9 f000 .dw DO_COLON
+ PFA_PICK:
+ .endif
+00f4ca f240 .dw XT_1PLUS
+00f4cb f572 .dw XT_CELLS
+00f4cc f29e .dw XT_SP_FETCH
+00f4cd f1ae .dw XT_PLUS
+00f4ce f08a .dw XT_FETCH
+00f4cf f025 .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:
+00f4d0 0002 .dw $0002
+00f4d1 222e .db ".",$22
+00f4d2 f4c5 .dw VE_HEAD
+ .set VE_HEAD = VE_DOTSTRING
+ XT_DOTSTRING:
+00f4d3 f000 .dw DO_COLON
+ PFA_DOTSTRING:
+ .endif
+00f4d4 f4db .dw XT_SQUOTE
+00f4d5 01fb .dw XT_COMPILE
+00f4d6 f7ba .dw XT_ITYPE
+00f4d7 f025 .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:
+00f4d8 0002 .dw $0002
+00f4d9 2273 .db "s",$22
+00f4da f4d0 .dw VE_HEAD
+ .set VE_HEAD = VE_SQUOTE
+ XT_SQUOTE:
+00f4db f000 .dw DO_COLON
+ PFA_SQUOTE:
+ .endif
+00f4dc f045 .dw XT_DOLITERAL
+00f4dd 0022 .dw 34 ; 0x22
+00f4de f9a1 .dw XT_PARSE ; ( -- addr n)
+00f4df f565 .dw XT_STATE
+00f4e0 f08a .dw XT_FETCH
+00f4e1 f03e .dw XT_DOCONDBRANCH
+00f4e2 f4e4 DEST(PFA_SQUOTE1)
+00f4e3 0227 .dw XT_SLITERAL
+ PFA_SQUOTE1:
+00f4e4 f025 .dw XT_EXIT
+
+ .include "words/fill.asm"
+
+ ; Memory
+ ; fill u bytes memory beginning at a-addr with character c
+ VE_FILL:
+00f4e5 ff04 .dw $ff04
+00f4e6 6966
+00f4e7 6c6c .db "fill"
+00f4e8 f4d8 .dw VE_HEAD
+ .set VE_HEAD = VE_FILL
+ XT_FILL:
+00f4e9 f000 .dw DO_COLON
+ PFA_FILL:
+00f4ea f0f2 .dw XT_ROT
+00f4eb f0f2 .dw XT_ROT
+00f4ec f0ca
+00f4ed f03e .dw XT_QDUP,XT_DOCONDBRANCH
+00f4ee f4f6 DEST(PFA_FILL2)
+00f4ef fd89 .dw XT_BOUNDS
+00f4f0 f2ac .dw XT_DODO
+ PFA_FILL1:
+00f4f1 f0c2 .dw XT_DUP
+00f4f2 f2bd .dw XT_I
+00f4f3 f09e .dw XT_CSTORE ; ( -- c c-addr)
+00f4f4 f2da .dw XT_DOLOOP
+00f4f5 f4f1 .dw PFA_FILL1
+ PFA_FILL2:
+00f4f6 f0ea .dw XT_DROP
+00f4f7 f025 .dw XT_EXIT
+
+ .include "words/environment.asm"
+
+ ; System Value
+ ; word list identifier of the environmental search list
+ VE_ENVIRONMENT:
+00f4f8 ff0b .dw $ff0b
+00f4f9 6e65
+00f4fa 6976
+00f4fb 6f72
+00f4fc 6d6e
+00f4fd 6e65
+00f4fe 0074 .db "environment",0
+00f4ff f4e5 .dw VE_HEAD
+ .set VE_HEAD = VE_ENVIRONMENT
+ XT_ENVIRONMENT:
+00f500 f053 .dw PFA_DOVARIABLE
+ PFA_ENVIRONMENT:
+00f501 0082 .dw CFG_ENVIRONMENT
+ .include "words/env-wordlists.asm"
+
+ ; Environment
+ ; maximum number of wordlists in the dictionary search order
+ VE_ENVWORDLISTS:
+00f502 ff09 .dw $ff09
+00f503 6f77
+00f504 6472
+00f505 696c
+00f506 7473
+00f507 0073 .db "wordlists",0
+00f508 0000 .dw VE_ENVHEAD
+ .set VE_ENVHEAD = VE_ENVWORDLISTS
+ XT_ENVWORDLISTS:
+00f509 f000 .dw DO_COLON
+ PFA_ENVWORDLISTS:
+00f50a f045 .dw XT_DOLITERAL
+00f50b 0008 .dw NUMWORDLISTS
+00f50c f025 .dw XT_EXIT
+ .include "words/env-slashpad.asm"
+
+ ; Environment
+ ; Size of the PAD buffer in bytes
+ VE_ENVSLASHPAD:
+00f50d ff04 .dw $ff04
+00f50e 702f
+00f50f 6461 .db "/pad"
+00f510 f502 .dw VE_ENVHEAD
+ .set VE_ENVHEAD = VE_ENVSLASHPAD
+ XT_ENVSLASHPAD:
+00f511 f000 .dw DO_COLON
+ PFA_ENVSLASHPAD:
+00f512 f29e .dw XT_SP_FETCH
+00f513 f59e .dw XT_PAD
+00f514 f1a4 .dw XT_MINUS
+00f515 f025 .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:
+00f516 ff05 .dw $ff05
+00f517 682f
+00f518 6c6f
+00f519 0064 .db "/hold",0
+00f51a f50d .dw VE_ENVHEAD
+ .set VE_ENVHEAD = VE_ENVSLASHHOLD
+ XT_ENVSLASHHOLD:
+00f51b f000 .dw DO_COLON
+ PFA_ENVSLASHHOLD:
+ .endif
+00f51c f59e .dw XT_PAD
+00f51d f5d9 .dw XT_HERE
+00f51e f1a4 .dw XT_MINUS
+00f51f f025 .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:
+00f520 ff0a .dw $ff0a
+00f521 6f66
+00f522 7472
+00f523 2d68
+00f524 616e
+00f525 656d .db "forth-name"
+00f526 f516 .dw VE_ENVHEAD
+ .set VE_ENVHEAD = VE_ENV_FORTHNAME
+ XT_ENV_FORTHNAME:
+00f527 f000 .dw DO_COLON
+ PFA_EN_FORTHNAME:
+00f528 f787 .dw XT_DOSLITERAL
+00f529 0007 .dw 7
+ .endif
+00f52a 6d61
+00f52b 6f66
+00f52c 7472
+../../common\words/env-forthname.asm(22): warning: .cseg .db misalignment - padding zero byte
+00f52d 0068 .db "amforth"
+ .if cpu_msp430==1
+ .endif
+00f52e f025 .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:
+00f52f ff07 .dw $ff07
+00f530 6576
+00f531 7372
+00f532 6f69
+00f533 006e .db "version",0
+00f534 f520 .dw VE_ENVHEAD
+ .set VE_ENVHEAD = VE_ENV_FORTHVERSION
+ XT_ENV_FORTHVERSION:
+00f535 f000 .dw DO_COLON
+ PFA_EN_FORTHVERSION:
+ .endif
+00f536 f045 .dw XT_DOLITERAL
+00f537 0041 .dw 65
+00f538 f025 .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:
+00f539 ff03 .dw $ff03
+00f53a 7063
+00f53b 0075 .db "cpu",0
+00f53c f52f .dw VE_ENVHEAD
+ .set VE_ENVHEAD = VE_ENV_CPU
+ XT_ENV_CPU:
+00f53d f000 .dw DO_COLON
+ PFA_EN_CPU:
+ .endif
+00f53e f045 .dw XT_DOLITERAL
+00f53f 0075 .dw mcu_name
+00f540 f7e6 .dw XT_ICOUNT
+00f541 f025 .dw XT_EXIT
+ .include "words/env-mcuinfo.asm"
+
+ ; Environment
+ ; flash address of some CPU specific parameters
+ VE_ENV_MCUINFO:
+00f542 ff08 .dw $ff08
+00f543 636d
+00f544 2d75
+00f545 6e69
+00f546 6f66 .db "mcu-info"
+00f547 f539 .dw VE_ENVHEAD
+ .set VE_ENVHEAD = VE_ENV_MCUINFO
+ XT_ENV_MCUINFO:
+00f548 f000 .dw DO_COLON
+ PFA_EN_MCUINFO:
+00f549 f045 .dw XT_DOLITERAL
+00f54a 0071 .dw mcu_info
+00f54b f025 .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:
+00f54c ff05 .dw $ff05
+00f54d 752f
+00f54e 6573
+00f54f 0072 .db "/user",0
+00f550 f542 .dw VE_ENVHEAD
+ .set VE_ENVHEAD = VE_ENVUSERSIZE
+ XT_ENVUSERSIZE:
+00f551 f000 .dw DO_COLON
+ PFA_ENVUSERSIZE:
+ .endif
+00f552 f045 .dw XT_DOLITERAL
+00f553 002c .dw SYSUSERSIZE + APPUSERSIZE
+00f554 f025 .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:
+00f555 ff05 .dw $ff05
+00f556 5f66
+00f557 7063
+00f558 0075 .db "f_cpu",0
+00f559 f4f8 .dw VE_HEAD
+ .set VE_HEAD = VE_F_CPU
+ XT_F_CPU:
+00f55a f000 .dw DO_COLON
+ PFA_F_CPU:
+ .endif
+00f55b f045 .dw XT_DOLITERAL
+00f55c 2400 .dw (F_CPU % 65536)
+00f55d f045 .dw XT_DOLITERAL
+00f55e 00f4 .dw (F_CPU / 65536)
+00f55f f025 .dw XT_EXIT
+ .include "words/state.asm"
+
+ ; System Variable
+ ; system state
+ VE_STATE:
+00f560 ff05 .dw $ff05
+00f561 7473
+00f562 7461
+00f563 0065 .db "state",0
+00f564 f555 .dw VE_HEAD
+ .set VE_HEAD = VE_STATE
+ XT_STATE:
+00f565 f053 .dw PFA_DOVARIABLE
+ PFA_STATE:
+00f566 0253 .dw ram_state
+
+ .dseg
+000253 ram_state: .byte 2
+ .include "words/base.asm"
+
+ ; Numeric IO
+ ; location of the cell containing the number conversion radix
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_BASE:
+00f567 ff04 .dw $ff04
+00f568 6162
+00f569 6573 .db "base"
+00f56a f560 .dw VE_HEAD
+ .set VE_HEAD = VE_BASE
+ XT_BASE:
+00f56b f066 .dw PFA_DOUSER
+ PFA_BASE:
+ .endif
+00f56c 000c .dw USER_BASE
+
+ .include "words/cells.asm"
+
+ ; Arithmetics
+ ; n2 is the size in address units of n1 cells
+ VE_CELLS:
+00f56d ff05 .dw $ff05
+00f56e 6563
+00f56f 6c6c
+00f570 0073 .db "cells",0
+00f571 f567 .dw VE_HEAD
+ .set VE_HEAD = VE_CELLS
+ XT_CELLS:
+00f572 f21d .dw PFA_2STAR
+ .include "words/cellplus.asm"
+
+ ; Arithmetics
+ ; add the size of an address-unit to a-addr1
+ VE_CELLPLUS:
+00f573 ff05 .dw $ff05
+00f574 6563
+00f575 6c6c
+00f576 002b .db "cell+",0
+00f577 f56d .dw VE_HEAD
+ .set VE_HEAD = VE_CELLPLUS
+ XT_CELLPLUS:
+00f578 f579 .dw PFA_CELLPLUS
+ PFA_CELLPLUS:
+00f579 9602 adiw tosl, CELLSIZE
+00f57a 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:
+00f57b ff04 .dw $ff04
+00f57c 6432
+00f57d 7075 .db "2dup"
+00f57e f573 .dw VE_HEAD
+ .set VE_HEAD = VE_2DUP
+ XT_2DUP:
+00f57f f000 .dw DO_COLON
+ PFA_2DUP:
+ .endif
+
+00f580 f0e0 .dw XT_OVER
+00f581 f0e0 .dw XT_OVER
+00f582 f025 .dw XT_EXIT
+ .include "words/2drop.asm"
+
+ ; Stack
+ ; Remove the 2 top elements
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_2DROP:
+00f583 ff05 .dw $ff05
+00f584 6432
+00f585 6f72
+00f586 0070 .db "2drop",0
+00f587 f57b .dw VE_HEAD
+ .set VE_HEAD = VE_2DROP
+ XT_2DROP:
+00f588 f000 .dw DO_COLON
+ PFA_2DROP:
+ .endif
+00f589 f0ea .dw XT_DROP
+00f58a f0ea .dw XT_DROP
+00f58b f025 .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:
+00f58c ff04 .dw $ff04
+00f58d 7574
+00f58e 6b63 .db "tuck"
+00f58f f583 .dw VE_HEAD
+ .set VE_HEAD = VE_TUCK
+ XT_TUCK:
+00f590 f000 .dw DO_COLON
+ PFA_TUCK:
+ .endif
+00f591 f0d5 .dw XT_SWAP
+00f592 f0e0 .dw XT_OVER
+00f593 f025 .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:
+00f594 ff03 .dw $ff03
+00f595 693e
+00f596 006e .db ">in",0
+00f597 f58c .dw VE_HEAD
+ .set VE_HEAD = VE_TO_IN
+ XT_TO_IN:
+00f598 f066 .dw PFA_DOUSER
+ PFA_TO_IN:
+ .endif
+00f599 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:
+00f59a ff03 .dw $ff03
+00f59b 6170
+00f59c 0064 .db "pad",0
+00f59d f594 .dw VE_HEAD
+ .set VE_HEAD = VE_PAD
+ XT_PAD:
+00f59e f000 .dw DO_COLON
+ PFA_PAD:
+ .endif
+00f59f f5d9 .dw XT_HERE
+00f5a0 f045 .dw XT_DOLITERAL
+00f5a1 0028 .dw 40
+00f5a2 f1ae .dw XT_PLUS
+00f5a3 f025 .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:
+00f5a4 ff04 .dw $ff04
+00f5a5 6d65
+00f5a6 7469 .db "emit"
+00f5a7 f59a .dw VE_HEAD
+ .set VE_HEAD = VE_EMIT
+ XT_EMIT:
+00f5a8 fc2d .dw PFA_DODEFER1
+ PFA_EMIT:
+ .endif
+00f5a9 000e .dw USER_EMIT
+00f5aa fbf6 .dw XT_UDEFERFETCH
+00f5ab fc02 .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:
+00f5ac ff05 .dw $ff05
+00f5ad 6d65
+00f5ae 7469
+00f5af 003f .db "emit?",0
+00f5b0 f5a4 .dw VE_HEAD
+ .set VE_HEAD = VE_EMITQ
+ XT_EMITQ:
+00f5b1 fc2d .dw PFA_DODEFER1
+ PFA_EMITQ:
+ .endif
+00f5b2 0010 .dw USER_EMITQ
+00f5b3 fbf6 .dw XT_UDEFERFETCH
+00f5b4 fc02 .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:
+00f5b5 ff03 .dw $ff03
+00f5b6 656b
+00f5b7 0079 .db "key",0
+00f5b8 f5ac .dw VE_HEAD
+ .set VE_HEAD = VE_KEY
+ XT_KEY:
+00f5b9 fc2d .dw PFA_DODEFER1
+ PFA_KEY:
+ .endif
+00f5ba 0012 .dw USER_KEY
+00f5bb fbf6 .dw XT_UDEFERFETCH
+00f5bc fc02 .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:
+00f5bd ff04 .dw $ff04
+00f5be 656b
+00f5bf 3f79 .db "key?"
+00f5c0 f5b5 .dw VE_HEAD
+ .set VE_HEAD = VE_KEYQ
+ XT_KEYQ:
+00f5c1 fc2d .dw PFA_DODEFER1
+ PFA_KEYQ:
+ .endif
+00f5c2 0014 .dw USER_KEYQ
+00f5c3 fbf6 .dw XT_UDEFERFETCH
+00f5c4 fc02 .dw XT_UDEFERSTORE
+
+ .include "words/dp.asm"
+
+ ; System Value
+ ; address of the next free dictionary cell
+ VE_DP:
+00f5c5 ff02 .dw $ff02
+00f5c6 7064 .db "dp"
+00f5c7 f5bd .dw VE_HEAD
+ .set VE_HEAD = VE_DP
+ XT_DP:
+00f5c8 f080 .dw PFA_DOVALUE1
+ PFA_DP:
+00f5c9 0074 .dw CFG_DP
+00f5ca fbce .dw XT_EDEFERFETCH
+00f5cb fbd8 .dw XT_EDEFERSTORE
+ .include "words/ehere.asm"
+
+ ; System Value
+ ; address of the next free address in eeprom
+ VE_EHERE:
+00f5cc ff05 .dw $ff05
+00f5cd 6865
+00f5ce 7265
+00f5cf 0065 .db "ehere",0
+00f5d0 f5c5 .dw VE_HEAD
+ .set VE_HEAD = VE_EHERE
+ XT_EHERE:
+00f5d1 f080 .dw PFA_DOVALUE1
+ PFA_EHERE:
+00f5d2 0078 .dw EE_EHERE
+00f5d3 fbce .dw XT_EDEFERFETCH
+00f5d4 fbd8 .dw XT_EDEFERSTORE
+ .include "words/here.asm"
+
+ ; System Value
+ ; address of the next free data space (RAM) cell
+ VE_HERE:
+00f5d5 ff04 .dw $ff04
+00f5d6 6568
+00f5d7 6572 .db "here"
+00f5d8 f5cc .dw VE_HEAD
+ .set VE_HEAD = VE_HERE
+ XT_HERE:
+00f5d9 f080 .dw PFA_DOVALUE1
+ PFA_HERE:
+00f5da 0076 .dw EE_HERE
+00f5db fbce .dw XT_EDEFERFETCH
+00f5dc fbd8 .dw XT_EDEFERSTORE
+ .include "words/allot.asm"
+
+ ; System
+ ; allocate or release memory in RAM
+ VE_ALLOT:
+00f5dd ff05 .dw $ff05
+00f5de 6c61
+00f5df 6f6c
+00f5e0 0074 .db "allot",0
+00f5e1 f5d5 .dw VE_HEAD
+ .set VE_HEAD = VE_ALLOT
+ XT_ALLOT:
+00f5e2 f000 .dw DO_COLON
+ PFA_ALLOT:
+00f5e3 f5d9 .dw XT_HERE
+00f5e4 f1ae .dw XT_PLUS
+00f5e5 fbb3 .dw XT_DOTO
+00f5e6 f5da .dw PFA_HERE
+00f5e7 f025 .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:
+00f5e8 ff03 .dw $ff03
+00f5e9 6962
+00f5ea 006e .db "bin",0
+00f5eb f5dd .dw VE_HEAD
+ .set VE_HEAD = VE_BIN
+ XT_BIN:
+00f5ec f000 .dw DO_COLON
+ PFA_BIN:
+ .endif
+00f5ed fdb6 .dw XT_TWO
+00f5ee f56b .dw XT_BASE
+00f5ef f092 .dw XT_STORE
+00f5f0 f025 .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:
+00f5f1 ff07 .dw $ff07
+00f5f2 6564
+00f5f3 6963
+00f5f4 616d
+00f5f5 006c .db "decimal",0
+00f5f6 f5e8 .dw VE_HEAD
+ .set VE_HEAD = VE_DECIMAL
+ XT_DECIMAL:
+00f5f7 f000 .dw DO_COLON
+ PFA_DECIMAL:
+ .endif
+00f5f8 f045 .dw XT_DOLITERAL
+00f5f9 000a .dw 10
+00f5fa f56b .dw XT_BASE
+00f5fb f092 .dw XT_STORE
+00f5fc f025 .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:
+00f5fd ff03 .dw $ff03
+00f5fe 6568
+00f5ff 0078 .db "hex",0
+00f600 f5f1 .dw VE_HEAD
+ .set VE_HEAD = VE_HEX
+ XT_HEX:
+00f601 f000 .dw DO_COLON
+ PFA_HEX:
+ .endif
+00f602 f045 .dw XT_DOLITERAL
+00f603 0010 .dw 16
+00f604 f56b .dw XT_BASE
+00f605 f092 .dw XT_STORE
+00f606 f025 .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:
+00f607 ff02 .dw $ff02
+00f608 6c62 .db "bl"
+00f609 f5fd .dw VE_HEAD
+ .set VE_HEAD = VE_BL
+ XT_BL:
+00f60a f053 .dw PFA_DOVARIABLE
+ PFA_BL:
+ .endif
+00f60b 0020 .dw 32
+
+ .include "words/turnkey.asm"
+
+ ; System Value
+ ; Deferred action during startup/reset
+ VE_TURNKEY:
+00f60c ff07 .dw $ff07
+00f60d 7574
+00f60e 6e72
+00f60f 656b
+00f610 0079 .db "turnkey",0
+00f611 f607 .dw VE_HEAD
+ .set VE_HEAD = VE_TURNKEY
+ XT_TURNKEY:
+00f612 fc2d .dw PFA_DODEFER1
+ PFA_TURNKEY:
+00f613 0080 .dw CFG_TURNKEY
+00f614 fbce .dw XT_EDEFERFETCH
+00f615 fbd8 .dw XT_EDEFERSTORE
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+ .include "words/slashmod.asm"
+
+ ; Arithmetics
+ ; signed division n1/n2 with remainder and quotient
+ VE_SLASHMOD:
+00f616 ff04 .dw $ff04
+00f617 6d2f
+00f618 646f .db "/mod"
+00f619 f60c .dw VE_HEAD
+ .set VE_HEAD = VE_SLASHMOD
+ XT_SLASHMOD:
+00f61a f61b .dw PFA_SLASHMOD
+ PFA_SLASHMOD:
+00f61b 019c movw temp2, tosl
+
+00f61c 9109 ld temp0, Y+
+00f61d 9119 ld temp1, Y+
+
+00f61e 2f41 mov temp6,temp1 ;move dividend High to sign register
+00f61f 2743 eor temp6,temp3 ;xor divisor High with sign register
+00f620 ff17 sbrs temp1,7 ;if MSB in dividend set
+00f621 c004 rjmp PFA_SLASHMOD_1
+00f622 9510 com temp1 ; change sign of dividend
+00f623 9500 com temp0
+00f624 5f0f subi temp0,low(-1)
+00f625 4f1f sbci temp1,high(-1)
+ PFA_SLASHMOD_1:
+00f626 ff37 sbrs temp3,7 ;if MSB in divisor set
+00f627 c004 rjmp PFA_SLASHMOD_2
+00f628 9530 com temp3 ; change sign of divisor
+00f629 9520 com temp2
+00f62a 5f2f subi temp2,low(-1)
+00f62b 4f3f sbci temp3,high(-1)
+00f62c 24ee PFA_SLASHMOD_2: clr temp4 ;clear remainder Low byte
+00f62d 18ff sub temp5,temp5;clear remainder High byte and carry
+00f62e e151 ldi temp7,17 ;init loop counter
+
+00f62f 1f00 PFA_SLASHMOD_3: rol temp0 ;shift left dividend
+00f630 1f11 rol temp1
+00f631 955a dec temp7 ;decrement counter
+00f632 f439 brne PFA_SLASHMOD_5 ;if done
+00f633 ff47 sbrs temp6,7 ; if MSB in sign register set
+00f634 c004 rjmp PFA_SLASHMOD_4
+00f635 9510 com temp1 ; change sign of result
+00f636 9500 com temp0
+00f637 5f0f subi temp0,low(-1)
+00f638 4f1f sbci temp1,high(-1)
+00f639 c00b PFA_SLASHMOD_4: rjmp PFA_SLASHMODmod_done ; return
+00f63a 1cee PFA_SLASHMOD_5: rol temp4 ;shift dividend into remainder
+00f63b 1cff rol temp5
+00f63c 1ae2 sub temp4,temp2 ;remainder = remainder - divisor
+00f63d 0af3 sbc temp5,temp3 ;
+00f63e f420 brcc PFA_SLASHMOD_6 ;if result negative
+00f63f 0ee2 add temp4,temp2 ; restore remainder
+00f640 1ef3 adc temp5,temp3
+00f641 9488 clc ; clear carry to be shifted into result
+00f642 cfec rjmp PFA_SLASHMOD_3 ;else
+00f643 9408 PFA_SLASHMOD_6: sec ; set carry to be shifted into result
+00f644 cfea rjmp PFA_SLASHMOD_3
+
+ PFA_SLASHMODmod_done:
+ ; put remainder on stack
+00f645 92fa st -Y,temp5
+00f646 92ea st -Y,temp4
+
+ ; put quotient on stack
+00f647 01c8 movw tosl, temp0
+00f648 c9bb jmp_ DO_NEXT
+ .include "words/uslashmod.asm"
+
+ ; Arithmetics
+ ; unsigned division with remainder
+ VE_USLASHMOD:
+00f649 ff05 .dw $ff05
+00f64a 2f75
+00f64b 6f6d
+00f64c 0064 .db "u/mod",0
+00f64d f616 .dw VE_HEAD
+ .set VE_HEAD = VE_USLASHMOD
+ XT_USLASHMOD:
+00f64e f000 .dw DO_COLON
+ PFA_USLASHMOD:
+00f64f f110 .dw XT_TO_R
+00f650 f165 .dw XT_ZERO
+00f651 f107 .dw XT_R_FROM
+00f652 f1d3 .dw XT_UMSLASHMOD
+00f653 f025 .dw XT_EXIT
+ .include "words/negate.asm"
+
+ ; Logic
+ ; 2-complement
+ VE_NEGATE:
+00f654 ff06 .dw $ff06
+00f655 656e
+00f656 6167
+00f657 6574 .db "negate"
+00f658 f649 .dw VE_HEAD
+ .set VE_HEAD = VE_NEGATE
+ XT_NEGATE:
+00f659 f000 .dw DO_COLON
+ PFA_NEGATE:
+00f65a f20e .dw XT_INVERT
+00f65b f240 .dw XT_1PLUS
+00f65c f025 .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:
+00f65d ff01 .dw $ff01
+00f65e 002f .db "/",0
+00f65f f654 .dw VE_HEAD
+ .set VE_HEAD = VE_SLASH
+ XT_SLASH:
+00f660 f000 .dw DO_COLON
+ PFA_SLASH:
+ .endif
+00f661 f61a .dw XT_SLASHMOD
+00f662 f101 .dw XT_NIP
+00f663 f025 .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:
+00f664 ff03 .dw $ff03
+00f665 6f6d
+00f666 0064 .db "mod",0
+00f667 f65d .dw VE_HEAD
+ .set VE_HEAD = VE_MOD
+ XT_MOD:
+00f668 f000 .dw DO_COLON
+ PFA_MOD:
+ .endif
+00f669 f61a .dw XT_SLASHMOD
+00f66a f0ea .dw XT_DROP
+00f66b f025 .dw XT_EXIT
+ .include "words/abs.asm"
+
+ ; DUP ?NEGATE ;
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_ABS:
+00f66c ff03 .dw $ff03
+00f66d 6261
+00f66e 0073 .db "abs",0
+00f66f f664 .dw VE_HEAD
+ .set VE_HEAD = VE_ABS
+ XT_ABS:
+00f670 f000 .dw DO_COLON
+ PFA_ABS:
+
+ .endif
+
+00f671 f0c2
+00f672 f24f
+00f673 f025 .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:
+00f674 ff03 .dw $ff03
+00f675 696d
+00f676 006e .db "min",0
+00f677 f66c .dw VE_HEAD
+ .set VE_HEAD = VE_MIN
+ XT_MIN:
+00f678 f000 .dw DO_COLON
+ PFA_MIN:
+ .endif
+00f679 f57f .dw XT_2DUP
+00f67a f189 .dw XT_GREATER
+00f67b f03e .dw XT_DOCONDBRANCH
+00f67c f67e DEST(PFA_MIN1)
+00f67d f0d5 .dw XT_SWAP
+ PFA_MIN1:
+00f67e f0ea .dw XT_DROP
+00f67f f025 .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:
+00f680 ff03 .dw $ff03
+00f681 616d
+00f682 0078 .db "max",0
+00f683 f674 .dw VE_HEAD
+ .set VE_HEAD = VE_MAX
+ XT_MAX:
+00f684 f000 .dw DO_COLON
+ PFA_MAX:
+
+ .endif
+00f685 f57f .dw XT_2DUP
+00f686 f17f .dw XT_LESS
+00f687 f03e .dw XT_DOCONDBRANCH
+00f688 f68a DEST(PFA_MAX1)
+00f689 f0d5 .dw XT_SWAP
+ PFA_MAX1:
+00f68a f0ea .dw XT_DROP
+00f68b f025 .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:
+00f68c ff06 .dw $ff06
+00f68d 6977
+00f68e 6874
+00f68f 6e69 .db "within"
+00f690 f680 .dw VE_HEAD
+ .set VE_HEAD = VE_WITHIN
+ XT_WITHIN:
+00f691 f000 .dw DO_COLON
+ PFA_WITHIN:
+ .endif
+00f692 f0e0 .dw XT_OVER
+00f693 f1a4 .dw XT_MINUS
+00f694 f110 .dw XT_TO_R
+00f695 f1a4 .dw XT_MINUS
+00f696 f107 .dw XT_R_FROM
+00f697 f16d .dw XT_ULESS
+00f698 f025 .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:
+00f699 ff07 .dw $ff07
+00f69a 6f74
+00f69b 7075
+00f69c 6570
+00f69d 0072 .db "toupper",0
+00f69e f68c .dw VE_HEAD
+ .set VE_HEAD = VE_TOUPPER
+ XT_TOUPPER:
+00f69f f000 .dw DO_COLON
+ PFA_TOUPPER:
+ .endif
+00f6a0 f0c2 .dw XT_DUP
+00f6a1 f045 .dw XT_DOLITERAL
+00f6a2 0061 .dw 'a'
+00f6a3 f045 .dw XT_DOLITERAL
+00f6a4 007b .dw 'z'+1
+00f6a5 f691 .dw XT_WITHIN
+00f6a6 f03e .dw XT_DOCONDBRANCH
+00f6a7 f6ab DEST(PFA_TOUPPER0)
+00f6a8 f045 .dw XT_DOLITERAL
+00f6a9 00df .dw 223 ; inverse of 0x20: 0xdf
+00f6aa f224 .dw XT_AND
+ PFA_TOUPPER0:
+00f6ab f025 .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:
+00f6ac ff07 .dw $ff07
+00f6ad 6f74
+00f6ae 6f6c
+00f6af 6577
+00f6b0 0072 .db "tolower",0
+00f6b1 f699 .dw VE_HEAD
+ .set VE_HEAD = VE_TOLOWER
+ XT_TOLOWER:
+00f6b2 f000 .dw DO_COLON
+ PFA_TOLOWER:
+ .endif
+00f6b3 f0c2 .dw XT_DUP
+00f6b4 f045 .dw XT_DOLITERAL
+00f6b5 0041 .dw 'A'
+00f6b6 f045 .dw XT_DOLITERAL
+00f6b7 005b .dw 'Z'+1
+00f6b8 f691 .dw XT_WITHIN
+00f6b9 f03e .dw XT_DOCONDBRANCH
+00f6ba f6be DEST(PFA_TOLOWER0)
+00f6bb f045 .dw XT_DOLITERAL
+00f6bc 0020 .dw 32
+00f6bd f22d .dw XT_OR
+ PFA_TOLOWER0:
+00f6be f025 .dw XT_EXIT
+ ;;;;;;;;;;;;;;;;;;;;;;
+ .include "words/hld.asm"
+
+ ; Numeric IO
+ ; pointer to current write position in the Pictured Numeric Output buffer
+ VE_HLD:
+00f6bf ff03 .dw $ff03
+00f6c0 6c68
+00f6c1 0064 .db "hld",0
+00f6c2 f6ac .dw VE_HEAD
+ .set VE_HEAD = VE_HLD
+ XT_HLD:
+00f6c3 f053 .dw PFA_DOVARIABLE
+ PFA_HLD:
+00f6c4 0255 .dw ram_hld
+
+ .dseg
+000255 ram_hld: .byte 2
+ .cseg
+ .include "words/hold.asm"
+
+ ; Numeric IO
+ ; prepend character to pictured numeric output buffer
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_HOLD:
+00f6c5 ff04 .dw $ff04
+00f6c6 6f68
+00f6c7 646c .db "hold"
+00f6c8 f6bf .dw VE_HEAD
+ .set VE_HEAD = VE_HOLD
+ XT_HOLD:
+00f6c9 f000 .dw DO_COLON
+ PFA_HOLD:
+ .endif
+00f6ca f6c3 .dw XT_HLD
+00f6cb f0c2 .dw XT_DUP
+00f6cc f08a .dw XT_FETCH
+00f6cd f246 .dw XT_1MINUS
+00f6ce f0c2 .dw XT_DUP
+00f6cf f110 .dw XT_TO_R
+00f6d0 f0d5 .dw XT_SWAP
+00f6d1 f092 .dw XT_STORE
+00f6d2 f107 .dw XT_R_FROM
+00f6d3 f09e .dw XT_CSTORE
+00f6d4 f025 .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:
+00f6d5 ff02 .dw $ff02
+00f6d6 233c .db "<#"
+00f6d7 f6c5 .dw VE_HEAD
+ .set VE_HEAD = VE_L_SHARP
+ XT_L_SHARP:
+00f6d8 f000 .dw DO_COLON
+ PFA_L_SHARP:
+ .endif
+00f6d9 f59e .dw XT_PAD
+00f6da f6c3 .dw XT_HLD
+00f6db f092 .dw XT_STORE
+00f6dc f025 .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:
+00f6dd ff01 .dw $ff01
+00f6de 0023 .db "#",0
+00f6df f6d5 .dw VE_HEAD
+ .set VE_HEAD = VE_SHARP
+ XT_SHARP:
+00f6e0 f000 .dw DO_COLON
+ PFA_SHARP:
+ .endif
+00f6e1 f56b .dw XT_BASE
+00f6e2 f08a .dw XT_FETCH
+00f6e3 f75d .dw XT_UDSLASHMOD
+00f6e4 f0f2 .dw XT_ROT
+00f6e5 f045 .dw XT_DOLITERAL
+00f6e6 0009 .dw 9
+00f6e7 f0e0 .dw XT_OVER
+00f6e8 f17f .dw XT_LESS
+00f6e9 f03e .dw XT_DOCONDBRANCH
+00f6ea f6ee DEST(PFA_SHARP1)
+00f6eb f045 .dw XT_DOLITERAL
+00f6ec 0007 .dw 7
+00f6ed f1ae .dw XT_PLUS
+ PFA_SHARP1:
+00f6ee f045 .dw XT_DOLITERAL
+00f6ef 0030 .dw 48 ; ASCII 0
+00f6f0 f1ae .dw XT_PLUS
+00f6f1 f6c9 .dw XT_HOLD
+00f6f2 f025 .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:
+00f6f3 ff02 .dw $ff02
+00f6f4 7323 .db "#s"
+00f6f5 f6dd .dw VE_HEAD
+ .set VE_HEAD = VE_SHARP_S
+ XT_SHARP_S:
+00f6f6 f000 .dw DO_COLON
+ PFA_SHARP_S:
+ .endif
+ NUMS1:
+00f6f7 f6e0 .dw XT_SHARP
+00f6f8 f57f .dw XT_2DUP
+00f6f9 f22d .dw XT_OR
+00f6fa f12b .dw XT_ZEROEQUAL
+00f6fb f03e .dw XT_DOCONDBRANCH
+00f6fc f6f7 DEST(NUMS1) ; PFA_SHARP_S
+00f6fd f025 .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:
+00f6fe ff02 .dw $ff02
+00f6ff 3e23 .db "#>"
+00f700 f6f3 .dw VE_HEAD
+ .set VE_HEAD = VE_SHARP_G
+ XT_SHARP_G:
+00f701 f000 .dw DO_COLON
+ PFA_SHARP_G:
+ .endif
+00f702 f588 .dw XT_2DROP
+00f703 f6c3 .dw XT_HLD
+00f704 f08a .dw XT_FETCH
+00f705 f59e .dw XT_PAD
+00f706 f0e0 .dw XT_OVER
+00f707 f1a4 .dw XT_MINUS
+00f708 f025 .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:
+00f709 ff04 .dw $ff04
+00f70a 6973
+00f70b 6e67 .db "sign"
+00f70c f6fe .dw VE_HEAD
+ .set VE_HEAD = VE_SIGN
+ XT_SIGN:
+00f70d f000 .dw DO_COLON
+ PFA_SIGN:
+ .endif
+00f70e f132 .dw XT_ZEROLESS
+00f70f f03e .dw XT_DOCONDBRANCH
+00f710 f714 DEST(PFA_SIGN1)
+00f711 f045 .dw XT_DOLITERAL
+00f712 002d .dw 45 ; ascii -
+00f713 f6c9 .dw XT_HOLD
+ PFA_SIGN1:
+00f714 f025 .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:
+00f715 ff03 .dw $ff03
+00f716 2e64
+00f717 0072 .db "d.r",0
+00f718 f709 .dw VE_HEAD
+ .set VE_HEAD = VE_DDOTR
+ XT_DDOTR:
+00f719 f000 .dw DO_COLON
+ PFA_DDOTR:
+
+ .endif
+00f71a f110 .dw XT_TO_R
+00f71b f590 .dw XT_TUCK
+00f71c fcff .dw XT_DABS
+00f71d f6d8 .dw XT_L_SHARP
+00f71e f6f6 .dw XT_SHARP_S
+00f71f f0f2 .dw XT_ROT
+00f720 f70d .dw XT_SIGN
+00f721 f701 .dw XT_SHARP_G
+00f722 f107 .dw XT_R_FROM
+00f723 f0e0 .dw XT_OVER
+00f724 f1a4 .dw XT_MINUS
+00f725 f805 .dw XT_SPACES
+00f726 f815 .dw XT_TYPE
+00f727 f025 .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:
+00f728 ff02 .dw $ff02
+00f729 722e .db ".r"
+00f72a f715 .dw VE_HEAD
+ .set VE_HEAD = VE_DOTR
+ XT_DOTR:
+00f72b f000 .dw DO_COLON
+ PFA_DOTR:
+
+ .endif
+00f72c f110 .dw XT_TO_R
+00f72d fd92 .dw XT_S2D
+00f72e f107 .dw XT_R_FROM
+00f72f f719 .dw XT_DDOTR
+00f730 f025 .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:
+00f731 ff02 .dw $ff02
+00f732 2e64 .db "d."
+00f733 f728 .dw VE_HEAD
+ .set VE_HEAD = VE_DDOT
+ XT_DDOT:
+00f734 f000 .dw DO_COLON
+ PFA_DDOT:
+
+ .endif
+00f735 f165 .dw XT_ZERO
+00f736 f719 .dw XT_DDOTR
+00f737 f7fc .dw XT_SPACE
+00f738 f025 .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:
+00f739 ff01 .dw $ff01
+00f73a 002e .db ".",0
+00f73b f731 .dw VE_HEAD
+ .set VE_HEAD = VE_DOT
+ XT_DOT:
+00f73c f000 .dw DO_COLON
+ PFA_DOT:
+ .endif
+00f73d fd92 .dw XT_S2D
+00f73e f734 .dw XT_DDOT
+00f73f f025 .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:
+00f740 ff03 .dw $ff03
+00f741 6475
+00f742 002e .db "ud.",0
+00f743 f739 .dw VE_HEAD
+ .set VE_HEAD = VE_UDDOT
+ XT_UDDOT:
+00f744 f000 .dw DO_COLON
+ PFA_UDDOT:
+ .endif
+00f745 f165 .dw XT_ZERO
+00f746 f74d .dw XT_UDDOTR
+00f747 f7fc .dw XT_SPACE
+00f748 f025 .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:
+00f749 ff04 .dw $ff04
+00f74a 6475
+00f74b 722e .db "ud.r"
+00f74c f740 .dw VE_HEAD
+ .set VE_HEAD = VE_UDDOTR
+ XT_UDDOTR:
+00f74d f000 .dw DO_COLON
+ PFA_UDDOTR:
+ .endif
+00f74e f110 .dw XT_TO_R
+00f74f f6d8 .dw XT_L_SHARP
+00f750 f6f6 .dw XT_SHARP_S
+00f751 f701 .dw XT_SHARP_G
+00f752 f107 .dw XT_R_FROM
+00f753 f0e0 .dw XT_OVER
+00f754 f1a4 .dw XT_MINUS
+00f755 f805 .dw XT_SPACES
+00f756 f815 .dw XT_TYPE
+00f757 f025 .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:
+00f758 ff06 .dw $ff06
+00f759 6475
+00f75a 6d2f
+00f75b 646f .db "ud/mod"
+00f75c f749 .dw VE_HEAD
+ .set VE_HEAD = VE_UDSLASHMOD
+ XT_UDSLASHMOD:
+00f75d f000 .dw DO_COLON
+ PFA_UDSLASHMOD:
+ .endif
+00f75e f110 .dw XT_TO_R
+00f75f f165 .dw XT_ZERO
+00f760 f119 .dw XT_R_FETCH
+00f761 f1d3 .dw XT_UMSLASHMOD
+00f762 f107 .dw XT_R_FROM
+00f763 f0d5 .dw XT_SWAP
+00f764 f110 .dw XT_TO_R
+00f765 f1d3 .dw XT_UMSLASHMOD
+00f766 f107 .dw XT_R_FROM
+00f767 f025 .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:
+00f768 ff06 .dw $ff06
+00f769 6964
+00f76a 6967
+00f76b 3f74 .db "digit?"
+00f76c f758 .dw VE_HEAD
+ .set VE_HEAD = VE_DIGITQ
+ XT_DIGITQ:
+00f76d f000 .dw DO_COLON
+ PFA_DIGITQ:
+ .endif
+00f76e f69f .dw XT_TOUPPER
+00f76f f0c2
+00f770 f045
+00f771 0039
+00f772 f189
+00f773 f045
+00f774 0100 .DW XT_DUP,XT_DOLITERAL,57,XT_GREATER,XT_DOLITERAL,256
+00f775 f224
+00f776 f1ae
+00f777 f0c2
+00f778 f045
+00f779 0140
+00f77a f189 .DW XT_AND,XT_PLUS,XT_DUP,XT_DOLITERAL,320,XT_GREATER
+00f77b f045
+00f77c 0107
+00f77d f224
+00f77e f1a4
+00f77f f045
+00f780 0030 .DW XT_DOLITERAL,263,XT_AND,XT_MINUS,XT_DOLITERAL,48
+00f781 f1a4
+00f782 f0c2
+00f783 f56b
+00f784 f08a
+00f785 f16d .DW XT_MINUS,XT_DUP,XT_BASE,XT_FETCH,XT_ULESS
+00f786 f025 .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:
+00f787 f000 .dw DO_COLON
+ PFA_DOSLITERAL:
+00f788 f119 .dw XT_R_FETCH ; ( -- addr )
+00f789 f7e6 .dw XT_ICOUNT
+00f78a f107 .dw XT_R_FROM
+00f78b f0e0 .dw XT_OVER ; ( -- addr' n addr n)
+00f78c f240 .dw XT_1PLUS
+00f78d f215 .dw XT_2SLASH ; ( -- addr' n addr k )
+00f78e f1ae .dw XT_PLUS ; ( -- addr' n addr'' )
+00f78f f240 .dw XT_1PLUS
+00f790 f110 .dw XT_TO_R ; ( -- )
+00f791 f025 .dw XT_EXIT
+ .include "words/scomma.asm"
+
+ ; Compiler
+ ; compiles a string from RAM to Flash
+ VE_SCOMMA:
+00f792 ff02 .dw $ff02
+00f793 2c73 .db "s",$2c
+00f794 f768 .dw VE_HEAD
+ .set VE_HEAD = VE_SCOMMA
+ XT_SCOMMA:
+00f795 f000 .dw DO_COLON
+ PFA_SCOMMA:
+00f796 f0c2 .dw XT_DUP
+00f797 f799 .dw XT_DOSCOMMA
+00f798 f025 .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:
+00f799 f000 .dw DO_COLON
+ PFA_DOSCOMMA:
+00f79a 0206 .dw XT_COMMA
+00f79b f0c2 .dw XT_DUP ; ( --addr len len)
+00f79c f215 .dw XT_2SLASH ; ( -- addr len len/2
+00f79d f590 .dw XT_TUCK ; ( -- addr len/2 len len/2
+00f79e f21c .dw XT_2STAR ; ( -- addr len/2 len len'
+00f79f f1a4 .dw XT_MINUS ; ( -- addr len/2 rem
+00f7a0 f110 .dw XT_TO_R
+00f7a1 f165 .dw XT_ZERO
+00f7a2 02c5 .dw XT_QDOCHECK
+00f7a3 f03e .dw XT_DOCONDBRANCH
+00f7a4 f7ac .dw PFA_SCOMMA2
+00f7a5 f2ac .dw XT_DODO
+ PFA_SCOMMA1:
+00f7a6 f0c2 .dw XT_DUP ; ( -- addr addr )
+00f7a7 f08a .dw XT_FETCH ; ( -- addr c1c2 )
+00f7a8 0206 .dw XT_COMMA ; ( -- addr )
+00f7a9 f578 .dw XT_CELLPLUS ; ( -- addr+cell )
+00f7aa f2da .dw XT_DOLOOP
+00f7ab f7a6 .dw PFA_SCOMMA1
+ PFA_SCOMMA2:
+00f7ac f107 .dw XT_R_FROM
+00f7ad f139 .dw XT_GREATERZERO
+00f7ae f03e .dw XT_DOCONDBRANCH
+00f7af f7b3 .dw PFA_SCOMMA3
+00f7b0 f0c2 .dw XT_DUP ; well, tricky
+00f7b1 f0a9 .dw XT_CFETCH
+00f7b2 0206 .dw XT_COMMA
+ PFA_SCOMMA3:
+00f7b3 f0ea .dw XT_DROP ; ( -- )
+00f7b4 f025 .dw XT_EXIT
+ .include "words/itype.asm"
+
+ ; Tools
+ ; reads string from flash and prints it
+ VE_ITYPE:
+00f7b5 ff05 .dw $ff05
+00f7b6 7469
+00f7b7 7079
+00f7b8 0065 .db "itype",0
+00f7b9 f792 .dw VE_HEAD
+ .set VE_HEAD = VE_ITYPE
+ XT_ITYPE:
+00f7ba f000 .dw DO_COLON
+ PFA_ITYPE:
+00f7bb f0c2 .dw XT_DUP ; ( --addr len len)
+00f7bc f215 .dw XT_2SLASH ; ( -- addr len len/2
+00f7bd f590 .dw XT_TUCK ; ( -- addr len/2 len len/2
+00f7be f21c .dw XT_2STAR ; ( -- addr len/2 len len'
+00f7bf f1a4 .dw XT_MINUS ; ( -- addr len/2 rem
+00f7c0 f110 .dw XT_TO_R
+00f7c1 f165 .dw XT_ZERO
+00f7c2 02c5 .dw XT_QDOCHECK
+00f7c3 f03e .dw XT_DOCONDBRANCH
+00f7c4 f7ce .dw PFA_ITYPE2
+00f7c5 f2ac .dw XT_DODO
+ PFA_ITYPE1:
+00f7c6 f0c2 .dw XT_DUP ; ( -- addr addr )
+00f7c7 f3e2 .dw XT_FETCHI ; ( -- addr c1c2 )
+00f7c8 f0c2 .dw XT_DUP
+00f7c9 f7db .dw XT_LOWEMIT
+00f7ca f7d7 .dw XT_HIEMIT
+00f7cb f240 .dw XT_1PLUS ; ( -- addr+cell )
+00f7cc f2da .dw XT_DOLOOP
+00f7cd f7c6 .dw PFA_ITYPE1
+ PFA_ITYPE2:
+00f7ce f107 .dw XT_R_FROM
+00f7cf f139 .dw XT_GREATERZERO
+00f7d0 f03e .dw XT_DOCONDBRANCH
+00f7d1 f7d5 .dw PFA_ITYPE3
+00f7d2 f0c2 .dw XT_DUP ; make sure the drop below has always something to do
+00f7d3 f3e2 .dw XT_FETCHI
+00f7d4 f7db .dw XT_LOWEMIT
+ PFA_ITYPE3:
+00f7d5 f0ea .dw XT_DROP
+00f7d6 f025 .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:
+00f7d7 f000 .dw DO_COLON
+ PFA_HIEMIT:
+00f7d8 f30a .dw XT_BYTESWAP
+00f7d9 f7db .dw XT_LOWEMIT
+00f7da f025 .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:
+00f7db f000 .dw DO_COLON
+ PFA_LOWEMIT:
+00f7dc f045 .dw XT_DOLITERAL
+00f7dd 00ff .dw $00ff
+00f7de f224 .dw XT_AND
+00f7df f5a8 .dw XT_EMIT
+00f7e0 f025 .dw XT_EXIT
+ .include "words/icount.asm"
+
+ ; Tools
+ ; get count information out of a counted string in flash
+ VE_ICOUNT:
+00f7e1 ff06 .dw $ff06
+00f7e2 6369
+00f7e3 756f
+00f7e4 746e .db "icount"
+00f7e5 f7b5 .dw VE_HEAD
+ .set VE_HEAD = VE_ICOUNT
+ XT_ICOUNT:
+00f7e6 f000 .dw DO_COLON
+ PFA_ICOUNT:
+00f7e7 f0c2 .dw XT_DUP
+00f7e8 f240 .dw XT_1PLUS
+00f7e9 f0d5 .dw XT_SWAP
+00f7ea f3e2 .dw XT_FETCHI
+00f7eb f025 .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:
+00f7ec ff02 .dw 0xff02
+00f7ed 7263 .db "cr"
+00f7ee f7e1 .dw VE_HEAD
+ .set VE_HEAD = VE_CR
+ XT_CR:
+00f7ef f000 .dw DO_COLON
+ PFA_CR:
+ .endif
+
+00f7f0 f045 .dw XT_DOLITERAL
+00f7f1 000d .dw 13
+00f7f2 f5a8 .dw XT_EMIT
+00f7f3 f045 .dw XT_DOLITERAL
+00f7f4 000a .dw 10
+00f7f5 f5a8 .dw XT_EMIT
+00f7f6 f025 .dw XT_EXIT
+ .include "words/space.asm"
+
+ ; Character IO
+ ; emits a space (bl)
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_SPACE:
+00f7f7 ff05 .dw $ff05
+00f7f8 7073
+00f7f9 6361
+00f7fa 0065 .db "space",0
+00f7fb f7ec .dw VE_HEAD
+ .set VE_HEAD = VE_SPACE
+ XT_SPACE:
+00f7fc f000 .dw DO_COLON
+ PFA_SPACE:
+ .endif
+00f7fd f60a .dw XT_BL
+00f7fe f5a8 .dw XT_EMIT
+00f7ff f025 .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:
+00f800 ff06 .dw $ff06
+00f801 7073
+00f802 6361
+00f803 7365 .db "spaces"
+00f804 f7f7 .dw VE_HEAD
+ .set VE_HEAD = VE_SPACES
+ XT_SPACES:
+00f805 f000 .dw DO_COLON
+ PFA_SPACES:
+
+ .endif
+ ;C SPACES n -- output n spaces
+ ; BEGIN DUP 0> WHILE SPACE 1- REPEAT DROP ;
+00f806 f165
+00f807 f684 .DW XT_ZERO, XT_MAX
+00f808 f0c2
+00f809 f03e SPCS1: .DW XT_DUP,XT_DOCONDBRANCH
+00f80a f80f DEST(SPCS2)
+00f80b f7fc
+00f80c f246
+00f80d f034 .DW XT_SPACE,XT_1MINUS,XT_DOBRANCH
+00f80e f808 DEST(SPCS1)
+00f80f f0ea
+00f810 f025 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:
+00f811 ff04 .dw $ff04
+00f812 7974
+00f813 6570 .db "type"
+00f814 f800 .dw VE_HEAD
+ .set VE_HEAD = VE_TYPE
+ XT_TYPE:
+00f815 f000 .dw DO_COLON
+ PFA_TYPE:
+
+ .endif
+00f816 fd89 .dw XT_BOUNDS
+00f817 02c5 .dw XT_QDOCHECK
+00f818 f03e .dw XT_DOCONDBRANCH
+00f819 f820 DEST(PFA_TYPE2)
+00f81a f2ac .dw XT_DODO
+ PFA_TYPE1:
+00f81b f2bd .dw XT_I
+00f81c f0a9 .dw XT_CFETCH
+00f81d f5a8 .dw XT_EMIT
+00f81e f2da .dw XT_DOLOOP
+00f81f f81b DEST(PFA_TYPE1)
+ PFA_TYPE2:
+00f820 f025 .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:
+00f821 ff01 .dw $ff01
+00f822 0027 .db "'",0
+00f823 f811 .dw VE_HEAD
+ .set VE_HEAD = VE_TICK
+ XT_TICK:
+00f824 f000 .dw DO_COLON
+ PFA_TICK:
+ .endif
+00f825 f9ce .dw XT_PARSENAME
+00f826 fae6 .dw XT_FORTHRECOGNIZER
+00f827 faf1 .dw XT_RECOGNIZE
+ ; a word is tickable unless DT:TOKEN is DT:NULL or
+ ; the interpret action is a NOOP
+00f828 f0c2 .dw XT_DUP
+00f829 fb64 .dw XT_DT_NULL
+00f82a fdaa .dw XT_EQUAL
+00f82b f0d5 .dw XT_SWAP
+00f82c f3e2 .dw XT_FETCHI
+00f82d f045 .dw XT_DOLITERAL
+00f82e fb99 .dw XT_NOOP
+00f82f fdaa .dw XT_EQUAL
+00f830 f22d .dw XT_OR
+00f831 f03e .dw XT_DOCONDBRANCH
+00f832 f836 DEST(PFA_TICK1)
+00f833 f045 .dw XT_DOLITERAL
+00f834 fff3 .dw -13
+00f835 f85b .dw XT_THROW
+ PFA_TICK1:
+00f836 f0ea .dw XT_DROP
+00f837 f025 .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:
+00f838 ff07 .dw $ff07
+00f839 6168
+00f83a 646e
+00f83b 656c
+00f83c 0072 .db "handler",0
+00f83d f821 .dw VE_HEAD
+ .set VE_HEAD = VE_HANDLER
+ XT_HANDLER:
+00f83e f066 .dw PFA_DOUSER
+ PFA_HANDLER:
+ .endif
+00f83f 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:
+00f840 ff05 .dw $ff05
+00f841 6163
+00f842 6374
+00f843 0068 .db "catch",0
+00f844 f838 .dw VE_HEAD
+ .set VE_HEAD = VE_CATCH
+ XT_CATCH:
+00f845 f000 .dw DO_COLON
+ PFA_CATCH:
+ .endif
+
+ ; sp@ >r
+00f846 f29e .dw XT_SP_FETCH
+00f847 f110 .dw XT_TO_R
+ ; handler @ >r
+00f848 f83e .dw XT_HANDLER
+00f849 f08a .dw XT_FETCH
+00f84a f110 .dw XT_TO_R
+ ; rp@ handler !
+00f84b f287 .dw XT_RP_FETCH
+00f84c f83e .dw XT_HANDLER
+00f84d f092 .dw XT_STORE
+00f84e f02f .dw XT_EXECUTE
+ ; r> handler !
+00f84f f107 .dw XT_R_FROM
+00f850 f83e .dw XT_HANDLER
+00f851 f092 .dw XT_STORE
+00f852 f107 .dw XT_R_FROM
+00f853 f0ea .dw XT_DROP
+00f854 f165 .dw XT_ZERO
+00f855 f025 .dw XT_EXIT
+ .include "words/throw.asm"
+
+ ; Exceptions
+ ; throw an exception
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_THROW:
+00f856 ff05 .dw $ff05
+00f857 6874
+00f858 6f72
+00f859 0077 .db "throw",0
+00f85a f840 .dw VE_HEAD
+ .set VE_HEAD = VE_THROW
+ XT_THROW:
+00f85b f000 .dw DO_COLON
+ PFA_THROW:
+ .endif
+00f85c f0c2 .dw XT_DUP
+00f85d f12b .dw XT_ZEROEQUAL
+00f85e f03e .dw XT_DOCONDBRANCH
+00f85f f862 DEST(PFA_THROW1)
+00f860 f0ea .dw XT_DROP
+00f861 f025 .dw XT_EXIT
+ PFA_THROW1:
+00f862 f83e .dw XT_HANDLER
+00f863 f08a .dw XT_FETCH
+00f864 f291 .dw XT_RP_STORE
+00f865 f107 .dw XT_R_FROM
+00f866 f83e .dw XT_HANDLER
+00f867 f092 .dw XT_STORE
+00f868 f107 .dw XT_R_FROM
+00f869 f0d5 .dw XT_SWAP
+00f86a f110 .dw XT_TO_R
+00f86b f2a7 .dw XT_SP_STORE
+00f86c f0ea .dw XT_DROP
+00f86d f107 .dw XT_R_FROM
+00f86e f025 .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:
+00f86f ff05 .dw $ff05
+00f870 7363
+00f871 696b
+00f872 0070 .db "cskip",0
+00f873 f856 .dw VE_HEAD
+ .set VE_HEAD = VE_CSKIP
+ XT_CSKIP:
+00f874 f000 .dw DO_COLON
+ PFA_CSKIP:
+ .endif
+00f875 f110 .dw XT_TO_R ; ( -- addr1 n1 )
+ PFA_CSKIP1:
+00f876 f0c2 .dw XT_DUP ; ( -- addr' n' n' )
+00f877 f03e .dw XT_DOCONDBRANCH ; ( -- addr' n')
+00f878 f883 DEST(PFA_CSKIP2)
+00f879 f0e0 .dw XT_OVER ; ( -- addr' n' addr' )
+00f87a f0a9 .dw XT_CFETCH ; ( -- addr' n' c' )
+00f87b f119 .dw XT_R_FETCH ; ( -- addr' n' c' c )
+00f87c fdaa .dw XT_EQUAL ; ( -- addr' n' f )
+00f87d f03e .dw XT_DOCONDBRANCH ; ( -- addr' n')
+00f87e f883 DEST(PFA_CSKIP2)
+00f87f fdb1 .dw XT_ONE
+00f880 f9bf .dw XT_SLASHSTRING
+00f881 f034 .dw XT_DOBRANCH
+00f882 f876 DEST(PFA_CSKIP1)
+ PFA_CSKIP2:
+00f883 f107 .dw XT_R_FROM
+00f884 f0ea .dw XT_DROP ; ( -- addr2 n2)
+00f885 f025 .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:
+00f886 ff05 .dw $ff05
+00f887 7363
+00f888 6163
+../../common\words/cscan.asm(12): warning: .cseg .db misalignment - padding zero byte
+00f889 006e .db "cscan"
+00f88a f86f .dw VE_HEAD
+ .set VE_HEAD = VE_CSCAN
+ XT_CSCAN:
+00f88b f000 .dw DO_COLON
+ PFA_CSCAN:
+ .endif
+00f88c f110 .dw XT_TO_R
+00f88d f0e0 .dw XT_OVER
+ PFA_CSCAN1:
+00f88e f0c2 .dw XT_DUP
+00f88f f0a9 .dw XT_CFETCH
+00f890 f119 .dw XT_R_FETCH
+00f891 fdaa .dw XT_EQUAL
+00f892 f12b .dw XT_ZEROEQUAL
+00f893 f03e .dw XT_DOCONDBRANCH
+00f894 f8a0 DEST(PFA_CSCAN2)
+00f895 f0d5 .dw XT_SWAP
+00f896 f246 .dw XT_1MINUS
+00f897 f0d5 .dw XT_SWAP
+00f898 f0e0 .dw XT_OVER
+00f899 f132 .dw XT_ZEROLESS ; not negative
+00f89a f12b .dw XT_ZEROEQUAL
+00f89b f03e .dw XT_DOCONDBRANCH
+00f89c f8a0 DEST(PFA_CSCAN2)
+00f89d f240 .dw XT_1PLUS
+00f89e f034 .dw XT_DOBRANCH
+00f89f f88e DEST(PFA_CSCAN1)
+ PFA_CSCAN2:
+00f8a0 f101 .dw XT_NIP
+00f8a1 f0e0 .dw XT_OVER
+00f8a2 f1a4 .dw XT_MINUS
+00f8a3 f107 .dw XT_R_FROM
+00f8a4 f0ea .dw XT_DROP
+00f8a5 f025 .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:
+00f8a6 ff06 .dw $ff06
+00f8a7 6361
+00f8a8 6563
+00f8a9 7470 .db "accept"
+00f8aa f886 .dw VE_HEAD
+ .set VE_HEAD = VE_ACCEPT
+ XT_ACCEPT:
+00f8ab f000 .dw DO_COLON
+ PFA_ACCEPT:
+
+ .endif
+00f8ac f0e0
+00f8ad f1ae
+00f8ae f246
+00f8af f0e0 .DW XT_OVER,XT_PLUS,XT_1MINUS,XT_OVER
+00f8b0 f5b9
+00f8b1 f0c2
+00f8b2 f8ec
+00f8b3 f12b
+00f8b4 f03e ACC1: .DW XT_KEY,XT_DUP,XT_CRLFQ,XT_ZEROEQUAL,XT_DOCONDBRANCH
+00f8b5 f8de DEST(ACC5)
+00f8b6 f0c2
+00f8b7 f045
+00f8b8 0008
+00f8b9 fdaa
+00f8ba f03e .DW XT_DUP,XT_DOLITERAL,8,XT_EQUAL,XT_DOCONDBRANCH
+00f8bb f8ce DEST(ACC3)
+00f8bc f0ea
+00f8bd f0f2
+00f8be f57f
+00f8bf f189
+00f8c0 f110
+00f8c1 f0f2
+00f8c2 f0f2
+00f8c3 f107
+00f8c4 f03e .DW XT_DROP,XT_ROT,XT_2DUP,XT_GREATER,XT_TO_R,XT_ROT,XT_ROT,XT_R_FROM,XT_DOCONDBRANCH
+00f8c5 f8cc DEST(ACC6)
+00f8c6 f8e4
+00f8c7 f246
+00f8c8 f110
+00f8c9 f0e0
+00f8ca f107
+00f8cb 0198 .DW XT_BS,XT_1MINUS,XT_TO_R,XT_OVER,XT_R_FROM,XT_UMAX
+00f8cc f034 ACC6: .DW XT_DOBRANCH
+00f8cd f8dc DEST(ACC4)
+
+
+ ACC3: ; check for remaining control characters, replace them with blank
+00f8ce f0c2 .dw XT_DUP ; ( -- addr k k )
+00f8cf f60a .dw XT_BL
+00f8d0 f17f .dw XT_LESS
+00f8d1 f03e .dw XT_DOCONDBRANCH
+00f8d2 f8d5 DEST(PFA_ACCEPT6)
+00f8d3 f0ea .dw XT_DROP
+00f8d4 f60a .dw XT_BL
+ PFA_ACCEPT6:
+00f8d5 f0c2
+00f8d6 f5a8
+00f8d7 f0e0
+00f8d8 f09e
+00f8d9 f240
+00f8da f0e0
+00f8db 01a4 .DW XT_DUP,XT_EMIT,XT_OVER,XT_CSTORE,XT_1PLUS,XT_OVER,XT_UMIN
+00f8dc f034 ACC4: .DW XT_DOBRANCH
+00f8dd f8b0 DEST(ACC1)
+00f8de f0ea
+00f8df f101
+00f8e0 f0d5
+00f8e1 f1a4
+00f8e2 f7ef
+00f8e3 f025 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:
+00f8e4 f000 .dw DO_COLON
+ .endif
+00f8e5 f045 .dw XT_DOLITERAL
+00f8e6 0008 .dw 8
+00f8e7 f0c2 .dw XT_DUP
+00f8e8 f5a8 .dw XT_EMIT
+00f8e9 f7fc .dw XT_SPACE
+00f8ea f5a8 .dw XT_EMIT
+00f8eb f025 .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:
+00f8ec f000 .dw DO_COLON
+ .endif
+00f8ed f0c2 .dw XT_DUP
+00f8ee f045 .dw XT_DOLITERAL
+00f8ef 000d .dw 13
+00f8f0 fdaa .dw XT_EQUAL
+00f8f1 f0d5 .dw XT_SWAP
+00f8f2 f045 .dw XT_DOLITERAL
+00f8f3 000a .dw 10
+00f8f4 fdaa .dw XT_EQUAL
+00f8f5 f22d .dw XT_OR
+00f8f6 f025 .dw XT_EXIT
+ .include "words/refill.asm"
+
+ ; System
+ ; refills the input buffer
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_REFILL:
+00f8f7 ff06 .dw $ff06
+00f8f8 6572
+00f8f9 6966
+00f8fa 6c6c .db "refill"
+00f8fb f8a6 .dw VE_HEAD
+ .set VE_HEAD = VE_REFILL
+ XT_REFILL:
+00f8fc fc2d .dw PFA_DODEFER1
+ PFA_REFILL:
+ .endif
+00f8fd 001a .dw USER_REFILL
+00f8fe fbf6 .dw XT_UDEFERFETCH
+00f8ff fc02 .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:
+00f900 ff04 .dw $ff04
+00f901 6863
+00f902 7261 .db "char"
+00f903 f8f7 .dw VE_HEAD
+ .set VE_HEAD = VE_CHAR
+ XT_CHAR:
+00f904 f000 .dw DO_COLON
+ PFA_CHAR:
+ .endif
+00f905 f9ce .dw XT_PARSENAME
+00f906 f0ea .dw XT_DROP
+00f907 f0a9 .dw XT_CFETCH
+00f908 f025 .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:
+00f909 ff06 .dw $ff06
+00f90a 756e
+00f90b 626d
+00f90c 7265 .db "number"
+00f90d f900 .dw VE_HEAD
+ .set VE_HEAD = VE_NUMBER
+ XT_NUMBER:
+00f90e f000 .dw DO_COLON
+ PFA_NUMBER:
+ .endif
+00f90f f56b .dw XT_BASE
+00f910 f08a .dw XT_FETCH
+00f911 f110 .dw XT_TO_R
+00f912 f952 .dw XT_QSIGN
+00f913 f110 .dw XT_TO_R
+00f914 f965 .dw XT_SET_BASE
+00f915 f952 .dw XT_QSIGN
+00f916 f107 .dw XT_R_FROM
+00f917 f22d .dw XT_OR
+00f918 f110 .dw XT_TO_R
+ ; check whether something is left
+00f919 f0c2 .dw XT_DUP
+00f91a f12b .dw XT_ZEROEQUAL
+00f91b f03e .dw XT_DOCONDBRANCH
+00f91c f925 DEST(PFA_NUMBER0)
+ ; nothing is left. It cannot be a number at all
+00f91d f588 .dw XT_2DROP
+00f91e f107 .dw XT_R_FROM
+00f91f f0ea .dw XT_DROP
+00f920 f107 .dw XT_R_FROM
+00f921 f56b .dw XT_BASE
+00f922 f092 .dw XT_STORE
+00f923 f165 .dw XT_ZERO
+00f924 f025 .dw XT_EXIT
+ PFA_NUMBER0:
+00f925 f32f .dw XT_2TO_R
+00f926 f165 .dw XT_ZERO ; starting value
+00f927 f165 .dw XT_ZERO
+00f928 f33e .dw XT_2R_FROM
+00f929 f983 .dw XT_TO_NUMBER ; ( 0. addr len -- d addr' len'
+ ; check length of the remaining string.
+ ; if zero: a single cell number is entered
+00f92a f0ca .dw XT_QDUP
+00f92b f03e .dw XT_DOCONDBRANCH
+00f92c f947 DEST(PFA_NUMBER1)
+ ; if equal 1: mayba a trailing dot? --> double cell number
+00f92d fdb1 .dw XT_ONE
+00f92e fdaa .dw XT_EQUAL
+00f92f f03e .dw XT_DOCONDBRANCH
+00f930 f93e DEST(PFA_NUMBER2)
+ ; excatly one character is left
+00f931 f0a9 .dw XT_CFETCH
+00f932 f045 .dw XT_DOLITERAL
+00f933 002e .dw 46 ; .
+00f934 fdaa .dw XT_EQUAL
+00f935 f03e .dw XT_DOCONDBRANCH
+00f936 f93f DEST(PFA_NUMBER6)
+ ; its a double cell number
+ ; incorporate sign into number
+00f937 f107 .dw XT_R_FROM
+00f938 f03e .dw XT_DOCONDBRANCH
+00f939 f93b DEST(PFA_NUMBER3)
+00f93a fd0c .dw XT_DNEGATE
+ PFA_NUMBER3:
+00f93b fdb6 .dw XT_TWO
+00f93c f034 .dw XT_DOBRANCH
+00f93d f94d DEST(PFA_NUMBER5)
+ PFA_NUMBER2:
+00f93e f0ea .dw XT_DROP
+ PFA_NUMBER6:
+00f93f f588 .dw XT_2DROP
+00f940 f107 .dw XT_R_FROM
+00f941 f0ea .dw XT_DROP
+00f942 f107 .dw XT_R_FROM
+00f943 f56b .dw XT_BASE
+00f944 f092 .dw XT_STORE
+00f945 f165 .dw XT_ZERO
+00f946 f025 .dw XT_EXIT
+ PFA_NUMBER1:
+00f947 f588 .dw XT_2DROP ; remove the address
+ ; incorporate sign into number
+00f948 f107 .dw XT_R_FROM
+00f949 f03e .dw XT_DOCONDBRANCH
+00f94a f94c DEST(PFA_NUMBER4)
+00f94b f659 .dw XT_NEGATE
+ PFA_NUMBER4:
+00f94c fdb1 .dw XT_ONE
+ PFA_NUMBER5:
+00f94d f107 .dw XT_R_FROM
+00f94e f56b .dw XT_BASE
+00f94f f092 .dw XT_STORE
+00f950 f15c .dw XT_TRUE
+00f951 f025 .dw XT_EXIT
+ .include "words/q-sign.asm"
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ XT_QSIGN:
+00f952 f000 .dw DO_COLON
+ PFA_QSIGN: ; ( c -- )
+ .endif
+00f953 f0e0 .dw XT_OVER ; ( -- addr len addr )
+00f954 f0a9 .dw XT_CFETCH
+00f955 f045 .dw XT_DOLITERAL
+00f956 002d .dw '-'
+00f957 fdaa .dw XT_EQUAL ; ( -- addr len flag )
+00f958 f0c2 .dw XT_DUP
+00f959 f110 .dw XT_TO_R
+00f95a f03e .dw XT_DOCONDBRANCH
+00f95b f95e DEST(PFA_NUMBERSIGN_DONE)
+00f95c fdb1 .dw XT_ONE ; skip sign character
+00f95d f9bf .dw XT_SLASHSTRING
+ PFA_NUMBERSIGN_DONE:
+00f95e f107 .dw XT_R_FROM
+00f95f f025 .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:
+00f960 f060 .dw PFA_DOCONSTANT
+ .endif
+00f961 000a
+00f962 0010
+00f963 0002
+00f964 000a .dw 10,16,2,10 ; last one could a 8 instead.
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ XT_SET_BASE:
+00f965 f000 .dw DO_COLON
+ PFA_SET_BASE: ; ( adr1 len1 -- adr2 len2 )
+ .endif
+00f966 f0e0 .dw XT_OVER
+00f967 f0a9 .dw XT_CFETCH
+00f968 f045 .dw XT_DOLITERAL
+00f969 0023 .dw 35
+00f96a f1a4 .dw XT_MINUS
+00f96b f0c2 .dw XT_DUP
+00f96c f165 .dw XT_ZERO
+00f96d f045 .dw XT_DOLITERAL
+00f96e 0004 .dw 4
+00f96f f691 .dw XT_WITHIN
+00f970 f03e .dw XT_DOCONDBRANCH
+00f971 f97b DEST(SET_BASE1)
+ .if cpu_msp430==1
+ .endif
+00f972 f960 .dw XT_BASES
+00f973 f1ae .dw XT_PLUS
+00f974 f3e2 .dw XT_FETCHI
+00f975 f56b .dw XT_BASE
+00f976 f092 .dw XT_STORE
+00f977 fdb1 .dw XT_ONE
+00f978 f9bf .dw XT_SLASHSTRING
+00f979 f034 .dw XT_DOBRANCH
+00f97a f97c DEST(SET_BASE2)
+ SET_BASE1:
+00f97b f0ea .dw XT_DROP
+ SET_BASE2:
+00f97c f025 .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:
+00f97d ff07 .dw $ff07
+00f97e 6e3e
+00f97f 6d75
+00f980 6562
+00f981 0072 .db ">number",0
+00f982 f909 .dw VE_HEAD
+ .set VE_HEAD = VE_TO_NUMBER
+ XT_TO_NUMBER:
+00f983 f000 .dw DO_COLON
+
+ .endif
+
+00f984 f0c2
+00f985 f03e TONUM1: .DW XT_DUP,XT_DOCONDBRANCH
+00f986 f99b DEST(TONUM3)
+00f987 f0e0
+00f988 f0a9
+00f989 f76d .DW XT_OVER,XT_CFETCH,XT_DIGITQ
+00f98a f12b
+00f98b f03e .DW XT_ZEROEQUAL,XT_DOCONDBRANCH
+00f98c f98f DEST(TONUM2)
+00f98d f0ea
+00f98e f025 .DW XT_DROP,XT_EXIT
+00f98f f110
+00f990 fd30
+00f991 f56b
+00f992 f08a
+00f993 0189 TONUM2: .DW XT_TO_R,XT_2SWAP,XT_BASE,XT_FETCH,XT_UDSTAR
+00f994 f107
+00f995 0181
+00f996 fd30 .DW XT_R_FROM,XT_MPLUS,XT_2SWAP
+00f997 fdb1
+00f998 f9bf
+00f999 f034 .DW XT_ONE,XT_SLASHSTRING,XT_DOBRANCH
+00f99a f984 DEST(TONUM1)
+00f99b f025 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:
+00f99c ff05 .dw $ff05
+00f99d 6170
+00f99e 7372
+00f99f 0065 .db "parse",0
+00f9a0 f97d .dw VE_HEAD
+ .set VE_HEAD = VE_PARSE
+ XT_PARSE:
+00f9a1 f000 .dw DO_COLON
+ PFA_PARSE:
+ .endif
+00f9a2 f110 .dw XT_TO_R ; ( -- )
+00f9a3 f9b5 .dw XT_SOURCE ; ( -- addr len)
+00f9a4 f598 .dw XT_TO_IN ; ( -- addr len >in)
+00f9a5 f08a .dw XT_FETCH
+00f9a6 f9bf .dw XT_SLASHSTRING ; ( -- addr' len' )
+
+00f9a7 f107 .dw XT_R_FROM ; ( -- addr' len' c)
+00f9a8 f88b .dw XT_CSCAN ; ( -- addr' len'')
+00f9a9 f0c2 .dw XT_DUP ; ( -- addr' len'' len'')
+00f9aa f240 .dw XT_1PLUS
+00f9ab f598 .dw XT_TO_IN ; ( -- addr' len'' len'' >in)
+00f9ac f276 .dw XT_PLUSSTORE ; ( -- addr' len')
+00f9ad fdb1 .dw XT_ONE
+00f9ae f9bf .dw XT_SLASHSTRING
+00f9af f025 .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:
+00f9b0 ff06 .dw $FF06
+00f9b1 6f73
+00f9b2 7275
+00f9b3 6563 .db "source"
+00f9b4 f99c .dw VE_HEAD
+ .set VE_HEAD = VE_SOURCE
+ XT_SOURCE:
+00f9b5 fc2d .dw PFA_DODEFER1
+ PFA_SOURCE:
+ .endif
+00f9b6 0016 .dw USER_SOURCE
+00f9b7 fbf6 .dw XT_UDEFERFETCH
+00f9b8 fc02 .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:
+00f9b9 ff07 .dw $ff07
+00f9ba 732f
+00f9bb 7274
+00f9bc 6e69
+00f9bd 0067 .db "/string",0
+00f9be f9b0 .dw VE_HEAD
+ .set VE_HEAD = VE_SLASHSTRING
+ XT_SLASHSTRING:
+00f9bf f000 .dw DO_COLON
+ PFA_SLASHSTRING:
+ .endif
+00f9c0 f0f2 .dw XT_ROT
+00f9c1 f0e0 .dw XT_OVER
+00f9c2 f1ae .dw XT_PLUS
+00f9c3 f0f2 .dw XT_ROT
+00f9c4 f0f2 .dw XT_ROT
+00f9c5 f1a4 .dw XT_MINUS
+00f9c6 f025 .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:
+00f9c7 ff0a .dw $FF0A
+00f9c8 6170
+00f9c9 7372
+00f9ca 2d65
+00f9cb 616e
+00f9cc 656d .db "parse-name"
+00f9cd f9b9 .dw VE_HEAD
+ .set VE_HEAD = VE_PARSENAME
+ XT_PARSENAME:
+00f9ce f000 .dw DO_COLON
+ PFA_PARSENAME:
+ .endif
+00f9cf f60a .dw XT_BL
+00f9d0 f9d2 .dw XT_SKIPSCANCHAR
+00f9d1 f025 .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:
+00f9d2 f000 .dw DO_COLON
+ PFA_SKIPSCANCHAR:
+ .endif
+00f9d3 f110 .dw XT_TO_R
+00f9d4 f9b5 .dw XT_SOURCE
+00f9d5 f598 .dw XT_TO_IN
+00f9d6 f08a .dw XT_FETCH
+00f9d7 f9bf .dw XT_SLASHSTRING
+
+00f9d8 f119 .dw XT_R_FETCH
+00f9d9 f874 .dw XT_CSKIP
+00f9da f107 .dw XT_R_FROM
+00f9db f88b .dw XT_CSCAN
+
+ ; adjust >IN
+00f9dc f57f .dw XT_2DUP
+00f9dd f1ae .dw XT_PLUS
+00f9de f9b5 .dw XT_SOURCE
+00f9df f0ea .dw XT_DROP
+00f9e0 f1a4 .dw XT_MINUS
+00f9e1 f598 .dw XT_TO_IN
+00f9e2 f092 .dw XT_STORE
+00f9e3 f025 .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:
+00f9e4 ff07 .dw $ff07
+00f9e5 6966
+00f9e6 646e
+00f9e7 782d
+00f9e8 0074 .db "find-xt",0
+00f9e9 f9c7 .dw VE_HEAD
+ .set VE_HEAD = VE_FINDXT
+ XT_FINDXT:
+00f9ea f000 .dw DO_COLON
+ PFA_FINDXT:
+ .endif
+00f9eb f045 .dw XT_DOLITERAL
+00f9ec f9f6 .dw XT_FINDXTA
+00f9ed f045 .dw XT_DOLITERAL
+00f9ee 0088 .dw CFG_ORDERLISTLEN
+00f9ef 0446 .dw XT_MAPSTACK
+00f9f0 f12b .dw XT_ZEROEQUAL
+00f9f1 f03e .dw XT_DOCONDBRANCH
+00f9f2 f9f5 DEST(PFA_FINDXT1)
+00f9f3 f588 .dw XT_2DROP
+00f9f4 f165 .dw XT_ZERO
+ PFA_FINDXT1:
+00f9f5 f025 .dw XT_EXIT
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+
+ XT_FINDXTA:
+00f9f6 f000 .dw DO_COLON
+ PFA_FINDXTA:
+ .endif
+00f9f7 f110 .dw XT_TO_R
+00f9f8 f57f .dw XT_2DUP
+00f9f9 f107 .dw XT_R_FROM
+00f9fa fc3f .dw XT_SEARCH_WORDLIST
+00f9fb f0c2 .dw XT_DUP
+00f9fc f03e .dw XT_DOCONDBRANCH
+00f9fd fa03 DEST(PFA_FINDXTA1)
+00f9fe f110 .dw XT_TO_R
+00f9ff f101 .dw XT_NIP
+00fa00 f101 .dw XT_NIP
+00fa01 f107 .dw XT_R_FROM
+00fa02 f15c .dw XT_TRUE
+ PFA_FINDXTA1:
+00fa03 f025 .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:
+00fa04 f000 .dw DO_COLON
+ PFA_DEFAULT_PROMPTOK:
+00fa05 f787 .dw XT_DOSLITERAL
+00fa06 0003 .dw 3
+00fa07 6f20
+00fa08 006b .db " ok",0
+ .endif
+00fa09 f7ba .dw XT_ITYPE
+00fa0a f025 .dw XT_EXIT
+
+ ; ------------------------
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_PROMPTOK:
+00fa0b ff03 .dw $FF03
+00fa0c 6f2e
+../../common\words/prompt-ok.asm(43): warning: .cseg .db misalignment - padding zero byte
+00fa0d 006b .db ".ok"
+00fa0e f9e4 .dw VE_HEAD
+ .set VE_HEAD = VE_PROMPTOK
+ XT_PROMPTOK:
+00fa0f fc2d .dw PFA_DODEFER1
+ PFA_PROMPTOK:
+ .endif
+00fa10 001c .dw USER_P_OK
+00fa11 fbf6 .dw XT_UDEFERFETCH
+00fa12 fc02 .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:
+00fa13 f000 .dw DO_COLON
+ PFA_DEFAULT_PROMPTREADY:
+00fa14 f787 .dw XT_DOSLITERAL
+00fa15 0002 .dw 2
+00fa16 203e .db "> "
+ .endif
+00fa17 f7ef .dw XT_CR
+00fa18 f7ba .dw XT_ITYPE
+00fa19 f025 .dw XT_EXIT
+
+ ; ------------------------
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_PROMPTREADY:
+00fa1a ff06 .dw $FF06
+00fa1b 722e
+00fa1c 6165
+00fa1d 7964 .db ".ready"
+00fa1e fa0b .dw VE_HEAD
+ .set VE_HEAD = VE_PROMPTREADY
+ XT_PROMPTREADY:
+00fa1f fc2d .dw PFA_DODEFER1
+ PFA_PROMPTREADY:
+ .endif
+00fa20 0020 .dw USER_P_RDY
+00fa21 fbf6 .dw XT_UDEFERFETCH
+00fa22 fc02 .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:
+00fa23 f000 .dw DO_COLON
+ PFA_DEFAULT_PROMPTERROR:
+00fa24 f787 .dw XT_DOSLITERAL
+00fa25 0004 .dw 4
+00fa26 3f20
+00fa27 203f .db " ?? "
+ .endif
+00fa28 f7ba .dw XT_ITYPE
+00fa29 f56b .dw XT_BASE
+00fa2a f08a .dw XT_FETCH
+00fa2b f110 .dw XT_TO_R
+00fa2c f5f7 .dw XT_DECIMAL
+00fa2d f73c .dw XT_DOT
+00fa2e f598 .dw XT_TO_IN
+00fa2f f08a .dw XT_FETCH
+00fa30 f73c .dw XT_DOT
+00fa31 f107 .dw XT_R_FROM
+00fa32 f56b .dw XT_BASE
+00fa33 f092 .dw XT_STORE
+00fa34 f025 .dw XT_EXIT
+
+ ; ------------------------
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_PROMPTERROR:
+00fa35 ff06 .dw $FF06
+00fa36 652e
+00fa37 7272
+00fa38 726f .db ".error"
+00fa39 fa1a .dw VE_HEAD
+ .set VE_HEAD = VE_PROMPTERROR
+ XT_PROMPTERROR:
+00fa3a fc2d .dw PFA_DODEFER1
+ PFA_PROMPTERROR:
+ .endif
+00fa3b 001e .dw USER_P_ERR
+00fa3c fbf6 .dw XT_UDEFERFETCH
+00fa3d fc02 .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:
+00fa3e ff04 .dw $ff04
+00fa3f 7571
+00fa40 7469 .db "quit"
+00fa41 fa35 .dw VE_HEAD
+ .set VE_HEAD = VE_QUIT
+ XT_QUIT:
+00fa42 f000 .dw DO_COLON
+ .endif
+ PFA_QUIT:
+00fa43 02fb
+00fa44 0302
+00fa45 f092 .dw XT_LP0,XT_LP,XT_STORE
+00fa46 faa3 .dw XT_SP0
+00fa47 f2a7 .dw XT_SP_STORE
+00fa48 fab0 .dw XT_RP0
+00fa49 f291 .dw XT_RP_STORE
+00fa4a 0390 .dw XT_LBRACKET
+
+ PFA_QUIT2:
+00fa4b f565 .dw XT_STATE
+00fa4c f08a .dw XT_FETCH
+00fa4d f12b .dw XT_ZEROEQUAL
+00fa4e f03e .dw XT_DOCONDBRANCH
+00fa4f fa51 DEST(PFA_QUIT4)
+00fa50 fa1f .dw XT_PROMPTREADY
+ PFA_QUIT4:
+00fa51 f8fc .dw XT_REFILL
+00fa52 f03e .dw XT_DOCONDBRANCH
+00fa53 fa63 DEST(PFA_QUIT3)
+00fa54 f045 .dw XT_DOLITERAL
+00fa55 fac9 .dw XT_INTERPRET
+00fa56 f845 .dw XT_CATCH
+00fa57 f0ca .dw XT_QDUP
+00fa58 f03e .dw XT_DOCONDBRANCH
+00fa59 fa63 DEST(PFA_QUIT3)
+00fa5a f0c2 .dw XT_DUP
+00fa5b f045 .dw XT_DOLITERAL
+00fa5c fffe .dw -2
+00fa5d f17f .dw XT_LESS
+00fa5e f03e .dw XT_DOCONDBRANCH
+00fa5f fa61 DEST(PFA_QUIT5)
+00fa60 fa3a .dw XT_PROMPTERROR
+ PFA_QUIT5:
+00fa61 f034 .dw XT_DOBRANCH
+00fa62 fa43 DEST(PFA_QUIT)
+ PFA_QUIT3:
+00fa63 fa0f .dw XT_PROMPTOK
+00fa64 f034 .dw XT_DOBRANCH
+00fa65 fa4b 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:
+00fa66 ff05 .dw $ff05
+00fa67 6170
+00fa68 7375
+00fa69 0065 .db "pause",0
+00fa6a fa3e .dw VE_HEAD
+ .set VE_HEAD = VE_PAUSE
+ XT_PAUSE:
+00fa6b fc2d .dw PFA_DODEFER1
+ PFA_PAUSE:
+00fa6c 0257 .dw ram_pause
+00fa6d fbe2 .dw XT_RDEFERFETCH
+00fa6e fbec .dw XT_RDEFERSTORE
+
+ .dseg
+000257 ram_pause: .byte 2
+ .cseg
+ .include "words/cold.asm"
+
+ ; System
+ ; start up amforth.
+ VE_COLD:
+00fa6f ff04 .dw $ff04
+00fa70 6f63
+00fa71 646c .db "cold"
+00fa72 fa66 .dw VE_HEAD
+ .set VE_HEAD = VE_COLD
+ XT_COLD:
+00fa73 fa74 .dw PFA_COLD
+ PFA_COLD:
+00fa74 b6a4 in_ mcu_boot, MCUSR
+00fa75 2422 clr zerol
+00fa76 2433 clr zeroh
+00fa77 24bb clr isrflag
+00fa78 be24 out_ MCUSR, zerol
+ ; clear RAM
+00fa79 e0e0 ldi zl, low(ramstart)
+00fa7a e0f2 ldi zh, high(ramstart)
+ clearloop:
+00fa7b 9221 st Z+, zerol
+00fa7c 30e0 cpi zl, low(sram_size+ramstart)
+00fa7d f7e9 brne clearloop
+00fa7e 32f2 cpi zh, high(sram_size+ramstart)
+00fa7f f7d9 brne clearloop
+ ; init first user data area
+ ; allocate space for User Area
+ .dseg
+000259 ram_user1: .byte SYSUSERSIZE + APPUSERSIZE
+ .cseg
+00fa80 e5e9 ldi zl, low(ram_user1)
+00fa81 e0f2 ldi zh, high(ram_user1)
+00fa82 012f movw upl, zl
+ ; init return stack pointer
+00fa83 ef0f ldi temp0,low(rstackstart)
+00fa84 bf0d out_ SPL,temp0
+00fa85 8304 std Z+4, temp0
+00fa86 e211 ldi temp1,high(rstackstart)
+00fa87 bf1e out_ SPH,temp1
+00fa88 8315 std Z+5, temp1
+
+ ; init parameter stack pointer
+00fa89 eacf ldi yl,low(stackstart)
+00fa8a 83c6 std Z+6, yl
+00fa8b e2d1 ldi yh,high(stackstart)
+00fa8c 83d7 std Z+7, yh
+
+ ; load Forth IP with starting word
+00fa8d e9a6 ldi XL, low(PFA_WARM)
+00fa8e efba ldi XH, high(PFA_WARM)
+ ; its a far jump...
+00fa8f 940c f004 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:
+00fa91 ff04 .dw $ff04
+00fa92 6177
+00fa93 6d72 .db "warm"
+00fa94 fa6f .dw VE_HEAD
+ .set VE_HEAD = VE_WARM
+ XT_WARM:
+00fa95 f000 .dw DO_COLON
+ PFA_WARM:
+ .endif
+00fa96 fd7b .dw XT_INIT_RAM
+00fa97 f045 .dw XT_DOLITERAL
+00fa98 fb99 .dw XT_NOOP
+00fa99 f045 .dw XT_DOLITERAL
+00fa9a fa6b .dw XT_PAUSE
+00fa9b fc0d .dw XT_DEFERSTORE
+00fa9c 0390 .dw XT_LBRACKET
+00fa9d f612 .dw XT_TURNKEY
+00fa9e fa42 .dw XT_QUIT ; never returns
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+ .include "words/sp0.asm"
+
+ ; Stack
+ ; start address of the data stack
+ VE_SP0:
+00fa9f ff03 .dw $ff03
+00faa0 7073
+00faa1 0030 .db "sp0",0
+00faa2 fa91 .dw VE_HEAD
+ .set VE_HEAD = VE_SP0
+ XT_SP0:
+00faa3 f080 .dw PFA_DOVALUE1
+ PFA_SP0:
+00faa4 0006 .dw USER_SP0
+00faa5 fbf6 .dw XT_UDEFERFETCH
+00faa6 fc02 .dw XT_UDEFERSTORE
+
+ ; ( -- addr)
+ ; Stack
+ ; address of user variable to store top-of-stack for inactive tasks
+ VE_SP:
+00faa7 ff02 .dw $ff02
+00faa8 7073 .db "sp"
+00faa9 fa9f .dw VE_HEAD
+ .set VE_HEAD = VE_SP
+ XT_SP:
+00faaa f066 .dw PFA_DOUSER
+ PFA_SP:
+00faab 0008 .dw USER_SP
+ .include "words/rp0.asm"
+
+ ; Stack
+ ; start address of return stack
+ VE_RP0:
+00faac ff03 .dw $ff03
+00faad 7072
+00faae 0030 .db "rp0",0
+00faaf faa7 .dw VE_HEAD
+ .set VE_HEAD = VE_RP0
+ XT_RP0:
+00fab0 f000 .dw DO_COLON
+ PFA_RP0:
+00fab1 fab4 .dw XT_DORP0
+00fab2 f08a .dw XT_FETCH
+00fab3 f025 .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:
+00fab4 f066 .dw PFA_DOUSER
+ PFA_DORP0:
+00fab5 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:
+00fab6 ff05 .dw $ff05
+00fab7 6564
+00fab8 7470
+00fab9 0068 .db "depth",0
+00faba faac .dw VE_HEAD
+ .set VE_HEAD = VE_DEPTH
+ XT_DEPTH:
+00fabb f000 .dw DO_COLON
+ PFA_DEPTH:
+ .endif
+00fabc faa3 .dw XT_SP0
+00fabd f29e .dw XT_SP_FETCH
+00fabe f1a4 .dw XT_MINUS
+00fabf f215 .dw XT_2SLASH
+00fac0 f246 .dw XT_1MINUS
+00fac1 f025 .dw XT_EXIT
+ .include "words/interpret.asm"
+
+ ; System
+ ; Interpret SOURCE word by word.
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_INTERPRET:
+00fac2 ff09 .dw $ff09
+00fac3 6e69
+00fac4 6574
+00fac5 7072
+00fac6 6572
+00fac7 0074 .db "interpret",0
+00fac8 fab6 .dw VE_HEAD
+ .set VE_HEAD = VE_INTERPRET
+ XT_INTERPRET:
+00fac9 f000 .dw DO_COLON
+ .endif
+ PFA_INTERPRET:
+00faca f9ce .dw XT_PARSENAME ; ( -- addr len )
+00facb f0c2 .dw XT_DUP ; ( -- addr len flag)
+00facc f03e .dw XT_DOCONDBRANCH
+00facd fada DEST(PFA_INTERPRET2)
+00face fae6 .dw XT_FORTHRECOGNIZER
+00facf faf1 .dw XT_RECOGNIZE
+00fad0 f565 .dw XT_STATE
+00fad1 f08a .dw XT_FETCH
+00fad2 f03e .dw XT_DOCONDBRANCH
+00fad3 fad5 DEST(PFA_INTERPRET1)
+00fad4 fbc5 .dw XT_ICELLPLUS ; we need the compile action
+ PFA_INTERPRET1:
+00fad5 f3e2 .dw XT_FETCHI
+00fad6 f02f .dw XT_EXECUTE
+00fad7 fb71 .dw XT_QSTACK
+00fad8 f034 .dw XT_DOBRANCH
+00fad9 faca DEST(PFA_INTERPRET)
+ PFA_INTERPRET2:
+00fada f588 .dw XT_2DROP
+00fadb f025 .dw XT_EXIT
+ .include "words/forth-recognizer.asm"
+
+ ; System Value
+ ; address of the next free data space (RAM) cell
+ VE_FORTHRECOGNIZER:
+00fadc ff10 .dw $ff10
+00fadd 6f66
+00fade 7472
+00fadf 2d68
+00fae0 6572
+00fae1 6f63
+00fae2 6e67
+00fae3 7a69
+00fae4 7265 .db "forth-recognizer"
+00fae5 fac2 .dw VE_HEAD
+ .set VE_HEAD = VE_FORTHRECOGNIZER
+ XT_FORTHRECOGNIZER:
+00fae6 f080 .dw PFA_DOVALUE1
+ PFA_FORTHRECOGNIZER:
+00fae7 007c .dw CFG_FORTHRECOGNIZER
+00fae8 fbce .dw XT_EDEFERFETCH
+00fae9 fbd8 .dw XT_EDEFERSTORE
+ .include "words/recognize.asm"
+
+ ; System
+ ; walk the recognizer stack
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_RECOGNIZE:
+00faea ff09 .dw $ff09
+00faeb 6572
+00faec 6f63
+00faed 6e67
+00faee 7a69
+00faef 0065 .db "recognize",0
+00faf0 fadc .dw VE_HEAD
+ .set VE_HEAD = VE_RECOGNIZE
+ XT_RECOGNIZE:
+00faf1 f000 .dw DO_COLON
+ PFA_RECOGNIZE:
+ .endif
+00faf2 f045 .dw XT_DOLITERAL
+00faf3 fafc .dw XT_RECOGNIZE_A
+00faf4 f0d5 .dw XT_SWAP
+00faf5 0446 .dw XT_MAPSTACK
+00faf6 f12b .dw XT_ZEROEQUAL
+00faf7 f03e .dw XT_DOCONDBRANCH
+00faf8 fafb DEST(PFA_RECOGNIZE1)
+00faf9 f588 .dw XT_2DROP
+00fafa fb64 .dw XT_DT_NULL
+ PFA_RECOGNIZE1:
+00fafb f025 .dw XT_EXIT
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ ; ( addr len XT -- addr len [ dt:xt -1 | 0 ] )
+ XT_RECOGNIZE_A:
+00fafc f000 .dw DO_COLON
+ PFA_RECOGNIZE_A:
+ .endif
+00fafd f0f2 .dw XT_ROT ; -- len xt addr
+00fafe f0f2 .dw XT_ROT ; -- xt addr len
+00faff f57f .dw XT_2DUP
+00fb00 f32f .dw XT_2TO_R
+00fb01 f0f2 .dw XT_ROT ; -- addr len xt
+00fb02 f02f .dw XT_EXECUTE ; -- i*x dt:* | dt:null
+00fb03 f33e .dw XT_2R_FROM
+00fb04 f0f2 .dw XT_ROT
+00fb05 f0c2 .dw XT_DUP
+00fb06 fb64 .dw XT_DT_NULL
+00fb07 fdaa .dw XT_EQUAL
+00fb08 f03e .dw XT_DOCONDBRANCH
+00fb09 fb0d DEST(PFA_RECOGNIZE_A1)
+00fb0a f0ea .dw XT_DROP
+00fb0b f165 .dw XT_ZERO
+00fb0c f025 .dw XT_EXIT
+ PFA_RECOGNIZE_A1:
+00fb0d f101 .dw XT_NIP
+00fb0e f101 .dw XT_NIP
+00fb0f f15c .dw XT_TRUE
+00fb10 f025 .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:
+00fb11 ff06 .dw $ff06
+00fb12 7464
+00fb13 6e3a
+00fb14 6d75 .db "dt:num"
+00fb15 faea .dw VE_HEAD
+ .set VE_HEAD = VE_DT_NUM
+ XT_DT_NUM:
+00fb16 f060 .dw PFA_DOCONSTANT
+ PFA_DT_NUM:
+ .endif
+00fb17 fb99 .dw XT_NOOP ; interpret
+00fb18 021c .dw XT_LITERAL ; compile
+00fb19 021c .dw XT_LITERAL ; postpone
+
+ ; ( -- addr )
+ ; Interpreter
+ ; Method table for double cell integers
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_DT_DNUM:
+00fb1a ff07 .dw $ff07
+00fb1b 7464
+00fb1c 643a
+00fb1d 756e
+00fb1e 006d .db "dt:dnum",0
+00fb1f fb11 .dw VE_HEAD
+ .set VE_HEAD = VE_DT_DNUM
+ XT_DT_DNUM:
+00fb20 f060 .dw PFA_DOCONSTANT
+ PFA_DT_DNUM:
+ .endif
+00fb21 fb99 .dw XT_NOOP ; interpret
+00fb22 fda2 .dw XT_2LITERAL ; compile
+00fb23 fda2 .dw XT_2LITERAL ; postpone
+
+ ; ( addr len -- f )
+ ; Interpreter
+ ; recognizer for integer numbers
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+
+ VE_REC_NUM:
+00fb24 ff07 .dw $ff07
+00fb25 6572
+00fb26 3a63
+00fb27 756e
+00fb28 006d .db "rec:num",0
+00fb29 fb1a .dw VE_HEAD
+ .set VE_HEAD = VE_REC_NUM
+ XT_REC_NUM:
+00fb2a f000 .dw DO_COLON
+ PFA_REC_NUM:
+ .endif
+ ; try converting to a number
+00fb2b f90e .dw XT_NUMBER
+00fb2c f03e .dw XT_DOCONDBRANCH
+00fb2d fb36 DEST(PFA_REC_NONUMBER)
+00fb2e fdb1 .dw XT_ONE
+00fb2f fdaa .dw XT_EQUAL
+00fb30 f03e .dw XT_DOCONDBRANCH
+00fb31 fb34 DEST(PFA_REC_INTNUM2)
+00fb32 fb16 .dw XT_DT_NUM
+00fb33 f025 .dw XT_EXIT
+ PFA_REC_INTNUM2:
+00fb34 fb20 .dw XT_DT_DNUM
+00fb35 f025 .dw XT_EXIT
+ PFA_REC_NONUMBER:
+00fb36 fb64 .dw XT_DT_NULL
+00fb37 f025 .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:
+00fb38 ff08 .dw $ff08
+00fb39 6572
+00fb3a 3a63
+00fb3b 6966
+00fb3c 646e .db "rec:find"
+00fb3d fb24 .dw VE_HEAD
+ .set VE_HEAD = VE_REC_FIND
+ XT_REC_FIND:
+00fb3e f000 .dw DO_COLON
+ PFA_REC_FIND:
+ .endif
+00fb3f f9ea .DW XT_FINDXT
+00fb40 f0c2 .dw XT_DUP
+00fb41 f12b .dw XT_ZEROEQUAL
+00fb42 f03e .dw XT_DOCONDBRANCH
+00fb43 fb47 DEST(PFA_REC_WORD_FOUND)
+00fb44 f0ea .dw XT_DROP
+00fb45 fb64 .dw XT_DT_NULL
+00fb46 f025 .dw XT_EXIT
+ PFA_REC_WORD_FOUND:
+00fb47 fb4e .dw XT_DT_XT
+
+00fb48 f025 .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:
+00fb49 ff05 .dw $ff05
+00fb4a 7464
+00fb4b 783a
+00fb4c 0074 .db "dt:xt",0
+00fb4d fb38 .dw VE_HEAD
+ .set VE_HEAD = VE_DT_XT
+ XT_DT_XT:
+00fb4e f060 .dw PFA_DOCONSTANT
+ PFA_DT_XT:
+ .endif
+00fb4f fb52 .dw XT_R_WORD_INTERPRET
+00fb50 fb56 .dw XT_R_WORD_COMPILE
+00fb51 fda2 .dw XT_2LITERAL
+
+ ; ( XT flags -- )
+ ; Interpreter
+ ; interpret method for WORD recognizer
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ XT_R_WORD_INTERPRET:
+00fb52 f000 .dw DO_COLON
+ PFA_R_WORD_INTERPRET:
+ .endif
+00fb53 f0ea .dw XT_DROP ; the flags are in the way
+00fb54 f02f .dw XT_EXECUTE
+00fb55 f025 .dw XT_EXIT
+
+ ; ( XT flags -- )
+ ; Interpreter
+ ; Compile method for WORD recognizer
+ .if cpu_msp430==1
+ .endif
+ .if cpu_avr8==1
+ XT_R_WORD_COMPILE:
+00fb56 f000 .dw DO_COLON
+ PFA_R_WORD_COMPILE:
+ .endif
+00fb57 f132 .dw XT_ZEROLESS
+00fb58 f03e .dw XT_DOCONDBRANCH
+00fb59 fb5c DEST(PFA_R_WORD_COMPILE1)
+00fb5a 0206 .dw XT_COMMA
+00fb5b f025 .dw XT_EXIT
+ PFA_R_WORD_COMPILE1:
+00fb5c f02f .dw XT_EXECUTE
+00fb5d f025 .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:
+00fb5e ff07 .dw $ff07
+00fb5f 7464
+00fb60 6e3a
+00fb61 6c75
+../../common\words/dt-null.asm(12): warning: .cseg .db misalignment - padding zero byte
+00fb62 006c .db "dt:null"
+00fb63 fb49 .dw VE_HEAD
+ .set VE_HEAD = VE_DT_NULL
+ XT_DT_NULL:
+00fb64 f060 .dw PFA_DOCONSTANT
+ PFA_DT_NULL:
+ .endif
+00fb65 fb68 .dw XT_FAIL ; interpret
+00fb66 fb68 .dw XT_FAIL ; compile
+00fb67 fb68 .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:
+00fb68 f000 .dw DO_COLON
+ PFA_FAIL:
+ .endif
+00fb69 f045 .dw XT_DOLITERAL
+00fb6a fff3 .dw -13
+00fb6b f85b .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:
+00fb6c ff06 .dw $ff06
+00fb6d 733f
+00fb6e 6174
+00fb6f 6b63 .db "?stack"
+00fb70 fb5e .dw VE_HEAD
+ .set VE_HEAD = VE_QSTACK
+ XT_QSTACK:
+00fb71 f000 .dw DO_COLON
+ PFA_QSTACK:
+ .endif
+00fb72 fabb .dw XT_DEPTH
+00fb73 f132 .dw XT_ZEROLESS
+00fb74 f03e .dw XT_DOCONDBRANCH
+00fb75 fb79 DEST(PFA_QSTACK1)
+00fb76 f045 .dw XT_DOLITERAL
+00fb77 fffc .dw -4
+00fb78 f85b .dw XT_THROW
+ PFA_QSTACK1:
+00fb79 f025 .dw XT_EXIT
+ .include "words/ver.asm"
+
+ ; Tools
+ ; print the version string
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_DOT_VER:
+00fb7a ff03 .dw $ff03
+00fb7b 6576
+../../common\words/ver.asm(12): warning: .cseg .db misalignment - padding zero byte
+00fb7c 0072 .db "ver"
+00fb7d fb6c .dw VE_HEAD
+ .set VE_HEAD = VE_DOT_VER
+ XT_DOT_VER:
+00fb7e f000 .dw DO_COLON
+ PFA_DOT_VER:
+ .endif
+00fb7f f527 .dw XT_ENV_FORTHNAME
+00fb80 f7ba .dw XT_ITYPE
+00fb81 f7fc .dw XT_SPACE
+00fb82 f56b .dw XT_BASE
+00fb83 f08a .dw XT_FETCH
+
+00fb84 f535 .dw XT_ENV_FORTHVERSION
+00fb85 f5f7 .dw XT_DECIMAL
+00fb86 fd92 .dw XT_S2D
+00fb87 f6d8 .dw XT_L_SHARP
+00fb88 f6e0 .dw XT_SHARP
+00fb89 f045 .dw XT_DOLITERAL
+00fb8a 002e .dw '.'
+00fb8b f6c9 .dw XT_HOLD
+00fb8c f6f6 .dw XT_SHARP_S
+00fb8d f701 .dw XT_SHARP_G
+00fb8e f815 .dw XT_TYPE
+00fb8f f56b .dw XT_BASE
+00fb90 f092 .dw XT_STORE
+00fb91 f7fc .dw XT_SPACE
+00fb92 f53d .dw XT_ENV_CPU
+00fb93 f7ba .dw XT_ITYPE
+
+00fb94 f025 .dw XT_EXIT
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+ .include "words/noop.asm"
+
+ ; Tools
+ ; do nothing
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_NOOP:
+00fb95 ff04 .dw $ff04
+00fb96 6f6e
+00fb97 706f .db "noop"
+00fb98 fb7a .dw VE_HEAD
+ .set VE_HEAD = VE_NOOP
+ XT_NOOP:
+00fb99 f000 .dw DO_COLON
+ PFA_NOOP:
+ .endif
+00fb9a f025 .DW XT_EXIT
+ .include "words/unused.asm"
+
+ ; Tools
+ ; Amount of available RAM (incl. PAD)
+ VE_UNUSED:
+00fb9b ff06 .dw $ff06
+00fb9c 6e75
+00fb9d 7375
+00fb9e 6465 .db "unused"
+00fb9f fb95 .dw VE_HEAD
+ .set VE_HEAD = VE_UNUSED
+ XT_UNUSED:
+00fba0 f000 .dw DO_COLON
+ PFA_UNUSED:
+00fba1 f29e .dw XT_SP_FETCH
+00fba2 f5d9 .dw XT_HERE
+00fba3 f1a4 .dw XT_MINUS
+00fba4 f025 .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:
+00fba5 0002 .dw $0002
+00fba6 6f74 .db "to"
+00fba7 fb9b .dw VE_HEAD
+ .set VE_HEAD = VE_TO
+ XT_TO:
+00fba8 f000 .dw DO_COLON
+ PFA_TO:
+ .endif
+00fba9 f824 .dw XT_TICK
+00fbaa fd9b .dw XT_TO_BODY
+00fbab f565 .dw XT_STATE
+00fbac f08a .dw XT_FETCH
+00fbad f03e .dw XT_DOCONDBRANCH
+00fbae fbb9 DEST(PFA_TO1)
+00fbaf 01fb .dw XT_COMPILE
+00fbb0 fbb3 .dw XT_DOTO
+00fbb1 0206 .dw XT_COMMA
+00fbb2 f025 .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:
+00fbb3 f000 .dw DO_COLON
+ PFA_DOTO:
+ .endif
+00fbb4 f107 .dw XT_R_FROM
+00fbb5 f0c2 .dw XT_DUP
+00fbb6 fbc5 .dw XT_ICELLPLUS
+00fbb7 f110 .dw XT_TO_R
+00fbb8 f3e2 .dw XT_FETCHI
+ PFA_TO1:
+00fbb9 f0c2 .dw XT_DUP
+00fbba fbc5 .dw XT_ICELLPLUS
+00fbbb fbc5 .dw XT_ICELLPLUS
+00fbbc f3e2 .dw XT_FETCHI
+00fbbd f02f .dw XT_EXECUTE
+00fbbe f025 .dw XT_EXIT
+ .include "words/i-cellplus.asm"
+
+ ; Compiler
+ ; skip to the next cell in flash
+ VE_ICELLPLUS:
+00fbbf ff07 .dw $FF07
+00fbc0 2d69
+00fbc1 6563
+00fbc2 6c6c
+00fbc3 002b .db "i-cell+",0
+00fbc4 fba5 .dw VE_HEAD
+ .set VE_HEAD = VE_ICELLPLUS
+ XT_ICELLPLUS:
+00fbc5 f000 .dw DO_COLON
+ PFA_ICELLPLUS:
+00fbc6 f240 .dw XT_1PLUS
+00fbc7 f025 .dw XT_EXIT
+
+ .include "words/edefer-fetch.asm"
+
+ ; System
+ ; does the real defer@ for eeprom defers
+ VE_EDEFERFETCH:
+00fbc8 ff07 .dw $ff07
+00fbc9 6445
+00fbca 6665
+00fbcb 7265
+00fbcc 0040 .db "Edefer@",0
+00fbcd fbbf .dw VE_HEAD
+ .set VE_HEAD = VE_EDEFERFETCH
+ XT_EDEFERFETCH:
+00fbce f000 .dw DO_COLON
+ PFA_EDEFERFETCH:
+00fbcf f3e2 .dw XT_FETCHI
+00fbd0 f370 .dw XT_FETCHE
+00fbd1 f025 .dw XT_EXIT
+ .include "words/edefer-store.asm"
+
+ ; System
+ ; does the real defer! for eeprom defers
+ VE_EDEFERSTORE:
+00fbd2 ff07 .dw $ff07
+00fbd3 6445
+00fbd4 6665
+00fbd5 7265
+00fbd6 0021 .db "Edefer!",0
+00fbd7 fbc8 .dw VE_HEAD
+ .set VE_HEAD = VE_EDEFERSTORE
+ XT_EDEFERSTORE:
+00fbd8 f000 .dw DO_COLON
+ PFA_EDEFERSTORE:
+00fbd9 f3e2 .dw XT_FETCHI
+00fbda f34c .dw XT_STOREE
+00fbdb f025 .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:
+00fbdc ff07 .dw $ff07
+00fbdd 6452
+00fbde 6665
+00fbdf 7265
+00fbe0 0040 .db "Rdefer@",0
+00fbe1 fbd2 .dw VE_HEAD
+ .set VE_HEAD = VE_RDEFERFETCH
+ XT_RDEFERFETCH:
+00fbe2 f000 .dw DO_COLON
+ PFA_RDEFERFETCH:
+ .endif
+00fbe3 f3e2 .dw XT_FETCHI
+00fbe4 f08a .dw XT_FETCH
+00fbe5 f025 .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:
+00fbe6 ff07 .dw $ff07
+00fbe7 6452
+00fbe8 6665
+00fbe9 7265
+00fbea 0021 .db "Rdefer!",0
+00fbeb fbdc .dw VE_HEAD
+ .set VE_HEAD = VE_RDEFERSTORE
+ XT_RDEFERSTORE:
+00fbec f000 .dw DO_COLON
+ PFA_RDEFERSTORE:
+ .endif
+00fbed f3e2 .dw XT_FETCHI
+00fbee f092 .dw XT_STORE
+00fbef f025 .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:
+00fbf0 ff07 .dw $ff07
+00fbf1 6455
+00fbf2 6665
+00fbf3 7265
+00fbf4 0040 .db "Udefer@",0
+00fbf5 fbe6 .dw VE_HEAD
+ .set VE_HEAD = VE_UDEFERFETCH
+ XT_UDEFERFETCH:
+00fbf6 f000 .dw DO_COLON
+ PFA_UDEFERFETCH:
+ .endif
+00fbf7 f3e2 .dw XT_FETCHI
+00fbf8 f313 .dw XT_UP_FETCH
+00fbf9 f1ae .dw XT_PLUS
+00fbfa f08a .dw XT_FETCH
+00fbfb f025 .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:
+00fbfc ff07 .dw $ff07
+00fbfd 6455
+00fbfe 6665
+00fbff 7265
+00fc00 0021 .db "Udefer!",0
+00fc01 fbf0 .dw VE_HEAD
+ .set VE_HEAD = VE_UDEFERSTORE
+ XT_UDEFERSTORE:
+00fc02 f000 .dw DO_COLON
+ PFA_UDEFERSTORE:
+ .endif
+
+00fc03 f3e2 .dw XT_FETCHI
+00fc04 f313 .dw XT_UP_FETCH
+00fc05 f1ae .dw XT_PLUS
+00fc06 f092 .dw XT_STORE
+00fc07 f025 .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:
+00fc08 ff06 .dw $ff06
+00fc09 6564
+00fc0a 6566
+00fc0b 2172 .db "defer!"
+00fc0c fbfc .dw VE_HEAD
+ .set VE_HEAD = VE_DEFERSTORE
+ XT_DEFERSTORE:
+00fc0d f000 .dw DO_COLON
+ PFA_DEFERSTORE:
+ .endif
+00fc0e fd9b .dw XT_TO_BODY
+00fc0f f0c2 .dw XT_DUP
+00fc10 fbc5 .dw XT_ICELLPLUS
+00fc11 fbc5 .dw XT_ICELLPLUS
+00fc12 f3e2 .dw XT_FETCHI
+00fc13 f02f .dw XT_EXECUTE
+00fc14 f025 .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:
+00fc15 ff06 .dw $ff06
+00fc16 6564
+00fc17 6566
+00fc18 4072 .db "defer@"
+00fc19 fc08 .dw VE_HEAD
+ .set VE_HEAD = VE_DEFERFETCH
+ XT_DEFERFETCH:
+00fc1a f000 .dw DO_COLON
+ PFA_DEFERFETCH:
+ .endif
+00fc1b fd9b .dw XT_TO_BODY
+00fc1c f0c2 .dw XT_DUP
+00fc1d fbc5 .dw XT_ICELLPLUS
+00fc1e f3e2 .dw XT_FETCHI
+00fc1f f02f .dw XT_EXECUTE
+00fc20 f025 .dw XT_EXIT
+ .include "words/do-defer.asm"
+
+ ; System
+ ; runtime of defer
+ VE_DODEFER:
+00fc21 ff07 .dw $ff07
+00fc22 6428
+00fc23 6665
+00fc24 7265
+00fc25 0029 .db "(defer)", 0
+00fc26 fc15 .dw VE_HEAD
+ .set VE_HEAD = VE_DODEFER
+ XT_DODEFER:
+00fc27 f000 .dw DO_COLON
+ PFA_DODEFER:
+00fc28 01d8 .dw XT_DOCREATE
+00fc29 0338 .dw XT_REVEAL
+00fc2a 01fb .dw XT_COMPILE
+00fc2b fc2d .dw PFA_DODEFER1
+00fc2c f025 .dw XT_EXIT
+ PFA_DODEFER1:
+00fc2d 940e 0351 call_ DO_DODOES
+00fc2f f0c2 .dw XT_DUP
+00fc30 fbc5 .dw XT_ICELLPLUS
+00fc31 f3e2 .dw XT_FETCHI
+00fc32 f02f .dw XT_EXECUTE
+00fc33 f02f .dw XT_EXECUTE
+00fc34 f025 .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:
+00fc35 ff0f .dw $ff0f
+00fc36 6573
+00fc37 7261
+00fc38 6863
+00fc39 772d
+00fc3a 726f
+00fc3b 6c64
+00fc3c 7369
+00fc3d 0074 .db "search-wordlist",0
+00fc3e fc21 .dw VE_HEAD
+ .set VE_HEAD = VE_SEARCH_WORDLIST
+ XT_SEARCH_WORDLIST:
+00fc3f f000 .dw DO_COLON
+ PFA_SEARCH_WORDLIST:
+ .endif
+00fc40 f110 .dw XT_TO_R
+00fc41 f165 .dw XT_ZERO
+00fc42 f045 .dw XT_DOLITERAL
+00fc43 fc54 .dw XT_ISWORD
+00fc44 f107 .dw XT_R_FROM
+00fc45 fc71 .dw XT_TRAVERSEWORDLIST
+00fc46 f0c2 .dw XT_DUP
+00fc47 f12b .dw XT_ZEROEQUAL
+00fc48 f03e .dw XT_DOCONDBRANCH
+00fc49 fc4e DEST(PFA_SEARCH_WORDLIST1)
+00fc4a f588 .dw XT_2DROP
+00fc4b f0ea .dw XT_DROP
+00fc4c f165 .dw XT_ZERO
+00fc4d f025 .dw XT_EXIT
+ PFA_SEARCH_WORDLIST1:
+ ; ... get the XT ...
+00fc4e f0c2 .dw XT_DUP
+00fc4f fc98 .dw XT_NFA2CFA
+ ; .. and get the header flag
+00fc50 f0d5 .dw XT_SWAP
+00fc51 01be .dw XT_NAME2FLAGS
+00fc52 01ac .dw XT_IMMEDIATEQ
+00fc53 f025 .dw XT_EXIT
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ XT_ISWORD:
+00fc54 f000 .dw DO_COLON
+ PFA_ISWORD:
+ .endif
+ ; ( c-addr len 0 nt -- c-addr len 0 true| nt false )
+00fc55 f110 .dw XT_TO_R
+00fc56 f0ea .dw XT_DROP
+00fc57 f57f .dw XT_2DUP
+00fc58 f119 .dw XT_R_FETCH ; -- addr len addr len nt
+00fc59 fc8c .dw XT_NAME2STRING
+00fc5a fca2 .dw XT_ICOMPARE ; (-- addr len f )
+00fc5b f03e .dw XT_DOCONDBRANCH
+00fc5c fc62 DEST(PFA_ISWORD3)
+ ; not now
+00fc5d f107 .dw XT_R_FROM
+00fc5e f0ea .dw XT_DROP
+00fc5f f165 .dw XT_ZERO
+00fc60 f15c .dw XT_TRUE ; maybe next word
+00fc61 f025 .dw XT_EXIT
+ PFA_ISWORD3:
+ ; we found the word, now clean up iteration data ...
+00fc62 f588 .dw XT_2DROP
+00fc63 f107 .dw XT_R_FROM
+00fc64 f165 .dw XT_ZERO ; finish traverse-wordlist
+00fc65 f025 .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:
+00fc66 ff11 .dw $ff11
+00fc67 7274
+00fc68 7661
+00fc69 7265
+00fc6a 6573
+00fc6b 772d
+00fc6c 726f
+00fc6d 6c64
+00fc6e 7369
+00fc6f 0074 .db "traverse-wordlist",0
+00fc70 fc35 .dw VE_HEAD
+ .set VE_HEAD = VE_TRAVERSEWORDLIST
+ XT_TRAVERSEWORDLIST:
+00fc71 f000 .dw DO_COLON
+ PFA_TRAVERSEWORDLIST:
+
+ .endif
+00fc72 f370 .dw XT_FETCHE
+ PFA_TRAVERSEWORDLIST1:
+00fc73 f0c2 .dw XT_DUP ; ( -- xt nt nt )
+00fc74 f03e .dw XT_DOCONDBRANCH ; ( -- nt ) is nfa = counted string
+00fc75 fc82 DEST(PFA_TRAVERSEWORDLIST2)
+00fc76 f57f .dw XT_2DUP
+00fc77 f32f .dw XT_2TO_R
+00fc78 f0d5 .dw XT_SWAP
+00fc79 f02f .dw XT_EXECUTE
+00fc7a f33e .dw XT_2R_FROM
+00fc7b f0f2 .dw XT_ROT
+00fc7c f03e .dw XT_DOCONDBRANCH
+00fc7d fc82 DEST(PFA_TRAVERSEWORDLIST2)
+00fc7e 04b5 .dw XT_NFA2LFA
+00fc7f f3e2 .dw XT_FETCHI
+00fc80 f034 .dw XT_DOBRANCH ; ( -- addr )
+00fc81 fc73 DEST(PFA_TRAVERSEWORDLIST1) ; ( -- addr )
+ PFA_TRAVERSEWORDLIST2:
+00fc82 f588 .dw XT_2DROP
+00fc83 f025 .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:
+00fc84 ff0b .dw $ff0b
+00fc85 616e
+00fc86 656d
+00fc87 733e
+00fc88 7274
+00fc89 6e69
+00fc8a 0067 .db "name>string",0
+00fc8b fc66 .dw VE_HEAD
+ .set VE_HEAD = VE_NAME2STRING
+ XT_NAME2STRING:
+00fc8c f000 .dw DO_COLON
+ PFA_NAME2STRING:
+
+ .endif
+00fc8d f7e6 .dw XT_ICOUNT ; ( -- addr n )
+00fc8e f045 .dw XT_DOLITERAL
+00fc8f 00ff .dw 255
+00fc90 f224 .dw XT_AND ; mask immediate bit
+00fc91 f025 .dw XT_EXIT
+ .include "words/nfa2cfa.asm"
+
+ ; Tools
+ ; get the XT from a name token
+ VE_NFA2CFA:
+00fc92 ff07 .dw $ff07
+00fc93 666e
+00fc94 3e61
+00fc95 6663
+../../avr8\words/nfa2cfa.asm(6): warning: .cseg .db misalignment - padding zero byte
+00fc96 0061 .db "nfa>cfa"
+00fc97 fc84 .dw VE_HEAD
+ .set VE_HEAD = VE_NFA2CFA
+ XT_NFA2CFA:
+00fc98 f000 .dw DO_COLON
+ PFA_NFA2CFA:
+00fc99 04b5 .dw XT_NFA2LFA ; skip to link field
+00fc9a f240 .dw XT_1PLUS ; next is the execution token
+00fc9b f025 .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:
+00fc9c ff08 .dw $ff08
+00fc9d 6369
+00fc9e 6d6f
+00fc9f 6170
+00fca0 6572 .db "icompare"
+00fca1 fc92 .dw VE_HEAD
+ .set VE_HEAD = VE_ICOMPARE
+ XT_ICOMPARE:
+00fca2 f000 .dw DO_COLON
+ PFA_ICOMPARE:
+00fca3 f110 .dw XT_TO_R ; ( -- r-addr r-len f-addr)
+00fca4 f0e0 .dw XT_OVER ; ( -- r-addr r-len f-addr r-len)
+00fca5 f107 .dw XT_R_FROM ; ( -- r-addr r-len f-addr r-len f-len )
+00fca6 f124 .dw XT_NOTEQUAL ; ( -- r-addr r-len f-addr flag )
+00fca7 f03e .dw XT_DOCONDBRANCH
+00fca8 fcad .dw PFA_ICOMPARE_SAMELEN
+00fca9 f588 .dw XT_2DROP
+00fcaa f0ea .dw XT_DROP
+00fcab f15c .dw XT_TRUE
+00fcac f025 .dw XT_EXIT
+ PFA_ICOMPARE_SAMELEN:
+00fcad f0d5 .dw XT_SWAP ; ( -- r-addr f-addr len )
+00fcae f165 .dw XT_ZERO
+00fcaf 02c5 .dw XT_QDOCHECK
+00fcb0 f03e .dw XT_DOCONDBRANCH
+00fcb1 fcd2 .dw PFA_ICOMPARE_DONE
+00fcb2 f2ac .dw XT_DODO
+ PFA_ICOMPARE_LOOP:
+ ; ( r-addr f-addr --)
+00fcb3 f0e0 .dw XT_OVER
+00fcb4 f08a .dw XT_FETCH
+ .if WANT_IGNORECASE == 1
+00fcb5 fcd5 .dw XT_ICOMPARE_LC
+ .endif
+00fcb6 f0e0 .dw XT_OVER
+00fcb7 f3e2 .dw XT_FETCHI ; ( -- r-addr f-addr r-cc f- cc)
+ .if WANT_IGNORECASE == 1
+00fcb8 fcd5 .dw XT_ICOMPARE_LC
+ .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
+00fcb9 f0c2 .dw XT_DUP
+ ;.dw XT_BYTESWAP
+00fcba f045 .dw XT_DOLITERAL
+00fcbb 0100 .dw $100
+00fcbc f16d .dw XT_ULESS
+00fcbd f03e .dw XT_DOCONDBRANCH
+00fcbe fcc3 .dw PFA_ICOMPARE_LASTCELL
+00fcbf f0d5 .dw XT_SWAP
+00fcc0 f045 .dw XT_DOLITERAL
+00fcc1 00ff .dw $00FF
+00fcc2 f224 .dw XT_AND ; the final swap can be omitted
+ PFA_ICOMPARE_LASTCELL:
+00fcc3 f124 .dw XT_NOTEQUAL
+00fcc4 f03e .dw XT_DOCONDBRANCH
+00fcc5 fcca .dw PFA_ICOMPARE_NEXTLOOP
+00fcc6 f588 .dw XT_2DROP
+00fcc7 f15c .dw XT_TRUE
+00fcc8 f2e5 .dw XT_UNLOOP
+00fcc9 f025 .dw XT_EXIT
+ PFA_ICOMPARE_NEXTLOOP:
+00fcca f240 .dw XT_1PLUS
+00fccb f0d5 .dw XT_SWAP
+00fccc f578 .dw XT_CELLPLUS
+00fccd f0d5 .dw XT_SWAP
+00fcce f045 .dw XT_DOLITERAL
+00fccf 0002 .dw 2
+00fcd0 f2cb .dw XT_DOPLUSLOOP
+00fcd1 fcb3 .dw PFA_ICOMPARE_LOOP
+ PFA_ICOMPARE_DONE:
+00fcd2 f588 .dw XT_2DROP
+00fcd3 f165 .dw XT_ZERO
+00fcd4 f025 .dw XT_EXIT
+
+ .if WANT_IGNORECASE == 1
+ ; ( cc1 cc2 -- f)
+ ; Tools
+ ; compares two packed characters
+ ;VE_ICOMPARELC:
+ ; .dw $ff08
+ ; .db "icompare-lower"
+ ; .dw VE_HEAD
+ ; .set VE_HEAD = VE_ICOMPARELC
+ XT_ICOMPARE_LC:
+00fcd5 f000 .dw DO_COLON
+ PFA_ICOMPARE_LC:
+00fcd6 f0c2 .dw XT_DUP
+00fcd7 f045 .dw XT_DOLITERAL
+00fcd8 00ff .dw $00ff
+00fcd9 f224 .dw XT_AND
+00fcda f6b2 .dw XT_TOLOWER
+00fcdb f0d5 .dw XT_SWAP
+00fcdc f30a .dw XT_BYTESWAP
+00fcdd f045 .dw XT_DOLITERAL
+00fcde 00ff .dw $00ff
+00fcdf f224 .dw XT_AND
+00fce0 f6b2 .dw XT_TOLOWER
+00fce1 f30a .dw XT_BYTESWAP
+00fce2 f22d .dw XT_OR
+00fce3 f025 .dw XT_EXIT
+ .endif
+
+ .include "words/star.asm"
+
+ ; Arithmetics
+ ; multiply routine
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_STAR:
+00fce4 ff01 .dw $ff01
+00fce5 002a .db "*",0
+00fce6 fc9c .dw VE_HEAD
+ .set VE_HEAD = VE_STAR
+ XT_STAR:
+00fce7 f000 .dw DO_COLON
+ PFA_STAR:
+ .endif
+
+00fce8 f1b7 .dw XT_MSTAR
+00fce9 f0ea .dw XT_DROP
+00fcea f025 .dw XT_EXIT
+ .include "words/j.asm"
+
+ ; Compiler
+ ; loop counter of outer loop
+ VE_J:
+00fceb ff01 .dw $FF01
+00fcec 006a .db "j",0
+00fced fce4 .dw VE_HEAD
+ .set VE_HEAD = VE_J
+ XT_J:
+00fcee f000 .dw DO_COLON
+ PFA_J:
+00fcef f287 .dw XT_RP_FETCH
+00fcf0 f045 .dw XT_DOLITERAL
+00fcf1 0007 .dw 7
+00fcf2 f1ae .dw XT_PLUS
+00fcf3 f08a .dw XT_FETCH
+00fcf4 f287 .dw XT_RP_FETCH
+00fcf5 f045 .dw XT_DOLITERAL
+00fcf6 0009 .dw 9
+00fcf7 f1ae .dw XT_PLUS
+00fcf8 f08a .dw XT_FETCH
+00fcf9 f1ae .dw XT_PLUS
+00fcfa f025 .dw XT_EXIT
+
+ .include "words/dabs.asm"
+
+ ; Arithmetics
+ ; double cell absolute value
+ VE_DABS:
+00fcfb ff04 .dw $ff04
+00fcfc 6164
+00fcfd 7362 .db "dabs"
+00fcfe fceb .dw VE_HEAD
+ .set VE_HEAD = VE_DABS
+ XT_DABS:
+00fcff f000 .dw DO_COLON
+ PFA_DABS:
+00fd00 f0c2 .dw XT_DUP
+00fd01 f132 .dw XT_ZEROLESS
+00fd02 f03e .dw XT_DOCONDBRANCH
+00fd03 fd05 .dw PFA_DABS1
+00fd04 fd0c .dw XT_DNEGATE
+ PFA_DABS1:
+00fd05 f025 .dw XT_EXIT
+ ; : dabs ( ud1 -- +d2 ) dup 0< if dnegate then ;
+ .include "words/dnegate.asm"
+
+ ; Arithmetics
+ ; double cell negation
+ VE_DNEGATE:
+00fd06 ff07 .dw $ff07
+00fd07 6e64
+00fd08 6765
+00fd09 7461
+00fd0a 0065 .db "dnegate",0
+00fd0b fcfb .dw VE_HEAD
+ .set VE_HEAD = VE_DNEGATE
+ XT_DNEGATE:
+00fd0c f000 .dw DO_COLON
+ PFA_DNEGATE:
+00fd0d f455 .dw XT_DINVERT
+00fd0e fdb1 .dw XT_ONE
+00fd0f f165 .dw XT_ZERO
+00fd10 f42f .dw XT_DPLUS
+00fd11 f025 .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:
+00fd12 ff05 .dw $ff05
+00fd13 6d63
+00fd14 766f
+00fd15 0065 .db "cmove",0
+00fd16 fd06 .dw VE_HEAD
+ .set VE_HEAD = VE_CMOVE
+ XT_CMOVE:
+00fd17 fd18 .dw PFA_CMOVE
+ PFA_CMOVE:
+00fd18 93bf push xh
+00fd19 93af push xl
+00fd1a 91e9 ld zl, Y+
+00fd1b 91f9 ld zh, Y+ ; addr-to
+00fd1c 91a9 ld xl, Y+
+00fd1d 91b9 ld xh, Y+ ; addr-from
+00fd1e 2f09 mov temp0, tosh
+00fd1f 2b08 or temp0, tosl
+00fd20 f021 brbs 1, PFA_CMOVE1
+ PFA_CMOVE2:
+00fd21 911d ld temp1, X+
+00fd22 9311 st Z+, temp1
+00fd23 9701 sbiw tosl, 1
+00fd24 f7e1 brbc 1, PFA_CMOVE2
+ PFA_CMOVE1:
+00fd25 91af pop xl
+00fd26 91bf pop xh
+00fd27 9189
+00fd28 9199 loadtos
+00fd29 940c f004 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:
+00fd2b ff05 .dw $ff05
+00fd2c 7332
+00fd2d 6177
+00fd2e 0070 .db "2swap",0
+00fd2f fd12 .dw VE_HEAD
+ .set VE_HEAD = VE_2SWAP
+ XT_2SWAP:
+00fd30 f000 .dw DO_COLON
+ PFA_2SWAP:
+
+ .endif
+00fd31 f0f2 .dw XT_ROT
+00fd32 f110 .dw XT_TO_R
+00fd33 f0f2 .dw XT_ROT
+00fd34 f107 .dw XT_R_FROM
+00fd35 f025 .dw XT_EXIT
+
+ .include "words/tib.asm"
+
+ ; System
+ ; refills the input buffer
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_REFILLTIB:
+00fd36 ff0a .dw $ff0a
+00fd37 6572
+00fd38 6966
+00fd39 6c6c
+00fd3a 742d
+00fd3b 6269 .db "refill-tib"
+00fd3c fd2b .dw VE_HEAD
+ .set VE_HEAD = VE_REFILLTIB
+ XT_REFILLTIB:
+00fd3d f000 .dw DO_COLON
+ PFA_REFILLTIB:
+ .endif
+00fd3e fd59 .dw XT_TIB
+00fd3f f045 .dw XT_DOLITERAL
+00fd40 005a .dw TIB_SIZE
+00fd41 f8ab .dw XT_ACCEPT
+00fd42 fd5f .dw XT_NUMBERTIB
+00fd43 f092 .dw XT_STORE
+00fd44 f165 .dw XT_ZERO
+00fd45 f598 .dw XT_TO_IN
+00fd46 f092 .dw XT_STORE
+00fd47 f15c .dw XT_TRUE ; -1
+00fd48 f025 .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:
+00fd49 ff0a .dw $FF0A
+00fd4a 6f73
+00fd4b 7275
+00fd4c 6563
+00fd4d 742d
+00fd4e 6269 .db "source-tib"
+00fd4f fd36 .dw VE_HEAD
+ .set VE_HEAD = VE_SOURCETIB
+ XT_SOURCETIB:
+00fd50 f000 .dw DO_COLON
+ PFA_SOURCETIB:
+ .endif
+00fd51 fd59 .dw XT_TIB
+00fd52 fd5f .dw XT_NUMBERTIB
+00fd53 f08a .dw XT_FETCH
+00fd54 f025 .dw XT_EXIT
+
+ ; ( -- addr )
+ ; System Variable
+ ; terminal input buffer address
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_TIB:
+00fd55 ff03 .dw $ff03
+00fd56 6974
+00fd57 0062 .db "tib",0
+00fd58 fd49 .dw VE_HEAD
+ .set VE_HEAD = VE_TIB
+ XT_TIB:
+00fd59 f053 .dw PFA_DOVARIABLE
+ PFA_TIB:
+00fd5a 0285 .dw ram_tib
+ .dseg
+000285 ram_tib: .byte TIB_SIZE
+ .cseg
+ .endif
+
+ ; ( -- addr )
+ ; System Variable
+ ; variable holding the number of characters in TIB
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_NUMBERTIB:
+00fd5b ff04 .dw $ff04
+00fd5c 7423
+00fd5d 6269 .db "#tib"
+00fd5e fd55 .dw VE_HEAD
+ .set VE_HEAD = VE_NUMBERTIB
+ XT_NUMBERTIB:
+00fd5f f053 .dw PFA_DOVARIABLE
+ PFA_NUMBERTIB:
+00fd60 02df .dw ram_sharptib
+ .dseg
+0002df ram_sharptib: .byte 2
+ .cseg
+ .endif
+
+ .include "words/init-ram.asm"
+
+ ; Tools
+ ; copy len cells from eeprom to ram
+ VE_EE2RAM:
+00fd61 ff06 .dw $ff06
+00fd62 6565
+00fd63 723e
+00fd64 6d61 .db "ee>ram"
+00fd65 fd5b .dw VE_HEAD
+ .set VE_HEAD = VE_EE2RAM
+ XT_EE2RAM:
+00fd66 f000 .dw DO_COLON
+ PFA_EE2RAM: ; ( -- )
+00fd67 f165 .dw XT_ZERO
+00fd68 f2ac .dw XT_DODO
+ PFA_EE2RAM_1:
+ ; ( -- e-addr r-addr )
+00fd69 f0e0 .dw XT_OVER
+00fd6a f370 .dw XT_FETCHE
+00fd6b f0e0 .dw XT_OVER
+00fd6c f092 .dw XT_STORE
+00fd6d f578 .dw XT_CELLPLUS
+00fd6e f0d5 .dw XT_SWAP
+00fd6f f578 .dw XT_CELLPLUS
+00fd70 f0d5 .dw XT_SWAP
+00fd71 f2da .dw XT_DOLOOP
+00fd72 fd69 .dw PFA_EE2RAM_1
+ PFA_EE2RAM_2:
+00fd73 f588 .dw XT_2DROP
+00fd74 f025 .dw XT_EXIT
+
+ ; ( -- )
+ ; Tools
+ ; setup the default user area from eeprom
+ VE_INIT_RAM:
+00fd75 ff08 .dw $ff08
+00fd76 6e69
+00fd77 7469
+00fd78 722d
+00fd79 6d61 .db "init-ram"
+00fd7a fd61 .dw VE_HEAD
+ .set VE_HEAD = VE_INIT_RAM
+ XT_INIT_RAM:
+00fd7b f000 .dw DO_COLON
+ PFA_INI_RAM: ; ( -- )
+00fd7c f045 .dw XT_DOLITERAL
+00fd7d 00a8 .dw EE_INITUSER
+00fd7e f313 .dw XT_UP_FETCH
+00fd7f f045 .dw XT_DOLITERAL
+00fd80 0022 .dw SYSUSERSIZE
+00fd81 f215 .dw XT_2SLASH
+00fd82 fd66 .dw XT_EE2RAM
+00fd83 f025 .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:
+00fd84 ff06 .dw $ff06
+00fd85 6f62
+00fd86 6e75
+00fd87 7364 .db "bounds"
+00fd88 fd75 .dw VE_HEAD
+ .set VE_HEAD = VE_BOUNDS
+ XT_BOUNDS:
+00fd89 f000 .dw DO_COLON
+ PFA_BOUNDS:
+ .endif
+00fd8a f0e0 .dw XT_OVER
+00fd8b f1ae .dw XT_PLUS
+00fd8c f0d5 .dw XT_SWAP
+00fd8d f025 .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:
+00fd8e ff03 .dw $ff03
+00fd8f 3e73
+00fd90 0064 .db "s>d",0
+00fd91 fd84 .dw VE_HEAD
+ .set VE_HEAD = VE_S2D
+ XT_S2D:
+00fd92 f000 .dw DO_COLON
+ PFA_S2D:
+ .endif
+00fd93 f0c2 .dw XT_DUP
+00fd94 f132 .dw XT_ZEROLESS
+00fd95 f025 .dw XT_EXIT
+ .include "words/to-body.asm"
+
+ ; Core
+ ; get body from XT
+ VE_TO_BODY:
+00fd96 ff05 .dw $ff05
+00fd97 623e
+00fd98 646f
+00fd99 0079 .db ">body",0
+00fd9a fd8e .dw VE_HEAD
+ .set VE_HEAD = VE_TO_BODY
+ XT_TO_BODY:
+00fd9b f241 .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:
+00fd9c 0008 .dw $0008
+00fd9d 6c32
+00fd9e 7469
+00fd9f 7265
+00fda0 6c61 .db "2literal"
+00fda1 fd96 .dw VE_HEAD
+ .set VE_HEAD = VE_2LITERAL
+ XT_2LITERAL:
+00fda2 f000 .dw DO_COLON
+ PFA_2LITERAL:
+ .endif
+00fda3 f0d5 .dw XT_SWAP
+00fda4 021c .dw XT_LITERAL
+00fda5 021c .dw XT_LITERAL
+00fda6 f025 .dw XT_EXIT
+ .include "words/equal.asm"
+
+ ; Compare
+ ; compares two values for equality
+ VE_EQUAL:
+00fda7 ff01 .dw $ff01
+00fda8 003d .db "=",0
+00fda9 fd9c .dw VE_HEAD
+ .set VE_HEAD = VE_EQUAL
+ XT_EQUAL:
+00fdaa f000 .dw DO_COLON
+ PFA_EQUAL:
+00fdab f1a4 .dw XT_MINUS
+00fdac f12b .dw XT_ZEROEQUAL
+00fdad f025 .dw XT_EXIT
+ .include "words/num-constants.asm"
+
+ .endif
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_ONE:
+00fdae ff01 .dw $ff01
+00fdaf 0031 .db "1",0
+00fdb0 fda7 .dw VE_HEAD
+ .set VE_HEAD = VE_ONE
+ XT_ONE:
+00fdb1 f053 .dw PFA_DOVARIABLE
+ PFA_ONE:
+ .endif
+00fdb2 0001 .DW 1
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_TWO:
+00fdb3 ff01 .dw $ff01
+00fdb4 0032 .db "2",0
+00fdb5 fdae .dw VE_HEAD
+ .set VE_HEAD = VE_TWO
+ XT_TWO:
+00fdb6 f053 .dw PFA_DOVARIABLE
+ PFA_TWO:
+ .endif
+00fdb7 0002 .DW 2
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_MINUSONE:
+00fdb8 ff02 .dw $ff02
+00fdb9 312d .db "-1"
+00fdba fdb3 .dw VE_HEAD
+ .set VE_HEAD = VE_MINUSONE
+ XT_MINUSONE:
+00fdbb f053 .dw PFA_DOVARIABLE
+ PFA_MINUSONE:
+ .endif
+00fdbc 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"
+000072 ff ff
+ ; some configs
+000074 59 05 CFG_DP: .dw DPSTART ; Dictionary Pointer
+000076 e1 02 EE_HERE: .dw HERESTART ; Memory Allocation
+000078 cc 00 EE_EHERE: .dw EHERESTART ; EEProm Memory Allocation
+00007a 6d 04 CFG_WLSCOPE: .dw XT_GET_CURRENT ; default wordlist scope
+00007c 9a 00 CFG_FORTHRECOGNIZER: .dw CFG_RECOGNIZERLISTLEN ; Recognizer word set
+ ; LEAVE stack is between data stack and return stack.
+00007e b0 21 CFG_LP0: .dw stackstart+1
+000080 4b 05 CFG_TURNKEY: .dw XT_APPLTURNKEY ; TURNKEY
+000082 4c f5 CFG_ENVIRONMENT:.dw VE_ENVHEAD ; environmental queries
+000084 86 00 CFG_CURRENT: .dw CFG_FORTHWORDLIST ; forth-wordlist
+000086 b8 fd CFG_FORTHWORDLIST:.dw VE_HEAD ; pre-defined (compiled in) wordlist
+ CFG_ORDERLISTLEN:
+000088 01 00 .dw 1
+ CFG_ORDERLIST: ; list of wordlist id, exactly numwordlist entries
+00008a 86 00 .dw CFG_FORTHWORDLIST ; get/set-order
+00008c .byte (NUMWORDLISTS-1)*CELLSIZE ; one slot is already used
+ CFG_RECOGNIZERLISTLEN:
+00009a 02 00 .dw 2
+ CFG_RECOGNIZERLIST:
+00009c 3e fb .dw XT_REC_FIND
+00009e 2a fb .dw XT_REC_NUM
+0000a0 .byte (NUMRECOGNIZERS-2)*CELLSIZE ; two slots are already used
+
+ EE_STOREI:
+0000a4 8f f3 .dw XT_DO_STOREI ; Store a cell into flash
+
+ ; MARKER saves everything up to here. Nothing beyond gets saved
+ EE_MARKER:
+0000a6 a6 00 .dw EE_MARKER
+
+ ; default user area
+ EE_INITUSER:
+0000a8 00 00 .dw 0 ; USER_STATE
+0000aa 00 00 .dw 0 ; USER_FOLLOWER
+0000ac ff 21 .dw rstackstart ; USER_RP
+0000ae af 21 .dw stackstart ; USER_SP0
+0000b0 af 21 .dw stackstart ; USER_SP
+
+0000b2 00 00 .dw 0 ; USER_HANDLER
+0000b4 0a 00 .dw 10 ; USER_BASE
+
+0000b6 e1 00 .dw XT_TX ; USER_EMIT
+0000b8 ef 00 .dw XT_TXQ ; USER_EMITQ
+0000ba b6 00 .dw XT_RX ; USER_KEY
+0000bc d1 00 .dw XT_RXQ ; USER_KEYQ
+0000be 50 fd .dw XT_SOURCETIB ; USER_SOURCE
+0000c0 00 00 .dw 0 ; USER_G_IN
+0000c2 3d fd .dw XT_REFILLTIB ; USER_REFILL
+0000c4 04 fa .dw XT_DEFAULT_PROMPTOK
+0000c6 23 fa .dw XT_DEFAULT_PROMPTERROR
+0000c8 13 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:
+0000ca 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
+
+"ATmega1280" register use summary:
+r0 : 25 r1 : 5 r2 : 9 r3 : 12 r4 : 4 r5 : 1 r6 : 0 r7 : 0
+r8 : 0 r9 : 0 r10: 1 r11: 6 r12: 0 r13: 0 r14: 22 r15: 20
+r16: 80 r17: 61 r18: 52 r19: 37 r20: 13 r21: 38 r22: 11 r23: 3
+r24: 193 r25: 136 r26: 28 r27: 17 r28: 7 r29: 4 r30: 85 r31: 47
+x : 4 y : 205 z : 48
+Registers used: 29 out of 35 (82.9%)
+
+"ATmega1280" 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 : 0
+clc : 2 clh : 0 cli : 7 cln : 0 clr : 22 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 : 18 inc : 3
+jmp : 10 ld : 136 ldd : 4 ldi : 41 lds : 1 lpm : 0
+lsl : 14 lsr : 2 mov : 16 movw : 65 mul : 5 muls : 1
+mulsu : 2 neg : 0 nop : 0 or : 9 ori : 2 out : 27
+pop : 45 push : 39 rcall : 69 ret : 6 reti : 1 rjmp : 102
+rol : 32 ror : 6 sbc : 9 sbci : 3 sbi : 8 sbic : 3
+sbis : 0 sbiw : 14 sbr : 0 sbrc : 5 sbrs : 4 sec : 1
+seh : 0 sei : 1 sen : 0 ser : 4 ses : 0 set : 0
+sev : 0 sez : 0 sleep : 0 spm : 2 st : 76 std : 8
+sts : 1 sub : 6 subi : 3 swap : 0 tst : 0 wdr : 0
+
+Instructions used: 71 out of 114 (62.3%)
+
+"ATmega1280" memory use summary [bytes]:
+Segment Begin End Code Data Used Size Use%
+---------------------------------------------------------------
+[.cseg] 0x000000 0x01fb7a 2076 14620 16696 131072 12.7%
+[.dseg] 0x000200 0x0002e1 0 225 225 8192 2.7%
+[.eseg] 0x000000 0x0000cc 0 204 204 4096 5.0%
+
+Assembly complete, 0 errors, 8 warnings
diff --git a/amforth-6.5/appl/arduino/mega128.map b/amforth-6.5/appl/arduino/mega128.map
new file mode 100644
index 0000000..cc31644
--- /dev/null
+++ b/amforth-6.5/appl/arduino/mega128.map
@@ -0,0 +1,2715 @@
+
+AVRASM ver. 2.1.52 mega128.asm Sun Apr 30 20:10:13 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 00000003
+EQU UDR3 00000136
+EQU UBRR3L 00000134
+EQU UBRR3H 00000135
+EQU UCSR3C 00000132
+EQU UCSR3B 00000131
+EQU UCSR3A 00000130
+EQU OCR5CL 0000012c
+EQU OCR5CH 0000012d
+EQU OCR5BL 0000012a
+EQU OCR5BH 0000012b
+EQU OCR5AL 00000128
+EQU OCR5AH 00000129
+EQU ICR5H 00000127
+EQU ICR5L 00000126
+EQU TCNT5L 00000124
+EQU TCNT5H 00000125
+EQU TCCR5C 00000122
+EQU TCCR5B 00000121
+EQU TCCR5A 00000120
+EQU PORTL 0000010b
+EQU DDRL 0000010a
+EQU PINL 00000109
+EQU PORTK 00000108
+EQU DDRK 00000107
+EQU PINK 00000106
+EQU PORTJ 00000105
+EQU DDRJ 00000104
+EQU PINJ 00000103
+EQU PORTH 00000102
+EQU DDRH 00000101
+EQU PINH 00000100
+EQU UDR2 000000d6
+EQU UBRR2L 000000d4
+EQU UBRR2H 000000d5
+EQU UCSR2C 000000d2
+EQU UCSR2B 000000d1
+EQU UCSR2A 000000d0
+EQU UDR1 000000ce
+EQU UBRR1L 000000cc
+EQU UBRR1H 000000cd
+EQU UCSR1C 000000ca
+EQU UCSR1B 000000c9
+EQU UCSR1A 000000c8
+EQU UDR0 000000c6
+EQU UBRR0L 000000c4
+EQU UBRR0H 000000c5
+EQU UCSR0C 000000c2
+EQU UCSR0B 000000c1
+EQU UCSR0A 000000c0
+EQU TWAMR 000000bd
+EQU TWCR 000000bc
+EQU TWDR 000000bb
+EQU TWAR 000000ba
+EQU TWSR 000000b9
+EQU TWBR 000000b8
+EQU ASSR 000000b6
+EQU OCR2B 000000b4
+EQU OCR2A 000000b3
+EQU TCNT2 000000b2
+EQU TCCR2B 000000b1
+EQU TCCR2A 000000b0
+EQU OCR4CL 000000ac
+EQU OCR4CH 000000ad
+EQU OCR4BL 000000aa
+EQU OCR4BH 000000ab
+EQU OCR4AL 000000a8
+EQU OCR4AH 000000a9
+EQU ICR4L 000000a6
+EQU ICR4H 000000a7
+EQU TCNT4L 000000a4
+EQU TCNT4H 000000a5
+EQU TCCR4C 000000a2
+EQU TCCR4B 000000a1
+EQU TCCR4A 000000a0
+EQU OCR3CL 0000009c
+EQU OCR3CH 0000009d
+EQU OCR3BL 0000009a
+EQU OCR3BH 0000009b
+EQU OCR3AL 00000098
+EQU OCR3AH 00000099
+EQU ICR3L 00000096
+EQU ICR3H 00000097
+EQU TCNT3L 00000094
+EQU TCNT3H 00000095
+EQU TCCR3C 00000092
+EQU TCCR3B 00000091
+EQU TCCR3A 00000090
+EQU OCR1CL 0000008c
+EQU OCR1CH 0000008d
+EQU OCR1BL 0000008a
+EQU OCR1BH 0000008b
+EQU OCR1AL 00000088
+EQU OCR1AH 00000089
+EQU ICR1L 00000086
+EQU ICR1H 00000087
+EQU TCNT1L 00000084
+EQU TCNT1H 00000085
+EQU TCCR1C 00000082
+EQU TCCR1B 00000081
+EQU TCCR1A 00000080
+EQU DIDR1 0000007f
+EQU DIDR0 0000007e
+EQU DIDR2 0000007d
+EQU ADMUX 0000007c
+EQU ADCSRB 0000007b
+EQU ADCSRA 0000007a
+EQU ADCH 00000079
+EQU ADCL 00000078
+EQU XMCRB 00000075
+EQU XMCRA 00000074
+EQU TIMSK5 00000073
+EQU TIMSK4 00000072
+EQU TIMSK3 00000071
+EQU TIMSK2 00000070
+EQU TIMSK1 0000006f
+EQU TIMSK0 0000006e
+EQU PCMSK2 0000006d
+EQU PCMSK1 0000006c
+EQU PCMSK0 0000006b
+EQU EICRB 0000006a
+EQU EICRA 00000069
+EQU PCICR 00000068
+EQU OSCCAL 00000066
+EQU PRR1 00000065
+EQU PRR0 00000064
+EQU CLKPR 00000061
+EQU WDTCSR 00000060
+EQU SREG 0000003f
+EQU SPL 0000003d
+EQU SPH 0000003e
+EQU EIND 0000003c
+EQU RAMPZ 0000003b
+EQU SPMCSR 00000037
+EQU MCUCR 00000035
+EQU MCUSR 00000034
+EQU SMCR 00000033
+EQU OCDR 00000031
+EQU ACSR 00000030
+EQU SPDR 0000002e
+EQU SPSR 0000002d
+EQU SPCR 0000002c
+EQU GPIOR2 0000002b
+EQU GPIOR1 0000002a
+EQU OCR0B 00000028
+EQU OCR0A 00000027
+EQU TCNT0 00000026
+EQU TCCR0B 00000025
+EQU TCCR0A 00000024
+EQU GTCCR 00000023
+EQU EEARH 00000022
+EQU EEARL 00000021
+EQU EEDR 00000020
+EQU EECR 0000001f
+EQU GPIOR0 0000001e
+EQU EIMSK 0000001d
+EQU EIFR 0000001c
+EQU PCIFR 0000001b
+EQU TIFR5 0000001a
+EQU TIFR4 00000019
+EQU TIFR3 00000018
+EQU TIFR2 00000017
+EQU TIFR1 00000016
+EQU TIFR0 00000015
+EQU PORTG 00000014
+EQU DDRG 00000013
+EQU PING 00000012
+EQU PORTF 00000011
+EQU DDRF 00000010
+EQU PINF 0000000f
+EQU PORTE 0000000e
+EQU DDRE 0000000d
+EQU PINE 0000000c
+EQU PORTD 0000000b
+EQU DDRD 0000000a
+EQU PIND 00000009
+EQU PORTC 00000008
+EQU DDRC 00000007
+EQU PINC 00000006
+EQU PORTB 00000005
+EQU DDRB 00000004
+EQU PINB 00000003
+EQU PORTA 00000002
+EQU DDRA 00000001
+EQU PINA 00000000
+EQU ACME 00000006
+EQU ACIS0 00000000
+EQU ACIS1 00000001
+EQU ACIC 00000002
+EQU ACIE 00000003
+EQU ACI 00000004
+EQU ACO 00000005
+EQU ACBG 00000006
+EQU ACD 00000007
+EQU AIN0D 00000000
+EQU AIN1D 00000001
+EQU UDR0_0 00000000
+EQU UDR0_1 00000001
+EQU UDR0_2 00000002
+EQU UDR0_3 00000003
+EQU UDR0_4 00000004
+EQU UDR0_5 00000005
+EQU UDR0_6 00000006
+EQU UDR0_7 00000007
+EQU MPCM0 00000000
+EQU U2X0 00000001
+EQU UPE0 00000002
+EQU DOR0 00000003
+EQU FE0 00000004
+EQU UDRE0 00000005
+EQU TXC0 00000006
+EQU RXC0 00000007
+EQU TXB80 00000000
+EQU RXB80 00000001
+EQU UCSZ02 00000002
+EQU TXEN0 00000003
+EQU RXEN0 00000004
+EQU UDRIE0 00000005
+EQU TXCIE0 00000006
+EQU RXCIE0 00000007
+EQU UCPOL0 00000000
+EQU UCSZ00 00000001
+EQU UCPHA0 00000001
+EQU UCSZ01 00000002
+EQU UDORD0 00000002
+EQU USBS0 00000003
+EQU UPM00 00000004
+EQU UPM01 00000005
+EQU UMSEL00 00000006
+EQU UMSEL0 00000006
+EQU UMSEL01 00000007
+EQU UMSEL1 00000007
+EQU UBRR8 00000000
+EQU UBRR9 00000001
+EQU UBRR10 00000002
+EQU UBRR11 00000003
+EQU _UBRR0 00000000
+EQU _UBRR1 00000001
+EQU UBRR2 00000002
+EQU UBRR3 00000003
+EQU UBRR4 00000004
+EQU UBRR5 00000005
+EQU UBRR6 00000006
+EQU UBRR7 00000007
+EQU TWAM0 00000001
+EQU TWAMR0 00000001
+EQU TWAM1 00000002
+EQU TWAMR1 00000002
+EQU TWAM2 00000003
+EQU TWAMR2 00000003
+EQU TWAM3 00000004
+EQU TWAMR3 00000004
+EQU TWAM4 00000005
+EQU TWAMR4 00000005
+EQU TWAM5 00000006
+EQU TWAMR5 00000006
+EQU TWAM6 00000007
+EQU TWAMR6 00000007
+EQU TWBR0 00000000
+EQU TWBR1 00000001
+EQU TWBR2 00000002
+EQU TWBR3 00000003
+EQU TWBR4 00000004
+EQU TWBR5 00000005
+EQU TWBR6 00000006
+EQU TWBR7 00000007
+EQU TWIE 00000000
+EQU TWEN 00000002
+EQU TWWC 00000003
+EQU TWSTO 00000004
+EQU TWSTA 00000005
+EQU TWEA 00000006
+EQU TWINT 00000007
+EQU TWPS0 00000000
+EQU TWPS1 00000001
+EQU TWS3 00000003
+EQU TWS4 00000004
+EQU TWS5 00000005
+EQU TWS6 00000006
+EQU TWS7 00000007
+EQU TWD0 00000000
+EQU TWD1 00000001
+EQU TWD2 00000002
+EQU TWD3 00000003
+EQU TWD4 00000004
+EQU TWD5 00000005
+EQU TWD6 00000006
+EQU TWD7 00000007
+EQU TWGCE 00000000
+EQU TWA0 00000001
+EQU TWA1 00000002
+EQU TWA2 00000003
+EQU TWA3 00000004
+EQU TWA4 00000005
+EQU TWA5 00000006
+EQU TWA6 00000007
+EQU SPDR0 00000000
+EQU SPDR1 00000001
+EQU SPDR2 00000002
+EQU SPDR3 00000003
+EQU SPDR4 00000004
+EQU SPDR5 00000005
+EQU SPDR6 00000006
+EQU SPDR7 00000007
+EQU SPI2X 00000000
+EQU WCOL 00000006
+EQU SPIF 00000007
+EQU SPR0 00000000
+EQU SPR1 00000001
+EQU CPHA 00000002
+EQU CPOL 00000003
+EQU MSTR 00000004
+EQU DORD 00000005
+EQU SPE 00000006
+EQU SPIE 00000007
+EQU PORTA0 00000000
+EQU PA0 00000000
+EQU PORTA1 00000001
+EQU PA1 00000001
+EQU PORTA2 00000002
+EQU PA2 00000002
+EQU PORTA3 00000003
+EQU PA3 00000003
+EQU PORTA4 00000004
+EQU PA4 00000004
+EQU PORTA5 00000005
+EQU PA5 00000005
+EQU PORTA6 00000006
+EQU PA6 00000006
+EQU PORTA7 00000007
+EQU PA7 00000007
+EQU DDA0 00000000
+EQU DDA1 00000001
+EQU DDA2 00000002
+EQU DDA3 00000003
+EQU DDA4 00000004
+EQU DDA5 00000005
+EQU DDA6 00000006
+EQU DDA7 00000007
+EQU PINA0 00000000
+EQU PINA1 00000001
+EQU PINA2 00000002
+EQU PINA3 00000003
+EQU PINA4 00000004
+EQU PINA5 00000005
+EQU PINA6 00000006
+EQU PINA7 00000007
+EQU PORTB0 00000000
+EQU PB0 00000000
+EQU PORTB1 00000001
+EQU PB1 00000001
+EQU PORTB2 00000002
+EQU PB2 00000002
+EQU PORTB3 00000003
+EQU PB3 00000003
+EQU PORTB4 00000004
+EQU PB4 00000004
+EQU PORTB5 00000005
+EQU PB5 00000005
+EQU PORTB6 00000006
+EQU PB6 00000006
+EQU PORTB7 00000007
+EQU PB7 00000007
+EQU DDB0 00000000
+EQU DDB1 00000001
+EQU DDB2 00000002
+EQU DDB3 00000003
+EQU DDB4 00000004
+EQU DDB5 00000005
+EQU DDB6 00000006
+EQU DDB7 00000007
+EQU PINB0 00000000
+EQU PINB1 00000001
+EQU PINB2 00000002
+EQU PINB3 00000003
+EQU PINB4 00000004
+EQU PINB5 00000005
+EQU PINB6 00000006
+EQU PINB7 00000007
+EQU PORTC0 00000000
+EQU PC0 00000000
+EQU PORTC1 00000001
+EQU PC1 00000001
+EQU PORTC2 00000002
+EQU PC2 00000002
+EQU PORTC3 00000003
+EQU PC3 00000003
+EQU PORTC4 00000004
+EQU PC4 00000004
+EQU PORTC5 00000005
+EQU PC5 00000005
+EQU PORTC6 00000006
+EQU PC6 00000006
+EQU PORTC7 00000007
+EQU PC7 00000007
+EQU DDC0 00000000
+EQU DDC1 00000001
+EQU DDC2 00000002
+EQU DDC3 00000003
+EQU DDC4 00000004
+EQU DDC5 00000005
+EQU DDC6 00000006
+EQU DDC7 00000007
+EQU PINC0 00000000
+EQU PINC1 00000001
+EQU PINC2 00000002
+EQU PINC3 00000003
+EQU PINC4 00000004
+EQU PINC5 00000005
+EQU PINC6 00000006
+EQU PINC7 00000007
+EQU PORTD0 00000000
+EQU PD0 00000000
+EQU PORTD1 00000001
+EQU PD1 00000001
+EQU PORTD2 00000002
+EQU PD2 00000002
+EQU PORTD3 00000003
+EQU PD3 00000003
+EQU PORTD4 00000004
+EQU PD4 00000004
+EQU PORTD5 00000005
+EQU PD5 00000005
+EQU PORTD6 00000006
+EQU PD6 00000006
+EQU PORTD7 00000007
+EQU PD7 00000007
+EQU DDD0 00000000
+EQU DDD1 00000001
+EQU DDD2 00000002
+EQU DDD3 00000003
+EQU DDD4 00000004
+EQU DDD5 00000005
+EQU DDD6 00000006
+EQU DDD7 00000007
+EQU PIND0 00000000
+EQU PIND1 00000001
+EQU PIND2 00000002
+EQU PIND3 00000003
+EQU PIND4 00000004
+EQU PIND5 00000005
+EQU PIND6 00000006
+EQU PIND7 00000007
+EQU PORTE0 00000000
+EQU PE0 00000000
+EQU PORTE1 00000001
+EQU PE1 00000001
+EQU PORTE2 00000002
+EQU PE2 00000002
+EQU PORTE3 00000003
+EQU PE3 00000003
+EQU PORTE4 00000004
+EQU PE4 00000004
+EQU PORTE5 00000005
+EQU PE5 00000005
+EQU PORTE6 00000006
+EQU PE6 00000006
+EQU PORTE7 00000007
+EQU PE7 00000007
+EQU DDE0 00000000
+EQU DDE1 00000001
+EQU DDE2 00000002
+EQU DDE3 00000003
+EQU DDE4 00000004
+EQU DDE5 00000005
+EQU DDE6 00000006
+EQU DDE7 00000007
+EQU PINE0 00000000
+EQU PINE1 00000001
+EQU PINE2 00000002
+EQU PINE3 00000003
+EQU PINE4 00000004
+EQU PINE5 00000005
+EQU PINE6 00000006
+EQU PINE7 00000007
+EQU PORTF0 00000000
+EQU PF0 00000000
+EQU PORTF1 00000001
+EQU PF1 00000001
+EQU PORTF2 00000002
+EQU PF2 00000002
+EQU PORTF3 00000003
+EQU PF3 00000003
+EQU PORTF4 00000004
+EQU PF4 00000004
+EQU PORTF5 00000005
+EQU PF5 00000005
+EQU PORTF6 00000006
+EQU PF6 00000006
+EQU PORTF7 00000007
+EQU PF7 00000007
+EQU DDF0 00000000
+EQU DDF1 00000001
+EQU DDF2 00000002
+EQU DDF3 00000003
+EQU DDF4 00000004
+EQU DDF5 00000005
+EQU DDF6 00000006
+EQU DDF7 00000007
+EQU PINF0 00000000
+EQU PINF1 00000001
+EQU PINF2 00000002
+EQU PINF3 00000003
+EQU PINF4 00000004
+EQU PINF5 00000005
+EQU PINF6 00000006
+EQU PINF7 00000007
+EQU PORTG0 00000000
+EQU PG0 00000000
+EQU PORTG1 00000001
+EQU PG1 00000001
+EQU PORTG2 00000002
+EQU PG2 00000002
+EQU PORTG3 00000003
+EQU PG3 00000003
+EQU PORTG4 00000004
+EQU PG4 00000004
+EQU PORTG5 00000005
+EQU PG5 00000005
+EQU DDG0 00000000
+EQU DDG1 00000001
+EQU DDG2 00000002
+EQU DDG3 00000003
+EQU DDG4 00000004
+EQU DDG5 00000005
+EQU PING0 00000000
+EQU PING1 00000001
+EQU PING2 00000002
+EQU PING3 00000003
+EQU PING4 00000004
+EQU PING5 00000005
+EQU PORTH0 00000000
+EQU PH0 00000000
+EQU PORTH1 00000001
+EQU PH1 00000001
+EQU PORTH2 00000002
+EQU PH2 00000002
+EQU PORTH3 00000003
+EQU PH3 00000003
+EQU PORTH4 00000004
+EQU PH4 00000004
+EQU PORTH5 00000005
+EQU PH5 00000005
+EQU PORTH6 00000006
+EQU PH6 00000006
+EQU PORTH7 00000007
+EQU PH7 00000007
+EQU DDH0 00000000
+EQU DDH1 00000001
+EQU DDH2 00000002
+EQU DDH3 00000003
+EQU DDH4 00000004
+EQU DDH5 00000005
+EQU DDH6 00000006
+EQU DDH7 00000007
+EQU PINH0 00000000
+EQU PINH1 00000001
+EQU PINH2 00000002
+EQU PINH3 00000003
+EQU PINH4 00000004
+EQU PINH5 00000005
+EQU PINH6 00000006
+EQU PINH7 00000007
+EQU PORTJ0 00000000
+EQU PJ0 00000000
+EQU PORTJ1 00000001
+EQU PJ1 00000001
+EQU PORTJ2 00000002
+EQU PJ2 00000002
+EQU PORTJ3 00000003
+EQU PJ3 00000003
+EQU PORTJ4 00000004
+EQU PJ4 00000004
+EQU PORTJ5 00000005
+EQU PJ5 00000005
+EQU PORTJ6 00000006
+EQU PJ6 00000006
+EQU PORTJ7 00000007
+EQU PJ7 00000007
+EQU DDJ0 00000000
+EQU DDJ1 00000001
+EQU DDJ2 00000002
+EQU DDJ3 00000003
+EQU DDJ4 00000004
+EQU DDJ5 00000005
+EQU DDJ6 00000006
+EQU DDJ7 00000007
+EQU PINJ0 00000000
+EQU PINJ1 00000001
+EQU PINJ2 00000002
+EQU PINJ3 00000003
+EQU PINJ4 00000004
+EQU PINJ5 00000005
+EQU PINJ6 00000006
+EQU PINJ7 00000007
+EQU PORTK0 00000000
+EQU PK0 00000000
+EQU PORTK1 00000001
+EQU PK1 00000001
+EQU PORTK2 00000002
+EQU PK2 00000002
+EQU PORTK3 00000003
+EQU PK3 00000003
+EQU PORTK4 00000004
+EQU PK4 00000004
+EQU PORTK5 00000005
+EQU PK5 00000005
+EQU PORTK6 00000006
+EQU PK6 00000006
+EQU PORTK7 00000007
+EQU PK7 00000007
+EQU DDK0 00000000
+EQU DDK1 00000001
+EQU DDK2 00000002
+EQU DDK3 00000003
+EQU DDK4 00000004
+EQU DDK5 00000005
+EQU DDK6 00000006
+EQU DDK7 00000007
+EQU PINK0 00000000
+EQU PINK1 00000001
+EQU PINK2 00000002
+EQU PINK3 00000003
+EQU PINK4 00000004
+EQU PINK5 00000005
+EQU PINK6 00000006
+EQU PINK7 00000007
+EQU PORTL0 00000000
+EQU PL0 00000000
+EQU PORTL1 00000001
+EQU PL1 00000001
+EQU PORTL2 00000002
+EQU PL2 00000002
+EQU PORTL3 00000003
+EQU PL3 00000003
+EQU PORTL4 00000004
+EQU PL4 00000004
+EQU PORTL5 00000005
+EQU PL5 00000005
+EQU PORTL6 00000006
+EQU PL6 00000006
+EQU PORTL7 00000007
+EQU PL7 00000007
+EQU DDL0 00000000
+EQU DDL1 00000001
+EQU DDL2 00000002
+EQU DDL3 00000003
+EQU DDL4 00000004
+EQU DDL5 00000005
+EQU DDL6 00000006
+EQU DDL7 00000007
+EQU PINL0 00000000
+EQU PINL1 00000001
+EQU PINL2 00000002
+EQU PINL3 00000003
+EQU PINL4 00000004
+EQU PINL5 00000005
+EQU PINL6 00000006
+EQU PINL7 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 UDR1_0 00000000
+EQU UDR1_1 00000001
+EQU UDR1_2 00000002
+EQU UDR1_3 00000003
+EQU UDR1_4 00000004
+EQU UDR1_5 00000005
+EQU UDR1_6 00000006
+EQU UDR1_7 00000007
+EQU MPCM1 00000000
+EQU U2X1 00000001
+EQU UPE1 00000002
+EQU DOR1 00000003
+EQU FE1 00000004
+EQU UDRE1 00000005
+EQU TXC1 00000006
+EQU RXC1 00000007
+EQU TXB81 00000000
+EQU RXB81 00000001
+EQU UCSZ12 00000002
+EQU TXEN1 00000003
+EQU RXEN1 00000004
+EQU UDRIE1 00000005
+EQU TXCIE1 00000006
+EQU RXCIE1 00000007
+EQU UCPOL1 00000000
+EQU UCSZ10 00000001
+EQU UCPHA1 00000001
+EQU UCSZ11 00000002
+EQU UDORD1 00000002
+EQU USBS1 00000003
+EQU UPM10 00000004
+EQU UPM11 00000005
+EQU UMSEL10 00000006
+EQU UMSEL11 00000007
+EQU UBRR_8 00000000
+EQU UBRR_9 00000001
+EQU UBRR_10 00000002
+EQU UBRR_11 00000003
+EQU UBRR_0 00000000
+EQU UBRR_1 00000001
+EQU UBRR_2 00000002
+EQU UBRR_3 00000003
+EQU UBRR_4 00000004
+EQU UBRR_5 00000005
+EQU UBRR_6 00000006
+EQU UBRR_7 00000007
+EQU EEAR8 00000000
+EQU EEAR9 00000001
+EQU EEAR10 00000002
+EQU EEAR11 00000003
+EQU EEAR0 00000000
+EQU EEAR1 00000001
+EQU EEAR2 00000002
+EQU EEAR3 00000003
+EQU EEAR4 00000004
+EQU EEAR5 00000005
+EQU EEAR6 00000006
+EQU EEAR7 00000007
+EQU EEDR0 00000000
+EQU EEDR1 00000001
+EQU EEDR2 00000002
+EQU EEDR3 00000003
+EQU EEDR4 00000004
+EQU EEDR5 00000005
+EQU EEDR6 00000006
+EQU EEDR7 00000007
+EQU EERE 00000000
+EQU EEPE 00000001
+EQU EEMPE 00000002
+EQU EERIE 00000003
+EQU EEPM0 00000004
+EQU EEPM1 00000005
+EQU TOIE5 00000000
+EQU OCIE5A 00000001
+EQU OCIE5B 00000002
+EQU OCIE5C 00000003
+EQU ICIE5 00000005
+EQU TOV5 00000000
+EQU OCF5A 00000001
+EQU OCF5B 00000002
+EQU OCF5C 00000003
+EQU ICF5 00000005
+EQU WGM50 00000000
+EQU WGM51 00000001
+EQU COM5C0 00000002
+EQU COM5C1 00000003
+EQU COM5B0 00000004
+EQU COM5B1 00000005
+EQU COM5A0 00000006
+EQU COM5A1 00000007
+EQU CS50 00000000
+EQU CS51 00000001
+EQU CS52 00000002
+EQU WGM52 00000003
+EQU WGM53 00000004
+EQU ICES5 00000006
+EQU ICNC5 00000007
+EQU FOC5C 00000005
+EQU FOC5B 00000006
+EQU FOC5A 00000007
+EQU ICR5H0 00000000
+EQU ICR5H1 00000001
+EQU ICR5H2 00000002
+EQU ICR5H3 00000003
+EQU ICR5H4 00000004
+EQU ICR5H5 00000005
+EQU ICR5H6 00000006
+EQU ICR5H7 00000007
+EQU ICR5L0 00000000
+EQU ICR5L1 00000001
+EQU ICR5L2 00000002
+EQU ICR5L3 00000003
+EQU ICR5L4 00000004
+EQU ICR5L5 00000005
+EQU ICR5L6 00000006
+EQU ICR5L7 00000007
+EQU TOIE4 00000000
+EQU OCIE4A 00000001
+EQU OCIE4B 00000002
+EQU OCIE4C 00000003
+EQU ICIE4 00000005
+EQU TOV4 00000000
+EQU OCF4A 00000001
+EQU OCF4B 00000002
+EQU OCF4C 00000003
+EQU ICF4 00000005
+EQU WGM40 00000000
+EQU WGM41 00000001
+EQU COM4C0 00000002
+EQU COM4C1 00000003
+EQU COM4B0 00000004
+EQU COM4B1 00000005
+EQU COM4A0 00000006
+EQU COM4A1 00000007
+EQU CS40 00000000
+EQU CS41 00000001
+EQU CS42 00000002
+EQU WGM42 00000003
+EQU WGM43 00000004
+EQU ICES4 00000006
+EQU ICNC4 00000007
+EQU FOC4C 00000005
+EQU FOC4B 00000006
+EQU FOC4A 00000007
+EQU TOIE3 00000000
+EQU OCIE3A 00000001
+EQU OCIE3B 00000002
+EQU OCIE3C 00000003
+EQU ICIE3 00000005
+EQU TOV3 00000000
+EQU OCF3A 00000001
+EQU OCF3B 00000002
+EQU OCF3C 00000003
+EQU ICF3 00000005
+EQU WGM30 00000000
+EQU WGM31 00000001
+EQU COM3C0 00000002
+EQU COM3C1 00000003
+EQU COM3B0 00000004
+EQU COM3B1 00000005
+EQU COM3A0 00000006
+EQU COM3A1 00000007
+EQU CS30 00000000
+EQU CS31 00000001
+EQU CS32 00000002
+EQU WGM32 00000003
+EQU WGM33 00000004
+EQU ICES3 00000006
+EQU ICNC3 00000007
+EQU FOC3C 00000005
+EQU FOC3B 00000006
+EQU FOC3A 00000007
+EQU TOIE1 00000000
+EQU OCIE1A 00000001
+EQU OCIE1B 00000002
+EQU OCIE1C 00000003
+EQU ICIE1 00000005
+EQU TOV1 00000000
+EQU OCF1A 00000001
+EQU OCF1B 00000002
+EQU OCF1C 00000003
+EQU ICF1 00000005
+EQU WGM10 00000000
+EQU WGM11 00000001
+EQU COM1C0 00000002
+EQU COM1C1 00000003
+EQU COM1B0 00000004
+EQU COM1B1 00000005
+EQU COM1A0 00000006
+EQU COM1A1 00000007
+EQU CS10 00000000
+EQU CS11 00000001
+EQU CS12 00000002
+EQU WGM12 00000003
+EQU WGM13 00000004
+EQU ICES1 00000006
+EQU ICNC1 00000007
+EQU FOC1C 00000005
+EQU FOC1B 00000006
+EQU FOC1A 00000007
+EQU OCDR0 00000000
+EQU OCDR1 00000001
+EQU OCDR2 00000002
+EQU OCDR3 00000003
+EQU OCDR4 00000004
+EQU OCDR5 00000005
+EQU OCDR6 00000006
+EQU OCDR7 00000007
+EQU IDRD 00000007
+EQU JTD 00000007
+EQU JTRF 00000004
+EQU ISC00 00000000
+EQU ISC01 00000001
+EQU ISC10 00000002
+EQU ISC11 00000003
+EQU ISC20 00000004
+EQU ISC21 00000005
+EQU ISC30 00000006
+EQU ISC31 00000007
+EQU ISC40 00000000
+EQU ISC41 00000001
+EQU ISC50 00000002
+EQU ISC51 00000003
+EQU ISC60 00000004
+EQU ISC61 00000005
+EQU ISC70 00000006
+EQU ISC71 00000007
+EQU INT0 00000000
+EQU INT1 00000001
+EQU INT2 00000002
+EQU INT3 00000003
+EQU INT4 00000004
+EQU INT5 00000005
+EQU INT6 00000006
+EQU INT7 00000007
+EQU INTF0 00000000
+EQU INTF1 00000001
+EQU INTF2 00000002
+EQU INTF3 00000003
+EQU INTF4 00000004
+EQU INTF5 00000005
+EQU INTF6 00000006
+EQU INTF7 00000007
+EQU PCIE0 00000000
+EQU PCIE1 00000001
+EQU PCIE2 00000002
+EQU PCIF0 00000000
+EQU PCIF1 00000001
+EQU PCIF2 00000002
+EQU PCINT16 00000000
+EQU PCINT17 00000001
+EQU PCINT18 00000002
+EQU PCINT19 00000003
+EQU PCINT20 00000004
+EQU PCINT21 00000005
+EQU PCINT22 00000006
+EQU PCINT23 00000007
+EQU PCINT8 00000000
+EQU PCINT9 00000001
+EQU PCINT10 00000002
+EQU PCINT11 00000003
+EQU PCINT12 00000004
+EQU PCINT13 00000005
+EQU PCINT14 00000006
+EQU PCINT15 00000007
+EQU PCINT0 00000000
+EQU PCINT1 00000001
+EQU PCINT2 00000002
+EQU PCINT3 00000003
+EQU PCINT4 00000004
+EQU PCINT5 00000005
+EQU PCINT6 00000006
+EQU PCINT7 00000007
+EQU SREG_C 00000000
+EQU SREG_Z 00000001
+EQU SREG_N 00000002
+EQU SREG_V 00000003
+EQU SREG_S 00000004
+EQU SREG_H 00000005
+EQU SREG_T 00000006
+EQU SREG_I 00000007
+EQU IVCE 00000000
+EQU IVSEL 00000001
+EQU PUD 00000004
+EQU PORF 00000000
+EQU EXTRF 00000001
+EQU BORF 00000002
+EQU WDRF 00000003
+EQU SRW00 00000000
+EQU SRW01 00000001
+EQU SRW10 00000002
+EQU SRW11 00000003
+EQU SRL0 00000004
+EQU SRL1 00000005
+EQU SRL2 00000006
+EQU SRE 00000007
+EQU XMM0 00000000
+EQU XMM1 00000001
+EQU XMM2 00000002
+EQU XMBK 00000007
+EQU CAL0 00000000
+EQU CAL1 00000001
+EQU CAL2 00000002
+EQU CAL3 00000003
+EQU CAL4 00000004
+EQU CAL5 00000005
+EQU CAL6 00000006
+EQU CAL7 00000007
+EQU CLKPS0 00000000
+EQU CLKPS1 00000001
+EQU CLKPS2 00000002
+EQU CLKPS3 00000003
+EQU CLKPCE 00000007
+EQU SE 00000000
+EQU SM0 00000001
+EQU SM1 00000002
+EQU SM2 00000003
+EQU RAMPZ0 00000000
+EQU RAMPZ1 00000001
+EQU EIND0 00000000
+EQU GPIOR20 00000000
+EQU GPIOR21 00000001
+EQU GPIOR22 00000002
+EQU GPIOR23 00000003
+EQU GPIOR24 00000004
+EQU GPIOR25 00000005
+EQU GPIOR26 00000006
+EQU GPIOR27 00000007
+EQU GPIOR10 00000000
+EQU GPIOR11 00000001
+EQU GPIOR12 00000002
+EQU GPIOR13 00000003
+EQU GPIOR14 00000004
+EQU GPIOR15 00000005
+EQU GPIOR16 00000006
+EQU GPIOR17 00000007
+EQU GPIOR00 00000000
+EQU GPIOR01 00000001
+EQU GPIOR02 00000002
+EQU GPIOR03 00000003
+EQU GPIOR04 00000004
+EQU GPIOR05 00000005
+EQU GPIOR06 00000006
+EQU GPIOR07 00000007
+EQU PRUSART1 00000000
+EQU PRUSART2 00000001
+EQU PRUSART3 00000002
+EQU PRTIM3 00000003
+EQU PRTIM4 00000004
+EQU PRTIM5 00000005
+EQU PRADC 00000000
+EQU PRUSART0 00000001
+EQU PRSPI 00000002
+EQU PRTIM1 00000003
+EQU PRTIM0 00000005
+EQU PRTIM2 00000006
+EQU PRTWI 00000007
+EQU MUX0 00000000
+EQU MUX1 00000001
+EQU MUX2 00000002
+EQU MUX3 00000003
+EQU MUX4 00000004
+EQU ADLAR 00000005
+EQU REFS0 00000006
+EQU REFS1 00000007
+EQU ADPS0 00000000
+EQU ADPS1 00000001
+EQU ADPS2 00000002
+EQU ADIE 00000003
+EQU ADIF 00000004
+EQU ADATE 00000005
+EQU ADSC 00000006
+EQU ADEN 00000007
+EQU ADTS0 00000000
+EQU ADTS1 00000001
+EQU ADTS2 00000002
+EQU MUX5 00000003
+EQU ADCH0 00000000
+EQU ADCH1 00000001
+EQU ADCH2 00000002
+EQU ADCH3 00000003
+EQU ADCH4 00000004
+EQU ADCH5 00000005
+EQU ADCH6 00000006
+EQU ADCH7 00000007
+EQU ADCL0 00000000
+EQU ADCL1 00000001
+EQU ADCL2 00000002
+EQU ADCL3 00000003
+EQU ADCL4 00000004
+EQU ADCL5 00000005
+EQU ADCL6 00000006
+EQU ADCL7 00000007
+EQU ADC0D 00000000
+EQU ADC1D 00000001
+EQU ADC2D 00000002
+EQU ADC3D 00000003
+EQU ADC4D 00000004
+EQU ADC5D 00000005
+EQU ADC6D 00000006
+EQU ADC7D 00000007
+EQU ADC8D 00000000
+EQU ADC9D 00000001
+EQU ADC10D 00000002
+EQU ADC11D 00000003
+EQU ADC12D 00000004
+EQU ADC13D 00000005
+EQU ADC14D 00000006
+EQU ADC15D 00000007
+EQU SPMEN 00000000
+EQU PGERS 00000001
+EQU PGWRT 00000002
+EQU BLBSET 00000003
+EQU RWWSRE 00000004
+EQU SIGRD 00000005
+EQU RWWSB 00000006
+EQU SPMIE 00000007
+EQU UDR2_0 00000000
+EQU UDR2_1 00000001
+EQU UDR2_2 00000002
+EQU UDR2_3 00000003
+EQU UDR2_4 00000004
+EQU UDR2_5 00000005
+EQU UDR2_6 00000006
+EQU UDR2_7 00000007
+EQU MPCM2 00000000
+EQU U2X2 00000001
+EQU UPE2 00000002
+EQU DOR2 00000003
+EQU FE2 00000004
+EQU UDRE2 00000005
+EQU TXC2 00000006
+EQU RXC2 00000007
+EQU TXB82 00000000
+EQU RXB82 00000001
+EQU UCSZ22 00000002
+EQU TXEN2 00000003
+EQU RXEN2 00000004
+EQU UDRIE2 00000005
+EQU TXCIE2 00000006
+EQU RXCIE2 00000007
+EQU UCPOL2 00000000
+EQU UCSZ20 00000001
+EQU UCSZ21 00000002
+EQU USBS2 00000003
+EQU UPM20 00000004
+EQU UPM21 00000005
+EQU UMSEL20 00000006
+EQU UMSEL21 00000007
+EQU UBRR0 00000000
+EQU UBRR1 00000001
+EQU UDR3_0 00000000
+EQU UDR3_1 00000001
+EQU UDR3_2 00000002
+EQU UDR3_3 00000003
+EQU UDR3_4 00000004
+EQU UDR3_5 00000005
+EQU UDR3_6 00000006
+EQU UDR3_7 00000007
+EQU MPCM3 00000000
+EQU U2X3 00000001
+EQU UPE3 00000002
+EQU DOR3 00000003
+EQU FE3 00000004
+EQU UDRE3 00000005
+EQU TXC3 00000006
+EQU RXC3 00000007
+EQU TXB83 00000000
+EQU RXB83 00000001
+EQU UCSZ32 00000002
+EQU TXEN3 00000003
+EQU RXEN3 00000004
+EQU UDRIE3 00000005
+EQU TXCIE3 00000006
+EQU RXCIE3 00000007
+EQU UCPOL3 00000000
+EQU UCSZ30 00000001
+EQU UCSZ31 00000002
+EQU USBS3 00000003
+EQU UPM30 00000004
+EQU UPM31 00000005
+EQU UMSEL30 00000006
+EQU UMSEL31 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 0000ffff
+EQU IOEND 000001ff
+EQU SRAM_START 00000200
+EQU SRAM_SIZE 00002000
+EQU RAMEND 000021ff
+EQU XRAMEND 0000ffff
+EQU E2END 00000fff
+EQU EEPROMEND 00000fff
+EQU EEADRBITS 0000000c
+EQU NRWW_START_ADDR 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 INT3addr 00000008
+EQU INT4addr 0000000a
+EQU INT5addr 0000000c
+EQU INT6addr 0000000e
+EQU INT7addr 00000010
+EQU PCI0addr 00000012
+EQU PCI1addr 00000014
+EQU PCI2addr 00000016
+EQU WDTaddr 00000018
+EQU OC2Aaddr 0000001a
+EQU OC2Baddr 0000001c
+EQU OVF2addr 0000001e
+EQU ICP1addr 00000020
+EQU OC1Aaddr 00000022
+EQU OC1Baddr 00000024
+EQU OC1Caddr 00000026
+EQU OVF1addr 00000028
+EQU OC0Aaddr 0000002a
+EQU OC0Baddr 0000002c
+EQU OVF0addr 0000002e
+EQU SPIaddr 00000030
+EQU URXC0addr 00000032
+EQU UDRE0addr 00000034
+EQU UTXC0addr 00000036
+EQU ACIaddr 00000038
+EQU ADCCaddr 0000003a
+EQU ERDYaddr 0000003c
+EQU ICP3addr 0000003e
+EQU OC3Aaddr 00000040
+EQU OC3Baddr 00000042
+EQU OC3Caddr 00000044
+EQU OVF3addr 00000046
+EQU URXC1addr 00000048
+EQU UDRE1addr 0000004a
+EQU UTXC1addr 0000004c
+EQU TWIaddr 0000004e
+EQU SPMRaddr 00000050
+EQU ICP4addr 00000052
+EQU OC4Aaddr 00000054
+EQU OC4Baddr 00000056
+EQU OC4Caddr 00000058
+EQU OVF4addr 0000005a
+EQU ICP5addr 0000005c
+EQU OC5Aaddr 0000005e
+EQU OC5Baddr 00000060
+EQU OC5Caddr 00000062
+EQU OVF5addr 00000064
+EQU URXC2addr 00000066
+EQU UDRE2addr 00000068
+EQU UTXC2addr 0000006a
+EQU URXC3addr 0000006c
+EQU UDRE3addr 0000006e
+EQU UTXC3addr 00000070
+EQU INT_VECTORS_SIZE 00000072
+EQU ramstart 00000200
+EQU CELLSIZE 00000002
+SET WANT_ANALOG_COMPARATOR 00000000
+SET WANT_USART0 00000000
+SET WANT_TWI 00000000
+SET WANT_SPI 00000000
+SET WANT_PORTA 00000000
+SET WANT_PORTB 00000000
+SET WANT_PORTC 00000000
+SET WANT_PORTD 00000000
+SET WANT_PORTE 00000000
+SET WANT_PORTF 00000000
+SET WANT_PORTG 00000000
+SET WANT_PORTH 00000000
+SET WANT_PORTJ 00000000
+SET WANT_PORTK 00000000
+SET WANT_PORTL 00000000
+SET WANT_TIMER_COUNTER_0 00000000
+SET WANT_TIMER_COUNTER_2 00000000
+SET WANT_WATCHDOG 00000000
+SET WANT_USART1 00000000
+SET WANT_EEPROM 00000000
+SET WANT_TIMER_COUNTER_5 00000000
+SET WANT_TIMER_COUNTER_4 00000000
+SET WANT_TIMER_COUNTER_3 00000000
+SET WANT_TIMER_COUNTER_1 00000000
+SET WANT_JTAG 00000000
+SET WANT_EXTERNAL_INTERRUPT 00000000
+SET WANT_CPU 00000000
+SET WANT_AD_CONVERTER 00000000
+SET WANT_BOOT_LOAD 00000000
+SET WANT_USART2 00000000
+SET WANT_USART3 00000000
+EQU intvecsize 00000002
+EQU pclen 00000002
+CSEG isr 00000167
+EQU INTVECTORS 00000039
+CSEG mcu_info 00000071
+CSEG mcu_ramsize 00000071
+CSEG mcu_eepromsize 00000072
+CSEG mcu_maxdp 00000073
+CSEG mcu_numints 00000074
+CSEG mcu_name 00000075
+SET codestart 0000007b
+SET WANT_INTERRUPTS 00000001
+SET WANT_INTERRUPT_COUNTERS 00000000
+SET WANT_ISR_RX 00000001
+SET WANT_IGNORECASE 00000001
+SET WANT_UNIFIED 00000000
+SET TIB_SIZE 0000005a
+SET APPUSERSIZE 0000000a
+SET rstackstart 000021ff
+SET stackstart 000021af
+SET NUMWORDLISTS 00000008
+SET NUMRECOGNIZERS 00000004
+SET BAUD 00009600
+SET BAUD_MAXERROR 0000000a
+SET VE_HEAD 0000fdb8
+SET VE_ENVHEAD 0000f54c
+SET AMFORTH_RO_SEG 0000f000
+EQU F_CPU 00f42400
+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 00000032
+EQU UDREaddr 00000034
+EQU bm_USART_RXRD 00000080
+EQU bm_USART_TXRD 00000020
+EQU bm_ENABLE_TX 00000008
+EQU bm_ENABLE_RX 00000010
+EQU bm_ENABLE_INT_RX 00000080
+EQU bm_ENABLE_INT_TX 00000020
+EQU bm_USARTC_en 00000000
+EQU bm_ASYNC 00000000
+EQU bm_SYNC 00000040
+EQU bm_NO_PARITY 00000000
+EQU bm_EVEN_PARITY 00000020
+EQU bm_ODD_PARITY 00000030
+EQU bm_1STOPBIT 00000000
+EQU bm_2STOPBIT 00000008
+EQU bm_5BIT 00000000
+EQU bm_6BIT 00000002
+EQU bm_7BIT 00000004
+EQU bm_8BIT 00000006
+SET USART_C_VALUE 00000006
+SET USART_B_VALUE 00000098
+EQU usart_rx_size 00000010
+EQU usart_rx_mask 0000000f
+DSEG usart_rx_data 00000200
+DSEG usart_rx_in 00000210
+DSEG usart_rx_out 00000211
+CSEG VE_TO_RXBUF 0000007b
+CSEG XT_TO_RXBUF 00000081
+CSEG PFA_rx_tobuf 00000082
+CSEG DO_NEXT 0000f004
+CSEG VE_ISR_RX 00000092
+CSEG XT_ISR_RX 00000097
+CSEG DO_COLON 0000f000
+CSEG usart_rx_isr 00000098
+CSEG XT_DOLITERAL 0000f045
+CSEG XT_CFETCH 0000f0a9
+CSEG XT_DUP 0000f0c2
+CSEG XT_EQUAL 0000fdaa
+CSEG XT_DOCONDBRANCH 0000f03e
+CSEG usart_rx_isr1 000000a2
+CSEG XT_COLD 0000fa73
+CSEG XT_EXIT 0000f025
+CSEG XT_USART_INIT_RX_BUFFER 000000a4
+CSEG PFA_USART_INIT_RX_BUFFER 000000a5
+CSEG XT_INTSTORE 0000f4a1
+CSEG XT_ZERO 0000f165
+CSEG XT_FILL 0000f4e9
+CSEG VE_RX_BUFFER 000000b1
+CSEG XT_RX_BUFFER 000000b6
+CSEG PFA_RX_BUFFER 000000b7
+CSEG XT_RXQ_BUFFER 000000d1
+CSEG XT_PLUS 0000f1ae
+CSEG XT_SWAP 0000f0d5
+CSEG XT_1PLUS 0000f240
+CSEG XT_AND 0000f224
+CSEG XT_CSTORE 0000f09e
+CSEG VE_RXQ_BUFFER 000000cb
+CSEG PFA_RXQ_BUFFER 000000d2
+CSEG XT_PAUSE 0000fa6b
+CSEG XT_NOTEQUAL 0000f124
+SET XT_RX 000000b6
+SET XT_RXQ 000000d1
+SET XT_USART_INIT_RX 000000a4
+CSEG VE_TX_POLL 000000db
+CSEG XT_TX_POLL 000000e1
+CSEG PFA_TX_POLL 000000e2
+CSEG XT_TXQ_POLL 000000ef
+CSEG VE_TXQ_POLL 000000e9
+CSEG PFA_TXQ_POLL 000000f0
+SET XT_TX 000000e1
+SET XT_TXQ 000000ef
+SET XT_USART_INIT_TX 00000000
+CSEG VE_UBRR 000000f8
+CSEG XT_UBRR 000000fc
+CSEG PFA_DOVALUE1 0000f080
+CSEG PFA_UBRR 000000fd
+ESEG EE_UBRRVAL 000000ca
+CSEG XT_EDEFERFETCH 0000fbce
+CSEG XT_EDEFERSTORE 0000fbd8
+CSEG VE_USART 00000100
+CSEG XT_USART 00000105
+CSEG PFA_USART 00000106
+CSEG XT_BYTESWAP 0000f30a
+EQU OW_PORT 0000000e
+EQU OW_BIT 00000004
+SET OW_DDR 0000000d
+SET OW_PIN 0000000c
+CSEG VE_OW_RESET 0000011b
+CSEG XT_OW_RESET 00000121
+CSEG PFA_OW_RESET 00000122
+SET cycles 00000000
+SET loop_cycles 00000fa0
+CSEG VE_OW_SLOT 0000013f
+CSEG XT_OW_SLOT 00000145
+CSEG PFA_OW_SLOT 00000146
+CSEG PFA_OW_SLOT0 00000153
+SET AMFORTH_NRWW_SIZE 00001ffe
+SET corepc 00000167
+CSEG PFA_COLD 0000fa74
+ESEG intvec 00000000
+DSEG intcnt 00000212
+CSEG VE_MPLUS 0000017e
+CSEG XT_MPLUS 00000181
+CSEG PFA_MPLUS 00000182
+CSEG XT_S2D 0000fd92
+CSEG XT_DPLUS 0000f42f
+CSEG VE_UDSTAR 00000185
+CSEG XT_UDSTAR 00000189
+CSEG PFA_UDSTAR 0000018a
+CSEG XT_TO_R 0000f110
+CSEG XT_UMSTAR 0000f1f1
+CSEG XT_DROP 0000f0ea
+CSEG XT_R_FROM 0000f107
+CSEG XT_ROT 0000f0f2
+CSEG VE_UMAX 00000194
+CSEG XT_UMAX 00000198
+CSEG PFA_UMAX 00000199
+CSEG XT_2DUP 0000f57f
+CSEG XT_ULESS 0000f16d
+CSEG UMAX1 0000019e
+CSEG VE_UMIN 000001a0
+CSEG XT_UMIN 000001a4
+CSEG PFA_UMIN 000001a5
+CSEG XT_UGREATER 0000f178
+CSEG UMIN1 000001aa
+CSEG XT_IMMEDIATEQ 000001ac
+CSEG PFA_IMMEDIATEQ 000001ad
+CSEG XT_ZEROEQUAL 0000f12b
+CSEG IMMEDIATEQ1 000001b5
+CSEG XT_ONE 0000fdb1
+CSEG XT_TRUE 0000f15c
+CSEG VE_NAME2FLAGS 000001b7
+CSEG XT_NAME2FLAGS 000001be
+CSEG PFA_NAME2FLAGS 000001bf
+CSEG XT_FETCHI 0000f3e2
+CSEG VE_NEWEST 000001c4
+CSEG XT_NEWEST 000001c9
+CSEG PFA_DOVARIABLE 0000f053
+CSEG PFA_NEWEST 000001ca
+DSEG ram_newest 0000024b
+CSEG VE_LATEST 000001cb
+CSEG XT_LATEST 000001d0
+CSEG PFA_LATEST 000001d1
+DSEG ram_latest 0000024f
+CSEG VE_DOCREATE 000001d2
+CSEG XT_DOCREATE 000001d8
+CSEG PFA_DOCREATE 000001d9
+CSEG XT_PARSENAME 0000f9ce
+CSEG XT_WLSCOPE 0000032f
+CSEG XT_CELLPLUS 0000f578
+CSEG XT_STORE 0000f092
+CSEG XT_HEADER 00000314
+CSEG VE_BACKSLASH 000001e3
+CSEG XT_BACKSLASH 000001e6
+CSEG PFA_BACKSLASH 000001e7
+CSEG XT_SOURCE 0000f9b5
+CSEG XT_NIP 0000f101
+CSEG XT_TO_IN 0000f598
+CSEG VE_LPAREN 000001ec
+CSEG XT_LPAREN 000001ef
+CSEG PFA_LPAREN 000001f0
+CSEG XT_PARSE 0000f9a1
+CSEG XT_2DROP 0000f588
+CSEG VE_COMPILE 000001f5
+CSEG XT_COMPILE 000001fb
+CSEG PFA_COMPILE 000001fc
+CSEG XT_ICELLPLUS 0000fbc5
+CSEG XT_COMMA 00000206
+CSEG VE_COMMA 00000203
+CSEG PFA_COMMA 00000207
+CSEG XT_DP 0000f5c8
+CSEG XT_STOREI 0000f384
+CSEG XT_DOTO 0000fbb3
+CSEG PFA_DP 0000f5c9
+CSEG VE_BRACKETTICK 0000020e
+CSEG XT_BRACKETTICK 00000212
+CSEG PFA_BRACKETTICK 00000213
+CSEG XT_TICK 0000f824
+CSEG XT_LITERAL 0000021c
+CSEG VE_LITERAL 00000216
+CSEG PFA_LITERAL 0000021d
+CSEG VE_SLITERAL 00000221
+CSEG XT_SLITERAL 00000227
+CSEG PFA_SLITERAL 00000228
+CSEG XT_DOSLITERAL 0000f787
+CSEG XT_SCOMMA 0000f795
+CSEG XT_GMARK 0000022c
+CSEG PFA_GMARK 0000022d
+CSEG XT_GRESOLVE 00000231
+CSEG PFA_GRESOLVE 00000232
+CSEG XT_QSTACK 0000fb71
+CSEG XT_LMARK 00000237
+CSEG PFA_LMARK 00000238
+CSEG XT_LRESOLVE 0000023a
+CSEG PFA_LRESOLVE 0000023b
+CSEG VE_AHEAD 0000023e
+CSEG XT_AHEAD 00000243
+CSEG PFA_AHEAD 00000244
+CSEG XT_DOBRANCH 0000f034
+CSEG VE_IF 00000248
+CSEG XT_IF 0000024b
+CSEG PFA_IF 0000024c
+CSEG VE_ELSE 00000250
+CSEG XT_ELSE 00000254
+CSEG PFA_ELSE 00000255
+CSEG VE_THEN 0000025b
+CSEG XT_THEN 0000025f
+CSEG PFA_THEN 00000260
+CSEG VE_BEGIN 00000262
+CSEG XT_BEGIN 00000267
+CSEG PFA_BEGIN 00000268
+CSEG VE_WHILE 0000026a
+CSEG XT_WHILE 0000026f
+CSEG PFA_WHILE 00000270
+CSEG VE_REPEAT 00000273
+CSEG XT_REPEAT 00000278
+CSEG PFA_REPEAT 00000279
+CSEG XT_AGAIN 0000028c
+CSEG VE_UNTIL 0000027c
+CSEG XT_UNTIL 00000281
+CSEG PFA_UNTIL 00000282
+CSEG VE_AGAIN 00000287
+CSEG PFA_AGAIN 0000028d
+CSEG VE_DO 00000291
+CSEG XT_DO 00000294
+CSEG PFA_DO 00000295
+CSEG XT_DODO 0000f2ac
+CSEG XT_TO_L 000002ef
+CSEG VE_LOOP 0000029b
+CSEG XT_LOOP 0000029f
+CSEG PFA_LOOP 000002a0
+CSEG XT_DOLOOP 0000f2da
+CSEG XT_ENDLOOP 000002d6
+CSEG VE_PLUSLOOP 000002a4
+CSEG XT_PLUSLOOP 000002a9
+CSEG PFA_PLUSLOOP 000002aa
+CSEG XT_DOPLUSLOOP 0000f2cb
+CSEG VE_LEAVE 000002ae
+CSEG XT_LEAVE 000002b3
+CSEG PFA_LEAVE 000002b4
+CSEG XT_UNLOOP 0000f2e5
+CSEG VE_QDO 000002b9
+CSEG XT_QDO 000002bd
+CSEG PFA_QDO 000002be
+CSEG XT_QDOCHECK 000002c5
+CSEG PFA_QDOCHECK 000002c6
+CSEG PFA_QDOCHECK1 000002cd
+CSEG XT_INVERT 0000f20e
+CSEG VE_ENDLOOP 000002d0
+CSEG PFA_ENDLOOP 000002d7
+CSEG LOOP1 000002d8
+CSEG XT_L_FROM 000002e3
+CSEG XT_QDUP 0000f0ca
+CSEG LOOP2 000002df
+CSEG VE_L_FROM 000002e0
+CSEG PFA_L_FROM 000002e4
+CSEG XT_LP 00000302
+CSEG XT_FETCH 0000f08a
+CSEG XT_PLUSSTORE 0000f276
+CSEG VE_TO_L 000002ec
+CSEG PFA_TO_L 000002f0
+CSEG XT_TWO 0000fdb6
+CSEG VE_LP0 000002f7
+CSEG XT_LP0 000002fb
+CSEG PFA_LP0 000002fc
+ESEG CFG_LP0 0000007e
+CSEG VE_LP 000002ff
+CSEG PFA_LP 00000303
+DSEG ram_lp 00000251
+CSEG VE_CREATE 00000304
+CSEG XT_CREATE 00000309
+CSEG PFA_CREATE 0000030a
+CSEG XT_REVEAL 00000338
+CSEG PFA_DOCONSTANT 0000f060
+CSEG VE_HEADER 0000030f
+CSEG PFA_HEADER 00000315
+CSEG XT_GREATERZERO 0000f139
+CSEG PFA_HEADER1 00000326
+CSEG XT_OR 0000f22d
+CSEG XT_DOSCOMMA 0000f799
+CSEG XT_FETCHE 0000f370
+CSEG XT_THROW 0000f85b
+CSEG VE_WLSCOPE 00000329
+CSEG PFA_DODEFER1 0000fc2d
+CSEG PFA_WLSCOPE 00000330
+ESEG CFG_WLSCOPE 0000007a
+CSEG VE_REVEAL 00000333
+CSEG PFA_REVEAL 00000339
+CSEG REVEAL1 00000343
+CSEG XT_STOREE 0000f34c
+CSEG VE_DOES 00000344
+CSEG XT_DOES 00000349
+CSEG PFA_DOES 0000034a
+CSEG XT_DODOES 0000035c
+CSEG DO_DODOES 00000351
+CSEG PFA_DODOES 0000035d
+CSEG XT_NFA2CFA 0000fc98
+CSEG VE_COLON 00000365
+CSEG XT_COLON 00000368
+CSEG PFA_COLON 00000369
+CSEG XT_COLONNONAME 00000373
+CSEG VE_COLONNONAME 0000036d
+CSEG PFA_COLONNONAME 00000374
+CSEG XT_RBRACKET 00000388
+CSEG VE_SEMICOLON 0000037c
+CSEG XT_SEMICOLON 0000037f
+CSEG PFA_SEMICOLON 00000380
+CSEG XT_LBRACKET 00000390
+CSEG VE_RBRACKET 00000385
+CSEG PFA_RBRACKET 00000389
+CSEG XT_STATE 0000f565
+CSEG VE_LBRACKET 0000038d
+CSEG PFA_LBRACKET 00000391
+CSEG VE_VARIABLE 00000395
+CSEG XT_VARIABLE 0000039b
+CSEG PFA_VARIABLE 0000039c
+CSEG XT_HERE 0000f5d9
+CSEG XT_CONSTANT 000003a7
+CSEG XT_ALLOT 0000f5e2
+CSEG VE_CONSTANT 000003a1
+CSEG PFA_CONSTANT 000003a8
+CSEG VE_USER 000003ae
+CSEG XT_USER 000003b2
+CSEG PFA_USER 000003b3
+CSEG PFA_DOUSER 0000f066
+CSEG VE_RECURSE 000003b9
+CSEG XT_RECURSE 000003bf
+CSEG PFA_RECURSE 000003c0
+CSEG VE_IMMEDIATE 000003c4
+CSEG XT_IMMEDIATE 000003cb
+CSEG PFA_IMMEDIATE 000003cc
+CSEG XT_GET_CURRENT 0000046d
+CSEG VE_BRACKETCHAR 000003d6
+CSEG XT_BRACKETCHAR 000003db
+CSEG PFA_BRACKETCHAR 000003dc
+CSEG XT_CHAR 0000f904
+CSEG VE_ABORTQUOTE 000003e1
+CSEG XT_ABORTQUOTE 000003e6
+CSEG PFA_ABORTQUOTE 000003e7
+CSEG XT_SQUOTE 0000f4db
+CSEG XT_QABORT 000003f8
+CSEG VE_ABORT 000003eb
+CSEG XT_ABORT 000003f0
+CSEG PFA_ABORT 000003f1
+CSEG VE_QABORT 000003f3
+CSEG PFA_QABORT 000003f9
+CSEG QABO1 000003fe
+CSEG XT_ITYPE 0000f7ba
+CSEG VE_GET_STACK 00000400
+CSEG XT_GET_STACK 00000407
+CSEG PFA_N_FETCH_E2 0000041e
+CSEG PFA_N_FETCH_E1 00000414
+CSEG XT_I 0000f2bd
+CSEG XT_1MINUS 0000f246
+CSEG XT_CELLS 0000f572
+CSEG XT_OVER 0000f0e0
+CSEG VE_SET_STACK 00000421
+CSEG XT_SET_STACK 00000428
+CSEG PFA_SET_STACK 00000429
+CSEG XT_ZEROLESS 0000f132
+CSEG PFA_SET_STACK0 00000430
+CSEG PFA_SET_STACK2 0000043d
+CSEG PFA_SET_STACK1 00000438
+CSEG XT_TUCK 0000f590
+CSEG VE_MAPSTACK 0000043f
+CSEG XT_MAPSTACK 00000446
+CSEG PFA_MAPSTACK 00000447
+CSEG XT_BOUNDS 0000fd89
+CSEG PFA_MAPSTACK3 00000462
+CSEG PFA_MAPSTACK1 00000451
+CSEG XT_R_FETCH 0000f119
+CSEG XT_EXECUTE 0000f02f
+CSEG PFA_MAPSTACK2 0000045e
+CSEG VE_GET_CURRENT 00000465
+CSEG PFA_GET_CURRENT 0000046e
+ESEG CFG_CURRENT 00000084
+CSEG VE_GET_ORDER 00000472
+CSEG XT_GET_ORDER 00000479
+CSEG PFA_GET_ORDER 0000047a
+ESEG CFG_ORDERLISTLEN 00000088
+CSEG VE_CFG_ORDER 0000047e
+CSEG XT_CFG_ORDER 00000485
+CSEG PFA_CFG_ORDER 00000486
+CSEG VE_COMPARE 00000487
+CSEG XT_COMPARE 0000048d
+CSEG PFA_COMPARE 0000048e
+CSEG PFA_COMPARE_LOOP 0000049a
+CSEG PFA_COMPARE_NOTEQUAL 000004a8
+CSEG PFA_COMPARE_ENDREACHED2 000004a3
+CSEG PFA_COMPARE_ENDREACHED 000004a4
+CSEG PFA_COMPARE_CHECKLASTCHAR 000004a8
+CSEG PFA_COMPARE_DONE 000004aa
+CSEG VE_NFA2LFA 000004af
+CSEG XT_NFA2LFA 000004b5
+CSEG PFA_NFA2LFA 000004b6
+CSEG XT_NAME2STRING 0000fc8c
+CSEG XT_2SLASH 0000f215
+CSEG VE_SET_CURRENT 000004bb
+CSEG XT_SET_CURRENT 000004c3
+CSEG PFA_SET_CURRENT 000004c4
+CSEG VE_WORDLIST 000004c8
+CSEG XT_WORDLIST 000004ce
+CSEG PFA_WORDLIST 000004cf
+CSEG XT_EHERE 0000f5d1
+CSEG PFA_EHERE 0000f5d2
+CSEG VE_FORTHWORDLIST 000004d8
+CSEG XT_FORTHWORDLIST 000004e1
+CSEG PFA_FORTHWORDLIST 000004e2
+ESEG CFG_FORTHWORDLIST 00000086
+CSEG VE_SET_ORDER 000004e3
+CSEG XT_SET_ORDER 000004ea
+CSEG PFA_SET_ORDER 000004eb
+CSEG VE_SET_RECOGNIZERS 000004ef
+CSEG XT_SET_RECOGNIZERS 000004f9
+CSEG PFA_SET_RECOGNIZERS 000004fa
+ESEG CFG_RECOGNIZERLISTLEN 0000009a
+CSEG VE_GET_RECOGNIZERS 000004fe
+CSEG XT_GET_RECOGNIZERS 00000508
+CSEG PFA_GET_RECOGNIZERS 00000509
+CSEG VE_CODE 0000050d
+CSEG XT_CODE 00000511
+CSEG PFA_CODE 00000512
+CSEG VE_ENDCODE 00000518
+CSEG XT_ENDCODE 0000051e
+CSEG PFA_ENDCODE 0000051f
+CSEG VE_MARKER 00000524
+CSEG XT_MARKER 0000052a
+CSEG PFA_MARKER 0000052b
+ESEG EE_MARKER 000000a6
+CSEG VE_POSTPONE 0000052e
+CSEG XT_POSTPONE 00000534
+CSEG PFA_POSTPONE 00000535
+CSEG XT_FORTHRECOGNIZER 0000fae6
+CSEG XT_RECOGNIZE 0000faf1
+CSEG VE_APPLTURNKEY 00000543
+CSEG XT_APPLTURNKEY 0000054b
+CSEG PFA_APPLTURNKEY 0000054c
+CSEG XT_INTON 0000f493
+CSEG XT_DOT_VER 0000fb7e
+CSEG XT_SPACE 0000f7fc
+SET DPSTART 00000559
+CSEG DO_INTERRUPT 0000f019
+CSEG DO_EXECUTE 0000f00f
+CSEG XT_ISREXEC 0000f4bc
+CSEG VE_EXIT 0000f021
+CSEG PFA_EXIT 0000f026
+CSEG VE_EXECUTE 0000f029
+CSEG PFA_EXECUTE 0000f030
+CSEG PFA_DOBRANCH 0000f035
+CSEG PFA_DOCONDBRANCH 0000f03f
+CSEG PFA_DOLITERAL 0000f046
+CSEG XT_DOVARIABLE 0000f052
+CSEG XT_DOCONSTANT 0000f05f
+CSEG XT_DOUSER 0000f065
+CSEG VE_DOVALUE 0000f074
+CSEG XT_DOVALUE 0000f07a
+CSEG PFA_DOVALUE 0000f07b
+CSEG VE_FETCH 0000f087
+CSEG PFA_FETCH 0000f08b
+CSEG PFA_FETCHRAM 0000f08b
+CSEG VE_STORE 0000f08f
+CSEG PFA_STORE 0000f093
+CSEG PFA_STORERAM 0000f093
+CSEG VE_CSTORE 0000f09b
+CSEG PFA_CSTORE 0000f09f
+CSEG VE_CFETCH 0000f0a6
+CSEG PFA_CFETCH 0000f0aa
+CSEG VE_FETCHU 0000f0ae
+CSEG XT_FETCHU 0000f0b1
+CSEG PFA_FETCHU 0000f0b2
+CSEG XT_UP_FETCH 0000f313
+CSEG VE_STOREU 0000f0b6
+CSEG XT_STOREU 0000f0b9
+CSEG PFA_STOREU 0000f0ba
+CSEG VE_DUP 0000f0be
+CSEG PFA_DUP 0000f0c3
+CSEG VE_QDUP 0000f0c6
+CSEG PFA_QDUP 0000f0cb
+CSEG PFA_QDUP1 0000f0d0
+CSEG VE_SWAP 0000f0d1
+CSEG PFA_SWAP 0000f0d6
+CSEG VE_OVER 0000f0dc
+CSEG PFA_OVER 0000f0e1
+CSEG VE_DROP 0000f0e6
+CSEG PFA_DROP 0000f0eb
+CSEG VE_ROT 0000f0ee
+CSEG PFA_ROT 0000f0f3
+CSEG VE_NIP 0000f0fd
+CSEG PFA_NIP 0000f102
+CSEG VE_R_FROM 0000f104
+CSEG PFA_R_FROM 0000f108
+CSEG VE_TO_R 0000f10d
+CSEG PFA_TO_R 0000f111
+CSEG VE_R_FETCH 0000f116
+CSEG PFA_R_FETCH 0000f11a
+CSEG VE_NOTEQUAL 0000f121
+CSEG PFA_NOTEQUAL 0000f125
+CSEG VE_ZEROEQUAL 0000f128
+CSEG PFA_ZEROEQUAL 0000f12c
+CSEG PFA_ZERO1 0000f168
+CSEG PFA_TRUE1 0000f15f
+CSEG VE_ZEROLESS 0000f12f
+CSEG PFA_ZEROLESS 0000f133
+CSEG VE_GREATERZERO 0000f136
+CSEG PFA_GREATERZERO 0000f13a
+CSEG VE_DGREATERZERO 0000f13f
+CSEG XT_DGREATERZERO 0000f143
+CSEG PFA_DGREATERZERO 0000f144
+CSEG VE_DXT_ZEROLESS 0000f14d
+CSEG XT_DXT_ZEROLESS 0000f151
+CSEG PFA_DXT_ZEROLESS 0000f152
+CSEG VE_TRUE 0000f158
+CSEG PFA_TRUE 0000f15d
+CSEG VE_ZERO 0000f162
+CSEG PFA_ZERO 0000f166
+CSEG VE_ULESS 0000f16a
+CSEG PFA_ULESS 0000f16e
+CSEG VE_UGREATER 0000f175
+CSEG PFA_UGREATER 0000f179
+CSEG VE_LESS 0000f17c
+CSEG XT_LESS 0000f17f
+CSEG PFA_LESS 0000f180
+CSEG PFA_LESSDONE 0000f184
+CSEG VE_GREATER 0000f186
+CSEG XT_GREATER 0000f189
+CSEG PFA_GREATER 0000f18a
+CSEG PFA_GREATERDONE 0000f18e
+CSEG VE_LOG2 0000f191
+CSEG XT_LOG2 0000f195
+CSEG PFA_LOG2 0000f196
+CSEG PFA_LOG2_1 0000f199
+CSEG PFA_LOG2_2 0000f19f
+CSEG VE_MINUS 0000f1a1
+CSEG XT_MINUS 0000f1a4
+CSEG PFA_MINUS 0000f1a5
+CSEG VE_PLUS 0000f1ab
+CSEG PFA_PLUS 0000f1af
+CSEG VE_MSTAR 0000f1b4
+CSEG XT_MSTAR 0000f1b7
+CSEG PFA_MSTAR 0000f1b8
+CSEG VE_UMSLASHMOD 0000f1ce
+CSEG XT_UMSLASHMOD 0000f1d3
+CSEG PFA_UMSLASHMOD 0000f1d4
+CSEG PFA_UMSLASHMODmod 0000f1d9
+CSEG PFA_UMSLASHMODmod_loop 0000f1da
+CSEG PFA_UMSLASHMODmod_loop_control 0000f1e7
+CSEG PFA_UMSLASHMODmod_subtract 0000f1e4
+CSEG PFA_UMSLASHMODmod_done 0000f1e9
+CSEG VE_UMSTAR 0000f1ed
+CSEG PFA_UMSTAR 0000f1f2
+CSEG VE_INVERT 0000f209
+CSEG PFA_INVERT 0000f20f
+CSEG VE_2SLASH 0000f212
+CSEG PFA_2SLASH 0000f216
+CSEG VE_2STAR 0000f219
+CSEG XT_2STAR 0000f21c
+CSEG PFA_2STAR 0000f21d
+CSEG VE_AND 0000f220
+CSEG PFA_AND 0000f225
+CSEG VE_OR 0000f22a
+CSEG PFA_OR 0000f22e
+CSEG VE_XOR 0000f233
+CSEG XT_XOR 0000f237
+CSEG PFA_XOR 0000f238
+CSEG VE_1PLUS 0000f23d
+CSEG PFA_1PLUS 0000f241
+CSEG VE_1MINUS 0000f243
+CSEG PFA_1MINUS 0000f247
+CSEG VE_QNEGATE 0000f249
+CSEG XT_QNEGATE 0000f24f
+CSEG PFA_QNEGATE 0000f250
+CSEG QNEG1 0000f254
+CSEG XT_NEGATE 0000f659
+CSEG VE_LSHIFT 0000f255
+CSEG XT_LSHIFT 0000f25a
+CSEG PFA_LSHIFT 0000f25b
+CSEG PFA_LSHIFT1 0000f25e
+CSEG PFA_LSHIFT2 0000f263
+CSEG VE_RSHIFT 0000f264
+CSEG XT_RSHIFT 0000f269
+CSEG PFA_RSHIFT 0000f26a
+CSEG PFA_RSHIFT1 0000f26d
+CSEG PFA_RSHIFT2 0000f272
+CSEG VE_PLUSSTORE 0000f273
+CSEG PFA_PLUSSTORE 0000f277
+CSEG VE_RP_FETCH 0000f283
+CSEG XT_RP_FETCH 0000f287
+CSEG PFA_RP_FETCH 0000f288
+CSEG VE_RP_STORE 0000f28d
+CSEG XT_RP_STORE 0000f291
+CSEG PFA_RP_STORE 0000f292
+CSEG VE_SP_FETCH 0000f29a
+CSEG XT_SP_FETCH 0000f29e
+CSEG PFA_SP_FETCH 0000f29f
+CSEG VE_SP_STORE 0000f2a3
+CSEG XT_SP_STORE 0000f2a7
+CSEG PFA_SP_STORE 0000f2a8
+CSEG PFA_DODO 0000f2ad
+CSEG PFA_DODO1 0000f2af
+CSEG VE_I 0000f2ba
+CSEG PFA_I 0000f2be
+CSEG PFA_DOPLUSLOOP 0000f2cc
+CSEG PFA_DOPLUSLOOP_LEAVE 0000f2d6
+CSEG PFA_DOPLUSLOOP_NEXT 0000f2d3
+CSEG PFA_DOLOOP 0000f2db
+CSEG VE_UNLOOP 0000f2e0
+CSEG PFA_UNLOOP 0000f2e6
+CSEG VE_CMOVE_G 0000f2eb
+CSEG XT_CMOVE_G 0000f2f0
+CSEG PFA_CMOVE_G 0000f2f1
+CSEG PFA_CMOVE_G1 0000f302
+CSEG PFA_CMOVE_G2 0000f2fe
+CSEG VE_BYTESWAP 0000f307
+CSEG PFA_BYTESWAP 0000f30b
+CSEG VE_UP_FETCH 0000f30f
+CSEG PFA_UP_FETCH 0000f314
+CSEG VE_UP_STORE 0000f318
+CSEG XT_UP_STORE 0000f31c
+CSEG PFA_UP_STORE 0000f31d
+CSEG VE_1MS 0000f321
+CSEG XT_1MS 0000f325
+CSEG PFA_1MS 0000f326
+CSEG VE_2TO_R 0000f32b
+CSEG XT_2TO_R 0000f32f
+CSEG PFA_2TO_R 0000f330
+CSEG VE_2R_FROM 0000f33a
+CSEG XT_2R_FROM 0000f33e
+CSEG PFA_2R_FROM 0000f33f
+CSEG VE_STOREE 0000f349
+CSEG PFA_STOREE 0000f34d
+CSEG PFA_STOREE0 0000f34d
+CSEG PFA_FETCHE2 0000f37b
+CSEG PFA_STOREE3 0000f357
+CSEG PFA_STOREE1 0000f362
+CSEG PFA_STOREE4 0000f35e
+CSEG PFA_STOREE2 0000f364
+CSEG VE_FETCHE 0000f36d
+CSEG PFA_FETCHE 0000f371
+CSEG PFA_FETCHE1 0000f371
+CSEG VE_STOREI 0000f381
+CSEG PFA_STOREI 0000f385
+ESEG EE_STOREI 000000a4
+CSEG VE_DO_STOREI_NRWW 0000f388
+CSEG XT_DO_STOREI 0000f38f
+CSEG PFA_DO_STOREI_NRWW 0000f390
+CSEG DO_STOREI_atmega 0000f3a4
+CSEG pageload 0000f3b5
+CSEG DO_STOREI_writepage 0000f3ae
+CSEG dospm 0000f3d1
+EQU pagemask ffffff80
+CSEG pageload_loop 0000f3bb
+CSEG pageload_newdata 0000f3c9
+CSEG pageload_cont 0000f3cb
+CSEG pageload_done 0000f3d0
+CSEG dospm_wait_ee 0000f3d1
+CSEG dospm_wait_spm 0000f3d3
+CSEG VE_FETCHI 0000f3df
+CSEG PFA_FETCHI 0000f3e3
+CSEG VE_N_TO_R 0000f3ec
+CSEG XT_N_TO_R 0000f3f0
+CSEG PFA_N_TO_R 0000f3f1
+CSEG PFA_N_TO_R1 0000f3f3
+CSEG VE_N_R_FROM 0000f3fe
+CSEG XT_N_R_FROM 0000f402
+CSEG PFA_N_R_FROM 0000f403
+CSEG PFA_N_R_FROM1 0000f408
+CSEG VE_D2STAR 0000f410
+CSEG XT_D2STAR 0000f414
+CSEG PFA_D2STAR 0000f415
+CSEG VE_D2SLASH 0000f41e
+CSEG XT_D2SLASH 0000f422
+CSEG PFA_D2SLASH 0000f423
+CSEG VE_DPLUS 0000f42c
+CSEG PFA_DPLUS 0000f430
+CSEG VE_DMINUS 0000f43d
+CSEG XT_DMINUS 0000f440
+CSEG PFA_DMINUS 0000f441
+CSEG VE_DINVERT 0000f44f
+CSEG XT_DINVERT 0000f455
+CSEG PFA_DINVERT 0000f456
+CSEG VE_UDOT 0000f45f
+CSEG XT_UDOT 0000f462
+CSEG PFA_UDOT 0000f463
+CSEG XT_UDDOT 0000f744
+CSEG VE_UDOTR 0000f466
+CSEG XT_UDOTR 0000f46a
+CSEG PFA_UDOTR 0000f46b
+CSEG XT_UDDOTR 0000f74d
+CSEG VE_SHOWWORDLIST 0000f46f
+CSEG XT_SHOWWORDLIST 0000f478
+CSEG PFA_SHOWWORDLIST 0000f479
+CSEG XT_SHOWWORD 0000f47e
+CSEG XT_TRAVERSEWORDLIST 0000fc71
+CSEG PFA_SHOWWORD 0000f47f
+CSEG VE_WORDS 0000f484
+CSEG XT_WORDS 0000f489
+CSEG PFA_WORDS 0000f48a
+CSEG VE_INTON 0000f48f
+CSEG PFA_INTON 0000f494
+CSEG VE_INTOFF 0000f496
+CSEG XT_INTOFF 0000f49a
+CSEG PFA_INTOFF 0000f49b
+CSEG VE_INTSTORE 0000f49d
+CSEG PFA_INTSTORE 0000f4a2
+CSEG VE_INTFETCH 0000f4a7
+CSEG XT_INTFETCH 0000f4ab
+CSEG PFA_INTFETCH 0000f4ac
+CSEG VE_INTTRAP 0000f4b1
+CSEG XT_INTTRAP 0000f4b7
+CSEG PFA_INTTRAP 0000f4b8
+CSEG PFA_ISREXEC 0000f4bd
+CSEG XT_ISREND 0000f4c1
+CSEG PFA_ISREND 0000f4c2
+CSEG PFA_ISREND1 0000f4c4
+CSEG VE_PICK 0000f4c5
+CSEG XT_PICK 0000f4c9
+CSEG PFA_PICK 0000f4ca
+CSEG VE_DOTSTRING 0000f4d0
+CSEG XT_DOTSTRING 0000f4d3
+CSEG PFA_DOTSTRING 0000f4d4
+CSEG VE_SQUOTE 0000f4d8
+CSEG PFA_SQUOTE 0000f4dc
+CSEG PFA_SQUOTE1 0000f4e4
+CSEG VE_FILL 0000f4e5
+CSEG PFA_FILL 0000f4ea
+CSEG PFA_FILL2 0000f4f6
+CSEG PFA_FILL1 0000f4f1
+CSEG VE_ENVIRONMENT 0000f4f8
+CSEG XT_ENVIRONMENT 0000f500
+CSEG PFA_ENVIRONMENT 0000f501
+ESEG CFG_ENVIRONMENT 00000082
+CSEG VE_ENVWORDLISTS 0000f502
+CSEG XT_ENVWORDLISTS 0000f509
+CSEG PFA_ENVWORDLISTS 0000f50a
+CSEG VE_ENVSLASHPAD 0000f50d
+CSEG XT_ENVSLASHPAD 0000f511
+CSEG PFA_ENVSLASHPAD 0000f512
+CSEG XT_PAD 0000f59e
+CSEG VE_ENVSLASHHOLD 0000f516
+CSEG XT_ENVSLASHHOLD 0000f51b
+CSEG PFA_ENVSLASHHOLD 0000f51c
+CSEG VE_ENV_FORTHNAME 0000f520
+CSEG XT_ENV_FORTHNAME 0000f527
+CSEG PFA_EN_FORTHNAME 0000f528
+CSEG VE_ENV_FORTHVERSION 0000f52f
+CSEG XT_ENV_FORTHVERSION 0000f535
+CSEG PFA_EN_FORTHVERSION 0000f536
+CSEG VE_ENV_CPU 0000f539
+CSEG XT_ENV_CPU 0000f53d
+CSEG PFA_EN_CPU 0000f53e
+CSEG XT_ICOUNT 0000f7e6
+CSEG VE_ENV_MCUINFO 0000f542
+CSEG XT_ENV_MCUINFO 0000f548
+CSEG PFA_EN_MCUINFO 0000f549
+CSEG VE_ENVUSERSIZE 0000f54c
+CSEG XT_ENVUSERSIZE 0000f551
+CSEG PFA_ENVUSERSIZE 0000f552
+CSEG VE_F_CPU 0000f555
+CSEG XT_F_CPU 0000f55a
+CSEG PFA_F_CPU 0000f55b
+CSEG VE_STATE 0000f560
+CSEG PFA_STATE 0000f566
+DSEG ram_state 00000253
+CSEG VE_BASE 0000f567
+CSEG XT_BASE 0000f56b
+CSEG PFA_BASE 0000f56c
+CSEG VE_CELLS 0000f56d
+CSEG VE_CELLPLUS 0000f573
+CSEG PFA_CELLPLUS 0000f579
+CSEG VE_2DUP 0000f57b
+CSEG PFA_2DUP 0000f580
+CSEG VE_2DROP 0000f583
+CSEG PFA_2DROP 0000f589
+CSEG VE_TUCK 0000f58c
+CSEG PFA_TUCK 0000f591
+CSEG VE_TO_IN 0000f594
+CSEG PFA_TO_IN 0000f599
+CSEG VE_PAD 0000f59a
+CSEG PFA_PAD 0000f59f
+CSEG VE_EMIT 0000f5a4
+CSEG XT_EMIT 0000f5a8
+CSEG PFA_EMIT 0000f5a9
+CSEG XT_UDEFERFETCH 0000fbf6
+CSEG XT_UDEFERSTORE 0000fc02
+CSEG VE_EMITQ 0000f5ac
+CSEG XT_EMITQ 0000f5b1
+CSEG PFA_EMITQ 0000f5b2
+CSEG VE_KEY 0000f5b5
+CSEG XT_KEY 0000f5b9
+CSEG PFA_KEY 0000f5ba
+CSEG VE_KEYQ 0000f5bd
+CSEG XT_KEYQ 0000f5c1
+CSEG PFA_KEYQ 0000f5c2
+CSEG VE_DP 0000f5c5
+ESEG CFG_DP 00000074
+CSEG VE_EHERE 0000f5cc
+ESEG EE_EHERE 00000078
+CSEG VE_HERE 0000f5d5
+CSEG PFA_HERE 0000f5da
+ESEG EE_HERE 00000076
+CSEG VE_ALLOT 0000f5dd
+CSEG PFA_ALLOT 0000f5e3
+CSEG VE_BIN 0000f5e8
+CSEG XT_BIN 0000f5ec
+CSEG PFA_BIN 0000f5ed
+CSEG VE_DECIMAL 0000f5f1
+CSEG XT_DECIMAL 0000f5f7
+CSEG PFA_DECIMAL 0000f5f8
+CSEG VE_HEX 0000f5fd
+CSEG XT_HEX 0000f601
+CSEG PFA_HEX 0000f602
+CSEG VE_BL 0000f607
+CSEG XT_BL 0000f60a
+CSEG PFA_BL 0000f60b
+CSEG VE_TURNKEY 0000f60c
+CSEG XT_TURNKEY 0000f612
+CSEG PFA_TURNKEY 0000f613
+ESEG CFG_TURNKEY 00000080
+CSEG VE_SLASHMOD 0000f616
+CSEG XT_SLASHMOD 0000f61a
+CSEG PFA_SLASHMOD 0000f61b
+CSEG PFA_SLASHMOD_1 0000f626
+CSEG PFA_SLASHMOD_2 0000f62c
+CSEG PFA_SLASHMOD_3 0000f62f
+CSEG PFA_SLASHMOD_5 0000f63a
+CSEG PFA_SLASHMOD_4 0000f639
+CSEG PFA_SLASHMODmod_done 0000f645
+CSEG PFA_SLASHMOD_6 0000f643
+CSEG VE_USLASHMOD 0000f649
+CSEG XT_USLASHMOD 0000f64e
+CSEG PFA_USLASHMOD 0000f64f
+CSEG VE_NEGATE 0000f654
+CSEG PFA_NEGATE 0000f65a
+CSEG VE_SLASH 0000f65d
+CSEG XT_SLASH 0000f660
+CSEG PFA_SLASH 0000f661
+CSEG VE_MOD 0000f664
+CSEG XT_MOD 0000f668
+CSEG PFA_MOD 0000f669
+CSEG VE_ABS 0000f66c
+CSEG XT_ABS 0000f670
+CSEG PFA_ABS 0000f671
+CSEG VE_MIN 0000f674
+CSEG XT_MIN 0000f678
+CSEG PFA_MIN 0000f679
+CSEG PFA_MIN1 0000f67e
+CSEG VE_MAX 0000f680
+CSEG XT_MAX 0000f684
+CSEG PFA_MAX 0000f685
+CSEG PFA_MAX1 0000f68a
+CSEG VE_WITHIN 0000f68c
+CSEG XT_WITHIN 0000f691
+CSEG PFA_WITHIN 0000f692
+CSEG VE_TOUPPER 0000f699
+CSEG XT_TOUPPER 0000f69f
+CSEG PFA_TOUPPER 0000f6a0
+CSEG PFA_TOUPPER0 0000f6ab
+CSEG VE_TOLOWER 0000f6ac
+CSEG XT_TOLOWER 0000f6b2
+CSEG PFA_TOLOWER 0000f6b3
+CSEG PFA_TOLOWER0 0000f6be
+CSEG VE_HLD 0000f6bf
+CSEG XT_HLD 0000f6c3
+CSEG PFA_HLD 0000f6c4
+DSEG ram_hld 00000255
+CSEG VE_HOLD 0000f6c5
+CSEG XT_HOLD 0000f6c9
+CSEG PFA_HOLD 0000f6ca
+CSEG VE_L_SHARP 0000f6d5
+CSEG XT_L_SHARP 0000f6d8
+CSEG PFA_L_SHARP 0000f6d9
+CSEG VE_SHARP 0000f6dd
+CSEG XT_SHARP 0000f6e0
+CSEG PFA_SHARP 0000f6e1
+CSEG XT_UDSLASHMOD 0000f75d
+CSEG PFA_SHARP1 0000f6ee
+CSEG VE_SHARP_S 0000f6f3
+CSEG XT_SHARP_S 0000f6f6
+CSEG PFA_SHARP_S 0000f6f7
+CSEG NUMS1 0000f6f7
+CSEG VE_SHARP_G 0000f6fe
+CSEG XT_SHARP_G 0000f701
+CSEG PFA_SHARP_G 0000f702
+CSEG VE_SIGN 0000f709
+CSEG XT_SIGN 0000f70d
+CSEG PFA_SIGN 0000f70e
+CSEG PFA_SIGN1 0000f714
+CSEG VE_DDOTR 0000f715
+CSEG XT_DDOTR 0000f719
+CSEG PFA_DDOTR 0000f71a
+CSEG XT_DABS 0000fcff
+CSEG XT_SPACES 0000f805
+CSEG XT_TYPE 0000f815
+CSEG VE_DOTR 0000f728
+CSEG XT_DOTR 0000f72b
+CSEG PFA_DOTR 0000f72c
+CSEG VE_DDOT 0000f731
+CSEG XT_DDOT 0000f734
+CSEG PFA_DDOT 0000f735
+CSEG VE_DOT 0000f739
+CSEG XT_DOT 0000f73c
+CSEG PFA_DOT 0000f73d
+CSEG VE_UDDOT 0000f740
+CSEG PFA_UDDOT 0000f745
+CSEG VE_UDDOTR 0000f749
+CSEG PFA_UDDOTR 0000f74e
+CSEG VE_UDSLASHMOD 0000f758
+CSEG PFA_UDSLASHMOD 0000f75e
+CSEG VE_DIGITQ 0000f768
+CSEG XT_DIGITQ 0000f76d
+CSEG PFA_DIGITQ 0000f76e
+CSEG PFA_DOSLITERAL 0000f788
+CSEG VE_SCOMMA 0000f792
+CSEG PFA_SCOMMA 0000f796
+CSEG PFA_DOSCOMMA 0000f79a
+CSEG PFA_SCOMMA2 0000f7ac
+CSEG PFA_SCOMMA1 0000f7a6
+CSEG PFA_SCOMMA3 0000f7b3
+CSEG VE_ITYPE 0000f7b5
+CSEG PFA_ITYPE 0000f7bb
+CSEG PFA_ITYPE2 0000f7ce
+CSEG PFA_ITYPE1 0000f7c6
+CSEG XT_LOWEMIT 0000f7db
+CSEG XT_HIEMIT 0000f7d7
+CSEG PFA_ITYPE3 0000f7d5
+CSEG PFA_HIEMIT 0000f7d8
+CSEG PFA_LOWEMIT 0000f7dc
+CSEG VE_ICOUNT 0000f7e1
+CSEG PFA_ICOUNT 0000f7e7
+CSEG VE_CR 0000f7ec
+CSEG XT_CR 0000f7ef
+CSEG PFA_CR 0000f7f0
+CSEG VE_SPACE 0000f7f7
+CSEG PFA_SPACE 0000f7fd
+CSEG VE_SPACES 0000f800
+CSEG PFA_SPACES 0000f806
+CSEG SPCS1 0000f808
+CSEG SPCS2 0000f80f
+CSEG VE_TYPE 0000f811
+CSEG PFA_TYPE 0000f816
+CSEG PFA_TYPE2 0000f820
+CSEG PFA_TYPE1 0000f81b
+CSEG VE_TICK 0000f821
+CSEG PFA_TICK 0000f825
+CSEG XT_DT_NULL 0000fb64
+CSEG XT_NOOP 0000fb99
+CSEG PFA_TICK1 0000f836
+CSEG VE_HANDLER 0000f838
+CSEG XT_HANDLER 0000f83e
+CSEG PFA_HANDLER 0000f83f
+CSEG VE_CATCH 0000f840
+CSEG XT_CATCH 0000f845
+CSEG PFA_CATCH 0000f846
+CSEG VE_THROW 0000f856
+CSEG PFA_THROW 0000f85c
+CSEG PFA_THROW1 0000f862
+CSEG VE_CSKIP 0000f86f
+CSEG XT_CSKIP 0000f874
+CSEG PFA_CSKIP 0000f875
+CSEG PFA_CSKIP1 0000f876
+CSEG PFA_CSKIP2 0000f883
+CSEG XT_SLASHSTRING 0000f9bf
+CSEG VE_CSCAN 0000f886
+CSEG XT_CSCAN 0000f88b
+CSEG PFA_CSCAN 0000f88c
+CSEG PFA_CSCAN1 0000f88e
+CSEG PFA_CSCAN2 0000f8a0
+CSEG VE_ACCEPT 0000f8a6
+CSEG XT_ACCEPT 0000f8ab
+CSEG PFA_ACCEPT 0000f8ac
+CSEG ACC1 0000f8b0
+CSEG XT_CRLFQ 0000f8ec
+CSEG ACC5 0000f8de
+CSEG ACC3 0000f8ce
+CSEG ACC6 0000f8cc
+CSEG XT_BS 0000f8e4
+CSEG ACC4 0000f8dc
+CSEG PFA_ACCEPT6 0000f8d5
+CSEG VE_REFILL 0000f8f7
+CSEG XT_REFILL 0000f8fc
+CSEG PFA_REFILL 0000f8fd
+CSEG VE_CHAR 0000f900
+CSEG PFA_CHAR 0000f905
+CSEG VE_NUMBER 0000f909
+CSEG XT_NUMBER 0000f90e
+CSEG PFA_NUMBER 0000f90f
+CSEG XT_QSIGN 0000f952
+CSEG XT_SET_BASE 0000f965
+CSEG PFA_NUMBER0 0000f925
+CSEG XT_TO_NUMBER 0000f983
+CSEG PFA_NUMBER1 0000f947
+CSEG PFA_NUMBER2 0000f93e
+CSEG PFA_NUMBER6 0000f93f
+CSEG PFA_NUMBER3 0000f93b
+CSEG XT_DNEGATE 0000fd0c
+CSEG PFA_NUMBER5 0000f94d
+CSEG PFA_NUMBER4 0000f94c
+CSEG PFA_QSIGN 0000f953
+CSEG PFA_NUMBERSIGN_DONE 0000f95e
+CSEG XT_BASES 0000f960
+CSEG PFA_SET_BASE 0000f966
+CSEG SET_BASE1 0000f97b
+CSEG SET_BASE2 0000f97c
+CSEG VE_TO_NUMBER 0000f97d
+CSEG TONUM1 0000f984
+CSEG TONUM3 0000f99b
+CSEG TONUM2 0000f98f
+CSEG XT_2SWAP 0000fd30
+CSEG VE_PARSE 0000f99c
+CSEG PFA_PARSE 0000f9a2
+CSEG VE_SOURCE 0000f9b0
+CSEG PFA_SOURCE 0000f9b6
+CSEG VE_SLASHSTRING 0000f9b9
+CSEG PFA_SLASHSTRING 0000f9c0
+CSEG VE_PARSENAME 0000f9c7
+CSEG PFA_PARSENAME 0000f9cf
+CSEG XT_SKIPSCANCHAR 0000f9d2
+CSEG PFA_SKIPSCANCHAR 0000f9d3
+CSEG VE_FINDXT 0000f9e4
+CSEG XT_FINDXT 0000f9ea
+CSEG PFA_FINDXT 0000f9eb
+CSEG XT_FINDXTA 0000f9f6
+CSEG PFA_FINDXT1 0000f9f5
+CSEG PFA_FINDXTA 0000f9f7
+CSEG XT_SEARCH_WORDLIST 0000fc3f
+CSEG PFA_FINDXTA1 0000fa03
+CSEG XT_DEFAULT_PROMPTOK 0000fa04
+CSEG PFA_DEFAULT_PROMPTOK 0000fa05
+CSEG VE_PROMPTOK 0000fa0b
+CSEG XT_PROMPTOK 0000fa0f
+CSEG PFA_PROMPTOK 0000fa10
+CSEG XT_DEFAULT_PROMPTREADY 0000fa13
+CSEG PFA_DEFAULT_PROMPTREADY 0000fa14
+CSEG VE_PROMPTREADY 0000fa1a
+CSEG XT_PROMPTREADY 0000fa1f
+CSEG PFA_PROMPTREADY 0000fa20
+CSEG XT_DEFAULT_PROMPTERROR 0000fa23
+CSEG PFA_DEFAULT_PROMPTERROR 0000fa24
+CSEG VE_PROMPTERROR 0000fa35
+CSEG XT_PROMPTERROR 0000fa3a
+CSEG PFA_PROMPTERROR 0000fa3b
+CSEG VE_QUIT 0000fa3e
+CSEG XT_QUIT 0000fa42
+CSEG PFA_QUIT 0000fa43
+CSEG XT_SP0 0000faa3
+CSEG XT_RP0 0000fab0
+CSEG PFA_QUIT2 0000fa4b
+CSEG PFA_QUIT4 0000fa51
+CSEG PFA_QUIT3 0000fa63
+CSEG XT_INTERPRET 0000fac9
+CSEG PFA_QUIT5 0000fa61
+CSEG VE_PAUSE 0000fa66
+CSEG PFA_PAUSE 0000fa6c
+DSEG ram_pause 00000257
+CSEG XT_RDEFERFETCH 0000fbe2
+CSEG XT_RDEFERSTORE 0000fbec
+CSEG VE_COLD 0000fa6f
+CSEG clearloop 0000fa7b
+DSEG ram_user1 00000259
+CSEG PFA_WARM 0000fa96
+CSEG VE_WARM 0000fa91
+CSEG XT_WARM 0000fa95
+CSEG XT_INIT_RAM 0000fd7b
+CSEG XT_DEFERSTORE 0000fc0d
+CSEG VE_SP0 0000fa9f
+CSEG PFA_SP0 0000faa4
+CSEG VE_SP 0000faa7
+CSEG XT_SP 0000faaa
+CSEG PFA_SP 0000faab
+CSEG VE_RP0 0000faac
+CSEG PFA_RP0 0000fab1
+CSEG XT_DORP0 0000fab4
+CSEG PFA_DORP0 0000fab5
+CSEG VE_DEPTH 0000fab6
+CSEG XT_DEPTH 0000fabb
+CSEG PFA_DEPTH 0000fabc
+CSEG VE_INTERPRET 0000fac2
+CSEG PFA_INTERPRET 0000faca
+CSEG PFA_INTERPRET2 0000fada
+CSEG PFA_INTERPRET1 0000fad5
+CSEG VE_FORTHRECOGNIZER 0000fadc
+CSEG PFA_FORTHRECOGNIZER 0000fae7
+ESEG CFG_FORTHRECOGNIZER 0000007c
+CSEG VE_RECOGNIZE 0000faea
+CSEG PFA_RECOGNIZE 0000faf2
+CSEG XT_RECOGNIZE_A 0000fafc
+CSEG PFA_RECOGNIZE1 0000fafb
+CSEG PFA_RECOGNIZE_A 0000fafd
+CSEG PFA_RECOGNIZE_A1 0000fb0d
+CSEG VE_DT_NUM 0000fb11
+CSEG XT_DT_NUM 0000fb16
+CSEG PFA_DT_NUM 0000fb17
+CSEG VE_DT_DNUM 0000fb1a
+CSEG XT_DT_DNUM 0000fb20
+CSEG PFA_DT_DNUM 0000fb21
+CSEG XT_2LITERAL 0000fda2
+CSEG VE_REC_NUM 0000fb24
+CSEG XT_REC_NUM 0000fb2a
+CSEG PFA_REC_NUM 0000fb2b
+CSEG PFA_REC_NONUMBER 0000fb36
+CSEG PFA_REC_INTNUM2 0000fb34
+CSEG VE_REC_FIND 0000fb38
+CSEG XT_REC_FIND 0000fb3e
+CSEG PFA_REC_FIND 0000fb3f
+CSEG PFA_REC_WORD_FOUND 0000fb47
+CSEG XT_DT_XT 0000fb4e
+CSEG VE_DT_XT 0000fb49
+CSEG PFA_DT_XT 0000fb4f
+CSEG XT_R_WORD_INTERPRET 0000fb52
+CSEG XT_R_WORD_COMPILE 0000fb56
+CSEG PFA_R_WORD_INTERPRET 0000fb53
+CSEG PFA_R_WORD_COMPILE 0000fb57
+CSEG PFA_R_WORD_COMPILE1 0000fb5c
+CSEG VE_DT_NULL 0000fb5e
+CSEG PFA_DT_NULL 0000fb65
+CSEG XT_FAIL 0000fb68
+CSEG PFA_FAIL 0000fb69
+CSEG VE_QSTACK 0000fb6c
+CSEG PFA_QSTACK 0000fb72
+CSEG PFA_QSTACK1 0000fb79
+CSEG VE_DOT_VER 0000fb7a
+CSEG PFA_DOT_VER 0000fb7f
+CSEG VE_NOOP 0000fb95
+CSEG PFA_NOOP 0000fb9a
+CSEG VE_UNUSED 0000fb9b
+CSEG XT_UNUSED 0000fba0
+CSEG PFA_UNUSED 0000fba1
+CSEG VE_TO 0000fba5
+CSEG XT_TO 0000fba8
+CSEG PFA_TO 0000fba9
+CSEG XT_TO_BODY 0000fd9b
+CSEG PFA_TO1 0000fbb9
+CSEG PFA_DOTO 0000fbb4
+CSEG VE_ICELLPLUS 0000fbbf
+CSEG PFA_ICELLPLUS 0000fbc6
+CSEG VE_EDEFERFETCH 0000fbc8
+CSEG PFA_EDEFERFETCH 0000fbcf
+CSEG VE_EDEFERSTORE 0000fbd2
+CSEG PFA_EDEFERSTORE 0000fbd9
+CSEG VE_RDEFERFETCH 0000fbdc
+CSEG PFA_RDEFERFETCH 0000fbe3
+CSEG VE_RDEFERSTORE 0000fbe6
+CSEG PFA_RDEFERSTORE 0000fbed
+CSEG VE_UDEFERFETCH 0000fbf0
+CSEG PFA_UDEFERFETCH 0000fbf7
+CSEG VE_UDEFERSTORE 0000fbfc
+CSEG PFA_UDEFERSTORE 0000fc03
+CSEG VE_DEFERSTORE 0000fc08
+CSEG PFA_DEFERSTORE 0000fc0e
+CSEG VE_DEFERFETCH 0000fc15
+CSEG XT_DEFERFETCH 0000fc1a
+CSEG PFA_DEFERFETCH 0000fc1b
+CSEG VE_DODEFER 0000fc21
+CSEG XT_DODEFER 0000fc27
+CSEG PFA_DODEFER 0000fc28
+CSEG VE_SEARCH_WORDLIST 0000fc35
+CSEG PFA_SEARCH_WORDLIST 0000fc40
+CSEG XT_ISWORD 0000fc54
+CSEG PFA_SEARCH_WORDLIST1 0000fc4e
+CSEG PFA_ISWORD 0000fc55
+CSEG XT_ICOMPARE 0000fca2
+CSEG PFA_ISWORD3 0000fc62
+CSEG VE_TRAVERSEWORDLIST 0000fc66
+CSEG PFA_TRAVERSEWORDLIST 0000fc72
+CSEG PFA_TRAVERSEWORDLIST1 0000fc73
+CSEG PFA_TRAVERSEWORDLIST2 0000fc82
+CSEG VE_NAME2STRING 0000fc84
+CSEG PFA_NAME2STRING 0000fc8d
+CSEG VE_NFA2CFA 0000fc92
+CSEG PFA_NFA2CFA 0000fc99
+CSEG VE_ICOMPARE 0000fc9c
+CSEG PFA_ICOMPARE 0000fca3
+CSEG PFA_ICOMPARE_SAMELEN 0000fcad
+CSEG PFA_ICOMPARE_DONE 0000fcd2
+CSEG PFA_ICOMPARE_LOOP 0000fcb3
+CSEG XT_ICOMPARE_LC 0000fcd5
+CSEG PFA_ICOMPARE_LASTCELL 0000fcc3
+CSEG PFA_ICOMPARE_NEXTLOOP 0000fcca
+CSEG PFA_ICOMPARE_LC 0000fcd6
+CSEG VE_STAR 0000fce4
+CSEG XT_STAR 0000fce7
+CSEG PFA_STAR 0000fce8
+CSEG VE_J 0000fceb
+CSEG XT_J 0000fcee
+CSEG PFA_J 0000fcef
+CSEG VE_DABS 0000fcfb
+CSEG PFA_DABS 0000fd00
+CSEG PFA_DABS1 0000fd05
+CSEG VE_DNEGATE 0000fd06
+CSEG PFA_DNEGATE 0000fd0d
+CSEG VE_CMOVE 0000fd12
+CSEG XT_CMOVE 0000fd17
+CSEG PFA_CMOVE 0000fd18
+CSEG PFA_CMOVE1 0000fd25
+CSEG PFA_CMOVE2 0000fd21
+CSEG VE_2SWAP 0000fd2b
+CSEG PFA_2SWAP 0000fd31
+CSEG VE_REFILLTIB 0000fd36
+CSEG XT_REFILLTIB 0000fd3d
+CSEG PFA_REFILLTIB 0000fd3e
+CSEG XT_TIB 0000fd59
+CSEG XT_NUMBERTIB 0000fd5f
+CSEG VE_SOURCETIB 0000fd49
+CSEG XT_SOURCETIB 0000fd50
+CSEG PFA_SOURCETIB 0000fd51
+CSEG VE_TIB 0000fd55
+CSEG PFA_TIB 0000fd5a
+DSEG ram_tib 00000285
+CSEG VE_NUMBERTIB 0000fd5b
+CSEG PFA_NUMBERTIB 0000fd60
+DSEG ram_sharptib 000002df
+CSEG VE_EE2RAM 0000fd61
+CSEG XT_EE2RAM 0000fd66
+CSEG PFA_EE2RAM 0000fd67
+CSEG PFA_EE2RAM_1 0000fd69
+CSEG PFA_EE2RAM_2 0000fd73
+CSEG VE_INIT_RAM 0000fd75
+CSEG PFA_INI_RAM 0000fd7c
+ESEG EE_INITUSER 000000a8
+CSEG VE_BOUNDS 0000fd84
+CSEG PFA_BOUNDS 0000fd8a
+CSEG VE_S2D 0000fd8e
+CSEG PFA_S2D 0000fd93
+CSEG VE_TO_BODY 0000fd96
+CSEG VE_2LITERAL 0000fd9c
+CSEG PFA_2LITERAL 0000fda3
+CSEG VE_EQUAL 0000fda7
+CSEG PFA_EQUAL 0000fdab
+CSEG VE_ONE 0000fdae
+CSEG PFA_ONE 0000fdb2
+CSEG VE_TWO 0000fdb3
+CSEG PFA_TWO 0000fdb7
+CSEG VE_MINUSONE 0000fdb8
+CSEG XT_MINUSONE 0000fdbb
+CSEG PFA_MINUSONE 0000fdbc
+SET flashlast 0000fdbd
+DSEG HERESTART 000002e1
+ESEG EHERESTART 000000cc
+ESEG CFG_ORDERLIST 0000008a
+ESEG CFG_RECOGNIZERLIST 0000009c
+EQU UBRR_VAL 00000019
+EQU BAUD_REAL 0000963d
+EQU BAUD_ERROR 00000001
diff --git a/amforth-6.5/appl/arduino/readme.txt b/amforth-6.5/appl/arduino/readme.txt
new file mode 100644
index 0000000..45b79df
--- /dev/null
+++ b/amforth-6.5/appl/arduino/readme.txt
@@ -0,0 +1,50 @@
+Authore: Andy Kirby (andy@kirbyand.co.uk), Based on the Amforth Application Template.
+Licensing: as per the Amforth Project.
+
+These are demo application templates for using standard off the shelf Arduino Boards (or Clones) as an Amforth development system. Three of the templates are useable with DIL devices for cheap entry level use or embeding into your own breadboard/stripboard deisgns.
+
+Models Described are:-
+
+Model Microcontroler Host Xtal DBG-LED Flash B-Load Ram Fuses (E,H,L)
+Mega ATMega 1280 uart0 16Mhz PB7 128K 512b/1k/2k/4k 8k F7 D9 FF
+Diecimila ATMega 168 uart0 16Mhz PB5 16K 128b/256b/512b/1k 1k F9 DD FF
+Duemilanove ATMega 328 uart0 16Mhz PB5 32k 256b/512b/1k/2k 2k 05 D9 FF
+Uno ATMega 328 uart0 16Mhz PB5 32k 256b/512b/1k/2k 2k 05 D9 FF
+Sanguino ATMega 644 uart0 16Mhz PB0 64k 512/1k/2k/4k 4k FD F9 FF
+
+
+Notes
+
+0. double check the fuses settings. Esp. the duemilanove may have the wrong settings. set the HFuse to 0xd9
+ to maximize the bootloader size.
+
+1. Whilst most errors and problems you encounter are likely to be those I have created rather than the original
+ code on which this is based, please report forward comments, feedback, reports, bugs, fixes and patches etc
+ through the Amforth Projects development mailing lists and forums etc.
+
+2. The binary Amforth images cannot be loaded/programmed using the Arduino Bootloader. An ICSP programmer
+ (avrisp, etc) must be used to load the image.
+
+3. The Arduino bootloader is over writen with the Amforth code and is no longer available after programing.
+ To restore your board for use with the Arduino IDE you must overwrite the Amforth image with an Arduino
+ Bootloader image.
+
+4. The Sanguino is not correctly speaking an Arduino Project design, but forms the basis of the Reprap
+ controller designed and made popular by Makerbot. This processor/board is also notable for being the
+ largest ATMega device available in a DIL format that makes it poular for prototyping and ammateur constructors.
+
+5. The 168 and 328 devices similar to note 4 above are available in DIL packaging making them popular for
+ prototyping and ammateur constructors.
+
+6. The 1280 device is only available in surface mount options and is likely only to be found in commercialy
+ produced boards and used by dedicated electronics enthusiasts.
+
+7. Whilst described as using a 328 device early versions of the Duemilanove may actualy have a 168 installed.
+ This can be easily exchanged for a 328 if more resources are needed.
+
+8. The Diecimila board is also compatible with the 328 device commonly found in the newer Duemilanove board.
+
+9. For the arduino mega the content of the dict_appl.inc can be moved to dict_appl_core.inc. This gives more
+ usable dictionary space.
+
+10. The UNO has the same controller as the duemilanove, the hexfiles are the same. \ No newline at end of file
diff --git a/amforth-6.5/appl/arduino/sanguino.asm b/amforth-6.5/appl/arduino/sanguino.asm
new file mode 100644
index 0000000..ab95c11
--- /dev/null
+++ b/amforth-6.5/appl/arduino/sanguino.asm
@@ -0,0 +1,10 @@
+; 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"
+
+.equ F_CPU = 16000000
+.include "drivers/usart_0.asm"
+
+.include "amforth.asm"
diff --git a/amforth-6.5/appl/arduino/uno.asm b/amforth-6.5/appl/arduino/uno.asm
new file mode 100644
index 0000000..74a0d2b
--- /dev/null
+++ b/amforth-6.5/appl/arduino/uno.asm
@@ -0,0 +1,15 @@
+; 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"
+
+.equ F_CPU = 16000000
+.include "drivers/usart_0.asm"
+
+; settings for 1wire interface, if desired
+.equ OW_PORT=PORTB
+.EQU OW_BIT=4
+.include "drivers/1wire.asm"
+
+.include "amforth.asm"
diff --git a/amforth-6.5/appl/arduino/uno.eep.hex b/amforth-6.5/appl/arduino/uno.eep.hex
new file mode 100644
index 0000000..0011602
--- /dev/null
+++ b/amforth-6.5/appl/arduino/uno.eep.hex
@@ -0,0 +1,7 @@
+:10003400FFFFBA0AC2018E00CE095C00B008AC0A08
+:0A004400FF024800EC3F01004800F5
+:06005C00020070065C06C4
+:100066007D3B680000000000FF08AF08AF080000F5
+:100076000A00A300B1007800930077020000640232
+:08008600C83CE73CD73C19001F
+:00000001FF
diff --git a/amforth-6.5/appl/arduino/uno.hex b/amforth-6.5/appl/arduino/uno.hex
new file mode 100644
index 0000000..f0489b7
--- /dev/null
+++ b/amforth-6.5/appl/arduino/uno.hex
@@ -0,0 +1,620 @@
+: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
+:1000A4000C94043806FF6973722D72783D00003891
+:1000B4003C38C6009738B0383C380300DE3F35384A
+:1000C4006400373D43001F3800383C3859003C3841
+:1000D4002400A43C3C3800013C3816005339973EB8
+:1000E4001F3806FF72782D6275665400003893003D
+:1000F400353879003C3811019738B0383C38000164
+:100104009C399738C3382E3A3C380F00123A3C38A1
+:1001140011018C381F3807FF72783F2D6275660015
+:10012400730000382F3D3C38110197383C381001DA
+:10013400973812391F3807FF74782D706F6C6C0074
+:100144008D000038B1003538A4003C38C6008C3826
+:100154001F3808FF74783F2D706F6C6C9D00003859
+:100164002F3D3C38C00097383C382000123A1F38E5
+:1001740004FF75627272AB006E388C009F3DA93D1E
+:1001840006FF2B7573617274BA0000383C3898000E
+:100194003C38C1008C383C3806003C38C2008C38EE
+:1001A400BE00B038F83A3C38C5008C383C38C4003E
+:1001B4008C3866001F3808FF31772E7265736574BA
+:1001C400C200E4009A938A93249A2C98E0E8F7E01A
+:1001D4003197F1F71FB7F8942C9A2498E0E0F1E0F6
+:1001E4003197F1F783B184FF9FEF1FBF24982C98B8
+:1001F400E0E8F6E03197F1F7892F0C94043807FF13
+:1002040031772E736C6F7400DD0008012C98249AEA
+:100214001FB7F894E8E1F0E03197F1F788948795F7
+:1002240010F42C9A2498E4E2F0E03197F1F703B14A
+:1002340004FD8068ECECF0E03197F1F72C9A2498F7
+:0E024400E8E0F0E03197F1F71FBF0C940438AA
+:040000000C94383DE7
+:100252000A920FB60A920F900F900A94B02CFF9355
+:10026200EF93E2E1F1E00694E00DF31D00800394C8
+:100272000082EF91FF9109900FBE0990089502FF4D
+:100282006D2B01010038C63F143C1F3803FF756413
+:100292002A0040010038B038FE38DF39D838C33878
+:1002A200F538DF39E0389C391F3804FF756D617805
+:1002B20047010038C83E5B3935386001C338D83849
+:1002C2001F3804FF756D696E56010038C83E6639E5
+:1002D20035386C01C338D8381F3800383C380080B4
+:1002E200123A193935387701E53F1F384A391F3834
+:1002F2000AFF6E616D653E666C616773620100386C
+:10030200CA3B3C3800FF123A1F3803FF7665720081
+:1003120079010038DA020304AD3FBC3E7838E802C6
+:10032200403FC63F210329033C382E0012033F03FE
+:100332004A033904BC3E8038AD3FF00203041F3843
+:1003420004FF6E6F6F70860100381F3806FF756EEE
+:1003520075736564A10100388C3A223F92391F38C7
+:100362000200746FA70100384804CF3FB63E7838C8
+:100372003538C5015C07BF0167071F380038F538FB
+:10038200B038D101FE38CA3BB038D101D101CA3BE5
+:1003920029381F3807FF692D63656C6C2B00B1018A
+:1003A20000382E3A1F3808FF69636F6D70617265FD
+:1003B200CB010038FE38CE38F53812393538E50130
+:1003C200D13ED8384A391F38C33853392608353810
+:1003D20008029A3ACE387838CE38CA3BB0383C3820
+:1003E20000015B393538F901C3383C38FF00123A55
+:1003F200123935380002D13E4A39D33A1F382E3AE3
+:10040200C3388F3CC3383C380200B93AEB01D13EC5
+:1004120053391F3801FF2A00D4010038A539D838D2
+:100422001F3801FF6A000B020038753A3C3807009A
+:100432009C397838753A3C3809009C3978389C39AF
+:100442001F3804FF6461627312020038B038203929
+:1004520035382C0233021F3807FF646E65676174FA
+:100462006500220200383A3CE53F5339143C1F38FC
+:1004720005FF636D6F7665002D023F02BF93AF9358
+:10048200E991F991A991B991092F082B21F01D91B8
+:1004920011930197E1F7AF91BF91899199910C94D2
+:1004A200043805FF32737761700039020038E03892
+:1004B200FE38E038F5381F380AFF726566696C6CE1
+:1004C2002D7469625202003880023C385A00980446
+:1004D200860280385339E13E80384A391F380AFF94
+:1004E200736F757263652D7469625D0200388002F4
+:1004F200860278381F3803FF746962007002473839
+:100502002C0104FF237469627C024738860106FFCE
+:1005120065653E72616D8202003853399A3ACE386F
+:100522005E3BCE3880388F3CC3388F3CC338C83AE4
+:100532009002D13E1F3808FF696E69742D72616D99
+:10054200880200383C386A00013B3C382200033AFA
+:100552008D021F380BFF656E7669726F6E6D656E68
+:1005620074009C024738440009FF776F72646C691B
+:1005720073747300000000383C3808001F3804FF11
+:100582002F706164B50200388C3AE73E92391F3809
+:1005920005FF2F686F6C6400C0020038E73E223FFF
+:1005A20092391F380AFF666F7274682D6E616D652D
+:1005B200C9020038D0030700616D666F727468006B
+:1005C2001F3807FF76657273696F6E00D3020038B9
+:1005D2003C3841001F3803FF63707500E2020038A7
+:1005E2003C3837002F041F3808FF6D63752D696E84
+:1005F200666FEC0200383C3833001F3805FF2F7558
+:1006020073657200F50200383C382C001F3803FF76
+:10061200686C6400AB024738880104FF686F6C6441
+:10062200080300380C03B0387838343AB038FE3852
+:10063200C3388038F5388C381F3802FF3C230E034C
+:100642000038E73E0C0380381F3801FF23001E03E9
+:100652000038BC3E7838A603E0383C380900CE3872
+:100662006D39353837033C3807009C393C38300047
+:100672009C3912031F3802FF237326030038290313
+:10068200C83E1B3A1939353840031F3802FF233E52
+:100692003C030038D13E0C037838E73ECE3892391D
+:1006A2001F3804FF7369676E4703003820393538F5
+:1006B2005D033C382D0012031F3803FF642E7200C5
+:1006C20052030038FE38D93E260221033F03E038A8
+:1006D20056034A03F538CE389239B63F39041F38EB
+:1006E20002FF2E725E030038FE38C63FF538620301
+:1006F2001F3802FF642E7103003853396203AD3F85
+:100702001F3801FF2E007A030038C63F7D031F38D1
+:1007120003FF75642E008203003853399603AD3F00
+:100722001F3804FF75642E7289030038FE382103D6
+:100732003F034A03F538CE389239B63F39041F38A1
+:1007420006FF75642F6D6F6492030038FE385339CB
+:100752000739C139F538C338FE38C139F5381F3881
+:1007620006FF64696769743FA1030038653FB038CA
+:100772003C38390077393C380001123A9C39B0389C
+:100782003C38400177393C380701123A92393C38FB
+:1007920030009239B038BC3E78385B391F380038A7
+:1007A20007392F04F538CE382E3A033A9C392E3ABF
+:1007B200FE381F3802FF732CB1030038B038E20351
+:1007C2001F3800386707B038033AD93E0A3A9239DF
+:1007D200FE38533926083538F5039A3AB038783856
+:1007E20067078F3CC83AEF03F53827393538FC03E1
+:1007F200B03897386707D8381F3805FF69747970A1
+:100802006500DB030038B038033AD93E0A3A923920
+:10081200FE3853392608353817049A3AB038CA3B9D
+:10082200B038240420042E3AC83A0F04F538273988
+:1008320035381E04B038CA3B2404D8381F38003873
+:10084200F83A24041F3800383C38FF00123AF13ECF
+:100852001F3806FF69636F756E74FE030038B03887
+:100862002E3AC338CA3B1F3804FF747970652A04D4
+:100872000038983F2608353844049A3AAB3A9738FC
+:10088200F13EC83A3F041F3801FF27003504003803
+:10089200BB05FE050906B0389606DE3FC338CA3BE3
+:1008A2003C38A501DE3F1B3A35385A043C38F3FF89
+:1008B200853DD8381F3805FF63736B6970004504A6
+:1008C2000038FE38B03835387004CE3897380739DA
+:1008D200DE3F35387004E53FAC052E386304F53849
+:1008E200D8381F3805FF637363616E005C040038FB
+:1008F200FE38CE38B03897380739DE3F19393538E7
+:100902008D04C338343AC338CE38203919393538D2
+:100912008D042E3A2E387B04EF38CE389239F538D2
+:10092200D8381F3806FF616363657074730400383A
+:10093200CE389C39343ACE38023FB038D90419390E
+:100942003538CB04B0383C380800DE3F3538BB04BC
+:10095200D838E038C83E7739FE38E038E038F53824
+:100962003538B904D104343AFE38CE38F5385A0154
+:100972002E38C904B038533F6D393538C204D838DF
+:10098200533FB038F13ECE388C382E3ACE3866011D
+:100992002E389D04D838EF38C3389239A03F1F381B
+:1009A20000383C380800B038F13EAD3FF13E1F3808
+:1009B2000038B0383C380D00DE3FC3383C380A00FE
+:1009C200DE3F1B3A1F3806FF726566696C6C930442
+:1009D200FE3D1A00C73DD33D04FF63686172E40423
+:1009E2000038BB05D83897381F3806FF6E756D6220
+:1009F2006572ED040038BC3E7838FE383F05FE389B
+:100A020052053F05F5381B3AFE38B03819393538EA
+:100A12001205D13EF538D838F538BC3E8038533906
+:100A22001F381D3B533953392C3B7005B8383538C4
+:100A32003405E53FDE3F35382B0597383C382E002C
+:100A4200DE3F35382C05F538353828053302EA3FC4
+:100A52002E383A05D838D13EF538D838F538BC3E6C
+:100A6200803853391F38D13EF53835383905263E9E
+:100A7200E53FF538BC3E80384A391F380038CE3859
+:100A820097383C382D00DE3FB038FE3835384B05FC
+:100A9200E53FAC05F5381F3851380A001000020056
+:100AA2000A000038CE3897383C3823009239B038E3
+:100AB20053393C380400563E353868054D059C399B
+:100AC200CA3BBC3E8038E53FAC052E386905D838B4
+:100AD2001F3807FF3E6E756D62657200F6040038BE
+:100AE200B03835388805CE389738B60319393538D5
+:100AF2007C05D8381F38FE385702BC3E78384B0187
+:100B0200F53843015702E53FAC052E3871051F3811
+:100B120005FF7061727365006A050038FE38A20530
+:100B2200E13E7838AC05F5387804B0382E3AE13E2B
+:100B3200643AE53FAC051F3806FF736F7572636553
+:100B42008905FE3D1600C73DD33D07FF2F73747222
+:100B5200696E67009D050038E038CE389C39E03870
+:100B6200E03892391F380AFF70617273652D6E6129
+:100B72006D65A6050038533FBF051F380038FE38A3
+:100B8200A205E13E7838AC0507396104F5387804EE
+:100B9200C83E9C39A205D8389239E13E80381F38C8
+:100BA20003FF73703000B4056E380600C73DD33DB5
+:100BB20002FF7370D1055738080003FF72703000CE
+:100BC200D9050038E60578381F385738040005FF84
+:100BD200646570746800DE050038D5058C3A923978
+:100BE200033A343A1F3810FF666F7274682D7265CB
+:100BF200636F676E697A6572E8056E383E009F3DE5
+:100C0200A93D09FF7265636F676E697A6500F40535
+:100C120000383C381406C338A70919393538130689
+:100C2200D13E96061F380038E038E038C83E1D3BFA
+:100C3200E03829382C3BE038B0389606DE3F3538AC
+:100C42002506D83853391F38EF38EF384A391F385C
+:100C520009FF696E7465727072657400020600386D
+:100C6200BB05B03835384106FE050906B63E783870
+:100C720035383C06D101CA3B29388A3F2E38310625
+:100C8200D13E1F3806FF64743A6E756D29065138DD
+:100C9200A5017D077D0707FF64743A646E756D00D8
+:100CA20043065138A501D63FD63F07FF7265633A26
+:100CB2006E756D004C060038FB0435386806E53F5A
+:100CC200DE3F3538660648061F3852061F3896063C
+:100CD2001F3808FF7265633A66696E64560600380B
+:100CE2000B07B038193935387906D83896061F38C7
+:100CF20080061F3805FF64743A7874006A0651381A
+:100D020084068806D63F0038D83829381F3800387C
+:100D1200203935388E0667071F3829381F3807FFF4
+:100D220064743A6E756C6C007B0651389A069A06AA
+:100D32009A0600383C38F3FF853D0FFF73656172F8
+:100D420063682D776F72646C697374009006003863
+:100D5200FE3853393C38BD06F538DA06B038193951
+:100D62003538B706D13ED83853391F38B038010765
+:100D7200C33880016E011F380038FE38D838C83EAB
+:100D82000739F506DA013538CB06F538D838533944
+:100D92004A391F38D13EF53853391F3811FF747262
+:100DA2006176657273652D776F72646C6973740016
+:100DB2009E0600385E3BB0383538EB06C83E1D3B18
+:100DC200C33829382C3BE0383538EB06160ACA3BC3
+:100DD2002E38DC06D13E1F380BFF6E616D653E7307
+:100DE2007472696E6700CF0600382F043C38FF002A
+:100DF200123A1F3807FF6E66613E63666100ED06B8
+:100E02000038160A2E3A1F3807FF66696E642D787D
+:100E12007400FB0600383C3817073C384A00A70923
+:100E2200193935381607D13E53391F380038FE3884
+:100E3200C83EF538A806B03835382407FE38EF38F2
+:100E4200EF38F5384A391F3806FF6E6577657374D7
+:100E5200050747388A0106FF6C61746573742507BC
+:100E620047388E0108FF28637265617465292C0773
+:100E72000038BB059008B0382A078F3C80387508C7
+:100E82002A0780381F3801005C0033070038A205AA
+:100E9200EF38E13E80381F3801002800440700384F
+:100EA2003C3829008E05D13E1F3807FF636F6D70F5
+:100EB200696C65004D070038F538B038D101FE384D
+:100EC200CA3B67071F3801FF2C0056070038113F45
+:100ED200723B113F2E3ABF01123F1F3803005B27BE
+:100EE2005D006407003848047D071F3807006C69FD
+:100EF200746572616C006F0700385C073C386707E5
+:100F02001F380800736C69746572616C770700386A
+:100F12005C07D003DE031F380038113F5C07FFFF78
+:100F22001F3800388A3F113FC338723B1F380038E0
+:100F3200113F1F3800388A3F67071F380500616874
+:100F420065616400820700385C072E388D071F3800
+:100F5200020069669F0700385C0735388D071F3825
+:100F62000400656C7365A90700385C072E388D078D
+:100F7200C33892071F3804007468656EB1070038E1
+:100F820092071F380500626567696E00BC0700386A
+:100F920098071F3805007768696C6500C307003839
+:100FA200AC07C3381F380600726570656174CB07E1
+:100FB2000038ED07C0071F380500756E74696C00B4
+:100FC200D40700383C38353867079B071F380500BF
+:100FD200616761696E00DD0700385C072E389B0788
+:100FE2001F380200646FE80700385C079A3A9807D6
+:100FF200533950081F3804006C6F6F70F2070038C5
+:101002005C07C83A37081F3805002B6C6F6F7000F9
+:10101200FC0700385C07B93A37081F3805006C65D1
+:1010220061766500050800385C07D33AA4075008CA
+:101032001F3803003F646F000F0800385C07260862
+:10104200AC07F507C33850081F380038C83EDE3FEA
+:10105200B038FE3835382E08D13EF538FC391F3805
+:1010620007FF656E646C6F6F70001A0800389B078B
+:101072004408B83835384008C0072E3839081F38B8
+:1010820002FF6C3E310800386308783878383C3803
+:10109200FEFF6308643A1F3802FF3E6C41080038C5
+:1010A200EA3F6308643A6308783880381F3803FFE0
+:1010B2006C7030004D086E3840009F3DA93D02FF24
+:1010C2006C7058084738900106FF63726561746559
+:1010D20060080038390799085C0751381F3806FF45
+:1010E20068656164657265080038113FFE38FE3834
+:1010F200B038273935388708B0383C3800FF1B3AFA
+:10110200E203F5385E3B6707F5381F383C38F0FFDD
+:10111200853D07FF776C73636F7065007008FE3D55
+:101122003C009F3DA93D06FF72657665616C8A08A9
+:1011320000382A078F3C7838B8383538A4082A078F
+:101142007838C3383A3B1F380500646F65733E0038
+:10115200940800385C07BD085C070E945C07B2086F
+:101162001F389A938A93CB0101967F916F91BF9317
+:10117200AF93DB010C9404380038F5382A078F3C12
+:1011820078385E3B0107723B1F3801FF3A00A50821
+:1011920000383907D408D8381F3807FF3A6E6F6E07
+:1011A200616D6500C6080038113FB03831078038DC
+:1011B2005C070038E9081F3801003B00CE08003800
+:1011C2005C071F38F10899081F3801FF5D00DD0830
+:1011D2000038E53FB63E80381F3801005B00E60864
+:1011E20000385339B63E80381F3808FF766172697D
+:1011F20061626C65EE080038223F0809EA3F2B3F26
+:101202001F3808FF636F6E7374616E74F6080038DE
+:10121200390799085C07473867071F3804FF757359
+:10122200657202090038390799085C075738670761
+:101232001F38070072656375727365000F09003805
+:101242003107783867071F3809FF696D6D65646972
+:10125200617465001A090038CE095E3BB038CA3B9A
+:101262003C38FF7F123AC338723B1F3806005B637B
+:101272006861725D250900385C073C38F104670734
+:101282001F38060061626F72742237090038893E86
+:101292005C0759091F3805FF61626F7274004209C9
+:1012A20000384A39853D06FF3F61626F72744C090E
+:1012B2000038E03835385F0903045109D13E1F3840
+:1012C20009FF6765742D737461636B0054090038FC
+:1012D200B0388F3CC3385E3BB038FE385339C33820
+:1012E200260835387F099A3AAB3A343AC33ECE38AB
+:1012F2009C395E3BC3384A39B93A7509D13EF53853
+:101302001F3809FF7365742D737461636B00610983
+:101312000038CE382039353891093C38FCFF853DFC
+:10132200C83E3A3BC3385339260835389E099A3AA3
+:101332008F3CD93E3A3BC83A9909D8381F3809FF41
+:101342006D61702D737461636B0082090038B0386F
+:101352008F3CC3385E3BC33E983F26083538C309ED
+:101362009A3AAB3A5E3BC338FE3807392938B83867
+:101372003538BF09F538D838D33A1F38F538EA3F3F
+:10138200B93AB209D83853391F380BFF6765742D43
+:1013920063757272656E7400A00900383C384600AD
+:1013A2005E3B1F3809FF6765742D6F7264657200BA
+:1013B200C60900383C384A0068091F3809FF6366CD
+:1013C200672D6F7264657200D30947384A0007FFC0
+:1013D200636F6D7061726500DF09EF09BF93AF93B0
+:1013E2008C0189919991DC01899199919C01899152
+:1013F2009991FC01ED90F190EF1451F40A9519F0D6
+:101402002A95C1F701C02A95022B11F4882702C040
+:101412008FEF00C0982FAF91BF910C94043807FF53
+:101422006E66613E6C666100E8090038F5062E3A88
+:10143200033A9C391F380BFF7365742D6375727202
+:10144200656E7400100A00383C3846003A3B1F387B
+:1014520008FF776F72646C6973741C0A00381A3F54
+:101462005339CE383A3BB0388F3CBF011B3F1F384F
+:101472000EFF666F7274682D776F72646C69737495
+:10148200290A4738480009FF7365742D6F72646535
+:101492007200390A00383C384A0089091F380FFFA8
+:1014A2007365742D7265636F676E697A6572730016
+:1014B200440A00383C385C0089091F380FFF676511
+:1014C200742D7265636F676E697A65727300500A74
+:1014D20000383C385C0068091F3804FF636F64659C
+:1014E2005F0A003839079908113FD10167071F3891
+:1014F20008FF656E642D636F64656E0A00385C07D1
+:101502000C945C0704381F3808FF286D61726B6504
+:101512007229790A6E3868009F3DA93D0800706FF4
+:101522007374706F6E65850A0038BB05FE05090687
+:10153200B038FE38D101D101CA3B2938F538D10182
+:10154200CA3B67071F380BFF6170706C7475726E4F
+:101552006B6579008F0A0038C700963C8A01AD3F5F
+:10156200D0030A00466F7274686475696E6F030473
+:021572001F3820
+:10700000BF93AF93DB011196B21469F4FD01EE0F4B
+:10701000FF1F659175911196FB01EE0FFF1F059102
+:107020001591F80109949A938A938B2D9927BB2483
+:107030006FEB7CE3F1CF04FF65786974A40A203814
+:10704000AF91BF91E1CF07FF657865637574650007
+:107050001B382A38BC0189919991DECF2F38FD0168
+:10706000EE0FFF1FA591B591CFCF3638982B8991A0
+:107070009991A9F31196C8CF3D389A938A93FD014F
+:10708000EE0FFF1F859195911196BECF47389A93C9
+:107090008A93FB013196EE0FFF1F85919591B4CF36
+:1070A00051389A938A93CB010196AECF57389A9371
+:1070B0008A93FB013196EE0FFF1F85919591840D08
+:1070C000951DA2CF07FF2876616C756529002338CE
+:1070D0000038390799085C076E381F380E94B208DB
+:1070E000B038D101CA3B29381F3801FF400062384F
+:1070F0007938FC018191919187CF01FF210075388A
+:107100008138FC018991999191838083899199912A
+:107110007BCF02FF63217D388D38FC0189919991E5
+:1071200080838991999170CF02FF634089389838A4
+:10713000FC019927808168CF02FF407594380038A0
+:10714000013B9C3978381F3802FF21759C38003884
+:10715000013B9C3980381F3803FF64757000A438E8
+:10716000B1389A938A9350CF04FF3F647570AC385E
+:10717000B938082F092B11F09A938A9345CF04FF51
+:1071800073776170B438C4388C01899199911A93DE
+:107190000A933ACF04FF6F766572BF38CF389A935F
+:1071A0008A938A819B8130CF04FF64726F70CA38E2
+:1071B000D9388991999128CF03FF726F7400D43820
+:1071C000E1388C0129913991899199913A932A93C7
+:1071D0001A930A9319CF03FF6E697000DC38F038F8
+:1071E000229612CF02FF723EEB38F6389A938A93BA
+:1071F0008F919F9109CF02FF3E72F238FF389F9323
+:107200008F938991999100CF02FF7240FB38083922
+:107210009A938A938F919F919F938F93F5CE02FFBC
+:107220003C3E04390038DE3F19391F3802FF303D3B
+:107230000F391A39982BD1F530C002FF303C16397E
+:10724000213997FD2AC032C002FF303E1D3928394E
+:10725000821593055CF151F120C003FF64303E00BC
+:1072600024393239821593058991999182059305C4
+:10727000ECF0E1F012C003FF64303C002D394039DE
+:10728000229697FD0C944D390C94563904FF747274
+:1072900075653B394B399A938A938FEF9FEFB4CE44
+:1072A00001FF3000463954399A938A93C101ACCE1C
+:1072B00002FF753C50395C39299139918217930747
+:1072C000A8F3A1F3EACF02FF753E58390038C3385E
+:1072D0005B391F3801FF3C0063396E3929913991C0
+:1072E000281739071CF7D9CF01FF3E006A397839D2
+:1072F0002991399128173907CCF2C1F2CECF04FF7A
+:107300006C6F673274398439FC01992780E18A9562
+:1073100022F0EE0FFF1FD8F777CE9A9575CE01FFBA
+:107320002D007F39933909911991081B190BC80158
+:107330006BCE01FF2B008F399D3909911991800F78
+:10734000911F62CE02FF6D2A9939A6398C0189916D
+:1073500099919C0131027001209FC0013003F30814
+:10736000900DE11CF31C1203F308900DE11CF31CBB
+:107370009A938A93C70148CE06FF756D2F6D6F648F
+:10738000A239C2397C01299139910991199140E1C1
+:107390005527000F111F221F331F551F2E153F05A4
+:1073A000520518F003952E193F094A9589F73A932B
+:1073B0002A93C80129CE03FF756D2A00BC39E03934
+:1073C0008C0189919991809FF00122273327909F0A
+:1073D000F00D211D331D819FF00D211D331D919F47
+:1073E000200D311DCF019A938A93C9010DCE06FF5E
+:1073F000696E76657274DB39FD398095909504CE9F
+:1074000002FF322FF739043A95958795FDCD02FF9B
+:10741000322A003A0B3A880F991FF6CD03FF616EAE
+:107420006400073A133A0991199180239123ECCD16
+:1074300002FF6F720E3A1C3A09911991802B912B21
+:10744000E3CD03FF786F7200183A263A099119913B
+:1074500080279127D9CD02FF312B213A2F3A01966F
+:10746000D3CD02FF312D2B3A353A0197CDCD07FF11
+:107470003F6E656761746500313A003820393538F0
+:10748000423A263E1F3806FF6C7368696674373AC5
+:10749000493AFC018991999131971AF0880F991F07
+:1074A000FBCFB2CD06FF727368696674433A583AEF
+:1074B000FC018991999131971AF096958795FBCFA8
+:1074C000A3CD02FF2B21523A653AFC018991999193
+:1074D00020813181820F931F8083918389919991BB
+:1074E00093CD03FF72704000613A763A9A938A9383
+:1074F0008DB79EB789CD03FF72702100713A803A33
+:107500002FB7F8948DBF9EBF2FBF899199917CCDE5
+:1075100003FF737040007B3A8D3A9A938A93CE01B1
+:1075200073CD03FF73702100883A963AEC0189917C
+:1075300099916ACD9B3A29913991E0E83E0F821BDF
+:10754000930B3F932F939F938F93899199915CCD48
+:1075500001FF6900913AAC3A9A938A938F919F9177
+:10756000EF91FF91FF93EF939F938F938E0F9F1F48
+:107570004BCDBA3AEF91FF91E80FF91F899199919C
+:107580001BF0FF93EF936BCD0F911F9111963CCDA4
+:10759000C93AEF91FF913196BBF3F3CF06FF756EB9
+:1075A0006C6F6F70A83AD43A1F910F911F910F9191
+:1075B0002BCD06FF636D6F76653ECE3ADF3ABF9303
+:1075C000AF93E991F991A991B991092F082B41F055
+:1075D000E80FF91FA80FB91F1E9112930197E1F749
+:1075E000AF91BF91899199910FCD02FF3E3CD93A5D
+:1075F000F93A092F982F802F07CD03FF75704000AF
+:10760000F53A023B9A938A93C201FECC03FF757050
+:107610002100FD3A0B3B2C0189919991F5CC03FF98
+:10762000316D7300063B143BE0EAFFE03197F1F760
+:10763000EBCC03FF323E72000F3B1E3BFC018991F5
+:1076400099919F938F93FF93EF9389919991DCCCBC
+:1076500003FF32723E00193B2D3B9A938A93EF91C0
+:10766000FF918F919F919A938A93CF01CDCC02FF86
+:107670002165283B3B3BFC01899199912FB7F894F8
+:1076800028D000B5081709F00BD0319622D000B5EC
+:10769000091711F0892F04D02FBF89919991B4CC8B
+:1076A000F999FECF07B700FDFDCFF2BDE1BD80BD6A
+:1076B000FA9AF99A089502FF4065373B5F3B2FB76E
+:1076C000F894FC0106D080B5319603D090B52FBF59
+:1076D0009BCCF999FECFF2BDE1BDF89A089502FF67
+:1076E00021695B3BFE3D66009F3DA93D09FF2821C6
+:1076F000692D6E72777729006F3B7E3B1FB71F9312
+:10770000F8949C0189919991AF93BF93CF93DF93A4
+:1077100009D0DF91CF91BF91AF91899199911F913C
+:107720001FBF72CC10D0E094F0948E219F21982B33
+:1077300019F0F90102E020D0F90104E01DD0F901AF
+:1077400000E11AD00895F901E07CFF7FEF01A0E489
+:10775000B0E0FE01EE0FFF1F45915591FE01E217CB
+:10776000F30711F00A0102C07A010C01002704D0CE
+:107770002196119771F70895F999FECF17B710FD6B
+:10778000FDCFEE0FFF1F016007BFE895089502FFD0
+:107790004069763BCB3BFC01EE0FFF1F8591959135
+:1077A00033CC03FF6E3E7200C73BD63BFC01082F73
+:1077B000899199919F938F930A95D1F7EF93FF93B6
+:1077C0008991999121CC03FF6E723E00D13BE83B39
+:1077D0009A938A93FF91EF910E2F8F919F919A9395
+:1077E0008A930A95D1F7CF010FCC03FF64322A00A8
+:1077F000E33BFA3B09911991000F111F881F991F54
+:107800001A930A9301CC03FF64322F00F53B083C26
+:107810000991199195958795179507951A930A934C
+:10782000F3CB02FF642B033C153C29913991E9907D
+:10783000F99049915991240F351F8E1D9F1D3A9340
+:107840002A93E2CB02FF642D113C263C2991399109
+:10785000E990F99049915991421B530BE80AF90AB2
+:107860005A934A93C701D0CB07FF64696E7665725D
+:107870007400223C3B3C09911991809590950095AC
+:1078800010951A930A93C0CB04FF2F6D6F64343C9C
+:10789000493C9C0109911991412F432717FF04C0CE
+:1078A000109500950F5F1F4F37FF04C0309520954E
+:1078B0002F5F3F4FEE24FF1851E1001F111F5A9513
+:1078C00039F447FF04C0109500950F5F1F4F0BC0A0
+:1078D000EE1CFF1CE21AF30A20F4E20EF31E889459
+:1078E000ECCF0894EACFFA92EA92C8018DCB03FF5D
+:1078F00061627300443C0038B0383D3A1F3804FFE1
+:107900007069636B773C00382E3AC33E8C3A9C39E1
+:1079100078381F3805FF63656C6C2B007F3C903C0A
+:10792000029672CB04FF2B696E748A3C973C789464
+:107930006BCB04FF2D696E74923C9E3CF89464CB33
+:1079400004FF696E7421993C00383C3800009C3972
+:107950003A3B1F3804FF696E7440A03C00383C3845
+:1079600000009C395E3B1F3808FF696E742D7472ED
+:107970006170AA3CBB3CB82E8991999145CB0038E7
+:10798000AE3C2938C43C1F38C53C01D03DCB1895CE
+:107990000038D0030300206F6B0003041F3803FF7F
+:1079A0002E6F6B00B43CFE3D1C00C73DD33D00383C
+:1079B000D00302003E20A03F03041F3806FF2E72B2
+:1079C00065616479CF3CFE3D2000C73DD33D003862
+:1079D000D0030400203F3F200304BC3E7838FE382B
+:1079E000403F8503E13E78388503F538BC3E80385A
+:1079F0001F3806FF2E6572726F72DE3CFE3D1E0060
+:107A0000C73DD33D04FF71756974F93C00385C08CB
+:107A100063088038D505953AE2057F3AF108B63E0D
+:107A2000783819393538153DE33CE9043538273DB8
+:107A30003C3830066F3DB8383538273DB0383C38D3
+:107A4000FEFF6D393538253DFE3C2E38073DD33CD1
+:107A50002E380F3D05FF706175736500023DFE3DD8
+:107A60009201B33DBD3D04FF636F6C642A3D383D18
+:107A7000A4B622243324BB2424BEE0E0F1E021920A
+:107A8000E030E9F7F930D9F7E4E9F1E02F010FEF41
+:107A90000DBF048318E01EBF1583CFEAC683D8E06C
+:107AA000D783A9E5BDE3B0CA04FF7761726D333DAA
+:107AB0000038A2023C38A5013C382F3DDE3DF108DC
+:107AC0005B3F063D07FF68616E646C657200543D64
+:107AD00057380A0005FF636174636800623D00382F
+:107AE0008C3AFE38683D7838FE38753A683D803803
+:107AF0002938F538683D8038F538D83853391F387B
+:107B000005FF7468726F77006A3D0038B038193924
+:107B100035388C3DD8381F38683D78387F3AF5388D
+:107B2000683D8038F538C338FE38953AD838F5388E
+:107B30001F3807FF4564656665724000803D003868
+:107B4000CA3B5E3B1F3807FF4564656665722100CE
+:107B5000993D0038CA3B3A3B1F3807FF52646566BF
+:107B600065724000A33D0038CA3B78381F3807FFD4
+:107B70005264656665722100AD3D0038CA3B8038AD
+:107B80001F3807FF5564656665724000B73D0038D1
+:107B9000CA3B013B9C3978381F3807FF556465663E
+:107BA00065722100C13D0038CA3B013B9C398038D9
+:107BB0001F3806FF646566657221CD3D0038CF3FF2
+:107BC000B038D101D101CA3B29381F3806FF64659E
+:107BD00066657240D93D0038CF3FB038D101CA3B0D
+:107BE00029381F3807FF2864656665722900E63D5D
+:107BF0000038390799085C07FE3D1F380E94B2081B
+:107C0000B038D101CA3B293829381F3802FF752EF8
+:107C1000F23D003853398D031F3803FF752E720073
+:107C2000063E00385339C33896031F3805FF752FB9
+:107C30006D6F64000D3E0038FE385339F538C13998
+:107C40001F3806FF6E6567617465163E0038FC39A3
+:107C50002E3A1F3801FF2F00213E0038483CEF38F4
+:107C60001F3803FF6D6F64002A3E0038483CD83847
+:107C70001F3803FF6D696E00313E0038C83E77390A
+:107C80003538433EC338D8381F3803FF6D6178005C
+:107C9000393E0038C83E6D3935384F3EC338D83884
+:107CA0001F3806FF77697468696E453E0038CE3824
+:107CB0009239FE389239F5385B391F380DFF7368F9
+:107CC0006F772D776F72646C69737400513E003862
+:107CD0003C386D3EC338DA061F380038F506030419
+:107CE000AD3F4A391F3805FF776F726473005E3EFF
+:107CF00000383C384C005E3B673E1F3802002E22A5
+:107D0000733E0038893E5C0703041F38020073226B
+:107D10007E3E00383C3822008E05B63E7838353835
+:107D2000923E88071F3804FF66696C6C863E0038F7
+:107D3000E038E038B8383538A43E983F9A3AB03841
+:107D4000AB3A8C38C83A9F3ED8381F3805FF665F7B
+:107D500063707500933E00383C3800243C38F400D2
+:107D60001F3805FF737461746500A63E4738C00173
+:107D700004FF62617365B13E57380C0005FF63650F
+:107D80006C6C7300B83E0B3A04FF32647570BE3EF3
+:107D90000038CE38CE381F3805FF3264726F70005D
+:107DA000C43E0038D838D8381F3804FF7475636B68
+:107DB000CC3E0038C338CE381F3803FF3E696E0012
+:107DC000D53E5738180003FF70616400DD3E00386F
+:107DD000223F3C3828009C391F3804FF656D6974C8
+:107DE000E33EFE3D0E00C73DD33D05FF656D697462
+:107DF0003F00ED3EFE3D1000C73DD33D03FF6B65E8
+:107E00007900F53EFE3D1200C73DD33D04FF6B6592
+:107E1000793FFE3EFE3D1400C73DD33D02FF647036
+:107E2000063F6E3836009F3DA93D05FF65686572C7
+:107E300065000E3F6E383A009F3DA93D04FF68651E
+:107E40007265153F6E3838009F3DA93D05FF616C96
+:107E50006C6F74001E3F0038223F9C39BF01233FE6
+:107E60001F3803FF62696E00263F0038EA3FBC3EC0
+:107E700080381F3807FF646563696D616C00313FAE
+:107E800000383C380A00BC3E80381F3803FF686564
+:107E900078003A3F00383C381000BC3E80381F382C
+:107EA00002FF626C463F4738200007FF7475726E10
+:107EB0006B657900503FFE3D42009F3DA93D07FFA5
+:107EC000746F757070657200553F0038B0383C387B
+:107ED00061003C387B00563E3538713F3C38DF004E
+:107EE000123A1F3807FF746F6C6F776572005F3F3F
+:107EF0000038B0383C3841003C385B00563E3538DD
+:107F0000843F3C3820001B3A1F3806FF3F737461E2
+:107F1000636B723F0038ED0520393538923F3C38AD
+:107F2000FCFF853D1F3806FF626F756E6473853FE9
+:107F30000038CE389C39C3381F3802FF6372933F34
+:107F400000383C380D00F13E3C380A00F13E1F3845
+:107F500005FF7370616365009D3F0038533FF13E3C
+:107F60001F3806FF737061636573A83F003853398B
+:107F7000493EB0383538C03FAD3F343A2E38B93F6E
+:107F8000D8381F3803FF733E6400B13F0038B03863
+:107F900020391F3805FF3E626F647900C23F2F3AD7
+:107FA0000800326C69746572616CCA3F0038C3386E
+:107FB0007D077D071F3801FF3D00D03F0038923913
+:107FC00019391F3801FF3100DB3F4738010001FF3D
+:107FD0003200E23F4738020002FF2D31E73F4738C9
+:027FE000FFFFA1
+:00000001FF
diff --git a/amforth-6.5/appl/arduino/uno.lst b/amforth-6.5/appl/arduino/uno.lst
new file mode 100644
index 0000000..ee0e8b2
--- /dev/null
+++ b/amforth-6.5/appl/arduino/uno.lst
@@ -0,0 +1,10263 @@
+
+AVRASM ver. 2.1.52 uno.asm Sun Apr 30 20:10:12 2017
+
+uno.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'
+uno.asm(8): 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'
+uno.asm(13): Including file '../../avr8\drivers/1wire.asm'
+uno.asm(15): 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(4): 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(6): Including file 'words/applturnkey.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
+
+ .equ F_CPU = 16000000
+ .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 3804 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 3800 .dw DO_COLON
+ usart_rx_isr:
+00005a 383c .dw XT_DOLITERAL
+00005b 00c6 .dw usart_data
+00005c 3897 .dw XT_CFETCH
+00005d 38b0 .dw XT_DUP
+00005e 383c .dw XT_DOLITERAL
+00005f 0003 .dw 3
+000060 3fde .dw XT_EQUAL
+000061 3835 .dw XT_DOCONDBRANCH
+000062 0064 .dw usart_rx_isr1
+000063 3d37 .dw XT_COLD
+ usart_rx_isr1:
+000064 0043 .dw XT_TO_RXBUF
+000065 381f .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 3800 .dw DO_COLON
+ PFA_USART_INIT_RX_BUFFER: ; ( -- )
+000067 383c
+000068 0059 .dw XT_DOLITERAL, XT_ISR_RX
+000069 383c
+00006a 0024 .dw XT_DOLITERAL, URXCaddr
+00006b 3ca4 .dw XT_INTSTORE
+
+00006c 383c .dw XT_DOLITERAL
+00006d 0100 .dw usart_rx_data
+00006e 383c .dw XT_DOLITERAL
+00006f 0016 .dw usart_rx_size + 6
+000070 3953 .dw XT_ZERO
+000071 3e97 .dw XT_FILL
+000072 381f .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 3800 .dw DO_COLON
+ PFA_RX_BUFFER:
+000079 0093 .dw XT_RXQ_BUFFER
+00007a 3835 .dw XT_DOCONDBRANCH
+00007b 0079 .dw PFA_RX_BUFFER
+00007c 383c .dw XT_DOLITERAL
+00007d 0111 .dw usart_rx_out
+00007e 3897 .dw XT_CFETCH
+00007f 38b0 .dw XT_DUP
+000080 383c .dw XT_DOLITERAL
+000081 0100 .dw usart_rx_data
+000082 399c .dw XT_PLUS
+000083 3897 .dw XT_CFETCH
+000084 38c3 .dw XT_SWAP
+000085 3a2e .dw XT_1PLUS
+000086 383c .dw XT_DOLITERAL
+000087 000f .dw usart_rx_mask
+000088 3a12 .dw XT_AND
+000089 383c .dw XT_DOLITERAL
+00008a 0111 .dw usart_rx_out
+00008b 388c .dw XT_CSTORE
+00008c 381f .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 3800 .dw DO_COLON
+ PFA_RXQ_BUFFER:
+000094 3d2f .dw XT_PAUSE
+000095 383c .dw XT_DOLITERAL
+000096 0111 .dw usart_rx_out
+000097 3897 .dw XT_CFETCH
+000098 383c .dw XT_DOLITERAL
+000099 0110 .dw usart_rx_in
+00009a 3897 .dw XT_CFETCH
+00009b 3912 .dw XT_NOTEQUAL
+00009c 381f .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 3800 .dw DO_COLON
+ PFA_TX_POLL:
+ ; wait for data ready
+0000a4 00b1 .dw XT_TXQ_POLL
+0000a5 3835 .dw XT_DOCONDBRANCH
+0000a6 00a4 .dw PFA_TX_POLL
+ ; send to usart
+0000a7 383c .dw XT_DOLITERAL
+0000a8 00c6 .dw USART_DATA
+0000a9 388c .dw XT_CSTORE
+0000aa 381f .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 3800 .dw DO_COLON
+ PFA_TXQ_POLL:
+0000b2 3d2f .dw XT_PAUSE
+0000b3 383c .dw XT_DOLITERAL
+0000b4 00c0 .dw USART_A
+0000b5 3897 .dw XT_CFETCH
+0000b6 383c .dw XT_DOLITERAL
+0000b7 0020 .dw bm_USART_TXRD
+0000b8 3a12 .dw XT_AND
+0000b9 381f .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 386e .dw PFA_DOVALUE1
+ PFA_UBRR: ; ( -- )
+0000bf 008c .dw EE_UBRRVAL
+0000c0 3d9f .dw XT_EDEFERFETCH
+0000c1 3da9 .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 3800 .dw DO_COLON
+ PFA_USART: ; ( -- )
+
+0000c8 383c .dw XT_DOLITERAL
+0000c9 0098 .dw USART_B_VALUE
+0000ca 383c .dw XT_DOLITERAL
+0000cb 00c1 .dw USART_B
+0000cc 388c .dw XT_CSTORE
+
+0000cd 383c .dw XT_DOLITERAL
+0000ce 0006 .dw USART_C_VALUE
+0000cf 383c .dw XT_DOLITERAL
+0000d0 00c2 .dw USART_C | bm_USARTC_en
+0000d1 388c .dw XT_CSTORE
+
+0000d2 00be .dw XT_UBRR
+0000d3 38b0 .dw XT_DUP
+0000d4 3af8 .dw XT_BYTESWAP
+0000d5 383c .dw XT_DOLITERAL
+0000d6 00c5 .dw BAUDRATE_HIGH
+0000d7 388c .dw XT_CSTORE
+0000d8 383c .dw XT_DOLITERAL
+0000d9 00c4 .dw BAUDRATE_LOW
+0000da 388c .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 381f .dw XT_EXIT
+
+ ; settings for 1wire interface, if desired
+ .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 3804 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 3804 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 3d38 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 3800 .dw DO_COLON
+ PFA_MPLUS:
+000144 3fc6 .dw XT_S2D
+000145 3c14 .dw XT_DPLUS
+000146 381f .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 3800 .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 38b0
+00014d 38fe
+00014e 39df
+00014f 38d8 .DW XT_DUP,XT_TO_R,XT_UMSTAR,XT_DROP
+000150 38c3
+000151 38f5
+000152 39df
+000153 38e0
+000154 399c
+000155 381f .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 3800 .dw DO_COLON
+ PFA_UMAX:
+ .endif
+
+00015b 3ec8
+00015c 395b .DW XT_2DUP,XT_ULESS
+00015d 3835 .dw XT_DOCONDBRANCH
+00015e 0160 DEST(UMAX1)
+00015f 38c3 .DW XT_SWAP
+000160 38d8 UMAX1: .DW XT_DROP
+000161 381f .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 3800 .dw DO_COLON
+ PFA_UMIN:
+ .endif
+000167 3ec8
+000168 3966 .DW XT_2DUP,XT_UGREATER
+000169 3835 .dw XT_DOCONDBRANCH
+00016a 016c DEST(UMIN1)
+00016b 38c3 .DW XT_SWAP
+00016c 38d8 UMIN1: .DW XT_DROP
+00016d 381f .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 3800 .dw DO_COLON
+ PFA_IMMEDIATEQ:
+00016f 383c .dw XT_DOLITERAL
+000170 8000 .dw $8000
+000171 3a12 .dw XT_AND
+000172 3919 .dw XT_ZEROEQUAL
+000173 3835 .dw XT_DOCONDBRANCH
+000174 0177 DEST(IMMEDIATEQ1)
+000175 3fe5 .dw XT_ONE
+000176 381f .dw XT_EXIT
+ IMMEDIATEQ1:
+ ; not immediate
+000177 394a .dw XT_TRUE
+000178 381f .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 3800 .dw DO_COLON
+ PFA_NAME2FLAGS:
+000181 3bca .dw XT_FETCHI ; skip to link field
+000182 383c .dw XT_DOLITERAL
+000183 ff00 .dw $ff00
+000184 3a12 .dw XT_AND
+000185 381f .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 3800 .dw DO_COLON
+ PFA_DOT_VER:
+ .endif
+00018b 02da .dw XT_ENV_FORTHNAME
+00018c 0403 .dw XT_ITYPE
+00018d 3fad .dw XT_SPACE
+00018e 3ebc .dw XT_BASE
+00018f 3878 .dw XT_FETCH
+
+000190 02e8 .dw XT_ENV_FORTHVERSION
+000191 3f40 .dw XT_DECIMAL
+000192 3fc6 .dw XT_S2D
+000193 0321 .dw XT_L_SHARP
+000194 0329 .dw XT_SHARP
+000195 383c .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 3ebc .dw XT_BASE
+00019c 3880 .dw XT_STORE
+00019d 3fad .dw XT_SPACE
+00019e 02f0 .dw XT_ENV_CPU
+00019f 0403 .dw XT_ITYPE
+
+0001a0 381f .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 3800 .dw DO_COLON
+ PFA_NOOP:
+ .endif
+0001a6 381f .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 3800 .dw DO_COLON
+ PFA_UNUSED:
+0001ad 3a8c .dw XT_SP_FETCH
+0001ae 3f22 .dw XT_HERE
+0001af 3992 .dw XT_MINUS
+0001b0 381f .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 3800 .dw DO_COLON
+ PFA_TO:
+ .endif
+0001b5 0448 .dw XT_TICK
+0001b6 3fcf .dw XT_TO_BODY
+0001b7 3eb6 .dw XT_STATE
+0001b8 3878 .dw XT_FETCH
+0001b9 3835 .dw XT_DOCONDBRANCH
+0001ba 01c5 DEST(PFA_TO1)
+0001bb 075c .dw XT_COMPILE
+0001bc 01bf .dw XT_DOTO
+0001bd 0767 .dw XT_COMMA
+0001be 381f .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 3800 .dw DO_COLON
+ PFA_DOTO:
+ .endif
+0001c0 38f5 .dw XT_R_FROM
+0001c1 38b0 .dw XT_DUP
+0001c2 01d1 .dw XT_ICELLPLUS
+0001c3 38fe .dw XT_TO_R
+0001c4 3bca .dw XT_FETCHI
+ PFA_TO1:
+0001c5 38b0 .dw XT_DUP
+0001c6 01d1 .dw XT_ICELLPLUS
+0001c7 01d1 .dw XT_ICELLPLUS
+0001c8 3bca .dw XT_FETCHI
+0001c9 3829 .dw XT_EXECUTE
+0001ca 381f .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 3800 .dw DO_COLON
+ PFA_ICELLPLUS:
+0001d2 3a2e .dw XT_1PLUS
+0001d3 381f .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 3800 .dw DO_COLON
+ PFA_ICOMPARE:
+0001db 38fe .dw XT_TO_R ; ( -- r-addr r-len f-addr)
+0001dc 38ce .dw XT_OVER ; ( -- r-addr r-len f-addr r-len)
+0001dd 38f5 .dw XT_R_FROM ; ( -- r-addr r-len f-addr r-len f-len )
+0001de 3912 .dw XT_NOTEQUAL ; ( -- r-addr r-len f-addr flag )
+0001df 3835 .dw XT_DOCONDBRANCH
+0001e0 01e5 .dw PFA_ICOMPARE_SAMELEN
+0001e1 3ed1 .dw XT_2DROP
+0001e2 38d8 .dw XT_DROP
+0001e3 394a .dw XT_TRUE
+0001e4 381f .dw XT_EXIT
+ PFA_ICOMPARE_SAMELEN:
+0001e5 38c3 .dw XT_SWAP ; ( -- r-addr f-addr len )
+0001e6 3953 .dw XT_ZERO
+0001e7 0826 .dw XT_QDOCHECK
+0001e8 3835 .dw XT_DOCONDBRANCH
+0001e9 0208 .dw PFA_ICOMPARE_DONE
+0001ea 3a9a .dw XT_DODO
+ PFA_ICOMPARE_LOOP:
+ ; ( r-addr f-addr --)
+0001eb 38ce .dw XT_OVER
+0001ec 3878 .dw XT_FETCH
+ .if WANT_IGNORECASE == 1
+ .endif
+0001ed 38ce .dw XT_OVER
+0001ee 3bca .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 38b0 .dw XT_DUP
+ ;.dw XT_BYTESWAP
+0001f0 383c .dw XT_DOLITERAL
+0001f1 0100 .dw $100
+0001f2 395b .dw XT_ULESS
+0001f3 3835 .dw XT_DOCONDBRANCH
+0001f4 01f9 .dw PFA_ICOMPARE_LASTCELL
+0001f5 38c3 .dw XT_SWAP
+0001f6 383c .dw XT_DOLITERAL
+0001f7 00ff .dw $00FF
+0001f8 3a12 .dw XT_AND ; the final swap can be omitted
+ PFA_ICOMPARE_LASTCELL:
+0001f9 3912 .dw XT_NOTEQUAL
+0001fa 3835 .dw XT_DOCONDBRANCH
+0001fb 0200 .dw PFA_ICOMPARE_NEXTLOOP
+0001fc 3ed1 .dw XT_2DROP
+0001fd 394a .dw XT_TRUE
+0001fe 3ad3 .dw XT_UNLOOP
+0001ff 381f .dw XT_EXIT
+ PFA_ICOMPARE_NEXTLOOP:
+000200 3a2e .dw XT_1PLUS
+000201 38c3 .dw XT_SWAP
+000202 3c8f .dw XT_CELLPLUS
+000203 38c3 .dw XT_SWAP
+000204 383c .dw XT_DOLITERAL
+000205 0002 .dw 2
+000206 3ab9 .dw XT_DOPLUSLOOP
+000207 01eb .dw PFA_ICOMPARE_LOOP
+ PFA_ICOMPARE_DONE:
+000208 3ed1 .dw XT_2DROP
+000209 3953 .dw XT_ZERO
+00020a 381f .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 3800 .dw DO_COLON
+ PFA_STAR:
+ .endif
+
+00020f 39a5 .dw XT_MSTAR
+000210 38d8 .dw XT_DROP
+000211 381f .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 3800 .dw DO_COLON
+ PFA_J:
+000216 3a75 .dw XT_RP_FETCH
+000217 383c .dw XT_DOLITERAL
+000218 0007 .dw 7
+000219 399c .dw XT_PLUS
+00021a 3878 .dw XT_FETCH
+00021b 3a75 .dw XT_RP_FETCH
+00021c 383c .dw XT_DOLITERAL
+00021d 0009 .dw 9
+00021e 399c .dw XT_PLUS
+00021f 3878 .dw XT_FETCH
+000220 399c .dw XT_PLUS
+000221 381f .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 3800 .dw DO_COLON
+ PFA_DABS:
+000227 38b0 .dw XT_DUP
+000228 3920 .dw XT_ZEROLESS
+000229 3835 .dw XT_DOCONDBRANCH
+00022a 022c .dw PFA_DABS1
+00022b 0233 .dw XT_DNEGATE
+ PFA_DABS1:
+00022c 381f .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 3800 .dw DO_COLON
+ PFA_DNEGATE:
+000234 3c3a .dw XT_DINVERT
+000235 3fe5 .dw XT_ONE
+000236 3953 .dw XT_ZERO
+000237 3c14 .dw XT_DPLUS
+000238 381f .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 3804 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 3800 .dw DO_COLON
+ PFA_2SWAP:
+
+ .endif
+000258 38e0 .dw XT_ROT
+000259 38fe .dw XT_TO_R
+00025a 38e0 .dw XT_ROT
+00025b 38f5 .dw XT_R_FROM
+00025c 381f .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 3800 .dw DO_COLON
+ PFA_REFILLTIB:
+ .endif
+000265 0280 .dw XT_TIB
+000266 383c .dw XT_DOLITERAL
+000267 005a .dw TIB_SIZE
+000268 0498 .dw XT_ACCEPT
+000269 0286 .dw XT_NUMBERTIB
+00026a 3880 .dw XT_STORE
+00026b 3953 .dw XT_ZERO
+00026c 3ee1 .dw XT_TO_IN
+00026d 3880 .dw XT_STORE
+00026e 394a .dw XT_TRUE ; -1
+00026f 381f .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 3800 .dw DO_COLON
+ PFA_SOURCETIB:
+ .endif
+000278 0280 .dw XT_TIB
+000279 0286 .dw XT_NUMBERTIB
+00027a 3878 .dw XT_FETCH
+00027b 381f .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 3847 .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 3847 .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 3800 .dw DO_COLON
+ PFA_EE2RAM: ; ( -- )
+00028e 3953 .dw XT_ZERO
+00028f 3a9a .dw XT_DODO
+ PFA_EE2RAM_1:
+ ; ( -- e-addr r-addr )
+000290 38ce .dw XT_OVER
+000291 3b5e .dw XT_FETCHE
+000292 38ce .dw XT_OVER
+000293 3880 .dw XT_STORE
+000294 3c8f .dw XT_CELLPLUS
+000295 38c3 .dw XT_SWAP
+000296 3c8f .dw XT_CELLPLUS
+000297 38c3 .dw XT_SWAP
+000298 3ac8 .dw XT_DOLOOP
+000299 0290 .dw PFA_EE2RAM_1
+ PFA_EE2RAM_2:
+00029a 3ed1 .dw XT_2DROP
+00029b 381f .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 3800 .dw DO_COLON
+ PFA_INI_RAM: ; ( -- )
+0002a3 383c .dw XT_DOLITERAL
+0002a4 006a .dw EE_INITUSER
+0002a5 3b01 .dw XT_UP_FETCH
+0002a6 383c .dw XT_DOLITERAL
+0002a7 0022 .dw SYSUSERSIZE
+0002a8 3a03 .dw XT_2SLASH
+0002a9 028d .dw XT_EE2RAM
+0002aa 381f .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 3847 .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 3800 .dw DO_COLON
+ PFA_ENVWORDLISTS:
+0002bd 383c .dw XT_DOLITERAL
+0002be 0008 .dw NUMWORDLISTS
+0002bf 381f .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 3800 .dw DO_COLON
+ PFA_ENVSLASHPAD:
+0002c5 3a8c .dw XT_SP_FETCH
+0002c6 3ee7 .dw XT_PAD
+0002c7 3992 .dw XT_MINUS
+0002c8 381f .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 3800 .dw DO_COLON
+ PFA_ENVSLASHHOLD:
+ .endif
+0002cf 3ee7 .dw XT_PAD
+0002d0 3f22 .dw XT_HERE
+0002d1 3992 .dw XT_MINUS
+0002d2 381f .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 3800 .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 381f .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 3800 .dw DO_COLON
+ PFA_EN_FORTHVERSION:
+ .endif
+0002e9 383c .dw XT_DOLITERAL
+0002ea 0041 .dw 65
+0002eb 381f .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 3800 .dw DO_COLON
+ PFA_EN_CPU:
+ .endif
+0002f1 383c .dw XT_DOLITERAL
+0002f2 0037 .dw mcu_name
+0002f3 042f .dw XT_ICOUNT
+0002f4 381f .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 3800 .dw DO_COLON
+ PFA_EN_MCUINFO:
+0002fc 383c .dw XT_DOLITERAL
+0002fd 0033 .dw mcu_info
+0002fe 381f .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 3800 .dw DO_COLON
+ PFA_ENVUSERSIZE:
+ .endif
+000305 383c .dw XT_DOLITERAL
+000306 002c .dw SYSUSERSIZE + APPUSERSIZE
+000307 381f .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 3847 .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 3800 .dw DO_COLON
+ PFA_HOLD:
+ .endif
+000313 030c .dw XT_HLD
+000314 38b0 .dw XT_DUP
+000315 3878 .dw XT_FETCH
+000316 3a34 .dw XT_1MINUS
+000317 38b0 .dw XT_DUP
+000318 38fe .dw XT_TO_R
+000319 38c3 .dw XT_SWAP
+00031a 3880 .dw XT_STORE
+00031b 38f5 .dw XT_R_FROM
+00031c 388c .dw XT_CSTORE
+00031d 381f .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 3800 .dw DO_COLON
+ PFA_L_SHARP:
+ .endif
+000322 3ee7 .dw XT_PAD
+000323 030c .dw XT_HLD
+000324 3880 .dw XT_STORE
+000325 381f .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 3800 .dw DO_COLON
+ PFA_SHARP:
+ .endif
+00032a 3ebc .dw XT_BASE
+00032b 3878 .dw XT_FETCH
+00032c 03a6 .dw XT_UDSLASHMOD
+00032d 38e0 .dw XT_ROT
+00032e 383c .dw XT_DOLITERAL
+00032f 0009 .dw 9
+000330 38ce .dw XT_OVER
+000331 396d .dw XT_LESS
+000332 3835 .dw XT_DOCONDBRANCH
+000333 0337 DEST(PFA_SHARP1)
+000334 383c .dw XT_DOLITERAL
+000335 0007 .dw 7
+000336 399c .dw XT_PLUS
+ PFA_SHARP1:
+000337 383c .dw XT_DOLITERAL
+000338 0030 .dw 48 ; ASCII 0
+000339 399c .dw XT_PLUS
+00033a 0312 .dw XT_HOLD
+00033b 381f .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 3800 .dw DO_COLON
+ PFA_SHARP_S:
+ .endif
+ NUMS1:
+000340 0329 .dw XT_SHARP
+000341 3ec8 .dw XT_2DUP
+000342 3a1b .dw XT_OR
+000343 3919 .dw XT_ZEROEQUAL
+000344 3835 .dw XT_DOCONDBRANCH
+000345 0340 DEST(NUMS1) ; PFA_SHARP_S
+000346 381f .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 3800 .dw DO_COLON
+ PFA_SHARP_G:
+ .endif
+00034b 3ed1 .dw XT_2DROP
+00034c 030c .dw XT_HLD
+00034d 3878 .dw XT_FETCH
+00034e 3ee7 .dw XT_PAD
+00034f 38ce .dw XT_OVER
+000350 3992 .dw XT_MINUS
+000351 381f .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 3800 .dw DO_COLON
+ PFA_SIGN:
+ .endif
+000357 3920 .dw XT_ZEROLESS
+000358 3835 .dw XT_DOCONDBRANCH
+000359 035d DEST(PFA_SIGN1)
+00035a 383c .dw XT_DOLITERAL
+00035b 002d .dw 45 ; ascii -
+00035c 0312 .dw XT_HOLD
+ PFA_SIGN1:
+00035d 381f .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 3800 .dw DO_COLON
+ PFA_DDOTR:
+
+ .endif
+000363 38fe .dw XT_TO_R
+000364 3ed9 .dw XT_TUCK
+000365 0226 .dw XT_DABS
+000366 0321 .dw XT_L_SHARP
+000367 033f .dw XT_SHARP_S
+000368 38e0 .dw XT_ROT
+000369 0356 .dw XT_SIGN
+00036a 034a .dw XT_SHARP_G
+00036b 38f5 .dw XT_R_FROM
+00036c 38ce .dw XT_OVER
+00036d 3992 .dw XT_MINUS
+00036e 3fb6 .dw XT_SPACES
+00036f 0439 .dw XT_TYPE
+000370 381f .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 3800 .dw DO_COLON
+ PFA_DOTR:
+
+ .endif
+000375 38fe .dw XT_TO_R
+000376 3fc6 .dw XT_S2D
+000377 38f5 .dw XT_R_FROM
+000378 0362 .dw XT_DDOTR
+000379 381f .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 3800 .dw DO_COLON
+ PFA_DDOT:
+
+ .endif
+00037e 3953 .dw XT_ZERO
+00037f 0362 .dw XT_DDOTR
+000380 3fad .dw XT_SPACE
+000381 381f .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 3800 .dw DO_COLON
+ PFA_DOT:
+ .endif
+000386 3fc6 .dw XT_S2D
+000387 037d .dw XT_DDOT
+000388 381f .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 3800 .dw DO_COLON
+ PFA_UDDOT:
+ .endif
+00038e 3953 .dw XT_ZERO
+00038f 0396 .dw XT_UDDOTR
+000390 3fad .dw XT_SPACE
+000391 381f .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 3800 .dw DO_COLON
+ PFA_UDDOTR:
+ .endif
+000397 38fe .dw XT_TO_R
+000398 0321 .dw XT_L_SHARP
+000399 033f .dw XT_SHARP_S
+00039a 034a .dw XT_SHARP_G
+00039b 38f5 .dw XT_R_FROM
+00039c 38ce .dw XT_OVER
+00039d 3992 .dw XT_MINUS
+00039e 3fb6 .dw XT_SPACES
+00039f 0439 .dw XT_TYPE
+0003a0 381f .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 3800 .dw DO_COLON
+ PFA_UDSLASHMOD:
+ .endif
+0003a7 38fe .dw XT_TO_R
+0003a8 3953 .dw XT_ZERO
+0003a9 3907 .dw XT_R_FETCH
+0003aa 39c1 .dw XT_UMSLASHMOD
+0003ab 38f5 .dw XT_R_FROM
+0003ac 38c3 .dw XT_SWAP
+0003ad 38fe .dw XT_TO_R
+0003ae 39c1 .dw XT_UMSLASHMOD
+0003af 38f5 .dw XT_R_FROM
+0003b0 381f .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 3800 .dw DO_COLON
+ PFA_DIGITQ:
+ .endif
+0003b7 3f65 .dw XT_TOUPPER
+0003b8 38b0
+0003b9 383c
+0003ba 0039
+0003bb 3977
+0003bc 383c
+0003bd 0100 .DW XT_DUP,XT_DOLITERAL,57,XT_GREATER,XT_DOLITERAL,256
+0003be 3a12
+0003bf 399c
+0003c0 38b0
+0003c1 383c
+0003c2 0140
+0003c3 3977 .DW XT_AND,XT_PLUS,XT_DUP,XT_DOLITERAL,320,XT_GREATER
+0003c4 383c
+0003c5 0107
+0003c6 3a12
+0003c7 3992
+0003c8 383c
+0003c9 0030 .DW XT_DOLITERAL,263,XT_AND,XT_MINUS,XT_DOLITERAL,48
+0003ca 3992
+0003cb 38b0
+0003cc 3ebc
+0003cd 3878
+0003ce 395b .DW XT_MINUS,XT_DUP,XT_BASE,XT_FETCH,XT_ULESS
+0003cf 381f .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 3800 .dw DO_COLON
+ PFA_DOSLITERAL:
+0003d1 3907 .dw XT_R_FETCH ; ( -- addr )
+0003d2 042f .dw XT_ICOUNT
+0003d3 38f5 .dw XT_R_FROM
+0003d4 38ce .dw XT_OVER ; ( -- addr' n addr n)
+0003d5 3a2e .dw XT_1PLUS
+0003d6 3a03 .dw XT_2SLASH ; ( -- addr' n addr k )
+0003d7 399c .dw XT_PLUS ; ( -- addr' n addr'' )
+0003d8 3a2e .dw XT_1PLUS
+0003d9 38fe .dw XT_TO_R ; ( -- )
+0003da 381f .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 3800 .dw DO_COLON
+ PFA_SCOMMA:
+0003df 38b0 .dw XT_DUP
+0003e0 03e2 .dw XT_DOSCOMMA
+0003e1 381f .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 3800 .dw DO_COLON
+ PFA_DOSCOMMA:
+0003e3 0767 .dw XT_COMMA
+0003e4 38b0 .dw XT_DUP ; ( --addr len len)
+0003e5 3a03 .dw XT_2SLASH ; ( -- addr len len/2
+0003e6 3ed9 .dw XT_TUCK ; ( -- addr len/2 len len/2
+0003e7 3a0a .dw XT_2STAR ; ( -- addr len/2 len len'
+0003e8 3992 .dw XT_MINUS ; ( -- addr len/2 rem
+0003e9 38fe .dw XT_TO_R
+0003ea 3953 .dw XT_ZERO
+0003eb 0826 .dw XT_QDOCHECK
+0003ec 3835 .dw XT_DOCONDBRANCH
+0003ed 03f5 .dw PFA_SCOMMA2
+0003ee 3a9a .dw XT_DODO
+ PFA_SCOMMA1:
+0003ef 38b0 .dw XT_DUP ; ( -- addr addr )
+0003f0 3878 .dw XT_FETCH ; ( -- addr c1c2 )
+0003f1 0767 .dw XT_COMMA ; ( -- addr )
+0003f2 3c8f .dw XT_CELLPLUS ; ( -- addr+cell )
+0003f3 3ac8 .dw XT_DOLOOP
+0003f4 03ef .dw PFA_SCOMMA1
+ PFA_SCOMMA2:
+0003f5 38f5 .dw XT_R_FROM
+0003f6 3927 .dw XT_GREATERZERO
+0003f7 3835 .dw XT_DOCONDBRANCH
+0003f8 03fc .dw PFA_SCOMMA3
+0003f9 38b0 .dw XT_DUP ; well, tricky
+0003fa 3897 .dw XT_CFETCH
+0003fb 0767 .dw XT_COMMA
+ PFA_SCOMMA3:
+0003fc 38d8 .dw XT_DROP ; ( -- )
+0003fd 381f .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 3800 .dw DO_COLON
+ PFA_ITYPE:
+000404 38b0 .dw XT_DUP ; ( --addr len len)
+000405 3a03 .dw XT_2SLASH ; ( -- addr len len/2
+000406 3ed9 .dw XT_TUCK ; ( -- addr len/2 len len/2
+000407 3a0a .dw XT_2STAR ; ( -- addr len/2 len len'
+000408 3992 .dw XT_MINUS ; ( -- addr len/2 rem
+000409 38fe .dw XT_TO_R
+00040a 3953 .dw XT_ZERO
+00040b 0826 .dw XT_QDOCHECK
+00040c 3835 .dw XT_DOCONDBRANCH
+00040d 0417 .dw PFA_ITYPE2
+00040e 3a9a .dw XT_DODO
+ PFA_ITYPE1:
+00040f 38b0 .dw XT_DUP ; ( -- addr addr )
+000410 3bca .dw XT_FETCHI ; ( -- addr c1c2 )
+000411 38b0 .dw XT_DUP
+000412 0424 .dw XT_LOWEMIT
+000413 0420 .dw XT_HIEMIT
+000414 3a2e .dw XT_1PLUS ; ( -- addr+cell )
+000415 3ac8 .dw XT_DOLOOP
+000416 040f .dw PFA_ITYPE1
+ PFA_ITYPE2:
+000417 38f5 .dw XT_R_FROM
+000418 3927 .dw XT_GREATERZERO
+000419 3835 .dw XT_DOCONDBRANCH
+00041a 041e .dw PFA_ITYPE3
+00041b 38b0 .dw XT_DUP ; make sure the drop below has always something to do
+00041c 3bca .dw XT_FETCHI
+00041d 0424 .dw XT_LOWEMIT
+ PFA_ITYPE3:
+00041e 38d8 .dw XT_DROP
+00041f 381f .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 3800 .dw DO_COLON
+ PFA_HIEMIT:
+000421 3af8 .dw XT_BYTESWAP
+000422 0424 .dw XT_LOWEMIT
+000423 381f .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 3800 .dw DO_COLON
+ PFA_LOWEMIT:
+000425 383c .dw XT_DOLITERAL
+000426 00ff .dw $00ff
+000427 3a12 .dw XT_AND
+000428 3ef1 .dw XT_EMIT
+000429 381f .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 3800 .dw DO_COLON
+ PFA_ICOUNT:
+000430 38b0 .dw XT_DUP
+000431 3a2e .dw XT_1PLUS
+000432 38c3 .dw XT_SWAP
+000433 3bca .dw XT_FETCHI
+000434 381f .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 3800 .dw DO_COLON
+ PFA_TYPE:
+
+ .endif
+00043a 3f98 .dw XT_BOUNDS
+00043b 0826 .dw XT_QDOCHECK
+00043c 3835 .dw XT_DOCONDBRANCH
+00043d 0444 DEST(PFA_TYPE2)
+00043e 3a9a .dw XT_DODO
+ PFA_TYPE1:
+00043f 3aab .dw XT_I
+000440 3897 .dw XT_CFETCH
+000441 3ef1 .dw XT_EMIT
+000442 3ac8 .dw XT_DOLOOP
+000443 043f DEST(PFA_TYPE1)
+ PFA_TYPE2:
+000444 381f .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 3800 .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 38b0 .dw XT_DUP
+00044d 0696 .dw XT_DT_NULL
+00044e 3fde .dw XT_EQUAL
+00044f 38c3 .dw XT_SWAP
+000450 3bca .dw XT_FETCHI
+000451 383c .dw XT_DOLITERAL
+000452 01a5 .dw XT_NOOP
+000453 3fde .dw XT_EQUAL
+000454 3a1b .dw XT_OR
+000455 3835 .dw XT_DOCONDBRANCH
+000456 045a DEST(PFA_TICK1)
+000457 383c .dw XT_DOLITERAL
+000458 fff3 .dw -13
+000459 3d85 .dw XT_THROW
+ PFA_TICK1:
+00045a 38d8 .dw XT_DROP
+00045b 381f .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 3800 .dw DO_COLON
+ PFA_CSKIP:
+ .endif
+000462 38fe .dw XT_TO_R ; ( -- addr1 n1 )
+ PFA_CSKIP1:
+000463 38b0 .dw XT_DUP ; ( -- addr' n' n' )
+000464 3835 .dw XT_DOCONDBRANCH ; ( -- addr' n')
+000465 0470 DEST(PFA_CSKIP2)
+000466 38ce .dw XT_OVER ; ( -- addr' n' addr' )
+000467 3897 .dw XT_CFETCH ; ( -- addr' n' c' )
+000468 3907 .dw XT_R_FETCH ; ( -- addr' n' c' c )
+000469 3fde .dw XT_EQUAL ; ( -- addr' n' f )
+00046a 3835 .dw XT_DOCONDBRANCH ; ( -- addr' n')
+00046b 0470 DEST(PFA_CSKIP2)
+00046c 3fe5 .dw XT_ONE
+00046d 05ac .dw XT_SLASHSTRING
+00046e 382e .dw XT_DOBRANCH
+00046f 0463 DEST(PFA_CSKIP1)
+ PFA_CSKIP2:
+000470 38f5 .dw XT_R_FROM
+000471 38d8 .dw XT_DROP ; ( -- addr2 n2)
+000472 381f .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 3800 .dw DO_COLON
+ PFA_CSCAN:
+ .endif
+000479 38fe .dw XT_TO_R
+00047a 38ce .dw XT_OVER
+ PFA_CSCAN1:
+00047b 38b0 .dw XT_DUP
+00047c 3897 .dw XT_CFETCH
+00047d 3907 .dw XT_R_FETCH
+00047e 3fde .dw XT_EQUAL
+00047f 3919 .dw XT_ZEROEQUAL
+000480 3835 .dw XT_DOCONDBRANCH
+000481 048d DEST(PFA_CSCAN2)
+000482 38c3 .dw XT_SWAP
+000483 3a34 .dw XT_1MINUS
+000484 38c3 .dw XT_SWAP
+000485 38ce .dw XT_OVER
+000486 3920 .dw XT_ZEROLESS ; not negative
+000487 3919 .dw XT_ZEROEQUAL
+000488 3835 .dw XT_DOCONDBRANCH
+000489 048d DEST(PFA_CSCAN2)
+00048a 3a2e .dw XT_1PLUS
+00048b 382e .dw XT_DOBRANCH
+00048c 047b DEST(PFA_CSCAN1)
+ PFA_CSCAN2:
+00048d 38ef .dw XT_NIP
+00048e 38ce .dw XT_OVER
+00048f 3992 .dw XT_MINUS
+000490 38f5 .dw XT_R_FROM
+000491 38d8 .dw XT_DROP
+000492 381f .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 3800 .dw DO_COLON
+ PFA_ACCEPT:
+
+ .endif
+000499 38ce
+00049a 399c
+00049b 3a34
+00049c 38ce .DW XT_OVER,XT_PLUS,XT_1MINUS,XT_OVER
+00049d 3f02
+00049e 38b0
+00049f 04d9
+0004a0 3919
+0004a1 3835 ACC1: .DW XT_KEY,XT_DUP,XT_CRLFQ,XT_ZEROEQUAL,XT_DOCONDBRANCH
+0004a2 04cb DEST(ACC5)
+0004a3 38b0
+0004a4 383c
+0004a5 0008
+0004a6 3fde
+0004a7 3835 .DW XT_DUP,XT_DOLITERAL,8,XT_EQUAL,XT_DOCONDBRANCH
+0004a8 04bb DEST(ACC3)
+0004a9 38d8
+0004aa 38e0
+0004ab 3ec8
+0004ac 3977
+0004ad 38fe
+0004ae 38e0
+0004af 38e0
+0004b0 38f5
+0004b1 3835 .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 3a34
+0004b5 38fe
+0004b6 38ce
+0004b7 38f5
+0004b8 015a .DW XT_BS,XT_1MINUS,XT_TO_R,XT_OVER,XT_R_FROM,XT_UMAX
+0004b9 382e ACC6: .DW XT_DOBRANCH
+0004ba 04c9 DEST(ACC4)
+
+
+ ACC3: ; check for remaining control characters, replace them with blank
+0004bb 38b0 .dw XT_DUP ; ( -- addr k k )
+0004bc 3f53 .dw XT_BL
+0004bd 396d .dw XT_LESS
+0004be 3835 .dw XT_DOCONDBRANCH
+0004bf 04c2 DEST(PFA_ACCEPT6)
+0004c0 38d8 .dw XT_DROP
+0004c1 3f53 .dw XT_BL
+ PFA_ACCEPT6:
+0004c2 38b0
+0004c3 3ef1
+0004c4 38ce
+0004c5 388c
+0004c6 3a2e
+0004c7 38ce
+0004c8 0166 .DW XT_DUP,XT_EMIT,XT_OVER,XT_CSTORE,XT_1PLUS,XT_OVER,XT_UMIN
+0004c9 382e ACC4: .DW XT_DOBRANCH
+0004ca 049d DEST(ACC1)
+0004cb 38d8
+0004cc 38ef
+0004cd 38c3
+0004ce 3992
+0004cf 3fa0
+0004d0 381f 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 3800 .dw DO_COLON
+ .endif
+0004d2 383c .dw XT_DOLITERAL
+0004d3 0008 .dw 8
+0004d4 38b0 .dw XT_DUP
+0004d5 3ef1 .dw XT_EMIT
+0004d6 3fad .dw XT_SPACE
+0004d7 3ef1 .dw XT_EMIT
+0004d8 381f .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 3800 .dw DO_COLON
+ .endif
+0004da 38b0 .dw XT_DUP
+0004db 383c .dw XT_DOLITERAL
+0004dc 000d .dw 13
+0004dd 3fde .dw XT_EQUAL
+0004de 38c3 .dw XT_SWAP
+0004df 383c .dw XT_DOLITERAL
+0004e0 000a .dw 10
+0004e1 3fde .dw XT_EQUAL
+0004e2 3a1b .dw XT_OR
+0004e3 381f .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 3dfe .dw PFA_DODEFER1
+ PFA_REFILL:
+ .endif
+0004ea 001a .dw USER_REFILL
+0004eb 3dc7 .dw XT_UDEFERFETCH
+0004ec 3dd3 .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 3800 .dw DO_COLON
+ PFA_CHAR:
+ .endif
+0004f2 05bb .dw XT_PARSENAME
+0004f3 38d8 .dw XT_DROP
+0004f4 3897 .dw XT_CFETCH
+0004f5 381f .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 3800 .dw DO_COLON
+ PFA_NUMBER:
+ .endif
+0004fc 3ebc .dw XT_BASE
+0004fd 3878 .dw XT_FETCH
+0004fe 38fe .dw XT_TO_R
+0004ff 053f .dw XT_QSIGN
+000500 38fe .dw XT_TO_R
+000501 0552 .dw XT_SET_BASE
+000502 053f .dw XT_QSIGN
+000503 38f5 .dw XT_R_FROM
+000504 3a1b .dw XT_OR
+000505 38fe .dw XT_TO_R
+ ; check whether something is left
+000506 38b0 .dw XT_DUP
+000507 3919 .dw XT_ZEROEQUAL
+000508 3835 .dw XT_DOCONDBRANCH
+000509 0512 DEST(PFA_NUMBER0)
+ ; nothing is left. It cannot be a number at all
+00050a 3ed1 .dw XT_2DROP
+00050b 38f5 .dw XT_R_FROM
+00050c 38d8 .dw XT_DROP
+00050d 38f5 .dw XT_R_FROM
+00050e 3ebc .dw XT_BASE
+00050f 3880 .dw XT_STORE
+000510 3953 .dw XT_ZERO
+000511 381f .dw XT_EXIT
+ PFA_NUMBER0:
+000512 3b1d .dw XT_2TO_R
+000513 3953 .dw XT_ZERO ; starting value
+000514 3953 .dw XT_ZERO
+000515 3b2c .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 38b8 .dw XT_QDUP
+000518 3835 .dw XT_DOCONDBRANCH
+000519 0534 DEST(PFA_NUMBER1)
+ ; if equal 1: mayba a trailing dot? --> double cell number
+00051a 3fe5 .dw XT_ONE
+00051b 3fde .dw XT_EQUAL
+00051c 3835 .dw XT_DOCONDBRANCH
+00051d 052b DEST(PFA_NUMBER2)
+ ; excatly one character is left
+00051e 3897 .dw XT_CFETCH
+00051f 383c .dw XT_DOLITERAL
+000520 002e .dw 46 ; .
+000521 3fde .dw XT_EQUAL
+000522 3835 .dw XT_DOCONDBRANCH
+000523 052c DEST(PFA_NUMBER6)
+ ; its a double cell number
+ ; incorporate sign into number
+000524 38f5 .dw XT_R_FROM
+000525 3835 .dw XT_DOCONDBRANCH
+000526 0528 DEST(PFA_NUMBER3)
+000527 0233 .dw XT_DNEGATE
+ PFA_NUMBER3:
+000528 3fea .dw XT_TWO
+000529 382e .dw XT_DOBRANCH
+00052a 053a DEST(PFA_NUMBER5)
+ PFA_NUMBER2:
+00052b 38d8 .dw XT_DROP
+ PFA_NUMBER6:
+00052c 3ed1 .dw XT_2DROP
+00052d 38f5 .dw XT_R_FROM
+00052e 38d8 .dw XT_DROP
+00052f 38f5 .dw XT_R_FROM
+000530 3ebc .dw XT_BASE
+000531 3880 .dw XT_STORE
+000532 3953 .dw XT_ZERO
+000533 381f .dw XT_EXIT
+ PFA_NUMBER1:
+000534 3ed1 .dw XT_2DROP ; remove the address
+ ; incorporate sign into number
+000535 38f5 .dw XT_R_FROM
+000536 3835 .dw XT_DOCONDBRANCH
+000537 0539 DEST(PFA_NUMBER4)
+000538 3e26 .dw XT_NEGATE
+ PFA_NUMBER4:
+000539 3fe5 .dw XT_ONE
+ PFA_NUMBER5:
+00053a 38f5 .dw XT_R_FROM
+00053b 3ebc .dw XT_BASE
+00053c 3880 .dw XT_STORE
+00053d 394a .dw XT_TRUE
+00053e 381f .dw XT_EXIT
+ .include "words/q-sign.asm"
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ XT_QSIGN:
+00053f 3800 .dw DO_COLON
+ PFA_QSIGN: ; ( c -- )
+ .endif
+000540 38ce .dw XT_OVER ; ( -- addr len addr )
+000541 3897 .dw XT_CFETCH
+000542 383c .dw XT_DOLITERAL
+000543 002d .dw '-'
+000544 3fde .dw XT_EQUAL ; ( -- addr len flag )
+000545 38b0 .dw XT_DUP
+000546 38fe .dw XT_TO_R
+000547 3835 .dw XT_DOCONDBRANCH
+000548 054b DEST(PFA_NUMBERSIGN_DONE)
+000549 3fe5 .dw XT_ONE ; skip sign character
+00054a 05ac .dw XT_SLASHSTRING
+ PFA_NUMBERSIGN_DONE:
+00054b 38f5 .dw XT_R_FROM
+00054c 381f .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 3851 .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 3800 .dw DO_COLON
+ PFA_SET_BASE: ; ( adr1 len1 -- adr2 len2 )
+ .endif
+000553 38ce .dw XT_OVER
+000554 3897 .dw XT_CFETCH
+000555 383c .dw XT_DOLITERAL
+000556 0023 .dw 35
+000557 3992 .dw XT_MINUS
+000558 38b0 .dw XT_DUP
+000559 3953 .dw XT_ZERO
+00055a 383c .dw XT_DOLITERAL
+00055b 0004 .dw 4
+00055c 3e56 .dw XT_WITHIN
+00055d 3835 .dw XT_DOCONDBRANCH
+00055e 0568 DEST(SET_BASE1)
+ .if cpu_msp430==1
+ .endif
+00055f 054d .dw XT_BASES
+000560 399c .dw XT_PLUS
+000561 3bca .dw XT_FETCHI
+000562 3ebc .dw XT_BASE
+000563 3880 .dw XT_STORE
+000564 3fe5 .dw XT_ONE
+000565 05ac .dw XT_SLASHSTRING
+000566 382e .dw XT_DOBRANCH
+000567 0569 DEST(SET_BASE2)
+ SET_BASE1:
+000568 38d8 .dw XT_DROP
+ SET_BASE2:
+000569 381f .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 3800 .dw DO_COLON
+
+ .endif
+
+000571 38b0
+000572 3835 TONUM1: .DW XT_DUP,XT_DOCONDBRANCH
+000573 0588 DEST(TONUM3)
+000574 38ce
+000575 3897
+000576 03b6 .DW XT_OVER,XT_CFETCH,XT_DIGITQ
+000577 3919
+000578 3835 .DW XT_ZEROEQUAL,XT_DOCONDBRANCH
+000579 057c DEST(TONUM2)
+00057a 38d8
+00057b 381f .DW XT_DROP,XT_EXIT
+00057c 38fe
+00057d 0257
+00057e 3ebc
+00057f 3878
+000580 014b TONUM2: .DW XT_TO_R,XT_2SWAP,XT_BASE,XT_FETCH,XT_UDSTAR
+000581 38f5
+000582 0143
+000583 0257 .DW XT_R_FROM,XT_MPLUS,XT_2SWAP
+000584 3fe5
+000585 05ac
+000586 382e .DW XT_ONE,XT_SLASHSTRING,XT_DOBRANCH
+000587 0571 DEST(TONUM1)
+000588 381f 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 3800 .dw DO_COLON
+ PFA_PARSE:
+ .endif
+00058f 38fe .dw XT_TO_R ; ( -- )
+000590 05a2 .dw XT_SOURCE ; ( -- addr len)
+000591 3ee1 .dw XT_TO_IN ; ( -- addr len >in)
+000592 3878 .dw XT_FETCH
+000593 05ac .dw XT_SLASHSTRING ; ( -- addr' len' )
+
+000594 38f5 .dw XT_R_FROM ; ( -- addr' len' c)
+000595 0478 .dw XT_CSCAN ; ( -- addr' len'')
+000596 38b0 .dw XT_DUP ; ( -- addr' len'' len'')
+000597 3a2e .dw XT_1PLUS
+000598 3ee1 .dw XT_TO_IN ; ( -- addr' len'' len'' >in)
+000599 3a64 .dw XT_PLUSSTORE ; ( -- addr' len')
+00059a 3fe5 .dw XT_ONE
+00059b 05ac .dw XT_SLASHSTRING
+00059c 381f .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 3dfe .dw PFA_DODEFER1
+ PFA_SOURCE:
+ .endif
+0005a3 0016 .dw USER_SOURCE
+0005a4 3dc7 .dw XT_UDEFERFETCH
+0005a5 3dd3 .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 3800 .dw DO_COLON
+ PFA_SLASHSTRING:
+ .endif
+0005ad 38e0 .dw XT_ROT
+0005ae 38ce .dw XT_OVER
+0005af 399c .dw XT_PLUS
+0005b0 38e0 .dw XT_ROT
+0005b1 38e0 .dw XT_ROT
+0005b2 3992 .dw XT_MINUS
+0005b3 381f .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 3800 .dw DO_COLON
+ PFA_PARSENAME:
+ .endif
+0005bc 3f53 .dw XT_BL
+0005bd 05bf .dw XT_SKIPSCANCHAR
+0005be 381f .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 3800 .dw DO_COLON
+ PFA_SKIPSCANCHAR:
+ .endif
+0005c0 38fe .dw XT_TO_R
+0005c1 05a2 .dw XT_SOURCE
+0005c2 3ee1 .dw XT_TO_IN
+0005c3 3878 .dw XT_FETCH
+0005c4 05ac .dw XT_SLASHSTRING
+
+0005c5 3907 .dw XT_R_FETCH
+0005c6 0461 .dw XT_CSKIP
+0005c7 38f5 .dw XT_R_FROM
+0005c8 0478 .dw XT_CSCAN
+
+ ; adjust >IN
+0005c9 3ec8 .dw XT_2DUP
+0005ca 399c .dw XT_PLUS
+0005cb 05a2 .dw XT_SOURCE
+0005cc 38d8 .dw XT_DROP
+0005cd 3992 .dw XT_MINUS
+0005ce 3ee1 .dw XT_TO_IN
+0005cf 3880 .dw XT_STORE
+0005d0 381f .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 386e .dw PFA_DOVALUE1
+ PFA_SP0:
+0005d6 0006 .dw USER_SP0
+0005d7 3dc7 .dw XT_UDEFERFETCH
+0005d8 3dd3 .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 3857 .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 3800 .dw DO_COLON
+ PFA_RP0:
+0005e3 05e6 .dw XT_DORP0
+0005e4 3878 .dw XT_FETCH
+0005e5 381f .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 3857 .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 3800 .dw DO_COLON
+ PFA_DEPTH:
+ .endif
+0005ee 05d5 .dw XT_SP0
+0005ef 3a8c .dw XT_SP_FETCH
+0005f0 3992 .dw XT_MINUS
+0005f1 3a03 .dw XT_2SLASH
+0005f2 3a34 .dw XT_1MINUS
+0005f3 381f .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 386e .dw PFA_DOVALUE1
+ PFA_FORTHRECOGNIZER:
+0005ff 003e .dw CFG_FORTHRECOGNIZER
+000600 3d9f .dw XT_EDEFERFETCH
+000601 3da9 .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 3800 .dw DO_COLON
+ PFA_RECOGNIZE:
+ .endif
+00060a 383c .dw XT_DOLITERAL
+00060b 0614 .dw XT_RECOGNIZE_A
+00060c 38c3 .dw XT_SWAP
+00060d 09a7 .dw XT_MAPSTACK
+00060e 3919 .dw XT_ZEROEQUAL
+00060f 3835 .dw XT_DOCONDBRANCH
+000610 0613 DEST(PFA_RECOGNIZE1)
+000611 3ed1 .dw XT_2DROP
+000612 0696 .dw XT_DT_NULL
+ PFA_RECOGNIZE1:
+000613 381f .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 3800 .dw DO_COLON
+ PFA_RECOGNIZE_A:
+ .endif
+000615 38e0 .dw XT_ROT ; -- len xt addr
+000616 38e0 .dw XT_ROT ; -- xt addr len
+000617 3ec8 .dw XT_2DUP
+000618 3b1d .dw XT_2TO_R
+000619 38e0 .dw XT_ROT ; -- addr len xt
+00061a 3829 .dw XT_EXECUTE ; -- i*x dt:* | dt:null
+00061b 3b2c .dw XT_2R_FROM
+00061c 38e0 .dw XT_ROT
+00061d 38b0 .dw XT_DUP
+00061e 0696 .dw XT_DT_NULL
+00061f 3fde .dw XT_EQUAL
+000620 3835 .dw XT_DOCONDBRANCH
+000621 0625 DEST(PFA_RECOGNIZE_A1)
+000622 38d8 .dw XT_DROP
+000623 3953 .dw XT_ZERO
+000624 381f .dw XT_EXIT
+ PFA_RECOGNIZE_A1:
+000625 38ef .dw XT_NIP
+000626 38ef .dw XT_NIP
+000627 394a .dw XT_TRUE
+000628 381f .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 3800 .dw DO_COLON
+ .endif
+ PFA_INTERPRET:
+000631 05bb .dw XT_PARSENAME ; ( -- addr len )
+000632 38b0 .dw XT_DUP ; ( -- addr len flag)
+000633 3835 .dw XT_DOCONDBRANCH
+000634 0641 DEST(PFA_INTERPRET2)
+000635 05fe .dw XT_FORTHRECOGNIZER
+000636 0609 .dw XT_RECOGNIZE
+000637 3eb6 .dw XT_STATE
+000638 3878 .dw XT_FETCH
+000639 3835 .dw XT_DOCONDBRANCH
+00063a 063c DEST(PFA_INTERPRET1)
+00063b 01d1 .dw XT_ICELLPLUS ; we need the compile action
+ PFA_INTERPRET1:
+00063c 3bca .dw XT_FETCHI
+00063d 3829 .dw XT_EXECUTE
+00063e 3f8a .dw XT_QSTACK
+00063f 382e .dw XT_DOBRANCH
+000640 0631 DEST(PFA_INTERPRET)
+ PFA_INTERPRET2:
+000641 3ed1 .dw XT_2DROP
+000642 381f .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 3851 .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 3851 .dw PFA_DOCONSTANT
+ PFA_DT_DNUM:
+ .endif
+000653 01a5 .dw XT_NOOP ; interpret
+000654 3fd6 .dw XT_2LITERAL ; compile
+000655 3fd6 .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 3800 .dw DO_COLON
+ PFA_REC_NUM:
+ .endif
+ ; try converting to a number
+00065d 04fb .dw XT_NUMBER
+00065e 3835 .dw XT_DOCONDBRANCH
+00065f 0668 DEST(PFA_REC_NONUMBER)
+000660 3fe5 .dw XT_ONE
+000661 3fde .dw XT_EQUAL
+000662 3835 .dw XT_DOCONDBRANCH
+000663 0666 DEST(PFA_REC_INTNUM2)
+000664 0648 .dw XT_DT_NUM
+000665 381f .dw XT_EXIT
+ PFA_REC_INTNUM2:
+000666 0652 .dw XT_DT_DNUM
+000667 381f .dw XT_EXIT
+ PFA_REC_NONUMBER:
+000668 0696 .dw XT_DT_NULL
+000669 381f .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 3800 .dw DO_COLON
+ PFA_REC_FIND:
+ .endif
+000671 070b .DW XT_FINDXT
+000672 38b0 .dw XT_DUP
+000673 3919 .dw XT_ZEROEQUAL
+000674 3835 .dw XT_DOCONDBRANCH
+000675 0679 DEST(PFA_REC_WORD_FOUND)
+000676 38d8 .dw XT_DROP
+000677 0696 .dw XT_DT_NULL
+000678 381f .dw XT_EXIT
+ PFA_REC_WORD_FOUND:
+000679 0680 .dw XT_DT_XT
+
+00067a 381f .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 3851 .dw PFA_DOCONSTANT
+ PFA_DT_XT:
+ .endif
+000681 0684 .dw XT_R_WORD_INTERPRET
+000682 0688 .dw XT_R_WORD_COMPILE
+000683 3fd6 .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 3800 .dw DO_COLON
+ PFA_R_WORD_INTERPRET:
+ .endif
+000685 38d8 .dw XT_DROP ; the flags are in the way
+000686 3829 .dw XT_EXECUTE
+000687 381f .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 3800 .dw DO_COLON
+ PFA_R_WORD_COMPILE:
+ .endif
+000689 3920 .dw XT_ZEROLESS
+00068a 3835 .dw XT_DOCONDBRANCH
+00068b 068e DEST(PFA_R_WORD_COMPILE1)
+00068c 0767 .dw XT_COMMA
+00068d 381f .dw XT_EXIT
+ PFA_R_WORD_COMPILE1:
+00068e 3829 .dw XT_EXECUTE
+00068f 381f .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 3851 .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 3800 .dw DO_COLON
+ PFA_FAIL:
+ .endif
+00069b 383c .dw XT_DOLITERAL
+00069c fff3 .dw -13
+00069d 3d85 .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 3800 .dw DO_COLON
+ PFA_SEARCH_WORDLIST:
+ .endif
+0006a9 38fe .dw XT_TO_R
+0006aa 3953 .dw XT_ZERO
+0006ab 383c .dw XT_DOLITERAL
+0006ac 06bd .dw XT_ISWORD
+0006ad 38f5 .dw XT_R_FROM
+0006ae 06da .dw XT_TRAVERSEWORDLIST
+0006af 38b0 .dw XT_DUP
+0006b0 3919 .dw XT_ZEROEQUAL
+0006b1 3835 .dw XT_DOCONDBRANCH
+0006b2 06b7 DEST(PFA_SEARCH_WORDLIST1)
+0006b3 3ed1 .dw XT_2DROP
+0006b4 38d8 .dw XT_DROP
+0006b5 3953 .dw XT_ZERO
+0006b6 381f .dw XT_EXIT
+ PFA_SEARCH_WORDLIST1:
+ ; ... get the XT ...
+0006b7 38b0 .dw XT_DUP
+0006b8 0701 .dw XT_NFA2CFA
+ ; .. and get the header flag
+0006b9 38c3 .dw XT_SWAP
+0006ba 0180 .dw XT_NAME2FLAGS
+0006bb 016e .dw XT_IMMEDIATEQ
+0006bc 381f .dw XT_EXIT
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ XT_ISWORD:
+0006bd 3800 .dw DO_COLON
+ PFA_ISWORD:
+ .endif
+ ; ( c-addr len 0 nt -- c-addr len 0 true| nt false )
+0006be 38fe .dw XT_TO_R
+0006bf 38d8 .dw XT_DROP
+0006c0 3ec8 .dw XT_2DUP
+0006c1 3907 .dw XT_R_FETCH ; -- addr len addr len nt
+0006c2 06f5 .dw XT_NAME2STRING
+0006c3 01da .dw XT_ICOMPARE ; (-- addr len f )
+0006c4 3835 .dw XT_DOCONDBRANCH
+0006c5 06cb DEST(PFA_ISWORD3)
+ ; not now
+0006c6 38f5 .dw XT_R_FROM
+0006c7 38d8 .dw XT_DROP
+0006c8 3953 .dw XT_ZERO
+0006c9 394a .dw XT_TRUE ; maybe next word
+0006ca 381f .dw XT_EXIT
+ PFA_ISWORD3:
+ ; we found the word, now clean up iteration data ...
+0006cb 3ed1 .dw XT_2DROP
+0006cc 38f5 .dw XT_R_FROM
+0006cd 3953 .dw XT_ZERO ; finish traverse-wordlist
+0006ce 381f .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 3800 .dw DO_COLON
+ PFA_TRAVERSEWORDLIST:
+
+ .endif
+0006db 3b5e .dw XT_FETCHE
+ PFA_TRAVERSEWORDLIST1:
+0006dc 38b0 .dw XT_DUP ; ( -- xt nt nt )
+0006dd 3835 .dw XT_DOCONDBRANCH ; ( -- nt ) is nfa = counted string
+0006de 06eb DEST(PFA_TRAVERSEWORDLIST2)
+0006df 3ec8 .dw XT_2DUP
+0006e0 3b1d .dw XT_2TO_R
+0006e1 38c3 .dw XT_SWAP
+0006e2 3829 .dw XT_EXECUTE
+0006e3 3b2c .dw XT_2R_FROM
+0006e4 38e0 .dw XT_ROT
+0006e5 3835 .dw XT_DOCONDBRANCH
+0006e6 06eb DEST(PFA_TRAVERSEWORDLIST2)
+0006e7 0a16 .dw XT_NFA2LFA
+0006e8 3bca .dw XT_FETCHI
+0006e9 382e .dw XT_DOBRANCH ; ( -- addr )
+0006ea 06dc DEST(PFA_TRAVERSEWORDLIST1) ; ( -- addr )
+ PFA_TRAVERSEWORDLIST2:
+0006eb 3ed1 .dw XT_2DROP
+0006ec 381f .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 3800 .dw DO_COLON
+ PFA_NAME2STRING:
+
+ .endif
+0006f6 042f .dw XT_ICOUNT ; ( -- addr n )
+0006f7 383c .dw XT_DOLITERAL
+0006f8 00ff .dw 255
+0006f9 3a12 .dw XT_AND ; mask immediate bit
+0006fa 381f .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 3800 .dw DO_COLON
+ PFA_NFA2CFA:
+000702 0a16 .dw XT_NFA2LFA ; skip to link field
+000703 3a2e .dw XT_1PLUS ; next is the execution token
+000704 381f .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 3800 .dw DO_COLON
+ PFA_FINDXT:
+ .endif
+00070c 383c .dw XT_DOLITERAL
+00070d 0717 .dw XT_FINDXTA
+00070e 383c .dw XT_DOLITERAL
+00070f 004a .dw CFG_ORDERLISTLEN
+000710 09a7 .dw XT_MAPSTACK
+000711 3919 .dw XT_ZEROEQUAL
+000712 3835 .dw XT_DOCONDBRANCH
+000713 0716 DEST(PFA_FINDXT1)
+000714 3ed1 .dw XT_2DROP
+000715 3953 .dw XT_ZERO
+ PFA_FINDXT1:
+000716 381f .dw XT_EXIT
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+
+ XT_FINDXTA:
+000717 3800 .dw DO_COLON
+ PFA_FINDXTA:
+ .endif
+000718 38fe .dw XT_TO_R
+000719 3ec8 .dw XT_2DUP
+00071a 38f5 .dw XT_R_FROM
+00071b 06a8 .dw XT_SEARCH_WORDLIST
+00071c 38b0 .dw XT_DUP
+00071d 3835 .dw XT_DOCONDBRANCH
+00071e 0724 DEST(PFA_FINDXTA1)
+00071f 38fe .dw XT_TO_R
+000720 38ef .dw XT_NIP
+000721 38ef .dw XT_NIP
+000722 38f5 .dw XT_R_FROM
+000723 394a .dw XT_TRUE
+ PFA_FINDXTA1:
+000724 381f .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 3847 .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 3847 .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 3800 .dw DO_COLON
+ PFA_DOCREATE:
+ .endif
+00073a 05bb
+00073b 0890 .DW XT_PARSENAME,XT_WLSCOPE ; ( -- addr len wid)
+00073c 38b0
+00073d 072a
+00073e 3c8f
+00073f 3880 .DW XT_DUP,XT_NEWEST,XT_CELLPLUS,XT_STORE ; save the wid
+000740 0875
+000741 072a
+000742 3880 .DW XT_HEADER,XT_NEWEST,XT_STORE ; save the nt
+000743 381f .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 3800 .dw DO_COLON
+ PFA_BACKSLASH:
+ .endif
+000748 05a2 .dw XT_SOURCE
+000749 38ef .dw XT_NIP
+00074a 3ee1 .dw XT_TO_IN
+00074b 3880 .dw XT_STORE
+00074c 381f .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 3800 .dw DO_COLON
+ PFA_LPAREN:
+ .endif
+000751 383c .dw XT_DOLITERAL
+000752 0029 .dw ')'
+000753 058e .dw XT_PARSE
+000754 3ed1 .dw XT_2DROP
+000755 381f .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 3800 .dw DO_COLON
+ PFA_COMPILE:
+ .endif
+00075d 38f5 .dw XT_R_FROM
+00075e 38b0 .dw XT_DUP
+00075f 01d1 .dw XT_ICELLPLUS
+000760 38fe .dw XT_TO_R
+000761 3bca .dw XT_FETCHI
+000762 0767 .dw XT_COMMA
+000763 381f .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 3800 .dw DO_COLON
+ PFA_COMMA:
+000768 3f11 .dw XT_DP
+000769 3b72 .dw XT_STOREI
+00076a 3f11 .dw XT_DP
+00076b 3a2e .dw XT_1PLUS
+00076c 01bf .dw XT_DOTO
+00076d 3f12 .dw PFA_DP
+00076e 381f .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 3800 .dw DO_COLON
+ PFA_BRACKETTICK:
+ .endif
+000774 0448 .dw XT_TICK
+000775 077d .dw XT_LITERAL
+000776 381f .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 3800 .dw DO_COLON
+ PFA_LITERAL:
+ .endif
+00077e 075c .DW XT_COMPILE
+00077f 383c .DW XT_DOLITERAL
+000780 0767 .DW XT_COMMA
+000781 381f .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 3800 .dw DO_COLON
+ PFA_SLITERAL:
+ .endif
+000789 075c .dw XT_COMPILE
+00078a 03d0 .dw XT_DOSLITERAL ; ( -- addr n)
+00078b 03de .dw XT_SCOMMA
+00078c 381f .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 3800 .dw DO_COLON
+ PFA_GMARK:
+00078e 3f11 .dw XT_DP
+00078f 075c .dw XT_COMPILE
+000790 ffff .dw -1 ; ffff does not erase flash
+000791 381f .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 3800 .dw DO_COLON
+ PFA_GRESOLVE:
+000793 3f8a .dw XT_QSTACK
+000794 3f11 .dw XT_DP
+000795 38c3 .dw XT_SWAP
+000796 3b72 .dw XT_STOREI
+000797 381f .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 3800 .dw DO_COLON
+ PFA_LMARK:
+000799 3f11 .dw XT_DP
+00079a 381f .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 3800 .dw DO_COLON
+ PFA_LRESOLVE:
+00079c 3f8a .dw XT_QSTACK
+00079d 0767 .dw XT_COMMA
+00079e 381f .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 3800 .dw DO_COLON
+ PFA_AHEAD:
+ .endif
+0007a5 075c .dw XT_COMPILE
+0007a6 382e .dw XT_DOBRANCH
+0007a7 078d .dw XT_GMARK
+0007a8 381f .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 3800 .dw DO_COLON
+ PFA_IF:
+ .endif
+0007ad 075c .dw XT_COMPILE
+0007ae 3835 .dw XT_DOCONDBRANCH
+0007af 078d .dw XT_GMARK
+0007b0 381f .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 3800 .dw DO_COLON
+ PFA_ELSE:
+ .endif
+0007b6 075c .dw XT_COMPILE
+0007b7 382e .dw XT_DOBRANCH
+0007b8 078d .dw XT_GMARK
+0007b9 38c3 .dw XT_SWAP
+0007ba 0792 .dw XT_GRESOLVE
+0007bb 381f .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 3800 .dw DO_COLON
+ PFA_THEN:
+ .endif
+0007c1 0792 .dw XT_GRESOLVE
+0007c2 381f .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 3800 .dw DO_COLON
+ PFA_BEGIN:
+ .endif
+0007c9 0798 .dw XT_LMARK
+0007ca 381f .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 3800 .dw DO_COLON
+ PFA_WHILE:
+ .endif
+0007d1 07ac .dw XT_IF
+0007d2 38c3 .dw XT_SWAP
+0007d3 381f .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 3800 .dw DO_COLON
+ PFA_REPEAT:
+ .endif
+0007da 07ed .dw XT_AGAIN
+0007db 07c0 .dw XT_THEN
+0007dc 381f .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 3800 .dw DO_COLON
+ PFA_UNTIL:
+ .endif
+0007e3 383c .dw XT_DOLITERAL
+0007e4 3835 .dw XT_DOCONDBRANCH
+0007e5 0767 .dw XT_COMMA
+
+0007e6 079b .dw XT_LRESOLVE
+0007e7 381f .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 3800 .dw DO_COLON
+ PFA_AGAIN:
+ .endif
+0007ee 075c .dw XT_COMPILE
+0007ef 382e .dw XT_DOBRANCH
+0007f0 079b .dw XT_LRESOLVE
+0007f1 381f .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 3800 .dw DO_COLON
+ PFA_DO:
+
+ .endif
+0007f6 075c .dw XT_COMPILE
+0007f7 3a9a .dw XT_DODO
+0007f8 0798 .dw XT_LMARK
+0007f9 3953 .dw XT_ZERO
+0007fa 0850 .dw XT_TO_L
+0007fb 381f .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 3800 .dw DO_COLON
+ PFA_LOOP:
+ .endif
+000801 075c .dw XT_COMPILE
+000802 3ac8 .dw XT_DOLOOP
+000803 0837 .dw XT_ENDLOOP
+000804 381f .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 3800 .dw DO_COLON
+ PFA_PLUSLOOP:
+ .endif
+00080b 075c .dw XT_COMPILE
+00080c 3ab9 .dw XT_DOPLUSLOOP
+00080d 0837 .dw XT_ENDLOOP
+00080e 381f .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 3800 .dw DO_COLON
+ PFA_LEAVE:
+ .endif
+000815 075c
+000816 3ad3 .DW XT_COMPILE,XT_UNLOOP
+000817 07a4
+000818 0850
+000819 381f .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 3800 .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 38c3 .dw XT_SWAP ; DO sets a 0 marker on the leave stack
+000824 0850 .dw XT_TO_L ; then follows at the end.
+000825 381f .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 3800 .dw DO_COLON
+ PFA_QDOCHECK:
+ .endif
+000827 3ec8 .dw XT_2DUP
+000828 3fde .dw XT_EQUAL
+000829 38b0 .dw XT_DUP
+00082a 38fe .dw XT_TO_R
+00082b 3835 .dw XT_DOCONDBRANCH
+00082c 082e DEST(PFA_QDOCHECK1)
+00082d 3ed1 .dw XT_2DROP
+ PFA_QDOCHECK1:
+00082e 38f5 .dw XT_R_FROM
+00082f 39fc .dw XT_INVERT
+000830 381f .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 3800 .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 38b8
+00083b 3835 LOOP1: .DW XT_L_FROM,XT_QDUP,XT_DOCONDBRANCH
+00083c 0840 DEST(LOOP2)
+00083d 07c0 .DW XT_THEN
+00083e 382e .dw XT_DOBRANCH
+00083f 0839 DEST(LOOP1)
+000840 381f 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 3800 .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 3878 .dw XT_FETCH
+000847 3878 .dw XT_FETCH
+000848 383c .dw XT_DOLITERAL
+000849 fffe .dw -2
+00084a 0863 .dw XT_LP
+00084b 3a64 .dw XT_PLUSSTORE
+00084c 381f .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 3800 .dw DO_COLON
+ PFA_TO_L:
+ .endif
+ ;Z >L x -- L: -- x move to leave stack
+ ; CELL LP +! LP @ ! ; (L stack grows up)
+
+000851 3fea .dw XT_TWO
+000852 0863 .dw XT_LP
+000853 3a64 .dw XT_PLUSSTORE
+000854 0863 .dw XT_LP
+000855 3878 .dw XT_FETCH
+000856 3880 .dw XT_STORE
+000857 381f .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 386e .dw PFA_DOVALUE1
+ PFA_LP0:
+00085d 0040 .dw CFG_LP0
+00085e 3d9f .dw XT_EDEFERFETCH
+00085f 3da9 .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 3847 .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 3800 .dw DO_COLON
+ PFA_CREATE:
+ .endif
+00086b 0739 .dw XT_DOCREATE
+00086c 0899 .dw XT_REVEAL
+00086d 075c .dw XT_COMPILE
+00086e 3851 .dw PFA_DOCONSTANT
+00086f 381f .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 3800 .dw DO_COLON
+ PFA_HEADER:
+000876 3f11 .dw XT_DP ; the new Name Field
+000877 38fe .dw XT_TO_R
+000878 38fe .dw XT_TO_R ; ( R: NFA WID )
+000879 38b0 .dw XT_DUP
+00087a 3927 .dw XT_GREATERZERO
+00087b 3835 .dw XT_DOCONDBRANCH
+00087c 0887 .dw PFA_HEADER1
+00087d 38b0 .dw XT_DUP
+00087e 383c .dw XT_DOLITERAL
+00087f ff00 .dw $ff00 ; all flags are off (e.g. immediate)
+000880 3a1b .dw XT_OR
+000881 03e2 .dw XT_DOSCOMMA
+ ; make the link to the previous entry in this wordlist
+000882 38f5 .dw XT_R_FROM
+000883 3b5e .dw XT_FETCHE
+000884 0767 .dw XT_COMMA
+000885 38f5 .dw XT_R_FROM
+000886 381f .dw XT_EXIT
+
+ PFA_HEADER1:
+ ; -16: attempt to use zero length string as a name
+000887 383c .dw XT_DOLITERAL
+000888 fff0 .dw -16
+000889 3d85 .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 3dfe .dw PFA_DODEFER1
+ PFA_WLSCOPE:
+000891 003c .dw CFG_WLSCOPE
+000892 3d9f .dw XT_EDEFERFETCH
+000893 3da9 .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 3800 .dw DO_COLON
+ PFA_REVEAL:
+ .endif
+00089a 072a
+00089b 3c8f
+00089c 3878 .DW XT_NEWEST,XT_CELLPLUS,XT_FETCH ; only if wordlist is in use
+00089d 38b8
+00089e 3835 .DW XT_QDUP,XT_DOCONDBRANCH
+00089f 08a4 DEST(REVEAL1)
+0008a0 072a
+0008a1 3878
+0008a2 38c3
+0008a3 3b3a .DW XT_NEWEST,XT_FETCH,XT_SWAP,XT_STOREE
+ ; .DW XT_ZERO,XT_NEWEST,XT_CELLPLUS,XT_STORE ; clean wordlist entry
+ REVEAL1:
+0008a4 381f .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 3800 .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 381f .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 3804 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 3800 .dw DO_COLON
+ PFA_DODOES:
+0008be 38f5 .dw XT_R_FROM
+0008bf 072a .dw XT_NEWEST
+0008c0 3c8f .dw XT_CELLPLUS
+0008c1 3878 .dw XT_FETCH
+0008c2 3b5e .dw XT_FETCHE
+0008c3 0701 .dw XT_NFA2CFA
+0008c4 3b72 .dw XT_STOREI
+0008c5 381f .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 3800 .dw DO_COLON
+ PFA_COLON:
+ .endif
+0008ca 0739 .dw XT_DOCREATE
+0008cb 08d4 .dw XT_COLONNONAME
+0008cc 38d8 .dw XT_DROP
+0008cd 381f .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 3800 .dw DO_COLON
+ PFA_COLONNONAME:
+0008d5 3f11 .dw XT_DP
+0008d6 38b0 .dw XT_DUP
+0008d7 0731 .dw XT_LATEST
+0008d8 3880 .dw XT_STORE
+
+0008d9 075c .dw XT_COMPILE
+0008da 3800 .dw DO_COLON
+
+0008db 08e9 .dw XT_RBRACKET
+0008dc 381f .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 3800 .dw DO_COLON
+ PFA_SEMICOLON:
+ .endif
+0008e1 075c .dw XT_COMPILE
+0008e2 381f .dw XT_EXIT
+0008e3 08f1 .dw XT_LBRACKET
+0008e4 0899 .dw XT_REVEAL
+0008e5 381f .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 3800 .dw DO_COLON
+ PFA_RBRACKET:
+ .endif
+0008ea 3fe5 .dw XT_ONE
+0008eb 3eb6 .dw XT_STATE
+0008ec 3880 .dw XT_STORE
+0008ed 381f .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 3800 .dw DO_COLON
+ PFA_LBRACKET:
+ .endif
+0008f2 3953 .dw XT_ZERO
+0008f3 3eb6 .dw XT_STATE
+0008f4 3880 .dw XT_STORE
+0008f5 381f .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 3800 .dw DO_COLON
+ PFA_VARIABLE:
+ .endif
+0008fd 3f22 .dw XT_HERE
+0008fe 0908 .dw XT_CONSTANT
+0008ff 3fea .dw XT_TWO
+000900 3f2b .dw XT_ALLOT
+000901 381f .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 3800 .dw DO_COLON
+ PFA_CONSTANT:
+ .endif
+000909 0739 .dw XT_DOCREATE
+00090a 0899 .dw XT_REVEAL
+00090b 075c .dw XT_COMPILE
+00090c 3847 .dw PFA_DOVARIABLE
+00090d 0767 .dw XT_COMMA
+00090e 381f .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 3800 .dw DO_COLON
+ PFA_USER:
+000914 0739 .dw XT_DOCREATE
+000915 0899 .dw XT_REVEAL
+
+000916 075c .dw XT_COMPILE
+000917 3857 .dw PFA_DOUSER
+000918 0767 .dw XT_COMMA
+000919 381f .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 3800 .dw DO_COLON
+ PFA_RECURSE:
+ .endif
+000921 0731 .dw XT_LATEST
+000922 3878 .dw XT_FETCH
+000923 0767 .dw XT_COMMA
+000924 381f .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 3800 .dw DO_COLON
+ PFA_IMMEDIATE:
+00092d 09ce .dw XT_GET_CURRENT
+00092e 3b5e .dw XT_FETCHE
+00092f 38b0 .dw XT_DUP
+000930 3bca .dw XT_FETCHI
+000931 383c .dw XT_DOLITERAL
+000932 7fff .dw $7fff
+000933 3a12 .dw XT_AND
+000934 38c3 .dw XT_SWAP
+000935 3b72 .dw XT_STOREI
+000936 381f .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 3800 .dw DO_COLON
+ PFA_BRACKETCHAR:
+ .endif
+00093d 075c .dw XT_COMPILE
+00093e 383c .dw XT_DOLITERAL
+00093f 04f1 .dw XT_CHAR
+000940 0767 .dw XT_COMMA
+000941 381f .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 3800 .dw DO_COLON
+ PFA_ABORTQUOTE:
+ .endif
+000948 3e89 .dw XT_SQUOTE
+000949 075c .dw XT_COMPILE
+00094a 0959 .dw XT_QABORT
+00094b 381f .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 3800 .dw DO_COLON
+ PFA_ABORT:
+ .endif
+000952 394a .dw XT_TRUE
+000953 3d85 .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 3800 .dw DO_COLON
+ PFA_QABORT:
+
+ .endif
+00095a 38e0
+00095b 3835 .DW XT_ROT,XT_DOCONDBRANCH
+00095c 095f DEST(QABO1)
+00095d 0403
+00095e 0951 .DW XT_ITYPE,XT_ABORT
+00095f 3ed1
+000960 381f 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 3800 .dw DO_COLON
+ .endif
+000969 38b0 .dw XT_DUP
+00096a 3c8f .dw XT_CELLPLUS
+00096b 38c3 .dw XT_SWAP
+00096c 3b5e .dw XT_FETCHE
+00096d 38b0 .dw XT_DUP
+00096e 38fe .dw XT_TO_R
+00096f 3953 .dw XT_ZERO
+000970 38c3 .dw XT_SWAP ; go from bigger to smaller addresses
+000971 0826 .dw XT_QDOCHECK
+000972 3835 .dw XT_DOCONDBRANCH
+000973 097f DEST(PFA_N_FETCH_E2)
+000974 3a9a .dw XT_DODO
+ PFA_N_FETCH_E1:
+ ; ( ee-addr )
+000975 3aab .dw XT_I
+000976 3a34 .dw XT_1MINUS
+000977 3ec3 .dw XT_CELLS ; ( -- ee-addr i*2 )
+000978 38ce .dw XT_OVER ; ( -- ee-addr i*2 ee-addr )
+000979 399c .dw XT_PLUS ; ( -- ee-addr ee-addr+i
+00097a 3b5e .dw XT_FETCHE ;( -- ee-addr item_i )
+00097b 38c3 .dw XT_SWAP ;( -- item_i ee-addr )
+00097c 394a .dw XT_TRUE ; shortcut for -1
+00097d 3ab9 .dw XT_DOPLUSLOOP
+00097e 0975 DEST(PFA_N_FETCH_E1)
+ PFA_N_FETCH_E2:
+00097f 3ed1 .dw XT_2DROP
+000980 38f5 .dw XT_R_FROM
+000981 381f .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 3800 .dw DO_COLON
+ PFA_SET_STACK:
+ .endif
+00098a 38ce .dw XT_OVER
+00098b 3920 .dw XT_ZEROLESS
+00098c 3835 .dw XT_DOCONDBRANCH
+00098d 0991 DEST(PFA_SET_STACK0)
+00098e 383c .dw XT_DOLITERAL
+00098f fffc .dw -4
+000990 3d85 .dw XT_THROW
+ PFA_SET_STACK0:
+000991 3ec8 .dw XT_2DUP
+000992 3b3a .dw XT_STOREE ; ( -- i_n .. i_0 n e-addr )
+000993 38c3 .dw XT_SWAP
+000994 3953 .dw XT_ZERO
+000995 0826 .dw XT_QDOCHECK
+000996 3835 .dw XT_DOCONDBRANCH
+000997 099e DEST(PFA_SET_STACK2)
+000998 3a9a .dw XT_DODO
+ PFA_SET_STACK1:
+000999 3c8f .dw XT_CELLPLUS ; ( -- i_x e-addr )
+00099a 3ed9 .dw XT_TUCK ; ( -- e-addr i_x e-addr
+00099b 3b3a .dw XT_STOREE
+00099c 3ac8 .dw XT_DOLOOP
+00099d 0999 DEST(PFA_SET_STACK1)
+ PFA_SET_STACK2:
+00099e 38d8 .dw XT_DROP
+00099f 381f .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 3800 .dw DO_COLON
+ PFA_MAPSTACK:
+ .endif
+0009a8 38b0 .dw XT_DUP
+0009a9 3c8f .dw XT_CELLPLUS
+0009aa 38c3 .dw XT_SWAP
+0009ab 3b5e .dw XT_FETCHE
+0009ac 3ec3 .dw XT_CELLS
+0009ad 3f98 .dw XT_BOUNDS
+0009ae 0826 .dw XT_QDOCHECK
+0009af 3835 .dw XT_DOCONDBRANCH
+0009b0 09c3 DEST(PFA_MAPSTACK3)
+0009b1 3a9a .dw XT_DODO
+ PFA_MAPSTACK1:
+0009b2 3aab .dw XT_I
+0009b3 3b5e .dw XT_FETCHE ; -- i*x XT id
+0009b4 38c3 .dw XT_SWAP
+0009b5 38fe .dw XT_TO_R
+0009b6 3907 .dw XT_R_FETCH
+0009b7 3829 .dw XT_EXECUTE ; i*x id -- j*y true | i*x false
+0009b8 38b8 .dw XT_QDUP
+0009b9 3835 .dw XT_DOCONDBRANCH
+0009ba 09bf DEST(PFA_MAPSTACK2)
+0009bb 38f5 .dw XT_R_FROM
+0009bc 38d8 .dw XT_DROP
+0009bd 3ad3 .dw XT_UNLOOP
+0009be 381f .dw XT_EXIT
+ PFA_MAPSTACK2:
+0009bf 38f5 .dw XT_R_FROM
+0009c0 3fea .dw XT_TWO
+0009c1 3ab9 .dw XT_DOPLUSLOOP
+0009c2 09b2 DEST(PFA_MAPSTACK1)
+ PFA_MAPSTACK3:
+0009c3 38d8 .dw XT_DROP
+0009c4 3953 .dw XT_ZERO
+0009c5 381f .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 3800 .dw DO_COLON
+ PFA_GET_CURRENT:
+0009cf 383c .dw XT_DOLITERAL
+0009d0 0046 .dw CFG_CURRENT
+0009d1 3b5e .dw XT_FETCHE
+0009d2 381f .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 3800 .dw DO_COLON
+ PFA_GET_ORDER:
+ .endif
+0009db 383c .dw XT_DOLITERAL
+0009dc 004a .dw CFG_ORDERLISTLEN
+0009dd 0968 .dw XT_GET_STACK
+0009de 381f .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 3847 .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 3804 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 3800 .dw DO_COLON
+ PFA_NFA2LFA:
+000a17 06f5 .dw XT_NAME2STRING
+000a18 3a2e .dw XT_1PLUS
+000a19 3a03 .dw XT_2SLASH
+000a1a 399c .dw XT_PLUS
+000a1b 381f .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 "dict/compiler2.inc" ; additional words for the compiler
+
+ ; 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:
+000a1c ff0b .dw $ff0b
+000a1d 6573
+000a1e 2d74
+000a1f 7563
+000a20 7272
+000a21 6e65
+000a22 0074 .db "set-current",0
+000a23 0a10 .dw VE_HEAD
+ .set VE_HEAD = VE_SET_CURRENT
+ XT_SET_CURRENT:
+000a24 3800 .dw DO_COLON
+ PFA_SET_CURRENT:
+000a25 383c .dw XT_DOLITERAL
+000a26 0046 .dw CFG_CURRENT
+000a27 3b3a .dw XT_STOREE
+000a28 381f .dw XT_EXIT
+ .include "words/wordlist.asm"
+
+ ; Search Order
+ ; create a new, empty wordlist
+ VE_WORDLIST:
+000a29 ff08 .dw $ff08
+000a2a 6f77
+000a2b 6472
+000a2c 696c
+000a2d 7473 .db "wordlist"
+000a2e 0a1c .dw VE_HEAD
+ .set VE_HEAD = VE_WORDLIST
+ XT_WORDLIST:
+000a2f 3800 .dw DO_COLON
+ PFA_WORDLIST:
+000a30 3f1a .dw XT_EHERE
+000a31 3953 .dw XT_ZERO
+000a32 38ce .dw XT_OVER
+000a33 3b3a .dw XT_STOREE
+000a34 38b0 .dw XT_DUP
+000a35 3c8f .dw XT_CELLPLUS
+000a36 01bf .dw XT_DOTO
+000a37 3f1b .dw PFA_EHERE
+000a38 381f .dw XT_EXIT
+
+ .include "words/forth-wordlist.asm"
+
+ ; Search Order
+ ; get the system default word list
+ VE_FORTHWORDLIST:
+000a39 ff0e .dw $ff0e
+000a3a 6f66
+000a3b 7472
+000a3c 2d68
+000a3d 6f77
+000a3e 6472
+000a3f 696c
+000a40 7473 .db "forth-wordlist"
+000a41 0a29 .dw VE_HEAD
+ .set VE_HEAD = VE_FORTHWORDLIST
+ XT_FORTHWORDLIST:
+000a42 3847 .dw PFA_DOVARIABLE
+ PFA_FORTHWORDLIST:
+000a43 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:
+000a44 ff09 .dw $ff09
+000a45 6573
+000a46 2d74
+000a47 726f
+000a48 6564
+000a49 0072 .db "set-order",0
+000a4a 0a39 .dw VE_HEAD
+ .set VE_HEAD = VE_SET_ORDER
+ XT_SET_ORDER:
+000a4b 3800 .dw DO_COLON
+ PFA_SET_ORDER:
+ .endif
+000a4c 383c .dw XT_DOLITERAL
+000a4d 004a .dw CFG_ORDERLISTLEN
+000a4e 0989 .dw XT_SET_STACK
+000a4f 381f .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:
+000a50 ff0f .dw $ff0f
+000a51 6573
+000a52 2d74
+000a53 6572
+000a54 6f63
+000a55 6e67
+000a56 7a69
+000a57 7265
+000a58 0073 .db "set-recognizers",0
+000a59 0a44 .dw VE_HEAD
+ .set VE_HEAD = VE_SET_RECOGNIZERS
+ XT_SET_RECOGNIZERS:
+000a5a 3800 .dw DO_COLON
+ PFA_SET_RECOGNIZERS:
+ .endif
+000a5b 383c .dw XT_DOLITERAL
+000a5c 005c .dw CFG_RECOGNIZERLISTLEN
+000a5d 0989 .dw XT_SET_STACK
+000a5e 381f .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:
+000a5f ff0f .dw $ff0f
+000a60 6567
+000a61 2d74
+000a62 6572
+000a63 6f63
+000a64 6e67
+000a65 7a69
+000a66 7265
+000a67 0073 .db "get-recognizers",0
+000a68 0a50 .dw VE_HEAD
+ .set VE_HEAD = VE_GET_RECOGNIZERS
+ XT_GET_RECOGNIZERS:
+000a69 3800 .dw DO_COLON
+ PFA_GET_RECOGNIZERS:
+ .endif
+000a6a 383c .dw XT_DOLITERAL
+000a6b 005c .dw CFG_RECOGNIZERLISTLEN
+000a6c 0968 .dw XT_GET_STACK
+000a6d 381f .dw XT_EXIT
+ .include "words/code.asm"
+
+ ; Compiler
+ ; create named entry in the dictionary, XT is the data field
+ VE_CODE:
+000a6e ff04 .dw $ff04
+000a6f 6f63
+000a70 6564 .db "code"
+000a71 0a5f .dw VE_HEAD
+ .set VE_HEAD = VE_CODE
+ XT_CODE:
+000a72 3800 .dw DO_COLON
+ PFA_CODE:
+000a73 0739 .dw XT_DOCREATE
+000a74 0899 .dw XT_REVEAL
+000a75 3f11 .dw XT_DP
+000a76 01d1 .dw XT_ICELLPLUS
+000a77 0767 .dw XT_COMMA
+000a78 381f .dw XT_EXIT
+ .include "words/end-code.asm"
+
+ ; Compiler
+ ; finish a code definition
+ VE_ENDCODE:
+000a79 ff08 .dw $ff08
+000a7a 6e65
+000a7b 2d64
+000a7c 6f63
+000a7d 6564 .db "end-code"
+000a7e 0a6e .dw VE_HEAD
+ .set VE_HEAD = VE_ENDCODE
+ XT_ENDCODE:
+000a7f 3800 .dw DO_COLON
+ PFA_ENDCODE:
+000a80 075c .dw XT_COMPILE
+000a81 940c .dw $940c
+000a82 075c .dw XT_COMPILE
+000a83 3804 .dw DO_NEXT
+000a84 381f .dw XT_EXIT
+ .include "words/marker.asm"
+
+ ; System Value
+ ; The eeprom address until which MARKER saves and restores the eeprom data.
+ VE_MARKER:
+000a85 ff08 .dw $ff08
+000a86 6d28
+000a87 7261
+000a88 656b
+000a89 2972 .db "(marker)"
+000a8a 0a79 .dw VE_HEAD
+ .set VE_HEAD = VE_MARKER
+ XT_MARKER:
+000a8b 386e .dw PFA_DOVALUE1
+ PFA_MARKER:
+000a8c 0068 .dw EE_MARKER
+000a8d 3d9f .dw XT_EDEFERFETCH
+000a8e 3da9 .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:
+000a8f 0008 .dw $0008
+000a90 6f70
+000a91 7473
+000a92 6f70
+000a93 656e .db "postpone"
+000a94 0a85 .dw VE_HEAD
+ .set VE_HEAD = VE_POSTPONE
+ XT_POSTPONE:
+000a95 3800 .dw DO_COLON
+ PFA_POSTPONE:
+ .endif
+000a96 05bb .dw XT_PARSENAME
+000a97 05fe .dw XT_FORTHRECOGNIZER
+000a98 0609 .dw XT_RECOGNIZE
+000a99 38b0 .dw XT_DUP
+000a9a 38fe .dw XT_TO_R
+000a9b 01d1 .dw XT_ICELLPLUS
+000a9c 01d1 .dw XT_ICELLPLUS
+000a9d 3bca .dw XT_FETCHI
+000a9e 3829 .dw XT_EXECUTE
+000a9f 38f5 .dw XT_R_FROM
+000aa0 01d1 .dw XT_ICELLPLUS
+000aa1 3bca .dw XT_FETCHI
+000aa2 0767 .dw XT_COMMA
+000aa3 381f .dw XT_EXIT
+ .endif
+
+ .include "words/applturnkey.asm"
+
+ ; R( -- )
+ ; application specific turnkey action
+ VE_APPLTURNKEY:
+000aa4 ff0b .dw $ff0b
+000aa5 7061
+000aa6 6c70
+000aa7 7574
+000aa8 6e72
+000aa9 656b
+000aaa 0079 .db "applturnkey",0
+000aab 0a8f .dw VE_HEAD
+ .set VE_HEAD = VE_APPLTURNKEY
+ XT_APPLTURNKEY:
+000aac 3800 .dw DO_COLON
+ PFA_APPLTURNKEY:
+000aad 00c7 .dw XT_USART
+
+ .if WANT_INTERRUPTS == 1
+000aae 3c96 .dw XT_INTON
+ .endif
+
+000aaf 018a .dw XT_DOT_VER
+000ab0 3fad .dw XT_SPACE
+000ab1 03d0 .dw XT_DOSLITERAL
+000ab2 000a .dw 10
+000ab3 6f46
+000ab4 7472
+000ab5 6468
+000ab6 6975
+000ab7 6f6e .db "Forthduino"
+000ab8 0403 .dw XT_ITYPE
+
+000ab9 381f .dw XT_EXIT
+
+
+ .set DPSTART = pc
+ .if(pc>AMFORTH_RO_SEG)
+ .endif
+
+ .org AMFORTH_RO_SEG
+ .include "amforth-interpreter.asm"
+
+
+ DO_COLON:
+003800 93bf push XH
+003801 93af push XL ; PUSH IP
+003802 01db movw XL, wl
+003803 9611 adiw xl, 1
+ DO_NEXT:
+ .if WANT_INTERRUPTS == 1
+003804 14b2 cp isrflag, zerol
+003805 f469 brne DO_INTERRUPT
+ .endif
+003806 01fd movw zl, XL ; READ IP
+003807 0fee
+003808 1fff
+003809 9165
+00380a 9175 readflashcell wl, wh
+00380b 9611 adiw XL, 1 ; INC IP
+
+ DO_EXECUTE:
+00380c 01fb movw zl, wl
+00380d 0fee
+00380e 1fff
+00380f 9105
+003810 9115 readflashcell temp0,temp1
+003811 01f8 movw zl, temp0
+003812 9409 ijmp
+
+ .if WANT_INTERRUPTS == 1
+ DO_INTERRUPT:
+ ; here we deal with interrupts the forth way
+003813 939a
+003814 938a savetos
+003815 2d8b mov tosl, isrflag
+003816 2799 clr tosh
+003817 24bb clr isrflag
+003818 eb6f ldi wl, LOW(XT_ISREXEC)
+003819 e37c ldi wh, HIGH(XT_ISREXEC)
+00381a 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:
+00381b ff04 .dw $ff04
+00381c 7865
+00381d 7469 .db "exit"
+00381e 0aa4 .dw VE_HEAD
+ .set VE_HEAD = VE_EXIT
+ XT_EXIT:
+00381f 3820 .dw PFA_EXIT
+ PFA_EXIT:
+003820 91af pop XL
+003821 91bf pop XH
+003822 cfe1 jmp_ DO_NEXT
+ .include "words/execute.asm"
+
+ ; System
+ ; execute XT
+ VE_EXECUTE:
+003823 ff07 .dw $ff07
+003824 7865
+003825 6365
+003826 7475
+003827 0065 .db "execute",0
+003828 381b .dw VE_HEAD
+ .set VE_HEAD = VE_EXECUTE
+ XT_EXECUTE:
+003829 382a .dw PFA_EXECUTE
+ PFA_EXECUTE:
+00382a 01bc movw wl, tosl
+00382b 9189
+00382c 9199 loadtos
+00382d 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:
+00382e 382f .dw PFA_DOBRANCH
+ PFA_DOBRANCH:
+00382f 01fd movw zl, XL
+003830 0fee
+003831 1fff
+003832 91a5
+003833 91b5 readflashcell XL,XH
+003834 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:
+003835 3836 .dw PFA_DOCONDBRANCH
+ PFA_DOCONDBRANCH:
+003836 2b98 or tosh, tosl
+003837 9189
+003838 9199 loadtos
+003839 f3a9 brbs 1, PFA_DOBRANCH ; 1 is z flag; if tos is zero (false), do the branch
+00383a 9611 adiw XL, 1
+00383b 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:
+00383c 383d .dw PFA_DOLITERAL
+ PFA_DOLITERAL:
+00383d 939a
+00383e 938a savetos
+00383f 01fd movw zl, xl
+003840 0fee
+003841 1fff
+003842 9185
+003843 9195 readflashcell tosl,tosh
+003844 9611 adiw xl, 1
+003845 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:
+003846 3847 .dw PFA_DOVARIABLE
+ PFA_DOVARIABLE:
+003847 939a
+003848 938a savetos
+003849 01fb movw zl, wl
+00384a 9631 adiw zl,1
+00384b 0fee
+00384c 1fff
+00384d 9185
+00384e 9195 readflashcell tosl,tosh
+00384f 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:
+003850 3851 .dw PFA_DOCONSTANT
+ PFA_DOCONSTANT:
+003851 939a
+003852 938a savetos
+003853 01cb movw tosl, wl
+003854 9601 adiw tosl, 1
+003855 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:
+003856 3857 .dw PFA_DOUSER
+ PFA_DOUSER:
+003857 939a
+003858 938a savetos
+003859 01fb movw zl, wl
+00385a 9631 adiw zl, 1
+00385b 0fee
+00385c 1fff
+00385d 9185
+00385e 9195 readflashcell tosl,tosh
+00385f 0d84 add tosl, upl
+003860 1d95 adc tosh, uph
+003861 cfa2 jmp_ DO_NEXT
+ .include "words/do-value.asm"
+
+ ; System
+ ; runtime of value
+ VE_DOVALUE:
+003862 ff07 .dw $ff07
+003863 7628
+003864 6c61
+003865 6575
+003866 0029 .db "(value)", 0
+003867 3823 .dw VE_HEAD
+ .set VE_HEAD = VE_DOVALUE
+ XT_DOVALUE:
+003868 3800 .dw DO_COLON
+ PFA_DOVALUE:
+003869 0739 .dw XT_DOCREATE
+00386a 0899 .dw XT_REVEAL
+00386b 075c .dw XT_COMPILE
+00386c 386e .dw PFA_DOVALUE1
+00386d 381f .dw XT_EXIT
+ PFA_DOVALUE1:
+00386e 940e 08b2 call_ DO_DODOES
+003870 38b0 .dw XT_DUP
+003871 01d1 .dw XT_ICELLPLUS
+003872 3bca .dw XT_FETCHI
+003873 3829 .dw XT_EXECUTE
+003874 381f .dw XT_EXIT
+
+ ; : (value) <builds does> dup icell+ @i execute ;
+ .include "words/fetch.asm"
+
+ ; Memory
+ ; read 1 cell from RAM address
+ VE_FETCH:
+003875 ff01 .dw $ff01
+003876 0040 .db "@",0
+003877 3862 .dw VE_HEAD
+ .set VE_HEAD = VE_FETCH
+ XT_FETCH:
+003878 3879 .dw PFA_FETCH
+ PFA_FETCH:
+ .if WANT_UNIFIED == 1
+ .endif
+ PFA_FETCHRAM:
+003879 01fc movw zl, tosl
+ ; low byte is read before the high byte
+00387a 9181 ld tosl, z+
+00387b 9191 ld tosh, z+
+00387c 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:
+00387d ff01 .dw $ff01
+00387e 0021 .db "!",0
+00387f 3875 .dw VE_HEAD
+ .set VE_HEAD = VE_STORE
+ XT_STORE:
+003880 3881 .dw PFA_STORE
+ PFA_STORE:
+ .if WANT_UNIFIED == 1
+ .endif
+ PFA_STORERAM:
+003881 01fc movw zl, tosl
+003882 9189
+003883 9199 loadtos
+ ; the high byte is written before the low byte
+003884 8391 std Z+1, tosh
+003885 8380 std Z+0, tosl
+003886 9189
+003887 9199 loadtos
+003888 cf7b jmp_ DO_NEXT
+ .if WANT_UNIFIED == 1
+ .endif
+ .include "words/cstore.asm"
+
+ ; Memory
+ ; store a single byte to RAM address
+ VE_CSTORE:
+003889 ff02 .dw $ff02
+00388a 2163 .db "c!"
+00388b 387d .dw VE_HEAD
+ .set VE_HEAD = VE_CSTORE
+ XT_CSTORE:
+00388c 388d .dw PFA_CSTORE
+ PFA_CSTORE:
+00388d 01fc movw zl, tosl
+00388e 9189
+00388f 9199 loadtos
+003890 8380 st Z, tosl
+003891 9189
+003892 9199 loadtos
+003893 cf70 jmp_ DO_NEXT
+ .include "words/cfetch.asm"
+
+ ; Memory
+ ; fetch a single byte from memory mapped locations
+ VE_CFETCH:
+003894 ff02 .dw $ff02
+003895 4063 .db "c@"
+003896 3889 .dw VE_HEAD
+ .set VE_HEAD = VE_CFETCH
+ XT_CFETCH:
+003897 3898 .dw PFA_CFETCH
+ PFA_CFETCH:
+003898 01fc movw zl, tosl
+003899 2799 clr tosh
+00389a 8180 ld tosl, Z
+00389b cf68 jmp_ DO_NEXT
+ .include "words/fetch-u.asm"
+
+ ; Memory
+ ; read 1 cell from USER area
+ VE_FETCHU:
+00389c ff02 .dw $ff02
+00389d 7540 .db "@u"
+00389e 3894 .dw VE_HEAD
+ .set VE_HEAD = VE_FETCHU
+ XT_FETCHU:
+00389f 3800 .dw DO_COLON
+ PFA_FETCHU:
+0038a0 3b01 .dw XT_UP_FETCH
+0038a1 399c .dw XT_PLUS
+0038a2 3878 .dw XT_FETCH
+0038a3 381f .dw XT_EXIT
+ .include "words/store-u.asm"
+
+ ; Memory
+ ; write n to USER area at offset
+ VE_STOREU:
+0038a4 ff02 .dw $ff02
+0038a5 7521 .db "!u"
+0038a6 389c .dw VE_HEAD
+ .set VE_HEAD = VE_STOREU
+ XT_STOREU:
+0038a7 3800 .dw DO_COLON
+ PFA_STOREU:
+0038a8 3b01 .dw XT_UP_FETCH
+0038a9 399c .dw XT_PLUS
+0038aa 3880 .dw XT_STORE
+0038ab 381f .dw XT_EXIT
+
+ ;;;;;;;;;;;;;;;;;;;;;;;;;
+ .include "words/dup.asm"
+
+ ; Stack
+ ; duplicate TOS
+ VE_DUP:
+0038ac ff03 .dw $ff03
+0038ad 7564
+0038ae 0070 .db "dup",0
+0038af 38a4 .dw VE_HEAD
+ .set VE_HEAD = VE_DUP
+ XT_DUP:
+0038b0 38b1 .dw PFA_DUP
+ PFA_DUP:
+0038b1 939a
+0038b2 938a savetos
+0038b3 cf50 jmp_ DO_NEXT
+ .include "words/qdup.asm"
+
+ ; Stack
+ ; duplicate TOS if non-zero
+ VE_QDUP:
+0038b4 ff04 .dw $ff04
+0038b5 643f
+0038b6 7075 .db "?dup"
+0038b7 38ac .dw VE_HEAD
+ .set VE_HEAD = VE_QDUP
+ XT_QDUP:
+0038b8 38b9 .dw PFA_QDUP
+ PFA_QDUP:
+0038b9 2f08 mov temp0, tosl
+0038ba 2b09 or temp0, tosh
+0038bb f011 breq PFA_QDUP1
+0038bc 939a
+0038bd 938a savetos
+ PFA_QDUP1:
+0038be cf45 jmp_ DO_NEXT
+ .include "words/swap.asm"
+
+ ; Stack
+ ; swaps the two top level stack cells
+ VE_SWAP:
+0038bf ff04 .dw $ff04
+0038c0 7773
+0038c1 7061 .db "swap"
+0038c2 38b4 .dw VE_HEAD
+ .set VE_HEAD = VE_SWAP
+ XT_SWAP:
+0038c3 38c4 .dw PFA_SWAP
+ PFA_SWAP:
+0038c4 018c movw temp0, tosl
+0038c5 9189
+0038c6 9199 loadtos
+0038c7 931a st -Y, temp1
+0038c8 930a st -Y, temp0
+0038c9 cf3a jmp_ DO_NEXT
+ .include "words/over.asm"
+
+ ; Stack
+ ; Place a copy of x1 on top of the stack
+ VE_OVER:
+0038ca ff04 .dw $ff04
+0038cb 766f
+0038cc 7265 .db "over"
+0038cd 38bf .dw VE_HEAD
+ .set VE_HEAD = VE_OVER
+ XT_OVER:
+0038ce 38cf .dw PFA_OVER
+ PFA_OVER:
+0038cf 939a
+0038d0 938a savetos
+0038d1 818a ldd tosl, Y+2
+0038d2 819b ldd tosh, Y+3
+
+0038d3 cf30 jmp_ DO_NEXT
+ .include "words/drop.asm"
+
+ ; Stack
+ ; drop TOS
+ VE_DROP:
+0038d4 ff04 .dw $ff04
+0038d5 7264
+0038d6 706f .db "drop"
+0038d7 38ca .dw VE_HEAD
+ .set VE_HEAD = VE_DROP
+ XT_DROP:
+0038d8 38d9 .dw PFA_DROP
+ PFA_DROP:
+0038d9 9189
+0038da 9199 loadtos
+0038db cf28 jmp_ DO_NEXT
+ .include "words/rot.asm"
+
+ ; Stack
+ ; rotate the three top level cells
+ VE_ROT:
+0038dc ff03 .dw $ff03
+0038dd 6f72
+0038de 0074 .db "rot",0
+0038df 38d4 .dw VE_HEAD
+ .set VE_HEAD = VE_ROT
+ XT_ROT:
+0038e0 38e1 .dw PFA_ROT
+ PFA_ROT:
+0038e1 018c movw temp0, tosl
+0038e2 9129 ld temp2, Y+
+0038e3 9139 ld temp3, Y+
+0038e4 9189
+0038e5 9199 loadtos
+
+0038e6 933a st -Y, temp3
+0038e7 932a st -Y, temp2
+0038e8 931a st -Y, temp1
+0038e9 930a st -Y, temp0
+
+0038ea cf19 jmp_ DO_NEXT
+ .include "words/nip.asm"
+
+ ; Stack
+ ; Remove Second of Stack
+ VE_NIP:
+0038eb ff03 .dw $ff03
+0038ec 696e
+0038ed 0070 .db "nip",0
+0038ee 38dc .dw VE_HEAD
+ .set VE_HEAD = VE_NIP
+ XT_NIP:
+0038ef 38f0 .dw PFA_NIP
+ PFA_NIP:
+0038f0 9622 adiw yl, 2
+0038f1 cf12 jmp_ DO_NEXT
+ ;;;;;;;;;;;;;;;;;;;;;;;;;
+ .include "words/r_from.asm"
+
+ ; Stack
+ ; move TOR to TOS
+ VE_R_FROM:
+0038f2 ff02 .dw $ff02
+0038f3 3e72 .db "r>"
+0038f4 38eb .dw VE_HEAD
+ .set VE_HEAD = VE_R_FROM
+ XT_R_FROM:
+0038f5 38f6 .dw PFA_R_FROM
+ PFA_R_FROM:
+0038f6 939a
+0038f7 938a savetos
+0038f8 918f pop tosl
+0038f9 919f pop tosh
+0038fa cf09 jmp_ DO_NEXT
+ .include "words/to_r.asm"
+
+ ; Stack
+ ; move TOS to TOR
+ VE_TO_R:
+0038fb ff02 .dw $ff02
+0038fc 723e .db ">r"
+0038fd 38f2 .dw VE_HEAD
+ .set VE_HEAD = VE_TO_R
+ XT_TO_R:
+0038fe 38ff .dw PFA_TO_R
+ PFA_TO_R:
+0038ff 939f push tosh
+003900 938f push tosl
+003901 9189
+003902 9199 loadtos
+003903 cf00 jmp_ DO_NEXT
+ .include "words/r_fetch.asm"
+
+ ; Stack
+ ; fetch content of TOR
+ VE_R_FETCH:
+003904 ff02 .dw $ff02
+003905 4072 .db "r@"
+003906 38fb .dw VE_HEAD
+ .set VE_HEAD = VE_R_FETCH
+ XT_R_FETCH:
+003907 3908 .dw PFA_R_FETCH
+ PFA_R_FETCH:
+003908 939a
+003909 938a savetos
+00390a 918f pop tosl
+00390b 919f pop tosh
+00390c 939f push tosh
+00390d 938f push tosl
+00390e 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:
+00390f ff02 .dw $ff02
+003910 3e3c .db "<>"
+003911 3904 .dw VE_HEAD
+ .set VE_HEAD = VE_NOTEQUAL
+ XT_NOTEQUAL:
+003912 3800 .dw DO_COLON
+ PFA_NOTEQUAL:
+ .endif
+
+003913 3fde
+003914 3919
+003915 381f .DW XT_EQUAL,XT_ZEROEQUAL,XT_EXIT
+ .include "words/equalzero.asm"
+
+ ; Compare
+ ; compare with 0 (zero)
+ VE_ZEROEQUAL:
+003916 ff02 .dw $ff02
+003917 3d30 .db "0="
+003918 390f .dw VE_HEAD
+ .set VE_HEAD = VE_ZEROEQUAL
+ XT_ZEROEQUAL:
+003919 391a .dw PFA_ZEROEQUAL
+ PFA_ZEROEQUAL:
+00391a 2b98 or tosh, tosl
+00391b f5d1 brne PFA_ZERO1
+00391c c030 rjmp PFA_TRUE1
+ .include "words/lesszero.asm"
+
+ ; Compare
+ ; compare with zero
+ VE_ZEROLESS:
+00391d ff02 .dw $ff02
+00391e 3c30 .db "0<"
+00391f 3916 .dw VE_HEAD
+ .set VE_HEAD = VE_ZEROLESS
+ XT_ZEROLESS:
+003920 3921 .dw PFA_ZEROLESS
+ PFA_ZEROLESS:
+003921 fd97 sbrc tosh,7
+003922 c02a rjmp PFA_TRUE1
+003923 c032 rjmp PFA_ZERO1
+ .include "words/greaterzero.asm"
+
+ ; Compare
+ ; true if n1 is greater than 0
+ VE_GREATERZERO:
+003924 ff02 .dw $ff02
+003925 3e30 .db "0>"
+003926 391d .dw VE_HEAD
+ .set VE_HEAD = VE_GREATERZERO
+ XT_GREATERZERO:
+003927 3928 .dw PFA_GREATERZERO
+ PFA_GREATERZERO:
+003928 1582 cp tosl, zerol
+003929 0593 cpc tosh, zeroh
+00392a f15c brlt PFA_ZERO1
+00392b f151 brbs 1, PFA_ZERO1
+00392c c020 rjmp PFA_TRUE1
+ .include "words/d-greaterzero.asm"
+
+ ; Compare
+ ; compares if a double double cell number is greater 0
+ VE_DGREATERZERO:
+00392d ff03 .dw $ff03
+00392e 3064
+00392f 003e .db "d0>",0
+003930 3924 .dw VE_HEAD
+ .set VE_HEAD = VE_DGREATERZERO
+ XT_DGREATERZERO:
+003931 3932 .dw PFA_DGREATERZERO
+ PFA_DGREATERZERO:
+003932 1582 cp tosl, zerol
+003933 0593 cpc tosh, zeroh
+003934 9189
+003935 9199 loadtos
+003936 0582 cpc tosl, zerol
+003937 0593 cpc tosh, zeroh
+003938 f0ec brlt PFA_ZERO1
+003939 f0e1 brbs 1, PFA_ZERO1
+00393a c012 rjmp PFA_TRUE1
+ .include "words/d-lesszero.asm"
+
+ ; Compare
+ ; compares if a double double cell number is less than 0
+ VE_DXT_ZEROLESS:
+00393b ff03 .dw $ff03
+00393c 3064
+00393d 003c .db "d0<",0
+00393e 392d .dw VE_HEAD
+ .set VE_HEAD = VE_DXT_ZEROLESS
+ XT_DXT_ZEROLESS:
+00393f 3940 .dw PFA_DXT_ZEROLESS
+ PFA_DXT_ZEROLESS:
+003940 9622 adiw Y,2
+003941 fd97 sbrc tosh,7
+003942 940c 394d jmp PFA_TRUE1
+003944 940c 3956 jmp PFA_ZERO1
+
+ .include "words/true.asm"
+
+ ; Arithmetics
+ ; leaves the value -1 (true) on TOS
+ VE_TRUE:
+003946 ff04 .dw $ff04
+003947 7274
+003948 6575 .db "true"
+003949 393b .dw VE_HEAD
+ .set VE_HEAD = VE_TRUE
+ XT_TRUE:
+00394a 394b .dw PFA_TRUE
+ PFA_TRUE:
+00394b 939a
+00394c 938a savetos
+ PFA_TRUE1:
+00394d ef8f ser tosl
+00394e ef9f ser tosh
+00394f ceb4 jmp_ DO_NEXT
+ .include "words/zero.asm"
+
+ ; Arithmetics
+ ; place a value 0 on TOS
+ VE_ZERO:
+003950 ff01 .dw $ff01
+003951 0030 .db "0",0
+003952 3946 .dw VE_HEAD
+ .set VE_HEAD = VE_ZERO
+ XT_ZERO:
+003953 3954 .dw PFA_ZERO
+ PFA_ZERO:
+003954 939a
+003955 938a savetos
+ PFA_ZERO1:
+003956 01c1 movw tosl, zerol
+003957 ceac jmp_ DO_NEXT
+ .include "words/uless.asm"
+
+ ; Compare
+ ; true if u1 < u2 (unsigned)
+ VE_ULESS:
+003958 ff02 .dw $ff02
+003959 3c75 .db "u<"
+00395a 3950 .dw VE_HEAD
+ .set VE_HEAD = VE_ULESS
+ XT_ULESS:
+00395b 395c .dw PFA_ULESS
+ PFA_ULESS:
+00395c 9129 ld temp2, Y+
+00395d 9139 ld temp3, Y+
+00395e 1782 cp tosl, temp2
+00395f 0793 cpc tosh, temp3
+003960 f3a8 brlo PFA_ZERO1
+003961 f3a1 brbs 1, PFA_ZERO1
+003962 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:
+003963 ff02 .dw $ff02
+003964 3e75 .db "u>"
+003965 3958 .dw VE_HEAD
+ .set VE_HEAD = VE_UGREATER
+ XT_UGREATER:
+003966 3800 .dw DO_COLON
+ PFA_UGREATER:
+ .endif
+003967 38c3 .DW XT_SWAP
+003968 395b .dw XT_ULESS
+003969 381f .dw XT_EXIT
+ .include "words/less.asm"
+
+ ; Compare
+ ; true if n1 is less than n2
+ VE_LESS:
+00396a ff01 .dw $ff01
+00396b 003c .db "<",0
+00396c 3963 .dw VE_HEAD
+ .set VE_HEAD = VE_LESS
+ XT_LESS:
+00396d 396e .dw PFA_LESS
+ PFA_LESS:
+00396e 9129 ld temp2, Y+
+00396f 9139 ld temp3, Y+
+003970 1728 cp temp2, tosl
+003971 0739 cpc temp3, tosh
+ PFA_LESSDONE:
+003972 f71c brge PFA_ZERO1
+003973 cfd9 rjmp PFA_TRUE1
+ .include "words/greater.asm"
+
+ ; Compare
+ ; flag is true if n1 is greater than n2
+ VE_GREATER:
+003974 ff01 .dw $ff01
+003975 003e .db ">",0
+003976 396a .dw VE_HEAD
+ .set VE_HEAD = VE_GREATER
+ XT_GREATER:
+003977 3978 .dw PFA_GREATER
+ PFA_GREATER:
+003978 9129 ld temp2, Y+
+003979 9139 ld temp3, Y+
+00397a 1728 cp temp2, tosl
+00397b 0739 cpc temp3, tosh
+ PFA_GREATERDONE:
+00397c f2cc brlt PFA_ZERO1
+00397d f2c1 brbs 1, PFA_ZERO1
+00397e cfce rjmp PFA_TRUE1
+
+ .include "words/log2.asm"
+
+ ; Arithmetics
+ ; logarithm to base 2 or highest set bitnumber
+ VE_LOG2:
+00397f ff04 .dw $ff04
+003980 6f6c
+003981 3267 .db "log2"
+003982 3974 .dw VE_HEAD
+ .set VE_HEAD = VE_LOG2
+ XT_LOG2:
+003983 3984 .dw PFA_LOG2
+ PFA_LOG2:
+003984 01fc movw zl, tosl
+003985 2799 clr tosh
+003986 e180 ldi tosl, 16
+ PFA_LOG2_1:
+003987 958a dec tosl
+003988 f022 brmi PFA_LOG2_2 ; wrong data
+003989 0fee lsl zl
+00398a 1fff rol zh
+00398b f7d8 brcc PFA_LOG2_1
+00398c ce77 jmp_ DO_NEXT
+
+ PFA_LOG2_2:
+00398d 959a dec tosh
+00398e ce75 jmp_ DO_NEXT
+ .include "words/minus.asm"
+
+ ; Arithmetics
+ ; subtract n2 from n1
+ VE_MINUS:
+00398f ff01 .dw $ff01
+003990 002d .db "-",0
+003991 397f .dw VE_HEAD
+ .set VE_HEAD = VE_MINUS
+ XT_MINUS:
+003992 3993 .dw PFA_MINUS
+ PFA_MINUS:
+003993 9109 ld temp0, Y+
+003994 9119 ld temp1, Y+
+003995 1b08 sub temp0, tosl
+003996 0b19 sbc temp1, tosh
+003997 01c8 movw tosl, temp0
+003998 ce6b jmp_ DO_NEXT
+ .include "words/plus.asm"
+
+ ; Arithmetics
+ ; add n1 and n2
+ VE_PLUS:
+003999 ff01 .dw $ff01
+00399a 002b .db "+",0
+00399b 398f .dw VE_HEAD
+ .set VE_HEAD = VE_PLUS
+ XT_PLUS:
+00399c 399d .dw PFA_PLUS
+ PFA_PLUS:
+00399d 9109 ld temp0, Y+
+00399e 9119 ld temp1, Y+
+00399f 0f80 add tosl, temp0
+0039a0 1f91 adc tosh, temp1
+0039a1 ce62 jmp_ DO_NEXT
+ .include "words/mstar.asm"
+
+ ; Arithmetics
+ ; multiply 2 cells to a double cell
+ VE_MSTAR:
+0039a2 ff02 .dw $ff02
+0039a3 2a6d .db "m*"
+0039a4 3999 .dw VE_HEAD
+ .set VE_HEAD = VE_MSTAR
+ XT_MSTAR:
+0039a5 39a6 .dw PFA_MSTAR
+ PFA_MSTAR:
+0039a6 018c movw temp0, tosl
+0039a7 9189
+0039a8 9199 loadtos
+0039a9 019c movw temp2, tosl
+ ; high cell ah*bh
+0039aa 0231 muls temp3, temp1
+0039ab 0170 movw temp4, r0
+ ; low cell al*bl
+0039ac 9f20 mul temp2, temp0
+0039ad 01c0 movw tosl, r0
+ ; signed ah*bl
+0039ae 0330 mulsu temp3, temp0
+0039af 08f3 sbc temp5, zeroh
+0039b0 0d90 add tosh, r0
+0039b1 1ce1 adc temp4, r1
+0039b2 1cf3 adc temp5, zeroh
+
+ ; signed al*bh
+0039b3 0312 mulsu temp1, temp2
+0039b4 08f3 sbc temp5, zeroh
+0039b5 0d90 add tosh, r0
+0039b6 1ce1 adc temp4, r1
+0039b7 1cf3 adc temp5, zeroh
+
+0039b8 939a
+0039b9 938a savetos
+0039ba 01c7 movw tosl, temp4
+0039bb ce48 jmp_ DO_NEXT
+ .include "words/umslashmod.asm"
+
+ ; Arithmetics
+ ; unsigned division ud / u2 with remainder
+ VE_UMSLASHMOD:
+0039bc ff06 .dw $ff06
+0039bd 6d75
+0039be 6d2f
+0039bf 646f .db "um/mod"
+0039c0 39a2 .dw VE_HEAD
+ .set VE_HEAD = VE_UMSLASHMOD
+ XT_UMSLASHMOD:
+0039c1 39c2 .dw PFA_UMSLASHMOD
+ PFA_UMSLASHMOD:
+0039c2 017c movw temp4, tosl
+
+0039c3 9129 ld temp2, Y+
+0039c4 9139 ld temp3, Y+
+
+0039c5 9109 ld temp0, Y+
+0039c6 9119 ld temp1, Y+
+
+ ;; unsigned 32/16 -> 16r16 divide
+
+ PFA_UMSLASHMODmod:
+
+ ; set loop counter
+0039c7 e140 ldi temp6,$10
+
+ PFA_UMSLASHMODmod_loop:
+ ; shift left, saving high bit
+0039c8 2755 clr temp7
+0039c9 0f00 lsl temp0
+0039ca 1f11 rol temp1
+0039cb 1f22 rol temp2
+0039cc 1f33 rol temp3
+0039cd 1f55 rol temp7
+
+ ; try subtracting divisor
+0039ce 152e cp temp2, temp4
+0039cf 053f cpc temp3, temp5
+0039d0 0552 cpc temp7,zerol
+
+0039d1 f018 brcs PFA_UMSLASHMODmod_loop_control
+
+ PFA_UMSLASHMODmod_subtract:
+ ; dividend is large enough
+ ; do the subtraction for real
+ ; and set lowest bit
+0039d2 9503 inc temp0
+0039d3 192e sub temp2, temp4
+0039d4 093f sbc temp3, temp5
+
+ PFA_UMSLASHMODmod_loop_control:
+0039d5 954a dec temp6
+0039d6 f789 brne PFA_UMSLASHMODmod_loop
+
+ PFA_UMSLASHMODmod_done:
+ ; put remainder on stack
+0039d7 933a st -Y,temp3
+0039d8 932a st -Y,temp2
+
+ ; put quotient on stack
+0039d9 01c8 movw tosl, temp0
+0039da ce29 jmp_ DO_NEXT
+ .include "words/umstar.asm"
+
+ ; Arithmetics
+ ; multiply 2 unsigned cells to a double cell
+ VE_UMSTAR:
+0039db ff03 .dw $ff03
+0039dc 6d75
+0039dd 002a .db "um*",0
+0039de 39bc .dw VE_HEAD
+ .set VE_HEAD = VE_UMSTAR
+ XT_UMSTAR:
+0039df 39e0 .dw PFA_UMSTAR
+ PFA_UMSTAR:
+0039e0 018c movw temp0, tosl
+0039e1 9189
+0039e2 9199 loadtos
+ ; result: (temp3*temp1)* 65536 + (temp3*temp0 + temp1*temp2) * 256 + (temp0 * temp2)
+ ; low bytes
+0039e3 9f80 mul tosl,temp0
+0039e4 01f0 movw zl, r0
+0039e5 2722 clr temp2
+0039e6 2733 clr temp3
+ ; middle bytes
+0039e7 9f90 mul tosh, temp0
+0039e8 0df0 add zh, r0
+0039e9 1d21 adc temp2, r1
+0039ea 1d33 adc temp3, zeroh
+
+0039eb 9f81 mul tosl, temp1
+0039ec 0df0 add zh, r0
+0039ed 1d21 adc temp2, r1
+0039ee 1d33 adc temp3, zeroh
+
+0039ef 9f91 mul tosh, temp1
+0039f0 0d20 add temp2, r0
+0039f1 1d31 adc temp3, r1
+0039f2 01cf movw tosl, zl
+0039f3 939a
+0039f4 938a savetos
+0039f5 01c9 movw tosl, temp2
+0039f6 ce0d jmp_ DO_NEXT
+
+ .include "words/invert.asm"
+
+ ; Arithmetics
+ ; 1-complement of TOS
+ VE_INVERT:
+0039f7 ff06 .dw $ff06
+0039f8 6e69
+0039f9 6576
+0039fa 7472 .db "invert"
+0039fb 39db .dw VE_HEAD
+ .set VE_HEAD = VE_INVERT
+ XT_INVERT:
+0039fc 39fd .dw PFA_INVERT
+ PFA_INVERT:
+0039fd 9580 com tosl
+0039fe 9590 com tosh
+0039ff ce04 jmp_ DO_NEXT
+ .include "words/2slash.asm"
+
+ ; Arithmetics
+ ; arithmetic shift right
+ VE_2SLASH:
+003a00 ff02 .dw $ff02
+003a01 2f32 .db "2/"
+003a02 39f7 .dw VE_HEAD
+ .set VE_HEAD = VE_2SLASH
+ XT_2SLASH:
+003a03 3a04 .dw PFA_2SLASH
+ PFA_2SLASH:
+003a04 9595 asr tosh
+003a05 9587 ror tosl
+003a06 cdfd jmp_ DO_NEXT
+ .include "words/2star.asm"
+
+ ; Arithmetics
+ ; arithmetic shift left, filling with zero
+ VE_2STAR:
+003a07 ff02 .dw $ff02
+003a08 2a32 .db "2*"
+003a09 3a00 .dw VE_HEAD
+ .set VE_HEAD = VE_2STAR
+ XT_2STAR:
+003a0a 3a0b .dw PFA_2STAR
+ PFA_2STAR:
+003a0b 0f88 lsl tosl
+003a0c 1f99 rol tosh
+003a0d cdf6 jmp_ DO_NEXT
+ .include "words/and.asm"
+
+ ; Logic
+ ; bitwise and
+ VE_AND:
+003a0e ff03 .dw $ff03
+003a0f 6e61
+003a10 0064 .db "and",0
+003a11 3a07 .dw VE_HEAD
+ .set VE_HEAD = VE_AND
+ XT_AND:
+003a12 3a13 .dw PFA_AND
+ PFA_AND:
+003a13 9109 ld temp0, Y+
+003a14 9119 ld temp1, Y+
+003a15 2380 and tosl, temp0
+003a16 2391 and tosh, temp1
+003a17 cdec jmp_ DO_NEXT
+ .include "words/or.asm"
+
+ ; Logic
+ ; logical or
+ VE_OR:
+003a18 ff02 .dw $ff02
+003a19 726f .db "or"
+003a1a 3a0e .dw VE_HEAD
+ .set VE_HEAD = VE_OR
+ XT_OR:
+003a1b 3a1c .dw PFA_OR
+ PFA_OR:
+003a1c 9109 ld temp0, Y+
+003a1d 9119 ld temp1, Y+
+003a1e 2b80 or tosl, temp0
+003a1f 2b91 or tosh, temp1
+003a20 cde3 jmp_ DO_NEXT
+
+ .include "words/xor.asm"
+
+ ; Logic
+ ; exclusive or
+ VE_XOR:
+003a21 ff03 .dw $ff03
+003a22 6f78
+003a23 0072 .db "xor",0
+003a24 3a18 .dw VE_HEAD
+ .set VE_HEAD = VE_XOR
+ XT_XOR:
+003a25 3a26 .dw PFA_XOR
+ PFA_XOR:
+003a26 9109 ld temp0, Y+
+003a27 9119 ld temp1, Y+
+003a28 2780 eor tosl, temp0
+003a29 2791 eor tosh, temp1
+003a2a cdd9 jmp_ DO_NEXT
+
+ .include "words/1plus.asm"
+
+ ; Arithmetics
+ ; optimized increment
+ VE_1PLUS:
+003a2b ff02 .dw $ff02
+003a2c 2b31 .db "1+"
+003a2d 3a21 .dw VE_HEAD
+ .set VE_HEAD = VE_1PLUS
+ XT_1PLUS:
+003a2e 3a2f .dw PFA_1PLUS
+ PFA_1PLUS:
+003a2f 9601 adiw tosl,1
+003a30 cdd3 jmp_ DO_NEXT
+ .include "words/1minus.asm"
+
+ ; Arithmetics
+ ; optimized decrement
+ VE_1MINUS:
+003a31 ff02 .dw $ff02
+003a32 2d31 .db "1-"
+003a33 3a2b .dw VE_HEAD
+ .set VE_HEAD = VE_1MINUS
+ XT_1MINUS:
+003a34 3a35 .dw PFA_1MINUS
+ PFA_1MINUS:
+003a35 9701 sbiw tosl, 1
+003a36 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:
+003a37 ff07 .dw $ff07
+003a38 6e3f
+003a39 6765
+003a3a 7461
+../../common\words/q-negate.asm(11): warning: .cseg .db misalignment - padding zero byte
+003a3b 0065 .db "?negate"
+003a3c 3a31 .dw VE_HEAD
+ .set VE_HEAD = VE_QNEGATE
+ XT_QNEGATE:
+003a3d 3800 .dw DO_COLON
+ PFA_QNEGATE:
+
+ .endif
+003a3e 3920
+003a3f 3835 .DW XT_ZEROLESS,XT_DOCONDBRANCH
+003a40 3a42 DEST(QNEG1)
+003a41 3e26 .DW XT_NEGATE
+003a42 381f QNEG1: .DW XT_EXIT
+ .include "words/lshift.asm"
+
+ ; Arithmetics
+ ; logically shift n1 left n2 times
+ VE_LSHIFT:
+003a43 ff06 .dw $ff06
+003a44 736c
+003a45 6968
+003a46 7466 .db "lshift"
+003a47 3a37 .dw VE_HEAD
+ .set VE_HEAD = VE_LSHIFT
+ XT_LSHIFT:
+003a48 3a49 .dw PFA_LSHIFT
+ PFA_LSHIFT:
+003a49 01fc movw zl, tosl
+003a4a 9189
+003a4b 9199 loadtos
+ PFA_LSHIFT1:
+003a4c 9731 sbiw zl, 1
+003a4d f01a brmi PFA_LSHIFT2
+003a4e 0f88 lsl tosl
+003a4f 1f99 rol tosh
+003a50 cffb rjmp PFA_LSHIFT1
+ PFA_LSHIFT2:
+003a51 cdb2 jmp_ DO_NEXT
+
+ .include "words/rshift.asm"
+
+ ; Arithmetics
+ ; shift n1 n2-times logically right
+ VE_RSHIFT:
+003a52 ff06 .dw $ff06
+003a53 7372
+003a54 6968
+003a55 7466 .db "rshift"
+003a56 3a43 .dw VE_HEAD
+ .set VE_HEAD = VE_RSHIFT
+ XT_RSHIFT:
+003a57 3a58 .dw PFA_RSHIFT
+ PFA_RSHIFT:
+003a58 01fc movw zl, tosl
+003a59 9189
+003a5a 9199 loadtos
+ PFA_RSHIFT1:
+003a5b 9731 sbiw zl, 1
+003a5c f01a brmi PFA_RSHIFT2
+003a5d 9596 lsr tosh
+003a5e 9587 ror tosl
+003a5f cffb rjmp PFA_RSHIFT1
+ PFA_RSHIFT2:
+003a60 cda3 jmp_ DO_NEXT
+
+ .include "words/plusstore.asm"
+
+ ; Arithmetics
+ ; add n to content of RAM address a-addr
+ VE_PLUSSTORE:
+003a61 ff02 .dw $ff02
+003a62 212b .db "+!"
+003a63 3a52 .dw VE_HEAD
+ .set VE_HEAD = VE_PLUSSTORE
+ XT_PLUSSTORE:
+003a64 3a65 .dw PFA_PLUSSTORE
+ PFA_PLUSSTORE:
+003a65 01fc movw zl, tosl
+003a66 9189
+003a67 9199 loadtos
+003a68 8120 ldd temp2, Z+0
+003a69 8131 ldd temp3, Z+1
+003a6a 0f82 add tosl, temp2
+003a6b 1f93 adc tosh, temp3
+003a6c 8380 std Z+0, tosl
+003a6d 8391 std Z+1, tosh
+003a6e 9189
+003a6f 9199 loadtos
+003a70 cd93 jmp_ DO_NEXT
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+ .include "words/rpfetch.asm"
+
+ ; Stack
+ ; current return stack pointer address
+ VE_RP_FETCH:
+003a71 ff03 .dw $ff03
+003a72 7072
+003a73 0040 .db "rp@",0
+003a74 3a61 .dw VE_HEAD
+ .set VE_HEAD = VE_RP_FETCH
+ XT_RP_FETCH:
+003a75 3a76 .dw PFA_RP_FETCH
+ PFA_RP_FETCH:
+003a76 939a
+003a77 938a savetos
+003a78 b78d in tosl, SPL
+003a79 b79e in tosh, SPH
+003a7a cd89 jmp_ DO_NEXT
+ .include "words/rpstore.asm"
+
+ ; Stack
+ ; set return stack pointer
+ VE_RP_STORE:
+003a7b ff03 .dw $ff03
+003a7c 7072
+003a7d 0021 .db "rp!",0
+003a7e 3a71 .dw VE_HEAD
+ .set VE_HEAD = VE_RP_STORE
+ XT_RP_STORE:
+003a7f 3a80 .dw PFA_RP_STORE
+ PFA_RP_STORE:
+003a80 b72f in temp2, SREG
+003a81 94f8 cli
+003a82 bf8d out SPL, tosl
+003a83 bf9e out SPH, tosh
+003a84 bf2f out SREG, temp2
+003a85 9189
+003a86 9199 loadtos
+003a87 cd7c jmp_ DO_NEXT
+ .include "words/spfetch.asm"
+
+ ; Stack
+ ; current data stack pointer
+ VE_SP_FETCH:
+003a88 ff03 .dw $ff03
+003a89 7073
+003a8a 0040 .db "sp@",0
+003a8b 3a7b .dw VE_HEAD
+ .set VE_HEAD = VE_SP_FETCH
+ XT_SP_FETCH:
+003a8c 3a8d .dw PFA_SP_FETCH
+ PFA_SP_FETCH:
+003a8d 939a
+003a8e 938a savetos
+003a8f 01ce movw tosl, yl
+003a90 cd73 jmp_ DO_NEXT
+ .include "words/spstore.asm"
+
+ ; Stack
+ ; set data stack pointer to addr
+ VE_SP_STORE:
+003a91 ff03 .dw $ff03
+003a92 7073
+003a93 0021 .db "sp!",0
+003a94 3a88 .dw VE_HEAD
+ .set VE_HEAD = VE_SP_STORE
+ XT_SP_STORE:
+003a95 3a96 .dw PFA_SP_STORE
+ PFA_SP_STORE:
+003a96 01ec movw yl, tosl
+003a97 9189
+003a98 9199 loadtos
+003a99 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:
+003a9a 3a9b .dw PFA_DODO
+ PFA_DODO:
+003a9b 9129 ld temp2, Y+
+003a9c 9139 ld temp3, Y+ ; limit
+ PFA_DODO1:
+003a9d e8e0 ldi zl, $80
+003a9e 0f3e add temp3, zl
+003a9f 1b82 sub tosl, temp2
+003aa0 0b93 sbc tosh, temp3
+
+003aa1 933f push temp3
+003aa2 932f push temp2 ; limit ( --> limit + $8000)
+003aa3 939f push tosh
+003aa4 938f push tosl ; start -> index ( --> index - (limit - $8000)
+003aa5 9189
+003aa6 9199 loadtos
+003aa7 cd5c jmp_ DO_NEXT
+ .include "words/i.asm"
+
+ ; Compiler
+ ; current loop counter
+ VE_I:
+003aa8 ff01 .dw $FF01
+003aa9 0069 .db "i",0
+003aaa 3a91 .dw VE_HEAD
+ .set VE_HEAD = VE_I
+ XT_I:
+003aab 3aac .dw PFA_I
+ PFA_I:
+003aac 939a
+003aad 938a savetos
+003aae 918f pop tosl
+003aaf 919f pop tosh ; index
+003ab0 91ef pop zl
+003ab1 91ff pop zh ; limit
+003ab2 93ff push zh
+003ab3 93ef push zl
+003ab4 939f push tosh
+003ab5 938f push tosl
+003ab6 0f8e add tosl, zl
+003ab7 1f9f adc tosh, zh
+003ab8 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:
+003ab9 3aba .dw PFA_DOPLUSLOOP
+ PFA_DOPLUSLOOP:
+003aba 91ef pop zl
+003abb 91ff pop zh
+003abc 0fe8 add zl, tosl
+003abd 1ff9 adc zh, tosh
+003abe 9189
+003abf 9199 loadtos
+003ac0 f01b brvs PFA_DOPLUSLOOP_LEAVE
+ ; next cycle
+ PFA_DOPLUSLOOP_NEXT:
+ ; next iteration
+003ac1 93ff push zh
+003ac2 93ef push zl
+003ac3 cd6b rjmp PFA_DOBRANCH ; read next cell from dictionary and jump to its destination
+ PFA_DOPLUSLOOP_LEAVE:
+003ac4 910f pop temp0
+003ac5 911f pop temp1 ; remove limit
+003ac6 9611 adiw xl, 1 ; skip branch-back address
+003ac7 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:
+003ac8 3ac9 .dw PFA_DOLOOP
+ PFA_DOLOOP:
+003ac9 91ef pop zl
+003aca 91ff pop zh
+003acb 9631 adiw zl,1
+003acc f3bb brvs PFA_DOPLUSLOOP_LEAVE
+003acd cff3 jmp_ PFA_DOPLUSLOOP_NEXT
+ .include "words/unloop.asm"
+
+ ; Compiler
+ ; remove loop-sys, exit the loop and continue execution after it
+ VE_UNLOOP:
+003ace ff06 .dw $ff06
+003acf 6e75
+003ad0 6f6c
+003ad1 706f .db "unloop"
+003ad2 3aa8 .dw VE_HEAD
+ .set VE_HEAD = VE_UNLOOP
+ XT_UNLOOP:
+003ad3 3ad4 .dw PFA_UNLOOP
+ PFA_UNLOOP:
+003ad4 911f pop temp1
+003ad5 910f pop temp0
+003ad6 911f pop temp1
+003ad7 910f pop temp0
+003ad8 cd2b jmp_ DO_NEXT
+
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+ .include "words/cmove_g.asm"
+
+ ; Memory
+ ; copy data in RAM from higher to lower addresses.
+ VE_CMOVE_G:
+003ad9 ff06 .dw $ff06
+003ada 6d63
+003adb 766f
+003adc 3e65 .db "cmove>"
+003add 3ace .dw VE_HEAD
+ .set VE_HEAD = VE_CMOVE_G
+ XT_CMOVE_G:
+003ade 3adf .dw PFA_CMOVE_G
+ PFA_CMOVE_G:
+003adf 93bf push xh
+003ae0 93af push xl
+003ae1 91e9 ld zl, Y+
+003ae2 91f9 ld zh, Y+ ; addr-to
+003ae3 91a9 ld xl, Y+
+003ae4 91b9 ld xh, Y+ ; addr-from
+003ae5 2f09 mov temp0, tosh
+003ae6 2b08 or temp0, tosl
+003ae7 f041 brbs 1, PFA_CMOVE_G1
+003ae8 0fe8 add zl, tosl
+003ae9 1ff9 adc zh, tosh
+003aea 0fa8 add xl, tosl
+003aeb 1fb9 adc xh, tosh
+ PFA_CMOVE_G2:
+003aec 911e ld temp1, -X
+003aed 9312 st -Z, temp1
+003aee 9701 sbiw tosl, 1
+003aef f7e1 brbc 1, PFA_CMOVE_G2
+ PFA_CMOVE_G1:
+003af0 91af pop xl
+003af1 91bf pop xh
+003af2 9189
+003af3 9199 loadtos
+003af4 cd0f jmp_ DO_NEXT
+ .include "words/byteswap.asm"
+
+ ; Arithmetics
+ ; exchange the bytes of the TOS
+ VE_BYTESWAP:
+003af5 ff02 .dw $ff02
+003af6 3c3e .db "><"
+003af7 3ad9 .dw VE_HEAD
+ .set VE_HEAD = VE_BYTESWAP
+ XT_BYTESWAP:
+003af8 3af9 .dw PFA_BYTESWAP
+ PFA_BYTESWAP:
+003af9 2f09 mov temp0, tosh
+003afa 2f98 mov tosh, tosl
+003afb 2f80 mov tosl, temp0
+003afc cd07 jmp_ DO_NEXT
+ .include "words/up.asm"
+
+ ; System Variable
+ ; get user area pointer
+ VE_UP_FETCH:
+003afd ff03 .dw $ff03
+003afe 7075
+003aff 0040 .db "up@",0
+003b00 3af5 .dw VE_HEAD
+ .set VE_HEAD = VE_UP_FETCH
+ XT_UP_FETCH:
+003b01 3b02 .dw PFA_UP_FETCH
+ PFA_UP_FETCH:
+003b02 939a
+003b03 938a savetos
+003b04 01c2 movw tosl, upl
+003b05 ccfe jmp_ DO_NEXT
+
+ ; ( addr -- )
+ ; System Variable
+ ; set user area pointer
+ VE_UP_STORE:
+003b06 ff03 .dw $ff03
+003b07 7075
+003b08 0021 .db "up!",0
+003b09 3afd .dw VE_HEAD
+ .set VE_HEAD = VE_UP_STORE
+ XT_UP_STORE:
+003b0a 3b0b .dw PFA_UP_STORE
+ PFA_UP_STORE:
+003b0b 012c movw upl, tosl
+003b0c 9189
+003b0d 9199 loadtos
+003b0e ccf5 jmp_ DO_NEXT
+ .include "words/1ms.asm"
+
+ ; Time
+ ; busy waits (almost) exactly 1 millisecond
+ VE_1MS:
+003b0f ff03 .dw $ff03
+003b10 6d31
+003b11 0073 .db "1ms",0
+003b12 3b06 .dw VE_HEAD
+ .set VE_HEAD = VE_1MS
+ XT_1MS:
+003b13 3b14 .dw PFA_1MS
+ PFA_1MS:
+003b14 eae0
+003b15 e0ff
+003b16 9731
+003b17 f7f1 delay 1000
+003b18 cceb jmp_ DO_NEXT
+ .include "words/2to_r.asm"
+
+ ; Stack
+ ; move DTOS to TOR
+ VE_2TO_R:
+003b19 ff03 .dw $ff03
+003b1a 3e32
+003b1b 0072 .db "2>r",0
+003b1c 3b0f .dw VE_HEAD
+ .set VE_HEAD = VE_2TO_R
+ XT_2TO_R:
+003b1d 3b1e .dw PFA_2TO_R
+ PFA_2TO_R:
+003b1e 01fc movw zl, tosl
+003b1f 9189
+003b20 9199 loadtos
+003b21 939f push tosh
+003b22 938f push tosl
+003b23 93ff push zh
+003b24 93ef push zl
+003b25 9189
+003b26 9199 loadtos
+003b27 ccdc jmp_ DO_NEXT
+ .include "words/2r_from.asm"
+
+ ; Stack
+ ; move DTOR to TOS
+ VE_2R_FROM:
+003b28 ff03 .dw $ff03
+003b29 7232
+003b2a 003e .db "2r>",0
+003b2b 3b19 .dw VE_HEAD
+ .set VE_HEAD = VE_2R_FROM
+ XT_2R_FROM:
+003b2c 3b2d .dw PFA_2R_FROM
+ PFA_2R_FROM:
+003b2d 939a
+003b2e 938a savetos
+003b2f 91ef pop zl
+003b30 91ff pop zh
+003b31 918f pop tosl
+003b32 919f pop tosh
+003b33 939a
+003b34 938a savetos
+003b35 01cf movw tosl, zl
+003b36 cccd jmp_ DO_NEXT
+
+ .include "words/store-e.asm"
+
+ ; Memory
+ ; write n (2bytes) to eeprom address
+ VE_STOREE:
+003b37 ff02 .dw $ff02
+003b38 6521 .db "!e"
+003b39 3b28 .dw VE_HEAD
+ .set VE_HEAD = VE_STOREE
+ XT_STOREE:
+003b3a 3b3b .dw PFA_STOREE
+ PFA_STOREE:
+ .if WANT_UNIFIED == 1
+ .endif
+ PFA_STOREE0:
+003b3b 01fc movw zl, tosl
+003b3c 9189
+003b3d 9199 loadtos
+003b3e b72f in_ temp2, SREG
+003b3f 94f8 cli
+003b40 d028 rcall PFA_FETCHE2
+003b41 b500 in_ temp0, EEDR
+003b42 1708 cp temp0,tosl
+003b43 f009 breq PFA_STOREE3
+003b44 d00b rcall PFA_STOREE1
+ PFA_STOREE3:
+003b45 9631 adiw zl,1
+003b46 d022 rcall PFA_FETCHE2
+003b47 b500 in_ temp0, EEDR
+003b48 1709 cp temp0,tosh
+003b49 f011 breq PFA_STOREE4
+003b4a 2f89 mov tosl, tosh
+003b4b d004 rcall PFA_STOREE1
+ PFA_STOREE4:
+003b4c bf2f out_ SREG, temp2
+003b4d 9189
+003b4e 9199 loadtos
+003b4f ccb4 jmp_ DO_NEXT
+
+ PFA_STOREE1:
+003b50 99f9 sbic EECR, EEPE
+003b51 cffe rjmp PFA_STOREE1
+
+ PFA_STOREE2: ; estore_wait_low_spm:
+003b52 b707 in_ temp0, SPMCSR
+003b53 fd00 sbrc temp0,SPMEN
+003b54 cffd rjmp PFA_STOREE2
+
+003b55 bdf2 out_ EEARH,zh
+003b56 bde1 out_ EEARL,zl
+003b57 bd80 out_ EEDR, tosl
+003b58 9afa sbi EECR,EEMPE
+003b59 9af9 sbi EECR,EEPE
+
+003b5a 9508 ret
+ .if WANT_UNIFIED == 1
+ .endif
+ .include "words/fetch-e.asm"
+
+ ; Memory
+ ; read 1 cell from eeprom
+ VE_FETCHE:
+003b5b ff02 .dw $ff02
+003b5c 6540 .db "@e"
+003b5d 3b37 .dw VE_HEAD
+ .set VE_HEAD = VE_FETCHE
+ XT_FETCHE:
+003b5e 3b5f .dw PFA_FETCHE
+ PFA_FETCHE:
+ .if WANT_UNIFIED == 1
+ .endif
+ PFA_FETCHE1:
+003b5f b72f in_ temp2, SREG
+003b60 94f8 cli
+003b61 01fc movw zl, tosl
+003b62 d006 rcall PFA_FETCHE2
+003b63 b580 in_ tosl, EEDR
+
+003b64 9631 adiw zl,1
+
+003b65 d003 rcall PFA_FETCHE2
+003b66 b590 in_ tosh, EEDR
+003b67 bf2f out_ SREG, temp2
+003b68 cc9b jmp_ DO_NEXT
+
+ PFA_FETCHE2:
+003b69 99f9 sbic EECR, EEPE
+003b6a cffe rjmp PFA_FETCHE2
+
+003b6b bdf2 out_ EEARH,zh
+003b6c bde1 out_ EEARL,zl
+
+003b6d 9af8 sbi EECR,EERE
+003b6e 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:
+003b6f ff02 .dw $ff02
+003b70 6921 .db "!i"
+003b71 3b5b .dw VE_HEAD
+ .set VE_HEAD = VE_STOREI
+ XT_STOREI:
+003b72 3dfe .dw PFA_DODEFER1
+ PFA_STOREI:
+003b73 0066 .dw EE_STOREI
+003b74 3d9f .dw XT_EDEFERFETCH
+003b75 3da9 .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:
+003b76 ff09 .dw $ff09
+003b77 2128
+003b78 2d69
+003b79 726e
+003b7a 7777
+003b7b 0029 .db "(!i-nrww)",0
+003b7c 3b6f .dw VE_HEAD
+ .set VE_HEAD = VE_DO_STOREI_NRWW
+ XT_DO_STOREI:
+003b7d 3b7e .dw PFA_DO_STOREI_NRWW
+ PFA_DO_STOREI_NRWW:
+ ; store status register
+003b7e b71f in temp1,SREG
+003b7f 931f push temp1
+003b80 94f8 cli
+
+003b81 019c movw temp2, tosl ; save the (word) address
+003b82 9189
+003b83 9199 loadtos ; get the new value for the flash cell
+003b84 93af push xl
+003b85 93bf push xh
+003b86 93cf push yl
+003b87 93df push yh
+003b88 d009 rcall DO_STOREI_atmega
+003b89 91df pop yh
+003b8a 91cf pop yl
+003b8b 91bf pop xh
+003b8c 91af pop xl
+ ; finally clear the stack
+003b8d 9189
+003b8e 9199 loadtos
+003b8f 911f pop temp1
+ ; restore status register (and interrupt enable flag)
+003b90 bf1f out SREG,temp1
+
+003b91 cc72 jmp_ DO_NEXT
+
+ ;
+ DO_STOREI_atmega:
+ ; write data to temp page buffer
+ ; use the values in tosl/tosh at the
+ ; appropiate place
+003b92 d010 rcall pageload
+
+ ; erase page if needed
+ ; it is needed if a bit goes from 0 to 1
+003b93 94e0 com temp4
+003b94 94f0 com temp5
+003b95 218e and tosl, temp4
+003b96 219f and tosh, temp5
+003b97 2b98 or tosh, tosl
+003b98 f019 breq DO_STOREI_writepage
+003b99 01f9 movw zl, temp2
+003b9a e002 ldi temp0,(1<<PGERS)
+003b9b d020 rcall dospm
+
+ DO_STOREI_writepage:
+ ; write page
+003b9c 01f9 movw zl, temp2
+003b9d e004 ldi temp0,(1<<PGWRT)
+003b9e d01d rcall dospm
+
+ ; reenable RWW section
+003b9f 01f9 movw zl, temp2
+003ba0 e100 ldi temp0,(1<<RWWSRE)
+003ba1 d01a rcall dospm
+003ba2 9508 ret
+
+ ; load the desired page
+ .equ pagemask = ~ ( PAGESIZE - 1 )
+ pageload:
+003ba3 01f9 movw zl, temp2
+ ; get the beginning of page
+003ba4 7ce0 andi zl,low(pagemask)
+003ba5 7fff andi zh,high(pagemask)
+003ba6 01ef movw y, z
+ ; loop counter (in words)
+003ba7 e4a0 ldi xl,low(pagesize)
+003ba8 e0b0 ldi xh,high(pagesize)
+ pageload_loop:
+ ; we need the current flash value anyways
+003ba9 01fe movw z, y
+003baa 0fee
+003bab 1fff
+003bac 9145
+003bad 9155 readflashcell temp6, temp7 ; destroys Z
+ ; now check: if Z points to the same cell as temp2/3, we want the new data
+003bae 01fe movw z, y
+003baf 17e2 cp zl, temp2
+003bb0 07f3 cpc zh, temp3
+003bb1 f011 breq pageload_newdata
+003bb2 010a movw r0, temp6
+003bb3 c002 rjmp pageload_cont
+ pageload_newdata:
+003bb4 017a movw temp4, temp6
+003bb5 010c movw r0, tosl
+ pageload_cont:
+003bb6 2700 clr temp0
+003bb7 d004 rcall dospm
+003bb8 9621 adiw y, 1
+003bb9 9711 sbiw x, 1
+003bba f771 brne pageload_loop
+
+ pageload_done:
+003bbb 9508 ret
+
+
+ ;; dospm
+ ;;
+ ;; execute spm instruction
+ ;; temp0 holds the value for SPMCR
+
+ dospm:
+ dospm_wait_ee:
+003bbc 99f9 sbic EECR, EEPE
+003bbd cffe rjmp dospm_wait_ee
+ dospm_wait_spm:
+003bbe b717 in_ temp1, SPMCSR
+003bbf fd10 sbrc temp1, SPMEN
+003bc0 cffd rjmp dospm_wait_spm
+
+ ; turn the word addres into a byte address
+003bc1 0fee
+003bc2 1fff writeflashcell
+ ; execute spm
+003bc3 6001 ori temp0, (1<<SPMEN)
+003bc4 bf07 out_ SPMCSR,temp0
+003bc5 95e8 spm
+003bc6 9508 ret
+ .endif
+ .include "words/fetch-i.asm"
+
+ ; Memory
+ ; read 1 cell from flash
+ VE_FETCHI:
+003bc7 ff02 .dw $ff02
+003bc8 6940 .db "@i"
+003bc9 3b76 .dw VE_HEAD
+ .set VE_HEAD = VE_FETCHI
+ XT_FETCHI:
+003bca 3bcb .dw PFA_FETCHI
+ PFA_FETCHI:
+003bcb 01fc movw zl, tosl
+003bcc 0fee
+003bcd 1fff
+003bce 9185
+003bcf 9195 readflashcell tosl,tosh
+003bd0 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:
+003bd1 ff03 .dw $ff03
+003bd2 3e6e
+003bd3 0072 .db "n>r",0
+003bd4 3bc7 .dw VE_HEAD
+ .set VE_HEAD = VE_N_TO_R
+ XT_N_TO_R:
+003bd5 3bd6 .dw PFA_N_TO_R
+ PFA_N_TO_R:
+003bd6 01fc movw zl, tosl
+003bd7 2f08 mov temp0, tosl
+ PFA_N_TO_R1:
+003bd8 9189
+003bd9 9199 loadtos
+003bda 939f push tosh
+003bdb 938f push tosl
+003bdc 950a dec temp0
+003bdd f7d1 brne PFA_N_TO_R1
+003bde 93ef push zl
+003bdf 93ff push zh
+003be0 9189
+003be1 9199 loadtos
+003be2 cc21 jmp_ DO_NEXT
+ .include "words/n_r_from.asm"
+
+ ; Stack
+ ; move n items from return stack to data stack
+ VE_N_R_FROM:
+003be3 ff03 .dw $ff03
+003be4 726e
+003be5 003e .db "nr>",0
+003be6 3bd1 .dw VE_HEAD
+ .set VE_HEAD = VE_N_R_FROM
+ XT_N_R_FROM:
+003be7 3be8 .dw PFA_N_R_FROM
+ PFA_N_R_FROM:
+003be8 939a
+003be9 938a savetos
+003bea 91ff pop zh
+003beb 91ef pop zl
+003bec 2f0e mov temp0, zl
+ PFA_N_R_FROM1:
+003bed 918f pop tosl
+003bee 919f pop tosh
+003bef 939a
+003bf0 938a savetos
+003bf1 950a dec temp0
+003bf2 f7d1 brne PFA_N_R_FROM1
+003bf3 01cf movw tosl, zl
+003bf4 cc0f jmp_ DO_NEXT
+ .include "words/d-2star.asm"
+
+ ; Arithmetics
+ ; shift a double cell left
+ VE_D2STAR:
+003bf5 ff03 .dw $ff03
+003bf6 3264
+003bf7 002a .db "d2*",0
+003bf8 3be3 .dw VE_HEAD
+ .set VE_HEAD = VE_D2STAR
+ XT_D2STAR:
+003bf9 3bfa .dw PFA_D2STAR
+ PFA_D2STAR:
+003bfa 9109 ld temp0, Y+
+003bfb 9119 ld temp1, Y+
+003bfc 0f00 lsl temp0
+003bfd 1f11 rol temp1
+003bfe 1f88 rol tosl
+003bff 1f99 rol tosh
+003c00 931a st -Y, temp1
+003c01 930a st -Y, temp0
+003c02 cc01 jmp_ DO_NEXT
+ .include "words/d-2slash.asm"
+
+ ; Arithmetics
+ ; shift a double cell value right
+ VE_D2SLASH:
+003c03 ff03 .dw $ff03
+003c04 3264
+003c05 002f .db "d2/",0
+003c06 3bf5 .dw VE_HEAD
+ .set VE_HEAD = VE_D2SLASH
+ XT_D2SLASH:
+003c07 3c08 .dw PFA_D2SLASH
+ PFA_D2SLASH:
+003c08 9109 ld temp0, Y+
+003c09 9119 ld temp1, Y+
+003c0a 9595 asr tosh
+003c0b 9587 ror tosl
+003c0c 9517 ror temp1
+003c0d 9507 ror temp0
+003c0e 931a st -Y, temp1
+003c0f 930a st -Y, temp0
+003c10 cbf3 jmp_ DO_NEXT
+ .include "words/d-plus.asm"
+
+ ; Arithmetics
+ ; add 2 double cell values
+ VE_DPLUS:
+003c11 ff02 .dw $ff02
+003c12 2b64 .db "d+"
+003c13 3c03 .dw VE_HEAD
+ .set VE_HEAD = VE_DPLUS
+ XT_DPLUS:
+003c14 3c15 .dw PFA_DPLUS
+ PFA_DPLUS:
+003c15 9129 ld temp2, Y+
+003c16 9139 ld temp3, Y+
+
+003c17 90e9 ld temp4, Y+
+003c18 90f9 ld temp5, Y+
+003c19 9149 ld temp6, Y+
+003c1a 9159 ld temp7, Y+
+
+003c1b 0f24 add temp2, temp6
+003c1c 1f35 adc temp3, temp7
+003c1d 1d8e adc tosl, temp4
+003c1e 1d9f adc tosh, temp5
+
+003c1f 933a st -Y, temp3
+003c20 932a st -Y, temp2
+003c21 cbe2 jmp_ DO_NEXT
+ .include "words/d-minus.asm"
+
+ ; Arithmetics
+ ; subtract d2 from d1
+ VE_DMINUS:
+003c22 ff02 .dw $ff02
+003c23 2d64 .db "d-"
+003c24 3c11 .dw VE_HEAD
+ .set VE_HEAD = VE_DMINUS
+ XT_DMINUS:
+003c25 3c26 .dw PFA_DMINUS
+ PFA_DMINUS:
+003c26 9129 ld temp2, Y+
+003c27 9139 ld temp3, Y+
+
+003c28 90e9 ld temp4, Y+
+003c29 90f9 ld temp5, Y+
+003c2a 9149 ld temp6, Y+
+003c2b 9159 ld temp7, Y+
+
+003c2c 1b42 sub temp6, temp2
+003c2d 0b53 sbc temp7, temp3
+003c2e 0ae8 sbc temp4, tosl
+003c2f 0af9 sbc temp5, tosh
+
+003c30 935a st -Y, temp7
+003c31 934a st -Y, temp6
+003c32 01c7 movw tosl, temp4
+003c33 cbd0 jmp_ DO_NEXT
+ .include "words/d-invert.asm"
+
+ ; Arithmetics
+ ; invert all bits in the double cell value
+ VE_DINVERT:
+003c34 ff07 .dw $ff07
+003c35 6964
+003c36 766e
+003c37 7265
+003c38 0074 .db "dinvert",0
+003c39 3c22 .dw VE_HEAD
+ .set VE_HEAD = VE_DINVERT
+ XT_DINVERT:
+003c3a 3c3b .dw PFA_DINVERT
+ PFA_DINVERT:
+003c3b 9109 ld temp0, Y+
+003c3c 9119 ld temp1, Y+
+003c3d 9580 com tosl
+003c3e 9590 com tosh
+003c3f 9500 com temp0
+003c40 9510 com temp1
+003c41 931a st -Y, temp1
+003c42 930a st -Y, temp0
+003c43 cbc0 jmp_ DO_NEXT
+ .include "words/slashmod.asm"
+
+ ; Arithmetics
+ ; signed division n1/n2 with remainder and quotient
+ VE_SLASHMOD:
+003c44 ff04 .dw $ff04
+003c45 6d2f
+003c46 646f .db "/mod"
+003c47 3c34 .dw VE_HEAD
+ .set VE_HEAD = VE_SLASHMOD
+ XT_SLASHMOD:
+003c48 3c49 .dw PFA_SLASHMOD
+ PFA_SLASHMOD:
+003c49 019c movw temp2, tosl
+
+003c4a 9109 ld temp0, Y+
+003c4b 9119 ld temp1, Y+
+
+003c4c 2f41 mov temp6,temp1 ;move dividend High to sign register
+003c4d 2743 eor temp6,temp3 ;xor divisor High with sign register
+003c4e ff17 sbrs temp1,7 ;if MSB in dividend set
+003c4f c004 rjmp PFA_SLASHMOD_1
+003c50 9510 com temp1 ; change sign of dividend
+003c51 9500 com temp0
+003c52 5f0f subi temp0,low(-1)
+003c53 4f1f sbci temp1,high(-1)
+ PFA_SLASHMOD_1:
+003c54 ff37 sbrs temp3,7 ;if MSB in divisor set
+003c55 c004 rjmp PFA_SLASHMOD_2
+003c56 9530 com temp3 ; change sign of divisor
+003c57 9520 com temp2
+003c58 5f2f subi temp2,low(-1)
+003c59 4f3f sbci temp3,high(-1)
+003c5a 24ee PFA_SLASHMOD_2: clr temp4 ;clear remainder Low byte
+003c5b 18ff sub temp5,temp5;clear remainder High byte and carry
+003c5c e151 ldi temp7,17 ;init loop counter
+
+003c5d 1f00 PFA_SLASHMOD_3: rol temp0 ;shift left dividend
+003c5e 1f11 rol temp1
+003c5f 955a dec temp7 ;decrement counter
+003c60 f439 brne PFA_SLASHMOD_5 ;if done
+003c61 ff47 sbrs temp6,7 ; if MSB in sign register set
+003c62 c004 rjmp PFA_SLASHMOD_4
+003c63 9510 com temp1 ; change sign of result
+003c64 9500 com temp0
+003c65 5f0f subi temp0,low(-1)
+003c66 4f1f sbci temp1,high(-1)
+003c67 c00b PFA_SLASHMOD_4: rjmp PFA_SLASHMODmod_done ; return
+003c68 1cee PFA_SLASHMOD_5: rol temp4 ;shift dividend into remainder
+003c69 1cff rol temp5
+003c6a 1ae2 sub temp4,temp2 ;remainder = remainder - divisor
+003c6b 0af3 sbc temp5,temp3 ;
+003c6c f420 brcc PFA_SLASHMOD_6 ;if result negative
+003c6d 0ee2 add temp4,temp2 ; restore remainder
+003c6e 1ef3 adc temp5,temp3
+003c6f 9488 clc ; clear carry to be shifted into result
+003c70 cfec rjmp PFA_SLASHMOD_3 ;else
+003c71 9408 PFA_SLASHMOD_6: sec ; set carry to be shifted into result
+003c72 cfea rjmp PFA_SLASHMOD_3
+
+ PFA_SLASHMODmod_done:
+ ; put remainder on stack
+003c73 92fa st -Y,temp5
+003c74 92ea st -Y,temp4
+
+ ; put quotient on stack
+003c75 01c8 movw tosl, temp0
+003c76 cb8d jmp_ DO_NEXT
+ .include "words/abs.asm"
+
+ ; DUP ?NEGATE ;
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_ABS:
+003c77 ff03 .dw $ff03
+003c78 6261
+003c79 0073 .db "abs",0
+003c7a 3c44 .dw VE_HEAD
+ .set VE_HEAD = VE_ABS
+ XT_ABS:
+003c7b 3800 .dw DO_COLON
+ PFA_ABS:
+
+ .endif
+
+003c7c 38b0
+003c7d 3a3d
+003c7e 381f .DW XT_DUP,XT_QNEGATE,XT_EXIT
+ .include "words/pick.asm"
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_PICK:
+003c7f ff04 .dw $ff04
+003c80 6970
+003c81 6b63 .db "pick"
+003c82 3c77 .dw VE_HEAD
+ .set VE_HEAD = VE_PICK
+ XT_PICK:
+003c83 3800 .dw DO_COLON
+ PFA_PICK:
+ .endif
+003c84 3a2e .dw XT_1PLUS
+003c85 3ec3 .dw XT_CELLS
+003c86 3a8c .dw XT_SP_FETCH
+003c87 399c .dw XT_PLUS
+003c88 3878 .dw XT_FETCH
+003c89 381f .dw XT_EXIT
+ .include "words/cellplus.asm"
+
+ ; Arithmetics
+ ; add the size of an address-unit to a-addr1
+ VE_CELLPLUS:
+003c8a ff05 .dw $ff05
+003c8b 6563
+003c8c 6c6c
+003c8d 002b .db "cell+",0
+003c8e 3c7f .dw VE_HEAD
+ .set VE_HEAD = VE_CELLPLUS
+ XT_CELLPLUS:
+003c8f 3c90 .dw PFA_CELLPLUS
+ PFA_CELLPLUS:
+003c90 9602 adiw tosl, CELLSIZE
+003c91 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:
+003c92 ff04 .dw $ff04
+003c93 692b
+003c94 746e .db "+int"
+003c95 3c8a .dw VE_HEAD
+ .set VE_HEAD = VE_INTON
+ XT_INTON:
+003c96 3c97 .dw PFA_INTON
+ PFA_INTON:
+003c97 9478 sei
+003c98 cb6b jmp_ DO_NEXT
+ .include "words/int-off.asm"
+
+ ; Interrupt
+ ; turns off all interrupts
+ VE_INTOFF:
+003c99 ff04 .dw $ff04
+003c9a 692d
+003c9b 746e .db "-int"
+003c9c 3c92 .dw VE_HEAD
+ .set VE_HEAD = VE_INTOFF
+ XT_INTOFF:
+003c9d 3c9e .dw PFA_INTOFF
+ PFA_INTOFF:
+003c9e 94f8 cli
+003c9f cb64 jmp_ DO_NEXT
+ .include "words/int-store.asm"
+
+ ; Interrupt
+ ; stores XT as interrupt vector i
+ VE_INTSTORE:
+003ca0 ff04 .dw $ff04
+003ca1 6e69
+003ca2 2174 .db "int!"
+003ca3 3c99 .dw VE_HEAD
+ .set VE_HEAD = VE_INTSTORE
+ XT_INTSTORE:
+003ca4 3800 .dw DO_COLON
+ PFA_INTSTORE:
+003ca5 383c .dw XT_DOLITERAL
+003ca6 0000 .dw intvec
+003ca7 399c .dw XT_PLUS
+003ca8 3b3a .dw XT_STOREE
+003ca9 381f .dw XT_EXIT
+ .include "words/int-fetch.asm"
+
+ ; Interrupt
+ ; fetches XT from interrupt vector i
+ VE_INTFETCH:
+003caa ff04 .dw $ff04
+003cab 6e69
+003cac 4074 .db "int@"
+003cad 3ca0 .dw VE_HEAD
+ .set VE_HEAD = VE_INTFETCH
+ XT_INTFETCH:
+003cae 3800 .dw DO_COLON
+ PFA_INTFETCH:
+003caf 383c .dw XT_DOLITERAL
+003cb0 0000 .dw intvec
+003cb1 399c .dw XT_PLUS
+003cb2 3b5e .dw XT_FETCHE
+003cb3 381f .dw XT_EXIT
+ .include "words/int-trap.asm"
+
+ ; Interrupt
+ ; trigger an interrupt
+ VE_INTTRAP:
+003cb4 ff08 .dw $ff08
+003cb5 6e69
+003cb6 2d74
+003cb7 7274
+003cb8 7061 .db "int-trap"
+003cb9 3caa .dw VE_HEAD
+ .set VE_HEAD = VE_INTTRAP
+ XT_INTTRAP:
+003cba 3cbb .dw PFA_INTTRAP
+ PFA_INTTRAP:
+003cbb 2eb8 mov isrflag, tosl
+003cbc 9189
+003cbd 9199 loadtos
+003cbe 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:
+003cbf 3800 .dw DO_COLON
+ PFA_ISREXEC:
+003cc0 3cae .dw XT_INTFETCH
+003cc1 3829 .dw XT_EXECUTE
+003cc2 3cc4 .dw XT_ISREND
+003cc3 381f .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:
+003cc4 3cc5 .dw PFA_ISREND
+ PFA_ISREND:
+003cc5 d001 rcall PFA_ISREND1 ; clear the interrupt flag for the controller
+003cc6 cb3d jmp_ DO_NEXT
+ PFA_ISREND1:
+003cc7 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:
+003cc8 3800 .dw DO_COLON
+ PFA_DEFAULT_PROMPTOK:
+003cc9 03d0 .dw XT_DOSLITERAL
+003cca 0003 .dw 3
+003ccb 6f20
+003ccc 006b .db " ok",0
+ .endif
+003ccd 0403 .dw XT_ITYPE
+003cce 381f .dw XT_EXIT
+
+ ; ------------------------
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_PROMPTOK:
+003ccf ff03 .dw $FF03
+003cd0 6f2e
+../../common\words/prompt-ok.asm(43): warning: .cseg .db misalignment - padding zero byte
+003cd1 006b .db ".ok"
+003cd2 3cb4 .dw VE_HEAD
+ .set VE_HEAD = VE_PROMPTOK
+ XT_PROMPTOK:
+003cd3 3dfe .dw PFA_DODEFER1
+ PFA_PROMPTOK:
+ .endif
+003cd4 001c .dw USER_P_OK
+003cd5 3dc7 .dw XT_UDEFERFETCH
+003cd6 3dd3 .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:
+003cd7 3800 .dw DO_COLON
+ PFA_DEFAULT_PROMPTREADY:
+003cd8 03d0 .dw XT_DOSLITERAL
+003cd9 0002 .dw 2
+003cda 203e .db "> "
+ .endif
+003cdb 3fa0 .dw XT_CR
+003cdc 0403 .dw XT_ITYPE
+003cdd 381f .dw XT_EXIT
+
+ ; ------------------------
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_PROMPTREADY:
+003cde ff06 .dw $FF06
+003cdf 722e
+003ce0 6165
+003ce1 7964 .db ".ready"
+003ce2 3ccf .dw VE_HEAD
+ .set VE_HEAD = VE_PROMPTREADY
+ XT_PROMPTREADY:
+003ce3 3dfe .dw PFA_DODEFER1
+ PFA_PROMPTREADY:
+ .endif
+003ce4 0020 .dw USER_P_RDY
+003ce5 3dc7 .dw XT_UDEFERFETCH
+003ce6 3dd3 .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:
+003ce7 3800 .dw DO_COLON
+ PFA_DEFAULT_PROMPTERROR:
+003ce8 03d0 .dw XT_DOSLITERAL
+003ce9 0004 .dw 4
+003cea 3f20
+003ceb 203f .db " ?? "
+ .endif
+003cec 0403 .dw XT_ITYPE
+003ced 3ebc .dw XT_BASE
+003cee 3878 .dw XT_FETCH
+003cef 38fe .dw XT_TO_R
+003cf0 3f40 .dw XT_DECIMAL
+003cf1 0385 .dw XT_DOT
+003cf2 3ee1 .dw XT_TO_IN
+003cf3 3878 .dw XT_FETCH
+003cf4 0385 .dw XT_DOT
+003cf5 38f5 .dw XT_R_FROM
+003cf6 3ebc .dw XT_BASE
+003cf7 3880 .dw XT_STORE
+003cf8 381f .dw XT_EXIT
+
+ ; ------------------------
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_PROMPTERROR:
+003cf9 ff06 .dw $FF06
+003cfa 652e
+003cfb 7272
+003cfc 726f .db ".error"
+003cfd 3cde .dw VE_HEAD
+ .set VE_HEAD = VE_PROMPTERROR
+ XT_PROMPTERROR:
+003cfe 3dfe .dw PFA_DODEFER1
+ PFA_PROMPTERROR:
+ .endif
+003cff 001e .dw USER_P_ERR
+003d00 3dc7 .dw XT_UDEFERFETCH
+003d01 3dd3 .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:
+003d02 ff04 .dw $ff04
+003d03 7571
+003d04 7469 .db "quit"
+003d05 3cf9 .dw VE_HEAD
+ .set VE_HEAD = VE_QUIT
+ XT_QUIT:
+003d06 3800 .dw DO_COLON
+ .endif
+ PFA_QUIT:
+003d07 085c
+003d08 0863
+003d09 3880 .dw XT_LP0,XT_LP,XT_STORE
+003d0a 05d5 .dw XT_SP0
+003d0b 3a95 .dw XT_SP_STORE
+003d0c 05e2 .dw XT_RP0
+003d0d 3a7f .dw XT_RP_STORE
+003d0e 08f1 .dw XT_LBRACKET
+
+ PFA_QUIT2:
+003d0f 3eb6 .dw XT_STATE
+003d10 3878 .dw XT_FETCH
+003d11 3919 .dw XT_ZEROEQUAL
+003d12 3835 .dw XT_DOCONDBRANCH
+003d13 3d15 DEST(PFA_QUIT4)
+003d14 3ce3 .dw XT_PROMPTREADY
+ PFA_QUIT4:
+003d15 04e9 .dw XT_REFILL
+003d16 3835 .dw XT_DOCONDBRANCH
+003d17 3d27 DEST(PFA_QUIT3)
+003d18 383c .dw XT_DOLITERAL
+003d19 0630 .dw XT_INTERPRET
+003d1a 3d6f .dw XT_CATCH
+003d1b 38b8 .dw XT_QDUP
+003d1c 3835 .dw XT_DOCONDBRANCH
+003d1d 3d27 DEST(PFA_QUIT3)
+003d1e 38b0 .dw XT_DUP
+003d1f 383c .dw XT_DOLITERAL
+003d20 fffe .dw -2
+003d21 396d .dw XT_LESS
+003d22 3835 .dw XT_DOCONDBRANCH
+003d23 3d25 DEST(PFA_QUIT5)
+003d24 3cfe .dw XT_PROMPTERROR
+ PFA_QUIT5:
+003d25 382e .dw XT_DOBRANCH
+003d26 3d07 DEST(PFA_QUIT)
+ PFA_QUIT3:
+003d27 3cd3 .dw XT_PROMPTOK
+003d28 382e .dw XT_DOBRANCH
+003d29 3d0f 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:
+003d2a ff05 .dw $ff05
+003d2b 6170
+003d2c 7375
+003d2d 0065 .db "pause",0
+003d2e 3d02 .dw VE_HEAD
+ .set VE_HEAD = VE_PAUSE
+ XT_PAUSE:
+003d2f 3dfe .dw PFA_DODEFER1
+ PFA_PAUSE:
+003d30 0192 .dw ram_pause
+003d31 3db3 .dw XT_RDEFERFETCH
+003d32 3dbd .dw XT_RDEFERSTORE
+
+ .dseg
+000192 ram_pause: .byte 2
+ .cseg
+ .include "words/cold.asm"
+
+ ; System
+ ; start up amforth.
+ VE_COLD:
+003d33 ff04 .dw $ff04
+003d34 6f63
+003d35 646c .db "cold"
+003d36 3d2a .dw VE_HEAD
+ .set VE_HEAD = VE_COLD
+ XT_COLD:
+003d37 3d38 .dw PFA_COLD
+ PFA_COLD:
+003d38 b6a4 in_ mcu_boot, MCUSR
+003d39 2422 clr zerol
+003d3a 2433 clr zeroh
+003d3b 24bb clr isrflag
+003d3c be24 out_ MCUSR, zerol
+ ; clear RAM
+003d3d e0e0 ldi zl, low(ramstart)
+003d3e e0f1 ldi zh, high(ramstart)
+ clearloop:
+003d3f 9221 st Z+, zerol
+003d40 30e0 cpi zl, low(sram_size+ramstart)
+003d41 f7e9 brne clearloop
+003d42 30f9 cpi zh, high(sram_size+ramstart)
+003d43 f7d9 brne clearloop
+ ; init first user data area
+ ; allocate space for User Area
+ .dseg
+000194 ram_user1: .byte SYSUSERSIZE + APPUSERSIZE
+ .cseg
+003d44 e9e4 ldi zl, low(ram_user1)
+003d45 e0f1 ldi zh, high(ram_user1)
+003d46 012f movw upl, zl
+ ; init return stack pointer
+003d47 ef0f ldi temp0,low(rstackstart)
+003d48 bf0d out_ SPL,temp0
+003d49 8304 std Z+4, temp0
+003d4a e018 ldi temp1,high(rstackstart)
+003d4b bf1e out_ SPH,temp1
+003d4c 8315 std Z+5, temp1
+
+ ; init parameter stack pointer
+003d4d eacf ldi yl,low(stackstart)
+003d4e 83c6 std Z+6, yl
+003d4f e0d8 ldi yh,high(stackstart)
+003d50 83d7 std Z+7, yh
+
+ ; load Forth IP with starting word
+003d51 e5a9 ldi XL, low(PFA_WARM)
+003d52 e3bd ldi XH, high(PFA_WARM)
+ ; its a far jump...
+003d53 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:
+003d54 ff04 .dw $ff04
+003d55 6177
+003d56 6d72 .db "warm"
+003d57 3d33 .dw VE_HEAD
+ .set VE_HEAD = VE_WARM
+ XT_WARM:
+003d58 3800 .dw DO_COLON
+ PFA_WARM:
+ .endif
+003d59 02a2 .dw XT_INIT_RAM
+003d5a 383c .dw XT_DOLITERAL
+003d5b 01a5 .dw XT_NOOP
+003d5c 383c .dw XT_DOLITERAL
+003d5d 3d2f .dw XT_PAUSE
+003d5e 3dde .dw XT_DEFERSTORE
+003d5f 08f1 .dw XT_LBRACKET
+003d60 3f5b .dw XT_TURNKEY
+003d61 3d06 .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:
+003d62 ff07 .dw $ff07
+003d63 6168
+003d64 646e
+003d65 656c
+003d66 0072 .db "handler",0
+003d67 3d54 .dw VE_HEAD
+ .set VE_HEAD = VE_HANDLER
+ XT_HANDLER:
+003d68 3857 .dw PFA_DOUSER
+ PFA_HANDLER:
+ .endif
+003d69 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:
+003d6a ff05 .dw $ff05
+003d6b 6163
+003d6c 6374
+003d6d 0068 .db "catch",0
+003d6e 3d62 .dw VE_HEAD
+ .set VE_HEAD = VE_CATCH
+ XT_CATCH:
+003d6f 3800 .dw DO_COLON
+ PFA_CATCH:
+ .endif
+
+ ; sp@ >r
+003d70 3a8c .dw XT_SP_FETCH
+003d71 38fe .dw XT_TO_R
+ ; handler @ >r
+003d72 3d68 .dw XT_HANDLER
+003d73 3878 .dw XT_FETCH
+003d74 38fe .dw XT_TO_R
+ ; rp@ handler !
+003d75 3a75 .dw XT_RP_FETCH
+003d76 3d68 .dw XT_HANDLER
+003d77 3880 .dw XT_STORE
+003d78 3829 .dw XT_EXECUTE
+ ; r> handler !
+003d79 38f5 .dw XT_R_FROM
+003d7a 3d68 .dw XT_HANDLER
+003d7b 3880 .dw XT_STORE
+003d7c 38f5 .dw XT_R_FROM
+003d7d 38d8 .dw XT_DROP
+003d7e 3953 .dw XT_ZERO
+003d7f 381f .dw XT_EXIT
+ .include "words/throw.asm"
+
+ ; Exceptions
+ ; throw an exception
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_THROW:
+003d80 ff05 .dw $ff05
+003d81 6874
+003d82 6f72
+003d83 0077 .db "throw",0
+003d84 3d6a .dw VE_HEAD
+ .set VE_HEAD = VE_THROW
+ XT_THROW:
+003d85 3800 .dw DO_COLON
+ PFA_THROW:
+ .endif
+003d86 38b0 .dw XT_DUP
+003d87 3919 .dw XT_ZEROEQUAL
+003d88 3835 .dw XT_DOCONDBRANCH
+003d89 3d8c DEST(PFA_THROW1)
+003d8a 38d8 .dw XT_DROP
+003d8b 381f .dw XT_EXIT
+ PFA_THROW1:
+003d8c 3d68 .dw XT_HANDLER
+003d8d 3878 .dw XT_FETCH
+003d8e 3a7f .dw XT_RP_STORE
+003d8f 38f5 .dw XT_R_FROM
+003d90 3d68 .dw XT_HANDLER
+003d91 3880 .dw XT_STORE
+003d92 38f5 .dw XT_R_FROM
+003d93 38c3 .dw XT_SWAP
+003d94 38fe .dw XT_TO_R
+003d95 3a95 .dw XT_SP_STORE
+003d96 38d8 .dw XT_DROP
+003d97 38f5 .dw XT_R_FROM
+003d98 381f .dw XT_EXIT
+
+
+
+ .include "words/edefer-fetch.asm"
+
+ ; System
+ ; does the real defer@ for eeprom defers
+ VE_EDEFERFETCH:
+003d99 ff07 .dw $ff07
+003d9a 6445
+003d9b 6665
+003d9c 7265
+003d9d 0040 .db "Edefer@",0
+003d9e 3d80 .dw VE_HEAD
+ .set VE_HEAD = VE_EDEFERFETCH
+ XT_EDEFERFETCH:
+003d9f 3800 .dw DO_COLON
+ PFA_EDEFERFETCH:
+003da0 3bca .dw XT_FETCHI
+003da1 3b5e .dw XT_FETCHE
+003da2 381f .dw XT_EXIT
+ .include "words/edefer-store.asm"
+
+ ; System
+ ; does the real defer! for eeprom defers
+ VE_EDEFERSTORE:
+003da3 ff07 .dw $ff07
+003da4 6445
+003da5 6665
+003da6 7265
+003da7 0021 .db "Edefer!",0
+003da8 3d99 .dw VE_HEAD
+ .set VE_HEAD = VE_EDEFERSTORE
+ XT_EDEFERSTORE:
+003da9 3800 .dw DO_COLON
+ PFA_EDEFERSTORE:
+003daa 3bca .dw XT_FETCHI
+003dab 3b3a .dw XT_STOREE
+003dac 381f .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:
+003dad ff07 .dw $ff07
+003dae 6452
+003daf 6665
+003db0 7265
+003db1 0040 .db "Rdefer@",0
+003db2 3da3 .dw VE_HEAD
+ .set VE_HEAD = VE_RDEFERFETCH
+ XT_RDEFERFETCH:
+003db3 3800 .dw DO_COLON
+ PFA_RDEFERFETCH:
+ .endif
+003db4 3bca .dw XT_FETCHI
+003db5 3878 .dw XT_FETCH
+003db6 381f .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:
+003db7 ff07 .dw $ff07
+003db8 6452
+003db9 6665
+003dba 7265
+003dbb 0021 .db "Rdefer!",0
+003dbc 3dad .dw VE_HEAD
+ .set VE_HEAD = VE_RDEFERSTORE
+ XT_RDEFERSTORE:
+003dbd 3800 .dw DO_COLON
+ PFA_RDEFERSTORE:
+ .endif
+003dbe 3bca .dw XT_FETCHI
+003dbf 3880 .dw XT_STORE
+003dc0 381f .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:
+003dc1 ff07 .dw $ff07
+003dc2 6455
+003dc3 6665
+003dc4 7265
+003dc5 0040 .db "Udefer@",0
+003dc6 3db7 .dw VE_HEAD
+ .set VE_HEAD = VE_UDEFERFETCH
+ XT_UDEFERFETCH:
+003dc7 3800 .dw DO_COLON
+ PFA_UDEFERFETCH:
+ .endif
+003dc8 3bca .dw XT_FETCHI
+003dc9 3b01 .dw XT_UP_FETCH
+003dca 399c .dw XT_PLUS
+003dcb 3878 .dw XT_FETCH
+003dcc 381f .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:
+003dcd ff07 .dw $ff07
+003dce 6455
+003dcf 6665
+003dd0 7265
+003dd1 0021 .db "Udefer!",0
+003dd2 3dc1 .dw VE_HEAD
+ .set VE_HEAD = VE_UDEFERSTORE
+ XT_UDEFERSTORE:
+003dd3 3800 .dw DO_COLON
+ PFA_UDEFERSTORE:
+ .endif
+
+003dd4 3bca .dw XT_FETCHI
+003dd5 3b01 .dw XT_UP_FETCH
+003dd6 399c .dw XT_PLUS
+003dd7 3880 .dw XT_STORE
+003dd8 381f .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:
+003dd9 ff06 .dw $ff06
+003dda 6564
+003ddb 6566
+003ddc 2172 .db "defer!"
+003ddd 3dcd .dw VE_HEAD
+ .set VE_HEAD = VE_DEFERSTORE
+ XT_DEFERSTORE:
+003dde 3800 .dw DO_COLON
+ PFA_DEFERSTORE:
+ .endif
+003ddf 3fcf .dw XT_TO_BODY
+003de0 38b0 .dw XT_DUP
+003de1 01d1 .dw XT_ICELLPLUS
+003de2 01d1 .dw XT_ICELLPLUS
+003de3 3bca .dw XT_FETCHI
+003de4 3829 .dw XT_EXECUTE
+003de5 381f .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:
+003de6 ff06 .dw $ff06
+003de7 6564
+003de8 6566
+003de9 4072 .db "defer@"
+003dea 3dd9 .dw VE_HEAD
+ .set VE_HEAD = VE_DEFERFETCH
+ XT_DEFERFETCH:
+003deb 3800 .dw DO_COLON
+ PFA_DEFERFETCH:
+ .endif
+003dec 3fcf .dw XT_TO_BODY
+003ded 38b0 .dw XT_DUP
+003dee 01d1 .dw XT_ICELLPLUS
+003def 3bca .dw XT_FETCHI
+003df0 3829 .dw XT_EXECUTE
+003df1 381f .dw XT_EXIT
+ .include "words/do-defer.asm"
+
+ ; System
+ ; runtime of defer
+ VE_DODEFER:
+003df2 ff07 .dw $ff07
+003df3 6428
+003df4 6665
+003df5 7265
+003df6 0029 .db "(defer)", 0
+003df7 3de6 .dw VE_HEAD
+ .set VE_HEAD = VE_DODEFER
+ XT_DODEFER:
+003df8 3800 .dw DO_COLON
+ PFA_DODEFER:
+003df9 0739 .dw XT_DOCREATE
+003dfa 0899 .dw XT_REVEAL
+003dfb 075c .dw XT_COMPILE
+003dfc 3dfe .dw PFA_DODEFER1
+003dfd 381f .dw XT_EXIT
+ PFA_DODEFER1:
+003dfe 940e 08b2 call_ DO_DODOES
+003e00 38b0 .dw XT_DUP
+003e01 01d1 .dw XT_ICELLPLUS
+003e02 3bca .dw XT_FETCHI
+003e03 3829 .dw XT_EXECUTE
+003e04 3829 .dw XT_EXECUTE
+003e05 381f .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:
+003e06 ff02 .dw $ff02
+003e07 2e75 .db "u."
+003e08 3df2 .dw VE_HEAD
+ .set VE_HEAD = VE_UDOT
+ XT_UDOT:
+003e09 3800 .dw DO_COLON
+ PFA_UDOT:
+ .endif
+003e0a 3953 .dw XT_ZERO
+003e0b 038d .dw XT_UDDOT
+003e0c 381f .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:
+003e0d ff03 .dw $ff03
+003e0e 2e75
+003e0f 0072 .db "u.r",0
+003e10 3e06 .dw VE_HEAD
+ .set VE_HEAD = VE_UDOTR
+ XT_UDOTR:
+003e11 3800 .dw DO_COLON
+ PFA_UDOTR:
+ .endif
+003e12 3953 .dw XT_ZERO
+003e13 38c3 .dw XT_SWAP
+003e14 0396 .dw XT_UDDOTR
+003e15 381f .dw XT_EXIT
+ ; : u.r ( s n -- ) 0 swap ud.r ;
+
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+ .include "words/uslashmod.asm"
+
+ ; Arithmetics
+ ; unsigned division with remainder
+ VE_USLASHMOD:
+003e16 ff05 .dw $ff05
+003e17 2f75
+003e18 6f6d
+003e19 0064 .db "u/mod",0
+003e1a 3e0d .dw VE_HEAD
+ .set VE_HEAD = VE_USLASHMOD
+ XT_USLASHMOD:
+003e1b 3800 .dw DO_COLON
+ PFA_USLASHMOD:
+003e1c 38fe .dw XT_TO_R
+003e1d 3953 .dw XT_ZERO
+003e1e 38f5 .dw XT_R_FROM
+003e1f 39c1 .dw XT_UMSLASHMOD
+003e20 381f .dw XT_EXIT
+ .include "words/negate.asm"
+
+ ; Logic
+ ; 2-complement
+ VE_NEGATE:
+003e21 ff06 .dw $ff06
+003e22 656e
+003e23 6167
+003e24 6574 .db "negate"
+003e25 3e16 .dw VE_HEAD
+ .set VE_HEAD = VE_NEGATE
+ XT_NEGATE:
+003e26 3800 .dw DO_COLON
+ PFA_NEGATE:
+003e27 39fc .dw XT_INVERT
+003e28 3a2e .dw XT_1PLUS
+003e29 381f .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:
+003e2a ff01 .dw $ff01
+003e2b 002f .db "/",0
+003e2c 3e21 .dw VE_HEAD
+ .set VE_HEAD = VE_SLASH
+ XT_SLASH:
+003e2d 3800 .dw DO_COLON
+ PFA_SLASH:
+ .endif
+003e2e 3c48 .dw XT_SLASHMOD
+003e2f 38ef .dw XT_NIP
+003e30 381f .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:
+003e31 ff03 .dw $ff03
+003e32 6f6d
+003e33 0064 .db "mod",0
+003e34 3e2a .dw VE_HEAD
+ .set VE_HEAD = VE_MOD
+ XT_MOD:
+003e35 3800 .dw DO_COLON
+ PFA_MOD:
+ .endif
+003e36 3c48 .dw XT_SLASHMOD
+003e37 38d8 .dw XT_DROP
+003e38 381f .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:
+003e39 ff03 .dw $ff03
+003e3a 696d
+003e3b 006e .db "min",0
+003e3c 3e31 .dw VE_HEAD
+ .set VE_HEAD = VE_MIN
+ XT_MIN:
+003e3d 3800 .dw DO_COLON
+ PFA_MIN:
+ .endif
+003e3e 3ec8 .dw XT_2DUP
+003e3f 3977 .dw XT_GREATER
+003e40 3835 .dw XT_DOCONDBRANCH
+003e41 3e43 DEST(PFA_MIN1)
+003e42 38c3 .dw XT_SWAP
+ PFA_MIN1:
+003e43 38d8 .dw XT_DROP
+003e44 381f .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:
+003e45 ff03 .dw $ff03
+003e46 616d
+003e47 0078 .db "max",0
+003e48 3e39 .dw VE_HEAD
+ .set VE_HEAD = VE_MAX
+ XT_MAX:
+003e49 3800 .dw DO_COLON
+ PFA_MAX:
+
+ .endif
+003e4a 3ec8 .dw XT_2DUP
+003e4b 396d .dw XT_LESS
+003e4c 3835 .dw XT_DOCONDBRANCH
+003e4d 3e4f DEST(PFA_MAX1)
+003e4e 38c3 .dw XT_SWAP
+ PFA_MAX1:
+003e4f 38d8 .dw XT_DROP
+003e50 381f .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:
+003e51 ff06 .dw $ff06
+003e52 6977
+003e53 6874
+003e54 6e69 .db "within"
+003e55 3e45 .dw VE_HEAD
+ .set VE_HEAD = VE_WITHIN
+ XT_WITHIN:
+003e56 3800 .dw DO_COLON
+ PFA_WITHIN:
+ .endif
+003e57 38ce .dw XT_OVER
+003e58 3992 .dw XT_MINUS
+003e59 38fe .dw XT_TO_R
+003e5a 3992 .dw XT_MINUS
+003e5b 38f5 .dw XT_R_FROM
+003e5c 395b .dw XT_ULESS
+003e5d 381f .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:
+003e5e ff0d .dw $ff0d
+003e5f 6873
+003e60 776f
+003e61 772d
+003e62 726f
+003e63 6c64
+003e64 7369
+003e65 0074 .db "show-wordlist",0
+003e66 3e51 .dw VE_HEAD
+ .set VE_HEAD = VE_SHOWWORDLIST
+ XT_SHOWWORDLIST:
+003e67 3800 .dw DO_COLON
+ PFA_SHOWWORDLIST:
+ .endif
+003e68 383c .dw XT_DOLITERAL
+003e69 3e6d .dw XT_SHOWWORD
+003e6a 38c3 .dw XT_SWAP
+003e6b 06da .dw XT_TRAVERSEWORDLIST
+003e6c 381f .dw XT_EXIT
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ XT_SHOWWORD:
+003e6d 3800 .dw DO_COLON
+ PFA_SHOWWORD:
+ .endif
+003e6e 06f5 .dw XT_NAME2STRING
+003e6f 0403 .dw XT_ITYPE
+003e70 3fad .dw XT_SPACE ; ( -- addr n)
+003e71 394a .dw XT_TRUE
+003e72 381f .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:
+003e73 ff05 .dw $ff05
+003e74 6f77
+003e75 6472
+003e76 0073 .db "words",0
+003e77 3e5e .dw VE_HEAD
+ .set VE_HEAD = VE_WORDS
+ XT_WORDS:
+003e78 3800 .dw DO_COLON
+ PFA_WORDS:
+ .endif
+003e79 383c .dw XT_DOLITERAL
+003e7a 004c .dw CFG_ORDERLISTLEN+2
+003e7b 3b5e .dw XT_FETCHE
+003e7c 3e67 .dw XT_SHOWWORDLIST
+003e7d 381f .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:
+003e7e 0002 .dw $0002
+003e7f 222e .db ".",$22
+003e80 3e73 .dw VE_HEAD
+ .set VE_HEAD = VE_DOTSTRING
+ XT_DOTSTRING:
+003e81 3800 .dw DO_COLON
+ PFA_DOTSTRING:
+ .endif
+003e82 3e89 .dw XT_SQUOTE
+003e83 075c .dw XT_COMPILE
+003e84 0403 .dw XT_ITYPE
+003e85 381f .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:
+003e86 0002 .dw $0002
+003e87 2273 .db "s",$22
+003e88 3e7e .dw VE_HEAD
+ .set VE_HEAD = VE_SQUOTE
+ XT_SQUOTE:
+003e89 3800 .dw DO_COLON
+ PFA_SQUOTE:
+ .endif
+003e8a 383c .dw XT_DOLITERAL
+003e8b 0022 .dw 34 ; 0x22
+003e8c 058e .dw XT_PARSE ; ( -- addr n)
+003e8d 3eb6 .dw XT_STATE
+003e8e 3878 .dw XT_FETCH
+003e8f 3835 .dw XT_DOCONDBRANCH
+003e90 3e92 DEST(PFA_SQUOTE1)
+003e91 0788 .dw XT_SLITERAL
+ PFA_SQUOTE1:
+003e92 381f .dw XT_EXIT
+ .include "words/fill.asm"
+
+ ; Memory
+ ; fill u bytes memory beginning at a-addr with character c
+ VE_FILL:
+003e93 ff04 .dw $ff04
+003e94 6966
+003e95 6c6c .db "fill"
+003e96 3e86 .dw VE_HEAD
+ .set VE_HEAD = VE_FILL
+ XT_FILL:
+003e97 3800 .dw DO_COLON
+ PFA_FILL:
+003e98 38e0 .dw XT_ROT
+003e99 38e0 .dw XT_ROT
+003e9a 38b8
+003e9b 3835 .dw XT_QDUP,XT_DOCONDBRANCH
+003e9c 3ea4 DEST(PFA_FILL2)
+003e9d 3f98 .dw XT_BOUNDS
+003e9e 3a9a .dw XT_DODO
+ PFA_FILL1:
+003e9f 38b0 .dw XT_DUP
+003ea0 3aab .dw XT_I
+003ea1 388c .dw XT_CSTORE ; ( -- c c-addr)
+003ea2 3ac8 .dw XT_DOLOOP
+003ea3 3e9f .dw PFA_FILL1
+ PFA_FILL2:
+003ea4 38d8 .dw XT_DROP
+003ea5 381f .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:
+003ea6 ff05 .dw $ff05
+003ea7 5f66
+003ea8 7063
+003ea9 0075 .db "f_cpu",0
+003eaa 3e93 .dw VE_HEAD
+ .set VE_HEAD = VE_F_CPU
+ XT_F_CPU:
+003eab 3800 .dw DO_COLON
+ PFA_F_CPU:
+ .endif
+003eac 383c .dw XT_DOLITERAL
+003ead 2400 .dw (F_CPU % 65536)
+003eae 383c .dw XT_DOLITERAL
+003eaf 00f4 .dw (F_CPU / 65536)
+003eb0 381f .dw XT_EXIT
+ .include "words/state.asm"
+
+ ; System Variable
+ ; system state
+ VE_STATE:
+003eb1 ff05 .dw $ff05
+003eb2 7473
+003eb3 7461
+003eb4 0065 .db "state",0
+003eb5 3ea6 .dw VE_HEAD
+ .set VE_HEAD = VE_STATE
+ XT_STATE:
+003eb6 3847 .dw PFA_DOVARIABLE
+ PFA_STATE:
+003eb7 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:
+003eb8 ff04 .dw $ff04
+003eb9 6162
+003eba 6573 .db "base"
+003ebb 3eb1 .dw VE_HEAD
+ .set VE_HEAD = VE_BASE
+ XT_BASE:
+003ebc 3857 .dw PFA_DOUSER
+ PFA_BASE:
+ .endif
+003ebd 000c .dw USER_BASE
+
+ .include "words/cells.asm"
+
+ ; Arithmetics
+ ; n2 is the size in address units of n1 cells
+ VE_CELLS:
+003ebe ff05 .dw $ff05
+003ebf 6563
+003ec0 6c6c
+003ec1 0073 .db "cells",0
+003ec2 3eb8 .dw VE_HEAD
+ .set VE_HEAD = VE_CELLS
+ XT_CELLS:
+003ec3 3a0b .dw PFA_2STAR
+
+ .include "words/2dup.asm"
+
+ ; Stack
+ ; Duplicate the 2 top elements
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_2DUP:
+003ec4 ff04 .dw $ff04
+003ec5 6432
+003ec6 7075 .db "2dup"
+003ec7 3ebe .dw VE_HEAD
+ .set VE_HEAD = VE_2DUP
+ XT_2DUP:
+003ec8 3800 .dw DO_COLON
+ PFA_2DUP:
+ .endif
+
+003ec9 38ce .dw XT_OVER
+003eca 38ce .dw XT_OVER
+003ecb 381f .dw XT_EXIT
+ .include "words/2drop.asm"
+
+ ; Stack
+ ; Remove the 2 top elements
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_2DROP:
+003ecc ff05 .dw $ff05
+003ecd 6432
+003ece 6f72
+003ecf 0070 .db "2drop",0
+003ed0 3ec4 .dw VE_HEAD
+ .set VE_HEAD = VE_2DROP
+ XT_2DROP:
+003ed1 3800 .dw DO_COLON
+ PFA_2DROP:
+ .endif
+003ed2 38d8 .dw XT_DROP
+003ed3 38d8 .dw XT_DROP
+003ed4 381f .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:
+003ed5 ff04 .dw $ff04
+003ed6 7574
+003ed7 6b63 .db "tuck"
+003ed8 3ecc .dw VE_HEAD
+ .set VE_HEAD = VE_TUCK
+ XT_TUCK:
+003ed9 3800 .dw DO_COLON
+ PFA_TUCK:
+ .endif
+003eda 38c3 .dw XT_SWAP
+003edb 38ce .dw XT_OVER
+003edc 381f .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:
+003edd ff03 .dw $ff03
+003ede 693e
+003edf 006e .db ">in",0
+003ee0 3ed5 .dw VE_HEAD
+ .set VE_HEAD = VE_TO_IN
+ XT_TO_IN:
+003ee1 3857 .dw PFA_DOUSER
+ PFA_TO_IN:
+ .endif
+003ee2 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:
+003ee3 ff03 .dw $ff03
+003ee4 6170
+003ee5 0064 .db "pad",0
+003ee6 3edd .dw VE_HEAD
+ .set VE_HEAD = VE_PAD
+ XT_PAD:
+003ee7 3800 .dw DO_COLON
+ PFA_PAD:
+ .endif
+003ee8 3f22 .dw XT_HERE
+003ee9 383c .dw XT_DOLITERAL
+003eea 0028 .dw 40
+003eeb 399c .dw XT_PLUS
+003eec 381f .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:
+003eed ff04 .dw $ff04
+003eee 6d65
+003eef 7469 .db "emit"
+003ef0 3ee3 .dw VE_HEAD
+ .set VE_HEAD = VE_EMIT
+ XT_EMIT:
+003ef1 3dfe .dw PFA_DODEFER1
+ PFA_EMIT:
+ .endif
+003ef2 000e .dw USER_EMIT
+003ef3 3dc7 .dw XT_UDEFERFETCH
+003ef4 3dd3 .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:
+003ef5 ff05 .dw $ff05
+003ef6 6d65
+003ef7 7469
+003ef8 003f .db "emit?",0
+003ef9 3eed .dw VE_HEAD
+ .set VE_HEAD = VE_EMITQ
+ XT_EMITQ:
+003efa 3dfe .dw PFA_DODEFER1
+ PFA_EMITQ:
+ .endif
+003efb 0010 .dw USER_EMITQ
+003efc 3dc7 .dw XT_UDEFERFETCH
+003efd 3dd3 .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:
+003efe ff03 .dw $ff03
+003eff 656b
+003f00 0079 .db "key",0
+003f01 3ef5 .dw VE_HEAD
+ .set VE_HEAD = VE_KEY
+ XT_KEY:
+003f02 3dfe .dw PFA_DODEFER1
+ PFA_KEY:
+ .endif
+003f03 0012 .dw USER_KEY
+003f04 3dc7 .dw XT_UDEFERFETCH
+003f05 3dd3 .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:
+003f06 ff04 .dw $ff04
+003f07 656b
+003f08 3f79 .db "key?"
+003f09 3efe .dw VE_HEAD
+ .set VE_HEAD = VE_KEYQ
+ XT_KEYQ:
+003f0a 3dfe .dw PFA_DODEFER1
+ PFA_KEYQ:
+ .endif
+003f0b 0014 .dw USER_KEYQ
+003f0c 3dc7 .dw XT_UDEFERFETCH
+003f0d 3dd3 .dw XT_UDEFERSTORE
+
+ .include "words/dp.asm"
+
+ ; System Value
+ ; address of the next free dictionary cell
+ VE_DP:
+003f0e ff02 .dw $ff02
+003f0f 7064 .db "dp"
+003f10 3f06 .dw VE_HEAD
+ .set VE_HEAD = VE_DP
+ XT_DP:
+003f11 386e .dw PFA_DOVALUE1
+ PFA_DP:
+003f12 0036 .dw CFG_DP
+003f13 3d9f .dw XT_EDEFERFETCH
+003f14 3da9 .dw XT_EDEFERSTORE
+ .include "words/ehere.asm"
+
+ ; System Value
+ ; address of the next free address in eeprom
+ VE_EHERE:
+003f15 ff05 .dw $ff05
+003f16 6865
+003f17 7265
+003f18 0065 .db "ehere",0
+003f19 3f0e .dw VE_HEAD
+ .set VE_HEAD = VE_EHERE
+ XT_EHERE:
+003f1a 386e .dw PFA_DOVALUE1
+ PFA_EHERE:
+003f1b 003a .dw EE_EHERE
+003f1c 3d9f .dw XT_EDEFERFETCH
+003f1d 3da9 .dw XT_EDEFERSTORE
+ .include "words/here.asm"
+
+ ; System Value
+ ; address of the next free data space (RAM) cell
+ VE_HERE:
+003f1e ff04 .dw $ff04
+003f1f 6568
+003f20 6572 .db "here"
+003f21 3f15 .dw VE_HEAD
+ .set VE_HEAD = VE_HERE
+ XT_HERE:
+003f22 386e .dw PFA_DOVALUE1
+ PFA_HERE:
+003f23 0038 .dw EE_HERE
+003f24 3d9f .dw XT_EDEFERFETCH
+003f25 3da9 .dw XT_EDEFERSTORE
+ .include "words/allot.asm"
+
+ ; System
+ ; allocate or release memory in RAM
+ VE_ALLOT:
+003f26 ff05 .dw $ff05
+003f27 6c61
+003f28 6f6c
+003f29 0074 .db "allot",0
+003f2a 3f1e .dw VE_HEAD
+ .set VE_HEAD = VE_ALLOT
+ XT_ALLOT:
+003f2b 3800 .dw DO_COLON
+ PFA_ALLOT:
+003f2c 3f22 .dw XT_HERE
+003f2d 399c .dw XT_PLUS
+003f2e 01bf .dw XT_DOTO
+003f2f 3f23 .dw PFA_HERE
+003f30 381f .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:
+003f31 ff03 .dw $ff03
+003f32 6962
+003f33 006e .db "bin",0
+003f34 3f26 .dw VE_HEAD
+ .set VE_HEAD = VE_BIN
+ XT_BIN:
+003f35 3800 .dw DO_COLON
+ PFA_BIN:
+ .endif
+003f36 3fea .dw XT_TWO
+003f37 3ebc .dw XT_BASE
+003f38 3880 .dw XT_STORE
+003f39 381f .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:
+003f3a ff07 .dw $ff07
+003f3b 6564
+003f3c 6963
+003f3d 616d
+003f3e 006c .db "decimal",0
+003f3f 3f31 .dw VE_HEAD
+ .set VE_HEAD = VE_DECIMAL
+ XT_DECIMAL:
+003f40 3800 .dw DO_COLON
+ PFA_DECIMAL:
+ .endif
+003f41 383c .dw XT_DOLITERAL
+003f42 000a .dw 10
+003f43 3ebc .dw XT_BASE
+003f44 3880 .dw XT_STORE
+003f45 381f .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:
+003f46 ff03 .dw $ff03
+003f47 6568
+003f48 0078 .db "hex",0
+003f49 3f3a .dw VE_HEAD
+ .set VE_HEAD = VE_HEX
+ XT_HEX:
+003f4a 3800 .dw DO_COLON
+ PFA_HEX:
+ .endif
+003f4b 383c .dw XT_DOLITERAL
+003f4c 0010 .dw 16
+003f4d 3ebc .dw XT_BASE
+003f4e 3880 .dw XT_STORE
+003f4f 381f .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:
+003f50 ff02 .dw $ff02
+003f51 6c62 .db "bl"
+003f52 3f46 .dw VE_HEAD
+ .set VE_HEAD = VE_BL
+ XT_BL:
+003f53 3847 .dw PFA_DOVARIABLE
+ PFA_BL:
+ .endif
+003f54 0020 .dw 32
+
+ .include "words/turnkey.asm"
+
+ ; System Value
+ ; Deferred action during startup/reset
+ VE_TURNKEY:
+003f55 ff07 .dw $ff07
+003f56 7574
+003f57 6e72
+003f58 656b
+003f59 0079 .db "turnkey",0
+003f5a 3f50 .dw VE_HEAD
+ .set VE_HEAD = VE_TURNKEY
+ XT_TURNKEY:
+003f5b 3dfe .dw PFA_DODEFER1
+ PFA_TURNKEY:
+003f5c 0042 .dw CFG_TURNKEY
+003f5d 3d9f .dw XT_EDEFERFETCH
+003f5e 3da9 .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:
+003f5f ff07 .dw $ff07
+003f60 6f74
+003f61 7075
+003f62 6570
+003f63 0072 .db "toupper",0
+003f64 3f55 .dw VE_HEAD
+ .set VE_HEAD = VE_TOUPPER
+ XT_TOUPPER:
+003f65 3800 .dw DO_COLON
+ PFA_TOUPPER:
+ .endif
+003f66 38b0 .dw XT_DUP
+003f67 383c .dw XT_DOLITERAL
+003f68 0061 .dw 'a'
+003f69 383c .dw XT_DOLITERAL
+003f6a 007b .dw 'z'+1
+003f6b 3e56 .dw XT_WITHIN
+003f6c 3835 .dw XT_DOCONDBRANCH
+003f6d 3f71 DEST(PFA_TOUPPER0)
+003f6e 383c .dw XT_DOLITERAL
+003f6f 00df .dw 223 ; inverse of 0x20: 0xdf
+003f70 3a12 .dw XT_AND
+ PFA_TOUPPER0:
+003f71 381f .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:
+003f72 ff07 .dw $ff07
+003f73 6f74
+003f74 6f6c
+003f75 6577
+003f76 0072 .db "tolower",0
+003f77 3f5f .dw VE_HEAD
+ .set VE_HEAD = VE_TOLOWER
+ XT_TOLOWER:
+003f78 3800 .dw DO_COLON
+ PFA_TOLOWER:
+ .endif
+003f79 38b0 .dw XT_DUP
+003f7a 383c .dw XT_DOLITERAL
+003f7b 0041 .dw 'A'
+003f7c 383c .dw XT_DOLITERAL
+003f7d 005b .dw 'Z'+1
+003f7e 3e56 .dw XT_WITHIN
+003f7f 3835 .dw XT_DOCONDBRANCH
+003f80 3f84 DEST(PFA_TOLOWER0)
+003f81 383c .dw XT_DOLITERAL
+003f82 0020 .dw 32
+003f83 3a1b .dw XT_OR
+ PFA_TOLOWER0:
+003f84 381f .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:
+003f85 ff06 .dw $ff06
+003f86 733f
+003f87 6174
+003f88 6b63 .db "?stack"
+003f89 3f72 .dw VE_HEAD
+ .set VE_HEAD = VE_QSTACK
+ XT_QSTACK:
+003f8a 3800 .dw DO_COLON
+ PFA_QSTACK:
+ .endif
+003f8b 05ed .dw XT_DEPTH
+003f8c 3920 .dw XT_ZEROLESS
+003f8d 3835 .dw XT_DOCONDBRANCH
+003f8e 3f92 DEST(PFA_QSTACK1)
+003f8f 383c .dw XT_DOLITERAL
+003f90 fffc .dw -4
+003f91 3d85 .dw XT_THROW
+ PFA_QSTACK1:
+003f92 381f .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:
+003f93 ff06 .dw $ff06
+003f94 6f62
+003f95 6e75
+003f96 7364 .db "bounds"
+003f97 3f85 .dw VE_HEAD
+ .set VE_HEAD = VE_BOUNDS
+ XT_BOUNDS:
+003f98 3800 .dw DO_COLON
+ PFA_BOUNDS:
+ .endif
+003f99 38ce .dw XT_OVER
+003f9a 399c .dw XT_PLUS
+003f9b 38c3 .dw XT_SWAP
+003f9c 381f .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:
+003f9d ff02 .dw 0xff02
+003f9e 7263 .db "cr"
+003f9f 3f93 .dw VE_HEAD
+ .set VE_HEAD = VE_CR
+ XT_CR:
+003fa0 3800 .dw DO_COLON
+ PFA_CR:
+ .endif
+
+003fa1 383c .dw XT_DOLITERAL
+003fa2 000d .dw 13
+003fa3 3ef1 .dw XT_EMIT
+003fa4 383c .dw XT_DOLITERAL
+003fa5 000a .dw 10
+003fa6 3ef1 .dw XT_EMIT
+003fa7 381f .dw XT_EXIT
+ .include "words/space.asm"
+
+ ; Character IO
+ ; emits a space (bl)
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_SPACE:
+003fa8 ff05 .dw $ff05
+003fa9 7073
+003faa 6361
+003fab 0065 .db "space",0
+003fac 3f9d .dw VE_HEAD
+ .set VE_HEAD = VE_SPACE
+ XT_SPACE:
+003fad 3800 .dw DO_COLON
+ PFA_SPACE:
+ .endif
+003fae 3f53 .dw XT_BL
+003faf 3ef1 .dw XT_EMIT
+003fb0 381f .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:
+003fb1 ff06 .dw $ff06
+003fb2 7073
+003fb3 6361
+003fb4 7365 .db "spaces"
+003fb5 3fa8 .dw VE_HEAD
+ .set VE_HEAD = VE_SPACES
+ XT_SPACES:
+003fb6 3800 .dw DO_COLON
+ PFA_SPACES:
+
+ .endif
+ ;C SPACES n -- output n spaces
+ ; BEGIN DUP 0> WHILE SPACE 1- REPEAT DROP ;
+003fb7 3953
+003fb8 3e49 .DW XT_ZERO, XT_MAX
+003fb9 38b0
+003fba 3835 SPCS1: .DW XT_DUP,XT_DOCONDBRANCH
+003fbb 3fc0 DEST(SPCS2)
+003fbc 3fad
+003fbd 3a34
+003fbe 382e .DW XT_SPACE,XT_1MINUS,XT_DOBRANCH
+003fbf 3fb9 DEST(SPCS1)
+003fc0 38d8
+003fc1 381f 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:
+003fc2 ff03 .dw $ff03
+003fc3 3e73
+003fc4 0064 .db "s>d",0
+003fc5 3fb1 .dw VE_HEAD
+ .set VE_HEAD = VE_S2D
+ XT_S2D:
+003fc6 3800 .dw DO_COLON
+ PFA_S2D:
+ .endif
+003fc7 38b0 .dw XT_DUP
+003fc8 3920 .dw XT_ZEROLESS
+003fc9 381f .dw XT_EXIT
+ .include "words/to-body.asm"
+
+ ; Core
+ ; get body from XT
+ VE_TO_BODY:
+003fca ff05 .dw $ff05
+003fcb 623e
+003fcc 646f
+003fcd 0079 .db ">body",0
+003fce 3fc2 .dw VE_HEAD
+ .set VE_HEAD = VE_TO_BODY
+ XT_TO_BODY:
+003fcf 3a2f .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:
+003fd0 0008 .dw $0008
+003fd1 6c32
+003fd2 7469
+003fd3 7265
+003fd4 6c61 .db "2literal"
+003fd5 3fca .dw VE_HEAD
+ .set VE_HEAD = VE_2LITERAL
+ XT_2LITERAL:
+003fd6 3800 .dw DO_COLON
+ PFA_2LITERAL:
+ .endif
+003fd7 38c3 .dw XT_SWAP
+003fd8 077d .dw XT_LITERAL
+003fd9 077d .dw XT_LITERAL
+003fda 381f .dw XT_EXIT
+ .include "words/equal.asm"
+
+ ; Compare
+ ; compares two values for equality
+ VE_EQUAL:
+003fdb ff01 .dw $ff01
+003fdc 003d .db "=",0
+003fdd 3fd0 .dw VE_HEAD
+ .set VE_HEAD = VE_EQUAL
+ XT_EQUAL:
+003fde 3800 .dw DO_COLON
+ PFA_EQUAL:
+003fdf 3992 .dw XT_MINUS
+003fe0 3919 .dw XT_ZEROEQUAL
+003fe1 381f .dw XT_EXIT
+ .include "words/num-constants.asm"
+
+ .endif
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_ONE:
+003fe2 ff01 .dw $ff01
+003fe3 0031 .db "1",0
+003fe4 3fdb .dw VE_HEAD
+ .set VE_HEAD = VE_ONE
+ XT_ONE:
+003fe5 3847 .dw PFA_DOVARIABLE
+ PFA_ONE:
+ .endif
+003fe6 0001 .DW 1
+
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_TWO:
+003fe7 ff01 .dw $ff01
+003fe8 0032 .db "2",0
+003fe9 3fe2 .dw VE_HEAD
+ .set VE_HEAD = VE_TWO
+ XT_TWO:
+003fea 3847 .dw PFA_DOVARIABLE
+ PFA_TWO:
+ .endif
+003feb 0002 .DW 2
+ .if cpu_msp430==1
+ .endif
+
+ .if cpu_avr8==1
+ VE_MINUSONE:
+003fec ff02 .dw $ff02
+003fed 312d .db "-1"
+003fee 3fe7 .dw VE_HEAD
+ .set VE_HEAD = VE_MINUSONE
+ XT_MINUSONE:
+003fef 3847 .dw PFA_DOVARIABLE
+ PFA_MINUSONE:
+ .endif
+003ff0 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 ba 0a 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 ac 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 ec 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 7d 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 c8 3c .dw XT_DEFAULT_PROMPTOK
+000088 e7 3c .dw XT_DEFAULT_PROMPTERROR
+00008a d7 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 : 9 r3 : 12 r4 : 4 r5 : 1 r6 : 0 r7 : 0
+r8 : 0 r9 : 0 r10: 1 r11: 6 r12: 0 r13: 0 r14: 22 r15: 20
+r16: 80 r17: 61 r18: 52 r19: 37 r20: 13 r21: 11 r22: 11 r23: 3
+r24: 193 r25: 136 r26: 28 r27: 17 r28: 7 r29: 4 r30: 85 r31: 47
+x : 4 y : 205 z : 48
+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 : 20 brpl : 0 brsh : 0 brtc : 0 brts : 0 brvc : 0
+brvs : 2 bset : 0 bst : 0 call : 2 cbi : 7 cbr : 0
+clc : 2 clh : 0 cli : 7 cln : 0 clr : 13 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 : 18 inc : 3 jmp : 9
+ld : 136 ldd : 4 ldi : 41 lds : 1 lpm : 16 lsl : 14
+lsr : 2 mov : 16 movw : 65 mul : 5 muls : 1 mulsu : 2
+neg : 0 nop : 0 or : 9 ori : 2 out : 18 pop : 45
+push : 39 rcall : 38 ret : 6 reti : 1 rjmp : 103 rol : 23
+ror : 6 sbc : 9 sbci : 3 sbi : 8 sbic : 3 sbis : 0
+sbiw : 14 sbr : 0 sbrc : 5 sbrs : 4 sec : 1 seh : 0
+sei : 1 sen : 0 ser : 4 ses : 0 set : 0 sev : 0
+sez : 0 sleep : 0 spm : 2 st : 76 std : 8 sts : 1
+sub : 6 subi : 3 swap : 0 tst : 0 wdr : 0
+Instructions used: 71 out of 113 (62.8%)
+
+"ATmega328P" memory use summary [bytes]:
+Segment Begin End Code Data Used Size Use%
+---------------------------------------------------------------
+[.cseg] 0x000000 0x007fe2 1958 11618 13576 32768 41.4%
+[.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/arduino/uno.map b/amforth-6.5/appl/arduino/uno.map
new file mode 100644
index 0000000..b3bd846
--- /dev/null
+++ b/amforth-6.5/appl/arduino/uno.map
@@ -0,0 +1,2030 @@
+
+AVRASM ver. 2.1.52 uno.asm Sun Apr 30 20:10:12 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 0000000a
+SET VE_HEAD 00003fec
+SET VE_ENVHEAD 000002ff
+SET AMFORTH_RO_SEG 00003800
+EQU F_CPU 00f42400
+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 00003804
+CSEG VE_ISR_RX 00000054
+CSEG XT_ISR_RX 00000059
+CSEG DO_COLON 00003800
+CSEG usart_rx_isr 0000005a
+CSEG XT_DOLITERAL 0000383c
+CSEG XT_CFETCH 00003897
+CSEG XT_DUP 000038b0
+CSEG XT_EQUAL 00003fde
+CSEG XT_DOCONDBRANCH 00003835
+CSEG usart_rx_isr1 00000064
+CSEG XT_COLD 00003d37
+CSEG XT_EXIT 0000381f
+CSEG XT_USART_INIT_RX_BUFFER 00000066
+CSEG PFA_USART_INIT_RX_BUFFER 00000067
+CSEG XT_INTSTORE 00003ca4
+CSEG XT_ZERO 00003953
+CSEG XT_FILL 00003e97
+CSEG VE_RX_BUFFER 00000073
+CSEG XT_RX_BUFFER 00000078
+CSEG PFA_RX_BUFFER 00000079
+CSEG XT_RXQ_BUFFER 00000093
+CSEG XT_PLUS 0000399c
+CSEG XT_SWAP 000038c3
+CSEG XT_1PLUS 00003a2e
+CSEG XT_AND 00003a12
+CSEG XT_CSTORE 0000388c
+CSEG VE_RXQ_BUFFER 0000008d
+CSEG PFA_RXQ_BUFFER 00000094
+CSEG XT_PAUSE 00003d2f
+CSEG XT_NOTEQUAL 00003912
+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 0000386e
+CSEG PFA_UBRR 000000bf
+ESEG EE_UBRRVAL 0000008c
+CSEG XT_EDEFERFETCH 00003d9f
+CSEG XT_EDEFERSTORE 00003da9
+CSEG VE_USART 000000c2
+CSEG XT_USART 000000c7
+CSEG PFA_USART 000000c8
+CSEG XT_BYTESWAP 00003af8
+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 00000ffe
+SET corepc 00000129
+CSEG PFA_COLD 00003d38
+ESEG intvec 00000000
+DSEG intcnt 00000112
+CSEG VE_MPLUS 00000140
+CSEG XT_MPLUS 00000143
+CSEG PFA_MPLUS 00000144
+CSEG XT_S2D 00003fc6
+CSEG XT_DPLUS 00003c14
+CSEG VE_UDSTAR 00000147
+CSEG XT_UDSTAR 0000014b
+CSEG PFA_UDSTAR 0000014c
+CSEG XT_TO_R 000038fe
+CSEG XT_UMSTAR 000039df
+CSEG XT_DROP 000038d8
+CSEG XT_R_FROM 000038f5
+CSEG XT_ROT 000038e0
+CSEG VE_UMAX 00000156
+CSEG XT_UMAX 0000015a
+CSEG PFA_UMAX 0000015b
+CSEG XT_2DUP 00003ec8
+CSEG XT_ULESS 0000395b
+CSEG UMAX1 00000160
+CSEG VE_UMIN 00000162
+CSEG XT_UMIN 00000166
+CSEG PFA_UMIN 00000167
+CSEG XT_UGREATER 00003966
+CSEG UMIN1 0000016c
+CSEG XT_IMMEDIATEQ 0000016e
+CSEG PFA_IMMEDIATEQ 0000016f
+CSEG XT_ZEROEQUAL 00003919
+CSEG IMMEDIATEQ1 00000177
+CSEG XT_ONE 00003fe5
+CSEG XT_TRUE 0000394a
+CSEG VE_NAME2FLAGS 00000179
+CSEG XT_NAME2FLAGS 00000180
+CSEG PFA_NAME2FLAGS 00000181
+CSEG XT_FETCHI 00003bca
+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 00003fad
+CSEG XT_BASE 00003ebc
+CSEG XT_FETCH 00003878
+CSEG XT_ENV_FORTHVERSION 000002e8
+CSEG XT_DECIMAL 00003f40
+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 00003880
+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 00003a8c
+CSEG XT_HERE 00003f22
+CSEG XT_MINUS 00003992
+CSEG VE_TO 000001b1
+CSEG XT_TO 000001b4
+CSEG PFA_TO 000001b5
+CSEG XT_TICK 00000448
+CSEG XT_TO_BODY 00003fcf
+CSEG XT_STATE 00003eb6
+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 00003829
+CSEG VE_ICELLPLUS 000001cb
+CSEG PFA_ICELLPLUS 000001d2
+CSEG VE_ICOMPARE 000001d4
+CSEG XT_ICOMPARE 000001da
+CSEG PFA_ICOMPARE 000001db
+CSEG XT_OVER 000038ce
+CSEG PFA_ICOMPARE_SAMELEN 000001e5
+CSEG XT_2DROP 00003ed1
+CSEG XT_QDOCHECK 00000826
+CSEG PFA_ICOMPARE_DONE 00000208
+CSEG XT_DODO 00003a9a
+CSEG PFA_ICOMPARE_LOOP 000001eb
+CSEG PFA_ICOMPARE_LASTCELL 000001f9
+CSEG PFA_ICOMPARE_NEXTLOOP 00000200
+CSEG XT_UNLOOP 00003ad3
+CSEG XT_CELLPLUS 00003c8f
+CSEG XT_DOPLUSLOOP 00003ab9
+CSEG VE_STAR 0000020b
+CSEG XT_STAR 0000020e
+CSEG PFA_STAR 0000020f
+CSEG XT_MSTAR 000039a5
+CSEG VE_J 00000212
+CSEG XT_J 00000215
+CSEG PFA_J 00000216
+CSEG XT_RP_FETCH 00003a75
+CSEG VE_DABS 00000222
+CSEG XT_DABS 00000226
+CSEG PFA_DABS 00000227
+CSEG XT_ZEROLESS 00003920
+CSEG PFA_DABS1 0000022c
+CSEG XT_DNEGATE 00000233
+CSEG VE_DNEGATE 0000022d
+CSEG PFA_DNEGATE 00000234
+CSEG XT_DINVERT 00003c3a
+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 00003ee1
+CSEG VE_SOURCETIB 00000270
+CSEG XT_SOURCETIB 00000277
+CSEG PFA_SOURCETIB 00000278
+CSEG VE_TIB 0000027c
+CSEG PFA_DOVARIABLE 00003847
+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 00003b5e
+CSEG XT_DOLOOP 00003ac8
+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 00003b01
+CSEG XT_2SLASH 00003a03
+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 00003ee7
+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 00003a34
+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 0000396d
+CSEG PFA_SHARP1 00000337
+CSEG VE_SHARP_S 0000033c
+CSEG PFA_SHARP_S 00000340
+CSEG NUMS1 00000340
+CSEG XT_OR 00003a1b
+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 00003ed9
+CSEG XT_SPACES 00003fb6
+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 00003907
+CSEG XT_UMSLASHMOD 000039c1
+CSEG VE_DIGITQ 000003b1
+CSEG XT_DIGITQ 000003b6
+CSEG PFA_DIGITQ 000003b7
+CSEG XT_TOUPPER 00003f65
+CSEG XT_GREATER 00003977
+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 00003a0a
+CSEG PFA_SCOMMA2 000003f5
+CSEG PFA_SCOMMA1 000003ef
+CSEG XT_GREATERZERO 00003927
+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 00003ef1
+CSEG VE_ICOUNT 0000042a
+CSEG PFA_ICOUNT 00000430
+CSEG VE_TYPE 00000435
+CSEG PFA_TYPE 0000043a
+CSEG XT_BOUNDS 00003f98
+CSEG PFA_TYPE2 00000444
+CSEG PFA_TYPE1 0000043f
+CSEG XT_I 00003aab
+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 00003d85
+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 0000382e
+CSEG VE_CSCAN 00000473
+CSEG XT_CSCAN 00000478
+CSEG PFA_CSCAN 00000479
+CSEG PFA_CSCAN1 0000047b
+CSEG PFA_CSCAN2 0000048d
+CSEG XT_NIP 000038ef
+CSEG VE_ACCEPT 00000493
+CSEG PFA_ACCEPT 00000499
+CSEG ACC1 0000049d
+CSEG XT_KEY 00003f02
+CSEG XT_CRLFQ 000004d9
+CSEG ACC5 000004cb
+CSEG ACC3 000004bb
+CSEG ACC6 000004b9
+CSEG XT_BS 000004d1
+CSEG ACC4 000004c9
+CSEG XT_BL 00003f53
+CSEG PFA_ACCEPT6 000004c2
+CSEG XT_CR 00003fa0
+CSEG VE_REFILL 000004e4
+CSEG XT_REFILL 000004e9
+CSEG PFA_DODEFER1 00003dfe
+CSEG PFA_REFILL 000004ea
+CSEG XT_UDEFERFETCH 00003dc7
+CSEG XT_UDEFERSTORE 00003dd3
+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 00003b1d
+CSEG XT_2R_FROM 00003b2c
+CSEG XT_TO_NUMBER 00000570
+CSEG XT_QDUP 000038b8
+CSEG PFA_NUMBER1 00000534
+CSEG PFA_NUMBER2 0000052b
+CSEG PFA_NUMBER6 0000052c
+CSEG PFA_NUMBER3 00000528
+CSEG XT_TWO 00003fea
+CSEG PFA_NUMBER5 0000053a
+CSEG PFA_NUMBER4 00000539
+CSEG XT_NEGATE 00003e26
+CSEG PFA_QSIGN 00000540
+CSEG PFA_NUMBERSIGN_DONE 0000054b
+CSEG XT_BASES 0000054d
+CSEG PFA_DOCONSTANT 00003851
+CSEG PFA_SET_BASE 00000553
+CSEG XT_WITHIN 00003e56
+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 00003a64
+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 00003857
+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 00003f8a
+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 00003fd6
+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 00003f11
+CSEG XT_STOREI 00003b72
+CSEG PFA_DP 00003f12
+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 000039fc
+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 00003b3a
+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 00003f2b
+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 00003e89
+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 00003ec3
+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_SET_CURRENT 00000a1c
+CSEG XT_SET_CURRENT 00000a24
+CSEG PFA_SET_CURRENT 00000a25
+CSEG VE_WORDLIST 00000a29
+CSEG XT_WORDLIST 00000a2f
+CSEG PFA_WORDLIST 00000a30
+CSEG XT_EHERE 00003f1a
+CSEG PFA_EHERE 00003f1b
+CSEG VE_FORTHWORDLIST 00000a39
+CSEG XT_FORTHWORDLIST 00000a42
+CSEG PFA_FORTHWORDLIST 00000a43
+ESEG CFG_FORTHWORDLIST 00000048
+CSEG VE_SET_ORDER 00000a44
+CSEG XT_SET_ORDER 00000a4b
+CSEG PFA_SET_ORDER 00000a4c
+CSEG VE_SET_RECOGNIZERS 00000a50
+CSEG XT_SET_RECOGNIZERS 00000a5a
+CSEG PFA_SET_RECOGNIZERS 00000a5b
+ESEG CFG_RECOGNIZERLISTLEN 0000005c
+CSEG VE_GET_RECOGNIZERS 00000a5f
+CSEG XT_GET_RECOGNIZERS 00000a69
+CSEG PFA_GET_RECOGNIZERS 00000a6a
+CSEG VE_CODE 00000a6e
+CSEG XT_CODE 00000a72
+CSEG PFA_CODE 00000a73
+CSEG VE_ENDCODE 00000a79
+CSEG XT_ENDCODE 00000a7f
+CSEG PFA_ENDCODE 00000a80
+CSEG VE_MARKER 00000a85
+CSEG XT_MARKER 00000a8b
+CSEG PFA_MARKER 00000a8c
+ESEG EE_MARKER 00000068
+CSEG VE_POSTPONE 00000a8f
+CSEG XT_POSTPONE 00000a95
+CSEG PFA_POSTPONE 00000a96
+CSEG VE_APPLTURNKEY 00000aa4
+CSEG XT_APPLTURNKEY 00000aac
+CSEG PFA_APPLTURNKEY 00000aad
+CSEG XT_INTON 00003c96
+SET DPSTART 00000aba
+CSEG DO_INTERRUPT 00003813
+CSEG DO_EXECUTE 0000380c
+CSEG XT_ISREXEC 00003cbf
+CSEG VE_EXIT 0000381b
+CSEG PFA_EXIT 00003820
+CSEG VE_EXECUTE 00003823
+CSEG PFA_EXECUTE 0000382a
+CSEG PFA_DOBRANCH 0000382f
+CSEG PFA_DOCONDBRANCH 00003836
+CSEG PFA_DOLITERAL 0000383d
+CSEG XT_DOVARIABLE 00003846
+CSEG XT_DOCONSTANT 00003850
+CSEG XT_DOUSER 00003856
+CSEG VE_DOVALUE 00003862
+CSEG XT_DOVALUE 00003868
+CSEG PFA_DOVALUE 00003869
+CSEG VE_FETCH 00003875
+CSEG PFA_FETCH 00003879
+CSEG PFA_FETCHRAM 00003879
+CSEG VE_STORE 0000387d
+CSEG PFA_STORE 00003881
+CSEG PFA_STORERAM 00003881
+CSEG VE_CSTORE 00003889
+CSEG PFA_CSTORE 0000388d
+CSEG VE_CFETCH 00003894
+CSEG PFA_CFETCH 00003898
+CSEG VE_FETCHU 0000389c
+CSEG XT_FETCHU 0000389f
+CSEG PFA_FETCHU 000038a0
+CSEG VE_STOREU 000038a4
+CSEG XT_STOREU 000038a7
+CSEG PFA_STOREU 000038a8
+CSEG VE_DUP 000038ac
+CSEG PFA_DUP 000038b1
+CSEG VE_QDUP 000038b4
+CSEG PFA_QDUP 000038b9
+CSEG PFA_QDUP1 000038be
+CSEG VE_SWAP 000038bf
+CSEG PFA_SWAP 000038c4
+CSEG VE_OVER 000038ca
+CSEG PFA_OVER 000038cf
+CSEG VE_DROP 000038d4
+CSEG PFA_DROP 000038d9
+CSEG VE_ROT 000038dc
+CSEG PFA_ROT 000038e1
+CSEG VE_NIP 000038eb
+CSEG PFA_NIP 000038f0
+CSEG VE_R_FROM 000038f2
+CSEG PFA_R_FROM 000038f6
+CSEG VE_TO_R 000038fb
+CSEG PFA_TO_R 000038ff
+CSEG VE_R_FETCH 00003904
+CSEG PFA_R_FETCH 00003908
+CSEG VE_NOTEQUAL 0000390f
+CSEG PFA_NOTEQUAL 00003913
+CSEG VE_ZEROEQUAL 00003916
+CSEG PFA_ZEROEQUAL 0000391a
+CSEG PFA_ZERO1 00003956
+CSEG PFA_TRUE1 0000394d
+CSEG VE_ZEROLESS 0000391d
+CSEG PFA_ZEROLESS 00003921
+CSEG VE_GREATERZERO 00003924
+CSEG PFA_GREATERZERO 00003928
+CSEG VE_DGREATERZERO 0000392d
+CSEG XT_DGREATERZERO 00003931
+CSEG PFA_DGREATERZERO 00003932
+CSEG VE_DXT_ZEROLESS 0000393b
+CSEG XT_DXT_ZEROLESS 0000393f
+CSEG PFA_DXT_ZEROLESS 00003940
+CSEG VE_TRUE 00003946
+CSEG PFA_TRUE 0000394b
+CSEG VE_ZERO 00003950
+CSEG PFA_ZERO 00003954
+CSEG VE_ULESS 00003958
+CSEG PFA_ULESS 0000395c
+CSEG VE_UGREATER 00003963
+CSEG PFA_UGREATER 00003967
+CSEG VE_LESS 0000396a
+CSEG PFA_LESS 0000396e
+CSEG PFA_LESSDONE 00003972
+CSEG VE_GREATER 00003974
+CSEG PFA_GREATER 00003978
+CSEG PFA_GREATERDONE 0000397c
+CSEG VE_LOG2 0000397f
+CSEG XT_LOG2 00003983
+CSEG PFA_LOG2 00003984
+CSEG PFA_LOG2_1 00003987
+CSEG PFA_LOG2_2 0000398d
+CSEG VE_MINUS 0000398f
+CSEG PFA_MINUS 00003993
+CSEG VE_PLUS 00003999
+CSEG PFA_PLUS 0000399d
+CSEG VE_MSTAR 000039a2
+CSEG PFA_MSTAR 000039a6
+CSEG VE_UMSLASHMOD 000039bc
+CSEG PFA_UMSLASHMOD 000039c2
+CSEG PFA_UMSLASHMODmod 000039c7
+CSEG PFA_UMSLASHMODmod_loop 000039c8
+CSEG PFA_UMSLASHMODmod_loop_control 000039d5
+CSEG PFA_UMSLASHMODmod_subtract 000039d2
+CSEG PFA_UMSLASHMODmod_done 000039d7
+CSEG VE_UMSTAR 000039db
+CSEG PFA_UMSTAR 000039e0
+CSEG VE_INVERT 000039f7
+CSEG PFA_INVERT 000039fd
+CSEG VE_2SLASH 00003a00
+CSEG PFA_2SLASH 00003a04
+CSEG VE_2STAR 00003a07
+CSEG PFA_2STAR 00003a0b
+CSEG VE_AND 00003a0e
+CSEG PFA_AND 00003a13
+CSEG VE_OR 00003a18
+CSEG PFA_OR 00003a1c
+CSEG VE_XOR 00003a21
+CSEG XT_XOR 00003a25
+CSEG PFA_XOR 00003a26
+CSEG VE_1PLUS 00003a2b
+CSEG PFA_1PLUS 00003a2f
+CSEG VE_1MINUS 00003a31
+CSEG PFA_1MINUS 00003a35
+CSEG VE_QNEGATE 00003a37
+CSEG XT_QNEGATE 00003a3d
+CSEG PFA_QNEGATE 00003a3e
+CSEG QNEG1 00003a42
+CSEG VE_LSHIFT 00003a43
+CSEG XT_LSHIFT 00003a48
+CSEG PFA_LSHIFT 00003a49
+CSEG PFA_LSHIFT1 00003a4c
+CSEG PFA_LSHIFT2 00003a51
+CSEG VE_RSHIFT 00003a52
+CSEG XT_RSHIFT 00003a57
+CSEG PFA_RSHIFT 00003a58
+CSEG PFA_RSHIFT1 00003a5b
+CSEG PFA_RSHIFT2 00003a60
+CSEG VE_PLUSSTORE 00003a61
+CSEG PFA_PLUSSTORE 00003a65
+CSEG VE_RP_FETCH 00003a71
+CSEG PFA_RP_FETCH 00003a76
+CSEG VE_RP_STORE 00003a7b
+CSEG XT_RP_STORE 00003a7f
+CSEG PFA_RP_STORE 00003a80
+CSEG VE_SP_FETCH 00003a88
+CSEG PFA_SP_FETCH 00003a8d
+CSEG VE_SP_STORE 00003a91
+CSEG XT_SP_STORE 00003a95
+CSEG PFA_SP_STORE 00003a96
+CSEG PFA_DODO 00003a9b
+CSEG PFA_DODO1 00003a9d
+CSEG VE_I 00003aa8
+CSEG PFA_I 00003aac
+CSEG PFA_DOPLUSLOOP 00003aba
+CSEG PFA_DOPLUSLOOP_LEAVE 00003ac4
+CSEG PFA_DOPLUSLOOP_NEXT 00003ac1
+CSEG PFA_DOLOOP 00003ac9
+CSEG VE_UNLOOP 00003ace
+CSEG PFA_UNLOOP 00003ad4
+CSEG VE_CMOVE_G 00003ad9
+CSEG XT_CMOVE_G 00003ade
+CSEG PFA_CMOVE_G 00003adf
+CSEG PFA_CMOVE_G1 00003af0
+CSEG PFA_CMOVE_G2 00003aec
+CSEG VE_BYTESWAP 00003af5
+CSEG PFA_BYTESWAP 00003af9
+CSEG VE_UP_FETCH 00003afd
+CSEG PFA_UP_FETCH 00003b02
+CSEG VE_UP_STORE 00003b06
+CSEG XT_UP_STORE 00003b0a
+CSEG PFA_UP_STORE 00003b0b
+CSEG VE_1MS 00003b0f
+CSEG XT_1MS 00003b13
+CSEG PFA_1MS 00003b14
+CSEG VE_2TO_R 00003b19
+CSEG PFA_2TO_R 00003b1e
+CSEG VE_2R_FROM 00003b28
+CSEG PFA_2R_FROM 00003b2d
+CSEG VE_STOREE 00003b37
+CSEG PFA_STOREE 00003b3b
+CSEG PFA_STOREE0 00003b3b
+CSEG PFA_FETCHE2 00003b69
+CSEG PFA_STOREE3 00003b45
+CSEG PFA_STOREE1 00003b50
+CSEG PFA_STOREE4 00003b4c
+CSEG PFA_STOREE2 00003b52
+CSEG VE_FETCHE 00003b5b
+CSEG PFA_FETCHE 00003b5f
+CSEG PFA_FETCHE1 00003b5f
+CSEG VE_STOREI 00003b6f
+CSEG PFA_STOREI 00003b73
+ESEG EE_STOREI 00000066
+CSEG VE_DO_STOREI_NRWW 00003b76
+CSEG XT_DO_STOREI 00003b7d
+CSEG PFA_DO_STOREI_NRWW 00003b7e
+CSEG DO_STOREI_atmega 00003b92
+CSEG pageload 00003ba3
+CSEG DO_STOREI_writepage 00003b9c
+CSEG dospm 00003bbc
+EQU pagemask ffffffc0
+CSEG pageload_loop 00003ba9
+CSEG pageload_newdata 00003bb4
+CSEG pageload_cont 00003bb6
+CSEG pageload_done 00003bbb
+CSEG dospm_wait_ee 00003bbc
+CSEG dospm_wait_spm 00003bbe
+CSEG VE_FETCHI 00003bc7
+CSEG PFA_FETCHI 00003bcb
+CSEG VE_N_TO_R 00003bd1
+CSEG XT_N_TO_R 00003bd5
+CSEG PFA_N_TO_R 00003bd6
+CSEG PFA_N_TO_R1 00003bd8
+CSEG VE_N_R_FROM 00003be3
+CSEG XT_N_R_FROM 00003be7
+CSEG PFA_N_R_FROM 00003be8
+CSEG PFA_N_R_FROM1 00003bed
+CSEG VE_D2STAR 00003bf5
+CSEG XT_D2STAR 00003bf9
+CSEG PFA_D2STAR 00003bfa
+CSEG VE_D2SLASH 00003c03
+CSEG XT_D2SLASH 00003c07
+CSEG PFA_D2SLASH 00003c08
+CSEG VE_DPLUS 00003c11
+CSEG PFA_DPLUS 00003c15
+CSEG VE_DMINUS 00003c22
+CSEG XT_DMINUS 00003c25
+CSEG PFA_DMINUS 00003c26
+CSEG VE_DINVERT 00003c34
+CSEG PFA_DINVERT 00003c3b
+CSEG VE_SLASHMOD 00003c44
+CSEG XT_SLASHMOD 00003c48
+CSEG PFA_SLASHMOD 00003c49
+CSEG PFA_SLASHMOD_1 00003c54
+CSEG PFA_SLASHMOD_2 00003c5a
+CSEG PFA_SLASHMOD_3 00003c5d
+CSEG PFA_SLASHMOD_5 00003c68
+CSEG PFA_SLASHMOD_4 00003c67
+CSEG PFA_SLASHMODmod_done 00003c73
+CSEG PFA_SLASHMOD_6 00003c71
+CSEG VE_ABS 00003c77
+CSEG XT_ABS 00003c7b
+CSEG PFA_ABS 00003c7c
+CSEG VE_PICK 00003c7f
+CSEG XT_PICK 00003c83
+CSEG PFA_PICK 00003c84
+CSEG VE_CELLPLUS 00003c8a
+CSEG PFA_CELLPLUS 00003c90
+CSEG VE_INTON 00003c92
+CSEG PFA_INTON 00003c97
+CSEG VE_INTOFF 00003c99
+CSEG XT_INTOFF 00003c9d
+CSEG PFA_INTOFF 00003c9e
+CSEG VE_INTSTORE 00003ca0
+CSEG PFA_INTSTORE 00003ca5
+CSEG VE_INTFETCH 00003caa
+CSEG XT_INTFETCH 00003cae
+CSEG PFA_INTFETCH 00003caf
+CSEG VE_INTTRAP 00003cb4
+CSEG XT_INTTRAP 00003cba
+CSEG PFA_INTTRAP 00003cbb
+CSEG PFA_ISREXEC 00003cc0
+CSEG XT_ISREND 00003cc4
+CSEG PFA_ISREND 00003cc5
+CSEG PFA_ISREND1 00003cc7
+CSEG XT_DEFAULT_PROMPTOK 00003cc8
+CSEG PFA_DEFAULT_PROMPTOK 00003cc9
+CSEG VE_PROMPTOK 00003ccf
+CSEG XT_PROMPTOK 00003cd3
+CSEG PFA_PROMPTOK 00003cd4
+CSEG XT_DEFAULT_PROMPTREADY 00003cd7
+CSEG PFA_DEFAULT_PROMPTREADY 00003cd8
+CSEG VE_PROMPTREADY 00003cde
+CSEG XT_PROMPTREADY 00003ce3
+CSEG PFA_PROMPTREADY 00003ce4
+CSEG XT_DEFAULT_PROMPTERROR 00003ce7
+CSEG PFA_DEFAULT_PROMPTERROR 00003ce8
+CSEG VE_PROMPTERROR 00003cf9
+CSEG XT_PROMPTERROR 00003cfe
+CSEG PFA_PROMPTERROR 00003cff
+CSEG VE_QUIT 00003d02
+CSEG XT_QUIT 00003d06
+CSEG PFA_QUIT 00003d07
+CSEG PFA_QUIT2 00003d0f
+CSEG PFA_QUIT4 00003d15
+CSEG PFA_QUIT3 00003d27
+CSEG XT_CATCH 00003d6f
+CSEG PFA_QUIT5 00003d25
+CSEG VE_PAUSE 00003d2a
+CSEG PFA_PAUSE 00003d30
+DSEG ram_pause 00000192
+CSEG XT_RDEFERFETCH 00003db3
+CSEG XT_RDEFERSTORE 00003dbd
+CSEG VE_COLD 00003d33
+CSEG clearloop 00003d3f
+DSEG ram_user1 00000194
+CSEG PFA_WARM 00003d59
+CSEG VE_WARM 00003d54
+CSEG XT_WARM 00003d58
+CSEG XT_DEFERSTORE 00003dde
+CSEG XT_TURNKEY 00003f5b
+CSEG VE_HANDLER 00003d62
+CSEG XT_HANDLER 00003d68
+CSEG PFA_HANDLER 00003d69
+CSEG VE_CATCH 00003d6a
+CSEG PFA_CATCH 00003d70
+CSEG VE_THROW 00003d80
+CSEG PFA_THROW 00003d86
+CSEG PFA_THROW1 00003d8c
+CSEG VE_EDEFERFETCH 00003d99
+CSEG PFA_EDEFERFETCH 00003da0
+CSEG VE_EDEFERSTORE 00003da3
+CSEG PFA_EDEFERSTORE 00003daa
+CSEG VE_RDEFERFETCH 00003dad
+CSEG PFA_RDEFERFETCH 00003db4
+CSEG VE_RDEFERSTORE 00003db7
+CSEG PFA_RDEFERSTORE 00003dbe
+CSEG VE_UDEFERFETCH 00003dc1
+CSEG PFA_UDEFERFETCH 00003dc8
+CSEG VE_UDEFERSTORE 00003dcd
+CSEG PFA_UDEFERSTORE 00003dd4
+CSEG VE_DEFERSTORE 00003dd9
+CSEG PFA_DEFERSTORE 00003ddf
+CSEG VE_DEFERFETCH 00003de6
+CSEG XT_DEFERFETCH 00003deb
+CSEG PFA_DEFERFETCH 00003dec
+CSEG VE_DODEFER 00003df2
+CSEG XT_DODEFER 00003df8
+CSEG PFA_DODEFER 00003df9
+CSEG VE_UDOT 00003e06
+CSEG XT_UDOT 00003e09
+CSEG PFA_UDOT 00003e0a
+CSEG VE_UDOTR 00003e0d
+CSEG XT_UDOTR 00003e11
+CSEG PFA_UDOTR 00003e12
+CSEG VE_USLASHMOD 00003e16
+CSEG XT_USLASHMOD 00003e1b
+CSEG PFA_USLASHMOD 00003e1c
+CSEG VE_NEGATE 00003e21
+CSEG PFA_NEGATE 00003e27
+CSEG VE_SLASH 00003e2a
+CSEG XT_SLASH 00003e2d
+CSEG PFA_SLASH 00003e2e
+CSEG VE_MOD 00003e31
+CSEG XT_MOD 00003e35
+CSEG PFA_MOD 00003e36
+CSEG VE_MIN 00003e39
+CSEG XT_MIN 00003e3d
+CSEG PFA_MIN 00003e3e
+CSEG PFA_MIN1 00003e43
+CSEG VE_MAX 00003e45
+CSEG XT_MAX 00003e49
+CSEG PFA_MAX 00003e4a
+CSEG PFA_MAX1 00003e4f
+CSEG VE_WITHIN 00003e51
+CSEG PFA_WITHIN 00003e57
+CSEG VE_SHOWWORDLIST 00003e5e
+CSEG XT_SHOWWORDLIST 00003e67
+CSEG PFA_SHOWWORDLIST 00003e68
+CSEG XT_SHOWWORD 00003e6d
+CSEG PFA_SHOWWORD 00003e6e
+CSEG VE_WORDS 00003e73
+CSEG XT_WORDS 00003e78
+CSEG PFA_WORDS 00003e79
+CSEG VE_DOTSTRING 00003e7e
+CSEG XT_DOTSTRING 00003e81
+CSEG PFA_DOTSTRING 00003e82
+CSEG VE_SQUOTE 00003e86
+CSEG PFA_SQUOTE 00003e8a
+CSEG PFA_SQUOTE1 00003e92
+CSEG VE_FILL 00003e93
+CSEG PFA_FILL 00003e98
+CSEG PFA_FILL2 00003ea4
+CSEG PFA_FILL1 00003e9f
+CSEG VE_F_CPU 00003ea6
+CSEG XT_F_CPU 00003eab
+CSEG PFA_F_CPU 00003eac
+CSEG VE_STATE 00003eb1
+CSEG PFA_STATE 00003eb7
+DSEG ram_state 000001c0
+CSEG VE_BASE 00003eb8
+CSEG PFA_BASE 00003ebd
+CSEG VE_CELLS 00003ebe
+CSEG VE_2DUP 00003ec4
+CSEG PFA_2DUP 00003ec9
+CSEG VE_2DROP 00003ecc
+CSEG PFA_2DROP 00003ed2
+CSEG VE_TUCK 00003ed5
+CSEG PFA_TUCK 00003eda
+CSEG VE_TO_IN 00003edd
+CSEG PFA_TO_IN 00003ee2
+CSEG VE_PAD 00003ee3
+CSEG PFA_PAD 00003ee8
+CSEG VE_EMIT 00003eed
+CSEG PFA_EMIT 00003ef2
+CSEG VE_EMITQ 00003ef5
+CSEG XT_EMITQ 00003efa
+CSEG PFA_EMITQ 00003efb
+CSEG VE_KEY 00003efe
+CSEG PFA_KEY 00003f03
+CSEG VE_KEYQ 00003f06
+CSEG XT_KEYQ 00003f0a
+CSEG PFA_KEYQ 00003f0b
+CSEG VE_DP 00003f0e
+ESEG CFG_DP 00000036
+CSEG VE_EHERE 00003f15
+ESEG EE_EHERE 0000003a
+CSEG VE_HERE 00003f1e
+CSEG PFA_HERE 00003f23
+ESEG EE_HERE 00000038
+CSEG VE_ALLOT 00003f26
+CSEG PFA_ALLOT 00003f2c
+CSEG VE_BIN 00003f31
+CSEG XT_BIN 00003f35
+CSEG PFA_BIN 00003f36
+CSEG VE_DECIMAL 00003f3a
+CSEG PFA_DECIMAL 00003f41
+CSEG VE_HEX 00003f46
+CSEG XT_HEX 00003f4a
+CSEG PFA_HEX 00003f4b
+CSEG VE_BL 00003f50
+CSEG PFA_BL 00003f54
+CSEG VE_TURNKEY 00003f55
+CSEG PFA_TURNKEY 00003f5c
+ESEG CFG_TURNKEY 00000042
+CSEG VE_TOUPPER 00003f5f
+CSEG PFA_TOUPPER 00003f66
+CSEG PFA_TOUPPER0 00003f71
+CSEG VE_TOLOWER 00003f72
+CSEG XT_TOLOWER 00003f78
+CSEG PFA_TOLOWER 00003f79
+CSEG PFA_TOLOWER0 00003f84
+CSEG VE_QSTACK 00003f85
+CSEG PFA_QSTACK 00003f8b
+CSEG PFA_QSTACK1 00003f92
+CSEG VE_BOUNDS 00003f93
+CSEG PFA_BOUNDS 00003f99
+CSEG VE_CR 00003f9d
+CSEG PFA_CR 00003fa1
+CSEG VE_SPACE 00003fa8
+CSEG PFA_SPACE 00003fae
+CSEG VE_SPACES 00003fb1
+CSEG PFA_SPACES 00003fb7
+CSEG SPCS1 00003fb9
+CSEG SPCS2 00003fc0
+CSEG VE_S2D 00003fc2
+CSEG PFA_S2D 00003fc7
+CSEG VE_TO_BODY 00003fca
+CSEG VE_2LITERAL 00003fd0
+CSEG PFA_2LITERAL 00003fd7
+CSEG VE_EQUAL 00003fdb
+CSEG PFA_EQUAL 00003fdf
+CSEG VE_ONE 00003fe2
+CSEG PFA_ONE 00003fe6
+CSEG VE_TWO 00003fe7
+CSEG PFA_TWO 00003feb
+CSEG VE_MINUSONE 00003fec
+CSEG XT_MINUSONE 00003fef
+CSEG PFA_MINUSONE 00003ff0
+SET flashlast 00003ff1
+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/arduino/words/applturnkey.asm b/amforth-6.5/appl/arduino/words/applturnkey.asm
new file mode 100644
index 0000000..89ab5fb
--- /dev/null
+++ b/amforth-6.5/appl/arduino/words/applturnkey.asm
@@ -0,0 +1,25 @@
+; ( -- ) 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_DOSLITERAL
+ .dw 10
+ .db "Forthduino"
+ .dw XT_ITYPE
+
+ .dw XT_EXIT