00:11:16 -!- tromp has quit (Remote host closed the connection).
00:11:48 -!- tromp has joined.
00:12:49 -!- kevinalh has quit (Ping timeout: 264 seconds).
00:20:41 -!- kevinalh has joined.
00:55:37 <imode> working on a token-based rewriting language that has some vague resemblance to concatenative languages.
00:55:59 <imode> with native support for lists, anything is possible.
00:57:51 <imode> https://hatebin.com/ssyfkqowua
01:00:19 <imode> while loops are proving tricky with the "infix" syntax.
01:01:15 <imode> if/else was also tricky. it assumes a default evaluation order of right to left. writing it to be direction agnostic is kind of the next goal.
01:03:02 <imode> if rdrop is evaluated before rswap, for example, you'll end up swapping two unrelated values on the right-hand side, and that'll be messy if anything else is beyond that context.
02:03:07 -!- Phantom_Hoover has joined.
02:04:53 -!- LKoen has quit (Quit: “It’s only logical. First you learn to talk, then you learn to think. Too bad it’s not the other way round.”).
03:07:10 -!- Phantom_Hoover has quit (Ping timeout: 256 seconds).
03:25:10 <moony> imode: that language looks fun
03:25:22 <moony> and frankly I like the syntax, so I think i'm going to steal it for my own use
03:27:30 <moony> for less esoteric purposes, mind you
03:45:53 <int-e> that vaguely reminds me of that one time I tried TCL.
03:46:05 <int-e> (because of the many square brackets)
03:48:53 <zzo38> Have you tried to program in PostScript one time, though? (Apparently, even the inventor of INTERCAL uses PostScript.)
03:50:05 <b_jonas> zzo38: I think you read the M:tG comprule updates. If I cast a Migratory Greathorn and choose to mutate an opponent's creature with it, then who controls the triggered ability triggered from the Greathorn?
03:52:45 <zzo38> The spell has to have the same owner as the creature you choose to mutate, I think. So unless the opponent's creature is owned by the same player as the spell (e.g. because your opponent took control of your creature), you can't cast that spell like that.
03:53:30 <zzo38> However, to answer your question, let's see the Migratory Greathorn card, first.
03:56:00 <zzo38> OK, rule 702.139d merely says "An ability that triggers whenever a creature mutates triggers when a spell merges with a creature as a result of a resolving mutating creature spell." I think it triggers after it is on the battlefield, so your opponent controls that ability, but you get to decide to put it on the top or bottom.
03:56:25 <zzo38> (If someone knows to the contrary, you can tell me, but I think it works like how I mentioned.)
04:02:31 <b_jonas> zzo38: yeah, there's a requirement that the parts of the mutated creature has to have the same owner, so this doesn't come up too often, but there are lots of effects to take control of a creature
04:03:08 <zzo38> I realized something, which is that if you are using my "generalized mutate" rule but only using official cards (maybe because it is a kind of Constructed game with both custom and official cards, but neither player decided to use any custom cards), nevertheless it has an effect on the game, because it is now possible to use Artificial Evolution to prevent a creature from mutating.
04:04:18 <zzo38> b_jonas: Yes. I wrote what is the best I can tell from reading the rules.
04:04:22 <b_jonas> heck, it's not even quite clear to me from the rules who will control the merged creature after you mutate, and whether the order of the cards depends for that
04:05:23 <zzo38> I believe it will have the same controller as the original, because who controls a permanent is a continuous property, and continuous effects continue to apply.
04:09:42 <zzo38> (Rule 721.2c specifically says that continuous effects continue to apply.)
04:10:29 <b_jonas> zzo38: I don't know, there might not be a continuous effect if the original creature is a card that was put otb under the opponent's control, such as with Gruesome Encore.
04:11:34 <zzo38> I think that since it is a continuous property, it is still a continuous effect, although not a static effect.
04:12:04 <zzo38> Although, I am unsure.
04:13:28 <b_jonas> yeah, 721.2c says that the merged object is the same object as the permanent that already existed
04:14:22 <zzo38> However, I think that if (hypothetically) some static ability says "you control all blue permanents", and the mutation changes it to not blue, then since the mutation is a layer 1 effect and control is a layer 2 effect, this means that control effect will no longer apply (and Thoughtlace won't allow you to take it back, since that is a layer 5 effect).
04:15:26 <b_jonas> "you control all blue permanents" is a very unlikely effect, but sure
04:16:03 <zzo38> Yes, it is unlikely, but I was giving a hypothetical example.
04:18:21 <b_jonas> I should ask efnet/#mtgrules probably
04:19:00 <zzo38> Yes, perhaps they know better than I do.
04:19:13 <b_jonas> that or the scryfall web forum
04:19:36 <b_jonas> oh, but I should re-read the release notes first
04:20:04 <zzo38> Yes, maybe they answered the question for you
04:28:31 <zzo38> Do you like my "Master Shuffler" and "Malaclypse the Younger" Un-cards?
04:29:55 <b_jonas> I don't know, I haven't looked at your cards lately, especially not your un-cards
04:30:48 <zzo38> Master Shuffler shuffles players, planeswalkers, mana pools, your hand, planar decks, scheme decks, time stamps, and the layer system.
04:31:03 <zzo38> Malaclypse the Younger makes all intervening if clauses true.
04:36:58 <b_jonas> zzo38: efnet/#magicjudges-rules tells me that the opponent keeps control of the permanent when it merges with a mutate card
04:37:17 <b_jonas> and that they'll also control the "whenever this creature mutates" ability
04:37:43 <b_jonas> so if an opponent owns my treefolk, I can mutate it with a Greathorn and they'll have to shuffle
04:38:50 <zzo38> Yes, that is what I thought.
04:39:07 <zzo38> Now I am more certain of it, because they said the same thing.
04:46:29 <imode> moony: feel free to steal lol.
04:46:57 <imode> it's an inconvenient little language because you don't have a separation between code and data.
05:13:19 -!- MDude has quit (Quit: Going offline, see ya! (www.adiirc.com)).
05:33:59 -!- Antebrationist has joined.
05:35:09 <Antebrationist> What commands are required to make a language with two stacks TC?
05:37:44 -!- xelxebar has quit (Remote host closed the connection).
05:38:02 -!- xelxebar has joined.
05:46:43 <zzo38> I think it depends on the other stuff in the programming language
05:48:07 <Antebrationist> Okay. Let's say we have operands to increment and decrement both stacks, move the top item from each stack to the top of the other one, and some kind of control flow based on the value in each stack.
05:48:27 <Antebrationist> This is just a thought experiment of course, I'm not going to actually turn it into a language.
05:49:41 <zzo38> Yes, that can be similar to brainfuck, I think.
05:50:34 <zzo38> You could consider having a tape where one stack is everything on the left of the tape and other stack is everything on the right of the tape, I think.
05:50:44 <Antebrationist> I can see <> being equivalent to the moving between stacks and the increment/decrement being equivalent, but I don't really get the whole control flow part.
05:53:22 <zzo38> Depends how you define it, I suppose.
05:53:44 <Antebrationist> Okay. This thought experiment isn't very fleshed out yet.
05:54:35 -!- Antebrationist45 has joined.
05:54:39 <Antebrationist45> Let's just say that depending on whether the sum of the values at the top of the stacks is even or odd, it does different stuff.
05:57:59 -!- Antebrationist has quit (Ping timeout: 245 seconds).
06:00:32 -!- Antebrationist45 has left.
06:00:36 -!- Antebrationist45 has joined.
06:00:53 <zzo38> Did you post the programming language you invented before, on the esolang wiki yet?
06:01:25 <Antebrationist45> Besides, there are already 4 major Befunge copies, and this is fairly similar.
06:02:16 <Antebrationist45> And the whole "you can have as many pointers as you like" thing just annoyed me. It seems... inelegant?
06:02:17 <zzo38> I like it, though.
06:02:58 <Antebrationist45> Do you? I may post it then. I have an article in the works for it, although I'm not sure whether I should be like all of those people who spampost BF deriatives.
06:06:38 -!- Antebrationist45 has quit (Remote host closed the connection).
06:13:22 -!- Antebrationist has joined.
06:18:04 <Antebrationist> Alright, this thought experiment might become a language now.
06:30:55 <esowiki> [[Special:Log/upload]] upload * FSHelix * uploaded "[[File:1 Number of operations in divmod.jpeg]]"
06:31:59 <esowiki> [[Special:Log/upload]] upload * FSHelix * uploaded "[[File:2 Number of operations in divmod.jpeg]]"
06:36:44 -!- Antebrationist has quit (Remote host closed the connection).
06:44:21 <esowiki> [[Special:Log/upload]] upload * FSHelix * uploaded "[[File:3 Number of operations in divmod.jpeg]]"
06:44:53 <esowiki> [[Special:Log/upload]] upload * FSHelix * uploaded "[[File:4 Number of operations in divmod.jpeg]]"
06:45:27 <esowiki> [[Special:Log/upload]] overwrite * FSHelix * uploaded a new version of "[[File:4 Number of operations in divmod.jpeg]]"
06:47:32 -!- kevinalh has quit (Ping timeout: 272 seconds).
07:15:30 -!- Sgeo has quit (Read error: Connection reset by peer).
07:18:04 -!- Sgeo has joined.
07:29:42 -!- Frater_EST has joined.
07:57:57 <esowiki> [[Brainfuck algorithms]] https://esolangs.org/w/index.php?diff=71978&oldid=70699 * FSHelix * (+965)
08:16:00 -!- imode has quit (Ping timeout: 256 seconds).
08:26:11 -!- ais523 has quit (Ping timeout: 260 seconds).
08:29:03 -!- izabera1 has joined.
08:33:21 -!- izabera has quit (Quit: meow).
08:35:05 -!- izabera1 has changed nick to izabera.
08:52:32 -!- kspalaiologos has joined.
09:08:27 -!- LKoen has joined.
09:24:40 -!- Lord_of_Life_ has joined.
09:26:30 -!- Lord_of_Life has quit (Ping timeout: 272 seconds).
09:26:31 -!- Lord_of_Life_ has changed nick to Lord_of_Life.
09:30:38 -!- izabera has quit (Quit: WeeChat 2.8).
09:31:01 -!- Sgeo has quit (Read error: Connection reset by peer).
09:37:45 -!- izabera has joined.
09:37:46 -!- Sgeo has joined.
09:50:54 -!- kspalaiologos has quit (Ping timeout: 240 seconds).
10:00:26 -!- Sgeo has quit (Read error: Connection reset by peer).
10:58:01 -!- heroux has quit (Ping timeout: 258 seconds).
11:04:44 -!- heroux has joined.
11:51:38 -!- rain1 has joined.
12:23:21 <esowiki> [[LAMPA]] M https://esolangs.org/w/index.php?diff=71979&oldid=50508 * PythonshellDebugwindow * (-3)
12:29:31 <esowiki> [[TinyBF]] M https://esolangs.org/w/index.php?diff=71980&oldid=71013 * PythonshellDebugwindow * (+70) /* External resources */
12:39:12 -!- arseniiv_ has joined.
12:40:49 <esowiki> [[User:PythonshellDebugwindow]] M https://esolangs.org/w/index.php?diff=71981&oldid=71924 * PythonshellDebugwindow * (+45) /* Languages */
12:49:25 <esowiki> [[Esolang:Sandbox]] M https://esolangs.org/w/index.php?diff=71982&oldid=71735 * PythonshellDebugwindow * (+11)
12:50:32 <esowiki> [[Esolang:Sandbox]] M https://esolangs.org/w/index.php?diff=71983&oldid=71982 * PythonshellDebugwindow * (-195)
13:00:54 -!- sprocklem has quit (Ping timeout: 260 seconds).
13:06:28 -!- sprocklem has joined.
13:22:04 -!- arseniiv_ has changed nick to arseniiv.
13:23:39 <arseniiv> oh! have someone read something comprehensive about error recovery in parsers? I think I have almost no idea which approaches are out there and which ones are deemed more useful
14:06:06 <esowiki> [[Brainfuck implementations]] https://esolangs.org/w/index.php?diff=71984&oldid=71961 * Zax2002 * (+0) /* Normal implementations */
14:07:47 <esowiki> [[Esolang:Introduce yourself]] https://esolangs.org/w/index.php?diff=71985&oldid=71960 * Zax2002 * (+0) /* Introductions */
14:07:49 <esowiki> [[Bout]] N https://esolangs.org/w/index.php?oldid=71986 * PythonshellDebugwindow * (+1233) Created page with "'''Bout''' is an assembly-like esolang created by [[User:PythonshellDebugwindow]]. ==Syntax== Bout programs consist of lines with opcodes followed by any arguments they might..."
14:17:00 -!- kspalaiologos has joined.
14:34:47 <esowiki> [[Bout]] M https://esolangs.org/w/index.php?diff=71987&oldid=71986 * PythonshellDebugwindow * (+834) /* Truth-machine */
14:35:21 <esowiki> [[Language list]] M https://esolangs.org/w/index.php?diff=71988&oldid=71929 * PythonshellDebugwindow * (+11) /* B */
14:35:40 <esowiki> [[User:PythonshellDebugwindow]] M https://esolangs.org/w/index.php?diff=71989&oldid=71981 * PythonshellDebugwindow * (+37) /* Languages */
14:47:37 -!- kevinalh has joined.
14:49:41 <b_jonas> arseniiv: I think the best way to have good error recovery is to design the syntax of your language well. For example, in typical python code, if you miscount parenthesis and forget to close one, you usually get a confused error message where the parser thinks that the next line is a continuation of your statement. but if you write your program to put a semicolon at the end of every simple statement,
14:49:47 <b_jonas> which python allows, then you get good error messages, because the parser knows that semicolons (unlike line breaks) can only appear between statements, not inside parenthesis.
14:50:51 <arseniiv> b_jonas: wait, Python allows semicolons?? Maybe that’s JS?
14:51:44 <b_jonas> if you design your language to have tokens that only appear between statements and you can't nest statements inside expressions, then you can recover from unbalanced expressions. similarly if you use a different token to end a function definition than to end the body of a conditional, then even if you miscount your braces inside the function, the parser will know where the function definition ends and
14:51:50 <b_jonas> can recover to parse the next function.
14:52:26 <b_jonas> and eg. in C, double-quoted string literals can't have line break in the end, so if you forget a double quote, the lexer can recover in the next line.
14:52:35 -!- kevinalh has quit (Ping timeout: 260 seconds).
14:52:45 <b_jonas> sadly most programming languages these days aren't designed to match these principles.
14:53:24 <b_jonas> it's sort of understandable, because it goes against letting you write flexible and brief code where only a few kinds of braces and semicolons are available so many punctuation are precious and have several overloaded meanings
14:53:57 -!- kevinalh has joined.
14:54:28 <arseniiv> oh, indeed Python understands semicolons. Shame I’ve read a bit of its grammar and didn’t notice they are allowed as separators :|
14:55:12 <b_jonas> hmm, I just realized. in Consumer Society, every program can trivially be written such that square brackets are nested to at most 2 depth. I can add a switch to the interpreter where it absolutely refuses square brackets nested to more than 2 depth, that way it can find missing closing square brackets and recover from them.
14:55:58 <b_jonas> that won't help with missing a curly brace, but it's still useful to some extent.
14:56:24 <b_jonas> but Consumer Society is an esolang that's not very suitable to finding errors in compile time in first place, so even that is something.
14:57:05 <b_jonas> if you want your compiler to find errors, you'd use a programming language with a type system and a compiler, not an esolang like Consumer Society.
15:00:31 -!- kevinalh has quit (Ping timeout: 260 seconds).
15:08:10 <esowiki> [[(HA)pple waITING]] https://esolangs.org/w/index.php?diff=71990&oldid=69154 * DmilkaSTD * (+27)
15:11:27 <arseniiv> b_jonas: funny that I consider writing a parser for an esolang with a touch of typing via abstract types: the runtime has actually only one data type and all operations work on it nicely, but you’d be able to add simple function contracts like “this function returns N”, “if this function takes N, it returns N”, and then these would be enforced by the compiler in all the code except the part where these functions are defined
15:12:26 <arseniiv> I don’t know if this approach is called abstract types but I thought this is the closest match
15:12:34 -!- kevinalh has joined.
15:12:45 <esowiki> [[AT]] https://esolangs.org/w/index.php?diff=71991&oldid=65124 * DmilkaSTD * (+17)
15:27:05 <esowiki> [[Asvi]] N https://esolangs.org/w/index.php?oldid=71992 * DmilkaSTD * (+5) Created page with "::Wip"
15:27:24 <esowiki> [[Asvi]] https://esolangs.org/w/index.php?diff=71993&oldid=71992 * DmilkaSTD * (+2)
15:27:35 <esowiki> [[Asvi]] https://esolangs.org/w/index.php?diff=71994&oldid=71993 * DmilkaSTD * (+0)
15:30:11 <esowiki> [[Asvi]] https://esolangs.org/w/index.php?diff=71995&oldid=71994 * DmilkaSTD * (+162)
15:32:51 -!- Phantom_Hoover has joined.
15:33:32 -!- Cale has quit (Ping timeout: 260 seconds).
15:34:46 -!- MDude has joined.
15:34:49 <esowiki> [[Asvi]] https://esolangs.org/w/index.php?diff=71996&oldid=71995 * DmilkaSTD * (+277)
15:35:15 <esowiki> [[Asvi]] https://esolangs.org/w/index.php?diff=71997&oldid=71996 * DmilkaSTD * (+15)
15:35:24 <esowiki> [[Asvi]] https://esolangs.org/w/index.php?diff=71998&oldid=71997 * DmilkaSTD * (+0)
15:38:12 <esowiki> [[Asvi]] https://esolangs.org/w/index.php?diff=71999&oldid=71998 * DmilkaSTD * (+29)
15:38:29 <esowiki> [[Asvi]] https://esolangs.org/w/index.php?diff=72000&oldid=71999 * DmilkaSTD * (+0)
15:39:52 <esowiki> [[Asvi]] https://esolangs.org/w/index.php?diff=72001&oldid=72000 * DmilkaSTD * (+73)
15:40:57 <esowiki> [[Asvi]] https://esolangs.org/w/index.php?diff=72002&oldid=72001 * DmilkaSTD * (+47)
15:41:10 <esowiki> [[Asvi]] https://esolangs.org/w/index.php?diff=72003&oldid=72002 * DmilkaSTD * (+27)
15:45:54 -!- Cale has joined.
15:54:14 <esowiki> [[Asvi]] https://esolangs.org/w/index.php?diff=72004&oldid=72003 * DmilkaSTD * (+271)
15:57:07 <esowiki> [[Asvi]] https://esolangs.org/w/index.php?diff=72005&oldid=72004 * DmilkaSTD * (+86)
15:57:29 <esowiki> [[Asvi]] https://esolangs.org/w/index.php?diff=72006&oldid=72005 * DmilkaSTD * (-13)
15:58:08 <esowiki> [[Asvi]] https://esolangs.org/w/index.php?diff=72007&oldid=72006 * DmilkaSTD * (-73)
15:58:27 <esowiki> [[Asvi]] https://esolangs.org/w/index.php?diff=72008&oldid=72007 * DmilkaSTD * (+3)
16:24:31 <esowiki> [[Asvi]] https://esolangs.org/w/index.php?diff=72009&oldid=72008 * DmilkaSTD * (+379)
16:28:53 <esowiki> [[Asvi]] https://esolangs.org/w/index.php?diff=72010&oldid=72009 * DmilkaSTD * (+277)
16:29:13 <esowiki> [[Asvi]] https://esolangs.org/w/index.php?diff=72011&oldid=72010 * DmilkaSTD * (+6)
16:29:30 <esowiki> [[Asvi]] https://esolangs.org/w/index.php?diff=72012&oldid=72011 * DmilkaSTD * (+1)
16:31:06 <esowiki> [[Asvi]] https://esolangs.org/w/index.php?diff=72013&oldid=72012 * DmilkaSTD * (+28)
16:34:06 <esowiki> [[Asvi]] https://esolangs.org/w/index.php?diff=72014&oldid=72013 * DmilkaSTD * (+52)
16:35:25 <esowiki> [[Asvi]] https://esolangs.org/w/index.php?diff=72015&oldid=72014 * DmilkaSTD * (+161)
16:35:37 <esowiki> [[Asvi]] https://esolangs.org/w/index.php?diff=72016&oldid=72015 * DmilkaSTD * (-1)
16:35:50 <esowiki> [[Asvi]] https://esolangs.org/w/index.php?diff=72017&oldid=72016 * DmilkaSTD * (-4)
16:47:36 -!- imode has joined.
17:02:38 -!- sprocklem has quit (Ping timeout: 260 seconds).
17:04:32 -!- sprocklem has joined.
17:56:27 -!- Phantom_Hoover has quit (Ping timeout: 260 seconds).
18:11:52 <zzo38> Automatic semicolon insertion is I think one o the bad features of JavaScript.
18:13:09 -!- Frater_EST has quit (Read error: Connection reset by peer).
18:19:08 <zzo38> A bad feature of PostScript is the inability to use automatic allocation with the readline operator.
18:28:58 -!- imode has quit (Ping timeout: 260 seconds).
18:30:58 <esowiki> [[Special:Log/newusers]] create * Orb-H * New user account
18:37:36 -!- Sgeo has joined.
18:46:05 -!- tromp has quit (Ping timeout: 240 seconds).
18:49:10 -!- tromp has joined.
18:53:50 <myname> there are js coding guidelines that suggest omiting the semicolon wherever possible and only set it at the start of a line when necessary
18:54:01 -!- craigo has joined.
18:54:18 <myname> which is a horrible recommendation imho since it will force you to enter/remove semicilons if you move code around
18:55:20 <zzo38> I agree, and I always add the semicolons when writing a program in JavaScript.
18:56:46 <zzo38> Do you mean why I, myname, what myname mentioned, or all of these?
19:01:34 -!- tromp has quit (Remote host closed the connection).
19:02:00 -!- Phantom_Hoover has joined.
19:02:33 -!- kevinalh has quit (Ping timeout: 258 seconds).
19:05:54 -!- TheLie has joined.
19:11:00 -!- tromp has joined.
19:11:22 -!- kevinalh has joined.
19:19:38 -!- kspalaiologos has quit (Quit: Leaving).
19:21:21 -!- Sgeo has quit (Read error: Connection reset by peer).
19:25:40 <esowiki> [[Seltzer Spigot]] N https://esolangs.org/w/index.php?oldid=72018 * InfiniteDonuts * (+850) Created page with "'''Seltzer Spigot''' is a purely functional esolang designed by [[User:InfiniteDonuts]]. It is not yet complete. Its philosophy is not just minimalism, as in some esolangs. R..."
19:28:04 -!- tromp has quit (Remote host closed the connection).
19:28:33 <esowiki> [[Dig]] M https://esolangs.org/w/index.php?diff=72019&oldid=71962 * Emerald * (+89) Better storage
19:28:55 <esowiki> [[Dig]] M https://esolangs.org/w/index.php?diff=72020&oldid=72019 * Emerald * (-1)
19:29:39 <esowiki> [[Language list]] https://esolangs.org/w/index.php?diff=72021&oldid=71988 * Emerald * (+58) Added own language
19:46:04 -!- imode has joined.
20:00:54 -!- tromp has joined.
20:05:57 -!- tromp has quit (Ping timeout: 260 seconds).
20:13:47 <esowiki> [[Seltzer Spigot]] https://esolangs.org/w/index.php?diff=72022&oldid=72018 * InfiniteDonuts * (-500)
20:14:33 -!- tromp has joined.
20:19:44 <esowiki> [[Special:Log/move]] move * InfiniteDonuts * moved [[Seltzer Spigot]] to [[DotSlash]]: Changed the name
20:21:45 <esowiki> [[2001: An Esolang Odyssey]] M https://esolangs.org/w/index.php?diff=72025&oldid=71891 * PythonshellDebugwindow * (+0) /* Instructions */
20:23:47 -!- rain1 has quit (Quit: leaving).
20:26:39 -!- tromp has quit (Remote host closed the connection).
20:29:19 -!- Sgeo has joined.
20:32:46 -!- Sgeo has quit (Read error: Connection reset by peer).
20:36:35 <esowiki> [[DotSlash]] https://esolangs.org/w/index.php?diff=72026&oldid=72023 * InfiniteDonuts * (+1327)
20:36:43 -!- ais523 has joined.
20:42:52 -!- tromp has joined.
20:58:40 -!- tromp has quit (Remote host closed the connection).
21:09:57 <esowiki> [[Esowar]] https://esolangs.org/w/index.php?diff=72027&oldid=71972 * Orby * (+67)
21:25:49 -!- Lord_of_Life_ has joined.
21:27:14 -!- Lord_of_Life has quit (Ping timeout: 240 seconds).
21:28:37 -!- Lord_of_Life_ has changed nick to Lord_of_Life.
21:35:33 -!- tromp has joined.
21:36:27 -!- tromp has quit (Remote host closed the connection).
21:36:43 -!- tromp has joined.
21:44:14 <b_jonas> question. how the heck do Game Boy games implement animated tiles? from what I read about the graphics chip, that isn't supposed to be possible without a lot of CPU use
21:44:37 <b_jonas> yet a lot of game boy games have animated water or other animated tiles, so I'm probably missing something obvious
21:45:52 <b_jonas> it can't be palette cycling because there are only one and a half tile layers and only one palette per tile layer
21:46:47 <b_jonas> you'd have to either very quickly find all animated tiles in the tilemap memory and modify them, or quickly rewrite the bitmap of a few tiles stored in the tileset memory, every frame
21:47:03 <b_jonas> or emulate them with sprites, which also seems impossible with how much these are used.
21:50:01 <b_jonas> I guess they're probably rewriting the bitmaps in the tileset memory every frame, and design the levels so that there's very few tiles that they have to update
21:50:16 <b_jonas> but it still seems unrealistic
21:50:25 <b_jonas> they can apparently animate a lot
21:51:40 <imode> we talking original gameboy?
21:54:22 <b_jonas> 100 kilometers south of Berlin? so that's close to Dresden probably
21:55:05 -!- ArthurStrong has joined.
21:55:23 <b_jonas> wrnog channel for that last one
21:56:32 -!- Phantom_Hoover has quit (Ping timeout: 256 seconds).
22:02:23 -!- ais523 has quit (Ping timeout: 260 seconds).
22:16:29 -!- tromp has quit (Remote host closed the connection).
22:37:06 <zzo38> Does it have pattern table bank switching like NES/Famicom does? I am unsure (I probably read it once but now I forget)
22:39:39 <b_jonas> zzo38: I don't remember the details
22:40:11 <b_jonas> zzo38: is pattern table bank switching when you switch the entire layer between two pattern tables of 256 tiles each?
22:40:26 <b_jonas> that's a good idea, that might be what's happening
22:41:39 -!- ais523 has joined.
22:41:39 <b_jonas> oops. falling into the first shallow sap hole in tree 2
22:41:52 <b_jonas> sorry, wrong channel again,
22:41:57 <b_jonas> chatting in multiple channels is confusing
22:48:48 <zzo38> Yes, that is what I mean
22:53:27 <pikhq> What's hard for them to do with that? Can't you just modify the background map, and simply change which tileset entries get used for certain tiles?
22:53:40 -!- tromp has joined.
22:53:44 <pikhq> Maybe I'm missing something, but that's just in video RAM and doesn't need much CPU to do?
22:54:46 <imode> yeah iirc there's no limit to you altering PPU memory.
22:55:10 <b_jonas> pikhq; it's in the video RAM, but the CPU doesn't get that much time between frames, it's only like 1 megahertz speed with a Z80-like CPU, and it wants to do all sorts of other computations between frames
22:55:45 <b_jonas> and each tile pattern is 32 bytes long, and you usually have to update several tiles
22:56:50 <imode> I don't believe altering the bg tile table takes that much CPU.
22:56:57 <pikhq> Erm, I wasn't saying updating the tile pattern. I was saying update the _used tile in the background map_
22:57:08 <pikhq> Which is one byte per tile.
22:57:35 <b_jonas> pikhq: that's even harder, because you have to find which tiles to update there
22:57:48 <b_jonas> the same water tiles or muncher tiles usually appear a lot of times
22:58:22 -!- tromp has quit (Ping timeout: 265 seconds).
22:58:29 <imode> animated water usually is done in pretty short order.
22:58:47 <b_jonas> and the Game Boy only has 8x8 tiles, just like the NES, so there are a lot of tiles to look up
22:58:54 <b_jonas> 8x8 pixel sized tiles that is
22:59:00 <b_jonas> admittedly it has a smaller screen than the NES
22:59:06 <ais523> the NES CPU has a DMA to make it possible to update the sprite table quickly enough during vblank
22:59:21 <ais523> but it normally has plenty of time to update backgrounds just via regular CPU instructions
22:59:27 <b_jonas> ais523: yes, I think the GB CPU accesses the PPU memory directly too
22:59:39 <imode> the GB has DMA as well.
22:59:49 <ais523> the PPU on the NES isn't accessed directly, rather there's a specialised memcpy instruction on the CPU for it
23:00:03 <ais523> that puts it in a mode which memcpies one byte per cycle into the PPU sprite memory
23:00:16 <b_jonas> I mean its tile and pattern memory, not the registers. accessing the registers is more complicated.
23:00:19 <ais523> (you can't write a memcpy that runs that fast on a 6502 normally)
23:00:42 <b_jonas> memcopies one byte per cycle? yes, that's impossible on a normal 6502
23:00:53 <imode> https://gbdev.gg8.se/wiki/articles/Video_Display#LCD_OAM_DMA_Transfers
23:01:14 <ais523> right, I can see why it was invented
23:01:32 <ais523> it shouldn't be too hard to add a few extra circuits to make that fast a memcpy possible using the normal on-chip ALU and read and write architecture
23:01:36 <b_jonas> cool. does the Game Boy has such a feature too?
23:01:46 <zzo38> It isn't a special instruction on the CPU, but rather a function of the APU to implement sprite DMA on NES. (However, the CPU and APU are the same physical chip)
23:01:49 <ais523> but, there's clearly no way to do it under software control so you'd need extra hardware to implement it
23:02:52 <b_jonas> ais523: yes, but the problem is that it has to be in the CPU, because those CPUs and PPUs access the memory in a synchronized way, it'd be hard to just do it asynhroniously from a separate device, and it wasn't easy to modify a CPU in such a way back then
23:03:15 -!- ais523 has quit (Quit: sorry for my connection).
23:03:27 -!- ais523 has joined.
23:03:41 <ais523> huh, the Game Boy version is rather more advanced than the NES version
23:03:53 <b_jonas> sure, it's like 5 years more advanced
23:04:04 <ais523> apparently the CPU functions normally during the DMA, except that some of the memory buses are tied up
23:04:14 <b_jonas> and has a Z80-based chip with an address space larger than 16 bytes
23:04:16 <zzo38> b_jonas: The APU is the audio processing unit, although it also includes the OAM DMA and the game controller inputs.
23:04:21 <b_jonas> address space larger than 16 bits
23:04:26 <ais523> so you can actually run code, just you need to run it from somewhere that isn't busy with the DMA
23:05:00 <pikhq> Hmm, that's rather handy.
23:05:02 <ais523> in practice the NES never ran out of address space anyway, in most configurations it has tons more address space than physical memory
23:05:07 <b_jonas> zzo38: but isn't the APU completely separate from the CPU and PPU and not even running from the same clock speed or something? or is that on a different console?
23:05:43 <ais523> although I think it needs to bank-switch on later chips because the address space is split up with certain parts being for certain purposes
23:05:46 <b_jonas> er what? doesn't the NES only have 16 bits of address space only?
23:05:50 <ais523> and you can run out of address space in a particular part
23:05:59 <zzo38> b_jonas: No, it uses the same clock speed.
23:06:00 <ais523> b_jonas: yes, but that's 64 KiB which is more than most NES games use
23:06:11 <b_jonas> zzo38: same clock speed, but not synchronized
23:06:31 <b_jonas> ais523: oh right, it's the SNES and Game Boy that has game cartridges up to 8 megabyte
23:06:41 <b_jonas> though 64 kilobytes still sounds pretty small for the NES
23:06:46 <ais523> with most games, quite a lot of that 64 KiB is either mirror ROM / mirror RAM (i.e. two addresses for the same byte in memory), or else open bus
23:06:46 <b_jonas> don't some NES games have more ROM than that?
23:07:02 <ais523> the games with more data stored normally use bank switching
23:07:05 <zzo38> Yes, it uses bank switching in the cartridge.
23:07:09 <b_jonas> yes, exactly, bank switching
23:07:14 <ais523> i.e. they have multiple different ROMs in the cartridge
23:07:18 <b_jonas> which means that they have ran out of address space, just solved it in a reasonable manner
23:07:22 -!- TheLie has quit (Remote host closed the connection).
23:07:24 <ais523> that's most important for background and sprite tables, which have a very small maximum size
23:08:29 <b_jonas> ais523: why? does the NES not have built-in video memory, unlike the GB?
23:08:52 <b_jonas> oh right, in the NES it's all in the same bus I think
23:09:13 <b_jonas> so it's usually in the ROM or something
23:09:20 <ais523> b_jonas: it's complicated, there's video RAM for choosing where the sprites are on screen, and where the backgrounds are on screen
23:09:24 <b_jonas> whereas the GB has dedicated video memory that you have to write I think
23:09:35 <ais523> but the pixels that make up a particular sprite, or particular background, are read directly from the cartridge and normally assumed to be in ROM
23:09:43 <ais523> (of course there's nothing stopping the cartridge putting a RAM there instead)
23:09:59 <ais523> and the address space of that is really small
23:09:59 -!- Antebrationist has joined.
23:10:10 <zzo38> The NES does have built-in video memory, although it is not normally used for pattern tables (it is normally used for name tables instead).
23:10:19 <ais523> so it uses bank-switching more commonly than other parts of memory
23:10:20 <pikhq> (and a few games that do special, clever tricks will do exactly that)
23:10:37 <zzo38> (Although there is a signal in the cartridge to specify whether to use the internal video memory (CIRAM) or that in the cartridge.)
23:10:59 <b_jonas> hmm, it's possible that I'm misunderstanding something and the GB does this too
23:11:36 <b_jonas> because it only has 8 kilobytes of video memory, which is enough for scrolling the maps, with two bytes per 8x8 block on a 160x130 pixel or something screen, two layers, but way too little for pattern memory
23:11:57 <b_jonas> so it probably just addresses pattern memory that's usually bank switched in directly from the cart too
23:12:09 <ais523> zzo38: IIRC, the NES's graphics chip implements a virtual screen that's 512×512, but its internal video memory only has enough space for half that
23:12:27 <zzo38> ais523: Yes, that is correct.
23:12:33 <ais523> so the cartridge needs to decide whether to make it 512×256, 256×512, or add additional memory of its own to get the full size
23:12:47 <zzo38> (Well, kind of. Part of each name table is used for attributes instead.)
23:13:25 <zzo38> Attributes are not stored with each cell, but rather each byte in the attribute area stores the attributes for four 2x2 blocks of cells.
23:13:37 <b_jonas> yes, on the NES you can choose a palette for each 16x16 pixel block
23:13:38 -!- ais523 has quit (Quit: quit).
23:13:42 <b_jonas> but the original Game Boy doesn't have that
23:13:56 <b_jonas> you can only choose the palette per layer and per sprite (or per two sprites or something, I don't recall)
23:14:17 <b_jonas> but that's because it can only display four physical colors on the LCD
23:14:27 <b_jonas> whereas the NES can display much more colors
23:14:44 -!- LKoen has quit (Quit: “It’s only logical. First you learn to talk, then you learn to think. Too bad it’s not the other way round.”).
23:15:47 <b_jonas> mind you, I think it's unfair to call that "attribute memory", it's just palette memory, the tile map itself has per-tile attributes in it
23:16:09 <orbitaldecay> Antebrationist: forder.cc/esowar if you're interested there's a tourney server now
23:17:36 <b_jonas> also having tilemap first, and attribute memory in more expensive later versions is a pretty popular solution, it's happened for at least three computers: the game boy (if you upgrade to game boy color), the VT100-like terminals (where you just plug in additional RAM), and the Commodore home computers
23:17:54 <b_jonas> it's a good way to make a newer video chip that is compatible with older modes
23:18:12 <b_jonas> and software that is compatible with older non-color hardware without needing too much extra data
23:31:39 -!- arseniiv has quit (Ping timeout: 258 seconds).
23:47:55 -!- tromp has joined.
23:52:50 -!- tromp has quit (Ping timeout: 246 seconds).