Annotation of gforth/test/primtest.fs, revision 1.3

1.1       anton       1: \ test for Gforth primitives
                      2: 
                      3: \ Copyright (C) 2003 Free Software Foundation, Inc.
                      4: 
                      5: \ This file is part of Gforth.
                      6: 
                      7: \ Gforth is free software; you can redistribute it and/or
                      8: \ modify it under the terms of the GNU General Public License
                      9: \ as published by the Free Software Foundation; either version 2
                     10: \ of the License, or (at your option) any later version.
                     11: 
                     12: \ This program is distributed in the hope that it will be useful,
                     13: \ but WITHOUT ANY WARRANTY; without even the implied warranty of
                     14: \ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     15: \ GNU General Public License for more details.
                     16: 
                     17: \ You should have received a copy of the GNU General Public License
                     18: \ along with this program; if not, write to the Free Software
                     19: \ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
                     20: 
                     21: Create mach-file here over 1+ allot place
                     22: 
                     23: 0 [IF]
                     24: \ debugging: produce a relocation and a symbol table
                     25: s" rel-table" r/w create-file throw
                     26: Constant fd-relocation-table
                     27: 
                     28: \ debuggging: produce a symbol table
                     29: s" sym-table" r/w create-file throw
                     30: Constant fd-symbol-table
                     31: [THEN]
                     32: 
                     33: 
                     34: bl word vocabulary find nip 0= [IF]
                     35:     \ if search order stuff is missing assume we are compiling on a gforth
                     36:     \ system and include it.
                     37:     \ We want the files taken from our current gforth installation
                     38:     \ so we don't include relatively to this file
                     39:     require startup.fs
                     40: [THEN]
                     41: 
                     42: \ include etags.fs
                     43: 
                     44: include ./../cross.fs              \ cross-compiler
                     45: 
                     46: decimal
                     47: 
                     48: has? kernel-start has? kernel-size makekernel
                     49: \ create image-header
                     50: has? header [IF]
                     51: here 1802 over 
                     52:     A,                  \ base address
                     53:     0 ,                 \ checksum
                     54:     0 ,                 \ image size (without tags)
                     55: has? kernel-size
                     56:     ,                   \ dict size
                     57:     has? stack-size ,   \ data stack size
                     58:     has? fstack-size ,  \ FP stack size
                     59:     has? rstack-size ,  \ return stack size
                     60:     has? lstack-size ,  \ locals stack size
                     61:     0 A,                \ code entry point
                     62:     0 A,                \ throw entry point
                     63:     has? stack-size ,   \ unused (possibly tib stack size)
                     64:     0 ,                 \ unused
                     65:     0 ,                 \ data stack base
                     66:     0 ,                 \ fp stack base
                     67:     0 ,                 \ return stack base
                     68:     0 ,                 \ locals stack base
                     69: [THEN]
                     70: 
                     71: doc-off
                     72: has? prims [IF]
                     73:     include ./../kernel/aliases.fs             \ primitive aliases
                     74: [ELSE]
                     75:     prims-include
                     76:     undef-words
                     77:     include prim.fs
                     78:     all-words  
                     79: [THEN]
                     80: doc-on
                     81: 
                     82: has? header [IF]
                     83: 1802 <> [IF] .s cr .( header start address expected!) cr uffz [THEN]
                     84: AConstant image-header
                     85: : forthstart image-header @ ;
                     86: [THEN]
                     87: 
                     88: \ 0 AConstant forthstart
                     89: 
                     90: : emit ( c -- )
                     91:     stdout emit-file drop ;
                     92: 
                     93: : type ( addr u -- )
                     94:     stdout write-file drop ;
                     95: 
1.3     ! anton      96: : cr ( -- )
        !            97:     newline type ;
        !            98: 
1.2       anton      99: char j constant char-j
                    100: 
                    101: variable var-k
                    102: char k var-k !
                    103: defer my-emit
                    104: ' emit is my-emit
                    105: cell% 2* 0 0 field >body
                    106: 
1.3     ! anton     107: create cbuf 100 allot
        !           108: 
        !           109: create cellbuf 5 , 6 , 7 , 8 , 20 cells allot
        !           110: 
        !           111: 
        !           112: 4 constant w/o
        !           113: 0 constant r/o
        !           114: 
1.2       anton     115: variable s0
                    116: : depth s0 @ sp@ cell+ - ;
                    117: 
                    118: \  : myconst ( n -- )
                    119: \      create ,
                    120: \    does> ( -- n )
                    121: \      @ ;
                    122: \  char m myconst char-m
1.3     ! anton     123: create myconst char m ,
        !           124: does> @ ;
1.2       anton     125: 
                    126: : unloop-test ( -- )
                    127:     0 >r 0 >r unloop ;
                    128: 
1.3     ! anton     129: : deeper-rp@
        !           130:     rp@ ;
        !           131: 
        !           132: : rp!-test2
        !           133:     rp! ;
        !           134: 
        !           135: : rp!-test1
        !           136:     rp@ rp!-test2 ." should not be executed" ;
        !           137: 
        !           138: : rdrop-test
        !           139:     0 >r rdrop ;
        !           140: 
1.1       anton     141: : boot ( -- )
1.2       anton     142:     sp@ s0 !
1.1       anton     143:     [char] a stdout emit-file drop
                    144:     [char] b emit
1.3     ! anton     145:     s" cd" type
        !           146:     ." fg"
1.2       anton     147:     [char] i ['] emit execute
                    148:     ['] char-j execute emit
                    149:     ['] var-k execute @ emit
                    150:     \ !!douser
                    151:     [char] l ['] my-emit execute
                    152:     [char] l ['] my-emit ['] >body execute perform
1.3     ! anton     153:     ['] myconst execute emit
1.2       anton     154:     noop
                    155:     [char] m ['] my-emit ['] execute dup execute
                    156:     [char] m ['] 1+ execute emit
                    157:     [char] o ['] my-emit >body perform
                    158:     unloop-test ." p"
                    159:     [char] q my-emit
1.3     ! anton     160:     myconst emit
1.2       anton     161:     \ !! branch-lp+!#
                    162:     ahead ." wrong" then ." r"
                    163:     0 if ." wrong" else ." s" then
                    164:     1 if ." t" else ." wrong" then
                    165:     \ !! ?dup-?branch ?dup-0=-?branch
                    166:     \ 0 ?dup-if ." wrong" drop else ." u" then
                    167:     \ [char] v ?dup-if emit else ." wrong" then
1.3     ! anton     168:     1 for [char] x i - emit next
        !           169:     [char] z 1+ [char] y do i emit loop
        !           170:     [char] D [char] A do i emit 2 +loop
        !           171:     [char] A [char] E do i emit -2 +loop
        !           172: \    [char] A [char] D do i emit 2 -loop \ !! -loop undefined
        !           173: \    [char] A [char] E do i emit -2 s+loop \ !! s+loop undefined
        !           174:     [char] X [char] X ?do i emit loop
        !           175:     [char] G [char] F ?do i emit loop
        !           176:     \    [char] X [char] Y +do i emit loop \ !! +do undefined
        !           177:     \    [char] H [char] G +do i emit loop
        !           178:     \ !! (u+do) (-do) (u-do)
        !           179:     [char] I >r 0 >r i' emit 2rdrop
        !           180:     [char] J >r 1 0 ?do j emit loop rdrop
        !           181:     [char] K >r 0 >r 0 >r 1 0 ?do k emit loop 2rdrop rdrop
        !           182:     s" LMN" cbuf swap move cbuf 3 type
        !           183:     cbuf cbuf 2 + 5 cmove cbuf 6 type
        !           184:     cbuf 1+ cbuf 6 cmove> cbuf 2 type
        !           185:     cbuf 10 [char] N fill cbuf 2 type
        !           186:     cbuf 10 s" NNNN" compare [char] N + emit
        !           187:     cbuf 4 s" NNNN" compare [char] P + emit
        !           188:     cbuf 3 s" NNNN" compare [char] R + emit
        !           189:     [char] r toupper emit
        !           190:     s" abcST" 3 /string type
        !           191:     [char] S 2 + emit
        !           192:     [char] V ['] my-emit >body perform
        !           193:     [char] V [char] W 2 under+ emit emit
        !           194:     'Z 1 - emit
        !           195:     'X 2 negate - emit
        !           196:     '` 1+ emit
        !           197:     'c 1- emit
        !           198:     'a 'd max emit
        !           199:     'g 'e min emit
        !           200:     'e -1 abs + emit
        !           201:     'a 2 3 * + emit
        !           202:     'a 700 99 / + emit
        !           203:     'g 8 3 mod + emit
        !           204:     8 3 /mod + 'f + emit
        !           205:     'a 5 2* + emit
        !           206:     'n -3 2/ + emit
        !           207:     7. -3 fm/mod drop 'o + emit
        !           208:     7. -3 sm/rem drop 'm + emit
        !           209:     -1 1 m* + 'q + emit
        !           210:     -1 -1 um* + 'q + emit
        !           211:     7. 3 um/mod + 'n + emit
        !           212:     0 2 -1 m+ -1 1 d= 's + emit
        !           213:     -1 1 1 1 d+ 0 3 d= 't + emit
        !           214:     1 3 2 1 d- -1 1 d= 'u + emit
        !           215:     1 0 dnegate -1 -1 d= 'v + emit
        !           216:     cr
        !           217:     -1 0 d2* -2 1 d= 'b + emit
        !           218:     -4 3 d2/ -2 1 d= 'c + emit
        !           219:     5 3 and 1 = 'd + emit
        !           220:     5 3 or 7 = 'e + emit
        !           221:     5 3 xor 6 = 'f + emit
        !           222:     5 invert -6 = 'g + emit
        !           223:     $f0f0f0f0 12 rshift $f0f0f = 'h + emit
        !           224:     5 2 lshift 20 = 'i + emit
        !           225:     0 0= 1 0= -1 0 d= 'j + emit
        !           226:     -1 0< 0 0< -1 0 d= 'k + emit
        !           227:     1 0> 0 0> -1 0 d= 'l + emit
        !           228:     0 0<= 1 0<= -1 0 d= 'm + emit
        !           229:     0 0<= 1 0<= -1 0 d= 'm + emit \ just to repeat the "l"
        !           230:     0 0>= -1 0>= -1 0 d= 'n + emit
        !           231:     5 0<> 0 0<> -1 0 d= 'o + emit
        !           232:     1 1 = 2 3 = -1 0 d= 'p + emit
        !           233:     -1 0 < 1 1 < -1 0 d= 'q + emit
        !           234:     2 -1 > 1 1 > -1 0 d= 'r + emit
        !           235:     1 1 <= 2 -1 <= -1 0 d= 's + emit
        !           236:     1 1 >= -1 2 >= -1 0 d= 't + emit
        !           237:     2 3 <> 1 1 <> -1 0 d= 'u + emit
        !           238:     1 1 u= 2 3 u= -1 0 d= 'v + emit
        !           239:     0 -2 u< 0 0 u< -1 0 d= 'w + emit
        !           240:     -3 5 u> 0 0 u> -1 0 d= 'x + emit
        !           241:     0 0 u<= -1 0 u<= -1 0 d= 'y + emit
        !           242:     0 0 u>= 0 -1 u>= -1 0 d= 'z + emit
        !           243:     2 3 u<> 0 0 u<> -1 0 d= '{ + emit
        !           244:     \ dcomparisons
        !           245:     0. d0= 1. d0= -1 0 d= 'j + emit
        !           246:     -1. d0< 0. d0< -1 0 d= 'k + emit
        !           247:     1. d0> 0. d0> -1 0 d= 'l + emit
        !           248:     0. d0<= 1. d0<= -1 0 d= 'm + emit
        !           249:     0. d0<= 1. d0<= -1 0 d= 'm + emit \ just to repeat the "l"
        !           250:     0. d0>= -1. d0>= -1 0 d= 'n + emit
        !           251:     5. d0<> 0. d0<> -1 0 d= 'o + emit
        !           252:     1. 1. d= 2. 3. d= -1 0 d= 'p + emit
        !           253:     -1. 0. d< 1. 1. d< -1 0 d= 'q + emit
        !           254:     2. -1. d> 1. 1. d> -1 0 d= 'r + emit
        !           255:     1. 1. d<= 2. -1. d<= -1 0 d= 's + emit
        !           256:     1. 1. d>= -1. 2. d>= -1 0 d= 't + emit
        !           257:     2. 3. d<> 1. 1. d<> -1 0 d= 'u + emit
        !           258:     1. 1. du= 2. 3. du= -1 0 d= 'v + emit
        !           259:     0. -2. du< 0. 0. du< -1 0 d= 'w + emit
        !           260:     -3. 5. du> 0. 0. du> -1 0 d= 'x + emit
        !           261:     0. 0. du<= -1. 0. du<= -1 0 d= 'y + emit
        !           262:     0. 0. du>= 0. -1. du>= -1 0 d= 'z + emit
        !           263:     2. 3. du<> 0. 0. du<> -1 0 d= '{ + emit
        !           264:     0 0 1 within 0 0 0 within -1 0 d= 'B + emit
        !           265:     \ !! useraddr
        !           266:     \ !! up!
        !           267:     sp@ s0 @ = 'C + emit
        !           268:     sp@ -3 cells + sp! drop drop drop sp@ s0 @ = 'D + emit
        !           269:     rp@ deeper-rp@ cell+ = 'E + emit
        !           270:     rp!-test1 'E emit
        !           271:     \ fp@ 1e fp@ float+ = 'G + emit \ !! fp@
        !           272:     0 1 >r 0 = r> 1 = -1 -1 d= 'G + emit
        !           273:     rdrop-test 'G emit
        !           274:     0 1 2>r 'I 2r> 0 1 d= + emit
        !           275:     3 4 2>r 2r@ 2r> d= 'J + emit
        !           276:     5 6 2>r 7 8 2>r 2rdrop 2r> 5 6 d= 'K + emit
        !           277:     1 2 over 2 1 d= 1 -1 d= 'L + emit
        !           278:     1 2 3 drop 1 2 d= 'M + emit
        !           279:     1 2 swap 2 1 d= 'N + emit
        !           280:     1 dup 1 1 d= 'O + emit
        !           281:     1 2 3 rot 3 1 d= 2 -1 d= 'P + emit
        !           282:     1 2 3 -rot 1 2 d= 3 -1 d= 'Q + emit
        !           283:     1 2 3 nip 1 3 d= 'R + emit
        !           284:     1 2 tuck 1 2 d= 2 -1 d= 'S + emit
        !           285:     4 0 ?dup 4 0 d= 'T + emit
        !           286:     5 1 ?dup 1 1 d= 5 -1 d= 'U + emit
        !           287:     6 0 pick 6 6 d= 'V + emit
        !           288:     1 2 3 4 2drop 1 2 d= 'W + emit
        !           289:     7 1 2 2dup d= 7 -1 d= 'X + emit
        !           290:     8 1 2 3 4 2over 1 2 d= >r 3 4 d= >r 1 2 d= r> and r> and 8 -1 d= 'Y + emit
        !           291:     1 2 3 4 2swap 1 2 d= >r 3 4 d= r> -1 -1 d= 'Z + emit
        !           292:     9 1 2 3 4 5 6 2rot 1 2 d= >r 5 6 d= >r 3 4 d= r> and r> and 9 -1 d= '[ + emit
        !           293:     7 1 2 3 4 2nip 3 4 d= 7 -1 d= 'b + emit
        !           294:     8 1 2 3 4 2tuck 3 4 d= >r 1 2 d= >r 3 4 d= r> and r> and 8 -1 d= 'c + emit
        !           295:     cr
        !           296:     cellbuf @ 5 = 'b + emit
        !           297:     9 cellbuf ! 5 cellbuf @ 5 9 d= 'c + emit
        !           298:     -1 cellbuf +! cellbuf @ 8 = 'd + emit
        !           299:     -1 cellbuf ! cellbuf c@ $ff = 'e + emit
        !           300:     1 cellbuf c! cellbuf @ 1 <> 'f + emit
        !           301:     3 4 cellbuf 2! cellbuf @ 4 = 'g + emit
        !           302:     2 cellbuf ! cellbuf 2@ 3 2 d= 'h + emit
        !           303:     9 cellbuf cell+ ! cellbuf 2@ 9 2 d= 'i + emit
        !           304:     cellbuf 3 cells + @ 8 = 'j + emit
        !           305:     s" ijk" drop char+ c@ emit
        !           306:     s" ijk" drop 2 (chars) + c@ emit
        !           307:     c" ijkl" count 3 /string type
        !           308:     \ s" abc" 0 (f83find) 0= 'm + emit \ not in gforth-0.6.2
        !           309:     s" abc" 0 (listlfind) 0= 'n + emit
        !           310:     s" abc" 0 (hashlfind) 0= 'o + emit
        !           311:     s" abc" 0 (tablelfind) 0= 'p + emit
        !           312:     s" dfskdfjsdl" 5 (hashkey1) 32 u< 'n + emit
        !           313:     s"    bcde   " (parse-white) s" bcde" compare 'n + emit
        !           314:     1 aligned 0 cell+ = 'p + emit
        !           315:     1 faligned 0 float+ = 'q + emit
        !           316:     threading-method 2 u< 'r + emit
        !           317:     \ stdin key-file emit
        !           318:     stdin key-file emit
        !           319:     stdin key?-file 't + emit
        !           320:     stderr drop 't emit
        !           321:     form 2drop 'u emit
        !           322:     cbuf 20 flush-icache
        !           323:     \ (bye)
        !           324:     s" true" (system) 0 0 d= 'w + emit
        !           325:     s" ENVVAR" getenv s" bla" compare 'w + emit
        !           326:     s" grep -q bla" w/o open-pipe 0= 'y + emit >r
        !           327:     s" blabla" i write-file 0= 'z + emit r> close-pipe d0= 'B + emit
        !           328:     777 time&date 2drop 2drop 2drop 777 = 'C + emit
        !           329:     1 ms 'C emit
        !           330:     100 allocate 0= 'E + emit ( addr)
        !           331:     200 resize 0= 'F + emit  ( addr2)
        !           332:     free 0= 'G + emit
        !           333:     1 strerror 2drop 'G emit
        !           334:     1 strsignal 2drop 'H emit
        !           335:     \ call-c
        !           336:     s" prim" r/o open-file 0= 'J + emit >r
        !           337:     cbuf 100 i (read-line) 0= 'K + emit drop 'L + emit drop
        !           338:     i file-position 0= 'M + emit cellbuf 2!
        !           339:     cbuf 10 i read-file 0= 'N + emit 10 = 'O + emit
        !           340:     cellbuf 2@ i reposition-file 0= 'P + emit
        !           341:     cbuf 10 + dup 10 i read-file 0= 'Q + emit cbuf 10 compare 'Q + emit
        !           342:     i file-size 0= 'S + emit 2drop
        !           343:     i file-eof? 'a + emit
        !           344:     r> close-file 0= 'T + emit
        !           345:     s" /tmp/gforth')(|&;test" w/o create-file 0= 'U + emit >r
        !           346:     s" bla" i write-file 0= 'V + emit
        !           347:     i flush-file 0= 'W + emit
        !           348:     100. i resize-file 0= 'V + emit
        !           349:     r> close-file 0= 'W + emit
        !           350:     s" /tmp/gforth')(|&;test" s" /tmp/gforth'|&;test" rename-file 0= 'X + emit
        !           351:     s" /tmp/gforth'|&;test" delete-file 0= 'Y + emit
        !           352:     \ !! open-dir
        !           353:     \ !! read-dir
        !           354:     \ !! close-dir
        !           355:     \ !! filename-match
        !           356:     utime 2drop 'Y emit
        !           357:     cputime 2drop 2drop 'Z emit
        !           358:     \ !! all the FP stuff
        !           359:     \ !! all the locals stuff
        !           360:     \ !! syslib stuff
        !           361:     \ !! ffcall stuff
        !           362:     \ !! oldcall stuff
        !           363:     \ compiler stuff
        !           364:     ['] emit @ cellbuf !
        !           365:     ['] ;s threading-method 0= if @ then cellbuf >body !
        !           366:     cellbuf >body compile-prim1 'Y emit
        !           367:     finish-code 'Z emit
        !           368:     cellbuf execute 'a emit
        !           369:     \ !! forget-dyncode
        !           370:     cellbuf >body @ decompile-prim ['] ;s @ = 'c + emit
1.1       anton     371:     cr
1.2       anton     372:     depth (bye) ;
1.1       anton     373: 
                    374: \ Setup                                                13feb93py
                    375: 
                    376: has? header [IF]
                    377:     \ set image size
                    378:     here image-header 2 cells + !         
                    379:     \ set image entry point
                    380:     ' boot >body  image-header 8 cells + A!         
                    381: [ELSE]
                    382:     >boot
                    383: [THEN]
                    384: 
                    385: \ include ./../kernel/pass.fs                    \ pass pointers from cross to target
                    386: 
                    387: .unresolved                          \ how did we do?
                    388: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>