Hobby Basic, ένας μικρός διερμηνευτής για την κονσόλα των Windows

H google κάποιες φορές μπλοκάρει το κατέβασμα της Hobby Basic από το drive θεωρώντας τη (λανθασμένα) ύποπτο αρχείο. Έχει ξανασυμβεί αλλά συνήθως μετά από κάποιο διάστημα την ξεμπλοκάρει. Ωστόσο αν αντιμετωπίζετε πρόβλημα στο κατέβασμα ανέβασα την τελευταία έκδοση εδώ.

Download Hobby Basic Version 1.2.6
 

Συνημμένα

  • HB.zip
    HB.zip
    76,5 KB · Προβολές: 29
Μου βγάζει ένα μήνυμα "Failed: Network error" και δεν ολοκληρώνει το download...
 
Εμένα μου πετάει 404. Φαντάσου δεν μπορώ να την κατεβάσω μέσα από το google drive μου, ενώ είμαι συνδεδεμένος. Έχει ξανασυμβεί, ελπίζω να επανέλθει σύντομα, αλλιώς θα βρω κάπου hosting να την ανεβάσω.

Αν την ανεβάσεις στο virustotal σήμερα δίνει 7/61, σχετικά νορμάλ αν σκεφτείς πως κάποτε έδινε το τριπλάσιο. Είναι κάπως αστείο αυτό που συμβαίνει, γιατί αν την δοκιμάσω ξανά σε μία εβδομάδα θα δώσει 5/61 ή 10/61 ή ότι νάναι.


Ουσιαστικά το μόνο που άλλαζει είναι το μέγεθος του εκτελέσιμου. Οι βιβλιοθήκες που χρησιμοποιώ είναι οι ίδιες. Παρατηρώ πως όσο την αναπτύσσω και το μέγεθος μεγαλώνει τόσο λιγοστεύουν τα false positives.

Σήμερα στην εποχή των GB και ΤΒ, τα εκτελέσιμα λίγων kb φαίνονται ύποπτα :-)
 
Τελευταία επεξεργασία:
1635412737454.png

Hobby Basic 1.2.7

Ένα νέο update στον διερμηνευτή.
Ξεκινώντας από αυτήν την έκδοση, η Hobby Basic αναπτύσσεται σε περιβάλλον Windows 10.

Η Hobby Basic μπορεί να τρέξει κώδικα της γλώσσας Brainfuck.
Η διασύνδεση με την Hobby Basic γίνεται μέσω της συνάρτησης BF(script$).

Η Brainfuck είναι μια εσωτερική γλώσσα προγραμματισμού που δημιουργήθηκε το 1993 από τον Urban Müller στην Amiga.
Έχει 8 εντολές []<>+-,. και είναι Turing-complete, που σημαίνει πως θεωρητικά, παρέχοντας άπειρη μνήμη στο σύστημα, αυτό μπορεί να εκτελέσει οποιονδήποτε υπολογισμό. Ο διερμηνευτής μου χρησιμοποιεί 8-bit μέγεθος κελιών για συμβατότητα με τα προγράμματα που κυκλοφορούν.

Παράδειγμα.

Print "brainfuck" with a linefeed.
Κώδικας:
    rem  BF.BAS
    rem  Hobby Basic's internal Brainfuck interpreter
    rem  Print "brainfuck" with a linefeed

    script$ = '>++++[>++++++<-]>-[[<+++++>>+<-]>-]<<[<]>>>>--.<<<-.>>>-.<.<.>---.<<+++.>>>++.<<---.[>]<<.'

    screen 80,25,300
    color 0,7
    cls

    title 'Hobby Basic''s internal Brainfuck interpreter'

    pen 6
    print script$
    print
    pen 7

    BF(script$)

    inkey
    end

1635412383725.png

Download Hobby Basic Version 1.2.7
 

Συνημμένα

  • HB.zip
    HB.zip
    72,5 KB · Προβολές: 18
Τελευταία επεξεργασία:
Ακόμα ένα παράδειγμα της Brainfuck μέσα από την Hobby Basic.
Αυτή την φορά φορτώνω ένα εξωτερικό script.

Display Sierpinski triangle.
Κώδικας:
    rem  Hobby Basic's internal Brainfuck interpreter
    rem  Display Sierpinski triangle

    url$ = 'http://brainfuck.org/sierpinski.b'

    load url$,script$
    if V0 = -1
        print 'url error' : pause : end
    endif

    screen 80,47,300
    color 0,7
    cls

    title 'Hobby Basic''s internal Brainfuck interpreter'

    pen 6
    print script$
    print
    pen 7

    BF(script$)

    inkey
    end

1635517847905.png
 
Τελευταία επεξεργασία:
Παράδειγμα της εντολής GETHTML.
Τυπώνει στην κονσόλα τον αριθμό των online μελών του retromaniax (από Vista και πάνω).
Κώδικας:
        source$ = GETHTML('https://retromaniax.gr/')
        start = FIND(source$,'block-footer-counter')
        if start = 0 then ? 'start failed' : end
        start = start + 22
        stop = FIND(source$,'</span>',start)
        if stop = 0 then ? 'stop failed' : end
        len = stop - start
        for n = 0 to len - 1 : a$ = a$ + source$(start+n) : next
        a$ = replace(a$,'&nbsp; ','')
        ?:? 'Μέλη online' : ? a$
        end

Προβολή συνημμένου 221418


Εχθές αργά έκλεψα λίγο χρόνο και ξαναέγραψα το πρόγραμμα, αυτή την φορά να εμφανίζει και την λίστα των μελών στην κονσόλα. Με ένα κλικ μέσα από το notepad++ βλέπω τα online μέλη. Χαζομαρούλες που μου αρέσει να γράφω με την Hobby Basic. Τρέχει στην 1.2.7.

Κώδικας:
    rem  Who's online

    s1$ = 'block-footer-counter'
    s2$ = '</span>'
    s3$ = '&nbsp; '
    s4$ = '/members/'
    s5$ = 'listInline--comma'
    s6$ = '</ul>'
    source$ = GETSRC('https://retromaniax.gr/')

    title 'Retromaniax.gr'
    screen 80,25,1000
    cursor 1,25
    color 0,7
    cls

    a$ = ''
    a = FIND(source$,s1$)
    if ~a then ? s1$ : end
    a = a + LEN(s1$) + 2
    b = FIND(source$,s2$,a)
    if ~b then ? s2$ : end
    for n = 0 to b-2 : a$ = a$ + source$(a+n) : next
    total$ = REPLACE(a$,s3$,'')

    ? 'Μέλη online' : ?

    a = FIND(source$,s5$)
    if ~a then ? 'Δεν υπάρχουν μέλη τώρα online' : goto @f
    b = FIND(source$,s6$,a)
    if ~b then ? s6$ : end
    source1$ = MID(source$,a,b)
    dim member$[1] : a = 1 : idx = 0

    do
        p = FIND(source1$,s4$,a)
        if ~p then break
        a = a + p + LEN(s4$) - 1
        b = FIND(source1$,'.',a)
        if ~b then break
        b$ = TRIM(0,MID(source1$,a,b-1))
        if LEN(b$) and ASC(b$(1)) <> '%'
            member$[].delete idx
            member$[].insert idx, b$
            idx = idx + 1
        endif
        a = a + b
    until ~p

    for idx = 0 to LEN(member$[])-1 : ? member$[idx] : next
    @@# ? : ? total$
    inkey
    end

1637069540024.png
 
Hobby Basic 1.2.8 - Κάποιες μικρές αλλαγές και διορθώσεις.

Το πρόγραμμα στο προηγούμενο ποστ δεν εμφανίζει τα Ελληνικά ονόματα. Στην έκδοση 1.2.8 η συνάρτηση GETSRC τροποποιήθηκε (μέχρι νεωτέρας) και πραγματοποιείται εσωτερικά URL αποκωδικοποίηση.

Η παρακάτω γραμμή
Κώδικας:
        if LEN(b$) and ASC(b$(1)) <> '%'
θα γίνει
Κώδικας:
        if LEN(b$)

Τώρα εμφανίζει και τα Ελληνικά ονόματα.

members-list2.png


Ένας νέος τρόπος ορισμού των μεταβλητών μιας διάταξης.
Ο στάνταρ τρόπος.
Κώδικας:
    dim a[3] = 1, 2, 3
    dim a$[3] = 'One', 'Two', 'Three'
νέος, πιο δυναμικός τρόπος
Κώδικας:
    dim a[] = 1, 2, 3
    dim a$[] = 'One', 'Two', 'Three'

Στο προηγούμενο ποστ, η γραμμή
Κώδικας:
    dim member$[1] : a = 1 : idx = 0
μπορεί να γίνει
Κώδικας:
    dim member$[] : a = 1 : idx = 0


Η συνάρτηση MATCH ανανεώθηκε.
Κώδικας:
    mytext$ = 'ab'
    b$ = 'abc'
    c$ = 'ab'
    ? MATCH(mytext$,'abcd',b$,c$)       ! prints 3


Οι τελεστές ++ και -- μπορούν να εφαρμοστούν σε μεταβλητές.
Κώδικας:
    μετρητής = 0
    while μετρητής < 10
        ? μετρητής
         μετρητής++
    endw


Download Hobby Basic Version 1.2.8
 

Συνημμένα

  • HB.zip
    HB.zip
    72,6 KB · Προβολές: 9
Τελευταία επεξεργασία:
Έκανα τις αλλαγές στο who's online. Την λέξη "μέλη" μου την βγάζει με ερωτηματικά αλλά τα μέλη με ελληνικά ονόματα μου τα βγάζει κανονικά:

Who's Online.jpg

Κώδικας:
rem  Who's online

    s1$ = 'block-footer-counter'
    s2$ = '</span>'
    s3$ = '&nbsp; '
    s4$ = '/members/'
    s5$ = 'listInline--comma'
    s6$ = '</ul>'
    source$ = GETSRC('https://retromaniax.gr/')

    title 'Retromaniax.gr'
    screen 80,25,1000
    cursor 1,25
    color 0,7
    cls

    a$ = ''
    a = FIND(source$,s1$)
    if ~a then ? s1$ : end
    a = a + LEN(s1$) + 2
    b = FIND(source$,s2$,a)
    if ~b then ? s2$ : end
    for n = 0 to b-2 : a$ = a$ + source$(a+n) : next
    total$ = REPLACE(a$,s3$,'')

    ? 'Μέλη online' : ?

    a = FIND(source$,s5$)
    if ~a then ? 'Δεν υπάρχουν μέλη τώρα online' : goto @f
    b = FIND(source$,s6$,a)
    if ~b then ? s6$ : end
    source1$ = MID(source$,a,b)
    dim member$[] : a = 1 : idx = 0

    do
        p = FIND(source1$,s4$,a)
        if ~p then break
        a = a + p + LEN(s4$) - 1
        b = FIND(source1$,'.',a)
        if ~b then break
        b$ = TRIM(0,MID(source1$,a,b-1))
        if LEN(b$)
            member$[].delete idx
            member$[].insert idx, b$
            idx = idx + 1
        endif
        a = a + b
    until ~p

    for idx = 0 to LEN(member$[])-1 : ? member$[idx] : next
    @@# ? : ? total$
    inkey
 
Γεια σου Άρχοντα Vek,

Δοκίμασε να αλλάξεις γραμματοσειρά στην κονσόλα (δεξί πλήκτρο ->ιδιότητες), άλλαξε π.χ. σε Lucida Console.
Σημείωσε πως τον κώδικα πρέπει να τον σώσεις σε μορφή UTF-8 αφού περιέχει Ελληνικά, και όχι ANSI.

Ευχαριστώ που την κατέβασες.
 
Τελευταία επεξεργασία:
Δεν ξέρω αν κάνω save σε UTF-8. Αποθηκεύω από Wordpad σε Text Document - MS Dos Format. Με Lucida Console font τα ερωτηματικά γίνονται τετράγωνα (εννοώ χαρακτήρα τετραγωνάκι). Παρατήρησα ότι ενώ το αρχικό "Μέλη" το γράφει με ερωτηματικά, παρακάτω στο Σύνολο Μέλη/Επισκέπτες το γράφει κανονικά.

Τέλος, εγώ ευχαριστώ για αυτή την Basic που κάθισες και δημιούργησες. Μακάρι να μπορούσα να ασχοληθώ περισσότερο. Η αλήθεια είναι πως για πολλές από τις εντολές δεν καταλαβαίνω τι γίνεται και πως λειτουργούν. Και να σκεφτείς πως έγραφα προγράμματα σε Spectrum και σε AMOS Basic. Μάλλον ο εγκέφαλός μου έχει σκουριάσει πια.
 
Γεια χαρά,

Κάνε copy-paste τον κώδικα στο σημειωματάριο των Windows (notepad) και αποθήκευσε τον επιλέγοντας utf-8 κωδικοποίηση. Και πες μου.

1637676034216.png
 
Τέλος, εγώ ευχαριστώ για αυτή την Basic που κάθισες και δημιούργησες. Μακάρι να μπορούσα να ασχοληθώ περισσότερο. Η αλήθεια είναι πως για πολλές από τις εντολές δεν καταλαβαίνω τι γίνεται και πως λειτουργούν. Και να σκεφτείς πως έγραφα προγράμματα σε Spectrum και σε AMOS Basic. Μάλλον ο εγκέφαλός μου έχει σκουριάσει πια.

Μια χαρά σε βρίσκω. Είναι και η Hobby κάπως ιδιαίτερη περίπτωση. Την εξελίσσω με τα δικά μου μέτρα και γούστα.

Είχα ασχοληθεί με AMOS Basic στην Amiga. Κάποια στιγμή που θα έχω τον χρόνο και την διάθεση θα ψάξω να βρώ προγράμματα (κυρίως παιχνίδια) που σώζονται και θα τα παρουσιάσω.
 
Hobby Basic 1.2.9

Ένα νέο update στον διερμηνευτή.

Το update αυτό περιλαμβάνει ορισμένα fix και κάποιες αλλαγές που συμβάλλουν ακόμα περισσότερο στην σταθερότητα του διερμηνευτή. Αλλά και μια user-friendly προσθήκη.

Η προσθήκη αφορά τον τρόπο που μπορούμε να τρέξουμε ένα πρόγραμμα. Εκτός από την γραμμή εντολών, τώρα κάνοντας κλικ πάνω στο αρχείο HB.EXE ανοίγει το παράθυρο διαλόγου "Άνοιγμα" και επιλέγουμε εύκολα ένα πρόγραμμα.

Hobby-Basic-Open-Dialog.png

Download Hobby Basic Version 1.2.9
 
Τελευταία επεξεργασία:
Hobby Basic 1.3.2

Ένα νέο update στον διερμηνευτή, μικρές αλλαγές και διορθώσεις.
Tα παραδείγματα βελτιώθηκαν και τρέχουν καλύτερα.

Προστέθηκε μια νέα εντολή, η PROMPT εμφανίζει ένα input box στην κονσόλα των Windows.
Το win32 api ενώ διαθέτει message box, δεν έχει input box, και πρέπει αυτό να προγραμματιστεί.
Στην C++ είναι σχετικά εύκολο, στην assembly ήταν κομματάκι πιο μπέρδεμα.
Δουλεύει καλά όμως και είμαι ευχαριστημένος.
Το μέγεθος του διερμηνευτή αυξήθηκε κατά 1 KB.

Η σύνταξη της εντολής είναι:
Κώδικας:
    PROMPT(caption$,string$)         --> string V0

Παράδειγμα.
Κώδικας:
    a$ = prompt('Hello','Please enter your name')

    if LEN(a$) > 0
        print 'Hello ',a$
    endif

HOBBY_BASIC_INPUT_BOX_IN_CONSOLE.png

Download Hobby Basic Version 1.3.2
 
Τελευταία επεξεργασία:
To coffee project της ημέρας.
15 παζλ (με animation) σε 30 γραμμές Hobby Basic κώδικα.

Κώδικας:
    screen 80,25,300
    cursor 0,0
    color 0,0
    cls

    w = 8
    h = 5
    px = 0
    py = 0

    for n = 15 to 0 step -1
        color n,0
        x = ((n%4)*w)+2
        y = ((n/4)*h)+2
        paint x,y,w,h,' ',1
        at x+(w/2),y+(h/2),n
    next

    K#  inkey
    if (V2 = 37 and px < 3) then M(1,0,-1,0,w)
    if (V2 = 39 and px > 0) then M(-1,0,1,0,w)
    if (V2 = 38 and py < 3) then M(0,1,0,-1,h)
    if (V2 = 40 and py > 0) then M(0,-1,0,1,h)
    if V0 = 27 then end else goto K

sub M(a,b,c,d,r)
    px = px + a
    py = py + b
    x = (px*w)+2
    y = (py*h)+2
    for n = 0 to r-1
        move x,y,w,h,x+c,y+d
        x = x + c
        y = y + d
        wait 10
    next
ends

Hobby_Basic_15Puzzle_Console.png
 
To coffee project της ημέρας.
"The Matrix is everywhere. It is all around us. Even now, in this very room."

Κώδικας:
    j = 7
    r = 2
    l = 5
    m = 1
    dim a[80]

    screen 80,25
    cursor 0,0
    color 0,7
    cls

    do

        for i = 0 to 79
            if a[i] <> ' '
                a[i] = 33 + (j+i*i)%30
                if ~((i*i+r)%71) then pen 7 else pen 2
            endif
            ? chr(a[i]),
        next

        j = j + 31
        r = r + 17
        l = l + 47
        m = m + 67

        a[j%80] = '_'
        a[r%80] = ' '
        a[l%80] = '_'
        a[m%80] = ' '

        wait 10

    until key(27)
    end

1646382786205.png
 
To coffee project της ημέρας.
Flip animation στην κονσόλα με την Hobby Basic.

Κώδικας:
    a$=""
    a$=a$+"██████████▄▄▄      ▄▄▄▄█████████"+EOL$
    a$=a$+"█████▀▀     ▀▀    ▀▀         ▀██"+EOL$
    a$=a$+"███▀                           ▀"+EOL$
    a$=a$+"▀▀ ▄ ▄█████▄▄      ▄▄█████▄ ▄   "+EOL$
    a$=a$+" █▄▄█████▀█ ▀      ▀ ███▀███▄▄█ "+EOL$
    a$=a$+" ▄▄█ ████▄█          ███▄██ █▄▄ "+EOL$
    a$=a$+"  ▄█ ▀█▄███          █▄███▀ █▄  "+EOL$
    a$=a$+"▄     ▄███▄          ▄███▄      "+EOL$
    a$=a$+"█               █               "+EOL$
    a$=a$+"█               █▀▄             "+EOL$
    a$=a$+"█               █▀             ▄"+EOL$
    a$=a$+"█▀▄                          ▄██"+EOL$
    a$=a$+"█  ▀▄         ▀▄▄▄▀        ▄▀ ██"+EOL$
    a$=a$+"██   ▀▄                  ▄▀   ██"+EOL$
    a$=a$+"███    ▀▄              ▄▀    ███"+EOL$
    a$=a$+"███      ▀▄▄        ▄▄▀      ███"+EOL$

    cursor 0,0
    color 0,0
    cls

    color 12,0
    print a$

    do

        flip 0,0,32,16,0
        wait 250

    until KEY(27)
    end

HOBBY_BASIC_CONSOLE_ANIMATION.gif
 
Το coffee project της ημέρας.
Μπαρίτσες στην κονσόλα. Sorry δεν είχα χρόνο σήμερα για κάτι μεγαλύτερο, ήταν μικρός εσπρέσο.

Κώδικας:
    screen 80,32
    cursor 0,0
    color 0,0
    cls

    dim a[8] = 70,70,57,52,41,28,26,20

    for n = 0 to 7
        color n+5,n+5
        paint 0,n*4,a[n],3,' ',1
        print at a[n]+1,n*4+1,a[n]
    next

    inkey
    end

1646734895002.png
 
Πίσω
Μπλουζα