This commit is contained in:
Kartik K. Agaram 2021-03-01 23:43:25 -08:00
parent 124be197a0
commit 89b7ea80a5
2 changed files with 67 additions and 35 deletions

View File

@ -21,6 +21,19 @@ fn allocate-symbol _out: (addr handle cell) {
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
@ -29,8 +42,48 @@ fn allocate-number _out: (addr handle cell) {
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-ah/eax: (addr float) <- get out-addr, number-data
var src/xmm0: float <- convert n
copy-to *dest-ah, 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
}

View File

@ -144,8 +144,7 @@ fn is-nil? _in: (addr cell) -> _/eax: boolean {
fn test-print-cell-zero {
var num-storage: (handle cell)
var num/esi: (addr handle cell) <- address num-storage
allocate-number num
# value is 0 by default
new-integer num, 0
var out-storage: (stream byte 0x40)
var out/edi: (addr stream byte) <- address out-storage
print-cell num, out, 0/no-trace
@ -155,11 +154,7 @@ fn test-print-cell-zero {
fn test-print-cell-integer {
var num-storage: (handle cell)
var num/esi: (addr handle cell) <- address num-storage
allocate-number num
var num-addr/eax: (addr cell) <- lookup *num
var num-data/eax: (addr float) <- get num-addr, number-data
var src/xmm0: float <- rational 1, 1
copy-to *num-data, src
new-integer num, 1
var out-storage: (stream byte 0x40)
var out/edi: (addr stream byte) <- address out-storage
print-cell num, out, 0/no-trace
@ -169,11 +164,7 @@ fn test-print-cell-integer {
fn test-print-cell-integer-2 {
var num-storage: (handle cell)
var num/esi: (addr handle cell) <- address num-storage
allocate-number num
var num-addr/eax: (addr cell) <- lookup *num
var num-data/eax: (addr float) <- get num-addr, number-data
var src/xmm0: float <- rational 0x30, 1
copy-to *num-data, src
new-integer num, 0x30
var out-storage: (stream byte 0x40)
var out/edi: (addr stream byte) <- address out-storage
print-cell num, out, 0/no-trace
@ -183,11 +174,8 @@ fn test-print-cell-integer-2 {
fn test-print-cell-fraction {
var num-storage: (handle cell)
var num/esi: (addr handle cell) <- address num-storage
allocate-number num
var num-addr/eax: (addr cell) <- lookup *num
var num-data/eax: (addr float) <- get num-addr, number-data
var src/xmm0: float <- rational 1, 2
copy-to *num-data, src
var val/xmm0: float <- rational 1, 2
new-float num, val
var out-storage: (stream byte 0x40)
var out/edi: (addr stream byte) <- address out-storage
print-cell num, out, 0/no-trace
@ -197,11 +185,7 @@ fn test-print-cell-fraction {
fn test-print-cell-symbol {
var sym-storage: (handle cell)
var sym/esi: (addr handle cell) <- address sym-storage
allocate-symbol sym
var sym-addr/eax: (addr cell) <- lookup *sym
var sym-data-ah/eax: (addr handle stream byte) <- get sym-addr, text-data
var sym-data/eax: (addr stream byte) <- lookup *sym-data-ah
write sym-data, "abc"
new-symbol sym, "abc"
var out-storage: (stream byte 0x40)
var out/edi: (addr stream byte) <- address out-storage
print-cell sym, out, 0/no-trace
@ -219,21 +203,16 @@ fn test-print-cell-nil-list {
}
fn test-print-cell-singleton-list {
# list
var left-storage: (handle cell)
var left/ecx: (addr handle cell) <- address left-storage
new-symbol left, "abc"
var nil-storage: (handle cell)
var nil/edx: (addr handle cell) <- address nil-storage
allocate-pair nil
var list-storage: (handle cell)
var list/esi: (addr handle cell) <- address list-storage
allocate-pair list
# left
var list-addr/eax: (addr cell) <- lookup *list
var list-left/eax: (addr handle cell) <- get list-addr, left
allocate-symbol list-left
var sym-addr/eax: (addr cell) <- lookup *list-left
var sym-data-ah/eax: (addr handle stream byte) <- get sym-addr, text-data
var sym-data/eax: (addr stream byte) <- lookup *sym-data-ah
write sym-data, "abc"
# right
var list-addr/eax: (addr cell) <- lookup *list
var list-right/eax: (addr handle cell) <- get list-addr, right
allocate-pair list-right
new-pair list, *left, *nil
#
var out-storage: (stream byte 0x40)
var out/edi: (addr stream byte) <- address out-storage