Quellcode durchsuchen

Add brainfuck implementation

Justine Tunney vor 3 Jahren
Ursprung
Commit
da7ef2f3e7
2 geänderte Dateien mit 91 neuen und 2 gelöschten Zeilen
  1. 16 2
      Makefile
  2. 75 0
      brainfuck.S

+ 16 - 2
Makefile

@@ -6,12 +6,17 @@ CLEANFILES =				\
 	bestline.o			\
 	sectorlisp.o			\
 	sectorlisp.bin			\
-	sectorlisp.bin.dbg
+	sectorlisp.bin.dbg		\
+	brainfuck.o			\
+	brainfuck.bin			\
+	brainfuck.bin.dbg
 
 .PHONY:	all
 all:	lisp				\
 	sectorlisp.bin			\
-	sectorlisp.bin.dbg
+	sectorlisp.bin.dbg		\
+	brainfuck.bin			\
+	brainfuck.bin.dbg
 
 .PHONY:	clean
 clean:;	$(RM) lisp lisp.o bestline.o sectorlisp.o sectorlisp.bin sectorlisp.bin.dbg
@@ -29,5 +34,14 @@ sectorlisp.bin.dbg: sectorlisp.o
 sectorlisp.bin: sectorlisp.bin.dbg
 	objcopy -S -O binary sectorlisp.bin.dbg sectorlisp.bin
 
+brainfuck.o: brainfuck.S
+	$(AS) -g -o $@ $<
+
+brainfuck.bin.dbg: brainfuck.o
+	$(LD) -oformat:binary -Ttext=0x7c00 -o $@ $<
+
+brainfuck.bin: brainfuck.bin.dbg
+	objcopy -S -O binary brainfuck.bin.dbg brainfuck.bin
+
 %.o: %.js
 	$(COMPILE.c) -xc $(OUTPUT_OPTION) $<

+ 75 - 0
brainfuck.S

@@ -0,0 +1,75 @@
+/*-*- mode:unix-assembly; indent-tabs-mode:t; tab-width:8; coding:utf-8     -*-│
+│vi: set et ft=asm ts=8 tw=8 fenc=utf-8                                     :vi│
+╞══════════════════════════════════════════════════════════════════════════════╡
+│ Copyright 2021 Justine Alexandra Roberts Tunney                              │
+│                                                                              │
+│ Permission to use, copy, modify, and/or distribute this software for         │
+│ any purpose with or without fee is hereby granted, provided that the         │
+│ above copyright notice and this permission notice appear in all copies.      │
+│                                                                              │
+│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL                │
+│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED                │
+│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE             │
+│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL         │
+│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR        │
+│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER               │
+│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR             │
+│ PERFORMANCE OF THIS SOFTWARE.                                                │
+╚─────────────────────────────────────────────────────────────────────────────*/
+
+//	compliant brainfuck in 87 bytes
+//	boots from bios on pc w/ 128kb+
+
+	.code16
+	.globl	_start
+_start:	mov	$0x10000>>4,%di
+	push	%di
+	pop	%ds
+	push	%di
+	pop	%es
+	mov	%si,%dx
+Brain:	xor	%ax,%ax
+	cmp	%dx,%si
+	jb	Fuck
+	int	$0x16
+	mov	%al,(%si)
+	inc	%dx
+Fuck:	lodsb
+	cmp	$'>',%al
+	je	Right
+	cmp	$'<',%al
+	je	Left
+	cmp	$'+',%al
+	je	Inc
+	cmp	$'-',%al
+	je	Dec
+	cmp	$'.',%al
+	je	Put
+	cmp	$',',%al
+	je	Get
+	cmp	$']',%al
+	je	Loop
+	cmp	$'[',%al
+	jne	Brain
+Do:	push	%si
+Loop:	pop	%ax
+	cmpb	%ah,(%di)
+	jz	Brain
+	push	%ax
+	xchg	%ax,%si
+	jmp	Brain
+Inc:	incb	(%di)
+	.byte	0x3C
+Left:	dec	%di
+	.byte	0x80
+Dec:	decb	(%di)
+	.byte	0x3C
+Right:	inc	%di
+	.byte	0x84
+Put:	mov	$0x0e,%ah
+	mov	(%di),%al
+	int	$0x10
+	jmp	Brain
+Get:	int	$0x16
+	mov	%al,(%di)
+	jmp	Brain