From 665668a7a0b746c3f5a432ae9a1027846cfa7255 Mon Sep 17 00:00:00 2001 From: Justine Tunney Date: Tue, 27 Oct 2020 13:42:10 -0700 Subject: [PATCH] Reduce sectorlisp from 948 to 856 bytes --- Makefile | 8 +- README.md | 2 +- bin/footprint.png | Bin 11438 -> 11422 bytes bin/sectorlisp.bin | Bin 1024 -> 1024 bytes lisp.lds | 3 +- lisp.lisp | 1 + sectorlisp.S | 355 ++++++++++++++++++++------------------------- start.S | 5 +- 8 files changed, 171 insertions(+), 203 deletions(-) diff --git a/Makefile b/Makefile index 416c19d..25ba5df 100644 --- a/Makefile +++ b/Makefile @@ -51,10 +51,10 @@ clean:; $(RM) $(CLEANFILES) lisp.bin.dbg: start.o lisp.real.o lisp.lds sectorlisp.bin.dbg: start.o sectorlisp.o lisp.lds -start.o: start.S -lisp.o: lisp.c lisp.h -lisp.real.o: lisp.c lisp.h -sectorlisp.o: sectorlisp.S +start.o: start.S Makefile +lisp.o: lisp.c lisp.h Makefile +lisp.real.o: lisp.c lisp.h Makefile +sectorlisp.o: sectorlisp.S Makefile %.real.o: %.c $(CC) $(CPPFLAGS) $(CFLAGS) $(REALFLAGS) -c -o $@ $< diff --git a/README.md b/README.md index 8735a31..acbbc72 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ of running natively without dependencies on modern PCs, sectorlisp might be the tiniest self-hosting LISP interpreter to date. We're still far off however from reaching our goal, which is to have -sectorilsp be small enough to fit in the master boot record of a floppy +sectorlisp be small enough to fit in the master boot record of a floppy disk, like [sectorforth](https://github.com/cesarblum/sectorforth). If you can help this project reach its goal, please send us a pull request! diff --git a/bin/footprint.png b/bin/footprint.png index f63aa3c2db3c195da288f18e847b512a0693b081..60b3bd70ec846fdbd5a1c1306c366a95fb7d2b99 100644 GIT binary patch delta 9954 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 C*+PN< delta 9942 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 diff --git a/bin/sectorlisp.bin b/bin/sectorlisp.bin index c9c6cde9f8ab1385e59ff75d3864c1da6bcbcd52..73575e6e1af80b06ddb7ed0cbeed9eb8080eceef 100755 GIT binary patch delta 766 zcmah`Ur19?7(e&g+%#>YqJLy*^sq$@*Fz{x=Z!)ssHLr>F@+$g_j?&ewZ*-gJ6;4+ za?nE*3W*r3$S|zAI-x#fr9KRjQn5duotRQ&OW8f$Y407r^F4gu`Tf4%?>j+L(9~uP z45F%7aim(0!bo-gNVU~!8?Lt7hr&YqmH%lu`q>Rds0#^DhM*Hg)kC}hKe#B|;o>j+ zaGawvj>OoO(ob%9%{dDtLo6Q%S5M@xntF}TW&?3d#ZlEgBn;&W5z=CbOa_;WB?AmI zx~OcQ5I6S1Ge#}SlvL0Qj~FH`+mwW~cysPxAPd1O@vzXRB*YTO1WvZ(m5oZ4Bl-iA zO>0$};&ewJ1-<*BkN#=B%Ff}BeZ6{jx&A;{7@r|OR@(G9bxA?h1kC!A1?vXLL3!34XopO;5D5@MpwBY)9! zXE;-PRuy^OCID+toegeyfGXANs1pd&323~XWOW-LjObFw6HW-Ud3t}3a7fA1sk#;?^a?iN;tlSP=ajf9{7XOxH-5H)gBz3>wkn4PzFc zmq4i&_26avYw0B?nVM70N#FcM4Nqptj6IyVPj%@!<%$dD(0io%`GD%GgG?rhzrl)j z%d76j(`)}U-;Z>w=}Pfr;F6rSo0S_Vuql)QV9-P!mmzg}HMb%@xkLYezjb*1);FPxxPBU*PA%g0nN9D9zd@HBx&5EGO z=^CkI6}^8AZJ>6X!bvD%J>0-9Bo;dobf{Qum7Tm@y%U-Af#@Bjb+ delta 801 zcmXYvUr19?9LLX{>`#Wx!ooCi2+39?O(GTMpDWdRiNCPyr;A2f%E5g{(R5(_cpgCbTnG*IQS_@4{yV-0>*sH7KDK-}K4c3FDM`$m22v~F+pqC&b9@4N#tBIf} z6Cd)SDu8EOT|;^hd9h`r*yEP1(#VbjbB+i?#8$-X;)MWBlQtQy!gQxLC~^7-8YL}w zQMP7cHqd+@u!B0bL+&i@m<+6%crA(%{3|%Ym4(Op!z<`1!6m^AU%VbYAW-fs4NCk^ zICe{_Y1GAatm4$55V@ygZ5FP?R?TfjpNRuu((A>Q=pw;WR!Me>UJaZ$IaT3r29iE89pt&A2)1iM^t?N5>c#@o{P0;OQM zkxa23<-8g<1JtNOOs^N4&#@$FE#b;bcxp-^Xw@qJG_-R>+<;hNeI+v8GmZj=*J#;Ri~n@U1(S z;ksMp37{vkjoc-Fy^yWuPWiWnBxCR{5VDngJC#=~M99|hmp5RRlRV6Jl83pIoUZr3 z$NPk=!x((53fVSeu$FemcoxpXG+I@unTV*x&U}c~K4xGy;0{|Q+?;!yOdddM&PoF% zTSY>WoBNh?hqsF-G`Rtt?p}kVFp08jxB%Tz;jmIb1`NO>yTX5CDYhv}$?maEz$yCI zHr1v0Z7uYx6hg%^+7+yg;qoY+qdPuE@k-Z80@LB?Xg}Ss+Py!;j?a4Jo> 1) * sizeof(word) + mov 2(%di),%di # contents of decrement register + and $-2,%di # contents of address register + mov (%di),%ax + ret GetToken: xor %bx,%bx - mov $SYNTAX,%si - mov LOOK,%ax - mov $TOKEN,%cx + mov $q.syntax,%si + mov q.look,%ax + mov $q.token,%di 0: mov %al,%bl mov (%bx,%si),%dl mov %dl,%bl @@ -119,24 +98,19 @@ GetToken: jmp 0b 1: test %dl,%dl je 3f - xchg %cx,%di stosb - xchg %di,%cx call GetChar jmp 4f 2: test %bl,%bl jne 4f - xchg %cx,%di stosb - xchg %di,%cx call GetChar mov %ax,%bx mov (%bx,%si),%bl 3: test %al,%al jne 2b -4: mov %cx,%di - movb $0,(%di) - mov %al,LOOK +4: movb $0,(%di) + mov %al,q.look ret Assoc: xchg %si,%bx @@ -158,24 +132,56 @@ Assoc: xchg %si,%bx ret GetObject: - cmpb $40,TOKEN - je 1f - mov $TOKEN,%di - jmp Intern -1: #jmp GetList + cmpb $40,q.token + je GetList + mov $q.token,%di / 𝑠𝑙𝑖𝑑𝑒 +Intern: mov %di,%bx + mov $STR,%si +0: lodsb + test %al,%al + je 4f + xor %dx,%dx +1: mov %dx,%di + mov (%bx,%di),%cl + cmp %cl,%al + jne 3f + inc %dx + test %al,%al + jne 2f + sub %di,%si + lea -STR-1(%si),%ax + jmp 6f +2: lodsb + jmp 1b +3: test %al,%al + jz 0b + lodsb + jmp 3b +4: lea -1(%si),%di + push %di + mov %bx,%si +0: lodsb + stosb + test %al,%al + jnz 0b + pop %ax + sub $STR,%ax +6: shl %ax + ret + GetList:call GetToken - mov TOKEN,%al + mov q.token,%al cmp $'),%al je 2f cmp $'.,%al je 1f call GetObject - push %ax + push %ax # save call GetList xchg %ax,%si - pop %di + pop %di # restore jmp Cons 1: call GetToken jmp GetObject @@ -187,7 +193,7 @@ EvalCons: mov 2(%bx),%bx mov %bx,%di call Cadr - mov %ax,%di + xchg %ax,%di mov %bp,%si call Eval mov %bp,%si @@ -200,7 +206,7 @@ EvalCons: / jmp Cons / 𝑠𝑙𝑖𝑑𝑒 -Cons: mov $INDEX,%bx +Cons: mov $q.index,%bx mov (%bx),%ax addw $2,(%bx) shl %ax @@ -213,92 +219,83 @@ Cons: mov $INDEX,%bx Bind: test %di,%di je 1f push %bp - mov %sp,%bp - push %dx - push %dx - xchg %si,%bx - and $-2,%bx + and $-2,%si and $-2,%di - mov %di,-4(%bp) - mov 2(%bx),%si + mov %di,%bp + push %dx # save no. 1 + push %si # save no. 2 + mov 2(%si),%si mov 2(%di),%di - push %bx # save no. 1 call Bind - pop %bx # rest no. 1 - push %ax # save no. 2 - mov (%bx),%bx - mov %bx,%di - mov -2(%bp),%si + pop %si # rest no. 2 + mov (%si),%di + pop %si # rest no. 1 + push %ax # save no. 3 call Eval - mov -4(%bp),%di - mov (%di),%di + mov %ds:(%bp),%di xchg %ax,%si call Cons - pop %si # rest no. 2 + pop %si # rest no. 3 xchg %ax,%di - leave + pop %bp jmp Cons 1: xchg %dx,%ax ret -EvalCdr: - mov %dx,%di - mov %bp,%si - call Arg1 - and $-2,%ax - mov %ax,%di - mov 2(%di),%ax - pop %bp - ret +PrintString: # nul-terminated in si +0: lodsb # don't clobber bp, bx + test %al,%al + je 1f + call PutChar + jmp 0b +1: ret //////////////////////////////////////////////////////////////////////////////// .text -Cadr: and $-2,%di # (object >> 1) * sizeof(word) - mov 2(%di),%di # contents of decrement register - and $-2,%di # contents of address register - mov (%di),%ax +PrintObject: + test $1,%di + jnz 1f + shr %di + lea STR(%di),%si + jmp PrintString +1: push %bx + mov %di,%bx + mov $40,%al + call PutChar +2: and $-2,%bx + mov (%bx),%di + call PrintObject + mov 2(%bx),%bx + test %bx,%bx + jz 4f + test $1,%bl + jz 3f + mov $0x20,%al + call PutChar + jmp 2b +3: mov $kDot,%si + call PrintString + mov %bx,%di + call PrintObject +4: pop %bx + mov $41,%al +/ jmp PutChar +/ 𝑠𝑙𝑖𝑑𝑒 + +PutChar:push %bx # don't clobber bp,bx,di,si,cx + push %bp # original ibm pc scroll up bug + mov $7,%bx # normal mda/cga style page zero + mov $0x0e,%ah # teletype output al cp437 + int $0x10 # vidya service + pop %bp # preserves al + pop %bx ret Arg1: call Cadr xchg %ax,%di - jmp Eval - -PrintObject: - push %bp - mov %di,%bp - test $1,%di - setz %al - shr %di - test %al,%al - je 1f - add $STR,%di - pop %bp - jmp PrintString -1: mov $40,%di - call PutChar -2: mov %bp,%bx - and $-2,%bx - mov (%bx),%di - call PrintObject - mov %bp,%bx - and $-2,%bx - mov 2(%bx),%bx - mov %bx,%bp - test %bx,%bx - je 4f - test $1,%bl - je 3f - mov $0x20,%di - call PutChar - jmp 2b -3: mov $kDot,%di - call PrintString - mov %bp,%di - call PrintObject -4: mov $41,%di - pop %bp - jmp PutChar +/ jmp Eval +/ 𝑠𝑙𝑖𝑑𝑒 Eval: push %bp mov %di,%dx @@ -314,27 +311,24 @@ Eval: push %bp mov (%bx),%ax test $1,%al je 1f - mov (%bx),%ax - and $-2,%ax - mov %ax,%di - mov (%di),%ax - cmp $ATOM_LAMBDA,%ax + mov (%bx),%di + and $-2,%di + cmp $ATOM_LAMBDA,(%di) jne EvalUndefined mov 2(%bx),%si mov (%bx),%di push %bx call Cadr - mov %si,%si - mov %ax,%di + xchg %ax,%di mov %bp,%dx call Bind - mov %ax,%bp + xchg %ax,%bp pop %bx mov (%bx),%bx mov %bx,%di and $-2,%di mov 2(%di),%di - jmp 8f + jmp EvalCadrLoop 1: mov (%bx),%ax cmp $ATOM_COND,%ax je EvalCond @@ -355,7 +349,7 @@ Eval: push %bp mov 2(%bx),%bx mov %bx,%di call Cadr - mov %ax,%di + xchg %ax,%di mov %bp,%si call Eval mov %bp,%si @@ -365,14 +359,37 @@ Eval: push %bp pop %dx # restore cmp %dx,%ax jmp 3f +EvalCdr: + mov %dx,%di + mov %bp,%si + call Arg1 + and $-2,%ax + xchg %ax,%di + mov 2(%di),%ax + pop %bp + ret +EvalCond: + mov 2(%bx),%bx + and $-2,%bx + mov (%bx),%di + and $-2,%di + mov (%di),%di + mov %bp,%si + push %bx # save + call Eval + pop %bx # restore + test %ax,%ax + je EvalCond + mov (%bx),%di + jmp EvalCadrLoop 2: cmp $ATOM_CDR,%ax je EvalCdr cmp $ATOM_CONS,%ax je EvalCons cmp $ATOM_CAR,%ax jne EvalCall - mov %bp,%si mov %dx,%di + mov %bp,%si call Arg1 and $-2,%ax xchg %ax,%di @@ -387,78 +404,24 @@ EvalAtom: je 9f xor %ax,%ax jmp 9f -EvalCond: - mov 2(%bx),%bx - mov %bx,%bx - and $-2,%bx - mov (%bx),%di - push %bx # save - and $-2,%di - mov (%di),%di - mov %bp,%si - call Eval - test %ax,%ax - pop %bx # restore - je EvalCond - mov (%bx),%bx - mov %bx,%di - jmp 8f EvalCall: mov 2(%bx),%cx - mov (%bx),%bx - mov %bx,%di + mov (%bx),%di mov %bp,%si call Assoc - mov %cx,%si - mov %ax,%di + xchg %cx,%si + xchg %ax,%di call Cons jmp 1f -8: call Cadr -1: mov %ax,%dx +EvalCadrLoop: + call Cadr +1: xchg %ax,%dx jmp 0b EvalUndefined: mov $UNDEFINED,%ax 9: pop %bp ret -Intern: push %bp - xchg %di,%bx - mov $STR,%si -0: lodsb - test %al,%al - je 4f - xor %dx,%dx -1: mov %dx,%bp - mov %dx,%di - mov (%bx,%di),%cl - cmp %cl,%al - jne 3f - inc %dx - test %al,%al - jne 2f - mov %bp,%cx - sub %cx,%si - lea -STR-1(%si),%ax - jmp 6f -2: lodsb - jmp 1b -3: test %al,%al - je 0b - lodsb - jmp 3b -4: lea -1(%si),%dx - mov %dx,%di - xchg %bx,%si -0: lodsb - stosb - test %al,%al - jnz 0b - xchg %dx,%ax - sub $STR,%ax -6: shl %ax - pop %bp - ret - //////////////////////////////////////////////////////////////////////////////// .section .rodata,"a",@progbits diff --git a/start.S b/start.S index 0376be3..d2719eb 100644 --- a/start.S +++ b/start.S @@ -42,4 +42,7 @@ _begin: push %cs # memory model cs=ds=es = 0x600 xor %dh,%dh # drive dl head zero mov $0x0200+v_sectors,%ax # read sectors int $0x13 # disk service - jmp main +/ 𝑠𝑙𝑖𝑑𝑒 + + .section .yoink + nop main