umouse

umouse.git
git clone git://git.lenczewski.org/umouse.git
Log | Files | Refs | Submodules | README

commit dd8293f693ce69961a9408528ab82eeba0115c4d
parent 9bd7da98c4ec543344de390de0c4b70755271fbe
Author: MikoĊ‚aj Lenczewski <mblenczewski@gmail.com>
Date:   Thu,  9 May 2024 18:50:31 +0100

Import mwmouse

Diffstat:
A.editorconfig | 21+++++++++++++++++++++
A.gitignore | 0
Adocs/forth-reference.pdf | 0
Amwmouse/.gitignore | 1+
Amwmouse/maze.fth | 0
Amwmouse/motorspeeds.md | 85+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/nullpoint.fth | 45+++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/nullpoint.py | 217+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/picoterm.sh | 3+++
Amwmouse/setup-bt.sh | 7+++++++
Amwmouse/sources/2YELLOW.hex | 2023+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/2YELLOW.img | 0
Amwmouse/sources/AnsForth/A0001.HTM | 264+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/AnsForth/A0002.HTM | 367+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/AnsForth/A0003.HTM | 560+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/AnsForth/A0004.HTM | 337+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/AnsForth/A0005.HTM | 204+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/AnsForth/A0006.HTM | 413+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/AnsForth/A0007.HTM | 390+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/AnsForth/ANSSPEC.CHM | 0
Amwmouse/sources/AnsForth/ANSSPEC.HHP | 64++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/AnsForth/DOWN.GIF | 0
Amwmouse/sources/AnsForth/DPANS.HTM | 576+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/AnsForth/DPANS1.HTM | 702+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/AnsForth/DPANS10.HTM | 497+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/AnsForth/DPANS11.HTM | 1345+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/AnsForth/DPANS12.HTM | 2397+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/AnsForth/DPANS13.HTM | 608+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/AnsForth/DPANS14.HTM | 380+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/AnsForth/DPANS15.HTM | 920+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/AnsForth/DPANS16.HTM | 683+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/AnsForth/DPANS17.HTM | 374+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/AnsForth/DPANS2.HTM | 536+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/AnsForth/DPANS3.HTM | 1781+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/AnsForth/DPANS4.HTM | 372+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/AnsForth/DPANS5.HTM | 147+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/AnsForth/DPANS6.HTM | 5778+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/AnsForth/DPANS7.HTM | 766+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/AnsForth/DPANS8.HTM | 785+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/AnsForth/DPANS9.HTM | 555+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/AnsForth/DPANSA1.HTM | 236+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/AnsForth/DPANSA10.HTM | 359+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/AnsForth/DPANSA11.HTM | 306+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/AnsForth/DPANSA12.HTM | 384+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/AnsForth/DPANSA13.HTM | 394+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/AnsForth/DPANSA14.HTM | 46++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/AnsForth/DPANSA15.HTM | 281+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/AnsForth/DPANSA16.HTM | 289++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/AnsForth/DPANSA17.HTM | 150+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/AnsForth/DPANSA2.HTM | 106+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/AnsForth/DPANSA3.HTM | 1436+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/AnsForth/DPANSA4.HTM | 47+++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/AnsForth/DPANSA5.HTM | 113+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/AnsForth/DPANSA6.HTM | 2045+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/AnsForth/DPANSA7.HTM | 91+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/AnsForth/DPANSA8.HTM | 164+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/AnsForth/DPANSA9.HTM | 294+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/AnsForth/DPANSB.HTM | 227+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/AnsForth/DPANSC.HTM | 1044+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/AnsForth/DPANSD.HTM | 1157+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/AnsForth/DPANSE.HTM | 633+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/AnsForth/DPANSF.HTM | 432+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/AnsForth/FIX_HTML.TXT | 14++++++++++++++
Amwmouse/sources/AnsForth/LEFT.GIF | 0
Amwmouse/sources/AnsForth/MPETEXT.HTM | 49+++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/AnsForth/MPEXC6.CSS | 54++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/AnsForth/NOTES.HTM | 173+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/AnsForth/RFILIST.HTM | 35+++++++++++++++++++++++++++++++++++
Amwmouse/sources/AnsForth/RIGHT.GIF | 0
Amwmouse/sources/AnsForth/UP.GIF | 0
Amwmouse/sources/CM0def.fth | 175+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/CURSOR.fth | 30++++++++++++++++++++++++++++++
Amwmouse/sources/CodeM0lite.fth | 2217+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/FaultCortex.fth | 543+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/FlashSTM32.fth | 172+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/IntCortex.fth | 306+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/LIBRARY.fth | 329+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/LITESTM32F072SA.hex | 1831+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/LITESTM32F072SA.img | 0
Amwmouse/sources/LITESTM32F072UF.hex | 225+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/LITESTM32F072UF.img | 0
Amwmouse/sources/LibM0M1.fth | 138+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/Macros.fth | 29+++++++++++++++++++++++++++++
Amwmouse/sources/MultiCM0lite.fth | 508+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/REPROGSTM32F0.img | 0
Amwmouse/sources/ReFlash.fth | 163+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/ReProg/MinSerSTM32p.fth | 75+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/ReProg/MinXmodemRx.fth | 279+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/ReProg/PROGD.IMG | 0
Amwmouse/sources/ReProg/PROGU.IMG | 0
Amwmouse/sources/ReProg/REPROGSTM32F0.img | 0
Amwmouse/sources/ReProg/ReFlash.fth | 163+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/ReProg/ReprogApp.fth | 283+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/ReProg/ReprogSTM32F0.ctl | 201+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/ReProg/XREF.XRF | 0
Amwmouse/sources/ReProg/b.bat | 1+
Amwmouse/sources/ReProg/delays.fth | 66++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/ReProg/primitives.fth | 190+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/StackDef.fth | 116+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/SysTick.fth | 161+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/SysTickDisco072.fth | 161+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/TAB.hex | 1980+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/TAB.img | 0
Amwmouse/sources/VT100COLOURS.fth | 34++++++++++++++++++++++++++++++++++
Amwmouse/sources/WOW.hex | 1985+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/WOW.img | 0
Amwmouse/sources/XREF.xrf | 0
Amwmouse/sources/dump.fth | 89+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/gpioSTM32F0xx.fth | 286+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/include.fth | 172+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/kernel72lite.fth | 1877+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/liteSTM32F072.no | 2++
Amwmouse/sources/liteSTM32F072sa.ctl | 429+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/liteSTM32F072sa.no | 2++
Amwmouse/sources/liteSTM32F072uf.ctl | 411+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/old tab.ctl | 445+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/rebootSTM32.fth | 51+++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/serSTM32F0xxp.fth | 470+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/sfrSTM32F072.fth | 635+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/spiSTM32F0hard.fth | 238+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/startSTM32F072.fth | 245+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/tab.ctl | 409+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/tab.no | 2++
Amwmouse/sources/tabio.fth | 282+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/tabticker.fth | 135+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/wow.ctl | 409+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/wow.no | 2++
Amwmouse/sources/wowio.fth | 284+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/sources/yellowio.fth | 317+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Amwmouse/wf.config-2024-03-17.fth | 11+++++++++++
Amwmouse/wf.config.fth | 16++++++++++++++++
Amwmouse/wf.fth | 249+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
132 files changed, 54591 insertions(+), 0 deletions(-)

diff --git a/.editorconfig b/.editorconfig @@ -0,0 +1,21 @@ +root = true + +[*] +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true +charset = utf-8 + +guidelines = 80, 120, 160 + +[*.{c,h,sh}] +indent_style = tab +indent_size = 8 + +[*.{fth}] +indent_style = space +indent_size = 3 + +[*.{md,txt}] +indent_style = space +indent_size = 2 diff --git a/.gitignore b/.gitignore diff --git a/docs/forth-reference.pdf b/docs/forth-reference.pdf Binary files differ. diff --git a/mwmouse/.gitignore b/mwmouse/.gitignore @@ -0,0 +1 @@ +env diff --git a/mwmouse/maze.fth b/mwmouse/maze.fth diff --git a/mwmouse/motorspeeds.md b/mwmouse/motorspeeds.md @@ -0,0 +1,85 @@ +# LMOTOR_RAW_VALUES +0 15251 +50 12141 +100 10345 +150 8402 +200 6487 +250 4623 +300 2794 +350 976 +400 0 +450 1547 +500 2983 +550 4364 +600 5900 +650 7318 +700 8688 +750 10028 +800 11344 +850 12744 +900 13972 +950 15152 + +# RMOTOR_RAW_VALUES +0 16704 +50 14724 +100 13035 +150 11291 +200 9481 +250 7583 +300 5692 +350 3805 +400 1950 +450 0 +500 1114 +550 2925 +600 4734 +650 6527 +700 8329 +750 10131 +800 11808 +850 13536 +900 15094 +950 16595 + +## Finding Null-point + +From the above raw data, we can plot 2 lines (one for each motor). +These will form a line reflected around the null-point for each motor, and by +negating the values before the null-point we can get 2 straight lines. The 2 +line segments form similar triangles, from which we can interpolate the true +value of the null point. + +## LNULL + +350, 976 +450, 1547 + +x / 976 = ((450 - 350) - x) / 1547 +1547x = 97600 - 976x +2523x = 97600 +x = 38.68 +x ~= 39 + +LNULL = 350 + 39 +LNULL = 389 + +## RNULL + +400, 1950 +500, 1114 + +x / 1950 = ((500 - 400) - x) / 1114 +1114x = 195000 - 1950x +3064x = 195000 +x = 63.64 +x = 63 + +RNULL = 400 + 63 +RNULL = 463 + +## Matching Motor PWM Gains + +The two motors will have different responses, since they run in two different +directions (and the motors may have a preferred direction in which they run +faster). diff --git a/mwmouse/nullpoint.fth b/mwmouse/nullpoint.fth @@ -0,0 +1,45 @@ +4 CONSTANT CELLS + +1000 CONSTANT WARMUPMS +5000 CONSTANT TIMEOUTMS + +1000 CONSTANT PWMSCALE +20 CONSTANT PWMSTEP + +PWMSCALE PWMSTEP / CONSTANT CALIBSTEPS + +0 CONSTANT LMOTOR +1 CONSTANT RMOTOR + +CREATE MOTORCOUNTS + ' LCOUNT , + ' RCOUNT , +ALIGN + +CREATE MOTORPWMS + ' PWML , + ' PWMR , +ALIGN + +: MOTORCOUNT ( id -- pfn ) + CELLS * MOTORCOUNTS + @ ; + +: MOTORPWM ( id -- pfn ) + CELLS * MOTORPWMS + @ ; + +: GETPWMCOUNT ( id -- n ) + WARMUPMS MS CLEARCOUNTS TIMEOUTMS MS MOTORCOUNT EXECUTE ; + +: SETPWMSPEED ( id n -- ) + SWAP MOTORPWM EXECUTE ; + +: CALIB ( id -- ) + 13 EMIT + 10 EMIT + CALIBSTEPS 1 + 0 DO + DUP I PWMSTEP * SETPWMSPEED + DUP GETPWMCOUNT + I PWMSTEP * . . CR + LOOP + DROP ; + diff --git a/mwmouse/nullpoint.py b/mwmouse/nullpoint.py @@ -0,0 +1,217 @@ +#!/usr/bin/env python3 + +import matplotlib + +matplotlib.use('gtk4agg') + +import matplotlib.pyplot as plot + +LMOTOR_RAW_VALS = ''' +0 14624 +20 13423 +40 12514 +60 11658 +80 10856 +100 10229 +120 9622 +140 8863 +160 8208 +180 7523 +200 6811 +220 6131 +240 5419 +260 4736 +280 4034 +300 3355 +320 2645 +340 1956 +360 1299 +380 659 +400 0 +420 0 +440 567 +460 1229 +480 1770 +500 2316 +520 2895 +540 3442 +560 4003 +580 4544 +600 5087 +620 5654 +640 6214 +660 6741 +680 7263 +700 7796 +720 8348 +740 8927 +760 9473 +780 9999 +800 10507 +820 11076 +840 11565 +860 11951 +880 12529 +900 12916 +920 13352 +940 13913 +960 14360 +980 14893 +1000 15104 +''' + +RMOTOR_RAW_VALS = ''' +0 17342 +20 15527 +40 14194 +60 13538 +80 12795 +100 11942 +120 11107 +140 10307 +160 9496 +180 8701 +200 7884 +220 7074 +240 6208 +260 5391 +280 4550 +300 3701 +320 2848 +340 2017 +360 1193 +380 355 +400 0 +420 514 +440 1345 +460 2136 +480 2857 +500 3534 +520 4200 +540 4856 +560 5506 +580 6158 +600 6807 +620 7473 +640 8111 +660 8759 +680 9414 +700 9990 +720 10520 +740 11187 +760 11810 +780 12355 +800 12981 +820 13560 +840 14175 +860 14841 +880 15171 +900 15868 +920 16443 +940 16865 +960 17287 +980 17815 +1000 18014 +''' + +def parse_motor_counts(raw_counts): + counts = dict() + for line in raw_counts.strip().split('\n'): + [pwm, count] = line.split() + counts[int(pwm)] = float(count) + + return counts + +LMOTOR_COUNTS = parse_motor_counts(LMOTOR_RAW_VALS) +RMOTOR_COUNTS = parse_motor_counts(RMOTOR_RAW_VALS) + +MAX = 1000 +STEP = 20 +FULLRANGE = list(range(0, MAX + STEP, STEP)) + +def find_nullpoint(counts): + ''' + (x1, y1) where y1 <= 0 + (x2, y2) where 0 <= y2 + + d / abs(y1) = ((x2 - x1) - d) / abs(y2) + abs(y2) * d = (abs(y1) * (x2 - x1)) - (abs(y1) * d) + (abs(y1) * d) + (abs(y2) * d) = abs(y1) * (x2 - x1) + d = (abs(y2) * (x2 - x1)) / (abs(y1) + abs(y2)) + + x1 + d = nullpoint + ''' + + mp = 0 + for i in FULLRANGE: + if counts[i] == 0.0: + mp = i + break + else: + raise ValueError(f'Failed to find midpoint, expected count of 0.0 in counts') + + x1 = i - 3 * STEP + y1 = counts[x1] + + x2 = i + 3 * STEP + y2 = counts[x2] + + d = (abs(y1) * (x2 - x1)) / (abs(y1) + abs(y2)) + + return int(x1 + d) + +LMOTOR_VALS = [LMOTOR_COUNTS[x] for x in FULLRANGE] +RMOTOR_VALS = [RMOTOR_COUNTS[x] for x in FULLRANGE] + +print(f'LMOTOR:\n\tcounts: {LMOTOR_VALS}\n\tnullpoint: {find_nullpoint(LMOTOR_COUNTS)}') +print(f'RMOTOR:\n\tcounts: {RMOTOR_VALS}\n\tnullpoint: {find_nullpoint(RMOTOR_COUNTS)}') + +def all_before(l, key): + def __impl(l, key): + for v in l: + if v == key: break + yield v + + return list(__impl(l, key)) + +def all_after(l, key): + def __impl(l, key): + out = False + for v in l: + if v == key: out = True + if out: yield v + + return list(__impl(l, key)) + +def negate(l): + return [-v for v in l] + +def reverse(l): + return list(reversed(l)) + +# figure for calculating lmotor and rmotor null points +plot.subplot(311) +plot.grid(visible=True) +plot.plot(FULLRANGE, negate(all_before(LMOTOR_VALS, 0)) + all_after(LMOTOR_VALS, 0), color='r') +plot.plot(FULLRANGE, all_before(RMOTOR_VALS, 0) + negate(all_after(RMOTOR_VALS, 0)), color='b') +plot.axhline(y=0, color='black', linestyle='-', linewidth=0.5) + +plot.subplot(312) +plot.grid(visible=True) + +lmotor_rev, lmotor_fwd = reverse(all_before(LMOTOR_VALS, 0) + [0]), all_after(LMOTOR_VALS, 0) +rmotor_fwd, rmotor_rev = all_after(RMOTOR_VALS, 0), reverse(all_before(RMOTOR_VALS, 0) + [0]) + +plot.plot(FULLRANGE[:len(lmotor_fwd)], lmotor_fwd, color='r') +plot.plot(FULLRANGE[:len(lmotor_rev)], lmotor_rev, color='r', linestyle='--') +plot.plot(FULLRANGE[:len(rmotor_fwd)], rmotor_fwd, color='b') +plot.plot(FULLRANGE[:len(rmotor_rev)], rmotor_rev, color='b', linestyle='--') + +plot.subplot(313) +plot.grid(visible=True) + +plot.plot(FULLRANGE, negate(all_before(LMOTOR_VALS, 0)) + all_after(LMOTOR_VALS, 0), color='r') +plot.plot(FULLRANGE, negate(all_before(RMOTOR_VALS, 0)) + all_after(RMOTOR_VALS, 0), color='b') + +plot.show() + diff --git a/mwmouse/picoterm.sh b/mwmouse/picoterm.sh @@ -0,0 +1,3 @@ +#!/bin/sh + +picocom /dev/rfcomm0 --flow x --send-cmd 'ascii-xfr -l200 -s' diff --git a/mwmouse/setup-bt.sh b/mwmouse/setup-bt.sh @@ -0,0 +1,7 @@ +#!/bin/sh + +BTADDR="98:DA:60:07:EC:96" + +BTCHAN="1" + +rfcomm bind /dev/rfcomm0 "$BTADDR" "$BTCHAN" diff --git a/mwmouse/sources/2YELLOW.hex b/mwmouse/sources/2YELLOW.hex @@ -0,0 +1,2023 @@ +:020000040800F2 +:10000000203C00208D010008E5430008454400081D +:10001000090100080B0100080000000000000000BA +:100020000000000000000000000000000F010008B8 +:1000300011010008000000001301000835560008F7 +:1000400000000000000000000000000000000000B0 +:1000500000000000000000000000000000000000A0 +:100060000000000000000000000000000000000090 +:100070000000000000000000000000000000000080 +:100080000000000000000000000000000000000070 +:100090000000000000000000000000000000000060 +:1000A0000000000000000000000000000000000050 +:1000B0000000000000000000000000000000000040 +:1000C0000000000000000000000000000000000030 +:1000D0000000000000000000000000000000000020 +:1000E0000000000000000000000000000000000010 +:1000F0000000000000000000000000000000000000 +:1001000040380008FEE7FEE7FEE7FEE7FEE7FEE711 +:10011000FEE7FEE7FEE72020174D01202968014396 +:100120002960361F37602F4600B500BF3D680220AA +:100130000540FBD01120114908601148786000206B +:10014000F862104839680143396000BF3D680E48C5 +:100150000540FBD03D1D0C3E032131600221716042 +:10016000B7602F4601F0FEFB7D680C200540082D8E +:10017000FAD180CE00BD01BC001002400020024038 +:1001800000801004000000010000000200B500BF64 +:10019000104D85F30888104D85F30988022585F3F5 +:1001A0001488BFF36F8F0D4E0D4DAB460D490E48B1 +:1001B0000D6805430D600D490D480D6885430D60C0 +:1001C000FFF7AAFF0B48056801200543A847DFE7B2 +:1001D00000BD0000203C0020203E0020043F002005 +:1001E000103F00201410024014007E00281002402E +:1001F00000007E0000010008043F0020203E002097 +:1002000000000000000000000000000000000000EE +:100210000A0000000000000000C0000800C0000844 +:10022000B80000204C000020C093442300000000D0 +:10023000C3414E4431680F40361D70470000000036 +:10024000C24F522031680F43361D70470000000036 +:10025000C3584F5231684F40361D704700000000B0 +:10026000C6494E5645525420FF43704700000000D7 +:10027000C2303D20002F01D0002701E001277F423E +:100280007047000000000000C3303C3E002F01D149 +:10029000002701E001277F4270470000700200083C +:1002A000C2303C20002F01D4002701E001277F420B +:1002B00070470000A0020008C2303E20002F01DC81 +:1002C000002701E001277F42704700000000000086 +:1002D000C13D20203068874201D0002701E001277E +:1002E0007F42361D70470000D0020008C23C3E200D +:1002F0003068874201D1002701E001277F42361D87 +:100300007047000000000000C13C20203068874298 +:1003100001DC002701E001277F42361D7047000005 +:1003200060020008C13E20203068874201DB0027C0 +:1003300001E001277F42361D70470000EC020008F3 +:10034000C23C3D203068874201DA002701E00127E6 +:100350007F42361D7047000000000000C23E3D2075 +:100360003068874201DD002701E001277F42361D0A +:100370007047000000000000C2553E2030688742F0 +:1003800001D3002701E001277F42361D704700009E +:1003900078030008C2553C203068874201D8002706 +:1003A00001E001277F42361D7047000094030008DA +:1003B000C344303C002F01D4002701E001277F42D5 +:1003C000361D7047B0030008C344303D31680F4309 +:1003D000002F01D0002701E001277F42361D704722 +:1003E00000000000C2443D2007CE3B1C0027801ABD +:1003F0008B41384300D1FF43704700005C03000885 +:10040000C34D494E01CE874200DD074670470000CC +:1004100000040008C34D415801CE874200DA074668 +:100420007047000008030008C657495448494E2049 +:1004300030683F1A716830680D1AAF4201D8002742 +:1004400001E001277F42083670470000B80200082B +:10045000C64C534849465420384680CE87407047A2 +:1004600000000000C652534849465420384680CE0A +:10047000C740704764040008C74152534849465476 +:10048000384680CE0741704700000000C7455845F8 +:10049000435554450120384380CE00470121704622 +:1004A0008843026810470000391C80CEF6D07046A1 +:1004B000001D004701CEB842F0D180CEF7E7000022 +:1004C0000099491C0091E9D703B0F0E70099C919D8 +:1004D000009180CEE2D703B0E9E7000002CE01240C +:1004E000E40773465B1E1A680919781A07B480CEB0 +:1004F000DDE7000002CEB942F1D180CECEE70000A8 +:1005000040020008C54C45415645202002B000BDC0 +:1005100000000000C63F4C45415645203F1C80CEA0 +:1005200000D1704702B000BD00000000C14920208A +:10053000361F3760009F01983F187047500200082F +:10054000C14A2020361F3760039F04983F18704728 +:1005500040050008C6554E4C4F4F502003B0704721 +:10056000E4030008C3533E44FD17361F37602F468F +:100570007047000050040008C44E4F4F5020202008 +:100580007047000024030008C24D2B2003CEFA1749 +:10059000C91950410746361F31607047880200086C +:1005A000C2312B207F1C7047A0050008C2312D20CE +:1005B0007F1E70478C040008C12B20203068361D38 +:1005C0003F18704740030008C12D20203068361DB9 +:1005D000C71B704730020008C64E454741544520AE +:1005E0007F42704764050008C2442B2007CE801864 +:1005F0004F41361F30607047E8050008C2442D2087 +:1006000007CE101AB9410F46361F30607047000000 +:1006100054050008C7444E45474154453068002101 +:100620004042B9410F46306070470000FC050008A9 +:10063000C73F4E45474154453F1C80CE00D57F42C1 +:1006400070470000D8050008C3414253002F00D571 +:100650007F42704778040008C44441425320202060 +:100660003F1CDBD470470000C8030008C344322A93 +:10067000306800187F413060704700006C06000849 +:10068000C344322F306840107F108941C9070843A6 +:100690003060704714060008C12A202031684F439B +:1006A000361D704758060008C3554D2A3846316834 +:1006B00040B40A04120C0B0C0404240C050C16465E +:1006C00066431F466F4318466043010C000436180A +:1006D0004F4128465043010C000436184F4135461F +:1006E00040BC35607047000088050008C24D2A20D4 +:1006F00035687D4000B520B4002F00D57F423568B5 +:10070000002D00D56D423560FFF7D0FF20BC002DD5 +:1007100001D5FFF783FF00BD98060008C6554D2F91 +:100720004D4F442001CE3168202400224918404119 +:1007300013465341C01B5B4101D0491C00E0C01966 +:10074000641EF3D10F46306070470000B805000802 +:10075000C6464D2F4D4F442000B580B435687D40CE +:1007600020B480B480CEFFF77BFF009D002D00D524 +:100770006D42361F37602F46FFF7D4FF15480740FC +:1007800020BC002D01D4002501E001256D42002D83 +:10079000EFF3008001B430683760074601BC80F396 +:1007A000008800D57F4220BC002DEFF3008001B40B +:1007B00030683760074601BC80F3008808D57F4267 +:1007C0003068002804D07F1E009D30682D1A3560E7 +:1007D00001B000BDFFFFFF7F00000000C6534D2F9A +:1007E00052454D2000B5306801B480B480CEFFF78B +:1007F00037FF009D002D00D56D42361F37602F4614 +:10080000FFF790FF20BC009C6C40002C00D57F427D +:1008100020BC002DEFF3008001B43068376007463C +:1008200001BC80F3008800D57F42306837600746FE +:1008300000BD0000AC050008C42F4D4F442020200F +:1008400000B580B43168CF1720BC361F37602F4603 +:10085000FFF7C8FF00BD000014040008C12F2020CE +:1008600000B580B43168CF1720BC361F37602F46E3 +:10087000FFF7B8FF361D00BD80060008C2552F20C7 +:10088000361F0021316000B5FFF74CFF361D00BD5B +:100890005C080008C34D4F4400B5FFF7D1FF80CE80 +:1008A00000BD0000EC060008C24D2F2000B5FFF788 +:1008B00099FF361D00BD000038080008C64D552FB1 +:1008C0004D4F442000B580B4009F361F0021316099 +:1008D000FFF728FF20BC80B42F46FFF723FF20BC82 +:1008E000361F37602F4600BDA8080008C52A2F4DC7 +:1008F0004F44202000B580B480CEFFF7F9FE20BC25 +:10090000361F37602F46FFF76DFF00BD5007000808 +:10091000C22A2F2000B5FFF7EDFF361D00BD0000F5 +:1009200004050008C34E4950361D7047A80600084C +:10093000C45455434B202020361F716831607760C6 +:100940007047000048060008C45049434B2020204F +:10095000BF00F7597047000030060008C4524F4CE2 +:100960004C202020B800002801DC80CE704737588A +:10097000011F72583250081CFAD1361D7047000012 +:1009800014050008C3524F543D46776831687160C2 +:100990003560704724090008C42D524F5420202090 +:1009A0003D4637687168316075607047940800088B +:1009B000C23E522080B480CE704700004809000833 +:1009C000C2523E20361F376080BC7047C009000805 +:1009D000C2524020361F3760009F704784090008CC +:1009E000C3323E5203CE01B480B40F1C70470000E6 +:1009F000E0090008C332523E03BC083E3160776014 +:100A000007467047F4090008C33252400098019924 +:100A1000083E316077600746704700007C08000898 +:100A2000C453574150202020306837600746704734 +:100A3000200A0008C3445550361F37607047000035 +:100A4000BC080008C44F564552202020361F37608E +:100A50007768704730090008C444524F5020202066 +:100A600080CE7047340A0008C53244524F502020CF +:100A70007768083670470000680A0008C532535787 +:100A800041502020706877600746B0683168B160D7 +:100A9000306070475C090008C43244555020202063 +:100AA000083EB16831607760704700007C0A00083A +:100AB000C5324F5645522020083E3169316077607B +:100AC000F7687047440A0008C43F4455502020206E +:100AD000002F01D0361F376070470000980A0008C9 +:100AE000C3535040361F376037467047E00A00084E +:100AF000C35350213E4680CE70470000080A0008CC +:100B0000C3525040361F37606F467047000B0008D5 +:100B1000C3525021BD4680CE70470000580A0008DD +:100B2000C5434F554E5420207D1C3F78361F3560FD +:100B300070470000F00A0008C72F535452494E472F +:100B40003168CD1B70683F1877602F46361D70479F +:100B5000B00A0008C4534B495020202003CE401C4B +:100B6000401E04D00A78BA4201D1491CF8E7361F6A +:100B70003160074670470000540B0008C4534341DE +:100B80004E20202003CE401C401E04D00A78BA42DA +:100B900001D0491CF8E7361F316007467047000056 +:100BA000100B0008C2533D2003CE3F1C07D0027833 +:100BB0000B78401C491C9A4201D17F1EF7D102D10B +:100BC00001277F4200E00027704700002C05000845 +:100BD000C7434F4D504152457168CD1B00B520B4FD +:100BE00071688F4200DB0F1C31687160361D00BFD9 +:100BF000002F23D075682D78346824782C1B002CA6 +:100C0000EFF3008001B4361F71683160B168716024 +:100C1000B760274601BC80F3008804D001B080B4DF +:100C20000027361D09E037687F1C75686D1CB068A9 +:100C3000441E7760B5602746361DD9E780BC002F7B +:100C4000EFF3008001B4083601BC80F3008807D0C0 +:100C5000002F01D4002701E001277F420120074334 +:100C600000BD202000B5B16802B4716802B43168DB +:100C700002B480B480B0484601B4E946F768103643 +:100C80004D462D694C46E4684B465B68E31A5B1C95 +:100C90005B19083E336077602F4600BFFFF72AFCE0 +:100CA0000F0D0008009D019805442D784C46A4685E +:100CB0002478AC4226D1009D019805444C46A46896 +:100CC0004B465B680C3E34607560B7601F46FFF7AB +:100CD0006BFF002F80CE15D0009D019805444C4637 +:100CE000E468009B019803444A4612699A1AA21AC2 +:100CF00003B00C3E32607560B7600B4F01BC81469B +:100D000004B000BD0098401C0090CBD703B04D4606 +:100D10002D694C46E4680C3E34607560B76000276E +:100D200001BC814604B000BDFFFFFFFFDC070008E7 +:100D3000C6534541524348207068874200B502DDE2 +:100D40000027361D00BD002F02DC064F361D00BDFA +:100D50007068002802DC0027361D00BDFFF782FF07 +:100D600000BD0000FFFFFFFF200B0008C5434D4FF3 +:100D7000564520203B1C83CE00D17047021C0A43FD +:100D80001A430324144006D10A680260091D001D9D +:100D90001B1FF9D170470A780270491C401C5B1E6A +:100DA000F9D17047300D0008C6434D4F56453E20DF +:100DB0003B1C83CE00D17047C018C918021C0A43DF +:100DC0001A430324144006D1091F001F0A68026059 +:100DD0001B1FF9D17047491E401E0A7802705B1E26 +:100DE000F9D170476C0D0008C3555043612F00B511 +:100DF00003DB7A2F01DCDF20074000BDD00B0008A9 +:100E0000C55550504552202030683F183068376033 +:100E1000074600B5FFF76EFB430E0008009D0198E2 +:100E200005442D78361F37602F46FFF7DFFF009D02 +:100E3000019805442F7080CE0098401C0090EDD79B +:100E400003B000BDA40B0008C5504C414345202011 +:100E500000B5306801B480B47F1C30683760074645 +:100E600001F05CFF20BC10BC2C7000BD980900088C +:100E7000C24F4E2001204042386080CE70470000B3 +:100E800078050008C34F46460020386080CE704782 +:100E9000D0090008C232402003CF361F0746316018 +:100EA00070470000940E0008C23221203A1C83CE05 +:100EB00003C27047000E0008C446494C4C20202055 +:100EC0003A1C83CE002803D00A70491C401EFBD177 +:100ED0007047000028040008C22B212030683968C0 +:100EE000091839607768083670470000D80E000886 +:100EF000C4494E43522020203868401C386080CEC0 +:100F000070470000E80D0008C444454352202020EB +:100F10003868401E386080CE70470000700E0008B0 +:100F2000C14020203F687047A80D0008C2574020EC +:100F30003F887047480E0008C24340203F78704702 +:100F4000840E0008C1212020306838607768083698 +:100F5000704700002C0F0008C257212030683880ED +:100F60007768083670470000380F0008C243212018 +:100F7000306838707768083670470000100900083C +:100F8000C8544553542D4249542020203F7831689D +:100F90000F40361D70470000B80E0008C753455477 +:100FA0002D424954306839780143397077680836E2 +:100FB000704700001C070008C952455345542D4294 +:100FC0004954202030683978814339707768083671 +:100FD00070470000C80A0008C54E414D453E20201C +:100FE0003D781F200540ED192D1D2F4603218F430D +:100FF00070470000D80F0008C53E4E414D452020E7 +:1010000000B500BF3F1F3D6880200540FAD000BDFD +:1010100000B500BF3F68002F2BD03D781F20054052 +:101020003068854223D17D1C0C3E3169316075608A +:10103000B760F768FFF7B8FD002F80CE17D0776054 +:10104000361DFFF7CDFF35682D7840200540EFF3C2 +:10105000008001B4361D01BC80F3008803D0361F28 +:101060003760054F02E0361F3760012700BD3F1F84 +:10107000D0E70027083600BDFFFFFFFF002F00B5B7 +:1010800001D108360CE075682D7830682D183C6861 +:10109000641E2C40641CA400E4192746FFF7B8FF27 +:1010A00000BD000001CE30380BD40A2802DBC01F7F +:1010B0000A2806DBB84204DA01277F42361F306077 +:1010C00070470027704700003F1D7047BF00704702 +:1010D0003F1F7047361F3760042770473D0C361F8F +:1010E00037602F4600B501F013F801F011F800BD8C +:1010F00031680D0C083E3560776000B500F02EFDBC +:10110000BF1C00F02BFD00BD30680740002F01D050 +:10111000002701E001277F423068002801D4002524 +:1011200001E001256D427D402F46361D704720208D +:101130003F1D3168CF1B7F10154D3D40FC0A1548FF +:10114000044024042C43083E37607460B760124F9B +:1011500000B5FFF7D9FF1148074031680F43361F2C +:10116000B168316077600E4FFFF7CEFF0D48074042 +:1011700031680F437068002801D4002501E0012583 +:101180006D42094805403D432F46083600BD00002A +:10119000FF070000FF030000000020000020000007 +:1011A00000004000000800000000000400B5FFF748 +:1011B000BFFF0148074300BD00D000F0361F376075 +:1011C000024F00B500F0A4FF00BD000000B5000014 +:1011D000361F3760024F00B500F09AFF00BD0000D7 +:1011E00000BF0000361F71683160776000B5FFF7FF +:1011F000DDFF306837600746FFF77AFF00BD20202B +:10120000361F3760044F00B500F082FF361F37608D +:10121000024F00F07DFF00BD361F00003760000068 +:10122000361F3760074F00B500F072FF361F37607A +:10123000054F00F06DFF361F3760044F00F068FF68 +:1012400000BD000070460000401E0000076800005E +:1012500000B500F0BBFEFFF7A9FFFFF73FFF00BDA1 +:1012600000B500F0B3FE0220074080CE01D0FFF7AA +:10127000AFFFFFF7EDFF00BD00B5FFF79FFF00BD1B +:10128000361F37607046401E0768401D004700004B +:10129000361F3760009F7F1E3978C919091D032248 +:1012A0009143491C00917047080F0008C7414C4901 +:1012B000474E4544FF1C03218F437047361F37605C +:1012C0007046401E076800BDB80F0008C8434F4D68 +:1012D00050494C452C20202000B5FFF7B9FF00BD38 +:1012E000F80F0008C53E424F44592020BF687047A0 +:1012F00000B5FFF76DFFFFF761FF361F3760024F44 +:10130000FFF7A6FF00BD0000BC12000800B5FFF704 +:101310005FFFFFF753FF361F3760042700F072FEB0 +:1013200000BD202000B500F0ABFE00F07FFFFFF70E +:10133000EDFF30683760074600F0DAFE00F0ACFEE3 +:1013400000BD202000B520BC01218D43361F376031 +:101350002F4600F0F9FEFFF743FE3F1DFFF742FF67 +:1013600000BD000000B500BF00F0D8F8000000206C +:10137000800F0008C3494D4D0249012040420860DA +:101380007047000000000020CC120008813A2020A5 +:1013900000B501F03FFD01F009FD00F047FF00F04E +:1013A000DBFE01F043FFFFF767FF00BD200F0008E1 +:1013B000C73A4E4F4E414D4500B501F0F7FC00F0E5 +:1013C00089FE00F003FE00F06BFD306838600027F6 +:1013D000361D00F08DFE00F0F9FD01F027FFFFF74C +:1013E0004BFF00BD580F000885444F45533E202059 +:1013F00000B500F0B1FD00F0DFFF05444F45533E5E +:10140000361F37600C4FFFF767FF00F0A5FD00F0B7 +:10141000D3FF0161FFF7F4FE00F09EFD00F0CCFF6A +:1014200001620000FFF7FCFE00F096FD00F0C4FF33 +:101430000163000000BD000044130008E813000829 +:10144000C64352454154452000B500F02BFE00F044 +:1014500017FE30683760074600F0E8FEFFF748FFE8 +:1014600000F06EFF00F018FE00BD0000E41200085E +:10147000C73C4255494C445300B500F013FE00F000 +:10148000FFFD30683760074600F0D0FEFFF73EFFF3 +:1014900000F056FF00F000FE00BD00008C130008B5 +:1014A000C8434F4E5354414E5420202000B5FFF7FF +:1014B00039FFFFF747FF361F37607046401E076849 +:1014C00000BD0000A0140008C932434F4E535441E0 +:1014D0004E54202000B5FFF725FF00F009FEFFF76E +:1014E00031FF083E77607046401E076841683160F2 +:1014F00000BD0000C8050008C85641524941424C91 +:101500004520202000B500F08DFDFFF70BFF361FB2 +:101510003760042700F094FDFFF714FF361F376093 +:101520007046401E076800BD40140008C74255467B +:101530004645523A00B500F075FDFFF7B7FF00F0E1 +:101540007FFD00BD2C150008C455534552202020B6 +:1015500000B5FFF7E7FEFFF7F5FE361F3760704670 +:10156000401E07685F4400BD704700004815000832 +:10157000C54445464552202000B500F053FDFFF715 +:10158000D1FE361F3760042700F05AFDFFF7DAFE60 +:101590007046401E006801680122114308BC9E4647 +:1015A0000847000000B500BFFFF7B8FF04000020A7 +:1015B00000B500F05DFC3F68002F80CE05D080CEE6 +:1015C000FFF74EFE00F094FD05E03D4677680836D3 +:1015D00001200543A84700BD00B500F0BDFC00F0A8 +:1015E000EBFE1E496E76616C6964206F70657261F6 +:1015F000746F7220666F72207468697320747970DA +:1016000065000000361F3760014F00F007FF00BD86 +:10161000F3FFFFFF7146491E0868491D8E460760AB +:1016200080CE7047361F37607146491E0868491DD5 +:101630008E46076870470000C8140008C556414C24 +:101640005545202000B5FFF797FE80B480CE00F00E +:10165000E9FCFFF767FE20BC361F37602F4600F01D +:10166000E1FC306838600427361D00F0E9FCFFF724 +:1016700069FE361F37607046401E076811480568CE +:10168000104900200860002DEFF3008001B4361FE0 +:1016900037602F4601BC80F3008806D1361F0A4F01 +:1016A0000A493160FFF784FF0BE0012F06D1361F96 +:1016B000074F08493160FFF77BFF02E0FFF78CFF1F +:1016C00080CE00BD04000020240F0008241600086E +:1016D000480F000814160008380B000882544F20E9 +:1016E0000120014908607047040000206C0F0008C9 +:1016F000C55041555345202000B500BFFFF748FFB6 +:101700000800002000B500F061FC361F3760042798 +:1017100000F078FC00BD202000B500F057FC01204F +:10172000074330683760074600F02CFA00BD2020E0 +:1017300000B500F04BFC00BD0120074300B500F0F0 +:10174000D7FC00BD361F3760034F00B5FFF788FD9B +:10175000FFF7F2FF00BD00009C040008361F376051 +:10176000034F00B5FFF77CFDFFF7E6FF00BD00006B +:10177000A8040008361F3760034F00B5FFF770FD5F +:10178000FFF7C0FF00BD00009C040008361F376053 +:10179000034F00B5FFF764FDFFF7B4FF00BD000085 +:1017A000A8040008361F3760034F00B5FFF758FD47 +:1017B00000F09EFC00BD000080120008361F37605C +:1017C000024F00B5FFF788FD00BD0000600A000869 +:1017D000361F3760024F00B500F09AFC00BD0000D4 +:1017E00000BD0000361F3760044F00B5FFF738FD1D +:1017F000FFF788FFFFF79CFF00BD0000DC04000836 +:10180000361F3760044F00B5FFF72AFDFFF77AFF58 +:10181000FFF78EFF00BD0000F4040008361F37609C +:10182000044F00B5FFF71CFDFFF786FFFFF774FFBD +:1018300000BD0000C0040008361F3760044F00B52B +:10184000FFF70EFDFFF778FFFFF766FF00BD000012 +:10185000CC04000800B500BFFFF760FE0C000020BC +:1018600005480568361F37602F4600B5FFF760FF53 +:1018700001490F6080CE00BD0C000020361F37608C +:10188000034F00B5FFF7ECFCFFF73CFF00BD000085 +:10189000B404000800B5FFF76DFF306837600746F5 +:1018A000FFF73AFF00BD202000B500BF361F3760AC +:1018B000374600F0CDFA3F6830688742EFF300808A +:1018C00001B47768083601BC80F3008802D0FFF7C6 +:1018D00023FFEBE700BD202000B5FFF76FFFFFF708 +:1018E000E3FF02490F6080CE00BD00000C00002025 +:1018F00000B5FFF763FF06480568361F37602F46BF +:10190000FFF720FFFFF7D0FF01490F6080CE00BD39 +:101910000C00002000B5FFF739FF00BDDC16000801 +:10192000C244492072B670477C0B0008C24549206A +:1019300062B67047F00E0008C25B4920EFF31080DA +:1019400072B601B4704700003C160008C2495D2021 +:1019500001BC80F3108870479C0F0008C7534554A2 +:101960004D41534B3D683068C4432C40706804437C +:101970003C60B7680C367047B0090008C7494E494B +:10198000542D494F00B500BF3D68002D04D03D687F +:101990007C682C600837F7E780CE00BD07480568F3 +:1019A0008020054000B508D0054D0648686006480F +:1019B0006860802029698143296100BD10200240B0 +:1019C0000020024023016745AB89EFCD083E134953 +:1019D00031607760124F00B53068451E002DEFF37F +:1019E000008001B4356001BC80F3008804D0FD683C +:1019F00001200540002DEFD1FD6834242C40FC600F +:101A000030680028EFF3008001B42F46361D01BC7A +:101A100080F3008801D10348074300BD0000100097 +:101A2000002002400000008000B5FFF7B7FF084922 +:101A300001200D6805430D603068388077680836EE +:101A4000FFF7C4FF024901200D6885430D6000BD0A +:101A5000102002400B483F1A00B5FFF79FFF0A4DC8 +:101A600002202969014329616F61402029690143EE +:101A7000296180CEFFF7AAFF044902200D68854343 +:101A80000D6000BD00000008002002401020024050 +:101A900000B5FFF7C9FF80CE00BD20203D7830683B +:101AA000854200B502D17768083600BD3D46012168 +:101AB0008D4301200740EFF3008001B42F4601BCA5 +:101AC00080F3008806D031680D023C782C433760E3 +:101AD000274605E07D782D0231680D4337602F469B +:101AE000306837600746FFF7D3FF00BD074D316808 +:101AF0000D40083E3560776000B5FFF7C9FF3168DB +:101B00000D0CBF1C3560FFF7C3FF00BDFFFF0000D9 +:101B1000083E044931607760034F00B5FEF788FC4A +:101B200000BD000000000008000010082019000897 +:101B3000C3432146361F376000B5FFF7E9FF002F8A +:101B400080CE02D0FFF7AAFF03E0306838707768D4 +:101B5000083600BD5C190008C3572146361F3760A0 +:101B600000B5FFF7D5FF002F80CE02D0FFF790FF22 +:101B700003E0306838807768083600BD70140008CC +:101B8000C2214620361F376000B5FFF7C1FF002F86 +:101B900080CE02D0FFF7AAFF03E030683860776894 +:101BA000083600BD38190008C7464C455241534518 +:101BB00030683F1830683760074600B5FEF79AFC7A +:101BC0000B1C0008009D01980544361F37602F4606 +:101BD000FFF79EFF002F80CE09D0009D019805449D +:101BE000361F37602F46FFF735FF084F07E0009D8F +:101BF0000198054406482860361F3760042700987E +:101C0000C019009080CEDDD703B000BD00080000F1 +:101C1000FFFFFFFF083EB1683160776000B5FFF756 +:101C2000C7FF31687D1811480468083E346077604A +:101C30002F46FFF7A7FF30683F1830683760074628 +:101C4000FEF758FC691C00083D68009C019804449C +:101C5000083E356077602746FFF794FF3F1D0098E8 +:101C6000001D0090F0D703B080CE00BD2802000810 +:101C700000B500BFFFF752FC100000202C1900082F +:101C8000C453454C4620202000B500BFFFF765FC3B +:101C900000000000F0160008C253302000B500BF5D +:101CA000FFF75BFC18000000A80E0008C2523020AD +:101CB00000B500BFFFF751FC1C000000801C0008AD +:101CC000C42354494220202000B500BFFFF745FC43 +:101CD000200000004C190008C4275449422020204D +:101CE00000B500BFFFF739FC24000000B013000866 +:101CF000C33E494E00B500BFFFF72FFC280000008F +:101D00007C190008C8584F4E2F584F4646202020B7 +:101D100000B500BFFFF721FC2C0000007413000881 +:101D2000C74543484F494E4700B500BFFFF715FC74 +:101D300030000000440F0008C34F555400B500BFE9 +:101D4000FFF70BFC34000000301B0008C442415375 +:101D50004520202000B500BFFFF7FFFB3800000042 +:101D6000D81C0008C3484C4400B500BFFFF7F5FB82 +:101D70003C000000EC080008C748414E444C455266 +:101D800000B500BFFFF7E9FB40000000C01C0008E1 +:101D9000C344504C00B500BFFFF7DFFB4400000018 +:101DA000AC1C0008C54F50564543202000B500BF6D +:101DB000FFF7D3FB48000000F8140008C54950564F +:101DC0004543202000B500BFFFF7C7FB4C000000D3 +:101DD00000B500BFFFF7C1FB50000000801B0008EA +:101DE000C350414400B500BFFFF7B7FB98000000A7 +:101DF000A41D0008C2424C2000B500BFFFF75BFBEA +:101E000020000000641D0008C546454E43452020C3 +:101E100000B500BFFFF782FB140000204C1D000836 +:101E2000C244502000B500BFFFF778FB1800002027 +:101E3000F41D0008C252502000B500BFFFF76EFB32 +:101E40001C00002000B500BFFFF768FB2000002049 +:101E500000B500BFFFF762FB24000020081E000849 +:101E6000C358445000B500BFFFF758FB28000020BE +:101E700000B500BFFFF752FB2C00002000B500BFEB +:101E8000FFF74CFB3000002000B500BFFFF746FB1A +:101E900034000020041D0008C44C4153542020206D +:101EA00000B500BFFFF73AFB3C00002000B500BFC3 +:101EB000FFF76EFB4000002000B500BF00F05DFFA3 +:101EC000C41E00084C00002000B500BFFFF726FB31 +:101ED00090000020BC1D0008C34B45595D46ED6CC9 +:101EE0002D6800B501200543A84700BD781D0008F6 +:101EF000C44B45593F2020205D46ED6C6D6800B510 +:101F000001200543A84700BD70150008C4454D4990 +:101F1000542020205D46696B491C69635D46AD6CA9 +:101F2000AD6800B501200543A84700BDAC1200080C +:101F3000C4545950452020205D46696BC919696316 +:101F40005D46AD6CED6800B501200543A84700BDB6 +:101F5000981C0008C24352205D46002068635D461D +:101F6000AD6C2D6900B501200543A84700BD0000F8 +:101F7000301F0008C553504143452020361F3760AD +:101F8000202700B5FFF7C6FF00BD00000C1F0008AA +:101F9000C653504143455320002F00DC0027361F15 +:101FA0003760002700B500BFFEF7A4FABF1F000886 +:101FB000FFF7E4FF0098401C0090F9D703B000BD84 +:101FC000201D0008C44845524520202003480568CC +:101FD0002D68361F37602F4670470000280000200C +:101FE000381D0008C34F5247024805682F6080CE55 +:101FF0007047000028000020201E0008C5414C4CFE +:102000004F542020034805682968C919296080CEEB +:102010007047000028000020901D0008C552484568 +:102020005245202002480568361F37602F4670470A +:102030001C000020741F0008C652414C4C4F542015 +:1020400002490868C019086080CE70471C00002053 +:10205000541F0008C3524F4D0148024908607047A1 +:10206000180000202800002054200008C352414DD1 +:1020700001480249086070471C0000202800002029 +:1020800004480568361F37602F4600B5FFF7E4FFA8 +:1020900000BD00002800002001490F6080CE70477D +:1020A00028000020064805680648854201D0002522 +:1020B00001E001256D42361F37602F467047000052 +:1020C0002800002018000020FC1F0008C5414C49D2 +:1020D000474E202000B5FFF779FFFF1C03218F43F7 +:1020E000FFF782FF00BD0000A81B0008C12C2020C4 +:1020F00000B5FFF76BFFFFF745FD361F376004277C +:10210000FFF780FF00BD0000901F0008C2572C2081 +:1021100000B5FFF75BFFFFF721FD361F3760022791 +:10212000FFF770FF00BD00006C200008C2432C20A8 +:1021300000B5FFF74BFFFFF7FDFC361F37600127A7 +:10214000FFF760FF00BD202002480568361F37609A +:102150002F4670473C0000200448056804490D6084 +:102160002D1F2D6801490D60704700003C000020C4 +:10217000900000200248056802490D607047000089 +:10218000900000203C000020581B0008C446494E27 +:10219000442020207D1C3C78083E3560776027462F +:1021A00000B5FEF731FE3D78002D26D0154D2C46AA +:1021B0000834083E346077602F4600BFFEF78EF982 +:1021C000FB2100087D1C3C78009B019803441B68A0 +:1021D0000C3E34607560B7601F46FEF74FFF002F5E +:1021E00000D180CE04D003B031687160361D00BDCF +:1021F0000098001D0090E5D703B0361F3760002718 +:1022000000BD000034000020E01D0008C52E4E4136 +:102210004D4520207D1C3F781F200740361F35602C +:1022200000B5FFF789FEFFF7A9FE00BD361F376036 +:10223000202700B500F0A0FC7D1C3F780C3E3560E7 +:102240007760B560FEF7E0FD3A4805680C3E376000 +:10225000F1687160B7602F46FEF710FF002F80CE47 +:102260000ED0FEF7CDFEFFF777FEFFF7D3FF00F0AD +:10227000A3F80D6973207265646566696E656420F4 +:10228000FFF728FF35682D78ED192A480468236880 +:102290005B1E1D40AD00241D64192568083E346096 +:1022A00077602F46FFF724FFFFF790FE31680F603D +:1022B00077680836FFF78AFE1F490F607068471E6F +:1022C00035686D1C1D480468002CEFF3008001B4D4 +:1022D00077602F46361D01BC80F3008803D0361F7F +:1022E0003760802702E0361F3760C02771680878A2 +:1022F0003843087011490020086070683168471839 +:10230000706877600746361DFEF7F4F82D23000845 +:10231000009D019805442D88361F37602F46FFF732 +:10232000F7FE0098801C0090F2D703B0FFF7D2FEB2 +:1023300000BD0000300000203C0000200000002014 +:10234000002F80CE00B506D0074805682D1D361F2A +:1023500037602F4604E005480568361F37602F4672 +:10236000FFF7C6FE00BD0000180000201C00002082 +:1023700000B5FEF78DFF00BD00B5FEF789FF7D1C9F +:102380003F78361F356000BD00B5FEF781FF30682D +:102390000028EFF3008001B4361D01BC80F30088F3 +:1023A00005D05D462F65034F00F038F800E080CE81 +:1023B00000BD0000FEFFFFFF00B5FEF769FF7D1CBA +:1023C0003F78361F3560FFF7B7FD00BD38200008A5 +:1023D000C543415443482020361F3760374600B577 +:1023E00080B44F4680B45F463F6C80B46F465D4614 +:1023F0002F6435687768083601200543A84720BC5C +:102400005C46256401B001B0361F3760002700BD6F +:102410000C210008C55448524F572020002F00B50A +:1024200001D180CE00BD5D462D6CAD4620BC5C4622 +:10243000256420BCA94620BC80B42F463E1C80CE1B +:1024400080BC00BD2C210008C63F5448524F572085 +:1024500030680028EFF3008001B4361D01BC80F322 +:10246000008800B502D0FFF7D9FF00E080CE00BDA4 +:102470001C2000088641424F5254222000B500F033 +:10248000B5FC361F3760034FFEF726FF00F01AFF3A +:1024900000BD000088230008601E0008C34845589E +:1024A0005D461020A86370479C240008C74445433C +:1024B000494D414C5D460A20A8637047C41F00087F +:1024C000C4484F4C442020205D460448E96B09185D +:1024D000E9635D46ED6B2F7080CE7047FFFFFFFF15 +:1024E000341E0008C12320205D46AD6B361F3760C7 +:1024F0002F4600B5FEF7E6F970680928EFF3008073 +:1025000001B43D46776831687160356001BC80F385 +:10251000008800DDFF1D3037FFF7D6FF00BD00004B +:1025200048240008C223532000B500BFFFF7DCFF9A +:1025300035683D43002DF9D100BD0000D81E0008CC +:10254000C23C23205D4698355C46E5637047000039 +:1025500024250008C2233E205F46FF6B5D46983568 +:10256000ED1B37602F46704774240008C3442E5279 +:1025700000B580B437687068316871603060FEF70C +:102580006FF8FFF7DFFFFFF7CFFF70680028EFF36A +:10259000008001B431687160361D01BC80F3008891 +:1025A00004D5361F37602D27FFF78EFFFFF7D4FFC6 +:1025B00020BCED1B361F37602F46FFF7EDFCFFF701 +:1025C000BBFC00BDCC200008C2442E20361F376063 +:1025D000002700B5FFF7CCFFFFF7D0FC00BD0000DF +:1025E000F01E0008C12E2020FD17361F37602F4631 +:1025F00000B5FFF7EBFF00BD6C250008C2552E208B +:10260000361F3760002700B5FFF7E0FF00BD000070 +:10261000981E0008C22E522000B580B43168CF1732 +:1026200020BC361F37602F46FFF7A2FF00BD000019 +:10263000F01C0008C62B4449474954205D46AD6B49 +:10264000361F7168316077602F4600B5FEF72EF8AF +:102650005F46BF6B3568B16831607168B1607560A5 +:10266000FEF724F8FDF7C2FF5D466D6C6D1C03D0CC +:102670005D46696C491C696400BD00005425000872 +:10268000C73E4E554D424552083E376077600027A1 +:1026900000B500BFFDF72EFFF926000835682D783C +:1026A000361F37602F46FEF7A1FB5D46AD6B361F28 +:1026B00037602F46FEF7F6FC002F01D0002701E01F +:1026C00001277F42002F80CE01D002B000BD3168CB +:1026D000706801B402B40836FFF7B0FF20BC10BC2C +:1026E0000123ED1A1B19083E336077602F460098CE +:1026F000401C0090D2D703B000BD20205D462F487B +:10270000686435682D782D2D01D0002501E0012564 +:102710006D4200B520B4002D04D001257F1B306828 +:102720002D183560012F03DA01B00027361D00BDDA +:10273000083EB1683160002171600021B16000BFC6 +:10274000FFF7A2FF002F22D001257F1B30682D1834 +:10275000356000BF3068451E2D783A2DEFF30080BC +:1027600001B4361F37602F4601BC80F3008801D1C9 +:1027700080CE0BE02E2F04D15F460020786480CEFF +:1027800004E001B00027103600BD80CED8E780BC41 +:10279000002FEFF3008001B47768083601BC80F3A6 +:1027A000008801D0FDF73AFF5D466D6C002D01D524 +:1027B000012702E0361F3760022700BDFFFFFFFF41 +:1027C00000B500BF35682D78242DEFF3008001B4EB +:1027D000361F37602F4601BC80F300880AD10127DD +:1027E0003168CD1B70683F1877602F46361DFFF7A4 +:1027F00057FE1BE0232F0AD101273168CD1B7068DB +:102800003F1877602F46361DFFF754FE0EE0252F48 +:102810000BD101273168CD1B70683F185C46022040 +:10282000A06377602F46361D00E080CE00BD00001B +:1028300034260008C8494E54454745523F202020C1 +:102840007D1C3F78002FEFF3008001B4361F356008 +:1028500001BC80F3008800B510D0083EB16831603B +:102860007760FEF7D1FA5D46AD6B20B4FFF7A8FFA5 +:10287000FFF744FF20BC5C46A56301E00027361D3E +:1028800000BD000080260008C74E554D4245523F0E +:1028900000B500BFFEF77CFE940000205D466D6B26 +:1028A000361F37602F46002F00D180CE00B50FD0E5 +:1028B000361F37600827FFF72DFBFFF75FFB361F3A +:1028C00037600827FFF726FB7F1E5D466F6380CECB +:1028D00000BD2020002F01D1002501E001256D421F +:1028E0005C46246B002C01D1002401E001246442E9 +:1028F0002C4000B506D0FFF7D1FF7F1E361F376092 +:10290000024F02E0361F3760002700BDFFFFFFFFC8 +:10291000306838705F463F6B002F80CE00B502D024 +:10292000FFF7F8FA00E080CE00BD00001426000892 +:10293000822E2220361F3760034F00B5FEF7CCFCF5 +:1029400000F0C0FC00BD0000B8230008C825000846 +:10295000C2242E207D1C3F78361F356000B5FFF75E +:10296000EBFA00BDFC250008C64143434550542006 +:10297000002F00B501D1361D00BD5D46ED6A002D6A +:1029800004D0361F37601127FFF7C4FA30683F18AC +:10299000361F376077680021716000BFFDF7AAFD20 +:1029A0003F2A0008FFF79AFA082F03D180CEFFF7DD +:1029B00091FF3EE0092F0CD1009F01980744361F7C +:1029C00020213160FFF7A4FF7F1C361F37600127ED +:1029D0002FE00A2F01D100272BE00D2F0AD1009FF5 +:1029E00001980744361F20213160FFF791FF02B0A4 +:1029F00000BD1EE00C2F0AD1009F01980744361F2E +:102A000020213160FFF784FF02B000BD11E07F2F6D +:102A100003D180CEFFF75EFF0BE0009D01980544D7 +:102A2000361F37602F46FFF773FF7F1C361F376056 +:102A300001270098C019009080CEB3D703B05D463F +:102A4000ED6A002D04D0361F37601327FFF762FAB6 +:102A500000BD000000B500BFFEF760FD980000203B +:102A600002480568361F37602F46704798000020DF +:102A70005D466D6A5C46246A083E3560776027468D +:102A80007047000050290008C55155455259202073 +:102A90000020094908605D466D6A083E3560776030 +:102AA000FF2700B5FFF764FF5D462F625F460020F9 +:102AB000B86280CE00BD0000980000208828000881 +:102AC000C55041525345202000B580B480CEFFF759 +:102AD000CFFF5D46AD6A7F1B30682D1810BC083EE5 +:102AE00037607560B5602746FEF74CF880B43168F2 +:102AF00070680F1A20BC002D01D1002501E00125CE +:102B00006D427D1B5C46A16A4919A162361D00BD5C +:102B100000B580B480CEFFF7ABFF5D46AD6A7C1B8D +:102B200030682D18009B083E34607560B7601F4602 +:102B3000FEF714F820BC083E3760B16871602F467C +:102B4000FEF720F880B4316870680F1A20BC002DA1 +:102B500001D1002401E0012464426419B1680C1B16 +:102B60005D46AC627168B160083600BDAC240008F7 +:102B7000C4574F524420202000B5FFF7C9FF064834 +:102B80000568361F37602F46FEF762F90248056870 +:102B9000361F37602F4600BD1C00002000B5FFF730 +:102BA000ABF9002F00D100BDFFF798F9202F80CEA0 +:102BB00008D180CEFFF792F9202F01D1002701E044 +:102BC00001277F4200BD2020002F00B501D0014821 +:102BD0003F1A00BD000000085D46983504480468AF +:102BE0002468A4006419083E346077602F4670475B +:102BF00034000020083E002131607760002700B5D6 +:102C0000FFF7EAFFFDF76AFC352C0008009D0198EC +:102C100005442D68AF4208D2009F01980744009DEB +:102C2000019805442D6837602F460098001D0090DC +:102C3000ECD703B0002F01D001483F1800BD80F34E +:102C400000000008104805682D1D361F37602F460C +:102C500000B5FFF7C1FF00BFFDF740FC852C000861 +:102C60003D68361F37602F46FFF7AEFF009D019885 +:102C700005442F6037683F1D361D0098001D0090E9 +:102C8000EED703B080CE00BD34000020C024000881 +:102C9000C5574F524453202000B5FFF75DF9FFF7A9 +:102CA0008BFB06574F52445320000000FFF754F9A6 +:102CB000FFF7C8FFFFF79EFF361F3760FFF76EFF75 +:102CC000002F01D0002701E001277F4231680F402B +:102CD000EFF3008001B47768083601BC80F3008808 +:102CE00012D05D466D6B402D01DDFFF735F9361FC3 +:102CF0003760FFF78FFA3F1F3F68FFF765FF3168C6 +:102D00000F6077680836D5E77768083600BD0000A1 +:102D100034280008C44D4F564520202000B580B40B +:102D2000316870680F1A009DBD4280CE06D920BC64 +:102D3000361F37602F46FEF73BF805E020BC361FF4 +:102D400037602F46FEF716F800BD00001424000877 +:102D5000C5444550544820205D46AD69361F376054 +:102D60002F46361F376037463168CF1B3F1F37600D +:102D7000042700B5FDF774FD00BD7046401E0268D3 +:102D80001268014B1A6000BD340000203068874291 +:102D900001D1002701E001277F423760024F00B5D3 +:102DA000FFF756FB00BD0000EAFFFFFF361F37604C +:102DB000374602490F6080CE704700002400002093 +:102DC000361F3760374607480568BD4201D10027E6 +:102DD00001E001277F42361F3760034F00B5FFF740 +:102DE00037FB00BD24000020EAFFFFFF074805680D +:102DF000002D01D0002501E001256D42083E35601F +:102E00007760034F00B5FFF723FB00BD2C000020C7 +:102E1000F2FFFFFF04480568083E35607760034F06 +:102E200000B5FFF715FB00BD2C0000206DFEFFFF75 +:102E3000882A000882444F2000B5FFF7D7FFFEF72D +:102E4000D1FC361F3760032700BD0000E41F0008D7 +:102E5000833F444F00B5FFF7C9FFFEF7D1FC361F93 +:102E60003760032700BD000030290008844C4F4F15 +:102E70005020202000B5FFF7B9FF361F3760032729 +:102E8000FFF784FFFEF7CAFC00BD00006C2E0008AF +:102E9000852B4C4F4F50202000B5FFF7A7FF361F62 +:102EA00037600327FFF772FFFEF7C6FC00BD000086 +:102EB0006829000885424547494E202000B5FFF7A4 +:102EC00095FFFEF735FC00BD342E000885414741D3 +:102ED000494E202000B5FFF789FFFEF733FC00BD07 +:102EE0008C21000885554E54494C202000B5FFF731 +:102EF0007DFFFEF733FC00BD902C00088557484944 +:102F00004C45202000B5FFF771FFFEF73FFC30680D +:102F10003760074600BD0000D023000886524550A8 +:102F20004541542000B5FFF761FFFEF70BFCFEF7AB +:102F3000F3FB00BD702B00088249462000B5FFF767 +:102F400055FFFEF723FC00BD1C2F000884544845A4 +:102F50004E20202000B5FFF749FFFEF7DDFB00BD46 +:102F6000502D000884454C534520202000B5FFF724 +:102F70003DFFFEF7FFFB306837600746FEF7CCFBEE +:102F800000BD0000B42E000884434153452020209A +:102F900000B5FFF72BFF06480568361F37602F4640 +:102FA000FEF75EFCFFF702FF361F3760042700BD07 +:102FB00024000020142D0008824F4620361F376061 +:102FC000042700B5FFF7E2FEFEF758FC361F376016 +:102FD000052700BD502E0008833F4F46361F37603F +:102FE000042700B5FFF7D2FEFEF794FC361F3760CA +:102FF000052700BDE42E000885454E444F4620209D +:10300000361F3760052700B5FFF7C0FEFEF742FC0C +:10301000361F3760042700BDFC2E000887454E444C +:1030200043415345361F3760042700B5FFF7AEFE16 +:10303000FEF752FC01490F6080CE00BD2400002045 +:10304000CC2E0008884E455854434153452020203B +:10305000361F3760042700B5FFF798FEFEF748FCDF +:1030600001490F6080CE00BD24000020642F0008BD +:10307000875245435552534505480568361F37600A +:103080002F4600B5FDF7ACFFFEF726F900BD0000A6 +:103090003C000020361F376037465D46AD69BD42B3 +:1030A00001D3002701E001277F42361F3760024F1E +:1030B00000B5FFF7CDF900BDFCFFFFFF002F01D0E9 +:1030C000002701E001277F42361F3760024F00B51D +:1030D000FFF7BEF900BD0000F3FFFFFF4C2F000813 +:1030E00088504F5354504F4E45202020361F376094 +:1030F000202700B5FFF740FDFFF74CF8361F37607B +:10310000FFF7DCFF0120C74280CE04D100F060F859 +:10311000361F3760014FFEF7DFF800BDD8120008F8 +:10312000C02A00088253222010480568002D00B5EF +:1031300007D0361F37600E4FFEF7CEF800F0C2F80A +:1031400013E0361F37602227FFF7BEFC5D46983537 +:10315000361F37602F46FDF77BFE5D4698356C1CA9 +:103160002D78083E346077602F4600BD2C0000208B +:103170007823000824310008824322200F48056884 +:10318000002D00B507D0361F37600D4FFEF7A4F8AD +:1031900000F098F810E0361F37602227FFF794FC04 +:1031A0005D469835361F37602F46FDF751FE5D4668 +:1031B0009835361F37602F4600BD00002C000020D8 +:1031C000702300080C220008874C49544552414C9A +:1031D00000B5FEF7E7FA00BD882F0008C443484158 +:1031E00052202020361F3760202700B5FFF7C4FC8F +:1031F0007F7800BDB82F0008865B434841525D20B0 +:1032000000B5FFF7F3FDFFF7EDFFFFF7E1FF00BDAE +:103210001C300008815B20200149002008607047B5 +:103220002C00002040250008C15D2020024901201B +:1032300040420860704700002C000020E030000889 +:10324000C1272020361F3760202700B5FFF794FCE8 +:10325000FEF7A0FFFFF732FF00BD00002832000894 +:10326000835B275D00B5FFF7EDFFFFF7B1FF00BD02 +:10327000E4240008895B434F4D50494C455D2020B4 +:1032800000B5FFF7DFFFFEF727F800BD703000083C +:1032900081282020361F3760292700B5FFF76CFCF6 +:1032A00080CE00BDEC200008815C2020361F3760F6 +:1032B000002700B5FFF760FC80CE00BD7432000827 +:1032C000C2222C20361F3760222700B5FFF754FC9E +:1032D0003D786D1CED19361F356000BFFDF70AF90A +:1032E00001330008009D019805442D88361F376082 +:1032F0002F46FEF70DFF0098801C0090F2D703B018 +:10330000FEF7E8FE00BD202000B520BCE41D03212F +:103310008C4310B42D682F6080CE00BD382F00087C +:103320008249532000B5FFF78DFFBF680848056844 +:10333000002D07D0361F3760064FFDF7CDFFFEF793 +:10334000D7FE03E0306838607768083600BD0000BB +:103350002C000020083300089032000884455849AA +:103360005420202000B5FFF741FDFEF731FA00BDE3 +:1033700014320008813B202000B5FFF737FDFFF72E +:103380001FFDFEF725FAFEF7F5FEFFF745FF00BD2E +:10339000D82F0008C9494E54455250524554202058 +:1033A00000B500BFFFF776FE361F37602027FFF716 +:1033B000E3FB3D78002D3FD0FEF7ECFE002F00D15F +:1033C00080CE13D0002F01D4002701E001277F42D7 +:1033D0001A4805683D4080CE02D0FDF77DFF04E02D +:1033E0003D4680CE01200543A84724E0FFF750FA70 +:1033F000002F01D0361F3760FFF760FE0F480568C9 +:10340000002D17D0012F03D180CEFEF7CBF910E0AD +:10341000022F08D1776831687160361DFEF7C2F956 +:10342000FEF7C0F905E0361F3760054FFEF7F6FFDF +:1034300080CE00E080CEB5E780CE00BD2C0000201D +:10344000F3FFFFFFA8320008C84556414C554154D0 +:10345000452020205D466D6A00B520B45D462D6A8A +:1034600020B45D46AD6ABD4201DB002701E00127C3 +:103470007F421048056820B45D462F625F46306881 +:1034800078620D480B4908605F460020B8620B4F18 +:10349000361DFEF7A1FF20BC06490D6020BC5C462E +:1034A000A56220BC5C46256220BC5C466562FEF7D6 +:1034B000B5FF00BD98000020FFFFFFFFA03300080C +:1034C00000B500BF002F01D180CE29E00120C74206 +:1034D00001D180CE24E00220C74208D15F463F6D73 +:1034E0007D1C3F78361F3560FEF726FD18E00D2065 +:1034F000C7420AD180CEFEF75FFF0C697320756E5C +:10350000646566696E6564000AE0FEF755FF0B545A +:1035100068726F7720636F6465200000FFF764F8BE +:1035200000BD000078310008C451554954202020C6 +:103530005D460020E8625D4601204042286300208D +:103540002E49086000B5FFF767FE00BF5D46ED69D4 +:10355000AD465D462D6B002D01D0FEF7FDFCFFF75B +:1035600097FA361F3760264FFEF736FF002F24D11B +:1035700024480768002F01D0002701E001277F427F +:103580005D462D6B002D01D1002501E001256D4226 +:103590003D4080CE10D0FEF70FFF03206F6B000080 +:1035A000FFF7DAFB002F00D180CE05D0FEF704FF35 +:1035B000012D0000FFF718F81EE0FFF781FF5D46C0 +:1035C000AD69361F37602F463E1C80CEFFF724FEC4 +:1035D000FEF7C2FCFFF74CFAFEF7AEFCFEF7BCFCB0 +:1035E0005D46AD6A6D1E361F37602F46FEF7D4FC70 +:1035F000FEF7E2FE015E0000A8E700BD9800002093 +:10360000A03300082C000020A44900088005000811 +:1036100074330008C9434F4C44434841494E20206D +:1036200000B500BFFDF77AFF9C000020DC310008E8 +:10363000C64154434F4C442000B5FEF74BFDFEF706 +:10364000C5FC054805682F6003490F600027FEF799 +:103650004FFDFEF74DFD00BD9C000020C03200086C +:10366000CD57414C4B434F4C44434841494E202099 +:10367000361F3760054F00B5002F05D07D6801204B +:103680000543A8473F68F7E780CE00BD083600082D +:10369000361F3760004F01E0807D000800B500BF95 +:1036A0003D68002D0FD03D460C353C687B680C3ED4 +:1036B00033607560B7602746FDF75CFB3D68ED1928 +:1036C0000C352F46ECE75F461837083E3760144943 +:1036D00071601027FDF74EFB5D46AD69361F376000 +:1036E0002F463E1C80CE5D460E4868625D46002037 +:1036F00028640C3E0C4931600C497160B76010279A +:10370000FDF738FB00200A490860FEF7D3FE094D9B +:1037100009490D6009490D6000200949086000BD94 +:10372000F8010008203C00201400002018020008C6 +:10373000980000204C0000203400002030000020C1 +:1037400038000020C8310008C52E465245452020CB +:1037500000B5FEF701FC1548056815494D1B361FDD +:1037600037602F46FEF74CFFFEF726FE1062797495 +:103770006573206672656520466C617368000000A1 +:10378000FEF7EAFB04F0DAFA0A4805687F1BFEF749 +:1037900037FFFEF711FE0E6279746573206672655D +:1037A000652052414D00000000BD000018000020BF +:1037B00000F001081C0000205C330008C6434F4D98 +:1037C0004D495420002F00B500D1074F0120074379 +:1037D00006490F60083E7C27054931600549716044 +:1037E000FEF718FA00BD0000800500084000002028 +:1037F00000F8010814000020F82F0008C5454D50BE +:1038000054592020083E0849316077607C2700B574 +:10381000FEF7CEF9083E054931607760044FFEF7A8 +:10382000C7F900F081F800BD00F8010800C00008E9 +:1038300000F0000030360008C4434F4C44202020E4 +:1038400000B5FFF725FF01F0D7FC01F0DDF95D467B +:10385000AF6480CE01F0D8F95D46EF6480CE01F010 +:103860000FFF0C3E2749316027497160B7607C2704 +:10387000FEF7D0F9254805680120C54201D1002492 +:1038800001E001246442002D01D1002501E0012561 +:103890006D4225400ED01E4805681E480468AC42A3 +:1038A00008D10C3E1849316018497160B7607C2717 +:1038B000FDF760FAFEF70EFC174805682D68012039 +:1038C000C54201D0FFF79EFFFFF7D2FEFEF744FB93 +:1038D00002F0E0F9FFF73CFFFEF7E8FAFEF73CFBE9 +:1038E000FEF73AFBFEF768FD0420206F6B00000036 +:1038F0005D46AD69361F37602F463E1C80CEFFF710 +:1039000017FE00BD00F001081400002000F80108B7 +:10391000280200087CF80108180000204032000846 +:10392000C65245424F4F542072B6054901200D68DA +:1039300005430D6003480449086000B5FEE700BD7B +:1039400024100240CCCC000000300040F0B54046CE +:10395000494652465B460FB46946F0398B460A1C0D +:10396000F03A95460E46083E341F8C616846C861A1 +:10397000FCF706FE6946F031F0318D460FBC8046FB +:10398000894692469B46F0BD902E0008C7494E548A +:103990003E4249541F253D400124AC407F09BF00F1 +:1039A000361F346070470000FC370008C5454E499B +:1039B0004E5420200F2F00B50BD9103FFFF7EAFF20 +:1039C00005483F1805483F18306838607768083662 +:1039D00000BD80CE00BD000000E000E0000100005E +:1039E000AC390008C6444953494E54200F2F00B546 +:1039F0000BD9103FFFF7CEFF05483F1805483F1889 +:103A0000306838607768083600BD80CE00BD0000A1 +:103A100000E000E080010000BC370008C6534554B8 +:103A2000505249200F2F00B509D9103F05483F18C3 +:103A300005483F18306838707768083600BD80CE7A +:103A400000BD000000E000E0000400002039000894 +:103A5000C55357494E5420200F2F00B50BD9103FA6 +:103A6000FFF798FF05483F1805483F183068386051 +:103A70007768083600BD80CE00BD000000E000E0A1 +:103A800000020000503A0008C92F415050465241F0 +:103A90004D45202000B500BFFDF70DFD20000000C2 +:103AA00020330008C64558412E52302000B500BFD3 +:103AB000FFF7FFFF00000000A43A0008C645584188 +:103AC0002E52312000B500BFFFF7FFFF04000000B9 +:103AD000BC3A0008C64558412E52322000B500BFFE +:103AE000FFF7FFFF08000000D43A0008C645584120 +:103AF0002E52332000B500BFFFF7FFFF0C0000007F +:103B000014360008C74558412E52313200B500BF67 +:103B1000FFF7FFFF10000000043B0008C7455841B5 +:103B20002E52313400B500BFFFF7FFFF1400000034 +:103B3000EC3A0008C64558412E50432000B500BF5E +:103B4000FFF7FFFF180000001C3B0008C745584165 +:103B50002E50535200B500BFFFF7FFFF1C000000BE +:103B60001C3A0008CA2F4D41494E4652414D45204E +:103B700000B500BFFDF79FFC24000000343B0008A7 +:103B8000C645584D2E52342000B500BFFFF7FFFF49 +:103B900000000000803B0008C645584D2E523520DD +:103BA00000B500BFFFF7FFFF04000000983B0008CE +:103BB000C645584D2E52362000B500BFFFF7FFFF17 +:103BC00008000000B03B0008C645584D2E52372073 +:103BD00000B500BFFFF7FFFF0C000000C83B000866 +:103BE000C645584D2E52382000B500BFFFF7FFFFE5 +:103BF00010000000E03B0008C645584D2E52392009 +:103C000000B500BFFFF7FFFF140000004C3B0008A9 +:103C1000C745584D2E52313000B500BFFFF7FFFFAA +:103C200018000000103C0008C745584D2E52313195 +:103C300000B500BFFFF7FFFF1C000000E4250008EF +:103C4000CA45584D2E4558435245542000B500BF33 +:103C5000FFF7FFFF2000000044300008C72F455841 +:103C60004441544100B500BFFDF725FC140000009D +:103C7000403C0008CA4558442E523133464C54202B +:103C800000B500BFFFF7FFFF000000008C390008FF +:103C9000CB4558442E5231334D41494E00B500BFFB +:103CA000FFF7FFFF0400000048370008CE455844E6 +:103CB0002E52313350524F434553532000B500BF6D +:103CC000FFF7FFFF08000000F8310008CC4558441A +:103CD0002E523133535441544520202000B500BFAB +:103CE000FFF7FFFF0C000000743C0008CA45584471 +:103CF0002E4C524D41494E2000B500BFFFF7FFFF4B +:103D000010000000F83B0008C645584441544120CB +:103D100000B500BFFDF7CFFB4C360020164BEFF38C +:103D200008805860EFF30981996072461A61042097 +:103D3000024201D1586800E0986818604046494640 +:103D400052465B460FB5F0B40B4B6846D860F8B0EE +:103D50006846F03083460646083E341F8461694653 +:103D6000C161FCF70DFC78B0F0BC0FBC8046894601 +:103D700092469B4600BD00004C360020AC3C00083B +:103D8000C52E4954454D20203D68361F37602F46CB +:103D900000B501F0BFFAFEF7F1F83F1D00BD0000CD +:103DA00060360008C62E4954454D5320361F3760F3 +:103DB000002700B5FCF79EFBCB3D0008FFF7E4FFB2 +:103DC0000098401C0090F9D703B000BD643B000888 +:103DD000C84150504954454D5320202002480568A1 +:103DE000361F37602F4670474C3600205C3C000879 +:103DF000C94D41494E4954454D532020024805685C +:103E0000361F37602F467047583600203838000874 +:103E1000C64150505253502000B5FFF7DFFF203706 +:103E200000BD0000103E0008C641505050535020C5 +:103E300000B5FFF7E3FFBF6800BD0000F03D0008DC +:103E4000C54150505550202000B5FFF7D7FFFF69FE +:103E500000BD0000283E0008C6415050544F53207A +:103E600000B5FFF7CBFFFF6800BD0000403E000833 +:103E7000C54150505043202000B5FFF7AFFFBF6948 +:103E800000BD0000583E0008C92E464C5446524121 +:103E90004D45202000B5FFF7A1FFFEF75DF8FEF7C6 +:103EA0008BFA113D3D3D20526567697374657273ED +:103EB000203D3D3DFEF750F8FEF77EFA0650535286 +:103EC000203D2000FD69361F37602F4601F022FAA1 +:103ED000FEF742F8FEF770FA06523020203D20002F +:103EE000083E376077600427FFF760FF80CEFFF75A +:103EF00085FFFEF731F8FEF75FFA06523420203DC9 +:103F000020000000361F37600427FFF74FFFFEF741 +:103F100023F8FEF751FA06523820203D2000000019 +:103F2000361F37600427FFF741FF80CEFFF756FFAB +:103F3000FEF712F8FEF740FA06523132203D20001B +:103F40003D461035361F37602F46FFF71DFF376897 +:103F5000203701F0DFF9FEF711F81437361F37600C +:103F60000227FFF723FF80CE00BD0000803D000840 +:103F7000C54E414D453F2020FD1C03218D43AF42DE +:103F800000B501D0002700BD7D1C3F789F243C4038 +:103F9000103E812131607460B760F560A027FCF7A6 +:103FA00047FA002F80CE02D10027361D00BD1F200A +:103FB000074030683F18306837600746FCF79AFAC8 +:103FC000F73F0008009D019805442D780C3E212103 +:103FD00031607560B7607F27FCF72AFA002F80CE2A +:103FE00004D103B0361F3760002700BD0098401C85 +:103FF0000090E7D703B0361F3760014F00BD0000C7 +:10400000FFFFFFFFEC3C0008C649503E4E464120F2 +:10401000BF1E00B5361F3760FFF7AEFF002F80CE02 +:1040200001D17F1EF6E700BD903C0008CD43484516 +:10403000434B2D414C49474E45442020FD1C032154 +:104040008D43AF4200B50CD0FEF7B6F90D284D698F +:1040500073616C69676E656429200000FF1C032191 +:104060008F4300BD703E0008C73F434C4950333278 +:1040700030683D1A802D00B510D937688037FDF7BC +:104080006BFFFEF799F913436C69707065642074D7 +:104090006F203332206974656D73000000BD00002D +:1040A00068400008C82E52534641554C54202020E9 +:1040B00000B5FDF751FFFFF7AFFEFDF74DFFFEF72F +:1040C0007BF906525350203D20000000361F376018 +:1040D00001F020F9FDF752FFFFF7B0FFFFF7B4FE44 +:1040E000FF69FEF769F90720205230203D200000CB +:1040F000361F376001F00EF9FDF740FFFFF79EFF16 +:104100003F1FFDF729FFFEF757F9192D2D2D2052DE +:10411000657475726E20737461636B20686967687B +:10412000202D2D2DFFF7A4FFFCF7E4F98D410008A9 +:10413000FDF712FF009D01980544361F37602F469A +:1041400001F0E8F8FDF71AFF009D019805442D687D +:10415000083E356077602F4601F0DCF8FDF70EFF72 +:104160000C3E144931607760B760134FFCF760F97B +:10417000002F80CE04D0FFF74BFFFEF74BF800E096 +:1041800080CE0098001F0090D2D703B0FDF7E4FE68 +:10419000FEF712F9192D2D2D2052657475726E20BF +:1041A000737461636B206C6F77202D2D2D200000C0 +:1041B00000BD00003402000800C00008A440000850 +:1041C000C82E50534641554C5420202000B5FDF7D1 +:1041D000C3FEFFF72DFEFDF7BFFEFEF7EDF806501C +:1041E0005350203D20000000361F376001F092F848 +:1041F000FDF7C4FEFFF722FFFFF726FEBF69FEF7BB +:10420000DBF80720205330203D200000361F3760A8 +:1042100001F080F8FDF7B2FEFFF710FF3D1D30689A +:10422000854212D277680836FDF796FEFEF7C4F88D +:10423000164461746120737461636B20756E6465EC +:1042400072666C6F7765640000BD3D1D3068854205 +:104250000FD177680836FDF77FFEFEF7ADF8104402 +:1042600061746120737461636B20656D7074790093 +:1042700000BD30683D1AF02D11D977680836FDF77A +:104280006BFEFEF799F815446174612073746163E5 +:104290006B206F766572666C6F77656400BDFDF7A5 +:1042A0005BFEFEF789F8172D2D2D204461746120E7 +:1042B000737461636B2068696768202D2D2D000081 +:1042C0003068874221D03F1FFFF7D2FEFCF706F986 +:1042D00009430008FDF740FE009D01980544361F84 +:1042E00037602F4601F016F8FDF748FE009D019853 +:1042F00005442D68361F37602F4601F00BF80098F3 +:10430000001F0090E6D703B001E077680836FDF79C +:1043100023FEFEF751F8172D2D2D204461746120E6 +:10432000737461636B206C6F77202D2D2D2000003E +:10433000FDF712FEFEF740F80972544F532F523723 +:1043400020200000FFF78CFD00F0E4FF00BD00001E +:10435000283C0008C953484F574641554C5420202B +:1043600000B500F051FC03F0F7FC00F09BFBFEF7FA +:10437000A1F8FDF7F1FDFDF7EFFDFEF71DF80A4589 +:104380007863657074696F6E20000000EFF3058537 +:10439000361F37602F46FEF727F9FEF70DF8036149 +:1043A00074200000FFF768FD00F0B4FFFFF772FD16 +:1043B000FFF77EFEFFF70AFFFDF7CEFDFDF7FCFFDE +:1043C0001552657374617274696E672073797374C2 +:1043D000656D202E2E2E0000FFF7A6FA361F3760DF +:1043E000002700BD164BEFF308805860EFF30981FA +:1043F000996072461A610420024201D1586800E0B7 +:10440000986818604046494652465B460FB5F0B47E +:104410000B4B6846D860F8B06846F03083460646D5 +:10442000083E341F84616946C161FFF799FF78B087 +:10443000F0BC0FBC8046894692469B4600BD0000FA +:104440004C360020164BEFF308805860EFF30981DB +:10445000996072461A610420024201D1586800E056 +:10446000986818604046494652465B460FB5F0B41E +:104470000B4B6846D860F8B06846F0308346064675 +:10448000083E341F84616946C161FFF769FF78B057 +:10449000F0BC0FBC8046894692469B4600BD00009A +:1044A0004C36002048340008CA53454C494F2D5320 +:1044B000455231201A4D2C463034103E03213160D4 +:1044C00000217160B560F760274600B5FDF74AFA34 +:1044D00014487969014379611248B96A8143B96224 +:1044E0001148B9690143B9610F48F9688143F9601E +:1044F0000E4801B4009F3F1C083E0D4931600D4934 +:104500007160FDF72FFA20BC24350C3E0A4931605A +:104510000A497160B7602F46FDF724FA00BD00001C +:1045200000100240000002000040000000000048AF +:1045300000003C0000002800F00F00001001000007 +:10454000A43D0008C450494F3A20202000B5FCF794 +:104550007BFF31688D020B482D18361F37602F46C0 +:10456000FDF7C6FD0125BD40361F37602F46FDF71C +:10457000BFFD31684D013D432F46361DFDF7B8FDA7 +:1045800000BD00000000004894330008C2504120E4 +:1045900000B500BFFCF78FFF000000008C4500084D +:1045A000C250422000B500BFFCF785FF01000000AB +:1045B000A0450008C250432000B500BFFCF77BFFB8 +:1045C00002000000B4450008C250442000B500BFFE +:1045D000FCF771FF03000000C8450008C2504520E9 +:1045E00000B500BFFCF767FF04000000DC450008D1 +:1045F000C250462000B500BFFCF75DFF050000007B +:10460000D03D0008C653455450494E203D687F6850 +:104610002F8380CE7047000004460008C6434C52EA +:1046200050494E203D687F686F8380CE7047000000 +:10463000A8440008C647455450494E203D687F684D +:104640002D693D40002D01D1002701E001277F4267 +:10465000012007407047202003200740BD003D4354 +:104660002F012F433D023D432F042F43704720204D +:104670000F2007407F000325BD402F4670472020B4 +:1046800030683760074600B5FFF7E6FF30683760EF +:104690000746FFF7EDFF35683D40356000BD20203F +:1046A000BD680F200540361F7168316077602F4666 +:1046B00000B5FFF7E5FF75682D68316871603760F8 +:1046C0002F4600BDF0450008C9495350494E4D4F93 +:1046D0004445202000B5FFF7E3FF3F1CFDF742F9FA +:1046E00000BD20200F2007403D013D432F022F43F6 +:1046F0003D043D432F46704707253D40AD000F2444 +:10470000AC40082007407F08361F346070472020E7 +:1047100030683760074600B5FFF7E4FF3068376060 +:104720000746FFF7E9FF80B4376871680F4020BC87 +:1047300077602F4600BD0000C8460008C9494E50AA +:1047400055544D4F4445202000B500BFFCF7B3FE43 +:10475000000000001C460008CA4F55545055544DE7 +:104760004F44452000B500BFFCF7A5FE0100000046 +:10477000883E0008C641464D4F44452000B500BF65 +:10478000FCF799FE02000000083D0008CA414E41B6 +:104790004C4F474D4F44452000B500BFFCF78BFE02 +:1047A000030000002C400008C74953494E5055549F +:1047B000361F0021316000B5FFF78CFF00BD0000FF +:1047C000CC3C0008C849534F555450555420202024 +:1047D000361F0121316000B5FFF77CFF00BD0000EE +:1047E000703F0008CA495346554E4354494F4E2026 +:1047F00000B580B4009F361F02213160FFF76AFFC9 +:10480000009DAD680F200540361F37602F46FFF72B +:104810007FFF20BC2D682035ED192F46FDF7A2F84B +:1048200000BD0000C4470008C84953414E414C4FE9 +:1048300047202020361F0321316000B5FFF74AFFD3 +:1048400000BD0000A8470008C7495350494E4F44D7 +:1048500030680028EFF3008001B4361D01BC80F3FE +:10486000008800B506D03D687F6869683943696093 +:1048700080CE05E03D687F686968B943696080CE95 +:1048800000BD00003C470008C9495350494E5055EF +:104890005044202000B5FFF703FF0C37FDF762F806 +:1048A00000BD000074470008C94E4F5450554C4C91 +:1048B00045442020361F0021316000B5FFF7EAFF94 +:1048C00000BD0000883A0008C850554C4C4544557E +:1048D00050202020361F0121316000B5FFF7DAFF9C +:1048E00000BD0000E4390008CA50554C4C45444412 +:1048F0004F574E20361F0221316000B5FFF7CAFF27 +:1049000000BD0000E4470008CA495350494E5350C7 +:104910004545442000B5FFF7C3FE0837FDF722F8F0 +:1049200000BD000044450008C84C4F575350454552 +:104930004420202000B500BFFCF7BDFD00000000B2 +:10494000C8480008CB4D454449554D535045454452 +:1049500000B500BFFCF7AFFD0100000028480008CB +:10496000C9484947485350454544202000B500BF39 +:10497000FCF7A1FD0300000060490008C8494E494A +:10498000544750494F202020044D054C696921436C +:104990006961A96AA143A962704700000010024042 +:1049A00000007E0034570008884900087C49000850 +:1049B000C9285345524B45593F292020FF692020E3 +:1049C0000740704748480008C8285345524B45598E +:1049D0002920202000B500BFFD6920200540002DC2 +:1049E00002D1FCF789FEF7E77F6AFF20074000BD90 +:1049F000B0490008C928534552454D495429202043 +:104A000000B500BFFD6980200540002D02D1FCF7F4 +:104A100073FEF7E73068B8627768083600BD0000BB +:104A2000F4490008C92853455254595045292020BB +:104A3000706831684518706877600746356000B562 +:104A4000FBF758FD654A0008009D019805442D7844 +:104A5000083E35607760FFF7D3FF0098401C009058 +:104A6000F2D703B080CE00BD08400008C7285345E8 +:104A700052435229083E0D213160776000B5FFF79F +:104A8000BFFF361F0A213160FFF7BAFF00BD0000EB +:104A900044490008CD2B4641554C54434F4E534F8B +:104AA0004C4520207047000088480008CA28494E1D +:104AB00049542D5345522920002038600020786049 +:104AC0000020B8603068F8600C2038600D20386035 +:104AD0007768083670470000E8480008C55541521D +:104AE0005431202000B500BFFCF7E5FC0038014040 +:104AF000AC4A0008C9494E49542D53455231202033 +:104B000000B5FFF7D7FC083E034931607760034FDB +:104B1000FFF7D2FF00BD0000E204000000380140B2 +:104B20008C470008C85345524B45593F312020203F +:104B3000361F3760024F00B5FFF740FF00BD000091 +:104B400000380140DC4A0008C75345524B455931F3 +:104B5000361F3760024F00B5FFF73CFF00BD000075 +:104B600000380140244B0008C8534552454D495474 +:104B700031202020361F3760024F00B5FFF740FF7D +:104B800000BD000000380140684B0008C853455282 +:104B90005459504531202020361F3760024F00B550 +:104BA000FFF746FF00BD00000038014058470008ED +:104BB000C653455243523120361F3760024F00B56D +:104BC000FFF758FF00BD0000003801408C4B000883 +:104BD000C8434F4E534F4C453120202000B500BFF5 +:104BE000FCF769FCE84B0008504B0008304B00080C +:104BF000744B0008984B0008B84B0008484B00085D +:104C0000C7434F4E534F4C4500B500BFFCF753FC14 +:104C1000E84B0008004C0008C55541525432202092 +:104C200000B500BFFCF747FC0044004034460008D4 +:104C3000CA53455232434C4F434B53200F4D2C46E1 +:104C40003034103E0E49316000217160B560F7606C +:104C5000274600B5FCF786FE0A4879690143796169 +:104C60000848B96A8143B9620648F9690143F961A4 +:104C7000044839698143396180CE00BD001002408B +:104C80000000030000000200A8480008C354583286 +:104C900000B500BFFCF70FFC9C4C0008000000486A +:104CA000040000000200000028350008C3525832FA +:104CB00000B500BFFCF7FFFBBC4C0008000000483B +:104CC0000800000003000000C8490008CD53455209 +:104CD0003246554E4354494F4E532020083E012141 +:104CE00031607760054F00B5FFF782FD083E012176 +:104CF00031607760024FFFF77BFD00BD9C4C0008E0 +:104D0000BC4C0008304C0008CA53454C494F2D5349 +:104D10004552322000B5FFF791FFFFF7DFFF00BDDE +:104D2000F44A0008C9494E49542D534552322020B7 +:104D300000B5FFF7EFFF083E342131607760024F86 +:104D4000FFF7BAFE00BD000000440040D04B000851 +:104D5000C85345524B45593F32202020361F3760FB +:104D6000024F00B5FFF72AFE00BD000000440040DE +:104D7000184C0008C75345524B455932361F37600F +:104D8000024F00B5FFF726FE00BD000000440040C2 +:104D9000504D0008C8534552454D495432202020FB +:104DA000361F3760024F00B5FFF72AFE00BD000036 +:104DB00000440040944D0008C85345525459504592 +:104DC00032202020361F3760024F00B5FFF730FE3B +:104DD00000BD000000440040B04B0008C6534552DF +:104DE00043523220361F3760024F00B5FFF742FEB4 +:104DF00000BD000000440040B84D0008C8434F4EBD +:104E0000534F4C453220202000B500BFFCF753FB28 +:104E1000144E00087C4D00085C4D0008A04D0008B1 +:104E2000C44D0008E44D0008744D0008C5554152BA +:104E30005433202000B500BFFCF73DFB0048004084 +:104E40008C4C0008C354583300B500BFFCF733FB4B +:104E5000544E000800080048100000004400000004 +:104E6000AC4C0008C352583300B500BFFCF723FB1D +:104E7000744E000800080048000800004B000000C5 +:104E8000084D0008CA53454C494F2D534552332015 +:104E9000154D2C463034103E1449316000217160AC +:104EA000B560F760274600B5FCF75CFD10487969EE +:104EB000014379610E48B96A8143B9620D48F969C5 +:104EC0000143F9610B48396981433961361F0A4F43 +:104ED00001213160FFF78CFC083E012131607760D1 +:104EE000064FFFF785FC00BD0010024000000C00DB +:104EF0000000080000000400544E0008744E000832 +:104F0000244D0008C9494E49542D534552332020A1 +:104F100000B5FFF7BDFF083E034931607760034FDE +:104F2000FFF7CAFD00BD0000A101000000480040DD +:104F3000FC4D0008C85345524B45593F33202020B3 +:104F4000361F3760024F00B5FFF738FD00BD000087 +:104F5000004800402C4E0008C75345524B4559337A +:104F6000361F3760024F00B5FFF734FD00BD00006B +:104F700000480040344F0008C8534552454D49543D +:104F800033202020361F3760024F00B5FFF738FD71 +:104F900000BD000000480040784F0008C85345524B +:104FA0005459504533202020361F3760024F00B53A +:104FB000FFF73EFD00BD000000480040DC4D00084A +:104FC000C653455243523320361F3760024F00B557 +:104FD000FFF750FD00BD0000004800409C4F000856 +:104FE000C8434F4E534F4C453320202000B500BFDF +:104FF000FCF761FAF84F0008604F0008404F0008C6 +:10500000844F0008A84F0008C84F0008584F0008F8 +:10501000C55541525434202000B500BFFCF74BFA6F +:10502000004C0040644E0008C352583400B500BF25 +:10503000FCF741FA38500008000000480200000068 +:1050400001000000444E0008C354583400B500BFAE +:10505000FCF731FA5850000800080048000400002E +:105060004A000000844E0008CA53454C494F2D5356 +:1050700045523420144D154869690143696113484C +:10508000A96A8143A96212486969014369611048AC +:10509000A96A8143A9620D48E9690143E9610B48A6 +:1050A000296981432961083E042131607760094FF5 +:1050B00000B5FFF79DFB083E002131607760064F89 +:1050C000FFF796FB00BD0000001002400000080042 +:1050D000000002003850000858500008044F000833 +:1050E000C9494E49542D53455234202000B5FFF78D +:1050F000C1FF083E034931607760034FFFF7DCFCD6 +:1051000000BD0000A1010000004C0040E04F00087D +:10511000C85345524B45593F34202020361F376035 +:10512000024F00B5FFF74AFC00BD0000004C0040F4 +:1051300010500008C75345524B455934361F37604D +:10514000024F00B5FFF746FC00BD0000004C0040D8 +:1051500010510008C8534552454D49543420202071 +:10516000361F3760024F00B5FFF74AFC00BD000054 +:10517000004C004054510008C85345525459504502 +:1051800034202020361F3760024F00B5FFF750FC57 +:1051900000BD0000004C0040C04F0008C6534552FF +:1051A00043523420361F3760024F00B5FFF762FCD0 +:1051B00000BD0000004C004078510008C8434F4E2D +:1051C000534F4C453420202000B500BFFCF773F945 +:1051D000D45100083C5100081C51000860510008DF +:1051E00084510008A4510008244A0008C8494E49C7 +:1051F000542D53455220202000B5FFF781FCFFF7C6 +:1052000097FDFFF785FEFFF771FF00BD34510008E1 +:10521000C753455442415544361F7068776007466E +:105220000549316000B5FBF71BFB7F1C7F08356823 +:10523000EF607768083600BD00D8B8050849000857 +:10524000CA49532D434F4E534F4C45205D46AF64E2 +:105250005D46EF6480CE704728490008C62E415352 +:10526000434949207F2007400C3E20213160776070 +:10527000B7607F2700B5FBF7DBF8002F80CE00D1A9 +:105280002E27FCF747FE00BD40520008C52E4259AC +:10529000544520205D46AD6B00B520B4FDF700F904 +:1052A000361F37600027FDF74DF9FDF71DF9FDF7B3 +:1052B0001BF9FDF751F9FCF73FFE20BC5C46A563E6 +:1052C00000BD00008C520008C52E574F52442020CC +:1052D0005D46AD6B00B520B4FDF7E2F8361F3760D0 +:1052E0000027FDF72FF9FDF7FFF8FDF7FDF8FDF7B3 +:1052F000FBF8FDF7F9F8FDF72FF9FCF71DFE20BCD0 +:105300005C46A56300BD00005C520008C62E4457F1 +:105310004F5244205D46AD6B00B520B4FDF7C0F898 +:10532000361F37600027FDF70DF9FDF7DDF8FDF7B3 +:10533000DBF8FDF7D9F8FDF7D7F8361F37603A27C5 +:10534000FDF7C2F8FDF7D0F8FDF7CEF8FDF7CCF881 +:10535000FDF7CAF8FDF700F9FCF7EEFD20BC5C464E +:10536000A56300BD944A0008C444554D5020202038 +:105370005D46AD6B361F71683160756000B5FDF735 +:105380008FF830683F18306837600746FBF7B2F88F +:105390003D540008FCF7E0FD009D01980544361FD0 +:1053A00037602F46FFF7B6FF009D019805442C4655 +:1053B0001034083E346077602F4600BFFBF78EF84C +:1053C000E5530008FCF7DAFD009D019805442D78AF +:1053D000361F37602F46FFF75DFF0098401C009096 +:1053E000F0D703B0361F37600227FCF7D5FD009DCC +:1053F000019805442C461034083E346077602F46EF +:10540000FBF76CF825540008009D019805442D78A1 +:10541000361F37602F46FFF725FF0098401C00908D +:10542000F2D703B0FCF768FD002F80CE01D002B0A8 +:1054300000BD009810300090ACD703B05D46AF635C +:1054400080CEFCF789FD00BD28500008C5504455AA +:105450004D5020205D46AD6B361F71683160756020 +:1054600000B5FDF71DF83068054603218D437F190F +:1054700037602F46FBF73EF8E5540008FCF76CFD5B +:10548000009D01980544361F37602F46FFF742FF05 +:10549000009D019805442C461034083E3460776026 +:1054A0002F4600BFFBF71AF8CD540008FCF766FD45 +:1054B000009D019805442D68361F37602F46FFF781 +:1054C00029FF0098001D0090F0D703B0FCF714FDF1 +:1054D000002F80CE01D002B000BD009810300090A7 +:1054E000CCD703B05D46AF6380CEFCF735FD00BD81 +:1054F000CC4C0008C22E532000B5FCF72DFDFCF764 +:105500005BFF032D2D200000FDF726FC002F00D1AE +:1055100080CE16D07F1E361F00213160FAF7DEFFE5 +:1055200043550008009D01980544361F37602F46FB +:10553000BF00F759FDF764F80098401E0090F1D7BE +:1055400003B000BD4C540008C94C45444143544984 +:105550005645202000B500BFFBF7E0FFA00000206B +:10556000C8520008C73C5449434B533E00B500BFE6 +:10557000FBF7D4FFA40000209C510008C554494308 +:105580004B53202002480568361F37602F4670476E +:10559000A40000206C4A0008C34C445500B500BF6D +:1055A000FBF789FFA85500080008004840000000EC +:1055B0004600000098550008C34C445200B500BF97 +:1055C000FBF779FFC85500080008004800020000FA +:1055D00049000000B8550008C34C444400B500BF62 +:1055E000FBF769FFE855000800080048800000004C +:1055F00047000000D8550008C34C444C00B500BF1C +:10560000FBF759FF08560008000800480001000099 +:105610004800000054430008C95359535449434BB0 +:105620004552202002490868401C0860704700006D +:10563000A4000020F0B54046494652465B460FB4F0 +:105640006946F0398B460A1CF03A95460E46083EEC +:10565000341F8C616846C861FFF7E4FF6946F0318A +:10566000F0318D460FBC8046894692469B46F0BD80 +:1056700060320008CB53544152542D434C4F434B9E +:10568000054D064868610320286105496C18FF2014 +:10569000207062B67047000000E000E06F17000065 +:1056A000230D000068500008CA53544F502D434C3E +:1056B0004F434B20024901200D6885430D60704720 +:1056C00010E000E0EC510008C54C41544552202048 +:1056D00002480568ED192F4670470000A40000201D +:1056E000A8560008C954494D45444F55543F202001 +:1056F000044805687F1B002F01D4002701E0012723 +:105700007F427047A4000020F8550008C24D532086 +:1057100007480568ED192F4600B500BFFBF7ECFF01 +:10572000034805687D1B002DF8D580CE00BD01BC67 +:10573000A40000201C5A0008805600086455000888 +:10574000C42F54434220202000B500BFFBF7B3FE16 +:105750001800000018560008C85443422E4C494E09 +:105760004B20202000B500BFFFF7FFFF0000000026 +:10577000BC510008C75443422E53535000B500BFDC +:10578000FFF7FFFF0400000074560008CA544342AC +:105790002E5354415455532000B500BFFFF7FFFF6F +:1057A0000800000058570008C85443422E4D535279 +:1057B0004320202000B500BFFFF7FFFF0C000000D2 +:1057C000A8570008C85443422E4D45534720202077 +:1057D00000B500BFFFF7FFFF10000000E45600080F +:1057E000C95443422E4556454E54202000B500BFB3 +:1057F000FFF7FFFF14000000C8560008C44D4149E0 +:105800004E20202000B500BFFBF755FE103F0020C2 +:10581000000000000C570008C72850415553452987 +:10582000C0B5684659464860096888680028FBD0BA +:105830008B4648688546C0BC01BC86467047000060 +:1058400040570008864D554C54493F2000B500BFD5 +:10585000FBF70FFFA80000207C550008C653494EF7 +:10586000474C45200348044908600020034908606C +:10587000704700008105000808000020A8000020F3 +:10588000E0500008C54D554C5449202003480449B8 +:105890000860044804490860704700002158000867 +:1058A00008000020FFFFFFFFA80000205C58000850 +:1058B000C6535441545553205D46AD6801218D4374 +:1058C000361F37602F467047B0580008C7524553FF +:1058D000544152540120B9680143B96080CE7047E9 +:1058E000C4570008C448414C542020200120B96806 +:1058F0008143B96080CE704748500008C453544F6C +:10590000502020205D462D1C361F37602F4600B5E5 +:10591000FFF7ECFFFBF7F0FE00BD000002CE012315 +:1059200019436A463846F0388546F8610020B86069 +:1059300002B401B43946091E083902B4091FB9611D +:1059400068467860954680CE704720205D462D6879 +:105950003D605D462F6080CE704720205D462D1C47 +:10596000361F37602F4600B53D683068854208D045 +:105970003F685D462D1CBD4202D17768083600BDE8 +:10598000F2E735682D683D607768083600BD000095 +:10599000FC570008C8494E4954494154452020202D +:1059A000361F71683160776000B5FFF7B7FF361FAB +:1059B0003760FFF7CBFF0120B86080CEFBF79CFE7D +:1059C00000BD0000E0570008C95445524D494E4102 +:1059D0005445202000B5FFF7C1FFFBF78DFE00BD49 +:1059E00044580008CA494E49542D4D554C5449203D +:1059F00000B5FFF737FF083E06493160776018278A +:105A000002F0B6F9034D2D60012003490860FFF74D +:105A10003DFF00BD103F0020183F0020D07C000853 +:105A2000F059000874570008C34849535D462D1CBF +:105A30007F1B30683F18361D70470000E45800088F +:105A4000C953454D4150484F52452020361F3760BD +:105A5000082700B5FBF76EFD0B4805680C3E0021DA +:105A6000316000217160B7602F46FBF7B9FA3D46FF +:105A700080CE01200543A8473068386070687860A0 +:105A8000B7680C3600BD00003C000020CC58000870 +:105A9000C65349474E414C2000B5FBF74FFF3868CD +:105AA000401C38600020786080CEFBF751FF00BDBD +:105AB000905A0008C75245515545535400B500BF90 +:105AC000FBF73CFF3D68002D04D1FBF741FFFBF7DE +:105AD00013FEF5E73868401E38605D462D1C7D607A +:105AE00080CEFBF735FF00BD8C570008CA544153E8 +:105AF0004B2D434841494E2000B500BFFBF70EFD3A +:105B0000AC00002068530008C45441534B202020AF +:105B10000C4805680C482D18083E356077600B4F1F +:105B200000B5FCF78DFAFBF7C1FCFCF74FFA08480B +:105B30000568361F37602F46FCF7DAFA04490F6014 +:105B400080CE00BD1C000020F0010000E00200003B +:105B5000AC000020B45A0008C653544152543A20B5 +:105B600000B520BC361F3560FFF71AFF00BD0000EE +:105B7000E4590008C52E5441534B2020361F37608E +:105B8000124F00B53F68002F0ED03D1F2D683068C2 +:105B9000854208D10C3F361DFBF732FAFCF73AFB81 +:105BA000FCF7ECF900BDEDE780CEFFF7B3FBFCF7A7 +:105BB00003FC15206973206E6F7420696E205441B8 +:105BC000534B20636861696E00BD0000AC0000208B +:105BD0000C530008C62E5441534B5320361F3760D8 +:105BE000094F00B53F68002F0BD03D460C3D361FD6 +:105BF00037602F46FBF704FAFCF70CFBFCF7BEF905 +:105C0000F0E780CE00BD0000AC000020C0410008DD +:105C1000C82E52554E4E494E47202020361F376021 +:105C2000064F00B5FCF798F9361F3760FFF7A6FF5F +:105C30003F6802488742F5D180CE00BD103F00206A +:105C40001176312E30205B6275696C642030303201 +:105C5000375D14312041756720323032332C2031CA +:105C6000363A35373A33392000B5FCF775F9FCF789 +:105C7000A3FB1C2A2A2A2A2A2A2A2A2A2A2A2A2A48 +:105C80002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A009E +:105C900000BD202000B5FFF7E7FFFCF75DF9FCF73A +:105CA0008BFB1C4D504520506F776572466F7274A8 +:105CB0006820666F722053544D33324630373200BD +:105CC000FCF74AF9FCF778FB1C4D6F64696669655F +:105CD0006420666F722059656C6C6F77204D6F750C +:105CE0007365205632000000FCF736F9361F376026 +:105CF000064FFCF72FFEFCF741F9361F3760044FC3 +:105D0000FCF728FEFFF7B0FF00BD0000405C000874 +:105D1000525C0008405A0008CA524550524F472E64 +:105D2000494D472000B500BFFBF7C5FB305D0008BB +:105D3000FC0700204409002000000000006CDC0289 +:105D400000000200000800003B1C83CE00D1704719 +:105D5000021C0A431A430324144006D10A68026055 +:105D6000091D001D1B1FF9D170470A780270491CDC +:105D7000401C5B1EF9D1704702CE0124E407734634 +:105D80005B1E1A680919781A07B480CE7046001D88 +:105D90000047000002CEB942EFD180CE012170460B +:105DA000884302681047361F37607046401E0768F8 +:105DB00000BD000072B670473A4603CE0027121AA3 +:105DC000091A914200D2FF437047000001CE3168AA +:105DD000202400224918404113465341C01B5B4117 +:105DE00001D0491C00E0C019641EF3D10F46306099 +:105DF00070472020361F0021316000B5FFF7E6FF15 +:105E0000361D00BD0038014007480568002D03D04D +:105E10000548056805490D60044805680C202860A0 +:105E20000D2028607047000008000020D4000020EA +:105E300007480568361F37602F4600BFFD69802080 +:105E40000540FBD03068B8627768083670470000BC +:105E5000D400002004480568ED6920200540361F65 +:105E600037602F4670470000D40000200A480568BC +:105E7000361F37602F4600BFFD6920200540FBD04C +:105E80007F6AFF20074000BF00BF00BF00BF00BF08 +:105E900000BF00BF00BF7047D400002030683F182B +:105EA00030683760074600B5FFF774FF9D0100209A +:105EB000009D019805442D78361F37602F46FFF767 +:105EC000B7FF0098401C0090F2D703B000BD20201F +:105ED000361F37600D2700B5FFF7AAFF361F376062 +:105EE0000A27FFF7A5FF00BD07480568083E356093 +:105EF0007760064F00B5FFF77DFF00BF7F1E002FC4 +:105F0000FCD180CE00BD01BC0C00002020A1070008 +:105F100007480568083E35607760064F00B5FFF713 +:105F200069FF00BF7F1E002FFCD180CE00BD01BCE9 +:105F30000C0000208813000000B500BFFFF7E8FF49 +:105F40007F1E002FFAD180CE00BD202000B5FFF7C4 +:105F500031FF054901200D6805430D6003480449E0 +:105F6000086000BFFEE700BD24100240CCCC00005A +:105F70000030004000B500BFFFF715FF200A0020E9 +:105F800000B500BFFFF70FFF240A002000B500BFD7 +:105F9000FFF709FF280A002000B500BFFFF703FF45 +:105FA0002C0A002000B500BFFFF7FDFE300A0020DC +:105FB00000B500BFFFF74EFF002F80CE03D0FFF7E4 +:105FC00055FF80CEF6E700BD361F3760062700B5C7 +:105FD000FFF72EFF00BD2020361F3760152700B5C4 +:105FE000FFF726FF00BD2020361F3760182700B5B9 +:105FF000FFF71EFF024901204042086000BD00007B +:10600000300A0020361F3760074F00B5FFF722FF28 +:10601000002F80CE03D0FFF729FF361D00BD7F1E65 +:10602000002FF3D1014F00BD00004000FFFFFFFF34 +:10603000083E0021316077600C4F00B5FFF7E2FFAA +:1060400031680F7070683F18FF20074035686D1C7D +:1060500007488542EFF3008001B477602F46361D74 +:1060600001BC80F30088E9D380CE00BD400A002047 +:10607000C00A002000B5FFF7B7FFFFF7B5FF00BD6E +:1060800000B5FFF795FF07490868401C0860054800 +:1060900005680548854202DDFFF7ECFF01E0FFF7E8 +:1060A0009BFF00BD2C0A0020000100000748056886 +:1060B000083E0749316077602F4600B500F0BCF913 +:1060C000024908688030086000BD0000240A0020F2 +:1060D000400A002000B5FFF795FFFFF793FF3068F7 +:1060E0003F18FF2F80CE05D0FFF7CAFFFFF77CFFD8 +:1060F00080CE00BD18480568FF200540BD4280CE17 +:1061000002D0FFF7BDFF00BDFFF792FFFFF77AFF58 +:1061100030688742EFF3008001B47768083601BC2D +:1061200080F3008802D0FFF7ABFF00BD0A48056886 +:106130000A480468AC4202DAFFF79CFF00BDFFF793 +:10614000B5FFFFF741FF04490868401C0860044997 +:106150000020086000BD0000200A0020280A00205E +:106160002C0A0020361F37600A4F00B5FFF772FE79 +:10617000002F01D0002701E001277F42306807404F +:1061800080CE03D0FFF7B0FE7F1EEFE780CEFFF793 +:1061900061FE00BDA086010000B5FFF7E3FF002F00 +:1061A00080CE03D1024901204042086000BD0000BA +:1061B000300A00202A49002008602A49002008608F +:1061C00000B5FFF7F5FEFF0927490F603068274942 +:1061D00008600120264908601527361DFFF728FEB4 +:1061E000FFF7C0FF002F80CE05D1361F376015277F +:1061F000FFF71EFEF4E700BFFFF7CEFF1848056863 +:10620000002D1AD1FFF732FE042F06D104201449C5 +:10621000086080CEFFF7D8FE0FE0182F06D11820B7 +:106220000F49086080CEFFF7CFFE06E0012F03D1B3 +:1062300080CEFFF74FFF00E080CE09480568002DB3 +:10624000DAD007480568042DEFF3008001B4361F4B +:1062500037602F4601BC80F3008800D1002700BDC5 +:10626000300A00202C0A0020280A0020240A0020DE +:10627000200A0020074805688020054000B508D0A6 +:10628000054D06486860064868608020296981439A +:10629000296100BD10200240002002402301674513 +:1062A000AB89EFCD083E134931607760124F00B5DE +:1062B0003068451E002DEFF3008001B4356001BC4D +:1062C00080F3008804D0FD6801200540002DEFD147 +:1062D000FD6834242C40FC6030680028EFF3008017 +:1062E00001B42F46361D01BC80F3008801D103485C +:1062F000074300BD000010000020024000000080A5 +:1063000000B5FFF7B7FF084901200D6805430D6090 +:106310003068388077680836FFF7C4FF02490120EB +:106320000D6885430D6000BD102002400B483F1AE8 +:1063300000B5FFF79FFF0A4D02202969014329613B +:106340006F61402029690143296180CEFFF7AAFFD0 +:10635000044902200D6885430D6000BD000000085F +:10636000002002401020024000B500BFFFF71BFDD7 +:10637000340A0020202F80CE00B503D002490868DF +:10638000401C086000BD0000340A002030683F183F +:1063900030683760074600B5FFF7FCFC9306002025 +:1063A000009D01980544361F37602F46FFF7BEFF5A +:1063B000FFF7E0FF03480568009840190090EFD709 +:1063C00003B000BD1400002005480568083E0549DB +:1063D000316077602F4600B5FFF7D8FF00BD0000A1 +:1063E00010000020000000087068054601218D4360 +:1063F0003068044601218C437F1C01218F433F19E3 +:1064000037607560274600B5FFF7C4FC050700201C +:106410003D88009C01980444083E3560776027461B +:10642000FFF76EFFFFF7A6FFBF1C0098801C0090CF +:10643000EED703B080CE00BD361F3760802700B591 +:10644000FFF7D2FF00BD20200F200740092F00B525 +:1064500000DDFF1D3037FFF7EBFC00BD3D0B361FA5 +:1064600037602F4600B5FFF7EFFF3D0A361F376054 +:106470002F46FFF7E9FF3D09361F37602F46FFF72C +:10648000E3FFFFF7E1FF00BD0845726173696E67C6 +:10649000200620646F6E652010537461727420585A +:1064A0006D6F64656D20545820265072657373209B +:1064B0005220746F207265626F6F742C206F746845 +:1064C000657220746F20726570726F6772616D20E3 +:1064D000064572726F7273034E6F20207D1C3F78E9 +:1064E000361F356000B5FFF7D9FC00BD00B5FFF7DA +:1064F000EFFC9C4D361F37602F46FFF7AFFF361F6E +:1065000037602027FFF794FC361F3760014FFFF7F5 +:10651000E5FF00BDA007002000B5FFF775FC361FA2 +:1065200037603227FFF708FD00BD202000B5FFF7D8 +:10653000F3FF00BF284900200860FFF7C9FC361FA1 +:106540003760264FFFF7CAFF361F37601427FFF763 +:10655000F3FCFFF739FF361F3760214FFFF7BEFF0F +:10656000FFF7C4FF1C4900200860FFF7B1FC361F8D +:1065700037601C4FFFF7B2FF361F37601A27FFF74F +:1065800057FC19480568083E1849316077602F4666 +:10659000FFF710FE80CEFFF7A9FF361F3760642794 +:1065A000FFF7CAFCFFF794FC361F3760104FFFF768 +:1065B00095FFFFF75BFCDF200740361F3760FFF7D2 +:1065C00037FC522F80CEB5D1361F37606427FFF7D6 +:1065D000B3FCFFF7BBFC00BD340A002058070020C5 +:1065E000610700206807002010000020000000085C +:1065F0007907002005436F707920202000B5FFF750 +:106600008BFFFFF765FC361F3760174FFFF766FFFC +:10661000361F37601427FFF78FFC144900200860ED +:10662000083EB16831607760FFF7B0FEFFF75EFFAC +:10663000361F37600A27FFF77FFC4A4D002D02D036 +:10664000B7680C3600BDFFF743FC361F3760084FB4 +:10665000FFF744FFFFF7C8FEFFF748FF361F37601C +:106660001427FFF769FC00BD58070020340A0020FA +:10667000C408002000B500BF0C3EF16831603169EC +:106680007160B760FFF7BAFF364D002DF4D1361FA9 +:1066900037606427FFF750FCFFF758FC00BD00008F +:1066A000C8590008CB5245464C41534855415254B5 +:1066B00000B500BFFAF732FFB0000020585B0008B9 +:1066C000C643414C4C49542072B60F480568103EF1 +:1066D0000E4931600E497160B560F7600D4F00B52D +:1066E000FAF748FB094DAF600B48E8600B4828619A +:1066F0000B48686135687768083601200543A8476C +:10670000FDF712F900BD0000B000002000000020DD +:10671000305D000870090000006CDC0200F8010028 +:1067200000080000C0660008C75245464C41534867 +:1067300004480568361F37602F4600B5FFF7C4FFD1 +:1067400000BD0000305D0008185D0008C9434F50CF +:1067500059464C415348202004480568361F37608D +:106760002F4600B5FFF7B0FF00BD0000345D000804 +:10677000EC5A0008CA4449534B2D4552524F5220FF +:1067800000B500BFFAF7CAFEB4000020A4660008F6 +:10679000C8454E442D4C4F41442020205D460020EA +:1067A000E8625D46012040422863704700B500BFA3 +:1067B000FBF794FB062F80CEFAD100BD361F376061 +:1067C000002700B580CEFBF789FB152F01D00025EF +:1067D00001E001256D42062F01D0002701E00127CD +:1067E0007F422F43EFF3008001B42F4601BC80F3BA +:1067F0000088E7D000BD2020083E0021316077608E +:10680000064F00B5F9F78EFF306837600746FBF793 +:1068100081FBFBF77FFBFFF7C9FF00BD0001000014 +:1068200000B500BFFBF75AFB012F80CEFAD100BFA5 +:10683000FBF762FB002F80CE03D0FBF74FFB80CE2F +:10684000F6E7361F37600627FBF764FB00BD202004 +:1068500000B5FBF75FFBFFF7E3FF7D1C3F78083EC9 +:1068600037607560FFF7C8FF361F3760002700BF2D +:10687000F9F734FE97680008009D01980544ED196A +:106880002D78361F37602F46FBF744FB0098401CDD +:106890000090F1D703B00627FBF73CFBFFF78EFF14 +:1068A00001490F6080CE00BDB4000020361F376064 +:1068B000052700B5FBF72EFBFBF74EFBFBF77CFD36 +:1068C000084572726F72202320000000FBF78CFED7 +:1068D000FBF754FBFBF77AFBFCF73CF8FBF73CFBC0 +:1068E000FFF75CFF00BD2020361F3760062700B58C +:1068F000FFF7AEFF361F3760184FFFF77DFF361FDB +:1069000037600127FFF778FFFFF78AFF5D46002019 +:1069100028635D4601204042E8620020104908607B +:10692000FCF77AFCFCF7B4F8361F37600D4FFBF725 +:1069300053FD002F00D180CE0AD0FFF7B7FF5D4690 +:10694000AD69361F37602F463E1C80CEFCF764FCD5 +:106950005D462D6B002DE5D000BD01B4FFFFFFFFAC +:1069600098000020A0330008F4540008C7494E43A3 +:106970004C554445361F3760202700B5FCF7FCF81E +:106980007D1C3C78083E356077602746FAF73CFA74 +:10699000FFF7AAFF00BD000018580008C847454E81 +:1069A000535049425220202030683760074600B5D6 +:1069B000F9F756FF083E002131607760072700BFD6 +:1069C000F9F78CFDEB690008009D0198054401244E +:1069D000AC40BC4204DA009F0198074403B000BDFC +:1069E0000098401E0090EFD703B0002700BD0000C4 +:1069F00094590008C928494E495453504929202028 +:106A000000B580B4009F402039688143396080CE52 +:106A1000FFF7CAFFFF0007480743009D2F60009F54 +:106A20000548786080BC402039680143396080CED9 +:106A300000BD000007030000001700006C6900089B +:106A4000CD535049325F4E43535F4D454D53202047 +:106A500000B500BFFAF72FFD5C6A00080008004887 +:106A60000100000040000000285A0008C8535049A7 +:106A7000325F53434B20202000B500BFFAF71BFDC7 +:106A8000846A000800040048002000002D00000077 +:106A90004C670008C9535049325F4D49534F20207D +:106AA00000B500BFFAF707FDAC6A00080004004813 +:106AB000004000002E000000946A0008C9535049AD +:106AC000325F4D4F5349202000B500BFFAF7F3FC69 +:106AD000D46A000800040048008000002F00000075 +:106AE000F4690008C8495353504950494E202020AA +:106AF000083E00213160776000B5FDF779FE361F52 +:106B000003213160FDF706FF00BD0000906700081B +:106B1000CA53454C494F2D5350493220174D184CFC +:106B2000696921436961A96AA143A962134D154CA2 +:106B3000E9692143E9612969A1432961124D083EB0 +:106B4000356077602F4600B5FDF742FE083E012113 +:106B500031607760FDF7DEFEFDF758FD361F3760C8 +:106B60000A4FFFF7C5FF361F3760094FFFF7C0FF19 +:106B7000361F3760074FFFF7BBFF00BD0010024014 +:106B80000000C000004000005C6A0008846A000841 +:106B9000AC6A0008D46A000810520008C753504974 +:106BA0005843484730683873361D00B5F9F7E8FC9C +:106BB000F9F7E6FCF9F7E4FCF9F7E2FCBD6883209D +:106BC0000540032DFAD13F7BFF20074000BD0000A8 +:106BD0006C6A0008C8535049464C55534820202041 +:106BE000361F3760044F00BFBD680120054001D04B +:106BF000FD68F9E780CE704700380040FC58000877 +:106C0000C453504921202020361F3760024F00B561 +:106C1000FFF7C8FF80CE00BD00380040006C0008C0 +:106C2000C453504940202020083EFF213160776046 +:106C3000024F00B5FFF7B6FF00BD0000003800406E +:106C4000E46A0008C8494E49545350493220202074 +:106C500000B5FFF763FF0C3E0549316005497160DF +:106C6000B760054FFFF7CCFEFFF7BAFF00BD00008D +:106C7000006CDC0240420F0000380040745B0008EA +:106C8000C52E535049322020083E044931607760B8 +:106C9000402700B5FEF7DEFB00BD000000380040D5 +:106CA000D46B0008C853504944454C41592020201A +:106CB000361F3760092700BF7F1E002FFCD180CE12 +:106CC00070470000BC6A0008C943534C4F5F4D45F4 +:106CD0004D53202000B5FFF7EBFF361F3760034F01 +:106CE000FDF7A0FCFFF7E4FF00BD00005C6A0008B0 +:106CF000C86C0008C9435348495F4D454D53202097 +:106D000000B5FFF7D5FF361F3760034FFDF77EFC58 +:106D1000FFF7CEFF00BD00005C6A0008F46C0008BD +:106D2000C4484F4D45202020361F37601B2700B533 +:106D3000FBF7F0F8361F37605B27FBF7EBF8361FE1 +:106D400037604827FBF7E6F800BD000084580008CC +:106D5000C42E504F53202020361F37600A2700B51D +:106D6000F9F76EFD3037FBF7D5F83037FBF7D2F87F +:106D700000BD0000106B0008C6474F544F58592003 +:106D8000361F37601B2700B5FBF7C4F8361F376086 +:106D90005B27FBF7BFF8FFF7DFFF361F37603B27A6 +:106DA000FBF7B8F8FFF7D8FF361F37604827FBF727 +:106DB000B1F800BD74670008CB434C4541525343C2 +:106DC0005245454E361F37601B2700B5FBF7A2F82A +:106DD000361F37605B27FBF79DF8361F3760322779 +:106DE000FBF798F8361F37604A27FBF793F800BD8A +:106DF000786D0008CA5343524F4C4C444F574E20B5 +:106E0000361F37601B2700B5FBF784F8361F376045 +:106E10004427FBF77FF800BDA46C0008C853435219 +:106E20004F4C4C5550202020361F37601B2700B593 +:106E3000FBF770F8361F37604D27FBF76BF800BD86 +:106E4000206D0008C95343524F4C4C494E472020F7 +:106E5000361F37601B2700B5FBF75CF8361F37601D +:106E60005B27FBF757F8361F37607227FBF752F89E +:106E700000BD0000446E0008C9435552534F524FA5 +:106E800046462020361F37601B2700B5FBF742F827 +:106E9000361F37605B27FBF73DF8361F37603F270B +:106EA000FBF738F8361F37603227FBF733F8361F09 +:106EB00037603527FBF72EF8361F37606C27FBF756 +:106EC00029F800BD1C6E0008C8435552534F524F5D +:106ED0004E202020361F37601B2700B5FBF71AF81D +:106EE000361F37605B27FBF715F8361F37603F27E3 +:106EF000FBF710F8361F37603227FBF70BF8361F09 +:106F000037603527FBF706F8361F37606827FBF731 +:106F100001F800BD085B0008C345534300B500BF3E +:106F2000FAF7C9FA1B000000406A0008C43C23239A +:106F30003E2020205D46AD6B00B520B4FBF7BAFAC9 +:106F4000361F37600027FBF7FDFAFBF7EDFAFBF77A +:106F500003FBFAF7F1FF20BC5C46A56300BD00000F +:106F600028670008C44553435B202020361F376044 +:106F70001B2700B5FAF7CEFFFBF71EFA015B0000F6 +:106F800000BD0000C86E0008C744454641554C543A +:106F900000B500BFFAF78FFA00000000105C00088F +:106FA000C4424F4C4420202000B500BFFAF783FABA +:106FB00001000000206C0008C344494D00B500BF2B +:106FC000FAF779FA020000009C690008C6495441AA +:106FD0004C49432000B500BFFAF76DFA03000000EA +:106FE000B86D0008C9554E4445524C494E452020C5 +:106FF00000B500BFFAF75FFA04000000B86F0008A0 +:10700000C5424C494E4B202000B500BFFAF753FA59 +:107010000500000048550008C352455600B500BFA2 +:10702000FAF749FA0700000000700008C5424C4119 +:107030004E4B202000B500BFFAF73DFA08000000D3 +:107040002C700008C5424C41434B202000B500BFC6 +:10705000FAF731FA0000000018700008C3524544E6 +:1070600000B500BFFAF727FA01000000786E0008AB +:10707000C5475245454E202000B500BFFAF71BFA20 +:1070800002000000CC6F0008C659454C4C4F5720F9 +:1070900000B500BFFAF70FFA03000000A06F000868 +:1070A000C4424C554520202000B500BFFAF703FA32 +:1070B00004000000D45B0008C74D4147454E5441D1 +:1070C00000B500BFFAF7F7F90500000044700008AA +:1070D000C44359414E20202000B500BFFAF7EBF918 +:1070E0000600000070700008C5574849544520202C +:1070F00000B500BFFAF7DFF9070000005C70000878 +:10710000C44154545220202000B5FFF72FFFFFF751 +:1071100011FFFBF751F9016D00BD0000186F000869 +:10712000C4544558542020201E3700B5FFF7ECFF0B +:1071300000BD0000E8700008CA4241434B47524F6F +:10714000554E4420283700B5FFF7DEFF00BD000094 +:10715000D0700008C552464C4544202000B500BF01 +:10716000FAF7A9F96871000800080048002000003B +:107170004D0000002C6F0008C44C4F444F202020CD +:1071800000B500BFFAF797F98C71000800000048BD +:1071900002000000010000009C6B0008C85246532A +:1071A00049474E414C20202000B500BFFAF783F933 +:1071B000B47100080000004808000000030000004F +:1071C0009C710008C852575349474E414C2020201B +:1071D00000B500BFFAF76FF9DC7100080000004845 +:1071E0001000000004000000B8700008C84C4653AE +:1071F00049474E414C20202000B500BFFAF75BF90B +:107200000472000800000048200000000500000093 +:10721000EC710008C84C575349474E414C20202080 +:1072200000B500BFFAF747F92C72000800000048CB +:107230004000000006000000446C0008C54C464CAD +:107240004544202000B500BFFAF735F95072000818 +:107250000000004880000000070000003C720008A9 +:10726000C54C574C4544202000B500BFFAF723F920 +:1072700074720008000400480100000020000000B3 +:10728000A0700008C353573100B500BFFAF713F9D7 +:107290009472000800040048020000002100000071 +:1072A00084720008C353573200B500BFFAF703F9E0 +:1072B000B47200080004004804000000220000002E +:1072C000E46F0008C6284C50574D292000B500BF78 +:1072D000FAF7F1F8D8720008000000480001000039 +:1072E00008000000C4720008C6285250574D2920DB +:1072F00000B500BFFAF7DFF8FC7200080000004894 +:10730000000800000B000000646F0008C950574DD2 +:10731000454E41424C45202000B500BFFAF7CBF85E +:107320002473000800000048001000000C0000005A +:10733000806C0008C74C4D41524B455200B500BF10 +:10734000FAF7B9F848730008000000480040000050 +:107350000E0000000C730008C7524D41524B4552BD +:1073600000B500BFFAF7A7F86C73000800000048EA +:10737000008000000F000000A4720008C4524F44B7 +:107380004F20202000B500BFFAF795F89073000851 +:10739000000400481000000024000000887000086D +:1073A000C8475245454E4C454420202000B500BFFB +:1073B000FAF781F8B87300080004004820000000C4 +:1073C00025000000506D0008C959454C4C4F574CE2 +:1073D0004544202000B500BFFAF76DF8E0730008BF +:1073E0000004004840000000260000002071000852 +:1073F000C65245444C45442000B500BFFAF75BF83F +:107400000474000800040048800000002700000009 +:10741000F0730008C5534F554E44202000B500BFFF +:10742000FAF749F828740008000400480001000039 +:107430002800000054710008C552574C45442020D4 +:1074400000B500BFFAF737F84C7400080004004894 +:107450000002000029000000C8730008C9492F4F2E +:10746000434C4F434B5320200F4D10486969014353 +:1074700069610F48A9690143A9610320E9690143D2 +:10748000E9612C460C340A4B2168194321602168BC +:10749000994321602C46103403232168194321604D +:1074A00021689943216070470010024001000E00DE +:1074B000000A060014720008C450574D4C202020CA +:1074C00001490F6080CE7047342C0140B874000829 +:1074D000C450574D5220202001490F6080CE704784 +:1074E000402C0140D0740008C84C45465453544FBA +:1074F0005020202000B500BFF9F7DDFFD4010000C7 +:10750000886F0008C9524947485453544F502020AF +:1075100000B500BFF9F7CFFFD4010000F46D0008FB +:10752000CA53544F504D4F544F525320361F37605B +:10753000044F00B5FFF7C4FF361F3760014FFFF758 +:10754000CBFF00BDD4010000A0730008C6494E491E +:107550005454312000B5FFF7E9FF0F4D0F48E862A2 +:107560006020A8610E48E8610E4828620020A862E9 +:107570000D48686401202860083E02213160776070 +:107580000A4FFDF735F9083E022131607760084F58 +:10759000FDF72EF900BD0000002C0140E8030000BB +:1075A000006000000110000000800000D872000898 +:1075B000FC72000834730008C74C504552494F44D0 +:1075C00002480588361F37602F4670473800004054 +:1075D00058730008C752504552494F440248058825 +:1075E000361F37602F46704734040040B8750008D6 +:1075F000CA494E4954504552494F44200448F86204 +:107600002F20B862012038603120386280CE704768 +:10761000FFFFFFFF60720008C8494E495454322FE3 +:1076200033202020134D1448E8601448A860144803 +:10763000A861361F37602F4600B5FFF7DFFF114DF9 +:107640001148E8601148A8601148A861361F3760EA +:107650002F46FFF7D3FF083E0221316077600D4FC0 +:10766000FDF7C6F8083E0121316077600A4FFDF74B +:10767000BFF800BD000000400004000064010000ED +:10768000111100000004004000020000540100003D +:10769000111000008C710008907300085C740008E1 +:1076A000C64C434F554E54200348056803494D1BB3 +:1076B000361F37602F46704734000240FFFF00003E +:1076C00038740008CB4C434F554E54434C454152FF +:1076D000044D0020286004480449086031202860D7 +:1076E0007047000030000240FFFF000034000240FD +:1076F00014740008C652434F554E54200348056881 +:1077000003494D1B361F37602F4670474800024023 +:10771000FFFF000020750008CB52434F554E5443E5 +:107720004C454152044D002028600448044908603B +:10773000312028607047000044000240FFFF000035 +:107740004800024038710008C8444D41494E495430 +:1077500033202020044D0548A8630548E86300B5A0 +:10776000FFF7B6FF00BD00000000024024480140C2 +:107770000000000848770008C8444D41494E49546C +:1077800034202020044D0548E8640548286500B5EC +:10779000FFF7C8FF00BD0000000002402448014080 +:1077A00000000008E8720008CB434C454152434FAB +:1077B000554E545300B5FFF78BFFFFF7B3FF00BDE5 +:1077C00078770008CA5246414E414C4F47554520F4 +:1077D00000B500BFF9F76FFE08000000187600083A +:1077E000C54C494E4530202000B500BFF9F763FE77 +:1077F00008000000C4770008CA5257414E414C4F60 +:107800004755452000B500BFF9F755FE10000000B0 +:10781000E0770008C54C494E4531202000B500BF37 +:10782000F9F749FE100000007C730008CA4C46417D +:107830004E414C4F4755452000B500BFF9F73BFE80 +:107840002000000014780008C54C494E4532202025 +:1078500000B500BFF9F72FFE200000002C780008CB +:10786000CA4C57414E414C4F4755452000B500BFCB +:10787000F9F721FE4000000048780008C54C494E49 +:107880004533202000B500BFF9F715FE4000000089 +:10789000F4760008C7414E414C4F4753361F3760BE +:1078A000094F00B5FCF7C6FF361F3760074FFCF7DE +:1078B000C1FF361F3760064FFCF7BCFF361F37602D +:1078C000044FFCF7B7FF00BDB4710008DC7100087D +:1078D000047200082C720008C4760008C6414443B4 +:1078E0005F43522000B500BFF9F7E5FD08240140D1 +:1078F000E8740008C341444300B500BFF9F7DBFD5D +:1079000000240140D4750008C8414443444F4E450B +:107910003F2020200648056804200540002D01D0A6 +:10792000002501E001256D42361F37602F46704764 +:1079300008240140A0760008CB57414954414443F4 +:10794000444F4E4500B500BFFFF7E4FF002F80CE47 +:10795000FAD000BD38790008CB5741495443414C17 +:10796000444F4E4500B500BF02480568002DFBD1CD +:1079700000BD01B408240140F8770008CB4144431E +:10798000454E41424C45443F0348056801200540AF +:10799000361F37602F46704708240140947800084E +:1079A000C74144435F43414C00B5FFF7EDFF002F53 +:1079B00080CE02D0022006490860FFF7D3FF0020E6 +:1079C00003490860034802490860FFF7CBFF00BD88 +:1079D0000824014000000080C4710008C9414443EC +:1079E000454E41424C45202000B5FFF7DDFF012008 +:1079F0000149086000BD00000824014078710008BA +:107A0000C9574149545245414459202000B500BF4F +:107A10000248056801200540FAD000BD002401405D +:107A200008790008C841444353544152542020204F +:107A3000024904200D6805430D6070470824014089 +:107A4000007A0008C7494E495441444300B5FFF746 +:107A500025FFFFF7A9FFFFF7C7FFFFF7D7FF044D8B +:107A60000020E860034828610420686100BD000030 +:107A70000024014000000080A0790008C54348535D +:107A8000454C202000B500BFF9F715FD2824014022 +:107A90007C7A0008C74144434441544100B500BFCB +:107AA000F9F709FD4024014000710008C441544F1A +:107AB0004420202006490F6080CE00B5FFF7B8FFB4 +:107AC000FFF740FF03480568361F37602F4600BDAB +:107AD000282401404024014004750008C754494D42 +:107AE0004552313600B500BFF9F7E5FC00440140CE +:107AF000A8770008CB534F554E44504552494F4448 +:107B000001490F6080CE70472C440140DC790008A9 +:107B1000C7534F554E444F4E012005490860083E5B +:107B2000022131607760034F00B5FCF761FE00BDB4 +:107B30000044014028740008DC7A0008C8534F55FF +:107B40004E444F4646202020002007490860361F3B +:107B50003760064F00B5FCF73BFE361F3760034F1A +:107B6000FCF760FD00BD00000044014028740008DF +:107B7000447A0008C7494E4954543136064D3020E6 +:107B8000A86101202862054868641720A86200B532 +:107B9000FFF7DAFF00BD0000004401400080000054 +:107BA00058790008C9494E49545354554646202037 +:107BB00000B5FFF759FCFFF735FDFFF7CBFDFFF7E9 +:107BC000E1FDFFF7C7FCFFF7D9FFFFF73FFF00BD5F +:107BD000F0750008CA494E4954414C4C492F4F207A +:107BE00000B5FFF7E5FF2E4D083E356077602F4664 +:107BF000FCF7EEFDFCF716FD2A4D083E3560776078 +:107C00002F46FCF7E5FDFCF70DFD274D083E3560DE +:107C100077602F46FCF7DCFDFCF704FD234D083EA2 +:107C2000356077602F46FCF7D3FDFCF7FBFC204D59 +:107C3000083E356077602F46FCF7CAFDFCF7F2FC82 +:107C40001C4D083E356077602F46FCF7C1FDFCF700 +:107C5000E9FC194D083E356077602F46FCF7B8FD0A +:107C6000FCF7E0FC154D083E356077602F46FCF7C9 +:107C7000AFFDFCF7D7FC361F3760114FFCF798FDBE +:107C8000361F37600F4FFCF793FD361F37600E4FDE +:107C9000FCF78EFD361F37600C4FFCF789FD00BDE9 +:107CA000687100084C740008507200087472000873 +:107CB00004740008E0730008B87300082473000817 +:107CC0006C7300084873000894720008B4720008CE +:107CD00000000000E07B0008DC780008C453573146 +:107CE0003F202020361F3760054F00B5FCF7A6FC6B +:107CF000002F01D0002701E001277F4200BD0000D6 +:107D000094720008DC7C0008C45357323F202020C6 +:107D1000361F3760054F00B5FCF790FC002F01D0EF +:107D2000002701E001277F4200BD0000B472000877 +:107D3000947A0008C652502D454E442000B500BF2D +:107D4000F9F7B9FB4C36002018770008CA534554A0 +:107D5000434F4E534F4C45205D46EF645D46AF6444 +:107D600080CE7047107B0008C54552415345202006 +:107D7000361F3760002700B5F9F7A2F800BD0000F4 +:107D8000B80000000000002000000000000000001B +:107D9000000000008005000800000000E80000006E +:107DA00000000000000000000000000000000000D3 +:107DB000000000001800002000000000000000008B +:107DC0000000000000000000000000008005000826 +:107DD00000000000981E000810000000747B0008DE +:107DE0007C780008A47B0008D47B0008F4780008A5 +:107DF000AC7A000860780008087D0008347D00082F +:107E0000247A0008687D00083C7B00087C79000823 +:107E10004C7D0008F47A00084C7500080000000052 +:107E20004028000800000000D07C0008010000008D +:107E30000000000000000000105800080038014059 +:107E40000000000000000000000000000000000032 +:00000001FF diff --git a/mwmouse/sources/2YELLOW.img b/mwmouse/sources/2YELLOW.img Binary files differ. diff --git a/mwmouse/sources/AnsForth/A0001.HTM b/mwmouse/sources/AnsForth/A0001.HTM @@ -0,0 +1,264 @@ +<title>ANS Forth RFI 0001: regarding the "flag" returned +by <a href=dpans11.htm#11.6.1.2090>READ-LINE</a> at end of file</title> + +This document is produced by TC X3J14 as its clarification of questions +raised about ANSI X3.215-1994, American National Standard for Information +Systems - Programming Languages - Forth. + +<p>The questions covered herein were raised by query + +<p>Q0001, regarding the "flag" returned +by <a href=dpans11.htm#11.6.1.2090>READ-LINE</a> at end of file boundary +conditions. + +<p>There are four parts in this document: + +<ol> +<li><a href="#query">The original question as received.</a> +<li><a href="#reply">The TC's reply.</a> +<li><a href="#ballot">The Letter Ballot issued by TC Chair.</a> +<li><a href="#results">TC Chair's statement of ballot results.</a> +</ol> + +<h2><a name="query">Q0001 as received</a></h2> + +The following query has been assigned number Q0001 and has been +tentatively assigned to Mitch Bradley for drafting a response. +- Greg Bailey, by direction, Tue, 21 Mar 95 12:40:30 PST +<hr> + +<pre> +Subject: Request for clarification--READ-LINE +To: x3j14@minerva.com, erather@aol.com +From: lgc@bluemax.jpl.nasa.gov (Loring Craymer) +Date: Mon, 23 Jan 95 09:14:21 -0800 +Message-Id: <9501231714.AA00637@bluemax> +Received: from bluemax.jpl.nasa.gov by med3.minerva.com +; Mon, 23 Jan 1995 +11:00 PST +Content-Type: text +>From lgc Mon Jan 23 09:14:21 0800 1995 remote from bluemax.jpl.nasa.gov +Received: from bluemax (bluemax.jpl.nasa.gov [128.149.53.31]) by +telerobotics.jpl.nasa.gov (8.6.8/8.6.6) with SMTP id KAA00235; Mon, 23 Jan +1995 10:57:40 -0800 +Received: by bluemax (920110.SGI/911001.SGI) for +@telerobotics.jpl.nasa.gov:erather@aol.com id AA00637; Mon, 23 Jan 95 09:14:21 +-0800 +Content-Length: 1072 +</pre> + +Dear Elizabeth: + +<p>In the course of writing a test suite for the FILE wordset, I've discovered +that the <a href=dpans11.htm#11.6.1.2090>READ-LINE</a> definition is glaringly +incomplete. For this reason, +I am submitting this request for clarification (I assume that email is +sufficient; I don't recall that a more formal process is required). + + +<p>Request for clarification: + +<pre> +<a href=dpans11.htm#11.6.1.2090>11.6.1.2090</a> +READ-LINE +( c-addr u1 fileid -- u2 flag ior) +</pre> + +What is the meaning of "flag"? The rationale suggests that it is +an end-of-file flag (or not-end-of-file from the behavior documented +in the definition), but this is not clear from the definition. + +<p>What happens if the end of the file is encountered while reading a +line? The definition states that "If the operation succeeded, flag +is true and ior is zero", but success is not defined. I assume that +success is either that u1 characters were read or that a line terminator +was encountered. + +<p>Suggested resolution: flag is true unless the end-of-file is encountered, +in which case it is false. ior does not reflect whether the +end-of-file was encountered or not. + +<p> +--Loring + + +<h2><a name="reply">TC Reply to Q0001</a></h2> +<pre> +From: Erather@aol.com +Subject: Official Response to Q0001 +To: X3J14 Technical Committee +Cc: lbarra@itic.nw.dc.us +Date: Fri, 31 Mar 95 12:51:59 PST +Doc#: X3J14/Q0001R +Reference Doc#: X3.215.1994 ANS Forth +Date: March 31, 1995 +Title: Response to Request for Interpretation Q0001, Clarification of +READ-LINE +</pre> + +Q0001 DRAFT rev 1 + +<hr> +Key + +<i><blockquote> +Indicates lines from the original inquiry. The entirty text of the +inquiry is cited in this way. +</blockquote></i> + +<b><blockquote> +Indicates excerpts from the standard +</blockquote></b> + +Unmarked lines comprise the response to the inquiry. +<hr> + +<i><blockquote> +Request for clarification: + +<pre> +<a href=dpans11.htm#11.6.1.2090>11.6.1.2090</a> +READ-LINE +( c-addr u1 fileid -- u2 flag ior) +</pre> + +What is the meaning of "flag"? The rationale suggests that it is +an end-of-file flag (or not-end-of-file from the behavior documented +in the definition), but this is not clear from the definition. +</blockquote></i> + +In the following excerpt from the definition of +<a href=dpans11.htm#11.6.1.2090>READ-LINE</a> +, the word "if" +means "If and only if". + +<b><blockquote> +If the operation is initiated when the value returned by +<a href=dpans11.htm#11.6.1.1520>FILE-POSITION</a> +is equal to the value returned by +<a href=dpans11.htm#11.6.1.1522>FILE-SIZE</a> for the file identified +by fileid, flag is false ... +</blockquote></b> + + + +<i><blockquote> +What happens if the end of the file is encountered while reading a +line? The definition states that "If the operation succeeded, flag +is true and ior is zero", but success is not defined. I assume that +success is either that u1 characters were read or that a line terminator +was encountered. +</blockquote></i> + +"success" means that one of the following situations occurred: + +<ol> +<li>Some non-terminator characters were read into the buffer or + +<li>A line with a valid terminator sequence, but no characters other +than the terminator sequence, was read. In this case, u2=0, +flag=true, and ior=zero. +</ol> + +Specifically, if the last line in the file is non-empty, but has no +terminator, an attempt to read that line will "succeed", returning the +number of characters thus read, and flag will be true. The next +read, assuming that no intervening +<a href=dpans11.htm#11.6.1.2142>REPOSITION-FILE</a> occurs, will return +u2=0, flag=false, ior=false. + +<p>Here is complete list of return value combinations and their meanings: + +<pre> +u2 flag ior Meaning +-- ---- --- ------- +X X nonzero Something bad and unexpected happened + (end-of-file is not "unexpected") + +0 false zero End-of-file; no characters were read + +0 true zero A blank line was read + +0&lt;u2&lt;u1 true zero The entire line was read + +u1 true zero A partial line was read; the rest would + not fit in the buffer, and can be acquired + by additional calls to <a href=dpans11.htm#11.6.1.2090>READ-LINE</a>. +</pre> + +<i><blockquote> +Suggested resolution: flag is true unless the end-of-file is encountered, +in which case it is false. ior does not reflect whether the +end-of-file was encountered or not. +</blockquote></i> + +<h2><a name="ballot">Letter Ballot</a></h2> + +<pre> +From: Erather@aol.com +Subject: Letter Ballot 012 +To: X3J14 Technical Committee +Cc: lbarra@itic.nw.dc.us +Date: Fri, 31 Mar 95 12:54:23 PST +X3 Subgroup Letter Ballot +Authorized by X3 Procedures - Distributed by X3 Subgroup X3J14 Project: + X3J14, ANS Forth +Doc#: X3J14/LB012 +Reference Doc#s: X3J14/Q0001R, X3.215.1994 ANS Forth +Date: March 31, 1995 +Title: Response to Request for Interpretation Q0001 +Ballot Period: 30 Days +Ballot Closes NOON DATE: April 30, 1995 +Respond to: greg@minerva.com + or: Elizabeth D. Rather, Chair + FORTH, Inc. + 111 N. Sepulveda Blvd. Suite 300 + Manhattan Beach, CA 90266 + (310) 372-8493 FAX (310) 318-7130 + +Statement: + Document X3J14/Q0001R contains a proposed Response to Request for + Interpretation Q0001. + +Question: + Do you agree that this response represents the intended interpretation of + X3.215.1994 ANS Forth? + +YES____ NO____ ABSTAIN____ [NO or ABSTAIN votes require an explanation] + +Signature: [not required for email ballots] +Name: +Organization: + +INSTRUCTIONS: +Please return the entire letter ballot with your response _either_ by email +to greg@minerva.com _or_ by regular mail or fax to me at the above address, +before the closing date & time. + +All TC members must vote. Failure to vote in two consecutive ballots may +cause you to lose your voting rights in X3J14. + +Thank you for your participation. + +Elizabeth D. Rather, Chair, X3J14 +</pre> + +<h2><a name="results">Results of Letter Ballot</a></h2> + +<pre> +From: Erather@aol.com +Subject: Letter Ballot Results +To: X3J14 Technical Committee +Date: Fri, 05 May 95 18:50:18 PDT +Letter ballots 12 [and 13] have closed. Both passed. Results follow. + +Letter ballot 12: 13 yes, 0 no, 0 abstaining. + +[irrelevant material deleted] + +Thank you all for your participation. Of the 14 votes received, 9 came by +email, and the rest by fax (plus mine!). + +Regards... +Elizabeth +</pre> diff --git a/mwmouse/sources/AnsForth/A0002.HTM b/mwmouse/sources/AnsForth/A0002.HTM @@ -0,0 +1,367 @@ +<title>ANS Forth RFI 0002: search orders in which a given wordlist +occurs more than once</title> + +This document is produced by TC X3J14 as its clarification of questions +raised about ANSI X3.215-1994, American National Standard for Information +Systems - Programming Languages - Forth. + +<p>The questions covered herein were raised by query + +<p>Q0002, regarding the significance of defining search orders in +which a given wordlist occurs more than once. + +<p>There are four parts in this document: + +<ol> +<li><a href="#query">The original question as received.</a> +<li><a href="#reply">The TC's reply.</a> +<li><a href="#ballot">The Letter Ballot issued by TC Chair.</a> +<li><a href="#results">TC Chair's statement of ballot results.</a> +</ol> + +<h2><a name="query">Q0002 as received</a></h2> + +The following query has been assigned number Q0002 and has been +tentatively assigned to Mitch Bradley for drafting a response. +- Greg Bailey, by direction, Tue, 21 Mar 95 12:44:17 PST +<hr> + +<pre> +Subject: request for interpretation +To: x3j14@minerva.com +Cc: beebeebee@aol.com +From: John Rible <jrible@cruzio.com> +Date: Fri, 17 Mar 1995 01:46:52 -0800 +Message-Id: <199503170944.BAA21566@mail3.netcom.com> +Received: from cruzio.com by med3.minerva.com ; Fri, 17 Mar 1995 01:48 PST +Mime-Version: 1.0 +Content-Type: text/plain; charset="us-ascii" +>From jrible Fri Mar 17 01:46:52 0800 1995 remote from cruzio.com +Received: from cruzio.com by mail3.netcom.com (8.6.10/Netcom) id BAA21566; +Fri, 17 Mar 1995 01:44:27 -0800 +Received: from cruzio38.cruzio.com by cruzio.cruzio.com id aa29048; 17 Mar 95 +1:40 PST +X-Sender: jrible@cruzio.com +X-Mailer: <PC Eudora Version 1.4> +Content-Length: 2656 +</pre> + +folks- + +<p> +A friend has implemented wordlists using a linked-list to maintain the search +order. He put two links in each wordlist structure, one for a static list of +wordlists, the other a dynamic link for the search order. This avoided having +to allocate an arbitrary amount of space for the search order list/stack. + +<p> +After arguing with him that this is not compliant with the standard, I can't +find anything explicit that backs me up. The problem with his method is that +each wordlist can only appear ONCE in the search order. Well, that's not a +problem in itself, but when a wordlist already in the search order is added +to the top its previous location is lost! Again, that's not a real problem if +the complete search order is always set explicitly, since the deeper +occurrance +will never produce a match. + +<p> +But it sure messes up partial search order changes, such as using <a href=dpans16.htm#16.6.2.0715>ALSO</a> or +<a href=dpans16.htm#16.6.2.2037>PREVIOUS</a> to temporarily change the order. For example, the following sequence +will hang his system: + +<pre> +<a href=dpans16.htm#16.6.2.1965>ONLY</a> <a href=dpans16.htm#16.6.2.1590>FORTH</a> +VOCABULARY HIDDEN +... +<a href=dpans16.htm#16.6.2.0715>ALSO</a> HIDDEN <a href=dpans16.htm#16.6.2.0715>ALSO</a> <a href=dpans16.htm#16.6.2.1590>FORTH</a> <a href=dpans6.htm#6.2.2535>\</a> so FORTH is searched first +... +<a href=dpans16.htm#16.6.2.2037>PREVIOUS</a> <a href=dpans6.htm#6.2.2535>\</a> FORTH is no longer in the search order!!! +</pre> + +The requirement that I can't find, but believe that we intended, based on +extensive common practice, would require the phrase set-order get-order to +have no effect on the stack (as long as set-order got valid arguments, +anyway). +The problem sure seemed obvious to me, but he doesn't think it is, and even +came +up with the following definitions to deal with the issue: + +<pre> +<a href=dpans6.htm#6.1.0070>'</a> <a href=dpans6.htm#6.2.1930>NIP</a> <a href=dpans6.htm#6.2.2405>VALUE</a> 'ALSO + +<a href=dpans6.htm#6.1.0450>:</a> <a href=dpans16.htm#16.6.2.0715>ALSO</a> <a href=dpans6.htm#6.1.0080>(</a> - ) <a href=dpans6.htm#6.1.2510>[']</a> <a href=dpans6.htm#6.1.0290>1+</a> <a href=dpans6.htm#6.2.2295>TO</a> 'ALSO <a href=dpans6.htm#6.1.0460>;</a> +<a href=dpans6.htm#6.1.0450>:</a> <a href=dpans16.htm#16.6.2.1965>ONLY</a> <a href=dpans6.htm#6.1.0080>(</a> - ) -1 <a href=dpans16.htm#16.6.1.2197>SET-ORDER</a> <a href=dpans6.htm#6.1.2510>[']</a> <a href=dpans6.htm#6.2.1930>NIP</a> <a href=dpans6.htm#6.2.2295>TO</a> 'ALSO <a href=dpans6.htm#6.1.0460>;</a> +<a href=dpans6.htm#6.1.0450>:</a> <a href=dpans16.htm#16.6.2.2037>PREVIOUS</a> <a href=dpans6.htm#6.1.0080>(</a> - ) <a href=dpans16.htm#16.6.1.1647>GET-ORDER</a> <a href=dpans6.htm#6.2.1930>NIP</a> <a href=dpans6.htm#6.1.0300>1-</a> <a href=dpans16.htm#16.6.1.2197>SET-ORDER</a> <a href=dpans6.htm#6.1.0460>;</a> +<a href=dpans6.htm#6.1.0450>:</a> <VOCABULARY> <a href=dpans6.htm#6.1.0080>(</a> wid - ) <a href=dpans6.htm#6.2.2535>\</a> wid is the address of the wordlist data structure + <a href=dpans6.htm#6.1.0580>>R</a> <a href=dpans16.htm#16.6.1.1647>GET-ORDER</a> 'ALSO <a href=dpans6.htm#6.1.1370>EXECUTE</a> <a href=dpans6.htm#6.1.2060>R></a> <a href=dpans6.htm#6.1.2260>SWAP</a> <a href=dpans16.htm#16.6.1.2197>SET-ORDER</a> <a href=dpans6.htm#6.1.2510>[']</a> <a href=dpans6.htm#6.2.1930>NIP</a> <a href=dpans6.htm#6.2.2295>TO</a> 'ALSO <a href=dpans6.htm#6.1.0460>;</a> + +<a href=dpans6.htm#6.1.0450>:</a> <a href=dpans16.htm#16.6.2.1590>FORTH</a> <a href=dpans6.htm#6.1.0080>(</a> - ) <a href=dpans16.htm#16.6.1.1595>FORTH-WORDLIST</a> <VOCABULARY> <a href=dpans6.htm#6.1.0460>;</a> +<a href=dpans6.htm#6.1.0450>:</a> VOCABULARY <a href=dpans6.htm#6.1.0080>(</a> 'name' - ) <a href=dpans6.htm#6.1.1000>CREATE</a> ... <a href=dpans6.htm#6.1.1250>DOES></a> <VOCABULARY> <a href=dpans6.htm#6.1.0460>;</a> +</pre> + +<p> +While these deal with some of the situations of adding and removing +search-order +entries, I've seen a lot of places (in Sun's OpenBoot, for example) where +existing code would go up in flames if temporarily adding and removing a +vocabulary that happened to already be in the search order took it out +completely, as in my example above. Of course, the pathological (but currently +working) <a href=dpans16.htm#16.6.2.1965>ONLY</a> <a href=dpans16.htm#16.6.2.1590>FORTH</a> <a href=dpans16.htm#16.6.2.0715>ALSO</a> <a href=dpans16.htm#16.6.2.2037>PREVIOUS</a> also leaves his search order empty. + +<p> +Thanks for your responses (even the "you're a *&^#@*$%# idiot for wasting my +time" ones add a data point!-) + +<pre> +John Rible QuickSand "hardware, software, and so forth" jrible@cruzio.com + 317 California Street, Santa Cruz, CA 95060-4215 408-458-0399 +</pre> + +<h2><a name="reply">TC Reply to Q0002</a></h2> + +<pre> +From: Erather@aol.com +Subject: Official Response to Q0002 +To: X3J14 Technical Committee +Cc: lbarra@itic.nw.dc.us +Date: Fri, 31 Mar 95 12:52:24 PST +Doc#: X3J14/Q0002R +Reference Doc#: X3.215.1994 ANS Forth +Date: March 31, 1995 +Title: Response to Request for Interpretation Q0002, Clarification of Search +Orders +</pre> + +Q0002 DRAFT rev 1 + +<hr> +Key + +<i><blockquote> +Indicates lines from the original inquiry. The entiry text of the +inquiry is cited in this way. +</blockquote></i> + +<b><blockquote> +Indicates excerpts from the standard +</blockquote></b> + +Unmarked lines comprise the response to the inquiry. +<hr> + +<i><blockquote> +A friend has implemented wordlists using a linked-list to maintain +the search order. He put two links in each wordlist structure, one for +a static list of wordlists, the other a dynamic link for the search +order. This avoided having to allocate an arbitrary amount of space +for the search order list/stack. + +<p> +After arguing with him that this is not compliant with the standard, I +can't find anything explicit that backs me up. The problem with his +method is that each wordlist can only appear ONCE in the search +order. Well, that's not a problem in itself, but when a wordlist +already in the search order is added to the top its previous location +is lost! Again, that's not a real problem if the complete search order +is always set explicitly, since the deeper occurrance will never +produce a match. +</blockquote></i> + +In the following excerpt from the definition of <a href=dpans16.htm#16.6.1.2197>SET-ORDER</a>, the phrase +"word lists" means "sequence of word lists". + +<b><blockquote> + Set the search order to the word lists identified by widn ... wid1. + Subsequently, ... +</blockquote></b> + +<a href=dpans16.htm#16.6.1.1647>GET-ORDER</a> must return exactly the same sequence of wids "widn .. wid1" that +appeared in the arguments to the most recent execution of <a href=dpans16.htm#16.6.1.2197>SET-ORDER</a>, even +if a particular word list identifier appears more than once in that sequence. + +<p> +A Standard System is permitted to optimize its searching process so that +the existence of repetetions in the search order need not result in redundant +searches, but if so (a) the behavior of <a href=dpans16.htm#16.6.1.1647>GET-ORDER</a> and <a href=dpans16.htm#16.6.1.2197>SET-ORDER</a> must be as +described in the preceding paragraph, and (b) the results of a search must +be indistinguishable in all cases from the results were there no such +optimizations. + +<i><blockquote> +But it sure messes up partial search order changes, such as using <a href=dpans16.htm#16.6.2.0715>ALSO</a> +or <a href=dpans16.htm#16.6.2.2037>PREVIOUS</a> to temporarily change the order. For example, the +following sequence will hang his system: + +<pre> +<a href=dpans16.htm#16.6.2.1965>ONLY</a> <a href=dpans16.htm#16.6.2.1590>FORTH</a> +VOCABULARY HIDDEN +... +<a href=dpans16.htm#16.6.2.0715>ALSO</a> HIDDEN <a href=dpans16.htm#16.6.2.0715>ALSO</a> <a href=dpans16.htm#16.6.2.1590>FORTH</a> <a href=dpans6.htm#6.2.2535>\</a> so <a href=dpans16.htm#16.6.2.1590>FORTH</a> is searched first +... +<a href=dpans16.htm#16.6.2.2037>PREVIOUS</a> <a href=dpans6.htm#6.2.2535>\</a> <a href=dpans16.htm#16.6.2.1590>FORTH</a> is no longer in the search order!!! +</pre> +</blockquote></i> + +Historically, in most implementations of the <a href=dpans16.htm#16.6.2.0715>ALSO</a> .. <a href=dpans16.htm#16.6.2.1965>ONLY</a> search order +mechanism, the sequence shown would result in the search order containing + +<pre> + &lt;minimum search order&gt; &lt;FORTH wordlist&gt; &lt;HIDDEN wordlist&gt; +</pre> + +The standard intends to codify that existing practice. + + +<i><blockquote> +The requirement that I can't find, but believe that we intended, based +on extensive common practice, would require the phrase "set-order get-order" +to have no effect on the stack (as long as set-order got valid arguments, +anyway). The problem sure seemed obvious to me, but he doesn't think it +is, and even came up with the following definitions to deal with the issue: + +<pre> +<a href=dpans6.htm#6.1.0070>'</a> <a href=dpans6.htm#6.2.1930>NIP</a> <a href=dpans6.htm#6.2.2405>VALUE</a> 'ALSO + +<a href=dpans6.htm#6.1.0450>:</a> <a href=dpans16.htm#16.6.2.0715>ALSO</a> <a href=dpans6.htm#6.1.0080>(</a> - ) <a href=dpans6.htm#6.1.2510>[']</a> <a href=dpans6.htm#6.1.0290>1+</a> <a href=dpans6.htm#6.2.2295>TO</a> 'ALSO <a href=dpans6.htm#6.1.0460>;</a> +<a href=dpans6.htm#6.1.0450>:</a> <a href=dpans16.htm#16.6.2.1965>ONLY</a> <a href=dpans6.htm#6.1.0080>(</a> - ) -1 <a href=dpans16.htm#16.6.1.2197>SET-ORDER</a> <a href=dpans6.htm#6.1.2510>[']</a> <a href=dpans6.htm#6.2.1930>NIP</a> <a href=dpans6.htm#6.2.2295>TO</a> 'ALSO <a href=dpans6.htm#6.1.0460>;</a> +<a href=dpans6.htm#6.1.0450>:</a> <a href=dpans16.htm#16.6.2.2037>PREVIOUS</a> <a href=dpans6.htm#6.1.0080>(</a> - ) <a href=dpans16.htm#16.6.1.1647>GET-ORDER</a> <a href=dpans6.htm#6.2.1930>NIP</a> <a href=dpans6.htm#6.1.0300>1-</a> <a href=dpans16.htm#16.6.1.2197>SET-ORDER</a> <a href=dpans6.htm#6.1.0460>;</a> +<a href=dpans6.htm#6.1.0450>:</a> <VOCABULARY> <a href=dpans6.htm#6.1.0080>(</a> wid - ) <a href=dpans6.htm#6.2.2535>\</a> wid is the address of the wordlist data structure + <a href=dpans6.htm#6.1.0580>>R</a> <a href=dpans16.htm#16.6.1.1647>GET-ORDER</a> 'ALSO <a href=dpans6.htm#6.1.1370>EXECUTE</a> <a href=dpans6.htm#6.1.2060>R></a> <a href=dpans6.htm#6.1.2260>SWAP</a> <a href=dpans16.htm#16.6.1.2197>SET-ORDER</a> <a href=dpans6.htm#6.1.2510>[']</a> <a href=dpans6.htm#6.2.1930>NIP</a> <a href=dpans6.htm#6.2.2295>TO</a> 'ALSO <a href=dpans6.htm#6.1.0460>;</a> + +<a href=dpans6.htm#6.1.0450>:</a> <a href=dpans16.htm#16.6.2.1590>FORTH</a> <a href=dpans6.htm#6.1.0080>(</a> - ) <a href=dpans16.htm#16.6.1.1595>FORTH-WORDLIST</a> <VOCABULARY> <a href=dpans6.htm#6.1.0460>;</a> +<a href=dpans6.htm#6.1.0450>:</a> VOCABULARY <a href=dpans6.htm#6.1.0080>(</a> 'name' - ) <a href=dpans6.htm#6.1.1000>CREATE</a> ... <a href=dpans6.htm#6.1.1250>DOES></a> <VOCABULARY> <a href=dpans6.htm#6.1.0460>;</a> +</pre> +</blockquote></i> + +With these definitions, the sequence "ALSO GET-ORDER" would not yield the +result specified by the standard. + +<i><blockquote> +While these deal with some of the situations of adding and removing +search-order entries, I've seen a lot of places (in Sun's OpenBoot, +for example) where existing code would go up in flames if temporarily +adding and removing a vocabulary that happened to already be in the +search order took it out completely, as in my example above. Of course, +the pathological (but currently working) <a href=dpans16.htm#16.6.2.1965>ONLY</a> <a href=dpans16.htm#16.6.2.1590>FORTH</a> <a href=dpans16.htm#16.6.2.0715>ALSO</a> <a href=dpans16.htm#16.6.2.2037>PREVIOUS</a> also +leaves his search order empty. +</blockquote></i> + +The ANS Forth search order wordset is intended to provide a predictable +mechanism for managing search orders in arbitrary ways, albeit subject to +the system-dependent limitation on the maximum number of word lists. Some +applications, for example, choose to use the search order as a "stack", +adding and removing word lists without regard to whether or not those +word lists already appear in the search order. + +<h2><a name="ballot">Letter Ballot</a></h2> + +<pre> +From: Erather@aol.com +Subject: Letter Ballot 013 +To: X3J14 Technical Committee +Cc: lbarra@itic.nw.dc.us +Date: Fri, 31 Mar 95 12:54:18 PST +X3 Subgroup Letter Ballot +Authorized by X3 Procedures - Distributed by X3 Subgroup X3J14 Project: + X3J14, ANS Forth +Doc#: X3J14/LB013 +Reference Doc#s: X3J14/Q0002R, X3.215.1994 ANS Forth +Date: March 31, 1995 +Title: Response to Request for Interpretation Q0002 +Ballot Period: 30 Days +Ballot Closes NOON DATE: April 30, 1995 +Respond to: greg@minerva.com + or: Elizabeth D. Rather, Chair + FORTH, Inc. + 111 N. Sepulveda Blvd. Suite 300 + Manhattan Beach, CA 90266 + (310) 372-8493 FAX (310) 318-7130 + +Statement: + Document X3J14/Q0002R contains a proposed Response to Request for + Interpretation Q0002. + +Question: + Do you agree that this response represents the intended interpretation of + X3.215.1994 ANS Forth? + +YES____ NO____ ABSTAIN____ [NO or ABSTAIN votes require an explanation] + +Signature: [not required for email ballots] +Name: +Organization: + +INSTRUCTIONS: +Please return the entire letter ballot with your response _either_ by email +to greg@minerva.com _or_ by regular mail or fax to me at the above address, +before the closing date & time. + +All TC members must vote. Failure to vote in two consecutive ballots may +cause you to lose your voting rights in X3J14. + +Thank you for your participation. + +Elizabeth D. Rather, Chair, X3J14 +</pre> + +<h2><a name="results">Results of Letter Ballot</a></h2> + +<pre> +From: Erather@aol.com +Subject: Letter Ballot Results +To: X3J14 Technical Committee +Date: Fri, 05 May 95 18:50:18 PDT +Letter ballots [12 and] 13 have closed. Both passed. Results follow. + +[...] + +Letter ballot 13: 13 yes, 1 no, 0 abstaining. + +[...] + +Jax [Jack Woehr] voted No on LB13. His comments follow: + +LB13, Woehr: I made a proposal which was drowned out in Mitch's discus- +sion with himself on the maillist. It was letting Mitch make all the +decisions in consultation with himself that got us in trouble at the +spring meeting in Oregon in 1992 and delayed the standard by about a +year. I expect my proposals to be heard, even if not adopted, in hopes +we can avoid similar problems in the future. + +--------- FOR THE RECORD ----------------------------------- +[Here is the e-mail message to which Woehr refers. The active +part of the discussion occurred over a three day period, involved +about a dozen e-mail messages, and had seven participants who +posted.] + +> +> > I think Mitch has gotten the issue here backward. + +<...> + +> the arguments that it passes to <a href=dpans16.htm#16.6.1.2197>SET-ORDER</a> be mutually distinct? +> +> I believe that the answer is emphatically "no". + + + I agree with Mitch whole-heartedly. I would move to add that: + +"It is the sense of the X3J14 TC that no element of <a href=dpans17.htm#17.6.1.2191>SEARCH</a> <a href=dpans16.htm#16.6.2.1985>ORDER</a> Wordset +introduces novelty into general Forth praxis, with the exception +that a <a href=dpans16.htm#16.6.1.2460>WORDLIST</a> now has a tangible representation on the stack, whereas +FORTH-83 VOCABULARY had no such tangible representation. In all other +respects the de-facto behavior of Forth search order operations are +utterly unchanged from Forth-83." + + Do I hear a second? + + =jax= + +[...] + +Thank you all for your participation. Of the 14 votes received, 9 came by +email, and the rest by fax (plus mine!). + +Regards... +Elizabeth +</pre> diff --git a/mwmouse/sources/AnsForth/A0003.HTM b/mwmouse/sources/AnsForth/A0003.HTM @@ -0,0 +1,560 @@ +<title>ANS Forth RFI 0003: What's allowed between <a href=dpans6.htm#6.1.1000>CREATE</a> and DOES></title> + +This document is produced by TC X3J14 as its clarification of questions +raised about ANSI X3.215-1994, American National Standard for Information +Systems - Programming Languages - Forth. + +<p> +The questions covered herein were raised by query + +<p> +Q0003, regarding usage rules for defining words centering on various +wordlist actions occurring between <a href=dpans6.htm#6.1.1000>CREATE</a> and <a href=dpans6.htm#6.1.1250>DOES></a>. + +<p>There are four parts in this document: + +<ol> +<li><a href="#query">The original question as received.</a> +<li><a href="#reply">The TC's reply.</a> +<li><a href="#ballot">The Letter Ballot issued by TC Chair.</a> +<li><a href="#results">TC Chair's statement of ballot results.</a> +</ol> + +<h2><a name="query">Q0003 as received</a></h2> + +The following query has been assigned number Q0003 and has been +tentatively assigned to Jack Woehr for drafting a response. +- Greg Bailey, by direction 950509 1900Z +<hr> + +<pre> +Subject: Defining words, search order and wordlists. +To: ANSForth@minerva.com +From: aph@oclc.org (Andrew Houghton) +Date: Tue, 9 May 95 11:09:48 -0400 +Message-Id: <9505091520.AA26898@fssun09.dev.oclc.org> +Received: from oclc.org by med3.minerva.com ; Tue, 9 May 1995 08:25 PDT +Content-Type: text +>From aph Tue May 9 11:09:48 0400 1995 remote from oclc.org +Return-Path: <aph@oclc.org> +Received: from next30-06 (next30-06.dev.oclc.org) by fssun09.dev.oclc.org + (4.1/SMI-4.1) id AA26898; Tue, 9 May 95 11:20:56 EDT +Received: by next30-06 (NX5.67d/NX3.0X) id AA00583; Tue, 9 May 95 11:09:48 -0400 +Received: by NeXT.Mailer (1.100) +Received: by NeXT Mailer (1.100) +Content-Length: 7015 +</pre> + +I'm not sure whether doing the following is legal ANS FORTH so I was +looking for someone to provide an interpretation as to whether it is +legal and if not why not. + +<p> +Here is my problem. Define the following: + +<pre> + \ Add selx to search order and make new definitions go into selx. +: set-current-wordlist ( selx -- ) + >r get-order 1+ r> swap set-order definitions ; + + \ Fill wordlist with default definitions. +: fill-wordlist ( n n n -- ) + s" constant a" evaluate + s" constant b" evaluate + s" constant c" evaluate ; + + \ Create new wordlist with default definitions. +: create-wordlist ( -- ) + create + wordlist set-current-wordlist + 1 2 3 fill-wordlist + does> ( body -- ) + set-current-wordlist ; + + + \ Create new wordlist with default definitions, revised. +: create-wl ( -- ) + wordlist dup set-current-wordlist + 1 2 3 fill-wordlist + previous definitions + create + dup , set-current-wordlist + does> ( body -- ) + @ set-current-wordlist ; +</pre> + +I believe that the above words set-current-wordlist and fill-wordlist by +themselves conform to the standard. My problem lies with the word +create-wordlist. Create-wordlist tries to create a defining word which +creates a wordlist, adds the newly created wordlist to the search order, +set the current definitions to go into the newly created wordlist, then +fills the wordlist with some common definitions. + +<p> +When the word create-wordlist is executed (ie. create-wordlist abc) it +produces a new (ie. abc) which PFE, an ANS FORTH, is marked in the +dictionary as a variable -- not a defining word and c in the newly +created wordlist is marked in its dictionary as a defining word -- not +a constant! As far as I can tell from the standard, this could be a +result of does> (section 6.1.1250) replacing the execution semantics of +the most recent definition, ie. abc which was defined by create, and the +fact that fill-wordlist creates new definitions. It seems that section +"3.4.5 Compilation" of the standard may apply somehow as well. + +<p> +The standard seems unclear to me when it says that: "does> replaces the +execution semantics of the most recent definition." I would have expected +it to use the term "current definition" from "2.1 Definitions of terms." +But again whether its "recent definition" or "current definition" it really +says to me: "replaces the execution semantics of the most recent/current +definition [in the most recent/current definition's wordlist]". Note I +added the bracketed item to show what the standard implies to me. However +it is clear that PFE, an ANS FORTH, implies "in the current wordlist where +definitions are being placed." + +<p> +It's unclear in the standard, to me, which one is correct. Given the +ambiguity I rewrote the word create-wordlist and it appears as the word +create-wl. The new word create-wl now creates the wordlist fills it with +the common definitions and restores the previous wordlist. Then create-wl +*creates* the defining word. This seems to work for PFE but may not work +for other ANS implementations. However, this points out another possible +problem with the definitions of create-wordlist and create-wl. + +<p> +The newly perceived problem is that both words change the search order before +the does> is done. It seems to me that sections <a href=dpans16.htm#16.3.3>16.3.3</a> and <a href=dpansa16.htm#A.16.3.3>A.16.3.3</a> say that +this produces an ambiguous condition. Is this correct? Does <a href=dpans16.htm#16.3.3>16.3.3</a> refer +to when the word create-wordlist is being compiled or the word being defined +by create-wordlist? + +<p> +My final question is: "Is it possible to portably create a defining word +which creates a wordlist, fills that wordlist with definitions and then +switches the search order to that wordlist with the current ANS standard?" + +<hr> +The following sections from the ANS standard, which I thought were +relevant to the problem, are quoted below for your convience: + +<blockquote> +<a href=dpans2.htm#2.1>2.1</a> Definitions of terms + +<dl> + +<dt> +ambiguous condition: + +<dd> + A circumstance for which this Standard does not prescribe a specific + behavior for Forth systems and programs. + +<p> + Ambiguous conditions include such things as the absence of a needed + delimiter while parsing, attempted access to a nonexistent file, or + attempted use of a nonexistent word. An ambiguous condition also exists + when a Standard word is passed values that are improper or out of range. + +<dt> +current definition: + +<dd> + The definition whose compilation has been started but not yet ended. + +<dt> +defining word: + +<dd> + A Forth word that creates a new definition when executed. + +<dt> +definition: + +<dd> + A Forth execution procedure compiled into the dictionary. + +<dt> +dictionary: + +<dd> + An extensible structure that contains definitions and associated + data space. +</dl> + + +<a href=dpans3.htm#3.4.5>3.4.5</a> Compilation + +<p> +A program shall not attempt to nest compilation of definitions. + +<p> +During the compilation of the current definition, a program shall +not execute any defining word, <a href=dpans6.htm#6.2.0455>:NONAME</a>, or any definition that +allocates dictionary data space. The compilation of the current +definition may be suspended using <a href=dpans6.htm#6.1.2500>[</a> (left-bracket) and resumed +using <a href=dpans6.htm#6.1.2540>]</a> (right-bracket). While the compilation of the current +definition is suspended, a program shall not execute any defining +word, <a href=dpans6.htm#6.2.0455>:NONAME</a>, or any definition that allocates dictionary data space. + +<p> +<a href=dpans6.htm#6.1.1250>6.1.1250</a> <a href=dpans6.htm#6.1.1250>DOES></a> does CORE + +<p> +Interpretation: Interpretation semantics for this word are undefined. + +<p> +Compilation: ( C: colon-sys1 -- colon-sys2 ) + +<p> +Append the run-time semantics below to the current definition. Whether +or not the current definition is rendered findable in the dictionary by +the compilation of <a href=dpans6.htm#6.1.1250>DOES></a> is implementation defined. Consume colon-sys1 +and produce colon-sys2. Append the initiation semantics given below to +the current definition. + +<p> +Run-time: ( -- ) ( R: nest-sys1 -- ) + +<p> +Replace the execution semantics of the most recent definition, referred +to as name, with the name execution semantics given below. Return control +to the calling definition specified by nest-sys1. An ambiguous condition +exists if name was not defined with <a href=dpans6.htm#6.1.1000>CREATE</a> or a user-defined word that +calls <a href=dpans6.htm#6.1.1000>CREATE</a>. + +<p> +Initiation: ( i*x -- i*x a-addr ) ( R: -- nest-sys2 ) + +<p> +Save implementation-dependent information nest-sys2 about the calling +definition. Place name's data field address on the stack. The stack +effects i*x represent arguments to name. + +<p> +name Execution: ( i*x -- j*x ) + +<p> +Execute the portion of the definition that begins with the initiation +semantics appended by the <a href=dpans6.htm#6.1.1250>DOES></a> which modified name. The stack effects +i*x and j*x represent arguments to and results from name, respectively. + + +<p> +<a href=dpans16.htm#16.3.3>16.3.3</a> Finding definition names + +<p> +An ambiguous condition exists if a program changes the compilation word +list during the compilation of a definition or before modification of the +behavior of the most recently compiled definition with <a href=dpans15.htm#15.6.2.0470>;CODE</a>, <a href=dpans6.htm#6.1.1250>DOES></a>, or +<a href=dpans6.htm#6.1.1710>IMMEDIATE</a>. + + +<p> +<a href=dpansa16.htm#A.16.3.3>A.16.3.3</a> Finding definition names + +<p> +In other words, the following is not guaranteed to work: + +<pre> +<a href=dpans6.htm#6.1.0450>:</a> FOO ... <a href=dpans6.htm#6.1.2500>[</a> ... <a href=dpans16.htm#16.6.1.2195>SET-CURRENT</a> <a href=dpans6.htm#6.1.2540>]</a> ... <a href=dpans6.htm#6.1.2120>RECURSE</a> ... <a href=dpans6.htm#6.1.0460>;</a> <a href=dpans6.htm#6.1.1710>IMMEDIATE</a> +</pre> + +<p> +<a href=dpans6.htm#6.1.2120>RECURSE</a>, <a href=dpans6.htm#6.1.0460>;</a> (semicolon), and <a href=dpans6.htm#6.1.1710>IMMEDIATE</a> may or may not need information +stored in the compilation word list. + +</blockquote> + +<h2><a name="reply">TC Reply to Q0003</a></h2> +<pre> +From: Elizabeth D. Rather +Subject: Q0003R, Wordlists, Official Response +To: X3J14 Technical Committee +Cc: lbarra@itic.nw.dc.us +Date: Wed, 31 May 95 17:03:44 PDT +Doc#: X3J14/Q0003R +Reference Doc#: X3.215.1994 ANS Forth +Date: May 16, 1995 +Title: Response to Request for Interpretation Q0003, Clarification of Wordlists +</pre> + +Abstract: No definition can be added to the dictionary between <a href=dpans6.htm#6.1.1000>CREATE</a> and +<a href=dpans6.htm#6.1.1250>DOES></a>. Changing compilation wordlist between <a href=dpans6.htm#6.1.1000>CREATE</a> and <a href=dpans6.htm#6.1.1250>DOES></a> is +ambiguous. + +<pre> +X3.215-1994_KEYWORD_LIST: + Core Word Set + <a href=dpans6.htm#6.1.1000>CREATE</a> <a href=dpans6.htm#6.1.1000>6.1.1000</a> <a href=dpans6.htm#6.1.1250>DOES></a> <a href=dpans6.htm#6.1.1250>6.1.1250</a> + Search Order Word Set + <a href=dpans16.htm#16.6.1.1180>DEFINITIONS</a> <a href=dpans16.htm#16.6.1.1180>16.6.1.1180</a> <a href=dpans16.htm#16.6.1.1647>GET-ORDER</a> <a href=dpans16.htm#16.6.1.1647>16.6.1.1647</a> <a href=dpans16.htm#16.6.1.2197>SET-ORDER</a> <a href=dpans16.htm#16.6.1.2197>16.6.1.2197</a> + Terms: + Ambiguous condition <a href=dpans2.htm#2.1>2.1</a> + Compilation word list <a href=dpans16.htm#16.6.1.2195>16.6.1.2195</a> +X3.215-1994_KEYWORD_LIST; +Author: Jack Woehr +</pre> + +<i><blockquote> +Here is my problem. Define the following: + +<pre> + \ Add selx to search order and make new definitions go into selx. +: set-current-wordlist ( selx -- ) + >r get-order 1+ r> swap set-order definitions ; +</pre> +</blockquote></i> + + set-current-wordlist is standard Forth in the given context, +i.e. as a definition commenced while the system is interpretive +mode. Note that it has a dependency on the SEARCH-ORDER Word Set with +Extensions. + +<p> + Incidentally, the Technical Committee encourages the use of +uppercase for Standard words in clarification queries submitted to +X3J14. + +<i><blockquote> +<pre> + \ Fill wordlist with default definitions. +: fill-wordlist ( n n n -- ) + s" constant a" evaluate + s" constant b" evaluate + s" constant c" evaluate ; +</pre> +</blockquote></i> + + fill-wordlist is standard Forth in the given context. + +<i><blockquote> +<pre> + \ Create new wordlist with default definitions. +: create-wordlist ( -- ) + create + wordlist set-current-wordlist + 1 2 3 fill-wordlist + does> ( body -- ) + set-current-wordlist ; +</pre> +</blockquote></i> + + This definition of create-wordlist is erroneous as later +noted by its author: the wordlist-id is not preserved so that +the body address returned by words can be dereferenced to +the (should have been) stored wordlist-id for set-current wordlist. + +<p> + But this flaw conceals the definition's intent, to effect +<a href=dpans6.htm#6.1.1000>CREATE</a>, change the compilation wordlist, add definitions, then return +to the original compilation wordlist and effect <a href=dpans6.htm#6.1.1250>DOES></a>. This is not +Standard Forth. + +<p> + Words cannot be added to the dictionary between the action of +<a href=dpans6.htm#6.1.1250>DOES></a> and the most recent action of <a href=dpans6.htm#6.1.1000>CREATE</a>. <a href=dpans6.htm#6.1.1250>DOES></a> modifies a word +created by <a href=dpans6.htm#6.1.1000>CREATE</a>. <a href=dpans6.htm#6.1.1250>DOES></a> modifies the most recent definition. Thus +there can have been no new definition added to the dictionary which +was not created by <a href=dpans6.htm#6.1.1000>CREATE</a> immediately prior to a <a href=dpans6.htm#6.1.1250>DOES></a>. Note that +<a href=dpans6.htm#6.1.1250>DOES></a> is found in the Core word set and never modified later in the +Standard when the concept of multiple compilation wordlists is +introduced. + +<p> + Although the Standard does not preclude implementations using +multiple wordlists from having "most recent" definitions in each +wordset, the definition of <a href=dpans6.htm#6.1.1250>DOES></a> is not extended to provide for +multiple wordlists, and makes no provision for other than a single +"most recent" definition. The clear intent of the Standard is that +words cannot be added to the dictionary between the action of <a href=dpans6.htm#6.1.1250>DOES></a> +and the most recent action of <a href=dpans6.htm#6.1.1000>CREATE</a>. + +<p> + (Also note that the execution of <a href=dpans16.htm#16.6.1.2460>WORDLIST</a> may consume data +space, altering the address returned by <a href=dpans6.htm#6.1.1650>HERE</a>. The portable program +must avoid executing <a href=dpans16.htm#16.6.1.2460>WORDLIST</a> between <a href=dpans6.htm#6.1.1000>CREATE</a> and the execution of + <a href=dpans6.htm#6.1.0150>,</a> "comma" that saves the wordlist ID in the body of the created +definition. Otherwise, the CREATE'd, DOES>'d entity at runtime will +point at space which subsequently might have been used for the +WORDLIST.) + +<p> + The following was suggested as an improvement the the original +definition of create-wordlist. + +<i><blockquote> +<pre> + \ Create new wordlist with default definitions, revised. +: create-wl ( name< > -- ) + wordlist dup set-current-wordlist + 1 2 3 fill-wordlist + previous definitions + create + dup , set-current-wordlist + does> ( body -- ) + @ set-current-wordlist ; +</pre> +</blockquote></i> + +<p> + This definition create-wl at runtime changes the compilation +wordlist [16.6.1.2195] between <a href=dpans6.htm#6.1.1000>CREATE</a> [6.1.1000] and <a href=dpans6.htm#6.1.1250>DOES></a> [6.1.1250]. +The Forth Standard, <a href=dpans16.htm#16.3.3>16.3.3</a> para 4: + +<p> +"An ambiguous condition exists if a program changes the compilation +word list during the compilation of a definition or before modi- +fication of the behavior of the most recently compiled definition +with <a href=dpans15.htm#15.6.2.0470>;CODE</a> <a href=dpans6.htm#6.1.1250>DOES></a> or IMMEDIATE." + +<p> + Therefore, while not "non-Standard", the amended definition +create-wl exhibits a platform dependency on the particular resolution +of the ambiguity selected by the hosting Standard System, if create-wl +is to execute deterministically. + +<i><blockquote> +My final question is: "Is it possible to portably create a defining word +which creates a wordlist, fills that wordlist with definitions and then +switches the search order to that wordlist with the current ANS standard?" +</blockquote></i> + + Yes. + +<pre> +<a href=dpans6.htm#6.1.0450>:</a> SET-CURRENT-WORDLIST <a href=dpans6.htm#6.1.0080>(</a> my_wid --) <a href=dpans6.htm#6.2.2535>\</a> as above + <a href=dpans6.htm#6.1.0580>>R</a> <a href=dpans16.htm#16.6.1.1647>GET-ORDER</a> <a href=dpans6.htm#6.1.0290>1+</a> <a href=dpans6.htm#6.1.2060>R></a> <a href=dpans6.htm#6.1.0080>(</a> -- widn wid1 n my_wid) + <a href=dpans6.htm#6.1.2260>SWAP</a> <a href=dpans16.htm#16.6.1.2197>SET-ORDER</a> <a href=dpans16.htm#16.6.1.1180>DEFINITIONS</a> <a href=dpans6.htm#6.1.0080>(</a> --) +<a href=dpans6.htm#6.1.0460>;</a> + +<a href=dpans6.htm#6.1.0450>:</a> 78-VOCABULARY <a href=dpans6.htm#6.1.0080>(</a> "name< >" my_wid --) + <a href=dpans6.htm#6.1.1000>CREATE</a> <a href=dpans6.htm#6.1.0150>,</a> <a href=dpans6.htm#6.1.0080>(</a> --) + <a href=dpans6.htm#6.1.1250>DOES></a> <a href=dpans6.htm#6.1.0080>(</a> self --) <a href=dpans6.htm#6.2.2535>\</a> runtime + <a href=dpans6.htm#6.1.0650>@</a> <a href=dpans6.htm#6.1.0080>(</a> -- my_wid) + SET-CURRENT-WORDLIST <a href=dpans6.htm#6.1.0080>(</a> --) +<a href=dpans6.htm#6.1.0460>;</a> + +<a href=dpans6.htm#6.1.0450>:</a> CREATE-WORDLIST <a href=dpans6.htm#6.1.0080>(</a> "name< >" --) + <a href=dpans16.htm#16.6.1.2460>WORDLIST</a> <a href=dpans6.htm#6.1.1290>DUP</a> 78-VOCABULARY <a href=dpans6.htm#6.1.0080>(</a> -- wid) + SET-CURRENT-WORDLIST <a href=dpans6.htm#6.1.0080>(</a> --) + fill-wordlist <a href=dpans6.htm#6.2.2535>\</a> _vide supra_ + <a href=dpans16.htm#16.6.2.2037>PREVIOUS</a> <a href=dpans16.htm#16.6.1.1180>DEFINITIONS</a> +<a href=dpans6.htm#6.1.0460>;</a> +</pre> + +<p> +From the point of view of CREATE-WORDLIST at runtime, 78-VOCABULARY is +atomic. Its work is done before the change in search order occurs for +the first time. Good factoring avoids a grey area of the Standard. + +<p> + Greg Bailey notes that during the mailing list discussion of +this issue, he erroneously posted using <a href=dpans6.htm#6.1.2410>VARIABLE</a> where <a href=dpans6.htm#6.1.1000>CREATE</a> was +intended. Greg regrets any confusion thus caused. + +<pre> +Elizabeth D. Rather "Forth-based products and +FORTH, Inc. Services for real-time +111 N. Sepulveda Blvd. #300 applications since 1973" +Manhattan Beach, CA 90266 +(800) 55FORTH or (310) 372-8493 +FAX (310) 318-7130 +</pre> + +<h2><a name="ballot">Letter Ballot</a></h2> + +<pre> +From: Elizabeth D. Rather +Subject: LB014, RE Q0003, Wordlists +To: X3J14 Technical Committee +Cc: lbarra@itic.nw.dc.us +Date: Wed, 31 May 95 17:03:36 PDT +X3 Subgroup Letter Ballot +Authorized by X3 Procedures - Distributed by X3 Subgroup X3J14 +Project: X3J14, ANS Forth +Doc#: X3J14/LB014 +Reference Doc#s: X3J14/Q0003R, X3.215.1994 ANS Forth +Date: May 31, 1995 +Title: Response to Request for Interpretation Q0003, Wordlists +Ballot Period: 30 Days +Ballot Closes NOON DATE: June 30, 1995 +Respond to: greg@minerva.com + or: Elizabeth D. Rather, Chair + FORTH, Inc. + 111 N. Sepulveda Blvd. Suite 300 + Manhattan Beach, CA 90266 + (310) 372-8493 FAX (310) 318-7130 + erather@forth.com + +Statement: + Document X3J14/Q0003R contains a proposed Response to Request for + Interpretation Q0003. + +Question: + Do you agree that this response represents the intended interpretation of + X3.215.1994 ANS Forth? + + +/------------------------ begin response area----------------------\ +| +| YES____ NO____ ABSTAIN____ +| +| Signature: [not required for email ballots] +| Name: +| Organization: +| +| Explanation (REQUIRED for NO or ABSTAIN votes): +| <none> +\------------------------ end response area ----------------------/ + +INSTRUCTIONS: +Please return the entire letter ballot with your response _either_ by email +to greg@minerva.com _or_ by regular mail, fax or email to me at the above +address, before the closing date & time. + + If replying electronically PLEASE edit only within the response area + indicated above, inserting any explanatory text in place of <none>. + Any changes made outside that area will likely be overlooked. + +All TC members must vote. Failure to vote in two consecutive ballots may +cause you to lose your voting rights in X3J14. + +Thank you for your participation. + +Elizabeth D. Rather, Chair, X3J14 + +Elizabeth D. Rather "Forth-based products and +FORTH, Inc. Services for real-time +111 N. Sepulveda Blvd. #300 applications since 1973" +Manhattan Beach, CA 90266 +(800) 55FORTH or (310) 372-8493 +FAX (310) 318-7130 +</pre> + +<h2><a name="results">Results of Letter Ballot</a></h2> + +<pre> +From: Elizabeth D. Rather +Subject: LBs 14 & 15 +To: X3J14 Technical Committee +Cc: l.barra@itic.nw.dc.us +Date: Fri, 07 Jul 95 12:05:04 PDT +Letter ballots 14 [and 15] closed at noon July 1 with the following results: + + Y N A NV +LB14: 12, 0, 0, 3 + +[...] + +Thank you for your participation. + +Regards, +Elizabeth D. Rather, Chair X3J14 + +Elizabeth D. Rather "Forth-based products and +FORTH, Inc. Services for real-time +111 N. Sepulveda Blvd. #300 applications since 1973" +Manhattan Beach, CA 90266 +(800) 55FORTH or (310) 372-8493 +FAX (310) 318-7130 +</pre> diff --git a/mwmouse/sources/AnsForth/A0004.HTM b/mwmouse/sources/AnsForth/A0004.HTM @@ -0,0 +1,337 @@ +<title>ANS Forth RFI 0004: standard punctuation for double-cell numbers</title> + +This document is produced by TC X3J14 as its clarification of questions +raised about ANSI X3.215-1994, American National Standard for Information +Systems - Programming Languages - Forth. + +<p>The questions covered herein were raised by query + +<p>Q0004, regarding standard punctuation for double-cell numbers when +occurring in programs. + +<p>There are four parts in this document: + +<ol> +<li><a href="#query">The original question as received.</a> +<li><a href="#reply">The TC's reply.</a> +<li><a href="#ballot">The Letter Ballot issued by TC Chair.</a> +<li><a href="#results">TC Chair's statement of ballot results.</a> +</ol> + +<h2><a name="query">Q0004 as received</a></h2> +The following query has been assigned number Q0004 and has been +tentatively assigned to John Hayes for drafting a response. +- Greg Bailey, by direction 950516 0400Z +<hr> + +<pre> +Subject: ANS Forth Clarification Procedures +To: greg@minerva.com +From: BiMu@aol.com (Bill Muench) +Date: Mon, 15 May 1995 15:13:21 -0400 +Message-Id: <950515151319_119428296@aol.com> +Received: from aol.com by med3.minerva.com <a href=dpans6.htm#6.1.0460>;</a> Mon, 15 May 1995 12:18 PDT +Request for Clairification. +</pre> + +I have found the following references to *Text interpreter input number +conversion*. + +<p> +The input of Floating-Point numbers is clear, my need for clairification is +with double-cell numbers: + +<p> +Will a number with an *embedded* decimal point be converted to a double-cell +number in a Standard Forth system? + +<p> +If not, what about <a href=dpansa12.htm#A.12.3.7>A.12.3.7</a> *...should treat numbers that have an embedded +decimal point, but no exponent, as floating-point numbers rather than double +cell numbers. This suggestion, although it has merit, has always been voted +down because it would break too much existing code;* ? + +<p> +Is <a href=dpans8.htm#8.3.2>8.3.2</a> an example or the rule? ( a decimal point at the end) + +<blockquote> +<a href=dpans8.htm#8.3.2>8.3.2</a> Text interpreter input number conversion + +<p> +When the text interpreter processes a number that is immediately followed by +a decimal point and is not found as a definition name, the text interpreter +shall convert it to a double-cell number. +For example, entering <a href=dpans6.htm#6.1.1170>DECIMAL</a> 1234 leaves the single-cell number 1234 on the +stack, and entering <a href=dpans6.htm#6.1.1170>DECIMAL</a> 1234. leaves the double-cell number 1234 0 on the +stack. + +<p> +See: <a href=dpans3.htm#3.4.1.3>3.4.1.3</a> Text interpreter input number conversion. + +<p> +<a href=dpans12.htm#12.3.7>12.3.7</a> Text interpreter input number conversion + +<p> +If the Floating-Point word set is present in the dictionary and the current +base is <a href=dpans6.htm#6.1.1170>DECIMAL</a>, the input number-conversion algorithm shall be extended to +recognize floating-point numbers in this form: + +<pre> +Convertible string := &lt;significand&gt;&lt;exponent&gt; +&lt;significand&gt; := [&lt;sign&gt;]&lt;digits&gt;[.&lt;digits0&gt;] +&lt;exponent&gt; := E[&lt;sign&gt;]&lt;digits0&gt; +&lt;sign&gt; := { + | - } +&lt;digits&gt; := &lt;digit&gt;&lt;digits0&gt; +&lt;digits0&gt; := &lt;digit&gt;* +&lt;digit&gt; := { 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 } +</pre> + +These are examples of valid representations of floating-point numbers in +program source: + +<pre> +1E 1.E 1.E0 +1.23E-1 -1.23E+1 +</pre> + +See: <a href=dpans3.htm#3.4.1.3>3.4.1.3</a> Text interpreter input number conversion, <a href=dpans12.htm#12.6.1.0558>12.6.1.0558</a> <a href=dpans12.htm#12.6.1.0558>>FLOAT</a>. + +<p> +<a href=dpansa12.htm#A.12.3.7>A.12.3.7</a> Text interpreter input number conversion + +<p> +The Technical Committee has more than once received the suggestion that the +text interpreter in Standard Forth systems should treat numbers that have an +embedded decimal point, but no exponent, as floating-point numbers rather +than double cell numbers. This suggestion, although it has merit, has always +been voted down because it would break too much existing code; many existing +implementations put the full digit string on the stack as a double number and +use other means to inform the application of the location of the decimal +point. +</blockquote> + +<pre> +( ============================================================ ) +( Bill Muench \ OntoLogic ) +( \ 3901 Branciforte Drive \ 408 425 8740 ) +( \ Santa Cruz CA 95065 \ BiMu@aol.com ) +</pre> + +<h2><a name="reply">TC Reply to Q0004</a></h2> +<pre> +From: Elizabeth D. Rather +Subject: Q0004R, Number Conversion, Official Response +To: X3J14 Technical Committee +Cc: lbarra@itic.nw.dc.us +Date: Wed, 31 May 95 17:04:01 PDT +Doc#: X3J14/Q0004R +Reference Doc#: X3.215.1994 ANS Forth +Date: May 24, 1995 +Title: Response to Request for Interpretation Q0004, Clarification of +Number Conversion +</pre> + +<i><blockquote> +<pre> +Subject: ANS Forth Clarification Procedures +To: greg@minerva.com +From: BiMu@aol.com (Identity not yet established) +Date: Mon, 15 May 1995 15:13:21 -0400 +Message-Id: <950515151319_119428296@aol.com> +Received: from aol.com by med3.minerva.com ; Mon, 15 May 1995 12:18 PDT +Request for Clairification. +</pre> + +I have found the following references to *Text interpreter input number +conversion*. + +<p> +The input of Floating-Point numbers is clear, my need for clairification is +with double-cell numbers: + +<p> +Will a number with an *embedded* decimal point be converted to a double-cell +number in a Standard Forth system? +</blockquote></i> + +Not necessarily. A Standard System is permitted, but not required, to +convert digit strings with embedded periods as double numbers. +Consequently, a Standard Program cannot rely on any particular +interpretation of such digit strings. + +<i><blockquote> +If not, what about <a href=dpansa12.htm#A.12.3.7>A.12.3.7</a> *...should treat numbers that have an embedded +decimal point, but no exponent, as floating-point numbers rather than double +cell numbers. This suggestion, although it has merit, has always been voted +down because it would break too much existing code;* ? +</blockquote></i> + +<a href=dpansa12.htm#A.12.3.7>A.12.3.7</a> would be clearer if it read: +The Technical Committee has more than once received the suggestion that +the text interpreter in Standard Forth systems should treat numbers +that have an embedded decimal point, but no exponent, as floating-point +numbers. This suggestion, although it has merit, has always been voted +down because it would break too much existing code; many existing +implementations put the full digit string on the stack as a double +number and use other means to inform the application of the location of +the decimal point. + +Note that the only change I made was to delete the phrase "rather than +double cell numbers" from the first sentence <a href=dpansa12.htm#A.12.3.7>A.12.3.7</a>. The original +sentence implies that numbers with an embedded decimal point and no +exponent are converted to double numbers in a Standard System. The +intent of the committee was to allow this behavior in a Standard +System, but not to require it. + +<i><blockquote> +Is <a href=dpans8.htm#8.3.2>8.3.2</a> an example or the rule? ( a decimal point at the end) +</blockquote></i> + +It is the rule. + +<i><blockquote> +<a href=dpans8.htm#8.3.2>8.3.2</a> Text interpreter input number conversion + +<p> +When the text interpreter processes a number that is immediately followed by +a decimal point and is not found as a definition name, the text interpreter +shall convert it to a double-cell number. + +<p> +For example, entering <a href=dpans6.htm#6.1.1170>DECIMAL</a> 1234 leaves the single-cell number 1234 on the +stack, and entering <a href=dpans6.htm#6.1.1170>DECIMAL</a> 1234. leaves the double-cell number 1234 0 on +the stack. + +<p> +See: <a href=dpans3.htm#3.4.1.3>3.4.1.3</a> Text interpreter input number conversion. +</blockquote></i> + +Other excerpts deleted. + +<pre> + John R. Hayes + Applied Physics Laboratory + Johns Hopkins University + john.hayes@jhuapl.edu +</pre> + +<pre> +Elizabeth D. Rather "Forth-based products and +FORTH, Inc. Services for real-time +111 N. Sepulveda Blvd. #300 applications since 1973" +Manhattan Beach, CA 90266 +(800) 55FORTH or (310) 372-8493 +FAX (310) 318-7130 +</pre> + +<h2><a name="ballot">Letter Ballot</a></h2> + +<pre> +From: Elizabeth D. Rather +Subject: LB015, RE Q0004, Number Conversion +To: X3J14 Technical Committee +Cc: lbarra@itic.nw.dc.us +Date: Wed, 31 May 95 17:04:23 PDT +X3 Subgroup Letter Ballot +Authorized by X3 Procedures - Distributed by X3 Subgroup X3J14 +Project: X3J14, ANS Forth +Doc#: X3J14/LB015 +Reference Doc#s: X3J14/Q0004R, X3.215.1994 ANS Forth +Date: May 31, 1995 +Title: Response to Request for Interpretation Q0004, Number Conversion +Ballot Period: 30 Days +Ballot Closes NOON DATE: June 30, 1995 +Respond to: greg@minerva.com + or: Elizabeth D. Rather, Chair + FORTH, Inc. + 111 N. Sepulveda Blvd. Suite 300 + Manhattan Beach, CA 90266 + (310) 372-8493 FAX (310) 318-7130 + erather@forth.com + +Statement: + Document X3J14/Q0004R contains a proposed Response to Request for + Interpretation Q0004. + +Question: + Do you agree that this response represents the intended interpretation of + X3.215.1994 ANS Forth? + + +/------------------------ begin response area----------------------\ +| +| YES____ NO____ ABSTAIN____ +| +| Signature: [not required for email ballots] +| Name: +| Organization: +| +| Explanation (REQUIRED for NO or ABSTAIN votes): +| <none> +\------------------------ end response area ----------------------/ + +INSTRUCTIONS: +Please return the entire letter ballot with your response _either_ by email +to greg@minerva.com _or_ by regular mail or fax or email to me at the above +address, before the closing date & time. + + If replying electronically PLEASE edit only within the response area + indicated above, inserting any explanatory text in place of <none>. + Any changes made outside that area will likely be overlooked. + +All TC members must vote. Failure to vote in two consecutive ballots may +cause you to lose your voting rights in X3J14. + +Thank you for your participation. + +Elizabeth D. Rather, Chair, X3J14 + +Elizabeth D. Rather "Forth-based products and +FORTH, Inc. Services for real-time +111 N. Sepulveda Blvd. #300 applications since 1973" +Manhattan Beach, CA 90266 +(800) 55FORTH or (310) 372-8493 +FAX (310) 318-7130 +</pre> + +<h2><a name="results">Results of Letter Ballot</a></h2> + +<pre> +From: Elizabeth D. Rather +Subject: LBs 14 & 15 +To: X3J14 Technical Committee +Cc: l.barra@itic.nw.dc.us +Date: Fri, 07 Jul 95 12:05:04 PDT +Letter ballots [14 and] 15 closed at noon July 1 with the following results: + + Y N A NV +[...] +LB15: 11, 1, 0, 2 + +Negative vote from Dave Harralson on Letter Ballot 15, with the following +comment: + + I disagree with the response, "not necessarily...." Section <a href=dpans8.htm#8.3.2>8.3.2</a> clearly + states that a number with a decimal point that is not in the dictionary + will be converted to a double-cell number. If this section is revised, + I vote yes. + +[8.3.2 Text Interpreter Input number conversion + When the text interpreter process a number that is *immediately + followed* by a decimal point and is not found as a definition name, + the text interpreter shall convert it to a double-cell number.] +[Standard quoted by editor; emphasis added where appropriate] + +[...] + +Thank you for your participation. + +Regards, +Elizabeth D. Rather, Chair X3J14 + +Elizabeth D. Rather "Forth-based products and +FORTH, Inc. Services for real-time +111 N. Sepulveda Blvd. #300 applications since 1973" +Manhattan Beach, CA 90266 +(800) 55FORTH or (310) 372-8493 +FAX (310) 318-7130 +</pre> diff --git a/mwmouse/sources/AnsForth/A0005.HTM b/mwmouse/sources/AnsForth/A0005.HTM @@ -0,0 +1,204 @@ +<title>ANS Forth RFI 0005: initiation semantics</title> + +This document is produced by TC X3J14 as its clarification of questions +raised about ANSI X3.215-1994, American National Standard for Information +Systems - Programming Languages - Forth. + +<p> +The questions covered herein were raised by query + +<p> +Q0005, regarding the definition of "initiation semantics". + +<p>There are four parts in this document: + +<ol> +<li><a href="#query">The original question as received.</a> +<li><a href="#reply">The TC's reply.</a> +<li><a href="#ballot">The Letter Ballot issued by TC Chair.</a> +<li><a href="#results">TC Chair's statement of ballot results.</a> +</ol> + +<h2><a name="query">Q0005 as received</a></h2> + +<pre> +Subject: Q0005 Request Recognized +To: X3J14@minerva.com +Date: Tue, 12 Sep 95 19:02:13 PDT +</pre> + +The following query has been assigned number Q0005 and has been +tentatively assigned to Jim Rash for drafting a response. + - Greg Bailey, by direction 950913 0159Z +<hr> + +<i><blockquote> +I can not find the definition of " Initiation [semantics]" in the +" <a href=dpans2.htm#2.1>2.1</a> Definitions of terms" but see this term in " <a href=dpans6.htm#6.1.0450>6.1.0450</a> :", p.30. + +<p> +Best regards, Michael + +<pre> +Michael L. Gassanenko +gml@ag.pu.ru +</pre> +</blockquote></i> + +<p> +[Co-author Elizabeth Rather <erather@forth.com> adds:] + +<p> +You will see it in <a href=dpans6.htm#6.1.1250>6.1.1250</a> <a href=dpans6.htm#6.1.1250>DOES></a> as well. This describes the behavior of +a word defined by <a href=dpans6.htm#6.1.0450>:</a> or a <a href=dpans6.htm#6.1.1250>DOES></a> word when it begins to execute. The +realization that this should be specified separately came rather late in +the process, and I believe you are correct that we have not defined this +term adequately. I am referring your comment to the TC to see whether they +feel something should be done, such as publishing a clarification. + +<p>Thank you for calling it to our attention. + + +<h2><a name="reply">TC Reply to Q0005</a></h2> + +<pre> +From: Elizabeth Rather +Subject: Q0005R, Initiation Semantics, Official Response +To: X3J14 Technical Committee +Cc: lbarra@itic.nw.dc.us +Date: Mon, 19 Feb 96 14:09 + +Doc#: X3J14/Q0005R +Reference Doc#: X3.215.1994 ANS Forth +Date: February 19, 1996 +Title: Response to Request for Interpretation Q0005, Initiation Semantics +</pre> +<hr> + +<i><blockquote> +I can not find the definition of "Initiation [semantics]" in the +" <a href=dpans2.htm#2.1>2.1</a> Definitions of terms" but see this term in " <a href=dpans6.htm#6.1.0450>6.1.0450</a> :", p.30. + +<p> +Best regards, Michael + +<pre> +Michael L. Gassanenko +gml@ag.pu.ru +</pre> +</blockquote></i> + +It is noted that the Technical Committee included, in Section <a href=dpans2.htm#2.1>2.1</a> of the +standard, definitions of the terms "compilation semantics" and "execution +semantics". + +<p> +For similar reasons, the TC agrees that the standard should also include a +definition of the term "initiation semantics" in Section <a href=dpans2.htm#2.1>2.1</a> Definitions +of Terms: + +<dl> +<dt> initiation semantics: +<dd> The behavior of a Forth definition, or of the portion of a + Forth definition following <a href=dpans6.htm#6.1.1250>DOES></a>, when it begins execution. +</dl> + +By way of further clarification, when a definition begins execution, the +system may perform implementation-dependent actions such as placing items +on the return stack to allow return to a calling definition. These actions +are invisible to a standard program except at certain points during the +execution of definitions created with <a href=dpans6.htm#6.1.0450>:</a> (colon) or <a href=dpans6.htm#6.2.0455>:NONAME</a> and during the +execution of the code following <a href=dpans6.htm#6.1.1250>DOES></a>. At these points, the sole visible +result is the possible presence of the implementation-dependent _nest-sys_ +on the return stack. + +<p> +Within a given implementation, definitions created with <a href=dpans6.htm#6.1.0450>:</a> (colon) all have +the same initiation semantics. Similarly for all definitions created with +<a href=dpans6.htm#6.2.0455>:NONAME</a> or <a href=dpans6.htm#6.1.1250>DOES></a>. + +<h2><a name="ballot">Letter Ballot</a></h2> + +<pre> +X3 Subgroup Letter Ballot +Authorized by X3 Procedures - Distributed by X3 Subgroup X3J14 +Project: X3J14, ANS Forth +Doc#: X3J14/LB016 +Reference Doc#s: X3J14/Q0005R, X3.215.1994 ANS Forth +Date: February 19, 1996 +Title: Response to Request for Interpretation Q0005, Initiation Semantics +Ballot Period: 30 Days +Ballot Closes NOON DATE: March 21, 1996 +Respond to: greg@minerva.com + or: Elizabeth D. Rather, Chair + FORTH, Inc. + 111 N. Sepulveda Blvd. Suite 300 + Manhattan Beach, CA 90266 + (310) 372-8493 FAX (310) 318-7130 + erather@forth.com + +Statement: + Document X3J14/Q0005R contains a proposed Response to Request for + Interpretation Q0005. + +Question: + Do you agree that this response represents the intended interpretation of + X3.215.1994 ANS Forth? + + +/------------------------ begin response area----------------------\ +| +| YES____ NO____ ABSTAIN____ +| +| Signature: [not required for email ballots] +| Name: +| Organization: +| +| Explanation (REQUIRED for NO or ABSTAIN votes): +| <none> +\------------------------ end response area ----------------------/ + +INSTRUCTIONS: +Please return the entire letter ballot with your response _either_ by email +to greg@minerva.com _or_ by regular mail or fax or email to me at the above +address, before the closing date & time. + + If replying electronically PLEASE edit only within the response area + indicated above, inserting any explanatory text in place of <none>. + Any changes made outside that area will likely be overlooked. + +All TC members must vote. Failure to vote in two consecutive ballots may +cause you to lose your voting rights in X3J14. + +Thank you for your participation. + +Elizabeth D. Rather, Chair, X3J14 +</pre> + +<h2><a name="results">Results of Letter Ballot</a></h2> + +<pre> +Letter ballot 16 closed at noon March 21 with the following results: + + Y N A NV +LB16: 10, 1, 1, 2 + +"No" vote on LB16 from L. Zettel, with the following comment: + + | I agree with the explanation given for the meaning of "initiation + | semantics" and with the explanation for the committee's intent in + | the language of the standard. + | + | I do not agree with the declaration of intent to add a formal + | definition of "initiation semantics" to the Standard. + | + |>From: JEThomas@ix.netcom.com (Jonah Thomas) + | + |>What the original document said, in <a href=dpans3.htm#3.4.3>3.4.3</a> Semantics, was 'The terms + |>"initiation semantics" and "run-time semantics" refer to definition + |>fragments, and have meaning only within the individual glossary + |>entries where they appear.' + + +Abstention from John Hayes. +<pre> diff --git a/mwmouse/sources/AnsForth/A0006.HTM b/mwmouse/sources/AnsForth/A0006.HTM @@ -0,0 +1,413 @@ +<title>ANS Forth RFI 0006: Writing to Input Buffers</title> + +This document is produced by TC X3J14 as its clarification of questions +raised about ANSI X3.215-1994, American National Standard for Information +Systems - Programming Languages - Forth. + +<p> +The questions covered herein were raised by query + +<p> +Q0006, regarding Writing to Input Buffers. + +<p>There are four parts in this document: + +<ol> +<li><a href="#query">The original question as received.</a> +<li><a href="#reply">The TC's reply.</a> +<li><a href="#ballot">The Letter Ballot issued by TC Chair.</a> +<li><a href="#results">TC Chair's statement of ballot results.</a> +</ol> + +<h2><a name="query">Q0006 as received</a></h2> + +<pre> +Subject: Q0006 Request Recognized +To: X3J14@minerva.com +Date: Thu, 05 Oct 95 09:23:38 PDT +</pre> + +The following query has been assigned number Q0005. + - Greg Bailey, by direction 950913 0159Z +<hr> + +Request from TC member Jonah Thomas (Jet.Thomas@minerva.com) + +<p> +Here's a question about the Standard: + +<p> +When is it allowed to write into input buffers? + +<p> +On the surface this is simple: "A program shall not write into the +input buffer." + +<p> +But what about this: + +<pre> +{ +<a href=dpans6.htm#6.1.0450>:</a> CHANGE-TEXT <a href=dpans6.htm#6.1.2165>S"</a> <a href=dpans15.htm#15.6.1.2465>WORDS</a> <a href=dpans15.htm#15.6.1.0220>.S</a> " <a href=dpans6.htm#6.1.2165>S"</a> <a href=dpans6.htm#6.1.2160>ROT</a> <a href=dpans6.htm#6.1.2260>SWAP</a> MOVE" <a href=dpans6.htm#6.1.1360>EVALUATE</a> <a href=dpans6.htm#6.1.0460>;</a> + + <a href=dpans15.htm#15.6.1.0220>.S</a> <a href=dpans15.htm#15.6.1.0220>.S</a> <a href=dpans15.htm#15.6.1.0220>.S</a> <a href=dpans15.htm#15.6.1.0220>.S</a> <a href=dpans15.htm#15.6.1.0220>.S</a> <a href=dpans6.htm#6.1.2216>SOURCE</a> <a href=dpans6.htm#6.1.1260>DROP</a> CHANGE-TEXT <a href=dpans15.htm#15.6.1.0220>.S</a> +} +</pre> + +Our input buffer starts out with + +<pre> + <a href=dpans15.htm#15.6.1.0220>.S</a> <a href=dpans15.htm#15.6.1.0220>.S</a> <a href=dpans15.htm#15.6.1.0220>.S</a> <a href=dpans15.htm#15.6.1.0220>.S</a> <a href=dpans15.htm#15.6.1.0220>.S</a> <a href=dpans6.htm#6.1.2216>SOURCE</a> <a href=dpans6.htm#6.1.1260>DROP</a> CHANGE-TEXT <a href=dpans15.htm#15.6.1.0220>.S</a> +</pre> + +When it executes CHANGE-TEXT it has ( ca ) the buffer address on the +stack. CHANGE-TEXT first provides a string ( ca ca' u ) then another +string ( ca ca' u ca" u") and then evaluates the second string. The +original buffer is now not the input buffer, now the 2nd string is +the read-only input buffer. It does <a href=dpans6.htm#6.1.2160>ROT</a> ( ca' u ca ) +<a href=dpans6.htm#6.1.2260>SWAP</a> ( ca' ca u) +<a href=dpans6.htm#6.1.1900>MOVE</a> and moves the first string into +the original input buffer, which now +reads + +<pre> + <a href=dpans15.htm#15.6.1.2465>WORDS</a> <a href=dpans15.htm#15.6.1.0220>.S</a> <a href=dpans15.htm#15.6.1.0220>.S</a> <a href=dpans15.htm#15.6.1.0220>.S</a> <a href=dpans15.htm#15.6.1.0220>.S</a> <a href=dpans6.htm#6.1.2216>SOURCE</a> <a href=dpans6.htm#6.1.1260>DROP</a> CHANGE-TEXT <a href=dpans15.htm#15.6.1.0220>.S</a> +</pre> + +Then it reverts to the changed input buffer and does the final +<a href=dpans15.htm#15.6.1.0220>.S</a> . + +<p> +I say that even if this is legal, it's bad practice. If you want to +alter an input buffer, better to copy it into your own private area and +change it however you like and then do <a href=dpans6.htm#6.1.1360>EVALUATE</a> . + +<p> +My question is whether this _is_ legal, and why or why not. + +<p> +I originally interpreted a previous dpANS document as saying that the +user input buffer, the one pointed to by the obsolescent +<a href=dpans6.htm#6.2.2290>TIB</a> and <a href=dpans6.htm#6.2.0060>#TIB</a> , +is read-only. That makes a different kind of sense to me. In some +systems it could be a read-only pipe from some other process, or it could +be some special hardware read-only buffer. It makes sense to me that the +user input buffer should never be modified by a standard program. + +<p> +So I can see 4 obvious choices, with perhaps others also available: + +<ol> + +<li>The current input buffer is read-only; strings which are not the +current input buffer may be written to unless they're read-only for some +other reason. + +<li>The current input buffer is read-only as is the user input buffer; +any region of allotted memory is read/write except while it is the input +buffer. + +<li>Any region of memory that is EVALUATEd is forever after read-only. + +<li>Any region of memory that is EVALUATEd is read-only until the +evaluation is complete -- either by evaluation until the parse area is +empty and return from <a href=dpans6.htm#6.1.1360>EVALUATE</a> or +<a href=dpans6.htm#6.1.1380>EXIT</a> found in the evaluated string, or +<a href=dpans6.htm#6.1.2050>QUIT</a> or +<a href=dpans6.htm#6.1.0670>ABORT</a> performed before evaluation is +finished, or if an ambiguous +condition exists due to the code evaluated. + +</ol> + +I don't like #3, since I sometimes want to evaluate text that's in block +buffers or file buffers. #4 could take a lot of figuring to tell whether +it's being violated or not. I like #1, but it seems to allow some +atrocious practices in standard code. #2 has the further problem that +there is no way for a program to tell whether an address is in the +read-only user input buffer, except with +<a href=dpans6.htm#6.2.2218>SOURCE-ID</a> or +<a href=dpans6.htm#6.2.2290>TIB</a> , both of which +are in an optional extension wordset. + +<p> +Any ideas? + +<h2><a name="reply">TC Reply to Q0006</a></h2> + +<pre> +From: Elizabeth Rather +Subject: Q0006R, Writing to Input Buffers, Official Response +To: X3J14 Technical Committee +Cc: lbarra@itic.nw.dc.us +Date: Mon, 19 Feb 96 14:09 + + +Doc#: X3J14/Q0006R +Reference Doc#: X3.215.1994 ANS Forth +Date: February 19, 1996 +Title: Response to Request for Interpretation Q0006, Writing to Input Buffers +</pre> + +<h3>Q0006: When is it allowed to write into input buffers?</h3> + +Request from TC member Jonah Thomas (Jet.Thomas@minerva.com) + +<i><blockquote> +Here's a question about the Standard: + +When is it allowed to write into input buffers? +</blockquote></i> + +When a standard program receives the address and length of the +'input buffer' from the word <a href=dpans6.htm#6.1.2216>SOURCE</a> +it *must* treat this information as though it describes a read-only region of memory. + +<p> +This is one of the conditions that must be met in order to compose +code whose processing of 'input buffers' is independent of the +physical and logical characteristics of the diverse 'input sources' +described in the Standard. + +<p> +It is logically possible for an application to alter the 'input +buffer' supplied to <a href=dpans6.htm#6.1.1360>EVALUATE</a> +while that 'input buffer' is being +processed. This possibility exists as a special case because the +application actually "owns" and has full control over the buffer +in question. As owner of the buffer, and both producer and +consumer of the data it contains, the application can alter this +buffer and manipulate <a href=dpans6.htm#6.1.0560>>IN</a> with +deterministic results, assuming +that it knows the buffer to exist in physically writable memory. + +<p> +The Standard does not describe this possibility because the +implied coding methods constitute a special case which is only +usable with <a href=dpans6.htm#6.1.1360>EVALUATE</a> and can +lead to the development of source +language syntax which is not processable from other 'input sources.' + +<h3>Relevant text from the Standard:</h3> + +<dl> + +<dt> +<a href=dpans6.htm#6.1.1360>6.1.1360</a> <a href=dpans6.htm#6.1.1360>EVALUATE</a> +<dd> + ... Make the string described ... both the + 'input source' and 'input buffer' ... + +<dt> +<a href=dpans6.htm#6.1.2216>6.1.2216</a> <a href=dpans6.htm#6.1.2216>SOURCE</a> +<dd> + ... c-addr is the address of, and u is the number of + characters in, the 'input buffer'. + +<dt> +<a href=dpans2.htm#2.1>2.1</a> Definitions of Terms +<dd> + <dl> + <dt>input source: <dd> The device, file, block, or other entity + that supplies characters to refill the 'input buffer'. + <dt>input buffer: <dd> A region of memory containing the sequence + of characters from the input source that is currently + accessible to a program. + </dl> + +<dt> +<a href=dpans3.htm#3.3.3.5>3.3.3.5</a> Input buffers +<dd> + The address, length, and content of the 'input buffer' may be + transient. A program shall not write into the 'input + buffer'. ... the 'input buffer' is either ... or a buffer + specified by <a href=dpans6.htm#6.1.1360>EVALUATE</a> . ... An ambiguous condition + exists if a program modifies the contents of the 'input + buffer'." + +</dl> + +<h3>Discussion of Technical Committee Intent</h3> + +<a href=dpans6.htm#6.2.2040>QUERY</a> and <a href=dpans6.htm#6.2.2290>TIB</a> +have been deprecated because while some systems have +a discrete *place* called <a href=dpans6.htm#6.2.2290>TIB</a> that is +exclusively used for storing +the results of <a href=dpans6.htm#6.2.2040>QUERY</a>, other existing systems +actually use <a href=dpans6.htm#6.2.2290>TIB</a> as a +handle for the current line being interpreted from a file. While +applications exist making either assumption, these applications can +obviously not work properly on both sorts of systems in general. + +<p>Storing into 'input buffers' is disallowed because we permit input +sources to nest indefinitely and it is not practical for systems +that conserve resources to guarantee unique concurrent addressability +of all nested input sources, nor is it practical to create separate +save areas for all current input buffers just in case someone stored +into one of them. The TC specifically intends that, when input is +coming from refreshable sources, implementations may refresh their +buffers on un-nesting to conserve resources, and that when logically +possible implementations may use transient, shared buffers (as is +common practice with <a href=dpans7.htm#7.6.1.1790>LOAD</a> on +multiprogrammed systems.) Therefore, +the results of storing into input buffers is stated as ambiguous, +and may even be physically disallowed, as in the case of interpreting +source from read only memory mapped files in some operating systems. + +<p> +For similar reasons the address returned by +<a href=dpans6.htm#6.1.2216>SOURCE</a> is transient, +and there is specifically no guarantee that any 'input buffer' other +than *the* (current) 'input buffer' is addressable at any time, nor +that this address be valid after nesting or un-nesting. (Indeed, +in classical multiprogrammed systems the address returned by +<a href=dpans6.htm#6.1.2216>SOURCE</a> is no longer valid after using +<a href=dpans6.htm#6.1.2450>WORD</a> .) + +<p> +The TC expects all Systems to process buffers provided by +<a href=dpans6.htm#6.1.1360>EVALUATE</a> +in place. This is logically necessary, in our view, since there are +no upper limits on the lengths of these buffers. Since it is +semantically permissible to describe more than half of addressable memory +in an <a href=dpans6.htm#6.1.1360>EVALUATE</a> string it is not in +general *possible* to copy such a +string elsewhere and address it consistently with the definition +of <a href=dpans6.htm#6.1.2216>SOURCE</a> . + +<p> +Systems are not allowed to alter the contents of 'input buffers' +provided through <a href=dpans6.htm#6.1.1360>EVALUATE</a> . At the +same time, applications are responsible for guaranteeing that the +buffers they provide to <a href=dpans6.htm#6.1.1360>EVALUATE</a> are +static in both address and content until the +<a href=dpans6.htm#6.1.1360>EVALUATE</a> has completed. + +<p> +<a href=dpans6.htm#6.1.1360>EVALUATE</a> is a special case since the +input buffer is literally +the area of memory provided to <a href=dpans6.htm#6.1.1360>EVALUATE</a> and +is as such static. +The application "owns" the memory it occupies, and the mechanism +for messaging the interpreter via <a href=dpans6.htm#6.1.0560>>IN</a> +(as well as the syntax of +Forth) implies no prefetching or preprocessing of input buffers +is necessary or appropriate. + +<p> +Given these conditions, it *is* deterministic for an application to +store (with great care) into <a href=dpans6.htm#6.1.1360>EVALUATE</a> buffers +that it knows to be +active, although such methods pertain exclusively to +<a href=dpans6.htm#6.1.1360>EVALUATE</a> and +certainly not to any other input stream source. + +<p> +However, as the Standard is written, any program that does this is +not a standard program. + +<hr> + +It has been brought to the TC's attention that there exists at least +one implementation which moves an <a href=dpans6.htm#6.1.1360>EVALUATE</a> +string to a separate work +area for processing. As a separate but related question we have +been asked whether a system which does this, and which therefore +fails John Hayes' test suite, is compliant. (The test in question +fails if the buffer address and length returned by +<a href=dpans6.htm#6.1.2216>SOURCE</a> occurring +in an <a href=dpans6.htm#6.1.1360>EVALUATE</a> string differ from the +address and length of the +argument provided to EVALUATE.) + +<p> +The system in question is definitely not compliant since both the +letter of the standard and the intent of the TC are that +<a href=dpans6.htm#6.1.1360>EVALUATE</a> +strings be processed in place. The fact that John's test suite is +able to detect the deviation confirms its visibility to application +code, assuming that any such code ever makes such a comparison. + +<p> +The ambiguity documented for storing into 'input buffers' serves to +mitigate the seriousness of this noncompliance since any program +which stores into an active <a href=dpans6.htm#6.1.1360>EVALUATE</a> +string is environmentally dependent on the system's resolution of +the ambiguity. Nevertheless, the +Standard clearly states that the <a href=dpans6.htm#6.1.1360>EVALUATE</a> +string *is* the 'input +buffer' (by definition a region of memory), and that +<a href=dpans6.htm#6.1.2216>SOURCE</a> returns +the address and length of this region of memory. This is an unqualified +promise to people writing standard programs, and any system +which breaks that promise must document its nonstandard implementations +of <a href=dpans6.htm#6.1.1360>EVALUATE</a> and <a href=dpans6.htm#6.1.2216>SOURCE</a>. + +<h2><a name="ballot">Letter Ballot</a></h2> + +<pre> +X3 Subgroup Letter Ballot +Authorized by X3 Procedures - Distributed by X3 Subgroup X3J14 +Project: X3J14, ANS Forth +Doc#: X3J14/LB017 +Reference Doc#s: X3J14/Q0006R, X3.215.1994 ANS Forth +Date: February 19, 1996 +Title: Response to Request for Interpretation Q0006, Writing to Input Buffers +Ballot Period: 30 Days +Ballot Closes NOON DATE: March 21, 1996 +Respond to: greg@minerva.com + or: Elizabeth D. Rather, Chair + FORTH, Inc. + 111 N. Sepulveda Blvd. Suite 300 + Manhattan Beach, CA 90266 + (310) 372-8493 FAX (310) 318-7130 + erather@forth.com + +Statement: + Document X3J14/Q0006R contains a proposed Response to Request for + Interpretation Q0006. + +Question: + Do you agree that this response represents the intended interpretation of + X3.215.1994 ANS Forth? + + +/------------------------ begin response area----------------------\ +| +| YES____ NO____ ABSTAIN____ +| +| Signature: [not required for email ballots] +| Name: +| Organization: +| +| Explanation (REQUIRED for NO or ABSTAIN votes): +| <none> +\------------------------ end response area ----------------------/ + +INSTRUCTIONS: +Please return the entire letter ballot with your response _either_ by email +to greg@minerva.com _or_ by regular mail or fax or email to me at the above +address, before the closing date & time. + + If replying electronically PLEASE edit only within the response area + indicated above, inserting any explanatory text in place of <none>. + Any changes made outside that area will likely be overlooked. + +All TC members must vote. Failure to vote in two consecutive ballots may +cause you to lose your voting rights in X3J14. + +Thank you for your participation. + +Elizabeth D. Rather, Chair, X3J14 +</pre> + +<h2><a name="results">Results of Letter Ballot</a></h2> + +<pre> +Letter ballot 17 closed at noon March 21 with the following results: + + Y N A NV +LB17: 12, 0, 1, 1 + +Abstention from John Hayes. +</pre> diff --git a/mwmouse/sources/AnsForth/A0007.HTM b/mwmouse/sources/AnsForth/A0007.HTM @@ -0,0 +1,390 @@ +<title>ANS Forth RFI 0007: distinction between "immediacy" and +"special compilation semantics"</title> + +This document is produced by TC X3J14 as its clarification of questions +raised about ANSI X3.215-1994, American National Standard for Information +Systems - Programming Languages - Forth. + +<p> +The questions covered herein were raised by query + +<p> +Q0007, regarding the distinction between "immediacy" and "special + compilation semantics". + +<p>There are four parts in this document: + +<ol> +<li><a href="#query">The original question as received.</a> +<li><a href="#reply">The TC's reply.</a> +<li><a href="#ballot">The Letter Ballot issued by TC Chair.</a> +<li><a href="#results">TC Chair's statement of ballot results.</a> +</ol> + +<h2><a name="query">Q0007 as received</a></h2> + +<pre> +Subject: Q0007 Request Recognized & Draft 0 +To: X3J14@minerva.com +Cc: wykoh@pado.krict.re.kr +Date: Sat, 23 Dec 95 02:11:38 PST +</pre> + +The following query has been assigned number Q0007. + - Greg Bailey, by direction 951223 0700Z +<hr> +Wonyong Koh wrote on Fri, 22 Dec 95 16:27:03 PST <a href=dpans6.htm#6.1.0450>:</a> + +<i><blockquote> +Dear Mr. Bailey, + +<p> + I would like you to ask to interpret the ANS Forth Stanard. +You might already know about it. In recent discussion in comp. +lang.forth I and Mr. Jonah Thamas have different opinion on +<a href=dpans6.htm#6.1.0950>CONSTANT</a>. I interpret that making <a href=dpans6.htm#6.1.0950>CONSTANT</a> create <a href=dpans6.htm#6.1.1710>IMMEDIATE</a> +words does not violate ANS Standard while Mr. Thomas thinks +it does. + +<p> + I think that it is a obvious choice to make <a href=dpans6.htm#6.1.0950>CONSTANT</a> words +STATE-smart in subroutine-threaded Forth (i.e. native Forth +compiler). <a href=dpans6.htm#6.1.1710>IMMEDIATE</a> <a href=dpans6.htm#6.1.0950>CONSTANT</a> words pushes a number on top of +the stack in interpretation state while compiles in-line +machine code in compilation state. I beleive that it is not +TC's intention to leave significant number of native-code +Forth compilers out of ANS Standard System. Please clarify this. + +<pre> +Wonyong Koh +wykoh@pado.krict.re.kr +</pre> +</blockquote></i> + +<h2><a name="reply">TC Reply to Q0007</a></h2> + +<pre> +From: Elizabeth Rather +Subject: Q0007R, "immediacy" and "special compilation semantics", Official Response +To: X3J14 Technical Committee +Cc: lbarra@itic.nw.dc.us +Date: Mon, 19 Feb 96 14:10 + + +Doc#: X3J14/Q0007R +Reference Doc#: X3.215.1994 ANS Forth +Date: February 19, 1996 +Title: Response to Request for Interpretation Q0007, Clarifying the +distinction between "immediacy" and "special compilation semantics" +</pre> + +<h3>Q0007: Clarifying the distinction between "immediacy" and + "special compilation semantics".</h3> + +Wonyong Koh wrote on Fri, 22 Dec 95 16:27:03 PST: + +<i><blockquote> +Dear Mr. Bailey, + +<p> + I would like you to ask to interpret the ANS Forth Stanard. +You might already know about it. In recent discussion in comp. +lang.forth I and Mr. Jonah Thamas have different opinion on +<a href=dpans6.htm#6.1.0950>CONSTANT</a>. I interpret that making <a href=dpans6.htm#6.1.0950>CONSTANT</a> create <a href=dpans6.htm#6.1.1710>IMMEDIATE</a> +words does not violate ANS Standard while Mr. Thomas thinks +it does. + +<p> + I think that it is a obvious choice to make <a href=dpans6.htm#6.1.0950>CONSTANT</a> words +STATE-smart in subroutine-threaded Forth (i.e. native Forth +compiler). <a href=dpans6.htm#6.1.1710>IMMEDIATE</a> <a href=dpans6.htm#6.1.0950>CONSTANT</a> words pushes a number on top of +the stack in interpretation state while compiles in-line +machine code in compilation state. I beleive that it is not +TC's intention to leave significant number of native-code +Forth compilers out of ANS Standard System. Please clarify this. + +<pre> +Wonyong Koh +wykoh@pado.krict.re.kr +</pre> +</blockquote></i> + +Wonyong Koh is literally correct, in the sense that optimizing +compilers which add special compilation semantics to classes of +definitions such as CONSTANTs are specifically supported by +ANS Forth. Applying the concept, in these terms, to ANS Forth +has very clear meaning and leads to no inconsistencies. + +<p> However, using the term "immediate" to speak of such compilation +semantics is not recommended since this term carries with it all of +the implications of the implementation model prescribed by earlier +standards such as FORTH-83. Attempting to discuss the advanced +capabilities available to ANS Forth compilers in terms of "immediacy" +ineviteably leads to confusion, misunderstanding, and the eventual +"discovery" of apparent inconsistencies that do not, in fact, exist in +the Standard (although they may indeed exist in a particular +implementation.) This in turn can lead to arguments over moot points. + +<p> +In particular, a <a href=dpans6.htm#6.1.0950>CONSTANT</a> with special compilation semantics +is *not* the same thing as is a <a href=dpans6.htm#6.1.0950>CONSTANT</a> declared as follows: + +<pre> + 123 <a href=dpans6.htm#6.1.0950>CONSTANT</a> JOE <a href=dpans6.htm#6.1.1710>IMMEDIATE</a> +</pre> + +... but in ANS Forth terms, this usage is the *only* sense in +which the word "immediate" or the concept of "immediacy" is +defined or meaningful. Always discuss ANS Forth compilation +semantics as such, not as "immediacy", for clarity and to avoid +pitfalls, even when discussing an implementation that uses +classical immediacy as its way for expressing compilation +semantics. + +<h3>Analysis of Specific Case</h3> + +However, upon review of the usenet discussion you reference, it would +appear that you may have added special compilation semantics to +CONSTANTs without adding all of the communication with the compiler +that is necessary to deliver the proper semantics in all cases when +such CONSTANTs are used. The test case that failed seems likely to +have encountered one of these probable inconsistencies, as opposed to +"caring" whether the <a href=dpans6.htm#6.1.0950>CONSTANT</a> definition in question was "immediate" +in your implementation as such. + +<p> +At the same time, the ability to declare an <a href=dpans6.htm#6.1.1710>IMMEDIATE</a> constant, +as in 123 <a href=dpans6.htm#6.1.0950>CONSTANT</a> JOE <a href=dpans6.htm#6.1.1710>IMMEDIATE</a> had been precluded. + +<p> +Careful review of the semantic requirements for definitions +when used in compilation, interpretation, and execution, as +well as the results of obtaining execution tokens and using +them with <a href=dpans6.htm#6.1.1370>EXECUTE</a> or <a href=dpans6.htm#6.2.0945>COMPILE,</a> , and when referenced +following <a href=dpans6.htm#6.2.2530>[COMPILE]</a> (if <a href=dpans6.htm#6.2.0945>COMPILE,</a> or <a href=dpans6.htm#6.2.2530>[COMPILE]</a> are to +be supported) should make it clear that significant flow of +information is required between the compiler and the definition +when extending normally "default" compilation and/or +interpretation semantics of compliant definitions. + +<p> +*The standard does not define the way in which this information +flow takes place.* While a standard program may extend "macros" +such as control flow words as illustrated in the examples, +it is not possible to define words of the sort that normally +have "default" compilation and interpretation semantics such +that they have special compilation or interpretation semantics +without depending on implementation specific knowledge. If +this is done without knowing how to communicate with the +compiler, the resulting definitions may deliver the correct +semantics in *some*, but cannot in *all*, cases. + +<p> +For example, consider a Standard Program that adds special +compilation semantics to <a href=dpans6.htm#6.1.1290>DUP</a> as in the following example: + +<pre> + <a href=dpans6.htm#6.1.2410>VARIABLE</a> #DUPS + <a href=dpans6.htm#6.1.0450>:</a> <a href=dpans6.htm#6.1.1290>DUP</a> 1 #DUPS <a href=dpans6.htm#6.1.0130>+!</a> <a href=dpans6.htm#6.1.2033>POSTPONE</a> <a href=dpans6.htm#6.1.1290>DUP</a> <a href=dpans6.htm#6.1.0460>;</a> <a href=dpans6.htm#6.1.1710>IMMEDIATE</a> +</pre> + +If all this did was to count compilations of <a href=dpans6.htm#6.1.1290>DUP</a>, it would +be compliant since the additional work done affects nothing +else and is therefore OK (See section 3.) + +<p> +However, this definition does not comply because it does not +yield the correct semantics in all cases. + +<ul> + <li> It compiles correctly + <li> It interprets incorrectly + <li> (what it compiles) executes correctly + <li> Its tick, when EXECUTEd or COMPILE,'d executes incorrectly + <li> <a href=dpans6.htm#6.2.2530>[COMPILE]</a> does not work correctly with it. +</ul> + + +And, coincidentally, execution of its tick is abysmally slow +(which would take more information flow to resolve, but which +is not required since it only affects performance as opposed +to correct execution.) + +<p> If the word was made state smart to distinguish between interpret +and compile states, so that it counted #DUPS and did the <a href=dpans6.htm#6.1.2033>POSTPONE</a> when +in compilation state and simply executed <a href=dpans6.htm#6.1.1290>DUP</a> when interpreting, then +the situation changes but is still not correct: + +<ul> + <li> It compiles correctly + <li> It interprets correctly + <li> (what it compiles) executes correctly + <li> Its tick, when EXECUTEd is correct if in interpret state + at the time <a href=dpans6.htm#6.1.1370>EXECUTE</a> is invoked, but is incorrect if in compile + state at the time + <li> A definition into which its tick is COMPILE,'d runs + correctly if the definition runs in interpret state but fails + if it is run in compile state + <li> <a href=dpans6.htm#6.2.2530>[COMPILE]</a> does not work correctly with it. +</ul> + +And execution of the tick, even when correct, is still slow. + +<p> +There is, at minimum, a bidirectional flow of information between +the compiler / interpreter and the definition of <a href=dpans6.htm#6.1.1290>DUP</a> that must +occur around ticking and <a href=dpans6.htm#6.2.2530>[COMPILE]</a> ; in its absence, the compiler +does not have any way of asking the definition for an *execution* +token, and the definition does not have any way to provide one; +and, in the case of <a href=dpans6.htm#6.2.2530>[COMPILE]</a>, the compiler has no way of knowing +that this definition is supposed to be treated as though it had +default compilation semantics. + +<p> +The TC did not attempt specifying this compiler interface because +it affects only new capabilities which were almost universally +impossible in earlier standards, and active experimentation is +still underway with these new capabilities, including as it +appears your own. At some time in the future after more has +been learned it may be appropriate to standardize such a message +passing mechanism, however at present any *application* which +adds compilation semantics like this will need to incorporate +implementation dependent code... or it will yield noncompliant +definitions, as illustrated above. + +<p> In the problem you have been discussing, you are the implementor +so you certainly have the power to create and then employ the +necessary interface. However, it appears that you have overlooked +this necessity, and that is probably why you have been having +difficulty. + +<h3>Discussion of Immediacy, Transparency, and Compliance</h3> + +In FORTH-83 it was necessary to document the "I" (Immediate) attribute +of every standard word (and for that matter every word in each +application) because the application needed to be aware of this +attribute in order to make correct selections between use of COMPILE +and <a href=dpans6.htm#6.2.2530>[COMPILE]</a> , and in order to predict the consequences of using what +are now called "execution tokens". Since knowledge of immediate +versus nonimmediate attribute for each existing word appeared in +application programs in both explicit and implicit ways, it was not +practical to change the "immediacy" of any word in the system, nor +indeed in most applications. The attribute of immediacy was the only +tool for making or discussing the distinc- tion between compilation +and execution behavior, and the need for program awareness of this +attribute as well as its inelastic nature led to a number of well +known inconsistencies. In addition, it made compliance with FORTH-83 +impractically cumbersome for many advanced compilers, including the +incremental optimizing sort. + +<p> +ANS Forth addresses these problems by defining all words in terms +of explicit compilation, interpretation, and execution semantics; +by defining such words as <a href=dpans6.htm#6.1.1710>IMMEDIATE</a> and <a href=dpans6.htm#6.2.2530>[COMPILE]</a> and the effects +of <a href=dpans6.htm#6.1.1370>EXECUTE</a> with execution tokens as specific transformations and +selections on these semantics; by introducing <a href=dpans6.htm#6.1.2033>POSTPONE</a> to solve +a well known dilemma in selection of the appropriate semantics; +and finally by deleting the "I" designations since it is no longer +necessary for the application programmer to be aware of them as +such. Finally, having done these things, it is possible for a +compiler to add any desired compilation semantics, including those +useful for optimization purposes, to definitions without affecting +the use of those definitions by applications. <a href=dpans6.htm#6.1.1710>IMMEDIATE</a> remains +available for application use, but its effects are specified in +semantic terms that can coexist with arbitrary default compilation +semantics. + +<p> +In ANS Forth, the existence and nature of compilation semantics +that are in effect messages to the compiler is concealed well +from the programmer, and the application code is the same whether +or not, for example, <a href=dpans6.htm#6.1.1290>DUP</a> is "immediate" (in the old terms) or +"has special compilation semantics" (in ANS Forth terms). The +only significant caveat is that when a system supports <a href=dpans6.htm#6.2.2530>[COMPILE]</a> +it must be very careful to treat all definitions that the +Standard says have "default" compilation semantics, but to +which the system has given "special" compilation semantics +for its own purposes, as though they had "default" compilation +semantics when referenced by <a href=dpans6.htm#6.2.2530>[COMPILE]</a>. + +<p> +An implementation complies with the standard if all Forth words +and classes of words defined by the Standard behave, in all cases, +consistently with the semantics prescribed in the Standard. The +test for correctness is specifically limited to semantics, as +opposed to nonsemantic considerations such as, for example, +the size, speed, or binary representation of compiled programs. + +<p> +Please refer to <a href=dpansd.htm#D.4>D.4</a>, <a href=dpansd.htm#D.5>D.5</a>, <a href=dpansd.htm#D.6.7>D.6.7</a>, and <a href=dpanse.htm#E.4.1>E.4.1</a> for further discussion +of optimizing compilers and ANS Forth handling of "immediacy". + +<h2><a name="ballot">Letter Ballot</a></h2> + +<pre> +X3 Subgroup Letter Ballot +Authorized by X3 Procedures - Distributed by X3 Subgroup X3J14 +Project: X3J14, ANS Forth +Doc#: X3J14/LB018 +Reference Doc#s: X3J14/Q0007R, X3.215.1994 ANS Forth +Date: February 19, 1996 +Title: Response to Request for Interpretation Q0007, Clarifying the +distinction between "immediacy" and "special compilation semantics" +Ballot Period: 30 Days +Ballot Closes NOON DATE: March 21, 1996 +Respond to: greg@minerva.com + or: Elizabeth D. Rather, Chair + FORTH, Inc. + 111 N. Sepulveda Blvd. Suite 300 + Manhattan Beach, CA 90266 + (310) 372-8493 FAX (310) 318-7130 + erather@forth.com + +Statement: + Document X3J14/Q0007R contains a proposed Response to Request for + Interpretation Q0007. + +Question: + Do you agree that this response represents the intended interpretation of + X3.215.1994 ANS Forth? + + +/------------------------ begin response area----------------------\ +| +| YES____ NO____ ABSTAIN____ +| +| Signature: [not required for email ballots] +| Name: +| Organization: +| +| Explanation (REQUIRED for NO or ABSTAIN votes): +| <none> +\------------------------ end response area ----------------------/ + +INSTRUCTIONS: +Please return the entire letter ballot with your response _either_ by email +to greg@minerva.com _or_ by regular mail or fax or email to me at the above +address, before the closing date & time. + + If replying electronically PLEASE edit only within the response area + indicated above, inserting any explanatory text in place of <none>. + Any changes made outside that area will likely be overlooked. + +All TC members must vote. Failure to vote in two consecutive ballots may +cause you to lose your voting rights in X3J14. + +Thank you for your participation. + +Elizabeth D. Rather, Chair, X3J14 +</pre> + +<h2><a name="results">Results of Letter Ballot</a></h2> + +<pre> +Letter ballot 18 closed at noon March 21 with the following results: + + Y N A NV +LB18: 12, 0, 1, 1 + +Abstention from John Hayes. +</pre> diff --git a/mwmouse/sources/AnsForth/ANSSPEC.CHM b/mwmouse/sources/AnsForth/ANSSPEC.CHM Binary files differ. diff --git a/mwmouse/sources/AnsForth/ANSSPEC.HHP b/mwmouse/sources/AnsForth/ANSSPEC.HHP @@ -0,0 +1,64 @@ +[OPTIONS] +Compatibility=1.1 +Compiled file=ANSspec.chm +Default Window=Main window +Default topic=DPANS.HTM +Display compile progress=No +Language=0x809 English (United Kingdom) +Title=Draft ANS Forth Specification + +[WINDOWS] +Main window=,,,"DPANS.HTM","DPANS.HTM","dpansf.htm","Index","mpetext.htm","MPE",0x2020,,0xc204c,[11,8,599,591],,,,0,,, + + +[FILES] +A0001.HTM +A0002.HTM +A0003.HTM +A0004.HTM +A0005.HTM +A0006.HTM +A0007.HTM +DPANS.HTM +DPANS1.HTM +DPANS10.HTM +DPANS11.HTM +DPANS12.HTM +DPANS13.HTM +DPANS14.HTM +DPANS15.HTM +DPANS16.HTM +DPANS17.HTM +DPANS2.HTM +DPANS3.HTM +DPANS4.HTM +DPANS5.HTM +DPANS6.HTM +DPANS7.HTM +DPANS8.HTM +DPANS9.HTM +DPANSA1.HTM +DPANSA10.HTM +DPANSA11.HTM +DPANSA12.HTM +DPANSA13.HTM +DPANSA14.HTM +DPANSA15.HTM +DPANSA16.HTM +DPANSA17.HTM +DPANSA2.HTM +DPANSA3.HTM +DPANSA4.HTM +DPANSA5.HTM +DPANSA6.HTM +DPANSA7.HTM +DPANSA8.HTM +DPANSA9.HTM +DPANSB.HTM +DPANSC.HTM +DPANSD.HTM +DPANSE.HTM +DPANSF.HTM +NOTES.HTM +RFILIST.HTM +mpetext.htm diff --git a/mwmouse/sources/AnsForth/DOWN.GIF b/mwmouse/sources/AnsForth/DOWN.GIF Binary files differ. diff --git a/mwmouse/sources/AnsForth/DPANS.HTM b/mwmouse/sources/AnsForth/DPANS.HTM @@ -0,0 +1,576 @@ +<HTML><HEAD> +<TITLE>DPANS94</TITLE> +<link disabled rel="stylesheet" href="mpexc6.css"> +<style>@import url(mpexc6.css);</style> +</head> + +<BODY> +<HR> +<H2>American National Standard +for Information Systems </H2> + +<H1>Programming Languages </H1> + +<H1>Forth</H1> + +<P> + +Secretariat +<BR> +<B>Computer and Business Equipment Manufacturers Association</B> +<BR> +Approved: March 24, 1994 +<BR> +<B>American National Standards Institute, Inc.</B> +<P> + + +<HR> +<P> + +Copyright (c) 1994 by Technical Committee X3J14. All rights reserved. +<P> + +This is a working document of Technical Committee X3J14 which +represents the last draft of ANS Forth submitted to ANSI for publication. +Permission is hereby granted to copy this document provided that it is +copied in its entirety without alteration or as altered by (1) adding text +that is clearly marked as an insertion; (2) shading or highlighting +existing text; and/or (3) deleting examples. +<P> + +Specifically, permission is granted to use this working document as the +foundation for textbooks, system manuals, and online documentation so +long as the requirements in the preceding paragraph are met and the +resulting product addresses a technical need that is not practically met by +the official ANS. +<P> + +<DL><DT><B>NOTE:</B> +<DD>This file is provided as a working document of the TC for +public review and comment as well as documentation uses described above. +<I>It is not intended as a substitute for the official ANS Forth document +published by ANSI.</I> In the event of conflict, only the printed document +X3.215-1994 represents the official ANS Forth. </DL> + +<P> + +To obtain the official standard, please contact the American +National Standards Institute Sales Department, at (212) 642-4900 or FAX +(212) 302-1286, or Global Engineering Documents, at (800) 854-7179 or +FAX (303) 843-9880, and request Document X3.215-1994. Thank you very +much for your interest. + +<P> + + +<HR> + +<h3>HTML version 3.2</h3> + +<a href=notes.htm>Editorial Notes</a> +<br> +<a href=rfilist.htm>Requests for Interpretations</a> +<p> +<hr> +<a name=toc> +<H3>Table of Contents</H3> +</a> + + +<P> + + +<hr> +<A href=dpans1.htm#foreword>Foreword</A> +<BR> +<A href=dpans1.htm#x3.membership>X3 Membership</A> +<BR> +<A href=dpans1.htm#x3j14.membership>X3J14 Membership</A> +<BR> +<P> + + +<hr> +<A href=dpans1.htm#1.>1.</a> Introduction +<BR> +<DL> +<A href=dpans1.htm#1.1>1.1</a> Purpose +<BR> +<A href=dpans1.htm#1.2>1.2</a> Scope +<BR> +<A href=dpans1.htm#1.3>1.3</a> Document organization +<BR> +<A href=dpans1.htm#1.4>1.4</a> Future directions +<BR></DL> + +<P> + + +<hr> +<A href=dpans2.htm>2.</a> Terms, notation, and references +<BR> +<DL> +<A href=dpans2.htm#2.1>2.1</a> Definitions of terms +<BR> +<A href=dpans2.htm#2.2>2.2</a> Notation +<BR> +<dl> +<A href=dpans2.htm#2.2.1>2.2.1</a> Numeric notation +<BR> +<A href=dpans2.htm#2.2.2>2.2.2</a> Stack notation +<BR> +<A href=dpans2.htm#2.2.3>2.2.3</a> Parsed-text notation +<BR> +<A href=dpans2.htm#2.2.4>2.2.4</a> Glossary notation +<BR></dl> +<A href=dpans2.htm#2.3>2.3</a> References +<BR></DL> + +<P> + +<hr> +<A href=dpans3.htm>3.</a> Usage requirements +<BR> +<DL> +<A href=dpans3.htm#3.1>3.1</a> Data types +<BR> +<dl> +<a href=dpans3.htm#3.1.1>3.1.1</a> Data-type relationships +<BR> +<a href=dpans3.htm#3.1.2>3.1.2</a> Character types +<BR> +<a href=dpans3.htm#3.1.3>3.1.3</a> Single-cell types +<BR> +<a href=dpans3.htm#3.1.4>3.1.4</a> Cell-pair types +<BR> +<a href=dpans3.htm#3.1.5>3.1.5</a> System types +<BR></dl> +<A href=dpans3.htm#3.2>3.2</a> The implementation environment +<BR> +<dl> +<A href=dpans3.htm#3.2.1>3.2.1</a> Numbers +<BR> +<A href=dpans3.htm#3.2.2>3.2.2</a> Arithmetic +<BR> +<A href=dpans3.htm#3.2.3>3.2.3</a> Stacks +<BR> +<A href=dpans3.htm#3.2.4>3.2.4</a> Operator terminal +<BR> +<A href=dpans3.htm#3.2.5>3.2.5</a> Mass storage +<BR> +<A href=dpans3.htm#3.2.6>3.2.6</a> Environmental queries +<BR></dl> +<A href=dpans3.htm#3.3>3.3</a> The Forth dictionary +<BR> +<dl> +<A href=dpans3.htm#3.3.1>3.3.1</a> Name space +<BR> +<A href=dpans3.htm#3.3.2>3.3.2</a> Code space +<BR> +<A href=dpans3.htm#3.3.3>3.3.3</a> Data space +<BR></dl> +<A href=dpans3.htm#3.4>3.4</a> The Forth text interpreter +<BR> +<dl> +<A href=dpans3.htm#3.4.1>3.4.1</a> Parsing +<BR> +<A href=dpans3.htm#3.4.2>3.4.2</a> Finding definition names +<BR> +<A href=dpans3.htm#3.4.3>3.4.3</a> Semantics +<BR> +<A href=dpans3.htm#3.4.4>3.4.4</a> Possible actions on an ambiguous condition +<BR> +<A href=dpans3.htm#3.4.5>3.4.5</a> Compilation +</dl> +<BR></DL> + +<P> + +<hr> +<A href=dpans4.htm>4.</a> Documentation requirements +<BR> +<DL> +<A href=dpans4.htm#4.1>4.1</a> System documentation +<BR> +<A href=dpans4.htm#4.2>4.2</a> Program documentation +<BR></DL> + +<P> + +<hr> +<A href=dpans5.htm>5.</a> Compliance and labeling +<BR> +<DL> +<A href=dpans5.htm#5.1>5.1</a> ANS Forth systems +<BR> +<A href=dpans5.htm#5.2>5.2</a> ANS Forth programs +<BR></DL> + +<P> + +<hr> +<A href=dpans6.htm>6.</a> Glossary +<BR> +<DL> +<A href=dpans6.htm#6.1>6.1</a> Core words +<BR> +<A href=dpans6.htm#6.2>6.2</a> Core extension words +<BR></DL> + +<P> + +<hr> +<A href=dpans7.htm>7.</a> The optional Block word set +<BR> +<DL> +<A href=dpans7.htm#7.1>7.1</a> Introduction +<BR> +<A href=dpans7.htm#7.2>7.2</a> Additional terms +<BR> +<A href=dpans7.htm#7.3>7.3</a> Additional usage requirements +<BR> +<A href=dpans7.htm#7.4>7.4</a> Additional documentation requirements +<BR> +<A href=dpans7.htm#7.5>7.5</a> Compliance and labeling +<BR> +<A href=dpans7.htm#7.6.1>7.6.1</a> Block words +<BR> +<A href=dpans7.htm#7.6.2>7.6.2</a> Block extension words +<BR></DL> + +<P> + +<hr> +<A href=dpans8.htm>8.</a> The optional Double-Number word set +<BR> +<DL> +<A href=dpans8.htm#8.1>8.1</a> Introduction +<BR> +<A href=dpans8.htm#8.2>8.2</a> Additional terms and notation +<BR> +<A href=dpans8.htm#8.3>8.3</a> Additional usage requirements +<BR> +<A href=dpans8.htm#8.4>8.4</a> Additional documentation requirements +<BR> +<A href=dpans8.htm#8.5>8.5</a> Compliance and labeling +<BR> +<A href=dpans8.htm#8.6.1>8.6.1</a> Double-Number words +<BR> +<A href=dpans8.htm#8.6.2>8.6.2</a> Double-Number extension words +<BR></DL> + +<P> + +<hr> +<A href=dpans9.htm>9.</a> The optional Exception word set +<BR> +<DL> +<A href=dpans9.htm#9.1>9.1</a> Introduction +<BR> +<A href=dpans9.htm#9.2>9.2</a> Additional terms and notation +<BR> +<A href=dpans9.htm#9.3>9.3</a> Additional usage requirements +<BR> +<A href=dpans9.htm#9.4>9.4</a> Additional documentation requirements +<BR> +<A href=dpans9.htm#9.5>9.5</a> Compliance and labeling +<BR> +<A href=dpans9.htm#9.6.1>9.6.1</a> Exception words +<BR> +<A href=dpans9.htm#9.6.2>9.6.2</a> Exception extension words +<BR></DL> + +<P> + +<hr> +<A href=dpans10.htm>10.</a> The optional Facility word set +<BR> +<DL> +<A href=dpans10.htm#10.1>10.1</a> Introduction +<BR> +<A href=dpans10.htm#10.2>10.2</a> Additional terms and notation +<BR> +<A href=dpans10.htm#10.3>10.3</a> Additional usage requirements +<BR> +<A href=dpans10.htm#10.4>10.4</a> Additional documentation requirements +<BR> +<A href=dpans10.htm#10.5>10.5</a> Compliance and labeling +<BR> +<A href=dpans10.htm#10.6.1>10.6.1</a> Facility words +<BR> +<A href=dpans10.htm#10.6.2>10.6.2</a> Facility extension words +<BR></DL> + +<P> + +<hr> +<A href=dpans11.htm>11.</a> The optional File-Access word set +<BR> +<DL> +<A href=dpans11.htm#11.1>11.1</a> Introduction +<BR> +<A href=dpans11.htm#11.2>11.2</a> Additional terms +<BR> +<A href=dpans11.htm#11.3>11.3</a> Additional usage requirements +<BR> +<A href=dpans11.htm#11.4>11.4</a> Additional documentation requirements +<BR> +<A href=dpans11.htm#11.5>11.5</a> Compliance and labeling +<BR> +<A href=dpans11.htm#11.6.1>11.6.1</a> File-Access words +<BR> +<A href=dpans11.htm#11.6.2>11.6.2</a> File-Access extension words +<BR></DL> + +<P> + +<hr> +<A href=dpans12.htm>12.</a> The optional Floating-Point word set +<BR> +<DL> +<A href=dpans12.htm#12.1>12.1</a> Introduction +<BR> +<A href=dpans12.htm#12.2>12.2</a> Additional terms and notation +<BR> +<A href=dpans12.htm#12.3>12.3</a> Additional usage requirements +<BR> +<A href=dpans12.htm#12.4>12.4</a> Additional documentation requirements +<BR> +<A href=dpans12.htm#12.5>12.5</a> Compliance and labeling +<BR> +<A href=dpans12.htm#12.6.1>12.6.1</a> Floating-Point words +<BR> +<A href=dpans12.htm#12.6.2>12.6.2</a> Floating-Point extension words +<BR></DL> + +<P> + +<hr> +<A href=dpans13.htm>13.</a> The optional Locals word set +<BR> +<DL> +<A href=dpans13.htm#13.1>13.1</a> Introduction +<BR> +<A href=dpans13.htm#13.2>13.2</a> Additional terms and notation +<BR> +<A href=dpans13.htm#13.3>13.3</a> Additional usage requirements +<BR> +<A href=dpans13.htm#13.4>13.4</a> Additional documentation requirements +<BR> +<A href=dpans13.htm#13.5>13.5</a> Compliance and labeling +<BR> +<A href=dpans13.htm#13.6.1>13.6.1</a> Locals words +<BR> +<A href=dpans13.htm#13.6.2>13.6.2</a> Locals extension words +<BR></DL> + +<P> + +<hr> +<A href=dpans14.htm>14.</a> The optional Memory-Allocation word set +<BR> +<DL> +<A href=dpans14.htm#14.1>14.1</a> Introduction +<BR> +<A href=dpans14.htm#14.2>14.2</a> Additional terms and notation +<BR> +<A href=dpans14.htm#14.3>14.3</a> Additional usage requirements +<BR> +<A href=dpans14.htm#14.4>14.4</a> Additional documentation requirements +<BR> +<A href=dpans14.htm#14.5>14.5</a> Compliance and labeling +<BR> +<A href=dpans14.htm#14.6.1>14.6.1</a> Memory-Allocation words +<BR></DL> + +<P> + +<hr> +<A href=dpans15.htm>15.</a> The optional Programming-Tools word set +<BR> +<DL> +<A href=dpans15.htm#15.1>15.1</a> Introduction +<BR> +<A href=dpans15.htm#15.2>15.2</a> Additional terms and notation +<BR> +<A href=dpans15.htm#15.3>15.3</a> Additional usage requirements +<BR> +<A href=dpans15.htm#15.4>15.4</a> Additional documentation requirements +<BR> +<A href=dpans15.htm#15.5>15.5</a> Compliance and labeling +<BR> +<A href=dpans15.htm#15.6.1>15.6.1</a> Programming-Tools words +<BR> +<A href=dpans15.htm#15.6.2>15.6.2</a> Programming-Tools extension words +<BR></DL> + +<P> + +<hr> +<A href=dpans16.htm>16.</a> The optional Search-Order word set +<BR> +<DL> +<A href=dpans16.htm#16.1>16.1</a> Introduction +<BR> +<A href=dpans16.htm#16.2>16.2</a> Additional terms and notation +<BR> +<A href=dpans16.htm#16.3>16.3</a> Additional usage requirements +<BR> +<A href=dpans16.htm#16.4>16.4</a> Additional documentation requirements +<BR> +<A href=dpans16.htm#16.5>16.5</a> Compliance and labeling +<BR> +<A href=dpans16.htm#16.6.1>16.6.1</a> Search-Order words +<BR> +<A href=dpans16.htm#16.6.2>16.6.2</a> Search-Order extension words +<BR></DL> + +<P> + +<hr> +<A href=dpans17.htm>17.</a> The optional String word set +<BR> +<DL> +<A href=dpans17.htm#17.1>17.1</a> Introduction +<BR> +<A href=dpans17.htm#17.2>17.2</a> Additional terms and notation +<BR> +<A href=dpans17.htm#17.3>17.3</a> Additional usage requirements +<BR> +<A href=dpans17.htm#17.4>17.4</a> Additional documentation requirements +<BR> +<A href=dpans17.htm#17.5>17.5</a> Compliance and labeling +<BR> +<A href=dpans17.htm#17.6.1>17.6.1</a> String words +<BR></DL> +<P> + +<hr> +<A href=dpansa1.htm>A.</a> Rationale (informative annex) +<BR> +<DL> +<A href=dpansa1.htm>A.1</a> Introduction +<BR> +<A href=dpansa2.htm>A.2</a> Terms and notation +<BR> +<A href=dpansa3.htm>A.3</a> Usage requirements +<BR> +<A href=dpansa4.htm>A.4</a> Documentation requirements +<BR> +<A href=dpansa5.htm>A.5</a> Compliance and labeling +<BR> +<A href=dpansa6.htm>A.6</a> Glossary +<BR> +<A href=dpansa7.htm>A.7</a> The optional Block word set +<BR> +<A href=dpansa8.htm>A.8</a> The optional Double-Number word set +<BR> +<A href=dpansa9.htm>A.9</a> The optional Exception word set +<BR> +<A href=dpansa10.htm>A.10</a> The optional Facility word set +<BR> +<A href=dpansa11.htm>A.11</a> The optional File-Access word set +<BR> +<A href=dpansa12.htm>A.12</a> The optional Floating-Point word set +<BR> +<A href=dpansa13.htm>A.13</a> The optional Locals word set +<BR> +<A href=dpansa14.htm>A.14</a> The optional Memory-Allocation word set +<BR> +<A href=dpansa15.htm>A.15</a> The optional Programming-Tools word set +<BR> +<A href=dpansa16.htm>A.16</a> The optional Search-Order word set +<BR> +<A href=dpansa17.htm>A.17</a> The optional String word set +<BR></DL> + +<P> + +<hr> +<A href=dpansb.htm>B.</a> Bibliography (informative annex) +<BR> +<DL> +<A href=dpansb.htm#Industry.standards>Industry standards</A> +<BR> +<A href=dpansb.htm#Books>Books</A> +<BR> +<A href=dpansb.htm#Journals>Journals, magazines and newsletters</A> +<BR> +<A href=dpansb.htm#Selected.articles>Selected articles</A> +<BR></DL> + +<P> + +<hr> +<A href=dpansc.htm>C.</a> Perspective (informative annex) +<BR> +<DL> +<A href=dpansc.htm#C.1>C.1</a> Features of Forth +<BR> +<A href=dpansc.htm#C.2>C.2</a> History of Forth +<BR> +<A href=dpansc.htm#C.3>C.3</a> Hardware implementations of Forth +<BR> +<A href=dpansc.htm#C.4>C.4</a> Standardization efforts +<BR> +<A href=dpansc.htm#C.5>C.5</a> Programming in Forth +<BR> +<A href=dpansc.htm#C.6>C.6</a> Multiprogrammed systems +<BR> +<A href=dpansc.htm#C.7>C.7</a> Design and management considerations +<BR> +<A href=dpansc.htm#C.8>C.8</a> Conclusion +<BR></DL> + +<P> + +<hr> +<A href=dpansd.htm>D.</a> Compatibility analysis of ANS Forth +(informative annex) +<BR> +<DL> +<A href=dpansd.htm#D.1>D.1</a> FIG Forth (circa 1978) +<BR> +<A href=dpansd.htm#D.2>D.2</a> Forth-79 +<BR> +<A href=dpansd.htm#D.3>D.3</a> Forth-83 +<BR> +<A href=dpansd.htm#D.4>D.4</a> Recent developments +<BR> +<A href=dpansd.htm#D.5>D.5</a> ANS Forth approach +<BR> +<A href=dpansd.htm#D.6>D.6</a> Differences from Forth-83 +<BR></DL> + +<P> + +<hr> +<A href=dpanse.htm>E.</a> ANS Forth portability guide (informative +annex) +<BR> +<DL> +<A href=dpanse.htm#E.1>E.1</a> Introduction +<BR> +<A href=dpanse.htm#E.2>E.2</a> Hardware peculiarities +<BR> +<A href=dpanse.htm#E.3>E.3</a> Number representation +<BR> +<A href=dpanse.htm#E.4>E.4</a> Forth system implementation +<BR> +<A href=dpanse.htm#E.5>E.5</a> ROMed application disciplines and +conventions +<BR> +<A href=dpanse.htm#E.6>E.6</a> Summary +<BR></DL> + +<P> + +<hr> +<A href=dpansf.htm>F.</a> Alphabetic list of words (informative +annex) +<BR> +<hr> +<P> +</BODY> +</HTML> diff --git a/mwmouse/sources/AnsForth/DPANS1.HTM b/mwmouse/sources/AnsForth/DPANS1.HTM @@ -0,0 +1,702 @@ +<HTML><HEAD> +<TITLE>DPANS94</TITLE> +<link disabled rel="stylesheet" href="mpexc6.css"> +<style>@import url(mpexc6.css);</style> +</head> + + +<BODY> +<table width=100%> +<tr> +<td align=left> +<a href=dpans2.htm><img src=right.gif + width=26 height=26 align=ALIGN border=0></a> +</td> +<td align=right> +<a href=dpans.htm#toc><img src=up.gif + width=26 height=26 align=ALIGN border=0></a> +Table of Contents +</td> +</tr> +</table> +<p> +<hr size=4> + +<H1>American National Standard for Information Systems</H1> + +<H1>Programming Languages</H1> + +<H1>Forth</H1> + + +Secretariat + +<BR> +Computer and Business Equipment Manufacturers Association + +<BR> +Approved: March 24, 1994 + +<BR> +American National Standards Institute, Inc. + +<P> + + +Copyright (c) 1994 by Technical Committee X3J14. +All rights reserved. + +<P> + + +This is a working document of Technical Committee X3J14 which represents +the last draft of ANS Forth submitted to ANSI for publication. +Permission is hereby granted to copy this document provided that it is +copied in its entirety without alteration or as altered by (1) adding +text that is clearly marked as an insertion; (2) shading or highlighting +existing text; and/or (3) deleting examples. + +<P> + + +Specifically, permission is granted to use this working document as the +foundation for textbooks, system manuals, and online documentation so +long as the requirements in the preceding paragraph are met and the +resulting product addresses a technical need that is not practically met +by the official ANS. + +<P> + + +<b>NOTE:</b> This file is provided as a working document of the TC for public +review and comment as well as documentation uses described above. It is +not intended as a substitute for the official ANS Forth document +published by ANSI. In the event of conflict, only the printed document +X3.215-1994 represents the official ANS Forth. + +<P> + + +To obtain the official standard, please contact the American National +Standards Institute Sales Department, at (212) 642-4900 or FAX (212) +302-1286, or Global Engineering Documents, at (800) 854-7179 or FAX +(303) 843-9880, and request Document X3.215-1994. Thank you very much +for your interest. + + + +<HR> +<a name=foreword> +<H1>Foreword</H1> +</a> + + +(This foreword is not a part of +American National Standard X3.215-1994) + +<P> + + +Forth is a language for direct communication between human beings and +machines. Using natural-language diction and machine-oriented syntax, +Forth provides an economical, productive environment for interactive +compilation and execution of programs. Forth also provides low-level +access to computer-controlled hardware, and the ability to extend the +language itself. This extensibility allows the language to be quickly +expanded and adapted to special needs and different hardware systems. + +<P> + + +Forth was invented by Mr. Charles Moore to increase programmer +productivity without sacrificing machine efficiency. Forth is a layered +environment containing the elements of a computer language as well as +those of an operating system and a machine monitor. This extensible, +layered environment provides for highly interactive program development +and testing. + +<P> + + +In the interests of transportability of application software written in +Forth, standardization efforts began in the mid-1970s by an +international group of users and implementors who adopted the name +<B>Forth Standards Team</B>. This effort resulted in the Forth-77 +Standard. As the language continued to evolve, an interim Forth-78 +Standard was published by the Forth Standards Team. Following Forth +Standards Team meetings in 1979, the Forth-79 Standard was published in +1980. Major changes were made by the Forth Standards Team in the +Forth-83 Standard, which was published in 1983. + +<P> + + +The first meeting of the Technical Committee on Forth Programming +Systems was convened by the Organizing Committee of the X3J14 Forth +Technical Committee on August 3, 1987, and has met subsequently on +November 11-12, 1987, February 10-12, 1988, May 25-28, 1988, August +10-13, 1988, October 26-29, 1988, January 25-28, 1989, May 3-6, 1989, +July 26-29, 1989, October 25-28, 1989, January 24-27, 1990, May 22-26, +1990, August 21-25, 1990, November 6-10,1990, January 29-February 2, +1991, May 3-4, 1991, June 16-19, 1991, July 30-August 3, 1991, March +17-21, 1992, October 13-17, 1992, January 26-30, 1993, June 28-30, 1993, +and June 21, 1994. + +<P> + +Requests for interpretation, suggestions for improvement or addenda, or +defect reports are welcome. They should be sent to the X3 Secretariat, +Computer and Business Equipment Manufacturers Association, 1250 Eye +Street, NW, Suite 200, Washington, DC 20005. + + + +<HR> +<a name=x3.membership> +<H1>X3 Membership</H1> +</a> + +This standard was processed and approved for submittal to ANSI by the +Accredited Standards Committee on Information Processing Systems, X3. +Committee approval of this standard does not necessarily imply that all +committee members voted for its approval. At the time it approved this +standard, the X3 Committee had the following members: + +<P> + + +James D. Converse, Chair +Donald C. Loughry, Vice-Chair +Joanne Flanagan, Secretary + +<P> + + + + +<PRE> +Producer Group Name of Representative +-------------- ---------------------- +AMP Incorporated Edward Kelly + Charles Brill (Alt.) + +AT&T/NCR Corporation Thomas W. Kern + Thomas F. Frost (Alt.) + +Apple Computer, Inc. Karen Higginbottom + +Compaq Computers James Barnes + +Digital Equipment Corporation Delbert Shoemaker + Kevin Lewis + +Hitachi America Ltd. John Neumann + Kei Yamashita (Alt.) + +Hewlett Packard Donald C. Loughry + +Bull HN Information Systems Inc. William George + +IBM Corporation Joel Urman + Mary Anne Lawler (Alt.) + +Unisys Corporation John Hill + Stephen P. Oksala (Alt.) + +Sony Corporation of America Michael Deese + +Storage Technology Corporation Joseph S. Zajaczkowski + Samuel D. Cheatham (Alt.) + +Sun Microsystems, Inc. Scott Jameson + Gary S. Robinson (Alt.) + +* Xerox Corporation Dwight McBain + Roy Pierce (Alt.) + +3M Company Edie T. Morioka + Paul D. Jahnke (Alt. + +</PRE> +<P> + + +Consumers Group + +<BR> +--------------- + + +<PRE> +Boeing Company Catherine Howells + Andrea Vanosdoll (Alt.) + +Eastman Kodak Company James Converse + Michael Nier (Alt.) + +General Services Administration Douglas Arai + Larry L. Jackson (Alt.) + +Guide International Inc. Frank Kirshenbaum + Harold Kuneke (Alt.) + +** Hughes Aircraft Company Harold Zebrack + +National Communications Systems Dennis Bodson + +Northern Telecom Inc. Mel Woinsky + Subhash Patel (Alt.) + +** Recognition Tech Users Association Herbert P. Schantz + Edwin Hale (Alt.) + +Share Inc. Gary AinsworthDavid Thewis (Alt.) + +U. S. Department of Defense William Rinehuls + J. Pasquariello (Alt.) + +U. S. Department of Energy Alton Cox + Lawrence A. Wasson (Alt.) + +Wintergreen Information Services John Wheeler +</PRE> +<P> + + + +General Interest Group + +<BR> +---------------------- + + +<PRE> +American Nuclear Society Geraldine C. Main + Sally Hartzell (Alt.) + +Assn. of the Institute for Certification of Computer Professionals + Kenneth Zemrowski + +Nat'l Institute of Standards and Technology + Robert E. Rountree + Micharl Hogan (Alt.) + +Neville & Associates Carlton Neville +________________________ + +* Abstain ** Non-Response +</PRE> + +<P> + + + + +<HR> +<a name=x3j14.membership> +<H3>X3J14 Membership</H3> +</a> + +At the time it approved this draft of the proposed American National +Standard, the Technical Committee X3J14 on the Forth Programming +Language had the following members: + +<P> + + +Elizabeth Rather, Chair + +<BR> +Mitch Bradley, acting Vice-Chair + +<BR> +Don Colburn, Secretary + +<BR> +John Rible, Technical Editor + +<BR> +Len Zettel, Vocabulary Representative + +<BR> +Greg Bailey, Technical Subcommittee Chair + +<BR> + +<P> + + + + +<PRE> +Organization Represented Name of Representative +------------------------ ---------------------- +ATHENA Programming, Inc. Greg Bailey + Howe Fong (Alt.) + +Bradley Forthware Mitch Bradley + +Creative Solutions, Inc. Don Colburn + +Ford Motor Company Leonard F. Zettel, Jr. + +FORTH, Inc. Elizabeth Rather + Dennis Ruffer (Alt.) + +Institute for Applied Forth Research Lawrence Forsley + Horace Simmons (Alt.) + +Johns Hopkins University, Applied Physics Lab. + John Hayes + +Mephistopheles Systems Dave Harralson + +NASA/Goddard Space Flight Center James Rash + +Nomadic Software John K. Stevenson + +Unisyn, Inc. Gary Betts + Stephen Egbert (Alt.) + +Up and Running Martin Tracy + +Vesta Technology Jack Woehr + +Individual Members Loring Craymer + John Rible + E. (Jet) Thomas + +X3 Liasons Clyde R. Camp + Kathleen McMillan +</PRE> + +<P> + + +The following organizations and individuals have also participated in this +project as Technical Committee members, alternates, or observers. The +Technical Committee recognizes and respects their contributions: + +<P> + + +Organizations + +<BR> +------------- + + +<PRE> +British Columbia Inst. of Tech. MCI Telecommunications Corp. +Computer Cowboys Micromotion +Computer Sciences Corp. MicroProcessor Engineering Ltd. +Computer Strategies, Inc. National Institute of Standards & Technology +Digalog Corp. NCR Medical Systems Group +Embedded Sys. Programming Mag. Performance Packages, Inc. +Forth Interest Group (FIG) Purdue University +H.B. Pascal & Co., Inc. Robert Berkey Services +Harris Semiconductor Shaw Laboratories +IBM Corporation Social Security Administration +IEEE Software Engineering +Kelly Enterprises Texas Instruments +Laboratory Microsystems, Inc. The Dickens Company +Maxtor Corp. +</PRE> + +<P> + + +Individuals + +<BR> +----------- + + +<PRE> +David J. Angel Ray Duncan Charles Moore Dean Sanderson +Wil Baden Douglas Fishman Mike Nemeth George Shaw +Robert Berkey Tom Hand Harry Pascal Gerald Shifrin +Ron Braithwaite Gregory Ilg Stephen Pelc Robert Smith +Jack Brown Charles Keane Dean Perrine Tyler Sperry +Chris Colburn Guy M. Kelly David C. Petty Tom Zimmer +Ted Dickens Andrew Kobziar Bill Ragsdale James Ryland +John Dorband Martin Lascelles + +</PRE> +<P> + +<hr> +<H1>AMERICAN NATIONAL STANDARD ANSI X3.215-1994 American National +Standard for Information Systems</A></H1> + + + +<H3>Programming Language</A></H3> + + +<H3>Forth</A></H3> + + + +<HR> +<a name=1.> +<H1>1. Introduction</H1> +</a> + + +<hr> +<a name=1.1> +<H2>1.1 Purpose</H2> +</a> + +The purpose of this Standard is to promote the portability of Forth programs +for use on a wide variety of computing systems, to facilitate the +communication of programs, programming techniques, and ideas among Forth +programmers, and to serve as a basis for the future evolution of the Forth +language. + +<P> + + +<hr> +<a name=1.2> +<H2>1.2 Scope</H2> +</a> + +This Standard specifies an interface between a Forth System and a Forth +Program by defining the words provided by a Standard System. + +<p> +<code> +See: +<a href=dpansa1.htm#A.1.2>A.1.2</a> Scope +</code> +<p> + +<hr> +<a name=1.2.1> +<H3>1.2.1 Inclusions</H3> +</a> + +This Standard specifies: +<P> + + +<UL> +<LI>the forms +that a program written in the Forth language may take; +<LI>the rules for interpreting the meaning of a program and its data. +</UL> + +<P> + + +<hr> +<a name=1.2.2> +<H3>1.2.2 Exclusions</H3> +</a> + +This Standard does not specify: +<P> + + +<UL> +<LI>the mechanism +by which programs are transformed for use on computing +systems; +<LI>the operations +required for setup and control of the use of programs +on computing systems; +<LI>the method +of transcription of programs or their input or output data +to or from a storage medium; +<LI>the program +and Forth system behavior when the rules of this Standard +fail to establish an interpretation; +<LI>the size +or complexity of a program and its data that will exceed the +capacity of any specific computing system or the capability of a particular +Forth system; +<LI>the physical +properties of input/output records, files, and units; +<LI>the physical +properties and implementation of storage. +</UL> + +<P> + + +<hr> +<a name=1.3> +<H2>1.3 Document organization</H2> +</a> + +<P> + + +<hr> +<a name=1.3.1> +<H3>1.3.1 Word sets</H3> +</a> + +This Standard groups Forth words and capabilities into word sets under a name +indicating some shared aspect, typically their common functional area. Each +word set may have an extension, containing words that offer additional +functionality. These words are not required in an implementation of the word +set. + +<P> + + +The <B>Core</B> word set, defined in sections 1 through 6, contains the +required +words and capabilities of a Standard System. The other word sets, defined in +sections 7 through 17, are optional, making it possible to provide Standard +Systems with tailored levels of functionality. + +<p> +<code> +See: +<a href=dpansa1.htm#A.1.3.1>A.1.3.1</a> Word sets +</code> +<p> + + + +<hr> +<a name=1.3.1.1> +<H4>1.3.1.1 Text sections</H4> +</a> + +Within each word set, section 1 contains introductory and explanatory material +and section 2 introduces terms and notation used throughout the Standard. +There are no requirements in these sections. + +<P> + + +Sections 3 and 4 contain the usage and documentation requirements, +respectively, for Standard Systems and Programs, while section 5 specifies +their labeling. + +<P> + + +<hr> +<a name=1.3.1.2> +<H4>1.3.1.2 Glossary sections</H4> +</a> + +Section 6 of each word set specifies the required behavior of the definitions +in the word set and the extensions word set. + +<P> + + +<hr> +<a name=1.3.2> +<H3>1.3.2 Annexes</H3> +</a> + +The annexes do not +contain any required material. +<P> + + +<a href=dpansa1.htm>Annex A</a> +provides some of the rationale behind the committee's decisions in +creating this Standard, as well as implementation examples. It has the same +section numbering as the body of the Standard to make it easy to relate each +requirements section to its rationale section. + +<P> + + +<a href=dpansb.htm>Annex B</a> +is a short bibliography on Forth. + +<P> + + +<a href=dpansc.htm>Annex C</a> +provides an introduction to Forth. + +<P> + + +<a href=dpansd.htm>Annex D</a> +discusses the compatibility of ANS Forth with earlier Forths, +emphasizing the differences from Forth-83. + +<P> + + +<a href=dpanse.htm>Annex E</a> +presents some techniques for writing portable programs in ANS Forth. + +<P> + + +<a href=dpansf.htm>Annex F</a> +includes the words from all word sets in a single list, and serves as +an index of ANS Forth words. + +<P> + + +<hr> +<a name=1.4> +<H2>1.4 Future directions</H2> +</a> + + + +<hr> +<A name=1.4.1> +<H3>1.4.1 New technology</H3> +</a> + +This Standard adopts certain words and practices that are increasingly found +in common practice. New words have also been adopted to ease creation of +portable programs. + +<P> + +<hr> +<A name=1.4.2> +<H3>1.4.2 Obsolescent features</H3> +</a> + +This Standard adopts certain words and practices that cause some previously +used words to become obsolescent. Although retained here because of their +widespread use, their use in new implementations or new programs is +discouraged, because they may be withdrawn from future revisions of the +Standard. + +<P> + +This Standard designates the following words as obsolescent: +<P> + + + +<PRE> +<a href=dpans6.htm#6.2.0060>6.2.0060</a> #TIB +<a href=dpans15.htm#15.6.2.1580>15.6.2.1580</a> FORGET +<a href=dpans6.htm#6.2.2240>6.2.2240</a> SPAN +<a href=dpans6.htm#6.2.0970>6.2.0970</a> CONVERT +<a href=dpans6.htm#6.2.2040>6.2.2040</a> QUERY +<a href=dpans6.htm#6.2.2290>6.2.2290</a> TIB +<a href=dpans6.htm#6.2.1390>6.2.1390</a> EXPECT +</PRE> + +<P> + +<hr> +<A href=dpans.htm#toc><IMG src="up.gif" ></A> Table of Contents +<BR> +<A href=dpans2.htm><IMG src="right.gif" ></A> +Next Section +<P> +</BODY> +</HTML> diff --git a/mwmouse/sources/AnsForth/DPANS10.HTM b/mwmouse/sources/AnsForth/DPANS10.HTM @@ -0,0 +1,497 @@ +<HTML><HEAD> +<TITLE>DPANS94</TITLE> +<link disabled rel="stylesheet" href="mpexc6.css"> +<style>@import url(mpexc6.css);</style> +</head> + +<BODY> +<table width=100%> +<tr> +<td align=left> +<a href=dpans9.htm><img src=left.gif + width=26 height=26 align=ALIGN border=0></a> +<a href=dpans13.htm><img src=right.gif + width=26 height=26 align=ALIGN border=0></a> +</td> +<td align=right> +<a href=dpans.htm#toc><img src=up.gif + width=26 height=26 align=ALIGN border=0></a> +<a name=10.>Table of Contents</a> +</td> +</tr> +</table> +<p> +<hr size=4> + +<H1>10. The optional Facility word set</H1> + + +<hr> +<A name=10.1> +<H2>10.1 Introduction</H2> +</a> + + +<hr> +<A name=10.2> +<H2>10.2 Additional terms and notation</H2> +</a> + +None. +<P> + + +<hr> +<A name=10.3> +<H2>10.3 Additional usage requirements</H2> +</a> + + +<hr> +<A name=10.3.1> +<H3>10.3.1 Character types</H3> +</a> + +Programs that use more than seven bits of a character by +<a href=dpans10.htm#10.6.2.1305>10.6.2.1305</a> +EKEY have an environmental dependency. +<P> + +<code> +See: +<A href=dpans3.htm#3.1.2>3.1.2</a> Character types +</code> +<P> + + +<hr> +<A name=10.3.2> +<H3>10.3.2 Environmental queries</H3> +</a> + +Append table 10.1 to table 3.5. +<P> + +<code> +See: +<a href=dpans3.htm#3.2.6>3.2.6</a> Environmental queries +</code> +<P> + +Table 10.1 - Environmental query strings + + +<PRE> +String Value data type Constant? Meaning +------ --------------- --------- ------- +FACILITY flag no facility word set present +FACILITY-EXT flag no facility extensions word set present + +</PRE> + +<P> + +<hr> +<A name=10.4> +<H2>10.4 Additional documentation requirements</H2> +</a> + + +<hr> +<A name=10.4.1> +<H3>10.4.1 System documentation</H3> +</a> + + +<hr> +<A name=10.4.1.1> +<H4>10.4.1.1 Implementation-defined options</H4> +</a> + +<UL> +<LI>encoding of keyboard events +(<a href=dpans10.htm#10.6.2.1305>10.6.2.1305</a> EKEY); +<LI>duration of a system clock tick; +<LI>repeatability to be expected from execution of +<a href=dpans10.htm#10.6.2.1905>10.6.2.1905</a> MS. +</UL> +<P> + + +<hr> +<A name=10.4.1.2> +<H4>10.4.1.2 Ambiguous conditions</H4> +</a> + +<UL> +<LI><a href=dpans10.htm#10.6.1.0742>10.6.1.0742</a> AT-XY +operation can't be performed on user output device. +</UL> +<P> + + +<hr> +<A name=10.4.1.3> +<H4>10.4.1.3 Other system documentation</H4> +</a> + +<UL> +<LI>no additional requirements. +</UL> +<P> + +<hr> +<A name=10.4.2> +<H3>10.4.2 Program documentation</H3> +</a> + + +<hr> +<A name=10.4.2.1> +<H4>10.4.2.1 Environmental dependencies</H4> +</a> + +<UL> +<LI>using more than seven bits of a character in +<a href=dpans10.htm#10.6.2.1305>10.6.2.1305</a> EKEY. +</UL> +<P> + + +<hr> +<A name=10.4.2.2> +<H4>10.4.2.2 Other program documentation</H4> +</a> + +<UL> +<LI>no additional requirements. +</UL> +<P> + +<hr> +<A name=10.5> +<H2>10.5 Compliance and labeling</H2> +</a> + + +<hr> +<A name=10.5.1> +<H3>10.5.1 ANS Forth systems</H3> +</a> + +The phrase <B>Providing the Facility word set</B> shall be appended to +the label of any Standard System that provides all of the Facility word +set. +<P> + +The phrase <B>Providing name(s) from the Facility Extensions word +set</B> shall be appended to the label of any Standard System that +provides portions of the Facility Extensions word set. +<P> + +The phrase <B>Providing the Facility Extensions word set</B> shall be +appended to the label of any Standard System that provides all of the +Facility and Facility Extensions word sets. +<P> + + +<hr> +<A name=10.5.2> +<H3>10.5.2 ANS Forth programs</H3> +</a> + +The phrase <B>Requiring the Facility word set</B> shall be appended to +the label of Standard Programs that require the system to provide the +Facility word set. +<P> + +The phrase <B>Requiring name(s) from the Facility Extensions word +set</B> shall be appended to the label of Standard Programs that require +the system to provide portions of the Facility Extensions word set. +<P> + +The phrase <B>Requiring the Facility Extensions word set</B> shall be +appended to the label of Standard Programs that require the system to +provide all of the Facility and Facility Extensions word sets. +<P> + + +<hr> +<A name=10.6> +<H2>10.6 Glossary</H2> +</a> + + +<hr> +<A name=10.6.1> +<H3>10.6.1 Facility words</H3> +</a> + + +<hr> +<A name=10.6.1.0742> +<code> +10.6.1.0742 <b>AT-XY</b> +</code> +</a> +<BR> +<B>at-x-y</B> FACILITY +<BR> +<pre> + ( u1 u2 -- ) +</pre> +<P> + +Perform implementation-dependent steps so that the next character +displayed will appear in column u1, row u2 of the user output device, +the upper left corner of which is column zero, row zero. An ambiguous +condition exists if the operation cannot be performed on the user output +device with the specified parameters. + +<p> +<code> +See: +<a href=dpansa10.htm#A.10.6.1.0742>A.10.6.1.0742 AT-XY</a> +</code> +<P> + +<hr> +<A name=10.6.1.1755> +<code> +10.6.1.1755 <b>KEY?</b> +</code> +</a> +<BR> +<B>key-question</B> FACILITY +<BR> +<pre> + ( -- flag ) +</pre> +<P> + +If a character is available, return true. Otherwise, return false. If +non-character keyboard events are available before the first valid +character, they are discarded and are subsequently unavailable. The +character shall be returned by the next execution of +<a href=dpans6.htm#6.1.1750>KEY</a>. +<P> + +After KEY? returns with a value of true, subsequent executions of KEY? +prior to the execution of KEY or +<a href=dpans10.htm#10.6.2.1305>EKEY</a> also return true, without +discarding keyboard events. + +<p> +<code> +See: +<a href=dpansa10.htm#A.10.6.1.1755>A.10.6.1.1755 KEY?</a> +</code> +<P> + + +<hr> +<A name=10.6.1.2005> +<code> +10.6.1.2005 <b>PAGE</b> +</code> +</a> +<BR> +FACILITY +<BR> +<pre> + ( -- ) +</pre> +<P> + +Move to another page for output. Actual function depends on the output +device. On a terminal, PAGE clears the screen and resets the cursor +position to the upper left corner. On a printer, PAGE performs a form +feed. +<P> + + + +<hr> +<A name=10.6.2> +<H3>10.6.2 Facility extension words</H3> +</a> + + +<hr> +<A name=10.6.2.1305> +<code> +10.6.2.1305 <b>EKEY</b> +</code> +</a> +<BR> + <B>e-key</B> FACILITY EXT +<BR> +<pre> + ( -- u ) +</pre> +<P> + +Receive one keyboard event u. The encoding of keyboard events is +implementation defined. +<P> + +<code> +See: +<A href=dpans10.htm#10.6.1.1755>10.6.1.1755 KEY?</a> , +<A href=dpans6.htm#6.1.1750>6.1.1750 KEY</a> , +<a href=dpansa10.htm#A.10.6.2.1305>A.10.6.2.1305 EKEY</a> +</code> +<P> + + + +<hr> +<A name=10.6.2.1306> +<code> +10.6.2.1306 <b>EKEY&gt;CHAR</b> +</code> +</a> +<BR> +<B>e-key-to-char</B> FACILITY EXT +<BR> +<pre> + ( u -- u false | char true ) +</pre> +<P> + +If the keyboard event u corresponds to a character in the +implementation-defined character set, return that character and true. +Otherwise return u and false. + + +<p> +<code> +See: +<a href=dpansa10.htm#A.10.6.2.1306>A.10.6.2.1306 EKEY&gt;CHAR</a> +</code> +<P> + + +<hr> +<A name=10.6.2.1307> +<code> +10.6.2.1307 <b>EKEY?</b> +</code> +</a> +<BR> +<B>e-key-question</B> FACILITY EXT +<BR> +<pre> + ( -- flag ) +</pre> +<P> + +If a keyboard event is available, return true. Otherwise return false. +The event shall be returned by the next execution of +<a href=dpans10.htm#10.6.2.1305>EKEY</a>. +<P> + +After EKEY? returns with a value of true, subsequent executions of EKEY? +prior to the execution of +<a href=dpans6.htm#6.1.1750>KEY</a>, +<a href=dpans10.htm#10.6.1.1755>KEY?</a> +or EKEY also return true, referring +to the same event. + +<P> + + +<hr> +<A name=10.6.2.1325> +<code> +10.6.2.1325 <b>EMIT?</b> +</code> +</a> +<BR> +<B>emit-question</B> FACILITY EXT +<BR> +<pre> + ( -- flag ) +</pre> +<P> + +flag is true if the user output device is ready to accept data and the +execution of +<a href=dpans6.htm#6.1.1320>EMIT</a> +in place of EMIT? would not have suffered an +indefinite delay. If the device status is indeterminate, flag is true. + +<p> +<code> +See: +<a href=dpansa10.htm#A.10.6.2.1325>A.10.6.2.1325 EMIT?</a> +</code> +<P> + + +<hr> +<A name=10.6.2.1905> +<code> +10.6.2.1905 <b>MS</b> +</code> +</a> +<BR> +FACILITY EXT +<BR> +<pre> + ( u -- ) +</pre> +<P> + +Wait at least u milliseconds. + +<p> +<b>Note:</b> The actual length and variability of the time period depends +upon the implementation-defined resolution of the system clock and +upon other system and computer characteristics beyond the scope of +this Standard. + + +<p> +<code> +See: +<a href=dpansa10.htm#A.10.6.2.1905>A.10.6.2.1905 MS</a> +</code> +<P> + + +<hr> +<A name=10.6.2.2292> +<code> +10.6.2.2292 <b>TIME&DATE</b> +</code> +</a> +<BR> +<B>time-and-date</B> FACILITY EXT +<BR> +<pre> + ( -- +n1 +n2 +n3 +n4 +n5 +n6 ) +</pre> +<P> + +Return the current time and date. +n1 is the second {0...59}, +n2 is +the minute {0...59}, +n3 is the hour {0...23}, +n4 is the day {1...31} ++n5 is the month {1...12}, and +n6 is the year (e.g., 1991). + +<p> +<code> +See: +<a href=dpansa10.htm#A.10.6.2.2292>A.10.6.2.2292 TIME&DATE</a> +</code> +<P> + + + +<hr> +<A href=dpans.htm#toc><IMG src="up.gif" ></A> Table of Contents +<BR> +<A href=dpans11.htm><IMG src="right.gif" ></A> +Next Section +<P> +</BODY> +</HTML> diff --git a/mwmouse/sources/AnsForth/DPANS11.HTM b/mwmouse/sources/AnsForth/DPANS11.HTM @@ -0,0 +1,1345 @@ +<HTML><HEAD> +<TITLE>DPANS94</TITLE> +<link disabled rel="stylesheet" href="mpexc6.css"> +<style>@import url(mpexc6.css);</style> +</head> + +<BODY> +<table width=100%> +<tr> +<td align=left> +<a href=dpans10.htm><img src=left.gif + width=26 height=26 align=ALIGN border=0></a> +<a href=dpans12.htm><img src=right.gif + width=26 height=26 align=ALIGN border=0></a> +</td> +<td align=right> +<a href=dpans.htm#toc><img src=up.gif + width=26 height=26 align=ALIGN border=0></a> +<a name=11.>Table of Contents</a> +</td> +</tr> +</table> +<p> +<hr size=4> + +<H1>11. The optional File-Access word set</H1> + +<p> +<code> +See: +<a href=dpansa11.htm#A.11>A.11</a> The optional File-Access word set +</code> +<p> + +<hr> +<A name=11.1> +<H2>11.1 Introduction</H2> +</a> + +These words provide access to mass storage in the form of <B>files</B> +under the following assumptions: + +<UL> +<LI>files are provided by a host operating system; +<LI>file names are represented as character strings; +<LI>the format of file names is determined by the host operating system; +<LI>an open file is identified by a single-cell file identifier (fileid); +<LI>file-state information (e.g., position, size) is managed by the +host operating system; +<LI>file contents are accessed as a sequence of characters; +<LI>file read operations return an actual transfer count, which can +differ from the requested transfer count. +</UL> + +<P> + +<hr> +<A name=11.2> +<H2>11.2 Additional terms</H2> +</a> + +<dl> +<dt><b>file-access method:</b> +<dd>A permissible means of accessing a file, such as <B>read/write</B> or <B>read only</B>. + +<dt><b>file position:</b> +<dd>The character offset from the start of the file. + +<dt><b>input file:</b> +<dd>The file, containing a sequence of lines, that is the input source. +</dl> + + +<hr> +<A name=11.3> +<H2>11.3 Additional usage requirements</H2> +</a> + + + +<hr> +<A name=11.3.1> +<H3>11.3.1 Data types</H3> +</a> + +Append table 11.1 to +<a href=dpans3.htm#table.3.1>table 3.1</a>. +<P> + +Table 11.1 - Data types +<P> + + + +<PRE> +Symbol Data type Size on stack +------ --------- ------------- +ior I/O results 1 cell +fam file access method 1 cell +fileid file identifiers 1 cell +</PRE> + +<P> + +<hr> +<A name=11.3.1.1> +<H4>11.3.1.1 File identifiers</H4> +</a> + +File identifiers are implementation-dependent single-cell values that +are passed to file operators to designate specific files. Opening a +file assigns a file identifier, which remains valid until closed. + + +<P> + +<hr> +<A name=11.3.1.2> +<H4>11.3.1.2 I/O results</H4> +</a> + +I/O results are single-cell numbers indicating the result of I/O +operations. A value of zero indicates that the I/O operation completed +successfully; other values and their meanings are +implementation-defined. Reaching the end of a file shall be reported as +zero. + +<P> + +An I/O exception in the execution of a File-Access word that can return +an I/O result shall not cause a +<a href=dpans9.htm#9.6.1.2275>THROW</a>; exception indications are +returned in the ior. + +<P> + +<hr> +<A name=11.3.1.3> +<H4>11.3.1.3 File access methods</H4> +</a> + +File access methods are implementation-defined single-cell +values. + +<P> + +<hr> +<A name=11.3.1.4> +<H4>11.3.1.4 File names</H4> +</a> + +A character string containing the name of the file. The file name may +include an implementation-dependent path name. The format of file names +is implementation defined. + +<P> + +<hr> +<A name=11.3.2> +<H3>11.3.2 Blocks in files</H3> +</a> + +If the File-Access word set is implemented, the +<a href=dpans7.htm>Block word set</a> shall be +implemented. + +<P> + +Blocks may, but need not, reside in files. When they do: +<P> + +<UL> +<LI>Block numbers may be mapped to one or more files by +implementation-defined means. An ambiguous condition exists if a +requested block number is not currently mapped; +<LI>An +<a href=dpans7.htm#7.6.1.2400>UPDATE</a>d +block that came from a file shall be transferred back +to the same file. +</UL> + +<p> +<code> +See: +<a href=dpansa11.htm#A.11.3.2>A.11.3.2</a> Blocks in files +</code> +<p> + + +<hr> +<A name=11.3.3> +<H3>11.3.3 Environmental queries</H3> +</a> + +Append table 11.2 to +table 3.5. + +<P> + +<code> +See: +<A href=dpans3.htm#3.2.6>3.2.6</a> Environmental queries +</code> +<P> + +Table 11.2 - Environmental query strings +<P> + + + +<PRE> +String Value data type Constant? Meaning +------ --------------- --------- ------- +FILE flag no file word set present +FILE-EXT flag no file extensions word set present +</PRE> + +<P> + +<hr> +<A name=11.3.4> +<H3>11.3.4 Input source</H3> +</a> + +The File-Access word set creates another input source for the text +interpreter. When the input source is a text file, +<a href=dpans7.htm#7.6.1.0790>BLK</a> shall contain +zero, +<a href=dpans6.htm#6.2.2218>SOURCE-ID</a> +shall contain the fileid of that text file, and the +input buffer shall contain one line of the text file. + +<P> + +Input with +<a href=dpans11.htm#11.6.1.1718>INCLUDED</a>, +<a href=dpans11.htm#11.6.1.1717>INCLUDE-FILE</a>, +<a href=dpans7.htm#7.6.1.1790>LOAD</a> and +<a href=dpans6.htm#6.1.1360>EVALUATE</a> shall be nestable +in any order to at least eight levels. + +<P> + +A program that uses more than eight levels of input-file nesting has an +environmental dependency. + +<P> + +<code> +See: +<A href=dpans3.htm#3.3.3.5>3.3.3.5</a> Input buffers, +<A href=dpans9.htm#9.>9.</a> Optional Exception word set. +</code> +<P> + + +<hr> +<A name=11.3.5> +<H3>11.3.5 Other transient regions</H3> +</a> + +The list of words using memory in transient regions is extended to +include <A href=dpans11.htm#11.6.1.2165>11.6.1.2165</a> S". + +<P> + +<code> +See: +<A href=dpans3.htm#3.3.3.6>3.3.3.6</a> Other transient regions +</code> +<P> + + +<P> + +<hr> +<A name=11.3.6> +<H3>11.3.6 Parsing</H3> +</a> + +When parsing from a text file using a space delimiter, control +characters shall be treated the same as the space character. + +<P> + +Lines of at least 128 characters shall be supported. A program that +requires lines of more than 128 characters has an environmental +dependency. + +<P> + +A program may reposition the parse area within the input buffer by +manipulating the contents of +<a href=dpans6.htm#6.1.0560>&gt;IN</a>. +More extensive repositioning can be +accomplished using +<a href=dpans6.htm#6.2.2182>SAVE-INPUT</a> and +<a href=dpans6.htm#6.2.2148>RESTORE-INPUT</a>. + +<P> + +<code> +See: +<A href=dpans3.htm#3.4.1>3.4.1</a> Parsing +</code> +<P> + +<hr> +<A name=11.4> +<H2>11.4 Additional documentation requirements</H2> +</a> + + +<hr> +<A name=11.4.1> +<H3>11.4.1 System documentation</H3> +</a> + + +<hr> +<A name=11.4.1.1> +<H4>11.4.1.1 Implementation-defined options</H4> +</a> + + +<UL> +<LI>file access methods used by +<a href=dpans11.htm#11.6.1.0765>11.6.1.0765</a> BIN, +<a href=dpans11.htm#11.6.1.1010>11.6.1.1010</a> CREATE-FILE, +<a href=dpans11.htm#11.6.1.1970>11.6.1.1970</a> OPEN-FILE, +<a href=dpans11.htm#11.6.1.2054>11.6.1.2054</a> R/O, +<a href=dpans11.htm#11.6.1.2056>11.6.1.2056</a> R/W, +and +<a href=dpans11.htm#11.6.1.2425>11.6.1.2425</a> W/O; +<LI>file exceptions; +<LI>file line terminator +(<a href=dpans11.htm#11.6.1.2090>11.6.1.2090</a> READ-LINE); +<LI>file name format +(<a href=dpans11.htm#11.3.1.4>11.3.1.4</a> File names); +<LI>Information returned by +<a href=dpans11.htm#11.6.2.1524>11.6.2.1524</a> FILE-STATUS; +<LI>Input file state after an exception +(<a href=dpans11.htm#11.6.1.1717>11.6.1.1717</a> INCLUDE-FILE, +<a href=dpans11.htm#11.6.1.1718>11.6.1.1718</a> INCLUDED); +<LI>ior values and meaning +(<a href=dpans11.htm#11.3.1.2>11.3.1.2</a> I/O results); +<LI>maximum depth of file input nesting +(<a href=dpans11.htm#11.3.4>11.3.4</a> Input source); +<LI>maximum size of input line +(<a href=dpans11.htm#11.3.6>11.3.6</a> Parsing); +<LI>methods for mapping block ranges to files +(<a href=dpans11.htm#11.3.2>11.3.2</a> Blocks in files); +<LI>number of string buffers provided +(<a href=dpans11.htm#11.6.1.2165>11.6.1.2165</a> S"); +<LI>size of string buffer used by +<a href=dpans11.htm#11.6.1.2165>11.6.1.2165</a> S". +</UL> + + +<hr> +<A name=11.4.1.2> +<H4>11.4.1.2 Ambiguous conditions</H4> +</a> + +<UL> +<LI>attempting to position a file outside its boundaries +(<a href=dpans11.htm#11.6.1.2142>11.6.1.2142</a> REPOSITION-FILE); +<LI>attempting to read from file positions not yet written +(<a href=dpans11.htm#11.6.1.2080>11.6.1.2080</a> READ-FILE, +<a href=dpans11.htm#11.6.1.2090>11.6.1.2090</a> READ-LINE); +<LI>fileid is invalid +(<a href=dpans11.htm#11.6.1.1717>11.6.1.1717</a> INCLUDE-FILE); +<LI>I/O exception reading or closing fileid +(<a href=dpans11.htm#11.6.1.1717>11.6.1.1717</a> INCLUDE-FILE, +<a href=dpans11.htm#11.6.1.1718>11.6.1.1718</a> INCLUDED); +<LI>named file cannot be opened +(<a href=dpans11.htm#11.6.1.1718>11.6.1.1718</a> INCLUDED); +<LI>requesting an unmapped block number +(<a href=dpans11.htm#11.3.2>11.3.2</a> Blocks in files); +<LI>using +<a href=dpans11.htm#11.6.1.2218>11.6.1.2218</a> SOURCE-ID when +<a href=dpans7.htm#7.6.1.0790>7.6.1.0790</a> BLK is not zero. +</ul> + +<hr> +<A name=11.4.3> +<h4>11.4.1.3 Other system documentation</h4> +</a> +<ul> +<LI>no additional requirements. +</UL> + +<hr> +<A name=11.4.2> +<H3>11.4.2 Program documentation</H3> +</a> + + +<hr> +<A name=11.4.2.1> +<H4>11.4.2.1 Environmental dependencies</H4> +</a> + +<UL> +<LI>requiring lines longer than 128 characters +(<a href=dpans11.htm#11.3.6>11.3.6</a> Parsing); +<LI>using more than eight levels of input-file nesting +(<a href=dpans11.htm#11.3.4>11.3.4</a> Input source). +</UL> + +<P> + +<hr> +<A name=11.4.2.2> +<H4>11.4.2.2 Other program documentation</H4> +</a> + +<UL> +<LI>no additional requirements. +</ul> + + +<hr> +<A name=11.5> +<h2>11.5 Compliance and labeling</h2> +</a> + + +<hr> +<A name=11.5.1> +<H3>11.5.1 ANS Forth systems</H3> +</a> + +The phrase <B>Providing the File Access word set</B> shall be appended +to the label of any Standard System that provides all of the File Access +word set. + +<P> + +The phrase <B>Providing name(s) from the File Access Extensions word +set</B> shall be appended to the label of any Standard System that +provides portions of the File Access Extensions word set. + +<P> + +The phrase <B>Providing the File Access Extensions word set</B> shall be +appended to the label of any Standard System that provides all of the +File Access and File Access Extensions word sets. + + +<P> + +<hr> +<A name=11.5.2> +<H3>11.5.2 ANS Forth programs</H3> +</a> + +The phrase <B>Requiring the File Access word set</B> shall be appended +to the label of Standard Programs that require the system to provide the +File Access word set. + +<P> + +The phrase <B>Requiring name(s) from the File Access Extensions word +set</B> shall be appended to the label of Standard Programs that require +the system to provide portions of the File Access Extensions word set. + +<P> + +The phrase <B>Requiring the File Access Extensions word set</B> shall be +appended to the label of Standard Programs that require the system to +provide all of the File Access and File Access Extensions word sets. + +<P> + +<hr> +<A name=11.6> +<H2>11.6 Glossary</H2> +</a> + + +<hr> +<A name=11.6.1> +<H3>11.6.1 File Access words</H3> +</a> + + +<hr> +<A name=11.6.1.0080> +<code> +11.6.1.0080 <b>(</b> +</code> +</a> +<BR> +<B>paren</B> FILE +<BR> +<pre> + ( <B>"ccc&lt;paren&gt;"</B> -- ) +</pre> +<P> + +Extend the semantics of +<A href=dpans6.htm#6.1.0080>6.1.0080</a> ( to include: +<P> + +When parsing from a text file, if the end of the parse area is reached +before a right parenthesis is found, refill the input buffer from the +next line of the file, set +<A href=dpans6.htm#6.1.0560>&gt;IN</a> +to zero, and resume parsing, repeating +this process until either a right parenthesis is found or the end of the +file is reached. + +<P> + +<hr> +<A name=11.6.1.0765> +<code> +11.6.1.0765 <b>BIN</b> +</code> +</a> +<BR> +FILE +<BR> +<pre> + ( fam1 -- fam2 ) +</pre> +<P> + +Modify the implementation-defined file access method fam1 to +additionally select a <B>binary</B>, i.e., not line oriented, file +access method, giving access method fam2. +<p> + +<code> +See: +<a href=dpansa11.htm#A.11.6.1.0765>A.11.6.1.0765 BIN</a> , +<A href=dpans11.htm#11.6.1.2054>11.6.1.2054 R/O</a> , +<A href=dpans11.htm#11.6.1.2056>11.6.1.2056 R/W</a> , +<A href=dpans11.htm#11.6.1.2425>11.6.1.2425 W/O</a> +</code> + +<P> + +<hr> +<A name=11.6.1.0900> +<code> +11.6.1.0900 <b>CLOSE-FILE</b> +</code> +</a> +<BR> +FILE +<BR> +<pre> + ( fileid -- ior ) +</pre> +<P> + +Close the file identified by fileid. ior is the implementation-defined +I/O result code. + +<P> + +<hr> +<A name=11.6.1.1010> +<code> +11.6.1.1010 <b>CREATE-FILE</b> +</code> +</a> +<BR> +FILE +<BR> +<pre> + ( c-addr u fam -- fileid ior ) +</pre> +<P> + +Create the file named in the character string specified by c-addr and u, +and open it with file access method fam. The meaning of values of fam +is implementation defined. If a file with the same name already exists, +recreate it as an empty file. + +<P> + +If the file was successfully created and opened, ior is zero, fileid is +its identifier, and the file has been positioned to the start of the +file. + +<P> + +Otherwise, ior is the implementation-defined I/O result code and fileid +is undefined. + +<p> +<code> +See: +<a href=dpansa11.htm#A.11.6.1.1010>A.11.6.1.1010 CREATE-FILE</a> +</code> +<p> + + +<hr> +<A name=11.6.1.1190> +<code> +11.6.1.1190 <b>DELETE-FILE</b> +</code> +</a> +<BR> +FILE +<BR> +<pre> + ( c-addr u -- ior ) +</pre> +<P> + +Delete the file named in the character string specified by c-addr u. +ior is the implementation-defined I/O result code. + +<P> + +<hr> +<A name=11.6.1.1520> +<code> +11.6.1.1520 <b>FILE-POSITION</b> +</code> +</a> +<BR> +FILE +<BR> +<pre> + ( fileid -- ud ior ) +</pre> +<P> + +ud is the current file position for the file identified by fileid. ior +is the implementation-defined I/O result code. ud is undefined if ior +is non-zero. + +<P> + +<hr> +<A name=11.6.1.1522> +<code> +11.6.1.1522 <b>FILE-SIZE</b> +</code> +</a> +<BR> +FILE +<BR> +<pre> + ( fileid -- ud ior ) +</pre> +<P> + +ud is the size, in characters, of the file identified by fileid. ior is +the implementation-defined I/O result code. This operation does not +affect the value returned by +<A href=dpans11.htm#11.6.1.1520>FILE-POSITION</a>. +ud is undefined if ior is +non-zero. + +<P> + +<hr> +<A name=11.6.1.1717> +<code> +11.6.1.1717 <b>INCLUDE-FILE</b> +</code> +</a> +<BR> +FILE +<BR> +<pre> + ( i*x fileid -- j*x ) +</pre> +<P> + +Remove fileid from the stack. Save the current input source +specification, including the current value of +<A href=dpans6.htm#6.2.2218>SOURCE-ID</a>. Store fileid +in SOURCE-ID. Make the file specified by fileid the input source. +Store zero in +<A href=dpans7.htm#7.6.1.0790>BLK</a>. +Other stack effects are due to the words included. + +<P> + +Repeat until end of file: read a line from the file, fill the input +buffer from the contents of that line, set +<A href=dpans6.htm#6.1.0560>&gt;IN</a> to zero, and interpret. + +<P> + +Text interpretation begins at the file position where the next file read +would occur. + +<P> + +When the end of the file is reached, close the file and restore the +input source specification to its saved value. + +<P> + +An ambiguous condition exists if fileid is invalid, if there is an I/O +exception reading fileid, or if an I/O exception occurs while closing +fileid. When an ambiguous condition exists, the status (open or closed) +of any files that were being interpreted is implementation-defined. +<P> + +<code> +See: +<A href=dpans11.htm#11.3.4>11.3.4</a> Input source, +<a href=dpansa11.htm#A.11.6.1.1717>A.11.6.1.1717 INCLUDE-FILE</a> +</code> +<p> + + +<hr> +<A name=11.6.1.1718> +<code> +11.6.1.1718 <b>INCLUDED</b> +</code> +</a> +<BR> +FILE +<BR> +<pre> + ( i*x c-addr u -- j*x ) +</pre> +<P> + +Remove c-addr u from the stack. Save the current input source +specification, including the current value of +<A href=dpans6.htm#6.2.2218>SOURCE-ID</a>. Open the file +specified by c-addr u, store the resulting fileid in SOURCE-ID, and make +it the input source. Store zero in +<A href=dpans7.htm#7.6.1.0790>BLK</a>. Other stack effects are due to +the words included. + +<P> + +Repeat until end of file: read a line from the file, fill the input +buffer from the contents of that line, set +<A href=dpans6.htm#6.1.0560>&gt;IN</a> to zero, and interpret. + +<P> + +Text interpretation begins at the file position where the next file read +would occur. + +<P> + +When the end of the file is reached, close the file and restore the +input source specification to its saved value. + +<P> + +An ambiguous condition exists if the named file can not be opened, if an +I/O exception occurs reading the file, or if an I/O exception occurs +while closing the file. When an ambiguous condition exists, the status +(open or closed) of any files that were being interpreted is +implementation-defined. + +<P> + +<code> +See: +<a href=dpansa11.htm#A.11.6.1.1718>A.11.6.1.1718 INCLUDED</a> , +<A href=dpans11.htm#11.6.1.1717>11.6.1.1717 INCLUDE-FILE</a> +</code> + +<P> + +<hr> +<A name=11.6.1.1970> +<code> +11.6.1.1970 <b>OPEN-FILE</b> +</code> +</a> +<BR> +FILE +<BR> +<pre> + ( c-addr u fam -- fileid ior ) +</pre> +<P> + +Open the file named in the character string specified by c-addr u, with +file access method indicated by fam. The meaning of values of fam is +implementation defined. + +<P> + +If the file is successfully opened, ior is zero, fileid is its +identifier, and the file has been positioned to the start of the file. + +<P> + +Otherwise, ior is the implementation-defined I/O result code and fileid +is undefined. + +<p> +<code> +See: +<a href=dpansa11.htm#A.11.6.1.1970>A.11.6.1.1970 OPEN-FILE</a> +</code> +<p> + + +<hr> +<A name=11.6.1.2054> +<code> +11.6.1.2054 <b>R/O</b> +</code> +</a> +<BR> +<B>r-o</B> FILE +<BR> +<pre> + ( -- fam ) +</pre> +<P> + +fam is the implementation-defined value for selecting the <B>read +only</B> file access method. +<p> + +<code> +See: +<A href=dpans11.htm#11.6.1.1010>11.6.1.1010 CREATE-FILE</a> , +<A href=dpans11.htm#11.6.1.1970>11.6.1.1970 OPEN-FILE</a> +</code> + +<P> + +<hr> +<A name=11.6.1.2056> +<code> +11.6.1.2056 <b>R/W</b> +</code> +</a> +<BR> +<B>r-w</B> FILE +<BR> +<pre> + ( -- fam ) +</pre> +<P> + +fam is the implementation-defined value for selecting the +<B>read/write</B> file access method. +<p> + +<code> +See: +<A href=dpans11.htm#11.6.1.1010>11.6.1.1010 CREATE-FILE</a> , +<A href=dpans11.htm#11.6.1.1970>11.6.1.1970 OPEN-FILE</a> +</code> + +<P> + +<hr> +<A name=11.6.1.2080> +<code> +11.6.1.2080 <b>READ-FILE</b> +</code> +</a> +<BR> +FILE +<BR> +<pre> + ( c-addr u1 fileid -- u2 ior ) +</pre> +<P> + +Read u1 consecutive characters to c-addr from the current position of +the file identified by fileid. + +<P> + +If u1 characters are read without an exception, ior is zero and u2 is +equal to u1. + +<P> + +If the end of the file is reached before u1 characters are read, ior is +zero and u2 is the number of characters actually read. + +<P> + +If the operation is initiated when the value returned by +<A href=dpans11.htm#11.6.1.1520>FILE-POSITION</a> +is equal to the value returned by +<A href=dpans11.htm#11.6.1.1522>FILE-SIZE</a> for the file identified by +fileid, ior is zero and u2 is zero. + +<P> + +If an exception occurs, ior is the implementation-defined I/O result +code, and u2 is the number of characters transferred to c-addr without +an exception. + +<P> + +An ambiguous condition exists if the operation is initiated when the +value returned by FILE-POSITION is greater than the value returned by +FILE-SIZE for the file identified by fileid, or if the requested +operation attempts to read portions of the file not written. + +<P> + +At the conclusion of the operation, FILE-POSITION returns the next file +position after the last character read. + +<p> +<code> +See: +<a href=dpansa11.htm#A.11.6.1.2080>A.11.6.1.2080 READ-FILE</a> +</code> +<p> + + +<hr> +<A name=11.6.1.2090> +<code> +11.6.1.2090 <b>READ-LINE</b> +</code> +</a> +<BR> +FILE +<BR> +<pre> + ( c-addr u1 fileid -- u2 flag ior ) +</pre> +<P> + +Read the next line from the file specified by fileid into memory at the +address c-addr. At most u1 characters are read. Up to two +implementation-defined line-terminating characters may be read into +memory at the end of the line, but are not included in the count u2. +The line buffer provided by c-addr should be at least u1+2 characters +long. + +<P> + +If the operation succeeded, flag is true and ior is zero. If a line +terminator was received before u1 characters were read, then u2 is the +number of characters, not including the line terminator, actually read +(0 &lt;= u2 &lt;= u1). When u1 = u2, the line terminator has yet to be +reached. + +<P> + +If the operation is initiated when the value returned by +<A href=dpans11.htm#11.6.1.1520>FILE-POSITION</a> +is equal to the value returned by +<A href=dpans11.htm#11.6.1.1522>FILE-SIZE</a> for the file identified by +fileid, flag is false, ior is zero, and u2 is zero. If ior is non-zero, +an exception occurred during the operation and ior is the +implementation-defined I/O result code. + +<P> + +An ambiguous condition exists if the operation is initiated when the +value returned by FILE-POSITION is greater than the value returned by +FILE-SIZE for the file identified by fileid, or if the requested +operation attempts to read portions of the file not written. + +<P> + +At the conclusion of the operation, FILE-POSITION returns the next file +position after the last character read. + +<p> +<code> +See: +<a href=dpansa11.htm#A.11.6.1.2090>A.11.6.1.2090 READ-LINE</a> , +<a href=a0001.htm>RFI 0001</a>. +</code> +<p> + + +<hr> +<A name=11.6.1.2142> +<code> +11.6.1.2142 <b>REPOSITION-FILE</b> +</code> +</a> +<BR> +FILE +<BR> +<pre> + ( ud fileid -- ior ) +</pre> +<P> + +Reposition the file identified by fileid to ud. ior is the +implementation-defined I/O result code. An ambiguous condition exists +if the file is positioned outside the file boundaries. + +<P> + +At the conclusion of the operation, +<A href=dpans11.htm#11.6.1.1520>FILE-POSITION</a> returns the +value ud. + +<P> + +<hr> +<A name=11.6.1.2147> +<code> +11.6.1.2147 <b>RESIZE-FILE</b> +</code> +</a> +<BR> +FILE +<BR> +<pre> + ( ud fileid -- ior ) +</pre> +<P> + +Set the size of the file identified by fileid to ud. ior is the +implementation-defined I/O result code. + +<P> + +If the resultant file is larger than the file before the operation, the +portion of the file added as a result of the operation might not have +been written. + +<P> + +At the conclusion of the operation, +<A href=dpans11.htm#11.6.1.1522>FILE-SIZE</a> returns the value ud and +<A href=dpans11.htm#11.6.1.1520>FILE-POSITION</a> +returns an unspecified value. +<p> + +<code> +See: +<A href=dpans11.htm#11.6.1.2080>11.6.1.2080 READ-FILE</a> , +<A href=dpans11.htm#11.6.1.2090>11.6.1.2090 READ-LINE</a> +</code> + +<P> + +<hr> +<A name=11.6.1.2165> +<code> +11.6.1.2165 <b>S"</b> +</code> +</a> +<BR> +<B>s-quote</B> FILE +<BR> +<P> + +Extend the semantics of +<A href=dpans6.htm#6.1.2165>6.1.2165</a> S" to be: + +<PRE> + Interpretation: ( <B>"ccc&lt;quote&gt;"</B> -- c-addr u ) +</PRE> +<P> + +Parse ccc delimited by " (double quote). Store the resulting string +c-addr u at a temporary location. The maximum length of the temporary +buffer is implementation-dependent but shall be no less than 80 +characters. Subsequent uses of S" may overwrite the temporary buffer. +At least one such buffer shall be provided. + + +<PRE> + Compilation: ( <B>"ccc&lt;quote&gt;"</B> -- ) +</PRE> + +<P> + +Parse ccc delimited by " (double quote). Append the run-time semantics +given below to the current definition. + +<PRE> + Run-time: ( -- c-addr u ) +</PRE> +<P> + +Return c-addr and u that describe a string consisting of the characters +ccc. + +<P> + +<code> +See: +<A href=dpans3.htm#3.4.1>3.4.1</a> Parsing, +<A href=dpans6.htm#6.2.0855>6.2.0855 C"</a> , +<a href=dpansa11.htm#A.11.6.1.2165>A.11.6.1.2165 S"</a> , +<A href=dpans11.htm#11.3.5>11.3.5</a> Other transient regions. +</code> + +<P> + +<hr> +<A name=11.6.1.2218> +<code> +11.6.1.2218 <b>SOURCE-ID</b> +</code> +</a> +<BR> +<B>source-i-d</B> FILE +<BR> +<pre> + ( -- 0 | -1 | fileid ) +</pre> +<P> + +Extend +<A href=dpans6.htm#6.2.2218>6.2.2218</a> +SOURCE-ID to include text-file input as follows: + + +<PRE> +SOURCE-ID Input source +--------- ------------ +fileid Text file <B>fileid</B> +-1 String (via <A href=dpans6.htm#6.1.1360>EVALUATE</a>) +0 User input device +</PRE> +<P> + +An ambiguous condition exists if SOURCE-ID is used when +<A href=dpans7.htm#7.6.1.0790>BLK</a> contains a +non-zero value. + +<P> + +<hr> +<A name=11.6.1.2425> +<code> +11.6.1.2425 <b>W/O</b> +</code> +</a> +<BR> +<B>w-o</B> FILE +<BR> +<pre> + ( -- fam ) +</pre> +<P> + +fam is the implementation-defined value for selecting the <B>write +only</B> file access method. +<p> + +<code> +See: +<A href=dpans11.htm#11.6.1.1010>11.6.1.1010 CREATE-FILE</a> , +<A href=dpans11.htm#11.6.1.1970>11.6.1.1970 OPEN-FILE</a> +</code> + +<P> + +<hr> +<A name=11.6.1.2480> +<code> +11.6.1.2480 <b>WRITE-FILE</b> +</code> +</a> +<BR> +FILE +<BR> +<pre> + ( c-addr u fileid -- ior ) +</pre> +<P> + +Write u characters from c-addr to the file identified by fileid starting +at its current position. ior is the implementation-defined I/O result +code. + +<P> + +At the conclusion of the operation, +<A href=dpans11.htm#11.6.1.1520>FILE-POSITION</a> returns the next file +position after the last character written to the file, and +<A href=dpans11.htm#11.6.1.1522>FILE-SIZE</a> +returns a value greater than or equal to the value returned by +FILE-POSITION. +<p> + +<code> +See: +<A href=dpans11.htm#11.6.1.2080>11.6.1.2080 READ-FILE</a> , +<A href=dpans11.htm#11.6.1.2090>11.6.1.2090 READ-LINE</a> +</code> + +<P> + +<hr> +<A name=11.6.1.2485> +<code> +11.6.1.2485 <b>WRITE-LINE</b> +</code> +</a> +<BR> +FILE +<BR> +<pre> + ( c-addr u fileid -- ior ) +</pre> +<P> + +Write u characters from c-addr followed by the implementation-dependent +line terminator to the file identified by fileid starting at its current +position. ior is the implementation-defined I/O result code. + +<P> + +At the conclusion of the operation, +<A href=dpans11.htm#11.6.1.1520>FILE-POSITION</a> returns the next file +position after the last character written to the file, and +<A href=dpans11.htm#11.6.1.1522>FILE-SIZE</a> +returns a value greater than or equal to the value returned by +FILE-POSITION. +<p> + +<code> +See: +<A href=dpans11.htm#11.6.1.2080>11.6.1.2080 READ-FILE</a> , +<A href=dpans11.htm#11.6.1.2090>11.6.1.2090 READ-LINE</a> +</code> + +<P> + +<hr> +<a name=11.6.2> +<H3>11.6.2 File-Access extension words</H3> +</a> + + +<hr> +<A name=11.6.2.1524> +<code> +11.6.2.1524 <b>FILE-STATUS</b> +</code> +</a> +<BR> +FILE EXT +<BR> +<pre> + ( c-addr u -- x ior ) +</pre> +<P> + +Return the status of the file identified by the character string c-addr +u. If the file exists, ior is zero; otherwise ior is the +implementation-defined I/O result code. x contains +implementation-defined information about the file. + +<P> + +<hr> +<A name=11.6.2.1560> +<code> +11.6.2.1560 <b>FLUSH-FILE</b> +</code> +</a> +<BR> +FILE EXT +<BR> +<pre> + ( fileid -- ior ) +</pre> +<P> + +Attempt to force any buffered information written to the file referred +to by fileid to be written to mass storage, and the size information for +the file to be recorded in the storage directory if changed. If the +operation is successful, ior is zero. Otherwise, it is an +implementation-defined I/O result code. + + +<P> + +<hr> +<A name=11.6.2.2125> +<code> +11.6.2.2125 <b>REFILL</b> +</code> +</a> +<BR> +FILE EXT +<BR> +<pre> + ( -- flag ) +</pre> +<P> + +Extend the execution semantics of +<A href=dpans6.htm#6.2.2125>6.2.2125</a> REFILL with the +following: + +<P> + +When the input source is a text file, attempt to read the next line from +the text-input file. If successful, make the result the current input +buffer, set +<A href=dpans6.htm#6.1.0560>&gt;IN</a> +to zero, and return true. Otherwise return false. +<P> + +<code> +See: +<A href=dpans7.htm#7.6.2.2125>7.6.2.2125 REFILL</a> +</code> +<P> + +<hr> +<A name=11.6.2.2130> +<code> +11.6.2.2130 <b>RENAME-FILE</b> +</code> +</a> +<BR> +FILE EXT +<BR> +<pre> + ( c-addr1 u1 c-addr2 u2 -- ior ) +</pre> +<P> + +Rename the file named by the character string c-addr1 u1 to the name in +the character string c-addr2 u2. ior is the implementation-defined I/O +result code. + + +<hr> +<A href=dpans.htm#toc><IMG src="up.gif" ></A> Table of Contents +<BR> +<A href=dpans12.htm><IMG src="right.gif" ></A> +Next Section +<P> +</BODY> +</HTML> + diff --git a/mwmouse/sources/AnsForth/DPANS12.HTM b/mwmouse/sources/AnsForth/DPANS12.HTM @@ -0,0 +1,2397 @@ +<HTML><HEAD> +<TITLE>DPANS94</TITLE> +<link disabled rel="stylesheet" href="mpexc6.css"> +<style>@import url(mpexc6.css);</style> +</head> + +<BODY> +<table width=100%> +<tr> +<td align=left> +<a href=dpans11.htm><img src=left.gif + width=26 height=26 align=ALIGN border=0></a> +<a href=dpans13.htm><img src=right.gif + width=26 height=26 align=ALIGN border=0></a> +</td> +<td align=right> +<a href=dpans.htm#toc><img src=up.gif + width=26 height=26 align=ALIGN border=0></a> +<a name=12.>Table of Contents</a> +</td> +</tr> +</table> +<p> +<hr size=4> + +<H1>12. The optional Floating-Point word set</H1> + +<hr> +<A name=12.1> +<H2>12.1 Introduction</H2> +</a> + +<p> +<code> +See: +<a href=dpansa12.htm#A.12>A.12</a> The optional Floating-Point word set +</code> +<p> + +<hr> +<A name=12.2> +<H2>12.2 Additional terms and notation</H2> +</a> + + +<hr> +<A name=12.2.1> +<H3>12.2.1 Definition of terms</H3> +</a> + + +<DL> +<DT><B>float-aligned address:</B> +<DD>The address of a memory location at which a +floating-point number can be accessed. + +<DT><B>double-float-aligned address:</B> +<DD>The address of a memory location at which +a 64-bit IEEE double-precision floating-point number can be accessed. + +<DT><B>single-float-aligned address:</B> +<DD>The address of a memory location at which +a 32-bit IEEE single-precision floating-point number can be accessed. + +<DT><B>IEEE floating-point number:</B> +<DD>A single- or double-precision floating-point +number as defined in ANSI/IEEE 754-1985.</DL> + + +<P> + +<hr> +<A name=12.2.2> +<H3>12.2.2 Notation</H3> +</a> + + +<hr> +<A name=12.2.2.1> +<H4>12.2.2.1 Numeric notation</H4> +</a> + +The following notation is used to define the syntax of the external +representation of floating-point numbers: + +<UL> +<LI>Each component of a floating-point number is defined with a rule +consisting of the name of the component (italicized in angle-brackets, +e.g.,<I>&lt;sign&gt;</I> characters := and a concatenation of tokens and +metacharacters; +<LI>Tokens may be literal characters (in bold face, e.g.,<B>E</B>) or rule +names in angle brackets (e.g.,&lt;digit&gt;); +<LI>The metacharacter * is used to specify zero or more occurrences +of the preceding token (e.g.,&lt;digit&gt;*); +<LI>Tokens enclosed with [ and ] are optional (e.g.,[&lt;sign&gt;]); +<LI>Vertical bars separate choices from a list of tokens enclosed +with braces (e.g.,{ + | - }). +</UL> + +<P> + +<hr> +<A name=12.2.2.2> +<H4>12.2.2.2 Stack notation</H4> +</a> + +Floating-point stack notation when the floating-point stack is separate +from the data stack is: +<P> + +( F: before -- after ) +<P> + + +<hr> +<A name=12.3> +<H2>12.3 Additional usage requirements</H2> +</a> + + +<hr> +<A name=12.3.1> +<H3>12.3.1 Data types</H3> +</a> + +Append table 12.1 to +<a href=dpans3.htm#table.3.1>table 3.1</a>. + +<P> + +Table 12.1 - Data Types +<P> + + + +<PRE> +Symbol Data type Size on stack +------ --------- ------------- +r floating-point number implementation-defined +f-addr float-aligned address 1 cell +sf-addr single-float-aligned address 1 cell +df-addr double-float-aligned address 1 cell +</PRE> + + +<P> + +<hr> +<A name=12.3.1.1> +<H4>12.3.1.1 Addresses</H4> +</a> + +The set of float-aligned addresses is an implementation-defined subset +of the set of aligned addresses. Adding the size of a floating-point +number to a float-aligned address shall produce a float-aligned address. + +<P> + +The set of double-float-aligned addresses is an implementation-defined +subset of the set of aligned addresses. Adding the size of a 64-bit +IEEE double-precision floating-point number to a double-float-aligned +address shall produce a double-float-aligned address. + +<P> + +The set of single-float-aligned addresses is an implementation-defined +subset of the set of aligned addresses. Adding the size of a 32-bit +IEEE single-precision floating-point number to a single-float-aligned +address shall produce a single-float-aligned address. + +<P> + +<hr> +<A name=12.3.1.2> +<H4>12.3.1.2 Floating-point numbers</H4> +</a> + +The internal representation of a floating-point number, including the +format and precision of the significand and the format and range of the +exponent, is implementation defined. + +<P> + +Any rounding or truncation of floating-point numbers is implementation +defined. + +<P> + +<hr> +<A name=12.3.2> +<H3>12.3.2 Floating-point operations</H3> +</a> + +<B>Round to nearest</B> means round the result of a floating-point +operation to the representable value nearest the result. If the two +nearest representable values are equally near the result, the one having +zero as its least significant bit shall be delivered. + +<P> + +<B>Round toward negative infinity</B> means round the result of a +floating-point operation to the representable value nearest to and no +greater than the result. + +<P> + +<hr> +<A name=12.3.3> +<H3>12.3.3 Floating-point stack</H3> +</a> + +A last in, first out list that shall be used by all floating-point +operators. + +<P> + +The width of the floating-point stack is implementation-defined. By +default the floating-point stack shall be separate from the data and +return stacks. A program may determine whether floating-point numbers +are kept on the data stack by passing the string +<a href=dpans12.htm#12.3.4>FLOATING-STACK</a> +to +<a href=dpans6.htm#6.1.1345>ENVIRONMENT?</a>. + +<P> + +The size +of a floating-point stack shall be at least 6 items. + +<P> + +A program that depends on the floating-point stack being larger than six +items has an environmental dependency. + +<P> + +<hr> +<A name=12.3.4> +<H3>12.3.4 Environmental queries</H3> +</a> + +Append table 12.2 to +table 3.5. + +<P> + +<code> +See: +<A href=dpans3.htm#3.2.6>3.2.6</a> Environmental queries +</code> +<P> + +Table 12.2 - Environmental query strings +<P> + + + +<PRE> +String Value data type Constant? Meaning +------ --------------- --------- ------- +FLOATING flag no floating-point word set present +FLOATING-EXT flag no floating-point extensions word set present +FLOATING-STACK n yes If n = zero, floating-point numbers are + kept on the data stack; otherwise n is + the maximum depth of the separate + floating-point stack. +MAX-FLOAT r yes largest usable floating-point number + +</PRE> + +<P> + +<hr> +<A name=12.3.5> +<H3>12.3.5 Address alignment</H3> +</a> + +Since the address returned by a +<a href=dpans6.htm#6.1.1000>CREATE</a>d word is not necessarily aligned +for any particular class of floating-point data, a program shall align +the address (to be float aligned, single-float aligned, or double-float +aligned) before accessing floating-point data at the address. + +<P> + +<code> +See: +<A href=dpans3.htm#3.3.3.1>3.3.3.1</a> Address alignment, +<a href=dpansa12.htm#A.12.3.5>A.12.3.5</a> Address alignment, +<A href=dpans12.htm#12.3.1.1>12.3.1.1</a> Addresses. +</code> +<P> + +<hr> +<A name=12.3.6> +<H3>12.3.6 Variables</H3> +</a> + +A program may address memory in data space regions made available by +<a href=dpans12.htm#12.6.1.1630>FVARIABLE</a>. +These regions may be non-contiguous with regions +subsequently allocated with , +(<a href=dpans6.htm#6.1.0150>comma</a>) or +<a href=dpans6.htm#6.1.0710>ALLOT</a>. + +<P> + +<code> +See: +<A href=dpans3.htm#3.3.3.3>3.3.3.3</a> Variables +</code> +<P> + + +<hr> +<A name=12.3.7> +<H3>12.3.7 Text interpreter input number conversion</H3> +</a> + +If the Floating-Point word set is present in the dictionary and the +current base is +<a href=dpans6.htm#6.1.1170>DECIMAL</a>, +the input number-conversion algorithm shall be +extended to recognize floating-point numbers in this form: + +<P> + +Convertible string := &lt;significand&gt;&lt;exponent&gt; + + +<PRE> +&lt;significand&gt; := [&lt;sign&gt;]&lt;digits&gt;[.&lt;digits0&gt;] +&lt;exponent&gt; := E[&lt;sign&gt;]&lt;digits0&gt; +&lt;sign&gt; := { + | - } +&lt;digits&gt; := &lt;digit&gt;&lt;digits0&gt; +&lt;digits0&gt; := &lt;digit&gt;* +&lt;digit&gt; := { 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 } +</PRE> +<P> + +These are examples of valid representations of floating-point numbers in +program source: + +<PRE> + 1E 1.E 1.E0 +1.23E-1 -1.23E+1 +</PRE> +<P> + +<code> +See: +<A href=dpans3.htm#3.4.1.3>3.4.1.3</a> Text interpreter input number +conversion, +<a href=dpansa12.htm#A.12.3.7>A.12.3.7</a> Text interpreter input number conversion, +<A href=dpans12.htm#12.6.1.0558>12.6.1.0558 &gt;FLOAT</a> +</code> + +<P> + +<hr> +<A name=12.4> +<H2>12.4 Additional documentation requirements</H2> +</a> + + +<hr> +<A name=12.4.1> +<H3>12.4.1 System documentation</H3> +</a> + + +<hr> +<A name=12.4.1.1> +<H4>12.4.1.1 Implementation-defined options</H4> +</a> + + +<UL> +<LI>format and range of floating-point numbers +(<a href=dpans12.htm#12.3.1>12.3.1</a> Data types, +<a href=dpans12.htm#12.6.1.2143>12.6.1.2143</a> REPRESENT); +<LI>results of +<a href=dpans12.htm#12.6.1.2143>12.6.1.2143</a> REPRESENT +when float is out of range; +<LI>rounding or truncation of floating-point numbers +(<a href=dpans12.htm#12.3.1.2>12.3.1.2</a> +Floating-point numbers); +<LI>size of floating-point stack +(<a href=dpans12.htm#12.3.3>12.3.3</a> Floating-point stack); +<LI>width of floating-point stack +(<a href=dpans12.htm#12.3.3>12.3.3</a> Floating-point stack). +</UL> + +<P> + +<hr> +<A name=12.4.1.2> +<H4>12.4.1.2 Ambiguous conditions</H4> +</a> +<P> + +<UL> +<LI> +<a href=dpans12.htm#12.6.2.1204>DF@</a> or +<a href=dpans12.htm#12.6.2.1203>DF!</a> is +used with an address that is not double-float aligned; +<LI> +<a href=dpans12.htm#12.6.1.1472>F@</a> or +<a href=dpans12.htm#12.6.1.1400>F!</a> is +used with an address that is not float aligned; +<LI>FLOATing point result out of range (e.g., in +<a href=dpans12.htm#12.6.1.1430>12.6.1.1430</a> F/); +<LI> +<a href=dpans12.htm#12.6.2.2203>SF@</a> or +<a href=dpans12.htm#12.6.2.2202>SF!</a> is +used with an address that is not single-float aligned; +<LI> +<a href=dpans6.htm#6.1.0750>BASE</a> is not decimal +(<a href=dpans12.htm#12.6.1.2143>12.6.1.2143</a> REPRESENT, +<a href=dpans12.htm#12.6.2.1427>12.6.2.1427</a> F., +<a href=dpans12.htm#12.6.2.1513>12.6.2.1513</a> FE., +<a href=dpans12.htm#12.6.2.1613>12.6.2.1613</a> FS.); +<LI>both arguments equal zero +(<a href=dpans12.htm#12.6.2.1489>12.6.2.1489</a> FATAN2); +<LI>cosine of argument is zero for +<a href=dpans12.htm#12.6.2.1625>12.6.2.1625</a> FTAN; +<LI>d can't be precisely represented as float in +<a href=dpans12.htm#12.6.1.1130>12.6.1.1130</a> D>F; +<LI>dividing by zero +(<a href=dpans12.htm#12.6.1.1430>12.6.1.1430</a> F/); +<LI>exponent too big for conversion +(<a href=dpans12.htm#12.6.2.1203>12.6.2.1203</a> DF!, +<a href=dpans12.htm#12.6.2.1204>12.6.2.1204</a> DF@, +<a href=dpans12.htm#12.6.2.2202>12.6.2.2202</a> SF!, +<a href=dpans12.htm#12.6.2.2203>12.6.2.2203</a> SF@); +<LI>FLOAT less than one +(<a href=dpans12.htm#12.6.2.1477>12.6.2.1477</a> FACOSH); +<LI>FLOAT less than or equal to minus-one +(<a href=dpans12.htm#12.6.2.1554>12.6.2.1554</a> FLNP1); +<LI>FLOAT less than or equal to zero +(<a href=dpans12.htm#12.6.2.1553>12.6.2.1553</a> FLN, +<a href=dpans12.htm#12.6.2.1557>12.6.2.1557</a> FLOG); +<LI>FLOAT less than zero +(<a href=dpans12.htm#12.6.2.1487>12.6.2.1487</a> FASINH, +<a href=dpans12.htm#12.6.2.1618>12.6.2.1618</a> FSQRT); +<LI>FLOAT magnitude greater than one +(<a href=dpans12.htm#12.6.2.1476>12.6.2.1476</a> FACOS, +<a href=dpans12.htm#12.6.2.1486>12.6.2.1486</a> FASIN, +<a href=dpans12.htm#12.6.2.1491>12.6.2.1491</a> FATANH); +<LI>Integer part of float can't be represented by d in +<a href=dpans12.htm#12.6.1.1470>12.6.1.1470</a> F>D; +<LI>string larger than pictured-numeric output area +(<a href=dpans12.htm#12.6.2.1427>12.6.2.1427</a> F., +<a href=dpans12.htm#12.6.2.1513>12.6.2.1513</a> FE., +<a href=dpans12.htm#12.6.2.1613>12.6.2.1613</a> FS.). +</UL> + +<P> + +<hr> +<A name=12.4.1.3> +<H4>12.4.1.3 Other system documentation</H4> +</a> + +<UL> +<LI>no additional requirements. +</UL> +<P> + +<hr> +<A name=12.4.2> +<H3>12.4.2 Program documentation</H3> +</a> + + +<hr> +<A name=12.4.2.1> +<H4>12.4.2.1 Environmental dependencies</H4> +</a> + +<UL> +<LI>requiring the floating-point stack to be larger than six items +(<a href=dpans12.htm#12.3.3>12.3.3</a> Floating-point stack). +</UL> + +<P> + +<hr> +<A name=12.4.2.2> +<H4>12.4.2.2 Other program documentation</H4> +</a> + +<UL> +<LI>no additional requirements. +</UL> + +<P> + +<hr> +<A name=12.5> +<H2>12.5 Compliance and labeling</H2> +</a> + + +<hr> +<A name=12.5.1> +<H3>12.5.1 ANS Forth systems</H3> +</a> + +The phrase <B>Providing the Floating-Point word set</B> shall be +appended to the label of any Standard System that provides all of the +Floating-Point word set. + +<P> + +The phrase <B>Providing name(s) from the Floating-Point Extensions word +set</B> shall be appended to the label of any Standard System that +provides portions of the Floating-Point Extensions word set. + +<P> + +The phrase <B>Providing the Floating-Point Extensions word set</B> shall +be appended to the label of any Standard System that provides all of the +Floating-Point and Floating-Point Extensions word sets. + +<P> + +<hr> +<A name=12.5.2> +<H3>12.5.2 ANS Forth programs</H3> +</a> + +The phrase <B>Requiring the Floating-Point word set</B> shall be +appended to the label of Standard Programs that require the system to +provide the Floating-Point word set. + +<P> + +The phrase <B>Requiring name(s) from the Floating-Point Extensions word +set</B> shall be appended to the label of Standard Programs that require +the system to provide portions of the Floating-Point Extensions word +set. + +<P> + +The phrase <B>Requiring the Floating-Point Extensions word set</B> shall +be appended to the label of Standard Programs that require the system to +provide all of the Floating-Point and Floating-Point Extensions word +sets. + +<P> + +<hr> +<A name=12.6> +<H2>12.6 Glossary</H2> +</a> + + +<hr> +<A name=12.6.1> +<H3>12.6.1 Floating-Point words</H3> +</a> + + + +<hr> +<A name=12.6.1.0558> +<code> +12.6.1.0558 <b>&gt;FLOAT</b> +</code> +</a> +<BR> +<B>to-float</B> FLOATING +<BR> +<pre> + ( c-addr u -- true | false ) ( F: -- r | ) + or ( c-addr u -- r true | false) +</pre> + +<P> + +An attempt is made to convert the string specified by c-addr and u to +internal floating-point representation. If the string represents a +valid floating-point number in the syntax below, its value r and true +are returned. If the string does not represent a valid floating-point +number only false is returned. + +<P> + +A string of blanks should be treated as a special case representing +zero. + +<P> + +The syntax of a convertible string := &lt;significand&gt;[&lt;exponent&gt;] + +<PRE> +&lt;significand&gt; := [&lt;sign&gt;]{&lt;digits&gt;[.&lt;digits0&gt;] | +.&lt;digits&gt; } +&lt;exponent&gt; := &lt;marker&gt;&lt;digits0&gt; +&lt;marker&gt; := {&lt;e-form&gt; | &lt;sign-form&gt;} +&lt;e-form&gt; := &lt;e-char&gt;[&lt;sign-form&gt;] +&lt;sign-form&gt; := { + | - } +&lt;e-char&gt; := { D | d | E | e } +</PRE> + +<p> +<code> +See: +<a href=dpansa12.htm#A.12.6.1.0558>A.12.6.1.0558 &gt;FLOAT</a> +</code> +<p> + + +<hr> +<A name=12.6.1.1130> +<code> +12.6.1.1130 <b>D&gt;F</b> +</code> +</a> +<BR> +<B>d-to-f</B> FLOATING +<BR> +<pre> + ( d -- ) ( F: -- r ) + or ( d -- r ) +</pre> + +<P> + +r is the floating-point equivalent of d. An ambiguous condition exists +if d cannot be precisely represented as a floating-point value. + +<P> + +<hr> +<A name=12.6.1.1400> +<code> +12.6.1.1400 <b>F!</b> +</code> +</a> +<BR> +<B>f-store</B> FLOATING +<BR> +<pre> + ( f-addr -- ) ( F: r -- ) + or ( r f-addr -- ) +</pre> + +<P> + +Store r at +f-addr. + +<P> + +<hr> +<A name=12.6.1.1410> +<code> +12.6.1.1410 <b>F*</b> +</code> +</a> +<BR> +<B>f-star</B> FLOATING +<BR> +<pre> + ( F: r1 r2 -- r3 ) + or ( r1 r2 -- r3 ) +</pre> + +<P> + +Multiply r1 +by r2 giving r3. + +<P> + +<hr> +<A name=12.6.1.1420> +<code> +12.6.1.1420 <b>F+</b> +</code> +</a> +<BR> +<B>f-plus</B> FLOATING +<BR> +<pre> + ( F: r1 r2 -- r3 ) + or ( r1 r2 -- r3 ) +</pre> + +<P> + +Add r1 to r2 +giving the sum r3. + +<P> + +<hr> +<A name=12.6.1.1425> +<code> +12.6.1.1425 <b>F-</b> +</code> +</a> +<BR> +<B>f-minus</B> FLOATING +<BR> +<pre> + ( F: r1 r2 -- r3 ) + or ( r1 r2 -- r3 ) +</pre> + +<P> + +Subtract r2 from r1, +giving r3. + +<P> + +<hr> +<A name=12.6.1.1430> +<code> +12.6.1.1430 <b>F/</b> +</code> +</a> +<BR> +<B>f-slash</B> FLOATING +<BR> +<pre> + ( F: r1 r2 -- r3 ) + or ( r1 r2 -- r3 ) +</pre> + +<P> + +Divide r1 by r2, giving the quotient r3. An ambiguous condition exists +if r2 is zero, or the quotient lies outside of the range of a +floating-point number. + +<P> + +<hr> +<A name=12.6.1.1440> +<code> +12.6.1.1440 <b>F0<</b> +</code> +</a> +<BR> +<B>f-zero-less-than</B> FLOATING +<BR> +<pre> + ( -- flag ) ( F: r -- ) + or ( r -- flag ) +</pre> + +<P> + +flag is true +if and only if r is less than zero. + +<P> + +<hr> +<A name=12.6.1.1450> +<code> +12.6.1.1450 <b>F0=</b> +</code> +</a> +<BR> +<B>f-zero-equals</B> FLOATING +<BR> +<pre> + ( -- flag ) ( F: r -- ) + or ( r -- flag ) +</pre> + +<P> + +flag is true +if and only if r is equal to zero. + +<P> + +<hr> +<A name=12.6.1.1460> +<code> +12.6.1.1460 <b>F&lt;</b> +</code> +</a> +<BR> +<B>f-less-than</B> FLOATING +<BR> +<pre> + ( -- flag ) ( F: r1 r2 -- ) + or ( r1 r2 -- flag ) +</pre> + +<P> + +flag is true +<P> +if and only if r1 is less than +<P> + +<hr> +<A name=12.6.1.1470> +<code> +12.6.1.1460 <b>F&gt;D</b> +</code> +</a> +<BR> +<B>f-to-d</B> FLOATING +<BR> +<pre> + ( -- d ) ( F: r -- ) + or ( r -- d ) +</pre> + +<P> + +d is the double-cell signed-integer equivalent of the integer portion of +r. The fractional portion of r is discarded. An ambiguous condition +exists if the integer portion of r cannot be precisely represented as a +double-cell signed integer. + +<P> + +<hr> +<A name=12.6.1.1472> +<code> +12.6.1.1472 <b>F@</b> +</code> +</a> +<BR> +<B>f-fetch</B> FLOATING +<BR> +<pre> + ( f-addr -- ) ( F: -- r ) + or ( f-addr -- r ) +</pre> + +<P> + +r is +the value stored at f-addr. + +<P> + +<hr> +<A name=12.6.1.1479> +<code> +12.6.1.1479 <b>FALIGN</b> +</code> +</a> +<BR> +<B>f-align</B> FLOATING +<BR> +<pre> + ( -- ) +</pre> + +<P> + +If the data-space pointer is not float aligned, reserve enough data +space to make it so. + +<P> + +<hr> +<A name=12.6.1.1483> +<code> +12.6.1.1483 <b>FALIGNED</b> +</code> +</a> +<BR> +<B>f-aligned</B> FLOATING +<BR> +<pre> + ( addr -- f-addr ) +</pre> +<P> + +f-addr is the first float-aligned address greater than or equal to addr. +<P> + +<hr> +<A name=12.6.1.1492> +<code> +12.6.1.1492 <b>FCONSTANT</b> +</code> +</a> +<BR> +<B>f-constant</B> FLOATING +<BR> +<pre> + ( <B>"&lt;spaces&gt;name"</B> -- ) ( F: r -- ) + or ( r <B>"&lt;spaces&gt;name"</B> -- ) +</pre> + +<P> + +Skip leading space delimiters. Parse name delimited by a space. Create +a definition for name with the execution semantics defined below. + +<P> + +name is +referred to as an <B>f-constant</B>. + +<PRE> + <i>name</i> Execution: ( -- ) ( F: -- r ) + or ( -- r ) +</PRE> +<P> + +Place r +on the floating-point stack. +<P> + +<code> +See: +<a href=dpansa12.htm#A.12.6.1.1492>A.12.6.1.1492 FCONSTANT</a> , +<A href=dpans3.htm#3.4.1>3.4.1</a> Parsing. +</code> + +<P> + +<hr> +<A name=12.6.1.1497> +<code> +12.6.1.1497 <b>FDEPTH</b> +</code> +</a> +<BR> +<B>f-depth</B> FLOATING +<BR> +<pre> + ( -- +n ) +</pre> + +<P> + ++n is the number of values contained on the default separate +floating-point stack. If floating-point numbers are kept on the data +stack, +n is the current number of possible floating-point values +contained on the data stack. + +<P> + +<hr> +<A name=12.6.1.1500> +<code> +12.6.1.1500 <b>FDROP</b> +</code> +</a> +<BR> +<B>f-drop</B> +<BR> +FLOATING +<pre> + ( F: r -- ) + or ( r -- ) +</pre> + +<P> + +Remove r +from the floating-point stack. + +<P> + +<hr> +<A name=12.6.1.1510> +<code> +12.6.1.1510 <b>FDUP</b> +</code> +</a> +<BR> +<B>f-dupe</B> FLOATING +<BR> +<pre> + ( F: r -- r r ) + or ( r -- r r ) +</pre> + +<P> + +Duplicate +r. + +<P> + +<hr> +<A name=12.6.1.1552> +<code> +12.6.1.1552 <b>FLITERAL</b> +</code> +</a> +<BR> +<B>f-literal</B> FLOATING +<p> +<pre> + Interpretation: Interpretation semantics for this word are undefined. +</pre> +<PRE> + Compilation: ( F: r -- ) + or ( r -- ) +</PRE> +<P> + +Append the run-time +semantics given below to the current definition. + +<PRE> + Run-time: ( F: -- r ) + or ( -- r ) +</PRE> +<P> + +Place r +on the floating-point stack. + +<p> +<code> +See: +<a href=dpansa12.htm#A.12.6.1.1552>A.12.6.1.1552 FLITERAL</a> +</code> +<p> + + +<hr> +<A name=12.6.1.1555> +<code> +12.6.1.1555 <b>FLOAT+</b> +</code> +</a> +<BR> +<B>FLOAT-plus</B> FLOATING +<BR> +<pre> + ( f-addr1 -- f-addr2 ) +</pre> + +<P> + +Add the size in address units of a floating-point number to f-addr1, +giving f-addr2. + +<P> + +<hr> +<A name=12.6.1.1556> +<code> +12.6.1.1556 <b>FLOATS</b> +</code> +</a> +<BR> +FLOATING +<BR> +<pre> + ( n1 -- n2 ) +</pre> + +<P> + +n2 is the +size in address units of n1 floating-point numbers. + +<P> + +<hr> +<A name=12.6.1.1558> +<code> +12.6.1.1558 <b>FLOOR</b> +</code> +</a> +<BR> +FLOATING +<BR> +<pre> + ( F: r1 -- r2 ) + or ( r1 -- r2 ) +</pre> + +<P> + +Round r1 to an integral value using the <B>round toward negative +infinity</B> rule, giving r2. + +<P> + +<hr> +<A name=12.6.1.1562> +<code> +12.6.1.1562 <b>FMAX</b> +</code> +</a> +<BR> +<B>f-max</B> FLOATING +<BR> +<pre> + ( F: r1 r2 -- r3 ) + or ( r1 r2 -- r3 ) +</pre> + +<P> + +r3 is +the greater of r1 and r2. + +<P> + +<hr> +<A name=12.6.1.1565> +<code> +12.6.1.1565 <b>FMIN</b> +</code> +</a> +<BR> +<B>f-min</B> FLOATING +<BR> +<pre> + ( F: r1 r2 -- r3 ) + or ( r1 r2 -- r3 ) +</pre> + +<P> + +r3 is +the lesser of r1 and r2. + +<P> + +<hr> +<A name=12.6.1.1567> +<code> +12.6.1.1567 <b>FNEGATE</b> +</code> +</a> +<BR> +<B>f-negate</B> FLOATING +<BR> +<pre> + ( F: r1 -- r2 ) + or ( r1 -- r2 ) +</pre> + +<P> + +r2 is +the negation of r1. + +<P> + +<hr> +<A name=12.6.1.1600> +<code> +12.6.1.1600 <b>FOVER</b> +</code> +</a> +<BR> +<B>f-over</B> FLOATING +<BR> +<pre> + ( F: r1 r2 -- r1 r2 r1 ) + or ( r1 r2 -- r1 r2 r1 ) +</pre> + +<P> + +Place a +copy of r1 on top of the floating-point stack. + +<P> + +<hr> +<A name=12.6.1.1610> +<code> +12.6.1.1610 <b>FROT</b> +</code> +</a> +<BR> +<B>f-rote</B> FLOATING +<BR> +<pre> + ( F: r1 r2 r3 -- r2 r3 r1 ) + or ( r1 r2 r3 -- r2 r3 r1 ) +</pre> + +<P> + +Rotate the +top three floating-point stack entries. + +<P> + +<hr> +<A name=12.6.1.1612> +<code> +12.6.1.1612 <b>FROUND</b> +</code> +</a> +<BR> +<B>f-round</B> FLOATING +<BR> +<pre> + ( F: r1 -- r2 ) + or ( r1 -- r2 ) +</pre> + +<P> + +Round r1 to +an integral value using the <B>round to nearest</B> rule, giving r2. +<P> + +<code> +See: +<A href=dpans12.htm#12.3.2>12.3.2</a> Floating-point operations +</code> + +<P> + +<hr> +<A name=12.6.1.1620> +<code> +12.6.1.1620 <b>FSWAP</b> +</code> +</a> +<BR> +<B>f-swap</B> FLOATING +<BR> +<pre> + ( F: r1 r2 -- r2 r1 ) + or ( r1 r2 -- r2 r1 ) +</pre> + +<P> + +Exchange the +top two floating-point stack items. + +<P> + +<hr> +<A name=12.6.1.1630> +<code> +12.6.1.1630 <b>FVARIABLE</b> +</code> +</a> +<BR> +<B>f-variable</B> FLOATING +<BR> +<pre> + ( <B>"&lt;spaces&gt;name"</B> -- ) +</pre> + +<P> + +Skip leading space delimiters. Parse name delimited by a space. Create +a definition for name with the execution semantics defined below. +Reserve 1 +<a href=dpans12.htm#12.6.1.1556>FLOATS</a> +address units of data space at a float-aligned address. + +<P> + +name is +referred to as an <B>f-variable</B>. + +<PRE> + <i>name</i> Execution: ( -- f-addr ) +</PRE> +<P> + +f-addr is the address of the data space reserved by FVARIABLE when it +created name. A program is responsible for initializing the contents of +the reserved space. +<P> + +<code> +See: +<a href=dpansa12.htm#A.12.6.1.1630>A.12.6.1.1630 FVARIABLE</a> , +<A href=dpans3.htm#3.4.1>3.4.1</a> Parsing. +</code> + +<P> + +<hr> +<A name=12.6.1.2143> +<code> +12.6.1.2143 <b>REPRESENT</b> +</code> +</a> +<BR> +FLOATING +<BR> +<pre> + ( c-addr u -- n flag1 flag2 ) (F: r -- ) + or ( r c-addr u -- n flag1 flag2 ) +</pre> + +<P> + +At c-addr, place the character-string external representation of the +significand of the floating-point number r. Return the decimal-base +exponent as n, the sign as flag1 and <B>valid result</B> as flag2. The +character string shall consist of the u most significant digits of the +significand represented as a decimal fraction with the implied decimal +point to the left of the first digit, and the first digit zero only if +all digits are zero. The significand is rounded to u digits following +the <B>round to nearest</B> rule; n is adjusted, if necessary, to +correspond to the rounded magnitude of the significand. If flag2 is +true then r was in the implementation-defined range of floating-point +numbers. If flag1 is true then r is negative. + +<P> + +An ambiguous condition exists +if the value of +<a href=dpans6.htm#6.1.0750>BASE</a> is not decimal ten. + +<P> + +When flag2 is false, n and flag1 are implementation defined, as are the +contents of c-addr. Under these circumstances, the string at c-addr +shall consist of graphic characters. + +<P> + +<code> +See: +<A href=dpans3.htm#3.2.1.2>3.2.1.2</a> Digit conversion, +<A href=dpans12.htm#12.3.2>12.3.2</a> Floating-point operations, +<a href=dpansa12.htm#A.12.6.1.2143>A.12.6.1.2143 REPRESENT</a> +</code> +<P> + + +<hr> +<a name=12.6.2> +<H3>12.6.2 Floating-Point extension words</H3> +</a> + + +<hr> +<A name=12.6.2.1203> +<code> +12.6.2.1203 <b>DF!</b> +</code> +</a> +<BR> +<B>d-f-store</B> FLOATING EXT +<BR> +<pre> + ( df-addr -- ) ( F: r -- ) + or ( r df-addr -- ) +</pre> + +<P> + +Store the floating-point number r as a 64-bit IEEE double-precision +number at df-addr. If the significand of the internal representation of +r has more precision than the IEEE double-precision format, it will be +rounded using the <B>round to nearest</B> rule. An ambiguous condition +exists if the exponent of r is too large to be accommodated in IEEE +double-precision format. +<p> + +<code> +See: +<A href=dpans12.htm#12.3.1.1>12.3.1.1</a> Addresses, +<A href=dpans12.htm#12.3.2>12.3.2</a> Floating-point operations. +</code> + +<P> + +<hr> +<A name=12.6.2.1204> +<code> +12.6.2.1204 <b>DF@</b> +</code> +</a> +<BR> +<B>d-f-fetch</B> FLOATING EXT +<BR> +<pre> + ( df-addr -- ) ( F: -- r ) + or ( df-addr -- r ) +</pre> + +<P> + +Fetch the 64-bit IEEE double-precision number stored at df-addr to the +floating-point stack as r in the internal representation. If the IEEE +double-precision significand has more precision than the internal +representation it will be rounded to the internal representation using +the <B>round to nearest</B> rule. An ambiguous condition exists if the +exponent of the IEEE double-precision representation is too large to be +accommodated by the internal representation. +<p> + +<code> +See: +<A href=dpans12.htm#12.3.1.1>12.3.1.1</a> Addresses, +<A href=dpans12.htm#12.3.2>12.3.2</a> Floating-point operations. +</code> + +<P> + +<hr> +<A name=12.6.2.1205> +<code> +12.6.2.1205 <b>DFALIGN</b> +</code> +</a> +<BR> +<B>d-f-align</B> FLOATING EXT +<BR> +<pre> + ( -- ) +</pre> + +<P> + +If the data-space pointer is not double-float aligned, reserve enough +data space to make it so. +<P> + +<code> +See: +<A href=dpans12.htm#12.3.1.1>12.3.1.1</a> Addresses +</code> + +<P> + +<hr> +<A name=12.6.2.1207> +<code> +12.6.2.1207 <b>DFALIGNED</b> +</code> +</a> +<BR> +<B>d-f-aligned</B> FLOATING EXT +<BR> +<pre> + ( addr -- df-addr ) +</pre> + +<P> + +df-addr is the first double-float-aligned address greater than or equal +to addr. +<P> + +<code> +See: +<A href=dpans12.htm#12.3.1.1>12.3.1.1</a> Addresses +</code> + +<P> + +<hr> +<A name=12.6.2.1208> +<code> +12.6.2.1208 <b>DFLOAT+</b> +</code> +</a> +<BR> +<B>d-float-plus</B> FLOATING EXT +<BR> +<pre> + ( df-addr1 -- df-addr2 ) +</pre> + +<P> + +Add the size in address units of a 64-bit IEEE double-precision number +to df-addr1, giving df-addr2. +<P> + +<code> +See: +<A href=dpans12.htm#12.3.1.1>12.3.1.1</a> Addresses +</code> + +<P> + +<hr> +<A name=12.6.2.1209> +<code> +2.6.2.1209 <b>DFLOATS</b> +</code> +</a> +<BR> +<B>d-floats</B> FLOATING EXT +<BR> +<pre> + ( n1 -- n2 ) +</pre> + +<P> + +n2 is the size in address units of n1 64-bit IEEE double-precision +numbers. + +<P> + +<hr> +<A name=12.6.2.1415> +<code> +12.6.2.1415 <b>F**</b> +</code> +</a> +<BR> +<B>f-star-star</B> FLOATING EXT +<BR> +<pre> + ( F: r1 r2 -- r3 ) + or ( r1 r2 -- r3 ) +</pre> + +<P> + +Raise r1 to +the power r2, giving the product r3. + +<P> + +<hr> +<A name=12.6.2.1427> +<code> +12.6.2.1427 <b>F.</b> +</code> +</a> +<BR> +<B>f-dot</B> FLOATING EXT +<BR> +<pre> + ( -- ) ( F: r -- ) + or ( r -- ) +</pre> + +<P> + +Display, with a trailing space, the top number on the floating-point +stack using fixed-point notation: + +<PRE> + [-] &lt;digits&gt;.&lt;digits0&gt; +</PRE> +<P> + +An ambiguous condition exists if the value of +<a href=dpans6.htm#6.1.0750>BASE</a> is not (decimal) ten +or if the character string representation exceeds the size of the +pictured numeric output string buffer. +<P> + +<code> +See: +<A href=dpans12.htm#12.6.1.0558>12.6.1.0558 &gt;FLOAT</a> , +<a href=dpansa12.htm#A.12.6.1.1427>A.12.6.1.1427 F.</a> +</code> + +<P> + +<hr> +<A name=12.6.2.1474> +<code> +12.6.2.1474 <b>FABS</b> +</code> +</a> +<BR> +<B>f-abs</B> FLOATING EXT +<BR> +<pre> + ( F: r1 -- r2 ) + or ( r1 -- r2 ) +</pre> + +<P> + +r2 is +the absolute value of r1. + +<P> + +<hr> +<A name=12.6.2.1476> +<code> +12.6.2.1476 <b>FACOS</b> +</code> +</a> +<BR> +<B>f-a-cos</B> FLOATING EXT +<BR> +<pre> + ( F: r1 -- r2 ) + or ( r1 -- r2 ) +</pre> + +<P> + +r2 is the principal radian angle whose cosine is r1. An ambiguous +condition exists if |r1| is greater than one. + +<P> + +<hr> +<A name=12.6.2.1477> +<code> +12.6.2.1477 <b>FACOSH</b> +</code> +</a> +<BR> +<B>f-a-cosh</B> FLOATING EXT +<BR> +<pre> + ( F: r1 -- r2 ) + or ( r1 -- r2 ) +</pre> + +<P> + +r2 is the floating-point value whose hyperbolic cosine is r1. An +ambiguous condition exists if r1 is less than one. + +<P> + +<hr> +<A name=12.6.2.1484> +<code> +12.6.2.1484 <b>FALOG</b> +</code> +</a> +<BR> +<B>f-a-log</B> FLOATING EXT +<BR> +<pre> + ( F: r1 -- r2 ) + or ( r1 -- r2 ) +</pre> + +<P> + +Raise ten +to the power r1, giving r2. + +<P> + +<hr> +<A name=12.6.2.1486> +<code> +12.6.2.1486 <b>FASIN</b> +</code> +</a> +<BR> +<B>f-a-sine</B> FLOATING EXT +<BR> +<pre> + ( F: r1 -- r2 ) + or ( r1 -- r2 ) +</pre> + +<P> + +r2 is the principal radian angle whose sine is r1. An ambiguous +condition exists if |r1| is greater than one. + +<P> + +<hr> +<A name=12.6.2.1487> +<code> +12.6.2.1487 <b>FASINH</b> +</code> +</a> +<BR> +<B>f-a-cinch</B> FLOATING EXT +<BR> +<pre> + ( F: r1 -- r2 ) + or ( r1 -- r2 ) +</pre> + +<P> + +r2 is the floating-point value whose hyperbolic sine is r1. An +ambiguous condition exists if r1 is less than zero. + +<P> + +<hr> +<A name=12.6.2.1488> +<code> +12.6.2.1488 <b>FATAN</b> +</code> +</a> +<BR> +<B>f-a-tan</B> FLOATING EXT +<BR> +<pre> + ( F: r1 -- r2 ) + or ( r1 -- r2 ) +</pre> + +<P> + +r2 is +the principal radian angle whose tangent is r1. + +<P> + +<hr> +<A name=12.6.2.1489> +<code> +12.6.2.1489 <b>FATAN2</b> +</code> +</a> +<BR> +<B>f-a-tan-two</B> FLOATING EXT +<BR> +<pre> + ( F: r1 r2 -- r3 ) + or ( r1 r2 -- r3 ) +</pre> + +<P> + +r3 is the radian angle whose tangent is r1/r2. An ambiguous condition +exists if r1 and r2 are zero. + +<p> +<code> +See: +<a href=dpansa12.htm#A.12.6.2.1489>A.12.6.2.1489 FATAN2</a> +</code> +<p> + + +<hr> +<A name=12.6.2.1491> +<code> +12.6.2.1491 <b>FATANH</b> +</code> +</a> +<BR> +<B>f-a-tan-h</B> FLOATING EXT +<BR> +<pre> + ( F: r1 -- r2 ) + or ( r1 -- r2 ) +</pre> + +<P> + +r2 is the floating-point value whose hyperbolic tangent is r1. An +ambiguous condition exists if r1 is outside the range of -1E0 to 1E0. + +<P> + +<hr> +<A name=12.6.2.1493> +<code> +12.6.2.1493 <b>FCOS</b> +</code> +</a> +<BR> +<B>f-cos</B> FLOATING EXT +<BR> +<pre> + ( F: r1 -- r2 ) + or ( r1 -- r2 ) +</pre> + +<P> + +r2 is the +cosine of the radian angle r1. + +<P> + +<hr> +<A name=12.6.2.1494> +<code> +12.6.2.1494 <b>FCOSH</b> +</code> +</a> +<BR> +<B>f-cosh</B> FLOATING EXT +<BR> +<pre> + ( F: r1 -- r2 ) + or ( r1 -- r2 ) +</pre> + +<P> + +r2 is +the hyperbolic cosine of r1. + +<P> + +<hr> +<A name=12.6.2.1513> +<code> +12.6.2.1513 <b>FE.</b> +</code> +</a> +<BR> +<B>f-e-dot</B> FLOATING EXT +<BR> +<pre> + ( -- ) ( F: r -- ) + or ( r -- ) +</pre> + +<P> + +Display, with a trailing space, the top number on the floating-point +stack using engineering notation, where the significand is greater than +or equal to 1.0 and less than 1000.0 and the decimal exponent is a +multiple of three. + +<P> + +An ambiguous condition exists if the value of +<a href=dpans6.htm#6.1.0750>BASE</a> is not (decimal) ten +or if the character string representation exceeds the size of the +pictured numeric output string buffer. + +<P> + +<code> +See: +<A href=dpans12.htm#12.3.2>12.3.2</a> Floating-point operations, +<A href=dpans12.htm#12.6.1.2143>12.6.1.2143 REPRESENT</a> +</code> + +<P> + +<hr> +<A name=12.6.2.1515> +<code> +12.6.2.1515 <b>FEXP</b> +</code> +</a> +<BR> +<B>f-e-x-p</B> FLOATING EXT +<BR> +<pre> + ( F: r1 -- r2 ) + or ( r1 -- r2 ) +</pre> + +<P> + +Raise e to the power r1, giving r2. + +<P> + +<hr> +<A name=12.6.2.1516> +<code> +12.6.2.1516 <b>FEXPM1</b> +</code> +</a> +<BR> +<B>f-e-x-p-m-one</B> FLOATING EXT +<BR> +<pre> + ( F: r1 -- r2 ) + or ( r1 -- r2 ) +</pre> + +<P> + +Raise e +to the power r1 and subtract one, giving r2. + +<p> +<code> +See: +<a href=dpansa12.htm#A.12.6.2.1516>A.12.6.2.1516 FEXPM1</a> +</code> +<p> + + +<hr> +<A name=12.6.2.1553> +<code> +12.6.2.1553 <b>FLN</b> +</code> +</a> +<BR> +<B>f-l-n</B> FLOATING EXT +<BR> +<pre> + ( F: r1 -- r2 ) + or ( r1 -- r2 ) +</pre> + +<P> + +r2 is the natural logarithm of r1. An ambiguous condition exists if r1 +is less than or equal to zero. + +<P> + +<hr> +<A name=12.6.2.1554> +<code> +12.6.2.1554 <b>FLNP1</b> +</code> +</a> +<BR> +<B>f-l-n-p-one</B> FLOATING EXT +<BR> +<pre> + ( F: r1 -- r2 ) + or ( r1 -- r2 ) +</pre> + +<P> + +r2 is the natural logarithm of the quantity r1 plus one. An ambiguous +condition exists if r1 is less than or equal to negative one. + +<p> +<code> +See: +<a href=dpansa12.htm#A.12.6.2.1554>A.12.6.2.1554 FLNP1</a> +</code> +<p> + + +<hr> +<A name=12.6.2.1557> +<code> +12.6.2.1557 <b>FLOG</b> +</code> +</a> +<BR> +<B>f-log</B> FLOATING EXT +<BR> +<pre> + ( F: r1 -- r2 ) + or ( r1 -- r2 ) +</pre> + +<P> + +r2 is the base-ten logarithm of r1. An ambiguous condition exists if r1 +is less than or equal to zero. + +<P> + +<hr> +<A name=12.6.2.1613> +<code> +12.6.2.1613 <b>FS.</b> +</code> +</a> +<BR> +<B>f-s-dot</B> FLOATING EXT +<BR> +<pre> + ( -- ) ( F: r -- ) + or ( r -- ) +</pre> + +<P> + +Display, with a trailing space, the top number on the floating-point +stack in scientific notation: + +<PRE> + &lt;significand&gt;&lt;exponent&gt; +</PRE> +<P> + +where: +<P> + + +<PRE> + &lt;significand> := [-]&lt;digit&gt;.&lt;digits0&gt; + &lt;exponent> := E[-]&lt;digits&gt; +</PRE> +<P> + +An ambiguous condition exists if the value of +<a href=dpans6.htm#6.1.0750>BASE</a> is not (decimal) ten +or if the character string representation exceeds the size of the +pictured numeric output string buffer. + +<P> + +<code> +See: +<A href=dpans12.htm#12.3.2>12.3.2</a> Floating-point operations, +<A href=dpans12.htm#12.6.1.2143>12.6.1.2143 REPRESENT</a> +</code> + +<P> + +<hr> +<A name=12.6.2.1614> +<code> +12.6.2.1614 <b>FSIN</b> +</code> +</a> +<BR> +<B>f-sine</B> FLOATING EXT +<BR> +<pre> + ( F: r1 -- r2 ) + or ( r1 -- r2 ) +</pre> + +<P> + +r2 is +the sine of the radian angle r1. + +<P> + +<hr> +<A name=12.6.2.1616> +<code> +12.6.2.1616 <b>FSINCOS</b> +</code> +</a> +<BR> +<B>f-sine-cos</B> FLOATING EXT +<BR> +<pre> + ( F: r1 -- r2 r3 ) + or ( r1 -- r2 r3 ) +</pre> + +<P> + +r2 is the sine of the radian angle r1. r3 is the cosine of the radian +angle r1. + +<p> +<code> +See: +<a href=dpansa12.htm#A.12.6.2.1489>A.12.6.2.1489 FATAN2</a> +</code> +<p> + + +<hr> +<A name=12.6.2.1617> +<code> +12.6.2.1617 <b>FSINH</b> +</code> +</a> +<BR> +<B>f-cinch</B> FLOATING EXT +<BR> +<pre> + ( F: r1 -- r2 ) + or ( r1 -- r2 ) +</pre> + +<P> + +r2 is +the hyperbolic sine of r1. + +<P> + +<hr> +<A name=12.6.2.1618> +<code> +12.6.2.1618 <b>FSQRT</b> +</code> +</a> +<BR> +<B>f-square-root</B> FLOATING EXT +<BR> +<pre> + ( F: r1 -- r2 ) + or ( r1 -- r2 ) +</pre> + +<P> + +r2 is the square root of r1. An ambiguous condition exists if r1 is +less than zero. + +<P> + +<hr> +<A name=12.6.2.1625> +<code> +12.6.2.1625 <b>FTAN</b> +</code> +</a> +<BR> +<B>f-tan</B> FLOATING EXT +<BR> +<pre> + ( F: r1 -- r2 ) + or ( r1 -- r2 ) +</pre> + +<P> + +r2 is the tangent of the radian angle r1. An ambiguous condition exists +if cos(r1) is zero. + +<P> + +<hr> +<A name=12.6.2.1626> +<code> +12.6.2.1626 <b>FTANH</b> +</code> +</a> +<BR> +<B>f-tan-h</B> FLOATING EXT +<BR> +<pre> + ( F: r1 -- r2 ) + or ( r1 -- r2 ) +</pre> + +<P> + +r2 is +the hyperbolic tangent of r1. + +<P> + +<hr> +<A name=12.6.2.1640> +<code> +12.6.2.1640 <b>F~</b> +</code> +</a> +<BR> +<B>f-proximate</B> FLOATING EXT +<BR>( +<pre> + ( -- flag ) ( F: r1 r2 r3 -- ) + or ( r1 r2 r3 -- flag ) +</pre> + +<P> + +If r3 is positive, flag is true if the absolute value of (r1 minus r2) +is less than r3. + +<P> + +If r3 is zero, flag is true if the implementation-dependent encoding of +r1 and r2 are exactly identical (positive and negative zero are unequal +if they have distinct encodings). + +<P> + +If r3 is negative, flag is true if the absolute value of (r1 minus r2) +is less than the absolute value of r3 times the sum of the absolute +values of r1 and r2. + +<p> +<code> +See: +<a href=dpansa12.htm#A.12.6.2.1640>A.12.6.2.1640 F~</a> +</code> +<p> + + +<hr> +<A name=12.6.2.2035> +<code> +12.6.2.2035 <b>PRECISION</b> +</code> +</a> +<BR> +FLOATING EXT +<BR> +<pre> + ( -- u ) +</pre> + +<P> + +Return the number of significant digits currently used by +<a href=dpans12.htm#12.6.2.1427>F.</a>, +<a href=dpans12.htm#12.6.2.1513>FE.</a>, or +<a href=dpans12.htm#12.6.2.1613>FS.</a> as u. + +<P> + +<hr> +<A name=12.6.2.2200> +<code> +12.6.2.2200 <b>SET-PRECISION</b> +</code> +</a> +<BR> +FLOATING EXT +<BR> +<pre> + ( u -- ) +</pre> + +<P> + +Set the number of significant digits currently used by +<a href=dpans12.htm#12.6.2.1427>F.</a>, +<a href=dpans12.htm#12.6.2.1513>FE.</a>, or +<a href=dpans12.htm#12.6.2.1613>FS.</a> to u. + +<P> + +<hr> +<A name=12.6.2.2202> +<code> +12.6.2.2202 <b>SF!</b> +</code> +</a> +<BR> +<B>s-f-store</B> FLOATING EXT +<BR> +<pre> + ( sf-addr -- ) ( F: r -- ) + or ( r sf-addr -- ) +</pre> + +<P> + +Store the floating-point number r as a 32-bit IEEE single-precision +number at sf-addr. If the significand of the internal representation of +r has more precision than the IEEE single-precision format, it will be +rounded using the <B>round to nearest</B> rule. An ambiguous condition +exists if the exponent of r is too large to be accommodated by the IEEE +single-precision format. +<p> + +<code> +See: +<A href=dpans12.htm#12.3.1.1>12.3.1.1</a> Addresses, +<A href=dpans12.htm#12.3.2>12.3.2</a> Floating-point operations. +</code> + +<P> + +<hr> +<A name=12.6.2.2203> +<code> +12.6.2.2203 <b>SF@</b> +</code> +</a> +<BR> +<B>s-f-fetch</B> FLOATING EXT +<BR> +<pre> + ( sf-addr -- ) ( F: -- r ) + or ( sf-addr -- r ) +</pre> + +<P> + +Fetch the 32-bit IEEE single-precision number stored at sf-addr to the +floating-point stack as r in the internal representation. If the IEEE +single-precision significand has more precision than the internal +representation, it will be rounded to the internal representation using +the <B>round to nearest</B> rule. An ambiguous condition exists if the +exponent of the IEEE single-precision representation is too large to be +accommodated by the internal representation. +<p> + +<code> +See: +<A href=dpans12.htm#12.3.1.1>12.3.1.1</a> Addresses, +<A href=dpans12.htm#12.3.2>12.3.2</a> Floating-point operations. +</code> + +<P> + +<hr> +<A name=12.6.2.2204> +<code> +12.6.2.2204 <b>SFALIGN</b> +</code> +</a> +<BR> +<B>s-f-align</B> FLOATING EXT +<BR> +<pre> + ( -- ) +</pre> + +<P> + +If the data-space pointer is not single-float aligned, reserve enough +data space to make it so. +<P> + +<code> +See: +<A href=dpans12.htm#12.3.1.1>12.3.1.1</a> Addresses +</code> + +<P> + +<hr> +<A name=12.6.2.2206> +<code> +12.6.2.2206 <b>SFALIGNED</b> +</code> +</a> +<BR> +<B>s-f-aligned</B> FLOATING EXT +<BR> +<pre> + ( addr -- sf-addr ) +</pre> + +<P> + +sf-addr is the first single-float-aligned address greater than or equal +to addr. +<P> + +<code> +See: +<A href=dpans12.htm#12.3.1.1>12.3.1.1</a> Addresses +</code> + +<P> + +<hr> +<A name=12.6.2.2207> +<code> +12.6.2.2207 <b>SFLOAT+</b> +</code> +</a> +<BR> +<B>s-float-plus</B> FLOATING EXT +<BR> +<pre> + ( sf-addr1 -- sf-addr2 ) +</pre> + +<P> + +Add the size in address units of a 32-bit IEEE single-precision number +to sf-addr1, giving sf-addr2. +<P> + +<code> +See: +<A href=dpans12.htm#12.3.1.1>12.3.1.1</a> Addresses +</code> + +<P> + +<hr> +<A name=12.6.2.2208> +<code> +12.6.2.2208 <b>SFLOATS</b> +</code> +</a> +<BR> +<B>s-floats</B> FLOATING EXT +<BR> +<pre> + ( n1 -- n2 ) +</pre> + +<P> + +n2 is the size in address units of n1 32-bit IEEE single-precision +numbers. +<P> + +<code> +See: +<A href=dpans12.htm#12.3.1.1>12.3.1.1</a> Addresses +</code> + + +<hr> +<A href=dpans.htm#toc><IMG src="up.gif" ></A> Table of Contents +<BR> +<A href=dpans13.htm><IMG src="right.gif" ></A> +Next Section +<P> +</BODY> +</HTML> diff --git a/mwmouse/sources/AnsForth/DPANS13.HTM b/mwmouse/sources/AnsForth/DPANS13.HTM @@ -0,0 +1,608 @@ +<HTML><HEAD> +<TITLE>DPANS94</TITLE> +<link disabled rel="stylesheet" href="mpexc6.css"> +<style>@import url(mpexc6.css);</style> +</head> + +<BODY> +<table width=100%> +<tr> +<td align=left> +<a href=dpans12.htm><img src=left.gif + width=26 height=26 align=ALIGN border=0></a> +<a href=dpans14.htm><img src=right.gif + width=26 height=26 align=ALIGN border=0></a> +</td> +<td align=right> +<a href=dpans.htm#toc><img src=up.gif + width=26 height=26 align=ALIGN border=0></a> +<a name=13.>Table of Contents</a> +</td> +</tr> +</table> +<p> +<hr size=4> + +<H1>13. The optional Locals word set</H1> + + +<hr> +<A name=13.1> +<H2>13.1 Introduction</H2> +</a> + +<p> +<code> +See: +<A href=dpansa13.htm>Annex A.13</a> The Locals Word Set +</code> +<P> + +<hr> +<A name=13.2> +<H2>13.2 Additional terms and notation</H2> +</a> + +None. +<P> + +<hr> +<A name=13.3> +<H2>13.3 Additional usage requirements</H2> +</a> + +<p> +<code> +See: +<A href=dpansa13.htm#A.13.3>A.13.3</a> Additional usage requirements +</code> +<P> + +<hr> +<A name=13.3.1> +<H3>13.3.1 Locals</H3> +</a> + +A local is a data object whose execution semantics shall return its +value, whose scope shall be limited to the definition in which it is +declared, and whose use in a definition shall not preclude reentrancy or +recursion. + +<P> + +<hr> +<A name=13.3.2> +<H3>13.3.2 Environmental queries</H3> +</a> + +Append table 13.1 to table 3.5. +<P> + +<code> +See: +<A href=dpans3.htm#3.2.6>3.2.6</a> Environmental queries +</code> + +<P> + +Table 13.1 - Environmental query strings +<P> + + + +<PRE> +String Value data type Constant? Meaning +------ --------------- --------- ------- +#LOCALS n yes maximum number of local variables in a definition +LOCALS flag no locals word set present +LOCALS-EXT flag no locals extensions word set present +</PRE> + + +<P> + +<hr> +<A name=13.3.3> +<H3>13.3.3 Processing locals</H3> +</a> + +To support the locals word set, a system shall provide a mechanism to +receive the messages defined by +<a href=dpans13.htm#13.6.1.0086>(LOCAL)</a> +and respond as described here. + +<P> + +During the compilation of a definition after : +(<a href=dpans6.htm#6.1.0450>colon</a>), +<a href=dpans6.htm#6.2.0455>:NONAME</a>, or +<a href=dpans6.htm#6.1.1250>DOES></a>, +a program may begin sending local identifier messages to the +system. The process shall begin when the first message is sent. The +process shall end when the <B>last local</B> message is sent. The +system shall keep track of the names, order, and number of identifiers +contained in the complete sequence. + +<P> + +<hr> +<A name=13.3.3.1> +<H4>13.3.3.1 Compilation semantics</H4> +</a> + +The system, upon receipt of a sequence of local-identifier messages, +shall take the following actions at compile time: + +<P> + +a) Create temporary dictionary entries for each of the identifiers +passed to +<a href=dpans13.htm#13.6.1.0086>(LOCAL)</a>, +such that each identifier will behave as a local. +These temporary dictionary entries shall vanish at the end of the +definition, denoted by ; +(<a href=dpans6.htm#6.1.0460>semicolon</a>), +<a href=dpans15.htm#15.6.2.0470>;CODE</a>, or +<a href=dpans6.htm#6.1.1250>DOES></a>. The system need +not maintain these identifiers in the same way it does other dictionary +entries as long as they can be found by normal dictionary searching +processes. Furthermore, if the Search-Order word set is present, local +identifiers shall always be searched before any of the word lists in any +definable search order, and none of the Search-Order words shall change +the locals' privileged position in the search order. Local identifiers +may reside in mass storage. + +<P> + +b) For each identifier passed to (LOCAL), the system shall generate an +appropriate code sequence that does the following at execution time: + +<P> + +<OL> +<LI>Allocate a storage resource adequate to contain the value of a local. +The storage shall be allocated in a way that does not preclude +re-entrancy or recursion in the definition using the local. +<LI>Initialize the value using the top item on the data stack. If more +than one local is declared, the top item on the stack shall be moved +into the first local identified, the next item shall be moved into the +second, and so on. +</ol> + +The storage resource may be the return stack or may be implemented in +other ways, such as in registers. The storage resource shall not be +the data stack. Use of locals shall not restrict use of the data +stack before or after the point of declaration. +<p> + +c) Arrange that any of the legitimate methods of terminating execution +of a definition, specifically ; (semicolon), ;CODE, DOES> or +<a href=dpans6.htm#6.1.1380>EXIT</a>, will +release the storage resource allocated for the locals, if any, declared +in that definition. +<a href=dpans6.htm#6.1.0670>ABORT</a> +shall release all local storage resources, +and +<a href=dpans9.htm#9.6.1.0875>CATCH</a> / +<a href=dpans9.htm#9.6.1.2275>THROW</a> +(if implemented) shall release such resources for all +definitions whose execution is being terminated. + +<P> + +d) Separate sets of locals may be declared in defining words before +DOES> for use by the defining word, and after DOES> for use by the word +defined. + +<P> + +A system implementing the Locals word set shall support the declaration +of at least eight locals in a definition. + +<P> + +<hr> +<A name=13.3.3.2> +<H4>13.3.3.2 Syntax restrictions</H4> +</a> + +Immediate words in a program may use +<a href=dpans13.htm#13.6.1.0086>(LOCAL)</a> to implement syntaxes for +local declarations with the following restrictions: + +<P> + +a) A program shall not compile any executable code into the current +definition between the time (LOCAL) is executed to identify the first +local for that definition and the time of sending the single required +<B>last local</B> message; + +<P> + +b) The position in program source at which the sequence of (LOCAL) +messages is sent, referred to here as the point at which locals are +declared, shall not lie within the scope of any control structure; + +<P> + +c) Locals shall not be declared until values previously placed on the +return stack within the definition have been removed; + +<P> + +d) After a definition's locals have been declared, a program may place +data on the return stack. However, if this is done, locals shall not be +accessed until those values have been removed from the return stack; + +<P> + +e) Words that return execution tokens, such as ' +(<a href=dpans6.htm#6.1.0070>tick</a>), +<a href=dpans6.htm#6.1.2510>[']</a>, or +<a href=dpans6.htm#6.1.1550>FIND</a>, +shall not be used with local names; + +<P> + +f) A program that declares more than eight locals in a single definition +has an environmental dependency; + +<P> + +g) Locals may be accessed or updated within control structures, +including do-loops; + +<P> + +h) Local names shall not be referenced by +<a href=dpans6.htm#6.1.2033>POSTPONE</a> and +<a href=dpans6.htm#6.2.2530>[COMPILE]</a>. +<P> + +<code> +See: +<A href=dpans3.htm#3.4>3.4</a> The Forth text interpreter +</code> + +<P> + +<hr> +<A name=13.4> +<H2>13.4 Additional documentation requirements</H2> +</a> + + +<hr> +<A name=13.4.1> +<H3>13.4.1 System documentation</H3> +</a> + + +<hr> +<A name=13.4.1.1> +<H4>13.4.1.1 Implementation-defined options</H4> +</a> + +<UL> +<LI>maximum number of locals in a definition +(<a href=dpans13.htm#13.3.3>13.3.3</a> Processing locals, +<a href=dpans13.htm#13.6.2.1795>13.6.2.1795</a> LOCALS|). +</UL> + +<P> + +<hr> +<A name=13.4.1.2> +<H4>13.4.1.2 Ambiguous conditions</H4> +</a> + +<UL> +<LI>executing a named local while in interpretation state +(<a href=dpans13.htm#13.6.1.0086>13.6.1.0086</a> +(LOCAL)); +<LI>name not defined by +<a href=dpans6.htm#6.2.2405>VALUE</a> or +LOCAL +(<a href=dpans13.htm#13.6.1.2295>13.6.1.2295</a> TO). +</ul> + +<hr> +<A name=13.4.1.3> +<h4>13.4.1.3 Other system documentation</h4> +</a> +<ul> +<LI>no additional requirements. +</UL> +<P> + +<hr> +<A name=13.4.2> +<H3>13.4.2 Program documentation</H3> +</a> + + +<hr> +<A name=13.4.2.1> +<H4>13.4.2.1 Environmental dependencies</H4> +</a> + +<UL> +<LI>declaring more than eight locals in a single definition +(<a href=dpans13.htm#13.3.3>13.3.3</a> Processing locals). +</UL> + +<P> + +<hr> +<A name=13.4.2.2> +<H4>13.4.2.2 Other program documentation</H4> +</a> + +<UL> +<LI>no additional requirements. +</UL> + +<P> + +<hr> +<A name=13.5> +<H2>13.5 Compliance and labeling</H2> +</a> + + +<hr> +<A name=13.5.1> +<H3>13.5.1 ANS Forth systems</H3> +</a> + +The phrase <B>Providing the Locals word set</B> shall be appended to the +label of any Standard System that provides all of the Locals word set. + +<P> + +The phrase <B>Providing name(s) from the Locals Extensions word set</B> +shall be appended to the label of any Standard System that provides +portions of the Locals Extensions word set. + +<P> + +The phrase <B>Providing the Locals Extensions word set</B> shall be +appended to the label of any Standard System that provides all of the +Locals and Locals Extensions word sets. + +<P> + +<hr> +<A name=13.5.2> +<H3>13.5.2 ANS Forth programs</H3> +</a> + +The phrase <B>Requiring the Locals word set</B> shall be appended to the +label of Standard Programs that require the system to provide the Locals +word set. + +<P> + +The phrase <B>Requiring name(s) from the Locals Extensions word set</B> +shall be appended to the label of Standard Programs that require the +system to provide portions of the Locals Extensions word set. + +<P> + +The phrase <B>Requiring the Locals Extensions word set</B> shall be +appended to the label of Standard Programs that require the system to +provide all of the Locals and Locals Extensions word sets. + +<P> + +<hr> +<A name=13.6> +<H2>13.6 Glossary</H2> +</a> + + +<hr> +<A name=13.6.1> +<H3>13.6.1 Locals words</H3> +</a> + + +<hr> +<A name=13.6.1.0086> +<code> +13.6.1.0086 <b>(LOCAL)</b> +</code> +</a> +<BR> +<B>paren-local-paren</B> LOCAL +<p> +<pre> + Interpretation: Interpretation semantics for this word are undefined. +</pre> +<P> +<pre> + Execution: ( c-addr u -- ) +</pre> +<P> + +When executed during compilation, (LOCAL) passes a message to the system +that has one of two meanings. If u is non-zero, the message identifies +a new local whose definition name is given by the string of characters +identified by c-addr u. If u is zero, the message is <B>last local</B> +and c-addr has no significance. + +<P> + +The result of executing (LOCAL) during compilation of a definition is to +create a set of named local identifiers, each of which is a definition +name, that only have execution semantics within the scope of that +definition's source. + +<PRE> + <i>local</i> Execution: ( -- x ) +</PRE> +<P> + +Push the local's value, x, onto the stack. The local's value is +initialized as described in +<a href=dpans13.htm#13.3.3>13.3.3</a> Processing locals and may be changed +by preceding the local's name with +<a href=dpans13.htm#13.6.1.2295>TO</a>. An ambiguous condition exists +when local is executed while in interpretation state. +<p> + +<b>Note:</b> This word does not have special compilation semantics in +the +usual sense because it provides access to a system capability for use +by other user-defined words that do have them. However, the locals +facility as a whole and the sequence of messages passed defines +specific usage rules with semantic implications that are described in +detail in section +<a href=dpans13.htm#13.3.3>13.3.3</a> Processing locals. + +<P> + +<b>Note:</b> This word is not intended for direct use in a definition to +declare that definition's locals. It is instead used by system or +user compiling words. These compiling words in turn define their own +syntax, and may be used directly in definitions to declare locals. In +this context, the syntax for (LOCAL) is defined in terms of a sequence +of compile-time messages and is described in detail in section +<a href=dpans13.htm#13.3.3>13.3.3</a> Processing locals. + +<P> + +<b>Note:</b> The Locals word set modifies the syntax and semantics of +<a href=dpans6.htm#6.2.2295>6.2.2295</a> TO +as defined in the Core Extensions word set. + +<P> + +<code> +See: +<A href=dpans3.htm#3.4>3.4</a> The Forth text interpreter +</code> + +<P> + +<hr> +<A name=13.6.1.2295> +<code> +13.6.1.2295 <b>TO</b> +</code> +</a> +<BR> +LOCAL +<BR> +<P> + +Extend the semantics of +<a href=dpans6.htm#6.2.2295>6.2.2295</a> TO to be: +<P> + + +<PRE> + Interpretation: ( x <B>"&lt;spaces&gt;name"</B> -- ) +</PRE> +<P> + +Skip leading spaces and parse name delimited by a space. Store x in +name. An ambiguous condition exists if name was not defined by +<a href=dpans6.htm#6.2.2405>VALUE</a>. + + +<PRE> + Compilation: ( <B>"&lt;spaces&gt;name"</B> -- ) +</PRE> +<P> + +Skip leading spaces and parse name delimited by a space. Append the +run-time semantics given below to the current definition. An ambiguous +condition exists if name was not defined by either VALUE or +<a href=dpans13.htm#13.6.1.0086>(LOCAL)</a>. + + +<PRE> + Run-time: ( x -- ) +</PRE> +<P> + +Store x in name. + +<P> + +<b>Note:</b> An ambiguous condition exists if either +<a href=dpans6.htm#6.1.2033>POSTPONE</a> or +<a href=dpans6.htm#6.2.2530>[COMPILE]</a> +is applied to TO. + + +<P> + +<code> +See: +<A href=dpans3.htm#3.4.1>3.4.1</a> Parsing, +<a href=dpansa13.htm#A.13.6.1.2295>A.13.6.1.2295 TO</a> +</code> + +<P> + +<hr> +<A name=13.6.2> +<H3>13.6.2 Locals extension words</H3> +</a> + + +<hr> +<A name=13.6.2.1795> +<code> +13.6.2.1795 <b>LOCALS|</b> +</code> +</a> +<BR> +<B>locals-bar</B> LOCAL EXT +<p> +<pre> + Interpretation: Interpretation semantics for this word are undefined. +</pre> +<P> +<pre> + Compilation: ( <B>"&lt;spaces&gt;name1"</B> <B>"&lt;spaces&gt;name2"</B> ... <B>"&lt;spaces&gt;namen"</B> <B>|</B> -- ) +</pre> +<P> + +Create up to eight local identifiers by repeatedly skipping leading +spaces, parsing name, and executing +<a href=dpans13.htm#13.6.1.0086>13.6.1.0086</a> (LOCAL). The list of +locals to be defined is terminated by |. Append the run-time semantics +given below to the current definition. + +<PRE> + Run-time: ( xn ... x2 x1 -- ) +</PRE> +<P> + +Initialize up to eight local identifiers as described in +<a href=dpans13.htm#13.6.1.0086>13.6.1.0086</a> (LOCAL), +each of which takes as its initial value the top stack item, +removing it from the stack. Identifier name1 is initialized with x1, +identifier name2 with x2, etc. When invoked, each local will return its +value. The value of a local may be changed using +<a href=dpans13.htm#13.6.1.2295>13.6.1.2295</a> TO. + +<p> +<code> +See: +<A href=dpansa13.htm#A.13.6.2.1795>A.13.6.2.1795 LOCALS|</a> +</code> +<P> + + +<hr> +<A href=dpans.htm#toc><IMG src="up.gif" ></A> Table of Contents +<BR> +<A href=dpans14.htm><IMG src="right.gif" ></A> +Next Section +<P> +</BODY> +</HTML> diff --git a/mwmouse/sources/AnsForth/DPANS14.HTM b/mwmouse/sources/AnsForth/DPANS14.HTM @@ -0,0 +1,380 @@ +<HTML><HEAD> +<TITLE>DPANS94</TITLE> +<link disabled rel="stylesheet" href="mpexc6.css"> +<style>@import url(mpexc6.css);</style> +</head> + +<BODY> +<table width=100%> +<tr> +<td align=left> +<a href=dpans13.htm><img src=left.gif + width=26 height=26 align=ALIGN border=0></a> +<a href=dpans15.htm><img src=right.gif + width=26 height=26 align=ALIGN border=0></a> +</td> +<td align=right> +<a href=dpans.htm#toc><img src=up.gif + width=26 height=26 align=ALIGN border=0></a> +<a name=14.>Table of Contents</a> +</td> +</tr> +</table> +<p> +<hr size=4> + +<H1>14. The optional Memory-Allocation word set</H1> + + +<hr> +<A name=14.1> +<H2>14.1 Introduction</H2> +</a> + +<p> +<code> +See: +<a href=dpansa14.htm>A.14</a> The optional Memory-Allocation word set +</code> +<p> + +<hr> +<A name=14.2> +<H2>14.2 Additional terms and notation</H2> +</a> + +None. +<P> + +<hr> +<A name=14.3> +<H2>14.3 Additional usage requirements</H2> +</a> + + +<hr> +<A name=14.3.1> +<H3>14.3.1 I/O Results data type</H3> +</a> + +I/O results are single-cell numbers indicating the result of I/O +operations. A value of zero indicates that the I/O operation completed +successfully; other values and their meanings are +implementation-defined. + +<P> + +Append table 14.1 to +<a href=dpans3.htm#table.3.1>table 3.1</a>. +<P> + +Table 14.1 - Data types + +<PRE> +Symbol Data type Size on stack +------ --------- ------------- +ior I/O results 1 cell +</PRE> + + +<P> + +<hr> +<A name=14.3.2> +<H3>14.3.2 Environmental queries</H3> +</a> + +Append table 14.2 to table 3.5. +<P> + +<code> +See: +<A href=dpans3.htm#3.2.6>3.2.6</a> Environmental queries +</code> +<P> + +Table 14.2 - Environmental query strings + +<PRE> +String Value data type Constant? Meaning +------ --------------- --------- ------- +MEMORY-ALLOC flag no memory-allocation word set present +MEMORY-ALLOC-EXT flag no memory-allocation extensions word set present + +</PRE> + +<P> + +<hr> +<A name=14.3.3> +<H3>14.3.3 Allocated regions</H3> +</a> + +A program may address memory in data space regions made available by +<a href=dpans14.htm#14.6.1.0707>ALLOCATE</a> or +<a href=dpans14.htm#14.6.1.2145>RESIZE</a> and not yet released by +<a href=dpans14.htm#14.6.1.1605>FREE</a>. + +<P> + +<code> +See: +<A href=dpans3.htm#3.3.3>3.3.3</a> Data space +</code> +<P> + + +<hr> +<A name=14.4> +<H2>14.4 Additional documentation requirements</H2> +</a> + + +<hr> +<A name=14.4.1> +<H3>14.4.1 System documentation</H3> +</a> + + +<hr> +<A name=14.4.1.1> +<H4>14.4.1.1 Implementation-defined options</H4> +</a> + +<UL> +<LI>values and meaning of ior +(<a href=dpans14.htm#14.3.1>14.3.1</a> I/O Results data type, +<a href=dpans14.htm#14.6.1.0707>14.6.1.0707</a> ALLOCATE, +<a href=dpans14.htm#14.6.1.1605>14.6.1.1605</a> FREE, +<a href=dpans14.htm#14.6.1.2145>14.6.1.2145</a> RESIZE). +</UL> + +<P> + +<hr> +<A name=14.4.1.2> +<H4>14.4.1.2 Ambiguous conditions</H4> +</a> + +<UL> +<LI>no additional requirements. +</ul> + +<hr> +<A name=14.4.1.3> +<h4>14.4.1.3 Other system documentation</h4> +</a> +<ul> +<LI>no additional requirements. +</ul> + +<hr> +<A name=14.4.2> +<h3>14.4.2 Program documentation</h3> +</a> +<ul> +<LI>no additional requirements. +</ul> + +<hr> +<A name=14.5> +<h2>14.5 Compliance and labeling</h2> +</a> + + +<P> + +<hr> +<A name=14.5.1> +<H3>14.5.1 ANS Forth systems</H3> +</a> + +The phrase <B>Providing the Memory-Allocation word set</B> shall be +appended to the label of any Standard System that provides all of the +Memory-Allocation word set. + +<P> + +The phrase <B>Providing name(s) from the Memory-Allocation Extensions +word set</B> shall be appended to the label of any Standard System that +provides portions of the Memory-Allocation Extensions word set. + +<P> + +The phrase <B>Providing the Memory-Allocation Extensions word set</B> +shall be appended to the label of any Standard System that provides all +of the Memory-Allocation and Memory-Allocation Extensions word sets. + +<P> + +<hr> +<A name=14.5.2> +<H3>14.5.2 ANS Forth programs</H3> +</a> + +The phrase <B>Requiring the Memory-Allocation word set</B> shall be +appended to the label of Standard Programs that require the system to +provide the Memory-Allocation word set. + +<P> + +The phrase <B>Requiring name(s) from the Memory-Allocation Extensions +word set</B> shall be appended to the label of Standard Programs that +require the system to provide portions of the Memory-Allocation +Extensions word set. + +<P> + +The phrase <B>Requiring the Memory-Allocation Extensions word set</B> +shall be appended to the label of Standard Programs that require the +system to provide all of the Memory-Allocation and Memory-Allocation +Extensions word sets. + +<P> + +<hr> +<A name=14.6> +<H2>14.6 Glossary</H2> +</a> + +<hr> +<A name=14.6.1> +<H3>14.6.1 Memory-Allocation words</H3> +</a> + +<hr> +<A name=14.6.1.0707> +<code> +14.6.1.0707 <b>ALLOCATE</b> +</code> +</a> +<BR> +MEMORY +<BR> +<pre> + ( u -- a-addr ior ) +</pre> +<P> + +Allocate u address units of contiguous data space. The data-space +pointer is unaffected by this operation. The initial content of the +allocated space is undefined. + +<P> + +If the allocation succeeds, a-addr is the aligned starting address of +the allocated space and ior is zero. + +<P> + +If the operation fails, a-addr does not represent a valid address and +ior is the implementation-defined I/O result code. + +<p> + +<code> +See: +<A href=dpans6.htm#6.1.1650>6.1.1650 HERE</a> , +<A href=dpans14.htm#14.6.1.1605>14.6.1.1605 FREE</a> , +<A href=dpans14.htm#14.6.1.2145>14.6.1.2145 RESIZE</a> +</code> + +<P> + +<hr> +<A name=14.6.1.1605> +<code> +14.6.1.1605 <b>FREE</b> +</code> +</a> +<BR> +MEMORY +<BR> +<pre> + ( a-addr -- ior ) +</pre> +<P> + +Return the contiguous region of data space indicated by a-addr to the +system for later allocation. a-addr shall indicate a region of data +space that was previously obtained by +<a href=dpans14.htm#14.6.1.0707>ALLOCATE</a> or +<a href=dpans14.htm#14.6.1.2145>RESIZE</a>. The +data-space pointer is unaffected by this operation. +<P> + +If the operation succeeds, ior is zero. If the operation fails, ior is +the implementation-defined I/O result code. +<P> + +<code> +See: +<A href=dpans6.htm#6.1.1650>6.1.1650 HERE</a> +</code> + +<P> + +<hr> +<A name=14.6.1.2145> +<code> +14.6.1.2145 <b>RESIZE</b> +</code> +</a> +<BR> +MEMORY +<BR> +<pre> + ( a-addr1 u -- a-addr2 ior ) +</pre> +<P> + +Change the allocation of the contiguous data space starting at the +address a-addr1, previously allocated by +<a href=dpans14.htm#14.6.1.0707>ALLOCATE</a> or RESIZE, to u +address units. u may be either larger or smaller than the current size +of the region. The data-space pointer is unaffected by this operation. + +<P> + +If the operation succeeds, a-addr2 is the aligned starting address of u +address units of allocated memory and ior is zero. a-addr2 may be, but +need not be, the same as a-addr1. If they are not the same, the values +contained in the region at a-addr1 are copied to a-addr2, up to the +minimum size of either of the two regions. If they are the same, the +values contained in the region are preserved to the minimum of u or the +original size. If a-addr2 is not the same as a-addr1, the region of +memory at a-addr1 is returned to the system according to the operation +of +<a href=dpans14.htm#14.6.1.1605>FREE</a>. + +<P> + +If the operation fails, a-addr2 equals a-addr1, the region of memory at +a-addr1 is unaffected, and ior is the implementation-defined I/O result +code. +<P> + +<code> +See: +<A href=dpans6.htm#6.1.1650>6.1.1650 HERE</a> +</code> + +<P> + +<hr> +<A name=14.6.2> +<h3>14.6.2 Memory-Allocation extension words</h3> +</a> +<p> + +None +<P> + +<hr> +<A href=dpans.htm#toc><IMG src="up.gif" ></A> Table of Contents +<BR> +<A href=dpans15.htm><IMG src="right.gif" ></A> +Next Section +<P> +</BODY> +</HTML> diff --git a/mwmouse/sources/AnsForth/DPANS15.HTM b/mwmouse/sources/AnsForth/DPANS15.HTM @@ -0,0 +1,920 @@ +<HTML><HEAD> +<TITLE>DPANS94</TITLE> +<link disabled rel="stylesheet" href="mpexc6.css"> +<style>@import url(mpexc6.css);</style> +</head> + +<BODY> +<table width=100%> +<tr> +<td align=left> +<a href=dpans14.htm><img src=left.gif + width=26 height=26 align=ALIGN border=0></a> +<a href=dpans16.htm><img src=right.gif + width=26 height=26 align=ALIGN border=0></a> +</td> +<td align=right> +<a href=dpans.htm#toc><img src=up.gif + width=26 height=26 align=ALIGN border=0></a> +<a name=15.>Table of Contents</a> +</td> +</tr> +</table> +<p> +<hr size=4> + +<H1>15. The optional Programming-Tools word set</H1> + +<p> +<code> +See: +<a href=dpansa15.htm>15.</a> The optional Programming-Tools word set +</code> +<p> + +<hr> +<A name=15.1> +<H2>15.1 Introduction</H2> +</a> + +This optional word set contains words most often used during the development +of applications. +<P> + +<hr> +<A name=15.2> +<H2>15.2 Additional terms and notation</H2> +</a> + +None. +<P> + +<hr> +<A name=15.3> +<H2>15.3 Additional usage requirements</H2> +</a> + + +<hr> +<A name=15.3.1> +<H3>15.3.1 Environmental queries</H3> +</a> + +Append table 15.1 to table 3.5. +<P> + +<code> +See: +<A href=dpans3.htm#3.2.6>3.2.6</a> Environmental queries +</code> +<P> + +Table 15.1 - Environmental query strings +<P> + + +<PRE> +String Value data type Constant? Meaning +------ --------------- --------- ------- +TOOLS flag no programming-tools word set present +TOOLS-EXT flag no programming-tools extensions word set present +</PRE> + + +<P> + +<hr> +<A name=15.3.2> +<H3>15.3.2 The Forth dictionary</H3> +</a> + +A program using the words +<a href=dpans15.htm#15.6.2.0930>CODE</a> or +<a href=dpans15.htm#15.6.2.0470>;CODE</a> +associated with assembler code has an +environmental dependency on that particular instruction set and assembler +notation. + +<P> + +Programs using the words +<a href=dpans15.htm#15.6.2.1300>EDITOR</a> or +<a href=dpans15.htm#15.6.2.0740>ASSEMBLER</a> +require the +<a href=dpans16.htm>Search Order word set</a> +or an equivalent implementation-defined capability. + +<P> + +<code> +See: +<A href=dpans3.htm#3.3>3.3</a> The Forth dictionary +</code> + +<P> + +<hr> +<A name=15.4> +<H2>15.4 Additional documentation requirements</H2> +</a> + +<hr> +<A name=15.4.1> +<H3>15.4.1 System documentation</H3> +</a> + +<hr> +<A name=15.4.1.1> +<H4>15.4.1.1 Implementation-defined options</H4> +</a> + +<UL> +<LI>ending sequence for input following +<a href=dpans15.htm#15.6.2.0470>15.6.2.0470</a> ;CODE and +<a href=dpans15.htm#15.6.2.0930>15.6.2.0930</a> CODE; +<LI>manner of processing input following +<a href=dpans15.htm#15.6.2.0470>15.6.2.0470</a> ;CODE and +<a href=dpans15.htm#15.6.2.0930>15.6.2.0930</a> CODE; +<LI>search-order capability for +<a href=dpans15.htm#15.6.2.1300>15.6.2.1300</a> EDITOR and +<a href=dpans15.htm#15.6.2.0740>15.6.2.0740</a> ASSEMBLER +(<a href=dpans15.htm#15.3.2>15.3.2</a> The Forth dictionary); +<LI>source and format of display by +<a href=dpans15.htm#15.6.1.2194>15.6.1.2194</a> SEE. +</ul> + +<hr> +<a name=15.4.1.2> +<h4>15.4.1.2 Ambiguous conditions</h4> +</a> + +<ul> +<LI>deleting the compilation word-list +(<a href=dpans15.htm#15.6.2.1580>15.6.2.1580</a> FORGET); +<LI>fewer than u+1 items on control-flow stack +(<a href=dpans15.htm#15.6.2.1015>15.6.2.1015</a> CSPICK, +<a href=dpans15.htm#15.6.2.1020>15.6.2.1020</a> CSROLL); +<LI>name can't be found +(<a href=dpans15.htm#15.6.2.1580>15.6.2.1580</a> FORGET); +<LI>name not defined via +<a href=dpans6.htm#6.1.1000>6.1.1000</a> CREATE +(<a href=dpans15.htm#15.6.2.0470>15.6.2.0470</a> ;CODE); +<LI> +<a href=dpans6.htm#6.1.2033>6.1.2033</a> POSTPONE applied to +<a href=dpans15.htm#15.6.2.2532>15.6.2.2532</a> [IF]; +<LI>reaching the end of the input source before matching +<a href=dpans15.htm#15.6.2.2531>15.6.2.2531</a> [ELSE] or +<a href=dpans15.htm#15.6.2.2533>15.6.2.2533</a> [THEN] +(<a href=dpans15.htm#15.6.2.2532>15.6.2.2532</a> [IF]); +<LI>removing a needed definition +(<a href=dpans15.htm#15.6.2.1580>15.6.2.1580</a> FORGET). +</UL> +<P> + +<hr> +<A name=15.4.1.3> +<H4>15.4.1.3 Other system documentation</H4> +</a> + +<ul> +<li>no additional requirements. +</ul> +<P> + +<hr> +<A name=15.4.2> +<H3>15.4.2 Program documentation</H3> +</a> + +<hr> +<A name=15.4.2.1> +<H4>15.4.2.1 Environmental dependencies</H4> +</a> + +<UL> +<LI>using the words +<a href=dpans15.htm#15.6.2.0470>15.6.2.0470</a> ;CODE or +<a href=dpans15.htm#15.6.2.0930>15.6.2.0930</a> CODE. +</ul> + +<hr> +<A name=15.4.2.2> +<h4>15.4.2.2 Other program documentation</h4> +</a> +<ul> +<LI>no additional requirements. +</UL> + +<P> + +<hr> +<A name=15.5> +<H2>15.5 Compliance and labeling</H2> +</a> + + +<hr> +<A name=15.5.1> +<H3>15.5.1 ANS Forth systems</H3> +</a> + +The phrase <B>Providing the Programming-Tools word set</B> shall be +appended to the label of any Standard System that provides all of the +Programming-Tools word set. + +<P> + +The phrase <B>Providing name(s) from the Programming-Tools Extensions +word set</B> shall be appended to the label of any Standard System that +provides portions of the Programming-Tools Extensions word set. + +<P> + +The phrase <B>Providing the Programming-Tools Extensions word set</B> +shall be appended to the label of any Standard System that provides all +of the Programming-Tools and Programming-Tools Extensions word sets. + +<P> + +<hr> +<A name=15.5.2> +<H3>15.5.2 ANS Forth programs</H3> +</a> + +The phrase <B>Requiring the Programming-Tools word set</B> shall be +appended to the label of Standard Programs that require the system to +provide the Programming-Tools word set. + +<P> + +The phrase <B>Requiring name(s) from the Programming-Tools Extensions +word set</B> shall be appended to the label of Standard Programs that +require the system to provide portions of the Programming-Tools +Extensions word set. + +<P> + +The phrase <B>Requiring the Programming-Tools Extensions word set</B> +shall be appended to the label of Standard Programs that require the +system to provide all of the Programming-Tools and Programming-Tools +Extensions word sets. + +<P> + +<hr> +<A name=15.6> +<H3>15.6 Glossary</H3> +</a> + + +<hr> +<A name=15.6.1> +<H3>15.6.1 Programming-Tools words</H3> +</a> + + +<hr> +<A name=15.6.1.0220> +<code> +15.6.1.0220 <b>.S</b> +</code> +</a> +<BR> +<B>dot-s</B> TOOLS +<BR> +<pre> + ( -- ) +</pre> +<P> + +Copy and display the values currently on the data stack. The format of +the display is implementation-dependent. + +<P> + +.S may be implemented using pictured numeric output words. +Consequently, its use may corrupt the transient region identified by +<a href=dpans6.htm#6.1.0040>#&gt;</a>. +<P> + +<code> +See: +<a href=dpansa15.htm#A.15.6.1.0220>A.15.6.1.0220 .S</a> , +<A href=dpans3.htm#3.3.3.6>3.3.3.6</a> Other transient regions. +</code> + +<P> + +<hr> +<A name=15.6.1.0600> +<code> +15.6.1.0600 <b>?</b> +</code> +</a> +<BR> +<B>question</B> TOOLS +<BR> +<pre> + ( a-addr -- ) +</pre> +<P> + +Display the value stored at a-addr. +<P> + +? may be implemented using pictured numeric output words. Consequently, +its use may corrupt the transient region identified by +<a href=dpans6.htm#6.1.0040>#&gt;</a>. +<P> + +<code> +See: +<A href=dpans3.htm#3.3.3.6>3.3.3.6</a> Other transient regions +</code> + +<P> + +<hr> +<A name=15.6.1.1280> +<code> +15.6.1.1280 <b>DUMP</b> +</code> +</a> +<BR> +TOOLS +<BR> +<pre> + ( addr u -- ) +</pre> +<P> + +Display the contents of u consecutive addresses starting at addr. The +format of the display is implementation dependent. + +<P> + +DUMP may be implemented using pictured numeric output words. +Consequently, its use may corrupt the transient region identified by +<a href=dpans6.htm#6.1.0040>#&gt;</a>. + +<P> + +<code> +See: +<A href=dpans3.htm#3.3.3.6>3.3.3.6</a> Other transient regions +</code> + +<P> + +<hr> +<A name=15.6.1.2194> +<code> +15.6.1.2194 <b>SEE</b> +</code> +</a> +<BR> +TOOLS +<BR> +<pre> + ( <B>"&lt;spaces&gt;name"</B> -- ) +</pre> +<P> + +Display a human-readable representation of the named word's definition. +The source of the representation (object-code decompilation, source +block, etc.) and the particular form of the display is implementation +defined. + +<P> + +SEE may be implemented using pictured numeric output words. +Consequently, its use may corrupt the transient region identified by +<a href=dpans6.htm#6.1.0040>#&gt;</a>. + +<P> + +<code> +See: +<A href=dpans3.htm#3.3.3.6>3.3.3.6</a> Other transient regions, +<a href=dpansa15.htm#A.15.6.1.2194>A.15.6.1.2194 SEE</a> +</code> + +<P> + +<hr> +<A name=15.6.1.2465> +<code> +15.6.1.2465 <b>WORDS</b> +</code> +</a> +<BR> +TOOLS +<BR> +<pre> + ( -- ) +</pre> +<P> + +List the definition names in the first word list of the search order. +The format of the display is implementation-dependent. + +<P> + +WORDS may be implemented using pictured numeric output words. +Consequently, its use may corrupt the transient region identified by +<a href=dpans6.htm#6.1.0040>#&gt;</a>. +<P> + +<code> +See: +<A href=dpans3.htm#3.3.3.6>3.3.3.6</a> Other transient regions, +<a href=dpansa15.htm#A.15.6.1.2465>A.15.6.1.2465 WORDS</a> +</code> + +<P> + +<hr> +<A name=15.6.2> +<H3>15.6.2 Programming-Tools extension words</H3> +</a> + + +<hr> +<A name=15.6.2.0470> +<code> +15.6.2.0470 <b>;CODE</b> +</code> +</a> +<BR> +<B>semicolon-code</B> TOOLS EXT +<P> +<pre> + Interpretation: Interpretation semantics for this word are undefined. +</pre> +<PRE> + Compilation: ( C: colon-sys -- ) +</PRE> +<P> + +Append the run-time semantics below to the current definition. End the +current definition, allow it to be found in the dictionary, and enter +interpretation state, consuming colon-sys. + +<P> + +Subsequent characters in the parse area typically represent source code +in a programming language, usually some form of assembly language. +Those characters are processed in an implementation-defined manner, +generating the corresponding machine code. The process continues, +refilling the input buffer as needed, until an implementation-defined +ending sequence is processed. + + +<PRE> + Run-time: ( -- ) ( R: nest-sys -- ) +</PRE> + +<P> + +Replace the execution semantics of the most recent definition with the +name execution semantics given below. Return control to the calling +definition specified by nest-sys. An ambiguous condition exists if the +most recent definition was not defined with +<a href=dpans6.htm#6.1.1000>CREATE</a> or a user-defined +word that calls CREATE. + +<PRE> + <i>name</i> Execution: ( i*x -- j*x ) +</PRE> +<P> + +Perform the machine code sequence that was generated following ;CODE. +<P> + +<code> +See: +<a href=dpansa15.htm#A.15.6.2.0470>A.15.6.2.0470 ;CODE</a> , +<A href=dpans6.htm#6.1.1250>6.1.1250 DOES&gt;</a> +</code> + +<P> + +<hr> +<A name=15.6.2.0702> +<code> +15.6.2.0702 <b>AHEAD</b> +</code> +</a> +<BR> +TOOLS EXT +<P> +<pre> + Interpretation: Interpretation semantics for this word are undefined. +</pre> + +<PRE> + Compilation: ( C: -- orig ) +</PRE> + +Put the location of a new unresolved forward reference orig onto the +control flow stack. Append the run-time semantics given below to the +current definition. The semantics are incomplete until orig is resolved +(e.g., by +<a href=dpans6.htm#6.1.2270>THEN</a>). + + +<PRE> + Run-time: ( -- ) +</PRE> +<P> + +Continue execution at the location specified by the resolution of orig. + +<P> + +<hr> +<A name=15.6.2.0740> +<code> +15.6.2.0740 <b>ASSEMBLER</b> +</code> +</a> +<BR> +TOOLS EXT +<BR> +<pre> + ( -- ) +</pre> +<P> + +Replace the first word list in the search order with the ASSEMBLER word +list. +<P> + +<code> +See: +<A href=dpans16.htm#16.>16.</a> The optional Search-Order word set +</code> + +<P> + +<hr> +<A name=15.6.2.0830> +<code> +15.6.2.0830 <b>BYE</b> +</code> +</a> +<BR> +TOOLS EXT +<BR> +<pre> + ( -- ) +</pre> +<P> + +Return control to the host operating system, if any. +<P> + + +<hr> +<A name=15.6.2.0930> +<code> +15.6.2.0930 <b>CODE</b> +</code> +</a> +<BR> +TOOLS EXT +<BR> +<pre> + ( <B>"&lt;spaces&gt;name"</B> -- ) +</pre> +<P> + +Skip leading space delimiters. Parse name delimited by a space. Create +a definition for name, called a <B>code definition</B>, with the +execution semantics defined below. + +<P> + +Subsequent characters in the parse area typically represent source code +in a programming language, usually some form of assembly language. +Those characters are processed in an implementation-defined manner, +generating the corresponding machine code. The process continues, +refilling the input buffer as needed, until an implementation-defined +ending sequence is processed. + + +<PRE> + <i>name</i> Execution: ( i*x -- j*x ) +</PRE> +<P> + +Execute the machine code sequence that was generated following CODE. +<P> + +<code> +See: +<a href=dpansa15.htm#A.15.6.2.0930>A.15.6.2.0930 CODE</a> , +<A href=dpans3.htm#3.4.1>3.4.1</a> Parsing. +</code> + +<P> + +<hr> +<A name=15.6.2.1015> +<code> +15.6.2.1015 <b>CS-PICK</b> +</code> +</a> +<BR> +<B>c-s-pick</B> TOOLS EXT +<BR> +<P> +<pre> + Interpretation: Interpretation semantics for this word are undefined. +</pre> +<P> +<pre> + Execution: ( C: destu ... orig0|dest0 -- destu ... orig0|dest0 destu )( S: u -- ) +</pre> +<P> + +Remove u. Copy destu to the top of the control-flow stack. An +ambiguous condition exists if there are less than u+1 items, each of +which shall be an orig or dest, on the control-flow stack before CS-PICK +is executed. + +<P> + +If the control-flow stack is implemented using the data stack, u shall +be the topmost item on the data stack. + +<p> +<code> +See: +<a href=dpansa15.htm#A.15.6.2.1015>A.15.6.2.1015 CS-PICK</a> +</code> +<p> + + +<hr> +<A name=15.6.2.1020> +<code> +15.6.2.1020 <b>CS-ROLL</b> +</code> +</a> +<BR> +<B>c-s-roll</B> TOOLS EXT +<P> +<pre> + Interpretation: Interpretation semantics for this word are undefined. +</pre> +<P> +<pre> + Execution: ( C: origu|destu origu-1|destu-1 ... orig0|dest0 -- + origu-1|destu-1 ... orig0|dest0 origu|destu )( S: u -- ) +</pre> +<P> + +Remove u. Rotate u+1 elements on top of the control-flow stack so that +origu|destu is on top of the control-flow stack. An ambiguous condition +exists if there are less than u+1 items, each of which shall be an orig +or dest, on the control-flow stack before CS-ROLL is executed. + +<P> + +If the control-flow stack is implemented using the data stack, u shall +be the topmost item on the data stack. + +<p> +<code> +See: +<a href=dpansa15.htm#A.15.6.2.1020>A.15.6.2.1020 CS-ROLL</a> +</code> +<p> + + +<hr> +<A name=15.6.2.1300> +<code> +15.6.2.1300 <b>EDITOR</b> +</code> +</a> +<BR> +TOOLS EXT +<BR> +<pre> + ( -- ) +</pre> +<P> + +Replace the first word list in the search order with the EDITOR word +list. + +<P> + +<code> +See: +<A href=dpans16.htm#16.>16.</a> The Optional Search-Order Word Set +</code> + +<P> + +<hr> +<A name=15.6.2.1580> +<code> +15.6.2.1580 <b>FORGET</b> +</code> +</a> +<BR> +TOOLS EXT +<BR> +<pre> + ( <B>"&lt;spaces&gt;name"</B> -- ) +</pre> +<P> + +Skip leading space delimiters. Parse name delimited by a space. Find +name, then delete name from the dictionary along with all words added to +the dictionary after name. An ambiguous condition exists if name cannot +be found. + +<P> + +If the Search-Order word set is present, FORGET searches the compilation +word list. An ambiguous condition exists if the compilation word list +is deleted. + +<P> + +An ambiguous condition exists if FORGET removes a word required for +correct execution. + +<P> + +<b>Note:</b> This word is obsolescent and is included as a concession to +existing implementations. + +<P> + +<code> +See: +<a href=dpansa15.htm#A.15.6.2.1580>A.15.6.2.1580 FORGET</a> , +<A href=dpans3.htm#3.4.1>3.4.1</a> Parsing, +<a href=dpans6.htm#6.2.1850>6.2.1850 MARKER</a> +</code> +<P> + +<hr> +<A name=15.6.2.2250> +<code> +15.6.2.2250 <b>STATE</b> +</code> +</a> +<BR> +TOOLS EXT +<BR> +<pre> + ( -- a-addr ) +</pre> +<P> + +Extend the semantics of +<a href=dpans6.htm#6.1.2250>6.1.2250</a> STATE to allow +<a href=dpans15.htm#15.6.2.0470>;CODE</a> to change the +value in STATE. A program shall not directly alter the contents of +STATE. + +<P> + +<code> +See: +<A href=dpans3.htm#3.4>3.4</a> The Forth text interpreter, +<A href=dpans6.htm#6.1.0450>6.1.0450 :</a> , +<A href=dpans6.htm#6.1.0460>6.1.0460 ;</a> , +<A href=dpans6.htm#6.1.0670>6.1.0670 ABORT</a> , +<A href=dpans6.htm#6.1.2050>6.1.2050 QUIT</a> , +<A href=dpans6.htm#6.1.2500>6.1.2500 [</a> , +<A href=dpans6.htm#6.1.2540>6.1.2540 ]</a> , +<A href=dpans6.htm#6.2.0455>6.2.0455 :NONAME</a> +</code> + +<P> + +<hr> +<A name=15.6.2.2531> +<code> +15.6.2.2531 <b>[ELSE]</b> +</code> +</a> +<BR> +<B>bracket-else</B> TOOLS EXT +<BR> +<P> +<pre> + Compilation: Perform the execution semantics given below. +</pre> +<PRE> + Execution: ( <B>"&lt;spaces&gt;name"</b> ... -- ) +</PRE> +<P> + +Skipping leading spaces, parse and discard space-delimited words from +the parse area, including nested occurrences of +<a href=dpans15.htm#15.6.2.2532>[IF]</a> ... +<a href=dpans15.htm#15.6.2.2533>[THEN]</a> and +[IF] ... [ELSE] ... [THEN], until the word [THEN] has been parsed and +discarded. If the parse area becomes exhausted, it is refilled as with +<a href=dpans6.htm#6.2.2125>REFILL</a>. +[ELSE] is an immediate word. + +<P> + +<code> +See: +<A href=dpans3.htm#3.4.1>3.4.1</a> Parsing, +<a href=dpansa15.htm#A.15.6.2.2531>A.15.6.2.2531 [ELSE]</a> +</code> + +<P> + +<hr> +<A name=15.6.2.2532> +<code> +15.6.2.2532 <b>[IF]</b> +</code> +</a> +<BR> +<B>bracket-if</B> TOOLS EXT +<BR> +<P> +<pre> + Compilation: Perform the execution semantics given below. +</pre> +<P> +<pre> + Execution: ( flag | flag <B>"&lt;spaces&gt;name"</b> ... -- ) +</pre> +<P> + +If flag is true, do nothing. Otherwise, skipping leading spaces, parse +and discard space-delimited words from the parse area, including nested +occurrences of [IF] ... +<a href=dpans15.htm#15.6.2.2533>[THEN]</a> and [IF] ... +<a href=dpans15.htm#15.6.2.2531>[ELSE]</a> ... [THEN], until +either the word [ELSE] or the word [THEN] has been parsed and discarded. +If the parse area becomes exhausted, it is refilled as with +<a href=dpans6.htm#6.2.2125>REFILL</a>. +[IF] is an immediate word. + +<P> + +An ambiguous condition exists if [IF] is +<a href=dpans6.htm#6.1.2033>POSTPONE</a>d, or if the end of the +input buffer is reached and cannot be refilled before the terminating +[ELSE] or [THEN] is parsed. + +<P> + +<code> +See: +<A href=dpans3.htm#3.4.1>3.4.1</a> Parsing, +<a href=dpansa15.htm#A.15.6.2.2532>A.15.6.2.2532 [IF]</a> +</code> + +<P> + +<hr> +<A name=15.6.2.2533> +<code> +15.6.2.2533 <b>[THEN]</b> +</code> +</a> +<BR> +<B>bracket-then</B> TOOLS EXT +<BR> +<P> +<pre> + Compilation: Perform the execution semantics given below. +</pre> +<P> +<pre> + Execution: ( -- ) +</pre> +<P> + +Does nothing. [THEN] is an immediate word. +<P> +<code> +See: +<a href=dpansa15.htm#A.15.6.2.2533>A.15.6.2.2533 [THEN]</a> +</code> +<p> + +<hr> +<A href=dpans.htm#toc><IMG src="up.gif" ></A> Table of Contents +<BR> +<A href=dpans16.htm><IMG src="right.gif" ></A> +Next Section +<P> +</BODY> +</HTML> diff --git a/mwmouse/sources/AnsForth/DPANS16.HTM b/mwmouse/sources/AnsForth/DPANS16.HTM @@ -0,0 +1,683 @@ +<HTML><HEAD> +<TITLE>DPANS94</TITLE> +<link disabled rel="stylesheet" href="mpexc6.css"> +<style>@import url(mpexc6.css);</style> +</head> + +<BODY> +<table width=100%> +<tr> +<td align=left> +<a href=dpans15.htm><img src=left.gif + width=26 height=26 align=ALIGN border=0></a> +<a href=dpans17.htm><img src=right.gif + width=26 height=26 align=ALIGN border=0></a> +</td> +<td align=right> +<a href=dpans.htm#toc><img src=up.gif + width=26 height=26 align=ALIGN border=0></a> +<a name=16.>Table of Contents</a> +</td> +</tr> +</table> +<p> +<hr size=4> + +<H1>16. The optional Search-Order word set</H1> + +<p> +<code> +See: +<a href=dpansa16.htm>A.16</a> The optional Search-Order word set +</code> +<p> + +<hr> +<A name=16.1> +<H2>16.1 Introduction</H2> +</a> + +<hr> +<A name=16.2> +<H2>16.2 Additional terms and notation</H2> +</a> + +<DL><DT><B>compilation word list:</B> +<DD>The word list into which new definition names are +placed. + +<DT><B>search order:</B> +<DD>A list of word lists specifying the order in which the +dictionary will be searched.</DL> + +<p> +<code> +See: +<a href=dpansa16.htm#A.16.2>A.16.2</a> Additional terms +</code> +<p> + +<hr> +<A name=16.3> +<H2>16.3 Additional usage requirements</H2> +</a> + +<hr> +<A name=16.3.1> +<H3>16.3.1 Data types</H3> +</a> + +Word list identifiers are implementation-dependent single-cell values +that identify word lists. +<P> + +Append table 16.1 to +<a href=dpans3.htm#table.3.1>table 3.1</a>. +<P> + +Table 16.1 - Data types +<P> + +<PRE> +Symbol Data type Size on stack +------ --------- ------------- +wid word list identifiers 1 cell +</PRE> +<P> + +<code> +See: +<A href=dpans3.htm#3.1>3.1</a> Data types, +<A href=dpans3.htm#3.4.2>3.4.2</a> Finding definition names, +<A href=dpans3.htm#3.4>3.4</a> The Forth text interpreter. +</code> +<P> + +<hr> +<A name=16.3.2> +<H3>16.3.2 Environmental queries</H3> +</a> + +Append table 16.2 to table 3.5. +<P> + +<code> +See: +<A href=dpans3.htm#3.2.6>3.2.6</a> Environmental queries +</code> +<P> + +Table 16.2 - Environmental query strings +<P> + +<PRE> +String Value data type Constant? Meaning +------ --------------- --------- ------- +SEARCH-ORDER flag no search-order word set present +SEARCH-ORDER-EXT flag no search-order extensions word set present +WORDLISTS n yes maximum number of word lists usable + in the search order + +</PRE> + +<P> + +<hr> +<A name=16.3.3> +<H3>16.3.3 Finding definition names</H3> +</a> + +When searching a word list for a definition name, the system shall +search each word list from its last definition to its first. The search +may encompass only a single word list, as with +<a href=dpans16.htm#16.6.1.2192>SEARCH-WORDLIST</a>, or all +the word lists in the search order, as with the text interpreter and +<a href=dpans6.htm#6.1.1550>FIND</a>. + +<P> + +Changing the search order shall only affect the subsequent finding of +definition names in the dictionary. + +<P> + +A system with the Search-Order word set shall allow at least eight word +lists in the search order. + +<P> + +An ambiguous condition exists if a program changes the compilation word +list during the compilation of a definition or before modification of +the behavior of the most recently compiled definition with +<a href=dpans15.htm#15.6.2.0470>;CODE</a>, +<a href=dpans6.htm#6.1.1250>DOES></a>, +or +<a href=dpans6.htm#6.1.1710>IMMEDIATE</a>. + +<P> + +A program that requires more than eight word lists in the search order +has an environmental dependency. + +<P> + +<code> +See: +<A href=dpans3.htm#3.4.2>3.4.2</a> Finding definition names, +<a href=dpansa16.htm#A.16.3.3>A.16.3.3</a> Finding definition names. +</code> +<P> + +<hr> +<A name=16.3.4> +<H3>16.3.4 Contiguous regions</H3> +</a> + +The regions of data space produced by the operations described in +<a href=dpans3.htm#3.3.3.2>3.3.3.2</a> +Contiguous regions may be non-contiguous if +<a href=dpans16.htm#16.6.1.2460>WORDLIST</a> is executed +between allocations. + +<P> + +<hr> +<A name=16.4> +<H2>16.4 Additional documentation requirements</H2> +</a> + +<hr> +<A name=16.4.1> +<H3>16.4.1 System documentation</H3> +</a> + +<hr> +<A name=16.4.1.1> +<H4>16.4.1.1 Implementation-defined options</H4> +</a> + +<UL> +<LI>maximum number of word lists in the search order +(<a href=dpans16.htm#16.3.3>16.3.3</a> Finding definition names, +<a href=dpans16.htm#16.6.1.2197>16.6.1.2197</a> SET-ORDER); +<LI>minimum search order +(<a href=dpans16.htm#16.6.1.2197>16.6.1.2197</a> SET-ORDER, +<a href=dpans16.htm#16.6.2.1965>16.6.2.1965</a> ONLY). +</UL> +<P> + +<hr> +<A name=16.4.1.2> +<H4>16.4.1.2 Ambiguous conditions</H4> +</a> + +<UL> +<LI>changing the compilation word list +(<a href=dpans16.htm#16.3.3>16.3.3</a> Finding definition names); +<LI>search order empty +(<a href=dpans16.htm#16.6.2.2037>16.6.2.2037</a> PREVIOUS); +<LI>too many word lists in search order +(<a href=dpans16.htm#16.6.2.0715>16.6.2.0715</a> ALSO). +</ul> + +<hr> +<a name=16.4.1.3> +<h4>16.4.1.3 Other system documentation</h4> +</a> +<ul> +<li>no additional requirements. +</ul> + + +<hr> +<a name=16.4.2> +<h3>16.4.2 Program documentation</h3> +</a> + + +<hr> +<A name=16.4.2.1> +<H4>16.4.2.1 Environmental dependencies</H4> +</a> + +<UL> +<LI>requiring more than eight word-lists in the search order +(<a href=dpans16.htm#16.3.3>16.3.3</a> Finding definition names). +</UL> + + +<hr> +<A name=16.4.2.2> +<H4>16.4.2.2 Other program documentation</H4> +</a> + +<UL> +<LI>no additional requirements. +</UL> + +<hr> +<A name=16.5> +<H2>16.5 Compliance and labeling</H2> +</a> + +<hr> +<A name=16.5.1> +<H3>16.5.1 ANS Forth systems</H3> +</a> + +The phrase <B>Providing the Search-Order word set</B> shall be appended +to the label of any Standard System that provides all of the +Search-Order word set. + +<P> + +The phrase <B>Providing name(s) from the Search-Order Extensions word +set</B> shall be appended to the label of any Standard System that +provides portions of the Search-Order Extensions word set. + +<P> + +The phrase <B>Providing the Search-Order Extensions word set</B> shall +be appended to the label of any Standard System that provides all of the +Search-Order and Search-Order Extensions word sets. + +<P> + +<hr> +<A name=16.5.2> +<H3>16.5.2 ANS Forth programs</H3> +</a> + +The phrase <B>Requiring the Search-Order word set</B> shall be appended +to the label of Standard Programs that require the system to provide the +Search-Order word set. + +<P> + +The phrase <B>Requiring name(s) from the Search-Order Extensions word +set</B> shall be appended to the label of Standard Programs that require +the system to provide portions of the Search-Order Extensions word set. + +<P> + +The phrase <B>Requiring the Search-Order Extensions word set</B> shall +be appended to the label of Standard Programs that require the system to +provide all of the Search-Order and Search-Order Extensions word sets. + +<P> + +<hr> +<A name=16.6> +<H2>16.6 Glossary</H2> +</a> + +<hr> +<A name=16.6.1> +<H3>16.6.1 Search-Order words</H3> +</a> + +<hr> +<A name=16.6.1.1180> +<code> +16.6.1.1180 <b>DEFINITIONS</b> +</code> +</a> +<BR> +SEARCH +<BR> +<pre> + ( -- ) +</pre> +<P> + +Make the compilation word list the same as the first word list in the +search order. Specifies that the names of subsequent definitions will +be placed in the compilation word list. Subsequent changes in the +search order will not affect the compilation word list. + +<P> + +<code> +See: +<A href=dpans16.htm#16.3.3>16.3.3</a> Finding Definition Names +</code> + +<P> + +<hr> +<A name=16.6.1.1550> +<code> +16.6.1.1550 <b>FIND</b> +</code> +</a> +<BR> +SEARCH +<BR> +<P> + +Extend the semantics of +<a href=dpans6.htm#6.1.1550>6.1.1550</a> FIND to be: +<P> + +<pre> + ( c-addr -- c-addr 0 | xt 1 | xt -1 ) +</pre> +<P> + +Find the definition named in the counted string at c-addr. If the +definition is not found after searching all the word lists in the search +order, return c-addr and zero. If the definition is found, return xt. +If the definition is immediate, also return one (1); otherwise also +return minus-one (-1). For a given string, the values returned by FIND +while compiling may differ from those returned while not compiling. + +<P> + +<code> +See: +<A href=dpans3.htm#3.4.2>3.4.2</a> Finding definition names, +<A href=dpans6.htm#6.1.0070>6.1.0070 '</a> , +<A href=dpans6.htm#6.1.2033>6.1.2033 POSTPONE</a> , +<A href=dpans6.htm#6.1.2510>6.1.2510 [']</a> , +<A href=dpansd.htm#D.6.7>D.6.7</a> Immediacy. +</code> + +<P> + +<hr> +<A name=16.6.1.1595> +<code> +16.6.1.1595 <b>FORTH-WORDLIST</b> +</code> +</a> +<BR> +SEARCH +<BR> +<pre> + ( -- wid ) +</pre> +<P> + +Return wid, the identifier of the word list that includes all standard +words provided by the implementation. This word list is initially the +compilation word list and is part of the initial search order. + +<P> + +<hr> +<A name=16.6.1.1643> +<code> +16.6.1.1643 <b>GET-CURRENT</b> +</code> +</a> +<BR> +SEARCH +<BR> +<pre> + ( -- wid ) +</pre> +<P> + +Return wid, the identifier of the compilation word list. +<P> + +<hr> +<A name=16.6.1.1647> +<code> +16.6.1.1647 <b>GET-ORDER</b> +</code> +</a> +<BR> +SEARCH +<BR> +<pre> + ( -- widn ... wid1 n ) +</pre> +<P> + +Returns the number of word lists n in the search order and the word list +identifiers widn ... wid1 identifying these word lists. wid1 +identifies the word list that is searched first, and widn the word list +that is searched last. The search order is unaffected. + +<P> +<code> +See: +<a href=a0002.htm>RFI 0002</a> +</code> +<p> + +<hr> +<A name=16.6.1.2192> +<code> +16.6.1.2192 <b>SEARCH-WORDLIST</b> +</code> +</a> +<BR> +SEARCH +<BR> +<pre> + ( c-addr u wid -- 0 | xt 1 | xt -1 ) +</pre> +<P> + +Find the definition identified by the string c-addr u in the word list +identified by wid. If the definition is not found, return zero. If the +definition is found, return its execution token xt and one (1) if the +definition is immediate, minus-one (-1) otherwise. + +<p> +<code> +See: +<a href=dpansa16.htm#A.16.6.1.2192>A.16.6.1.2192 SEARCH-WORDLIST</a> +</code> +<p> + +<hr> +<A name=16.6.1.2195> +<code> +16.6.1.2195 <b>SET-CURRENT</b> +</code> +</a> +<BR> +SEARCH +<BR> +<pre> + ( wid -- ) +</pre> +<P> + +Set the compilation word list to the word list identified by wid. + +<P> + +<hr> +<A name=16.6.1.2197> +<code> +16.6.1.2197 <b>SET-ORDER</b> +</code> +</a> +<BR> +SEARCH +<BR> +<pre> + ( widn ... wid1 n -- ) +</pre> +<P> + +Set the search order to the word lists identified by widn ... wid1. +Subsequently, word list wid1 will be searched first, and word list widn +searched last. If n is zero, empty the search order. If n is minus +one, set the search order to the implementation-defined minimum search +order. The minimum search order shall include the words +<a href=dpans16.htm#16.6.1.1595>FORTH-WORDLIST</a> +and SET-ORDER. A system shall allow n to be at least eight. + +<P> +<code> +See: +<a href=a0002.htm>RFI 0002</a> +</code> +<P> + +<hr> +<A name=16.6.1.2460> +<code> +16.6.1.2460 <b>WORDLIST</b> +</code> +</a> +<BR> +SEARCH +<BR> +<pre> + ( -- wid ) +</pre> +<P> + +Create a new empty word list, returning its word list identifier wid. +The new word list may be returned from a pool of preallocated word lists +or may be dynamically allocated in data space. A system shall allow the +creation of at least 8 new word lists in addition to any provided as +part of the system. + +<P> + +<hr> +<A name=16.6.2> +<H3>16.6.2 Search-Order extension words</H3> +</a> + + +<hr> +<A name=16.6.2.0715> +<code> +16.6.2.0715 <b>ALSO</b> +</code> +</a> +<BR> +SEARCH EXT +<BR> +<pre> + ( -- ) +</pre> +<P> + +Transform the search order consisting of widn, ... wid2, wid1 (where +wid1 is searched first) into widn, ... wid2, wid1, wid1. An ambiguous +condition exists if there are too many word lists in the search order. + +<p> +<code> +See: +<a href=dpansa16.htm#A.16.6.2.0715>A.16.6.2.0715 ALSO</a> , +<a href=a0002.htm>RFI 0002</a> +</code> +<p> + + +<hr> +<A name=16.6.2.1590> +<code> +16.6.2.1590 <b>FORTH</b> +</code> +</a> +<BR> +SEARCH EXT +<BR> +<pre> + ( -- ) +</pre> +<P> + +Transform the search order consisting of widn, ... wid2, wid1 (where +wid1 is searched first) into widn, ... wid2, +wid <a href=dpans16.htm#16.6.1.1595>FORTH-WORDLIST</a>. + +<P> + +<hr> +<A name=16.6.2.1965> +<code> +16.6.2.1965 <b>ONLY</b> +</code> +</a> +<BR> +SEARCH EXT +<BR> +<pre> + ( -- ) +</pre> +<P> + +Set the search order to the implementation-defined minimum search order. +The minimum search order shall include the words +<a href=dpans16.htm#16.6.1.1595>FORTH-WORDLIST</a> and +<a href=dpans16.htm#16.6.1.2197>SET-ORDER</a>. + +<P> +<code> +See: +<a href=a0002.htm>RFI 0002</a> +</code> +<p> + +<hr> +<A name=16.6.2.1985> +<code> +16.6.2.1985 <b>ORDER</b> +</code> +</a> +<BR> +SEARCH EXT +<BR> +<pre> + ( -- ) +</pre> +<P> + +Display the word lists in the search order in their search order +sequence, from first searched to last searched. Also display the word +list into which new definitions will be placed. The display format is +implementation dependent. + +<P> + +ORDER may be implemented using pictured numeric output words. +Consequently, its use may corrupt the transient region identified by +<a href=dpans6.htm#6.1.0040>#&gt;</a>. +<P> + +<code> +See: +<A href=dpans3.htm#3.3.3.6>3.3.3.6</a> Other Transient Regions +</code> +<P> + +<hr> +<A name=16.6.2.2037> +<code> +16.6.2.2037 <b>PREVIOUS</b> +</code> +</a> +<BR> +SEARCH EXT +<BR> +<pre> + ( -- ) +</pre> +<P> + +Transform the search order consisting of widn, ... wid2, wid1 (where +wid1 is searched first) into widn, ... wid2. An ambiguous condition +exists if the search order was empty before PREVIOUS was executed. + +<P> + +<hr> +<A href=dpans.htm#toc><IMG src="up.gif" ></A> Table of Contents +<BR> +<A href=dpans17.htm><IMG src="right.gif" ></A> +Next Section +<P> +</BODY> +</HTML> diff --git a/mwmouse/sources/AnsForth/DPANS17.HTM b/mwmouse/sources/AnsForth/DPANS17.HTM @@ -0,0 +1,374 @@ +<HTML> +<HEAD> +<TITLE>DPANS94</TITLE> +<link disabled rel="stylesheet" href="mpexc6.css"> +<style>@import url(mpexc6.css);</style> +</head> +<body> +<table width=100%> +<tr> +<td align=left> +<a href=dpans16.htm><img src=left.gif + width=26 height=26 align=ALIGN border=0></a> +<a href=dpansa1.htm><img src=right.gif + width=26 height=26 align=ALIGN border=0></a> +</td> +<td align=right> +<a href=dpans.htm#toc><img src=up.gif + width=26 height=26 align=ALIGN border=0></a> +<a name=17.>Table of Contents</a> +</td> +</tr> +</table> +<p> +<hr size=4> + + +<H1>17. The optional String word set</H1> + + +<hr> +<A name=17.1> +<H2>17.1 Introduction</H2> +</a> + + +<hr> +<A name=17.2> +<H2>17.2 Additional terms and notation</H2> +</a> + +None. +<P> + + +<hr> +<A name=17.3> +<H2>17.3 Additional usage requirements</H2> +</a> + +Append table 17.1 to table 3.5. +<P> + +<code> +See: +<A href=dpans3.htm#3.2.6>3.2.6</a> Environmental queries +</code> +<P> + +Table 17.1 - Environmental query strings + + +<PRE> +String Value data type Constant? Meaning +------ --------------- --------- ------- +STRING flag no string word set present +STRING-EXT flag no string extensions word set present +</PRE> +<P> + + +<hr> +<A name=17.4> +<H2>17.4 Additional documentation requirements</H2> +</a> + +None. +<P> + +<hr> +<A name=17.5> +<H2>17.5 Compliance and labeling</H2> +</a> + +<hr> +<A name=17.5.1> +<H3>17.5.1 ANS Forth systems</H3> +</a> + +The phrase <B>Providing the String word set</B> shall be appended to the +label of any Standard System that provides all of the String word set. +<P> + +The phrase <B>Providing name(s) from the String Extensions word set</B> +shall be appended to the label of any Standard System that provides +portions of the String Extensions word set. +<P> + +The phrase <B>Providing the String Extensions word set</B> shall be +appended to the label of any Standard System that provides all of the +String and String Extensions word sets. +<P> + + +<hr> +<A name=17.5.2> +<H3>17.5.2 ANS Forth programs</H3> +</a> + +The phrase <B>Requiring the String word set</B> shall be appended to the +label of Standard Programs that require the system to provide the String +word set. + +<P> + +The phrase <B>Requiring name(s) from the String Extensions word set</B> +shall be appended to the label of Standard Programs that require the +system to provide portions of the String Extensions word set. + +<P> + +The phrase <B>Requiring the String Extensions word set</B> shall be +appended to the label of Standard Programs that require the system to +provide all of the String and String Extensions word sets. + + +<P> + +<hr> +<A name=17.6> +<H2>17.6 Glossary</H2> +</a> + + +<hr> +<A name=17.6.1> +<H3>17.6.1 String words</H3> +</a> + + +<hr> +<A name=17.6.1.0170> +<code> +17.6.1.0170 <b>-TRAILING</b> +</code> +</a> +<BR> +<B>dash-trailing</B> STRING +<BR> +<pre> + ( c-addr u1 -- c-addr u2 ) +</pre> +<P> + +If u1 is greater than zero, u2 is equal to u1 less the number of spaces +at the end of the character string specified by c-addr u1. If u1 is +zero or the entire string consists of spaces, u2 is zero. + +<P> + +<hr> +<A name=17.6.1.0245> +<code> +17.6.1.0245 <b>/STRING</b> +</code> +</a> +<BR> +<B>slash-string</B> STRING +<BR> +<pre> + ( c-addr1 u1 n -- c-addr2 u2 ) +</pre> +<P> + +Adjust the character string at c-addr1 by n characters. The resulting +character string, specified by c-addr2 u2, begins at c-addr1 plus n +characters and is u1 minus n characters long. + +<P> +<code> +See: +<a href=dpansa17.htm#A.17.6.1.0245>A.17.6.1.0245 /STRING</a> +</code> +<p> + +<hr> +<A name=17.6.1.0780> +<code> +17.6.1.0780 <b>BLANK</b> +</code> +</a> +<BR> +STRING +<BR> +<pre> + ( c-addr u -- ) +</pre> +<P> + +If u is greater than zero, store the character value for space in u +consecutive character positions beginning at c-addr. +<P> + +<hr> +<A name=17.6.1.0910> +<code> +17.6.1.0910 <b>CMOVE</b> +</code> +</a> +<BR> +<B>c-move</B> STRING +<BR> +<pre> + ( c-addr1 c-addr2 u -- ) +</pre> +<P> + +If u is greater than zero, copy u consecutive characters from the data +space starting at c-addr1 to that starting at c-addr2, proceeding +character-by-character from lower addresses to higher addresses. + +<P> +<code> +See: +<a href=dpansa17.htm#A.17.6.1.0910>A.17.6.1.0910 CMOVE</a> , +<a href=dpans17.htm#17.6.1.0920>17.6.1.0920 CMOVE&gt;</a> +</code> +<p> + + +<hr> +<A name=17.6.1.0920> +<code> +17.6.1.0920 <b>CMOVE&gt;</b> +</code> +</a> +<BR> +<B>c-move-up</B> STRING +<BR> +<pre> + ( c-addr1 c-addr2 u -- ) +</pre> +<P> + +If u is greater than zero, copy u consecutive characters from the data +space starting at c-addr1 to that starting at c-addr2, proceeding +character-by-character from higher addresses to lower addresses. + +<P> +<code> +See: +<a href=dpans17.htm#17.6.1.0910>17.6.1.0910 CMOVE</a> , +<a href=dpansa17.htm#A.17.6.1.0920>A.17.6.1.0920 CMOVE&gt;</a> +</code> +<p> + + +<hr> +<A name=17.6.1.0935> +<code> +17.6.1.0935 <b>COMPARE</b> +</code> +</a> +<BR> +STRING +<BR> +<pre> + ( c-addr1 u1 c-addr2 u2 -- n ) +</pre> +<P> + +Compare the string specified by c-addr1 u1 to the string specified by +c-addr2 u2. The strings are compared, beginning at the given addresses, +character by character, up to the length of the shorter string or until +a difference is found. If the two strings are identical, n is zero. If +the two strings are identical up to the length of the shorter string, n +is minus-one (-1) if u1 is less than u2 and one (1) otherwise. If the +two strings are not identical up to the length of the shorter string, n +is minus-one (-1) if the first non-matching character in the string +specified by c-addr1 u1 has a lesser numeric value than the +corresponding character in the string specified by c-addr2 u2 and one +(1) otherwise. + +<P> +<code> +See: +<a href=dpansa17.htm#A.17.6.1.0935>A.17.6.1.0935 COMPARE</a> +</code> +<p> + + +<hr> +<A name=17.6.1.2191> +<code> +17.6.1.2191 <b>SEARCH</b> +</code> +</a> +<BR> +STRING +<BR> +<pre> + ( c-addr1 u1 c-addr2 u2 -- c-addr3 u3 flag ) +</pre> +<P> + +Search the string specified by c-addr1 u1 for the string specified by +c-addr2 u2. If flag is true, a match was found at c-addr3 with u3 +characters remaining. If flag is false there was no match and c-addr3 +is c-addr1 and u3 is u1. + +<P> +<code> +See: +<a href=dpansa17.htm#A.17.6.1.2191>A.17.6.1.2191 SEARCH</a> +</code> +<p> + + +<hr> +<A name=17.6.1.2212> +<code> +17.6.1.2212 <b>SLITERAL</b> +</code> +</a> +<BR> +STRING +<BR> +<P> +<pre> + Interpretation: Interpretation semantics for this word are undefined. +</pre> +<PRE> + Compilation: ( c-addr1 u -- ) +</PRE> + +<P> + +Append the run-time semantics given below to the current definition. +<P> + + +<PRE> + Run-time: ( -- c-addr2 u ) +</PRE> +<P> + +Return c-addr2 u describing a string consisting of the characters +specified by c-addr1 u during compilation. A program shall not alter +the returned string. + +<P> +<code> +See: +<a href=dpansa17.htm#A.17.6.1.2212>A.17.6.1.2212 SLITERAL</a> +</code> +<p> + + +<hr> +<A name=17.6.2> +<H3>17.6.2 String extension words</H3> +</a> + +None +<P> + + +<A href=dpans.htm#toc><IMG src="up.gif" ></A> +Table of Contents +<BR> +<A href=dpansa1.htm><IMG src="right.gif" ></A> +Next Section +<P> +</BODY> +</HTML> diff --git a/mwmouse/sources/AnsForth/DPANS2.HTM b/mwmouse/sources/AnsForth/DPANS2.HTM @@ -0,0 +1,536 @@ +<HTML><HEAD> +<TITLE>DPANS94</TITLE> +<link disabled rel="stylesheet" href="mpexc6.css"> +<style>@import url(mpexc6.css);</style> +</head> + +<BODY> +<table width=100%> +<tr> +<td align=left> +<a href=dpans1.htm><img src=left.gif + width=26 height=26 align=ALIGN border=0></a> +<a href=dpans3.htm><img src=right.gif + width=26 height=26 align=ALIGN border=0></a> +</td> +<td align=right> +<a href=dpans.htm#toc><img src=up.gif + width=26 height=26 align=ALIGN border=0></a> +<a name=2.>Table of Contents</a> +</td> +</tr> +</table> +<p> +<hr size=4> + +<H1>2. Terms, notation, and references</H1> + +The phrase <B>See:</B> is used throughout this Standard to direct the reader to +other sections of the Standard that have a direct bearing on the current +section. + +<P> + +In this Standard, <B>shall</B> states a requirement on a system or +program; conversely, <B>shall not</B> is a prohibition; <B>need not</B> +means <B>is not required to</B>; <B>should</B> describes a +recommendation of the Standard; and <B>may</B>, depending on context, +means <B>is allowed to</B> or <B>might happen</B>. + +<P> + +Throughout the Standard, +typefaces are used in the following manner: + +<UL> +<LI>This proportional +serif typeface is used for text, with italic used +for symbols and the first appearance of new terms; +<LI>A bold +proportional sans-serif typeface is used for headings; +<LI>A bold +monospaced serif typeface is used for Forth-language text. +</UL> + +<P> + +<hr> +<A name=2.1> +<H2>2.1 Definitions of terms</H2> +</a> + +Terms defined in this section are used generally throughout this Standard. +Additional terms specific to individual word sets are defined in those word +sets. Other terms are defined at their first appearance, indicated by italic +type. Terms not defined in this Standard are to be construed according to the +Dictionary for Information Systems, ANSI X3.172-1990. + +<P> + +<DL><DT><B>address unit:</B> <DD>Depending on context, either 1) the units +into which a Forth +address space is divided for the purposes of locating data objects such as +characters and variables; 2) the physical memory storage elements +corresponding to those units; 3) the contents of such a memory storage +element; or 4) the units in which the length of a region of memory is +expressed. + +<DT><B>aligned address:</B> <DD>The address of a memory location at which a +character, cell, +cell pair, or double-cell integer can be accessed. + +<DT><B>ambiguous condition:</B> <DD>A circumstance for which this Standard +does not +prescribe a specific behavior for Forth systems and programs. + +<P> + +Ambiguous conditions include such things as the absence of a needed delimiter +while parsing, attempted access to a nonexistent file, or attempted use of a +nonexistent word. An ambiguous condition also exists when a Standard word is +passed values that are improper or out of range. + +<DT><B>cell:</B> +<DD>The primary unit of information in the architecture of a Forth system. + +<DT><B>cell pair:</B> +<DD>Two cells that are treated as a single unit. + +<DT><B>character:</B> +<DD>Depending on context, either 1) a storage unit capable of holding +a character; or 2) a member of a character set. + +<DT><B>character-aligned address:</B> +<DD>The address of a memory location at which a +character can be accessed. + +<DT><B>character string:</B> +<DD>Data space that is associated with a sequence of +consecutive character-aligned addresses. Character strings usually +contain text. Unless otherwise indicated, the term <B>string</B> means +<B>character string</B>. + +<DT><B>code space:</B> +<DD>The logical area of the dictionary in which word semantics are +implemented. + +<DT><B>compile:</B> +<DD>To transform +source code into dictionary definitions. + +<DT><B>compilation semantics:</B> +<DD>The behavior of a Forth definition when its name is +encountered by the text interpreter in compilation state. + +<DT><B>counted string:</B> +<DD>A data structure consisting of one character containing a +length followed by zero or more contiguous data characters. Normally, counted +strings contain text. + +<DT><B>cross compiler:</B> +<DD>A system that compiles a program for later execution in +an environment that may be physically and logically different from the +compiling environment. In a cross compiler, the term <B>host</B> +applies to the compiling environment, and the term <B>target</B> applies +to the run-time environment. + +<DT><B>current definition:</B> +<DD>The definition whose compilation has been started but not +yet ended. + +<DT><B>data field:</B> +<DD>The data space +associated with a word defined via +<a href=dpans6.htm#6.1.1000>CREATE</a>. + +<DT><B>data space:</B> +<DD>The logical +area of the dictionary that can be accessed. + +<DT><B>data-space pointer:</B> +<DD>The address of the next available data space location, +i.e., the value returned by +<a href=dpans6.htm#6.1.1650>HERE</a>. + +<DT><B>data stack:</B> +<DD>A stack that may be used for passing parameters between +definitions. When there is no possibility of confusion, the data stack is +referred to as <B>the stack</B>. Contrast with return stack. + +<DT><B>data type:</B> +<DD>An identifier +for the set of values that a data object may have. + +<DT><B>defining word:</B> +<DD>A Forth word +that creates a new definition when executed. + +<DT><B>definition:</B> +<DD>A Forth execution +procedure compiled into the dictionary. + +<DT><B>dictionary:</B> +<DD>An extensible structure that contains definitions and associated +data space. + +<DT><B>display:</B> +<DD>To send one or more +characters to the user output device. + +<DT><B>environmental dependencies:</B> +<DD>A program's implicit assumptions about a Forth +system's implementation options or underlying hardware. For example, a +program that assumes a cell size greater than 16 bits is said to have an +environmental dependency. + +<DT><B>execution semantics:</B> +<DD>The behavior +of a Forth definition when it is executed. + +<DT><B>execution token:</B> +<DD>A value that identifies the execution semantics of a +definition. + +<DT><B>find:</B> +<DD>To search the +dictionary for a definition name matching a given string. + +<DT><B>immediate word:</B> +<DD>A Forth word whose compilation semantics are to perform its +execution semantics. + +<DT><B>implementation defined:</B> +<DD>Denotes system behaviors or features that must be +provided and documented by a system but whose further details are not +prescribed by this Standard. + +<DT><B>implementation dependent:</B> +<DD>Denotes system behaviors or features that must be +provided by a system but whose further details are not prescribed by this +Standard. + +<DT><B>input buffer:</B> +<DD>A region of memory containing the sequence of characters from +the input source that is currently accessible to a program. + +<DT><B>input source:</B> +<DD>The device, file, block, or other entity that supplies +characters to refill the input buffer. + +<DT><B>input source specification:</B> +<DD>A set of information describing a particular +state of the input source, input buffer, and parse area. This information is +sufficient, when saved and restored properly, to enable the nesting of parsing +operations on the same or different input sources. + +<DT><B>interpretation semantics:</B> +<DD>The behavior of a Forth definition when its name is +encountered by the text interpreter in interpretation state. + +<dt><b>initiation semantics:</b> +<dd>The behavior of a Forth definition, or of the portion of a Forth definition +following <a href=dpans6.htm#6.1.1250>DOES></a>, when it begins execution. + +<DT><B>keyboard event:</B> +<DD>A value received by the system denoting a user action at the +user input device. The term <B>keyboard</B> in this document does not exclude +other types of user input devices. + +<DT><B>line:</B> +<DD>A sequence of characters followed by an actual or implied line +terminator. + +<DT><B>name space:</B> +<DD>The logical area of the dictionary in which definition names are +stored. + +<DT><B>number:</B> +<DD>In this Standard, <B>number</B> used without other qualification +means <B>integer</B>. Similarly, <B>double number</B> means +<B>double-cell integer</B>. + +<DT><B>parse:</B> +<DD>To select and exclude a character string from the parse area using a +specified set of delimiting characters, called delimiters. + +<DT><B>parse area:</B> +<DD>The portion of the input buffer that has not yet been parsed, and +is thus available to the system for subsequent processing by the text +interpreter and other parsing operations. + +<DT><B>pictured-numeric output:</B> +<DD>A number display format in which the number is +converted using Forth words that resemble a symbolic <B>picture</B> of +the desired output. + +<DT><B>program:</B> +<DD>A complete specification of execution to achieve a specific function +(application task) expressed in Forth source code form. + +<DT><B>receive:</B> +<DD>To obtain characters +from the user input device. + +<DT><B>return stack:</B> +<DD>A stack that may be used for program execution nesting, do-loop +execution, temporary storage, and other purposes. + +<DT><B>standard word:</B> +<DD>A named Forth +procedure, formally specified in this Standard. + +<DT><B>user input device:</B> +<DD>The input device currently selected as the source of +received data, typically a keyboard. + +<DT><B>user output device:</B> +<DD>The output device currently selected as the destination +of display data. + +<DT><B>variable:</B> +<DD>A named region of data space located and accessed by its memory +address. + +<DT><B>word:</B> +<DD>Depending on context, either 1) the name of a Forth definition; or 2) a +parsed sequence of non-space characters, which could be the name of a Forth +definition. + +<DT><B>word list:</B> +<DD>A list of associated Forth definition names that may be examined +during a dictionary search. + +<DT><B>word set:</B> +<DD>A set of Forth definitions grouped together in this Standard under +a name indicating some shared aspect, typically their common functional +area.</DL> + +<p> +<code> +See: +<a href=dpansa2.htm#A.2.1>A.2.1</a> Definition of terms, +<a href=a0005.htm>RFI 0005</a> Initiation semantics, +<a href=a0007.htm>RFI 0007</a> Distinction between <em>immediacy</em> and <em>special compilation semantics</em>. +</code> +<p> + +<hr> +<A name=2.2> +<H3>2.2 Notation</H3> +</a> + + + +<hr> +<A name=2.2.1> +<H3>2.2.1 Numeric notation</H3> +</a> + +Unless otherwise stated, all references to numbers apply to signed single-cell +integers. The inclusive range of values is shown as {from...to}. The +allowable range for the contents of an address is shown in double braces, +particularly for the contents of variables, e.g., +<a href=dpans6.htm#6.1.0750>BASE</a> {{2...36}}. + +<P> + +<hr> +<A name=2.2.2> +<H3>2.2.2 Stack notation</H3> +</a> + +Stack parameters input to and output from a definition are described using the +notation: + + +<PRE> + +( stack-id before -- after ) + +</PRE> + +<P> + +where stack-id specifies which stack is being described, before represents the +stack-parameter data types before execution of the definition and after +represents them after execution. The symbols used in before and after are +shown in +<a href=dpans3.htm#table.3.1>table 3.1</a>. + +<P> + +The control-flow-stack stack-id is <B>C:</B>, the data-stack stack-id is +<B>S:</B>, and the return-stack stack-id is <B>R:</B>. When there is no +confusion, the data-stack stack-id may be omitted. + +<P> + +When there are alternate after representations, they are described by +<B>after1 | after2</B>. The top of the stack is to the right. Only +those stack items required for or provided by execution of the +definition are shown. + +<p> +<code> +See: +<a href=dpansa2.htm#A.2.2.2>A.2.2.2</a> Stack notation +</code> +<p> + + +<hr> +<A name=2.2.3> +<H3>2.2.3 Parsed-text notation</H3> +</a> + +If, in addition to using stack parameters, a definition parses text, +that text is specified by an abbreviation from table 2.1, shown +surrounded by double-quotes and placed between the before parameters and +the <B>--</B> separator in the first stack described, e.g., + + +<PRE> +( S: before <B>"parsed-text-abbreviation"</B> -- after ). +</PRE> + +<P> + +<a name=table.2.1> +Table 2.1 - Parsed text abbreviations +</a> + +<P> + + +<PRE> +Abbreviation Description +------------ ----------- +&lt;char&gt; the delimiting character marking the end of the + string being parsed +&lt;chars&gt; zero or more consecutive occurrences of the + character char +&lt;space&gt; a delimiting space character +&lt;spaces&gt; zero or more consecutive occurrences of the + character space +&lt;quote&gt; a delimiting double quote +&lt;paren&gt; a delimiting right parenthesis +&lt;eol&gt; an implied delimiter marking the end of a line +ccc a parsed sequence of arbitrary characters, + excluding the delimiter character +name a token delimited by space, equivalent to + ccc&lt;space&gt; or ccc&lt;eol&gt; +</PRE> + +<P> + +<hr> +<A name=2.2.4> +<H3>2.2.4 Glossary notation</H3> +</a> + +The glossary entries for each word set are listed in the standard ASCII +collating sequence. Each glossary entry specifies an ANS Forth word and +consists of two parts: an index line and the semantic description of the +definition. + +<P> + +<hr> +<A name=2.2.4.1> +<H4>2.2.4.1 Glossary index line</H4> +</a> + +The index line is a single-line entry containing, from left to right: +<P> + +<UL> +<LI>Section number, +the last four digits of which assign a unique +sequential number to all words included in this Standard; +<LI>DEFINITION-NAME +in upper-case, mono-spaced, bold-face letters; +<LI>Natural-language +pronunciation in quotes if it differs from English; +<LI>Word-set +designator from table 2.2. The designation for extensions +word sets includes <B>EXT</B>. +</UL> + +<P> + +<a name=table.2.2> +Table 2.2 - Word set designators +</a> +<P> + + +<PRE> +Word set Designator +-------- ---------- +<a href=dpans6.htm>Core word set</a> CORE +<a href=dpans7.htm>Block word set</a> BLOCK +<a href=dpans8.htm>Double-Number word set</a> DOUBLE +<a href=dpans9.htm>Exception word set</a> EXCEPTION +<a href=dpans10.htm>Facility word set</a> FACILITY +<a href=dpans11.htm>File-Access word set</a> FILE +<a href=dpans12.htm>Floating-Point word set</a> FLOATING +<a href=dpans13.htm>Locals word set</a> LOCALS +<a href=dpans14.htm>Memory-Allocation word set</a> MEMORY +<a href=dpans15.htm>Programming-Tools word set</a> TOOLS +<a href=dpans16.htm>Search-Order word set</a> SEARCH +<a href=dpans17.htm>String-Handling word set</a> STRING +</PRE> + +<P> + +<hr> +<A name=2.2.4.2> +<H4>2.2.4.2 Glossary semantic description</H4> +</a> + +The first paragraph of the semantic description contains a stack notation for +each stack affected by execution of the word. The remaining paragraphs +contain a text description of the semantics. See +<a href=dpans3.htm#3.4.3>3.4.3</a> Semantics. + +<P> + +<hr> +<A name=2.3> +<H2>2.3 References</H2> +</a> + +The following national and international standards are referenced in this +Standard: + +<P> + +ANSI X3.172-1990, Dictionary for information systems +(<a href=dpans2.htm#2.1>2.1</a> Definition of terms); + +<P> + +ANSI X3.4-1974, American Standard Code for Information Interchange +(ASCII) +(<a href=dpans3.htm#3.1.2.1>3.1.2.1</a> Graphic characters); + +<P> + +ISO 646-1983, ISO 7-bit coded characterset for information +interchange, International Reference Version (IRV) +(<a href=dpans3.htm#3.1.2.1>3.1.2.1</a> Graphic characters); + +<P> + +ANSI/IEEE 754-1985, Floating-point standard +(<a href=dpans12.htm#12.2.1>12.2.1</a> Definition of terms). + + +<hr> +<A href=dpans.htm#toc><IMG src="up.gif" ></A> Table of Contents +<BR> +<A href=dpans3.htm><IMG src="right.gif" ></A> +Next Section +<P> +</BODY> +</HTML> diff --git a/mwmouse/sources/AnsForth/DPANS3.HTM b/mwmouse/sources/AnsForth/DPANS3.HTM @@ -0,0 +1,1781 @@ +<HTML><HEAD> +<TITLE>DPANS94</TITLE> +<link disabled rel="stylesheet" href="mpexc6.css"> +<style>@import url(mpexc6.css);</style> +</head> + +<BODY> +<table width=100%> +<tr> +<td align=left> +<a href=dpans2.htm><img src=left.gif + width=26 height=26 align=ALIGN border=0></a> +<a href=dpans4.htm><img src=right.gif + width=26 height=26 align=ALIGN border=0></a> +</td> +<td align=right> +<a href=dpans.htm#toc><img src=up.gif + width=26 height=26 align=ALIGN border=0></a> +<a name=3.>Table of Contents</a> +</td> +</tr> +</table> +<p> +<hr size=4> + +<H1>3. Usage requirements</H1> + +A system shall provide all of the words defined in +<a href=dpans6.htm#6.1>6.1</a> Core Words. It +may also provide any words defined in the optional word sets and +extensions word sets. No standard word provided by a system shall alter +the system state in a way that changes the effect of execution of any +other standard word except as provided in this Standard. A system may +contain non-standard extensions, provided that they are consistent with +the requirements of this Standard. + +<P> + +The implementation of a system may use words and techniques outside the +scope of this Standard. + +<P> + +A system need not provide all words in executable form. The +implementation may provide definitions, including definitions of words +in the Core word set, in source form only. If so, the mechanism for +adding the definitions to the dictionary is implementation defined. + +<P> + +A program that requires a system to provide words or techniques not +defined in this Standard has an environmental dependency. + +<P> +<code> +See: +<a href=dpansa3.htm#A.3>A.3</a> Usage requirements +</code> +<p> + +<hr> +<A name=3.1> +<H2>3.1 Data types</H2> +</a> + +A data type identifies the set of permissible values for a data object. +It is not a property of a particular storage location or position on a +stack. Moving a data object shall not affect its type. + +<P> + +No data-type checking is required of a system. An ambiguous condition +exists if an incorrectly typed data object is encountered. + +<P> + +<a href=dpans3.htm#table.3.1>Table 3.1</a> summarizes the data types used throughout this Standard. +Multiple instances of the same type in the description of a definition +are suffixed with a sequence digit subscript to distinguish them. + +<P> +<code> +See: +<a href=dpansa3.htm#A.3.1>A.3.1</a> Date-types +</code> +<p> + +<hr> +<A name=3.1.1> +<H3>3.1.1 Data-type relationships</H3> +</a> + +Some of the data types are subtypes of other data types. A data type i +is a subtype of type j if and only if the members of i are a subset of +the members of j. The following list represents the subtype +relationships using the phrase <B>i =&gt; j</B> to denote <B>i is a subtype +of j</B>. The subtype relationship is transitive; if i =&gt; j and j =&gt; k +then i =&gt; k: + +<PRE> + +n => u => x; + +n => n => x; + char => +n; + a-addr => c-addr => addr => u; + flag => x; + xt => x; + +d => d => xd; + +d => ud => xd. +</PRE> +<P> + +Any Forth definition that accepts an argument of type i shall also accept an +argument that is a subtype of i. + +<P> + +<hr> +<A name=3.1.2> +<H3>3.1.2 Character types</H3> +</a> + +Characters shall be at least one address unit wide, contain at least eight +bits, and have a size less than or equal to cell size. + +<P> + +The characters provided by a system shall include the graphic characters +{32..126}, which represent graphic forms as shown in +<a href=dpans3.htm#table.3.2>table 3.2</a>. + +<P> +<code> +See: +<a href=dpansa3.htm#A.3.1.2>A.3.1.2</a> Character types +</code> +<p> + +<hr> +<A name=3.1.2.1> +<H2>3.1.2.1 Graphic characters</H2> +</a> + +A graphic character is one that is normally displayed (e.g., A, #, &, 6). +These values and graphics, shown in +<a href=dpans3.htm#table.3.2>table 3.2</a>, are taken directly from ANS +X3.4-1974 (ASCII) and ISO 646-1983, International Reference Version (IRV). +The graphic forms of characters outside the hex range {20..7E} are +implementation-defined. Programs that use the graphic hex 24 (the currency +sign) have an environmental dependency. + +<P> + +The graphic representation of characters is not restricted to particular type +fonts or styles. The graphics here are examples. + +<P> + +<hr> +<A name=3.1.2.2> +<H4>3.1.2.2 Control characters</H4> +</a> + +All non-graphic characters included in the implementation-defined character +set are defined in this Standard as control characters. In particular, the +characters {0..31}, which could be included in the implementation-defined +character set, are control characters. + +<P> + +Programs that require the ability to send or receive control characters have +an environmental dependency. + +<P> + +<hr> +<h3><a name=table.3.1>Table 3.1</a> - Data types</h3> +<P> + + +<PRE> +Symbol Data type Size on stack +------ --------- ------------- +flag flag 1 cell +true true flag 1 cell +false false flag 1 cell +char character 1 cell +n signed number 1 cell ++n non-negative number 1 cell +u unsigned number 1 cell +n|u 1 number 1 cell +x unspecified cell 1 cell +xt execution token 1 cell +addr address 1 cell +a-addr aligned address 1 cell +c-addr character-aligned address 1 cell +d double-cell signed number 2 cells ++d double-cell non-negative number 2 cells +ud double-cell unsigned number 2 cells +d|ud 2 double-cell number 2 cells +xd unspecified cell pair 2 cells +colon-sys definition compilation implementation dependent +do-sys do-loop structures implementation dependent +case-sys CASE structures implementation dependent +of-sys OF structures implementation dependent +orig control-flow origins implementation dependent +dest control-flow destinations implementation dependent +loop-sys loop-control parameters implementation dependent +nest-sys definition calls implementation dependent +i*x, j*x, k*x 3 any data type 0 or more cells +</PRE> + +<P> + +<B>1</B> May be either a signed number or an unsigned number depending +on context. + +<P> + +<B>2</B> May be either a double-cell signed number or a double-cell +unsigned number depending on context. + +<P> + +<B>3</B> May be an undetermined number of stack entries of unspecified +type. For examples of use, see +<a href=dpans6.htm#6.1.1370>6.1.1370</a> EXECUTE, +<a href=dpans6.htm#6.1.2050>6.1.2050</a> QUIT. + +<p> +<code> +See: +<a href=dpans11.htm#11.3.1>11.3.1</a> Data types, +<a href=dpans12.htm#12.3.1>12.3.1</a> Data types, +<a href=dpans14.htm#14.3.1>14.3.1</a> Data types, +<a href=dpans16.htm#16.3.1>16.3.1</a> Data types. +</code> +<p> + +<HR> +<h3><a name=table.3.2>Table 3.2</a> - Standard graphic characters</h3> + + +<PRE> +Hex IRV ASCII +--- --- ----- +20 +21 ! ! +22 " " +23 # # +24 ° $ +25 % % +26 & & +27 ' ' +28 ( ( +29 ) ) +2A * * +2B + + +2C , , +2D - - +2E . . +2F / / +30 0 0 +31 1 1 +32 2 2 +33 3 3 +34 4 4 +35 5 5 +36 6 6 +37 7 7 +38 8 8 +39 9 9 +3A : : +3B ; ; +3C < < +3D = = +3E > > +3F ? ? +40 @ @ +41 A A +42 B B +43 C C +44 D D +45 E E +46 F F +47 G G +48 H H +49 I I +4A J J +4B K K +4C L L +4D M M +4E N N +4F O O +50 P P +51 Q Q +52 R R +53 S S +54 T T +55 U U +56 V V +57 W W +58 X X +59 Y Y +5A Z Z +5B [ [ +5C \ \ +5D ] ] +5E ^ ^ +5F _ _ +60 ` ` +61 a a +62 b b +63 c c +64 d d +65 e e +66 f f +67 g g +68 h h +69 i i +6A j j +6B k k +6C l l +6D m m +6E n n +6F o o +70 p p +71 q q +72 r r +73 s s +74 t t +75 u u +76 v v +77 w w +78 x x +79 y y +7A z z +7B { { +7C | | +7D } } +7E ~ ~ +</PRE> + +<P> + +<hr> +<A name=3.1.3> +<H3>3.1.3 Single-cell types</H3> +</a> + +The implementation-defined fixed size of a cell is specified in address units +and the corresponding number of bits. See +<a href=dpanse.htm#E.2>E.2</a> Hardware peculiarities. + +<P> + +Cells shall be at least one address unit wide and contain at least sixteen +bits. The size of a cell shall be an integral multiple of the size of a +character. Data-stack elements, return-stack elements, addresses, execution +tokens, flags, and integers are one cell wide. + +<P> +<code> +See: +<a href=dpansa3.htm#A.3.1.3>A.3.1.3</a> Single-cell types +</code> +<p> + +<hr> +<A name=3.1.3.1> +<H4>3.1.3.1 Flags</H4> +</a> + +Flags may have one of two logical states, true or false. Programs that use +flags as arithmetic operands have an environmental dependency. + +<P> + +A true flag returned by a standard word shall be a single-cell value with all +bits set. A false flag returned by a standard word shall be a single-cell +value with all bits clear. + +<P> +<code> +See: +<a href=dpansa3.htm#A.3.1.3.1>A.3.1.3.1</a> Flags +</code> +<p> + +<hr> +<A name=3.1.3.2> +<H4>3.1.3.2 Integers</H4> +</a> + +The implementation-defined range of signed integers shall include +{-32767..+32767}. + +<P> + +The implementation-defined range of non-negative integers shall include +{0..32767}. + +<P> + +The implementation-defined range of unsigned integers shall include +{0..65535}. + +<P> +<code> +See: +<a href=dpansa3.htm#A.3.1.3.2>A.3.1.3.2</a> Integers +</code> +<p> + +<hr> +<A name=3.1.3.3> +<H4>3.1.3.3 Addresses</H4> +</a> + +An address identifies a location in data space with a size of one address +unit, which a program may fetch from or store into except for the restrictions +established in this Standard. The size of an address unit is specified in +bits. Each distinct address value identifies exactly one such storage +element. See +<a href=dpans3.htm#3.3.3>3.3.3</a> Data space. + +<P> + +The set of character-aligned addresses, addresses at which a character can be +accessed, is an implementation-defined subset of all addresses. Adding the +size of a character to a character-aligned address shall produce another +character-aligned address. + +<P> + +The set of aligned addresses is an implementation-defined subset of +character-aligned addresses. Adding the size of a cell to an aligned address +shall produce another aligned address. + +<P> +<code> +See: +<a href=dpansa3.htm#A.3.1.3.3>A.3.1.3.3</a> Addresses +</code> +<p> + +<hr> +<A name=3.1.3.4> +<H4>3.1.3.4 Counted strings</H4> +</a> + +A counted string in memory is identified by the address (c-addr) of its length +character. + +<P> + +The length character of a counted string shall contain a binary +representation of the number of data characters, between zero and the +implementation-defined maximum length for a counted string. The maximum +length of a counted string shall be at least 255. + +<P> +<code> +See: +<a href=dpansa3.htm#A.3.1.3.4>A.3.1.3.4</a> Counted strings +</code> +<p> + +<hr> +<A name=3.1.3.5> +<H4>3.1.3.5 Execution tokens</H4> +</a> + +Different definitions may have the same execution token if the +definitions are equivalent. + +<P> +<code> +See: +<a href=dpansa3.htm#A.3.1.3.5>A.3.1.3.5</a> Execution tokens +</code> +<p> + +<hr> +<A name=3.1.4> +<H3>3.1.4 Cell-pair types</H3> +</a> + +A cell pair in memory consists of a sequence of two contiguous cells. The +cell at the lower address is the first cell, and its address is used to +identify the cell pair. Unless otherwise specified, a cell pair on a stack +consists of the first cell immediately above the second cell. + +<P> +<code> +See: +<a href=dpansa3.htm#A.3.1.4>A.3.1.4</a> Cell-pair types +</code> +<p> + +<hr> +<A name=3.1.4.1> +<H4>3.1.4.1 Double-cell integers</H4> +</a> + +On the stack, the cell containing the most significant part of a +double-cell integer shall be above the cell containing the least +significant part. + +<P> + +The implementation-defined range of double-cell signed integers shall +include {-2147483647..+2147483647}. + +<P> + +The implementation-defined range of double-cell non-negative integers +shall include {0..2147483647}. + +<P> + +The implementation-defined range of double-cell unsigned integers shall +include {0..4294967295}. Placing the single-cell integer zero on the +stack above a single-cell unsigned integer produces a double-cell +unsigned integer with the same value. See +<a href=dpans3.htm#3.2.1.1>3.2.1.1</a> Internal number +representation. + +<P> +<code> +See: +<a href=dpansa3.htm#A.3.1.4.1>A.3.1.4.1</a> Double-cell integers +</code> +<p> + +<hr> +<A name=3.1.4.2> +<H4>3.1.4.2 Character strings</H4> +</a> + +A string is specified by a cell pair (c-addr u) representing its +starting address and length in characters. + +<P> +<code> +See: +<a href=dpansa3.htm#A.3.1.3.4>A.3.1.3.4</a> Counted strings +</code> +<p> + +<hr> +<A name=3.1.5> +<H3>3.1.5 System types</H3> +</a> + +The system data types specify permitted word combinations during +compilation and execution. + +<P> + +<hr> +<A name=3.1.5.1> +<H4>3.1.5.1 System-compilation types</H4> +</a> + +These data types denote zero or more items on the control-flow stack +(see +<a href=dpans3.htm#3.2.3.2>3.2.3.2</a>). +The possible presence of such items on the data stack +means that any items already there shall be unavailable to a program +until the control-flow-stack items are consumed. + +<P> + +The implementation-dependent data generated upon beginning to compile a +definition and consumed at its close is represented by the symbol +colon-sys throughout this Standard. + +<P> + +The implementation-dependent data generated upon beginning to compile a +do-loop structure such as +<a href=dpans6.htm#6.1.1240>DO</a> ... +<a href=dpans6.htm#6.1.1800>LOOP</a> +and consumed at its close is +represented by the symbol do-sys throughout this Standard. + +<P> + +The implementation-dependent data generated upon beginning to compile a +<a href=dpans6.htm#6.2.0873>CASE</a> ... +<a href=dpans6.htm#6.2.1342>ENDCASE</a> +structure and consumed at its close is represented by +the symbol case-sys throughout this Standard. + +<P> + +The implementation-dependent data generated upon beginning to compile an +<a href=dpans6.htm#6.2.1950>OF</a> ... +<a href=dpans6.htm#6.2.1343>ENDOF</a> +structure and consumed at its close is represented by the +symbol of-sys throughout this Standard. + +<P> + +The implementation-dependent data generated and consumed by executing +the other standard control-flow words is represented by the symbols orig +and dest throughout this Standard. + +<P> + +<hr> +<A name=3.1.5.2> +<H4>3.1.5.2 System-execution types</H4> +</a> + +These data types denote zero or more items on the return stack. Their +possible presence means that any items already on the return stack shall +be unavailable to a program until the system-execution items are +consumed. + +<P> + +The implementation-dependent data generated upon beginning to execute a +definition and consumed upon exiting it is represented by the symbol +nest-sys throughout this Standard. + +<P> + +The implementation-dependent loop-control parameters used to control the +execution of do-loops are represented by the symbol loop-sys throughout +this Standard. Loop-control parameters shall be available inside the +do-loop for words that use or change these parameters, words such as +<a href=dpans6.htm#6.1.1680>I</a>, +<a href=dpans6.htm#6.1.1730>J</a>, +<a href=dpans6.htm#6.1.1760>LEAVE</a> and +<a href=dpans6.htm#6.1.2380>UNLOOP</a>. + +<P> + +<hr> +<A name=3.2> +<H2>3.2 The implementation environment</H2> +</a> + +<p> + + +<hr> +<A name=3.2.1> +<H3>3.2.1 Numbers</H3> +</a> + +<p> +<code> +See: +<a href=dpansa3.htm#A.3.2.1>A.3.2.1</a> Numbers +</code> +<p> + + +<hr> +<A name=3.2.1.1> +<H4>3.2.1.1 Internal number representation</H4> +</a> + +This Standard allows one's complement, two's complement, or +sign-magnitude number representations and arithmetic. Arithmetic zero +is represented as the value of a single cell with all bits clear. +<P> + +The representation of a number as a compiled literal or in memory is +implementation dependent. + +<P> + +<hr> +<A name=3.2.1.2> +<H4>3.2.1.2 Digit conversion</H4> +</a> + +Numbers shall be represented externally by using characters from the +standard character set. + +<P> + +Conversion between the internal and external forms of a digit shall +behave as follows: + +<P> + +The value in +<a href=dpans6.htm#6.1.0750>BASE</a> +is the radix for number conversion. A digit has a +value ranging from zero to one less than the contents of BASE. The +digit with the value zero corresponds to the character <B>0</B>. This +representation of digits proceeds through the character set to the +decimal value nine corresponding to the character <B>9</B>. For digits +beginning with the decimal value ten the graphic characters beginning +with the character <B>A</B> are used. This correspondence continues up +to and including the digit with the decimal value thirty-five which is +represented by the character <B>Z</B>. The conversion of digits outside +this range is implementation defined. + +<P> +<code> +See: +<a href=dpansa3.htm#A.3.2.1.2>A.3.2.1.2</a> Digit conversion +</code> +<p> + +<hr> +<A name=3.2.1.3> +<H4>3.2.1.3 Free-field number display</H4> +</a> + +Free-field number display uses the characters described in digit +conversion, without leading zeros, in a field the exact size of the +converted string plus a trailing space. If a number is zero, the least +significant digit is not considered a leading zero. If the number is +negative, a leading minus sign is displayed. + +<P> + +Number display may use the pictured numeric output string buffer to hold +partially converted strings (see +<a href=dpans3.htm#3.3.3.6>3.3.3.6</a> Other transient regions). + +<P> + +<hr> +<A name=3.2.2> +<H3>3.2.2 Arithmetic</H3> +</a> + +<p> + + +<hr> +<A name=3.2.2.1> +<H4>3.2.2.1 Integer division</H4> +</a> + +Division produces a quotient q and a remainder r by dividing operand a +by operand b. Division operations return q, r, or both. The identity +b*q + r = a shall hold for all a and b. + +<P> + +When unsigned integers are divided and the remainder is not zero, q is +the largest integer less than the true quotient. + +<P> + +When signed integers are divided, the remainder is not zero, and a and b +have the same sign, q is the largest integer less than the true +quotient. If only one operand is negative, whether q is rounded toward +negative infinity (floored division) or rounded towards zero (symmetric +division) is implementation defined. + +<P> + +Floored division is integer division in which the remainder carries the +sign of the divisor or is zero, and the quotient is rounded to its +arithmetic floor. Symmetric division is integer division in which the +remainder carries the sign of the dividend or is zero and the quotient +is the mathematical quotient <B>rounded towards zero</B> or +<B>truncated</B>. Examples of each are shown in tables +<a href=dpans3.htm#table.3.3>3.3</a> and +<a href=dpans3.htm#table.3.3>3.4</a>. + +<P> + +In cases where the operands differ in sign and the rounding direction +matters, a program shall either include code generating the desired form +of division, not relying on the implementation-defined default result, +or have an environmental dependency on the desired rounding direction. + +<P> +<code> +See: +<a href=dpansa3.htm#A.3.2.2.1>A.3.2.2.1</a> Integer division +</code> +<p> + +<hr> +<h3><a name=table.3.3>Table 3.3</a> - Floored Division Example</h3> +<P> + + +<PRE> +Dividend Divisor Remainder Quotient +-------- ------- --------- -------- +10 7 3 1 +-10 7 4 -2 +10 -7 -4 -2 +-10 -7 -3 1 +</PRE> +<P> + + +<hr> +<h3><a name=table.3.4>Table 3.4</a> - Symmetric Division Example</h3> + + +<PRE> +Dividend Divisor Remainder Quotient +-------- ------- --------- -------- +10 7 3 1 +-10 7 -3 -1 +10 -7 3 -1 +-10 -7 -3 1 + +</PRE> +<P> + + +<P> + +<hr> +<A name=3.2.2.2> +<H4>3.2.2.2 Other integer operations</H4> +</a> + +In all integer arithmetic operations, both overflow and underflow shall +be ignored. The value returned when either overflow or underflow occurs +is implementation defined. + +<P> +<code> +See: +<a href=dpansa3.htm#A.3.2.2.2>A.3.2.2.2</a> Other integer operations +</code> +<p> + +<hr> +<A name=3.2.3> +<H3>3.2.3 Stacks</H3> +</a> + +<p> +<code> +See: +<a href=dpansa3.htm#A.3.2.3>A.3.2.3</a> Stacks +</code> +<p> + +<hr> +<A name=3.2.3.1> +<H4>3.2.3.1 Data stack</H4> +</a> + +Objects on the data stack +shall be one cell wide. + +<P> + +<hr> +<A name=3.2.3.2> +<H4>3.2.3.2 Control-flow stack</H4> +</a> + +The control-flow stack is a last-in, first out list whose elements +define the permissible matchings of control-flow words and the +restrictions imposed on data-stack usage during the compilation of +control structures. + +<P> + +The elements of the control-flow stack are system-compilation data +types. + +<P> + +The control-flow stack may, but need not, physically exist in an +implementation. If it does exist, it may be, but need not be, +implemented using the data stack. The format of the control-flow stack +is implementation defined. Since the control-flow stack may be +implemented using the data stack, items placed on the data stack are +unavailable to a program after items are placed on the control-flow +stack and remain unavailable until the control-flow stack items are +removed. + +<P> +<code> +See: +<a href=dpansa3.htm#A.3.2.3.2>A.3.2.3.2</a> Control-flow stack +</code> +<p> + +<hr> +<A name=3.2.3.3> +<H4>3.2.3.3 Return stack</H4> +</a> + +Items on the return stack shall consist of one or more cells. A system +may use the return stack in an implementation-dependent manner during +the compilation of definitions, during the execution of do-loops, and +for storing run-time nesting information. + +<P> + +A program may use the return stack for temporary storage during the +execution of a definition subject to the following restrictions: + +<UL> +<LI>A program shall not access values on the return stack (using +<a href=dpans6.htm#6.1.2070>R@</a>, +<a href=dpans6.htm#6.1.2060>R&gt;</a>, +<a href=dpans6.htm#6.2.0415>2R@</a> or +<a href=dpans6.htm#6.2.0410>2R&gt;</a>) +that it did not place there using +<a href=dpans6.htm#6.1.0580>&gt;R</a> or +<a href=dpans6.htm#6.2.0340>2&gt;R;</a> +<LI>A program shall not access from within a do-loop values placed +on the return stack before the loop was entered; +<LI>All values placed on the return stack within a do-loop shall be +removed before +<a href=dpans6.htm#6.1.1680>I</a>, +<a href=dpans6.htm#6.1.1730>J</a>, +<a href=dpans6.htm#6.1.1800>LOOP</a>, +<a href=dpans6.htm#6.1.0140>+LOOP</a>, +<a href=dpans6.htm#6.1.2380>UNLOOP</a>, or +<a href=dpans6.htm#6.1.1760>LEAVE</a> is executed; +<LI>All values placed on the return stack within a definition shall +be removed before the definition is terminated or before +<a href=dpans6.htm#6.1.1380>EXIT</a> is +executed. +</UL> + +<P> +<code> +See: +<a href=dpansa3.htm#A.3.2.3.3>A.3.2.3.3</a> Return stack +</code> +<p> + +<hr> +<A name=3.2.4> +<H3>3.2.4 Operator terminal</H3> +</a> + +<code> +See: +<a href=dpans1.htm#1.2.2>1.2.2</a> Exclusions +</code> +<P> + +<hr> +<A name=3.2.4.1> +<H4>3.2.4.1 User input device</H4> +</a> + +The method of selecting the user input +device is implementation defined. + +<P> + +The method of indicating the end of an input line of text is +implementation defined. + +<P> + +<hr> +<A name=3.2.4.2> +<H4>3.2.4.2 User output device</H4> +</a> + +The method of selecting the user output device is implementation +defined. + +<P> + +<hr> +<A name=3.2.5> +<H3>3.2.5 Mass storage</H3> +</a> + +A system need not provide any standard words for accessing mass storage. +If a system provides any standard word for accessing mass storage, it +shall also implement the Block word set. + +<P> + +<hr> +<A name=3.2.6> +<H3>3.2.6 Environmental queries</H3> +</a> + +The name spaces for +<a href=dpans6.htm#6.1.1345>ENVIRONMENT?</a> +and definitions are disjoint. Names of +definitions that are the same as ENVIRONMENT? strings shall not impair +the operation of ENVIRONMENT?. +Table 3.5 contains the valid input +strings and corresponding returned value for inquiring about the +programming environment with ENVIRONMENT?. + +<P> + +<a name=table.3.5> +Table 3.5 - Environmental Query Strings +</a> +<P> + + + +<PRE> +String Value Constant? Meaning + data type +/COUNTED-STRING n yes maximum size of a counted string, + in characters +/HOLD n yes size of the pictured numeric output + string buffer, in characters +/PAD n yes size of the scratch area pointed to + by PAD, in characters +ADDRESS-UNIT-BITS n yes size of one address unit, in bits +CORE flag no true if complete core word set + present (i.e., not a subset as + defined in <a href=dpans5.htm#5.1.1>5.1.1</a>) +CORE-EXT flag no true if core extensions word + set present +FLOORED flag yes true if floored division is the default +MAX-CHAR u yes maximum value of any character in the + implementation-defined character set +MAX-D d yes largest usable signed double number +MAX-N n yes largest usable signed integer +MAX-U u yes largest usable unsigned integer +MAX-UD ud yes largest usable unsigned double number +RETURN-STACK-CELLS n yes maximum size of the return stack, + in cells +STACK-CELLS n yes maximum size of the data stack, + in cells +</PRE> +<P> + +If an environmental query (using ENVIRONMENT?) returns false (i.e., +unknown) in response to a string, subsequent queries using the same +string may return true. If a query returns true (i.e., known) in +response to a string, subsequent queries with the same string shall also +return true. If a query designated as constant in the above table +returns true and a value in response to a string, subsequent queries +with the same string shall return true and the same value. + +<P> +<code> +See: +<a href=dpansa3.htm#A.3.2.6>A.3.2.6</a> Environmental queries, +<a href=dpans7.htm#7.3.1>7.3.1</a> Environmental queries, +<a href=dpans8.htm#8.3.1>8.3.1</a> Environmental queries, +<a href=dpans9.htm#9.3.4>9.3.4</a> Environmental queries, +<a href=dpans10.htm#10.3.2>10.3.2</a> Environmental queries, +<a href=dpans11.htm#11.3.3>11.3.3</a> Environmental queries, +<a href=dpans12.htm#12.3.4>12.3.4</a> Environmental queries, +<a href=dpans13.htm#13.3.2>13.3.2</a> Environmental queries, +<a href=dpans14.htm#14.3.2>14.3.2</a> Environmental queries, +<a href=dpans15.htm#15.3.1>15.3.1</a> Environmental queries, +<a href=dpans16.htm#16.3.2>16.3.2</a> Environmental queries, +<a href=dpans17.htm#17.3>17.3</a> Additional usage requirements. +</code> +<p> + +<hr> +<A name=3.3> +<H2>3.3 The Forth dictionary</H2> +</a> + +Forth words are organized into a structure called the dictionary. While +the form of this structure is not specified by the Standard, it can be +described as consisting of three logical parts: a name space, a code +space, and a data space. The logical separation of these parts does not +require their physical separation. + +<P> + +A program shall not fetch from or store into locations outside data +space. An ambiguous condition exists if a program addresses name space +or code space. + +<P> +<code> +See: +<a href=dpansa3.htm#A.3.3>A.3.3</a> The Forth dictionary +</code> +<p> + +<hr> +<A name=3.3.1> +<H3>3.3.1 Name space</H3> +</a> + +The relationship between name space and data space is implementation +dependent. + +<P> + +<hr> +<A name=3.3.1.1> +<H4>3.3.1.1 Word lists</H4> +</a> + +The structure of a word list is implementation dependent. When +duplicate names exist in a word list, the latest-defined duplicate shall +be the one found during a search for the name. + +<P> + +<hr> +<A name=3.3.1.2> +<H4>3.3.1.2 Definition names</H4> +</a> + +Definition names shall contain {1..31} characters. A system may allow +or prohibit the creation of definition names containing non-standard +characters. + +<P> + +Programs that use lower case for standard definition names or depend on +the case-sensitivity properties of a system have an environmental +dependency. + +<P> + +A program shall not create definition names containing non-graphic +characters. + +<P> +<code> +See: +<a href=dpansa3.htm#A.3.3.1.2>A.3.3.1.2</a> Definition names +</code> +<p> + +<hr> +<A name=3.3.2> +<H3>3.3.2 Code space</H3> +</a> + +The relationship between code space and data space is implementation +dependent. + +<P> + +<hr> +<A name=3.3.3> +<H3>3.3.3 Data space</H3> +</a> + +Data space is the only logical area of the dictionary for which standard +words are provided to allocate and access regions of memory. These +regions are: contiguous regions, variables, text-literal regions, input +buffers, and other transient regions, each of which is described in the +following sections. A program may read from or write into these regions +unless otherwise specified. + +<P> +<code> +See: +<a href=dpansa3.htm#A.3.3.3>A.3.3.3</a> Data space +</code> +<p> + +<hr> +<A name=3.3.3.1> +<H4>3.3.3.1 Address alignment</H4> +</a> + +Most addresses used in ANS Forth are aligned addresses (indicated by +a-addr) or character-aligned (indicated by c-addr). +<a href=dpans6.htm#6.1.0706>ALIGNED</a>, +<a href=dpans6.htm#6.1.0897>CHAR+</a>, and +arithmetic operations can alter the alignment state of an address on the +stack. CHAR+ applied to an aligned address returns a character-aligned +address that can only be used to access characters. Applying CHAR+ to a +character-aligned address produces the succeeding character-aligned +address. Adding or subtracting an arbitrary number to an address can +produce an unaligned address that shall not be used to fetch or store +anything. The only way to find the next aligned address is with +ALIGNED. An ambiguous condition exists when +<a href=dpans6.htm#6.1.0650>@</a>, +<a href=dpans6.htm#6.1.0010>!</a>, , +(<a href=dpans6.htm#6.1.0150>comma</a>), +<a href=dpans6.htm#6.1.0130>+!</a>, +<a href=dpans6.htm#6.1.0350>2@</a>, or +<a href=dpans6.htm#6.1.0310>2!</a> +is used with an address that is not aligned, or when +<a href=dpans6.htm#6.1.0870>C@</a>, +<a href=dpans6.htm#6.1.0850>C!</a>, or +<a href=dpans6.htm#6.1.0860>C,</a> is +used with an address that is not character-aligned. + +<P> + +The definitions of +<a href=dpans6.htm#6.1.1000>6.1.1000</a> CREATE and +<a href=dpans6.htm#6.1.2410>6.1.2410</a> VARIABLE require that +the definitions created by them return aligned addresses. + +<P> + +After definitions are compiled or the word +<a href=dpans6.htm#6.1.0705>ALIGN</a> +is executed the +data-space pointer is guaranteed to be aligned. + +<P> +<code> +See: +<a href=dpansa3.htm#A.3.3.3.1>A.3.3.3.1</a> Address alignment +</code> +<p> + +<hr> +<A name=3.3.3.2> +<H4>3.3.3.2 Contiguous regions</H4> +</a> + +A system guarantees that a region of data space allocated using +<a href=dpans6.htm#6.1.0710>ALLOT</a>, , +(<a href=dpans6.htm#6.1.0150>comma)</a>, C, +(<a href=dpans6.htm#6.1.0860>c-comma</a>), and +<a href=dpans6.htm#6.1.0705>ALIGN</a> +shall be contiguous with the last +region allocated with one of the above words, unless the restrictions in +the following paragraphs apply. The data-space pointer +<a href=dpans6.htm#6.1.1650>HERE</a> +always +identifies the beginning of the next data-space region to be allocated. +As successive allocations are made, the data-space pointer increases. A +program may perform address arithmetic within contiguously allocated +regions. The last region of data space allocated using the above +operators may be released by allocating a corresponding negatively-sized +region using ALLOT, subject to the restrictions of the following +paragraphs. + +<P> + +<a href=dpans6.htm#6.1.1000>CREATE</a> +establishes the beginning of a contiguous region of data space, +whose starting address is returned by the CREATEd definition. This +region is terminated by compiling the next definition. + +<P> + +Since an implementation is free to allocate data space for use by code, +the above operators need not produce contiguous regions of data space if +definitions are added to or removed from the dictionary between +allocations. An ambiguous condition exists if deallocated memory +contains definitions. + +<P> +<code> +See: +<a href=dpansa3.htm#A.3.3.3.2>A.3.3.3.2</a> Contiguous regions +</code> +<p> + +<hr> +<A name=3.3.3.3> +<H4>3.3.3.3 Variables</H4> +</a> + +The region allocated for a variable may be non-contiguous with regions +subsequently allocated with , +(<a href=dpans6.htm#6.1.0150>comma</a>) or +<a href=dpans6.htm#6.1.0710>ALLOT</a>. +For example, in: + + +<PRE> + VARIABLE X 1 CELLS ALLOT +</PRE> +<P> + +the region X and the region +ALLOTted could be non-contiguous. + +<P> + +Some system-provided variables, such as +<a href=dpans6.htm#6.1.2250>STATE</a>, +are restricted to read-only +access. + +<P> + +<hr> +<A name=3.3.3.4> +<H4>3.3.3.4 Text-literal regions</H4> +</a> + +The text-literal regions, specified by strings compiled with +<a href=dpans6.htm#6.1.2165>S"</a> and +<a href=dpans6.htm#6.2.0855>C"</a>, +may be read-only. + +<P> + +A program shall not store into the text-literal regions created by S" +and C" nor into any read-only system variable or read-only transient +regions. An ambiguous condition exists when a program attempts to store +into read-only regions. + +<P> + +<hr> +<A name=3.3.3.5> +<H4>3.3.3.5 Input buffers</H4> +</a> + +The address, length, and content of the input buffer may be transient. +A program shall not write into the input buffer. In the absence of any +optional word sets providing alternative input sources, the input buffer +is either the terminal-input buffer, used by +<a href=dpans6.htm#6.1.2050>QUIT</a> to hold one line from +the user input device, or a buffer specified by +<a href=dpans6.htm#6.1.1360>EVALUATE</a>. In all cases, +<a href=dpans6.htm#6.1.2216>SOURCE</a> returns the beginning +address and length in characters of the +current input buffer. + +<P> + +The minimum size of the terminal-input +buffer shall be 80 characters. + +<P> + +The address and length returned by SOURCE, the string returned by +<a href=dpans6.htm#6.2.2008>PARSE</a>, +and directly computed input-buffer addresses are valid only until the +text interpreter does I/O to refill the input buffer or the input source +is changed. + +<P> + +A program may modify the size of the parse area by changing the contents +of +<a href=dpans6.htm#6.1.0560>&gt;IN</a> +within the limits imposed by this Standard. For example, if the +contents of &gt;IN are saved before a parsing operation and restored +afterwards, the text that was parsed will be available again for +subsequent parsing operations. The extent of permissible repositioning +using this method depends on the input +source (see <a href=dpans7.htm#7.3.3>7.3.3</a> Block buffer +regions and <a href=dpans11.htm#11.3.4>11.3.4</a> Input source). + +<P> + +A program may directly examine the input buffer using its address and +length as returned by SOURCE; the beginning of the parse area within the +input buffer is indexed by the number in >IN. The values are valid for +a limited time. An ambiguous condition exists if a program modifies the +contents of the input buffer. + +<p> +<code> +See: +<a href=a0006.htm>RFI 0006</a> Writing to Input Buffers +</code> +<p> + +<hr> +<A name=3.3.3.6> +<H4>3.3.3.6 Other transient regions</H4> +</a> + +The data space regions identified by +<a href=dpans6.htm#6.2.2000>PAD</a>, +<a href=dpans6.htm#6.1.2450>WORD</a>, and +<a href=dpans6.htm#6.1.0040>#&gt;</a> +(the pictured +numeric output string buffer) may be transient. Their addresses and +contents may become invalid after: + +<UL> +<LI>a definition is created via a defining word; +<LI>definitions are compiled with +: or +:NONAME; +<LI>data space is allocated using +<a href=dpans6.htm#6.1.0710>ALLOT</a>, , +(<a href=dpans6.htm#6.1.0150>comma</a>), +C, +(<a href=dpans6.htm#6.1.0860>c-comma</a>), or +<a href=dpans6.htm#6.1.0705>ALIGN</a>. +</UL> +<P> + +The previous contents of the regions identified by WORD and #&gt; may be +invalid after each use of these words. Further, the regions returned by +WORD and #&gt; may overlap in memory. Consequently, use of one of these +words can corrupt a region returned earlier by a different word. The +other words that construct pictured numeric output strings +(<a href=dpans6.htm#6.1.0490>&lt;#</a>, +<a href=dpans6.htm#6.1.0030>#</a>, +<a href=dpans6.htm#6.1.0050>#S</a>, +and +<a href=dpans6.htm#6.1.1670>HOLD</a>) +may also modify the contents of these regions. Words that +display numbers may be implemented using pictured numeric output words. +Consequently, . +(<a href=dpans6.htm#6.1.0180>dot</a>), +<a href=dpans6.htm#6.2.0210>.R</a>, +<a href=dpans15.htm#15.6.1.0220>.S</a>, +<a href=dpans15.htm#15.6.1.0600>?</a>, +<a href=dpans8.htm#8.6.1.1060>D.</a>, +<a href=dpans8.htm#8.6.1.1070>D.R</a>, +<a href=dpans6.htm#6.1.2320>U.</a>, and +<a href=dpans6.htm#6.2.2330>U.R</a> +could also +corrupt the regions. + +<P> + +The size of the scratch area whose address is returned by PAD shall be +at least 84 characters. The contents of the region addressed by PAD are +intended to be under the complete control of the user: no words defined +in this Standard place anything in the region, although changing +data-space allocations as described in +<a href=dpans3.htm#3.3.3.2>3.3.3.2</a> Contiguous regions may +change the address returned by PAD. Non-standard words provided by an +implementation may use PAD, but such use shall be documented. + +<P> + +The size of the region identified by WORD shall be at least 33 +characters. + +<P> + +The size of the pictured numeric output string buffer shall be at least +(2*n) + 2 characters, where n is the number of bits in a cell. Programs +that consider it a fixed area with unchanging access parameters have an +environmental dependency. + +<p> +<code> +See: +<a href=dpansa3.htm#A.3.3.3.6>A.3.3.3.6</a> Other transient regions, +<a href=dpans11.htm#11.3.5>11.3.5</a> Other transient regions. +</code> +<p> + +<hr> +<a name=3.4> +<H2>3.4 The Forth text interpreter</H2> +</a> + +Upon start-up, a system shall be able to interpret, as described by +<a href=dpans6.htm#6.1.2050>6.1.2050</a> QUIT, Forth source code +received interactively from a user +input device. + +<P> + +Such interactive systems usually furnish a <B>prompt</B> indicating that +they have accepted a user request and acted on it. The +implementation-defined Forth prompt should contain the word <B>OK</B> in +some combination of upper or lower case. + +<P> + +Text interpretation (see +<a href=dpans6.htm#6.1.1360>6.1.1360</a> EVALUATE and +<a href=dpans6.htm#6.1.2050>6.1.2050</a> QUIT) shall +repeat the following steps until either the parse area is empty or an +ambiguous condition exists: + +<p> +a) Skip leading spaces and parse a name (see +<a href=dpans3.htm#3.4.1>3.4.1</a>); +<p> +b) Search the dictionary name space (see +<a href=dpans3.htm#3.4.2>3.4.2</a>). If a definition name +matching the string is found: +<OL> +<LI>if interpreting, perform the interpretation semantics of the +definition (see +<a href=dpans3.htm#3.4.3.2>3.4.3.2</a>), and continue at a); +<LI>if compiling, perform the compilation semantics of the definition (see +<a href=dpans3.htm#3.4.3.3>3.4.3.3</a>), and continue at a). +</ol> +<p> +c) If a definition name matching the string is not found, attempt to +convert the string to a number (see +<a href=dpans3.htm#3.4.1.3>3.4.1.3</a>). If successful: +<ol> +<LI>if interpreting, place the number on the data stack, and continue at a); +<LI>if compiling, compile code that when executed will place the number on +the stack (see +<a href=dpans6.htm#6.1.1780>6.1.1780</a> LITERAL), and continue at a); +</ol> +<p> +d) If unsuccessful, an ambiguous condition exists (see +<a href=dpans3.htm#3.4.4>3.4.4</a>). + +<P> + + +<hr> +<A name=3.4.1> +<H3>3.4.1 Parsing</H3> +</a> + +Unless otherwise noted, the number of characters parsed may be from zero +to the implementation-defined maximum length of a counted string. + +<P> + +If the parse area is empty, i.e., when the number in +<a href=dpans6.htm#6.1.0560>&gt;IN</a> +is equal to the +length of the input buffer, or contains no characters other than +delimiters, the selected string is empty. Otherwise, the selected +string begins with the next character in the parse area, which is the +character indexed by the contents of &gt;IN. An ambiguous condition exists +if the number in &gt;IN is greater than the size of the input buffer. + +<P> + +If delimiter characters are present in the parse area after the +beginning of the selected string, the string continues up to and +including the character just before the first such delimiter, and the +number in &gt;IN is changed to index immediately past that delimiter, thus +removing the parsed characters and the delimiter from the parse area. +Otherwise, the string continues up to and including the last character +in the parse area, and the number in &gt;IN is changed to the length of the +input buffer, thus emptying the parse area. + +<P> + +Parsing may change the contents of &gt;IN, but shall not affect the +contents of the input buffer. Specifically, if the value in &gt;IN is +saved before starting the parse, resetting &gt;IN to that value immediately +after the parse shall restore the parse area without loss of data. + +<P> + +<hr> +<A name=3.4.1.1> +<H4>3.4.1.1 Delimiters</H4> +</a> + +If the delimiter is the space character, hex 20 +(<a href=dpans6.htm#6.1.0770>BL</a>), +control characters +may be treated as delimiters. The set of conditions, if any, under +which a <B>space</B> delimiter matches control characters is +implementation defined. + +<P> + +To skip leading delimiters is to pass by zero or more contiguous +delimiters in the parse area before parsing. + +<P> + +<hr> +<A name=3.4.1.2> +<H4>3.4.1.2 Syntax</H4> +</a> + +Forth has a simple, operator-ordered syntax. The phrase A B C returns +values as if A were executed first, then B and finally C. Words that +cause deviations from this linear flow of control are called +control-flow words. Combinations of control-flow words whose stack +effects are compatible form control-flow structures. Examples of +typical use are given for each control-flow word in +<A href=dpansa1.htm>Annex A</A>. + +<P> + +Forth syntax is extensible; for example, new control-flow words can be +defined in terms of existing ones. + +<P> + +This Standard does not require a +syntax or program-construct checker. + +<P> + +<hr> +<A name=3.4.1.3> +<H4>3.4.1.3 Text interpreter input number conversion</H4> +</a> + +When converting input numbers, the text interpreter shall recognize both +positive and negative numbers, with a negative number represented by a +single minus sign, the character <B>-</B>, preceding the digits. The +value in +<a href=dpans6.htm#6.1.0750>BASE</a> +is the radix for number conversion. + +<P> + +<hr> +<A name=3.4.2> +<H3>3.4.2 Finding definition names</H3> +</a> + +A string matches a definition name if each character in the string +matches the corresponding character in the string used as the definition +name when the definition was created. The case sensitivity (whether or +not the upper-case letters match the lower-case letters) is +implementation defined. A system may be either case sensitive, treating +upper- and lower-case letters as different and not matching, or case +insensitive, ignoring differences in case while searching. + +<P> + +The matching of upper- and lower-case letters with alphabetic characters +in character set extensions such as accented international characters is +implementation defined. + +<P> + +A system shall be capable of finding the definition names defined by +this Standard when they are spelled with upper-case letters. + +<P> + +<hr> +<A name=3.4.3> +<H3>3.4.3 Semantics</H3> +</a> + +The semantics of a Forth definition are implemented by machine code or a +sequence of execution tokens or other representations. They are largely +specified by the stack notation in the glossary entries, which shows +what values shall be consumed and produced. The prose in each glossary +entry further specifies the definition's behavior. + +<P> + +Each Forth definition may have several behaviors, described in the +following sections. The terms <B>initiation semantics</B> and +<B>run-time semantics</B> refer to definition fragments, and have +meaning only within the individual glossary entries where they appear. + +<P> +<code> +See: +<a href=dpansa3.htm#A.3.4.3>A.3.4.3</a> Semantics, +<a href=a0005.htm>RFI 0005</a>. +</code> +<p> + +<hr> +<A name=3.4.3.1> +<H4>3.4.3.1 Execution semantics</H4> +</a> + +The execution semantics of each Forth definition are specified in an +<B>Execution:</B> section of its glossary entry. When a definition has +only one specified behavior, the label is omitted. + +<P> + +Execution may occur implicitly, when the definition into which it has +been compiled is executed, or explicitly, when its execution token is +passed to +<a href=dpans6.htm#6.1.1370>EXECUTE</a>. +The execution semantics of a syntactically correct +definition under conditions other than those specified in this Standard +are implementation dependent. + +<P> + +Glossary entries for defining words include the execution semantics for +the new definition in a <i>name</i> <b>Execution:</B> section. + +<P> + +<hr> +<A name=3.4.3.2> +<H4>3.4.3.2 Interpretation semantics</H4> +</a> + +Unless otherwise specified in an <B>Interpretation:</B> section of the +glossary entry, the interpretation semantics of a Forth definition are +its execution semantics. + +<P> + +A system shall be capable of executing, in interpretation state, all of +the definitions from the Core word set and any definitions included from +the optional word sets or word set extensions whose interpretation +semantics are defined by this Standard. + +<P> + +A system shall be capable of executing, in interpretation state, any new +definitions created in accordance with +<a href=dpans3.htm#3.>3.</a> Usage requirements. + +<P> +<code> +See: +<a href=dpansa3.htm#A.3.4.3.2>A.3.4.3.2</a> Interpretation semantics +</code> +<p> + +<hr> +<A name=3.4.3.3> +<H4>3.4.3.3 Compilation semantics</H4> +</a> + +Unless otherwise specified in a <B>Compilation:</B> section of the +glossary entry, the compilation semantics of a Forth definition shall be +to append its execution semantics to the execution semantics of the +current definition. + +<P> +<code> +See: +<a href=a0007.htm>RFI 0007</a> Distinction between <em>immediacy</em> and <em>special compilation semantics</em>. +</code> +<p> + +<hr> +<A name=3.4.4> +<H3>3.4.4 Possible actions on an ambiguous condition</H3> +</a> + +When an ambiguous condition exists, a system may take one or more of the +following actions: + +<UL> +<LI>ignore and continue; +<LI>display a message; +<LI>execute a particular word; +<LI>set interpretation state and begin text interpretation; +<LI>take other implementation-defined actions; +<LI>take implementation-dependent actions. +</UL> +<P> + +The response to a particular ambiguous condition need not be the same +under all circumstances. + +<P> + +<hr> +<A name=3.4.5> +<H3>3.4.5 Compilation</H3> +</a> + +A program shall not attempt to +nest compilation of definitions. + +<P> + +During the compilation of the current definition, a program shall not +execute any defining word, +<a href=dpans6.htm#6.2.0455>:NONAME</a>, +or any definition that allocates +dictionary data space. The compilation of the current definition may be +suspended using [ +(<a href=dpans6.htm#6.1.2500>left-bracket</a>) +and resumed using ] +(<a href=dpans6.htm#6.1.2540>right-bracket</a>). +While the compilation of the current definition is suspended, a program +shall not execute any defining word, :NONAME, or any definition that +allocates dictionary data space. + +<p> +<code> +See: +<a href=dpansa3.htm#A.3.4.5>A.3.4.5</a> Compilation +</code> +<p> + +<hr> +<A href=dpans.htm#toc><IMG src="up.gif" ></A> Table of Contents +<BR> +<A href=dpans4.htm><IMG src="right.gif" ></A> Next Section +<P> +</BODY> +</HTML> diff --git a/mwmouse/sources/AnsForth/DPANS4.HTM b/mwmouse/sources/AnsForth/DPANS4.HTM @@ -0,0 +1,372 @@ +<HTML><HEAD> +<TITLE>DPANS94</TITLE> +<link disabled rel="stylesheet" href="mpexc6.css"> +<style>@import url(mpexc6.css);</style> +</head> + +<BODY> +<table width=100%> +<tr> +<td align=left> +<a href=dpans3.htm><img src=left.gif + width=26 height=26 align=ALIGN border=0></a> +<a href=dpans5.htm><img src=right.gif + width=26 height=26 align=ALIGN border=0></a> +</td> +<td align=right> +<a href=dpans.htm#toc><img src=up.gif + width=26 height=26 align=ALIGN border=0></a> +<a name=4.>Table of Contents</a> +</td> +</tr> +</table> +<p> +<hr size=4> + +<H1>4. Documentation requirements</H1> + +When it is impossible or infeasible for a system or program to define a +particular behavior itself, it is permissible to state that the behavior +is unspecifiable and to explain the circumstances and reasons why this is so. + +<P> + +<hr> +<A name=4.1> +<H2>4.1 System documentation</H2> +</a> + + +<hr> +<A name=4.1.1> +<H3>4.1.1 Implementation-defined options</H3> +</a> + +The implementation-defined items in the following list represent +characteristics and choices left to the discretion of the implementor, +provided that the requirements of this Standard are met. A system shall +document the values for, or behaviors of, each item. + +<UL> +<LI>aligned address requirements +(<a href=dpans3.htm#3.1.3.3>3.1.3.3</a> Addresses); +<LI>behavior of +<a href=dpans6.htm#6.1.1320>6.1.1320</a> EMIT for non-graphic characters; +<LI>character editing of +<a href=dpans6.htm#6.1.0695>6.1.0695</a> ACCEPT and +<a href=dpans6.htm#6.2.1390>6.2.1390</a> EXPECT; +<LI>character set +(<a href=dpans3.htm#3.1.2>3.1.2</a> Character types, +<a href=dpans6.htm#6.1.1320>6.1.1320</a> EMIT, +<a href=dpans6.htm#6.1.1750>6.1.1750</a> KEY); +<LI>character-aligned address requirements +(<a href=dpans3.htm#3.1.3.3>3.1.3.3</a> Addresses); +<LI>character-set-extensions matching characteristics +(<a href=dpans3.htm#3.4.2>3.4.2</a> Finding +definition names); +<LI>conditions under which control characters match a space delimiter +(<a href=dpans3.htm#3.4.1.1>3.4.1.1</a> Delimiters); +<LI>format of the control-flow stack +(<a href=dpans3.htm#3.2.3.2>3.2.3.2</a> Control-flow stack); +<LI>conversion of digits larger than thirty-five +(<a href=dpans3.htm#3.2.1.2>3.2.1.2</a> Digit +conversion); +<LI>display after input terminates in +<a href=dpans6.htm#6.1.0695>6.1.0695</a> ACCEPT and +<a href=dpans6.htm#6.2.1390>6.2.1390</a> EXPECT; +<LI>exception abort sequence (as in +<a href=dpans6.htm#6.1.0680>6.1.0680</a> ABORT"); +<LI>input line terminator +(<a href=dpans3.htm#3.2.4.1>3.2.4.1</a> User input device); +<LI>maximum size of a counted string, in characters +(<a href=dpans3.htm#3.1.3.4>3.1.3.4</a> Counted +strings, +<a href=dpans6.htm#6.1.2450>6.1.2450</a> WORD); +<LI>maximum size of a parsed string +(<a href=dpans3.htm#3.4.1>3.4.1</a> Parsing); +<LI>maximum size of a definition name, in characters +(<a href=dpans3.htm#3.3.1.2>3.3.1.2</a> Definition +names); +<LI>maximum string length for +<a href=dpans6.htm#6.1.1345>6.1.1345</a> ENVIRONMENT?, in characters; +<LI>method of selecting +<a href=dpans3.htm#3.2.4.1>3.2.4.1</a> User input device; +<LI>method of selecting +<a href=dpans3.htm#3.2.4.2>3.2.4.2</a> User output device; +<LI>methods of dictionary compilation +(<a href=dpans3.htm#3.3>3.3</a> The Forth dictionary); +<LI>number of bits in one address unit +(<a href=dpans3.htm#3.1.3.3>3.1.3.3</a> Addresses); +<LI>number representation and arithmetic +(<a href=dpans3.htm#3.2.1.1>3.2.1.1</a> Internal number +representation); +<LI>ranges for n, +n, u, d, +d, and ud +(<a href=dpans3.htm#3.1.3>3.1.3</a> Single-cell types, +<a href=dpans3.htm#3.1.4>3.1.4</a> Cell-pair types); +<LI>read-only data-space regions +(<a href=dpans3.htm#3.3.3>3.3.3</a> Data space); +<LI>size of buffer at +<a href=dpans6.htm#6.1.2450>6.1.2450</a> WORD +(<a href=dpans3.htm#3.3.3.6>3.3.3.6</a> Other transient regions); +<LI>size of one cell in address units +(<a href=dpans3.htm#3.1.3>3.1.3</a> Single-cell types); +<LI>size of one character in address units +(<a href=dpans3.htm#3.1.2>3.1.2</a> Character types); +<LI>size of the keyboard terminal input buffer +(<a href=dpans3.htm#3.3.3.5>3.3.3.5</a> Input buffers); +<LI>size of the pictured numeric output string buffer +(<a href=dpans3.htm#3.3.3.6>3.3.3.6</a> Other +transient regions); +<LI>size of the scratch area whose address is returned by +<a href=dpans6.htm#6.2.2000>6.2.2000</a> PAD +(<a href=dpans3.htm#3.3.3.6>3.3.3.6</a> Other transient regions); +<LI>system case-sensitivity characteristics +(<a href=dpans3.htm#3.4.2>3.4.2</a> Finding definition +names); +<LI>system prompt +(<a href=dpans3.htm#3.4>3.4</a> The Forth text interpreter, +<a href=dpans6.htm#6.1.2050>6.1.2050</a> QUIT); +<LI>type of division rounding +(<a href=dpans3.htm#3.2.2.1>3.2.2.1</a> Integer division, +<a href=dpans6.htm#6.1.0100>6.1.0100</a> */, +<a href=dpans6.htm#6.1.0110>6.1.0110</a> */MOD, +<a href=dpans6.htm#6.1.0230>6.1.0230</a> /, +<a href=dpans6.htm#6.1.0240>6.1.0240</a> /MOD, +<a href=dpans6.htm#6.1.1890>6.1.1890</a> MOD); +<LI>values of +<a href=dpans6.htm#6.1.2250>6.1.2250</a> STATE when true; +<LI>values returned after arithmetic overflow +(<a href=dpans3.htm#3.2.2.2>3.2.2.2</a> Other integer +operations); +<LI>whether the current definition can be found after +<a href=dpans6.htm#6.1.1250>6.1.1250</a> DOES&gt; +(<a href=dpans6.htm#6.1.0450>6.1.0450</a> :). +</UL> + +<P> + +<hr> +<A name=4.1.2> +<H3>4.1.2 Ambiguous conditions</H3> +</a> + +A system shall document the system action taken upon each of the general or +specific ambiguous conditions identified in this Standard. See +<a href=dpans3.htm#3.4.4>3.4.4</a> Possible +actions on an ambiguous condition. + +<P> + +The following general ambiguous conditions could occur because of a +combination of factors: + +<UL> +<LI>a name is neither a valid definition name nor a valid number during +text interpretation +(<a href=dpans3.htm#3.4>3.4</a> The Forth text interpreter); +<LI>a definition name exceeded the maximum length allowed +(<a href=dpans3.htm#3.3.1.2>3.3.1.2</a> +Definition names); +<LI>addressing a region not listed in +<a href=dpans3.htm#3.3.3>3.3.3</a> Data Space; +<LI>argument type incompatible with specified input parameter, e.g., +passing a flag to a word expecting an n +(<a href=dpans3.htm#3.1>3.1</a> Data types); +<LI>attempting to obtain the execution token, (e.g., with +<a href=dpans6.htm#6.1.0070>6.1.0070</a> ', +<a href=dpans6.htm#6.1.1550>6.1.1550</a> FIND, +etc.) of a definition with undefined interpretation semantics; +<LI>dividing by zero +(<a href=dpans6.htm#6.1.0100>6.1.0100</a> */, +<a href=dpans6.htm#6.1.0110>6.1.0110</a> */MOD, +<a href=dpans6.htm#6.1.0230>6.1.0230</a> /, +<a href=dpans6.htm#6.1.0240>6.1.0240</a> /MOD, +<a href=dpans6.htm#6.1.1561>6.1.1561</a> FM/MOD, +<a href=dpans6.htm#6.1.1890>6.1.1890</a> MOD, +<a href=dpans6.htm#6.1.2214>6.1.2214</a> SM/REM, +<a href=dpans6.htm#6.1.2370>6.1.2370</a> UM/MOD, +<a href=dpans8.htm#8.6.1.1820>8.6.1.1820</a> M*/); +<LI>insufficient data-stack space or return-stack space (stack overflow); +<LI>insufficient space for loop-control parameters; +<LI>insufficient space in the dictionary; +<LI>interpretating a word with undefined interpretation semantics; +<LI>modifying the contents of the input buffer or a string literal +(<a href=dpans3.htm#3.3.3.4>3.3.3.4</a> Text-literal regions, +<a href=dpans3.htm#3.3.3.5>3.3.3.5</a> Input buffers); +<LI>overflow of a pictured numeric output string; +<LI>parsed string overflow; +<LI>producing a result out of range, e.g., multiplication (using *) +results in a value too big to be represented by a single-cell integer +(<a href=dpans6.htm#6.1.0090>6.1.0090</a> *, +<a href=dpans6.htm#6.1.0100>6.1.0100</a> */, +<a href=dpans6.htm#6.1.0110>6.1.0110</a> */MOD, +<a href=dpans6.htm#6.1.0570>6.1.0570</a> &gt;NUMBER, +<a href=dpans6.htm#6.1.1561>6.1.1561</a> FM/MOD, +<a href=dpans6.htm#6.1.2214>6.1.2214</a> SM/REM, +<a href=dpans6.htm#6.1.2370>6.1.2370</a> UM/MOD, +<a href=dpans6.htm#6.2.0970>6.2.0970</a> CONVERT, +<a href=dpans8.htm#8.6.1.1820>8.6.1.1820</a> M*/); +<LI>reading from an empty data stack or return stack (stack underflow); +<LI>unexpected end of input buffer, resulting in an attempt to use a +zero-length string as a name; +</UL> +<P> + +The following specific ambiguous conditions are noted in the glossary entries +of the relevant words: + +<UL> +<LI> +<a href=dpans6.htm#6.1.0560>&gt;IN</a> +greater than size of input buffer +(<a href=dpans3.htm#3.4.1>3.4.1</a> Parsing); +<LI> +<a href=dpans6.htm#6.1.2120>6.1.2120</a> RECURSE appears after +<a href=dpans6.htm#6.1.1250>6.1.1250</a> DOES&gt;; +<LI>argument input source different than current input source for +<a href=dpans6.htm#6.2.2148>6.2.2148</a> RESTORE-INPUT; +<LI>data space containing definitions is de-allocated +(<a href=dpans3.htm#3.3.3.2>3.3.3.2</a> Contiguous regions); +<LI>data space read/write with incorrect alignment +(<a href=dpans3.htm#3.3.3.1>3.3.3.1</a> Address alignment); +<LI>data-space pointer not properly aligned +(<a href=dpans6.htm#6.1.0150>6.1.0150</a> ,, +<a href=dpans6.htm#6.1.0860>6.1.0860</a> C,); +<LI>less than u+2 stack items +(<a href=dpans6.htm#6.2.2030>6.2.2030</a> PICK, +<a href=dpans6.htm#6.2.2150>6.2.2150</a> ROLL); +<LI>loop-control parameters not available ( +<a href=dpans6.htm#6.1.0140>6.1.0140</a> +LOOP, +<a href=dpans6.htm#6.1.1680>6.1.1680</a> I, +<a href=dpans6.htm#6.1.1730>6.1.1730</a> J, +<a href=dpans6.htm#6.1.1760>6.1.1760</a> LEAVE, +<a href=dpans6.htm#6.1.1800>6.1.1800</a> LOOP, +<a href=dpans6.htm#6.1.2380>6.1.2380</a> UNLOOP); +<LI>most recent definition does not have a name +(<a href=dpans6.htm#6.1.1710>6.1.1710</a> IMMEDIATE); +<LI>name not defined by +<a href=dpans6.htm#6.2.2405>6.2.2405</a> VALUE used by +<a href=dpans6.htm#6.2.2295>6.2.2295</a> TO; +<LI>name not found +(<a href=dpans6.htm#6.1.0070>6.1.0070</a> ', +<a href=dpans6.htm#6.1.2033>6.1.2033</a> POSTPONE, +<a href=dpans6.htm#6.1.2510>6.1.2510</a> ['], +<a href=dpans6.htm#6.2.2530>6.2.2530</a> [COMPILE]); +<LI>parameters are not of the same type +(<a href=dpans6.htm#6.1.1240>6.1.1240</a> DO, +<a href=dpans6.htm#6.2.0620>6.2.0620</a> ?DO, +<a href=dpans6.htm#6.2.2440>6.2.2440</a> WITHIN); +<LI> +<a href=dpans6.htm#6.1.2033>6.1.2033</a> POSTPONE or +<a href=dpans6.htm#6.2.2530>6.2.2530</a> [COMPILE] applied to +<a href=dpans6.htm#6.2.2295>6.2.2295</a> TO; +<LI>string longer than a counted string returned by +<a href=dpans6.htm#6.1.2450>6.1.2450</a> WORD; +<LI>u greater than or equal to the number of bits in a cell +(<a href=dpans6.htm#6.1.1805>6.1.1805</a> LSHIFT, +<a href=dpans6.htm#6.1.2162>6.1.2162</a> RSHIFT); +<LI>word not defined via +<a href=dpans6.htm#6.1.1000>6.1.1000</a> CREATE +(<a href=dpans6.htm#6.1.0550>6.1.0550</a> &gt;BODY, +<a href=dpans6.htm#6.1.1250>6.1.1250</a> DOES&gt;); +<LI>words improperly used outside +<a href=dpans6.htm#6.1.0490>6.1.0490</a> &lt;# and +<a href=dpans6.htm#6.1.0040>6.1.0040</a> #&gt; +(<a href=dpans6.htm#6.1.0030>6.1.0030</a> #, +<a href=dpans6.htm#6.1.0050>6.1.0050</a> #S, +<a href=dpans6.htm#6.1.1670>6.1.1670</a> HOLD, +<a href=dpans6.htm#6.1.2210>6.1.2210</a> SIGN). +</UL> + +<P> + +<hr> +<A name=4.1.3> +<H3>4.1.3 Other system documentation</H3> +</a> + +A system shall provide the following information: +<P> + +<UL> +<LI>list of non-standard words using +<a href=dpans6.htm#6.2.2000>6.2.2000</a> PAD +(<a href=dpans3.htm#3.3.3.6>3.3.3.6</a> Other transient +regions); +<LI>operator's terminal facilities available; +<LI>program data space available, in address units; +<LI>return stack space available, in cells; +<LI>stack space available, in cells; +<LI>system dictionary space required, in address units. +</UL> + +<P> + +<hr> +<A name=4.2> +<H2>4.2 Program documentation</H2> +</a> + + +<hr> +<A name=4.2.1> +<H3>4.2.1 Environmental dependencies</H3> +</a> + +A program shall document the following environmental dependencies, where they +apply, and should document other known environmental dependencies: + +<UL> +<LI>considering the pictured numeric output string buffer a fixed area +with unchanging access parameters +(<a href=dpans3.htm#3.3.3.6>3.3.3.6</a> Other transient regions); +<LI>depending on the presence or absence of non-graphic characters in a +received string +(<a href=dpans6.htm#6.1.0695>6.1.0695</a> ACCEPT, +<a href=dpans6.htm#6.2.1390>6.2.1390</a> EXPECT); +<LI>relying on a particular rounding direction +(<a href=dpans3.htm#3.2.2.1>3.2.2.1</a> Integer division); +<LI>requiring a particular number representation and arithmetic +(<a href=dpans3.htm#3.2.1.1>3.2.1.1</a> +Internal number representation); +<LI>requiring non-standard words or techniques +(<a href=dpans3.htm#3.>3.</a> Usage requirements); +<LI>requiring the ability to send or receive control characters +(<a href=dpans3.htm#3.1.2.2>3.1.2.2</a> Control characters, +<a href=dpans6.htm#6.1.1750>6.1.1750</a> KEY); +<LI>using control characters to perform specific functions +(<a href=dpans6.htm#6.1.1320>6.1.1320</a> EMIT, +<a href=dpans6.htm#6.1.2310>6.1.2310</a> TYPE); +<LI>using flags as arithmetic operands +(<a href=dpans3.htm#3.1.3.1>3.1.3.1</a> Flags); +<LI>using lower case for standard definition names or depending on the +case sensitivity of a system +(<a href=dpans3.htm#3.3.1.2>3.3.1.2</a> Definition names); +<LI>using the graphic character with a value of hex 24 +(<a href=dpans3.htm#3.1.2.1>3.1.2.1</a> Graphic +characters). +</UL> + +<P> + +<hr> +<A name=4.2.2> +<H3>4.2.2 Other program documentation</H3> +</a> + +A program shall also document: +<P> + +<UL> +<LI>minimum operator's terminal facilities required; +<LI>whether a Standard System exists after the program is loaded. +</UL> + + +<HR> +<A href=dpans.htm#toc><IMG src="up.gif" ></A> Table of Contents +<BR> +<A href=dpans5.htm><IMG src="right.gif" ></A> Next Section +<P> +</BODY> +</HTML> diff --git a/mwmouse/sources/AnsForth/DPANS5.HTM b/mwmouse/sources/AnsForth/DPANS5.HTM @@ -0,0 +1,147 @@ +<HTML><HEAD> +<TITLE>DPANS94</TITLE> +<link disabled rel="stylesheet" href="mpexc6.css"> +<style>@import url(mpexc6.css);</style> +</head> + +<BODY> +<table width=100%> +<tr> +<td align=left> +<a href=dpans4.htm><img src=left.gif + width=26 height=26 align=ALIGN border=0></a> +<a href=dpans6.htm><img src=right.gif + width=26 height=26 align=ALIGN border=0></a> +</td> +<td align=right> +<a href=dpans.htm#toc><img src=up.gif + width=26 height=26 align=ALIGN border=0></a> +<a name=5.>Table of Contents</a> +</td> +</tr> +</table> +<p> +<hr size=4> + +<H1>5. Compliance and labeling</H1> + + +<hr> +<A name=5.1> +<H2>5.1 ANS Forth systems</H2> +</a> + +<p> +<code> +See: +<a href=dpansa5.htm#A.5.1>A.5.1</a> ANS Forth systems +</code> +<p> + +<hr> +<A name=5.1.1> +<H3>5.1.1 System compliance</H3> +</a> + +A system that complies with all the system requirements given in +sections +<a href=dpans3.htm#3.>3.</a> Usage requirements and +<a href=dpans4.htm#4.1>4.1</a> System documentation and their +sub-sections is a Standard System. An otherwise Standard System that +provides only a portion of the Core words is a Standard System Subset. +An otherwise Standard System (Subset) that fails to comply with one or +more of the minimum values or ranges specified in +<a href=dpans3.htm#3.>3.</a> Usage requirements +and its sub-sections has environmental restrictions. + +<P> + +<hr> +<A name=5.1.2> +<H3>5.1.2 System labeling</H3> +</a> + +A Standard System (Subset) shall be labeled an <B>ANS Forth System +(Subset)</B>. That label, by itself, shall not be applied to Standard +Systems or Standard System Subsets that have environmental restrictions. + +<P> + +The phrase <B>with Environmental Restrictions</B> shall be appended to +the label of a Standard System (Subset) that has environmental +restrictions. + +<P> + +The phrase <B>Providing name(s) from the Core Extensions word set</B> +shall be appended to the label of any Standard System that provides +portions of the Core Extensions word set. + +<P> + +The phrase <B>Providing the Core Extensions word set</B> shall be +appended to the label of any Standard System that provides all of the +Core Extensions word set. + +<P> + +<hr> +<A name=5.2> +<H2>5.2 ANS Forth programs</H2> +</a> + + +<hr> +<A name=5.2.1> +<H3>5.2.1 Program compliance</H3> +</a> + +A program that complies with all the program requirements given in +sections +<a href=dpans3.htm#3.>3.</a> Usage requirements and +<a href=dpans4.htm#4.2>4.2</a> Program documentation and their +sub-sections is a Standard Program. + +<P> + +<hr> +<A name=5.2.2> +<H3>5.2.2 Program labeling</H3> +</a> + +A Standard Program shall be labeled an <B>ANS Forth Program</B>. That +label, by itself, shall not be applied to Standard Programs that require +the system to provide standard words outside the Core word set or that +have environmental dependencies. + +<P> + +The phrase <B>with Environmental Dependencies</B> shall be appended to +the label of Standard Programs that have environmental dependencies. + +<P> + +The phrase <B>Requiring name(s) from the Core Extensions word set</B> +shall be appended to the label of Standard Programs that require the +system to provide portions of the Core Extensions word set. + +<P> + +The phrase <B>Requiring the Core Extensions word set</B> shall be +appended to the label of Standard Programs that require the system to +provide all of the Core Extensions word set. + +<P> +<code> +See: +<a href=dpansa5.htm#A.5.2.2>A.5.2.2</a> Program labeling +</code> +<p> + +<hr> +<A href=dpans.htm#toc><IMG src="up.gif" ></A> Table of Contents +<BR> +<A href=dpans6.htm><IMG src="right.gif" ></A> Next Section +<P> +</BODY> +</HTML> diff --git a/mwmouse/sources/AnsForth/DPANS6.HTM b/mwmouse/sources/AnsForth/DPANS6.HTM @@ -0,0 +1,5778 @@ +<HTML><HEAD> +<TITLE>DPANS94</TITLE> +<link disabled rel="stylesheet" href="mpexc6.css"> +<style>@import url(mpexc6.css);</style> +</head> + +<BODY> +<table width=100%> +<tr> +<td align=left> +<a href=dpans5.htm><img src=left.gif + width=26 height=26 align=ALIGN border=0></a> +<a href=dpans7.htm><img src=right.gif + width=26 height=26 align=ALIGN border=0></a> +</td> +<td align=right> +<a href=dpans.htm#toc><img src=up.gif + width=26 height=26 align=ALIGN border=0></a> +<a name=6.>Table of Contents</a> +</td> +</tr> +</table> +<p> +<hr size=4> + +<H1>6. Glossary</H1> + +<code><p> +See: +<a href=dpansa6.htm#A.6>A.6</a> Glossary +<p> +</code> + +<hr> +<A name=6.1></A> +<H2>6.1 Core words</H2> +</a> + + + +<hr> +<A name=6.1.0010> +<code> +6.1.0010 <B>!</B> +</code> +</a> +<BR> +<B>store</B> CORE +<BR> +<pre> + ( x a-addr -- ) +</pre> +<P> + +Store x at +a-addr. + +<P> + +<code> +See: +<A href=dpans3.htm#3.3.3.1>3.3.3.1</a> Address alignment +</code> + +<P> + +<hr> +<A name=6.1.0030> +<code> +6.1.0030 <B>#</B> +</code> +</a> +<BR> +<B>number-sign</B> CORE +<br> +<pre> + ( ud1 -- ud2 ) +</pre> +<P> + +Divide ud1 by the number in +<a href=dpans6.htm#6.1.0750>BASE</a> +giving the quotient ud2 and the +remainder n. (n is the least-significant digit of ud1.) Convert n to +external form and add the resulting character to the beginning of the +pictured numeric output string. An ambiguous condition exists if # +executes outside of a +<a href=dpans6.htm#6.1.0490>&lt;#</a> +<a href=dpans6.htm#6.1.0040>#&gt;</a> +delimited number conversion. + +<P> + +<code> +See: +<A href=dpans6.htm#6.1.0050>6.1.0050 #S</a> +</code> + +<P> + +<hr> +<A name=6.1.0040> +<code> +6.1.0040 <B>#&gt;</B> +</code> +</a> +<BR> +<B>number-sign-greater</B> CORE +<BR> +<pre> + ( xd -- c-addr u ) +</pre> + +<P> + +Drop xd. Make the pictured numeric output string available as a +character string. c-addr and u specify the resulting character string. +A program may replace characters within the string. + +<P> + +<code> +See: +<A href=dpans6.htm#6.1.0030>6.1.0030 #</a> , +<A href=dpans6.htm#6.1.0050>6.1.0050 #S</a> , +<A href=dpans6.htm#6.1.0490>6.1.0490 &lt;#</a> +</code> + +<P> + +<hr> +<A name=6.1.0050> +<code> +6.1.0050 <B>#S</B> +</code> +</a> +<BR> +<B>number-sign-s</B> CORE +<BR> +<pre> + ( ud1 -- ud2 ) +</pre> + +<P> + +Convert one digit of ud1 according to the rule for +<a href=dpans6.htm#6.1.0030>#</a>. Continue +conversion until the quotient is zero. ud2 is zero. An ambiguous +condition exists if #S executes outside of a +<a href=dpans6.htm#6.1.0490>&lt;#</a> +<a href=dpans6.htm#6.1.0040>#&gt;</a> +delimited number +conversion. + +<P> + + +<hr> +<A name=6.1.0070> +<code> +6.1.0070 <B>'</B> +</code> +</a> +<BR> +<B>tick</B> CORE +<BR> +<pre> + ( <B>"&lt;spaces&gt;name"</B> -- xt ) +</pre> + +<P> + +Skip leading space delimiters. Parse name delimited by a space. Find +name and return xt, the execution token for name. An ambiguous +condition exists if name is not found. + +<P> + +When interpreting, <b><code>' xyz EXECUTE</code></b> is equivalent to xyz. + +<P> + +<code> +See: +<A href=dpans3.htm#3.4>3.4</a> The Forth text interpreter, +<A href=dpans3.htm#3.4.1>3.4.1</a> Parsing, +<A href=dpansa6.htm#A.6.1.2033>A.6.1.2033 POSTPONE</a> , +<A href=dpans6.htm#6.1.2510>6.1.2510 [']</a> , +<a href=dpansa6.htm#A.6.1.0070>A.6.1.0070 '</a> , +<A href=dpansd.htm#D.6.7>D.6.7</a> Immediacy. +</code> + +<P> + +<hr> +<A name=6.1.0080> +<code> +6.1.0080 <B>(</B> +</code> +</a> +<BR> +<B>paren</B> CORE +<BR> + +<P> +<pre> + Compilation: Perform the execution semantics given below. +</pre> +<P> +<pre> + Execution: ( <B>"ccc&lt;paren&gt;"</B> -- ) +</pre> +<P> + +Parse ccc delimited by ) +(right parenthesis). ( is an immediate word. + +<P> + +The number of characters in ccc may be zero to the number of characters +in the parse area. + +<P> + +<code> +See: +<A href=dpans3.htm#3.4.1>3.4.1</a> Parsing, +<A href=dpans11.htm#11.6.1.0080>11.6.1.0080 (</a> , +<a href=dpansa6.htm#A.6.1.0080>A.6.1.0080 (</a> +</code> + +<P> + +<hr> +<A name=6.1.0090> +<code> +6.1.0090 <B>*</B> +</code> +</a> +<BR> +<B>star</B> CORE +<BR> +<pre> + ( n1|u1 n2|u2 -- n3|u3 ) +</pre> + +<P> + +Multiply n1|u1 by n2|u2 +giving the product n3|u3. + +<P> + +<hr> +<A name=6.1.0100> +<code> +6.1.0100 <B>*/</B> +</code> +</a> +<BR> +<B>star-slash</B> CORE +<BR> +<pre> + ( n1 n2 n3 -- n4 ) +</pre> + +<P> + +Multiply n1 by n2 producing the intermediate double-cell result d. +Divide d by n3 giving the single-cell quotient n4. An ambiguous +condition exists if n3 is zero or if the quotient n4 lies outside the +range of a signed number. If d and n3 differ in sign, the +implementation-defined result returned will be the same as that returned +by either the phrase +<b><code> +&gt;R M* R&gt; FM/MOD SWAP DROP +</code></b> +or the phrase +<b><code> +&gt;R M* R&gt; SM/REM SWAP DROP +</code></b>. + +<P> + +<code> +See: +<A href=dpans3.htm#3.2.2.1>3.2.2.1</a> Integer division +</code> + +<P> + +<hr> +<A name=6.1.0110> +<code> +6.1.0110 <B>*/MOD</B> +</code> +</a> +<BR> +<B>star-slash-mod</B> CORE +<BR> +<pre> + ( n1 n2 n3 -- n4 n5 ) +</pre> + +<P> + +Multiply n1 by n2 producing the intermediate double-cell result d. Divide d +by n3 producing the single-cell remainder n4 and the single-cell quotient n5. +An ambiguous condition exists if n3 is zero, or if the quotient n5 lies +outside the range of a single-cell signed integer. If d and n3 differ in +sign, the implementation-defined result returned will be the same as that +returned by either the phrase +<b><code> +&gt;R M* R&gt; FM/MOD +</code></b> +or the phrase +<b><code> +&gt;R M* R&gt; SM/REM +</code></b>. + +<P> + +<code> +See: +<A href=dpans3.htm#3.2.2.1>3.2.2.1</a> Integer division +</code> + +<P> + +<hr> +<A name=6.1.0120> +<code> +6.1.0120 <B>+</B> +</code> +</a> +<BR> +<B>plus</B> CORE +<BR> +<pre> + ( n1|u1 n2|u2 -- n3|u3 ) +</pre> + +<P> + +Add n2|u2 +to n1|u1, giving the sum n3|u3. + +<P> + +<code> +See: +<A href=dpans3.htm#3.3.3.1>3.3.3.1</a> Address alignment +</code> + +<P> + +<hr> +<A name=6.1.0130> +<code> +6.1.0130 <B>+!</B> +</code> +</a> +<BR> +<B>plus-store</B> CORE +<BR> +<pre> + ( n|u a-addr -- ) +</pre> + +<P> + +Add n|u +to the single-cell number at a-addr. + +<P> + +<code> +See: +<A href=dpans3.htm#3.3.3.1>3.3.3.1</a> Address alignment +</code> + +<P> + +<hr> +<A name=6.1.0140> +<code> +6.1.0140 <B>+LOOP</B> +</code> +</a> +<BR> +<B>plus-loop</B> CORE +<BR> + +<P> +<pre> + Interpretation: Interpretation semantics for this word are undefined. +</pre> +<P> +<pre> + Compilation: ( C: do-sys -- ) +</pre> +<P> + +Append the run-time semantics given below to the current definition. +Resolve the destination of all unresolved occurrences of +<a href=dpans6.htm#6.1.1760>LEAVE</a> between +the location given by do-sys and the next location for a transfer of +control, to execute the words following +LOOP. +<P> +<pre> + Run-time: ( n -- ) ( R: loop-sys1 -- | loop-sys2 ) +</pre> +<P> + +An ambiguous condition exists if the loop control parameters are +unavailable. Add n to the loop index. If the loop index did not cross +the boundary between the loop limit minus one and the loop limit, +continue execution at the beginning of the loop. Otherwise, discard the +current loop control parameters and continue execution immediately +following the loop. + +<P> + +<code> +See: +<A href=dpans6.htm#6.1.1240>6.1.1240 DO</a> , +<A href=dpans6.htm#6.1.1680>6.1.1680 I</a> , +<A href=dpans6.htm#6.1.1760>6.1.1760 LEAVE</a> , +<a href=dpansa6.htm#A.6.1.0140>A.6.1.0140 +LOOP</a> +</code> + +<P> + +<hr> +<A name=6.1.0150> +<code> +6.1.0150 <B>,</B> +</code> +</a> +<BR> +<B>comma</B> CORE +<BR> +<pre> + ( x -- ) +</pre> + +<P> + +Reserve one cell of data space and store x in the cell. If the data-space +pointer is aligned when , begins execution, it will remain aligned when , +finishes execution. An ambiguous condition exists if the data-space pointer +is not aligned prior to execution of ,. + +<P> + +<code> +See: +<A href=dpans3.htm#3.3.3>3.3.3</a> Data space, +<A href=dpans3.htm#3.3.3.1>3.3.3.1</a> Address alignment, +<a href=dpansa6.htm#A.6.1.0150>A.6.1.0150 ,</a> +</code> + + +<P> + +<hr> +<A name=6.1.0160> +<code> +6.1.0160 <B>-</B> +</code> +</a> +<BR> +<B>minus</B> CORE +<BR> +<pre> + ( n1|u1 n2|u2 -- n3|u3 ) +</pre> + +<P> + +Subtract n2|u2 +from n1|u1, giving the difference n3|u3. + +<P> + +<code> +See: +<A href=dpans3.htm#3.3.3.1>3.3.3.1</a> Address alignment. +</code> + + +<P> + +<hr> +<A name=6.1.0180> +<code> +6.1.0180 <B>.</B> +</code> +</a> +<BR> +<B>dot</B> CORE +<BR> +<pre> + ( n -- ) +</pre> + +<P> + +Display n in +free field format. + +<P> + +<code> +See: +<A href=dpans3.htm#3.2.1.2>3.2.1.2</a> Digit conversion, +<A href=dpans3.htm#3.2.1.3>3.2.1.3</a> Free-field number display. +</code> + +<P> + +<hr> +<A name=6.1.0190> +<code> +6.1.0190 <B>."</B> +</code> +</a> +<BR> +<B>dot-quote</B> CORE +<BR> + +<P> +<pre> + Interpretation: Interpretation semantics for this word are undefined. +</pre> +<P> +<pre> + Compilation: ( <B>"ccc&lt;quote&gt;"</B> -- ) +</pre> +<P> + +Parse ccc delimited by " (double-quote). Append the run-time semantics +given below to the current definition. + + +<PRE> + Run-time: ( -- ) +</PRE> + +<P> + +Display +ccc. + +<P> + +<code> +See: +<A href=dpans3.htm#3.4.1>3.4.1</a> Parsing, +<A href=dpans6.htm#6.2.0200>6.2.0200 .(</a> , +<a href=dpansa6.htm#A.6.1.0190>A.6.1.0190 ."</a> +</code> + +<P> + +<hr> +<A name=6.1.0230> +<code> +6.1.0230 <B>/</B> +</code> +</a> +<BR> +<B>slash</B> CORE +<BR> +<pre> + ( n1 n2 -- n3 ) +</pre> + +<P> + +Divide n1 by n2, giving the single-cell quotient n3. An ambiguous +condition exists if n2 is zero. If n1 and n2 differ in sign, the +implementation-defined result returned will be the same as that returned +by either the phrase +<b><code> +&gt;R S&gt;D R&gt; FM/MOD SWAP DROP +</code></b> +or the phrase +<b><code> +&gt;R S&gt;D R&gt; SM/REM SWAP DROP +</code></b>. + +<P> + +<code> +See: +<A href=dpans3.htm#3.2.2.1>3.2.2.1</a> Integer division +</code> + +<P> + +<hr> +<A name=6.1.0240> +<code> +6.1.0240 <B>/MOD</B> +</code> +</a> +<BR> +<B>slash-mod</B> CORE +<BR> +<pre> + ( n1 n2 -- n3 n4 ) +</pre> + +<P> + +Divide n1 by n2, giving the single-cell remainder n3 and the single-cell +quotient n4. An ambiguous condition exists if n2 is zero. If n1 and n2 +differ in sign, the implementation-defined result returned will be the +same as that returned by either the phrase +<b><code> +&gt;R S&gt;D R&gt; FM/MOD +</code></b> +or the phrase +<b><code> +&gt;R S&gt;D R&gt; SM/REM +</code></b>. + +<P> + +<code> +See: +<A href=dpans3.htm#3.2.2.1>3.2.2.1</a> Integer division +</code> + +<P> + +<hr> +<A name=6.1.0250> +<code> +6.1.0250 <B>0&lt;</B> +</code> +</a> +<BR> +<B>zero-less</B> CORE +<BR> +<pre> + ( n -- flag ) +</pre> + +<P> + +flag is true +if and only if n is less than zero. + +<P> + +<hr> +<A name=6.1.0270> +<code> +6.1.0270 <B>0=</B> +</code> +</a> +<BR> +<B>zero-equals</B> CORE +<BR> +<pre> + ( x -- flag ) +</pre> + +<P> + +flag is +true if and only if x is equal to zero. + +<P> + +<hr> +<A name=6.1.0290> +<code> +6.1.0290 <B>1+</B> +</code> +</a> +<BR> +<B>one-plus</B> CORE +<BR> +<pre> + ( n1|u1 -- n2|u2 ) +</pre> + +<P> + +Add one (1) +to n1|u1 giving the sum n2|u2. + +<P> + +<hr> +<A name=6.1.0300> +<code> +6.1.0300 <B>1-</B> +</code> +</a> +<BR> +<B>one-minus</B> CORE +<BR> +<pre> + ( n1|u1 -- n2|u2 ) +</pre> + +<P> + +Subtract one (1) +from n1|u1 giving the difference n2|u2. + +<P> + +<hr> +<A name=6.1.0310> +<code> +6.1.0310 <B>2!</B> +</code> +</a> +<BR> +<B>two-store</B> CORE +<BR> +<pre> + ( x1 x2 a-addr -- ) +</pre> + +<P> + +Store the cell pair x1 x2 at a-addr, with x2 at a-addr and x1 at the next +consecutive cell. It is equivalent to the sequence +<b><code> +SWAP OVER ! CELL+ ! +</code></b>. + +<P> + +<code> +See: +<A href=dpans3.htm#3.3.3.1>3.3.3.1</a> Address alignment +</code> + +<P> + +<hr> +<A name=6.1.0320> +<code> +6.1.0320 <B>2*</B> +</code> +</a> +<BR> +<B>two-star</B> CORE +<BR> +<pre> + ( x1 -- x2 ) +</pre> + +<P> + +x2 is the result of shifting x1 one bit toward the most-significant bit, +filling the vacated least-significant bit with zero. + +<P> +<code> +See: +<a href=dpansa6.htm#A.6.1.0320>A.6.1.0320 2*</a> +</code> +<p> + +<hr> +<A name=6.1.0330> +<code> +6.1.0330 <B>2/</B> +</code> +</a> +<BR> +<B>two-slash</B> CORE +<BR> +<pre> + ( x1 -- x2 ) +</pre> + +<P> + +x2 is the result of shifting x1 one bit toward the least-significant +bit, leaving the most-significant bit unchanged. + +<P> +<code> +See: +<a href=dpansa6.htm#A.6.1.0330>A.6.1.0330 2/</a> +</code> +<p> + +<hr> +<A name=6.1.0350> +<code> +6.1.0350 <B>2@</B> +</code> +</a> +<BR> +<B>two-fetch</B> CORE +<BR> +<pre> + ( a-addr -- x1 x2 ) +</pre> + +<P> + +Fetch the cell pair x1 x2 stored at a-addr. x2 is stored at a-addr and +x1 at the next consecutive cell. It is equivalent to the sequence +<b><code> +DUP CELL+ @ SWAP @ +</code></b>. + +<P> + +<code> +See: +<A href=dpans3.htm#3.3.3.1>3.3.3.1</a> Address alignment, +<A href=dpans6.htm#6.1.0310>6.1.0310 2!</a> , +<a href=dpansa6.htm#A.6.1.0350>A.6.1.0350 2@</a> +</code> + +<P> + +<hr> +<A name=6.1.0370> +<code> +6.1.0370 <B>2DROP</B> +</code> +</a> +<BR> +<B>two-drop</B> CORE +<BR> +<pre> + ( x1 x2 -- ) +</pre> + +<P> + +Drop cell +pair x1 x2 from the stack. + +<P> + +<hr> +<A name=6.1.0380> +<code> +6.1.0380 <B>2DUP</B> +</code> +</a> +<BR> +<B>two-dupe</B> CORE +<BR> +<pre> + ( x1 x2 -- x1 x2 x1 x2 ) +</pre> + +<P> + +Duplicate cell +pair x1 x2. + +<P> + +<hr> +<A name=6.1.0400> +<code> +6.1.0400 <B>2OVER</B> +</code> +</a> +<BR> +<B>two-over</B> CORE +<BR> +<pre> + ( x1 x2 x3 x4 -- x1 x2 x3 x4 x1 x2 ) +</pre> + +<P> + +Copy cell +pair x1 x2 to the top of the stack. + +<P> + +<hr> +<A name=6.1.0430> +<code> +6.1.0430 <B>2SWAP</B> +</code> +</a> +<BR> +<B>two-swap</B> CORE +<BR> +<pre> + ( x1 x2 x3 x4 -- x3 x4 x1 x2 ) +</pre> + +<P> + +Exchange the +top two cell pairs. + +<P> + +<hr> +<A name=6.1.0450> +<code> +6.1.0450 <B>:</B> +</code> +</a> +<BR> +<B>colon</B> CORE +<BR> +<pre> + ( C: <B>"&lt;spaces&gt;name"</B> -- colon-sys ) +</pre> + +<P> + +Skip leading space delimiters. Parse name delimited by a space. Create +a definition for name, called a <B>colon definition</B>. Enter +compilation state and start the current definition, producing colon-sys. +Append the initiation semantics given below to the current definition. + +<P> + +The execution semantics of name will be determined by the words compiled +into the body of the definition. The current definition shall not be +findable in the dictionary until it is ended (or until the execution of +<a href=dpans6.htm#6.1.1250>DOES&gt;</a> +in some systems). +<P> +<pre> + Initiation: ( i*x -- i*x ) ( R: -- nest-sys ) +</pre> +<P> + +Save implementation-dependent information nest-sys about the calling +definition. The stack effects i*x represent arguments to name. + +<P> +<pre> + <i>name</i> Execution: ( i*x -- j*x ) +</pre> +<P> + +Execute the definition name. The stack effects i*x and j*x represent +arguments to and results from name, respectively. + +<P> + +<code> +See: +<A href=dpans3.htm#3.4>3.4</a> The Forth text interpreter, +<A href=dpans3.htm#3.4.1>3.4.1</a> Parsing, +<A href=dpans3.htm#3.4.5>3.4.5</a> Compilation, +<A href=dpans6.htm#6.1.2500>6.1.2500 [</a> , +<A href=dpans6.htm#6.1.2540>6.1.2540 ]</a> , +<A href=dpans15.htm#15.6.2.0470>15.6.2.0470 ;CODE</a> , +<a href=dpansa6.htm#A.6.1.0450>A.6.1.0450 :</a> , +<a href=a0005.htm>RFI 0005</a> Initiation semantics. +</code> + + +<P> + +<hr> +<A name=6.1.0460> +<code> +6.1.0460 <B>;</B> +</code> +</a> +<BR> +<B>semicolon</B> CORE +<BR> + +<P> +<pre> + Interpretation: Interpretation semantics for this word are undefined. +</pre> +<P> +<pre> + Compilation: ( C: colon-sys -- ) +</pre> +<P> + +Append the run-time semantics below to the current definition. End the +current definition, allow it to be found in the dictionary and enter +interpretation state, consuming colon-sys. If the data-space pointer is +not aligned, reserve enough data space to align it. + +<P> +<pre> + Run-time: ( -- ) ( R: nest-sys -- ) +</pre> +<P> + +Return to +the calling definition specified by nest-sys. + +<P> + +<code> +See: +<A href=dpans3.htm#3.4>3.4</a> The Forth text interpreter, +<A href=dpans3.htm#3.4.5>3.4.5</a> Compilation, +<a href=dpansa6.htm#A.6.1.0460>A.6.1.0460 ;</a> +</code> + +<P> + +<hr> +<A name=6.1.0480> +<code> +6.1.0480 <B>&lt;</B> +</code> +</a> +<BR> +<B>less-than</B> CORE +<BR> +<pre> + ( n1 n2 -- flag ) +</pre> + +<P> + +flag is +true if and only if n1 is less than n2. + +<P> + +<code> +See: +<A href=dpans6.htm#6.1.2340>6.1.2340 U&lt;</a> +</code> + +<P> + +<hr> +<A name=6.1.0490> +<code> +6.1.0490 <B>&lt;#</B> +</code> +</a> +<BR> +<B>less-number-sign</B> CORE +<BR> +<pre> + ( -- ) +</pre> + +<P> + +Initialize the +pictured numeric output conversion process. + +<P> + +<code> +See: +<A href=dpans6.htm#6.1.0030>6.1.0030 #</a> , +<A href=dpans6.htm#6.1.0040>6.1.0040 #&gt;</a> , +<A href=dpans6.htm#6.1.0050>6.1.0050 #S</a> +</code> + +<P> + +<hr> +<A name=6.1.0530> +<code> +6.1.0530 <B>=</B> +</code> +</a> +<BR> +<B>equals</B> CORE +<BR> +<pre> + ( x1 x2 -- flag ) +</pre> + +<P> + +flag is true +if and only if x1 is bit-for-bit the same as x2. + +<P> + +<hr> +<A name=6.1.0540> +<code> +6.1.0540 <B>&gt;</B> +</code> +</a> +<BR> +<B>greater-than</B> CORE +<BR> +<pre> + ( n1 n2 -- flag ) +</pre> + +<P> + +flag is true +if and only if n1 is greater than n2. + +<P> + +<code> +See: +<A href=dpans6.htm#6.2.2350>6.2.2350 U&gt;</a> +</code> + +<P> + +<hr> +<A name=6.1.0550> +<code> +6.1.0550 <B>&gt;BODY</B> +</code> +</a> +<BR> +<B>to-body</B> CORE +<BR> +<pre> + ( xt -- a-addr ) +</pre> + +<P> + +a-addr is the data-field address corresponding to xt. An ambiguous +condition exists if xt is not for a word defined via +<a href=dpans6.htm#6.1.1000>CREATE</a>. + +<P> + +<code> +See: +<A href=dpans3.htm#3.3.3>3.3.3</a> Data space, +<a href=dpansa6.htm#A.6.1.0550>A.6.1.0550 &gt;BODY</a> +</code> + + +<P> + +<hr> +<A name=6.1.0560> +<code> +6.1.0560 <B>&gt;IN</B> +</code> +</a> +<BR> +<B>to-in</B> CORE +<BR> +<pre> + ( -- a-addr ) +</pre> + +<P> + +a-addr is the address of a cell containing the offset in characters from +the start of the input buffer to the start of the parse area. + +<P> + +<hr> +<A name=6.1.0570> +<code> +6.1.0570 <B>&gt;NUMBER</B> +</code> +</a> +<BR> +<B>to-number</B> CORE +<BR> +<pre> + ( ud1 c-addr1 u1 -- ud2 c-addr2 u2 ) +</pre> + +<P> + +ud2 is the unsigned result of converting the characters within the +string specified by c-addr1 u1 into digits, using the number in +<a href=dpans6.htm#6.1.0750>BASE</a>, +and adding each into ud1 after multiplying ud1 by the number in BASE. +Conversion continues left-to-right until a character that is not +convertible, including any <B>+</B> or <B>-</B>, is encountered or the +string is entirely converted. c-addr2 is the location of the first +unconverted character or the first character past the end of the string +if the string was entirely converted. u2 is the number of unconverted +characters in the string. An ambiguous condition exists if ud2 +overflows during the conversion. + +<P> + +<code> +See: +<A href=dpans3.htm#3.2.1.2>3.2.1.2</a> Digit conversion +</code> + +<P> + +<hr> +<A name=6.1.0580> +<code> +6.1.0580 <B>&gt;R</B> +</code> +</a> +<BR> +<B>to-r</B> CORE +<BR> + +<P> +<pre> + Interpretation: Interpretation semantics for this word are undefined. +</pre> +<P> +<pre> + Execution: ( x -- ) ( R: -- x ) +</pre> +<P> + +Move x to +the return stack. + +<P> + +<code> +See: +<A href=dpans3.htm#3.2.3.3>3.2.3.3</a> Return stack, +<A href=dpans6.htm#6.1.2060>6.1.2060 R&gt;</a> , +<A href=dpans6.htm#6.1.2070>6.1.2070 R@</a> , +<A href=dpans6.htm#6.2.0340>6.2.0340 2&gt;R</a> , +<A href=dpans6.htm#6.2.0410>6.2.0410 2R&gt;</a> , +<A href=dpans6.htm#6.2.0415>6.2.0415 2R@</a> +</code> +<P> + +<hr> +<A name=6.1.0630> +<code> +6.1.0630 <B>?DUP</B> +</code> +</a> +<BR> +<B>question-dupe</B> CORE +<BR> +<pre> + ( x -- 0 | x x ) +</pre> + +<P> + +Duplicate x +if it is non-zero. + +<P> + +<hr> +<A name=6.1.0650> +<code> +6.1.0650 <B>@</B> +</code> +</a> +<BR> +<B>fetch</B> CORE +<BR> +<pre> + ( a-addr -- x ) +</pre> + +<P> + +x is the +value stored at a-addr. + +<P> + +<code> +See: +<A href=dpans3.htm#3.3.3.1>3.3.3.1</a> Address alignment +</code> + +<P> + +<hr> +<A name=6.1.0670> +<code> +6.1.0670 <B>ABORT</B> +</code> +</a> +<BR> +CORE +<BR> +<pre> + ( i*x -- ) ( R: j*x -- ) +</pre> + +<P> + +Empty the data stack and perform the function of +<a href=dpans6.htm#6.1.2050>QUIT</a>, which includes +emptying the return stack, without displaying a message. + +<P> + +<code> +See: +<A href=dpans9.htm#9.6.2.0670>9.6.2.0670 ABORT</a> +</code> + +<P> + +<hr> +<A name=6.1.0680> +<code> +6.1.0680 <B>ABORT"</B> +</code> +</a> +<BR> +<B>abort-quote</B> CORE +<BR> + +<P> +<pre> + Interpretation: Interpretation semantics for this word are undefined. +</pre> +<P> +<pre> + Compilation: ( <B>"ccc&lt;quote&gt;"</B> -- ) +</pre> +<P> + +Parse ccc delimited by a " (double-quote). Append the run-time semantics +given below to the current definition. + +<p> +<pre> + Run-time: ( i*x x1 -- | i*x ) ( R: j*x -- | j*x ) +</pre> +<P> + +Remove x1 from the stack. If any bit of x1 is not zero, display ccc and +perform an implementation-defined abort sequence that includes the +function of +<a href=dpans6.htm#6.1.0670>ABORT</a>. + +<P> + +<code> +See: +<A href=dpans3.htm#3.4.1>3.4.1</a> Parsing, +<A href=dpans9.htm#9.6.2.0680>9.6.2.0680 ABORT"</a> , +<a href=dpansa6.htm#A.6.1.0680>A.6.1.0680 ABORT"</a> +</code> + +<P> + +<hr> +<A name=6.1.0690> +<code> +6.1.0690 <B>ABS</B> +</code> +</a> +<BR> +<B>abs</B> CORE +<BR> +<pre> + ( n -- u ) +</pre> + +<P> + +u is the +absolute value of n. + +<P> + +<hr> +<A name=6.1.0695> +<code> +6.1.0695 <B>ACCEPT</B> +</code> +</a> +<BR> +CORE +<pre> + ( c-addr +n1 -- +n2 ) +</pre> + +<P> + +Receive a string of at most +n1 characters. An ambiguous condition +exists if +n1 is zero or greater than 32,767. Display graphic +characters as they are received. A program that depends on the presence +or absence of non-graphic characters in the string has an environmental +dependency. The editing functions, if any, that the system performs in +order to construct the string are implementation-defined. + +<P> + +Input terminates when an implementation-defined line terminator is +received. When input terminates, nothing is appended to the string, and +the display is maintained in an implementation-defined way. + +<P> + ++n2 is the +length of the string stored at c-addr. + +<P> +<code> +See: +<a href=dpansa6.htm#A.6.1.0695>A.6.1.0695 ACCEPT</a> +</code> +<p> + +<hr> +<A name=6.1.0705> +<code> +6.1.0705 <B>ALIGN</B> +</code> +</a> +<BR> +CORE +<BR> +<pre> + ( -- ) +</pre> + +<P> + +If the data-space pointer is not aligned, reserve enough space to align +it. + +<P> + +<code> +See: +<A href=dpans3.htm#3.3.3>3.3.3</a> Data space, +<A href=dpans3.htm#3.3.3.1>3.3.3.1</a> Address alignment, +<a href=dpansa6.htm#A.6.1.0705>A.6.1.0705 ALIGN</a> +</code> + + +<P> + +<hr> +<A name=6.1.0706> +<code> +6.1.0706 <B>ALIGNED</B> +</code> +</a> +<BR> +CORE +<BR> +<pre> + ( addr -- a-addr ) +</pre> + +<P> + +a-addr +is the first aligned address greater than or equal to addr. + +<P> + +<code> +See: +<A href=dpans3.htm#3.3.3.1>3.3.3.1</a> Address alignment, +<a href=dpans6.htm#6.1.0705>6.1.0705 ALIGN</a> +</code> + + +<P> + +<hr> +<A name=6.1.0710> +<code> +6.1.0710 <B>ALLOT</B> +</code> +</a> +<BR> +CORE +<BR> +<pre> + ( n -- ) +</pre> + +<P> + +If n is greater than zero, reserve n address units of data space. If n +is less than zero, release |n| address units of data space. If n is +zero, leave the data-space pointer unchanged. + +<P> + +If the data-space pointer is aligned and n is a multiple of the size of +a cell when ALLOT begins execution, it will remain aligned when ALLOT +finishes execution. + +<P> + +If the data-space pointer is character aligned and n is a multiple of +the size of a character when ALLOT begins execution, it will remain +character aligned when ALLOT finishes execution. + +<P> + +<code> +See: +<A href=dpans3.htm#3.3.3>3.3.3</a> Data space +</code> + +<P> + +<hr> +<A name=6.1.0720> +<code> +6.1.0720 <B>AND</B> +</code> +</a> +<BR> +CORE +<BR> +<pre> + ( x1 x2 -- x3 ) +</pre> + +<P> + +x3 is +the bit-by-bit logical <B>and</B> of x1 with x2. + +<P> + +<hr> +<A name=6.1.0750> +<code> +6.1.0750 <B>BASE</B> +</code> +</a> +<BR> +CORE +<BR> +<pre> + ( -- a-addr ) +</pre> + +<P> + +a-addr is the address of a cell containing the current number-conversion +radix {{2...36}}. + +<P> + +<hr> +<A name=6.1.0760> +<code> +6.1.0760 <B>BEGIN</B> +</code> +</a> +<BR> +CORE +<BR> + +<P> +<pre> + Interpretation: Interpretation semantics for this word are undefined. +</pre> +<P> +<pre> + Compilation: ( C: -- dest ) +</pre> +<P> + +Put the next location for a transfer of control, dest, onto the control +flow stack. Append the run-time semantics given below to the current +definition. + +<P> +<pre> + Run-time: ( -- ) +</pre> +<P> + +Continue +execution. + +<P> + +<code> +See: +<A href=dpans3.htm#3.2.3.2>3.2.3.2</a> Control-flow stack, +<A href=dpans6.htm#6.1.2140>6.1.2140 REPEAT</a> , +<A href=dpans6.htm#6.1.2390>6.1.2390 UNTIL</a> , +<A href=dpans6.htm#6.1.2430>6.1.2430 WHILE</a> , +<a href=dpansa6.htm#A.6.1.0760>A.6.1.0760 BEGIN</a> +</code> + +<P> + +<hr> +<A name=6.1.0770> +<code> +6.1.0770 <B>BL</B> +</code> +</a> +<BR> +<B>b-l</B> CORE +<BR> +<pre> + ( -- char ) +</pre> + +<P> + +char is +the character value for a space. + +<P> +<code> +See: +<a href=dpansa6.htm#A.6.1.0770>A.6.1.0770 BL</a> +</code> +<p> + +<hr> +<A name=6.1.0850> +<code> +6.1.0850 <B>C!</B> +</code> +</a> +<BR> +<B>c-store</B> CORE +<BR> +<pre> + ( char c-addr -- ) +</pre> + +<P> + +Store char at c-addr. When character size is smaller than cell size, +only the number of low-order bits corresponding to character size are +transferred. + +<P> + +<code> +See: +<A href=dpans3.htm#3.3.3.1>3.3.3.1</a> Address alignment +</code> + +<P> + +<hr> +<A name=6.1.0860> +<code> +6.1.0860 <B>C,</B> +</code> +</a> +<BR> +<B>c-comma</B> CORE +<BR> +<pre> + ( char -- ) +</pre> + +<P> + +Reserve space for one character in the data space and store char in the +space. If the data-space pointer is character aligned when C, begins +execution, it will remain character aligned when C, finishes execution. +An ambiguous condition exists if the data-space pointer is not +character-aligned prior to execution of C,. + +<P> + +<code> +See: +<A href=dpans3.htm#3.3.3>3.3.3</a> Data space, +<A href=dpans3.htm#3.3.3.1>3.3.3.1</a> Address alignment. +</code> + +<P> + +<hr> +<A name=6.1.0870> +<code> +6.1.0870 <B>C@</B> +</code> +</a> +<BR> +<B>c-fetch</B> CORE +<BR> +<pre> + ( c-addr -- char ) +</pre> + +<P> + +Fetch the character stored at c-addr. When the cell size is greater +than character size, the unused high-order bits are all zeroes. + +<P> + +<code> +See: +<A href=dpans3.htm#3.3.3.1>3.3.3.1</a> Address alignment +</code> + +<P> + +<hr> +<A name=6.1.0880> +<code> +6.1.0880 <B>CELL+</B> +</code> +</a> +<BR> +CORE +<BR> +<pre> + ( a-addr1 -- a-addr2 ) +</pre> + +<P> + +Add the +size in address units of a cell to a-addr1, giving a-addr2. + +<P> + +<code> +See: +<A href=dpans3.htm#3.3.3.1>3.3.3.1</a> Address alignment, +<a href=dpansa6.htm#A.6.1.0880>A.6.1.0880 CELL+</a> +</code> + + +<P> + +<hr> +<A name=6.1.0890> +<code> +6.1.0890 <B>CELLS</B> +</code> +</a> +<BR> +CORE +<BR> +<pre> + ( n1 -- n2 ) +</pre> + +<P> + +n2 is +the size in address units of n1 cells. + +<P> +<code> +See: +<a href=dpansa6.htm#A.6.1.0890>A.6.1.0890 CELLS</a> +</code> +<p> + +<hr> +<A name=6.1.0895> +<code> +6.1.0895 <B>CHAR</B> +</code> +</a> +<BR> +<B>char</B> CORE +<BR> +<pre> + ( <B>"&lt;spaces&gt;name"</B> -- char ) +</pre> + +<P> + +Skip leading +space delimiters. Parse name delimited by a space. Put the +value of its first character onto the stack. + +<P> + +<code> +See: +<A href=dpans3.htm#3.4.1>3.4.1</a> Parsing, +<A href=dpans6.htm#6.1.2520>6.1.2520 [CHAR]</a> , +<a href=dpansa6.htm#A.6.1.0895>A.6.1.0895 CHAR</a> +</code> + +<P> + +<hr> +<A name=6.1.0897> +<code> +6.1.0897 <B>CHAR+</B> +</code> +</a> +<BR> +<B>char-plus</B> CORE +<BR> +<pre> + ( c-addr1 -- c-addr2 ) +</pre> + +<P> + +Add the +size in address units of a character to c-addr1, giving c-addr2. + +<P> + +<code> +See: +<A href=dpans3.htm#3.3.3.1>3.3.3.1</a> Address alignment +</code> + +<P> + +<hr> +<A name=6.1.0898> +<code> +6.1.0898 <B>CHARS</B> +</code> +</a> +<BR> +<B>chars</B> CORE +<BR> +<pre> + ( n1 -- n2 ) +</pre> + +<P> + +n2 is +the size in address units of n1 characters. + + +<P> + +<hr> +<A name=6.1.0950> +<code> +6.1.0950 <B>CONSTANT</B> +</code> +</a> +<BR> +CORE +<BR> +<pre> + ( x <B>"&lt;spaces&gt;name"</B> -- ) +</pre> + +<P> + +Skip leading +space delimiters. Parse name delimited by a space. Create a +definition for name with the execution semantics defined below. + +<P> + +name is +referred to as a <B>constant</B>. + +<P> +<pre> + <i>name</i> Execution: ( -- x ) +</pre> +<P> + +Place x +on the stack. + +<P> + +<code> +See: +<A href=dpans3.htm#3.4.1>3.4.1</a> Parsing, +<a href=dpansa6.htm#A.6.1.0950>A.6.1.0950 CONSTANT</a> +</code> + +<P> + +<hr> +<A name=6.1.0980> +<code> +6.1.0980 <B>COUNT</B> +</code> +</a> +<BR> +CORE +<BR> +<pre> + ( c-addr1 -- c-addr2 u ) +</pre> + +<P> + +Return the +character string specification for the counted string stored at +c-addr1. c-addr2 is the address of the first character after c-addr1. u is +the contents of the character at c-addr1, which is the length in characters of +the string at c-addr2. + +<P> + +<hr> +<A name=6.1.0990> +<code> +6.1.0990 <B>CR</B> +</code> +</a> +<BR> +<B>c-r</B> CORE +<BR> +<pre> + ( -- ) +</pre> + +<P> + +Cause subsequent +output to appear at the beginning of the next line. + +<P> + +<hr> +<A name=6.1.1000> +<code> +6.1.1000 <B>CREATE</B> +</code> +</a> +<BR> +CORE +<BR> +<pre> + ( <B>"&lt;spaces&gt;name"</B> -- ) +</pre> + +<P> + +Skip leading +space delimiters. Parse name delimited by a space. Create a +definition for name with the execution semantics defined below. If the +data-space pointer is not aligned, reserve enough data space to align it. The +new data-space pointer defines name's data field. CREATE does not allocate +data space in name's data field. + +<P> +<pre> + <i>name</i> Execution: ( -- a-addr ) +</pre> +<P> + +a-addr is the address of name's data field. The execution semantics of name +may be extended by using +<a href=dpans6.htm#6.1.1250>DOES&gt;</a>. + +<P> + +<code> +See: +<A href=dpans3.htm#3.3.3>3.3.3</a> Data space, +<a href=dpansa6.htm#A.6.1.1000>A.6.1.1000 CREATE</a> +</code> + +<P> + +<hr> +<A name=6.1.1170> +<code> +6.1.1170 <B>DECIMAL</B> +</code> +</a> +<BR> +CORE +<BR> +<pre> + ( -- ) +</pre> + +<P> + +Set the +numeric conversion radix to ten (decimal). + +<P> + +<hr> +<A name=6.1.1200> +<code> +6.1.1200 <B>DEPTH</B> +</code> +</a> +<BR> +CORE +<BR> +<pre> + ( -- +n ) +</pre> + +<P> + ++n is the number of single-cell values contained in the data stack +before +n was placed on the stack. + +<P> + +<hr> +<A name=6.1.1240> +<code> +6.1.1240 <B>DO</B> +</code> +</a> +<BR> +CORE +<BR> + +<P> +<pre> + Interpretation: Interpretation semantics for this word are undefined. +</pre> +<P> +<pre> + Compilation: ( C: -- do-sys ) +</pre> +<P> + +Place do-sys onto the control-flow stack. Append the run-time semantics +given below to the current definition. The semantics are incomplete +until resolved by a consumer of do-sys such as +<a href=dpans6.htm#6.1.1800>LOOP</a>. + +<P> +<pre> + Run-time: ( n1|u1 n2|u2 -- ) ( R: -- loop-sys ) +</pre> +<P> + +Set up loop control parameters with index n2|u2 and limit n1|u1. An +ambiguous condition exists if n1|u1 and n2|u2 are not both the same +type. Anything already on the return stack becomes unavailable until +the loop-control parameters are discarded. + +<P> + +<code> +See: +<A href=dpans3.htm#3.2.3.2>3.2.3.2</a> Control-flow stack, +<A href=dpans6.htm#6.1.0140>6.1.0140 +LOOP</a> , +<a href=dpansa6.htm#A.6.1.1240>A.6.1.1240 DO</a> +</code> + +<P> + +<hr> +<A name=6.1.1250> +<code> +6.1.1250 <B>DOES&gt;</B> +</code> +</a> +<BR> +<B>does</B> CORE +<BR> + +<P> +<pre> + Interpretation: Interpretation semantics for this word are undefined. +</pre> +<P> +<pre> + Compilation: ( C: colon-sys1 -- colon-sys2 ) +</pre> +<P> + +Append the run-time semantics below to the current definition. Whether +or not the current definition is rendered findable in the dictionary by +the compilation of DOES&gt; is implementation defined. Consume +colon-sys1 and produce colon-sys2. Append the initiation semantics +given below to the current definition. + +<P> +<pre> + Run-time: ( -- ) ( R: nest-sys1 -- ) +</pre> +<P> + +Replace the execution semantics of the most recent definition, referred +to as name, with the name execution semantics given below. Return +control to the calling definition specified by nest-sys1. An ambiguous +condition exists if name was not defined with +<a href=dpans6.htm#6.1.1000>CREATE</a> +or a user-defined +word that calls CREATE. + +<P> +<pre> + Initiation: ( i*x -- i*x a-addr ) ( R: -- nest-sys2 ) +</pre> +<P> + +Save implementation-dependent information nest-sys2 about the calling +definition. Place name's data field address on the stack. The stack +effects i*x represent arguments to name. + +<P> +<pre> + <i>name</i> Execution: ( i*x -- j*x ) +</pre> +<P> + +Execute the portion of the definition that begins with the initiation +semantics appended by the DOES&gt; which modified name. The stack +effects i*x and j*x represent arguments to and results from name, +respectively. + +<P> + +<code> +See: +<a href=dpansa6.htm#A.6.1.1250>A.6.1.1250 DOES&gt;</a> , +<a href=a0003.htm>RFI 0003</a> Defining words etc., +<a href=a0005.htm>RFI 0005</a> Initiation semantics. +</code> + +<P> + +<hr> +<A name=6.1.1260> +<code> +6.1.1260 <B>DROP</B> +</code> +</a> +<BR> +CORE +<BR> +<pre> + ( x -- ) +</pre> + +<P> + +Remove x +from the stack. + +<P> + +<hr> +<A name=6.1.1290> +<code> +6.1.1290 <B>DUP</B> +</code> +</a> +<BR> +<B>dupe</B> CORE +<BR> +<pre> + ( x -- x x ) +</pre> + +<P> + +Duplicate +x. + +<P> + +<hr> +<A name=6.1.1310> +<code> +6.1.1310 <B>ELSE</B> +</code> +</a> +<BR> +CORE +<BR> + +<P> +<pre> + Interpretation: Interpretation semantics for this word are undefined. +</pre> +<P> +<pre> + Compilation: ( C: orig1 -- orig2 ) +</pre> +<P> + +Put the location of a new unresolved forward reference orig2 onto the +control flow stack. Append the run-time semantics given below to the +current definition. The semantics will be incomplete until orig2 is +resolved (e.g., by +<a href=dpans6.htm#6.1.2270>THEN</a>). +Resolve the forward reference orig1 using the +location following the appended run-time semantics. + +<P> +<pre> + Run-time: ( -- ) +</pre> +<P> + +Continue execution at the location given by the resolution of orig2. + +<P> + +<code> +See: +<A href=dpans6.htm#6.1.1700>6.1.1700 IF</a> , +<a href=dpansa6.htm#A.6.1.1310>A.6.1.1310 ELSE</a> +</code> + +<P> + +<hr> +<A name=6.1.1320> +<code> +6.1.1320 <B>EMIT</B> +</code> +</a> +<BR> +CORE +<BR> +<pre> + ( x -- ) +</pre> + +<P> + +If x is a graphic character in the implementation-defined character set, +display x. The effect of EMIT for all other values of x is +implementation-defined. + +<P> + +When passed a character whose character-defining bits have a value +between hex 20 and 7E inclusive, the corresponding standard character, +specified by +<a href=dpans3.htm#3.1.2.1>3.1.2.1</a> +Graphic characters, is displayed. Because +different output devices can respond differently to control characters, +programs that use control characters to perform specific functions have +an environmental dependency. Each EMIT deals with only one character. + +<P> + +<code> +See: +<A href=dpans6.htm#6.1.2310>6.1.2310 TYPE</a> +</code> + +<P> + +<hr> +<A name=6.1.1345> +<code> +6.1.1345 <B>ENVIRONMENT?</B> +</code> +</a> +<BR> +<B>environment-query</B> CORE +<BR> +<pre> + ( c-addr u -- false | i*x true ) +</pre> + +<P> + +c-addr is the address of a character string and u is the string's +character count. u may have a value in the range from zero to an +implementation-defined maximum which shall not be less than 31. The +character string should contain a keyword from +<a href=dpans3.htm#3.2.6>3.2.6</a> Environmental +queries or the optional word sets to be checked for correspondence with +an attribute of the present environment. If the system treats the +attribute as unknown, the returned flag is false; otherwise, the flag is +true and the i*x returned is of the type specified in the table for the +attribute queried. + +<P> +<code> +See: +<a href=dpansa6.htm#A.6.1.1345>A.6.1.1345 ENVIRONMENT?</a> +</code> +<p> + +<hr> +<A name=6.1.1360> +<code> +6.1.1360 <B>EVALUATE</B> +</code> +</a> +<BR> +CORE +<BR> +<pre> + ( i*x c-addr u -- j*x ) +</pre> + +<P> + +Save the current input source specification. Store minus-one (-1) in +<a href=dpans6.htm#6.2.2218>SOURCE-ID</a> +if it is present. Make the string described by c-addr and u +both the input source and input buffer, set +<a href=dpans6.htm#6.1.0560>&gt;IN</a> +to zero, and +interpret. When the parse area is empty, restore the prior input source +specification. Other stack effects are due to the words EVALUATEd. + +<P> +<code> +See: +<a href=dpans7.htm#7.6.1.1360>7.6.1.1360 EVALUATE</a> , +<a href=dpansa6.htm#A.6.1.1360>A.6.1.1360 EVALUATE</a> , +<a href=a0006.htm>RFI 0006</a> Writing to Input Buffers. +</code> +<p> + +<hr> +<A name=6.1.1370> +<code> +6.1.1370 <B>EXECUTE</B> +</code> +</a> +<BR> +CORE +<BR> +<pre> + ( i*x xt -- j*x ) +</pre> + +<P> + +Remove xt from the stack and perform the semantics identified by it. +Other stack effects are due to the word EXECUTEd. + +<P> + +<code> +See: +<A href=dpans6.htm#6.1.0070>6.1.0070 '</a> , +<A href=dpans6.htm#6.1.2510>6.1.2510 [']</a> +</code> + +<P> + +<hr> +<A name=6.1.1380> +<code> +6.1.1380 <B>EXIT</B> +</code> +</a> +<BR> +CORE +<BR> + +<P> +<pre> + Interpretation: Interpretation semantics for this word are undefined. +</pre> +<P> +<pre> + Execution: ( -- ) ( R: nest-sys -- ) +</pre> +<P> + +Return control to the calling definition specified by nest-sys. Before +executing EXIT within a do-loop, a program shall discard the loop-control +parameters by executing +<a href=dpans6.htm#6.1.2380>UNLOOP</a>. + +<P> + +<code> +See: +<A href=dpans3.htm#3.2.3.3>3.2.3.3</a> Return stack, +<a href=dpansa6.htm#A.6.1.1380>A.6.1.1380 EXIT</a> +</code> + +<P> + +<hr> +<A name=6.1.1540> +<code> +6.1.1540 <B>FILL</B> +</code> +</a> +<BR> +CORE +<BR> +<pre> + ( c-addr u char -- ) +</pre> + +<P> + +If u +is greater than zero, store char in each of u consecutive characters of +memory beginning at c-addr. + +<P> + +<hr> +<A name=6.1.1550> +<code> +6.1.1550 <B>FIND</B> +</code> +</a> +<BR> +CORE +<BR> +<pre> + ( c-addr -- c-addr 0 | xt 1 | xt -1 ) +</pre> + +<P> + +Find the definition named in the counted string at c-addr. If the +definition is not found, return c-addr and zero. If the definition is +found, return its execution token xt. If the definition is immediate, +also return one (1), otherwise also return minus-one (-1). For a given +string, the values returned by FIND while compiling may differ from +those returned while not compiling. + +<P> + +<code> +See: +<A href=dpans3.htm#3.4.2>3.4.2</a> Finding definition names, +<A href=dpans6.htm#6.1.0070>6.1.0070 '</a> , +<A href=dpans6.htm#6.1.2510>6.1.2510 [']</a> , +<a href=dpansa6.htm#A.6.1.1550>A.6.1.1550 FIND</a> , +<A href=dpansa6.htm#A.6.1.2033>A.6.1.2033 POSTPONE</a> , +<A href=dpansd.htm#D.6.7>D.6.7</a> Immediacy. +</code> + +<P> + +<hr> +<A name=6.1.1561> +<code> +6.1.1561 <B>FM/MOD</B> +</code> +</a> +<BR> +<B>f-m-slash-mod</B> CORE +<BR> +<pre> + ( d1 n1 -- n2 n3 ) +</pre> + +<P> + +Divide d1 by n1, giving the floored quotient n3 and the remainder n2. +Input and output stack arguments are signed. An ambiguous condition +exists if n1 is zero or if the quotient lies outside the range of a +single-cell signed integer. + +<P> + +<code> +See: +<A href=dpans3.htm#3.2.2.1>3.2.2.1</a> Integer division, +<A href=dpans6.htm#6.1.2214>6.1.2214 SM/REM</a> , +<A href=dpans6.htm#6.1.2370>6.1.2370 UM/MOD</a> , +<a href=dpansa6.htm#A.6.1.1561>A.6.1.1561 FM/MOD</a> +</code> + +<P> + +<hr> +<A name=6.1.1650> +<code> +6.1.1650 <B>HERE</B> +</code> +</a> +<BR> +CORE +<BR> +<pre> + ( -- addr ) +</pre> + +<P> + +addr is +the data-space pointer. + +<P> + +<code> +See: +<A href=dpans3.htm#3.3.3.2>3.3.3.2</a> Contiguous regions +</code> + +<P> + +<hr> +<A name=6.1.1670> +<code> +6.1.1670 <B>HOLD</B> +</code> +</a> +<BR> +CORE +<BR> +<pre> + ( char -- ) +</pre> + +<P> + +Add char +to the beginning of the pictured numeric output string. An ambiguous +condition exists if HOLD executes outside of a +<a href=dpans6.htm#6.1.0490>&lt;#</a> +<a href=dpans6.htm#6.1.0040>#&gt;</a> +delimited number +conversion. + +<P> + +<hr> +<A name=6.1.1680> +<code> +6.1.1680 <B>I</B> +</code> +</a> +<BR> +CORE +<BR> + +<P> +<pre> + Interpretation: Interpretation semantics for this word are undefined. +</pre> +<P> +<pre> + Execution: ( -- n|u ) ( R: loop-sys -- loop-sys ) +</pre> +<P> + +n|u is a copy of the current (innermost) loop index. An ambiguous condition +exists if the loop control parameters are unavailable. + +<P> + +<hr> +<A name=6.1.1700> +<code> +6.1.1700 <B>IF</B> +</code> +</a> +<BR> +CORE +<BR> + +<P> +<pre> + Interpretation: Interpretation semantics for this word are undefined. +</pre> +<P> +<pre> + Compilation: ( C: -- orig ) +</pre> +<P> + +Put the location of a new unresolved forward reference orig onto the +control flow stack. Append the run-time semantics given below to the +current definition. The semantics are incomplete until orig is +resolved, e.g., by +<a href=dpans6.htm#6.1.2270>THEN</a> or +<a href=dpans6.htm#6.1.1310>ELSE</a>. + +<P> +<pre> + Run-time: ( x -- ) +</pre> +<P> + +If all bits of x are zero, continue execution at the location specified +by the resolution of orig. + +<P> + +<code> +See: +<A href=dpans3.htm#3.2.3.2>3.2.3.2</a> Control flow stack, +<a href=dpansa6.htm#A.6.1.1700>A.6.1.1700 IF</a> +</code> + +<P> + +<hr> +<A name=6.1.1710> +<code> +6.1.1710 <B>IMMEDIATE</B> +</code> +</a> +<BR> +CORE +<BR> +<pre> + ( -- ) +</pre> + +<P> + +Make the +most recent definition an immediate word. An ambiguous condition +exists if the most recent definition does not have a name. + +<P> + +<code> +See: +<a href=dpansa6.htm#A.6.1.1710>A.6.1.1710 IMMEDIATE</a> , +<A href=dpansd.htm#D.6.7>D.6.7</a> Immediacy, +<a href=a0007.htm>RFI 0007</a> Distinction between <em>immediacy</em> and <em>special compilation semantics</em>. +</code> + +<P> + +<hr> +<A name=6.1.1720> +<code> +6.1.1720 <B>INVERT</B> +</code> +</a> +<BR> +CORE +<BR> +<pre> + ( x1 -- x2 ) +</pre> + +<P> + +Invert all +bits of x1, giving its logical inverse x2. + +<P> + +<code> +See: +<A href=dpans6.htm#6.1.1910>6.1.1910 NEGATE</a> , +<A href=dpans6.htm#6.1.0270>6.1.0270 0=</a> , +<a href=dpansa6.htm#A.6.1.1720>A.6.1.1720 INVERT</a> +</code> + +<P> + +<hr> +<A name=6.1.1730> +<code> +6.1.1730 <B>J</B> +</code> +</a> +<BR> +CORE +<BR> + +<P> +<pre> + Interpretation: Interpretation semantics for this word are undefined. +</pre> +<P> +<pre> + Execution: ( -- n|u ) ( R: loop-sys1 loop-sys2 -- loop-sys1 loop-sys2 ) +</pre> +<P> + +n|u is a copy of the next-outer loop index. An ambiguous condition +exists if the loop control parameters of the next-outer loop, loop-sys1, +are unavailable. + +<P> +<code> +See: +<a href=dpansa6.htm#A.6.1.1730>A.6.1.1730 J</a> +</code> +<p> + +<hr> +<A name=6.1.1750> +<code> +6.1.1750 <B>KEY</B> +</code> +</a> +<BR> +CORE +<BR> +<pre> + ( -- char ) +</pre> + +<P> + +Receive one character char, a member of the implementation-defined +character set. Keyboard events that do not correspond to such +characters are discarded until a valid character is received, and those +events are subsequently unavailable. + +<P> + +All standard characters can be received. Characters received by KEY are +not displayed. + +<P> + +Any standard character returned by KEY has the numeric value specified +in +<a href=dpans3.htm#3.1.2.1>3.1.2.1</a> +Graphic characters. Programs that require the ability to +receive control characters have an environmental dependency. + +<P> + +<code> +See: +<A href=dpans10.htm#10.6.2.1305>10.6.2.1305 EKEY</a> , +<A href=dpans10.htm#10.6.1.1755>10.6.1.1755 KEY?</a> +</code> + +<P> + +<hr> +<A name=6.1.1760> +<code> +6.1.1760 <B>LEAVE</B> +</code> +</a> +<BR> +CORE +<BR> + +<P> +<pre> + Interpretation: Interpretation semantics for this word are undefined. +</pre> +<P> +<pre> + Execution: ( -- ) ( R: loop-sys -- ) +</pre> +<P> + +Discard the current loop control parameters. An ambiguous condition +exists if they are unavailable. Continue execution immediately +following the innermost syntactically enclosing +<a href=dpans6.htm#6.1.1240>DO</a> ... +<a href=dpans6.htm#6.1.1800>LOOP</a> +or DO ... +<a href=dpans6.htm#6.1.0140>+LOOP</a>. + +<P> + +<code> +See: +<A href=dpans3.htm#3.2.3.3>3.2.3.3</a> Return stack, +<a href=dpansa6.htm#A.6.1.1760>A.6.1.1760 LEAVE</a> +</code> + +<P> + +<hr> +<A name=6.1.1780> +<code> +6.1.1780 <B>LITERAL</B> +</code> +</a> +<BR> +CORE +<BR> + +<P> +<pre> + Interpretation: Interpretation semantics for this word are undefined. +</pre> +<P> +<pre> + Compilation: ( x -- ) +</pre> +<P> + +Append the run-time semantics +given below to the current definition. + +<P> +<pre> + Run-time: ( -- x ) +</pre> +<P> + +Place x +on the stack. + +<P> +<code> +See: +<a href=dpansa6.htm#A.6.1.1780>A.6.1.1780 LITERAL</a> +</code> +<p> + +<hr> +<A name=6.1.1800> +<code> +6.1.1800 <B>LOOP</B> +</code> +</a> +<BR> +CORE +<BR> + +<P> +<pre> + Interpretation: Interpretation semantics for this word are undefined. +</pre> +<P> +<pre> + Compilation: ( C: do-sys -- ) +</pre> +<P> + +Append the run-time semantics given below to the current definition. +Resolve the destination of all unresolved occurrences of +<a href=dpans6.htm#6.1.1760>LEAVE</a> +between +the location given by do-sys and the next location for a transfer of +control, to execute the words following the LOOP. + +<P> +<pre> + Run-time: ( -- ) ( R: loop-sys1 -- | loop-sys2 ) +</pre> +<P> + +An ambiguous condition exists if the loop control parameters are +unavailable. Add one to the loop index. If the loop index is then +equal to the loop limit, discard the loop parameters and continue +execution immediately following the loop. Otherwise continue execution +at the beginning of the loop. + +<P> + +<code> +See: +<A href=dpans6.htm#6.1.1240>6.1.1240 DO</a> , +<A href=dpans6.htm#6.1.1680>6.1.1680 I</a> , +<a href=dpansa6.htm#A.6.1.1800>A.6.1.1800 LOOP</a> +</code> + +<P> + +<hr> +<A name=6.1.1805> +<code> +6.1.1805 <B>LSHIFT</B> +</code> +</a> +<BR> +<B>l-shift</B> CORE +<BR> +<pre> + ( x1 u -- x2 ) +</pre> + +<P> + +Perform a +logical left shift of u bit-places on x1, giving x2. Put zeroes +into the least significant bits vacated by the shift. An ambiguous condition +exists if u is greater than or equal to the number of bits in a cell. + +<P> + +<hr> +<A name=6.1.1810> +<code> +6.1.1810 <B>M*</B> +</code> +</a> +<BR> +<B>m-star</B> CORE +<BR> +<pre> + ( n1 n2 -- d ) +</pre> + +<P> + +d is +the signed product of n1 times n2. + +<P> +<code> +See: +<a href=dpansa6.htm#A.6.1.1810>A.6.1.1810 M*</a> +</code> +<p> + +<hr> +<A name=6.1.1870> +<code> +6.1.1870 <B>MAX</B> +</code> +</a> +<BR> +CORE +<BR> +<pre> + ( n1 n2 -- n3 ) +</pre> + +<P> + +n3 is +the greater of n1 and n2. + +<P> + +<hr> +<A name=6.1.1880> +<code> +6.1.1880 <B>MIN</B> +</code> +</a> +<BR> +CORE +<BR> +<pre> + ( n1 n2 -- n3 ) +</pre> + +<P> + +n3 is +the lesser of n1 and n2. + +<P> + +<hr> +<A name=6.1.1890> +<code> +6.1.1890 <B>MOD</B> +</code> +</a> +<BR> +CORE +<BR> +<pre> + ( n1 n2 -- n3 ) +</pre> + +<P> + +Divide n1 by n2, giving the single-cell remainder n3. An ambiguous +condition exists if n2 is zero. If n1 and n2 differ in sign, the +implementation-defined result returned will be the same as that returned +by either the phrase +<b><code>&gt;R S&gt;D R&gt; FM/MOD DROP</code></b> +or the phrase +<b><code>&gt;R S&gt;D R&gt; SM/REM DROP</code></b>. + +<P> + +<code> +See: +<A href=dpans3.htm#3.2.2.1>3.2.2.1</a> Integer division +</code> + +<P> + +<hr> +<A name=6.1.1900> +<code> +6.1.1900 <B>MOVE</B> +</code> +</a> +<BR> +CORE +<BR> +<pre> + ( addr1 addr2 u -- ) +</pre> + +<P> + +If u is greater than zero, copy the contents of u consecutive address +units at addr1 to the u consecutive address units at addr2. After MOVE +completes, the u consecutive address units at addr2 contain exactly what +the u consecutive address units at addr1 contained before the move. + +<P> + +<code> +See: +<A href=dpans17.htm#17.6.1.0910>17.6.1.0910 CMOVE</a> , +<A href=dpans17.htm#17.6.1.0920>17.6.1.0920 CMOVE&gt;</a> , +<a href=dpansa6.htm#A.6.1.1900>A.6.1.1900 MOVE</a> +</code> + +<P> + +<hr> +<A name=6.1.1910> +<code> +6.1.1910 <B>NEGATE</B> +</code> +</a> +<BR> +CORE +<BR> +<pre> + ( n1 -- n2 ) +</pre> + +<P> + +Negate n1, +giving its arithmetic inverse n2. + +<P> + +<code> +See: +<A href=dpans6.htm#6.1.1720>6.1.1720 INVERT</a> , +<A href=dpans6.htm#6.1.0270>6.1.0270 0=</a> +</code> + +<P> + +<hr> +<A name=6.1.1980> +<code> +6.1.1980 <B>OR</B> +</code> +</a> +<BR> +CORE +<BR> +<pre> + ( x1 x2 -- x3 ) +</pre> + +<P> + +x3 is +the bit-by-bit inclusive-or of x1 with x2. + +<P> + +<hr> +<A name=6.1.1990> +<code> +6.1.1990 <B>OVER</B> +</code> +</a> +<BR> +CORE +<BR> +<pre> + ( x1 x2 -- x1 x2 x1 ) +</pre> + +<P> + +Place a +copy of x1 on top of the stack. + +<hr> +<A name=6.1.2033> +<code> +6.1.2033 <B>POSTPONE</b> +</code> +</a> +<BR> +CORE +<BR> + +<P> +<pre> + Interpretation: Interpretation semantics for this word are undefined. +</pre> +<P> +<pre> + Compilation: ( <B>"&lt;spaces&gt;name"</B> -- ) +</pre> +<P> + +Skip leading space delimiters. Parse name delimited by a space. Find +name. Append the compilation semantics of name to the current +definition. An ambiguous condition exists if name is not found. + +<P> + +<code> +See: +<a href=dpansd.htm#D.6.7>D.6.7</a> Immediacy, +<A href=dpans3.htm#3.4.1>3.4.1</a> Parsing, +<a href=dpansa6.htm#A.6.1.2033>A.6.1.2033 POSTPONE</a> , +<a href=dpans6.htm#6.2.2530>6.2.2530 [COMPILE]</a> +</code> + +<P> + + +<hr> +<A name=6.1.2050> +<code> +6.1.2050 <b>QUIT</b> +</code> +</a> +<BR> +CORE +<BR> +<pre> + ( -- ) ( R: i*x -- ) +</pre> + +<P> + +Empty the return stack, store zero in +<a href=dpans6.htm#6.2.2218>SOURCE-ID</a> +if it is present, make +the user input device the input source, and enter interpretation state. +Do not display a message. Repeat the following: + +<UL> +<LI>Accept a line from the input source into the input buffer, set +<a href=dpans6.htm#6.1.0560>&gt;IN</a> +to zero, and interpret. +<LI>Display the implementation-defined system prompt if in interpretation +state, all processing has been completed, and no ambiguous condition +exists. +</ul> +<P> + +<code> +See: +<A href=dpans3.htm#3.4>3.4</a> The Forth text interpreter +</code> + +<P> + +<hr> +<A name=6.1.2060> +<code> +6.1.2060 <b>R&gt;</b> +</code> +</a> +<BR> +<B>r-from</B> CORE +<BR> + +<P> +<pre> + Interpretation: Interpretation semantics for this word are undefined. +</pre> +<P> +<pre> + Execution: ( -- x ) ( R: x -- ) +</pre> +<P> + +Move x from +the return stack to the data stack. + +<P> + +<code> +See: +<A href=dpans3.htm#3.2.3.3>3.2.3.3</a> Return stack, +<A href=dpans6.htm#6.1.0580>6.1.0580 &gt;R</a> , +<A href=dpans6.htm#6.1.2070>6.1.2070 R@</a> , +<A href=dpans6.htm#6.2.0340>6.2.0340 2&gt;R</a> , +<A href=dpans6.htm#6.2.0410>6.2.0410 2R&gt;</a> , +<A href=dpans6.htm#6.2.0415>6.2.0415 2R@</a> +</code> + +<P> + +<hr> +<A name=6.1.2070> +<code> +6.1.2070 <b>R@</b> +</code> +</a> +<BR> +<B>r-fetch</B> CORE +<BR> + +<P> +<pre> + Interpretation: Interpretation semantics for this word are undefined. +</pre> +<P> +<pre> + Execution: ( -- x ) ( R: x -- x ) +</pre> +<P> + +Copy x from +the return stack to the data stack. + +<P> + +<code> +See: +<A href=dpans3.htm#3.2.3.3>3.2.3.3</a> Return stack, +<A href=dpans6.htm#6.1.0580>6.1.0580 &gt;R</a> , +<A href=dpans6.htm#6.1.2060>6.1.2060 R&gt;</a> , +<A href=dpans6.htm#6.2.0340>6.2.0340 2&gt;R</a> , +<A href=dpans6.htm#6.2.0410>6.2.0410 2R&gt;</a> , +<A href=dpans6.htm#6.2.0415>6.2.0415 2R@</a> +</code> + +<P> + +<hr> +<A name=6.1.2120> +<code> +6.1.2120 <b>RECURSE</b> +</code> +</a> +<BR> +CORE +<BR> + +<P> +<pre> + Interpretation: Interpretation semantics for this word are undefined. +</pre> +<P> +<pre> + Compilation: ( -- ) +</pre> +<P> + +Append the execution semantics of the current definition to the current +definition. An ambiguous condition exists if RECURSE appears in a +definition after +<a href=dpans6.htm#6.1.1250>DOES&gt;</a>. + +<P> + +<code> +See: +<A href=dpans6.htm#6.1.2120>6.1.2120 RECURSE</a> , +<a href=dpansa6.htm#A.6.1.2120>A.6.1.2120 RECURSE</a> +</code> + +<P> + +<hr> +<A name=6.1.2140> +<code> +6.1.2140 <b>REPEAT</b> +</code> +</a> +<BR> +CORE +<BR> + +<P> +<pre> + Interpretation: Interpretation semantics for this word are undefined. +</pre> +<P> +<pre> + Compilation: ( C: orig dest -- ) +</pre> +<P> + +Append the run-time semantics given below to the current definition, +resolving the backward reference dest. Resolve the forward reference +orig using the location following the appended run-time semantics. + +<P> +<pre> + Run-time: ( -- ) +</pre> +<P> + +Continue execution +at the location given by dest. + +<P> + +<code> +See: +<A href=dpans6.htm#6.1.0760>6.1.0760 BEGIN</a> , +<A href=dpans6.htm#6.1.2430>6.1.2430 WHILE</a> , +<a href=dpansa6.htm#A.6.1.2140>A.6.1.2140 REPEAT</a> +</code> + + +<P> + +<hr> +<A name=6.1.2160> +<code> +6.1.2160 <b>ROT</b> +</code> +</a> +<BR> +<B>rote</B> CORE +<BR> +<pre> + ( x1 x2 x3 -- x2 x3 x1 ) +</pre> + +<P> + +Rotate the +top three stack entries. + + +<P> + +<hr> +<A name=6.1.2162> +<code> +6.1.2162 <b>RSHIFT</b> +</code> +</a> +<BR> +<B>r-shift</B> CORE +<BR> +<pre> + ( x1 u -- x2 ) +</pre> + +<P> + +Perform a logical right shift of u bit-places on x1, giving x2. Put +zeroes into the most significant bits vacated by the shift. An +ambiguous condition exists if u is greater than or equal to the number +of bits in a cell. + +<P> + +<hr> +<A name=6.1.2165> +<code> +6.1.2165 <b>S"</b> +</code> +</a> +<BR> +<B>s-quote</B> CORE +<BR> + +<P> +<pre> + Interpretation: Interpretation semantics for this word are undefined. +</pre> +<P> +<pre> + Compilation: ( <B>"ccc&lt;quote&gt;"</B> -- ) +</pre> +<P> + +Parse ccc delimited by " (double-quote). Append the run-time semantics +given below to the current definition. + + +<PRE> + Run-time: ( -- c-addr u ) +</PRE> + +<P> + +Return c-addr and u describing a string consisting of the characters +ccc. A program shall not alter the returned string. + +<P> + +<code> +See: +<A href=dpans3.htm#3.4.1>3.4.1</a> Parsing, +<A href=dpans6.htm#6.2.0855>6.2.0855 C"</a> , +<A href=dpans11.htm#11.6.1.2165>11.6.1.2165 S"</a> , +<a href=dpansa6.htm#A.6.1.2165>A.6.1.2165 S"</a> +</code> + +<P> + +<hr> +<A name=6.1.2170> +<code> +6.1.2170 <b>S&gt;D</b> +</code> +</a> +<BR> +<B>s-to-d</B> CORE +<BR> +<pre> + ( n -- d ) +</pre> + +<P> + +Convert the +number n to the double-cell number d with the same numerical +value. + +<P> + +<hr> +<A name=6.1.2210> +<code> +6.1.2210 <b>SIGN</b> +</code> +</a> +<BR> +CORE +<BR> +<pre> + ( n -- ) +</pre> + +<P> + +If n is negative, add a minus sign to the beginning of the pictured +numeric output string. An ambiguous condition exists if SIGN executes +outside of a +<a href=dpans6.htm#6.1.0490>&lt;#</a> +<a href=dpans6.htm#6.1.0040>#&gt;</a> +delimited number conversion. + +<P> + +<hr> +<A name=6.1.2214> +<code> +6.1.2214 <b>SM/REM</b> +</code> +</a> +<BR> +<B>s-m-slash-rem</B> CORE +<BR> +<pre> + ( d1 n1 -- n2 n3 ) +</pre> + +<P> + +Divide d1 by n1, giving the symmetric quotient n3 and the remainder n2. +Input and output stack arguments are signed. An ambiguous condition +exists if n1 is zero or if the quotient lies outside the range of a +single-cell signed integer. + +<P> + +<code> +See: +<A href=dpans3.htm#3.2.2.1>3.2.2.1</a> Integer division, +<A href=dpans6.htm#6.1.1561>6.1.1561 FM/MOD</a> , +<A href=dpans6.htm#6.1.2370>6.1.2370 UM/MOD</a> , +<a href=dpansa6.htm#A.6.1.2214>A.6.1.2214 SM/REM</a> +</code> + +<P> + +<hr> +<A name=6.1.2216> +<code> +6.1.2216 <b>SOURCE</b> +</code> +</a> +<BR> +CORE +<BR> +<pre> + ( -- c-addr u ) +</pre> + +<P> + +c-addr is the address of, and u is the number of characters in, the +input buffer. + +<P> +<code> +See: +<a href=dpansa6.htm#A.6.1.2216>A.6.1.2216 SOURCE</a> , +<a href=a0006.htm>RFI 0006</a> Writing to Input Buffers. +</code> +<p> + +<hr> +<A name=6.1.2220> +<code> +6.1.2220 <b>SPACE</b> +</code> +</a> +<BR> +CORE +<BR> +<pre> + ( -- ) +</pre> + +<P> + +Display one +space. + +<P> + +<hr> +<A name=6.1.2230> +<code> +6.1.2230 <b>SPACES</b> +</code> +</a> +<BR> +CORE +<BR> +<pre> + ( n -- ) +</pre> + +<P> + +If n +is greater than zero, display n spaces. + +<P> + +<hr> +<A name=6.1.2250> +<code> +6.1.2250 <b>STATE</b> +</code> +</a> +<BR> +CORE +<BR> +<pre> + ( -- a-addr ) +</pre> + +<P> + +a-addr is the address of a cell containing the compilation-state flag. +STATE is true when in compilation state, false otherwise. The true +value in STATE is non-zero, but is otherwise implementation-defined. +Only the following standard words alter the value in STATE: : +(<a href=dpans6.htm#6.1.0450>colon</a>), ; +(<a href=dpans6.htm#6.1.0460>semicolon</a>), +<a href=dpans6.htm#6.1.0670>ABORT</a>, +<a href=dpans6.htm#6.1.2050>QUIT</a>, +<a href=dpans6.htm#6.2.0455>:NONAME</a>, [ +(<a href=dpans6.htm#6.1.2500>left-bracket</a>), and ] +(<a href=dpans6.htm#6.1.2540>right-bracket</a>). +<p> + +<b>Note:</b> A program shall not directly alter the contents of +STATE. + + +<P> + +<code> +See: +<A href=dpans3.htm#3.4>3.4</a> The Forth text interpreter, +<A href=dpans15.htm#15.6.2.2250>15.6.2.2250 STATE</a> , +<a href=dpansa6.htm#A.6.1.2250>A.6.1.2250 STATE</a> , +<a href=a0007.htm>RFI 0007</a> Distinction between <em>immediacy</em> and <em>special compilation semantics</em>. +</code> + +<P> + +<hr> +<A name=6.1.2260> +<code> +6.1.2260 <b>SWAP</b> +</code> +</a> +<BR> +CORE +<BR> +<pre> + ( x1 x2 -- x2 x1 ) +</pre> + +<P> + +Exchange the +top two stack items. + +<P> + +<hr> +<A name=6.1.2270> +<code> +6.1.2270 <b>THEN</b> +</code> +</a> +<BR> +CORE +<BR> + +<P> +<pre> + Interpretation: Interpretation semantics for this word are undefined. +</pre> +<P> +<pre> + Compilation: ( C: orig -- ) +</pre> +<P> + +Append the run-time semantics given below to the current definition. +Resolve the forward reference orig using the location of the appended +run-time semantics. + +<P> +<pre> + Run-time: ( -- ) +</pre> +<P> + +Continue +execution. + +<P> + +<code> +See: +<A href=dpans6.htm#6.1.1310>6.1.1310 ELSE</a> , +<A href=dpans6.htm#6.1.1700>6.1.1700 IF</a> , +<a href=dpansa6.htm#A.6.1.2270>A.6.1.2270 THEN</a> +</code> + +<P> + +<hr> +<A name=6.1.2310> +<code> +6.1.2310 <b>TYPE</b> +</code> +</a> +<BR> +CORE +<BR> +<pre> + ( c-addr u -- ) +</pre> + +<P> + +If u is greater than zero, display the character string specified by +c-addr and u. + +<P> + +When passed a character in a character string whose character-defining +bits have a value between hex 20 and 7E inclusive, the corresponding +standard character, specified by +<a href=dpans3.htm#3.1.2.1>3.1.2.1</a> graphic characters, is +displayed. Because different output devices can respond differently to +control characters, programs that use control characters to perform +specific functions have an environmental dependency. + +<P> + +<code> +See: +<A href=dpans6.htm#6.1.1320>6.1.1320 EMIT</a> +</code> + +<P> + +<hr> +<A name=6.1.2320> +<code> +6.1.2320 <b>U.</b> +</code> +</a> +<BR> +<B>u-dot</B> CORE +<BR> +<pre> + ( u -- ) +</pre> + +<P> + +Display u +in free field format. + +<P> + +<hr> +<A name=6.1.2340> +<code> +6.1.2340 <b>U&lt;</b> +</code> +</a> +<BR> +<B>u-less-than</B> CORE +<BR> +<pre> + ( u1 u2 -- flag ) +</pre> + +<P> + +flag is +true if and only if u1 is less than u2. + +<P> + +<code> +See: +<A href=dpans6.htm#6.1.0480>6.1.0480 &lt;</a> +</code> + +<P> + +<hr> +<A name=6.1.2360> +<code> +6.1.2360 <b>UM*</b> +</code> +</a> +<BR> +<B>u-m-star</B> CORE +<BR> +<pre> + ( u1 u2 -- ud ) +</pre> + +<P> + +Multiply u1 by u2, giving the unsigned double-cell product ud. All +values and arithmetic are unsigned. + +<P> + +<hr> +<A name=6.1.2370> +<code> +6.1.2370 <b>UM/MOD</b> +</code> +</a> +<BR> +<B>u-m-slash-mod</B> CORE +<BR> +<pre> + ( ud u1 -- u2 u3 ) +</pre> + +<P> + +Divide ud by u1, giving the quotient u3 and the remainder u2. All +values and arithmetic are unsigned. An ambiguous condition exists if u1 +is zero or if the quotient lies outside the range of a single-cell +unsigned integer. + +<P> + +<code> +See: +<A href=dpans3.htm#3.2.2.1>3.2.2.1</a> Integer division, +<A href=dpans6.htm#6.1.1561>6.1.1561 FM/MOD</a> , +<A href=dpans6.htm#6.1.2214>6.1.2214 SM/REM</a> +</code> + +<P> + +<hr> +<A name=6.1.2380> +<code> +6.1.2380 <b>UNLOOP</b> +</code> +</a> +<BR> +CORE +<BR> + +<P> +<pre> + Interpretation: Interpretation semantics for this word are undefined. +</pre> +<P> +<pre> + Execution: ( -- ) ( R: loop-sys -- ) +</pre> +<P> + +Discard the loop-control parameters for the current nesting level. An +UNLOOP is required for each nesting level before the definition may be +<a href=dpans6.htm#6.1.1380>EXIT</a>ed. +An ambiguous condition exists if the loop-control parameters +are unavailable. + +<P> + +<code> +See: +<A href=dpans3.htm#3.2.3.3>3.2.3.3</a> Return stack, +<a href=dpansa6.htm#A.6.1.2380>A.6.1.2380 UNLOOP</a> +</code> + +<P> + +<hr> +<A name=6.1.2390> +<code> +6.1.2390 <b>UNTIL</b> +</code> +</a> +<BR> +CORE +<BR> + +<P> +<pre> + Interpretation: Interpretation semantics for this word are undefined. +</pre> +<P> +<pre> + Compilation: ( C: dest -- ) +</pre> +<P> + +Append the run-time semantics given below to the current definition, +resolving the backward reference dest. + +<P> +<pre> + Run-time: ( x -- ) +</pre> +<P> + +If all bits of x are zero, continue execution at the location specified +by dest. + +<P> + +<code> +See: +<A href=dpans6.htm#6.1.0760>6.1.0760 BEGIN</a> , +<a href=dpansa6.htm#A.6.1.2390>A.6.1.2390 UNTIL</a> +</code> + +<P> + +<hr> +<A name=6.1.2410> +<code> +6.1.2410 <b>VARIABLE</b> +</code> +</a> +<BR> +CORE +<BR> +<pre> + ( <B>"&lt;spaces&gt;name"</B> -- ) +</pre> + +<P> + +Skip leading space delimiters. Parse name delimited by a space. Create +a definition for name with the execution semantics defined below. +Reserve one cell of data space at an aligned address. + +<P> + +name is referred +to as a <B>variable</B>. + +<P> +<pre> + <i>name</i> Execution: ( -- a-addr ) +</pre> +<P> + +a-addr is the address of the reserved cell. A program is responsible +for initializing the contents of the reserved cell. + +<P> + +<code> +See: +<A href=dpans3.htm#3.4.1>3.4.1</a> Parsing, +<a href=dpansa6.htm#A.6.1.2410>A.6.1.2410 VARIABLE</a> +</code> + +<P> + +<hr> +<A name=6.1.2430> +<code> +6.1.2430 <b>WHILE</b> +</code> +</a> +<BR> +CORE +<BR> + +<P> +<pre> + Interpretation: Interpretation semantics for this word are undefined. +</pre> +<P> +<pre> + Compilation: ( C: dest -- orig dest ) +</pre> +<P> + +Put the location of a new unresolved forward reference orig onto the +control flow stack, under the existing dest. Append the run-time +semantics given below to the current definition. The semantics are +incomplete until orig and dest are resolved (e.g., by +<a href=dpans6.htm#6.1.2140>REPEAT</a>). + +<P> +<pre> + Run-time: ( x -- ) +</pre> +<P> + +If all bits of x are zero, continue execution at the location specified +by the resolution of orig. + +<P> +<code> +See: +<a href=dpansa6.htm#A.6.1.2430>A.6.1.2430 WHILE</a> +</code> +<p> + +<hr> +<A name=6.1.2450> +<code> +6.1.2450 <b>WORD</b> +</code> +</a> +<BR> +CORE +<BR> +<pre> + ( char <B>"&lt;chars&gt;ccc&lt;char&gt;"</B> -- c-addr ) +</pre> + +<P> + +Skip leading delimiters. Parse characters ccc delimited by char. An +ambiguous condition exists if the length of the parsed string is greater +than the implementation-defined length of a counted string. + +<P> + +c-addr is the address of a transient region containing the parsed word +as a counted string. If the parse area was empty or contained no +characters other than the delimiter, the resulting string has a zero +length. A space, not included in the length, follows the string. A +program may replace characters within the string. + +<P> + +<b>Note:</b> The requirement to follow the string with a space is +obsolescent and is included as a concession to existing programs that +use +<a href=dpans6.htm#6.2.0970>CONVERT</a>. +A program shall not depend on the existence of the +space. + + +<P> + +<code> +See: +<A href=dpans3.htm#3.3.3.6>3.3.3.6</a> Other transient regions, +<A href=dpans3.htm#3.4.1>3.4.1</a> Parsing, +<a href=dpans6.htm#6.2.2008>6.2.2008 PARSE</a> , +<a href=dpansa6.htm#A.6.1.2450>A.6.1.2450 WORD</a> +</code> + +<P> + +<hr> +<A name=6.1.2490> +<code> +6.1.2490 <b>XOR</b> +</code> +</a> +<BR> +<B>x-or</B> CORE +<BR> +<pre> + ( x1 x2 -- x3 ) +</pre> + +<P> + +x3 is +the bit-by-bit exclusive-or of x1 with x2. + +<P> + +<hr> +<A name=6.1.2500> +<code> +6.1.2500 <b>[</b> +</code> +</a> +<BR> +<B>left-bracket</B> CORE +<BR> + +<P> +<pre> + Interpretation: Interpretation semantics for this word are undefined. +</pre> +<P> +<pre> + Compilation: Perform the execution semantics given below. +</pre> +<P> +<pre> + Execution: ( -- ) +</pre> +<P> + +Enter interpretation +state. [ is an immediate word. + +<P> + +<code> +See: +<A href=dpans3.htm#3.4>3.4</a> The Forth text interpreter, +<A href=dpans3.htm#3.4.5>3.4.5</a> Compilation, +<A href=dpans6.htm#6.1.2540>6.1.2540 ]</a> , +<a href=dpansa6.htm#A.6.1.2500>A.6.1.2500 [</a> +</code> + +<P> + +<hr> +<A name=6.1.2510> +<code> +6.1.2510 <b>[']</b> +</code> +</a> +<BR> +<B>bracket-tick</B> CORE +<BR> + +<P> +<pre> + Interpretation: Interpretation semantics for this word are undefined. +</pre> +<P> +<pre> + Compilation: ( <B>"&lt;spaces&gt;name"</B> -- ) +</pre> +<P> + +Skip leading space delimiters. Parse name delimited by a space. Find +name. Append the run-time semantics given below to the current +definition. + +<P> + +An ambiguous condition +exists if name is not found. + +<P> +<pre> + Run-time: ( -- xt ) +</pre> +<P> + +Place name's execution token xt on the stack. The execution token +returned by the compiled phrase +<b><code>['] X</code></b> is the same value returned +by <b><code>' X</code></b> outside of compilation state. + +<P> + +<code> +See: +<A href=dpans3.htm#3.4.1>3.4.1</a> Parsing, +<A href=dpans6.htm#6.1.0070>6.1.0070 '</a> , +<A href=dpansa6.htm#A.6.1.2033>A.6.1.2033 POSTPONE</a> , +<a href=dpansa6.htm#A.6.1.2510>A.6.1.2510 [']</a> , +<A href=dpansd.htm#D.6.7>D.6.7</a> Immediacy. +</code> + +<P> + +<hr> +<A name=6.1.2520> +<code> +6.1.2520 <b>[CHAR]</b> +</code> +</a> +<BR> +<B>bracket-char</B> CORE +<BR> + +<P> +<pre> + Interpretation: Interpretation semantics for this word are undefined. +</pre> +<P> +<pre> + Compilation: ( <B>"&lt;spaces&gt;name"</B> -- ) +</pre> +<P> + +Skip leading space delimiters. Parse name delimited by a space. Append the +run-time semantics given below to the current definition. + +<P> +<pre> + Run-time: ( -- char ) +</pre> +<P> + +Place char, the +value of the first character of name, on the stack. + +<P> + +<code> +See: +<A href=dpans3.htm#3.4.1>3.4.1</a> Parsing, +<A href=dpans6.htm#6.1.0895>6.1.0895 CHAR</a> , +<a href=dpansa6.htm#A.6.1.2520>A.6.1.2520 [CHAR]</a> +</code> + +<P> + +<hr> +<A name=6.1.2540> +<code> +6.1.2540 <b>]</b> +</code> +</a> +<BR> +<B>right-bracket</B> CORE +<BR> +<pre> + ( -- ) +</pre> + +<P> + +Enter compilation +state. + +<P> + +<code> +See: +<A href=dpans3.htm#3.4>3.4</a> The Forth text interpreter, +<A href=dpans3.htm#3.4.5>3.4.5</a> Compilation, +<A href=dpans6.htm#6.1.2500>6.1.2500 [</a> , +<a href=dpansa6.htm#A.6.1.2540>A.6.1.2540 ]</a> , +</code> + + +<hr> +<a name=6.2> +<H2>6.2 Core extension words</H2> +</a> + +<p> +<code> +See: +<a href=dpansa6.htm#A.6.2>A.6.2</a> Core extension words +</code> +<p> + +<hr> +<A name=6.2.0060> +<code> +6.2.0060 <b>#TIB</b> +</code> +</a> +<BR> +<B>number-t-i-b</B> CORE EXT +<BR> +<pre> + ( -- a-addr ) +</pre> + +<P> + +a-addr +is the address of a cell containing the number of characters in the +terminal input buffer. + +<P> + +<b>Note:</b> This word is obsolescent and is included as a concession to +existing implementations. + + +<P> +<code> +See: +<a href=dpansa6.htm#A.6.2.0060>A.6.2.0060 #TIB</a> +</code> +<p> + +<hr> +<A name=6.2.0200> +<code> +6.2.0200 <b>.(</b> +</code> +</a> +<BR> +<B>dot-paren</B> CORE EXT +<BR> + +<P> +<pre> + Compilation: Perform the execution semantics given below. +</pre> +<P> +<pre> + Execution: ( <B>"ccc&lt;paren&gt;"</B> -- ) +</pre> +<P> + +Parse and display ccc delimited by ) (right parenthesis). .( is an +immediate word. + +<P> + +<code> +See: +<A href=dpans3.htm#3.4.1>3.4.1</a> Parsing, +<A href=dpans6.htm#6.1.0190>6.1.0190 ."</a> , +<a href=dpansa6.htm#A.6.2.0200>A.6.2.0200 .(</a> +</code> + +<P> + +<hr> +<A name=6.2.0210> +<code> +6.2.0210 <b>.R</b> +</code> +</a> +<BR> +<B>dot-r</B> CORE EXT +<BR> +<pre> + ( n1 n2 -- ) +</pre> + +<P> + +Display n1 right aligned in a field n2 characters wide. If the number +of characters required to display n1 is greater than n2, all digits are +displayed with no leading spaces in a field as wide as necessary. + +<P> +<code> +See: +<a href=dpansa6.htm#A.6.2.0210>A.6.2.0210 .R</a> +</code> +<p> + +<hr> +<A name=6.2.0260> +<code> +6.2.0260 <b>0&lt;&gt;</b> +</code> +</a> +<BR> +<B>zero-not-equals</B> CORE EXT +<BR> +<pre> + ( x -- flag ) +</pre> + +<P> + +flag is +true if and only if x is not equal to zero. + +<P> + +<hr> +<A name=6.2.0280> +<code> +6.2.0280 <b>0&gt;</b> +</code> +</a> +<BR> +<B>zero-greater</B> CORE EXT +<BR> +<pre> + ( n -- flag ) +</pre> + +<P> + +flag is +true if and only if n is greater than zero. + +<P> + +<hr> +<A name=6.2.0340> +<code> +6.2.0340 <b>2&gt;R</b> +</code> +</a> +<BR> +<B>two-to-r</B> CORE EXT +<BR> + +<P> +<pre> + Interpretation: Interpretation semantics for this word are undefined. +</pre> +<P> +<pre> + Execution: ( x1 x2 -- ) ( R: -- x1 x2 ) +</pre> +<P> + +Transfer cell pair x1 x2 to the return stack. Semantically equivalent +to +<b><code> +SWAP &gt;R &gt;R +</code></b>. + +<P> + +<code> +See: +<A href=dpans3.htm#3.2.3.3>3.2.3.3</a> Return stack, +<A href=dpans6.htm#6.1.0580>6.1.0580 &gt;R</a> , +<A href=dpans6.htm#6.1.2060>6.1.2060 R&gt;</a> , +<A href=dpans6.htm#6.1.2070>6.1.2070 R@</a> , +<A href=dpans6.htm#6.2.0410>6.2.0410 2R&gt;</a> , +<A href=dpans6.htm#6.2.0415>6.2.0415 2R@</a> , +<a href=dpansa6.htm#A.6.2.0340>A.6.2.0340 2&gt;R</a> +</code> + +<P> + +<hr> +<A name=6.2.0410> +<code> +6.2.0410 <b>2R&gt;</b> +</code> +</a> +<BR> +<B>two-r-from</B> CORE EXT +<BR> + +<P> +<pre> + Interpretation: Interpretation semantics for this word are undefined. +</pre> +<P> +<pre> + Execution: ( -- x1 x2 ) ( R: x1 x2 -- ) +</pre> +<P> + +Transfer cell pair x1 x2 from the return stack. Semantically equivalent +to +<b><code> +R&gt; R&gt; SWAP +</code></b>. + +<P> + +<code> +See: +<A href=dpans3.htm#3.2.3.3>3.2.3.3</a> Return stack, +<A href=dpans6.htm#6.1.0580>6.1.0580 &gt;R</a> , +<A href=dpans6.htm#6.1.2060>6.1.2060 R&gt;</a> , +<A href=dpans6.htm#6.1.2070>6.1.2070 R@</a> , +<A href=dpans6.htm#6.2.0340>6.2.0340 2&gt;R</a> , +<A href=dpans6.htm#6.2.0415>6.2.0415 2R@</a> , +<a href=dpansa6.htm#A.6.2.0410>A.6.2.0410 2R&gt;</a> +</code> + +<P> + +<hr> +<A name=6.2.0415> +<code> +6.2.0415 <b>2R@</b> +</code> +</a> +<BR> +<B>two-r-fetch</B> CORE EXT +<BR> + +<P> +<pre> + Interpretation: Interpretation semantics for this word are undefined. +</pre> +<P> +<pre> + Execution: ( -- x1 x2 ) ( R: x1 x2 -- x1 x2 ) +</pre> +<P> + +Copy cell pair x1 x2 from the return stack. Semantically equivalent to +<b><code> +R&gt; R&gt; 2DUP &gt;R &gt;R SWAP +</code></b>. + +<P> + +<code> +See: +<A href=dpans3.htm#3.2.3.3>3.2.3.3</a> Return stack, +<A href=dpans6.htm#6.1.0580>6.1.0580 &gt;R</a> , +<A href=dpans6.htm#6.1.2060>6.1.2060 R&gt;</a> , +<A href=dpans6.htm#6.1.2070>6.1.2070 R@</a> , +<A href=dpans6.htm#6.2.0340>6.2.0340 2&gt;R</a> , +<A href=dpans6.htm#6.2.0410>6.2.0410 2R&gt;</a> +</code> + +<P> + +<hr> +<A name=6.2.0455> +<code> +6.2.0455 <b>:NONAME</b> +</code> +</a> +<BR> +<B>colon-no-name</B> CORE EXT +<BR> +<pre> + ( C: -- colon-sys ) ( S: -- xt ) +</pre> + +<P> + +Create an execution token xt, enter compilation state and start the +current definition, producing colon-sys. Append the initiation +semantics given below to the current definition. + +<P> + +The execution semantics of xt will be determined by the words compiled +into the body of the definition. This definition can be executed later +by using xt +<a href=dpans6.htm#6.1.1370>EXECUTE</a>. + +<P> + +If the control-flow stack is implemented using the data stack, colon-sys +shall be the topmost item on the data stack. + +<p> + +<pre> + Initiation: ( i*x -- i*x ) ( R: -- nest-sys ) +</pre> +<P> + +Save implementation-dependent information nest-sys about the calling +definition. The stack effects i*x represent arguments to xt. + +<P> +<pre> + <i>xt</i> Execution: ( i*x -- j*x ) +</pre> +<P> + +Execute the definition specified by xt. The stack effects i*x and j*x +represent arguments to and results from xt, respectively. + +<P> +<code> +See: +<a href=dpansa6.htm#A.6.2.0455>A.6.2.0455 :NONAME</a> , +<A href=dpans3.htm#3.2.3.2>3.2.3.2</a> Control-flow stack. +</code> +<p> + +<hr> +<A name=6.2.0500> +<code> +6.2.0500 <b>&lt;&gt;</b> +</code> +</a> +<BR> +<B>not-equals</B> CORE EXT +<BR> +<pre> + ( x1 x2 -- flag ) +</pre> + +<P> + +flag is +true if and only if x1 is not bit-for-bit the same as x2. + +<P> + +<hr> +<A name=6.2.0620> +<code> +6.2.0620 <b>?DO</b> +</code> +</a> +<BR> +<B>question-do</B> CORE EXT +<BR> + +<P> +<pre> + Interpretation: Interpretation semantics for this word are undefined. +</pre> +<P> +<pre> + Compilation: ( C: -- do-sys ) +</pre> +<P> + +Put do-sys onto the control-flow stack. Append the run-time semantics +given below to the current definition. The semantics are incomplete +until resolved by a consumer of do-sys such as +<a href=dpans6.htm#6.1.1800>LOOP</a>. +<P> +<pre> + Run-time: ( n1|u1 n2|u2 -- ) ( R: -- | loop-sys ) +</pre> +<P> + +If n1|u1 is equal to n2|u2, continue execution at the location given by +the consumer of do-sys. Otherwise set up loop control parameters with +index n2|u2 and limit n1|u1 and continue executing immediately following +?DO. Anything already on the return stack becomes unavailable until the +loop control parameters are discarded. An ambiguous condition exists if +n1|u1 and n2|u2 are not both of the same type. + +<P> + +<code> +See: +<A href=dpans3.htm#3.2.3.2>3.2.3.2</a> Control-flow stack, +<A href=dpans6.htm#6.1.0140>6.1.0140 +LOOP</a> , +<A href=dpans6.htm#6.1.1240>6.1.1240 DO</a> , +<A href=dpans6.htm#6.1.1680>6.1.1680 I</a> , +<A href=dpans6.htm#6.1.1760>6.1.1760 LEAVE</a> , +<A href=dpans6.htm#6.1.2380>6.1.2380 UNLOOP</a> , +<a href=dpansa6.htm#A.6.2.0620>A.6.2.0620 ?DO</a> +</code> + +<P> + +<hr> +<A name=6.2.0700> +<code> +6.2.0700 <b>AGAIN</b> +</code> +</a> +<BR> +CORE EXT +<BR> + +<P> +<pre> + Interpretation: Interpretation semantics for this word are undefined. +</pre> +<P> +<pre> + Compilation: ( C: dest -- ) +</pre> +<P> + +Append the run-time semantics given below to the current definition, +resolving the backward reference dest. + +<P> +<pre> + Run-time: ( -- ) +</pre> +<P> + +Continue execution at the location specified by dest. If no other +control flow words are used, any program code after AGAIN will not be +executed. + +<p> +<code> +See: +<A href=dpans6.htm#6.1.0760>6.1.0760 BEGIN</a> , +<a href=dpansa6.htm#A.6.2.0700>A.6.2.0700 AGAIN</a> +</code> + +<P> + +<hr> +<A name=6.2.0855> +<code> +6.2.0855 <b>C"</b> +</code> +</a> +<BR> +<B>c-quote</B> CORE EXT +<BR> + +<P> +<pre> + Interpretation: Interpretation semantics for this word are undefined. +</pre> +<P> +<pre> + Compilation: ( <B>"ccc&lt;quote&gt;"</B> -- ) +</pre> +<P> + +Parse ccc delimited by " (double-quote) and append the run-time +semantics given below to the current definition. + +<P> +<pre> + Run-time: ( -- c-addr ) +</pre> +<P> + +Return c-addr, a counted string consisting of the characters ccc. A +program shall not alter the returned string. + +<P> + +<code> +See: +<A href=dpans3.htm#3.4.1>3.4.1</a> Parsing, +<A href=dpans6.htm#6.1.2165>6.1.2165 S"</a> , +<A href=dpans11.htm#11.6.1.2165>11.6.1.2165 S"</a> , +<a href=dpansa6.htm#A.6.2.0855>A.6.2.0855 C"</a> +</code> + +<P> + +<hr> +<A name=6.2.0873> +<code> +6.2.0873 <b>CASE</b> +</code> +</a> +<BR> +CORE EXT +<BR> + +<P> +<pre> + Interpretation: Interpretation semantics for this word are undefined. +</pre> +<P> +<pre> + Compilation: ( C: -- case-sys ) +</pre> +<P> + +Mark the start of the CASE ... +<a href=dpans6.htm#6.2.1950>OF</a> ... +<a href=dpans6.htm#6.2.1343>ENDOF</a> ... +<a href=dpans6.htm#6.2.1342>ENDCASE</a> structure. +Append the run-time semantics given below to the current definition. + +<P> +<pre> + Run-time: ( -- ) +</pre> +<P> + +Continue +execution. + +<P> + +<code> +See: +<a href=dpansa6.htm#A.6.2.0873>A.6.2.0873 CASE</a> +</code> + +<P> + +<hr> +<A name=6.2.0945> +<code> +6.2.0945 <b>COMPILE,</b> +</code> +</a> +<BR> +<B>compile-comma</B> CORE EXT +<BR> + +<P> +<pre> + Interpretation: Interpretation semantics for this word are undefined. +</pre> +<P> +<pre> + Execution: ( xt -- ) +</pre> +<P> + +Append the execution semantics of the definition represented by xt to +the execution semantics of the current definition. + +<P> +<code> +See: +<a href=dpansa6.htm#A.6.2.0945>A.6.2.0945 COMPILE,</a> +</code> +<p> + +<hr> +<A name=6.2.0970> +<code> +6.2.0970 <b>CONVERT</b> +</code> +</a> +<BR> +CORE EXT +<BR> +<pre> + ( ud1 c-addr1 -- ud2 c-addr2 ) +</pre> + +<P> + +ud2 is the result of converting the characters within the text beginning +at the first character after c-addr1 into digits, using the number in +<a href=dpans6.htm#6.1.0750>BASE</a>, +and adding each digit to ud1 after multiplying ud1 by the number +in BASE. Conversion continues until a character that is not convertible +is encountered. c-addr2 is the location of the first unconverted +character. An ambiguous condition exists if ud2 overflows. + +<P> + +<b>Note:</b> This word is obsolescent and is included as a concession to +existing implementations. Its function is superseded by +<a href=dpans6.htm#6.1.0570>6.1.0570</a> +&gt;NUMBER. + +<P> + +<code> +See: +<A href=dpans3.htm#3.2.1.2>3.2.1.2</a> Digit conversion, +<a href=dpansa6.htm#A.6.2.0970>A.6.2.0970 CONVERT</a> +</code> + +<P> + +<hr> +<A name=6.2.1342> +<code> +6.2.1342 <b>ENDCASE</b> +</code> +</a> +<BR> +<B>end-case</B> CORE EXT +<BR> + +<P> +<pre> + Interpretation: Interpretation semantics for this word are undefined. +</pre> +<P> +<pre> + Compilation: ( C: case-sys -- ) +</pre> +<P> + +Mark the end of the +<a href=dpans6.htm#6.2.0873>CASE</a> ... +<a href=dpans6.htm#6.2.1950>OF</a> ... +<a href=dpans6.htm#6.2.1343>ENDOF</a> +... ENDCASE structure. Use +case-sys to resolve the entire structure. Append the run-time semantics +given below to the current definition. + +<P> +<pre> + Run-time: ( x -- ) +</pre> +<P> + +Discard the +case selector x and continue execution. + +<P> + +<code> +See: +<a href=dpansa6.htm#A.6.2.1342>A.6.2.1342 ENDCASE</a> +</code> + +<P> + +<hr> +<A name=6.2.1343> +<code> +6.2.1343 <b>ENDOF</b> +</code> +</a> +<BR> +<B>end-of</B> CORE EXT +<BR> + +<P> +<pre> + Interpretation: Interpretation semantics for this word are undefined. +</pre> +<P> +<pre> + Compilation: ( C: case-sys1 of-sys -- case-sys2 ) +</pre> +<P> + +Mark the end of the +<a href=dpans6.htm#6.2.1950>OF</a> +... ENDOF part of the +<a href=dpans6.htm#6.2.0873>CASE</a> +structure. The next +location for a transfer of control resolves the reference given by +of-sys. Append the run-time semantics given below to the current +definition. Replace case-sys1 with case-sys2 on the control-flow stack, +to be resolved by +<a href=dpans6.htm#6.2.1342>ENDCASE</a>. + +<P> +<pre> + Run-time: ( -- ) +</pre> +<P> + +Continue execution at +the location specified by the consumer of case-sys2. + +<P> + +<code> +See: +<a href=dpansa6.htm#A.6.2.1343>A.6.2.1343 ENDOF</a> +</code> + +<P> + +<hr> +<A name=6.2.1350> +<code> +6.2.1350 <b>ERASE</b> +</code> +</a> +<BR> +CORE EXT +<BR> +<pre> + ( addr u -- ) +</pre> + +<P> + +If u +is greater than zero, clear all bits in each of u consecutive address +units of memory beginning at addr . + +<P> + +<hr> +<A name=6.2.1390> +<code> +6.2.1390 <b>EXPECT</b> +</code> +</a> +<BR> +CORE EXT +<BR> +<pre> + ( c-addr +n -- ) +</pre> + +<P> + +Receive a string of at most +n characters. Display graphic characters +as they are received. A program that depends on the presence or absence +of non-graphic characters in the string has an environmental dependency. +The editing functions, if any, that the system performs in order to +construct the string of characters are implementation-defined. + +<P> + +Input terminates when an implementation-defined line terminator is +received or when the string is +n characters long. When input +terminates, nothing is appended to the string and the display is +maintained in an implementation-defined way. + +<P> + +Store the +string at c-addr and its length in +<a href=dpans6.htm#6.2.2240>SPAN</a>. + +<P> + +<b>Note:</b> This word is obsolescent and is included as a concession to +existing implementations. Its function is superseded by +<a href=dpans6.htm#6.1.0695>6.1.0695</a> +ACCEPT. + + +<P> +<code> +See: +<a href=dpansa6.htm#A.6.2.1390>A.6.2.1390 EXPECT</a> +</code> +<p> + +<hr> +<A name=6.2.1485> +<code> +6.2.1485 <b>FALSE</b> +</code> +</a> +<BR> +CORE EXT +<BR> +<pre> + ( -- false ) +</pre> + +<P> + +Return a +false flag. + +<P> + +<code> +See: +<A href=dpans3.htm#3.1.3.1>3.1.3.1</a> Flags +</code> + +<P> + +<hr> +<A name=6.2.1660> +<code> +6.2.1660 <b>HEX</b> +</code> +</a> +<BR> +CORE EXT +<BR> +<pre> + ( -- ) +</pre> + +<P> + +Set contents +of +<a href=dpans6.htm#6.1.0750>BASE</a> +to sixteen. + + +<P> + +<hr> +<A name=6.2.1850> +<code> +6.2.1850 <b>MARKER</b> +</code> +</a> +<BR> +CORE EXT +<BR> +<pre> + ( <B>"&lt;spaces&gt;name"</B> -- ) +</pre> + +<P> + +Skip leading space delimiters. Parse name delimited by a space. Create +a definition for name with the execution semantics defined below. + +<P> +<pre> + <i>name</i> Execution: ( -- ) +</pre> +<P> + +Restore all dictionary allocation and search order pointers to the state +they had just prior to the definition of name. Remove the definition of +name and all subsequent definitions. Restoration of any structures +still existing that could refer to deleted definitions or deallocated +data space is not necessarily provided. No other contextual information +such as numeric base is affected. + +<P> + +<code> +See: +<A href=dpans3.htm#3.4.1>3.4.1</a> Parsing, +<A href=dpans15.htm#15.6.2.1580>15.6.2.1580 FORGET</a> , +<a href=dpansa6.htm#A.6.2.1850>A.6.2.1850 MARKER</a> +</code> + + +<P> + +<hr> +<A name=6.2.1930> +<code> +6.2.1930 <b>NIP</b> +</code> +</a> +<BR> +CORE EXT +<BR> +<pre> + ( x1 x2 -- x2 ) +</pre> + +<P> + +Drop the +first item below the top of stack. + + +<P> + +<hr> +<A name=6.2.1950> +<code> +6.2.1950 <b>OF</b> +</code> +</a> +<BR> +CORE EXT +<BR> + +<P> +<pre> + Interpretation: Interpretation semantics for this word are undefined. +</pre> +<P> +<pre> + Compilation: ( C: -- of-sys ) +</pre> +<P> + +Put of-sys onto the control flow stack. Append the run-time semantics +given below to the current definition. The semantics are incomplete +until resolved by a consumer of of-sys such as +<a href=dpans6.htm#6.2.1343>ENDOF</a>. + +<P> +<pre> + Run-time: ( x1 x2 -- | x1 ) +</pre> +<P> + +If the two values on the stack are not equal, discard the top value and +continue execution at the location specified by the consumer of of-sys, +e.g., following the next ENDOF. Otherwise, discard both values and +continue execution in line. + +<P> + +<code> +See: +<A href=dpans6.htm#6.2.0873>6.2.0873 CASE</a> , +<A href=dpans6.htm#6.2.1342>6.2.1342 ENDCASE</a> , +<a href=dpansa6.htm#A.6.2.1950>A.6.2.1950 OF</a> +</code> + +<P> + +<hr> +<A name=6.2.2000> +<code> +6.2.2000 <b>PAD</b> +</code> +</a> +<BR> +CORE EXT +<BR> +<pre> + ( -- c-addr ) +</pre> + +<P> + +c-addr is the address of a transient region that can be used to hold +data for intermediate processing. + +<P> + +<code> +See: +<A href=dpans3.htm#3.3.3.6>3.3.3.6</a> Other transient regions, +<a href=dpansa6.htm#A.6.2.2000>A.6.2.2000 PAD</a> +</code> + +<P> + +<hr> +<A name=6.2.2008> +<code> +6.2.2008 <b>PARSE</b> +</code> +</a> +<BR> +CORE EXT +<BR> +<pre> + ( char <B>"ccc&lt;char&gt;"</B> -- c-addr u ) +</pre> + +<P> + +Parse ccc +delimited by the delimiter char. + +<P> + +c-addr is the address (within the input buffer) and u is the length of +the parsed string. If the parse area was empty, the resulting string +has a zero length. + +<P> + +<code> +See: +<A href=dpans3.htm#3.4.1>3.4.1</a> Parsing, +<a href=dpansa6.htm#A.6.2.2008>A.6.2.2008 PARSE</a> +</code> + + +<P> + +<hr> +<A name=6.2.2030> +<code> +6.2.2030 <b>PICK</b> +</code> +</a> +<BR> +CORE EXT +<BR> +<pre> + ( xu ... x1 x0 u -- xu ... x1 x0 xu ) +</pre> + +<P> + +Remove u. +Copy the xu to the top of the stack. An ambiguous condition exists +if there are less than u+2 items on the stack before PICK is executed. + +<P> +<code> +See: +<a href=dpansa6.htm#A.6.2.2030>A.6.2.2030 PICK</a> +</code> +<p> + +<hr> +<A name=6.2.2040> +<code> +6.2.2040 <b>QUERY</b> +</code> +</a> +<BR> +CORE EXT +<BR> +<pre> + ( -- ) +</pre> + +<P> + +Make the user input device the input source. Receive input into the +terminal input buffer, replacing any previous contents. Make the +result, whose address is returned by +<a href=dpans6.htm#6.2.2290>TIB</a>, +the input buffer. Set +<a href=dpans6.htm#6.1.0560>&gt;IN</a> +to zero. + +<P> + +<b>Note:</b> This word is obsolescent and is included as a concession to +existing implementations. + +<P> +<code> +See: +<a href=dpansa6.htm#A.6.2.2040>A.6.2.2040 QUERY</a> , +<a href=a0006.htm>RFI 0006</a>. +</code> +<p> + +<hr> +<A name=6.2.2125> +<code> +6.2.2125 <b>REFILL</b> +</code> +</a> +<BR> +CORE EXT +<BR> +<pre> + ( -- flag ) +</pre> + +<P> + +Attempt to fill the input buffer from the input source, returning a true +flag if successful. + +<P> + +When the input source is the user input device, attempt to receive input +into the terminal input buffer. If successful, make the result the +input buffer, set +<a href=dpans6.htm#6.1.0560>&gt;IN</a> +to zero, and return true. Receipt of a line +containing no characters is considered successful. If there is no input +available from the current input source, return false. + +<P> + +When the input source is a string from +<a href=dpans6.htm#6.1.1360>EVALUATE</a>, +return false and +perform no other action. + +<P> + +<code> +See: +<A href=dpans7.htm#7.6.2.2125>7.6.2.2125 REFILL</a> , +<A href=dpans11.htm#11.6.2.2125>11.6.2.2125 REFILL</a> , +<a href=dpansa6.htm#A.6.2.2125>A.6.2.2125 REFILL</a> +</code> + +<P> + +<hr> +<A name=6.2.2148> +<code> +6.2.2148 <b>RESTORE-INPUT</b> +</code> +</a> +<BR> +CORE EXT +<BR> +<pre> + ( xn ... x1 n -- flag ) +</pre> + +<P> + +Attempt to restore the input source specification to the state described +by x1 through xn. flag is true if the input source specification cannot +be so restored. + +<P> + +An ambiguous condition exists if the input source represented by the +arguments is not the same as the current input source. + +<P> + +<code> +See: +<A href=dpansa6.htm#A.6.2.2182>A.6.2.2182 SAVE-INPUT</a> +</code> + +<P> + +<hr> +<A name=6.2.2150> +<code> +6.2.2150 <b>ROLL</b> +</code> +</a> +<BR> +CORE EXT +<BR> +<pre> + ( xu xu-1 ... x0 u -- xu-1 ... x0 xu ) +</pre> + +<P> + +Remove u. Rotate u+1 items on the top of the stack. An ambiguous +condition exists if there are less than u+2 items on the stack before +ROLL is executed. + +<P> +<code> +See: +<a href=dpansa6.htm#A.6.2.2150>A.6.2.2150 ROLL</a> +</code> +<p> + +<hr> +<A name=6.2.2182> +<code> +6.2.2182 <b>SAVE-INPUT</b> +</code> +</a> +<BR> +CORE EXT +<BR> +<pre> + ( -- xn ... x1 n ) +</pre> + +<P> + +x1 through xn describe the current state of the input source +specification for later use by +<a href=dpans6.htm#6.2.2148>RESTORE-INPUT</a>. + +<P> +<code> +See: +<a href=dpansa6.htm#A.6.2.2182>A.6.2.2182 SAVE-INPUT</a> +</code> +<p> + +<hr> +<A name=6.2.2218> +<code> +6.2.2218 <b>SOURCE-ID</b> +</code> +</a> +<BR> +<B>source-i-d</B> CORE EXT +<BR> +<pre> + ( -- 0 | -1 ) +</pre> + +<P> + +Identifies the +input source as follows: + +<P> + + +<PRE> +SOURCE-ID Input source +-1 String (via <a href=dpans6.htm#6.1.1360>EVALUATE</a>) + 0 User input device +</PRE> + +<P> + +<code> +See: +<A href=dpans11.htm#11.6.1.2218>11.6.1.2218 SOURCE-ID</a> +</code> + +<P> + +<hr> +<A name=6.2.2240> +<code> +6.2.2240 <b>SPAN</b> +</code> +</a> +<BR> +CORE EXT +<BR> +<pre> + ( -- a-addr ) +</pre> + +<P> + +a-addr is the address of a cell containing the count of characters +stored by the last execution of +<a href=dpans6.htm#6.2.1390>EXPECT</a>. + +<P> + +<b>Note:</b> This word is obsolescent and is included as a concession to +existing implementations. + + +<P> + +<hr> +<A name=6.2.2290> +<code> +6.2.2290 <b>TIB</b> +</code> +</a> +<BR> +<B>t-i-b</B> CORE EXT +<BR> +<pre> + ( -- c-addr ) +</pre> + +<P> + +c-addr +is the address of the terminal input buffer. + +<P> + +<b>Note:</b> This word is obsolescent and is included as a concession to +existing implementations. + +<P> +<code> +See: +<a href=dpansa6.htm#A.6.2.2290>A.6.2.2290 TIB</a> , +<a href=a0006.htm>RFI 0006</a>. +</code> +<P> + +<hr> +<A name=6.2.2295> +<code> +6.2.2295 <b>TO</b> +</code> +</a> +<BR> +CORE EXT +<BR> + +<P> + +<pre> + Interpretation: ( x <B>"&lt;spaces&gt;name"</B> -- ) +</pre> +<P> + +Skip leading spaces and parse name delimited by a space. Store x in +name. An ambiguous condition exists if name was not defined by +<a href=dpans6.htm#6.2.2405>VALUE</a>. + +<P> +<pre> + Compilation: ( <B>"&lt;spaces&gt;name"</B> -- ) +</pre> +<P> + +Skip leading spaces and parse name delimited by a space. Append the +run-time semantics given below to the current definition. An ambiguous +condition exists if name was not defined by VALUE. + +<P> +<pre> + Run-time: ( x -- ) +</pre> +<P> + +Store x +in name. + +<P> + +<b>Note:</b> An ambiguous condition exists if either +<a href=dpans6.htm#6.1.2033>POSTPONE</a> or +<a href=dpans6.htm#6.2.2530>[COMPILE]</a> +is applied to TO. + +<P> + +<code> +See: +<A href=dpans13.htm#13.6.1.2295>13.6.1.2295 TO</a> , +<a href=dpansa6.htm#A.6.2.2295>A.6.2.2295 TO</a> +</code> + +<P> + +<hr> +<A name=6.2.2298> +<code> +6.2.2298 <b>TRUE</b> +</code> +</a> +<BR> +CORE EXT +<BR> +<pre> + ( -- true ) +</pre> + +<P> + +Return a +true flag, a single-cell value with all bits set. + +<P> + +<code> +See: +<A href=dpans3.htm#3.1.3.1>3.1.3.1</a> Flags, +<a href=dpansa6.htm#A.6.2.2298>A.6.2.2298 TRUE</a> +</code> + +<P> + +<hr> +<A name=6.2.2300> +<code> +6.2.2300 <b>TUCK</b> +</code> +</a> +<BR> +CORE EXT +<BR> +<pre> + ( x1 x2 -- x2 x1 x2 ) +</pre> + +<P> + +Copy the +first (top) stack item below the second stack item. + +<P> + +<hr> +<A name=6.2.2330> +<code> +6.2.2330 <b>U.R</b> +</code> +</a> +<BR> +<B>u-dot-r</B> CORE EXT +<BR> +<pre> + ( u n -- ) +</pre> + +<P> + +Display u right aligned in a field n characters wide. If the number of +characters required to display u is greater than n, all digits are +displayed with no leading spaces in a field as wide as necessary. + +<P> + +<hr> +<A name=6.2.2350> +<code> +6.2.2350 <b>U&gt;</b> +</code> +</a> +<BR> +<B>u-greater-than</B> CORE EXT +<BR> +<pre> + ( u1 u2 -- flag ) +</pre> + +<P> + +flag is +true if and only if u1 is greater than u2. + +<P> + +<code> +See: +<A href=dpans6.htm#6.1.0540>6.1.0540 &gt;</a> +</code> + +<P> + +<hr> +<A name=6.2.2395> +<code> +6.2.2395 <b>UNUSED</b> +</code> +</a> +<BR> +CORE EXT +<BR> +<pre> + ( -- u ) +</pre> + +<P> + +u is +the amount of space remaining in the region addressed by +<a href=dpans6.htm#6.1.1650>HERE</a> , in +address units. + +<P> + +<hr> +<A name=6.2.2405> +<code> +6.2.2405 <b>VALUE</b> +</code> +</a> +<BR> +CORE EXT +<BR> +<pre> + ( x <B>"&lt;spaces&gt;name"</B> -- ) +</pre> + +<P> + +Skip leading +space delimiters. Parse name delimited by a space. Create a +definition for name with the execution semantics defined below, with an +initial value equal to x. + +<P> + +name is +referred to as a <B>value</B>. + +<P> +<pre> + <i>name</i> Execution: ( -- x ) +</pre> +<P> + +Place x on the stack. The value of x is that given when name +was created, +until the phrase <b><code>x TO name</code></b> +is executed, causing a new value of x to be +associated with name. + +<P> + +<code> +See: +<A href=dpans3.htm#3.4.1>3.4.1</a> Parsing, +<a href=dpansa6.htm#A.6.2.2405>A.6.2.2405 VALUE</a> , +<a href=dpans6.htm#6.2.2295>6.2.2295 TO</a> +</code> + +<P> + +<hr> +<A name=6.2.2440> +<code> +6.2.2440 <b>WITHIN</b> +</code> +</a> +<BR> +CORE EXT +<BR> +<pre> + ( n1|u1 n2|u2 n3|u3 -- flag ) +</pre> + +<P> + +Perform a comparison of a test value n1|u1 with a lower limit n2|u2 and +an upper limit n3|u3, returning true if either (n2|u2 &lt; n3|u3 and +(n2|u2 &lt;= n1|u1 and n1|u1 &lt; n3|u3)) or (n2|u2 &gt; n3|u3 and +(n2|u2 &lt;= n1|u1 or n1|u1 &lt; n3|u3)) is true, returning false +otherwise. An ambiguous condition exists if n1|u1, n2|u2, and n3|u3 are +not all the same type. + +<P> +<code> +See: +<a href=dpansa6.htm#A.6.2.2440>A.6.2.2440 WITHIN</a> +</code> +<p> + +<hr> +<A name=6.2.2530> +<code> +6.2.2530 <b>[COMPILE]</b> +</code> +</a> +<BR> +<B>bracket-compile</B> CORE EXT +<BR> + +<P> +<pre> + Intrepretation: Interpretation semantics for this word are undefined. +</pre> +<P> +<pre> + Compilation: ( <B>"&lt;spaces&gt;name"</B> -- ) +</pre> +<P> + +Skip leading space delimiters. Parse name delimited by a space. Find +name. If name has other than default compilation semantics, append them +to the current definition; otherwise append the execution semantics of +name. An ambiguous condition exists if name is not found. + +<P> + +<code> +See: +<A href=dpans3.htm#3.4.1>3.4.1</a> Parsing, +<a href=dpans6.htm#6.1.2033>6.1.2033 POSTPONE</a> , +<a href=dpansa6.htm#A.6.2.2530>A.6.2.2530 [COMPILE]</a> +</code> + +<P> + +<hr> +<A name=6.2.2535> +<code> +6.2.2535 <b>\</b> +</code> +</a> +<BR> +<B>backslash</B> CORE EXT +<BR> + +<P> +<pre> + Compilation: Perform the execution semantics given below. +</pre> +<P> +<pre> + Execution: ( <B>"ccc&lt;eol&gt;"</B>-- ) +</pre> +<P> + +Parse and discard +the remainder of the parse area. \ is an immediate word. + +<P> + +<code> +See: +<A href=dpans7.htm#7.6.2.2535>7.6.2.2535 \</a> , +<a href=dpansa6.htm#A.6.2.2535>A.6.2.2535 \</a> +</code> + +<P> + + +<hr> +<A href=dpans.htm#toc><IMG src="up.gif" ></A> Table of Contents +<BR> +<A href=dpans7.htm><IMG src="right.gif" ></A> +Next Section +<P> +</BODY> +</HTML> + diff --git a/mwmouse/sources/AnsForth/DPANS7.HTM b/mwmouse/sources/AnsForth/DPANS7.HTM @@ -0,0 +1,766 @@ +<HTML><HEAD> +<TITLE>DPANS94</TITLE> +<link disabled rel="stylesheet" href="mpexc6.css"> +<style>@import url(mpexc6.css);</style> +</head> + +<BODY> +<table width=100%> +<tr> +<td align=left> +<a href=dpans6.htm><img src=left.gif + width=26 height=26 align=ALIGN border=0></a> +<a href=dpans8.htm><img src=right.gif + width=26 height=26 align=ALIGN border=0></a> +</td> +<td align=right> +<a href=dpans.htm#toc><img src=up.gif + width=26 height=26 align=ALIGN border=0></a> +<a name=7.>Table of Contents</a> +</td> +</tr> +</table> +<p> +<hr size=4> + +<H1>7. The optional Block word set</H1> + +<code> +See: +<a href=dpansa7.htm#A.7>A.7</a> The optional Block word set +</code> + +<hr> +<A name=7.1> +<H2>7.1 Introduction</H2> +</a> + + +<hr> +<A name=7.2> +<H2>7.2 Additional terms</H2> +</a> + +<DL><DT><B>block:</B> <DD>1024 characters of data on mass +storage, designated by a block number. +<DT><B>block buffer:</B> <DD>A block-sized region of data space where a block +is +made temporarily available for use. The current block buffer is the +block buffer most recently accessed by +<a href=dpans7.htm#7.6.1.0800>BLOCK</a>, +<a href=dpans7.htm#7.6.1.0820>BUFFER</a>, +<a href=dpans7.htm#7.6.1.1790>LOAD</a>, +<a href=dpans7.htm#7.6.2.1770>LIST</a>, or +<a href=dpans7.htm#7.6.2.2280>THRU</a>. +</DL> + +<P> +<code> +See: +<a href=dpansa7.htm#A.7.2>A.7.2</a> Additional terms +</code> + +<hr> +<A name=7.3> +<H2>7.3 Additional usage requirements</H2> +</a> + + +<hr> +<A name=7.3.1> +<H3>7.3.1 Environmental queries</H3> +</a> + +Append table 7.1 +to table 3.5. +<P> +<code> +See: +<A href=dpans3.htm#3.2.6>3.2.6</a> Environmental queries +</code> +<P> + +Table 7.1 - Environmental Query Strings + + +<PRE> +String Value data type Constant? Meaning +------ --------------- --------- ------- +BLOCK flag no block word set present +BLOCK-EXT flag no block extensions word set present + +</PRE> +<P> + +<hr> +<A name=7.3.2> +<H3>7.3.2 Data space</H3> +</a> + +A program may access memory +within a valid block buffer. +<P> +<code> +See: +<A href=dpans3.htm#3.3.3>3.3.3</a> Data Space +</code> + +<P> + +<hr> +<A name=7.3.3> +<H3>7.3.3 Block buffer regions</H3> +</a> + +The address of a block buffer returned by +<a href=dpans7.htm#7.6.1.0800>BLOCK</a> or +<a href=dpans7.htm#7.6.1.0820>BUFFER</a> is transient. +A call to BLOCK or BUFFER may render a previously-obtained block-buffer +address invalid, as may a call to any word that: +<P> + +<UL> +<LI>parses: +<LI>displays characters on the user output device, such as +<a href=dpans6.htm#6.1.2310>TYPE</a> or +<a href=dpans6.htm#6.1.1320>EMIT</a>; +<LI>controls the user output device, such as +<a href=dpans6.htm#6.1.0990>CR</a> or +<a href=dpans10.htm#10.6.1.0742>AT-XY</a>; +<LI>receives or tests for the presence of characters from the user input +device such as +<a href=dpans6.htm#6.1.0695>ACCEPT</a> or +<a href=dpans6.htm#6.1.1750>KEY</a>; +<LI>waits for a condition or event, such as +<a href=dpans10.htm#10.6.2.1905>MS</a> or +<a href=dpans10.htm#10.6.2.1305>EKEY</a>; +<LI>manages the block buffers, such as +<a href=dpans7.htm#7.6.1.1559>FLUSH</a>, +<a href=dpans7.htm#7.6.1.2180>SAVE-BUFFERS</a>, or +<a href=dpans7.htm#7.6.2.1330>EMPTY-BUFFERS</a>; +<LI>performs any operation on a file or file-name directory that implies +I/O, such as +<a href=dpans6.htm#6.2.2125>REFILL</a> or any word that returns an ior; +<LI>implicitly performs I/O, such as text interpreter nesting and +un-nesting when files are being used (including un-nesting implied by +<a href=dpans9.htm#9.6.1.2275>THROW</a>). +</UL> +<P> + +If the input source is a block, these restrictions also apply to the address +returned by +<a href=dpans6.htm#6.1.2216>SOURCE</a>. +<P> + +Block buffers are +uniquely assigned to blocks. + +<P> + + +<hr> +<A name=7.3.4> +<H3>7.3.4 Parsing</H3> +</a> + +The Block word set implements an alternative input source for the text +interpreter. When the input source is a block, +<a href=dpans7.htm#7.6.1.0790>BLK</a> shall contain the +non-zero block number and the input buffer is the 1024-character buffer +containing that block. +<P> + +A block is conventionally displayed +as 16 lines of 64 characters. +<P> + +A program may switch the input source to a block by using +<a href=dpans7.htm#7.6.1.1790>LOAD</a> or +<a href=dpans7.htm#7.6.2.2280>THRU</a>. +Input sources may be nested using LOAD and +<a href=dpans6.htm#6.1.1360>EVALUATE</a> in any order. +<P> + +A program may reposition the parse area within a block by manipulating +<a href=dpans6.htm#6.1.0560>&gt;IN</a>. +More extensive repositioning can be accomplished using +<a href=dpans6.htm#6.2.2182>SAVE-INPUT</a> +and +<a href=dpans6.htm#6.2.2148>RESTORE-INPUT</a>. +<P> +<code> +See: +<A href=dpans3.htm#3.4.1>3.4.1</a> Parsing +</code> +<P> + + +<hr> +<A name=7.3.5> +<H3>7.3.5 Possible action on an ambiguous condition</H3> +</a> +<p> +<UL> +<LI>A system with the Block word set may set interpretation state and interpret +a block. +</UL> + +<code> +See: +<A href=dpans3.htm#3.4.4>3.4.4</a> Possible action on an ambiguous +condition +</code> +<P> + +<hr> +<A name=7.4> +<H2>7.4 Additional documentation requirements</H2> +</a> + + +<hr> +<A name=7.4.1> +<H3>7.4.1 System documentation</H3> +</a> + + +<hr> +<A name=7.4.1.1> +<H4>7.4.1.1 Implementation-defined options</H4> +</a> + +<UL> +<LI>the format used for display by +<a href=dpans7.htm#7.6.2.1770>7.6.2.1770</a> LIST (if implemented); +<LI>the length of a line affected by +<a href=dpans7.htm#7.6.2.2535>7.6.2.2535</a> \ (if implemented). +</UL> +<P> + + +<hr> +<A name=7.4.1.2> +<H4>7.4.1.2 Ambiguous conditions</H4> +</a> + +<UL> +<LI>Correct block read was not possible; +<LI>I/O exception in block transfer; +<LI>Invalid block number +(<a href=dpans7.htm#7.6.1.0800>7.6.1.0800</a> BLOCK, +<a href=dpans7.htm#7.6.1.0820>7.6.1.0820</a> BUFFER, +<a href=dpans7.htm#7.6.1.1790>7.6.1.1790</a> LOAD); +<LI>A program directly alters the contents of +<a href=dpans7.htm#7.6.1.0790>7.6.1.0790</a> BLK; +<LI>No current block buffer for +<a href=dpans7.htm#7.6.1.2400>7.6.1.2400</a> UPDATE. +</UL> + +<P> + + +<hr> +<A name=7.4.1.3> +<H4>7.4.1.3 Other system documentation</H4> +</a> + +<UL> +<LI>any restrictions a multiprogramming system places on the use of buffer +addresses; +<LI>the number of blocks available for source text and data. +</UL> +<P> + + +<hr> +<A name=7.4.2> +<H3>7.4.2 Program documentation</H3> +</a> + +<UL> +<LI>the number of blocks required by the program. +</UL> +<P> + + +<hr> +<A name=7.5> +<H2>7.5 Compliance and labeling</H2> +</a> + + +<hr> +<A name=7.5.1> +<H3>7.5.1 ANS Forth systems</H3> +</a> + +The phrase <B>Providing the Block word set</B> shall be appended to the +label of any Standard System that provides all of the Block word set. +<P> + +The phrase <B>Providing name(s) from the Block Extensions word set</B> +shall be appended to the label of any Standard System that provides +portions of the Block Extensions word set. +<P> + +The phrase <B>Providing the Block Extensions word set</B> shall be +appended to the label of any Standard System that provides all of the +Block and Block Extensions word sets. +<P> + + +<hr> +<A name=7.5.2> +<H3>7.5.2 ANS Forth programs</H3> +</a> + +The phrase <B>Requiring the Block word set</B> shall be appended to the +label of Standard Programs that require the system to provide the Block +word set. +<P> + +The phrase <B>Requiring name(s) from the Block Extensions word set</B> +shall be appended to the label of Standard Programs that require the +system to provide portions of the Block Extensions word set. +<P> + +The phrase <B>Requiring the Block Extensions word set</B> shall be +appended to the label of Standard Programs that require the system to +provide all of the Block and Block Extensions word sets. +<P> + + +<hr> +<A name=7.6> +<H2>7.6 Glossary</H2> +</a> + + +<hr> +<A name=7.6.1> +<H3>7.6.1 Block words</H3> +</a> + + +<hr> +<A name=7.6.1.0790> +<code> +7.6.1.0790 <b>BLK</b> +</code> +</a> +<BR> +<B>b-l-k</B> BLOCK +<BR> +<pre> + ( -- a-addr ) +</pre> + +<P> + +a-addr is the address of a cell containing zero or the number of the +mass-storage block being interpreted. If BLK contains zero, the input +source is not a block and can be identified by +<a href=dpans6.htm#6.2.2218>SOURCE-ID</a>, if SOURCE-ID +is available. An ambiguous condition exists if a program directly +alters the contents of BLK. + +<p> +<code> +See: +<A href=dpans7.htm#7.3.3>7.3.3</a> Block buffer regions +</code> +<p> + +<hr> +<A name=7.6.1.0800> +<code> +7.6.1.0800 <b>BLOCK</b> +</code> +</a> +<BR> +BLOCK +<BR> +<pre> + ( u -- a-addr ) +</pre> + +<P> + +a-addr is the address of the first character of the block buffer assigned to +mass-storage block u. An ambiguous condition exists if u is not an available +block number. +<P> + +If block u is already in a block buffer, a-addr is the address of that block +buffer. +<P> + +If block u is not already in memory and there is an unassigned block buffer, +transfer block u from mass storage to an unassigned block buffer. a-addr is +the address of that block buffer. +<P> + +If block u is not already in memory and there are no unassigned block buffers, +unassign a block buffer. If the block in that buffer has been +<a href=dpans7.htm#7.6.1.2400>UPDATE</a>d, +transfer the block to mass storage and transfer block u from mass storage into +that buffer. a-addr is the address of that block buffer. +<P> + +At the conclusion of the operation, the block buffer pointed to by a-addr is +the current block buffer and is assigned to u. + +<P> + +<hr> +<A name=7.6.1.0820> +<code> +7.6.1.0820 <b>BUFFER</b> +</code> +</a> +<BR> +BLOCK +<BR> +<pre> + ( u -- a-addr ) +</pre> + +<P> + +a-addr is the address of the first character of the block buffer +assigned to block u. The contents of the block are unspecified. An +ambiguous condition exists if u is not an available block number. +<P> + +If block u is already in a block buffer, a-addr is the address of that +block buffer. +<P> + +If block u is not already in memory and there is an unassigned buffer, +a-addr is the address of that block buffer. +<P> + +If block u is not already in memory and there are no unassigned block +buffers, unassign a block buffer. If the block in that buffer has been +<a href=dpans7.htm#7.6.1.2400>UPDATE</a>d, +transfer the block to mass storage. a-addr is the address of +that block buffer. +<P> + +At the conclusion of the operation, the block buffer pointed to by +a-addr is the current block buffer and is assigned to u. +<P> + +<code> +See: +<A href=dpans7.htm#7.6.1.0800>7.6.1.0800 BLOCK</a> +</code> + +<P> + +<hr> +<A name=7.6.1.1360> +<code> +7.6.1.1360E <b>EVALUATE</b> +</code> +</a> +<BR> +BLOCK +<BR> +<P> + +Extend the semantics of +<a href=dpans6.htm#6.1.1360>6.1.1360</a> EVALUATE to include: +<P> + + Store zero in BLK. + +<P> + +<hr> +<A name=7.6.1.1559> +<code> +7.6.1.1559 <b>FLUSH</b> +</code> +</a> +<BR> +BLOCK +<BR> +<pre> + ( -- ) +</pre> + +<P> + +Perform the function of +<a href=dpans7.htm#7.6.1.2180>SAVE-BUFFERS</a>, +then unassign all block buffers. + +<P> + +<hr> +<A name=7.6.1.1790> +<code> +7.6.1.1790 <b>LOAD</b> +</code> +</a> +<BR> +BLOCK +<BR> +<pre> + ( i*x u -- j*x ) +</pre> + +<P> + +Save the current input-source specification. Store u in +<a href=dpans7.htm#7.6.1.0790>BLK</a> (thus +making block u the input source and setting the input buffer to +encompass its contents), set +<a href=dpans6.htm#6.1.0560>&gt;IN</a> +to zero, and interpret. When the parse +area is exhausted, restore the prior input source specification. Other +stack effects are due to the words LOADed. +<P> + +An ambiguous condition exists if u is zero or is not a valid block +number. +<P> + +<code> +See: +<A href=dpans3.htm#3.4>3.4</a> The Forth text interpreter +</code> + +<P> + +<hr> +<A name=7.6.1.2180> +<code> +7.6.1.2180 <b>SAVE-BUFFERS</b> +</code> +</a> +<BR> +BLOCK +<BR> +<pre> + ( -- ) +</pre> + +<P> + +Transfer the contents of each +<a href=dpans7.htm#7.6.1.2400>UPDATE</a>d block buffer to mass storage. +Mark all buffers as unmodified. + +<P> + +<hr> +<A name=7.6.1.2400> +<code> +7.6.1.2400 <b>UPDATE</b> +</code> +</a> +<BR> +BLOCK +<BR> +<pre> + ( -- ) +</pre> + +<P> + +Mark the current block buffer as modified. An ambiguous condition +exists if there is no current block buffer. +<P> + +UPDATE does not immediately cause I/O. +<P> + +<code> +See: +<A href=dpans7.htm#7.6.1.0800>7.6.1.0800 BLOCK</a> , +<A href=dpans7.htm#7.6.1.0820>7.6.1.0820 BUFFER</a> , +<A href=dpans7.htm#7.6.1.1559>7.6.1.1559 FLUSH</a> , +<A href=dpans7.htm#7.6.1.2180>7.6.1.2180 SAVE-BUFFERS</a> +</code> + +<P> + +<hr> +<A name=7.6.2> +<H3>7.6.2 Block extension words</H3> +</a> + +<hr> +<A name=7.6.2.1330> +<code> +7.6.2.1330 <b>EMPTY-BUFFERS</b> +</code> +</a> +<BR> +BLOCK EXT +<BR> +<pre> + ( -- ) +</pre> + +<P> + +Unassign all block buffers. Do not transfer the contents of any +<a href=dpans7.htm#7.6.1.2400>UPDATE</a>d +block buffer to mass storage. +<P> + +<code> +See: +<A href=dpans7.htm#7.6.1.0800>7.6.1.0800 BLOCK</a> +</code> + +<P> + +<hr> +<A name=7.6.2.1770> +<code> +7.6.2.1770 <b>LIST</b> +</code> +</a> +<BR> +BLOCK EXT +<BR> +<pre> + ( u -- ) +</pre> + +<P> + +Display block u in an +implementation-defined format. Store u in +<a href=dpans7.htm#7.6.2.2190>SCR</a>. +<P> + +<code> +See: +<A href=dpans7.htm#7.6.1.0800>7.6.1.0800 BLOCK</a> +</code> + +<P> + +<hr> +<A name=7.6.2.2125> +<code> +7.6.2.2125 <b>REFILL</b> +</code> +</a> +<BR> +BLOCK EXT +<BR> +<pre> + ( -- flag ) +</pre> + +<P> + +Extend the execution semantics of +<a href=dpans6.htm#6.2.2125>6.2.2125</a> REFILL with the following: +<P> + +When the input source is a block, make the next block the input source +and current input buffer by adding one to the value of +<a href=dpans7.htm#7.6.1.0790>BLK</a> and setting +<a href=dpans6.htm#6.1.0560>&gt;IN</a> to zero. Return true if the new value of BLK is a valid block +number, otherwise false. +<P> + +<code> +See: +<A href=dpans11.htm#11.6.2.2125>11.6.2.2125 REFILL</a> +</code> + +<P> + +<hr> +<A name=7.6.2.2190> +<code> +7.6.2.2190 <b>SCR</b> +</code> +</a> +<BR> +<B>s-c-r</B> BLOCK EXT +<BR> +<pre> + ( -- a-addr ) +</pre> + +<P> + +a-addr is the address of a cell containing the block number of the block +most recently +<a href=dpans7.htm#7.6.2.1770>LIST</a>ed. + +<P> +<code> +See: +<a href=dpansa7.htm#A.7.6.2.2190>A.7.6.2.2190 SCR</a> +</code> +<p> + +<hr> +<A name=7.6.2.2280> +<code> +7.6.2.2280 <b>THRU</b> +</code> +</a> +<BR> +BLOCK EXT +<BR> +<pre> + ( i*x u1 u2 -- j*x ) +</pre> + +<P> + +<a href=dpans7.htm#7.6.1.1790>LOAD</a> +the mass storage blocks numbered u1 through u2 in sequence. Other +stack effects are due to the words LOADed. + +<P> + +<hr> +<A name=7.6.2.2535> +<code> +7.6.2.2535 <b>\</b> +</code> +</a> +<BR> +<B>backslash</B> BLOCK EXT +<BR> +<P> + +Extend the semantics of +<a href=dpans6.htm#6.2.2535>6.2.2535</a> \ to be: +<P> +<pre> + Compilation: Perform the execution semantics given below. +</pre> +<P> +<pre> + Execution: ( <B>ccc&lt;eol&gt;</B>-- ) +</pre> +<P> + +If +<a href=dpans7.htm#7.6.1.0790>BLK</a> +contains zero, parse and discard the remainder of the parse area; +otherwise parse and discard the portion of the parse area corresponding +to the remainder of the current line. \ is an immediate word. + + +<hr> +<A href=dpans.htm#toc><IMG src="up.gif" ></A> Table of Contents +<BR> +<A href=dpans8.htm><IMG src="right.gif" ></A> +Next Section +<P> +</BODY> +</HTML> diff --git a/mwmouse/sources/AnsForth/DPANS8.HTM b/mwmouse/sources/AnsForth/DPANS8.HTM @@ -0,0 +1,785 @@ +<HTML><HEAD> +<TITLE>DPANS94</TITLE> +<link disabled rel="stylesheet" href="mpexc6.css"> +<style>@import url(mpexc6.css);</style> +</head> + +<BODY> +<table width=100%> +<tr> +<td align=left> +<a href=dpans7.htm><img src=left.gif + width=26 height=26 align=ALIGN border=0></a> +<a href=dpans9.htm><img src=right.gif + width=26 height=26 align=ALIGN border=0></a> +</td> +<td align=right> +<a href=dpans.htm#toc><img src=up.gif + width=26 height=26 align=ALIGN border=0></a> +<a name=8.>Table of Contents</a> +</td> +</tr> +</table> +<p> +<hr size=4> + +<H1>8. The optional Double-Number word set</H1> + +<p> +<code> +See: +<a href=dpansa8.htm#A.8>A.8</a> The optional Double-Number word set +</code> + +<hr> +<a name=8.1> +<H2>8.1 Introduction</H2> +</a> + +Sixteen-bit Forth systems often use double-length numbers. However, +many Forths on small embedded systems do not, and many users of Forth on +systems with a cell size of 32 bits or more find that the use of +double-length numbers is much diminished. Therefore, the words that +manipulate double-length entities have been placed in this optional word +set. + +<P> + +<hr> +<A name=8.2> +<H2>8.2 Additional terms and notation</H2> +</a> + +None. + +<P> + +<hr> +<A name=8.3> +<H2>8.3 Additional usage requirements</H2> +</a> + + +<hr> +<A name=8.3.1> +<H3>8.3.1 Environmental queries</H3> +</a> + +Append table 8.1 +to table 3.5. +<P> + +<code> +See: +<A href=dpans3.htm#3.2.6>3.2.6</a> Environmental queries +</code> + +<P> + +Table 8.1 - Environmental Query Strings +<P> + + +<PRE> +String Value data type Constant? Meaning +------ --------------- --------- ------- +DOUBLE flag no double-number word set present +DOUBLE-EXT flag no double-number extensions word set present +</PRE> + +<P> + + +<hr> +<A name=8.3.2> +<H3>8.3.2 Text interpreter input number conversion</H3> +</a> + +When the text interpreter processes a number that is immediately +followed by a decimal point and is not found as a definition name, the +text interpreter shall convert it to a double-cell number. +<P> + +For example, entering DECIMAL 1234 leaves the single-cell number 1234 on +the stack, and entering DECIMAL 1234. leaves the double-cell number +1234 0 on the stack. +<P> + +<code> +See: +<A href=dpans3.htm#3.4.1.3>3.4.1.3</a> Text interpreter input number +conversion, +<a href=a0004.htm>RFI 0004</a> Number Conversion. +</code> + +<P> + +<hr> +<A name=8.4> +<H2>8.4 Additional documentation requirements</H2> +</a> + + +<hr> +<A name=8.4.1> +<H3>8.4.1 System documentation</H3> +</a> + + +<hr> +<A name=8.4.1.1> +<H4>8.4.1.1 Implementation-defined options</H4> +</a> + +<UL> +<LI>no additional requirements. +</UL> +<P> + +<hr> +<A name=8.4.1.2> +<H4>8.4.1.2 Ambiguous conditions</H4> +</a> + +<UL> +<LI>d outside range of n in +<a href=dpans8.htm#8.6.1.1140>8.6.1.1140</a> D&gt;S. +</UL> +<P> + +<hr> +<A name=8.4.1.3> +<H4>8.4.1.3 Other system documentation</H4> +</a> + +<UL> +<LI>no additional requirements. +</UL> +<P> + + +<hr> +<A name=8.4.2> +<H3>8.4.2 Program documentation</H3> +</a> + +<UL> +<LI>no additional requirements. +</UL> +<P> + + +<hr> +<A name=8.5> +<H2>8.5 Compliance and labeling</H2> +</a> + + +<hr> +<A name=8.5.1> +<H3>8.5.1 ANS Forth systems</H3> +</a> + +The phrase <B>Providing the Double-Number word set</B> shall be appended +to the label of any Standard System that provides all of the +Double-Number word set. +<P> + +The phrase <B>Providing name(s) from the Double-Number Extensions word +set</B> shall be appended to the label of any Standard System that +provides portions of the Double-Number Extensions word set. +<P> + +The phrase <B>Providing the Double-Number Extensions word set</B> shall +be appended to the label of any Standard System that provides all of the +Double-Number and Double-Number Extensions word sets. + +<P> + + +<hr> +<A name=8.5.2> +<H3>8.5.2 ANS Forth programs</H3> +</a> + +The phrase <B>Requiring the Double-Number word set</B> shall be appended +to the label of Standard Programs that require the system to provide the +Double-Number word set. +<P> + +The phrase <B>Requiring name(s) from the Double-Number Extensions word +set</B> shall be appended to the label of Standard Programs that require +the system to provide portions of the Double-Number Extensions word set. +<P> + +The phrase <B>Requiring the Double-Number Extensions word set</B> shall +be appended to the label of Standard Programs that require the system to +provide all of the Double-Number and Double-Number Extensions word sets. + +<P> + + +<hr> +<A name=8.6> +<H2>8.6 Glossary</H2> +</a> + + +<hr> +<A name=8.6.1> +<H3>8.6.1 Double-Number words</H3> +</a> + + + +<hr> +<A name=8.6.1.0360> +<code> +8.6.1.0360 <b>2CONSTANT</b> +</code> +</a> +<BR> +<B>two-constant</B> DOUBLE +<BR> +<pre> + ( x1 x2 <B>"&lt;spaces&gt;name"</B> -- ) +</pre> +<P> + +Skip leading space delimiters. Parse name delimited by a space. Create +a definition for name with the execution semantics defined below. +<P> + +name is referred to +as a <B>two-constant</B>. +<P> +<pre> + <i>name</i> Execution: ( -- x1 x2 ) +</pre> +<P> + +Place cell +pair x1 x2 on the stack. +<P> + +<code> +See: +<A href=dpans3.htm#3.4.1>3.4.1</a> Parsing, +<a href=dpansa8.htm#A.8.6.1.0360>A.8.6.1.0360 2CONSTANT</a> +</code> + +<P> + +<hr> +<A name=8.6.1.0390> +<code> +8.6.1.0390 <b>2LITERAL</b> +</code> +</a> +<BR> + <B>two-literal</B> DOUBLE +<BR> +<P> +<pre> + Interpretation: Interpretation semantics for this word are undefined. +</pre> +<P> +<pre> + Compilation: ( x1 x2 -- ) +</pre> +<P> + +Append the run-time semantics +below to the current definition. +<P> +<pre> + Run-time: ( -- x1 x2 ) +</pre> +<P> + +Place cell pair +x1 x2 on the stack. + +<p> +<code> +See: +<a href=dpansa8.htm#A.8.6.1.0390>A.8.6.1.0390 2LITERAL</a> +</code> + +<P> + +<hr> +<A name=8.6.1.0440> +<code> +8.6.1.0440 <b>2VARIABLE</b> +</code> +</a> +<BR> +<B>two-variable</B> DOUBLE +<BR> +<pre> + ( <B>"&lt;spaces&gt;name"</B> -- ) +</pre> + +<P> + +Skip leading space delimiters. Parse name delimited by a space. Create +a definition for name with the execution semantics defined below. +Reserve two consecutive cells of data space. +<P> + +name is referred to +as a <B>two-variable</B>. +<P> +<pre> + <i>name</i> Execution: ( -- a-addr ) +</pre> +<P> + +a-addr is the address of the first (lowest address) cell of two +consecutive cells in data space reserved by 2VARIABLE when it defined +name. A program is responsible for initializing the contents. +<P> + +<code> +See: +<A href=dpans3.htm#3.4.1>3.4.1</a> Parsing, +<A href=dpans6.htm#6.1.2410>6.1.2410 VARIABLE</a> , +<a href=dpansa8.htm#A.8.6.1.0440>A.8.6.1.0440 2VARIABLE</a> +</code> + + +<P> + +<hr> +<A name=8.6.1.1040> +<code> +8.6.1.1040 <b>D+</b> +</code> +</a> +<BR> +<B>d-plus</B> DOUBLE +<BR> +<pre> + ( d1|ud1 d2|ud2 -- d3|ud3 ) +</pre> + +<P> + +Add d2|ud2 to d1|ud1, +giving the sum d3|ud3. + +<P> + +<hr> +<A name=8.6.1.1050> +<code> +8.6.1.1050 <b>D-</b> +</code> +</a> +<BR> +<B>d-minus</B> DOUBLE +<BR> +<pre> + ( d1|ud1 d2|ud2 -- d3|ud3 ) +</pre> + +<P> + +Subtract d2|ud2 from d1|ud1, +giving the difference d3|ud3. + +<P> + +<hr> +<A name=8.6.1.1060> +<code> +8.6.1.1060 <b>D.</b> +</code> +</a> +<BR> +<B>d-dot</B> DOUBLE +<BR> +<pre> + ( d -- ) +</pre> + +<P> + +Display d in +free field format. + +<P> + +<hr> +<A name=8.6.1.1070> +<code> +8.6.1.1070 <b>D.R</b> +</code> +</a> +<BR> +<B>d-dot-r</B> DOUBLE +<BR> +<pre> + ( d n -- ) +</pre> + +<P> + +Display d right aligned in a field n characters wide. If the number of +characters required to display d is greater than n, all digits are +displayed with no leading spaces in a field as wide as necessary. + +<p> +<code> +See: +<a href=dpansa8.htm#A.8.6.1.1070>A.8.6.1.1070 D.R</a> +</code> + +<P> + +<hr> +<A name=8.6.1.1075> +<code> +8.6.1.1075 <b>D0&lt;</b> +</code> +</a> +<BR> +<B>d-zero-less</B> DOUBLE +<BR> +<pre> + ( d -- flag ) +</pre> + +<P> + +flag is true if and +only if d is less than zero. + +<P> + +<hr> +<A name=8.6.1.1080> +<code> +8.6.1.1080 <b>D0=</b> +</code> +</a> +<BR> +<B>d-zero-equals</B> DOUBLE +<BR> +<pre> + ( xd -- flag ) +</pre> + +<P> + +flag is true if and +only if xd is equal to zero. + +<P> + +<hr> +<A name=8.6.1.1090> +<code> +8.6.1.1090 <b>D2*</b> +</code> +</a> +<BR> +<B>d-two-star</B> DOUBLE +<BR> +<pre> + ( xd1 -- xd2 ) +</pre> + +<P> + +xd2 is the result of shifting xd1 one bit toward the most-significant bit, +filling the vacated least-significant bit with zero. + + +<p> +<code> +See: +<a href=dpansa8.htm#A.8.6.1.1090>A.8.6.1.1090 D2*</a> +</code> + +<P> + +<hr> +<A name=8.6.1.1100> +<code> +8.6.1.1100 <b>D2/</b> +</code> +</a> +<BR> +<B>d-two-slash</B> DOUBLE +<BR> +<pre> + ( xd1 -- xd2 ) +</pre> + +<P> + +xd2 is the result of shifting xd1 one bit toward the least-significant bit, +leaving the most-significant bit unchanged. + +<p> +<code> +See: +<a href=dpansa8.htm#A.8.6.1.1100>A.8.6.1.1100 D2/</a> +</code> + +<P> + +<hr> +<A name=8.6.1.1110> +<code> +8.6.1.1110 <b>D&lt;</b> +</code> +</a> +<BR> +<B>d-less-than</B> DOUBLE +<BR> +<pre> + ( d1 d2 -- flag ) +</pre> + +<P> + +flag is true if and only +if d1 is less than d2. + +<P> + +<hr> +<A name=8.6.1.1120> +<code> +8.6.1.1120 <b>D=</b> +</code> +</a> +<BR> +<B>d-equals</B> DOUBLE +<BR> +<pre> + ( xd1 xd2 -- flag ) +</pre> + +<P> + +flag is true if and only if xd1 +is bit-for-bit the same as xd2. + +<P> + +<hr> +<A name=8.6.1.1140> +<code> +8.6.1.1140 <b>D&gt;S</b> +</code> +</a> +<BR> +<B>d-to-s</B> DOUBLE +<BR> +<pre> + ( d -- n ) +</pre> + +<P> + +n is the equivalent of d. An ambiguous condition exists if d lies +outside the range of a signed single-cell number. + + +<p> +<code> +See: +<a href=dpansa8.htm#A.8.6.1.1140>A.8.6.1.1140 D&gt;S</a> +</code> + +<P> + +<hr> +<A name=8.6.1.1160> +<code> +8.6.1.1160 <b>DABS</b> +</code> +</a> +<BR> +<B>d-abs</B> DOUBLE +<BR> +<pre> + ( d -- ud ) +</pre> + +<P> + +ud is the +absolute value of d. + +<P> + +<hr> +<A name=8.6.1.1210> +<code> +8.6.1.1210 <b>DMAX</b> +</code> +</a> +<BR> +<B>d-max</B> DOUBLE +<BR> +<pre> + ( d1 d2 -- d3 ) +</pre> + +<P> + +d3 is the +greater of d1 and d2. + +<P> + +<hr> +<A name=8.6.1.1220> +<code> +8.6.1.1220 <b>DMIN</b> +</code> +</a> +<BR> +<B>d-min</B> DOUBLE +<BR> +<pre> + ( d1 d2 -- d3 ) +</pre> + +<P> + +d3 is the +lesser of d1 and d2. + +<P> + +<hr> +<A name=8.6.1.1230> +<code> +8.6.1.1230 <b>DNEGATE</b> +</code> +</a> +<BR> +<B>d-negate</B> DOUBLE +<BR> +<pre> + ( d1 -- d2 ) +</pre> + +<P> + +d2 is +the negation of d1. + +<P> + +<hr> +<A name=8.6.1.1820> +<code> +8.6.1.1820 <b>M*/</b> +</code> +</a> +<BR> +<B>m-star-slash</B> DOUBLE +<BR> +<pre> + ( d1 n1 +n2 -- d2 ) +</pre> + +<P> + +Multiply d1 by n1 producing the triple-cell intermediate result t. +Divide t by +n2 giving the double-cell quotient d2. An ambiguous +condition exists if +n2 is zero or negative, or the quotient lies +outside of the range of a double-precision signed integer. + +<p> +<code> +See: +<a href=dpansa8.htm#A.8.6.1.1820>A.8.6.1.1820 M*/</a> +</code> + +<P> + +<hr> +<A name=8.6.1.1830> +<code> +8.6.1.1830 <b>M+</b> +</code> +</a> +<BR> +<B>m-plus</B> DOUBLE +<BR> +<pre> + ( d1|ud1 n -- d2|ud2 ) +</pre> + +<P> + +Add n to d1|ud1, +giving the sum d2|ud2. + +<p> +<code> +See: +<a href=dpansa8.htm#A.8.6.1.1830>A.8.6.1.1830 M+</a> +</code> + +<P> + +<hr> +<A name=8.6.2> +<H3>8.6.2 Double-Number extension words</H3> +</a> + +<hr> +<A name=8.6.2.0420> +<code> +8.6.2.0420 <b>2ROT</b> +</code> +</a> +<BR> +<B>two-rote</B> DOUBLE EXT +<pre> + ( x1 x2 x3 x4 x5 x6 -- x3 x4 x5 x6 x1 x2 ) +</pre> + +<P> + +Rotate the top three cell pairs on the stack bringing cell pair x1 x2 to +the top of the stack. + +<P> + +<hr> +<A name=8.6.2.1270> +<code> +8.6.2.1270 <b>DU<</b> +</code> +</a> +<BR> +<B>d-u-less</B> DOUBLE EXT +<BR> +<pre> + ( ud1 ud2 -- flag ) +</pre> +<P> + +flag is true if +and only if ud1 is less than ud2. + + + +<hr> +<A href=dpans.htm#toc><IMG src="up.gif" ></A> Table of Contents +<BR> +<A href=dpans9.htm><IMG src="right.gif" ></A> +Next Section +<P> +</BODY> +</HTML> diff --git a/mwmouse/sources/AnsForth/DPANS9.HTM b/mwmouse/sources/AnsForth/DPANS9.HTM @@ -0,0 +1,555 @@ +<HTML><HEAD> +<TITLE>DPANS94</TITLE> +<link disabled rel="stylesheet" href="mpexc6.css"> +<style>@import url(mpexc6.css);</style> +</head> + +<BODY> +<table width=100%> +<tr> +<td align=left> +<a href=dpans8.htm><img src=left.gif + width=26 height=26 align=ALIGN border=0></a> +<a href=dpans10.htm><img src=right.gif + width=26 height=26 align=ALIGN border=0></a> +</td> +<td align=right> +<a href=dpans.htm#toc><img src=up.gif + width=26 height=26 align=ALIGN border=0></a> +<a name=9.>Table of Contents</a> +</td> +</tr> +</table> +<p> +<hr size=4> + +<H1>9. The optional Exception word set</H1> + + +<p> +<code> +See: +<a href=dpansa9.htm#A.9>A.9</a> The optional Exception word set +</code> +<p> + + +<hr> +<A name=9.1> +<H2>9.1 Introduction</H2> +</a> + + +<hr> +<A name=9.2> +<H2>9.2 Additional terms and notation</H2> +</a> + +None. + + +<hr> +<A name=9.3> +<H2>9.3 Additional usage requirements</H2> +</a> + +<p> +<code> +See: +<a href=dpansa9.htm#A.9.3>A.9.3</a> Additional usage requirements +</code> +<p> + +<hr> +<A name=9.3.1> +<H3>9.3.1 THROW values</H3> +</a> + +The +<a href=dpans9.htm#9.6.1.2275>THROW</a> +values {-255...-1} shall be used only as assigned by this +Standard. The values {-4095...-256} shall be used only as assigned by a +system. +<P> + +If the +<a href=dpans11.htm>File-Access</a> or +<a href=dpans14.htm>Memory-Allocation</a> word sets are implemented, it is +recommended that the non-zero values of ior lie within the range of +system THROW values, as defined above. In an operating-system +environment, this can sometimes be accomplished by <B>biasing</B> the +range of operating-system exception-codes to fall within the THROW +range. +<P> + +Programs shall not define values for use with THROW in the range +{-4095...-1}. + +<P> + +<hr> +<A name=9.3.2> +<H3>9.3.2 Exception frame</H3> +</a> + +An exception frame is the implementation-dependent set of information +recording the current execution state necessary for the proper +functioning of +<a href=dpans9.htm#9.6.1.0875>CATCH</a> and +<a href=dpans9.htm#9.6.1.2275>THROW</a>. It often includes the depths of the +data stack and return stack. +<P> + + +<hr> +<A name=9.3.3> +<H3>9.3.3 Exception stack</H3> +</a> + +A stack used for the nesting of exception frames by +<a href=dpans9.htm#9.6.1.0875>CATCH</a> and +<a href=dpans9.htm#9.6.1.2275>THROW</a>. It +may be, but need not be, implemented using the return stack. +<P> + + +<hr> +<A name=9.3.4> +<H3>9.3.4 Environmental queries</H3> +</a> + +Append table 9.1 +to table 3.5. +<P> + +<code> +See: +<A href=dpans3.htm#3.2.6>3.2.6</a> Environmental queries +</code> +<P> + +Table 9.1 - Environmental query strings +<P> + + +<PRE> +String Value data type Constant? Meaning +------ --------------- --------- ------- +EXCEPTION flag no Exception word set present +EXCEPTION-EXT flag no Exception extensions word set present + +</PRE> + +<P> + +<hr> +<A name=9.3.5> +<H3>9.3.5 Possible actions on an ambiguous condition</H3> +</a> + +A system choosing to execute +<a href=dpans9.htm#9.6.1.2275>THROW</a> when detecting one of the ambiguous +conditions listed in table 9.3.6 shall use the throw code listed there. +<P> + +<code> +See: +<A href=dpans3.htm#3.4.4>3.4.4</a> Possible actions on an ambiguous +condition +</code> + +<P> + +Table 9.2 - THROW code assignments +<P> + + +<PRE> + Code Reserved for + ---- ------------ + -1 <a href=dpans6.htm#6.1.0670>ABORT</a> + -2 <a href=dpans6.htm#6.1.0680>ABORT"</a> + -3 stack overflow + -4 stack underflow + -5 return stack overflow + -6 return stack underflow + -7 do-loops nested too deeply during execution + -8 dictionary overflow + -9 invalid memory address + -10 division by zero + -11 result out of range + -12 argument type mismatch + -13 undefined word + -14 interpreting a compile-only word + -15 invalid <a href=dpans15.htm#15.6.2.1580>FORGET</a> + -16 attempt to use zero-length string as a name + -17 pictured numeric output string overflow + -18 parsed string overflow + -19 definition name too long + -20 write to a read-only location + -21 unsupported operation (e.g., <a href=dpans10.htm#10.6.1.0742>AT-XY</a> on a + too-dumb terminal) + -22 control structure mismatch + -23 address alignment exception + -24 invalid numeric argument + -25 return stack imbalance + -26 loop parameters unavailable + -27 invalid recursion + -28 user interrupt + -29 compiler nesting + -30 obsolescent feature + -31 <a href=dpans6.htm#6.1.0550>>BODY</a> used on non-<a href=dpans6.htm#6.1.1000>CREATE</a>d definition + -32 invalid name argument (e.g., <a href=dpans6.htm#6.2.2295>TO</a> xxx) + -33 block read exception + -34 block write exception + -35 invalid block number + -36 invalid file position + -37 file I/O exception + -38 non-existent file + -39 unexpected end of file + -40 invalid <a href=dpans6.htm#6.1.0750>BASE</a> for floating point conversion + -41 loss of precision + -42 floating-point divide by zero + -43 floating-point result out of range + -44 floating-point stack overflow + -45 floating-point stack underflow + -46 floating-point invalid argument + -47 compilation word list deleted + -48 invalid <a href=dpans6.htm#6.1.2033>POSTPONE</a> + -49 search-order overflow + -50 search-order underflow + -51 compilation word list changed + -52 control-flow stack overflow + -53 exception stack overflow + -54 floating-point underflow + -55 floating-point unidentified fault + -56 <a href=dpans6.htm#6.1.2050>QUIT</a> + -57 exception in sending or receiving a character + -58 <a href=dpans15.htm#15.6.2.2532>[IF]</a>, <a href=dpans15.htm#15.6.2.2531>[ELSE]</a>, or <a href=dpans15.htm#15.6.2.2533>[THEN]</a> exception +</PRE> + +<P> + +<hr> +<A name=9.3.6> +<H3>9.3.6 Exception handling</H3> +</a> + +There are several methods of coupling +<a href=dpans9.htm#9.6.1.0875>CATCH</a> and +<a href=dpans9.htm#9.6.1.2275>THROW</a> to other +procedural nestings. The usual nestings are the execution of +definitions, use of the return stack, use of loops, instantiation of +locals and nesting of input sources (i.e., with +<a href=dpans7.htm#7.6.1.1790>LOAD</a>, +<a href=dpans6.htm#6.1.1360>EVALUATE</a>, or +<a href=dpans11.htm#11.6.1.1717>INCLUDE-FILE</a>). +<P> + +When a THROW returns control to a CATCH, the system shall un-nest not +only definitions, but also, if present, locals and input source +specifications, to return the system to its proper state for continued +execution past the CATCH. +<P> +<code> +See: +<a href=dpansa9.htm#A.9.3.6>A.9.3.6</a> Exception handling +</code> +<p> + + +<hr> +<A name=9.4> +<H2>9.4 Additional documentation requirements</H2> +</a> + + + +<hr> +<A name=9.4.1> +<H3>9.4.1 System documentation</H3> +</a> + + + +<hr> +<A name=9.4.1.1> +<H3>9.4.1.1 Implementation-defined options</H3> +</a> + +<UL> +<LI>Values used in the system by +<a href=dpans9.htm#9.6.1.0875>9.6.1.0875</a> CATCH and +<a href=dpans9.htm#9.6.1.2275>9.6.1.2275</a> THROW +(<a href=dpans9.htm#9.3.1>9.3.1</a> THROW values, +<a href=dpans9.htm#9.3.5>9.3.5</a> +Possible actions on an ambiguous condition). +</UL> +<P> + + +<hr> +<A name=9.4.1.2> +<H3>9.4.1.2 Ambiguous conditions</H3> +</a> + +<UL> +<LI>no additional requirements. +</UL> +<P> + + +<hr> +<A name=9.4.1.3> +<H3>9.4.1.3 Other system documentation</H3> +</a> + +<UL> +<LI>no additional requirements. +</UL> + +<P> + + +<hr> +<A name=9.4.2> +<H3>9.4.2 Program documentation</H3> +</a> + +<UL> +<LI>no additional requirements. +</UL> + + +<hr> +<A name=9.5> +<H2>9.5 Compliance and labeling</H2> +</a> + + + +<hr> +<A name=9.5.1> +<H3>9.5.1 ANS Forth systems</H3> +</a> + +The phrase <B>Providing the Exception word set</B> shall be appended to +the label of any Standard System that provides all of the Exception word +set. +<P> + +The phrase <B>Providing name(s) from the Exception Extensions word +set</B> shall be appended to the label of any Standard System that +provides portions of the Exception Extensions word set. +<P> + +The phrase <B>Providing the Exception Extensions word set</B> shall be +appended to the label of any Standard System that provides all of the +Exception and Exception Extensions word sets. +<P> + + + +<hr> +<A name=9.5.2> +<H3>9.5.2 ANS Forth programs</H3> +</a> + +The phrase <B>Requiring the Exception word set</B> shall be appended to +the label of Standard Programs that require the system to provide the +Exception word set. +<P> + +The phrase <B>Requiring name(s) from the Exception Extensions word +set</B> shall be appended to the label of Standard Programs that require +the system to provide portions of the Exception Extensions word set. +<P> + +The phrase <B>Requiring the Exception Extensions word set</B> shall be +appended to the label of Standard Programs that require the system to +provide all of the Exception and Exception Extensions word sets. + +<P> + + +<hr> +<A name=9.6> +<H2>9.6 Glossary</H2> +</a> + + +<hr> +<A name=9.6.1> +<H3>9.6.1 Exception words</H3> +</a> + + + +<hr> +<A name=9.6.1.0875> +<code> +9.6.1.0875 <b>CATCH</b> +</code> +</a> +<BR> +EXCEPTION +<BR> +<pre> + ( i*x xt -- j*x 0 | i*x n ) +</pre> +<P> + +Push an exception frame on the exception stack and then execute the +execution token xt (as with +<a href=dpans6.htm#6.1.1370>EXECUTE</a>) +in such a way that control can be +transferred to a point just after CATCH if +<a href=dpans9.htm#9.6.1.2275>THROW</a> is executed during the +execution of xt. +<P> + +If the execution of xt completes normally (i.e., the exception frame +pushed by this CATCH is not popped by an execution of THROW) pop the +exception frame and return zero on top of the data stack, above whatever +stack items would have been returned by xt EXECUTE. Otherwise, the +remainder of the execution semantics are given by THROW. + +<P> + +<hr> +<A name=9.6.1.2275> +<code> +9.6.1.2275 <b>THROW</b> +</code> +</a> +<BR> +EXCEPTION +<BR> +<pre> + ( k*x n -- k*x | i*x n ) +</pre> +<P> + +If any bits of n are non-zero, pop the topmost exception frame from the +exception stack, along with everything on the return stack above that +frame. Then restore the input source specification in use before the +corresponding +<a href=dpans9.htm#9.6.1.0875>CATCH</a> +and adjust the depths of all stacks defined by this +Standard so that they are the same as the depths saved in the exception +frame (i is the same number as the i in the input arguments to the +corresponding CATCH), put n on top of the data stack, and transfer +control to a point just after the CATCH that pushed that exception +frame. +<P> + +If the top of the stack is non zero and there is no exception frame on +the exception stack, the behavior is as follows: +<P> + +If n is minus-one (-1), perform the function of +<a href=dpans6.htm#6.1.0670>6.1.0670</a> ABORT (the +version of ABORT in the Core word set), displaying no message. +<P> + +If n is minus-two, perform the function of +<a href=dpans6.htm#6.1.0680>6.1.0680</a> ABORT" (the version +of ABORT" in the Core word set), displaying the characters ccc +associated with the ABORT" that generated the THROW. +<P> + +Otherwise, the system may display an implementation-dependent message +giving information about the condition associated with the THROW code n. +Subsequently, the system shall perform the function of +<a href=dpans6.htm#6.1.0670>6.1.0670</a> ABORT +(the version of ABORT in the Core word set). +<P> + +<p> +<code> +See: +<a href=dpansa9.htm#A.9.6.1.2275>A.9.6.1.2275 THROW</a> +</code> +<p> + +<hr> +<A name=9.6.2> +<H3>9.6.2 Exception extension words</H3> +</a> + +<hr> +<A name=9.6.2.0670> +<code> +9.6.2.0670 <b>ABORT</b> +</code> +</a> +<br> +EXCEPTION EXT +<P> + +Extend the semantics of +<a href=dpans6.htm#6.1.0670>6.1.0670</a> ABORT to be: +<P> + +<pre> + ( i*x -- ) ( R: j*x -- ) +</pre> +<P> + +Perform the function of -1 +<a href=dpans9.htm#9.6.1.2275>THROW</a> . +<P> + + +<hr> +<A name=9.6.2.0680> +<code> +9.6.2.0680 <b>ABORT"</b> +</code> +</a> +<br> +<B>abort-quote</B> EXCEPTION EXT +<P> +Extend the semantics of +<a href=dpans6.htm#6.1.0680>6.1.0680</a> ABORT" to be: +<P> +<pre> + Interpretation: Interpretation semantics for this word are undefined. +</pre> +<P> +<pre> + Compilation: ( <B>"ccc&lt;quote&gt;"</B> -- ) +</pre> +<P> + +Parse ccc delimited by a " (double-quote). Append the run-time semantics +given below to the current definition. +<P> + +<pre> + Run-time: ( i*x x1 -- | i*x ) ( R: j*x -- | j*x ) +</pre> +<P> + +Remove x1 from the stack. If any bit of x1 is not zero, perform the function +of -2 +<a href=dpans9.htm#9.6.1.2275>THROW</a>, +displaying ccc if there is no exception frame on the exception +stack. +<P> + +<code> +See: +<A href=dpans3.htm#3.4.1>3.4.1</a> Parsing +</code> +<P> + + +<hr> +<A href=dpans.htm#toc><IMG src="up.gif" ></A> Table of Contents +<BR> +<A href=dpans10.htm><IMG src="right.gif" ></A> +Next Section +<P> +</BODY> +</HTML> diff --git a/mwmouse/sources/AnsForth/DPANSA1.HTM b/mwmouse/sources/AnsForth/DPANSA1.HTM @@ -0,0 +1,236 @@ +<HTML><HEAD> +<TITLE>DPANS94</TITLE> +<link disabled rel="stylesheet" href="mpexc6.css"> +<style>@import url(mpexc6.css);</style> +</head> + +<BODY> +<table width=100%> +<tr> +<td align=left> +<a href=dpans17.htm><img src=left.gif + width=26 height=26 align=ALIGN border=0></a> +<a href=dpansa2.htm><img src=right.gif + width=26 height=26 align=ALIGN border=0></a> +</td> +<td align=right> +<a href=dpans.htm#toc><img src=up.gif + width=26 height=26 align=ALIGN border=0></a> +<a name=A.>Table of Contents</a> +</td> +</tr> +</table> +<p> +<hr size=4> + +<H1>A. Rationale (informative annex)</H1> + + +<hr> +<a name=A.1> +<H2>A.1 Introduction</H2> +</a> + +<hr> +<a name=A.1.1></A> +<H3>A.1.1 Purpose</H3> +</a> + + +<hr> +<a name=A.1.2> +<H3>A.1.2 Scope</H3> +</a> + +This Standard is more extensive than previous industry standards for the Forth +language. Several things made this necessary: + +<UL> +<LI>the desire to resolve conflicts between previous standards; +<LI>the need to eliminate semantic ambiguities and other inadequacies; +<LI>the requirement to standardize common practice, where possible +resolving divergences in a way that minimizes the cost of compliance; +<LI>the desire to standardize common system techniques, including those +germane to hardware. +</UL> +<P> + +The result of the effort to satisfy all of these objectives is a +Standard arranged so that the required word set remains small. Thus ANS +Forth can be provided for resource-constrained embedded systems. Words +beyond those in the required word set are organized into a number of +optional word sets and their extensions, enabling implementation of +tailored systems that are Standard. + +<P> + +When judging relative merits, the members of the X3J14 Technical +Committee were guided by the following goals (listed in alphabetic +order): + +<P> + +<DL> +<DT><B>Consistency</B> +<DD>The Standard provides a functionally complete +set of words +with minimal functional overlap. + +<DT><B>Cost of compliance</B> +<DD>This goal includes such issues as common +practice, how +much existing code would be broken by the proposed change, and the amount of +effort required to bring existing applications and systems into conformity +with the Standard. + +<DT><B>Efficiency</B> +<DD>Execution speed, memory compactness. + +<DT><B>Portability</B> +<DD>Words chosen for inclusion should be free of +system-dependent +features. + +<DT><B>Readability</B> +<DD>Forth definition names should clearly delineate +their +behavior. That behavior should have an apparent simplicity which supports +rapid understanding. Forth should be easily taught and support readily +maintained code. + +<DT><B>Utility</B> +<DD>Be judged to have sufficiently essential functionality +and frequency +of use to be deemed suitable for inclusion.</DL> + + +<P> + +<hr> +<a name=A.1.3> +<H3>A.1.3 Document organization</H3> +</a> + + +<hr> +<a name=A.1.3.1> +<H4>A.1.3.1 Word sets</H4> +</a> + +From the beginning, the X3J14 Technical Committee faced not only +conflicting ideas as to what <B>real</B> Forth is, but also conflicting +needs of the various groups within the Forth community. At one extreme +were those who pressed for a <B>bare</B> Forth. At the other extreme +were those who wanted a <B>fat</B> Forth. Many were somewhere in +between. All were convinced of the rightness of their own position and +of the wrongness of at least one of the two extremes. The committee's +composition reflected this full range of interests. + +<P> + +The approach we have taken is to define a +<a href=dpans6.htm#6.1>Core word set</a> +establishing a +greatest lower bound for required system functionality and to provide a +portfolio of optional word sets for special purposes. This simple +approach parallels the fundamental nature of Forth as an extensible +language, and thereby achieves a kind of meta-extensibility. + +<P> + +With this key, high-level compromise, regardless of the actual makeup of +the individual word sets, a firm and workable framework is established +for the long term. One may or may not agree that there should be a +<a href=dpans13.htm>Locals word set</a>, +or that the word +<a href=dpans6.htm#6.2.0945>COMPILE,</a> +belongs in the +<a href=dpans6.htm#6.2>Core Extensions word set</a>. +But at least there is a mechanism whereby such +things can be included in a logical and orderly manner. + +<P> + +Several implications of this scheme of optional word sets are +significant. + +<P> + +First, ANS Forth systems can continue to be implemented on a greater +range of hardware than could be claimed by almost any other single +language. Since only the +Core word set is required, very limited +hardware will be able to accommodate an ANS Forth implementation. + +<P> + +Second, a greater degree of portability of applications, and of +programmers, is anticipated. The optional word sets standardize various +functions (e.g., floating point) that were widely implemented before, +but not with uniform definition names and methodologies, nor the same +levels of completeness. With such words now standardized in the +optional word sets, communications between programmers - verbally, via +magazine or journal articles, etc. - will leap to a new level of +facility, and the shareability of code and applications should rise +dramatically. + +<P> + +Third, ANS Forth systems may be designed to offer the user the power to +selectively, even dynamically, include or exclude one or more of the +optional word sets or portions thereof. Also, lower-priced products may +be offered for the user who needs the Core word set and not much more. +Thus, virtually unlimited flexibility will be available to the user. + +<P> + +But these advantages have a price. The burden is on the user to decide +what capabilities are desired, and to select product offerings +accordingly, especially when portability of applications is important. +We do not expect most implementors to attempt to provide all word sets, +but rather to select those most valuable to their intended markets. + +<P> + +The basic requirement is that if the implementor claims to have a +particular optional word set the entire required portion of that word +set must be available. If the implementor wishes to offer only part of +an optional word set, it is acceptable to say, for example, <B>This +system offers portions of the [named] word set</B>, particularly if the +selected or excluded words are itemized clearly. + +<P> + +Each optional word set will probably appeal to a particular +constituency. For example, scientists performing complex mathematical +analysis may place a higher value on the +<a href=dpans12.htm>Floating-Point word set</a> +than +programmers developing simple embedded controllers. As in the case of +the core extensions, we expect implementors to offer those word sets +they expect will be valued by their users. + +<P> + +Optional word sets may be offered in source form or otherwise factored +so that the user may selectively load them. + +<P> + +The extensions to the optional word sets include words which are deemed +less essential to performing the primary activity supported by the word +set, though clearly relevant to it. As in the case of the Core +Extensions, implementors may selectively add itemized subsets of a word +set extension providing the labeling doesn't mislead the user into +thinking incorrectly that all words are present. + +<P> + +<hr> +<A href=dpans.htm#toc><IMG src="up.gif" ></A> Table of Contents +<BR> +<A href=dpansa2.htm><IMG src="right.gif" ></A> +Next Section +<P> +</BODY> +</HTML> diff --git a/mwmouse/sources/AnsForth/DPANSA10.HTM b/mwmouse/sources/AnsForth/DPANSA10.HTM @@ -0,0 +1,359 @@ +<HTML><HEAD> +<TITLE>DPANS94</TITLE> +<link disabled rel="stylesheet" href="mpexc6.css"> +<style>@import url(mpexc6.css);</style> +</head> + +<BODY> +<table width=100%> +<tr> +<td align=left> +<a href=dpansa9.htm><img src=left.gif + width=26 height=26 align=ALIGN border=0></a> +<a href=dpansa11.htm><img src=right.gif + width=26 height=26 align=ALIGN border=0></a> +</td> +<td align=right> +<a href=dpans.htm#toc><img src=up.gif + width=26 height=26 align=ALIGN border=0></a> +<a name=A.10>Table of Contents</a> +</td> +</tr> +</table> +<p> +<hr size=4> + +<H2>A.<a href=dpans10.htm>10</a> +The optional Facility word set</H2> + + +<hr> +<a name=A.10.6> +<H3>A.<a href=dpans10.htm#10.6>10.6</a> +Glossary</H3> +</a> + +<hr> +<a name=A.10.6.1.0742> +A.<a href=dpans10.htm#10.6.1.0742>10.6.1.0742</a> +AT-XY +</a> +<P> + +Most implementors supply a method of positioning a cursor on a CRT +screen, but there is great variance in names and stack arguments. This +version is supported by at least one major vendor. + +<P> + +<hr> +<a name=A.10.6.1.1755> +A.<a href=dpans10.htm#10.6.1.1755>10.6.1.1755</a> +KEY? +</a> +<P> + +The Technical Committee has gone around several times on the stack +effects. Whatever is decided will violate somebody's practice and +penalize some machine. This way doesn't interfere with type-ahead on +some systems, while requiring the implementation of a single-character +buffer on machines where polling the keyboard inevitably results in the +destruction of the character. + +<P> + +Use of +<a href=dpans6.htm#6.1.1750>KEY</a> +or KEY? indicates that the application does not wish to +bother with non-character events, so they are discarded, in anticipation +of eventually receiving a valid character. Applications wishing to +handle non-character events must use +<a href=dpans10.htm#10.6.2.1305>EKEY</a> and +<a href=dpans10.htm#10.6.2.1307>EKEY?</a>. It is possible to +mix uses of KEY? / KEY and EKEY? / EKEY within a single application, but +the application must use KEY? and KEY only when it wishes to discard +non-character events until a valid character is received. + +<P> + +<hr> +<a name=A.10.6.2.1305> +A.<a href=dpans10.htm#10.6.2.1305>10.6.2.1305</a> +EKEY +</a> +<P> + +EKEY provides a standard word to access a system-dependent set of +<B>raw</B> keyboard events, including events corresponding to members of +the standard character set, events corresponding to other members of the +implementation-defined character set, and keystrokes that do not +correspond to members of the character set. + +<P> + +EKEY assumes no particular numerical correspondence between particular +event code values and the values representing standard characters. On +some systems, this may allow two separate keys that correspond to the +same standard character to be distinguished from one another. + +<P> + +In systems that combine both keyboard and mouse events into a single +<B>event stream</B>, the single number returned by EKEY may be +inadequate to represent the full range of input possibilities. In such +systems, a single <B>event record</B> may include a time stamp, the x,y +coordinates of the mouse position, the keyboard state, and the state of +the mouse buttons. In such systems, it might be appropriate for EKEY to +return the address of an <B>event record</B> from which the other +information could be extracted. + +<P> + +Also, consider a hypothetical Forth system running under MS-DOS on a +PC-compatible computer. Assume that the implementation-defined +character set is the <B>normal</B> 8-bit PC character set. In that +character set, the codes from 0 to 127 correspond to ASCII characters. +The codes from 128 to 255 represent characters from various non-English +languages, mathematical symbols, and some graphical symbols used for +line drawing. In addition to those characters, the keyboard can +generate various other <B>scan codes</B>, representing such +non-character events as arrow keys and function keys. + +<P> + +There may be multiple keys, with different scan codes, corresponding to +the same standard character. For example, the character representing +the number <B>1</B> often appears both in the row of number keys above +the alphabetic keys, and also in the separate numeric keypad. + +<P> + +When a program asks the MS-DOS operating system for a keyboard event, it +receives either a single non-zero byte, representing a character, or a +zero byte followed by a <B>scan code</B> byte, representing a +non-character keyboard event (e.g., a function key). + +<P> + +EKEY represents each keyboard event as a single number, rather than as a +sequence of numbers. For the system described above, the following +would be a reasonable implementation of EKEY and related words: + +<P> + +The +<a href=dpans3.htm#3.2.6>MAX-CHAR</a> +environmental query would return 255. + +<P> + +Assume the existence of a word DOS-KEY ( -- char ) which executes the +MS-DOS <B>Direct STDIN Input</B> system call (Interrupt 21h, Function +07h) and a word DOS-KEY? ( -- flag) which executes the MS-DOS <B>Check +STDIN Status</B> system call (Interrupt 21h, Function 0Bh). + +<PRE> +: EKEY? ( -- flag ) DOS-KEY? 0&lt;&gt; ; + +: EKEY ( -- u ) DOS-KEY ?DUP 0= IF DOS-KEY 256 + THEN ; + +: EKEY>CHAR ( u -- u false | char true ) + DUP 255 &gt; IF ( u ) + DUP 259 = IF \ 259 is Ctrl-@ (ASCII NUL) + DROP 0 TRUE EXIT \ so replace with character + THEN FALSE EXIT \ otherwise extended character + THEN TRUE \ normal extended ASCII char. +; + +VARIABLE PENDING-CHAR -1 PENDING-CHAR ! + +: KEY? ( -- flag ) + PENDING-CHAR @ 0&lt; IF + BEGIN EKEY? WHILE + EKEY EKEY&gt;CHAR IF + PENDING-CHAR ! TRUE EXIT + THEN DROP + REPEAT FALSE EXIT + THEN TRUE +; + +: KEY ( -- char ) + PENDING-CHAR @ 0&lt; IF + BEGIN EKEY EKEY>CHAR 0= + WHILE + DROP + REPEAT EXIT + THEN PENDING-CHAR @ -1 PENDING-CHAR ! +; +</PRE> + +<P> + +This is a full-featured implementation, providing the application +program with an easy way to either handle non-character events (with +EKEY), or to ignore them and to only consider <B>real</B> characters +(with +<a href=dpans6.htm#6.1.1750>KEY</a>). + +<P> + +Note that EKEY maps scan codes from 0 to 255 into numbers from 256 to +511. EKEY maps the number 259, representing the keyboard combination +Ctrl-Shift-@, to the character whose numerical value is 0 (ASCII NUL). +Many ASCII keyboards generate ASCII NUL for Ctrl-Shift-@, so we use that +key combination for ASCII NUL (which is otherwise unavailable from +MS-DOS, because the zero byte signifies that another scan-code byte +follows). + +<P> + +One consequence of using the <B>Direct STDIN Input</B> system call +(function 7) instead of the <B>STDIN Input</B> system call (function 8) +is that the normal DOS <B>Ctrl-C interrupt</B> behavior is disabled when +the system is waiting for input (Ctrl-C would still cause an interrupt +while characters are being output). On the other hand, if the <B>STDIN +Input</B> system call (function 8) were used to implement EKEY, Ctrl-C +interrupts would be enabled, but Ctrl-Shift-@ would also cause an +interrupt, because the operating system would treat the second byte of +the 0,3 sequence as a Ctrl-C, even though the 3 is really a scan code +and not a character. One <B>best of both worlds</B> solution is to use +function 8 for the first byte received by EKEY, and function 7 for the +scan code byte. For example: + +<PRE> +: EKEY ( -- u ) + DOS-KEY-FUNCTION-8 ?DUP 0= IF + DOS-KEY-FUNCTION-7 DUP 3 = IF + DROP 0 ELSE 256 + + THEN + THEN +; +</PRE> + +<P> + +Of course, if the Forth implementor chooses to pass Ctrl-C through to +the program, without using it for its usual interrupt function, then DOS +function 7 is appropriate in both cases (and some additional care must +be taken to prevent a typed-ahead Ctrl-C from interrupting the Forth +system during output operations). + +<P> + +A Forth system might also choose a simpler implementation of KEY, +without implementing EKEY, as follows: + +<PRE> +: KEY ( -- char ) DOS-KEY ; + +: KEY? ( -- flag ) DOS-KEY? 0&lt;&gt; ; +</PRE> + +<P> + +The disadvantages of the simpler version are: + +<P> + +a) An application program that uses KEY, expecting to receive only valid +characters, might receive a sequence of bytes (e.g., a zero byte +followed by a byte with the same numerical value as the letter <B>A</B>) +that appears to contain a valid character, even though the user pressed +a key (e.g., function key 4) that does not correspond to any valid +character. + +<P> + +b) An application program that wishes to handle non-character events +will have to execute KEY twice if it returns zero the first time. This +might appear to be a reasonable and easy thing to do. However, such +code is not portable to other systems that do not use a zero byte as an +<B>escape</B> code. Using the EKEY approach, the algorithm for handling +keyboard events can be the same for all systems; the system dependencies +can be reduced to a table or set of constants listing the +system-dependent key codes used to access particular application +functions. Without EKEY, the algorithm, not just the table, is likely +to be system dependent. + +<P> + +Another approach to EKEY on MS-DOS is to use the BIOS <B>Read Keyboard +Status</B> function (Interrupt 16h, Function 01h) or the related +<B>Check Keyboard</B> function (Interrupt 16h, Function 11h). The +advantage of this function is that it allows the program to distinguish +between different keys that correspond to the same character (e.g. the +two <B>1</B> keys). The disadvantage is that the BIOS keyboard +functions read only the keyboard. They cannot be <B>redirected</B> to +another <B>standard input</B> source, as can the DOS STDIN Input +functions. + +<P> + + +<hr> +<a name=A.10.6.2.1306> +A.<a href=dpans10.htm#10.6.2.1306>10.6.2.1306</a> +EKEY&gt;CHAR +</a> +<P> + +EKEY&gt;CHAR translates a keyboard event into the corresponding member of +the character set, if such a correspondence exists for that event. + +<P> + +It is possible that several different keyboard events may correspond to +the same character, and other keyboard events may correspond to no +character. + +<P> + +<hr> +<a name=A.10.6.2.1325> +A.<a href=dpans10.htm#10.6.2.1325>10.6.2.1325</a> +EMIT? +</a> +<P> + +An indefinite delay is a device related condition, such as printer +off-line, that requires operator intervention before the device will +accept new data. + +<P> + +<hr> +<a name=A.10.6.2.1905> +A.<a href=dpans10.htm#10.6.2.1905>10.6.2.1905</a> +MS +</a> +<P> + +Although their frequencies vary, every system has a clock. Since many +programs need to time intervals, this word is offered. Use of +milliseconds as an internal unit of time is a practical <B>least common +denominator</B> external unit. It is assumed implementors will use +<B>clock ticks</B> (whatever size they are) as an internal unit and +convert as appropriate. + +<P> + +<hr> +<a name=A.10.6.2.2292> +A.<a href=dpans10.htm#10.6.2.2292>10.6.2.2292</a> +TIME&DATE +</a> +<P> + +Most systems have a real-time clock/calendar. This word gives portable +access to it. + +<P> + +<hr> +<a href=dpans.htm#toc><IMG src="up.gif" ></A> Table of Contents +<BR> +<a href=dpansa11.htm><IMG src="right.gif" ></A> +Next Section +<P> +</BODY> +</HTML> diff --git a/mwmouse/sources/AnsForth/DPANSA11.HTM b/mwmouse/sources/AnsForth/DPANSA11.HTM @@ -0,0 +1,306 @@ +<HTML><HEAD> +<TITLE>DPANS94</TITLE> +<link disabled rel="stylesheet" href="mpexc6.css"> +<style>@import url(mpexc6.css);</style> +</head> + +<BODY> +<table width=100%> +<tr> +<td align=left> +<a href=dpansa10.htm><img src=left.gif + width=26 height=26 align=ALIGN border=0></a> +<a href=dpansa12.htm><img src=right.gif + width=26 height=26 align=ALIGN border=0></a> +</td> +<td align=right> +<a href=dpans.htm#toc><img src=up.gif + width=26 height=26 align=ALIGN border=0></a> +<a name=A.11>Table of Contents</a> +</td> +</tr> +</table> +<p> +<hr size=4> + +<H3>A.11 The optional File-Access word set</H3> + +Many Forth systems support access to a host file system, and many of +these support interpretation of Forth from source text files. The +Forth-83 Standard did not address host OS files. Nevertheless, a degree +of similarity exists among modern implementations. + +<P> + +For example, files must be opened and closed, created and deleted. +Forth file-system implementations differ mostly in the treatment and +disposition of the exception codes, and in the format of the +file-identification strings. The underlying mechanism for creating +file-control blocks might or might not be visible. We have chosen to +keep it invisible. + +<P> + +Files must also be read and written. Text files, if supported, must be +read and written one line at a time. Interpretation of text files +implies that they are somehow integrated into the text interpreter input +mechanism. These and other requirements have shaped the file-access +extensions word set. + +<P> + +Most of the existing implementations studied use simple English words +for common host file functions: OPEN, CLOSE, READ, etc. Although we +would have preferred to do likewise, there were so many minor variations +in implementation of these words that adopting any particular meaning +would have broken much existing code. We have used names with a suffix +-FILE for most of these words. We encourage implementors to conform +their single-word primitives to the ANS behaviors, and hope that if this +is done on a widespread basis we can adopt better definition names in a +future standard. + +<P> + +Specific rationales +for members of this word set follow. + +<P> + +<hr> +<a name=A.11.3> +<H3>A.11.3 Additional usage requirements</H3> +</a> + +<hr> +<a name=A.11.3.2> +<H4>A.11.3.2 Blocks in files</H4> +</a> + +Many systems reuse file identifiers; when a file is closed, a +subsequently opened file may be given the same identifier. If the +original file has blocks still in block buffers, these will be +incorrectly associated with the newly opened file with disastrous +results. The block buffer system must be flushed to avoid this. + +<P> + +<hr> +<a name=A.11.6> +<H3>A.11.6 Glossary</H3> +</a> + + +<hr> +<a name=A.11.6.1.0765> +A.11.6.1.0765 BIN +</a> +<P> + +Some operating systems require that files be opened in a different mode +to access their contents as an unstructured stream of binary data rather +than as a sequence of lines. + +<P> + +The arguments to +<a href=dpans11.htm#11.6.1.2080>READ-FILE</a> and +<a href=dpans11.htm#11.6.1.2480>WRITE-FILE</a> are +arrays of character +storage elements, each element consisting of at least 8 bits. The +Technical Committee intends that, in BIN mode, the contents of these +storage elements can be written to a file and later read back without +alteration. The Technical Committee has declined to address issues +regarding the impact of <B>wide</B> characters on the File and Block +word sets. + +<P> + +<hr> +<a name=A.11.6.1.1010> +A.11.6.1.1010 CREATE-FILE +</a> +<P> + +Typical use: + +<PRE> +: X .. S" TEST.FTH" R/W CREATE-FILE ABORT" CREATE-FILE FAILED" ... ; +</PRE> +<P> + +<hr> +<a name=A.11.6.1.1717> +A.11.6.1.1717 INCLUDE-FILE +</a> +<P> + +Here are two implementation alternatives for saving the input source +specification in the presence of text file input: + +<P> + +1) Save the file position (as returned by +<a href=dpans11.htm#11.6.1.1520>FILE-POSITION</a>) of the beginning +of the line being interpreted. To restore the input source specification, +seek to that position and re-read the line into the input buffer. + +<P> + +2) Allocate a separate line buffer for each active text input file, using +that buffer as the input buffer. This method avoids the <B>seek and reread</B> +step, and allows the use of <B>pseudo-files</B> such as pipes and other +sequential-access-only communication channels. + +<P> + +<hr> +<a name=A.11.6.1.1718> +A.11.6.1.1718 INCLUDED +</a> +<P> + +Typical use: <code>... S" filename" INCLUDED ...</code> + +<P> + +<hr> +<a name=A.11.6.1.1970> +A.11.6.1.1970 OPEN-FILE +</a> +<P> + +Typical use: + +<PRE> +: X .. S" TEST.FTH" R/W OPEN-FILE ABORT" OPEN-FILE FAILED" ... ; +</PRE> +<P> + +<hr> +<a name=A.11.6.1.2080> +A.11.6.1.2080 READ-FILE +</a> +<P> + +A typical sequential +file-processing algorithm might look like: + +<PRE> + BEGIN ( ) + ... READ-FILE THROW ( length ) + ?DUP WHILE ( length ) + ... ( ) + REPEAT ( ) +</PRE> + +<P> + +In this example, +<a href=dpans9.htm#9.6.1.2275>THROW</a> +is used to handle (unexpected) exception +conditions, which are reported as non-zero values of the ior return +value from READ-FILE. End-of-file is reported as a zero value of the +<B>length</B> return value. + +<P> + +<hr> +<a name=A.11.6.1.2090> +A.11.6.1.2090 READ-LINE +</a> +<P> + +Implementations are allowed to store the line terminator in the memory +buffer in order to allow the use of line reading functions provided by +host operating systems, some of which store the terminator. Without +this provision, a temporary buffer might be needed. The two-character +limitation is sufficient for the vast majority of existing operating +systems. Implementations on host operating systems whose line +terminator sequence is longer than two characters may have to take +special action to prevent the storage of more than two terminator +characters. + +<P> + +Standard Programs may not depend on the presence of any such terminator +sequence in the buffer. + +<P> + +A typical line-oriented sequential file-processing algorithm might look +like: + +<PRE> + BEGIN ( ) + ... READ-LINE THROW ( length not-eof-flag ) + WHILE ( length ) + ... ( ) + REPEAT DROP ( ) +</PRE> + +<P> + +In this example, +<a href=dpans9.htm#9.6.1.2275>THROW</a> +is used to handle (unexpected) I/O exception condition, +which are reported as non-zero values of the <B>ior</B> return value from +READ-LINE. + +<P> + +READ-LINE needs a separate end-of-file flag because empty (zero-length) lines +are a routine occurrence, so a zero-length line cannot be used to signify +end-of-file. + +<P> + +<hr> +<a name=A.11.6.1.2165> +A.11.6.1.2165 S" +</a> +<P> + +Typical use: <code>... S" ccc" ...</code> + +<P> + +The interpretation semantics for S" are intended to provide a simple +mechanism for entering a string in the interpretation state. Since an +implementation may choose to provide only one buffer for interpreted +strings, an interpreted string is subject to being overwritten by the +next execution of S" in interpretation state. It is intended that no +standard words other than S" should in themselves cause the interpreted +string to be overwritten. However, since words such as +<a href=dpans6.htm#6.1.1360>EVALUATE</a>, +<a href=dpans7.htm#7.6.1.1790>LOAD</a>, +<a href=dpans11.htm#11.6.1.1717>INCLUDE-FILE</a> and +<a href=dpans11.htm#11.6.1.1718>INCLUDED</a> +can result in the interpretation of arbitrary +text, possibly including instances of S", the interpreted string may be +invalidated by some uses of these words. + +<P> + +When the possibility of overwriting a string can arise, it is prudent to +copy the string to a <B>safe</B> buffer allocated by the application. + +<P> + +Programs wishing to parse in the fashion of S" are advised to use +<a href=dpans6.htm#6.2.2008>PARSE</a> +or +<a href=dpans6.htm#6.1.2450>WORD</a> +<a href=dpans6.htm#6.1.0980>COUNT</a> +instead of S", preventing the overwriting of the +interpreted string buffer. + +<P> + +<hr> +<A href=dpans.htm#toc><IMG src="up.gif" ></A> Table of Contents +<BR> +<A href=dpansa12.htm><IMG src="right.gif" ></A> +Next Section +<P> +</BODY> +</HTML> diff --git a/mwmouse/sources/AnsForth/DPANSA12.HTM b/mwmouse/sources/AnsForth/DPANSA12.HTM @@ -0,0 +1,384 @@ +<HTML><HEAD> +<TITLE>DPANS94</TITLE> +<link disabled rel="stylesheet" href="mpexc6.css"> +<style>@import url(mpexc6.css);</style> +</head> + +<BODY> +<table width=100%> +<tr> +<td align=left> +<a href=dpansa11.htm><img src=left.gif + width=26 height=26 align=ALIGN border=0></a> +<a href=dpansa13.htm><img src=right.gif + width=26 height=26 align=ALIGN border=0></a> +</td> +<td align=right> +<a href=dpans.htm#toc><img src=up.gif + width=26 height=26 align=ALIGN border=0></a> +<a name=A.12>Table of Contents</a> +</td> +</tr> +</table> +<p> +<hr size=4> + +<H2>A.12 The optional Floating-Point word set</H2> + +The Technical Committee has considered many proposals dealing with the +inclusion and makeup of the Floating-Point Word Sets in ANS Forth. +Although it has been argued that ANS Forth should not address +floating-point arithmetic and numerous Forth applications do not need +floating-point, there are a growing number of important Forth +applications from spreadsheets to scientific computations that require +the use of floating-point arithmetic. Initially the Technical Committee +adopted proposals that made the Forth Vendors Group Floating-Point +Standard, first published in 1984, the framework for inclusion of +Floating-Point in ANS Forth. There is substantial common practice and +experience with the Forth Vendors Group Floating-Point Standard. +Subsequently the Technical Committee adopted proposals that placed the +basic floating-point arithmetic, stack and support words in the +Floating-Point word set and the floating-point transcendental functions +in the Floating-Point Extensions word set. The Technical Committee also +adopted proposals that: + +<UL> +<LI>changed names for clarity and consistency; e.g., REALS to +<a href=dpans12.htm#12.6.1.1556>FLOATS</a>, and +REAL+ to +<a href=dpans12.htm#12.6.1.1555>FLOAT+</a> . +<LI>removed words; e.g., FPICK . +<LI>added words for completeness and increased functionality; e.g., +<a href=dpans12.htm#12.6.2.1616>FSINCOS</a>, +<a href=dpans12.htm#12.6.2.1640>F~</a>, +<a href=dpans12.htm#12.6.2.1204>DF@</a>, +<a href=dpans12.htm#12.6.2.1203>DF!</a>, +<a href=dpans12.htm#12.6.2.2203>SF@</a> and +<a href=dpans12.htm#12.6.2.2202>SF!</a> +</UL> +<P> + +Several issues concerning the Floating-Point word set were resolved by +consensus in the Technical Committee: + +<P> + +Floating-point stack: By default the floating-point stack is separate +from the data and return stacks; however, an implementation may keep +floating-point numbers on the data stack. A program can determine +whether floating-point numbers are kept on the data stack by passing the +string +<a href=dpans12.htm#12.3.4>FLOATING-STACK</a> to +<a href=dpans6.htm#6.1.1345>ENVIRONMENT?</a> +It is the experience of several +members of the Technical Committee that with proper coding practices it +is possible to write floating-point code that will run identically on +systems with a separate floating-point stack and with floating-point +numbers kept on the data stack. + +<P> + +Floating-point input: The current base must be +<a href=dpans6.htm#6.1.1170>DECIMAL</a>. Floating-point +input is not allowed in an arbitrary base. All floating-point numbers +to be interpreted by an ANS Forth system must contain the exponent +indicator <B>E</B> (see +<a href=dpans12.htm#12.3.7>12.3.7</a> Text interpreter input number +conversion). +Consensus in the Technical Committee deemed this form of +floating-point input to be in more common use than the alternative that +would have a floating-point input mode that would allow numbers with +embedded decimal points to be treated as floating-point numbers. + +<P> + +Floating-point representation: Although the format and precision of the +significand and the format and range of the exponent of a floating-point +number are implementation defined in ANS Forth, the Floating-Point +Extensions word set contains the words DF@, SF@, DF!, and SF! for +fetching and storing double- and single-precision IEEE +floating-point-format numbers to memory. The IEEE floating-point format +is commonly used by numeric math co-processors and for exchange of +floating-point data between programs and systems. + +<P> + + +<hr> +<a name=A.12.3> +<H3>A.12.3 Additional usage requirements</H3> +</a> + + + +<hr> +<a name=A.12.3.5> +<H4>A.12.3.5 Address alignment</H4> +</a> + +In defining custom floating-point data structures, be aware that +<a href=dpans6.htm#6.1.1000>CREATE</a> +doesn't necessarily leave the data space pointer aligned for various +floating-point data types. Programs may comply with the requirement for +the various kinds of floating-point alignment by specifying the +appropriate alignment both at compile-time and execution time. For +example: + +<PRE> +: FCONSTANT ( F: r -- ) + CREATE FALIGN HERE 1 FLOATS ALLOT F! + DOES> ( F: -- r ) FALIGNED F@ ; +</PRE> + +<P> + + +<hr> +<a name=A.12.3.7> +<H4>A.12.3.7 Text interpreter input number conversion</H4> +</a> + +The Technical Committee has more than once received the suggestion that +the text interpreter in Standard Forth systems should treat numbers that +have an embedded decimal point, but no exponent, as floating-point +numbers rather than double cell numbers. This suggestion, although it +has merit, has always been voted down because it would break too much +existing code; many existing implementations put the full digit string +on the stack as a double number and use other means to inform the +application of the location of the decimal point. + +<p> +<code> +See: +<a href=a0004.htm>RFI 0004</a> Number Conversion +</code> +<P> + +<hr> +<a name=A.12.6> +<H3>A.12.6 Glossary</H3> +</a> + + + +<hr> +<a name=A.12.6.1.0558>A.12.6.1.0558 &gt;FLOAT</A> +<P> + +&gt;FLOAT enables programs to read floating-point data in legible ASCII +format. It accepts a much broader syntax than does the text interpreter +since the latter defines rules for composing source programs whereas +&gt;FLOAT defines rules for accepting data. &gt;FLOAT is defined as broadly +as is feasible to permit input of data from ANS Forth systems as well as +other widely used standard programming environments. + +<P> + +This is a synthesis of common FORTRAN practice. Embedded spaces are +explicitly forbidden in much scientific usage, as are other field +separators such as comma or slash. + +<P> + +While &gt;FLOAT is not required to treat a string of blanks as zero, this +behavior is strongly encouraged, since a future version of ANS Forth may +include such a requirement. + +<P> + +<hr> +<a name=A.12.6.1.1427>A.12.6.1.1427 F.</A> +<P> + +For example, 1E3 F. displays 1000. . + +<P> + +<hr> +<a name=A.12.6.1.1492>A.12.6.1.1492 FCONSTANT</A> +<P> + +Typical use: <code>r FCONSTANT name</code> + +<P> + +<hr> +<a name=A.12.6.1.1552>A.12.6.1.1552 FLITERAL</A> +<P> + +Typical use: <code>: X ... [ ... ( r ) ] FLITERAL ... ;</code> + +<P> + +<hr> +<a name=A.12.6.1.1630>A.12.6.1.1630 FVARIABLE</A> +<P> + +Typical use: <code>FVARIABLE name</code> + +<P> + +<hr> +<a name=A.12.6.1.2143>A.12.6.1.2143 REPRESENT</A> +<P> + +This word provides a primitive for floating-point display. Some +floating-point formats, including those specified by IEEE-754, allow +representations of numbers outside of an implementation-defined range. +These include plus and minus infinities, denormalized numbers, and +others. In these cases we expect that REPRESENT will usually be +implemented to return appropriate character strings, such as +<B>+infinity</B> or <B>nan</B>, possibly truncated. + +<P> + +<hr> +<a name=A.12.6.2.1489>A.12.6.2.1489 FATAN2</A> +<P> + +<a href=dpans12.htm#12.6.2.1616>FSINCOS</a> +and +<a href=dpans12.htm#12.6.2.1489>FATAN2</a> +are a complementary pair of operators which convert +angles to 2-vectors and vice-versa. They are essential to most +geometric and physical applications since they correctly and +unambiguously handle this conversion in all cases except null vectors, +even when the tangent of the angle would be infinite. + +<P> + +FSINCOS returns a Cartesian unit vector in the direction of the given +angle, measured counter-clockwise from the positive X-axis. The order +of results on the stack, namely y underneath x, permits the 2-vector +data type to be additionally viewed and used as a ratio approximating +the tangent of the angle. Thus the phrase FSINCOS +<a href=dpans12.htm#12.6.1.1430>F/</a> is functionally +equivalent to +<a href=dpans12.htm#12.6.2.1625>FTAN</a>, +but is useful over only a limited and discontinuous +range of angles, whereas FSINCOS and FATAN2 are useful for all angles. +This ordering has been found convenient for nearly two decades, and has +the added benefit of being easy to remember. A corollary to this +observation is that vectors in general should appear on the stack in +this order. + +<P> + +The argument order for FATAN2 is the same, converting a vector in the +conventional representation to a scalar angle. Thus, for all angles, +FSINCOS FATAN2 is an identity within the accuracy of the arithmetic and +the argument range of FSINCOS. Note that while FSINCOS always returns a +valid unit vector, FATAN2 will accept any non-null vector. An ambiguous +condition exists if the vector argument to FATAN2 has zero magnitude. + +<P> + +<hr> +<a name=A.12.6.2.1516>A.12.6.2.1516 FEXPM1</A> +<P> + +This function allows accurate computation when its arguments are close +to zero, and provides a useful base for the standard exponential +functions. Hyperbolic functions such as cosh(x) can be efficiently and +accurately implemented by using FEXPM1; accuracy is lost in this +function for small values of x if the word +<a href=dpans12.htm#12.6.2.1515>FEXP</a> is used. + +<P> + +An important application of this word is in finance; say a loan is +repaid at 15% per year; what is the daily rate? On a computer with +single precision (six decimal digit) accuracy: + +<P> + +1. Using +<a href=dpans12.htm#12.6.2.1553>FLN</a> and FEXP: +<P> + +FLN of 1.15 = 0.139762, +divide by 365 = 3.82910E-4, +form the exponent using +FEXP = 1.00038, and +subtract one (1) and convert to percentage = 0.038%. + +<P> + +Thus we only have two digit accuracy. +<P> + + +2. Using +<a href=dpans12.htm#12.6.2.1554>FLNP1</a> and FEXPM1: + +<P> + +FLNP1 of 0.15 = 0.139762, (this is the same value as in the first example, +although with the argument closer to zero it may not be so) +divide by 365 = 3.82910E-4, +form the exponent and subtract one (1) using FEXPM1 = 3.82983E-4, +and convert to percentage = 0.0382983%. + +<P> + +This is full six digit accuracy. +<P> + + +The presence of this word allows the hyperbolic functions to be computed with +usable accuracy. For example, the hyperbolic sine can be defined as: + +<PRE> +: FSINH ( r1 -- r2 ) + FEXPM1 FDUP FDUP 1.0E0 F+ F/ F+ 2.0E0 F/ ; +</PRE> + +<P> + +<hr> +<a name=A.12.6.2.1554>A.12.6.2.1554</a> FLNP1 +<P> + +This function allows accurate compilation when its arguments are close +to zero, and provides a useful base for the standard logarithmic +functions. For example, +<a href=dpans12.htm#12.6.2.1553>FLN</a> can be implemented as: + + +<PRE> + : FLN 1.0E0 F- FLNP1 ; +</PRE> +<P> +<code> +See: +<a href=dpansa12.htm#A.12.6.2.1516>A.12.6.2.1516 FEXPM1</a> +</code> +<P> + +<hr> +<a name=A.12.6.2.1616>A.12.6.2.1616</a> FSINCOS +<P> +<code> +See: +<a href=dpansa12.htm#A.12.6.2.1489>A.12.6.2.1489 FATAN2</a> +</code> +<P> + +<hr> +<a name=A.12.6.2.1640>A.12.6.2.1640</a> F~ +<P> + +This provides the three types of <B>floating point equality</B> in +common use -- <B>close</B> in absolute terms, exact equality as +represented, and <B>relatively close</B>. + +<P> + +<hr> +<a href=dpans.htm#toc><IMG src="up.gif" ></A> Table of Contents +<BR> +<a href=dpansa13.htm><IMG src="right.gif" ></A> +Next Section +<P> +</BODY> +</HTML> diff --git a/mwmouse/sources/AnsForth/DPANSA13.HTM b/mwmouse/sources/AnsForth/DPANSA13.HTM @@ -0,0 +1,394 @@ +<HTML><HEAD> +<TITLE>DPANS94</TITLE> +<link disabled rel="stylesheet" href="mpexc6.css"> +<style>@import url(mpexc6.css);</style> +</head> + +<BODY> +<table width=100%> +<tr> +<td align=left> +<a href=dpansa12.htm><img src=left.gif + width=26 height=26 align=ALIGN border=0></a> +<a href=dpansa14.htm><img src=right.gif + width=26 height=26 align=ALIGN border=0></a> +</td> +<td align=right> +<a href=dpans.htm#toc><img src=up.gif + width=26 height=26 align=ALIGN border=0></a> +<a name=A.13>Table of Contents</a> +</td> +</tr> +</table> +<p> +<hr size=4> + +<H2>A.13 The optional Locals word set</H2> + +The Technical Committee has had a problem with locals. It has been +argued forcefully that ANS Forth should say nothing about locals since: + +<UL> +<LI>there is no clear accepted practice in this area; +<LI>not all Forth programmers use them or even know what they are; and +<LI>few implementations use the same syntax, let alone the same broad +usage rules and general approaches. +</UL> +<P> + +It has also been argued, it would seem equally forcefully, that the lack +of any standard approach to locals is precisely the reason for this lack +of accepted practice since locals are at best non-trivial to implement +in a portable and useful way. It has been further argued that users who +have elected to become dependent on locals tend to be locked into a +single vendor and have little motivation to join the group that it is +hoped will <B>broadly accept</B> ANS Forth unless the Standard addresses +their problems. + +<P> + +Since the Technical Committee has been unable to reach a strong +consensus on either leaving locals out or on adopting any particular +vendor's syntax, it has sought some way to deal with an issue that it +has been unable to simply dismiss. Realizing that no single mechanism +or syntax can simultaneously meet the desires expressed in all the +locals proposals that have been received, it has simplified the problem +statement to be to define a locals mechanism that: + +<UL> +<LI>is independent of any particular syntax; +<LI>is user extensible; +<LI>enables use of arbitrary identifiers, local in scope to a single +definition; +<LI>supports the fundamental cell size data types of Forth; and +<LI>works consistently, especially with respect to re-entrancy and +recursion. +</UL> +<P> + +This appears to the Technical Committee to be what most of those who +actively use locals are trying to achieve with them, and it is at +present the consensus of the Technical Committee that if ANS Forth has +anything to say on the subject this is an acceptable thing for it to +say. + +<P> + +This approach, defining +<a href=dpans13.htm#13.6.1.0086>(LOCAL)</a>, +is proposed as one that can be used +with a small amount of user coding to implement some, but not all, of +the locals schemes in use. The following coding examples illustrate how +it can be used to implement two syntaxes. + +<p> + +The syntax defined by this Standard and used in the systems of +Creative Solutions, Inc.: + +<P> + + +<PRE> + : LOCALS| ( "name...name |" -- ) + BEGIN + BL WORD COUNT OVER C@ + [CHAR] | - OVER 1 - OR + WHILE + (LOCAL) + REPEAT 2DROP 0 0 (LOCAL) + ; + IMMEDIATE + + : EXAMPLE ( n -- n n**2 n**3 ) + LOCALS| N | N DUP N * DUP N * ; +</PRE> + +A proposed syntax: ( LOCAL name ) with additional usage rules: + +<P> + + +<PRE> + : LOCAL ( "name" -- ) BL WORD COUNT (LOCAL) ; IMMEDIATE + + : END-LOCALS ( -- ) 0 0 (LOCAL) ; IMMEDIATE + + : EXAMPLE ( n -- n n**2 n**3 ) + LOCAL N END-LOCALS N DUP N * DUP N * ; +</PRE> + +<P> + +Other syntaxes can be implemented, although some will admittedly require +considerably greater effort or in some cases program conversion. Yet +other approaches to locals are completely incompatible due to gross +differences in usage rules and in some cases even scope identifiers. +For example, the complete local scheme in use at Johns Hopkins had +elaborate semantics that cannot be duplicated in terms of this model. + +<P> + +To reinforce the intent of section +<a href=dpans13.htm>13</a>, here are two examples of actual use of +locals. The first illustrates correct usage: + +<P> + +a) + +<PRE> +: { ( "name ... }" - ) + BEGIN BL WORD COUNT + OVER C@ [CHAR] } + - OVER 1 - OR + WHILE + (LOCAL) + REPEAT 2DROP 0 0 (LOCAL) +; IMMEDIATE +</PRE> + +<P> + +b) + +<PRE> +: JOE ( a b c -- n ) + >R 2* R> 2DUP + 0 + { ANS 2B+C C 2B A } + 2 0 DO 1 ANS + I + TO ANS ANS . CR LOOP + ANS . 2B+C . C . 2B . A . CR + ANS +; +</PRE> +c) +<PRE> +100 300 10 JOE . +</PRE> + +<P> + +The word { at a) defines a local declaration syntax that surrounds the +list of locals with braces. It doesn't do anything fancy, such as +reordering locals or providing initial values for some of them, so +locals are initialized from the stack in the default order. The +definition of JOE at b) illustrates a use of this syntax. Note that +work is performed at execution time in that definition before locals are +declared. It's OK to use the return stack as long as whatever is placed +there is removed before the declarations begin. + +<P> + +Note that before declaring locals, B is doubled, a subexpression (2B+C) +is computed, and an initial value (zero) for ANS is provided. After +locals have been declared, JOE proceeds to use them. Note that locals +may be accessed and updated within do-loops. The effect of interpreting +line c) is to display the following values: + +<P> + +1 (ANS the first time through the loop), +<BR> +3 (ANS the second time), +<BR> +3 (ANS), 610 (2B+C), 10 (C), 600 (2B), 100 (A), +<BR> +and 3 (ANS left on the stack by JOE). +<BR> + +<P> + +The names of the locals vanish after JOE has been compiled. The storage and +meaning of locals appear when JOE's locals are declared and vanish as JOE +returns to its caller at ; (semicolon). + +<P> + +A second set of examples illustrates various things that break the rules. We +assume that the definitions of LOCAL and END-LOCALS above are present, along +with { from the preceding example. +<P> + +d) +<PRE> +: ZERO 0 POSTPONE LITERAL POSTPONE LOCAL ; IMMEDIATE +</PRE> +<P> + +e) +<PRE> +: MOE ( a b ) + ZERO TEMP LOCAL B 1+ LOCAL A+ ZERO ANSWER ; +</PRE> + +<P> + +f) +<PRE> +: BOB ( a b c d ) { D C } { B A } ; +</PRE> +<P> + +Here are two definitions with various violations of rule +<a href=dpans13.htm#13.3.3.2>13.3.3.2</a>a. In +e) the declaration of TEMP is legal and creates a local whose initial +value is zero. It's OK because the executable code that ZERO generates +precedes the first use of (LOCAL) in the definition. However, the 1+ +preceding the declaration of A+ is illegal. Likewise the use of ZERO to +define ANSWER is illegal because it generates executable code between +uses of (LOCAL). Finally, MOE terminates illegally (no END-LOCALS). +BOB in f) violates the rule against declaring two sets of locals. +<P> + +g) +<PRE> +: ANN ( a b -- b ) DUP >R DUP IF { B A } THEN R> ; +</PRE> +<P> + +h) +<PRE> +: JANE ( a b -- n ) { B A } A B + >R A B - R> / ; +</PRE> +<P> + +ANN in g) violates two rules. The IF ... THEN around the declaration +of its locals violates +<a href=dpans13.htm#13.3.3.2>13.3.3.2</a>b, +and the copy of B left on the return +stack before declaring locals violates +<a href=dpans13.htm#13.3.3.2>13.3.3.2</a>c. JANE in h) violates +<a href=dpans13.htm#13.3.3.2>13.3.3.2</a>d +by accessing locals after placing the sum of A and B on the +return stack without first removing that sum. + +<P> + +i) +<PRE> +: CHRIS ( a b) + { B A } ['] A EXECUTE 5 ['] B >BODY ! + [ ' A ] LITERAL LEE ; +</PRE> + +<P> + +CHRIS in i) illustrates three violations of +<a href=dpans13.htm#13.3.3.2>13.3.3.2</a>e. The attempt to +<a href=dpans6.htm#6.1.1370>EXECUTE</a> +the local called A is inconsistent with some implementations. +The store into B via +<a href=dpans6.htm#6.1.0550>>BODY</a> +is likely to cause tragic results with many +implementations; moreover, if locals are in registers they can't be +addressed as memory no matter what is written. + +<P> + +The third violation, in which an execution token for a definition's +local is passed as an argument to the word LEE, would, if allowed, have +the unpleasant implication that LEE could EXECUTE the token and obtain a +value for A from the particular execution of CHRIS that called LEE this +time. + +<P> + +<hr> +<a name=A.13.3> +<H3>A.13.3 Additional usage requirements</H3> +</a> + +Rule +<a href=dpans13.htm#13.3.3.2>13.3.3.2</a>d +could be relaxed without affecting the integrity of the +rest of this structure. +<a href=dpans13.htm#13.3.3.2>13.3.3.2</a>c could not be. + +<P> + +<a href=dpans13.htm#13.3.3.2>13.3.3.2</a>b +forbids the use of the data stack for local storage because no +usage rules have been articulated for programmer users in such a case. +Of course, if the data stack is somehow employed in such a way that +there are no usage rules, then the locals are invisible to the +programmer, are logically not on the stack, and the implementation +conforms. + +<P> + +The minimum required number of locals can (and should) be adjusted to +minimize the cost of compliance for existing users of locals. + +<P> + +Access to previously declared local variables is prohibited by Section +<a href=dpans13.htm#13.3.3.2>13.3.3.2</a>d +until any data placed onto the return stack by the application +has been removed, due to the possible use of the return stack for +storage of locals. + +<P> + +Authorization for a Standard Program to manipulate the return stack +(e.g., via +<a href=dpans6.htm#6.1.0580>&gt;R</a> +<a href=dpans6.htm#6.1.2060>R&gt;</a>) +while local variables are active overly constrains +implementation possibilities. The consensus of users of locals was that +Local facilities represent an effective functional replacement for +return stack manipulation, and restriction of standard usage to only one +method was reasonable. + +<P> + +Access to Locals within +<a href=dpans6.htm#6.1.1240>DO</a>..<a href=dpans6.htm#6.1.1800>LOOP</a>s +is expressly permitted as an +additional requirement of conforming systems by Section +<a href=dpans13.htm#13.3.3.2>13.3.3.2</a>g. +Although words, such as +<a href=dpans13.htm#13.6.1.0086>(LOCALS)</a>, +written by a System Implementor, may +require inside knowledge of the internal structure of the return stack, +such knowledge is not required of a user of compliant Forth systems. + +<P> + +<hr> +<a name=A.13.6> +<H3>A.13.6 Glossary</H3> +</a> + + + +<hr> +<a name=A.13.6.1.2295>A.13.6.1.2295 TO</A> +<P> + +Typical use: <code>x TO name</code> + +<P> +<code> +See: <a href=dpansa6.htm#A.6.2.2295>A.6.2.2295 TO</A> +</code> +<P> + +<hr> +<a name=A.13.6.2.1795>A.13.6.2.1795 LOCALS|</A> +<P> + +A possible implementation of this word and an example of usage is given in +<a href=dpansa13.htm#A.13>A.13</a>, +above. It is intended as an example only; any implementation yielding +the described semantics is acceptable. + +<P> + +<hr> +<a href=dpans.htm#toc><IMG src="up.gif" ></A> Table of Contents +<BR> +<a href=dpansa14.htm><IMG src="right.gif" ></A> +Next Section +<P> +</BODY> +</HTML> diff --git a/mwmouse/sources/AnsForth/DPANSA14.HTM b/mwmouse/sources/AnsForth/DPANSA14.HTM @@ -0,0 +1,46 @@ +<HTML><HEAD> +<TITLE>DPANS94</TITLE> +<link disabled rel="stylesheet" href="mpexc6.css"> +<style>@import url(mpexc6.css);</style> +</head> + +<BODY> +<table width=100%> +<tr> +<td align=left> +<a href=dpansa13.htm><img src=left.gif + width=26 height=26 align=ALIGN border=0></a> +<a href=dpansa15.htm><img src=right.gif + width=26 height=26 align=ALIGN border=0></a> +</td> +<td align=right> +<a href=dpans.htm#toc><img src=up.gif + width=26 height=26 align=ALIGN border=0></a> +<a name=A.14>Table of Contents</a> +</td> +</tr> +</table> +<p> +<hr size=4> + +<H2>A.14 The optional Memory-Allocation word set</H2> + +The Memory-Allocation word set provides a means for acquiring memory +other than the contiguous data space that is allocated by +<a href=dpans6.htm#6.1.0710>ALLOT</a>. In +many operating system environments it is inappropriate for a process to +pre-allocate large amounts of contiguous memory (as would be necessary +for the use of ALLOT). The Memory-Allocation word set can acquire +memory from the system at any time, without knowing in advance the +address of the memory that will be acquired. + +<P> + +<hr> +<A href=dpans.htm#toc><IMG src="up.gif" ></A> Table of Contents +<BR> +<A href=dpansa15.htm><IMG src="right.gif" ></A> +Next Section +<P> +</BODY> +</HTML> diff --git a/mwmouse/sources/AnsForth/DPANSA15.HTM b/mwmouse/sources/AnsForth/DPANSA15.HTM @@ -0,0 +1,281 @@ +<HTML><HEAD> +<TITLE>DPANS94</TITLE> +<link disabled rel="stylesheet" href="mpexc6.css"> +<style>@import url(mpexc6.css);</style> +</head> + +<BODY> +<table width=100%> +<tr> +<td align=left> +<a href=dpansa14.htm><img src=left.gif + width=26 height=26 align=ALIGN border=0></a> +<a href=dpansa16.htm><img src=right.gif + width=26 height=26 align=ALIGN border=0></a> +</td> +<td align=right> +<a href=dpans.htm#toc><img src=up.gif + width=26 height=26 align=ALIGN border=0></a> +<a name=A.15>Table of Contents</a> +</td> +</tr> +</table> +<p> +<hr size=4> + +<H2>A.15 The optional Programming-Tools word set</H2> + +These words have been in widespread common use since the earliest Forth +systems. + +<P> + +Although there are environmental dependencies intrinsic to programs +using an assembler, virtually all Forth systems provide such a +capability. Insofar as many Forth programs are intended for real-time +applications and are intrinsically non-portable for this reason, the +Technical Committee believes that providing a standard window into +assemblers is a useful contribution to Forth programmers. + +<P> + +Similarly, the programming aids +<a href=dpans15.htm#15.6.1.1280>DUMP</a>, +etc., are valuable tools even +though their specific formats will differ between CPUs and Forth +implementations. These words are primarily intended for use by the +programmer, and are rarely invoked in programs. + +<P> + +One of the original aims of Forth was to erase the boundary between +<B>user</B> and <B>programmer</B> - to give all possible power to anyone +who had occasion to use a computer. Nothing in the above labeling or +remarks should be construed to mean that this goal has been abandoned. + +<P> + +<hr> +<A name=A.15.6> +<H3>A.15.6 Glossary</H3> +</a> + + + +<hr> +<A name=A.15.6.1.0220>A.15.6.1.0220 .S</A> +<P> + +.S is a debugging convenience found on almost all Forth systems. It is +universally mentioned in Forth texts. + +<P> + +<hr> +<A name=A.15.6.1.2194>A.15.6.1.2194 SEE</A> +<P> + +SEE acts as an on-line form of documentation of words, allowing modification +of words by decompiling and regenerating with appropriate changes. + +<P> + +<hr> +<A name=A.15.6.1.2465>A.15.6.1.2465 WORDS</A> +<P> + +WORDS is a debugging convenience found on almost all Forth systems. It is +universally referred to in Forth texts. + +<P> + +<hr> +<A name=A.15.6.2.0470>A.15.6.2.0470 ;CODE</A> +<P> + +Typical use: <code>: namex ... &lt;create&gt; ... ;CODE ...</code> + +<P> + +where namex is a defining word, and &lt;create&gt; is +<a href=dpans6.htm#6.1.1000>CREATE</a> or any user +defined +word that calls CREATE. + +<P> + +<hr> +<A name=A.15.6.2.0930>A.15.6.2.0930 CODE</A> +<P> + +Some Forth systems implement the assembly function by adding an +<a href=dpans15.htm#15.6.2.0740>ASSEMBLER</a> +word list to the search order, using the text interpreter to +parse a postfix assembly language with lexical characteristics similar +to Forth source code. Typically, in such systems, assembly ends when a +word END-CODE is interpreted. + +<P> + +<hr> +<A name=A.15.6.2.1015>A.15.6.2.1015 CS-PICK</A> +<P> + +The intent is to reiterate a dest on the control-flow stack so that it can be +resolved more than once. For example: + +<PRE> +\ Conditionally transfer control to beginning of loop +\ This is similar in spirit to C's "continue" statement. + +: ?REPEAT ( dest -- dest ) \ Compilation + ( flag -- ) \ Execution + 0 CS-PICK POSTPONE UNTIL +; IMMEDIATE + +: XX ( -- ) \ Example use of ?REPEAT + BEGIN + ... + flag ?REPEAT ( Go back to BEGIN if flag is false ) + ... + flag ?REPEAT ( Go back to BEGIN if flag is false ) + ... + flag UNTIL ( Go back to BEGIN if flag is false ) + ... +; +</PRE> + +<P> + +<hr> +<A name=A.15.6.2.1020>A.15.6.2.1020 CS-ROLL</A> +<P> + +The intent is to modify the order in which the origs and dests on the +control-flow stack are to be resolved by subsequent control-flow words. For +example, +<a href=dpans6.htm#6.1.2430>WHILE</a> could be implemented in terms of +<a href=dpans6.htm#6.1.1700>IF</a> and CS-ROLL, as follows: + +<PRE> +: WHILE ( dest -- orig dest ) POSTPONE IF 1 CS-ROLL ; IMMEDIATE +</PRE> +<P> + +<hr> +<A name=A.15.6.2.1580>A.15.6.2.1580 FORGET</A> +<P> + +Typical use: <code>... FORGET name ...</code> + +<P> + +FORGET assumes that all the information needed to restore the dictionary to +its previous state is inferable somehow from the forgotten word. While this +may be true in simple linear dictionary models, it is difficult to implement +in other Forth systems; e.g., those with multiple address spaces. For +example, if Forth is embedded in ROM, how does FORGET know how much RAM to +recover when an array is forgotten? A general and preferred solution is +provided by +<a href=dpans6.htm#6.2.1850>MARKER</a>. + +<P> + +<hr> +<A name=A.15.6.2.2531>A.15.6.2.2531 [ELSE]</A> +<P> + +Typical use: <code>... flag [IF] ... [ELSE] ... [THEN] ...</code> + +<P> + +<hr> +<A name=A.15.6.2.2532>A.15.6.2.2532 [IF]</A> +<P> + +Typical use: <code>... flag [IF] ... [ELSE] ... [THEN] ...</code> + +<P> + +<hr> +<A name=A.15.6.2.2533>A.15.6.2.2533 [THEN]</A> +<P> + +Typical use: <code>... flag [IF] ... [ELSE] ... [THEN] ...</code> + +<P> + +Software that runs in several system environments often contains some +source code that is environmentally dependent. Conditional compilation - the +selective inclusion or exclusion of portions of the source code at +compile time - is one technique that is often used to assist in the +maintenance of such source code. +<P> + +Conditional compilation is sometimes done with <B>smart comments</B> - +definitions that either skip or do not skip the remainder of the line +based on some test. For example: + +<PRE> +\ If 16-Bit? contains TRUE, lines preceded by 16BIT\ +\ will be skipped. Otherwise, they will not be skipped. + +VARIABLE 16-BIT? + +: 16BIT\ ( -- ) 16-BIT? @ IF POSTPONE \ THEN ; IMMEDIATE +</PRE> + +<P> + +This technique works on a line by line basis, and is good for short, +isolated variant code sequences. + +<P> + +More complicated conditional compilation problems suggest a nestable +method that can encompass more than one source line at a time. The +words included in the ANS Forth optional Programming tools extensions +word set are useful for this purpose. The implementation given below +works with any input source (keyboard, +<a href=dpans6.htm#6.1.1360>EVALUATE</a>, +<a href=dpans7.htm#7.6.1.0800>BLOCK</a>, or text file). + +<PRE> +: [ELSE] ( -- ) + 1 BEGIN \ level + BEGIN + BL WORD COUNT DUP WHILE \ level adr len + 2DUP S" [IF]" COMPARE 0= + IF \ level adr len + 2DROP 1+ \ level' + ELSE \ level adr len + 2DUP S" [ELSE]" + COMPARE 0= IF \ level adr len + 2DROP 1- DUP IF 1+ THEN \ level' + ELSE \ level adr len + S" [THEN]" COMPARE 0= IF \ level + 1- \ level' + THEN + THEN + THEN ?DUP 0= IF EXIT THEN \ level' + REPEAT 2DROP \ level + REFILL 0= UNTIL \ level + DROP +; IMMEDIATE + +: [IF] ( flag -- ) +0= IF POSTPONE [ELSE] THEN ; IMMEDIATE + +: [THEN] ( -- ) ; IMMEDIATE +</PRE> + +<P> + +<hr> +<A href=dpans.htm#toc><IMG src="up.gif" ></A> Table of Contents +<BR> +<A href=dpansa16.htm><IMG src="right.gif" ></A> +Next Section +<P> +</BODY> +</HTML> diff --git a/mwmouse/sources/AnsForth/DPANSA16.HTM b/mwmouse/sources/AnsForth/DPANSA16.HTM @@ -0,0 +1,289 @@ +<HTML><HEAD> +<TITLE>DPANS94</TITLE> +<link disabled rel="stylesheet" href="mpexc6.css"> +<style>@import url(mpexc6.css);</style> +</head> + +<BODY> +<table width=100%> +<tr> +<td align=left> +<a href=dpansa15.htm><img src=left.gif + width=26 height=26 align=ALIGN border=0></a> +<a href=dpansa17.htm><img src=right.gif + width=26 height=26 align=ALIGN border=0></a> +</td> +<td align=right> +<a href=dpans.htm#toc><img src=up.gif + width=26 height=26 align=ALIGN border=0></a> +<a name=A.16>Table of Contents</a> +</td> +</tr> +</table> +<p> +<hr size=4> + + +<H2>A.16 The optional Search-Order word set</H2> + +Search-order specification and control mechanisms vary widely. The +FIG-Forth, Forth-79, polyFORTH, and Forth-83 vocabulary and search order +mechanisms are all mutually incompatible. The complete list of +incompatible mechanisms, in use or proposed, is much longer. The +<a href=dpans16.htm#16.6.2.0715>ALSO</a>/<a href=dpans16.htm#16.6.2.1965>ONLY</a> +scheme described in a Forth-83 Experimental Proposal has +substantial community support. However, many consider it to be +fundamentally flawed, and oppose it vigorously. + +<P> + +Recognizing this variation, this Standard specifies a new +<B>primitive</B> set of tools from which various schemes may be +constructed. This primitive search-order word set is intended to be a +portable <B>construction set</B> from which search-order words may be +built, rather than a user interface. ALSO/ONLY or the various +<B>vocabulary</B> schemes supported by the major Forth vendors can be +defined in terms of the primitive search-order word set. + +<P> + +The encoding for word list identifiers wid might be a small-integer +index into an array of word-list definition records, the data-space +address of such a record, a user-area offset, the execution token of a +Forth-83 style sealed vocabulary, the link-field address of the first +definition in a word list, or anything else. It is entirely up to the +system implementor. + +<P> + +In some systems the interpretation of numeric literals is controlled by +including <B>pseudo word lists</B> that recognize numbers at the end of +the search order. This technique is accommodated by the <B>default +search order</B> behavior of +<a href=dpans16.htm#16.6.1.2197>SET-ORDER</a> +when given an argument of -1. In +a system using the traditional implementation of ALSO/ONLY , the minimum +search order would be equivalent to the word ONLY. + +<P> + +There has never been a portable way to restore a saved search order. +F83 (not Forth-83) introduced the word +<a href=dpans16.htm#16.6.2.2037>PREVIOUS</a>, which almost made it +possible to <B>unload</B> the search order by repeatedly executing the +phrase <b><code>CONTEXT @ PREVIOUS</code></b>. +The search order could be <B>reloaded</B> by +repeating +<b><code>ALSO CONTEXT !</code></b>. +Unfortunately there was no portable way to +determine how many word lists were in the search order. + +<P> + +ANS Forth has removed the word CONTEXT because in many systems its +contents refer to more than one word list, compounding portability +problems. + +<P> + +Note that : +(<a href=dpans6.htm#6.1.0450>colon</a>) +no longer affects the search order. The previous +behavior, where the compilation word list replaces the first word list +of the search order, can be emulated with the following redefinition of +: (colon). + +<PRE> +: : GET-ORDER SWAP DROP GET-CURRENT SWAP SET-ORDER : ; +</PRE> +<P> + + + +<hr> +<A name=A.16.2> +<H3>A.16.2 Additional terms</H3> +</a> + +<DL> +<DT><b>search order</b> +<DD>Note that the use of the term <B>list</B> does not necessarily imply +implementation as a linked list.</DL> + +<P> + + +<hr> +<A name=A.16.3.3> +<H4>A.16.3.3 Finding definition names</H4> +</a> + +In other words, the following is not guaranteed to work: + +<PRE> +: FOO ... [ ... SET-CURRENT ] ... RECURSE ... ; IMMEDIATE +</PRE> + +<a href=dpans6.htm#6.1.2120>RECURSE</a>, +; (<a href=dpans6.htm#6.1.0460>semicolon</a>), and +<a href=dpans6.htm#6.1.1710>IMMEDIATE</a> +may or may not need information stored +in the compilation word list. + +<P> + + +<hr> +<A name=A.16.6> +<H3>A.16.6 Glossary</H3> +</a> + + + +<hr> +<A name=A.16.6.1.2192>A.16.6.1.2192 SEARCH-WORDLIST</A> +<P> + +The string argument to SEARCH-WORDLIST is represented by c-addr u, +rather than by just c-addr as with +<a href=dpans6.htm#6.1.1550>FIND</a>. +The committee wishes to +establish c-addr u as the preferred representation of a string on the +stack, and has adopted that representation for all new functions that +accept string arguments. While this decision may cause the +implementation of SEARCH-WORDLIST to be somewhat more difficult in +existing systems, the committee feels that the additional difficulty is +minor. + +<P> + +When SEARCH-WORDLIST fails to find the word, it does not return the +string, as does FIND. This is in accordance with the general principle +that Forth words consume their arguments. + +<P> + +<hr> +<A name=A.16.6.2.0715>A.16.6.2.0715 ALSO</A> +<P> + +Here is an implementation of +ALSO/<a href=dpans16.htm#16.6.2.1965>ONLY</a> +in terms of the primitive +search-order word set. + + +<PRE> +WORDLIST CONSTANT ROOT ROOT SET-CURRENT + +: DO-VOCABULARY ( -- ) \ Implementation factor + DOES> @ >R ( ) ( R: widnew ) + GET-ORDER SWAP DROP ( wid1 ... widn-1 n ) + R> SWAP SET-ORDER +; + +: DISCARD ( x1 .. xu u - ) \ Implementation factor + 0 ?DO DROP LOOP \ DROP u+1 stack items +; + +CREATE FORTH FORTH-WORDLIST , DO-VOCABULARY + +: VOCABULARY ( name -- ) WORDLIST CREATE , DO-VOCABULARY ; + +: ALSO ( -- ) GET-ORDER OVER SWAP 1+ SET-ORDER ; + +: PREVIOUS ( -- ) GET-ORDER SWAP DROP 1- SET-ORDER ; + +: DEFINITIONS ( -- ) GET-ORDER OVER SET-CURRENT DISCARD ; + +: ONLY ( -- ) ROOT ROOT 2 SET-ORDER ; + +\ Forth-83 version; just removes ONLY +: SEAL ( -- ) GET-ORDER 1- SET-ORDER DROP ; + +\ F83 and F-PC version; leaves only CONTEXT +: SEAL ( -- ) GET-ORDER OVER 1 SET-ORDER DISCARD ; +</PRE> + +<P> + +The preceding definition of ONLY in terms of a <B>ROOT</B> word list +follows F83 usage, and assumes that the default search order just +includes ROOT and +<a href=dpans16.htm#16.6.2.1590>FORTH</a>. +A more portable definition of FORTH and ONLY, +without the assumptions, is: + +<PRE> +&lt;omit the ... WORDLIST CONSTANT ROOT ... line&gt; + +CREATE FORTH GET-ORDER OVER , DISCARD DO-VOCABULARY + +: ONLY ( -- ) -1 SET-ORDER ; +</PRE> + +<P> + +Here is a simple implementation of +<a href=dpans16.htm#16.6.1.1647>GET-ORDER</a> and +<a href=dpans16.htm#16.6.1.2197>SET-ORDER</a>, including a +corresponding definition of +<a href=dpans6.htm#6.1.1550>FIND</a>. The implementations of +<a href=dpans16.htm#16.6.1.2460>WORDLIST</a>, +<a href=dpans16.htm#16.6.1.2192>SEARCH-WORDLIST</a>, +<a href=dpans16.htm#16.6.1.1643>GET-CURRENT</a> and +<a href=dpans16.htm#16.6.1.2195>SET-CURRENT</a> +depend on system details +and are not given here. + +<PRE> +16 CONSTANT #VOCS + +VARIABLE #ORDER + +CREATE CONTEXT #VOCS CELLS ALLOT + +: GET-ORDER ( -- wid1 .. widn n ) + #ORDER @ 0 ?DO + #ORDER @ I - 1- CELLS CONTEXT + @ + LOOP + #ORDER @ +; + +: SET-ORDER ( wid1 .. widn n -- ) + DUP -1 = IF + DROP &lt;push system default word lists and n&gt; + THEN + DUP #ORDER ! + 0 ?DO I CELLS CONTEXT + ! LOOP +; + +: FIND ( c-addr -- c-addr 0 | w 1 | w -1 ) + 0 ( c-addr 0 ) + #ORDER @ 0 ?DO + OVER COUNT ( c-addr 0 c-addr' u ) + I CELLS CONTEXT + @ ( c-addr 0 c-addr' u wid) + SEARCH-WORDLIST ( c-addr 0; 0 | w 1 | w -1 ) + ?DUP IF ( c-addr 0; w 1 | w -1 ) + 2SWAP 2DROP LEAVE ( w 1 | w -1 ) + THEN ( c-addr 0 ) + LOOP ( c-addr 0 | w 1 | w -1 ) +; +</PRE> + +<P> + +In an implementation where the dictionary search mechanism uses a hash +table or lookup cache to reduce the search time, SET-ORDER might need to +reconstruct the hash table or flush the cache. + +<P> + +<hr> +<A href=dpans.htm#toc><IMG src="up.gif" ></A> Table of Contents +<BR> +<A href=dpansa17.htm><IMG src="right.gif" ></A> +Next Section +<P> +</BODY> +</HTML> diff --git a/mwmouse/sources/AnsForth/DPANSA17.HTM b/mwmouse/sources/AnsForth/DPANSA17.HTM @@ -0,0 +1,150 @@ +<HTML><HEAD> +<TITLE>DPANS94</TITLE> +<link disabled rel="stylesheet" href="mpexc6.css"> +<style>@import url(mpexc6.css);</style> +</head> + +<BODY> +<table width=100%> +<tr> +<td align=left> +<a href=dpansa16.htm><img src=left.gif + width=26 height=26 align=ALIGN border=0></a> +<a href=dpansb.htm><img src=right.gif + width=26 height=26 align=ALIGN border=0></a> +</td> +<td align=right> +<a href=dpans.htm#toc><img src=up.gif + width=26 height=26 align=ALIGN border=0></a> +<a name=A.17>Table of Contents</a> +</td> +</tr> +</table> +<p> +<hr size=4> + +<H2>A.17 The optional String word set</H2> + + + +<hr> +<A name=A.17.6> +<H3>A.17.6 Glossary</H3> +</a> + + + +<hr> +<A name=A.17.6.1.0245>A.17.6.1.0245 /STRING</A> +<P> + +/STRING is used to remove or add characters relative to the <B>left</B> +end of the character string. Positive values of n will exclude +characters from the string while negative values of n will include +characters to the left of the string. /STRING is a natural factor of +<a href=dpans6.htm#6.1.2450>WORD</a> +and commonly available. + +<P> + +<hr> +<A name=A.17.6.1.0910>A.17.6.1.0910 CMOVE</A> +<P> + +If c-addr2 lies within the source region (i.e., when c-addr2 is not less +than c-addr1 and c-addr2 is less than the quantity c-addr1 u +<a href=dpans6.htm#6.1.0898>CHARS</a> +), +memory propagation occurs. + +<P> + +Typical +use: Assume a character string at address 100: <B>ABCD</B>. Then after + + +<PRE> + 100 DUP CHAR+ 3 CMOVE +</PRE> + +<P> + +the string at address 100 is <B>AAAA</B>. + +<P> + +Rationale +for CMOVE and +<a href=dpans17.htm#17.6.1.0920>CMOVE&gt;</a> follows +<a href=dpans6.htm#6.1.1900>MOVE</a>. + +<P> + +<hr> +<A name=A.17.6.1.0920>A.17.6.1.0920 CMOVE&gt;</A> +<P> + +If c-addr1 lies within the destination region (i.e., when c-addr1 is +greater than or equal to c-addr2 and c-addr2 is less than the quantity +c-addr1 u +<a href=dpans6.htm#6.1.0898>CHARS</a> +), memory propagation occurs. + +<P> + +Typical use: Assume a character string at address 100: <B>ABCD</B>. +Then after + + +<PRE> + 100 DUP CHAR+ SWAP 3 CMOVE> +</PRE> + +<P> + +the string at address 100 is <B>DDDD</B>. + +<P> + +<hr> +<A name=A.17.6.1.0935>A.17.6.1.0935 COMPARE</A> +<P> + +Existing Forth systems perform string comparison operations using words that +differ in spelling, input and output arguments, and case sensitivity. One in +widespread use was chosen. + +<P> + +<hr> +<A name=A.17.6.1.2191>A.17.6.1.2191 SEARCH</A> +<P> + +Existing Forth systems perform string searching operations using words that +differ in spelling, input and output arguments, and case sensitivity. One in +widespread use was chosen. + +<P> + +<hr> +<A name=A.17.6.1.2212>A.17.6.1.2212 SLITERAL</A> +<P> + +The current functionality of +<a href=dpans6.htm#6.1.2165>6.1.2165</a> S" may be provided by the following +definition: + +<PRE> +: S" ( "ccc&lt;quote&gt;" -- ) + [CHAR] " PARSE POSTPONE SLITERAL ; IMMEDIATE + +</PRE> +<P> + + +<hr> +<A href=dpans.htm#toc><IMG src="up.gif" ></A> Table of Contents +<BR> +<A href=dpansb.htm><IMG src="right.gif" ></A> +Next Section +<P> +</BODY> +</HTML> diff --git a/mwmouse/sources/AnsForth/DPANSA2.HTM b/mwmouse/sources/AnsForth/DPANSA2.HTM @@ -0,0 +1,106 @@ +<HTML><HEAD> +<TITLE>DPANS94</TITLE> +<link disabled rel="stylesheet" href="mpexc6.css"> +<style>@import url(mpexc6.css);</style> +</head> + +<BODY> +<table width=100%> +<tr> +<td align=left> +<a href=dpansa1.htm><img src=left.gif + width=26 height=26 align=ALIGN border=0></a> +<a href=dpansa3.htm><img src=right.gif + width=26 height=26 align=ALIGN border=0></a> +</td> +<td align=right> +<a href=dpans.htm#toc><img src=up.gif + width=26 height=26 align=ALIGN border=0></a> +<a name=A.2>Table of Contents</a> +</td> +</tr> +</table> +<p> +<hr size=4> + + +<H2>A.2 Terms and notation</H2> + + +<hr> +<a name=A.2.1> +<H3>A.2.1 Definitions of terms</H3> +</a> + +<DL> +<DT><b>ambiguous condition</b> +<DD>The response of a Standard System to an ambiguous condition is left to +the discretion of the implementor. A Standard System need not +explicitly detect or report the occurrence of ambiguous conditions. +<p> +<DT><b>cross compiler</b> +<DD>Cross-compilers may be used to prepare a program for execution in an +embedded system, or may be used to generate Forth kernels either for the +same or a different run-time environment. +<p> +<DT><b>data field</b> +<DD>In earlier standards, data fields were known as <B>parameter fields</B>. +<P> + +On subroutine threaded Forth systems, everything is object code. There +are no traditional code or data fields. Only a word defined by +<a href=dpans6.htm#6.1.1000>CREATE</a> +or by a word that calls +CREATE has a data field. Only a data field +defined via CREATE can be manipulated portably. +<p> +<DT><b>word set</b> +<DD>This Standard recognizes that some functions, while useful in certain +application areas, are not sufficiently general to justify requiring +them in all Forth systems. Further, it is helpful to group Forth words +according to related functions. These issues are dealt with using the +concept of word sets. + +<P> + +The <B>Core</B> word set contains the essential body of words in a Forth +system. It is the only <B>required</B> word set. Other word sets +defined in this Standard are optional additions to make it possible to +provide Standard Systems with tailored levels of functionality.</DL> + +<P> + +<hr> +<a name=A.2.2> +<H3>A.2.2 Notation</H3> +</a> + + +<hr> +<a name=A.2.2.2> +<H4>A.2.2.2 Stack notation</H4> +</a> + +The use of -sys, orig, and dest data types in stack effect diagrams +conveys two pieces of information. First, it warns the reader that many +implementations use the data stack in unspecified ways for those +purposes, so that items underneath on either the control-flow or data +stacks are unavailable. Second, in cases where orig and dest are used, +explicit pairing rules are documented on the assumption that all systems +will implement that model so that its results are equivalent to +employment of some stack, and that in fact many implementations do use +the data stack for this purpose. However, nothing in this Standard +requires that implementations actually employ the data stack (or any +other) for this purpose so long as the implied behavior of the model is +maintained. + +<P> + +<hr> +<A href=dpans.htm#toc><IMG src="up.gif" ></A> Table of Contents +<BR> +<A href=dpansa3.htm><IMG src="right.gif" ></A> +Next Section +<P> +</BODY> +</HTML> diff --git a/mwmouse/sources/AnsForth/DPANSA3.HTM b/mwmouse/sources/AnsForth/DPANSA3.HTM @@ -0,0 +1,1436 @@ +<HTML><HEAD> +<TITLE>DPANS94</TITLE> +<link disabled rel="stylesheet" href="mpexc6.css"> +<style>@import url(mpexc6.css);</style> +</head> + +<BODY> +<table width=100%> +<tr> +<td align=left> +<a href=dpansa2.htm><img src=left.gif + width=26 height=26 align=ALIGN border=0></a> +<a href=dpansa4.htm><img src=right.gif + width=26 height=26 align=ALIGN border=0></a> +</td> +<td align=right> +<a href=dpans.htm#toc><img src=up.gif + width=26 height=26 align=ALIGN border=0></a> +<a name=A.3>Table of Contents</a> +</td> +</tr> +</table> +<p> +<hr size=4> + +<H1>A.3 Usage requirements</H1> + +Forth systems are unusually simple to develop, in comparison with +compilers for more conventional languages such as C. In addition to +Forth systems supported by vendors, public-domain implementations and +implementation guides have been widely available for nearly twenty +years, and a large number of individuals have developed their own Forth +systems. As a result, a variety of implementation approaches have +developed, each optimized for a particular platform or target market. + +<P> + +The X3J14 Technical Committee has endeavored to accommodate this +diversity by constraining implementors as little as possible, consistent +with a goal of defining a standard interface between an underlying Forth +System and an application program being developed on it. + +<P> + +Similarly, we will not undertake in this section to tell you how to +implement a Forth System, but rather will provide some guidance as to +what the minimum requirements are for systems that can properly claim +compliance with this Standard. + +<P> + +<hr> +<a name=A.3.1> +<H2>A.3.1 Data-types</H2> +</a> + +Most computers deal with arbitrary bit patterns. There is no way to +determine by inspection whether a cell contains an address or an +unsigned integer. The only meaning a datum possesses is the meaning +assigned by an application. + +<P> + +When data are operated upon, the meaning of the result depends on the +meaning assigned to the input values. Some combinations of input values +produce meaningless results: for instance, what meaning can be assigned +to the arithmetic sum of the ASCII representation of the character +<B>A</B> and a +<a href=dpans6.htm#6.2.2298>TRUE</a> +flag? The answer may be <B>no meaning</B>; or +alternatively, that operation might be the first step in producing a +checksum. Context is the determiner. + +<P> + +The discipline of circumscribing meaning which a program may assign to +various combinations of bit patterns is sometimes called data typing. +Many computer languages impose explicit data typing and have compilers +that prevent ill-defined operations. + +<P> + +Forth rarely explicitly imposes data-type restrictions. Still, data +types implicitly do exist, and discipline is required, particularly if +portability of programs is a goal. In Forth, it is incumbent upon the +programmer (rather than the compiler) to determine that data are +accurately typed. + +<P> + +This section attempts to offer guidance regarding de facto data typing +in Forth. + +<P> + +<hr> +<a name=A.3.1.2> +<H3>A.3.1.2 Character types</H3> +</a> + +The correct identification and proper manipulation of the character data +type is beyond the purview of Forth's enforcement of data type by means +of stack depth. Characters do not necessarily occupy the entire width +of their single stack entry with meaningful data. While the distinction +between signed and unsigned character is entirely absent from the formal +specification of Forth, the tendency in practice is to treat characters +as short positive integers when mathematical operations come into play. + +<P> + +<dl> +a) Standard Character Set + +<P> + +<dl> +1) The storage unit for the character data type +(<a href=dpans6.htm#6.1.0870>C@</a>, +<a href=dpans6.htm#6.1.0850>C!</a>, +<a href=dpans6.htm#6.1.1540>FILL</a>, etc.) must be +able to contain unsigned numbers from 0 through 255. + +<P> + +2) An implementation is not required to restrict character storage to +that range, but a Standard Program without environmental dependencies +cannot assume the ability to store numbers outside that range in a +<B>char</B> location. + +<P> + +3) The allowed number representations are two's-complement, +one's-complement, and signed-magnitude. Note that all of these number +systems agree on the representation of positive numbers. + +<P> + +4) Since a <B>char</B> can store small positive numbers and since the +character data type is a sub-range of the unsigned integer data type, C! +must store the n least-significant bits of a cell (8 <= n <= bits/cell). +Given the enumeration of allowed number representations and their known +encodings, +<B><code>TRUE xx C! xx C@</code></B> must leave a stack item with some +number of bits set, which will thus will be accepted as non-zero by +<a href=dpans6.htm#6.1.1700>IF</a>. + +<P> + +5) For the purposes of input +(<a href=dpans6.htm#6.1.1750>KEY</a>, +<a href=dpans6.htm#6.1.0695>ACCEPT</a>, +etc.) and output +(<a href=dpans6.htm#6.1.1320>EMIT</a>, +<a href=dpans6.htm#6.1.2310>TYPE</a>, +etc.), the encoding between numbers and human-readable symbols is +ISO646/IRV (ASCII) within the range from 32 to 126 (space to ~). EBCDIC +is out (most <B>EBCDIC</B> computer systems support ASCII too). Outside +that range, it is up to the implementation. The obvious implementation +choice is to use ASCII control characters for the range from 0 to 31, at +least for the <B>displayable</B> characters in that range (TAB, RETURN, +LINEFEED, FORMFEED). However, this is not as clear-cut as it may seem, +because of the variation between operating systems on the treatment of +those characters. For example, some systems TAB to 4 character +boundaries, others to 8 character boundaries, and others to preset tab +stops. Some systems perform an automatic linefeed after a carriage +return, others perform an automatic carriage return after a linefeed, +and others do neither. + +<P> + +The codes from 128 to 255 may eventually be standardized, either +formally or informally, for use as international characters, such as the +letters with diacritical marks found in many European languages. One +such encoding is the 8-bit ISO Latin-1 character set. The computer +marketplace at large will eventually decide which encoding set of those +characters prevails. For Forth implementations running under an +operating system (the majority of those running on standard platforms +these days), most Forth implementors will probably choose to do whatever +the system does, without performing any remapping within the domain of +the Forth system itself. + +<P> + +6) A Standard Program can depend on the ability to receive any character +in the range 32 ... 126 through KEY, and similarly to display the same +set of characters with EMIT. If a program must be able to receive or +display any particular character outside that range, it can declare an +environmental dependency on the ability to receive or display that +character. + +<P> + +7) A Standard Program cannot use control characters in definition names. +However, a Standard System is not required to enforce this prohibition. +Thus, existing systems that currently allow control characters in words +names from +<a href=dpans7.htm#7.6.1.0790>BLOCK</a> +source may continue to allow them, and programs running +on those systems will continue to work. In text file source, the +parsing action with space as a delimiter (e.g., +<a href=dpans6.htm#6.1.0770>BL</a> +<a href=dpans6.htm#6.1.2450>WORD</a>) treats control +characters the same as spaces. This effectively implies that you cannot +use control characters in definition names from text-file source, since +the text interpreter will treat the control characters as delimiters. +Note that this <B>control-character folding</B> applies only when space +is the delimiter, thus the phrase +<code><B>CHAR ) WORD</B></code> may collect a +string containing control characters. +</dl> +<P> + +b) Storage and retrieval +<P> + +<dl> +Characters are transferred from the data stack to memory by C! and from +memory to the data stack by C@. A number of lower-significance bits +equivalent to the implementation-dependent width of a character are +transferred from a popped data stack entry to an address by the action +of C! without affecting any bits which may comprise the +higher-significance portion of the cell at the destination address; +however, the action of C@ clears all higher-significance bits of the +data stack entry which it pushes that are beyond the +implementation-dependent width of a character (which may include +implementation-defined display information in the higher-significance +bits). The programmer should keep in mind that operating upon arbitrary +stack entries with words intended for the character data type may result +in truncation of such data. +</dl> +<P> + +c) Manipulation on the stack +<P> + +<dl> +In addition to C@ and C!, characters are moved to, from and upon the +data stack by the following words: + +<P> + +<code> +<a href=dpans6.htm#6.1.0580>&gt;R</a> +<a href=dpans6.htm#6.1.0630>?DUP</a> +<a href=dpans6.htm#6.1.1260>DROP</a> +<a href=dpans6.htm#6.1.1290>DUP</a> +<a href=dpans6.htm#6.1.1990>OVER</a> +<a href=dpans6.htm#6.2.2030>PICK</a> +<a href=dpans6.htm#6.1.2060>R&gt;</a> +<a href=dpans6.htm#6.1.2070>R@</a> +<a href=dpans6.htm#6.2.2150>ROLL</a> +<a href=dpans6.htm#6.1.2160>ROT</a> +<a href=dpans6.htm#6.1.2260>SWAP</a> +</code> +</dl> +<P> + +d) Additional operations +<P> + +<dl> +The following mathematical operators are valid for character data: + +<P> + +<code> +<a href=dpans6.htm#6.1.0120>+</a> +<a href=dpans6.htm#6.1.0160>-</a> +<a href=dpans6.htm#6.1.0090>*</a> +<a href=dpans6.htm#6.1.0230>/</a> +<a href=dpans6.htm#6.1.0240>/MOD</a> +<a href=dpans6.htm#6.1.1890>MOD</a> +</code> +<P> + +The following comparison and bitwise operators may be valid for +characters, keeping in mind that display information cached in the most +significant bits of characters in an implementation-defined fashion may +have to be masked or otherwise dealt with: + +<P> + +<code> +<a href=dpans6.htm#6.1.0720>AND</a> +<a href=dpans6.htm#6.1.1980>OR</a> +<a href=dpans6.htm#6.1.0540>&gt;</a> +<a href=dpans6.htm#6.1.0480>&lt;</a> +<a href=dpans6.htm#6.2.2350>U&gt;</a> +<a href=dpans6.htm#6.1.2340>U&lt;</a> +<a href=dpans6.htm#6.1.0530>=</a> +<a href=dpans6.htm#6.2.0500>&lt;&gt;</a> +<a href=dpans6.htm#6.1.0270>0=</a> +<a href=dpans6.htm#6.2.0260>0&lt;&gt;</a> +<a href=dpans6.htm#6.1.1870>MAX</a> +<a href=dpans6.htm#6.1.1880>MIN</a> +<a href=dpans6.htm#6.1.1805>LSHIFT</a> +<a href=dpans6.htm#6.1.2162>RSHIFT</a> +</code> + +</dl> +</dl> +<P> + + +<hr> +<a name=A.3.1.3> +<h3>A.3.1.3 Single-cell types</h3> +</a> +<P> + +A single-cell stack entry viewed without regard to typing is the +fundamental data type of Forth. All other data types are actually +represented by one or more single-cell stack entries. + +<P> + +<dl> +a) Storage and retrieval +<P> + + +<dl> +Single-cell data are transferred from the stack to memory by +<a href=dpans6.htm#6.1.0010>!</a>; from +memory to the stack by +<a href=dpans6.htm#6.1.0650>@</a>. +All bits are transferred in both directions +and no type checking of any sort is performed, nor does the Standard +System check that a memory address used by ! or @ is properly aligned or +properly sized to hold the datum thus transferred. +</dl> +<P> + +b) Manipulation on the stack +<P> + +<dl> +Here is a selection of the most important words which move single-cell +data to, from and upon the data stack: + +<P> + +<code> +! +@ +<a href=dpans6.htm#6.1.0580>&gt;R</a> +<a href=dpans6.htm#6.1.0630>?DUP</a> +<a href=dpans6.htm#6.1.1260>DROP</a> +<a href=dpans6.htm#6.1.1290>DUP</a> +<a href=dpans6.htm#6.1.1990>OVER</a> +<a href=dpans6.htm#6.2.2030>PICK</a> +<a href=dpans6.htm#6.1.2060>R&gt;</a> +<a href=dpans6.htm#6.1.2070>R@</a> +<a href=dpans6.htm#6.2.2150>ROLL</a> +<a href=dpans6.htm#6.1.2160>ROT</a> +<a href=dpans6.htm#6.1.2260>SWAP</a> +</code> +</dl> +<P> + +c) Comparison operators +<P> + +<dl> +The following comparison operators are universally valid for one or more +single cells: + +<P> + +<code> +<a href=dpans6.htm#6.1.0530>=</a> +<a href=dpans6.htm#6.2.0500>&lt;&gt;</a> +<a href=dpans6.htm#6.1.0270>0=</a> +<a href=dpans6.htm#6.2.0260>0&lt;&gt;</a> +</code> +<P> +</dl> +</dl> + +<hr> +<a name=A.3.1.3.1> +<H4>A.3.1.3.1 Flags</H4> +</a> + +A +<a href=dpans6.htm#6.2.1485>FALSE</a> +flag is a single-cell datum with all bits unset, and a +<a href=dpans6.htm#6.2.2298>TRUE</a> +flag +is a single-cell datum with all bits set. While Forth words which test +flags accept any non-null bit pattern as true, there exists the concept +of the well-formed flag. If an operation whose result is to be used as +a flag may produce any bit-mask other than TRUE or FALSE, the +recommended discipline is to convert the result to a well-formed flag by +means of the Forth word +<a href=dpans6.htm#6.2.0260>0&lt;&gt;</a> +so that the result of any subsequent logical +operations on the flag will be predictable. + +<P> + +In addition to the words which move, fetch and store single-cell items, +the following words are valid for operations on one or more flag data +residing on the data stack: + +<P> + +<code> +<a href=dpans6.htm#6.1.0720>AND</a> +<a href=dpans6.htm#6.1.1980>OR</a> +<a href=dpans6.htm#6.1.2490>XOR</a> +<a href=dpans6.htm#6.1.1720>INVERT</a> +</code> +<P> + +<hr> +<a name=A.3.1.3.2> +<h4>A.3.1.3.2 Integers</h4> +</a> +<p> + +Given the same number of bits, unsigned integers usually represent twice +the number of absolute values representable by signed integers. + +<P> + +A single-cell datum may be treated by a Standard Program as an unsigned +integer. Moving and storing such data is performed as for any +single-cell data. In addition, the following mathematical and +comparison operators are valid for single-cell unsigned integers: + +<P> + +<code> +<a href=dpans6.htm#6.1.2360>UM*</a> +<a href=dpans6.htm#6.1.2370>UM/MOD</a> +<a href=dpans6.htm#6.1.0120>+</a> +<a href=dpans6.htm#6.1.0130>+!</a> +<a href=dpans6.htm#6.1.0160>-</a> +<a href=dpans6.htm#6.1.0290>1+</a> +<a href=dpans6.htm#6.1.0300>1-</a> +<a href=dpans6.htm#6.1.0090>*</a> +<a href=dpans6.htm#6.1.2340>U&lt;</a> +<a href=dpans6.htm#6.2.2350>U&gt;</a> +</code> +<P> + + +<hr> +<a name=A.3.1.3.3> +<H4>A.3.1.3.3 Addresses</H4> +</a> + +An address is uniquely represented as a single cell unsigned number and can be +treated as such when being moved to, from, or upon the stack. Conversely, +each unsigned number represents a unique address (which is not necessarily an +address of accessible memory). This one-to-one relationship between addresses +and unsigned numbers forces an equivalence between address arithmetic and the +corresponding operations on unsigned numbers. + +<P> + +Several operators are provided specifically for address arithmetic: +<P> + +<code> +<a href=dpans6.htm#6.1.0897>CHAR+</a> +<a href=dpans6.htm#6.1.0898>CHARS</a> +<a href=dpans6.htm#6.1.0880>CELL+</a> +<a href=dpans6.htm#6.1.0890>CELLS</a> +</code> +<P> + +and, if the floating-point word set is present: +<P> + +<code> +<a href=dpans12.htm#12.6.1.1555>FLOAT+</a> +<a href=dpans12.htm#12.6.1.1556>FLOATS</a> +<a href=dpans12.htm#12.6.2.2207>SFLOAT+</a> +<a href=dpans12.htm#12.6.2.2208>SFLOATS</a> +<a href=dpans12.htm#12.6.2.1208>DFLOAT+</a> +<a href=dpans12.htm#12.6.2.1209>DFLOATS</a> +</code> +<P> + +A Standard Program may never assume a particular correspondence between +a Forth address and the physical address to which it is mapped. + +<P> + + +<hr> +<a name=A.3.1.3.4> +<H4>A.3.1.3.4 Counted strings</H4> +</a> + +The trend in ANS Forth is to move toward the consistent use of the +<B>c-addr u</B> representation of strings on the stack. The use of the +alternate <B>address of counted string</B> stack representation is +discouraged. The traditional Forth words +<a href=dpans6.htm#6.1.2450>WORD</a> and +<a href=dpans6.htm#6.1.1550>FIND</a> +continue to use +the <B>address of counted string</B> representation for historical +reasons. The new word +<a href=dpans6.htm#6.2.0855>C"</a> +, added as a porting aid for existing +programs, also uses the counted string representation. + +<P> + +Counted strings remain useful as a way to store strings in memory. This +use is not discouraged, but when references to such strings appear on +the stack, it is preferable to use the <B>c-addr u</B> representation. + +<P> + + +<hr> +<a name=A.3.1.3.5> +<H4>A.3.1.3.5 Execution tokens</H4> +</a> + +The association between an execution token and a definition is static. +Once made, it does not change with changes in the search order or +anything else. However it may not be unique, e.g., the phrases + +<PRE> + <b>' 1+</b> + and + + <b>' CHAR+</b> +</PRE> +might return the same value. + +<P> + + +<hr> +<a name=A.3.1.4> +<H3>A.3.1.4 Cell-pair types</H3> +</a> + +<dl> +a) Storage and retrieval +<P> + +<dl> +Two operators are provided to fetch and store cell pairs: + +<P> + +<code> +<a href=dpans6.htm#6.1.0350>2@</a> +<a href=dpans6.htm#6.1.0310>2!</a> +</code> +</dl> +<P> + +b) Manipulation on the stack +<P> + +<dl> +Additionally, these operators may be used to move cell pairs from, to +and upon the stack: + +<P> + +<code> +<a href=dpans6.htm#6.2.0340>2&gt;R</a> +<a href=dpans6.htm#6.1.0370>2DROP</a> +<a href=dpans6.htm#6.1.0380>2DUP</a> +<a href=dpans6.htm#6.1.0400>2OVER</a> +<a href=dpans6.htm#6.2.0415>2R&gt;</a> +<a href=dpans6.htm#6.1.0430>2SWAP</a> +<a href=dpans8.htm#8.6.2.0420>2ROT</a> +</code> +</dl> +<P> + +c) Comparison +<P> + +<dl> +The following comparison operations are universally valid for cell +pairs: + +<P> + +<code> +<a href=dpans8.htm#8.6.1.1120>D=</a> +<a href=dpans8.htm#8.6.1.1080>D0=</a> +</code> +</dl> +</dl> +<P> + + +<hr> +<a name=A.3.1.4.1> +<H4>A.3.1.4.1 Double-cell integers</H4> +</a> + +If a double-cell integer is to be treated as signed, the following +comparison and mathematical operations are valid: + +<P> + +<code> +<a href=dpans8.htm#8.6.1.1040>D+</a> +<a href=dpans8.htm#8.6.1.1050>D-</a> +<a href=dpans8.htm#8.6.1.1110>D&lt;</a> +<a href=dpans8.htm#8.6.1.1075>D0&lt;</a> +<a href=dpans8.htm#8.6.1.1160>DABS</a> +<a href=dpans8.htm#8.6.1.1210>DMAX</a> +<a href=dpans8.htm#8.6.1.1220>DMIN</a> +<a href=dpans8.htm#8.6.1.1230>DNEGATE</a> +<a href=dpans8.htm#8.6.1.1820>M*/</a> +<a href=dpans8.htm#8.6.1.1830>M+</a> +</code> +<P> + +If a double-cell integer is to be treated as unsigned, the following +comparison and mathematical operations are valid: + +<P> + +<code> +D+ +D- +<a href=dpans6.htm#6.1.2370>UM/MOD</a> +<a href=dpans8.htm#8.6.2.1270>DU&lt;</a> +</code> +<P> + + +<hr> +<a name=A.3.1.4.2> +<H4>A.3.1.4.2 Character strings</H4> +</a> + +See: +<a href=dpansa3.htm#A.3.1.3.4>A.3.1.3.4</a> Counted Strings +<P> + + +<hr> +<a name=A.3.2> +<H2>A.3.2 The implementation environment</H2> +</a> + + + +<hr> +<a name=A.3.2.1> +<H3>A.3.2.1 Numbers</H3> +</a> + +Traditionally, Forth has been implemented on two's-complement machines +where there is a one-to-one mapping of signed numbers to unsigned +numbers - any single cell item can be viewed either as a signed or +unsigned number. Indeed, the signed representation of any positive +number is identical to the equivalent unsigned representation. Further, +addresses are treated as unsigned numbers: there is no distinct pointer +type. Arithmetic ordering on two's complement machines allows + and - +to work on both signed and unsigned numbers. This arithmetic behavior +is deeply embedded in common Forth practice. As a consequence of these +behaviors, the likely ranges of signed and unsigned numbers for +implementations hosted on each of the permissible arithmetic +architectures is: + +<P> +<pre> + --------------------------------------------------------- + Arithmetic architecture signed numbers unsigned numbers + --------------------------------------------------------- + Two's complement -n-1 to n 0 to 2n+1 + One's complement -n to n 0 to n + Signed magnitude -n to n 0 to n + --------------------------------------------------------- +</pre> +<P> + +where n is the largest positive signed number. For all three +architectures, signed numbers in the 0 to n range are bitwise identical +to the corresponding unsigned number. Note that unsigned numbers on a +signed magnitude machine are equivalent to signed non-negative numbers +as a consequence of the forced correspondence between addresses and +unsigned numbers and of the required behavior of + and -. + +<P> + +For reference, these number representations may be defined by the way +that +<a href=dpans6.htm#6.1.1910>NEGATE</a> is implemented: + +<P> + + +<PRE> +two's complement: : NEGATE INVERT 1+ ; +one's complement: : NEGATE INVERT ; +signed-magnitude: : NEGATE HIGH-BIT XOR ; +</PRE> + +<P> + +where HIGH-BIT is a bit mask with only the most-significant bit set. +Note that all of these number systems agree on the representation of +non-negative numbers. + +<P> + +Per <A href=dpans3.htm#3.2.1.1>3.2.1.1</A> Internal number +representation and +<a href=dpans6.htm#6.1.0270>6.1.0270</a> 0=, the +implementor must ensure that no standard or supported word return +negative zero for any numeric (non-Boolean or flag) result. Many +existing programmer assumptions will be violated otherwise. + +<P> + +There is no requirement to implement circular unsigned arithmetic, nor +to set the range of unsigned numbers to the full size of a cell. There +is historical precedent for limiting the range of u to that of +n, which +is permissible when the cell size is greater than 16 bits. + +<P> + + +<hr> +<A name=A.3.2.1.2> +<H4>A.3.2.1.2 Digit conversion</H4> +</a> + +For example, an implementation might convert the characters <B>a</B> +through <B>z</B> identically to the characters <B>A</B> through +<B>Z</B>, or it might treat the characters <B>[</B> through <B>~</B> +as additional digits with decimal values 36 through 71, respectively. + +<P> + + +<hr> +<a name=A.3.2.2> +<H3>A.3.2.2 Arithmetic</H3> +</a> + + +<hr> +<a name=A.3.2.2.1> +<H4>A.3.2.2.1 Integer division</H4> +</a> + +The Forth-79 Standard specifies that the signed division operators +(<a href=dpans6.htm#6.1.0230>/</a>, +<a href=dpans6.htm#6.1.0240>/MOD</a>, +<a href=dpans6.htm#6.1.1890>MOD</a>, +<a href=dpans6.htm#6.1.0110>*/MOD</a>, +and +<a href=dpans6.htm#6.1.0100>*/</a>) +round non-integer quotients towards zero +(symmetric division). Forth-83 changed the semantics of these operators +to round towards negative infinity (floored division). Some in the +Forth community have declined to convert systems and applications from +the Forth-79 to the Forth-83 divide. To resolve this issue, an ANS +Forth system is permitted to supply either floored or symmetric +operators. In addition, ANS Forth systems must provide a floored +division primitive +(<a href=dpans6.htm#6.1.1561>FM/MOD</a>), +a symmetric division primitive +(<a href=dpans6.htm#6.1.2214>SM/REM</a>), +and a mixed precision multiplication operator +(<a href=dpans6.htm#6.1.1810>M*</a>). + +<P> + +This compromise protects the investment made in current Forth +applications; Forth-79 and Forth-83 programs are automatically compliant +with ANS Forth with respect to division. In practice, the rounding +direction rarely matters to applications. However, if a program +requires a specific rounding direction, it can use the floored division +primitive FM/MOD or the symmetric division primitive SM/REM to construct +a division operator of the desired flavor. This simple technique can be +used to convert Forth-79 and Forth-83 programs to ANS Forth without any +analysis of the original programs. + +<P> + + +<hr> +<a name=A.3.2.2.2> +<H4>A.3.2.2.2 Other integer operations</H4> +</a> + +Whether underflow occurs depends on the data-type of the result. For +example, the phrase +<b><code>1 2 -</code></b> underflows if the result is unsigned and +produces the valid signed result -1. + +<P> + + +<hr> +<a name=A.3.2.3> +<H3>A.3.2.3 Stacks</H3> +</a> + +The only data type in Forth which has concrete rather than abstract +existence is the stack entry. Even this primitive typing Forth only +enforces by the hard reality of stack underflow or overflow. The +programmer must have a clear idea of the number of stack entries to be +consumed by the execution of a word and the number of entries that will +be pushed back to a stack by the execution of a word. The observation +of anomalous occurrences on the data stack is the first line of defense +whereby the programmer may recognize errors in an application program. +It is also worth remembering that multiple stack errors caused by +erroneous application code are frequently of equal and opposite +magnitude, causing complementary (and deceptive) results. + +<P> + +For these reasons and a host of other reasons, the one unambiguous, +uncontroversial, and indispensable programming discipline observed since +the earliest days of Forth is that of providing a stack diagram for all +additions to the application dictionary with the exception of static +constructs such as +<a href=dpans6.htm#6.1.2410>VARIABLE</a>s and +<a href=dpans6.htm#6.1.0950>CONSTANT</a>s. + +<P> + + +<hr> +<a name=A.3.2.3.2> +<H4>A.3.2.3.2 Control-flow stack</H4> +</a> + +The simplest use of control-flow words is to implement the basic control +structures shown in figure A.1. + +<P> + +<a name=figure.A.1>* +</a> +<pre> + --------------------------------------------------------------- + | _____ | _____ | + < >----- IF | \| BEGIN | \| BEGIN + | | | +-------+ | +-------+ + +-------+ | | | | | | | + | | | | +-------+ | +-------+ + +-------+ | | | | | + | _____| -----< > UNTIL ------ AGAIN + |/ THEN | + | | + --------------------------------------------------------------- + Figure A.1 - The basic control-flow patterns. +</pre> +<P> + +Figure A.1 - The basic control-flow patterns. +<P> + +In control flow every branch, or transfer of control, must terminate at +some destination. A natural implementation uses a stack to remember the +origin of forward branches and the destination of backward branches. At +a minimum, only the location of each origin or destination must be +indicated, although other implementation-dependent information also may +be maintained. + +<P> + +An origin is the location of the branch itself. A destination is where +control would continue if the branch were taken. A destination is +needed to resolve the branch address for each origin, and conversely, if +every control-flow path is completed no unused destinations can remain. + +<P> + +With the addition of just three words +(<a href=dpans15.htm#15.6.2.0702>AHEAD</a>, +<a href=dpans15.htm#15.6.2.1020>CS-ROLL</a> and +<a href=dpans15.htm#15.6.2.1015>CS-PICK</a>), the +basic control-flow words supply the primitives necessary to compile a +variety of transportable control structures. The abilities required are +compilation of forward and backward conditional and unconditional +branches and compile-time management of branch origins and destinations. +Table A.1 shows the desired behavior. + +<P> + +The requirement that control-flow words are properly balanced by other +control-flow words makes reasonable the description of a compile-time +implementation-defined control-flow stack. There is no prescription as +to how the control-flow stack is implemented, e.g., data stack, linked +list, special array. Each element of the control-flow stack mentioned +above is the same size. + +<P> +<a name=table.a.1>* +</a> +<pre> + Table A.1 - Compilation behavior of control-flow words + --------------------------------------------------------------------------- + at compile time, + word: supplies: resolves: is used to: + --------------------------------------------------------------------------- + IF orig mark origin of forward conditional branch + THEN orig resolve IF or AHEAD + BEGIN dest mark backward destination + AGAIN dest resolve with backward unconditional branch + UNTIL dest resolve with backward conditional branch + AHEAD orig mark origin of forward unconditional branch + CS-PICK copy item on control-flow stack + CS-ROLL reorder items on control-flow stack + -------------------------------------------------------------------------- +</pre> +<P> + +With these tools, the remaining basic control-structure elements, shown +in +<a href=dpansa3.htm#figure.a.2>figure A.2</a>, +can be defined. The stack notation used here for +immediate words is ( compilation / execution ). + +<P> + +<PRE> +: WHILE ( dest -- orig dest / flag -- ) + \ conditional exit from loops + POSTPONE IF \ conditional forward branch + 1 CS-ROLL \ keep dest on top +; IMMEDIATE + + +: REPEAT ( orig dest -- / -- ) + \ resolve a single WHILE and return to BEGIN + POSTPONE AGAIN \ uncond. backward branch to dest + POSTPONE THEN \ resolve forward branch from orig +; IMMEDIATE + +: ELSE ( orig1 -- orig2 / -- ) + \ resolve IF supplying alternate execution + POSTPONE AHEAD \ unconditional forward branch orig2 + 1 CS-ROLL \ put orig1 back on top + POSTPONE THEN \ resolve forward branch from orig1 +; IMMEDIATE +</PRE> + +<P> +<a name=figure.a.2>* +</a> +<pre> + ----------------------------------------------- + | _____ | + < >----- IF | \| BEGIN + | | | +-------+ + +-------+ | | | | + | | | | +-------+ + +-------+ | | | + | _____| | < >----- WHILE + _____/ / ELSE | | | + | | | +-------+ | + | +-------+ | | | | + | | | | +-------+ | + | +-------+ | | | + |_____ | |_____/ _____| + \| THEN / REPEAT + | | + ---------------------------------------------- + Figure A.2 - Additional basic control-flow patterns. +</pre> +<P> + +Forth control flow provides a solution for well-known problems with +strictly structured programming. + +<P> + +The basic control structures can be supplemented, as shown in the +examples in +<a href=dpansa3.htm#figure.a.3>figure A.3</a>, +with additional WHILEs in BEGIN ... UNTIL and +BEGIN ... WHILE ... REPEAT structures. However, for each additional +WHILE there must be a THEN at the end of the structure. THEN completes +the syntax with WHILE and indicates where to continue execution when the +WHILE transfers control. The use of more than one additional WHILE is +possible but not common. Note that if the user finds this use of THEN +undesirable, an alias with a more likable name could be defined. + +<P> + +Additional actions may be performed between the control flow word (the +REPEAT or UNTIL) and the THEN that matches the additional WHILE. +Further, if additional actions are desired for normal termination and +early termination, the alternative actions may be separated by the +ordinary Forth ELSE. The termination actions are all specified after +the body of the loop. + +<P> +<a name=figure.a.3>* +</a> +<pre> + -------------------------------------------------- + _____ | _____ | + | \| BEGIN | \| BEGIN + | +-------+ | +-------+ + | | | | | | + | +-------+ | +-------+ + | | | | + | < >------ WHILE | < >----- WHILE + | | | | | | + | +-------+ | | +-------+ | + | | | | | | | | + | +-------+ | | +-------+ | + | | | | | | + | < >---- | WHILE -----< > | UNTIL + | | | | | | + | +-------+ | | +-------+ | + | | | | | | | | + | +-------+ | | +-------+ | + | | ____| | | _____/ + \____/ / | REPEAT _____/ / ELSE + | | | | + +-------+ | | +-------+ + | | | | | | + +-------+ | | +-------+ + | ______/ \____ | + |/ THEN \| THEN + | | + --------------------------------------------------- + Figure A.3 - Extended control-flow pattern examples. +</pre> +<P> + +Note that REPEAT creates an anomaly when matching the WHILE with ELSE or +THEN, most notable when compared with the BEGIN...UNTIL case. That is, +there will be one less ELSE or THEN than there are WHILEs because REPEAT +resolves one THEN. As above, if the user finds this count mismatch +undesirable, REPEAT could be replaced in-line by its own definition. + +<P> + +Other loop-exit control-flow words, and even other loops, can be +defined. The only requirements are that the control-flow stack is +properly maintained and manipulated. + +<P> + +The simple implementation of the ANS Forth CASE structure below is an +example of control structure extension. Note the maintenance of the +data stack to prevent interference with the possible control-flow stack +usage. + +<P> + + +<PRE> +0 CONSTANT CASE IMMEDIATE ( init count of OFs ) + +: OF ( #of -- orig #of+1 / x -- ) + 1+ ( count OFs ) + >R ( move off the stack in case the control-flow ) + ( stack is the data stack. ) + POSTPONE OVER POSTPONE = ( copy and test case value) + POSTPONE IF ( add orig to control flow stack ) + POSTPONE DROP ( discards case value if = ) + R> ( we can bring count back now ) +; IMMEDIATE + +: ENDOF ( orig1 #of -- orig2 #of ) + >R ( move off the stack in case the control-flow ) + ( stack is the data stack. ) + POSTPONE ELSE + R> ( we can bring count back now ) +; IMMEDIATE + +: ENDCASE ( orig1..orign #of -- ) + POSTPONE DROP ( discard case value ) + 0 ?DO + POSTPONE THEN + LOOP +; IMMEDIATE +</PRE> + +<P> + +<hr> +<a name=A.3.2.3.3> +<H4>A.3.2.3.3 Return stack</H4> +</a> + +The restrictions in +<a href=dpans3.htm#3.2.3.3>section 3.2.3.3</a> Return stack are necessary if +implementations are to be allowed to place loop parameters on the return +stack. + +<P> + + +<hr> +<a name=A.3.2.6> +<H3>A.3.2.6 Environmental queries</H3> +</a> + +The size in address units of various data types may be determined by +phrases such as <code><b>1 CHARS</code></b>. +Similarly, alignment may be determined by +phrases such as <code><b>1 ALIGNED</code></b>. + +<P> + +The environmental queries are divided into two groups: those that always +produce the same value and those that might not. The former groups +include entries such as MAX-N. This information is fixed by the +hardware or by the design of the Forth system; a user is guaranteed that +asking the question once is sufficient. + +<P> + +The other group of queries are for things that may legitimately change +over time. For example an application might test for the presence of +the Double Number word set using an environment query. If it is +missing, the system could invoke a system-dependent process to load the +word set. The system is permitted to change +<a href=dpans6.htm#6.1.1345>ENVIRONMENT?</a>'s database so +that subsequent queries about it indicate that it is present. + +<P> + +Note that a query that returns an <B>unknown</B> response could produce +a <B>known</B> result on a subsequent query. + +<P> + + +<hr> +<a name=A.3.3> +<H2>A.3.3 The Forth dictionary</H2> +</a> + +A Standard Program may redefine a standard word with a non-standard +definition. The program is still Standard (since it can be built on any +Standard System), but the effect is to make the combined entity +(Standard System plus Standard Program) a non-standard system. + +<P> + + +<hr> +<a name=A.3.3.1> +<H3>A.3.3.1 Name space</H3> +</a> + + +<hr> +<a name=A.3.3.1.2> +<H4>A.3.3.1.2 Definition names</H4> +</a> + +The language in this section is there to ensure the portability of +Standard Programs. If a program uses something outside the Standard +that it does not provide itself, there is no guarantee that another +implementation will have what the program needs to run. There is no +intent whatsoever to imply that all Forth programs will be somehow +lacking or inferior because they are not standard; some of the finest +jewels of the programmer's art will be non-standard. At the same time, +the committee is trying to ensure that a program labeled <B>Standard</B> +will meet certain expectations, particularly with regard to portability. + +<P> + +In many system environments the input source is unable to supply certain +non-graphic characters due to external factors, such as the use of those +characters for flow control or editing. In addition, when interpreting +from a text file, the parsing function specifically treats non-graphic +characters like spaces; thus words received by the text interpreter will +not contain embedded non-graphic characters. To allow implementations +in such environments to call themselves Standard, this minor restriction +on Standard Programs is necessary. + +<P> + +A Standard System is allowed to permit the creation of definition names +containing non-graphic characters. Historically, such names were used +for keyboard editing functions and <B>invisible</B> words. + +<P> + +<hr> +<a name=A.3.3.2> +<H3>A.3.3.2 Code space</H3> +</a> + + +<hr> +<a name=A.3.3.3> +<H3>A.3.3.3 Data space</H3> +</a> + +The words +<a href=dpans6.htm#6.2.0060>#TIB</a>, +<a href=dpans6.htm#6.1.0560>&gt;IN</a>, +<a href=dpans6.htm#6.1.0750>BASE</a>, +<a href=dpans7.htm#7.6.1.0790>BLK</a>, +<a href=dpans7.htm#7.6.2.2190>SCR</a>, +<a href=dpans6.htm#6.1.2216>SOURCE</a>, +<a href=dpans6.htm#6.2.2218>SOURCE-ID</a>, +<a href=dpans6.htm#6.1.2250>STATE</a>, and +<a href=dpans6.htm#6.2.2290>TIB</a> +contain information used by the Forth system in its operation and may be +of use to the application. Any assumption made by the application about +data available in the Forth system it did not store other than the data +just listed is an environmental dependency. + +<P> + +There is no point in specifying (in the Standard) both what is and what +is not addressable. + +<P> + +A Standard Program may NOT address: +<P> + +<UL> +<LI>Directly into the data or return stacks; +<LI>Into a definition's data field if not stored by the application. +</ul> +<P> + +The read-only restrictions arise because some Forth systems run from ROM +and some share I/O buffers with other users or systems. Portable +programs cannot know which areas are affected, hence the general restrictions. + + +<P> + +<hr> +<a name=A.3.3.3.1> +<H4>A.3.3.3.1 Address alignment</H4> +</a> + +Many processors have restrictions on the addresses that can be used by +memory access instructions. For example, on a Motorola 68000, 16-bit or +32-bit data can be accessed only at even addresses. Other examples +include RISC architectures where 16-bit data can be loaded or stored +only at even addresses and 32-bit data only at addresses that are +multiples of four. + +<P> + +An implementor of ANS Forth can handle these alignment restrictions in +one of two ways. Forth's memory access words +(<a href=dpans6.htm#6.1.0650>@</a>, +<a href=dpans6.htm#6.1.0010>!</a>, +<a href=dpans6.htm#6.1.0130>+!</a>, +etc.) could be +implemented in terms of smaller-width access instructions which have no +alignment restrictions. For example, on a 68000 Forth with 16-bit +cells, @ could be implemented with two 68000 byte-fetch instructions and +a reassembly of the bytes into a 16-bit cell. Although this conceals +hardware restrictions from the programmer, it is inefficient, and may +have unintended side effects in some hardware environments. An +alternate implementation of ANS Forth could define each memory-access +word using the native instructions that most closely match the word's +function. On a 68000 Forth with 16-bit cells, @ would use the 68000's +16-bit move instruction. In this case, responsibility for giving @ a +correctly-aligned address falls on the programmer. A portable ANS Forth +program must assume that alignment may be required and follow the +requirements of this section. + +<P> + +<hr> +<a name=A.3.3.3.2> +<H4>A.3.3.3.2 Contiguous regions</H4> +</a> + +The data space of a Forth system comes in discontinuous regions! The +location of some regions is provided by the system, some by the program. +Data space is contiguous within regions, allowing address arithmetic to +generate valid addresses only within a single region. A Standard +Program cannot make any assumptions about the relative placement of +multiple regions in memory. + +<P> + +<a href=dpans3.htm#3.3.3.2>Section 3.3.3.2</a> +does prescribe conditions under which contiguous regions +of data space may be obtained. For example: + +<PRE> + CREATE TABLE 1 C, 2 C, ALIGN 1000 , 2000 , +</PRE> +<P> + +makes a table whose address is returned by TABLE. In accessing this table, + + +<PRE> +TABLE C@ will return 1 +TABLE CHAR+ C@ will return 2 +TABLE 2 CHARS + ALIGNED @ will return 1000 +TABLE 2 CHARS + ALIGNED CELL+ @ will return 2000. +</PRE> + +<P> + +Similarly, + +<PRE> + CREATE DATA 1000 ALLOT +</PRE> +<P> + +makes an array 1000 address units in size. A more portable strategy would +define the array in application units, such as: + +<P> + + +<PRE> + 500 CONSTANT NCELLS + CREATE CELL-DATA NCELLS CELLS ALLOT +</PRE> + +<P> + +This array can be indexed like this: + +<PRE> + : LOOK NCELLS 0 DO CELL-DATA I CELLS + ? LOOP ; +</PRE> + +<P> + + +<hr> +<a name=A.3.3.3.6> +<H4>A.3.3.3.6 Other transient regions</H4> +</a> + +In many existing Forth systems, these areas are at +<a href=dpans6.htm#6.1.1650>HERE</a> +or just beyond +it, hence the many restrictions. + +<P> + +(2*n)+2 is the size of a character string containing the unpunctuated +binary representation of the maximum double number with a leading minus +sign and a trailing space. + +<P> + +<b>Implementation note:</b> Since the minimum value of n is 16, the absolute +minimum size of the pictured numeric output string is 34 characters. +But if your implementation has a larger n, you must also increase the +size of the pictured numeric output string. + +<P> + +<hr> +<a name=A.3.4> +<H2>A.3.4 The Forth text interpreter</H2> +</a> + + +<hr> +<a name=A.3.4.3> +<H3>A.3.4.3 Semantics</H3> +</a> + +The <B>initiation semantics</B> correspond to the code that is executed +upon entering a definition, analogous to the code executed by +<a href=dpans6.htm#6.1.1380>EXIT</a> upon +leaving a definition. The <B>run-time semantics</B> correspond to code +fragments, such as literals or branches, that are compiled inside colon +definitions by words with explicit compilation semantics. + +<P> + +In a Forth cross-compiler, the execution semantics may be specified to +occur in the host system only, the target system only, or in both +systems. For example, it may be appropriate for words such as +<a href=dpans6.htm#6.1.0890>CELLS</a> to +execute on the host system returning a value describing the target, for +colon definitions to execute only on the target, and for +<a href=dpans6.htm#6.1.0950>CONSTANT</a> and +<a href=dpans6.htm#6.1.2410>VARIABLE</a> +to have execution behaviors on both systems. Details of +cross-compiler behavior are beyond the scope of this Standard. + +<P> + +<hr> +<a name=A.3.4.3.2> +<H4>A.3.4.3.2 Interpretation semantics</H4> +</a> + +For a variety of reasons, this Standard does not define interpretation +semantics for every word. Examples of these words are +<a href=dpans6.htm#6.1.0580>&gt;R</a>, +<a href=dpans6.htm#6.1.0190>."</a>, +<a href=dpans6.htm#6.1.1240>DO</a>, and +<a href=dpans6.htm#6.1.1700>IF</a>. +Nothing in this Standard precludes an implementation from providing +interpretation semantics for these words, such as interactive +control-flow words. However, a Standard Program may not use them in +interpretation state. + +<P> + +<hr> +<a name=A.3.4.5> +<H3>A.3.4.5 Compilation</H3> +</a> + +Compiler recursion at the definition level consumes excessive resources, +especially to support locals. The Technical Committee does not believe +that the benefits justify the costs. Nesting definitions is also not +common practice and won't work on many systems. + +<P> + +<hr> +<a href=dpans.htm#toc><IMG src="up.gif" ></A> Table of Contents +<BR> +<a href=dpansa4.htm><IMG src="right.gif" ></A> +Next Section +<P> +</BODY> +</HTML> diff --git a/mwmouse/sources/AnsForth/DPANSA4.HTM b/mwmouse/sources/AnsForth/DPANSA4.HTM @@ -0,0 +1,47 @@ +<HTML><HEAD> +<TITLE>DPANS94</TITLE> +<link disabled rel="stylesheet" href="mpexc6.css"> +<style>@import url(mpexc6.css);</style> +</head> + +<BODY> +<table width=100%> +<tr> +<td align=left> +<a href=dpansa3.htm><img src=left.gif + width=26 height=26 align=ALIGN border=0></a> +<a href=dpansa5.htm><img src=right.gif + width=26 height=26 align=ALIGN border=0></a> +</td> +<td align=right> +<a href=dpans.htm#toc><img src=up.gif + width=26 height=26 align=ALIGN border=0></a> +<a name=A.4>Table of Contents</a> +</td> +</tr> +</table> +<p> +<hr size=4> + +<H2>A.4 Documentation requirements</H2> + + +<hr> +<A name=A.4.1> +<H3>A.4.1 System documentation</H3> +</a> + + +<hr> +<A name=A.4.2> +<H3>A.4.2 Program documentation</H3> +</a> + +<hr> +<A href=dpans.htm#toc><IMG src="up.gif" ></A> Table of Contents +<BR> +<A href=dpansa5.htm><IMG src="right.gif" ></A> +Next Section +<P> +</BODY> +</HTML> diff --git a/mwmouse/sources/AnsForth/DPANSA5.HTM b/mwmouse/sources/AnsForth/DPANSA5.HTM @@ -0,0 +1,113 @@ +<HTML><HEAD> +<TITLE>DPANS94</TITLE> +<link disabled rel="stylesheet" href="mpexc6.css"> +<style>@import url(mpexc6.css);</style> +</head> + +<BODY> +<table width=100%> +<tr> +<td align=left> +<a href=dpansa4.htm><img src=left.gif + width=26 height=26 align=ALIGN border=0></a> +<a href=dpansa6.htm><img src=right.gif + width=26 height=26 align=ALIGN border=0></a> +</td> +<td align=right> +<a href=dpans.htm#toc><img src=up.gif + width=26 height=26 align=ALIGN border=0></a> +<a name=A.5>Table of Contents</a> +</td> +</tr> +</table> +<p> +<hr size=4> + + +<H1>A.5 Compliance and labeling</H1> + + +<hr> +<a name=A.5.1> +<H2>A.5.1 ANS Forth systems</H2> +</a> + +<a href=dpans5.htm#5.1>Section 5.1</a> defines the criteria that +a system must meet in order to +justify the label <B>ANS Forth System</B>. Briefly, the minimum +requirement is that the system must <B>implement</B> the Core word set. +There are several ways in which this requirement may be met. The most +obvious is that all Core words may be in a pre-compiled kernel. This is +not the only way of satisfying the requirement, however. For example, +some words may be provided in source blocks or files with instructions +explaining how to add them to the system if they are needed. So long as +the words are provided in such a way that the user can obtain access to +them with a clear and straightforward procedure, they may be considered +to be present. + +<P> + +A Forth cross-compiler has many characteristics in common with an ANS +Forth System, in that both use similar compiling tools to process a +program. However, in order to fully specify an ANS Forth cross compiler +it would be necessary to address complex issues dealing with compilation +and execution semantics in both host and target environments as well as +ROMability issues. The level of effort to do this properly has proved +to be impractical at this time. As a result, although it may be +possible for a Forth cross-compiler to correctly prepare an ANS Forth +program for execution in a target environment, it is inappropriate for a +cross-compiler to be labeled an ANS Forth System. + +<P> + +<hr> +<a name=A.5.2> +<H2>A.5.2 ANS Forth programs</H2> +</a> + + +<hr> +<a name=A.5.2.2> +<H3>A.5.2.2 Program labeling</H3> +</a> + +Declaring an environmental dependency should not be considered +undesirable, merely an acknowledgment that the author has taken +advantage of some assumed architecture. For example, most computers in +common use are based on two's complement binary arithmetic. By +acknowledging an environmental dependency on this architecture, a +programmer becomes entitled to use the number -1 to represent all bits +set without significantly restricting the portability of the program. + +<P> + +Because all programs require space for data and instructions, and time +to execute those instructions, they depend on the presence of an +environment providing those resources. It is impossible to predict how +little of some of these resources (e.g. stack space) might be necessary +to perform some task, so this Standard does not do so. + +<P> + +On the other hand, as a program requires increasing levels of resources, +there will probably be sucessively fewer systems on which it will +execute sucessfully. An algorithm requiring an array of 109 cells might +run on fewer computers than one requiring only 103. + +<P> + +Since there is also no way of knowing what minimum level of resources +will be implemented in a system useful for at least some tasks, any +program performing real work labeled simply an <B>ANS Forth Program</B> +is unlikely to be labeled correctly. + +<P> + +<hr> +<A href=dpans.htm#toc><IMG src="up.gif" ></A> Table of Contents +<BR> +<A href=dpansa6.htm><IMG src="right.gif" ></A> +Next Section +<P> +</BODY> +</HTML> diff --git a/mwmouse/sources/AnsForth/DPANSA6.HTM b/mwmouse/sources/AnsForth/DPANSA6.HTM @@ -0,0 +1,2045 @@ +<HTML><HEAD> +<TITLE>DPANS94</TITLE> +<link disabled rel="stylesheet" href="mpexc6.css"> +<style>@import url(mpexc6.css);</style> +</head> + +<BODY> +<table width=100%> +<tr> +<td align=left> +<a href=dpansa5.htm><img src=left.gif + width=26 height=26 align=ALIGN border=0></a> +<a href=dpansa7.htm><img src=right.gif + width=26 height=26 align=ALIGN border=0></a> +</td> +<td align=right> +<a href=dpans.htm#toc><img src=up.gif + width=26 height=26 align=ALIGN border=0></a> +<a name=A.6>Table of Contents</a> +</td> +</tr> +</table> +<p> +<hr size=4> + +<H2>A.6 Glossary</H2> + +In this and following sections we present rationales for the handling of +specific words: why we included them, why we placed them in certain word +sets, or why we specified their names or meaning as we did. + +<P> + +Words in this section are organized by word set, retaining their index +numbers for easy cross-referencing to the glossary. + +<P> + +Historically, many Forth systems have been written in Forth. Many of +the words in Forth originally had as their primary purpose support of +the Forth system itself. For example, WORD and FIND are often used as +the principle instruments of the Forth text interpreter, and CREATE in +many systems is the primitive for building dictionary entries. In +defining words such as these in a standard way, we have endeavored not +to do so in such a way as to preclude their use by implementors. One of +the features of Forth that has endeared it to its users is that the same +tools that are used to implement the system are available to the +application programmer - a result of this approach is the compactness +and efficiency that characterizes most Forth implementations. + +<P> + +<hr> +<a name=A.6.1> +<H3>A.6.1 Core words</H3> +</a> + + + +<hr> +<a name=A.6.1.0070>A.6.1.0070 '</A> +<P> +</a> + +Typical use: <code>... ' name .</code> +<P> + +Many Forth systems use a state-smart tick. Many do not. ANS Forth follows +the usage of Forth-83. + +<P> +<code> +See: +<a href=dpansa3.htm#A.3.4.3.2>A.3.4.3.2</a> Interpretation semantics, +<a href=dpansa6.htm#A.6.1.1550>A.6.1.1550 FIND</a> +</code> +<P> + +<hr> +<a name=A.6.1.0080>A.6.1.0080 (</A> +<P> + +Typical use: <code>... ( ccc) ...</code> +<P> + +<hr> +<a name=A.6.1.0140>A.6.1.0140 +LOOP</A> +<P> + +Typical use: <code>: X ... limit first DO ... step +LOOP ;</code> +<P> + +<hr> +<a name=A.6.1.0150>A.6.1.0150 ,</A> +<P> + +The use of , (comma) for compiling execution tokens is not portable. +<P> +<code> +See: +<a href=dpans6.htm#6.2.0945>6.2.0945 COMPILE,</a> +</code> +<P> + +<hr> +<a name=A.6.1.0190>A.6.1.0190 ."</A> +<P> + +Typical use: <code>: X ... ." ccc" ... ;</code> +<P> + +An implementation may define interpretation semantics for ." if desired. +In one plausible implementation, interpreting ." would display the +delimited message. In another plausible implementation, interpreting ." +would compile code to display the message later. In still another +plausible implementation, interpreting ." would be treated as an +exception. Given this variation a Standard Program may not use ." while +interpreting. Similarly, a Standard Program may not compile POSTPONE ." +inside a new word, and then use that word while interpreting. + +<P> + +<hr> +<a name=A.6.1.0320>A.6.1.0320 2*</A> +<P> + +Historically, 2* has been implemented on two's-complement machines as a +logical left-shift instruction. Multiplication by two is an efficient +side-effect on these machines. However, shifting implies a knowledge of +the significance and position of bits in a cell. While the name implies +multiplication, most implementors have used a hardware left shift to +implement 2*. + +<P> + +<hr> +<a name=A.6.1.0330>A.6.1.0330 2/</A> +<P> + +This word has the same common usage and misnaming implications as 2*. +It is often implemented on two's-complement machines with a hardware +right shift that propagates the sign bit. + +<P> + +<hr> +<a name=A.6.1.0350>A.6.1.0350 2@</A> +<P> + +With 2@ the storage order is specified by the Standard. + +<P> + +<hr> +<a name=A.6.1.0450>A.6.1.0450 :</A> +<P> + +Typical use: <code>: name ... ;</code> + +<P> + +In Forth-83, this word was specified to alter the search order. This +specification is explicitly removed in this Standard. We believe that +in most cases this has no effect; however, systems that allow many +search orders found the Forth-83 behavior of colon very undesirable. + +<P> + +Note that colon does not itself invoke the compiler. Colon sets +compilation state so that later words in the parse area are compiled. + +<P> + +<hr> +<a name=A.6.1.0460>A.6.1.0460 ;</A> +<P> + + +Typical use: <code>: name ... ;</code> + +<P> + +One function performed by both ; and ;CODE is to allow the current +definition to be found in the dictionary. If the current definition was +created by :NONAME the current definition has no definition name and +thus cannot be found in the dictionary. If :NONAME is implemented the +Forth compiler must maintain enough information about the current +definition to allow ; and ;CODE to determine whether or not any action +must be taken to allow it to be found. + +<P> + +<hr> +<a name=A.6.1.0550>A.6.1.0550 &gt;BODY</A> +<P> + +a-addr is the address that HERE would have returned had it been executed +immediately after the execution of the CREATE that defined xt. + +<P> + +<hr> +<a name=A.6.1.0680>A.6.1.0680 ABORT"</A> +<P> + +Typical use: <code>: X ... test ABORT" ccc" ... ;</code> + +<P> + +<hr> +<a name=A.6.1.0695>A.6.1.0695 ACCEPT</A> +<P> + +Previous standards specified that collection of the input string +terminates when either a <B>return</B> is received or when +n1 +characters have been received. Terminating when +n1 characters have +been received is difficult, expensive, or impossible to implement in +some system environments. Consequently, a number of existing +implementations do not comply with this requirement. Since line-editing +and collection functions are often implemented by system components +beyond the control of the Forth implementation, this Standard imposes no +such requirement. A Standard Program may only assume that it can +receive an input string with ACCEPT or +<a href=dpans6.htm#6.2.1390>EXPECT</a>. +The detailed sequence of +user actions necessary to prepare and transmit that line are beyond the +scope of this Standard. + +<P> + +Specification of a non-zero, positive integer count (+n1) for ACCEPT +allows some implementors to continue their practice of using a zero or +negative value as a flag to trigger special behavior. Insofar as such +behavior is outside the Standard, Standard Programs cannot depend upon +it, but the Technical Committee doesn't wish to preclude it +unnecessarily. Since actual values are almost always small integers, no +functionality is impaired by this restriction. + +<P> + +ACCEPT and EXPECT perform similar functions. ACCEPT is recommended for +new programs, and future use of EXPECT is discouraged. + +<P> + +It is recommended that all non-graphic characters be reserved for +editing or control functions and not be stored in the input string. + +<P> + +Commonly, when the user is preparing an input string to be transmitted +to a program, the system allows the user to edit that string and correct +mistakes before transmitting the final version of the string. The +editing function is supplied sometimes by the Forth system itself, and +sometimes by external system software or hardware. Thus, control +characters and functions may not be available on all systems. In the +usual case, the end of the editing process and final transmission of the +string is signified by the user pressing a <B>Return</B> or <B>Enter</B> +key. + +<P> + +As in previous standards, EXPECT returns the input string immediately +after the requested number of characters are entered, as well as when a +line terminator is received. The <B>automatic termination after +specified count of characters have been entered</B> behavior is widely +considered undesirable because the user <B>loses control</B> of the +input editing process at a potentially unknown time (the user does not +necessarily know how many characters were requested from EXPECT). Thus +EXPECT and SPAN have been made obsolescent and exist in the Standard +only as a concession to existing implementations. If EXPECT exists in a +Standard System it must have the <B>automatic termination</B> behavior. + +<P> + +ACCEPT does not have the <B>automatic termination</B> behavior of +EXPECT. However, because external system hardware and software may +perform the ACCEPT function, when a line terminator is received the +action of the cursor, and therefore the display, is +implementation-defined. It is recommended that the cursor remain +immediately following the entered text after a line terminator is +received. + +<P> + +<hr> +<a name=A.6.1.0705>A.6.1.0705 ALIGN</A> +<P> + +In this Standard we have attempted to provide transportability across +various CPU architectures. One of the frequent causes of +transportability problems is the requirement of cell-aligned addresses +on some CPUs. On these systems, ALIGN and ALIGNED may be required to +build and traverse data structures built with C,. Implementors may +define these words as no-ops on systems for which they aren't +functional. + +<P> + +<hr> +<a name=A.6.1.0706>A.6.1.0706 ALIGNED</A> +<P> +<code> +See: +<a href=dpansa6.htm#A.6.1.0705>A.6.1.0705 ALIGN</a> +</code> +<P> + +<hr> +<a name=A.6.1.0760>A.6.1.0760 BEGIN</A> +<P> + +Typical use: +<pre> + : X ... BEGIN ... test UNTIL ; +</pre> + +or +<P> + + +<PRE> + : X ... BEGIN ... test WHILE ... REPEAT ; +</PRE> +<P> + +<hr> +<a name=A.6.1.0770>A.6.1.0770 BL</A> +<P> + +Because space is used throughout Forth as the standard delimiter, this +word is the only way a program has to find and use the system value of +<B>space</B>. The value of a space character can not be obtained with +CHAR, for instance. + +<P> + +<hr> +<a name=A.6.1.0880>A.6.1.0880 CELL+</A> +<P> + +As with ALIGN and ALIGNED, the words CELL and CELL+ were added to aid in +transportability across systems with different cell sizes. They are +intended to be used in manipulating indexes and addresses in integral +numbers of cell-widths. + +<P> + +Example: + +<PRE> +2VARIABLE DATA + +0 100 DATA 2! +DATA @ . 100 + +DATA CELL+ @ . 0 +</PRE> + +<P> + +<hr> +<a name=A.6.1.0890>A.6.1.0890 CELLS</A> +<P> +<code> +See: +<a href=dpansa6.htm#A.6.1.0880>A.6.1.0880 CELL+</a> +</code> +<P> + +Example: <code>CREATE NUMBERS 100 CELLS ALLOT</code> +<P> + +(Allots space in the array NUMBERS for 100 cells of data.) + +<P> + +<hr> +<a name=A.6.1.0895>A.6.1.0895 CHAR</A> +<P> + +Typical use: <code>... CHAR A CONSTANT "A" ...</code> + +<P> + +<hr> +<a name=A.6.1.0950>A.6.1.0950 CONSTANT</A> +<P> + +Typical use: <code>... DECIMAL 10 CONSTANT TEN ...</code> + +<P> + +<hr> +<a name=A.6.1.1000>A.6.1.1000 CREATE</A> +<P> + +The data-field address of a word defined by CREATE is given by the +data-space pointer immediately following the execution of CREATE + +<P> + +Reservation of data field space is typically done with ALLOT. + +<P> + +Typical use: <code>... CREATE SOMETHING ...</code> + +<P> + +<hr> +<a name=A.6.1.1240>A.6.1.1240 DO</A> +<P> + +Typical use: +<P> + + +<PRE> + : X ... limit first DO ... LOOP ; +</PRE> +<P> + +or +<P> + + +<PRE> + : X ... limit first DO ... step +LOOP ; +</PRE> +<P> + +<hr> +<a name=A.6.1.1250>A.6.1.1250 DOES&gt;</A> +<P> + +Typical use: <code>: X ... DOES&gt; ... ;</code> + +<P> + +Following DOES&gt;, a Standard Program may not make any assumptions +regarding the ability to find either the name of the definition +containing the DOES&gt; or any previous definition whose name may be +concealed by it. DOES&gt; effectively ends one definition and begins +another as far as local variables and control-flow structures are +concerned. The compilation behavior makes it clear that the user is not +entitled to place DOES&gt; inside any control-flow structures. + +<P> + +<hr> +<a name=A.6.1.1310>A.6.1.1310 ELSE</A> +<P> + +Typical use: <code>: X ... test IF ... ELSE ... THEN ;</code> + +<P> + +<hr> +<a name=A.6.1.1345>A.6.1.1345 ENVIRONMENT?</A> +<P> + +In a Standard System that contains only the Core word set, effective use +of ENVIRONMENT? requires either its use within a definition, or the use +of user-supplied auxiliary definitions. The Core word set lacks both a +direct method for collecting a string in interpretation state +( +<a href=dpans11.htm#11.6.1.2165>11.6.1.2165</a> +S" is in an optional word set) and also a means to test the +returned flag in interpretation state (e.g. the optional +<a href=dpans15.htm#15.6.2.2532>15.6.2.2532</a> [IF]). + +<P> + +The combination of +<a href=dpans6.htm#6.1.1345>6.1.1345</a> ENVIRONMENT?, +<a href=dpans11.htm#11.6.1.2165>11.6.1.2165</a> S", +<a href=dpans15.htm#15.6.2.2532>15.6.2.2532</a> [IF], +<a href=dpans15.htm#15.6.2.2531>15.6.2.2531</a> [ELSE], and +<a href=dpans15.htm#15.6.2.2533>15.6.2.2533</a> [THEN] constitutes an +effective suite of words for conditional compilation that works in +interpretation state. + +<P> + +<hr> +<a name=A.6.1.1360>A.6.1.1360 EVALUATE</A> +<P> + +The Technical Committee is aware that this function is commonly spelled +EVAL. However, there exist implementations that could suffer by +defining the word as is done here. We also find EVALUATE to be more +readable and explicit. There was some sentiment for calling this +INTERPRET, but that too would have undesirable effects on existing code. +The longer spelling was not deemed significant since this is not a word +that should be used frequently in source code. + +<P> + +<hr> +<a name=A.6.1.1380>A.6.1.1380 EXIT</A> +<P> + +Typical use: <code>: X ... test IF ... EXIT THEN ... ;</code> + +<P> + +<hr> +<a name=A.6.1.1550>A.6.1.1550 FIND</A> +<P> + +One of the more difficult issues which the Committee took on was the +problem of divorcing the specification of implementation mechanisms from +the specification of the Forth language. Three basic implementation +approaches can be quickly enumerated: + +<P> + +1) Threaded code mechanisms. These are the traditional approaches to +implementing Forth, but other techniques may be used. + +<P> + +2) Subroutine threading with <B>macro-expansion</B> (code copying). +Short routines, like the code for DUP, are copied into a definition +rather than compiling a JSR reference. + +<P> + +3) Native coding with optimization. This may include stack optimization +(replacing such phrases as +<code>SWAP ROT +</code> with one or two machine +instructions, for example), parallelization (the trend in the newer RISC +chips is to have several functional subunits which can execute in +parallel), and so on. + +<P> + +The initial requirement (inherited from Forth-83) that compilation +addresses be compiled into the dictionary disallowed type 2 and type 3 +implementations. + +<P> + +Type 3 mechanisms and optimizations of type 2 implementations were +hampered by the explicit specification of immediacy or non-immediacy of +all standard words. POSTPONE allowed de-specification of immediacy or +non-immediacy for all but a few Forth words whose behavior must be +STATE-independent. + +<P> + +One type 3 implementation, Charles Moore's cmForth, has both compiling +and interpreting versions of many Forth words. At the present, this +appears to be a common approach for type 3 implementations. The +Committee felt that this implementation approach must be allowed. +Consequently, it is possible that words without interpretation semantics +can be found only during compilation, and other words may exist in two +versions: a compiling version and an interpreting version. Hence the +values returned by FIND may depend on STATE, and ' and ['] may be unable +to find words without interpretation semantics. + +<P> + +<hr> +<a name=A.6.1.1561>A.6.1.1561 FM/MOD</A> +<P> + +By introducing the requirement for <B>floored</B> division, Forth-83 +produced much controversy and concern on the part of those who preferred +the more common practice followed in other languages of implementing +division according to the behavior of the host CPU, which is most often +symmetric (rounded toward zero). In attempting to find a compromise +position, this Standard provides primitives for both common varieties, +floored and symmetric +(<a href=dpans6.htm#6.1.2214>see</a> SM/REM). FM/MOD is the floored version. + +<P> + +The Technical Committee considered providing two complete sets of +explicitly named division operators, and declined to do so on the +grounds that this would unduly enlarge and complicate the Standard. +Instead, implementors may define the normal division words in terms of +either FM/MOD or SM/REM providing they document their choice. People +wishing to have explicitly named sets of operators are encouraged to do +so. FM/MOD may be used, for example, to define: + +<P> + + +<PRE> +: /_MOD ( n1 n2 -- n3 n4) >R S>D R> FM/MOD ; + +: /_ ( n1 n2 -- n3) /_MOD SWAP DROP ; + +: _MOD ( n1 n2 -- n3) /_MOD DROP ; + +: */_MOD ( n1 n2 n3 -- n4 n5) >R M* R> FM/MOD ; + +: */_ ( n1 n2 n3 -- n4 ) */_MOD SWAP DROP ; +</PRE> + +<P> + +<hr> +<a name=A.6.1.1700>A.6.1.1700 IF</A> +<P> + +Typical use: +<P> + + +<PRE> + : X ... test IF ... THEN ... ; +</PRE> +<P> + +or +<P> + + +<PRE> + : X ... test IF ... ELSE ... THEN ... ; +</PRE> +<P> + +<hr> +<a name=A.6.1.1710>A.6.1.1710 IMMEDIATE</A> +<P> + +Typical use: <code>: X ... ; IMMEDIATE</code> + +<P> + +<hr> +<a name=A.6.1.1720>A.6.1.1720 INVERT</A> +<P> + +The word NOT was originally provided in Forth as a flag operator to make +control structures readable. Under its intended usage the following two +definitions would produce identical results: + +<P> + + +<PRE> +: ONE ( flag -- ) + IF ." true" ELSE ." false" THEN ; + +: TWO ( flag -- ) + NOT IF ." false" ELSE ." true" THEN ; +</PRE> + +<P> + +This was common usage prior to the Forth-83 Standard which redefined NOT +as a cell-wide one's-complement operation, functionally equivalent to +the phrase +<code>-1 XOR</code>. At the same time, the data type manipulated by this +word was changed from a flag to a cell-wide collection of bits and the +standard value for true was changed from <B>1</B> (rightmost bit only +set) to <B>-1</B> (all bits set). As these definitions of TRUE and NOT +were incompatible with their previous definitions, many Forth users +continue to rely on the old definitions. Hence both versions are in +common use. + +<P> + +Therefore, usage of NOT cannot be standardized at this time. The two +traditional meanings of NOT - that of negating the sense of a flag and +that of doing a one's complement operation - are made available by 0= +and INVERT, respectively. + +<P> + +<hr> +<a name=A.6.1.1730>A.6.1.1730 J</A> +<P> + +J may only be used with a nested DO...LOOP, DO...+LOOP, ?DO...LOOP, or +?DO...+LOOP, for example, in the form: + + +<PRE> + : X ... DO ... DO ... J ... LOOP ... +LOOP ... ; +</PRE> +<P> + +<hr> +<a name=A.6.1.1760>A.6.1.1760 LEAVE</A> +<P> + +Note that LEAVE immediately exits the loop. No words following LEAVE +within the loop will be executed. Typical use: + + +<PRE> + : X ... DO ... IF ... LEAVE THEN ... LOOP ... ; +</PRE> +<P> + +<hr> +<a name=A.6.1.1780>A.6.1.1780 LITERAL</A> +<P> + +Typical use: <code>: X ... [ x ] LITERAL ... ;</code> + +<P> + +<hr> +<a name=A.6.1.1800>A.6.1.1800 LOOP</A> +<P> + +Typical use: +<P> + + +<PRE> + : X ... limit first DO ... LOOP ... ; +</PRE> +<P> + +or +<P> + + +<PRE> + : X ... limit first ?DO ... LOOP ... ; +</PRE> +<P> + +<hr> +<a name=A.6.1.1810>A.6.1.1810 M*</A> +<P> + +This word is a useful early step in calculation, going to extra +precision conveniently. It has been in use since the Forth systems of +the early 1970's. + +<P> + +<hr> +<a name=A.6.1.1900>A.6.1.1900 MOVE</A> +<P> + +CMOVE and CMOVE&gt; are the primary move operators in Forth-83. They +specify a behavior for moving that implies propagation if the move is +suitably invoked. In some hardware, this specific behavior cannot be +achieved using the best move instruction. Further, CMOVE and CMOVE&gt; +move characters; ANS Forth needs a move instruction capable of dealing +with address units. Thus MOVE has been defined and added to the Core +word set, and CMOVE and CMOVE&gt; have been moved to the String word set. + +<P> + +<hr> +<a name=A.6.1.2033>A.6.1.2033 POSTPONE</A> +<P> + +Typical use: + +<P> + + +<PRE> +: ENDIF POSTPONE THEN ; IMMEDIATE + +: X ... IF ... ENDIF ... ; +</PRE> + +<P> + +POSTPONE replaces most of the functionality of +COMPILE and +<a href=dpans6.htm#6.2.2530>[COMPILE]</a>. +COMPILE and [COMPILE] are used for the same purpose: postpone the +compilation behavior of the next word in the parse area. COMPILE was +designed to be applied to non-immediate words and [COMPILE] to immediate +words. This burdens the programmer with needing to know which words in +a system are immediate. Consequently, Forth standards have had to +specify the immediacy or non-immediacy of all words covered by the +Standard. This unnecessarily constrains implementors. + +<P> + +A second problem with COMPILE is that some programmers have come to +expect and exploit a particular implementation, namely: + + +<PRE> + : COMPILE R> DUP @ , CELL+ >R ; +</PRE> + +<P> + +This implementation will not work on native code Forth systems. In a +native code Forth using inline code expansion and peephole optimization, +the size of the object code produced varies; this information is +difficult to communicate to a <B>dumb</B> COMPILE. A <B>smart</B> +(i.e., immediate) COMPILE would not have this problem, but this was +forbidden in previous standards. + +<P> + +For these reasons, COMPILE has not been included in the Standard and +[COMPILE] has been moved in favor of POSTPONE. Additional discussion +can be found in Hayes, J.R., <B>Postpone</B>, Proceedings of the 1989 +Rochester Forth Conference. + +<P> + +<hr> +<a name=A.6.1.2120>A.6.1.2120 RECURSE</A> +<P> + +Typical use: <code>: X ... RECURSE ... ;</code> + +<P> + +This is Forth's recursion operator; in some implementations it is called +MYSELF. The usual example is the coding of the factorial function. + +<PRE> +: FACTORIAL ( +n1 -- +n2) + DUP 2 &lt; IF DROP 1 EXIT THEN + DUP 1- RECURSE * +; +</PRE> + +<P> + +n2 = n1(n1-1)(n1-2)...(2)(1), the product of n1 with all positive +integers less than itself (as a special case, zero factorial equals +one). While beloved of computer scientists, recursion makes unusually +heavy use of both stacks and should therefore be used with caution. See +alternate definition in +<a href=dpansa6.htm#A.6.1.2140>A.6.1.2140</a> REPEAT. + +<P> + +<hr> +<a name=A.6.1.2140>A.6.1.2140 REPEAT</A> +<P> + +Typical use: +<P> + + + +<PRE> +: FACTORIAL ( +n1 -- +n2) + DUP 2 < IF DROP 1 EXIT THEN + DUP + BEGIN DUP 2 > WHILE + 1- SWAP OVER * SWAP + REPEAT DROP +; +</PRE> + +<P> + +<hr> +<a name=A.6.1.2165>A.6.1.2165 S"</A> +<P> + +Typical use: <code>: X ... S" ccc" ... ;</code> + +<P> + +This word is found in many systems under the name " (quote). However, +current practice is almost evenly divided on the use of ", with many +systems using the execution semantics given here, while others return +the address of a counted string. We attempt here to satisfy both camps +by providing two words, S" and the Core Extension word C" so that users +may have whichever behavior they expect with a simple renaming +operation. + +<P> + +<hr> +<a name=A.6.1.2214>A.6.1.2214 SM/REM</A> +<P> + +See the previous discussion of division under FM/MOD. SM/REM is the +symmetric-division primitive, which allows programs to define the +following symmetric-division operators: + +<P> + + +<PRE> +: /-REM ( n1 n2 -- n3 n4 ) >R S>D R> SM/REM ; + +: /- ( n1 n2 -- n3 ) /-REM SWAP DROP ; + +: -REM ( n1 n2 -- n3 ) /-REM DROP ; + +: */-REM ( n1 n2 n3 -- n4 n5 ) >R M* R> SM/REM ; + +: */- ( n1 n2 n3 -- n4 ) */-REM SWAP DROP ; +</PRE> + +<P> + +<hr> +<a name=A.6.1.2216>A.6.1.2216 SOURCE</A> +<P> + +SOURCE simplifies the process of directly accessing the input buffer by +hiding the differences between its location for different input sources. +This also gives implementors more flexibility in their implementation of +buffering mechanisms for different input sources. The committee moved +away from an input buffer specification consisting of a collection of +individual variables, declaring TIB and #TIB obsolescent. + +<P> + +SOURCE in this form exists in F83, POLYFORTH, LMI's Forths and others. +In conventional systems it is equivalent to the phrase + + +<PRE> + BLK @ IF BLK @ BLOCK 1024 ELSE TIB #TIB @ THEN +</PRE> + +<P> + +<hr> +<a name=A.6.1.2250>A.6.1.2250 STATE</A> +<P> + +Although EVALUATE, LOAD, INCLUDE-FILE, and INCLUDED are not listed as +words which alter STATE, the text interpreted by any one of these words +could include one or more words which explicitly alter STATE. EVALUATE, +LOAD, INCLUDE-FILE, and INCLUDED do not in themselves alter STATE. + +<P> + +STATE does not nest with text interpreter nesting. For example, the +code sequence: + + +<PRE> + : FOO S" ]" EVALUATE ; FOO +</PRE> + +<P> + +will leave the system in compilation state. Similarly, after LOADing a +block containing ], the system will be in compilation state. + +<P> + +Note that ] does not affect the parse area and that the only effect that +: has on the parse area is to parse a word. This entitles a program to +use these words to set the state with known side-effects on the parse +area. For example: + +<P> + + +<PRE> +: NOP : POSTPONE ; IMMEDIATE ; + +NOP ALIGN NOP ALIGNED +</PRE> + +<P> + +Some non-ANS Forth compliant systems have ] invoke a compiler loop in +addition to setting STATE. Such a system would inappropriately attempt +to compile the second use of NOP. + +<P> + +Also note that nothing in the Standard prevents a program from finding +the execution tokens of ] or [ and using these to affect STATE. These +facts suggest that implementations of ] will do nothing but set STATE +and a single interpreter/compiler loop will monitor STATE. + + +<P> + +<hr> +<a name=A.6.1.2270>A.6.1.2270 THEN</A> +<P> + +Typical use: +<P> + + +<PRE> + : X ... test IF ... THEN ... ; +</PRE> +<P> + +or +<P> + + +<PRE> + : X ... test IF ... ELSE ... THEN ... ; +</PRE> +<P> + +<hr> +<a name=A.6.1.2380>A.6.1.2380 UNLOOP</A> +<P> + + +Typical use: + +<PRE> +: X ... + + limit first DO + + ... test IF ... UNLOOP EXIT THEN ... + + LOOP + ... +; +</PRE> + +<P> + +UNLOOP allows the use of EXIT within the context of DO ... LOOP and +related do-loop constructs. UNLOOP as a function has been called UNDO. +UNLOOP is more indicative of the action: nothing gets undone -- we +simply stop doing it. + +<P> + +<hr> +<a name=A.6.1.2390>A.6.1.2390 UNTIL</A> +<P> + +Typical use: <code>: X ... BEGIN ... test UNTIL ... ;</code> + +<P> + +<hr> +<a name=A.6.1.2410>A.6.1.2410 VARIABLE</A> +<P> + + +Typical use: <code>... VARIABLE XYZ ...</code> + +<P> + +<hr> +<a name=A.6.1.2430>A.6.1.2430 WHILE</A> +<P> + + +Typical use: <code>: X ... BEGIN ... test WHILE ... REPEAT ... ;</code> + +<P> + +<hr> +<a name=A.6.1.2450>A.6.1.2450 WORD</A> +<P> + +Typical use: <code>char WORD ccc&lt;char&gt;</code> + +<P> + +<hr> +<a name=A.6.1.2500>A.6.1.2500 [</A> +<P> + +Typical use: <code>: X ... [ 4321 ] LITERAL ... ;</code> + +<P> + +<hr> +<a name=A.6.1.2510>A.6.1.2510 [']</A> +<P> + +Typical use: <code>: X ... ['] name ... ;</code> + +<P> +<code> +See: +<a href=dpansa6.htm#A.6.1.1550>A.6.1.1550 FIND</a> +</code> +<P> + +<hr> +<a name=A.6.1.2520>A.6.1.2520 [CHAR]</A> +<P> + +Typical use: <code>: X ... [CHAR] ccc ... ;</code> + +<P> + +<hr> +<a name=A.6.1.2540>A.6.1.2540 ]</A> +<P> + +Typical use: <code>: X ... [ 1234 ] LITERAL ... ;</code> + +<P> + + +<hr> +<a name=A.6.2> +<H3>A.6.2 Core extension words</H3> +</a> + +The words in this collection fall into several categories: +<P> + +<UL> +<LI>Words that are in common use but are deemed less essential than Core +words (e.g., +<a href=dpans6.htm#6.2.0260>0&lt;&gt;</a>); +<LI>Words that are in common use but can be trivially defined from Core +words (e.g., +<a href=dpans6.htm#6.2.1485>FALSE</a>); +<LI>Words that are primarily useful in narrowly defined types of +applications or are in less frequent use (e.g., +<a href=dpans6.htm#6.2.2008>PARSE</a>); +<LI>Words that are being deprecated in favor of new words introduced to +solve specific problems (e.g., +<a href=dpans6.htm#6.2.0970>CONVERT</a>). +</UL> +<P> + +Because of the varied justifications for inclusion of these words, the +Technical Committee does not encourage implementors to offer the +complete collection, but to select those words deemed most valuable to +their clientele. + +<P> + +<hr> +<a name=A.6.2.0060>A.6.2.0060 #TIB</A> +<P> + +The function of #TIB has been superseded by +<a href=dpans6.htm#6.1.2216>SOURCE</a>. + +<P> + +<hr> +<a name=A.6.2.0200>A.6.2.0200 .(</A> +<P> + +Typical use: <code>.( ccc)</code> + +<P> + +<hr> +<a name=A.6.2.0210>A.6.2.0210 .R</A> +<P> + +In .R, <B>R</B> is short for RIGHT. + +<P> + +<hr> +<a name=A.6.2.0340>A.6.2.0340 2&gt;R</A> +<P> + +Historically, 2&gt;R has been used to implement +<a href=dpans6.htm#6.1.1240>DO</a>. Hence the order of +parameters on the return stack. + +<P> + +The primary advantage of 2&gt;R is that it puts the top stack entry on the +top of the return stack. For instance, a double-cell number may be +transferred to the return stack and still have the most significant cell +accessible on the top of the return stack. + +<P> + +<hr> +<a name=A.6.2.0410>A.6.2.0410 2R&gt;</A> +<P> + +Note that 2R&gt; is not equivalent to +<a href=dpans6.htm#6.1.2060>R&gt;</a> R&gt;. Instead, it mirrors the +action of +<a href=dpans6.htm#6.2.0340>2&gt;R</a> +(see <a href=dpansa6.htm#A.6.2.0340>A.6.2.0340</A>). + +<P> + +<hr> +<a name=A.6.2.0455>A.6.2.0455 :NONAME</A> +<P> + +:NONAME allows a user to create an execution token with the semantics of +a colon definition without an associated name. Previously, only +<a href=dpans6.htm#6.1.0450>:</a> +(colon) could create an execution token with these semantics. Thus, +Forth code could only be compiled using the syntax of :, that is: + + +<PRE> + : NAME ... ; +</PRE> + +<P> + +:NONAME removes this constraint and places the Forth compiler in the +hands of the programmer. + +<P> + +:NONAME can be used to create application-specific programming +languages. One technique is to mix Forth code fragments with +application-specific constructs. The application-specific constructs +use :NONAME to compile the Forth code and store the corresponding +execution tokens in data structures. + +<P> + +The functionality of :NONAME can be built on any Forth system. For +years, expert Forth programmers have exploited intimate knowledge of +their systems to generate unnamed code fragments. Now, this function +has been named and can be used in a portable program. + +<P> + +For example, :NONAME can be used to build a table of code fragments +where indexing into the table allows executing a particular fragment. +The declaration syntax of the table is: + +<P> + + +<PRE> +:NONAME .. code for command 0 .. ; 0 CMD ! + +:NONAME .. code for command 1 .. ; 1 CMD ! + ... + +:NONAME .. code for command 99 .. ; 99 CMD ! + + ... 5 CMD @ EXECUTE ... + +</PRE> +<P> + +The definitions of the table building words are: + +<PRE> +CREATE CMD-TABLE \ table for command execution tokens +100 CELLS ALLOT + +: CMD ( n -- a-addr ) \ nth element address in table + CELLS CMD-TABLE + ; +</PRE> + +<P> + +As a further example, a defining word can be created to allow +performance monitoring. In the example below, the number of times a +word is executed is counted. : must first be renamed to allow the +definition of the new ;. + +<P> + + +<PRE> +: DOCOLON ( -- ) \ Modify CREATEd word to execute like a colon def + DOES> ( i*x a-addr -- j*x ) + 1 OVER +! \ count executions + CELL+ @ EXECUTE \ execute :NONAME definition +; + +: OLD: : ; \ just an alias + +OLD: : ( "name" -- a-addr xt colon-sys ) + \ begins an execution-counting colon definition + CREATE HERE 0 , \ storage for execution counter + 0 , \ storage for execution token + DOCOLON \ set run time for CREATEd word + :NONAME \ begin unnamed colon definition +; +</PRE> +<P> + +( Note the placement of DOES&gt;: DOES&gt; must modify the CREATEd word and not +the :NONAME definition, so DOES&gt; must execute before :NONAME.) + +<PRE> +OLD: ; ( a-addr xt colon-sys -- ) + \ ends an execution-counting colon definition ) + POSTPONE ; \ complete compilation of colon def + SWAP CELL+ ! \ save execution token +; IMMEDIATE +</PRE> + +<P> + +The new : and ; are used just like the standard ones to define words: +<P> + + +<PRE> + ... : xxx ... ; ... xxx ... +</PRE> + +Now however, these words may be <B>ticked</B> to retrieve the count (and +execution token): + + +<PRE> + ... ' xxx >BODY ? ... +</PRE> + +<P> + +<hr> +<a name=A.6.2.0620>A.6.2.0620 ?DO</A> +<P> + +Typical use: + +<code>: FACTORIAL ( +n1 -- +n2 ) 1 SWAP 1+ ?DO I * LOOP ;</code> + +<P> + +This word was added in response to many requests for a resolution of the +difficulty introduced by Forth-83's DO, which on a 16-bit system will +loop 65,535 times if given equal arguments. As this Standard also +encourages 32-bit systems, this behavior can be intolerable. The +Technical Committee considered applying these semantics to +<a href=dpans6.htm#6.1.1240>DO</a>, but +declined on the grounds that it might break existing code. + +<P> + +<hr> +<a name=A.6.2.0700>A.6.2.0700 AGAIN</A> +<P> + +Typical use: <code>: X ... BEGIN ... AGAIN ... ;</code> + +<P> + +Unless word-sequence has a way to terminate, this is an endless loop. + +<P> + +<hr> +<a name=A.6.2.0855>A.6.2.0855 C"</A> +<P> + +Typical use: <code>: X ... C" ccc" ... ;</code> + +<P> + +It is easy to convert counted strings to pointer/length but hard to do +the opposite. C" is the only new word that uses the <B>address of +counted string</B> stack representation. It is provided as an aid to +porting existing programs to ANS Forth systems. It is relatively +difficult to implement C" in terms of other standard words, considering +its <B>compile string into the current definition</B> semantics. + +<P> + +Users of C" are encouraged to migrate their application code toward the +consistent use of the preferred <B>c-addr u</B> stack representation +with the alternate word +<a href=dpans6.htm#6.1.2165>S"</a>. This may be accomplished by converting +application words with counted string input arguments to use the +preferred <B>c-addr u</B> representation, thus eliminating the need for +C" . + +<P> +<code> +See: +<a href=dpansa3.htm#A.3.1.3.4>A.3.1.3.4</a> Counted strings +</code> +<P> + +<hr> +<a name=A.6.2.0873>A.6.2.0873 CASE</A> +<P> + +Typical use: + +<PRE> + : X ... + CASE + test1 OF ... ENDOF + testn OF ... ENDOF + ... ( default ) + ENDCASE ... + ; +</PRE> + +<P> + +<hr> +<a name=A.6.2.0945>A.6.2.0945 COMPILE,</A> +<P> + +COMPILE, is the compilation equivalent of +<a href=dpans6.htm#6.1.1370>EXECUTE</a>. In many cases, it is +possible to compile a word by using +<a href=dpans6.htm#6.1.2033>POSTPONE</a> without resorting to the +use of COMPILE,. However, the use of POSTPONE requires that the name of +the word must be known at compile time, whereas COMPILE, allows the word +to be located at any time. It is sometime possible to use +<a href=dpans6.htm#6.1.1360>EVALUATE</a> to +compile a word whose name is not known until run time. This has two +possible problems: + +<UL> +<LI>EVALUATE is slower than COMPILE, because a dictionary search is +required. +<LI>The current search order affects the outcome of EVALUATE. +</UL> +<P> + +In traditional threaded-code implementations, compilation is performed +by +<a href=dpans6.htm#6.1.0150>,</a> (comma). +This usage is not portable; it doesn't work for +subroutine-threaded, native code, or relocatable implementations. Use +of COMPILE, is portable. + +<P> + +In most systems it is possible to implement COMPILE, so it will generate +code that is optimized to the same extent as code that is generated by +the normal compilation process. However, in some implementations there +are two different <B>tokens</B> corresponding to a particular definition +name: the normal <B>execution token</B> that is used while interpreting +or with EXECUTE, and another <B>compilation token</B> that is used while +compiling. It is not always possible to obtain the compilation token +from the execution token. In these implementations, COMPILE, might not +generate code that is as efficient as normally compiled code. + +<P> + +<hr> +<a name=A.6.2.0970>A.6.2.0970 CONVERT</A> +<P> + +CONVERT may be defined as follows: + + +<PRE> + : CONVERT CHAR+ 65535 >NUMBER DROP ; +</PRE> + +<P> + +<hr> +<a name=A.6.2.1342>A.6.2.1342 ENDCASE</A> +<P> + +Typical use: + +<PRE> + : X ... + CASE + test1 OF ... ENDOF + testn OF ... ENDOF + ... ( default ) + ENDCASE ... + ; +</PRE> + +<P> + +<hr> +<a name=A.6.2.1343>A.6.2.1343 ENDOF</A> +<P> + +Typical use: + +<PRE> +: X ... + CASE + test1 OF ... ENDOF + testn OF ... ENDOF + ... ( default ) + ENDCASE ... +; +</PRE> + +<P> + +<hr> +<a name=A.6.2.1390>A.6.2.1390 EXPECT</A> +<P> + +Specification of positive integer counts (+n) for EXPECT allows some +implementors to continue their practice of using a zero or negative +value as a flag to trigger special behavior. Insofar as such behavior +is outside the Standard, Standard Programs cannot depend upon it, but +the Technical Committee doesn't wish to preclude it unnecessarily. +Since actual values are almost always small integers, no functionality +is impaired by this restriction. + +<P> + +<hr> +<a name=A.6.2.1850>A.6.2.1850 MARKER</A> +<P> + +As dictionary implementations have gotten more elaborate and in some +cases have used multiple address spaces, +<a href=dpans15.htm#15.6.2.1580>FORGET</a> has become prohibitively +difficult or impossible to implement on many Forth systems. MARKER +greatly eases the problem by making it possible for the system to +remember <B>landmark information</B> in advance that specifically marks +the spots where the dictionary may at some future time have to be +rearranged. + +<P> + +<hr> +<a name=A.6.2.1950>A.6.2.1950 OF</a> +<P> + +Typical use: + +<PRE> + : X ... + CASE + test1 OF ... ENDOF + testn OF ... ENDOF + ... ( default ) + ENDCASE ... + ; +</PRE> + +<P> + +<hr> +<a name=A.6.2.2000>A.6.2.2000 PAD</A> +<P> + +PAD has been available as scratch storage for strings since the earliest +Forth implementations. It was brought to our attention that many +programmers are reluctant to use PAD, fearing incompatibilities with +system uses. PAD is specifically intended as a programmer convenience, +however, which is why we documented the fact that no standard words use +it. + +<P> + +<hr> +<a name=A.6.2.2008>A.6.2.2008 PARSE</A> +<P> + +Typical use: <code>char PARSE ccc&lt;char&gt;</code> + +<P> + +The traditional Forth word for parsing is +<a href=dpans6.htm#6.1.2450>WORD</a>. PARSE solves the +following problems with WORD: + +<P> + +a) WORD always skips leading delimiters. This behavior is appropriate +for use by the text interpreter, which looks for sequences of non-blank +characters, but is inappropriate for use by words like ( , .( , and ." . +Consider the following (flawed) definition of .( : + + +<PRE> + : .( [CHAR] ) WORD COUNT TYPE ; IMMEDIATE +</PRE> + +<P> + +This works fine when used in a line like: + + +<PRE> + .( HELLO) 5 . +</PRE> + +<P> + +but consider what happens if the user enters an empty string: + + +<PRE> + .( ) 5 . +</PRE> + +<P> + +The definition of .( shown above would treat the ) as a leading +delimiter, skip it, and continue consuming characters until it located +another ) that followed a non-) character, or until the parse area was +empty. In the example shown, the 5 . would be treated as part of the +string to be printed. + +<P> + +With PARSE, we could write a correct definition of .( : + + +<PRE> + : .( [CHAR] ) PARSE TYPE ; IMMEDIATE +</PRE> + +<P> + +This definition avoids the <B>empty string</B> anomaly. + +<P> + +b) WORD returns its result as a counted string. This has four bad +effects: + +<P> + +1) The characters accepted by WORD must be copied from the input buffer +into a temporary buffer, in order to make room for the count character that +must be at the beginning of the counted string. The copy step is inefficient, +compared to PARSE, which leaves the string in the input buffer and doesn't +need to copy it anywhere. + +<P> + +2) WORD must be careful not to store too many characters into the +temporary buffer, thus overwriting something beyond the end of the buffer. +This adds to the overhead of the copy step. (WORD may have to scan a lot of +characters before finding the trailing delimiter.) + +<P> + +3) The count character limits the length of the string returned by WORD +to 255 characters (longer strings can easily be stored in blocks!). This +limitation does not exist for PARSE. + +<P> + +4) The temporary buffer is typically overwritten by the next use of WORD. +This introduces a temporal dependency; the value returned by WORD is only +valid for a limited duration. PARSE has a temporal dependency, too, related +to the lifetime of the input buffer, but that is less severe in most cases +than WORD's temporal dependency. + +<P> + +The behavior of WORD with respect to skipping leading delimiters is +useful for parsing blank-delimited names. Many system implementations +include an additional word for this purpose, similar to PARSE with +respect to the <B>c-addr u</B> return value, but without an explicit +delimiter argument (the delimiter set is implicitly <B>white space</B>), +and which does skip leading delimiters. A common description for this +word is: + + +<PRE> + PARSE-WORD ( &lt;spaces&gt;name -- c-addr u ) +</PRE> + +<P> + +Skip leading spaces and parse name delimited by a space. c-addr is the +address within the input buffer and u is the length of the selected string. +If the parse area is empty, the resulting string has a zero length. + +<P> + +If both PARSE and PARSE-WORD are present, the need for WORD is largely +eliminated. + +<P> + +<hr> +<a name=A.6.2.2030>A.6.2.2030 PICK</A> +<P> + +0 PICK is equivalent to +<a href=dpans6.htm#6.1.1290>DUP</a> and 1 PICK is equivalent to +<a href=dpans6.htm#6.1.1990>OVER</a>. + +<P> + +<hr> +<a name=A.6.2.2040>A.6.2.2040 QUERY</A> +<P> + +The function of QUERY may be performed with +<a href=dpans6.htm#6.1.0695>ACCEPT</a> and +<a href=dpans6.htm#6.1.1360>EVALUATE</a>. + +<P> + +<hr> +<a name=A.6.2.2125>A.6.2.2125 REFILL</A> +<P> + +This word is a useful generalization of +<a href=dpans6.htm#6.2.2040>QUERY</a>. Re-defining QUERY to +meet this specification would have broken existing code. REFILL is +designed to behave reasonably for all possible input sources. If the +input source is coming from the user, as with QUERY, REFILL could still +return a false value if, for instance, a communication channel closes so +that the system knows that no more input will be available. + +<P> + +<hr> +<a name=A.6.2.2150>A.6.2.2150 ROLL</A> +<P> + +2 ROLL is equivalent to +<a href=dpans6.htm#6.1.2160>ROT</a>, +1 ROLL is equivalent to +<a href=dpans6.htm#6.1.2260>SWAP</a> and 0 ROLL is +a null operation. + +<P> + +<hr> +<a name=A.6.2.2182>A.6.2.2182 SAVE-INPUT</A> +<P> + +SAVE-INPUT and +<a href=dpans6.htm#6.2.2148>RESTORE-INPUT</a> +allow the same degree of input source +repositioning within a text file as is available with +<a href=dpans7.htm#7.6.1.0800>BLOCK</a> input. +SAVE-INPUT and RESTORE-INPUT <B>hide the details</B> of the operations +necessary to accomplish this repositioning, and are used the same way +with all input sources. This makes it easier for programs to reposition +the input source, because they do not have to inspect several variables +and take different action depending on the values of those variables. + +<P> + +SAVE-INPUT and RESTORE-INPUT are intended for repositioning within a +single input source; for example, the following scenario is NOT allowed +for a Standard Program: + +<PRE> + : XX + SAVE-INPUT CREATE + S" RESTORE-INPUT" EVALUATE + ABORT" couldn't restore input" + ; +</PRE> + +<P> + +This is incorrect because, at the time RESTORE-INPUT is executed, the +input source is the string via +<a href=dpans6.htm#6.1.1360>EVALUATE</a>, which is not the same input +source that was in effect when SAVE-INPUT was executed. + +<P> + +The following code is allowed: + + +<PRE> +: XX + SAVE-INPUT CREATE + S" .( Hello)" EVALUATE + RESTORE-INPUT ABORT" couldn't restore input" +; +</PRE> + +<P> + +After EVALUATE returns, the input source specification is restored to +its previous state, thus SAVE-INPUT and RESTORE-INPUT are called with +the same input source in effect. + +<P> + +In the above examples, the EVALUATE phrase could have been replaced by a +phrase involving +<a href=dpans11.htm#11.6.1.1717>INCLUDE-FILE</a> +and the same rules would apply. + +<P> + +The Standard does not specify what happens if a program violates the +above rules. A Standard System might check for the violation and return +an exception indication from RESTORE-INPUT, or it might fail in an +unpredictable way. + +<P> + +The return value from RESTORE-INPUT is primarily intended to report the +case where the program attempts to restore the position of an input +source whose position cannot be restored. The keyboard might be such an +input source. + +<P> + +Nesting of SAVE-INPUT and RESTORE-INPUT is allowed. For example, the +following situation works as expected: + +<PRE> +: XX + SAVE-INPUT + S" f1" INCLUDED \ The file "f1" includes: + \ ... SAVE-INPUT ... RESTORE-INPUT ... + \ End of file "f1" + RESTORE-INPUT ABORT" couldn't restore input" +; +</PRE> + +<P> + +In principle, RESTORE-INPUT could be implemented to <B>always fail</B>, e.g.: + +<PRE> +: RESTORE-INPUT ( x1 ... xn n -- flag ) + 0 ?DO DROP LOOP TRUE +; +</PRE> + +<P> + +Such an implementation would not be useful in most cases. It would be +preferable for a system to leave SAVE-INPUT and RESTORE-INPUT undefined, +rather than to create a useless implementation. In the absence of the +words, the application programmer could choose whether or not to create +<B>dummy</B> implementations or to work-around the problem in some other +way. + +<P> + +Examples of how an implementation might use the return values from +SAVE-INPUT to accomplish the save/restore function: + +<P> + + +<PRE> +Input Source possible stack values +------------ --------------------- +block &gt;IN @ BLK @ 2 +EVALUATE &gt;IN @ 1 +keyboard &gt;IN @ 1 +text file &gt;IN @ lo-pos hi-pos 3 +</PRE> + +<P> + +These are examples only; a Standard Program may not assume any particular +meaning for the individual stack items returned by SAVE-INPUT. + +<P> + +<hr> +<a name=A.6.2.2290>A.6.2.2290 TIB</A> +<P> + +The function of TIB has been superseded by +<a href=dpans6.htm#6.1.2216>SOURCE</a>. + +<P> + +<hr> +<a name=A.6.2.2295>A.6.2.2295 TO</A> +<P> + +Historically, some implementations of TO have not explicitly parsed. +Instead, they set a mode flag that is tested by the subsequent execution +of name. ANS Forth explicitly requires that TO must parse, so that TO's +effect will be predictable when it is used at the end of the parse area. + +<P> + +Typical use: <code>x TO name</code> + +<P> + +<hr> +<a name=A.6.2.2298>A.6.2.2298 TRUE</A> +<P> + +TRUE is equivalent to the phrase <code>0 0=</code>. + +<P> + +<hr> +<a name=A.6.2.2405>A.6.2.2405 VALUE</A> +<P> + +Typical use: + +<PRE> +0 VALUE DATA + +: EXCHANGE ( n1 -- n2 ) DATA SWAP TO DATA ; +</PRE> + +<P> + +EXCHANGE leaves n1 in DATA and returns the prior value n2. + +<P> + +<hr> +<a name=A.6.2.2440>A.6.2.2440 WITHIN</A> +<P> + +We describe WITHIN without mentioning circular number spaces (an +undefined term) or providing the code. Here is a number line with the +overflow point (o) at the far right and the underflow point (u) at the +far left: + +<PRE> +u--------------------------------------------------------------o +</PRE> + +<P> + +There are two cases to consider: either the n2|u2..n3|u3 range straddles +the overflow/underflow points or it does not. Lets examine the +non-straddle case first: + +<PRE> +u-------------------[.....................)------------------------o +</PRE> + +<P> + +The [ denotes n2|u2, the ) denotes n3|u3, and the dots and [ are numbers +WITHIN the range. n3|u3 is greater than n2|u2, so the following tests +will determine if n1|u1 is WITHIN n2|u2 and n3|u3: + +<p> +<pre> + n2|u2 &lt; n1|u1 and n1|u1 &lt; n3|u3. +</pre> +<P> + +In the case where the comparison range straddles the overflow/underflow +points: +<P> + +u...............)-----------------------------[........................o + +<p> + +n3|u3 is less than n2|u2 and the following tests will determine if n1|u1 is +WITHIN n2|u2 and n3|u3: + +<P> +<pre> + n2|u2 &gt; n1|u1 and n1|u1 &gt; n3|u3. +</pre> +<P> + + +WITHIN must work for both signed and unsigned arguments. One obvious +implementation does not work: + +<PRE> +: WITHIN ( test low high -- flag ) + &gt;R OVER &lt; 0= ( test flag1 ) + SWAP R&gt; &lt; ( flag1 flag2 ) + AND +; +</PRE> + +<P> + +Assume two's-complement arithmetic on a 16-bit machine, and consider the +following test: + + +<PRE> + 33000 32000 34000 WITHIN +</PRE> + +<P> + +The above implementation returns false for that test, even though the +unsigned number 33000 is clearly within the range {{32000 .. 34000}}. + +<P> + +The problem is that, in the incorrect implementation, the signed +comparison +&lt; gives the wrong answer when 32000 is compared to 33000, +because when those numbers are treated as signed numbers, 33000 is +treated as negative 32536, while 32000 remains positive. + +<P> + +Replacing &lt; with +<a href=dpans6.htm#6.1.2340>U&lt;</a> +in the above implementation makes it work with +unsigned numbers, but causes problems with certain signed number ranges; +in particular, the test: + + +<PRE> + 1 -5 5 WITHIN +</PRE> + +<P> + +would give an incorrect answer. + +<P> + +For two's-complement machines that ignore arithmetic overflow (most +machines), the following implementation works in all cases: + +<PRE> +: WITHIN ( test low high -- flag ) OVER - &gt;R - R&gt; U&lt; ; + +</PRE> +<P> + +<hr> +<a name=A.6.2.2530>A.6.2.2530 [COMPILE]</A> +<P> + +Typical use: <code>: name2 ... [COMPILE] name1 ... ; IMMEDIATE</code> + +<P> + +<hr> +<a name=A.6.2.2535>A.6.2.2535 \</A> +<P> + +Typical use: <code>5 CONSTANT THAT \ THIS IS A COMMENT ABOUT THAT</code> + +<P> + +<hr> +<a href=dpans.htm#toc><IMG src="up.gif" ></A> Table of Contents +<BR> +<a href=dpansa7.htm><IMG src="right.gif" ></A> +Next Section +<P> +</BODY> +</HTML> diff --git a/mwmouse/sources/AnsForth/DPANSA7.HTM b/mwmouse/sources/AnsForth/DPANSA7.HTM @@ -0,0 +1,91 @@ +<HTML><HEAD> +<TITLE>DPANS94</TITLE> +<link disabled rel="stylesheet" href="mpexc6.css"> +<style>@import url(mpexc6.css);</style> +</head> + +<BODY> +<table width=100%> +<tr> +<td align=left> +<a href=dpansa6.htm><img src=left.gif + width=26 height=26 align=ALIGN border=0></a> +<a href=dpansa8.htm><img src=right.gif + width=26 height=26 align=ALIGN border=0></a> +</td> +<td align=right> +<a href=dpans.htm#toc><img src=up.gif + width=26 height=26 align=ALIGN border=0></a> +<a name=A.7>Table of Contents</a> +</td> +</tr> +</table> +<p> +<hr size=4> + + +<H2>A.7 The optional Block word set</H2> + +Early Forth systems ran stand-alone, with no host OS. Blocks of 1024 +bytes were designed as a convenient unit of disk, and most native Forth +systems still use them. It is relatively easy to write a native disk +driver that maps head/track/sector addresses to block numbers. Such +disk drivers are extremely fast in comparison with conventional +file-oriented operating systems, and security is high because there is +no reliance on a disk map. + +<P> + +Today many Forth implementations run under host operating systems, +because the compatibility they offer the user outweighs the performance +overhead. Many people who use such systems prefer using host OS files +only; however, people who use both native and non-native Forths need a +compatible way of accessing disk. The Block Word set includes the most +common words for accessing program source and data on disk. + +<P> + +In order to guarantee that Standard Programs that need access to mass +storage have a mechanism appropriate for both native and non-native +implementations, ANS Forth requires that the Block word set be available +if any mass storage facilities are provided. On non-native +implementations, blocks normally reside in host OS files. + +<P> + +<hr> +<a name=A.7.2> +<H3>A.7.2 Additional terms</H3> +</a> + +<DL><DT><B>block</B> +<DD>Many Forth systems use blocks to contain program source. Conventionally +such blocks are formatted for editing as 16 lines of 64 characters. +Source blocks are often referred to as <B>screens</B>.</DL> + +<P> + +<hr> +<a name=A.7.6> +<H3>A.7.6 Glossary</H3> +</a> + + +<hr> +<a name=A.7.6.2.2190> +A.7.6.2.2190 SCR +</a> +<P> + +SCR is short for screen. + +<P> + +<hr> +<A href=dpans.htm#toc><IMG src="up.gif" ></A> Table of Contents +<BR> +<A href=dpansa8.htm><IMG src="right.gif" ></A> +Next Section +<P> +</BODY> +</HTML> diff --git a/mwmouse/sources/AnsForth/DPANSA8.HTM b/mwmouse/sources/AnsForth/DPANSA8.HTM @@ -0,0 +1,164 @@ +<HTML><HEAD> +<TITLE>DPANS94</TITLE> +<link disabled rel="stylesheet" href="mpexc6.css"> +<style>@import url(mpexc6.css);</style> +</head> + +<BODY> +<table width=100%> +<tr> +<td align=left> +<a href=dpansa7.htm><img src=left.gif + width=26 height=26 align=ALIGN border=0></a> +<a href=dpansa9.htm><img src=right.gif + width=26 height=26 align=ALIGN border=0></a> +</td> +<td align=right> +<a href=dpans.htm#toc><img src=up.gif + width=26 height=26 align=ALIGN border=0></a> +<a name=A.8>Table of Contents</a> +</td> +</tr> +</table> +<p> +<hr size=4> + +<H2>A.8 The optional Double-Number word set</H2> + +Forth systems on 8-bit and 16-bit processors often find it necessary to +deal with double-length numbers. But many Forths on small embedded +systems do not, and many users of Forth on systems with a cell size of +32-bits or more find that the necessity for double-length numbers is +much diminished. Therefore, we have factored the words that manipulate +double-length entities into this optional word set. + +<P> + +Please note that the naming convention used in this word set conveys +some important information: + +<P> + +1. Words whose names are of the form 2xxx deal with cell pairs, where +the relationship between the cells is unspecified. They may be +two-vectors, double-length numbers, or any pair of cells that it is +convenient to manipulate together. + +<P> + +2. Words with names of the form Dxxx deal specifically with +double-length integers. + +<P> + +3. Words with names of the form Mxxx deal with some combination of +single and double integers. The order in which these appear on the +stack is determined by long-standing common practice. + +<P> + +Refer to +<a href=dpansa3.htm#A.3.1>A.3.1</a> for a discussion of data types in Forth. + +<P> + +<hr> +<a name=A.8.6> +<H3>A.8.6 Glossary</H3> +</a> + + +<hr> +<a name=A.8.6.1.0360>A.8.6.1.0360 2CONSTANT</A> +<P> + +Typical use: <code>x1 x2 2CONSTANT name</code> + +<P> + +<hr> +<a name=A.8.6.1.0390>A.8.6.1.0390 2LITERAL</A> +<P> + +Typical use: <code>: X ... [ x1 x2 ] 2LITERAL ... ;</code> + +<P> + +<hr> +<a name=A.8.6.1.0440>A.8.6.1.0440 2VARIABLE</A> +<P> + +Typical use: <code>2VARIABLE name</code> + +<P> + +<hr> +<a name=A.8.6.1.1070>A.8.6.1.1070 D.R</A> +<P> + +In D.R, the <B>R</B> is short for RIGHT. + +<P> + +<hr> +<a name=A.8.6.1.1090>A.8.6.1.1090 D2*</A> +<P> +<code> +See: +<a href=dpansa6.htm#A.6.1.0320>A.6.1.0320 2*</a> for applicable +discussion. +</code> +<P> + +<hr> +<a name=A.8.6.1.1100>A.8.6.1.1100 D2/</A> +<P> +<code> +See: +<a href=dpansa6.htm#A.6.1.0330>A.6.1.0330 2/</a> for applicable +discussion. +</code> +<P> + +<hr> +<a name=A.8.6.1.1140>A.8.6.1.1140 D&gt;S</A> +<P> + +There exist number representations, e.g., the sign-magnitude +representation, where reduction from double- to single-precision cannot +simply be done with +<a href=dpans6.htm#6.1.1260>DROP</a>. +This word, equivalent to DROP on two's +complement systems, desensitizes application code to number +representation and facilitates portability. + +<P> + +<hr> +<a name=A.8.6.1.1820>A.8.6.1.1820 M*/</A> +<P> + +M*/ was once described by Chuck Moore as the most useful arithmetic +operator in Forth. It is the main workhorse in most computations +involving double-cell numbers. Note that some systems allow signed +divisors. This can cost a lot in performance on some CPUs. The +requirement for a positive divisor has not proven to be a problem. + +<P> + +<hr> +<a name=A.8.6.1.1830>A.8.6.1.1830 M+</A> +<P> + +M+ is the classical method for integrating. + +<P> + +<hr> +<a href=dpans.htm#toc><IMG src="up.gif" ></A> Table of Contents +<BR> +<a href=dpansa9.htm><IMG src="right.gif" ></A> +Next Section +<P> +</BODY> +</HTML> diff --git a/mwmouse/sources/AnsForth/DPANSA9.HTM b/mwmouse/sources/AnsForth/DPANSA9.HTM @@ -0,0 +1,294 @@ +<HTML><HEAD> +<TITLE>DPANS94</TITLE> +<link disabled rel="stylesheet" href="mpexc6.css"> +<style>@import url(mpexc6.css);</style> +</head> + +<BODY> +<table width=100%> +<tr> +<td align=left> +<a href=dpansa8.htm><img src=left.gif + width=26 height=26 align=ALIGN border=0></a> +<a href=dpansa10.htm><img src=right.gif + width=26 height=26 align=ALIGN border=0></a> +</td> +<td align=right> +<a href=dpans.htm#toc><img src=up.gif + width=26 height=26 align=ALIGN border=0></a> +<a name=A.9>Table of Contents</a> +</td> +</tr> +</table> +<p> +<hr size=4> + +<H2>A.9 The optional Exception word set</H2> + +<a href=dpans9.htm#9.6.1.0875>CATCH</a> and +<a href=dpans9.htm#9.6.1.2275>THROW</a> +provide a reliable mechanism for handling exceptions, +without having to propagate exception flags through multiple levels of +word nesting. It is similar in spirit to the <B>non-local return</B> +mechanisms of many other languages, such as C's setjmp() and longjmp(), +and LISP's CATCH and THROW. In the Forth context, THROW may be +described as a <B>multi-level</b> +<a href=dpans6.htm#6.1.1380>EXIT</a>, +with CATCH marking a location to +which a THROW may return. + +<P> + +Several similar Forth <B>multi-level EXIT</B> exception-handling schemes +have been described and used in past years. It is not possible to +implement such a scheme using only standard words (other than CATCH and +THROW), because there is no portable way to <B>unwind</B> the return +stack to a predetermined place. + +<P> + +THROW also provides a convenient implementation technique for the +standard words +<a href=dpans6.htm#6.1.0670>ABORT</a> and +<a href=dpans6.htm#6.1.0680>ABORT"</a>, +allowing an application to define, +through the use of CATCH, the behavior in the event of a system ABORT. + +<P> + +This sample implementation of CATCH and THROW uses the non-standard +words described below. They or their equivalents are available in many +systems. Other implementation strategies, including directly saving the +value of +<a href=dpans6.htm#6.1.1200>DEPTH</a>, +are possible if such words are not available. + +<P> + +SP@ ( -- addr ) returns the +address corresponding to the top of data stack. + +<P> + +SP! ( addr -- ) sets the stack pointer to addr, thus restoring the stack +depth to the same depth that existed just before addr was acquired by +executing SP@. + +<P> + +RP@ ( -- addr ) returns the address corresponding to the top of return +stack. + +<P> + +RP! ( addr -- ) sets the return stack pointer to addr, thus restoring the +return stack depth to the same depth that existed just before addr was +acquired by executing RP@. + +<PRE> +VARIABLE HANDLER 0 HANDLER ! \ last exception handler + +: CATCH ( xt -- exception# | 0 ) \ return addr on stack + SP@ >R ( xt ) \ save data stack pointer + HANDLER @ >R ( xt ) \ and previous handler + RP@ HANDLER ! ( xt ) \ set current handler + EXECUTE ( ) \ execute returns if no THROW + R> HANDLER ! ( ) \ restore previous handler + R> DROP ( ) \ discard saved stack ptr + 0 ( 0 ) \ normal completion +; + +: THROW ( ??? exception# -- ??? exception# ) + ?DUP IF ( exc# ) \ 0 THROW is no-op + HANDLER @ RP! ( exc# ) \ restore prev return stack + R> HANDLER ! ( exc# ) \ restore prev handler + R> SWAP >R ( saved-sp ) \ exc# on return stack + SP! DROP R> ( exc# ) \ restore stack + \ Return to the caller of CATCH because return + \ stack is restored to the state that existed + \ when CATCH began execution +THEN +; +</PRE> + +<P> + +In a multi-tasking system, the HANDLER variable should be in the +per-task variable area (i.e., a user variable). + +<P> + +This sample implementation does not explicitly handle the case in which +CATCH has never been called (i.e., the ABORT behavior). One solution is +to add the following code after the IF in THROW: + + +<PRE> + HANDLER @ 0= IF ( empty the stack ) QUIT THEN +</PRE> + +<P> + +Another solution is to execute CATCH within +<a href=dpans6.htm#6.1.2050>QUIT</a>, so that there is +always an <B>exception handler of last resort</B> present. For example: + +<PRE> +: QUIT ( empty the return stack and ) + ( set the input source to the user input device ) + POSTPONE [ + BEGIN + REFILL + WHILE + ['] INTERPRET CATCH + CASE + 0 OF STATE @ 0= IF ." OK" THEN CR ENDOF + -1 OF ( Aborted) ENDOF + -2 OF ( display message from ABORT" ) ENDOF + ( default ) DUP ." Exception # " . + ENDCASE + REPEAT BYE +; +</PRE> + +<P> + +This example assumes the existance of a system-implementation word +INTERPRET that embodies the text interpreter semantics described in +<a href=dpans3.htm#3.4>3.4</a> +The Forth text interpreter. Note that this implementation of QUIT +automatically handles the emptying of the stack and return stack, due to +THROW's inherent restoration of the data and return stacks. Given this +definition of QUIT, it's easy to define: + + +<PRE> + : ABORT -1 THROW ; +</PRE> + +<P> + +In systems with other stacks in addition to the data and return stacks, +the implementation of CATCH and THROW must save and restore those stack +pointers as well. Such an <B>extended version</B> can be built on top +of this basic implementation. For example, with another stack pointer +accessed with FP@ and FP! only CATCH needs to be redefined: + +<PRE> +: CATCH ( xt -- exception# | 0 ) + FP@ >R CATCH R> OVER IF FP! ELSE DROP THEN ; +</PRE> + +<P> + +No change to THROW is necessary in this case. Note that, as with all +redefinitions, the redefined version of CATCH will only be available to +definitions compiled after the redefinition of CATCH. + +<P> + +CATCH and THROW provide a convenient way for an implementation to +<B>clean up</B> the state of open files if an exception occurs during +the text interpretation of a file with +<a href=dpans11.htm#11.6.1.1717>INCLUDE-FILE</a>. The implementation +of INCLUDE-FILE may guard (with CATCH) the word that performs the text +interpretation, and if CATCH returns an exception code, the file may be +closed and the exception reTHROWn so that the files being included at an +outer nesting level may be closed also. Note that the Standard allows, +but does not require, INCLUDE-FILE to close its open files if an +exception occurs. However, it does require INCLUDE-FILE to unnest the +input source specification if an exception is THROWn. + +<P> + +<hr> +<a name=A.9.3> +<H3>A.9.3 Additional usage requirements</H3> +</a> + +One important use of an exception handler is to maintain program control +under many conditions which +<a href=dpans6.htm#6.1.0670>ABORT</a>. This is practicable only if a range +of codes is reserved. Note that an application may overload many +standard words in such a way as to +<a href=dpans9.htm#9.6.1.2275>THROW</a> ambiguous conditions not +normally THROWn by a particular system. + +<P> + +<hr> +<a name=A.9.3.6> +<H4>A.9.3.6 Exception handling</H4> +</a> + +The method of accomplishing this coupling is implementation dependent. +For example, +<a href=dpans7.htm#7.6.1.1790>LOAD</a> +could <B>know</B> about +<a href=dpans9.htm#9.6.1.0875>CATCH</a> and +<a href=dpans9.htm#9.6.1.2275>THROW</a> (by using +CATCH itself, for example), or CATCH and THROW could <B>know</B> about +LOAD (by maintaining input source nesting information in a data +structure known to THROW, for example). Under these circumstances it is +not possible for a Standard Program to define words such as LOAD in a +completely portable way. + +<P> + +<hr> +<a name=A.9.6> +<H3>A.9.6 Glossary</H3> +</a> + + +<hr> +<a name=A.9.6.1.2275>A.9.6.1.2275 THROW</A> +<P> + +If THROW is executed with a non zero argument, the effect is as if the +corresponding +<a href=dpans9.htm#9.6.1.0875>CATCH</a> +had returned it. In that case, the stack depth is +the same as it was just before CATCH began execution. The values of the +i*x stack arguments could have been modified arbitrarily during the +execution of xt. In general, nothing useful may be done with those +stack items, but since their number is known (because the stack depth is +deterministic), the application may +<a href=dpans6.htm#6.1.1260>DROP</a> them to return to a predictable +stack state. + +<P> + +Typical use: + +<PRE> +: could-fail ( -- char ) + KEY DUP [CHAR] Q = IF 1 THROW THEN ; + +: do-it ( a b -- c) 2DROP could-fail ; + +: try-it ( --) + 1 2 ['] do-it CATCH IF ( x1 x2 ) + 2DROP ." There was an exception" CR + ELSE ." The character was " EMIT CR + THEN +; + +: retry-it ( -- ) + BEGIN 1 2 ['] do-it CATCH WHILE + ( x1 x2) 2DROP ." Exception, keep trying" CR + REPEAT ( char ) + ." The character was " EMIT CR +; +</PRE> + +<P> + +<hr> +<a href=dpans.htm#toc><IMG src="up.gif" ></A> Table of Contents +<BR> +<a href=dpansa10.htm><IMG src="right.gif" ></A> +Next Section +<P> +</BODY> +</HTML> diff --git a/mwmouse/sources/AnsForth/DPANSB.HTM b/mwmouse/sources/AnsForth/DPANSB.HTM @@ -0,0 +1,227 @@ +<HTML><HEAD> +<TITLE>DPANS94</TITLE> +<link disabled rel="stylesheet" href="mpexc6.css"> +<style>@import url(mpexc6.css);</style> +</head> + +<BODY> +<table width=100%> +<tr> +<td align=left> +<a href=dpansa17.htm><img src=left.gif + width=26 height=26 align=ALIGN border=0></a> +<a href=dpansc.htm><img src=right.gif + width=26 height=26 align=ALIGN border=0></a> +</td> +<td align=right> +<a href=dpans.htm#toc><img src=up.gif + width=26 height=26 align=ALIGN border=0></a> +<a name=B.>Table of Contents</a> +</td> +</tr> +</table> +<p> +<hr size=4> + +<H1>B. Bibliography (informative annex)</H1> + + +<hr> +<A name=Industry.standards> +<H3>Industry standards</H3> +</a> + +Forth-77 Standard, Forth Users Group, FST-780314. + +<P> + +Forth-78 Standard, +Forth International Standards Team. + +<P> + +Forth-79 Standard, Forth Standards Team. + +<P> + +Forth-83 Standard and Appendices, Forth Standards Team. + +<P> + +The standards referenced in this section were developed by the Forth +Standards Team, a volunteer group which included both implementors and +users. This was a volunteer organization operating under its own +charter and without any formal ties to ANSI, IEEE or any similar +standards body. Several members of the Forth Standards Team have also +been members of the X3J14 Technical Committee. + +<P> + + +<hr> +<a name=Books> +<H3>Books</H3> +</a> + +Brodie, L. <I>Starting FORTH (2nd ed).</I> +Englewood Cliffs, NJ: Prentice Hall, +1987. + +<P> + +Brodie, L. <I>Thinking FORTH.</I> +Englewood Cliffs, NJ: Prentice Hall, 1984. + +<P> + +Feierbach, G. and Thomas, P. <I>Forth Tools & Applications.</I> +Reston, VA: Reston Computer Books, 1985. + +<P> + +Haydon, Dr. Glen B. <I>All About FORTH, Third Edition.</I> +La Honda, CA: 1990. + +<P> + +Kelly, Mahlon G. and Spies, N. <I>FORTH: A Text and Reference.</I> +Englewood Cliffs, NJ: Prentice Hall, 1986. + +<P> + +Knecht, K. <i>Introduction to Forth.</i> Indiana: Howard Sams & Co., +1982. + +<P> + +Koopman, P. <I>Stack Computers, The New Wave.</I> +Chichester, West Sussex, +England: Ellis Horwood Ltd. 1989 + +<P> + +Martin, Thea, editor. <I>A Bibliography of Forth References, Third +Edition.</I> Rochester, New York: Institute of Applied Forth Research, +1987. + +<P> + +McCabe, C. K. <I>Forth Fundamentals (2 volumes/).</I> +Oregon: Dilithium Press, 1983. + +<P> + +Pountain, R. <I>Object Oriented Forth.</I> +London, England: Academic Press, 1987. + +<P> + +Ouverson, Marlin, editor. <I>Dr. Dobbs Toolbook of Forth.</I> +Redwood City, CA: M&T Press, Vol. 1, 1986; Vol. 2, 1987. + +<P> + +Terry, J. D. <I>Library of Forth Routines and Utilities.</I> +New York: Shadow Lawn Press, 1986 + +<P> + +Tracy, M. and Anderson, A. <I>Mastering FORTH (revised ed).</I> +New York: Brady Books, 1989. + +<P> + +Winfield, A. <I>The Complete Forth.</I> +New York: Wiley Books, 1983. + +<P> + +<hr> +<a name=Journals> +<H3>Journals, magazines and newsletters</H3> +</a> + +Forsley, Lawrence P., Conference Chairman. Rochester Forth Conference +Proceedings. Rochester, New York: Institute of Applied Forth Research, +1981 to present. + +<P> + +Forsley, Lawrence P., Editor-in-Chief. The Journal of Forth Application +and Research. Rochester, New York: Institute of Applied Forth Research, +1983 to present. + +<P> + +Frenger, Paul, editor. SIGForth Newsletter. New York, NY: Association +for Computing Machinery, 1989 to present. + +<P> + +Ouverson, Marlin, editor. Forth Dimensions. San Jose, CA: The Forth +Interest Group, 1978 to present. + +<P> + +Reiling, Robert, editor. FORML Conference Proceedings. San Jose, CA: +The Forth Interest Group, 1980 to present. + +<P> + +Ting, Dr. C. H., editor. More on Forth Engines. San Mateo, CA: +Offete Enterprises, 1986 to present. + +<P> + + +<hr> +<A name=Selected.articles> +<H3>Selected articles</H3> +</a> + +Hayes, J.R. <B>Postpone</B> Proceedings of the 1989 Rochester Forth +Conference. Rochester, New York: Institute for Applied Forth Research, +1989. + +<P> + +Kelly, Guy M. <B>Forth.</B> McGraw-Hill Personal Computer Programming +Encyclopedia - Languages and Operation Systems. New York: McGraw-Hill, +1985. + +<P> + +Kogge, P. M. <B>An Architectural Trail to Threaded Code Systems.</B> +IEEE Computer (March, 1982). + +<P> + +Moore, C. H. <B>The Evolution of FORTH - An Unusual Language.</B> Byte +(August 1980). + +<P> + +Rather, E. D. <B>Forth Programming Language.</B> Encyclopedia of +Physical Science & Technology (Vol. 5). New York: Academic Press, +1987. + +<P> + +Rather, E. D. <B>FORTH.</B> Computer Programming Management. Auerbach +Publishers, Inc., 1985. + +<P> + +Rather, E. D.; Colburn, D. R.; Moore, C. H. <B>The Evolution of +FORTH.</B> ACM SIGPLAN Notices. (Vol. 28, No. 3, March 1993). + + + +<hr> +<A href=dpans.htm#toc><IMG src="up.gif" ></A> Table of Contents +<BR> +<A href=dpansc.htm><IMG src="right.gif" ></A> +Next Section +<P> +</BODY> +</HTML> diff --git a/mwmouse/sources/AnsForth/DPANSC.HTM b/mwmouse/sources/AnsForth/DPANSC.HTM @@ -0,0 +1,1044 @@ +<HTML><HEAD> +<TITLE>DPANS94</TITLE> +<link disabled rel="stylesheet" href="mpexc6.css"> +<style>@import url(mpexc6.css);</style> +</head> + +<BODY> +<table width=100%> +<tr> +<td align=left> +<a href=dpansb.htm><img src=left.gif + width=26 height=26 align=ALIGN border=0></a> +<a href=dpansd.htm><img src=right.gif + width=26 height=26 align=ALIGN border=0></a> +</td> +<td align=right> +<a href=dpans.htm#toc><img src=up.gif + width=26 height=26 align=ALIGN border=0></a> +<a name=C.>Table of Contents</a> +</td> +</tr> +</table> +<p> +<hr size=4> + +<H1>C. Perspective (informative annex)</H1> + +The purpose of this section is to provide an informal overview of Forth as a +language, illustrating its history, most prominent features, usage, and common +implementation techniques. Nothing in this section should be considered as +binding upon either implementors or users. A list of books and articles is +given in Annex B for those interested in learning more about Forth. + +<P> + +<hr> +<A name=C.1> +<H2>C.1 Features of Forth</H2> +</a> + +Forth provides an interactive programming environment. Its primary uses have +been in scientific and industrial applications such as instrumentation, +robotics, process control, graphics and image processing, artificial +intelligence and business applications. The principal advantages of Forth +include rapid, interactive software development and efficient use of computer +hardware. + +<P> + +Forth is often spoken of as a language because that is its most visible +aspect. But in fact, Forth is both more and less than a conventional +programming language: more in that all the capabilities normally associated +with a large portfolio of separate programs (compilers, editors, etc.) are +included within its range and less in that it lacks (deliberately) the complex +syntax characteristic of most high-level languages. + +<P> + +The original implementations of Forth were stand-alone systems that included +functions normally performed by separate operating systems, editors, +compilers, assemblers, debuggers and other utilities. A single simple, +consistent set of rules governed this entire range of capabilities. Today, +although very fast stand-alone versions are still marketed for many +processors, there are also many versions that run co-resident with +conventional operating systems such as MS-DOS and UNIX. + +<P> + +Forth is not derived from any other language. As a result, its appearance and +internal characteristics may seem unfamiliar to new users. But Forth's +simplicity, extreme modularity, and interactive nature offset the initial +strangeness, making it easy to learn and use. A new Forth programmer must +invest some time mastering its large command repertoire. After a month or so +of full-time use of Forth, that programmer could understand more of its +internal working than is possible with conventional operating systems and +compilers. + +<P> + +The most unconventional feature of Forth is its extensibility. The +programming process in Forth consists of defining new <B>words</B> - +actually new commands in the language. These may be defined in terms of +previously defined words, much as one teaches a child concepts by +explaining them in terms of previously understood concepts. Such words +are called <B>high-level definitions</B>. Alternatively, new words may +also be defined in assembly code, since most Forth implementations +include an assembler for the host processor. + +<P> + +This extensibility facilitates the development of special application +languages for particular problem areas or disciplines. + +<P> + +Forth's extensibility goes beyond just adding new commands to the language. +With equivalent ease, one can also add new kinds of words. That is, one may +create a word which itself will define words. In creating such a defining +word the programmer may specify a specialized behavior for the words it will +create which will be effective at compile time, at run-time, or both. This +capability allows one to define specialized data types, with complete control +over both structure and behavior. Since the run-time behavior of such words +may be defined either in high-level or in code, the words created by this new +defining word are equivalent to all other kinds of Forth words in performance. +Moreover, it is even easy to add new compiler directives to implement special +kinds of loops or other control structures. + +<P> + +Most professional implementations of Forth are written in Forth. Many +Forth systems include a <B>meta-compiler</B> which allows the user to +modify the internal structure of the Forth system itself. + +<P> + +<hr> +<A name=C.2> +<H2>C.2 History of Forth</H2> +</a> + +Forth was invented by Charles H. Moore. A direct outgrowth of Moore's work in +the 1960's, the first program to be called Forth was written in about 1970. +The first complete implementation was used in 1971 at the National Radio +Astronomy Observatory's 11-meter radio telescope in Arizona. This system was +responsible for pointing and tracking the telescope, collecting data and +recording it on magnetic tape, and supporting an interactive graphics terminal +on which an astronomer could analyze previously recorded data. The +multi-tasking nature of the system allowed all these functions to be performed +concurrently, without timing conflicts or other interference - a very advanced +concept for that time. + +<P> + +The system was so useful that astronomers from all over the world began asking +for copies. Its use spread rapidly, and in 1976 Forth was adopted as a +standard language by the International Astronomical Union. + +<P> + +In 1973, Moore and colleagues formed FORTH, Inc. to explore commercial +uses of the language. FORTH, Inc. developed multi-user versions of +Forth on minicomputers for diverse projects ranging from data bases to +scientific applications such as image processing. In 1977, FORTH, Inc. +developed a version for the newly introduced 8-bit microprocessors +called <B>microFORTH</B>, which was successfully used in embedded +microprocessor applications in the United States, Britain and Japan. + +<P> + +Stimulated by the volume marketing of microFORTH, a group of computer +hobbyists in Northern California became interested in Forth, and in 1978 +formed the Forth Interest Group (FIG). They developed a simplified model +which they implemented on several microprocessors and published listings and +disks at very low cost. Interest in Forth spread rapidly, and today there are +chapters of the Forth Interest Group throughout the U.S. and in over fifteen +countries. + +<P> + +By 1980, a number of new Forth vendors had entered the market with versions of +Forth based upon the FIG model. Primarily designed for personal computers, +these relatively inexpensive Forth systems have been distributed very widely. + +<P> + + +<hr> +<A name=C.3> +<H2>C.3 Hardware implementations of Forth</H2> +</a> + +The internal architecture of Forth simulates a computer with two stacks, a set +of registers, and other standardized features. As a result, it was almost +inevitable that someone would attempt to build a hardware representation of an +actual Forth computer. + +<P> + +In the early 1980's, Rockwell produced a 6502-variant with Forth primitives in +on-board ROM, the Rockwell 65F11. This chip has been used successfully in +many embedded microprocessor applications. In the mid-1980's Zilog developed +the z8800 (Super8) which offered ENTER (nest), EXIT (unnest) and NEXT in +microcode. + +<P> + +In 1981, Moore undertook to design a chip-level implementation of the Forth +virtual machine. Working first at FORTH, Inc. and subsequently with the +start-up company NOVIX, formed to develop the chip, Moore completed the design +in 1984, and the first prototypes were produced in early 1985. More recently, +Forth processors have been developed by Harris Semiconductor Corp., Johns +Hopkins University, and others. + +<P> + + + +<hr> +<A name=C.4> +<H2>C.4 Standardization efforts</H2> +</a> + +The first major effort to standardize Forth was a meeting in Utrecht in 1977. +The attendees produced a preliminary standard, and agreed to meet the +following year. The 1978 meeting was also attended by members of the newly +formed Forth Interest Group. In 1979 and 1980 a series of meetings attended +by both users and vendors produced a more comprehensive standard called +Forth-79. + +<P> + +Although Forth-79 was very influential, many Forth users and vendors found +serious flaws in it, and in 1983 a new standard called Forth-83 was released. + +<P> + +Encouraged by the widespread acceptance of Forth-83, a group of users and +vendors met in 1986 to investigate the feasibility of an American National +Standard. The X3J14 Technical Committee for ANS Forth held its first meeting +in 1987. This Standard is the result. + +<P> + + +<hr> +<A name=C.5> +<H2>C.5 Programming in Forth</H2> +</a> + +Forth is an English-like language whose elements (called <B>words</B>) +are named data items, procedures, and defining words capable of creating +data items with customized characteristics. Procedures and defining +words may be defined in terms of previously defined words or in machine +code, using an embedded assembler. + +<P> + +Forth <B>words</B> are functionally analogous to subroutines in other +languages. They are also equivalent to commands in other languages - +Forth blurs the distinction between linguistic elements and functional +elements. + +<P> + +Words are referred to either from the keyboard or in program source by +name. As a result, the term <B>word</B> is applied both to program (and +linguistic) units and to their text names. In parsing text, Forth +considers a word to be any string of characters bounded by spaces. +There are a few special characters that cannot be included in a word or +start a word: space (the universal delimiter), CR (which ends terminal +input), and backspace or DEL (for backspacing during keyboard input). +Many groups adopt naming conventions to improve readability. Words +encountered in text fall into three categories: defined words (i.e., +Forth routines), numbers, and undefined words. For example, here are +four words: + + +<PRE> + <a href=dpans6.htm#6.1.1650>HERE</a> <a href=dpans6.htm#6.1.1250>DOES></a> <a href=dpans6.htm#6.1.0010>!</a> 8493 +</PRE> + +<P> + +The first three are standard-defined words. This means that they have +entries in Forth's dictionary, described below, explaining what Forth is +to do when these words are encountered. The number <B>8493</B> will +presumably not be found in the dictionary, and Forth will convert it to +binary and place it on its push-down stack for parameters. When Forth +encounters an undefined word and cannot convert it to a number, the word +is returned to the user with an exception message. + +<P> + +Architecturally, Forth words adhere strictly to the principles of +<B>structured programming</B>: + +<UL> +<LI>Words must be defined before they are used. +<LI>Logical flow is restricted to sequential, conditional, and +iterative patterns. Words are included to implement the most useful +program control structures. +<LI>The programmer works with many small, independent modules +(words) for maximum testability and reliability. +</UL> +<P> + +Forth is characterized by five major elements: a dictionary, two +push-down stacks, interpreters, an assembler, and virtual storage. +Although each of these may be found in other systems, the combination +produces a synergy that yields a powerful and flexible system. + +<P> + + +<hr> +<A name=C.5.1> +<H3>C.5.1 The Forth dictionary</H3> +</a> + +A Forth program is organized into a dictionary that occupies most of the +memory used by the system. This dictionary is a threaded list of +variable-length items, each of which defines a word. The content of +each definition depends upon the type of word (data item, constant, +sequence of operations, etc.). The dictionary is extensible, usually +growing toward high memory. On some multi-user systems individual users +have private dictionaries, each of which is connected to a shared system +dictionary. + +<P> + +Words are added to the dictionary by <B>defining words</B>, of which the +most commonly used is : +(<a href=dpans6.htm#6.1.0450>colon</a>). +When : is executed, it constructs a +definition for the word that follows it. In classical implementations, +the content of this definition is a string of addresses of previously +defined words which will be executed in turn whenever the word being +defined is invoked. The definition is terminated by ; +(<a href=dpans6.htm#6.1.0460>semicolon</a>). +For +example, here is a definition: + + +<PRE> + : RECEIVE ( -- addr n ) PAD DUP 32 ACCEPT ; +</PRE> + +<P> + +The name of the new word is RECEIVE. The comment (in parentheses) +indicates that it requires no parameters and will return an address and +count on the data stack. When RECEIVE is executed, it will perform the +words in the remainder of the definition in sequence. The word +<a href=dpans6.htm#6.2.2000>PAD</a> +places on the stack the address of a scratch pad used to handle strings. +<a href=dpans6.htm#6.1.1290>DUP</a> +duplicates the top stack item, so we now have two copies of the +address. The number 32 is also placed on the stack. The word +<a href=dpans6.htm#6.1.0695>ACCEPT</a> +takes an address (provided by PAD) and length (32) on the stack, accepts +from the keyboard a string of up to 32 characters which will be placed +at the specified address, and returns the number of characters received. +The copy of the scratch-pad address remains on the stack below the count +so that the routine that called RECEIVE can use it to pick up the +received string. + +<P> + + +<hr> +<A name=C.5.2> +<H3>C.5.2 Push-down stacks</H3> +</a> + +The example above illustrates the use of push-down stacks for passing +parameters between Forth words. Forth maintains two push-down stacks, +or LIFO lists. These provide communication between Forth words plus an +efficient mechanism for controlling logical flow. A stack contains +16-bit items on 8-bit and 16-bit computers, and 32-bit items on 32-bit +processors. Double-cell numbers occupy two stack positions, with the +most-significant part on top. Items on either stack may be addresses or +data items of various kinds. Stacks are of indefinite size, and usually +grow towards low memory. + +<P> + +Although the structure of both stacks is the same, they have very +different uses. The user interacts most directly with the Data Stack, +which contains arguments passed between words. This function replaces +the calling sequences used by conventional languages. It is efficient +internally, and makes routines intrinsically re-entrant. The second +stack is called the Return Stack, as its main function is to hold return +addresses for nested definitions, although other kinds of data are +sometimes kept there temporarily. + +<P> + +The use of the Data Stack (often called just <B>the stack</B>) leads to +a notation in which operands precede operators. The word +<a href=dpans6.htm#6.1.0695>ACCEPT</a> +in the +example above took an address and count from the stack and left another +address there. Similarly, a word called +<a href=dpans17.htm#17.6.1.0780>BLANK</a> +expects an address and +count, and will place the specified number of space characters (20H) in +the region starting at that address. Thus, + + +<PRE> + PAD 25 BLANK +</PRE> + +<P> + +will fill the scratch region whose address is pushed on the stack by +<a href=dpans6.htm#6.2.2000>PAD</a> +with 25 spaces. Application words are usually defined to work +similarly. For example, + + +<PRE> + 100 SAMPLES +</PRE> + +<P> + +might be +defined to record 100 measurements in a data array. + +<P> + +Arithmetic operators also expect values and leave results on the stack. +For example, +<a href=dpans6.htm#6.1.0120>+</a> +adds the top two numbers on the stack, replacing them +both by their sum. Since results of operations are left on the stack, +operations may be strung together without a need to define variables to +use for temporary storage. + +<P> + + +<hr> +<A name=C.5.3> +<H3>C.5.3 Interpreters</H3> +</a> + +Forth is traditionally an interpretive system, in that program execution +is controlled by data items rather than machine code. Interpreters can +be slow, but Forth maintains the high speed required of real-time +applications by having two levels of interpretation. + +<P> + +The first is the text interpreter, which parses strings from the +terminal or mass storage and looks each word up in the dictionary. When +a word is found it is executed by invoking the second level, the address +interpreter. + +<P> + +The second is an <B>address interpreter</B>. Although not all Forth +systems are implemented in this way, it was the first and is still the +primary implementation technology. For a small cost in performance, an +address interpreter can yield a very compact object program, which has +been a major factor in Forth's wide acceptance in embedded systems and +other applications where small object size is desirable. + +<P> + +The address interpreter processes strings of addresses or tokens +compiled in definitions created by : +(<a href=dpans6.htm#6.1.0450>colon</a>), +by executing the +definition pointed to by each. The content of most definitions is a +sequence of addresses of previously defined words, which will be +executed by the address interpreter in turn. Thus, when the word +RECEIVE (defined above) is executed, the word +<a href=dpans6.htm#6.2.2000>PAD</a>, +the word +<a href=dpans6.htm#6.1.1290>DUP</a>, the +literal 32, and the word +<a href=dpans6.htm#6.1.0695>ACCEPT</a> +will be executed in sequence. The +process is terminated by the +semicolon. This execution requires no +dictionary searches, parsing, or other logic, because when RECEIVE was +compiled the dictionary was searched for each word, and its address (or +other token) was placed in the next successive cell of the entry. The +text was not stored in memory, not even in condensed form. + +<P> + +The address interpreter has two important properties. First, it is +fast. Although the actual speed depends upon the specific +implementation, professional implementations are highly optimized, often +requiring only one or two machine instructions per address. On most +benchmarks, a good Forth implementation substantially out-performs +interpretive languages such as BASIC or LISP, and will compare favorably +with other compiled high-level languages. + +<P> + +Second, the address interpreter makes Forth definitions extremely +compact, as each reference requires only one cell. In comparison, a +subroutine call constructed by most compilers involves instructions for +handling the calling sequence (unnecessary in Forth because of the +stack) before and after a CALL or JSR instruction and address. + +<P> + +Most of the words in a Forth dictionary will be defined by : (colon) and +interpreted by the address interpreter. Most of Forth itself is defined +this way. + +<P> + + +<hr> +<A name=C.5.4> +<H3>C.5.4 Assembler</H3> +</a> + +Most implementations of Forth include a macro assembler for the CPU on +which they run. By using the defining word +<a href=dpans15.htm#15.6.2.0930>CODE</a> +the programmer can +create a definition whose behavior will consist of executing actual +machine instructions. CODE definitions may be used to do I/O, implement +arithmetic primitives, and do other machine-dependent or time-critical +processing. When using CODE the programmer has full control over the +CPU, as with any other assembler, and CODE definitions run at full +machine speed. + +<P> + +This is an important feature of Forth. It permits explicit +computer-dependent code in manageable pieces with specific interfacing +conventions that are machine-independent. To move an application to a +different processor requires re-coding only the CODE words, which will +interact with other Forth words in exactly the same manner. + +<P> + +Forth assemblers are so compact (typically a few Kbytes) that they can +be resident in the system (as are the compiler, editor, and other +programming tools). This means that the programmer can type in short +CODE definitions and execute them immediately. This capability is +especially valuable in testing custom hardware. + +<P> + + +<hr> +<A name=C.5.5> +<H3>C.5.5 Virtual memory</H3> +</a> + +The final unique element of Forth is its way of using disk or other mass +storage as a form of <B>virtual memory</B> for data and program source. +As in the case of the address interpreter, this approach is historically +characteristic of Forth, but is by no means universal. Disk is divided +into 1024-byte blocks. Two or more buffers are provided in memory, into +which blocks are read automatically when referred to. Each block has a +fixed block number, which in native systems is a direct function of its +physical location. If a block is changed in memory, it will be +automatically written out when its buffer must be reused. Explicit +reads and writes are not needed; the program will find the data in +memory whenever it accesses it. + +<P> + +Block-oriented disk handling is efficient and easy for native Forth +systems to implement. As a result, blocks provide a completely +transportable mechanism for handling program source and data across both +native and co-resident versions of Forth on different host operating +systems. + +<P> + +Definitions in program source blocks are compiled into memory by the +word +<a href=dpans7.htm#7.6.1.1790>LOAD</a>. +Most implementations include an editor, which formats a +block for display into 16 lines of 64 characters each, and provides +commands modifying the source. An example of a Forth source block is +given in Fig. C.1 below. + +<P> + +Source blocks have historically been an important element in Forth +style. Just as Forth definitions may be considered the linguistic +equivalent of sentences in natural languages, a block is analogous to a +paragraph. A block normally contains definitions related to a common +theme, such as <B>vector arithmetic</B>. A comment on the top line of +the block identifies this theme. An application may selectively load +the blocks it needs. + +<P> + +Blocks are also used to store data. Small records can be combined into +a block, or large records spread over several blocks. The programmer +may allocate blocks in whatever way suits the application, and on native +systems can increase performance by organizing data to minimize disk +head motion. Several Forth vendors have developed sophisticated file +and data base systems based on Forth blocks. + +<P> + +Versions of Forth that run co-resident with a host OS often implement +blocks in host OS files. Others use the host files exclusively. The +Standard requires that blocks be available on systems providing any disk +access method, as they are the only means of referencing disk that can +be transportable across both native and co-resident implementations. + +<P> + +<hr> +<a name=C.5.6> +<H3>C.5.6 Programming environment</H3> +</a> + +Although this Standard does not require it, most Forth systems include a +resident editor. This enables a programmer to edit source and recompile +it into executable form without leaving the Forth environment. As it is +easy to organize an application into layers, it is often possible to +recompile only the topmost layer (which is usually the one currently +under development), a process which rarely takes more than a few +seconds. + +<P> + +Most Forth systems also provide resident interactive debugging aids, not +only including words such as those in +<a href=dpans15.htm>15.</a> The optional +Programming-Tools word set, but also having the ability to examine and +change the contents of +<a href=dpans6.htm#6.1.2410>VARIABLE</a>s +and other data items and to execute +from the keyboard most of the component words in both the underlying +Forth system and the application under development. + +<P> + +The combination of resident editor, integrated debugging tools, and +direct executability of most defined words leads to a very interactive +programming style, which has been shown to shorten development time. + +<P> + + +<hr> +<A name=C.5.7> +<H3>C.5.7 Advanced programming features</H3> +</a> + +One of the unusual characteristics of Forth is that the words the +programmer defines in building an application become integral elements +of the language itself, adding more and more powerful +application-oriented features. + +<P> + +For example, Forth includes the words +<a href=dpans6.htm#6.1.2410>VARIABLE</a> and +<a href=dpans8.htm#8.6.1.0440>2VARIABLE</a> to name +locations in which data may be stored, as well as +<a href=dpans6.htm#6.1.0950>CONSTANT</a> and +<a href=dpans8.htm#8.6.1.0360>2CONSTANT</a> +to name single and double-cell values. Suppose a programmer finds that +an application needs arrays that would be automatically indexed through +a number of two-cell items. Such an array might be called 2ARRAY. The +prefix <B>2</B> in the name indicates that each element in this array +will occupy two cells (as would the contents of a 2VARIABLE or +2CONSTANT). The prefix <B>2</B>, however, has significance only to a +human and is no more significant to the text interpreter than any other +character that may be used in a definition name. + +<P> + +Such a definition has two parts, as there are two <B>behaviors</B> +associated with this new word 2ARRAY, one at compile time, and one at +run or execute time. These are best understood if we look at how 2ARRAY +is used to define its arrays, and then how the array might be used in an +application. In fact, this is how one would design and implement this +word. + +<P> + +Beginning the top-down design process, here's how we would like to use +2ARRAY: + + +<PRE> + 100 2ARRAY RAW 50 2ARRAY REFINED +</PRE> + +<P> + +In the first case, we are defining an array 100 elements long, whose +name is RAW. In the second, the array is 50 elements long, and is named +REFINED. In each case, a size parameter is supplied to 2ARRAY on the +data stack (Forth's text interpreter automatically puts numbers there +when it encounters them), and the name of the word immediately follows. +This order is typical of Forth defining words. + +<P> + +When we use RAW or REFINED, we would like to supply on the stack the +index of the element we want, and get back the address of that element +on the stack. Such a reference would characteristically take place in a +loop. Here's a representative loop that accepts a two-cell value from a +hypothetical application word DATA and stores it in the next element of +RAW: + + +<PRE> + : ACQUIRE 100 0 DO DATA I RAW 2! LOOP ; +</PRE> + +<P> + +The name of this definition is ACQUIRE. The loop begins with +<a href=dpans6.htm#6.1.1240>DO</a>, ends +with +<a href=dpans6.htm#6.1.1800>LOOP</a>, +and will execute with index values running from 0 through 99. +Within the loop, DATA gets a value. The word +<a href=dpans6.htm#6.1.1680>I</a> +returns the current +value of the loop index, which is the argument to RAW. The address of +the selected element, returned by RAW, and the value, which has remained +on the stack since DATA, are passed to the word +<a href=dpans6.htm#6.1.0310>2!</a> +(pronounced +<B>two-store</B>), which stores two stack items in the address. + +<P> + +Now that we have specified exactly what 2ARRAY does and how the words it +defines are to behave, we are ready to write the two parts of its +definition: +<P> + + +<PRE> + : 2ARRAY ( n -- ) + CREATE 2* CELLS ALLOT + DOES> ( i a -- a') SWAP 2* + CELLS + ; +</PRE> + +<P> + +The part of the definition before the word +<a href=dpans6.htm#6.1.1250>DOES></a> +specifies the +<B>compile-time</B> behavior, that is, what the 2ARRAY will do when it +us used to define a word such as RAW. The comment indicates that this +part expects a number on the stack, which is the size parameter. The +word +<a href=dpans6.htm#6.1.1000>CREATE</a> +constructs the definition for the new word. The phrase +<a href=dpans6.htm#6.1.0320>2*</a> +<a href=dpans6.htm#6.1.0890>CELLS</a> +converts the size parameter from two-cell units to the internal +addressing units of the system (normally characters). +<a href=dpans6.htm#6.1.0710>ALLOT</a> +then +allocates the specified amount of memory to contain the data to be +associated with the newly defined array. + +<P> + +The second line defines the <B>run-time</B> behavior that will be shared +by all words defined by 2ARRAY, such as RAW and REFINED. The word DOES> +terminates the first part of the definition and begins the second part. +A second comment here indicates that this code expects an index and an +address on the stack, and will return a different address. The index is +supplied on the stack by the caller (of RAW in the example), while the +address of the content of a word defined in this way (the ALLOTted +region) is automatically pushed on top of the stack before this section +of the code is to be executed. This code works as follows: +<a href=dpans6.htm#6.1.2260>SWAP</a> +reverses the order of the two stack items, to get the index on top. 2* +CELLS converts the index to the internal addressing units as in the +compile-time section, to yield an offset from the beginning of the +array. The word +<a href=dpans6.htm#6.1.0120>+</a> +then adds the offset to the address of the start of +the array to give the effective address, which is the desired result. + +<P> + +Given this basic definition, one could easily modify it to do more +sophisticated things. For example, the compile-time code could be +changed to initialize the array to zeros, spaces, or any other desired +initial value. The size of the array could be compiled at its +beginning, so that the run-time code could compare the index against it +to ensure it is within range, or the entire array could be made to +reside on disk instead of main memory. None of these changes would +affect the run-time usage we have specified in any way. This +illustrates a little of the flexibility available with these defining +words. + +<P> + + +<hr> +<A name=C.5.8> +<H3>C.5.8 A programming example</H3> +</a> + +<a href=dpansc.htm#Figure.C.1>Figure C.1</a> +contains a typical block of Forth source. It represents a +portion of an application that controls a bank of eight LEDs used as +indicator lamps on an instrument, and indicates some of the ways in +which Forth definitions of various kinds combine in an application +environment. This example was coded for a STD-bus system with an 8088 +processor and a millisecond clock, which is also used in the example. + +<P> + +The LEDs are interfaced through a single 8-bit port whose address is +40H. This location is defined as a +<a href=dpans6.htm#6.1.0950>CONSTANT</a> +on Line 1, so that it may +be referred to by name; should the address change, one need only adjust +the value of this constant. The word LIGHTS returns this address on the +stack. The definition LIGHT takes a value on the stack and sends it to +the device. The nature of this value is a bit mask, whose bits +correspond directly to the individual lights. + +<P> + +Thus, the command 255 LIGHT will turn on all lights, while 0 LIGHT will +turn them all off. + +<P> + +<a name=Figure.C.1>*</a> +<PRE> +Block 180 + 0. ( LED control ) + 1. HEX 40 CONSTANT LIGHTS DECIMAL + 2. : LIGHT ( n -- ) LIGHTS OUTPUT ; + 3. + 4. VARIABLE DELAY + 5. : SLOW 500 DELAY ! ; + 6. : FAST 100 DELAY ! ; + 7. : COUNTS 256 0 DO I LIGHT DELAY @ MS LOOP ; + 8. + 9. : LAMP ( n - ) CREATE , DOES> ( a -- n ) @ ; + 10. 1 LAMP POWER 2 LAMP HV 4 LAMP TORCH + 11. 8 LAMP SAMPLING 16 LAMP IDLING + 12. + 13. VARIABLE LAMPS + 14. : TOGGLE ( n -- ) LAMPS @ XOR DUP LAMPS ! LIGHT ; + 15. +</PRE> +<P> + +Figure C.1 - Forth source block containing words that control a set of LEDs. + +<P> + +Lines 4 - 7 contain a simple diagnostic of the sort one might type in +from the terminal to confirm that everything is working. The variable +DELAY contains a delay time in milliseconds - execution of the word +DELAY returns the address of this variable. Two values of DELAY are set +by the definitions SLOW and FAST, using the Forth operator +<a href=dpans6.htm#6.1.0010>!</a> +(pronounced +<B>store</B>) which takes a value and an address, and stores the value +in the address. The definition COUNTS runs a loop from 0 through 255 +(Forth loops of this type are exclusive at the upper end of the range), +sending each value to the lights and then waiting for the period +specified by DELAY. The word +<a href=dpans6.htm#6.1.0650>@</a> +(pronounced <B>fetch</B>) fetches a +value from an address, in this case the address supplied by DELAY. This +value is passed to +<a href=dpans10.htm#10.6.2.1905>MS</a>, +which waits the specified number of milliseconds. +The result of executing COUNTS is that the lights will count from 0 to +255 at the desired rate. To run this, one would type: + + +<PRE> + SLOW COUNTS or FAST COUNTS +</PRE> + +<P> + +at the terminal. + +<P> + +Line 9 provides the capability of naming individual lamps. In this +application they are being used as indicator lights. The word LAMP is a +defining word which takes as an argument a mask which represents a +particular lamp, and compiles it as a named entity. Lines 10 and 11 +contain five uses of LAMP to name particular indicators. When one of +these words such as POWER is executed, the mask is returned on the +stack. In fact, the behavior of defining a value such that when the +word is invoked the value is returned, is identical to the behavior of a +Forth CONSTANT. We created a new defining word here, however, to +illustrate how this would be done. + +<P> + +Finally, on lines 13 and 14, we have the words that will control the +light panel. LAMPS is a variable that contains the current state of the +lamps. The word TOGGLE takes a mask (which might be supplied by one of +the LAMP words) and changes the state of that particular lamp, saving +the result in LAMPS. + +<P> + +In the remainder of the application, the lamp names and TOGGLE are +probably the only words that will be executed directly. The usage there +will be, for example: + + +<PRE> + POWER TOGGLE or SAMPLING TOGGLE +</PRE> + +<P> + +as appropriate, whenever the system indicators need to be changed. + +<P> + +The time to compile this block of code on that system was about half a +second, including the time to fetch it from disk. So it is quite +practical (and normal practice) for a programmer to simply type in a +definition and try it immediately. + +<P> + +In addition, one always has the capability of communicating with +external devices directly. The first thing one would do when told about +the lamps would be to type: + + +<PRE> + HEX FF 40 OUTPUT +</PRE> + +<P> + +and see if all the lamps come on. If not, the presumption is that +something is amiss with the hardware, since this phrase directly +transmits the <B>all ones</B> mask to the device. This type of direct +interaction is useful in applications involving custom hardware, as it +reduces hardware debugging time. + +<P> + + +<hr> +<A name=C.6> +<H2>C.6 Multiprogrammed systems</H2> +</a> + +Multiprogrammed Forth systems have existed since about 1970. The +earliest public Forth systems propagated the <B>hooks</B> for this +capability despite the fact that many did not use them. Nevertheless +the underlying assumptions have been common knowledge in the community, +and there exists considerable common ground among these multiprogrammed +systems. These systems are not just language processors, but contain +operating system characteristics as well. Many of these integrated +systems run entirely stand-alone, performing all necessary operating +system functions. + +<P> + +Some Forth systems are very fast, and can support both multi-tasking and +multi-user operation even on computers whose hardware is usually thought +incapable of such advanced operation. For example, one producer of +telephone switchboards is running over 50 tasks on a Z80. There are +several multiprogrammed products for PC's, some of which even support +multiple users. Even on computers that are commonly used in multi-user +operations, the number of users that can be supported may be much larger +than expected. One large data-base application running on a single +68000 has over 100 terminals updating and querying its data-base, with +no significant degradation. + +<P> + +Multi-user systems may also support multiple programmers, each of which +has a private dictionary, stacks, and a set of variables controlling +that task. The private dictionary is linked to a shared, re-entrant +dictionary containing all the standard Forth functions. The private +dictionary can be used to develop application code which may later be +integrated into the shared dictionary. It may also be used to perform +functions requiring text interpretation, including compilation and +execution of source code. + +<P> + +<hr> +<A name=C.7> +<H2>C.7 Design and management considerations</H2> +</a> + +Just as the choice of building materials has a strong effect on the +design and construction of a building, the choice of language and +operating system will affect both application design and project +management decisions. + +<P> + +Conventionally, software projects progress through four stages: +analysis, design, coding, and testing. A Forth project necessarily +incorporates these activities as well. Forth is optimized for a +project-management methodology featuring small teams of skilled +professionals. Forth encourages an iterative process of <B>successive +prototyping</B> wherein high-level Forth is used as an executable design +tool, with <B>stubs</B> replacing lower-level routines as necessary +(e.g., for hardware that isn't built yet). + +<P> + +In many cases successive prototyping can produce a sounder, more useful +product. As the project progresses, implementors learn things that +could lead to a better design. Wiser decisions can be made if true +relative costs are known, and often this isn't possible until prototype +code can be written and tried. + +<P> + +Using Forth can shorten the time required for software development, and +reduce the level of effort required for maintenance and modifications +during the life of the product as well. + +<P> + + +<hr> +<A name=C.8> +<H2>C.8 Conclusion</H2> +</a> + +Forth has produced some remarkable achievements in a variety of +application areas. In the last few years its acceptance has grown +rapidly, particularly among programmers looking for ways to improve +their productivity and managers looking for ways to simplify new +software-development projects. + +<P> + + + +<hr> +<A href=dpans.htm#toc><IMG src="up.gif" ></A> Table of Contents +<BR> +<A href=dpansd.htm><IMG src="right.gif" ></A> +Next Section +<P> +</BODY> +</HTML> diff --git a/mwmouse/sources/AnsForth/DPANSD.HTM b/mwmouse/sources/AnsForth/DPANSD.HTM @@ -0,0 +1,1157 @@ +<HTML><HEAD> +<TITLE>DPANS94</TITLE> +<link disabled rel="stylesheet" href="mpexc6.css"> +<style>@import url(mpexc6.css);</style> +</head> + +<BODY> +<table width=100%> +<tr> +<td align=left> +<a href=dpansc.htm><img src=left.gif + width=26 height=26 align=ALIGN border=0></a> +<a href=dpanse.htm><img src=right.gif + width=26 height=26 align=ALIGN border=0></a> +</td> +<td align=right> +<a href=dpans.htm#toc><img src=up.gif + width=26 height=26 align=ALIGN border=0></a> +<a name=D.>Table of Contents</a> +</td> +</tr> +</table> +<p> +<hr size=4> + +<H1>D. Compatibility analysis of ANS Forth (informative annex)</H1> + +Prior to ANS Forth, there were several industry standards for Forth. +The most influential are listed here in chronological order, along with +the major differences between ANS Forth and the most recent, Forth-83. + +<P> + + +<hr> +<A name=D.1> +<H2>D.1 FIG Forth (circa 1978)</H2> +</a> + +FIG Forth was a <B>model</B> implementation of the Forth language +developed by the Forth Interest Group (FIG). In FIG Forth, a relatively +small number of words were implemented in processor-dependent machine +language and the rest of the words were implemented in Forth. The FIG +model was placed in the public domain, and was ported to a wide variety +of computer systems. Because the bulk of the FIG Forth implementation +was the same across all machines, programs written in FIG Forth enjoyed +a substantial degree of portability, even for <B>system-level</B> +programs that directly manipulate the internals of the Forth system +implementation. + +<P> + +FIG Forth implementations were influential in increasing the number of +people interested in using Forth. Many people associate the +implementation techniques embodied in the FIG Forth model with <B>the +nature of Forth</B>. + +<P> + +However, FIG Forth was not necessarily representative of commercial +Forth implementations of the same era. Some of the most successful +commercial Forth systems used implementation techniques different from +the FIG Forth <B>model</B>. + +<P> + + +<hr> +<A name=D.2> +<H2>D.2 Forth-79</H2> +</a> + +The Forth-79 Standard resulted from a series of meetings from 1978 to +1980, by the Forth Standards Team, an international group of Forth users +and vendors (interim versions known as Forth 77 and Forth 78 were also +released by the group). + +<P> + +Forth-79 described a set of words defined on a 16-bit, twos-complement, +unaligned, linear byte-addressing virtual machine. It prescribed an +implementation technique known as <B>indirect threaded code</B>, and +used the ASCII character set. + +<P> + +The Forth-79 Standard served as the basis for several public domain and +commercial implementations, some of which are still available and +supported today. + +<P> + +<hr> +<A name=D.3> +<H2>D.3 Forth-83</H2> +</a> + +The Forth-83 Standard, also by the Forth Standards Team, was released in +1983. Forth-83 attempted to fix some of the deficiencies of Forth-79. + +<P> + +Forth-83 was similar to Forth-79 in most respects. However, Forth-83 +changed the definition of several well-defined features of Forth-79. +For example, the rounding behavior of integer division, the base value +of the operands of +<a href=dpans6.htm#6.2.2030>PICK</a> +and +<a href=dpans6.htm#6.2.2150>ROLL</a>, +the meaning of the address returned by +<a href=dpans6.htm#6.1.0070>'</a>, +the compilation behavior of ', the value of a <B>true</B> flag, the +meaning of +NOT, +and the <B>chaining</B> behavior of words defined by +VOCABULARY were all changed. Forth-83 relaxed the implementation +restrictions of Forth-79 to allow any kind of threaded code, but it did +not fully allow compilation to native machine code (this was not +specifically prohibited, but rather was an indirect consequence of +another provision). + +<P> + +Many new Forth implementations were based on the Forth-83 Standard, but +few <B>strictly compliant</B> Forth-83 implementations exist. + +<P> + +Although the incompatibilities resulting from the changes between +Forth-79 and Forth-83 were usually relatively easy to fix, a number of +successful Forth vendors did not convert their implementations to be +Forth-83 compliant. For example, the most successful commercial Forth +for Apple Macintosh computers is based on Forth-79. + +<P> + +<hr> +<A name=D.4> +<H2>D.4 Recent developments</H2> +</a> + +Since the Forth-83 Standard was published, the computer industry has +undergone rapid and profound changes. The speed, memory capacity, and +disk capacity of affordable personal computers have increased by factors +of more than 100. 8-bit processors have given way to 16-bit processors, +and now 32-bit processors are commonplace. + +<P> + +The operating systems and programming-language environments of small +systems are much more powerful than they were in the early 80's. + +<P> + +The personal-computer marketplace has changed from a predominantly +<B>hobbyist</B> market to a mature business and commercial market. + +<P> + +Improved technology for designing custom microprocessors has resulted in +the design of numerous <B>Forth chips</B>, computers optimized for the +execution of the Forth language. + +<P> + +The market for ROM-based embedded control computers has grown +substantially. + +<P> + +In order to take full advantage of this evolving technology, and to +better compete with other programming languages, many recent Forth +implementations have ignored some of the <B>rules</B> of previous Forth +standards. In particular: + +<UL> +<LI>32-bit Forth implementations are now common. +<LI>Some Forth systems adopt the address-alignment restrictions of the +hardware on which they run. +<LI>Some Forth systems use native-code generation, microcode +generation, and optimization techniques, rather than the traditional +<B>threaded code</B>. +<LI>Some Forth systems exploit segmented addressing architectures, +placing portions of the Forth <B>dictionary</B> in different segments. +<LI>More and more Forth systems now run in the environment of +another <B>standard</B> operating system, using OS text files for source +code, rather than the traditional Forth <B>blocks</B>. +<LI>Some Forth systems allow external operating system software, +windowing software, terminal concentrators, or communications channels +to handle or preprocess user input, resulting in deviations from the +input editing, character set availability, and screen management +behavior prescribed by Forth-83. +</UL> +<P> + +Competitive pressure from other programming languages (predominantly +<B>C</B>) and from other Forth vendors have led Forth vendors to +optimizations that do not fit in well with the <B>virtual machine +model</B> implied by existing Forth standards. + +<P> + + +<hr> +<A name=D.5> +<H2>D.5 ANS Forth approach</H2> +</a> + +The ANS Forth committee addressed the serious fragmentation of the Forth +community caused by the differences between Forth-79 and Forth-83, and +the divergence from either of these two industry standards caused by +marketplace pressures. + +<P> + +Consequently, the committee has chosen to base its compatibility +decisions not upon a strict comparison with the Forth-83 Standard, but +instead upon consideration of the variety of existing implementations, +especially those with substantial user bases and/or considerable success +in the marketplace. + +<P> + +The committee feels that, if ANS Forth prescribes stringent requirements +upon the virtual machine model, as did the previous standards, then many +implementors will chose not to comply with ANS Forth. The committee +hopes that ANS Forth will serve to unify rather than to further divide +the Forth community, and thus has chosen to encompass rather than +invalidate popular implementation techniques. + +<P> + +Many of the changes from Forth-83 are justified by this rationale. Most +fall into the category that <B>an ANS Forth Standard Program may not +assume x</B>, where <B>x</B> is an entitlement resulting from the +virtual machine model prescribed by the Forth-83 Standard. The +committee feels that these restrictions are reasonable, especially +considering that a substantial number of existing Forth implementations +do not correctly implement the Forth-83 virtual model, thus the Forth-83 +entitlements exist <B>in theory</B> but not <B>in practice</B>. + +<P> + +Another way of looking at this is that while ANS Forth acknowledges the +diversity of current Forth practice, it attempts to document the +similarity therein. In some sense, ANS Forth is thus a <B>description +of reality</B> rather than a <B>prescription for a particular virtual +machine</B>. + +<P> + +Since there is no previous American National Standard for Forth, the +action requirements prescribed by section 3.4 of X3/SD-9, <B>Policy and +Guidelines</B>, regarding previous standards do not apply. + +<P> + +The following discussion describes differences between ANS Forth and +Forth-83. In most cases, Forth-83 is representative of Forth-79 and FIG +Forth for the purposes of this discussion. In many of these cases, +however, ANS Forth is more representative of the existing state of the +Forth industry than the previously-published standards. + +<P> + +<hr> +<A name=D.6> +<H2>D.6 Differences from Forth-83</H2> +</a> + + + +<hr> +<A name=D.6.1> +<H3>D.6.1 Stack width</H3> +</a> + +Forth-83 specifies that stack items occupy 16 bits. This includes +addresses, flags, and numbers. ANS Forth specifies that stack items are +at least 16 bits; the actual size must be documented by the +implementation. + +<P> + +Words affected: all arithmetic, logical and addressing +operators + +<P> + +Reason: 32-bit machines are becoming +commonplace. A 16-bit Forth system on a 32-bit machine is not competitive. + +<P> + +Impact: Programs that assume 16-bit stack +width will continue to run on 16-bit machines; ANS Forth does not require a +different stack width, but simply allows it. Many programs will be unaffected +(but see <B>address unit</B>). + +<P> + +Transition/Conversion: Programs which use bit masks with the high bits set +may have to be changed, substituting either an implementation-defined bit-mask +constant, or a procedure to calculate a bit mask in a stack-width-independent +way. Here are some procedures for constructing width-independent bit masks: + +<P> + + +<PRE> +1 CONSTANT LO-BIT +TRUE 1 RSHIFT INVERT CONSTANT HI-BIT + +: LO-BITS ( n -- mask ) + 0 SWAP 0 ?DO 1 LSHIFT LO-BIT OR LOOP ; + +: HI-BITS ( n -- mask ) + 0 SWAP 0 ?DO 1 RSHIFT HI-BIT OR LOOP ; +</PRE> + +<P> + +Programs that depend upon the <B>modulo 65536</B> behavior implicit in +16-bit arithmetic operations will need to be rewritten to explicitly +perform the modulus operation in the appropriate places. The committee +believes that such assumptions occur infrequently. Examples: some +checksum or CRC calculations, some random number generators and most +fixed-point fractional math. + +<P> + + +<hr> +<A name=D.6.2> +<H3>D.6.2 Number representation</H3> +</a> + +Forth-83 specifies two's-complement number representation and +arithmetic. ANS Forth also allows one's-complement and +signed-magnitude. + +<P> + +Words affected: all arithmetic and logical operators, +<a href=dpans6.htm#6.1.1800>LOOP</a>, +<a href=dpans6.htm#6.1.0140>+LOOP</a> +<P> + + +Reason: Some computers use one's-complement or signed-magnitude. The +committee did not wish to force Forth implementations for those machines +to emulate two's-complement arithmetic, and thus incur severe +performance penalties. The experience of some committee members with +such machines indicates that the usage restrictions necessary to support +their number representations are not overly burdensome. + +<P> + +Impact: An ANS Forth Standard Program may declare an <B>environmental +dependency on two's-complement arithmetic</B>. This means that the +otherwise-Standard Program is only guaranteed to work on +two's-complement machines. Effectively, this is not a severe +restriction, because the overwhelming majority of current computers use +two's-complement. The committee knows of no Forth-83 compliant +implementations for non-two's-complement machines at present, so +existing Forth-83 programs will still work on the same class of machines +on which they currently work. + +<P> + +Transition/Conversion: Existing programs wishing to take advantage of +the possibility of ANS Forth Standard Systems on non-two's-complement +machines may do so by eliminating the use of arithmetic operators to +perform logical functions, by deriving bit-mask constants from bit +operations as described in the section about stack width, by restricting +the usage range of unsigned numbers to the range of positive numbers, +and by using the provided operators for conversion from single numbers +to double numbers. + +<P> + + +<hr> +<A name=D.6.3> +<H3>D.6.3 Address units</H3> +</a> + +Forth-83 specifies that each unique address refers to an 8-bit byte in +memory. ANS Forth specifies that the size of the item referred to by +each unique address is implementation-defined, but, by default, is the +size of one character. Forth-83 describes many memory operations in +terms of a number of bytes. ANS Forth describes those operations in +terms of a number of either characters or address units. + +<P> + +Words affected: those with <B>address unit</B> arguments +<P> + +Reason: Some machines, including the most popular Forth chip, address +16-bit memory locations instead of 8-bit bytes. + +<P> + +Impact: Programs may choose to declare an environmental dependency on +byte addressing, and will continue to work on the class of machines for +which they now work. In order for a Forth implementation on a +word-addressed machine to be Forth-83 compliant, it would have to +simulate byte addressing at considerable cost in speed and memory +efficiency. The committee knows of no such Forth-83 implementations for +such machines, thus an environmental dependency on byte addressing does +not restrict a Standard Program beyond its current de facto +restrictions. + +<P> + +Transition/Conversion: The new +<a href=dpans6.htm#6.1.0898>CHARS</a> +and +<a href=dpans6.htm#6.1.0897>CHAR+</a> +address arithmetic +operators should be used for programs that require portability to +non-byte-addressed machines. The places where such conversion is +necessary may be identified by searching for occurrences of words that +accept a number of address units as an argument (e.g., +<a href=dpans6.htm#6.1.1900>MOVE</a>, +<a href=dpans6.htm#6.1.0710>ALLOT</a>). + +<P> + + +<hr> +<A name=D.6.4> +<H3>D.6.4 Address increment for a cell is no longer two</H3> +</a> + +As a consequence of Forth-83's simultaneous specification of 16-bit +stack width and byte addressing, the number two could reliably be used +in address calculations involving memory arrays containing items from +the stack. Since ANS Forth requires neither 16-bit stack width nor byte +addressing, the number two is no longer necessarily appropriate for such +calculations. + +<P> + +Words +affected: +<a href=dpans6.htm#6.1.0650>@</a> +<a href=dpans6.htm#6.1.0010>!</a> +<a href=dpans6.htm#6.1.0130>+!</a> +2+ +<a href=dpans6.htm#6.1.0320>2*</a> +2- +<a href=dpans6.htm#6.1.0140>+LOOP</a> + +<P> + +Reason: See reasons for <B>Address Units</B> and <B>Stack Width</B> +<P> + +Impact: In this respect, existing programs will continue to work on +machines where a stack cell occupies two address units when stored in +memory. This includes most machines for which Forth-83 compliant +implementations currently exist. In principle, it would also include +16-bit-word-addressed machines with 32-bit stack width, but the +committee knows of no examples of such machines. + +<P> + +Transition/Conversion: The new +<a href=dpans6.htm#6.1.0890>CELLS</a> +and +<a href=dpans6.htm#6.1.0880>CELL+</a> +address arithmetic +operators should be used for portable programs. The places where such +conversion is necessary may be identified by searching for the character +<B>2</B> and determining whether or not it is used as part of an address +calculation. The following substitutions are appropriate within address +calculations: + +<P> + + +<PRE> +Old New +--- --- +2+ or 2 + CELL+ +2* or 2 * CELLS +2- or 2 - 1 CELLS - +2/ or 2 / 1 CELLS / +2 1 CELLS +</PRE> + +<P> + +The number <B>2</B> by itself is sometimes used for address calculations +as an argument to ++LOOP, +when the loop index is an address. When +converting the word +<a href=dpans6.htm#6.1.0330>2/</a> +which operates on negative dividends, one should +be cognizant of the rounding method used. + +<P> + + +<hr> +<A name=D.6.5> +<H3>D.6.5 Address alignment</H3> +</a> + +Forth-83 imposes no restriction upon the alignment of addresses to any +boundary. ANS Forth specifies that a Standard System may require +alignment of addresses for use with various <B>@</B> and <B>!</B> +operators. + +<P> + +Words Affected: +<a href=dpans6.htm#6.1.0010>!</a> +<a href=dpans6.htm#6.1.0130>+!</a> +<a href=dpans6.htm#6.1.0310>2!</a> +<a href=dpans6.htm#6.1.0350>2@</a> +<a href=dpans6.htm#6.1.0650>@</a> +<a href=dpans15.htm#15.6.1.0600>?</a> +<a href=dpans6.htm#6.1.0150>,</a> +<P> + +Reason: Many computers have hardware restrictions that favor the use of +aligned addresses. On some machines, the native memory-access +instructions will cause an exception trap if used with an unaligned +address. Even on machines where unaligned accesses do not cause +exception traps, aligned accesses are usually faster. + +<P> + +Impact: All of the ANS Forth words that return addresses suitable for +use with aligned <B>@</B> and <B>!</B> words must return aligned +addresses. In most cases, there will be no problem. Problems can arise +from the use of user-defined data structures containing a mixture of +character data and cell-sized data. + +<P> + +Many existing Forth systems, especially those currently in use on +computers with strong alignment requirements, already require alignment. +Much existing Forth code that is currently in use on such machines has +already been converted for use in an aligned environment. + +<P> + +Transition/Conversion: There are two possible approaches to conversion +of programs for use on a system requiring address alignment. + +<P> + +The easiest approach is to redefine the system's aligned <B>@</B> and +<B>!</B> operators so that they do not require alignment. For example, +on a 16-bit little-endian byte-addressed machine, unaligned <B>@</B> and +<B>!</B> could be defined: + + +<PRE> + : @ ( addr -- x ) DUP C@ SWAP CHAR+ C@ 8 LSHIFT OR ; + : ! ( x addr -- ) OVER 8 RSHIFT OVER CHAR+ C! C! ; +</PRE> +<P> + +These definitions, and similar ones for <B>+!</B>, <B>2@</B>, <B>2!</B>, +<B>,</B>, and <B>?</B> as needed, can be compiled before an unaligned +application, which will then work as expected. + +<P> + +This approach may conserve memory if the application uses substantial +numbers of data structures containing unaligned fields. + +<P> + +Another approach is to modify the application's source code to eliminate +unaligned data fields. The ANS Forth words +<a href=dpans6.htm#6.1.0705>ALIGN</a> +and +<a href=dpans6.htm#6.1.0706>ALIGNED</a> +may be +used to force alignment of data fields. The places where such alignment +is needed may be determined by inspecting the parts of the application +where data structures (other than simple variables) are defined, or by +<B>smart compiler</B> techniques (see the <B>Smart Compiler</B> +discussion below). + +<P> + +This approach will probably result in faster application execution +speed, at the possible expense of increased memory utilization for data +structures. + +<P> + +Finally, it is possible to combine the preceding techniques by +identifying exactly those data fields that are unaligned, and using +<B>unaligned</B> versions of the memory access operators for only those +fields. This <B>hybrid</B> approach affects a compromise between +execution speed and memory utilization. + +<P> + + +<hr> +<a name=D.6.6> +<H3>D.6.6 Division/modulus rounding direction</H3> +</a> + +Forth-79 specifies that division rounds toward 0 and the remainder +carries the sign of the dividend. Forth-83 specifies that division +rounds toward negative infinity and the remainder carries the sign of +the divisor. ANS Forth allows either behavior for the division +operators listed below, at the discretion of the implementor, and +provides a pair of division primitives to allow the user to synthesize +either explicit behavior. + +<P> + +Words Affected: +<a href=dpans6.htm#6.1.0230>/</a> +<a href=dpans6.htm#6.1.1890>MOD</a> +<a href=dpans6.htm#6.1.0240>/MOD</a> +<a href=dpans6.htm#6.1.0110>*/MOD</a> +<a href=dpans6.htm#6.1.0100>*/</a> +<P> + +Reason: The difference between the division behaviors in Forth-79 and +Forth-83 was a point of much contention, and many Forth implementations +did not switch to the Forth-83 behavior. Both variants have vocal +proponents, citing both application requirements and execution +efficiency arguments on both sides. After extensive debate spanning +many meetings, the committee was unable to reach a consensus for +choosing one behavior over the other, and chose to allow either behavior +as the default, while providing a means for the user to explicitly use +both behaviors as needed. Since implementors are allowed to choose +either behavior, they are not required to change the behavior exhibited +by their current systems, thus preserving correct functioning of +existing programs that run on those systems and depend on a particular +behavior. New implementations could choose to supply the behavior that +is supported by the native CPU instruction set, thus maximizing +execution speed, or could choose the behavior that is most appropriate +for the intended application domain of the system. + +<P> + +Impact: The issue only affects programs that use a negative dividend +with a positive divisor, or a positive dividend with a negative divisor. +The vast majority of uses of division occur with both a positive +dividend and a positive divisor; in that case, the results are the same +for both allowed division behaviors. + +<P> + +Transition/Conversion: For programs that require a specific rounding +behavior with division operands of mixed sign, the division operators +used by the program may be redefined in terms of one of the new ANS +Forth division primitives +<a href=dpans6.htm#6.1.2214>SM/REM</a> +(symmetrical division, i.e., round +toward zero) or +<a href=dpans6.htm#6.1.1561>FM/MOD</a> +(floored division, i.e., round toward negative +infinity). Then the program may be recompiled without change. For +example, the Forth-83 style division operators may be defined by: + +<P> + + +<PRE> +: /MOD ( n1 n2 -- n3 n4 ) >R S>D R> FM/MOD ; +: MOD ( n1 n2 -- n3 ) /MOD DROP ; +: / ( n1 n2 -- n3 ) /MOD SWAP DROP ; +: */MOD ( n1 n2 n3 -- n4 n5 ) >R M* R> FM/MOD ; +: */ ( n1 n2 n3 -- n4 n5 ) */MOD SWAP DROP ; +</PRE> + +<P> + +<hr> +<A name=D.6.7> +<H3>D.6.7 Immediacy</H3> +</a> + +Forth-83 specified that a number of <B>compiling words</B> are +<B>immediate</B>, meaning that they are executed instead of compiled +during compilation. ANS Forth is less specific about most of these +words, stating that their behavior is only defined during compilation, +and specifying their results rather than their specific compile-time +actions. + +<P> + +To force the compilation of a word that would normally be executed, +Forth-83 provided the words COMPILE , used with non-immediate words, and +<a href=dpans6.htm#6.2.2530>[COMPILE]</a> , +used with immediate words. ANS Forth provides the single +word +<a href=dpans6.htm#6.1.2033>POSTPONE</a> , +which is used with both immediate and non-immediate +words, automatically selecting the appropriate behavior. + +<P> + +Words Affected: +<b><code>COMPILE [COMPILE] +<a href=dpans6.htm#6.1.2510>[']</a> +<a href=dpans6.htm#6.1.0070>'</a></code></b> +<P> + +Reason: The designation of particular words as either immediate or not +depends upon the implementation technique chosen for the Forth system. +With traditional <B>threaded code</B> implementations, the choice was +generally quite clear (with the single exception of the word +<a href=dpans6.htm#6.1.1760>LEAVE</a>), and +the standard could specify which words should be immediate. However, +some of the currently popular implementation techniques, such as +native-code generation with optimization, require the immediacy +attribute on a different set of words than the set of immediate words of +a threaded code implementation. ANS Forth, acknowledging the validity +of these other implementation techniques, specifies the immediacy +attribute in as few cases as possible. + +<P> + +When the membership of the set of immediate words is unclear, the +decision about whether to use COMPILE or [COMPILE] becomes unclear. +Consequently, ANS Forth provides a <B>general purpose</B> replacement +word POSTPONE that serves the purpose of the vast majority of uses of +both COMPILE and [COMPILE], without requiring that the user know whether +or not the <B>postponed</B> word is immediate. + +<P> + +Similarly, the use of ' and ['] with compiling words is unclear if the +precise compilation behavior of those words is not specified, so ANS +Forth does not permit a Standard Program to use ' or ['] with compiling +words. + +<P> + +The traditional (non-immediate) definition of the word COMPILE has an +additional problem. Its traditional definition assumes a threaded code +implementation technique, and its behavior can only be properly +described in that context. In the context of ANS Forth, which permits +other implementation techniques in addition to threaded code, it is very +difficult, if not impossible, to describe the behavior of the +traditional COMPILE. Rather than changing its behavior, and thus +breaking existing code, ANS Forth does not include the word COMPILE. +This allows existing implementations to continue to supply the word +COMPILE with its traditional behavior, if that is appropriate for the +implementation. + +<P> + +Impact: [COMPILE] remains in ANS Forth, since its proper use does not +depend on knowledge of whether or not a word is immediate (Use of +[COMPILE] with a non-immediate word is and has always been a no-op). +Whether or not you need to use [COMPILE] requires knowledge of whether +or not its target word is immediate, but it is always safe to use +[COMPILE]. [COMPILE] is no longer in the (required) core word set, +having been moved to the Core Extensions word set, but the committee +anticipates that most vendors will supply it anyway. + +<P> + +In nearly all cases, it is correct to replace both [COMPILE] and COMPILE +with POSTPONE. Uses of [COMPILE] and COMPILE that are not suitable for +<B>mindless</B> replacement by POSTPONE are quite infrequent, and fall +into the following two categories: + +<P> + +a) Use of [COMPILE] with non-immediate words. This is sometimes done +with the words '-(tick, which was immediate in Forth-79 but not in Forth-83) +and LEAVE (which was immediate in Forth-83 but not in Forth-79), in order to +force the compilation of those words without regard to whether you are using a +Forth-79 or Forth-83 system. + +<P> + +b) Use of the phrase COMPILE [COMPILE] &lt;immediate word&gt; to +<B>doubly +postpone</B> an immediate word. + +<P> + +Transition/Conversion: Many ANS Forth implementations will continue to +implement both [COMPILE] and COMPILE in forms compatible with existing usage. +In those environments, no conversion is necessary. + +<P> + +For complete portability, uses of COMPILE and [COMPILE] should be +changed to POSTPONE , except in the rare cases indicated above. Uses of +[COMPILE] with non-immediate words may be left as-is, and the program +may declare a requirement for the word [COMPILE] from the Core +Extensions word set, or the [COMPILE] before the non-immediate word may +be simply deleted if the target word is known to be non-immediate. + +<P> + +Uses of the phrase COMPILE [COMPILE] &lt;immediate-word&gt; may be handled by +introducing an <B>intermediate word</B> (XX in the example below) and +then postponing that word. For example: + + +<PRE> + + : ABC COMPILE [COMPILE] IF ; + +</PRE> +<P> + +changes to: +<P> + + +<PRE> + : XX POSTPONE IF ; + : ABC POSTPONE XX ; +</PRE> +<P> + +A non-standard case can occur with programs that <B>switch out of +compilation state</B> to explicitly compile a thread in the dictionary +following a COMPILE . For example: + + +<PRE> + : XYZ COMPILE [ ' ABC , ] ; +</PRE> +<P> + +This depends heavily on knowledge of exactly how COMPILE and the +threaded-code implementation works. Cases like this cannot be handled +mechanically; they must be translated by understanding exactly what the +code is doing, and rewriting that section according to ANS Forth +restrictions. + +<P> + +Use the phrase POSTPONE [COMPILE] +to replace [COMPILE] [COMPILE]. + +<P> + +<hr> +<A name=D.6.8> +<H3>D.6.8 Input character set</H3> +</a> + +Forth-83 specifies that the full 7-bit ASCII character set is available +through +KEY. +ANS Forth restricts it to the graphic characters of the +ASCII set, with codes from hex 20 to hex 7E inclusive. + +<P> + +Words Affected: +<a href=dpans6.htm#6.1.1750>KEY</a> +<P> + +Reason: Many system environments <B>consume</B> certain control +characters for such purposes as input editing, job control, or flow +control. A Forth implementation cannot always control this system +behavior. + +<P> + +Impact: Standard Programs which require the ability to receive +particular control characters through KEY must declare an environmental +dependency on the input character set. + +<P> + +Transition/Conversion: For maximum portability, programs should restrict +their required input character set to only the graphic characters. +Control characters may be handled if available, but complete program +functionality should be accessible using only graphic characters. + +<P> + +As stated above, an environmental dependency on the input character set +may be declared. Even so, it is recommended that the program should +avoid the requirement for particularly-troublesome control characters, +such as control-S and control-Q (often used for flow control, sometimes +by communication hardware whose presence may be difficult to detect), +ASCII NUL (difficult to type on many keyboards), and the distinction +between carriage return and line feed (some systems translate carriage +returns into line feeds, or vice versa). + +<P> + +<hr> +<A name=D.6.9> +<H3>D.6.9 Shifting with UM/MOD</H3> +</a> + +Given Forth-83's two's-complement nature, and its requirement for +floored (round toward minus infinity) division, shifting is equivalent +to division. Also, two's-complement representation implies that +unsigned division by a power of two is equivalent to logical +right-shifting, so UM/MOD could be used to perform a logical +right-shift. + +<P> + +Words Affected: +<a href=dpans6.htm#6.1.2370>UM/MOD</a> +<P> + +Reason: The problem with UM/MOD is a result of allowing +non-two's-complement number representations, as already described. + +<P> + +ANS Forth provides the words +<a href=dpans6.htm#6.1.1805>LSHIFT</a> and +<a href=dpans6.htm#6.1.2162>RSHIFT</a> +to perform logical +shifts. This is usually more efficient, and certainly more descriptive, +than the use of UM/MOD for logical shifting. + +<P> + +Impact: Programs running on ANS Forth systems with two's-complement +arithmetic (the majority of machines), will not experience any +incompatibility with UM/MOD . Existing Forth-83 Standard programs +intended to run on non-two's-complement machines will not be able to use +UM/MOD for shifting on a non-two's-complement ANS Forth system. This +should not affect a significant number of existing programs (perhaps +none at all), since the committee knows of no existing Forth-83 +implementations on non-two's-complement machines. + +<P> + +Transition/Conversion: A program that requires UM/MOD to behave as a +shift operation may declare an environmental dependency on +two's-complement arithmetic. + +<P> + +A program that cannot declare an environmental dependency on +two's-complement arithmetic may require editing to replace incompatible +uses of UM/MOD with other operators defined within the application. + +<P> + +<hr> +<A name=D.6.10> +<H3>D.6.10 Vocabularies / wordlists</H3> +</a> + +ANS Forth does not define the words VOCABULARY, CONTEXT, and CURRENT , +which were present in Forth-83. Instead, ANS Forth defines a primitive +word set for search order specification and control, including words +which have not existed in any previous standard. + +<P> + +Forth-83's +<a href=dpans16.htm#16.6.2.0715>ALSO</a>/<a href=dpans16.htm#16.6.2.1965>ONLY</a> +experimental search order word set is +specified for the most part as the extension portion of the ANS Forth +Search Order word set. + +<P> + +Words Affected: +<b><code>VOCABULARY CONTEXT CURRENT</code></b> +<P> + +Reason: Vocabularies are an area of much divergence among existing +systems. Considering major vendors' systems and previous standards, +there are at least 5 different and mutually incompatible behaviors of +words defined by VOCABULARY. Forth-83 took a step in the direction of +<B>run-time search-order specification</B> by declining to specify a +specific relationship between the hierarchy of compiled vocabularies and +the run-time search order. Forth-83 also specified an experimental +mechanism for run-time search-order specification, the ALSO/ONLY scheme. +ALSO/ONLY was implemented in numerous systems, and has achieved some +measure of popularity in the Forth community. + +<P> + +However, several vendors refuse to implement it, citing technical +limitations. In an effort to address those limitations and thus +hopefully make ALSO/ONLY more palatable to its critics, the committee +specified a simple <B>primitive word set</B> that not only fixes some of +the objections to ALSO/ONLY, but also provides sufficient power to +implement ALSO/ONLY and all of the other search-order word sets that are +currently popular. + +<P> + +The Forth-83 ALSO/ONLY word set is provided as an optional extension to +the search-order word set. This allows implementors that are so +inclined to provide this word set, with well-defined standard behavior, +but does not compel implementors to do so. Some vendors have publicly +stated that they will not implement ALSO/ONLY, no matter what, and one +major vendor stated an unwillingness to implement ANS Forth at all if +ALSO/ONLY is mandated. The committee feels that its actions are +prudent, specifying ALSO/ONLY to the extent possible without mandating +its inclusion in all systems, and also providing a primitive +search-order word set that vendors may be more likely to implement, and +which can be used to synthesize ALSO/ONLY. + +<P> + +Transition/Conversion: Since Forth-83 did not mandate precise semantics +for VOCABULARY, existing Forth-83 Standard programs cannot use it except +in a trivial way. Programs can declare a dependency on the existence of +the Search Order word set, and can implement whatever semantics are +required using that word set's primitives. Forth-83 programs that need +ALSO/ONLY can declare a dependency on the Search Order Extensions word +set, or can implement the extensions in terms of the Search Order word +set itself. + +<P> + +<hr> +<A name=D.6.11> +<H3>D.6.11 Multiprogramming impact</H3> +</a> + +Forth-83 marked words with <B>multiprogramming impact</B> by the letter +<B>M</B> in the first lines of their descriptions. ANS Forth has +removed the <B>M</B> designation from the word descriptions, moving the +discussion of multiprogramming impact to this non-normative annex. + +<P> + +Words affected: none +<P> + +Reason: The meaning of <B>multiprogramming impact</B> is precise only in +the context of a specific model for multiprogramming. Although many +Forth systems do provide multiprogramming capabilities using a +particular round-robin, cooperative, block-buffer sharing model, that +model is not universal. Even assuming the classical model, the <B>M</B> +designations did not contain enough information to enable writing of +applications that interacted in a multiprogrammed system. + +<P> + +Practically speaking, the <B>M</B> designations in Forth-83 served to +document usage rules for block buffer addresses in multiprogrammed +systems. These addresses often become meaningless after a task has +relinquished the CPU for any reason, most often for the purposes of +performing I/O, awaiting an event, or voluntarily sharing CPU resources +using the word PAUSE. It was essential that portable applications +respect those usage rules to make it practical to run them on +multiprogrammed systems; failure to adhere to the rules could easily +compromise the integrity of other applications running on those systems +as well as the applications actually in error. Thus, <B>M</B> appeared +on all words that by design gave up the CPU, with the understanding that +other words NEVER gave it up. + +<P> + +These usage rules have been explicitly documented in the Block word set +where they are relevant. The <B>M</B> designations have been removed +entirely. + +<P> + +Impact: In practice, none. +<P> + +In the sense that any application that depends on multiprogramming must +consist of at least two tasks that share some resource(s) and +communicate between themselves, Forth-83 did not contain enough +information to enable writing of a standard program that DEPENDED on +multiprogramming. This is also true of ANS Forth. + +<P> + +Non-multiprogrammed applications in Forth-83 were required to respect +usage rules for +<a href=dpans7.htm#7.6.1.0800>BLOCK</a> +so that they could be run properly on +multiprogrammed systems. The same is true of ANS Forth. + +<P> + +The only difference is the documentation method used to define the BLOCK +usage rules. The Technical Committee believes that the current method +is clearer than the concept of <B>multiprogramming impact</B>. + +<P> + +Transition/Conversion: +none needed. + +<P> + +<hr> +<A name=D.6.12> +<H3>D.6.12 Words not provided in executable form</H3> +</a> + +ANS Forth allows an implementation to supply some words in source code +or <B>load as needed</B> form, rather than requiring all supplied words +to be available with no additional programmer action. + +<P> + +Words affected: all +<P> + +Reason: Forth systems are often used in environments where memory space +is at a premium. Every word included in the system in executable form +consumes memory space. The committee believes that allowing standard +words to be provided in source form will increase the probability that +implementors will provide complete ANS Forth implementations even in +systems designed for use in constrained environments. + +<P> + +Impact: In order to use a Standard Program with a given ANS Forth +implementation, it may be necessary to precede the program with an +implementation-dependent <B>preface</B> to make <B>source form</B> words +executable. This is similar to the methods that other computer +languages require for selecting the library routines needed by a +particular application. + +<P> + +In languages like C, the goal of eliminating unnecessary routines from +the memory image of an application is usually accomplished by providing +libraries of routines, using a <B>linker</B> program to incorporate only +the necessary routines into an executable application. The method of +invoking and controlling the linker is outside the scope of the language +definition. + +<P> + +Transition/Conversion: Before compiling a program, the programmer may +need to perform some action to make the words required by that program +available for execution. +<P> + +<hr> +<A href=dpans.htm#toc><IMG src="up.gif" ></A> Table of Contents +<BR> +<A href=dpanse.htm><IMG src="right.gif" ></A> +Next Section +<P> +</BODY> +</HTML> diff --git a/mwmouse/sources/AnsForth/DPANSE.HTM b/mwmouse/sources/AnsForth/DPANSE.HTM @@ -0,0 +1,633 @@ +<HTML><HEAD> +<TITLE>DPANS94</TITLE> +<link disabled rel="stylesheet" href="mpexc6.css"> +<style>@import url(mpexc6.css);</style> +</head> + +<BODY> +<table width=100%> +<tr> +<td align=left> +<a href=dpansd.htm><img src=left.gif + width=26 height=26 align=ALIGN border=0></a> +<a href=dpansf.htm><img src=right.gif + width=26 height=26 align=ALIGN border=0></a> +</td> +<td align=right> +<a href=dpans.htm#toc><img src=up.gif + width=26 height=26 align=ALIGN border=0></a> +<a name=E.>Table of Contents</a> +</td> +</tr> +</table> +<p> +<hr size=4> + +<H1>E. ANS Forth portability guide (informative +annex)</H1> + + +<hr> +<A name=E.1> +<H1>E.1 Introduction</H1> +</a> + +The most popular architectures used to implement Forth have had +byte-addressed memory, 16-bit operations, and two's-complement number +representation. The Forth-83 Standard dictates that these particular +features must be present in a Forth-83 Standard system and that Forth-83 +programs may exploit these features freely. + +<P> + +However, there are many beasts in the architectural jungle that are bit +addressed or cell addressed, or prefer 32-bit operations, or represent +numbers in one's complement. Since one of Forth's strengths is its +usefulness in <B>strange</B> environments on <B>unusual</B> hardware +with <B>peculiar</B> features, it is important that a Standard Forth run +on these machines too. + +<P> + +A primary goal of the ANS Forth Standard is to increase the types of +machines that can support a Standard Forth. This is accomplished by +allowing some key Forth terms to be implementation-defined (e.g., how +big is a cell?) and by providing Forth operators (words) that conceal +the implementation. This frees the implementor to produce the Forth +system that most effectively utilizes the native hardware. The machine +independent operators, together with some programmer discipline, enable +a programmer to write Forth programs that work on a wide variety of +machines. + +<P> + +The remainder of this Annex provides guidelines for writing portable ANS +Forth programs. The first section describes ways to make a program +hardware independent. It is difficult for someone familiar with only +one machine architecture to imagine the problems caused by transporting +programs between dissimilar machines. Consequently, examples of +specific architectures with their respective problems are given. The +second section describes assumptions about Forth implementations that +many programmers make, but can't be relied upon in a portable program. + +<P> + + +<hr> +<A name=E.2> +<H1>E.2 Hardware peculiarities</H1> +</a> + + +<hr> +<A name=E.2.1> +<H2>E.2.1 Data/memory abstraction</H2> +</a> + +Data and memory are the stones and mortar of program construction. +Unfortunately, each computer treats data and memory differently. The +ANS Forth Systems Standard gives definitions of data and memory that +apply to a wide variety of computers. These definitions give us a way +to talk about the common elements of data and memory while ignoring the +details of specific hardware. Similarly, ANS Forth programs that use +data and memory in ways that conform to these definitions can also +ignore hardware details. The following sections discuss the definitions +and describe how to write programs that are independent of the +data/memory peculiarities of different computers. +<P> + + + +<hr> +<A name=E.2.2> +<H2>E.2.2 Definitions</H2> +</a> + +Three terms defined by ANS Forth are address unit, cell, and character. +The address space of an ANS Forth system is divided into an array of +address units; an address unit is the smallest collection of bits that +can be addressed. In other words, an address unit is the number of bits +spanned by the addresses addr and addr+1. The most prevalent machines +use 8-bit address units. Such <B>byte addressed</B> machines include +the Intel 8086 and Motorola 68000 families. However, other address unit +sizes exist. There are machines that are bit addressed and machines +that are 4-bit nibble addressed. There are also machines with address +units larger than 8-bits. For example, several Forth-in-hardware +computers are cell addressed. + +<P> + +The cell is the fundamental data type of a Forth system. A cell can be +a single-cell integer or a memory address. Forth's parameter and return +stacks are stacks of cells. Forth-83 specifies that a cell is 16-bits. +In ANS Forth the size of a cell is an implementation-defined number of +address units. Thus, an ANS Forth implemented on a 16-bit +microprocessor could use a 16-bit cell and an implementation on a 32-bit +machine could use a 32-bit cell. Also 18-bit machines, 36-bit machines, +etc., could support ANS Forth systems with 18 or 36-bit cells +respectively. In all of these systems, +<a href=dpans6.htm#6.1.1290>DUP</a> +does the same thing: it +duplicates the top of the data stack. +! (<a href=dpans6.htm#6.1.0010>store</a>) +behaves consistently +too: given two cells on the data stack it stores the second cell in the +memory location designated by the top cell. + +<P> + +Similarly, the definition of a character has been generalized to be an +implementation-defined number of address units (but at least eight +bits). This removes the need for a Forth implementor to provide 8-bit +characters on processors where it is inappropriate. For example, on an +18-bit machine with a 9-bit address unit, a 9-bit character would be +most convenient. Since, by definition, you can't address anything +smaller than an address unit, a character must be at least as big as an +address unit. This will result in big characters on machines with large +address units. An example is a 16-bit cell addressed machine where a +16-bit character makes the most sense. + +<P> + + +<hr> +<A name=E.2.3> +<H2>E.2.3 Addressing memory</H2> +</a> + +ANS Forth eliminates many portability problems by using the above +definitions. One of the most common portability problems is addressing +successive cells in memory. Given the memory address of a cell, how do +you find the address of the next cell? In Forth-83 this is easy: 2 + . +This code assumes that memory is addressed in 8-bit units (bytes) and a +cell is 16-bits wide. On a byte-addressed machine with 32-bit cells the +code to find the next cell would be 4 + . The code would be 1+ on a +cell-addressed processor and 16+ on a bit-addressed processor with +16-bit cells. ANS Forth provides a next-cell operator named +<a href=dpans6.htm#6.1.0880>CELL+</a> +that +can be used in all of these cases. Given an address, CELL+ adjusts the +address by the size of a cell (measured in address units). A related +problem is that of addressing an array of cells in an arbitrary order. +A defining word to create an array of cells using Forth-83 would be: + + +<PRE> + : ARRAY CREATE 2* ALLOT DOES> SWAP 2* + ; +</PRE> + +<P> + +Use of +<a href=dpans6.htm#6.1.0320>2*</a> +to scale the array index assumes byte addressing and 16-bit +cells again. As in the example above, different versions of the code +would be needed for different machines. ANS Forth provides a portable +scaling operator named +<a href=dpans6.htm#6.1.0890>CELLS</a>. +Given a number n, CELLS returns the +number of address units needed to hold n cells. A portable definition +of array is: + +<PRE> + : ARRAY CREATE CELLS ALLOT + DOES> SWAP CELLS + ; +</PRE> +<P> + +There are also portability problems with addressing arrays of +characters. In Forth-83 (and in the most common ANS Forth +implementations), the size of a character will equal the size of an +address unit. Consequently addresses of successive characters in memory +can be found using +<a href=dpans6.htm#6.1.0290>1+</a> +and scaling indices into a character array is a +no-op (i.e., 1 *). However, there are cases where a character is larger +than an address unit. Examples include (1) systems with small address +units (e.g., bit- and nibble-addressed systems), and (2) systems with +large character sets (e.g., 16-bit characters on a byte-addressed +machine). +<a href=dpans6.htm#6.1.0897>CHAR+</a> +and +<a href=dpans6.htm#6.1.0898>CHARS</a> +operators, analogous to CELL+ and CELLS are +available to allow maximum portability. +<P> + +ANS Forth generalizes the definition of some Forth words that operate on +chunks of memory to use address units. One example is +<a href=dpans6.htm#6.1.0710>ALLOT</a>. By +prefixing ALLOT with the appropriate scaling operator (CELLS, CHARS, +etc.), space for any desired data structure can be allocated (see +definition of array above). For example: + +<PRE> + CREATE ABUFFER 5 CHARS ALLOT ( allot 5 character buffer) +</PRE> +<P> + +The memory-block-move +word also uses address units: + + +<PRE> + source destination 8 CELLS MOVE ( move 8 cells) +</PRE> +<P> + + +<hr> +<A name=E.2.4> +<H2>E.2.4 Alignment problems</H2> +</a> + +Not all addresses are created equal. Many processors have restrictions +on the addresses that can be used by memory access instructions. This +Standard does not require an implementor of an ANS Forth to make +alignment transparent; on the contrary, it requires (in +<a href=dpans3.htm#3.3.3.1>Section 3.3.3.1</a> +Address alignment) that an ANS Forth program assume that character and +cell alignment may be required. + +<P> + +One of the most common problems caused by alignment restrictions is in +creating tables containing both characters and cells. When +, (<a href=dpans6.htm#6.1.0150>comma</a>) or +<a href=dpans6.htm#6.1.0860>C,</a> +is used to initialize a table, data is stored at the data-space +pointer. Consequently, it must be suitably aligned. For example, a +non-portable table definition would be: + + +<PRE> + CREATE ATABLE 1 C, X , 2 C, Y , +</PRE> + +<P> + +On a machine that restricts 16-bit fetches to even addresses, +<a href=dpans6.htm#6.1.1000>CREATE</a> +would leave the data space pointer at an even address, the 1 C, would +make the data space pointer odd, and , (comma) would violate the address +restriction by storing X at an odd address. A portable way to create +the table is: + + +<PRE> + CREATE ATABLE 1 C, ALIGN X , 2 C, ALIGN Y , +</PRE> + +<P> + +<a href=dpans6.htm#6.1.0705>ALIGN</a> +adjusts the data space pointer to the first aligned address +greater than or equal to its current address. An aligned address is +suitable for storing or fetching characters, cells, cell pairs, or +double-cell numbers. + +<P> + +After initializing the table, we would also like to read values from the +table. For example, assume we want to fetch the first cell, X, from the +table. ATABLE CHAR+ gives the address of the first thing after the +character. However this may not be the address of X since we aligned +the dictionary pointer between the C, and the ,. The portable way to +get the address of X is: + + +<PRE> + ATABLE CHAR+ ALIGNED +</PRE> + +<P> + +<a href=dpans6.htm#6.1.0706>ALIGNED</a> +adjusts the address on top of the stack to the first aligned +address greater than or equal to its current value. + +<P> + + +<hr> +<A name=E.3> +<H1>E.3 Number representation</H1> +</a> + +Different computers represent numbers in different ways. An awareness +of these differences can help a programmer avoid writing a program that +depends on a particular representation. + +<P> + + +<hr> +<A name=E.3.1> +<H2>E.3.1 Big endian vs. little endian</H2> +</a> + +The constituent bits of a number in memory are kept in different orders +on different machines. Some machines place the most-significant part of +a number at an address in memory with less-significant parts following +it at higher addresses. Other machines do the opposite the +least-significant part is stored at the lowest address. For example, +the following code for a 16-bit 8086 <B>little endian</B> Forth would +produce the answer 34 (hex): + + +<PRE> + VARIABLE FOO HEX 1234 FOO ! FOO C@ +</PRE> +<P> + +The same code on a 16-bit 68000 <B>big endian</B> Forth would produce +the answer 12 (hex). A portable program cannot exploit the +representation of a number in memory. + +<P> + +A related issue is the representation of cell pairs and double-cell +numbers in memory. When a cell pair is moved from the stack to memory +with +<a href=dpans6.htm#6.1.0310>2!</a>, +the cell that was on top of the stack is placed at the lower +memory address. It is useful and reasonable to manipulate the +individual cells when they are in memory. + +<P> + + +<hr> +<A name=E.3.2> +<H2>E.3.2 ALU organization</H2> +</a> + +Different computers use different bit patterns to represent integers. +Possibilities include binary representations (two's complement, one's +complement, sign magnitude, etc.) and decimal representations (BCD, +etc.). Each of these formats creates advantages and disadvantages in +the design of a computer's arithmetic logic unit (ALU). The most +commonly used representation, two's complement, is popular because of +the simplicity of its addition and subtraction algorithms. + +<P> + +Programmers who have grown up on two's complement machines tend to +become intimate with their representation of numbers and take some +properties of that representation for granted. For example, a trick to +find the remainder of a number divided by a power of two is to mask off +some bits with +<a href=dpans6.htm#6.1.0720>AND</a>. +A common application of this trick is to test a +number for oddness using 1 AND. However, this will not work on a one's +complement machine if the number is negative (a portable technique is 2 +<a href=dpans6.htm#6.1.1890>MOD</a>). + +<P> + +The remainder of this section is a (non-exhaustive) list of things to +watch for when portability between machines with binary representations +other than two's complement is desired. + +<P> + +To convert a single-cell number to a double-cell number, ANS Forth +provides the operator +<a href=dpans6.htm#6.1.2170>S>D</a>. +To convert a double-cell number to +single-cell, Forth programmers have traditionally used +<a href=dpans6.htm#6.1.1260>DROP</a>. +However, +this trick doesn't work on sign-magnitude machines. For portability a +<a href=dpans8.htm#8.6.1.1140>D&gt;S</a> +operator is available. Converting an unsigned single-cell number to +a double-cell number can be done portably by pushing a zero on the +stack. + +<P> + + +<hr> +<A name=E.4> +<H1>E.4 Forth system implementation</H1> +</a> + +During Forth's history, an amazing variety of implementation techniques +have been developed. The ANS Forth Standard encourages this diversity +and consequently restricts the assumptions a user can make about the +underlying implementation of an ANS Forth system. Users of a particular +Forth implementation frequently become accustomed to aspects of the +implementation and assume they are common to all Forths. This section +points out many of these incorrect assumptions. + +<P> + + +<hr> +<A name=E.4.1> +<H2>E.4.1 Definitions</H2> +</a> + +Traditionally, Forth definitions have consisted of the name of the Forth +word, a dictionary search link, data describing how to execute the +definition, and parameters describing the definition itself. These +components are called the name, link, code, and parameter fields. No +method for accessing these fields has been found that works across all +of the Forth implementations currently in use. Therefore, ANS Forth +severely restricts how the fields may be used. Specifically, a portable +ANS Forth program may not use the name, link, or code field in any way. +Use of the parameter field (renamed to data field for clarity) is +limited to the operations described below. + +<P> + +Only words defined with +<a href=dpans6.htm#6.1.1000>CREATE</a> +or with other defining words that call +CREATE have data fields. The other defining words in the Standard +(<a href=dpans6.htm#6.1.2410>VARIABLE</a>, +<a href=dpans6.htm#6.1.0950>CONSTANT</a>, +<a href=dpans6.htm#6.1.0450>:</a>, +etc.) might not be implemented with CREATE. +Consequently, a Standard Program must assume that words defined by +VARIABLE, CONSTANT, : , etc., may have no data fields. There is no way +for a Standard Program to modify the value of a constant or to change +the meaning of a colon definition. The +<a href=dpans6.htm#6.1.1250>DOES</a>> +part of a defining word +operates on a data field. Since only CREATEd words have data fields, +DOES> can only be paired with CREATE or words that call CREATE. + +<P> + +In ANS Forth, +<a href=dpans6.htm#6.1.1550>FIND</a>, +<a href=dpans6.htm#6.1.2510>[']</a> and +' (<a href=dpans6.htm#6.1.0070>tick</a>) +return an unspecified entity called +an <B>execution token</B>. There are only a few things that may be done +with an execution token. The token may be passed to +<a href=dpans6.htm#6.1.1370>EXECUTE</a> +to execute +the word ticked or compiled into the current definition with +<a href=dpans6.htm#6.2.0945>COMPILE,</a>. +The token can also be stored in a variable and used later. Finally, if +the word ticked was defined via CREATE, +<a href=dpans6.htm#6.1.0550>>BODY</a> +converts the execution +token into the word's data-field address. + +<P> + +One thing that definitely cannot be done with an execution token is use +<a href=dpans6.htm#6.1.0010>!</a> +or +<a href=dpans6.htm#6.1.0150>,</a> +to store it into the object code of a Forth definition. This +technique is sometimes used in implementations where the object code is +a list of addresses (threaded code) and an execution token is also an +address. However, ANS Forth permits native code implementations where +this will not work. + +<P> + + +<hr> +<A name=E.4.2> +<H2>E.4.2 Stacks</H2> +</a> + +In some Forth implementations, it is possible to find the address of a +stack in memory and manipulate the stack as an array of cells. This +technique is not portable, however. On some systems, especially +Forth-in-hardware systems, the stacks might be in a part of memory that +can't be addressed by the program or might not be in memory at all. +Forth's parameter and return stacks must be treated as stacks. + +<P> + +A Standard Program may use the return stack directly only for +temporarily storing values. Every value examined or removed from the +return stack using +<a href=dpans6.htm#6.1.2070>R@</a>, +<a href=dpans6.htm#6.1.2060>R></a>, or +<a href=dpans6.htm#6.2.0410>2R></a> +must have been put on the stack +explicitly using +<a href=dpans6.htm#6.1.0580>>R</a> or +<a href=dpans6.htm#6.2.0340>2>R</a>. +Even this must be done carefully since the +system may use the return stack to hold return addresses and +loop-control parameters. +<a href=dpans3.htm#3.2.3.3>Section 3.2.3.3</a> Return stack of the Standard +has a list of restrictions. + +<P> + + +<hr> +<A name=E.5> +<H1>E.5 ROMed application disciplines and conventions</H1> +</a> + +When a Standard System provides a data space which is uniformly readable +and writeable we may term this environment <B>RAM-only</B>. + +<P> + +Programs designed for ROMed application must divide data space into at +least two parts: a writeable and readable uninitialized part, called +<B>RAM</B>, and a read-only initialized part, called <B>ROM</B>. A +third possibility, a writeable and readable initialized part, normally +called <B>initialized RAM</B>, is not addressed by this discipline. A +Standard Program must explicitly initialize the RAM data space as +needed. + +<P> + +The separation of data space into RAM and ROM is meaningful only during +the generation of the ROMed program. If the ROMed program is itself a +standard development system, it has the same taxonomy as an ordinary +RAM-only system. + +<P> + +The words affected by conversion from a RAM-only to a mixed RAM and ROM +environment are: + +<p> +, (<a href=dpans6.htm#6.1.0150>comma</a>) +<a href=dpans6.htm#6.1.0705>ALIGN</a> +<a href=dpans6.htm#6.1.0706>ALIGNED</a> +<a href=dpans6.htm#6.1.0710>ALLOT</a> +<a href=dpans6.htm#6.1.0860>C,</a> +<a href=dpans6.htm#6.1.1000>CREATE</a> +<a href=dpans6.htm#6.1.1650>HERE</a> +<a href=dpans6.htm#6.2.2395>UNUSED</a> +<P> + +(<a href=dpans6.htm#6.1.2410>VARIABLE</a> always +accesses the RAM data space.) + +<P> + +With the exception of , (comma) and C, +these words are meaningful in both RAM +and ROM data space. + +<P> + +To select the data space, these words could be preceded by selectors RAM +and ROM. For example: + + +<PRE> + ROM CREATE ONES 32 ALLOT ONES 32 1 FILL RAM +</PRE> + +<P> + +would create a table of ones in the ROM data space. The storage of data +into RAM data space when generating a program for ROM would be an +ambiguous condition. + +<P> + +A straightforward implementation of these selectors would maintain +separate address counters for each space. A counter value would be +returned by HERE and altered by , (comma), C,, ALIGN, and ALLOT, with +RAM and ROM simply selecting the appropriate address counter. This +technique could be extended to additional partitions of the data space. + +<P> + + +<hr> +<A name=E.6> +<H1>E.6 Summary</H1> +</a> + +The ANS Forth Standard cannot and should not force anyone to write a +portable program. In situations where performance is paramount, the +programmer is encouraged to use every trick in the book. On the other +hand, if portability to a wide variety of systems is needed, ANS Forth +provides the tools to accomplish this. There is probably no such thing +as a completely portable program. A programmer, using this guide, +should intelligently weigh the tradeoffs of providing portability to +specific machines. For example, machines that use sign-magnitude +numbers are rare and probably don't deserve much thought. But, systems +with different cell sizes will certainly be encountered and should be +provided for. In general, making a program portable clarifies both the +programmer's thinking process and the final program. + +<P> + + +<hr> +<A href=dpans.htm#toc><IMG src="up.gif" ></A> Table of Contents +<BR> +<A href=dpansf.htm><IMG src="right.gif" ></A> +Next Section +<P> +</BODY> +</HTML> diff --git a/mwmouse/sources/AnsForth/DPANSF.HTM b/mwmouse/sources/AnsForth/DPANSF.HTM @@ -0,0 +1,432 @@ +<HTML><HEAD> +<TITLE>DPANS94</TITLE> +<link disabled rel="stylesheet" href="mpexc6.css"> +<style>@import url(mpexc6.css);</style> +</head> + +<BODY> +<table width=100%> +<tr> +<td align=left> +<a href=dpanse.htm><img src=left.gif + width=26 height=26 align=ALIGN border=0></a> +</td> +<td align=right> +<a href=dpans.htm#toc><img src=up.gif + width=26 height=26 align=ALIGN border=0></a> +<a name=F.>Table of Contents</a> +</td> +</tr> +</table> +<p> +<hr size=4> + +<H1>F. Alphabetic list of words (informative +annex)</H1> + +In the following list, the last, four-digit, part of the reference number +establishes a sequence corresponding to the alphabetic ordering of all +standard words. The first two or three parts indicate the word set and +glossary section in which the word is defined. + + +<PRE> + <A href=dpans6.htm#6.1.0010>.6.1.0010</A> ! <B>store</B> CORE + <A href=dpans6.htm#6.1.0030>.6.1.0030</A> # <B>number-sign</B> CORE + <A href=dpans6.htm#6.1.0040>.6.1.0040</A> #> <B>number-sign-greater</B> CORE + <A href=dpans6.htm#6.1.0050>.6.1.0050</A> #S <B>number-sign-s</B> CORE + <A href=dpans6.htm#6.2.0060>.6.2.0060</A> #TIB <B>number-t-i-b</B> CORE EXT + <A href=dpans6.htm#6.1.0070>.6.1.0070</A> ' <B>tick</B> CORE + <A href=dpans6.htm#6.1.0080>.6.1.0080</A> ( <B>paren</B> CORE + <A href=dpans11.htm#11.6.1.0080>11.6.1.0080</A> ( <B>paren</B> FILE + <A href=dpans13.htm#13.6.1.0086>13.6.1.0086</A> (LOCAL) <B>paren-local-paren</B> LOCAL + <A href=dpans6.htm#6.1.0090>.6.1.0090</A> * <B>star</B> CORE + <A href=dpans6.htm#6.1.0100>.6.1.0100</A> */ <B>star-slash</B> CORE + <A href=dpans6.htm#6.1.0110>.6.1.0110</A> */MOD <B>star-slash-mod</B> CORE + <A href=dpans6.htm#6.1.0120>.6.1.0120</A> + <B>plus</B> CORE + <A href=dpans6.htm#6.1.0130>.6.1.0130</A> +! <B>plus-store</B> CORE + <A href=dpans6.htm#6.1.0140>.6.1.0140</A> +LOOP <B>plus-loop</B> CORE + <A href=dpans6.htm#6.1.0150>.6.1.0150</A> , <B>comma</B> CORE + <A href=dpans6.htm#6.1.0160>.6.1.0160</A> - <B>minus</B> CORE + <A href=dpans17.htm#17.6.1.0170>17.6.1.0170</A> -TRAILING <B>dash-trailing</B> STRING + <A href=dpans6.htm#6.1.0180>.6.1.0180</A> . <B>dot</B> CORE + <A href=dpans6.htm#6.1.0190>.6.1.0190</A> ." <B>dot-quote</B> CORE + <A href=dpans6.htm#6.2.0200>.6.2.0200</A> .( <B>dot-paren</B> CORE EXT + <A href=dpans6.htm#6.2.0210>.6.2.0210</A> .R <B>dot-r</B> CORE EXT + <A href=dpans15.htm#15.6.1.0220>15.6.1.0220</A> .S <B>dot-s</B> TOOLS + <A href=dpans6.htm#6.1.0230>.6.1.0230</A> / <B>slash</B> CORE + <A href=dpans6.htm#6.1.0240>.6.1.0240</A> /MOD <B>slash-mod</B> CORE + <A href=dpans17.htm#17.6.1.0245>17.6.1.0245</A> /STRING <B>slash-string</B> STRING + <A href=dpans6.htm#6.1.0250>.6.1.0250</A> 0< <B>zero-less</B> CORE + <A href=dpans6.htm#6.2.0260>.6.2.0260</A> 0<&gt; <B>zero-not-equals</B> CORE EXT + <A href=dpans6.htm#6.1.0270>.6.1.0270</A> 0= <B>zero-equals</B> CORE + <A href=dpans6.htm#6.2.0280>.6.2.0280</A> 0&gt; <B>zero-greater</B> CORE EXT + <A href=dpans6.htm#6.1.0290>.6.1.0290</A> 1+ <B>one-plus</B> CORE + <A href=dpans6.htm#6.1.0300>.6.1.0300</A> 1- <B>one-minus</B> CORE + <A href=dpans6.htm#6.1.0310>.6.1.0310</A> 2! <B>two-store</B> CORE + <A href=dpans6.htm#6.1.0320>.6.1.0320</A> 2* <B>two-star</B> CORE + <A href=dpans6.htm#6.1.0330>.6.1.0330</A> 2/ <B>two-slash</B> CORE + <A href=dpans6.htm#6.2.0340>.6.2.0340</A> 2&gt;R <B>two-to-r</B> CORE EXT + <A href=dpans6.htm#6.1.0350>.6.1.0350</A> 2@ <B>two-fetch</B> CORE + <A href=dpans8.htm#8.6.1.0360>8.6.1.0360</A> 2CONSTANT <B>two-constant</B> DOUBLE + <A href=dpans6.htm#6.1.0370>.6.1.0370</A> 2DROP <B>two-drop</B> CORE + <A href=dpans6.htm#6.1.0380>.6.1.0380</A> 2DUP <B>two-dupe</B> CORE + <A href=dpans8.htm#8.6.1.0390>8.6.1.0390</A> 2LITERAL <B>two-literal</B> DOUBLE + <A href=dpans6.htm#6.1.0400>.6.1.0400</A> 2OVER <B>two-over</B> CORE + <A href=dpans6.htm#6.2.0410>.6.2.0410</A> 2R> <B>two-r-from</B> CORE EXT + <A href=dpans6.htm#6.2.0415>.6.2.0415</A> 2R@ <B>two-r-fetch</B> CORE EXT + <A href=dpans8.htm#8.6.2.0420>8.6.2.0420</A> 2ROT <B>two-rote</B> DOUBLE EXT + <A href=dpans6.htm#6.1.0430>.6.1.0430</A> 2SWAP <B>two-swap</B> CORE + <A href=dpans8.htm#8.6.1.0440>8.6.1.0440</A> 2VARIABLE <B>two-variable</B> DOUBLE + <A href=dpans6.htm#6.1.0450>.6.1.0450</A> : <B>colon</B> CORE + <A href=dpans6.htm#6.2.0455>.6.2.0455</A> :NONAME <B>colon-no-name</B> CORE EXT + <A href=dpans6.htm#6.1.0460>.6.1.0460</A> ; <B>semicolon</B> CORE + <A href=dpans15.htm#15.6.2.0470>15.6.2.0470</A> ;CODE <B>semicolon-code</B> TOOLS EXT + <A href=dpans6.htm#6.1.0480>.6.1.0480</A> &lt; <B>less-than</B> CORE + <A href=dpans6.htm#6.1.0490>.6.1.0490</A> &lt;# <B>less-number-sign</B> CORE + <A href=dpans6.htm#6.2.0500>.6.2.0500</A> &lt;> <B>not-equals</B> CORE EXT + <A href=dpans6.htm#6.1.0530>.6.1.0530</A> = <B>equals</B> CORE + <A href=dpans6.htm#6.1.0540>.6.1.0540</A> > <B>greater-than</B> CORE + <A href=dpans6.htm#6.1.0550>.6.1.0550</A> >BODY <B>to-body</B> CORE + <A href=dpans12.htm#12.6.1.0558>12.6.1.0558</A> >FLOAT <B>to-float</B> FLOATING + <A href=dpans6.htm#6.1.0560>.6.1.0560</A> >IN <B>to-in</B> CORE + <A href=dpans6.htm#6.1.0570>.6.1.0570</A> >NUMBER <B>to-number</B> CORE + <A href=dpans6.htm#6.1.0580>.6.1.0580</A> >R <B>to-r</B> CORE + <A href=dpans15.htm#15.6.1.0600>15.6.1.0600</A> ? <B>question</B> TOOLS + <A href=dpans6.htm#6.2.0620>.6.2.0620</A> ?DO <B>question-do</B> CORE EXT + <A href=dpans6.htm#6.1.0630>.6.1.0630</A> ?DUP <B>question-dupe</B> CORE + <A href=dpans6.htm#6.1.0650>.6.1.0650</A> @ <B>fetch</B> CORE + <A href=dpans6.htm#6.1.0670>.6.1.0670</A> ABORT CORE + <A href=dpans9.htm#9.6.2.0670>9.6.2.0670</A> ABORT EXCEPTION EXT + <A href=dpans6.htm#6.1.0680>.6.1.0680</A> ABORT" <B>abort-quote</B> CORE + <A href=dpans9.htm#9.6.2.0680>9.6.2.0680</A> ABORT" <B>abort-quote</B> EXCEPTION EXT + <A href=dpans6.htm#6.1.0690>.6.1.0690</A> ABS <B>abs</B> CORE + <A href=dpans6.htm#6.1.0695>.6.1.0695</A> ACCEPT CORE + <A href=dpans6.htm#6.2.0700>.6.2.0700</A> AGAIN CORE EXT + <A href=dpans15.htm#15.6.2.0702>15.6.2.0702</A> AHEAD TOOLS EXT + <A href=dpans6.htm#6.1.0705>.6.1.0705</A> ALIGN CORE + <A href=dpans6.htm#6.1.0706>.6.1.0706</A> ALIGNED CORE + <A href=dpans14.htm#14.6.1.0707>14.6.1.0707</A> ALLOCATE MEMORY + <A href=dpans6.htm#6.1.0710>.6.1.0710</A> ALLOT CORE + <A href=dpans16.htm#16.6.2.0715>16.6.2.0715</A> ALSO SEARCH EXT + <A href=dpans6.htm#6.1.0720>.6.1.0720</A> AND CORE + <A href=dpans15.htm#15.6.2.0740>15.6.2.0740</A> ASSEMBLER TOOLS EXT + <A href=dpans10.htm#10.6.1.0742>10.6.1.0742</A> AT-XY <B>at-x-y</B> FACILITY + <A href=dpans6.htm#6.1.0750>.6.1.0750</A> BASE CORE + <A href=dpans6.htm#6.1.0760>.6.1.0760</A> BEGIN CORE + <A href=dpans11.htm#11.6.1.0765>11.6.1.0765</A> BIN FILE + <A href=dpans6.htm#6.1.0770>.6.1.0770</A> BL <B>b-l</B> CORE + <A href=dpans17.htm#17.6.1.0780>17.6.1.0780</A> BLANK STRING + <A href=dpans7.htm#7.6.1.0790>7.6.1.0790</A> BLK <B>b-l-k</B> BLOCK + <A href=dpans7.htm#7.6.1.0800>7.6.1.0800</A> BLOCK BLOCK + <A href=dpans7.htm#7.6.1.0820>7.6.1.0820</A> BUFFER BLOCK + <A href=dpans15.htm#15.6.2.0830>15.6.2.0830</A> BYE TOOLS EXT + <A href=dpans6.htm#6.1.0850>.6.1.0850</A> C! <B>c-store</B> CORE + <A href=dpans6.htm#6.2.0855>.6.2.0855</A> C" <B>c-quote</B> CORE EXT + <A href=dpans6.htm#6.1.0860>.6.1.0860</A> C, <B>c-comma</B> CORE + <A href=dpans6.htm#6.1.0870>.6.1.0870</A> C@ <B>c-fetch</B> CORE + <A href=dpans6.htm#6.2.0873>.6.2.0873</A> CASE CORE EXT + <A href=dpans9.htm#9.6.1.0875>9.6.1.0875</A> CATCH EXCEPTION + <A href=dpans6.htm#6.1.0880>.6.1.0880</A> CELL+ <B>cell-plus</B> CORE + <A href=dpans6.htm#6.1.0890>.6.1.0890</A> CELLS CORE + <A href=dpans6.htm#6.1.0895>.6.1.0895</A> CHAR <B>char</B> CORE + <A href=dpans6.htm#6.1.0897>.6.1.0897</A> CHAR+ <B>char-plus</B> CORE + <A href=dpans6.htm#6.1.0898>.6.1.0898</A> CHARS <B>chars</B> CORE + <A href=dpans11.htm#11.6.1.0900>11.6.1.0900</A> CLOSE-FILE FILE + <A href=dpans17.htm#17.6.1.0910>17.6.1.0910</A> CMOVE <B>c-move</B> STRING + <A href=dpans17.htm#17.6.1.0920>17.6.1.0920</A> CMOVE> <B>c-move-up</B> STRING + <A href=dpans15.htm#15.6.2.0930>15.6.2.0930</A> CODE TOOLS EXT + <A href=dpans17.htm#17.6.1.0935>17.6.1.0935</A> COMPARE STRING + <A href=dpans6.htm#6.2.0945>.6.2.0945</A> COMPILE, <B>compile-comma</B> CORE EXT + <A href=dpans6.htm#6.1.0950>.6.1.0950</A> CONSTANT CORE + <A href=dpans6.htm#6.2.0970>.6.2.0970</A> CONVERT CORE EXT + <A href=dpans6.htm#6.1.0980>.6.1.0980</A> COUNT CORE + <A href=dpans6.htm#6.1.0990>.6.1.0990</A> CR <B>c-r</B> CORE + <A href=dpans6.htm#6.1.1000>.6.1.1000</A> CREATE CORE + <A href=dpans11.htm#11.6.1.1010>11.6.1.1010</A> CREATE-FILE FILE + <A href=dpans15.htm#15.6.2.1015>15.6.2.1015</A> CS-PICK <B>c-s-pick</B> TOOLS EXT + <A href=dpans15.htm#15.6.2.1020>15.6.2.1020</A> CS-ROLL <B>c-s-roll</B> TOOLS EXT + <A href=dpans8.htm#8.6.1.1040>8.6.1.1040</A> D+ <B>d-plus</B> DOUBLE + <A href=dpans8.htm#8.6.1.1050>8.6.1.1050</A> D- <B>d-minus</B> DOUBLE + <A href=dpans8.htm#8.6.1.1060>8.6.1.1060</A> D. <B>d-dot</B> DOUBLE + <A href=dpans8.htm#8.6.1.1070>8.6.1.1070</A> D.R <B>d-dot-r</B> DOUBLE + <A href=dpans8.htm#8.6.1.1075>8.6.1.1075</A> D0< <B>d-zero-less</B> DOUBLE + <A href=dpans8.htm#8.6.1.1080>8.6.1.1080</A> D0= <B>d-zero-equals</B> DOUBLE + <A href=dpans8.htm#8.6.1.1090>8.6.1.1090</A> D2* <B>d-two-star</B> DOUBLE + <A href=dpans8.htm#8.6.1.1100>8.6.1.1100</A> D2/ <B>d-two-slash</B> DOUBLE + <A href=dpans8.htm#8.6.1.1110>8.6.1.1110</A> D< <B>d-less-than</B> DOUBLE + <A href=dpans8.htm#8.6.1.1120>8.6.1.1120</A> D= <B>d-equals</B> DOUBLE + <A href=dpans12.htm#12.6.1.1130>12.6.1.1130</A> D>F <B>d-to-f</B> FLOATING + <A href=dpans8.htm#8.6.1.1140>8.6.1.1140</A> D>S <B>d-to-s</B> DOUBLE + <A href=dpans8.htm#8.6.1.1160>8.6.1.1160</A> DABS <B>d-abs</B> DOUBLE + <A href=dpans6.htm#6.1.1170>.6.1.1170</A> DECIMAL CORE + <A href=dpans16.htm#16.6.1.1180>16.6.1.1180</A> DEFINITIONS SEARCH + <A href=dpans11.htm#11.6.1.1190>11.6.1.1190</A> DELETE-FILE FILE + <A href=dpans6.htm#6.1.1200>.6.1.1200</A> DEPTH CORE + <A href=dpans12.htm#12.6.2.1203>12.6.2.1203</A> DF! <B>d-f-store</B> FLOATING EXT + <A href=dpans12.htm#12.6.2.1204>12.6.2.1204</A> DF@ <B>d-f-fetch</B> FLOATING EXT + <A href=dpans12.htm#12.6.2.1205>12.6.2.1205</A> DFALIGN <B>d-f-align</B> FLOATING EXT + <A href=dpans12.htm#12.6.2.1207>12.6.2.1207</A> DFALIGNED <B>d-f-aligned</B> FLOATING EXT + <A href=dpans12.htm#12.6.2.1208>12.6.2.1208</A> DFLOAT+ <B>d-float-plus</B> FLOATING EXT + <A href=dpans12.htm#12.6.2.1209>12.6.2.1209</A> DFLOATS <B>d-floats</B> FLOATING EXT + <A href=dpans8.htm#8.6.1.1210>8.6.1.1210</A> DMAX <B>d-max</B> DOUBLE + <A href=dpans8.htm#8.6.1.1220>8.6.1.1220</A> DMIN <B>d-min</B> DOUBLE + <A href=dpans8.htm#8.6.1.1230>8.6.1.1230</A> DNEGATE <B>d-negate</B> DOUBLE + <A href=dpans6.htm#6.1.1240>.6.1.1240</A> DO CORE + <A href=dpans6.htm#6.1.1250>.6.1.1250</A> DOES> <B>does</B> CORE + <A href=dpans6.htm#6.1.1260>.6.1.1260</A> DROP CORE + <A href=dpans8.htm#8.6.2.1270>8.6.2.1270</A> DU< <B>d-u-less</B> DOUBLE EXT + <A href=dpans15.htm#15.6.1.1280>15.6.1.1280</A> DUMP TOOLS + <A href=dpans6.htm#6.1.1290>.6.1.1290</A> DUP <B>dupe</B> CORE + <A href=dpans15.htm#15.6.2.1300>15.6.2.1300</A> EDITOR TOOLS EXT + <A href=dpans10.htm#10.6.2.1305>10.6.2.1305</A> EKEY <B>e-key</B> FACILITY EXT + <A href=dpans10.htm#10.6.2.1306>10.6.2.1306</A> EKEY>CHAR <B>e-key-to-char</B> FACILITY EXT + <A href=dpans10.htm#10.6.2.1307>10.6.2.1307</A> EKEY? <B>e-key-question</B> FACILITY EXT + <A href=dpans6.htm#6.1.1310>.6.1.1310</A> ELSE CORE + <A href=dpans6.htm#6.1.1320>.6.1.1320</A> EMIT CORE + <A href=dpans10.htm#10.6.2.1325>10.6.2.1325</A> EMIT? <B>emit-question</B> FACILITY EXT + <A href=dpans7.htm#7.6.2.1330>7.6.2.1330</A> EMPTY-BUFFERS BLOCK EXT + <A href=dpans6.htm#6.2.1342>.6.2.1342</A> ENDCASE <B>end-case</B> CORE EXT + <A href=dpans6.htm#6.2.1343>.6.2.1343</A> ENDOF <B>end-of</B> CORE EXT + <A href=dpans6.htm#6.1.1345>.6.1.1345</A> ENVIRONMENT?<B>environment-query</B> CORE + <A href=dpans6.htm#6.2.1350>.6.2.1350</A> ERASE CORE EXT + <A href=dpans6.htm#6.1.1360>.6.1.1360</A> EVALUATE CORE + <A href=dpans7.htm#7.6.1.1360>7.6.1.1360</A> EVALUATE BLOCK + <A href=dpans6.htm#6.1.1370>.6.1.1370</A> EXECUTE CORE + <A href=dpans6.htm#6.1.1380>.6.1.1380</A> EXIT CORE + <A href=dpans6.htm#6.2.1390>.6.2.1390</A> EXPECT CORE EXT + <A href=dpans12.htm#12.6.1.1400>12.6.1.1400</A> F! <B>f-store</B> FLOATING + <A href=dpans12.htm#12.6.1.1410>12.6.1.1410</A> F* <B>f-star</B> FLOATING + <A href=dpans12.htm#12.6.2.1415>12.6.2.1415</A> F** <B>f-star-star</B> FLOATING EXT + <A href=dpans12.htm#12.6.1.1420>12.6.1.1420</A> F+ <B>f-plus</B> FLOATING + <A href=dpans12.htm#12.6.1.1425>12.6.1.1425</A> F- <B>f-minus</B> FLOATING + <A href=dpans12.htm#12.6.2.1427>12.6.2.1427</A> F. <B>f-dot</B> FLOATING EXT + <A href=dpans12.htm#12.6.1.1430>12.6.1.1430</A> F/ <B>f-slash</B> FLOATING + <A href=dpans12.htm#12.6.1.1440>12.6.1.1440</A> F0< <B>f-zero-less-than</B> FLOATING + <A href=dpans12.htm#12.6.1.1450>12.6.1.1450</A> F0= <B>f-zero-equals</B> FLOATING + <A href=dpans12.htm#12.6.1.1460>12.6.1.1460</A> F< <B>f-less-than</B> FLOATING + <A href=dpans12.htm#12.6.1.1470>12.6.1.1470</A> F>D <B>f-to-d</B> FLOATING + <A href=dpans12.htm#12.6.1.1472>12.6.1.1472</A> F@ <B>f-fetch</B> FLOATING + <A href=dpans12.htm#12.6.2.1474>12.6.2.1474</A> FABS <B>f-abs</B> FLOATING EXT + <A href=dpans12.htm#12.6.2.1476>12.6.2.1476</A> FACOS <B>f-a-cos</B> FLOATING EXT + <A href=dpans12.htm#12.6.2.1477>12.6.2.1477</A> FACOSH <B>f-a-cosh</B> FLOATING EXT + <A href=dpans12.htm#12.6.1.1479>12.6.1.1479</A> FALIGN <B>f-align</B> FLOATING + <A href=dpans12.htm#12.6.1.1483>12.6.1.1483</A> FALIGNED <B>f-aligned</B> FLOATING + <A href=dpans12.htm#12.6.2.1484>12.6.2.1484</A> FALOG <B>f-a-log</B> FLOATING EXT + <A href=dpans6.htm#6.2.1485>.6.2.1485</A> FALSE CORE EXT + <A href=dpans12.htm#12.6.2.1486>12.6.2.1486</A> FASIN <B>f-a-sine</B> FLOATING EXT + <A href=dpans12.htm#12.6.2.1487>12.6.2.1487</A> FASINH <B>f-a-cinch</B> FLOATING EXT + <A href=dpans12.htm#12.6.2.1488>12.6.2.1488</A> FATAN <B>f-a-tan</B> FLOATING EXT + <A href=dpans12.htm#12.6.2.1489>12.6.2.1489</A> FATAN2 <B>f-a-tan-two</B> FLOATING EXT + <A href=dpans12.htm#12.6.2.1491>12.6.2.1491</A> FATANH <B>f-a-tan-h</B> FLOATING EXT + <A href=dpans12.htm#12.6.1.1492>12.6.1.1492</A> FCONSTANT <B>f-constant</B> FLOATING + <A href=dpans12.htm#12.6.2.1493>12.6.2.1493</A> FCOS <B>f-cos</B> FLOATING EXT + <A href=dpans12.htm#12.6.2.1494>12.6.2.1494</A> FCOSH <B>f-cosh</B> FLOATING EXT + <A href=dpans12.htm#12.6.1.1497>12.6.1.1497</A> FDEPTH <B>f-depth</B> FLOATING + <A href=dpans12.htm#12.6.1.1500>12.6.1.1500</A> FDROP <B>f-drop</B> FLOATING + <A href=dpans12.htm#12.6.1.1510>12.6.1.1510</A> FDUP <B>f-dupe</B> FLOATING + <A href=dpans12.htm#12.6.2.1513>12.6.2.1513</A> FE. <B>f-e-dot</B> FLOATING EXT + <A href=dpans12.htm#12.6.2.1515>12.6.2.1515</A> FEXP <B>f-e-x-p</B> FLOATING EXT + <A href=dpans12.htm#12.6.2.1516>12.6.2.1516</A> FEXPM1 <B>f-e-x-p-m-one</B> FLOATING EXT + <A href=dpans11.htm#11.6.1.1520>11.6.1.1520</A> FILE-POSITION FILE + <A href=dpans11.htm#11.6.1.1522>11.6.1.1522</A> FILE-SIZE FILE + <A href=dpans11.htm#11.6.2.1524>11.6.2.1524</A> FILE-STATUS FILE EXT + <A href=dpans6.htm#6.1.1540>.6.1.1540</A> FILL CORE + <A href=dpans6.htm#6.1.1550>.6.1.1550</A> FIND CORE + <A href=dpans16.htm#16.6.1.1550>16.6.1.1550</A> FIND SEARCH + <A href=dpans12.htm#12.6.1.1552>12.6.1.1552</A> FLITERAL <B>f-literal</B> FLOATING + <A href=dpans12.htm#12.6.2.1553>12.6.2.1553</A> FLN <B>f-l-n</B> FLOATING EXT + <A href=dpans12.htm#12.6.2.1554>12.6.2.1554</A> FLNP1 <B>f-l-n-p-one</B> FLOATING EXT + <A href=dpans12.htm#12.6.1.1555>12.6.1.1555</A> FLOAT+ <B>float-plus</B> FLOATING + <A href=dpans12.htm#12.6.1.1556>12.6.1.1556</A> FLOATS FLOATING + <A href=dpans12.htm#12.6.2.1557>12.6.2.1557</A> FLOG <B>f-log</B> FLOATING EXT + <A href=dpans12.htm#12.6.1.1558>12.6.1.1558</A> FLOOR FLOATING + <A href=dpans7.htm#7.6.1.1559>7.6.1.1559</A> FLUSH BLOCK + <A href=dpans11.htm#11.6.2.1560>11.6.2.1560</A> FLUSH-FILE FILE EXT + <A href=dpans6.htm#6.1.1561>.6.1.1561</A> FM/MOD <B>f-m-slash-mod</B> CORE + <A href=dpans12.htm#12.6.1.1562>12.6.1.1562</A> FMAX <B>f-max</B> FLOATING + <A href=dpans12.htm#12.6.1.1565>12.6.1.1565</A> FMIN <B>f-min</B> FLOATING + <A href=dpans12.htm#12.6.1.1567>12.6.1.1567</A> FNEGATE <B>f-negate</B> FLOATING + <A href=dpans15.htm#15.6.2.1580>15.6.2.1580</A> FORGET TOOLS EXT + <A href=dpans16.htm#16.6.2.1590>16.6.2.1590</A> FORTH SEARCH EXT + <A href=dpans16.htm#16.6.1.1595>16.6.1.1595</A> FORTH-WORDLIST SEARCH + <A href=dpans12.htm#12.6.1.1600>12.6.1.1600</A> FOVER <B>f-over</B> FLOATING + <A href=dpans14.htm#14.6.1.1605>14.6.1.1605</A> FREE MEMORY + <A href=dpans12.htm#12.6.1.1610>12.6.1.1610</A> FROT <B>f-rote</B> FLOATING + <A href=dpans12.htm#12.6.1.1612>12.6.1.1612</A> FROUND <B>f-round</B> FLOATING + <A href=dpans12.htm#12.6.2.1613>12.6.2.1613</A> FS. <B>f-s-dot</B> FLOATING EXT + <A href=dpans12.htm#12.6.2.1614>12.6.2.1614</A> FSIN <B>f-sine</B> FLOATING EXT + <A href=dpans12.htm#12.6.2.1616>12.6.2.1616</A> FSINCOS <B>f-sine-cos</B> FLOATING EXT + <A href=dpans12.htm#12.6.2.1617>12.6.2.1617</A> FSINH <B>f-cinch</B> FLOATING EXT + <A href=dpans12.htm#12.6.2.1618>12.6.2.1618</A> FSQRT <B>f-square-root</B> FLOATING EXT + <A href=dpans12.htm#12.6.1.1620>12.6.1.1620</A> FSWAP <B>f-swap</B> FLOATING + <A href=dpans12.htm#12.6.2.1625>12.6.2.1625</A> FTAN <B>f-tan</B> FLOATING EXT + <A href=dpans12.htm#12.6.2.1626>12.6.2.1626</A> FTANH <B>f-tan-h</B> FLOATING EXT + <A href=dpans12.htm#12.6.1.1630>12.6.1.1630</A> FVARIABLE <B>f-variable</B> FLOATING + <A href=dpans12.htm#12.6.2.1640>12.6.2.1640</A> F~ <B>f-proximate</B> FLOATING EXT + <A href=dpans16.htm#16.6.1.1643>16.6.1.1643</A> GET-CURRENT SEARCH + <A href=dpans16.htm#16.6.1.1647>16.6.1.1647</A> GET-ORDER SEARCH + <A href=dpans6.htm#6.1.1650>.6.1.1650</A> HERE CORE + <A href=dpans6.htm#6.2.1660>.6.2.1660</A> HEX CORE EXT + <A href=dpans6.htm#6.1.1670>.6.1.1670</A> HOLD CORE + <A href=dpans6.htm#6.1.1680>.6.1.1680</A> I CORE + <A href=dpans6.htm#6.1.1700>.6.1.1700</A> IF CORE + <A href=dpans6.htm#6.1.1710>.6.1.1710</A> IMMEDIATE CORE + <A href=dpans11.htm#11.6.1.1717>11.6.1.1717</A> INCLUDE-FILE FILE + <A href=dpans11.htm#11.6.1.1718>11.6.1.1718</A> INCLUDED FILE + <A href=dpans6.htm#6.1.1720>.6.1.1720</A> INVERT CORE + <A href=dpans6.htm#6.1.1730>.6.1.1730</A> J CORE + <A href=dpans6.htm#6.1.1750>.6.1.1750</A> KEY CORE + <A href=dpans10.htm#10.6.1.1755>10.6.1.1755</A> KEY? <B>key-question</B> FACILITY + <A href=dpans6.htm#6.1.1760>.6.1.1760</A> LEAVE CORE + <A href=dpans7.htm#7.6.2.1770>7.6.2.1770</A> LIST BLOCK EXT + <A href=dpans6.htm#6.1.1780>.6.1.1780</A> LITERAL CORE + <A href=dpans7.htm#7.6.1.1790>7.6.1.1790</A> LOAD BLOCK + <A href=dpans13.htm#13.6.2.1795>13.6.2.1795</A> LOCALS| <B>locals-bar</B> LOCAL EXT + <A href=dpans6.htm#6.1.1800>.6.1.1800</A> LOOP CORE + <A href=dpans6.htm#6.1.1805>.6.1.1805</A> LSHIFT <B>l-shift</B> CORE + <A href=dpans6.htm#6.1.1810>.6.1.1810</A> M* <B>m-star</B> CORE + <A href=dpans8.htm#8.6.1.1820>8.6.1.1820</A> M*/ <B>m-star-slash</B> DOUBLE + <A href=dpans8.htm#8.6.1.1830>8.6.1.1830</A> M+ <B>m-plus</B> DOUBLE + <A href=dpans6.htm#6.2.1850>.6.2.1850</A> MARKER CORE EXT + <A href=dpans6.htm#6.1.1870>.6.1.1870</A> MAX CORE + <A href=dpans6.htm#6.1.1880>.6.1.1880</A> MIN CORE + <A href=dpans6.htm#6.1.1890>.6.1.1890</A> MOD CORE + <A href=dpans6.htm#6.1.1900>.6.1.1900</A> MOVE CORE + <A href=dpans10.htm#10.6.2.1905>10.6.2.1905</A> MS FACILITY EXT + <A href=dpans6.htm#6.1.1910>.6.1.1910</A> NEGATE CORE + <A href=dpans6.htm#6.2.1930>.6.2.1930</A> NIP CORE EXT + <A href=dpans6.htm#6.2.1950>.6.2.1950</A> OF CORE EXT + <A href=dpans16.htm#16.6.2.1965>16.6.2.1965</A> ONLY SEARCH EXT + <A href=dpans11.htm#11.6.1.1970>11.6.1.1970</A> OPEN-FILE FILE + <A href=dpans6.htm#6.1.1980>.6.1.1980</A> OR CORE + <A href=dpans16.htm#16.6.2.1985>16.6.2.1985</A> ORDER SEARCH EXT + <A href=dpans6.htm#6.1.1990>.6.1.1990</A> OVER CORE + <A href=dpans6.htm#6.2.2000>.6.2.2000</A> PAD CORE EXT + <A href=dpans10.htm#10.6.1.2005>10.6.1.2005</A> PAGE FACILITY + <A href=dpans6.htm#6.2.2008>.6.2.2008</A> PARSE CORE EXT + <A href=dpans6.htm#6.2.2030>.6.2.2030</A> PICK CORE EXT + <A href=dpans6.htm#6.1.2033>.6.1.2033</A> POSTPONE CORE + <A href=dpans12.htm#12.6.2.2035>12.6.2.2035</A> PRECISION FLOATING EXT + <A href=dpans16.htm#16.6.2.2037>16.6.2.2037</A> PREVIOUS SEARCH EXT + <A href=dpans6.htm#6.2.2040>.6.2.2040</A> QUERY CORE EXT + <A href=dpans6.htm#6.1.2050>.6.1.2050</A> QUIT CORE + <A href=dpans11.htm#11.6.1.2054>11.6.1.2054</A> R/O <B>r-o</B> FILE + <A href=dpans11.htm#11.6.1.2056>11.6.1.2056</A> R/W <B>r-w</B> FILE + <A href=dpans6.htm#6.1.2060>.6.1.2060</A> R> <B>r-from</B> CORE + <A href=dpans6.htm#6.1.2070>.6.1.2070</A> R@ <B>r-fetch</B> CORE + <A href=dpans11.htm#11.6.1.2080>11.6.1.2080</A> READ-FILE FILE + <A href=dpans11.htm#11.6.1.2090>11.6.1.2090</A> READ-LINE FILE + <A href=dpans6.htm#6.1.2120>.6.1.2120</A> RECURSE CORE + <A href=dpans6.htm#6.2.2125>.6.2.2125</A> REFILL CORE EXT + <A href=dpans7.htm#7.6.2.2125>7.6.2.2125</A> REFILL BLOCK EXT + <A href=dpans11.htm#11.6.2.2125>11.6.2.2125</A> REFILL FILE EXT + <A href=dpans11.htm#11.6.2.2130>11.6.2.2130</A> RENAME-FILE FILE EXT + <A href=dpans6.htm#6.1.2140>.6.1.2140</A> REPEAT CORE + <A href=dpans11.htm#11.6.1.2142>11.6.1.2142</A> REPOSITION-FILE FILE + <A href=dpans12.htm#12.6.1.2143>12.6.1.2143</A> REPRESENT FLOATING + <A href=dpans14.htm#14.6.1.2145>14.6.1.2145</A> RESIZE MEMORY + <A href=dpans11.htm#11.6.1.2147>11.6.1.2147</A> RESIZE-FILE FILE + <A href=dpans6.htm#6.2.2148>.6.2.2148</A> RESTORE-INPUT CORE EXT + <A href=dpans6.htm#6.2.2150>.6.2.2150</A> ROLL CORE EXT + <A href=dpans6.htm#6.1.2160>.6.1.2160</A> ROT <B>rote</B> CORE + <A href=dpans6.htm#6.1.2162>.6.1.2162</A> RSHIFT <B>r-shift</B> CORE + <A href=dpans6.htm#6.1.2165>.6.1.2165</A> S" <B>s-quote</B> CORE + <A href=dpans11.htm#11.6.1.2165>11.6.1.2165</A> S" <B>s-quote</B> FILE + <A href=dpans6.htm#6.1.2170>.6.1.2170</A> S>D <B>s-to-d</B> CORE + <A href=dpans7.htm#7.6.1.2180>7.6.1.2180</A> SAVE-BUFFERS BLOCK + <A href=dpans6.htm#6.2.2182>.6.2.2182</A> SAVE-INPUT CORE EXT + <A href=dpans7.htm#7.6.2.2190>7.6.2.2190</A> SCR <B>s-c-r</B> BLOCK EXT + <A href=dpans17.htm#17.6.1.2191>17.6.1.2191</A> SEARCH STRING + <A href=dpans16.htm#16.6.1.2192>16.6.1.2192</A> SEARCH-WORDLIST SEARCH + <A href=dpans15.htm#15.6.1.2194>15.6.1.2194</A> SEE TOOLS + <A href=dpans16.htm#16.6.1.2195>16.6.1.2195</A> SET-CURRENT SEARCH + <A href=dpans16.htm#16.6.1.2197>16.6.1.2197</A> SET-ORDER SEARCH + <A href=dpans12.htm#12.6.2.2200>12.6.2.2200</A> SET-PRECISION FLOATING EXT + <A href=dpans12.htm#12.6.2.2202>12.6.2.2202</A> SF! <B>s-f-store</B> FLOATING EXT + <A href=dpans12.htm#12.6.2.2203>12.6.2.2203</A> SF@ <B>s-f-fetch</B> FLOATING EXT + <A href=dpans12.htm#12.6.2.2204>12.6.2.2204</A> SFALIGN <B>s-f-align</B> FLOATING EXT + <A href=dpans12.htm#12.6.2.2206>12.6.2.2206</A> SFALIGNED <B>s-f-aligned</B> FLOATING EXT + <A href=dpans12.htm#12.6.2.2207>12.6.2.2207</A> SFLOAT+ <B>s-float-plus</B> FLOATING EXT + <A href=dpans12.htm#12.6.2.2208>12.6.2.2208</A> SFLOATS <B>s-floats</B> FLOATING EXT + <A href=dpans6.htm#6.1.2210>.6.1.2210</A> SIGN CORE + <A href=dpans17.htm#17.6.1.2212>17.6.1.2212</A> SLITERAL STRING + <A href=dpans6.htm#6.1.2214>.6.1.2214</A> SM/REM <B>s-m-slash-rem</B> CORE + <A href=dpans6.htm#6.1.2216>.6.1.2216</A> SOURCE CORE + <A href=dpans6.htm#6.2.2218>.6.2.2218</A> SOURCE-ID <B>source-i-d</B> CORE EXT + <A href=dpans11.htm#11.6.1.2218>11.6.1.2218</A> SOURCE-ID <B>source-i-d</B> FILE + <A href=dpans6.htm#6.1.2220>.6.1.2220</A> SPACE CORE + <A href=dpans6.htm#6.1.2230>.6.1.2230</A> SPACES CORE + <A href=dpans6.htm#6.2.2240>.6.2.2240</A> SPAN CORE EXT + <A href=dpans6.htm#6.1.2250>.6.1.2250</A> STATE CORE + <A href=dpans15.htm#15.6.2.2250>15.6.2.2250</A> STATE TOOLS EXT + <A href=dpans6.htm#6.1.2260>.6.1.2260</A> SWAP CORE + <A href=dpans6.htm#6.1.2270>.6.1.2270</A> THEN CORE + <A href=dpans9.htm#9.6.1.2275>9.6.1.2275</A> THROW EXCEPTION + <A href=dpans7.htm#7.6.2.2280>7.6.2.2280</A> THRU BLOCK EXT + <A href=dpans6.htm#6.2.2290>.6.2.2290</A> TIB <B>t-i-b</B> CORE EXT + <A href=dpans10.htm#10.6.2.2292>10.6.2.2292</A> TIME&DATE <B>time-and-date</B> FACILITY EXT + <A href=dpans6.htm#6.2.2295>.6.2.2295</A> TO CORE EXT + <A href=dpans13.htm#13.6.1.2295>13.6.1.2295</A> TO LOCAL + <A href=dpans6.htm#6.2.2298>.6.2.2298</A> TRUE CORE EXT + <A href=dpans6.htm#6.2.2300>.6.2.2300</A> TUCK CORE EXT + <A href=dpans6.htm#6.1.2310>.6.1.2310</A> TYPE CORE + <A href=dpans6.htm#6.1.2320>.6.1.2320</A> U. <B>u-dot</B> CORE + <A href=dpans6.htm#6.2.2330>.6.2.2330</A> U.R <B>u-dot-r</B> CORE EXT + <A href=dpans6.htm#6.1.2340>.6.1.2340</A> U< <B>u-less-than</B> CORE + <A href=dpans6.htm#6.2.2350>.6.2.2350</A> U> <B>u-greater-than</B> CORE EXT + <A href=dpans6.htm#6.1.2360>.6.1.2360</A> UM* <B>u-m-star</B> CORE + <A href=dpans6.htm#6.1.2370>.6.1.2370</A> UM/MOD <B>u-m-slash-mod</B> CORE + <A href=dpans6.htm#6.1.2380>.6.1.2380</A> UNLOOP CORE + <A href=dpans6.htm#6.1.2390>.6.1.2390</A> UNTIL CORE + <A href=dpans6.htm#6.2.2395>.6.2.2395</A> UNUSED CORE EXT + <A href=dpans7.htm#7.6.1.2400>7.6.1.2400</A> UPDATE BLOCK + <A href=dpans6.htm#6.2.2405>.6.2.2405</A> VALUE CORE EXT + <A href=dpans6.htm#6.1.2410>.6.1.2410</A> VARIABLE CORE + <A href=dpans11.htm#11.6.1.2425>11.6.1.2425</A> W/O <B>w-o</B> FILE + <A href=dpans6.htm#6.1.2430>.6.1.2430</A> WHILE CORE + <A href=dpans6.htm#6.2.2440>.6.2.2440</A> WITHIN CORE EXT + <A href=dpans6.htm#6.1.2450>.6.1.2450</A> WORD CORE + <A href=dpans16.htm#16.6.1.2460>16.6.1.2460</A> WORDLIST SEARCH + <A href=dpans15.htm#15.6.1.2465>15.6.1.2465</A> WORDS TOOLS + <A href=dpans11.htm#11.6.1.2480>11.6.1.2480</A> WRITE-FILE FILE + <A href=dpans11.htm#11.6.1.2485>11.6.1.2485</A> WRITE-LINE FILE + <A href=dpans6.htm#6.1.2490>.6.1.2490</A> XOR <B>x-or</B> CORE + <A href=dpans6.htm#6.1.2500>.6.1.2500</A> [ <B>left-bracket</B> CORE + <A href=dpans6.htm#6.1.2510>.6.1.2510</A> ['] <B>bracket-tick</B> CORE + <A href=dpans6.htm#6.1.2520>.6.1.2520</A> [CHAR] <B>bracket-char</B> CORE + <A href=dpans6.htm#6.2.2530>.6.2.2530</A> [COMPILE] <B>bracket-compile</B> CORE EXT + <A href=dpans15.htm#15.6.2.2531>15.6.2.2531</A> [ELSE] <B>bracket-else</B> TOOLS EXT + <A href=dpans15.htm#15.6.2.2532>15.6.2.2532</A> [IF] <B>bracket-if</B> TOOLS EXT + <A href=dpans15.htm#15.6.2.2533>15.6.2.2533</A> [THEN] <B>bracket-then</B> TOOLS EXT + <A href=dpans6.htm#6.2.2535>.6.2.2535</A> \ <B>backslash</B> CORE EXT + <A href=dpans7.htm#7.6.2.2535>7.6.2.2535</A> \ <B>backslash</B> BLOCK EXT + <A href=dpans6.htm#6.1.2540>.6.1.2540</A> ] <B>right-bracket</B> CORE +</PRE> +<P> + +Available from the American National Standards Institute, 11 West 42nd +Street, Newyork, NY 10036 +<P> + +Other common implementation techniques include direct translation to code +and other types of tokens. +<P> + +These terms are not defined in the Standard. They are mentioned here for +historical continuity. +Collating Sequence: + + +<PRE> +! " # $ % & ' ( ) * + , - . / digits : ; < = > ? @ ALPHA [ \ ] ^ _ ` alpha { | +} ~ +</PRE> + + + +<HR> +<A href=dpans.htm#toc><IMG src="up.gif" ></A> Table of Contents +<P> +</BODY> +</HTML> diff --git a/mwmouse/sources/AnsForth/FIX_HTML.TXT b/mwmouse/sources/AnsForth/FIX_HTML.TXT @@ -0,0 +1,14 @@ +: +# modifies HTML files to use relative URLs for a local only +# version of the WWW site +# +# usage: +# local file1 [file2 ...] +# +for arg; do + echo $arg; + mv $arg $arg.tmp + sed s/"ftp:\/\/taygeta.com\/"/"ftp:\/\/ftp.taygeta.com\/"/g < $arg.tmp > $arg + rm $arg.tmp +done + diff --git a/mwmouse/sources/AnsForth/LEFT.GIF b/mwmouse/sources/AnsForth/LEFT.GIF Binary files differ. diff --git a/mwmouse/sources/AnsForth/MPETEXT.HTM b/mwmouse/sources/AnsForth/MPETEXT.HTM @@ -0,0 +1,49 @@ +<html> + +<head> +<meta http-equiv="Content-Type" +content="text/html; charset=iso-8859-1"> +<meta name="GENERATOR" content="Microsoft FrontPage Express 2.0"> +<title>Disclaimer</title> +<link disabled rel="stylesheet" href="mpexc6.css"> +<style>@import url(mpexc6.css);</style> +</head> + +<body bgcolor="#FFFFFF"> + +<h1>Disclaimer</h1> + +<p>This help file has been generated for use with the MPE Forth 6 +Cross-compiler IDE and the Microsoft&trade; Html Help system. The +help file was compiled from the original HTML files that make up +the draft ANS Forth specification with the application of a +cascading style sheet to make the document more readable within +the help system.</p> + +<p>The content of the document, i.e. the general layout, wording, +examples etc. has not been altered by MPE in any way.</p> + +<h2>Contacting MPE</h2> + +<p>MicroProcessor Engineering is always pleased to hear from new +and existing customers, and we do our best to respond to any +enquiries and comments that you may have about our products and +services.</p> + +<p><strong>MicroProcessor Engineering Ltd.</strong><br> +133 Hill Lane, Shirley<br> +Southampton, SO15 5AF<br> +United Kingdom</p> + +<p>Tel: +44 (0)1703 631441<br> +Fax: +44 (0)1703 339691</p> + +<p>e-mail: <a href="mailto:mpe@mpeltd.demon.co.uk">mpe@mpeltd.demon.co.uk</a></p> + +<p>web: <a href="http://www.mpeltd.demon.co.uk">www.mpeltd.demon.co.uk</a></p> + +<p>&nbsp;</p> + +<p>&nbsp;</p> +</body> +</html> diff --git a/mwmouse/sources/AnsForth/MPEXC6.CSS b/mwmouse/sources/AnsForth/MPEXC6.CSS @@ -0,0 +1,54 @@ +/* Cascading Style Sheet for MPE XC6 glossary */ + +body { font-size: 75%; + + line-height: 125%; + font-family: Verdana, Arial, Helvetica, } + +a:link { color: #0000FF; } + +a:active { color: #FF33CC; } + +a:visited { color: #800080; } + +h1 { font-size: 120%; + margin-bottom: 1%; } + +h2 { font-size: 110%; + margin-bottom: .4em; } + +h3 { font-size: 100%; + margin-top: 1.2em; + } + + p { margin-top:6pt; margin-bottom: 6pt; } + +code { font-family: Courier; } + +pre { margin-top: 0em; + margin-bottom: 0em; + font-family: Courier; + font-size: 100% } + +table { font-size: 100%; + margin-top: 1em; + margin-bottom: 1em;} + +th.center { text-align: center; } + +th { text-align: left; + background: #dddddd; + margin: 3pt; + vertical-align: bottom; } + +tr { vertical-align: top; } + +td { margin: 3pt; + vertical-align: top; } + + + + + + + diff --git a/mwmouse/sources/AnsForth/NOTES.HTM b/mwmouse/sources/AnsForth/NOTES.HTM @@ -0,0 +1,173 @@ +<HTML><HEAD> +<TITLE>DPANS94 editorial notes</TITLE> +<link disabled rel="stylesheet" href="mpexc6.css"> +<style>@import url(mpexc6.css);</style> +</head> + +<BODY> +<hr> +<h3>Editorial Notes</h3> +<p> +<b>V3.2 - December 16, 1996</b> +<p> +RFIs (requests for interpretation) added by Anton Ertl. Minor changes +in appearance of See: references in wordset glossaries. + +<p> +<b>V3.1 - October 17, 1996</b> +<p> +Format of anchors changed so that Mosaic can see them. File suffixes +changed from .html to .htm to be more compatible with DOS/Unix. + +<p> +<b>V3.0 - September 14, 1996</b> +<p> + +This is a modification of Norman E. Smith's rendering of the draft standard +(see +his note below). Four changes have been made: (a) some errors have been +corrected, (b) minor changes in the style of HTML presentation have been +made to make it (hopefully) more readable, (c) hundreds of +crosslinks have been added, and (d) the naming conventions for the internal +sections of the document have been standardized so that it would be easy to +crosslink to this document. +<p> +For example if I, or anyone, were writing a message +on comp.lang.forth and I wanted to crosslink to the standard definition of +CATCH then I would write something like +<p> +a=href http://wherever.document.is.stored/dpans9.htm#9.6.1.0875 +CATCH +/a +<p> +except that the phrases /a and a=href http:... are enclosed in angle brackets. +<p> +The standard is broken into 40 files: +<p> +<ul> +<li>one file, +dpans.htm, holds the preface and table of contents; +<li>seventeen files hold the 17 sections of the standard, +i.e. dpans1.htm thru +dpans17.htm; +<li>one file each for annexes B, C, D, E, and F, i.e. dpansb.htm +thru dpansf.htm; +<li>and seventeen files for annex A corresponding to the 17 +sections of the standard, i.e. dpansa1.htm thru dpansa17.htm. +</ul> +<p> + +The +subdivision of Annex A is the only irregularity in this scheme and this was +done both because it's not that hard to remember and also to break up what +would +otherwise be an unmanageably large annex. Within each file every subsection, +sub-subsection, and sub-sub-subsection, etc. is named following the same +conventions +that the draft paper document uses. +<p> + +The only problem with this whole scheme is that some of the files, in +particular, sections 3 and 6, are large and therefore referencing +them online can take a long time. As a practical matter I would recommend +downloading all the files and using an html browser, like +netscape, to access locally. Another solution +that I am contemplating would be the breaking out of word definitions from +sections 6 thru 17 into individual files. This would entail a more +complicated cross-referencing, but I think it would still be manageable. +It would also mean that online access might become rapid. +<p> + +Mark Andrew Amerman +<br> +mandrewa@cais.com + +<p> +<hr> +<P> + +<B>V2.1 - September 1, 1995</B> +<P> + +This HTML version of this document was prepared by: +<P> + +Norman E. Smith +<BR> +72745,1566@Compuserve.com +<P> + +It was prepared from the Microsoft Word document posted by +the Technical Committee in early 1995. See their +<A href=dpans94.txt>readme</A> +file for the details and conditions of using the +postings. The Microsoft Word and Postscript versions of the +document are available on ftp://ftp.uu.net/vendor/minerva... +and a Postscript and +FPC hyperlinked ASCII version are +also available on Taygeta. +<P> + +This second version has extensive +hyperlinks added. These are content related. The 'See:' +references to words link directly to their glossary +entry for example. Because the original document was well structured +and the conversion was to a proper HTML file, much of the +hyperlink generation can be automated. Even though little +had to be done manually, the large number of links and anchors +caused the additional was more work than I expected. +<P> + +The files that make up this document were +created using Standardized Generalized Markup Language (SGML) +based autotaging software. For this reason, all of the files +also parse correctly with the current HTML Document Type +Definitions (DTDs). +<P> + +I am planning a third pass at the document to +do a proper SGML representation of the word glossaries +and additional links in the text. At that +point, I will be able to generate a word glossary in just about +any format. +<P> + +The process of spliting the document into managable (about 20k) +files, generating the Table of Contents, and inserting the +structural hyperlinks was done with a program written in Until. +<A href=ftp://taygeta.oc.nps.navy.mil/pub/Forth/Reviewed/until22.zip>Until</A> +is my almost-Forth, written in very generic C, that is also available +on Taygeta. The Until +<A href=http://taygeta.oc.nps.navy.mil/pub/until/until.html>Reference +Manual</A> can be browsed on Taygeta as well. +<P> + +Lastly, thanks to the X3J14 Technical Committee for making the +Word version of the document available and to Skip Carter for +making space available on Taygeta for not only this document, but +the wealth of other Forth infomation available there. +<P> + +<B>Changes:</B> +<P> + +03/30/95 - V2.0 - Added hundreds of anchors and links. +<P> + +02/28/95 - V1.2 - The 02/23/95 version used an old version of the table of +contents file with incorrect hyperlinks. This version corrects that. Sorry! +<P> + +02/23/95 - V1.1- Added title page from original document that was lost during +initial +conversion per request of the Technical Committee. +<P> + +Enjoy! +<BR> +Norman Smith +<P> +<hr> +</BODY> +</HTML> + diff --git a/mwmouse/sources/AnsForth/RFILIST.HTM b/mwmouse/sources/AnsForth/RFILIST.HTM @@ -0,0 +1,35 @@ +<HTML><HEAD> +<TITLE>DPANS94 editorial notes</TITLE> +<link disabled rel="stylesheet" href="mpexc6.css"> +<style>@import url(mpexc6.css);</style> +</head> + +<BODY> + +<h3>ANS Forth X3J14 Technical Committee responses +to requests for interpretation</h3> + +<hr> +<p> +<a href=a0001.htm>RFI 0001</a>: regarding the "flag" returned +by <a href=dpans11.htm#11.6.1.2090>READ-LINE</a> at end of file. +<br> +<a href=a0002.htm>RFI 0002</a>: search orders in which a given wordlist +occurs more than once. +<br> +<a href=a0003.htm>RFI 0003</a>: What's allowed between +<a href=dpans6.htm#6.1.1000>CREATE</a> and +<a href=dpans6.htm#6.1.1250>DOES></a> +<br> +<a href=a0004.htm>RFI 0004</a>: standard punctuation for double-cell numbers. +<br> +<a href=a0005.htm>RFI 0005</a>: initiation semantics. +<br> +<a href=a0006.htm>RFI 0006</a>: Writing to Input Buffers. +<br> +<a href=a0007.htm>RFI 0007</a>: distinction between "immediacy" and +"special compilation semantics" +<P> +<hr> +</BODY> +</HTML> diff --git a/mwmouse/sources/AnsForth/RIGHT.GIF b/mwmouse/sources/AnsForth/RIGHT.GIF Binary files differ. diff --git a/mwmouse/sources/AnsForth/UP.GIF b/mwmouse/sources/AnsForth/UP.GIF Binary files differ. diff --git a/mwmouse/sources/CM0def.fth b/mwmouse/sources/CM0def.fth @@ -0,0 +1,175 @@ +\ CortexDef.fth - default defininitions for Cortex CPUs + +(( +Copyright (c) 2009 +MicroProcessor Engineering +133 Hill Lane +Southampton SO15 5AF +England + +tel: +44 (0)23 8063 1441 +fax: +44 (0)23 8033 9691 +net: mpe@mpeforth.com + tech-support@mpeforth.com +web: www.mpeforth.com + +From North America, our telephone and fax numbers are: + 011 44 23 8063 1441 + 011 44 23 8033 9691 + + +Absolute addresses start with an '_' underscore character. +Offsets and masks do not. + + +To do +===== + +Change history +============== +)) + + +\ *************** +\ Version numbers +\ *************** + + char 7 equ mpe-rel \ x in Vx.yz + char 1 equ mpe-ver \ y in Vx.yz + char 0 equ usrver \ z in Vx.yz + +\ *********** +\ Bit equates +\ *********** + +$00000001 equ BIT0 +$00000002 equ BIT1 +$00000004 equ BIT2 +$00000008 equ BIT3 +$00000010 equ BIT4 +$00000020 equ BIT5 +$00000040 equ BIT6 +$00000080 equ BIT7 +$00000100 equ BIT8 +$00000200 equ BIT9 +$00000400 equ BIT10 +$00000800 equ BIT11 +$00001000 equ BIT12 +$00002000 equ BIT13 +$00004000 equ BIT14 +$00008000 equ BIT15 +$00010000 equ BIT16 +$00020000 equ BIT17 +$00040000 equ BIT18 +$00080000 equ BIT19 +$00100000 equ BIT20 +$00200000 equ BIT21 +$00400000 equ BIT22 +$00800000 equ BIT23 +$01000000 equ BIT24 +$02000000 equ BIT25 +$04000000 equ BIT26 +$08000000 equ BIT27 +$10000000 equ BIT28 +$20000000 equ BIT29 +$40000000 equ BIT30 +$80000000 equ BIT31 + + +\ ******* +\ Cortex-M0 CPU +\ ******* + +\ ======================= +\ CPSR and mode switching +\ ======================= + +\ CPSR/SPSR definitions _F _S _X _C +\ _F Flag bits (31..24) +bit31 equ N_bit \ negative +bit30 equ Z_bit \ zero +bit29 equ C_bit \ carry +bit28 equ V_bit \ overflow +bit27 equ Q_bit \ sticky overflow (saturation) + +bit24 equ T_bit \ Jazelle + + +\ *************************************** +\ Interrupt handler equates for IntCortex.fth +\ *************************************** + +0 equ StackVec# \ holds initial stack pointer +1 equ ResetVec# \ reset +2 equ NMIVec# \ NMI +3 equ HardVec# \ hard fault +4 equ MemVec# \ memory fault +5 equ BusVec# \ bus fault +6 equ UseVec# \ usage fault + +#11 equ SvcVec# \ SVC/SWI +#12 equ DbgVec# \ Debug, e.g. breakpoint + +#14 equ PendVec# \ Pendable request +#15 equ SysTickVec# \ System Ticker + +\ Vectors 16..255 are implementation defined + + +\ ****************************** +\ Standard Cortex-M0 peripherals +\ ****************************** + +$E000:E000 equ _SCS \ -- addr +\ Base of System Control Space + + $0004 equ scsICTR \ Interrupt Controller Type Register - r/o + + $0010 equ stCSR \ systick Control and Status Register + $0014 equ stRVR \ Reload Value Register + $0018 equ stCVR \ Current Value Register + $001C equ stCalib \ Calibration value register + + $0100 equ nvSetEnR0 \ nvic Set Enable Reg 0..7 + $0180 equ nvClrEnR0 \ Clear Enable reg 0..7 + $0200 equ nvSetPendR0 \ Set Pending Reg 0..7 + $0280 equ nvClrPendR0 \ Clr Pending Reg 0..7 +\ $0300 equ nvABR0 \ Active Bit Reg 0..7 + $0400 equ nvPR0 \ Priority Reg 0.. + + $0D00 equ scsCPUID \ sys CPUID Base Register + $0D04 equ scsICSR \ Interrupt Control State Reg +\ $0D08 equ scsVTOR \ Vector table Offset Reg + $0D0C equ scsAIRCR \ Application Interrupt/Reset Control Reg + $0D10 equ scsSCR \ System Control Reg + $0D14 equ scsCCR \ Configuration Control reg +\ $0D18 equ scsSHPRB0 \ System Handler Priority Reg 2 + $0D1C equ scsSHPR2 \ System Handler Priority Reg 2 + $0D20 equ scsSHPR3 \ System Handler Priority Reg 2 + + +\ ******************************************* +\ SYSm constants for MSR and MRS instructions +\ ******************************************* + +decimal + + 0 equ APSR \ just the flags + 5 equ IPSR \ just the exception number + 6 equ EPSR \ just the execution state + + 1 equ IAPSR \ flags + exception + 2 equ EAPSR \ flags + execution state + 3 equ XPSR \ flags + execution + exception + 7 equ IEPSR \ exception + execution + + 8 equ SP_main \ Main stack pointer (exceptions) + 9 equ SP_process \ Process stack pointer (threads) + +16 equ PRIMASK \ bit0=1 to enable NMI and HardFault +17 equ BASEPRI \ 9 bit priority (lower=higher priority) +18 equ BASEPRI_MAX +19 equ FAULTMASK \ bit0=1 to enable NMI only +20 equ CONTROL \ bit1=1 for SP_process, bit0=1 for User state in thread mode + \ we have bit0=0 always + diff --git a/mwmouse/sources/CURSOR.fth b/mwmouse/sources/CURSOR.fth @@ -0,0 +1,30 @@ +\ VT100 cursor control etc, +\ Created by Duncan October 2016 +\ +: HOME ( --- . ) + $1B EMIT $5B EMIT $48 EMIT ; + +: .POS ( n --- ) + 10 /MOD 48 + EMIT 48 + EMIT ; + +: GOTOXY ( x y --- . ) + $1B EMIT $5B EMIT .POS $3B EMIT .POS $48 EMIT ; + +: CLEARSCREEN ( --- ) + $1B EMIT $5B EMIT $32 EMIT $4A EMIT ; + +: SCROLLDOWN ( --- ) + $1B EMIT $44 EMIT ; + +: SCROLLUP ( --- ) + $1B EMIT $4D EMIT ; + +: SCROLLING ( --- ) + $1B EMIT $5B EMIT $72 EMIT ; + +: CURSOROFF ( --- ) + $1B EMIT $5B EMIT $3F EMIT $32 EMIT $35 EMIT $6C EMIT ; + +: CURSORON ( --- ) + $1B EMIT $5B EMIT $3F EMIT $32 EMIT $35 EMIT $68 EMIT ; + diff --git a/mwmouse/sources/CodeM0lite.fth b/mwmouse/sources/CodeM0lite.fth @@ -0,0 +1,2217 @@ +\ CodeM0lite.fth - ARM Cortex-M0 code file + +(( +Copyright (c) 2009, 2010, 2011, 2014 +MicroProcessor Engineering +133 Hill Lane +Southampton SO15 5AF +England + +tel: +44 (0)23 8063 1441 +fax: +44 (0)23 8033 9691 +net: mpe@mpeforth.com + tech-support@mpeforth.com +web: www.mpeforth.com + +From North America, our telephone and fax numbers are: + 011 44 23 8063 1441 + 011 44 23 8033 9691 + + +To do +===== +Recode FILL to check for word start address, and copy words if possible. +This change may have a good speed/size trade-off. + +Change history +============== +20140107 SFP006 Corrected FM/MOD. +20110601 SFP005 Cortex M0/M1 conversion. +20100430 SFP004 Corrected !LCALL and (;CODE). +20100427 SFP003 Corrected ROLL. +20100108 MPE002 First release +20091209 SFP001 Started +)) + +\ ========== +\ *! codem0m1lite +\ *T Cortex code definitions +\ ========== +\ *P The file *\i{Cortex/CodeM0lite.fth} contains primitives for +\ ** the standalone Lite Forth kernel. + +\ ******** +\ *S Notes +\ ******** +\ *P Some words and code routines are marked in the documentation +\ ** as *\fo{INTERNAL}. These are factors used by other words and do +\ ** not have dictionary entries in the standalone Forth. They +\ ** are only accessible to users of the VFX Forth ARM Cross +\ ** Compiler. This also applies to definitions of the form: +\ *C n EQU <name> +\ *C PROC <name> +\ *C L: <name> + +\ ***************** +\ *S Register usage +\ ***************** +\ *P For Cortex-M0/M1 the following register usage is the default: +\ *E r15 pc program counter +\ ** r14 link link register; bit0=1=Thumb, usually set +\ ** r13 rsp return stack pointer +\ ** r12 -- +\ ** r11 up user area pointer +\ ** r10 -- +\ ** r9 lp locals pointer +\ ** r8 -- +\ ** r7 tos cached top of stack +\ ** r6 psp data stack pointer +\ ** r0-r5 scratch +\ *P The VFX optimiser reserves R0 and R1 for internal operations. +\ ** *\fo{CODE} definitions must use R7 as TOS with NOS pointed +\ ** to by R6 as a full descending stack in ARM terminology. +\ ** R0..R5, R12 are free for use by *\fo{CODE} definitions and +\ ** need not be preserved or restored. You should assume that +\ ** any register can be affected by other words. + +only forth definitions +decimal + + +\ *********************************** +\ *S Logical and relational operators +\ *********************************** + +: AND \ x1 x2 -- x3 +\ *G Perform a logical AND between the top two stack items and retain +\ ** the result in top of stack. + and ; + +: OR \ x1 x2 -- x3 +\ *G Perform a logical OR between the top two stack items and retain +\ ** the result in top of stack. + or ; + +: XOR \ x1 x2 -- x3 +\ *G Perform a logical XOR between the top two stack items and retain +\ ** the result in top of stack. + xor ; + +: INVERT \ x -- x' +\ *G Perform a bitwise inversion. + invert ; + +: 0= \ x -- flag +\ *G Compare the top stack item with 0 and return TRUE if equals. + 0= ; + +: 0<> \ x -- flag +\ *G Compare the top stack item with 0 and return TRUE if not-equal. + 0<> ; + +: 0< \ x -- flag +\ *G Return TRUE if the top of stack is less-than-zero. + 0< ; + +: 0> \ x -- flag +\ *G Return TRUE if the top of stack is greater-than-zero. + 0> ; + +: = \ x1 x2 -- flag +\ *G Return TRUE if the two topmost stack items are equal. + = ; + +: <> \ x1 x2 -- flag +\ *G Return TRUE if the two topmost stack items are different. + <> ; + +: < \ n1 n2 -- flag +\ *G Return TRUE if n1 is less than n2. + < ; + +: > \ n1 n2 -- flag +\ *G Return TRUE if n1 is greater than n2. + > ; + +: <= \ n1 n2 -- flag +\ *G Return TRUE if n1 is less than or equal to n2. + <= ; + +: >= \ x1 x2 -- flag +\ *G Return TRUE if n1 is greater than or equal to n2. + >= ; + +: U> \ u2 u2 -- flag +\ *G An UNSIGNED version of >. + u> ; + +: U< \ u1 u2 -- flag +\ *G An UNSIGNED version of <. + u< ; + +: D0< \ d -- flag +\ *G Returns true if signed double d is less than zero. + nip 0< ; + +: D0= \ xd -- flag +\ *G Returns true if xd is 0. + or 0= ; + +CODE D= \ xd1 xd2 -- flag +\ *G Return TRUE if the two double numbers are equal. + ldmia psp ! { r0-r2 } \ r0=d2 low, r1=d1 high, r2=d1 low + mov .s r3, tos \ r3=d2h + mov .s tos, # 0 \ assume false + sub .s r0, r0, r2 \ d2l - d1l + sbc .s r3, r3, r1 \ d2h - d1h + orr .s r0, r0, tos + eq, if, + mvn .s tos, tos \ true + endif, + next, +END-CODE + +(( +CODE D< \ d1 d2 -- flag + \ *G Return TRUE if the double number d1 is (signed) less than the + \ ** double number d2. + ldmia psp ! { r0-r2 } \ r0=d2 low, r1=d1 high, r2=d1 low + mov .s r3, tos \ r3=d2h + mov .s tos, # 0 \ assume false + sub .s r2, r2, r0 \ d1l - d2l + sbc .s r1, r1, r3 \ d1h - d2h + lt, if, + mvn .s tos, tos \ true + endif, + next, +END-CODE + +: D> \ d1 d2 -- flag + \ *G Return TRUE if the double number d1 is (signed) greater than the + \ ** double number d2. + 2swap d< ; +)) + +(( +CODE DU< \ ud1 ud2 -- flag + \ *G Returns true if ud1 (unsigned double) is less than ud2. + ldmia psp ! { r0-r2 } \ r0=d2 low, r1=d1 high, r2=d1 low + mov .s r3, tos \ r3=d2h + mov .s tos, # 0 \ assume false + sub .s r2, r2, r0 \ d1l - d2l + sbc .s r1, r1, r3 \ d1h - d2h + cc, if, + mvn .s tos, tos + endif, + next, +END-CODE + +: DU> \ ud1 ud2 -- flag + \ *G Returns true if ud1 (unsigned double) is greater than ud2. + 2swap du< ; +)) +(( +: DMAX \ d1 d2 -- d3 ; d3=max of d1/d2 + \ *G Return the maximum double number from the two supplied. + 2over 2over d< + if 2swap then + 2drop +; + +: DMIN \ d1 d2 -- d3 ; d3=min of d1/d2 + \ *G Return the minimum double number from the two supplied. + 2over 2over d> + if 2swap then + 2drop +; +)) + +CODE MIN \ n1 n2 -- n1|n2 +\ *G Given two data stack items preserve only the smaller. + ldmia psp, ! { r0 } + cmp tos, r0 + gt, if, + mov tos, r0 + endif, + next, +END-CODE + +CODE MAX \ n1 n2 -- n1|n2 +\ *G Given two data stack items preserve only the larger. + ldmia psp, ! { r0 } + cmp tos, r0 + lt, if, + mov tos, r0 + endif, + next, +END-CODE + +(( +CODE WITHIN? \ n1 n2 n3 -- flag + \ *G Return TRUE if N1 is within the range N2..N3. + \ ** This word uses signed arithmetic. + ldmia psp ! { r0, r1 } + mov .s r2, # 0 + mov .s r3, # 0 + cmp r1, r0 + ge, if, + mov .s r2, # 1 + endif, + cmp r1, tos + le, if, + mov .s r3, # 1 + endif, + mov .s tos, # 0 \ flag=0 + tst r2, r3 + ne, if, + mvn .s tos, tos \ flag=-1 + endif, + next, +END-CODE +)) + +: within \ n1|u1 n2|u2 n3|u3 -- flag +\ *G Return true for *\i{n2 <= n1 < n3}. +\ ** This word uses unsigned arithmetic, so that signed compares are +\ ** treated as existing on a number circle. + over - -rot \ -- n3-n2 n1 n2 + - \ -- n3-n2 n1-n2 + swap u< \ (n1-n2)-(n3-n2), cy -> -1, ncy -> 0 +; + +code lshift \ x1 u -- x2 +\ *G Logically shift X1 by U bits left. + mov r0, tos + ldmia psp ! { tos } + lsl .s tos, r0 + next, +end-code + +code rshift \ x1 u -- x2 +\ *G Logically shift X1 by U bits right. + mov r0, tos + ldmia psp ! { tos } + lsr .s tos, r0 + next, +end-code + +code arshift \ x1 u -- x2 +\ *G Arithmetic shift right X1 by U bits. + mov r0, tos + ldmia psp ! { tos } + asr .s tos, r0 + next, +end-code + + +\ *************** +\ *S Control flow +\ *************** + +CODE EXECUTE \ xt -- +\ *G Execute the code described by the XT. This is a Forth equivalent +\ ** of an assembler JSR/CALL instruction. + mov .s r0, # 1 + orr .s r0, tos \ move CFA, setting Thumb bit + ldmia psp ! { tos } + bx r0 \ execute CFA - link contains ret addr of execute +END-CODE + +internal + +CODE BRANCH \ -- +\ +G The run time action of unconditional branches compiled on the target. +\ +* The branch target address is in-line and must have the T bit set. +\ +* INTERNAL. +l: takebranch + mov .s r1, # 1 + mov r0, link + bic .s r0, r1 + ldr r2, [ r0 ] \ get address and branch + bx r2 +END-CODE + +CODE ?BRANCH \ n -- +\ +G The run time action of conditional branches compiled on the target. +\ +* The branch target address is in-line and must have the T bit set. +\ +* INTERNAL. + mov .s r1, tos + ldmia psp ! { tos } + b .eq takebranch +l: skipbranch + mov r0, link + add .s r0, # 4 + bx r0 +END-CODE + +CODE (OF) \ n1 n2 -- n1|-- +\ +G The run time action of OF compiled on the target. +\ +* The branch target address is in-line and must have the T bit set. +\ +* INTERNAL. + ldmia psp ! { r0 } \ get n1 + cmp r0, tos \ compare n1 and n2 + b .ne takebranch + ldmia psp ! { tos } \ equal so get new tos + b skipbranch +END-CODE + +CODE (LOOP) \ -- +\ +G The run time action of *\fo{LOOP} compiled on the target. +\ +* The branch target address is in-line and must have the T bit set. +\ +* INTERNAL. + ldr r1, [ rsp ] \ fetch index + add .s r1, r1, # 1 \ increment index + str r1, [ rsp ] \ store new index] + b .vc takebranch + add rsp, rsp, # $0C \ drop 3 items from return stack + b skipbranch +END-CODE + +CODE (+LOOP) \ n -- +\ +G The run time action of *\fo{+LOOP} compiled on the target. +\ +* The branch target address is in-line and must have the T bit set. +\ +* INTERNAL. + ldr r1, [ rsp ] \ fetch index + add .s r1, r1, tos \ increment index by n + str r1, [ rsp ] \ store new index + ldmia psp ! { tos } \ update tos + b .vc takebranch + add rsp, rsp, # $0C \ drop 3 items from return stack + b skipbranch +END-CODE + +CODE (DO) \ limit index -- +\ +G The run time action of *\fo{DO} compiled on the target. +\ +* The branch target address is in-line and must have the T bit set. +\ +* INTERNAL. + ldmia psp ! { r1 } \ get limit +L: PDO + mov .s r4, # 1 + lsl .s r4, r4, # #31 \ r4 := $8000:0000 + mov r3, link + sub .s r3, r3, # 1 \ clear T bit + ldr r2, [ r3 ] \ get LEAVE address, compiler sets T bit + add .s r1, r1, r4 \ limit+$8000:0000 + sub .s r0, tos, r1 \ index-limit-$8000:0000 + + push { r0, r1, r2 } \ push LEAVE then limit, then index on ret. stack + ldmia psp ! { tos } \ update tos + b skipbranch +END-CODE + +CODE (?DO) \ limit index -- +\ +G The run time action of *\fo{?DO} compiled on the target. +\ +* The branch target address is in-line and must have the T bit set. +\ +* INTERNAL. + ldmia psp ! { r1 } \ get limit + cmp r1, tos \ check not equal + b .ne pdo \ take DO ? + ldmia psp ! { tos } \ update tos + b takebranch +END-CODE + +external + +CODE LEAVE \ -- +\ *G Remove the current *\fo{DO..LOOP} parameters and jump to the +\ ** end of the *\fo{DO..LOOP} structure. + add rsp, rsp, # 8 \ remove limit, index + pop { pc } \ jump to exit address, Thumb bit set by DO/?DO +END-CODE + +CODE ?LEAVE \ flag -- +\ *G If flag is non-zero, remove the current *\fo{DO..LOOP} parameters +\ ** and jump to the end of the *\fo{DO..LOOP} structure. + mov .s tos, tos \ set flags + ldmia psp ! { tos } \ update tos + eq, if, + bx r14 \ flag false so continue + endif, + add rsp, rsp, # 8 \ flag true so remove limit, index - if old TOS<>0 + pop { pc } \ flag true so jump to exit address +END-CODE + +CODE I \ -- n +\ *G Return the current index of the inner-most DO..LOOP. + sub .s psp, psp, # 4 + str tos, [ psp ] + ldr tos, [ rsp, # 0 ] + ldr r0, [ rsp, # 4 ] + add .s tos, tos, r0 + next, +END-CODE + +CODE J \ -- n +\ *G Return the current index of the second DO..LOOP. + sub .s psp, psp, # 4 + str tos, [ psp ] + ldr tos, [ rsp, # $0C ] \ index + ldr r0, [ rsp, # $010 ] + add .s tos, tos, r0 + next, +END-CODE + +CODE UNLOOP \ -- ; R: loop-sys -- +\ *G Remove the DO..LOOP control parameters from the return stack. + add rsp, rsp, # $0C \ remove loop parameters from return stack + next, \ jump to return address +END-CODE + + +\ ******************* +\ *S Basic arithmetic +\ ******************* + +: S>D \ n -- d +\ *G Convert a single number to a double one. + s>d ; + +(( +: D>S \ d -- n + \ *G Convert a double number to a single. + drop ; +)) + +: NOOP ; \ -- +\ *G A NOOP, null instruction. + +CODE M+ \ d1|ud1 n -- d2|ud2 +\ *G Add double d1 to sign extended single n to form double d2. + ldmia psp ! { r0 r1 } \ r0 = d1 high, r1 = d1 low + asr .s r2, tos, # 31 \ d2h = sex(n) + add .s r1, r1, tos \ d2l = d1l + n + adc .s r0, r0, r2 \ d2h = d1h + d2h + c + mov tos, r0 + sub .s psp, psp, # 4 + str r1, [ psp ] + next, +END-CODE + +: 1+ \ n1|u1 -- n2|u2 +\ *G Add one to top-of stack. + 1 + ; + +: 1- \ n1|u1 -- n2|u2 +\ *G Subtract one from top-of stack. + 1 - ; + +(( +: 2+ \ n1|u1 -- n2|u2 + \ *G Add two to top-of stack. + 2 + ; + +: 4+ \ n1|u1 -- n2|u2 + \ *G Add four to top-of stack. + 4 + ; + +: 2- \ n1|u1 -- n2|u2 + \ *G Subtract two from top-of stack. + 2 - ; + +: 4- \ n1|u1 -- n2|u2 + \ *G Subtract four from top-of stack. + 4 - ; + +: 2* \ x1 -- x2 + \ *G Multiply top of stack by 2. + 1 lshift ; + +: 4* \ x1 -- x2 + \ *G Multiply top of stack by 4. + 2 lshift ; + +: 2/ \ x1 -- x2 + \ *G Signed divide top of stack by 2. + 1 arshift ; + +: U2/ \ x1 -- x2 + \ *G Unsigned divide top of stack by 2. + 1 rshift ; + +: 4/ \ x1 -- x2 + \ *G Signed divide top of stack by 4. + 2 arshift ; + +: U4/ \ x1 -- x2 + \ *G Unsigned divide top of stack by 4. + 2 rshift ; +)) + +CODE + \ n1|u1 n2|u2 -- n3|u3 +\ *G Add two single precision integer numbers. + ldr r0, [ psp ] + add .s psp, psp, # 4 + add .s tos, tos, r0 + next, +END-CODE + +CODE - \ n1|u1 n2|u2 -- n3|u3 +\ *G Subtract two integers. N3|u3=n1|u1-n2|u2. + ldr r0, [ psp ] + add .s psp, psp, # 4 + sub .s tos, r0, tos + next, +END-CODE + +CODE NEGATE \ n1 -- n2 +\ *G Negate an integer. + rsb .s tos, tos, # 0 + next, +END-CODE + +CODE D+ \ d1 d2 -- d3 +\ *G Add two double precision integers. + ldmia psp ! { r0-r2 } \ r0 = d2 low, r1 = d1 high, r2 = d1 low + add .s r0, r0, r2 \ d3l = d2l + d1l + adc .s tos, tos, r1 \ d3h = d2h + d1h + sub .s psp, psp, # 4 + str r0, [ psp ] \ push d3l + next, +END-CODE + +CODE D- \ d1 d2 -- d3 +\ *G Subtract two double precision integers. D3=D1-D2. + ldmia psp ! { r0-r2 } \ r0 = d2 low, r1 = d1 high, r2 = d1 low + sub .s r0, r2, r0 \ d3l = d2l - d1l + sbc .s r1, r1, tos \ d3h = d2h - d1h + mov tos, r1 + sub .s psp, psp, # 4 + str r0, [ psp ] \ push d3l + next, +END-CODE + +CODE DNEGATE \ d1 -- -d1 +\ *G Negate a double number. +L: DNEG1 + ldr r0, [ psp ] \ r0 = d1l, tos = d1h + mov .s r1, # 0 + rsb .s r0, r0, # 0 \ negate low + sbc .s r1, r1, tos \ negate high carrying through + mov tos, r1 + str r0, [ psp ] + next, +END-CODE + +CODE ?NEGATE \ n1 flag -- n1|n2 +\ *G If flag is negative, then negate n1. + mov .s tos, tos \ set processor flags + ldmia psp ! { tos } + mi, if, + rsb .s tos, tos, # 0 \ negate n1 if flag=true + endif, + next, +END-CODE + +(( +CODE ?DNEGATE \ d1 flag -- d1|d2 + \ *G If flag is negative, then negate d1. + mov .s tos, tos \ set processor flags + ldmia psp ! { tos } \ discard flag + b .mi DNEG1 + next, +END-CODE +)) + +CODE ABS \ n -- u +\ *G If n is negative, return its positive equivalent (absolute value). + cmp tos, # 0 + mi, if, + rsb .s tos, tos, # 0 + endif, + next, +END-CODE + +CODE DABS \ d -- ud +\ *G If d is negative, return its positive equivalent (absolute value). + mov .s tos, tos \ set processor flags + b .mi DNEG1 \ negate d if flag=true + bx r14 \ restore link and exit +END-CODE + +CODE D2* \ xd1 -- xd2 +\ *G Multiply the given double number by two. + ldr r0, [ psp ] \ low portion + add .s r0, r0, r0 + adc .s tos, tos, tos + str r0, [ psp ] + next, +END-CODE + +CODE D2/ \ xd1 -- xd2 +\ *G Divide the given double number by two. + ldr r0, [ psp ] \ low portion + asr .s r0, r0, # 1 \ low portion shift right + asr .s tos, tos, # 1 \ high portion shift right + sbc .s r1, r1, r1 \ r1 -> 0/-1 + lsl .s r1, r1, # #31 \ r1 -> 8/$8000:0000 + orr .s r0, r0, r1 \ apply to low portion + str r0, [ psp ] + next, +END-CODE + + +\ ***************** +\ *S Multiplication +\ ***************** + +: * \ n1 n2 -- n3 +\ *G Standard signed multiply. N3 = n1 * n2. + * ; + +get-tos 7 = get-psp 6 = and [if] +code UM* \ u1 u2 -- ud +\ *G Perform unsigned-multiply between two numbers and return double +\ ** result. + mov r0, tos \ r0=u2 + ldr r1, [ psp, # 0 ] \ r1=u1 + push { psp } +\ build result in r7:r6 +\ build temps in r5:r4:r3:r2 + lsl .s r2, r1 # #16 + lsr .s r2, r2 # #16 \ r2=u1l + lsr .s r3, r1 # #16 \ r3=u1h + lsl .s r4, r0 # 16 + lsr .s r4, r4 # 16 \ r4=u2l + lsr .s r5, r0 # 16 \ r5=u2h +\ scratch = r0, r1 +\ multiply low portions + mov r6, r2 + mul .s r6, r4 \ r6=u1l*u2l +\ multiply high portions + mov r7, r3 + mul .s r7, r5 \ r7=u1h*u2h +\ multiply and accumulate u1h * u2l + mov r0, r3 + mul .s r0, r4 \ r0=u1h*u2l=xxxx.yyyy + lsr .s r1, r0 # #16 \ r1=r0h + lsl .s r0, r0 # #16 \ r1:r0=0000.xxxx:yyyy.0000 + add .s r6, r6, r0 \ add into result + adc .s r7, r7, r1 +\ multiply and accumulate u2h * u1l + mov r0, r5 + mul .s r0, r2 \ r0=u2h*u1l=xxxx.yyyy + lsr .s r1, r0 # #16 \ r1=r0h + lsl .s r0, r0 # #16 \ r1:r0=0000.xxxx:yyyy.0000 + add .s r6, r6, r0 \ add into result + adc .s r7, r7, r1 + + mov r5, r6 + pop { psp } + str r5, [ psp, # 0 ] + + next, +end-code +[then] + +: m* \ n1 n2 -- d +\ *G Signed multiply yielding double result. + 2dup xor >r \ sign of result + abs swap abs swap um* \ process unsigned + r> 0< \ apply sign of result + if dnegate then +; + + +\ *********** +\ *S Division +\ *********** +\ *P ARM Cortex-M0 provides no division instructions. + +code um/mod \ ud1 u2 -- urem uquot +\ *G Full 64 by 32 unsigned division subroutine. + ldmia psp ! { r0 } \ dividend high + ldr r1, [ psp ] \ dividend low + mov .s r4, # #32 \ loop counter + mov .s r2, # 0 \ always 0 + begin, +\ udiv64_step + add .s r1, r1, r1 \ 64 bit shift of dividend + adc .s r0, r0, r0 + mov r3, r2 \ must not affect flags + adc .s r3, r3, r2 \ preserve dividend bit 63, R2=0 + sub .s r0, r0, tos \ trial subtraction, carry set (no borrow) if ok + adc .s r3, r3, r3 \ success if bit 0 or 1 set + ne, if, + add .s r1, r1, # 1 \ succeeded, update quotient + else, + add .s r0, r0, tos \ failed, undo subtraction + endif, + sub .s r4, r4, # 1 + eq, until, + mov tos, r1 \ move quotient + str r0, [ psp ] \ move remainder + next, +end-code + +: fm/mod \ d n -- rem quot ; floored division +\ *G Perform a signed division of double number *\i{d} by single +\ ** number *\i{n} and return remainder and quotient using floored +\ ** division. See the ANS Forth specification for more details +\ ** of floored division. + dup >r \ sign of divisor + 2dup xor >r \ sign of quotient + >r \ divisor + dabs r@ abs um/mod $7FFF:FFFF and \ unsigned divide, truncate overflow ; SFP006 + swap r> 0< ?negate swap \ remainder takes sign of divisor + r> 0< if \ if quotient negative + negate \ apply sign of quotient + over if \ if remainder non-zero + 1- \ decrement quotient + r@ rot - swap \ rem := divisor - rem + endif + endif + r> drop +; + +: sm/rem \ d n -- rem quot ; symmetric division +\ *G Perform a signed division of double number *\i{d} by single +\ ** number *\i{n} and return remainder and quotient using +\ ** symmetric (normal) division. + over >r \ save sign of dividend + >r dabs r@ abs um/mod \ unsigned division + r> r@ xor ?negate \ correct sign of quot. + swap r> ?negate swap \ correct sign of rem. +; + +: /mod \ n1 n2 -- rem quot +\ *G Signed symmetric division of N1 by N2 single-precision +\ ** returning remainder and quotient. Symmetric. + >r s>d r> sm/rem +; + +: / \ n1 n2 -- n3 +\ *G Standard signed division operator. n3 = n1/n2. Symmetric. + >r s>d r> sm/rem nip +; + +: u/ \ u1 u2 -- u3 +\ *G Unsigned division operator. u3 = u1/u2. + 0 swap um/mod nip +; + +: MOD \ n1 n2 -- n3 +\ *G Return remainder of division of N1 by N2. n3 = n1 mod n2. + /mod drop ; + +: M/ \ d n1 -- n2 +\ *G Signed divide of a double by a single integer. + sm/rem nip ; + +: MU/MOD \ d n -- rem d#quot +\ *G Perform an unsigned divide of a double by a single, returning +\ ** a single remainder and a double quotient. + >r 0 r@ um/mod r> swap >r um/mod r> ; + + +\ ********************************* +\ *S Scaling - multiply then divide +\ ********************************* +\ *P These operations perform a multiply followed by a divide. +\ ** The intermediate result is in an extended form. The point +\ ** of these operations is to avoid loss of precision. + +: */MOD \ n1 n2 n3 -- n4 n4 +\ *G Multiply n1 by n2 to give a double precision result, and then +\ ** divide it by n3 returning the remainder and quotient. + >r m* r> sm/rem ; + +: */ \ n1 n2 n3 -- n4 +\ *G Multiply n1 by n2 to give a double precision result, and then +\ ** divide it by n3 returning the quotient. + */mod nip ; + +(( +: m*/ \ d1 n2 n3 -- dquot + \ *G The result dquot=(d1*n2)/n3. The intermediate value d1*n2 + \ ** is triple-precision to avoid loss of precision. In an ANS + \ ** Forth standard program n3 can only be a positive signed + \ ** number and a negative value for n3 generates an ambiguous + \ ** condition, which may cause an error on some implementations, + \ ** but not in this one. + s>d >r abs >r \ -- d1 n2 ; R: -- sign(n3) |n3| + s>d >r abs \ -- d1 |n2| ; R: -- sign(n3) |n3| sign(n2) + -rot \ -- |n2| d1 ; R: -- sign(n3) |n3| sign(n2) + s>d r> xor \ -- |n2| d1 sign(d1*n2) ; R: -- sign(n3) |n3| + r> swap >r >r \ -- |n2| d1 ; R: -- sign(n3) sign(d1*n2) |n3| + dabs rot \ -- |d1| |n2| ; R: -- sign(n3) sign(d1*n2) |n3| + tuck um* 2swap um* \ -- d1h*n2 d1l*n2 ; R: -- sign(n3) sign(d1*n2) |n3| + swap >r 0 d+ r> -rot \ -- t ; R: -- sign (n3) sign(d1*n2) |n3| + r@ um/mod -rot r> um/mod nip swap \ -- d ; R: -- sign(n3) sign(d1*n2) + r> r> xor IF dnegate THEN \ -- d +; +)) + +\ ********************* +\ *S Stack manipulation +\ ********************* + +: NIP \ x1 x2 -- x2 +\ *G Dispose of the second item on the data stack. + nip ; + +: TUCK \ x1 x2 -- x2 x1 x2 +\ *G Insert a copy of the top data stack item underneath the current +\ ** second item. + tuck ; + +: PICK \ xu .. x0 u -- xu .. x0 xu +\ *G Get a copy of the Nth data stack item and place on top of stack. +\ ** 0 PICK is equivalent to DUP. + pick ; + +CODE ROLL \ xu xu-1 .. x0 u -- xu-1 .. x0 xu +\ *G Rotate the order of the top N stack items by one place such that +\ ** the current top of stack becomes the second item and the Nth item +\ ** becomes TOS. See also *\fo{ROT}. + lsl .s r0, tos # 2 \ r0=position of xu in bytes + cmp r0, # 0 \ u is valid? + le, if, + ldmia psp ! { tos } \ no - get new tos + bx link \ no - exit + endif, + ldr tos, [ psp ++ r0 ] \ put xu in tos +L: ROLL1 + sub .s r1, r0, # 4 + ldr r2, [ psp ++ r1 ] + str r2, [ psp ++ r0 ] + mov .s r0, r1 + b .ne ROLL1 + add .s psp, psp, # 4 + next, +END-CODE + +: ROT \ x1 x2 x3 -- x2 x3 x1 +\ *G ROTate the positions of the top three stack items such that the +\ ** current top of stack becomes the second item. + rot ; + +: -ROT \ x1 x2 x3 -- x3 x1 x2 +\ *G The inverse of *\fo{ROT}. + -rot ; + +CODE >R \ x -- ; R: -- x +\ *G Push the current top item of the data stack onto the top of the +\ ** return stack. + push { tos } + ldmia psp ! { tos } + next, +END-CODE + +CODE R> \ -- x ; R: x -- +\ *G Pop the top item from the return stack to the data stack. + sub .s psp, psp, # 4 + str tos, [ psp ] + pop { tos } + next, +END-CODE + +CODE R@ \ -- x ; R: x -- x +\ *G Copy the top item from the return stack to the data stack. + sub .s psp, psp, # 4 + str tos, [ psp ] + ldr tos, [ rsp ] + next, +END-CODE + +CODE 2>R \ x1 x2 -- ; R: -- x1 x2 +\ *G Transfer the two top data stack items to the return stack. + ldmia psp ! { r0, r1 } \ r0=x1, r1=new tos + push { r0 } \ push x1 + push { tos } \ push x2 + mov .s tos, r1 \ new tos=r1 + next, +END-CODE + +CODE 2R> \ -- x1 x2 ; R: x1 x2 -- +\ *G Transfer the top two return stack items to the data stack. + pop { r0 r1 } \ r0=x2, r1=x1 + sub .s psp, psp, # 8 + str r1 [ psp, # 0 ] + str tos [ psp, # 4 ] + mov tos, r0 \ tos=x2 + next, +END-CODE + +CODE 2R@ \ -- x1 x2 ; R: x1 x2 -- x1 x2 +\ *G Copy the top two return stack items to the data stack. + ldr r0, [ rsp, # 0 ] \ r0=x2 + ldr r1, [ rsp, # 4 ] \ r1=x1 + sub .s psp, psp, # 8 + str r1 [ psp, # 0 ] + str tos [ psp, # 4 ] + mov tos, r0 \ tos=x2 + next, +END-CODE + +: SWAP \ x1 x2 -- x2 x1 +\ *G Exchange the top two data stack items. + swap ; + +: DUP \ x -- x x +\ *G DUPlicate the top stack item. + dup ; + +: OVER \ x1 x2 -- x1 x2 x1 +\ *G Copy NOS to a new top-of-stack item. + over ; + +: DROP \ x -- +\ *G Lose the top data stack item and promote NOS to TOS. + drop ; + +: 2DROP \ x1 x2 -- ) +\ *G Discard the top two data stack items. + 2drop ; + +: 2SWAP \ x1 x2 x3 x4 -- x3 x4 x1 x2 +\ *G Exchange the top two cell-pairs on the data stack. + 2swap ; + +(( +code 2ROT \ x1 x2 x3 x4 x5 x6 -- x3 x4 x5 x6 x1 x2 + \ *G Perform the *\fo{ROT} operation on three cell-pairs. + ldmia psp ! { r0-r4 } \ tos=x6, r0=x5, r4=x1 + sub .s psp, psp, # 5 cells \ restore stack depth + str r4, [ psp, # 0 cells ] \ x1 + str tos [ psp, # 1 cells ] \ x6 + str r0, [ psp, # 2 cells ] \ x5 + str r1, [ psp, # 3 cells ] \ x4 + str r2, [ psp, # 4 cells ] \ x3 + mov tos, r3 \ x2 to tos + next, +END-CODE +)) + +: 2DUP \ x1 x2 -- x1 x2 x1 x2 +\ *G DUPlicate the top cell-pair on the data stack. + 2dup ; + +: 2OVER \ x1 x2 x3 x4 -- x1 x2 x3 x4 x1 x2 +\ *G As *\fo{OVER} but works with cell-pairs rather than single-cell items. + 2over ; + +: ?DUP \ x -- | x +\ *G DUPlicate the top stack item only if it non-zero. + ?dup ; + +CODE SP@ \ -- x +\ *G Get the current address value of the data-stack pointer. + sub .s psp, psp, # 4 + str tos, [ psp ] + mov tos, psp + next, +END-CODE + +CODE SP! \ x -- +\ *G Set the current address value of the data-stack pointer. + mov psp, tos + ldmia psp ! { tos } + next, +END-CODE + +CODE RP@ \ -- x +\ *G Get the current address value of the return-stack pointer. + sub .s psp, psp, # 4 + str tos, [ psp ] + mov tos, rsp + next, +END-CODE + +CODE RP! \ x -- +\ *G Set the current address value of the return-stack pointer. + mov rsp, tos + ldmia psp ! { tos } + next, +END-CODE + +(( +CODE >RR \ x -- ; R: -- x + \ *G Push the current top item of the data stack onto the top of the + \ ** return stack as a return address + mov .s r0, # 1 \ set the T bit + orr .s tos, tos, r0 + push { tos } + ldmia psp ! { tos } + next, +END-CODE + +CODE RR> \ -- x ; R: x -- + \ *G Pop the caller's return address from the return stack. + sub .s psp, psp, # 4 + str tos, [ psp ] + pop { tos } + mov .s r0, # 1 \ clear the T bit + bic .s tos, tos, r0 + next, +END-CODE + +CODE RR@ \ -- x ; R: x -- x + \ *G Copy the top item from the return stack to the data stack. + sub .s psp, psp, # 4 + str tos, [ psp ] + ldr tos, [ rsp ] + mov .s r0, # 1 \ clear the T bit + bic .s tos, tos, r0 + next, +END-CODE +)) + + +\ ****************************** +\ *S String and memory operators +\ ****************************** + +: COUNT \ c-addr1 -- c-addr2' u +\ *G Given the address of a counted string in memory this word will +\ ** return the address of the first character and the length in +\ ** characters of the string. + count ; + +: /STRING \ c-addr1 u1 n -- c-addr2 u2 +\ *G Modify a string address and length to remove the first N characters +\ ** from the string. + /string ; + +CODE SKIP \ c-addr1 u1 char -- c-addr2 u2 +\ *G Modify the string description by skipping over leading occurrences of +\ ** 'char'. + ldmia psp ! { r0, r1 } \ tos=char, r0=len, r1=adr1 + add .s r0, r0, # 1 +L: SK1 + sub .s r0, r0, # 1 + b .eq SKIPDONE + ldrb r2, [ r1 ] + cmp r2, tos + eq, if, + add .s r1, r1, # 1 + b SK1 + endif, +L: SKIPDONE + sub .s psp, psp, # 4 + str r1, [ psp ] \ push c-addr2 + mov tos, r0 \ u2 + next, +END-CODE + +CODE SCAN \ c-addr1 u1 char -- c-addr2 u2 +\ *G Look for first occurrence of *\i{char} in the string and +\ ** return a new string. *\i{C-addr2/u2} describes the string +\ ** with *\i{char} as the first character. + ldmia psp ! { r0, r1 } \ tos=char, r0=len, r1=adr1 + add .s r0, r0, # 1 +L: SC1 + sub .s r0, r0, # 1 + b .eq SCANDONE + ldrb r2, [ r1 ] + cmp r2, tos + ne, if, + add .s r1, r1, # 1 + b SC1 + endif, +L: SCANDONE + sub .s psp, psp, # 4 + str r1, [ psp ] \ push c-addr2 + mov tos, r0 \ u2 + next, +END-CODE + +CODE S= \ c-addr1 c-addr2 u -- flag +\ *G Compare two same-length strings/memory blocks, returning TRUE if +\ ** they are identical. + ldmia psp ! { r0, r1 } \ r0=adr2, r1=adr1 + mov .s tos, tos + b .eq S=X \ TRUE as len=0 +L: S=1 + ldrb r2, [ r0 ] + ldrb r3, [ r1 ] + add .s r0, r0, # 1 + add .s r1, r1, # 1 + cmp r2, r3 + b .ne S=X \ FALSE as mismatched chars + sub .s tos, tos, # 1 + b .ne S=1 \ if count=0 then TRUE +L: S=X + eq, if, + mov .s tos, # 1 + neg .s tos, tos \ TRUE + else, + mov .s tos, # 0 \ FALSE + then, + next, +END-CODE + +: compare \ c-addr1 u1 c-addr2 u2 -- n 17.6.1.0935 +\ *G Compare two strings. The return result is 0 for a match or can be +\ ** -ve/+ve indicating string differences. +\ ** If the two strings are identical, n is zero. If the two strings +\ ** are identical up to the length of the shorter string, n is +\ ** minus-one (-1) if u1 is less than u2 and one (1) otherwise. +\ ** If the two strings are not identical up to the length of the +\ ** shorter string, n is minus-one (-1) if the first non-matching +\ ** character in the string specified by c-addr1 u1 has a lesser +\ ** numeric value than the corresponding character in the string +\ ** specified by c-addr2 u2 and one (1) otherwise. + rot swap \ c-addr1 c-addr2 u1 u2 + 2dup - >r min \ c-addr1 c-addr2 minlen -- R: lendiff? -- + + begin + dup + while + -rot over c@ over c@ - \ length c-addr1 c-addr2 (char1-char2) + dup if \ If chars are different + r> drop >r \ replace lendiff result with error code + drop 0 \ and put 0 on TOS (make len==0 at BEGIN) + else \ otherwise + drop \ discard difference + 1+ swap 1+ swap rot 1- \ increment addresses and decrement length + then + repeat + drop 2drop \ remove addresses and null count from stack + \ -- ; R: result -- + r> dup if 0< 1 or then \ make nice flag, 0 becomes 0, -ve becomes -1 + \ and +ve becomes 1 +; + +internal +: (search) { c-addr1 u1 c-addr2 u2 -- c-addr3 u3 flag } + c-addr1 u1 u2 - 1+ bounds \ Search for first char of $2 in $1. Note that + ?do \ we only check LEN($1)-LEN($2)+1 chars of $1. + i c@ c-addr2 c@ = if \ Compare next char of $1 with first char of $2. + i c-addr2 u2 s= if \ Is the whole of $2 present? + i u1 i c-addr1 - - true \ Yes - build return stack parameters... + unloop exit \ ...and bail out. + then + then + loop + c-addr1 u1 false \ End of loop and first char not found - no match. +; +external + +: SEARCH ( c-addr1 u1 c-addr2 u2 -- c-addr3 u3 flag ) +\ *G Search the string c-addr1/u1 for the string c-addr2/u2. If a match +\ ** is found return c-addr3/u3, the address of the start of the match +\ ** and the number of characters remaining in c-addr1/u1, plus flag f +\ ** set to true. If no match was found return c-addr1/u1 and f=0. + 2 pick over < \ Is $1 shorter than $2? + if 2drop false exit then \ Yes - $2 *can't* be in $1. + dup 0 <= \ Is $2 zero length? + if 2drop true exit then \ Yes - we have found it at the start of $1. + 2 pick 0 <= \ Is $1 zero length? + if 2drop false exit then \ Yes - string not found. + (search) +; + +code cmove \ asrc adest len -- +\ *G Copy *\i{len} bytes of memory forwards from *\i{asrc} to *\i{adest}. + mov .s r3, tos \ r3=len + ldmia psp ! { r0, r1, tos } \ r0=addr2, r1=addr1, r3=len, tos restored + eq, if, + bx link \ return if len=0, nothing to do + endif, + mov .s r2, r0 + orr .s r2, r2, r1 \ check alignment + orr .s r2, r2, r3 \ R2 := adr1|addr2|len + mov .s r4, # 3 + and .s r4, r4, r2, \ will be zero if aligned + b .ne cmovx3 \ if not aligned +L: CMOVX1 + ldr r2, [ r1 ] + str r2, [ r0 ] + add .s r1, r1, # 4 + add .s r0, r0, # 4 + sub .s r3, r3, # 4 + b .ne CMOVX1 + next, +L: CMOVX3 + ldrb r2, [ r1 ] + strb r2, [ r0 ] + add .s r1, r1, # 1 + add .s r0, r0, # 1 + sub .s r3, r3, # 1 + b .ne CMOVX3 + next, +END-CODE + +CODE CMOVE> \ c-addr1 c-addr2 u -- +\ *G As *\fo{CMOVE} but working in the opposite direction, +\ ** copying the last character in the string first. + mov .s r3, tos \ r3=len + ldmia psp ! { r0, r1, tos } \ r0=addr2, r1=addr1, r3=len, tos restored + eq, if, + bx link \ return if len=0, nothing to do + endif, + add .s r0, r0, r3 \ addr2+len + add .s r1, r1, r3 \ addr1+len + mov .s r2, r0 + orr .s r2, r2, r1 \ check alignment + orr .s r2, r2, r3 \ R2 := adr1|addr2|len + mov .s r4, # 3 + and .s r4, r4, r2, \ will be zero if aligned + b .ne CMV>3 \ byte by byte if not aligned +L: CMV>1 \ copy by 4 byte units + sub .s r1, r1, # 4 + sub .s r0, r0, # 4 + ldr r2, [ r1 ] + str r2, [ r0 ] + sub .s r3, r3, # 4 + b .ne CMV>1 + next, +L: CMV>3 \ copy byte by byte + sub .s r1, r1, # 1 + sub .s r0, r0, # 1 + ldrb r2, [ r1 ] + strb r2, [ r0 ] + sub .s r3, r3, # 1 + b .ne CMV>3 + next, +END-CODE + +: upc \ char -- char' ; force upper case +\ *G Convert char to upper case. + dup [char] a >= if + dup [char] z <= if + $DF and + endif + endif +; + +: upper \ c-addr len -- +\ *G Convert the ASCII string described to upper-case. This operation +\ ** happens in place. + bounds ?do i c@ upc i c! loop +; + +: PLACE \ c-addr1 u c-addr2 -- +\ *G Place the string c-addr1/u as a counted string at c-addr2. + 2dup 2>r 1+ swap move 2r> c! +; + +: ON \ a-addr -- +\ *G Given the address of a CELL this will set its contents to TRUE (-1). + on ; + +: OFF \ a-addr -- +\ *G Given the address of a CELL this will set its contents to FALSE (0). + off ; + +(( +CODE C+! \ b c-addr -- + \ *G Add N to the character (byte) at memory address ADDR. + ldmia psp ! { r0 } + ldrb r1, [ tos ] + add .s r1, r1, r0 + strb r1, [ tos ] + ldmia psp ! { tos } + next, +END-CODE +)) + +CODE 2@ \ a-addr -- x1 x2 +\ *G Fetch and return the two CELLS from memory ADDR and ADDR+sizeof(CELL). +\ ** The cell at the lower address is on the top of the stack. + ldmia tos ! { r0 r1 } \ r0 from low address + sub .s psp, psp, # 4 + mov tos, r0 + str r1, [ psp ] + next, +END-CODE + +CODE 2! \ x1 x2 a-addr -- +\ *G Store the two CELLS x1 and x2 at memory ADDR. +\ ** X2 is stored at ADDR and X1 is stored at ADDR+CELL. + mov .s r2, tos + ldmia psp ! { r0, r1, tos } \ r0=x2, r1=x1 + stmia r2 ! { r0 r1 } + next, +END-CODE + +CODE FILL \ c-addr u char -- +\ *G Fill LEN bytes of memory starting at ADDR with the byte information +\ ** specified as CHAR. + mov .s r2, tos + ldmia psp ! { r0, r1, tos } \ r2=char, r0=count, r1=addr + cmp r0, # 0 + b .eq FILX +L: FIL1 + strb r2, [ r1 ] + add .s r1, r1, # 1 + sub .s r0, r0, # 1 + b .ne FIL1 +L: FILX + next, +END-CODE + +: +! \ n|u a-addr -- +\ *G Add N to the CELL at memory address ADDR. + +! ; + +: INCR \ a-addr -- +\ *G Increment the data cell at a-addr by one. + incr ; + +: DECR \ a-addr -- +\ *G Decrement the data cell at a-addr by one. + decr ; + +: @ \ a-addr -- x +\ *G Fetch and return the CELL at memory ADDR. + @ ; + +: W@ \ a-addr -- w +\ *G Fetch and 0 extend the word (16 bit) at memory ADDR. + w@ ; + +: C@ \ c-addr -- char +\ *G Fetch and 0 extend the character at memory ADDR and return. + c@ ; + +: ! \ x a-addr -- +\ *G Store the CELL quantity X at memory A-ADDR. + ! ; + +: W! \ w a-addr -- +\ *G Store the word (16 bit) quantity w at memory ADDR. + w! ; + +: C! \ char c-addr -- +\ *G Store the character CHAR at memory C-ADDR. + c! ; + +: TEST-BIT \ mask c-addr -- flag +\ *G AND the mask with the contents of addr and return the result. + c@ and ; + +: SET-BIT \ mask c-addr -- +\ *G Apply the mask ORred with the contents of c-addr. +\ ** Byte operation. + bor! ; + +: RESET-BIT \ mask c-addr -- +\ *G Apply the mask inverted and ANDed with the contents of c-addr. +\ ** Byte operation. + bbic! ; + +(( +CODE TOGGLE-BIT \ u c-addr -- + \ *G Invert the bits at c-addr specified by the mask. Byte operation. + ldmia psp ! { r0 } \ get mask + ldrb r1, [ tos ] \ get byte from addr + eor .s r1, r1, r0 \ apply mask + strb r1, [ tos ] \ store byte + ldmia psp ! { tos } \ get new tos + next, +END-CODE +)) + + +\ ********************** +\ *S Miscellaneous words +\ ********************** + +: NAME> \ nfa -- cfa +\ *G Move a pointer from an NFA to the XT.. + dup c@ $1F and + 4 + -4 and ; \ 1 for count byte, 3 for aligning + +\ On Cortex, name field is a multiple of 4 bytes so we only need to +\ check top bit of every fourth byte when working back from the cfa +\ to find the nfa +: >NAME \ cfa -- nfa +\ *G Move a pointer from an XT back to the NFA or name-pointer. +\ ** If the original pointer was not an XT or if the definition +\ ** in question has no name header in the dictionary the +\ ** returned pointer will be useless. Care should be taken when +\ ** manipulating or scanning the Forth dictionary in this way. + begin 4 - dup @ $80 and until \ nfa in low byte +; + +internal +: (SEARCH-WORDLIST) ( c-addr u ^^nfa -- 0 | xt 1 | xt -1 ) + begin + @ dup + while + dup c@ $1F and \ -- c-addr u ^nfa nfalen ; + 2 pick = if \ Are the names the same *length*? + dup 1+ 3 pick 3 pick s= if \ Are they the same *name*? + nip nip + dup name> swap + c@ $40 and ( 0= ) \ check for immediacy (0=immediate) + if -1 else 1 then + exit + then + then + ( n>link ) cell - + repeat + drop 2drop 0 +; + +: SEARCH-WORDLIST \ c-addr u wid -- 0|xt 1|xt -1 +\ *G Search the given wordlist for a definition. If the definition is +\ ** not found then 0 is returned, otherwise the XT of the definition +\ ** is returned along with a non-zero code. A -ve code indicates a +\ ** "normal" definition and a +ve code indicates an *\fo{IMMEDIATE} word. + dup 0= if + nip nip + else \ -- c-addr u wid + over 3 pick c@ + over @ 1- and \ -- c-addr u wid thread# + 1+ cells + \ -- c-addr u ^nfa + (search-wordlist) + then +; + +CODE DIGIT \ char n -- 0|n true +\ *G If the ASCII value *\i{CHAR} can be treated as a digit for a number +\ ** within the radix *\i{N} then return the digit and a TRUE flag, otherwise +\ ** return FALSE. + ldmia psp ! { r0 } \ base in tos, char in r0 + sub .s r0, r0, # $30 \ '0' + b .mi DIG2 \ fail if char < '0' + cmp r0, # $0A + b .lt DIG1 \ true, '0' <= char <= '9@ + sub .s r0, r0, # 7 \ convert 'A'..'F' + cmp r0, # $0A + b .lt DIG2 \ fail if result < 'A' +L: DIG1 + cmp r0, tos \ in range of base? + lt, if, + mov .s tos, # 1 \ yes, tos=true + neg .s tos, tos + sub .s psp, psp, # 4 + str r0, [ psp ] \ push n + next, + endif, \ exit +L: DIG2 + mov .s tos, # 0 \ tos=false + next, \ exit +END-CODE + + +\ ********************** +\ *S Portability helpers +\ ********************** +\ *P Using these words will make code easier to port between +\ ** 16, 32 and 64 bit targets. + +CODE CELL+ \ a-addr1 -- a-addr2 +\ *G Add the size of a CELL to the top-of stack. + add .s tos, tos, # 4 + next, +END-CODE + +CODE CELLS \ n1 -- n2 +\ *G Return the size in address units of N1 cells in memory. + mov .s tos, tos .lsl # 2 + next, +END-CODE + +CODE CELL- \ a-addr1 -- a-addr2 +\ *G Decrement an address by the size of a cell. + sub .s tos, tos, # 4 + next, +END-CODE + +CODE CELL \ -- n +\ *G Return the size in address units of one CELL. + sub .s psp, psp, # 4 + str tos, [ psp ] \ save TOS + mov .s tos, # 4 \ return cell size + next, +END-CODE + +(( +CODE CHAR+ \ c-addr1 -- c-addr2 +\ *G Increment an address by the size of a character. + add .s tos, tos, # 1 + next, +END-CODE + +: CHARS \ n1 -- n2 +\ *G Return size in address units of N1 characters. +; immediate +)) + + +\ ************************************** +\ *S Supporting complation on the target +\ ************************************** +\ *P Compilation on the target is supported for compilation into +\ ** Flash. The target's compiler is simplistic and gives neither +\ ** the code size nor the performance of cross-compiled code. +\ ** The support words are compiled without heads. + +interpreter also asm-access \ black magic here! + get-rsp get-psp get-tos +previous target +equ tos-reg equ psp-reg equ rsp-reg + +internal +: opc32, \ opc32 -- ; compile 32 bit opcode + dup #16 rshift w, w, ; + +: opc32! \ opc32 addr -- ; store a 32 bit opcode + over #16 rshift over w!f 2 + w!f ; + +(( +: opc32@ \ addr -- opc32 ; fetch a 32 bit opcode + dup w@ #16 lshift swap 2 + w@ or ; +)) + +(( +\ Short form for calls + bl <dest> \ $+00 + ... \ $+04, returns here +\ Long form for calls, start is NOT aligned + ldr r0, $ 6 + \ $+00 + blx r0 \ $+02 + b $ 6 + \ $+04 skip address + addr \ $+06 location must be aligned +)) + +(( +: inRange24? \ dest -- flag ; true if +/-24 bit + here 4 + - $FF00:0000 $00FF:FFFE within? ; +)) + +: GenJ \ offset mask -- Jx ; J := (notI) xor S + over and 0= swap 0< xor ; + +: CalcTrel24 \ dest orig -- field24 +\ calculate field for 24 bit Thumb branch + 4 + - 1 arshift \ half word align + dup $7FF and \ offset imm11 ; bits 10..0 -> 10..0 + over #11 rshift $3FF and #16 lshift or \ merge imm10 ; bits 20..11 -> 25..16 + over $0020:0000 GenJ $0000:2000 and or \ merge J1/bit13 ; I1=bit21 -> 13 + over $0040:0000 GenJ $0000:0800 and or \ merge J2/bit11 ; I2=bit22 -> 11 + swap 0< $0400:0000 and or \ merge S to bit26 +; + +: bl24 \ dest orig -- opc + calcTrel24 $F000:D000 or ; + +: pushLR.n, \ -- ; lay 16 bit push of LR to return stack + $B500 w, ; \ push { lr } + +: nop.n, \ -- ; lay 16 bit NOP + $BF00 w, ; \ nop .n + +: !scall \ dest addr -- +\ +G Patch a BL DEST opcode at addr. + tuck bl24 swap opc32! ; + +$1E00 4 6 lshift or psp-reg 3 lshift or psp-reg or equ subPspIns +\ Instruction opcode for SUB psp, psp, # 4 +$6000 psp-reg 3 lshift or tos-reg or equ strTosIns +\ Instruction opcode for STR tos, [ psp # 0 ] + +: saveTos, \ -- ; compiles push of tos to data stack + subPspIns w, \ sub psp, psp, # 4 + strTosIns w, \ template for str rt, [ rn, # 0 ] +; + +: dataPtr@, \ -- ; compiles fetch to TOS through LR + $4670 w, \ mov r0, link + $1E40 w, \ sub .s r0, r0, # 1 + $6800 tos-reg or w, \ ldr tos, [ r0, # 0 ] +; + +: scall, \ addr -- +\ +G Compile a machine code BL to addr. No range checking is performed. + here bl24 opc32, ; + +: compileAligned, \ xt -- + here 2 and + if nop.n, endif + scall, +; + +: DOCOLON, \ -- +\ +G Compile the runtime entry code required by colon definitions. +\ +* INTERNAL. + pushLR.n, ; \ push { r14 } + +CODE LIT \ -- x +\ *G Code which when CALLED at runtime will return an inline cell +\ ** value. The call must be at a four byte boundary. INTERNAL. + sub .s psp, psp, # 4 \ save TOS + str tos, [ psp, # 0 ] + mov r0, link \ LINK is high register + sub .s r0, r0, # 1 \ remove T bit + ldr tos, [ r0, # 0 ] \ get data (in-line) + add .s r0, r0, # 5 \ restore T bit, step over data + bx r0 +END-CODE + +CODE (") \ -- a-addr ; return address of string, skip over it +\ *G Return the address of a counted string that is inline after the +\ ** CALLING word, and adjust the CALLING word's return address to +\ ** step over the inline string. The adjusted return address will +\ ** be at a four byte boundary. +\ ** See the definition of *\fo{(.")} for an example. + sub .s psp, psp, # 4 \ save TOS + str tos, [ psp, # 0 ] + ldr tos, [ rsp, # 0 ] \ get return address of CALLER + sub .s tos, tos, # 1 \ remove Thumb bit + ldrb r1, [ tos, # 0 ] \ length byte + add .s r1, r1, tos \ r1=address+length + add .s r1, r1, # 4 \ +1 for count byte, +3 to align + mov .s r2, # 3 \ -4 AND -> 3 BIC + bic .s r1, r1, r2 + add .s r1, r1, # 1 \ restore Thumb bit + str r1, [ rsp, # 0 ] \ update return address + next, +END-CODE + +external + + +\ ************************************* +\ *S Defining words and runtime support +\ ************************************* + +: aligned \ addr -- addr' +\ *G Given an address pointer this word will return the next ALIGNED +\ ** address subject to system wide alignment restrictions. + 3 + -4 and +; +compiler +: aligned \ addr -- addr' + 3 + -4 and +; +target + + +ASMCODE +align L: DOCREATE \ -- addr +\ +G The run time action of *\fo{CREATE}. The call must be on a +\ +* four byte boundary. INTERNAL. + sub .s psp, psp, # 4 \ save TOS + str tos, [ psp, # 0 ] + mov r0, link \ LINK is high register + sub .s r0, r0, # 1 \ remove T bit + ldr tos, [ r0, # 0 ] \ get data address (in-line) + pop { pc } +end-code + +: compile, \ xt -- +\ *G Compile the word specified by xt into the current definition. + scall, ; + +: >BODY \ xt -- a-addr +\ *G Move a pointer from a CFA or "XT" to the definition's data +\ ** area. *\fo{>BODY} should only be used with children of +\ ** *\fo{CREATE}. If *\fo{FOOBAR} is defined with *\fo{CREATE foobar}, +\ ** then the phrase *\fo{' FOOBAR >BODY} would give the same +\ ** result as executing *\fo{FOOBAR}. + 8 + @ ; + +internal +: (docreate,) \ -- + nop.n, pushLR.n, DOCREATE scall, +; + +: (dobuild,) \ -- ; lay dummy cfa + nop.n, pushLR.n, 4 allot \ lay down m/c call for later patching +\ nop.n, pushLR.n, $F7FF:FFFF , \ lay down m/c call for later patching +; + +: namedBuild, \ val -- +\ +G Start a target defining word. + [ROM header, (dobuild,) swap , ROM] +; + +: (;CODE) \ -- ; R: a-addr -- +\ *G Performed at compile time by *\fo{;CODE} and *\fo{DOES>}. +\ ** Patch the last word defined (by *\fo{CREATE}) to have the +\ ** run time actions that follow immediately after *\fo{(;CODE)}. +\ ** INTERNAL. + r> -2 and latest name> 4 + !scall ; \ SFP004 + +variable immheader \ -- addr +external + +: Imm \ -- +\ *G Used before a definition to indicate that it is *\fo{IMMEDIATE}, +\ ** which means that it will execute whenever encountered regardless +\ ** of whether the system is compiling. + immheader on +; + +target-only +: : \ C: "<spaces>name" -- colon-sys ; Exec: i*x -- j*x ; R: -- nest-sys +\ *G Begin a new definition called *\fo{name}. + ?EXEC !CSP header, hide ] docolon, +; immediate +host&target + +target-only +: :NONAME \ C: -- colon-sys ; Exec: i*x -- i*x ; R: -- nest-sys +\ *G Begin a new code definition which does not have a name. After the +\ ** definition is complete the semi-colon operator returns the XT of +\ ** newly compiled code on the stack. + !csp \ compiler stack security + align here last ! 0 , \ lay null header to fool SMUDGE + here ] docolon, \ compiler on, lay entry code +; +host&target + +: DOES> \ C: colon-sys1 -- colon-sys2 ; Run: -- ; R: nest-sys -- +\ *G Begin definition of the runtime-action of a child of a defining word. +\ ** See the section about defining words in *\i{Programming Forth}. +\ ** You should not use *\fo{RECURSE} after *\fo{DOES>}. +cr ." DOES>" + ['] (;code) compile, +cr ." a" + saveTos, +cr ." b" + dataPtr@, +cr ." c" +; +IMMEDIATE + +: CREATE \ -- +\ *G Create a new definition in the dictionary. When the new +\ ** definition is executed it will return the address of the +\ ** definition's data area. As compilation is into Flash, +\ ** *\fo{CREATE} cannot be used with *\fo{DOES>} and +\ ** *\fo{ <BUILDS ... DOES> ...} must be used instead. + ROM? [ROM swap \ old flag + header, (docreate,) dataAddr, \ header, m/c call, address + ROM] +; + +: <BUILDS \ -- +\ *G Always used in the form: +\ *C : defword <BUILDS ... DOES> ... ; +\ *P When *\fo{defword} is executed a new definition is created +\ ** with the data defined between *\fo{<BUILDS} and *\fo{DOES>} +\ ** and the action defined between *\fo{DOES>} and *\fo{;}. +\ ** You must use *\fo{<BUILDS} and *\fo{DOES>} together, otherwise +\ ** there will be a crash. Treat *\fo{<BUILDS} as a special case +\ ** of *\fo{CREATE} for use with *\fo{DOES>} and compilation into +\ ** Flash. + ROM? [ROM swap \ old flag + header, (dobuild,) dataAddr, \ header, m/c call, address + ROM] +; + +: CONSTANT \ x "<spaces>name" -- ; Exec: -- x +\ *G Create a new *\fo{CONSTANT} called *\fo{name} which has the +\ ** value *\i{x}. When *\fo{NAME} is executed *\i{x} is returned. + namedBuild, ;CODE + sub .s psp, psp, # 4 \ save TOS + str tos, [ psp, # 0 ] + mov r0, link \ LINK is high register + sub .s r0, r0, # 1 \ remove T bit + ldr tos, [ r0, # 0 ] \ get data address (in-line) + pop { pc } +END-CODE + +: 2CONSTANT \ Comp: x1 x2 "<spaces>name" -- ; Run: -- x1 x2 +\ *G A two-cell equivalent of *\fo{CONSTANT}. + namedBuild, , ;CODE + sub .s psp, psp, # 8 \ save TOS + str tos, [ psp, # 4 ] + mov r0, link \ LINK is high register + sub .s r0, r0, # 1 \ remove T bit + ldr tos, [ r0, # 0 ] \ get data high + ldr r1, [ r0, # 4 ] \ get data low + str r1, [ psp, # 0 ] + pop { pc } \ exit +END-CODE + +: VARIABLE \ "<spaces>name" -- ; Exec: -- a-addr +\ *G Create a new variable called *\fo{name}. When *\fo{name} is +\ ** executed the address of the data-cell is returned for use +\ ** with *\fo{@} and *\fo{!} operators. +\ ** The RAM is not initialised. + rhere namedBuild, cell rallot ;CODE + sub .s psp, psp, # 4 \ save TOS + str tos, [ psp, # 0 ] + mov r0, link \ LINK is high register + sub .s r0, r0, # 1 \ remove T bit + ldr tos, [ r0, # 0 ] \ get address + pop { pc } +END-CODE + +(( +: 2VARIABLE \ Comp: "<spaces>name" -- ; Run: -- a-addr + \ *G A two-cell equivalent of *\fo{VARIABLE}. + \ ** The RAM is not initialised. + rhere namedBuild, 8 rallot ;CODE + sub .s psp, psp, # 4 \ save TOS + str tos, [ psp, # 0 ] + mov r0, link \ LINK is high register + sub .s r0, r0, # 1 \ remove T bit + ldr tos, [ r0, # 0 ] \ get address + pop { pc } +END-CODE +)) + +: BUFFER: \ n "<spaces>name" -- + \ *G Create a named buffer in RAM of *\i{n} bytes. + rhere constant rallot +; + +: USER \ u "<spaces>name" -- ; Exec: -- addr ; SFP009 +\ *G Create a new *\fo{USER} variable called *\fo{name}. The *\i{u} +\ ** parameter specifies the index into the user-area table at which +\ ** to place the* data. *\fo{USER} variables are located in a +\ ** separate area of memory for each task or interrupt. Use in +\ ** the form: +\ *C $400 USER TaskData + namedBuild, ;code \ ugly, but works + sub .s psp, psp, # 4 \ save TOS + str tos, [ psp, # 0 ] + mov r0, link \ LINK is high register + sub .s r0, r0, # 1 \ remove T bit + ldr tos, [ r0, # 0 ] \ get offset + add tos, tos, up \ add user pointer to user offset + pop { pc } +end-code + +interpreter +: u# \ "<name>"-- u +\ *G An *\fo{INTERPRETER} word that returns the index of the +\ ** *\fo{USER} variable whose name follows, e.g. +\ *C u# S0 + ' >body +; +target + +internal +: CRASH \ -- ; used as action of DEFER +\ *G The default action of a *\fo{DEFER}ed word, which is *\fo{NOOP}, +; +external + +: DEFER \ Comp: "<spaces>name" -- ; Run: i*x -- j*x +\ *G Creates a new *\fo{DEFER}ed word. No default action is +\ ** assigned. User-defined *\fo{DEFER}ed words *\b{must} be +\ ** initialised by the application before use. +\ *C ' <action> IS <deferredword> +\ *P or (when compiled) +\ *C ['] <action> IS <deferredword> + rhere namedBuild, cell rallot ;CODE + mov r0, link \ LINK is high register + sub .s r0, r0, # 1 \ remove T bit + ldr r0, [ r0, # 0 ] \ get data address + ldr r1, [ r0, # 0 ] \ get xt + mov .s r2, # 1 + orr .s r1, r1, r2 \ force T bit + pop { r3 } \ get return address + mov link, r3 + bx r1 +END-CODE + +(( +: FIELD \ size n "<spaces>name" -- size+n ; Exec: addr -- addr+n + \ *G Create a new field of *\i{n} bytes within a structure so far + \ ** of *\i{size} bytes. + over namedBuild, + ;CODE + mov r0, link \ LINK is high register + sub .s r0, r0, # 1 \ remove T bit + ldr r1 [ r0, # 0 ] \ get offset + add .s tos, tos, r1 \ add to base addr + pop { pc } +END-CODE +)) + +internal +variable OPERATORTYPE \ -- addr ; used at compile time for prefix operator + +: VAL-COMPILE/EXECUTE \ value xt[c] xt[e] -- + state @ if + drop compileAligned, , + else + nip execute + endif +; + +: bad-method \ -- ; error action + cr ." Invalid operator for this type" + #-13 throw +; + +CODE VAL! \ n -- ; store value address in-line +\ *G Store n at the inline address following this word. +\ ** INTERNAL. +\ N.B. The call to VAL! must be four-byte aligned + mov r1, link + sub .s r1, r1, # 1 \ inline address + ldr r0, [ r1 ] \ get data address (in-line) + add .s r1, r1, # 5 \ step over, restore T bit + mov link, r1 + str tos, [ r0 ] \ and write data from tos + ldmia psp ! { tos } \ restore TOS + next, +END-CODE + +CODE VAL@ \ -- n ; read value data address in-line +\ *G Read n from the inline address following this word. +\ ** INTERNAL. +\ N.B. The call to VAL@ must be four-byte aligned + sub .s psp, psp, # 4 + str tos, [ psp ] + mov r1, link + sub .s r1, r1, # 1 \ inline address + ldr r0, [ r1 ] \ get data address (in-line) + add .s r1, r1, # 5 \ step over, restore T bit + mov link, r1 + ldr tos, [ r0 ] \ read data into tos + next, +END-CODE + +\ VAL generates a literal, and so LIT is used instead. + +external + +: VALUE \ n -- ; -- n ; n VALUE <name> +\ *G Creates a variable of initial value n that returns its contents +\ ** when referenced. To store to a child of VALUE use "n to <child>". +\ ** Application programs must explicity re-initialise children of +\ ** *\fo{VALUE}. + Imm + >r rhere namedBuild, r> rhere ! cell rallot + does> + case operatortype @ operatortype off + 0 of ['] val@ ['] @ val-compile/execute endof + 1 of ['] val! ['] ! val-compile/execute endof +\ 2 of state @ if c_lit endif endof + bad-method + endcase +; + +: to \ -- +\ *G store operator for use with *\fo{VALUE}s. + 1 OPERATORTYPE ! +; immediate + + +\ ******************* +\ *S Multitasker hook +\ ******************* + +defer pause \ -- ; multitasker hook +\ *G Allows the sytem multitasker to get a look in. If the +\ ** multitasker has not been compiled, *\fo{PAUSE} is set +\ ** to *\fo{NOOP}. + assign noop to-do pause + + +\ ************************ +\ *S Structure compilation +\ ************************ +\ *P These words define high level branches. They are used by the structure +\ ** words such as *\fo{IF} and *\fo{AGAIN}. + +internal + +: >mark \ -- addr +\ *G Mark the start of a forward branch. HIGH LEVEL CONSTRUCTS ONLY. +\ ** INTERNAL. + here ( 0 , ) cell allot ; + +: >resolve \ addr -- +\ *G Resolve absolute target of forward branch. HIGH LEVEL CONSTRUCTS ONLY. +\ ** INTERNAL. + here 1 or swap !f ; \ absolute dest+bit0 + +: <mark \ -- addr +\ *G Mark the start (destination) of a backward branch. +\ ** HIGH LEVEL CONSTRUCTS ONLY. +\ ** INTERNAL. + here ; + +: <resolve \ addr -- +\ *G Resolve a backward branch to addr. +\ ** HIGH LEVEL CONSTRUCTS ONLY. +\ ** INTERNAL. + 1 or , ; \ absolute + bit0 for target + +synonym >c_res_branch >resolve \ addr -- ; fix up forward referenced branch +\ *G See >RESOLVE. +\ ** INTERNAL. +synonym c_mrk_branch< <mark \ -- addr ; mark destination of backward branch +\ *G See >MARK. +\ ** INTERNAL. + + +\ ********************** +\ *S Branch constructors +\ ********************** +\ *P Used when compiling code on the target. + +: c_branch< \ addr -- +\ *G Lay the code for an unconditional backward branch. +\ ** INTERNAL. + ['] branch compileAligned, <resolve ; + +: c_?branch< \ addr -- +\ *G Lay the code for a conditional backward branch. + ['] ?branch compileAligned, <resolve ; + +: c_branch> \ -- addr +\ *G Lay the code for a forward referenced unconditional branch. +\ ** INTERNAL. + ['] branch compileAligned, >mark ; + +: c_?branch> \ -- addr +\ *G Lay the code for a forward referenced conditional branch. +\ ** INTERNAL. + ['] ?branch compileAligned, >mark ; + + +\ ***************** +\ *S Main compilers +\ ***************** + +: c_lit \ lit -- +\ *G Compile the code for a literal of value *\i{lit}. +\ ** INTERNAL. + ['] lit compileAligned, , ; + +: c_drop \ -- +\ *G Compile the code for *\fo{DROP}. +\ ** INTERNAL. + postpone drop ; + +: c_exit \ -- +\ *G Compile the code for *\fo{EXIT}. +\ ** INTERNAL. + $BD00 w, ; \ pop { pc } + +: c_do \ C: -- do-sys ; Run: n1|u1 n2|u2 -- ; R: -- loop-sys +\ *G Compile the code for *\fo{DO}. +\ ** INTERNAL. + ['] (do) compileAligned, >mark <mark ; + +: c_?DO \ C: -- do-sys ; Run: n1|u1 n2|u2 -- ; R: -- | loop-sys +\ *G Compile the code for *\fo{?DO}. +\ ** INTERNAL. + ['] (?do) compileAligned, >mark <mark ; + +: c_LOOP \ C: do-sys -- ; Run: -- ; R: loop-sys1 -- | loop-sys2 +\ *G Compile the code for *\fo{LOOP}. +\ ** INTERNAL. + ['] (loop) compileAligned, <resolve >resolve ; + +: c_+LOOP \ C: do-sys -- ; Run: -- ; R: loop-sys1 -- | loop-sys2 +\ *G Compile the code for *\fo{+LOOP}. +\ ** INTERNAL. + ['] (+loop) compileAligned, <resolve >resolve ; + +variable NextCaseTarg \ -- addr +\ *G Holds the entry point of the current *\fo{CASE} structure. +\ ** INTERNAL. + +: c_case \ -- addr +\ *G Compile the code for *\fo{CASE}. +\ ** INTERNAL. + NextCaseTarg @ <mark NextCaseTarg ! ; + +: c_OF \ C: -- of-sys ; Run: x1 x2 -- | x1 +\ *G Compile the code for *\fo{OF}. +\ ** INTERNAL. + ['] (of) compileAligned, >mark ; + +: c_ENDOF \ C: case-sys1 of-sys -- case-sys2 ; Run: -- +\ *G Compile the code for *\fo{ENDOF}. +\ ** INTERNAL. + c_branch> swap >c_res_branch ; + +: FIX-EXITS \ n1..nn -- +\ *G Compile the code to resolve the forward branches at the end +\ ** of a *\fo{CASE} structure. +\ ** INTERNAL. + begin + sp@ csp @ <> + while + >c_res_branch + repeat +; + +: c_ENDCASE \ C: case-sys -- ; Run: x -- +\ *G Compile the code for *\fo{ENDCASE}. +\ ** INTERNAL. + c_drop fix-exits NextCaseTarg ! ; + +(( +: c_END-CASE \ C: case-sys -- ; Run: x -- + \ *G Compile the code for *\fo{END-CASE}. + \ ** INTERNAL. Only compiled if the equate *\fo{FullCase?} is non-zero. + fix-exits NextCaseTarg ! ; +)) + +: c_NEXTCASE \ C: case-sys -- ; Run: x -- +\ *G Compile the code for *\fo{NEXTCASE}. +\ ** INTERNAL. + c_drop NextCaseTarg @ c_branch< fix-exits NextCaseTarg ! ; + +: c_?OF \ C: -- of-sys ; Run: flag -- +\ *G Compile the code for *\fo{?OF}. +\ ** INTERNAL. + c_?branch> ; + +external + + +\ **************** +\ *S Miscellaneous +\ **************** + +code di \ -- +\ *G Disable interrupts. + cps .id .i + next, +end-code + +code ei \ -- +\ *G Enable interrupts. + cps .ie .i + next, +end-code + +code [I \ R: -- x1 x2 +\ *G Preserve interrupt/exception status on the return stack, +\ ** and disable interrupts/exceptions except reset, NMI and +\ ** HardFault. The state is restored by *\fo{I]}. + mrs r0, PRIMASK \ get status + cps .id .i + push .n { r0 } + next, +end-code + +code I] \ R: x1 x2 -- +\ *G Restore interrupt status saved by *\fo{[I} from the return +\ ** stack. + pop .n { r0 } + msr PRIMASK r0 + next, +end-code + +: setMask \ value mask addr -- ; cell operation +\ *G Clear the *\i{mask} bits at *\i{addr} and set (or) the +\ ** bits defined by *\i{value}. + tuck @ \ -- value addr mask x + swap invert and \ -- value addr x' + rot or \ -- addr x'' + swap ! +; + +: init-io \ addr -- +\ *G Copy the contents of the I/O set up table to an I/O device. +\ ** Each element of the table is of the form addr (cell) followed +\ ** by data (cell). The table is terminated by an address of 0. + begin + dup @ + while + dup 2@ ! 2 cells + + repeat + drop +; + + +\ ****** +\ *> ### +\ ****** + +decimal diff --git a/mwmouse/sources/FaultCortex.fth b/mwmouse/sources/FaultCortex.fth @@ -0,0 +1,543 @@ +\ FaultCortex.fth - Exception fault handling + +(( +Copyright (c) 2010, 2011 +MicroProcessor Engineering +133 Hill Lane +Southampton SO15 5AF +England + +tel: +44 (0)23 8063 1441 +fax: +44 (0)23 8033 9691 +email: mpe@mpeforth.com + tech-support@mpeforth.com +web: http://www.mpeforth.com +Skype: mpe_sfp + +From North America, our telephone and fax numbers are: + 011 44 23 8063 1441 + 011 44 23 8033 9691 + 901 313 4312 (North American access number to UK office) + + +To do +===== + +Change history +============== +20110628 SFP001 Extended for Cortex-M0/M1. +)) + +only forth definitions +decimal + +\ ============== +\ *! faultcortex +\ *T Exception Fault handling +\ ============== +\ *P The code in *\i{Cortex/FaultCortex.fth} provides debugging +\ ** facilities for when a fault occurs that triggers an exception. + + +\ ************************** +\ *S Fault handler framework +\ ************************** + +struct /AppFrame \ -- len +\ *G Structure defining what is saved on the application's +\ ** stack. + int exa.r0 + int exa.r1 + int exa.r2 + int exa.r3 + int exa.r12 + int exa.r14 + int exa.PC + int exa.PSR +end-struct + +struct /MainFrame \ -- len + int exm.r4 + int exm.r5 + int exm.r6 + int exm.r7 + int exm.r8 + int exm.r9 + int exm.r10 + int exm.r11 + int exm.ExcRet \ LR after entry +end-struct + +struct /ExData \ -- len +\ *G A structure holding data saved on entry to the exception +\ ** routine + int exd.R13flt \ Faulting stack on entry + int exd.R13main \ main stack on entry + int exd.R13process \ process stack on entry + int exd.R13state \ main stack after state save + int exd.LRmain \ LR of main stack on entry +end-struct + +/ExData reserve constant ExData \ -- addr +\ *G Holds additional data about the fault. + +Not-M0/M1? [if] +PROC FltEntry \ -- +\ *G This is the template code for Cortex-M3+ fault handlers. +\ ** R0..R3 have already been saved by the hardware +\ --- save fault data --- + mvl r3, # ExData \ point to save buffer + mrs r0, SP_main \ save stack pointers + str r0, [ r3, # 0 exd.R13main ] + mrs r1, SP_process + str r1, [ r3, # 0 exd.R13process ] + str lr, [ r3, # 0 exd.LRmain ] \ save LR + tst lr, # bit2 + ite .eq + str r0, [ r3, # 0 exd.R13flt ] \ faulting stack is SP_main + str r1, [ r3, # 0 exd.R13flt ] \ faulting stack is SP_process +\ --- save state --- must match /MainFrame structure above + push { r4-r11, r14 } \ registers not saved by core + link + str r13, [ r3, # 0 exd.R13state ] + sub rsp, rsp, # up-size sp-size + \ make space for USER area and data stack + +\ --- set up Forth --- + add up, rsp, # sp-size \ USER area at top + sub psp, up, # sp-guard cells \ generate new PSP + sub r4, psp, # tos-cached? cells \ generate new S0 + str r4, [ up, # s0-offset ] \ that is compatible with SP! + str rsp, [ up, # r0-offset ] \ set R0 +\ --- call high level handler --- +l: FltCall + bl ' noop \ call the high level handler +\ --- restore state --- + add rsp, rsp, # up-size sp-size + \ remove space for USER area and data stack + pop { r4-r11, pc } \ restore and exit +end-code +chere FltEntry - equ /FltEntry \ size of template +FltCall FltEntry - equ /FltCall \ offset to call instruction +[else] +PROC FltEntry \ -- +\ *G This is the template code for Cortex-M0/M1 fault handlers. +\ ** R0..R3 have already been saved by the hardware +\ --- save fault data --- + ldr r3, ^ExData \ point to save buffer + mrs r0, SP_main \ save stack pointers + str r0, [ r3, # 0 exd.R13main ] + mrs r1, SP_process + str r1, [ r3, # 0 exd.R13process ] + mov r2, lr + str r2, [ r3, # 0 exd.LRmain ] \ save LR + mov .s r0, # bit2 + tst r2, r0 + eq, if, + ldr r0, [ r3, # 0 exd.R13main ] \ faulting stack is SP_main + else, + ldr r0, [ r3, # 0 exd.R13Process ] \ faulting stack is SP_process + endif, + str r0, [ r3, # 0 exd.R13flt ] \ faulting stack pointer +\ --- save state --- must match /MainFrame structure above + mov r0, r8 + mov r1, r9 + mov r2, r10 + mov r3, r11 + push { r0-r3, r14 } \ R8-R11 not saved by core + link + push { r4-r7 } \ R4-R7 + + ldr r3, ^ExData \ point to save buffer + mov r0, r13 + str r0, [ r3, # 0 exd.R13state ] + sub rsp, rsp, # up-size sp-size + \ make space for USER area and data stack + +\ --- set up Forth --- + mov r0, rsp + add .s r0, r0, # sp-size \ USER area at top + mov up, r0 + mov psp, r0 + sub .s psp, psp, # sp-guard cells \ generate new PSP + sub .s r4, psp, # tos-cached? cells \ generate new S0 + str r4, [ r0, # s0-offset ] \ that is compatible with SP! + mov r1, rsp + str r1, [ r0, # r0-offset ] \ set R0 +\ --- call high level handler --- +l: FltCall + bl ' noop \ call the high level handler +\ --- restore state --- + add rsp, rsp, # up-size sp-size + \ remove space for USER area and data stack + pop { r4-r7 } \ original R4-R7 + pop { r0-r3 } \ original R8-11 + mov r8, r0 + mov r9, r1 + mov r10, r2 + mov r11, r3 + pop { pc } \ exit +end-code +align l: ^ExData + ExData , +chere FltEntry - equ /FltEntry \ size of template +FltCall FltEntry - equ /FltCall \ offset to call instruction +[then] + +interpreter +: FLT: \ xt vec# -- ; -- isr +\ *G Creates a fault handler that runs the given Forth word. +\ ** At run time the entry point of the ISR is returned. Use in +\ ** the form: +\ *C ' <action> <vec#> FLT: <actionISR> +\ *P The example below will define a handler for the HardFault +\ ** exception that runs the Forth word *\fo{HFhandler}. +\ *C ' HFhandler 3 FLT: HFentry + swap align chere /FltEntry callot \ -- vec# xt isr ; reserve space + FltEntry over /FltEntry move \ copy template + tuck /FltCall + !call \ -- vec# isr ; form call instruction + tuck swap setExcVec + label \ returns entry point +; +target + +: .item \ addr -- addr+4 +\ *G Display a cell item at addr and increment addr. + dup @ .dword space cell + ; +: .items \ addr n -- addr+4n +\ *G Display n items at addr and increment addr. + 0 ?do .item loop ; + +: AppItems \ -- addr +\ *G The address of fault data saved on the application's stack. + ExData exd.R13flt @ ; +: MainItems \ -- addr +\ *G The address of fault data saved on SP_main. + ExData exd.R13state @ ; +: AppRSP \ -- addr +\ *G The Forth return stack pointer at the fault. + AppItems 8 cells + ; +Cortex-M0/M1? [if] +: AppPSP \ -- addr +\ *G The Forth data stack pointer at the fault for Cortex-M3+. + MainItems exm.R6 @ ; +[else] +: AppPSP \ -- addr +\ *G The Forth data stack pointer at the fault for Cortex-M3+. + AppItems exa.R12 @ ; +[then] +: AppUP \ -- addr +\ *G The Forth UP at the fault. + MainItems exm.R11 @ ; +: AppTOS \ -- x +\ *G The Forth TOS at the fault. + MainItems exm.R7 @ ; +: AppPC \ -- x +\ *G The PC at the fault. + AppItems exa.PC @ ; + +: .FltFrame \ -- +\ *G Display the CPU state pointed to by the data frame. + AppItems \ from the faulting stack + cr ." === Registers ===" + cr ." PSR = " dup exa.PSR @ .dword \ PSR + cr ." R0 = " dup exa.R0 4 .items \ R0..R3 + drop + MainItems exm.R4 \ from SP_main + cr ." R4 = " 4 .items \ R4..R7 + cr ." R8 = " 4 .items \ R8..R11 + drop + AppItems \ from the faulting stack + cr ." R12 = " dup exa.r12 .item drop \ R12 + dup 8 cells + .dword space \ R13 before fault + exa.R14 2 .items drop \ R14 R15 +; + +[undefined] ip>nfa [if] +: name? \ addr -- flag +\ *G Check to see if the supplied address is a valid NFA. +\ ** This word is implementation dependent. +\ ** A valid NFA for MPE embedded systems satisfies the following: +\ *( +\ *B All characters within string are printable ASCII within range 33..126. +\ *B String Length is non-zero in range 1..31 and bit 7 is set, ignore bits 6, 5. +\ *) + dup aligned over <> + if drop FALSE exit endif + count \ c-addr u -- + dup $9F and $81 $A0 within 0= \ NFA first byte = 1SIxxxxx, count = xxxxx + \ mask = 10011111 + if 2drop 0 exit then + $01F and bounds ?do + i c@ #33 #127 within 0= \ check all ascii chars + if unloop FALSE exit then + loop + TRUE +; + +: ip>nfa \ addr -- nfa +\ *G Attempt to move backwards from an address within a definition +\ ** to the relevant NFA. + 2- \ NFA must be at least 'n' bytes backwards + begin + dup name? 0= + while + 1- + repeat +; +[then] + +: check-aligned \ addr -- addr' +\ *G Check addr for cell alignment, report and correct if +\ ** misaligned. + dup aligned over <> + if ." (Misaligned) " aligned then +; + +: ?Clip32 \ xsp xspTop -- xsp xspTop' +\ *G Clip the stack display to 32 items. + 2dup swap - #32 cells u> if + drop dup #32 cells + + cr ." Clipped to 32 items" + endif +; + +[defined] Umbilical? [if] +' (do) equ start-of-code +[else] +' and equ start-of-code +[then] +prog sec-end equ end-of-code + +: .rsFault \ -- +\ *G Display the return stack of the fault, assuming +\ ** the Forth RSP=R13 and RUP=R11. + cr AppRSP \ -- rsp + cr ." RSP = " dup .dword space check-aligned + AppUP r0-offset + @ \ -- rsp rsTop + ." R0 = " dup .dword space check-aligned +\ Note that for negative steps, +LOOP processes the limit value. + cell - \ rsTop is not used + cr ." --- Return stack high ---" + ?Clip32 ?do + cr i .dword space i @ dup .dword space + dup start-of-code end-of-code within + if ip>nfa .name else drop endif + cell negate +loop + cr ." --- Return stack low --- " +; + +: .psFault \ -- +\ *G Display the data stack indicated by the frame, assuming +\ ** the Forth RSP=AppPSP and RUP=R11. + cr AppPSP \ -- psp + cr ." PSP = " dup .dword space check-aligned + AppUP s0-offset + @ \ -- psp psTop + ." S0 = " dup .dword space check-aligned +\ Because of the stack caching S0 is a cell LOWER than PSP +\ for an empty stack. + 2dup cell + u> + if 2drop cr ." Data stack underflowed" exit endif + 2dup cell + = + if 2drop cr ." Data stack empty" exit endif + 2dup swap - SP-SIZE u> + if 2drop cr ." Data stack overflowed" exit endif + cr ." --- Data stack high ---" \ -- psp psTop/S0 + 2dup <> if + cell - ?Clip32 do \ for -ve steps +LOOP runs the limit value + cr i .dword space i @ .dword + cell negate + +loop + else + 2drop + endif + cr ." --- Data stack low --- " + cr ." rTOS/R7 " AppTOS .dword +; + + +\ ************************* +\ *S Default Fault handlers +\ ************************* +\ *P The interrupt structure of the Cortex-M3 is such that the +\ ** simplest way to display exception information without large +\ ** code and RAM overheads is to use polled operation of the +\ ** comms link without interrupts. By default, the fault handler +\ ** only transmits, it does not use *\fo{KEY}. If your serial +\ ** driver normally uses interrupt-driven transmit routines, you +\ ** must provide the word *\fo{+FaultConsole} which switches it +\ ** into polled operation. An example can be found in +\ ** *\i{Cortex/Drivers/serLPC17xxqi.fth}. + +\ *P By default, there is no return from a fault handler, the +\ ** system is reset using *\fo{REBOOT}. From experience, +\ ** attempting to restart the system by executing the boot +\ ** vector is not enough. Rebooting by triggering the watchdog +\ ** always works. + +: showFault \ -- +\ *G Generic fault handler. + console setConsole +FaultConsole \ use fault mode console + decimal + cr + cr ." Exception " IPSR sys@ . ." at " AppPC .dword + .FltFrame .rsFault .psFault + cr ." Restarting system ..." +[defined] reboot [if] reboot [else] ExcVecs 4 + @ execute [then] + 0 +; + +' showFault 2 FLT: NMIisr +' showFault 3 FLT: HFisr +Cortex-M0/M1? 0= [if] +' showFault 4 FLT: MFisr +' showFault 5 FLT: BFisr +' showFault 6 FLT: UFisr +' showFault #12 FLT: DFisr + +: EnableFaults \ -- +\ Enable the fault handlers. + $0007:0000 _SCS scsSHCSR + ! ; +' EnableFaults AtCold +[then] + + +\ ***************************** +\ *S Intepreting the crash dump +\ ***************************** +\ *P The example below comes from typing +\ *C 55 0 ! +\ *P on the Forth console. The device is an NXP LPC2388 and address +\ ** zero is Flash to which writes have not been permitted. There +\ ** are only minor differences between the ARM example here and the +\ ** fault display for Cortex-M devices. + +\ *E 55 0 ! +\ ** DAbort exception at PC = 0000:1C64 +\ ** === Registers === +\ ** CPSR = 6000:001F +\ ** R0 = 0000:0037 0000:1C60 0000:0021 0000:0021 +\ ** R4 = 0000:0070 0005:FD8C 4000:0298 0000:000C +\ ** R8 = 0000:1C60 0000:0000 0000:0000 4000:FEE0 +\ ** R12 = 4000:FED4 4000:FDCC 0000:4FAC 0000:1C6C +\ ** +\ ** RSP = 4000:FDCC R0 = 4000:FDE0 +\ ** --- Return stack high --- +\ ** 4000:FDDC 0000:51E0 QUIT +\ ** 4000:FDD8 4000:FED0 +\ ** 4000:FDD4 0000:0000 +\ ** 4000:FDD0 4000:FD94 +\ ** 4000:FDCC 0000:3244 CATCH +\ ** --- Return stack low --- +\ ** +\ ** PSP = 4000:FED4 S0 = 4000:FED4 +\ ** --- Data stack high --- +\ ** --- Data stack low --- +\ ** rTOS/R10 0000:0000 +\ ** Restarting system ... + +\ *P The exception occurred in the instruction at $1C64. It was +\ ** a data abort exception, which means that it was a data +\ ** load or store at an invalid address. + +\ *P Assuming that restart is to a Forth console, you can find +\ ** out where the fault occurred if you have compiled the file +\ ** *\i{Common\DebugTools.fth} or *\i{Powernet\DebugTools.fth}. +\ *C $1C64 ip>nfa .name<Enter> ! ok + +\ *P The return stack dump shows that *\fo{CATCH} was used, in turn +\ ** called by *\fo{QUIT}, the text interpreter. + +\ *P Further interpretation requires some knowledge of the use of +\ ** the CPU registers. + +\ ***************** +\ *N Register usage +\ ***************** +\ --------- +\ *H Cortex +\ --------- +\ *P For Cortex-M the following register usage is the default: +\ *E r15 pc program counter +\ ** r14 link link register; bit0=1=Thumb, usually set +\ ** r13 rsp return stack pointer +\ ** r12 psp data stack pointer +\ ** r11 up user area pointer +\ ** r10 -- +\ ** r9 lp locals pointer +\ ** r8 -- +\ ** r7 tos cached top of stack +\ ** r0-r6 scratch +\ *P The VFX optimiser reserves R0 and R1 for internal operations. +\ ** *\fo{CODE} definitions must use R10 as TOS with NOS pointed to by +\ ** R12 as a full descending stack in ARM terminology. R0..R8 are +\ ** free for use by *\fo{CODE} definitions and need not be preserved or +\ ** restored. You should assume that any register can be affected +\ ** by other words. +\ --------- +\ *H ARM32 +\ --------- +\ *P On the ARM the following register usage is the default: +\ *E r15 pc program counter +\ ** r14 link link register +\ ** r13 rsp return stack pointer +\ ** r12 psp data stack pointer +\ ** r11 up user area pointer +\ ** r10 tos cached top of stack +\ ** r9 lp locals pointer +\ ** r0-r8 scratch +\ *P The VFX optimiser reserves R0 and R1 for internal operations. +\ ** *\fo{CODE} definitions must use R10 as TOS with NOS pointed to by +\ ** R12 as a full descending stack in ARM terminology. R0..R8 are +\ ** free for use by *\fo{CODE} definitions and need not be preserved or +\ ** restored. You should assume that any register can be affected +\ ** by other words. + +\ ============================= +\ *N Interpreting the registers +\ ============================= +\ *P Using the ARM example above, we can learn more. +\ *E DAbort exception at PC = 0000:1C64 +\ ** === Registers === +\ ** CPSR = 6000:001F +\ ** R0 = 0000:0037 0000:1C60 0000:0021 0000:0021 +\ ** R4 = 0000:0070 0005:FD8C 4000:0298 0000:000C +\ ** R8 = 0000:1C60 0000:0000 0000:0000 4000:FEE0 +\ ** R12 = 4000:FED4 4000:FDCC 0000:4FAC 0000:1C6C + +\ *P The exception occurred in the instruction at $1C64. It was +\ ** a data abort exception, which means that it was a data +\ ** load or store at an invalid address. + +\ *E TOS = R10 = 0000:0000 +\ ** UP = R11 = 4000:FEE0 +\ ** PSP = R12 = 4000:FED4 +\ ** RSP = R13 = 4000:FDCC + +\ *P In general, UP > PSP > RSP. In this case that's good. TOS=0, +\ ** which we would expect from the phrase: +\ *C 55 0 ! + +\ *P We now switch back to the cross compiler, which you did leave +\ ** running, didn't you? Since we now know that $1C64 is in *\fo{!}, +\ ** we can disassemble it. +\ *E dis ! +\ ** ! +\ ** ( 0000:1C60 0100BCE8 ..<h ) ldmia r12 ! { r0 } +\ ** ( 0000:1C64 00008AE5 ...e ) str r0, [ r10, # $00 ] +\ ** ( 0000:1C68 0004BCE8 ..<h ) ldmia r12 ! { r10 } +\ ** ( 0000:1C6C 0EF0A0E1 .p a ) mov PC, LR +\ ** 16 bytes, 4 instructions. +\ ** ok + +\ *P From this, we can see that the offending instruction is +\ *C ( 0000:1C64 00008AE5 ...e ) str r0, [ r10, # $00 ] +\ *P Since R10 is 0, we now know that it was attempting a +\ ** write to 0, which is not permitted. + +\ *P Provided that you keep words small, the register contents +\ ** at the crash point, with the stack contents and the disassembly +\ ** often provide enough information to reconstruct the state of +\ ** stack on entry to the word. + + +\ ====== +\ *> ### +\ ====== + + +decimal diff --git a/mwmouse/sources/FlashSTM32.fth b/mwmouse/sources/FlashSTM32.fth @@ -0,0 +1,172 @@ +\ FlashSTM32.fth - + +(( +Copyright (c) 2014 +MicroProcessor Engineering +133 Hill Lane +Southampton SO15 5AF +England + +tel: +44 (0)23 8063 1441 +fax: +44 (0)23 8033 9691 +email: mpe@mpeforth.com + tech-support@mpeforth.com +web: http://www.mpeforth.com +Skype: mpe_sfp + +From North America, our telephone and fax numbers are: + 011 44 23 8063 1441 + 011 44 23 8033 9691 + 901 313 4312 (North American access number to UK office) + + +To do +===== + +Change history +============== +)) + +\ ************************* +\ *! flashstm32 +\ *T STM32 Flash operations +\ ************************* +\ *P Although some of these routines are not the most efficient +\ ** for the STM32 series, they are designed to be easily expanded +\ ** for future STM32 parts with as yet unknown sector sizes. + +internal + +(( +FlashBase constant FlashBase +_FPEC constant _FPEC + +: .FPEC \ -- + _FPEC $24 pdump ; +)) + +: ?Unlock \ -- +\ +G Unlock the Flash if protected. + _FPEC flCR + @ bit7 and if + _FPEC flKEY1 over flKEYR + ! \ write keys + flKEY2 over flKEYR + ! + bit7 swap flCR + bic! \ clear LOCK bit + endif +; + +: waitFlNB \ -- status +\ +G Wait until the Flash is not busy and return the status. +\ +* The top bit is set if the operation timed out. + $0010:0000 _FPEC begin \ -- cnt fpec + swap 1- swap over \ check timeout counter + while + dup flSR + @ bit0 and 0= + until then + dup flSR + @ \ -- cnt fpec status ; get status + dup $0034 and rot flSR + ! \ -- cnt status ; clear h/w status + swap 0= + if $8000:0000 or endif +; + +: flw! \ w addr -- status +\ +G Write a 16 bit word to flash. A status value of $20 indicates +\ +* success. + ?Unlock + bit0 _FPEC flCR + or! \ set PG bit in control reg + w! \ write data + waitFlNB \ wait for completion/timeout + bit0 _FPEC flCR + bic! \ clear PG bit in control reg +; + +: flPageErase \ addr -- status +\ +G Erase the page containing addr. A status value of $20 +\ +* indicates success. + FlashBase - \ relative to start of Flash + ?Unlock _FPEC + bit1 over flCR + or! \ set PER bit in control reg + swap over flAR + ! \ set address + bit6 swap flCR + or! \ set STRT bit in control reg + waitFlNB \ wait for completion/timeout + bit1 _FPEC flCR + bic! \ clear PER bit in control reg +; + +: (w!f) \ w addr -- +\ +G 16 bit Flash write primitive. + flw! drop +; + +: (c!f) \ b addr -- +\ +G 8 bit Flash write primitive. + 2dup c@ = if 2drop exit endif + dup -2 and swap 1 and if \ addr bit 0 = 1 (high byte + swap 8 lshift over c@ or \ -- addr' b<<8+b0 + else + swap over 1+ c@ 8 lshift or \ -- addr' b1+b + then + swap (w!f) +; + +: (!f) \ x addr -- + over $FFFF and over (w!f) + swap 16 rshift swap 2+ (w!f) +; + +: inFlash? \ addr -- flag +\ +G Returns true if the address is in the Flash area. + FLASHSTART FLASHEND within \ Flash range +; + +external + +: c!f \ b addr -- +\ *G Program any address, including Flash, with an 8 bit value. +\ ** After programming one half of a 16 bit unit with anything +\ ** other than $FF, you cannot program the other half. + dup InFlash? + if (c!f) else c! endif +; + +: w!f \ w addr -- +\ *G Program any address, including Flash, with a 16 bit value. + dup InFlash? + if (w!f) else w! endif +; + +: !f \ x addr -- +\ *G Program any address, including Flash, with a 32 bit value. + dup InFlash? + if (!f) else ! endif +; + +: FlErase \ addr len -- +\ *G Erase the Flash sectors in the given range. + bounds ?do + i inFlash? if + i flPageErase drop /FlashPage + else + -1 i ! 4 + endif + +loop +; + +internal +: >Flash \ src dest len -- +\ +G Save a memory block to Flash. The address *\i{src}must be +\ +* even. The address *\i{dest} must be the start address of +\ +* empty (erased) Flash. The kernel CRC is added at the end. + 2dup FlErase + 2dup + crcslot @ swap !f \ save kernel checksum + bounds ?do + dup @ i !f cell + + cell +loop + drop +; +external + +\ ====== +\ *> ### +\ ====== + +decimal + + diff --git a/mwmouse/sources/IntCortex.fth b/mwmouse/sources/IntCortex.fth @@ -0,0 +1,306 @@ +\ Cortex exception (interrupt) handlers + +(( +Copyright (c) 2010, 2011 +MicroProcessor Engineering +133 Hill Lane +Southampton SO15 5AF +England + +tel: +44 (0)23 8063 1441 +fax: +44 (0)23 8033 9691 +net: mpe@mpeforth.com + tech-support@mpeforth.com +web: www.mpeforth.com + +From North America, our telephone and fax numbers are: + 011 44 23 8063 1441 + 011 44 23 8033 9691 + + +To do +===== + +Change history +============== +20110627 SFP001 Cortex M0/M1 changes. +)) + +only forth definitions decimal + +\ ============ +\ *! intcortex +\ *T Exception and Interrupt handlers +\ ============ +\ *P The file *\i{Cortex\IntCortex.fth} contains generic interrupt +\ ** handlers for Cortex-M0/M1/M3/M4 processors. +\ ** *\i{IntCortex.fth} requires *\i{Cortex\CortexDef} to be compiled +\ ** before the *\i{SFRxxxx} file for your particular CPU. The file +\ ** *\i{Cortex/StackDef.fth} provides default main task and stack +\ ** layouts and should be compiled from the control file or copied +\ ** into your control file. Default stack initialisation code is +\ ** provided in *\i{Cortex/StackDef.fth}. + +\ *P The high-level interrupt handlers all share a common "stack +\ ** of stacks". On entry to the interrupt handler, Forth system +\ ** registers are allocated. Your initialisation code *\b{must} +\ ** set up R13. This is normally provided by the MPE wrapper code +\ ** for each exception. + +\ *P In order to support exception nesting the equate *\fo{#IRQs} in the +\ ** control file must be set to the maximum number of nestings +\ ** required. +\ ** The equate *\fo{#IRQs} is used to calculate the size of the +\ ** required exception stack, together with the equate *\fo{#SVCs}. +\ ** in the control file. + +\ *P Each interrupt has its own *\fo{USER} area. No user variables +\ ** are initialised except for *\fo{S0} and *\fo{R0} in SVC +\ ** handlers. + +\ *P It is assumed that the banked stack pointers have +\ ** already been set up by the hardware initialisation code. + +\ *P It is implicit throughout the code that the three +\ ** system registers UP, PSP, RSP are always set so that: +\ *C UP > PSP > RSP +\ *P Because of this layout, data stack underflows may corrupt +\ ** the first part of the *\fo{USER} area. You have been warned. +\ ** During testing, it may be as well to set the equate +\ ** *\fo{SP-GUARD} to 2 or 3 in your control file to leave a few +\ ** guard cells on the data stack. + + +\ ************************************ +\ *S Cortex-M3 NVIC Exception handlers +\ ************************************ +\ *P This section is not a treatise on the Nested Vectored +\ ** Interrupt Controller. These words provide a fairly basic +\ ** set of tools for using the NVIC, which is fully +\ ** documented in the Cortex-M3 Technical Reference Manual +\ ** (ARM DDI 0337)from *\i{www.arm.com}. + +\ *P This code requires *\i{Kernel62.fth} and the equate +\ ** *\fo{COLDCHAIN?} must be set non-zero in the control file. +\ ** The NVIC address and register offsets are defined in the +\ ** file *\i{Cortex/CortexDef.fth}. + +\ *P The MPE code works in terms of vector numbers, which are +\ ** 16 greater than the external interrupt numbers. + +Not-M0/M1? [if] +PROC ExcEntry \ -- +\ *G This is the template code for M3+ vectored exception handlers. +\ --- CPU has saved ---- +\ xPSR PC LR R12 R3 R2 R1 R0 +\ --- save state --- + push { r4-r11, r14 } \ registers not saved by core + link + sub rsp, rsp, # up-size sp-size + \ make space for USER area and data stack + +\ --- set up Forth --- + add up, rsp, # sp-size \ USER area at top + sub psp, up, # sp-guard cells \ generate new PSP + sub r4, psp, # tos-cached? cells \ generate new S0 + str r4, [ up, # s0-offset ] \ that is compatible with SP! + str rsp, [ up, # r0-offset ] \ set R0 +\ --- call high level handler --- +l: ExcCall + bl ' noop \ call the high level handler +\ --- restore state --- + add rsp, rsp, # up-size sp-size + \ remove space for USER area and data stack + pop { r4-r11, pc } \ restore and exit +end-code +chere ExcEntry - equ /ExcEntry \ size of template +ExcCall ExcEntry - equ /ExcCall \ offset to call instruction +[else] +sp-size 3 and [if] cr ." bad SP-SIZE" abort [then] +sp-size 2 rshift equ sp-cells +up-size 3 and [if] cr ." bad UP-SIZE" abort [then] +up-size 2 rshift equ up-cells + +SP-SIZE #256 u< 0= UP-SIZE #256 u< 0= or equ LargeISR? \ -- flag +\ *G The interrupt is often larger than 256 bytes, which requires +\ ** larger ISR entry code. + +LargeISR? [if] +PROC ExcEntry \ -- +\ *G This is the template code for M0/M1 vectored exception handlers +\ ** with a large ISR frame. +\ --- CPU has saved ---- +\ xPSR PC LR R12 R3 R2 R1 R0 +\ --- save state --- + push { r4-r7, r14 } \ registers not saved by core + link + mov r0, r8 + mov r1, r9 + mov r2, r10 + mov r3, r11 + push { r0-r3 } + +\ --- set up Forth --- +\ calculate the offsets + mov .s r0, # up-cells \ R0 = UP-SIZE + lsl .s r0, r0, # 2 + mov .s r2, # sp-cells \ R2 = SP-SIZE + lsl .s r2, r2, # 2 + add .s r3, r0, r2 \ R3 = SP-SIZE + UP-SIZE +\ set new RSP + mov r1, rsp + sub .s r1, r3 + mov rsp, r1 \ RSP = RSP - SP-SIZE - UP-SIZE + push { r3 } \ how much we dropped the stack by +\ set new UP + add .s r1, r1, r2 \ UP = RSP + SP-SIZE + mov up, r1 \ will need R1 later +\ set new PSP + mov psp, r1 \ generate new PSP + sub .s psp, # sp-guard cells +\ set new S0 and R0 user vars + sub .s r4, psp, # tos-cached? cells \ generate new S0 + str r4, [ r1, # s0-offset ] \ that is compatible with SP! + mov r0, rsp + str r0, [ r1, # r0-offset ] \ set R0 +\ --- call high level handler --- +l: ExcCall + bl ' noop \ call the high level handler +\ --- restore state --- +\ restore RSP + pop { r3 } \ amount by which stack was dropped + mov r1, rsp + add .s r1, r3 + mov rsp, r1 +\ restore regs + pop { r0-r3 } + mov r8, r0 + mov r9, r1 + mov r10, r2 + mov r11, r3 + pop { r4-r7, pc } \ restore and exit +end-code +chere ExcEntry - equ /ExcEntry \ size of template +ExcCall ExcEntry - equ /ExcCall \ offset to call instruction +[else] +PROC ExcEntry \ -- +\ *G This is the template code for M0/M1 vectored exception handlers +\ ** with a small ISR frame. +\ --- CPU has saved ---- +\ xPSR PC LR R12 R3 R2 R1 R0 +\ --- save state --- + push { r4-r7, r14 } \ registers not saved by core + link + mov r0, r8 + mov r1, r9 + mov r2, r10 + mov r3, r11 + push { r0-r3 } + +\ --- set up Forth --- +\ set new UP + mov r1, rsp + sub .s r1, # UP-SIZE + mov up, r1 \ will need R1 later +\ set new RSP + mov .s r2, r1 + sub .s r2, # SP-SIZE + mov rsp, r2 \ RSP = RSP - SP-SIZE - UP-SIZE +\ set new PSP + mov psp, r1 \ generate new PSP = UP - abit + sub .s psp, # sp-guard cells +\ set new S0 and R0 user vars + sub .s r4, psp, # tos-cached? cells \ generate new S0 + str r4, [ r1, # s0-offset ] \ that is compatible with SP! + mov r0, rsp + str r0, [ r1, # r0-offset ] \ set R0 +\ --- call high level handler --- +l: ExcCall + bl ' noop \ call the high level handler +\ --- restore state --- +\ restore RSP + mov r1, rsp + add .s r1, # SP-SIZE + add .s r1, # UP-SIZE + mov rsp, r1 +\ restore regs + pop { r0-r3 } + mov r8, r0 + mov r9, r1 + mov r10, r2 + mov r11, r3 + pop { r4-r7, pc } \ restore and exit +end-code +chere ExcEntry - equ /ExcEntry \ size of template +ExcCall ExcEntry - equ /ExcCall \ offset to call instruction +[then] \ LargeISR? + +[then] \ Not-M0/M1? + +interpreter +: EXC: \ xt vec# -- ; -- isr +\ *G Creates an exception handler that runs the given Forth word. +\ ** At run time the entry point of the ISR is returned. Use in +\ ** the form: +\ *C ' <action> <vec#> EXC: <actionISR> +\ *P The example below will define a handler for the SysTick +\ ** interrupt/exception that runs the Forth word *\fo{SysTickHandler}. +\ *C ' SysTickHandler #15 EXC: SysTickEntry + swap align chere /ExcEntry callot \ -- vec# xt isr ; reserve space + ExcEntry over /ExcEntry move \ copy template + tuck /ExcCall + !call \ -- vec# isr ; form call instruction + tuck swap setExcVec + label \ returns entry point +; +target + +: int>bit \ int# -- mask offset +\ Convert an interrupt number into its bit mask and ofset +\ into an array of 32 bit registers. + dup $1F and 1 swap lshift + swap 5 rshift 2 lshift +; + +: EnInt \ vec# -- +\ *G Enable the requested NVIC interrupt source. +\ ** NVIC interrupts have vector numbers in the range 16..255. + dup #15 u> if + #16 - int>bit _SCS + nvSetEnR0 + ! + exit + endif + drop +; + +: DisInt \ vec# -- +\ *G Disable the requested NVIC interrupt source. +\ ** NVIC interrupts have vector numbers in the range 16..255. + dup #15 u> if + #16 - int>bit _SCS + nvClrEnR0 + ! + exit + endif + drop +; + +: SetPri \ pri vec# +\ *G Set the priority of the given NVIC interrupt source. +\ ** NVIC interrupts have vector numbers in the range 16..255. +\ ** The priority numbers are in the range 0..255, where 0 is +\ ** the highest priority. The number of bits actually used +\ ** is implementation dependent, but unused bits are always +\ ** the low-order bits. Hence, using $10, $20 and so on is +\ ** fairly portable. + dup #15 u> if + 16 - _SCS + nvPR0 + c! exit + endif + drop +; + +: SWINT \ vec# -- +\ *G Generate interrupt from software. + dup #15 u> if + #16 - int>bit _SCS + nvSetPendR0 + ! + exit + endif + drop +; + + +\ ====== +\ *> ### +\ ====== + diff --git a/mwmouse/sources/LIBRARY.fth b/mwmouse/sources/LIBRARY.fth @@ -0,0 +1,329 @@ +\ A library of useful words for Forth6 cross-compiled targets + +(( +Copyright (c) 1988-2004 +MicroProcessor Engineering +133 Hill Lane +Southampton SO15 5AF +England + +tel: +44 (0)2380 631441 +fax: +44 (0)2380 339691 +net: mpe@mpeforth.com + tech-support@mpeforth.com +web: www.mpeforth.com + + +To do +===== +DocGen everything + + +Change history +============== +20040216 MPE006 Added words from LIB.FTH and deleted LIB.FTH. + Added SETCONSOLE. +20011113 SFP005 Added INIT-IO +20000112 SFP004 Added S.DEC and SN.DEC +19981023 MSD003 Removed the LIBRARIES and END-LIBS invocations as + they should have been placed outside this source. + (Not flagged as they were just deletions.) +19981023 MSD002 Added .HEX as a synonym for U.HEX. +19981023 MSD001 Remove the use of S>D in the *hex* display wordset. + In this case, we do *not* want the top bit to be + rippled across the most significant cell since + what we are displaying is *hex*. +)) + + +\ ******************** +\ *S Memory mapped I/O +\ ******************** + +[required] init-io [if] +: init-io \ addr -- +\ *G Copy the contents of an I/O set up table to an I/O device. +\ ** Each element of the table is of the form addr (cell) followed +\ ** by data (cell). The table is terminated by an address of 0. +\ ** A table of a single 0 address performs no action. Note +\ ** that this word is for memory-mapped I/O only. + begin + dup @ + while + dup 2@ ! 2 cells + + repeat + drop +; +[then] + + +\ ************** +\ *S Generic I/O +\ ************** + +[required] ConsoleIO [if] +: ConsoleIO \ -- +\ *G Use the default console defined by CONSOLE as the +\ ** current terminal device. + console SetConsole +; +[then] + +[required] SetConsole [if] +: SetConsole \ device -- +\ *G Sets KEY and EMIT and frieds to use the given device +\ ** for terminal I/O. + dup ipvec ! opvec ! +; +[then] + + +\ ********** +\ *S Strings +\ ********** + +[required] bounds [if] +: BOUNDS \ addr len -- addr+len addr +\ *G Modify the address and length parameters to provide an end-address +\ ** and start-address pair suitable for a DO ... LOOP construct. + over + swap +; +[then] + +[required] Erase [if] +: Erase \ addr n -- +\ *G Fill U bytes of memory from A-ADDR with 0. + 0 Fill ; +[then] + +[required] 2@ [if] +: 2@ \ addr -- x1 x2 +\ *G Fetch and return the two CELLS from memory ADDR and ADDR+sizeof(CELL). +\ ** The cell at the lower address is on the top of the stack. + dup cell+ @ swap @ +; +[then] + +[required] 2! [if] +: 2! \ x1 x2 addr -- ; store into DATA memory +\ *G Store the two CELLS x1 and x2 at memory ADDR. +\ ** X2 is stored at ADDR and X1 is stored at ADDR+CELL. + swap over ! cell+ ! +; +[then] + + +\ ****************** +\ *S Numeric display +\ ****************** + +[required] hold +[required] sign or +[required] # or +[required] #s or +[required] <# or +[required] #> or +[if] + + $80 equ holdsize + $80 equ padsize + + holdsize buffer: holdarea + padsize buffer: pad + + variable hld + + : HOLD \ char -- + -1 hld +! hld @ c! + ; + + : SIGN \ n -- + 0< if [char] - hold then + ; + + : # \ ud1 -- ud2 + base @ mu/mod rot 9 over < + if 7 + then + [char] 0 + hold + ; + + : #S \ ud1 -- ud2 + begin # 2dup or 0= until + ; + + : <# \ -- + pad hld ! + ; + + : #> \ xd -- c-addr u + 2drop hld @ pad over - + ; + +[then] + +\ A set of words to display a cell's value, saving and restoring BASE +\ during the period that it is doing so. + +[required] .hex \ MSD002 +[required] u.hex or \ MSD002 +[required] uN.hex or +[required] u2.hex or +[required] u4.hex or +[required] u6.hex or +[required] u8.hex or +[required] $u.hex or +[required] $uN.hex or +[required] $u2.hex or +[required] $u4.hex or +[required] $u6.hex or +[required] $u8.hex or +[if] + + : u.hex \ value -- ; Variable width. + base @ swap hex + 0 <# #S #> type \ MSD001 + base ! + ; + + : uN.hex \ value width -- ; User-specified width. + base @ -rot hex + swap 0 \ MSD001 + <# rot 0 ?do # loop #> type + base ! + ; + + : .hex u.hex ; ( value -- ) \ MSD002 + : u2.hex 2 uN.hex ; ( value -- ) + : u4.hex 4 uN.hex ; ( value -- ) + : u6.hex 6 uN.hex ; ( value -- ) + : u8.hex 8 uN.hex ; ( value -- ) + + : $u.hex ." $" u.hex ; ( value -- ) + : $uN.hex ." $" uN.hex ; ( value width -- ) + : $u2.hex ." $" u2.hex ; ( value -- ) + : $u4.hex ." $" u4.hex ; ( value -- ) + : $u6.hex ." $" u6.hex ; ( value -- ) + : $u8.hex ." $" u8.hex ; ( value -- ) + +[then] + +[required] u.dec +[required] uN.dec or +[required] s.dec or +[required] sN.dec or +[required] u2.dec or +[required] u4.dec or +[required] u6.dec or +[required] u8.dec or +[if] + + : u.dec \ value -- ; Variable width. + base @ swap decimal + 0 <# #S #> type + base ! + ; + + : uN.dec \ value width -- ; User-specified width. + base @ -rot decimal + swap 0 + <# rot 0 ?do # loop #> type + base ! + ; + + : u2.dec 2 uN.dec ; ( value -- ) + : u4.dec 4 uN.dec ; ( value -- ) + : u6.dec 6 uN.dec ; ( value -- ) + : u8.dec 8 uN.dec ; ( value -- ) + + : s.dec \ value -- ; Variable width. + base @ swap decimal + s>d tuck dabs <# #S rot sign #> type + base ! + ; + + : sN.dec \ value width -- ; User-specified width. + >r + base @ swap decimal + s>d tuck dabs + <# r> 0 ?do # loop rot sign #> type + base ! + ; + +[then] + +[required] u.both [if] + : u.both \ value -- + dup u.dec ." =" $u.hex ; +[then] + +[required] .ascii [if] +: .ascii \ char -- ; + dup bl < + over [char] ~ > or + if drop [char] . endif + emit +; +[then] + + +\ ****************** +\ *S Debugging tools +\ ****************** + +[required] ? [if] : ? @ . ; [then] +[required] hex [if] : hex #16 base ! ; [then] +[required] decimal [if] : decimal #10 base ! ; [then] +[required] octal [if] : octal #8 base ! ; [then] +[required] binary [if] : binary #2 base ! ; [then] +[required] bl [if] $20 constant bl [then] +[required] space [if] : space bl emit ; [then] +[required] s>d [if] : dup 0< if -1 else 0 then ; [then] +[required] depth [if] : depth s0 @ sp@ - cell- cell/ ; [then] +[required] cell- [if] : cell- cell - ; [then] +[required] cell+ [if] : cell+ cell + ; [then] +[required] cells [if] : cells cell * ; [then] +[required] led-init [if] : led-init ; [then] +[required] led-on [if] : led-on ; [then] +[required] led-off [if] : led-off ; [then] +[required] . [if] : . s.dec space ; [then] +[required] abort [if] : abort begin cr .cpu cr again ; [then] +[required] true [if] -1 constant true [then] +[required] false [if] 0 constant false [then] + +[required] .shex [if] + : .shex ( -- ) + [char] [ emit space + depth + dup 0> + if + 0 do + [char] $ emit + depth i - 1- pick u.hex + space + loop + else + drop + then + [char] ] emit + ; +[then] + +[required] dump [if] + : dump ( addr u -- ) + bounds + do + cr i u8.hex space + i $04 + i $00 + do i c@ space u2.hex loop + space + i $08 + i $04 + do i c@ space u2.hex loop + space + i $0c + i $08 + do i c@ space u2.hex loop + space + i $10 + i $0c + do i c@ space u2.hex loop + space + i $10 + $00 i + do i c@ .ascii loop + $10 +loop + cr + ; +[then] + diff --git a/mwmouse/sources/LITESTM32F072SA.hex b/mwmouse/sources/LITESTM32F072SA.hex @@ -0,0 +1,1831 @@ +:020000040800F2 +:10000000200C00208D0100083147000891470008AE +:10001000090100080B0100080000000000000000BA +:100020000000000000000000000000000F010008B8 +:10003000110100080000000013010008B953000876 +:1000400000000000000000000000000000000000B0 +:1000500000000000000000000000000000000000A0 +:100060000000000000000000000000000000000090 +:100070000000000000000000000000000000000080 +:100080000000000000000000000000000000000070 +:100090000000000000000000000000000000000060 +:1000A0000000000000000000000000000000000050 +:1000B0000000000000000000000000000000000040 +:1000C0000000000000000000000000000000000030 +:1000D0000000000000000000000000000000000020 +:1000E0000000000000000000000000000000000010 +:1000F0000000000000000000000000000000000000 +:10010000883B0008FEE7FEE7FEE7FEE7FEE7FEE7C6 +:10011000FEE7FEE7FEE72020174D01202968014396 +:100120002960361F37602F4600B500BF3D680220AA +:100130000540FBD01120114908601148786000206B +:10014000F862104839680143396000BF3D680E48C5 +:100150000540FBD03D1D0C3E032131600221716042 +:10016000B7602F4601F000FC7D680C200540082D8B +:10017000FAD180CE00BD01BC001002400020024038 +:1001800000801004000000010000000200B500BF64 +:10019000104D85F30888104D85F30988022585F3F5 +:1001A0001488BFF36F8F0D4E0D4DAB460D490E48B1 +:1001B0000D6805430D600D490D480D6885430D60C0 +:1001C000FFF7AAFF0B48056801200543A847DFE7B2 +:1001D00000BD0000200C0020200E0020040F002095 +:1001E000100F00201410024014007E00281002405E +:1001F00000007E0000010008040F0020200E0020F7 +:1002000000000000000000000000000000000000EE +:100210000A0000000000000000C0000800C0000844 +:10022000B8100020481000209715A06D00000000B5 +:10023000C3414E4431680F40361D70470000000036 +:10024000C24F522031680F43361D70470000000036 +:10025000C3584F5231684F40361D704700000000B0 +:10026000C6494E5645525420FF43704700000000D7 +:10027000C2303D20002F01D0002701E001277F423E +:100280007047000000000000C3303C3E002F01D149 +:10029000002701E001277F4270470000700200083C +:1002A000C2303E20002F01DC002701E001277F4201 +:1002B00070470000A0020008C2303C20002F01D48B +:1002C000002701E001277F42704700000000000086 +:1002D000C13D20203068874201D0002701E001277E +:1002E0007F42361D70470000D0020008C23C3E200D +:1002F0003068874201D1002701E001277F42361D87 +:100300007047000000000000C13C20203068874298 +:1003100001DC002701E001277F42361D7047000005 +:1003200060020008C13E20203068874201DB0027C0 +:1003300001E001277F42361D70470000EC020008F3 +:10034000C23C3D203068874201DA002701E00127E6 +:100350007F42361D7047000000000000C23E3D2075 +:100360003068874201DD002701E001277F42361D0A +:100370007047000000000000C2553E2030688742F0 +:1003800001D3002701E001277F42361D704700009E +:1003900078030008C2553C203068874201D8002706 +:1003A00001E001277F42361D7047000094030008DA +:1003B000C344303C002F01D4002701E001277F42D5 +:1003C000361D7047B0030008C344303D31680F4309 +:1003D000002F01D0002701E001277F42361D704722 +:1003E00000000000C2443D2007CE3B1C0027801ABD +:1003F0008B41384300D1FF43704700005C03000885 +:10040000C34D494E01CE874200DD074670470000CC +:1004100000040008C34D415801CE874200DA074668 +:100420007047000008030008C657495448494E2049 +:1004300030683F1A716830680D1AAF4201D8002742 +:1004400001E001277F42083670470000B80200082B +:10045000C64C534849465420384680CE87407047A2 +:1004600000000000C652534849465420384680CE0A +:10047000C740704764040008C74152534849465476 +:10048000384680CE0741704700000000C7455845F8 +:10049000435554450120384380CE00470121704622 +:1004A0008843026810470000391C80CEF6D07046A1 +:1004B000001D004701CEB84201D180CEF7E70746C4 +:1004C000ECE700000099491C0091E7D703B0EEE784 +:1004D0000099C919009180CEE0D703B0E7E700008A +:1004E00002CE0124E40773465B1E1A680919781AC4 +:1004F00007B480CEDBE7000002CEB942F1D180CE56 +:10050000CCE7000040020008C54C4541564520207C +:1005100002B000BD00000000C63F4C4541564520DA +:100520003F1C80CE00D1704702B000BD000000002B +:10053000C1492020361F3760009F01983F1870473F +:1005400050020008C14A2020361F3760039F0498DC +:100550003F18704744050008C6554E4C4F4F502079 +:1005600003B07047E4030008C3533E44FD17361F31 +:1005700037602F467047000024030008C24D2B202F +:1005800003CEFA17C91950410746361F316070472C +:1005900088020008C2312B207F1C70479405000898 +:1005A000C2312D207F1E70478C040008C12B2020F3 +:1005B0003068361D3F18704740030008C12D2020C9 +:1005C0003068361DC71B704730020008C64E4547CD +:1005D000415445207F42704768050008C2442B20E3 +:1005E00007CE80184F41361F30607047DC05000889 +:1005F000C2442D2007CE101AB9410F46361F306075 +:100600007047000058050008C7444E45474154450F +:10061000306800214042B9410F4630607047000009 +:10062000F0050008C73F4E45474154453F1C80CE6A +:1006300000D57F4270470000CC050008C3414253FB +:10064000002F00D57F42704778040008C44441421F +:10065000532020203F1CDBD470470000C803000853 +:10066000C344322A306800187F4130607047000070 +:1006700060060008C344322F306840107F10894163 +:10068000C90708433060704708060008C12A2020C7 +:1006900031684F43361D70474C060008C3554D2A3C +:1006A0003846316840B40A04120C0B0C0404240CC4 +:1006B000050C164666431F466F4318466043010CFF +:1006C000000436184F4128465043010C00043618E8 +:1006D0004F41354640BC3560704700007C0500083E +:1006E000C24D2A2035687D4000B520B4002F00D5CA +:1006F0007F423568002D00D56D423560FFF7D0FF91 +:1007000020BC002D01D5FFF783FF00BD8C0600083B +:10071000C6554D2F4D4F442001CE31682024002274 +:100720004918404113465341C01B5B4101D0491C4D +:1007300000E0C019641EF3D10F463060704700001E +:1007400000000000C6534D2F52454D2000B53068C3 +:1007500001B480B480CEFFF77DFF009D002D00D551 +:100760006D42361F37602F46FFF7D6FF20BC009C36 +:100770006C40002C00D57F4220BC002DEFF30080A0 +:1007800001B430683760074601BC80F3008800D5AB +:100790007F4230683760074600BD0000A0050008B2 +:1007A000C42F4D4F4420202000B580B43168CF17AE +:1007B00020BC361F37602F46FFF7C8FF00BD000082 +:1007C00014040008C12F202000B580B43168CF1771 +:1007D00020BC361F37602F46FFF7B8FF361D00BD1F +:1007E000C4070008C34D4F4400B5FFF7DDFF80CEBE +:1007F00000BD0000A0070008C64D552F4D4F4420F6 +:1008000000B580B4009F361F00213160FFF784FFE0 +:1008100020BC80B42F46FFF77FFF20BC361F376017 +:100820002F4600BDAC050008C6464D2F4D4F442055 +:1008300000B580B435687D40002D01D4002501E06D +:1008400001256D4220B4FFF781FF20BC31680D40C7 +:1008500005D07F1E20BC30682D18356000E001B047 +:1008600000BD000074060008C2552F20361F00216D +:10087000316000B5FFF750FF361D00BDE0060008EF +:10088000C24D2F2000B5FFF761FF361D00BD0000EF +:1008900080080008C52A2F4D4F44202000B580B4A1 +:1008A00080CEFFF71FFF20BC361F37602F46FFF7B3 +:1008B0004DFF00BD28080008C22A2F2000B5FFF711 +:1008C000EDFF361D00BD000008050008C34E49506D +:1008D000361D70479C060008C45455434B20202009 +:1008E000361F716831607760704700003C06000871 +:1008F000C45049434B202020BF00F75970470000E7 +:1009000024060008C4524F4C4C202020B800002878 +:1009100001DC80CE70473758011F72583250081CD6 +:10092000FAD1361D7047000018050008C3524F5415 +:100930003D4677683168716035607047CC080008C3 +:10094000C42D524F542020203D46376871683160D5 +:1009500075607047E4070008C23E522080B480CE24 +:1009600070470000F0080008C2523E20361F376072 +:1009700080BC704768090008C2524020361F3760AB +:10098000009F70472C090008C3323E5203CE01B4C9 +:1009900080B40F1C7047000088090008C332523E23 +:1009A00003BC083E31607760074670479C09000829 +:1009B000C332524000980199083E31607760074683 +:1009C0007047000068080008C45357415020202099 +:1009D0003068376007467047C8090008C34455505F +:1009E000361F376070470000F8070008C44F5645AF +:1009F00052202020361F376077687047D8080008DB +:100A0000C444524F5020202080CE70470409000873 +:100A1000C432445550202020083EB16831607760D0 +:100A200070470000DC090008C5324F5645522020AF +:100A3000083E316931607760F7687047280A00081E +:100A4000C53244524F502020776808367047000066 +:100A5000400A0008C5325357415020207068776023 +:100A60000746B0683168B16030607047EC09000833 +:100A7000C43F445550202020002F01D0361F37603E +:100A800070470000100A0008C3535040361F3760FB +:100A900037467047880A0008C35350213E4680CE2F +:100AA00070470000B0090008C3525040361F37603D +:100AB0006F467047A80A0008C3525021BD4680CE39 +:100AC0007047000044070008C544455054482020A2 +:100AD00000B501F0ADFA3F68361F37603746316820 +:100AE000CF1B3F1FBF10361D00BD0000000A0008CD +:100AF000C5434F554E5420207D1C3F78361F35602E +:100B000070470000980A0008C72F535452494E47B7 +:100B10003168CD1B70683F1877602F46361D7047CF +:100B2000540A0008C4534B495020202003CE401CD7 +:100B3000401E04D00A78BA4201D1491CF8E7361F9A +:100B40003160074670470000240B0008C45343413E +:100B50004E20202003CE401C401E04D00A78BA420A +:100B600001D0491CF8E7361F316007467047000086 +:100B7000B80A0008C2533D2003CE3F1C07D00278BC +:100B80000B78401C491C9A4201D17F1EF7D102D13B +:100B900001277F4200E00027704700003005000871 +:100BA000C7434F4D504152457168CD1B00B520B42D +:100BB00071688F4200DB0F1C31687160361D00BF09 +:100BC000002F23D075682D78346824782C1B002CD6 +:100BD000EFF3008001B4361F71683160B168716055 +:100BE000B760274601BC80F3008804D001B080B410 +:100BF0000027361D09E037687F1C75686D1CB068DA +:100C0000441E7760B5602746361DD9E780BC002FAB +:100C1000EFF3008001B4083601BC80F3008807D0F0 +:100C2000002F01D4002701E001277F420120074364 +:100C300000BD202000B5B16802B4716802B431680B +:100C400002B480B480B0484601B4E946F768103673 +:100C50004D462D694C46E4684B465B68E31A5B1CC5 +:100C60005B19083E336077602F4600BFFFF744FCF6 +:100C7000DF0C0008009D019805442D784C46A468BF +:100C80002478AC4226D1009D019805444C46A468C6 +:100C90004B465B680C3E34607560B7601F46FFF7DB +:100CA0006BFF002F80CE15D0009D019805444C4667 +:100CB000E468009B019803444A4612699A1AA21AF2 +:100CC00003B00C3E32607560B7600B4F01BC8146CB +:100CD00004B000BD0098401C0090CBD703B04D4637 +:100CE0002D694C46E4680C3E34607560B76000279F +:100CF00001BC814604B000BDFFFFFFFFC80A000829 +:100D0000C6534541524348207068874200B502DD12 +:100D10000027361D00BD002F02DC064F361D00BD2A +:100D20007068002802DC0027361D00BDFFF782FF37 +:100D300000BD0000FFFFFFFFF00A0008C5434D4F54 +:100D4000564520203B1C83CE00D17047021C0A432D +:100D50001A430324144006D10A680260091D001DCD +:100D60001B1FF9D170470A780270491C401C5B1E9A +:100D7000F9D17047000D0008C6434D4F56453E203F +:100D80003B1C83CE00D17047C018C918021C0A430F +:100D90001A430324144006D1091F001F0A68026089 +:100DA0001B1FF9D17047491E401E0A7802705B1E56 +:100DB000F9D1704740090008C44D4F564520202006 +:100DC00000B580B4316870680F1A009DBD4280CEB6 +:100DD00006D920BC361F37602F46FFF7D1FF05E04C +:100DE00020BC361F37602F46FFF7ACFF00BD000068 +:100DF0003C0D0008C3555043612F00B503DB7A2F2B +:100E000001DCDF20074000BDA00B0008C555505095 +:100E10004552202030683F1830683760074600B5DB +:100E2000FFF76AFB4F0E0008009D019805442D78DE +:100E3000361F37602F46FFF7DFFF009D01980544FE +:100E40002F7080CE0098401C0090EDD703B000BDFD +:100E5000740B0008C5504C414345202000B5306854 +:100E600001B480B47F1C306837600746FFF7A8FFE5 +:100E700020BC10BC2C7000BD0C0E0008C446494CB0 +:100E80004C2020203A1C83CE002803D00A70491C35 +:100E9000401EFBD1704700007C0E0008C545524142 +:100EA00053452020361F3760002700B5FFF7EAFFC3 +:100EB00000BD0000B80D0008C14020203F68704709 +:100EC000780D0008C25740203F887047540E000834 +:100ED000C24340203F78704750040008C1212020C1 +:100EE000306838607768083670470000C40E000824 +:100EF000C257212030683880776808367047000074 +:100F0000D00E0008C2432120306838707768083658 +:100F100070470000B80E0008C24F4E20012040422A +:100F2000386080CE70470000DC0E0008C34F464694 +:100F30000020386080CE704728040008C4494E4322 +:100F4000522020203868401C386080CE7047000056 +:100F5000F40D0008C4444543522020203868401E48 +:100F6000386080CE704700003C0F0008C22B212063 +:100F700030683968091839607768083670470000AA +:100F800078090008C232402003CF361F074631607F +:100F900070470000840F0008C23221203A1C83CE23 +:100FA00003C270472C0F0008C44E4F4F5020202022 +:100FB00070470000700A0008C54E414D453E202094 +:100FC000361F376000B500F0E5FF1F20074030688E +:100FD0003F183F1D03218F43361D00BDB80F000889 +:100FE000C53E4E414D45202001218F4300B500BF35 +:100FF0003F1F361F376000F0E1FF8020074080CEA2 +:10100000F6D000BD00B500BF00F0D8FF002F2BD0F8 +:101010003D781F2005403068854223D17D1C0C3E61 +:10102000316931607560B760F768FFF7A5FD002F83 +:1010300080CE17D07760361DFFF7C2FF35682D7858 +:1010400040200540EFF3008001B4361D01BC80F361 +:10105000008803D0361F3760054F02E0361F376027 +:10106000012700BD3F1FCFE70027083600BD000065 +:10107000FFFFFFFFA80F0008CF5345415243482D03 +:10108000574F52444C495354002F00B501D10836F4 +:101090000CE075682D7830682D183C68641E2C4073 +:1010A000641CA400E4192746FFF7ACFF00BD000054 +:1010B000F00E0008C54449474954202001CE30387D +:1010C0000BD40A2802DBC01F0A2806DBB84204DA68 +:1010D00001277F42361F30607047002770470000AD +:1010E000540F0008C543454C4C2B20203F1D704732 +:1010F000E4100008C543454C4C532020BF00704706 +:10110000F4100008C543454C4C2D20203F1F70476C +:101110004C0B0008C443454C4C202020361F376040 +:10112000042770473D0C361F37602F4600B501F08D +:10113000A7F901F0A5F900BD31680D0C083E356036 +:10114000776000B500F04EFFBF1C00F04BFF00BD04 +:101150003D882D04BF1C361F356000B500F024FF0C +:1011600031680F43361D00BD30680740002F01D0A5 +:10117000002701E001277F423068002801D40025C4 +:1011800001E001256D427D402F46361D704720202D +:101190003F1D3168CF1B7F10154D3D40FC0A15489F +:1011A000044024042C43083E37607460B760124F3B +:1011B00000B5FFF7D9FF1148074031680F43361FCC +:1011C000B168316077600E4FFFF7CEFF0D480740E2 +:1011D00031680F437068002801D4002501E0012523 +:1011E0006D42094805403D432F46083600BD0000CA +:1011F000FF070000FF0300000000200000200000A7 +:1012000000004000000800000000000400B5FFF7E7 +:10121000BFFF0148074300BD00D000F0361F376014 +:10122000024F00B501F02CF900BD000000B5000030 +:10123000361F3760024F00B501F022F900BD0000F3 +:1012400000BF0000361F71683160776000B5FFF79E +:10125000DDFF306837600746FFF76EFF00BD2020D6 +:10126000361F3760044F00B501F00AF9361F3760AA +:10127000024F01F005F900BD361F00003760000085 +:10128000361F3760074F00B501F0FAF8361F376098 +:10129000054F01F0F5F8361F3760044F01F0F0F804 +:1012A00000BD000070460000401E000007680000FE +:1012B00000B501F033F8FFF7A9FFFFF733FF00BDDA +:1012C00000B501F02BF80220074080CE01D0FFF7D7 +:1012D000AFFFFFF7EDFF00BD00B5FFF79FFF00BDBB +:1012E000361F37607046401E0768401D00470000EB +:1012F000361F3760009F7F1E3978C919091D0322E8 +:101300009143491C0091704704110008C7414C49A2 +:10131000474E4544FF1C03218F437047361F3760FB +:101320007046401E076800BD10070008C8434F4DB7 +:1013300050494C452C20202000B5FFF7B9FF00BDD7 +:10134000E00F0008C53E424F4459202001218F4341 +:10135000BF68704700B5FFF76BFFFFF75FFF361FF1 +:101360003760024FFFF7A4FF00BD00001C13000808 +:1013700000B501F03DF801F02DF9FFF7EBFF306803 +:101380003760074601F06CF801F03EF800BD202000 +:1013900000B520BC01218D43361F37602F4601F078 +:1013A0008BF8FFF70DFE3F1DFFF74CFF00F0BAFD75 +:1013B00000BD000000B500BF00F0BEF80010002026 +:1013C000B8080008C3494D4D024901204042086059 +:1013D00070470000001000202C130008813A2020E4 +:1013E00000B501F0A1FE01F06BFE01F0F3F801F091 +:1013F0006BF802F08FF8FFF76FFF00BD180F0008C1 +:10140000C73A4E4F4E414D4500B501F059FE00F030 +:1014100061FD01F017F800F081FF00F0E9FE30688F +:1014200038600027361D01F01BF800F077FF02F04E +:1014300071F8FFF751FF00BDB410000885444F4517 +:10144000533E2020361F3760044F00B5FFF774FF6E +:10145000FFF706FFFFF714FF00BD00009013000820 +:101460003C140008C64352454154452000B500F0E5 +:10147000D1FF00F0BDFF30683760074601F0AAF8E1 +:10148000FFF768FF01F008F900F0BEFF00BD0000A3 +:1014900044130008C73C4255494C445300B5FFF77C +:1014A000E5FF00BDDC130008C8434F4E5354414EC6 +:1014B0005420202000B5FFF75BFFFFF769FF361FC0 +:1014C00037607046401E076800BD00000C1300081E +:1014D000C345515500B5FFF7EDFF00BDA814000846 +:1014E000C932434F4E5354414E54202000B5FFF7AC +:1014F0003FFF00F0B5FFFFF74BFF083E77607046F7 +:10150000401E07684168316000BD0000BC0500084E +:10151000C85641524941424C4520202000B500F0B8 +:1015200045FF00F027FFFFF723FF361F3760042732 +:1015300000F02EFFFFF72CFF361F37607046401E6D +:10154000076800BD64140008C74255464645523A34 +:1015500000B500F02BFF00F00DFFFFF7ABFF00F030 +:1015600017FF00BD48150008C455534552202020E0 +:1015700000B5FFF7FDFEFFF70BFF361F3760704623 +:10158000401E07685F4400BD7047000068150008F2 +:10159000C54445464552202000B500F007FF00F045 +:1015A000E9FEFFF7E5FE361F3760042700F0F0FE86 +:1015B000FFF7EEFE7046401E0068016801221143ED +:1015C00008BC9E460847000000B500BFFFF7B4FF07 +:1015D0000410002000B500F0F9FD3F68002F80CE18 +:1015E00005D080CEFFF76CFE00F03AFF05E03D46E7 +:1015F0007768083601200543A84700BD00B500F014 +:1016000053FE01F085F81E496E76616C6964206FA7 +:1016100070657261746F7220666F7220746869738E +:101620002074797065000000361F3760014F01F0AB +:101630009DF800BDF3FFFFFF7146491E0868491D74 +:101640008E46076080CE7047361F37607146491E50 +:101650000868491D8E46076870470000E0140008BE +:10166000C556414C5545202000B5FFF7ADFE80B46E +:1016700080CE00F09BFE00F07DFEFFF779FE20BCDF +:10168000361F37602F4600F075FE3068386004273B +:10169000361D00F07DFEFFF77BFE361F376070467B +:1016A000401E076811480568104900200860002D99 +:1016B000EFF3008001B4361F37602F4601BC80F382 +:1016C000008806D1361F0A4F0A493160FFF782FFB2 +:1016D0000BE0012F06D1361F074F08493160FFF795 +:1016E00079FF02E0FFF78AFF80CE00BD04100020E2 +:1016F000BC0E000848160008E00E00083816000866 +:10170000080B000882544F200120014908607047EF +:101710000410002000B500F001FE361F37600427DA +:1017200000F018FE00BD202000B500F0F7FD0120FC +:10173000074330683760074600F05EFC00BD20209C +:1017400000B500F0EBFD00BD0120074300B500F03F +:1017500087FE00BD361F3760034F00B5FFF7B0FDB1 +:10176000FFF7F2FF00BD00009C040008361F376041 +:10177000034F00B5FFF7A4FDFFF7E6FF00BD000033 +:10178000A8040008361F3760034F00B5FFF798FD27 +:10179000FFF7C0FF00BD00009C040008361F376043 +:1017A000034F00B5FFF78CFDFFF7B4FF00BD00004D +:1017B000A8040008361F3760034F00B5FFF780FD0F +:1017C00000F04EFE00BD0000E0120008361F37603A +:1017D000024F00B5FFF7B0FD00BD0000080A000889 +:1017E000361F3760024F00B500F04AFE00BD000012 +:1017F00000BD0000361F3760044F00B5FFF760FDE5 +:10180000FFF788FFFFF79CFF00BD0000E004000821 +:10181000361F3760044F00B5FFF752FDFFF77AFF20 +:10182000FFF78EFF00BD0000F8040008361F376088 +:10183000044F00B5FFF744FDFFF786FFFFF774FF85 +:1018400000BD0000C4040008361F3760044F00B517 +:10185000FFF736FDFFF778FFFFF766FF00BD0000DA +:10186000D004000800B500BFFFF766FE0810002096 +:1018700005480568361F37602F4600B5FFF760FF43 +:1018800001490F6080CE00BD08100020361F376070 +:10189000034F00B5FFF714FDFFF73CFF00BD00004C +:1018A000B404000800B5FFF76DFF306837600746E5 +:1018B000FFF73AFF00BD202000B500BF361F37609C +:1018C000374600F073FC3F6830688742EFF30080D2 +:1018D00001B47768083601BC80F3008802D0FFF7B6 +:1018E00023FFEBE700BD202000B5FFF76FFFFFF7F8 +:1018F000E3FF02490F6080CE00BD00000810002009 +:1019000000B5FFF74BFF00BD040F0008C55041555F +:101910005345202000B500BFFFF74CFE0C100020FF +:1019200004170008C244492072B670471411000819 +:10193000C245492062B670476C0F0008C25B49205F +:10194000EFF3108072B601B4704700006016000813 +:10195000C2495D2001BC80F3108870479C0E0008CE +:10196000C75345544D41534B3D683068C4432C40E8 +:10197000706804433C60B7680C367047580900082B +:10198000C7494E49542D494F00B500BF3D68002D51 +:1019900004D03D687C682C600837F7E780CE00BD36 +:1019A00090150008CA4F4646543252454C323520F5 +:1019B000BD0E0120054000B520B40F4D3D406D0027 +:1019C0003C0C0E48044024032C43FD0A0120054032 +:1019D000009B6B40012043409B0523437F0B01206C +:1019E0000740009D7D4001204540ED051D4380BC22 +:1019F0003F067F422F4300BDFF070000FF030000AA +:101A0000980F0008C63E424445535420361F3760A5 +:101A100000B5FFF79DFBFFF7CBFF30683F183F1D78 +:101A2000361D00BD24190008C4424F522120202039 +:101A3000306839780143397077680836704700009C +:101A400030190008C54242494321202030683978C6 +:101A500081433970776808367047000060190008C4 +:101A6000C842544F47474C452120202030683978E0 +:101A7000414039707768083670470000281A00081E +:101A8000C4425453542020203F7831680F40361D03 +:101A90007047000078100008C34F52213068396841 +:101AA000014339607768083670470000801A0008E3 +:101AB000C44249432120202030683968814339607D +:101AC000776808367047000050190008C7544F4720 +:101AD000474C45213068396841403960776808369D +:101AE00070470000441A0008C35453543F683168DB +:101AF0000F40361D70470000E81A0008C4435345E4 +:101B000054202020306839780143397077680836CE +:101B100070470000FC1A0008C443434C52202020A8 +:101B2000306839788143397077680836704700002B +:101B3000601A0008C743544F47474C45306839780E +:101B4000414039707768083670470000181B00085C +:101B5000C4434745542020203F7831680F40002F70 +:101B600001D1002701E001277F42361D7047202068 +:101B7000074805688020054000B508D0054D064897 +:101B8000686006486860802029698143296100BD3A +:101B9000102002400020024023016745AB89EFCDB1 +:101BA000083E134931607760124F00B53068451E1A +:101BB000002DEFF3008001B4356001BC80F3008894 +:101BC00004D0FD6801200540002DEFD1FD683424CC +:101BD0002C40FC6030680028EFF3008001B42F46F1 +:101BE000361D01BC80F3008801D10348074300BDC6 +:101BF00000001000002002400000008000B5FFF748 +:101C0000B7FF084901200D6805430D603068388032 +:101C100077680836FFF7C4FF024901200D68854345 +:101C20000D6000BD102002400B483F1A00B5FFF7C1 +:101C30009FFF0A4D02202969014329616F614020FD +:101C400029690143296180CEFFF7AAFF04490220D8 +:101C50000D6885430D6000BD0000000800200240B3 +:101C60001020024000B5FFF7C9FF80CE00BD202044 +:101C70003D783068854200B502D17768083600BDEE +:101C80003D4601218D4301200740EFF3008001B460 +:101C90002F4601BC80F3008806D031680D023C78E5 +:101CA0002C433760274605E07D782D0231680D43CF +:101CB00037602F46306837600746FFF7D3FF00BD17 +:101CC000074D31680D40083E3560776000B5FFF77D +:101CD000C9FF31680D0CBF1C3560FFF7C3FF00BDA5 +:101CE000FFFF0000083E044931607760034F00B5F4 +:101CF000FEF79EFB00BD0000000000080000100879 +:101D0000361F376000B5FFF7EDFF002F80CE02D001 +:101D1000FFF7AEFF03E0306838707768083600BD23 +:101D2000361F376000B5FFF7DDFF002F80CE02D0F1 +:101D3000FFF798FF03E0306838807768083600BD09 +:101D4000361F376000B5FFF7CDFF002F80CE02D0E1 +:101D5000FFF7B6FF03E0306838607768083600BDEB +:101D60003C190008C7464C455241534530683F185E +:101D700030683760074600B5FEF7BEFBC71D000898 +:101D8000009D01980544361F37602F46FFF7AAFFD4 +:101D9000002F80CE09D0009D01980544361F376082 +:101DA0002F46FFF741FF084F07E0009D01980544CB +:101DB00006482860361F376004270098C019009035 +:101DC00080CEDDD703B000BD00080000FFFFFFFF9D +:101DD000C4130008C6464C50524F472030683F1885 +:101DE00030683760074600B5FEF786FB111E000815 +:101DF0003D88009C01980444083E35607760274682 +:101E0000FFF730FFBF1C0098801C0090F0D703B094 +:101E100080CE00BD083EB1683160776000B5FFF745 +:101E2000A5FF31687D1811480468083E346077606A +:101E30002F46FFF785FF30683F1830683760074648 +:101E4000FEF75AFB691E00083D68009C0198044497 +:101E5000083E356077602746FFF772FF3F1D009808 +:101E6000001D0090F0D703B080CE00BD280200080E +:101E700010150008CB434F444552414D425546464C +:101E800000B500BFFFF71BFB0000002000B500BF3E +:101E9000FFF703FC101000200348056803494D1BA1 +:101EA000361F37602F4670471010002000000020BA +:101EB00000B500F033FAFFF7EFFF3168CF1B361D96 +:101EC00000BD0000041A0008C92B42554646434F86 +:101ED0004D5020200C480568002D00B513D10C3E54 +:101EE0000A4931600A497160B760FF27FEF7CAFFEF +:101EF000361F3760064F00F011FA3168CF1B0249D8 +:101F00000F607768083600BD101000200002000046 +:101F100000000020B01A0008C92D42554646434F24 +:101F20004D50202009480568002D00B50DD000F067 +:101F300089FA361F3760064FFFF7AEFFFFF7B8FF8D +:101F4000FFF74CFF00200149086000BD1010002081 +:101F5000000000200B480568002D00B511D0361F89 +:101F60003760FFF799FF08497D18361F37602F4605 +:101F7000FEF75EFA002F80CE03D002480568ED1907 +:101F80002F4600BD1010002000020000181F00089E +:101F9000C343404300B5FFF7DDFF3F7800BD0000BD +:101FA000341B0008C357404300B5FFF7D3FF3F88F9 +:101FB00000BD0000981A0008C240432000B5FFF79A +:101FC000C9FF3F6800BD0000901F0008C3432143C4 +:101FD00000B5FFF7BFFFFFF793FE00BDA41F000889 +:101FE000C357214300B5FFF7B5FFFFF799FE00BDCA +:101FF00094140008C221432000B5FFF7ABFFFFF7A0 +:102000009FFE00BD00B500BFFFF796FA1410002038 +:10201000501B0008C453454C4620202000B500BF8B +:10202000FFF7ABFA000000000C190008C253302083 +:1020300000B500BFFFF7A1FA18000000C81E000895 +:10204000C252302000B500BFFFF797FA1C00000015 +:1020500014200008C42354494220202000B500BFAA +:10206000FFF78BFA20000000CC1A0008C42754495F +:102070004220202000B500BFFFF77FFA24000000B7 +:1020800000140008C33E494E00B500BFFFF775FAC3 +:102090002800000080190008C8584F4E2F584F469E +:1020A0004620202000B500BFFFF767FA2C00000093 +:1020B000D41D0008C74543484F494E4700B500BFEF +:1020C000FFF75BFA30000000B81F0008C34F5554FB +:1020D00000B500BFFFF751FA34000000CC1F000824 +:1020E000C44241534520202000B500BFFFF745FA08 +:1020F0003800000000B500BFFFF73FFA3C000000C9 +:1021000000B500BFFFF739FA400000005420000876 +:10211000C344504C00B500BFFFF72FFA4400000045 +:1021200040200008C54F50564543202000B500BF51 +:10213000FFF723FA48000000741E0008C5495056F6 +:102140004543202000B500BFFFF717FA4C00000000 +:1021500000B500BFFFF711FA50000000F41F00089F +:10216000C350414400B500BFFFF707FA98000000D4 +:1021700024210008C2424C2000B500BFFFF79FF9A0 +:1021800020000000E0200008C244502000B500BF3D +:10219000FFF7D2F91810002074210008C252502015 +:1021A00000B500BFFFF7C8F91C10002000B500BF44 +:1021B000FFF7C2F9201000206C200008C3584450DB +:1021C00000B500BFFFF7B8F92410002000B500BF2C +:1021D000FFF7B2F92810002000B500BFFFF7ACF9F7 +:1021E0002C10002000B500BFFFF7A6F9301000202A +:1021F00000B500BFFFF7A0F93810002000B500BF00 +:10220000FFF7D8F93C10002000B500BF00F03FFFF9 +:10221000142200084810002000B500BFFFF78CF919 +:102220008C1000203C210008C34B45595D46ED6CE5 +:102230002D6800B501200543A84700BD940800089B +:10224000C44B45593F2020205D46ED6C6D6800B5BC +:1022500001200543A84700BDA4190008C4454D4905 +:10226000542020205D46696B491C69635D46AD6C56 +:10227000AD6800B501200543A84700BDD014000893 +:10228000C4545950452020205D46696BC9196963C3 +:102290005D46AD6CED6800B501200543A84700BD63 +:1022A0002C200008C24352205D46002068635D4632 +:1022B000AD6C2D6900B501200543A84700BD0000A5 +:1022C00080220008C553504143452020361F376007 +:1022D000202700B5FFF7C6FF00BD00005C22000804 +:1022E000C653504143455320002F00DC0027361FC2 +:1022F0003760002700B500BFFEF7FEF80F23000887 +:10230000FFF7E4FF0098401C0090F9D703B000BD30 +:10231000B4200008C44845524520202003480568E1 +:102320002D68361F37602F467047000024100020AC +:10233000CC200008C34F5247024805682F6080CE6A +:10234000704700002410002088210008C5414C4C33 +:102350004F542020034805682968C919296080CE98 +:10236000704700002410002010210008C552484585 +:102370005245202002480568361F37602F467047B7 +:102380001C100020C4220008C652414C4C4F54205F +:1023900002490868C019086080CE70471C100020F0 +:1023A00088230008C652414C49474E20034805681F +:1023B000ED1C03218D4301490D6070471C10002066 +:1023C000A4220008C3524F4D0148024908607047DB +:1023D0001810002024100020C4230008C352414DCF +:1023E00001480249086070471C100020241000209A +:1023F00004480568361F37602F4600B5FFF7E4FF35 +:1024000000BD00002410002001490F6080CE7047FD +:1024100024100020064805680648854201D00025A2 +:1024200001E001256D42361F37602F4670470000DE +:1024300024100020181000204C230008C5414C49EE +:10244000474E202000B5FFF769FFFF1C03218F4393 +:10245000FFF772FF00BD0000641D0008C12C2020A2 +:1024600000B5FFF75BFFFFF7C7FD361F3760042796 +:10247000FFF770FF00BD0000E0220008C2572C20CB +:1024800000B5FFF74BFFFFF7ADFD361F37600227A2 +:10249000FFF760FF00BD0000DC230008C2432C20D2 +:1024A00000B5FFF73BFFFFF793FD361F37600127AD +:1024B000FFF750FF00BD202002480568361F376037 +:1024C0002F467047381000200448056804490D6005 +:1024D0002D1F2D6801490D60704700003810002045 +:1024E0008C1000200248056802490D60704700000A +:1024F0008C10002038100020E01F0008C446494E10 +:10250000442020207D1C3C78083E356077602746BB +:1025100000B5FEF77FFC3D78002D26D0154D2C46EA +:102520000834083E346077602F4600BFFDF7D8FFBF +:102530006B2500087D1C3C78009B019803441B68B8 +:102540000C3E34607560B7601F46FEF79DFD002F9E +:1025500000D180CE04D003B031687160361D00BD5B +:102560000098001D0090E5D703B0361F37600027A4 +:1025700000BD00003010002060210008C52E4E4133 +:102580004D4520207D1C3F781F200740361F3560B9 +:1025900000B5FFF779FEFFF799FE00BD30683F18E0 +:1025A00030683760074600B5FDF7A6FFCD25000867 +:1025B000009D019805442D78361F37602F46FFF7A0 +:1025C0006FFF0098401C0090F2D703B0FFF73AFF6E +:1025D00000BD202000B5FFF77DFC361F37602027A7 +:1025E00000F092FC7D1C3F780C3E35607760B56052 +:1025F000FEF710FC254805680C3E3760F1687160F5 +:10260000B7602F46FEF740FD002F80CE0ED0FEF7BC +:10261000EBFCFFF749FEFFF7B5FF00F079F80D6915 +:1026200073207265646566696E656420FFF70AFF52 +:1026300035682D78ED191548046823685B1E1D4028 +:10264000AD00241D64192568083E346077602F466C +:10265000FFF706FFFFF762FE31680F607768083604 +:10266000FFF75CFE0A490F60802731680F43094875 +:102670000568002D01D140200743FFF711FF0549F0 +:1026800000200860FFF78AFF00BD00002C1000202A +:102690003810002000100020002F80CE00B506D09A +:1026A000074805682D1D361F37602F4604E0054892 +:1026B0000568361F37602F46FFF7D2FE00BD0000C9 +:1026C000181000201C10002000B5FEF711FE00BD00 +:1026D00000B5FEF70DFE7D1C3F78361F356000BD4E +:1026E00000B5FEF705FE30680028EFF3008001B466 +:1026F000361D01BC80F3008805D05D462F65034F71 +:1027000000F034F800E080CE00BD0000FEFFFFFFC7 +:1027100000B5FEF7EDFD00F0D3FA00BDA4230008DC +:10272000C543415443482020361F3760374600B523 +:1027300080B44F4680B45F463F6C80B46F465D46C0 +:102740002F6435687768083601200543A84720BC08 +:102750005C46256401B001B0361F3760002700BD1C +:102760007C240008C55448524F572020002F00B544 +:1027700001D180CE00BD5D462D6CAD4620BC5C46CF +:10278000256420BCA94620BC80B42F463E1C80CEC8 +:1027900080BC00BD9C240008C63F5448524F5720BF +:1027A00030680028EFF3008001B4361D01BC80F3CF +:1027B000008800B502D0FFF7D9FF00E080CE00BD51 +:1027C0006C2300088641424F5254222000B500F08D +:1027D00097FC361F3760034FFEF7AEFD00F028FF71 +:1027E00000BD0000E0260008BC210008C348455891 +:1027F0005D461020A8637047EC270008C744454396 +:10280000494D414C5D460A20A8637047982700084F +:10281000C342494E5D460220A86370471423000856 +:10282000C4484F4C442020205D460448E96B0918F9 +:10283000E9635D46ED6B2F7080CE7047FFFFFFFFB1 +:102840009C210008C12320205D46AD6B361F3760F8 +:102850002F4600B5FDF7D4FF70680928EFF300801C +:1028600001B43D46776831687160356001BC80F322 +:10287000008800DDFF1D3037FFF7D6FF00BD0000E8 +:1028800010280008C223532000B500BFFFF7DCFF6B +:1028900035683D43002DF9D100BD00002822000815 +:1028A000C23C23205D4698355C46E56370470000D6 +:1028B00084280008C2233E205F46FF6B5D469835A2 +:1028C000ED1B37602F467047C4270008C3442E52C3 +:1028D00000B580B437687068316871603060FDF7AA +:1028E000B9FEFFF7DFFFFFF7CFFF70680028EFF3B7 +:1028F000008001B431687160361D01BC80F300882E +:1029000004D5361F37602D27FFF78EFFFFF7D4FF62 +:1029100020BCED1B361F37602F46FFF7E5FCFFF7A5 +:10292000B3FC00BD3C240008C2442E20361F376093 +:10293000002700B5FFF7CCFFFFF7C8FC00BD000083 +:1029400040220008C12E2020FD17361F37602F4679 +:1029500000B5FFF7EBFF00BDCC280008C2552E20C4 +:10296000361F3760002700B5FFF7E0FF00BD00000D +:1029700020270008C3552E52361F0021316000B5B4 +:10298000FFF7A6FF00BD000098200008C22E5220CD +:1029900000B580B43168CF1720BC361F37602F4692 +:1029A000FFF796FF00BD20205D46AD6B361F7168B6 +:1029B000316077602F4600B5FDF772FE5F46BF6B52 +:1029C0003568B16831607168B1607560FDF768FEA7 +:1029D000FDF706FE5D466D6C6D1C03D05D46696CAF +:1029E000491C696400BD0000B4280008C73E4E556C +:1029F0004D424552083E37607760002700B500BF62 +:102A0000FDF77AFD652A000835682D78361F376096 +:102A10002F46FEF7F1F95D46AD6B361F37602F4646 +:102A2000FEF74CFB002F01D0002701E001277F4279 +:102A3000002F80CE01D002B000BD3168706801B4B3 +:102A400002B40836FFF7B0FF20BC10BC0123ED1A1A +:102A50001B19083E336077602F460098401C009099 +:102A6000D2D703B000BD20205D462F48686435688A +:102A70002D782D2D01D0002501E001256D4200B5F6 +:102A800020B4002D04D001257F1B30682D1835603F +:102A9000012F03DA01B00027361D00BD083EB168E2 +:102AA0003160002171600021B16000BFFFF7A2FF1B +:102AB000002F22D001257F1B30682D18356000BF04 +:102AC0003068451E2D783A2DEFF3008001B4361F93 +:102AD00037602F4601BC80F3008801D180CE0BE027 +:102AE0002E2F04D15F460020786480CE04E001B030 +:102AF0000027103600BD80CED8E780BC002FEFF352 +:102B0000008001B47768083601BC80F3008801D0EA +:102B1000FDF77EFD5D466D6C002D01D5012702E0BD +:102B2000361F3760022700BDFFFFFFFF00B500BF63 +:102B300035682D78242DEFF3008001B4361F3760FF +:102B40002F4601BC80F300880AD101273168CD1BD4 +:102B500070683F1877602F46361DFFF749FE1BE06F +:102B6000232F0AD101273168CD1B70683F18776089 +:102B70002F46361DFFF746FE0EE0252F0BD101270D +:102B80003168CD1B70683F185C460220A0637760F7 +:102B90002F46361D00E080CE00BD000084200008D6 +:102BA000C8494E54454745523F2020207D1C3F7860 +:102BB000002FEFF3008001B4361F356001BC80F3B5 +:102BC000008800B510D0083EB16831607760FEF72C +:102BD00021F95D46AD6B20B4FFF7A8FFFFF744FF76 +:102BE00020BC5C46A56301E00027361D00BD000047 +:102BF000EC290008C74E554D4245523F00B500BF75 +:102C0000FEF7D8FC901000205D466D6B361F3760D4 +:102C10002F46002F00D180CE00B50FD0361F376071 +:102C20000827FFF71FFBFFF751FB361F3760082708 +:102C3000FFF718FB7F1E5D466F6380CE00BD20202E +:102C4000002F01D1002501E001256D425C46246B77 +:102C5000002C01D1002401E0012464422C4000B585 +:102C600006D0FFF7D1FF7F1E361F3760024F02E00C +:102C7000361F3760002700BDFFFFFFFF3068387048 +:102C80005F463F6B002F80CE00B502D0FFF7EAFA17 +:102C900000E080CE00BD00008C290008822E22209A +:102CA000361F3760034F00B5FEF746FB00F0C0FC4F +:102CB00000BD00001027000828290008C2242E208B +:102CC0007D1C3F78361F356000B5FFF7DDFA00BD8B +:102CD0005C290008C641434345505420002F00B5ED +:102CE00001D1361D00BD5D46ED6A002D04D0361FB2 +:102CF00037601127FFF7B6FA30683F18361F376084 +:102D000077680021716000BFFDF7F6FBAB2D00086E +:102D1000FFF78CFA082F03D180CEFFF791FF3EE03A +:102D2000092F0CD1009F01980744361F20213160E4 +:102D3000FFF7A4FF7F1C361F376001272FE00A2F03 +:102D400001D100272BE00D2F0AD1009F01980744E5 +:102D5000361F20213160FFF791FF02B000BD1EE059 +:102D60000C2F0AD1009F01980744361F20213160A3 +:102D7000FFF784FF02B000BD11E07F2F03D180CEAA +:102D8000FFF75EFF0BE0009D01980544361F37609A +:102D90002F46FFF773FF7F1C361F3760012700980F +:102DA000C019009080CEB3D703B05D46ED6A002D08 +:102DB00004D0361F37601327FFF754FA00BD000018 +:102DC00000B500BFFEF7B8FB941000205D466D6AA9 +:102DD0005C46246A083E35607760274670470000ED +:102DE000BC2C0008C55155455259202000200949E6 +:102DF00008605D466D6A083E35607760FF2700B564 +:102E0000FFF76CFF5D462F625F460020B86280CE00 +:102E100000BD00009410002074290008C6524546E9 +:102E2000494C4C2007480568002D00B503D0361FDB +:102E30003760002704E0FFF7D9FF361F3760024FE5 +:102E400000BD000094100020FFFFFFFFF42B0008DE +:102E5000C55041525345202000B580B480CEFFF7C5 +:102E6000B5FF5D46AD6A7F1B30682D1810BC083E6B +:102E700037607560B5602746FDF76CFE80B4316839 +:102E800070680F1A20BC002D01D1002501E001253A +:102E90006D427D1B5C46A16A4919A162361D00BDC9 +:102EA00000B580B480CEFFF791FF5D46AD6A7C1B14 +:102EB00030682D18009B083E34607560B7601F466F +:102EC000FDF734FE20BC083E3760B16871602F46C4 +:102ED000FDF740FE80B4316870680F1A20BC002DE9 +:102EE00001D1002401E0012464426419B1680C1B83 +:102EF0005D46AC627168B160083600BDFC27000811 +:102F0000C4574F524420202000B5FFF7C9FF0648A0 +:102F10000568361F37602F46FDF7A0FF0248056899 +:102F2000361F37602F4600BD1C10002000B5FFF78C +:102F30008BF9002F00D100BDFFF778F9202F80CE4C +:102F400008D180CEFFF772F9202F01D1002701E0D0 +:102F500001277F4200BD2020002F00B501D001488D +:102F60003F1A00BD000000085D469835044804681B +:102F70002468A4006419083E346077602F467047C7 +:102F800030100020083E002131607760002700B536 +:102F9000FFF7EAFFFDF7A4FAC52F0008009D01988E +:102FA00005442D68AF4208D2009F01980744009D58 +:102FB000019805442D6837602F460098001D009049 +:102FC000ECD703B0002F01D001483F1800BD80F3BB +:102FD00000000008104805682D1D361F37602F4679 +:102FE00000B5FFF7C1FF00BFFDF77AFA1530000802 +:102FF0003D68361F37602F46FFF7AEFF009D0198F2 +:1030000005442F6037683F1D361D0098001D009055 +:10301000EED703B080CE00BD30100020202800087D +:10302000C5574F524453202000B5FFF73DF9FFF735 +:10303000D1FF00BFFFF7A6FF361F3760FFF776FF0F +:10304000002F01D0002701E001277F4231680F40A7 +:10305000EFF3008001B47768083601BC80F3008884 +:1030600012D05D466D6B402D01DDFFF71DF9361F57 +:103070003760FFF787FA3F1F3F68FFF76DFF316842 +:103080000F6077680836D5E77768083600BD704668 +:10309000401E02681268014B1A6000BD301000200B +:1030A0003068874201D1002701E001277F42376065 +:1030B000024F00B5FFF774FB00BD0000EAFFFFFF01 +:1030C000361F3760374602490F6080CE70470000D8 +:1030D00020100020361F3760374607480568BD427C +:1030E00001D1002701E001277F42361F3760034FDF +:1030F00000B5FFF755FB00BD20100020EAFFFFFFE1 +:1031000007480568002D01D0002501E001256D422A +:10311000083E35607760034F00B5FFF741FB00BD07 +:1031200028100020F2FFFFFF04480568083E3560C4 +:103130007760034F00B5FFF733FB00BD2810002078 +:103140006DFEFFFFE42D000882444F2000B5FFF71D +:10315000D7FFFEF74FFB361F3760032700BD000087 +:1031600034230008833F444F00B5FFF7C9FFFEF743 +:103170004FFB361F3760032700BD00009C2C000862 +:10318000844C4F4F5020202000B5FFF7B9FF361F69 +:1031900037600327FFF784FFFEF748FB00BD000000 +:1031A00080310008852B4C4F4F50202000B5FFF791 +:1031B000A7FF361F37600327FFF772FFFEF744FBB8 +:1031C00000BD0000D42C000885424547494E202010 +:1031D00000B5FFF795FFFEF7B3FA00BD48310008D0 +:1031E00085414741494E202000B5FFF789FFFEF792 +:1031F000B1FA00BDFC24000885554E54494C2020EE +:1032000000B5FFF77DFFFEF7B1FA00BD20300008E2 +:10321000855748494C45202000B5FFF771FFFEF760 +:10322000BDFA30683760074600BD00001C2E00085C +:10323000865245504541542000B5FFF761FFFEF727 +:1032400089FAFEF771FA00BD002F00088249462076 +:1032500000B5FFF755FFFEF7A1FA00BD30320008B8 +:10326000845448454E20202000B5FFF749FFFEF763 +:103270005BFA00BD6427000884454C53452020209C +:1032800000B5FFF73DFFFEF77DFA3068376007466F +:10329000FEF74AFA00BD0000783200088752454325 +:1032A0005552534505480568361F37602F4600B50F +:1032B000FDF786FEFEF740F800BD00008C100020F0 +:1032C000C8310008844341534520202000B5FFF752 +:1032D00017FF06480568361F37602F46FEF7C8FA05 +:1032E000FFF7EEFE361F3760042700BD20100020D8 +:1032F000A02B0008824F4620361F3760042700B5F8 +:10330000FFF7CEFEFEF7C2FA361F3760052700BD75 +:1033100064310008833F4F46361F3760042700B5ED +:10332000FFF7BEFEFEF7ECFA361F3760052700BD3B +:10333000F831000885454E444F462020361F37603F +:10334000052700B5FFF7ACFEFEF7ACFA361F376075 +:10335000042700BD1032000887454E4443415345C1 +:10336000361F3760042700B5FFF79AFEFEF7BCFA58 +:1033700001490F6080CE00BD20100020361F37604D +:1033800037465D46AD69BD4201D3002701E0012704 +:103390007F42361F3760024F00B5FFF701FA00BDCC +:1033A000FCFFFFFF002F01D0002701E001277F4233 +:1033B000361F3760024F00B5FFF7F2F900BD00007D +:1033C000F3FFFFFF6032000888504F5354504F4EB8 +:1033D00045202020361F3760202700B5FFF794FDD9 +:1033E000FFF790F8361F3760FFF7DCFF0120C74278 +:1033F00080CE04D100F060F8361F3760014FFDF732 +:103400009BFF00BD38130008502E00088253222075 +:1034100010480568002D00B507D0361F37600E4FE5 +:10342000FDF78AFF00F004F913E0361F376022270A +:10343000FFF712FD5D469835361F37602F46FDF7C2 +:103440000DFD5D4698356C1C2D78083E3460776024 +:103450002F4600BD28100020D02600080C3400089C +:10346000824322200F480568002D00B507D0361F83 +:1034700037600D4FFDF760FF00F0DAF810E0361FFF +:1034800037602227FFF7E8FC5D469835361F376026 +:103490002F46FDF7E3FC5D469835361F37602F4613 +:1034A00000BD000028100020C82600087C25000868 +:1034B000874C49544552414C00B5FEF77BF900BD9D +:1034C000C4320008C443484152202020361F3760D0 +:1034D000202700B5FFF718FD7F7800BDF432000803 +:1034E000865B434841525D2000B5FFF709FEFFF7B8 +:1034F000EDFFFFF7E1FF00BD58330008815B20209E +:10350000014900200860704728100020A02800080A +:10351000C15D202002490120404208607047000040 +:1035200028100020C8330008C1272020361F37602C +:10353000202700B5FFF7E8FCFEF7E4FFFFF732FFB6 +:1035400000BD000010350008835B275D00B5FFF764 +:10355000EDFFFFF7B1FF00BD44280008895B434F32 +:103560004D50494C455D202000B5FFF7DFFFFDF7CA +:10357000E3FE00BD9C32000881282020361F376002 +:10358000292700B5FFF7C0FC80CE00BD5C240008F1 +:10359000815C2020361F3760002700B5FFF7B4FCA0 +:1035A00080CE00BD00B5306801B480B477680836BD +:1035B000361F37602027FFF7A7FC3D78002D1CD071 +:1035C0007D1C3F78009CBC42EFF3008001B42F4685 +:1035D00001BC80F300880ED1009D019C083E346040 +:1035E00077602F46FDF7C8FA002F80CE02D020BCAE +:1035F00010BC00BD00E080CEDAE780CEFFF712FC01 +:10360000002F80CED4D120BC10BC00BD34330008C4 +:103610008228282000B5FFF75BF802292900000066 +:10362000FFF7C0FF00BD00005C350008C2222C205F +:10363000361F3760222700B5FFF766FC3D786D1C0A +:10364000361F37602F46FEF7A9FF00BD00B520BC2E +:10365000E41D03218C4310B42D682F6080CE00BD83 +:103660004C3200088249532000B5FFF75FFFBF6866 +:1036700008480568002D07D0361F3760064FFDF754 +:103680005BFEFEF7EDFE03E03068386077680836D1 +:1036900000BD0000281000204C36000878350008D6 +:1036A000844558495420202000B5FFF729FDFEF736 +:1036B00097F800BDFC340008813B202000B5FFF7DF +:1036C0001FFDFFF707FDFEF78BF8FEF70BFFFFF777 +:1036D00017FFFEF727FC00BD14330008C9494E54FC +:1036E000455250524554202000B500BFFFF746FE1A +:1036F000361F37602027FFF707FC3D78002D3FD0AD +:10370000FEF700FF002F00D180CE13D0002F01D490 +:10371000002701E001277F421A4805683D4080CE1E +:1037200002D0FDF709FE04E03D4680CE01200543AE +:10373000A84724E0FFF762FA002F01D0361F376058 +:10374000FFF730FE0F480568002D17D0012F03D179 +:1037500080CEFEF72FF810E0022F08D1776831688D +:103760007160361DFEF726F8FEF724F805E0361FD7 +:103770003760054FFEF7FAFF80CE00E080CEB5E758 +:1037800080CE00BD28100020F3FFFFFF9035000819 +:10379000C84556414C554154452020205D466D6A30 +:1037A00000B520B45D462D6A20B45D46AD6ABD42C9 +:1037B00001DB002701E001277F421048056820B4A3 +:1037C0005D462F625F46306878620D480B4908609D +:1037D0005F460020B8620B4F361DFEF7A5FF20BCE8 +:1037E00006490D6020BC5C46A56220BC5C46256293 +:1037F00020BC5C466562FEF7B9FF00BD9410002056 +:10380000FFFFFFFFE836000800B500BF002F01D121 +:1038100080CE25E00120C74201D180CE20E00220E9 +:10382000C74204D15F463F6DFFF74AFA18E00D200A +:10383000C7420AD180CEFEF76BFF0C697320756E0C +:10384000646566696E6564000AE0FEF761FF0B540B +:1038500068726F7720636F6465200000FFF774F86B +:1038600000BD000060340008C45155495420202098 +:103870005D460020E8625D4601204042286300204A +:103880002F49086000B5FFF73BFE00BF5D46ED69BC +:10389000AD465D462D6B002D01D0FEF705FDFFF70F +:1038A000A5FA361F3760274FFEF73EFF002F24D1C1 +:1038B00025480768002F01D0002701E001277F423B +:1038C0005D462D6B002D01D1002501E001256D42E3 +:1038D0003D4080CE10D0FEF71BFF03206F6B000031 +:1038E000FDF7F6F8002F00D180CE05D0FEF710FFCF +:1038F000012D0000FFF728F820E0FFF785FF5D4667 +:10390000AD69361F37602F463E1C80CEFFF7F8FDAD +:10391000FEF7CAFCFFF75AFAFEF7B6FCFEF7C4FC46 +:103920005D46AD6A6D1E361F37602F46FEF7DCFC24 +:10393000FEF7EEFE015E0000FEF7F4FAA6E700BD1A +:1039400094100020E83600082810002000550008D8 +:10395000B00F0008B8360008C9434F4C44434841F3 +:10396000494E202000B500BFFDF7E6FD981000206D +:10397000C4340008C64154434F4C442000B5FEF700 +:1039800061FDFEF7CBFC054805682F6003490F6019 +:103990000027FEF765FDFEF763FD00BD98100020CF +:1039A0002C360008CD57414C4B434F4C44434841C3 +:1039B000494E2020361F3760054F00B5002F05D037 +:1039C0007D6801200543A8473F68F7E780CE00BD2A +:1039D0004C390008361F3760004F01E07C71000849 +:1039E00000B500BF3D68002D0FD03D460C353C684A +:1039F0007B680C3E33607560B7602746FDF7A2F91F +:103A00003D68ED190C352F46ECE75F461837083E48 +:103A10003760144971601027FDF794F95D46AD6970 +:103A2000361F37602F463E1C80CE5D460E486862CA +:103A30005D46002028640C3E0C4931600C497160E1 +:103A4000B7600827FDF77EF900200A490860FEF7F5 +:103A5000D9FE094D09490D6009490D600020094949 +:103A6000086000BDF8010008200C0020181000209C +:103A70001C02000894100020481000203010002084 +:103A80002C10002034100020B0340008C52E4652FF +:103A90004545202000B5FEF707FC16480568164985 +:103AA0004D1B083E356077600027FEF73FFFFEF7AD +:103AB0002FFE106279746573206672656520466C0E +:103AC00061736800FEF7F0FB03F052FB0B480568DA +:103AD0007F1B361F37600027FEF728FFFEF718FE12 +:103AE0000E627974657320667265652052414D00DF +:103AF00000BD00001810002000F001081C1000207C +:103B0000A0360008C6434F4D4D495420002F00B544 +:103B100000D1074F0120074306490F60083E742774 +:103B20000549316005497160FEF774F900BD000078 +:103B3000B00F00083C10002000F801081810002009 +:103B400010360008C5454D5054592020083E0849FC +:103B500031607760742700B5FEF708F9083E054923 +:103B600031607760044FFEF701F900F087F800BD7F +:103B700000F8010800C000080030010048350008C6 +:103B8000C628434F4C44292000B5FFF723FF00F01F +:103B9000ADFF00F09DFF5D46AF6480CE00F098FF62 +:103BA0005D46EF64083E74272749316027497160FC +:103BB000FEF730F9264805680120C54201D10024EE +:103BC00001E001246442002D01D1002501E001251E +:103BD0006D42254011D01F4805681F480468AC425B +:103BE00009D10C3E1949316019497160B7607427D9 +:103BF000FDF7A8F801E0FFF7A9FFFEF723FC134843 +:103C000005682D680120C54201D0FFF79FFFFFF72F +:103C1000D1FEFEF749FB01F029FFFFF73BFFFEF75E +:103C2000EDFAFEF741FBFEF73FFBFEF771FD0420C6 +:103C3000206F6B005D46AD69361F37602F463E1C16 +:103C400080CEFFF715FE00BD00F00108181000201F +:103C500000F801082802000874F801087439000807 +:103C6000C4434F4C4420202000B500F007F800BDAD +:103C700028350008C65245424F4F542072B60549B8 +:103C800001200D6805430D6003480449086000B534 +:103C9000FEE700BD24100240CCCC00000030004004 +:103CA000F0B54046494652465B460FB46946F03986 +:103CB0008B460A1CF03A95460E46083E341F8C612E +:103CC0006846C861FDF774F96946F031F0318D46F8 +:103CD0000FBC8046894692469B46F0BD1F253D405D +:103CE0000124AC407F09BF00361F346070470000DC +:103CF000443B0008C5454E494E5420200F2F00B5C7 +:103D00000BD9103FFFF7EAFF05483F1805483F1859 +:103D1000306838607768083600BD80CE00BD00008E +:103D200000E000E000010000F43C0008C6444953F4 +:103D3000494E54200F2F00B50BD9103FFFF7CEFF8F +:103D400005483F1805483F183068386077680836DE +:103D500000BD80CE00BD000000E000E0800100005A +:103D6000743C0008C92F4150504652414D45202017 +:103D700000B500BFFDF7A3FB20000000643600087B +:103D8000C64558412E52302000B500BFFFF7FFFF57 +:103D900000000000803D0008C64558412E523120E9 +:103DA00000B500BFFFF7FFFF04000000983D0008CA +:103DB000C64558412E52322000B500BFFFF7FFFF25 +:103DC00008000000B03D0008C64558412E5233207F +:103DD00000B500BFFFF7FFFF0C00000058390008D6 +:103DE000C74558412E52313200B500BFFFF7FFFFE3 +:103DF00010000000E03D0008C74558412E52313404 +:103E000000B500BFFFF7FFFF14000000C83D000829 +:103E1000C64558412E50432000B500BFFFF7FFFFB5 +:103E200018000000F83D0008C74558412E50535275 +:103E300000B500BFFFF7FFFF1C000000043B0008B7 +:103E4000CA2F4D41494E4652414D452000B500BF55 +:103E5000FDF735FB24000000103E0008C645584D14 +:103E60002E52342000B500BFFFF7FFFF0000000016 +:103E70005C3E0008C645584D2E52352000B500BFA7 +:103E8000FFF7FFFF04000000743E0008C645584DD0 +:103E90002E52362000B500BFFFF7FFFF08000000DC +:103EA0008C3E0008C645584D2E52372000B500BF45 +:103EB000FFF7FFFF0C000000A43E0008C645584D68 +:103EC0002E52382000B500BFFFF7FFFF10000000A2 +:103ED000BC3E0008C645584D2E52392000B500BFE3 +:103EE000FFF7FFFF14000000283E0008C745584DAB +:103EF0002E52313000B500BFFFF7FFFF1800000061 +:103F0000EC3E0008C745584D2E52313100B500BF78 +:103F1000FFF7FFFF1C00000044290008CA45584D68 +:103F20002E4558435245542000B500BFFFF7FFFF10 +:103F300020000000E0310008C72F4558444154419B +:103F400000B500BFFDF7BBFA140000001C3F0008DD +:103F5000CA4558442E523133464C542000B500BF58 +:103F6000FFF7FFFF00000000A4310008CB455844D4 +:103F70002E5231334D41494E00B500BFFFF7FFFFD0 +:103F8000040000008C3A0008CE4558442E523133CC +:103F900050524F434553532000B500BFFFF7FFFF7A +:103FA00008000000E0340008CC4558442E5231335C +:103FB000535441544520202000B500BFFFF7FFFFB8 +:103FC0000C000000503F0008CA4558442E4C524D8A +:103FD00041494E2000B500BFFFF7FFFF1000000071 +:103FE000D43E0008C64558444154412000B500BFA6 +:103FF000FDF765FA4C060020164BEFF30880586079 +:10400000EFF30981996072461A610420024201D1DE +:10401000586800E0986818604046494652465B463A +:104020000FB5F0B40B4B6846D860F8B06846F03076 +:1040300083460646083E341F84616946C161FCF729 +:10404000B7FF78B0F0BC0FBC8046894692469B46CD +:1040500000BD00004C060020883F0008C52E4954D2 +:10406000454D20203D68361F37602F4600B500F0D3 +:104070009FFDFEF72BF93F1D00BD0000A43900088D +:10408000C62E4954454D5320361F3760002700B5D2 +:10409000FCF732FAA7400008FFF7E4FF0098401C45 +:1040A0000090F9D703B000BD403E0008C841505011 +:1040B0004954454D5320202002480568361F37607B +:1040C0002F4670474C060020383F0008C94D414933 +:1040D0004E4954454D53202002480568361F37602D +:1040E0002F46704758060020603C0008C6415050DB +:1040F0005253502000B5FFF7DFFF203700BD00000E +:10410000EC400008C64150505053502000B5FFF716 +:10411000E3FFBF6800BD0000CC400008C54150501F +:104120005550202000B5FFF7D7FFFF6900BD000004 +:1041300004410008C6415050544F532000B5FFF7CA +:10414000CBFFFF6800BD00001C410008C541505076 +:104150005043202000B5FFF7AFFFBF6900BD00004E +:1041600034410008C92E464C544652414D4520204A +:1041700000B5FFF7A1FFFEF797F8FEF7C9FA113D6A +:104180003D3D20526567697374657273203D3D3D06 +:10419000FEF78AF8FEF7BCFA06505352203D200085 +:1041A000FD69361F37602F4600F002FDFEF77CF8F0 +:1041B000FEF7AEFA06523020203D2000083E376060 +:1041C00077600427FFF760FF80CEFFF785FFFEF7DB +:1041D0006BF8FEF79DFA06523420203D20000000C7 +:1041E000361F37600427FFF74FFFFEF75DF8FEF735 +:1041F0008FFA06523820203D20000000361F37601D +:104200000427FFF741FF80CEFFF756FFFEF74CF87B +:10421000FEF77EFA06523132203D20003D46103531 +:10422000361F37602F46FFF71DFF3768203700F035 +:10423000BFFCFEF74BF81437361F37600227FFF735 +:1042400023FF80CE00BD00005C400008C54E414DFC +:10425000453F2020FD1C03218D43AF4200B501D016 +:10426000002700BD7D1C3F789F243C40103E8121EB +:1042700031607460B760F560A027FCF7D9F8002FB3 +:1042800080CE02D10027361D00BD1F2007403068B8 +:104290003F18306837600746FCF72EF9D342000814 +:1042A000009D019805442D780C3E212131607560F8 +:1042B000B7607F27FCF7BCF8002F80CE04D103B095 +:1042C000361F3760002700BD0098401C0090E7D7DC +:1042D00003B0361F3760014F00BD0000FFFFFFFF36 +:1042E000C83F0008C649503E4E464120BF1E00B59B +:1042F000361F3760FFF7AEFF002F80CE01D17F1E43 +:10430000F6E700BD6C3F0008CD434845434B2D41C7 +:104310004C49474E45442020FD1C03218D43AF42AC +:1043200000B50CD0FEF7F4F90D284D6973616C6986 +:10433000676E656429200000FF1C03218F4300BDC8 +:104340004C410008C73F434C4950333230683D1A56 +:10435000802D00B510D937688037FDF7A5FFFEF72F +:10436000D7F913436C697070656420746F20333221 +:10437000206974656D73000000BD000044430008AF +:10438000C82E52534641554C5420202000B5FDF70D +:104390008BFFFFF7AFFEFDF787FFFEF7B9F9065277 +:1043A0005350203D20000000361F376000F000FC15 +:1043B000FDF78CFFFFF7B0FFFFF7B4FEFF69FEF7D4 +:1043C000A7F90720205230203D200000361F37601B +:1043D00000F0EEFBFDF77AFFFFF79EFF3F1FFDF7B2 +:1043E00063FFFEF795F9192D2D2D20526574757216 +:1043F0006E20737461636B2068696768202D2D2DB2 +:10440000FFF7A4FFFCF778F869440008FDF74CFFBC +:10441000009D01980544361F37602F4600F0C8FB09 +:10442000FDF754FF009D019805442D68083E356056 +:1044300077602F4600F0BCFBFDF748FF0C3E1449A7 +:1044400031607760B760134FFBF7F2FF002F80CE2B +:1044500004D0FFF74BFFFEF795F800E080CE009800 +:10446000001F0090D2D703B0FDF71EFFFEF750F9F2 +:10447000192D2D2D2052657475726E207374616331 +:104480006B206C6F77202D2D2D20000000BD0000CB +:104490003402000800C0000880430008C82E5053B2 +:1044A0004641554C5420202000B5FDF7FDFEFFF796 +:1044B0002DFEFDF7F9FEFEF72BF906505350203D77 +:1044C00020000000361F376000F072FBFDF7FEFE93 +:1044D000FFF722FFFFF726FEBF69FEF719F9072055 +:1044E000205330203D200000361F376000F060FB75 +:1044F000FDF7ECFEFFF710FF3D1D3068854212D23C +:1045000077680836FDF7D0FEFEF702F916446174AD +:104510006120737461636B20756E646572666C6F85 +:104520007765640000BD3D1D306885420FD1776816 +:104530000836FDF7B9FEFEF7EBF810446174612010 +:10454000737461636B20656D7074790000BD3068B1 +:104550003D1AF02D11D977680836FDF7A5FEFEF754 +:10456000D7F8154461746120737461636B206F76B2 +:104570006572666C6F77656400BDFDF795FEFEF7AA +:10458000C7F8172D2D2D2044617461207374616369 +:104590006B2068696768202D2D2D000030688742E8 +:1045A00021D03F1FFFF7D2FEFBF79AFFE545000839 +:1045B000FDF77AFE009D01980544361F37602F46AF +:1045C00000F0F6FAFDF782FE009D019805442D6883 +:1045D000361F37602F4600F0EBFA0098001F00905E +:1045E000E6D703B001E077680836FDF75DFEFEF719 +:1045F0008FF8172D2D2D2044617461207374616331 +:104600006B206C6F77202D2D2D200000FDF74CFEC8 +:10461000FEF77EF80972544F532F523720200000C6 +:10462000FFF78CFD00F0C4FA00BD0000043F000855 +:10463000C953484F574641554C54202000B500F00F +:1046400047FA5D46EF645D46AF6480CE00F09AF9AC +:10465000FEF7D8F8083E354931607760002700BF83 +:10466000FBF73EFF734600080098401C0090FBD704 +:1046700003B0083E0521316077600027FBF730FF6B +:1046800099460008361F37600527FDF7EBFD0098B7 +:10469000401C0090F6D703B001F076FFFDF704FE52 +:1046A000FDF702FEFEF734F80A4578636570746919 +:1046B0006F6E2000EFF30585361F37602F46FEF73B +:1046C00043F9FEF725F8036174200000FFF742FD6F +:1046D00000F06EFAFFF74CFDFFF758FEFFF7E4FE1F +:1046E000FDF7E2FDFEF714F81552657374617274FC +:1046F000696E672073797374656D202E2E2E00000D +:10470000083E0A4931607760002700BFFBF7E8FEEA +:104710001F4700080098401C0090FBD703B0FFF72C +:10472000ADFA361F3760002700BD000010270000DB +:10473000164BEFF308805860EFF3098199607246D9 +:104740001A610420024201D1586800E0986818609C +:104750004046494652465B460FB5F0B40B4B68469F +:10476000D860F8B06846F03083460646083E341FED +:1047700084616946C161FFF761FF78B0F0BC0FBC8E +:104780008046894692469B4600BD00004C060020AC +:10479000164BEFF308805860EFF309819960724679 +:1047A0001A610420024201D1586800E0986818603C +:1047B0004046494652465B460FB5F0B40B4B68463F +:1047C000D860F8B06846F03083460646083E341F8D +:1047D00084616946C161FFF731FF78B0F0BC0FBC5E +:1047E0008046894692469B4600BD00004C0600204C +:1047F00090370008CA53454C494F2D53455231203C +:104800001A4D2C463034103E032131600021716076 +:10481000B560F760274600B5FDF7A6F8144879693A +:10482000014379611248B96A8143B9621148B96993 +:104830000143B9610F48F9688143F9600E4801B43A +:10484000009F3F1C083E0D4931600D497160FDF726 +:104850008BF820BC24350C3E0A4931600A4971604E +:10486000B7602F46FDF780F800BD00000010024041 +:1048700000000200004000000000004800003C0072 +:1048800000002800F00F000010010000A83F000801 +:10489000C9285345524B45593F292020FF69202004 +:1048A0000740704708430008C8285345524B4559F4 +:1048B0002920202000B500BFFD6920200540002DE3 +:1048C00002D1FDF727F8F7E77F6AFF20074000BD18 +:1048D00090480008C928534552454D495429202085 +:1048E00000B500BFFD6980200540002D02D1FDF715 +:1048F00011F8F7E73068B8627768083600BD000045 +:10490000D4480008C92853455254595045292020FD +:10491000706831684518706877600746356000B583 +:10492000FBF7EAFD45490008009D019805442D78F4 +:10493000083E35607760FFF7D3FF0098401C009079 +:10494000F2D703B080CE00BDE4420008C72853452B +:1049500052435229083E0D213160776000B5FFF7C0 +:10496000BFFF361F0A213160FFF7BAFF00BD00000C +:10497000643D0008CD2B4641554C54434F4E534F98 +:104980004C45202070470000DC360008CA28494EFC +:1049900049542D534552292000203860002078606A +:1049A0000020B8603068F8600C2038600D20386056 +:1049B00077680836704700008C490008C9494E499D +:1049C000542D53455231202000B5FFF719FF083E02 +:1049D000034931607760034FFFF7DEFF00BD000041 +:1049E000A101000000380140E43F0008C8534552CF +:1049F0004B45593F31202020361F3760024F00B50C +:104A0000FFF74CFF00BD0000003801402C3D0008BE +:104A1000C75345524B455931361F3760024F00B5D9 +:104A2000FFF748FF00BD000000380140EC490008D6 +:104A3000C8534552454D495431202020361F376018 +:104A4000024F00B5FFF74CFF00BD000000380140E9 +:104A5000304A0008C853455254595045312020204F +:104A6000361F3760024F00B5FFF752FF00BD000050 +:104A700000380140AC400008C65345524352312033 +:104A8000361F3760024F00B5FFF764FF00BD00001E +:104A900000380140544A0008C8434F4E534F4C451C +:104AA0003120202000B500BFFCF709FDB04A000806 +:104AB000184A0008F84900083C4A0008604A000803 +:104AC000804A0008104A0008C7434F4E534F4C45D8 +:104AD00000B500BFFCF7F3FCB04A00080449000829 +:104AE000C8494E49542D53455220202000B5FFF7A8 +:104AF0006BFF00BD80400008C62E4153434949204A +:104B00007F2007400C3E202131607760B7607F270F +:104B100000B5FBF78DFC002F80CE00D12E27FDF7CE +:104B2000A1FB00BD4C420008C52E4259544520202F +:104B30005D46AD6B00B520B4FDF75AFE361F3760F9 +:104B40000027FDF7AFFEFDF77FFEFDF77DFEFDF7C9 +:104B5000B3FEFDF799FB20BC5C46A56300BD0000D9 +:104B6000284B0008C52E574F524420205D46AD6BA0 +:104B700000B520B4FDF73CFE361F37600027FDF777 +:104B800091FEFDF761FEFDF75FFEFDF75DFEFDF7AF +:104B90005BFEFDF791FEFDF777FB20BC5C46A5634D +:104BA00000BD0000F84A0008C62E44574F5244206A +:104BB0005D46AD6B00B520B4FDF71AFE361F3760B9 +:104BC0000027FDF76FFEFDF73FFEFDF73DFEFDF709 +:104BD0003BFEFDF739FE361F37603A27FDF724FE0E +:104BE000FDF732FEFDF730FEFDF72EFEFDF72CFE41 +:104BF000FDF762FEFDF748FB20BC5C46A56300BDE7 +:104C000074490008C444554D502020205D46AD6BCA +:104C1000361F71683160756000B5FDF7E9FD3068D9 +:104C20003F18306837600746FBF766FCD94C000830 +:104C3000FDF73AFB009D01980544361F37602F466B +:104C4000FFF7B6FF009D019805442C461034083E3E +:104C5000346077602F4600BFFBF742FC814C0008B0 +:104C6000FDF734FB009D019805442D78361F376011 +:104C70002F46FFF75DFF0098401C0090F0D703B06F +:104C8000361F37600227FDF72FFB009D0198054472 +:104C90002C461034083E346077602F46FBF720FC2A +:104CA000C14C0008009D019805442D78361F3760DF +:104CB0002F46FFF725FF0098401C0090F2D703B065 +:104CC000FDF7C2FA002F80CE01D002B000BD0098DF +:104CD00010300090ACD703B05D46AF6380CEFDF7D7 +:104CE000E3FA00BD68380008C55044554D502020F7 +:104CF0005D46AD6B361F71683160756000B5FDF7BC +:104D000077FD3068054603218D437F1937602F46B4 +:104D1000FBF7F2FB814D0008FDF7C6FA009D0198F4 +:104D20000544361F37602F46FFF742FF009D01986C +:104D300005442C461034083E346077602F4600BF8F +:104D4000FBF7CEFB694D0008FDF7C0FA009D019806 +:104D500005442D68361F37602F46FFF729FF00985E +:104D6000001D0090F0D703B0FDF76EFA002F80CE43 +:104D700001D002B000BD009810300090CCD703B035 +:104D80005D46AF6380CEFDF78FFA00BDA8480008EE +:104D9000C22E532000B5FDF787FAFDF7B9FC032DAD +:104DA0002D200000FBF794FE002F00D180CE19D0FB +:104DB0007F1E361F00213160FBF792FBE54D000896 +:104DC000009D01980544361F37602F46BF00F759F4 +:104DD000361F37600027FDF7A9FD0098401E0090A0 +:104DE000EED703B000BD0000A84B0008C450494FE7 +:104DF0003A20202000B5FCF739FB31688D020B48C2 +:104E00002D18361F37602F46FDF72AFB0125BD40C0 +:104E1000361F37602F46FDF723FB31684D013D43B8 +:104E20002F46361DFDF71CFB00BD000000000048AA +:104E3000BC490008C250412000B500BFFCF73FFB51 +:104E400000000000344E0008C250422000B500BFF0 +:104E5000FCF735FB01000000484E0008C25043201B +:104E600000B500BFFCF72BFB020000005C4E000801 +:104E7000C250442000B500BFFCF721FB0300000036 +:104E8000704E0008C250452000B500BFFCF717FB6C +:104E900004000000844E0008C250462000B500BF48 +:104EA000FCF70DFB05000000784A0008C653455486 +:104EB00050494E203D687F682F8380CE70470000A8 +:104EC000AC4E0008C6434C5250494E203D687F68A6 +:104ED0006F8380CE70470000F4470008C6474554F2 +:104EE00050494E203D687F682D693D40002D01D11D +:104EF000002701E001277F42012007407047202062 +:104F000003200740BD003D432F012F433D023D4399 +:104F10002F042F43704720200F2007407F000325D8 +:104F2000BD402F467047202030683760074600B5E7 +:104F3000FFF7E6FF306837600746FFF7EDFF35689B +:104F40003D40356000BD2020BD680F200540361F64 +:104F50007168316077602F4600B5FFF7E5FF75682F +:104F60002D683168716037602F4600BD984E00088B +:104F7000C9495350494E4D4F4445202000B5FFF7D5 +:104F8000E3FF3F1CFCF7F0FC00BD20200F20074092 +:104F90003D013D432F022F433D043D432F467047C3 +:104FA00007253D40AD000F24AC40082007407F0896 +:104FB000361F34607047202030683760074600B5E0 +:104FC000FFF7E4FF306837600746FFF7E9FF80B47A +:104FD000376871680F4020BC77602F4600BD000025 +:104FE000704F0008C9494E5055544D4F444520203C +:104FF00000B500BFFCF763FA00000000C44E0008D3 +:10500000CA4F55545055544D4F44452000B500BF2C +:10501000FCF755FA0100000064410008C641464D06 +:105020004F44452000B500BFFCF749FA02000000DC +:10503000984A0008CA414E414C4F474D4F444520C5 +:1050400000B500BFFCF73BFA03000000904D0008DC +:10505000C74953494E505554361F0021316000B5A1 +:10506000FFF78CFF00BD0000E04A0008C849534F1D +:105070005554505554202020361F0121316000B571 +:10508000FFF77CFF00BD0000644B0008CA4953468F +:10509000554E4354494F4E2000B580B4009F361FF3 +:1050A00002213160FFF76AFF009DAD680F200540C7 +:1050B000361F37602F46FFF77FFF20BC2D68203555 +:1050C000ED192F46FCF750FC00BD00006C500008A5 +:1050D000C84953414E414C4F47202020361F0321E1 +:1050E000316000B5FFF74AFF00BD000050500008D6 +:1050F000C7495350494E4F4430680028EFF30080B1 +:1051000001B4361D01BC80F3008800B506D03D68AF +:105110007F6869683943696080CE05E03D687F68D3 +:105120006968B943696080CE00BD0000E44F0008A3 +:10513000C9495350494E50555044202000B5FFF7FF +:1051400003FF0C37FCF710FC00BD00001C500008EA +:10515000C94E4F5450554C4C45442020361F002119 +:10516000316000B5FFF7EAFF00BD0000044C000805 +:10517000C850554C4C45445550202020361F012125 +:10518000316000B5FFF7DAFF00BD0000C84A000833 +:10519000CA50554C4C4544444F574E20361F0221AF +:1051A000316000B5FFF7CAFF00BD00008C50000859 +:1051B000CA495350494E53504545442000B5FFF766 +:1051C000C3FE0837FCF7D0FB00BD0000EC4D000823 +:1051D000C84C4F57535045454420202000B500BFD0 +:1051E000FCF76DF90000000070510008CB4D4544FC +:1051F00049554D535045454400B500BFFCF75FF994 +:1052000001000000D0500008C948494748535045A4 +:105210004544202000B500BFFCF751F90300000011 +:10522000E84C0008C94C45444143544956452020A8 +:1052300000B500BFFCF780F99C100020B0510008B9 +:10524000C73C5449434B533E00B500BFFCF774F9CB +:10525000A010002000500008C55449434B532020A3 +:1052600002480568361F37602F467047A01000209F +:105270004C490008C34C445500B500BFFCF71FF96A +:10528000845200080008004840000000460000006A +:1052900074520008C34C445200B500BFFCF70FF92C +:1052A000A452000800080048000200004900000065 +:1052B00094520008C34C444400B500BFFCF7FFF80B +:1052C000C4520008000800488000000047000000A9 +:1052D000B4520008C34C444C00B500BFFCF7EFF8D3 +:1052E000E4520008000800480001000048000000E7 +:1052F00030460008C95359535449434B4552202066 +:1053000023490868401C086022480568002D00B544 +:105310003DD000BF1E4805681F480540002DEFF333 +:10532000008001B4361F37602F4601BC80F300882F +:1053300008D11A4FFFF7CAFD361F3760184FFFF725 +:10534000B9FD24E01748874208D1154FFFF7BEFD8D +:10535000361F3760144FFFF7ADFD18E01348874242 +:1053600008D1114FFFF7B2FD361F3760104FFFF71E +:10537000A1FD0CE00F48874208D10D4FFFF7A6FDB5 +:10538000361F3760054FFFF795FD00E080CE00BD6A +:10539000A01000209C100020FF070000E45200082D +:1053A0008452000800020000A4520008000400001B +:1053B000C452000800060000F0B540464946524677 +:1053C0005B460FB46946F0398B460A1CF03A9546A5 +:1053D0000E46083E341F8C616846C861FFF790FF97 +:1053E0006946F031F0318D460FBC804689469246C1 +:1053F0009B46F0BD361F376000B5FFF73DFEFFF757 +:1054000059FD00BD803B0008CB53544152542D43FD +:105410004C4F434B361F37600E4F00B5FFF7EAFF86 +:10542000361F37600C4FFFF7E5FF361F37600B4F15 +:10543000FFF7E0FF361F3760094FFFF7DBFF094D2D +:10544000094868610320286108496C18FF20207012 +:1054500062B600BD84520008A4520008C45200087D +:10546000E452000800E000E06F170000230D000088 +:10547000DC4E0008CA53544F502D434C4F434B2031 +:10548000024901200D6885430D60704710E000E07F +:1054900008520008C54C4154455220200248056876 +:1054A000ED192F4670470000A0100020745400082A +:1054B000C954494D45444F55543F20200448056880 +:1054C0007F1B002F01D4002701E001277F42704796 +:1054D000A0100020D4520008C24D53200748056890 +:1054E000ED192F4600B500BFFCF714FA0348056814 +:1054F0007D1B002DF8D580CE00BD01BCA010002082 +:10550000EC5700081454000840520008C42F5443BC +:105510004220202000B500BFFBF7D1FF180000009B +:10552000F4520008C85443422E4C494E4B202020D0 +:1055300000B500BFFFF7FFFF000000003450000877 +:10554000C75443422E53535000B500BFFFF7FFFF2F +:105550000400000008540008CA5443422E5354412A +:105560005455532000B500BFFFF7FFFF08000000AF +:1055700024550008C85443422E4D53524320202046 +:1055800000B500BFFFF7FFFF0C00000074550008D6 +:10559000C85443422E4D45534720202000B500BF3C +:1055A000FFF7FFFF10000000B0540008C954434249 +:1055B0002E4556454E54202000B500BFFFF7FFFF93 +:1055C0001400000094540008C44D41494E2020208E +:1055D00000B500BFFBF773FF100F002000000000B4 +:1055E000D8540008C7285041555345294846C1B5ED +:1055F000684659464860096888680028FBD08B4691 +:1056000048688546C1BC814601BC8646704700009B +:105610000C550008864D554C54493F2000B500BF3D +:10562000FCF73BF8A410002058520008C653494E1E +:10563000474C45200348044908600020034908609E +:1056400070470000B10F00080C100020A4100020CB +:1056500030510008C54D554C544920200348044999 +:10566000086004480449086070470000ED550008D0 +:105670000C100020FFFFFFFFA41000202C56000894 +:10568000C6535441545553205D46AD6801218D43A6 +:10569000361F37602F46704780560008C752455363 +:1056A000544152540120B9680143B96080CE70471B +:1056B00090550008C448414C542020200120B9686E +:1056C0008143B96080CE704750510008C453544F95 +:1056D000502020205D462D1C361F37602F4600B518 +:1056E000FFF7ECFFFCF716F900BD000002CE012326 +:1056F00019436A463846F0388546F8610020B8609C +:1057000002B401B43946091E083902B401B4091FB4 +:10571000B96168467860954680CE70475D462D68D1 +:105720003D605D462F6080CE704720205D462D1C79 +:10573000361F37602F4600B53D683068854208D077 +:105740003F685D462D1CBD4202D17768083600BD1A +:10575000F2E735682D683D607768083600BD0000C7 +:10576000C8550008C8494E49544941544520202095 +:10577000361F71683160776000B5FFF7B7FF361FDD +:105780003760FFF7CBFF0120B86080CEFCF7C2F88E +:1057900000BD0000AC550008C95445524D494E416A +:1057A0005445202000B5FFF7C1FFFCF7B3F800BD5A +:1057B00014560008CA494E49542D4D554C544920A1 +:1057C00000B5FFF737FF083E0649316077601827BC +:1057D000FBF768FB034D2D60012003490860FFF7CC +:1057E0003DFF00BD100F0020180F0020000000003A +:1057F000C057000840550008C34849535D462D1C5A +:105800007F1B30683F18361D70470000B4560008F3 +:10581000C953454D4150484F52452020361F3760EF +:10582000082700B5FBF794FE0B4805680C3E0021E5 +:10583000316000217160B7602F46FBF7C1FB3D4628 +:1058400080CE01200543A8473068386070687860D2 +:10585000B7680C3600BD0000381000209C560008C8 +:10586000C65349474E414C2000B5FCF769F83868EB +:10587000401C38600020786080CEFCF76BF800BDDB +:1058800060580008C75245515545535400B500BFF4 +:10589000FCF756F83D68002D04D1FCF75BF8FCF7E7 +:1058A00039F8F5E73868401E38605D462D1C7D608C +:1058B00080CEFCF74FF800BD58550008CA5441533C +:1058C0004B2D434841494E2000B500BFFBF734FE45 +:1058D000A8100020EC510008C45441534B20202054 +:1058E00000B5FCF763FD0C4805680C482D18083E10 +:1058F000356077600A4FFCF74BFDFBF7DBFDFCF7EB +:105900000DFD08480568361F37602F46FCF7A8FDD7 +:1059100004490F6080CE00BD1C100020F001000083 +:10592000E0020000A810002084580008C65354412B +:1059300052543A2000B520BC361F3560FFF718FFDF +:1059400000BD0000B4570008C52E5441534B202021 +:10595000361F3760124F00B53F68002F0ED03D1F35 +:105960002D683068854208D10C3F361DFBF73CFBA3 +:10597000FCF708FEFCF7AAFC00BDEDE780CEFFF7C0 +:1059800017F9FCF7C5FE15206973206E6F74206946 +:105990006E205441534B20636861696E00BD000066 +:1059A000A8100020D0510008C62E5441534B53205C +:1059B000361F3760094F00B53F68002F0BD03D46BA +:1059C0000C3D361F37602F46FBF70EFBFCF7DAFD68 +:1059D000FCF77CFCF0E780CE00BD0000A8100020A2 +:1059E0009C440008C82E52554E4E494E4720202058 +:1059F000361F3760064F00B5FCF756FC361F376080 +:105A0000FFF7A6FF3F6802488742F5D180CE00BD70 +:105A1000100F00201276372E3330205B6275696CD0 +:105A20006420303238305D153232204A616E2032C7 +:105A30003032332C2031323A31333A353320202082 +:105A400000B5FCF731FCFCF763FE1C2A2A2A2A2A3F +:105A50002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2AA6 +:105A60002A2A2A2A2A2A2A0000BD202000B5FFF768 +:105A7000E7FFFCF719FCFCF74BFE1C4D5045204698 +:105A80006F727468204C69746520666F722053547D +:105A90004D33324630373200FCF706FC361F376094 +:105AA000154FFDF70DF9FCF711FC361F3760134F4A +:105AB000FDF706F9FCF7F8FBFCF72AFE32436F709E +:105AC0007972696768742028432920323031342084 +:105AD0004D6963726F50726F636573736F722045A7 +:105AE0006E67696E656572696E67204C74642E001E +:105AF000FFF7A6FF00BD0000145A0008275A00084F +:105B000010580008CA524550524F472E494D472061 +:105B100000B500BFFBF7D3FC1C5B0008FC070020AE +:105B20004409002000000000006CDC0200000200BC +:105B3000000800003B1C83CE00D17047021C0A43C2 +:105B40001A430324144006D10A680260091D001D8F +:105B50001B1FF9D170470A780270491C401C5B1E5C +:105B6000F9D1704702CE0124E40773465B1E1A6820 +:105B70000919781A07B480CE7046001D004700004E +:105B800002CEB942EFD180CE01217046884302682F +:105B90001047361F37607046401E076800BD000082 +:105BA00072B670473A4603CE0027121A091A91427C +:105BB00000D2FF437047000001CE3168202400224C +:105BC0004918404113465341C01B5B4101D0491C59 +:105BD00000E0C019641EF3D10F46306070472020EA +:105BE000361F0021316000B5FFF7E6FF361D00BD0E +:105BF0000038014007480568002D03D005480568B6 +:105C000005490D60044805680C2028600D202860B7 +:105C10007047000008000020D400002007480568F5 +:105C2000361F37602F4600BFFD6980200540FBD03E +:105C30003068B8627768083670470000D4000020EA +:105C400004480568ED6920200540361F37602F465F +:105C500070470000D40000200A480568361F3760EE +:105C60002F4600BFFD6920200540FBD07F6AFF2042 +:105C7000074000BF00BF00BF00BF00BF00BF00BFA4 +:105C800000BF7047D400002030683F18306837608C +:105C9000074600B5FFF774FF9D010020009D0198A5 +:105CA00005442D78361F37602F46FFF7B7FF009861 +:105CB000401C0090F2D703B000BD2020361F376093 +:105CC0000D2700B5FFF7AAFF361F37600A27FFF739 +:105CD000A5FF00BD07480568083E35607760064FA0 +:105CE00000B5FFF77DFF00BF7F1E002FFCD180CEE7 +:105CF00000BD01BC0C00002020A10700074805687A +:105D0000083E35607760064F00B5FFF769FF00BFBA +:105D10007F1E002FFCD180CE00BD01BC0C000020F6 +:105D20008813000000B500BFFFF7E8FF7F1E002FBB +:105D3000FAD180CE00BD202000B5FFF731FF054924 +:105D400001200D6805430D6003480449086000BF49 +:105D5000FEE700BD24100240CCCC00000030004023 +:105D600000B500BFFFF715FF200A002000B500BFF7 +:105D7000FFF70FFF240A002000B500BFFFF709FF5F +:105D8000280A002000B500BFFFF703FF2C0A0020FF +:105D900000B500BFFFF7FDFE300A002000B500BFD0 +:105DA000FFF74EFF002F80CE03D0FFF755FF80CEC8 +:105DB000F6E700BD361F3760062700B5FFF72EFF58 +:105DC00000BD2020361F3760152700B5FFF726FFDE +:105DD00000BD2020361F3760182700B5FFF71EFFD3 +:105DE000024901204042086000BD0000300A002046 +:105DF000361F3760074F00B5FFF722FF002F80CE18 +:105E000003D0FFF729FF361D00BD7F1E002FF3D101 +:105E1000014F00BD00004000FFFFFFFF083E0021D2 +:105E2000316077600C4F00B5FFF7E2FF31680F700B +:105E300070683F18FF20074035686D1C0748854291 +:105E4000EFF3008001B477602F46361D01BC80F36C +:105E50000088E9D380CE00BD400A0020C00A00209F +:105E600000B5FFF7B7FFFFF7B5FF00BD00B5FFF7BF +:105E700095FF07490868401C086005480568054803 +:105E8000854202DDFFF7ECFF01E0FFF79BFF00BD5D +:105E90002C0A00200001000007480568083E074959 +:105EA000316077602F4600B500F0BCF90249086800 +:105EB0008030086000BD0000240A0020400A002055 +:105EC00000B5FFF795FFFFF793FF30683F18FF2FEE +:105ED00080CE05D0FFF7CAFFFFF77CFF80CE00BD64 +:105EE00018480568FF200540BD4280CE02D0FFF76C +:105EF000BDFF00BDFFF792FFFFF77AFF30688742D2 +:105F0000EFF3008001B47768083601BC80F30088A5 +:105F100002D0FFF7ABFF00BD0A4805680A480468D5 +:105F2000AC4202DAFFF79CFF00BDFFF7B5FFFFF7B9 +:105F300041FF04490868401C0860044900200860CB +:105F400000BD0000200A0020280A00202C0A0020A2 +:105F5000361F37600A4F00B5FFF772FE002F01D0E1 +:105F6000002701E001277F423068074080CE03D040 +:105F7000FFF7B0FE7F1EEFE780CEFFF761FE00BDAA +:105F8000A086010000B5FFF7E3FF002F80CE03D10C +:105F9000024901204042086000BD0000300A002094 +:105FA0002A49002008602A490020086000B5FFF750 +:105FB000F5FEFF0927490F60306827490860012076 +:105FC000264908601527361DFFF728FEFFF7C0FF9A +:105FD000002F80CE05D1361F37601527FFF71EFE34 +:105FE000F4E700BFFFF7CEFF18480568002D1AD16F +:105FF000FFF732FE042F06D104201449086080CE3A +:10600000FFF7D8FE0FE0182F06D118200F490860BF +:1060100080CEFFF7CFFE06E0012F03D180CEFFF741 +:106020004FFF00E080CE09480568002DDAD0074810 +:106030000568042DEFF3008001B4361F37602F464A +:1060400001BC80F3008800D1002700BD300A002089 +:106050002C0A0020280A0020240A0020200A002000 +:10606000074805688020054000B508D0054D064862 +:10607000686006486860802029698143296100BD05 +:10608000102002400020024023016745AB89EFCD7C +:10609000083E134931607760124F00B53068451EE5 +:1060A000002DEFF3008001B4356001BC80F300885F +:1060B00004D0FD6801200540002DEFD1FD68342497 +:1060C0002C40FC6030680028EFF3008001B42F46BC +:1060D000361D01BC80F3008801D10348074300BD91 +:1060E00000001000002002400000008000B5FFF713 +:1060F000B7FF084901200D6805430D6030683880FE +:1061000077680836FFF7C4FF024901200D68854310 +:106110000D6000BD102002400B483F1A00B5FFF78C +:106120009FFF0A4D02202969014329616F614020C8 +:1061300029690143296180CEFFF7AAFF04490220A3 +:106140000D6885430D6000BD00000008002002407E +:106150001020024000B500BFFFF71BFD340A0020ED +:10616000202F80CE00B503D002490868401C08608B +:1061700000BD0000340A002030683F1830683760E6 +:10618000074600B5FFF7FCFC93060020009D019830 +:106190000544361F37602F46FFF7BEFFFFF7E0FFCD +:1061A00003480568009840190090EFD703B000BD80 +:1061B0001400002005480568083E054931607760F5 +:1061C0002F4600B5FFF7D8FF00BD000010000020EB +:1061D000000000087068054601218D4330680446C0 +:1061E00001218C437F1C01218F433F19376075606B +:1061F000274600B5FFF7C4FC050700203D88009C3A +:1062000001980444083E356077602746FFF76EFF2B +:10621000FFF7A6FFBF1C0098801C0090EED703B0CC +:1062200080CE00BD361F3760802700B5FFF7D2FF54 +:1062300000BD20200F200740092F00B500DDFF1D05 +:106240003037FFF7EBFC00BD3D0B361F37602F46A4 +:1062500000B5FFF7EFFF3D0A361F37602F46FFF707 +:10626000E9FF3D09361F37602F46FFF7E3FFFFF7D1 +:10627000E1FF00BD0845726173696E672006206406 +:106280006F6E652010537461727420586D6F646571 +:106290006D20545820265072657373205220746FFD +:1062A000207265626F6F742C206F74686572207441 +:1062B0006F20726570726F6772616D200645727231 +:1062C0006F7273034E6F20207D1C3F78361F356040 +:1062D00000B5FFF7D9FC00BD00B5FFF7EFFC9C4D02 +:1062E000361F37602F46FFF7AFFF361F3760202776 +:1062F000FFF794FC361F3760014FFFF7E5FF00BD45 +:10630000A007002000B5FFF775FC361F3760322765 +:10631000FFF708FD00BD202000B5FFF7F3FF00BF29 +:10632000284900200860FFF7C9FC361F3760264F58 +:10633000FFF7CAFF361F37601427FFF7F3FCFFF79C +:1063400039FF361F3760214FFFF7BEFFFFF7C4FF4D +:106350001C4900200860FFF7B1FC361F37601C4F56 +:10636000FFF7B2FF361F37601A27FFF757FC1948AF +:106370000568083E1849316077602F46FFF710FE28 +:1063800080CEFFF7A9FF361F37606427FFF7CAFCEE +:10639000FFF794FC361F3760104FFFF795FFFFF7AC +:1063A0005BFCDF200740361F3760FFF737FC522FBA +:1063B00080CEB5D1361F37606427FFF7B3FCFFF7F7 +:1063C000BBFC00BD340A00205807002061070020F4 +:1063D0006807002010000020000000087907002056 +:1063E00005436F707920202000B5FFF78BFFFFF782 +:1063F00065FC361F3760174FFFF766FF361F3760A3 +:106400001427FFF78FFC144900200860083EB1688C +:1064100031607760FFF7B0FEFFF75EFF361F376031 +:106420000A27FFF77FFC4A4D002D02D0B7680C36D3 +:1064300000BDFFF743FC361F3760084FFFF744FFEE +:10644000FFF7C8FEFFF748FF361F37601427FFF736 +:1064500069FC00BD58070020340A0020C408002051 +:1064600000B500BF0C3EF168316031697160B76002 +:10647000FFF7BAFF364D002DF4D1361F3760642781 +:10648000FFF750FCFFF758FC00BD000098570008CC +:10649000CB5245464C4153485541525400B500BF7C +:1064A000FBF74AF8AC1000202C590008C643414CB9 +:1064B0004C49542072B60F480568103E0E493160B1 +:1064C0000E497160B560F7600D4F00B5FAF73AFC00 +:1064D000094DAF600B48E8600B4828610B486861C4 +:1064E00035687768083601200543A847FDF7C6FBE5 +:1064F00000BD0000AC100020000000201C5B000864 +:1065000070090000006CDC0200F8010000080000C7 +:10651000AC640008C75245464C41534804480568DE +:10652000361F37602F4600B5FFF7C4FF00BD0000DF +:106530001C5B0008045B0008C9434F5059464C419E +:106540005348202004480568361F37602F4600B5A1 +:10655000FFF7B0FF00BD0000205B0008BC5800083A +:10656000CA4449534B2D4552524F522000B500BFEB +:10657000FAF7E2FFB010002090640008C8454E44CE +:106580002D4C4F41442020205D460020E8625D46AE +:10659000012040422863704700B500BFFBF746FE6C +:1065A000062F80CEFAD100BD361F3760002700B518 +:1065B00080CEFBF73BFE152F01D0002501E0012521 +:1065C0006D42062F01D0002701E001277F422F43B3 +:1065D000EFF3008001B42F4601BC80F30088E7D0C0 +:1065E00000BD2020361F376000B5FBF73BFE3F0A99 +:1065F000FBF738FEFFF7D0FF00BD202000B500BF3D +:10660000FBF714FE012F80CEFAD100BFFBF71CFE72 +:10661000002F80CE03D0FBF709FE80CEF6E7361FB1 +:1066200037600627FBF71EFE00BD202000B5FBF7F4 +:1066300019FEFFF7E3FF7D1C3F78083E3760756069 +:10664000FFF7D0FFFBF720FE361F37600627FBF76A +:1066500009FEFFF7A9FF02490F6080CE00BD0000D0 +:10666000B0100020361F3760052700B5FBF7FAFD94 +:10667000FBF71AFEFCF74CF8084572726F72202384 +:1066800020000000FCF760F9FBF70EFEFFF77CFF2F +:1066900000BD00007C6500088A53484F574C494EA6 +:1066A00045533F2000B500BFFAF7F7FFB4100020B4 +:1066B000361F3760062700B5FFF7B8FF361F376073 +:1066C0001D4FFFF78FFF361F37600127FFF78AFF47 +:1066D000FFF794FF5D46002028635D46012040429D +:1066E000E862002015490860FCF70AFFFCF77EFB12 +:1066F00013480568002D05D0FBF7D6FDFCF766FBB7 +:10670000FBF7C2FD361F37600E4FFCF70DF8002F68 +:1067100000D180CE0AD0FFF7A5FF5D46AD69361FD8 +:1067200037602F463E1C80CEFCF7EAFE5D462D6B9F +:10673000002DDBD000BD01B4FFFFFFFF941000204F +:10674000B4100020E8360008F0500008C7494E4356 +:106750004C554445361F3760202700B5FCF7D4FB65 +:106760007D1C3C78083E356077602746FAF752FB7F +:10677000FFF79EFF00BD0000E4550008C847454EE6 +:10678000535049425220202030683760074600B5F8 +:10679000FAF71AF8083E002131607760072700BF3A +:1067A000F9F79EFECB670008009D0198054401247F +:1067B000AC40BC4204DA009F0198074403B000BD1E +:1067C0000098401E0090EFD703B0002700BD0000E6 +:1067D00064570008C928494E49545350492920207C +:1067E00000B580B4009F402039688143396080CE75 +:1067F000FFF7CAFFFF0007480743009D2F60009F77 +:106800000548786080BC402039680143396080CEFB +:1068100000BD000007030000001700004C670008DF +:10682000CD535049325F4E43535F4D454D53202069 +:1068300000B500BFFAF743FE3C68000800080048B6 +:106840000100000040000000F8570008C8535049FC +:10685000325F53434B20202000B500BFFAF72FFED4 +:106860006468000800040048002000002D000000BB +:1068700038650008C9535049325F4D49534F2020B5 +:1068800000B500BFFAF71BFE8C6800080004004842 +:10689000004000002E00000074680008C9535049F1 +:1068A000325F4D4F5349202000B500BFFAF707FE75 +:1068B000B468000800040048008000002F000000B9 +:1068C000D4670008C8495353504950494E202020EE +:1068D000083E00213160776000B5FEF7DDFB361F12 +:1068E00003213160FEF76AFC00BD000098660008D5 +:1068F000CA53454C494F2D5350493220174D184C1F +:10690000696921436961A96AA143A962134D154CC4 +:10691000E9692143E9612969A1432961124D083ED2 +:10692000356077602F4600B5FEF7A6FB083E0121D3 +:1069300031607760FEF742FCFEF7BCFA361F376025 +:106940000A4FFFF7C5FF361F3760094FFFF7C0FF3B +:10695000361F3760074FFFF7BBFF00BD0010024036 +:106960000000C000004000003C68000864680008A7 +:106970008C680008B468000890510008C75350495B +:106980005843484730683873361D00B5FAF710FB96 +:10699000FAF70EFBFAF70CFBFAF70AFBBD68832047 +:1069A0000540032DFAD13F7BFF20074000BD0000CA +:1069B0004C680008C8535049464C55534820202085 +:1069C000361F3760044F00BFBD680120054001D06D +:1069D000FD68F9E780CE704700380040CC560008CB +:1069E000C453504921202020361F3760024F00B584 +:1069F000FFF7C8FF80CE00BD00380040E069000806 +:106A0000C453504940202020083EFF213160776068 +:106A1000024F00B5FFF7B6FF00BD00000038004090 +:106A2000C4680008C8494E495453504932202020B8 +:106A300000B5FFF763FF0C3E054931600549716001 +:106A4000B760054FFFF7CCFEFFF7BAFF00BD0000AF +:106A5000006CDC0240420F0000380040485900083A +:106A6000C52E535049322020083E044931607760DA +:106A7000402700B5FEF73CF900BD0000003800409B +:106A8000B4690008C853504944454C41592020205E +:106A9000361F3760092700BF7F1E002FFCD180CE34 +:106AA000704700009C680008C943534C4F5F4D4538 +:106AB0004D53202000B5FFF7EBFF361F3760034F23 +:106AC000FEF704FAFFF7E4FF00BD00003C68000891 +:106AD000A86A0008C9435348495F4D454D532020DB +:106AE00000B5FFF7D5FF361F3760034FFEF7E2F919 +:106AF000FFF7CEFF00BD00003C680008E459000825 +:106B0000C94D454D535F494E5431202000B500BF5B +:106B1000FAF7D5FC186B00080008004802000000D6 +:106B200041000000006B0008C94D454D535F494EC0 +:106B30005432202000B500BFFAF7C1FC406B0008BA +:106B4000000800480400000042000000146500082E +:106B5000CD4C33474432305F5752495445312020A1 +:106B600000B5FFF7A7FF3F200740FFF73DFFFFF706 +:106B70003BFFFFF7B5FF00BDD8580008CC4C3347AA +:106B80004432305F524541443120202000B5FFF7A8 +:106B900091FF3F20074080200743FFF725FFFFF7C5 +:106BA00033FFFFF79DFF00BD7C6B0008CC4C3347E3 +:106BB0004432305F524541444E2020203068002846 +:106BC00000B502D1B7680C3600BDFFF773FF3F2058 +:106BD0000740C0200743FFF707FF30683F183068C1 +:106BE00037600746F9F77CFC056C0008FFF70CFFDF +:106BF000009D019805442F7080CE0098401C0090A5 +:106C0000F4D703B0FFF76CFF00BD0000D46A0008A2 +:106C1000C95345544D41534B4C332020361F7168A6 +:106C20003160776000B5FFF7B1FF3068C5433D4084 +:106C3000B06805437768B5600836FFF791FF00BD7F +:106C4000006A0008C5424F524C332020361F71683D +:106C5000316000B5FFF7E2FF00BD0000AC6B00083B +:106C6000C6424249434C3320361F716831600021CF +:106C7000716000B5FFF7D2FF00BD0000106C000886 +:106C8000D04C33474432305F5245424F4F54434D0E +:106C900044202020083E802131607760242700B501 +:106CA000FFF7D4FF00BD000020680008D44C334734 +:106CB0004432305F47455444415441535441545544 +:106CC00053202020361F3760272700B5FFF75EFFCF +:106CD00000BD0000A8590008CB494E49542D4C3343 +:106CE0004744323000B5FFF7A3FE1E4D083E356025 +:106CF00077602F46FEF7B0F9FEF730FA1A4D083EDE +:106D0000356077602F46FEF7A7F9FEF727FA083EB1 +:106D10000F21316077602027FFF722FF083E002116 +:106D2000316077602127FFF71BFF083E00213160AB +:106D300077602227FFF714FF083E902131607760CB +:106D40002327FFF70DFF083E40213160776024279D +:106D5000FFF706FF083E0021316077602E27FFF71E +:106D6000FFFE00BD186B0008406B0008606A000859 +:106D7000D74C33474432305F494E5431494E544525 +:106D80005252555054434D44002F01D1002701E089 +:106D900001277F4280200740083E802131607760D4 +:106DA000222700B5FFF73AFF00BD0000706D000814 +:106DB000D74C33474432305F494E5432494E5445E4 +:106DC0005252555054434D44002F01D1002701E049 +:106DD00001277F4208200740083E08213160776084 +:106DE000222700B5FFF71AFF00BD0000286B00083E +:106DF000C2545220361F37600F2700B5FFF7C6FE7A +:106E0000FDF796FE00BD0000506B0008C8415849D0 +:106E1000534441544120202000B500BFFAF74FFBF6 +:106E2000000200207C690008C85245414441584591 +:106E30005320202000B500BF361F37602727FFF7FB +:106E4000A5FE0820074080CEF6D00C3E062131601A +:106E500003497160B7602827FFF7B0FE00BD00004E +:106E600000020020B06D0008C52E41584553202077 +:106E700000B5FBF719FA361F3760164FFBF748FCD1 +:106E80000458203D2000000000217D5E361F376041 +:106E90002F46FBF759FDBF1CFBF73AFC0459203D78 +:106EA0002000000000217D5E361F37602F46FBF773 +:106EB0004BFDBF1CFBF72CFC045A203D20000000BA +:106EC00000217D5E361F37602F46FBF73DFDBF1C5E +:106ED00080CE00BD00020020286E0008C852454147 +:106EE000445445535420202000B5FFF7FBFE00BF5B +:106EF000FFF7A0FFFFF7BCFF361F37606427FEF7E0 +:106F0000EDFAFBF7A1F9002F80CEF1D000BD000013 +:106F10007C670008CA55534552425554544F4E2081 +:106F200000B500BFFAF7CBFA2C6F0008000000484C +:106F30000100000000000000686E0008C74C4544D6 +:106F4000534F4646361F3760094F00B5FDF7BEFF69 +:106F5000361F3760074FFDF7B9FF361F3760064F02 +:106F6000FDF7B4FF361F3760044FFDF7AFFF00BDDC +:106F700084520008E4520008C4520008A4520008D9 +:106F8000806C0008C45856414C2020200348002142 +:106F9000455E361F37602F46704700000002002014 +:106FA000F0680008C45956414C20202003480021B5 +:106FB000455E361F37602F467047000002020020F2 +:106FC00060650008C45A56414C2020200348002127 +:106FD000455E361F37602F467047000004020020D0 +:106FE000F06D0008C74F4E4C594C454400B5FFF7B3 +:106FF000A9FFFDF75FFF361F3760FA27FEF76EFA2D +:1070000000BD0000846F0008C844454D4F4D454DFC +:107010005320202000B5FBF747F9FBF779FB2C54F0 +:107020006865204C4544732077696C6C20666F6CF2 +:107030006C6F7720746865206D6F74696F6E206F58 +:10704000662074686520626F61726400FBF72CF93A +:10705000FBF75EFB1F756E74696C20796F7520708D +:1070600072657373207468652055534552206275AC +:1070700074746F6E354900200860FFF763FFFFF7F7 +:1070800031FE361F3760324FFDF7E6FFFFF7D2FEC5 +:10709000FFF77CFF002F00D57F42FFF787FF002F0F +:1070A00000D57F4230688742EFF3008001B47768F3 +:1070B000083601BC80F3008815DAFFF767FF282F38 +:1070C00080CE04DD361F3760224FFFF78FFFFFF7BA +:1070D0005DFF2820C74280CE04DA361F37601E4F7E +:1070E000FFF784FF14E0FFF761FF282F80CE04DD57 +:1070F000361F3760194FFFF779FFFFF757FF28203A +:10710000C74280CE04DA361F3760154FFFF76EFF97 +:10711000FAF700FC361F37600D4FFDF7E3FE002F36 +:1071200080CEB3D0FAF7F6FB361F3760084FFDF775 +:10713000D9FE002F80CEF5D1FFF704FF03490120CF +:1071400040420860FBF7B0F800BD00009C10002032 +:107150002C6F0008A4520008E45200088452000872 +:10716000C4520008606C0008C652502D454E4420A1 +:1071700000B500BFFAF7A3F900400020B8000000F6 +:1071800000100020000000000000000000000000CF +:1071900000000000B00F000800000000E800000040 +:1071A0000000000000000000000000001810002097 +:1071B00000000000000000000000000000000000CF +:1071C00000000000B00F000800000000BC21000813 +:1071D00010000000AC6C0008246A00085456000837 +:1071E0003C6F0008D86C000824520008E46F0008C7 +:1071F000446C0008687100080C6E0008DC6E000822 +:10720000846A000808700008A46F0008C46F0008B2 +:10721000146F000800000000AC2B00080000000004 +:10722000EC57000801000000000000000000000012 +:10723000DC5500080038014000000000000000009C +:10724000000000000000000000000000000000003E +:00000001FF diff --git a/mwmouse/sources/LITESTM32F072SA.img b/mwmouse/sources/LITESTM32F072SA.img Binary files differ. diff --git a/mwmouse/sources/LITESTM32F072UF.hex b/mwmouse/sources/LITESTM32F072UF.hex @@ -0,0 +1,225 @@ +:020000040800F2 +:10000000C03E00208D01000805010008070100081E +:10001000090100080B0100080000000000000000BA +:100020000000000000000000000000000F010008B8 +:10003000110100080000000013010008150100086C +:1000400000000000000000000000000000000000B0 +:1000500000000000000000000000000000000000A0 +:100060000000000000000000000000000000000090 +:100070000000000000000000000000000000000080 +:100080000000000000000000000000000000000070 +:100090000000000000000000000000000000000060 +:1000A0000000000000000000000000000000000050 +:1000B0000000000000000000000000000000000040 +:1000C0000000000000000000000000000000000030 +:1000D0000000000000000000000000000000000020 +:1000E0000000000000000000000000000000000010 +:1000F0000000000000000000000000000000000000 +:10010000640D0008FEE7FEE7FEE7FEE7FEE7FEE718 +:10011000FEE7FEE7FEE72020174D01202968014396 +:100120002960361F37602F4600B500BF3D680220AA +:100130000540FBD01120114908601148786000206B +:10014000F862104839680143396000BF3D680E48C5 +:100150000540FBD03D1D0C3E032131600221716042 +:10016000B7602F4600F0A4FA7D680C200540082DEA +:10017000FAD180CE00BD01BC001002400020024038 +:1001800000801004000000010000000200B500BF64 +:10019000104D85F30888104D85F30988022585F3F5 +:1001A0001488BFF36F8F0D4E0D4883460D490E48DE +:1001B0000D6805430D600D490D480D6885430D60C0 +:1001C000FFF7AAFF0B48056801200543A847DFE7B2 +:1001D00000BD0000C03E0020403F0020B43F002092 +:1001E000C03F00201410024014007E00281002407E +:1001F00000007E000001000802CE0124E4077346DF +:100200005B1E1A680919781A07B480CE7046001D63 +:100210000047000002CEB942EFD180CE01217046E6 +:1002200088430268104700000120384380CE004711 +:100230007047202080CE704703CE002200238142E9 +:1002400000DB0122B94200DC012300271A4200D062 +:10025000FF4370473A4603CE0027121A091A91420B +:1002600000D2FF43704700003846316840B40A04AA +:10027000120C0B0C0404240C050C164666431F4696 +:100280006F4318466043010C000436184F4128465E +:100290005043010C000436184F41354640BC3560D0 +:1002A0007047202031684F43361D704735687D40C8 +:1002B00000B520B4002F00D57F423568002D00D551 +:1002C0006D423560FFF7D0FF20BC002D01D500F056 +:1002D000C9F800BD01CE31682024002249184041F0 +:1002E00013465341C01B5B4101D0491C00E0C019BB +:1002F000641EF3D10F4630607047202000B580B4F3 +:1003000035687D4020B480B480CE00F0C1F8009DF7 +:10031000002D00D56D42361F37602F46FFF7DAFFFC +:100320001548074020BC002D01D4002501E001251F +:100330006D42002DEFF3008001B43068376007464E +:1003400001BC80F3008800D57F4220BC002DEFF374 +:10035000008001B430683760074601BC80F3008834 +:1003600008D57F423068002804D07F1E009D306889 +:100370002D1A356001B000BDFFFFFF7F00B530686A +:1003800001B480B480CE00F083F8009D002D00D52C +:100390006D42361F37602F46FFF79CFF20BC009C44 +:1003A0006C40002C00D57F4220BC002DEFF3008074 +:1003B00001B430683760074601BC80F3008800D57F +:1003C0007F4230683760074600BD202000B580B40A +:1003D0003168CF1720BC361F37602F46FFF7CEFF9E +:1003E00000BD202000B580B43168CF1720BC361F77 +:1003F00037602F46FFF7C2FF361D00BD361F0021B4 +:10040000316000B5FFF766FF361D00BD00B5FFF790 +:10041000DDFF80CE00BD202000B580B480CEFFF788 +:1004200045FF20BC361F37602F46FFF7A7FF00BDF2 +:1004300000B5FFF7F1FF361D00BD202000B5FFF726 +:100440009DFF361D00BD000007CE80184F41361FAE +:100450003060704707CE101AB9410F46361F306022 +:1004600070470000306800214042B9410F463060BB +:10047000704700003F1C80CE00D57F4270470000CF +:100480003F1C80CEEED47047002F00D57F427047CE +:100490003F1CE7D470470000B800002801DC80CE84 +:1004A00070473758011F72583250081CFAD1361D58 +:1004B000704700003B1C83CE00D17047021C0A43EA +:1004C0001A430324144006D10A680260091D001D66 +:1004D0001B1FF9D170470A780270491C401C5B1E33 +:1004E000F9D170473B1C83CE00D17047C018C918A2 +:1004F000021C0A431A430324144006D1091F001F9B +:100500000A6802601B1FF9D17047491E401E0A7815 +:1005100002705B1EF9D170473A1C83CE002803D0CD +:100520000A70491C401EFBD170472020361F3760DF +:10053000002700B5FFF7F0FF00BD000003CE3F1C11 +:1005400007D002780B78401C491C9A4201D17F1ECB +:10055000F7D102D101277F4200E000277047000059 +:10056000361F3760009F7F1E3978C919091D032285 +:100570009143491C0091704700B5FFF7F1FF00BDA2 +:1005800000B5FFF7EDFF7D1C3F78361F356000BDDD +:100590000120074380B480CE70470000361F3760CB +:1005A00080BC012087437047361F3760009F0120C1 +:1005B00087437047361F37607046401E076800BD8E +:1005C000361F37607046401E076800BD361F376013 +:1005D0007046401E07683F6800BD361F3760704692 +:1005E000401E07685F4400BD70477046401E0068AB +:1005F00001680122114308BC9E460847361F376038 +:10060000202700B500F0A4F900BD2020002F00DC59 +:100610000027361F3760002700B500BFFFF7FAFD3F +:1006200033060008FFF7EAFF0098401C0090F9D756 +:1006300003B000BD0F200740092F00B500DDFF1DEE +:10064000303700F085F900BD3D09361F37602F4671 +:1006500000B5FFF7EFFFFFF7EDFF00BD3D0B361FC5 +:1006600037602F4600B5FFF7E5FF3D0A361F3760BC +:100670002F46FFF7DFFF3D09361F37602F46FFF794 +:10068000D9FFFFF7D7FF00BD3D0C361F37602F465F +:1006900000B5FFF7E3FFFFF7E1FF00BD00B5FFF78F +:1006A000F3FF00BD00B500BFFFF79FFF0000002073 +:1006B0003D683068C4432C40706804433C60B768B0 +:1006C0000C36704700B500BF3D68002D04D03D6872 +:1006D0007C682C600837F7E780CE00BD1A4D2C46A9 +:1006E0003034103E0321316000217160B560F76045 +:1006F000274600B5FFF7DCFF1448796901437961AB +:100700001248B96A8143B9621148B9690143B961B4 +:100710000F48F9688143F9600E4801B4009F3F1CFF +:10072000083E0D4931600D497160FFF7C1FF20BCE3 +:1007300024350C3E0A4931600A497160B7602F4682 +:10074000FFF7B6FF00BD00000010024000000200ED +:10075000004000000000004800003C0000002800AD +:10076000F00F000010010000FF69202007407047D3 +:1007700000B500BFFD6920200540002D02D1FFF724 +:1007800091FFF7E77F6AFF20074000BD00B500BF7B +:10079000FD6980200540002D02D1FFF783FFF7E7B8 +:1007A0003068B8627768083600BD2020706831680C +:1007B0004518706877600746356000B5FFF72AFD79 +:1007C000E1070008009D019805442D78083E35603A +:1007D0007760FFF7DBFF0098401C0090F2D703B072 +:1007E00080CE00BD083E0D213160776000B5FFF777 +:1007F000CDFF361F0A213160FFF7C8FF00BD202062 +:100800007047202000203860002078600020B86009 +:100810003068F8600C2038600D2038607768083642 +:100820007047202000B5FFF759FF083E03493160AB +:100830007760034FFFF7E6FF00BD0000A101000055 +:1008400000380140361F3760024F00B5FFF78CFFBC +:1008500000BD000000380140361F3760024F00B570 +:10086000FFF786FF00BD000000380140361F3760EB +:10087000024F00B5FFF78AFF00BD000000380140BD +:10088000361F3760024F00B5FFF790FF00BD000034 +:1008900000380140361F3760024F00B5FFF7A2FF56 +:1008A00000BD00000038014000B500BFFFF782FE28 +:1008B000B408000858080008440800086C0800083C +:1008C000800800089408000800B500BFFFF772FE1A +:1008D000B408000800B5FFF7A5FF00BD00B500BFD4 +:1008E000FFF77BFE0000000000B500BFFFF775FEBC +:1008F0001800000000B500BFFFF76FFE1C000000ED +:1009000000B500BFFFF769FE2000000000B500BF82 +:10091000FFF763FE2400000000B500BFFFF75DFE97 +:100920002800000000B500BFFFF757FE2C000000B4 +:100930005D46ED6A2D6800B501200543A84700BD5E +:100940005D46ED6A6D6800B501200543A84700BD0E +:100950005D4624352978491C29705D46AD6AAD682D +:1009600000B501200543A84700BD20205D46243581 +:100970002978C91929705D46AD6AED6800B5012076 +:100980000543A84700BD20205D462435002028707F +:100990005D46AD6A2D6900B501200543A84700BD3D +:1009A00000B5FFF7DDFD7D1C3F78361F3560FFF792 +:1009B000DDFF00BD361F3760004F01E0DC0D000891 +:1009C00000B500BF3D68002D0FD03D460C353C689A +:1009D0007B680C3E33607560B7602746FFF76AFDA1 +:1009E0003D68ED190C352F46ECE780CE00BD202088 +:1009F00000B5FFF731FFFE2F80CE01D000F07EF969 +:100A000000BD202000B5FFF731FFFFF7F1FF00BD6B +:100A100000B5FFF721FF361F3760FE27FFF726FFDF +:100A200000BD2020083E0021316077600D4F00B5E9 +:100A3000FFF750FCFFF71AFF083E00213160776096 +:100A4000094FFFF747FCFFF711FF083E0021316017 +:100A50007760064FFFF73EFCFFF708FFFFF706FF42 +:100A600000BD0000000000010000010000010000C6 +:100A700000B5FFF7CDFF3F06FFF7CAFF3F04306820 +:100A80003F18361DFFF7C4FF3F0230683F18361D80 +:100A9000FFF7BEFF30683F18361D00BD5D46AD69EB +:100AA000361F37602F46361F376037463168CF1BF9 +:100AB0003F1FBF10361D704700B5FFF7EFFF361F11 +:100AC0003760FFF7AFFF002F00D180CE17D07F1E19 +:100AD000361F0021316000BFFFF78EFBFF0A0008C0 +:100AE000009D01980544361F37602F46BF00F75917 +:100AF000FFF798FF0098401E0090F1D703B000BDAB +:100B00005D46AD69361F37602F463E1C80CE00B56E +:100B1000FFF7AEFF361F3760002700BFFFF77AFBF5 +:100B2000330B0008FFF7A4FF0098401C0090F9D792 +:100B300003B000BD361F3760842700B5FFF762FFA2 +:100B4000FFF796FF00BD2020361F3760812700B5D4 +:100B5000FFF758FFFFF78CFF00BD2020361F3760DE +:100B6000822700B5FFF74EFFFFF780FE00BD202073 +:100B7000361F3760832700B5FFF744FFFF2007408B +:100B8000361F3760FFF772FE30683F1830683760F5 +:100B9000074600BFFFF73EFBB90B0008009D019818 +:100BA00005442D78361F37602F46FFF75FFE00980B +:100BB000401C0090F2D703B000BD2020361F3760E4 +:100BC0000D2700B5FFF7CAFF361F37600A27FFF76A +:100BD000C5FF00BD00B500BFFFF7ECFCE00B00084F +:100BE000480B0008340B00085C0B0008700B000871 +:100BF000BC0B000800B5FFF783FF3D4680CE012007 +:100C00000543A847361F3760FF27FFF72FFEFFF782 +:100C100053FF00BD00B5FFF72BFF3F88FFF702FF32 +:100C200000BD202000B5FFF723FFFFF721FF30684C +:100C300038807768083600BD00B5FFF719FF3F78A8 +:100C4000FFF714FE00BD202000B5FFF711FFFFF7EE +:100C50000FFF306838707768083600BD00B5FFF7C1 +:100C600007FF3F68FFF7DEFE00BD202000B5FFF75D +:100C7000FFFEFFF7FDFE306838607768083600BD7C +:100C800000B5FFF7F5FEFFF7F3FE30683F18306858 +:100C900037600746FFF7BEFAB50C0008FFF7B8FE4D +:100CA000009D019805442F7080CE0098401C009054 +:100CB000F4D703B000BD2020361F3760FD2700B5F4 +:100CC000FFF7D4FD00F01AF800BD0000F40B000897 +:100CD000700A0008240A0008000B0008B80A00087F +:100CE000140C0008240C0008380C0008480C0008FC +:100CF0005C0C00086C0C0008800C00085D46ED6977 +:100D000000B5AD46FFF7A8FD7F1E0B2F01D9FD27CB +:100D100022E0361F3760FE27FFF7A8FDBF0010480E +:100D20003F183F683D4680CE01200543A847FFF7A6 +:100D30005FFEFFF7B3FE1E2F80CE0AD95D46AD6978 +:100D4000361F37602F463E1C80CE361F3760FC278B +:100D500002E0361F3760FF27FFF788FDD2E700BDAE +:100D6000CC0C000800B5FFF719FC6F465D46EF613B +:100D700080CE361F376037465D46AF615F46084814 +:100D8000B8625F460648F86280CEFFF713FEFFF7B1 +:100D9000A1FD5D460A202862FFF7B0FF00BD0000FC +:100DA000E00B000800B5FFF7FBFD0E4D504520534A +:100DB000544D33324630373220000000FFF7F0FD4B +:100DC0000A556D62696C6963616C2000FFF7E8FD8C +:100DD00005466F727468000000BD0000040000004A +:100DE00000000020000000003002000800000000A9 +:00000001FF diff --git a/mwmouse/sources/LITESTM32F072UF.img b/mwmouse/sources/LITESTM32F072UF.img Binary files differ. diff --git a/mwmouse/sources/LibM0M1.fth b/mwmouse/sources/LibM0M1.fth @@ -0,0 +1,138 @@ +\ ARM Cortex CPU specific library code + +(( +Copyright (c) 2000..2003, 2010 +MicroProcessor Engineering +133 Hill Lane +Southampton SO15 5AF +England + +tel: +44 (0)23 8063 1441 +fax: +44 (0)23 8033 9691 +net: mpe@mpeforth.com + tech-support@mpeforth.com +web: www.mpeforth.com + +From North America, our telephone and fax numbers are: + 011 44 23 8063 1441 + 011 44 23 8033 9691 + + +To do +===== + +Change history +============== +20100204 MPE002 Cortex conversion. +20040211 MPE001 Added @ON and @OFF. +)) + +only forth definitions +decimal + +\ ========= +\ *! libm0m1 +\ *T ARM Cortex specific library code +\ ========= +\ *P The code in *\i{Cortex/LibCortex.fth} is conditionally +\ ** compiled by the following code fragment to be found at the +\ ** end of many control files. +\ *E libraries \ to resolve common forward references +\ ** include %CpuDir%/LibCortex +\ ** include %CommonDir%/library +\ ** end-libs +\ *P Each definition in a library file is surrounded by +\ ** a phrase of the form: +\ *C [required] <name> [if] : <name> ... ; [then] +\ *P The phrase *\fo{[REQUIRED] <name>} returns true if *\fo{<name>} +\ ** has been forward referenced and is still unresolved. +\ ** The code between *\fo{LIBRARIES} and *\fo{END-LIBS} is repeatedly +\ ** processed until no further references are resolved. + + +\ ****************** +\ *S I/O initialisation +\ ****************** + +[required] init-io [if] +: init-io \ addr -- +\ *G Copy the contents of the I/O set up table to an I/O device. +\ ** Each element of the table is of the form addr (cell) followed +\ ** by data (cell). The table is terminated by an address of 0. +\ ** A table of a single 0 address performs no action. + begin + dup @ + while + dup 2@ ! 2 cells + + repeat + drop +; +[then] + + +\ ************************** +\ *S interrupt enable and disable +\ ************************** + +[required] di [if] +code di \ -- +\ *G Disable interrupts. + cps .id .i + next, +end-code +[then] + +[required] ei [if] +code ei \ -- +\ *G Enable interrupts. + cps .ie .i + next, +end-code +[then] + +[required] [i [if] +code [I \ R: -- x1 x2 +\ *G Preserve interrupt/exception status on the return stack, +\ ** and disable interrupts/exceptions except reset, NMI and +\ ** HardFault. The state is restored by *\fo{I]}. + mrs r0, PRIMASK \ get status + cps .id .i + push .n { r0 } + next, +end-code +[then] + +[required] i] [if] +code I] \ R: x1 x2 -- +\ *G Restore interrupt status saved by *\fo{[I} from the return +\ ** stack. + pop .n { r0 } + msr PRIMASK r0 + next, +end-code +[then] + + +\ **************** +\ *S Miscellaneous +\ **************** + +[required] @off [if] +: @OFF \ addr -- x +\ *G Read cell at addr, and set it to 0. + dup @ swap off +; +[then] + +[required] @on [if] +: @on \ addr -- val +\ *G Fetch contents of cell at addr and set it to -1. + dup @ swap on +; +[then] + + +\ ====== +\ *> ### +\ ====== + diff --git a/mwmouse/sources/Macros.fth b/mwmouse/sources/Macros.fth @@ -0,0 +1,29 @@ +\ ARM Cortex assembler macros + +(( +Copyright (c) 1988-2001, 2009 +MicroProcessor Engineering +133 Hill Lane +Southampton SO15 5AF +England + +tel: +44 23 8063 1441 +fax: +44 23 8033 9691 +net: mpe@mpeforth.com + tech-support@mpeforth.com +web: www.mpeforth.com +)) + +only forth also c-c also assembler +also asm-access definitions + +: NEXT, \ -- + Thumb? if + bx r14 + else + mov pc, link + endif +; + +only forth definitions + diff --git a/mwmouse/sources/MultiCM0lite.fth b/mwmouse/sources/MultiCM0lite.fth @@ -0,0 +1,508 @@ +\ MultiCM0lite.fth - ARM Cortex-M0 v7 Lite Multi-Tasker + +(( +Copyright (c) 2010, 2011, 2014 +MicroProcessor Engineering +133 Hill Lane +Southampton SO15 5AF +England + +tel: +44 (0)23 8063 1441 +fax: +44 (0)23 8033 9691 +net: mpe@mpeforth.com + tech-support@mpeforth.com +web: www.mpeforth.com + +From North America, our telephone and fax numbers are: + 011 44 23 8063 1441 + 011 44 23 8033 9691 + + +To do +===== + +Change history +============== +20140210 MPE002 Conversion for Lite kernel +20110627 MPE001 Cortex-M0/M1 conversion. + + +******************** +Resource definitions +******************** + + For Cortex-M0/M1 the following register usage is the default: + r15 pc program counter + r14 link link register; bit0=1=Thumb, usually set + r13 rsp return stack pointer + r12 -- + r11 up user area pointer + r10 -- + r9 lp locals pointer + r8 -- + r7 tos cached top of stack + r6 psp data stack pointer + r0-r5 scratch +)) + +\ =========== +\ *! multicortex +\ *T ARM Cortex-M0/M1 multitasker +\ =========== +\ *P The ARM Cortex multitasker follows the model introduced +\ ** with the v6.1 compilers. + + +\ **************************** +\ *S TCB data structure layout +\ **************************** +\ *E cell LINK link to next task +\ ** cell SSP Saved Stack Pointer +\ ** cell STAT Bit 0 1 = running, 0 = halted +\ ** Bit 1 1 = message pending +\ ** Bit 2 1 = event triggered +\ ** Bit 3 1 = event handler run +\ ** Bit 4..7 Reserved +\ ** others 1 = set to run task, available to user +\ ** cell TASK Task that sent message here +\ ** cell MESG Message address +\ ** cell EVNTw CFA of word run as event handler +\ *P This structure is allocated at the start of the *\fo{USER} +\ ** area. Consequently the *\fo{TCB} of the current task is given +\ ** by *\fo{UP}. + +struct /TCB \ -- size +\ *G The structure used by the code that matches the +\ ** description above. + ptr tcb.link \ link to next task ; MUST BE FIRST + ptr tcb.ssp \ Saved Stack Pointer + int tcb.status \ status word + int tcb.msrc \ message source + int tcb.mesg \ message + ptr tcb.event \ xt of word which is event handler +end-struct + +\ bit masks for the status cell +$0001 equ run-mask run-mask invert equ ~run-mask \ running + 0 equ run-bit# +$0002 equ msg-mask msg-mask invert equ ~msg-mask \ message available + 1 equ msg-bit# +$0004 equ trg-mask trg-mask invert equ ~trg-mask \ event triggered + 2 equ trg-bit# +$0008 equ evt-mask evt-mask invert equ ~evt-mask \ event run + 3 equ evt-bit# + + +\ ****************** +\ Consistency checks +\ ****************** + +/tcb tcb-size <> [if] + cr ." Control file and tasker disagree as to TCB size" abort +[endif] + + +\ *************************** +\ *S Task handling primitives +\ *************************** + +cdata \ so that comma is to code space + +init-u0 constant main \ -- addr ; tcb of main task +\ *G Returns the base address of the main task's *\fo{USER} area. +l: main-link + 0 , \ end of task chain + +CODE (pause) \ -- ; the scheduler itself +\ *G The software scheduler itself. +l: [schedule] +\ +\ save previously running task ip, rp, up, sp +\ can use with interrupts if we stack everything +\ + push { r6, r7, link } \ PSP and TOS + mov r0, rsp + mov r1, up + str r0, [ r1, # 0 tcb.ssp ] \ save SP in TCB +\ +\ select next task to run +\ +l: [schedule]1 + ldr r1, [ r1, # 0 tcb.link ] \ get next task + ldr r0, [ r1, # 0 tcb.status ] \ inspect status + cmp r0, # 0 \ 0 = not running + b .eq [schedule]1 +\ +\ run selected task - sp, up, rp, ip +\ + mov up, r1 + ldr r0, [ r1, # 0 tcb.ssp ] \ restore SSP + mov rsp, r0 + pop { r6, r7 } \ restore registers + pop { r0 } + mov link, r0 + + next, +end-code + +0 value multi? \ -- flag +\ *G Returns true if the tasker is enabled. + +: single \ -- +\ *G Disable scheduler. + ['] noop to-do pause 0 to multi? ; + +: multi \ -- +\ *G Enable scheduler. + ['] (pause) to-do pause -1 to multi? ; + + +: status \ -- task-status +\ *G Returns the current task's status cell, but with the run +\ ** bit masked out. + up@ tcb.status @ run-mask invert and ; + +: restart \ task -- ; mark task TCB as running +\ *G Sets the RUN bit in the task's status cell. + run-mask swap tcb.status or! ; + +: halt \ task -- ; reset running bit in TCB +\ *G Clears the RUN bit in the task's status cell. + run-mask swap tcb.status bic! ; + +: stop \ -- ; halt oneself +\ *G *\fo{HALT}s the current task, and executes *\fo{PAUSE}. + self halt pause +; + + +\ ************************* +\ *S Task structure management +\ ************************* + +internal + +(( Extract from scheduler save + push { r6, r7, link } \ PSP and TOS + mov r0, rsp + mov r1, up + str r0, [ r1, # 0 tcb.ssp ] \ save SP in TCB +)) +code init-task \ xt task -- ; Initialise a task stack +\ *G Initialise a task's stack before running it and +\ ** set it to execute the word whose XT is given. + ldmia psp ! { r1 } \ get execution address + mov .s r3, # 1 + orr .s r1, r1, r3 \ set Thumb bit + mov r2, rsp \ save return stack pointer + +\ Generate the RSP of the new task +\ the middle line works because TASK-U0 is greater than TASK-R0 + mov r0, tos + sub .s r0, r0, # task-u0 task-r0 - \ generate new task RSP + mov rsp, r0 + + str r0, [ tos, # r0-offset ] \ save new R0 (taskID=UP) + mov .s r0, # 0 \ will need this many times + str r0, [ tos, # 0 tcb.status ] \ clear new task status + + push { r1 } \ R14 LINK, push xt=link + push { r0 } \ R7, new TOS for ARM +\ the next but one line works because TASK-U0 is greater than TASK-S0 + mov r1, tos + sub .s r1, r1, # task-u0 task-s0 - \ calculate new PSP + sub .s r1, r1, # sp-guard cells \ generate new PSP + push { r1 } \ R6, new PSP + sub .s r1, r1, # tos-cached? cells \ generate new S0 + str r1, [ tos, # s0-offset ] \ that is compatible with SP! + mov r0, rsp + str r0, [ tos, # 0 tcb.ssp ] \ save RSP + + mov rsp, r2 \ restore RSP + ldmia psp ! { tos } \ restore TOS + next, +end-code + +: add-task \ task -- ; insert into list +\ *G Add the task to the list of tasks after the current task. + self tcb.link @ \ save task currently pointed to + over tcb.link ! \ and make new task point to it + self tcb.link ! \ current task points to new task +; + +: sub-task \ task -- ; remove task from chain +\ *G Remove the task from the task list. +\ look for task which points to required task + self \ head of chain ; -- target current + begin 2dup tcb.link @ <> \ while curr. does not point to target + while \ step through chain + tcb.link @ dup self = \ but if task not in list, check for end + if 2drop exit endif \ and get out + repeat \ -- target points-to-it +\ set task that points to target to point to task pointed to by the target + swap tcb.link @ \ task pointed to by target + swap tcb.link ! \ set into link field +; + +external + +: initiate \ xt task -- ; start task from scratch +\ *G Start the given task executing the word whose XT is given, e.g. +\ *C ['] <name> <task> INITIATE + tuck init-task \ reset TCB + dup add-task \ add to chain + run-mask swap tcb.status ! \ mark as running + pause \ let it run +; + +: terminate \ task -- +\ *G Stop a task, and remove it from the list. + sub-task pause \ halt task, and remove from chain +; + +: init-multi \ -- +\ *G Initialise the multitasker and start it. + single \ tasker disabled + main /tcb erase \ clean TCB + main dup tcb.link ! \ initialise MAIN to point to itself + run-mask main tcb.status ! \ and reset status field + multi \ mark tasker enabled +; ' init-multi AtCold + +: his \ task uservar -- addr +\ *G Given a task id and a *\fo{USER} variable, returns the +\ ** address of that variable in the given task. This word is +\ ** used to set up *\fo{USER} variables in other tasks. + self - + +; + + +\ ********** +\ *S Semaphores +\ ********** +\ *P The semaphore code is only compiled if the equate +\ ** *\fo{SEMAPHORES?} is set non-zero in the control +\ ** file. + +\ *P A *\fo{SEMAPHORE} is an extended variable used for signalling +\ ** between tasks, and for resource allocation. It contains two +\ ** cells, a *\b{counter} and an *\b{arbiter}. The counter field +\ ** is used as a count of the number of times the resource may +\ ** be used, and the arbiter field contains the TCB of the task +\ ** that currently owns it. This field can be used for priority +\ ** arbitration and deadlock detection/arbitration. The count +\ ** field allows the semaphore to be used as a*\b{counted} +\ ** semaphore or as an exclusive access semaphore. + +\ *P For example a character buffer may be used where the semaphore +\ ** counter contains the number of available characters. + +\ *P An exclusive access semaphore is used to share resources. +\ ** The semaphore is initialised to one, usually by *\fo{SIGNAL}. +\ ** The first task to *\fo{REQUEST} it gains access, and all +\ ** other tasks must wait until the accessing task *\fo{SIGNAL}s +\ ** that it has finished with the resource. + +interpreter +: semaphore \ -- ; -- addr [child] +\ *G Creates a semaphore which returns its address at runtime. +\ ** The count field is initialised to zero for use as counted +\ ** semaphore. Use in the form: +\ *C Semaphore <name> +\ *P If you want this to be an exclusive access semaphore, follow +\ ** this with: +\ *C 1 <name> ! + idata create + 0 , 0 , \ count and arbiter fields + cdata +; +target + +: semaphore \ -- ; -- addr [child] + 2 cells buffer: + 0 0 last @ name> execute 2! +; + +: signal \ addr -- +\ *G *\fo{SIGNAL} increments the counter field of a semaphore, indicating +\ ** either that another item has been allocated to the resource, or +\ ** that it is available for use again, 0 indicating in use by a task. + [I \ must be interrupt safe + dup incr cell+ off \ inc. counter, release + I] +; + +: request \ sem -- ; get access to resource, wait if count = 0 +\ *G *\fo{REQUEST} waits until the counter field of a semaphore +\ ** is non-zero, and then decrements the counter field by one. + begin + [I dup @ 0= \ n.b. test and set + while + I] pause \ operations must be + repeat \ non-interruptible and indivisible + dup decr \ got it, decrement counter + self swap cell+ ! \ mark resource as mine + I] \ re-enable interrupts +; + + +\ ****************** +\ *S TASK and START: +\ ****************** +\ *P *\fo{TASK <name>} builds a named task user area. +\ ** The action of a task is assigned and the task started +\ ** by the word *\fo{INITIATE} +\ *C ['] <action> <task> INITIATE + +\ *P *\fo{START:} is used inside a colon definition. The code +\ ** before *\fo{START:} is the task's initialisation, performed +\ ** by the current task. The code after *\fo{START:} up to the +\ ** closing *\fo{;} is the action of the task. For example: + +\ *E TASK FOO +\ ** : RUN-FOO +\ ** ... +\ ** FOO START: +\ ** ... +\ ** begin ... pause again +\ ** ; + +\ *P All tasks must run in an endless loop, except for initialisation +\ ** code. +\ ** When *\fo{RUN-FOO} is executed, the code after *\fo{START:} +\ ** is set up as the action of task *\fo{FOO} and started. +\ ** *\fo{RUN-FOO} then exits. + +\ *P If you want to perform additional actions after starting the task, you +\ ** should use *\fo{INITIATE} to start the task. + +variable task-chain \ -- addr +\ *G Anchors list of all tasks created by *\fo{TASK} and friends. + main-link task-chain ! \ MAIN already defined + +interpreter \ host version +: task \ -- ; -- task ; TASK <name> builds a task +\ *G Note that the cross-interpreter's version of *\fo{TASK} has +\ ** been modified from v6.2 onwards to leave the current +\ ** section as *\fo{CDATA}. + udata + task-size reserve task-u0 + constant \ build pointer + cdata + here task-chain @ , task-chain ! \ link task +; +target + +heads? [if] \ target version +: task \ -- ; -- task ; TASK <name> builds a task +\ *G Creates a new task and data area, returning the address +\ ** of the user area at run time. The task is also linked into +\ ** the task chain anchored by *\fo{TASK-CHAIN}. + rp @ task-u0 + \ task's user area + task-size rallot + constant \ build pointer + here task-chain @ , task-chain ! \ link task +; +[then] + +: start: \ task -- ; exits from caller +\ *G Used inside a colon definition. The code following +\ ** *\fo{START:} up to the ending semi-colon forms the action +\ ** of the task. The word containing *\fo{START:} finishes at +\ ** *\fo{START:}. + r> swap initiate +; + + +\ ****************** +\ *S Debugging tools +\ ****************** + +: .task \ task -- +\ *G Display task's name if it has one, otherwise display its +\ ** address. + task-chain + begin \ -- task link + @ dup + while \ -- task link + 2dup cell - @ = if + nip #12 - >name .name space \ ARM specific + exit + endif + repeat + drop .dword ." is not in TASK chain" +; + +: .tasks \ task -- ; display all task names +\ *G Display all the tasks anchored by *\fo{TASK-CHAIN}. + task-chain + begin + @ dup + while + dup #12 - >name .name space \ ARM specific + repeat + drop +; + +: .running \ -- +\ *G Display all the running tasks. + main + begin + cr dup .task + tcb.link @ + dup main = + until + drop +; + + +\ ******** +\ all done +\ ******** + +decimal + + +\ ********* +\ Test code +\ ********* + +0 [if] + +task task1 \ -- addr ; build task area + +500000 value rate1 \ -- n ; number of idle iterations + +: action1 \ -- ; action of task1 + hex console opvec ! + begin + [char] * emit + rate1 0 do pause loop + again +; + +\ To start task use: +\ ' action1 task1 initiate + +task task2 \ -- addr ; build task area + +900000 value rate2 \ -- n ; number of idle iterations + +: run-task2 \ -- ; example of using START: + task2 start: + console opvec ! + begin + [char] / emit + rate2 0 do pause loop + again +; + +\ To start task use: +\ run-task2 + +[then] + + +\ ====== +\ *> ### +\ ====== + diff --git a/mwmouse/sources/REPROGSTM32F0.img b/mwmouse/sources/REPROGSTM32F0.img Binary files differ. diff --git a/mwmouse/sources/ReFlash.fth b/mwmouse/sources/ReFlash.fth @@ -0,0 +1,163 @@ +\ Reflash.fth - handles reflashing the system + +(( +Copyright (c) 2004, 2006, 2008, 2010 +MicroProcessor Engineering +133 Hill Lane +Southampton SO15 5AF +England + +tel: +44 (0)23 8063 1441 +fax: +44 (0)23 8033 9691 +net: mpe@mpeforth.com + tech-support@mpeforth.com +web: www.mpeforth.com + +From North America, our telephone and fax numbers are: + 011 44 23 8063 1441 + 011 44 23 8033 9691 + + +To do +===== + +Change history +============== +20100125 SFP002 Cortex conversion from LPC23xx code. + Added FlashSize setting. +20060701 SFP001 Added CopyFlash. +)) + + +\ ========== +\ *! reflashstm32 +\ *T STM32 Reflashing +\ ========== +\ *S Introduction +\ *P If you destroy the application in the internal Flash, you +\ ** must use the ST ISP loader to reload an Intel Hex file. +\ ** A suitable baud rate is 38400 baud. + +\ *P Once the Forth system is running again, you can use the word +\ ** *\fo{REFLASH ( -- )} to download a new binary image. +\ ** Note that *\fo{REFLASH} only handles binary memory image +\ ** files. These should transferred using the XModem 128 +\ ** (checksum) protocol. If you are using AIDE with the file +\ ** server enabled, a file selection dialog will appear +\ ** automatically after you have executed *\fo{REFLASH}. + +\ *P The STM32 can only be completely reflashed from an +\ ** application by a program running from RAM. A separate +\ ** application built by a control file *\i{Reprog/Reprog*.ctl} +\ ** is used to do this. A binary image, *\fo{REPROG*.IMG}, is +\ ** inserted into the application. When required, the code is +\ ** copied into the internal RAM and executed from RAM. + +\ *P Return is by rebooting the system. The contents of the +\ ** internal RAM and Flash are destroyed, therefore any data +\ ** that must be preserved should be saved externally to the +\ ** chip. Alternatively, modify the reprogramming code to +\ ** use the last sector to hold data to be +\ ** preserved. + + +\ *************************** +\ *S Code in main application +\ *************************** +\ *P The layout of the RAM code is defined in the control file +\ ** for the RAM application. This defines the first cell as +\ ** the Forth word to execute. + +create reprog.img \ -- addr +\ *G The start address of the reprogramming code + data-file REPROGSTM32F0.IMG equ /reprog \ -- len +\ *G Generic STM32: The length of the reprogramming code loaded +\ ** into the Flash dictionary. + +$2000:0000 equ reprogrun \ -- addr +\ *G The run time address of the reprogramming code. +\ ** This *\b{must} match the start address of the *\fo{CDATA} +\ ** section defined in *\i{ReprogSTM32.ctl}, and that section +\ ** *\b{must not} overlap the run-time stacks and user area. + +variable ReflashUART \ -- addr +\ *G Holds 0 or a UART base address. If set to 0, the reflash +\ ** code will use the default device for the XModem transfer. +\ ** Otherwise it will use the value here as the base address +\ ** of the UART to use. Since the same binary reprogramming +\ ** code is used for many systems, it is foolish to make any +\ ** assumptions about the default device. + +useUSART1? [if] +console-port 1 = [if] + _USART1 ReflashUART ! +\ *G Set *\fo{ReflashUART} for USART1 if *\fo{console-port}=1. +[then] +[then] +useUSART2? [if] +console-port 2 = [if] + _USART2 ReflashUART ! +\ *G Set *\fo{ReflashUART} for USART2 if *\fo{console-port}=2. +[then] +[then] +useUSART3? [if] +console-port 3 = [if] + _USART3 ReflashUART ! +\ *G Set *\fo{ReflashUART} for USART3 if *\fo{console-port}=3. +[then] +[then] + +\ *P The start of the RAM code block holds data about the +\ ** running Forth. +\ *( +\ *B Cell 0 - xt of *\fo{ReprogFlash} to run, +\ *B Cell 1 - xt of *\fo{CopyFlash} to run, +\ *B Cell 2 - 0 for default UART or base address of another UART, +\ *B Cell 3 - clock speed in Hz of the calling Forth, +\ *B Cell 4 - Flash size in bytes, +\ *B Cell 5 - size of each page in the Flash. +\ *) + +[undefined] KeepPages [if] +0 equ KeepPages \ -- u +\ *G Set this non-zero for the number of pages at the end of Flash +\ ** that are reserved for configuration data. Often set to 1 or 2 +\ ** by systems that use PowerNet. If not already defined, we use +\ ** the value here. +[then] +/FlashPage KeepPages * equ /Keep \ -- len +\ *G Number of bytes to keep at the end of Flash for configuration +\ ** data. + +: callit \ xt -- +\ *G Load the reprogramming code and execute the xt. + [defined] dfi [if] dfi [then] \ disable FIQ + di \ disable IRQ [and FIQ] + ReflashUART @ \ get device selection BEFORE copy + reprog.img reprogrun /reprog cmove \ copy code to RAM + reprogrun tuck 2 cells + ! \ set device base address + system-speed over 3 cells + ! \ set device clock speed + /Flash /Keep - over 4 cells + ! \ set Flash size + /FlashPage swap 5 cells + ! \ set Flash page size + execute + [defined] reboot [if] reboot [else] ExcVecs 4 + @ execute [then] +; + +: reflash \ -- ; no exit +\ *G Copies the reprogramming code to the run-time address +\ ** and executes it. + reprog.img @ callit +; + +: CopyFlash \ src dest len -- +\ *G Copy the flash. The parameters are as for *\fo{CMOVE}. +\ ** The process is repeated until there are no errors, and +\ ** the system is then rebooted. + reprog.img cell + @ callit +; + + +\ ====== +\ *> ### +\ ====== + diff --git a/mwmouse/sources/ReProg/MinSerSTM32p.fth b/mwmouse/sources/ReProg/MinSerSTM32p.fth @@ -0,0 +1,75 @@ +\ MinSerSTM32p.fth - STM32 polled RX, polled TX, serial communication drivers + +(( +Copyright (c) 2010, 2014 +MicroProcessor Engineering +133 Hill Lane +Southampton SO15 5AF +England + +tel: +44 (0)23 8063 1441 +fax: +44 (0)23 8033 9691 +net: mpe@mpeforth.com + tech-support@mpeforth.com +web: www.mpeforth.com + +From North America, our telephone and fax numbers are: + 011 44 23 8063 1441 + 011 44 23 8033 9691 + + +To do +===== + +Change history +============== +20100131 SFP001 STM32 conversion. +)) + +only forth definitions + + +\ ***************** +\ Serial primitives +\ ***************** + +align L: ^UART + _USART1 , + +IsLeaf : init-ser \ -- +\ *G The host has already set up the UART. Force the UART into +\ ** polled operation. + CLD_UART @ \ if non-zero + if CLD_UART @ ^UART ! endif \ use different UART + ^UART @ +\ $0000 swap usCR3 + ! \ no interrupts, no DMA, no LIN, no smartcard + $000C over usCR1 + ! \ 8 bit, no parity, TE, RE, no TX/RX ints + $000D swap usCR1 + ! \ 8 bit, no parity, TE, RE, UE +; + +IsLeaf : emit \ char -- + ^UART @ + begin + dup usISR + @ bit7 and + until + usTDR + ! +; + +IsLeaf : key? \ -- t/f + ^UART @ usISR + @ bit5 and ; + +IsLeaf : key \ -- char + ^UART @ + begin + dup usISR + @ bit5 and + until + usRDR + @ $FF and + [asm nop nop nop nop nop nop nop nop asm] +; + +: type \ c-addr len -- + bounds ?do i c@ emit loop ; + +: CR \ -- + $0D emit $0A emit ; + diff --git a/mwmouse/sources/ReProg/MinXmodemRx.fth b/mwmouse/sources/ReProg/MinXmodemRx.fth @@ -0,0 +1,279 @@ +\ MinXmodemRx.fth - XMODEM file receive + +(( +Copyright (c) 2001, 2002, 2004, 2005, 2010 +MicroProcessor Engineering +133 Hill Lane +Southampton SO15 5AF +England + +tel: +44 (0)23 8063 1441 +fax: +44 (0)23 8033 9691 +net: mpe@mpeforth.com + tech-support@mpeforth.com +web: www.mpeforth.com + +From North America, our telephone and fax numbers are: + 011 44 23 8063 1441 + 011 44 23 8033 9691 + + +To do +===== + +Change history +============== +20100203 MPE005 Recoded for CPUs with slow DO. + Reduced poll interval to 10us for CPUs without FIFOs. +20040209 SFP004 Modified for LPC2106 with 512 byte Flash writes, + Receive only. +20030924 SFP003 Overhauled receive code to make it minimal + for single chip Flash programmers. +20021014 SFP002 Modified for COMMON directory. +20010717 EJB000 First release +)) + + +\ ================== +\ *! minxmodemrx +\ *T XMODEM Receiver and Transmitter +\ ================== +\ *S Introduction +\ *P This file implements the XMODEM 128-byte checksum protocol +\ ** for receive only. + +\ *P No test code is provided for this file as the system has +\ ** been tested by comparison of transferred binary files. + +\ *************************** +\ *S Words in MinXmodemRx.fth +\ *************************** + +decimal + + +\ ========================== +\ *N Constants and variables +\ ========================== + +\ Characters +$001 equ START $001 equ SOH +$004 equ EOT +$006 equ ACK +$015 equ NAK +$018 equ CAN + +\ Error codes +$0101 equ blkerror \ error codes +$0102 equ wrongblk +$0103 equ noreply +$0104 equ crcerror +$0105 equ overflow + +$0100 equ maxerrs \ max errors before we bomb + +\ Variables +cell buffer: BLK# \ Current Block No. +cell buffer: CUR-ADDRESS \ Current host address +cell buffer: LAST-BLOCK \ last block we can receive +cell buffer: rxerrcnt \ counter for rx errors +cell buffer: rxstatus \ receiver status + +compiler +: X-buffer \ -- addr + Xbase +; +target + + +\ =================== +\ *N XMODEM reception +\ =================== +\ *P This code is a much chopped-down version of that +\ ** provided in *\i{COMMON\XMODEMTXRX.FTH}. It is much smaller +\ ** and it is assumed that the word *\fo{TOFLASH ( src dest -- )} +\ ** is used to program each 128 byte block into Flash. + +[undefined] ser-flush [if] +: ser-flush \ -- ; flush the link input +\ *G Flush all input characters from the host/target link. + begin + ser-key? + while + ser-key drop + repeat +; +[then] + +: send-ack \ -- ; send ACK +\ *G Transmit an ACK character. + ACK ser-emit +; + +: send-nak \ -- ; Transmit a NAK character +\ *G Transmit a NAK character. + NAK ser-emit +; + +: send-can \ -- ; send CAN character +\ *G Transmit a CAN character. + CAN ser-emit rxstatus on +; + +(( \ original +: TimedKey \ -- char|-1 + \ *G As *\fo{KEY} but returns -1 on timeout + #800000 0 do \ approx 100ms + ser-key? + if ser-key unloop exit then + loop + -1 +; +)) +: TimedKey \ -- char|-1 + \ *G As *\fo{KEY} but returns -1 on timeout. + $400000 begin \ approx 100ms + ser-key? + if ser-key nip exit then + 1- dup 0= + until + drop -1 +; + +(( \ original +: Get-BlockData \ -- cksum ; get block from host + \ *G Receive a 128 byte XMODEM data block from the host. + 0 + X-buffer #128 bounds do \ Get 128 byte Block +\ ser-key dup i c! \ save byte to buffer + TimedKey dup i c! \ save byte to buffer + + $0FF and \ Add to Check-Sum + loop +; +)) +: Get-BlockData \ -- cksum ; get block from host + \ *G Receive a 128 byte XMODEM data block from the host. + 0 X-buffer begin \ -- crc caddr + TimedKey 2dup swap c! \ -- crc addr char ; save byte to buffer + rot + $FF and swap 1+ \ -- crc' caddr' + dup X-buffer #128 + u>= + until + drop +; + + +: CancelXfer \ -- +\ *G Cancel transfer by sending 2 CAN characters. + send-can send-can \ 2 CAN's aborts transfer +; + +: ?toomanyerrs \ -- +\ *G Cancel reception if too many errors have occurred. + ser-flush + 1 rxerrcnt +! + rxerrcnt @ maxerrs > if + CancelXfer + else + send-nak + endif +; + +: From-Buffer \ -- ; copy 128 bytes from X-BUFFER +\ *G Move 128 bytes from *\fo{X-BUFFER} into the memory pointed to +\ ** by *\fo{CUR-ADDRESS}. The user must supply a routine *\fo{TOFLASH} +\ ** ( src dest -- ) which programs the data at src into Flash +\ ** at dest. + X-buffer cur-address @ toFlash \ program 128 bytes + #128 cur-address +! +; + +: Get-Block \ -- +\ *G Receive an XMODEM 128 byte data block from the host, processing +\ ** the header and checksum data. + TimedKey TimedKey \ get block and inverse + over + $0FF <> if + ?toomanyerrs send-can + drop exit \ lose incoming block number + endif + Blk# @ $00FF and <> if \ correct block? + ?toomanyerrs exit + endif + Get-BlockData \ get the data + Timedkey <> if \ get single cksum byte + ?toomanyerrs exit + endif + Blk# @ last-block @ > if + CancelXfer exit + endif + From-Buffer \ copy data to memory + send-ack \ all OK send ACK + 1 Blk# +! \ bump for next block + rxerrcnt off \ clear error count again +; + +: key/1s \ -- flag +\ *G Waits for one second or until a key is pressed, +\ ** returning true if a key was pressed. + #100000 begin + ser-key? 0= over and + while + delay10us 1- + repeat + drop + ser-key? +; + +: waitforresponse \ -- ; wait for host to respond +\ *G Wait for the host to respond for up to 1 second. If the +\ ** host does not respond, a *\fo{NOREPLY} status is set in the +\ ** variable *\fo{RXSTATUS}. + key/1s 0= + if rxstatus on endif \ flag no response +; + +: Bin-Up \ addr len -- status ; status 0 = GOOD +\ *G Upload (receive) a block of data of the given size into memory +\ ** using the XMODEM 128 byte block protocol. An error status is +\ ** returned, 0 indicating success. +\ cr ." Start Xmodem transmitter on host" cr + rxstatus off \ start with good status + rxerrcnt off \ and no errors + ser-flush \ flush input + 7 rshift last-block ! \ calculate last block number + CUR-ADDRESS ! \ Start from addr + 1 BLK# ! \ first block number + + NAK ser-emit \ NAK requests single byte checksum + begin \ wait for remote startup + key/1s 0= \ done if a reply within a second + while + NAK ser-emit \ then send NAK if still no key + repeat + + begin \ outer loop handles blocks + waitforresponse \ check if we got a response + rxstatus @ 0= if + case ser-key \ get response + EOT of EOT rxstatus ! send-ack endof \ all finished + CAN of CAN rxstatus ! send-ack endof \ remote cancelled + SOH of Get-block endof \ start of data block + endcase + endif + rxstatus @ \ loop until all done + until + + rxstatus @ dup EOT = if + drop 0 \ returns 0 for good transfer + endif +; + +(( +: gogo \ -- status ; for preliminary testing + $01A emit FlashBase /Flash Bin-up ; +)) + + +\ ====== +\ *> ### +\ ====== + diff --git a/mwmouse/sources/ReProg/PROGD.IMG b/mwmouse/sources/ReProg/PROGD.IMG diff --git a/mwmouse/sources/ReProg/PROGU.IMG b/mwmouse/sources/ReProg/PROGU.IMG Binary files differ. diff --git a/mwmouse/sources/ReProg/REPROGSTM32F0.img b/mwmouse/sources/ReProg/REPROGSTM32F0.img Binary files differ. diff --git a/mwmouse/sources/ReProg/ReFlash.fth b/mwmouse/sources/ReProg/ReFlash.fth @@ -0,0 +1,163 @@ +\ Reflash.fth - handles reflashing the system + +(( +Copyright (c) 2004, 2006, 2008, 2010 +MicroProcessor Engineering +133 Hill Lane +Southampton SO15 5AF +England + +tel: +44 (0)23 8063 1441 +fax: +44 (0)23 8033 9691 +net: mpe@mpeforth.com + tech-support@mpeforth.com +web: www.mpeforth.com + +From North America, our telephone and fax numbers are: + 011 44 23 8063 1441 + 011 44 23 8033 9691 + + +To do +===== + +Change history +============== +20100125 SFP002 Cortex conversion from LPC23xx code. + Added FlashSize setting. +20060701 SFP001 Added CopyFlash. +)) + + +\ ========== +\ *! reflashstm32 +\ *T STM32 Reflashing +\ ========== +\ *S Introduction +\ *P If you destroy the application in the internal Flash, you +\ ** must use the ST ISP loader to reload an Intel Hex file. +\ ** A suitable baud rate is 38400 baud. + +\ *P Once the Forth system is running again, you can use the word +\ ** *\fo{REFLASH ( -- )} to download a new binary image. +\ ** Note that *\fo{REFLASH} only handles binary memory image +\ ** files. These should transferred using the XModem 128 +\ ** (checksum) protocol. If you are using AIDE with the file +\ ** server enabled, a file selection dialog will appear +\ ** automatically after you have executed *\fo{REFLASH}. + +\ *P The STM32 can only be completely reflashed from an +\ ** application by a program running from RAM. A separate +\ ** application built by a control file *\i{Reprog/Reprog*.ctl} +\ ** is used to do this. A binary image, *\fo{REPROG*.IMG}, is +\ ** inserted into the application. When required, the code is +\ ** copied into the internal RAM and executed from RAM. + +\ *P Return is by rebooting the system. The contents of the +\ ** internal RAM and Flash are destroyed, therefore any data +\ ** that must be preserved should be saved externally to the +\ ** chip. Alternatively, modify the reprogramming code to +\ ** use the last sector to hold data to be +\ ** preserved. + + +\ *************************** +\ *S Code in main application +\ *************************** +\ *P The layout of the RAM code is defined in the control file +\ ** for the RAM application. This defines the first cell as +\ ** the Forth word to execute. + +create reprog.img \ -- addr +\ *G The start address of the reprogramming code + data-file %HwDir%/ReProg/REPROGSTM32F0.IMG equ /reprog \ -- len +\ *G Generic STM32: The length of the reprogramming code loaded +\ ** into the Flash dictionary. + +$2000:0000 equ reprogrun \ -- addr +\ *G The run time address of the reprogramming code. +\ ** This *\b{must} match the start address of the *\fo{CDATA} +\ ** section defined in *\i{ReprogSTM32.ctl}, and that section +\ ** *\b{must not} overlap the run-time stacks and user area. + +variable ReflashUART \ -- addr +\ *G Holds 0 or a UART base address. If set to 0, the reflash +\ ** code will use the default device for the XModem transfer. +\ ** Otherwise it will use the value here as the base address +\ ** of the UART to use. Since the same binary reprogramming +\ ** code is used for many systems, it is foolish to make any +\ ** assumptions about the default device. + +useUSART1? [if] +console-port 1 = [if] + _USART1 ReflashUART ! +\ *G Set *\fo{ReflashUART} for USART1 if *\fo{console-port}=1. +[then] +[then] +useUSART2? [if] +console-port 2 = [if] + _USART2 ReflashUART ! +\ *G Set *\fo{ReflashUART} for USART2 if *\fo{console-port}=2. +[then] +[then] +useUSART3? [if] +console-port 3 = [if] + _USART3 ReflashUART ! +\ *G Set *\fo{ReflashUART} for USART3 if *\fo{console-port}=3. +[then] +[then] + +\ *P The start of the RAM code block holds data about the +\ ** running Forth. +\ *( +\ *B Cell 0 - xt of *\fo{ReprogFlash} to run, +\ *B Cell 1 - xt of *\fo{CopyFlash} to run, +\ *B Cell 2 - 0 for default UART or base address of another UART, +\ *B Cell 3 - clock speed in Hz of the calling Forth, +\ *B Cell 4 - Flash size in bytes, +\ *B Cell 5 - size of each page in the Flash. +\ *) + +[undefined] KeepPages [if] +0 equ KeepPages \ -- u +\ *G Set this non-zero for the number of pages at the end of Flash +\ ** that are reserved for configuration data. Often set to 1 or 2 +\ ** by systems that use PowerNet. If not already defined, we use +\ ** the value here. +[then] +/FlashPage KeepPages * equ /Keep \ -- len +\ *G Number of bytes to keep at the end of Flash for configuration +\ ** data. + +: callit \ xt -- +\ *G Load the reprogramming code and execute the xt. + [defined] dfi [if] dfi [then] \ disable FIQ + di \ disable IRQ [and FIQ] + ReflashUART @ \ get device selection BEFORE copy + reprog.img reprogrun /reprog cmove \ copy code to RAM + reprogrun tuck 2 cells + ! \ set device base address + system-speed over 3 cells + ! \ set device clock speed + /Flash /Keep - over 4 cells + ! \ set Flash size + /FlashPage swap 5 cells + ! \ set Flash page size + execute + [defined] reboot [if] reboot [else] ExcVecs 4 + @ execute [then] +; + +: reflash \ -- ; no exit +\ *G Copies the reprogramming code to the run-time address +\ ** and executes it. + reprog.img @ callit +; + +: CopyFlash \ src dest len -- +\ *G Copy the flash. The parameters are as for *\fo{CMOVE}. +\ ** The process is repeated until there are no errors, and +\ ** the system is then rebooted. + reprog.img cell + @ callit +; + + +\ ====== +\ *> ### +\ ====== + diff --git a/mwmouse/sources/ReProg/ReprogApp.fth b/mwmouse/sources/ReProg/ReprogApp.fth @@ -0,0 +1,283 @@ +\ ReprogApp.fth - reprogram LPC2xxx Flash + +(( +Copyright (c) 2004, 2008, 2009, 2010 +MicroProcessor Engineering +133 Hill Lane +Southampton SO15 5AF +England + +tel: +44 (0)23 8063 1441 +fax: +44 (0)23 8033 9691 +net: mpe@mpeforth.com + tech-support@mpeforth.com +web: www.mpeforth.com + +From North America, our telephone and fax numbers are: + 011 44 23 8063 1441 + 011 44 23 8033 9691 + + +To do +===== +At end of download, check for a partial block to program. + +Change max program size to depend on CPU. + +Change history +============== +20100203 SFP006 STM32 conversion. +20100125 SFP005 LPC17xx conversion. +20090205 SFP004 LPC2388 does not erase last sector at $0007:D000 +20081008 SFP003 Minor documentation changes. +20060701 SFP002 Added CopyFlash. +20050627 MPE002 Now uses sector tables. +20040212 MPE001 First release +)) + +only forth definitions decimal + + +\ ******************* +\ *S Flash primitives +\ ******************* +\ *P Although some of these routines are not the most efficient +\ ** for the STM32 series, they are designed to be easily expanded +\ ** for future STM32 parts with as yet unknown sector sizes. + +(( +FlashBase constant FlashBase +_FPEC constant _FPEC + +: .FPEC \ -- + _FPEC $24 pdump ; +)) + +: ?Unlock \ -- +\ *G Unlock the Flash if protected. + _FPEC flCR + @ bit7 and if + _FPEC flKEY1 over flKEYR + ! \ write keys + flKEY2 over flKEYR + ! + bit7 swap flCR + bic! \ clear LOCK bit + endif +; + +: waitFlNB \ -- status +\ *G Wait until the Flash is not busy and return the status. +\ ** The top bit is set if the operation timed out. + $0010:0000 _FPEC begin \ -- cnt fpec + swap 1- swap over \ check timeout counter + while + dup flSR + @ bit0 and 0= + until then + dup flSR + @ \ -- cnt fpec status ; get status + dup $0034 and rot flSR + ! \ -- cnt status ; clear h/w status + swap 0= + if $8000:0000 or endif +; + +: flw! \ w addr -- status +\ *G Write 16 bits to flash. A status value of $20 indicates +\ ** success. + ?Unlock + bit0 _FPEC flCR + or! \ set PG bit in control reg + w! \ write data + waitFlNB \ wait for completion/timeout + bit0 _FPEC flCR + bic! \ clear PG bit in control reg +; + +: flPageErase \ addr -- status +\ *G Erase the page containing addr. A status value of $20 +\ ** indicates success. + FlashBase - \ relative to start of Flash + ?Unlock _FPEC + bit1 over flCR + or! \ set PER bit in control reg + swap over flAR + ! \ set address + bit6 swap flCR + or! \ set STRT bit in control reg + waitFlNB \ wait for completion/timeout + bit1 _FPEC flCR + bic! \ clear PER bit in control reg +; + + +\ **************** +\ *S Flash handler +\ **************** + +cell buffer: #PrgErrs \ -- addr +\ *G Holds error count. + + : ?flError \ status -- +\ *G Increment error count if status is not $20. + $20 <> if #PrgErrs incr endif ; + +: (EraseFlash) \ dest len -- +\ *G Erase the Flash range + bounds ?do + i flPageErase ?flError + /FlashPage +loop +; + +: EraseFlash \ -- +\ *G Erase the Flash from start to end. + Flashbase /Flash (EraseFlash) ; + +: (ProgFlash) \ src dest len -- +\ *G Write len bytes from memory at src to Flash at *\i{dest}. +\ ** Note that the Flash is assumed to be erased, and that +\ ** no verification is performed except when each byte is +\ ** programmed. *\i{Dest} is forced to a 2 byte boundary and +\ ** *\i{len} is rounded up to the next 2 byte unit. *\i{Src} +\ ** must be on a 2 byte boundary. + rot -2 and -rot \ force src + swap -2 and swap \ force dest + 1+ -2 and \ force len + bounds ?do \ -- src' + dup w@ i flw! ?flError 2+ + 2 +loop + drop +; + +(( +: (VerifyFlash) \ src dest len -- +\ *G Verify len bytes from memory at src to Flash at dest. + 3dup s= if 3drop exit endif + cr ." Verify failed" + 0 ?do + over c@ over c@ <> if + cr 2 spaces .src/dest + key? ?leave + then + i $FFF and 0= if ." ." endif + 1 + swap 1 + swap + 1 +loop + 2drop +; +)) + +: toFlash \ src dest -- +\ *G Handle 128 bytes at src to go to dest in Flash. + #128 (ProgFlash) +; + + +\ ***************** +\ *S Numeric output +\ ***************** + +: .nibble \ n -- +\ *G Convert a nibble to a hex ASCII digit and display it. + $0F and dup 9 > + if 7 + then + $30 + emit +; + +: .WORD \ w -- +\ *G Display w as a 4 digit unsigned hexadecimal number. + dup #12 rshift .nibble + dup 8 rshift .nibble + dup 4 rshift .nibble + .nibble +; + +(( +: .dword \ x -- +\ *G Display x as an 8 digit unsigned hexadecimal number. + dup #16 rshift .word .word +; +)) + + +\ *************** +\ *S Reprogrammer +\ *************** + +l: m1 + ", Erasing " +l: m2 + ", done " +l: m3 + ", Start Xmodem TX " +[defined] REBOOT [if] +l: m4 + ", Press R to reboot, other to reprogram " +[else] +l: m4 + ", Reset or press key to reprogram" +[then] +l: m5 + ", Errors" +l: m6 + ", No " + +: $. \ c-addr -- +\ *G Display counted string. + count type +; + +: .PrgErrs +\ *G Display number of errors. + cr #PrgErrs @ .word bl emit + m5 $. +; + +: initReprog \ -- +\ *G Get the setup data and calculate the requirements + init-ser #50 ms ; + +: ReprogFlash \ -- +\ *G Erase and program the Flash. + initReprog + begin + #PrgErrs off + cr m1 $. #20 ms + EraseFlash + m2 $. .PrgErrs #PrgErrs off + cr m3 $. $01A emit \ send message and trigger + FlashBase /Flash Bin-Up drop + .PrgErrs + #100 ms + cr m4 $. +[defined] REBOOT [if] + key $DF and dup emit [char] R = + until + #100 ms + reboot +[else] + key drop + again +[then] +; + +\ SFP002... +l: msg7 + ", Copy " + +: (CopyFlash) \ src dest len -- +\ *G Copy one Flash area to another. The parameters are as for *\fo{CMOVE}. + initReprog + cr m1 $. #20 ms \ "Erase" message + #PrgErrs off + 2dup (EraseFlash) .PrgErrs #10 ms \ -- src dest len + #PrgErrs @ + if 3drop exit endif + cr msg7 $. \ "Copy" message + (ProgFlash) \ -- + .PrgErrs #20 ms \ error count +; + +: CopyFlash \ src dest len -- +\ *G Copy the flash. The parameters are as for *\fo{CMOVE}. +\ ** The process is repeated until there are no errors, and +\ ** the system is then rebooted. + begin + 3dup (CopyFlash) #PrgErrs @ 0= + until + #100 ms reboot +; +\ ...SFP002 + + +\ ====== +\ *> ### +\ ====== + diff --git a/mwmouse/sources/ReProg/ReprogSTM32F0.ctl b/mwmouse/sources/ReProg/ReprogSTM32F0.ctl @@ -0,0 +1,201 @@ +\ Reprogram STM32 over serial line. + +(( +Copyright (c) 2003, 2004, 2005, 2006, 2008, 2010 +MicroProcessor Engineering +133 Hill Lane +Southampton SO15 5AF +England + +tel: +44 (0)23 8063 1441 +fax: +44 (0)23 8033 9691 +net: mpe@mpeforth.com + tech-support@mpeforth.com +web: www.mpeforth.com + +From North America, our telephone and fax numbers are: + 011 44 23 8063 1441 + 011 44 23 8033 9691 + + +To do +===== + +Change history +============== +20100131 SFP005 Converted for STM32. +20100125 SFP004 Converted for LPC17xx +20081008 SFP003 Converted for LPC23xx/24xx/28xx +20060818 SFP002 Added UART selection. +20040809 SFP001 Added equate FULLIAP? +20030728 SFP000 First cut +)) + +\ ============= +\ *! reprogstm32 +\ *T Reprogramming the STM32 serially +\ ============= +\ *S Introduction +\ *P *\i{ReprogSTM32.ctl} is the control file for the serial +\ ** loader which reprograms the on-chip Flash memory. +\ ** Because the loader code may itself be replaced, the Flash +\ ** programming code is copied into RAM for execution. The only +\ ** exit from the code is a reset of the CPU to execute the +\ ** newly Flashed program. All interrupts are disabled during +\ ** reprogramming, and so polled serial drivers are used. + +\ *P Access to the reprogramming software is defined in +\ ** *\i{ReFlash.fth} for the main system code and in +\ ** this control file and the two must match. + +\ *P Return is by rebooting the system. The contents of the +\ ** internal RAM and Flash are destroyed, therefore any data +\ ** that must be preserved should be saved externally to the +\ ** chip. + + +only forth definitions + + +\ ****************************** +\ Define the default directories +\ ****************************** + +c" ../../.." setmacro CpuDir +c" ../../../.." setmacro CommonDir +c" ." setmacro AppDir +c" .." setmacro HwDir + + +\ ********************************************************* +\ Turn on the cross compiler and define CPU and log options +\ ********************************************************* + +\ file: PROG.log \ uncomment to send log to a file + +CROSS-COMPILE + +only forth definitions \ default search order + + no-log \ uncomment to suppress output log + rommed \ split ROM/RAM target + interactive \ enter interactive mode at end + +xrefs \ enable cross references + align-long \ code is 32bit aligned + Cortex-M0 \ Cortex-M processor type + no-heads \ do not generate heads + no inlining \ saves some space + -ram-table \ saves some space + +LeafCalls \ saves some space + +SaveCdataOnly \ no data area image files + +0 equ false +false not equ true + +(( +$2000:0000 $2000:0BFF cdata section ReprogSTM32 +interpreter +: prog ReprogSTM32 ; +target +$2000:0C00 $2000:0C7F idata section PROGd +$2000:0C80 $2000:0CFF udata section PROGu +$2000:0D00 $2000:0DFF udata section Xbuff \ 256 byte Xmodem buffer + sec-base equ Xbase \ base address of buffer + sec-len equ Xlen \ length of buffer + Xbase Xlen + equ Xtop \ top of buffer +)) +$2000:0000 $2000:09FF cdata section ReprogSTM32F0 +interpreter +: prog ReprogSTM32F0 ; +target +$2000:0A00 $2000:0A1F idata section PROGd +$2000:0A20 $2000:0A3F udata section PROGu +$2000:0A40 $2000:0ABF udata section Xbuff \ 128 byte Xmodem buffer + sec-base equ Xbase \ base address of buffer + sec-len equ Xlen \ length of buffer + Xbase Xlen + equ Xtop \ top of buffer + +PROG PROGd PROGu CDATA \ use Code for HERE , and so on + + +\ ******************** +\ *S Items of interest +\ ******************** +\ *P The stacks have already been set up by the calling program. + +\ *[ +include %CpuDir%\CM0def \ Cortex CPU equates +include %CpuDir%\sfrSTM32F072 \ Special function registers +\ *] + +l: CLD1 \ -- addr +\ *G Filled in later with the xt of *\fo{ReprogFlash} + 0 , +l: CLD_CopyFlash \ -- addr +\ *G Filled in later with the xt of *\fo{CopyFlash} + 0 , +l: CLD_UART \ -- addr +\ *G Filled in later with 0 or UART base address to use. +\ ** If set to 0, the default is UART1. This allows the calling +\ ** application to select which UART to use. + 0 , +l: CLD_clockspeed \ -- addr +\ *G Contains the clock speed to use. Filled in by the calling +\ ** application. Default is 48 MHz. + 48 Mhz , +l: CLD_/Flash \ -- addr +\ *G Flash size in bytes. Default is 128kb + #128 kb , +l: CLD_/FlashPage \ -- addr +\ *G Size of each page in the flash. Default is 2 kb. + 2 kb , + +$0800:0000 equ FlashBase \ -- addr +\ *G Base address of the Flash. + +compiler +: prog-speed \ -- hz + CLD_clockspeed @ ; +: /Flash \ -- len + CLD_/Flash @ ; +: /FlashPage \ -- len + CLD_/FlashPage @ ; +target + +\ *[ +include %AppDir%\primitives \ Forth primitives from CodeM0M1.fth +include %AppDir%\MinSerSTM32p \ polled serial line driver +include %AppDir%\delays \ software delays +include %CpuDir%\Drivers\rebootSTM32 \ reboot +\ *] + +synonym ser-emit emit +\ *G A synonym required by the Xmodem code. +synonym ser-key? key? +\ *G A synonym required by the Xmodem code. +synonym ser-key key +\ *G A synonym required by the Xmodem code. + +\ *[ +include %AppDir%\MinXmodemRx \ Xmodem receiver +include %AppDir%\ReprogApp \ Application +\ *] + + +\ ******* +\ The end +\ ******* + +make-turnkey ReprogFlash \ start up action +\ *G Define the action of the reprogramming code. +' CopyFlash CLD_CopyFlash ! +\ *G Define the action of the Flash copy code. + +decimal + +FINIS + + +\ ****** +\ *> ### +\ ****** diff --git a/mwmouse/sources/ReProg/XREF.XRF b/mwmouse/sources/ReProg/XREF.XRF Binary files differ. diff --git a/mwmouse/sources/ReProg/b.bat b/mwmouse/sources/ReProg/b.bat @@ -0,0 +1 @@ +start /w \buildkit.dev\software\compiler\xArmCortexDev include ReprogSTM32F0.ctl diff --git a/mwmouse/sources/ReProg/delays.fth b/mwmouse/sources/ReProg/delays.fth @@ -0,0 +1,66 @@ +\ DELAYS.FTH - software timed delay routines + +(( +Copyright (c) 2004, 2010 +MicroProcessor Engineering +133 Hill Lane +Southampton SO15 5AF +England + +tel: +44 (0)23 8063 1441 +fax: +44 (0)23 8033 9691 +net: mpe@mpeforth.com + tech-support@mpeforth.com +web: www.mpeforth.com + +From North America, our telephone and fax numbers are: + 011 44 23 8063 1441 + 011 44 23 8033 9691 + + +To do +===== + +Change history +============== +20100204 SFP003 Changed timebase unit to 10us to allow for UARTs + without FIFOs. +20100126 SFP002 Converted to clock speed from table. +20041007 MPE001 Corrected clocks/iteration in UDELAY and >UDELAY. +)) + +\ ========= +\ *! delays +\ *T Delay routines +\ ========= +\ *P The short delays are produced by software delay routines +\ ** which take five clock cycles per iteration on a +\ ** Cortex-M3 core with no wait states. This number was for +\ ** build 428 of the VFX compiler. When more optimisation is added +\ ** to the compiler the number of cycles per iteration may +\ ** change. + +\ *P The delay routines below extract the clock speed from the +\ ** entry table in the control file. + +: delay10us \ -- +\ *G Waits for 10 microseconds. + CLD_clockspeed @ 5 #100000 * u/ + begin 1- dup 0= until drop \ 5 clocks per iteration +; + +: delay1ms \ -- +\ *G Waits for 1 ms. + CLD_clockspeed @ 5 #1000 * u/ + begin 1- dup 0= until drop \ 5 clocks per iteration +; + +: ms \ ms -- +\ *G Wait the given number of milliseconds. + begin + delay1ms + 1- dup 0= + until + drop +; + diff --git a/mwmouse/sources/ReProg/primitives.fth b/mwmouse/sources/ReProg/primitives.fth @@ -0,0 +1,190 @@ +\ Primitives.fth - Forth primitives from CodeM0M1.fth + +(( +Copyright (c) 2010, 2011 +MicroProcessor Engineering +133 Hill Lane +Southampton SO15 5AF +England + +tel: +44 (0)23 8063 1441 +fax: +44 (0)23 8033 9691 +net: mpe@mpeforth.com + tech-support@mpeforth.com +web: www.mpeforth.com + +From North America, our telephone and fax numbers are: + 011 44 23 8063 1441 + 011 44 23 8033 9691 + + +To do +===== + +Change history +============== +20110628 MPE002 Cortex-M0 conversion. +20100125 MPE001 Cortex-M3 first version. +)) + +only forth definitions + +code cmove \ asrc adest len -- +\ *G Copy *\i{len} bytes of memory forwards from *\i{asrc} to *\i{adest}. + mov .s r3, tos \ r3=len + ldmia psp ! { r0, r1, tos } \ r0=addr2, r1=addr1, r3=len, tos restored + eq, if, + bx link \ return if len=0, nothing to do + endif, + mov .s r2, r0 + orr .s r2, r2, r1 \ check alignment + orr .s r2, r2, r3 \ R2 := adr1|addr2|len + mov .s r4, # 3 + and .s r4, r4, r2, \ will be zero if aligned + b .ne cmovx3 \ if not aligned +L: CMOVX1 + ldr r2, [ r1 ] + str r2, [ r0 ] + add .s r1, r1, # 4 + add .s r0, r0, # 4 + sub .s r3, r3, # 4 + b .ne CMOVX1 + bx lr +L: CMOVX3 + ldrb r2, [ r1 ] + strb r2, [ r0 ] + add .s r1, r1, # 1 + add .s r0, r0, # 1 + sub .s r3, r3, # 1 + b .ne CMOVX3 + bx lr +END-CODE + +(( +CODE BRANCH \ -- +\ *G The run time action of unconditional branches compiled on the target. +\ ** The branch target address is in-line and must have the T bit set. +\ ** INTERNAL. +l: takebranch + mov .s r1, # 1 + mov r0, link + bic .s r0, r1 + ldr r2, [ r0 ] \ get address and branch + bx r2 +END-CODE + +CODE ?BRANCH \ n -- +\ *G The run time action of conditional branches compiled on the target. +\ ** The branch target address is in-line and must have the T bit set. +\ ** INTERNAL. + mov .s r1, tos + ldmia psp ! { tos } + b .eq takebranch +l: skipbranch + mov r0, link + add .s r0, # 4 + bx r0 +END-CODE +)) + +CODE (DO) \ limit index -- +\ *G The run time action of *\fo{DO} compiled on the target. +\ ** The branch target address is in-line and must have the T bit set. +\ ** INTERNAL. + ldmia psp ! { r1 } \ get limit +L: PDO + mov .s r4, # 1 + lsl .s r4, r4, # #31 \ r4 := $8000:0000 + mov r3, link + sub .s r3, r3, # 1 \ clear T bit + ldr r2, [ r3 ] \ get LEAVE address, compiler sets T bit + add .s r1, r1, r4 \ limit+$8000:0000 + sub .s r0, tos, r1 \ index-limit-$8000:0000 + + push { r0, r1, r2 } \ push LEAVE then limit, then index on ret. stack + ldmia psp ! { tos } \ update tos +l: skipbranch + mov r0, link + add .s r0, # 4 + bx r0 +END-CODE + +CODE (?DO) \ limit index -- +\ *G The run time action of *\fo{?DO} compiled on the target. +\ ** The branch target address is in-line and must have the T bit set. +\ ** INTERNAL. + ldmia psp ! { r1 } \ get limit + cmp r1, tos \ check not equal + b .ne pdo \ take DO ? + ldmia psp ! { tos } \ update tos +l: takebranch + mov .s r1, # 1 + mov r0, link + bic .s r0, r1 + ldr r2, [ r0 ] \ get address and branch + bx r2 +END-CODE + +asmcode +here is-action-of constant +\ *G The runtime code for a CONSTANT. + sub .s psp, psp, # 4 \ save TOS + str tos, [ psp, # 0 ] + mov r0, link \ LINK is high register + sub .s r0, r0, # 1 \ remove T bit + ldr tos, [ r0, # 0 ] \ get data address (in-line) + pop { pc } +END-CODE + +code di \ -- +\ *G Disable interruots. + cps .id .i + bx lr +end-code + +CODE WITHIN \ n1|u1 n2|u2 n3|u3 -- flag +\ *G The ANS version of WITHIN?. +\ ** This word uses unsigned arithmetic, so that signed compares are +\ ** treated as existing on a number circle. + mov r2, tos \ save tos + ldmia psp ! { r0, r1 } \ r2 = n3, r0 = n2, r1 = n1 + mov .s tos, # 0 \ assume false + sub .s r2, r2, r0 + sub .s r1, r1, r0 + cmp r1, r2 + lo, if, + mvn .s tos, tos + endif, + bx lr +END-CODE + +code um/mod \ ud1 u2 -- urem uquot +\ *G Full 64 by 32 unsigned division subroutine. +\ ** This routine uses a loop for code size. + ldmia psp ! { r0 } \ dividend high + ldr r1, [ psp ] \ dividend low + mov .s r4, # #32 \ loop counter + mov .s r2, # 0 \ always 0 + begin, +\ udiv64_step + add .s r1, r1, r1 \ 64 bit shift of dividend + adc .s r0, r0, r0 + mov r3, r2 \ must not affect flags + adc .s r3, r3, r2 \ preserve dividend bit 63, R2=0 + sub .s r0, r0, tos \ trial subtraction, carry set (no borrow) if ok + adc .s r3, r3, r3 \ success if bit 0 or 1 set + ne, if, + add .s r1, r1, # 1 \ succeeded, update quotient + else, + add .s r0, r0, tos \ failed, undo subtraction + endif, + sub .s r4, r4, # 1 + eq, until, + mov tos, r1 \ move quotient + str r0, [ psp ] \ move remainder + bx lr +end-code + +: u/ \ u1 u2 -- uquot + 0 swap um/mod nip ; + diff --git a/mwmouse/sources/StackDef.fth b/mwmouse/sources/StackDef.fth @@ -0,0 +1,116 @@ +\ StackDef.fth - default stack layout + +(( +Copyright (c) 2010 +MicroProcessor Engineering +133 Hill Lane +Southampton SO15 5AF +England + +tel: +44 (0)23 8063 1441 +fax: +44 (0)23 8033 9691 +net: mpe@mpeforth.com + tech-support@mpeforth.com +web: www.mpeforth.com + +From North America, our telephone and fax numbers are: + 011 44 23 8063 1441 + 011 44 23 8033 9691 + + +To do +===== + +Change history +============== +)) + +decimal + +\ =========== +\ *! stackdef +\ *T Default stack layout +\ =========== +\ *P The code in *\i{StackDef.fth} provides the default task +\ ** and stack reservations. It assumes that you will be using +\ ** tasks and high-level Forth interrupt handlers. + +\ *P The Cortex-M3 has two stack pointers, SP_main and SP_process. +\ ** These are accessed as register R13 which is is also known as +\ ** RSP in the Forth assembler. After reset, SP_main is used and +\ ** SP_main is always used for exceptions/interrupts. To reduce +\ ** the overall RAM requirement, the initialisation code switches +\ ** the main task and all subsequent tasks) to use SP_process, +\ ** but leaves the CPU in privileged mode. + + +\ *************************** +\ *S Task area and Stack equates +\ *************************** +\ *P A task consists of three areas +\ *( +\ *B USER area, pointed to by UP. +\ *B Data stack, pointed to by PSP (usually R12). +\ *B Return stack, pointed to by RSP (always R13). +\ *) +\ *P The sizes of these areas are defined by the equates +\ ** *\fo{UP-SIZE}, *\fo{SP-SIZE}, and *\fo{RP-SIZE} in +\ ** the control file. + +\ *P The return stack must be the lowest of RSP, PSP and UP +\ ** in order to permit fast interrupt nesting. In order for +\ ** the task initialisation code in *\i{MultiCortex.fth} to +\ ** work correctly, *\fo{INIT-U0} must be the highest. + +rp-size sp-size + equ TASK-U0 \ -- offset +\ *G Initial offset of user area from the task base address. +rp-size sp-size + equ TASK-S0 \ -- offset +\ *G Initial offset of data stack from the task base address. +rp-size equ TASK-R0 \ -- offset +\ *G Initial offset of return stack from the task base address. + +task-size reserve equ INIT-T0 \ -- addr +\ *G Base of main task area. +init-t0 task-u0 + equ INIT-U0 \ -- addr +\ *G Base of main user area +init-t0 task-s0 + equ INIT-S0 \ -- addr +\ *G Top of main data stack +init-t0 task-r0 + equ INIT-R0 \ -- addr +\ *G Top of main return stack. The set code sets this as the +\ ** initial value of R13/SP_process. + +\ *P All tasks run in privileged Thread mode. Defining additional +\ ** tasks reserves RAM for the tasks. + +[defined] tib-len [if] +tib-len reserve equ INIT-TIB \ -- addr +\ Standalone Forths require a terminal input buffer. *\fo{INIT-TIB} +\ ** is defined if the equate *\fo{TIB-LEN} is defined. +[then] + + +\ *************************************** +\ *S Exception/Interrupt stack allocation +\ *************************************** +\ *P The amount of RAM required for exception handlers is +\ ** affected by the number of nexsted interrupt handlers +\ ** and the number of SVC/SWI calls that can be nested. + +\ IRQ stacks ; nestable up to #IRQs +\ We assume that high level interrupt handlers will be used + +#IRQs #SVCs + task-size * equ IRQ_STACK_SIZE \ -- len +\ *G Total RAM required for exception/interrupt handlers stacks. + +0 reserve equ INT_STACK_TOP \ -- addr +\ *G Top of exception stacks +IRQ_STACK_SIZE reserve equ INT_STACK_BASE +\ *G Bottom of exception stacks + + +\ ====== +\ *> ### +\ ====== + +decimal + diff --git a/mwmouse/sources/SysTick.fth b/mwmouse/sources/SysTick.fth @@ -0,0 +1,161 @@ +\ SysTickDisco072.fth - Cortex-M0 ticker for STM32F072B-DISCO board + +(( +Copyright (c) 2010, 2011, 2014 +MicroProcessor Engineering +133 Hill Lane +Southampton SO15 5AF +England + +tel: +44 (0)23 8063 1441 +fax: +44 (0)23 8033 9691 +email: mpe@mpeforth.com + tech-support@mpeforth.com +web: http://www.mpeforth.com +Skype: mpe_sfp + +From North America, our telephone and fax numbers are: + 011 44 23 8063 1441 + 011 44 23 8033 9691 + 901 313 4312 (North American access number to UK office) + + +To do +===== + +Change history +============== +20140207 SFP003 Converted for STM32F072B-DISCO board. +20110218 MPE002 Added timebase extensions. +)) + +only forth definitions +decimal + +\ =========== +\ *> drivers +\ =========== +\ *S System Ticker +\ **************** +\ *P The system ticker uses the Cortex-M0 *\i{SysTick} timer. +\ ** Although the *\i{SysTick} timer is common to all Cortex-M0 +\ ** devices, there is no guarantee that they have the same +\ ** clocking arrangements. Consequently there are different +\ ** drivers for different implementations. + +\ *P The STM32 implementation is fed with the system clock and +\ ** has an option to divide it by 8, controlled by bit 2 of the +\ ** SysTick Control and Status Register (ARM DDI 0337, Rev E, +\ ** page 8-8). +\ *( +\ *B Bit2=0: SysTick clock is HCLK/8. +\ *B Bit2=1: SysTick clock is HCLK. +\ *) +\ *P This code always uses HCLK/8. + + +variable LedActive \ -- flag +\ *P If *\fo{LedActive} contains non-zero, the ticker is used +\ ** to produce a rotating pattern on the four LEDs. + 1 LedActive ! + +variable <ticks> + +: ticks \ -- ms +\ *G Returns a 32 bit number of milliseconds that eventually +\ ** wraps. + <ticks> @ +; +compiler +: ticks \ -- ms + <ticks> @ +; +target + +PC 6 pio: LDU \ -- struct +\ *G Red/Upper LED. +PC 9 pio: LDR \ -- struct +\ *G Green/Right LED. +PC 7 pio: LDD \ -- struct +\ *G Blue/Down LED. +PC 8 pio: LDL \ -- struct +\ *G Orange/Left LED. + +: SysTicker \ -- +\ *G Ticker ISR action. + tick-ms <ticks> +! \ update ticker +\ LedActive @ if +\ case ticks $7FF and \ 0..2047 +\ $000 of LDL clrPin LDU setPin endof +\ $200 of LDU clrPin LDR setPin endof +\ $400 of LDR clrPin LDD setPin endof +\ $600 of LDD clrPin LDL setPin endof +\ endcase +\ then +; +' SysTicker SysTickvec# EXC: SysTickISR \ -- addr +\ *G Setting the high level ISR. + +tick-ms system-speed 8 / #1000 */ 1- equ /SysTick \ -- x +\ +G Initial value of the SysTick Reload register. + +internal +\ : initLD \ struct -- +\ dup isOutput setPin +\ ; +external + +: start-clock \ -- +\ *G Initialise the system ticker to run with a period of +\ ** *\fo{tick-ms} milliseconds. +\ LDU initLD LDR initLD LDD initLD LDL initLD + _SCS + /SysTick over stRVR + ! \ set ticker rate + $0003 over stCSR + ! \ enable, bit 0 = enable, bit 1=interrupt + \ bit 2 = clock source (1=sysclk, 0=sysclk/8) + $FF over $0D23 + c! \ set SysTick priority to lowest + drop + ei +; + +: stop-clock \ -- +\ *G Stop the sytem ticker. + bit0 _SCS stCSR + bic! ; + +: later \ n -- n' +\ *G Generates the timebase value for termination in +\ ** n millseconds time. + ticks + +; + +: timedout? \ n -- flag ; true if timed out +\ *G Flag is returned true if the timebase value n has timed out. +\ ** *\fo{TIMEDOUT?} does not call *\fo{PAUSE}. + ticks - 0< \ must use circular arithmetic +; + +compiler +: later \ n -- n' + ticks + +; + +: timedout? \ n -- flag ; true if timed out + ticks - 0< \ must use circular arithmetic +; +target + +: ms \ n -- +\ *G Waits for n milliseconds. + later begin + pause dup timedout? + until + drop +; + + +\ ====== +\ *> ### +\ ====== + +decimal + diff --git a/mwmouse/sources/SysTickDisco072.fth b/mwmouse/sources/SysTickDisco072.fth @@ -0,0 +1,161 @@ +\ SysTickDisco072.fth - Cortex-M0 ticker for STM32F072B-DISCO board + +(( +Copyright (c) 2010, 2011, 2014 +MicroProcessor Engineering +133 Hill Lane +Southampton SO15 5AF +England + +tel: +44 (0)23 8063 1441 +fax: +44 (0)23 8033 9691 +email: mpe@mpeforth.com + tech-support@mpeforth.com +web: http://www.mpeforth.com +Skype: mpe_sfp + +From North America, our telephone and fax numbers are: + 011 44 23 8063 1441 + 011 44 23 8033 9691 + 901 313 4312 (North American access number to UK office) + + +To do +===== + +Change history +============== +20140207 SFP003 Converted for STM32F072B-DISCO board. +20110218 MPE002 Added timebase extensions. +)) + +only forth definitions +decimal + +\ =========== +\ *> drivers +\ =========== +\ *S System Ticker +\ **************** +\ *P The system ticker uses the Cortex-M0 *\i{SysTick} timer. +\ ** Although the *\i{SysTick} timer is common to all Cortex-M0 +\ ** devices, there is no guarantee that they have the same +\ ** clocking arrangements. Consequently there are different +\ ** drivers for different implementations. + +\ *P The STM32 implementation is fed with the system clock and +\ ** has an option to divide it by 8, controlled by bit 2 of the +\ ** SysTick Control and Status Register (ARM DDI 0337, Rev E, +\ ** page 8-8). +\ *( +\ *B Bit2=0: SysTick clock is HCLK/8. +\ *B Bit2=1: SysTick clock is HCLK. +\ *) +\ *P This code always uses HCLK/8. + + +variable LedActive \ -- flag +\ *P If *\fo{LedActive} contains non-zero, the ticker is used +\ ** to produce a rotating pattern on the four LEDs. + 1 LedActive ! + +variable <ticks> + +: ticks \ -- ms +\ *G Returns a 32 bit number of milliseconds that eventually +\ ** wraps. + <ticks> @ +; +compiler +: ticks \ -- ms + <ticks> @ +; +target + +PC 6 pio: LDU \ -- struct +\ *G Red/Upper LED. +PC 9 pio: LDR \ -- struct +\ *G Green/Right LED. +PC 7 pio: LDD \ -- struct +\ *G Blue/Down LED. +PC 8 pio: LDL \ -- struct +\ *G Orange/Left LED. + +: SysTicker \ -- +\ *G Ticker ISR action. + tick-ms <ticks> +! \ update ticker +\ LedActive @ if +\ case ticks $7FF and \ 0..2047 +\ $000 of LDL clrPin LDU setPin endof +\ $200 of LDU clrPin LDR setPin endof +\ $400 of LDR clrPin LDD setPin endof +\ $600 of LDD clrPin LDL setPin endof +\ endcase +\ then +; +' SysTicker SysTickvec# EXC: SysTickISR \ -- addr +\ *G Setting the high level ISR. + +tick-ms system-speed 8 / #1000 */ 1- equ /SysTick \ -- x +\ +G Initial value of the SysTick Reload register. + +internal +\ : initLD \ struct -- +\ dup isOutput setPin +\ ; +external + +: start-clock \ -- +\ *G Initialise the system ticker to run with a period of +\ ** *\fo{tick-ms} milliseconds. +\ LDU initLD LDR initLD LDD initLD LDL initLD + _SCS + /SysTick over stRVR + ! \ set ticker rate + $0003 over stCSR + ! \ enable, bit 0 = enable, bit 1=interrupt + \ bit 2 = clock source (1=sysclk, 0=sysclk/8) + $FF over $0D23 + c! \ set SysTick priority to lowest + drop + ei +; + +: stop-clock \ -- +\ *G Stop the sytem ticker. + bit0 _SCS stCSR + bic! ; + +: later \ n -- n' +\ *G Generates the timebase value for termination in +\ ** n millseconds time. + ticks + +; + +: timedout? \ n -- flag ; true if timed out +\ *G Flag is returned true if the timebase value n has timed out. +\ ** *\fo{TIMEDOUT?} does not call *\fo{PAUSE}. + ticks - 0< \ must use circular arithmetic +; + +compiler +: later \ n -- n' + ticks + +; + +: timedout? \ n -- flag ; true if timed out + ticks - 0< \ must use circular arithmetic +; +target + +: ms \ n -- +\ *G Waits for n milliseconds. + later begin + pause dup timedout? + until + drop +; + + +\ ====== +\ *> ### +\ ====== + +decimal + diff --git a/mwmouse/sources/TAB.hex b/mwmouse/sources/TAB.hex @@ -0,0 +1,1980 @@ +:020000040800F2 +:10000000203C00208D010008E5430008454400081D +:10001000090100080B0100080000000000000000BA +:100020000000000000000000000000000F010008B8 +:1000300011010008000000001301000835560008F7 +:1000400000000000000000000000000000000000B0 +:1000500000000000000000000000000000000000A0 +:100060000000000000000000000000000000000090 +:100070000000000000000000000000000000000080 +:100080000000000000000000000000000000000070 +:100090000000000000000000000000000000000060 +:1000A0000000000000000000000000000000000050 +:1000B0000000000000000000000000000000000040 +:1000C0000000000000000000000000000000000030 +:1000D0000000000000000000000000000000000020 +:1000E0000000000000000000000000000000000010 +:1000F0000000000000000000000000000000000000 +:1001000040380008FEE7FEE7FEE7FEE7FEE7FEE711 +:10011000FEE7FEE7FEE72020174D01202968014396 +:100120002960361F37602F4600B500BF3D680220AA +:100130000540FBD01120114908601148786000206B +:10014000F862104839680143396000BF3D680E48C5 +:100150000540FBD03D1D0C3E032131600221716042 +:10016000B7602F4601F0FEFB7D680C200540082D8E +:10017000FAD180CE00BD01BC001002400020024038 +:1001800000801004000000010000000200B500BF64 +:10019000104D85F30888104D85F30988022585F3F5 +:1001A0001488BFF36F8F0D4E0D4DAB460D490E48B1 +:1001B0000D6805430D600D490D480D6885430D60C0 +:1001C000FFF7AAFF0B48056801200543A847DFE7B2 +:1001D00000BD0000203C0020203E0020043F002005 +:1001E000103F00201410024014007E00281002402E +:1001F00000007E0000010008043F0020203E002097 +:1002000000000000000000000000000000000000EE +:100210000A0000000000000000C0000800C0000844 +:10022000B80000204C0000202DADD60200000000D8 +:10023000C3414E4431680F40361D70470000000036 +:10024000C24F522031680F43361D70470000000036 +:10025000C3584F5231684F40361D704700000000B0 +:10026000C6494E5645525420FF43704700000000D7 +:10027000C2303D20002F01D0002701E001277F423E +:100280007047000000000000C3303C3E002F01D149 +:10029000002701E001277F4270470000700200083C +:1002A000C2303C20002F01D4002701E001277F420B +:1002B00070470000A0020008C2303E20002F01DC81 +:1002C000002701E001277F42704700000000000086 +:1002D000C13D20203068874201D0002701E001277E +:1002E0007F42361D70470000D0020008C23C3E200D +:1002F0003068874201D1002701E001277F42361D87 +:100300007047000000000000C13C20203068874298 +:1003100001DC002701E001277F42361D7047000005 +:1003200060020008C13E20203068874201DB0027C0 +:1003300001E001277F42361D70470000EC020008F3 +:10034000C23C3D203068874201DA002701E00127E6 +:100350007F42361D7047000000000000C23E3D2075 +:100360003068874201DD002701E001277F42361D0A +:100370007047000000000000C2553E2030688742F0 +:1003800001D3002701E001277F42361D704700009E +:1003900078030008C2553C203068874201D8002706 +:1003A00001E001277F42361D7047000094030008DA +:1003B000C344303C002F01D4002701E001277F42D5 +:1003C000361D7047B0030008C344303D31680F4309 +:1003D000002F01D0002701E001277F42361D704722 +:1003E00000000000C2443D2007CE3B1C0027801ABD +:1003F0008B41384300D1FF43704700005C03000885 +:10040000C34D494E01CE874200DD074670470000CC +:1004100000040008C34D415801CE874200DA074668 +:100420007047000008030008C657495448494E2049 +:1004300030683F1A716830680D1AAF4201D8002742 +:1004400001E001277F42083670470000B80200082B +:10045000C64C534849465420384680CE87407047A2 +:1004600000000000C652534849465420384680CE0A +:10047000C740704764040008C74152534849465476 +:10048000384680CE0741704700000000C7455845F8 +:10049000435554450120384380CE00470121704622 +:1004A0008843026810470000391C80CEF6D07046A1 +:1004B000001D004701CEB842F0D180CEF7E7000022 +:1004C0000099491C0091E9D703B0F0E70099C919D8 +:1004D000009180CEE2D703B0E9E7000002CE01240C +:1004E000E40773465B1E1A680919781A07B480CEB0 +:1004F000DDE7000002CEB942F1D180CECEE70000A8 +:1005000040020008C54C45415645202002B000BDC0 +:1005100000000000C63F4C45415645203F1C80CEA0 +:1005200000D1704702B000BD00000000C14920208A +:10053000361F3760009F01983F187047500200082F +:10054000C14A2020361F3760039F04983F18704728 +:1005500040050008C6554E4C4F4F502003B0704721 +:10056000E4030008C3533E44FD17361F37602F468F +:100570007047000050040008C44E4F4F5020202008 +:100580007047000024030008C24D2B2003CEFA1749 +:10059000C91950410746361F31607047880200086C +:1005A000C2312B207F1C7047A0050008C2312D20CE +:1005B0007F1E70478C040008C12B20203068361D38 +:1005C0003F18704740030008C12D20203068361DB9 +:1005D000C71B704730020008C64E454741544520AE +:1005E0007F42704764050008C2442B2007CE801864 +:1005F0004F41361F30607047E8050008C2442D2087 +:1006000007CE101AB9410F46361F30607047000000 +:1006100054050008C7444E45474154453068002101 +:100620004042B9410F46306070470000FC050008A9 +:10063000C73F4E45474154453F1C80CE00D57F42C1 +:1006400070470000D8050008C3414253002F00D571 +:100650007F42704778040008C44441425320202060 +:100660003F1CDBD470470000C8030008C344322A93 +:10067000306800187F413060704700006C06000849 +:10068000C344322F306840107F108941C9070843A6 +:100690003060704714060008C12A202031684F439B +:1006A000361D704758060008C3554D2A3846316834 +:1006B00040B40A04120C0B0C0404240C050C16465E +:1006C00066431F466F4318466043010C000436180A +:1006D0004F4128465043010C000436184F4135461F +:1006E00040BC35607047000088050008C24D2A20D4 +:1006F00035687D4000B520B4002F00D57F423568B5 +:10070000002D00D56D423560FFF7D0FF20BC002DD5 +:1007100001D5FFF783FF00BD98060008C6554D2F91 +:100720004D4F442001CE3168202400224918404119 +:1007300013465341C01B5B4101D0491C00E0C01966 +:10074000641EF3D10F46306070470000B805000802 +:10075000C6464D2F4D4F442000B580B435687D40CE +:1007600020B480B480CEFFF77BFF009D002D00D524 +:100770006D42361F37602F46FFF7D4FF15480740FC +:1007800020BC002D01D4002501E001256D42002D83 +:10079000EFF3008001B430683760074601BC80F396 +:1007A000008800D57F4220BC002DEFF3008001B40B +:1007B00030683760074601BC80F3008808D57F4267 +:1007C0003068002804D07F1E009D30682D1A3560E7 +:1007D00001B000BDFFFFFF7F00000000C6534D2F9A +:1007E00052454D2000B5306801B480B480CEFFF78B +:1007F00037FF009D002D00D56D42361F37602F4614 +:10080000FFF790FF20BC009C6C40002C00D57F427D +:1008100020BC002DEFF3008001B43068376007463C +:1008200001BC80F3008800D57F42306837600746FE +:1008300000BD0000AC050008C42F4D4F442020200F +:1008400000B580B43168CF1720BC361F37602F4603 +:10085000FFF7C8FF00BD000014040008C12F2020CE +:1008600000B580B43168CF1720BC361F37602F46E3 +:10087000FFF7B8FF361D00BD80060008C2552F20C7 +:10088000361F0021316000B5FFF74CFF361D00BD5B +:100890005C080008C34D4F4400B5FFF7D1FF80CE80 +:1008A00000BD0000EC060008C24D2F2000B5FFF788 +:1008B00099FF361D00BD000038080008C64D552FB1 +:1008C0004D4F442000B580B4009F361F0021316099 +:1008D000FFF728FF20BC80B42F46FFF723FF20BC82 +:1008E000361F37602F4600BDA8080008C52A2F4DC7 +:1008F0004F44202000B580B480CEFFF7F9FE20BC25 +:10090000361F37602F46FFF76DFF00BD5007000808 +:10091000C22A2F2000B5FFF7EDFF361D00BD0000F5 +:1009200004050008C34E4950361D7047A80600084C +:10093000C45455434B202020361F716831607760C6 +:100940007047000048060008C45049434B2020204F +:10095000BF00F7597047000030060008C4524F4CE2 +:100960004C202020B800002801DC80CE704737588A +:10097000011F72583250081CFAD1361D7047000012 +:1009800014050008C3524F543D46776831687160C2 +:100990003560704724090008C42D524F5420202090 +:1009A0003D4637687168316075607047940800088B +:1009B000C23E522080B480CE704700004809000833 +:1009C000C2523E20361F376080BC7047C009000805 +:1009D000C2524020361F3760009F704784090008CC +:1009E000C3323E5203CE01B480B40F1C70470000E6 +:1009F000E0090008C332523E03BC083E3160776014 +:100A000007467047F4090008C33252400098019924 +:100A1000083E316077600746704700007C08000898 +:100A2000C453574150202020306837600746704734 +:100A3000200A0008C3445550361F37607047000035 +:100A4000BC080008C44F564552202020361F37608E +:100A50007768704730090008C444524F5020202066 +:100A600080CE7047340A0008C53244524F502020CF +:100A70007768083670470000680A0008C532535787 +:100A800041502020706877600746B0683168B160D7 +:100A9000306070475C090008C43244555020202063 +:100AA000083EB16831607760704700007C0A00083A +:100AB000C5324F5645522020083E3169316077607B +:100AC000F7687047440A0008C43F4455502020206E +:100AD000002F01D0361F376070470000980A0008C9 +:100AE000C3535040361F376037467047E00A00084E +:100AF000C35350213E4680CE70470000080A0008CC +:100B0000C3525040361F37606F467047000B0008D5 +:100B1000C3525021BD4680CE70470000580A0008DD +:100B2000C5434F554E5420207D1C3F78361F3560FD +:100B300070470000F00A0008C72F535452494E472F +:100B40003168CD1B70683F1877602F46361D70479F +:100B5000B00A0008C4534B495020202003CE401C4B +:100B6000401E04D00A78BA4201D1491CF8E7361F6A +:100B70003160074670470000540B0008C4534341DE +:100B80004E20202003CE401C401E04D00A78BA42DA +:100B900001D0491CF8E7361F316007467047000056 +:100BA000100B0008C2533D2003CE3F1C07D0027833 +:100BB0000B78401C491C9A4201D17F1EF7D102D10B +:100BC00001277F4200E00027704700002C05000845 +:100BD000C7434F4D504152457168CD1B00B520B4FD +:100BE00071688F4200DB0F1C31687160361D00BFD9 +:100BF000002F23D075682D78346824782C1B002CA6 +:100C0000EFF3008001B4361F71683160B168716024 +:100C1000B760274601BC80F3008804D001B080B4DF +:100C20000027361D09E037687F1C75686D1CB068A9 +:100C3000441E7760B5602746361DD9E780BC002F7B +:100C4000EFF3008001B4083601BC80F3008807D0C0 +:100C5000002F01D4002701E001277F420120074334 +:100C600000BD202000B5B16802B4716802B43168DB +:100C700002B480B480B0484601B4E946F768103643 +:100C80004D462D694C46E4684B465B68E31A5B1C95 +:100C90005B19083E336077602F4600BFFFF72AFCE0 +:100CA0000F0D0008009D019805442D784C46A4685E +:100CB0002478AC4226D1009D019805444C46A46896 +:100CC0004B465B680C3E34607560B7601F46FFF7AB +:100CD0006BFF002F80CE15D0009D019805444C4637 +:100CE000E468009B019803444A4612699A1AA21AC2 +:100CF00003B00C3E32607560B7600B4F01BC81469B +:100D000004B000BD0098401C0090CBD703B04D4606 +:100D10002D694C46E4680C3E34607560B76000276E +:100D200001BC814604B000BDFFFFFFFFDC070008E7 +:100D3000C6534541524348207068874200B502DDE2 +:100D40000027361D00BD002F02DC064F361D00BDFA +:100D50007068002802DC0027361D00BDFFF782FF07 +:100D600000BD0000FFFFFFFF200B0008C5434D4FF3 +:100D7000564520203B1C83CE00D17047021C0A43FD +:100D80001A430324144006D10A680260091D001D9D +:100D90001B1FF9D170470A780270491C401C5B1E6A +:100DA000F9D17047300D0008C6434D4F56453E20DF +:100DB0003B1C83CE00D17047C018C918021C0A43DF +:100DC0001A430324144006D1091F001F0A68026059 +:100DD0001B1FF9D17047491E401E0A7802705B1E26 +:100DE000F9D170476C0D0008C3555043612F00B511 +:100DF00003DB7A2F01DCDF20074000BDD00B0008A9 +:100E0000C55550504552202030683F183068376033 +:100E1000074600B5FFF76EFB430E0008009D0198E2 +:100E200005442D78361F37602F46FFF7DFFF009D02 +:100E3000019805442F7080CE0098401C0090EDD79B +:100E400003B000BDA40B0008C5504C414345202011 +:100E500000B5306801B480B47F1C30683760074645 +:100E600001F05CFF20BC10BC2C7000BD980900088C +:100E7000C24F4E2001204042386080CE70470000B3 +:100E800078050008C34F46460020386080CE704782 +:100E9000D0090008C232402003CF361F0746316018 +:100EA00070470000940E0008C23221203A1C83CE05 +:100EB00003C27047000E0008C446494C4C20202055 +:100EC0003A1C83CE002803D00A70491C401EFBD177 +:100ED0007047000028040008C22B212030683968C0 +:100EE000091839607768083670470000D80E000886 +:100EF000C4494E43522020203868401C386080CEC0 +:100F000070470000E80D0008C444454352202020EB +:100F10003868401E386080CE70470000700E0008B0 +:100F2000C14020203F687047A80D0008C2574020EC +:100F30003F887047480E0008C24340203F78704702 +:100F4000840E0008C1212020306838607768083698 +:100F5000704700002C0F0008C257212030683880ED +:100F60007768083670470000380F0008C243212018 +:100F7000306838707768083670470000100900083C +:100F8000C8544553542D4249542020203F7831689D +:100F90000F40361D70470000B80E0008C753455477 +:100FA0002D424954306839780143397077680836E2 +:100FB000704700001C070008C952455345542D4294 +:100FC0004954202030683978814339707768083671 +:100FD00070470000C80A0008C54E414D453E20201C +:100FE0003D781F200540ED192D1D2F4603218F430D +:100FF00070470000D80F0008C53E4E414D452020E7 +:1010000000B500BF3F1F3D6880200540FAD000BDFD +:1010100000B500BF3F68002F2BD03D781F20054052 +:101020003068854223D17D1C0C3E3169316075608A +:10103000B760F768FFF7B8FD002F80CE17D0776054 +:10104000361DFFF7CDFF35682D7840200540EFF3C2 +:10105000008001B4361D01BC80F3008803D0361F28 +:101060003760054F02E0361F3760012700BD3F1F84 +:10107000D0E70027083600BDFFFFFFFF002F00B5B7 +:1010800001D108360CE075682D7830682D183C6861 +:10109000641E2C40641CA400E4192746FFF7B8FF27 +:1010A00000BD000001CE30380BD40A2802DBC01F7F +:1010B0000A2806DBB84204DA01277F42361F306077 +:1010C00070470027704700003F1D7047BF00704702 +:1010D0003F1F7047361F3760042770473D0C361F8F +:1010E00037602F4600B501F013F801F011F800BD8C +:1010F00031680D0C083E3560776000B500F02EFDBC +:10110000BF1C00F02BFD00BD30680740002F01D050 +:10111000002701E001277F423068002801D4002524 +:1011200001E001256D427D402F46361D704720208D +:101130003F1D3168CF1B7F10154D3D40FC0A1548FF +:10114000044024042C43083E37607460B760124F9B +:1011500000B5FFF7D9FF1148074031680F43361F2C +:10116000B168316077600E4FFFF7CEFF0D48074042 +:1011700031680F437068002801D4002501E0012583 +:101180006D42094805403D432F46083600BD00002A +:10119000FF070000FF030000000020000020000007 +:1011A00000004000000800000000000400B5FFF748 +:1011B000BFFF0148074300BD00D000F0361F376075 +:1011C000024F00B500F0A4FF00BD000000B5000014 +:1011D000361F3760024F00B500F09AFF00BD0000D7 +:1011E00000BF0000361F71683160776000B5FFF7FF +:1011F000DDFF306837600746FFF77AFF00BD20202B +:10120000361F3760044F00B500F082FF361F37608D +:10121000024F00F07DFF00BD361F00003760000068 +:10122000361F3760074F00B500F072FF361F37607A +:10123000054F00F06DFF361F3760044F00F068FF68 +:1012400000BD000070460000401E0000076800005E +:1012500000B500F0BBFEFFF7A9FFFFF73FFF00BDA1 +:1012600000B500F0B3FE0220074080CE01D0FFF7AA +:10127000AFFFFFF7EDFF00BD00B5FFF79FFF00BD1B +:10128000361F37607046401E0768401D004700004B +:10129000361F3760009F7F1E3978C919091D032248 +:1012A0009143491C00917047080F0008C7414C4901 +:1012B000474E4544FF1C03218F437047361F37605C +:1012C0007046401E076800BDB80F0008C8434F4D68 +:1012D00050494C452C20202000B5FFF7B9FF00BD38 +:1012E000F80F0008C53E424F44592020BF687047A0 +:1012F00000B5FFF76DFFFFF761FF361F3760024F44 +:10130000FFF7A6FF00BD0000BC12000800B5FFF704 +:101310005FFFFFF753FF361F3760042700F072FEB0 +:1013200000BD202000B500F0ABFE00F07FFFFFF70E +:10133000EDFF30683760074600F0DAFE00F0ACFEE3 +:1013400000BD202000B520BC01218D43361F376031 +:101350002F4600F0F9FEFFF743FE3F1DFFF742FF67 +:1013600000BD000000B500BF00F0D8F8000000206C +:10137000800F0008C3494D4D0249012040420860DA +:101380007047000000000020CC120008813A2020A5 +:1013900000B501F03FFD01F009FD00F047FF00F04E +:1013A000DBFE01F043FFFFF767FF00BD200F0008E1 +:1013B000C73A4E4F4E414D4500B501F0F7FC00F0E5 +:1013C00089FE00F003FE00F06BFD306838600027F6 +:1013D000361D00F08DFE00F0F9FD01F027FFFFF74C +:1013E0004BFF00BD580F000885444F45533E202059 +:1013F00000B500F0B1FD00F0DFFF05444F45533E5E +:10140000361F37600C4FFFF767FF00F0A5FD00F0B7 +:10141000D3FF0161FFF7F4FE00F09EFD00F0CCFF6A +:1014200001620000FFF7FCFE00F096FD00F0C4FF33 +:101430000163000000BD000044130008E813000829 +:10144000C64352454154452000B500F02BFE00F044 +:1014500017FE30683760074600F0E8FEFFF748FFE8 +:1014600000F06EFF00F018FE00BD0000E41200085E +:10147000C73C4255494C445300B500F013FE00F000 +:10148000FFFD30683760074600F0D0FEFFF73EFFF3 +:1014900000F056FF00F000FE00BD00008C130008B5 +:1014A000C8434F4E5354414E5420202000B5FFF7FF +:1014B00039FFFFF747FF361F37607046401E076849 +:1014C00000BD0000A0140008C932434F4E535441E0 +:1014D0004E54202000B5FFF725FF00F009FEFFF76E +:1014E00031FF083E77607046401E076841683160F2 +:1014F00000BD0000C8050008C85641524941424C91 +:101500004520202000B500F08DFDFFF70BFF361FB2 +:101510003760042700F094FDFFF714FF361F376093 +:101520007046401E076800BD40140008C74255467B +:101530004645523A00B500F075FDFFF7B7FF00F0E1 +:101540007FFD00BD2C150008C455534552202020B6 +:1015500000B5FFF7E7FEFFF7F5FE361F3760704670 +:10156000401E07685F4400BD704700004815000832 +:10157000C54445464552202000B500F053FDFFF715 +:10158000D1FE361F3760042700F05AFDFFF7DAFE60 +:101590007046401E006801680122114308BC9E4647 +:1015A0000847000000B500BFFFF7B8FF04000020A7 +:1015B00000B500F05DFC3F68002F80CE05D080CEE6 +:1015C000FFF74EFE00F094FD05E03D4677680836D3 +:1015D00001200543A84700BD00B500F0BDFC00F0A8 +:1015E000EBFE1E496E76616C6964206F70657261F6 +:1015F000746F7220666F72207468697320747970DA +:1016000065000000361F3760014F00F007FF00BD86 +:10161000F3FFFFFF7146491E0868491D8E460760AB +:1016200080CE7047361F37607146491E0868491DD5 +:101630008E46076870470000C8140008C556414C24 +:101640005545202000B5FFF797FE80B480CE00F00E +:10165000E9FCFFF767FE20BC361F37602F4600F01D +:10166000E1FC306838600427361D00F0E9FCFFF724 +:1016700069FE361F37607046401E076811480568CE +:10168000104900200860002DEFF3008001B4361FE0 +:1016900037602F4601BC80F3008806D1361F0A4F01 +:1016A0000A493160FFF784FF0BE0012F06D1361F96 +:1016B000074F08493160FFF77BFF02E0FFF78CFF1F +:1016C00080CE00BD04000020240F0008241600086E +:1016D000480F000814160008380B000882544F20E9 +:1016E0000120014908607047040000206C0F0008C9 +:1016F000C55041555345202000B500BFFFF748FFB6 +:101700000800002000B500F061FC361F3760042798 +:1017100000F078FC00BD202000B500F057FC01204F +:10172000074330683760074600F02CFA00BD2020E0 +:1017300000B500F04BFC00BD0120074300B500F0F0 +:10174000D7FC00BD361F3760034F00B5FFF788FD9B +:10175000FFF7F2FF00BD00009C040008361F376051 +:10176000034F00B5FFF77CFDFFF7E6FF00BD00006B +:10177000A8040008361F3760034F00B5FFF770FD5F +:10178000FFF7C0FF00BD00009C040008361F376053 +:10179000034F00B5FFF764FDFFF7B4FF00BD000085 +:1017A000A8040008361F3760034F00B5FFF758FD47 +:1017B00000F09EFC00BD000080120008361F37605C +:1017C000024F00B5FFF788FD00BD0000600A000869 +:1017D000361F3760024F00B500F09AFC00BD0000D4 +:1017E00000BD0000361F3760044F00B5FFF738FD1D +:1017F000FFF788FFFFF79CFF00BD0000DC04000836 +:10180000361F3760044F00B5FFF72AFDFFF77AFF58 +:10181000FFF78EFF00BD0000F4040008361F37609C +:10182000044F00B5FFF71CFDFFF786FFFFF774FFBD +:1018300000BD0000C0040008361F3760044F00B52B +:10184000FFF70EFDFFF778FFFFF766FF00BD000012 +:10185000CC04000800B500BFFFF760FE0C000020BC +:1018600005480568361F37602F4600B5FFF760FF53 +:1018700001490F6080CE00BD0C000020361F37608C +:10188000034F00B5FFF7ECFCFFF73CFF00BD000085 +:10189000B404000800B5FFF76DFF306837600746F5 +:1018A000FFF73AFF00BD202000B500BF361F3760AC +:1018B000374600F0CDFA3F6830688742EFF300808A +:1018C00001B47768083601BC80F3008802D0FFF7C6 +:1018D00023FFEBE700BD202000B5FFF76FFFFFF708 +:1018E000E3FF02490F6080CE00BD00000C00002025 +:1018F00000B5FFF763FF06480568361F37602F46BF +:10190000FFF720FFFFF7D0FF01490F6080CE00BD39 +:101910000C00002000B5FFF739FF00BDDC16000801 +:10192000C244492072B670477C0B0008C24549206A +:1019300062B67047F00E0008C25B4920EFF31080DA +:1019400072B601B4704700003C160008C2495D2021 +:1019500001BC80F3108870479C0F0008C7534554A2 +:101960004D41534B3D683068C4432C40706804437C +:101970003C60B7680C367047B0090008C7494E494B +:10198000542D494F00B500BF3D68002D04D03D687F +:101990007C682C600837F7E780CE00BD07480568F3 +:1019A0008020054000B508D0054D0648686006480F +:1019B0006860802029698143296100BD10200240B0 +:1019C0000020024023016745AB89EFCD083E134953 +:1019D00031607760124F00B53068451E002DEFF37F +:1019E000008001B4356001BC80F3008804D0FD683C +:1019F00001200540002DEFD1FD6834242C40FC600F +:101A000030680028EFF3008001B42F46361D01BC7A +:101A100080F3008801D10348074300BD0000100097 +:101A2000002002400000008000B5FFF7B7FF084922 +:101A300001200D6805430D603068388077680836EE +:101A4000FFF7C4FF024901200D6885430D6000BD0A +:101A5000102002400B483F1A00B5FFF79FFF0A4DC8 +:101A600002202969014329616F61402029690143EE +:101A7000296180CEFFF7AAFF044902200D68854343 +:101A80000D6000BD00000008002002401020024050 +:101A900000B5FFF7C9FF80CE00BD20203D7830683B +:101AA000854200B502D17768083600BD3D46012168 +:101AB0008D4301200740EFF3008001B42F4601BCA5 +:101AC00080F3008806D031680D023C782C433760E3 +:101AD000274605E07D782D0231680D4337602F469B +:101AE000306837600746FFF7D3FF00BD074D316808 +:101AF0000D40083E3560776000B5FFF7C9FF3168DB +:101B00000D0CBF1C3560FFF7C3FF00BDFFFF0000D9 +:101B1000083E044931607760034F00B5FEF788FC4A +:101B200000BD000000000008000010082019000897 +:101B3000C3432146361F376000B5FFF7E9FF002F8A +:101B400080CE02D0FFF7AAFF03E0306838707768D4 +:101B5000083600BD5C190008C3572146361F3760A0 +:101B600000B5FFF7D5FF002F80CE02D0FFF790FF22 +:101B700003E0306838807768083600BD70140008CC +:101B8000C2214620361F376000B5FFF7C1FF002F86 +:101B900080CE02D0FFF7AAFF03E030683860776894 +:101BA000083600BD38190008C7464C455241534518 +:101BB00030683F1830683760074600B5FEF79AFC7A +:101BC0000B1C0008009D01980544361F37602F4606 +:101BD000FFF79EFF002F80CE09D0009D019805449D +:101BE000361F37602F46FFF735FF084F07E0009D8F +:101BF0000198054406482860361F3760042700987E +:101C0000C019009080CEDDD703B000BD00080000F1 +:101C1000FFFFFFFF083EB1683160776000B5FFF756 +:101C2000C7FF31687D1811480468083E346077604A +:101C30002F46FFF7A7FF30683F1830683760074628 +:101C4000FEF758FC691C00083D68009C019804449C +:101C5000083E356077602746FFF794FF3F1D0098E8 +:101C6000001D0090F0D703B080CE00BD2802000810 +:101C700000B500BFFFF752FC100000202C1900082F +:101C8000C453454C4620202000B500BFFFF765FC3B +:101C900000000000F0160008C253302000B500BF5D +:101CA000FFF75BFC18000000A80E0008C2523020AD +:101CB00000B500BFFFF751FC1C000000801C0008AD +:101CC000C42354494220202000B500BFFFF745FC43 +:101CD000200000004C190008C4275449422020204D +:101CE00000B500BFFFF739FC24000000B013000866 +:101CF000C33E494E00B500BFFFF72FFC280000008F +:101D00007C190008C8584F4E2F584F4646202020B7 +:101D100000B500BFFFF721FC2C0000007413000881 +:101D2000C74543484F494E4700B500BFFFF715FC74 +:101D300030000000440F0008C34F555400B500BFE9 +:101D4000FFF70BFC34000000301B0008C442415375 +:101D50004520202000B500BFFFF7FFFB3800000042 +:101D6000D81C0008C3484C4400B500BFFFF7F5FB82 +:101D70003C000000EC080008C748414E444C455266 +:101D800000B500BFFFF7E9FB40000000C01C0008E1 +:101D9000C344504C00B500BFFFF7DFFB4400000018 +:101DA000AC1C0008C54F50564543202000B500BF6D +:101DB000FFF7D3FB48000000F8140008C54950564F +:101DC0004543202000B500BFFFF7C7FB4C000000D3 +:101DD00000B500BFFFF7C1FB50000000801B0008EA +:101DE000C350414400B500BFFFF7B7FB98000000A7 +:101DF000A41D0008C2424C2000B500BFFFF75BFBEA +:101E000020000000641D0008C546454E43452020C3 +:101E100000B500BFFFF782FB140000204C1D000836 +:101E2000C244502000B500BFFFF778FB1800002027 +:101E3000F41D0008C252502000B500BFFFF76EFB32 +:101E40001C00002000B500BFFFF768FB2000002049 +:101E500000B500BFFFF762FB24000020081E000849 +:101E6000C358445000B500BFFFF758FB28000020BE +:101E700000B500BFFFF752FB2C00002000B500BFEB +:101E8000FFF74CFB3000002000B500BFFFF746FB1A +:101E900034000020041D0008C44C4153542020206D +:101EA00000B500BFFFF73AFB3C00002000B500BFC3 +:101EB000FFF76EFB4000002000B500BF00F05DFFA3 +:101EC000C41E00084C00002000B500BFFFF726FB31 +:101ED00090000020BC1D0008C34B45595D46ED6CC9 +:101EE0002D6800B501200543A84700BD781D0008F6 +:101EF000C44B45593F2020205D46ED6C6D6800B510 +:101F000001200543A84700BD70150008C4454D4990 +:101F1000542020205D46696B491C69635D46AD6CA9 +:101F2000AD6800B501200543A84700BDAC1200080C +:101F3000C4545950452020205D46696BC919696316 +:101F40005D46AD6CED6800B501200543A84700BDB6 +:101F5000981C0008C24352205D46002068635D461D +:101F6000AD6C2D6900B501200543A84700BD0000F8 +:101F7000301F0008C553504143452020361F3760AD +:101F8000202700B5FFF7C6FF00BD00000C1F0008AA +:101F9000C653504143455320002F00DC0027361F15 +:101FA0003760002700B500BFFEF7A4FABF1F000886 +:101FB000FFF7E4FF0098401C0090F9D703B000BD84 +:101FC000201D0008C44845524520202003480568CC +:101FD0002D68361F37602F4670470000280000200C +:101FE000381D0008C34F5247024805682F6080CE55 +:101FF0007047000028000020201E0008C5414C4CFE +:102000004F542020034805682968C919296080CEEB +:102010007047000028000020901D0008C552484568 +:102020005245202002480568361F37602F4670470A +:102030001C000020741F0008C652414C4C4F542015 +:1020400002490868C019086080CE70471C00002053 +:10205000541F0008C3524F4D0148024908607047A1 +:10206000180000202800002054200008C352414DD1 +:1020700001480249086070471C0000202800002029 +:1020800004480568361F37602F4600B5FFF7E4FFA8 +:1020900000BD00002800002001490F6080CE70477D +:1020A00028000020064805680648854201D0002522 +:1020B00001E001256D42361F37602F467047000052 +:1020C0002800002018000020FC1F0008C5414C49D2 +:1020D000474E202000B5FFF779FFFF1C03218F43F7 +:1020E000FFF782FF00BD0000A81B0008C12C2020C4 +:1020F00000B5FFF76BFFFFF745FD361F376004277C +:10210000FFF780FF00BD0000901F0008C2572C2081 +:1021100000B5FFF75BFFFFF721FD361F3760022791 +:10212000FFF770FF00BD00006C200008C2432C20A8 +:1021300000B5FFF74BFFFFF7FDFC361F37600127A7 +:10214000FFF760FF00BD202002480568361F37609A +:102150002F4670473C0000200448056804490D6084 +:102160002D1F2D6801490D60704700003C000020C4 +:10217000900000200248056802490D607047000089 +:10218000900000203C000020581B0008C446494E27 +:10219000442020207D1C3C78083E3560776027462F +:1021A00000B5FEF731FE3D78002D26D0154D2C46AA +:1021B0000834083E346077602F4600BFFEF78EF982 +:1021C000FB2100087D1C3C78009B019803441B68A0 +:1021D0000C3E34607560B7601F46FEF74FFF002F5E +:1021E00000D180CE04D003B031687160361D00BDCF +:1021F0000098001D0090E5D703B0361F3760002718 +:1022000000BD000034000020E01D0008C52E4E4136 +:102210004D4520207D1C3F781F200740361F35602C +:1022200000B5FFF789FEFFF7A9FE00BD361F376036 +:10223000202700B500F0A0FC7D1C3F780C3E3560E7 +:102240007760B560FEF7E0FD3A4805680C3E376000 +:10225000F1687160B7602F46FEF710FF002F80CE47 +:102260000ED0FEF7CDFEFFF777FEFFF7D3FF00F0AD +:10227000A3F80D6973207265646566696E656420F4 +:10228000FFF728FF35682D78ED192A480468236880 +:102290005B1E1D40AD00241D64192568083E346096 +:1022A00077602F46FFF724FFFFF790FE31680F603D +:1022B00077680836FFF78AFE1F490F607068471E6F +:1022C00035686D1C1D480468002CEFF3008001B4D4 +:1022D00077602F46361D01BC80F3008803D0361F7F +:1022E0003760802702E0361F3760C02771680878A2 +:1022F0003843087011490020086070683168471839 +:10230000706877600746361DFEF7F4F82D23000845 +:10231000009D019805442D88361F37602F46FFF732 +:10232000F7FE0098801C0090F2D703B0FFF7D2FEB2 +:1023300000BD0000300000203C0000200000002014 +:10234000002F80CE00B506D0074805682D1D361F2A +:1023500037602F4604E005480568361F37602F4672 +:10236000FFF7C6FE00BD0000180000201C00002082 +:1023700000B5FEF78DFF00BD00B5FEF789FF7D1C9F +:102380003F78361F356000BD00B5FEF781FF30682D +:102390000028EFF3008001B4361D01BC80F30088F3 +:1023A00005D05D462F65034F00F038F800E080CE81 +:1023B00000BD0000FEFFFFFF00B5FEF769FF7D1CBA +:1023C0003F78361F3560FFF7B7FD00BD38200008A5 +:1023D000C543415443482020361F3760374600B577 +:1023E00080B44F4680B45F463F6C80B46F465D4614 +:1023F0002F6435687768083601200543A84720BC5C +:102400005C46256401B001B0361F3760002700BD6F +:102410000C210008C55448524F572020002F00B50A +:1024200001D180CE00BD5D462D6CAD4620BC5C4622 +:10243000256420BCA94620BC80B42F463E1C80CE1B +:1024400080BC00BD2C210008C63F5448524F572085 +:1024500030680028EFF3008001B4361D01BC80F322 +:10246000008800B502D0FFF7D9FF00E080CE00BDA4 +:102470001C2000088641424F5254222000B500F033 +:10248000B5FC361F3760034FFEF726FF00F01AFF3A +:1024900000BD000088230008601E0008C34845589E +:1024A0005D461020A86370479C240008C74445433C +:1024B000494D414C5D460A20A8637047C41F00087F +:1024C000C4484F4C442020205D460448E96B09185D +:1024D000E9635D46ED6B2F7080CE7047FFFFFFFF15 +:1024E000341E0008C12320205D46AD6B361F3760C7 +:1024F0002F4600B5FEF7E6F970680928EFF3008073 +:1025000001B43D46776831687160356001BC80F385 +:10251000008800DDFF1D3037FFF7D6FF00BD00004B +:1025200048240008C223532000B500BFFFF7DCFF9A +:1025300035683D43002DF9D100BD0000D81E0008CC +:10254000C23C23205D4698355C46E5637047000039 +:1025500024250008C2233E205F46FF6B5D46983568 +:10256000ED1B37602F46704774240008C3442E5279 +:1025700000B580B437687068316871603060FEF70C +:102580006FF8FFF7DFFFFFF7CFFF70680028EFF36A +:10259000008001B431687160361D01BC80F3008891 +:1025A00004D5361F37602D27FFF78EFFFFF7D4FFC6 +:1025B00020BCED1B361F37602F46FFF7EDFCFFF701 +:1025C000BBFC00BDCC200008C2442E20361F376063 +:1025D000002700B5FFF7CCFFFFF7D0FC00BD0000DF +:1025E000F01E0008C12E2020FD17361F37602F4631 +:1025F00000B5FFF7EBFF00BD6C250008C2552E208B +:10260000361F3760002700B5FFF7E0FF00BD000070 +:10261000981E0008C22E522000B580B43168CF1732 +:1026200020BC361F37602F46FFF7A2FF00BD000019 +:10263000F01C0008C62B4449474954205D46AD6B49 +:10264000361F7168316077602F4600B5FEF72EF8AF +:102650005F46BF6B3568B16831607168B1607560A5 +:10266000FEF724F8FDF7C2FF5D466D6C6D1C03D0CC +:102670005D46696C491C696400BD00005425000872 +:10268000C73E4E554D424552083E376077600027A1 +:1026900000B500BFFDF72EFFF926000835682D783C +:1026A000361F37602F46FEF7A1FB5D46AD6B361F28 +:1026B00037602F46FEF7F6FC002F01D0002701E01F +:1026C00001277F42002F80CE01D002B000BD3168CB +:1026D000706801B402B40836FFF7B0FF20BC10BC2C +:1026E0000123ED1A1B19083E336077602F460098CE +:1026F000401C0090D2D703B000BD20205D462F487B +:10270000686435682D782D2D01D0002501E0012564 +:102710006D4200B520B4002D04D001257F1B306828 +:102720002D183560012F03DA01B00027361D00BDDA +:10273000083EB1683160002171600021B16000BFC6 +:10274000FFF7A2FF002F22D001257F1B30682D1834 +:10275000356000BF3068451E2D783A2DEFF30080BC +:1027600001B4361F37602F4601BC80F3008801D1C9 +:1027700080CE0BE02E2F04D15F460020786480CEFF +:1027800004E001B00027103600BD80CED8E780BC41 +:10279000002FEFF3008001B47768083601BC80F3A6 +:1027A000008801D0FDF73AFF5D466D6C002D01D524 +:1027B000012702E0361F3760022700BDFFFFFFFF41 +:1027C00000B500BF35682D78242DEFF3008001B4EB +:1027D000361F37602F4601BC80F300880AD10127DD +:1027E0003168CD1B70683F1877602F46361DFFF7A4 +:1027F00057FE1BE0232F0AD101273168CD1B7068DB +:102800003F1877602F46361DFFF754FE0EE0252F48 +:102810000BD101273168CD1B70683F185C46022040 +:10282000A06377602F46361D00E080CE00BD00001B +:1028300034260008C8494E54454745523F202020C1 +:102840007D1C3F78002FEFF3008001B4361F356008 +:1028500001BC80F3008800B510D0083EB16831603B +:102860007760FEF7D1FA5D46AD6B20B4FFF7A8FFA5 +:10287000FFF744FF20BC5C46A56301E00027361D3E +:1028800000BD000080260008C74E554D4245523F0E +:1028900000B500BFFEF77CFE940000205D466D6B26 +:1028A000361F37602F46002F00D180CE00B50FD0E5 +:1028B000361F37600827FFF72DFBFFF75FFB361F3A +:1028C00037600827FFF726FB7F1E5D466F6380CECB +:1028D00000BD2020002F01D1002501E001256D421F +:1028E0005C46246B002C01D1002401E001246442E9 +:1028F0002C4000B506D0FFF7D1FF7F1E361F376092 +:10290000024F02E0361F3760002700BDFFFFFFFFC8 +:10291000306838705F463F6B002F80CE00B502D024 +:10292000FFF7F8FA00E080CE00BD00001426000892 +:10293000822E2220361F3760034F00B5FEF7CCFCF5 +:1029400000F0C0FC00BD0000B8230008C825000846 +:10295000C2242E207D1C3F78361F356000B5FFF75E +:10296000EBFA00BDFC250008C64143434550542006 +:10297000002F00B501D1361D00BD5D46ED6A002D6A +:1029800004D0361F37601127FFF7C4FA30683F18AC +:10299000361F376077680021716000BFFDF7AAFD20 +:1029A0003F2A0008FFF79AFA082F03D180CEFFF7DD +:1029B00091FF3EE0092F0CD1009F01980744361F7C +:1029C00020213160FFF7A4FF7F1C361F37600127ED +:1029D0002FE00A2F01D100272BE00D2F0AD1009FF5 +:1029E00001980744361F20213160FFF791FF02B0A4 +:1029F00000BD1EE00C2F0AD1009F01980744361F2E +:102A000020213160FFF784FF02B000BD11E07F2F6D +:102A100003D180CEFFF75EFF0BE0009D01980544D7 +:102A2000361F37602F46FFF773FF7F1C361F376056 +:102A300001270098C019009080CEB3D703B05D463F +:102A4000ED6A002D04D0361F37601327FFF762FAB6 +:102A500000BD000000B500BFFEF760FD980000203B +:102A600002480568361F37602F46704798000020DF +:102A70005D466D6A5C46246A083E3560776027468D +:102A80007047000050290008C55155455259202073 +:102A90000020094908605D466D6A083E3560776030 +:102AA000FF2700B5FFF764FF5D462F625F460020F9 +:102AB000B86280CE00BD0000980000208828000881 +:102AC000C55041525345202000B580B480CEFFF759 +:102AD000CFFF5D46AD6A7F1B30682D1810BC083EE5 +:102AE00037607560B5602746FEF74CF880B43168F2 +:102AF00070680F1A20BC002D01D1002501E00125CE +:102B00006D427D1B5C46A16A4919A162361D00BD5C +:102B100000B580B480CEFFF7ABFF5D46AD6A7C1B8D +:102B200030682D18009B083E34607560B7601F4602 +:102B3000FEF714F820BC083E3760B16871602F467C +:102B4000FEF720F880B4316870680F1A20BC002DA1 +:102B500001D1002401E0012464426419B1680C1B16 +:102B60005D46AC627168B160083600BDAC240008F7 +:102B7000C4574F524420202000B5FFF7C9FF064834 +:102B80000568361F37602F46FEF762F90248056870 +:102B9000361F37602F4600BD1C00002000B5FFF730 +:102BA000ABF9002F00D100BDFFF798F9202F80CEA0 +:102BB00008D180CEFFF792F9202F01D1002701E044 +:102BC00001277F4200BD2020002F00B501D0014821 +:102BD0003F1A00BD000000085D46983504480468AF +:102BE0002468A4006419083E346077602F4670475B +:102BF00034000020083E002131607760002700B5D6 +:102C0000FFF7EAFFFDF76AFC352C0008009D0198EC +:102C100005442D68AF4208D2009F01980744009DEB +:102C2000019805442D6837602F460098001D0090DC +:102C3000ECD703B0002F01D001483F1800BD80F34E +:102C400000000008104805682D1D361F37602F460C +:102C500000B5FFF7C1FF00BFFDF740FC852C000861 +:102C60003D68361F37602F46FFF7AEFF009D019885 +:102C700005442F6037683F1D361D0098001D0090E9 +:102C8000EED703B080CE00BD34000020C024000881 +:102C9000C5574F524453202000B5FFF75DF9FFF7A9 +:102CA0008BFB06574F52445320000000FFF754F9A6 +:102CB000FFF7C8FFFFF79EFF361F3760FFF76EFF75 +:102CC000002F01D0002701E001277F4231680F402B +:102CD000EFF3008001B47768083601BC80F3008808 +:102CE00012D05D466D6B402D01DDFFF735F9361FC3 +:102CF0003760FFF78FFA3F1F3F68FFF765FF3168C6 +:102D00000F6077680836D5E77768083600BD0000A1 +:102D100034280008C44D4F564520202000B580B40B +:102D2000316870680F1A009DBD4280CE06D920BC64 +:102D3000361F37602F46FEF73BF805E020BC361FF4 +:102D400037602F46FEF716F800BD00001424000877 +:102D5000C5444550544820205D46AD69361F376054 +:102D60002F46361F376037463168CF1B3F1F37600D +:102D7000042700B5FDF774FD00BD7046401E0268D3 +:102D80001268014B1A6000BD340000203068874291 +:102D900001D1002701E001277F423760024F00B5D3 +:102DA000FFF756FB00BD0000EAFFFFFF361F37604C +:102DB000374602490F6080CE704700002400002093 +:102DC000361F3760374607480568BD4201D10027E6 +:102DD00001E001277F42361F3760034F00B5FFF740 +:102DE00037FB00BD24000020EAFFFFFF074805680D +:102DF000002D01D0002501E001256D42083E35601F +:102E00007760034F00B5FFF723FB00BD2C000020C7 +:102E1000F2FFFFFF04480568083E35607760034F06 +:102E200000B5FFF715FB00BD2C0000206DFEFFFF75 +:102E3000882A000882444F2000B5FFF7D7FFFEF72D +:102E4000D1FC361F3760032700BD0000E41F0008D7 +:102E5000833F444F00B5FFF7C9FFFEF7D1FC361F93 +:102E60003760032700BD000030290008844C4F4F15 +:102E70005020202000B5FFF7B9FF361F3760032729 +:102E8000FFF784FFFEF7CAFC00BD00006C2E0008AF +:102E9000852B4C4F4F50202000B5FFF7A7FF361F62 +:102EA00037600327FFF772FFFEF7C6FC00BD000086 +:102EB0006829000885424547494E202000B5FFF7A4 +:102EC00095FFFEF735FC00BD342E000885414741D3 +:102ED000494E202000B5FFF789FFFEF733FC00BD07 +:102EE0008C21000885554E54494C202000B5FFF731 +:102EF0007DFFFEF733FC00BD902C00088557484944 +:102F00004C45202000B5FFF771FFFEF73FFC30680D +:102F10003760074600BD0000D023000886524550A8 +:102F20004541542000B5FFF761FFFEF70BFCFEF7AB +:102F3000F3FB00BD702B00088249462000B5FFF767 +:102F400055FFFEF723FC00BD1C2F000884544845A4 +:102F50004E20202000B5FFF749FFFEF7DDFB00BD46 +:102F6000502D000884454C534520202000B5FFF724 +:102F70003DFFFEF7FFFB306837600746FEF7CCFBEE +:102F800000BD0000B42E000884434153452020209A +:102F900000B5FFF72BFF06480568361F37602F4640 +:102FA000FEF75EFCFFF702FF361F3760042700BD07 +:102FB00024000020142D0008824F4620361F376061 +:102FC000042700B5FFF7E2FEFEF758FC361F376016 +:102FD000052700BD502E0008833F4F46361F37603F +:102FE000042700B5FFF7D2FEFEF794FC361F3760CA +:102FF000052700BDE42E000885454E444F4620209D +:10300000361F3760052700B5FFF7C0FEFEF742FC0C +:10301000361F3760042700BDFC2E000887454E444C +:1030200043415345361F3760042700B5FFF7AEFE16 +:10303000FEF752FC01490F6080CE00BD2400002045 +:10304000CC2E0008884E455854434153452020203B +:10305000361F3760042700B5FFF798FEFEF748FCDF +:1030600001490F6080CE00BD24000020642F0008BD +:10307000875245435552534505480568361F37600A +:103080002F4600B5FDF7ACFFFEF726F900BD0000A6 +:103090003C000020361F376037465D46AD69BD42B3 +:1030A00001D3002701E001277F42361F3760024F1E +:1030B00000B5FFF7CDF900BDFCFFFFFF002F01D0E9 +:1030C000002701E001277F42361F3760024F00B51D +:1030D000FFF7BEF900BD0000F3FFFFFF4C2F000813 +:1030E00088504F5354504F4E45202020361F376094 +:1030F000202700B5FFF740FDFFF74CF8361F37607B +:10310000FFF7DCFF0120C74280CE04D100F060F859 +:10311000361F3760014FFEF7DFF800BDD8120008F8 +:10312000C02A00088253222010480568002D00B5EF +:1031300007D0361F37600E4FFEF7CEF800F0C2F80A +:1031400013E0361F37602227FFF7BEFC5D46983537 +:10315000361F37602F46FDF77BFE5D4698356C1CA9 +:103160002D78083E346077602F4600BD2C0000208B +:103170007823000824310008824322200F48056884 +:10318000002D00B507D0361F37600D4FFEF7A4F8AD +:1031900000F098F810E0361F37602227FFF794FC04 +:1031A0005D469835361F37602F46FDF751FE5D4668 +:1031B0009835361F37602F4600BD00002C000020D8 +:1031C000702300080C220008874C49544552414C9A +:1031D00000B5FEF7E7FA00BD882F0008C443484158 +:1031E00052202020361F3760202700B5FFF7C4FC8F +:1031F0007F7800BDB82F0008865B434841525D20B0 +:1032000000B5FFF7F3FDFFF7EDFFFFF7E1FF00BDAE +:103210001C300008815B20200149002008607047B5 +:103220002C00002040250008C15D2020024901201B +:1032300040420860704700002C000020E030000889 +:10324000C1272020361F3760202700B5FFF794FCE8 +:10325000FEF7A0FFFFF732FF00BD00002832000894 +:10326000835B275D00B5FFF7EDFFFFF7B1FF00BD02 +:10327000E4240008895B434F4D50494C455D2020B4 +:1032800000B5FFF7DFFFFEF727F800BD703000083C +:1032900081282020361F3760292700B5FFF76CFCF6 +:1032A00080CE00BDEC200008815C2020361F3760F6 +:1032B000002700B5FFF760FC80CE00BD7432000827 +:1032C000C2222C20361F3760222700B5FFF754FC9E +:1032D0003D786D1CED19361F356000BFFDF70AF90A +:1032E00001330008009D019805442D88361F376082 +:1032F0002F46FEF70DFF0098801C0090F2D703B018 +:10330000FEF7E8FE00BD202000B520BCE41D03212F +:103310008C4310B42D682F6080CE00BD382F00087C +:103320008249532000B5FFF78DFFBF680848056844 +:10333000002D07D0361F3760064FFDF7CDFFFEF793 +:10334000D7FE03E0306838607768083600BD0000BB +:103350002C000020083300089032000884455849AA +:103360005420202000B5FFF741FDFEF731FA00BDE3 +:1033700014320008813B202000B5FFF737FDFFF72E +:103380001FFDFEF725FAFEF7F5FEFFF745FF00BD2E +:10339000D82F0008C9494E54455250524554202058 +:1033A00000B500BFFFF776FE361F37602027FFF716 +:1033B000E3FB3D78002D3FD0FEF7ECFE002F00D15F +:1033C00080CE13D0002F01D4002701E001277F42D7 +:1033D0001A4805683D4080CE02D0FDF77DFF04E02D +:1033E0003D4680CE01200543A84724E0FFF750FA70 +:1033F000002F01D0361F3760FFF760FE0F480568C9 +:10340000002D17D0012F03D180CEFEF7CBF910E0AD +:10341000022F08D1776831687160361DFEF7C2F956 +:10342000FEF7C0F905E0361F3760054FFEF7F6FFDF +:1034300080CE00E080CEB5E780CE00BD2C0000201D +:10344000F3FFFFFFA8320008C84556414C554154D0 +:10345000452020205D466D6A00B520B45D462D6A8A +:1034600020B45D46AD6ABD4201DB002701E00127C3 +:103470007F421048056820B45D462F625F46306881 +:1034800078620D480B4908605F460020B8620B4F18 +:10349000361DFEF7A1FF20BC06490D6020BC5C462E +:1034A000A56220BC5C46256220BC5C466562FEF7D6 +:1034B000B5FF00BD98000020FFFFFFFFA03300080C +:1034C00000B500BF002F01D180CE29E00120C74206 +:1034D00001D180CE24E00220C74208D15F463F6D73 +:1034E0007D1C3F78361F3560FEF726FD18E00D2065 +:1034F000C7420AD180CEFEF75FFF0C697320756E5C +:10350000646566696E6564000AE0FEF755FF0B545A +:1035100068726F7720636F6465200000FFF764F8BE +:1035200000BD000078310008C451554954202020C6 +:103530005D460020E8625D4601204042286300208D +:103540002E49086000B5FFF767FE00BF5D46ED69D4 +:10355000AD465D462D6B002D01D0FEF7FDFCFFF75B +:1035600097FA361F3760264FFEF736FF002F24D11B +:1035700024480768002F01D0002701E001277F427F +:103580005D462D6B002D01D1002501E001256D4226 +:103590003D4080CE10D0FEF70FFF03206F6B000080 +:1035A000FFF7DAFB002F00D180CE05D0FEF704FF35 +:1035B000012D0000FFF718F81EE0FFF781FF5D46C0 +:1035C000AD69361F37602F463E1C80CEFFF724FEC4 +:1035D000FEF7C2FCFFF74CFAFEF7AEFCFEF7BCFCB0 +:1035E0005D46AD6A6D1E361F37602F46FEF7D4FC70 +:1035F000FEF7E2FE015E0000A8E700BD9800002093 +:10360000A03300082C000020A44900088005000811 +:1036100074330008C9434F4C44434841494E20206D +:1036200000B500BFFDF77AFF9C000020DC310008E8 +:10363000C64154434F4C442000B5FEF74BFDFEF706 +:10364000C5FC054805682F6003490F600027FEF799 +:103650004FFDFEF74DFD00BD9C000020C03200086C +:10366000CD57414C4B434F4C44434841494E202099 +:10367000361F3760054F00B5002F05D07D6801204B +:103680000543A8473F68F7E780CE00BD083600082D +:10369000361F3760004F01E0D87A000800B500BF40 +:1036A0003D68002D0FD03D460C353C687B680C3ED4 +:1036B00033607560B7602746FDF75CFB3D68ED1928 +:1036C0000C352F46ECE75F461837083E3760144943 +:1036D00071601027FDF74EFB5D46AD69361F376000 +:1036E0002F463E1C80CE5D460E4868625D46002037 +:1036F00028640C3E0C4931600C497160B76010279A +:10370000FDF738FB00200A490860FEF7D3FE094D9B +:1037100009490D6009490D6000200949086000BD94 +:10372000F8010008203C00201400002018020008C6 +:10373000980000204C0000203400002030000020C1 +:1037400038000020C8310008C52E465245452020CB +:1037500000B5FEF701FC1548056815494D1B361FDD +:1037600037602F46FEF74CFFFEF726FE1062797495 +:103770006573206672656520466C617368000000A1 +:10378000FEF7EAFB04F086F90A4805687F1BFEF79E +:1037900037FFFEF711FE0E6279746573206672655D +:1037A000652052414D00000000BD000018000020BF +:1037B00000F001081C0000205C330008C6434F4D98 +:1037C0004D495420002F00B500D1074F0120074379 +:1037D00006490F60083E7C27054931600549716044 +:1037E000FEF718FA00BD0000800500084000002028 +:1037F00000F8010814000020F82F0008C5454D50BE +:1038000054592020083E0849316077607C2700B574 +:10381000FEF7CEF9083E054931607760044FFEF7A8 +:10382000C7F900F081F800BD00F8010800C00008E9 +:1038300000F0000030360008C4434F4C44202020E4 +:1038400000B5FFF725FF01F0D7FC01F0DDF95D467B +:10385000AF6480CE01F0D8F95D46EF6480CE01F010 +:103860000FFF0C3E2749316027497160B7607C2704 +:10387000FEF7D0F9254805680120C54201D1002492 +:1038800001E001246442002D01D1002501E0012561 +:103890006D4225400ED01E4805681E480468AC42A3 +:1038A00008D10C3E1849316018497160B7607C2717 +:1038B000FDF760FAFEF70EFC174805682D68012039 +:1038C000C54201D0FFF79EFFFFF7D2FEFEF744FB93 +:1038D00002F0E0F9FFF73CFFFEF7E8FAFEF73CFBE9 +:1038E000FEF73AFBFEF768FD0420206F6B00000036 +:1038F0005D46AD69361F37602F463E1C80CEFFF710 +:1039000017FE00BD00F001081400002000F80108B7 +:10391000280200087CF80108180000204032000846 +:10392000C65245424F4F542072B6054901200D68DA +:1039300005430D6003480449086000B5FEE700BD7B +:1039400024100240CCCC000000300040F0B54046CE +:10395000494652465B460FB46946F0398B460A1C0D +:10396000F03A95460E46083E341F8C616846C861A1 +:10397000FCF706FE6946F031F0318D460FBC8046FB +:10398000894692469B46F0BD902E0008C7494E548A +:103990003E4249541F253D400124AC407F09BF00F1 +:1039A000361F346070470000FC370008C5454E499B +:1039B0004E5420200F2F00B50BD9103FFFF7EAFF20 +:1039C00005483F1805483F18306838607768083662 +:1039D00000BD80CE00BD000000E000E0000100005E +:1039E000AC390008C6444953494E54200F2F00B546 +:1039F0000BD9103FFFF7CEFF05483F1805483F1889 +:103A0000306838607768083600BD80CE00BD0000A1 +:103A100000E000E080010000BC370008C6534554B8 +:103A2000505249200F2F00B509D9103F05483F18C3 +:103A300005483F18306838707768083600BD80CE7A +:103A400000BD000000E000E0000400002039000894 +:103A5000C55357494E5420200F2F00B50BD9103FA6 +:103A6000FFF798FF05483F1805483F183068386051 +:103A70007768083600BD80CE00BD000000E000E0A1 +:103A800000020000503A0008C92F415050465241F0 +:103A90004D45202000B500BFFDF70DFD20000000C2 +:103AA00020330008C64558412E52302000B500BFD3 +:103AB000FFF7FFFF00000000A43A0008C645584188 +:103AC0002E52312000B500BFFFF7FFFF04000000B9 +:103AD000BC3A0008C64558412E52322000B500BFFE +:103AE000FFF7FFFF08000000D43A0008C645584120 +:103AF0002E52332000B500BFFFF7FFFF0C0000007F +:103B000014360008C74558412E52313200B500BF67 +:103B1000FFF7FFFF10000000043B0008C7455841B5 +:103B20002E52313400B500BFFFF7FFFF1400000034 +:103B3000EC3A0008C64558412E50432000B500BF5E +:103B4000FFF7FFFF180000001C3B0008C745584165 +:103B50002E50535200B500BFFFF7FFFF1C000000BE +:103B60001C3A0008CA2F4D41494E4652414D45204E +:103B700000B500BFFDF79FFC24000000343B0008A7 +:103B8000C645584D2E52342000B500BFFFF7FFFF49 +:103B900000000000803B0008C645584D2E523520DD +:103BA00000B500BFFFF7FFFF04000000983B0008CE +:103BB000C645584D2E52362000B500BFFFF7FFFF17 +:103BC00008000000B03B0008C645584D2E52372073 +:103BD00000B500BFFFF7FFFF0C000000C83B000866 +:103BE000C645584D2E52382000B500BFFFF7FFFFE5 +:103BF00010000000E03B0008C645584D2E52392009 +:103C000000B500BFFFF7FFFF140000004C3B0008A9 +:103C1000C745584D2E52313000B500BFFFF7FFFFAA +:103C200018000000103C0008C745584D2E52313195 +:103C300000B500BFFFF7FFFF1C000000E4250008EF +:103C4000CA45584D2E4558435245542000B500BF33 +:103C5000FFF7FFFF2000000044300008C72F455841 +:103C60004441544100B500BFFDF725FC140000009D +:103C7000403C0008CA4558442E523133464C54202B +:103C800000B500BFFFF7FFFF000000008C390008FF +:103C9000CB4558442E5231334D41494E00B500BFFB +:103CA000FFF7FFFF0400000048370008CE455844E6 +:103CB0002E52313350524F434553532000B500BF6D +:103CC000FFF7FFFF08000000F8310008CC4558441A +:103CD0002E523133535441544520202000B500BFAB +:103CE000FFF7FFFF0C000000743C0008CA45584471 +:103CF0002E4C524D41494E2000B500BFFFF7FFFF4B +:103D000010000000F83B0008C645584441544120CB +:103D100000B500BFFDF7CFFB4C360020164BEFF38C +:103D200008805860EFF30981996072461A61042097 +:103D3000024201D1586800E0986818604046494640 +:103D400052465B460FB5F0B40B4B6846D860F8B0EE +:103D50006846F03083460646083E341F8461694653 +:103D6000C161FCF70DFC78B0F0BC0FBC8046894601 +:103D700092469B4600BD00004C360020AC3C00083B +:103D8000C52E4954454D20203D68361F37602F46CB +:103D900000B501F0BFFAFEF7F1F83F1D00BD0000CD +:103DA00060360008C62E4954454D5320361F3760F3 +:103DB000002700B5FCF79EFBCB3D0008FFF7E4FFB2 +:103DC0000098401C0090F9D703B000BD643B000888 +:103DD000C84150504954454D5320202002480568A1 +:103DE000361F37602F4670474C3600205C3C000879 +:103DF000C94D41494E4954454D532020024805685C +:103E0000361F37602F467047583600203838000874 +:103E1000C64150505253502000B5FFF7DFFF203706 +:103E200000BD0000103E0008C641505050535020C5 +:103E300000B5FFF7E3FFBF6800BD0000F03D0008DC +:103E4000C54150505550202000B5FFF7D7FFFF69FE +:103E500000BD0000283E0008C6415050544F53207A +:103E600000B5FFF7CBFFFF6800BD0000403E000833 +:103E7000C54150505043202000B5FFF7AFFFBF6948 +:103E800000BD0000583E0008C92E464C5446524121 +:103E90004D45202000B5FFF7A1FFFEF75DF8FEF7C6 +:103EA0008BFA113D3D3D20526567697374657273ED +:103EB000203D3D3DFEF750F8FEF77EFA0650535286 +:103EC000203D2000FD69361F37602F4601F022FAA1 +:103ED000FEF742F8FEF770FA06523020203D20002F +:103EE000083E376077600427FFF760FF80CEFFF75A +:103EF00085FFFEF731F8FEF75FFA06523420203DC9 +:103F000020000000361F37600427FFF74FFFFEF741 +:103F100023F8FEF751FA06523820203D2000000019 +:103F2000361F37600427FFF741FF80CEFFF756FFAB +:103F3000FEF712F8FEF740FA06523132203D20001B +:103F40003D461035361F37602F46FFF71DFF376897 +:103F5000203701F0DFF9FEF711F81437361F37600C +:103F60000227FFF723FF80CE00BD0000803D000840 +:103F7000C54E414D453F2020FD1C03218D43AF42DE +:103F800000B501D0002700BD7D1C3F789F243C4038 +:103F9000103E812131607460B760F560A027FCF7A6 +:103FA00047FA002F80CE02D10027361D00BD1F200A +:103FB000074030683F18306837600746FCF79AFAC8 +:103FC000F73F0008009D019805442D780C3E212103 +:103FD00031607560B7607F27FCF72AFA002F80CE2A +:103FE00004D103B0361F3760002700BD0098401C85 +:103FF0000090E7D703B0361F3760014F00BD0000C7 +:10400000FFFFFFFFEC3C0008C649503E4E464120F2 +:10401000BF1E00B5361F3760FFF7AEFF002F80CE02 +:1040200001D17F1EF6E700BD903C0008CD43484516 +:10403000434B2D414C49474E45442020FD1C032154 +:104040008D43AF4200B50CD0FEF7B6F90D284D698F +:1040500073616C69676E656429200000FF1C032191 +:104060008F4300BD703E0008C73F434C4950333278 +:1040700030683D1A802D00B510D937688037FDF7BC +:104080006BFFFEF799F913436C69707065642074D7 +:104090006F203332206974656D73000000BD00002D +:1040A00068400008C82E52534641554C54202020E9 +:1040B00000B5FDF751FFFFF7AFFEFDF74DFFFEF72F +:1040C0007BF906525350203D20000000361F376018 +:1040D00001F020F9FDF752FFFFF7B0FFFFF7B4FE44 +:1040E000FF69FEF769F90720205230203D200000CB +:1040F000361F376001F00EF9FDF740FFFFF79EFF16 +:104100003F1FFDF729FFFEF757F9192D2D2D2052DE +:10411000657475726E20737461636B20686967687B +:10412000202D2D2DFFF7A4FFFCF7E4F98D410008A9 +:10413000FDF712FF009D01980544361F37602F469A +:1041400001F0E8F8FDF71AFF009D019805442D687D +:10415000083E356077602F4601F0DCF8FDF70EFF72 +:104160000C3E144931607760B760134FFCF760F97B +:10417000002F80CE04D0FFF74BFFFEF74BF800E096 +:1041800080CE0098001F0090D2D703B0FDF7E4FE68 +:10419000FEF712F9192D2D2D2052657475726E20BF +:1041A000737461636B206C6F77202D2D2D200000C0 +:1041B00000BD00003402000800C00008A440000850 +:1041C000C82E50534641554C5420202000B5FDF7D1 +:1041D000C3FEFFF72DFEFDF7BFFEFEF7EDF806501C +:1041E0005350203D20000000361F376001F092F848 +:1041F000FDF7C4FEFFF722FFFFF726FEBF69FEF7BB +:10420000DBF80720205330203D200000361F3760A8 +:1042100001F080F8FDF7B2FEFFF710FF3D1D30689A +:10422000854212D277680836FDF796FEFEF7C4F88D +:10423000164461746120737461636B20756E6465EC +:1042400072666C6F7765640000BD3D1D3068854205 +:104250000FD177680836FDF77FFEFEF7ADF8104402 +:1042600061746120737461636B20656D7074790093 +:1042700000BD30683D1AF02D11D977680836FDF77A +:104280006BFEFEF799F815446174612073746163E5 +:104290006B206F766572666C6F77656400BDFDF7A5 +:1042A0005BFEFEF789F8172D2D2D204461746120E7 +:1042B000737461636B2068696768202D2D2D000081 +:1042C0003068874221D03F1FFFF7D2FEFCF706F986 +:1042D00009430008FDF740FE009D01980544361F84 +:1042E00037602F4601F016F8FDF748FE009D019853 +:1042F00005442D68361F37602F4601F00BF80098F3 +:10430000001F0090E6D703B001E077680836FDF79C +:1043100023FEFEF751F8172D2D2D204461746120E6 +:10432000737461636B206C6F77202D2D2D2000003E +:10433000FDF712FEFEF740F80972544F532F523723 +:1043400020200000FFF78CFD00F0E4FF00BD00001E +:10435000283C0008C953484F574641554C5420202B +:1043600000B500F051FC03F0A3FB00F09BFBFEF74F +:10437000A1F8FDF7F1FDFDF7EFFDFEF71DF80A4589 +:104380007863657074696F6E20000000EFF3058537 +:10439000361F37602F46FEF727F9FEF70DF8036149 +:1043A00074200000FFF768FD00F0B4FFFFF772FD16 +:1043B000FFF77EFEFFF70AFFFDF7CEFDFDF7FCFFDE +:1043C0001552657374617274696E672073797374C2 +:1043D000656D202E2E2E0000FFF7A6FA361F3760DF +:1043E000002700BD164BEFF308805860EFF30981FA +:1043F000996072461A610420024201D1586800E0B7 +:10440000986818604046494652465B460FB5F0B47E +:104410000B4B6846D860F8B06846F03083460646D5 +:10442000083E341F84616946C161FFF799FF78B087 +:10443000F0BC0FBC8046894692469B4600BD0000FA +:104440004C360020164BEFF308805860EFF30981DB +:10445000996072461A610420024201D1586800E056 +:10446000986818604046494652465B460FB5F0B41E +:104470000B4B6846D860F8B06846F0308346064675 +:10448000083E341F84616946C161FFF769FF78B057 +:10449000F0BC0FBC8046894692469B4600BD00009A +:1044A0004C36002048340008CA53454C494F2D5320 +:1044B000455231201A4D2C463034103E03213160D4 +:1044C00000217160B560F760274600B5FDF74AFA34 +:1044D00014487969014379611248B96A8143B96224 +:1044E0001148B9690143B9610F48F9688143F9601E +:1044F0000E4801B4009F3F1C083E0D4931600D4934 +:104500007160FDF72FFA20BC24350C3E0A4931605A +:104510000A497160B7602F46FDF724FA00BD00001C +:1045200000100240000002000040000000000048AF +:1045300000003C0000002800F00F00001001000007 +:10454000A43D0008C450494F3A20202000B5FCF794 +:104550007BFF31688D020B482D18361F37602F46C0 +:10456000FDF7C6FD0125BD40361F37602F46FDF71C +:10457000BFFD31684D013D432F46361DFDF7B8FDA7 +:1045800000BD00000000004894330008C2504120E4 +:1045900000B500BFFCF78FFF000000008C4500084D +:1045A000C250422000B500BFFCF785FF01000000AB +:1045B000A0450008C250432000B500BFFCF77BFFB8 +:1045C00002000000B4450008C250442000B500BFFE +:1045D000FCF771FF03000000C8450008C2504520E9 +:1045E00000B500BFFCF767FF04000000DC450008D1 +:1045F000C250462000B500BFFCF75DFF050000007B +:10460000D03D0008C653455450494E203D687F6850 +:104610002F8380CE7047000004460008C6434C52EA +:1046200050494E203D687F686F8380CE7047000000 +:10463000A8440008C647455450494E203D687F684D +:104640002D693D40002D01D1002701E001277F4267 +:10465000012007407047202003200740BD003D4354 +:104660002F012F433D023D432F042F43704720204D +:104670000F2007407F000325BD402F4670472020B4 +:1046800030683760074600B5FFF7E6FF30683760EF +:104690000746FFF7EDFF35683D40356000BD20203F +:1046A000BD680F200540361F7168316077602F4666 +:1046B00000B5FFF7E5FF75682D68316871603760F8 +:1046C0002F4600BDF0450008C9495350494E4D4F93 +:1046D0004445202000B5FFF7E3FF3F1CFDF742F9FA +:1046E00000BD20200F2007403D013D432F022F43F6 +:1046F0003D043D432F46704707253D40AD000F2444 +:10470000AC40082007407F08361F346070472020E7 +:1047100030683760074600B5FFF7E4FF3068376060 +:104720000746FFF7E9FF80B4376871680F4020BC87 +:1047300077602F4600BD0000C8460008C9494E50AA +:1047400055544D4F4445202000B500BFFCF7B3FE43 +:10475000000000001C460008CA4F55545055544DE7 +:104760004F44452000B500BFFCF7A5FE0100000046 +:10477000883E0008C641464D4F44452000B500BF65 +:10478000FCF799FE02000000083D0008CA414E41B6 +:104790004C4F474D4F44452000B500BFFCF78BFE02 +:1047A000030000002C400008C74953494E5055549F +:1047B000361F0021316000B5FFF78CFF00BD0000FF +:1047C000CC3C0008C849534F555450555420202024 +:1047D000361F0121316000B5FFF77CFF00BD0000EE +:1047E000703F0008CA495346554E4354494F4E2026 +:1047F00000B580B4009F361F02213160FFF76AFFC9 +:10480000009DAD680F200540361F37602F46FFF72B +:104810007FFF20BC2D682035ED192F46FDF7A2F84B +:1048200000BD0000C4470008C84953414E414C4FE9 +:1048300047202020361F0321316000B5FFF74AFFD3 +:1048400000BD0000A8470008C7495350494E4F44D7 +:1048500030680028EFF3008001B4361D01BC80F3FE +:10486000008800B506D03D687F6869683943696093 +:1048700080CE05E03D687F686968B943696080CE95 +:1048800000BD00003C470008C9495350494E5055EF +:104890005044202000B5FFF703FF0C37FDF762F806 +:1048A00000BD000074470008C94E4F5450554C4C91 +:1048B00045442020361F0021316000B5FFF7EAFF94 +:1048C00000BD0000883A0008C850554C4C4544557E +:1048D00050202020361F0121316000B5FFF7DAFF9C +:1048E00000BD0000E4390008CA50554C4C45444412 +:1048F0004F574E20361F0221316000B5FFF7CAFF27 +:1049000000BD0000E4470008CA495350494E5350C7 +:104910004545442000B5FFF7C3FE0837FDF722F8F0 +:1049200000BD000044450008C84C4F575350454552 +:104930004420202000B500BFFCF7BDFD00000000B2 +:10494000C8480008CB4D454449554D535045454452 +:1049500000B500BFFCF7AFFD0100000028480008CB +:10496000C9484947485350454544202000B500BF39 +:10497000FCF7A1FD0300000060490008C8494E494A +:10498000544750494F202020044D054C696921436C +:104990006961A96AA143A962704700000010024042 +:1049A00000007E0034570008884900087C49000850 +:1049B000C9285345524B45593F292020FF692020E3 +:1049C0000740704748480008C8285345524B45598E +:1049D0002920202000B500BFFD6920200540002DC2 +:1049E00002D1FCF789FEF7E77F6AFF20074000BD90 +:1049F000B0490008C928534552454D495429202043 +:104A000000B500BFFD6980200540002D02D1FCF7F4 +:104A100073FEF7E73068B8627768083600BD0000BB +:104A2000F4490008C92853455254595045292020BB +:104A3000706831684518706877600746356000B562 +:104A4000FBF758FD654A0008009D019805442D7844 +:104A5000083E35607760FFF7D3FF0098401C009058 +:104A6000F2D703B080CE00BD08400008C7285345E8 +:104A700052435229083E0D213160776000B5FFF79F +:104A8000BFFF361F0A213160FFF7BAFF00BD0000EB +:104A900044490008CD2B4641554C54434F4E534F8B +:104AA0004C4520207047000088480008CA28494E1D +:104AB00049542D5345522920002038600020786049 +:104AC0000020B8603068F8600C2038600D20386035 +:104AD0007768083670470000E8480008C55541521D +:104AE0005431202000B500BFFCF7E5FC0038014040 +:104AF000AC4A0008C9494E49542D53455231202033 +:104B000000B5FFF7D7FC083E034931607760034FDB +:104B1000FFF7D2FF00BD00008813000000380140FD +:104B20008C470008C85345524B45593F312020203F +:104B3000361F3760024F00B5FFF740FF00BD000091 +:104B400000380140DC4A0008C75345524B455931F3 +:104B5000361F3760024F00B5FFF73CFF00BD000075 +:104B600000380140244B0008C8534552454D495474 +:104B700031202020361F3760024F00B5FFF740FF7D +:104B800000BD000000380140684B0008C853455282 +:104B90005459504531202020361F3760024F00B550 +:104BA000FFF746FF00BD00000038014058470008ED +:104BB000C653455243523120361F3760024F00B56D +:104BC000FFF758FF00BD0000003801408C4B000883 +:104BD000C8434F4E534F4C453120202000B500BFF5 +:104BE000FCF769FCE84B0008504B0008304B00080C +:104BF000744B0008984B0008B84B0008484B00085D +:104C0000C7434F4E534F4C4500B500BFFCF753FC14 +:104C1000E84B0008004C0008C55541525432202092 +:104C200000B500BFFCF747FC0044004034460008D4 +:104C3000CA53455232434C4F434B53200F4D2C46E1 +:104C40003034103E0E49316000217160B560F7606C +:104C5000274600B5FCF786FE0A4879690143796169 +:104C60000848B96A8143B9620648F9690143F961A4 +:104C7000044839698143396180CE00BD001002408B +:104C80000000030000000200A8480008C354583286 +:104C900000B500BFFCF70FFC9C4C0008000000486A +:104CA000040000000200000028350008C3525832FA +:104CB00000B500BFFCF7FFFBBC4C0008000000483B +:104CC0000800000003000000C8490008CD53455209 +:104CD0003246554E4354494F4E532020083E012141 +:104CE00031607760054F00B5FFF782FD083E012176 +:104CF00031607760024FFFF77BFD00BD9C4C0008E0 +:104D0000BC4C0008304C0008CA53454C494F2D5349 +:104D10004552322000B5FFF791FFFFF7DFFF00BDDE +:104D2000F44A0008C9494E49542D534552322020B7 +:104D300000B5FFF7EFFF083E342131607760024F86 +:104D4000FFF7BAFE00BD000000440040D04B000851 +:104D5000C85345524B45593F32202020361F3760FB +:104D6000024F00B5FFF72AFE00BD000000440040DE +:104D7000184C0008C75345524B455932361F37600F +:104D8000024F00B5FFF726FE00BD000000440040C2 +:104D9000504D0008C8534552454D495432202020FB +:104DA000361F3760024F00B5FFF72AFE00BD000036 +:104DB00000440040944D0008C85345525459504592 +:104DC00032202020361F3760024F00B5FFF730FE3B +:104DD00000BD000000440040B04B0008C6534552DF +:104DE00043523220361F3760024F00B5FFF742FEB4 +:104DF00000BD000000440040B84D0008C8434F4EBD +:104E0000534F4C453220202000B500BFFCF753FB28 +:104E1000144E00087C4D00085C4D0008A04D0008B1 +:104E2000C44D0008E44D0008744D0008C5554152BA +:104E30005433202000B500BFFCF73DFB0048004084 +:104E40008C4C0008C354583300B500BFFCF733FB4B +:104E5000544E000800080048100000004400000004 +:104E6000AC4C0008C352583300B500BFFCF723FB1D +:104E7000744E000800080048000800004B000000C5 +:104E8000084D0008CA53454C494F2D534552332015 +:104E9000154D2C463034103E1449316000217160AC +:104EA000B560F760274600B5FCF75CFD10487969EE +:104EB000014379610E48B96A8143B9620D48F969C5 +:104EC0000143F9610B48396981433961361F0A4F43 +:104ED00001213160FFF78CFC083E012131607760D1 +:104EE000064FFFF785FC00BD0010024000000C00DB +:104EF0000000080000000400544E0008744E000832 +:104F0000244D0008C9494E49542D534552332020A1 +:104F100000B5FFF7BDFF083E034931607760034FDE +:104F2000FFF7CAFD00BD0000A101000000480040DD +:104F3000FC4D0008C85345524B45593F33202020B3 +:104F4000361F3760024F00B5FFF738FD00BD000087 +:104F5000004800402C4E0008C75345524B4559337A +:104F6000361F3760024F00B5FFF734FD00BD00006B +:104F700000480040344F0008C8534552454D49543D +:104F800033202020361F3760024F00B5FFF738FD71 +:104F900000BD000000480040784F0008C85345524B +:104FA0005459504533202020361F3760024F00B53A +:104FB000FFF73EFD00BD000000480040DC4D00084A +:104FC000C653455243523320361F3760024F00B557 +:104FD000FFF750FD00BD0000004800409C4F000856 +:104FE000C8434F4E534F4C453320202000B500BFDF +:104FF000FCF761FAF84F0008604F0008404F0008C6 +:10500000844F0008A84F0008C84F0008584F0008F8 +:10501000C55541525434202000B500BFFCF74BFA6F +:10502000004C0040644E0008C352583400B500BF25 +:10503000FCF741FA38500008000000480200000068 +:1050400001000000444E0008C354583400B500BFAE +:10505000FCF731FA5850000800080048000400002E +:105060004A000000844E0008CA53454C494F2D5356 +:1050700045523420144D154869690143696113484C +:10508000A96A8143A96212486969014369611048AC +:10509000A96A8143A9620D48E9690143E9610B48A6 +:1050A000296981432961083E042131607760094FF5 +:1050B00000B5FFF79DFB083E002131607760064F89 +:1050C000FFF796FB00BD0000001002400000080042 +:1050D000000002003850000858500008044F000833 +:1050E000C9494E49542D53455234202000B5FFF78D +:1050F000C1FF083E034931607760034FFFF7DCFCD6 +:1051000000BD0000A1010000004C0040E04F00087D +:10511000C85345524B45593F34202020361F376035 +:10512000024F00B5FFF74AFC00BD0000004C0040F4 +:1051300010500008C75345524B455934361F37604D +:10514000024F00B5FFF746FC00BD0000004C0040D8 +:1051500010510008C8534552454D49543420202071 +:10516000361F3760024F00B5FFF74AFC00BD000054 +:10517000004C004054510008C85345525459504502 +:1051800034202020361F3760024F00B5FFF750FC57 +:1051900000BD0000004C0040C04F0008C6534552FF +:1051A00043523420361F3760024F00B5FFF762FCD0 +:1051B00000BD0000004C004078510008C8434F4E2D +:1051C000534F4C453420202000B500BFFCF773F945 +:1051D000D45100083C5100081C51000860510008DF +:1051E00084510008A4510008244A0008C8494E49C7 +:1051F000542D53455220202000B5FFF781FCFFF7C6 +:1052000097FDFFF785FEFFF771FF00BD34510008E1 +:10521000C753455442415544361F7068776007466E +:105220000549316000B5FBF71BFB7F1C7F08356823 +:10523000EF607768083600BD00D8B8050849000857 +:10524000CA49532D434F4E534F4C45205D46AF64E2 +:105250005D46EF6480CE704728490008C62E415352 +:10526000434949207F2007400C3E20213160776070 +:10527000B7607F2700B5FBF7DBF8002F80CE00D1A9 +:105280002E27FCF747FE00BD40520008C52E4259AC +:10529000544520205D46AD6B00B520B4FDF700F904 +:1052A000361F37600027FDF74DF9FDF71DF9FDF7B3 +:1052B0001BF9FDF751F9FCF73FFE20BC5C46A563E6 +:1052C00000BD00008C520008C52E574F52442020CC +:1052D0005D46AD6B00B520B4FDF7E2F8361F3760D0 +:1052E0000027FDF72FF9FDF7FFF8FDF7FDF8FDF7B3 +:1052F000FBF8FDF7F9F8FDF72FF9FCF71DFE20BCD0 +:105300005C46A56300BD00005C520008C62E4457F1 +:105310004F5244205D46AD6B00B520B4FDF7C0F898 +:10532000361F37600027FDF70DF9FDF7DDF8FDF7B3 +:10533000DBF8FDF7D9F8FDF7D7F8361F37603A27C5 +:10534000FDF7C2F8FDF7D0F8FDF7CEF8FDF7CCF881 +:10535000FDF7CAF8FDF700F9FCF7EEFD20BC5C464E +:10536000A56300BD944A0008C444554D5020202038 +:105370005D46AD6B361F71683160756000B5FDF735 +:105380008FF830683F18306837600746FBF7B2F88F +:105390003D540008FCF7E0FD009D01980544361FD0 +:1053A00037602F46FFF7B6FF009D019805442C4655 +:1053B0001034083E346077602F4600BFFBF78EF84C +:1053C000E5530008FCF7DAFD009D019805442D78AF +:1053D000361F37602F46FFF75DFF0098401C009096 +:1053E000F0D703B0361F37600227FCF7D5FD009DCC +:1053F000019805442C461034083E346077602F46EF +:10540000FBF76CF825540008009D019805442D78A1 +:10541000361F37602F46FFF725FF0098401C00908D +:10542000F2D703B0FCF768FD002F80CE01D002B0A8 +:1054300000BD009810300090ACD703B05D46AF635C +:1054400080CEFCF789FD00BD28500008C5504455AA +:105450004D5020205D46AD6B361F71683160756020 +:1054600000B5FDF71DF83068054603218D437F190F +:1054700037602F46FBF73EF8E5540008FCF76CFD5B +:10548000009D01980544361F37602F46FFF742FF05 +:10549000009D019805442C461034083E3460776026 +:1054A0002F4600BFFBF71AF8CD540008FCF766FD45 +:1054B000009D019805442D68361F37602F46FFF781 +:1054C00029FF0098001D0090F0D703B0FCF714FDF1 +:1054D000002F80CE01D002B000BD009810300090A7 +:1054E000CCD703B05D46AF6380CEFCF735FD00BD81 +:1054F000CC4C0008C22E532000B5FCF72DFDFCF764 +:105500005BFF032D2D200000FDF726FC002F00D1AE +:1055100080CE16D07F1E361F00213160FAF7DEFFE5 +:1055200043550008009D01980544361F37602F46FB +:10553000BF00F759FDF764F80098401E0090F1D7BE +:1055400003B000BD4C540008C94C45444143544984 +:105550005645202000B500BFFBF7E0FFA00000206B +:10556000C8520008C73C5449434B533E00B500BFE6 +:10557000FBF7D4FFA40000209C510008C554494308 +:105580004B53202002480568361F37602F4670476E +:10559000A40000206C4A0008C34C445500B500BF6D +:1055A000FBF789FFA85500080008004840000000EC +:1055B0004600000098550008C34C445200B500BF97 +:1055C000FBF779FFC85500080008004800020000FA +:1055D00049000000B8550008C34C444400B500BF62 +:1055E000FBF769FFE855000800080048800000004C +:1055F00047000000D8550008C34C444C00B500BF1C +:10560000FBF759FF08560008000800480001000099 +:105610004800000054430008C95359535449434BB0 +:105620004552202002490868401C0860704700006D +:10563000A4000020F0B54046494652465B460FB4F0 +:105640006946F0398B460A1CF03A95460E46083EEC +:10565000341F8C616846C861FFF7E4FF6946F0318A +:10566000F0318D460FBC8046894692469B46F0BD80 +:1056700060320008CB53544152542D434C4F434B9E +:10568000054D064868610320286105496C18FF2014 +:10569000207062B67047000000E000E06F17000065 +:1056A000230D000068500008CA53544F502D434C3E +:1056B0004F434B20024901200D6885430D60704720 +:1056C00010E000E0EC510008C54C41544552202048 +:1056D00002480568ED192F4670470000A40000201D +:1056E000A8560008C954494D45444F55543F202001 +:1056F000044805687F1B002F01D4002701E0012723 +:105700007F427047A4000020F8550008C24D532086 +:1057100007480568ED192F4600B500BFFBF7ECFF01 +:10572000034805687D1B002DF8D580CE00BD01BC67 +:10573000A40000201C5A0008805600086455000888 +:10574000C42F54434220202000B500BFFBF7B3FE16 +:105750001800000018560008C85443422E4C494E09 +:105760004B20202000B500BFFFF7FFFF0000000026 +:10577000BC510008C75443422E53535000B500BFDC +:10578000FFF7FFFF0400000074560008CA544342AC +:105790002E5354415455532000B500BFFFF7FFFF6F +:1057A0000800000058570008C85443422E4D535279 +:1057B0004320202000B500BFFFF7FFFF0C000000D2 +:1057C000A8570008C85443422E4D45534720202077 +:1057D00000B500BFFFF7FFFF10000000E45600080F +:1057E000C95443422E4556454E54202000B500BFB3 +:1057F000FFF7FFFF14000000C8560008C44D4149E0 +:105800004E20202000B500BFFBF755FE103F0020C2 +:10581000000000000C570008C72850415553452987 +:10582000C0B5684659464860096888680028FBD0BA +:105830008B4648688546C0BC01BC86467047000060 +:1058400040570008864D554C54493F2000B500BFD5 +:10585000FBF70FFFA80000207C550008C653494EF7 +:10586000474C45200348044908600020034908606C +:10587000704700008105000808000020A8000020F3 +:10588000E0500008C54D554C5449202003480449B8 +:105890000860044804490860704700002158000867 +:1058A00008000020FFFFFFFFA80000205C58000850 +:1058B000C6535441545553205D46AD6801218D4374 +:1058C000361F37602F467047B0580008C7524553FF +:1058D000544152540120B9680143B96080CE7047E9 +:1058E000C4570008C448414C542020200120B96806 +:1058F0008143B96080CE704748500008C453544F6C +:10590000502020205D462D1C361F37602F4600B5E5 +:10591000FFF7ECFFFBF7F0FE00BD000002CE012315 +:1059200019436A463846F0388546F8610020B86069 +:1059300002B401B43946091E083902B4091FB9611D +:1059400068467860954680CE704720205D462D6879 +:105950003D605D462F6080CE704720205D462D1C47 +:10596000361F37602F4600B53D683068854208D045 +:105970003F685D462D1CBD4202D17768083600BDE8 +:10598000F2E735682D683D607768083600BD000095 +:10599000FC570008C8494E4954494154452020202D +:1059A000361F71683160776000B5FFF7B7FF361FAB +:1059B0003760FFF7CBFF0120B86080CEFBF79CFE7D +:1059C00000BD0000E0570008C95445524D494E4102 +:1059D0005445202000B5FFF7C1FFFBF78DFE00BD49 +:1059E00044580008CA494E49542D4D554C5449203D +:1059F00000B5FFF737FF083E06493160776018278A +:105A000002F062F8034D2D60012003490860FFF7A2 +:105A10003DFF00BD103F0020183F0020807A0008A5 +:105A2000F059000874570008C34849535D462D1CBF +:105A30007F1B30683F18361D70470000E45800088F +:105A4000C953454D4150484F52452020361F3760BD +:105A5000082700B5FBF76EFD0B4805680C3E0021DA +:105A6000316000217160B7602F46FBF7B9FA3D46FF +:105A700080CE01200543A8473068386070687860A0 +:105A8000B7680C3600BD00003C000020CC58000870 +:105A9000C65349474E414C2000B5FBF74FFF3868CD +:105AA000401C38600020786080CEFBF751FF00BDBD +:105AB000905A0008C75245515545535400B500BF90 +:105AC000FBF73CFF3D68002D04D1FBF741FFFBF7DE +:105AD00013FEF5E73868401E38605D462D1C7D607A +:105AE00080CEFBF735FF00BD8C570008CA544153E8 +:105AF0004B2D434841494E2000B500BFFBF70EFD3A +:105B0000AC00002068530008C45441534B202020AF +:105B10000C4805680C482D18083E356077600B4F1F +:105B200000B5FCF78DFAFBF7C1FCFCF74FFA08480B +:105B30000568361F37602F46FCF7DAFA04490F6014 +:105B400080CE00BD1C000020F0010000E00200003B +:105B5000AC000020B45A0008C653544152543A20B5 +:105B600000B520BC361F3560FFF71AFF00BD0000EE +:105B7000E4590008C52E5441534B2020361F37608E +:105B8000124F00B53F68002F0ED03D1F2D683068C2 +:105B9000854208D10C3F361DFBF732FAFCF73AFB81 +:105BA000FCF7ECF900BDEDE780CEFFF7B3FBFCF7A7 +:105BB00003FC15206973206E6F7420696E205441B8 +:105BC000534B20636861696E00BD0000AC0000208B +:105BD0000C530008C62E5441534B5320361F3760D8 +:105BE000094F00B53F68002F0BD03D460C3D361FD6 +:105BF00037602F46FBF704FAFCF70CFBFCF7BEF905 +:105C0000F0E780CE00BD0000AC000020C0410008DD +:105C1000C82E52554E4E494E47202020361F376021 +:105C2000064F00B5FCF798F9361F3760FFF7A6FF5F +:105C30003F6802488742F5D180CE00BD103F00206A +:105C40001176312E30205B6275696C642030303300 +:105C5000385D153234204F637420323032332C20BB +:105C600031303A34343A313600B5FCF775F9FCF787 +:105C7000A3FB1C2A2A2A2A2A2A2A2A2A2A2A2A2A48 +:105C80002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A009E +:105C900000BD202000B5FFF7E7FFFCF75DF9FCF73A +:105CA0008BFB1C4D504520506F776572466F7274A8 +:105CB0006820666F722053544D33324630373200BD +:105CC000FCF74AF9FCF778FB104D6F64696669656B +:105CD0006420666F7220544142000000FCF73CF9DA +:105CE000361F3760064FFCF735FEFCF747F9361FC5 +:105CF0003760044FFCF72EFEFFF7B6FF00BD000033 +:105D0000405C0008525C0008405A0008CA524550E6 +:105D1000524F472E494D472000B500BFFBF7CBFB44 +:105D2000245D0008FC07002044090020000000005A +:105D3000006CDC0200000200000800003B1C83CE67 +:105D400000D17047021C0A431A430324144006D1B1 +:105D50000A680260091D001D1B1FF9D170470A78EF +:105D60000270491C401C5B1EF9D1704702CE012411 +:105D7000E40773465B1E1A680919781A07B480CEC7 +:105D80007046001D0047000002CEB942EFD180CE20 +:105D900001217046884302681047361F37607046FD +:105DA000401E076800BD000072B670473A4603CE39 +:105DB0000027121A091A914200D2FF4370470000CF +:105DC00001CE316820240022491840411346534136 +:105DD000C01B5B4101D0491C00E0C019641EF3D117 +:105DE0000F46306070472020361F0021316000B51B +:105DF000FFF7E6FF361D00BD003801400748056883 +:105E0000002D03D00548056805490D600448056864 +:105E10000C2028600D20286070470000080000203A +:105E2000D400002007480568361F37602F4600BFA2 +:105E3000FD6980200540FBD03068B862776808367D +:105E400070470000D400002004480568ED69202058 +:105E50000540361F37602F4670470000D4000020F1 +:105E60000A480568361F37602F4600BFFD692020AD +:105E70000540FBD07F6AFF20074000BF00BF00BF86 +:105E800000BF00BF00BF00BF00BF7047D4000020AC +:105E900030683F1830683760074600B5FFF774FF79 +:105EA0009D010020009D019805442D78361F376024 +:105EB0002F46FFF7B7FF0098401C0090F2D703B0C1 +:105EC00000BD2020361F37600D2700B5FFF7AAFF61 +:105ED000361F37600A27FFF7A5FF00BD0748056892 +:105EE000083E35607760064F00B5FFF77DFF00BFC5 +:105EF0007F1E002FFCD180CE00BD01BC0C00002015 +:105F000020A1070007480568083E35607760064F06 +:105F100000B5FFF769FF00BF7F1E002FFCD180CEC8 +:105F200000BD01BC0C0000208813000000B500BFBC +:105F3000FFF7E8FF7F1E002FFAD180CE00BD2020A2 +:105F400000B5FFF731FF054901200D6805430D60DD +:105F500003480449086000BFFEE700BD241002406A +:105F6000CCCC00000030004000B500BFFFF715FFAB +:105F7000200A002000B500BFFFF70FFF240A002011 +:105F800000B500BFFFF709FF280A002000B500BFD9 +:105F9000FFF703FF2C0A002000B500BFFFF7FDFE4E +:105FA000300A002000B500BFFFF74EFF002F80CE63 +:105FB00003D0FFF755FF80CEF6E700BD361F3760F0 +:105FC000062700B5FFF72EFF00BD2020361F3760E3 +:105FD000152700B5FFF726FF00BD2020361F3760CC +:105FE000182700B5FFF71EFF024901204042086054 +:105FF00000BD0000300A0020361F3760074F00B593 +:10600000FFF722FF002F80CE03D0FFF729FF361DB8 +:1060100000BD7F1E002FF3D1014F00BD00004000E6 +:10602000FFFFFFFF083E0021316077600C4F00B595 +:10603000FFF7E2FF31680F7070683F18FF200740DC +:1060400035686D1C07488542EFF3008001B4776026 +:106050002F46361D01BC80F30088E9D380CE00BDF9 +:10606000400A0020C00A002000B5FFF7B7FFFFF785 +:10607000B5FF00BD00B5FFF795FF07490868401C54 +:106080000860054805680548854202DDFFF7ECFF1A +:1060900001E0FFF79BFF00BD2C0A0020000100007B +:1060A00007480568083E0749316077602F4600B50C +:1060B00000F0BCF9024908688030086000BD0000AB +:1060C000240A0020400A002000B5FFF795FFFFF7E3 +:1060D00093FF30683F18FF2F80CE05D0FFF7CAFF2F +:1060E000FFF77CFF80CE00BD18480568FF20054003 +:1060F000BD4280CE02D0FFF7BDFF00BDFFF792FF8B +:10610000FFF77AFF30688742EFF3008001B47768C9 +:10611000083601BC80F3008802D0FFF7ABFF00BD5A +:106120000A4805680A480468AC4202DAFFF79CFF97 +:1061300000BDFFF7B5FFFFF741FF04490868401CA9 +:10614000086004490020086000BD0000200A00200B +:10615000280A00202C0A0020361F37600A4F00B59D +:10616000FFF772FE002F01D0002701E001277F42D8 +:106170003068074080CE03D0FFF7B0FE7F1EEFE708 +:1061800080CEFFF761FE00BDA086010000B5FFF7DD +:10619000E3FF002F80CE03D1024901204042086076 +:1061A00000BD0000300A00202A49002008602A496A +:1061B0000020086000B5FFF7F5FEFF0927490F60D2 +:1061C0003068274908600120264908601527361DD8 +:1061D000FFF728FEFFF7C0FF002F80CE05D1361F46 +:1061E00037601527FFF71EFEF4E700BFFFF7CEFF6D +:1061F00018480568002D1AD1FFF732FE042F06D18A +:1062000004201449086080CEFFF7D8FE0FE0182F55 +:1062100006D118200F49086080CEFFF7CFFE06E0B8 +:10622000012F03D180CEFFF74FFF00E080CE094859 +:106230000568002DDAD007480568042DEFF30080CB +:1062400001B4361F37602F4601BC80F3008800D1AF +:10625000002700BD300A00202C0A0020280A002058 +:10626000240A0020200A00200748056880200540F5 +:1062700000B508D0054D0648686006486860802073 +:1062800029698143296100BD10200240002002409D +:1062900023016745AB89EFCD083E13493160776034 +:1062A000124F00B53068451E002DEFF3008001B499 +:1062B000356001BC80F3008804D0FD6801200540F2 +:1062C000002DEFD1FD6834242C40FC60306800289C +:1062D000EFF3008001B42F46361D01BC80F3008827 +:1062E00001D10348074300BD000010000020024018 +:1062F0000000008000B5FFF7B7FF084901200D68D6 +:1063000005430D603068388077680836FFF7C4FFB2 +:10631000024901200D6885430D6000BD1020024038 +:106320000B483F1A00B5FFF79FFF0A4D022029696D +:10633000014329616F61402029690143296180CEB1 +:10634000FFF7AAFF044902200D6885430D6000BDD8 +:1063500000000008002002401020024000B500BFED +:10636000FFF71BFD340A0020202F80CE00B503D09C +:1063700002490868401C086000BD0000340A002083 +:1063800030683F1830683760074600B5FFF7FCFCFF +:1063900093060020009D01980544361F37602F4664 +:1063A000FFF7BEFFFFF7E0FF0348056800984019BC +:1063B0000090EFD703B000BD140000200548056829 +:1063C000083E0549316077602F4600B5FFF7D8FFDA +:1063D00000BD0000100000200000000870680546A5 +:1063E00001218D433068044601218C437F1C01212B +:1063F0008F433F1937607560274600B5FFF7C4FC2F +:10640000050700203D88009C01980444083E356043 +:1064100077602746FFF76EFFFFF7A6FFBF1C0098C7 +:10642000801C0090EED703B080CE00BD361F3760D1 +:10643000802700B5FFF7D2FF00BD20200F200740C6 +:10644000092F00B500DDFF1D3037FFF7EBFC00BD65 +:106450003D0B361F37602F4600B5FFF7EFFF3D0AB3 +:10646000361F37602F46FFF7E9FF3D09361F3760BB +:106470002F46FFF7E3FFFFF7E1FF00BD084572611C +:1064800073696E67200620646F6E65201053746117 +:10649000727420586D6F64656D20545820265072B8 +:1064A000657373205220746F207265626F6F742C55 +:1064B000206F7468657220746F20726570726F67E8 +:1064C00072616D20064572726F7273034E6F2020E9 +:1064D0007D1C3F78361F356000B5FFF7D9FC00BD45 +:1064E00000B5FFF7EFFC9C4D361F37602F46FFF7D6 +:1064F000AFFF361F37602027FFF794FC361F376049 +:10650000014FFFF7E5FF00BDA007002000B5FFF732 +:1065100075FC361F37603227FFF708FD00BD2020CD +:1065200000B5FFF7F3FF00BF284900200860FFF720 +:10653000C9FC361F3760264FFFF7CAFF361F37608A +:106540001427FFF7F3FCFFF739FF361F3760214FA1 +:10655000FFF7BEFFFFF7C4FF1C4900200860FFF7EC +:10656000B1FC361F37601C4FFFF7B2FF361F376094 +:106570001A27FFF757FC19480568083E184931608B +:1065800077602F46FFF710FE80CEFFF7A9FF361F7A +:1065900037606427FFF7CAFCFFF794FC361F3760AB +:1065A000104FFFF795FFFFF75BFCDF200740361F1A +:1065B0003760FFF737FC522F80CEB5D1361F3760DA +:1065C0006427FFF7B3FCFFF7BBFC00BD340A0020D3 +:1065D00058070020610700206807002010000020F5 +:1065E000000000087907002005436F707920202003 +:1065F00000B5FFF78BFFFFF765FC361F3760174FBD +:10660000FFF766FF361F37601427FFF78FFC14492A +:1066100000200860083EB16831607760FFF7B0FE87 +:10662000FFF75EFF361F37600A27FFF77FFC4A4DF2 +:10663000002D02D0B7680C3600BDFFF743FC361FB3 +:106640003760084FFFF744FFFFF7C8FEFFF748FF2A +:10665000361F37601427FFF769FC00BD580700207C +:10666000340A0020C408002000B500BF0C3EF168C9 +:10667000316031697160B760FFF7BAFF364D002DA8 +:10668000F4D1361F37606427FFF750FCFFF758FC42 +:1066900000BD0000C8590008CB5245464C41534844 +:1066A0005541525400B500BFFAF738FFB000002042 +:1066B000585B0008C643414C4C49542072B60F4801 +:1066C0000568103E0E4931600E497160B560F76093 +:1066D0000D4F00B5FAF74EFB094DAF600B48E8606F +:1066E0000B4828610B4868613568776808360120D7 +:1066F0000543A847FDF718F900BD0000B0000020D1 +:1067000000000020245D000870090000006CDC021D +:1067100000F8010000080000B4660008C7524546B2 +:106720004C41534804480568361F37602F4600B572 +:10673000FFF7C4FF00BD0000245D00080C5D0008E9 +:10674000C9434F5059464C415348202004480568DE +:10675000361F37602F4600B5FFF7B0FF00BD0000C1 +:10676000285D0008EC5A0008CA4449534B2D455295 +:10677000524F522000B500BFFAF7D0FEB4000020FF +:1067800098660008C8454E442D4C4F4144202020B7 +:106790005D460020E8625D46012040422863704764 +:1067A00000B500BFFBF79AFB062F80CEFAD100BDE3 +:1067B000361F3760002700B580CEFBF78FFB152F03 +:1067C00001D0002501E001256D42062F01D00027F0 +:1067D00001E001277F422F43EFF3008001B42F46F1 +:1067E00001BC80F30088E7D000BD2020083E0021D6 +:1067F00031607760064F00B5F9F794FF3068376075 +:106800000746FBF787FBFBF785FBFFF7C9FF00BDDA +:106810000001000000B500BFFBF760FB012F80CE38 +:10682000FAD100BFFBF768FB002F80CE03D0FBF747 +:1068300055FB80CEF6E7361F37600627FBF76AFB6D +:1068400000BD202000B5FBF765FBFFF7E3FF7D1CD3 +:106850003F78083E37607560FFF7C8FF361F376026 +:10686000002700BFF9F73AFE8B680008009D0198E9 +:106870000544ED192D78361F37602F46FBF74AFB8C +:106880000098401C0090F1D703B00627FBF742FBAD +:10689000FFF78EFF01490F6080CE00BDB4000020DD +:1068A000361F3760052700B5FBF734FBFBF754FBB9 +:1068B000FBF782FD084572726F72202320000000F2 +:1068C000FBF792FEFBF75AFBFBF780FBFCF742F865 +:1068D000FBF742FBFFF75CFF00BD2020361F37604F +:1068E000062700B5FFF7AEFF361F3760184FFFF7DA +:1068F0007DFF361F37600127FFF778FFFFF78AFF1C +:106900005D46002028635D4601204042E862002089 +:1069100010490860FCF780FCFCF7BAF8361F3760B6 +:106920000D4FFBF759FD002F00D180CE0AD0FFF7A5 +:10693000B7FF5D46AD69361F37602F463E1C80CEDF +:10694000FCF76AFC5D462D6B002DE5D000BD01B45F +:10695000FFFFFFFF98000020A0330008F454000858 +:10696000C7494E434C554445361F3760202700B574 +:10697000FCF702F97D1C3C78083E356077602746BD +:10698000FAF742FAFFF7AAFF00BD00001858000806 +:10699000C847454E53504942522020203068376046 +:1069A000074600B5F9F75CFF083E002131607760CB +:1069B000072700BFF9F792FDDF690008009D0198E5 +:1069C00005440124AC40BC4204DA009F019807440E +:1069D00003B000BD0098401E0090EFD703B0002721 +:1069E00000BD000094590008C928494E495453502D +:1069F0004929202000B580B4009F40203968814398 +:106A0000396080CEFFF7CAFFFF0007480743009DAB +:106A10002F60009F0548786080BC402039680143A2 +:106A2000396080CE00BD00000703000000170000A1 +:106A300060690008CD535049325F4E43535F4D4566 +:106A40004D53202000B500BFFAF735FD506A00080D +:106A5000000800480100000040000000285A00081B +:106A6000C8535049325F53434B20202000B500BF2C +:106A7000FAF721FD786A00080004004800200000B1 +:106A80002D00000040670008C9535049325F4D494E +:106A9000534F202000B500BFFAF70DFDA06A000893 +:106AA00000040048004000002E000000886A000832 +:106AB000C9535049325F4D4F5349202000B500BFA4 +:106AC000FAF7F9FCC86A00080004004800800000DA +:106AD0002F000000E8690008C84953535049504945 +:106AE0004E202020083E00213160776000B5FDF780 +:106AF0007FFE361F03213160FDF70CFF00BD000053 +:106B000084670008CA53454C494F2D5350493220E1 +:106B1000174D184C696921436961A96AA143A962AB +:106B2000134D154CE9692143E9612969A1432961A4 +:106B3000124D083E356077602F4600B5FDF748FEE0 +:106B4000083E012131607760FDF7E4FEFDF75EFD50 +:106B5000361F37600A4FFFF7C5FF361F3760094FF2 +:106B6000FFF7C0FF361F3760074FFFF7BBFF00BDC1 +:106B7000001002400000C00000400000506A000801 +:106B8000786A0008A06A0008C86A00081052000865 +:106B9000C75350495843484730683873361D00B5CD +:106BA000F9F7EEFCF9F7ECFCF9F7EAFCF9F7E8FC89 +:106BB000BD6883200540032DFAD13F7BFF200740AD +:106BC00000BD0000606A0008C8535049464C555348 +:106BD00048202020361F3760044F00BFBD680120C9 +:106BE000054001D0FD68F9E780CE704700380040CD +:106BF000FC580008C453504921202020361F37601C +:106C0000024F00B5FFF7C8FF80CE00BD003800403E +:106C1000F46B0008C453504940202020083EFF2157 +:106C200031607760024F00B5FFF7B6FF00BD00008E +:106C300000380040D86A0008C8494E4954535049AA +:106C40003220202000B5FFF763FF0C3E054931607C +:106C500005497160B760054FFFF7CCFEFFF7BAFF3B +:106C600000BD0000006CDC0240420F000038004014 +:106C7000745B0008C52E535049322020083E044959 +:106C800031607760402700B5FEF7E4FB00BD0000EF +:106C900000380040C86B0008C853504944454C4177 +:106CA00059202020361F3760092700BF7F1E002F84 +:106CB000FCD180CE70470000B06A0008C943534C35 +:106CC0004F5F4D454D53202000B5FFF7EBFF361FBA +:106CD0003760034FFDF7A6FCFFF7E4FF00BD00009F +:106CE000506A0008BC6C0008C9435348495F4D45D1 +:106CF0004D53202000B5FFF7D5FF361F3760034FF7 +:106D0000FDF784FCFFF7CEFF00BD0000506A0008CD +:106D1000E86C0008C4484F4D45202020361F3760DE +:106D20001B2700B5FBF7F6F8361F37605B27FBF72C +:106D3000F1F8361F37604827FBF7ECF800BD00007C +:106D400084580008C42E504F53202020361F37602F +:106D50000A2700B5F9F774FD3037FBF7DBF8303759 +:106D6000FBF7D8F800BD0000046B0008C6474F547D +:106D70004F585920361F37601B2700B5FBF7CAF85C +:106D8000361F37605B27FBF7C5F8FFF7DFFF361FBD +:106D900037603B27FBF7BEF8FFF7D8FF361F376099 +:106DA0004827FBF7B7F800BD68670008CB434C45A0 +:106DB000415253435245454E361F37601B2700B59D +:106DC000FBF7A8F8361F37605B27FBF7A3F8361FE1 +:106DD00037603227FBF79EF8361F37604A27FBF7EC +:106DE00099F800BD6C6D0008CA5343524F4C4C4497 +:106DF0004F574E20361F37601B2700B5FBF78AF828 +:106E0000361F37604427FBF785F800BD986C0008F3 +:106E1000C85343524F4C4C5550202020361F3760EA +:106E20001B2700B5FBF776F8361F37604D27FBF7B9 +:106E300071F800BD146D0008C95343524F4C4C49C2 +:106E40004E472020361F37601B2700B5FBF762F83E +:106E5000361F37605B27FBF75DF8361F37607227F8 +:106E6000FBF758F800BD0000386E0008C9435552C2 +:106E7000534F524F46462020361F37601B2700B520 +:106E8000FBF748F8361F37605B27FBF743F8361FE0 +:106E900037603F27FBF73EF8361F37603227FBF796 +:106EA00039F8361F37603527FBF734F8361F37605F +:106EB0006C27FBF72FF800BD106E0008C843555231 +:106EC000534F524F4E202020361F37601B2700B5EE +:106ED000FBF720F8361F37605B27FBF71BF8361FE0 +:106EE00037603F27FBF716F8361F37603227FBF76E +:106EF00011F8361F37603527FBF70CF8361F37605F +:106F00006827FBF707F800BD085B0008C34553433B +:106F100000B500BFFAF7CFFA1B000000346A000882 +:106F2000C43C23233E2020205D46AD6B00B520B439 +:106F3000FBF7C0FA361F37600027FBF703FBFBF7B0 +:106F4000F3FAFBF709FBFAF7F7FF20BC5C46A563F1 +:106F500000BD00001C670008C44553435B2020208F +:106F6000361F37601B2700B5FAF7D4FFFBF724FA6A +:106F7000015B000000BD0000BC6E0008C744454630 +:106F800041554C5400B500BFFAF795FA00000000D7 +:106F9000105C0008C4424F4C4420202000B500BFC4 +:106FA000FAF789FA01000000146C0008C344494D47 +:106FB00000B500BFFAF77FFA0200000090690008F0 +:106FC000C64954414C49432000B500BFFAF773FA53 +:106FD00003000000AC6D0008C9554E4445524C49B1 +:106FE0004E45202000B500BFFAF765FA0400000006 +:106FF000AC6F0008C5424C494E4B202000B500BF85 +:10700000FAF759FA0500000048550008C3524556E2 +:1070100000B500BFFAF74FFA07000000F46F000850 +:10702000C5424C414E4B202000B500BFFAF743FA51 +:107030000800000020700008C5424C41434B20204E +:1070400000B500BFFAF737FA000000000C70000826 +:10705000C352454400B500BFFAF72DFA0100000005 +:107060006C6E0008C5475245454E202000B500BF54 +:10707000FAF721FA02000000C06F0008C659454C1B +:107080004C4F572000B500BFFAF715FA0300000077 +:10709000946F0008C4424C554520202000B500BF25 +:1070A000FAF709FA04000000D45B0008C74D414715 +:1070B000454E544100B500BFFAF7FDF90500000048 +:1070C00038700008C44359414E20202000B500BF4D +:1070D000FAF7F1F90600000064700008C557484946 +:1070E0005445202000B500BFFAF7E5F9070000007D +:1070F00050700008C44154545220202000B5FFF7BE +:107100002FFFFFF711FFFBF757F9016D00BD0000DE +:107110000C6F0008C4544558542020201E3700B579 +:10712000FFF7ECFF00BD0000DC700008CA424143DD +:107130004B47524F554E4420283700B5FFF7DEFF2E +:1071400000BD000014710008CB4D4F544F52454E06 +:1071500041424C4500B500BFFAF7ADF96071000837 +:10716000000000480100000000000000746C0008EE +:10717000C74C4546544F444F00B500BFFAF79BF942 +:1071800084710008000000480200000001000000B7 +:107190007C6F0008C952462F4C524C454453202066 +:1071A00000B500BFFAF787F9AC710008000000488D +:1071B0000400000002000000906B0008C852485311 +:1071C00053454E534520202000B500BFFAF773F910 +:1071D000D47100080000004808000000030000000F +:1071E000586F0008C65350415245312000B500BFCA +:1071F000FAF761F9F871000800000048100000007B +:1072000004000000E4710008C6535041524532208A +:1072100000B500BFFAF74FF91C72000800000048E3 +:10722000200000000500000008720008C65350410D +:107230005245332000B500BFFAF73DF9407200080F +:107240000000004840000000060000002C7200080A +:10725000C65350415245342000B500BFFAF72BF910 +:107260006472000800000048800000000700000071 +:10727000D86F0008C6285250574D292000B500BFCE +:10728000FAF719F9887200080000004800010000B0 +:107290000800000074720008C6284C50574D292081 +:1072A00000B500BFFAF707F9AC720008000000480B +:1072B000000800000B000000AC700008C84C4853E8 +:1072C00053454E534520202000B500BFFAF7F3F890 +:1072D000D4720008000400480100000020000000F3 +:1072E000F4700008C94C462F52524C45445320209C +:1072F00000B500BFFAF7DFF8FC7200080004004890 +:107300000200000021000000BC710008C85249477B +:1073100048544F444F20202000B500BFFAF7CBF867 +:10732000247300080004004810000000240000003E +:10733000206F0008C44C45443120202000B500BF18 +:10734000FAF7B9F84873000800040048400000004C +:1073500026000000446D0008C9494E4E45524C4578 +:107360004453202000B500BFFAF7A5F87073000859 +:1073700000040048000100002800000034730008E9 +:10738000C44C45443220202000B500BFFAF793F8E2 +:107390009473000800080048002000004D00000021 +:1073A00058730008C9492F4F434C4F434B5320207B +:1073B0000F4D10486969014369610F48A96901438C +:1073C000A9610320E9690143E9612C460C340A4BA9 +:1073D0002168194321602168994321602C461034AB +:1073E0000323216819432160216899432160704774 +:1073F0000010024001000E00000A0600BC720008E6 +:10740000C450574D4C20202001490F6080CE70475A +:10741000342C014000740008C450574D52202020E5 +:1074200001490F6080CE7047402C0140187400085D +:10743000C84C45465453544F5020202000B500BF3F +:10744000FAF739F8D401000094710008C95249478D +:10745000485453544F50202000B500BFFAF72BF882 +:10746000D4010000E86D0008CA53544F504D4F54EA +:107470004F525320361F3760044F00B5FFF7C4FF4B +:10748000361F3760014FFFF7CBFF00BDD40100006E +:107490007C700008C6494E495454312000B5FFF7AE +:1074A000E9FF0F4D0F48E8626020A8610E48E861CF +:1074B0000E4828620020A8620D48686401202860F8 +:1074C000083E0221316077600A4FFDF791F9083ECE +:1074D000022131607760084FFDF78AF900BD000096 +:1074E000002C0140E80300000060000001100000D3 +:1074F00000800000AC7200088872000870710008FB +:10750000C74C504552494F4402480588361F3760E2 +:107510002F4670473800004050720008C75250454F +:1075200052494F4402480588361F37602F4670473E +:107530003404004000750008CA494E495450455271 +:10754000494F44200448F8622F20B8620120386077 +:107550003120386280CE7047FFFFFFFF386C000893 +:10756000C8494E495454322F33202020134D14481B +:10757000E8601448A8601448A861361F37602F4699 +:1075800000B5FFF7DFFF114D1148E8601148A86012 +:107590001148A861361F37602F46FFF7D3FF083E1A +:1075A0000221316077600D4FFDF722F9083E01217D +:1075B000316077600A4FFDF71BF900BD0000004005 +:1075C00000040000640100001111000000040040EC +:1075D0000002000054010000111000008471000836 +:1075E00024730008A4730008C64C434F554E542022 +:1075F0000348056803494D1B361F37602F46704707 +:1076000034000240FFFF0000C4700008CB4C434F21 +:10761000554E54434C454152044D002028600448C7 +:1076200004490860312028607047000030000240A3 +:10763000FFFF00003400024048710008C652434F6B +:10764000554E54200348056803494D1B361F3760CB +:107650002F46704748000240FFFF00006874000892 +:10766000CB52434F554E54434C454152044D00209C +:1076700028600448044908603120286070470000F1 +:1076800044000240FFFF0000480002402C71000847 +:10769000C8444D41494E495433202020044D0548EB +:1076A000A8630548E86300B5FFF7B6FF00BD00001A +:1076B00000000240244801400000000890760008C5 +:1076C000C8444D41494E495434202020044D0548BA +:1076D000E8640548286500B5FFF7C8FF00BD000055 +:1076E0000000024024480140000000089872000891 +:1076F000CB434C454152434F554E545300B5FFF7D1 +:107700008BFFFFF7B3FF00BDC0760008CA524641A9 +:107710004E414C4F4755452000B500BFF9F7CBFE11 +:107720000800000060750008C54C494E4530202017 +:1077300000B500BFF9F7BFFE080000000C77000895 +:10774000CA5257414E414C4F4755452000B500BFE6 +:10775000F9F7B1FE1000000028770008C54C494E2B +:107760004531202000B500BFF9F7A5FE100000004C +:1077700094700008CA4C46414E414C4F4755452035 +:1077800000B500BFF9F797FE200000005C77000805 +:10779000C54C494E4532202000B500BFF9F78BFE9D +:1077A0002000000074770008CA4C57414E414C4FEE +:1077B0004755452000B500BFF9F77DFE40000000A9 +:1077C00090770008C54C494E4533202000B500BFD6 +:1077D000F9F771FE400000003C760008C7414E41B9 +:1077E0004C4F4753704700000C760008C641444395 +:1077F0005F43522000B500BFF9F75DFE0824014049 +:1078000030740008C341444300B500BFF9F753FE8C +:10781000002401401C750008C8414443444F4E45B4 +:107820003F2020200648056804200540002D01D097 +:10783000002501E001256D42361F37602F46704755 +:1078400008240140E8750008CB574149544144439E +:10785000444F4E4500B500BFFFF7E4FF002F80CE38 +:10786000FAD000BD48780008CB5741495443414CF9 +:10787000444F4E4500B500BF02480568002DFBD1BE +:1078800000BD01B40824014040770008CB414443C7 +:10789000454E41424C45443F0348056801200540A0 +:1078A000361F37602F46704708240140DC770008F8 +:1078B000C74144435F43414C00B5FFF7EDFF002F44 +:1078C00080CE02D0022006490860FFF7D3FF0020D7 +:1078D00003490860034802490860FFF7CBFF00BD79 +:1078E00008240140000000800C730008C941444393 +:1078F000454E41424C45202000B5FFF7DDFF0120F9 +:107900000149086000BD00000824014080730008A0 +:10791000C9574149545245414459202000B500BF40 +:107920000248056801200540FAD000BD002401404E +:1079300018780008C8414443535441525420202031 +:10794000024904200D6805430D607047082401407A +:1079500010790008C7494E495441444300B5FFF728 +:1079600041FFFFF7A9FFFFF7C7FFFFF7D7FF044D60 +:107970000020E860034828610420686100BD000021 +:107980000024014000000080B0780008C54348533F +:10799000454C202000B500BFF9F78DFD282401409B +:1079A0008C790008C74144434441544100B500BFAD +:1079B000F9F781FD40240140E4720008C441544FAE +:1079C0004420202006490F6080CE00B5FFF7B8FFA5 +:1079D000FFF740FF03480568361F37602F4600BD9C +:1079E000282401404024014068780008C9494E49D4 +:1079F000545354554646202000B5FFF7D9FCFFF7F5 +:107A0000B5FDFFF74BFEFFF761FEFFF747FDFFF700 +:107A1000A5FF00BD38750008CA494E4954414C4C79 +:107A2000492F4F2000B5FFF7E7FF361F37600E4F95 +:107A3000FCF7CEFE361F37600C4FFCF7C9FE361F31 +:107A400037600B4FFCF7F6FE361F3760094FFCF727 +:107A5000F1FE361F3760084FFCF7BAFE361F37605D +:107A6000064FFCF7B5FE00BDFC720008AC710008C3 +:107A7000D4710008D4720008487300089473000899 +:107A800000000000247A0008A4790008C652502D96 +:107A9000454E442000B500BFF9F70DFD4C360020DF +:107AA00060760008CA534554434F4E534F4C45200F +:107AB0005D46EF645D46AF6480CE7047EC780008A9 +:107AC000C545524153452020361F3760002700B579 +:107AD000F9F7F6F900BD0000B80000000000002032 +:107AE0000000000000000000000000008005000809 +:107AF00000000000E800000000000000000000009E +:107B0000000000000000000000000000180000203D +:107B10000000000000000000000000000000000065 +:107B2000000000008005000800000000981E00080A +:107B30001000000054790008C4770008EC790008B0 +:107B4000187A000804780008BC790008A8770008B3 +:107B5000EC7700088C7A000834790008C07A0008B5 +:107B60004C7400088C780008A47A0008F0760008AD +:107B70009474000800000000402800080000000085 +:107B8000807A0008010000000000000000000000F2 +:107B900010580008003801400000000000000000FC +:00000001FF diff --git a/mwmouse/sources/TAB.img b/mwmouse/sources/TAB.img Binary files differ. diff --git a/mwmouse/sources/VT100COLOURS.fth b/mwmouse/sources/VT100COLOURS.fth @@ -0,0 +1,34 @@ +\ VT100 attributes +27 CONSTANT ESC +: <##> ( n -- ) \ sends n, radix 10, no spaces + BASE @ >R DECIMAL 0 <# #S #> TYPE R> BASE ! ; +: ESC[ ( -- ) + ESC EMIT ." [" ; +\ Attributes +0 CONSTANT DEFAULT \ All attributes off +1 CONSTANT BOLD \ Increased intensity +2 CONSTANT DIM \ Decreased intensity +3 CONSTANT ITALIC \ If supported by terminal +4 CONSTANT UNDERLINE \ If supported by terminal +5 CONSTANT BLINK \ Slow blink +7 CONSTANT REV \ Reverse video +8 CONSTANT BLANK \ If supported by terminal +\ Colours +0 CONSTANT BLACK +1 CONSTANT RED +2 CONSTANT GREEN +3 CONSTANT YELLOW +4 CONSTANT BLUE +5 CONSTANT MAGENTA +6 CONSTANT CYAN +7 CONSTANT WHITE +: ATTR ( a -- ) \ Attribute 0-8 + ESC[ <##> ." m" ; +: TEXT ( c -- ) \ Text colour + 30 + ATTR ; +: BACKGROUND ( c -- ) \ Background colour + 40 + ATTR ; +\ Examples of use: +\ WHITE TEXT BLUE BACKGROUND +\ BLUE TEXT BOLD ATTR +\ CYAN TEXT diff --git a/mwmouse/sources/WOW.hex b/mwmouse/sources/WOW.hex @@ -0,0 +1,1985 @@ +:020000040800F2 +:10000000203C00208D010008E5430008454400081D +:10001000090100080B0100080000000000000000BA +:100020000000000000000000000000000F010008B8 +:1000300011010008000000001301000835560008F7 +:1000400000000000000000000000000000000000B0 +:1000500000000000000000000000000000000000A0 +:100060000000000000000000000000000000000090 +:100070000000000000000000000000000000000080 +:100080000000000000000000000000000000000070 +:100090000000000000000000000000000000000060 +:1000A0000000000000000000000000000000000050 +:1000B0000000000000000000000000000000000040 +:1000C0000000000000000000000000000000000030 +:1000D0000000000000000000000000000000000020 +:1000E0000000000000000000000000000000000010 +:1000F0000000000000000000000000000000000000 +:1001000040380008FEE7FEE7FEE7FEE7FEE7FEE711 +:10011000FEE7FEE7FEE72020174D01202968014396 +:100120002960361F37602F4600B500BF3D680220AA +:100130000540FBD01120114908601148786000206B +:10014000F862104839680143396000BF3D680E48C5 +:100150000540FBD03D1D0C3E032131600221716042 +:10016000B7602F4601F0FEFB7D680C200540082D8E +:10017000FAD180CE00BD01BC001002400020024038 +:1001800000801004000000010000000200B500BF64 +:10019000104D85F30888104D85F30988022585F3F5 +:1001A0001488BFF36F8F0D4E0D4DAB460D490E48B1 +:1001B0000D6805430D600D490D480D6885430D60C0 +:1001C000FFF7AAFF0B48056801200543A847DFE7B2 +:1001D00000BD0000203C0020203E0020043F002005 +:1001E000103F00201410024014007E00281002402E +:1001F00000007E0000010008043F0020203E002097 +:1002000000000000000000000000000000000000EE +:100210000A0000000000000000C0000800C0000844 +:10022000B80000204C000020E4115333000000000F +:10023000C3414E4431680F40361D70470000000036 +:10024000C24F522031680F43361D70470000000036 +:10025000C3584F5231684F40361D704700000000B0 +:10026000C6494E5645525420FF43704700000000D7 +:10027000C2303D20002F01D0002701E001277F423E +:100280007047000000000000C3303C3E002F01D149 +:10029000002701E001277F4270470000700200083C +:1002A000C2303C20002F01D4002701E001277F420B +:1002B00070470000A0020008C2303E20002F01DC81 +:1002C000002701E001277F42704700000000000086 +:1002D000C13D20203068874201D0002701E001277E +:1002E0007F42361D70470000D0020008C23C3E200D +:1002F0003068874201D1002701E001277F42361D87 +:100300007047000000000000C13C20203068874298 +:1003100001DC002701E001277F42361D7047000005 +:1003200060020008C13E20203068874201DB0027C0 +:1003300001E001277F42361D70470000EC020008F3 +:10034000C23C3D203068874201DA002701E00127E6 +:100350007F42361D7047000000000000C23E3D2075 +:100360003068874201DD002701E001277F42361D0A +:100370007047000000000000C2553E2030688742F0 +:1003800001D3002701E001277F42361D704700009E +:1003900078030008C2553C203068874201D8002706 +:1003A00001E001277F42361D7047000094030008DA +:1003B000C344303C002F01D4002701E001277F42D5 +:1003C000361D7047B0030008C344303D31680F4309 +:1003D000002F01D0002701E001277F42361D704722 +:1003E00000000000C2443D2007CE3B1C0027801ABD +:1003F0008B41384300D1FF43704700005C03000885 +:10040000C34D494E01CE874200DD074670470000CC +:1004100000040008C34D415801CE874200DA074668 +:100420007047000008030008C657495448494E2049 +:1004300030683F1A716830680D1AAF4201D8002742 +:1004400001E001277F42083670470000B80200082B +:10045000C64C534849465420384680CE87407047A2 +:1004600000000000C652534849465420384680CE0A +:10047000C740704764040008C74152534849465476 +:10048000384680CE0741704700000000C7455845F8 +:10049000435554450120384380CE00470121704622 +:1004A0008843026810470000391C80CEF6D07046A1 +:1004B000001D004701CEB842F0D180CEF7E7000022 +:1004C0000099491C0091E9D703B0F0E70099C919D8 +:1004D000009180CEE2D703B0E9E7000002CE01240C +:1004E000E40773465B1E1A680919781A07B480CEB0 +:1004F000DDE7000002CEB942F1D180CECEE70000A8 +:1005000040020008C54C45415645202002B000BDC0 +:1005100000000000C63F4C45415645203F1C80CEA0 +:1005200000D1704702B000BD00000000C14920208A +:10053000361F3760009F01983F187047500200082F +:10054000C14A2020361F3760039F04983F18704728 +:1005500040050008C6554E4C4F4F502003B0704721 +:10056000E4030008C3533E44FD17361F37602F468F +:100570007047000050040008C44E4F4F5020202008 +:100580007047000024030008C24D2B2003CEFA1749 +:10059000C91950410746361F31607047880200086C +:1005A000C2312B207F1C7047A0050008C2312D20CE +:1005B0007F1E70478C040008C12B20203068361D38 +:1005C0003F18704740030008C12D20203068361DB9 +:1005D000C71B704730020008C64E454741544520AE +:1005E0007F42704764050008C2442B2007CE801864 +:1005F0004F41361F30607047E8050008C2442D2087 +:1006000007CE101AB9410F46361F30607047000000 +:1006100054050008C7444E45474154453068002101 +:100620004042B9410F46306070470000FC050008A9 +:10063000C73F4E45474154453F1C80CE00D57F42C1 +:1006400070470000D8050008C3414253002F00D571 +:100650007F42704778040008C44441425320202060 +:100660003F1CDBD470470000C8030008C344322A93 +:10067000306800187F413060704700006C06000849 +:10068000C344322F306840107F108941C9070843A6 +:100690003060704714060008C12A202031684F439B +:1006A000361D704758060008C3554D2A3846316834 +:1006B00040B40A04120C0B0C0404240C050C16465E +:1006C00066431F466F4318466043010C000436180A +:1006D0004F4128465043010C000436184F4135461F +:1006E00040BC35607047000088050008C24D2A20D4 +:1006F00035687D4000B520B4002F00D57F423568B5 +:10070000002D00D56D423560FFF7D0FF20BC002DD5 +:1007100001D5FFF783FF00BD98060008C6554D2F91 +:100720004D4F442001CE3168202400224918404119 +:1007300013465341C01B5B4101D0491C00E0C01966 +:10074000641EF3D10F46306070470000B805000802 +:10075000C6464D2F4D4F442000B580B435687D40CE +:1007600020B480B480CEFFF77BFF009D002D00D524 +:100770006D42361F37602F46FFF7D4FF15480740FC +:1007800020BC002D01D4002501E001256D42002D83 +:10079000EFF3008001B430683760074601BC80F396 +:1007A000008800D57F4220BC002DEFF3008001B40B +:1007B00030683760074601BC80F3008808D57F4267 +:1007C0003068002804D07F1E009D30682D1A3560E7 +:1007D00001B000BDFFFFFF7F00000000C6534D2F9A +:1007E00052454D2000B5306801B480B480CEFFF78B +:1007F00037FF009D002D00D56D42361F37602F4614 +:10080000FFF790FF20BC009C6C40002C00D57F427D +:1008100020BC002DEFF3008001B43068376007463C +:1008200001BC80F3008800D57F42306837600746FE +:1008300000BD0000AC050008C42F4D4F442020200F +:1008400000B580B43168CF1720BC361F37602F4603 +:10085000FFF7C8FF00BD000014040008C12F2020CE +:1008600000B580B43168CF1720BC361F37602F46E3 +:10087000FFF7B8FF361D00BD80060008C2552F20C7 +:10088000361F0021316000B5FFF74CFF361D00BD5B +:100890005C080008C34D4F4400B5FFF7D1FF80CE80 +:1008A00000BD0000EC060008C24D2F2000B5FFF788 +:1008B00099FF361D00BD000038080008C64D552FB1 +:1008C0004D4F442000B580B4009F361F0021316099 +:1008D000FFF728FF20BC80B42F46FFF723FF20BC82 +:1008E000361F37602F4600BDA8080008C52A2F4DC7 +:1008F0004F44202000B580B480CEFFF7F9FE20BC25 +:10090000361F37602F46FFF76DFF00BD5007000808 +:10091000C22A2F2000B5FFF7EDFF361D00BD0000F5 +:1009200004050008C34E4950361D7047A80600084C +:10093000C45455434B202020361F716831607760C6 +:100940007047000048060008C45049434B2020204F +:10095000BF00F7597047000030060008C4524F4CE2 +:100960004C202020B800002801DC80CE704737588A +:10097000011F72583250081CFAD1361D7047000012 +:1009800014050008C3524F543D46776831687160C2 +:100990003560704724090008C42D524F5420202090 +:1009A0003D4637687168316075607047940800088B +:1009B000C23E522080B480CE704700004809000833 +:1009C000C2523E20361F376080BC7047C009000805 +:1009D000C2524020361F3760009F704784090008CC +:1009E000C3323E5203CE01B480B40F1C70470000E6 +:1009F000E0090008C332523E03BC083E3160776014 +:100A000007467047F4090008C33252400098019924 +:100A1000083E316077600746704700007C08000898 +:100A2000C453574150202020306837600746704734 +:100A3000200A0008C3445550361F37607047000035 +:100A4000BC080008C44F564552202020361F37608E +:100A50007768704730090008C444524F5020202066 +:100A600080CE7047340A0008C53244524F502020CF +:100A70007768083670470000680A0008C532535787 +:100A800041502020706877600746B0683168B160D7 +:100A9000306070475C090008C43244555020202063 +:100AA000083EB16831607760704700007C0A00083A +:100AB000C5324F5645522020083E3169316077607B +:100AC000F7687047440A0008C43F4455502020206E +:100AD000002F01D0361F376070470000980A0008C9 +:100AE000C3535040361F376037467047E00A00084E +:100AF000C35350213E4680CE70470000080A0008CC +:100B0000C3525040361F37606F467047000B0008D5 +:100B1000C3525021BD4680CE70470000580A0008DD +:100B2000C5434F554E5420207D1C3F78361F3560FD +:100B300070470000F00A0008C72F535452494E472F +:100B40003168CD1B70683F1877602F46361D70479F +:100B5000B00A0008C4534B495020202003CE401C4B +:100B6000401E04D00A78BA4201D1491CF8E7361F6A +:100B70003160074670470000540B0008C4534341DE +:100B80004E20202003CE401C401E04D00A78BA42DA +:100B900001D0491CF8E7361F316007467047000056 +:100BA000100B0008C2533D2003CE3F1C07D0027833 +:100BB0000B78401C491C9A4201D17F1EF7D102D10B +:100BC00001277F4200E00027704700002C05000845 +:100BD000C7434F4D504152457168CD1B00B520B4FD +:100BE00071688F4200DB0F1C31687160361D00BFD9 +:100BF000002F23D075682D78346824782C1B002CA6 +:100C0000EFF3008001B4361F71683160B168716024 +:100C1000B760274601BC80F3008804D001B080B4DF +:100C20000027361D09E037687F1C75686D1CB068A9 +:100C3000441E7760B5602746361DD9E780BC002F7B +:100C4000EFF3008001B4083601BC80F3008807D0C0 +:100C5000002F01D4002701E001277F420120074334 +:100C600000BD202000B5B16802B4716802B43168DB +:100C700002B480B480B0484601B4E946F768103643 +:100C80004D462D694C46E4684B465B68E31A5B1C95 +:100C90005B19083E336077602F4600BFFFF72AFCE0 +:100CA0000F0D0008009D019805442D784C46A4685E +:100CB0002478AC4226D1009D019805444C46A46896 +:100CC0004B465B680C3E34607560B7601F46FFF7AB +:100CD0006BFF002F80CE15D0009D019805444C4637 +:100CE000E468009B019803444A4612699A1AA21AC2 +:100CF00003B00C3E32607560B7600B4F01BC81469B +:100D000004B000BD0098401C0090CBD703B04D4606 +:100D10002D694C46E4680C3E34607560B76000276E +:100D200001BC814604B000BDFFFFFFFFDC070008E7 +:100D3000C6534541524348207068874200B502DDE2 +:100D40000027361D00BD002F02DC064F361D00BDFA +:100D50007068002802DC0027361D00BDFFF782FF07 +:100D600000BD0000FFFFFFFF200B0008C5434D4FF3 +:100D7000564520203B1C83CE00D17047021C0A43FD +:100D80001A430324144006D10A680260091D001D9D +:100D90001B1FF9D170470A780270491C401C5B1E6A +:100DA000F9D17047300D0008C6434D4F56453E20DF +:100DB0003B1C83CE00D17047C018C918021C0A43DF +:100DC0001A430324144006D1091F001F0A68026059 +:100DD0001B1FF9D17047491E401E0A7802705B1E26 +:100DE000F9D170476C0D0008C3555043612F00B511 +:100DF00003DB7A2F01DCDF20074000BDD00B0008A9 +:100E0000C55550504552202030683F183068376033 +:100E1000074600B5FFF76EFB430E0008009D0198E2 +:100E200005442D78361F37602F46FFF7DFFF009D02 +:100E3000019805442F7080CE0098401C0090EDD79B +:100E400003B000BDA40B0008C5504C414345202011 +:100E500000B5306801B480B47F1C30683760074645 +:100E600001F05CFF20BC10BC2C7000BD980900088C +:100E7000C24F4E2001204042386080CE70470000B3 +:100E800078050008C34F46460020386080CE704782 +:100E9000D0090008C232402003CF361F0746316018 +:100EA00070470000940E0008C23221203A1C83CE05 +:100EB00003C27047000E0008C446494C4C20202055 +:100EC0003A1C83CE002803D00A70491C401EFBD177 +:100ED0007047000028040008C22B212030683968C0 +:100EE000091839607768083670470000D80E000886 +:100EF000C4494E43522020203868401C386080CEC0 +:100F000070470000E80D0008C444454352202020EB +:100F10003868401E386080CE70470000700E0008B0 +:100F2000C14020203F687047A80D0008C2574020EC +:100F30003F887047480E0008C24340203F78704702 +:100F4000840E0008C1212020306838607768083698 +:100F5000704700002C0F0008C257212030683880ED +:100F60007768083670470000380F0008C243212018 +:100F7000306838707768083670470000100900083C +:100F8000C8544553542D4249542020203F7831689D +:100F90000F40361D70470000B80E0008C753455477 +:100FA0002D424954306839780143397077680836E2 +:100FB000704700001C070008C952455345542D4294 +:100FC0004954202030683978814339707768083671 +:100FD00070470000C80A0008C54E414D453E20201C +:100FE0003D781F200540ED192D1D2F4603218F430D +:100FF00070470000D80F0008C53E4E414D452020E7 +:1010000000B500BF3F1F3D6880200540FAD000BDFD +:1010100000B500BF3F68002F2BD03D781F20054052 +:101020003068854223D17D1C0C3E3169316075608A +:10103000B760F768FFF7B8FD002F80CE17D0776054 +:10104000361DFFF7CDFF35682D7840200540EFF3C2 +:10105000008001B4361D01BC80F3008803D0361F28 +:101060003760054F02E0361F3760012700BD3F1F84 +:10107000D0E70027083600BDFFFFFFFF002F00B5B7 +:1010800001D108360CE075682D7830682D183C6861 +:10109000641E2C40641CA400E4192746FFF7B8FF27 +:1010A00000BD000001CE30380BD40A2802DBC01F7F +:1010B0000A2806DBB84204DA01277F42361F306077 +:1010C00070470027704700003F1D7047BF00704702 +:1010D0003F1F7047361F3760042770473D0C361F8F +:1010E00037602F4600B501F013F801F011F800BD8C +:1010F00031680D0C083E3560776000B500F02EFDBC +:10110000BF1C00F02BFD00BD30680740002F01D050 +:10111000002701E001277F423068002801D4002524 +:1011200001E001256D427D402F46361D704720208D +:101130003F1D3168CF1B7F10154D3D40FC0A1548FF +:10114000044024042C43083E37607460B760124F9B +:1011500000B5FFF7D9FF1148074031680F43361F2C +:10116000B168316077600E4FFFF7CEFF0D48074042 +:1011700031680F437068002801D4002501E0012583 +:101180006D42094805403D432F46083600BD00002A +:10119000FF070000FF030000000020000020000007 +:1011A00000004000000800000000000400B5FFF748 +:1011B000BFFF0148074300BD00D000F0361F376075 +:1011C000024F00B500F0A4FF00BD000000B5000014 +:1011D000361F3760024F00B500F09AFF00BD0000D7 +:1011E00000BF0000361F71683160776000B5FFF7FF +:1011F000DDFF306837600746FFF77AFF00BD20202B +:10120000361F3760044F00B500F082FF361F37608D +:10121000024F00F07DFF00BD361F00003760000068 +:10122000361F3760074F00B500F072FF361F37607A +:10123000054F00F06DFF361F3760044F00F068FF68 +:1012400000BD000070460000401E0000076800005E +:1012500000B500F0BBFEFFF7A9FFFFF73FFF00BDA1 +:1012600000B500F0B3FE0220074080CE01D0FFF7AA +:10127000AFFFFFF7EDFF00BD00B5FFF79FFF00BD1B +:10128000361F37607046401E0768401D004700004B +:10129000361F3760009F7F1E3978C919091D032248 +:1012A0009143491C00917047080F0008C7414C4901 +:1012B000474E4544FF1C03218F437047361F37605C +:1012C0007046401E076800BDB80F0008C8434F4D68 +:1012D00050494C452C20202000B5FFF7B9FF00BD38 +:1012E000F80F0008C53E424F44592020BF687047A0 +:1012F00000B5FFF76DFFFFF761FF361F3760024F44 +:10130000FFF7A6FF00BD0000BC12000800B5FFF704 +:101310005FFFFFF753FF361F3760042700F072FEB0 +:1013200000BD202000B500F0ABFE00F07FFFFFF70E +:10133000EDFF30683760074600F0DAFE00F0ACFEE3 +:1013400000BD202000B520BC01218D43361F376031 +:101350002F4600F0F9FEFFF743FE3F1DFFF742FF67 +:1013600000BD000000B500BF00F0D8F8000000206C +:10137000800F0008C3494D4D0249012040420860DA +:101380007047000000000020CC120008813A2020A5 +:1013900000B501F03FFD01F009FD00F047FF00F04E +:1013A000DBFE01F043FFFFF767FF00BD200F0008E1 +:1013B000C73A4E4F4E414D4500B501F0F7FC00F0E5 +:1013C00089FE00F003FE00F06BFD306838600027F6 +:1013D000361D00F08DFE00F0F9FD01F027FFFFF74C +:1013E0004BFF00BD580F000885444F45533E202059 +:1013F00000B500F0B1FD00F0DFFF05444F45533E5E +:10140000361F37600C4FFFF767FF00F0A5FD00F0B7 +:10141000D3FF0161FFF7F4FE00F09EFD00F0CCFF6A +:1014200001620000FFF7FCFE00F096FD00F0C4FF33 +:101430000163000000BD000044130008E813000829 +:10144000C64352454154452000B500F02BFE00F044 +:1014500017FE30683760074600F0E8FEFFF748FFE8 +:1014600000F06EFF00F018FE00BD0000E41200085E +:10147000C73C4255494C445300B500F013FE00F000 +:10148000FFFD30683760074600F0D0FEFFF73EFFF3 +:1014900000F056FF00F000FE00BD00008C130008B5 +:1014A000C8434F4E5354414E5420202000B5FFF7FF +:1014B00039FFFFF747FF361F37607046401E076849 +:1014C00000BD0000A0140008C932434F4E535441E0 +:1014D0004E54202000B5FFF725FF00F009FEFFF76E +:1014E00031FF083E77607046401E076841683160F2 +:1014F00000BD0000C8050008C85641524941424C91 +:101500004520202000B500F08DFDFFF70BFF361FB2 +:101510003760042700F094FDFFF714FF361F376093 +:101520007046401E076800BD40140008C74255467B +:101530004645523A00B500F075FDFFF7B7FF00F0E1 +:101540007FFD00BD2C150008C455534552202020B6 +:1015500000B5FFF7E7FEFFF7F5FE361F3760704670 +:10156000401E07685F4400BD704700004815000832 +:10157000C54445464552202000B500F053FDFFF715 +:10158000D1FE361F3760042700F05AFDFFF7DAFE60 +:101590007046401E006801680122114308BC9E4647 +:1015A0000847000000B500BFFFF7B8FF04000020A7 +:1015B00000B500F05DFC3F68002F80CE05D080CEE6 +:1015C000FFF74EFE00F094FD05E03D4677680836D3 +:1015D00001200543A84700BD00B500F0BDFC00F0A8 +:1015E000EBFE1E496E76616C6964206F70657261F6 +:1015F000746F7220666F72207468697320747970DA +:1016000065000000361F3760014F00F007FF00BD86 +:10161000F3FFFFFF7146491E0868491D8E460760AB +:1016200080CE7047361F37607146491E0868491DD5 +:101630008E46076870470000C8140008C556414C24 +:101640005545202000B5FFF797FE80B480CE00F00E +:10165000E9FCFFF767FE20BC361F37602F4600F01D +:10166000E1FC306838600427361D00F0E9FCFFF724 +:1016700069FE361F37607046401E076811480568CE +:10168000104900200860002DEFF3008001B4361FE0 +:1016900037602F4601BC80F3008806D1361F0A4F01 +:1016A0000A493160FFF784FF0BE0012F06D1361F96 +:1016B000074F08493160FFF77BFF02E0FFF78CFF1F +:1016C00080CE00BD04000020240F0008241600086E +:1016D000480F000814160008380B000882544F20E9 +:1016E0000120014908607047040000206C0F0008C9 +:1016F000C55041555345202000B500BFFFF748FFB6 +:101700000800002000B500F061FC361F3760042798 +:1017100000F078FC00BD202000B500F057FC01204F +:10172000074330683760074600F02CFA00BD2020E0 +:1017300000B500F04BFC00BD0120074300B500F0F0 +:10174000D7FC00BD361F3760034F00B5FFF788FD9B +:10175000FFF7F2FF00BD00009C040008361F376051 +:10176000034F00B5FFF77CFDFFF7E6FF00BD00006B +:10177000A8040008361F3760034F00B5FFF770FD5F +:10178000FFF7C0FF00BD00009C040008361F376053 +:10179000034F00B5FFF764FDFFF7B4FF00BD000085 +:1017A000A8040008361F3760034F00B5FFF758FD47 +:1017B00000F09EFC00BD000080120008361F37605C +:1017C000024F00B5FFF788FD00BD0000600A000869 +:1017D000361F3760024F00B500F09AFC00BD0000D4 +:1017E00000BD0000361F3760044F00B5FFF738FD1D +:1017F000FFF788FFFFF79CFF00BD0000DC04000836 +:10180000361F3760044F00B5FFF72AFDFFF77AFF58 +:10181000FFF78EFF00BD0000F4040008361F37609C +:10182000044F00B5FFF71CFDFFF786FFFFF774FFBD +:1018300000BD0000C0040008361F3760044F00B52B +:10184000FFF70EFDFFF778FFFFF766FF00BD000012 +:10185000CC04000800B500BFFFF760FE0C000020BC +:1018600005480568361F37602F4600B5FFF760FF53 +:1018700001490F6080CE00BD0C000020361F37608C +:10188000034F00B5FFF7ECFCFFF73CFF00BD000085 +:10189000B404000800B5FFF76DFF306837600746F5 +:1018A000FFF73AFF00BD202000B500BF361F3760AC +:1018B000374600F0CDFA3F6830688742EFF300808A +:1018C00001B47768083601BC80F3008802D0FFF7C6 +:1018D00023FFEBE700BD202000B5FFF76FFFFFF708 +:1018E000E3FF02490F6080CE00BD00000C00002025 +:1018F00000B5FFF763FF06480568361F37602F46BF +:10190000FFF720FFFFF7D0FF01490F6080CE00BD39 +:101910000C00002000B5FFF739FF00BDDC16000801 +:10192000C244492072B670477C0B0008C24549206A +:1019300062B67047F00E0008C25B4920EFF31080DA +:1019400072B601B4704700003C160008C2495D2021 +:1019500001BC80F3108870479C0F0008C7534554A2 +:101960004D41534B3D683068C4432C40706804437C +:101970003C60B7680C367047B0090008C7494E494B +:10198000542D494F00B500BF3D68002D04D03D687F +:101990007C682C600837F7E780CE00BD07480568F3 +:1019A0008020054000B508D0054D0648686006480F +:1019B0006860802029698143296100BD10200240B0 +:1019C0000020024023016745AB89EFCD083E134953 +:1019D00031607760124F00B53068451E002DEFF37F +:1019E000008001B4356001BC80F3008804D0FD683C +:1019F00001200540002DEFD1FD6834242C40FC600F +:101A000030680028EFF3008001B42F46361D01BC7A +:101A100080F3008801D10348074300BD0000100097 +:101A2000002002400000008000B5FFF7B7FF084922 +:101A300001200D6805430D603068388077680836EE +:101A4000FFF7C4FF024901200D6885430D6000BD0A +:101A5000102002400B483F1A00B5FFF79FFF0A4DC8 +:101A600002202969014329616F61402029690143EE +:101A7000296180CEFFF7AAFF044902200D68854343 +:101A80000D6000BD00000008002002401020024050 +:101A900000B5FFF7C9FF80CE00BD20203D7830683B +:101AA000854200B502D17768083600BD3D46012168 +:101AB0008D4301200740EFF3008001B42F4601BCA5 +:101AC00080F3008806D031680D023C782C433760E3 +:101AD000274605E07D782D0231680D4337602F469B +:101AE000306837600746FFF7D3FF00BD074D316808 +:101AF0000D40083E3560776000B5FFF7C9FF3168DB +:101B00000D0CBF1C3560FFF7C3FF00BDFFFF0000D9 +:101B1000083E044931607760034F00B5FEF788FC4A +:101B200000BD000000000008000010082019000897 +:101B3000C3432146361F376000B5FFF7E9FF002F8A +:101B400080CE02D0FFF7AAFF03E0306838707768D4 +:101B5000083600BD5C190008C3572146361F3760A0 +:101B600000B5FFF7D5FF002F80CE02D0FFF790FF22 +:101B700003E0306838807768083600BD70140008CC +:101B8000C2214620361F376000B5FFF7C1FF002F86 +:101B900080CE02D0FFF7AAFF03E030683860776894 +:101BA000083600BD38190008C7464C455241534518 +:101BB00030683F1830683760074600B5FEF79AFC7A +:101BC0000B1C0008009D01980544361F37602F4606 +:101BD000FFF79EFF002F80CE09D0009D019805449D +:101BE000361F37602F46FFF735FF084F07E0009D8F +:101BF0000198054406482860361F3760042700987E +:101C0000C019009080CEDDD703B000BD00080000F1 +:101C1000FFFFFFFF083EB1683160776000B5FFF756 +:101C2000C7FF31687D1811480468083E346077604A +:101C30002F46FFF7A7FF30683F1830683760074628 +:101C4000FEF758FC691C00083D68009C019804449C +:101C5000083E356077602746FFF794FF3F1D0098E8 +:101C6000001D0090F0D703B080CE00BD2802000810 +:101C700000B500BFFFF752FC100000202C1900082F +:101C8000C453454C4620202000B500BFFFF765FC3B +:101C900000000000F0160008C253302000B500BF5D +:101CA000FFF75BFC18000000A80E0008C2523020AD +:101CB00000B500BFFFF751FC1C000000801C0008AD +:101CC000C42354494220202000B500BFFFF745FC43 +:101CD000200000004C190008C4275449422020204D +:101CE00000B500BFFFF739FC24000000B013000866 +:101CF000C33E494E00B500BFFFF72FFC280000008F +:101D00007C190008C8584F4E2F584F4646202020B7 +:101D100000B500BFFFF721FC2C0000007413000881 +:101D2000C74543484F494E4700B500BFFFF715FC74 +:101D300030000000440F0008C34F555400B500BFE9 +:101D4000FFF70BFC34000000301B0008C442415375 +:101D50004520202000B500BFFFF7FFFB3800000042 +:101D6000D81C0008C3484C4400B500BFFFF7F5FB82 +:101D70003C000000EC080008C748414E444C455266 +:101D800000B500BFFFF7E9FB40000000C01C0008E1 +:101D9000C344504C00B500BFFFF7DFFB4400000018 +:101DA000AC1C0008C54F50564543202000B500BF6D +:101DB000FFF7D3FB48000000F8140008C54950564F +:101DC0004543202000B500BFFFF7C7FB4C000000D3 +:101DD00000B500BFFFF7C1FB50000000801B0008EA +:101DE000C350414400B500BFFFF7B7FB98000000A7 +:101DF000A41D0008C2424C2000B500BFFFF75BFBEA +:101E000020000000641D0008C546454E43452020C3 +:101E100000B500BFFFF782FB140000204C1D000836 +:101E2000C244502000B500BFFFF778FB1800002027 +:101E3000F41D0008C252502000B500BFFFF76EFB32 +:101E40001C00002000B500BFFFF768FB2000002049 +:101E500000B500BFFFF762FB24000020081E000849 +:101E6000C358445000B500BFFFF758FB28000020BE +:101E700000B500BFFFF752FB2C00002000B500BFEB +:101E8000FFF74CFB3000002000B500BFFFF746FB1A +:101E900034000020041D0008C44C4153542020206D +:101EA00000B500BFFFF73AFB3C00002000B500BFC3 +:101EB000FFF76EFB4000002000B500BF00F05DFFA3 +:101EC000C41E00084C00002000B500BFFFF726FB31 +:101ED00090000020BC1D0008C34B45595D46ED6CC9 +:101EE0002D6800B501200543A84700BD781D0008F6 +:101EF000C44B45593F2020205D46ED6C6D6800B510 +:101F000001200543A84700BD70150008C4454D4990 +:101F1000542020205D46696B491C69635D46AD6CA9 +:101F2000AD6800B501200543A84700BDAC1200080C +:101F3000C4545950452020205D46696BC919696316 +:101F40005D46AD6CED6800B501200543A84700BDB6 +:101F5000981C0008C24352205D46002068635D461D +:101F6000AD6C2D6900B501200543A84700BD0000F8 +:101F7000301F0008C553504143452020361F3760AD +:101F8000202700B5FFF7C6FF00BD00000C1F0008AA +:101F9000C653504143455320002F00DC0027361F15 +:101FA0003760002700B500BFFEF7A4FABF1F000886 +:101FB000FFF7E4FF0098401C0090F9D703B000BD84 +:101FC000201D0008C44845524520202003480568CC +:101FD0002D68361F37602F4670470000280000200C +:101FE000381D0008C34F5247024805682F6080CE55 +:101FF0007047000028000020201E0008C5414C4CFE +:102000004F542020034805682968C919296080CEEB +:102010007047000028000020901D0008C552484568 +:102020005245202002480568361F37602F4670470A +:102030001C000020741F0008C652414C4C4F542015 +:1020400002490868C019086080CE70471C00002053 +:10205000541F0008C3524F4D0148024908607047A1 +:10206000180000202800002054200008C352414DD1 +:1020700001480249086070471C0000202800002029 +:1020800004480568361F37602F4600B5FFF7E4FFA8 +:1020900000BD00002800002001490F6080CE70477D +:1020A00028000020064805680648854201D0002522 +:1020B00001E001256D42361F37602F467047000052 +:1020C0002800002018000020FC1F0008C5414C49D2 +:1020D000474E202000B5FFF779FFFF1C03218F43F7 +:1020E000FFF782FF00BD0000A81B0008C12C2020C4 +:1020F00000B5FFF76BFFFFF745FD361F376004277C +:10210000FFF780FF00BD0000901F0008C2572C2081 +:1021100000B5FFF75BFFFFF721FD361F3760022791 +:10212000FFF770FF00BD00006C200008C2432C20A8 +:1021300000B5FFF74BFFFFF7FDFC361F37600127A7 +:10214000FFF760FF00BD202002480568361F37609A +:102150002F4670473C0000200448056804490D6084 +:102160002D1F2D6801490D60704700003C000020C4 +:10217000900000200248056802490D607047000089 +:10218000900000203C000020581B0008C446494E27 +:10219000442020207D1C3C78083E3560776027462F +:1021A00000B5FEF731FE3D78002D26D0154D2C46AA +:1021B0000834083E346077602F4600BFFEF78EF982 +:1021C000FB2100087D1C3C78009B019803441B68A0 +:1021D0000C3E34607560B7601F46FEF74FFF002F5E +:1021E00000D180CE04D003B031687160361D00BDCF +:1021F0000098001D0090E5D703B0361F3760002718 +:1022000000BD000034000020E01D0008C52E4E4136 +:102210004D4520207D1C3F781F200740361F35602C +:1022200000B5FFF789FEFFF7A9FE00BD361F376036 +:10223000202700B500F0A0FC7D1C3F780C3E3560E7 +:102240007760B560FEF7E0FD3A4805680C3E376000 +:10225000F1687160B7602F46FEF710FF002F80CE47 +:102260000ED0FEF7CDFEFFF777FEFFF7D3FF00F0AD +:10227000A3F80D6973207265646566696E656420F4 +:10228000FFF728FF35682D78ED192A480468236880 +:102290005B1E1D40AD00241D64192568083E346096 +:1022A00077602F46FFF724FFFFF790FE31680F603D +:1022B00077680836FFF78AFE1F490F607068471E6F +:1022C00035686D1C1D480468002CEFF3008001B4D4 +:1022D00077602F46361D01BC80F3008803D0361F7F +:1022E0003760802702E0361F3760C02771680878A2 +:1022F0003843087011490020086070683168471839 +:10230000706877600746361DFEF7F4F82D23000845 +:10231000009D019805442D88361F37602F46FFF732 +:10232000F7FE0098801C0090F2D703B0FFF7D2FEB2 +:1023300000BD0000300000203C0000200000002014 +:10234000002F80CE00B506D0074805682D1D361F2A +:1023500037602F4604E005480568361F37602F4672 +:10236000FFF7C6FE00BD0000180000201C00002082 +:1023700000B5FEF78DFF00BD00B5FEF789FF7D1C9F +:102380003F78361F356000BD00B5FEF781FF30682D +:102390000028EFF3008001B4361D01BC80F30088F3 +:1023A00005D05D462F65034F00F038F800E080CE81 +:1023B00000BD0000FEFFFFFF00B5FEF769FF7D1CBA +:1023C0003F78361F3560FFF7B7FD00BD38200008A5 +:1023D000C543415443482020361F3760374600B577 +:1023E00080B44F4680B45F463F6C80B46F465D4614 +:1023F0002F6435687768083601200543A84720BC5C +:102400005C46256401B001B0361F3760002700BD6F +:102410000C210008C55448524F572020002F00B50A +:1024200001D180CE00BD5D462D6CAD4620BC5C4622 +:10243000256420BCA94620BC80B42F463E1C80CE1B +:1024400080BC00BD2C210008C63F5448524F572085 +:1024500030680028EFF3008001B4361D01BC80F322 +:10246000008800B502D0FFF7D9FF00E080CE00BDA4 +:102470001C2000088641424F5254222000B500F033 +:10248000B5FC361F3760034FFEF726FF00F01AFF3A +:1024900000BD000088230008601E0008C34845589E +:1024A0005D461020A86370479C240008C74445433C +:1024B000494D414C5D460A20A8637047C41F00087F +:1024C000C4484F4C442020205D460448E96B09185D +:1024D000E9635D46ED6B2F7080CE7047FFFFFFFF15 +:1024E000341E0008C12320205D46AD6B361F3760C7 +:1024F0002F4600B5FEF7E6F970680928EFF3008073 +:1025000001B43D46776831687160356001BC80F385 +:10251000008800DDFF1D3037FFF7D6FF00BD00004B +:1025200048240008C223532000B500BFFFF7DCFF9A +:1025300035683D43002DF9D100BD0000D81E0008CC +:10254000C23C23205D4698355C46E5637047000039 +:1025500024250008C2233E205F46FF6B5D46983568 +:10256000ED1B37602F46704774240008C3442E5279 +:1025700000B580B437687068316871603060FEF70C +:102580006FF8FFF7DFFFFFF7CFFF70680028EFF36A +:10259000008001B431687160361D01BC80F3008891 +:1025A00004D5361F37602D27FFF78EFFFFF7D4FFC6 +:1025B00020BCED1B361F37602F46FFF7EDFCFFF701 +:1025C000BBFC00BDCC200008C2442E20361F376063 +:1025D000002700B5FFF7CCFFFFF7D0FC00BD0000DF +:1025E000F01E0008C12E2020FD17361F37602F4631 +:1025F00000B5FFF7EBFF00BD6C250008C2552E208B +:10260000361F3760002700B5FFF7E0FF00BD000070 +:10261000981E0008C22E522000B580B43168CF1732 +:1026200020BC361F37602F46FFF7A2FF00BD000019 +:10263000F01C0008C62B4449474954205D46AD6B49 +:10264000361F7168316077602F4600B5FEF72EF8AF +:102650005F46BF6B3568B16831607168B1607560A5 +:10266000FEF724F8FDF7C2FF5D466D6C6D1C03D0CC +:102670005D46696C491C696400BD00005425000872 +:10268000C73E4E554D424552083E376077600027A1 +:1026900000B500BFFDF72EFFF926000835682D783C +:1026A000361F37602F46FEF7A1FB5D46AD6B361F28 +:1026B00037602F46FEF7F6FC002F01D0002701E01F +:1026C00001277F42002F80CE01D002B000BD3168CB +:1026D000706801B402B40836FFF7B0FF20BC10BC2C +:1026E0000123ED1A1B19083E336077602F460098CE +:1026F000401C0090D2D703B000BD20205D462F487B +:10270000686435682D782D2D01D0002501E0012564 +:102710006D4200B520B4002D04D001257F1B306828 +:102720002D183560012F03DA01B00027361D00BDDA +:10273000083EB1683160002171600021B16000BFC6 +:10274000FFF7A2FF002F22D001257F1B30682D1834 +:10275000356000BF3068451E2D783A2DEFF30080BC +:1027600001B4361F37602F4601BC80F3008801D1C9 +:1027700080CE0BE02E2F04D15F460020786480CEFF +:1027800004E001B00027103600BD80CED8E780BC41 +:10279000002FEFF3008001B47768083601BC80F3A6 +:1027A000008801D0FDF73AFF5D466D6C002D01D524 +:1027B000012702E0361F3760022700BDFFFFFFFF41 +:1027C00000B500BF35682D78242DEFF3008001B4EB +:1027D000361F37602F4601BC80F300880AD10127DD +:1027E0003168CD1B70683F1877602F46361DFFF7A4 +:1027F00057FE1BE0232F0AD101273168CD1B7068DB +:102800003F1877602F46361DFFF754FE0EE0252F48 +:102810000BD101273168CD1B70683F185C46022040 +:10282000A06377602F46361D00E080CE00BD00001B +:1028300034260008C8494E54454745523F202020C1 +:102840007D1C3F78002FEFF3008001B4361F356008 +:1028500001BC80F3008800B510D0083EB16831603B +:102860007760FEF7D1FA5D46AD6B20B4FFF7A8FFA5 +:10287000FFF744FF20BC5C46A56301E00027361D3E +:1028800000BD000080260008C74E554D4245523F0E +:1028900000B500BFFEF77CFE940000205D466D6B26 +:1028A000361F37602F46002F00D180CE00B50FD0E5 +:1028B000361F37600827FFF72DFBFFF75FFB361F3A +:1028C00037600827FFF726FB7F1E5D466F6380CECB +:1028D00000BD2020002F01D1002501E001256D421F +:1028E0005C46246B002C01D1002401E001246442E9 +:1028F0002C4000B506D0FFF7D1FF7F1E361F376092 +:10290000024F02E0361F3760002700BDFFFFFFFFC8 +:10291000306838705F463F6B002F80CE00B502D024 +:10292000FFF7F8FA00E080CE00BD00001426000892 +:10293000822E2220361F3760034F00B5FEF7CCFCF5 +:1029400000F0C0FC00BD0000B8230008C825000846 +:10295000C2242E207D1C3F78361F356000B5FFF75E +:10296000EBFA00BDFC250008C64143434550542006 +:10297000002F00B501D1361D00BD5D46ED6A002D6A +:1029800004D0361F37601127FFF7C4FA30683F18AC +:10299000361F376077680021716000BFFDF7AAFD20 +:1029A0003F2A0008FFF79AFA082F03D180CEFFF7DD +:1029B00091FF3EE0092F0CD1009F01980744361F7C +:1029C00020213160FFF7A4FF7F1C361F37600127ED +:1029D0002FE00A2F01D100272BE00D2F0AD1009FF5 +:1029E00001980744361F20213160FFF791FF02B0A4 +:1029F00000BD1EE00C2F0AD1009F01980744361F2E +:102A000020213160FFF784FF02B000BD11E07F2F6D +:102A100003D180CEFFF75EFF0BE0009D01980544D7 +:102A2000361F37602F46FFF773FF7F1C361F376056 +:102A300001270098C019009080CEB3D703B05D463F +:102A4000ED6A002D04D0361F37601327FFF762FAB6 +:102A500000BD000000B500BFFEF760FD980000203B +:102A600002480568361F37602F46704798000020DF +:102A70005D466D6A5C46246A083E3560776027468D +:102A80007047000050290008C55155455259202073 +:102A90000020094908605D466D6A083E3560776030 +:102AA000FF2700B5FFF764FF5D462F625F460020F9 +:102AB000B86280CE00BD0000980000208828000881 +:102AC000C55041525345202000B580B480CEFFF759 +:102AD000CFFF5D46AD6A7F1B30682D1810BC083EE5 +:102AE00037607560B5602746FEF74CF880B43168F2 +:102AF00070680F1A20BC002D01D1002501E00125CE +:102B00006D427D1B5C46A16A4919A162361D00BD5C +:102B100000B580B480CEFFF7ABFF5D46AD6A7C1B8D +:102B200030682D18009B083E34607560B7601F4602 +:102B3000FEF714F820BC083E3760B16871602F467C +:102B4000FEF720F880B4316870680F1A20BC002DA1 +:102B500001D1002401E0012464426419B1680C1B16 +:102B60005D46AC627168B160083600BDAC240008F7 +:102B7000C4574F524420202000B5FFF7C9FF064834 +:102B80000568361F37602F46FEF762F90248056870 +:102B9000361F37602F4600BD1C00002000B5FFF730 +:102BA000ABF9002F00D100BDFFF798F9202F80CEA0 +:102BB00008D180CEFFF792F9202F01D1002701E044 +:102BC00001277F4200BD2020002F00B501D0014821 +:102BD0003F1A00BD000000085D46983504480468AF +:102BE0002468A4006419083E346077602F4670475B +:102BF00034000020083E002131607760002700B5D6 +:102C0000FFF7EAFFFDF76AFC352C0008009D0198EC +:102C100005442D68AF4208D2009F01980744009DEB +:102C2000019805442D6837602F460098001D0090DC +:102C3000ECD703B0002F01D001483F1800BD80F34E +:102C400000000008104805682D1D361F37602F460C +:102C500000B5FFF7C1FF00BFFDF740FC852C000861 +:102C60003D68361F37602F46FFF7AEFF009D019885 +:102C700005442F6037683F1D361D0098001D0090E9 +:102C8000EED703B080CE00BD34000020C024000881 +:102C9000C5574F524453202000B5FFF75DF9FFF7A9 +:102CA0008BFB06574F52445320000000FFF754F9A6 +:102CB000FFF7C8FFFFF79EFF361F3760FFF76EFF75 +:102CC000002F01D0002701E001277F4231680F402B +:102CD000EFF3008001B47768083601BC80F3008808 +:102CE00012D05D466D6B402D01DDFFF735F9361FC3 +:102CF0003760FFF78FFA3F1F3F68FFF765FF3168C6 +:102D00000F6077680836D5E77768083600BD0000A1 +:102D100034280008C44D4F564520202000B580B40B +:102D2000316870680F1A009DBD4280CE06D920BC64 +:102D3000361F37602F46FEF73BF805E020BC361FF4 +:102D400037602F46FEF716F800BD00001424000877 +:102D5000C5444550544820205D46AD69361F376054 +:102D60002F46361F376037463168CF1B3F1F37600D +:102D7000042700B5FDF774FD00BD7046401E0268D3 +:102D80001268014B1A6000BD340000203068874291 +:102D900001D1002701E001277F423760024F00B5D3 +:102DA000FFF756FB00BD0000EAFFFFFF361F37604C +:102DB000374602490F6080CE704700002400002093 +:102DC000361F3760374607480568BD4201D10027E6 +:102DD00001E001277F42361F3760034F00B5FFF740 +:102DE00037FB00BD24000020EAFFFFFF074805680D +:102DF000002D01D0002501E001256D42083E35601F +:102E00007760034F00B5FFF723FB00BD2C000020C7 +:102E1000F2FFFFFF04480568083E35607760034F06 +:102E200000B5FFF715FB00BD2C0000206DFEFFFF75 +:102E3000882A000882444F2000B5FFF7D7FFFEF72D +:102E4000D1FC361F3760032700BD0000E41F0008D7 +:102E5000833F444F00B5FFF7C9FFFEF7D1FC361F93 +:102E60003760032700BD000030290008844C4F4F15 +:102E70005020202000B5FFF7B9FF361F3760032729 +:102E8000FFF784FFFEF7CAFC00BD00006C2E0008AF +:102E9000852B4C4F4F50202000B5FFF7A7FF361F62 +:102EA00037600327FFF772FFFEF7C6FC00BD000086 +:102EB0006829000885424547494E202000B5FFF7A4 +:102EC00095FFFEF735FC00BD342E000885414741D3 +:102ED000494E202000B5FFF789FFFEF733FC00BD07 +:102EE0008C21000885554E54494C202000B5FFF731 +:102EF0007DFFFEF733FC00BD902C00088557484944 +:102F00004C45202000B5FFF771FFFEF73FFC30680D +:102F10003760074600BD0000D023000886524550A8 +:102F20004541542000B5FFF761FFFEF70BFCFEF7AB +:102F3000F3FB00BD702B00088249462000B5FFF767 +:102F400055FFFEF723FC00BD1C2F000884544845A4 +:102F50004E20202000B5FFF749FFFEF7DDFB00BD46 +:102F6000502D000884454C534520202000B5FFF724 +:102F70003DFFFEF7FFFB306837600746FEF7CCFBEE +:102F800000BD0000B42E000884434153452020209A +:102F900000B5FFF72BFF06480568361F37602F4640 +:102FA000FEF75EFCFFF702FF361F3760042700BD07 +:102FB00024000020142D0008824F4620361F376061 +:102FC000042700B5FFF7E2FEFEF758FC361F376016 +:102FD000052700BD502E0008833F4F46361F37603F +:102FE000042700B5FFF7D2FEFEF794FC361F3760CA +:102FF000052700BDE42E000885454E444F4620209D +:10300000361F3760052700B5FFF7C0FEFEF742FC0C +:10301000361F3760042700BDFC2E000887454E444C +:1030200043415345361F3760042700B5FFF7AEFE16 +:10303000FEF752FC01490F6080CE00BD2400002045 +:10304000CC2E0008884E455854434153452020203B +:10305000361F3760042700B5FFF798FEFEF748FCDF +:1030600001490F6080CE00BD24000020642F0008BD +:10307000875245435552534505480568361F37600A +:103080002F4600B5FDF7ACFFFEF726F900BD0000A6 +:103090003C000020361F376037465D46AD69BD42B3 +:1030A00001D3002701E001277F42361F3760024F1E +:1030B00000B5FFF7CDF900BDFCFFFFFF002F01D0E9 +:1030C000002701E001277F42361F3760024F00B51D +:1030D000FFF7BEF900BD0000F3FFFFFF4C2F000813 +:1030E00088504F5354504F4E45202020361F376094 +:1030F000202700B5FFF740FDFFF74CF8361F37607B +:10310000FFF7DCFF0120C74280CE04D100F060F859 +:10311000361F3760014FFEF7DFF800BDD8120008F8 +:10312000C02A00088253222010480568002D00B5EF +:1031300007D0361F37600E4FFEF7CEF800F0C2F80A +:1031400013E0361F37602227FFF7BEFC5D46983537 +:10315000361F37602F46FDF77BFE5D4698356C1CA9 +:103160002D78083E346077602F4600BD2C0000208B +:103170007823000824310008824322200F48056884 +:10318000002D00B507D0361F37600D4FFEF7A4F8AD +:1031900000F098F810E0361F37602227FFF794FC04 +:1031A0005D469835361F37602F46FDF751FE5D4668 +:1031B0009835361F37602F4600BD00002C000020D8 +:1031C000702300080C220008874C49544552414C9A +:1031D00000B5FEF7E7FA00BD882F0008C443484158 +:1031E00052202020361F3760202700B5FFF7C4FC8F +:1031F0007F7800BDB82F0008865B434841525D20B0 +:1032000000B5FFF7F3FDFFF7EDFFFFF7E1FF00BDAE +:103210001C300008815B20200149002008607047B5 +:103220002C00002040250008C15D2020024901201B +:1032300040420860704700002C000020E030000889 +:10324000C1272020361F3760202700B5FFF794FCE8 +:10325000FEF7A0FFFFF732FF00BD00002832000894 +:10326000835B275D00B5FFF7EDFFFFF7B1FF00BD02 +:10327000E4240008895B434F4D50494C455D2020B4 +:1032800000B5FFF7DFFFFEF727F800BD703000083C +:1032900081282020361F3760292700B5FFF76CFCF6 +:1032A00080CE00BDEC200008815C2020361F3760F6 +:1032B000002700B5FFF760FC80CE00BD7432000827 +:1032C000C2222C20361F3760222700B5FFF754FC9E +:1032D0003D786D1CED19361F356000BFFDF70AF90A +:1032E00001330008009D019805442D88361F376082 +:1032F0002F46FEF70DFF0098801C0090F2D703B018 +:10330000FEF7E8FE00BD202000B520BCE41D03212F +:103310008C4310B42D682F6080CE00BD382F00087C +:103320008249532000B5FFF78DFFBF680848056844 +:10333000002D07D0361F3760064FFDF7CDFFFEF793 +:10334000D7FE03E0306838607768083600BD0000BB +:103350002C000020083300089032000884455849AA +:103360005420202000B5FFF741FDFEF731FA00BDE3 +:1033700014320008813B202000B5FFF737FDFFF72E +:103380001FFDFEF725FAFEF7F5FEFFF745FF00BD2E +:10339000D82F0008C9494E54455250524554202058 +:1033A00000B500BFFFF776FE361F37602027FFF716 +:1033B000E3FB3D78002D3FD0FEF7ECFE002F00D15F +:1033C00080CE13D0002F01D4002701E001277F42D7 +:1033D0001A4805683D4080CE02D0FDF77DFF04E02D +:1033E0003D4680CE01200543A84724E0FFF750FA70 +:1033F000002F01D0361F3760FFF760FE0F480568C9 +:10340000002D17D0012F03D180CEFEF7CBF910E0AD +:10341000022F08D1776831687160361DFEF7C2F956 +:10342000FEF7C0F905E0361F3760054FFEF7F6FFDF +:1034300080CE00E080CEB5E780CE00BD2C0000201D +:10344000F3FFFFFFA8320008C84556414C554154D0 +:10345000452020205D466D6A00B520B45D462D6A8A +:1034600020B45D46AD6ABD4201DB002701E00127C3 +:103470007F421048056820B45D462F625F46306881 +:1034800078620D480B4908605F460020B8620B4F18 +:10349000361DFEF7A1FF20BC06490D6020BC5C462E +:1034A000A56220BC5C46256220BC5C466562FEF7D6 +:1034B000B5FF00BD98000020FFFFFFFFA03300080C +:1034C00000B500BF002F01D180CE29E00120C74206 +:1034D00001D180CE24E00220C74208D15F463F6D73 +:1034E0007D1C3F78361F3560FEF726FD18E00D2065 +:1034F000C7420AD180CEFEF75FFF0C697320756E5C +:10350000646566696E6564000AE0FEF755FF0B545A +:1035100068726F7720636F6465200000FFF764F8BE +:1035200000BD000078310008C451554954202020C6 +:103530005D460020E8625D4601204042286300208D +:103540002E49086000B5FFF767FE00BF5D46ED69D4 +:10355000AD465D462D6B002D01D0FEF7FDFCFFF75B +:1035600097FA361F3760264FFEF736FF002F24D11B +:1035700024480768002F01D0002701E001277F427F +:103580005D462D6B002D01D1002501E001256D4226 +:103590003D4080CE10D0FEF70FFF03206F6B000080 +:1035A000FFF7DAFB002F00D180CE05D0FEF704FF35 +:1035B000012D0000FFF718F81EE0FFF781FF5D46C0 +:1035C000AD69361F37602F463E1C80CEFFF724FEC4 +:1035D000FEF7C2FCFFF74CFAFEF7AEFCFEF7BCFCB0 +:1035E0005D46AD6A6D1E361F37602F46FEF7D4FC70 +:1035F000FEF7E2FE015E0000A8E700BD9800002093 +:10360000A03300082C000020A44900088005000811 +:1036100074330008C9434F4C44434841494E20206D +:1036200000B500BFFDF77AFF9C000020DC310008E8 +:10363000C64154434F4C442000B5FEF74BFDFEF706 +:10364000C5FC054805682F6003490F600027FEF799 +:103650004FFDFEF74DFD00BD9C000020C03200086C +:10366000CD57414C4B434F4C44434841494E202099 +:10367000361F3760054F00B5002F05D07D6801204B +:103680000543A8473F68F7E780CE00BD083600082D +:10369000361F3760004F01E0247B000800B500BFF3 +:1036A0003D68002D0FD03D460C353C687B680C3ED4 +:1036B00033607560B7602746FDF75CFB3D68ED1928 +:1036C0000C352F46ECE75F461837083E3760144943 +:1036D00071601027FDF74EFB5D46AD69361F376000 +:1036E0002F463E1C80CE5D460E4868625D46002037 +:1036F00028640C3E0C4931600C497160B76010279A +:10370000FDF738FB00200A490860FEF7D3FE094D9B +:1037100009490D6009490D6000200949086000BD94 +:10372000F8010008203C00201400002018020008C6 +:10373000980000204C0000203400002030000020C1 +:1037400038000020C8310008C52E465245452020CB +:1037500000B5FEF701FC1548056815494D1B361FDD +:1037600037602F46FEF74CFFFEF726FE1062797495 +:103770006573206672656520466C617368000000A1 +:10378000FEF7EAFB04F0ACF90A4805687F1BFEF778 +:1037900037FFFEF711FE0E6279746573206672655D +:1037A000652052414D00000000BD000018000020BF +:1037B00000F001081C0000205C330008C6434F4D98 +:1037C0004D495420002F00B500D1074F0120074379 +:1037D00006490F60083E7C27054931600549716044 +:1037E000FEF718FA00BD0000800500084000002028 +:1037F00000F8010814000020F82F0008C5454D50BE +:1038000054592020083E0849316077607C2700B574 +:10381000FEF7CEF9083E054931607760044FFEF7A8 +:10382000C7F900F081F800BD00F8010800C00008E9 +:1038300000F0000030360008C4434F4C44202020E4 +:1038400000B5FFF725FF01F0D7FC01F0DDF95D467B +:10385000AF6480CE01F0D8F95D46EF6480CE01F010 +:103860000FFF0C3E2749316027497160B7607C2704 +:10387000FEF7D0F9254805680120C54201D1002492 +:1038800001E001246442002D01D1002501E0012561 +:103890006D4225400ED01E4805681E480468AC42A3 +:1038A00008D10C3E1849316018497160B7607C2717 +:1038B000FDF760FAFEF70EFC174805682D68012039 +:1038C000C54201D0FFF79EFFFFF7D2FEFEF744FB93 +:1038D00002F0E0F9FFF73CFFFEF7E8FAFEF73CFBE9 +:1038E000FEF73AFBFEF768FD0420206F6B00000036 +:1038F0005D46AD69361F37602F463E1C80CEFFF710 +:1039000017FE00BD00F001081400002000F80108B7 +:10391000280200087CF80108180000204032000846 +:10392000C65245424F4F542072B6054901200D68DA +:1039300005430D6003480449086000B5FEE700BD7B +:1039400024100240CCCC000000300040F0B54046CE +:10395000494652465B460FB46946F0398B460A1C0D +:10396000F03A95460E46083E341F8C616846C861A1 +:10397000FCF706FE6946F031F0318D460FBC8046FB +:10398000894692469B46F0BD902E0008C7494E548A +:103990003E4249541F253D400124AC407F09BF00F1 +:1039A000361F346070470000FC370008C5454E499B +:1039B0004E5420200F2F00B50BD9103FFFF7EAFF20 +:1039C00005483F1805483F18306838607768083662 +:1039D00000BD80CE00BD000000E000E0000100005E +:1039E000AC390008C6444953494E54200F2F00B546 +:1039F0000BD9103FFFF7CEFF05483F1805483F1889 +:103A0000306838607768083600BD80CE00BD0000A1 +:103A100000E000E080010000BC370008C6534554B8 +:103A2000505249200F2F00B509D9103F05483F18C3 +:103A300005483F18306838707768083600BD80CE7A +:103A400000BD000000E000E0000400002039000894 +:103A5000C55357494E5420200F2F00B50BD9103FA6 +:103A6000FFF798FF05483F1805483F183068386051 +:103A70007768083600BD80CE00BD000000E000E0A1 +:103A800000020000503A0008C92F415050465241F0 +:103A90004D45202000B500BFFDF70DFD20000000C2 +:103AA00020330008C64558412E52302000B500BFD3 +:103AB000FFF7FFFF00000000A43A0008C645584188 +:103AC0002E52312000B500BFFFF7FFFF04000000B9 +:103AD000BC3A0008C64558412E52322000B500BFFE +:103AE000FFF7FFFF08000000D43A0008C645584120 +:103AF0002E52332000B500BFFFF7FFFF0C0000007F +:103B000014360008C74558412E52313200B500BF67 +:103B1000FFF7FFFF10000000043B0008C7455841B5 +:103B20002E52313400B500BFFFF7FFFF1400000034 +:103B3000EC3A0008C64558412E50432000B500BF5E +:103B4000FFF7FFFF180000001C3B0008C745584165 +:103B50002E50535200B500BFFFF7FFFF1C000000BE +:103B60001C3A0008CA2F4D41494E4652414D45204E +:103B700000B500BFFDF79FFC24000000343B0008A7 +:103B8000C645584D2E52342000B500BFFFF7FFFF49 +:103B900000000000803B0008C645584D2E523520DD +:103BA00000B500BFFFF7FFFF04000000983B0008CE +:103BB000C645584D2E52362000B500BFFFF7FFFF17 +:103BC00008000000B03B0008C645584D2E52372073 +:103BD00000B500BFFFF7FFFF0C000000C83B000866 +:103BE000C645584D2E52382000B500BFFFF7FFFFE5 +:103BF00010000000E03B0008C645584D2E52392009 +:103C000000B500BFFFF7FFFF140000004C3B0008A9 +:103C1000C745584D2E52313000B500BFFFF7FFFFAA +:103C200018000000103C0008C745584D2E52313195 +:103C300000B500BFFFF7FFFF1C000000E4250008EF +:103C4000CA45584D2E4558435245542000B500BF33 +:103C5000FFF7FFFF2000000044300008C72F455841 +:103C60004441544100B500BFFDF725FC140000009D +:103C7000403C0008CA4558442E523133464C54202B +:103C800000B500BFFFF7FFFF000000008C390008FF +:103C9000CB4558442E5231334D41494E00B500BFFB +:103CA000FFF7FFFF0400000048370008CE455844E6 +:103CB0002E52313350524F434553532000B500BF6D +:103CC000FFF7FFFF08000000F8310008CC4558441A +:103CD0002E523133535441544520202000B500BFAB +:103CE000FFF7FFFF0C000000743C0008CA45584471 +:103CF0002E4C524D41494E2000B500BFFFF7FFFF4B +:103D000010000000F83B0008C645584441544120CB +:103D100000B500BFFDF7CFFB4C360020164BEFF38C +:103D200008805860EFF30981996072461A61042097 +:103D3000024201D1586800E0986818604046494640 +:103D400052465B460FB5F0B40B4B6846D860F8B0EE +:103D50006846F03083460646083E341F8461694653 +:103D6000C161FCF70DFC78B0F0BC0FBC8046894601 +:103D700092469B4600BD00004C360020AC3C00083B +:103D8000C52E4954454D20203D68361F37602F46CB +:103D900000B501F0BFFAFEF7F1F83F1D00BD0000CD +:103DA00060360008C62E4954454D5320361F3760F3 +:103DB000002700B5FCF79EFBCB3D0008FFF7E4FFB2 +:103DC0000098401C0090F9D703B000BD643B000888 +:103DD000C84150504954454D5320202002480568A1 +:103DE000361F37602F4670474C3600205C3C000879 +:103DF000C94D41494E4954454D532020024805685C +:103E0000361F37602F467047583600203838000874 +:103E1000C64150505253502000B5FFF7DFFF203706 +:103E200000BD0000103E0008C641505050535020C5 +:103E300000B5FFF7E3FFBF6800BD0000F03D0008DC +:103E4000C54150505550202000B5FFF7D7FFFF69FE +:103E500000BD0000283E0008C6415050544F53207A +:103E600000B5FFF7CBFFFF6800BD0000403E000833 +:103E7000C54150505043202000B5FFF7AFFFBF6948 +:103E800000BD0000583E0008C92E464C5446524121 +:103E90004D45202000B5FFF7A1FFFEF75DF8FEF7C6 +:103EA0008BFA113D3D3D20526567697374657273ED +:103EB000203D3D3DFEF750F8FEF77EFA0650535286 +:103EC000203D2000FD69361F37602F4601F022FAA1 +:103ED000FEF742F8FEF770FA06523020203D20002F +:103EE000083E376077600427FFF760FF80CEFFF75A +:103EF00085FFFEF731F8FEF75FFA06523420203DC9 +:103F000020000000361F37600427FFF74FFFFEF741 +:103F100023F8FEF751FA06523820203D2000000019 +:103F2000361F37600427FFF741FF80CEFFF756FFAB +:103F3000FEF712F8FEF740FA06523132203D20001B +:103F40003D461035361F37602F46FFF71DFF376897 +:103F5000203701F0DFF9FEF711F81437361F37600C +:103F60000227FFF723FF80CE00BD0000803D000840 +:103F7000C54E414D453F2020FD1C03218D43AF42DE +:103F800000B501D0002700BD7D1C3F789F243C4038 +:103F9000103E812131607460B760F560A027FCF7A6 +:103FA00047FA002F80CE02D10027361D00BD1F200A +:103FB000074030683F18306837600746FCF79AFAC8 +:103FC000F73F0008009D019805442D780C3E212103 +:103FD00031607560B7607F27FCF72AFA002F80CE2A +:103FE00004D103B0361F3760002700BD0098401C85 +:103FF0000090E7D703B0361F3760014F00BD0000C7 +:10400000FFFFFFFFEC3C0008C649503E4E464120F2 +:10401000BF1E00B5361F3760FFF7AEFF002F80CE02 +:1040200001D17F1EF6E700BD903C0008CD43484516 +:10403000434B2D414C49474E45442020FD1C032154 +:104040008D43AF4200B50CD0FEF7B6F90D284D698F +:1040500073616C69676E656429200000FF1C032191 +:104060008F4300BD703E0008C73F434C4950333278 +:1040700030683D1A802D00B510D937688037FDF7BC +:104080006BFFFEF799F913436C69707065642074D7 +:104090006F203332206974656D73000000BD00002D +:1040A00068400008C82E52534641554C54202020E9 +:1040B00000B5FDF751FFFFF7AFFEFDF74DFFFEF72F +:1040C0007BF906525350203D20000000361F376018 +:1040D00001F020F9FDF752FFFFF7B0FFFFF7B4FE44 +:1040E000FF69FEF769F90720205230203D200000CB +:1040F000361F376001F00EF9FDF740FFFFF79EFF16 +:104100003F1FFDF729FFFEF757F9192D2D2D2052DE +:10411000657475726E20737461636B20686967687B +:10412000202D2D2DFFF7A4FFFCF7E4F98D410008A9 +:10413000FDF712FF009D01980544361F37602F469A +:1041400001F0E8F8FDF71AFF009D019805442D687D +:10415000083E356077602F4601F0DCF8FDF70EFF72 +:104160000C3E144931607760B760134FFCF760F97B +:10417000002F80CE04D0FFF74BFFFEF74BF800E096 +:1041800080CE0098001F0090D2D703B0FDF7E4FE68 +:10419000FEF712F9192D2D2D2052657475726E20BF +:1041A000737461636B206C6F77202D2D2D200000C0 +:1041B00000BD00003402000800C00008A440000850 +:1041C000C82E50534641554C5420202000B5FDF7D1 +:1041D000C3FEFFF72DFEFDF7BFFEFEF7EDF806501C +:1041E0005350203D20000000361F376001F092F848 +:1041F000FDF7C4FEFFF722FFFFF726FEBF69FEF7BB +:10420000DBF80720205330203D200000361F3760A8 +:1042100001F080F8FDF7B2FEFFF710FF3D1D30689A +:10422000854212D277680836FDF796FEFEF7C4F88D +:10423000164461746120737461636B20756E6465EC +:1042400072666C6F7765640000BD3D1D3068854205 +:104250000FD177680836FDF77FFEFEF7ADF8104402 +:1042600061746120737461636B20656D7074790093 +:1042700000BD30683D1AF02D11D977680836FDF77A +:104280006BFEFEF799F815446174612073746163E5 +:104290006B206F766572666C6F77656400BDFDF7A5 +:1042A0005BFEFEF789F8172D2D2D204461746120E7 +:1042B000737461636B2068696768202D2D2D000081 +:1042C0003068874221D03F1FFFF7D2FEFCF706F986 +:1042D00009430008FDF740FE009D01980544361F84 +:1042E00037602F4601F016F8FDF748FE009D019853 +:1042F00005442D68361F37602F4601F00BF80098F3 +:10430000001F0090E6D703B001E077680836FDF79C +:1043100023FEFEF751F8172D2D2D204461746120E6 +:10432000737461636B206C6F77202D2D2D2000003E +:10433000FDF712FEFEF740F80972544F532F523723 +:1043400020200000FFF78CFD00F0E4FF00BD00001E +:10435000283C0008C953484F574641554C5420202B +:1043600000B500F051FC03F0C9FB00F09BFBFEF729 +:10437000A1F8FDF7F1FDFDF7EFFDFEF71DF80A4589 +:104380007863657074696F6E20000000EFF3058537 +:10439000361F37602F46FEF727F9FEF70DF8036149 +:1043A00074200000FFF768FD00F0B4FFFFF772FD16 +:1043B000FFF77EFEFFF70AFFFDF7CEFDFDF7FCFFDE +:1043C0001552657374617274696E672073797374C2 +:1043D000656D202E2E2E0000FFF7A6FA361F3760DF +:1043E000002700BD164BEFF308805860EFF30981FA +:1043F000996072461A610420024201D1586800E0B7 +:10440000986818604046494652465B460FB5F0B47E +:104410000B4B6846D860F8B06846F03083460646D5 +:10442000083E341F84616946C161FFF799FF78B087 +:10443000F0BC0FBC8046894692469B4600BD0000FA +:104440004C360020164BEFF308805860EFF30981DB +:10445000996072461A610420024201D1586800E056 +:10446000986818604046494652465B460FB5F0B41E +:104470000B4B6846D860F8B06846F0308346064675 +:10448000083E341F84616946C161FFF769FF78B057 +:10449000F0BC0FBC8046894692469B4600BD00009A +:1044A0004C36002048340008CA53454C494F2D5320 +:1044B000455231201A4D2C463034103E03213160D4 +:1044C00000217160B560F760274600B5FDF74AFA34 +:1044D00014487969014379611248B96A8143B96224 +:1044E0001148B9690143B9610F48F9688143F9601E +:1044F0000E4801B4009F3F1C083E0D4931600D4934 +:104500007160FDF72FFA20BC24350C3E0A4931605A +:104510000A497160B7602F46FDF724FA00BD00001C +:1045200000100240000002000040000000000048AF +:1045300000003C0000002800F00F00001001000007 +:10454000A43D0008C450494F3A20202000B5FCF794 +:104550007BFF31688D020B482D18361F37602F46C0 +:10456000FDF7C6FD0125BD40361F37602F46FDF71C +:10457000BFFD31684D013D432F46361DFDF7B8FDA7 +:1045800000BD00000000004894330008C2504120E4 +:1045900000B500BFFCF78FFF000000008C4500084D +:1045A000C250422000B500BFFCF785FF01000000AB +:1045B000A0450008C250432000B500BFFCF77BFFB8 +:1045C00002000000B4450008C250442000B500BFFE +:1045D000FCF771FF03000000C8450008C2504520E9 +:1045E00000B500BFFCF767FF04000000DC450008D1 +:1045F000C250462000B500BFFCF75DFF050000007B +:10460000D03D0008C653455450494E203D687F6850 +:104610002F8380CE7047000004460008C6434C52EA +:1046200050494E203D687F686F8380CE7047000000 +:10463000A8440008C647455450494E203D687F684D +:104640002D693D40002D01D1002701E001277F4267 +:10465000012007407047202003200740BD003D4354 +:104660002F012F433D023D432F042F43704720204D +:104670000F2007407F000325BD402F4670472020B4 +:1046800030683760074600B5FFF7E6FF30683760EF +:104690000746FFF7EDFF35683D40356000BD20203F +:1046A000BD680F200540361F7168316077602F4666 +:1046B00000B5FFF7E5FF75682D68316871603760F8 +:1046C0002F4600BDF0450008C9495350494E4D4F93 +:1046D0004445202000B5FFF7E3FF3F1CFDF742F9FA +:1046E00000BD20200F2007403D013D432F022F43F6 +:1046F0003D043D432F46704707253D40AD000F2444 +:10470000AC40082007407F08361F346070472020E7 +:1047100030683760074600B5FFF7E4FF3068376060 +:104720000746FFF7E9FF80B4376871680F4020BC87 +:1047300077602F4600BD0000C8460008C9494E50AA +:1047400055544D4F4445202000B500BFFCF7B3FE43 +:10475000000000001C460008CA4F55545055544DE7 +:104760004F44452000B500BFFCF7A5FE0100000046 +:10477000883E0008C641464D4F44452000B500BF65 +:10478000FCF799FE02000000083D0008CA414E41B6 +:104790004C4F474D4F44452000B500BFFCF78BFE02 +:1047A000030000002C400008C74953494E5055549F +:1047B000361F0021316000B5FFF78CFF00BD0000FF +:1047C000CC3C0008C849534F555450555420202024 +:1047D000361F0121316000B5FFF77CFF00BD0000EE +:1047E000703F0008CA495346554E4354494F4E2026 +:1047F00000B580B4009F361F02213160FFF76AFFC9 +:10480000009DAD680F200540361F37602F46FFF72B +:104810007FFF20BC2D682035ED192F46FDF7A2F84B +:1048200000BD0000C4470008C84953414E414C4FE9 +:1048300047202020361F0321316000B5FFF74AFFD3 +:1048400000BD0000A8470008C7495350494E4F44D7 +:1048500030680028EFF3008001B4361D01BC80F3FE +:10486000008800B506D03D687F6869683943696093 +:1048700080CE05E03D687F686968B943696080CE95 +:1048800000BD00003C470008C9495350494E5055EF +:104890005044202000B5FFF703FF0C37FDF762F806 +:1048A00000BD000074470008C94E4F5450554C4C91 +:1048B00045442020361F0021316000B5FFF7EAFF94 +:1048C00000BD0000883A0008C850554C4C4544557E +:1048D00050202020361F0121316000B5FFF7DAFF9C +:1048E00000BD0000E4390008CA50554C4C45444412 +:1048F0004F574E20361F0221316000B5FFF7CAFF27 +:1049000000BD0000E4470008CA495350494E5350C7 +:104910004545442000B5FFF7C3FE0837FDF722F8F0 +:1049200000BD000044450008C84C4F575350454552 +:104930004420202000B500BFFCF7BDFD00000000B2 +:10494000C8480008CB4D454449554D535045454452 +:1049500000B500BFFCF7AFFD0100000028480008CB +:10496000C9484947485350454544202000B500BF39 +:10497000FCF7A1FD0300000060490008C8494E494A +:10498000544750494F202020044D054C696921436C +:104990006961A96AA143A962704700000010024042 +:1049A00000007E0034570008884900087C49000850 +:1049B000C9285345524B45593F292020FF692020E3 +:1049C0000740704748480008C8285345524B45598E +:1049D0002920202000B500BFFD6920200540002DC2 +:1049E00002D1FCF789FEF7E77F6AFF20074000BD90 +:1049F000B0490008C928534552454D495429202043 +:104A000000B500BFFD6980200540002D02D1FCF7F4 +:104A100073FEF7E73068B8627768083600BD0000BB +:104A2000F4490008C92853455254595045292020BB +:104A3000706831684518706877600746356000B562 +:104A4000FBF758FD654A0008009D019805442D7844 +:104A5000083E35607760FFF7D3FF0098401C009058 +:104A6000F2D703B080CE00BD08400008C7285345E8 +:104A700052435229083E0D213160776000B5FFF79F +:104A8000BFFF361F0A213160FFF7BAFF00BD0000EB +:104A900044490008CD2B4641554C54434F4E534F8B +:104AA0004C4520207047000088480008CA28494E1D +:104AB00049542D5345522920002038600020786049 +:104AC0000020B8603068F8600C2038600D20386035 +:104AD0007768083670470000E8480008C55541521D +:104AE0005431202000B500BFFCF7E5FC0038014040 +:104AF000AC4A0008C9494E49542D53455231202033 +:104B000000B5FFF7D7FC083E034931607760034FDB +:104B1000FFF7D2FF00BD00008813000000380140FD +:104B20008C470008C85345524B45593F312020203F +:104B3000361F3760024F00B5FFF740FF00BD000091 +:104B400000380140DC4A0008C75345524B455931F3 +:104B5000361F3760024F00B5FFF73CFF00BD000075 +:104B600000380140244B0008C8534552454D495474 +:104B700031202020361F3760024F00B5FFF740FF7D +:104B800000BD000000380140684B0008C853455282 +:104B90005459504531202020361F3760024F00B550 +:104BA000FFF746FF00BD00000038014058470008ED +:104BB000C653455243523120361F3760024F00B56D +:104BC000FFF758FF00BD0000003801408C4B000883 +:104BD000C8434F4E534F4C453120202000B500BFF5 +:104BE000FCF769FCE84B0008504B0008304B00080C +:104BF000744B0008984B0008B84B0008484B00085D +:104C0000C7434F4E534F4C4500B500BFFCF753FC14 +:104C1000E84B0008004C0008C55541525432202092 +:104C200000B500BFFCF747FC0044004034460008D4 +:104C3000CA53455232434C4F434B53200F4D2C46E1 +:104C40003034103E0E49316000217160B560F7606C +:104C5000274600B5FCF786FE0A4879690143796169 +:104C60000848B96A8143B9620648F9690143F961A4 +:104C7000044839698143396180CE00BD001002408B +:104C80000000030000000200A8480008C354583286 +:104C900000B500BFFCF70FFC9C4C0008000000486A +:104CA000040000000200000028350008C3525832FA +:104CB00000B500BFFCF7FFFBBC4C0008000000483B +:104CC0000800000003000000C8490008CD53455209 +:104CD0003246554E4354494F4E532020083E012141 +:104CE00031607760054F00B5FFF782FD083E012176 +:104CF00031607760024FFFF77BFD00BD9C4C0008E0 +:104D0000BC4C0008304C0008CA53454C494F2D5349 +:104D10004552322000B5FFF791FFFFF7DFFF00BDDE +:104D2000F44A0008C9494E49542D534552322020B7 +:104D300000B5FFF7EFFF083E342131607760024F86 +:104D4000FFF7BAFE00BD000000440040D04B000851 +:104D5000C85345524B45593F32202020361F3760FB +:104D6000024F00B5FFF72AFE00BD000000440040DE +:104D7000184C0008C75345524B455932361F37600F +:104D8000024F00B5FFF726FE00BD000000440040C2 +:104D9000504D0008C8534552454D495432202020FB +:104DA000361F3760024F00B5FFF72AFE00BD000036 +:104DB00000440040944D0008C85345525459504592 +:104DC00032202020361F3760024F00B5FFF730FE3B +:104DD00000BD000000440040B04B0008C6534552DF +:104DE00043523220361F3760024F00B5FFF742FEB4 +:104DF00000BD000000440040B84D0008C8434F4EBD +:104E0000534F4C453220202000B500BFFCF753FB28 +:104E1000144E00087C4D00085C4D0008A04D0008B1 +:104E2000C44D0008E44D0008744D0008C5554152BA +:104E30005433202000B500BFFCF73DFB0048004084 +:104E40008C4C0008C354583300B500BFFCF733FB4B +:104E5000544E000800080048100000004400000004 +:104E6000AC4C0008C352583300B500BFFCF723FB1D +:104E7000744E000800080048000800004B000000C5 +:104E8000084D0008CA53454C494F2D534552332015 +:104E9000154D2C463034103E1449316000217160AC +:104EA000B560F760274600B5FCF75CFD10487969EE +:104EB000014379610E48B96A8143B9620D48F969C5 +:104EC0000143F9610B48396981433961361F0A4F43 +:104ED00001213160FFF78CFC083E012131607760D1 +:104EE000064FFFF785FC00BD0010024000000C00DB +:104EF0000000080000000400544E0008744E000832 +:104F0000244D0008C9494E49542D534552332020A1 +:104F100000B5FFF7BDFF083E034931607760034FDE +:104F2000FFF7CAFD00BD0000A101000000480040DD +:104F3000FC4D0008C85345524B45593F33202020B3 +:104F4000361F3760024F00B5FFF738FD00BD000087 +:104F5000004800402C4E0008C75345524B4559337A +:104F6000361F3760024F00B5FFF734FD00BD00006B +:104F700000480040344F0008C8534552454D49543D +:104F800033202020361F3760024F00B5FFF738FD71 +:104F900000BD000000480040784F0008C85345524B +:104FA0005459504533202020361F3760024F00B53A +:104FB000FFF73EFD00BD000000480040DC4D00084A +:104FC000C653455243523320361F3760024F00B557 +:104FD000FFF750FD00BD0000004800409C4F000856 +:104FE000C8434F4E534F4C453320202000B500BFDF +:104FF000FCF761FAF84F0008604F0008404F0008C6 +:10500000844F0008A84F0008C84F0008584F0008F8 +:10501000C55541525434202000B500BFFCF74BFA6F +:10502000004C0040644E0008C352583400B500BF25 +:10503000FCF741FA38500008000000480200000068 +:1050400001000000444E0008C354583400B500BFAE +:10505000FCF731FA5850000800080048000400002E +:105060004A000000844E0008CA53454C494F2D5356 +:1050700045523420144D154869690143696113484C +:10508000A96A8143A96212486969014369611048AC +:10509000A96A8143A9620D48E9690143E9610B48A6 +:1050A000296981432961083E042131607760094FF5 +:1050B00000B5FFF79DFB083E002131607760064F89 +:1050C000FFF796FB00BD0000001002400000080042 +:1050D000000002003850000858500008044F000833 +:1050E000C9494E49542D53455234202000B5FFF78D +:1050F000C1FF083E034931607760034FFFF7DCFCD6 +:1051000000BD0000A1010000004C0040E04F00087D +:10511000C85345524B45593F34202020361F376035 +:10512000024F00B5FFF74AFC00BD0000004C0040F4 +:1051300010500008C75345524B455934361F37604D +:10514000024F00B5FFF746FC00BD0000004C0040D8 +:1051500010510008C8534552454D49543420202071 +:10516000361F3760024F00B5FFF74AFC00BD000054 +:10517000004C004054510008C85345525459504502 +:1051800034202020361F3760024F00B5FFF750FC57 +:1051900000BD0000004C0040C04F0008C6534552FF +:1051A00043523420361F3760024F00B5FFF762FCD0 +:1051B00000BD0000004C004078510008C8434F4E2D +:1051C000534F4C453420202000B500BFFCF773F945 +:1051D000D45100083C5100081C51000860510008DF +:1051E00084510008A4510008244A0008C8494E49C7 +:1051F000542D53455220202000B5FFF781FCFFF7C6 +:1052000097FDFFF785FEFFF771FF00BD34510008E1 +:10521000C753455442415544361F7068776007466E +:105220000549316000B5FBF71BFB7F1C7F08356823 +:10523000EF607768083600BD00D8B8050849000857 +:10524000CA49532D434F4E534F4C45205D46AF64E2 +:105250005D46EF6480CE704728490008C62E415352 +:10526000434949207F2007400C3E20213160776070 +:10527000B7607F2700B5FBF7DBF8002F80CE00D1A9 +:105280002E27FCF747FE00BD40520008C52E4259AC +:10529000544520205D46AD6B00B520B4FDF700F904 +:1052A000361F37600027FDF74DF9FDF71DF9FDF7B3 +:1052B0001BF9FDF751F9FCF73FFE20BC5C46A563E6 +:1052C00000BD00008C520008C52E574F52442020CC +:1052D0005D46AD6B00B520B4FDF7E2F8361F3760D0 +:1052E0000027FDF72FF9FDF7FFF8FDF7FDF8FDF7B3 +:1052F000FBF8FDF7F9F8FDF72FF9FCF71DFE20BCD0 +:105300005C46A56300BD00005C520008C62E4457F1 +:105310004F5244205D46AD6B00B520B4FDF7C0F898 +:10532000361F37600027FDF70DF9FDF7DDF8FDF7B3 +:10533000DBF8FDF7D9F8FDF7D7F8361F37603A27C5 +:10534000FDF7C2F8FDF7D0F8FDF7CEF8FDF7CCF881 +:10535000FDF7CAF8FDF700F9FCF7EEFD20BC5C464E +:10536000A56300BD944A0008C444554D5020202038 +:105370005D46AD6B361F71683160756000B5FDF735 +:105380008FF830683F18306837600746FBF7B2F88F +:105390003D540008FCF7E0FD009D01980544361FD0 +:1053A00037602F46FFF7B6FF009D019805442C4655 +:1053B0001034083E346077602F4600BFFBF78EF84C +:1053C000E5530008FCF7DAFD009D019805442D78AF +:1053D000361F37602F46FFF75DFF0098401C009096 +:1053E000F0D703B0361F37600227FCF7D5FD009DCC +:1053F000019805442C461034083E346077602F46EF +:10540000FBF76CF825540008009D019805442D78A1 +:10541000361F37602F46FFF725FF0098401C00908D +:10542000F2D703B0FCF768FD002F80CE01D002B0A8 +:1054300000BD009810300090ACD703B05D46AF635C +:1054400080CEFCF789FD00BD28500008C5504455AA +:105450004D5020205D46AD6B361F71683160756020 +:1054600000B5FDF71DF83068054603218D437F190F +:1054700037602F46FBF73EF8E5540008FCF76CFD5B +:10548000009D01980544361F37602F46FFF742FF05 +:10549000009D019805442C461034083E3460776026 +:1054A0002F4600BFFBF71AF8CD540008FCF766FD45 +:1054B000009D019805442D68361F37602F46FFF781 +:1054C00029FF0098001D0090F0D703B0FCF714FDF1 +:1054D000002F80CE01D002B000BD009810300090A7 +:1054E000CCD703B05D46AF6380CEFCF735FD00BD81 +:1054F000CC4C0008C22E532000B5FCF72DFDFCF764 +:105500005BFF032D2D200000FDF726FC002F00D1AE +:1055100080CE16D07F1E361F00213160FAF7DEFFE5 +:1055200043550008009D01980544361F37602F46FB +:10553000BF00F759FDF764F80098401E0090F1D7BE +:1055400003B000BD4C540008C94C45444143544984 +:105550005645202000B500BFFBF7E0FFA00000206B +:10556000C8520008C73C5449434B533E00B500BFE6 +:10557000FBF7D4FFA40000209C510008C554494308 +:105580004B53202002480568361F37602F4670476E +:10559000A40000206C4A0008C34C445500B500BF6D +:1055A000FBF789FFA85500080008004840000000EC +:1055B0004600000098550008C34C445200B500BF97 +:1055C000FBF779FFC85500080008004800020000FA +:1055D00049000000B8550008C34C444400B500BF62 +:1055E000FBF769FFE855000800080048800000004C +:1055F00047000000D8550008C34C444C00B500BF1C +:10560000FBF759FF08560008000800480001000099 +:105610004800000054430008C95359535449434BB0 +:105620004552202002490868401C0860704700006D +:10563000A4000020F0B54046494652465B460FB4F0 +:105640006946F0398B460A1CF03A95460E46083EEC +:10565000341F8C616846C861FFF7E4FF6946F0318A +:10566000F0318D460FBC8046894692469B46F0BD80 +:1056700060320008CB53544152542D434C4F434B9E +:10568000054D064868610320286105496C18FF2014 +:10569000207062B67047000000E000E06F17000065 +:1056A000230D000068500008CA53544F502D434C3E +:1056B0004F434B20024901200D6885430D60704720 +:1056C00010E000E0EC510008C54C41544552202048 +:1056D00002480568ED192F4670470000A40000201D +:1056E000A8560008C954494D45444F55543F202001 +:1056F000044805687F1B002F01D4002701E0012723 +:105700007F427047A4000020F8550008C24D532086 +:1057100007480568ED192F4600B500BFFBF7ECFF01 +:10572000034805687D1B002DF8D580CE00BD01BC67 +:10573000A40000201C5A0008805600086455000888 +:10574000C42F54434220202000B500BFFBF7B3FE16 +:105750001800000018560008C85443422E4C494E09 +:105760004B20202000B500BFFFF7FFFF0000000026 +:10577000BC510008C75443422E53535000B500BFDC +:10578000FFF7FFFF0400000074560008CA544342AC +:105790002E5354415455532000B500BFFFF7FFFF6F +:1057A0000800000058570008C85443422E4D535279 +:1057B0004320202000B500BFFFF7FFFF0C000000D2 +:1057C000A8570008C85443422E4D45534720202077 +:1057D00000B500BFFFF7FFFF10000000E45600080F +:1057E000C95443422E4556454E54202000B500BFB3 +:1057F000FFF7FFFF14000000C8560008C44D4149E0 +:105800004E20202000B500BFFBF755FE103F0020C2 +:10581000000000000C570008C72850415553452987 +:10582000C0B5684659464860096888680028FBD0BA +:105830008B4648688546C0BC01BC86467047000060 +:1058400040570008864D554C54493F2000B500BFD5 +:10585000FBF70FFFA80000207C550008C653494EF7 +:10586000474C45200348044908600020034908606C +:10587000704700008105000808000020A8000020F3 +:10588000E0500008C54D554C5449202003480449B8 +:105890000860044804490860704700002158000867 +:1058A00008000020FFFFFFFFA80000205C58000850 +:1058B000C6535441545553205D46AD6801218D4374 +:1058C000361F37602F467047B0580008C7524553FF +:1058D000544152540120B9680143B96080CE7047E9 +:1058E000C4570008C448414C542020200120B96806 +:1058F0008143B96080CE704748500008C453544F6C +:10590000502020205D462D1C361F37602F4600B5E5 +:10591000FFF7ECFFFBF7F0FE00BD000002CE012315 +:1059200019436A463846F0388546F8610020B86069 +:1059300002B401B43946091E083902B4091FB9611D +:1059400068467860954680CE704720205D462D6879 +:105950003D605D462F6080CE704720205D462D1C47 +:10596000361F37602F4600B53D683068854208D045 +:105970003F685D462D1CBD4202D17768083600BDE8 +:10598000F2E735682D683D607768083600BD000095 +:10599000FC570008C8494E4954494154452020202D +:1059A000361F71683160776000B5FFF7B7FF361FAB +:1059B0003760FFF7CBFF0120B86080CEFBF79CFE7D +:1059C00000BD0000E0570008C95445524D494E4102 +:1059D0005445202000B5FFF7C1FFFBF78DFE00BD49 +:1059E00044580008CA494E49542D4D554C5449203D +:1059F00000B5FFF737FF083E06493160776018278A +:105A000002F088F8034D2D60012003490860FFF77C +:105A10003DFF00BD103F0020183F0020CC7A000859 +:105A2000F059000874570008C34849535D462D1CBF +:105A30007F1B30683F18361D70470000E45800088F +:105A4000C953454D4150484F52452020361F3760BD +:105A5000082700B5FBF76EFD0B4805680C3E0021DA +:105A6000316000217160B7602F46FBF7B9FA3D46FF +:105A700080CE01200543A8473068386070687860A0 +:105A8000B7680C3600BD00003C000020CC58000870 +:105A9000C65349474E414C2000B5FBF74FFF3868CD +:105AA000401C38600020786080CEFBF751FF00BDBD +:105AB000905A0008C75245515545535400B500BF90 +:105AC000FBF73CFF3D68002D04D1FBF741FFFBF7DE +:105AD00013FEF5E73868401E38605D462D1C7D607A +:105AE00080CEFBF735FF00BD8C570008CA544153E8 +:105AF0004B2D434841494E2000B500BFFBF70EFD3A +:105B0000AC00002068530008C45441534B202020AF +:105B10000C4805680C482D18083E356077600B4F1F +:105B200000B5FCF78DFAFBF7C1FCFCF74FFA08480B +:105B30000568361F37602F46FCF7DAFA04490F6014 +:105B400080CE00BD1C000020F0010000E00200003B +:105B5000AC000020B45A0008C653544152543A20B5 +:105B600000B520BC361F3560FFF71AFF00BD0000EE +:105B7000E4590008C52E5441534B2020361F37608E +:105B8000124F00B53F68002F0ED03D1F2D683068C2 +:105B9000854208D10C3F361DFBF732FAFCF73AFB81 +:105BA000FCF7ECF900BDEDE780CEFFF7B3FBFCF7A7 +:105BB00003FC15206973206E6F7420696E205441B8 +:105BC000534B20636861696E00BD0000AC0000208B +:105BD0000C530008C62E5441534B5320361F3760D8 +:105BE000094F00B53F68002F0BD03D460C3D361FD6 +:105BF00037602F46FBF704FAFCF70CFBFCF7BEF905 +:105C0000F0E780CE00BD0000AC000020C0410008DD +:105C1000C82E52554E4E494E47202020361F376021 +:105C2000064F00B5FCF798F9361F3760FFF7A6FF5F +:105C30003F6802488742F5D180CE00BD103F00206A +:105C40001176312E30205B6275696C642030303003 +:105C5000345D153331204F637420323032332C20C1 +:105C600031313A30373A333900B5FCF775F9FCF782 +:105C7000A3FB1C2A2A2A2A2A2A2A2A2A2A2A2A2A48 +:105C80002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A009E +:105C900000BD202000B5FFF7E7FFFCF75DF9FCF73A +:105CA0008BFB1C4D504520506F776572466F7274A8 +:105CB0006820666F722053544D33324630373200BD +:105CC000FCF74AF9FCF778FB2B4D6F646966696550 +:105CD0006420666F722057617272696F7273204F11 +:105CE0006276696F75732057616C6C2D666F6C6C92 +:105CF0006F776572FCF730F9361F3760064FFCF797 +:105D000029FEFCF73BF9361F3760044FFCF722FEF3 +:105D1000FFF7AAFF00BD0000405C0008525C0008CD +:105D2000405A0008CA524550524F472E494D47200D +:105D300000B500BFFBF7BFFB3C5D0008FC0700207F +:105D40004409002000000000006CDC02000002009A +:105D5000000800003B1C83CE00D17047021C0A43A0 +:105D60001A430324144006D10A680260091D001D6D +:105D70001B1FF9D170470A780270491C401C5B1E3A +:105D8000F9D1704702CE0124E40773465B1E1A68FE +:105D90000919781A07B480CE7046001D004700002C +:105DA00002CEB942EFD180CE01217046884302680D +:105DB0001047361F37607046401E076800BD000060 +:105DC00072B670473A4603CE0027121A091A91425A +:105DD00000D2FF437047000001CE3168202400222A +:105DE0004918404113465341C01B5B4101D0491C37 +:105DF00000E0C019641EF3D10F46306070472020C8 +:105E0000361F0021316000B5FFF7E6FF361D00BDEB +:105E10000038014007480568002D03D00548056893 +:105E200005490D60044805680C2028600D20286095 +:105E30007047000008000020D400002007480568D3 +:105E4000361F37602F4600BFFD6980200540FBD01C +:105E50003068B8627768083670470000D4000020C8 +:105E600004480568ED6920200540361F37602F463D +:105E700070470000D40000200A480568361F3760CC +:105E80002F4600BFFD6920200540FBD07F6AFF2020 +:105E9000074000BF00BF00BF00BF00BF00BF00BF82 +:105EA00000BF7047D400002030683F18306837606A +:105EB000074600B5FFF774FF9D010020009D019883 +:105EC00005442D78361F37602F46FFF7B7FF00983F +:105ED000401C0090F2D703B000BD2020361F376071 +:105EE0000D2700B5FFF7AAFF361F37600A27FFF717 +:105EF000A5FF00BD07480568083E35607760064F7E +:105F000000B5FFF77DFF00BF7F1E002FFCD180CEC4 +:105F100000BD01BC0C00002020A107000748056857 +:105F2000083E35607760064F00B5FFF769FF00BF98 +:105F30007F1E002FFCD180CE00BD01BC0C000020D4 +:105F40008813000000B500BFFFF7E8FF7F1E002F99 +:105F5000FAD180CE00BD202000B5FFF731FF054902 +:105F600001200D6805430D6003480449086000BF27 +:105F7000FEE700BD24100240CCCC00000030004001 +:105F800000B500BFFFF715FF200A002000B500BFD5 +:105F9000FFF70FFF240A002000B500BFFFF709FF3D +:105FA000280A002000B500BFFFF703FF2C0A0020DD +:105FB00000B500BFFFF7FDFE300A002000B500BFAE +:105FC000FFF74EFF002F80CE03D0FFF755FF80CEA6 +:105FD000F6E700BD361F3760062700B5FFF72EFF36 +:105FE00000BD2020361F3760152700B5FFF726FFBC +:105FF00000BD2020361F3760182700B5FFF71EFFB1 +:10600000024901204042086000BD0000300A002023 +:10601000361F3760074F00B5FFF722FF002F80CEF5 +:1060200003D0FFF729FF361D00BD7F1E002FF3D1DF +:10603000014F00BD00004000FFFFFFFF083E0021B0 +:10604000316077600C4F00B5FFF7E2FF31680F70E9 +:1060500070683F18FF20074035686D1C074885426F +:10606000EFF3008001B477602F46361D01BC80F34A +:106070000088E9D380CE00BD400A0020C00A00207D +:1060800000B5FFF7B7FFFFF7B5FF00BD00B5FFF79D +:1060900095FF07490868401C0860054805680548E1 +:1060A000854202DDFFF7ECFF01E0FFF79BFF00BD3B +:1060B0002C0A00200001000007480568083E074937 +:1060C000316077602F4600B500F0BCF902490868DE +:1060D0008030086000BD0000240A0020400A002033 +:1060E00000B5FFF795FFFFF793FF30683F18FF2FCC +:1060F00080CE05D0FFF7CAFFFFF77CFF80CE00BD42 +:1061000018480568FF200540BD4280CE02D0FFF749 +:10611000BDFF00BDFFF792FFFFF77AFF30688742AF +:10612000EFF3008001B47768083601BC80F3008883 +:1061300002D0FFF7ABFF00BD0A4805680A480468B3 +:10614000AC4202DAFFF79CFF00BDFFF7B5FFFFF797 +:1061500041FF04490868401C0860044900200860A9 +:1061600000BD0000200A0020280A00202C0A002080 +:10617000361F37600A4F00B5FFF772FE002F01D0BF +:10618000002701E001277F423068074080CE03D01E +:10619000FFF7B0FE7F1EEFE780CEFFF761FE00BD88 +:1061A000A086010000B5FFF7E3FF002F80CE03D1EA +:1061B000024901204042086000BD0000300A002072 +:1061C0002A49002008602A490020086000B5FFF72E +:1061D000F5FEFF0927490F60306827490860012054 +:1061E000264908601527361DFFF728FEFFF7C0FF78 +:1061F000002F80CE05D1361F37601527FFF71EFE12 +:10620000F4E700BFFFF7CEFF18480568002D1AD14C +:10621000FFF732FE042F06D104201449086080CE17 +:10622000FFF7D8FE0FE0182F06D118200F4908609D +:1062300080CEFFF7CFFE06E0012F03D180CEFFF71F +:106240004FFF00E080CE09480568002DDAD00748EE +:106250000568042DEFF3008001B4361F37602F4628 +:1062600001BC80F3008800D1002700BD300A002067 +:106270002C0A0020280A0020240A0020200A0020DE +:10628000074805688020054000B508D0054D064840 +:10629000686006486860802029698143296100BDE3 +:1062A000102002400020024023016745AB89EFCD5A +:1062B000083E134931607760124F00B53068451EC3 +:1062C000002DEFF3008001B4356001BC80F300883D +:1062D00004D0FD6801200540002DEFD1FD68342475 +:1062E0002C40FC6030680028EFF3008001B42F469A +:1062F000361D01BC80F3008801D10348074300BD6F +:1063000000001000002002400000008000B5FFF7F0 +:10631000B7FF084901200D6805430D6030683880DB +:1063200077680836FFF7C4FF024901200D688543EE +:106330000D6000BD102002400B483F1A00B5FFF76A +:106340009FFF0A4D02202969014329616F614020A6 +:1063500029690143296180CEFFF7AAFF0449022081 +:106360000D6885430D6000BD00000008002002405C +:106370001020024000B500BFFFF71BFD340A0020CB +:10638000202F80CE00B503D002490868401C086069 +:1063900000BD0000340A002030683F1830683760C4 +:1063A000074600B5FFF7FCFC93060020009D01980E +:1063B0000544361F37602F46FFF7BEFFFFF7E0FFAB +:1063C00003480568009840190090EFD703B000BD5E +:1063D0001400002005480568083E054931607760D3 +:1063E0002F4600B5FFF7D8FF00BD000010000020C9 +:1063F000000000087068054601218D43306804469E +:1064000001218C437F1C01218F433F193760756048 +:10641000274600B5FFF7C4FC050700203D88009C17 +:1064200001980444083E356077602746FFF76EFF09 +:10643000FFF7A6FFBF1C0098801C0090EED703B0AA +:1064400080CE00BD361F3760802700B5FFF7D2FF32 +:1064500000BD20200F200740092F00B500DDFF1DE3 +:106460003037FFF7EBFC00BD3D0B361F37602F4682 +:1064700000B5FFF7EFFF3D0A361F37602F46FFF7E5 +:10648000E9FF3D09361F37602F46FFF7E3FFFFF7AF +:10649000E1FF00BD0845726173696E6720062064E4 +:1064A0006F6E652010537461727420586D6F64654F +:1064B0006D20545820265072657373205220746FDB +:1064C000207265626F6F742C206F7468657220741F +:1064D0006F20726570726F6772616D20064572720F +:1064E0006F7273034E6F20207D1C3F78361F35601E +:1064F00000B5FFF7D9FC00BD00B5FFF7EFFC9C4DE0 +:10650000361F37602F46FFF7AFFF361F3760202753 +:10651000FFF794FC361F3760014FFFF7E5FF00BD22 +:10652000A007002000B5FFF775FC361F3760322743 +:10653000FFF708FD00BD202000B5FFF7F3FF00BF07 +:10654000284900200860FFF7C9FC361F3760264F36 +:10655000FFF7CAFF361F37601427FFF7F3FCFFF77A +:1065600039FF361F3760214FFFF7BEFFFFF7C4FF2B +:106570001C4900200860FFF7B1FC361F37601C4F34 +:10658000FFF7B2FF361F37601A27FFF757FC19488D +:106590000568083E1849316077602F46FFF710FE06 +:1065A00080CEFFF7A9FF361F37606427FFF7CAFCCC +:1065B000FFF794FC361F3760104FFFF795FFFFF78A +:1065C0005BFCDF200740361F3760FFF737FC522F98 +:1065D00080CEB5D1361F37606427FFF7B3FCFFF7D5 +:1065E000BBFC00BD340A00205807002061070020D2 +:1065F0006807002010000020000000087907002034 +:1066000005436F707920202000B5FFF78BFFFFF75F +:1066100065FC361F3760174FFFF766FF361F376080 +:106620001427FFF78FFC144900200860083EB1686A +:1066300031607760FFF7B0FEFFF75EFF361F37600F +:106640000A27FFF77FFC4A4D002D02D0B7680C36B1 +:1066500000BDFFF743FC361F3760084FFFF744FFCC +:10666000FFF7C8FEFFF748FF361F37601427FFF714 +:1066700069FC00BD58070020340A0020C40800202F +:1066800000B500BF0C3EF168316031697160B760E0 +:10669000FFF7BAFF364D002DF4D1361F376064275F +:1066A000FFF750FCFFF758FC00BD0000C859000878 +:1066B000CB5245464C4153485541525400B500BF5A +:1066C000FAF72CFFB0000020585B0008C643414C8D +:1066D0004C49542072B60F480568103E0E4931608F +:1066E0000E497160B560F7600D4F00B5FAF742FBD7 +:1066F000094DAF600B48E8600B4828610B486861A2 +:1067000035687768083601200543A847FDF70CF97E +:1067100000BD0000B0000020000000203C5D00082B +:1067200070090000006CDC0200F8010000080000A5 +:10673000CC660008C75245464C415348044805689A +:10674000361F37602F4600B5FFF7C4FF00BD0000BD +:106750003C5D0008245D0008C9434F5059464C4138 +:106760005348202004480568361F37602F4600B57F +:10677000FFF7B0FF00BD0000405D0008EC5A0008C4 +:10678000CA4449534B2D4552524F522000B500BFC9 +:10679000FAF7C4FEB4000020B0660008C8454E44B5 +:1067A0002D4C4F41442020205D460020E8625D468C +:1067B000012040422863704700B500BFFBF78EFB05 +:1067C000062F80CEFAD100BD361F3760002700B5F6 +:1067D00080CEFBF783FB152F01D0002501E00125BA +:1067E0006D42062F01D0002701E001277F422F4391 +:1067F000EFF3008001B42F4601BC80F30088E7D09E +:1068000000BD2020083E002131607760064F00B5B2 +:10681000F9F788FF306837600746FBF77BFBFBF72B +:1068200079FBFFF7C9FF00BD0001000000B500BF04 +:10683000FBF754FB012F80CEFAD100BFFBF75CFBC6 +:10684000002F80CE03D0FBF749FB80CEF6E7361F42 +:1068500037600627FBF75EFB00BD202000B5FBF785 +:1068600059FBFFF7E3FF7D1C3F78083E37607560FA +:10687000FFF7C8FF361F3760002700BFF9F72EFE6D +:10688000A3680008009D01980544ED192D78361F76 +:1068900037602F46FBF73EFB0098401C0090F1D775 +:1068A00003B00627FBF736FBFFF78EFF01490F60A9 +:1068B00080CE00BDB4000020361F3760052700B52C +:1068C000FBF728FBFBF748FBFBF776FD08457272E8 +:1068D0006F72202320000000FBF786FEFBF74EFBC3 +:1068E000FBF774FBFCF736F8FBF736FBFFF75CFFB2 +:1068F00000BD2020361F3760062700B5FFF7AEFF2A +:10690000361F3760184FFFF77DFF361F37600127AE +:10691000FFF778FFFFF78AFF5D46002028635D469A +:1069200001204042E862002010490860FCF774FC36 +:10693000FCF7AEF8361F37600D4FFBF74DFD002F0B +:1069400000D180CE0AD0FFF7B7FF5D46AD69361F94 +:1069500037602F463E1C80CEFCF75EFC5D462D6BFB +:10696000002DE5D000BD01B4FFFFFFFF980000201F +:10697000A0330008F4540008C7494E434C55444521 +:10698000361F3760202700B5FCF7F6F87D1C3C78F1 +:10699000083E356077602746FAF736FAFFF7AAFF18 +:1069A00000BD000018580008C847454E53504942E2 +:1069B0005220202030683760074600B5F9F750FFB5 +:1069C000083E002131607760072700BFF9F786FD98 +:1069D000F7690008009D019805440124AC40BC42C1 +:1069E00004DA009F0198074403B000BD0098401EE0 +:1069F0000090EFD703B0002700BD000094590008B5 +:106A0000C928494E495453504929202000B580B423 +:106A1000009F402039688143396080CEFFF7CAFF6C +:106A2000FF0007480743009D2F60009F05487860DE +:106A300080BC402039680143396080CE00BD000031 +:106A4000070300000017000078690008CD53504983 +:106A5000325F4E43535F4D454D53202000B500BF7C +:106A6000FAF729FD686A00080008004801000000E4 +:106A700040000000285A0008C8535049325F534371 +:106A80004B20202000B500BFFAF715FD906A0008E2 +:106A900000040048002000002D0000005867000896 +:106AA000C9535049325F4D49534F202000B500BFB4 +:106AB000FAF701FDB86A0008000400480040000031 +:106AC0002E000000A06A0008C9535049325F4D4FA4 +:106AD0005349202000B500BFFAF7EDFCE06A00083A +:106AE00000040048008000002F000000006A000839 +:106AF000C8495353504950494E202020083E002198 +:106B00003160776000B5FDF773FE361F03213160F9 +:106B1000FDF700FF00BD00009C670008CA53454C0C +:106B2000494F2D5350493220174D184C6969214364 +:106B30006961A96AA143A962134D154CE969214312 +:106B4000E9612969A1432961124D083E35607760EA +:106B50002F4600B5FDF73CFE083E0121316077600D +:106B6000FDF7D8FEFDF752FD361F37600A4FFFF7DD +:106B7000C5FF361F3760094FFFF7C0FF361F37606C +:106B8000074FFFF7BBFF00BD001002400000C00030 +:106B900000400000686A0008906A0008B86A0008AF +:106BA000E06A000810520008C7535049584348474C +:106BB00030683873361D00B5F9F7E2FCF9F7E0FCF0 +:106BC000F9F7DEFCF9F7DCFCBD6883200540032DF6 +:106BD000FAD13F7BFF20074000BD0000786A000823 +:106BE000C8535049464C555348202020361F376023 +:106BF000044F00BFBD680120054001D0FD68F9E7E2 +:106C000080CE704700380040FC580008C4535049FB +:106C100021202020361F3760024F00B5FFF7C8FF44 +:106C200080CE00BD003800400C6C0008C4535049B1 +:106C300040202020083EFF2131607760024F00B5E0 +:106C4000FFF7B6FF00BD000000380040F06A000802 +:106C5000C8494E49545350493220202000B5FFF70F +:106C600063FF0C3E0549316005497160B760054F0F +:106C7000FFF7CCFEFFF7BAFF00BD0000006CDC029E +:106C800040420F0000380040745B0008C52E53508E +:106C900049322020083E044931607760402700B522 +:106CA000FEF7D8FB00BD000000380040E06B000894 +:106CB000C853504944454C4159202020361F376065 +:106CC000092700BF7F1E002FFCD180CE7047000037 +:106CD000C86A0008C943534C4F5F4D454D532020AF +:106CE00000B5FFF7EBFF361F3760034FFDF79AFC47 +:106CF000FFF7E4FF00BD0000686A0008D46C0008DC +:106D0000C9435348495F4D454D53202000B5FFF717 +:106D1000D5FF361F3760034FFDF778FCFFF7CEFF36 +:106D200000BD0000686A0008006D0008C4484F4DAF +:106D300045202020361F37601B2700B5FBF7EAF8F7 +:106D4000361F37605B27FBF7E5F8361F37604827AB +:106D5000FBF7E0F800BD000084580008C42E504F37 +:106D600053202020361F37600A2700B5F9F768FD49 +:106D70003037FBF7CFF83037FBF7CCF800BD000019 +:106D80001C6B0008C6474F544F585920361F3760B8 +:106D90001B2700B5FBF7BEF8361F37605B27FBF7F4 +:106DA000B9F8FFF7DFFF361F37603B27FBF7B2F874 +:106DB000FFF7D8FF361F37604827FBF7ABF800BD59 +:106DC00080670008CB434C45415253435245454EE2 +:106DD000361F37601B2700B5FBF79CF8361F37605E +:106DE0005B27FBF797F8361F37603227FBF792F8DF +:106DF000361F37604A27FBF78DF800BD846D000809 +:106E0000CA5343524F4C4C444F574E20361F3760A5 +:106E10001B2700B5FBF77EF8361F37604427FBF7CA +:106E200079F800BDB06C0008C85343524F4C4C5524 +:106E300050202020361F37601B2700B5FBF76AF86B +:106E4000361F37604D27FBF765F800BD2C6D000835 +:106E5000C95343524F4C4C494E472020361F376090 +:106E60001B2700B5FBF756F8361F37605B27FBF78B +:106E700051F8361F37607227FBF74CF800BD000051 +:106E8000506E0008C9435552534F524F464620207A +:106E9000361F37601B2700B5FBF73CF8361F3760FD +:106EA0005B27FBF737F8361F37603F27FBF732F8D1 +:106EB000361F37603227FBF72DF8361F376035272E +:106EC000FBF728F8361F37606C27FBF723F800BD67 +:106ED000286E0008C8435552534F524F4E20202071 +:106EE000361F37601B2700B5FBF714F8361F3760D5 +:106EF0005B27FBF70FF8361F37603F27FBF70AF8D1 +:106F0000361F37603227FBF705F8361F3760352705 +:106F1000FBF700F8361F37606827FAF7FBFF00BD64 +:106F2000085B0008C345534300B500BFFAF7C3FA36 +:106F30001B0000004C6A0008C43C23233E20202094 +:106F40005D46AD6B00B520B4FBF7B4FA361F376071 +:106F50000027FBF7F7FAFBF7E7FAFBF7FDFAFAF77A +:106F6000EBFF20BC5C46A56300BD00003467000851 +:106F7000C44553435B202020361F37601B2700B5D4 +:106F8000FAF7C8FFFBF718FA015B000000BD00002C +:106F9000D46E0008C744454641554C5400B500BF67 +:106FA000FAF789FA00000000105C0008C4424F4C58 +:106FB0004420202000B500BFFAF77DFA0100000050 +:106FC0002C6C0008C344494D00B500BFFAF773FAB2 +:106FD00002000000A8690008C64954414C494320FA +:106FE00000B500BFFAF767FA03000000C46D00089F +:106FF000C9554E4445524C494E45202000B500BF6E +:10700000FAF759FA04000000C46F0008C5424C4961 +:107010004E4B202000B500BFFAF74DFA05000000E6 +:1070200048550008C352455600B500BFFAF743FA69 +:10703000070000000C700008C5424C414E4B202058 +:1070400000B500BFFAF737FA0800000038700008F2 +:10705000C5424C41434B202000B500BFFAF72BFA44 +:107060000000000024700008C352454400B500BF72 +:10707000FAF721FA01000000846E0008C547524566 +:10708000454E202000B500BFFAF715FA02000000B7 +:10709000D86F0008C659454C4C4F572000B500BF6B +:1070A000FAF709FA03000000AC6F0008C4424C551F +:1070B0004520202000B500BFFAF7FDF904000000CC +:1070C000D45B0008C74D4147454E544100B500BF51 +:1070D000FAF7F1F90500000050700008C443594167 +:1070E0004E20202000B500BFFAF7E5F906000000A9 +:1070F0007C700008C55748495445202000B500BFA2 +:10710000FAF7D9F90700000068700008C441545428 +:107110005220202000B5FFF72FFFFFF711FFFBF7EC +:107120004BF9016D00BD0000246F0008C4544558A0 +:10713000542020201E3700B5FFF7ECFF00BD0000F3 +:10714000F4700008CA4241434B47524F554E442009 +:10715000283700B5FFF7DEFF00BD00002C710008E6 +:10716000CB4D4F544F52454E41424C4500B500BFA8 +:10717000FAF7A1F97871000800000048010000004A +:10718000000000008C6C0008C74C4546544F444F2B +:1071900000B500BFFAF78FF99C71000800000048A5 +:1071A0000200000001000000946F0008C952462F41 +:1071B0004C524C454453202000B500BFFAF77BF9F0 +:1071C000C471000800000048040000000200000034 +:1071D000A86B0008C852485353454E534520202001 +:1071E00000B500BFFAF767F9EC710008000000482D +:1071F0000800000003000000706F0008C6535041F3 +:107200005245312000B500BFFAF755F91072000859 +:10721000000000481000000004000000FC7100089D +:10722000C65350415245322000B500BFFAF743F92A +:107230003472000800000048200000000500000033 +:1072400020720008C65350415245332000B500BF9C +:10725000FAF731F9587200080000004840000000B9 +:107260000600000044720008C653504152453420C5 +:1072700000B500BFFAF71FF97C7200080000004853 +:107280008000000007000000F06F0008C6284C5086 +:10729000574D292000B500BFFAF70DF9A07200087C +:1072A0000000004800010000080000008C72000887 +:1072B000C6285250574D292000B500BFFAF7FBF8F9 +:1072C000C472000800000048000800000B00000025 +:1072D000C4700008C84C485353454E5345202020E5 +:1072E00000B500BFFAF7E7F8EC72000800040048A8 +:1072F00001000000200000000C710008C94C462F5E +:1073000052524C454453202000B500BFFAF7D3F841 +:10731000147300080004004802000000210000006F +:10732000D4710008C852494748544F444F20202088 +:1073300000B500BFFAF7BFF83C730008000400482E +:107340001000000024000000386F0008C44C4544C1 +:107350003120202000B500BFFAF7ADF860730008B7 +:107360000004004840000000260000005C6D00089A +:10737000C9494E4E45524C454453202000B500BFEC +:10738000FAF799F88873000800040048000100002B +:10739000280000004C730008C44C454432202020D3 +:1073A00000B500BFFAF787F8AC7300080008004882 +:1073B000002000004D00000070730008C9492F4FE5 +:1073C000434C4F434B5320200F4D104869690143F4 +:1073D00069610F48A9690143A9610320E969014373 +:1073E000E9612C460C340A4B21681943216021685D +:1073F000994321602C4610340323216819432160EE +:1074000021689943216070470010024001000E007E +:10741000000A0600D4720008C450574D52202020A4 +:1074200001490F6080CE7047342C01401874000869 +:10743000C450574D4C20202001490F6080CE70472A +:10744000402C014030740008C84C45465453544FFA +:107450005020202000B500BFFAF72DF8D40100001D +:10746000AC710008C9524947485453544F5020202A +:1074700000B500BFFAF71FF8D4010000006E000845 +:10748000CA53544F504D4F544F525320361F3760FC +:10749000044F00B5FFF7D0FF361F3760014FFFF7ED +:1074A000BFFF00BDD401000094700008C6494E49DA +:1074B0005454312000B5FFF7E9FF0F4D0F48E86243 +:1074C0006020A8610E48E8610E4828620020A8628A +:1074D0000D48686401202860083E02213160776011 +:1074E0000A4FFDF785F9083E022131607760084FA9 +:1074F000FDF77EF900BD0000002C0140E80300000C +:10750000006000000110000000800000A072000870 +:10751000C472000868720008C752504552494F446F +:1075200002480588361F37602F46704738000040F4 +:1075300088710008C74C504552494F44024805889D +:10754000361F37602F4670473404004034750008FA +:10755000CA494E4954504552494F44200448F862A4 +:107560002F20B862012038603120386280CE704709 +:10757000FFFFFFFF506C0008C8494E495454322F9A +:1075800033202020134D1448E8601448A8601448A4 +:10759000A861361F37602F4600B5FFF7DFFF114D9A +:1075A0001148E8601148A8601148A861361F37608B +:1075B0002F46FFF7D3FF083E0221316077600D4F61 +:1075C000FDF716F9083E0121316077600A4FFDF79B +:1075D0000FF900BD0000004000040000640100003D +:1075E00011110000000400400002000054010000DE +:1075F000111000009C7100083C73000860710008C5 +:10760000C652434F554E54200348056803494D1B4D +:10761000361F37602F46704734000240FFFF0000DE +:1076200080740008CB52434F554E54434C45415251 +:10763000044D002028600448044908603120286077 +:107640007047000030000240FFFF0000340002409D +:10765000BC730008C64C434F554E54200348056880 +:1076600003494D1B361F37602F46704748000240C4 +:10767000FFFF0000DC700008CB4C434F554E5443D5 +:107680004C454152044D00202860044804490860DC +:10769000312028607047000044000240FFFF0000D6 +:1076A0004800024044710008C8444D41494E4954C5 +:1076B00033202020044D0548A8630548E86300B541 +:1076C000FFF7E0FF00BD0000000002402448014039 +:1076D00000000008A8760008C8444D41494E4954AE +:1076E00034202020044D0548E8640548286500B58D +:1076F000FFF79EFF00BD000000000240244801404B +:1077000000000008B0720008CB434C454152434F83 +:10771000554E545300B5FFF7B5FFFFF789FF00BD85 +:10772000D8760008CA5246414E414C4F4755452035 +:1077300000B500BFF9F7BFFE08000000787500082B +:10774000C54C494E4530202000B500BFF9F7B3FEC7 +:107750000800000024770008CA5257414E414C4FA0 +:107760004755452000B500BFF9F7A5FE1000000001 +:1077700040770008C54C494E4531202000B500BF78 +:10778000F9F799FE10000000AC700008CA4C4641A1 +:107790004E414C4F4755452000B500BFF9F78BFED1 +:1077A0002000000074770008C54C494E4532202067 +:1077B00000B500BFF9F77FFE200000008C770008BD +:1077C000CA4C57414E414C4F4755452000B500BF6C +:1077D000F9F771FE40000000A8770008C54C494E3B +:1077E0004533202000B500BFF9F765FE40000000DA +:1077F00000760008C7414E414C4F47537047000088 +:1078000078760008C64144435F43522000B500BF6C +:10781000F9F751FE0824014048740008C34144436D +:1078200000B500BFF9F747FE0024014018750008B5 +:10783000C8414443444F4E453F2020200648056838 +:1078400004200540002D01D0002501E001256D42F6 +:10785000361F37602F4670470824014054760008D1 +:10786000CB57414954414443444F4E4500B500BFB6 +:10787000FFF7E4FF002F80CEFAD000BD607800084B +:10788000CB5741495443414C444F4E4500B500BF8E +:1078900002480568002DFBD100BD01B40824014059 +:1078A00058770008CB414443454E41424C45443F44 +:1078B0000348056801200540361F37602F46704792 +:1078C00008240140F4770008C74144435F43414C1A +:1078D00000B5FFF7EDFF002F80CE02D00220064951 +:1078E0000860FFF7D3FF00200349086003480249FE +:1078F0000860FFF7CBFF00BD0824014000000080B6 +:1079000024730008C9414443454E41424C45202060 +:1079100000B5FFF7DDFF01200149086000BD000050 +:107920000824014098730008C95741495452454101 +:107930004459202000B500BF0248056801200540D9 +:10794000FAD000BD0024014030780008C84144430B +:107950005354415254202020024904200D6805430D +:107960000D6070470824014028790008C7494E4936 +:107970005441444300B5FFF741FFFFF7A9FFFFF76C +:10798000C7FFFFF7D7FF044D0020E86003482861D8 +:107990000420686100BD0000002401400000008058 +:1079A000C8780008C5434853454C202000B500BFA7 +:1079B000F9F781FD28240140A4790008C741444318 +:1079C0004441544100B500BFF9F775FD4024014022 +:1079D00008770008C62841544F442920064904204E +:1079E0000D6805430D6000B5FFF740FF03480568CB +:1079F000361F37602F4600BD082401404024014057 +:107A000064740008CA4144434348414E4E454C20EB +:107A100001490F6080CE704728240140FC720008A5 +:107A2000C441544F4420202000B5FFF7F1FFFFF779 +:107A3000D5FF00BD80780008C9494E4954535455BC +:107A40004646202000B5FFF7BFFCFFF79BFDFFF780 +:107A500031FEFFF747FEFFF72DFDFFF78BFF00BD5F +:107A600050750008CA494E4954414C4C492F4F208B +:107A700000B5FFF7E7FF361F37600E4FFCF7A8FE93 +:107A8000361F37600C4FFCF7A3FE361F37600B4FD5 +:107A9000FCF7D0FE361F3760094FFCF7CBFE361FD0 +:107AA0003760084FFCF794FE361F3760064FFCF72F +:107AB0008FFE00BD14730008C4710008EC7100084B +:107AC000EC72000860730008AC730008000000004E +:107AD000707A0008BC790008C652502D454E4420EB +:107AE00000B500BFF9F7E7FC4C360020247600080B +:107AF000CA534554434F4E534F4C45205D46EF64A7 +:107B00005D46AF6480CE704704790008C545524198 +:107B100053452020361F3760002700B5F9F7D0F90C +:107B200000BD0000B80000000000002000000000C0 +:107B300000000000000000008005000800000000B8 +:107B4000E80000000000000000000000000000004D +:107B500000000000000000001800002000000000ED +:107B60000000000000000000000000000000000015 +:107B70008005000800000000981E000810000000AA +:107B80006C790008DC770008387A0008647A00080D +:107B90001C780008207A0008C077000804780008E4 +:107BA000D87A00084C7900080C7B0008047A000899 +:107BB000A4780008F07A0008D4790008AC740008B2 +:107BC000000000004028000800000000CC7A0008F7 +:107BD0000100000000000000000000001058000834 +:107BE000003801400000000000000000000000001C +:00000001FF diff --git a/mwmouse/sources/WOW.img b/mwmouse/sources/WOW.img Binary files differ. diff --git a/mwmouse/sources/XREF.xrf b/mwmouse/sources/XREF.xrf Binary files differ. diff --git a/mwmouse/sources/dump.fth b/mwmouse/sources/dump.fth @@ -0,0 +1,89 @@ +\ dump.fth - DUMP and friends + +(( +Copyright (c) 2005, 2013 +MicroProcessor Engineering +133 Hill Lane +Southampton SO15 5AF +England + +tel: +44 (0)23 8063 1441 +fax: +44 (0)23 8033 9691 +net: mpe@mpeforth.com + tech-support@mpeforth.com +web: www.mpeforth.com + +From North America, our telephone and fax numbers are: + 011 44 23 8063 1441 + 011 44 23 8033 9691 + + +To do +===== + +Change history +============== +20131220 SFP001 MSP430 Lite conversion. +)) + +\ *************** +\ *! debugtools +\ *T Debug tools +\ *************** +\ *P Some simple debug tools can be found in *\i{dump.fth}. + +: .ASCII \ b -- + $07F AND DUP $020 $07F WITHIN 0= + IF DROP $02E ENDIF EMIT +; + +: .BYTE \ n -- + base @ >r hex + 0 <# # # #> TYPE + r> base ! +; + +: .WORD \ n -- + base @ >r hex + 0 <# # # # # #> TYPE + r> base ! +; + +: .DWORD \ n -- + base @ >r hex + 0 <# # # # # [char] : hold # # # # #> TYPE + r> base ! +; + +: dump \ addr len -- +\ *G Display the given block of memory in hex and ASCII. + BASE @ -rot HEX bounds ?DO \ get limits + CR i .DWORD i $010 bounds \ print address + do space i c@ .BYTE loop \ print byte + 2 SPACES I $010 bounds \ gap + DO I c@ .ASCII LOOP \ ascii o/p + key? ?LEAVE \ quit or halt + $010 +LOOP \ until done + BASE ! CR \ restore base +; + +: pdump \ addr len -- +\ *G Display the given block of memory as hex 32 bit words. + BASE @ -rot HEX + swap -4 and swap bounds ?DO \ get limits + CR i .DWORD i $010 bounds \ print address + do space i @ .DWORD cell +loop \ display word + key? ?LEAVE \ quit or halt + $010 +LOOP \ until done + BASE ! CR \ restore base +; + +: .S \ i*x -- i*x +\ *G Display the stack contents + CR ." -- " + DEPTH ?DUP IF + 0 swap 1- do + i pick u. ( key? ?LEAVE ) + -1 +loop + ENDIF +; diff --git a/mwmouse/sources/gpioSTM32F0xx.fth b/mwmouse/sources/gpioSTM32F0xx.fth @@ -0,0 +1,286 @@ +\ gpioSTM32F0xx.fth - easy access to STM32F0 GPIO pins. + +(( +Copyright (c) 2011, 2014 +MicroProcessor Engineering +133 Hill Lane +Southampton SO15 5AF +England + +tel: +44 (0)23 8063 1441 +fax: +44 (0)23 8033 9691 +email: mpe@mpeforth.com + tech-support@mpeforth.com +web: http://www.mpeforth.com +Skype: mpe_sfp + +From North America, our telephone and fax numbers are: + 011 44 23 8063 1441 + 011 44 23 8033 9691 + 901 313 4312 (North American access number to UK office) + + +To do +===== + +Change history +============== +20120326 SFP004 Conversion for STM32F0. +20120210 SFP003 Corrected ISFUNCTION. +20120130 SFP002 Refactored, added pin speed. +20111201 SFP001 Adapted from Kinetis version. +)) + +only forth definitions +decimal + +\ =========== +\ *> drivers +\ *S STM32 GPIO utilities +\ =========== +\ *P The code in *\i{CortexLite\Drivers\gpioSTM32.fth} provides +\ ** utility words for accessing GPIO pins on a bit by bit basis +\ ** for the STM32 CPUs. +\ ** The code is written for ease of use rather than performance. + + +\ ******************** +\ *N Defining I/O pins +\ ******************** +\ *P FIO/GPIO acess is defined using a bit number. Bits 0..31 form +\ ** P0.0 to P0.31, bits 32..63 form P1.0 to P1.31 and so on. +\ ** Although ST name their ports from A, here we number +\ ** them from 0. Note also that ST usually only provide 16 +\ ** I/O bits per port. Later we define constants for the port +\ ** numbers. + +$0400 equ /Port \ -- u +\ *G Separation in memory between GPIO port base addresses. +#10 equ PortShift \ -- u +\ *\fo{/Port} as a shift. + +target-only +: PIO: \ port# bit# -- ; -- struct +\ *G Define a port I/O bit by name. For example +\ *C 3 12 pio: LED1 \ PD.12 +\ *C PD 12 pio: LED1 \ PD.12 +\ *P defines an I/O bit on GPIOD, bit 12 as *\fo{LED1}. At run +\ ** time, the I/O bit structure is returned. + create \ -- port# bit# + over PortShift lshift _GPIOA + , \ pins base + 1 over lshift , \ bit mask + swap 5 lshift or , \ I/O bit number +; +host&target +interpreter +: PIO: \ port# bit# -- ; -- struct + create + over PortShift lshift _GPIOA + , \ pins base + 1 over lshift , \ bit mask + swap 5 lshift or , \ I/O bit number +; +target + +\ *P Define the ports as constants. So that we can use names +\ ** rather than numbers, e.g. +\ *C PD 12 pio: LED1 \ PD.12 +\ *[ +0 constant PA +1 constant PB +2 constant PC +3 constant PD +4 constant PE +5 constant PF +\ *] + + +\ ****************** +\ *N GPIO pin access +\ ****************** + +: setPin \ struct -- +\ *G Set the pin high. + 2@ gpioBSRRL + w! ; + +: clrPin \ struct -- +\ *G Set the pin low. + 2@ gpioBSRRH + w! ; + +: getPin \ struct -- 0/1 +\ *G Read the pin state. + 2@ gpioIDR + @ and 0<> 1 and +; + + +\ *********************** +\ *N IO pin configuration +\ *********************** + +internal +: mode>mask \ mode -- modemask +\ Repeats the two bit mask 16 times. + 3 and + dup 2 lshift or \ 4 bits + dup 4 lshift or \ 8 bits + dup 8 lshift or \ 16 bits + dup #16 lshift or \ 32 bits +; + +: >2bitmask \ bit# -- bitmask +\ Converts a bit number 0..15 to a 2 bit mask for a 32 bit word, + $0F and 2* $03 swap lshift ; + +: mode>valmask \ mode bit# -- val bitmask +\ Convert a two bit mode and bit number (0..15) into a value and +\ bitmask to use with setMask. + swap mode>mask \ -- bit# modemask + swap >2bitmask \ -- modemask bitmask + tuck and swap \ -- val bitmask +; + +: ms>vba \ mode struct -- val bitmask *gpio +\ Given a two bit mask and a structure, return the value, bitmask, +\ and base address for a SetMask operation. + tuck 2 cells + @ $0F and \ -- struct mode bit# + mode>valmask \ -- struct val bitmask + rot @ \ -- val bitmask *gpio +; +external + +: isPinMode \ mode struct -- +\ *G Sets the GPIO mode for a pin. Use with the constants below. + ms>vba gpioMODER + setMask \ set pin's bits in MODER +; + +internal +: af#>mask \ mode -- afbits +\ Repeats a four bit mask 8 times. + $0F and + dup 4 lshift or \ 8 bits + dup 8 lshift or \ 16 bits + dup #16 lshift or \ 32 bits +; + +: >4bitmask/off \ bit# -- bitmask offset +\ Converts a bit number 0..15 to a 4 bit mask and offset for a +\ 32 bit word, + dup 7 and 4* $0F swap lshift \ -- bit# mask + swap $08 and 1 rshift \ -- mask offset +; + +: af#>valmask \ af# bit# -- val mask offset +\ Convert a 4 bit alternate function number and bit number +\ (0..15) into a value and bitmask to use with setMask. + swap af#>mask \ -- bit# afmask + swap >4bitmask/off \ -- afmask bitmask offset + >r tuck and swap r> \ -- val bitmask offset +; +external + +\ *P Pins can be in one of four modes, 0..3. + +0 constant InputMode \ -- mode# +\ *G The pin is an input. +1 constant OutputMode \ -- mode# +\ *G The pin is an output. +2 constant AFmode \ -- mode# +\ *G The pin is for one of the alternate function modes. +3 constant AnalogMode \ -- mode# +\ *G The pin is an analogue pin. + +: isInput \ struct -- +\ *G Set the pin to GPIO mode and input. + InputMode swap isPinMode +; + +: isOutput \ struct -- +\ *G Set the pin as an output. + OutputMode swap isPinMode +; + +: isFunction \ af# struct -- +\ *G Set the pin to be used with one of the alternate functions. + >r + AFmode r@ isPinMode \ uses an alternate function. + r@ 2 cells + @ $0F and af#>valmask \ -- val mask offset ; -- R: struct + r> @ gpioAFRL + + setMask \ set bits in AFRL or AFRH +; + +: isAnalog \ struct -- +\ *G Set the pin as an analog pin. + AnalogMode swap isPinMode +; + +: isPinOD \ 0/1 struct -- +\ *G Enable (nz) or disable (0) the open drain driver. + swap if + 2@ gpioOTYPER + or! + else + 2@ gpioOTYPER + bic! + endif +; + +: isPinPuPd \ mode struct -- +\ *G Sets the pull up/down for a pin. + ms>vba gpioPUPDR + setMask \ set pin's bits in PUPDR +; + +: NotPulled \ struct -- +\ *G No pull up or pull down. + 0 swap isPinPuPd ; + +: PulledUp \ struct -- +\ *G Enable the pin pull up resistor. + 1 swap isPinPuPd ; + +: PulledDown \ struct -- +\ *G Enable the pin pull down resistor. + 2 swap isPinPuPd ; + +: isPinSpeed \ mode struct -- +\ *G Sets the output speed for a pin according to the constants +\ ** below. + ms>vba gpioOSPEEDR + setMask \ set pin's bits in PUPDR +; + +0 constant LowSpeed \ -- mask +\ *G The default is 2MHz, low speed. +1 constant MediumSpeed \ -- mask +\ *G 10 MHz, medium speed. +3 constant HighSpeed \ -- mask +\ *G 50 MHz, fast speed. + +: initGPIO \ -- +\ *G Enable clocks to all GPIO ports and take them out of reset. +\ ** performed in the cold chain. + $007E:0000 _RCC 2dup rccAHBen + or! rccAHBrst + bic! +; +' initGPIO atCold + + +\ ****************************************** +\ *N Test code for STM32F072 Discovery board +\ ****************************************** + +0 [if] + +pa 8 pio: PA8 \ -- struct +\ *G Structure for pin PA8, which can be used as the oscillator +\ ** output MCO. + +: init-mco \ -- +\ *G Initialise PA8 as the MCO output. + $0400:0000 $FF00:0000 _RCC rccCFGR + setMask \ MCO = system clock + 0 PA8 isFunction \ AF0 + PA8 notPulled \ push-pull + HighSpeed PA8 isPinSpeed \ 50 MHz +; + +[then] + + +\ ====== +\ *> ### +\ ====== + +decimal diff --git a/mwmouse/sources/include.fth b/mwmouse/sources/include.fth @@ -0,0 +1,172 @@ +\ include.fth - INCLUDE using AIDE as the file server. + +(( +Copyright (c) 1991..2004, 2005, 2013 +MicroProcessor Engineering +133 Hill Lane +Southampton SO15 5AF +England + +tel: +44 (0)23 8063 1441 +fax: +44 (0)23 8033 9691 +net: mpe@mpeforth.com + tech-support@mpeforth.com +web: www.mpeforth.com + +From North America, our telephone and fax numbers are: + 011 44 23 8063 1441 + 011 44 23 8033 9691 + +To do +===== +Permit file nesting. + +Change history +============== +20131219 MPE007 Updated for Lite compiler. +20051105 MPE006 Force interpretation on error. +20040505 MPE005 Modified for AIDE 2.500 onwards. +20021004 SFP004 Refactored to use CATCH/THROW +20020917 SFP003 Refactored to reduce size +20000530 SFP002 Converted to v6.1 targets +19990509 SFP001 Rewritten for AIDE/PowerTerm. + Removed support for USE +First Release: 29/04/91 +)) + +\ =========== +\ *! includeaide +\ *T Compile source code from AIDE +\ =========== +\ *P The file *\i{include.fth} provides support for +\ ** compiling a source file from the AIDE server. + +decimal + +$01 equ START +$06 equ ACK +$15 equ NAK + +$12 equ ^R \ read command code +$17 equ ^W \ write +$15 equ ^U \ $using +$01 equ ^A \ use +$06 equ ^F \ $from +$05 equ ^E \ error + +Synonym Ser-Key key +Synonym Ser-Key? key? +Synonym Ser-Emit emit + +variable disk-error + +: end-load \ -- ; switch back to keyboard input +\ *G This word is automatically performed at the end of a download +\ ** to tidy up the comms. + xon/xoff off \ turn off handshaking + echoing on \ turn echoing back on +; + +internal + +: WAIT-ACK ( -- ; wait for ACK character at the end of part of a transfer ) + begin + ser-key \ read a char from serial line + ack = \ until it is an ACK + until +; + +: WAIT-ACK/NACK ( -- flag ; wait for NACk or ACK, return true for NACK ) + 0 + begin + drop \ drop old flag + ser-key dup nak = tuck \ -- t/f char t/f + swap ack = or \ -- t/f t/f' + until +; + +: SEND-BLOCK# ( n -- ; send block number to server as two bytes ) + 0 #256 um/mod swap \ split into high & low bytes + ser-emit ser-emit \ send block no., low byte first + wait-ack \ wait for ack +; + +: SYNCH-TO-HOST ( -- ; sync host to us ) + begin \ sync. + ser-key \ get a char + start = \ receive bytes until start code + until + begin + ser-key? \ while there are keys still + while + ser-key \ read them + drop \ and drop them + repeat + ack ser-emit \ acknowledge as end of synch. +; + +: SEND$ ( $addr ^char -- ; send a counted string and trigger to host ) + ser-emit \ send code + synch-to-host \ synchronise + dup 1+ swap \ addr+1 as base for reading + c@ dup send-block# \ send length of string + 0 \ length - 0 + do + dup i + c@ \ get char at i+$addr + ser-emit \ send char + loop + drop \ drop spare address + ack ser-emit \ send ack to complete transfer + wait-ack/nack disk-error ! \ get status response +; + +: file-error \ n -- +\ *G Handle an error when a file is being *\fo{INCLUDE}d. + ^e ser-emit \ trigger host error + CR ." Error # " . SPACE here $. CR \ show error + end-load \ clean up +; + +: $include \ $addr -- ; compile host file, counted string +\ *G Given a counted string representing a file name, compile +\ ** the file from AIDE. + ^f send$ \ send file name + -1 send-block# \ send last-p# - legacy + 1 send-block# \ send first-p# - legacy + synch-to-host \ synchronise + echoing off \ not echoing + xon/xoff on \ initiate handshaking +[ blocks? ] [if] + blk off +[then] + 0 <source> ! [compile] [ \ set up + begin + query \ get user input + ['] interpret catch ?dup if \ interpret line + file-error \ display error + s0 @ sp! \ clean data stack + [compile] [ \ force interpretation ; MPE006 + then + echoing @ + until \ do next line +; + +external + +: include \ "<filename>" -- ; load file from host +\ *G Compile a file across the serial line from the AIDE file server. +\ ** Use in the form: +\ *C include <filename> +\ *P The filename extension must be supplied. + bl word \ get file name + dup count upper \ convert to upper case + $include \ compile from file +; + + +\ ====== +\ *> ### +\ ====== + +decimal + diff --git a/mwmouse/sources/kernel72lite.fth b/mwmouse/sources/kernel72lite.fth @@ -0,0 +1,1877 @@ +\ MPE High level ANS kernel for embedded systems + +(( +Released for use with the MPE Forth Cross Compiler by: +and copyright (c) 1998-2004, 2006, 2008, 2010, 2012, 2013 + +MicroProcessor Engineering +133 Hill Lane +Southampton SO15 5AF +England + +tel: +44 (0)23 8063 1441 +fax: +44 (0)23 8033 9691 +net: mpe@mpeforth.com + tech-support@mpeforth.com +web: www.mpeforth.com + + +To do +===== +Factor COLD into initialisation and Forth entry. + +Remove in-place usage of UPPER because it can cause writes to Flash. +UCMOVE may be useful. + +Change NEXT-CASE to be compatible with VFX Forth. + +Remove uses of PAD where possible. + +Change error codes to ANS codes. + + +Change history +============== +20140122 SFP016 EMPTY ends with a reboot. +20131219 SFP015 Removed WIDTH. Added ORG. + Rewrote NUMBER? and friends. +20120825 SFP014 Converted to Lite form. +20101215 SFP013 Made >NUMBER case-insensitive. +20100623 MPE012 Changed POSTPONE to be smaller and less sensitive + to target architecture. +20090704 MPE011 Improved overlap detection in MOVE so that we can + make better use of optimised CMOVEs, e.g. ARM. +20081218 SFP010 Removed [IODEV and IODEV]. + Added [IO and IO]. +20060307 MPE009 Added compiler macro for >THREADS. +20040401 MPE008 Added NEXTCASE. +20040225 MPE007 Bulletproofed PLACE. +20040218 MPE006 Added SETCONSOLE for 32 bit systems. +20030320 SFP005 Added FLUSHKEYS for 32 bit tagets. + Modified ACCEPT and HALT? to ignore LF characters. +20020910 SFP004 Removed ERROR and ?ERROR +20020704 SFP003 Corrected REPEAT - how did this survive so long? +20011112 SFP002 Unmarked: start of DOCGEN documentation - an ongoing + process. +20000614 SFP001 Unmarked reordering to reduce forward refs and size. +)) + + +\ ========= +\ *! kernel72lite +\ *T High level kernel - kernel72lite.fth. +\ ========= +\ *P The Forth kernel words documented here are entirely written +\ ** in high-level Forth. The kernel is reduced in size to match +\ ** available code size in small devices. + +only forth definitions +decimal + +\ ----------------- +\ character equates +\ ----------------- + +$07 equ ABELL \ sound +$08 equ BSIN \ back space from key +$7F equ DELIN \ delete from key +$08 equ BSOUT \ back space for emit +$09 equ ATAB \ tab +$0D equ ACR \ carriage return +$0A equ ALF \ line feed +$0C equ FFEED \ form feed +$20 equ ABL \ space +$2E equ ADOT \ . + + +\ ***************** +\ *S User variables +\ ***************** + +internal +variable next-user \ -- addr +\ *G Next valid offset for a *\fo{USER} variable created by *\fo{+USER}. + next-user off +external + +interpreter +: +user-offset \ -- offset ; user offset of next +USER allocation + next-user @ +; + +: +user \ size -- +\ *G Used in the cross compiler to create a *\fo{USER} variable +\ ** *\i{size} bytes long at the next available offset and +\ ** updates that offset. + next-user @ user + next-user +! +; +target + +tcb-size +user SELF \ task identifier and TCB +\ *G When multitasking is installed, +\ ** the task control block for a task occupies *\fo{TCB-SIZE} bytes at +\ ** the start of the user area. Thus the user area pointer +\ ** also acts as a pointer to the task control block. ++user-offset equ s0-offset +cell +user S0 \ base of data stack +\ *G Holds the initial setting of the data stack pointer. +\ ** N.B. *\fo{S0}, *\fo{R0}, *\fo{#TIB} and *\fo{'TIB} must be +\ ** defined in that order. ++user-offset equ r0-offset +cell +user R0 \ base of return stack +\ *G Holds the initial setting of the return stack pointer. +cell +user #TIB \ number of chars currently in TIB +\ *G Holds the number of characters currently in *\fo{TIB}. +cell +user 'TIB \ address of TIB +\ *G Holds the address of *\fo{TIB}, the terminal input buffer. +cell +user >IN \ offset into TIB +\ *G Holds the current character position being processed in the +\ ** input stream. +cell +user XON/XOFF \ true if XON/XOFF protocol in use +\ *G True when console is using XON/XOFF protocol. +cell +user ECHOING \ true if echoing +\ *G True when console is echoing input characters. +cell +user OUT \ number of chars displayed on current line +\ *G Holds the number of chars displayed on current output line. +\ ** Reset by CR. +\ ** internal +cell +user BASE \ current numeric conversion base +\ *G Holds the current numeric conversion base. +\ ** INTERNAL. +cell +user HLD \ used during number formatting +\ *G Holds data used during number formatting. +\ ** INTERNAL. +cell +user HANDLER \ used in catch and throw +\ *G Holds the address of the previous exception frame. +external +cell +user DPL \ position of double number character id +\ *G Holds the number of characters after the double number indicator +\ ** character. *\fo{DPL} is initialised to -1, which indicates a +\ ** single number, and is incremented for each character after +\ ** the separator. +cell +user OPVEC \ output vector +\ *G Holds the address of the I/O vector for the current output device. +cell +user IPVEC \ input vector +\ *G Holds the address of the I/O vector for the current input device. +internal +cell +user 'AbortText \ Address of text from ABORT" +\ *G Set by the run-time action of *\fo{ABORT"} to hold the address +\ ** of the counted string used by *\fo{ABORT" <text>"}. +external +32bit? [if] \ size of hold buffer + #68 \ depends on stack width in bits +[else] + #34 +[then] +dup next-user +! equ PICNUMSIZE +#80 chars dup +user PAD +\ *G A temporary string scratch buffer. + equ PADSIZE + +cr ." Kernel USER area size is " next-user @ . + + +\ ************** +\ *S System data +\ ************** + +\ ============ +\ *N Constants +\ ============ + +$20 constant BL \ -- char +\ *G A blank space character. + +$40 equ C/L \ characters/line for display functions + +$11 equ XON \ XON for flow control +$13 equ XOFF \ XOFF for flow control + +2 equ #VOCS \ maximum number of vocabularies in search order +#VOCS cells equ VSIZE \ maximum size of search order area CONTEXT + + +\ ============ +\ *N System variables and data +\ ============ +\ *P Note that *\fo{FENCE}, *\fo{DP}, *\fo{RP} and *\fo{VOC-LINK} +\ ** must be declared in that order. + +ihere equ DefStart \ --addr +\ +G Start address of saved Forth state. + +variable FENCE \ -- addr +\ *G End of the protected dictionary. +variable DP \ -- addr +\ *G Flash dictionary pointer. +variable RP \ -- addr +\ *G RAM dictionary pointer. +internal +variable VOC-LINK \ -- addr +\ *G An INTERNAL variable that links vocabularies. +\ ** INTERNAL. +variable CSP \ -- addr +\ +G Preserved stack pointer for compile time error checking. +\ +* INTERNAL. +external +variable xDP DP xDP ! \ -- addr +\ *G Holds the address of the current dictionary pointer, +\ ** *\fo{DP} or *\fo{RP}. +internal +variable STATE \ -- addr +\ +G Interpreting=0 or compiling=-1. +variable CURRENT \ -- addr +\ +G Vocabulary/wordlist in which to put new definitions +variable CONTEXT \ -- addr +\ +G Search order array. + vsize cell - allot-ram \ search order array +external +variable LAST \ -- addr +\ *G Points to name field of last definition +internal +defer start-action \ -- +\ +G The initial action of an application. + assign noop to-do start-action +vocabulary FORTH +\ +G The standard general purpose vocabulary. INTERNAL. +' forth >body @ equ FORTH-WORDLIST \ -- wid +FORTH-WORDLIST @ 1+ cells equ /Forth-Wordlist \ -- len + +ihere DefStart - equ /DefStart +\ The initial kernel Forth state is saved in the first INFO sector. +\ The application Forth state is saved in the second info sector. + +variable PrevName \ -- addr +\ +G Holds the name field of the previous word in the thread +\ +* between *\fo{HIDE} and *\fo{REVEAL} + +external + + +\ ======================== +\ *S Vectored I/O handling +\ ======================== + +\ =============== +\ *N Introduction +\ =============== +\ *P The standard console Forth I/O words (*\fo{KEY?}, *\fo{KEY}, +\ ** *\fo{EMIT}, *\fo{TYPE} and *\fo{CR}) can be used with any I/O +\ ** device by placing the address of a table of xts in the +\ ** *\fo{USER} variables *\fo{IPVEC} and *\fo{OPVEC}. *\fo{IPVEC} +\ ** (input vector) controls the actions of *\fo{KEY?} and *\fo{KEY}, +\ ** and *\fo{OPVEC}(output vector) controls the actions of *\fo{EMIT}, +\ ** *\fo{TYPE} and *\fo{CR}. +\ ** Adding a new device is matter of writing the five primitives, +\ ** building the table, and storing the address of the table in +\ ** the pointers *\fo{IPVEC} and *\fo{OPVEC} to make the new +\ ** device active. Any initialisation must be performed before +\ ** the device is made active. + +\ *P Note that for the output words (*\fo{EMIT}, *\fo{TYPE} and +\ ** *\fo{CR}) the *\fo{USER} variable *\fo{OUT} is handled in the +\ ** kernel before the funtion in the table is called. + +\ ========================== +\ *N Building a vector table +\ ========================== +\ *P The example below is taken from an ARM implementation. +\ *E create Console1 \ -- addr +\ ** ' serkey1i , \ -- char +\ ** ' serkey?1i , \ -- flag +\ ** ' seremit1 , \ char -- +\ ** ' sertype1 , \ c-addr len -- +\ ** ' serCR1 , \ -- +\ ** +\ ** Console1 opvec ! Console1 ipvec ! + +\ ==================== +\ *N Generic I/O words +\ ==================== + +(( \ easier to expand +: ipfunc \ n -- ; i*x -- j*x + create + cells , + does> + @ ipvec @ + @ execute +; + +: opfunc \ n -- ; i*x -- j*x + create + cells , + does> + @ opvec @ + @ execute +; + +0 ipfunc KEY \ -- char ; receive char +1 ipfunc KEY? \ -- flag ; check receive char +2 opfunc EMIT \ -- char ; display char +3 opfunc TYPE \ caddr len -- ; display string +4 opfunc CR \ -- ; display new line +5 opfunc TYPEC \ caddr len -- ; display string in code space (Harvard only) +)) + +: key \ -- char ; receive char +\ *G Wait until the current input device receives a character and +\ ** return it. + ipvec @ ( 0 cells + ) @ execute ; +: KEY? \ -- flag ; check receive char +\ *G Return true if a character is available at the current input +\ ** device. + ipvec @ cell+ @ execute ; +: EMIT \ -- char ; display char +\ *G Display char on the current I/O device. *\fo{OUT} is incremented +\ ** before executing the vector function. + 1 out +! + opvec @ [ 2 cells ] literal + @ execute ; +: TYPE \ caddr len -- ; display string +\ *G Display/write the string on the current output device. +\ ** *\i{Len} is added to *\fo{OUT} before executing the vector +\ ** function. + dup out +! + opvec @ [ 3 cells ] literal + @ execute ; +: CR \ -- ; display new line +\ *G Perform the equivalent of a CR/LF pair on the current output +\ ** device. *\fo{OUT} is zeroed. before executing the vector +\ ** function. + out off + opvec @ [ 4 cells ] literal + @ execute ; + +: SPACE \ -- +\ *G Output a blank space (ASCII 32) character. + bl emit +; + +: SPACES \ n -- +\ *G Output 'n' spaces, where 'n' > 0. +\ ** If 'n' < 0, no action is taken. + 0 max 0 ?do space loop +; + + +\ ************************ +\ *S Laying data in memory +\ ************************ +\ *P These words are used to control and place data in memory. +\ ** Note that the Forth system compiles headers and code into +\ ** Flash memory. + +: HERE \ -- addr +\ *G Return the current dictionary pointer which is the first +\ ** address-unit of free space within the system. + xdp @ @ +; + +: ORG \ addr -- +\ *G Set the current dictionary pointer. + xdp @ ! +; + +: ALLOT \ n -- +\ *G Allocate N address-units of data space from the current value of +\ ** *\fo{HERE} and move the pointer. + xdp @ +! +; + +: RHERE \ -- addr +\ *G Return the current RAM dictionary pointer. + rp @ +; + +: RALLOT \ n -- +\ *G Allocate n bytes of RAM from *\fo{RHERE} and move the pointer. + rp +! +; + +: ROM \ -- +\ *G *\fo{HERE}, *\fo{ORG}, *\fo{ALLOT}, *\fo{,} and friends, are +\ ** set to use the Flash dictionary pointer. This is the default. + DP xDP ! +; + +: RAM \ -- +\ *G *\fo{HERE}, *\fo{ORG} and *\fo{ALLOT} are set to use +\ ** the RAM dictionary pointer. Use in the form: +\ *C RAM ... ROM + RP xDP ! +; + +internal +: [ROM \ -- x +\ +G Force ROM and save state. + xDP @ ROM +; + +: ROM] \ x -- +\ +G Restore ROM/RAM state. + xDP ! +; + +: ROM? \ -- flag +\ +G True if ROM set. + xDP @ DP = +; +external + +aligning? [if] +[undefined] aligned [if] +: aligned \ addr -- addr' +\ *G Given an address pointer this word will return the next +\ ** *\fo{ALIGNED} address subject to system wide alignment +\ ** restrictions. + [ cell 1- ] literal + + [ cell negate ] literal and +; +[then] + +: ALIGN \ -- +\ *G *\fo{ALIGN} dictionary pointer using the same rules as +\ ** *\fo{ALIGNED}. + here aligned org +; +[else] +: aligned \ addr -- addr' ; NOOP on this system +; immediate + +: align \ -- ; force alignment if required - NOOP on this system +; immediate + +compiler +: aligned ; +: align ; +target +[then] + +: , \ x -- +\ *G Place the CELL value X into the dictionary at *\fo{HERE} and +\ ** increment the pointer. + here !f cell allot +; + +32bit? [if] +: w, \ x -- +\ *G Place the 16 bit value X into the dictionary at *\fo{HERE} and +\ ** increment the pointer. + here w!f 2 allot +; +[then] + +: C, \ b -- +\ *G Place an 8 bit byte into the dictionary at *\fo{HERE} and +\ ** increment the pointer. Note that the STM32 Flash must be +\ ** programmed two bytes at a time, so you cannot repeatedly +\ ** use *\fo{C,} to program the Flash. + here c!f 1 allot +; + + +\ ************************ +\ *S Dictionary management +\ ************************ +\ *P The Forth header is laid out as below. The start and end of +\ ** the header are aligned at cell boundaries. +\ *E Link | Count | <name> +\ ** ---------------------- +\ ** Cell | Byte | n Bytes +\ ** ---------------------- +\ *D Link Also called LFA. This field contains the address of the +\ ** of the next count byte in the same thread of the wordlist. +\ *D Count/Ctrl The bottom five bits contain the length (0..31) +\ ** of the name in bytes. The top three bits are used +\ ** as follows: +\ *E Bit 7 Always set +\ ** Bit 6 Immediate bit (0=immediate) +\ ** Bit 5 Reserved +\ *D <name> A string of ASCII characters which make up the +\ ** name of the word.. + +compiler +: N>LINK \ a-addr -- a-addr' + cell- +; + +: LINK>N \ a-addr -- a-addr' + cell+ +; + +: >#threads ; \ -- ; compiler treats this as an immediate noop + +: >THREADS \ wid -- a-addr ; MPE009 + >#threads cell+ +; + +: >vocname + cell- +; + +: >VOC-LINK \ wid -- a-addr + 2 cells - +; + +: latest ( -- caddr ) Last @ ; + +target + +internal +: LATEST \ -- c-addr +\ +G Return the address of the name field of the last definition. + Last @ +; + +: HIDE \ -- +\ +G Unhook the last word from the current thread and save it +\ +* in *\fo{PrevName}. + Last @ dup PrevName ! \ save previous state + n>link @ Last ! \ use previous word +; +: REVEAL \ -- +\ +G Relink the hidden word. + PrevName @ Last ! +; +external + +-short-branches +: FIND \ c-addr -- c-addr 0|xt 1|xt -1 +\ *G Perform the *\fo{SEARCH-WORDLIST} operation on all wordlists +\ ** within the current search order. This definition takes a +\ ** counted string rather than a *\i{c-addr/u} pair. The counted +\ ** string is returned as well as the 0 on failure. + dup count upper \ make sure search text is upper case + dup c@ if \ if there is any search text + context vsize bounds \ for all word lists in search order: + do + dup count i @ search-wordlist \ search word list for text + ?dup if \ if text is found then bail out now + rot drop \ discard text address + unloop exit + then + cell +loop + then + 0 +; ++short-branches + +: .NAME \ nfa -- +\ *G Display a definition's name given an NFA. + count $1F and type space +; + +internal +: header, \ -- +\ +G Create a new header in the dictionary. INTERNAL + bl word count 2dup upper \ convert to upper case - must be in RAM +\ check for redefinitions + 2dup current @ search-wordlist \ see if name exists + if >name CR .NAME ." is redefined " then +\ form hash and create link + align \ force DP to even address + over c@ over + \ -- caddr len hash ; first char + count + current @ \ -- caddr len hash wid ; get wid = voc-cfa + dup >#threads @ 1- rot and cells \ mask for #threads + swap >threads + \ -- caddr len thread ; form thread addr + dup @ , \ lay old thread ; thread is in RAM + here swap ! \ -- caddr len ; link this word - here is new NFA +\ lay count + string + here last ! \ NFA of latest word + swap 1- swap 1+ \ -- caddr' len' ; step back to count byte + immheader @ \ see if word must be immediate + if $80 else $C0 endif \ -- caddr len mask + 2 pick bor! \ set bits 7 and 6 in count byte + immheader off + bounds ?do i w@ w, 2 +loop \ STM32 Flash has to be programmed in 16 bit units + align \ xt must be even +; + +: dataAddr, \ flag -- +\ +G Lay the data address for a defining word where the flag is +\ +* true for compiling to Flash. + if dp @ cell + else rp @ endif + , +; +external + +(( +: IMMEDIATE \ -- + \ *G Mark the last defined word as *\fo{IMMEDIATE}. Immediate + \ ** words will execute whenever encountered regardless of + \ ** *\fo{STATE}. + $40 last @ bbic! \ bit 6 := 0 +; +)) + + +\ --------------------- +\ *S String compilation +\ --------------------- + +internal +: (C") \ -- c-addr +\ *G The run-time action for *\fo{C"} which returns the address of and +\ ** steps over a counted string. +\ ** INTERNAL. + (") +; + +: (S") \ -- c-addr u +\ *G The run-time action for *\fo{S"} which returns the address and +\ ** length of and steps over a string. +\ ** INTERNAL. + (") count +; + +: (ABORT") \ i*x x1 -- | i*x +\ *G The run time action of *\fo{ABORT"}. +\ ** INTERNAL. + (") swap if + 'AbortText ! -2 throw + else + drop + then +; + +: (.") \ -- +\ *G The run-time action of *\fo{."}. +\ ** INTERNAL. + (") count type +; +external + + +\ ============================ +\ *S ANS words CATCH and THROW +\ ============================ +\ *P *\fo{CATCH} and *\fo{THROW} form the basis of all Forth error +\ ** handling. The following description of *\fo{CATCH} and +\ ** *\fo{THROW} originates with Mitch Bradley and is taken from +\ ** an ANS Forth standard draft. + +\ *P *\fo{CATCH} and *\fo{THROW} provide a reliable mechanism for +\ ** handling exceptions, without having to propagate exception +\ ** flags through multiple levels of word nesting. It is similar +\ ** in spirit to the "non-local return" mechanisms of many other +\ ** languages, such as C's *\b{setjmp()} and *\b{longjmp()}, +\ ** and LISP's *\b{CATCH} and *\b{THROW}. In the Forth context, +\ ** *\fo{THROW} may be described as a "multi-level EXIT", with +\ ** *\fo{CATCH} marking a location to which a *\fo{THROW} may return. + +\ *P Several similar Forth "multi-level EXIT" exception-handling +\ ** schemes have been described and used in past years. It is not +\ ** possible to implement such a scheme using only standard words +\ ** (other than *\fo{CATCH} and *\fo{THROW}), because there is no +\ ** portable way to "unwind" the return stack to a predetermined +\ ** place. + +\ *P *\fo{THROW} also provides a convenient implementation technique +\ ** for the standard words *\fo{ABORT} and *\fo{ABORT"}, allowing +\ ** an application to define, through the use of *\fo{CATCH}, the +\ ** behavior in the event of a system abort. + +\ ============== +\ *N Example use +\ ============== +\ *P If *\fo{THROW} is executed with a non zero argument, the +\ ** effect is as if the corresponding *\fo{CATCH} had returned it. +\ ** In that case, the stack depth is the same as it was just +\ ** before *\fo{CATCH} began execution. +\ ** The values of the i*x stack arguments could have been modified +\ ** arbitrarily during the execution of xt. In general, nothing useful +\ ** may be done with those stack items, but since their number is known +\ ** (because the stack depth is deterministic), the application may +\ ** *\fo{DROP} them to return to a predictable stack state. + +\ *P Typical use: +\ *E : could-fail \ -- char +\ ** KEY DUP [CHAR] Q = +\ ** IF 1 THROW THEN +\ ** ; +\ ** +\ ** : do-it \ a b -- c +\ ** 2DROP could-fail +\ ** ; +\ ** +\ ** : try-it \ -- +\ ** 1 2 ['] do-it CATCH IF +\ ** ( -- x1 x2 ) 2DROP ." There was an exception" CR +\ ** ELSE +\ ** ." The character was " EMIT CR +\ ** THEN +\ ** ; +\ ** +\ ** : retry-it \ -- +\ ** BEGIN +\ ** 1 2 ['] do-it CATCH +\ ** WHILE +\ ** ( -- x1 x2 ) 2DROP ." Exception, keep trying" CR +\ ** REPEAT ( char ) +\ ** ." The character was " EMIT CR +\ ** ; + +\ ========== +\ *N Gotchas +\ ========== +\ *P If a *\fo{THROW} is performed without a *\fo{CATCH} in place, +\ ** the system will/may crash. As the current exception frame +\ ** is pointed to by the *\fo{USER} variable *\fo{HANDLER}, +\ ** each task and interrupt handler will need a *\fo{CATCH} if +\ ** *\fo{THROW} is used inside it. + +\ *P You can no longer use *\fo{ABORT} as a way of resetting the +\ ** data stack and calling *\fo{QUIT}. *\fo{ABORT} is now defined +\ ** as *\fo{-1 THROW}. + +\ ============= +\ *N User words +\ ============= + +: CATCH \ i*x xt -- j*x 0|i*x n +\ *G Execute the code at XT with an exception frame protecting it. +\ ** *\fo{CATCH} returns a 0 if no error has occurred, otherwise it +\ ** returns the throw-code passed to the last *\fo{THROW}. + sp@ >r \ save PSP + lp@ >r \ save LP + handler @ >r \ and last handler + rp@ handler ! \ set new handler + execute \ this gets back if there's no THROW + r> handler ! \ restore previous handler + r> drop \ discard saved LP + r> drop \ discard saved PSP + 0 \ good exit = 0 +; + +: THROW \ k*x n -- k*x|i*x n +\ *G Throw a non-zero exception code n back to the last *\fo{CATCH} +\ ** call. If n is 0, no action is taken except to *\fo{DROP} n. + ?dup 0= if exit then \ zero = no throw + handler @ rp! \ restore last RSP + r> handler ! \ restore prev handler + r> lp! \ restore LP + r> swap >r \ n > RS + sp! drop r> \ restore DS + \ Returns to caller of CATCH +; + +: ?throw \ flag throw-code -- ; SFP017 +\ *G Perform a *\fo{THROW} of value throw-code if flag is non-zero, +\ ** otherwise do nothing except discard flag and throw-code. + swap + if throw else drop endif +; + +: ABORT" \ Comp: "ccc<quote>" -- ; Run: i*x x1 -- | i*x ; R: j*x -- | j*x +\ *G If x1 is non-zero at run-time, store the address of the +\ ** following counted string in *\fo{USER} variable *\fo{'ABORTTEXT}, +\ ** and perform *\fo{-2 THROW}. The text interpreter in *\fo{QUIT} +\ ** will (if reached) display the text. + ?comp compile (abort") ", +; IMMEDIATE + + +\ ******************************** +\ *S Formatted and unformatted i/o +\ ******************************** + +\ ======================= +\ *N Setting number bases +\ ======================= + +: HEX \ -- +\ *G Change current radix to base 16. + #16 base ! +; + +: DECIMAL \ -- +\ *G Change current radix to base 10. + #10 base ! +; + +compiler +: binary ( -- ) 2 base ! ; +target + +\ ================= +\ *N Numeric output +\ ================= + +: HOLD \ char -- +\ *G Insert the ASCII 'char' value into the pictured numeric output +\ ** string currently being assembled. + -1 hld +! hld @ c! +; + +(( +: SIGN \ n -- + \ *G Insert the ascii 'minus' symbol into the numeric output string if + \ ** 'n' is negative. + 0< if [char] - hold then +; +)) + +: # \ ud1 -- ud2 +( *G Given a double number on the stack this will add the next digit to ) +( ** the pictured numeric output buffer and return the next double ) +( ** number to work with. PLEASE NOTE THAT THE NUMERIC OP STRING IS ) +\ ** BUILT FROM RIGHT (l.s. ddigit) to LEFT (m.s. digit). + base @ mu/mod rot 9 over < + if 7 + then + [char] 0 + hold +; + +: #S \ ud1 -- ud2 +\ *G Keep performing *\fo{#} until all digits are generated. + begin # 2dup or 0= until +; + +: <# \ -- +( *G Begin definition of a new numeric output string buffer. ) + pad hld ! +; + +: #> \ xd -- c-addr u +\ *G Terminate defnition of a numeric output string. Return the +\ ** address and length of the ASCII string. + 2drop hld @ pad over - ; + +(( +: -TRAILING \ c-addr u1 -- c-addr u2 + \ *G Modify a string address/length pair to ignore any trailing spaces. + dup 0 ?do + 2dup + 1- c@ bl <> ?leave + 1- + loop +; +)) + +: D.R \ d n -- +\ *G Output the double number 'd' using current radix, right justified +\ ** to 'n' characters. Padding is inserted using spaces on the left +\ ** side. + >r swap over dabs <# + #s rot 0< + if [char] - hold then + #> +\ >r swap over dabs <# #s rot sign #> + r> over - spaces type +; + +: D. \ d -- +\ *G Output the double number 'd' without padding. + 0 d.r space +; + +: . \ n -- +\ *G Output the cell signed value 'n' without justification. + s>d d. +; + +: U. \ u -- +\ *G As with . but treat as unsigned. + 0 d. +; + +(( +: U.R \ u n -- + \ *G As with D.R but uses a single-unsigned cell value. + 0 swap d.r +; +)) + +: .R \ n1 n2 -- +\ *G As *\fo{D.R} but uses a single-signed cell value. + >r s>d r> d.r +; + + +\ ================ +\ *N Numeric input +\ ================ + +: +DIGIT \ d1 n -- d2 ; accumulates digit into double accumulator +\ *G Multiply d1 by the current radix and add n to it. +\ ** INTERNAL. + swap base @ um* drop \ accumulate into double + rot base @ um* d+ + ( 1 #d +! ) dpl @ 1+ \ incr. #digits, double? + if 1 dpl +! then \ yes, incr. after d.p. +; + +: >NUMBER \ ud1 c-addr1 u1 -- ud2 c-addr2 u2 ; convert all until non-digits +\ *G Accumulate digits from string c-addr1/u2 into double number ud1 +\ ** to produce ud2 until the first non-convertible character is found. +\ ** c-addr2/u2 represents the remaining string with c-addr2 pointing +\ ** the non-convertible character. The number base for conversion is +\ ** defined by the contents of *\fo{USER} variable *\fo{BASE}. +\ ** *\fo{>NUMBER} is case insensitive. + dup 0 ?do + over c@ upc base @ digit 0= ?leave \ convert char to digit, get out if failed + -rot 2>r +digit 2r> \ accumulate digit + 1 /string \ bump address, decr char count + loop +; + +internal + +: (INTEGER?) \ c-addr u -- d/n/- 2/1/0 +\ *G The guts of *\fo{INTEGER?} but without the base override handling. +\ ** See *\fo{INTEGER?} +\ ** INTERNAL. + -1 dpl ! over c@ [char] - = dup >r + if 1 /string endif + dup 1 < if 2drop 0 r> drop exit endif + 0 0 2swap begin \ -- d caddr len + >number dup + while + 1 /string case over 1- c@ + [char] : of endof \ ignore + [char] . of dpl off endof \ . for double numbers + drop 2drop 2drop 0 r> drop exit + endcase + repeat + 2drop +\ r> ?dnegate + r> if dnegate then + dpl @ 0< + if drop 1 else 2 endif +; + +: Check-Prefix \ addr len -- addr' len' +\ *G If any *\fo{BASE} override prefices or suffices are used +\ ** in the input string, set *\fo{BASE} accordingly and return +\ ** the string without the override characters. +\ ** INTERNAL. + Case over c@ \ get possible prefix char + [char] $ Of 1 /string hex Endof \ $ for HEX + [char] # Of 1 /string decimal Endof \ # for DECIMAL + [char] % Of 1 /string binary Endof \ % for BINARY + EndCase +; + +external + +(( +: number? \ $addr -- n 1 | d 2 | 0 +\ *G Attempt to convert the counted string at 'addr' to an integer. +\ ** The return result is either 0 for failed, 1 for a single-cell +\ ** return result followed by that cell, or 2 for a double return. +\ ** The ASCII number string supplied can also contain implicit radix +\ ** over-rides. A leading $ enforces hexadecimal, a leading # enforces +\ ** decimal and a leading % enforces binary. + count dup if \ if something to do + 2dup upper \ convert to upper case + base @ >r \ preserve current base + check-prefix (integer?) \ check prefix, convert to number + r> base ! \ restore base + Else + 2drop ( #l off ) 0 + Endif +; +)) +: integer? \ $addr -- n 1 | d 2 | 0 +\ *G Attempt to convert the counted string at 'addr' to an integer. +\ ** The return result is either 0 for failed, 1 for a single-cell +\ ** return result followed by that cell, or 2 for a double return. +\ ** The ASCII number string supplied can also contain implicit radix +\ ** over-rides. A leading $ enforces hexadecimal, a leading # enforces +\ ** decimal and a leading % enforces binary. + count dup if \ if something to do + 2dup upper \ convert to upper case + base @ >r \ preserve current base + check-prefix (integer?) \ check prefix, convert to number + r> base ! \ restore base + Else + 2drop ( #l off ) 0 + Endif +; + +defer number? \ $addr -- n 1 | d 2 | 0 + assign integer? to-do number? +\ ========================== +\ *S String input and output +\ ========================== + +internal + +: BS \ -- ; destructive backspace +\ *G Perform a destructive backspace by issuing ASCII characters +\ ** 8, 20h, 8. If *\fo{OUT} is non-zero at the start, it is decremented +\ ** by one regardless of the actions of the device driver. +\ ** INTERNAL. + out @ ?dup if + bsout emit space bsout emit + 1- out ! + then +; + +: ?BS \ pos -- pos' step ; perform BS if pos non-zero +\ *G If pos is non-zero and *\fo{ECHOING} is set, perform *\fo{BS} +\ ** and return the size of the step, 0 or -1. +\ ** INTERNAL. + dup 0<> echoing @ 0<> and if \ pos non-zero and echo + bs 1- -1 \ perform backspace + else + 0 \ no + then +; + +: SAVE-CH \ char addr -- ; save as required +\ *G Save char at addr, and output the character if +\ ** *\fo{ECHOING} is set. +\ ** INTERNAL. + over swap c! \ stash character + echoing @ \ echo it? + if emit else drop then \ process accordingly +; + +external + +: ." \ "ccc<quote>" -- +\ *G Output the text upto the closing double-quotes character. +\ ** Use *\fo{.( <text>)} when interpreting. + ['] (.") compile, ", +; +IMMEDIATE + +: $. \ c-addr -- ; display counted string +\ *G Output a counted-string to the output device. + count type +; + +: ACCEPT \ c-addr +n1 -- +n2 ; read up to LEN chars into ADDR +\ *G Read a string of maximum size n1 characters to the buffer at +\ ** c-addr, returning n2 the number of characters actually read. Input +\ ** may be terminated by CR. The action may be input device specific. +\ ** If *\fo{ECHOING} is non-zero, characters are echoed. +\ ** If *\fo{XON/XOFF} is non-zero, an XON character is sent at the +\ ** start and an XOFF character is sent at the the end. + dup 0= \ check for pathological case + if nip exit then + xon/xoff @ if xon emit then \ enable server + 0 -rot bounds \ form address limits + ?do + case key \ get character + bsin of ?bs endof \ BS + atab of bl i save-ch 1+ 1 endof \ TAB, convert to space +\ alf of bl i save-ch 1+ 1 endof \ LF, convert to space + alf of 0 endof \ LF, ignore + acr of bl i save-ch leave endof \ CR + ffeed of bl i save-ch leave endof \ FF, treat like CR + delin of ?bs endof \ DEL + i save-ch 1+ 1 0 \ stash char, echo it? + endcase + +loop \ round again + xon/xoff @ if xoff emit then \ disable server +; + + +\ *********************** +\ *S Source input control +\ *********************** + +internal +variable <source> + +: SOURCE-ID \ -- n ; indicates input source +\ *G Returns an indicator of which device is generating +\ ** source input. See the ANS specification for more details. + <source> @ +; + +compiler +: SOURCE-ID ( -- n ) <source> @ ; +: TO-SOURCE ( c-addr u -- ) #tib ! 'tib ! ; +target + +internal +: SOURCE \ -- c-addr u +\ *G Returns the address and length of the current terminal input +\ ** buffer. +\ ** INTERNAL + 'tib @ #tib @ +; +external + +: QUERY \ -- ; fetch line into TIB +( *G Reset the input source specification to the console and accept a ) +( ** line of text into the input buffer. ) + 0 <source> ! \ mark source as keyboard + 'tib @ tib-len 1- accept #tib ! \ "tib-len 1-" was #80 + >in off +; + + +\ ================ +\ *S Text scanning +\ ================ + +: PARSE \ char "ccc<char>" -- c-addr u +\ *G Parse the next token from the terminal input buffer using +\ ** <char> as the delimiter. The next token is returned as a +\ ** *\fo{c-addr/u} string description. Note that *\fo{PARSE} does +\ ** not skip leading delimiters. If you need to skip leading +\ ** delimiters, use *\fo{PARSE-WORD} instead. + >r + source >in @ /string \ remainder of input is substring + over swap r> scan \ look for char + >r over - \ subtract addresses to get length + dup r> 0<> - \ if string found then bump >IN past char + >in +! \ update >IN to reflect parsed text +; + +internal +: PARSE-WORD \ char -- c-addr u ; find token, skip leading chars +\ *G An alternative to *\fo{WORD} below. The return is a +\ ** *\i{c-addr/u} pair rather than a counted string and no copy +\ ** has occured, i.e. the contents of *\fo{HERE} are unaffected. +\ ** Because no intermediate global buffers are used *\fo{PARSE-WORD} +\ ** is more reliable than *\fo{WORD} for text scanning in multi-threaded +\ ** applications. +\ ** INTERNAL. + >r source tuck >in @ /string + r@ skip over swap r> scan + >r over - rot r> dup 0<> + - >in ! +; +external + +: WORD \ char "<chars>ccc<char>" -- c-addr +\ *G Similar behaviour to the ANS word *\fo{PARSE} but the returned +\ ** string is described as a counted string. + parse-word rp @ place rp @ +; + + +\ ---------------- +\ *S Miscellaneous +\ ---------------- + +internal + +: HALT? \ -- flag + \ *G Used in listed displays. This word will check the keyboard for a + \ ** 'pause' key <space>, if the key is pressed it will then wait for + \ ** a continue key or an abort key. The return flag is TRUE if abort + \ ** is requested. Line Feed (LF, ASCII 10) characters are ignored. + key? dup 0= \ key not pressed? + if exit endif + key bl = if \ space? + drop \ chuck previous flag + key bl <> \ get second char + then +; + +origin [if] \ only if ORIGIN is non-zero +: origin- \ addr -- addr' +\ +G If addr is non-zero, subtract the start address of the first +\ +* defined CDATA section. +\ +* This word is only compiled if the start address of the first +\ +* defined CDATA section is non-zero. +\ +* INTERNAL. + dup if origin - then \ normalize if non-zero +; + +compiler +: origin+ \ addr -- addr' ; denormalise NFA again +\ +G If addr is non-zero, add the start address of the first +\ +* defined CDATA section. +\ +* This word is only compiled if the start address of the first +\ +* defined CDATA section is non-zero. +\ +* INTERNAL. + dup if origin + then \ normalize if non-zero +; +target +[else] +compiler \ treat these as immediate noops +: origin- ; +: origin+ ; +target +[then] + +: nfa-buff \ -- addr+len addr ; make a buffer for holding NFAs +\ +G Form a temporary buffer for holding NFAs. A factor for +\ +* *\fo{WORDS}. +\ +* INTERNAL. + pad \ buffer + context @ >#threads @ cells \ length + bounds +; + +: MAX-NFA \ -- addr c-addr ; returns addr and top nfa +\ +G Return the thread address and NFA of the highest word +\ +* in the NFA buffer. A factor for *\fo{WORDS}. +\ +* INTERNAL. + 0 0 \ clear result + nfa-buff do + i @ over u> if \ if greater + 2drop i i @ \ replace current set + then + cell +loop \ step on + origin+ \ de-normalize +; + +: COPY-THREADS \ addr -- +\ +G Copy the threads of the *\fo{CONTEXT} wordlist to a +\ +* temporary NFA buffer for manipulation. A factor for +\ +* *\fo{WORDS}. +\ +* INTERNAL. + context @ >threads \ source + nfa-buff do \ destination/len + dup @ origin- i ! + cell+ + cell +loop \ copy and normalise + drop \ discard source addr +; + +external + +: WORDS \ -- +\ *G Display the names of all definitions in the wordlist at the +\ ** top of the search-order. +cr ." WORDS " + cr \ set up + copy-threads \ copy out & normalize + begin + max-nfa dup \ while still one left + halt? 0= and \ and no stop command + while + out @ c/l > if cr then \ new line if needed + dup .name \ show name + n>link @ origin- swap ! \ find next + repeat + 2drop +; + +: MOVE \ addr1 addr2 u -- ; intelligent move +\ *G An intelligent memory move, chooses between *\fo{CMOVE} and +\ ** *\fo{CMOVE>} at runtime to avoid memory overlap problems. +\ ** Note that as ROM PowerForth characters are 8 bit, there is +\ ** an implicit connection between a byte and a character. + >r 2dup swap - r@ u< if \ overlap if dest-src<len ; MPE011 + r> cmove> \ move down + else + r> cmove \ move up + then +; + +: DEPTH \ ??? -- +n +\ *G Return the number of items on the data stack. + s0 @ sp@ - cell - cell / +; + + +\ ------------------- +\ *S Wordlist control +\ ------------------- + +\ Cortex +asmcode +here is-action-of vocabulary \ -- +\ *G The runtime action of a *\fo{VOCABULARY}. + mov r0, lr \ point to data address + sub .s r0, r0, # 1 \ remove Thumb bit + ldr r2, [ r0, # 0 ] \ data address + ldr r2, [ r2, # 0 ] \ get wid + ldr r3, ^context \ address of context + str r2, [ r3, # 0 ] \ store WID at CONTEXT + pop { pc } +end-code +align l: ^context + context , + +(( \ MSP430 +asmcode +here is-action-of vocabulary \ -- + \ *G The runtime action of a *\fo{VOCABULARY}. + pop r14 \ get address of address + mov @r14 r14 \ get address + mov @r14 & context \ set contents + ret +end-code +)) + + +\ --------------------- +\ *S Control structures +\ --------------------- + +internal +: ?PAIRS \ x1 x2 -- +\ *G If x1<>x2, issue and error. +\ ** Used for on-target compile-time error checking. +\ ** INTERNAL. + <> #-22 ?throw +; + +: !CSP \ x -- +\ *G Save the stack pointer in *\fo{CSP}. +\ ** Used for on-target compile-time error checking. +\ ** INTERNAL. + sp@ csp ! +; + +: ?CSP \ -- +\ *G Issue an error if the stack pointer is not the +\ ** same as the value previously stored in CSP. +\ ** Used for on-target compile-time error checking. +\ ** INTERNAL. + sp@ csp @ <> #-22 ?throw +; + +: ?COMP \ -- +\ *G Error if not in compile state. +\ ** INTERNAL. + state @ 0= #-14 ?throw +; + +: ?EXEC \ -- +\ *G Error if not interpreting. +\ ** INTERNAL. + state @ #-403 ?throw +; +external + +: DO \ C: -- do-sys ; Run: n1|u1 n2|u2 -- ; R: -- loop-sys +\ *G Begin a *\fo{DO ... LOOP} construct. Takes the end-value and +\ ** start-value from the data-stack. + ?comp c_do 3 +; IMMEDIATE + +: ?DO \ C: -- do-sys ; Run: n1|u1 n2|u2 -- ; R: -- | loop-sys +\ *G Compile a *\fo{DO} which will only begin loop execution if the +\ ** loop parameters are not the same. Thus *\fo{0 0 ?DO ... LOOP} +\ ** will not execute the contents of the loop. + ?comp c_?do 3 +; IMMEDIATE + +: LOOP \ C: do-sys -- ; Run: -- ; R: loop-sys1 -- | loop-sys2 +\ *G The closing statement of a *\fo{DO..LOOP} construct. +\ ** Increments the index and terminates when the index crosses +\ ** the limit. + ?comp 3 ?pairs c_loop +; IMMEDIATE + +: +LOOP \ C: do-sys -- ; Run: n -- ; R: loop-sys1 -- | loop-sys2 +\ *G As with *\fo{LOOP} except that you specify the increment on +\ ** the data-stack. + ?comp 3 ?pairs c_+loop +; IMMEDIATE + +: BEGIN \ C: -- dest ; Run: -- +\ *G Mark the start of a structure of the form: +\ *C BEGIN..[while]..UNTIL / AGAIN / [REPEAT] + ?comp c_mrk_branch< +; IMMEDIATE + +: AGAIN \ C: dest -- ; Run: -- +\ *G The end of a *\fo{BEGIN..AGAIN} construct which specifies +\ ** an infinite loop. ) + ?comp c_branch< +; IMMEDIATE + +: UNTIL \ C: dest -- ; Run: x -- +\ *G Compile code into definition which will jump back to the +\ ** matching *\fo{BEGIN} if the supplied condition flag is +\ ** Zero/FALSE. + ?comp c_?branch< +; IMMEDIATE + +: WHILE \ C: dest -- orig dest ; Run: x -- +\ *G Separate the condition test from the loop code in a +\ ** *\fo{BEGIN..WHILE..REPEAT} block. + ?comp c_?branch> swap +; IMMEDIATE + +: REPEAT \ C: orig dest -- ; Run: -- +\ *G Loop back to the conditional dest code in a +\ ** *\fo{BEGIN..WHILE..REPEAT} construct. ) + ?comp c_branch< >c_res_branch \ SFP003 +; IMMEDIATE + +: IF \ C: -- orig ; Run: x -- +\ *G Mark the start of an *\fo{IF..[ELSE]..THEN} conditional +\ ** block. + ?comp c_?branch> +; IMMEDIATE + +: THEN \ C: orig -- ; Run: -- +\ *G Mark the end of an *\fo{IF..THEN} or *\fo{IF..ELSE..THEN} +\ ** conditional construct. + ?comp >c_res_branch +; IMMEDIATE + +: ELSE \ C: orig1 -- orig2 ; Run: -- +\ *G Begin the failure condition code for an *\fo{IF}. + ?comp c_branch> swap >c_res_branch +; IMMEDIATE + +: CASE \ C: -- case-sys ; Run: -- +\ *G Begin a *\fo{CASE..ENDCASE} construct. Similar to C's +\ ** *\b{switch}. + ?comp csp @ c_case !csp 4 +; IMMEDIATE + +: OF \ C: -- of-sys ; Run: x1 x2 -- | x1 +\ *G Begin conditional block for *\fo{CASE}, executed when the +\ ** switch value is equal to the X2 value placed in TOS. + 4 ?pairs c_of 5 +; IMMEDIATE + +: ?OF \ C: -- of-sys ; Run: flag -- +\ *G Begin conditional block for *\fo{CASE}, executed when the flag +\ ** is true. + 4 ?pairs c_?of 5 +; IMMEDIATE + +: ENDOF \ C: case-sys1 of-sys -- case-sys2 ; Run: -- +\ *G Mark the end of an OF conditional block within a *\fo{CASE} +\ ** construct. Compile a jump past the *\fo{ENDCASE} marker at +\ ** the end of the construct. + 5 ?pairs c_endof 4 +; IMMEDIATE + +: ENDCASE \ C: case-sys -- ; Run: x -- +\ *G Terminate a *\fo{CASE..ENDCASE} construct. *\fo{DROP}s the +\ ** switch value from the stack. + 4 ?pairs c_endcase csp ! +; IMMEDIATE + +: NEXTCASE \ C: case-sys -- ; Run: x -- +\ *G Terminate a *\fo{CASE..NEXTCASE} construct. *\fo{DROP}s the +\ ** switch value from the stack and compiles a branch back to the +\ ** top of the loop at *\fo{CASE}. + 4 ?pairs c_nextcase csp ! +; IMMEDIATE + +: RECURSE \ Comp: -- +\ *G Compile a recursive call to the colon definition containing +\ ** *\fo{RECURSE} itself. Do not use *\fo{RECURSE} between +\ ** *\fo{DOES>} and *\fo{;}. Used in the form: +\ *C : foo ... recurse ... ; +\ *P to compile a reference to *\fo{FOO} from inside *\fo{FOO}. + Last @ name> compile, +; IMMEDIATE + + +\ ********************************** +\ *S Target interpreter and compiler +\ ********************************** + +internal +: ?STACK \ -- +\ *G Error if stack pointer out of range. +\ ** INTERNAL. + sp@ s0 @ u> #-4 ?throw +; + +: ?UNDEF \ x -- +\ *G Word not defined error if x=0. +\ ** INTERNAL. + 0= #-13 ?throw +; +external + +: POSTPONE \ Comp: "<spaces>name" -- +\ *G Compile a reference to another word. *\fo{POSTPONE} can handle +\ ** compilation of *\fo{IMMEDIATE} words which would otherwise be +\ ** executed during compilation. + bl word find dup ?undef \ it is a name + -1 = if \ if non-immediate + [compile] literal ['] compile, \ lay "lit xt compile," + then + compile, \ immediate word will be compiled now +; IMMEDIATE + +: S" \ Comp: "ccc<quote>" -- ; Run: -- c-addr u +\ *G Describe a string. Text is taken up to the next double-quote +\ ** character. The address and length of the string are returned. + state @ if + compile (s") ", + else + [char] " parse pad place pad count + then +; IMMEDIATE + +: C" \ Comp: "ccc<quote>" -- ; Run: -- c-addr +\ *G As *\fo{S"} except the address of a counted string is returned. + state @ if + compile (c") ", + else + [char] " parse pad place pad + then +; +IMMEDIATE + +: LITERAL \ Comp: x -- ; Run: -- x +\ *G Compile a literal into the current definition. Usually used +\ ** in the form *\fo{[ <expression ] LITERAL} inside a colon +\ ** definition. Note that *\fo{LITERAL} is *\fo{IMMEDIATE}. + c_lit +; +IMMEDIATE + +: CHAR \ "<spaces>name" -- char +( *G Return the first character of the next token in the input stream. ) +( ** Usually used to avoid magic numbers in the source code. ) + bl word 1+ c@ +; + +: [CHAR] \ Comp: "<spaces>name" -- ; Run: -- char +( *G Compile the first character of the next token in the input stream ) +( ** as a literal. Usually used to avoid magic numbers in the source ) +( ** code. ) + ?comp char [compile] literal +; +IMMEDIATE + +: [ \ -- +\ *G Switch compiler into interpreter state. + state off +; +IMMEDIATE + +: ] \ -- +\ *G Switch compiler into compilation state. + state on +; + +: ' \ "<spaces>name" -- xt +\ *G Find the xt of the next word in the input stream. An error occurs +\ ** if the xt cannot be found. + bl word find ?undef +; + +: ['] \ Comp: "<spaces>name" -- ; Run: -- xt +\ *G Find the xt of the next word in the input stream, and compile it +\ ** as a literal. An error occurs if the xt cannot be found. + ' [compile] literal +; +IMMEDIATE + +: [COMPILE] \ "<spaces>name" -- +\ *G Compile the next word in the input stream. *\fo{[COMPILE]} +\ ** ignores the *\fo{IMMEDIATE} state of the word. Its operation +\ ** is mostly superceded by *\fo{POSTPONE}. + ' compile, +; +IMMEDIATE + +: ( \ "ccc<paren>" -- +\ *G Begin an inline comment. All text upto the closing bracket is +\ ** ignored. + [char] ) word drop +; +IMMEDIATE + +: \ \ "ccc<eol>" -- +\ *G Begin a single-line comment. All text up to the end of the line is +\ ** ignored. + 0 word drop \ use variable length line +; +IMMEDIATE + +: ", \ "ccc<quote>" -- +\ *G Parse text up to the closing quote and compile into the +\ ** dictionary at *\fo{HERE} as a counted string. The end of the +\ ** string is aligned. + [char] " word dup c@ 1+ \ addr len + bounds ?do i w@ w, 2 +loop \ STM32 Flash has to be programmed in 16 bit units + align +; + +internal +: (TO-DO) \ -- ; R: xt -- a-addr' +\ *G The run-time action of *\fo{IS}. It is followed by the +\ ** data addres of the *\fo{DEFER}red word at which the xt is stored. +\ ** INTERNAL. + r> dup cell+ aligned >r + @ ! +; +external + +: IS \ "<spaces>name" -- +\ *G The second part of the *\fo{ASSIGN xxx TO-DO yyy} construct. +\ ** This word will assign the given XT to be the action of a +\ ** *\fo{DEFER}ed word which is named in the input stream. + ' >body state @ if + compile (to-do) , + else + ! + then +; +IMMEDIATE + +: exit \ R: nest-sys -- ; exit current definition +\ *G Compile code into the current definition to cause a definition to +\ ** terminate. This is the Forth equivalent to inserting an RTS/RET +\ ** instruction in the middle of an assembler subroutine. + ?comp c_exit +; immediate + +: ; \ C: colon-sys -- ; Run: -- ; R: nest-sys -- +\ *G Complete the definition of a new 'colon' word or *\fo{:NONAME} +\ ** code block. + ?comp ?csp c_exit + reveal [compile] [ +; +IMMEDIATE + +-short-branches +: INTERPRET \ -- +\ *G Process the current input line as if it is text entered at +\ ** the keyboard. + begin + ?stack bl word dup c@ + while + find ?dup if + 0< state @ and + if compile, else execute then + else + number? ?dup ?undef + state @ if + case + 1 of c_lit endof + 2 of swap c_lit c_lit endof + #-13 throw + endcase + else + drop + then + then + repeat + drop +; ++short-branches + +: EVALUATE \ i*x c-addr u -- j*x ; interpret the string +\ *G Process the supplied string as though it had been entered via the +\ ** interpreter. + 'tib @ >r #tib @ >r >in @ > source-id >r + to-source -1 <source> ! >in off + ['] interpret catch + r> <source> ! r> >in ! r> #tib ! r> 'tib ! + throw +; + +internal +: .throw \ throw# -- +\ *G Display the throw code. Values of 0 and -1 are ignored. + case + 0 of endof \ quiet + -1 of endof \ quiet + -2 of 'AbortText @ count type endof \ ABORT" ..." + -13 of ." is undefined" endof + ." Throw code " . + end-case +; +external + +: QUIT \ -- ; R: i*x -- +\ *G Empty the return stack, store 0 in *\fo{SOURCE-ID}, and enter +\ ** interpretation state. *\fo{QUIT} repeatedly *\fo{ACCEPT}s a +\ ** line of input and *\fo{INTERPRET}s it, with a prompt if +\ ** interpreting and *\fo{ECHOING} is on. Note that any task that +\ ** uses *\fo{QUIT} must initialise *\fo{'TIB}, *\fo{BASE}, +\ ** *\fo{IPVEC}, and *\fo{OPVEC}. + xon/xoff off echoing on \ No Xon/Xoff, do Echo + 0 <source> ! [compile] [ \ set up + begin + r0 @ rp! \ reset return stack + echoing @ if cr then \ if echoing enabled issue new line + query \ get user input + ['] interpret catch ?dup 0= if \ interpret line + state @ 0= echoing @ 0<> and if \ if interpreting & echoing + ." ok" depth ?dup \ prompt user + if ." -" . then + then + else + .throw s0 @ sp! [compile] [ \ display error, clean up + cr source type \ display input line + cr >in @ 1- spaces ." ^" \ display pointer to error + then + again \ do next line +; + + +\ *************** +\ *S Startup code +\ *************** + +\ ************* +\ *N Cold chain +\ ************* +\ *P If enabled by the non-zero equate *\fo{COLDCHAIN?} the cold +\ ** start code in *\fo{COLD} will walk a list and execute the xts +\ ** contained in it. The xts must have no stack effect *\fo{( -- )} +\ ** and are added to the list by the phrase: +\ *C ' <wordname> AtCold +\ *P The list is executed in the order in which it was defined so +\ ** that the last word added is executed last. This was done +\ ** for compatibility with VFX Forth, which also contains a +\ ** shutdown chain, in which the last word added is executed +\ ** first. + +\ *P If the equate *\fo{COLDCHAIN?} is not defined in the control +\ ** file, a default value of 0 will be defined. + +[undefined] ColdChain? [if] +0 equ ColdChain? +[then] + +ColdChain? [if] + +align +l: ColdChainFirst \ -- addr +\ *G Dummy first entry in ColdChain. + 0 , ' noop , + +variable ColdChain \ -- addr +\ *G Holds the address of the last entry in the cold chain. + ColdChainFirst ColdChain ! + +interpreter +: AtCold \ xt(t) -- + align + chere(t) dup ColdChain @c(t) !c(t) \ last points to new + ColdChain !c(t) \ new becomes old + 0 ,c(t) ,c(t) \ lay link to next and xt +; +target + +: AtCold \ xt -- +\ *G Specifiy a new XT to execute when *\fo{COLD} is run. Note +\ ** that the last word added is executed last. *\fo{ATCOLD} can +\ ** be executed interpretively during cross-compilation. The cold +\ ** chain is built in the current *\fo{CDATA} section. + Align + here dup ColdChain @ ! ColdChain ! \ update cold chain + 0 , , \ lay link to next and xt +; + +: WalkColdChain \ -- MPE.0000 +\ *G Execute all words added to the cold chain. Note that the first +\ ** word added is executed first. + ColdChainFirst + begin + dup + while + dup cell + @ execute \ execute XT + @ \ get next entry + repeat + drop +; + +[then] + + +\ ==================== +\ *N The COLD sequence +\ ==================== +\ *P At power up, the target executes *\fo{COLD} or the word specified +\ ** by *\fo{MAKE-TURNKEY <name>}, or the word specified as the action +\ ** of an application compiled by the target. + +internal + +3 cells equ #idhead + +: (INIT) \ -- +\ *G Performs the high level Forth startup. See the source code for +\ ** more details. +\ ** INTERNAL. + +\ Copy the given RAM table from Flash into RAM. The table may +\ initialise multiple blocks of RAM. The data consists of: +\ len, addr, pageid, len bytes data, len, addr, page, ..., len=0, + init-ram begin + dup @ + while \ len<>0 + dup #idhead + over 2@ \ source, dest, len + cmove \ copy + dup @ + #idhead + \ step to next block + repeat + drop + + user-reset s0 4 cells cmove \ initialise user vars + s0 @ sp! \ Reset data stack + init-tib 'tib ! \ input buffer pointer + handler off \ no CATCH used yet + init-fence fence 4 cells cmove \ fence, dp, voc-link + 0 <source> ! decimal + forth-wordlist dup context ! current ! + 0 context cell+ ! +\ only forth definitions \ set up search order +; +external + +: .FREE \ -- +\ *G Return the free dictionary space. + cr APPFLASHEND dp @ - u. ." bytes free Flash" + cr RP-END rp @ - u. ." bytes free RAM" +; + +: Commit \ xt|0 -- +\ *G Preserve the compiled image. If xt is non-zero, that word +\ ** will be executed when the application starts. + dup 0= if drop ['] noop then + to-do start-action \ start up action + DefStart APPSTART /DefStart >Flash \ save application data +; + +: Empty \ -- +\ *G Wipe the application and perform a cold restart. +\ INFOSTART DefStart /DefStart cmove \ relink base system + APPSTART /DefStart FlErase \ wipe application links + APPFLASHSTART /APPFLASH FlErase \ wipe application flash + reboot +; + +: COLD \ -- +\ *G The first high level word executed by default. This word is +\ ** set to be the word executed at power up, but this may be +\ ** overridden by a later use of *\fo{MAKE-TURNKEY <name>} in +\ ** the cross-compiled code. See +\ ** the source code for more details of *\fo{COLD}. + (init) \ start Forth + init-ser \ initialise serial line + console opvec ! \ default i/o channels + console ipvec ! + start-clock +\ perform the application detection and linking + DefStart INFOSTART /DefStart >Flash \ save defaults + APPSTART @ dup -1 <> swap 0<> and if \ FENCE not $FFFF or 0 + crcslot @ APPSTART /DefStart + @ = if \ checksums match + APPSTART DefStart /DefStart cmove \ load app + endif + endif + align dp @ @ -1 <> \ Flash at HERE should be erased + if empty endif \ use -1 for 16/32 bit reasons +\ cold chain actions + WalkColdChain \ execute user specified initialisation +\ sign on + CR .cpu .free \ sign on, display free space + start-action \ perform application start up actions + cr cr ." ok" \ display prompt + s0 @ sp! \ reset data stack + quit \ start text interpreter +; +make-turnkey cold \ Default start-up word. + + +\ ===================== +\ *S Kernel error codes +\ ===================== + +\ *D -1 ABORT +\ *D -2 ABORT" +\ *D -4 Stack underflow +\ *D -13 Undefined word. +\ *D -14 Attempt to interpret a compile only definition. +\ *D -22 Control structure mismatch - unbalanced control structure. +\ *D -121 Attempt to remove with MARKER or FORGET below FENCE in protected dictionary. +\ *D -403 Attempt to compile an interpret only definition. +\ *D -501 Error if not LOADing from a block. + + +\ ****** +\ *> ### +\ ****** + diff --git a/mwmouse/sources/liteSTM32F072.no b/mwmouse/sources/liteSTM32F072.no @@ -0,0 +1 @@ +v2.0 [build 0038] +\ No newline at end of file diff --git a/mwmouse/sources/liteSTM32F072sa.ctl b/mwmouse/sources/liteSTM32F072sa.ctl @@ -0,0 +1,429 @@ +\ liteSTM32F072sa.ctl - STM32F072RB discovery board standalone "Lite" Forth + +(( +Copyright (c) 2014 +MicroProcessor Engineering +133 Hill Lane +Southampton SO15 5AF +England + +tel: +44 (0)23 8063 1441 +fax: +44 (0)23 8033 9691 +net: mpe@mpeforth.com + tech-support@mpeforth.com +web: www.mpeforth.com + +From North America, our telephone and fax numbers are: + 011 44 23 8063 1441 + 011 44 23 8033 9691 + + +To do +===== + +Change history +============== +20140707 MPE002 Updated for Lite Forth v2. +20140205 MPE001 First release for STM32F0xx. +)) + + +\ ================ +\ *! stm32f072litesa +\ *T Control file for STM32F072 Discovery board +\ ================ +\ *P Every Forth project has a control file, which is similar to the +\ ** project file in other languages. The control file tells the +\ ** cross compiler all about the target. Not all of it is +\ ** documented here, but it is all commented in the source code. + +\ *P The control file *\i{CortexLite/Hardware/STM32F072Bdisco/liteSTM32F072sa.ctl} +\ ** produces a standalone Forth for the STM32F072B Discovery board. +\ ** The control files for other boards are very similar in structure, +\ ** and different in the details of the CPU and board specific +\ ** options. Read the specific code for your CPU and board. + +\ *P The serial port is connected to USART1 on pins PA9 (Tx -> PC Rx) and +\ ** PA10 (Rx -> PC Tx). +\ ** You cannot use the easy GPIO code for UART initialisation unless +\ ** the GPIO ports are clocked and taken out of reset in the start +\ ** up code. + +\ *P When you modify this file for your own hardware do not forget +\ ** to update the GPIO pin assignments and alternate function +\ ** selections. + +\ *P To Flash the board, you can use the low-cost ST-LINK/V2 JTAG unit, or use +\ ** the one integrated into the ST Discovery boards. +\ ** The ST-LINK Utility software is a +\ ** free download from the ST website *\f{www.st.com}. + +only forth definitions decimal + + +\ ************************** +\ *S Define directory macros +\ ************************** +\ *P The MPE cross compilers contain a useful text macro system. +\ ** Macros allow easy porting of control files when projects are +\ ** moved from their default locations. Each directory macro +\ ** defines where a particular set of files are located. + +\ *[ +c" ." setmacro AppDir \ application files +c" ." setmacro HwDir \ Board hardware files +c" ..\.." setmacro CpuDir \ CPU specific files +c" ..\..\Examples" setmacro ExampleDir \ example files +\ *] + + +\ ***************************** +\ *S Turn on the cross compiler +\ ***************************** + +\ *[ + +include %CpuDir%/Macros \ macros needed by the cross-compiler + +CROSS-COMPILE \ Turn host Forth into a cross-compiler + +only forth definitions \ default search order + + no-log \ uncomment to suppress output log + rommed \ split ROM/RAM target + interactive \ enter interactive mode at end + +xrefs \ enable cross references + align-long \ code is 32bit aligned + Cortex-M0 \ Thumb2 processor type and register usage + -LongCalls \ no calls outside 25 bit range + +FlashCompile \ target compiles to Flash + Hex-I32 \ also produce Intel Hex-32 obj format + +SaveCdataOnly \ no data area image files + +0 equ false +-1 equ true + +\ *] + +\ ******************* +\ *S Configure target +\ ******************* + +\ ============================== +\ *N STM32F0 variant definitions +\ ============================== + +$0800:0000 equ FlashBase \ -- addr +\ *G Start address of Flash. The bottom 2kb (the vector area) is +\ ** mirrored at $0000:0000 for booting. + +#128 kb equ /Flash \ -- len +\ *G Size of Flash. +2 kb equ /FlashPage \ -- len +\ *G Size of a Flash Page. +1 equ KeepPages \ -- u +\ *G Set this non-zero for the number of pages at the end of Flash +\ ** that are reserved for configuration data. Often set to 1 or 2 +\ ** by systems that use PowerNet. +FlashBase /Flash + /FlashPage KeepPages * - equ CfgFlash \ -- len +\ *G Base address of the configuration Flash area. + +$1FFF:C800 equ /InfoBase \ -- addr +\ *G Base address of system memory information block. + +#12 kb equ /SysMem \ -- len +\ *G Size of system memory block. + +$1FFF:F800 equ OptionBytes \ -- addr +\ *G Base address of option bytes +#16 equ /OptionBytes \ -- len +\ *G Number of option bytes + +#64 cells equ /ExcVecs \ -- len +\ *G Size of the exception/interrupt vector table. There are +\ ** 16 slots reserved by ARM. + +\ *P The system clocks are generated from PLLs. +\ ** How to set them up is non-obvious and is mostly documented +\ ** by the ST demonstration code in the file *\i{system_stm32f0x2.c}. +\ ** If you are not going to use an existing setup, copy and rename +\ ** one of the existing *\i{startSTM32F0xx.fth} files. + +8 MHz equ xtal-speed \ -- hz +\ *G Master oscillator crystal clock rate in HZ. This is the HSI +\ ** internal oscillator which has better than +/-1% accuracy and +\ ** is more accurate than the internal 48 MHz oscillator. +48 MHz equ system-speed \ -- hz +\ *G Requested CPU clock speed in HZ. Note that you must +\ ** calculate the PLL values. + +1 equ AHBdiv \ -- u +\ *G Division ratio of the AHB clock from the system clock. +\ ** This may not be more than 48 MHz. +1 equ APBdiv \ -- u +\ *G Division ratio of the APB clock from the system clock. +\ ** This may not be more than 48 MHz. + +system-speed AHBdiv / equ AHB-speed \ -- hz +\ *G AHB bus speed. +system-speed APBdiv / equ APB-speed \ -- hz +\ *G APB bus speed. + + +\ ============= +\ *N Memory map +\ ============= +\ *P If you are using the *\fo{Reflash} code in the *\i{ReProg} +\ ** folder, note that the Flash reprogramming code uses RAM +\ ** from $2000:0000..$2000:0FFF and its mirrors. Ensure that +\ ** your stacks are outside this region. + +\ *P The Flash memory starts at $0800:0000. The bottom 2 kb (the +\ ** vector area) is mirrored at $0000:0000. The top 4 kb (two +\ ** pages) is used to save autostart and application linkage +\ ** information. + +\ *[ + $0800:0000 $0800:BFFF cdata section liteSTM32F072sa \ code + $2000:0000 $2000:0FFF udata section PROGu \ 4k UDATA RAM + $2000:1000 $2000:3FFF idata section PROGd \ 12k IDATA RAM + +interpreter +: prog liteSTM32F072sa ; \ synonym +target + +PROG PROGd PROGu CDATA \ use Code for HERE , and so on + +$0801:F000 equ INFOSTART \ kernel status is saved here. +$0801:F800 equ APPSTART \ application data is saved here. +$0801:FFFF equ INFOEND \ end of kernel/application status data. +$2000:0000 equ RAMSTART \ start of RAM +$2000:4000 equ RAMEND \ end of RAM +$0800:0000 equ FLASHSTART \ start of Main Flash +$0810:0000 equ FLASHEND \ end of possible main Flash +$0800:C000 equ APPFLASHSTART \ start of application flash +$0801:F000 equ APPFLASHEND \ end of application flash +APPFLASHEND APPFLASHSTART - equ /APPFLASH \ size of application flash + +APPFLASHSTART TargetFlashStart \ sets HERE at kernel start up + +\ *] + + +\ ============================ +\ *N Stack and user area sizes +\ ============================ + +\ *[ +$0F0 equ UP-SIZE \ size of each task's user area +$0F0 equ SP-SIZE \ size of each task's data stack +$0100 equ RP-SIZE \ size of each task's return stack +up-size rp-size + sp-size + + equ task-size \ size of TASK data area +\ define the number of cells of guard space at the top of the data stack +#2 equ sp-guard \ can underflow the data stack by this amount + +$0100 equ TIB-LEN \ terminal i/p buffer length + +\ define nesting levels for interrupts and SWIs. +2 equ #IRQs \ number of IRQ stacks, + \ shared by all IRQs (1 min) +0 equ #SVCs \ number of SVC nestings permitted + \ 0 is ok if SVCs are unused +\ *] + + +\ ========================== +\ *N Serial and ticker rates +\ ========================== + +1 equ useUSART1? \ -- n +\ *G Set non-zero to compile code for USART1, +\ ** device *\fo{Console1}. +#115200 equ console1-speed +\ *G *\fo{Console1} speed in BPS. + +0 equ useUSART2? \ -- n +\ *G Set non-zero to compile code for USART2, +\ ** device *\fo{Console2}. +#115200 equ console2-speed +\ *G *\fo{Console2} speed in BPS. + +0 equ useUSART3? \ -- n +\ *G Set non-zero to compile code for USART3, +\ ** device *\fo{Console3}. +115200 equ console3-speed +\ *G *\fo{Console3} speed in BPS. + +0 equ useUSART4? \ -- n +\ *G Set non-zero to compile code for USART4, +\ ** device *\fo{Console4}. +115200 equ console4-speed +\ *G *\fo{Console4} speed in BPS. + +1 equ console-port \ -- n ; Designate serial port for terminal (0..n). +\ *G Ports 1..4 are the on-chip UARTs. The internal USB device +\ ** is port 10, and bit-banged ports are defined from 20 onwards. + +#1 equ tick-ms \ -- ms +\ *G Timebase tick in ms. + + +\ ===================== +\ *N Software selection +\ ===================== +\ *P With 128 kb of Flash we can select a comfortable set of +\ ** software and still have plenty of space for application +\ ** code. + +\ *[ + 0 equ Tiny? \ nz to make a minimal kernel. + 1 equ ColdChain? \ nz to use cold chain mechanism + 1 equ tasking? \ true if multitasker needed + 6 cells equ tcb-size \ for internal consistency check + 0 equ timebase? \ true for TIMEBASE code + 0 equ softfp? \ true for software floating point + 0 equ FullCase? \ true to include ?OF END-CASE NEXTCASE extensions + 0 equ target-locals? \ true if target local variable sources needed + 0 equ romforth? \ true for ROMForth handler + 0 equ blocks? \ true if BLOCK needed + $0000 equ sizeofheap \ 0=no heap, nz=size of heap + 1 equ heap-diags? \ true to include diagnostic code + 0 equ paged? \ true if ROM or RAM is paged/banked +\ *] + + +\ ***************** +\ default constants +\ ***************** + +cell equ cell \ size of a cell (16 bits) +0 equ false +-1 equ true + + +\ *************** +\ *S Kernel files +\ *************** + +\ *[ + include %CpuDir%/CM0def \ Cortex generic equates and SFRs + include %CpuDir%/sfrSTM32F072 \ STM32F072 special function registers + include %CpuDir%/StackDef \ Reserve default task and stacks +PROGd sec-top 1+ equ UNUSED-TOP PROG \ top of memory for UNUSED + include %HwDir%/startSTM32F072 \ start up code +l: crcslot + 0 , \ the kernel CRC +l: crcstart + include %CpuDir%/CodeM0lite \ low level kernel definitions + include %CpuDir%/Drivers/FlashSTM32 \ Flash programming code + include %CpuDir%/kernel72lite \ high level kernel definitions + include %CpuDir%/Drivers/rebootSTM32 \ reboot using watchdog + include %CpuDir%/IntCortex \ interrupt handlers for NVIC + include %CpuDir%/FaultCortex \ fault exception handlers for NVIC +\ *] +: selio-ser1 \ -- +\ *G Example to perform clock and pin selection for USART1 on PA9/10. +\ ** You cannot use the easy GPIO code for this unless the GPIO ports +\ ** are clocked and taken out of reset in the start up code. +\ Clocks and reset + _RCC + $0000 $0003 2 pick rccCFGR3 + setMask \ PCLK is UART clock + bit17 over rccAHBen + or! \ enable clock to GPIOA + bit17 over rccAHBrst + bic! \ take it out of reset + bit14 over rccAPB2en + or! \ enable clock to USART1 + bit14 over rccAPB2rst + bic! \ take it out of reset + drop +\ Default on PA9/10 + _GPIOA >r + $0028:0000 $003C:0000 r@ gpioMODER + setMask \ alternate function on 9/10 + $0000:0110 $0000:0FF0 r> gpioAFRH + setMask \ AF1 for both +; +\ *[ + include %CpuDir%/Drivers/serSTM32F0xxp \ polled serial driver + include %CpuDir%/Dump \ DUMP .S etc development tools + + include %CpuDir%/Drivers/gpioSTM32F0xx \ easy pin access + include %CpuDir%/Drivers/SysTickDisco072 + ' start-clock AtCold + +tasking? [if] + include %CpuDir%/MultiCM0lite \ multitasker +[then] + +\ *] + + +\ ************* +\ *S End of kernel +\ ************* +\ *P After the main kernel has been built, some version data is +\ ** laid down for use by the sign-on code. + +\ *[ + +buildfile liteSTM32F072sa.no +l: version$ + build$, +l: BuildDate$ + DateTime$, + +internal +: .banner \ -- + cr ." ****************************" +; + +: .CPU \ -- ; display CPU type + .banner + cr ." MPE Forth Lite for STM32F072" + cr version$ $. space BuildDate$ $. + cr ." Copyright (C) 2014 MicroProcessor Engineering Ltd." + .banner +; +external +\ *] + + +\ ******************* +\ *S Application code +\ ******************* +\ *P This code is not essential, but makes life very much easier. + +\ *[ + include %HwDir%/ReProg/ReFlash \ ReFlash utility + include %CpuDir%/include \ include from AIDE + include %CpuDir%/Drivers/spiSTM32F0hard \ SPI2 driver + include %CpuDir%/Examples/l3gd20 \ L3GD20 MEMS driver + +RAMEND constant RP-END \ end of available RAM +\ *] + + +\ *************** +\ *S Finishing up +\ *************** +\ *[ + +libraries \ to resolve common forward references + include %CpuDir%/LibM0M1 + include %CpuDir%/LIBRARY +end-libs + +decimal + +\ Add a kernel checksum +crcstart here crcslot crc32 checksum +/DefStart 128 > [if] + .( DEFSTART area too big ) abort +[then] + +update-build \ update build number file + +FINIS \ all done + +\ *] + + +\ ====== +\ *> ### +\ ====== diff --git a/mwmouse/sources/liteSTM32F072sa.no b/mwmouse/sources/liteSTM32F072sa.no @@ -0,0 +1 @@ +v7.30 [build 0281] +\ No newline at end of file diff --git a/mwmouse/sources/liteSTM32F072uf.ctl b/mwmouse/sources/liteSTM32F072uf.ctl @@ -0,0 +1,411 @@ +\ liteSTM32F072uf.ctl - Umbilical Forth STM32F072RB discovery board + +(( +Copyright (c) 2014 +MicroProcessor Engineering +133 Hill Lane +Southampton SO15 5AF +England + +tel: +44 (0)23 8063 1441 +fax: +44 (0)23 8033 9691 +net: mpe@mpeforth.com + tech-support@mpeforth.com +web: www.mpeforth.com + +From North America, our telephone and fax numbers are: + 011 44 23 8063 1441 + 011 44 23 8033 9691 + + +To do +===== + +Change history +============== +20140409 MPE001 First release for STM32F0xx. +)) + + +\ ================ +\ *! stm32f072liteuf +\ *T Umbilical Forth for STM32F072 Discovery board +\ ================ +\ *P The control file *\i{Cortex/Hardware/STM32F0/liteSTM32F072uf.ctl} +\ ** produces an Umbilical Forth for the STM32F072 Discovery board. +\ ** The serial port is connected to USART1 on pins PA9 (Tx) and +\ ** PA10 (Rx). +\ ** You cannot use the easy GPIO code for UART initialisation unless +\ ** the GPIO ports are clocked and taken out of reset in the start +\ ** up code. + +\ *P When you modify this file for your own hardware do not forget +\ ** to update the GPIO pin assignments and alternate function +\ ** selections. + +\ *P You can easily use the low-cost ST-LINK/V2 JTAG unit. +\ ** The ST-LINK Utility software is a +\ ** free download from the ST website *\f{www.st.com}. + +only forth definitions decimal + + +\ ****************************** +\ Define the default directories +\ ****************************** + +c" ." setmacro AppDir \ application files +c" ." setmacro HwDir \ Board hardware files +c" ." setmacro CpuDir \ CPU specific files +c" ..\Examples" setmacro ExampleDir \ example files + + +\ *************************************** +\ Load compiler extensions such as macros +\ *************************************** + +include %CpuDir%/Macros + + +\ ********************************************************* +\ Turn on the cross compiler and define CPU and log options +\ ********************************************************* + +\ file: PROG.log \ uncomment to send log to a file + +CROSS-COMPILE + +Only Forth Definitions \ default search order + + no-heads \ No heads on target + No-log \ No output log + Rommed \ Split ROM/RAM system + +xrefs \ enable cross references + align-long \ code is 32bit aligned + Cortex-M0 \ Thumb2 processor type and register usage + -LongCalls \ no calls outside 25 bit range + Hex-I32 \ also produce Intel Hex-32 obj format + +SaveCdataOnly \ no data area image files + +0 equ false +-1 equ true + + +\ ******************* +\ *S Configure target +\ ******************* + +\ ====================== +\ *N STM32F0 variant definitions +\ ====================== + +$0800:0000 equ FlashBase \ -- addr +\ *G Start address of Flash. The bottom 2kb (the vector area) is +\ ** mirrored at $0000:0000 for booting. + +#128 kb equ /Flash \ -- len +\ *G Size of Flash. +2 kb equ /FlashPage \ -- len +\ *G Size of a Flash Page. +1 equ KeepPages \ -- u +\ *G Set this non-zero for the number of pages at the end of Flash +\ ** that are reserved for configuration data. Often set to 1 or 2 +\ ** by systems that use PowerNet. +FlashBase /Flash + /FlashPage KeepPages * - equ CfgFlash \ -- len +\ *G Base address of the configuration Flash area. + +$1FFF:C800 equ /InfoBase \ -- addr +\ *G Base address of system memory information block. + +#12 kb equ /SysMem \ -- len +\ *G Size of system memory block. + +$1FFF:F800 equ OptionBytes \ -- addr +\ *G Base address of option bytes +#16 equ /OptionBytes \ -- len +\ *G Number of option bytes + +#64 cells equ /ExcVecs \ -- len +\ *G Size of the exception/interrupt vector table. There are +\ ** 16 reserved by ARM. + +\ *P The system clocks are generated from PLLs. +\ ** How to set them up is non-obvious and is mostly documented +\ ** by the ST demonstration code in the file *\i{system_stm32f0x2.c}. +\ ** If you are not going to use an existing setup, copy and rename +\ ** one of the existing *\i{startSTM32F0xx.fth} files. + +8 MHz equ xtal-speed \ -- hz +\ *G Master oscillator crystal clock rate in HZ. This is the HSI +\ ** internal oscillator which has better than +/-1% accuracy and +\ ** is more accurate than the internal 48 MHz oscillator. +48 MHz equ system-speed \ -- hz +\ *G Requested CPU clock speed in HZ. Note that you must +\ ** calculate the PLL values. + +1 equ AHBdiv \ -- u +\ *G Division ratio of the AHB clock from the system clock. +\ ** This may not be more than 48 MHz. +1 equ APBdiv \ -- u +\ *G Division ratio of the APB clock from the system clock. +\ ** This may not be more than 48 MHz. + +system-speed AHBdiv / equ AHB-speed \ -- hz +\ *G AHB bus speed. +system-speed APBdiv / equ APB-speed \ -- hz +\ *G APB bus speed. + + +\ ============= +\ *N Memory map +\ ============= +\ *P If you are using the *\fo{Reflash} code in the *\i{ReProg} +\ ** folder, note that the Flash reprogramming code uses RAM +\ ** from $2000:0000..$2000:0FFF and its mirrors. Ensure that +\ ** your stacks are outside this region. + +\ *P The Flash memory starts at $0800:0000. The bottom 2 kb (the +\ ** vector area) is mirrored at $0000:0000. The top 4 kb (two +\ ** pages) is used to save autostart and application linkage +\ ** information. + + $0800:0000 $0800:FFFF cdata section liteSTM32F072uf \ code section in boot Flash + $2000:0000 $2000:0FFF idata section PROGd \ 4k IDATA + $2000:1000 $2000:3FFF udata section PROGu \ 12k UDATA + +interpreter +: prog liteSTM32F072uf ; \ synonym +target + +PROG PROGd PROGu CDATA \ use Code for HERE , and so on + + +\ ============================ +\ *N Stack and user area sizes +\ ============================ +\ *P These equates calculate how much RAM is needed for the USER area, +\ ** Return stack and data stack of each task, plus an area used +\ ** by Forth interrupts that share a common USER (and optionally) +\ ** common stacks. This can be done to reduce the overall amount +\ ** of RAM needed for interrupt stacks. Since interrupts can occur +\ ** in any task, switching stacks for high level interrupts will +\ ** reduce the total RAM requirements. + +$040 equ UP-SIZE \ size of each task's user area +$080 equ SP-SIZE \ size of each task's data stack +$080 equ RP-SIZE \ size of each task's return stack +up-size rp-size + sp-size + + equ task-size \ size of TASK data area +\ define the number of cells of guard space at the top of the data stack +#2 equ sp-guard \ can underflow the data stack by this amount + + +SP-SIZE 2 rshift 2 - equ max-depth \ max depth for UF data stack + +\ define nesting levels for interrupts and SWIs. +2 equ #IRQs \ number of IRQ stacks, + \ shared by all IRQs (1 min) +0 equ #SVCs \ number of SVC nestings permitted + \ 0 is ok if SVCs are unused + + +\ ========================== +\ *N Serial and ticker rates +\ ========================== + +1 equ useUSART1? \ -- n +\ *G Set non-zero to compile code for USART1, +\ ** device *\fo{Console1}. +#115200 equ console1-speed +\ *G *\fo{Console1} speed in BPS. + +0 equ useUSART2? \ -- n +\ *G Set non-zero to compile code for USART2, +\ ** device *\fo{Console2}. +#115200 equ console2-speed +\ *G *\fo{Console2} speed in BPS. + +0 equ useUSART3? \ -- n +\ *G Set non-zero to compile code for USART3, +\ ** device *\fo{Console3}. +115200 equ console3-speed +\ *G *\fo{Console3} speed in BPS. + +0 equ useUSART4? \ -- n +\ *G Set non-zero to compile code for USART4, +\ ** device *\fo{Console4}. +115200 equ console4-speed +\ *G *\fo{Console4} speed in BPS. + +1 equ console-port \ -- n ; Designate serial port for terminal (0..n). +\ *G Ports 1..4 are the on-chip UARTs. The internal USB device +\ ** is port 10, and bit-banged ports are defined from 20 onwards. + +#1 equ tick-ms \ -- ms +\ *G Timebase tick in ms. + + +\ ===================== +\ *N Software selection +\ ===================== + + 1 equ umbilical? \ true = Umbilical Forth, zero = standalone + 0 umbilical? and equ SPI? \ true for SPI Umbilical, false for serial + SPI? 0= equ Serial? \ true for Serial Umbilical, false for SPI + 1 equ init-idata? \ true if IDATA to be initialised + +\ Kernel components + 0 equ ColdChain? \ nz to use cold chain mechanism + 0 equ tasking? \ true if multitasker needed + 6 cells equ tcb-size \ for internal consistency check + 0 equ event-handler? \ true to include event handler + 0 equ message-handler? \ true to include message handler + 1 equ semaphores? \ true to include semaphores + 0 equ timebase? \ true for TIMEBASE code + 0 equ softfp? \ true for software floating point + 0 equ FullCase? \ true to include ?OF END-CASE NEXTCASE extensions + 0 equ target-locals? \ true if target local variable sources needed + 0 equ romforth? \ true for ROMForth handler + 0 equ blocks? \ true if BLOCK needed + $0000 equ sizeofheap \ 0=no heap, nz=size of heap + 0 equ heap-diags? \ true to include diagnostic code + 0 equ paged? \ true if ROM or RAM is paged/banked + 0 equ MPE-SET? \ compatibility with MPE v5 targets + 0 equ ENVIRONMENT? \ true if ANS ENVIRONMENT system required + +interpreter +: AtCold \ xt -- +\ *G Most Umbilical Forth systems do not use the *\fo{ColdChain} +\ ** mechanism provided in *\i{Kernel62.fth} for standalone +\ ** Forths. To prevent compilation problems, define *\fo{AtCold} +\ ** as *\fo{DROP}. Compilers built from December 2008 onwards +\ ** will warn you if *\fo{AtCold} is used before being defined +\ ** in the target code. + drop +; +target + + +\ ************ +\ *S Kernel files +\ ************ + + include %CpuDir%/CM0def \ Cortex generic equates and SFRs + include %CpuDir%/sfrSTM32F072 \ STM32F072 special function registers + include %CpuDir%/StackDef \ Reserve default task and stacks +PROGd sec-top 1+ equ UNUSED-TOP PROG \ top of memory for UNUSED + include %HwDir%/startSTM32F072 \ start up code + include %CpuDir%/minM0M1 \ code definitions +: selio-ser1 \ -- +\ *G Example to perform clock and pin selection for USART1 on PA9/10. +\ ** You cannot use the easy GPIO code for this unless the GPIO ports +\ ** are clocked and taken out of reset in the start up code. +\ Clocks and reset + _RCC + $0000 $0003 2 pick rccCFGR3 + setMask \ PCLK is UART clock + bit17 over rccAHBen + or! \ enable clock to GPIOA + bit17 over rccAHBrst + bic! \ take it out of reset + bit14 over rccAPB2en + or! \ enable clock to USART1 + bit14 over rccAPB2rst + bic! \ take it out of reset + drop +\ Default on PA9/10 + _GPIOA >r + $0028:0000 $003C:0000 r@ gpioMODER + setMask \ alternate function on 9/10 + $0000:0110 $0000:0FF0 r> gpioAFRH + setMask \ AF1 for both +; + include %CpuDir%/Drivers/serSTM32F0xxp \ polled serial driver +Include %CpuDir%/UFKernel \ Umbilical Forth high level kernel +umbilical? [if] + Synonym wait-byte serkey1 \ Say which XTL drivers to use + Synonym send-byte seremit1 + Synonym Wait-Byte? serkey?1 + Synonym Init-XTL Init-Ser + include %CpuDir%/MESSAGES \ Umbilical message equates + include %CpuDir%/Targend \ message driver +[then] + + +\ ************* +\ *S End of kernel +\ ************* + +: .CPU \ -- ; sign on + ." MPE STM32F072 " + [ Umbilical? ] [if] ." Umbilical " [else] ." Production " [then] + ." Forth" +; + + +\ ************************** +\ Load application code here +\ ************************** + +\ include %AppDir%\MyApp \ you can use a macro for APPDIR + + +\ ******************* +\ Load libraries here +\ ******************* + +libraries + include %CpuDir%/libM0M1 + include %CPuDir%/UFlib +end-libs + + +\ ************************************** +\ Define what happens at target power up +\ ************************************** + +(( +: test-UART \ -- char + ipvec @ >r opvec @ >r \ currently points to VUART + init-ser \ initialise UART + console0 dup ipvec ! opvec ! \ switch o/p to UART + ." Is the UART working? " key + r> opvec ! r> ipvec ! +; +)) + +Umbilical? [if] + make-turnkey run-umbilical \ in TARGEND.FTH + +\ Segger J-Link - Windows, OS X, Linux +\ jlink STM32F072RB 1000 Project.jlink \ device, speed, project file +\ useSWD \ use SWD rather than the default JTAG +\ PSUART0 set-sjl-link \ select Umbilical link through J-Link +\ Windows - USB serial port + c" \\.\COM14" console1-speed serial \ define link driver + c" dtr=off rts=off" ser-control \ define DTR and RTS +\ OS X - Keyspan HS19 USB adapter +\ c" /dev/cu.KeySerial1" console0-speed serial \ define link driver +\ c" 1 dtr 1 rts" ser-control \ define DTR and RTS + + cr ." You only need to download the LITESTM32F072UF section." + cr ." Program the Flash using the ST-Link utility" + cr ." Then answer N to the erase the Flash question." + cr + cr ." When you get the T:OK prompt, type .CPU to run" + cr ." the word .CPU from this file." + cr +\ cr ." Press any key to continue" key drop +\ cr + + umbilical-forth \ start interactive session +[else] +: test-start \ -- + init-ser \ initialise the serial port for our use + console ipvec ! console opvec ! \ I/O goes to VUART + c" This is the STM32F072 Chip speaking!" + count 0 + do dup c@ emit 1+ loop \ drop + begin + key emit + again +; + + Make-turnkey test-start \ application start up word +[then] + +finis + diff --git a/mwmouse/sources/old tab.ctl b/mwmouse/sources/old tab.ctl @@ -0,0 +1,445 @@ +\ tab.ctl - based on STM32F072RB discovery board standalone "Lite" Forth + +(( +Copyright (c) 2014 +MicroProcessor Engineering +133 Hill Lane +Southampton SO15 5AF +England + +tel: +44 (0)23 8063 1441 +fax: +44 (0)23 8033 9691 +net: mpe@mpeforth.com + tech-support@mpeforth.com +web: www.mpeforth.com + +From North America, our telephone and fax numbers are: + 011 44 23 8063 1441 + 011 44 23 8033 9691 + + +To do +===== + +Change history +============== +20140707 MPE002 Updated for Lite Forth v2. +20140205 MPE001 First release for STM32F0xx. +)) + + +\ ================ +\ *! tab +\ *T Control file for Duncan's tab board. +\ ================ +\ *P Every Forth project has a control file, which is similar to the +\ ** project file in other languages. The control file tells the +\ ** cross compiler all about the target. Not all of it is +\ ** documented here, but it is all commented in the source code. + +\ *P The control file *\M:\m_working\cross compilers\xArmCortexLite\CortexLite\Hardware\tab.ctl} +\ ** produces a standalone Forth for the Duncan's tab board. +\ ** The control files for other boards are very similar in structure, +\ ** and different in the details of the CPU and board specific +\ ** options. Read the specific code for your CPU and board. + +\ *P The serial port is connected to USART1 on pins PA9 (Tx -> PC Rx) and +\ ** PA10 (Rx -> PC Tx). +\ ** You cannot use the easy GPIO code for UART initialisation unless +\ ** the GPIO ports are clocked and taken out of reset in the start +\ ** up code. + +\ *P When you modify this file for your own hardware do not forget +\ ** to update the GPIO pin assignments and alternate function +\ ** selections. + +\ *P To Flash the board, you can use the low-cost ST-LINK/V2 JTAG unit, or use +\ ** the one integrated into the ST Discovery boards. +\ ** The ST-LINK Utility software is a +\ ** free download from the ST website *\f{www.st.com}. + +only forth definitions decimal + + +\ ************************** +\ *S Define directory macros +\ ************************** +\ *P The MPE cross compilers contain a useful text macro system. +\ ** Macros allow easy porting of control files when projects are +\ ** moved from their default locations. Each directory macro +\ ** defines where a particular set of files are located. + +\ *[ +c" ." setmacro AppDir \ application files +c" ." setmacro HwDir \ Board hardware files +c" ..\.." setmacro CpuDir \ CPU specific files +c" ..\..\Examples" setmacro ExampleDir \ example files +\ *] + + +\ ***************************** +\ *S Turn on the cross compiler +\ ***************************** + +\ *[ + +include %CpuDir%/Macros \ macros needed by the cross-compiler + +CROSS-COMPILE \ Turn host Forth into a cross-compiler + +only forth definitions \ default search order + + no-log \ uncomment to suppress output log + rommed \ split ROM/RAM target + interactive \ enter interactive mode at end + +xrefs \ enable cross references + align-long \ code is 32bit aligned + Cortex-M0 \ Thumb2 processor type and register usage + -LongCalls \ no calls outside 25 bit range + +FlashCompile \ target compiles to Flash + Hex-I32 \ also produce Intel Hex-32 obj format + +SaveCdataOnly \ no data area image files + +0 equ false +-1 equ true + +\ *] + +\ ******************* +\ *S Configure target +\ ******************* + +\ ============================== +\ *N STM32F0 variant definitions +\ ============================== + +$0800:0000 equ FlashBase \ -- addr +\ *G Start address of Flash. The bottom 2kb (the vector area) is +\ ** mirrored at $0000:0000 for booting. + +#128 kb equ /Flash \ -- len +\ *G Size of Flash. +2 kb equ /FlashPage \ -- len +\ *G Size of a Flash Page. +1 equ KeepPages \ -- u +\ *G Set this non-zero for the number of pages at the end of Flash +\ ** that are reserved for configuration data. Often set to 1 or 2 +\ ** by systems that use PowerNet. +FlashBase /Flash + /FlashPage KeepPages * - equ CfgFlash \ -- len +\ *G Base address of the configuration Flash area. + +$1FFF:C800 equ /InfoBase \ -- addr +\ *G Base address of system memory information block. + +#12 kb equ /SysMem \ -- len +\ *G Size of system memory block. + +$1FFF:F800 equ OptionBytes \ -- addr +\ *G Base address of option bytes +#16 equ /OptionBytes \ -- len +\ *G Number of option bytes + +#64 cells equ /ExcVecs \ -- len +\ *G Size of the exception/interrupt vector table. There are +\ ** 16 slots reserved by ARM. + +\ *P The system clocks are generated from PLLs. +\ ** How to set them up is non-obvious and is mostly documented +\ ** by the ST demonstration code in the file *\i{system_stm32f0x2.c}. +\ ** If you are not going to use an existing setup, copy and rename +\ ** one of the existing *\i{startSTM32F0xx.fth} files. + +8 MHz equ xtal-speed \ -- hz +\ *G Master oscillator crystal clock rate in HZ. This is the HSI +\ ** internal oscillator which has better than +/-1% accuracy and +\ ** is more accurate than the internal 48 MHz oscillator. +48 MHz equ system-speed \ -- hz +\ *G Requested CPU clock speed in HZ. Note that you must +\ ** calculate the PLL values. + +1 equ AHBdiv \ -- u +\ *G Division ratio of the AHB clock from the system clock. +\ ** This may not be more than 48 MHz. +1 equ APBdiv \ -- u +\ *G Division ratio of the APB clock from the system clock. +\ ** This may not be more than 48 MHz. + +system-speed AHBdiv / equ AHB-speed \ -- hz +\ *G AHB bus speed. +system-speed APBdiv / equ APB-speed \ -- hz +\ *G APB bus speed. + + +\ ============= +\ *N Memory map +\ ============= +\ *P If you are using the *\fo{Reflash} code in the *\i{ReProg} +\ ** folder, note that the Flash reprogramming code uses RAM +\ ** from $2000:0000..$2000:0FFF and its mirrors. Ensure that +\ ** your stacks are outside this region. + +\ *P The Flash memory starts at $0800:0000. The bottom 2 kb (the +\ ** vector area) is mirrored at $0000:0000. The top 4 kb (two +\ ** pages) is used to save autostart and application linkage +\ ** information. + +\ *[ + $0800:0000 $0800:BFFF cdata section tab \ code + $2000:0000 $2000:0FFF udata section PROGu \ 4k UDATA RAM + $2000:1000 $2000:3FFF idata section PROGd \ 12k IDATA RAM + +interpreter +: prog tab ; \ synonym +target + +PROG PROGd PROGu CDATA \ use Code for HERE , and so on + +$0801:F000 equ INFOSTART \ kernel status is saved here. +$0801:F800 equ APPSTART \ application data is saved here. +$0801:FFFF equ INFOEND \ end of kernel/application status data. +$2000:0000 equ RAMSTART \ start of RAM +$2000:4000 equ RAMEND \ end of RAM +$0800:0000 equ FLASHSTART \ start of Main Flash +$0810:0000 equ FLASHEND \ end of possible main Flash +$0800:C000 equ APPFLASHSTART \ start of application flash +$0801:F000 equ APPFLASHEND \ end of application flash +APPFLASHEND APPFLASHSTART - equ /APPFLASH \ size of application flash + +APPFLASHSTART TargetFlashStart \ sets HERE at kernel start up + +\ *] + + +\ ============================ +\ *N Stack and user area sizes +\ ============================ + +\ *[ +$0F0 equ UP-SIZE \ size of each task's user area +$0F0 equ SP-SIZE \ size of each task's data stack +$0100 equ RP-SIZE \ size of each task's return stack +up-size rp-size + sp-size + + equ task-size \ size of TASK data area +\ define the number of cells of guard space at the top of the data stack +#2 equ sp-guard \ can underflow the data stack by this amount + +$0100 equ TIB-LEN \ terminal i/p buffer length + +\ define nesting levels for interrupts and SWIs. +2 equ #IRQs \ number of IRQ stacks, + \ shared by all IRQs (1 min) +0 equ #SVCs \ number of SVC nestings permitted + \ 0 is ok if SVCs are unused +\ *] + + +\ ========================== +\ *N Serial and ticker rates +\ ========================== + +1 equ useUSART1? \ -- n +\ *G Set non-zero to compile code for USART1, +\ ** device *\fo{Console1}. +#115200 equ console1-speed +\ *G *\fo{Console1} speed in BPS. + +0 equ useUSART2? \ -- n +\ *G Set non-zero to compile code for USART2, +\ ** device *\fo{Console2}. +#115200 equ console2-speed +\ *G *\fo{Console2} speed in BPS. + +0 equ useUSART3? \ -- n +\ *G Set non-zero to compile code for USART3, +\ ** device *\fo{Console3}. +115200 equ console3-speed +\ *G *\fo{Console3} speed in BPS. + +0 equ useUSART4? \ -- n +\ *G Set non-zero to compile code for USART4, +\ ** device *\fo{Console4}. +115200 equ console4-speed +\ *G *\fo{Console4} speed in BPS. + +1 equ console-port \ -- n ; Designate serial port for terminal (0..n). +\ *G Ports 1..4 are the on-chip UARTs. The internal USB device +\ ** is port 10, and bit-banged ports are defined from 20 onwards. + +#1 equ tick-ms \ -- ms +\ *G Timebase tick in ms. + + +\ ===================== +\ *N Software selection +\ ===================== +\ *P With 128 kb of Flash we can select a comfortable set of +\ ** software and still have plenty of space for application +\ ** code. + +\ *[ + 0 equ Tiny? \ nz to make a minimal kernel. + 1 equ ColdChain? \ nz to use cold chain mechanism + 1 equ tasking? \ true if multitasker needed + 6 cells equ tcb-size \ for internal consistency check + 0 equ timebase? \ true for TIMEBASE code + 0 equ softfp? \ true for software floating point + 0 equ FullCase? \ true to include ?OF END-CASE NEXTCASE extensions + 0 equ target-locals? \ true if target local variable sources needed + 0 equ romforth? \ true for ROMForth handler + 0 equ blocks? \ true if BLOCK needed + $0000 equ sizeofheap \ 0=no heap, nz=size of heap + 1 equ heap-diags? \ true to include diagnostic code + 0 equ paged? \ true if ROM or RAM is paged/banked +\ *] + + +\ ***************** +\ default constants +\ ***************** + +cell equ cell \ size of a cell (16 bits) +0 equ false +-1 equ true + + +\ *************** +\ *S Kernel files +\ *************** + +\ *[ + include %CpuDir%/CM0def \ Cortex generic equates and SFRs + include %CpuDir%/sfrSTM32F072 \ STM32F072 special function registers + include %CpuDir%/StackDef \ Reserve default task and stacks +PROGd sec-top 1+ equ UNUSED-TOP PROG \ top of memory for UNUSED + include %HwDir%/startSTM32F072 \ start up code +l: crcslot + 0 , \ the kernel CRC +l: crcstart + include %CpuDir%/CodeM0lite \ low level kernel definitions + include %CpuDir%/Drivers/FlashSTM32 \ Flash programming code + include %CpuDir%/kernel72lite \ high level kernel definitions + include %CpuDir%/Drivers/rebootSTM32 \ reboot using watchdog + include %CpuDir%/IntCortex \ interrupt handlers for NVIC + include %CpuDir%/FaultCortex \ fault exception handlers for NVIC +\ *] +: selio-ser1 \ -- +\ *G Example to perform clock and pin selection for USART1 on PA9/10. +\ ** You cannot use the easy GPIO code for this unless the GPIO ports +\ ** are clocked and taken out of reset in the start up code. +\ Clocks and reset + _RCC + $0000 $0003 2 pick rccCFGR3 + setMask \ PCLK is UART clock + bit17 over rccAHBen + or! \ enable clock to GPIOA + bit17 over rccAHBrst + bic! \ take it out of reset + bit14 over rccAPB2en + or! \ enable clock to USART1 + bit14 over rccAPB2rst + bic! \ take it out of reset + drop +\ Default on PA9/10 + _GPIOA >r + $0028:0000 $003C:0000 r@ gpioMODER + setMask \ alternate function on 9/10 + $0000:0110 $0000:0FF0 r> gpioAFRH + setMask \ AF1 for both +; +\ *[ + include %CpuDir%/Drivers/serSTM32F0xxp \ polled serial driver + include %CpuDir%/Dump \ DUMP .S etc development tools + + include %CpuDir%/Drivers/gpioSTM32F0xx \ easy pin access +\ **** include %CpuDir%/Drivers/SysTickDisco072 + INCLUDE TABTICKER.FTH +\ ***** INCLUDE SysTick + \ Duncan's ticker + ' start-clock AtCold + +tasking? [if] + include %CpuDir%/MultiCM0lite \ multitasker +[then] + +\ *] + + +\ ************* +\ *S End of kernel +\ ************* +\ *P After the main kernel has been built, some version data is +\ ** laid down for use by the sign-on code. + +\ *[ + +buildfile tab.no +l: version$ + build$, +l: BuildDate$ + DateTime$, + +internal +: .banner \ -- + cr ." ****************************" +; + +: .CPU \ -- ; display CPU type + .banner + cr ." MPE Forth Lite for STM32F072 modified for Duncan's tab board" + cr version$ $. space BuildDate$ $. + cr ." Copyright (C) 2014 MicroProcessor Engineering Ltd." + .banner +; +external +\ *] +\ ******************* +\ Duncan's stuff +\ ***** include tabio.fth +\ ******************* + + +\ ******************* +\ *S Application code +\ ******************* +\ *P This code is not essential, but makes life very much easier. + +\ *[ +\ ***** include %HwDir%/ReProg/ReFlash \ ReFlash utility +\ ***** include %CpuDir%/include \ include from AIDE +\ ***** I need this for some reason!! +: end-load \ -- ; switch back to keyboard input +\ *G This word is automatically performed at the end of a download +\ ** to tidy up the comms. + xon/xoff off \ turn off handshaking + echoing on \ turn echoing back on +; +\ ***** + +\ ***** include %CpuDir%/Drivers/spiSTM32F0hard \ SPI2 driver +\ ***** include %CpuDir%/Examples/l3gd20 \ L3GD20 MEMS driver + +RAMEND constant RP-END \ end of available RAM +\ *] + + +\ *************** +\ *S Finishing up +\ *************** +\ *[ + +libraries \ to resolve common forward references + include %CpuDir%/LibM0M1 + include %CpuDir%/LIBRARY +end-libs + +decimal + +\ Add a kernel checksum +crcstart here crcslot crc32 checksum +/DefStart 128 > [if] + .( DEFSTART area too big ) abort +[then] + +update-build \ update build number file + +FINIS \ all done + +\ *] + + +\ ====== +\ *> ### +\ ====== diff --git a/mwmouse/sources/rebootSTM32.fth b/mwmouse/sources/rebootSTM32.fth @@ -0,0 +1,51 @@ +\ RebootSTM32.fth - Reboots STM32 CPUs + +(( +Copyright (c) 2010 +MicroProcessor Engineering +133 Hill Lane +Southampton SO15 5AF +England + +tel: +44 (0)23 8063 1441 +fax: +44 (0)23 8033 9691 +net: mpe@mpeforth.com + tech-support@mpeforth.com +web: www.mpeforth.com + +From North America, our telephone and fax numbers are: + 011 44 23 8063 1441 + 011 44 23 8033 9691 + + +To do +===== + +Change history +============== +)) + +decimal + +\ ========== +\ *> drivers +\ *S Rebooting the CPU +\ ========== +\ *P The word *\fo{REBOOT} permits the system to be reset by +\ ** disabling all interrupts and activating the watchdog. + +: reboot \ -- +\ *G Reboots the CPU by activating the watchdog. + di + bit0 _RCC rccCSR + or! \ enable LSI oscillator + $CCCC _IWDG iwdgKR + ! \ start watchdog + begin again \ wait for reset +; + + +\ ====== +\ *> ### +\ ====== + +decimal + diff --git a/mwmouse/sources/serSTM32F0xxp.fth b/mwmouse/sources/serSTM32F0xxp.fth @@ -0,0 +1,470 @@ +\ serSTM32F0xxp.fth - STM32F0xx polled serial driver + +(( +Copyright (c) 2009, 2011 +MicroProcessor Engineering +133 Hill Lane +Southampton SO15 5AF +England + +tel: +44 (0)23 8063 1441 +fax: +44 (0)23 8033 9691 +email: mpe@mpeforth.com + tech-support@mpeforth.com +web: http://www.mpeforth.com +Skype: mpe_sfp + +From North America, our telephone and fax numbers are: + 011 44 23 8063 1441 + 011 44 23 8033 9691 + 901 313 4312 (North American access number to UK office) + + +To do +===== + +Change history +============== +20120125 MPE002 Changed to use external pin selection words. +20111130 MPE001 Converted from STM32F103 +)) + +only forth definitions +decimal + +\ =========== +\ *> drivers +\ =========== +\ *S STM32F0 polled serial driver +\ ******************************* +\ *P The serial driver *\i{Cortex/Drivers/serSTM32F0xxp.fth} +\ ** provides polled serial drivers for the on-chip USARTs. +\ ** The supplied driver implements USART1 on PA9/10 and +\ ** USART3 on PD8 (Tx) and PD9 (Rx). + +\ *P When you copy this file for your own hardware do not forget +\ ** update the GPIO pin assignments and alternate function +\ ** selections. + + +\ *********************** +\ *N Baud rate generation +\ *********************** +\ *P The baud rate routines use 16 times sampling and the fractional +\ ** baud rate generator. + +\ *E pclkx +\ ** divisor = ------------- +\ ** 16 * baudrate +\ *P We then treat the divisor as an integer and four bit fraction, +\ ** effectively scaling it by 16 again. +\ *E pclkx +\ ** BRRval = -------- +\ ** baudrate + +interpreter +: genBRRval \ baud clock -- divisor +\ *G Generate the required BRR value. + 1 lshift \ for rounding + swap / \ brr = clock / baud + 1+ 1 rshift \ rounding +; +target + + +\ ************** +\ *N Shared code +\ ************** + +: (serKey?) \ base -- flag + usISR + @ bit5 and ; + +: (serkey) \ base -- char + begin + dup usISR + @ bit5 and 0= + while + pause + repeat + usRDR + @ $FF and +; + +: (seremit) \ char base -- + begin + dup usISR + @ bit7 and 0= + while + pause + repeat + usTDR + ! +; + +: (sertype) \ caddr len base -- + -rot bounds + ?do i c@ over (seremit) loop + drop +; + +: (sercr) \ base -- + #13 over (seremit) #10 swap (seremit) ; + +: +FaultConsole \ -- +\ *G For use in fault exception handlers, the multi-tasker must +\ ** be turned off and *\fo{EMIT) and friends must run in polled +\ ** mode. +; + +: (init-ser) \ brrval ^usart -- + $0000 over usCR1 + ! \ disable UART, 8 bits, no parity + $0000 over usCR2 + ! \ 1 stop bit, UART mode + $0000 over usCR3 + ! \ no interrupts, no DMA, no LIN, no smartcard + tuck usBRR + ! \ set baud rate + $000C over usCR1 + ! \ 8 bit, no parity, TE, RE + $000D over usCR1 + ! \ 8 bit, no parity, TE, RE, UE + drop +; + + +\ ********* +\ *N USART1 +\ ********* +\ *P USART1 is on the APB bus, so the baud rate is calculated +\ ** using that bus clock. + +useUSART1? [if] +_USART1 CONSTANT UART1 +console1-speed APB-speed genBRRval equ /us1BRR \ -- u +\ *G Baud rate divisor for USART1. + +(( +: selio-ser1 \ -- +\ *G Example to perform clock and pin selection for USART1 on PA9/10. +\ ** Provide your own version, e.g. in the control file. +\ Clocks and reset + _RCC + $0000 $0003 2 pick rccCFGR3 + setMask \ PCLK is UART clock + bit17 over rccAHBen + or! \ enable clock to GPIOA + bit17 over rccAHBrst + bic! \ take it out of reset + bit14 over rccAPB2en + or! \ enable clock to USART1 + bit14 over rccAPB2rst + bic! \ take it out of reset + drop +\ Default on PA9/10 + _GPIOA >r + $0028:0000 $003C:0000 r@ gpioMODER + setMask \ alternate function on 9/10 + $0000:0110 $0000:0FF0 r> gpioAFRH + setMask \ AF1 for both +; +)) + +: init-ser1 \ -- +\ *G Initialise USART1 for polled operation. Pin selection is +\ ** performed by *\fo{selio-ser1}. + selio-ser1 + /us1BRR _USART1 (init-ser) +; + +: serkey?1 \ -- flag +\ *G *\fo{KEY?} for USART1. + _USART1 (serkey?) ; + +: serkey1 \ -- char +\ *G *\fo{KEY} for USART1. + _USART1 (serkey) ; + +: seremit1 \ char -- +\ *G *\fo{EMIT} for USART1. + _USART1 (seremit) ; + +: serType1 \ c-addr len -- +\ *G *\fo{TYPE} for USART1. + _USART1 (sertype) ; + +: sercr1 \ -- +\ *G *\fo{CR} for USART1. + _USART1 (sercr) ; + +create Console1 \ -- addr ; OUT managed by upper driver +\ *G Device structure for USART1 +\ *[ + ' serkey1 , \ -- char ; receive char + ' serkey?1 , \ -- flag ; check receive char + ' seremit1 , \ -- char ; display char + ' sertype1 , \ caddr len -- ; display string + ' sercr1 , \ -- ; display new line +\ *] + +console-port 1 = [if] + console1 constant console +\ *G Device structure for console on USART1. +[then] + +[then] \ useUSART1? + + +useUSART2? [if] +_USART2 CONSTANT UART2 +console2-speed APB-speed genBRRval equ /us2BRR \ -- u +\ *G Baud rate divisor for USART1. + +: SER2CLOCKS ( --- ) +\ Clocks and reset + _RCC + $0000 $00030000 2 pick rccCFGR3 + setMask \ PCLK is UART clock + bit17 over rccAHBen + or! \ enable clock to GPIOA + bit17 over rccAHBrst + bic! \ take it out of reset + bit17 over rccAPB1en + or! \ enable clock to USART2 + bit17 over rccAPB1rst + bic! \ take it out of reset + drop ; + + +PA 2 PIO: TX2 +PA 3 PIO: RX2 + + +: SER2FUNCTIONS ( --- PA2, PA3) + 1 TX2 ISFUNCTION + 1 RX2 ISFUNCTION +\ _GPIOA >r +\ $0000:00C0 $0000:00F0 r@ gpioMODER + setMask \ alternate function on 2/3 ***** +\ $0000:1100 $0000:FF00 r> gpioAFRL + setMask \ AF1 for both + ; + +\ : SER2FUNCTIONS ( --- PA2, PA15) +\ _GPIOA >r +\ $8000:0020 $C000:0030 r@ gpioMODER + setMask \ alternate function on 2/15 ***** +\ $0000:0100 $0000:0F00 r@ gpioAFRL + setMask \ AF1 for both +\ $1000:0000 $F000:0000 r> gpioAFRH + setMask \ AF1 for both +\ ; + + +: selio-ser2 \ -- +\ *G Example to perform clock and pin selection for USART1 on PA9/10. +\ ** Provide your own version, e.g. in the control file. + SER2CLOCKS SER2FUNCTIONS ; + +: init-ser2 \ -- +\ *G Initialise USART2 for polled operation. Pin selection is +\ ** performed by *\fo{selio-ser2}. + selio-ser2 + /us2BRR _USART2 (init-ser) +; + +: serkey?2 \ -- flag +\ *G *\fo{KEY?} for USART2. + _USART2 (serkey?) ; + +: serkey2 \ -- char +\ *G *\fo{KEY} for USART2. + _USART2 (serkey) ; + +: seremit2 \ char -- +\ *G *\fo{EMIT} for USART2. + _USART2 (seremit) ; + +: serType2 \ c-addr len -- +\ *G *\fo{TYPE} for USART2. + _USART2 (sertype) ; + +: sercr2 \ -- +\ *G *\fo{CR} for USART2. + _USART2 (sercr) ; + +create Console2 \ -- addr ; OUT managed by upper driver +\ *G Device structure for USART1 +\ *[ + ' serkey2 , \ -- char ; receive char + ' serkey?2 , \ -- flag ; check receive char + ' seremit2 , \ -- char ; display char + ' sertype2 , \ caddr len -- ; display string + ' sercr2 , \ -- ; display new line +\ *] + +console-port 2 = [if] + console2 constant console +\ *G Device structure for console on USART2. +[then] + +[then] \ useUSART2? + + +\ ********* +\ *N USART3 +\ ********* +\ *P USART3 is on the APB1 bus, so the baud rate is calculated +\ ** using that bus clock. Or not. Use APB instead. + +\ This code is only compiled if the +\ ** equate *\fo{useUSART3} is non-zero}. + +useUSART3? [if] +_USART3 CONSTANT UART3 +console3-speed APB-speed genBRRval equ /us3BRR \ -- u +\ *G Baud rate divisor for USART3. + +PC 4 PIO: TX3 +PC 11 PIO: RX3 + + +: selio-ser3 \ -- +\ *G Example to perform clock and pin selection for USART3 +\ ** using GPIO pins PC4, PC11. + _RCC + $0000 $C0000 2 pick rccCFGR3 + setMask \ PCLK is UART clock + bit19 over rccAHBen + or! \ enable clock to GPIOA + bit19 over rccAHBrst + bic! \ take it out of reset + bit18 over rccAPB1en + or! \ enable clock to USART1 + bit18 over rccAPB1rst + bic! \ take it out of reset + drop + +\ alternate function on 4/11 + 1 TX3 ISFUNCTION + 1 RX3 ISFUNCTION +; + +: init-ser3 \ -- +\ *G Initialise USART3 for polled operation on GPIO pins PD8/9. + selio-ser3 + /us3BRR _USART3 (init-ser) +; + +: serkey?3 \ -- flag +\ *G *\fo{KEY?} for USART3. + _USART3 (serkey?) ; + +: serkey3 \ -- char +\ *G *\fo{KEY} for USART3. + _USART3 (serkey) ; + +: seremit3 \ char -- +\ *G *\fo{EMIT} for USART3. + _USART3 (seremit) ; + +: serType3 \ c-addr len -- +\ *G *\fo{TYPE} for USART3. + _USART3 (sertype) ; + +: sercr3 \ -- +\ *G *\fo{CR} for USART3. + _USART3 (sercr) ; + +create Console3 \ -- addr ; OUT managed by upper driver +\ *G Device structure for USART3. +\ *[ + ' serkey3 , \ -- char ; receive char + ' serkey?3 , \ -- flag ; check receive char + ' seremit3 , \ -- char ; display char + ' sertype3 , \ caddr len -- ; display string + ' sercr3 , \ -- ; display new line +\ *] + +console-port 3 = [if] + console3 constant console +\ *G Device structure if console is on USART3. +[then] + +[then] \ useUSART3? + +\ ********* +\ *N USART4 +\ ********* +\ *P USART4 is on the APB1 bus, so the baud rate is calculated +\ ** using that bus clock. Or not. Use APB instead. + +\ This code is only compiled if the +\ ** equate *\fo{useUSART3} is non-zero}. + +useUSART4? [if] +_USART4 CONSTANT UART4 +console4-speed APB-speed genBRRval equ /us4BRR \ -- u +\ *G Baud rate divisor for USART4. + +PA 1 PIO: RX4 +PC 10 PIO: TX4 + +: selio-ser4 \ -- +\ *G Example to perform clock and pin selection for USART4 +\ ** using GPIO pins PA1, PC10. + _RCC + bit19 over rccAHBEN + or! \ enable clock to GPIOC + bit19 over rccAHBRST + bic! \ take it out of reset + bit17 over rccAHBen + or! \ enable clock to GPIOA + bit17 over rccAHBrst + bic! \ take it out of reset + bit19 over rccAPB1EN + or! \ enable clock to USART4 + bit19 over rccAPB1RST + bic! \ take it out of reset + drop + + 4 RX4 ISFUNCTION + 0 TX4 ISFUNCTION +; + +: init-ser4 \ -- +\ *G Initialise USART4 for polled operation on GPIO pins PA1,PC10. + selio-ser4 + /us4BRR _USART4 (init-ser) +; + +: serkey?4 \ -- flag +\ *G *\fo{KEY?} for USART4. + _USART4 (serkey?) ; + +: serkey4 \ -- char +\ *G *\fo{KEY} for USART4. + _USART4 (serkey) ; + +: seremit4 \ char -- +\ *G *\fo{EMIT} for USART4. + _USART4 (seremit) ; + +: serType4 \ c-addr len -- +\ *G *\fo{TYPE} for USART4. + _USART4 (sertype) ; + +: sercr4 \ -- +\ *G *\fo{CR} for USART4. + _USART4 (sercr) ; + +create Console4 \ -- addr ; OUT managed by upper driver +\ *G Device structure for USART4. +\ *[ + ' serkey4 , \ -- char ; receive char + ' serkey?4 , \ -- flag ; check receive char + ' seremit4 , \ -- char ; display char + ' sertype4 , \ caddr len -- ; display string + ' sercr4 , \ -- ; display new line +\ *] + +console-port 4 = [if] + console4 constant console +\ *G Device structure if console is on USART4. +[then] + +[then] \ useUSART4? + + +\ ***************** +\ *N Initialisation +\ ***************** + +: init-ser \ -- +\ *G Initialise primary serial ports. +[ useUSART1? ] [if] init-ser1 [then] +[ useUSART2? ] [if] init-ser2 [then] +[ useUSART3? ] [if] init-ser3 [then] +[ useUSART4? ] [if] init-ser4 [then] +; + + +: SETBAUD ( n uart --- ) + SWAP APB-speed +\ *G Generate the required BRR value. + 1 lshift \ for rounding + swap / \ brr = clock / baud + 1+ 1 rshift \ rounding + SWAP usBRR + ! ; + +: IS-CONSOLE ( n --- ) + DUP OPVEC ! IPVEC ! ; + + +\ ====== +\ *> ### +\ ====== + +decimal diff --git a/mwmouse/sources/sfrSTM32F072.fth b/mwmouse/sources/sfrSTM32F072.fth @@ -0,0 +1,635 @@ +\ sfrSTM32F072.fth - peripheral definitions for STM32F0x1/2/8 + +(( +Copyright (c) 2010, 2012, 2013, 2014 +MicroProcessor Engineering +133 Hill Lane +Southampton SO15 5AF +England + +tel: +44 (0)23 8063 1441 +fax: +44 (0)23 8033 9691 +email: mpe@mpeforth.com + tech-support@mpeforth.com +web: http://www.mpeforth.com +Skype: mpe_sfp + +From North America, our telephone and fax numbers are: + 011 44 23 8063 1441 + 011 44 23 8033 9691 + 901 313 4312 (North American access number to UK office) + + +To do +===== + +Change history +============== +)) + +only forth definitions +decimal + + +\ =========== +\ *! sfrstm32f072 +\ *T STM32F072 memory and peripherals +\ =========== + + +\ ******************************** +\ Memory/Peripheral base addresses +\ ******************************** + +$0800:0000 equ _FLASH \ up to 128 kb + +$1FFF:C800 equ _SYSTEM \ 12 kb to 1FFF:F7FF +$1FFF:F800 equ _OPTION \ 2 kb to 1FFF:FFFF + +$2000:0000 equ _SRAM \ 40 kb +$2200:0000 equ _SRAM_BB \ bit-band region + +$4000:0000 equ _APB +$4000:0000 equ _APB1 +$4001:0000 equ _APB2 +$4200:0000 equ _PERIPH_BB \ bit-band region + +$4800:0000 equ _AHB2 +$4002:0000 equ _AHB1 + + +\ *********************** +\ Flash memory controller +\ *********************** + +\ Flash Program Erase Controller (FPEC) registers base address +$4002:2000 equ _FPEC \ _AHB1 0x3c00 + + +\ Register offsets +$00 equ flACR +$04 equ flKEYR +$08 equ flOPTKEYR +$0C equ flSR +$10 equ flCR +$14 equ flAR + +$1C equ flOBR +$20 equ flWRPR + +$00A5 equ flRDPRTkey \ keys needed to write registers +$45670123 equ flKEY1 +$CDEF89AB equ flKEY2 + + +\ *** +\ CRC +\ *** + +$4002:3000 equ _CRC \ AHB1 + $00 equ crcDR + $04 equ crcIDR + $08 equ crcCR + + $10 equ crcINIT + $14 equ crcPOL + + +\ ******************* +\ PWR - Power Control +\ ******************* + +$4000:7000 equ _PWR \ _APB1 0x7000 + + $00 equ pwrCR + $04 equ pwrCSR + + +\ *********************** +\ Reset and Clock Control +\ *********************** + +$4002:1000 equ _RCC \ AHB1 + +\ Register offsets +$00 equ rccCR \ Control Reg +$04 equ rccCFGR \ Clock Configuration +$08 equ rccCIR \ Clock Interrupt +$0C equ rccAPB2rst \ ABP2 reset +$10 equ rccAPB1rst \ APB1 reset +$14 equ rccAHBen \ AHB clock enable +$18 equ rccAPB2en \ APB2 clock enable +$1C equ rccAPB1en \ APB1 clock enable +$20 equ rccBDCR \ Backup Domain Control Reg +$24 equ rccCSR \ Control and Status Reg +$28 equ rccAHBrst \ AHB reset Reg, bit14=Ether, bit12=USB_OTG +$2C equ rccCFGR2 \ Clock Config Reg 2 +$30 equ rccCFGR3 \ Clock Config Reg 3 +$34 equ rccCR2 \ Control Reg 2 + + +\ *************************** +\ CRS - Clock Recovery System +\ *************************** + +$4000:6C00 equ _CRS \ APB + $00 equ crsCR + $04 equ crsCFGR + $08 equ crsISR + $0C equ crsICR + + +\ *********** +\ GPIO Blocks +\ *********** + +$4800:0000 equ _GPIOA \ AHB2 +$4800:0400 equ _GPIOB +$4800:0800 equ _GPIOC +$4800:0C00 equ _GPIOD +$4800:1000 equ _GPIOE +$4800:1400 equ _GPIOF + + +\ Register offsets + $00 equ gpioMODER \ mode register + $04 equ gpioOTYPER \ output type + $08 equ gpioOSPEEDR \ output speed + $0C equ gpioPUPDR \ pull up / pull down + $10 equ gpioIDR \ input data reg + $14 equ gpioODR \ output data reg + $18 equ gpioBSRR \ bit set / reset as 32 bit register + $18 equ gpioBSRRL \ low 16 bits to set + $1A equ gpioBSRRH \ high 16 bits to clear + $1C equ gpioLCKR \ configuration lock + $20 equ gpioAFRL \ alternate function low (4 bits per I/O pin) + $24 equ gpioAFRH \ alternate function high (4 bits per I/O pin) + $28 equ gpioBRR \ port bit reset + + +\ ******************************* +\ System Configuration Controller +\ ******************************* + +$4001:0000 equ _SYSCFG \ APB2 +$4001:0000 equ _COMP \ APB2 +$4001:0000 equ _OPAMP \ APB2 + $00 equ sysCFGR1 \ memory remap register, offset: 0x00 + + $08 equ sysEXTICR1 \ external interrupt configuration reg, offset: 0x08-0x14 + $0C equ sysEXTICR2 + $10 equ sysEXTICR3 + $14 equ sysEXTICR4 + $18 equ sysCFGR2 \ config reg 2 + + $1C equ compCSR + $1C equ comp1CSR + + +\ **************************** +\ External Event and Interrupt - EXTI +\ **************************** + +$4001:0400 equ _EXTI + $00 equ extiIMR + $04 equ extiEMR + $08 equ extiRTSR + $0C equ extiFTSR + $10 equ extiSWIER + $14 equ extiPR + + $00 equ extiIMR1 + $04 equ extiEMR1 + $08 equ extiRTSR1 + $0C equ extiFTSR1 + $10 equ extiSWIER1 + $14 equ extiPR1 + + +\ *** +\ DMA +\ *** + +$4002:0000 equ _DMA \ AHB1 +$4002:0000 equ _DMA1 \ AHB1 + $000 equ dmaISR \ interrupt status + $004 equ dmaIFCR \ interrupt flag clear (write 1) +\ channel 1 - 20 bytes per DMA channel + $008 equ dmaCCR1 + $00C equ dmaCNDTR1 + $010 equ dmaCPAR1 + $014 equ dmaCMAR1 +\ channel 2 + $01C equ dmaCCR2 + $020 equ dmaCNDTR2 + $024 equ dmaCPAR2 + $028 equ dmaCMAR2 +\ channel 3 + $030 equ dmaCCR3 + $034 equ dmaCNDTR3 + $038 equ dmaCPAR3 + $03C equ dmaCMAR3 +\ channel 4 + $044 equ dmaCCR4 + $048 equ dmaCNDTR4 + $04C equ dmaCPAR4 + $050 equ dmaCMAR4 +\ channel 5 + $058 equ dmaCCR5 + $05C equ dmaCNDTR5 + $060 equ dmaCPAR5 + $064 equ dmaCMAR5 +\ channel 6 - 07x only + $06C equ dmaCCR6 + $070 equ dmaCNDTR6 + $074 equ dmaCPAR6 + $078 equ dmaCMAR6 +\ channel 7 -07x only + $080 equ dmaCCR7 + $084 equ dmaCNDTR7 + $088 equ dmaCPAR7 + $08C equ dmaCMAR7 + + +\ ****************************** +\ Ananlogue to Digital Converter - ADC +\ ****************************** + +$4001:2400 equ _ADC \ APB + + $00 equ adcISR + $04 equ adcIER + $08 equ adcCR + $0C equ adcCFGR1 + $10 equ adcCFGR2 + $14 equ adcSMPR1 + + $20 equ adcTR + + $28 equ adcCHSELR + + $40 equ adcDR + + $308 equ adcCCR + + +\ ***************************** +\ Digital to Analogue Converter - DAC +\ ***************************** + +$4000:7400 equ _DAC + $00 equ dacCR + $04 equ dacSWTRIGR + $08 equ dacDHR12R1 + $0C equ dacDHR12L1 + $10 equ dacDHR8R1 + $14 equ dacDHR12R2 + $18 equ dacDHR12L2 + $1C equ dacDHR8R2 + $20 equ dacDHR12RD + $24 equ dacDHR12LD + $28 equ dacDHR8RD + $2C equ dacDOR1 + $30 equ dacDOR2 + $34 equ dacSR + + +\ ****** +\ Timers +\ ****** +\ Not all timers have all registers + +$4001:2C00 equ _TIM1 \ APB2 +$4000:0000 equ _TIM2 \ APB1 +$4000:0400 equ _TIM3 \ APB1 +\ $4000:0800 equ _TIM4 \ APB1 + +$4000:1000 equ _TIM6 \ APB1 +$4000:1400 equ _TIM7 \ APB1 +\ $4001:3400 equ _TIM8 \ APB2 + +$4000:2000 equ _TIM14 \ APB +$4001:4000 equ _TIM15 \ APB2 +$4001:4400 equ _TIM16 \ APB2 +$4001:4800 equ _TIM17 \ APB2 + $00 equ timCR1 + $04 equ timCR2 + $08 equ timSMCR + $0C equ timDIER + $10 equ timSR + $14 equ timEGR + $18 equ timCCMR1 + $1C equ timCCMR2 + $20 equ timCCER + $24 equ timCNT + $28 equ timPSC + $2C equ timARR + $30 equ timRCR + $34 equ timCCR1 + $38 equ timCCR2 + $3C equ timCCR3 + $40 equ timCCR4 + $44 equ timBDTR + $48 equ timDCR + $4C equ timDMAR + + $50 equ timOR + $54 equ timCCMR3 +\ $58 equ timCCR5 +\ $5C equ timCCR6 + + +\ **************** +\ IRTIM - Infrared +\ **************** +\ No specific registers, use TIM16/17 + + +\ ******************** +\ Independent Watchdog +\ ******************** + +$4000:3000 equ _IWDG \ _APB1 + + $00 equ iwdgKR + $04 equ iwdgPR + $08 equ iwdgRLR + $0C equ iwdgSR + $10 equ iwdgWINR + + +\ ***************** +\ Windowed Watchdog +\ ***************** + +$4000:2C00 equ _WWDG \ _APB1 + $00 equ wwdgCR + $04 equ wwdgCFR + $08 equ wwdgSR + + +\ === +\ RTC +\ === + +$4000:2800 equ _RTC \ APB1 + $000 equ rtcTR \ time + $004 equ rtcDR \ date + $008 equ rtcCR \ control + $00C equ rtcISR \ initialisation + $010 equ rtcPRER \ prescaler + $014 equ rtcWUTR \ wakeup timer + + $01C equ rtcALRMAR \ alarm A +\ $020 equ rtcALRMBR \ alarm B + $024 equ rtcWPR \ write protect + $028 equ rtcSSR \ subsecond + $02C equ rtcSHIFTR \ shift control + $030 equ rtcTSTR \ timestamp time + $034 equ rtcTSDR \ timestamp date + $038 equ rtcTSSSR \ timestamp subsecond + $03C equ rtcCALR \ calibration + $040 equ rtcTAFCR \ tamper, alt func cfg + $044 equ rtcALRMASSR \ alarm A subsecond +\ $048 equ rtcALRMBSSR \ alarm B subsecond + + $050 equ rtcBKP0R \ backup BBRMA $50..60 (20 bytes) + + +\ *** +\ I2C +\ *** + +$4000:5400 equ _I2C1 \ APB1 +$4000:5800 equ _I2C2 \ APB1 + $00 equ i2cCR1 + $04 equ i2cCR2 + $08 equ i2cOAR1 + $0C equ i2cOAR2 + $10 equ i2cTIMINGR + $14 equ i2cTIMEOUTR + $18 equ i2cISR + $1C equ i2cICR + $20 equ i2cPECR + $24 equ i2cRXDR + $28 equ i2cTXDR + + +\ ************ +\ USART blocks +\ ************ + +$4001:3800 equ _USART1 \ APB2 +$4000:4400 equ _USART2 \ APB1 +$4000:4800 equ _USART3 \ APB1 +$4000:4C00 equ _USART4 \ APB1 +\ $4000:5000 equ _UART5 \ APB1 + $00 equ usCR1 + $04 equ usCR2 + $08 equ usCR3 + $0C equ usBRR + $10 equ usGTPR + $14 equ usRTOR + $18 equ usRQR + $1C equ usISR + $20 equ usICR + $24 equ usRDR + $28 equ usTDR + + +\ ********** +\ SPI blocks +\ ********** + +$4001:3000 equ _SPI1 \ APB2 +$4000:3800 equ _SPI2 \ APB1 +\ $4000:3C00 equ _SPI3 \ APB1 + $000 equ spiCR1 + $004 equ spiCR2 + $008 equ spiSR + $00C equ spiDR + $010 equ spiCRCPR + $014 equ spiRXCRCR + $018 equ spiTXCRCR + $01C equ spiI2SCFGR + $020 equ spiI2SPR + + +\ ************************ +\ Touch Sensing Controller - TSC +\ ************************ + +$4002:4000 equ _TSC \ AHB1 + $00 equ tscCR + $04 equ tscIER + $08 equ tscICR + $0C equ tscISR + $10 equ tscIOHCR + + $18 equ tscIOASCR + + $20 equ tscIOSCR + + $28 equ tscIOCCR + + $30 equ tscIOGCSR + $34 equ tscIOG1CR + $38 equ tscIOG2CR + $3C equ tscIOG3CR + $40 equ tscIOG4CR + $44 equ tscIOG5CR + $48 equ tscIOG6CR + $4C equ tscIOG7CR + $50 equ tscIOG8CR + + +\ ***** +\ bxCAN +\ ***** + +$4000:6400 equ _bxCAN + $00 equ canMCR + $04 equ canMSR + $08 equ canTSR + $0C equ canRF0R + $10 equ canRF1R + $14 equ canIER + $18 equ canESR + $1C equ canBTR + + $180 equ canTI0R + $184 equ canTDT0R + $188 equ canTDL0R + $18C equ canTDH0R + $190 equ canTI1R + $194 equ canTDT1R + $198 equ canTDL1R + $19C equ canTDH1R + $1A0 equ canTI2R + $1A4 equ canTDT2R + $1A8 equ canTDL2R + $1AC equ canTDH2R + + $1B0 equ canRI0R + $1B4 equ canRDT0R + $1B8 equ canRDL0R + $1BC equ canRDH0R + $1C0 equ canRI1R + $1C4 equ canRDT1R + $1C8 equ canRDL1R + $1CC equ canRDH1R + + $200 equ canFMR + $204 equ canFM1R + + $20C equ canFS1R + + $214 equ canFFA1R + + $21C equ canFA1R + + $240 equ canF0R1 $240 equ canFxR1 + $244 equ canF0R2 $244 equ canFxR2 +\ ... + $318 equ canF27R1 + $31C equ canF27R2 + + +\ *** +\ USB +\ *** + +$4000:6000 equ _USBSRAM \ 512 bytes +$4000:5C00 equ _USBdev \ device peripheral + $00 equ usbEP0R + $04 equ usbEP1R + $08 equ usbEP2R + $0C equ usbEP3R + $10 equ usbEP4R + $14 equ usbEP5R + $18 equ usbEP6R + $1C equ usbEP7R + + $40 equ usbCNTR + $44 equ usbISTR + $48 equ usbFNR + $4C equ usbDADDR + $50 equ usbBTABLE + $54 equ usbLPMCSR + $58 equ usbBDCR + + +\ ******** +\ HDMI-CEC +\ ******** + +$4000:7800 equ _CEC + $00 equ cecCR + $04 equ cecCFGR + $08 equ cecTXDR + $0C equ cecRXDR + $10 equ cecISR + $14 equ cecIER + + +\ ************************ +\ Exception vector numbers +\ ************************ +\ Equates of the form xxxVec# refer to Exception Vector position, +\ whereas those of the form xxxInt# refer to Interrupt#. +\ Nearly all MPE code uses the Vec# form. To convert to Int#, +\ subtract 16 from the Vec#. + +#16 equ WWDGvec# +#17 equ PVDvec# +#18 equ RTCvec# +#19 equ FlashVec# +#20 equ RCCvec# +#21 equ ExtI0_1Vec# +#22 equ ExtI2_3Vec# +#23 equ ExtI4_15Vec# +#24 equ TSCVec# +#25 equ DMAC1Vec# +#26 equ DMAC2_3Vec# +#27 equ DMAC4_5_6_7Vec# +#28 equ ADC_COMPvec# +#29 equ TIM1_BRK_UP_TRGvec# +#30 equ TIM1_CCvec# +#31 equ TIM2vec# +#32 equ TIM3vec# +#33 equ TIM6_DACvec# +#34 equ TIM7Vec# +#35 equ TIM14vec# +#36 equ TIM15vec# +#37 equ TIM16vec# +#38 equ TIM17vec# +#39 equ I2C1_EXTI_23vec# +#40 equ I2C2vec# +#41 equ SPI1vec# +#42 equ SPI2vec# +#43 equ USART1_EXTI_25vec# +#44 equ USART2_EXTI_26vec# +#45 equ USART3_4vec# +#46 equ CEC_CAN_EXTI_27vec# +#47 equ USB_EXTI_18vec# + + +\ *********************** +\ *S Miscellaneous macros +\ *********************** + +interpreter +: setMask \ value mask addr -- ; cell operation +\ *G Clear the *\i{mask} bits at *\i{addr} and set (or) the +\ ** bits defined by *\i{value}. + tuck @ \ -- value addr mask x + swap invert and \ -- value addr x' + rot or \ -- addr x'' + swap ! +; +target + + +\ ====== +\ *> ### +\ ====== + +decimal diff --git a/mwmouse/sources/spiSTM32F0hard.fth b/mwmouse/sources/spiSTM32F0hard.fth @@ -0,0 +1,238 @@ +\ spiSTM32hard.fth - SPI for STM32F072B Discovery board + +(( +Copyright (c) 2012, 2014 +MicroProcessor Engineering +133 Hill Lane +Southampton SO15 5AF +England + +tel: +44 (0)23 8063 1441 +fax: +44 (0)23 8033 9691 +email: mpe@mpeforth.com + tech-support@mpeforth.com +web: http://www.mpeforth.com +Skype: mpe_sfp + +From North America, our telephone and fax numbers are: + 011 44 23 8063 1441 + 011 44 23 8033 9691 + 901 313 4312 (North American access number to UK office) + + +To do +===== + +Change history +============== +20140225 SFP002 Conversion to F072 Discovery board. +20121016 MPE001 Initial release. +)) + +only forth definitions +decimal + +\ ================= +\ *! drivers +\ *S STM32 SPI driver +\ ================= +\ *P STM32 devices and boards vary in their use of various pins. +\ ** Consequently the file *\i{Drivers/spiSTM32hard} is not +\ ** generic. The default configuration is for the STM32F072B-Disco +\ ** board to drive the L3GD20 MEMS Gyro as an SPI master with +\ ** CPOL=1 and CPHA=1. + +\ *P The SPI peripheral for STM32F0 devices is not entirely +\ ** compatible with the SPI of other STM32 families. + + +\ *************************** +\ *N Setup and initialisation +\ *************************** +\ *P The board uses I/O for SPI as follows. +\ *E PI.0 AF5 SSEL1 pin 131 SPI2_NSS +\ ** PI.1 AF5 SCK1 pin 132 SPI2_SCK +\ ** PI.2 AF5 MISO1 pin 133 SPI2_MISO +\ ** PI.3 AF5 MOS11 pin 134 SPI2_MOSI + +\ SPI1 - APB2 +\ SPI2 - APB1 +\ SPI3 - APB1 + +: genSPIbr \ spi-speed bus-speed -- brx + swap / 0 7 do \ -- divisor + dup 1 i lshift > + if drop i unloop exit endif + -1 +loop + drop 0 +; + +interpreter +: genSPIbr \ spi-speed bus-speed -- brx + swap / 0 7 do \ -- divisor + dup 1 i lshift > + if drop i unloop exit endif + -1 +loop + drop 0 +; +target + +: (initSPI) \ freq busfreq *spi -- +\ *G Set up the given SPI device, where *\i{freq} is the desired +\ ** SPI speed, *\i{busfreq} is the peripheral clock speed, and +\ ** *\i{*spi} is the SPI peripheral base address. The SPI bus is +\ ** set up in master mode, MSB first. + >r + bit6 r@ spiCR1 + bic! \ clear SPE bit + genSPIbr 3 lshift $0307 or \ SSM=1, SSI=1, SPE=0, MSTR=1, CPOL=1, CPHA=1 +\ cr ." initCR1 = " dup .dword + r@ spiCR1 + ! \ main mode control, CPOL=0, CPHA=0 + $1700 r@ spiCR2 + ! \ F1FO threshold 1 byte, 8 data bits + bit6 r> spiCR1 + or! \ set SPE bit +; + + +\ ******* +\ *N SPI2 +\ ******* + +1 MHz equ spi2-speed \ -- hz +\ *G Define the SPI2 clock in Herz. + +[undefined] selio-spi2 [if] +PC 0 pio: SPI2_NCS_MEMS \ software driven +PB 13 pio: SPI2_SCK +PB 14 pio: SPI2_MISO +PB 15 pio: SPI2_MOSI + +: isSPIpin \ pin -- +\ *G Set up the pin as an SPI pin. + 0 over isFunction HighSpeed swap isPinSpeed +; + +: selio-spi2 \ -- +\ *G Example to perform clock and pin selection for SPI2 on PC0, +\ ** PB13, PB14, and PB15. +\ Clocks and reset + $00C0:0000 _RCC + 2dup rccAHBen + or! \ enable clock to GPIOB/C + rccAHBrst + bic! \ take it out of reset + bit14 _RCC + 2dup rccAPB1en + or! \ enable clock to SPI2 + rccAPB1rst + bic! \ take it out of reset +\ Default on PC0, PB13, PB14, PB15 + SPI2_NCS_MEMS dup isOutput MediumSpeed over isPinSpeed setPin + SPI2_SCK isSPIpin SPI2_MISO isSPIpin SPI2_MOSI isSPIpin +; +[then] + +\ **************** +\ *N SPI transfers +\ **************** +\ *P These routines have been optimised for speed over space +\ ** considerations. For high speed use with SD cards, you will +\ ** get best performance using interrupt driven or DMA driven +\ ** operation. + +(( SPI status register +Bit Symbol Description +0 RXNE Receive FIFO Not Empty. This bit is 0 if the Receive + FIFO is empty, 1 if not. +1 TXE Transmit FIFO Empty. This bit is 1 is the Transmit FIFO is + empty. +7 BSY Busy. This bit is 0 if the SSP controller is idle, + or 1 if it is currently sending/receiving a frame + and/or the Tx FIFO is not empty. +)) + +: SPIXchg \ bout *spi -- bin +\ *G Write data to SPIx and return the received byte. + tuck spiDR + c! \ -- *spi ; starts TX/RX, must be byte + noop noop noop noop \ time for flags to react + begin \ Wait for BSY=0, TXE=1, RXNE=1 + dup spiSR + @ $0083 and $0003 = + until + spiDR + c@ $FF and \ return received byte +; + +IsLeaf : spiFlush \ -- +\ *G Flush the SPI2 input queue. + _SPI2 begin + dup spiSR + @ bit0 and + while + dup spiDR + @ drop + repeat + drop +; + +: spi! \ b -- +\ *G Write data to SPI2 and discard the received byte. + _SPI2 SPIXchg drop +; + +: spi@ \ -- b +\ *G Write an idle byte to SPI2 and return the received byte. + $FF _SPI2 SPIXchg +; + +: InitSPI2 \ -- +\ *G Initialise SPI2. + selio-SPI2 + #1000000 APB-speed _SPI2 (initSPI) + spiFlush +; + +: .spi2 \ -- +\ *G Display SPI2 peripheral registers. + _SPI2 $40 pdump +; + +system-speed spi2-speed / equ SPIclocks \ -- n +\ *G The number of CPU clocks in a bit time. + +#10 equ clocksOver +\ *G the number of clocks needed over and above the loop itself. +\ ** This number may be sensitive to the compiler version and +\ ** switch settings. + +4 equ clocksPer +\ *G the number of clocks needed for each iteration of the loop +\ ** in *\fo{spiDelay} below. This number may be sensitive to the +\ ** compiler version and switch settings. On most Cortex CPUs, +\ ** a store takes 2 cycles, a load takes 3, a branch takes 3 +\ ** and all others take 1. Look at the core documentation from +\ ** ARM for clock/instruction details. +\ ** Look at your board schematics and setup code for details of the +\ ** memory bandwidth. For example, running code from a 16 bit bus +\ ** with two wait states and no cache may lead to six or more +\ ** clocks per instruction. Running code from internal buffered +\ ** Flash may result in no extra clocks in practice. + +SPIclocks clocksOver - clocksPer / equ /SPIbit \ -- n +\ *G The number n for "begin 1- dup 0= until" to generate an +\ ** SPI bit time. + +/SPIbit 1 < [if] + cr ." *** SPI requested rate too fast for CPU ***" abort +[then] + +IsLeaf : SPIdelay \ -- +\ *G Wait one SPI bit time. + /SPIbit begin 1- dup 0= until drop +; + +: CSlo_MEMS \ -- +\ *G Set CS line low. + spidelay SPI2_NCS_MEMS clrPin spidelay +; + +: CShi_MEMS \ -- +\ *G Set CS line hi. + spidelay SPI2_NCS_MEMS setPin spidelay ; + + +\ ====== +\ *> ### +\ ====== + +decimal diff --git a/mwmouse/sources/startSTM32F072.fth b/mwmouse/sources/startSTM32F072.fth @@ -0,0 +1,245 @@ +\ startSTM32F072.fth - Cortex startup code for SM32F072B-DISCO board + +(( +Copyright (c) 2010, 2011, 2012, 2014 +MicroProcessor Engineering +133 Hill Lane +Southampton SO15 5AF +England + +tel: +44 (0)23 8063 1441 +fax: +44 (0)23 8033 9691 +email: mpe@mpeforth.com + tech-support@mpeforth.com +web: http://www.mpeforth.com +Skype: mpe_sfp + +From North America, our telephone and fax numbers are: + 011 44 23 8063 1441 + 011 44 23 8033 9691 + 901 313 4312 (North American access number to UK office) + + +To do +===== + +Change history +============== +20140205 MPE003 STM32F072 conversion +20120322 MPE002 STM32F107 conversion +20100112 MPE001 First release. +)) + +only forth definitions decimal + +\ =========== +\ *! startstm32f072 +\ *T Cortex start up for STM32F072 +\ =========== + +l: ExcVecs \ -- addr ; start of vector table +\ *G The exception vector table is *\fo{/ExcVecs} bytes long. The +\ ** equate is defined in the control file. Note that this table +\ ** table must be correctly aligned as described in the Cortex-M3 +\ ** Technical Reference Manual (ARM DDI0337, rev E page 8-21). If +\ ** placed at 0 or the start of Flash, you'll usually be fine. + /ExcVecs allot&erase + +interpreter +: SetExcVec \ addr exc# -- +\ *G Set the given exception vector number to the given address. +\ ** Note that for vectors other than 0, the Thumb bit is forced +\ ** to 1. + dup if \ If not the stack top + swap 1 or swap \ set the Thumb bit + endif + cells ExcVecs + ! ; +target + +L: CLD1 \ holds xt of main word + 0 , \ fixed by MAKE-TURNKEY + +proc DefExc2 b $ end-code \ NMI +proc DefExc3 b $ end-code \ HardFault +proc DefExc4 b $ end-code \ MemManage +proc DefExc5 b $ end-code \ BusFault +proc DefExc6 b $ end-code \ UsageFault +proc DefExc11 b $ end-code \ SVC +proc DefExc12 b $ end-code \ DbgMon +proc DefExc14 b $ end-code \ PendSV +proc DefExc15 b $ end-code \ SysTick + + +\ Calculate the initial value for the data stack pointer. +\ We allow for TOS being in a register and guard space. + +[undefined] sp-guard [if] \ if no guard value is set +0 equ sp-guard +[then] + +init-s0 tos-cached? sp-guard + cells - + equ real-init-s0 \ -- addr +\ The data stack pointer set at start up. + +interpreter +: prediv4 \ u -- x +\ *G Convert a divider value to a 4 bit pattern as used for HPRE. + case + 1 of %0000 endof + 2 of %1000 endof + 4 of %1001 endof + 8 of %1010 endof + 16 of %1011 endof + 64 of %1100 endof + 128 of %1101 endof + 256 of %1110 endof + 512 of %1111 endof + true abort" Invalid AHB prescaler setting" + endcase +; + +: prediv3 \ u -- x +\ *G Convert a divider value to a 3 bit pattern as used for PPRE. + case + 1 of %000 endof + 2 of %100 endof + 4 of %101 endof + 8 of %110 endof + 16 of %111 endof + true abort" Invalid PPREx prescaler setting" + endcase +; + +: pllmul1 \ u -- x +\ *G Convert a multiplier value to the 4 bit pattern as used for +\ ** PLLMUL. + dup 2 16 within? 0= abort" Invalid PLLMUL setting" + 2- +; +target + +\ *P We set up for 48 MHz CPU speed from the HSI oscillator. +\ ** The HSI oscillator is more accurate than the HSI48, so +\ ** the HSI is better for UART use. +0 \ also the reset value +$04 24 lshift or \ MCO from SystemClock +system-speed xtal-speed / pllmul1 + 18 lshift or \ PLLin * x ; PLLin = 8MHz + \ bit17 set from bits3:0 in rccCFGR2 +%01 15 lshift or \ PLLSRC from HSI/PREDIV +APBdiv prediv3 8 lshift or \ APB clock +AHBdiv prediv4 4 lshift or \ AHB clock + equ initCFGRval \ -- x +\ *G Bit settings for the RCC_CFGR register. +0 +0 or \ prediv = 0 FOR NO DIVIDE + equ initCFGR2val \ -- x +\ *G Bit settings for the RCC_CFGR2 register. + +\ *P The number of wait states required by the Flash depends on +\ ** the operating frequency. +system-speed 1- 24 MHz / equ FLWS \ -- u +\ *G The number of Flash wait states required. + +bit4 ( PRFTBE ) FLWS or equ initACRval \ -- x +\ *G Initial value written to the FLASH_ACR register + +internal +: setClocks \ -- +\ *G Enable the clocks, set the bus dividers, and enable the PLLs +\ ** as required. the PLL IS used to generate the main 48 MHz +\ ** clock. By default, the AHB and APB busses are run at +\ ** SYSCLK + _RCC + +\ ensure internal clock is running + bit0 over rccCR + or! \ set HSION + begin + dup rccCR + @ bit1 and \ wait for HSIRDY + until +(( +\ start external clock + bit16 over rccCR + or! \ set HSEON + begin + dup rccCR + @ bit17 and \ wait for HSERDY + until +)) + +\ Set up the Flash configuration + initACRval _FPEC flACR + ! \ Enable caches and set wait states + +\ set prescalers and PLL configurations + initCFGRval over rccCFGR + ! \ set AHB, APB1, APB2 prescalers + initCFGR2val over rccCFGR2 + ! \ PLL2/3 and dividers + +\ start main PLL + bit24 over rccCR + or! \ set PLLON + begin + dup rccCR + @ bit25 and \ wait for PLLRDY + until + +\ switch to the PLL output + $0002 $0003 2 pick rccCFGR + setMask \ set SW=2 + begin + dup rccCFGR + @ $000C and $0008 = \ wait for SWS=2 + until + + drop +; + +: StartCortex \ -- ; never exits +\ *G Set up the Forth registers and start Forth. Other primary +\ ** hardware initialisation can also be performed here. +\ ** All the GPIO blocks are enabled. + begin + INT_STACK_TOP SP_main sys! \ set SP_main for interrupts + INIT-R0 SP_process sys! \ set SP_process for tasks + 2 control sys! \ switch to SP_process + REAL-INIT-S0 set-sp \ Allow for cached TOS and guard space + INIT-U0 up! \ USER area + $007E:0014 _RCC rccAHBen + or! \ enable GPIOs, FLIT and SRAM + $007E:0000 _RCC rccAHBrst + bic! \ no reset to GPIOs + setClocks + CLD1 @ execute + again +; +external + +INT_STACK_TOP StackVec# SetExcVec \ Define initial return stack +' StartCortex ResetVec# SetExcVec \ Define startup word +DefExc2 2 SetExcVec +DefExc3 3 SetExcVec +DefExc4 4 SetExcVec +DefExc5 5 SetExcVec +DefExc11 11 SetExcVec +DefExc12 12 SetExcVec +DefExc14 14 SetExcVec +DefExc15 15 SetExcVec + + +\ ------------------------------------------ +\ reset values for user and system variables +\ ------------------------------------------ + +[undefined] umbilical? [if] +L: USER-RESET + init-s0 tos-cached? sp-guard + cells - , \ s0 + init-r0 , \ r0 + 0 , 0 , \ #tib, 'tib + 0 , 0 , \ >in, out + $0A , 0 , \ base, hld + +\ initial values of system variables +L: INIT-FENCE 0 , \ fence +L: INIT-DP 0 , \ dp +L: INIT-RP 0 , \ RP +L: INIT-VOC-LINK 0 , \ voc-link +[then] + + +\ ====== +\ *> ### +\ ====== + +decimal + diff --git a/mwmouse/sources/tab.ctl b/mwmouse/sources/tab.ctl @@ -0,0 +1,409 @@ +\ liteSTM32F072sa.ctl - STM32F072RB discovery board standalone "Lite" Forth +\ Modified for TAB by Duncan Louttit August 2023 onwards + +(( +Copyright (c) 2014 +MicroProcessor Engineering +133 Hill Lane +Southampton SO15 5AF +England + +tel: +44 (0)23 8063 1441 +fax: +44 (0)23 8033 9691 +net: mpe@mpeforth.com + tech-support@mpeforth.com +web: www.mpeforth.com + +From North America, our telephone and fax numbers are: + 011 44 23 8063 1441 + 011 44 23 8033 9691 + + +To do +===== + +Change history +============== +20140205 MPE001 First release for STM32F0xx. +)) + + +\ ================ +\ *! stm32f072litesa +\ *T Control file for STM32F072 Discovery board +\ ================ +\ *P The control file tab.ctl +\ ** produces a standalone Forth for the STM32F072 Discovery board. +\ ** The serial port is connected to USART1 on pins PA9 (Tx) and +\ ** PA10 (Rx). +\ ** You cannot use the easy GPIO code for UART initialisation unless +\ ** the GPIO ports are clocked and taken out of reset in the start +\ ** up code. + +\ *P When you modify this file for your own hardware do not forget +\ ** to update the GPIO pin assignments and alternate function +\ ** selections. + +\ *P You can easily use the low-cost ST-LINK/V2 JTAG unit, or use +\ ** the one integrated into the ST Discovery boards. +\ ** The ST-LINK Utility software is a +\ ** free download from the ST website *\f{www.st.com}. + +only forth definitions decimal + + +\ ****************************** +\ Define the default directories +\ ****************************** + +c" ." setmacro AppDir \ application files +c" ." setmacro HwDir \ Board hardware files +c" ." setmacro CpuDir \ CPU specific files +c" ..\Common" setmacro CommonDir \ common high level files +c" ..\Examples" setmacro ExampleDir \ example files + + +\ *************************************** +\ Load compiler extensions such as macros +\ *************************************** + +include Macros + + +\ ********************************************************* +\ Turn on the cross compiler and define CPU and log options +\ ********************************************************* + +\ file: PROG.log \ uncomment to send log to a file + +CROSS-COMPILE + +only forth definitions \ default search order + + no-log \ uncomment to suppress output log + rommed \ split ROM/RAM target + interactive \ enter interactive mode at end + +xrefs \ enable cross references + align-long \ code is 32bit aligned + Cortex-M0 \ Thumb2 processor type and register usage + -LongCalls \ no calls outside 25 bit range + +FlashCompile \ target compiles to Flash + Hex-I32 \ also produce Intel Hex-32 obj format + +SaveCdataOnly \ no data area image files + +0 equ false +-1 equ true + + +\ ******************* +\ *S Configure target +\ ******************* + +\ ====================== +\ *N STM32F0 variant definitions +\ ====================== + +$0800:0000 equ FlashBase \ -- addr +\ *G Start address of Flash. The bottom 2kb (the vector area) is +\ ** mirrored at $0000:0000 for booting. + +#128 kb equ /Flash \ -- len +\ *G Size of Flash. +2 kb equ /FlashPage \ -- len +\ *G Size of a Flash Page. +1 equ KeepPages \ -- u +\ *G Set this non-zero for the number of pages at the end of Flash +\ ** that are reserved for configuration data. Often set to 1 or 2 +\ ** by systems that use PowerNet. +FlashBase /Flash + /FlashPage KeepPages * - equ CfgFlash \ -- len +\ *G Base address of the configuration Flash area. + +$1FFF:C800 equ /InfoBase \ -- addr +\ *G Base address of system memory information block. + +#12 kb equ /SysMem \ -- len +\ *G Size of system memory block. + +$1FFF:F800 equ OptionBytes \ -- addr +\ *G Base address of option bytes +#16 equ /OptionBytes \ -- len +\ *G Number of option bytes + +#64 cells equ /ExcVecs \ -- len +\ *G Size of the exception/interrupt vector table. There are +\ ** 16 reserved by ARM. + +\ *P The system clocks are generated from PLLs. +\ ** How to set them up is non-obvious and is mostly documented +\ ** by the ST demonstration code in the file *\i{system_stm32f0x2.c}. +\ ** If you are not going to use an existing setup, copy and rename +\ ** one of the existing *\i{startSTM32F0xx.fth} files. + +8 MHz equ xtal-speed \ -- hz +\ *G Master oscillator crystal clock rate in HZ. This is the HSI +\ ** internal oscillator which has better than +/-1% accuracy and +\ ** is more accurate than the internal 48 MHz oscillator. +48 MHz equ system-speed \ -- hz +\ *G Requested CPU clock speed in HZ. Note that you must +\ ** calculate the PLL values. + +1 equ AHBdiv \ -- u +\ *G Division ratio of the AHB clock from the system clock. +\ ** This may not be more than 48 MHz. +1 equ APBdiv \ -- u +\ *G Division ratio of the APB clock from the system clock. +\ ** This may not be more than 48 MHz. + +system-speed AHBdiv / equ AHB-speed \ -- hz +\ *G AHB bus speed. +system-speed APBdiv / equ APB-speed \ -- hz +\ *G APB bus speed. + + +\ ============= +\ *N Memory map +\ ============= +\ *P If you are using the *\fo{Reflash} code in the *\i{ReProg} +\ ** folder, note that the Flash reprogramming code uses RAM +\ ** from $2000:0000..$2000:0FFF and its mirrors. Ensure that +\ ** your stacks are outside this region. + +\ *P The Flash memory starts at $0800:0000. The bottom 2 kb (the +\ ** vector area) is mirrored at $0000:0000. The top 4 kb (two +\ ** pages) is used to save autostart and application linkage +\ ** information. + + $0800:0000 $0800:BFFF cdata section tab \ code section in boot Flash +\ ***** $2000:0000 $2000:0FFF idata section PROGd \ 4k IDATA +\ ***** $2000:1000 $2000:3FFF udata section PROGu \ 12k UDATA + $2000:0000 $2000:1FFF idata section PROGd \ 8k IDATA + $2000:2000 $2000:3FFF udata section PROGu \ 8k UDATA + +interpreter +: prog tab ; \ synonym +target + +PROG PROGd PROGu CDATA \ use Code for HERE , and so on + +$0801:F000 equ INFOSTART \ 2 pages of 2 kb +$0801:F800 equ APPSTART +$0801:FFFF equ INFOEND +$2000:0000 equ RAMSTART +$2000:4000 equ RAMEND +$0800:0000 equ FLASHSTART \ start of Main Flash +$0810:0000 equ FLASHEND \ end of possible main Flash +$0800:C000 equ APPFLASHSTART \ start of application flash +$0801:F000 equ APPFLASHEND \ end of application flash +$0000:F000 equ /APPFLASH \ size of application flash + +APPFLASHSTART TargetFlashStart \ sets HERE at kernel start up + +\ ============================ +\ *N Stack and user area sizes +\ ============================ + +$0F0 equ UP-SIZE \ size of each task's user area +$0F0 equ SP-SIZE \ size of each task's data stack +$0100 equ RP-SIZE \ size of each task's return stack +up-size rp-size + sp-size + + equ task-size \ size of TASK data area +\ define the number of cells of guard space at the top of the data stack +#2 equ sp-guard \ can underflow the data stack by this amount + +$0100 equ TIB-LEN \ terminal i/p buffer length + +\ define nesting levels for interrupts and SWIs. +2 equ #IRQs \ number of IRQ stacks, + \ shared by all IRQs (1 min) +0 equ #SVCs \ number of SVC nestings permitted + \ 0 is ok if SVCs are unused + +\ ========================== +\ *N Serial and ticker rates +\ ========================== + +1 equ useUSART1? \ -- n +\ *G Set non-zero to compile code for USART1, +\ ** device *\fo{Console1}. +\ #921600 equ console1-speed + #9600 equ console1-speed +\ #38400 equ console1-speed +\ #115200 equ console1-speed +\ *G *\fo{Console1} speed in BPS. + +1 equ useUSART2? \ -- n +\ *G Set non-zero to compile code for USART2, +\ ** device *\fo{Console2}. +#921600 equ console2-speed +\ #115200 equ console2-speed +\ *G *\fo{Console2} speed in BPS. + +1 equ useUSART3? \ -- n +\ *G Set non-zero to compile code for USART3, +\ ** device *\fo{Console3}. +115200 equ console3-speed +\ *G *\fo{Console3} speed in BPS. + +1 equ useUSART4? \ -- n +\ *G Set non-zero to compile code for USART4, +\ ** device *\fo{Console4}. +115200 equ console4-speed +\ *G *\fo{Console4} speed in BPS. + +1 equ console-port \ -- n ; Designate serial port for terminal (0..n). +\ *G Ports 1..4 are the on-chip UARTs. The internal USB device +\ ** is port 10, and bit-banged ports are defined from 20 onwards. + +#1 equ tick-ms \ -- ms +\ *G Timebase tick in ms. + + +\ ===================== +\ *N Software selection +\ ===================== + +\ Kernel components + 1 equ ColdChain? \ nz to use cold chain mechanism + 1 equ tasking? \ true if multitasker needed + 6 cells equ tcb-size \ for internal consistency check + 0 equ timebase? \ true for TIMEBASE code + 1 equ softfp? \ true for software floating point + 0 equ FullCase? \ true to include ?OF END-CASE NEXTCASE extensions + 0 equ target-locals? \ true if target local variable sources needed + 0 equ romforth? \ true for ROMForth handler + 0 equ blocks? \ true if BLOCK needed + $0000 equ sizeofheap \ 0=no heap, nz=size of heap + 1 equ heap-diags? \ true to include diagnostic code + 0 equ paged? \ true if ROM or RAM is paged/banked +\ 0 equ ENVIRONMENT? \ true if ANS ENVIRONMENT system required + + 0 equ PowerNet? \ -- flag +\ *G Set non-zero to compile the PowerNet TCP/IP stack. + + +\ ***************** +\ default constants +\ ***************** + +cell equ cell \ size of a cell (16 bits) +0 equ false +-1 equ true + + +\ ************ +\ *S Kernel files +\ ************ + + include CM0def \ Cortex generic equates and SFRs + include sfrSTM32F072 \ STM32F072 special function registers + include StackDef \ Reserve default task and stacks +PROGd sec-top 1+ equ UNUSED-TOP PROG \ top of memory for UNUSED + include startSTM32F072 \ start up code +l: crcslot + 0 , +l: crcstart + include CodeM0lite \ low level kernel definitions + include FlashSTM32 \ Flash programming code + include kernel72lite \ high level kernel definitions + include rebootSTM32 \ reboot using watchdog + include IntCortex \ interrupt handlers for NVIC + include FaultCortex \ fault exception handlers for NVIC + + +: selio-ser1 \ -- +\ *G Example to perform clock and pin selection for USART1 on PA9/10. +\ ** You cannot use the easy GPIO code for this unless the GPIO ports +\ ** are clocked and taken out of reset in the start up code. +\ Clocks and reset + _RCC + $0000 $0003 2 pick rccCFGR3 + setMask \ PCLK is UART clock + bit17 over rccAHBen + or! \ enable clock to GPIOA + bit17 over rccAHBrst + bic! \ take it out of reset + bit14 over rccAPB2en + or! \ enable clock to USART1 + bit14 over rccAPB2rst + bic! \ take it out of reset + drop +\ Default on PA9/10 + _GPIOA >r + $0028:0000 $003C:0000 r@ gpioMODER + setMask \ alternate function on 9/10 + $0000:0110 $0000:0FF0 r> gpioAFRH + setMask \ AF1 for both +; + include gpioSTM32F0xx \ easy pin access + include serSTM32F0xxp \ polled serial driver + include Dump \ DUMP .S etc development tools + + include SysTickDisco072 + ' start-clock AtCold + +tasking? [if] + include MultiCM0lite \ multitasker +[then] + +\ ************* +\ *S End of kernel +\ ************* + +buildfile tab.no +l: version$ + build$, +l: BuildDate$ + DateTime$, + +internal +: .banner \ -- + cr ." ****************************" +; + +: .CPU \ -- ; display CPU type + .banner + cr ." MPE PowerForth for STM32F072" + CR ." Modified for TAB" + cr version$ $. space BuildDate$ $. + .banner +; +external + + +\ ******************* +\ *S Application code +\ ******************* +\ ***** +CR CR ." so far so good" +\ ***** + + include ReFlash \ ReFlash utility + include include \ include from AIDE + include spiSTM32F0hard \ SPI2 driver + + INCLUDE CURSOR.FTH + INCLUDE VT100COLOURS.FTH + INCLUDE TABIO.FTH +\ INCLUDE YELLOWIO.FTH +\ INCLUDE WALLSENSORS.FTH + +progu sec-end cdata constant RP-END \ end of available RAM + + +\ *************** +\ *S Finishing up +\ *************** + +libraries \ to resolve common forward references + include LibM0M1 + include LIBRARY +end-libs + +decimal + +\ Add a kernel checksum +crcstart here crcslot crc32 checksum +/DefStart 124 > [if] + .( DEFSTART area too big ) abort +[then] + +update-build +FINIS + + +\ ====== +\ *> ### +\ ====== diff --git a/mwmouse/sources/tab.no b/mwmouse/sources/tab.no @@ -0,0 +1 @@ +v1.0 [build 0039] +\ No newline at end of file diff --git a/mwmouse/sources/tabio.fth b/mwmouse/sources/tabio.fth @@ -0,0 +1,282 @@ +\ TAB I/O etc. +\ Designed by Duncan Louttit January 2023 +\ +\ +\ I/O definitions +PA 0 PIO: MOTORENABLE +PA 1 PIO: LEFTODO \ left odometry input +PA 2 PIO: RF/LRLEDS +PA 3 PIO: RHSSENSE \ +PA 4 PIO: SPARE1 +PA 5 PIO: SPARE2 \ +PA 6 PIO: SPARE3 +PA 7 PIO: SPARE4 \ +PA 8 PIO: (RPWM) +PA 11 PIO: (LPWM) +PB 0 PIO: LHSSENSE +PB 1 PIO: LF/RRLEDS +\ PA 9 console TX CONNG 5 +\ PA 10 console RX CONNG 4 +PB 4 PIO: RIGHTODO \ Right odometry input +PB 6 pio: LED1 +PB 8 PIO: INNERLEDS +PC 13 PIO: LED2 +CR ." Pins defined" CR + +\ ****************************** +\ Clock enabling for peripherals +\ ****************************** + +_RCC rccAHBen + EQU AHBEN +_RCC rccAPB2en + EQU APB2EN + + +: I/OCLOCKS ( --- ) + _RCC + $0E:0001 OVER rccAHBen + OR! \ Clock to PA,PB,PC,DMA + $60A00 OVER rccAPB2en + OR! \ Clock to TIM1,16,17 plus ADC + $3 OVER rccAPB1en + OR! \ Clock to TIM2,TIM3 + $60A00 OVER rccAPB2rst + 2DUP OR! BIC! \ Reset timers 1,15,16 plus ADC + $3 OVER rccAPB1rst + 2DUP OR! BIC! \ Reset timers 2 and 3 + DROP ; + + +\ ******* Timer use ************ +\ T1 generates PWM for the motors +\ T2 left odometry +\ T3 right odometry +\ ***** was T16 sound generation +\ T17 fast timebase + +\ ************** +\ PWM generation +\ ************** +\ 10 bit PWM using timer1 channel 1 and channel 4 +\ PWMA is channel 4 +\ PWMB is channel 1 + +_TIM1 timCCR1 + EQU T1CCR1 +: PWML ( n --- . Set PWM1 on period. 1000 max.) + T1CCR1 ! ; + +_TIM1 timCCR4 + EQU T1CCR4 +: PWMR ( n --- . Set PWM2 on period. 1000 max.) + T1CCR4 ! ; + +468 CONSTANT LEFTSTOP +468 CONSTANT RIGHTSTOP +: STOPMOTORS ( --- ) + LEFTSTOP PWML + RIGHTSTOP PWMR ; + +: INITT1 ( --- . Initialise timer1 ) + STOPMOTORS + _TIM1 + 1000 OVER timARR + ! \ Max PWM value is 1000 + $60 OVER timCCMR1 + ! \ Ch1 PWM mode + $6000 OVER timCCMR2 + ! \ Ch4 PWM mode + $1001 OVER timCCER + ! \ Turn output on + 0 OVER timPSC + ! \ 0 Prescale + $8000 OVER timBDTR + ! \ output on + 1 SWAP ! \ Turn timer on + 2 (LPWM) ISFUNCTION + 2 (RPWM) ISFUNCTION ; + +\ *********************** +\ Timers 2&3 Odometry period +\ *********************** +_TIM2 timCCR2 + EQU (LPERIOD) +_TIM3 timCCR1 + EQU (RPERIOD) + +: LPERIOD ( --- n ) + (LPERIOD) W@ ; + +: RPERIOD ( --- n ) + (RPERIOD) W@ ; + + +: INITPERIOD ( timer --- ) + -1 OVER timARR + ! \ + 47 OVER TIMPSC + ! \ 1MHz clocking. Period in usec. + 1 OVER TIMCR1 + ! \ Enable timer, counting up + $31 SWAP TIMCCER + ! \ CCR1 on rising edge, CCR2 on falling edge + ; + +: INITT2/3 ( --- ) + _TIM2 $400 OVER timDIER + ! \ DMA on channel 2 of timer 2 + $164 OVER TIMSMCR + ! \ 1 Filter, rising edge resets, ch2 trigger input + $1111 OVER TIMCCMR1 + ! \ 1 filter, select ch2 for both capture inputs + INITPERIOD + + _TIM3 $200 OVER timDIER + ! \ DMA on channel 1 of timer 3 + $154 OVER TIMSMCR + ! \ 1 filter, rising edge resets, ch1 trigger input + $1011 OVER TIMCCMR1 + ! \ 1 filter, select ch1 for both capture inputs + INITPERIOD + + 2 LEFTODO ISFUNCTION + 1 RIGHTODO ISFUNCTION ; +EXTERNAL + +\ ************************ +\ DMA based odometry count +\ ************************ +\ TIM2 channel 2 uses DMA channel 3 +\ TIM3 channel1 uses DMA channel 4 +\ Transfer from address $0800:0000 to timer 16 count register. +\ Timer 16 is unused so this has no effect. + +_DMA dmaCNDTR3 + EQU (LCOUNT) +: LCOUNT ( --- n ) + $FFFF (LCOUNT) @ - ; + +: LCOUNTCLEAR ( --- ) + _DMA dmaCCR3 + 0 OVER ! + $FFFF (LCOUNT) ! \ 65K transfers + $31 SWAP ! ; \ Circular, memory to peripheral, enable + +_DMA dmaCNDTR4 + EQU (RCOUNT) +: RCOUNT ( --- ) + $FFFF (RCOUNT) @ - ; + +: RCOUNTCLEAR ( --- n ) + _DMA dmaCCR4 + 0 OVER ! + $FFFF (RCOUNT) ! \ 65K transfers + $31 SWAP ! ; \ Circular, memory to peripheral, enable + +: DMAINIT3 ( --- ) + _DMA + _TIM17 timCNT + OVER dmaCPAR3 + ! \ Destination address + $0800:0000 SWAP dmaCMAR3 + ! \ Source address + LCOUNTCLEAR ; + +: DMAINIT4 ( --- ) + _DMA + _TIM17 timCNT + OVER dmaCPAR4 + ! \ Destination address + $0800:0000 SWAP dmaCMAR4 + ! \ Source address + RCOUNTCLEAR ; + +: CLEARCOUNTS ( --- ) + LCOUNTCLEAR RCOUNTCLEAR ; + +\ ********* +\ ADC setup +\ ********* + +\ 1 CONSTANT UNUSED +\ 2 CNSTANT UNUSED +\ 4 CONSTANT WALL1SEL +$8 CONSTANT RFANALOGUE +$8 CONSTANT LINE0 \ Right line sensor +$10 CONSTANT RWANALOGUE +$10 CONSTANT LINE1 \ 3rd left line sensor +$20 CONSTANT LFANALOGUE +$20 CONSTANT LINE2 \ 2nd left line sensor +$40 CONSTANT LWANALOGUE +$40 CONSTANT LINE3 \ Left line sensor +\ $80 CONSTANT UNUSED +\ $100 CONSTANT UNUSED +\ $200 CONSTANT UNUSED + +: ANALOGS ( --- . Make analogue inputs. ) + \ ***** Needs to be set up + ; + +_ADC adcCR + CONSTANT ADC_CR +_ADC CONSTANT ADC + +: ADCDONE? ( --- f. ) + ADC_CR @ 4 AND 0= ; + +: WAITADCDONE ( --- ) + BEGIN ADCDONE? UNTIL ; + +: WAITCALDONE ( --- . Wait till ADC available. ) + BEGIN ADC_CR @ 0= UNTIL ; + +: ADCENABLED? ( --- f. ) + ADC_CR @ 1 AND ; + +: ADC_CAL ( --- . Calibrate ADC. ) + ADCENABLED? IF 2 ADC_CR ! THEN WAITCALDONE + 0 ADC_CR ! \ Get everything ready + $8000:0000 ADC_CR ! \ Start calibration + WAITCALDONE ; + +: ADCENABLE ( ---. ) + ADC_CAL 1 ADC_CR ! ; + +: WAITREADY ( --- ) + BEGIN _ADC @ 1 AND UNTIL ; + +: ADCSTART ( --- ) + 4 ADC_CR OR! ; + +: INITADC ( --- ) + ANALOGS + ADC_CAL ADCENABLE WAITREADY + _ADC + 0 OVER adcCFGR1 + ! \ 12 bits, right aligned + $8000:0000 OVER adcCFGR2 + ! \ PCLK/4 + ( 0 ) 4 OVER adcSMPR1 + ! \ 41.5 cycles ( Short ) sampling time + DROP ; + +_ADC adcCHSELR + CONSTANT CHSEL \ Channel selection register +_ADC adcDR + CONSTANT ADCDATA \ ADC data + +: ATOD ( mask --- nnn . Bit mask for desired channel ) + CHSEL ! + ADCSTART WAITADCDONE + ADCDATA @ ; + +\ ******** +\ Timer 16 +\ ******** +\ _TIM16 CONSTANT TIMER16 +\ +\ : SOUNDPERIOD ( n ---- . Period in uS. ) +\ _TIM16 timARR + ! ; + +\ : SOUNDON ( --- ) +\ 1 _TIM16 ! +\ 2 SOUND ISFUNCTION ; + +\ : SOUNDOFF ( --- ) +\ 0 _TIM16 ! +\ SOUND ISOUTPUT +\ SOUND CLRPIN ; + +\ : INITT16 ( --- . Initialise timer 16. ) +\ _TIM16 +\ $30 OVER timCCMR1 + ! \ Toggle mode +\ 1 OVER timCCER + ! \ Enable output +\ $8000 OVER timBDTR + ! \ output on +\ 23 SWAP TIMPSC + ! +\ SOUNDOFF +\ ; + +\ ********************* +\ Initialise everything +\ ********************* + +: INITSTUFF ( --- ) + I/OCLOCKS + INITT2/3 + DMAINIT3 + DMAINIT4 + INITT1 +\ INITT16 + INITADC ; + +: INITALLI/O ( --- . ) + INITSTUFF + LF/RRLEDS ISOUTPUT + RF/LRLEDS ISOUTPUT + RHSSENSE ISANALOG + LHSSENSE ISANALOG + + LED1 ISOUTPUT + LED2 ISOUTPUT ; + +' INITALLI/O ATCOLD + + diff --git a/mwmouse/sources/tabticker.fth b/mwmouse/sources/tabticker.fth @@ -0,0 +1,135 @@ +\ SysTickDisco072.fth - Cortex-M0 ticker for STM32F072B-DISCO board + +(( +Copyright (c) 2010, 2011, 2014 +MicroProcessor Engineering +133 Hill Lane +Southampton SO15 5AF +England + +tel: +44 (0)23 8063 1441 +fax: +44 (0)23 8033 9691 +email: mpe@mpeforth.com + tech-support@mpeforth.com +web: http://www.mpeforth.com +Skype: mpe_sfp + +From North America, our telephone and fax numbers are: + 011 44 23 8063 1441 + 011 44 23 8033 9691 + 901 313 4312 (North American access number to UK office) + + +To do +===== + +Change history +============== +20140207 SFP003 Converted for STM32F072B-DISCO board. +20110218 MPE002 Added timebase extensions. +)) + +only forth definitions +decimal + +\ =========== +\ *> drivers +\ =========== +\ *S System Ticker +\ **************** +\ *P The source code discussed in this section may be found in +\ ** the file *\i{Drivers/SysTickDisco072.fth}. + +\ *P The system ticker uses the Cortex-M0 *\i{SysTick} timer. +\ ** Although the *\i{SysTick} timer is common to all Cortex-M0 +\ ** devices, there is no guarantee that they have the same +\ ** clocking arrangements. Consequently there are different +\ ** drivers for different implementations. + +\ *P The STM32 implementation is fed with the system clock and +\ ** has an option to divide it by 8, controlled by bit 2 of the +\ ** SysTick Control and Status Register (ARM DDI 0337, Rev E, +\ ** page 8-8). +\ *( +\ *B Bit2=0: SysTick clock is HCLK/8. +\ *B Bit2=1: SysTick clock is HCLK. +\ *) +\ *P This code always uses HCLK/8. + + +variable <ticks> + +: ticks \ -- ms +\ *G Returns a 32 bit number of milliseconds that eventually +\ ** wraps. + <ticks> @ +; +compiler +: ticks \ -- ms + <ticks> @ +; +target + +: SysTicker \ -- +\ *G Ticker ISR action. + tick-ms <ticks> +! \ update ticker +; +' SysTicker SysTickvec# EXC: SysTickISR \ -- addr +\ *G Setting the high level ISR. + +tick-ms system-speed 8 / #1000 */ 1- equ /SysTick \ -- x +\ +G Initial value of the SysTick Reload register. + +: start-clock \ -- +\ *G Initialise the system ticker to run with a period of +\ ** *\fo{tick-ms} milliseconds. + _SCS + /SysTick over stRVR + ! \ set ticker rate + $0003 over stCSR + ! \ enable, bit 0 = enable, bit 1=interrupt + \ bit 2 = clock source (1=sysclk, 0=sysclk/8) + $FF over $0D23 + c! \ set SysTick priority to lowest + drop + ei +; + +: stop-clock \ -- +\ *G Stop the sytem ticker. + bit0 _SCS stCSR + bic! ; + +: later \ n -- n' +\ *G Generates the timebase value for termination in +\ ** n millseconds time. + ticks + +; + +: timedout? \ n -- flag ; true if timed out +\ *G Flag is returned true if the timebase value n has timed out. +\ ** *\fo{TIMEDOUT?} does not call *\fo{PAUSE}. + ticks - 0< \ must use circular arithmetic +; + +compiler +: later \ n -- n' + ticks + +; + +: timedout? \ n -- flag ; true if timed out + ticks - 0< \ must use circular arithmetic +; +target + +: ms \ n -- +\ *G Waits for n milliseconds. + later begin + pause dup timedout? + until + drop +; + + +\ ====== +\ *> ### +\ ====== + +decimal + diff --git a/mwmouse/sources/wow.ctl b/mwmouse/sources/wow.ctl @@ -0,0 +1,409 @@ +\ liteSTM32F072sa.ctl - STM32F072RB discovery board standalone "Lite" Forth +\ Modified for WOW by Duncan Louttit October 2023 onwards + +(( +Copyright (c) 2014 +MicroProcessor Engineering +133 Hill Lane +Southampton SO15 5AF +England + +tel: +44 (0)23 8063 1441 +fax: +44 (0)23 8033 9691 +net: mpe@mpeforth.com + tech-support@mpeforth.com +web: www.mpeforth.com + +From North America, our telephone and fax numbers are: + 011 44 23 8063 1441 + 011 44 23 8033 9691 + + +To do +===== + +Change history +============== +20140205 MPE001 First release for STM32F0xx. +)) + + +\ ================ +\ *! stm32f072litesa +\ *T Control file for STM32F072 Discovery board +\ ================ +\ *P The control file wow.ctl +\ ** produces a standalone Forth for the STM32F072 Discovery board. +\ ** The serial port is connected to USART1 on pins PA9 (Tx) and +\ ** PA10 (Rx). +\ ** You cannot use the easy GPIO code for UART initialisation unless +\ ** the GPIO ports are clocked and taken out of reset in the start +\ ** up code. + +\ *P When you modify this file for your own hardware do not forget +\ ** to update the GPIO pin assignments and alternate function +\ ** selections. + +\ *P You can easily use the low-cost ST-LINK/V2 JTAG unit, or use +\ ** the one integrated into the ST Discovery boards. +\ ** The ST-LINK Utility software is a +\ ** free download from the ST website *\f{www.st.com}. + +only forth definitions decimal + + +\ ****************************** +\ Define the default directories +\ ****************************** + +c" ." setmacro AppDir \ application files +c" ." setmacro HwDir \ Board hardware files +c" ." setmacro CpuDir \ CPU specific files +c" ..\Common" setmacro CommonDir \ common high level files +c" ..\Examples" setmacro ExampleDir \ example files + + +\ *************************************** +\ Load compiler extensions such as macros +\ *************************************** + +include Macros + + +\ ********************************************************* +\ Turn on the cross compiler and define CPU and log options +\ ********************************************************* + +\ file: PROG.log \ uncomment to send log to a file + +CROSS-COMPILE + +only forth definitions \ default search order + + no-log \ uncomment to suppress output log + rommed \ split ROM/RAM target + interactive \ enter interactive mode at end + +xrefs \ enable cross references + align-long \ code is 32bit aligned + Cortex-M0 \ Thumb2 processor type and register usage + -LongCalls \ no calls outside 25 bit range + +FlashCompile \ target compiles to Flash + Hex-I32 \ also produce Intel Hex-32 obj format + +SaveCdataOnly \ no data area image files + +0 equ false +-1 equ true + + +\ ******************* +\ *S Configure target +\ ******************* + +\ ====================== +\ *N STM32F0 variant definitions +\ ====================== + +$0800:0000 equ FlashBase \ -- addr +\ *G Start address of Flash. The bottom 2kb (the vector area) is +\ ** mirrored at $0000:0000 for booting. + +#128 kb equ /Flash \ -- len +\ *G Size of Flash. +2 kb equ /FlashPage \ -- len +\ *G Size of a Flash Page. +1 equ KeepPages \ -- u +\ *G Set this non-zero for the number of pages at the end of Flash +\ ** that are reserved for configuration data. Often set to 1 or 2 +\ ** by systems that use PowerNet. +FlashBase /Flash + /FlashPage KeepPages * - equ CfgFlash \ -- len +\ *G Base address of the configuration Flash area. + +$1FFF:C800 equ /InfoBase \ -- addr +\ *G Base address of system memory information block. + +#12 kb equ /SysMem \ -- len +\ *G Size of system memory block. + +$1FFF:F800 equ OptionBytes \ -- addr +\ *G Base address of option bytes +#16 equ /OptionBytes \ -- len +\ *G Number of option bytes + +#64 cells equ /ExcVecs \ -- len +\ *G Size of the exception/interrupt vector table. There are +\ ** 16 reserved by ARM. + +\ *P The system clocks are generated from PLLs. +\ ** How to set them up is non-obvious and is mostly documented +\ ** by the ST demonstration code in the file *\i{system_stm32f0x2.c}. +\ ** If you are not going to use an existing setup, copy and rename +\ ** one of the existing *\i{startSTM32F0xx.fth} files. + +8 MHz equ xtal-speed \ -- hz +\ *G Master oscillator crystal clock rate in HZ. This is the HSI +\ ** internal oscillator which has better than +/-1% accuracy and +\ ** is more accurate than the internal 48 MHz oscillator. +48 MHz equ system-speed \ -- hz +\ *G Requested CPU clock speed in HZ. Note that you must +\ ** calculate the PLL values. + +1 equ AHBdiv \ -- u +\ *G Division ratio of the AHB clock from the system clock. +\ ** This may not be more than 48 MHz. +1 equ APBdiv \ -- u +\ *G Division ratio of the APB clock from the system clock. +\ ** This may not be more than 48 MHz. + +system-speed AHBdiv / equ AHB-speed \ -- hz +\ *G AHB bus speed. +system-speed APBdiv / equ APB-speed \ -- hz +\ *G APB bus speed. + + +\ ============= +\ *N Memory map +\ ============= +\ *P If you are using the *\fo{Reflash} code in the *\i{ReProg} +\ ** folder, note that the Flash reprogramming code uses RAM +\ ** from $2000:0000..$2000:0FFF and its mirrors. Ensure that +\ ** your stacks are outside this region. + +\ *P The Flash memory starts at $0800:0000. The bottom 2 kb (the +\ ** vector area) is mirrored at $0000:0000. The top 4 kb (two +\ ** pages) is used to save autostart and application linkage +\ ** information. + + $0800:0000 $0800:BFFF cdata section wow \ code section in boot Flash +\ ***** $2000:0000 $2000:0FFF idata section PROGd \ 4k IDATA +\ ***** $2000:1000 $2000:3FFF udata section PROGu \ 12k UDATA + $2000:0000 $2000:1FFF idata section PROGd \ 8k IDATA + $2000:2000 $2000:3FFF udata section PROGu \ 8k UDATA + +interpreter +: prog wow ; \ synonym +target + +PROG PROGd PROGu CDATA \ use Code for HERE , and so on + +$0801:F000 equ INFOSTART \ 2 pages of 2 kb +$0801:F800 equ APPSTART +$0801:FFFF equ INFOEND +$2000:0000 equ RAMSTART +$2000:4000 equ RAMEND +$0800:0000 equ FLASHSTART \ start of Main Flash +$0810:0000 equ FLASHEND \ end of possible main Flash +$0800:C000 equ APPFLASHSTART \ start of application flash +$0801:F000 equ APPFLASHEND \ end of application flash +$0000:F000 equ /APPFLASH \ size of application flash + +APPFLASHSTART TargetFlashStart \ sets HERE at kernel start up + +\ ============================ +\ *N Stack and user area sizes +\ ============================ + +$0F0 equ UP-SIZE \ size of each task's user area +$0F0 equ SP-SIZE \ size of each task's data stack +$0100 equ RP-SIZE \ size of each task's return stack +up-size rp-size + sp-size + + equ task-size \ size of TASK data area +\ define the number of cells of guard space at the top of the data stack +#2 equ sp-guard \ can underflow the data stack by this amount + +$0100 equ TIB-LEN \ terminal i/p buffer length + +\ define nesting levels for interrupts and SWIs. +2 equ #IRQs \ number of IRQ stacks, + \ shared by all IRQs (1 min) +0 equ #SVCs \ number of SVC nestings permitted + \ 0 is ok if SVCs are unused + +\ ========================== +\ *N Serial and ticker rates +\ ========================== + +1 equ useUSART1? \ -- n +\ *G Set non-zero to compile code for USART1, +\ ** device *\fo{Console1}. +\ #921600 equ console1-speed + #9600 equ console1-speed +\ #38400 equ console1-speed +\ #115200 equ console1-speed +\ *G *\fo{Console1} speed in BPS. + +1 equ useUSART2? \ -- n +\ *G Set non-zero to compile code for USART2, +\ ** device *\fo{Console2}. +#921600 equ console2-speed +\ #115200 equ console2-speed +\ *G *\fo{Console2} speed in BPS. + +1 equ useUSART3? \ -- n +\ *G Set non-zero to compile code for USART3, +\ ** device *\fo{Console3}. +115200 equ console3-speed +\ *G *\fo{Console3} speed in BPS. + +1 equ useUSART4? \ -- n +\ *G Set non-zero to compile code for USART4, +\ ** device *\fo{Console4}. +115200 equ console4-speed +\ *G *\fo{Console4} speed in BPS. + +1 equ console-port \ -- n ; Designate serial port for terminal (0..n). +\ *G Ports 1..4 are the on-chip UARTs. The internal USB device +\ ** is port 10, and bit-banged ports are defined from 20 onwards. + +#1 equ tick-ms \ -- ms +\ *G Timebase tick in ms. + + +\ ===================== +\ *N Software selection +\ ===================== + +\ Kernel components + 1 equ ColdChain? \ nz to use cold chain mechanism + 1 equ tasking? \ true if multitasker needed + 6 cells equ tcb-size \ for internal consistency check + 0 equ timebase? \ true for TIMEBASE code + 1 equ softfp? \ true for software floating point + 0 equ FullCase? \ true to include ?OF END-CASE NEXTCASE extensions + 0 equ target-locals? \ true if target local variable sources needed + 0 equ romforth? \ true for ROMForth handler + 0 equ blocks? \ true if BLOCK needed + $0000 equ sizeofheap \ 0=no heap, nz=size of heap + 1 equ heap-diags? \ true to include diagnostic code + 0 equ paged? \ true if ROM or RAM is paged/banked +\ 0 equ ENVIRONMENT? \ true if ANS ENVIRONMENT system required + + 0 equ PowerNet? \ -- flag +\ *G Set non-zero to compile the PowerNet TCP/IP stack. + + +\ ***************** +\ default constants +\ ***************** + +cell equ cell \ size of a cell (16 bits) +0 equ false +-1 equ true + + +\ ************ +\ *S Kernel files +\ ************ + + include CM0def \ Cortex generic equates and SFRs + include sfrSTM32F072 \ STM32F072 special function registers + include StackDef \ Reserve default task and stacks +PROGd sec-top 1+ equ UNUSED-TOP PROG \ top of memory for UNUSED + include startSTM32F072 \ start up code +l: crcslot + 0 , +l: crcstart + include CodeM0lite \ low level kernel definitions + include FlashSTM32 \ Flash programming code + include kernel72lite \ high level kernel definitions + include rebootSTM32 \ reboot using watchdog + include IntCortex \ interrupt handlers for NVIC + include FaultCortex \ fault exception handlers for NVIC + + +: selio-ser1 \ -- +\ *G Example to perform clock and pin selection for USART1 on PA9/10. +\ ** You cannot use the easy GPIO code for this unless the GPIO ports +\ ** are clocked and taken out of reset in the start up code. +\ Clocks and reset + _RCC + $0000 $0003 2 pick rccCFGR3 + setMask \ PCLK is UART clock + bit17 over rccAHBen + or! \ enable clock to GPIOA + bit17 over rccAHBrst + bic! \ take it out of reset + bit14 over rccAPB2en + or! \ enable clock to USART1 + bit14 over rccAPB2rst + bic! \ take it out of reset + drop +\ Default on PA9/10 + _GPIOA >r + $0028:0000 $003C:0000 r@ gpioMODER + setMask \ alternate function on 9/10 + $0000:0110 $0000:0FF0 r> gpioAFRH + setMask \ AF1 for both +; + include gpioSTM32F0xx \ easy pin access + include serSTM32F0xxp \ polled serial driver + include Dump \ DUMP .S etc development tools + + include SysTickDisco072 + ' start-clock AtCold + +tasking? [if] + include MultiCM0lite \ multitasker +[then] + +\ ************* +\ *S End of kernel +\ ************* + +buildfile wow.no +l: version$ + build$, +l: BuildDate$ + DateTime$, + +internal +: .banner \ -- + cr ." ****************************" +; + +: .CPU \ -- ; display CPU type + .banner + cr ." MPE PowerForth for STM32F072" + CR ." Modified for Warriors Obvious Wall-follower" + cr version$ $. space BuildDate$ $. + .banner +; +external + + +\ ******************* +\ *S Application code +\ ******************* +\ ***** +CR CR ." so far so good" +\ ***** + + include ReFlash \ ReFlash utility + include include \ include from AIDE + include spiSTM32F0hard \ SPI2 driver + + INCLUDE CURSOR.FTH + INCLUDE VT100COLOURS.FTH + INCLUDE WOWIO.FTH +\ INCLUDE YELLOWIO.FTH +\ INCLUDE WALLSENSORS.FTH + +progu sec-end cdata constant RP-END \ end of available RAM + + +\ *************** +\ *S Finishing up +\ *************** + +libraries \ to resolve common forward references + include LibM0M1 + include LIBRARY +end-libs + +decimal + +\ Add a kernel checksum +crcstart here crcslot crc32 checksum +/DefStart 124 > [if] + .( DEFSTART area too big ) abort +[then] + +update-build +FINIS + + +\ ====== +\ *> ### +\ ====== diff --git a/mwmouse/sources/wow.no b/mwmouse/sources/wow.no @@ -0,0 +1 @@ +v1.0 [build 0005] +\ No newline at end of file diff --git a/mwmouse/sources/wowio.fth b/mwmouse/sources/wowio.fth @@ -0,0 +1,284 @@ +\ TAB I/O etc. +\ Designed by Duncan Louttit January 2023 +\ +\ +\ I/O definitions +PA 0 PIO: MOTORENABLE +PA 1 PIO: LEFTODO \ left odometry input +PA 2 PIO: RF/LRLEDS +PA 3 PIO: RHSSENSE \ +PA 4 PIO: SPARE1 +PA 5 PIO: SPARE2 \ +PA 6 PIO: SPARE3 +PA 7 PIO: SPARE4 \ +PA 8 PIO: (LPWM) +PA 11 PIO: (RPWM) +PB 0 PIO: LHSSENSE +PB 1 PIO: LF/RRLEDS +\ PA 9 console TX CONNG 5 +\ PA 10 console RX CONNG 4 +PB 4 PIO: RIGHTODO \ Right odometry input +PB 6 pio: LED1 +PB 8 PIO: INNERLEDS +PC 13 PIO: LED2 +CR ." Pins defined" CR + +\ ****************************** +\ Clock enabling for peripherals +\ ****************************** + +_RCC rccAHBen + EQU AHBEN +_RCC rccAPB2en + EQU APB2EN + + +: I/OCLOCKS ( --- ) + _RCC + $0E:0001 OVER rccAHBen + OR! \ Clock to PA,PB,PC,DMA + $60A00 OVER rccAPB2en + OR! \ Clock to TIM1,16,17 plus ADC + $3 OVER rccAPB1en + OR! \ Clock to TIM2,TIM3 + $60A00 OVER rccAPB2rst + 2DUP OR! BIC! \ Reset timers 1,15,16 plus ADC + $3 OVER rccAPB1rst + 2DUP OR! BIC! \ Reset timers 2 and 3 + DROP ; + + +\ ******* Timer use ************ +\ T1 generates PWM for the motors +\ T2 left odometry +\ T3 right odometry +\ ***** was T16 sound generation +\ T17 fast timebase + +\ ************** +\ PWM generation +\ ************** +\ 10 bit PWM using timer1 channel 1 and channel 4 +\ PWMA is channel 4 +\ PWMB is channel 1 + +_TIM1 timCCR1 + EQU T1CCR1 +: PWMR ( n --- . Set PWM1 on period. 1000 max.) + T1CCR1 ! ; + +_TIM1 timCCR4 + EQU T1CCR4 +: PWML ( n --- . Set PWM2 on period. 1000 max.) + T1CCR4 ! ; + +468 CONSTANT LEFTSTOP +468 CONSTANT RIGHTSTOP +: STOPMOTORS ( --- ) + LEFTSTOP PWML + RIGHTSTOP PWMR ; + +: INITT1 ( --- . Initialise timer1 ) + STOPMOTORS + _TIM1 + 1000 OVER timARR + ! \ Max PWM value is 1000 + $60 OVER timCCMR1 + ! \ Ch1 PWM mode + $6000 OVER timCCMR2 + ! \ Ch4 PWM mode + $1001 OVER timCCER + ! \ Turn output on + 0 OVER timPSC + ! \ 0 Prescale + $8000 OVER timBDTR + ! \ output on + 1 SWAP ! \ Turn timer on + 2 (LPWM) ISFUNCTION + 2 (RPWM) ISFUNCTION ; + +\ *********************** +\ Timers 2&3 Odometry period +\ *********************** +_TIM2 timCCR2 + EQU (LPERIOD) +_TIM3 timCCR1 + EQU (RPERIOD) + +: RPERIOD ( --- n ) + (LPERIOD) W@ ; + +: LPERIOD ( --- n ) + (RPERIOD) W@ ; + + +: INITPERIOD ( timer --- ) + -1 OVER timARR + ! \ + 47 OVER TIMPSC + ! \ 1MHz clocking. Period in usec. + 1 OVER TIMCR1 + ! \ Enable timer, counting up + $31 SWAP TIMCCER + ! \ CCR1 on rising edge, CCR2 on falling edge + ; + +: INITT2/3 ( --- ) + _TIM2 $400 OVER timDIER + ! \ DMA on channel 2 of timer 2 + $164 OVER TIMSMCR + ! \ 1 Filter, rising edge resets, ch2 trigger input + $1111 OVER TIMCCMR1 + ! \ 1 filter, select ch2 for both capture inputs + INITPERIOD + + _TIM3 $200 OVER timDIER + ! \ DMA on channel 1 of timer 3 + $154 OVER TIMSMCR + ! \ 1 filter, rising edge resets, ch1 trigger input + $1011 OVER TIMCCMR1 + ! \ 1 filter, select ch1 for both capture inputs + INITPERIOD + + 2 LEFTODO ISFUNCTION + 1 RIGHTODO ISFUNCTION ; +EXTERNAL + +\ ************************ +\ DMA based odometry count +\ ************************ +\ TIM2 channel 2 uses DMA channel 3 +\ TIM3 channel1 uses DMA channel 4 +\ Transfer from address $0800:0000 to timer 16 count register. +\ Timer 16 is unused so this has no effect. + +_DMA dmaCNDTR3 + EQU (LCOUNT) +: RCOUNT ( --- n ) + $FFFF (LCOUNT) @ - ; + +: RCOUNTCLEAR ( --- ) + _DMA dmaCCR3 + 0 OVER ! + $FFFF (LCOUNT) ! \ 65K transfers + $31 SWAP ! ; \ Circular, memory to peripheral, enable + +_DMA dmaCNDTR4 + EQU (RCOUNT) +: LCOUNT ( --- ) + $FFFF (RCOUNT) @ - ; + +: LCOUNTCLEAR ( --- n ) + _DMA dmaCCR4 + 0 OVER ! + $FFFF (RCOUNT) ! \ 65K transfers + $31 SWAP ! ; \ Circular, memory to peripheral, enable + +: DMAINIT3 ( --- ) + _DMA + _TIM17 timCNT + OVER dmaCPAR3 + ! \ Destination address + $0800:0000 SWAP dmaCMAR3 + ! \ Source address + LCOUNTCLEAR ; + +: DMAINIT4 ( --- ) + _DMA + _TIM17 timCNT + OVER dmaCPAR4 + ! \ Destination address + $0800:0000 SWAP dmaCMAR4 + ! \ Source address + RCOUNTCLEAR ; + +: CLEARCOUNTS ( --- ) + LCOUNTCLEAR RCOUNTCLEAR ; + +\ ********* +\ ADC setup +\ ********* + +\ 1 CONSTANT UNUSED +\ 2 CNSTANT UNUSED +\ 4 CONSTANT WALL1SEL +$8 CONSTANT RFANALOGUE +$8 CONSTANT LINE0 \ Right line sensor +$10 CONSTANT RWANALOGUE +$10 CONSTANT LINE1 \ 3rd left line sensor +$20 CONSTANT LFANALOGUE +$20 CONSTANT LINE2 \ 2nd left line sensor +$40 CONSTANT LWANALOGUE +$40 CONSTANT LINE3 \ Left line sensor +\ $80 CONSTANT UNUSED +\ $100 CONSTANT UNUSED +\ $200 CONSTANT UNUSED + +: ANALOGS ( --- . Make analogue inputs. ) + \ ***** Needs to be set up + ; + +_ADC adcCR + CONSTANT ADC_CR +_ADC CONSTANT ADC + +: ADCDONE? ( --- f. ) + ADC_CR @ 4 AND 0= ; + +: WAITADCDONE ( --- ) + BEGIN ADCDONE? UNTIL ; + +: WAITCALDONE ( --- . Wait till ADC available. ) + BEGIN ADC_CR @ 0= UNTIL ; + +: ADCENABLED? ( --- f. ) + ADC_CR @ 1 AND ; + +: ADC_CAL ( --- . Calibrate ADC. ) + ADCENABLED? IF 2 ADC_CR ! THEN WAITCALDONE + 0 ADC_CR ! \ Get everything ready + $8000:0000 ADC_CR ! \ Start calibration + WAITCALDONE ; + +: ADCENABLE ( ---. ) + ADC_CAL 1 ADC_CR ! ; + +: WAITREADY ( --- ) + BEGIN _ADC @ 1 AND UNTIL ; + +: ADCSTART ( --- ) + 4 ADC_CR OR! ; + +: INITADC ( --- ) + ANALOGS + ADC_CAL ADCENABLE WAITREADY + _ADC + 0 OVER adcCFGR1 + ! \ 12 bits, right aligned + $8000:0000 OVER adcCFGR2 + ! \ PCLK/4 + ( 0 ) 4 OVER adcSMPR1 + ! \ 41.5 cycles ( Short ) sampling time + DROP ; + +_ADC adcCHSELR + CONSTANT CHSEL \ Channel selection register +_ADC adcDR + CONSTANT ADCDATA \ ADC data +: (ATOD) ( --- n ) + 4 ADC_CR OR! \ ADCSTART + WAITADCDONE ADCDATA @ ; +: ADCCHANNEL ( mask --- ) + CHSEL ! ; +: ATOD ( mask --- nnn . Bit mask for desired channel ) + ADCCHANNEL (ATOD) ; + +\ ******** +\ Timer 16 +\ ******** +\ _TIM16 CONSTANT TIMER16 +\ +\ : SOUNDPERIOD ( n ---- . Period in uS. ) +\ _TIM16 timARR + ! ; + +\ : SOUNDON ( --- ) +\ 1 _TIM16 ! +\ 2 SOUND ISFUNCTION ; + +\ : SOUNDOFF ( --- ) +\ 0 _TIM16 ! +\ SOUND ISOUTPUT +\ SOUND CLRPIN ; + +\ : INITT16 ( --- . Initialise timer 16. ) +\ _TIM16 +\ $30 OVER timCCMR1 + ! \ Toggle mode +\ 1 OVER timCCER + ! \ Enable output +\ $8000 OVER timBDTR + ! \ output on +\ 23 SWAP TIMPSC + ! +\ SOUNDOFF +\ ; + +\ ********************* +\ Initialise everything +\ ********************* + +: INITSTUFF ( --- ) + I/OCLOCKS + INITT2/3 + DMAINIT3 + DMAINIT4 + INITT1 +\ INITT16 + INITADC ; + +: INITALLI/O ( --- . ) + INITSTUFF + LF/RRLEDS ISOUTPUT + RF/LRLEDS ISOUTPUT + RHSSENSE ISANALOG + LHSSENSE ISANALOG + + LED1 ISOUTPUT + LED2 ISOUTPUT ; + +' INITALLI/O ATCOLD + + diff --git a/mwmouse/sources/yellowio.fth b/mwmouse/sources/yellowio.fth @@ -0,0 +1,317 @@ +\ Yellow Mouse I/O etc. +\ Designed by Duncan Louttit December 2017 +\ +\ There is no CONNA comms connector on Orange Mouse +\ CONNB is for line sensors. +\ CONNC is left wall sensor +\ CONND is left front wall sensor +\ CONNE is right front wall sensor +\ CONNF is right wall sensor +\ CONNG is programming and serial comms +\ CONNH is left motor +\ CONNI is right motor +\ CONNJ is marker sensor connector +\ +\ I/O definitions +PC 13 PIO: RFLED \ Right front wall sensor LED drive +PA 1 PIO: LODO \ left odometry input +PA 3 PIO: RFSIGNAL \ Also CONNB 6 analogue input +PA 4 PIO: RWSIGNAL \ Also CONNB 5 analogue input +PA 5 PIO: LFSIGNAL \ Also CONNB 2 analogue input +PA 6 PIO: LWSIGNAL \ Also CONNB 1 analogue signal +PA 7 PIO: LFLED \ Left front wall sensor LED drive +PB 0 PIO: LWLED \ Left wall sensor LED drive +PB 1 PIO: SW1 +PB 2 PIO: SW2 +PA 8 PIO: (LPWM) +\ PA 9 console TX CONNG 5 +\ PA 10 console RX CONNG 4 +PA 11 PIO: (RPWM) +PA 12 PIO: PWMENABLE +PA 14 PIO: LMARKER +PA 15 PIO: RMARKER +PB 4 PIO: RODO \ Right odometry input +PB 5 PIO: GREENLED +PB 6 PIO: YELLOWLED +PB 7 PIO: REDLED +PB 8 PIO: SOUND +PB 9 PIO: RWLED +CR ." Pins defined" CR + +\ ****************************** +\ Clock enabling for peripherals +\ ****************************** + +_RCC rccAHBen + EQU AHBEN +_RCC rccAPB2en + EQU APB2EN + + +: I/OCLOCKS ( --- ) + _RCC + $0E:0001 OVER rccAHBen + OR! \ Clock to PA,PB,PC,DMA + $60A00 OVER rccAPB2en + OR! \ Clock to TIM1,16,17 plus ADC + $3 OVER rccAPB1en + OR! \ Clock to TIM2,TIM3 + $60A00 OVER rccAPB2rst + 2DUP OR! BIC! \ Reset timers 1,15,16 plus ADC + $3 OVER rccAPB1rst + 2DUP OR! BIC! \ Reset timers 2 and 3 + DROP ; + + +\ ******* Timer use ************ +\ T1 generates PWM for the motors +\ T2 left odometry +\ T3 right odometry +\ T16 sound generation +\ T17 fast timebase + +\ ************** +\ PWM generation +\ ************** +\ 10 bit PWM using timer1 channel 1 and channel 4 +\ PWMA is channel 4 +\ PWMB is channel 1 + +_TIM1 timCCR1 + EQU T1CCR1 +: PWML ( n --- . Set PWM1 on period. 1000 max.) + T1CCR1 ! ; + +_TIM1 timCCR4 + EQU T1CCR4 +: PWMR ( n --- . Set PWM2 on period. 1000 max.) + T1CCR4 ! ; + +468 CONSTANT LEFTSTOP +468 CONSTANT RIGHTSTOP +: STOPMOTORS ( --- ) + LEFTSTOP PWML + RIGHTSTOP PWMR ; + +: INITT1 ( --- . Initialise timer1 ) + STOPMOTORS + _TIM1 + 1000 OVER timARR + ! \ Max PWM value is 1000 + $60 OVER timCCMR1 + ! \ Ch1 PWM mode + $6000 OVER timCCMR2 + ! \ Ch4 PWM mode + $1001 OVER timCCER + ! \ Turn output on + 0 OVER timPSC + ! \ 0 Prescale + $8000 OVER timBDTR + ! \ output on + 1 SWAP ! \ Turn timer on + 2 (LPWM) ISFUNCTION + 2 (RPWM) ISFUNCTION ; + +\ *********************** +\ Timers 2&3 Odometry period +\ *********************** +_TIM2 timCCR2 + EQU (LPERIOD) +_TIM3 timCCR1 + EQU (RPERIOD) + +: LPERIOD ( --- n ) + (LPERIOD) W@ ; + +: RPERIOD ( --- n ) + (RPERIOD) W@ ; + + +: INITPERIOD ( timer --- ) + -1 OVER timARR + ! \ + 47 OVER TIMPSC + ! \ 1MHz clocking. Period in usec. + 1 OVER TIMCR1 + ! \ Enable timer, counting up + $31 SWAP TIMCCER + ! \ CCR1 on rising edge, CCR2 on falling edge + ; + +: INITT2/3 ( --- ) + _TIM2 $400 OVER timDIER + ! \ DMA on channel 2 of timer 2 + $164 OVER TIMSMCR + ! \ 1 Filter, rising edge resets, ch2 trigger input + $1111 OVER TIMCCMR1 + ! \ 1 filter, select ch2 for both capture inputs + INITPERIOD + + _TIM3 $200 OVER timDIER + ! \ DMA on channel 1 of timer 3 + $154 OVER TIMSMCR + ! \ 1 filter, rising edge resets, ch1 trigger input + $1011 OVER TIMCCMR1 + ! \ 1 filter, select ch1 for both capture inputs + INITPERIOD + + 2 LODO ISFUNCTION + 1 RODO ISFUNCTION ; +EXTERNAL + +\ ************************ +\ DMA based odometry count +\ ************************ +\ TIM2 channel 2 uses DMA channel 3 +\ TIM3 channel1 uses DMA channel 4 +\ Transfer from address $0800:0000 to timer 16 count register. +\ Timer 16 is unused so this has no effect. + +_DMA dmaCNDTR3 + EQU (LCOUNT) +: LCOUNT ( --- n ) + $FFFF (LCOUNT) @ - ; + +: LCOUNTCLEAR ( --- ) + _DMA dmaCCR3 + 0 OVER ! + $FFFF (LCOUNT) ! \ 65K transfers + $31 SWAP ! ; \ Circular, memory to peripheral, enable + +_DMA dmaCNDTR4 + EQU (RCOUNT) +: RCOUNT ( --- ) + $FFFF (RCOUNT) @ - ; + +: RCOUNTCLEAR ( --- n ) + _DMA dmaCCR4 + 0 OVER ! + $FFFF (RCOUNT) ! \ 65K transfers + $31 SWAP ! ; \ Circular, memory to peripheral, enable + +: DMAINIT3 ( --- ) + _DMA + _TIM17 timCNT + OVER dmaCPAR3 + ! \ Destination address + $0800:0000 SWAP dmaCMAR3 + ! \ Source address + LCOUNTCLEAR ; + +: DMAINIT4 ( --- ) + _DMA + _TIM17 timCNT + OVER dmaCPAR4 + ! \ Destination address + $0800:0000 SWAP dmaCMAR4 + ! \ Source address + RCOUNTCLEAR ; + +: CLEARCOUNTS ( --- ) + LCOUNTCLEAR RCOUNTCLEAR ; + +\ ********* +\ ADC setup +\ ********* + +\ 1 CONSTANT UNUSED +\ 2 CNSTANT UNUSED +\ 4 CONSTANT WALL1SEL +$8 CONSTANT RFANALOGUE +$8 CONSTANT LINE0 \ Right line sensor +$10 CONSTANT RWANALOGUE +$10 CONSTANT LINE1 \ 3rd left line sensor +$20 CONSTANT LFANALOGUE +$20 CONSTANT LINE2 \ 2nd left line sensor +$40 CONSTANT LWANALOGUE +$40 CONSTANT LINE3 \ Left line sensor +\ $80 CONSTANT UNUSED +\ $100 CONSTANT UNUSED +\ $200 CONSTANT UNUSED + +: ANALOGS ( --- . Make analogue inputs. ) + RFSIGNAL ISANALOG + RWSIGNAL ISANALOG + LFSIGNAL ISANALOG + LWSIGNAL ISANALOG ; + +_ADC adcCR + CONSTANT ADC_CR +_ADC CONSTANT ADC + +: ADCDONE? ( --- f. ) + ADC_CR @ 4 AND 0= ; + +: WAITADCDONE ( --- ) + BEGIN ADCDONE? UNTIL ; + +: WAITCALDONE ( --- . Wait till ADC available. ) + BEGIN ADC_CR @ 0= UNTIL ; + +: ADCENABLED? ( --- f. ) + ADC_CR @ 1 AND ; + +: ADC_CAL ( --- . Calibrate ADC. ) + ADCENABLED? IF 2 ADC_CR ! THEN WAITCALDONE + 0 ADC_CR ! \ Get everything ready + $8000:0000 ADC_CR ! \ Start calibration + WAITCALDONE ; + +: ADCENABLE ( ---. ) + ADC_CAL 1 ADC_CR ! ; + +: WAITREADY ( --- ) + BEGIN _ADC @ 1 AND UNTIL ; + +: ADCSTART ( --- ) + 4 ADC_CR OR! ; + +: INITADC ( --- ) + ANALOGS + ADC_CAL ADCENABLE WAITREADY + _ADC + 0 OVER adcCFGR1 + ! \ 12 bits, right aligned + $8000:0000 OVER adcCFGR2 + ! \ PCLK/4 + ( 0 ) 4 OVER adcSMPR1 + ! \ 41.5 cycles ( Short ) sampling time + DROP ; + +_ADC adcCHSELR + CONSTANT CHSEL \ Channel selection register +_ADC adcDR + CONSTANT ADCDATA \ ADC data + +: ATOD ( mask --- nnn . Bit mask for desired channel ) + CHSEL ! + ADCSTART WAITADCDONE + ADCDATA @ ; + +\ ******** +\ Timer 16 +\ ******** +_TIM16 CONSTANT TIMER16 + +: SOUNDPERIOD ( n ---- . Period in uS. ) + _TIM16 timARR + ! ; + +: SOUNDON ( --- ) + 1 _TIM16 ! + 2 SOUND ISFUNCTION ; + +: SOUNDOFF ( --- ) + 0 _TIM16 ! + SOUND ISOUTPUT + SOUND CLRPIN ; + +: INITT16 ( --- . Initialise timer 16. ) + _TIM16 + $30 OVER timCCMR1 + ! \ Toggle mode + 1 OVER timCCER + ! \ Enable output + $8000 OVER timBDTR + ! \ output on + 23 SWAP TIMPSC + ! + SOUNDOFF + ; + +\ ********************* +\ Initialise everything +\ ********************* + +: INITSTUFF ( --- ) + I/OCLOCKS + INITT2/3 + DMAINIT3 + DMAINIT4 + INITT1 + INITT16 + INITADC ; + +: INITALLI/O ( --- . ) + INITSTUFF + RFLED DUP ISOUTPUT CLRPIN + RWLED DUP ISOUTPUT CLRPIN + LFLED DUP ISOUTPUT CLRPIN + LWLED DUP ISOUTPUT CLRPIN + REDLED DUP ISOUTPUT CLRPIN + YELLOWLED DUP ISOUTPUT CLRPIN + GREENLED DUP ISOUTPUT CLRPIN + PWMENABLE DUP ISOUTPUT CLRPIN + RMARKER ISINPUT LMARKER ISINPUT + SW1 ISINPUT SW2 ISINPUT + ; + +' INITALLI/O ATCOLD + +\ ***************** +\ Low level drivers +\ ***************** + +: SW1? ( --- f. ) + SW1 GETPIN 0= ; + +: SW2? ( --- f. ) + SW2 GETPIN 0= ; + + + + + + diff --git a/mwmouse/wf.config-2024-03-17.fth b/mwmouse/wf.config-2024-03-17.fth @@ -0,0 +1,11 @@ +\ initial wall follower configuration values, 2024-03-5 + +160 (FWALL_TARGET_DIST) ! +50 (RTURN_SPEED) ! +120 (RTURN_RATE) ! + +\ 100 (LWALL_TARGET_DIST) ! +90 (LWALL_TARGET_DIST) ! +115 (FWD_SPEED) ! +1200 (KP) ! +1750 (KD) ! diff --git a/mwmouse/wf.config.fth b/mwmouse/wf.config.fth @@ -0,0 +1,16 @@ +\ initial wall follower configuration values, 2024-03-5 + +100 (FWALL_FAR) ! +200 (FWALL_NEAR) ! + +50 (RTURN_SPEED) ! +120 (RTURN_RATE) ! + +\ 100 (LWALL_TARGET) ! +90 (LWALL_TARGET) ! + +140 (FAST_SPEED) ! +100 (SLOW_SPEED) ! + +1200 (KP) ! +1750 (KD) ! diff --git a/mwmouse/wf.fth b/mwmouse/wf.fth @@ -0,0 +1,249 @@ +4 CONSTANT CELLS + +400 CONSTANT MAXSPEED + +VARIABLE LPWM_NULL +VARIABLE LPWM_REVSCALE +VARIABLE LPWM_FWDSCALE + +VARIABLE RPWM_NULL +VARIABLE RPWM_REVSCALE +VARIABLE RPWM_FWDSCALE + +\ motor tuning constants +\ 388 LPWM_NULL ! +420 LPWM_NULL ! +450 LPWM_REVSCALE ! +564 LPWM_FWDSCALE ! + +400 RPWM_NULL ! +\ 430 RPWM_NULL ! +\ 358 RPWM_REVSCALE ! +458 RPWM_REVSCALE ! +\ 489 RPWM_FWDSCALE ! +564 RPWM_FWDSCALE ! + +: SCALESPEED ( speed pwmscale -- pwm ) + SWAP MAXSPEED MIN + SWAP MAXSPEED */ + ; + +: SETLSPEED ( speed -- ) + DUP 0 >= + IF + NEGATE + LPWM_FWDSCALE @ SCALESPEED + LPWM_NULL @ + + ELSE + LPWM_REVSCALE @ SCALESPEED + LPWM_NULL @ SWAP - + THEN + PWML + ; + +: SETRSPEED ( speed -- ) + DUP 0 >= + IF + RPWM_FWDSCALE @ SCALESPEED + RPWM_NULL @ + + ELSE + NEGATE + RPWM_REVSCALE @ SCALESPEED + RPWM_NULL @ SWAP - + THEN + PWMR + ; + +: SETSPEED ( speed -- ) + DUP SETLSPEED SETRSPEED ; + +: ACCEL ( n --- ) + 0 SWAP DO I SETSPEED LOOP ; + +: DECEL ( n --- ) + 0 DO I SETSPEED -1 +LOOP ; + +: STOPMOTORS ( --- ) + 0 SETSPEED ; + +\ LF/RRLEDS +\ RF/LRLEDS +\ LHSSENSE +\ RHSSENSE +\ LHSCHAN +\ RHSCHAN + +\ ADC channels +$100 CONSTANT LHSCHAN +$8 CONSTANT RHSCHAN + +: LDIST ( --- n ) + LHSCHAN ATOD + LF/RRLEDS SETPIN + LHSCHAN ATOD + LF/RRLEDS CLRPIN + SWAP - ; + +: RDIST ( --- n ) + RHSCHAN ATOD + RF/LRLEDS SETPIN + RHSCHAN ATOD + RF/LRLEDS CLRPIN + SWAP - ; + +: TESTLDIST ( --- n ) + CR BEGIN LDIST 5 MS 6 .r 13 EMIT KEY? UNTIL ; + +: TESTRDIST ( --- n ) + CR BEGIN RDIST 5 MS 6 .r 13 EMIT KEY? UNTIL ; + +\ ============================================================================ + +STOPMOTORS + +VARIABLE (FWALL_FAR) +: FWALL_FAR ( --- n ) + (FWALL_FAR) @ ; + +VARIABLE (FWALL_NEAR) +: FWALL_NEAR ( --- n ) + (FWALL_NEAR) @ ; + +VARIABLE (RTURN_SPEED) +: RTURN_SPEED ( --- n ) + (RTURN_SPEED) @ ; + +VARIABLE (RTURN_RATE) +: RTURN_RATE ( --- n ) + (RTURN_RATE) @ ; + +VARIABLE (LWALL_TARGET) +: LWALL_TARGET ( --- n ) + (LWALL_TARGET) @ ; + +VARIABLE (FAST_SPEED) +: FAST_SPEED ( --- n ) + (FAST_SPEED) @ ; + +VARIABLE (SLOW_SPEED) +: SLOW_SPEED ( --- n ) + (SLOW_SPEED) @ ; + +VARIABLE (KP) +: KP ( --- n ) + (KP) @ ; + +VARIABLE (KD) +: KD ( --- n ) + (KD) @ ; + +VARIABLE PREV_RDIST + +\ LHS - Front wall sensor +\ RHS - Left wall sensor + +: SYNCH ( --- ) + 5 MS ; + +: TESTLHS ( --- ) + BEGIN + LDIST DUP + FWALL_FAR > IF LED1 SETPIN THEN + FWALL_NEAR > IF LED2 SETPIN THEN + SYNCH + LED1 CLRPIN + LED2 CLRPIN + KEY? + UNTIL + ; + +: TESTRHS ( --- ) + BEGIN + RDIST LWALL_TARGET > IF LED1 SETPIN THEN + SYNCH + LED1 CLRPIN + KEY? + UNTIL + ; + +: TURNRIGHT ( --- ) + RTURN_SPEED RTURN_RATE + SETLSPEED + RTURN_SPEED RTURN_RATE - SETRSPEED + ; + +: TESTTURNRIGHT ( --- ) + 10 EMIT + 13 EMIT + BEGIN + RTURN_SPEED RTURN_RATE + 6 .r 32 EMIT + RTURN_SPEED RTURN_RATE - 6 .r + 13 EMIT + KEY? + UNTIL + ; + +: CALCP ( rdist --- n ) + LWALL_TARGET - + KP 1000 */ + ; + +: CALCD ( rdist --- n ) + PREV_RDIST @ - + KD 1000 */ + ; + +\ turnrate: +ve -> closer to left wall, -ve further from left wall +: FOLLOWLEFT ( --- turnrate ) + RDIST DUP DUP \ -- rdist rdist rdist + CALCP \ -- rdist rdist prop + ROT \ -- rdist prop rdist + CALCD \ -- rdist prop deriv + + \ -- rdist sum + SWAP \ -- sum rdist + PREV_RDIST ! \ -- + ; + +: LINESTEER ( speed turnrate --- ) + 2DUP + + SETLSPEED + ROT ROT + NEGATE + SETRSPEED + ; + +: FOLLOWINIT ( --- ) + 0 PREV_RDIST ! + ; + +\ : FOLLOW ( --- ) +\ FOLLOWINIT +\ BEGIN +\ FRONTWALL? +\ IF +\ TURNRIGHT +\ ELSE +\ FOLLOWLEFT LINESTEER +\ THEN +\ SYNCH \ synchronise to 1ms interrupt edge +\ KEY? +\ UNTIL +\ STOPMOTORS +\ ; + +: FRONTDIST ( --- distance ) + LDIST ; + +: SELECTSPEED ( distance --- distance speed ) + DUP FWALL_FAR < IF FAST_SPEED ELSE SLOW_SPEED THEN ; + +: SELECTMOVE ( speed distance --- ) + FWALL_NEAR > IF DROP TURNRIGHT ELSE FOLLOWLEFT LINESTEER THEN ; + +: WALLFOLLOW ( --- ) + FOLLOWINIT + BEGIN + FRONTDIST SELECTSPEED SWAP SELECTMOVE SYNCH + KEY? + UNTIL + STOPMOTORS + ; +