about summary refs log tree commit diff stats
path: root/opcodes
blob: e222df66b489641fffe4d2d9fe0cf6b970d89293 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
Opcodes currently supported by SubX:
  01: add r32 to rm32 (add)
  03: add rm32 to r32 (add)
  05: add imm32 to EAX (add)
  09: rm32 = bitwise OR of r32 with rm32 (or)
  0b: r32 = bitwise OR of r32 with rm32 (or)
  0d: EAX = bitwise OR of imm32 with EAX (or)
  21: rm32 = bitwise AND of r32 with rm32 (and)
  23: r32 = bitwise AND of r32 with rm32 (and)
  25: EAX = bitwise AND of imm32 with EAX (and)
  29: subtract r32 from rm32 (sub)
  2b: subtract rm32 from r32 (sub)
  2d: subtract imm32 from EAX (sub)
  31: rm32 = bitwise XOR of r32 with rm32 (xor)
  33: r32 = bitwise XOR of r32 with rm32 (xor)
  35: EAX = bitwise XOR of imm32 with EAX (xor)
  39: compare: set SF if rm32 < r32 (cmp)
  3b: compare: set SF if r32 < rm32 (cmp)
  3d: compare: set SF if EAX < imm32 (cmp)
  40: increment EAX (inc)
  41: increment ECX (inc)
  42: increment EDX (inc)
  43: increment EBX (inc)
  44: increment ESP (inc)
  45: increment EBP (inc)
  46: increment ESI (inc)
  47: increment EDI (inc)
  48: decrement EAX (dec)
  49: decrement ECX (dec)
  4a: decrement EDX (dec)
  4b: decrement EBX (dec)
  4c: decrement ESP (dec)
  4d: decrement EBP (dec)
  4e: decrement ESI (dec)
  4f: decrement EDI (dec)
  50: push EAX to stack (push)
  51: push ECX to stack (push)
  52: push EDX to stack (push)
  53: push EBX to stack (push)
  54: push ESP to stack (push)
  55: push EBP to stack (push)
  56: push ESI to stack (push)
  57: push EDI to stack (push)
  58: pop top of stack to EAX (pop)
  59: pop top of stack to ECX (pop)
  5a: pop top of stack to EDX (pop)
  5b: pop top of stack to EBX (pop)
  5c: pop top of stack to ESP (pop)
  5d: pop top of stack to EBP (pop)
  5e: pop top of stack to ESI (pop)
  5f: pop top of stack to EDI (pop)
  68: push imm32 to stack (push)
  72: jump disp8 bytes away if lesser (unsigned), if CF is set (jcc/jb/jnae)
  73: jump disp8 bytes away if greater or equal (unsigned), if CF is unset (jcc/jae/jnb)
  74: jump disp8 bytes away if equal, if ZF is set (jcc/jz/je)
  75: jump disp8 bytes away if not equal, if ZF is not set (jcc/jnz/jne)
  76: jump disp8 bytes away if lesser or equal (unsigned), if ZF is set or CF is set (jcc/jbe/jna)
  77: jump disp8 bytes away if greater (unsigned), if ZF is unset and CF is unset (jcc/ja/jnbe)
  7c: jump disp8 bytes away if lesser (signed), if SF != OF (jcc/jl/jnge)
  7d: jump disp8 bytes away if greater or equal (signed), if SF == OF (jcc/jge/jnl)
  7e: jump disp8 bytes away if lesser or equal (signed), if ZF is set or SF != OF (jcc/jle/jng)
  7f: jump disp8 bytes away if greater (signed), if ZF is unset and SF == OF (jcc/jg/jnle)
  81: combine rm32 with imm32 based on subop (add/sub/and/or/xor/cmp)
  87: swap the contents of r32 and rm32 (xchg)
  88: copy r8 to r8/m8-at-r32
  89: copy r32 to rm32 (mov)
  8a: copy r8/m8-at-r32 to r8
  8b: copy rm32 to r32 (mov)
  8d: copy address in rm32 into r32 (lea)
  8f: pop top of stack to rm32 (pop)
  99: sign-extend EAX into EDX (cdq)
  b8: copy imm32 to EAX (mov)
  b9: copy imm32 to ECX (mov)
  ba: copy imm32 to EDX (mov)
  bb: copy imm32 to EBX (mov)
  bc: copy imm32 to ESP (mov)
  bd: copy imm32 to EBP (mov)
  be: copy imm32 to ESI (mov)
  bf: copy imm32 to EDI (mov)
  c1: shift rm32 by imm8 bits depending on subop (sal/sar/shl/shr)
  c3: return from most recent unfinished call (ret)
  c6: copy imm8 to r8/m8-at-r32 (mov)
  c7: copy imm32 to rm32 (mov)
  cd: software interrupt (int)
  d3: shift rm32 by CL bits depending on subop (sal/sar/shl/shr)
  e8: call disp32 (call)
  e9: jump disp32 bytes away (jmp)
  eb: jump disp8 bytes away (jmp)
  f4: halt (hlt)
  f7: negate/multiply/divide rm32 (with EAX and EDX if necessary) depending on subop (neg/mul/idiv)
  ff: increment/decrement/jump/push/call rm32 based on subop (inc/dec/jmp/push/call)
  0f 82: jump disp32 bytes away if lesser (unsigned), if CF is set (jcc/jb/jnae)
  0f 83: jump disp32 bytes away if greater or equal (unsigned), if CF is unset (jcc/jae/jnb)
  0f 84: jump disp32 bytes away if equal, if ZF is set (jcc/jz/je)
  0f 85: jump disp32 bytes away if not equal, if ZF is not set (jcc/jnz/jne)
  0f 86: jump disp32 bytes away if lesser or equal (unsigned), if ZF is set or CF is set (jcc/jbe/jna)
  0f 87: jump disp32 bytes away if greater (unsigned), if ZF is unset and CF is unset (jcc/ja/jnbe)
  0f 8c: jump disp32 bytes away if lesser (signed), if SF != OF (jcc/jl/jnge)
  0f 8d: jump disp32 bytes away if greater or equal (signed), if SF == OF (jcc/jge/jnl)
  0f 8e: jump disp32 bytes away if lesser or equal (signed), if ZF is set or SF != OF (jcc/jle/jng)
  0f 8f: jump disp32 bytes away if greater (signed), if ZF is unset and SF == OF (jcc/jg/jnle)
  0f af: multiply rm32 into r32 (imul)
Run `subx help instructions` for details on words like 'r32' and 'disp8'.
For complete details on these instructions, consult the IA-32 manual (volume 2).
There's various versions of it online, such as https://c9x.me/x86.
The mnemonics in brackets will help you locate each instruction.
aremetal/411string.mu.html?h=hlt&id=535fe9ac96dba0950efd1bfe6788801f6197971f'>535fe9ac ^
ec32c11d ^
3350c34a ^
535fe9ac ^
ec32c11d ^
535fe9ac ^

372367f5 ^
535fe9ac ^



372367f5 ^
535fe9ac ^


3350c34a ^
535fe9ac ^


3350c34a ^
535fe9ac ^



372367f5 ^
535fe9ac ^

3350c34a ^
535fe9ac ^
3350c34a ^
535fe9ac ^







ec32c11d ^
535fe9ac ^

372367f5 ^
3350c34a ^
535fe9ac ^
372367f5 ^
535fe9ac ^

3350c34a ^
535fe9ac ^

372367f5 ^
535fe9ac ^

3350c34a ^
535fe9ac ^

372367f5 ^
3350c34a ^
535fe9ac ^

372367f5 ^
3350c34a ^
535fe9ac ^

372367f5 ^
3350c34a ^
535fe9ac ^

372367f5 ^
3350c34a ^
535fe9ac ^

372367f5 ^
3350c34a ^
535fe9ac ^

372367f5 ^
3350c34a ^
535fe9ac ^

372367f5 ^
3350c34a ^
535fe9ac ^



ec32c11d ^
3350c34a ^
535fe9ac ^
ec32c11d ^
535fe9ac ^
ec32c11d ^
535fe9ac ^
372367f5 ^
535fe9ac ^








372367f5 ^
535fe9ac ^

3350c34a ^
535fe9ac ^

3350c34a ^
535fe9ac ^






ec32c11d ^
535fe9ac ^







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
               

      
                      
                                      

                                                
                                   
                                                                                                                                         
                                                 
       
    

                                                                                                 

                                     
                            
                                  
                             

                             
                             
                             

                                                           
                              
                              
                            


        
        




























                                                                                 
                                                                                                                                     



                                                                                                                                                                                                                                                                   
                                                                                                                                                                                                    
                                                                                                       
                                                                                                                                        
                                                                                                                                                                                                      

                                                                                                   
                                                                                                                                                                



                                                                                          
                                                                                                                                                                                                           


                                                                                                                    
                                                                                             


                                                                                                  
                                                                                                                      



                                                                                          
                                                                                                                                                                                                       

                                                                                                                
                                                                                                                        
                                                                               
                                                                                             







                                                                                                                                                                                        
                                                                                                                                                                                               

                                                                                                                                                                                                 
                                                                                                                                                                                                 
                                                                                                                                                                                                                                                                  
                                                                                                                                                                                                            
                                                                                                                                                                                                 

                                                                                                                           
                                                                                                                                                                                                                                                                   

                                                                                                                                                                                                                 
                                                                                                                                                                                                 

                                                                                                                           
                                                                                                                                                                                                                                                                         

                                                                                                                                                                                                                 
                                                                                                                                                                                                 
                                                                                                                                                                                                                                                                      

                                                                                                                                                                                                                 
                                                                                                                                                                                                 
                                                                                                                                                                                                                                                                            

                                                                                                                                                                                                                 
                                                                                                                                                                                                 
                                                                                                                                                                                                                                                                             

                                                                                                                                                                                                            
                                                                                                                                                                                                 
                                                                                                                                                                                                                                                                          

                                                                                                                                                                                                                 
                                                                                                                                                                                                 
                                                                                                                                                                                                                                                                               

                                                                                                                                                                                                                 
                                                                                                                                                                                                 
                                                                                                                                                                                                                                                                            

                                                                                                                                                                                                                 
                                                                                                                                                                                                 
                                                                                                                                                                                                                                                                                  



                                                                                                                                                                                                                                                                               
                                                                                                                                                                                                     
                                                                                                        
                                                                                                                                                           
                                                                                                                                                                                                                            
                                                                                                                                          
                                                                                                                                                                                                         
                                                                                               
                                                                                                                                                                                                   








                                                                                                                              
                                                                                                                                                                        

                                                                                                                                    
                                                                                                                   

                                                                                                    
                                                                                                                      






                                                                                                                                                                                             
                                                                                                                                                                                                               







                                                                                                                                                                                      
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Mu - linux/411string.mu</title>
<meta name="Generator" content="Vim/8.2">
<meta name="plugin-version" content="vim8.1_v2">
<meta name="syntax" content="none">
<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=,use_input_for_pc=fallback">
<meta name="colorscheme" content="minimal-light">
<style>
<!--
pre { white-space: pre-wrap; font-family: monospace; color: #000000; background-color: #ffffd7; }
body { font-size:12pt; font-family: monospace; color: #000000; background-color: #ffffd7; }
a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.PreProc { color: #c000c0; }
.CommentedCode { color: #8a8a8a; }
.muRegEcx { color: #870000; }
.LineNr { }
.muRegEsi { color: #005faf; }
.muRegEdi { color: #00af00; }
.Constant { color: #008787; }
.muFunction { color: #af5f00; text-decoration: underline; }
.muTest { color: #5f8700; }
.Delimiter { color: #c000c0; }
.muComment { color: #005faf; }
.Special { color: #ff6060; }
-->
</style>

<script>
<!--

/* function to open any folds containing a jumped-to line before jumping to it */
function JumpToLine()
{
  var lineNum;
  lineNum = window.location.hash;
  lineNum = lineNum.substr(1); /* strip off '#' */

  if (lineNum.indexOf('L') == -1) {
    lineNum = 'L'+lineNum;
  }
  var lineElem = document.getElementById(lineNum);
  /* Always jump to new location even if the line was hidden inside a fold, or
   * we corrected the raw number to a line ID.
   */
  if (lineElem) {
    lineElem.scrollIntoView(true);
  }
  return true;
}
if ('onhashchange' in window) {
  window.onhashchange = JumpToLine;
}

-->
</script>
</head>
<body onload='JumpToLine();'>
<a href='https://github.com/akkartik/mu/blob/main/linux/411string.mu'>https://github.com/akkartik/mu/blob/main/linux/411string.mu</a>
<pre id='vimCodeElement'>
<span id="L1" class="LineNr">  1 </span><span class="muComment"># read up to 'len' graphemes after skipping the first 'start' ones</span>
<span id="L2" class="LineNr">  2 </span><span class="PreProc">fn</span> <span class="muFunction"><a href='411string.mu.html#L2'>substring</a></span> in: (addr array byte), start: int, len: int, out-ah: (addr handle array byte) <span class="Delimiter">{</span>
<span id="L3" class="LineNr">  3 </span>  <span class="PreProc">var</span> in-stream: (stream byte <span class="Constant">0x100</span>)
<span id="L4" class="LineNr">  4 </span>  <span class="PreProc">var</span> in-stream-addr/<span class="muRegEsi">esi</span>: (addr stream byte) <span class="Special">&lt;-</span> address in-stream
<span id="L5" class="LineNr">  5 </span>  <a href='108write.subx.html#L24'>write</a> in-stream-addr, in
<span id="L6" class="LineNr">  6 </span>  <span class="PreProc">var</span> out-stream: (stream byte <span class="Constant">0x100</span>)
<span id="L7" class="LineNr">  7 </span>  <span class="PreProc">var</span> out-stream-addr/<span class="muRegEdi">edi</span>: (addr stream byte) <span class="Special">&lt;-</span> address out-stream
<span id="L8" class="LineNr">  8 </span>  $substring:core: <span class="Delimiter">{</span>
<span id="L9" class="LineNr">  9 </span>    <span class="muComment"># skip 'start' graphemes</span>
<span id="L10" class="LineNr"> 10 </span>    <span class="PreProc">var</span> i/eax: int <span class="Special">&lt;-</span> copy <span class="Constant">0</span>
<span id="L11" class="LineNr"> 11 </span>    <span class="Delimiter">{</span>
<span id="L12" class="LineNr"> 12 </span>      compare i, start
<span id="L13" class="LineNr"> 13 </span>      <span class="PreProc">break-if-&gt;=</span>
<span id="L14" class="LineNr"> 14 </span>      <span class="Delimiter">{</span>
<span id="L15" class="LineNr"> 15 </span>        <span class="PreProc">var</span> dummy/eax: grapheme <span class="Special">&lt;-</span> <a href='403unicode.mu.html#L158'>read-grapheme</a> in-stream-addr
<span id="L16" class="LineNr"> 16 </span>        compare dummy, <span class="Constant">0xffffffff</span>/end-of-file
<span id="L17" class="LineNr"> 17 </span>        <span class="PreProc">break-if-=</span> $substring:core
<span id="L18" class="LineNr"> 18 </span>      <span class="Delimiter">}</span>
<span id="L19" class="LineNr"> 19 </span>      i <span class="Special">&lt;-</span> increment
<span id="L20" class="LineNr"> 20 </span>      <span class="PreProc">loop</span>
<span id="L21" class="LineNr"> 21 </span>    <span class="Delimiter">}</span>
<span id="L22" class="LineNr"> 22 </span>    <span class="muComment"># copy 'len' graphemes</span>
<span id="L23" class="LineNr"> 23 </span>    i <span class="Special">&lt;-</span> copy <span class="Constant">0</span>
<span id="L24" class="LineNr"> 24 </span>    <span class="Delimiter">{</span>
<span id="L25" class="LineNr"> 25 </span>      compare i, len
<span id="L26" class="LineNr"> 26 </span>      <span class="PreProc">break-if-&gt;=</span>
<span id="L27" class="LineNr"> 27 </span>      <span class="Delimiter">{</span>
<span id="L28" class="LineNr"> 28 </span>        <span class="PreProc">var</span> g/eax: grapheme <span class="Special">&lt;-</span> <a href='403unicode.mu.html#L158'>read-grapheme</a> in-stream-addr
<span id="L29" class="LineNr"> 29 </span>        compare g, <span class="Constant">0xffffffff</span>/end-of-file
<span id="L30" class="LineNr"> 30 </span>        <span class="PreProc">break-if-=</span> $substring:core
<span id="L31" class="LineNr"> 31 </span>        <a href='403unicode.mu.html#L372'>write-grapheme</a> out-stream-addr, g
<span id="L32" class="LineNr"> 32 </span>      <span class="Delimiter">}</span>
<span id="L33" class="LineNr"> 33 </span>      i <span class="Special">&lt;-</span> increment
<span id="L34" class="LineNr"> 34 </span>      <span class="PreProc">loop</span>
<span id="L35" class="LineNr"> 35 </span>    <span class="Delimiter">}</span>
<span id="L36" class="LineNr"> 36 </span>  <span class="Delimiter">}</span>
<span id="L37" class="LineNr"> 37 </span>  <a href='310copy-bytes.subx.html#L60'>stream-to-array</a> out-stream-addr, out-ah
<span id="L38" class="LineNr"> 38 </span><span class="Delimiter">}</span>
<span id="L39" class="LineNr"> 39 </span>
<span id="L40" class="LineNr"> 40 </span><span class="PreProc">fn</span> <span class="muTest"><a href='411string.mu.html#L40'>test-substring</a></span> <span class="Delimiter">{</span>
<span id="L41" class="LineNr"> 41 </span>  <span class="PreProc">var</span> out-h: (handle array byte)
<span id="L42" class="LineNr"> 42 </span>  <span class="PreProc">var</span> out-ah/<span class="muRegEdi">edi</span>: (addr handle array byte) <span class="Special">&lt;-</span> address out-h
<span id="L43" class="LineNr"> 43 </span>  <span class="muComment"># prefix substrings</span>
<span id="L44" class="LineNr"> 44 </span>  <a href='411string.mu.html#L2'>substring</a> <span class="Constant">0</span>, <span class="Constant">0</span>, <span class="Constant">3</span>, out-ah
<span id="L45" class="LineNr"> 45 </span>  <span class="PreProc">var</span> out/eax: (addr array byte) <span class="Special">&lt;-</span> <a href='120allocate.subx.html#L258'>lookup</a> *out-ah
<span id="L46" class="LineNr"> 46 </span>  <a href='105string-equal.subx.html#L220'>check-strings-equal</a> out, <span class="Constant">&quot;&quot;</span>, <span class="Constant">&quot;F - <a href='411string.mu.html#L40'>test-substring</a>/null&quot;</span>
<span id="L47" class="LineNr"> 47 </span>  <a href='411string.mu.html#L2'>substring</a> <span class="Constant">&quot;&quot;</span>, <span class="Constant">0</span>, <span class="Constant">3</span>, out-ah
<span id="L48" class="LineNr"> 48 </span>  <span class="PreProc">var</span> out/eax: (addr array byte) <span class="Special">&lt;-</span> <a href='120allocate.subx.html#L258'>lookup</a> *out-ah
<span id="L49" class="LineNr"> 49 </span><span class="CommentedCode">#?   print-string-to-real-screen out</span>
<span id="L50" class="LineNr"> 50 </span><span class="CommentedCode">#?   print-string-to-real-screen &quot;\n&quot;</span>
<span id="L51" class="LineNr"> 51 </span>  <a href='105string-equal.subx.html#L220'>check-strings-equal</a> out, <span class="Constant">&quot;&quot;</span>, <span class="Constant">&quot;F - <a href='411string.mu.html#L40'>test-substring</a>/empty&quot;</span>
<span id="L52" class="LineNr"> 52 </span>  <span class="muComment">#</span>
<span id="L53" class="LineNr"> 53 </span>  <a href='411string.mu.html#L2'>substring</a> <span class="Constant">&quot;abcde&quot;</span>, <span class="Constant">0</span>, <span class="Constant">3</span>, out-ah
<span id="L54" class="LineNr"> 54 </span>  <span class="PreProc">var</span> out/eax: (addr array byte) <span class="Special">&lt;-</span> <a href='120allocate.subx.html#L258'>lookup</a> *out-ah
<span id="L55" class="LineNr"> 55 </span><span class="CommentedCode">#?   print-string-to-real-screen out</span>
<span id="L56" class="LineNr"> 56 </span><span class="CommentedCode">#?   print-string-to-real-screen &quot;\n&quot;</span>
<span id="L57" class="LineNr"> 57 </span>  <a href='105string-equal.subx.html#L220'>check-strings-equal</a> out, <span class="Constant">&quot;abc&quot;</span>, <span class="Constant">&quot;F - <a href='411string.mu.html#L40'>test-substring</a>/truncate&quot;</span>
<span id="L58" class="LineNr"> 58 </span>  <span class="muComment">#</span>
<span id="L59" class="LineNr"> 59 </span>  <a href='411string.mu.html#L2'>substring</a> <span class="Constant">&quot;abcde&quot;</span>, <span class="Constant">0</span>, <span class="Constant">5</span>, out-ah
<span id="L60" class="LineNr"> 60 </span>  <span class="PreProc">var</span> out/eax: (addr array byte) <span class="Special">&lt;-</span> <a href='120allocate.subx.html#L258'>lookup</a> *out-ah
<span id="L61" class="LineNr"> 61 </span>  <a href='105string-equal.subx.html#L220'>check-strings-equal</a> out, <span class="Constant">&quot;abcde&quot;</span>, <span class="Constant">&quot;F - <a href='411string.mu.html#L40'>test-substring</a>/all&quot;</span>
<span id="L62" class="LineNr"> 62 </span>  <span class="muComment">#</span>
<span id="L63" class="LineNr"> 63 </span>  <a href='411string.mu.html#L2'>substring</a> <span class="Constant">&quot;abcde&quot;</span>, <span class="Constant">0</span>, <span class="Constant">7</span>, out-ah
<span id="L64" class="LineNr"> 64 </span>  <span class="PreProc">var</span> out/eax: (addr array byte) <span class="Special">&lt;-</span> <a href='120allocate.subx.html#L258'>lookup</a> *out-ah
<span id="L65" class="LineNr"> 65 </span>  <a href='105string-equal.subx.html#L220'>check-strings-equal</a> out, <span class="Constant">&quot;abcde&quot;</span>, <span class="Constant">&quot;F - <a href='411string.mu.html#L40'>test-substring</a>/too-small&quot;</span>
<span id="L66" class="LineNr"> 66 </span>  <span class="muComment"># substrings outside string</span>
<span id="L67" class="LineNr"> 67 </span>  <a href='411string.mu.html#L2'>substring</a> <span class="Constant">&quot;abcde&quot;</span>, <span class="Constant">6</span>, <span class="Constant">1</span>, out-ah
<span id="L68" class="LineNr"> 68 </span>  <span class="PreProc">var</span> out/eax: (addr array byte) <span class="Special">&lt;-</span> <a href='120allocate.subx.html#L258'>lookup</a> *out-ah
<span id="L69" class="LineNr"> 69 </span>  <a href='105string-equal.subx.html#L220'>check-strings-equal</a> out, <span class="Constant">&quot;&quot;</span>, <span class="Constant">&quot;F - <a href='411string.mu.html#L40'>test-substring</a>/start-too-large&quot;</span>
<span id="L70" class="LineNr"> 70 </span>  <span class="muComment"># trim prefix</span>
<span id="L71" class="LineNr"> 71 </span>  <a href='411string.mu.html#L2'>substring</a> <span class="Constant">&quot;&quot;</span>, <span class="Constant">2</span>, <span class="Constant">3</span>, out-ah
<span id="L72" class="LineNr"> 72 </span>  <span class="PreProc">var</span> out/eax: (addr array byte) <span class="Special">&lt;-</span> <a href='120allocate.subx.html#L258'>lookup</a> *out-ah
<span id="L73" class="LineNr"> 73 </span>  <a href='105string-equal.subx.html#L220'>check-strings-equal</a> out, <span class="Constant">&quot;&quot;</span>, <span class="Constant">&quot;F - <a href='411string.mu.html#L40'>test-substring</a>/middle-empty&quot;</span>
<span id="L74" class="LineNr"> 74 </span>  <span class="muComment">#</span>
<span id="L75" class="LineNr"> 75 </span>  <a href='411string.mu.html#L2'>substring</a> <span class="Constant">&quot;abcde&quot;</span>, <span class="Constant">1</span>, <span class="Constant">2</span>, out-ah
<span id="L76" class="LineNr"> 76 </span>  <span class="PreProc">var</span> out/eax: (addr array byte) <span class="Special">&lt;-</span> <a href='120allocate.subx.html#L258'>lookup</a> *out-ah
<span id="L77" class="LineNr"> 77 </span>  <a href='105string-equal.subx.html#L220'>check-strings-equal</a> out, <span class="Constant">&quot;bc&quot;</span>, <span class="Constant">&quot;F - <a href='411string.mu.html#L40'>test-substring</a>/middle-truncate&quot;</span>
<span id="L78" class="LineNr"> 78 </span>  <span class="muComment">#</span>
<span id="L79" class="LineNr"> 79 </span>  <a href='411string.mu.html#L2'>substring</a> <span class="Constant">&quot;abcde&quot;</span>, <span class="Constant">1</span>, <span class="Constant">4</span>, out-ah
<span id="L80" class="LineNr"> 80 </span>  <span class="PreProc">var</span> out/eax: (addr array byte) <span class="Special">&lt;-</span> <a href='120allocate.subx.html#L258'>lookup</a> *out-ah
<span id="L81" class="LineNr"> 81 </span>  <a href='105string-equal.subx.html#L220'>check-strings-equal</a> out, <span class="Constant">&quot;bcde&quot;</span>, <span class="Constant">&quot;F - <a href='411string.mu.html#L40'>test-substring</a>/middle-all&quot;</span>
<span id="L82" class="LineNr"> 82 </span>  <span class="muComment">#</span>
<span id="L83" class="LineNr"> 83 </span>  <a href='411string.mu.html#L2'>substring</a> <span class="Constant">&quot;abcde&quot;</span>, <span class="Constant">1</span>, <span class="Constant">5</span>, out-ah
<span id="L84" class="LineNr"> 84 </span>  <span class="PreProc">var</span> out/eax: (addr array byte) <span class="Special">&lt;-</span> <a href='120allocate.subx.html#L258'>lookup</a> *out-ah
<span id="L85" class="LineNr"> 85 </span>  <a href='105string-equal.subx.html#L220'>check-strings-equal</a> out, <span class="Constant">&quot;bcde&quot;</span>, <span class="Constant">&quot;F - <a href='411string.mu.html#L40'>test-substring</a>/middle-too-small&quot;</span>
<span id="L86" class="LineNr"> 86 </span><span class="Delimiter">}</span>
<span id="L87" class="LineNr"> 87 </span>
<span id="L88" class="LineNr"> 88 </span><span class="PreProc">fn</span> <span class="muFunction"><a href='411string.mu.html#L88'>split-string</a></span> in: (addr array byte), delim: grapheme, out: (addr handle array (handle array byte)) <span class="Delimiter">{</span>
<span id="L89" class="LineNr"> 89 </span>  <span class="PreProc">var</span> in-stream: (stream byte <span class="Constant">0x100</span>)
<span id="L90" class="LineNr"> 90 </span>  <span class="PreProc">var</span> in-stream-addr/<span class="muRegEsi">esi</span>: (addr stream byte) <span class="Special">&lt;-</span> address in-stream
<span id="L91" class="LineNr"> 91 </span>  <a href='108write.subx.html#L24'>write</a> in-stream-addr, in
<span id="L92" class="LineNr"> 92 </span>  <span class="PreProc">var</span> tokens-stream: (stream (handle array byte) <span class="Constant">0x100</span>)
<span id="L93" class="LineNr"> 93 </span>  <span class="PreProc">var</span> tokens-stream-addr/<span class="muRegEdi">edi</span>: (addr stream (handle array byte)) <span class="Special">&lt;-</span> address tokens-stream
<span id="L94" class="LineNr"> 94 </span>  <span class="PreProc">var</span> curr-stream: (stream byte <span class="Constant">0x100</span>)
<span id="L95" class="LineNr"> 95 </span>  <span class="PreProc">var</span> curr-stream-addr/<span class="muRegEcx">ecx</span>: (addr stream byte) <span class="Special">&lt;-</span> address curr-stream
<span id="L96" class="LineNr"> 96 </span>  $split-string:core: <span class="Delimiter">{</span>
<span id="L97" class="LineNr"> 97 </span>    <span class="PreProc">var</span> g/eax: grapheme <span class="Special">&lt;-</span> <a href='403unicode.mu.html#L158'>read-grapheme</a> in-stream-addr
<span id="L98" class="LineNr"> 98 </span>    compare g, <span class="Constant">0xffffffff</span>
<span id="L99" class="LineNr"> 99 </span>    <span class="PreProc">break-if-=</span>
<span id="L100" class="LineNr">100 </span><span class="CommentedCode">#?     print-grapheme-to-real-screen g</span>
<span id="L101" class="LineNr">101 </span><span class="CommentedCode">#?     print-string-to-real-screen &quot;\n&quot;</span>
<span id="L102" class="LineNr">102 </span>    compare g, delim
<span id="L103" class="LineNr">103 </span>    <span class="Delimiter">{</span>
<span id="L104" class="LineNr">104 </span>      <span class="PreProc">break-if-!=</span>
<span id="L105" class="LineNr">105 </span>      <span class="muComment"># token complete; flush</span>
<span id="L106" class="LineNr">106 </span>      <span class="PreProc">var</span> token: (handle array byte)
<span id="L107" class="LineNr">107 </span>      <span class="PreProc">var</span> token-ah/eax: (addr handle array byte) <span class="Special">&lt;-</span> address token
<span id="L108" class="LineNr">108 </span>      <a href='310copy-bytes.subx.html#L60'>stream-to-array</a> curr-stream-addr, token-ah
<span id="L109" class="LineNr">109 </span>      <a href='309stream.subx.html#L54'>write-to-stream</a> tokens-stream-addr, token-ah
<span id="L110" class="LineNr">110 </span>      <a href='106stream.subx.html#L17'>clear-stream</a> curr-stream-addr
<span id="L111" class="LineNr">111 </span>      <span class="PreProc">loop</span> $split-string:core
<span id="L112" class="LineNr">112 </span>    <span class="Delimiter">}</span>
<span id="L113" class="LineNr">113 </span>    <a href='403unicode.mu.html#L372'>write-grapheme</a> curr-stream-addr, g
<span id="L114" class="LineNr">114 </span>    <span class="PreProc">loop</span>
<span id="L115" class="LineNr">115 </span>  <span class="Delimiter">}</span>
<span id="L116" class="LineNr">116 </span>  <a href='310copy-bytes.subx.html#L60'>stream-to-array</a> tokens-stream-addr, out
<span id="L117" class="LineNr">117 </span><span class="Delimiter">}</span>
<span id="L118" class="LineNr">118 </span>
<span id="L119" class="LineNr">119 </span><span class="PreProc">fn</span> <span class="muTest"><a href='411string.mu.html#L119'>test-split-string</a></span> <span class="Delimiter">{</span>
<span id="L120" class="LineNr">120 </span>  <span class="PreProc">var</span> out-h: (handle array (handle array byte))
<span id="L121" class="LineNr">121 </span>  <span class="PreProc">var</span> out-ah/<span class="muRegEdi">edi</span>: (addr handle array (handle array byte)) <span class="Special">&lt;-</span> address out-h
<span id="L122" class="LineNr">122 </span>  <span class="muComment"># prefix substrings</span>
<span id="L123" class="LineNr">123 </span>  <a href='411string.mu.html#L88'>split-string</a> <span class="Constant">&quot;bab&quot;</span>, <span class="Constant">0x61</span>, out-ah
<span id="L124" class="LineNr">124 </span>  <span class="muComment"># no crash</span>
<span id="L125" class="LineNr">125 </span><span class="Delimiter">}</span>
</pre>
</body>
</html>
<!-- vim: set foldmethod=manual : -->