about summary refs log tree commit diff stats
Commit message (Collapse)AuthorAgeFilesLines
* changing MASTERW value from 52 to 60 (in both, default and arg), I feel this ↵arg@10ksloc.org2006-08-023-3/+3
| | | | is better now
* fixed a type in README, and patched config.mkarg@10ksloc.org2006-08-022-2/+2
|
* updated dwm.htmlarg@10ksloc.org2006-08-021-3/+3
|
* Added tag 0.6 for changeset c11f86db4550cac5d0a648a3fe4d6d3b9a4fcf7earg@10ksloc.org2006-08-021-0/+1
|
* removed config.h (stupid hg) 0.6arg@10ksloc.org2006-08-021-62/+0
|
* removed the CONFIG variable from config.mk, renamed config.h into ↵arg@10ksloc.org2006-08-024-11/+66
| | | | config.default.h, after first clone/extract one needs to copy config.default.h to config.h, that is easier than always heavy typing make CONFIG=blafasel
* added Acroread.* and MPlayer.* to config.arg.h rulesarg@10ksloc.org2006-08-021-0/+2
|
* made fullscreen apps working fine in floating mode (there is no sane way to ↵arg@10ksloc.org2006-08-029-79/+92
| | | | make them work in tiled mode, thus I switch to floating mode if I run such kind of app), also fixed the xterm issue reported by Sander
* new stuffarg@10ksloc.org2006-08-022-20/+23
|
* dwm is now exit, if stdin is closed due broken pipearg@10ksloc.org2006-08-021-8/+5
|
* implemented focus on enterwindow on titlebarsarg@10ksloc.org2006-08-022-2/+2
|
* applied Sanders patches (numlock2)arg@10ksloc.org2006-08-025-26/+40
|
* reverting to old resize policyarg@10ksloc.org2006-08-022-21/+32
|
* new resize stuff (using XConfigureWindow instead of XSendEvent)arg@10ksloc.org2006-08-022-32/+21
|
* renamed WM_PROTOCOL_DELWIN into PROTODELWINarg@10ksloc.org2006-08-013-3/+3
|
* renamed ARRANGE into DEFMODEarg@10ksloc.org2006-08-013-4/+3
|
* small fixes to dwm.htmlarg@10ksloc.org2006-08-011-6/+6
|
* simplified READMEarg@10ksloc.org2006-08-011-4/+1
|
* removed 1 missing LOCarg@10ksloc.org2006-08-011-1/+0
|
* removed 5LOCarg@10ksloc.org2006-08-012-15/+10
|
* removed artefacts of single-linked list (thanx to Jukka, I must have been mad)arg@10ksloc.org2006-08-012-9/+4
|
* cleaned config.*h to prevent some confusionarg@10ksloc.org2006-08-013-6/+5
|
* saved 2LOCarg@10ksloc.org2006-08-011-4/+2
|
* uppercasing all define'd values (uppercase-prefixed should only be enum ↵arg@10ksloc.org2006-08-014-16/+16
| | | | field qualifiers)
* fixed config.h filesarg@10ksloc.org2006-08-012-4/+2
|
* centralized/externalized configuration to config.harg@10ksloc.org2006-08-019-107/+172
|
* applied Cedric's NumLock patcharg@10ksloc.org2006-08-011-1/+17
|
* applied Jukkas prev/next patch with XK_{h,l}arg@10ksloc.org2006-08-013-0/+18
|
* applied Sanders patchesarg@10ksloc.org2006-08-018-58/+42
|
* committed a patch which fixes the hints of Jukkaarg@10ksloc.org2006-08-014-40/+14
|
* updated htmlarg@10ksloc.org2006-07-211-1/+1
|
* Added tag 0.5 for changeset 22213b9a2114167ee8ba019a012e27da0422a61aarg@10ksloc.org2006-07-211-0/+1
|
* prepared 0.5 0.5arg@10ksloc.org2006-07-211-3/+9
|
* some cleanups/fixes inspired by Jukka Salmi's feedbackarg@10ksloc.org2006-07-214-13/+7
|
* simplified main.c, switching back to single urxvt usagearg@10ksloc.org2006-07-212-28/+14
|
* s/sleep 5/sleep 2/arg@10ksloc.org2006-07-211-1/+1
|
* changed the status info README hint (more simple now, no extra script necessary)arg@10ksloc.org2006-07-211-7/+1
|
* s/0.5/0.6/ - my steps are wider than the realityarg@10ksloc.org2006-07-212-2/+2
|
* applied sanders maxfix patcharg@10ksloc.org2006-07-211-2/+2
|
* added a note how to achieve status info in the bararg@10ksloc.org2006-07-211-1/+17
|
* preparing 0.6 which will be available in the evening after sanders patch approx.arg@10ksloc.org2006-07-212-21/+8
|
* sanitization of several clunky stuff, removed heretag (rarely of use), ↵arg@10ksloc.org2006-07-214-48/+40
| | | | simplified pop(), changed shortcuts to always contain MODKEY
* applied sanders no_sizehints for tiled mode patch (thx!)arg@10ksloc.org2006-07-202-11/+11
|
* serious mistake in pop() (forgot to set c->prev to NULL on pop)arg@10ksloc.org2006-07-201-0/+1
|
* using double-linked list in order to get correct prev focus handlingarg@10ksloc.org2006-07-204-21/+45
|
* added yet another CUTOMIZE tagarg@10ksloc.org2006-07-201-0/+2
|
* cleaned the CUSTOMIZE flagsarg@10ksloc.org2006-07-203-5/+9
|
* made status bar drawing more robust, implemented togglemax and togglemode, ↵arg@10ksloc.org2006-07-205-33/+59
| | | | works quite well
* cleaned up codearg@10ksloc.org2006-07-208-85/+78
|
* Added tag 0.4 for changeset eb3165734f00fe7f7da8aeebaed00e60a57caac9arg@10ksloc.org2006-07-201-0/+1
|
r Kartik Agaram <vc@akkartik.com> 2018-11-30 10:54:42 -0800 4801' href='/akkartik/mu/commit/subx/056write.subx?h=hlt&id=6030d7e2e56d445ca67c6a0e8c9cf33e46bc673c'>6030d7e2 ^
3d6450f2 ^

6030d7e2 ^
ee9a9237 ^
6030d7e2 ^
ee9a9237 ^
6030d7e2 ^
ee9a9237 ^
33352536 ^
6030d7e2 ^
ee9a9237 ^
6030d7e2 ^

ee9a9237 ^
6030d7e2 ^
ee9a9237 ^
33352536 ^
6030d7e2 ^
ee9a9237 ^
6030d7e2 ^

ee9a9237 ^
6030d7e2 ^
ee9a9237 ^
33352536 ^
6030d7e2 ^
ee9a9237 ^
6030d7e2 ^

9d27e966 ^
33352536 ^

ee9a9237 ^
6030d7e2 ^
ee9a9237 ^
33352536 ^
6030d7e2 ^

b31455f8 ^


f1eade72 ^
6030d7e2 ^
9b16f190 ^
6030d7e2 ^
9b16f190 ^
bfcc0f85 ^
438e5a0d ^



6ee77ba7 ^
71e4f381 ^




























































a1cfadc7 ^
71e4f381 ^





















a1cfadc7 ^


0e9503d7 ^
a1cfadc7 ^

ee9a9237 ^
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
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
                                   
 

                                                                             
 
       


                                                                                                                                                 
 
                                                     
                

                                                                                                                                                                       


                                                                                                                                                                         
                      







                                                                                                                                                                            
                   
                                                                                                                                                                            
                                                               
                
                                                                                                                                                                      
                                

                                                                                                                                                                              
                                 

                                                                                                                                                                              
              
                             
                      


                                                                                                                                                                       
                         



                 
           
                

                                                                                                                                                                       
             
 
                  
                                
                   
                               
              
                                
                      
                                                                                                                                                                  
                               
                   

                               
              
                         
                      
                                                                                                                                                                  
                                                                 
                   

                                          
                                  

                                                                                                                                                                      
              
                                    
                      
                                                                                                                                                                  

             

                   
                                
                   
                               
              
                                
                      
                                                                                                                                                                  
                              
                   

                               
              
                         
                      
                                                                                                                                                                  
                              
                   

                               
              
                         
                      
                                                                                                                                                                  
                                                                 
                   

                                           
                                  

                                                                                                                                                                      
              
                                    
                      
                                                                                                                                                                  

             


       
                              
                         
           
                        
           
          



                                   
 




























































                                                                                                                                                                             
                                                 





















                                                                                                                                                                               


                                                                                                                  
              

                     
                            
# write: write to in-memory streams
#
# We need to do this in machine code because streams need to be opaque types,
# and we don't yet support opaque types in Mu.

== code
#   instruction                     effective address                                                   register    displacement    immediate
# . op          subop               mod             rm32          base        index         scale       r32
# . 1-3 bytes   3 bits              2 bits          3 bits        3 bits      3 bits        2 bits      2 bits      0/1/2/4 bytes   0/1/2/4 bytes

write:  # f: (addr stream byte), s: (addr array byte)
    # . prologue
    55/push-ebp
    89/copy                         3/mod/direct    5/rm32/ebp    .           .             .           4/r32/esp   .               .                 # copy esp to ebp
    # if (s == 0) return
    81          7/subop/compare     1/mod/*+disp8   5/rm32/ebp    .           .             .           .           0xc/disp8       0/imm32           # compare *(ebp+12)
    74/jump-if-=  $write:end/disp8
    # . save registers
    50/push-eax
    51/push-ecx
    52/push-edx
    53/push-ebx
    # ecx = f
    8b/copy                         1/mod/*+disp8   5/rm32/ebp    .           .                         1/r32/ecx   8/disp8         .                 # copy *(ebp+8) to ecx
    # edx = f->write
    8b/copy                         0/mod/indirect  1/rm32/ecx    .           .             .           2/r32/edx   .               .                 # copy *ecx to edx
    # ebx = f->size
    8b/copy                         1/mod/*+disp8   1/rm32/ecx    .           .             .           3/r32/ebx   8/disp8         .                 # copy *(ecx+8) to ebx
    # eax = _append-3(&f->data[f->write], &f->data[f->size], s)
    # . . push s
    ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp    .           .             .           .           0xc/disp8       .                 # push *(ebp+12)
    # . . push &f->data[f->size]
    8d/copy-address                 1/mod/*+disp8   4/rm32/sib    1/base/ecx  3/index/ebx   .           3/r32/ebx   0xc/disp8       .                 # copy ecx+ebx+12 to ebx
    53/push-ebx
    # . . push &f->data[f->write]
    8d/copy-address                 1/mod/*+disp8   4/rm32/sib    1/base/ecx  2/index/edx   .           3/r32/ebx   0xc/disp8       .                 # copy ecx+edx+12 to ebx
    53/push-ebx
    # . . call
    e8/call  _append-3/disp32
    # . . discard args
    81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               0xc/imm32         # add to esp
    # f->write += eax
    01/add                          0/mod/indirect  1/rm32/ecx    .           .             .           0/r32/eax   .               .                 # add eax to *ecx
    # . restore registers
    5b/pop-to-ebx
    5a/pop-to-edx
    59/pop-to-ecx
    58/pop-to-eax
$write:end:
    # . epilogue
    89/copy                         3/mod/direct    4/rm32/esp    .           .             .           5/r32/ebp   .               .                 # copy ebp to esp
    5d/pop-to-ebp
    c3/return

test-write-single:
    # clear-stream(_test-stream)
    # . . push args
    68/push  _test-stream/imm32
    # . . call
    e8/call  clear-stream/disp32
    # . . discard args
    81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               4/imm32           # add to esp
    # write(_test-stream, "Ab")
    # . . push args
    68/push  "Ab"/imm32
    68/push  _test-stream/imm32
    # . . call
    e8/call  write/disp32
    # . . discard args
    81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               8/imm32           # add to esp
    # check-ints-equal(*_test-stream->data, 41/A 62/b 00 00, msg)
    # . . push args
    68/push  "F - test-write-single"/imm32
    68/push  0x006241/imm32/Ab
    # . . push *_test-stream->data
    b8/copy-to-eax  _test-stream/imm32
    ff          6/subop/push        1/mod/*+disp8   0/rm32/eax    .           .             .           .           0xc/disp8       .                 # push *(eax+12)
    # . . call
    e8/call  check-ints-equal/disp32
    # . . discard args
    81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               0xc/imm32         # add to esp
    # end
    c3/return

test-write-appends:
    # clear-stream(_test-stream)
    # . . push args
    68/push  _test-stream/imm32
    # . . call
    e8/call  clear-stream/disp32
    # . . discard args
    81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               4/imm32           # add to esp
    # write(_test-stream, "C")
    # . . push args
    68/push  "C"/imm32
    68/push  _test-stream/imm32
    # . . call
    e8/call  write/disp32
    # . . discard args
    81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               8/imm32           # add to esp
    # write(_test-stream, "D")
    # . . push args
    68/push  "D"/imm32
    68/push  _test-stream/imm32
    # . . call
    e8/call  write/disp32
    # . . discard args
    81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               8/imm32           # add to esp
    # check-ints-equal(*_test-stream->data, 43/C 44/D 00 00, msg)
    # . . push args
    68/push  "F - test-write-appends"/imm32
    68/push  0x00004443/imm32/C-D
    # . . push *_test-stream->data
    b8/copy-to-eax  _test-stream/imm32
    ff          6/subop/push        1/mod/*+disp8   0/rm32/eax    .           .             .           .           0xc/disp8       .                 # push *(eax+12)
    # . . call
    e8/call  check-ints-equal/disp32
    # . . discard args
    81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               0xc/imm32         # add to esp
    # end
    c3/return

== data

_test-stream:  # (stream byte)
    # current write index
    0/imm32
    # current read index
    0/imm32
    # size
    0x10/imm32
    # data (2 lines x 8 bytes/line)
    00 00 00 00 00 00 00 00
    00 00 00 00 00 00 00 00

== code

# 3-argument variant of _append
_append-3:  # out: (addr byte), outend: (addr byte), s: (addr array byte) -> num_bytes_appended/eax
    # . prologue
    55/push-ebp
    89/copy                         3/mod/direct    5/rm32/ebp    .           .             .           4/r32/esp   .               .                 # copy esp to ebp
    # . save registers
    51/push-ecx
    # eax = _append-4(out, outend, &s->data[0], &s->data[s->size])
    # . . push &s->data[s->size]
    8b/copy                         1/mod/*+disp8   5/rm32/ebp    .           .                         0/r32/eax   0x10/disp8      .                 # copy *(ebp+16) to eax
    8b/copy                         0/mod/indirect  0/rm32/eax    .           .             .           1/r32/ecx   .               .                 # copy *eax to ecx
    8d/copy-address                 1/mod/*+disp8   4/rm32/sib    0/base/eax  1/index/ecx   .           1/r32/ecx   4/disp8         .                 # copy eax+ecx+4 to ecx
    51/push-ecx
    # . . push &s->data[0]
    8d/copy-address                 1/mod/*+disp8   0/rm32/eax    .           .             .           1/r32/ecx   4/disp8         .                 # copy eax+4 to ecx
    51/push-ecx
    # . . push outend
    ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp    .           .             .           .           0xc/disp8       .                 # push *(ebp+12)
    # . . push out
    ff          6/subop/push        1/mod/*+disp8   5/rm32/ebp    .           .             .           .           8/disp8         .                 # push *(ebp+8)
    # . . call
    e8/call  _append-4/disp32
    # . . discard args
    81          0/subop/add         3/mod/direct    4/rm32/esp    .           .             .           .           .               0x10/imm32        # add to esp
$_append-3:end:
    # . restore registers
    59/pop-to-ecx
    # . epilogue
    89/copy                         3/mod/direct    4/rm32/esp    .           .             .           5/r32/ebp   .               .                 # copy ebp to esp
    5d/pop-to-ebp
    c3/return

# 4-argument variant of _append
_append-4:  # out: (addr byte), outend: (addr byte), in: (addr byte), inend: (addr byte) -> num_bytes_appended/eax: int
    # . prologue
    55/push-ebp
    89/copy                         3/mod/direct    5/rm32/ebp    .           .             .           4/r32/esp   .               .                 # copy esp to ebp
    # . save registers
    51/push-ecx
    52/push-edx
    53/push-ebx
    56/push-esi
    57/push-edi
    # num_bytes_appended = 0
    b8/copy-to-eax  0/imm32
    # edi = out
    8b/copy                         1/mod/*+disp8   5/rm32/ebp    .           .             .           7/r32/edi   8/disp8         .                 # copy *(ebp+8) to edi
    # edx = outend
    8b/copy                         1/mod/*+disp8   5/rm32/ebp    .           .             .           2/r32/edx   0xc/disp8       .                 # copy *(ebp+12) to edx
    # esi = in
    8b/copy                         1/mod/*+disp8   5/rm32/ebp    .           .             .           6/r32/esi   0x10/disp8      .                 # copy *(ebp+16) to esi
    # ecx = inend
    8b/copy                         1/mod/*+disp8   5/rm32/ebp    .           .             .           1/r32/ecx   0x14/disp8      .                 # copy *(ebp+20) to ecx
$_append-4:loop:
    # if (in >= inend) break
    39/compare                      3/mod/direct    6/rm32/esi    .           .             .           1/r32/ecx   .               .                 # compare esi with ecx
    73/jump-if-addr>=  $_append-4:end/disp8
    # if (out >= outend) abort  # just to catch test failures fast
    39/compare                      3/mod/direct    7/rm32/edi    .           .             .           2/r32/edx   .               .                 # compare edi with edx
    0f 83/jump-if-addr>=  $_append-4:abort/disp32
    # *out = *in
    8a/copy-byte                    0/mod/indirect  6/rm32/esi    .           .             .           3/r32/BL    .               .                 # copy byte at *esi to BL
    88/copy-byte                    0/mod/indirect  7/rm32/edi    .           .             .           3/r32/BL    .               .                 # copy byte at BL to *edi
    # ++num_bytes_appended
    40/increment-eax
    # ++in
    46/increment-esi
    # ++out
    47/increment-edi
    eb/jump  $_append-4:loop/disp8
$_append-4:end:
    # . restore registers
    5f/pop-to-edi
    5e/pop-to-esi
    5b/pop-to-ebx
    5a/pop-to-edx
    59/pop-to-ecx
    # . epilogue
    89/copy                         3/mod/direct    4/rm32/esp    .           .             .           5/r32/ebp   .               .                 # copy ebp to esp
    5d/pop-to-ebp
    c3/return

$_append-4:abort:
    (draw-text-wrapping-right-then-down-from-cursor-over-full-screen 0 "_append-4: stream full at " 3 0)  # 3=cyan
    (draw-int32-hex-wrapping-right-then-down-from-cursor-over-full-screen 0 %eax 3 0)
    (abort "")
    # never gets here

# . . vim:nowrap:textwidth=0