Selaa lähdekoodia

Inline Pairlis (436 bytes)

Justine Tunney 3 vuotta sitten
vanhempi
commit
fea29b58a0
1 muutettua tiedostoa jossa 20 lisäystä ja 23 poistoa
  1. 20 23
      sectorlisp.S

+ 20 - 23
sectorlisp.S

@@ -169,24 +169,11 @@ PutChar:mov	$0x0e,%ah			# prints CP-437
 	jne	1f				# look xchg ret
 	mov	$'\n',%al
 	jmp	PutChar
-
-////////////////////////////////////////////////////////////////////////////////
-
-Pairlis:test	%di,%di				# Pairlis(x:di,y:si,a:dx):ax
-	jz	1f				# jump if nil
-	push	(%bx,%di)			# save 1 Cdr(x)
-	lodsw
-	push	(%si)				# save 2 Cdr(y)
-	mov	(%di),%di
-	call	Cons				# preserves dx
-	pop	%si				# restore 2
-	pop	%di				# restore 1
-	push	%ax				# save 3
-	call	Pairlis
-	jmp	xCons				# can be inlined here
 1:	xchg	%dx,%ax
 	ret
 
+////////////////////////////////////////////////////////////////////////////////
+
 Evlis:	test	%di,%di				# Evlis(m:di,a:dx):ax
 	jz	1f				# jump if nil
 	push	(%bx,%di)			# save 1 Cdr(m)
@@ -199,7 +186,7 @@ Evlis:	test	%di,%di				# Evlis(m:di,a:dx):ax
 
 xCons:	pop	%di				# restore 2
 Cons:	xchg	%di,%cx				# Cons(m:di,a:ax):ax
-	mov	%cx,(%di)
+	mov	%cx,(%di)			# must preserve si
 	mov	%ax,(%bx,%di)
 	lea	4(%di),%cx
 1:	xchg	%di,%ax
@@ -250,12 +237,21 @@ Apply:	test	%ax,%ax				# Apply(fn:ax,x:si:a:dx):ax
 	jns	.switch				# jump if atom
 	xchg	%ax,%di				# di = fn
 .lambda:mov	(%bx,%di),%di			# di = Cdr(fn)
-	push	%di				# save 1
+	push	%di				# for .EvCadr
 	mov	(%di),%di			# di = Cadr(fn)
-	call	Pairlis
-	xchg	%ax,%dx
-	pop	%di				# restore 1
-	jmp	.EvCadr
+Pairlis:test	%di,%di				# Pairlis(x:di,y:si,a:dx):dx
+	jz	.EvCadr				# return if x is nil
+	lodsw					# ax = Car(y)
+	push	(%bx,%di)			# push Cdr(x)
+	mov	(%di),%di			# di = Car(x)
+	mov	(%si),%si			# si = Cdr(y)
+	call	Cons				# Cons(Car(x),Car(y))
+	xchg	%ax,%di
+	xchg	%dx,%ax
+	call	Cons				# Cons(Cons(Car(x),Car(y)),a)
+	xchg	%ax,%dx				# a = new list
+	pop	%di				# grab Cdr(x)
+	jmp	Pairlis
 .switch:cmp	$kEq,%ax			# eq is last builtin atom
 	ja	.dflt1				# ah is zero if not above
 	mov	(%si),%di			# di = Car(x)
@@ -286,8 +282,9 @@ Evcon:	push	%di				# save c
 	pop	%di				# restore c
 	test	%ax,%ax				# nil test
 	jz	1b
-	mov	(%di),%di			# di = Car(c)
-.EvCadr:call	Cadr				# ax = Cadar(c)
+	push	(%di)				# push Car(c)
+.EvCadr:pop	%di
+	call	Cadr				# ax = Cadar(c)
 #	jmp	Eval
 
 Eval:	test	%ax,%ax				# Eval(e:ax,a:dx):ax