1 ! Copyright (C) 2007 Gavin Harrison
2 ! See http://factorcode.org/license.txt for BSD license.
4 USING: kernel math sequences kernel.private namespaces arrays
5 io io.files splitting io.binary math.functions vectors
6 quotations combinators.private ;
14 : call-nth ( n array -- )
15 >r >fixnum r> 2dup nth quotation?
16 [ dispatch ] [ "Not a quotation" throw ] if ; inline
18 : reg-val ( m -- n ) regs get nth ;
20 : set-reg ( val n -- ) regs get set-nth ;
22 : arr-val ( index loc -- z )
25 : set-arr ( val index loc -- )
26 arrays get nth set-nth ;
28 : get-op ( num -- op )
29 -28 shift BIN: 1111 bitand ;
31 : get-value ( platter -- register )
34 : >32bit ( m -- n ) HEX: ffffffff bitand ; inline
36 : get-a ( platter -- register )
37 -6 shift BIN: 111 bitand ; inline
39 : get-b ( platter -- register )
40 -3 shift BIN: 111 bitand ; inline
42 : get-c ( platter -- register )
43 BIN: 111 bitand ; inline
45 : get-cb ( platter -- b c ) [ get-c ] keep get-b ;
46 : get-cba ( platter -- c b a ) [ get-cb ] keep get-a ;
47 : get-special ( platter -- register )
48 -25 shift BIN: 111 bitand ; inline
51 get-cba rot reg-val zero? [
57 : binary-op ( quot -- ? )
59 swap >r >r [ reg-val ] 2apply swap r> call r>
63 [ swap arr-val ] binary-op ;
66 get-cba >r [ reg-val ] 2apply r> reg-val set-arr f ;
69 [ + >32bit ] binary-op ;
72 [ * >32bit ] binary-op ;
78 [ bitand HEX: ffffffff swap - ] binary-op ;
80 : new-array ( size location -- )
81 >r 0 <array> r> arrays get set-nth ;
83 : ?grow-storage ( -- )
84 open-arrays get dup empty? [
85 >r arrays get length r> push
92 get-cb >r reg-val open-arrays get pop [ new-array ] keep r>
96 get-c reg-val dup open-arrays get push
97 f swap arrays get set-nth f ;
99 : op10 ( opcode -- ? )
100 get-c reg-val write1 flush f ;
102 : op11 ( opcode -- ? )
105 : op12 ( opcode -- ? )
106 get-cb reg-val dup zero? [
109 arrays get [ nth clone 0 ] keep set-nth
110 ] if reg-val finger set f ;
112 : op13 ( opcode -- ? )
113 [ get-value ] keep get-special set-reg f ;
115 : advance ( -- val opcode )
116 finger get arrays get first nth
117 finger inc dup get-op ;
122 [ op0 ] [ op1 ] [ op2 ] [ op3 ]
123 [ op4 ] [ op5 ] [ op6 ] [ drop t ]
124 [ op8 ] [ op9 ] [ op10 ] [ op11 ]
128 : exec-loop ( bool -- )
129 [ run-op exec-loop ] unless ;
131 : load-platters ( path -- )
132 <file-reader> contents 4 group [ be> ] map
133 0 arrays get set-nth ;
137 2 16 ^ <vector> arrays set
139 V{ } clone open-arrays set
142 : run-prog ( path -- )
146 "extra/icfp/2006/sandmark.umz" resource-path run-prog ;