ucisc 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,58 @@
1
+ # A recursive factorial algorithm
2
+ # Inspired by the SubX example near the bottom of this post:
3
+ # http://akkartik.name/post/mu-2019-1
4
+ #
5
+ # The goal is to compare the implementation of the uCISC ISA to x86
6
+ # as well as roughly see how things line up with SubX and look for
7
+ # the coming MuCISC goals
8
+ #
9
+ # To run:
10
+ # $ exe/ucisc examples/factorial.ucisc
11
+ #
12
+ # Type 'break' when you hit the breakpoint, then `load(register(1))`
13
+ # to view the result on the stack
14
+ #
15
+ # More instructions on the compiler and debugger are in the README.md
16
+ # Or use GitHub https://github.com/grokthis/ucisc-ruby#usage
17
+
18
+ # Setup some simple syntax sugar for easy reference to stack and pc
19
+ $stack as 1.mem
20
+ &pc as 0.reg
21
+
22
+ # Simple conditional syntax sugar
23
+ $zero? as 0.eff
24
+
25
+ # Init stack pointer
26
+ copy 0.imm &stack
27
+
28
+ # Call factorial
29
+ # Calling convention is to push args to stack, in order then push return address
30
+ # On return, args and return address are removed, result is in it's place
31
+ $stack[1] <= factorial(4.imm)
32
+
33
+ # halt
34
+ copy &pc &pc
35
+
36
+ factorial: # (n)
37
+ # calculate n - 1, push to stack
38
+ compute 0xB.op/subtract/ 1.imm $stack push
39
+ {
40
+ # factorial(1) = 1, copy 1 to result
41
+ copy $stack 1.imm $stack 3.imm $zero?
42
+ copy &pc break.disp &pc $zero?
43
+
44
+ # compute factorial(n-1)
45
+ $stack <= factorial($stack)
46
+
47
+ # multiply n * factorial(n-1)
48
+ compute 0xC.op $stack 1.imm $stack
49
+ # Copy answer to result
50
+ copy $stack $stack 3.imm
51
+ }
52
+
53
+ # pop n-1 off stack
54
+ copy &stack 2.imm &stack
55
+
56
+ # jump return, pop return address off stack
57
+ copy $stack &pc pop
58
+
@@ -0,0 +1,74 @@
1
+ # Compute Fibonacci numbers
2
+ #
3
+ # By default, computes fib(8) == 21. Change the imm on line 24
4
+ # to compute other numbers. fib(0x18) is the maximum value that
5
+ # will compute correctly. fib(0x19) and up will overflow 16-bits
6
+ # when adding the final result, but will execute an equivalent
7
+ # number of instructions.
8
+ #
9
+ # To run:
10
+ # $ exe/ucisc examples/fib.ucisc
11
+ #
12
+ # Type 'break' when you hit the breakpoint, then `load(register(1))`
13
+ # to view the result on the stack
14
+ #
15
+ # More instructions on the compiler and debugger are in the README.md
16
+ # Or use GitHub https://github.com/grokthis/ucisc-ruby#usage
17
+
18
+ # Setup some simple syntax sugar for easy reference to stack and pc
19
+ $stack as 1.mem
20
+ &pc as 0.reg
21
+
22
+ # Simple conditional syntax sugar
23
+ $zero? as 0.eff
24
+ $not_zero? as 1.eff
25
+ $negative? as 2.eff
26
+
27
+ Entry:
28
+ # Init stack pointer
29
+ copy 0.imm &stack
30
+
31
+ # Functions calls reserve space on the stack (the stack size number in brackets)
32
+ # Then they push the return address, followed by the args. The called function
33
+ # is expected to remove the return address and args from the stack before returning
34
+ $stack[1] <= fib(6.imm)
35
+
36
+ # halt
37
+ copy &pc &pc
38
+
39
+ fib:
40
+ # push n - 1
41
+ compute 0xB.op 1.imm $stack push
42
+ {
43
+ # if negative, n == 0
44
+ copy &pc break.disp &pc $negative?
45
+ # if zero, n == 1
46
+ copy &pc break.disp &pc $zero?
47
+
48
+ # n > 1, n - 1 is on the stack
49
+ # push n - 2
50
+ compute 0xB.op 1.imm $stack push
51
+
52
+ # Recurse for fib(n-1) and fib(n-2)
53
+ $stack[1] <= fib($stack 1.imm)
54
+ $stack[1] <= fib($stack 1.imm)
55
+
56
+ compute 0xA.op $stack 1.imm $stack
57
+
58
+ #copy to return
59
+ copy $stack $stack 6.imm
60
+
61
+ # cleanup stack
62
+ copy &stack 5.imm &stack
63
+
64
+ # Jump return and pop address
65
+ copy $stack &pc pop
66
+ }
67
+
68
+ # n == 1 or n == 0, return n
69
+ # Save result to return
70
+ copy $stack 1.imm $stack 3.imm
71
+ copy &stack 2.imm &stack
72
+
73
+ # Jump return and pop address
74
+ copy $stack &pc pop
@@ -0,0 +1,96 @@
1
+ # A recursive factorial algorithm
2
+ # Inspired by the SubX example near the bottom of this post:
3
+ # http://akkartik.name/post/mu-2019-1
4
+ #
5
+ # The goal is to compare the implementation of the uCISC ISA to x86
6
+ # as well as roughly see how things line up with SubX and look for
7
+ # the coming MuCISC goals
8
+ #
9
+ # To run:
10
+ # $ exe/ucisc examples/factorial.ucisc
11
+ #
12
+ # Type 'break' when you hit the breakpoint, then `load(register(1))`
13
+ # to view the result on the stack
14
+ #
15
+ # More instructions on the compiler and debugger are in the README.md
16
+ # Or use GitHub https://github.com/grokthis/ucisc-ruby#usage
17
+
18
+ # Setup some simple syntax sugar for easy reference to stack and pc
19
+ $stack as 1.mem
20
+ &pc as 0.reg
21
+
22
+ # Simple conditional syntax sugar
23
+ $zero? as 0.eff
24
+ $not_zero? as 1.eff
25
+
26
+ Entry:
27
+ # Init stack pointer
28
+ copy 0.imm &stack
29
+
30
+ # Functions calls reserve space on the stack (the stack size number in brackets)
31
+ # Then they push the return address, followed by the args. The called function
32
+ # is expected to remove the return address and args from the stack before returning
33
+ $stack <= print_string(31.imm, hello.imm)
34
+
35
+ # halt
36
+ copy &pc &pc
37
+
38
+ hello:
39
+
40
+ # "\nHello, world! uCISC is here!\n\n" in hex
41
+ % 0A48 656C 6C6f 2C20 776F 726C 6421 2075 4349 5343 2069 7320 6865 7265 210A 0A00
42
+
43
+ term_device:
44
+ % 0100
45
+
46
+ print_string: # (len, *string)
47
+ # reference term control
48
+ &term = copy &pc term_device.disp 2.reg
49
+ copy $term &term
50
+ # Save to stack for quick restore later
51
+ copy &term $stack push
52
+
53
+ # Bank regions 0x0000 and 0x1000
54
+ copy 3.imm 4.reg
55
+ # reference term page
56
+ compute 0x8.op/zero LSB/ $term 1.imm &term
57
+
58
+ # Bank region 0x1000
59
+ copy 2.imm 4.reg
60
+
61
+ &str = copy $stack 1.imm 3.reg
62
+ # Move length to top of stack
63
+ copy $stack 2.imm $stack push
64
+
65
+ # Len is in bytes, add 1 and divide by 2 to get word len
66
+ compute 0xA.op/add/ 1.imm $stack
67
+ compute 0x6.op/shift >>/ 1.imm $stack
68
+
69
+ # Loop over string, copy to $term
70
+ {
71
+ copy &pc break.disp &pc $zero?
72
+
73
+ {
74
+ copy $str $term
75
+ compute 0xA.op/add/ 1.imm &str
76
+ compute 0xA.op/add/ 1.imm &term
77
+
78
+ compute 0xB.op/subtract/ 1.imm $stack
79
+
80
+ copy &pc loop.disp &pc $not_zero?
81
+ }
82
+ }
83
+
84
+ # restore terminal control pointer
85
+ copy $stack 1.imm &term
86
+ # Bank regions 0x0000 and 0x1000
87
+ copy 3.imm 4.reg
88
+ # write length to terminal control
89
+ copy $stack 3.imm $term 5.imm
90
+ # Unbank all regions
91
+ copy 0.imm 4.reg
92
+
93
+ copy &stack 4.imm &stack
94
+
95
+ # Jump return
96
+ copy $stack &pc pop
@@ -0,0 +1,543 @@
1
+ # Draws an image on the screen at 16, 16 (from the top left)
2
+ # Basic algorithm:
3
+ # *Setup*
4
+ # 1. The image data is part of the compiled output, but it
5
+ # must be paged in. Processors only get the first page
6
+ # of a task by default, so programs need to load themselves
7
+ # into local memory first.
8
+ # 2. Paint the image
9
+ #
10
+ # *Painting*
11
+ # For each line in the image:
12
+ # 1. Calculate page offset and count for a image raster line
13
+ # 2. Page in the relevant pages from main memory. Note, this
14
+ # isn't strictly necessary for this example as no other
15
+ # code is drawing to the screen, but it's a moral victory.
16
+ # 3. Copy the memory from the image data region to the proper
17
+ # location in the paged memory.
18
+ # 4. Page the memory back to main memory in the proper location.
19
+ # Since the video memory is mapped to the main memory at a
20
+ # specific location, this causes the line to draw immediately.
21
+ #
22
+ # The program halts when done and the CPU will idle.
23
+ #
24
+ # Notes:
25
+ # * Double buffering is not implemented and the necessary hardware
26
+ # is not emulated. So, the screen will "tear" if you don't draw
27
+ # fast enough.
28
+ # * In practice, the CPU can definitely outrun the paging mechanisms.
29
+ # I got some nice partial images when I turned off access blocking
30
+ # to pages that were in the process of paging.
31
+ # * This page in/page out mechanism kills at least half your available
32
+ # performance. It would be better to load multiple lines worth of
33
+ # pages at once, draw on them and page them out. That's a harder
34
+ # algorithm but in theory could preserve most of your performance.
35
+ # This is just a proof of concept so I didn't do that.
36
+ #
37
+ # Conventions:
38
+ #
39
+ # I put psuedo code in the comments for each instruction. Some notes
40
+ # about reading them and other things to know:
41
+ #
42
+ # * `var name = value` - var is created on the stack
43
+ #
44
+ # * Registers are generally treated as pointers
45
+ #
46
+ # * I tried to use C pointer semantics for comments. It's not perfect
47
+ # because some of the dereferencing is a bit different here and it's not
48
+ # checked by a compiler or running code so take them with a grain of salt.
49
+ #
50
+ # * The one exception is occaisionally they get loaded with an increment
51
+ # value. Sometimes you just need to add one real fast.
52
+ #
53
+ # * You can generally easily count stack offsets by counting 1.push args
54
+ #
55
+ # * Don't forget to add offsets for any vars returned by functions on
56
+ # the stack. I commented function return values for easy reference.
57
+ #
58
+ # * r1 is the stack, don't use it for anything else.
59
+ #
60
+ # * r2, r3 are not preserved by function calls, any one can do anything
61
+ # with them. Assume they are garbage after a function call.
62
+ #
63
+ # * One variable needed on every loop iteration is always on the top of
64
+ # the stack for easy access.
65
+ #
66
+ # * I found calculating before the loop to be pretty efficient. A quick
67
+ # subtract will set the zero flag and you can jump over the break easily.
68
+ #
69
+ # * The order is heavily influenced by the limits of function call
70
+ # immediate values. Notice the _page hack right off the bat.
71
+ #
72
+ # * I'll be updating function calls to handle this more gracefully.
73
+ #
74
+ # * `calculate_page_offset` uses 32-bit math. Check it out.
75
+ #
76
+ # To run:
77
+ # $ exe/ucisc examples/image.ucisc
78
+ #
79
+ # Then: view the image. It works!!
80
+ #
81
+ # Instructions on the compiler and debugger are in the README.md
82
+ # Or use GitHub https://github.com/grokthis/ucisc-ruby#usage
83
+
84
+ Entry:
85
+ # Initialize the stack register to 0x0000, decrement on push will change to 0xFFFF
86
+ 0/load 0xFFFF to stack pointer/ 4.val 0.imm 1.reg
87
+
88
+ # Page in program data. The first page comes with the task, but
89
+ # we must page the rest in ourselves
90
+ # fn: page(direction:int, main_page:int, local_page:int, count:int)
91
+ (1.mem _page 4.val 1.imm, 4.val 1.imm, 4.val 1.imm, 4.val C.imm)
92
+
93
+ # fn: paint_image(image:*Image, x:int, y:int, screen:*Screen)
94
+ # paint_image(&image, 16, 16, &screen) - paint image at 16, 16 from top left
95
+ (1.mem paint_image 4.val image.imm, 4.val 10.imm, 4.val 10.imm, 4.val screen.imm)
96
+
97
+ 0/halt/ 0.reg/pc/ 0.reg/pc/
98
+
99
+ # Screen:struct
100
+ # page0: int
101
+ # width:int
102
+ # height:int
103
+ # bytes_per_pixel:int
104
+ screen:
105
+ % 0011 # page 16 is config, page 17 is first screen data page
106
+ % 0280 # 640
107
+ % 01E0 # 480
108
+ % 0002 # 2-bytes per pixel, bit depth 4 (5 for green)
109
+
110
+ # Image:struct
111
+ # pixels:*int[]
112
+ # width:int
113
+ # height:int
114
+ image:
115
+ % image_data.imm
116
+ % 0040 # width: 64
117
+ % 0030 # height: 48
118
+
119
+ # fn: paint_image(image:*Image, x:int, y:int, screen:*Screen)
120
+ paint_image:
121
+ 0/var image_row = 0/ 4.val 0.imm 1.mem 1.push
122
+ 0/var c_y = y/ 1.mem 2.imm 1.mem 1.push
123
+ 0/var end_y = y/ 1.mem 0.imm 1.mem 1.push
124
+
125
+ 0/r2 = &image/ 1.mem 6.imm 2.reg
126
+ 0/r2 = &image.height/ 2.reg 2.imm 2.reg
127
+ 20A/end_y = end_y + r2/ 2.mem 1.mem
128
+
129
+ { # if end_y > screen.height
130
+ 0/r2 = &screen/ 1.mem 3.imm 2.reg
131
+ 0/r2 = &screen.height/ 2.reg 2.imm 2.reg
132
+ 20D/screen.height - end_y >= 0?/ 1.mem 2.mem 1.sign 7.eff
133
+
134
+ 0/break if positive/ 0.reg break.disp 0.reg 2.eff
135
+ 0/break if zero/ 0.reg break.disp 0.reg 0.eff
136
+
137
+ # Result was negative, end_y > screen.height, cap at screen.height
138
+ 0/end_y = screen.height/ 2.mem 1.mem
139
+ }
140
+
141
+ 0/r2 = &c_y/ 1.reg 1.imm 2.reg
142
+ { # while c_y < end_y
143
+ 20D/end_y - c_y/ 2.mem 1.mem 1.sign 7.eff/don't store/
144
+
145
+ 0/break if zero/ 0.reg break.disp 0.reg 0.eff
146
+
147
+ # fn: paint_line(x:int, y:int, image_row:int, image:*Image, screen:*Screen)
148
+ (1.mem paint_line 1.mem 5.imm, 1.mem 1.imm, 1.mem 2.imm, 1.mem 6.imm, 1.mem 3.imm)
149
+
150
+ 0/r3 = 1/ 4.val 1.imm 3.reg
151
+
152
+ 0/r2 = &image_row/ 1.reg 2.imm 2.reg
153
+ 20A/image_row = image_row + 1/ 3.reg 2.mem
154
+
155
+ 0/r2 = &c_y/ 1.reg 1.imm 2.reg
156
+ 20A/c_y = c_y + 1/ 3.reg 2.mem
157
+
158
+ 0/loop/ 0.reg loop.disp 0.reg
159
+ }
160
+
161
+ 0/pop 3 vars, 4 args/ 1.reg 7.imm 1.reg
162
+ 200/pop and return/ 1.mem 0.reg 1.inc 0.sign
163
+
164
+ # Hack... the immediate isn't big enough to call page directly
165
+ # so we do a double jump. Yucky, I have ideas though.
166
+ # TODO: there are better ways of handling this
167
+ _page:
168
+ 0 0.reg page.disp 0.reg
169
+
170
+ # The loop takes 4 instructions per memory address. Not bad.
171
+ # fn: mem_copy(source:int, target:int, len:int)
172
+ mem_copy:
173
+ 0/r2 = &source/ 1.mem 2.imm 2.reg
174
+ 0/r3 = &target/ 1.mem 1.imm 3.reg
175
+ 20A/len as final = target + len/ 3.reg 1.mem
176
+
177
+ {
178
+ 20C/target - final/ 3.reg 1.mem 1.sign 7.eff
179
+ 0/break if zero/ 0.reg break.disp 0.reg 0.eff
180
+
181
+ 200/copy address/ 2.mem 3.mem 1.inc 0.sign
182
+ 0/loop/ 0.reg loop.disp 0.reg
183
+ }
184
+ #200/debug breakpoint/ 0.reg 0.reg
185
+ 0/pop 3 vars off stack/ 1.reg 3.imm 1.reg
186
+ 200/pop and return/ 1.mem 0.reg 1.inc 0.sign
187
+
188
+ # fn: paint_line(x:int, y:int, image_row:int, image:*Image, screen:*Screen)
189
+ paint_line:
190
+ # 1. figure out which pages to page in
191
+ 0/r2 = &image/ 1.mem 1.imm 2.reg
192
+ # page_offset:int, page_count:int, word_offset:int <-
193
+ # calculate_page_offset(x, y, image.width, screen:*Screen)
194
+ (1.mem calculate_page_offset 1.mem 4.imm, 1.mem 3.imm, 2.mem 1.imm, 1.mem 0.imm)
195
+
196
+ # Calculate main page number, based on offset
197
+ 0/r2 = screen/ 1.mem 3.imm 2.reg
198
+ 0/var main_page = screen.page0/ 2.mem 0.imm 1.mem 1.push
199
+ 0/r2 = &page_offset/ 1.reg 3.imm 2.reg
200
+ 20A/main_page = main_page + page_offset/ 2.mem 1.mem
201
+
202
+ # 2. Page in the appropriate pages
203
+ # page(direction:int, main_page:int, local_page:int, count:int)
204
+ (1.mem page 4.val 1.imm, 1.mem 0.imm, 4.val 10.imm, 1.mem 2.imm)
205
+
206
+ # 3. Copy the image line in the right place
207
+ # Calculate line offset in image.pixels
208
+ 0/r2 = &image/ 1.mem 5.imm 2.reg
209
+ 0/var width = image.width/ 2.mem 1.imm 1.mem 1.push
210
+ 0/var source = image.width/ 2.mem 1.imm 1.mem 1.push
211
+ 0/r3 = &image_row/ 1.reg 8.imm 3.reg
212
+ 20F/source = image.width * image_row/ 3.mem 1.mem
213
+ 20A/source = source + image.pixels/ 2.mem 1.mem
214
+
215
+ #200/debug breakpoint/ 0.reg 0.reg
216
+ # Calculate local page location
217
+ 0/var target = local_page/ 4.val 10.imm 1.mem 1.push
218
+ 212/convert target to address/ 1.mem 1.mem
219
+ 0/r2 = &word_offset/ 1.reg 4.imm 2.reg
220
+ 20A/target = target + word_offset/ 2.mem 1.mem
221
+
222
+ # mem_copy(source, target, width)
223
+ (1.mem mem_copy 1.mem 1.imm, 1.mem 0.imm, 1.mem 2.imm)
224
+
225
+ # 4. page them out
226
+ # page(direction:int, main_page:int, local_page:int, count:int)
227
+ (1.mem page 4.val 0.imm, 1.mem 3.imm, 4.val 10.imm, 1.mem 5.imm)
228
+
229
+ 0/pop 12 vars off stack/ 1.reg C.imm 1.reg
230
+ 200/pop and return/ 1.mem 0.reg 1.inc 0.sign
231
+
232
+ # fn: page(direction:int, main_page:int, local_page:int, count:int)
233
+ # Page memory to/from main memory. If direction == 0, page out, else page in.
234
+ # Pages each page in sequence starting at the given local and main page
235
+ # indexes. The total number of page operations is count.
236
+ page:
237
+ 0/var end_page = count/ 1.mem 1.mem 1.push
238
+ 0/r3 = &local_page/ 1.reg 2.imm 3.reg
239
+ 0/r2 = &main_page/ 1.reg 3.imm 2.reg
240
+ 20A/end_page = count + local_page/ 3.mem 1.mem
241
+
242
+ {
243
+ 20C/end_page - local_page == 0?/ 3.mem 1.mem 1.sign 7.eff
244
+ 0/break if zero/ 0.reg break.disp 0.reg 0.eff
245
+
246
+ { # if direction != 0
247
+ 0/var dir = direction/ 1.mem 4.imm 1.mem 1.push
248
+ 20A/direction + direction == 0/ 1.mem 1.mem 1.sign 7.eff
249
+ 0/break if 0/ 0.reg break.disp 0.reg 0.eff
250
+
251
+ # TODO: work on if/else flow, I could save an instruction if
252
+ # I used direct labels instead of break logic
253
+ 6/page in/ 2.mem 3.mem 1.in 0.lock
254
+ }
255
+ { # else
256
+ 0/break if not 0/ 0.reg break.disp 0.reg 1.eff
257
+
258
+ 6/page out/ 2.mem 3.mem 0.out 0.lock
259
+ }
260
+
261
+ 0/direction as inc = 1/ 4.val 1.imm 1.mem
262
+ 20A/main_page += 1/ 1.mem 2.mem
263
+ 20A/local_page += 1/ 1.mem 3.mem
264
+ 0/pop inc/ 1.reg 1.imm 1.reg
265
+
266
+ 0/loop/ 0.reg loop.disp 0.reg
267
+ }
268
+
269
+ 0/pop 5 variables/ 1.reg 5.imm 1.reg
270
+ 200/pop and return/ 1.mem 0.reg 1.inc 0.sign
271
+
272
+ # This works, but feels sub-optimal. I can probably do better.
273
+ # fn: page_offset:int, page_count:int, word_offset:int <-
274
+ # calculate_page_offset(x:int, y:int, length:int, screen:*Screen)
275
+ calculate_page_offset:
276
+ # calculate word offset from start
277
+ # woffset can be up to screen_w * screen_h (307,200 for 640x480)
278
+ # we need to use 2 word values (32-bit) for woffset
279
+ 0/r2 = &screen/ 1.mem 0.imm 2.reg
280
+ 0/var screen_w32 MSW = 0/ 4.val 0.imm 1.mem 1.push
281
+ 0/var screen_w32 LSW = screen_w/ 2.mem 1.imm 1.mem 1.push
282
+
283
+ 0/var woffset MSW = 0/ 4.val 0.imm 1.mem 1.push
284
+ 0/var woffset LSW = y/ 1.mem 5.imm 1.mem 1.push
285
+
286
+ 0/r2 = &screen_w/ 2.reg 1.imm 2.reg
287
+ 20E/woffset:LSW = woffset * screen_w/ 2.mem 1.mem 1.inc 0.sign
288
+ 20E/woffset:MSW = woffset * screen_w/ 2.mem 1.mem 1.inc 1.sign # 1.sign restores sp, r2
289
+
290
+ 0/var x_32 MSW = 0/ 4.val 0.imm 1.mem 1.push
291
+ 0/var x_32 LSW = x/ 1.mem 8.imm 1.mem 1.push
292
+
293
+ 0/r2 = &woffset/ 1.reg 2.imm 2.reg
294
+ 20A/woffset:LSW = woffset + x/ 1.mem 2.mem 1.inc 0.sign
295
+ 20A/woffset:MSW = woffset + x/ 1.mem 2.mem 1.inc 1.sign # 1.sign restores sp, r2
296
+ # woffset is word offset of first pixel from screen start
297
+
298
+ # calculate end offset
299
+ 0/var wend_32 MSW = woffset:MSW/ 1.mem 3.imm 1.mem 1.push
300
+ 0/var wend_32 LSW = woffset:LSW/ 1.mem 3.imm 1.mem 1.push
301
+
302
+ 0/var length_32:MSW = 0/ 4.val 0.imm 1.mem 1.push
303
+ 0/var length_32:LSW = length/ 1.mem A.imm 1.mem 1.push
304
+ # remove 1 from the length so we are left pointing
305
+ # directly at the last pixel instead of after it
306
+ 0/r2 = 1/ 4.val 1.imm 2.reg
307
+ 20C/length_32:LSW = length_32:LSW - 1/ 2.reg 1.mem
308
+
309
+ 0/r2 = &wend_32/ 1.reg 2.imm 2.reg
310
+ 20A/wend_32:LSW = wend_32 + length_32/ 1.mem 2.mem 1.inc 0.sign
311
+ 20A/wend_32:MSW = wend_32 + length_32/ 1.mem 2.mem 1.inc 1.sign # 1.sign restores sp, r2
312
+ # wend is word offset of last pixel from screen start
313
+
314
+ # Divide wend by 256 to get end page offset
315
+ # result will be < 16-bit up to 4k resolution @ high color, that's good for now
316
+ 0/r2 = &wend_32:MSW/ 1.reg 3.imm 2.reg
317
+ 0/r3 = &wend_32:LSW/ 1.reg 2.imm 3.reg
318
+ 213/wend_32:LSW = wend_32:LSW >> 8/ 3.mem 3.mem
319
+ 218/wend_32:MSW LSB into wend_32:LSW/ 2.mem 3.mem
320
+
321
+ 0/var poffset_32 MSW = woffset:MSW/ 1.mem 7.imm 1.mem 1.push
322
+ 0/var poffset_32 LSW = woffset:LSW/ 1.mem 7.imm 1.mem 1.push
323
+
324
+ # Divide woffset by 256 to get start page offset
325
+ 0/r2 = &poffset_32:MSB/ 1.mem 7.imm 2.reg
326
+ 213/poffset_32:LSW = poffset_32:LSW >> 8/ 1.mem 1.mem
327
+ 218/poffset_32:MSW LSB into poffset_32:LSW/ 2.mem 1.mem
328
+
329
+ 0/var page_count = (int)wend_32/ 1.mem 4.imm 1.mem 1.push
330
+ 0/r2 = &(int)poffset_32/ 1.reg 1.imm 2.reg
331
+ 20C/page_count = page_count - poffset/ 2.mem 1.mem
332
+ # Page count to transfer is actually 1 more than the page delta
333
+ 0/r2 = 1/ 4.val 1.imm 2.reg
334
+ 20A/page_count = page_count + 1/ 2.reg 1.mem
335
+
336
+ 0/var word_offset = (int)woffset_32/ 1.mem 9.imm 1.mem 1.push
337
+ 215/word_offset = word_offset & 0x00FF/ 1.mem 1.mem
338
+
339
+ # Done calculating results, need to pop everything off the stack, return results
340
+ 0/r3 = &return/ 1.mem 12.imm 3.reg
341
+ 0/r2 = pop 19 words (inc &return)/ 1.reg 13.imm 2.reg
342
+ 0/push (int)poffset/ 1.mem 2.imm 2.mem 1.push
343
+ 0/push page_count/ 1.mem 1.imm 2.mem 1.push
344
+ 0/push word_offset/ 1.mem 0.imm 2.mem 1.push
345
+
346
+ 0/replace sp with 2sp/ 2.reg 1.reg
347
+ 0/return/ 3.reg 0.reg
348
+
349
+ # 64x48 pixel image
350
+ image_data:
351
+
352
+ % 00C8 00C8 00C8 00C8 00C8 00C8 00C8 00C8 00C8 00C8 00C8 00C8 00C8 00C8 00C8 00C8
353
+ % 00C9 00C9 00C8 00C8 00C8 00C8 00C8 00C8 00C9 00E9 00E9 00E9 00E9 00E9 00EA 00EA
354
+ % 00EA 00EA 00EA 00EA 00EA 00EA 00EA 00EA 00EA 00EA 00E9 00EA 00E9 00E9 00E9 00E9
355
+ % 00C9 00E9 00E9 00E9 00E9 00E9 00C9 00E9 00E9 00E9 00E9 00C9 00C9 00C9 00C9 00C9
356
+ % 00C8 00C8 00C8 00C8 00E8 00E8 00E8 00E9 00E9 00E9 00E9 00E9 00E9 00E9 00E9 00E9
357
+ % 00E9 00E9 00C9 00C9 00E9 00E9 00E9 00E9 00E9 00EA 00EA 00EA 00EA 010A 010A 010A
358
+ % 010A 010A 010A 010A 010A 010B 010A 010A 010A 010A 010A 00EA 00EA 00EA 00EA 00EA
359
+ % 00EA 00EA 00EA 00EA 00EA 00EA 00EA 00EA 00EA 00E9 00E9 00E9 00E9 00E9 00E9 00E9
360
+ % 00C8 00E8 00E8 00E8 00E8 00E9 00E9 00E9 00E9 00E9 0109 0109 0109 00E9 00E9 00E9
361
+ % 00E9 00E9 00E9 00E9 00E9 00E9 00E9 00EA 010A 010A 010A 010A 010A 010A 010B 012B
362
+ % 010B 012B 012B 012B 012B 012B 012B 012B 012B 012B 012B 010B 010B 010A 010A 010A
363
+ % 010A 010A 010A 010A 010A 010A 010A 010A 010A 010A 010A 010A 00E9 00E9 00E9 00E9
364
+ % 00E8 00E8 00E9 00E9 0109 0109 0109 0109 0109 0109 0109 0109 0109 0109 0109 0109
365
+ % 0109 0109 0109 010A 010A 010A 010A 010A 010A 012A 012A 012A 012B 012B 012B 012B
366
+ % 012B 012B 014B 014B 014B 014B 014B 012B 012B 012B 012B 012B 012B 012B 012B 012B
367
+ % 012B 012B 012B 012A 012A 012A 012A 012A 012A 012A 010A 010A 010A 010A 010A 0109
368
+ % 0108 0109 0109 0109 0109 0109 0109 0109 0109 0129 0129 0129 0129 0129 0109 0109
369
+ % 012A 012A 012A 012A 012A 012A 012A 012A 012A 012B 012B 014B 014B 014B 014B 014B
370
+ % 014C 014C 014C 014C 014C 014C 014C 014C 014C 014C 014B 014B 014B 014B 014B 014B
371
+ % 014B 014B 012B 012B 012B 012B 014B 014B 012B 012A 012A 012A 012A 012A 012A 012A
372
+ % 0109 0109 0109 0109 0109 0129 0129 0129 0129 0129 0129 012A 012A 012A 012A 012A
373
+ % 012A 012A 012A 012A 094A 014A 094A 094B 094B 094B 094B 096B 096B 096C 096C 096C
374
+ % 096C 096C 096C 096C 096C 096C 096C 096C 096C 096C 096C 096C 096C 096B 096B 096B
375
+ % 014B 094B 094B 094B 094B 094B 094B 094B 094B 094B 094B 014B 014A 014A 012A 012A
376
+ % 0929 0929 0929 0929 0929 0929 0929 0929 0949 094A 094A 094A 094A 094A 094A 094A
377
+ % 094A 094A 094A 094A 094A 096A 096B 096B 096B 096B 096B 096B 098C 098C 098C 098C
378
+ % 098C 098D 098D 098C 098D 098D 098D 098C 098C 098C 098C 098C 098C 098C 098C 096C
379
+ % 096B 096B 096B 096B 096B 096B 096B 096B 096B 096B 094B 094B 094A 094B 094A 094A
380
+ % 0949 0929 0949 0949 0949 094A 094A 094A 094A 094A 094A 096A 094A 096A 096A 096A
381
+ % 096A 096A 096A 096A 096B 096B 096B 098B 098B 098B 098C 098C 09AC 09AC 09AC 09AC
382
+ % 09AD 09AD 09AD 09AD 09AD 09AD 09AD 09AD 09AD 09AD 09AD 09AC 09AC 09AC 098C 098C
383
+ % 098C 098C 098B 098C 098C 098B 098B 098B 096B 096B 096B 096B 096B 096B 096B 096B
384
+ % 0949 0949 0949 094A 094A 096A 096A 096A 096A 096A 096A 096A 096A 096A 096A 096A
385
+ % 096A 098A 098A 098B 098B 098B 098B 09AB 09AB 09AC 09AC 09AC 09AC 09CD 11CD 11CD
386
+ % 11CD 11CD 11CD 11CD 11ED 11ED 11ED 11ED 11ED 11CD 11CD 11CD 11CD 11CD 09CD 11AC
387
+ % 09AC 09AC 09AC 09AC 09AC 09AC 09AC 098B 098B 098B 098B 098B 098B 098B 098B 096B
388
+ % 1169 0969 096A 116A 116A 116A 116A 118A 118A 118A 118A 118A 118A 118A 118A 118A
389
+ % 118A 118B 118B 11AB 11AB 11AB 11AB 11CC 11CC 11CC 11CC 11CD 11ED 11ED 11ED 11ED
390
+ % 11ED 11ED 11ED 11ED 11ED 11EE 120E 120E 11EE 11ED 11ED 11ED 11ED 11ED 11CD 11CD
391
+ % 11CC 11CC 11CC 11CC 11CC 11AC 11AC 11AC 11AC 11AB 118B 118B 118B 118B 118B 118B
392
+ % 1189 118A 118A 118A 118A 118A 118A 118A 11AA 11AA 11AA 11AA 11AA 11AA 11AB 11AB
393
+ % 11AB 11AB 11CB 11CB 11CB 11CB 11CC 11CC 11EC 11EC 11EC 11ED 120D 120D 120D 120D
394
+ % 120D 120D 120E 120E 120E 120E 120E 120E 120E 120E 120E 120D 120D 120D 11ED 11ED
395
+ % 11ED 11EC 11EC 11EC 11CC 11CC 11CC 11CC 11CC 11AB 11AB 11AB 11AB 11AB 118B 118A
396
+ % 1189 1189 1189 1189 11AA 11AA 11AA 11AA 11AA 11AA 19CA 19CA 19CA 19CA 19CA 11CA
397
+ % 19CA 19CA 19CB 19EB 19EB 19EB 19EB 19EB 19EC 1A0C 1A0C 1A0C 1A0D 1A0D 1A2D 1A2D
398
+ % 1A2D 1A2E 1A2E 1A2E 1A2E 1A2E 1A2E 1A2D 1A2D 1A2E 1A0E 1A0D 1A0D 1A0D 1A0D 1A0D
399
+ % 1A0D 1A0D 19EC 19EC 19EC 19EC 19EC 19EC 19CC 19CB 11CB 11CB 11AA 11AA 11AA 118A
400
+ % 1989 1989 19A9 19A9 19AA 21C9 21C9 21E9 29E9 21EA 19CA 19CA 19CA 19CA 21EA 21EA
401
+ % 21EA 19CA 19EA 19EA 19EB 19EB 19EB 1A0B 1A0B 1A0C 1A0C 1A0C 326D 32AE 1A2D 1A2D
402
+ % 1A2D 1A2D 1A2D 1A2D 1A2D 1A2D 1A2D 1A2D 1A2D 1A2D 1A2D 1A2D 1A2D 1A2D 1A2D 1A0C
403
+ % 1A0C 222C 1A0C 1A0C 1A0C 19EC 19EC 19EC 19EB 19CB 19CB 19CB 19CA 19AA 19AA 11AA
404
+ % 1989 1989 1989 1989 1989 21A9 29C9 31E9 31E9 31E9 29C9 21C9 21C9 29E9 29E9 29C9
405
+ % 21C9 21C9 21CA 21CA 21CA 21EA 21EA 21EA 19EB 21EB 21CA 1107 52CC AD76 73F2 3AAE
406
+ % 2A4D 222D 1A0D 222D 222D 1A0D 1A0D 1A0D 1A0D 1A0D 1A0D 1A0C 1A0C 1A0C 1A0C 1A0C
407
+ % 19EC 2A2B 220B 19EC 19EB 19EB 19CB 19CB 19CB 19CA 19AA 19AA 19AA 198A 1989 1989
408
+ % 1168 1168 1968 1968 1968 1968 1988 1988 1988 1989 1989 1989 1989 1989 1989 1989
409
+ % 1989 1989 1989 1989 19A9 19AA 19AA 19AA 19AA 1148 08A5 0084 4A6B 9CD2 A4D3 8451
410
+ % 636E 5B4F 328E 19EC 19EC 19EC 19EC 19EC 19EC 19EC 19EC 19EC 19EC 19EC 19CC 19CC
411
+ % 19CB 19EB 19CB 19CB 19CB 19CB 19AA 19AA 19AA 198A 19AA 19A9 1989 1989 1969 1168
412
+ % 1148 1148 1148 1148 1148 1148 1148 1148 1148 1148 1148 1148 1149 1149 1169 1169
413
+ % 1169 1169 1169 1169 1169 1169 118A 118A 0927 0064 0043 08A5 10E5 5AEC 6B6E 31C8
414
+ % 10C5 3A09 9CF3 5B70 1A0D 11CC 11CC 11CC 19CC 11CC 11CC 11CC 11AC 11AB 11AB 11AB
415
+ % 11AB 11AB 11AB 19AB 11AB 11AB 19AA 118A 118A 116A 1189 1169 1169 1169 1168 1148
416
+ % 0927 0927 0927 0927 0927 0927 0928 0928 0928 0928 0928 1148 1168 1148 1148 1149
417
+ % 0949 0949 0949 1149 1149 0949 0949 08E6 0064 2987 39E9 10E5 10C5 4A8B 6B4D 31A8
418
+ % 0064 0064 424A 8430 8C92 6BB1 222D 11CC 11AB 11AB 118B 118B 096B 096B 096A 116A
419
+ % 116A 116A 096A 096A 116A 118A 118A 116A 1169 0949 0949 0949 0928 0928 0928 0928
420
+ % 0907 0907 0907 0907 0907 0907 0907 0907 1147 1126 1126 10E6 10E5 08C5 2188 1947
421
+ % 21A9 1989 1148 1128 1989 1948 08C6 08A5 0884 4A6A 738E 10E6 1926 31A8 3A09 10E6
422
+ % 08A5 0043 10E5 29A8 8410 C5F6 A514 73F1 3AAE 220C 11AB 11AB 118B 096A 096A 116A
423
+ % 118A 096A 118A 19CB 096A 0949 0949 0949 1169 1989 0949 0928 0928 0928 0928 0907
424
+ % 1127 0907 0907 0907 0907 0907 0907 08C6 08A4 0863 08A4 0063 0043 0884 1905 0883
425
+ % 5ACB 62EB 2146 08A4 1905 4249 2146 39E9 2146 31C8 630C 10E5 0884 2987 1906 31C8
426
+ % 4A8B 1106 0084 0064 52AC C5D5 CE16 B595 9492 6B6F 5B2E 7C11 5B2E 42AD 324C 21EB
427
+ % 42AC 322B 4AAC 9CD2 6B8F 428C 322B 3A4B 21C9 424A 2188 21A9 1969 0908 0908 0907
428
+ % 4A48 2167 1926 1926 1126 08E6 08C5 0063 0863 0864 10C5 0064 0064 1905 0884 0043
429
+ % 632C 944F 5AEB 1926 1906 1905 2167 5AEC 424A 5AEC 738E 630C 1926 31C8 1926 31C8
430
+ % 738E 4A8B 1106 0084 5B0C BDB5 CE36 B554 9CB2 8C30 8430 AD13 B554 9471 738E 426B
431
+ % 31EA 2188 8430 BD94 BD74 B553 6B6D 5AEC 4A8B 52AB 52AB 4A8A 52CB 2188 1968 1147
432
+ % 4A28 4208 5248 4207 2966 2987 0883 0042 0063 0864 08A5 0064 29A7 1905 0063 0884
433
+ % 83EE CDD4 B552 6B4C 29A8 08A4 08C5 29A8 39E9 2967 736D 83EF 424A 29A8 3A2A 52CC
434
+ % 52CC 29A8 08A5 1106 424A A4F2 CE16 C5D5 9CB2 8C51 9471 9471 A4F2 73AF 320A 3A2A
435
+ % 2188 29C9 B574 BDB5 9CB2 AD13 A4F2 6B4D 52AB 5AEC 632C 736D 734C 4A69 4229 31C8
436
+ % 39C7 1905 3166 39E7 2146 10C4 0043 0042 0043 0884 10E5 1906 5AEB 2166 0084 08A5
437
+ % 528A B532 CDD4 AD11 6B4D 2988 29A8 31E8 52AB 39E9 3A09 738E 426A 31E9 4A6B 52AB
438
+ % 4A6B 1927 1127 52AB 2167 426A AD33 CDF5 AD13 9471 AD33 A4F2 8410 630D 426B 320A
439
+ % 21A9 6B8E C5D5 CDF5 A4D2 8C30 A4F2 BD73 738D 52AB 4A6A 3A09 528A 5ACB 4A49 39E8
440
+ % 734A 41E7 39C7 5269 10C4 0043 0043 0043 0043 0063 31A8 31C7 5AEB 2146 1106 528A
441
+ % 2146 738D B532 B532 944F 736D 5AEC 4A8B 630C 83CE 3A09 5AEC 4A6A 424A 5AEC 4A8B
442
+ % 2168 1106 52AB 7BAE 4A8B 29A8 634D B553 BD94 9CB1 A4D2 83CF 52AB 31E9 4A8B 4A8C
443
+ % 29E9 AD53 CDF5 C5D5 A4F2 9CB1 83EF A4D1 AD32 6B4D 3A09 31C8 31E8 630B 736C 738C
444
+ % 5A88 3186 2125 31A7 0063 0042 0043 0063 10C5 2987 39E8 10E5 31C7 10E5 1906 5AEB
445
+ % 2987 3A09 8C0F 944F 8C0E 83EE 8C0F 52CB 4A8B 9450 630C 5AEC 31C9 2188 52AB 2188
446
+ % 08E6 31C9 840F 7BEF 738E 3A4A 4A8B A4F2 AD33 8C30 8C51 29A8 08A4 08A5 1926 73CF
447
+ % 73AF 9CB2 BDB4 BDB4 A4F2 9CB1 7BAE 7BAE B552 A4B0 7BCE 4249 2187 31C8 4A49 83ED
448
+ % 5248 2966 18E4 10C4 0043 0043 0043 10A4 39E8 4A49 39C8 1905 1905 08A4 10E5 2967
449
+ % 08C5 2167 6B4C 736D 8C0E 6B4C 7BAD 62EB 31E9 7BAE 630C 4A6A 2167 2167 2147 00A5
450
+ % 2167 4A6B 9491 8430 83EF 6B4D 52CB 6B4D A4F2 8410 94B3 5B0D 52AC 3A2A 31C9 5B2D
451
+ % A4F3 8C51 8C50 9CB1 B573 83EF 6B2C 52AB 7B8D 8C0E 7B8D 738D 52AB 4A8A 3A09 5AEB
452
+ % 5A68 39A6 10A3 10A4 0884 0863 0863 2966 31A7 39E8 31C7 2166 2987 1905 1906 10C5
453
+ % 0064 2167 62EB 5ACB 6B2C 5AEB 5AAA 6B2C 4A6A 6B4C 738D 5AEB 630C 632C 2987 2147
454
+ % 1106 4A8A 9CD2 840F 8C50 7BCE 6B4C 2987 29A7 29A8 C5F8 CE59 CE39 CE59 9CB3 9492
455
+ % 8C31 7BCF 632D 73AF A4F2 9C91 7BAE 4249 4229 5ACA 4229 94B2 B575 9491 9450 83EF
456
+ % 3165 3186 39C7 5AAA 62EB 4A28 2105 2946 4A28 5269 39C7 2987 31C7 528A 39E8 4A69
457
+ % 2987 528A 5289 31A7 4A49 5289 6B2B 7BAD 4A49 39C8 5ACA 738D 630B 5ACB 83EF 3A09
458
+ % 08C5 6B4D AD33 842F AD33 9CB1 8C0F 39E8 0043 29A8 CE38 E6DB DEDA D679 BDB6 B596
459
+ % 9CB3 9492 83EF 6B4D 840F 7BAE 840F 630C 4A6A 528A 3A08 AD54 C5D6 AD34 A4F2 9450
460
+ % 31A6 39C7 62CA 62EB 62EB 62EB 4A69 31C7 5249 5AA9 62CA 4A49 528A 5ACA 5AAA 5269
461
+ % 5AAA 4208 2966 3186 62EA 39E7 734B 6B0B 31A7 2125 4208 39E8 1926 1926 7BAD 29A7
462
+ % 1926 6B4C 840F 8C0F 83EE 9CB0 5AAA 0884 0063 1905 94B2 DEBA DEBA CE38 BDD7 C5F7
463
+ % B596 A514 9471 5ACB 83EF 5ACB 4208 4228 31A7 2125 29A7 AD33 C5D5 B553 B553 A4F2
464
+ % 4A48 3186 2966 31A6 1904 2125 2945 41E8 62CA 5AAA 5AAA 31A7 31A7 2966 39C7 4A48
465
+ % 31C7 18E4 2125 18E4 4207 3186 2105 1904 2986 5269 6B2C 528A 2987 29A7 5ACA 2146
466
+ % 18E4 31C7 52CB 8C0E 41E7 31A7 10A4 0043 08A4 0883 52CB BDD6 CE58 BDB6 AD54 BDB5
467
+ % B575 B555 AD13 630C 7BAE 7B8D 4A48 10A3 0883 2145 2125 4A69 A4D1 B553 B533 9CB1
468
+ % 8BEE 7B8D 41E7 2104 18E4 1904 18C4 31A7 4208 2986 31A7 39E7 1904 0883 3186 3165
469
+ % 10A3 0863 18C3 10A3 18C3 10A3 0883 2945 3186 39E7 4A48 4A49 39C7 4A48 4A49 2125
470
+ % 2124 3186 2145 4228 18E5 0043 0042 0043 1905 08A4 632D 83EF 8C50 AD34 A513 9471
471
+ % A4F3 A513 AD13 5AEC 6B2C A4D1 5269 08A4 08A4 39E8 2986 0883 39C7 8C2F B532 A4D1
472
+ % 8C0E 8BEE 7B8C 39C7 2965 2124 39C7 4A48 5AA9 4208 2965 2965 10A3 1083 41E7 3165
473
+ % 10A3 0842 0862 1082 10A3 0882 0862 18C3 10C3 10A3 18C3 2104 18C3 2104 10A3 0862
474
+ % 0882 10A3 0883 0042 0042 0042 0042 0042 0863 0042 3A09 8C30 73AE 738D 8C30 7BAE
475
+ % 738D 9CD2 9CB1 736D 41E7 8C0F 5ACB 10C4 10E4 4228 1905 0862 0883 4208 630B 942F
476
+ % 732B 7B6C 6B0A 4A27 18C3 18E4 39C7 18C3 20E4 18A3 0862 0862 0842 18C3 2104 20E3
477
+ % 10A2 0841 0862 0862 0862 0862 0862 1082 10A3 18C3 18C3 18C3 1082 0862 2125 18C4
478
+ % 0042 0042 0042 0042 0022 0042 0042 0042 0042 0863 31A8 9CB2 9491 83EF 738D 738D
479
+ % 5269 62EB 6B4C 6B2C 39C7 4208 41E8 08A3 10E4 10A3 0863 0883 0883 3186 3186 5ACA
480
+ % 62C9 5268 5A89 62EA 39C6 10A2 2104 1082 1082 0841 0041 0041 0041 1082 1082 0861
481
+ % 0862 0842 1082 10A2 18C3 2103 2103 18C3 1082 0862 0862 0862 1082 18E4 62EB 2105
482
+ % 0022 0042 0022 0022 0862 0883 2125 2125 1905 39C7 738D AD13 9CD2 840F 6B4D 7BAE
483
+ % 7BAD 62EB 4207 4208 39E7 2966 18E4 08A3 0862 0042 0862 0882 10A3 41E7 2965 18E4
484
+ % 41E6 41C6 41E6 5A88 4207 2965 1082 1081 1081 0041 0861 0861 0841 0861 1082 0041
485
+ % 0841 0041 0861 10A2 18C3 18C3 1082 0841 0021 0841 0841 0861 0862 10C3 2104 20E4
486
+ % 0021 0862 18E4 3186 4208 5ACA 5289 4229 2125 4A48 5AAA 6B2B 736C 62EB 5AAA 39C7
487
+ % 5AAA 62EB 736C 736C 4A28 3186 1904 0883 0862 0841 0862 0862 18E4 5A89 62EA 2104
488
+ % 0861 18C2 2103 5268 6B0A 734B 4A27 1082 0861 0021 0841 0841 0841 0841 0861 0841
489
+ % 0861 0861 0861 1082 0862 0841 0041 0841 0841 0041 0021 0841 0862 0862 0862 18E3
490
+ % 10A3 39A6 4A28 62EA 5269 7B8D 7B8D 6B2C 3186 31A7 2986 3186 39C7 39E7 5269 4A28
491
+ % 2145 31A7 39A6 39C6 62CA 4A48 2146 0862 0041 0862 1904 10A3 2965 5248 83AD 5269
492
+ % 18E3 0020 0841 3185 4A07 6AC9 5A68 10A2 0041 0020 0021 0041 0841 0841 0021 0861
493
+ % 1081 1081 1081 1082 0861 0841 0841 0841 0021 0020 0020 0021 0841 1082 10A2 0882
494
+ % 10C3 2924 2945 4207 2965 39E7 5269 528A 4208 4228 3186 18C3 2104 2124 2124 31A6
495
+ % 2966 39E8 2945 1083 5268 8C0E 6B4C 1082 0020 0861 18C3 2104 2944 4A48 62EA 83AC
496
+ % 5A88 10A2 0041 10C3 18C3 2103 18A2 1082 0882 0861 0041 0021 0021 0021 0021 0841
497
+ % 0841 0861 1081 0841 0841 0841 0841 0040 0020 0020 0020 0020 0841 18E3 4A28 31A6
498
+ % 10A2 1082 0882 10A2 18E3 2104 2104 39C7 4A69 2945 2104 10A3 18E3 2124 0862 0842
499
+ % 18E4 2966 10C3 4208 5289 6B2C 7BAE 3186 0021 18C3 41E6 39A5 18C2 3165 39C6 5268
500
+ % 3164 1082 0041 18E3 1904 18E3 1082 0861 0882 10A3 10A3 0862 0862 0041 0021 0020
501
+ % 0020 0020 0021 0020 0020 0020 0020 0020 0020 0020 0020 0020 0862 10C3 18E3 62EB
502
+ % 39A6 4208 39C7 2945 18E3 1082 2944 7BAD 9C90 736C 4A28 2124 0882 1082 0021 0842
503
+ % 2145 31A6 18C3 4A28 6B2C 5268 5AA9 4A49 10C3 3165 5268 5268 3985 2103 2944 2944
504
+ % 10A2 0041 0020 0861 10A3 10C3 0841 0841 0882 10A3 18E4 0862 0041 0021 0020 0020
505
+ % 0020 0020 0020 0020 0020 0020 0020 0041 0862 0882 0861 0882 2104 2965 2124 2965
506
+ % 4228 52AA 632C 4228 4207 5268 734C 83CD 83CE 734C 62CA 3186 0041 0861 0042 0882
507
+ % 31A6 4207 2104 2104 630C 62EA 5AA9 4229 39E8 31A7 39C6 39A6 39A6 2124 2103 0882
508
+ % 2965 2965 18E3 0841 0841 0862 0861 0841 10A3 1904 18E3 0861 0020 0020 0020 0020
509
+ % 0020 0020 0020 0020 0020 0020 0020 0862 18E4 18E4 10A3 10C3 2145 2986 2986 2986
510
+ % 39C7 5289 5269 18E3 2945 736C 83EE 7BAD 4A6A 31C8 31E9 31C8 2966 2146 2167 18E4
511
+ % 2124 3165 2945 0861 31A7 528A 5AAB 4A49 4A49 4A49 2986 2966 4A49 4A6A 39C7 18E4
512
+ % 2145 4207 31C6 1904 18E4 10C3 0882 0041 0041 0882 0882 0841 0020 0020 0020 0020
513
+ % 0020 0020 0020 0020 0020 0020 0020 0041 0862 0882 0861 0841 0862 2945 39C6 2124
514
+ % 18C3 2124 1082 0841 0841 2944 5268 62A9 2987 29A8 5AEC 630D 632E 52AC 4229 2987
515
+ % 31A6 18E3 0861 10C3 31C7 3A09 4229 4A6A 3A08 2146 1905 2145 4208 5ACB 6B0C 41E8
516
+ % 2965 4A69 5289 4A69 4228 3A08 39C7 18E3 0861 0041 0020 0020 0020 0020 0020 0020
517
+ % 0020 0020 0020 0020 0020 0041 0861 0862 0041 0020 0020 0020 0040 10A2 1082 0841
518
+ % 0021 0841 0020 0020 0020 0040 1082 18E4 1926 3A09 632E 738F 738F 6B6E 52AB 39E8
519
+ % 31C7 2986 10E4 10C4 2125 2987 4208 5AAB 52AA 39C7 2105 18E4 3186 4A28 5269 39C7
520
+ % 4208 4A49 5ACA 736D 62EB 5289 4A48 31E7 29A6 2145 0882 0020 0020 0020 0020 0020
521
+ % 0020 0020 0020 0020 0020 0020 0020 0041 0020 0020 0020 0020 0020 0020 0020 0041
522
+ % 0841 0041 0020 0020 0020 0020 0862 10E5 31C8 52AC 632D 6B4E 630D 5ACB 4A4A 39E8
523
+ % 31C8 29A7 2986 1905 10C4 18E4 3186 4A29 4A49 4A48 31A6 2104 2125 2945 2965 2945
524
+ % 4A48 4A48 630B 738D 734C 62CA 5269 4A48 4207 39E7 2124 0882 0020 0020 0041 0041
525
+ % 0041 0041 0041 0020 0020 0020 0020 0020 0020 0020 0020 0020 0020 0020 0020 0020
526
+ % 0020 0020 0020 0020 0020 0041 0884 2167 52AC 738F 7BF0 6B6F 5AEC 4A6A 31E8 29A7
527
+ % 29A7 31C7 31C7 2986 18E4 10A3 18E4 3186 39E7 39A6 2125 2104 2104 18E3 18C3 10A2
528
+ % 39C6 4207 5268 5289 5289 5268 4227 39E7 39C6 31C6 2124 10A3 0041 0041 0841 0041
529
+ % 0020 0020 0020 0020 0020 0020 0020 0020 0020 0020 0020 0020 0020 0020 0020 0020
530
+ % 0020 0020 0020 0020 08A3 2167 2167 29A8 4AAB 632D 6B8F 738F 632D 5ACC 4229 3A08
531
+ % 3A09 31A7 2145 2125 18C4 1083 1083 18C3 2124 2924 18C3 10A2 18A2 10A2 0841 0020
532
+ % 2144 2944 3185 3185 3185 31A5 3185 2965 2144 18E3 10A2 0862 0020 0020 0020 0020
533
+ % 0020 0020 0020 0020 0020 0020 0020 0020 0020 0020 0020 0020 0020 0020 0020 0020
534
+ % 0861 0862 10E4 1905 2987 424A 52CC 5AEC 5AEC 52AC 52AB 52CB 4A8B 424A 3A08 31C7
535
+ % 31A7 2966 1904 10C3 1083 0862 0862 0862 18C3 18E3 10A2 0841 10A2 18E3 1061 1081
536
+ % 10C2 18E3 2124 2964 2985 2964 2965 41E6 5248 39C6 2103 0040 0020 0020 0020 0020
537
+ % 0020 0020 0020 0020 0020 0020 0020 0020 0020 0020 0020 0020 0020 0020 0041 10A3
538
+ % 2987 31C8 424A 424A 426A 5AEC 5ACC 5AEC 5ACC 528B 4229 3A08 31C7 2986 2966 2966
539
+ % 2105 10C3 0882 0841 0841 0041 0020 0020 0861 10A2 18E3 1082 1082 10A2 1082 1082
540
+ % 18C2 2103 2124 2964 3185 2944 39E6 5268 5AA8 4A47 2964 0841 0020 0020 0020 0020
541
+ % 0020 0020 0020 0020 0020 0020 0020 0020 0020 0020 0040 0020 0020 0841 10C4 1925
542
+ % 2166 39E8 424A 424A 424A 4A6B 52AB 528A 4229 39E8 31C7 2966 2125 1904 2125 2145
543
+ % 10A3 0862 0020 0020 0020 0020 0020 0020 0020 0841 0841 0841 0841 0021 0020 0020