Κυριακή, 11 Αυγούστου 2019

New certificate for binaries

Binaries updated with new certificate. Also info.gsb updated with the new Banker algorithm.

When the installation of M2000.exe  and M2000.dll done, you can insert the M2000.cer as a trust root certificate. All binaries have another certificate which chain to the root certificate.


New Banker Algorithm

I fixed the banker algorithm. Now includes two more examples, to display a safe and an unsafe state.



\\ No2
\\ First publish in Rosetta.org
\\ http://www.rosettacode.org/wiki/Banker%27s_algorithm#M2000_Interpreter
Module BankerAlgo {
      Form 80, 44
      Cls 5
      Pen 14
      Function Request(FromWhere as Inventory, What$, Many as long)  {
            =FromWhere(What$)-FromWhere(What$+"_Request")-Many>=0
      }
      Function RequestPreset(FromWhere as Inventory, What$, Many as long)  {
            =FromWhere(What$+"_Request")-Many>=0
      }
      Function Need(FromWhere as Inventory, What$, Many) { 
            =FromWhere(What$ + "_max")-FromWhere(What$)-Many>=0
      }
      \\ code for sub can be found from parent module/function (here parent as in code, not as in call)
      Function NewProcess {
            Inventory Process
            ApplyResources(Process)   ' sub need more arguments and read from current stack
            =Process
      }
      Inventory System, Processes 
      \\ Recource, Max, Available
      ApplyResources(System, "A", 6, 3,"B", 5,1,"C", 7, 1, "D", 6, 2)
      \\ Recource, Max, Available
      Append Processes, "P1":=NewProcess("A", 3, 1, "B", 3, 2, "C", 2, 2, "D", 2,1)
      Append Processes, "P2":=NewProcess("A", 1, 1, "B", 2, 0, "C", 3, 3, "D", 4,3)
      Append Processes, "P3":=NewProcess("A", 1, 1, "B", 3, 2, "C", 5, 1, "D", 0,0)
      Status(True) ' show all process, available resource and max
      SafeState=True
      Print "Current Status"
      RequestResource() ' display Safe State
      RequestResource("P2", "D", 1) ' display Safe State
      RequestResource("P1", "A", 1, "D", 1) ' display Safe State
      RequestResource("P1", "C", 1, "D", 1) ' display Too many resources ...
      RequestResource("P2", "B", 1) ' display Unsafe State
      RequestResource("P3", "C", 1)  ' display Safe State
      Status()
      \\ Second Example
      Clear System, Processes
      ApplyResources(System, "A", 10, 3)
      Append Processes, "P1":=NewProcess("A", 9, 3)
      Append Processes, "P2":=NewProcess("A", 4, 2)
      Append Processes, "P3":=NewProcess("A", 7, 2)
      Status(True) ' show all process, available resource and max    
      Print "Current Status"
      RequestResource() ' display Safe State
      \ Third Example
      Clear System
      ApplyResources(System, "A", 10, 2)
      Return  Processes,"P1":=NewProcess("A", 9,4)
      Status(True) ' show all process, available resource and max    
      Print "Current Status"
      RequestResource() ' display UnSafe State       
      Sub Respond()
            If SafeState Then {
                  Pen 15 {Print "Safe State"}
            } Else Pen 13 {Print "Unsafe State"}
      End Sub
      Sub WaitForKey()
            Pen 11 {Print "Press a key"}
            local a$=key$
      End Sub
      Sub RequestResource(ProcessName$="" )
            SafeState=True
            If ProcessName$="" Then CheckNewState(&SafeState) : Respond() : Print : WaitForKey():Exit Sub
            Local pro=Processes(ProcessName$), ResourceName$, many as long
            ClearAllRequest(pro)
            Local skip=False
            While Match("SN") {
                  Read ResourceName$, many
                  Print  Format$("Claim {1} for type {0} resource ",ResourceName$, many)
                  If skip Then Continue
                  If Request(System, ResourceName$, many) Then {
                        If Need(pro, ResourceName$, many) Then { 
                              Return pro, ResourceName$+"_Request":=many
                              Return System, ResourceName$+"_Request":=-many
                        } Else {
                              Print "Too many Recources "+ResourceName$+" for Process "+ProcessName$  : Skip=True
                        }
                  } Else Print "Too many Recources for System" : Skip=True
                  If Skip Then exit
            } 
            If skip Else  CheckNewState(&SafeState) : Respond()
            Print  ' just a new line
            WaitForKey()
      End Sub
      Sub ApplyResources(Where as Inventory, What$, MaxValue, InitialValue)
            Repeat {
                  If Not Exist(Where, What$) Then {
                        Append Where, What$:=InitialValue, What$+"_max":=MaxValue, What$+"_Request":=0
                  }
                  If not Match("SNN") Then Exit
                  Read What$, MaxValue, InitialValue
            }  Always
      End Sub
      Sub ClearAllRequest(Where  as Inventory)
            Local M=Each(Where)
            While M {
                  If Instr(Eval$(M, M^),"_")=0 Then {
                        Return Where, Eval$(M,M^)+"_Request":=0
                  }
            }
      End Sub
      Sub PrintResources(Where  as Inventory)
            Local M=Each(Where)
            While M {
                  If Instr(Eval$(M, M^),"_")=0 Then Print Eval$(M, M^)+"="+Eval$(M),
            }
            Print
      Exit Sub
      Sub PrintMax(Where  as Inventory)
            Local M=Each(Where)
            While M {
                  If Instr(Eval$(M, M^),"_max")>0 Then Print LeftPart$(Eval$(M, M^), "_")+"="+Eval$(M),
            }
            Print
      Exit Sub
      Sub Status(Ok as boolean=False)
            Print "Total System Resources"
            PrintMax(System)
            Print "Available Resources in System"
            PrintResources(System)
            If Not Ok Then WaitForKey(): Exit Sub
            Local  M=Each(Processes)
            While M {
                  Print "Process "+Eval$(M, M^)
                  PrintResources(Processes(M^!))  ' give index M^ as Key index number (using !)
                  Print "Maximum Resources for "+Eval$(M, M^)
                  PrintMax(Processes(M^!))
            }
      End Sub
      Sub CheckNewState(&Ok)
            local M=Each(Processes), M1, count=len(Processes), alive(0 to count-1)=1
            Local Z, Recource$, safe as boolean=false
            While count {
                  safe=false
                  While M {
                        If alive(M^) Then {
                              Z=Processes(M^!)
                              M1=Each(Z) 
                              safe=True 
                              While M1 {
                                    Recource$=Eval$(M1, M1^)
                                    If Instr(Recource$,"_")=0 Then {
                                         safe=System(Recource$)+System(Recource$+"_Request") >= Z(Recource$ + "_max") - Z(Recource$)-Z(Recource$ + "_Request")
                 }
                                    If not safe Then exit
                              }
                              If safe Then {
                                    print format$("Process {0} is executing", M^+1)
                                    alive(M^)=0
                                    count--
                                    M1=Each(Z) 
                                    While M1 {
                                          Recource$=Eval$(M1, M1^)
                                          If Instr(Recource$,"_")=0 Then {
                                                Return System, Recource$+"_Request":= System(Recource$+"_Request") + Z(Recource$) + Z(Recource$+"_Request")
                                                Return Z, Recource$+"_Request":=0
                                          }
                                    }
                              }
                        }
                  }
                  If safe Else exit
            }
            Ok=safe
            ClearAllRequest(System)
      End Sub
}
BankerAlgo

Παρασκευή, 9 Αυγούστου 2019

Προγράμματα στη ΓΛΩΣΣΑ της ΑΕΠΠ

Συγκέντρωσα τα προγράμματα σε ΓΛΩΣΣΑ που έχω αναρτήσει στο  Στέκι των Πληροφορικών
Προχωρημένα προγράμματα στη ΓΛΩΣΣΑ της ΑΕΠΠ 


Υπάρχουν και άλλα προγράμματα που έγραψα στο SpiNet και ειδικότερα στο Ασκησιολόγιο με το ίδιο ψευδώνυμο Bugman. Το πρόβλημα στα προγράμματα του Ασκησιολογίου είναι στη διαφοράτης Γλώσσας που την εποχή εκείνη υλοποιούσε η Γλωσσομάθεια, ο μεταφραστής της γλώσσας.
Ανέβασα στο Στέκι το Mastermind τροποποιημένο για τον διερμηνευτή της Γλώσσας.  Εδώ εκμεταλλεύομαι τη συνένωση αλφαριθμητικών που έχει ως επιλογή ο διερμηνευτής.

Πέμπτη, 8 Αυγούστου 2019

Αυγουστιάτικες Καταστροφές!

Τα κακά νέα!
Πριν δυο μέρες χάλασε ο βασικός μου υπολογιστής. Μάλλον έχει καεί η CPU (AMD 6100 FX). Οι σκληροί δίσκοι είναι εντάξει, και επειδή το βασικό σύστημα είναi Ubuntu 64bit, αρκεί να πάρω ένα νέο motherboard με ένα 64bit επεξεργαστή και το σύστημα θα δουλέψει ξανά. Λόγω όμως της μετακόμισης στην Αθήνα, μάλλον θα αργήσω να προβώ σε αγορά!

Τα καλά νέα!
Έχω ένα παλιό λάπτοπ χωρίς οθόνη (είναι μόνο το ένα μέρος, το πληκτρολόγιο!). με AMD Sempron (32bit), μ68ε XP και με Windows 7, και προς το παρόν έχει μόνο 768 MByte Ram., και το έβαλα στη θέση του χαλασμένου υπολογιστή!

Βρήκα ότι ο UC Browser, λειτουργεί καλύτερα, για μικρή μνήμη. http://www.ucweb.com/desktop/ ο οποίος χρησιμοποιεί μια παλαιότερη μηχανή του Chrome, βελτιστοποιημένη.

Σχετικά με τη Μ2000:
Στον παλιό υπολογιστή έβαλα την VB6 και την SP6 αναβάθμισή της (σε λειτουργικό Windows 7) και διόρθωσα ένα λάθος στο repo της Μ2000 στο GitHub, ένα αρχείο (το  RecDir.Cls) ήταν σε παλαιότερη έκδοση, με συνέπεια να μην γίνεται compile το dll της Μ2000.

Κατέβασα το GitKraken ως git client. Το πρώτο πρόβλημα που βρήκα ήταν ότι δεν έβγαζε εικονίδιο για εκτέλεση! Τελικά πρέπει κανείς να ανοίξει αυτό %localappdata%\gitkraken  και να επιλέξει το φάκελο app-6.0.1  (ή όποιο άλλο νούμερο του δίνει) από όπου θα φτιάξει μια συντόμευση για το gitkraken.exe. Με χρήση αυτού του προγράμματος ανέβασα στο github το νέο αρχείο του RecDir.Cls.

Στην αρχή βγαίνει ένα εικονίδιο, και αργεί λίγο να φορτώσει (αλλά τρέχει σε 32bit).

Και μετά ανοίγει μια σελίδα όπως αυτή (έχει ήδη το κωδικό μου για να συνδέεται με το GitHub).


Εγκατάσταση VB6.
Χρησιμοποίησα το WinCDemu για να βάλω το ISO της VB6 σε εικονικό CD. Το καλό με αυτό το πρόγραμμα είναι ότι συνδέει πάλι το εικονικό CD σε περίπτωση επανεκκίνησης.
Η VB6 είναι η Enterprise Edition. Πρέπει να αναβαθμιστεί σε Service pack 6 μετο αρχείο Vs6sp6.exe
Σε περίπτωση που κάποιος βρει τα παραπάνω και έχει χάσει το κλειδί πρέπει να γράψει το εκατόν δέκα στο πρώτο κουτάκι και από το ένα ως το επτά στο δεύτερο.

Για να τρέξουμε την Μ2000 μέσα από το περιβάλλον της VB6 πρέπει να τρέξουμε το πρόγραμμα που φτιάχνει το m2000.dll, το Μ2000vbp, και μετά να τρέξουμε το m2000.exe το οποίο φορτώνει το dll. Το ωραίο εδώ είναι ότι μπορούμε να διορθώνουμε το κώδικα μέσα στο περιβάλλον της VB6 ενώ χρησιμοποιείται ως dll από το m2000.exe. Μπορούμε ακόμα και το m2000.exe αντί να το τρέξουμε απ ευθείας, να ανοίξουμε το mexe.vbp σε δεύτερο περιβάλλον της VB6, οπότε τρέχουμε από εκεί και έτσι μπορούμε ταυτόχρονα να κάνουμε debugging και στα δυο περιβάλλοντα (τα οποία συνδέονται). Ο μόνος περιορισμός που υπάρχει κατά το debugging είναι ότι δεν μπορούμε να καλέσουμε το m2000.dll δυο ή περισσότερες φορές.  Πράγμα που γίνεται όταν έχουμε φτιάξει το m2000.dll, και το καλούμε εκτός περιβάλλοντος vb6. Όταν τρέχει το m2000.exe εκτός του vb6 περιβάλλοντος, έχει αυξημένο μέγεθος σωρού επιστροφής. Το m2000.dll φορτώνεται στο χώρο του m2000.exe και στo ίδιο νήμα, δηλαδή με τον ίδιο αυξημένο σε μέγεθος σωρό επιστροφής.  Αν γράψουμε Έλεγχος ή Monitor στη γραμμή εντολών της  Μ2000 θα μας δείξει τον υπολογιζόμενο αριθμό κλήσεων - αναδρομής των τμημάτων και των συναρτήσεων.

Εικόνα με την επιστροφή της Monitor (φαίνεται μέρος της κονσόλας της Μ2000)


Παρασκευή, 5 Ιουλίου 2019

Καλοκαίρι 2019

Από 1 Ιουλίου μετακόμισα στην Αθήνα, για να είμαι κοντά στα παιδιά μου και την εγγονή μου. Το έργο μου θα συνεχιστεί από τις 15 Ιουλίου.

Τρίτη, 18 Ιουνίου 2019

Revision 28 Version 9.8

A syntax color fix
line:
                  maze$(INT((currentx% oldx%) / 2), ((currenty% oldy%) / 2)) = " "
See at the end, at /2)) the two parenthesis now have the proper different color.

This is the Maze module in info.gsb (included in m2000 installation file)



Module Maze {
      width% = 40
      height% = 20
      \\ we can use DIM maze$(0 to width%,0 to  height%)="#"
      \\ so we can delete the two For loops
      DIM maze$(0 to width%,0 to height%)
      FOR x% = 0 TO width%
          FOR y% = 0 TO height%
              maze$(x%, y%) = "#"
          NEXT y%
      NEXT x%

      currentx% = INT(RND * (width% - 1))
      currenty% = INT(RND * (height% - 1))

      IF currentx% MOD 2 = 0 THEN currentx%++
      IF currenty% MOD 2 = 0 THEN currenty%++
      maze$(currentx%, currenty%) = " "

      done% = 0
      WHILE done% = 0 {
          FOR i% = 0 TO 99
              oldx% = currentx%
              oldy% = currenty%
              SELECT CASE INT(RND * 4)
                  CASE 0
                      IF currentx% + 2 < width% THEN currentx%+=2
                  CASE 1
                      IF currenty% + 2 < height% THEN currenty%+=2
                  CASE 2
                      IF currentx% - 2 > 0 THEN currentx%-=2
                  CASE 3
                      IF currenty% - 2 > 0 THEN currenty%-=2
              END SELECT
              IF maze$(currentx%, currenty%) = "#"  Then {
                  maze$(currentx%, currenty%) = " "
                  maze$(INT((currentx% + oldx%) / 2), ((currenty% + oldy%) / 2)) = " "
             }
          NEXT i%
          done% = 1
          FOR x% = 1 TO width% - 1 STEP 2
              FOR y% = 1 TO height% - 1 STEP 2
                  IF maze$(x%, y%) = "#" THEN done% = 0
              NEXT y%
          NEXT x%
      }


      FOR y% = 0 TO height%
          FOR x% = 0 TO width%
              PRINT maze$(x%, y%);
          NEXT x%
          PRINT
      NEXT y%
}
Maze

Πέμπτη, 13 Ιουνίου 2019

Αναθεώρηση 26 Έκδοση 9.8


1. Μια μικρή διόρθωση για τον χρωματιστή κώδικα όταν έχουμε μετά από TOTE και ΑΛΛΙΩΣ ετικέτα τύπου αριθμός (είναι σαν να υπάρχει η ΠΡΟΣ πριν τον αριθμό). Εδώ στο παράδειγμα το 100 και το 120 έχουν ενδιάμεσα το else και χρωματίζεται μπλε (αναγνωριστικό της Μ2000).
Module TestMe {
 090 if random(1,2)=1 then 100 else 120
 100 Print "100"
 110 End
 120 Print "120"
 130 End
}
For i=1 to 10 : TestMe : Next

2. Προχωράει ο Ast Interpreter.
Για την ώρα δεν εκελείται ο μεταφρασμένος κώδικας. Αυτό που κάνει το παρακάτω πρόγραμμα είναι να εμφανίζει με ? τη λίστα από το lexical analyzer, που έχει ήδη φτιαχτεί με "γνώση" όπως ξέρει τα σταθερά (πχ το 100 ή το "ασδασδ") δηλαδή ποιοι είναι αριθμοί, ποια είναι αλφαριθμητικά, και επιπλέον έχει εξαφανίσει διαστήμα (white space), και σημειώσεις. Επιπλέον έχει υπολογίσει ποια είναι tuple (πχ το (1,2,3,4) είναι tuple), έχει υπολογίσει για κάθε ανοικτή παρένεθεση που είναι το επόμενο σύμβολο μετά το κλείσιμο παρένθεσης. Ομοίως έχει υπολογίσει για τις αγκύλες { }.

Αυτό που με ενδιαφέρει τώρα είναι να κάνω όλες τις δομές (πχ το Αν Τέλος Αν, το οποίο δουλεύει με Αν { } δηλαδή με μπλοκ και χωρίς μπλοκ) να έχουν προυπολογίσει τα σημεία "εξόδου" ή όπως φαίνονται στο κείμενο του AST ως skip number

Στο τέλος το AST έχει βρει πόσοι αριθμοί και αλφαριθμητικά έχουμε χρησιμοποιήσει (υπολογίζει και τα αλφαριθμητικά με αγκύλες και πολλές γραμμές), και αναγνωριστικά (καταγράφει το καθένα μια φορά).


Ο τρόπος που δουλεύει ο lexical analyzer μοιάζει με εκείνο του χρωματιστή κώδικα. Η διαφορά είναι ότι ο χρωματισμός γίνεται πιο "σοβαρός" από το χρωματιστή κώδικα, γιατί θέλουμε περισσότερα αποτελέσματα και όχι απλά να φαίνεται χρωματισμένος κώδικας. Για το λόγο αυτό υπάρχει το αντικείμενο κλάσης Lexar το οποίο φορτώνει κώδικα και καλεί γεγονότα. Εντός της Lexar υπάρχει το αντικείμενο Document το οποίο σπάει το κείμενο σε παραγράφους και στέλνει κάθε γραμμή για χρωμάτισμα με γεγονότα στην Lexar. Ενδέχεται μια γραμμή να χρωματίσει και επόμενες, έτσι η Document αν βλέπει ήδη μια γραμμή χρωματισμένη την αφήνει. Υπάρχει μια κλάση CodeBlock η οποία δημιουργεί την κλάση Lexar και συνδέει τα γεγονότα της με αυτήν. Έτσι το τελικό διαμορφώνεται από τις τρεις κλάσεις, με γεγονότα από το Document στο Lexar και μετά στο CodeBlock. Προς το παρόν το CodeBlock έχει μια μέθοδο που κάνει εμφάνιση γραμμών στην κονσόλα της Μ2000, με σταμάτημα σε κάθε 3/4 του ύψους της κονσόλας. Αυτό με βοηθάει να εξετάζω το αποτέλεσμα. Έτσι πριν προχωρήσω στην εκτέλεση του αποτελέσματος θέλω να είμαι σίγουρος ότι κάνει όλα αυτά που θέλω να κάνει (και είναι πάρα πολλά, προφανώς θα έχω να διορθώνω αρκετά, αν δεν πετύχω μια ευνοική κωδικοποίηση στο AST). Αν και το λέμε tree είναι ένα πίνακας στοιχείων όπου όμως υπάρχει πεδίο για σύνδεση με άλλο σημείο. και αυτό ήδη το εκμεταλλεύομαι για να σημαδεύω σε μια αρχή παρένθεσης ή μπλοκ το τέλος του. Εσωτερικά το Lexar έχει και έναν σωρό τιμών (τον χρησιμοποιώ σαν στοίβα) για να μπορώ να κλείνω σωστά τα μέρη κώδικα.
Υπάρχουν μερικά Stop στο κώδικα της VB6 για να με βοηθούν να βλέπω πότε συμβαίνουν πράγματα που δεν θέλω!

Εδώ είναι το αρχείο με το κώδικα ως τώρα (θα το ανανεώνω τακτικά) AST Interprerter

MODULE Pythagoras_tree {
 CLS 5, 0  ' MAGENTA, NO SPLIT SCREEN
 PEN 14   ' YELLOW
 \\ code from zkl/Free Basic
 LET w = scale.x, h = w * 11 div 16
 LET w2 = w div 2, diff = w div 12
 LET TreeOrder = 6
 pythagoras_tree(w2 - diff, h -10, w2 + diff, h -10, 0)
 
 SUB pythagoras_tree(x1, y1, x2, y2, depth)
 
     IF depth > TreeOrder THEN EXIT SUB
 
     LOCAL dx = x2 - x1, dy = y1 - y2
     LOCAL x3 = x2 - dy, y3 = y2 - dx
     LOCAL x4 = x1 - dy, y4 = y1 - dx
     LOCAL x5 = x4 + (dx - dy) / 2
     LOCAL y5 = y4 - (dx + dy) / 2
     MOVE x1, y1
     DRAW TO x2, y2
     DRAW TO x3, y3
     DRAW TO x4, y4
     DRAW TO x1, y1
     pythagoras_tree(x4, y4, x5, y5, depth +1)
     pythagoras_tree(x5, y5, x3, y3, depth +1)
 
 END SUB
}
Pythagoras_tree

Στην κλάση CodeBlock υπάρχει αυτό:
Private Type ast
    codepos As Long
    codetype As Integer
    codehelp As Integer
    codevar As Long
End Type

Δηλαδή κάθε εγγραφή έχει 4+2+2+4 bytes, και υπάρχει βοηθητικός χώρος για τα αναγνωριστικά (γράφονται μια φορά), για αριθμούς και αλφαριθμητικά. Προς το παρόν το 5 αν υπάρχει δυο φορές θα γραφτεί δυο φορές (δεν το έχω βάλει να κάνει αναζήτηση σε πίνακα, δηλαδή ξοδεύω μνήμη, η οποία όμως έχει γρηγορότερη προσπέλαση). Ομοίως για τα αλφαριθμητικά.

Στην εμφάνιση αλλάζει κάπως:
Το πρώτο νούμερο είναι ο αριθμός του στοιχείου. Το δεύτερο είναι η θέση του στο κώδικα. Ακολουθεί το σύμβολο (μας λέει και τι είναι)

Νεότερη έκδοση!

 0 1 11 Identifier:MODULE
 1 8 161 Identifier:PYTHAGORAS_TREE
 2 25 140 START BRACKET 210
 3 24 0
 4 28 11 Identifier:CLS
 5 32 100  5 Double
 6 33 8 ,
 7 35 100  0 Double
 8 63 0
 9 67 11 Identifier:PEN
 10 71 100  14 Double
 11 83 0
 12 117 11 Identifier:LET
 13 121 161 Identifier:W
 14 123 14 =
 15 125 11 Identifier:SCALE.X
 16 132 8 ,
 17 134 161 Identifier:H
 18 136 14 =
 19 138 161 Identifier:W
 20 140 14 *
 21 142 100  11 Double
 22 145 11 Identifier:DIV
 23 149 100  16 Double
 24 150 0
 25 154 11 Identifier:LET
 26 158 161 Identifier:W2
 27 161 14 =
 28 163 161 Identifier:W
 29 165 11 Identifier:DIV
 30 169 100  2 Double
 31 170 8 ,
 32 172 161 Identifier:DIFF
 33 177 14 =
 34 179 161 Identifier:W
 35 181 11 Identifier:DIV
 36 185 100  12 Double
 37 186 0
 38 190 11 Identifier:LET
 39 194 161 Identifier:TREEORDER
 40 204 14 =
 41 206 100  6 Double
 42 206 0
 43 210 165 Identifier:PYTHAGORAS_TREE( skip to 62
 44 226 161 Identifier:W2
 45 229 14 -
 46 231 161 Identifier:DIFF
 47 235 8 ,
 48 237 161 Identifier:H
 49 239 14 -
 50 240 100  10 Double
 51 242 8 ,
 52 244 161 Identifier:W2
 53 247 14 +
 54 249 161 Identifier:DIFF
 55 253 8 ,
 56 255 161 Identifier:H
 57 257 14 -
 58 258 100  10 Double
 59 260 8 ,
 60 262 100  0 Double
 61 263 19 )
 62 263 0
 63 270 111 SUB
 64 274 165 Identifier:pythagoras_tree( skip to 75
 65 290 161 Identifier:X1
 66 292 8 ,
 67 294 161 Identifier:Y1
 68 296 8 ,
 69 298 161 Identifier:X2
 70 300 8 ,
 71 302 161 Identifier:Y2
 72 304 8 ,
 73 306 161 Identifier:DEPTH
 74 311 19 )
 75 311 0
 76 322 11 Identifier:IF
 77 325 161 Identifier:DEPTH
 78 331 14 >
 79 333 161 Identifier:TREEORDER
 80 343 11 Identifier:THEN
 81 348 11 Identifier:EXIT
 82 353 11 Identifier:SUB
 83 355 0
 84 366 11 Identifier:LOCAL
 85 372 161 Identifier:DX
 86 375 14 =
 87 377 161 Identifier:X2
 88 380 14 -
 89 382 161 Identifier:X1
 90 384 14 ,
 91 386 161 Identifier:DY
 92 389 14 =
 93 391 161 Identifier:Y1
 94 394 14 -
 95 396 161 Identifier:Y2
 96 397 0
 97 405 11 Identifier:LOCAL
 98 411 161 Identifier:X3
 99 414 14 =
 100 416 161 Identifier:X2
 101 419 14 -
 102 421 161 Identifier:DY
 103 423 14 ,
 104 425 161 Identifier:Y3
 105 428 14 =
 106 430 161 Identifier:Y2
 107 433 14 -
 108 435 161 Identifier:DX
 109 436 0
 110 444 11 Identifier:LOCAL
 111 450 161 Identifier:X4
 112 453 14 =
 113 455 161 Identifier:X1
 114 458 14 -
 115 460 161 Identifier:DY
 116 462 14 ,
 117 464 161 Identifier:Y4
 118 467 14 =
 119 469 161 Identifier:Y1
 120 472 14 -
 121 474 161 Identifier:DX
 122 475 0
 123 483 11 Identifier:LOCAL
 124 489 161 Identifier:X5
 125 492 14 =
 126 494 161 Identifier:X4
 127 497 14 +
 128 499 17 ( skip to 133
 129 500 161 Identifier:DX
 130 503 14 -
 131 505 161 Identifier:DY
 132 507 19 )
 133 509 14 /
 134 511 100  2 Double
 135 511 0
 136 519 11 Identifier:LOCAL
 137 525 161 Identifier:Y5
 138 528 14 =
 139 530 161 Identifier:Y4
 140 533 14 -
 141 535 17 ( skip to 146
 142 536 161 Identifier:DX
 143 539 14 +
 144 541 161 Identifier:DY
 145 543 19 )
 146 545 14 /
 147 547 100  2 Double
 148 547 0
 149 555 11 Identifier:MOVE
 150 560 161 Identifier:X1
 151 562 8 ,
 152 564 161 Identifier:Y1
 153 565 0
 154 573 11 Identifier:DRAW
 155 578 11 Identifier:TO
 156 581 161 Identifier:X2
 157 583 8 ,
 158 585 161 Identifier:Y2
 159 586 0
 160 594 11 Identifier:DRAW
 161 599 11 Identifier:TO
 162 602 161 Identifier:X3
 163 604 8 ,
 164 606 161 Identifier:Y3
 165 607 0
 166 615 11 Identifier:DRAW
 167 620 11 Identifier:TO
 168 623 161 Identifier:X4
 169 625 8 ,
 170 627 161 Identifier:Y4
 171 628 0
 172 636 11 Identifier:DRAW
 173 641 11 Identifier:TO
 174 644 161 Identifier:X1
 175 646 8 ,
 176 648 161 Identifier:Y1
 177 649 0
 178 657 165 Identifier:PYTHAGORAS_TREE( skip to 191
 179 673 161 Identifier:X4
 180 675 8 ,
 181 677 161 Identifier:Y4
 182 679 8 ,
 183 681 161 Identifier:X5
 184 683 8 ,
 185 685 161 Identifier:Y5
 186 687 8 ,
 187 689 161 Identifier:DEPTH
 188 695 14 +
 189 696 100  1 Double
 190 697 19 )
 191 697 0
 192 705 165 Identifier:PYTHAGORAS_TREE( skip to 205
 193 721 161 Identifier:X5
 194 723 8 ,
 195 725 161 Identifier:Y5
 196 727 8 ,
 197 729 161 Identifier:X3
 198 731 8 ,
 199 733 161 Identifier:Y3
 200 735 8 ,
 201 737 161 Identifier:DEPTH
 202 743 14 +
 203 744 100  1 Double
 204 745 19 )
 205 745 0
 206 752 11 Identifier:END
 207 756 11 Identifier:SUB
 208 758 0
 209 761 141 END BRACKET 3
 210 761 0
 211 764 161 Identifier:PYTHAGORAS_TREE
 212 778 0
Number Literals: 15
String Literals: 1
Identifiers: 36