BrainFuck Assembly Language with "Flexible" Arguments by Daniel Marschall 28,07,2010 ----------------------------------------------------------- Legend: # or * means e.g. >3 or <2 as possible argument. <3 means <<< and >3 means >>> and so on. In the syntax (#) means our initial argument (e.g. >3) (#') means the inverse of our argument, e.g. <3. Example: ADD0 # with syntax [-(#)+(#')] can be used as ADD0 >3 with translation [->>>+<<<] i means a number (including 0) as possible argument In the syntax statement, (+i) means ++++ if i is 4 and so on. The same thing for (-i). ----------------------------------------------------------- MOVE # Laufe nach Links/Rechts # darf nicht leer sein (#) ZERO Die aktuelle Zelle leeren [-] ADDI i Die aktuelle Zelle um den Wert i erhöhen (+i) SUBI i Die aktuelle Zelle um den Wert i verringern (-i) SETI i Der aktuellen Zelle den Wert i zuweisen ZERO [-] ADDI i (+i) [-](+i) ZERO # Setze 0. # darf leer sein und darf weggelassen werden, womit "ZERO" erzeugt wird. MOVE # (#) SETI 0 [-] MOVE #' (#') (#)[-](#') ADD0 # Addiere auf linke/rechte Zelle und setze 0. # darf nicht leer sein [-(#)+(#')] ADD0 # * ... Addiere nach verschiedene Bereiche Parameter dürfen nicht leer sein [-(#)+(#')(*)+(*')...] SHI0 # Verschiebe nach Links/Rechts und setze 0. # darf nicht leer sein ZERO # (#)[-](#') ADD0 # [-(#)+(#')] (#)[-](#')[-(#)+(#')] SHI0 # * ... Verschiebe nach verschiedene Bereiche und setze 0. Parameter dürfen nicht leer sein ZERO # (#)[-](#') ZERO * (*)[-](*') ... ADD0 # * ... [-(#)+(#')(*)+(*')...] (#)[-](#')(*)[-](*')...[-(#)+(#')(*)+(*')...] SUB0 # Betrag von linker/rechter Zelle abziehen und Nullsetzen (ohne Unterlaufprüfung!) # darf nicht leer sein [-(#)-(#')] SWP0 # * Tausche mit # und nutze * als Tauschplatz (der 0 gesetzt wird). Vorsicht! KEINE Gültigkeitsprüfung von # und * ! # darf nicht gleich * sein. Weder # noch * dürfen leer sein. STEPS < > <-- EXAMPLE Arrow-Directions * # ?? (aa) bb (??) aa bb (*) MOVE * --\ (00) aa bb [-] SETI 0 --+ 00 (aa) bb (*') MOVE *' --+--> ZERO * --\ aa (00) bb [-(*)+(*')] ADD0 * ADD0 * --+--> SHI0 * aa 00 (bb) (#) MOVE # MOVE # MOVE # aa bb (00) [-(#')+(#)] ADD0 #' ADD0 #' ADD0 #' aa (bb) 00 (#') MOVE #' MOVE #' --\ (aa) bb 00 (*) MOVE * MOVE * --+--> MOVE #'* (00) bb aa [-(*')(#)+(#')(*)] ADD0 *'# ADD0 *'# ADD0 *'# 00 (bb) aa (*') MOVE *' MOVE *' MOVE *' CODE (*)[-](*')[-(*)+(*')](#)[-(#')+(#)](#')(*)[-(*')(#)+(#')(*)](*') ALTERNATIV SHI0 * MOVE # ADD0 #' MOVE #'* ADD0 *'# MOVE *' EXAMPLE SWP0 >3 <2 ?? ?? (aa) ?? ?? bb => 00 ?? (bb) ?? ?? aa # = >>> * = << #' = <<< *' = >> SHI0 <2 MOVE >3 ADD0 <3 MOVE <3<2 = <5 ADD0 >2>3 = >5 MOVE >2 <<[-]>>[-<<+>>]>>>[-<<<+>>>]<<<<<[->>>>>+<<<<<]>> ============================== // COPY COPY # * { // # = Target, may not be current position // * = Temp, may not be current position, reset to 0. // * and # may not be the same SHI # * // (#)[-](#')(*)[-](*')[-(#)+(#')(*)+(*')] MOVE * // (*) SHI *' // (*')[-](*)[-(*')+(*)] MOVE *' // (*') // (#)[-](#')(*)[-](*')[-(#)+(#')(*)+(*')](*)(*')[-](*)[-(*')+(*)](*') } // COMPARE COMP n * { // n = Welcher Wert wird angenommen? // * = Temp, may not be current position, reset to 0. MOVE * SETI n WHILE !=0 { SUBI 1 MOVE *' SUBI 1 MOVE * } SETI 1 // Initialize "ELSE" part MOVE *' WHILE !=0 { SETI 0 // Optional: Reset current position (which is difference) MOVE * SETI 0 // Destroy "ELSE" part MOVE *' } MOVE * WHILE !=0 { SETI 0 } MOVE *' }