Brainfuck? Wasn das?
Wichtig:
Ihr braucht noch die nasmw.exe http://nasm.sourceforge.net
Der Compiler erzeugt eine Assembler Datei un nasm macht daraus dann eine 16Bit Com-Datei.
Der Compiler sollte eigendlich mit allen Programmen funktionieren, falls nicht, einfach mal #stacksize erhöhen. Außerdem sollten die Programme nicht zu groß sein (Com Dateien dürfen nur 64kb groß sein und schon alleine 30000 Byte gehen für den Datenspeicher drauf...)
Der Compiler ist noch nicht sonderlich gut entwickelt, es gibt sicherlich noch einige Fehler und Optimierungsmöglichkeiten, aber Hey, ich arbeite dran
Ich warte auf eure Vorschläge/Anregungen/Kritik.
Hier sind einige Programme zum ausprobieren.
Code: Alles auswählen
;Brainfuck Compiler V0.01
#stacksize=2000
Structure memory
adr.l
len.l
EndStructure
Structure stack
sp.l
ss.l
adr.l
EndStructure
Procedure Push(stk.l, value.w)
PokeW(PeekL(stk+8)+(PeekL(stk)*2),value)
PokeL(stk,PeekL(stk)+1)
EndProcedure
Procedure.w Pop(stk.l)
PokeL(stk,PeekL(stk)-1)
a= PeekW(PeekL(stk+8)+(PeekL(stk)*2))
ProcedureReturn a
EndProcedure
If OpenFile(0,OpenFileRequester("","*.bf","*.bf",1))
mem.memory\adr=AllocateMemory(Lof())
mem\len=Lof()
ReadData(mem\adr,Lof())
CloseFile(0)
count=0
For x=0 To mem\len
If PeekB(mem\adr)=91
count+1
ElseIf PeekB(mem\adr)=93
count-1
EndIf
Next
If count=0
CreateFile(0,"out.asm")
WriteStringN("segment.code")
WriteStringN("org 0x100")
WriteStringN("mov si,buffer")
WriteStringN("xor cx,cx")
WriteStringN("loop_:")
WriteStringN("mov word [si],0")
WriteStringN("add si,2")
WriteStringN("inc cx")
WriteStringN("cmp cx,15000")
WriteStringN("jne loop_")
WriteStringN("mov si,buffer")
stk.stack\adr=AllocateMemory(#stacksize*2)
stk\ss=#stacksize
stk\sp=0
cur=0
For x=0 To mem\len
Select PeekB(mem\adr+x)
Case 43 ;+
If PeekB(mem\adr+x+1)=43
count=1
Repeat
x+1
count+1
Until PeekB(mem\adr+x+1)<>43
WriteStringN("add byte [si],"+Str(count))
Else
WriteStringN("inc byte [si]")
EndIf
Case 44 ;,
WriteStringN("mov ah,0x06")
WriteStringN("mov dl,0xFF")
WriteStringN("int 0x21")
WriteStringN("mov [si],al")
Case 45 ;-
If PeekB(mem\adr+x+1)=45
count=1
Repeat
x+1
count+1
Until PeekB(mem\adr+x+1)<>45
WriteStringN("sub byte [si],"+Str(count))
Else
WriteStringN("dec byte [si]")
EndIf
Case 46 ;.
WriteStringN("mov ah,0x02")
WriteStringN("mov dl,[si]")
WriteStringN("int 0x21")
Case 60 ;<
If PeekB(mem\adr+x+1)=60
count=1
Repeat
x+1
count+1
Until PeekB(mem\adr+x+1)<>60
WriteStringN("sub si,"+Str(count))
Else
WriteStringN("dec si")
EndIf
Case 62 ;>
If PeekB(mem\adr+x+1)=62
count=1
Repeat
x+1
count+1
Until PeekB(mem\adr+x+1)<>62
WriteStringN("add si,"+Str(count))
Else
WriteStringN("inc si")
EndIf
Case 91 ;[
WriteStringN("loop_"+Str(cur)+":")
WriteStringN("cmp byte [si],0")
WriteStringN("je near loop_"+Str(cur)+"_end")
Push(@stk,cur)
cur+1
Case 93 ;]
a=Pop(@stk)
WriteStringN("jmp loop_"+Str(a))
WriteStringN("loop_"+Str(a)+"_end:")
EndSelect
Next
WriteStringN("mov ah,0x4C")
WriteStringN("int 0x21")
WriteStringN("buffer:")
RunProgram("nasmw.exe","-o out.com out.asm",".\")
Else
MessageRequester("Fehler","Das Verhältnis der [ und ] ist unausgeglichen.")
EndIf
Else
MessageRequester("Fehler","Datei nicht gefunden!")
EndIf

