[HN Gopher] Show HN: Programming language for making NES games
___________________________________________________________________
Show HN: Programming language for making NES games
Author : pubby
Score : 190 points
Date : 2023-03-07 13:52 UTC (9 hours ago)
(HTM) web link (pubby.games)
(TXT) w3m dump (pubby.games)
| foldor wrote:
| Really cool stuff! Is there an syntax highlighter available on
| any IDE's like VSCode available? I'm having a hard time following
| the documentation without it as it's hard for me to know what is
| a keyword and what is a variable for example. Single letter types
| can be hard for me to follow, but I can definitely appreciate
| their style.
|
| Nice work.
| mungoman2 wrote:
| I have long dreamed of a language for 8-bit computers/consoles
| with a compiler that helps scheduling routines.
|
| For example, let's say I have a short snippet of code that needs
| to run every H blanking period. I should just declare something
| like
|
| @every_hblank Blabla_code()
|
| Or scheduling some code for X pixels into a line.
|
| Actual scheduling can be done however the compiler wants to,
| using interrupts or inserting dummy instructions for delays.
|
| I guess in the end it's a constraint problem to solve where all
| these snippets fit in.
|
| I imagine this makes it easier to write games/special effects as
| you remove the tricky cycle counting. Easier, but maybe less
| fun...
| hunta2097 wrote:
| I got a Windows Defender alert when downloading the Windows
| binary:
|
| Detected: Trojan:Script/Wacatac.H!ml
|
| Status: Removed
|
| Details: This program is dangerous and executes commands from an
| attacker.
| easrng wrote:
| I've never seen a Wacatac detection that wasn't a false
| positive, but who knows.
| leroy-is-here wrote:
| I didn't take a deep dive, but I'm interested in how you keep the
| binary size small. Is it simply that LLVM, etc., all have too
| much function overhead and don't take advantage of routines over
| subroutines (function calls)? Or is your back-end just
| specialized enough to take advantage of architecture-specific
| features the larger compiler suites don't have the time to care
| about?
|
| Anyway, this looks dope. Truthfully, we could use more hyper-
| specific languages like this in all sorts of areas.
| pubby wrote:
| LLVM and GCC are great at optimizing until the last leg of the
| race where they convert IR to assembly code. Their back-ends
| were designed for modern systems, not the ancient 6502, and so
| getting them to work involves kludges and clever hacks. I
| recall there being a video on how LLVM approaches this - search
| LLVM MOS on youtube.
|
| I plan on writing an article on how my own code generator
| works. If you check my HN profile in a week or two you'll
| probably see it submitted.
| leroy-is-here wrote:
| Good work. I'm looking forward to the article.
| benj111 wrote:
| Why spaces and not tabs for indents?
|
| I know this conversation has probably been had many times before.
| But if I prefer a 2 space tab, and you prefer a 4 space tab, we
| both get them how we want them with tabs.
|
| With spaces, I have to put up with your stupidly wide indents,
| and try not to scratch my eyes out from the pain.
| mwcremer wrote:
| set your tab stops to 1 space. problem solved.
| entelechy0 wrote:
| [dead]
| MoSattler wrote:
| While I share the preference for using 2 spaces, it seems
| unnecessary to focus solely on criticizing the formatting
| choices when someone has generously shared a wonderful project
| they created during their free time, available for all to enjoy
| at no cost.
| pubby wrote:
| For languages with significant whitespace, mixing tabs and
| spaces can be very error prone. It can look like two lines of
| code have the same indentation, but if the compiler's tab width
| doesn't match yours it would not parse correctly. See Haskell
| for an example of what not to do.
| resizeitplz wrote:
| A question as old as time (or as old as the existence of code
| editors). 4k results on Hacker News alone - and surely
| thousands, if not millions more, across the internet. There is
| no right answer, just differing preference.
|
| https://www.google.com/search?q=spaces+vs+tabs+site%3Anews.y...
| incrudible wrote:
| Getting over these pet peeves is one of the best skills you can
| acquire as a programmer.
| postalrat wrote:
| Time to turn off linters. Seriously your linting rules suck.
| incrudible wrote:
| If you're unironically linting whitespace you need to get
| your priorities straight.
| stcroixx wrote:
| Agreed. The next challenge is getting over the annoyance
| every time someone wants to debate this AGAIN.
| AdmiralAsshat wrote:
| Does this language have support for being able to save the game's
| state into a simulated battery a la Legend of Zelda/Metroid?
| pubby wrote:
| There's no built-in support for that, but you can still do it.
| Nowadays flash memory is used rather than battery stuff, but
| the idea remains the same.
| lastdong wrote:
| Congrats on the release! Website and code look super clean, and
| looks like super useful for anyone getting into NES game
| development.
|
| - What languages did you use as inspiration?
|
| - Is it possible to write a game to a physical cartridge and play
| it on a real snes?
|
| Thanks for sharing your amazing work!
| Taikonerd wrote:
| This is a really interesting approach. One thing that surprised
| me from the code snippet: fn play_sound()
| {$4015}(%100) {$4008}($FF)
|
| Are these hard-coded memory addresses meaningful to NES devs? I'm
| surprised that they don't have more readable aliases, like
| $SOUND_ROM_BASE_ADDR or whatever.
| wk_end wrote:
| I can't speak for the NES, but I've done lots of Game Boy asm
| coding, and personally - although others feel differently - I
| prefer using the register addresses rather than trying to
| memorize a bunch of unofficial names. Usually context/the sort
| of abundant comments asm necessitates indicates well enough
| what the read/write is doing, and if I want to look up the
| register to get a better idea of it, well...the names are
| unofficial, there isn't clear consensus about what these
| registers should be called, so it's easier to lookup the
| address in docs, too. Eventually the common ones you memorize,
| anyway; there's only a handful on these systems.
| karmakaze wrote:
| Same. I started on an Atari 8-bit and had most of the i/o
| memory map memorized in both hex and decimal as well as the
| ROM i/o routine address/parameters.
| nubinetwork wrote:
| Yes.
|
| https://www.nesdev.org/wiki/APU#Registers
| https://github.com/cc65/cc65/blob/master/asminc/nes.inc#L44
| kristiandupont wrote:
| Still seems to me like something there should be "standard
| library" symbols for? Or is there some cultural reason for
| this?
| Drakim wrote:
| Some people prefer localhost, others like 127.0.0.1
| nubinetwork wrote:
| You would think so, but between NIH, old unmaintainable
| code (like nesasm/magickit), or not knowing other code
| exists, a lot of times you'll see people reinventing the
| wheel.
| pubby wrote:
| There's standardized names for the graphics registers. The
| convention for the sound registers is to use the address
| itself, as there are lots of sound registers and each does
| multiple things.
| postalrat wrote:
| Would you rather have a many different set of constants for
| the same addresses or just the addresses themselves?
|
| Or do you think all NES developers can agree on the same
| names?
| pubby wrote:
| This is a long-running personal project I've had to write an
| optimizing compiler from scratch. Everything was done by me,
| including the lexer/parser, SSA-based IR, high-performance data
| structures, and code generator.
|
| Originally I wasn't targeting the NES. It started as a scripting
| language, then it morphed into a C++ replacement, and then
| finally I turned it into what it is today. The large scope of the
| project and colorful history means it's still a little rough
| around the edges, but it's now working well enough to post.
| nunobrito wrote:
| It is looking fantastic. Great work!
| tibbon wrote:
| Not to increase your scope, but have you considered making it
| work across other 6502 systems?
| pubby wrote:
| That was the original plan, but I veered off to focus on
| doing one system really well. I figured if some company
| wanted to sponsor a port, I could do it, but otherwise I'd
| direct people to other compilers like LLVM-MOS. I do think
| it's possible to port, but it's not trivial. Some areas -
| like the linker - are very specifically designed for the NES.
| agiacalone wrote:
| This is a really neat project. It reminds me a lot of
| Inform, in the sense that a full "modern" language was
| designed around creating an older-style of game.
| TedDoesntTalk wrote:
| > if some company wanted to sponsor a port
|
| I don't think any company in 2023 is going to sponsor port
| of a 6502 compiler, unfortunately.
| detrites wrote:
| You may be mistaken. Retro hw/sw and gaming is a booming
| business at the moment. Plenty of crowdfunded projects
| that have been overfunded and then delivered, and even
| consumer goods being shipped worldwide in major
| department stores.
| cpeterso wrote:
| There is an experimental LLVM backend for 6502!
|
| https://llvm.org/devmtg/2022-05/slides/2022EuroLLVM-LLVM-
| MOS...
| [deleted]
| pkaye wrote:
| You should make a link to the examples directory prominent on
| the webpage so others get an quick idea of the language
| features.
| agentultra wrote:
| This is very cool. I had wanted to do a project like this once.
| Nice work!
| bmitc wrote:
| As someone trying to undertake some personal projects like this,
| I have a question. How do you keep motivated enough to work on
| this for so long and dedicatedly? As a solo developer, how did
| you manage things like getting stuck on technical issues that
| were either bugs out of your control or something you didn't have
| the knowledge to know how to fix?
| pubby wrote:
| Motivation was sporadic. I'd have a few weeks of intense focus,
| followed by months of inactivity. The nice thing about
| compilers it that 90% of their code is interesting, so there
| was always something fun worth coming back to. Besides, I put
| other projects on hold so I wouldn't get distracted.
|
| I don't always know the best way to do something, but so long
| as I know _some_ way to do it, I can make progress. Tough bugs
| are just a matter of perseverance. And hey, if it 's still not
| working, just drop the feature. In a personal project, you can
| do that and nobody can stop you.
|
| One more thing: don't talk about your projects until they're
| 95% done. Seeking early validation is a poison pill.
| bmitc wrote:
| Thanks for the response! My projects aren't that far along,
| but this echoes a lot of my experience and helps me remember
| these are common feelings.
|
| > I don't always know the best way to do something, but so
| long as I know some way to do it, I can make progress.
|
| This helps a lot. Thanks! One of my issues is being able to
| be ok with feature gaps or bugs. I can solve them if they
| were created by me, but there are some that need outside help
| as they are likely bugs in external software or even drivers.
| But maybe it makes sense to press on and revisit later.
|
| > One more thing: don't talk about your projects until
| they're 95% done. Seeking early validation is a poison pill.
|
| Is this because you draw attention to an unfinished project,
| get distracted by feature requests or praise, or something
| else?
| pubby wrote:
| Yeah, external bugs suck, but usually there's workarounds.
|
| > Is this because you draw attention to an unfinished
| project, get distracted by feature requests or praise, or
| something else?
|
| If you get a bad reaction, you'll be demotivated. If you
| get a good reaction, you'll feel satisfied and not have the
| drive to keep working. Either that, or you'll devote more
| and more time to posting on social media, getting less work
| done in the process.
| detrites wrote:
| > If you get a bad reaction, you'll be demotivated. If
| you get a good reaction, you'll feel satisfied and not
| have the drive to keep working.
|
| This is so important, and not only for sw dev but
| anything.
|
| Anyone who is struggling with completing personal
| projects, try starting the next one with the explicit
| goal to not speak about it - with anyone - until it's
| either complete, or very near. It may be hard to do at
| first but ultimately worth it.
| proper_elb wrote:
| If you don't mind: What would you working on it look like, on
| a typical work-day look like, hour wise? Raise up at 5am and
| hack away for 2h, or come back from day job and straight into
| the fun thing, or wait a bit and than hack away... What
| worked for you?
|
| Lately, I seem to manage 1-3 days of coding on my hobby
| project after work, provided I have some features where I can
| see meaningful success within 90 minutes of coding (+ the
| same time for debugging or researching new libraries, if
| needed)
| pubby wrote:
| I think it helps that I'm not working as a software
| developer right now, so I have more energy for coding
| projects. (I'd like to write software professionally, but
| no company responds to my applications.)
|
| Regarding time, I have thinking periods and coding periods.
| On thinking periods I'll take a 30-60 minute walks and
| figure things out in my head. On coding periods, I'll spend
| 1-2 hours in the text editor per day, sometimes more, at
| whatever time suits me. It's pretty laid back and I don't
| beat myself up if I stop.
| proper_elb wrote:
| Sorry for the assumption and thank you for your answer!
| Regarding time, I work similar. In work-life, it gets a
| bit more muddy (basically the time talking walks expands
| and turns into time spent in meeting, talks, support
| etc.)
|
| I would encourage you to ask here on HN and maybe also
| over at reddit (i.e.
| https://old.reddit.com/r/cscareerquestions) for feedback
| on landing a software dev job. Getting the foot in the
| door can be tough, after that it get easier. I wish you
| best of success in landing a job! :)
|
| Edit: It might be a good idea to mention your current job
| search in your most visible comments here in this thread.
| Also, you could mention it on your website! ;)
| and0 wrote:
| I strongly agree on the last point about early validation,
| albeit with two exceptions: when you're marketing a product
| you want to sell and want to generate hype, or your product
| requires early feedback. I've kept things hidden to keep
| myself motivated only to find I was left with the horribly
| unmotivating task of _shudders_ marketing. Also, my friends
| who I thought would love it had fundamental changes they 'd
| want to find it useful.
| MysteryChessBox wrote:
| Honestly keeping yourself motivated through the end is a
| monumental task and I can only do it on smaller games (which
| coincidentally fit the NES hence why I actually have a finished
| game on it). It's all too easy to just quit when all the fun
| stuff gets programmed, leaving only the boring parts left. If
| there's a magic trick for bigger project motivation I'd like to
| know, too.
| cloogshicer wrote:
| Think of something you really enjoy doing. As a random example
| I'll pick "playing video games".
|
| Now, imagine you've been playing the same game for a couple
| days in a row. And you're getting kinda sick of it. Not that
| it's bad, it's got its good moments. You've just had enough of
| it, for now. Would you continue playing it?
|
| The answer is (hopefully): Of course not! You'd move on to
| something else you enjoy more. If the game was truly engaging,
| you'll come back to it anyways, maybe a few days/weeks/months
| later, when it captures your interest again.
|
| Since a few years this is my attitude towards side projects.
| The flipside is that you have to accept the fact that 99% of
| the things you start will never get finished. But that's ok, as
| long as you enjoy the work itself. Of course that doesn't mean
| there aren't difficult moments. But there has to be a genuine,
| intrinsic motivation, which is independent of shipping
| something.
|
| Keeping a journal/todo-list for every project (I use an
| infinite bulleted list like Dynalist) really helps, since you
| can just come back to a project anytime by looking at the end
| of the list.
| warpspin wrote:
| Pretty cool project. While I never did NES games, I did assembler
| on the C64 for a while. The language alone minus the NES parts
| would already have been super useful back then at least for the
| high level parts of the programs I wrote.
| jonny_eh wrote:
| > Handling banks is normally a tedious affair for programmers,
| but NESFab handles it for you. The compiler smartly allocates
| code and data into banks, with the gritty details abstracted
| away.
|
| Killer feature, but is there a cost to bank switching? Could
| abstracting it result in a lot of performance cost?
| pubby wrote:
| There is a cost: subroutine calls get wrapped in something
| called a trampoline, and some data is duplicated across
| multiple banks. You would do both of these things in assembly
| language too, and could even do it more optimally, but it's an
| NP-hard problem and takes a lot of thinking.
| nubinetwork wrote:
| Its nice that people are still writing code for the NES, but I
| have to ask what makes this better than using ca65... assembly
| isn't hard to learn.
| pubby wrote:
| I like 6502 assembly a whole lot, but there's definitely
| limitations to it at scale. Multi-byte arithmetic is a chore,
| bank switching is a pointless time sink, and managing local
| variables makes me want to pull my hair out. Those were the
| deciders in making this.
| karmakaze wrote:
| Use an assembler with macros. I spent so much time 'in the
| zone' of Atari Macro Assembler[0] editor MEDIT, that when
| someone interrupted me I'd simply respond "I'm in medit" as
| if in meditation.
|
| [0] https://atariwiki.org/wiki/attach/Atari%20Macro%20Assembl
| er/...
| a_e_k wrote:
| Nice work! Pubby, it looks like the markdown for the
| documentation goes off the rails in 12.3.
| dom96 wrote:
| Really cool but shouldn't this actually be a library rather than
| a programming language?
| detaro wrote:
| Given the authors top comment here the answer to that is a very
| clear "no".
| algem wrote:
| this is really cool, thanks for sharing.
___________________________________________________________________
(page generated 2023-03-07 23:00 UTC)