eZoteriXa

Hovori vam nieco slovo ezoterika?

Nie, nie, nebudeme vestit z kariet a ani skumat aki sme podla polohy hviezd v den narodenia.

 


Kedysi som na webe natrafil na pojem ‚Ezotericke programovacie jazyky‘. Priznam sa, ihned mi niektore ucarovali a nie len svojim nazvom, ale napriklad aj svojou jednoduchostou ci naopak prehnanou zlozitostou. A tak som sa zoznamil s jazykom Brainfu*k (selfcensored ;]), Befunge, Malbolge alebo Piet. (vid. http://en.wikipedia.org/wiki/Esoteric_programming_language , https://esolangs.org/wiki/Main_Page )

Nuz a tak mi napadlo, preco si nejaky taky Brainfu*k nenaprogramovat pre nasho milacika? Ako motivacia posluzil tiez tento „hello world“ program:

++++++++++[>+++++++>++++++++++>+++<<<-]>++.>+.+++++++
..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.

( http://en.wikipedia.org/wiki/Esoteric_programming_language#brainfuck )

No nie je to nadhera? ;]

Popis jazyka a „rozpitvany“ hello world (jemne inu verziu ako uz spomenutu) je mozne najst na stranke http://en.wikipedia.org/wiki/Brainfuck .

Nuz, a implementacia (netvrdim ze bezchybna ;]) pre zx:

        cpu    z80undoc
        relaxed    on
        
ROM_KEY_SCAN:    equ    0x028E

        org    25000

;randomize usr 25000 => translate char(10)->char(13)
;randomize usr 25001 => do not translate

        db    62    ;ld    a,"code of xor a"
        xor    a
        ld    (translate),a
        ld    hl,dta
        ld    de,dta+1
        ld    bc,32767
        ld    (hl),0
        ldir
        
        ld    a,2
        call    $1601
        
        ld    de,prg
        ld    hl,dta
        call    interpret
        ret
        
interpret:
        ld    a,d
        rlca
        ret    c    ; out off program memory
        ld    a,(de)
        cp    255    ; artifical instruction end of program
        ret    z
        
        cp    '>'
        jr    z,inc_ptr
        cp    '<'
        jr    z,dec_ptr
        cp    '+'
        jr    z,inc_dta
        cp    '-'
        jr    z,dec_dta
        cp    '['
        jr    z,brnch_open
        cp    ']'
        jr    z,brnch_close
        cp    '.'
        jr    z,print
        cp    ','
        jr    nz,next
input:
        push    de
        push    hl
        
        ld    a,1
        out    (254),a
input_loop:
        call    ROM_KEY_SCAN
        jr    nz,input_loop
        
        ld    a,e
        cp    0xff    ;nokey
        jr    z,input_loop

        cp    0x27    ;caps
        jr    z,input_loop
        cp    0x18    ;symb
        jr    z,input_loop
        
        ld    hl,normal_keys
        ld    a,d
        cp    0xff
        jr    z,input_havetab
        ld    hl,caps_keys
        cp    0x27
        jr    z,input_havetab
        ld    hl,symb_keys
        cp    0x18
        jr    nz,input_loop    ;some weird value
        
input_havetab:
        ld    d,0
        add    hl,de
        ld    a,(hl)
        call    translate_zx2pc
        pop    hl
        pop    de
        ld    (hl),a
        
input_wait_release:
        xor    a
        in    a,(254)
        cpl
        and    31
        jr    nz,input_wait_release
        out    (254),a
        
next:
        inc    de
        jr    interpret
        
print:
        ld    a,(hl)
        call    translate_pc2zx
        rst    16
        jr    next

inc_ptr:
        inc    hl
        jr    next
        
dec_ptr:
        dec    hl
        jr    next
        
inc_dta:
        inc    (hl)
        jr    next
        
dec_dta:
        dec    (hl)
        jr    next
        
brnch_open:
        ld    a,(hl)
        or    a
        jr    nz,next
        ld    c,0
        
branch_open_loop:
        ld    a,(de)
        cp    '['
        jr    nz,branch_open_1
        inc    c
        
branch_open_1:
        cp    ']'
        jr    nz,branch_open_2
        dec    c
        
branch_open_2:
        inc    de
        ld    a,c
        or    a
        jr    nz,branch_open_loop
        
        dec    de
        jr    next
        
brnch_close:
        ld    a,(hl)
        or    a
        jr    z,next
        ld    c,0
        
branch_close_loop:
        ld    a,(de)
        cp    ']'
        jr    nz,branch_close_1
        dec    c
        
branch_close_1:
        cp    '['
        jr    nz,branch_close_2
        inc    c
        
branch_close_2:
        dec    de
        ld    a,c
        or    a
        jr    nz,branch_close_loop
        
        inc    de
        jr    next

translate_zx2pc:
        cp    13
        ret    nz
        ld    a,(translate)
        or    a
        ld    a,10
        ret    nz
        ld    a,13
        ret
        
translate_pc2zx:
        cp    10
        ret    nz
        ld    a,(translate)
        or    a
        ld    a,13
        ret    nz
        ld    a,10
        ret
normal_keys:
        db    "bhy65tgv"
        db    "nju74rfc"
        db    "mki83edx"
        db    0x18,"lo92wsz"
        db    " ",13,"p01qa",0x27
caps_keys:
        db    "BHY",10,8,"TGV"
        db    "NJU",11,"4RFC"
        db    "MKI",9,"3EDX"
        db    0x18,"LO92WSZ"
        db    " ",13,"P",8,"1QA",0x27
symb_keys:
        db    "*^[&%>}/"
        db    ",-]'$<{?"
        db    ".+",0x7f,"(#e\\`"
        db    0x18,"=;)@w|:"
        db    " ",13,'"',"_!q~",0x27
        
translate:
        db    0
        
prg:
        binclude    "fib.b"
        
dta:        equ    32768

a ukazkovy program (pouzity v predchadzajucom code pomocou binclude) na vypis fibonacciho postupnosti cisel (fib.b):

(zdroj: http://www.hevanet.com/cristofd/brainfuck/)

>++++++++++>+>+[
    [+++++[>++++++++<-]>.<++++++[>--------<-]+<<<]>.>>[
        [-]<[>+<-]>>[<<+>+>-]<[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-
            [>+<-[>+<-[>+<-[>[-]>+>+<<<-[>+<-]]]]]]]]]]]+>>>
    ]<<<
]
This program doesn't terminate; you will have to kill it.
Daniel B Cristofani (cristofdathevanetdotcom)
http://www.hevanet.com/cristofd/brainfuck/

– ub

1 komentár pri “eZoteriXa

Pridaj komentár