Gordons Projects

--> Projects Top-Level GIT

Initial commit into GIT master
authorGordon Henderson <projects@drogon.net>
Thu, 22 Nov 2012 22:39:17 +0000 (22:39 +0000)
committerGordon Henderson <projects@drogon.net>
Thu, 22 Nov 2012 22:39:17 +0000 (22:39 +0000)
cesil.rtb [new file with mode: 0644]
cesil.txt [new file with mode: 0644]
col-round.csl [new file with mode: 0644]
mtable.csl [new file with mode: 0644]
primes.csl [new file with mode: 0644]
row-up.csl [new file with mode: 0644]
row0.csl [new file with mode: 0644]
tree.csl [new file with mode: 0644]

diff --git a/cesil.rtb b/cesil.rtb
new file mode 100644 (file)
index 0000000..f26e8c8
--- /dev/null
+++ b/cesil.rtb
@@ -0,0 +1,554 @@
+//
+// CESIL Interperter
+//  Computer Education in Schools Instructional Language
+//
+//  With an xmas tree and user-programmable fairy lights
+//    Gordon Henderson, November 2012
+//    https://projects.drogon.net/
+//
+stackSize = 64
+mxProgSize = 256
+DIM fx(4, 8), fy(4, 8), fairyColours(4, 8)
+DIM cesil$(mxProgSize)
+DIM labels$(mxProgSize), operators$(mxProgSize), operands$(mxProgSize)
+DIM vars(64), subStack(stackSize)
+NUMFORMAT (8, 0)
+error$ = ""
+label$ = ""
+operator$ = ""
+operand$ = ""
+tree = FALSE
+//
+CLS 
+PRINT 
+PRINT "CESIL: Computer Education in Schools Instructional Language"
+PRINT "==========================================================="
+PRINT 
+CYCLE 
+  PRINT 
+  INPUT "Program to load: ", prog$
+  if len (prog$) = 0 then break
+  PROC loadProgram(prog$ + ".csl")
+  IF numLines = 0 THEN 
+    PRINT "Program load failed"
+    CONTINUE 
+  ENDIF 
+  //
+  CYCLE 
+    PROC runCESIL
+    PRINT "Run Again? ";  
+    CYCLE 
+      k$ = GET$
+    REPEAT UNTIL k$ = "y" OR k$ = "Y" OR k$ = "n" OR k$ = "N"
+    IF k$ = "n" OR k$ = "N" THEN 
+      PRINT "No."
+      BREAK 
+    ELSE 
+      PRINT "Yes"
+    ENDIF 
+  REPEAT 
+REPEAT 
+print
+print "+++OUT OF CHEESE ERROR. STOP."
+END 
+//
+// loadProgram
+//    Read in a program from disk
+//
+DEF PROC loadProgram(file$)
+LOCAL handle, ln$
+//
+error$ = ""
+numLines = 0
+//
+handle = OPENIN (file$)
+IF handle = -1 THEN ENDPROC 
+//
+WHILE  NOT EOF (handle) CYCLE 
+  numLines = numLines + 1
+  INPUT# handle, ln$
+  ln$ = FN upperCase(ln$)
+  cesil$(numLines) = ln$
+  IF LEN (ln$) = 0 OR LEFT$ (ln$, 1) = "#" THEN 
+    labels$(numLines) = ""
+    operators$(numLines) = ""
+    operands$(numLines) = ""
+    CONTINUE 
+  ENDIF 
+  PROC splitLine(ln$)
+  IF error$ <> "" THEN 
+    PRINT "Program LOAD fail at line ";  numLines;  ": ";  error$
+    PRINT "[";  numLines;  "] ";  cesil$(numLines)
+    BREAK 
+  ENDIF 
+  labels$(numLines) = label$
+  operators$(numLines) = operator$
+  operands$(numLines) = operand$
+REPEAT 
+CLOSE (handle)
+ENDPROC 
+//
+// runCESIL:
+//    Run A CESIL program
+//
+DEF PROC runCESIL
+LOCAL i, p
+LOCAL x, key$
+LOCAL acc, pc, row, col, halt
+acc = 0
+pc = 0
+row = 0
+col = 0
+stackPtr = 0
+pc = 1
+sStep = FALSE
+halt = FALSE
+//
+CYCLE 
+  //
+  // Space to pause, Q to quit
+  //
+  x = INKEY
+  IF x = ASC ("q") OR x = ASC ("Q") THEN BREAK 
+  //
+  IF x = ASC (" ") OR sStep THEN 
+    key$ = GET$
+    IF key$ = "q" OR key$ = "Q" THEN BREAK 
+    IF key$ = " " THEN 
+      sStep = TRUE
+    ELSE 
+      sStep = FALSE
+    ENDIF 
+  ENDIF 
+  //
+  IF pc > numLines THEN 
+    PRINT "Unnexpected end of program"
+    BREAK 
+  ENDIF 
+  //
+  operator$ = operators$(pc)
+  IF operator$ = "" THEN 
+    pc = pc + 1
+    CONTINUE 
+  ENDIF 
+  operand$ = operands$(pc)
+  //
+  SWITCH (operator$)
+    CASE "LOAD"
+      acc = FN eval(operand$)
+      pc = pc + 1
+    ENDCASE 
+    //
+    CASE "STORE"
+      PROC store(operand$, acc)
+      pc = pc + 1
+    ENDCASE 
+    //
+    CASE "JUMP"
+      pc = FN findLabel(operand$)
+    ENDCASE 
+    //
+    CASE "JINEG"
+      IF acc < 0 THEN 
+        pc = FN findLabel(operand$)
+      ELSE 
+        pc = pc + 1
+      ENDIF 
+    ENDCASE 
+    //
+    CASE "JIZERO"
+      IF acc = 0 THEN 
+        pc = FN findLabel(operand$)
+      ELSE 
+        pc = pc + 1
+      ENDIF 
+    ENDCASE 
+    //
+    CASE "ADD"
+      acc = acc + FN eval(operand$)
+      pc = pc + 1
+    ENDCASE 
+    //
+    CASE "SUB"
+      acc = acc - FN eval(operand$)
+      pc = pc + 1
+    ENDCASE 
+    //
+    CASE "MUL"
+      acc = acc * FN eval(operand$)
+      pc = pc + 1
+    ENDCASE 
+    //
+    CASE "DIV"
+      acc = INT (acc / FN eval(operand$))
+      pc = pc + 1
+    ENDCASE 
+    //
+    CASE "HALT"
+      halt = TRUE
+    ENDCASE 
+    //
+    CASE "JSR"
+      IF stackPtr = stackSize THEN 
+        error$ = "Too many JSRs"
+      ELSE 
+        subStack(stackPtr) = pc
+        stackPtr = stackPtr + 1
+        pc = FN findLabel(operand$)
+      ENDIF 
+    ENDCASE 
+    //
+    CASE "RET"
+      IF stackPtr = 0 THEN 
+        error$ = "RET without JSR"
+      ELSE 
+        stackPtr = stackPtr - 1
+        pc = subStack(stackPtr) + 1
+      ENDIF 
+    ENDCASE 
+    //
+    CASE "PRINT"
+      PRINT operand$;  
+      pc = pc + 1
+    ENDCASE 
+    //
+    CASE "OUT"
+      PRINT acc;  
+      pc = pc + 1
+    ENDCASE 
+    //
+    CASE "LINE"
+      PRINT 
+      pc = pc + 1
+    ENDCASE 
+    //
+    CASE "IN"
+      INPUT in$
+      acc = VAL (in$)
+      pc = pc + 1
+    ENDCASE 
+    //
+    // Extensions
+    //
+    CASE "WAIT"
+      t = FN eval(operand$)
+      IF t <> -1 THEN 
+        PROC updateFairies
+        UPDATE 
+        WAIT (t / 100)
+      ENDIF 
+      pc = pc + 1
+    ENDCASE 
+    //
+    CASE "TREE"
+      HGR 
+      PROC setupTree
+      PROC updateFairies
+      UPDATE 
+      pc = pc + 1
+    ENDCASE 
+    //
+    CASE "ROW"
+      row = acc
+      pc = pc + 1
+    ENDCASE 
+    //
+    CASE "COL"
+      col = acc
+      pc = pc + 1
+    ENDCASE 
+    //
+    CASE "COLOUR"
+      fairyColours(row, col) = acc & 15
+      pc = pc + 1
+    ENDCASE 
+    //
+    DEFAULT 
+      error$ = "Undefined Operator"
+    ENDCASE 
+  ENDSWITCH 
+  //
+  IF error$ <> "" THEN 
+    PRINT "Error at line ";  pc;  ": ";  error$
+    BREAK 
+  ENDIF 
+  //
+  IF halt THEN BREAK 
+  //
+REPEAT 
+//
+ENDPROC 
+//
+// eval:
+//    Return the number that the operand represents.
+//    It's either a literal number, or a variable
+//
+DEF FN eval(operand$)
+LOCAL x$
+IF LEN (operand$) = 0 THEN 
+  error$ = "Missing operand"
+   = -1
+ENDIF 
+//
+x$ = LEFT$ (operand$, 1)
+IF x$ = "-" OR (x$ >= "0" AND x$  <= "9") THEN 
+   = VAL (operand$)
+ENDIF 
+ = vars(operand$)
+//
+// store:
+//    Store the ACC in memory
+//
+DEF PROC store(operand$, acc)
+vars(operand$) = acc
+ENDPROC 
+//
+// findLabel:
+//    Search the program for a label target
+//
+DEF FN findLabel(label$)
+LOCAL i
+FOR i = 1 TO numLines CYCLE 
+  IF labels$(i) = label$ THEN BREAK 
+REPEAT 
+IF i > numLines THEN 
+  error$ = "Label <" + label$ + "> not found"
+   = -1
+ELSE 
+   = i
+ENDIF
+//
+// dumpProg
+//    Debugging
+//
+DEF PROC dumpProg
+LOCAL i
+FOR i = 1 TO numLines CYCLE 
+  PRINT i;  ": ";  
+  PROC pStr(labels$(i) + ":", 16)
+  PROC pStr(operators$(i), 8)
+  PROC pStr(operands$(i), 8)
+  PRINT 
+REPEAT 
+ENDPROC 
+//
+DEF PROC pStr(s$, w)
+LOCAL i
+PRINT s$;  
+FOR i = 1 TO LEN (s$) - w CYCLE 
+  PRINT " ";  
+REPEAT 
+ENDPROC 
+//
+// splitLine:
+//    Split a line into its 3 components:
+//      label, operator, operand
+//
+DEF PROC splitLine(progl$)
+LOCAL x$, sPtr
+label$ = ""
+operator$ = ""
+operand$ = ""
+//
+// Check for a label
+//
+sPtr = 0
+x$ = LEFT$ (progl$, 1)
+IF  NOT (x$ = " " OR x$ = CHR$ (9)) THEN  // No Label
+  FOR sPtr = 0 TO LEN (progl$) - 1 CYCLE 
+    x$ = MID$ (progl$, sPtr, 1)
+    IF x$ = ":" THEN BREAK 
+    label$ = label$ + x$
+  REPEAT 
+  IF x$ <> ":" THEN 
+    error$ = "Invalid label"
+    ENDPROC 
+  ENDIF 
+ENDIF 
+//
+// Check for an operator
+//
+progl$ = FN trim(RIGHT$ (progl$, LEN (progl$) - sPtr - 1))
+IF LEN (progl$) = 0 THEN ENDPROC 
+IF LEFT$ (progl$, 1) = "#" THEN ENDPROC 
+//
+FOR sPtr = 0 TO LEN (progl$) - 1 CYCLE 
+  x$ = MID$ (progl$, sPtr, 1)
+  IF x$ = " " OR x$ = CHR$ (9) THEN BREAK 
+  operator$ = operator$ + x$
+REPEAT 
+//
+// Check for operand
+//
+progl$ = FN trim(RIGHT$ (progl$, LEN (progl$) - sPtr - 1))
+IF LEN (progl$) = 0 THEN ENDPROC 
+IF LEFT$ (progl$, 1) = "#" THEN ENDPROC 
+IF LEFT$ (progl$, 1) = CHR$ (34) THEN  // Double quote
+  FOR sPtr = 1 TO LEN (progl$) - 1 CYCLE 
+    x$ = MID$ (progl$, sPtr, 1)
+    IF x$ = CHR$ (34) THEN BREAK 
+    operand$ = operand$ + x$
+  REPEAT 
+ELSE 
+  FOR sPtr = 0 TO LEN (progl$) - 1 CYCLE 
+    x$ = MID$ (progl$, sPtr, 1)
+    IF x$ = " " OR x$ = CHR$ (9) THEN BREAK 
+    operand$ = operand$ + x$
+  REPEAT 
+ENDIF 
+//
+ENDPROC 
+//
+//
+// FN upperCase:
+//    Translate a line of text into upper case
+//
+DEF FN upperCase(mixed$)
+LOCAL t$, i
+IF LEN (mixed$) = 0 THEN  = mixed$
+t$ = ""
+FOR i = 0 TO LEN (mixed$) - 1 CYCLE 
+  x$ = MID$ (mixed$, i, 1)
+  IF ASC (x$) >= 96 THEN x$ = CHR$ (ASC (x$) - 32) // ASCII FTW...
+  t$ = t$ + x$
+REPEAT 
+ = t$
+//
+// trim:
+//    Remove leading spaces (recursively)
+//
+DEF FN trim(ln$)
+IF LEN (ln$) = 0 THEN  = ln$
+IF LEFT$ (ln$, 1) = " " OR LEFT$ (ln$, 1) = CHR$ (9) THEN 
+   = FN trim(RIGHT$ (ln$, LEN (ln$) - 1))
+ELSE 
+   = ln$
+ENDIF 
+//
+//
+// setupTree:
+//    Draw the tree and initialise the fairy lights to all on, white (silver)
+//
+DEF PROC setupTree
+LOCAL pass, i, x, y
+LOCAL row, fairy
+LOCAL foo()
+LOCAL xx(), yy()
+//
+RESTORE
+DIM xx(32), yy(32)
+xmul = GWIDTH / 32
+ymul = GHEIGHT / 24
+//
+// Draw the Pot and Tree
+//
+FOR pass = 1 TO 3 CYCLE 
+  i = 0
+  CYCLE 
+    READ x, y
+    IF x = -1 THEN BREAK 
+    xx(i) = x
+    yy(i) = y
+    i = i + 1
+  REPEAT 
+  PROC treePlotter(pass, i)
+REPEAT 
+//
+// Put up the fairy lights
+//
+FOR row = 0 TO 3 CYCLE 
+  FOR fairy = 0 TO 3 CYCLE 
+    READ x, y
+    fx(row, 3 - fairy) = x * xmul
+    fx(row, 4 + fairy) = (32 - x) * xmul
+    fy(row, 3 - fairy) = y * ymul
+    fy(row, 4 + fairy) = y * ymul
+    fairyColours(row, 3 - fairy) = White
+    fairyColours(row, 4 + fairy) = White
+  REPEAT 
+REPEAT 
+READ x, y
+fairyX = x * xmul
+fairyY = y * ymul
+tree = TRUE
+ENDPROC 
+//
+// treePlotter:
+//    Pick the colour and plot the data for bits of our
+//    tree. We cycle through the arrays one way then
+//    the other to make up a polygon which the system
+//    will then fill for us...
+//
+DEF PROC treePlotter(pass, num)
+LOCAL i
+//
+SWITCH (pass)
+  CASE 1
+    COLOUR = Maroon
+  ENDCASE 
+  CASE 2
+    COLOUR = Green
+  ENDCASE 
+  CASE 3
+    rgbCOLOUR (255, 215, 0) // Gold (ish) star
+  ENDCASE 
+ENDSWITCH 
+//
+PolyStart 
+FOR i = 0 TO num - 1 CYCLE 
+  PolyPlot (xx(i) * xmul, yy(i) * ymul)
+REPEAT 
+FOR i = num - 2 TO 0 STEP -1 CYCLE 
+  PolyPlot ((32 - xx(i)) * xmul, yy(i) * ymul)
+REPEAT 
+PolyEnd 
+ENDPROC 
+//
+//
+// updateFairies
+//    Display the lights in their colours
+//
+DEF PROC updateFairies
+LOCAL row, col
+IF  NOT tree THEN ENDPROC 
+FOR row = 0 TO 3 CYCLE 
+  FOR col = 0 TO 7 CYCLE 
+    COLOUR = fairyColours(row, col)
+    CIRCLE (fx(row, col), fy(row, col), xmul / 4, 1)
+  REPEAT 
+REPEAT 
+//CIRCLE (fairyX, fairyY, xmul / 2, 1)
+ENDPROC 
+//
+// Data for the tree, etc.
+//    It was originally drawn on a squared paper grid of 32 by 24. This
+//    scales into a 640x480 screen OK. If anyone wants to supply finer
+//    data then please do so - just check the scaling factors used above.
+//    also note that the data just represents the left-side of the tree,
+//    as it's symetrical, we can deduce the other side...
+//
+// Tree Pot Data
+//
+DATA 14, 0, 14, 1, 13, 3, 16, 3
+DATA -1, -1
+//
+// Tree Branches data
+//
+DATA 15, 3, 15, 6, 12, 6, 6, 5, 4, 4, 9, 9, 12, 10, 15, 10
+DATA 15, 11, 14, 11, 7, 10, 8, 11, 14, 15, 15, 15
+DATA 15, 16, 14, 16, 9, 14, 12, 17, 14, 19, 15, 19
+DATA 15, 20, 14, 20, 10, 18, 13, 21, 16, 22
+DATA -1, -1
+//
+// The 'Star'
+//
+DATA 16, 22, 14.5, 21, 15.5, 22, 14.5, 22, 15.5, 22.5, 16, 24
+DATA -1, -1
+//
+// Fairy Light Data
+//
+DATA 14, 8, 11, 7, 7, 6, 4, 4
+DATA 14, 13, 12, 12, 10, 11, 7, 10
+DATA 15, 17.5, 13, 17, 12, 16, 9, 14
+DATA 15, 21, 13, 20, 11.5, 19, 10, 18
+DATA 16, 23
diff --git a/cesil.txt b/cesil.txt
new file mode 100644 (file)
index 0000000..68790e0
--- /dev/null
+++ b/cesil.txt
@@ -0,0 +1,50 @@
+
+CESIL - Computer Education in Schools Instructional Language
+============================================================
+
+CESIL instructions:
+
+  LOAD         - Transfer the number into the accumulator
+  STORE                - Transfer the accumulator into a named variable
+  JUMP         - Jump to the given label
+  JINEG                - Jump if the accumulator is negative
+  JIZERO       - Jump if the accumulator is zero
+  ADD          - Add a value
+  SUB          - Subtract
+  MUL          - Multiply
+  DIV          - Divide
+  HALT         - End program
+  IN           - Read a number from the keyboard
+  OUT          - Outputs the accumulator as a number
+  PRINT                - Prints a literal string (in "quotes")
+  LINE         - Prints a new line
+
+Extensions:
+
+  JSR          - Jump to subroutine
+  RET          - Return from subroutine
+
+  TREE         - Generate a Christmas tree
+  ROW          - Transfer the accumulator into the Row register
+  COL          - Transfer the accumulator into the Column register
+  COLOUR       - Set the lamp indicated by the Row and column
+                       registers to the colour value in the accumulator
+  WAIT         - Waits for a period of centiseconds, also updates
+                       the display.
+
+        0 -> Off (Black)
+        1 -> Navy
+        2 -> Green
+        3 -> Teal
+        4 -> Maroon
+        5 -> Purple
+        6 -> Olive
+        7 -> Silver
+        8 -> Grey
+        9 -> Blue
+       10 -> Lime
+       11 -> Aqua
+       12 -> Red
+       13 -> Pink
+       14 -> Yellow
+       15 -> White
diff --git a/col-round.csl b/col-round.csl
new file mode 100644 (file)
index 0000000..f16d666
--- /dev/null
@@ -0,0 +1,90 @@
+# col-round:
+#      Columns go round
+
+       tree
+
+       load    1               # Dark Blue
+       store   colour
+       jsr     treeFill
+       wait    100             # 1 Second (warm up time)
+
+bigLoop:
+       load    0               # column 0 to 7
+       store   myCol
+
+nextCol:
+       load    1               # Silver
+       store   colour
+       jsr     treeFill
+
+       load    12              # Red
+       store   colour
+
+       load    myCol
+       col
+       jsr     fillCol
+       wait    10
+
+       load    myCol
+       add     1
+       store   myCol
+       sub     8
+       jizero  bigLoop
+       jump    nextCol
+
+       halt
+       
+
+# treeFill:
+#      Fill the whole tree with colour
+
+treeFill:
+       load    3       # 4 Rows - 3,2,1 and 0
+treeFill1:
+       store   rowCount
+       row
+       jsr     fillRow
+
+       load    rowCount
+       sub     1
+       jineg   doneTreeFill
+       jump    treeFill1
+
+doneTreeFill:
+       ret
+
+# fillRow
+#      Fill a whole row with colour
+
+fillRow:
+       load    7       # 8 Columns 8...0
+fillRow1:
+       store   colCount
+       col
+       load    colour
+       colour
+       load    colCount
+       sub     1
+       jineg   fillRowDone
+       jump    fillRow1
+
+fillRowDone:
+       ret
+
+# fillCol
+#      Fill a whole column with colour
+
+fillCol:
+       load    3       # 4 Rows 3...0
+fillCol1:
+       store   colCount
+       row
+       load    colour
+       colour
+       load    colCount
+       sub     1
+       jineg   fillColDone
+       jump    fillCol1
+
+fillColDone:
+       ret
diff --git a/mtable.csl b/mtable.csl
new file mode 100644 (file)
index 0000000..eada8f4
--- /dev/null
@@ -0,0 +1,34 @@
+
+# mtable:
+#      Multiplication table generator
+
+       line
+       print   "Multiplication table generator"
+       line
+       print   "What table"
+       in
+       store   table
+
+       load    1
+       store   index
+
+loop:
+       load    index
+       out     
+       print   " TIMES "
+       load    table
+       out
+       print   " = "
+
+       mul     index
+
+       out
+       line
+
+       load    index
+       add     1
+       store   index
+       sub     11
+       jineg   loop
+       halt
+
diff --git a/primes.csl b/primes.csl
new file mode 100644 (file)
index 0000000..30f511c
--- /dev/null
@@ -0,0 +1,76 @@
+
+# primes:
+#      Calculate prime numbers.
+#      This program uses the rather long and boring process of simply
+#      testing a number to see if anything divides into it evenly.
+
+       line
+       print   "How many to find"
+       in
+       store   numPrimes
+
+       print   "Working:"
+       line
+
+# 2 is the first prime:
+#      bit of a cheat but we'll calculate the rest
+
+       load    2
+       out
+
+       load    3
+bigLoop:
+       store   candidate
+       jsr     primeTest
+       jizero  nextCandidate
+
+       load    candidate
+       out
+       wait    1
+
+       load    numPrimes
+       sub     1
+       store   numPrimes
+       jizero  done
+
+nextCandidate:
+       load    candidate
+       add     2               # All primes after 2 are odd
+       jump    bigLoop
+
+done:
+       line
+       halt
+
+# primeTest:
+#      Entry:  candiate is acc
+#      Exit:   acc contains 1 if prime
+#      This is a brute-force way to work out if it has any divisors.
+#      (Although it's a reasonably clever way to get the remainer)
+
+primeTest:
+       div     2               # Only check up to half the candidate
+       store   divisor
+
+nextTest:
+       sub     1               # If divisor got down to 1, then it's prime
+       jizero  gotPrime
+
+       load    candidate
+       div     divisor
+       mul     divisor
+       sub     candidate       # If zero, then it divided evenly = No Prime
+       jizero  notPrime
+
+       load    divisor
+       sub     1
+       store   divisor
+       jump    nextTest
+
+notPrime:
+       load    0
+       ret
+
+gotPrime:
+       load    1
+       ret
diff --git a/row-up.csl b/row-up.csl
new file mode 100644 (file)
index 0000000..426065c
--- /dev/null
@@ -0,0 +1,90 @@
+# row-up:
+#      "Float" a row up the tree
+
+       tree
+
+       load    1               # Dark Blue
+       store   colour
+       jsr     treeFill
+       wait    100             # 1 Second (warm up time)
+
+bigLoop:
+       load    0               # Row 0 to 3
+       store   myRow
+
+nextRow:
+       load    1               # Silver
+       store   colour
+       jsr     treeFill
+
+       load    12              # Red
+       store   colour
+
+       load    myRow
+       row
+       jsr     fillRow
+       wait    10
+
+       load    myRow
+       add     1
+       store   myRow
+       sub     4
+       jizero  bigLoop
+       jump    nextRow
+
+       halt
+       
+
+# treeFill:
+#      Fill the whole tree with colour
+
+treeFill:
+       load    3       # 4 Rows - 3,2,1 and 0
+treeFill1:
+       store   rowCount
+       row
+       jsr     fillRow
+
+       load    rowCount
+       sub     1
+       jineg   doneTreeFill
+       jump    treeFill1
+
+doneTreeFill:
+       ret
+
+# fillRow
+#      Fill a whole row with colour
+
+fillRow:
+       load    7       # 8 Columns 8...0
+fillRow1:
+       store   colCount
+       col
+       load    colour
+       colour
+       load    colCount
+       sub     1
+       jineg   fillRowDone
+       jump    fillRow1
+
+fillRowDone:
+       ret
+
+# fillCol
+#      Fill a whole column with colour
+
+fillCol:
+       load    3       # 4 Rows 3...0
+fillCol1:
+       store   colCount
+       row
+       load    colour
+       colour
+       load    colCount
+       sub     1
+       jineg   fillColDone
+       jump    fillCol1
+
+fillColDone:
+       ret
diff --git a/row0.csl b/row0.csl
new file mode 100644 (file)
index 0000000..1ed7ae2
--- /dev/null
+++ b/row0.csl
@@ -0,0 +1,20 @@
+# Example program to light the bottom
+#      row with RED lights
+
+       tree            # Make a tree!
+
+       load    0
+       row             # Row 0 - Bottom
+       load    7       # Count 7 to zero
+loop:
+       store   col-count
+       col
+       load    12      # Red
+       colour
+       load    col-count
+       sub     1
+       jineg   done    # Jump If Negative
+       jump    loop
+
+done:  wait    1       # Update the lights
+       halt
diff --git a/tree.csl b/tree.csl
new file mode 100644 (file)
index 0000000..7a174a6
--- /dev/null
+++ b/tree.csl
@@ -0,0 +1,44 @@
+# Example program
+#      Note: We have 4 rows of 8 columns and
+#      Row 0 is the bottom, column 0 is to the left
+
+# Fire up the tree
+
+       tree
+
+# 'colour' is a flag to indicate which colour to display
+
+       load    0
+       store   colour
+
+restart:
+       load    3       # 3 into the Acc
+loop:
+       store   row-count
+       row
+       jsr     fill-col
+       load    row-count
+       sub     1
+       jineg   done
+       jump    loop
+
+done:  wait    20
+       load    colour
+       add     1
+       store   colour
+       jump    restart
+
+fill-col:
+       load    7
+fill-loop:
+       store   col-count
+       col
+       load    colour
+       colour
+       load    col-count
+       sub     1
+       jineg   fill-done
+       jump    fill-loop
+
+fillDone:
+       ret