00:00:00 --- log: started forth/21.04.05 00:02:39 --- quit: dave0 (Quit: dave's not here) 02:18:07 --- join: dave0 joined #forth 02:20:01 maw 02:25:10 --- join: f-a joined #forth 02:59:08 --- quit: f-a (Ping timeout: 240 seconds) 03:01:25 --- join: f-a joined #forth 03:09:08 --- quit: f-a (Ping timeout: 240 seconds) 03:11:08 --- join: f-a joined #forth 03:17:26 My Z80 Forth has one instruction it can generate, which is CALL, because it's a direct threaded forth so I use CALL when adding words to the dictionary 03:17:46 And then will I ever add more.... stranger things have happened 03:28:02 proteus-guy: sectorforth is awesome 03:28:30 The numbers remind me of how I did numbers in my forth before I wrote >NUMBER 03:29:25 But there is a wow factor with fitting it in 512 bytes and quickly I'd rather just have a larger forth that can do stuff without painful intermediate work :P 03:39:11 There's definitely educational value in things like that too 03:57:42 proteus-guy: That's VERY nice, sir. I've always wondered what could be accomplished at the extreme simple end; there it is. Excellent! 03:58:16 I should try to do one someday, but so far I've just always wanted a high-performing system. 04:07:22 A nannd primitive - I'm enough of a hardware guy to know that was the logical approach - it's what I'd have tried to. 04:07:27 Thanks so much for sharing. 04:07:58 I intend to share this one I'm working on too - I haven't actually shared one with the world yet, but I think this is the one I'll be proud enough of to do so with. :-) 04:08:22 It's "basis" is clean - I'm very pleased with the macros that construct the dictionary and so on. 04:10:45 I'm including the entire "orthogonal set" of conditional returns and looping words - but over this past weekend I produced a Python tool for generating the source of those automatically, using "virtual instructions." So I'm hardly going to count those as required port items, since once a working set of irtual instruction macros have been created you get them more or less with no porting work. 04:11:34 I really need to experiment with qemu, or a similar tool. 04:13:22 I like the 4k input buffer. 04:13:34 What can I say? I like the whole approach. Well done. 04:16:10 So you've reserved one bit in the count byte of names for future use? Looks like you're not doing anything with 0x20 yet. 04:16:36 Oh, yes - you say so. 04:18:50 My target for this effort is a nasm file that will assemble and run on MacOS and which is capable of LOADing 4k source blocks from a BLOCKS.DAT simulated disk file, and then a BLOCKS.DAT file which provides a reasonable set of development tools, including a source editor. 04:19:24 The second target will then be to provide a BLOCKS.dat file which is capable of recompiling the system, along with full source for doing just that. 04:20:03 So if I include a MacOS binary in that second target, one should be able to start using and changing the system immediately without having to actually use nasm. 04:21:00 The idea is for that to be a near-optimum performing system, so obviously it lands in a different design point that sectorforth. 04:21:21 When that second target is achieved, though, you should be able to use the system to cross-compile for other targets. 04:22:39 --- quit: jess (Quit: Changing server) 04:22:48 I expect the first target to do a full handling of normal Forth interpretation errors, with a restoration of the system to its "Enter key" state when a typed line produces an error. 04:23:21 --- join: jess joined #forth 04:24:18 The first target will have slightly less than optimal NEXT and (:), (var), and (constant), because of requirements imposed by the Mac-OS MACH-O execution format. But the second target should rebuild a system that has optimal versions of those things (absolute addresses in the image). 04:24:36 Instead of offsets that the code handlers have to produce absolute addresses from. 04:27:18 The first target will offer my own crafted set of control structures in the nasm/binary source, and will offer standard control structures via BLOCKS.DAT source (I'll probably arrange it so that 1 LOAD loads the "completion" source from BLOCKS.DAT). 04:27:51 Second target will rebuild with all standard controls structures and my own structures available. 04:31:47 Man, getting the whole thing into one 512b sector is very cool. :-) 05:02:56 Oh, interesting, proteus-guy. Your : word is written in assembly. 05:03:39 --- part: f-a left #forth 05:32:55 Heh - there's a Chuck quote in that website we got the link to yesterday. 06:08:13 is there a standard/best practice way to create a 2d array in forth? 06:17:34 Not that I'm aware of - the piece of the Forth mind set that seems to apply there to me is to do whatever makes the most sense for your application at hand. 06:17:39 What's going to be in your array? 06:18:01 Do the rows or columns have significance of their own? 06:18:12 Or is it truly 2D data, like the pixels of a photograph? 06:23:17 If the rows or columns do have significance, then store it and access it by rows, or columns. I.e., have a "vector of vectors." If it's really 2D data, then you'll probably be interested in "neighborhoods" within the data, like to apply Laplacians in image processing etc. - in that case the stride dimension needs to be part of what's stored, so that you can find the neighbors of any item. 06:24:03 this is for a map in a game 06:24:11 so it is truly 2d data I suppose 06:24:19 but not that needs to have much fancy stuff done to it 06:24:40 Yes, I think so. Ok, well, then you need to store it in a way that lets you identify neighborhoods. Whether you store by rows or columns is probably not too significant. 06:25:02 stride dimension? 06:25:26 If a matrix is stored by rows, first row 1, then row 2, etc. - thenn the row length is the stride. 06:25:34 If it's stored by columns, then the column length is the stride. 06:25:50 How far do you have to step in memory, to reach the same item of the next row/column? That's the stride. 06:26:06 ah ok 06:26:07 It's not some big official term or anything, but I've seen it used. 06:26:14 this doesn't really have to be performant either tbh 06:26:25 any way would likely work 06:27:13 Right. Well, FORTRAN stored arrays by columns. Most other languages have you think of it as a vector of vectors - the innner vectors can be rows or columns; it's really up to you. 06:27:50 One thing you should decide is whether you want to think of accessing it as map(x,y), or map(x)(y). See the difference? 06:28:08 In the first case you're considering a 2D thing - in the second you're considering a 1d array of 1d arrays. 06:28:26 ah ok 06:28:35 In Forth you invent your "way of thinking," and then code it. 06:29:09 A popular slogan/phrase in a lot of the Forth books is that you "develop a language for talking about your application." 06:29:19 And the Forth words are words in that language. 06:29:49 And the more intuitive that language can be to a user, the better. 06:34:21 yyeah 06:40:34 So hey, how did you run across that xxiivv.com website? That's kind of an interesting place. 06:40:42 Weird mix of tech, philosophy, etc. 06:41:30 Guy seems to have drunk the open source / techno anarchist kool aid in a pretty major way. :-) 06:41:36 it's a fun site, I've actually been messing with uxn recently which is made by the same person 06:41:47 they hang out on freenode some places 06:41:48 --- join: f-a joined #forth 06:41:51 and mastodon 06:42:00 Yeah, that uxn bytecode is kind of interesting. 06:42:13 I haven't decided just how "good" I think it is, but it's interesting. 06:42:51 The flexible way it deals with either bytes or words - that's a twist I haven't really seen before. 06:43:24 Usually in Forth you have a lot of words that deal with whatever your system word size is, and then you have some side words that let you do stuff with bytes, etc. 06:43:38 But uxn has the dual support rooted very deeply in the encoding of the bytecode. 06:43:48 yeah, it's interesting 06:44:12 And the dual use of data and return stack - that's equally "bilateral" and encoded. 06:48:36 I found it from orca originally 06:49:06 which is another one of the same person's projects 06:49:14 an unusual music sequencer/livecoding environment 06:49:53 Well, the whole site has an interesting "exotic flair" to it. 06:50:00 "Unusual stuff." 06:52:15 It feels like a lot of effort went into aesthetic, but that's not really a turn-off. I am encouraged by how short the programs are 06:55:12 yeah, I really enjoy the xxiivv aesthetic and software development philosophy 06:55:39 I was a member of https://merveilles.town for a bit (the same guy's mastodon instance) but it felt a bit culty 06:56:50 they had a policy of setting any personal posts to unlisted which I was very not comfortable with 06:57:02 but yeah, xxiivv is cool. There's just a slightly culty culture around it imo 06:57:10 All these software cults feel like cults 06:57:46 merveilles very much had the vibe of being a bit of a cult, I ended up moving back to my old mastodon instance and just following people there rather than being part of it 06:57:59 There are a lot of groups online that have good ideas, and where their communities are dominated by weird or toxic people 06:58:01 Devine is a really chill person tho, I think the vibe of merveilles being a bit weird was by accident 06:58:27 The issue is communities get dominated by people who have a lot of time on their hands, and usually those are not the 'best' of us.... 06:58:31 That is my opinion 06:58:43 That is a very reasonable hypothesis. 06:58:53 The highest quality people are usually busy. 06:59:06 Busy pursuing something other than "celebrity status." 07:01:00 --- quit: APic (Ping timeout: 240 seconds) 07:01:26 idk how people like Devine manage tbh? like, either they don't talk about work at all 07:01:36 or they can somehow spend all their time doing random personal projects like uxn 07:01:53 I've no idea how somebody has an income source while living on a boat sailing around the world making open source 07:02:31 Some people just have money 07:02:39 --- join: APic joined #forth 07:02:58 And also as I've gotten older I've found it easier and more rewarding to work rather than talk about what I'm doing 07:04:01 tbh idk how you live on a boat. like, it seems fun but I don't think I could live with having such a small space 07:04:09 everybody's different ig 07:04:30 I think we should all know how to live in isolation after 2020 07:04:57 It's something I would do if I was a bit more disconnected, but as it is I'm engaged and actually have some social ties 07:07:04 idk how I want to live tho, tbh 07:07:26 however I end up living I don't want to be alone or with people I dislike, I learned that from 202 07:07:28 however I end up living I don't want to be alone or with people I dislike, I learned that from 2020 07:25:11 Engaged is good, veltas. Family is good. My wife and daughters are the backbone of my life. 07:25:20 Congratulations. :-) 07:25:23 Thanks 07:25:32 One of my daughters just got married in December. 07:25:39 Nice 07:25:54 Two married - there not yet. Well, two not yet - one just 16. 07:26:03 So I shouldn't count her yet. 07:26:33 good luck to the newlywed 07:26:46 Thank you - they seem to be off to a good start. 07:26:56 Fingers crossed - they're quite young. 07:30:08 finished «The Metamorphoses» by Apuleius, what a book! 07:34:50 Did you read it in Latin? 07:34:55 Or a translation? 07:35:31 parallel text LAT/ITA, tho my latin would be insufficient to read it w/o a translation 07:36:28 --- quit: dave0 (Quit: dave's not here) 07:38:35 Nice. 07:39:00 Sometimes I think the days when we were all challenged to learn Latin (if we wanted to call ourselves well educated) were better. 07:39:05 Maybe not. 07:39:14 I just hope we haven't given something up. 07:39:29 If you "have Latin" at all you're ahead of me. 07:39:45 I've told myself a couple of times I'd self-study it. 07:39:48 Found some websites. 07:39:49 veltas, i think for an assembler, easier to implement is what you want to avoid 07:39:54 Yeah... uh, no - that went nowhere. 07:40:24 I'd think you'd want your assembler to be easy to *use*. 07:40:40 at least if its something youre actually going to use to write assembly with. if its just a toy project then easy to implement is fine 07:41:11 My other thought on that would be that you don't necessarily need a COMPLETE coverage of an instruction set for it to be (very) useful. 07:41:27 My x64 assembly coverage is rather meager, but I can still do a lot. 07:41:55 surr if you can make it easy to implement and easy to use then go for it. those 2 things dont tend to correlate for something like an assembler 07:41:58 I have no intention ever of trying to support the entire x64 instruction set - it's a monster. 07:43:01 one of my pet peeves is all the harebrained schemrs people come up with because parsing syntax is hard 07:43:26 ie LDA #5 vs LDA 5 07:44:12 some people make assemblers that only accept LDA_IMMED 5 and LDA_ZP 5 07:44:27 ZP? 07:44:55 latin today is less difficult 07:45:02 you can even use duolingo etc. 07:45:09 any language today is easier to be fair 07:45:15 so you saved yourself a small amount of work implementing the assembler and will more than make up for it in wasted time if you actually write assembly for it 07:45:25 I started learning latin 07:45:46 but duolingo for latin isn't too great, and I started reading lingua latina per se illustrata and just couldn't find the motivation to continue with it 07:46:05 because you have to learn so much before you get to the point you can read anything even remotely like an actual text 07:46:15 KipIngram, zero page on 6502 07:47:32 LDA 5 is a different instruction than LDA 1005 since 5 fits in one byte 07:49:32 I see. 07:49:58 Yes - I'd want the assembler to decide that for me - I wouldn't want to have to keep up with it myself. 07:50:12 256 < is not that hard to type... 08:33:28 --- mode: ChanServ set +v crc 08:33:49 --- mode: ChanServ set +o crc 08:58:55 --- join: Zarutian_HTC joined #forth 09:05:47 KipIngram, yes the NAND primitive is pretty cool. And were I to make a boot sector forth it would definitely take up a few more sectors. But this offers a lot of inspiration. 09:14:25 I think it's way cool. :-) 10:03:40 --- quit: f-a (Quit: leaving) 10:04:03 --- join: f-a joined #forth 10:16:29 --- quit: Zarutian_HTC (Ping timeout: 240 seconds) 10:19:50 Aha, that find code is working. 10:20:20 I made one mistake typing it in. I have a word called .w@ that is supposed to fetch 16 bits from an address but keeps the address too (because of the .). 10:20:36 When I coded it I used dword to specify the fetch size, instead of word. 10:20:45 Took a while to chase that down. 10:21:19 But now it fires up and lets me type lines at it. It parses those lines into words, and then prints out, one word per line, the words it finds, but not the words it doesn't. 10:21:26 And it seems to be doing that perfectly. 10:21:36 Checked both ends of the dictionary as well as in the middle. 10:22:00 The code is there to search multiple vocabularies, but I only have one right now, so part of it is untested. 10:22:10 Guess I could put FORTH in the list twice. 10:22:26 Or make a stub vocabulary - that would be better. 10:22:29 Or just wait. 10:23:25 --- quit: _whitelogger (Remote host closed the connection) 10:26:24 --- join: _whitelogger joined #forth 10:36:41 --- quit: f-a (Read error: Connection reset by peer) 10:36:51 --- join: f-a joined #forth 10:55:33 --- quit: gravicappa (Ping timeout: 240 seconds) 10:57:17 --- quit: djinni (Quit: Leaving) 10:57:41 --- join: gravicappa joined #forth 11:07:58 --- join: djinni joined #forth 11:15:37 Milestone! 11:15:44 It executes found words now. 11:15:49 It's an interpreter! 11:15:55 clap 13:09:33 --- join: tech_exorcist joined #forth 13:17:25 --- quit: f-a (Quit: leaving) 13:29:22 --- quit: tech_exorcist (Remote host closed the connection) 13:29:43 --- join: tech_exorcist joined #forth 13:31:03 --- quit: tech_exorcist (Remote host closed the connection) 13:31:24 --- join: tech_exorcist joined #forth 13:32:00 --- quit: gravicappa (Ping timeout: 240 seconds) 13:32:44 --- quit: tech_exorcist (Remote host closed the connection) 13:33:05 --- join: tech_exorcist joined #forth 13:34:25 --- quit: tech_exorcist (Remote host closed the connection) 13:34:45 --- join: tech_exorcist joined #forth 13:35:48 --- quit: proteusguy (Ping timeout: 260 seconds) 13:36:07 --- quit: tech_exorcist (Remote host closed the connection) 13:36:22 --- quit: lispmacs[work] (Remote host closed the connection) 13:36:28 --- join: tech_exorcist joined #forth 13:37:47 --- quit: tech_exorcist (Remote host closed the connection) 13:46:41 --- join: tech_exorcist joined #forth 13:47:59 --- join: proteusguy joined #forth 13:47:59 --- mode: ChanServ set +v proteusguy 13:48:02 --- quit: tech_exorcist (Remote host closed the connection) 13:48:24 --- join: tech_exorcist joined #forth 13:49:35 --- quit: tech_exorcist (Remote host closed the connection) 13:50:15 --- join: tech_exorcist joined #forth 13:54:48 --- join: Zarutian_HTC joined #forth 13:55:23 --- quit: wineroots (Remote host closed the connection) 14:25:34 --- join: lispmacs[work] joined #forth 14:53:40 --- join: dave0 joined #forth 14:54:15 maw 14:56:22 wam 14:56:41 hi kiedtl 14:56:47 ehlo 15:23:47 --- quit: lispmacs[work] (Remote host closed the connection) 15:24:33 --- join: lispmacs[work] joined #forth 15:26:54 So, this thing seems to be working just fine, doing as much as you could expect with no number input and "interpret only" operational. No error messages yet, though. It just ignores words it can't find and executes ones it can. 15:27:19 I can exercise things fairly well - for instance bl bl + 1+ should put me an "A" on the stack. 15:27:31 Then I can muck arounnd for a while and then emit. 15:29:10 I have my BLOCK word written so that if BLK is zero it returns the tib. The other case is currently stubbed out. 15:32:02 --- join: Zarutian_HTC1 joined #forth 15:32:02 --- quit: Zarutian_HTC (Read error: Connection reset by peer) 15:54:49 --- quit: Zarutian_HTC1 (Ping timeout: 260 seconds) 16:03:23 --- join: Zarutian_HTC joined #forth 16:26:41 --- quit: tech_exorcist (Ping timeout: 265 seconds) 17:15:57 --- quit: Zarutian_HTC (Remote host closed the connection) 17:16:24 --- join: Zarutian_HTC joined #forth 17:19:35 --- quit: Zarutian_HTC (Remote host closed the connection) 17:37:50 In case annyone is interested, my FINND implementation is here: 17:37:54 https://pastebin.com/0nF7Cjti 17:38:10 That handles searching a linked list of vocabularies, accessed through variable PATH. 17:39:38 This is the first code I've written with stack frames and exception processing in mind from the start. 17:40:50 The bulk of the code handles full navigation of the structures, without regard for finding a match. The success case is handled by exception. 17:43:33 --- quit: proteus-guy (Ping timeout: 240 seconds) 17:47:45 I'm happy with how that bit of development went - I wrote it offline over the course of a few days, and then plugged it in. I made one transcription error - I put a single return at the end of check instead of a double return. 17:48:53 And there was a design error. I don't know if I mentioned it or not, but I had it in mind that I didn't need BLK and >IN because I could put that information in a stack frame. That's how I coded it. But that's no good (and I should have realized it wasn't) because INTERPRET is run inside that loop and has to be able to change the stack. 17:49:31 When I thought of that I whacked myself in the head and changed it in a couple of minutes (put in BLK and >IN), and then it worked. :-) 17:55:49 --- join: proteus-guy joined #forth 18:17:52 --- quit: dave0 (Quit: dave's not here) 18:21:28 --- quit: lchvdlch (Ping timeout: 240 seconds) 18:23:30 --- join: lchvdlch joined #forth 18:40:53 --- join: boru` joined #forth 18:40:56 --- quit: boru (Disconnected by services) 18:40:58 --- nick: boru` -> boru 19:12:13 --- quit: shmorgle (Ping timeout: 260 seconds) 20:01:58 --- quit: lchvdlch (Ping timeout: 268 seconds) 20:12:55 --- join: shmorgle joined #forth 21:01:17 --- join: dave0 joined #forth 21:05:29 Fun fun - I logged into Pastebin tonight, for the first time in years. Quite a few years ago I spent some time thinking about building a computer, out of discrete chips. The idea was to have a guaranteed back-door free machine, that I knew the full workings of. 21:05:48 I got a design done for the data stack, and it looks like I documented it on Pastebin: 21:05:56 https://pastebin.com/nfLqb58q 21:06:07 Has the pinout and the logic equations. 21:06:25 And an instruction set encoding. 21:07:07 I assume I felt at the time that those equations would implement that instruction set. I didn't slug through it tonight to confirm, though. 21:07:31 Used 22V10 programmable aray logic. 21:33:29 You guys might enjoy this: 21:33:30 https://www.cs.princeton.edu/~mfreed/docs/cuckoo-eurosys14.pdf 21:34:00 It decribes something called cuckoo hashing. Looks like it could potentially have application to Forth dictionary storage. 21:34:39 As the hash table becomes full, inserts take longer and longer, but the lookup time is always bounded. 21:35:02 With a four-way set associative model you wind up using about 95% of your hash table space. 21:37:08 For a lookup, at most you would compute two hashes of the name and then potentially search a set of 8 items to find the one of interest. 22:20:43 --- join: gravicappa joined #forth 22:37:33 --- quit: proteusguy (Ping timeout: 260 seconds) 23:29:09 --- quit: dave0 (Quit: dave's not here) 23:31:43 --- join: proteusguy joined #forth 23:31:43 --- mode: ChanServ set +v proteusguy 23:59:59 --- log: ended forth/21.04.05