|
|
0 list
|
21005595nngl tnnv3e
tstnngl tstev3e 3B4 138688anmn iyllts m ofww 9A022 rmsdsd rd4nss 8F0 mlost 344FE3 o@ k -602 dn ,ofml 8ersns -24879592 -1059869440 ?zol
FE2F47FF 24FFFFF 7B9?9ol CBAFFF A4D ?6olt FD2F47FF 24FFFFF
ADFFFFFD /ialrd tinvzia
-64060322 FC768DDA towk ???ls ooveas 2 02700 -336692919 ooveam
202700 -1449 FF6BCA4F e FF47FFFF ???ls E1D 417857536 FFF 2476167ar 3B4 -61472360 kto see ???y .waecl '?t?s
ramn rriooln 3B4 -65520552 49233959 FF5 FFFFF -1946157059 B21,ofml ielt k ???n8 t tsolttd
404064512 -33029887 t?fqe
33F47FF FF47FFFF -323352 802C0F 257mn B4 1 ?gak 2E3FFF
9449019 1573121?gok FE3B37FF -1929229568 B19te ks 6FFFFF re 303107849 rirn
rct rd 0F0tcajrt 20013393 421735207 rd 0F 0
|
|
2 list
E1D -1979943283 20776200misd FB528D00 tigsaed ooiaiaw ,ofmls fret ln -2130623861 inmwz8 66 4802697rnks FFF 868480512 C9330278 wlro7s
???? -16 D0035AC3 2A4 gw;ls
281F17 ai miaw9 snmd 539475093 tstson88 e tst 227239619 180D3B66 62914817 re -3302988 7 mnur 080rz tstmw 344FE3 FFFFFFFDtsnrenv3e at mwws mw 344FE3 400045inml k -36 71709695 3A5 m wmwae 2046823 5C61Fk ???@
204 -1854360 go0 127FFFF ie 2046D68 kwaec 204
344FE3 -897 FD1F8127 -1012022355 141AC5A 45613313 tsas+'s -7192 FFD4574F 1EC5FFF sgynid oo ?;n
FC480007 1C0ds 13C887 o4e?u
9E4 121ggynrs 8769060nn bdp; 'waec s23on
8nm rimttt8
mt sn iaecrrs 1459617790 doagtak FFFFF FFB tsnrmitar -785 FE063C0F 46661632 ag8iae FC 0D6AF2 369098752aianvs 3000B08Dow0 FC5FFFFF 18 B900ktm ???/ r@ecfe 1005815E 257gl ?t/ln
2E3FFF
tso ki??8 ???6 8keol @cwv0 o -6815487 r -43515 647 61D o7??8 5C02B mn
29387102 66060545 is 13880 lt rl, dmntf 1 358962728 gi- ecfik
FC768DC3 ?6 FF480007 ???we 3B4 523712 FE 174807 FFF 344FE3 FE060605,4*t 3B46FFF w 42109 43 ??nci FFE3B46F ks 89FC768D -522816s6y FFF
|
5F47FF FC5FFFFF mgrd 344FE3 7C005teo4 ps ie -1073694666t?as ,akat FE0FFFFF ei 3B4 -522 816 1EC0807 12060020k ??,c 3B4 -125864 -11227 27168 ???? -1928987967 344FE3 FFFFFFFDteo4 ps ie -1061111803b!drs 2102117 2102075 100 9B 1009C -21209 FFE3B46F ox ln o4a8
65849 tieeo0-8e
29486152 +s -5009 FDE8A45F
|
|
4 list
0801sedd -8436199 FD6FFFFF ?!oln
2FFFFF 8415278tsos 069mw 344FE3 a
!wor 145228977 oeer FC568458 io 60245632 .j i*n 824628208 6842688vs -10089 13C250Foeml 199 22284 -327960 FC202E3F bs 256,ofml
|
* -29884160 5373035522 ge -37748480 1 -34193 F FAD474F FDE2CFFF 3B46F0F w 655360 knmpr frs*rl .fe-is djtt,
aigltos -8i9 '8 v3aik
-125085697 an titsnf-n lwu tmenw2 gl r
-39321343 109706358 tkrs?s ??*? 3B4 -1158278 4 -59768833 344FE3 t/zwe 3B46FFF mn -271652410 6FFFFF
.3e E8FFFFF9 ???, -48297 3C4287F -6081 7409 g 12E1801???? -48489 FC68245F ,ofmw
3F4BA66 0i 1123644384 mw 56028800 8!ox 3CFFFFF
-1263733525 8'wi *oguis 28379312 -361 FFFDF747 FF3767FF vd -13680545 3AFFFFF ftr+ ?5il
FEAF47FF 3A7FFFF weu FEE1E6EE v,ygd -3371 09840 FDCFFFFF -974454095 -31174609 376879 - - 423327228 r 6128655 -29675393 -1342004992 k ???.
9973307 100r 100 k
???- r0ltrk 3CFFFFF rnfrs, -1281 FF473587 FF E 26005F2 BFC35EA5 frewu ?ynk FE2D87FF relan, 100
344FE3 2069971 grv-i -385518320 ???k -1545 86173 276102912 3B4 37748160eak FD6FFFFF ?/*rs
FDFF47FF 2BFFFFF dseik i?e 2FFFFFF A05 ?7*rs
FCFF47FF 2B7FFFF dseins 65486871 2F7FFFF inmwiw
k -302 61D -2689 FD8EB45F -807104 2CF47 FF iy??@ w 4!oted
am??@ -1329 3B45AB7 -433 FFFDC2F7 k ?? ?3 1989002157 k -5578 -53937 FF2EAF47 FCBF47FF FE37FFFF 96928000 tiw 361AC6A w8 3571712 tif sonlwu 1AC -61341259 DA0a.t@d til0 2E3801 1013 A tia 95kilk 21F4FFF 0
|
|
6 list
7F807 tiidt8ri.xias 2E3D6A 2098881 tis 07Ed sabs -25689856 bs -65536@pols AC5FFF ed
mt C20,ofml ec
40158904 ks FFFFFFEB 65725 65709 21 02689 2103292 65726 100BD 20048A 0AE 20 98314 468245 t0nsr 722077987tt 2104362 75D 9 40tdnpe ln 65849 745 AFFFFF 662701511rn3 07E 268443663 bs 538501120ne ; FE380100 -65536!yrk A7FFFF
-236212992 csantae 8CC2neramt sn ramttr d 65851 -22473 FCA0AC5F 82548DD0 -338493523
|
|
|
8 list
w 526796 ,ofmw
t -31981504 3B4 5158336 -59893760 344FE3 404F0Dinmw
w 526819 ,ofmw
anw -1979943283 5195200 -59893760 344FE3 404E8Dinmw
w 526858 ,ofmw
nowvs 3B4 5146048 -59893760 344FE3 12980 5inmw w 526797 ,ofmw
qadrl vs 3B4 4138432 -59893760 344FE3 40 2935
|
|
|
10 list
65611 65612
|
iv;@8 -267388897 8 -4128896 o-9;n 7F80FF
|
|
12 list
|
31803
|
|
14 list
d d
|
|
|
16 list
24
|
compile x86 colorforth ns
number of sectors compressed if neg, cr
last compressed if pos. nblk
number of uncompressed blocks. nc
no. of compressed cylinders, deprecated cr
these vars must be first things in block! br
dump compile memory display background task icons
compile icon editor png
screen image to file --- editor sct
yrg* all-caps cap lower-case yellow red gr een * toggles shadow comment block fj
ludr find jump left up down right ..
-mc+ dec-block magenta cyan inc-block x.i
delete exit insert .
jump jumps between -edited- blocks f
finds next word from find word
|
|
18 list
ns 240 nblk 1440 nc 7 cr
colorforth v4.2e2+ g4/1.2 chuck moore cr
20 load 22 load 24 load colors 28 load cr
decompress mark 30 load restore empt env
34 winver 2* + ; env ironmental load 46 lo ad 62 4 loads 88 load br
dump 48 load ; background dump floppy
52 load ; format, archive, set video icons
54 load ; edit chars c-a-c
70 ; ascii audit
90 load ; disk audit utility png
168 load ; png file format html
176 load ; html file write br
blocks 0-143 are public domain software cr
mark empty arrayforth 144 load
|
pentium macros' 1, 2, 3, , compile 1-4 bytes drop
lodsd, flags unchanged, why sp is in esi - in kernel then
fix address - in kernel swap
sp xchg 0
0 0 xor, macro 0 identical to number 0 if
jz, flags set, max 127 bytes, leave address -if
jns, same a
2 0 mov, never used? a!
0 2 mov, unoptimized 2*
shift left a,
compile word address @/!
fetch/store from/to word address, or eax nip
swap drop +/or/and
number or sp with eax u+
add to 2nd number, number or sp ?
test bits, set flags, literal only! over
sp 4 + @
|
|
20 list
macro swap
168B 2, C28B0689 , ; 0
?dup C031 2, ; if
74 2, here ; -if
79 2, here ; while
n-nn if swap ; -while
n-nn -if swap ; a
?dup C28B 2, ; a!
?lit if BA 1, , ; then D08B 2, drop ; 2*
E0D1 2, ; forth a,
2* 2* , ; macro @
?lit if ?dup 58B 2, a, ; then 85048B 3, 0 , ; !
?lit if ?lit if 5C7 2, swap a, , ; then 589 2, a, drop ; then a! 950489 3, 0 , drop ; nip
4768D 3, ; +
?lit if 5 1, , ; then 603 2, nip ; or
633 binary
?lit if swap 2 + 1, , ; then 2, nip ; and
623 binary ; u+
?lit if 681 2, , ; then 44601 3, drop ; ?
?lit A9 1, , ; over
?dup 4468B 3, ;
|
push lit to sp; eax to sp pop
sp to eax -
ones-complement begin
-a current code address - byte while
a-aa if-escape from any structure usage example begin xxx while xxx next xxx then for
n push count onto return stack, begin *next
aa-aa swap for and if addresses next
a decrement count, jnz to for, pop return stack when done -next
a same, jns - loop includes 0 i
-n copy loop index to data stack *end
aa-aa swap end and if addresses end
a jmp to begin +!
na add to memory, 2 literals optimized align
next call to end on word boundary or!
na inclusive-or to memory, unoptimized *
mm-p 32-bit product */
mnd-q 64-bit product, then quotient /mod
nd-rq remainder and quotient /
nd-q quotient mod
nd-r remainder
|
|
22 list
macros push
?lit if 68 1, , ; then 50 1, drop ; pop
?dup 58 1, ; -
D0F7 2, ; *end
swap end
EB loop
1, here - + 1, ; until
74 loop ; -until
79 loop ; for
push begin ; *next
swap next
75240CFF 0next
, here - + 1, 4C483 3, ; -next
79240CFF 0next ; i
?dup 24048B 3, ; +!
?lit if ?lit if 581 2, swap a, , ; then 501 2, a,
drop ; then a! 950401 3, 0 , drop ; nop
90 1, ; align
here - 3 and drop if nop align ; then ; or!
a! 950409 3, 0 , drop ; *
6AF0F 3, nip ; */
C88B 2, drop F9F72EF7 , nip ; /mod
swap 99 1, 16893EF7 , ; /
/mod nip ; mod
/mod drop ;
|
2/ arithmetic right shift time
-n pentium cycle counter, calibrate to ac tual clock rate 7push/7pop
save/restore save register 7, edi @-drop
these macros redefined in forth so they may be executed negate
n-n when you just cant use - min
nn-n minimum abs
n-u absolute value max
nn-n maximum v+
vv-v add 2-vectors loads
load successive blocks nc
-a number of cylinders booted and saved writes
address, cylinder, cylinder count reads
address, cylinder, count. floppy access note do not hit any keys while floppy is being written - wait for light to go out
|
|
24 list
compiled macros 2/
F8D1 2, ; time
?dup 310F 2, ; 7push
57 1, ; 7pop
5F 1, ; forth @
@ ; -cr ! ! ; -cr + + ; -cr - - ; */
*/ ; -cr * * ; -cr / / ; -cr 2/ 2/ ; dup
dup ; -cr drop drop ; -cr nip nip ; or
or ; arithmetic negate
- 1 + ; min
less if drop ; then swap drop ; abs
dup negate max
less if swap then drop ; v+
vv-v push u+ pop + ; vector loads
bn for dup push load pop 2 + next drop ; writes
acn for write next drop drop ; reads
acn for read next drop drop ;
|
|
|
26 list
|
block n-a block number to word address wrtboot
write boot and kernel save
write entire image to floppy colors
specified as rgb' 888 bits at
xy set current screen position - in kernel box
xy lower-right of colored rectangle - in k ernel 5*
emit letters cf
display double-size colorforth fill
n an writes n into a cell string move
sdn copies a cell string from s to d erase
bn zeroes a string of blocks copy
n copies current editor block and its sha dow to the given block
|
|
28 list
colors etc -offset
n-n offset @ negate + ; block
offset @ + blks
100 * ; wrtboot
0 block 0 1 writes stop ; save
84 load ; white
FFFFFF color ; red
FF0000 color ; green
FF00 color ; blue
FF color ; silver
BFBFBF color ; black
0 color ; 5*
5 for 2emit next ; cf
25 dup at red 1 3 C 3 A 5* green 14 2 1 3 E 5* ;
fill
nan for over over ! 1 + next drop drop ; move
sdn for over @ over ! 1 + 1 u+ next drop drop ; erase
bn push 0 swap block pop blks fill ; copy
n blk @ block over block 512 move blk ! ;
|
char examine high bits; shift 4, 5 or 7 bits eob
end of block chars
shift characters until 0 word
shift characters, then tag short
28-bit value+tag literal
1-bit base base, tag. value in next wo rd 32bits
for values variable
word, value tag
vector words
examine tags range
process each block move
blocks 72 thru 1419 to 3000 res
restore compressed blocks
|
|
30 list
decompress empt 32 load char
-n 0 b! ?new 4 bits b 8 and drop if b 4 a nd drop if 3 bits 7 ; then 1 bits 5 ; then 4 b F
and drop if ; then eob
n drop pop drop ; chars
n-n char ?full c! 2*c b or chars ; word
n 28 nb ! dup chars tbits ; short
n 28 bits t,
-4 nb ! b tbits ; literal
n 0 b! 1 bits t, 32bits
16 bits 16 bits b , ; variable
n word 32bits ; tag
-n b F and dup jump eob word literal word word literal short word short word word word v ariable short word short words
?new 4 bits tag words ; range
ann over block h ! dup push erase aa ! 0 na
! begin words h @ 256 + -256 and h ! next ; restore
ns @ dup and -if abs ns ! 36 block 300 0 block 18 blks nc @ -2 + * move 3000 block 36 nblk @
-36 + range ; then drop ;
|
b pop ebx, register 3, into eax c!
push eax into register 1, ecx 2*d
shift ebx left by ecx. bits from eax 2*c
shift eax left by ecx na
bits remaining in source word nb
bits remaining in ebx h
destination address ,
store at destination ?new
fetch new word if necessary new
32-bits in current word shift
eax into ebx, decrement nb tbits
fill ebx with tag ?full
is there room in ebx? bits
shift bits into ebx. overflow into next w ord
|
|
32 list
decompress macro uses ebx b
?dup C38B 2, ; b!
D88B 2, drop ; c!
C88B 2, drop ; 2*d
C3A50F 3, ; 2*c
E0D3 2, ; forth na 1 nb -6 h 67510272 an 0 aa
67931074 nz 4 ?new
na @ dup and drop if ; then new
aa @ @ an ! 1 aa +! 32 na ! ; shift
n-n dup negate dup nb +! na +! c! an @ 2 *d 2*c an ! ; bits
n ?new dup negate na @ + -if dup push + s hift new pop negate shift ; then drop shift ; tbits
nn nb @ 8 + c! 2*c or ,
h @ ! 1 h +! ; tz
nn-n over nz ! dup negate push + b begin du p 1 and drop if drop drop pop drop nz @ ; then 2/ next b! dup nz @ - + - nb +! pop drop ; ?full
n-n nb @ dup and -if tz dup push -4 + nb +! tbits 0 dup pop dup -
29 + nb ! ; then drop ;
|
key? exits calling defn if key struck clock
loads time of day suppt altfrm
byte addr of alternate frame buffer topram
end ram avail for applications. @back
and !back read/wrt full disk to/from adr @back reads only active part of compressed
@cyls
equiv to reads screen
fills screen with current color utime
null definition for now for compatabilit y
|
|
34 list
native system dependencies macro p@
a! ?dup EC 1, ; forth key?
64 p@ 1 and drop if 60 p@ 80 and drop if ; then pop drop then ; clock
40 load ; altfrm
-b aper @ 1024 768 * -4 * + ; topram
-b 30000000 ; !work
n block 0 over 1 + @ 35 + 36 / writes st op ; @rest
nn push 36 + block 2 pop reads stop ; @back
n dup block 0 2 reads dup 18 + block dup @ 18 block @ or drop if drop 78 @rest ; then d up 1 + @ dup and -if nip abs 35 + 36 / -2 + @r est ; then drop drop 78 @rest ; !back
n block 0 nblk @ 18 / writes stop ; @cyls
acn reads stop ; screen
0 dup at 1024 768 box ; utime
-n 0 ; br
serial -n 96 ;
|
key? exits calling defn if key struck save
writes full disk image beep
alert in hardsim clock
loads time of day suppt altfrm
byte adr of alt frame buffer topram
end ram avail for applications. @back
and !back read/wrt full disk to/from adr @back reads only active part of compressed, an d only active part of straight disks with vars
@cyls
equiv to reads screen
fills screen with current color br
fopen opens an existing win32 file given word adr of name and access code of r/o w/o or r/w. returns handle, indicators nz if it's good.
frd
and fwr read and write on things with win3 2 handles.
|
|
36 list
windows system dependencies key?
keych @ 0 or drop if pop drop ; then ; beep
; -cr clock 38 load ; topram
-cr altfrm -b endram -4096 768 * + ; !work
n dup block 1 + @ 1 + 2/ wwork ; @back
n dup 19 rback dup 18 + block dup @ 18 b lock @ or drop if drop 1440 rback ; then dup 1 + @ dup and -if nip abs
1 + 2/ rback ; then dr op 3 + @ rback ; !back
n nblk @ wback ; @cyls
acn 3000 @back push 18 * 3000 + block sw ap pop 18 256 * * move ; screen
0 dup at 868 for 0 1024 line next 0 dup at ; serial
-n 114 ; fopen
af-h push push 0 32 exist 3 0 0 pop pop swap 4 * fcreate ; flng 33793 flng 4 * dup frd
anh-n push push push 0 + pop pop swap pop fread frw?
ok-n if drop flng @ then ; fwr
anh-n push push push 0 + pop pop swap pop fwrite frw? ; -cr r/o 80000000 ; w/o
40000000 ; -cr r/w r/o w/o + ;
|
utime returns unix time in sec since epoch 000 0z fri 1/01/1970 sec
seconds since midnight needs unsigned mod by time we are all dead min
minutes past midnight
|
|
38 list
windows clock sec
-n utime 60 60 * 24 * mod ; minute
-n sec 60 / ;
|
|
|
40 list
native clock macro pentium timer p@
a! ?dup EC 1, ; p!
a! EE 1, drop ; forth ms
100000 * for next ; ca
70 p! 71 ; c@
ca p@ ; c!
ca p! ; !bcd
push 10 /mod 16 * + pop c! ; !hm
100 /mod 4 !bcd 2 !bcd 0 dup c! ; bcd
c@ 16 /mod 10 * + ; sec0
4 bcd 60 * 2 bcd + 60 * 0 bcd + ; sec
sec0 2 ms dup sec0 or drop if drop sec ; t hen ; minute
sec 60 / ; hms
sec 60 /mod 60 /mod 100 * + 100 * + ; ymd
9 bcd 100 * 8 bcd + 100 * 7 bcd + ; day
6 c@ -1 + ; hi
10 c@ 80 and drop if ; then hi ; lo
10 c@ 80 and drop if lo ; then ; cal
hi lo time - hi lo time + 748 ; beep
B6 43 p! EE 42 p! 0 42 p! on 61 p@ 3 or 6 1 p! 50000000 for next off 61 p@ 3 or 61 p! ;
|
|
|
42 list
|
|
|
44 list
|
logo, etc logo
displays colorforth logo show
background task executes following code r epeatedly keyboard
displays keypad and stack empty
empty dictionary w/ empt display logo wait
while saving edi, in interrupt dead code artifact list
displays the given block without entering the editor. br
-kbd returns true/nonzero flag if a word that calls it is being interpreted from a block as opposed to from the keyboard. use with caution from deep within an app that might have monkey ed with register 7
|
|
46 list
logo, etc list
n blk @ blk 1 + ! blk ! lis ; logo
show black screen 800 710 blue box 600 50 at
1024 620 red box 200 100 at 700 500 green b ox 18 list text cf keyboard ; empty
empt logo ; wait
10 30 * for 7push pause 7pop next ; l
blk @ load ; br
156 load watermark
show black screen 16 center 404060 c olor blk @ 4. +list keyboard ; edit
n blk @ blk 1 + ! blk ! e
watermark +e ; br
-kbd -t 7push pop dup and drop ;
|
does not say empty, compiles on top of applica tion x
-a current address one
a-a line of display lines
an dump
a background task continually displays me mory --- takes address -- displays three cols with address on right contents in middle and- the left col is g18 instruction view u
increment address d
decrement ati
address of agp graphic registers byte
a byte address dump fix
an-a test word
|
|
48 list
dump empty x 75530240 y -79636112 5-8
8 /mod 32 /mod 32 /mod 100 * + 100 * + 100 * swap
4 * + ; one
dup @ dup 5-8 h. space h. space dup h. cr ; lines
for one -1 + next drop ; dump
x ! r
show black screen x @ 15 + 16 text lines key board ; it
@ + @ dup h. space ; lines
for white i x it i y it or drop if red t hen i . cr -next ; cmp
show blue screen text 19 lines red x @ h. space y @ h. keyboard ; u
16 +xy
dup x +! y +! ; d
-16 +xy ; ati
F4100000 ff7fc000 or agp graphics reg byte
4 / dump ; fix
for 0 over ! 1 + next ; dump
|
|
|
50 list
timing greg tmt 515626134 tmn 1780009900 tmp - 360017368 secs 0 tmclr
0 tmt ! 0 tmn ! 0 tmp ! 0 secs ! ; tms
a time - 1 + swap +! ; tme
a time swap +! ; tare
tmt tms pause tmt tme ; 0tare
tmn tms switch tmn tme ; counter
utime negate secs +! ; timer
utime secs +! ;
|
format issue format command 30 cyl - in kernel hd
disk head ad
current address in buffer buffer
usual floppy cylinder buffer array
return word address com
format command word
store word into command string sectors
build sector table head
build sectors for selected head cylinders
sectors advance 1 for each cylinder - to allow time for head step format
only desired cylinders to save time bytes
arguments for crc archive
verify save' compute crc, save, read-b ack, recompute crc - first 64 bytes used by fl oppy read/write -- the two crc numbers should be the same !
|
|
52 list
format floppy empty hd 1 ad 152338 array
pop 2/ 2/ ; com
align array 1202004D , 6C 2, word
n ad @ ! 1 ad +! ; sectors
cs-c buffer ad ! 18 for over hd @ 100 * + over 18 mod 1 + 10000 * + 2000000 + word 1 + next drop ;
head
ch-c dup hd ! 400 * 1202004D + com ! dup 2* - 1801 + sectors format ; cylinders
n push com 0 pop for 0 head 1 head 1 + next
stop drop drop ; format
nc @ 80 cylinders stop ; archive
0 block 0 nc @ writes stop ; check
3000 block 0 nc @ reads stop ; ati
10CD4123 vesa ! ; setup for ati video card nvidia
10CD4118 vesa ! ; for nvidia card then save
|
draw big-bits icon @w
a-n fetch 16-bit word from byte address !w
na store same *byte
n-n swap bytes ic
-a current icon cu
-a cursor sq
draw small square xy
-a current screen position, set by at loc
-a location of current icons bit-map 0/1
n-n color square depending on bit 15 row
a-a draw row of icon ikon
draw big-bits icon adj
nn-nn magnify cursor position cursor
draw red box for cursor ok
background task to continually draw icon, i con number at top
|
|
54 list
icons empty macro @w
8B66 3, ; !w
a! 28966 3, drop ; *byte
C486 2, ; forth ic 53 cu 169 sq
xy @ 10000 /mod 16 + swap 16 + box cr
17 0 +at ; loc
ic @ 16 24 8 */ * 12 block 4 * + ; 0/1
8000 ? if green sq ; then blue sq ; row
dup @w *byte 16 for 0/1 2* next drop cr
-17 16 * 17 +at ; ikon
loc 24 for row 2 + next drop ; adj
17 * swap ; cursor
cu @ 16 /mod adj adj over over at cr
red 52 u+ 52 + box ; line
i-in for dup emit 1 + next ; set
xy over lm at 0 10 for 12 line cr next cr
8 line drop ; ok
show black screen cursor 18 dup at ikon cr
text ic @ . 400 60 set keyboard ; 56 load ok h
|
edit icon
|
|
56 list
edit character set application +ic
1 ic +! ; -ic
ic @ -1 + 0 max ic ! ; bit
cu @ 2/ 2/ 2/ 2/ 2* loc + 10000 cu @ F and 1
+ for 2/ next *byte ; toggle
bit over @w or swap !w ; td
toggle d
16 wrap
cu @ + 16 24 * dup u+ /mod drop cu ! ; tu
toggle u
-16 wrap ; tr
toggle r
1 wrap ; tl
toggle l
-1 wrap ; h
pad nul nul accept nul tl tu td tr l u d r - ic nul nul +ic nul nul nul nul nul nul nul nul nul nul nul nul 2500 , 110160C dup , , 2B00002 3 , 0 , 0 , 0 ,
|
|
|
58 list
lan empty 3F8 60 load init no
block 4 * 1024 ; send
no for dup 1@ xmit 1 + next drop ; receive
no for rcv over 1! 1 + next drop ; no
18 7 18 * ; backup
no for dup send 1 + next drop ; accept
no for dup receive 1 + next drop ;
|
p@ p-n fetch byte from port p!
np store byte to port 1@
a-n fetch byte from byte address 1!
na store byte to byte address r
n-p convert relative to absolute port addres s. base port on stack at compile time. compile d as literal at yellow-green transition 9600 115200
baud-rate divisors. these are names, no t numbers b/s
set baud rate. edit to change init
initialize uart xmit
n wait for ready and transmit byte cts
n wait for clear-to-send then xmit st
-n fetch status byte xbits
n-n exchange status bits st!
n store control byte ?rcv
fetch byte if ready. set flag to be teste d by if rcv
-n wait for ready and fetch byte
|
|
60 list
serial 3f8 2e8 1050 macro p@
a! dup EC 1, ; p!
a! EE 1, drop ; 1@
8A 2, ; 1!
a! 288 2, drop ; forth r
0 + + ; 9600
12 ; 115200
1 ; b/s
83 3 r p! 115200 0 r p! 0 1 r p! 3 3 r p! ; init
b/s 16550 1 2 r p! 0 4 r p! ; xmit
n 5 r p@ 20 and drop if 0 r p! ; then pau se xmit ; cts
6 r p@ 30 and 30 or drop if cts ; then xmi t ; st
6 r p@ xbits
30 and 10 / dup 1 and 2* 2* + 2/ ; st!
4 r p! ; ?rcv
5 r p@ 1 and drop if 0 r p@ then ; rcv
?rcv if ; then pause rcv ;
|
word search tcurs bt
returns nz and less if bit n of m is set. p ops t to 2, bit test index t mask 2, 2-2-sbb t o set nz if carry. t2
nn-nn 2 cell - big nums, var t1
nn-nn 1 cell t0
nn-nn extensions, undefined map
end n wrd-end n inc n and maybe curs tcurs
blk offset-blk convert offset to tokens in curs -curs
- decrement curs to zero tpoint
- fix abort to point cursor correctly, except if last word in block
|
|
62 list
word search tcurs macro bt
nm-n 68BD08B , F04768D , D21BC2A3 , ; forth t2
nn-nn 1 + t1
nn-nn 1 curs +! t0
nn-nn 1 + ; map
nnn-nn F and jump t0 t1 t2 t1 t1 t2 t1 t1 t1 t1 t1 t1 t2 t1 t1 t1 tcurs
nn-n over block push -1 curs ! 0 tcu1
nnn-n dup i + @ map over over negate + dr op -if t1 drop drop pop drop ; then tcu1 ; -curs
- curs @ -1 + 0 max curs ! ; here tpoint
blk @ curs @ tcurs drop -curs ; cpoint !
|
word search tag?
nz and less if bit in m indexed by tag of token n is 1. +shad
skips shadows if in one and skipping. 1word
-n return 1st cell of word from kbd. find
finds following short word, starting in b lock 18, regardless of color. def
finds only definitions. f
find next occurrence of word last found fk
'f' key in edit keyboard. drops key and blo ck number and behaves like f except continues search from current editor position in current kind of block src/shad. fkc
if word left of cursor is a number, list t hat block. if red or magenta definition, searc hes for references. otherwise searches for def initions. from
n- like find but start from block number literal
n- finds any equivalent literal
|
|
64 list
word search fmask -16 fnn -403177456 fna 67146 240 fbits 24218 18 block fna ! tag?
nm-n over F and swap bt drop ; +shad
a-a dup fna @ or 256 and + ; 1word
-n word words @ 1wz
2 less drop if drop ; then nip -1 + 1wz ; want?
nm-n tag? if or ; then drop drop -1 ; find
1word 5E9A fnd+
18 block -16 fnd
nbam fmask ! fna ! fbits ! 16 or fnn ! f
fnn @ 16 or fna @ begin +shad nblk @ block l ess drop while over over @ fbits @ want? fmask @ and drop while
1 + end then dup 1 + fna ! ni p 100 /mod -offset swap tcurs edit ; then drop drop ; red?
n-nm 1008 tag? if 4092 ; then 1008 ; def
1word 1008 fnd+ ; here ekt 21 + ! fkc
drop drop pcad @ @ 140 tag? if 32 / edit ; then red? fnd+ blk @ dup ; here ekt 22 + ! fk
drop drop cad @ fna ! f blk @ dup ; from
n- 1word swap 5E9A swap block -16 fnd ; literal
n- 20 * 140 18 block -32 fnd ;
|
tags cr
extend execute 32-bit define cr
compile 32-bit 27-bit immediate cr
27-bit comment cap caps cr
variable address blue 27-bit br
array fetch new tag reclr
table of color cycles wadr
-a address of word to left of cursor change
color of word to left of cursor 220e100a
0a-c 10-d 0e-f 22-j
|
|
66 list
editor recolor 8 display + @ 13 display + ! array
pop 2/ 2/ + @ ; 1-4-9 2-5 8-6-15 reclr
align array cr
0 , 4 , 5 , 3 , 9 , 2 , 15 , 7 , cr
6 , 1 , 10 , 11 , 12 , 13 , 14 , 8 , wadr
-a pcad @ blk @ max ; here ekt 20 + ! change
wadr @ F and reclr wadr @ FFFFFFF0 and or wadr ! ; 220E100A ekt 33 + !
|
?xqt executes the word just passed over if it exists in the dictionary. @lit
fetch 27-bit literal tadr
display target address blu
display blue word d14
tag 14 display entry exb
display and execute blue word if found. tab
advance n spaces indent
5 spaces br
blank line s/2
halfspace for reports. -cr
suppress cr on next red word. seeb
toggle display of blue words ?seeb
set flag non-zero if blue words visible; indent
only useable in a definition
|
|
68 list
blue words -w@
-n 7push pop -1 + @ ; ?xqt
-w@ -16 and itick if drop ; then push ; @lit
-w@ 32 / ; here display 13 + ! tadr
C0C0C0 color @lit 3 h.n space ; blu
FF color type1
9 display + @ 5 + push ; d14
14 display + ; here d14 ! exb
blu 1 sp + @ push ?xqt ; tab
n for space next ; indent
cr 5 tab ; br
cr cr ; sp/2
B0000 xy +! ; d03
-a 3 display + ; here exr
d03 @ nop d03 ! space red type1 ; -cr
0 + nop d03 ! ; seeb
d14 @ d14 @ dup 5 + or or d14 ! ; ?seeb
-t d14 @ d14 @ 5 + or drop ; seeb
|
colorforth to ascii and ascii to colorforth to load, type c-a-c not 54 load cf-ii
otr inae ycms wfgl bpvd quxh 3210 7654 - j98 /z.k +!'; ?,*@ ii-cf
! +* /.-, 3zjk 7654 ;'98 ? cba@ gfed 02i h onml srqp wvut 1yx cba@ gfed 02ih onml srqp wvut 1yx notice
j and z transposed in cf-ii; - converts to underscore, + to dollar.
|
|
70 list
convert colorforth character to/from ascii mac ro 1@
8A 2, ; forth string
pop ; cf-ii
string 6F747200 , 696E6165 , 79636D73 , 7766676C , 62707664 , 71757868 , 336a7a6b 3332 3130 , 37363534 , 2d313938 - 2d7a3938 5F7A3938 ,
2f322e30 2F6A2E6B , 2b213a3b 24213A3B , 3F2C 2A40 , ch
FFFFFFF0 and unpack cf-ii + 1@ FF and ; ii-cf
string 2A00 , 0 + 2B , 2B2D0000 , 272523 2E , zjk 1b262224 1B1A1918 , 1F1E1D1C , 282921 20 , 2F000000 , 3A43355C , 3D3E3440 , 02 484a3 744 kj 54523744 , 3336393C , 38314742 , 3F4146 32 , 1 493b45 z 563B45 , - 23000000 , A13052C , D0E0410 , 02 181a0714 kj 24220714 , 306090C , 8011712 , F111602 , 1 190b15 z 260B15 , chc
FFFFFFE0 + ii-cf + 1@ FF and ;
|
colorforth to ascii and ascii to colorforth cf-ii
otr inae ycms wfgl bpvd quxh 3210 7654 - j98 /z.k +!'; ?,*@ ii-cf
! +* /.-, 3zjk 7654 ;'98 ? cba@ gfed 02i h onml srqp wvut 1yx cba@ gfed 02ih onml srqp wvut 1yx set1
modifies cf-ii table. cr
; to colon, ' to doublequote, + to equal, cr
@ to lessthan, * to blank, ? to greaterthan set0
converts back to ascii.
|
|
72 list
convert cf character to/from ascii macro 1@
8A 2, ; 1!
a! 288 2, drop ; forth string
pop ; cf-ii
align string 6F747200 , 696E6165 , 79636 D73 , 7766676C , 62707664 , 71757868 , 3332313 0 , 37363534 , 2D6A3938 , 2F7A2E6B , 2B21273B , 3F2C2A40 , ch
FFFFFFF0 and unpack cf-ii + 1@ FF and ; ii-cf
string 2A00 , 2B , 2B2D0000 , 2725232E , 1B1A1918
, 1F1E1D1C , 28292120 , 2F000000 , 3A 43355C , 3D3E3440 , 54523744 , 3336393C , 3831 4742 , 3F414632 , 563B45 , 23000000 , A13052C , D0E0410 , 24220714 , 306090C , 8011712 , F11 1602 , 260B15 , chc
FFFFFFE0 + ii-cf + 1@ FF and ; set1
3D21223A 3E2C203C !8
nn- cf-ii 2C + 2/ 2/ ! cf-ii 28 + 2/ 2/ ! ; set0
2B21273B 3F2C2A40 !8 ;
|
filename input strng
defines an array of bytes. fnam
is a zero terminated ascii string consist ing of hld chars including the null. emt appen ds a character to this string. +shan
appends a shannon word to fnam. br
named returns the byte address of a null termi nated ascii string representing the following colorforth string, which may follow in either source code or in keyboard input. br
inam accept filename input from keyboard, stor e zero terminated ascii string to fnam, and re turn byte address of fnam.
|
|
74 list
pathname input 72 load set1 strng
n-a pop + ; fnam
n-a align strng here 80 + h ! hld 8 emt
n- hld @ fnam 1! 1 hld +! ; +shan
ch emt dup and if +shan ; then drop ; br
,src 7@+ @ xx
dup and if +shan 7@+ @ dup 15 and drop cr
while then 0 and emt 7dec ; then xx ; named
string 0 hld ! -kbd if ,src ; cr
then keyboard 0 word 0 cr
begin push dup and while end then drop cr
begin pop dup and while +shan end then emt ; c r
exit testing ccc
dup 1@ 255 and swap 1 + ; cr
named //./a;
|
index hld
place in file spot
in line nxt
fetch next word emit
ascii character, won't go past column 72 space
written to file crlf
to file digit
hex digit to file .h
print hex number .d
decimal number
|
|
76 list
index empty cr
72 load cr
hld 0 0 hld ! spot 0 0 spot ! nxt
a-an dup 1 + swap @ ; emit
c spot @ -72 + drop -if hld @ 3000 block 4 * + 1! 1 hld +! 1 spot +! ; then drop ; space
32 emit ; crlf
0 spot ! 13 emit 10 emit ; digit
n -10 + -if 3A + emit ; then 41 + emit ; .h
n space -1 swap cr
begin dup F and swap 2/ 2/ 2/ 2/ cr
FFFFFFF and while end then drop cr
0 + -if drop 0 digit ; then spit
0 + -if drop ; then digit spit ; .d
n space 0 + -if 2D emit negate then -1 swap begin 10 /mod dup and while end then cr
drop spit ; cr
78 load
|
index.1 short
number literal
long number word
text, not number cont
inuation word variable
name and value eol
red word means end of line tag
vector table words
print maximum n words or to eol index
first-block last+1 cr
prints first line of each block in range cr
to a log file in windows
|
|
78 list
index.1 short
n 2/ 2/ 2/ 2/ dup 1 and drop cr
if 2/ .h ; then 2/ .d ; literal
an-a push nxt pop 10 and drop cr
if .h ; then .d ; word
n space FFFFFFF0 and cont
n dup and if ch emit cont ; then drop ; variable
an-a word nxt .d ; eol
n drop pop drop pop drop drop ; tag
a-a dup F and jump cont word literal cr
eol word literal short word short word cr
word word variable short word short words
n for nxt tag next drop ; index
1st lst+1 0 hld ! over negate + 2/ cr
for dup .d dup space block 10 words crlf cr
2 + next drop sav
3000 block 4 * olog hld @ wlog clog ;
|
|
|
80 list
|
|
|
82 list
|
short tag, then 28bit value+base literal
tag, then base 32bits
from next word. 2 chunks variable
single word, then 32-bits /whit
replaces a word's tag with 9, making it a lowercase comment. tag
identify kind of word note /whit used for tags A and B to convert these deprecated capit alized comments to lower case. when all source of interest has been compressed at least once this may be removed. words
scan thru block. 8 0s eob range
process blocks, number and count. 31 0s eof sve
compress blocks 72 thru 1419 flop
write floppy; save number of cylinders
|
|
84 list
compress empty 86 load short
4 rbits 28 bits ; literal
4 rbits 2/ 2/ 2/ 2/ 1 rbits 32bits
drop 1 + dup @ 16 bits 16 bits ; variable
1word 32bits ; /whit
n-n -16 and 9 or word ; tag
an-an dup F and jump cont word literal wor d word literal short word short word /whit /wh it variable short word short words
a dup @ dup and if tag drop 1 + words ; then 4 bits drop drop ; range
nn-an here/4 here4 push new for dup bloc k words 1 + next drop 0 31 bits drop pop here4 over negate + ; !lng
nw 127 + 128 / 72 + dup nsec 0 block 1 + ! dup negate ns ! 35 + 36 / nc ! ; sve
7push 36 nblk @ -36 + range an !lng drop 0 block 3000 block 36 blks move 3000 !work ns @ abs ns ! 7pop ; 3036 block 4 * h ! sve
|
b pop ebx, register 3, into eax c!
push eax into register 1, ecx 2*d
shift ebx left by ecx. bits from eax 2*c
shift eax left by ecx 2/r
rotate eax right by ecx nb
number of bits remaining in word here/4
align to word boundary here4
word address in dictionary new
32-bits in current word shift
eax into ebx, decrement nb rbits
rotate bits to high-order position bits
shift bits into ebx; cross word boundary char
examine high bits. shift 4, 5 or 7 bits chars
shift all non-zero characters 1word
short word without continuation for vari able word
shift tag, then characters cont
continue without tag
|
|
86 list
compress macro uses ebx b
?dup C38B 2, ; c!
C88B 2, drop ; 2*d
C3A50F 3, ; 2*c
E0D3 2, ; 2/r
C8D3 2, ; forth nb 4 here/4
here 3 and if 1, here/4 ; then drop ; here4
here 2/ 2/ ; new
32 nb ! ; shift
nn-n dup negate nb +! c! 2*d 2*c ; rbits
dup c! swap 2/r swap bits
nn-n dup negate nb @ + -if dup push + shi ft b , new pop negate shift ; then drop shift ; char
-if 2* -if 2/ 7 bits ; then 2/ 80000000 o r 5 bits ; then 4 bits ; chars
dup and if char chars ; then ; 1word
4 rbits chars 4 bits ; word
an-an 4 rbits cont
chars over 1 + @ dup and if F and drop if 4
bits ; then ; then drop 4 bits ;
|
these definitions support text display and are used in other parts of okad as well. br
7@+ interpret only, returns adr of next word i n block and skips over it ... 7-0-mov 7-inc 7dec
used to correct address after 7@+ @ret
fetch return address, skip bytes of code. 4@
cell fetch on byte boundary tick
given adr of call instr, return tgt adr call
and jmp generate xfers to next word br
.shan displays a shannon coded string ,lit
compiles a literal. .'
displays the following one-word comment. br
strings starts an array of words in source. '
interp only, returns next word's code addr. execute
is a call to the given routine adr. eval
interprets the source word whose address is given.
|
|
88 list
display text macro 7@+
-a ?dup C78B 2, 47 1, ; 7dec
4F 1, ; @ret
-b ?dup 24048B 3, 5240483 , ; 4@
b-n 8B 2, ; forth tick
b-b dup 1 + 4@ + 5 + ; call
E8 -cr dst 1, @ret tick here 3 + - + , ; jmp
E9 dst ; br
.shan n- dup and if unpack emit .shan ; then d rop ; -cr +str a-a + ; macro ,lit
n ?dup B8 1, , ; strings
i-a 7push pop ,lit jmp +str nop ; .'
comment 7@+ @ -16 and ,lit call .shan nop ; forth
br
' -b -kbd if 7@+ @ itick if abort then ; cr
then tic ; execute
b push ; eval
a 7push 1 + push 7pop sp 1 + @ execute 7p op ;
|
disk mgmt and reconciliation utility. bloks
copies n blocks from s to d, front to ba ck so only moves overlap downward safely. +blocks
copies n blocks and their shadows. obliterate
wipes from block l to block h. matching
sets up to match s to d. to
sets block no. past end of source area. other
given a block number in one of the areas returns the corresponding block no. in the oth er area. lesser
given a block number returns the lesser of the pair it is a member of ?blks
scans a range of blks leaving nos of any differing blks on the stack. ?bin
scans the binary parts of okad disk. check
reads backup to 3000 and decompresses if appropriate
|
|
90 list
disk audit utility empty 30 load bias 0 cr
sep 3000 3000 sep ! head 1439 1439 head ! +blocks
sdn 2* bloks ; bloks
sdn push swap block swap block pop 256 * move ; -cr n18 i-a 3018 block + ; wipe
blk @ 1 erase e lis ; -cr to n head ! ; obliterate
lh over negate + erase ; matching
sd less if swap then dup bias ! negat e + sep ! ; cast
nm-n' dup push /mod 1 or pop * + ; other
n-n' bias @ negate + sep @ cast bias @ + ; lesser
n-n dup other min ; 92 load ?blk
n-n?n+ lesser dup block over other block 256 for over @ over @ or drop if drop drop dup 1
+ pop drop ; then 1 + 1 u+ next drop drop 1 + ; -cr ?blks sn-? for ?blk next drop ; ?bin
kernel 0 12 ?blks icons 12 6 ?blks ; unpk
abs 1 n18 ! 3036 block 5000 block 1404 bl ks move 5000 block 3036 3 n18 @ -36 + range ; check
3000 @back 0 n18 @ 18 block @ or drop if ; then 1 n18 @ dup and -if unpk ; then drop ;
|
blink displays the given block with its other set as the editor's 'other' block var
compares a variable name, advancing pointe rs to skip its value. *1
compares garden variety words. *2
compares large literals. tag
compares source cells given, true if diff, advancing ptrs and ignoring variable vals. ?nul
ends loop in co if nuls hit in both blks. co
does work of com given adrs of both blks. com
invokes editor to blink the given block if it differs from the other, otherwise returns. g
scans for diffs after current editor block. v
shows the other block give
writes current editor block over its twin take
writes twin over current editor block. check
reads backup to 3000 for matching. all
scans the whole usable area of the disk.
|
|
92 list
compare blink
n dup other blk ! edit ; var
nnxx-nnd push push 1 + 1 u+ pop pop *1
nnxx-nnd or ; *2
nnxx-nnd var push over @ over @ or pop + ; tag
nn-n dup F and jump *1 *1 *2 *1 *1 *2 *1 * 1 *1 *1 *1 *1 var *1 *1 *1 +or
nn-n over - and or ; ?nul
nnxx-nnxx over over +or drop if ; then dr op drop pop drop drop drop ; co
naa-n over @ over @ ?nul tag drop if drop d rop blink ; then 1 + 1 u+ co ; com
n-n dup block over other block co ; g
blk @ lesser gg
n head @ over - + drop -if drop ; then 1 + com gg ; v
blk @ other edit ; give
blk @ dup other 1 bloks ; take
blk @ dup other swap 1 bloks ; check
3000 @back ; all
0 3000 matching nblk @ -1 + to 17 gg ;
|
|
|
94 list
|
talk to chip via native rs232. br
1@ and 1! byte fetch and store, byte address. 2@
and 2! halfcell fetch/store, byte adr. swab
and swa4 2-way and 4-way byte swaps. a-b
and b-a convert cells to+from bytes. br
bofs and ofs make byte and cell offset adrs in a structure given byte posn and byte width. create
used after align to exit with word adr of cell following in dictionary. note that wri ting into such allocations invalidates nearby instruction cache! rez
allots n bytes in the dictionary. +or
inclusive or. ?zero
classical zero-equal returning 0 or -1 w ith indicators. br
ntgt indices for active paths, 1 for adjacent. act
number of selected path, to which vport le ads. cold
sets no active paths. user
test code before canonicals.
|
|
96 list
native async 96 orgn ! macro 1@
b-c 8A 2, ; 1!
cb a! 288 2, drop ; 2@
b-h 8B66 3, ; 2!
hb a! 28966 3, drop ; 4@
b-n 8B 2, ; 4!
nb a! 289 2, drop ; swab
h-h C486 2, ; swa4
n-n C80F 2, ; forth a-b
a-b 2* 2* ; b-a
b-a 3 + 2/ 2/ ; create
-a pop b-a ; rez
n h +! ; +or
nn-n over - and or ; ?zero
n-n 0 or if dup or ; then - -1 or ; br
act 0 vport 373 0tg 1 1tg 1 2tg 1 cold
1 0tg ! 1 1tg ! 1 2tg ! 0 act ! ; br
ser 98 load 118 load routes 120 load cr
generic 122 6 loads panel 134 load cr
user 136 load canon 138 load
|
async data are 18 bits per 3 bytes. to chip wo rd inverted, shifted up 6, '12' inserted, then sent low order byte first. from chip are tbd. br
sport com port address 4@
and 4! full cell on byte address. +sea
opens serial; true if good, handle in dh. -sea
closes the handle. /sea
resets the chip. tosea
transmits n bytes to chip. insea
receives w g18 words from the chip. br
-stream clears byte index bi in sdat buffer. stream
byte adr of buffer. /str
byte adr of next 18-bit slot in buff. br
@18 returns the next 18 bits from the stream. !18
appends 18 bits to the stream. no higher o rder bits may be present!
|
|
98 list
async umbilical 3F8 serial 60 load rsh
ni-n 0 + if for 2/ next ; then drop ; sdat
align create 16384 rez bi 30 -stream
0 bi ! ; stream
-b sdat a-b ; /str
-b bi @ stream + ; br
@18 -n /str 4@ 3FFFF and +wd
3 bi +! ; !18
n 3FFFF or 40 * 12 + /str 4! +wd ; br
+sea -ok init 1 0 + ; -sea
; reset
2 st! 100000 for next 0 st! ; tosea
bn for dup 1@ xmit 1 + next drop ; insea
w stream swap 3 * for indent rcv over 1! 1 + next drop ;
|
talk to seaforth via onspec usb. br
1@ and 1! byte fetch and store, byte address. 2@
and 2! halfcell fetch/store, byte adr. swab
and swa4 2-way and 4-way byte swaps. a-b
and b-a convert cells to+from bytes. br
bofs and ofs make byte and cell offset adrs in a structure given byte posn and byte width. create
used after align to exit with word adr of cell following in dictionary. note that wri ting into such allocations invalidates nearby instruction cache! rez
allots n bytes in the dictionary. +or
inclusive or. ?zero
classical zero-equal returning 0 or -1 w ith indicators. br
ntgt indices for active paths, 1 for adjacent. act
number of selected path, to which vport le ads. cold
sets no active paths. user
test code before canonicals.
|
|
100 list
onspec usb interface 100 orgn ! macro 1@
b-c 8A 2, ; 1!
cb a! 288 2, drop ; 2@
b-h 8B66 3, ; 2!
hb a! 28966 3, drop ; swab
h-h C486 2, ; swa4
n-n C80F 2, ; forth a-b
a-b 2* 2* ; b-a
b-a 3 + 2/ 2/ ; bofs
bw-b'b over + swap ; ofs
bw-b'a bofs b-a ; create
-a pop b-a ; rez
n h +! ; +or
nn-n over - and or ; ?zero
n-n 0 or if dup or ; then - -1 or ; br
act 0 vport 325 0tg 1 1tg 1 2tg 1 cold
1 0tg ! 1 1tg ! 1 2tg ! 0 act ! ; br
usb 102 5 loads routes 112 load cr
generic 122 6 loads panel 134 load cr
user 136 load canon 138 load
|
nam pathname buffer spq
argument for inquiry obuf
buffer for inquiry return len
bytes returned from fioctl calls br
inq makes device inquiry, returns true if ok ?sea
true with indic if reply vendor seaforth cr
+sea finds a forthdrive. true if found, handle in dh. -sea
closes the handle.
|
|
102 list
find/open/close onspec nam
-a align create //./ 2F2E2F2F , d' 3A47 , obuf
-a align create 512 rez len 80 spq
-a align create 0 , 0 , 0 , inq
-ok len 512 obuf 12 spq 2D1400 dh @ fioctl ; br
-sea dh @ 0 + if fclose 0 then dh ! ; ?sea
-t obuf dup 3 + @ b-a + dup @ 66414553 or swap 1 + @ 6874726F or +or ?zero ; +sea
-ok 3A44 nam 1 + ! 20 for nam r/w fopen d h ! if inq drop if ?sea if pop drop ; then dro p then then -sea 1 nam 1 + +! next 0 ;
|
/sdb total length of scsi structure, bytes br
sdb scsi structure word adr unless -b nsdb
-b length in bytes thru cdb ncdb
-b length of cdb in bytes i/o
-b 0 out 1 in 2 no data ndata
-a length in bytes of data transfer nto
-a timeout in seconds 'data
-a offset in bytes to sdat 'sns
-a offset in bytes to sns cdb
-b scsi command sdat
-b scsi data br
!cdb initializes sdb for cmd whose word adr an d byte lng are given. data xfer params must be set before /scsi. !xfer
sets length in bytes and direction of da ta transfer. /scsi
executes scsi command returning api stat us not necessarily scsi status.
|
|
104 list
scsi operations /sdb
-n 28 16 + 32 + 16 1024 * + ; br
sdb align create /sdb rez struc sdb a-b nsdb
-b 2 bofs ; sstat 1 + 3 + ncdb
-b 1 bofs ; nsns 1 + i/o
-b 1 bofs ; 3 + ndata
-a 4 ofs ; nto
-a 4 ofs ; 'data
-a 4 ofs ; 'sns
-a 4 ofs ; cdb
-b 16 bofs ; sns 32 + sdat
-b 16 1024 * bofs ; drop br
!cdb an 0 sdb 28 16 + 32 + b-a fill 28 16 + du p nsdb 2! dup 'sns ! 32 + 'data ! 20 nto ! dup ncdb
1! cdb b-a swap b-a move ; !xfer
ni i/o 1! ndata ! ; /scsi
-ok len /sdb sdb over over 4D004 dh @ fi octl ;
|
lok and -lok perform the lock and unlock volum e functions that are apparently required aroun d a scsi command. scsi
executes a scsi passthrough command with proper lock protection. br
onspec custom scsi command blocks- /os
cycles chip power and resets it. wos
writes synch to chip wos!
writes and leaves lines tristate. ros
reads synch from chip. !nbits
sets bit count field in command, limit 32 or 64k br
/sea resets the chip. tosea
transmits w halfwords, b bits with op wo s or wos! as you wish. insea
receives w g18 words from the sync boot node. the data in our memory are in onspec for mat both directions. mute
properly closes the handle.
|
|
106 list
onspec vendor unique ops /lok
f-ok push len 0 0 0 0 pop dh @ fioctl ; lok
90018 /lok drop ; -lok
9001C /lok drop ; scsi
-ok lok /scsi -lok 0 + ; br
/os align create FA20 , 0 , 0 2, wos
align create FB20 , 0 , 0 2, wos!
align create 2FB20 , 0 , 0 2, ros
align create 1FB20 , 0 , 0 2, !nbits
h swab cdb 7 + 2! ; br
/sea -ok /os 10 !cdb 0 2 !xfer scsi drop ; tosea
wbo 10 !cdb !nbits 2* 0 !xfer scsi drop ; insea
w ros 10 !cdb 18 * dup !nbits 14 + 16 / 2* 1 !xfer scsi drop ; mute
-lok -sea ;
|
onspec data are a continuous stream of bits in consecutive bytes, left to right, except that bytes are swapped in halfcell units. cell fetc hed on any halfcell boundary and half-swapped has continuous bits running from hi to lo. br
4@ and 4! full cell on byte address. lsh
and rsh left and right arith shifts. swah
swaps hi and lo halfcells of a number. br
-stream clears bit index bi in sdat buffer. stream
halfcells and bits within index. /str
cell addr, shift count for next 18. br
@18 returns the next 18 bits from the stream. !18
appends 18 bits to the stream. no higher o rder bits may be present!
|
|
108 list
onspec bitstream bi 0 macro 4@
b-n 8B 2, ; 4!
nb a! 289 2, drop ; swah
n-n C1 1, 10C8 2, ; forth lsh
ni-n 0 + if for 2* next ; then drop ; rsh
ni-n 0 + if for 2/ next ; then drop ; br
-stream 0 bi ! ; stream
-wb bi @ dup 15 + 16 / swap ; /str
-bi bi @ 16 /mod 2* sdat + swap - 15 + ; cr
@18 -n /str push 4@ swah pop rsh 3FFFF and +wd
18 bi +! ; !18
n 3FFFF and /str swap push i 4@ swah push push i lsh FFFC0000 pop lsh pop and or swah po p 4! +wd ;
|
boot frames begin with a 3 word header; indent 100xx jump to xx when done indent ddd mem/port adr to store payload indent nnn transfer length indent nnn+1 * 2 words of payload /frame
heads a new given even words of payload , destination addr, final jump addr. +frame
appends words to payload. +ram
appends a string of code from binary prod uced by compile for the given node. !frame
transmits frame given wos or wos! br
talk prepares chip for control thru node 19. exch
performs a transaction with target given addr and length of port stream, stream end act ion in node 19, and number of words reply. br
ok stream end to simply ack completion; fet pu mps one word from target; bstk shepherds stack dump; stat pumps ten. exec is next boot frame.
|
|
110 list
node 19 boot frames inop for ga4 /frame
nw xfr jmp -stream 10000 + !18 !18 1 + 2/ -1 + !18 ; +frame
wn for dup @ !18 1 + next drop ; +ram
w n node nn-n 2* 8000 + block u+ for dup @ 15555 or !18 1 + next drop ; !frame
op push stream pop tosea ; br
exec B6 ; talk
cold mute +sea if lok drop /sea 40 0 exec /frame
0 40 19 +ram wos !frame good ; then bad -sea ;
br
exch w n f n push push dup 2 + -2 and vport @ pop /frame vport @ 12000 + !18 dup - 1 and dro p if vport @ 10000 + !18 then +frame wos! !fra me pop insea -stream ; br
ok 18 ; fet
1C ; stat
23 ; bstk
25 ;
|
0pth 1pth 2pth are manually set route lists fo r using the north, south, and west ports of no de 19. end list is marked by -1 br
this block has plenty of extra room so that yo u may customize the available lists without ch anging the reference versions.
|
|
112 list
route lists inop for ga4 0pa
align create 19 , 29 , 39 , 38 , 37 , 36 , 35
, 34 , 33 , 32 , 31 , 30 , 20 , 10 , 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 19 , -1 , 1pa
align create 19 , 18 , 17 , 16 , 15 , 14 , 13
, 12 , 11 , 21 , 22 , 23 , 24 , 25 , 26 , 2 7 , 28 , -1 , 2pa
align create 19 , 9 , 8 , 7 , 6 , 5 , 4 , 3 , 2 , 1 , 0 , 10 , 20 , 30 , 31 , 32 , 33 , 34 , 35 , 36 , 37 , 38 , 39 , 29 , 28 , 27 , 2 6 , 25 , 24 , 23 , 22 , 21 , 11 , 12 , 13 , 14 ,
15 , 16 , 17 , 18 , 19 , -1 , br
|
talk to chip via onspec usb. br
1@ and 1! byte fetch and store, byte address. 2@
and 2! halfcell fetch/store, byte adr. swab
and swa4 2-way and 4-way byte swaps. a-b
and b-a convert cells to+from bytes. br
bofs and ofs make byte and cell offset adrs in a structure given byte posn and byte width. create
used after align to exit with word adr of cell following in dictionary. note that wri ting into such allocations invalidates nearby instruction cache! rez
allots n bytes in the dictionary. +or
inclusive or. ?zero
classical zero-equal returning 0 or -1 w ith indicators. br
ntgt indices for active paths, 1 for adjacent. act
number of selected path, to which vport le ads. cold
sets no active paths. user
test code before canonicals.
|
|
114 list
windows async 114 orgn ! macro 1@
b-c 8A 2, ; -cr 1! cb a! 288 2, drop ; 2@
b-h 8B66 3, ; -cr 2! hb a! 28966 3, drop ; 4@
b-n 8B 2, ; -cr 4! nb a! 289 2, drop ; swab
h-h C486 2, ; swa4
n-n C80F 2, ; forth a-b
a-b 2* 2* ; -cr b-a b-a 3 + 2/ 2/ ; create
-a pop b-a ; -cr rez n h +! ; +or
nn-n over - and or ; ?zero
n-n 0 or if dup or ; then - -1 or ; br
act 0 vport 149 0tg 1 1tg 1 2tg 1 cold
1 0tg ! 1 1tg ! 1 2tg ! 0 act ! ; br
ser 116 2 loads routes 120 load cr
test boot frames 1304 load cr
once orgn @ dup and drop if ; then -pwr ; cr
once 114 orgn ! cr
generic 122 6 loads panel 134 load cr
user 136 load canon 138 load
|
async data are 18 bits per 3 bytes. to chip wo rd inverted, shifted up 6, '12' inserted, then sent low order byte first. from chip are tbd. br
sport comp com port number 4@
and 4! full cell on byte address. snam
null terminated string //./comx !nam
sets port number in snam. +sea
opens serial; true if good, handle in dh. -sea
closes the handle. -pwr
refreshes handle + sets reset low reset
releases reset line high tosea
transmits w halfwords, b bits with op wo s or wos! as you wish. insea
receives w g18 words from the sync boot node. br
-stream clears byte index bi in sdat buffer. stream
byte adr of buffer. /str
byte adr of next 18-bit slot in buff. br
@18 returns the next 18 bits from the stream. !18
appends 18 bits to the stream. no higher o rder bits may be present!
|
|
116 list
async umbilical sport 18 18 sport ! rsh
ni-n 0 + if for 2/ next ; then drop ; sdat
align create 16384 rez bi 3 -stream
0 bi ! ; stream
-b sdat a-b ; /str
-b bi @ stream + ; br
@18 -n /str 4@ 3FFFF and +wd
3 bi +! ; !18
n 3FFFF or 40 * 12 + /str 4! +wd ; br
snam -a align create //./ 2F2E2F2F , com 6D6F6 3 , 0 , !nam
sport @ 10 over - + drop -if 256 * 2560 / mod + 3000 + then 30 + snam a-b 7 + 4! ; !nam +sea
-ok snam r/w fopen dh ! if 1 ; then 0 ; -sea
dh @ 0 + if fclose 0 then dh ! ; ctl!
n dh @ fesc drop ; -pwr
cold -sea +sea if drop 3 ctl! ; then -sea ; reset
4 ctl! 500000 for next 4 ctl! ; tosea
bn dh @ fwr drop ; insea
w stream swap 3 * dh @ frd drop ;
|
boot frames begin with a 3 word header; indent 100xx jump to xx when done indent ddd mem/port adr to store payload indent nnn transfer length indent nnn+1 * 2 words of payload /frame
heads a new given even words of payload , destination addr, final jump addr. +frame
appends words to payload. +ram
appends a string of code from binary prod uced by compile for the given node. !frame
transmits frame given wos or wos! br
talk prepares chip for control thru node 19. exch
performs a transaction with target given addr and length of port stream, stream end act ion in boot node, and number of words reply. c r
ok stream end to simply ack completion; fet pu mps one word from target; bstk shepherds stack dump; stat pumps ten. exec is next boot frame.
|
|
118 list
node 0 boot frames wos
-n 0 ; /frame
nw xfr jmp -stream 10000 + !18 !18 1 + 2/ words 2* actual -1 + !18 ; +frame
wn for dup @ !18 1 + next drop ; +ram
w n node nn-n 2* 8000 + block u+ for dup @ 15555 or !18 1 + next drop ; !frame
f drop stream bi @ tosea ; br
exec 6E 6D ; talk
cold -sea +sea if drop reset 40 0 exec /f rame 0 40 33 22 +ram wos !frame good ; then ba d -sea ; cr
exch w n f n push push dup 2 + -2 and vport @ pop /frame vport @ 12000 + !18 dup - 1 and dro p if vport @ 10000 + !18 then +frame wos !fram e pop insea -stream ; br
ok 12 ; fet
15 ; stat
1B ; bstk
1D ;
|
0pth 1pth 2pth are manually set route lists fo r using the north, south, and west ports of no de 19. end list is marked by -1 br
this block has plenty of extra room so that yo u may customize the available lists without ch anging the reference versions.
|
|
120 list
route lists 0pa
align create 0 , 10 , 11 , 1 , 0 , -1 , 1pa
align create 0 , 10 , 11 , 1 , 0 , -1 , 2pa
align create 0 , 1 , 11 , 10 , 0 , -1 , br
|
this code supports boot node controlling one o f its immediate neighbors directly. these all begin with focusing call and each must return! cr
port returns port for 0-3 rdlu ndx, then edges wall
is index for port between two nodes br
doxxx port execution templates for target. aa@
fetches from memory or port in target onto our stack here. aa!
stores a value from our stack here to port or memory in target. ains
executes an arbitrary instruction word wh ich must end by returning. acall
executes a target word which must return or jump to ports. apsh
pushes a number onto target stack. astk
queries target stack nondestructively.
|
|
122 list
boot target adjacent wall
nn-i over over or 1 and drop if or 2 and ; then 10 / swap 10 / or 2 and 1 + ; br
do! align create @p+a!.@p+ 4AB7 , indent 0 , 0 , !;;; B555 , do@
align create ...@p+ 2C9B7 , indent 0 , a!@!p+; 2BE35 , doi
align create 10000 , dopu
align create @p+; 5555 , 0 , dostk
align create !p+dup-push!p+ CDBE , br
aa@ a-n do@ 1 + ! do@ 3 fet 1 exch @18 ; aa!
na do! 1 + ! do! 2 + ! do! 4 ok 1 exch ; acall
a 10000 + ains
w doi ! doi 1 ok 1 exch ; apsh
n dopu 1 + ! dopu 2 ok 1 exch ; astk
dostk 1 bstk 10 exch ;
|
templates and load streams 'pth
current posn in path list of nodes. nstream
given addr of path tbl, nodes away, gi ves no of wire nodes and total stream length ?path
returns node number relative to current posn in selected path. side
gives adr of 0 near, 1 far side next node /hdr
starts a stream of given length; if odd, we leave out jump after waking 1st node. br
+pump makes port pump thru next node; its ram load and init postamble must be out of w. +load
builds a program load from binary given node ram addr, word count, words to take from binary, and node number. caller must append an y words not taken from binary. +post
follows a node's ram load to set b to ou t, a to in, and jump to p.
|
|
124 list
stream components 'pth 67523448 nstream
an-n'w swap 'pth ! -2 + -if 0 pop drop ; then pre 2 ; ?path
i-n 'pth @ + @ ; side
n-a 'pth @ + dup @ swap 1 + @ wall port ; /hdr
w-w dup -2 and 0 side exec /frame pre 0 s ide 12000 + !18 -1 + dup 1 and drop if 0 side 10000 + !18 then -1 + ; br
+pump nw-nw -8 + @p+b!@p+@p+ 4B17 !18 cr
1 side dup !18 dup 10000 + !18 12000 + !18 cr
!b!b.@p+ 9BB7 !18 w dup -1 + !18 cr
dup-push-if 24861 !18 @p+!b.unext 5BB4 !18 ; +load
w n nb nd push push @p+a!.@p+ 4AB7 !18 a over !18
n -1 + !18 dup-push-if 24861 !18 cr
@p+!+.unxt 58B4 !18 pop pop +ram ; +post
p @p+b!.@p+ 4BB7 !18 1 side !18 0 side ! 18 a!@p+push; 2BDBD !18 p !18 ;
|
this block creates and destroys umbilical wiri ng within the chip. br
using sets vport between given pair of nodes. avail
is idle pc val for given node. br
+path steps pos to, neg away from target. br
wires builds wire for path table a. entry zero is boot node. n is number of nodes away from b oot in path; 0 no uut, 1 no wire, uut is meigh bor, 2 neighbor is last guy, 3 n-2 wire nodes then last guy. generates call at end of last g uy pgm that last guy sends target for focus. rips
rips out a wire built by wire
|
|
126 list
umbilical plumbing using
nn wall port vport ! ; avail
n-p nn-n idle ; br
+path n'wn-n'w dup 'pth +! negate u+ ; br
rip nw-nw 0 u+ if post -5 + +pump 1 +path rip -1 +path then 1 ?path avail +post ; rips
an-n'w nstream over 13 * + 5 + /hdr rip hose
nw drop drop 0 ?path 1 ?path using wos !f rame ; br
wire nw-nw 0 u+ if wire 16 10 + negate + +pump 1
+path wire -1 +path wire 0 16 dup 21 +load 0 side +post ; then
last 0 20 dup -1 + 20 +load 1 side 12000 + !18 0 side +post ; wires
an-n'w nstream over 18 lwire 16 + * + 10 llast
20 + + nop /hdr wire hose ;
|
these functions support route setup and select ion for internal wiring. br
targets table of target index variables. paths
table of route lists. br
path selects active path i 0,1,2 node
selects path whose target is node n br
-hook rips out any wiring on path i hook
hooks up path i to node n ripping out any old wiring on that path. br
?adj executes following word and exits defn if selected path is to adjacent node, otherwise s kips following word.
|
|
128 list
routing control targets
-a act @ align tbl 0tg , 1tg , 2tg , paths
-a act @ align tbl 0pa , 1pa , 2pa , br
path i act ! paths dup @ swap 1 + @ wall port vport ! ; node
n 3 for i -1 + path paths targets @ + @ o ver or drop while next drop ; then pop drop dr op ; br
-hook i path targets @ 1 or drop if paths targ ets @ rips 1 targets ! then ; hook
i n swap -hook 2 begin over over paths + @ or drop while dup paths + @ 0 + drop -if dro p drop ; then 1 + end then dup targets ! paths swap wires drop ; br
?adj pop 1 + dup 4@ swap 4 + targets @ 1 or dr op if push drop ; then + push ;
|
these operations work on any target node. br
dorx port templates for remote target. br
r@ r! rins lit call are the specific names for the primitives using appropriate sequences for adjacent or remote target nodes. br
boot loads code into current remote node from binary image for node nd from addr a in both i mage and ram for n words.
|
|
130 list
target anywhere dor!
align create 12005 , 0 , 0 , dor@
align create 12000 , 0 , dori
align create 1200A , 0 , dorp
align create 1200D , 0 , dorst
align create 12010 , stak
align create 40 rez br
r@ a-n ?adj aa@ dor@ 1 + ! dor@ 2 fet 1 exch @ 18 ; r!
na ?adj aa! dor! 1 + ! dor! 2 + ! dor! 3 ok 1
exch ; call
a 10000 + rins
w ?adj ains dori 1 + ! dori 2 ok 1 exch ; lit'
n ?adj apsh dorp 1 + ! dorp 2 ok 1 exch ; aupd
astk @stk
@18 s stak 1 + ! @18 t stak ! stak 2 + 8 for @18 over ! 1 + next drop ; upd
?adj aupd dorst 1 stat 10 exch @stk ; lit
lit' upd ; boot
a n nd nn-n swap push 2* 32768 + block ov er + swap begin over @ 15555 or over r! 1 + 1 u+ next drop drop ;
|
single instruction words that may be executed by the target. these must end with return for s40 restriction compliance. br
the following won't work on s40 due to bug 1. r@p+
C rop ; psh
n r@p+ value rins ;
|
|
132 list
remote instructions compile
recompile ; focus
paths targets @ + dup @ swap -1 + @ wall port call ; virgin
paths targets @ + @ avail call ; br
rop n A or 13 for 2* next ;s 1555 + rins upd ; @+
9 rop ; -cr !+ D rop ; -cr !b E rop ; r+*
10 rop ; r2*
11 rop ; -cr r2/ 12 rop ; r-
13 rop ; -cr r+ 14 rop ; rand
15 rop ; -cr ror 16 rop ; rdrop
17 rop ; -cr rdup 18 rop ; rover
1A rop ; ra!
1F rop ; -cr ra@ 1B rop ; rb!
1E rop ; br
io D1 ; -cr data DF ; -cr up DD ; down
F5 ; -cr left C5 ; -cr right 95 ;
|
code for panel panel
134 list ; .s
silver cr cr stak 6 + 4 for dup @ 5 h.n spa ce 1 + next -5 + cr 6 for dup @ 5 h.n space -1 + next drop ;
?color
nn-nn over over or drop if silver ; the n green ; .pth
act @ cr 3 for cr i -1 + path act @ ?colo r . paths dup 1 + @ . targets @ dup . + @ . ne xt path ; br
/ram align create 64 a-b rez rsp
n dup 1 and drop if sp/2 then ; .ram
silver cr /ram 64 for i 7 and ?zero drop if cr space then i rsp dup @ 5 h.n i 1 and dro p if space then 1 + next drop ;
|
|
134 list
indicator panel 135 load node stack / upd .s b r
path, via, hops, tgt - green selected .pth br
mem dump / ?ram or ?rom .ram
|
this test routine tester loads and runs the co de compiled for node 6 on all other nodes exce pt the root, stopping if a node crashes or, po ssibly, other failure criteria are met br
one runs the test routine from node 6 compilat ion, entry point ent , on node n . aborts if w e cannot write and read back memory. all
tries the test starting with node n and go ing down to node zero, skipping node 19. br
watch displays live stack from current node. t his and other interactive functions can be ena bled in a running program by placing a definit ion like this in outer loop... poll
@b 200 and if up b! @b push ;' 15D b! the n drop ; br
!dac sets given output value in node i !dacs
sets given value in all dacs.
|
|
136 list
tester ent
0 ; n6tst
0 64 6 boot ent call 0 r@ dup 123 + dup 0 r! 0 r@ or if abort then drop 0 r! upd ; rot
n-n 3FFFF and 2* 40000 /mod + ; sto
n dup 63 for rot dup i r! -next drop cr
63 for rot i r@ over over or indent drop if i abort then drop -next drop ; pat
n 18 for dup sto rot next drop ; ramtst
0 sto 3FFFF sto 1 pat 3FFFE pat ; one
n 2 swap hook pause n6tst ramtst ; all
n nn-n for i me 0pa @ or drop if i n-nn on e then -next ; br
!dac n i 2 swap hook 155 or 15D io r! ; !dacs
n dup 36 !dac dup 37 !dac 11 !dac ; nn
n-n -1 + dup !dacs ; br
ms 100000 * for next ; watch
begin upd rdrop pause 1000 ms key? end ; ?ram
0 suck
a /ram 64 for over r@ over ! 1 + 1 u+ nex t drop drop ; ?rom
40 suck ;
|
the final step in loading the ide is to redefi ne the canonical forth words to operate on the target node. this is done as a separate step s o that you may define any sort of exerciser be fore losing access to host colorforth words.
|
|
138 list
canonical words @
a-n r@ ; !
na r! ; call lit upd rins boot !b already ok +*
r+* ; 2*
r2* ; 2/
r2/ ; -
r- ; +
r+ ; and
rand ; or
ror ; drop
rdrop ; dup
rdup ; over
rover ; a!
ra! ; a
ra@ ; b!
rb! ;
|
|
|
140 list
|
|
|
142 list
|
main load block for okad2 applications cur
cursor position first
execution of hardsim. initializes least- squares variables br
ray defines i-a array usage align ray aray
use after red to make ray of n cells uatbl
lists transistor table addresses of the devices so far found to be conducting current. ntbl
is number of active uatbl entries. nil
clears the table.
|
|
144 list
arrayforth tm and okad tools and designs cr
copyright 2009-2010 greenarrays, inc. cr
first -1 -1 first ! cr
cur 1202462 config 148 load br
.s ; defaults for blue words .pth
; .ram
; br
ray i-a pop 2/ 2/ + ; ntbl 0 0 ntbl ! aray
n align call ray 4 * h +! ; uatbl
i-a 1000 aray nil
0 ntbl ! ; br
png screen capture png cr
chip design 900 load
|
|
|
146 list
|
names for blocks that are customized to config ure tools while designing and testing. cfuse
two cylinders on cylinder boundary - 18 blocks plus shadows - actively loaded and used cftape
default image of config area under chan ge control in base br
exit terminates interpretation of a block. tbl
self fetching cell array. usage' squared
i-n align tbl 0 , 1 , 4 , 9 , 16 , assign
places addr of following code in the lo cation given and exits current definition. xqt
calls the code whose adr is in the var giv en.
|
|
148 list
configuration blocks orgn 0 0 orgn ! exit
7pop 7pop ; tbl
i-n pop 2/ 2/ + @ ; assign
a pop swap ! ; xqt
a @ push ; cfuse
648 ; active cfuse load cfchip
650 ; cfpins
652 ; cfstart
654 ; cfpads
656 ; cfprobe
658 ; cfsim
660 ; cfstep
662 ; cfscale
664 ; cftape
756 ; tapeout default readme
cfuse block nop cfuse 18 / 2 @cyls ; tapeout
cftape block nop cfuse block nop 36 25 6 * move ; recompile
940 load orgn @ load lis ;
|
load this block to redact an okad disk for pub lic release or extensive programming.
|
|
150 list
redact okad disk audit br
to arm this block, make cr
this word white... exit br
okad 146 148 obliterate 190 cfuse obliterate c fpins 890 obliterate cr
chip 902 940 obliterate 944 1248 obliterate br
type save to commit changes
|
|
|
152 list
|
|
|
154 list
|
|
|
156 list
big letters macro *byte
C80F 2, ; forth clr
aper 2 + ; sz 14 cur 8889344 14 sz ! ptab
xy 1024 * + aper @ 4 / + cur ! ; center
n sz @ -24 * 768 + 2/ ptab ; table
12 * 12 block + ; 1line
a sz @ for clr @ over ! 1 + next drop ; pix
a sz @ for dup 1line 1024 + next drop ; row
an-an 16 for dup and -if over pix then sz @ u+ 2* next 1024 sz @ * sz @ -16 * + u+ ; !emit
table cur @ 12 for over @ *byte row row drop 1 u+ next drop drop sz @ 18 * cur +! ; !digit
24 + !emit ; 2.
nn /mod !digit !digit ; 4.
n 100 /mod 10 2. 10 2. ;
|
|
|
158 list
big clock empty 40 load 156 load hm
sec 60 / sex
n 60 /mod 100 mod 10 2. 10 2. ; t0 32458 ?beep
if ; then beep ; till
t0 @ sec negate + green -if negate red th en ?beep sex ; set
n 60 * sec + t0 ! ok
show black screen blue 0 center hm till ; run
dup pause drop key? run ; ok run
|
check reads backup to 3000 and decompresses if appropriate blink
displays the given block with its other set as the editor's 'other' block var
compares a variable name, advancing pointe rs to skip its value. *1
compares garden variety words. *2
compares large literals. tag
compare compares the two source cells give n, returning true if they differ. ignores vari able differences. ?nul
ends the loop in co when nuls are found i n both blocks. co
given the addresses of the two blocks does the work of com. com
invokes editor to blink the given block if it differs from the other, leaving stack set t o continue the scan by typing q. otherwise ret urns. all
scans the whole usable area of the disk. q
scans for differences given starting block a nd number of source blocks skipping shadows. note!
return stk probably grows!
|
|
160 list
compare empty 30 load n18
i-a 3018 block + ; unpk
abs 1 n18 ! 3036 block 5000 block 1404 bl ks move 5000 block 3036 3 n18 @ -36 + range ; check
3000 @back 0 n18 @ 18 block @ or drop if ; then 1 n18 @ dup and -if unpk ; then drop ; blink
dup 3000 + blk ! edit ; var
push push 1 + 1 u+ pop pop *1
or ; *2
var push over @ over @ or pop + ; tag
nn-n dup F and jump *1 *1 *2 *1 *1 *2 *1 * 1 *1 *1 *1 *1 var *1 *1 *1 co
naa-n 256 for over @ over @ tag drop if dro p drop pop drop pop drop dup 2 u+ i pop swap b link ; then 1 + 1 u+ next drop drop ; com
n dup block over 3000 + block co ; q
nn for com 2 + next drop ; all
18 1439 -18 + 2/ q ; old
blk @ 3000 mod dup 3000 + blk ! copy ;
|
compare roms .
put t18 rom into blocks 1420ff see
n-n compare roms for node n u
up 16 words d
down 16 words n
next node b
back one node diff
compare up to 64 words, t18 binary vs g18 compile. total match gets green screen. first non-matching word causes a dump of that node. note the double pop drop in diff. don't run it as a command. check
run diff on all 40 nodes
|
|
162 list
compare roms compile empty x 887904 y 8913568 old
n-a 64 * 1420 block + ; new
n-a 2* 8000 + block 80 + ; spaces
for space next ; 5-8
8 /mod 32 /mod 32 /mod 100 * + 100 * + 100 * swap
4 * + ; it
@ + @ dup 5-8 white h. space dup 15555 or 5 silver h.n space ;
lines
for i x it i y it white or if red dup 5 h.n then drop space i 1 h.n cr -next ; u
16 +xy
dup x +! y +! ; d
-16 +xy ; n
1 + see
n-n dup old x ! dup new y ! show black scr een text 15 lines green x @ h. 7 spaces y @ h. keyboard ; b
-1 + see ; diff
n-n dup old over new 64 for over @ over @ or drop if drop drop pop drop pop drop see ; t hen 1 + 1 u+ next drop drop ; check
40 more
-1 + diff 0 or if more ; then drop show g reen screen keyboard ;
|
|
|
164 list
timing empty macro out
E1E6 2, ; forth tare
time - 1000 for next time + ; tare+
time - push 1000 for dup next c pop time + ; test
tare time + - 1000 for out next time + ; next 3 loop 5.7 /next 2 /swap 25 swap 7.2 macr o c!
C88B 2, drop here ; loop
49 1, 75 1, e2 here - + 1, ; forth try
time - 1000 c! loop time + ;
|
|
|
166 list
|
d is reduction factor
|
|
168 list
png empty w 1024 hh 768 d 1 frame
1D0000 aper @ 4 / ; 172 load 174 load -crc
a here over negate + crc .. ; here/4
-a here 3 and drop if 0 1, here/4 ; the n here 2 2/s ; bys
nn-b .. here swap , ; cr
pallettes 170 load br
!png awh-an d @ / hh ! d @ / w ! here/4 swap 4 74E5089 , A1A0A0D , ihdr 52444849 13 bys w @ . . hh @ .. 304 , 0 1, -crc plte pallette idat 5 4414449 0 bys swap deflate -crc iend 444E4549 0 bys -crc here/4 over negate + ; br
'at xy-a 1024 * + frame + ; full
1 d ! 0 dup 'at 1024 768 !png ; png
full wgds ;
|
|
|
170 list
pallettes paper
45544C50 48 bys cr
FFFFFF 3, C00000 3, C000 3, C0C000 3, cr
C0 3, C000C0 3, C0C0 3, 404040 3, cr
C0C0C0 3, FF0000 3, FF00 3, FFFF00 3, cr
FF 3, FF00FF 3, FFFF 3, 0 3, -crc ; br
crt 45544C50 48 bys cr
0 3, C00000 3, C000 3, C0C000 3, cr
C0 3, C000C0 3, C0C0 3, 404040 3, cr
C0C0C0 3, FF0000 3, FF00 3, FFFF00 3, cr
FF 3, FF00FF 3, FFFF 3, FFFFFF 3, -crc ; br
pallette paper crt ;
|
2/s shift right by literal 1@
fetch byte, address in eax array
return word address in dictionary bit
process 1 bit with standard 32-bit crc fill
construct crc table for bytes table
said table crc
compute crc for a byte string ad1/ad2
adler checksums +adl
add a byte to both checksums adl!
store checksums +mod
truncate checksums
|
|
172 list
crc ad1 23534 ad2 64494 macro br
2/s ?lit E8C1 2, 1, ; -cr 1@ 8A 2, ; forth bit
n-n 1 ? if 1 2/s EDB88320 or ; indent then 1 2/s ; ,crc
nn for dup 8 for bit next , indent 1 + next drop ; table
-a align array 0 256 ,crc crc
bn-n -1 swap for over 1@ over or FF and ta ble swap 8 2/s or 1 u+ next - nip ; br
+adl n FF and ad1 @ + dup ad2 @ + adl!
ad2 ! ad1 ! ; +mod
ad1 @ 65521 mod ad2 @ 65521 mod adl! ;
|
0/1 0, f or 7 for dark, bright or dim
|
|
174 list
lz77 macro -cr *byte C486 2, ; !bx
a! 289 2, drop ; forth br
*bys dup 16 2/s *byte swap FFFF and *byte 1000 0 * + ; -cr .. *bys , ; 0/1
80 ? if 7E and 7E or drop if 7 ; then F ; then 0 and ; -cr +or over - and or ; 4b
dup 0/1 9 and over 8 2/s 0/1 A and +or swap 16
2/s 0/1 C and +or ; pix
dup @ d @ u+ 4b ; row
1, dup w @ 2/ dup 1 + dup 2, - 2, 0 dup 1, +adl for pix 16 * push pix pop or dup 1, +adl next drop +mod d @ 1024 * + ; br
deflate 178 2, 1 0 adl! hh @ -1 + for 0 row ne xt 1 row drop ad2 @ *byte 2, ad1 @ *byte 2, he re over 4 + negate + *bys over -4 + !bx ;
|
colorforth to html utility br
the html is created between pad and hld cr
by .html and its factors .hdr .blks and .tlr , then written to the file last named . br
uncomment estyle in .hdr to use an external cr
stylesheet, maybe for printing. br
pairs of blocks are formatted 2-up using html tables, with the odd/even blocks used to invok e .html or .blks displayed on the right. 'n li st' is shown above the even block. br
176 188 .html puts shadows on left, while cr
177 189 .html puts them on the right. br
seeb toggles blue-word visibility. br
the last line of each block is filled cr
with nbsp for column alignment. the class @ cr
line closes the code tag of an empty block.
|
|
176 list
cf-html empty 74 load cr
pad 271638528 3000 block 4 * pad ! cr
hld 271924577 pad @ hld ! 178 6 loads estyle
,link ,t1cr cfhtml.css '? ; .hdr
pad @ hld ! ,t1cr @html? @head? istyle cr
estyle ,t1cr @/head? @body? @table? ; .blk
n 0 pos ! crlf ,t1 @td? cr
dup even? if dup .dec ,t1cr *list then cr
.cr block ,t1 @code 0 class ! 0 --cr ! cr
begin @+ dup and while .token end then cr
class @ eq? if ,t1 ? then drop drop cr
begin -eol? while .nb end then .cr cr
,t1 @/code? .cr ,t1cr @/td? ; .sep
,t1 @td? .nb .nb ,t1 @/td? ; .blks
first last+2 over negate + 2/ for cr
,t1 @tr? dup 1 or .blk .sep dup .blk cr
,t1cr @/tr? 2 + next drop ; .tlr
,t1cr @/table? @/body? @/html? sav ; .html
first last+2 .hdr .blks .tlr ; cr
named cf.html
|
eq? -cr nz? -cr diff? -cr even? leave only flags cr
@+ -cr @tag are common factors br
the following words generate ascii text only f or html tags and source formatting; it will no t be visible in the html display. br
sc -cr ch, -cr lb -cr rb -cr crlf punctuat ion output br
the macros enable in-line output from the cr
standard cf-ascii table using set0 default or the extended table using set1 br
,token output ascii characters for one token ,word
output a token and any extension tokens ,comments
output contiguous comment words br
,t output from current set, don't change set. ,trb
,t output followed by rb ,t1
output from set1 , return to set0 at end ,t1cr
,t1 output followed by crlf
|
|
178 list
generate html details cr
eq? nn-n over or if drop -1 then - nz? ; nz?
n dup and drop ; even?
n 1 or 1 and drop ; br
@+ a-an dup 1 + swap @ ; @tag
a-at dup @ F and ; br
sc 3B semicolon ch,
c hld @ 1! 1 hld +! ; lb
7B left-brace ch, ; rb
sc 7D right-brace ch, crlf
13 ch, 10 ch, ; br
,token n ch if ch, ,token ; then drop drop ; ,word
a-a begin @+ ,token @tag drop until ; cr
loop begin ,word ,comments
a @tag 9 or drop until drop ; macro cr
,t words 7push pop ,lit call ,comments nop ; ,trb
words ,t call rb nop ; ,t1
words call set1 ,t call set0 nop ; ,t1cr
words ,t1 call crlf nop forth
|
pos 0 character display pos ition in line -bol?
-cr -eol? test position .cr
visible crlf emit
visible character .ch
-cr .sp -cr .2sp -cr .nb quirky charact eristics cr
note .sp does nothing at left margin cr
note .ch does .cr after 46th character cr
note .2sp takes only one space at left margin cr
note .nb takes only one character position. br
.tn -cr .sp.tn display a token. br
.hd -cr hd -cr spit are number-output factor s .dec
-cr .hex -cr .3hex display numbers
|
|
180 list
translate text and numbers pos 30 -bol?
pos @ nz? ; -eol?
pos @ 46 or drop ; .cr
,t1 @br? 0 pos ! ; cr
loop begin .cr -cr emit c ch, 1 pos +! ; .ch
c -eol? until emit ; .sp
-eol? if -bol? if 20 emit ; then then ; .2sp
.sp .nb ; .nb
26 ampersand .ch ,t nbsp sc ; br
.sp.tn n .sp .tn ; .tn
n ch if .ch .tn ; then drop drop ; br
.hd n -10 + -if 3A + .ch ; then 41 + .ch ; .dec
n .sp 0 + -if 2D .ch negate then -1 swap begin 10 /mod dup and while end then drop spit
-1 ... begin .hd 0 + -until drop ; br
hd n-nn dup F and swap 2/ 2/ 2/ 2/ ; .hex
n .sp -1 swap begin hd FFFFFFF and while end then drop spit ; .3hex
n hd hd hd drop .sp .hd .hd .hd ;
|
class 0 current class cr
--cr 0 true suppresses cr before next red word cr
,class -cr ,c class defining words, cf style br
.quirks handle the spacing before red words br
.space blue spaces are ignored at eol! .indent
4 + html leading space br
.blue generate most of the blue-word effects
|
|
182 list
translate cf token details cr
class -1054867447 --cr 0 ,class
a @ class @ over or drop diff? if cr
class @ nz? if ,t1 @/code? @code then cr
,t1 *class+ dup class ! ,token ,t1 ? ; cr
then drop ; macro ,c
7push pop ,lit call ,class nop ; forth br
.quirks n --cr @ nz? if .2sp drop 0 --cr ! ; c r
then class nz? if -bol? if .cr then then ; .space
-eol? if .nb then ; .indent
.cr 4 for .nb next ; br
.blue n 9080000E cr eq? if .cr drop ; cr
then E721000E -cr eq? if 1 --cr ! drop ; cr
then 8625920E space eq? if .space drop ; cr
then 76C08C4E indent eq? if .indent drop ; cr
then C620000E br eq? if .cr .cr then drop ;
|
sh? extract short number, true flag if hex lh?
extract long number, true flag if hex br
tag ------- cf class ------- html class cr
.t0 extension token ........ same as last .t1
execute word ........... t1 .t2
execute long number .... h2, d2 .t3
define word ........... -cr t3 .t4 compile word ........... t4 .t5
compile long number .... h5, d5 .t6
compile short number ... h6, d6 .t7
compile macro .......... t7 .t8
execute short number ... h8, d8 .t9
lowercase text comment . t9 .ta
capitalized text comment ta deprecated .tb
uppercase text comment . tb deprecated .tc
variable ............... tc 0 dc .td
target address ......... hd .te
editor command ......... te .tf
short number comment ... hf, df br
.token translate tag-by-tag indent note address may be incremented
|
|
184 list
translate cf tokens sh?
n-n 2/ 2/ 2/ 2/ dup 2/ swap 1 and drop ; lh?
an-an push @+ pop 10 and drop ; br
.t1 n ,c t1 .sp.tn ; .t2
an-a lh? if ,c h2 .hex ; then ,c d2 .dec ; .t3
n class @ ,c t3 .quirks .sp.tn .tn ; .t4
n ,c t4 .sp.tn ; .t5
an-a lh? if ,c h5 .hex ; then ,c d5 .dec ; .t6
n sh? if ,c h6 .hex ; then ,c d6 .dec ; .t7
n ,c t7 .sp.tn ; .t8
n sh? if ,c h8 .hex ; then ,c d8 .dec ; .t9
n ,c t9 .sp.tn ; .ta
n ,c ta .sp.tn ; .tb
n ,c tb .sp.tn ; .tc
an-a ,c tc .sp.tn ,c dc @+ .dec ; .td
n sh? ,c hd .3hex ; .te
n ,c te ?seeb if dup .sp.tn then .blue ; .tf
n sh? if ,c hf .hex ; then ,c df .dec ; br
.token an-a dup F and jump cr
.tn .t1 .t2 .t3 .t4 .t5 .t6 .t7 cr
.t8 .t9 .ta .tb .tc .td .te .tf
|
vat -cr bcw -cr wsn -cr fo -cr ffm -cr fw b -cr fz -cr fc -cr fsi -cr tt cr
space-saving factors of internal stylesheet br
,link most of the external stylesheet link br
fopen -cr sav open, write, close html file cr
note byte addresses throughout
|
|
186 list
stylesheet details and file output vat
,t *vertical-align; top sc ; bcw
crlf ,t *background-color; white sc ; wsn
crlf ,t *white-space; nowrap sc ; fo
,t *font- ; ffm
crlf fo indent ,t family; lucida*console,monospace sc ; fwb
crlf fo ,t weight; bold sc ; fz
fo ,t size; ; fc
lb ,t *color; 23 sharp ch, ; fsi
sc fo ,t style; italic rb ; tt
sc ,t *text-transform; ; br
,link ,t1 @link *rel+stylesheet indent ,t1 *type+'text/css' *href+' ; br
fopen af-h push push 0 32 exist 2 0 0 indent pop pop swap fcreate ; sav
0 fnam w/o fopen dup push indent pad @ dup negate hld @ + pop indent fwr drop fclose ;
|
istyle internal styles are aimed toward cr
providing code examples for stand-alone use in other documents. although it's black-on-white, it faithfully displays the colorforth screen. br
some cf-html rendering tests br
load 2147483647 80000000 t1
; 2147483646 80000001 87 57 ?lit 87 57 rtoe ani rtos ascii var 123 cr -cr quirky 005 indent 87 57 -87 end 0 0 0
|
|
188 list
internal stylesheet istyle
,t1cr @style*type+'text/css'? set1 cr
,t td lb vat bcw wsn ffm fwb fz ,trb x-large , t code lb fz ,t large tt ,trb lowercase cr
,t .t1 fc ,trb ddaa00 cr
,t .h2 fc ,t aa7700 fsi cr
,t .d2 fc ,trb ddaa00 cr
,t .t3 fc ,trb ff0000 cr
,t .t4 fc ,trb 00cc00 cr
,t .h5 fc ,t 009900 fsi cr
,t .d5 fc ,trb 00cc00 cr
,t .h6 fc ,t 009900 fsi cr
,t .d6 fc ,trb 00cc00 cr
,t .t7 fc ,trb 00cccc cr
,t .h8 fc ,t aa7700 fsi cr
,t .d8 fc ,trb ddaa00 cr
,t .t9 fc ,trb 444444 cr
,t .ta fc ,t 000000 tt ,trb capitalize cr
,t .tb fc ,t 000000 tt ,trb uppercase cr
,t .tc fc ,trb ff00ff cr
,t .dc fc ,trb 00ff00 cr
,t .hd fc ,t bbbbbb fsi cr
,t .te fc ,trb 0000ff cr
,t .hf fc ,t 777777 fsi cr
,t .df fc ,trb 444444 ,t1cr @/style? ;
|
|
|
190 list
|
|
|
192 list
|
|
|
194 list
|
|
|
196 list
|
|
|
198 list
|
|
|
200 list
|
|
|
202 list
|
|
|
204 list
|
|
|
206 list
|
|
|
208 list
|
|
|
210 list
|
|
|
212 list
|
|
|
214 list
|
|
|
216 list
|
|
|
218 list
|
|
|
220 list
|
|
|
222 list
|
|
|
224 list
|
|
|
226 list
|
|
|
228 list
|
|
|
230 list
|
|
|
232 list
|
|
|
234 list
|
|
|
236 list
|
|
|
238 list
|
|
|
240 list
|
|
|
242 list
|
|
|
244 list
|
|
|
246 list
|
|
|
248 list
|
|
|
250 list
|
|
|
252 list
|
|
|
254 list
|
|
|
256 list
|
|
|
258 list
|
|
|
260 list
|
|
|
262 list
|
|
|
264 list
|
|
|
266 list
|
|
|
268 list
|
|
|
270 list
|
|
|
272 list
|
|
|
274 list
|
|
|
276 list
|
|
|
278 list
|
|
|
280 list
|
|
|
282 list
|
|
|
284 list
|
|
|
286 list
|
|
|
288 list
|
|
|
290 list
|
|
|
292 list
|
|
|
294 list
|
|
|
296 list
|
|
|
298 list
|
|
|
300 list
|
|
|
302 list
|
|
|
304 list
|
|
|
306 list
|
|
|
308 list
|
|
|
310 list
|
|
|
312 list
|
|
|
314 list
|
|
|
316 list
|
|
|
318 list
|
|
|
320 list
|
|
|
322 list
|
|
|
324 list
|
|
|
326 list
|
|
|
328 list
|
|
|
330 list
|
|
|
332 list
|
|
|
334 list
|
|
|
336 list
|
|
|
338 list
|
|
|
340 list
|
|
|
342 list
|
|
|
344 list
|
|
|
346 list
|
|
|
348 list
|
|
|
350 list
|
|
|
352 list
|
|
|
354 list
|
|
|
356 list
|
|
|
358 list
|
|
|
360 list
|
|
|
362 list
|
|
|
364 list
|
|
|
366 list
|
|
|
368 list
|
|
|
370 list
|
|
|
372 list
|
|
|
374 list
|
|
|
376 list
|
|
|
378 list
|
|
|
380 list
|
|
|
382 list
|
|
|
384 list
|
|
|
386 list
|
|
|
388 list
|
|
|
390 list
|
|
|
392 list
|
|
|
394 list
|
|
|
396 list
|
|
|
398 list
|
|
|
400 list
|
|
|
402 list
|
|
|
404 list
|
|
|
406 list
|
|
|
408 list
|
|
|
410 list
|
|
|
412 list
|
|
|
414 list
|
|
|
416 list
|
|
|
418 list
|
|
|
420 list
|
|
|
422 list
|
|
|
424 list
|
|
|
426 list
|
|
|
428 list
|
|
|
430 list
|
|
|
432 list
|
|
|
434 list
|
|
|
436 list
|
|
|
438 list
|
|
|
440 list
|
|
|
442 list
|
|
|
444 list
|
|
|
446 list
|
|
|
448 list
|
|
|
450 list
|
|
|
452 list
|
|
|
454 list
|
|
|
456 list
|
|
|
458 list
|
|
|
460 list
|
|
|
462 list
|
|
|
464 list
|
|
|
466 list
|
|
|
468 list
|
|
|
470 list
|
|
|
472 list
|
|
|
474 list
|
|
|
476 list
|
|
|
478 list
|
|
|
480 list
|
|
|
482 list
|
|
|
484 list
|
|
|
486 list
|
|
|
488 list
|
|
|
490 list
|
|
|
492 list
|
|
|
494 list
|
|
|
496 list
|
|
|
498 list
|
|
|
500 list
|
|
|
502 list
|
|
|
504 list
|
|
|
506 list
|
|
|
508 list
|
|
|
510 list
|
|
|
512 list
|
|
|
514 list
|
|
|
516 list
|
|
|
518 list
|
|
|
520 list
|
|
|
522 list
|
|
|
524 list
|
|
|
526 list
|
|
|
528 list
|
|
|
530 list
|
|
|
532 list
|
|
|
534 list
|
|
|
536 list
|
|
|
538 list
|
|
|
540 list
|
|
|
542 list
|
|
|
544 list
|
|
|
546 list
|
|
|
548 list
|
|
|
550 list
|
|
|
552 list
|
|
|
554 list
|
|
|
556 list
|
|
|
558 list
|
|
|
560 list
|
|
|
562 list
|
|
|
564 list
|
|
|
566 list
|
|
|
568 list
|
|
|
570 list
|
|
|
572 list
|
|
|
574 list
|
|
|
576 list
|
|
|
578 list
|
|
|
580 list
|
|
|
582 list
|
|
|
584 list
|
|
|
586 list
|
|
|
588 list
|
|
|
590 list
|
|
|
592 list
|
|
|
594 list
|
|
|
596 list
|
|
|
598 list
|
|
|
600 list
|
|
|
602 list
|
|
|
604 list
|
|
|
606 list
|
|
|
608 list
|
|
|
610 list
|
|
|
612 list
|
|
|
614 list
|
|
|
616 list
|
|
|
618 list
|
|
|
620 list
|
|
|
622 list
|
|
|
624 list
|
|
|
626 list
|
|
|
628 list
|
|
|
630 list
|
|
|
632 list
|
|
|
634 list
|
|
|
636 list
|
|
|
638 list
|
|
|
640 list
|
|
|
642 list
|
|
|
644 list
|
|
|
646 list
|
these parameters are globally resident and sho uld not be overloaded. use warm after changing any but variables marked hot. sim
is 0 for full hi lvl integrator, 1 for fas ter hand coded, 2 for fastest partial sim, 3 n o sim for tare. fov
abstract display scale ps/
picosec per display step in hardsim dh
holds drive handle we are responsible for. testb
nonzero to enable testbeds. compile
compiles rom for layout and ram for op tional initialization via pram in hardsim. simrec
defined here as nop in case not loaded logger
compiles log file generator in windows systems -tape
the yellow literal must be 0 for tapeout , 1 for testing. saying
qwerty at the end of the block enables the qwerty keyboard mode till next boot. enabl e seeb to see blue words by default.
|
|
648 list
active config global fov 1024 cuco 10 testb 0 dh 0 0 dh ! br
sim 1 ; ps/
4 ; compile
940 load ; tether
-cr te 944 load ; simrec
; default nop logger
winver drop if 554 3 loads then ; -tape
1 1 and ; qwerty seeb
|
define chip to lay out, loaded from 998 3..0row
lay out all the nodes. comment those y ou do not wish to work with; make active nodes green. make sure cuco numbers a valid node tha t you are laying out before doing extract chip
top-level gds cell chip0
octagon before global - well before wc warnings
nodes 3 or 5 require 4.
|
|
650 list
cfchip - chip definition 1row
10nd 11nd ; 0row
00nd 01nd ; cuco node must be green! chip0
power octagon global 0row 1row ; logo
poly cpr m1 cpr m2 cpr m3 cpr m4 cpr ; chip
seal origin v chip0 70 gy -70 + v logo ;
|
|
|
652 list
|
|
|
654 list
|
|
|
656 list
|
|
|
658 list
|
|
|
660 list
|
|
|
662 list
|
|
|
664 list
|
|
|
666 list
|
|
|
668 list
|
|
|
670 list
|
|
|
672 list
|
|
|
674 list
|
|
|
676 list
|
|
|
678 list
|
|
|
680 list
|
|
|
682 list
|
|
|
684 list
|
|
|
686 list
|
|
|
688 list
|
|
|
690 list
|
|
|
692 list
|
|
|
694 list
|
|
|
696 list
|
|
|
698 list
|
|
|
700 list
|
|
|
702 list
|
|
|
704 list
|
|
|
706 list
|
|
|
708 list
|
|
|
710 list
|
|
|
712 list
|
|
|
714 list
|
|
|
716 list
|
|
|
718 list
|
|
|
720 list
|
|
|
722 list
|
|
|
724 list
|
|
|
726 list
|
|
|
728 list
|
|
|
730 list
|
|
|
732 list
|
|
|
734 list
|
|
|
736 list
|
|
|
738 list
|
|
|
740 list
|
|
|
742 list
|
|
|
744 list
|
|
|
746 list
|
|
|
748 list
|
|
|
750 list
|
|
|
752 list
|
|
|
754 list
|
|
|
756 list
|
|
|
758 list
|
|
|
760 list
|
|
|
762 list
|
|
|
764 list
|
|
|
766 list
|
|
|
768 list
|
|
|
770 list
|
|
|
772 list
|
|
|
774 list
|
|
|
776 list
|
|
|
778 list
|
|
|
780 list
|
|
|
782 list
|
|
|
784 list
|
|
|
786 list
|
|
|
788 list
|
|
|
790 list
|
|
|
792 list
|
|
|
794 list
|
|
|
796 list
|
|
|
798 list
|
|
|
800 list
|
|
|
802 list
|
|
|
804 list
|
|
|
806 list
|
|
|
808 list
|
|
|
810 list
|
|
|
812 list
|
|
|
814 list
|
|
|
816 list
|
|
|
818 list
|
|
|
820 list
|
|
|
822 list
|
|
|
824 list
|
|
|
826 list
|
|
|
828 list
|
|
|
830 list
|
|
|
832 list
|
|
|
834 list
|
|
|
836 list
|
|
|
838 list
|
|
|
840 list
|
|
|
842 list
|
|
|
844 list
|
|
|
846 list
|
|
|
848 list
|
|
|
850 list
|
|
|
852 list
|
|
|
854 list
|
|
|
856 list
|
|
|
858 list
|
|
|
860 list
|
|
|
862 list
|
|
|
864 list
|
|
|
866 list
|
|
|
868 list
|
|
|
870 list
|
|
|
872 list
|
|
|
874 list
|
|
|
876 list
|
|
|
878 list
|
|
|
880 list
|
|
|
882 list
|
|
|
884 list
|
|
|
886 list
|
|
|
888 list
|
gdsnos block for gds layer numbers nnx
and nny number of nodes/row and /column nnc
number of nodes compiled nn-n
and n-nn convert yx notation to and from linear node numbers br
dieorg origin of 'die' i.e. pad ring within se al ring. c coords rel to seal; g rel to 'die' br
gx and gy bounds of pad ring. always remember to check global reset wiring when size or plac ement of node array or pad ring are changed! cx
and cy bounds of seal ring. -cx
negative tiles/row
|
|
890 list
ga4 chrt .18 design specific gdsnos
440 ; -cr origin 23 26 ; nnx
2 ; -cr nny 2 ; -cr nns nnx nny * ; nnc
nns nns 36 + ; nn-n
n-n 10 /mod nnx * + ; n-nn
n-n nnx /mod 10 * + ; br
cr cr cr cr cr cr cr
gx 1074 1034 39 + ; gy
1820 1646 ; br
cr
cx gx 9 + ; cy
gy 55 + ; -cx
cx negate ; -cr cx*y cx cy * ; br
|
port returns port for 0-3 rdlu then edges idle
is idle p value for given node. rstadr
and rstdef number values and white name s of p straps rom, corn, side, top/bot, mid. ?rst
returns index of valid reset or aborts.
|
|
892 list
ga4 pads, ports and resets br
port i-pa align tbl 95 , F5 , C5 , DD , B5 , B D , A5 , AD , idle
n-p nnx /mod nny -1 + mod 1 min 4 + swap nnx -1 + mod 1 min 2* + port ; rstadr
align tbl 6A , B5 , BD , A5 , AD , rstdef
strings p06a p09f xxx xxx xxx ?rst
pa-i 4 for dup i rstadr or while drop -ne xt abort then drop drop pop ;
|
laid nz if node laid out resets
index of reset address kinds
kind for testbeds +roms
and @rom are here only as temporary klud ges. we will eventually load a table from the node defns for default kind and prom source. +roms
array indexed by linear node number retu rning code number for rom load block. iz
sets node nn to use rom load block n codes- 0-arith 2-serdes 4-syncboot 6-async 10-spi 14- analog 18-1wire @rom
returns block number for production rom c ode applicable to the given node. ?serbed
0-none 1-async 2-sync 3-1wire 4-spi 5- strap 6-serdes 7-servers for cuco if testb nz.
|
|
894 list
ga4 node types br
laid nns aray -cr resets nns aray kinds
nns aray br
0's n for 0 , next ; +roms
-ia align ray nns 0's iz
nn i swap nn-n +roms ! ; indent async 0 6 iz spi 1 10 iz indent 1wire 10 18 iz analog 11 14 iz @rom
nn-n nn-n +roms @ 1418 + ; br
bedtab -serbed cuco @ nn-n kinds @ ; ?serbed
testb @ 0 or drop if bedtab ; then 0 ; to test 1wire on 00nd use 0
18 iz not 0 6 iz
|
|
|
896 list
|
|
|
898 list
|
design load block for okad2 applications ex extract
netlist for simulation and go into flat
view of layout - keys . ....
ludr big left up down right .432
ludr toggle metal 2-4 , move ludr ....
+g1- zoom in, toggle gates, toggle metal1 , zoom out .
exit flat view or simulator with space e spa ce to enter block editor and get new key menu on bottum right ha hardsim
virtual scope g n go till number h go till key b go 1000 counts , exit with e gds
consruct gds file image and display @gds
view file records ?gds lite
brighten the net pointed to - metal-1 lit
brighten an additional net
|
|
900 list
okad tools compile is in cfuse softsim
-cr so 942 load ; tile
910 load ; layout tiles 146 load place
-cr pl tile layout and display flat
-cr fl 912 load ; 2d display cover
914 load ; gds
916 load ; construct gds file @gds
918 load ; display gds ?gds
920 load ; examine gds extract
-cr ex 922 load ; build tables hardsim
-cr ha 924 load ; integrate i and v hilo
926 load ; mark nets above vdd/2 lite
928 load ; lit
908 load ; pram
934 load ; calc
930 load ; tsmc calculation app prism
932 load ; tsmc spectrum 890 3 loads des ign specific mark empty
|
|
|
902 list
|
|
|
904 list
|
|
|
906 list
|
|
|
908 list
|
|
|
910 list
|
|
|
912 list
|
|
|
914 list
|
|
|
916 list
|
|
|
918 list
|
|
|
920 list
|
|
|
922 list
|
|
|
924 list
|
|
|
926 list
|
|
|
928 list
|
|
|
930 list
|
|
|
932 list
|
|
|
934 list
|
|
|
936 list
|
|
|
938 list
|
compiles all relevant g18 code. br
laid is cleared for setting as nodes laid out resets
is set to default multiport executes fo r all nodes and may be overridden in source co de using reset kinds
is set to default testbed none and may b e overridden with kind to 0-none 1-async 2-syn c 3-1wire 4-spi 5-strap 6-serdes 7-servers program
compile code for multicomputers. alway s compiles standard rom; if not tapeout, the l oad block at 1300 defines test environment whi ch may be in rom, ram, or both. br
node starts random compilation for node nn by compiling node nn's rom bin
saves the binary just generated in the bin for node nn, which must be outside chip 0 0 .
|
|
940 list
g18 compiler empty c cr
0 0 laid nns fill 0 0 kinds nns fill br
1400 load br
reset a ?rst com @ resets ! ; kind
n com @ kinds ! ; node
nn nn-n nns mod dup com ! cr
n-nn @rom load ; bin
nn 0 memory swap nn-n com ! 0 memory 512 m ove ; br
program 1380 load nns -1 + for i com ! cr
i idle reset i n-nn @rom load -next cr
-tape drop if 1300 load then ; br
1402 6 loads target program empty
|
|
|
942 list
g18 simulator compile empty cr
1272 11 loads cr
1256 2 loads testbed testbed
spi asynch ; cr
1260 2 loads port handshake cr
1266 2 loads memory instructions cr
1270 load show pins cr
1294 3 loads display keyboard init cr cr
reset cr
0 1 right link 10 11 right link cr
0 10 down link 1 11 down link cr
/asynch cr
0 0 boots smtm cr
6A 0 boots asynch cr
6A 1 boots spi cr
ok h
|
|
|
944 list
|
|
|
946 list
|
|
|
948 list
|
|
|
950 list
|
|
|
952 list
|
|
|
954 list
|
|
|
956 list
|
|
|
958 list
|
|
|
960 list
|
|
|
962 list
|
|
|
964 list
|
|
|
966 list
|
|
|
968 list
|
|
|
970 list
|
|
|
972 list
|
|
|
974 list
|
|
|
976 list
|
|
|
978 list
|
|
|
980 list
|
|
|
982 list
|
|
|
984 list
|
|
|
986 list
|
|
|
988 list
|
|
|
990 list
|
|
|
992 list
|
|
|
994 list
|
|
|
996 list
|
|
|
998 list
|
|
|
1000 list
|
|
|
1002 list
|
|
|
1004 list
|
|
|
1006 list
|
|
|
1008 list
|
|
|
1010 list
|
|
|
1012 list
|
|
|
1014 list
|
|
|
1016 list
|
|
|
1018 list
|
|
|
1020 list
|
|
|
1022 list
|
|
|
1024 list
|
|
|
1026 list
|
|
|
1028 list
|
|
|
1030 list
|
|
|
1032 list
|
|
|
1034 list
|
|
|
1036 list
|
|
|
1038 list
|
|
|
1040 list
|
|
|
1042 list
|
|
|
1044 list
|
|
|
1046 list
|
|
|
1048 list
|
|
|
1050 list
|
|
|
1052 list
|
|
|
1054 list
|
|
|
1056 list
|
|
|
1058 list
|
|
|
1060 list
|
|
|
1062 list
|
|
|
1064 list
|
|
|
1066 list
|
|
|
1068 list
|
|
|
1070 list
|
|
|
1072 list
|
|
|
1074 list
|
|
|
1076 list
|
|
|
1078 list
|
|
|
1080 list
|
|
|
1082 list
|
|
|
1084 list
|
|
|
1086 list
|
|
|
1088 list
|
|
|
1090 list
|
|
|
1092 list
|
|
|
1094 list
|
|
|
1096 list
|
|
|
1098 list
|
|
|
1100 list
|
|
|
1102 list
|
|
|
1104 list
|
|
|
1106 list
|
|
|
1108 list
|
|
|
1110 list
|
|
|
1112 list
|
|
|
1114 list
|
|
|
1116 list
|
|
|
1118 list
|
|
|
1120 list
|
|
|
1122 list
|
|
|
1124 list
|
|
|
1126 list
|
|
|
1128 list
|
|
|
1130 list
|
|
|
1132 list
|
|
|
1134 list
|
|
|
1136 list
|
|
|
1138 list
|
|
|
1140 list
|
|
|
1142 list
|
|
|
1144 list
|
|
|
1146 list
|
|
|
1148 list
|
|
|
1150 list
|
|
|
1152 list
|
|
|
1154 list
|
|
|
1156 list
|
|
|
1158 list
|
|
|
1160 list
|
|
|
1162 list
|
|
|
1164 list
|
|
|
1166 list
|
|
|
1168 list
|
|
|
1170 list
|
|
|
1172 list
|
|
|
1174 list
|
|
|
1176 list
|
|
|
1178 list
|
|
|
1180 list
|
|
|
1182 list
|
|
|
1184 list
|
|
|
1186 list
|
|
|
1188 list
|
|
|
1190 list
|
|
|
1192 list
|
|
|
1194 list
|
|
|
1196 list
|
|
|
1198 list
|
|
|
1200 list
|
|
|
1202 list
|
|
|
1204 list
|
|
|
1206 list
|
|
|
1208 list
|
|
|
1210 list
|
|
|
1212 list
|
|
|
1214 list
|
|
|
1216 list
|
|
|
1218 list
|
|
|
1220 list
|
|
|
1222 list
|
|
|
1224 list
|
|
|
1226 list
|
|
|
1228 list
|
|
|
1230 list
|
|
|
1232 list
|
|
|
1234 list
|
|
|
1236 list
|
|
|
1238 list
|
|
|
1240 list
|
|
|
1242 list
|
|
|
1244 list
|
|
|
1246 list
|
|
|
1248 list
smtm test 32 org go
a! 1557F !b 1556A !b . pop @p+ indent ' @p+ dup 2/ . ' a ! ! 43 for indent 3F !+ . unext indent ' 2* a! push . ' ' begin @p+ !+ . unext ' indent
' @p+ push ; ' ! warm ; cr
12 org r
@p+ go ; r--- d
@p+ go ; -d-- l
@p+ go ; --l- u
@p+ go ; ---u cr
0 org path
r d path ;
|
|
|
1250 list
|
1252 load makes an html listing of cr
the softsim application
|
|
1252 list
html named ga4softsim.html .hdr cr
1252 1254 .blks this print screen cr
942 944 .blks load block cr
1272 1294 .blks cr
1256 1260 .blks testbed cr
1260 1268 .blks memory instructions cr
1270 1272 .blks show pins cr
1250 1252 .blks debug window cr
1294 1300 .blks screen/kbd initialization cr
.tlr
|
|
|
1254 list
|
spi testbed clk
state of clock pin last time spbit
'bit' address of incoming data cr
note stream code is at node nns btcnt
count output bits at beginning ?bit
count down to zero but no further cr
and pop out of calling word until zero reached bitn
change 'bit' address to word address and bit count ... increment bit address ... cr
@ from word address leaving bit count on top bit17
shift current bit into almost bit 17 and io!
insert bit into ios spi
execute during each step for spi testbed
|
|
1256 list
spi serial testbed cr
clk 0 spbit 1359581274 btcnt 0 33 btcnt ! cr
nns com ! 0 me 18 * spbit ! 0 clk ! cr
?bit btcnt @ -1 + 0 max dup btcnt ! indent dup and drop if pop drop ; then ; bitn
n-nn dup @ swap over 1 + swap ! indent 18 /mod @n swap ; bit17
spbit bitn for 2* -next io!
n 2/ 20000 and ios @n indent 1FFFF and or ios !n ; spi
1 nn-n nop com ! clk @ ioc @ indent 1 and dup clk ! or drop indent if clk @ dup and drop if ; then indent ?bit bit17 then ;
|
async serial testbed table
help to lt00
create a left port for node 0 /asynch
init left dest register for 0 ?wake
wake on pin and execute @b ; sta
rt bit sto
p bit cr
sbit stream pointer node 0 cr
ss stream counter cr
baud bit timer timing
six bit preamble data
lsb first dat
time for data, not start or stop bit17
insert next bit into io register asynch
execute during each step for testbed
|
|
1258 list
async serial testbed lst17 131072 0 lst17 ! asport
0 nn-n nop com ! left pt ! ; table
pop 2/ 2/ ; lt00
align table 0 , cr
0 nn-n com ! left pt ! pend , /asynch
asport lt00 dest ! ; ?wake
ios @ 20000 and lst17 @ over or drop if indent 14000 @b ; wrq or asport dest @ ! then in dent lst17 ! ; sta
40000 io! ; -cr sto 0 io! ; cr
sbit 1359581309 ss 207 baud 832200 cr
200 baud ! -1 ss ! nns com ! 0 me 18 * sbit ! timing
2D000 ss @ 30 mod for 2* next io! ; cr
data sbit bitn -18 + - for 2* -next io! ; dat
ss @ 30 mod -7 + drop indent -if timing ; then data ; bit17
1 ss +! ss @ 10 mod jump indent sta dat dat dat dat dat dat dat dat sto asynch
time @ baud @ or drop if clear wrq inde nt asport 0 dest @ ! ; then indent 4000 baud +! 0 nn-n nop com ! indent bit17 ?wake ;
|
softsim memory access rwb
read write bits shifted from port to ios mkios
make ios using rwb /ios
set pins in ios to low unless ioc says cr
output high. testbed can override this. cr
?ios reads ios register as a special case, cr
testbed should put appropriate pin data cr
into ios. ?ioc
reads ioc then initializes ios with cr
reasonable default values. testbed can plug cr
in more appropriate values.
|
|
1260 list
softsim memory access rwb
nai-n mem @ rrq wrq or and swap / or ; mkios
ios @ 201FF and 8 right rwb indent 20 down rwb 80 left rwb 200 up rwb indent ios ! ; /ios
ios @ 1FE00 and ioc @ indent dup 2* and 2002A and or ios ! ; ?ios
dup D1 or drop if ; then indent drop ios @ +t set pop drop ; ?ioc
dup D1 or drop if ; then indent drop -t ioc ! set /ios pop drop ;
|
softsim ports rpt
-cr dpt -cr lpt -cr upt cr
set pt and leave mask active
mask off ad to see if port is active @part get
accumulate values of active ports !part put
store accumulated value into pend cr
for each active port -both
save pt and ad for later display and cr
set flag if not both read and write requested -slot
node is sleeping so arrange for cr
instruction to be executed again next time br
@comm multiport fetch !comm
multiport store @inst
multiport instruction fetch cr
|
|
1262 list
softsim ports rpt
-m right pt ! 40 ; dpt
-m down pt ! 20 ; lpt
-m left pt ! 10 ; upt
-m up pt ! 8 ; active
m ad @ 50 or and drop ; @part
pm-p active if port @ +or then ; get
-p 0 rpt @part dpt @part lpt @part indent upt @part 3 slp ! ; !part
pm-p active if dup pend ! then ; put
p rpt !part dpt !part lpt !part upt !part indent drop ; -both
p-p dup es ! ad @ clu ! indent rrq wrq or over over and or drop ; -slot
-1 slot +! 0 slp ! ; br
@comm get -both if drop -slot rrq put ; then i ndent 3FFFF and +t 0 put ; !comm
get -both if drop -slot t @ wrq or put i ndent ; then drop -t drop 0 put ; @inst
get -both if drop 0 slp ! rrq put ; inde nt then 3FFFF and ir ! 0 slot ! 0 put ;
|
|
|
1264 list
|
softsim memory bus?
is address a bus register ? @x/!x
a common to fetch/store br
@p fetching or storing memory or ports @a @+ !a !b !+ @p
br
+pc fetch the next instruction word from cr
memory or a port
|
|
1266 list
softsim memory bus?
a dup ad ! 80 and drop indent if ad @ 78 and 50 or drop then ; !p
pc @3 bus? if 1 cnt !comm ; then indent 2 cnt ad @ p+ !x
a -t swap mem ! set ; @a
ar @n ?ios @ab
bus? if 1 cnt @comm ; then 2 cnt ad @ @x
a mem @ +t set ; @b
b @3 ?ios @ab ; @+
ar @n ?ios bus? if 1 cnt @comm ; indent then 2 cnt ad @ a+ @x ; !a
ar @n ?ioc !ab
bus? if 1 cnt !comm ; then 2 cnt ad @ !x ; !b
b @3 ?ioc !ab ; !+
ar @n ?ioc bus? if 1 cnt !comm ; indent then 2 cnt ad @ a+ !x ; @p
pc @3 bus? if 1 cnt @comm ; then indent 2 cnt ad @ p+ @x ; br
+pc pc @3 bus? if @inst ; then indent ad @ p+ mem @ ir ! 0 slot ! set ; cr
|
fast number of quick steps in fast mode gap
number of steps in current mode inst
increment slot jump to 1 of cr
32 instructions s0-s3
execute instruction from slot 0-3 s4
fetch next instruction word tick
execute 1 clock cycle bus
merge pend and dest into port buses
bus on each of four ports step
tick for each computer quick
gap steps before stopping to display go
quick display until keypress faster
toggle fast and slow modes for go
|
|
1268 list
softsim execute fast 4000 gap 4000 1 gap ! cr
instruction jump table inst
n 1 slot +! 1F and jump ret ex jmp call u r+ jr+ jz jns @p @+ @b @a !p !+ !b !a +* 2*x 2 /x -x +x andx orx t! t@ r@ s@ a@ nul r! b! a!x s0
ir @ 13 2/s inst ; s1
ir @ 8 2/s inst ; s2
ir @ 3 2/s inst ; s3
ir @ 2* 2* inst ; s4
cl @ dup and drop -if +pc ; then ; tick
com ! -1 cl +! slot @ jump s0 s1 s2 s3 s4 bus
mem dup 1 or @ over F or @ @ +or swap ! ; buses
right bus down bus left bus up bus ; br
step 1 time +! nns -1 + for i tick -next inden t nns -1 + for i com ! buses mkios -next in dent testbed ; quick
gap @ for step next ; go
quick pause key? go ; faster
fast @ gap @ 1 or drop if indent drop 1 then gap ! ;
|
softsim pins out
outputs are silver pn.
factored behavior in
inputs are blue p17.
sets com, moves cursor, always first pin.
factored behavior of each pin p5.
p17. has already set com p3. p1.
br
1pin some nodes have one pin 2pins
some have two 4pins
spi at least has four pins.
display io pins on all nodes cr
used in ok br
testbed must set ios
|
|
1270 list
softsim pins out
silver ioc pn.
@n swap / 1 and digit ; in
blue ios pn. ; p17.
n com ! -14 xy +! 20000 pin.
ioc @ over and drop if 2/ out ; then in ; p5.
20 pin. ; p3.
8 pin. ; p1.
2 pin. ; br
1pin n nn-n loc p17. ; 2pins
n nn-n loc p17. p1. ; 4pins
n nn-n loc p17. p5. p3. p1. ; pins.
0 2pins 1 4pins 10 2pins ;
|
ad dress com puter pt port time 2/s
n shift right n bits 2*s
n shift left n bits +or
inclusive or me
convert memory offset to pentium address mem
convert register address br
pend convert port to 'pending' address dest
convert port to 'destination' which cr
points to neighbor with shared port bus!
when neighbors sync, write data to cr
both my pend and his pend while clearing cr
read/write requests br
right unconverted port addresses down left up
br
rrq read request bit wrq
write request bit
|
|
1272 list
softsim registers and memory cr
ad 62 com 2 pt 197 time 832000 0 time ! macro 2/s
?lit F8C1 2, 1, ; 2*s
?lit E0C1 2, 1, ; forth +or
nn over - and or ; me
com @ 2* 8000 + block + ; mem
FF and 80 ? if dup D1 or drop indent if D5 or 8 / 8,4,2,1 120 or indent then then 17F and me ; 120-12e used port
pt @ mem ; pend
port 1 or ; dest
port F or ; bus!
n dup dest @ ! pend ! ; br
right 95 ; down
F5 ; left
C5 ; up
DD ; rrq
80000 ; wrq
40000 ;
|
registers and 'node variables' ar
a register. cannot be named a because cr
pentium macro takes precedence slot
current instruction slot 0-4 rp,sp
stack pointers ss
8 stack registers rs
8 stack registers cl
clock counted down to time memory access ph
clock counted up to time instruction es
used in debugging clu
used in debugging slp
mark a node as asleep ioc
write only, use with testbed ios
read only, also used with testbed
|
|
1274 list
softsim registers and memory r
100 me ; ar
101 me ; a register b
102 me ; pc
103 me ; ir
104 me ; t
105 me ; s
106 me ; ss
7 and 107 me + ; rs
7 and 10F me + ; slot
117 me ; rp
118 me ; sp
119 me ; cl
11A me ; ph
11B me ; es
11C me ; clu
11D me ; slp
11E me ; ioc
130 me ; write only ios
131 me ; read only
|
softsim display cr/2
half carriage return emit/2
half space emit +e/2
set emit/2 to perform half emit -e/2
set emit/2 to drop the character ?adr
used to avoid displaying an address cr
field as random opcodes 'ops
a string of opcode names for decompiler op@
lookup and type an opcode string opc.
when slot is 4 display 'fet' ops.
given an instruction word, display the cr
opcodes
|
|
1276 list
softsim display 'e/2 270073890 cr/2
cr -14 xy +! ; emit/2
c 'e/2 xqt ; +e/2
'e/2 assign 48 + xy @ swap emit indent B0000 + xy ! ; +e/2 -e/2
'e/2 assign drop ; ?adr
a -8 + -if -e/2 then indent 4 + drop if ; then +e/2 ; 'ops
align strings ; ex jmp cal unx nxt if -if @p @+ @b @ !p !+ !b ! +* 2* 2/ - + and or drp dup pop ovr a . psh b! a! fet op@
i 'ops @ -16 and indent begin dup and while unpack emit/2 indent end then drop sp/2 ; opc.
i slot @ 4 and drop if drop 32 then op@ ; ops.
n 4 * 3 for 32 /mod next indent 4 for dup op@ ?adr next +e/2 ;
|
softsim display base
radix for small character number display digits
table of character values digit
display digit as small character .n
display c digits of n in the current base hex
change base to hex dec
change base to decimal nod
nod2 focus on two nodes switch
swap focus nodes wake?
a node is awake if slp is 3 ?white ?green ?blue ?red
change to named color if awake me?
color for node number
|
|
1278 list
softsim display base 16 digits
i-n align tbl 24 , 25 , 26 , 27 , 28 , 29 , 30 , 31 , 32 , 33 , cr
5 , 19 , 10 , 16 , 4 , 14 , digit
i digits emit/2 ; .n
nc dup push -1 + indent for base @ /mod next pop for digit next ; hex
16 base ! ; dec
10 base ! ; br
nod 1 nod2 1 switch
nod @ nod2 @ nod ! nod2 ! ; wake?
silver slp @ 3 and drop ; blue
4040FF color ; ?white
wake? if white then ; ?green
wake? if green then ; ?blue
wake? if blue then ; ?cyan
wake? if cyan BBBB color then ; ?red
wake? if red then ; me?
808080 color ;
|
softsim display xorg
-cr yorg upper left corner of display br
out? decide whether node is off screen loc
n calculate screen position of node tab
xy move cursor and set left margin br
@n -cr !n -cr @3 -cr !3 cr
fetch and store from memory, changing cr
from pattern to number br
10bit -cr 8bit -cr 3bit adr isolate the address field in an inst
|
|
1280 list
softsim display xorg 0 yorg 0 cr
out? xy over over +or push over -8 + indent over -4 + and - pop +or drop ; loc
n-n dup nnx /mod xorg @ negate indent yorg @ negate v+ out? indent -if drop drop drop pop drop ; then indent - 4 + 176 * swap 72 * swap indent 22 dup v+ over lm at ; tab
xy over lm at ; br
@n @ 15555 or ; !n
swap 15555 or swap ! ; @3
@ 3FF and 155 or ; !3
swap 155 or swap ! ; 10bit
3FF and ; 8bit
FF and ; 3bit
7 and pc @ @3 7 - and or ; adr
slot @ jump 10bit 10bit 8bit 3bit nul
|
softsim display u ud d
manipulate the memory dump offset the
make focus node the current node br
array -cr div -cr cin cr
isolate current opcode from inst word br
ar. -cr br. -cr ioc. -cr ios. ir. -cr tr. -cr sr. -cr rr. pc. -cr sl. -cr op. -cr cl. cr
building blocks for the 2d display, com.
|
|
1282 list
softsim display off 48 u
16 ud
off @ + FF and off ! ; d
-16 ud ; the
nod @ com ! ; br
array pop 2/ 2/ + @ ; div
align array 100000 , 8000 , 400 , 20 , 1 , cin
ir @ 80 * 1 + slot @ div / 1F and ; br
ar. ar @n 5 .n cr/2 ; br.
b @3 3 .n ; rqs.
ios @ 9 2/s FF and 2 .n ; ioc.
ioc @n 5 .n cr/2 ; ios.
ios @n 5 .n cr/2 ; ir.
ir @n 5 .n cr/2 ; tr.
t @n 5 .n cr/2 ; sr.
s @n 5 .n cr/2 ; rr.
r @n 5 .n cr/2 ; pc.
pc @3 hex 3 .n cr/2 ; sl.
slot @ digit ; op.
cin opc. cr/2 ; cl.
cl @ 0 max 3 min digit ;
|
softsim display -sp/2
half backspace place
identify current computer on 2d display com.
n display computer n mem.
xy memory dump of focus nod at xy stack return stacks
full stack dump of focus nod at xy
|
|
1284 list
softsim display -sp/2
B0000 negate nop xy +! ; place
dup com ! n-nn me? dec -sp/2 3 .n ; br
com. n loc place ?white pc. ?blue cl. indent ?white sl. ?green op. ?white ir. indent ?blue ioc. ios. ?red rr. ?green indent tr. sr. ?white ar. blue rqs. ?white br. ; br
mem. xy tab hex 15 for i off @ 7F and + indent dup white 2 .n sp/2 mem @ dup indent 15555 or green 5 .n sp/2 indent white ops. cr/2 -next ; br
stack sp @ 8 for dup ss @n 5 .n cr/2 indent -1 + next drop ; return
rp @ 8 for 1 + dup rs @n 5 .n indent cr/2 next drop ; stacks
xy tab hex white return indent red rr. green tr. sr. white stack ;
|
softsim execute cnt
count down for memory access set4
go to slot 4 and set
set cl to time memory prefetch br
/+/ nim-n add i to n affecting only bits cr
within m inc
increment current address if not cr
a port address a+
increment the a register p+
increment the p register
|
|
1286 list
softsim execute cr
cnt n ph @ or drop if 1 ph +! indent -1 slot +! pop drop ; then 0 ph ! ; set4
4 slot ! set
2 cl ! ; br
/+/ nim-n push over + over or pop and or ; inc
n-n ad @ 100 and drop if ; then 1 3F /+/ ; a+
ar @n inc ar !n ; p+
pc @3 inc pc !3 ;
|
softsim execute +t
n push onto data stack -t
-n pop from data stack +r
n push onto return stack -r
-n pop from return stack t!
write t as number t@
read t as number bin
prepare for a binary operation br
some instructions named with terminal cr
x to avoid pentium conflict br
-x - 2*x
2* sx
sign extend +*
multiply step
|
|
1288 list
softsim execute +t
n t @ s @ sp @ 1 + dup sp ! ss ! s ! t ! ; -t
-n t @ s @ t ! sp @ dup ss @ s ! indent -1 + sp ! ; +r
n r @ rp @ 1 + dup rp ! rs ! r ! ; -r
-n r @ rp @ dup rs @ r ! -1 + rp ! ; t@
t @n ; t!
t !n ; bin
-t 15555 or t@ ; br
-x t @ 3FFFF or t ! ; 2*x
t@ 2* 3FFFF and t! ; sx
dup 20000 and 2* or ; +*
t@ sx ar @n indent 1 ? if push s @n + pop indent then 2/ over 1 and drop indent if 20000 or then ar !n 2/ t! ;
|
softsim execute 2/x
2/ orx
or andx
and +x
+ t!
drop r@
pop a@
a t@
dup s@
over b! r!
push a!x
a!
|
|
1290 list
softsim execute cy 0 2/x
t@ sx 2/ t! ; orx
bin or t! ; andx
bin and t! ; +x
bin + pc @ 200 and drop indent if 0 cy @ 40000 and drop indent if 1 or then + dup cy ! then indent 3FFFF and t! ; t!
-t drop ; r@
-r +t ; a@
ar @ +t ; t@
t @ +t ; s@
s @ +t ; b!
-t 3FF and b ! ; r!
-t +r ; a!x
0 cnt -t ar ! ;
|
softsim execute call
call through i jmp
jump through i jz
if jc jns
-if ret
; jump through r jr+
next ur+
unext ex
call through r
|
|
1292 list
softsim execute call
pc @ +r jmp
ir @n adr dup pc !3 set4 80 and indent drop if 0 cl ! then ; jz
3FFFF jc
t @n and drop if set4 ; then jmp ; jns
20000 jc ; ret
-r 3FF and pc ! set4 ; jr+
r @n -1 + dup r !n dup and drop indent -if -r drop set4 ; then jmp ; ur+
r @n -1 + dup r !n dup and drop indent -if -r drop ; then 0 slot ! ; ex
pc @ -r pc ! +r set4 ;
|
softsim display nod.
show current node in red at xy ofst
offset to second focus node br
ok the default 2d display br
lw move display window left +xorg
factored move in x axis rw
move display window right uw
move display window up +yorg
factored move in y axis dw
move display window down
|
|
1294 list
softsim display nod.
xy tab dec nod com @ n-nn red 3 .n ; yofst
-320 ; -cr xofst 400 ; x0
210 ; -cr y0 342 ; x1
x0 xofst + ; -cr y1 y0 ; x2
x0 ; -cr y2 y0 yofst + ; x3
x0 xofst + ; -cr y3 y0 yofst + ; focus
xyc com ! over over stacks indent over 80 + over nod. indent 80 u+ 30 + mem. ; br
ok show black screen text indent nns -1 + for i com. -next indent x0 y0 0 focus x1 y1 1 focus indent x2 y2 2 focus x3 y3 3 focus indent 610 680 tab time @ . cr gap @ . indent pins. debug keyboard ;
|
softsim display n!
change focus node nod fr
focus right +nod
factored horizontal move fl
focus left fu
focus up ++nod
factored vertical move fd
focus down +gap
add 1 to gap and fast +g
factored add to gap and fast ++gap
add 100 to gap and fast -gap
add -1 to gap and fast --gap
add -100 to gap and fast h
keyboard handler indent ++ fastest faster indent fgs fast go step indent -- slowest slower cr indent ludr left up down right window indent ludr left up down right focus indent oud other up down memory dump cr indent . quit
|
|
1296 list
softsim keyboard handler +gap
1 +g
n fast @ + 0 max dup fast ! gap ! ; ++gap
100 +g ; -gap
-1 +g ; --gap
-100 +g ; br
h pad nul nul accept nul cr
nul nul nul nul nul nul nul nul nul u d nul cr
++gap +gap nul nul nul faster go quick cr
--gap -gap nul nul indent 2500 , 0 , 0 , indent 101600 , 2B2B , 80D0E00 , 2323 ,
|
co-ordinate shared register ports link
s ource node d est node a addr of port cr
links two nodes via their shared port 127
f or' destination 12b 12d 12e 129
1 or' pending 125 123 120 128
bus 8 right 124
bus 4 down 122
bus 2 left 121
bus 1 up boots
set execution address to AA reset
initialize some registers , cr
execute from idle
|
|
1298 list
softsim reset limbo 0 0 limbo ! ln
sd nn-n com ! pend swap nn-n com ! dest ! ; link
sda pt ! over over ln swap ln ; boots
an nn-n com ! 155 or pc ! ; un!
for 0 over ! 1 + next drop ; /dest
a -1 limbo swap pt ! dest ! indent 0 dup port ! pend ! ; rese
r 31 un! 69 155 or pc ! 4 slot ! indent 0 dup cl ! ph ! -1 es ! indent 0 dup ioc ! ios ! 3 slp ! indent left /dest up /dest right /dest indent down /dest D1 155 or b ! ; reset
drop 0 nns -1 + for i com ! rese -next ;
|
this block is loaded to compile test code for any desired nodes. write *nnn node* either her e before loading a node's source, or in the so urce itself. the *node* phrase compiles the ap propriate rom for the given node so that test code may reference the rom. br
things like ide and common tests are loaded he re, and this base code is presently assigned u p at the top of this area just below 1380. to simplify base maintenance, please use 1302 for your own testing and load it from here. when w e begin using personal space above 1440 your o wn tests can go there.
|
|
1300 list
test code for chip br
custom code 1302 load exit br
ide serial 0 node 1372 load 22 bin indent wire 0 node 1376 load 21 bin indent end 0 node 1378 load 20 bin cr
smtm test 0 node 1248 load exit br
*/ exerciser 11 node 1354 1356 load indent 10 node 1358 load cr
serdes xx node 1360 load xx node 1362 load cr
spi flash write 1 node 1364 load cr
ana 11 node 1366 1368 load cr
|
this load block, and the following 25 source/s hadow pairs, are yours to do with as you pleas e!
|
|
1302 list
custom test code br
async life test 0 node 1306 load br
exit boot packet 0 node cr
0 org exe 1E000 p, load 0 p, cnt 1 p, cr
code call0 12000 p, 12000 p, cr
1 node 0 org go
io b! 0 !b skop
@b -if 3 !b skop ; then 2 !b skop ;
|
boot frames begin with a 3 word header; indent 100xx jump to xx when done indent ddd mem/port adr to store payload indent nnn transfer length indent nnn+1 * 2 words of payload /frame
heads a new given even words of payload , destination addr, final jump addr. +frame
appends words to payload. +ram
appends a string of code from binary prod uced by compile for the given node. !frame
transmits frame given wos or wos! br
talk prepares chip for control thru node 19. exch
performs a transaction with target given addr and length of port stream, stream end act ion in boot node, and number of words reply. c r
ok stream end to simply ack completion; fet pu mps one word from target; bstk shepherds stack dump; stat pumps ten. exec is next boot frame.
|
|
1304 list
node 0 boot frames ?18
-n /str 4@ FFFFFF and 40 / 3FFFF or +wd ; !ram
reset 40 0 0 exec /frame 0 40 0 +ram wos !frame ; xram
reset 64 0 0 exec /frame 0 64 0 +ram wos !frame ; !io
reset 2 D1 warm 69 /frame 0 2 0 +ram wos ! frame ; !right
reset 4 95 exec /frame 0 4 0 +ram wos ! frame ;
|
|
|
1306 list
node 0 life test 0 org go!
1001 0 wig
over for . .. . next - dup !b cr
over for . .. . next - dup !b wig ; 00C hang
- dup !b hang ; many
00E begin @p+ !b unext . 00F 3FFFF , 2AAA A , 2AAAA , 3FFFF , 3FFFF , 2AAAA , 2AAAA , 3F FFF , 3FFFF , n01
018 . .. . .. -1 !b . . simp
01C dup dup or - !b simp ; try
01E 3 -1 !b try ; 021 joe
021 0 3FFFF , 3FFFF ,
|
|
|
1308 list
|
|
|
1310 list
|
|
|
1312 list
|
|
|
1314 list
|
|
|
1316 list
|
|
|
1318 list
|
|
|
1320 list
10 left 6A reset 40 org xmit
nn-n 17 for begin . . . . -if over dup 2/ !b !b 2* *next drop ; then over 2/ !b 2* over !b next drop ; rcv
-n left a! dup 17 for begin @ drop @b -if drop 2* *next ; then drop - 2* - next ; cr
6A org @b . -if then @ or dup a! dup ! - ! 200 00 dup xmit exit br
0 org one
9999 for . next ; time
hi 15D b! 3 !b down 115 b! right 1D5 a! c ount 9999 for 00D . unext next 00F low 15D b! 2 !b ; set
013 ---u ; 014 br
240 org clc
0 dup . + drop ; u/mod
clc - 1 . + -u/mod
a! 17 push dup . begin begin cr
+ push dup . / + dup a . / + -if / drop pop du p . / swap next / + ; / then over or or . / po p dup . . / next / + ; 6A org test
0 125 50 u/mod rd-u
|
|
|
1322 list
|
|
|
1324 list
|
|
|
1326 list
|
|
|
1328 list
|
|
|
1330 list
|
|
|
1332 list
|
|
|
1334 list
|
|
|
1336 list
|
|
|
1338 list
|
|
|
1340 list
20 left 1-bit serial 0 org fifo
n-n 000 up right a! .. . @p+ ! .. @ @p+ ! + !p+ .. ! @ .. ; 'clicks' ran
006 1 . + ; ran
n-n 008 -if 2* 2CD81 or ; then 2* ; set
n-nn 00C dup 63 for ran dup fifo drop next over ; chk
nn-nnxd 012 over ran over ran over fifo ov er over or ; test
xn 016 push set begin chk if pop BAD ; th en drop drop next 600D ; 01F period
n 01F dup -1 for ran over over or if dr op *next EEEE ; then pop ; some
xn 028 for ran dup fifo drop next drop ; exit fifo
n-n 000 up a! .. . @p+ ! .. @ @p+ !+ !p+ .. ! .. @ ; 'nothing' stops after 20 fifo
n-n 000 up a! .. . @p+ .. @ @p+ !+ !p+ .. ! ! @ .. ; 'works'
|
|
|
1342 list
|
|
|
1344 list
|
|
|
1346 list
|
|
|
1348 list
|
|
|
1350 list
|
|
|
1352 list
|
h* is simplest multiply; first arg is a signed number and second, the multiplier, is a full 1 8 bit unsigned number. try
slaves this node to another by the port gi ven. it expects to receive numbers b a r and c alculates b*a+r then receives a and returns b and r. the multiply is done using the h* here which is why b is signed and a is unsigned.
|
|
1354 list
hardware multiply test 0 org +cy clc
200 dup dup or dup . + drop ; d2*
hl-hl 202 dup . + push dup . + pop ; um+
hln-hl 205 . + push dup dup or . + pop ; 2 08 -cy h*
nu-hl 008 dup a! dup or 17 for +* unext a ; abs
n-n 00C -if neg
n-n 00D - 1 . + then ; 010 +cy u/mod
hld-rq 210 clc neg -u/mod
212 a! 17 push begin begin dup . + push dup . + dup a . + -if drop pop *next dup . + ; then over or or pop next dup . + ; 21E -cy try
01E right b! ba @b @b h* r @b um+ a @b u/m od b !b r !b try ; 027
|
|
|
1356 list
soft multiply test 0 org +cy clc
200 dup dup or dup . + drop ; d2*
hl-hl 202 dup . + push dup . + pop ; um+
hln-hl 205 . + push dup dup or . + pop ; u*
nn-hl 208 a! clc dup push dup or dup pop 17 for begin push d2* a -if 2* a! pop dup push . + push
0 . + pop pop *next drop ; then 2* a! p op next drop ; 219 -cy abs
n-n 019 -if neg
n-n 01A - 1 . + then ; *.
ff-f 01D over over or push abs swap abs u* d2* d2* drop pop -if drop neg ; then drop ; 02 6 +cy u/mod
hld-rq 226 clc neg -u/mod
228 a! 17 push begin begin dup . + push dup . + dup a . + -if drop pop *next dup . + ; then over or or pop next dup . + ; 233 -cy try
033 right b! @b @b u* @b um+ @b u/mod !b ! b try ; 03D
|
try exercises slave node given a test vector. for the hardware version a is unsigned and b i s signed. but the divide is unsigned so b is l imited to the largest positive number.
|
|
1358 list
multiply exerciser 0 org dec
n-n -1 . + ; +or
nn-n over - and or ; try
abr-ab bad 004 right a! 12033 ! push dup ! over ! pop dup ! push over ! dup @ or @ pop or +or ; test
abr-abr dup push try if pop ; then drop p op poll
@b 200 2000 and if up down b! @b push ;' io b! then drop run
abr-abr 01A if dec test ; then drop if dec over dec test ; then drop dec if -1 1FFFF over dec test ; then drop 600D ; 029 go
029 io b! 20000 1FFFF -1 1FFFF over dec run ; br
-u/mod old 02F a! 17 push dup . begin begin cr
+ push dup . + dup a . + -if drop pop dup *nex t + ; then over or or pop dup next + ; 03C
|
|
|
1360 list
|
|
|
1362 list
|
|
|
1364 list
spi flash writer michael + greg 2.1 0 org 2o
dw-dw' 000 obit 2* obit ; wait
dw-dw 002 select dup begin drop @b -until drop select ; 2cmd
dw-d 006 select 8obits cmd
dw-d select !8
dw-d 8obits drop ; set
-d 00B io b! fast 5 ; fet
ah al-d 00E push push set read C00 cmd pop !8 pop 8obits !8 ; +wr
-d 014 set wren+wrsr 1804 2cmd indent hi8 zero dup !8 ebsy 1C000 cmd ; aaip
d-d 01A 2B400 wait !8 ; x8p
hln-d asrc 01D +wr wren+aaip 1AB4 2cmd cr
drop push push push set pop !8 pop 8obits cr
!8 ahead begin aaip swap then 7 for indent pop dup push push @+ indent begin 2o 2* next push aaip pop indent 7 pop dup push or push indent begin 2o 2* next drop next next cr
wrdi+dbsy 1200 wait 2cmd rdl- ; 039 ers
039 +wr wren+eras 1980 2cmd dup select ; 0 3D
|
this block supports taking of data manually fo r a/d transfer function. to use it, put a/d in the desired mode by editing the constants in s am+ and - then set desired voltage and execute sam. you will find a sequence of samples store d in ram at 32 br
original version sampled each half cycle of th e incoming clock.
|
|
1366 list
take adc data 0 org sam+
-n 000 155 2155 6155 s+-
k-n io b! !b up b! !b @b ; sam-
-n 006 955 2955 6955 s+- ; br
sam 008 20 a! sam+ sam- 11 2* for cr
push sam+ dup - pop . + !+ push cr
push sam- dup - pop . + pop + !+ next ; 016 br
exit sam+ drop
|
|
|
1368 list
generate dac waves 0 org dly
000 100 for unext ; sano
n-n 3FFDF and ; 10 or ; tri
n 007 push 155 0 begin cr
510 for over or dup sano !b indent dly over or 1 . + next cr
510 for over or dup sano !b indent dly over or -1 . + next next drop drop ; try
01C io b! sing
01E 1000 tri poll
020 @b 2000 and if down b! @b push ;' io b! then drop sing ; haul
029 io b! -1 dup push dup push dup push d up push dup push dup push dup push dup push pu sh 155 AA over over over over over over / dup dup spin
036 begin !b . . unext !b !b !b !b !b !b !b !b spin ; 037 exit cr
155 1D5 55 D5 AA D5 55 1D5 /
|
|
|
1370 list
|
|
|
1372 list
ide via async boot 0 org obit
dwn-dw 000 !b over push delay ; word
dw-d 002 leap drop leap drop leap drop dr op ; obyt
dw-dwx 006 then then then 3 obit drop 7 f or dup 1 and 3 or obit drop 2/ next 2 obit ; -out
011 ser-exec rdl- ; 012 br
ok 012 31416 word -out ; fet
015 0 pump
n for @+ word . next -out ; stat
01B 9 pump ; bstk
01D @ push .. @ word pop dup push word .. @p+.push
49BA ! 7 .. dup push ! .. @p+ ! .. /+ begin !p+ . . unext .. begin @ word .. . next .. @p+ ! pop ..
/+ pop @p+ ; .. ! -out ; 02C
|
|
|
1374 list
ide via sync boot 0 org 1bit
wx-w'x drop -if 3 ahead swap then 2 cr
then !b 2* dup ; word
w 006 8 dup for begin drop @b -until 1bit begin drop @b - -until 1bit next drop drop ; +out
x 00F begin drop @b - -until drop 3 !b ; -out
x 013 begin drop @b -until cr
drop 2 !b 1 !b ser-exec ; br
ok 018 dup +out 31416 word dup -out ; fet
01C 0 pump
n dup +out for @+ word next dup -out ; stat
023 9 pump ; bstk
025 +out @ dup push . @ word word / @p+.p ush 49BA ! 7 . / dup push ! . / @p+ ! . . /+ b egin !p+ . . unext / begin @ word / next / @p+ ! pop . /+ pop @p+ ; / ! -out ; 034
|
|
|
1376 list
ide wire node code 0 org fet
000 @p+ !b @ . fet !b @b ! ; 003 5 org sto
005 @p+ !b @ . sto !b @ !b ; 008 A org ins
00A @p+ !b @ . ins !b ; 00D D org psh
00D @p+ !b @ . psh !b ; 010 10 org stk
010 @p+ !b . . stk 9 for @b ! unext ; cr
015
|
|
|
1378 list
ide last guy size-2 1E org focus
i0 01E @p+ !b !b ; / focus ; 0 org fet
000 @p+ focus /+ @p+ a! @ !p+ / @ !b @b @p + /+ ; / !b ! ; sto
005 @p+ focus /+ @p+ a! . @p+ / @ !b @ . / !b @p+ !b ;
/+ ! ; ins
00A @ focus ; / ins ins psh
00D @p+ focus /+ @p+ ; / @ !b ; stk
010 @p+ focus /+ !p+ dup push !p+ / @b @b ! dup / ! @p+.push 49BA !b 7 / dup push !b . / @p+ !b
/+ begin !p+ . . unext / begin @b ! une xt . / @p+ !b !b ; /+ pop @p+ ; cr
if past size-2 not ok- 01C
|
|
|
1380 list
common cr
1D5 95 org -cr r--- cr
115 F5 org -cr -d-- cr
175 C5 org -cr --l- cr
145 DD org -cr ---u cr
1A5 AD org -cr rdlu right down left up cr
1B5 A5 org -cr rdl- right down left cr
185 BD org -cr rd-u right down up cr
195 B5 org -cr rd-- right down
|
poly xn-xy cr
evaluation of chebyshev polynomials using cr
the horner scheme. br
x is the input value. n is the length of cr
the coefficient table minus 2. coefficient cr
table follows inline, and execution cr
continues after the final table entry. x is cr
left on the stack under the result, y. br
for example... cos
f-f' cr
hart 3300 cr
-0.0043 0.0794 -0.6459 0.5708 indent 2* 2* . triangle dup *. 2 poly indent -281 , 5203 , -42329 , 37407 , indent push drop pop *. + ;
|
|
1382 list
polynomial approximation poly
xn-xy pop a! push @+ a begin indent push *. pop a! @+ + a next push ;
|
interp ims-v cr
to determine values for m and s ... cr
let l be number of meaningful input bits. cr
let n be power of 2 where 2**n + 1 is the cr
number of table entries. br
s equals l-n-1 cr
m equals 2** l-n - 1 br
so for example if you have an 8 bit adc, cr
l equals 8. let n equal 2 for a 5 entry table. the table is expected to be at address 0, cr
so to represent 0 to 1800 millivolts... br
0 org 0 , 450 , 900 , 1350 , 1800 , cr
mv i-n 3f 5 interp ; br
0 mv gives 0 cr
255 mv gives 900 cr
255 mv gives 1800 cr
and intermediate values are interpolated.
|
|
1384 list
interpolate interp
ims-v dup push push over indent begin 2/ unext a! indent and push @+ dup @+ - . + - indent pop a! dup dup or indent begin +* unext push drop pop . + ;
|
taps yxc-y'x' cr
for example... br
fir yx-y'x' 15 taps -53 , 0 , 2276 , 0 , 382 , 0
, -1706 , 0 , -1158 , 0 , 2014 , 0 , 2406 , 0 , -1977 , 0 , -4206 , 0 , 1289 , 0 , 6801 , 0 , 678 , 0 , -11109 , 0 , -6250 , 0 , 23531 , 0
, 54145 , 0 , br
16 taps, 16 coefficients with intermediate cr
storage interleaved.
|
|
1386 list
fir or iir filter taps
yxc-y'x' pop a! push begin indent @+ @ push a push *.17 pop a! indent push !+ pop . + pop next @ a! ;
|
relay moves a port executable packet down cr
a sequence of nodes linked by their b cr
registers. the packet consists of a 1-cell cr
index, a 1-cell count less one of body cr
size, and the body cells. br
a packet may be started from memory within cr
a node, or it may simply be fed to a port. br
relay assumes that b points to the next cr
node in the chain. uses one return stack cr
location and four data stack locations. cr
it must be at the same location in every cr
node.
|
|
1388 list
routing; called with 'a relay' relay
a pop a! @+ push @+ zif indent drop ahead done swap then indent pop over push @p+ ' a relay ' indent !b !b !b begin @+ !b unext done
then a push a! ;
|
*.17 multiplies a fraction by a fraction, cr
giving a fraction, or an integer by a cr
fraction, giving an integer. note that f1 cr
is left in s to be ignored, dropped, or cr
reused. note that the definition of *. cr
contains a call to this word. br
17 bit fractions --- s.i ffff ffff ffff ffff
|
|
1390 list
multiply *.17
a b - a a*b a! 16 push dup dup or indent begin +* unext - +* a -if indent drop - 2* ; then drop 2* - ;
|
|
|
1392 list
lshift rshift lsh
push begin 2* unext ; rsh
push begin 2/ unext ;
|
triangle assuming an angle expressed as a cr
16 bit fraction of a revolution, cr
2* 2* triangle produces a triangle wave cr
approximation to the cosine of that angle.
|
|
1394 list
triangle triangle
x-y call with; 2* 2* triangle indent 10000 over -if drop . + ; then indent drop - . + - ;
|
*. multiplies a fraction by a fraction, cr
giving a fraction, or an integer by a cr
fraction, giving an integer. note that f1 cr
is left in s to be ignored, dropped, or cr
reused. br
16 bit fractions --- si. ffff ffff ffff ffff
|
|
1396 list
fractional multiply *.
07B f1 f2 - f1 f1*f2 *.17 indent a 2* -if drop - 2* - ; then indent drop 2* ;
|
clc clears the carry bit for addition in cr
ea mode. br
the following defines u/mod in ram ... cr
u/mod hld-rq - 1 . + --u/mod ; br
if the divisor is a constant, just negate cr
it at edit or compile time.
|
|
1398 list
divide cr
+cy 24F enter ea mode clc
dup dup or dup . + drop ; --u/mod
clc -u/mod
hld-rq a! 17 push begin begin indent dup . + . push dup . + indent dup a . + -if indent drop pop *next dup . + ; then indent over or or . pop next dup . + ; cr
-cy 05E exit ea mode
|
g18 target compiler includes support for g18 a ddressing see 1404 h
address of next available word in target mem ory here ip
address of current instruction word slot
next available instruction slot call?
was last instruction a call ? call
a compile a call eras
fills g18 memory with call 155 number 2*s
n shift left n bits memory
n-a host address for target memory org
n set current target memory location break
break in emulator only /+/
adds unsigned value i aligned with mask m to the field under that mask in number n p,
n compile pattern into target memory s0-s4
assemble opcode into slot 0-3 i,
assemble opcode into next slot *note** simp le code jump table using jump
|
|
1400 list
g18 compiler h 3 ip 2 slot 4 call? 24576 cal 2 70077670 com 0 macro !7
BD0489 3, FFFFFFFC , drop ; 2*s
?lit E0C1 2, 1, ; call
nn ?dup B8 1, , E9 1, cal @ here 3 + - + , ; forth swap
swap ; eras
an push 613C call 69 swap block pop blks fill ; memory
n-a 380 - and com @ 2* 8000 + block + ; 8000
nnc 2 * eras org
n dup h ! ip ! break
4 slot ! ; /+/
nim-n push over + over or pop and or ; o
n 6 for 10 /mod next 6 for 8 * + next p,
n h @ memory ! h @ 1 3F /+/ h ! ; s4
h @ ip ! 13 2*s dup call? ! p, 1 slot ! ; s0
13 2*s sn
dup call? ! ip @ memory +! 1 slot +! ; s1
8 2*s sn ; s2
3 2*s sn ; s3
dup 3 and drop if 7 sn s4 ; then 4 / sn ; i,
slot @ jump s0 s1 s2 s3 s4
|
defer -a byte address of the compiled code tha t follows -- used for forward referencing execute
a code at this address f!
an store address of code executed when a wo rd with this function is interpreted f@
n-a fetch address of function code class
a store address of code to be executed f or each word subsequently defined empty
redefine empty to restore altered functi ons host
change context back to colorforth functions
aa store functions in kernel specifi c way c18
save green word and number functions. set green short-number to n, compile to call. targ et words are executed to assemble instructions .
nop used to fill instruction words nops
fills rest of word with nops here
-a starts new instruction word. leaves ta rget address as number await
generates call to node's idle ports.
|
|
1402 list
target cnt
2/ -1 + ; defer
-b pop ; execute
b push ; f!
bn sp + ! ; f@
n-b sp + @ ; class
b last 1 + ! ; empty
empt host
0 class 6 f@ nop 4 f@ nop 13 f@ nop functions
bbb 13 f! 4 f! 6 f! ; .
1C i, ; nop hhere
here ; ..
slot @ 4 or drop if . .. ; then 0 call? ! ; here
.. h @ 3FF and ; hhere report
here 32 * 13 16 + + !7 ; c18
b 1 f@ 0 + functions ; +cy
here 200 over - and or org ; -cy
here 200 - and org ; await
com @ idle cal @ execute ;
|
the g18 uses adr bits 8 and 9 for modes; 7 for i/o; 6 for rom. incrementer maintains bits 0-5 , rest are left alone except for return and sl ot 0 jumps. br
hisame is true if the two addresses match in b its 9 and 8 - the extended arithmetic and unde fined mode bits. the first address is jump des t and the last is p at time of the jump. both are pattern as used. -adr
an assembles jump to known address adr
n-a assembles forward jump in slot 0,1,2. value left on stack is instr addr * 64 + here- ip + slot. @h
given that value / 8 returns p at time the jump executes, as number. then
a insert address for forward jump
|
|
1404 list
g18 jump instructions hisame
axa-ax push over pop or - dup 2* and 20 0 and drop ; j3
. j0
i, ip @ memory +! break ; j1
h @ 155 or hisame if swap FF and swap j0 ; then . . j3 ; j2
over 155 or h @ or 3F8 and drop if . j3 ; t hen swap 7 and swap j0 ; -adr
an swap 155 or swap slot @ jump j0 j1 j2 j3 j0 adr
n-n slot @ 3 or drop if i, ip @ 8 * h @ ip @ negate +
7 and + 8 * slot @ + break ; then . adr ; @h
n-a 8 /mod swap 3F /+/ ; f3
an over 155 or over @h or 3F8 and drop if a bort ; then swap 7 and swap 8 / memory +! ; f2
dup @h 155 or hisame if swap FF and swap f1
8 / memory +! ; then abort ; then
n here 155 or swap 8 /mod swap jump f1 f1 f2 f3
|
def -a deferred to class. executed for every t arget definition to compile host code that com piles target call call
a compile target call ;
will be executed as a target word. the penti um macro has precedence while compiling if/-if
leaves address of jump on stack -until
a jump if positive to begin zif
forward next decrements r and jumps if r! else pops and falls thru next/for n
executed for green short-numbers. all 18-bit target numbers are short. executes white short -number to put interpreted number on stack. th en assembles literal instruction with number i n next location. inverted for rom ,
n compile number into target memory ?lit
-n retrieve previously compiled number begin
-a starts new instruction word. leaves p roperly formatted target address ahead
compiles fwd ref jump resolve w/then leap
like ahead but compiles a call
|
|
1406 list
complex instructions def
defer here call ; call
defer a 3 -adr ; call cal ! ;
call? @ dup 6000 or drop if dup 300 or drop if dup 18 or drop if 0 and i, break ; then the n then dup 2/ and negate ip @ memory +! ; -if
-a 7 adr ; if
-a 6 adr ; -until
a 7 -adr ; until
a 6 -adr ; -while
a-aa 7 adr swap ; while
a-aa 6 adr swap ; zif
-a 5 adr ; *next
aa-a swap next
a 5 -adr ; unext
a 4 i, drop ; n
defer 8 f@ execute lit
8 i, 3FFFF and ok in slot 3 ,
n 15555 or p, ; for
1D i, begin
here ; ahead
-a 2 adr ; end
a 2 -adr ; leap
-a 3 adr ;
|
words being redefined for the target computer. these host words can no longer be executed. al though pentium macros take precedence during c ompilation, they will no longer be used. g18
instructions 0
; ....8 n ..10 +* ..18 dup 1
;' ...9 @+ .11 2* ..19 pop 2
j ....a @b .12 2/ ..1a over 3
call .b @ ..13 - ...1b a 4
unext c !p+ 14 + ...1c . 5
next .d !+ .15 and .1d push 6
if ...e !b .16 or ..1e b! 7
-if ..f ! ..17 drop 1f a!
|
|
1408 list
instructions target
n c18 def class ; ex
-cr ;' 1 i, break ; rx @p
-cr @p+ 8 i, ; @+
9 i, ; @b
A i, ; @
B i, ; !p
-cr !p+ C i, ; !+
D i, ; !b
E i, ; !
F i, ;
|
|
|
1410 list
port literals - 2a or right
95 lit ; 0010111111 down
F5 lit ; 0011011111 left
C5 lit ; 0011101111 up
DD lit ; 0011110111 warp
D4 lit ; 0011111110 ??? io
D1 lit ; 0011111011 data
DF lit ; 0011110101 center
AD lit ; port calls top
A5 lit ; side
BD lit ; corner
B5 lit ; /mod
/mod ; spispeed
497 0 lit ; 0 24-bit adrs 4 * 262144 /mod al ah 3 read cmd 256 * + 4 * spicmd
c.ah 0 + lit ; spiadr
al 0 + lit ;
|
o replaces top-of-stack with 0. g18 instructio ns can't be used in macros - forth macros take precedence
|
|
1412 list
more instructions +*
10 i, ; slot 3 ok 2*
11 i, ; 2/
12 i, ; -
13 i, ; +
14 i, ; slot 3 ok and
15 i, ; or
16 i, ; exclusive-or drop
17 i, ; dup
18 i, ; slot 3 ok pop
19 i, ; over
1A i, ; a
1B i, ; push
1D i, ; b!
1E i, ; a!
1F i, ;
|
|
|
1414 list
|
|
|
1416 list
|
|
|
1418 list
math rom anywhere 0 kind br
A1 61 org cr
061 1388 load relay cr
069 -cr warm await ; br
B0 70 org cr
070 1390 load multiply cr
077 1396 load fractional multiply cr
07C 1386 load taps cr
044 1384 load interpolate cr
04E 1394 load triangle cr
053 1398 load -u/mod br
AA 6A org cr
06A 1382 load polynomial approximation cr
070
|
|
|
1420 list
serdes boot top/bot 6 kind AA 6A reset br
A1 61 org cr
0A1 1388 load relay cr
0A9 -cr warm await ; cr
cold 0AA 3141 a! 3FFFE dup ! rdlu cold ; br
0B0 1390 load multiply cr
0B7 1396 load fractional multiply cr
0BC 1386 load taps cr
0C4 1384 load interpolate cr
0CE 1394 load triangle cr
0D3 1398 load -u/mod cr
0E1
|
|
|
1422 list
sync serial boot side 2 kind AA 6A reset cr
needs rewrite for g4 wakeup!!! cr
BF 7F org -cr sget cr
A1 61 org cr
061 1388 load relay cr
069 -cr warm await ; cr
cold 06A A5 'rdl- a! @ @b . . -if 0pin cr
3FCB5 'rd-- 3fc00 + dup push dup begin cr
drop @b . -if /pin *next swap then cr
B5 'rd-- push drop push ; then ser-exec
076 x-x sget push sget a! sget ser-copy
079 push zif ; then cr
begin sget push sget pop !+ !+ next ; cr
7F org -cr sget 07F -w dup leap leap 6in
041 then then leap leap 2in
043 then then 2* 2* dup begin cr
. drop @b . - -until - 2 and dup begin cr
. drop @b . . -until 2 and 2/ or or ; br
04D 1390 load multiply cr
054 1386 load taps cr
05C 1394 load triangle cr
061
|
cold now insists on seeing the pin low after b oot and thus will only start booting on a trul y rising edge. no longer necessary to fake a c all to the port since we are really doing one. could use a call on the leading edge of a star t bit too, eventually.
|
|
1424 list
async serial boot top/bot 1 kind 6A reset cr
4F org -cr 18ibits cr
61 org cr
04F 1388 load relay cr
69 org 069 -cr warm await ; cold
06A @b -if rdl- then rdl- ser-exec
06D x-d 18ibits drop push . cr
18ibits drop a! . 18ibits ser-copy
072 xnx-d drop push zif ; then begin 18ibits drop !+ next ; 077 7B org wait
07B x begin . drop @b -until . drop ; sync
07E x-delay dup dup wait or - push begin @b . -if . drop *next rd-- ; then . drop pop - 2/ ; start
045 delay word - delay word b cr
dup wait over dup 2/ . + push delay
048 nw-nwb cr
begin @b . -if then . drop next @b ; br
04B 4F org 1426 load 18ibits 1-wire xmit cr
6A org or - . setup dup xmit dup xmit cr
069 1392 load lsh rsh cr
069
|
|
|
1426 list
more async serial 18ibits
04F x - delay word x indent sync sync dup start leap 2bits leap byte
054 then drop start leap 4bits
056 then leap 2bits
057 then then leap 1bit
058 nwb-nwb then indent push 2/ pop over or indent 20000 and or over push delay ; cr
1-wire xmit and setup xbit
05D n-n . -if over 2/ !b over !b . ; 11.5 ns then over dup 2/ !b !b . ; 3.7ns pulse setup
n-m push 20000 pop xmit
mn-m . 17 for . xbit 2* next @b drop drop ; cr
069 cr
0 to 0 cr
0 to 1 mbps max rate cr
1 to 0 cr
1 to 1
|
|
|
1428 list
spi boot top/bot 4 kind AA 6A reset host ---
2A lit ; --+
2B lit ; +--
3A lit ; +-+
3B lit ; -++
2F lit ; target cr
61 org 1388 load relay br
42 org 8obits
dw-dw' 7 for leap obit 2* *next ; ibit
047 dw-dw' indent @b . -if drop - 2* ; then drop 2* - ; half
04A dwc-dw !b over for . . unext ; select
04C dw-dw -++ half --+ half ; obit
050 dw-dw then indent -if +-- half +-+ half ; then rbit
055 dw-dw --- half --+ half ; 18ibits
059 d-dw dup 17 for rbit ibit - next ; cr
u2/ 2/ 1FFFF and ; 061 cr
69 org cr
069 -cr warm await ; cr
06A 1430 load the rest cr
041
|
|
|
1430 list
more spi cold
06A @b - .. B5 'rd-- -until indent spispeed spiadr push spicmd spi-boot
070 dly adrh . adrl - dly x indent select 8obits 8obits indent drop pop . 8obits 8obits spi-exec
076 dx-dx drop 18ibits indent 1E000 . + B5 'rd-- -until indent push 18ibits a! 18ibits spi-copy
07C dn-dx push zif ; then begin inden t 18ibits push 18ibits pop !+ !+ next dup ; 041
|
|
|
1432 list
analog 8 kind br
61 org cr
061 1388 load relay cr
069 -cr warm await ; br
70 org cr
070 1390 load multiply cr
077 1396 load fractional multiply cr
07C 1434 load -dac cr
044 1384 load interpolate cr
04E 1394 load triangle cr
053 1398 load -u/mod 061 br
6A org cr
06A 1382 load polynomial approximation cr
070
|
|
|
1434 list
dac -dac
legacy entry name below dac27
07C mcpaw-mcp dup push push indent over pop - . + push push 155 indent pop over or a indent begin unext !b . indent begin unext !b !b ;
|
cold now waits for pin to go low i.e. end of r eset before looking for a rising edge. br
rdl- @b ; -if 21.5ns cr
0bit 39.5ns 1bit 42.5ns 23.5mbps
|
|
1436 list
1-wire 3 kind 6A reset br
5E org rcv
-n 17 dup for begin rdl- -if cr
drop - 2* @b drop - *next ; cr
then drop 2* @b drop next ; cr
068 free br
69 org 069 -cr warm await ; cold
06A @b -if rdl- cr
then rcv push rcv a! rcv indent for push zif ; then begin rcv !+ next ; b r
074 1390 load multiply *.17 7 cr
07B 1396 load fractional multiply *. 5 cr
040 1384 load interpolate interp 10 cr
04A 1394 load triangle 5 cr
04F 1398 load -u/mod 14 cr
05E free
|
|
|
1438 list
null rom anywhere 0 kind
|