Verdammter Masochist... Ich mach's mit (Python)
You may not like it, but this is what peak programming looks like ![]()
Naja, man muss die Probleme ja nicht am selben Tag lösen, kriegt man halt nur mehr Punkte ![]()
Verdammter Masochist... Ich mach's mit (Python)
You may not like it, but this is what peak programming looks like ![]()
Naja, man muss die Probleme ja nicht am selben Tag lösen, kriegt man halt nur mehr Punkte ![]()
Ich warte noch auf die FuckUp! Utilities
Das heben sich die Webseitenbetreiber immer als krönenden Schluss auf. Zuerst muss mit Schrott ködern bevor es Gold gibt
Ich bin dabei mit Assembler ![]()
Hey,
ein ziemlich nettes Event hier für Leute, die etwas Zeit übrig haben oder einfach mal die Finger fliegen lassen wollen. Vorallem Blue in C.
Hat einer Bock mitzumachen? Also ich mache mit. Habe mal ein privates WHF Leaderboard (Code: 190777-45e5e5fc) erstellt.
"Das Problem ist, dass es zu oft gespielt wird."? "Das Problem ist, dass es übermäßig oft gespielt wird."? Gibt genug Alternativen.
Früher haben sich alle über Französische Wörter im Deutschen beschwert, dachten es stirbt aus.
Jetzt alle über Englisch im Deutschen... Die Sprache wird es überleben
Wofür bedankst du dich, ist doch deine Leistung?
![]()
Das da ein Abbild unserer abgestumpften Gesellschaft gezeigt wurde ist dir doch hoffentlich auch aufgefallen.
Warum wusste ich, dass jetzt wieder so ein kack kommt
Nochmal ein kleines Update meinerseits für diejenige die es interessiert...
Habe die Seite und die VM nochmal geändert und aufgemotzt. Die Run-Funktion läuft jetzt schneller. Außerdem ist lfsh rausgeflogen und wurde um jump on unsigned less or equal jmpule ersetzt. Außerdem habe ich einen Bug beseitigt, bei dem leere Zeilen die Labelauflösung behindern.
Außerdem ist jetzt möglich Programme zu teilen und fremde Programm über einen Mausklick zu laden.
Share: http://185.177.21.162/community.php
Habe zwei Programme schon abgespeichert. Darunter eine Programm, was den ganzen Screen mit allen Farben füllt.
Du nutzt nicht zufällig die App Jodel?
Das nennt man auch Rheindialekt und dafür braucht man keine App für hippe Erstsemester
Der Gott der Animation...
Die Tischlampe hat Doppelfunktion ![]()
Sagst aber indirekt, dass jeder der nicht denkt wie du die Welt nicht versteht und Systemtreu ist...
lolololololololo Doppelmoral
Das ewige Thema mit der Seriosität von Etablierten Medien.Externer Inhalt www.youtube.comInhalte von externen Seiten werden ohne deine Zustimmung nicht automatisch geladen und angezeigt.Durch die Aktivierung der externen Inhalte erklärst du dich damit einverstanden, dass personenbezogene Daten an Drittplattformen übermittelt werden. Mehr Informationen dazu haben wir in unserer Datenschutzerklärung zur Verfügung gestellt.
Höhöhö *insert random Diamant Media Bashing here*
Höhöhö
Okay ich habe heute wieder rumgebastelt und das Update sollte die Qualität des Codens ziemlich verbessern.
Neu:
Zeilennummern:
Damit das ganze ein bisschen schöner aussieht
Assemblerwarnungen:
Wenn ihr Blödsinn macht, sagt euch der Assembler jetzt auf der Webseite, was ihm nicht passt. Zurzeit per alert(blabla).
Label Offsets:
Ihr deklariert beispielsweise "var: db 0,5" aber wie kommt man jetzt an die 5? Man kann jetzt statische Offsets deklarieren z.B. "push var+1", das heißt man geht von der Adresse von var (im Beispiel zeigt sie auf 0) zur nächsten. Ohne Limitierung.
Bald wird man auch mehr als 2 Einträge deklarieren können.
Neue Instructions:
Neu hinzugekommen:
pushi -> pusht Inhalt des Pointers in der absoluten Adresse auf den Stack
popi ->pusht den obersten Eintrag auf den Stack in die Adresse, auf die der Pointer zeigt, der an der absoluten Adresse liegt
---
Pseudoinstruktionen:
[0-9a-zA-Z]+(\+[0-9]+)? : Label (+ Offset in Dezimal)
dp : Sagt dem Assembler hier soll ein einzelner(!) Pointer abgelegt werden. Zwei Bytepositionen werden beschrieben. Pointersize = 13 Bit
Bugfixes:
Ein Label kann jetzt auch am Start stehen, dass macht keine Probleme mehr
Allgemeine Info:
Das Instruktionsformat ist wie folgt:
Opcode 3 Bit | 13 Bit Absolute Adresse/ignoriert
Alle Instruktionen sind 2 Byte groß. 8KB können mit 13 Bit adressiert werden. Daher sind DB Instruktionen zurzeit auch nur auf 2 Einträge beschränkt.
Wieder ein kleines Beispielprogramm:
start:
push tmp
push toAdd
add
pop tmp
push tmp
popi screen
push toAdd+1
push screen+1
add
pop screen+1
jmple start
tmp:
db 0
toAdd:
db 5,1
screen:
dp 6991
Alles anzeigen
Was macht das Programm? In einer Endlosschleife wird ein Wert immer um 5 inkrementiert, dann wird das ganze über einen indirekten pop auf den Screen geschrieben. Danach hole ich mir die unteren 8 Bit der Screenadresse und inkrementiere sie um 1. Somit wird im nächsten Durchlauf ein anderes Pixel beschrieben. Naja, bis die unteren 8 Bit überlaufen. Ein Add+Carry muss man sich selber bauen (siehe meine Links weiter oben), was aber einfach ist. Quasi eine Krüppelversion von DosAmps Programm. Aber wir kommen der Sache schon näher
. Die Lookup Table Version sollte sich jetzt mit ein paar Tricks (Add+Carry) gut implementieren lassen. Ich will aber das richtige Regenbogenprogramm zum Laufen kriegen
.
Morgen setze ich mich weiter ran, vielleicht implementiere ich den Debugging Vorschlag von Chrisse. Wahrscheinlich setze ich mich aber morgen erstmal an die Share Funktion, damit man Programme speichern kann. Würde das eigentlich nicht machen, muss aber laut Vorgabe eine Datenbank benutzen
.
Ich lade wieder alle ein das Ding mal für 5 Minuten auszutesten
. Freue mich über jedes Programm
.
http://185.177.21.162/style.html <-- Hier geht der Spaß los
Firefox und Chrome approved.
Zusammengebaute Instruktionen - Bibliothek
Hier ist eine kleine Liste von Instruktionen, die ich schon synthetisiert habe. Zum Copy-Pasten, damit es bei euch ein bisschen schneller geht. Da der LeftShift wahrscheinlich morgen rausgekickt wird und um eine unsigned jmple Variante ersetzt wird, habe ich ihn auch schon in die Liste aufgenommen. Die Operationen enthalten Beispielzahlen
NOT:
push x
push x
nand
x:
db 0
----
AND:
push x
push y
nand
push x
push y
nand
nand
x:
db 5
y:
db 7
----
OR:
push x
push x
nand
push y
push y
nand
nand
x:
db 5
y:
db 7
----
NOR:
push x
push x
nand
push y
push y
nand
nand
pop z
push z
push z
nand
x:
db 5
y:
db 7
z:
db 0
----
XOR:
push x
push y
nand
pop z
push x
push z
nand
push y
push z
nand
nand
x:
db 5
y:
db 7
z:
db 0
----
XNOR:
push x
push x
nand
push y
push y
nand
nand
push x
push y
nand
nand
x:
db 5
y:
db 7
----
NEG/2er Kompliment:
push x
push x
nand
push one
add
x:
db 5
one:
db 1
----
SUB:
push y
push y
nand
push one
add
push x
add
x:
db 7
y:
db 5
one:
db 1
----
TEST SIGN:
push toTest
push signMask
nand
push toTest
push signMask
nand
nand
push signMask
add
push zero
jmple isNegative
push itIsPositive //code is executed when positive
isNegative:
push itIsNegative //code is executed when negative
toTest:
db 130
signMask:
db 128
zero:
db 0
itIsPositive:
db 42
itIsNegative:
db 24
----
LEFT SHIFT BY 1:
push x
push x
add
x:
db 5
----
Alles anzeigen
SNIP
Imho ist der beste Weg dafür, sich irgendwo Platz zu reservieren um dann temporär Werte dahin auszulagern. Genau wie bei 32-Bit x86, wo nicht alles in EAX,EBX,ECX und EDX passt.
Wenn ich heute pushi und popi implementiere kann man das ganze auch kompakter schreiben, indem man sich eine schöne Loop baut, die den Pointer zum Screen inkrementiert. Man muss nur das Carry beachten, bzw. selber berechnen.
Den LeftShift wollte ich vielleicht rauswerfen, um ihn stattdessen durch ein jmple (unsigned) zu ersetzen. Bin aber noch am überlegen, ob ich das mache oder nicht. Vielleicht kann man mit Tricks signed comparison mit einer unsigned operation machen. Bin da für Vorschläge offen. Man könnte natürlich Add rauswerfen, da man es per NAND synthesieren kann, aber so böse bin dann auch nicht. Ein bisschen Komfort muss sein.
Als Guide, wie man aus Nand und Add alles zusammenbauen kann übrigens:
http://bisqwit.iki.fi/story/howto/bitmath/
https://en.wikipedia.org/wiki/NAND_logic
Ich kann man mich ja mal an deinem Programm versuchen, ob ich es hinkriege. Wäre ein geiles Beispielprogramm. Denke mit ein bisschen reservierten Speicher kriegt man das hin. Sonst notfalls die Stacktiefe erhöhen ![]()
SNIP
Ja die Regex hab ich gestern Abend hier schnell reingehauen, hab die nicht überprüft, aber kann das editieren.
Der Assembler sollte sich über nicht vorhandene Labels beschweren, aber das wird in die Konsole geloggt und noch nicht auf der Webseite angezeigt. Außerdem sagt er dir noch nicht, welches Label er nicht findet. Aber das steht auf der TODO Liste.
Der zweite Vorschlag klingt auch gut, sicherlich realisierbar, da ich die Instruktion ja sowieso dekodiere.
In etwa genau einem Monat bin ich aus Amerika zurück und werde wieder rumbasteln.
In der Zwischenzeit wurde ich von meinen Kurs aufgezwungen eine "WebApp" zu schreiben (was hat das eigentlich mit Systemprogramming zu tun, naja hinterfragen wir den Syllabus mal nicht). Da ich zu unkreativ für ein Spiel bin, und keine ToDo Liste oder Memeschrott implementieren will (FuckUp Utilities 9000?) habe ich mich dazu entschieden eine kleine VM zu schreiben für einen kleinen imaginären Prozessor. Wollte euch mal als Feedback rekrutieren ![]()
Zurzeit befindet sich Stack8 noch in der "Alpha" Phase. Aber am 4. Dezember ist Deadline und deswegen wird das recht schnell gehen. Die grundlegende VM und Assembler ist implementiert, dazu ein kleiner 4:3 Screen (Wortwörtlich 40 mal 30 Pixel) und ein Speicher und Stack Debugger. Das ganze heißt Stack8, weil der User nur 8KB Speicher bekommt, zudem benutzt die CPU die Stackarchitektur (Interner Stack statt Register) mit Tiefe 8 und besitzt nur 8 Instruktionen. Die Datenbreite ist 8-Bit, obviously. Meiner Meinung nach sollte das ganze auch Turingkomplett sein, heißt mit den Instruktionen kann man alles berechnen was man will.
Das Instructionset ist noch nicht ausgereift, will aber morgen den finalen Entwurf machen, nachdem ich ein bisschen rumgeforscht habe.
Zurzeit ist implementiert:
push -> pusht Inhalt einer absoluten Adresse auf den Stack
pop -> popt den obersten Eintrag auf den Stack in eine absolute Adresse
nand -> Nand auf den obersten beiden Einträgen
add -> Add ohne Carry auf den obersten beiden Einträgen
lfsh -> Left Shift auf den obersten Einträgen (1. Eintrag = Shiftamount, 2. Eintrag = to be shifted) -> Wird rausgeschmissen, da synthesierbar
jmple -> Jump if less or equal zur absoluten Adresse (Signed Comparison)
pushi -> pusht Inhalt des Pointers in der absoluten Adresse auf den Stack (TODO)
popi -> pusht den obersten Eintrag auf den Stack in die Adresse, auf die der Pointer zeigt, der an der absoluten Adresse liegt (TODO)
---
db -> pseudoinstruction, sagt dem Assembler, dass hier Daten liegen
[0-9a-zA-Z]+: -> Label
#[0-9]+ -> Absolute Adresse
----
Adresse 6991 - 8191: Screenmemory
Alles anzeigen
Der Assembler ist caseinsentiv und parst das ganze sehr freizügig. Viele Leerzeichen oder überflüssige Argumente machen dem Assembler kein Problem. Bei Problemen wird aber zurzeit nur in die Webkonsole geloggt. Safari und Edge wollen noch nicht richtig, aber Firefox und Chrome machen 0 Probleme.
Bugs sind mir ein paar bekannt, z.B. wenn ein Label ganz am Anfang steht, kommt der Assembler nicht drauf klar stattdessen #0 schreiben. Auch kann mit "db" zurzeit nur 2 Einträge gleichzeitig definiert werden. "db 5,6" schreibt 5 und 6 in zwei aufeinanderfolgende Speicherzellen. "db 5,6,7" ignoriert die 7.
Ein Beispielprogramm:
push var1
push var2
add
pop var1
push var1
pop #7000
jmple #0
var1:
db 0
var2:
db 5
Alles anzeigen
Das Programm addiert immer weiter 5 auf var1 (also 5, 10, 15...) schreibt das ganze dann in Adresse 7000, was dazu führt dass ein Pixel beschrieben wird (RRRGGGBB Format).
Baustelle ist zurzeit das Design. Bootstrap will nicht so wie ich will, und mobil sieht das ganze leider sehr bescheiden aus. Wenn sich einer Webdesign auskennt, ich nehme Tipps gerne an. Bezüglich Webdesign benutze ich nur Bootstrap internals, also kein externes Style CSS. Die Skripte sind zurzeit in die Webseite integriert, werden aber später ausgelagert. Wahrscheinlich werde ich auch noch den Programm Counter in den Memory Space Mappen, um vielleicht das Springe dynamischer zu machen.
FAQ:
Warum?
->Wollte schon immer mein eigenes Brainfuck ![]()
Die Testseite:
http://185.177.21.162/style.html
Wer sich traut damit mal für 2 Minuten rumzuspielen oder wer mir helfen will, dass Webdesign auch auf kleinen Bildschirmen zum laufen zu kriegen, kann ja hier mal seinen Senf reinschreiben.