2022-04-30 04:27:53 KipIngram: I think the best way to do UTF-8 is to not do UTF-8 2022-04-30 04:28:20 It's already an efficient storage format, you just need to 'remember' it's UTF-8 when it counts, which is not often 2022-04-30 04:29:12 And UTF-32 doesn't actually describe 'characters' per-se, because Unicode code points can combine 2022-04-30 04:29:41 So you've got a multi-byte or multi-word format... might as well use a more intelligent multi-byte format 2022-04-30 04:29:53 More space-efficient anyway 2022-04-30 04:36:24 i tried to write a utf8<->utf32 function (but in c not forth :-| ) but i haven't properly tested it 2022-04-30 04:37:26 there's some rules to follow which makes the code hard to read 2022-04-30 04:41:08 veltas: that's exactly how I felt too, until I started tinkering with UTF-8 and started wanting access to those special characters. 2022-04-30 04:41:36 I had no interest whatsoever. 2022-04-30 04:42:05 The simplicity and straightforwardness of ASCII is very pleasing. 2022-04-30 04:42:42 But now I want them, and I also want to support the escape sequences that some of the special keys send. 2022-04-30 04:43:25 Two different things, but doing the escape keys without "inventinga kludge" also involves going beyond one byte per character. 2022-04-30 04:43:58 For the escape keys only I could probably cook myself up some use of the >127 and make it work. 2022-04-30 04:44:28 I might even be able to do that with the APL symbols, but that feels kind fo back-flippy. 2022-04-30 04:45:06 Again, escape sequences are some kind of multi-byte encoding 2022-04-30 04:45:11 Also, if I do either thing that way I then have data that I can't look at very easily outside of my Forth. 2022-04-30 04:45:24 Right - that's how they come in. 2022-04-30 04:45:40 I will say that a lot of parsing and processing stuff in literature makes you think "if I can break this into tokens it will be easier" 2022-04-30 04:45:54 I find them to be particularly ad hoc - everything from two bytes to six or seven. 2022-04-30 04:46:00 Surely there was a better way... 2022-04-30 04:46:08 But really you shouldn't ever actually physically break into tokens in memory, at most you should have control flow tied to tokens like words that parse a token etc 2022-04-30 04:46:16 But don't ever actually put tokens in an array etc 2022-04-30 04:46:25 Real compilers don't do this either 2022-04-30 04:46:33 Well, I didn't invent either of these things. 2022-04-30 04:46:59 I just think it was really ill-advised to begin those escape sequences with a byte that there is a KEY FOR on the keyboard. 2022-04-30 04:47:05 Escape is a damn nusance. 2022-04-30 04:47:08 nuisance 2022-04-30 04:47:28 To properly handle those keys I'm going to have to TIME the keyboard input. 2022-04-30 04:47:32 Yeah it made it unnecessarily complicated perhaps, but it doesn't make parsing fundamentally harder 2022-04-30 04:47:47 And unfortunately "KEY" might be a bit too simplistic a model 2022-04-30 04:47:48 No, it doesn't. It's just a state machine. 2022-04-30 04:47:57 Just one that's more complicated than it probably needed to be. 2022-04-30 04:48:11 I'm sure it "made sense at the time," given whatever constraints whoever did it was under. 2022-04-30 04:48:17 But I think KEY will just have to parse potentially more than one character when it reaches the start of a multi-byte etc 2022-04-30 04:48:45 Yes, I have KEY and EMIT stand-alone working just fine for UTF8 now. 2022-04-30 04:48:49 Probably the way that vim does it, with a (noticeable) timeout if the sequence doesn't complete fast enough 2022-04-30 04:48:53 UTF8 is nice and systematic and wasn't that hard to code. 2022-04-30 04:48:59 And it's clearly recognizable. 2022-04-30 04:49:11 You can set that timeout. 2022-04-30 04:49:18 Yeah I need to set it lower 2022-04-30 04:49:20 I turned mine down because I could notice it. 2022-04-30 04:49:28 No machine is going to be that slow 2022-04-30 04:49:38 I think it was screen that was doing it to me - I had to adjust it in .screenrc. 2022-04-30 04:49:43 vim's timeout is almost so long it's designed for you to manually enter an escape sequence 2022-04-30 04:49:57 Yeah maybe it's tmux 2022-04-30 04:49:58 Yes - that makes sense. 2022-04-30 04:50:02 But I don't need to do that. 2022-04-30 04:50:06 Yup 2022-04-30 04:50:23 At least all UTF8 characters are clearly outside of the ASCII codes. 2022-04-30 04:51:03 Yeah it makes JSON easier to parse 2022-04-30 04:51:17 Anyway, my hope yesterday didn't quite materialize. Turns out I did use one variable in expect to represent both "cursor distance right of starting point" and "working position in the string buffer." 2022-04-30 04:51:23 That's going to have to be split into two items. 2022-04-30 04:51:51 I was going to have to do that for my block editor anyway, because I want to support having color and attribute sequences in the edit buffer. 2022-04-30 04:52:11 Have you looked at extended character stuff in the forth standard? 2022-04-30 04:52:18 So this may make the editor more straightforward. 2022-04-30 04:52:41 No, I'm afraid I've mostly just diddled with Forths of my own over the years. 2022-04-30 04:53:19 I did my learning mostly on FIG and Forth 79, and somewhere upstairs I have a copy of the 79 standard, and maybe a copy of the 83 standard. 2022-04-30 04:53:33 Since then, though, I've been largely "detached." 2022-04-30 04:54:02 My Forth is probably more like FIG than anything else. Most of the differences are things I've invented on my own. 2022-04-30 04:54:18 Well look at it and see how they've structured handling UTF-8, because that's really what it's designed for 2022-04-30 04:54:35 "invented" - you know what I mean - I conceieved it myself, but turned out someone else had done it at some point. :-) 2022-04-30 04:54:43 The kind of inventions that make you no profit. 2022-04-30 04:56:01 Well, ok, but what am I going to get from it? Is there going to be someway to have word names comprised of APL characters without actually supporting those characters in EXPECT? 2022-04-30 04:56:19 Conveniently and without jumping extra hoops? 2022-04-30 04:56:31 Just handling it in EXPECT seemed like the most straightforward way to me. 2022-04-30 04:57:00 Well they might have made a couple interface decisions that are better than what you're doing 2022-04-30 04:57:12 You wouldn't want standard forth to be better than your forth right? 2022-04-30 04:57:12 If I do this right, then I'll be able to use the major components of EXPECT to handle "each line" in the editor. 2022-04-30 04:57:27 :-) 2022-04-30 04:57:29 No harm in looking anyway 2022-04-30 04:57:40 Ok - where exactly do you recommend looking? 2022-04-30 04:57:55 And no - I have no shame whatsoever about taking good ideas wherever I find them. 2022-04-30 04:59:04 The big working part of EXPECT is READ. It's designed to handle a whole bunch of characters - "line" editing characters - and return if it gets a character it can't handle. But it's designed to be "re-entrant." 2022-04-30 04:59:20 I can start it on a buffer that already has text in it, at a specified cursor position. 2022-04-30 04:59:41 So the editor should just wrap that in something that handles the non-line-oriented characters. 2022-04-30 05:00:09 And QUERY will wrap it with a command history handler. 2022-04-30 05:00:52 Or if you can give me some effective google search terms - that would help too. 2022-04-30 05:02:53 KipIngram: do you know this site? https://vt100.net/ https://vt100.net/emu/ it has a lot of information on vt100 emulators like xterm, it's mostly about displaying control codes, but it's also got recieving control codes 2022-04-30 05:03:24 I am thinking about just re-writing EXPECT (or READ, rather) instead of trying to "adjust" what I've got. It was awfully close to being fine, but this merging of those two different things is a little deeply engrained in it. 2022-04-30 05:03:37 So I may as well re-write it as smart as possible. 2022-04-30 05:03:55 No, I wasn't familiar with that one - thanks. 2022-04-30 05:04:43 I tried once to "nudge" it last night, but eventually broke it and reverted back to a saved source version. 2022-04-30 05:05:11 I'm sure if I re-write I'll harvest a lot of the helper words I've already got - a lot of it doesn't need any change. 2022-04-30 05:07:32 Oh, I like how that site is laid out. Bet that one won't spin up my fan. :-) 2022-04-30 05:07:41 Looks nice and traditional. 2022-04-30 06:14:35 Oh... well, that's kind of cute... 2022-04-30 06:14:38 x:4746454443424140 emit @ABCDEFG ok 2022-04-30 06:15:13 Unplanned side effect of extending EMIT to support UTF8 chars. 2022-04-30 06:16:20 As long as the cell handed to emit is "just a byte," it works exactly as always. But those seven bytes ARE there... 2022-04-30 06:17:23 KipIngram: ehehehe nice feature :-) 2022-04-30 06:18:51 Have to be sure the high byte is never >127, though - then it would hang. 2022-04-30 06:19:07 I'd never get to 0. 2022-04-30 06:20:20 -1 8 >> . -1 ok 2022-04-30 06:21:42 Maybe I need u>> and use that in emit instead of >> 2022-04-30 06:24:23 Good. Did that. 2022-04-30 06:24:41 i belive java uses >>> for unsigned right shift 2022-04-30 06:25:12 but on the other hand forth uses u prefix for unsigned like u< 2022-04-30 06:25:17 or um* 2022-04-30 06:25:50 Right. I have u versions of all of my conditional returns and stuff. 2022-04-30 06:26:05 ah cool 2022-04-30 06:35:19 Looks like rshift in gforth is unsigned. 2022-04-30 06:35:26 logical shift 2022-04-30 06:35:53 In nasm you have shr and sar 2022-04-30 06:35:55 yeah that's in the standard 2022-04-30 06:36:51 nasm seems nice, i made my sectorforth homage compatible with nasm 2022-04-30 06:49:19 I'm really pleased with nasm's macro facilities. 2022-04-30 06:49:37 They do all of my dictionary construction heavy lifting. 2022-04-30 06:49:49 God, I used to do all that by hand. 2022-04-30 07:09:03 Ugh. Dead battery in one of the cars. It wouldn't crank yesterday - I put it on the charger overnight, but it still won't. 2022-04-30 07:09:12 Guess I'm going to the auto shop later. 2022-04-30 07:19:43 You know, things like this READ word can just really open a can of worms. It seems like such a nice, self-contained function. But... exactly how do I want to use it? Do I want to use it in a typical scrolling tty type environment? Or do I want to use it in a situation where I've got the screen divided into several panels and I want each one to behave like a self-contained scrolling tty? 2022-04-30 07:20:21 If the latter, then a lot of intelligence about what parts of the screen it's allowed to draw on wind up having to be considered, and exactly how to set that up is an involved thought process. 2022-04-30 07:20:47 The standard answer a lot of people would give would be "use ncurses." 2022-04-30 07:21:08 But I'm trying not to use any libraries - I'm trying to write something that can port to a bare metal environment. 2022-04-30 07:21:29 Although, even in those cases I'll often be connecting with a terminal emulator, so... 2022-04-30 07:22:04 I can try to "think of everything up front," but that most likely will be wrong and isn't very "Forth honoring." 2022-04-30 07:23:20 So, do I want it to have a boundary on the right that it won't go beyond? And if I do, what do I do with lines that are longer than that? To I write it so they horizontal scroll? 2022-04-30 07:23:25 Lot of little things to consider. 2022-04-30 07:25:18 Forth says don't try to solve problems you don't have yet. 2022-04-30 07:25:25 Just plan to re-write. 2022-04-30 08:55:47 You know, I don't actually see why my cursor is getting out of whack to start with. Printing those three bytes (a utf8 sequence) only moves the cursor one notch. I can't tell where the other motion is even coming from. 2022-04-30 08:56:10 I do print my whole string between keystrokes, but I save/hide and restore/unhide the cursor around that. 2022-04-30 08:56:25 Obviously it's in there somehwere - just gotta find it. 2022-04-30 09:19:04 KipIngram: The extended character wordset section, in Forth 2012 or a more recent pdf 2022-04-30 10:41:36 I've got it mostly working now. 2022-04-30 10:42:05 thinking about the design of an array forth 2022-04-30 10:42:09 Straight typing works with regular and utf8 chars. Cursor control, backspace, home, end. "didn't break" for regular characters. 2022-04-30 10:42:22 So all that's left is to carry those last items to utf8 as well. 2022-04-30 10:42:37 Oh fun - that's a better thing to talk about. 2022-04-30 10:42:43 Please share when you're ready. 2022-04-30 10:42:46 the main thing is doing nesting without tags 2022-04-30 10:43:19 oh, ive not done anything yet 2022-04-30 10:43:26 im just toying with the idea 2022-04-30 10:43:32 That's the best time to talk. :-) 2022-04-30 10:44:28 scalar (unnested) maps and folds are easy enough with the machineforth registers 2022-04-30 10:45:14 assuming that the array address is in a and the xt in b, the core loops are as follows 2022-04-30 10:46:12 : map a@ b execute a!+ ; 2022-04-30 10:46:35 : fold a@+ b execute 2022-04-30 10:47:22 doing nesting is... harder 2022-04-30 10:52:41 of course, this isnt particularly forthy 2022-04-30 10:53:23 i feel you'd be better off with adding defining words that introduce iteration 2022-04-30 10:53:59 like, 2022-04-30 10:54:09 fold: sum + ; 2022-04-30 10:56:59 Yeah, that's the impression I've gotten of array stuff from APL. Obviously there's still an iteration going on - it's just hidden from of us. 2022-04-30 10:58:42 mhm 2022-04-30 10:58:50 that is the entire point 2022-04-30 10:59:16 they've got "bracket" indexing, but they seem to shun it. 2022-04-30 10:59:22 As much as possible. 2022-04-30 11:00:45 besides, an array model seems... almost wasteful? when you have decent primitives 2022-04-30 11:01:20 I think I know what you mean - it does sometimes seem like that "array style convenience" carries some excess labor with it. 2022-04-30 11:01:30 makes sense in idk, ans, but machineforth's address register is simply delightful 2022-04-30 11:01:36 Easy to "do," but it's going to not be a terribly efficient computation. 2022-04-30 11:01:56 Yeah, the address registers were a good idea. 2022-04-30 11:02:49 just need to find something a bit nicer than do...loop and begin...end 2022-04-30 11:02:50 I'm going to use si and di for those, since they work with the rep instructions. I haven't done much with them yet, though. 2022-04-30 11:03:58 is there any way to do postincrement on x86? 2022-04-30 11:04:34 Yes, rsi and rdi will do that with the movsb, lodsb, stosb, and some other instructions. 2022-04-30 11:05:04 Those instructions will increment or decrement the registers, and you can put rep in front of them and do it rcx times. 2022-04-30 11:05:21 huh 2022-04-30 11:06:12 It's actually movs lods stos - the b means you work on bytes, increment by 1. You can go all the way up to movsq, lodsq, etc. 2022-04-30 11:06:19 Which is 64 bits at a shot. 2022-04-30 11:06:30 That adjusts the increment size. 2022-04-30 11:06:43 But you can't do any arithmetic or anything that way. 2022-04-30 11:07:03 You could lodsq do math stosq, but that can't be "repped." 2022-04-30 11:07:57 Have you looked into the SSE/AVX instructions? 2022-04-30 11:08:06 Those work with special 'vector' registers. 2022-04-30 11:08:57 so a@+ can be lodsw reg push eax 2022-04-30 11:08:58 roughly? 2022-04-30 11:09:11 i try to avoid thinking about sind 2022-04-30 11:10:12 Yeah, lodsq for 64 bits. That gets an 8-byte item into rax, which you can then add to your top of stack register. 2022-04-30 11:10:23 Which is probably in another register. 2022-04-30 11:10:43 So for me it would be lodsq; add rcx, rax; next 2022-04-30 11:11:35 But you could also use the AVX stuff to do that to eight elements of a vector in one go. If you had like a "vector stack" and one of hte vector registers was the top of it. 2022-04-30 11:11:48 the (E)SI register is incremented or decremented automatically according to the setting of the DF flag in the EFLAGS register. 2022-04-30 11:11:54 nmmmmmmm 2022-04-30 11:11:56 no like 2022-04-30 11:12:05 Yeah. 2022-04-30 11:12:14 CLD clears it - you get increment. 2022-04-30 11:12:42 The only time I've ever used decrement is for moving a string to a higher address that overlaps the starting string. 2022-04-30 11:12:52 You start that at the high end and work down. 2022-04-30 11:13:40 theres no real reason to have a@- so i guess i dont have to worry 2022-04-30 11:14:13 Yeah, that overlapping string thing is the only case I know. 2022-04-30 11:14:33 But, you do need to do exactly that to open up a spot in the middle of a string to insert into. Nice to be able to do that with rep. 2022-04-30 13:09:19 cursor left and right and home seem to be working. 2022-04-30 13:09:27 Backspace and "end" to go. 2022-04-30 13:09:38 I hardly ever use home and end anyway - don't really know why I put them in. 2022-04-30 13:11:18 eris: I've been interested in the SSE/AVX stuff recently. Really seems ike that's probably the way to go an an array Forth. Either that or GPU. 2022-04-30 13:33:36 KipIngram: does SSE have scatter and gather instructions? 2022-04-30 13:33:56 Yes; I'm not an expert or anything, but I did notice that it had those. 2022-04-30 13:35:45 conditional select or move? that is given a bitvector, source vector, and destination vector, the src[i] gets copied into dest[i] iff bitvector[i] is 1 m 2022-04-30 13:36:06 s/ m/?/ 2022-04-30 13:39:14 It has an emphasis on working with masks. The article I read talked all about how to use mask vectors to selectively do operations on elements of a vector. 2022-04-30 13:39:35 Let me see if I can find the article; one sec. 2022-04-30 13:39:56 s/bitvector/mask/ 2022-04-30 13:40:53 this ties in with that implement Forth VMs with SIMD 2022-04-30 13:43:47 This isn't the one I wanted to find, but it's one I did read the other day: 2022-04-30 13:43:48 http://www.cs.uu.nl/docs/vakken/magr/2017-2018/files/SIMD%20Tutorial.pdf 2022-04-30 13:55:36 I rather write directly in macro assembler than C or variants 2022-04-30 13:59:16 just a stray tought I had: use that GPT-3 Copilot thing to translate psuedo code into compilable code 2022-04-30 14:30:01 Looks to me like there is just know way to handle the "end" key (that sends you to the end of the line) without actually scanning the string. 2022-04-30 14:30:45 For cursor left you know your column on the screen is going to increase by 1, but for "jump to end" you don't know how far it's going to move, and you can't without looking at every character between you and there. 2022-04-30 14:32:10 Ugh. 2022-04-30 14:32:21 NO way. No way, not know way. :-( 2022-04-30 17:44:50 KipIngram: i dont feel like simd is the way to go in forth, it's too abtruse 2022-04-30 17:48:39 aww 2022-04-30 17:48:54 do you not know the length of the string you're in? 2022-04-30 19:21:24 I found it. 2022-04-30 19:23:09 Of course it was obvious and simple once I saw it - that's how it almost always is. 2022-04-30 19:29:18 what was it? 2022-04-30 19:34:23 we are agog 2022-04-30 19:36:18 It was stupid. I re-print my line on each keystroke, and for some reason quite a long time ago I printed two spaces after. This was being called inside a higher level cursor save restore - I just wanted to clean off characters left on the screen when I shortened a string. 2022-04-30 19:36:42 As part of what I was doing more recently I called that word from another place, but this time I wanted the cursor motion it was going to give me. 2022-04-30 19:36:53 I did NOT want the two spaces. 2022-04-30 19:37:07 I just moved the two spaces up a level in the call tree where I did want them. 2022-04-30 19:38:01 So that when I call from the new place I get only the actual string print. 2022-04-30 19:38:23 ohhh 2022-04-30 19:38:25 This is all connected with the fact that you can no longer CALCULATE a large cursor jump. 2022-04-30 19:38:34 Not if some of the chars in between may be utf8. 2022-04-30 19:38:46 There's no way to deal with it withough handling ever character. 2022-04-30 19:38:53 every 2022-04-30 19:39:14 Which of course is totally obvious once you pin the idea down. 2022-04-30 20:17:29 here is an idea, write a word that given an utf-8 string returns an bytearray of how many bytes each codepoint consumes 2022-04-30 21:11:18 I think it depends just on how many bits is required to write the codepoint down. 2022-04-30 21:11:36 You then encode using the fewest number of bytes that will hold that many data bits. 2022-04-30 21:15:43 yebb, but the word is simpler, it just goes through the utf-8 string and tallies up the bytes used by each codepoint, even if some funkyness occured at encoding time 2022-04-30 21:26:01 Well, how does it do that tally? This was all described in the wikipedia article. According to here: https://en.wikipedia.org/wiki/UTF-8#Encoding, one byte gets any 7-bit code, 2 bytes gets any 8-11 bit code, 3 bytes gets any 12-16 bit code, and four bytes gets any 17-21 bit code. It's required to use the shortest possible byte count. Nothing has more than 21 bits in its code point value. 2022-04-30 21:26:27 So I would just note the bit position of the highest 1 and apply those ranges. 2022-04-30 21:27:15 I think EXPECT is working properly on UTF-8 now, though all I've done is just the trickiest test patterns I could think of on the fly. No sort of "exhaustive" verification. 2022-04-30 21:27:31 But all the editing keys seem to work as one would expect. 2022-04-30 21:30:36 I wound up handling "end of line" by computing "string length minus insert point" and calling my cursor right routine that many times. That "tacitly" scans the pertinent part of the string, since cursor right has to check to make sure it doesn't stop over a "not first" byte of a character. 2022-04-30 21:34:37 So, back when ASCII was first conceived and deployed, why were the averse to having the MSB of the char bytes set? Was that used as an extra parity bit or something? 2022-04-30 21:35:01 To me these days it feels like they just threw away half their code space. 2022-04-30 21:35:51 I'm not young, but I'm not THAT old - I wasn't around for that. :-) 2022-04-30 21:37:21 ACTION hands KipIngram an 7 hole papertape from ASR 35 as a explanation 2022-04-30 21:37:46 I was curious about it too 2022-04-30 21:39:39 AHA. 2022-04-30 21:39:43 That makes sense! 2022-04-30 21:39:50 That's a pleasing explanation. 2022-04-30 21:40:03 Good god, and we're STILL carrying the baggage. 2022-04-30 21:40:17 That's the same thing we were talking about re: processors the other day. 2022-04-30 21:40:25 The burdens of legacy. 2022-04-30 21:40:59 yeah the octal fetish of the original x86 still shines through 2022-04-30 21:41:54 and I say nothing of the wierdness of ARM, 65C816, PowerPC, or RISC-V 2022-04-30 21:44:11 hence why I am so interested in BitGrid, and making a BitGrid based fpga/cpld using sram (or fram/memristors) for the memory cells 2022-04-30 21:45:38 I think open source design of BitGrid chips would be handy, specially for the opensource ecology project 2022-04-30 21:47:15 even at micron node (read: minimum feature size) such a design will be quite usefull 2022-04-30 21:47:59 I am all for open source / grass roots anything. The more things we can pry out of the "exclusive hands" of big corporations the better. 2022-04-30 21:48:26 I've always so wished that the DIY grassroots IC fabrication stuff could do better. 2022-04-30 21:48:34 specially if you can do corondium (aloxide) or rubium (copperoxide) substrate based chips for rad harded chips 2022-04-30 21:48:39 It's "there" - there are some projects - but they're woefully behind the curve. 2022-04-30 21:49:14 Which means the corporations get to dictate to us what we get to do with silicon. 2022-04-30 21:49:49 what I have in mind are chips fabricatable in garage type setup 2022-04-30 21:49:57 YES. 2022-04-30 21:50:00 Me too. 2022-04-30 21:50:37 I'd like to see "kitchen witches" making chips and gadgets and stuff. 2022-04-30 21:50:54 not the bleeding edge, more toward blunt stone ax direction, (See John Tree of Primitive Technology on youtube) 2022-04-30 21:51:10 That's really where all of the truly truly great ideas come from most of the time anyway. 2022-04-30 21:51:53 Yeah, I understand that we're not going to suddenly be making state of the art stuff at home. But if we could even do, say, 20 years back tech. That would be fabulous. 2022-04-30 21:52:04 I'm talking here about process geometry. 2022-04-30 21:52:37 And the advantage we'd have is that we don't need huge yield on massive production runs. We just need to be able to get a working chip without TOO much trouble. 2022-04-30 21:52:50 We don't need production quantity scale gear. 2022-04-30 21:53:20 How about an ion implantation gun we can maneuver like a printer head? 2022-04-30 21:53:26 what about process geometry? I think there are good enough designs from the 80's or 90's available from universities 2022-04-30 21:53:30 Just "paint" our chips. 2022-04-30 21:53:45 Inside a chamber the size of an aquarium or something. 2022-04-30 21:54:11 I haven't checked in on it in quite a while. 2022-04-30 21:54:27 The last time I did, the "bragging project" was etching someone's name on a wafer. 2022-04-30 21:54:45 oh, I see. You can use cathodray gun for the implantation and even electrography 2022-04-30 21:54:49 Pretty small, but... it also wasn't terribly pretty. 2022-04-30 21:55:16 I need to dip back into that. It really is something I get pretty excited about. 2022-04-30 21:56:00 This is the tech that has changed the world more than any other in the last few decades - we need to grass roots it.