new world
[rubydium.git] / baby / emulator.rb
blob524b6306cd4577465e839980ceeed67fc38fe30b
1 # TODO - in the machine impl itself currently initialize is not called automatically
2 class Object
3    def alloc_self
4       @data = []
5    end
6    def set a, b
7       @data[a] = b
8    end
9    def get a
10       @data[a]
11    end
12    def set_self string
13       @data = [string.length]
14       string.each_byte { |b| @data << b }
15    end
16 end
17 module Kernel
18    def pi integer
19       puts integer.to_s
20    end
21    def putch byte
22       Kernel.print byte.chr
23    end
24 end
25 String = Class.new
26          class String
27             def initialize
28                alloc_self
29                set 0, 0
30             end
31             def alloc size
32                set 0, size
33             end
34             def setdata ba
35                set_self ba
36             end
37             def []= a, b
38                set a, b
39             end
40             def letters
41                len = get 0
42                pos = 0
43                while true
44                   pos += 1
45                   yield get(pos)
46                   if pos == len
47                      break 
48                   end
49                end
50             end
51             def addchar ch
52                set 0, (get 0) + 1
53                set (get 0), ch
54             end
55             def print
56                letters {
57                   |char|
58                   putch char
59                }
60             end
61             def concat str
62                str.letters {
63                   |ch|
64                   addchar ch
65                }
66             end
67             def length
68                get 0
69             end
70          end
71          class Integer
72             undef_method :times
73             def times
74                ln = 0
75                while ln < self
76                   ln += 1
77                   yield
78                end
79             end
80          end
81          class Fixnum # BigNum too i guess?
82             undef_method :to_s
83             def to_s
84                n = self
85                pos = 0
86                while n > 0
87                   pos += 1
88                   n /= 10
89                end
90                str = String.new
91                size = pos
92                str.alloc size
93                n = self
94                while n > 0
95                   ch = ?0 + n % 10
96                   str[pos] = ch
97                   n /= 10
98                   pos += -1
99                end
100                str
101             end
102          end
103          def print_num int, just
104             num = int.to_s
105             (just - num.length).times {
106                putch ?\s
107             }
108             num.print
109          end
110          def print_line m, just, num_columns
111             n = 1
112             num_columns.times {
113                print_num n * m, just
114                n += 1
115             }
116             putch ?\n
117          end
118          num_columns = 12
119          num_rows    = 12
120          max = (num_columns * num_rows).to_s
121          just = 1 + max.length
122          n = 1
123          num_rows.times {
124             print_line n, just, num_columns
125             n += 1
126          }