commit dd8293f693ce69961a9408528ab82eeba0115c4d
parent 9bd7da98c4ec543344de390de0c4b70755271fbe
Author: MikoĊaj Lenczewski <mblenczewski@gmail.com>
Date: Thu, 9 May 2024 18:50:31 +0100
Import mwmouse
Diffstat:
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<u2<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>
+ <minimum search order> <FORTH wordlist> <HIDDEN wordlist>
+</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 := <significand><exponent>
+<significand> := [<sign>]<digits>[.<digits0>]
+<exponent> := E[<sign>]<digits0>
+<sign> := { + | - }
+<digits> := <digit><digits0>
+<digits0> := <digit>*
+<digit> := { 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>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>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>>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<paren>"</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>>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>>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>>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 <= u2 <= 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<quote>"</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<quote>"</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>>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><sign></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.,<digit>);
+<LI>The metacharacter * is used to specify zero or more occurrences
+of the preceding token (e.g.,<digit>*);
+<LI>Tokens enclosed with [ and ] are optional (e.g.,[<sign>]);
+<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 := <significand><exponent>
+
+
+<PRE>
+<significand> := [<sign>]<digits>[.<digits0>]
+<exponent> := E[<sign>]<digits0>
+<sign> := { + | - }
+<digits> := <digit><digits0>
+<digits0> := <digit>*
+<digit> := { 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 >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>>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 := <significand>[<exponent>]
+
+<PRE>
+<significand> := [<sign>]{<digits>[.<digits0>] |
+.<digits> }
+<exponent> := <marker><digits0>
+<marker> := {<e-form> | <sign-form>}
+<e-form> := <e-char>[<sign-form>]
+<sign-form> := { + | - }
+<e-char> := { D | d | E | e }
+</PRE>
+
+<p>
+<code>
+See:
+<a href=dpansa12.htm#A.12.6.1.0558>A.12.6.1.0558 >FLOAT</a>
+</code>
+<p>
+
+
+<hr>
+<A name=12.6.1.1130>
+<code>
+12.6.1.1130 <b>D>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<</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>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>"<spaces>name"</B> -- ) ( F: r -- )
+ or ( r <B>"<spaces>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>"<spaces>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>
+ [-] <digits>.<digits0>
+</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 >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>
+ <significand><exponent>
+</PRE>
+<P>
+
+where:
+<P>
+
+
+<PRE>
+ <significand> := [-]<digit>.<digits0>
+ <exponent> := E[-]<digits>
+</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>"<spaces>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>"<spaces>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>"<spaces>name1"</B> <B>"<spaces>name2"</B> ... <B>"<spaces>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>#></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>#></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>#></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>"<spaces>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>#></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>#></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></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>"<spaces>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>"<spaces>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>"<spaces>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>"<spaces>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>#></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></a>
+</code>
+<p>
+
+
+<hr>
+<A name=17.6.1.0920>
+<code>
+17.6.1.0920 <b>CMOVE></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></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
+------------ -----------
+<char> the delimiting character marking the end of the
+ string being parsed
+<chars> zero or more consecutive occurrences of the
+ character char
+<space> a delimiting space character
+<spaces> zero or more consecutive occurrences of the
+ character space
+<quote> a delimiting double quote
+<paren> a delimiting right parenthesis
+<eol> 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<space> or ccc<eol>
+</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 => j</B> to denote <B>i is a subtype
+of j</B>. The subtype relationship is transitive; if i => j and j => k
+then i => 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></a>,
+<a href=dpans6.htm#6.2.0415>2R@</a> or
+<a href=dpans6.htm#6.2.0410>2R></a>)
+that it did not place there using
+<a href=dpans6.htm#6.1.0580>>R</a> or
+<a href=dpans6.htm#6.2.0340>2>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>>IN</a>
+within the limits imposed by this Standard. For example, if the
+contents of >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>#></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 #> may be
+invalid after each use of these words. Further, the regions returned by
+WORD and #> 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><#</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>>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 >IN. An ambiguous condition exists
+if the number in >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 >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 >IN is changed to the length of the
+input buffer, thus emptying the parse area.
+
+<P>
+
+Parsing may change the contents of >IN, but shall not affect the
+contents of the input buffer. Specifically, if the value in >IN is
+saved before starting the parse, resetting >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>
+(<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> >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>>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>;
+<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> >BODY,
+<a href=dpans6.htm#6.1.1250>6.1.1250</a> DOES>);
+<LI>words improperly used outside
+<a href=dpans6.htm#6.1.0490>6.1.0490</a> <# and
+<a href=dpans6.htm#6.1.0040>6.1.0040</a> #>
+(<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><#</a>
+<a href=dpans6.htm#6.1.0040>#></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>#></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 <#</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><#</a>
+<a href=dpans6.htm#6.1.0040>#></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>"<spaces>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<paren>"</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>
+>R M* R> FM/MOD SWAP DROP
+</code></b>
+or the phrase
+<b><code>
+>R M* R> 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>
+>R M* R> FM/MOD
+</code></b>
+or the phrase
+<b><code>
+>R M* R> 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<quote>"</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>
+>R S>D R> FM/MOD SWAP DROP
+</code></b>
+or the phrase
+<b><code>
+>R S>D R> 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>
+>R S>D R> FM/MOD
+</code></b>
+or the phrase
+<b><code>
+>R S>D R> 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<</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>"<spaces>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></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><</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<</a>
+</code>
+
+<P>
+
+<hr>
+<A name=6.1.0490>
+<code>
+6.1.0490 <B><#</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 #></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>></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></a>
+</code>
+
+<P>
+
+<hr>
+<A name=6.1.0550>
+<code>
+6.1.0550 <B>>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 >BODY</a>
+</code>
+
+
+<P>
+
+<hr>
+<A name=6.1.0560>
+<code>
+6.1.0560 <B>>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>>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>>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></a> ,
+<A href=dpans6.htm#6.1.2070>6.1.2070 R@</a> ,
+<A href=dpans6.htm#6.2.0340>6.2.0340 2>R</a> ,
+<A href=dpans6.htm#6.2.0410>6.2.0410 2R></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<quote>"</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>"<spaces>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>"<spaces>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>"<spaces>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></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></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> 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> 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></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>>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><#</a>
+<a href=dpans6.htm#6.1.0040>#></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>>R S>D R> FM/MOD DROP</code></b>
+or the phrase
+<b><code>>R S>D R> 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></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>"<spaces>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>>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></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 >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>R</a> ,
+<A href=dpans6.htm#6.2.0410>6.2.0410 2R></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 >R</a> ,
+<A href=dpans6.htm#6.1.2060>6.1.2060 R></a> ,
+<A href=dpans6.htm#6.2.0340>6.2.0340 2>R</a> ,
+<A href=dpans6.htm#6.2.0410>6.2.0410 2R></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></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<quote>"</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>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><#</a>
+<a href=dpans6.htm#6.1.0040>#></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<</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 <</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>"<spaces>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>"<chars>ccc<char>"</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>"<spaces>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>"<spaces>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<paren>"</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<></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></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>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 >R >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 >R</a> ,
+<A href=dpans6.htm#6.1.2060>6.1.2060 R></a> ,
+<A href=dpans6.htm#6.1.2070>6.1.2070 R@</a> ,
+<A href=dpans6.htm#6.2.0410>6.2.0410 2R></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>R</a>
+</code>
+
+<P>
+
+<hr>
+<A name=6.2.0410>
+<code>
+6.2.0410 <b>2R></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> 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 >R</a> ,
+<A href=dpans6.htm#6.1.2060>6.1.2060 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>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></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> R> 2DUP >R >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 >R</a> ,
+<A href=dpans6.htm#6.1.2060>6.1.2060 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>R</a> ,
+<A href=dpans6.htm#6.2.0410>6.2.0410 2R></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><></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<quote>"</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>
+>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>"<spaces>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<char>"</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>>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>>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>"<spaces>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>"<spaces>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></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 ></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>"<spaces>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 < n3|u3 and
+(n2|u2 <= n1|u1 and n1|u1 < n3|u3)) or (n2|u2 > n3|u3 and
+(n2|u2 <= n1|u1 or n1|u1 < 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>"<spaces>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<eol>"</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>>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>>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>>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<eol></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>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>"<spaces>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>"<spaces>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<</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<</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>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>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<quote>"</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<> ;
+
+: EKEY ( -- u ) DOS-KEY ?DUP 0= IF DOS-KEY 256 + THEN ;
+
+: EKEY>CHAR ( u -- u false | char true )
+ DUP 255 > 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< IF
+ BEGIN EKEY? WHILE
+ EKEY EKEY>CHAR IF
+ PENDING-CHAR ! TRUE EXIT
+ THEN DROP
+ REPEAT FALSE EXIT
+ THEN TRUE
+;
+
+: KEY ( -- char )
+ PENDING-CHAR @ 0< 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<> ;
+</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>CHAR
+</a>
+<P>
+
+EKEY>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 >FLOAT</A>
+<P>
+
+>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
+>FLOAT defines rules for accepting data. >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 >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>>R</a>
+<a href=dpans6.htm#6.1.2060>R></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 ... <create> ... ;CODE ...</code>
+
+<P>
+
+where namex is a defining word, and <create> 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>
+<omit the ... WORDLIST CONSTANT ROOT ... line>
+
+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 <push system default word lists and n>
+ 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></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></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<quote>" -- )
+ [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>>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></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>></a>
+<a href=dpans6.htm#6.1.0480><</a>
+<a href=dpans6.htm#6.2.2350>U></a>
+<a href=dpans6.htm#6.1.2340>U<</a>
+<a href=dpans6.htm#6.1.0530>=</a>
+<a href=dpans6.htm#6.2.0500><></a>
+<a href=dpans6.htm#6.1.0270>0=</a>
+<a href=dpans6.htm#6.2.0260>0<></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>>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></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><></a>
+<a href=dpans6.htm#6.1.0270>0=</a>
+<a href=dpans6.htm#6.2.0260>0<></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<></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<</a>
+<a href=dpans6.htm#6.2.2350>U></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>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></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<</a>
+<a href=dpans8.htm#8.6.1.1075>D0<</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<</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>>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>>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 >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></A>
+<P>
+
+Typical use: <code>: X ... DOES> ... ;</code>
+
+<P>
+
+Following DOES>, a Standard Program may not make any assumptions
+regarding the ability to find either the name of the definition
+containing the DOES> or any previous definition whose name may be
+concealed by it. DOES> 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> 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> 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>
+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> 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 < 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<char></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<></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>R</A>
+<P>
+
+Historically, 2>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>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></A>
+<P>
+
+Note that 2R> is not equivalent to
+<a href=dpans6.htm#6.1.2060>R></a> R>. Instead, it mirrors the
+action of
+<a href=dpans6.htm#6.2.0340>2>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>: DOES> must modify the CREATEd word and not
+the :NONAME definition, so DOES> 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<char></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 ( <spaces>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 >IN @ BLK @ 2
+EVALUATE >IN @ 1
+keyboard >IN @ 1
+text file >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 < n1|u1 and n1|u1 < 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 > n1|u1 and n1|u1 > 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 )
+ >R OVER < 0= ( test flag1 )
+ SWAP R> < ( 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
+< 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 < with
+<a href=dpans6.htm#6.1.2340>U<</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 - >R - R> U< ;
+
+</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>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] <immediate word> 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] <immediate-word> 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>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<> <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> <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>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> < <B>less-than</B> CORE
+ <A href=dpans6.htm#6.1.0490>.6.1.0490</A> <# <B>less-number-sign</B> CORE
+ <A href=dpans6.htm#6.2.0500>.6.2.0500</A> <> <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™ 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> </p>
+
+<p> </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
+ ;
+