From fea29b58a0640db8dc0517bbb59e87a337fedb27 Mon Sep 17 00:00:00 2001 From: Justine Tunney Date: Thu, 9 Dec 2021 08:51:26 -0800 Subject: [PATCH] Inline Pairlis (436 bytes) --- sectorlisp.S | 43 ++++++++++++++++++++----------------------- 1 file changed, 20 insertions(+), 23 deletions(-) diff --git a/sectorlisp.S b/sectorlisp.S index f6d4ae9..c3e65b1 100644 --- a/sectorlisp.S +++ b/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