1 // TODO at least, use #include and #define, but #define would require me to start all over...
3 // no forward declarations
4 // Scheme-style hex literals
5 // no explicit casts (intermediate variables instead)
6 // removed functions that interact with the firmware, and with rom
7 // had some case labels that were not literals (but could have been constant folded) in the dispatch
9 /* typedef char int8; */
10 /* typedef short int16; */
11 /* typedef long int32; */
12 /* typedef unsigned char uint8; */
13 /* typedef unsigned short uint16; */
14 /* typedef unsigned long uint32; */
16 /* typedef uint8 word; */
18 /* typedef uint16 ram_addr; */
19 /* typedef uint16 rom_addr; */
40 void halt_with_error (){
45 /* typedef int16 obj; */
46 int8
rom_get (int16 a
){
47 return /* *(int8*) */a
; // TODO had rom, but caused problems
49 /* int8 ram_get_gc_tags (int16 o); */
50 /* int8 ram_get_gc_tag0 (int16 o); */
51 /* int8 ram_get_gc_tag1 (int16 o); */
52 /* void ram_set_gc_tags (int16 o, int8 tags); */
53 /* void ram_set_gc_tag0 (int16 o, int8 tag); */
54 /* void ram_set_gc_tag1 (int16 o, int8 tag); */
55 /* int8 ram_get_field0 (int16 o); */
56 /* int8 ram_get_field1 (int16 o); */
57 /* int8 ram_get_field2 (int16 o); */
58 /* int8 ram_get_field3 (int16 o); */
59 /* int8 ram_get_fieldn (int16 o, int8 n); */
60 /* void ram_set_field0 (int16 o, int8 val); */
61 /* void ram_set_field1 (int16 o, int8 val); */
62 /* void ram_set_field2 (int16 o, int8 val); */
63 /* void ram_set_field3 (int16 o, int8 val); */
64 /* void ram_set_fieldn (int16 o, int8 n, int8 val); */
65 /* int8 rom_get_field0 (int16 o); */
66 /* int8 rom_get_field1 (int16 o); */
67 /* int8 rom_get_field2 (int16 o); */
68 /* int8 rom_get_field3 (int16 o); */
69 int8
ram_get_gc_tags (int16 o
) {
71 return (*(((t2
<< 2))+#x200) & #x60);
73 int8
ram_get_gc_tag0 (int16 o
) {
75 return (*(((t2
<< 2))+#x200) & #x20);
77 int8
ram_get_gc_tag1 (int16 o
) {
79 return (*(((t2
<< 2))+#x200) & #x40);
81 void ram_set_gc_tags (int16 o
, int8 tags
) {
83 (*(((t2
<< 2) + (0))+#x200) = ((*(((t2 << 2) + (0))+#x200) & #x9f) | (tags)));
85 void ram_set_gc_tag0 (int16 o
, int8 tag
) {
87 *(((t2
<< 2) + (0))+#x200) = ((*(((t2 << 2) + (0))+#x200) & #xdf) | (tag));
89 void ram_set_gc_tag1 (int16 o
, int8 tag
) {
91 *(((t2
<< 2) + (0))+#x200) = ((*(((t2 << 2) + (0))+#x200) & #xbf) | (tag));
93 int8
ram_get_field0 (int16 o
) { int16 t2
= o
- 512; return *(((t2
<< 2) + (0))+#x200); }
94 int8
ram_get_field1 (int16 o
) { int16 t2
= o
- 512; return *(((t2
<< 2) + (1))+#x200); }
95 int8
ram_get_field2 (int16 o
) { int16 t2
= o
- 512; return *(((t2
<< 2) + (2))+#x200); }
96 int8
ram_get_field3 (int16 o
) { int16 t2
= o
- 512; return *(((t2
<< 2) + (3))+#x200); }
97 int8
ram_get_fieldn (int16 o
, int8 n
) {
99 case 0: return ram_get_field0 (o
);
100 case 1: return ram_get_field1 (o
);
101 case 2: return ram_get_field2 (o
);
102 case 3: return ram_get_field3 (o
);
105 void ram_set_field0 (int16 o
, int8 val
) { int16 t2
= o
- 512; *(((t2
<< 2) + (0))+#x200) = (val); }
106 void ram_set_field1 (int16 o
, int8 val
) { int16 t2
= o
- 512; *(((t2
<< 2) + (1))+#x200) = (val); }
107 void ram_set_field2 (int16 o
, int8 val
) { int16 t2
= o
- 512; *(((t2
<< 2) + (2))+#x200) = (val); }
108 void ram_set_field3 (int16 o
, int8 val
) { int16 t2
= o
- 512; *(((t2
<< 2) + (3))+#x200) = (val); }
109 void ram_set_fieldn (int16 o
, int8 n
, int8 val
) {
111 case 0: ram_set_field0 (o
, val
); break;
112 case 1: ram_set_field1 (o
, val
); break;
113 case 2: ram_set_field2 (o
, val
); break;
114 case 3: ram_set_field3 (o
, val
); break;
117 int8
rom_get_field0 (int16 o
) { int16 t2
= (o
) - (3 +255 - -1 +1); return rom_get (((t2
<< 2) + (#x5000 + 4 + (0)))); }
118 int8
rom_get_field1 (int16 o
) { int16 t2
= (o
) - (3 +255 - -1 +1); return rom_get (((t2
<< 2) + (#x5000 + 4 + (1)))); }
119 int8
rom_get_field2 (int16 o
) { int16 t2
= (o
) - (3 +255 - -1 +1); return rom_get (((t2
<< 2) + (#x5000 + 4 + (2)))); }
120 int8
rom_get_field3 (int16 o
) { int16 t2
= (o
) - (3 +255 - -1 +1); return rom_get (((t2
<< 2) + (#x5000 + 4 + (3)))); }
123 /* int16 ram_get_car (int16 o); */
124 /* int16 rom_get_car (int16 o); */
125 /* int16 ram_get_cdr (int16 o); */
126 /* int16 rom_get_cdr (int16 o); */
127 /* void ram_set_car (int16 o, int16 val); */
128 /* void ram_set_cdr (int16 o, int16 val); */
130 /* int16 ram_get_entry (int16 o); */
131 /* int16 rom_get_entry (int16 o); */
133 int16
ram_get_car (int16 o
)
134 { return ((ram_get_field0 (o
) & #x1f) << 8) | ram_get_field1 (o); }
135 int16
rom_get_car (int16 o
)
136 { return ((rom_get_field0 (o
) & #x1f) << 8) | rom_get_field1 (o); }
137 int16
ram_get_cdr (int16 o
)
138 { return ((ram_get_field2 (o
) & #x1f) << 8) | ram_get_field3 (o); }
139 int16
rom_get_cdr (int16 o
)
140 { return ((rom_get_field2 (o
) & #x1f) << 8) | rom_get_field3 (o); }
142 void ram_set_car (int16 o
, int16 val
) {
143 ram_set_field0 (o
, (val
>> 8) | (ram_get_field0 (o
) & #xe0));
144 ram_set_field1 (o
, val
& #xff);
146 void ram_set_cdr (int16 o
, int16 val
) {
147 ram_set_field2 (o
, (val
>> 8) | (ram_get_field2 (o
) & #xe0));
148 ram_set_field3 (o
, val
& #xff);
152 int16
ram_get_entry (int16 o
) {
153 return (((ram_get_field0 (o
) & #x1f) << 11)
154 | (ram_get_field1 (o
) << 3)
155 | (ram_get_field2 (o
) >> 5));
157 int16
rom_get_entry (int16 o
){
158 return (((rom_get_field0 (o
) & #x1f) << 11)
159 | (rom_get_field1 (o
) << 3)
160 | (rom_get_field2 (o
) >> 5));
164 /* int16 get_global (int8 i); */
165 /* void set_global (int8 i, int16 o); */
167 int16
get_global (int8 i
) {
170 return ram_get_cdr (512 + (i
>> 1));
172 return ram_get_car (512 + (i
>> 1));
174 void set_global (int8 i
, int16 o
) {
176 ram_set_cdr (512 + (i
>> 1), o
);
178 ram_set_car (512 + (i
>> 1), o
);
184 void mark (int16 temp
) {
190 if ((!((temp
) >= 4096) && ((temp
) >= 512))) {
200 if (((((ram_get_field0 (visit
) & #x80) == #x80) || ((ram_get_field0 (visit) & #xc0) == #x40) || ((ram_get_field0 (visit) & #xc0) == 0)) && ram_get_gc_tag0 (visit))
201 || (((((ram_get_field0 (visit
) & #x80) == #x80) && ((ram_get_field2 (visit) & #xe0) == 0)) || (((ram_get_field0 (visit) & #x80) == #x80) && ((ram_get_field2 (visit) & #xe0) == #x80)))
202 && (ram_get_gc_tags (visit
) != (0<<5))))
205 if (((((ram_get_field0 (visit
) & #x80) == #x80) && ((ram_get_field2 (visit) & #xe0) == 0)) || (((ram_get_field0 (visit) & #x80) == #x80) && ((ram_get_field2 (visit) & #xe0) == #x80)))) {
210 temp
= ram_get_cdr (visit
);
212 if ((!((temp
) >= 4096) && ((temp
) >= 512))) {
214 ram_set_gc_tags (visit
, (2<<5));
215 ram_set_cdr (visit
, stack
);
224 if ((((ram_get_field0 (visit
) & #x80) == #x80) || ((ram_get_field0 (visit) & #xc0) == #x40) || ((ram_get_field0 (visit) & #xc0) == 0))) {
230 if (((ram_get_field0 (visit
) & #xc0) == #x40))
231 temp
= ram_get_cdr (visit
);
233 temp
= ram_get_car (visit
);
235 if ((!((temp
) >= 4096) && ((temp
) >= 512))) {
237 ram_set_gc_tag0 (visit
, (1<<5));
238 if (((ram_get_field0 (visit
) & #xc0) == #x40))
239 ram_set_cdr (visit
, stack
);
241 ram_set_car (visit
, stack
);
251 ram_set_gc_tag0 (visit
, (1<<5));
259 if (((((ram_get_field0 (stack
) & #x80) == #x80) && ((ram_get_field2 (stack) & #xe0) == 0)) || (((ram_get_field0 (stack) & #x80) == #x80) && ((ram_get_field2 (stack) & #xe0) == #x80))) && ram_get_gc_tag1 (stack)) {
262 temp
= ram_get_cdr (stack
);
263 ram_set_cdr (stack
, visit
);
267 ram_set_gc_tag1(visit
, (0<<5));
273 if (((ram_get_field0 (stack
) & #xc0) == #x40)) {
277 temp
= ram_get_cdr (stack
);
278 ram_set_cdr (stack
, visit
);
287 temp
= ram_get_car (stack
);
288 ram_set_car (stack
, visit
);
312 while (visit
>= (512 + ((glovars
+ 1) >> 1))) {
314 if ((((ram_get_field0 (visit
) & #x80) == #x80)
315 && (ram_get_gc_tags (visit
) == (0<<5)))
316 || !(ram_get_gc_tags (visit
) & (1<<5))) {
318 if ((((ram_get_field0 (visit
) & #x80) == #x80) && ((ram_get_field2 (visit) & #xe0) == #x60))) {
320 int16 o
= ram_get_cdr (visit
);
321 int16 i
= ram_get_car (visit
);
322 ram_set_car (o
, free_list_vec
);
323 ram_set_cdr (o
, (i
+ 3) >> 2);
327 ram_set_car (visit
, free_list
);
331 if (((ram_get_field0 (visit
) & #x80) == #x80))
332 ram_set_gc_tags (visit
, (0<<5));
334 ram_set_gc_tag0 (visit
, (0<<5));
364 for (i
=0; i
<glovars
; i
++)
365 mark (get_global (i
));
371 int16
alloc_ram_cell () {
378 if (free_list
== 0) {
388 free_list
= ram_get_car (o
);
393 int16
alloc_ram_cell_init (int8 f0
, int8 f1
, int8 f2
, int8 f3
) {
394 int16 o
= alloc_ram_cell ();
396 ram_set_field0 (o
, f0
);
397 ram_set_field1 (o
, f1
);
398 ram_set_field2 (o
, f2
);
399 ram_set_field3 (o
, f3
);
404 int16
alloc_vec_cell (int16 n
) {
405 int16 o
= free_list_vec
;
414 while ((ram_get_cdr (o
) * 4) < n
) {
432 if (((ram_get_cdr(o
) * 4) - n
) < 4) {
434 ram_set_car (prec
, ram_get_car (o
));
436 free_list_vec
= ram_get_car (o
);
441 int16 new_free
= o
+ (n
+ 3) >> 2;
443 ram_set_car (prec
, new_free
);
445 free_list_vec
= new_free
;
446 ram_set_car (new_free
, ram_get_car (o
));
447 ram_set_cdr (new_free
, ram_get_cdr (o
) - (n
+ 3) >> 2);
455 /* typedef int16 integer; */
456 /* typedef int16 digit; */
457 /* typedef int32 two_digit; */
458 /* int16 make_integer (int16 lo, int16 hi); */
459 /* int16 integer_hi (int16 x); */
460 /* int16 integer_lo (int16 x); */
461 int16
make_integer (int16 lo
, int16 hi
) {
462 return alloc_ram_cell_init (0 | (hi
>> 8), hi
, lo
>> 8, lo
);
465 int16
integer_hi (int16 x
) {
466 if ((!((x
) >= 4096) && ((x
) >= 512)))
467 return ram_get_car (x
);
468 else if ((!((x
) >= 4096) && !(!((x
) >= 4096) && ((x
) >= 512)) && ((x
) >= (3 +255 - -1 +1))))
469 return rom_get_car (x
);
470 else if (x
< (3 - -1)){
471 return ((0 + (3 - -1))-1);
474 return (0 + (3 - -1));
478 int16
integer_lo (int16 x
) {
479 int16 t
= ram_get_field2 (x
);
480 if ((!((x
) >= 4096) && ((x
) >= 512)))
481 return (t
<< 8) + ram_get_field3 (x
);
482 else if ((!((x
) >= 4096) && !(!((x
) >= 4096) && ((x
) >= 512)) && ((x
) >= (3 +255 - -1 +1))))
483 return (t
<< 8) + rom_get_field3 (x
);
489 /* int16 norm (int16 prefix, int16 n); */
490 /* int8 negp (int16 x); */
491 /* int8 cmp (int16 x, int16 y); */
492 /* int16 integer_length (int16 x); */
493 /* int16 shr (int16 x); */
494 /* int16 negative_carry (int16 carry); */
495 /* int16 shl (int16 x); */
496 /* int16 shift_left (int16 x, int16 n); */
497 /* int16 add (int16 x, int16 y); */
498 /* int16 invert (int16 x); */
499 /* int16 sub (int16 x, int16 y); */
500 /* int16 neg (int16 x); */
501 /* int16 scale (int16 n, int16 x); */
502 /* int16 mulnonneg (int16 x, int16 y); */
503 /* int16 divnonneg (int16 x, int16 y); */
505 int32
decode_int (int16 o
) {
510 if (o
<= (3 + (255 - -1)))
511 return (o
- (3 - -1));
513 if ((!((o
) >= 4096) && ((o
) >= 512))) {
514 if (!((ram_get_field0 (o
) & #xc0) == 0))
516 return ram_get_field3 (o
);
518 else if ((!((o
) >= 4096) && !(!((o
) >= 4096) && ((o
) >= 512)) && ((o
) >= (3 +255 - -1 +1)))) {
519 if (!((rom_get_field0 (o
) & #xc0) == 0))
521 return rom_get_field3 (o
);
527 /* int32 decode_int (int16 o); */
528 /* int16 encode_int (int32 n); */
530 int16
norm (int16 prefix
, int16 n
) {
534 while (prefix
!= 0) {
535 int16 d
= integer_lo (prefix
);
538 prefix
= integer_hi (temp
);
540 if (((n
) == ((0 + (3 - -1))))) {
546 else if (((n
) == (((0 + (3 - -1))-1)))) {
547 if (d
>= (1<<16) + -1) {
548 int16 t
= d
- (1 << 16);
554 ram_set_car (temp
, n
);
561 int8
negp (int16 x
) {
566 if (((x
) == ((0 + (3 - -1))))) return 0;
567 } while (!((x
) == (((0 + (3 - -1))-1))));
572 int8
cmp (int16 x
, int16 y
) {
580 if (((x
) == ((0 + (3 - -1)))) || ((x
) == (((0 + (3 - -1))-1)))) {
582 { if (negp (y
)) result
= 1; else result
= -1; }
586 if (((y
) == ((0 + (3 - -1)))) || ((y
) == (((0 + (3 - -1))-1)))) {
587 if (negp (x
)) result
= -1; else result
= 1;
591 xlo
= integer_lo (x
);
592 ylo
= integer_lo (y
);
596 { if (xlo
< ylo
) result
= -1; else result
= 1; }
601 int16
integer_length (int16 x
) {
609 while (!(((next
= integer_hi (x
))) == ((0 + (3 - -1))))) {
624 int16
shr (int16 x
) {
631 if (((x
) == ((0 + (3 - -1)))) || ((x
) == (((0 + (3 - -1))-1)))) {
632 result
= norm (result
, x
);
638 result
= make_integer ((d
>> 1) |
639 ((integer_lo (x
) & 1) ? (1<<15) : 0), // TODO only shifting by literals is permitted, so had to change the 16 -1 to 15
646 int16
negative_carry (int16 carry
) {
648 return ((0 + (3 - -1))-1);
650 return (0 + (3 - -1));
653 int16
shl (int16 x
) {
656 int16 negc
= (0 + (3 - -1));
662 if (((x
) == (negc
))) {
663 result
= norm (result
, x
);
670 negc
= negative_carry (d
& (1<<15));
671 result
= make_integer ((d
<< 1) | ((temp
) == (3)), result
); // TODO was ((0 + (3 - -1))-1)
677 int16
shift_left (int16 x
, int16 n
) {
680 if (((x
) == ((0 + (3 - -1)))))
683 while (n
& (16 -1)) {
689 x
= make_integer (0, x
);
696 int16
add (int16 x
, int16 y
) {
699 int16 negc
= (0 + (3 - -1));
705 if (((x
) == (negc
))) {
706 result
= norm (result
, y
);
710 if (((y
) == (negc
))) {
711 result
= norm (result
, x
);
719 if (((negc
) == ((0 + (3 - -1)))))
720 negc
= negative_carry (dx
< dy
);
723 negc
= negative_carry (dx
<= dy
);
729 result
= make_integer (dx
, result
);
735 int16
invert (int16 x
) {
736 if (((x
) == ((0 + (3 - -1)))))
737 return ((0 + (3 - -1))-1);
739 return (0 + (3 - -1));
742 int16
sub (int16 x
, int16 y
) {
744 int16 negc
= ((0 + (3 - -1))-1);
750 if (((x
) == (negc
)) && (((y
) == ((0 + (3 - -1)))) || ((y
) == (((0 + (3 - -1))-1))))) {
751 result
= norm (result
, invert (y
));
755 if (((y
) == (invert (negc
)))) {
756 result
= norm (result
, x
);
761 dy
= ~integer_lo (y
);
764 if (((negc
) == ((0 + (3 - -1)))))
765 negc
= negative_carry (dx
< dy
);
768 negc
= negative_carry (dx
<= dy
);
774 result
= make_integer (dx
, result
);
780 int16
neg (int16 x
) {
783 return sub ((0 + (3 - -1)), x
);
786 int16
scale (int16 n
, int16 x
) {
793 if ((n
== 0) || ((x
) == ((0 + (3 - -1)))))
794 return (0 + (3 - -1));
803 if (((x
) == ((0 + (3 - -1))))){
805 result
= norm (result
, (carry
+ (3 - -1)));
807 result
= norm (result
, make_integer (carry
, (0 + (3 - -1))));
811 if (((x
) == (((0 + (3 - -1))-1)))) {
813 if (carry
>= ((1<<16) + -1))
814 result
= norm (result
, ((carry
& #xff) + (3 - -1)));
816 result
= norm (result
, make_integer (carry
, ((0 + (3 - -1))-1)));
820 int32 tmp1
= integer_lo (x
);
821 m
= tmp1
* n
+ carry
;
826 result
= make_integer (tmp2
, result
);
832 int16
mulnonneg (int16 x
, int16 y
) {
837 int16 s
= scale (integer_lo (x
), y
);
840 result
= make_integer (integer_lo (s
), result
);
844 if (((x
) == ((0 + (3 - -1)))))
847 s
= add (s
, scale (integer_lo (x
), y
));
850 return norm (result
, s
);
854 int16
divnonneg (int16 x
, int16 y
) {
858 int16 result
= (0 + (3 - -1));
859 int16 lx
= integer_length (x
);
860 int16 ly
= integer_length (y
);
865 y
= shift_left (y
, lx
);
868 result
= shl (result
);
869 if (cmp (x
, y
) >= 0) {
871 result
= add (((0 + (3 - -1))+1), result
);
880 int16
bitwise_ior (int16 x
, int16 y
) {
886 if (((x
) == ((0 + (3 - -1)))))
887 return norm(result
, y
);
888 if (((x
) == (((0 + (3 - -1))-1))))
889 return norm(result
, x
);
890 result
= make_integer(integer_lo(x
) | integer_lo(y
),
897 int16
bitwise_xor (int16 x
, int16 y
) {
903 if (((x
) == ((0 + (3 - -1)))))
904 return norm(result
, y
);
905 if (((x
) == (((0 + (3 - -1))-1))))
906 return norm(result
, x
);
907 result
= make_integer(integer_lo(x
) ^ integer_lo(y
),
916 int16
encode_int (int32 n
) {
917 if (n
>= -1 && n
<= 255) {
919 return (tmp
+ (3 - -1));
922 return alloc_ram_cell_init (0, (0 + (3 - -1)), n
>> 8, n
);
924 void decode_2_int_args () {
925 a1
= decode_int (arg1
);
926 a2
= decode_int (arg2
);
933 void prim_numberp () {
935 && arg1
<= (3 + (255 - -1)))
938 if ((!((arg1
) >= 4096) && ((arg1
) >= 512))){
939 arg1
= (ram_get_field0 (arg1
) & #xc0) == 0;
941 else if ((!((arg1
) >= 4096) && !(!((arg1
) >= 4096) && ((arg1
) >= 512)) && ((arg1
) >= (3 +255 - -1 +1))))
942 arg1
= (rom_get_field0 (arg1
) & #xc0) == 0;
949 arg1
= add (arg1
, arg2
);
959 arg1
= sub (arg1
, arg2
);
971 arg1
= mulnonneg (a1
? neg(arg1
) : arg1
,
972 a2
? neg(arg2
) : arg2
);
984 if (((arg2
) == (((0) + (3 - -1)))))
988 arg1
= divnonneg (a1
? neg(arg1
) : arg1
,
989 a2
? neg(arg2
) : arg2
);
1003 if (((arg2
) == (((0) + (3 - -1)))))
1005 if (negp(arg1
) || negp(arg2
))
1009 arg3
= divnonneg (arg1
, arg2
);
1010 arg4
= mulnonneg (arg2
, arg3
);
1011 arg1
= sub(arg1
, arg4
);
1034 arg1
= ((cmp (arg1
, arg2
) == 0));
1044 arg1
= ((cmp (arg1
, arg2
) < 0));
1054 arg1
= ((cmp (arg1
, arg2
) > 0));
1064 arg1
= ((cmp (arg1
, arg2
) <= 0));
1075 arg1
= ((cmp (arg1
, arg2
) >= 0));
1085 arg1
= bitwise_ior(arg1
, arg2
);
1095 arg1
= bitwise_xor(arg1
, arg2
);
1109 void prim_pairp () {
1110 if ((!((arg1
) >= 4096) && ((arg1
) >= 512)))
1111 arg1
= (((((ram_get_field0 (arg1
) & #x80) == #x80) && ((ram_get_field2 (arg1) & #xe0) == 0))));
1112 else if ((!((arg1
) >= 4096) && !(!((arg1
) >= 4096) && ((arg1
) >= 512)) && ((arg1
) >= (3 +255 - -1 +1))))
1113 arg1
= (((((rom_get_field0 (arg1
) & #x80) == #x80) && ((rom_get_field2 (arg1) & #xe0) == 0))));
1118 int16
cons (int16 car
, int16 cdr
) {
1119 return alloc_ram_cell_init (#x80 | (car >> 8),
1126 arg1
= cons (arg1
, arg2
);
1131 if ((!((arg1
) >= 4096) && ((arg1
) >= 512))) {
1132 if (!(((ram_get_field0 (arg1
) & #x80) == #x80) && ((ram_get_field2 (arg1) & #xe0) == 0)))
1134 arg1
= ram_get_car (arg1
);
1136 else if ((!((arg1
) >= 4096) && !(!((arg1
) >= 4096) && ((arg1
) >= 512)) && ((arg1
) >= (3 +255 - -1 +1)))) {
1137 if (!(((rom_get_field0 (arg1
) & #x80) == #x80) && ((rom_get_field2 (arg1) & #xe0) == 0)))
1139 arg1
= rom_get_car (arg1
);
1146 if ((!((arg1
) >= 4096) && ((arg1
) >= 512))) {
1147 if (!(((ram_get_field0 (arg1
) & #x80) == #x80) && ((ram_get_field2 (arg1) & #xe0) == 0)))
1149 arg1
= ram_get_cdr (arg1
);
1151 else if ((!((arg1
) >= 4096) && !(!((arg1
) >= 4096) && ((arg1
) >= 512)) && ((arg1
) >= (3 +255 - -1 +1)))) {
1152 if (!(((rom_get_field0 (arg1
) & #x80) == #x80) && ((rom_get_field2 (arg1) & #xe0) == 0)))
1154 arg1
= rom_get_cdr (arg1
);
1160 void prim_set_car () {
1161 if ((!((arg1
) >= 4096) && ((arg1
) >= 512))) {
1162 if (!(((ram_get_field0 (arg1
) & #x80) == #x80) && ((ram_get_field2 (arg1) & #xe0) == 0)))
1165 ram_set_car (arg1
, arg2
);
1173 void prim_set_cdr () {
1174 if ((!((arg1
) >= 4096) && ((arg1
) >= 512))) {
1175 if (!(((ram_get_field0 (arg1
) & #x80) == #x80) && ((ram_get_field2 (arg1) & #xe0) == 0)))
1178 ram_set_cdr (arg1
, arg2
);
1186 void prim_nullp () {
1187 arg1
= ((arg1
== 2));
1194 void prim_u8vectorp () {
1195 if ((!((arg1
) >= 4096) && ((arg1
) >= 512)))
1196 arg1
= (((((ram_get_field0 (arg1
) & #x80) == #x80) && ((ram_get_field2 (arg1) & #xe0) == #x60))));
1197 else if ((!((arg1
) >= 4096) && !(!((arg1
) >= 4096) && ((arg1
) >= 512)) && ((arg1
) >= (3 +255 - -1 +1))))
1198 arg1
= (((((rom_get_field0 (arg1
) & #x80) == #x80) && ((rom_get_field2 (arg1) & #xe0) == #x60))));
1203 void prim_make_u8vector () {
1204 decode_2_int_args ();
1209 arg3
= alloc_vec_cell (a1
);
1210 arg1
= alloc_ram_cell_init (#x80 | (a1 >> 8),
1211 a1
& #xff, #x60 | (arg3 >> 8),
1216 ram_set_field0 (arg3
, a2
);
1217 ram_set_field1 (arg3
, a2
);
1218 ram_set_field2 (arg3
, a2
);
1219 ram_set_field3 (arg3
, a2
);
1224 void prim_u8vector_ref () {
1225 a2
= decode_int (arg2
);
1227 if ((!((arg1
) >= 4096) && ((arg1
) >= 512))) {
1228 if (!(((ram_get_field0 (arg1
) & #x80) == #x80) && ((ram_get_field2 (arg1) & #xe0) == #x60)))
1230 if ((ram_get_car (arg1
) <= a2
) || (a2
< 0))
1232 arg1
= ram_get_cdr (arg1
);
1234 else if ((!((arg1
) >= 4096) && !(!((arg1
) >= 4096) && ((arg1
) >= 512)) && ((arg1
) >= (3 +255 - -1 +1)))) {
1235 if (!(((rom_get_field0 (arg1
) & #x80) == #x80) && ((rom_get_field2 (arg1) & #xe0) == #x60)))
1237 if ((rom_get_car (arg1
) <= a2
) || (a2
< 0))
1239 arg1
= rom_get_cdr (arg1
);
1244 if (((arg1
) >= 4096)) {
1248 arg1
= encode_int (ram_get_fieldn (arg1
, a2
));
1252 arg1
= rom_get_cdr (arg1
);
1255 arg1
= rom_get_car (arg1
);
1263 void prim_u8vector_set () {
1264 a2
= decode_int (arg2
);
1265 a3
= decode_int (arg3
);
1270 if ((!((arg1
) >= 4096) && ((arg1
) >= 512))) {
1271 if (!(((ram_get_field0 (arg1
) & #x80) == #x80) && ((ram_get_field2 (arg1) & #xe0) == #x60)))
1273 if ((ram_get_car (arg1
) <= a2
) || (a2
< 0))
1275 arg1
= ram_get_cdr (arg1
);
1283 ram_set_fieldn (arg1
, a2
, a3
);
1290 void prim_u8vector_length () {
1291 if ((!((arg1
) >= 4096) && ((arg1
) >= 512))) {
1292 if (!(((ram_get_field0 (arg1
) & #x80) == #x80) && ((ram_get_field2 (arg1) & #xe0) == #x60)))
1294 arg1
= encode_int (ram_get_car (arg1
));
1296 else if ((!((arg1
) >= 4096) && !(!((arg1
) >= 4096) && ((arg1
) >= 512)) && ((arg1
) >= (3 +255 - -1 +1)))) {
1297 if (!(((rom_get_field0 (arg1
) & #x80) == #x80) && ((rom_get_field2 (arg1) & #xe0) == #x60)))
1299 arg1
= encode_int (rom_get_car (arg1
));
1305 void prim_u8vector_copy () {
1309 a1
= decode_int (arg2
);
1310 a2
= decode_int (arg4
);
1311 a3
= decode_int (arg5
);
1314 if ((!((arg1
) >= 4096) && ((arg1
) >= 512)) && (!((arg3
) >= 4096) && ((arg3
) >= 512))) {
1315 if (!(((ram_get_field0 (arg1
) & #x80) == #x80) && ((ram_get_field2 (arg1) & #xe0) == #x60)) || !(((ram_get_field0 (arg3) & #x80) == #x80) && ((ram_get_field2 (arg3) & #xe0) == #x60)))
1317 if ((ram_get_car (arg1
) < (a1
+ a3
)) || (a1
< 0) ||
1318 (ram_get_car (arg3
) < (a2
+ a3
)) || (a2
< 0))
1322 arg1
= ram_get_cdr (arg1
);
1325 arg3
= ram_get_cdr (arg3
);
1331 ram_set_fieldn (arg3
, a2
, ram_get_fieldn (arg1
, a1
));
1342 else if ((!((arg1
) >= 4096) && !(!((arg1
) >= 4096) && ((arg1
) >= 512)) && ((arg1
) >= (3 +255 - -1 +1))) && (!((arg3
) >= 4096) && ((arg3
) >= 512))) {
1343 if (!(((rom_get_field0 (arg1
) & #x80) == #x80) && ((rom_get_field2 (arg1) & #xe0) == #x60)) || !(((ram_get_field0 (arg3) & #x80) == #x80) && ((ram_get_field2 (arg3) & #xe0) == #x60)))
1345 if ((rom_get_car (arg1
) < (a1
+ a3
)) || (a1
< 0) ||
1346 (ram_get_car (arg3
) < (a2
+ a3
)) || (a2
< 0))
1349 arg1
= rom_get_cdr (arg1
);
1351 arg1
= rom_get_cdr (arg1
);
1353 arg3
= ram_get_cdr (arg3
);
1358 ram_set_fieldn (arg3
, a2
, decode_int (rom_get_car (arg1
)));
1360 arg1
= rom_get_cdr (arg1
);
1381 arg1
= ((arg1
== arg2
));
1386 arg1
= ((arg1
== 0));
1389 void prim_symbolp () {
1390 if ((!((arg1
) >= 4096) && ((arg1
) >= 512)))
1391 arg1
= (((((ram_get_field0 (arg1
) & #x80) == #x80) && ((ram_get_field2 (arg1) & #xe0) == #x20))));
1392 else if ((!((arg1
) >= 4096) && !(!((arg1
) >= 4096) && ((arg1
) >= 512)) && ((arg1
) >= (3 +255 - -1 +1))))
1393 arg1
= (((((rom_get_field0 (arg1
) & #x80) == #x80) && ((rom_get_field2 (arg1) & #xe0) == #x20))));
1398 void prim_stringp () {
1399 if ((!((arg1
) >= 4096) && ((arg1
) >= 512)))
1400 arg1
= (((((ram_get_field0 (arg1
) & #x80) == #x80) && ((ram_get_field2 (arg1) & #xe0) == #x40))));
1401 else if ((!((arg1
) >= 4096) && !(!((arg1
) >= 4096) && ((arg1
) >= 512)) && ((arg1
) >= (3 +255 - -1 +1))))
1402 arg1
= (((((rom_get_field0 (arg1
) & #x80) == #x80) && ((rom_get_field2 (arg1) & #xe0) == #x40))));
1407 void prim_string2list () {
1408 if ((!((arg1
) >= 4096) && ((arg1
) >= 512))) {
1409 if (!(((ram_get_field0 (arg1
) & #x80) == #x80) && ((ram_get_field2 (arg1) & #xe0) == #x40)))
1412 arg1
= ram_get_car (arg1
);
1414 else if ((!((arg1
) >= 4096) && !(!((arg1
) >= 4096) && ((arg1
) >= 512)) && ((arg1
) >= (3 +255 - -1 +1)))) {
1415 if (!(((rom_get_field0 (arg1
) & #x80) == #x80) && ((rom_get_field2 (arg1) & #xe0) == #x40)))
1418 arg1
= rom_get_car (arg1
);
1424 void prim_list2string () {
1425 arg1
= alloc_ram_cell_init (#x80 | ((arg1 & #x1f00) >> 8),
1430 void prim_booleanp () {
1431 arg1
= ((arg1
< 2));
1438 void prim_print () {
1446 int32
read_clock () {
1450 /* now = from_now( 0 ); */
1454 void prim_clock () {
1455 arg1
= encode_int (read_clock ());
1458 void prim_motor () {
1459 decode_2_int_args ();
1461 if (a1
< 1 || a1
> 2 || a2
< -100 || a2
> 100)
1465 /* MOTOR_set( a1, a2 ); */
1479 decode_2_int_args ();
1480 a3
= decode_int (arg3
);
1482 if (a1
< 1 || a1
> 3 || a2
< 0 || a3
< 0)
1486 /* LED_set( a1, a2, a3 ); */
1500 void prim_led2_color () {
1501 a1
= decode_int (arg1
);
1503 if (a1
< 0 || a1
> 1)
1507 /* LED2_color_set( a1 ); */
1519 void prim_getchar_wait () {
1520 decode_2_int_args();
1521 a1
= read_clock () + a1
;
1523 if (a1
< 0 || a2
< 1 || a2
> 3)
1529 /* serial_port_set ports; */
1530 /* ports = serial_rx_wait_with_timeout( a2, a1 ); */
1531 /* if (ports != 0) */
1532 /* arg1 = encode_int (serial_rx_read( ports )); */
1537 void prim_putchar () {
1538 decode_2_int_args ();
1540 if (a1
< 0 || a1
> 255 || a2
< 1 || a2
> 3)
1544 /* serial_tx_write( a2, a1 ); */
1558 decode_2_int_args ();
1560 if (a1
< 1 || a1
> 255 || a2
< 0)
1564 /* beep( a1, from_now( a2 ) ); */
1580 a1
= decode_int (arg1
);
1582 if (a1
< 1 || a1
> 3)
1586 /* x = adc( a1 ); */
1587 arg1
= encode_int (x
);
1590 void prim_sernum () {
1594 /* x = serial_num (); */
1601 arg1
= encode_int (x
);
1608 void prim_network_init () {
1616 void prim_network_cleanup () {
1622 void prim_receive_packet_to_u8vector () {
1624 if (!(((ram_get_field0 (arg1
) & #x80) == #x80) && ((ram_get_field2 (arg1) & #xe0) == #x60)))
1628 void prim_send_packet_from_u8vector () {
1632 if (!(((ram_get_field0 (arg1
) & #x80) == #x80) && ((ram_get_field2 (arg1) & #xe0) == #x60)))
1635 a2
= decode_int (arg2
);
1639 if (ram_get_car (arg1
) < a2
)
1642 arg1
= ram_get_cdr (arg1
);
1646 /* void push_arg1 (); */
1648 /* void pop_procedure (); */
1649 /* void handle_arity_and_rest_param (); */
1650 /* void build_env (); */
1651 /* void save_cont (); */
1652 /* void interpreter (); */
1655 env
= cons (arg1
, env
);
1660 int16 o
= ram_get_car (env
);
1661 env
= ram_get_cdr (env
);
1665 void pop_procedure () {
1668 if ((!((arg1
) >= 4096) && ((arg1
) >= 512))) {
1669 if (!((ram_get_field0 (arg1
) & #xc0) == #x40))
1672 entry
= ram_get_entry (arg1
) + #x5000;
1674 else if ((!((arg1
) >= 4096) && !(!((arg1
) >= 4096) && ((arg1
) >= 512)) && ((arg1
) >= (3 +255 - -1 +1)))) {
1675 if (!((rom_get_field0 (arg1
) & #xc0) == #x40))
1678 entry
= rom_get_entry (arg1
) + #x5000;
1684 void handle_arity_and_rest_param () {
1687 np
= rom_get (entry
++);
1689 if ((np
& #x80) == 0) {
1704 arg3
= cons (arg4
, arg3
);
1710 arg1
= cons (arg3
, arg1
);
1719 arg1
= cons (arg3
, arg1
);
1729 arg3
= alloc_ram_cell_init (#x40 | (pc >> 11),
1731 ((pc
& #x0007) << 5) | (env >> 8),
1733 cont
= alloc_ram_cell_init (#x80 | (cont >> 8),
1734 cont
& #xff, #x80 | (arg3 >> 8),
1739 void init_ram_heap () {
1745 while (o
> (512 + (glovars
+ 1) >> 1)) {
1748 ram_set_gc_tags (o
, (0<<5));
1749 ram_set_car (o
, free_list
);
1754 free_list_vec
= 4096;
1755 ram_set_car (free_list_vec
, 0);
1759 ram_set_cdr (free_list_vec
, ((8191 - 4096 + 1)*4) >> 2);
1761 for (i
=0; i
<glovars
; i
++)
1773 void interpreter () {
1774 int16 tmp
= rom_get (#x5000 +2) << 2;
1775 pc
= (#x5000 + 4) + tmp;
1777 glovars
= rom_get (#x5000 +3);
1781 dispatch
: ; bytecode
= rom_get (pc
++); bytecode_hi4
= bytecode
& #xf0; bytecode_lo4 = bytecode & #x0f; switch (bytecode_hi4 >> 4) {;
1784 case 0: // TODO used to be #x00 >> 4
1788 arg1
= bytecode_lo4
;
1798 arg1
= bytecode_lo4
+16;
1811 while (bytecode_lo4
!= 0) {
1812 arg1
= ram_get_cdr (arg1
);
1816 arg1
= ram_get_car (arg1
);
1831 while (bytecode_lo4
!= 0) {
1832 arg1
= ram_get_cdr (arg1
);
1836 arg1
= ram_get_car (arg1
);
1847 arg1
= get_global (bytecode_lo4
);
1858 set_global (bytecode_lo4
, pop());
1870 handle_arity_and_rest_param ();
1889 handle_arity_and_rest_param ();
1902 switch (bytecode_lo4
) {
1904 bytecode
= rom_get (pc
++);
1907 bytecode
= rom_get (pc
++);
1912 entry
= (arg2
<< 8) + bytecode
+ #x5000;
1915 na
= rom_get (entry
++);
1929 bytecode
= rom_get (pc
++);
1932 bytecode
= rom_get (pc
++);
1937 entry
= (arg2
<< 8) + bytecode
+ #x5000;
1940 na
= rom_get (entry
++);
1953 bytecode
= rom_get (pc
++);
1956 bytecode
= rom_get (pc
++);
1961 pc
= (arg2
<< 8) + bytecode
+ #x5000;
1966 bytecode
= rom_get (pc
++);
1969 bytecode
= rom_get (pc
++);
1975 pc
= (arg2
<< 8) + bytecode
+ #x5000;
1980 bytecode
= rom_get (pc
++);
1983 bytecode
= rom_get (pc
++);
1989 entry
= (arg2
<< 8) | bytecode
;
1991 arg1
= alloc_ram_cell_init (#x40 | (arg2 >> 3),
1992 ((arg2
& #x07) << 5) | (bytecode >> 3),
1993 ((bytecode
) << 5) |((arg3 ἀ) >>8),
2004 bytecode
= rom_get (pc
++);
2009 entry
= pc
+ bytecode
+ #x5000;
2012 na
= rom_get (entry
++);
2025 bytecode
= rom_get (pc
++);
2030 entry
= pc
+ bytecode
+ #x5000;
2033 na
= rom_get (entry
++);
2045 bytecode
= rom_get (pc
++);
2049 pc
= pc
+ bytecode
+ #x5000;
2054 bytecode
= rom_get (pc
++);
2060 pc
= pc
+ bytecode
+ #x5000;
2065 bytecode
= rom_get (pc
++);
2071 entry
= pc
+ bytecode
;
2073 arg1
= alloc_ram_cell_init (#x40 | (arg2 >> 3),
2074 ((arg2
& #x07) << 5) | (bytecode >> 3),
2075 ((bytecode
) <<5) |((arg3 ἀ) >>8),
2084 bytecode
= rom_get (pc
++);
2088 arg1
= get_global (bytecode
);
2095 bytecode
= rom_get (pc
++);
2099 set_global (bytecode
, pop());
2111 bytecode
= rom_get (pc
++);
2115 arg1
= (bytecode_lo4
<< 8) | bytecode
;
2135 switch (bytecode_lo4
) {
2137 arg1
= pop(); prim_numberp (); push_arg1 (); break;
2139 arg2
= pop(); arg1
= pop(); prim_add (); push_arg1 (); break;
2141 arg2
= pop(); arg1
= pop(); prim_sub (); push_arg1 (); break;
2143 arg2
= pop(); arg1
= pop(); prim_mul (); push_arg1 (); break;
2145 arg2
= pop(); arg1
= pop(); prim_div (); push_arg1 (); break;
2147 arg2
= pop(); arg1
= pop(); prim_rem (); push_arg1 (); break;
2149 arg1
= pop(); prim_neg (); push_arg1 (); break;
2151 arg2
= pop(); arg1
= pop(); prim_eq (); push_arg1 (); break;
2153 arg2
= pop(); arg1
= pop(); prim_lt (); push_arg1 (); break;
2155 arg2
= pop(); arg1
= pop(); prim_leq (); push_arg1 (); break;
2157 arg2
= pop(); arg1
= pop(); prim_gt (); push_arg1 (); break;
2159 arg2
= pop(); arg1
= pop(); prim_geq (); push_arg1 (); break;
2161 arg1
= pop(); prim_pairp (); push_arg1 (); break;
2163 arg2
= pop(); arg1
= pop(); prim_cons (); push_arg1 (); break;
2165 arg1
= pop(); prim_car (); push_arg1 (); break;
2167 arg1
= pop(); prim_cdr (); push_arg1 (); break;
2177 switch (bytecode_lo4
) {
2179 arg2
= pop(); arg1
= pop(); prim_set_car (); break;
2181 arg2
= pop(); arg1
= pop(); prim_set_cdr (); break;
2183 arg1
= pop(); prim_nullp (); push_arg1 (); break;
2185 arg2
= pop(); arg1
= pop(); prim_eqp (); push_arg1 (); break;
2187 arg1
= pop(); prim_not (); push_arg1 (); break;
2204 handle_arity_and_rest_param ();
2219 arg2
= ram_get_cdr (cont
);
2221 pc
= ram_get_entry (arg2
);
2223 env
= ram_get_cdr (arg2
);
2224 cont
= ram_get_car (cont
);
2235 arg1
= pop(); prim_symbolp (); push_arg1 (); break;
2238 arg1
= pop(); prim_stringp (); push_arg1 (); break;
2241 arg1
= pop(); prim_string2list (); push_arg1 (); break;
2244 arg1
= pop(); prim_list2string (); push_arg1 (); break;
2247 arg2
= pop(); arg1
= pop(); prim_make_u8vector (); push_arg1 (); break;
2250 arg2
= pop(); arg1
= pop(); prim_u8vector_ref (); push_arg1 (); break;
2253 arg3
= pop(); arg2
= pop(); arg1
= pop(); prim_u8vector_set (); break;
2263 switch (bytecode_lo4
) {
2271 prim_clock (); push_arg1 (); break;
2274 arg2
= pop(); arg1
= pop(); prim_motor (); break;
2277 arg3
= pop(); arg2
= pop(); arg1
= pop(); prim_led (); ;break;
2280 arg1
= pop(); prim_led2_color (); break;
2283 arg2
= pop(); arg1
= pop(); prim_getchar_wait (); push_arg1 (); break;
2286 arg2
= pop(); arg1
= pop(); prim_putchar (); break;
2289 arg2
= pop(); arg1
= pop(); prim_beep (); break;
2292 arg1
= pop(); prim_adc (); push_arg1 (); break;
2295 arg1
= pop(); prim_u8vectorp (); push_arg1 (); break;
2298 prim_sernum (); push_arg1 (); break;
2301 arg1
= pop(); prim_u8vector_length (); push_arg1 (); break;
2304 arg5
= pop(); arg4
= pop(); arg3
= pop(); arg2
= pop(); arg1
= pop();
2305 prim_u8vector_copy (); break;
2320 arg2
= ram_get_cdr (cont
);
2321 pc
= ram_get_entry (arg2
);
2322 env
= ram_get_cdr (arg2
);
2323 cont
= ram_get_car (cont
);
2337 switch (bytecode_lo4
) {
2340 arg1
= pop(); prim_booleanp (); push_arg1 (); break;
2343 prim_network_init (); break;
2346 prim_network_cleanup (); break;
2349 arg1
= pop(); prim_receive_packet_to_u8vector (); push_arg1 (); break;
2352 arg2
= pop(); arg1
= pop(); prim_send_packet_from_u8vector ();
2353 push_arg1 (); break;
2355 arg2
= pop(); arg1
= pop(); prim_ior (); push_arg1 (); break;
2358 arg2
= pop(); arg1
= pop(); prim_xor (); push_arg1 (); break;
2369 arg1
; // TODO have something better here