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.
- checksums.yaml +7 -0
- data/.gitignore +14 -0
- data/.travis.yml +6 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +14 -0
- data/Gemfile.lock +52 -0
- data/LICENSE.txt +21 -0
- data/README.md +217 -0
- data/Rakefile +10 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/examples/factorial.ucisc +58 -0
- data/examples/fib.ucisc +74 -0
- data/examples/hello_world.ucisc +96 -0
- data/examples/image.ucisc +543 -0
- data/exe/ucisc +25 -0
- data/lib/micro_cisc.rb +48 -0
- data/lib/micro_cisc/compile/compiler.rb +103 -0
- data/lib/micro_cisc/compile/instruction.rb +310 -0
- data/lib/micro_cisc/compile/label_generator.rb +48 -0
- data/lib/micro_cisc/compile/statement.rb +113 -0
- data/lib/micro_cisc/version.rb +3 -0
- data/lib/micro_cisc/vm/device.rb +140 -0
- data/lib/micro_cisc/vm/empty_device.rb +9 -0
- data/lib/micro_cisc/vm/processor.rb +447 -0
- data/lib/micro_cisc/vm/term_device.rb +35 -0
- data/lib/micro_cisc/vm/video.rb +151 -0
- data/ucisc.gemspec +28 -0
- data/ucisc.vim +54 -0
- metadata +74 -0
@@ -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
|
+
|
data/examples/fib.ucisc
ADDED
@@ -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
|