Quarantine challenge

ChrisTOS

Retro Enthusiast
Messages
310
Reaction score
489
Points
63
Έχω μια ιδέα τώρα που σε πολλούς από μας υπάρχει κάποιος χρόνος για ένα μικρό challenge.
Βρίσκουμε ένα listing από κάποιο περιοδικό, ελληνικό η ξενο και το γράφουμε. Αλλά το listing πρέπει να είναι για διαφορετικό υπολογιστή από τον υπολογιστή στόχο. Έτσι αν το πρόγραμμα είναι για spectrum θα πρέπει να μεταφερθεί πχ σε cpc.
Τι γνώμη έχετε; Υπάρχει ενδιαφέρον;
 

dimfil

Retro Mentor
Messages
1,096
Reaction score
1,814
Points
123
Δυστυχώς δεν περισσεύει και πολύς χρόνος για εμένα για να συμμετέχω όπως θα ήθελα.
Είναι ωραία ιδέα αλλά κατά περιπτώσεις το challenge μπορεί να μην είναι και τόσο μικρό! Θα πρέπει κάποιος να γνωρίζει τις ιδιαιτερότητες (και τις δυνατότητες) της διαλέκτου σε τουλάχιστον δύο ρετρό μηχανήματα!

Θα έχει πολύ ενδιαφέρον όμως. Ας ξεκινήσει το πράγμα με ένα listing παράδειγμα να δούμε ανταπόκριση και σχόλια.
 
Last edited:

geoanas

Commodore Vampire
Staff member
Messages
7,228
Reaction score
5,998
Points
223
Συμφωνώ με την ιδέα αλλά κι εγώ στερούμαι χρόνου, γνώσεων και διάθεσης. Αναμένω πάντως με ζωηρό ενδιαφέρον και δηλώνω πρόθυμος να τεστάρω listings εφόσον υπάρξουν. :thumbup:
 

dimfil

Retro Mentor
Messages
1,096
Reaction score
1,814
Points
123
Απλά δεν εννοούσα 1000 και 2000 γραμμές κώδικα. Και 20-100 μια χαρά είναι
Δώσε ένα παράδειγμα για να γίνει μια αρχή.
Θα έχει πολύ ενδιαφέρον έτσι και αλλιώς ακόμα και με τη συζήτηση μεταξύ μας.
 

Vincent

Retro Addict
Messages
817
Reaction score
1,635
Points
103
Βασικά και εγώ κατάλαβα για μικρό κώδικα από την αρχή.
Ίσως κάποιο απλό παιχνίδι που δεν είναι hardware specific πχ με sprites (C64) αλλά με udg και ίσως ένα μικρό level layout.
Mε λίγες αλλαγές μπορείς να το πας από ZX<=>CPC<=>DOS κλπ.
 

Vincent

Retro Addict
Messages
817
Reaction score
1,635
Points
103
2 για CPC


Code:
10 MODE 0:e=-1.3:FOR y%=0 TO 199:d=-2.4:FOR x%=0 TO 159:z=0:i=0:a%=0:WHILE a%<15 AND (z*z+i*i)<4:s=(z*z)-(i*i)+d:r=(2*i*z)+e:z=s:i=r:a%=a%+1:WEND:PLOT x%*4,y%*2,a%:d=d+0.0215:NEXT:e=e+0.013:NEXT


Code:
10 MODE 1:INK 0,0:BORDER 0:INK 1,26:INK 2,6:INK 3,18:LOCATE 18,1:PRINT"MICRONOID":LOCATE 15,2:PRINT "by Devilmarkus":s=-50:xp=338:ys=2:xs=1.4:PLOT 240,30,1:DRAW 240,200:DRAW 440,200:DRAW 440,30:ql=4:PRINT CHR$(23);CHR$(1):TAG:GOSUB 100:xb=350:yb=44:l=3
20 a$=INKEY$:IF a$="" THEN GOTO 70 ELSE IF a$="a" AND xp>240 THEN GOSUB 80:xp=xp-4:GOSUB 80 ELSE IF a$="d" AND xp<428 THEN GOSUB 80:xp=xp+4:GOSUB 80
30 IF l<0 THEN MOVE 240,300:PRINT"GAME OVER";:CALL &BB18:RUN ELSE PLOT xb,yb,3:xb=xb+xs:yb=yb+ys:PLOT xb,yb:IF TEST(xb+2,yb)<>0 THEN c=1 ELSE IF TEST(xb-2,yb)<>0 THEN c=2 ELSE IF TEST(xb,yb+2)<>0 THEN c=3 ELSE IF TEST(xb,yb-2)<>0 THEN c=4 ELSE c=0:GOTO 20
40 IF c=1 THEN xs=0-((RND*1)+1) ELSE IF c=2 THEN xs=(RND*1)+1 ELSE IF c=3 THEN ys=0-((RND*1)+1) ELSE IF c=4 THEN ys=(RND*1)+1
50 GOSUB 90:IF c=1 AND TEST(xb+2,yb)>1 THEN c=5:PLOT xb+2,yb,0 ELSE IF c=2 AND TEST(xb-2,yb)>1 THEN c=5:PLOT xb-2,yb,0 ELSE IF c=3 AND TEST(xb,yb+2)>1 THEN c=5:PLOT xb,yb+2,0 ELSE IF c=4 AND TEST(xb,yb-2)>1 THEN c=5:PLOT xb,yb-2,0
60 IF c>4 THEN c=0:s=s+50:GOTO 60 ELSE c=0:TAGOFF:LOCATE 12,6:PEN 3:PRINT"LIVES:";MID$(STR$(l),2);" SCORES:";MID$(STR$(s),2):LOCATE 1,1:PRINT CHR$(23);CHR$(1);:TAG
70 IF yb<38 THEN PLOT xb,yb,3:ys=2:yb=42:xb=xp+4:PLOT xb,yb,3:l=l-1:SPEED KEY 20,2:c=0:GOTO 30 ELSE SPEED KEY 1,1:GOTO 30
80 PLOT -4,-4,1:MOVE xp,40:PRINT CHR$(255);:RETURN
90 TAGOFF:LOCATE 1,1:PRINT CHR$(23);CHR$(0);:TAG:RETURN
100 y=190:x=250:SYMBOL 255,&X1111110,255,&X1111110:SYMBOL 253,0,0,&X11000,&X11000:FOR k=1 TO 7:PLOT -4,-4,(k MOD 2)+2:FOR t=1 TO 23:PLOT x,y:x=x+8:NEXT:x=250:y=y-6:NEXT:PLOT -4,-4,1:MOVE xp,40:PRINT CHR$(255);:SPEED KEY 1,1:RETURN
 

clemenza

Retro Addict
Messages
967
Reaction score
1,358
Points
93
Δημήτρη, το 1ο το θες σε μία εντολή; Γιατί σε Commodore BASIC για παράδειγμα δεν γίνεται που έχει όριο τους 80 χαρακτήρες. Επίσης, εκεί, σώνει και καλά να βάλεις graphics: εμείς στον 64άρη και στον VIC-20 τι θα κάνουμε, δηλαδή; :rofl:

(πλάκα κάνω, έχουμε τα POKEs, δεν μασάμε!)
 

Vincent

Retro Addict
Messages
817
Reaction score
1,635
Points
103
θα ήθελα Βαγγέλα το River Raid για τον Αμθτραντ θε πε θε.
Θα σου κάνω εγώ τα γραφικά και τον ήχο.
 

dimfil

Retro Mentor
Messages
1,096
Reaction score
1,814
Points
123
Μας "έσκισες" με τα Plot και τα ρέστα...
Πρέπει να κατεβάσω και έναν emulator του CPC για να βλέπω αποτέλεσμα και να μπορώ να συγκρίνω.
Δεν δίνεις και ένα screenshot;
 

ChrisTOS

Retro Enthusiast
Messages
310
Reaction score
489
Points
63
Λοιπόν ζήτηθηκε ένα παράδειγμα.

Amstrad Action τεύχος 008 σελίδα σελ 92. Ένα μικρό πρόγραμμα.


19484

Κάνουμε την ανάλυση του προγράμματος (υπ'όψιν δεν έχω ξαναγράψει σε locomotive)

Στην γραμμή 10,20 ορίζει χρώματα, mode γραφικών και ότι θα χρησιμοποιήσει μοίρες.

Στις γραμμές 40 ως 90 ζωγραφίζει

Στις γραμμές 100 με 170 κάνει ένα colorcycling με τα χρώματα του CPC. Τo call είναι ένα απλό VSYNC.

Η μετατροπή σε GFA BASIC για Atari ST.


Code:
' Started: 04/10/2020 23:01:38
'
REM #MAK GBE 68K/prg,GBE V4E/app
REM #MP= global
REM #PF= fastload,load alt,malloc alt
'
HIDEM
OPENW 2
FULLW 2
CLEARW 2
col=1
VSETCOLOR 0,0,0,0
VSETCOLOR 1,15,0,0
VSETCOLOR 2,0,15,0
VSETCOLOR 3,0,0,15
VSETCOLOR 4,0,15,15
VSETCOLOR 5,15,15,15
FOR ang=1 TO 360
  x=COS(ang)
  y=SIN(ang)
  COLOR col
  DRAW 320*x,100*y TO 0,0
  DRAW 100*y,320*x TO 0,0
  IF col=6
    col=1
  ELSE
    INC col
  ENDIF
  VSYNC
NEXT ang
FOR q=1 TO 40
  GOSUB firstcall
NEXT q
col=1
CLEARW 2
FOR n=0 TO 720
  y=SIN(n)
  COLOR col
  DRAW n*640/720,198*y TO 320,0
  IF col=6
    col=1
  ELSE
    INC col
  ENDIF
  VSYNC
NEXT n
FOR q=1 TO 40
  GOSUB firstcall
NEXT q
PROCEDURE firstcall
  FOR m=1 TO 15
    FOR j=1 TO 5
      VSETCOLOR 1,m,j,j
      VSETCOLOR 2,j,j,m
      VSETCOLOR 3,j,m,m
      VSETCOLOR 4,j,j,j
      VSETCOLOR 5,m,m,j
    NEXT j
    VSYNC
  NEXT m
RETURN
Στην ουσία πρόκειται για μια γρήγορη μετατροπή. Στην procedure firstcall κάνω ένα χαζό colorcycling το οποίο δεν φαίνεται και πολύ καλό αλλά whatever. Επίσης έχω εισάγει μερικά περαιτέρω VSYNC γιατί απλά ο ST είναι αρκετά πιο γρήγορος από τον CPC και δεν φαινόταν τίποτα.

Τι έμαθα;

1. Πρώτα από όλα, αν το πρόγραμμα έχει πολλά pokes δεν το αγγίζουμε.
2. Τα GOTO έχουν χρησιμοποιηθεί πολύ άσχημα. Αυτό είναι το δεύτερο πρόγραμμα που δοκίμασα να μεταφέρω. Στο πρώτο, ο προγραμματιστής του αντί να βάλει ένα while loop, έκανε incrementations με GOTO στην ίδια γραμμή. Μετά από πολλή ώρα debugging το παράτησα.
3. Η locomotive basic είναι αρκετά ενδιαφέρουσα.
4. Με στεναχωρεί πολύ που δεν είχα αγοράσει πολλά περισσότερα αγγλικά περιοδικά όταν ήμουν μικρός.
5. Μια καλή ιδέα είναι να βρούμε προγράμματα από BBC. Λόγω του ότι αφενός η BASIC του είναι φοβερή και πολύ καθαρή και αφετέρου ο σκοπός του ήταν εκπαιδευτικός, πολλά προγράμματα που θα βρούμε αποφεύγουν τα peek & pokes και είναι πολύ όμορφα. Επίσης όλα τα περιοδικά του είχαν listings.

Πάμε να δούμε αν θα λύσουμε το πρόβλημα του Vincent τώρα.
 

ChrisTOS

Retro Enthusiast
Messages
310
Reaction score
489
Points
63
Και το πρώτο του Vincent:

με κάποιες αλλαγές.. Αυτό έγινε ταχύτατα με λίγο notepad++ fu

Code:
' Started: 04/11/2020 00:40:28
'
REM #MAK GBE 68K/prg,GBE V4E/app
REM #MP= global
REM #PF= fastload,load alt,malloc alt
'
OPENW 2
FULLW 2
CLEARW 2
e=-1.3
FOR y%=0 TO 199
  d=-2.4
  FOR x%=0 TO 319
    z=0
    i=0
    a%=0
    WHILE a%<15 AND (z*z+i*i)<4
      s=(z*z)-(i*i)+d
      r=(2*i*z)+e
      z=s
      i=r
      a%=a%+1
    WEND
    COLOR a%
    PLOT x%,y%
    d=d+0.0215
  NEXT x%
  e=e+0.013
NEXT y%
Για το δεύτερο, λατρεύω τα 10 liner. Πιστεύω ότι δεν θα είναι πολύ δύσκολο. Θα δούμε.
 
Last edited:

clemenza

Retro Addict
Messages
967
Reaction score
1,358
Points
93
Λοιπόν, το 1ο προγραμματάκι του Vincent διαπίστωσα ότι, αν και αρχικά δείχνει απλό, τελικά δεν είναι και τόσο. Συν το ότι η μεταφορά του σε άλλα 8μπιτα είναι μάλλον... μανίκι! Γιατί αυτό; Καταρχάς, στην πλειοψηφία των μηχανημάτων δεν υπάρχουν loops της μορφής WHILE... WEND στην BASIC, παρά μόνο - απ' όσο είμαι σε θέση να γνωρίζω - στους Acorn Electron/BBC Micro και στον Amstrad CPC (daaah!). Αυτό λύνεται με τη χρήση IF... THEN μεν, αλλά το μεγαλύτερο πρόβλημα που εντόπισα είναι το δεύτερο. Ποιο είναι αυτό; Ότι λόγω περιορισμένης video RAM, κανένα άλλο μηχάνημα (από τα γνωστά) δεν επιτρέπει να αλλάζουμε χρώμα σε κάθε pixel στην ίδια γραμμή!

Σύμφωνα με το παραπάνω, με μία πρώτη σκέψη αποκλείονται Spectrum και Commodore 64 (σε multicolor mode στην Simon's BASIC μπορούμε να χρησιμοποιήσουμε μέχρι 3 χρώματα) και υπόσχομαι να τσεκάρω τι παίζει σε ORIC και Commodore 16 και να επανέλθω επί του συγκεκριμένου. Ένα άλλο format που ίσως και να είναι κατάλληλο - δεν το έχω ψάξει - είναι τα MSX.

Αφού λοιπόν είδα και απόειδα και στην Simon's BASIC δεν γινόταν δουλειά, μετέφερα το προγραμματάκι στην (υπέροχη) FUZE BASIC (Raspberry Pi/PC). Ιδού:

Code:
cls
e=-1.3
for y=0 to (gheight-1) cycle
    d=-2.4
    for x=0 to (gwidth-1) cycle
        z=0
        i=0
        a=0
        while a<15 and (z*z+i*i)<4 loop
            s=(z*z)-(i*i)+d
            r=(2*i*z)+e
            z=s
            i=r
            a=a+1
        repeat
        colour=a
        plot(x,y)
        update
        d=d+0.0215
    repeat
    e=e+0.013
repeat
Υπέροχα, έτσι;

Έλα μου ντε που δεν δουλεύει! Δηλαδή, δουλεύει μεν, αλλά δεν αλλάζει χρώματα: σαν να έχει η μεταβλητή a πάντοτε την τιμή 1. WTF??? :sick:

Θα συνεχίσω να το ψάχνω, απλώς ήθελα να ενημερώσω - έτσι, να μην νομίζετε ότι δεν ασχολούμαι! Α, και κάτι τελευταίο: τα a, x και y υπάρχει λόγος που έχουν οριστεί ως ακέραιοι; Στον CPC είτε ως ακέραιοι είτε ως πραγματικοί το ίδιο output βγάζει το πρόγραμμα και δεν εντοπίζω και κάποια διαφορά από άποψη ταχύτητας...
 

ChrisTOS

Retro Enthusiast
Messages
310
Reaction score
489
Points
63
Το update τι κάνει; Μήπως σου καθαρίζει την οθόνη;
 
Top