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

Καλημέρα.

Το Coffee Project της ημέρας. Bouncing Rectangles στο παράθυρο της κονσόλας χρησιμοποιώντας την TYPE.
Sorry, δεν είχα χρόνο για κάτι καλύτερo. Είναι 5 minute code.

Κώδικας:
    C = 80
    R = 40
    W = 8
    H = 5

    TYPE R (x,y,vx=1,vy=1) 6

    view 11
    screen C,R,0
    cursor 0,0 : color 0,0 : cls
    bsave 0,0,W-1,H-1,99

    for i = 0 to SIZE(R:[])-1
        color i+9,i+9
        paint 0,0,W,H,-1,-1
        bsave 0,0,W-1,H-1,i
        R:[i].x = i*W
        R:[i].y = i*H
    next

    color 0,7 : cls

    main#

    for i = 0 to SIZE(R:[])-1
        bload R:[i].x,R:[i].y,99
        R:[i].x = R:[i].x + R:[i].vx
        R:[i].y = R:[i].y + R:[i].vy
        if (R:[i].x < 1 or R:[i].x > (C-W)) then R:[i].vx = -R:[i].vx
        if (R:[i].y < 1 or R:[i].y > (R-H)) then R:[i].vy = -R:[i].vy
        bload R:[i].x,R:[i].y,i
    next

    wait 10 : if ~KEY(27) then goto main

BOUNCE.gif
 
Χμμμ... Τρέχοντας την Hobby Basic, σου βγάζει παράθυρο για να φορτώσεις κάποιο αρχείο. Πως προγραμματίζεις; Χρειάστηκε να φτιαξω αρχείο .BAS για να το δω.
 
Γεια χαρά, Ακριβώς έτσι όπως το έκανες. Οποιοδήποτε text editor, ακόμα και το απλό Notepad των Windows κάνει.
 
Δηλαδή δεν υπάρχει τρόπος να προγραμματίσεις, να δώσεις run για να δοκιμάσεις αυτό που έγραψες, κτλ;
 
Φυσικά! Αυτό είναι το "RUN" Lord Vek, το παράθυρο φόρτωματος που ανοίγει, είναι ο τρόπος. Μπορείς επίσης να τρέξεις το πρόγραμμα σου από την γραμμή εντολών χειροκίνητα, ή να κάνεις drag and drop το αρχείο σου πάνω στο HB.EXE. Σημείωσε, πως μπορείς και να τρέξεις από την γραμμή εντολών πρόγραμμα που βρίσκεται σε απομακρυσμένο server (risky feature). Και βέβαια, να δημιουργήσεις αυτόνομο εκτελέσιμο που μπορείς να το διανείμεις δωρεάν. θα μπορούσες και να συσχετίζεις τα αρχεία .BAS να ανοίγουν αυτόματα από το HB.EXE κάνοντας κλικ πάνω τους.

Έχω σκεφτεί να γράψω έναν απλό Windows IDE για την ΗΒ. Δεν θα ήθελα όμως να χρησιμοποιήσω κάποιο third party tool, αλλά να τον γράψω εξ ολοκλήρου σε Win32 assembly. Δεν έχω όμως τον ελεύθερο χρόνο που απαιτείται, και αν και το ξεκίνησα, το άφησα στην άκρη. Δεν μου αρέσει η ιδέα ενός έτοιμου IDE μερικών MB για έναν toy διερμηνευτή των 50 KB.
 
Τελευταία επεξεργασία:
Έγραψα ένα μικρό πρόγραμμα που τυπώνει τα thread views που έχει η Hobby BASIC στο φόρουμ του flat assembler, χωρίς να χρειάζεται να επισκεφτώ την ιστοσελίδα. Παρακολουθω έτσι τα views από την κονσόλα. Θα το βρείτε στον φάκελο EXAMPLES/MISC.

Δείτε τι εννοώ.

1697114808922.png

1697114823934.png

Have fun with Hobby BASIC.
 
Έγραψα το BLIX στην Hobby BASIC 1.6.8
To πρόγραμμα βρίσκεται στον φάκελο EXAMPLES/GAMES.

Το BLIX είναι μια απλή ιδέα παιχνιδιού που είχα και υλοποίησα το 2005.

Έκτοτε έχουν εμφανιστεί remake του παιχνιδιού σε διάφορα format.
Το BLIX υπάρχει σε GP32, GP2X και Wiz, Atari ST/STE/TT/Falcon 030, iPhone και iPad, Android, Intellivision (σε μορφή cartridge), Windows/Linux/Mac, GBA. Περισσότερα εδώ.

Η έκδοση για Hobby BASIC περιλαμβάνει 4 επίπεδα δυσκολίας, πλούσια μουσικά εφέ, και κάποια νέα χαρακτηριστικά.

Κώδικας:
BLIX is a game with a simple target.
Form columns of same-color tiles by scrolling the three rows.
Each scroll costs 2 moves, and each cleared column wins you 1 move.
The game ends when you run out of moves.

Press 1,2,3,4 to restart level anytime: EASY,NORMAL,HARD,EXPERT.
Press Spacebar to scroll the three rows randomly (costs 1 move).
Click on the arrow buttons to scroll a row.
Press S to toggle music on/off.

BLIX requires Windows 7 or later.

BLIX-PUZZLE-HOBBY-BASIC.png


Have fun with Hobby BASIC.
 
Τελευταία επεξεργασία:
To Eliminator είναι ένα νέο παζλ γραμμένο στην Hobby BASIC.
Εκ πρώτης όψεως μοιάζει με το Q, όμως είναι εντελώς διαφορετικά παιχνίδια.
θα τρέξει στην τελευταία έκδοση του διερμηνευτή 1.6.8 (silent updated 26/10).
Είναι remake ενός παλιού java applet (το έγραψα ξανά πριν αρκετά χρόνια).
Το παιχνίδι βρίσκεται στον φάκελο EXAMPLES/GAMES.

Κώδικας:
Eliminator is a remake of a old java applet.
Remove all balls of the same color by lining them up against each other.
You have a small number of moves on each level.
The grey balls cannot be removed.

Use the arrow keys to play.
Press spacebar to restart level.
Press 2 to skip to next level.
Press 1 for previous level.
Press 0 to change window size (default is small).
Press S to toggle music on/off.

Eliminator requires Windows 7 or later.

Eliminator-Puzzle-Hobby-BASIC.png


Press 0 to change window size (default is small) new

Eliminator-Puzzle-Hobby-BASIC.png


Have fun with Hobby BASIC.
 
Hobby BASIC 1.7.1

Ένα νέο update στον διερμηνευτή.
Η Hobby BASIC τρέχει σταθερά στα Windows 11.
Θα πρέπει όμως πρώτα να επαναφέρετε τη γραμμή εντολών παλαιού τύπου.
Δείτε τα Notes for Windows 11 users στο τέλος της ανάρτησης για το πως.
Την δοκίμασα στα pc που έχω σπίτι, σε Windows XP/7/10 και 11 έτρεξε as expected.

Στο οπλοστάσιο της Hobby BASIC προστέθηκε η SNAP.
H εντολή αποθηκεύει (ή φορτώνει) ένα μέρος της οθόνης απευθείας στον (ή από τον) δίσκο.

Οι παρακάτω κώδικες δίνουν το ίδιο αποτέλεσμα στην κονσόλα, τρεις διαφορετικοί τρόποι.
Ξεκινάνε με τον ίδιο κώδικα, φορτώνοντας μια εικόνα ANSI.

Κώδικας:
    path$ = PATH("MEDIA\ANSI\SPACES1.ANS")

    COLS = 16
    ROWS = 12
    CYAN = 3

    view 11
    screen 80,25,0
    color 0,0
    cls

    ansi path$

1699791790848.png

BLOAD/BSAVE
rem Saving and loading a specific part of the screen (using BSAVE/BLOAD)

rem BSAVE {x,y,cols,rows,block_id}
rem screen to memory

rem BLOAD {x,y,block_id}
rem memory to screen
Κώδικας:
    bsave 32,3,COLS,ROWS,700
    wait 1000 : cls
    bload 2,2,700
    bload 18,2,700
    repaint 18,2,COLS,ROWS,CYAN,CYAN+8

GRAB
rem Saving and loading a specific part of the screen (using GRAB)

rem GRAB {x,y,cols,rows,array[],n}
rem screen to 2D array

rem GRAB {x,y,cols,rows,array[],x1,y1}
rem 2D array to screen
Κώδικας:
    dim a[80,25]
    SCREEN_TO_ARRAY = 0
    grab 0,0,80,25,a[],SCREEN_TO_ARRAY
    wait 1000 : cls
    grab 32,3,COLS,ROWS,a[],2,2
    grab 32,3,COLS,ROWS,a[],18,2
    repaint 18,2,COLS,ROWS,CYAN,CYAN+8

SNAP
rem Saving and loading a specific part of the screen (using SNAP)

rem SNAP {x,y,cols,rows,path$}
rem screen to file direct

rem SNAP {x,y,path$}
rem file to screen direct
Κώδικας:
    temp_path$ = PATH("DATA\TEMP\ROBOT.S")
    snap 32,3,COLS,ROWS,temp_path$
    wait 1000 : cls
    snap 2,2,temp_path$
    snap 18,2,temp_path$
    repaint 18,2,COLS,ROWS,CYAN,CYAN+8

Η έξοδος ίδια και στις τρεις περιπτώσεις.
Τα παραδείγματα ROBOT1.BAS, ROBOT2.BAS και ROBOT3.BAS βρίσκονται στον φάκελο EXAMPLES/MISC.

1699791989021.png


Ένα μεγαλύτερο και πιο αναλυτικό παράδειγμα για την έκδοση 1.7.1.
Βρίσκεται στον φάκελο EXAMPLES με το όνομα TEST.BAS
Υπάρχουν και κάποια εφέ που δεν μπορούν να εμφανιστούν στο screenshot.

Κώδικας:
    rem  TEST.BAS
    rem  Hobby BASIC Interpreter

    rem  Saving and loading the screen

    rem  Using ANSI
    rem  Using GRAB/SAVE/LOAD
    rem  Using SNAP
    rem  Using BSAVE/BLOAD

    path$ = PATH("DATA\TEMP")
    if CHDIR(path$,0) = -1
        if CHDIR(path$,1) <> 1
            alert 0,"Can''t open",path$ : end
        endif
    endif

    path$ = PATH("MEDIA\ANSI\SPACES1.ANS")
    if SIZE(path$) = -1 then alert 0,"Not found",path$ : end

    MB_ICONQUESTION = 0x20
    MB_YESNO = 0x4
    ID_YES = 0x6

    SCREEN_WIDTH = 80
    SCREEN_HEIGHT = 50
    SCREEN_TO_ARRAY = 0
    ARRAY_TO_SCREEN = 1
    COLS = 15
    ROWS = 12

    rem  declare arrays: robot0,robot1,...
    for n = 0 to 4
        dim robot//n[COLS,ROWS]
    next

    rem  set ID array values: 700,701,...
    dim ID[5] : ID[].SET 700

    view 11
    screen SCREEN_WIDTH,SCREEN_HEIGHT,0
    cursor 0,0
    color 0,0
    cls

    rem  load an ANSI encoded text file
    ansi path$

    move 0,3,80,25,0,0
    wait 500


    rem SAVE SCREEN

    rem  screen to 2D array
    rem  GRAB with 6 parameters
    grab 0,0,COLS,ROWS,robot0[],SCREEN_TO_ARRAY
    grab 16,0,COLS,ROWS,robot1[],SCREEN_TO_ARRAY
    grab 32,0,COLS,ROWS,robot2[],SCREEN_TO_ARRAY
    grab 48,0,COLS,ROWS,robot3[],SCREEN_TO_ARRAY
    grab 64,0,COLS,ROWS,robot4[],SCREEN_TO_ARRAY

    rem  2D array to file (.HB extension)
    save PATH("DATA\TEMP\ROBOT0.HB"),robot0[]
    save PATH("DATA\TEMP\ROBOT1.HB"),robot1[]
    save PATH("DATA\TEMP\ROBOT2.HB"),robot2[]
    save PATH("DATA\TEMP\ROBOT3.HB"),robot3[]
    save PATH("DATA\TEMP\ROBOT4.HB"),robot4[]

    rem  screen to file direct (.S extension)
    rem  SNAP with 5 parameters
    snap 0,0,COLS,ROWS,PATH("DATA\TEMP\ROBOT0.S")
    snap 16,0,COLS,ROWS,PATH("DATA\TEMP\ROBOT1.S")
    snap 32,0,COLS,ROWS,PATH("DATA\TEMP\ROBOT2.S")
    snap 48,0,COLS,ROWS,PATH("DATA\TEMP\ROBOT3.S")
    snap 64,0,COLS,ROWS,PATH("DATA\TEMP\ROBOT4.S")

    rem  screen to memory
    bsave 0,0,COLS,ROWS,ID[0]
    bsave 16,0,COLS,ROWS,ID[1]
    bsave 32,0,COLS,ROWS,ID[2]
    bsave 48,0,COLS,ROWS,ID[3]
    bsave 64,0,COLS,ROWS,ID[4]


    rem  LOAD SCREEN

    rem  zero arrays
    for n = 0 to 4
        robot//n[].ZERO
    next

    rem  file to 2D array (.HB extension)
    load PATH("DATA\TEMP\ROBOT0.HB"),robot0[]
    load PATH("DATA\TEMP\ROBOT1.HB"),robot1[]
    load PATH("DATA\TEMP\ROBOT2.HB"),robot2[]
    load PATH("DATA\TEMP\ROBOT3.HB"),robot3[]
    load PATH("DATA\TEMP\ROBOT4.HB"),robot4[]

    rem  2D array to screen at position x,y
    rem  GRAB with 7 parameters
    grab 0,0,COLS,ROWS,robot0[],0,12
    grab 0,0,COLS,ROWS,robot1[],16,12
    grab 0,0,COLS,ROWS,robot2[],32,12
    grab 0,0,COLS,ROWS,robot3[],48,12
    grab 0,0,COLS,ROWS,robot4[],64,12
    wait 500

    rem  file to screen direct (.S extension)
    rem  SNAP with 3 parameters
    snap 0,ROWS*2,PATH("DATA\TEMP\ROBOT0.S")
    snap 16,ROWS*2,PATH("DATA\TEMP\ROBOT1.S")
    snap 32,ROWS*2,PATH("DATA\TEMP\ROBOT2.S")
    snap 48,ROWS*2,PATH("DATA\TEMP\ROBOT3.S")
    snap 64,ROWS*2,PATH("DATA\TEMP\ROBOT4.S")
    wait 500

    rem  shuffle ID array
    ID[].SHUFFLE

    rem  memory to screen
    rem  robots appear in random position
    bload 0,ROWS*3,ID[0]
    bload 16,ROWS*3,ID[1]
    bload 32,ROWS*3,ID[2]
    bload 48,ROWS*3,ID[3]
    bload 64,ROWS*3,ID[4]
    wait 500

    rem  do some fancy changes
    store  0,0,SCREEN_WIDTH,SCREEN_HEIGHT
    times 5000  invert RND(SCREEN_WIDTH),RND(SCREEN_HEIGHT),1,1
    restore
    flip 16,ROWS*2,32,ROWS,0
    flip 48,ROWS*2,16,ROWS,1
    repaint 0,ROWS,SCREEN_WIDTH,ROWS,4,5
    repaint 48,ROWS*2,16,ROWS,4,6
    repaint 0,ROWS*3,SCREEN_WIDTH,ROWS,1,2

    rem  save the screen as ANSI encoded text file
    V3 = -1
    grab 0,0,SCREEN_WIDTH,SCREEN_HEIGHT-1,text$
    path$ = PATH("MEDIA\ANSI\SPACES2.ANS")
    save path$,text$

    title "Press space to open the new image in DRAW, Esc to exit"

    inkey
    if V0 = 0x20
        rem  will fail if HB parent folder contains spaces, e.g,  C:\NEW  FOLDER\HB
        cmd$ = "start /wait " + PATH("HB.EXE EXAMPLES\DRAW.BAS ") + path$
        exec cmd$
    endif

    color 0,7 : cls : end

1699793086633.png

Have fun with Hobby BASIC.
 
Το Coffee project της ημέρας.
Console Theme Creator for Hobby BASIC

Τα χρώματα στην κονσόλα των Windows είναι 16.
Στις νεώτερες εκδόσεις των Windows αυτό άλλαξε, κυρίως για μπορούν τα τρέχουν οι Linux εφαρμογές (μέσω WSL) στην κονσόλα των Windows. Πρακτικά όμως παραμένουν 16, λόγω θεμάτων συμβατότητας με παλαιότερες εφαρμογές. Η γραμμή εντολών των Windows (σύμφωνα με το devblogs της Microsoft) είναι: the most frequently launched executable in all of Windows.

Τα βασικά χρώματα λοιπόν (Legacy Theme) είναι: Black, Blue, Green, Aqua, Red, Purple, Yellow, White, Gray, Light Blue, Light Green, Light Aqua, Light Red, Light Purple, Light Yellow, Bright White.

Ας τα θυμηθούμε.
Κώδικας:
    dim a[16]=0x000000,\
        0x800000,0x008000,0x808000,0x000080,0x800080,\
        0x008080,0xC0C0C0,0x808080,0xFF0000,0x00FF00,\
        0xFFFF00,0x0000FF,0xFF00FF,0x00FFFF,0xFFFFFF

    view 11
    screen 80,30,0
    cursor 0,0
    color 0,7
    cls

    for index=0 to 15
      rgb index,a[index]
    next

    for i=0 to 3
        color i,i
        paint (i*7)+1,1,7,4,-1,-1
        color i+4,i+4
        paint (i*7)+1,5,7,4,-1,-1
        color i+8,i+8
        paint (i*7)+1,9,7,4,-1,-1
        color i+12,i+12
        paint (i*7)+1,13,7,4,-1,-1
    next

    inkey
    color 0,7:cls
    end

1700518199113.png

Ξεκινώντας από τα Windows Vista μπορούμε να αλλάξουμε τις RGB τιμές!.
Σημειώστε πως και πάλι, μόνο 16 χρώματα θα εμφανίζονται ταυτόχρονα.
Στο τελευταίο update της Hobby BASIC 1.7.3 προστέθηκε το πρόγραμμα THEME.BAS.
Με αυτό, μπορούμε να δημιουργήσουμε RGB θέματα για την κονσόλα.

1700518361658.png

Πατώντας 1 έως 7 επιλέγουμε ένα από τα έτοιμα θέματα.

1700519075377.png

Κάνοντας κλικ με το ποντίκι πάνω σε ένα χρώμα, εμφανίζεται το παράθυρο διαλόγου των χρωμάτων.
Έτσι δημιουργούμε το δικό μας θέμα.
Οι αλλαγές εμφανίζονται απευθείας.

1700518472857.png

Πατώντας 0 κάνουμε export το θέμα στον φάκελο MISC.

1700518563304.png

1700518572811.png

1700519132868.png

1700519174692.png

Have fun with Hobby BASIC.
 
Πίσω
Μπλουζα