diff --git a/sectorlisp.S b/sectorlisp.S index 9e343de..e666117 100644 --- a/sectorlisp.S +++ b/sectorlisp.S @@ -174,6 +174,27 @@ Cons: xchg %di,%cx # Cons(m:di,a:ax):ax .RetDi: xchg %di,%ax ret +Builtin:cmp $kAtom,%ax # atom: last builtin atom + ja .resolv # ah is zero if not above + mov (%si),%di # di = Car(x) + je .ifAtom + cmp $kPrint,%al + je .ifPrint + cmp $kRead,%al + je .ifRead + cmp $kCons,%al + jae .ifCons +.ifCar: cmp $kCar,%al + je Car +.ifCdr: jmp Cdr +.ifCons:mov (%bx,%si),%si # si = Cdr(x) + lodsw # si = Cadr(x) + je Cons +.isEq: xor %di,%ax + jne .retF +.retT: mov $kT,%al + ret + GetList:call GetToken cmp $')',%al je .retF @@ -200,7 +221,7 @@ Gc: cmp %dx,%di # Gc(x:di,A:dx,B:si):ax call Assoc # do (fn si) → ((λ ...) si) pop %si Apply: test %ax,%ax # Apply(fn:ax,x:si:a:dx):ax - jns .switch # jump if atom + jns Builtin # jump if atom xchg %ax,%di # di = fn .lambda:mov (%bx,%di),%di # di = Cdr(fn) push %di # for .EvCadr @@ -218,26 +239,6 @@ Pairlis:test %di,%di # Pairlis(x:di,y:si,a:dx):dx xchg %ax,%dx # a = new list pop %di # grab Cdr(x) jmp Pairlis -.switch:cmp $kAtom,%ax # atom: last builtin atom - ja .resolv # ah is zero if not above - mov (%si),%di # di = Car(x) - je .ifAtom - cmp $kPrint,%al - je .ifPrint - cmp $kRead,%al - je .ifRead - cmp $kCons,%al - jae .ifCons -.ifCar: cmp $kCar,%al - je Car -.ifCdr: jmp Cdr -.ifCons:mov (%bx,%si),%si # si = Cdr(x) - lodsw # si = Cadr(x) - je Cons -.isEq: xor %di,%ax - jne .retF -.retT: mov $kT,%al - ret .ifAtom:test %di,%di # test if atom jns .retT .retF: xor %ax,%ax # ax = nil