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

Blue Max

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

Download Hobby Basic Version 1.2.6
 

Συνημμένα

  • HB.zip
    76,5 KB · Προβολές: 27

Lord Vek

Retro Member
Joined
11 Φεβ 2008
Μηνύματα
407
Αντιδράσεις
314
Μου βγάζει ένα μήνυμα "Failed: Network error" και δεν ολοκληρώνει το download...
 

Blue Max

RetroNuts
Joined
13 Οκτ 2020
Μηνύματα
1.446
Αντιδράσεις
4.455
Εμένα μου πετάει 404. Φαντάσου δεν μπορώ να την κατεβάσω μέσα από το google drive μου, ενώ είμαι συνδεδεμένος. Έχει ξανασυμβεί, ελπίζω να επανέλθει σύντομα, αλλιώς θα βρω κάπου hosting να την ανεβάσω.

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


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

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

Blue Max

RetroNuts
Joined
13 Οκτ 2020
Μηνύματα
1.446
Αντιδράσεις
4.455
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
    72,5 KB · Προβολές: 17
Τελευταία επεξεργασία:

Blue Max

RetroNuts
Joined
13 Οκτ 2020
Μηνύματα
1.446
Αντιδράσεις
4.455
Ακόμα ένα παράδειγμα της 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
 
Τελευταία επεξεργασία:

Blue Max

RetroNuts
Joined
13 Οκτ 2020
Μηνύματα
1.446
Αντιδράσεις
4.455
Παράδειγμα της εντολής 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
 

Blue Max

RetroNuts
Joined
13 Οκτ 2020
Μηνύματα
1.446
Αντιδράσεις
4.455
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
    72,6 KB · Προβολές: 9
Τελευταία επεξεργασία:

Lord Vek

Retro Member
Joined
11 Φεβ 2008
Μηνύματα
407
Αντιδράσεις
314
Έκανα τις αλλαγές στο 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
 

Blue Max

RetroNuts
Joined
13 Οκτ 2020
Μηνύματα
1.446
Αντιδράσεις
4.455
Γεια σου Άρχοντα Vek,

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

Ευχαριστώ που την κατέβασες.
 
Τελευταία επεξεργασία:

Lord Vek

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

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

Blue Max

RetroNuts
Joined
13 Οκτ 2020
Μηνύματα
1.446
Αντιδράσεις
4.455
Γεια χαρά,

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

1637676034216.png
 

Blue Max

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

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

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