WEBVTT 00:00.000 --> 00:28.800 All right. Let's get started. My name is Hans. I'm a programmer, a hotber tanker, if you will, 00:28.800 --> 00:38.400 and the retro computing enthusiast. And recently, someone gave me this beautiful 1980s 00:38.400 --> 00:45.200 Rafi terminal, which is a lithium-text terminal. It didn't have a keyboard, but the alternative 00:45.200 --> 00:52.960 would have been scrappy art, so I kind of saved it from that. And motivated by having that, 00:52.960 --> 01:01.760 I came up with a plan on the idea to recreate the whole built-in text experience using the 01:01.760 --> 01:09.760 web browser, if you will. So what is built-in text? Many of you will not know. It is kind of a public 01:09.760 --> 01:17.440 data system, a predecessor of the internet, which was launched in Germany in 1983. It was run by the 01:17.440 --> 01:24.080 German, or the predecessor of German telecom called Dr. Bundespost. And back then, everything was totally 01:24.080 --> 01:36.160 regulated. So of course, you had to have a permission to connect your software to the public network. 01:37.440 --> 01:44.080 So everything was very tightly controlled. He also didn't really own the decoder, the modem hardware 01:44.160 --> 01:51.040 that you used to enter the system. It was rented by the state to you. The modem even included the 01:51.040 --> 02:00.000 user ID that you would use in the video text system. It was meant for like normal people, 02:01.120 --> 02:10.080 sitting on their couches, browsing information, booking, travel, maybe buying stuff online, 02:11.040 --> 02:18.640 and also sending messages. So it was kind of a end-user system. And just to set the stage where we 02:18.640 --> 02:25.120 are in history, I mean, we are like at the beginning of the home computer illusion. So there was 02:25.120 --> 02:35.760 Apple II IBM, C64 that was kind of what we had at that point in time. So I mean, it wasn't without 02:36.160 --> 02:41.280 predecessor. So some of you may know plateau, but there was also computer in the U.S. which was 02:41.280 --> 02:52.880 kind of a similar system, not state run, but similar. And Richard text directly is directly related 02:52.880 --> 03:01.840 to Prestler, which is a UK system, a similar kind of technical nature. So your terminal, as I said, 03:01.840 --> 03:09.920 was the TV, that time the TV was the only screen in your home typically. So you wouldn't have 03:10.720 --> 03:16.160 normally have a computer, and then we have a telephone, of course, the symbolizing the phone line 03:16.160 --> 03:26.400 and the remote control would be your input. And then you would rent this beautiful little modem 03:26.400 --> 03:34.160 from the Deutsche Bundespost, which could do 1200 to 75 pods. So it would receive at 1200 03:34.160 --> 03:40.720 and send at 75, the idea being that you would really just be a consumer and not a producer of 03:40.720 --> 03:48.640 content. So you didn't need a big upstream 1200 was pretty slow. 75 really was just for typing 03:48.640 --> 03:56.800 and stuff. And then the server side of things was based on mainframe technology. It is 03:56.800 --> 04:02.160 difficult at this point in time to figure out what exactly constituted the the built-in text 04:02.160 --> 04:10.480 system. So this is a similar vintage, Z-Men's mainframe. Some say the software was written 04:11.280 --> 04:17.360 in the UK and then ported to to Z-Men's machines, others say, well, it was all home-grown. 04:18.640 --> 04:26.640 Actually, we don't really know. So my plan is to reproduce all of that. So instead of this, 04:26.640 --> 04:34.640 of course we have a web browser, we have a web socket for this, and we have some software written 04:34.640 --> 04:41.040 in common list for that. So my first step, and I mentioned it briefly, was I needed to recreate 04:41.040 --> 04:49.120 the keyboard. And this was really, I didn't have a keyboard at first, so I found someone who could 04:49.120 --> 04:56.160 borrow me one. And what you see here is a creator's keyboard, which is for people who create 04:56.160 --> 05:02.960 pigeon text pages. So it has a special keys, for example, for selecting a color of selecting a 05:02.960 --> 05:09.920 character set. It also has this neat little cheat sheet that tells you what graphic characters 05:10.000 --> 05:16.800 are on what letters here, and so on and forth. So a typical and user terminal would be much smaller, 05:16.800 --> 05:27.120 but this is really the full thing. So what I did is I wrote an XML description of this keyboard. 05:28.960 --> 05:34.720 I mean, you know, Jason, so XML is pretty similar, if you don't know it. And then, 05:35.280 --> 05:47.760 and then I went full XML. So XSLT is my favorite programming language, I would say. 05:51.040 --> 05:57.600 I mean, it's really good. It's really good, not just because it serves this purpose well, 05:58.480 --> 06:04.320 but also because it is really homo-economic, which is something that the list guys always tell you 06:04.320 --> 06:10.800 well, it's homo-economic, but it's not true, because they don't use this as the surface syntax 06:10.800 --> 06:18.240 and XSLT does. So we can, and this is why this program, this is a part of an XSLT program, 06:18.240 --> 06:26.880 is XML, because it follows all the rules of XML. And, well, this is really just the header, 06:26.880 --> 06:34.720 and a new feature in XSLT is accumulators that allow you to stream without really relating to 06:34.720 --> 06:40.960 using mutation for that. So what I did is I met from this description file that I showed in the 06:40.960 --> 06:46.960 beginning, which has a key entry for like the lock on the top left and the key codes and something 06:46.960 --> 06:54.320 like spaces here to rules that match these elements. Like here, we have a space with a 06:54.320 --> 07:01.280 has built busy let attribute this one, and that would create this piece of SVG. And likewise, 07:01.280 --> 07:11.120 we have a key with an LED. I would create that, that piece of SVG code. And, well, of course, 07:11.120 --> 07:17.360 you can, you can access variables or attributes from your input elements and the accumulators 07:17.360 --> 07:22.720 that are defined here. So it's a very good mapping language, and I can recommend it to everybody. 07:24.480 --> 07:31.280 And that's how it looks like. So this is the SVG that at this piece of art creates. 07:33.760 --> 07:41.920 The next thing that I needed to do was to extract the font from the terminal, because, of course, 07:41.920 --> 07:50.960 they have fancy special characters, and I wanted the emulation of that to be as faithful as possible. 07:51.920 --> 07:59.040 I pondered whether I wanted to look at the ROMs and then try to decode how the characters 07:59.040 --> 08:07.120 are represented in the ROM, but then went for this very straightforward scan converter, HMI, 08:07.120 --> 08:15.280 USB solution so that I have an image of my character set like this, and then write a bit of, 08:15.360 --> 08:22.000 well, this is actually the code that generates these pages. And then, well, then what? 08:22.000 --> 08:29.200 So I kind of thought it shouldn't be too hard to make this into individual images for each 08:29.200 --> 08:34.000 character for each glyph, but I didn't really know how, so I asked chatchipiti. 08:34.960 --> 08:44.640 You know, I asked it, and it's suggested I need to do this, yes, okay, 08:45.840 --> 08:53.360 but how can I somehow avoid dealing with the details of that, and it's suggested this 08:54.160 --> 09:03.680 kind of specialized font creating programs. I said, well, there was gimp on the bottom, so I tried 09:03.680 --> 09:11.440 gimp, I cannot use it, I don't know why, I just don't manage to, and then I asked it to, 09:12.480 --> 09:19.440 to write me a script, to help me do that. And it was really, I mean, all of you know, 09:19.440 --> 09:25.360 that is kind of scary, and fascinating to work with LLMs. This was scary, and fascinating, 09:25.920 --> 09:31.520 because I told it, well, what me through the script, and then there was a dialogue of how, 09:31.600 --> 09:39.520 what I wanted to do, I wanted a grid, so that I can select my glyphs, and then write that to files. 09:40.560 --> 09:47.280 And it created something for me, which I tuned a little bit, so like parameters here and there, 09:47.280 --> 09:54.240 and make this happen, but as you can see, I have these lines here, and then I can just close the 09:54.240 --> 10:00.400 window and it saves all the other things to individual files that was just a fun experience. 10:02.320 --> 10:11.440 So, Act 3, the emulator, the actual, like, display of the data stream on the channel screen. 10:12.240 --> 10:17.200 And that was, I mean, this specification, I wanted to carry it here, I couldn't because it's to heavy, 10:17.200 --> 10:27.680 it's a book that specifies how the encoding for this channel works, and most of you are many of 10:27.760 --> 10:33.040 you will know ANSI terminals or other terminals, so you have control codes, and you can position your 10:33.040 --> 10:43.280 cursor. This is on a different level of crazy. The craziness is not just that it is very, 10:43.280 --> 10:48.640 like, a detailed oriented, and you need to save all the bits, and you don't have a lot of bandwidth, 10:48.640 --> 10:54.800 so you need to be very, very efficient with you, and coding it is also from the perspective of 10:54.880 --> 11:01.120 the language that they use, it is really annoying, because with your standard computer knowledge, 11:01.120 --> 11:06.560 it is difficult to understand. The LSet is involved in two columns two to seven of the eight 11:06.560 --> 11:13.840 bit code, yes, well, everything is in pages and columns and rows, it's really, I think it's 11:13.840 --> 11:20.480 madness. So, yes, but it is, in the end, it is just straightforward, if then, if then, if then, 11:20.640 --> 11:27.920 case, case, case, case, case, case, and then a little bit of drawing, and a little bit of copying, 11:27.920 --> 11:34.080 and that was just, I mean, that was not difficult, and the kind of striking thing for me was, 11:34.480 --> 11:41.280 I didn't really need to optimize anything, the browser is, or the V8 engine, or the browser's 11:41.280 --> 11:46.880 JavaScript engine is so fast that I can just take my bits and put them there, color them, and it's 11:46.880 --> 11:57.840 done. So, actually, I have a good subset of the standard implemented, so this is really, of course, 11:57.840 --> 12:03.520 something that you need to implement the user-defined characters, where you can say, okay, 12:03.520 --> 12:10.480 this character has these bits and that, and this is, well, one of the pages that I have. Now, 12:11.040 --> 12:18.320 at four, the mainframe side of things, I happen to know one of the people that 12:19.360 --> 12:27.600 that author these pages, the CCC pages back in the 80s, so I had these Victor, 12:29.200 --> 12:36.560 serious disks, which are difficult to read, but I managed, and I found the form of specification 12:36.640 --> 12:45.280 for the files that are used to upload files to the central system. So, what I did is I took that 12:45.280 --> 12:54.960 specification, I copied and pasted those definitions into a text file, then wrote a little bit of 12:54.960 --> 13:06.000 communist code to parse that text file into field definition instances, and then this becomes a 13:06.000 --> 13:13.520 macro defined BTL class, BTL is this upload format that defines a class based on the file that we read here, 13:14.960 --> 13:23.200 and also an initializer that receives an input buffer with the data, and that sets all the fields 13:23.280 --> 13:33.440 to the respective data values, with the goal that, or, and so this is, of course, this, some of 13:33.440 --> 13:40.640 you know come in those who don't, here's some pattern matching and come in on the code level, 13:40.640 --> 13:48.800 so generic functions can specialize on any of the arguments, so I'm specializing on the second argument 13:49.440 --> 13:57.040 here, and if that is a, a symbol called bin, then this code is executed, if, if that second argument 13:57.040 --> 14:03.280 is the symbol bit, then this will be called, so bit manipulation and all kind of all kind of 14:03.280 --> 14:14.640 crazy stuff, so with the result that now in my code that parses the file, I can use these identifiers, 14:14.720 --> 14:18.960 which are directly from the documentation, and I, I happen to like that, so I can look at the 14:18.960 --> 14:25.360 documentation, okay, this field means that, and then kind of, kind of write some code to to do that, 14:25.360 --> 14:38.240 so a little bit of a demo, I hope this, the demo gods are in my favor, but it doesn't look too bad, 14:38.320 --> 14:50.320 so I'm, I'm going to reload the page, if I can, so I'm going to reload the page, and you will notice 14:50.320 --> 14:56.800 that there is a little bit of a time gap here, so this is displayed, and then the whole 14:56.800 --> 15:04.240 pages displayed, this is because the page is assembled from components, and one of the things that 15:04.240 --> 15:11.120 you had to do as a content creator is create these components, like pages that are referenced, 15:11.120 --> 15:16.240 so that the user defined characters would be loaded only once, and then you, then you loaded the page, 15:16.240 --> 15:25.040 and, and it would be faster, so now this is one of the, one of the, or this is the home page of 15:25.120 --> 15:35.120 the Chaos Computer Club in the, in 1987, and here's our keyboard, let's, let's go here, so this is 15:36.080 --> 15:44.000 a page with the local units of the Chaos Computer Club in the, in the 1980s, and that was my, 15:44.000 --> 15:51.040 my home base, across from my school back then, so there's a little bit of history for me in there, 15:51.040 --> 16:02.960 so yeah, thank you to my companies, bundling this, this talk, and thank you for listening. 16:21.360 --> 16:30.880 I don't know, yeah, so, so is this similar to Dutch teletix, I don't know, there, 16:30.880 --> 16:37.120 there also has been video text, which is a broadcast only way of sending, sending program information 16:37.120 --> 16:42.000 in the TV stream, but this is phone base, I don't know whether teletix is phone base, I don't know. 16:42.080 --> 16:48.320 Just as a supplement to that, teletix is the name main grid, as well, and it was a broadcast. 16:48.320 --> 16:54.480 It's the broadcast, so yeah, so yeah, yeah, you were first. 16:54.480 --> 17:02.160 Yeah, you said that you could make some orders on this system, so is it possible that you can 17:02.160 --> 17:08.320 harass applications on the main thing that you're seeing, that process the orders and do stuff like that? 17:08.320 --> 17:15.920 So is it, yeah, so the question is, could you, I said you could all 17:15.920 --> 17:22.160 stuff on there, so the question is, could you connect external systems to the, to the built-in text system? 17:22.160 --> 17:29.680 Yes, you could, so you could have what was called an external, external computer that was 17:29.680 --> 17:35.440 connected to the central system through dot xp, which is x25, and then there would be a hand over 17:35.440 --> 17:41.760 page where you basically your terminal, your user terminal would be given to that external machine, 17:41.760 --> 17:47.840 they would do the user interface processing and return back to the built-in text system as well. 17:48.880 --> 17:53.120 The one thing that I wanted to mention that I failed to mention is that there was also a payment 17:53.280 --> 17:58.720 system, so you could have paid pages, you could have a page that displayed some information, 17:58.720 --> 18:05.440 it attached a price to that, and that would be deduced from your phone bill, which was what then 18:06.240 --> 18:15.120 enabled the CME famous hack when the CCC called its own page for 10 marks 18:16.560 --> 18:20.080 13,000 times and had a creative big phone bill for a bank. 18:24.080 --> 18:34.320 Hmm? I believe they are pretty separate, but, so is built-in text related to many 18:34.320 --> 18:41.200 tell, I believe they are kind of the same vintage and prestal was very influential, the UK 18:41.200 --> 18:46.560 predecessor of these systems, but I think there was no direct connection between the two. 18:53.120 --> 18:58.160 Thank you very much.