1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
|
type cell {
type: int
# type 0: pair; the unit of lists, trees, DAGS or graphs
left: (handle cell)
right: (handle cell)
# type 1: number
number-data: float
# type 2: symbol
# type 3: string
text-data: (handle stream byte)
# type 4: primitive function
index-data: int
# type 5: screen
screen-data: (handle screen)
# TODO: array, (associative) table, stream
}
fn allocate-symbol _out: (addr handle cell) {
var out/eax: (addr handle cell) <- copy _out
allocate out
var out-addr/eax: (addr cell) <- lookup *out
var type/ecx: (addr int) <- get out-addr, type
copy-to *type, 2/symbol
var dest-ah/eax: (addr handle stream byte) <- get out-addr, text-data
populate-stream dest-ah, 0x40/max-symbol-size
}
fn initialize-symbol _out: (addr handle cell), val: (addr array byte) {
var out/eax: (addr handle cell) <- copy _out
var out-addr/eax: (addr cell) <- lookup *out
var dest-ah/eax: (addr handle stream byte) <- get out-addr, text-data
var dest/eax: (addr stream byte) <- lookup *dest-ah
write dest, val
}
fn new-symbol out: (addr handle cell), val: (addr array byte) {
allocate-symbol out
initialize-symbol out, val
}
fn allocate-number _out: (addr handle cell) {
var out/eax: (addr handle cell) <- copy _out
allocate out
var out-addr/eax: (addr cell) <- lookup *out
var type/ecx: (addr int) <- get out-addr, type
copy-to *type, 1/number
}
fn initialize-integer _out: (addr handle cell), n: int {
var out/eax: (addr handle cell) <- copy _out
var out-addr/eax: (addr cell) <- lookup *out
var dest-addr/eax: (addr float) <- get out-addr, number-data
var src/xmm0: float <- convert n
copy-to *dest-addr, src
}
fn new-integer out: (addr handle cell), n: int {
allocate-number out
initialize-integer out, n
}
fn initialize-float _out: (addr handle cell), n: float {
var out/eax: (addr handle cell) <- copy _out
var out-addr/eax: (addr cell) <- lookup *out
var dest-ah/eax: (addr float) <- get out-addr, number-data
var src/xmm0: float <- copy n
copy-to *dest-ah, src
}
fn new-float out: (addr handle cell), n: float {
allocate-number out
initialize-float out, n
}
fn allocate-pair _out: (addr handle cell) {
var out/eax: (addr handle cell) <- copy _out
allocate out
# new cells have type pair by default
}
fn initialize-pair _out: (addr handle cell), left: (handle cell), right: (handle cell) {
var out/eax: (addr handle cell) <- copy _out
var out-addr/eax: (addr cell) <- lookup *out
var dest-ah/ecx: (addr handle cell) <- get out-addr, left
copy-handle left, dest-ah
dest-ah <- get out-addr, right
copy-handle right, dest-ah
}
fn new-pair out: (addr handle cell), left: (handle cell), right: (handle cell) {
allocate-pair out
initialize-pair out, left, right
}
fn nil out: (addr handle cell) {
allocate-pair out
}
fn allocate-primitive-function _out: (addr handle cell) {
var out/eax: (addr handle cell) <- copy _out
allocate out
var out-addr/eax: (addr cell) <- lookup *out
var type/ecx: (addr int) <- get out-addr, type
copy-to *type, 4/primitive-function
}
fn initialize-primitive-function _out: (addr handle cell), n: int {
var out/eax: (addr handle cell) <- copy _out
var out-addr/eax: (addr cell) <- lookup *out
var dest-addr/eax: (addr int) <- get out-addr, index-data
var src/ecx: int <- copy n
copy-to *dest-addr, src
}
fn new-primitive-function out: (addr handle cell), n: int {
allocate-primitive-function out
initialize-primitive-function out, n
}
fn allocate-screen _out: (addr handle cell) {
var out/eax: (addr handle cell) <- copy _out
allocate out
var out-addr/eax: (addr cell) <- lookup *out
var type/ecx: (addr int) <- get out-addr, type
copy-to *type, 5/screen
}
fn new-screen _out: (addr handle cell), width: int, height: int {
var out/eax: (addr handle cell) <- copy _out
allocate-screen out
var out-addr/eax: (addr cell) <- lookup *out
var dest-ah/eax: (addr handle screen) <- get out-addr, screen-data
var dest-addr/eax: (addr screen) <- lookup *dest-ah
initialize-screen dest-addr, width, height
}
|