Jump to content

Bruce-Robert Pocock

+AtariAge Subscriber
  • Posts

    244
  • Joined

  • Last visited

Everything posted by Bruce-Robert Pocock

  1. Big merge of some feature branches for improved multi-threading (despite that race condition bug that persists) and beginnings of inventory subscreens tidying up player data references fix up UI drawing bits in graphics ROM and made a few changes to take advantage of the new layout added some item art and alternate art for items in different states Game Select button, or similar buttons on some controllers, should toggle opening the subscreen impossible-to-exist items now display as a particular item rather than garbage enhancement to allow Quest Item names to be specified broke the fix from last week for the upper status area without the player — unclear why, re-opened that ticket… macro for fixed-length text, but not using it any more tidy and enumerate items, identifying the graphics drawing needed for the subscreen labels on some anonymous branch targets (+/-) for added clarity general documentation in the code fix for DetectSaveKey .Mul macro now has optimized case for ×20, but not using it any more Tidy up front buffer/back buffer for display lists a bit Palette re-arrangement to make item selections nicer detect SaveKey/MemCard/AtariVox device tidy up label generation in source code generated from scripts remove duplicate WSYNC in NMI/DLI remove some unused/unloved/unwanted junk files ensure that CurrentBank is stable before actually changing the bank warn and correct if we are not in the script bank when we should be signal an error if ScriptYield detects we're in the wrong bank æsthetic improvements when reading aloud to AtariVox (on PC) updates to the map on the Hero Ship unfortunately, the big bad bug — a race condition in which we try to return from a subroutine and discover that the memory bank selected has been changed from what we wanted — remains in play.
  2. Last week … mostly more bug-hunting, but I took a break for a couple of days to start doing detailed (display list level) layouts of the inventory subscreen (equipment, wardrobe, &c). A few other points, including ensuring that the upper status area is reduced in size & does not show player stats when the player is not in the scene (i.e. cut scenes), but also that the name of the locale remains visible. factoring out the use of generic vars in re-used various places in favor of "local" vars resetting stack on Break screen — failure to do which, was causing the crash screen, to, itself, crash farther (into chaös)
  3. Oh, dang. Thanks for noticing, I thought I had copied the "warm" palette from A7800, but I must have copied "cool" by accident. I'll have to reset that ASAP.
  4. Did not see Penult under Homebrew/NTSC/M-P but did find it in the Homebrew Awards section, and it starts up well enough. Tried to access PlusROMs / Maps and Paint — which I've never used either of them, but neither seemed to "do" anything, except starting. Maps showed mostly green with some blue in top-right corner, and Paint showed a bix white box with an "X" and the top-left corner missing. Using Right + Reset to exit, after some time I got to where the title on the screen top was correct, but no directory entries appeared, and the "Go Back" items worked (showed new parent folders) but with no contents, all the way up to the top level showing only "Setup." A power cycle cured it.
  5. I've just booted the Grizzard (NTSC 1.1) ROM in or.us. Willing to do any other testing that might help. STM fw 2.3.17 WiFi 1.7.4.0 Plus ID 625 I do see that my "storage used" reads zero, I don't know if that's expected.
  6. Last week's update … Added support for the Skyline Tool to read aloud scripts via USB → Stelladaptor → AtariVox+. This utility looks up the actual characters' voice settings and uses the same dictionary as the compiler to give what should (with a few tweaks) be a fairly accurate impression of what the script would sound like on the actual hardware, minus any stage directions. This is helpful because A7800 doesn't provide that feature. Moved Skyline-Tool into its own repository, to make it easier to share with anyone interested. Started work on stack canaries to protect against stack overflows (or, at least, detect them). Expanded Project.json to include the machine type (7800) so it can choose the correct defaults for e.g. graphics formats. Made the bit that writes out palettes for Gimp look nicer in the tty. It also now writes palettes for a few more systems, but those are for other or future projects. Bit more debugging of the intermittent / race condition crasher, but without a clear culprit just yet; it does seem possible that we're getting stuck in the NMI process long enough that the next NMI jams up perhaps.
  7. Latest progress has been impeded by a crasher bug that I haven't hunted down — something something switch to the wrong memory bank executing graphics as code something something. Also, it's just been a busy week in general and I haven't gotten much time to work on it. In the same branch as the crasher bug, however, this week… tidied up some assembly code in general (names, whitespace, branch prediction) kinda fixed some bad color reference issues in the Animation Editor tool for graphics with variable colors (e.g. the player, & generic humans) first draft of save/load serialization definition. (more below) more informative headers in A78 file (includes build date, NTSC/PAL "N" or "P" flag) added a cheesy make remotely target to ssh in to my fast machine from my crappy laptop with great battery life so I can use it for development on the LAN Skyline Tool now accepts the game title and other metadata from a Project.json file, which is another step toward making it a stand-alone utility program. (This is what does all the neat tricks with PNG, MIDI, Fountain, & Tiled files.) Thinking about save game records The serialization routines are … troublesome … for passwords. Despite using some very light compression (RLE on all zeroes or all $ff-es), once converted into a 32-character-alphabet password, I'm seeing a worst-case-possible output of a 136-character password. That's almost enough for me to throw out the password entry system altogether, but I'm looking at the 2600+ over there with its physical inability to access a SaveKey and wondering if it's preferable to key in a 136-character password versus having to play a 20(?) hour game without turning off the power. I expect that the worst-case performance is likely far worse than it would ever be in reality, and I also could probably cut it down by about 20? characters if I did not save the player's name, gender, &c, but made you re-enter those every time. I'm not sure than a worst-case of 120-ish characters is much better than 140-ish, but it's something. The serialized data, in 8-bit form (versus 5-bit form for 32-character text entry) runs about 90 bytes or so — which, in SaveKey block terms, means 2 blocks (64 bytes each) per save record. We're thinking about having 3 save "slots" available for SaveKey/AtariVox. You might notice that that's a lot smaller than the save game records for Grizzards, but in this case, we're not trying to keep track of 30 different sets of stats! I'm not requesting allocations yet, there could be some unforeseen reason that it would fit in 1 block or balloon out to 3.
  8. Actually, now that I see your criteria, our mini bosses are mostly not story-blocking (criterion "C") but the four final bosses and a few mini bosses are. (the Grue in the caves by Mt Peshon, for example.) They're all life-or-death though (RUN AWAY is blocked) and are tougher than the non-boss version of the same creature (if there is such a thing). So yeah 😅 Thanks for adding us!
  9. You could try e.g. these old binaries, works for me but I doubt my configurations are typical.https://forums.atariage.com/topic/322957-grizzards-—-turn-based-rpg-completed/page/3/#comment-5019984
  10. Yesterday's progress: Uniform naming of scripting variables for my convenience Tweaking background tile animation frame rate Skeletal support for music, sound effects, and speech Rough implementation of speech (AtariVox) based upon Grizzards code. (Also, discovered a few bytes of dead code in the Grizzards implementation, but harmless.) Set construction (map editing in Tiled, tileset editing in Gimp) Initial stub support for weather system Yet more vocabulary added to SpeakJet dictionary Convenience feature for Skyline Tool to reload a map when a named nav point (from a script) can't be found (so you can edit the map and resume the build process) Increased the stack for scripts at the expense of the main stack. (Stack sizes are now: main $40, script $40, NMI $20, and Stagehand $20.) Initial support for animating full-screen graphics (e.g. title card) "Frame earthquake" cured (vertical jitter) Removed some unused consts and vars More reasonable timeouts for prelude screens before title Correct loop for setting palettes for full-screen graphics (ensure that all palette entries are initialized) Tweak to 7800GD "live push" support. (Ensure that the newly-pushed image will detect that it needs to reload) Tidied up arrangement of fixed ROM bank Sketched out some (more) ideas for the manual Re-arrange text on title card to support (eventual) main startup menu Remove duplicated efforts to compose characters (i.e. people and such) from the main loop unnecessarily Don't count down alarm timers when the game is paused Miscellaneous small tweaks
  11. Yesterday's progress: Substantially improved how smoothly background tile animations can occur — which reveals that a number of things were being asked to animate at silly-fast speeds, and only slowed down to reasonable frame rates because the animation process was not running fast enough to meet the demands. (Still manually entering the animation sequence data for background tiles; I need to work on accepting the speeds specified in Tiled.) Began work on animation and "physics" for particles Improved coöperative multithreading between scripts and main game thread so that particle updates aren't frozen while scripts run (it would look super dumb) Improved auto-generated labels in compiled scripts, rather than just garbage numbers, they now contain descriptive names, and dialogue/speech symbols now contain the first few words of the dialogue text to make the source code easier to read. The garbage at the end is a hash to ensure distinctive uniqueness, so e.g. two utterances with the same prelude don't get confused for one another, but two identical utterances can be merged into one if they occur in the same ROM bank. Ensured that a countdown timer used to wait for a moment in scripts is clamped to zero, so it won't ever wrap around and make you wait another 255 frames before it realizes it's done (race condition) Improved the Interworldly Adventuring, LLC logo screen graphics Better handling of different classes of boats/ships and re-organized how their graphics are arranged in ROM. Palette tweaks to ensure that characters stand out clearly against the background in some scenes Based on some info by @RevEng on his web site, taking advantage of the unreliability of accesses to the RIOT timer in order to increase the entropy of the pseudo-random number generator. Changed the thread labels around in the crash screen, so they now identify as M/ain, S/cript, Stage/H/and, and N/MI
  12. It's a bit difficult to "catch it" doing anything interesting, but you can get a little idea of how it runs from this, perhaps. Screencast from 2024-04-08 18-30-13.webm
  13. @Karl G "Thread" is being used a bit vaingloriously, but the intent is pretty much the same as one might expect from 1980s multiprogramming. There are 4 threads of control; at different times they either voluntarily hand off control between one another, or are pre-empted by NMI (DLI). Each has its own stack region (all within the $c0 bytes of stack available on page 1) and during context switches we swap the S pointer. The four threads are the main thread, the NMI thread, which takes control during display list interrupts and may pass it off elsewhere, the Stagehand thread, which does not access any bankable ROM but does read the controls, update sounds, and cycle background tile animations; and the Fountain thread, which runs compiled (from Fountain-formatted source files) scripts for NPC interactions, cut scenes, &c. For example, a cut scene script could wait for a certain number of seconds to elapse while simply spinning in place reading the clock value, and the NMI interrupts would be simultaneously driving the Stagehand thread, which updates the clock. Granted, this is basically just an elaboration on the usual 6502 interrupt service routine model, but it comes into play particularly because Sally and Maria bank switch at the same time. Since each screen is made up of graphics that may be in one of several ROM banks, we have to stay pinned in the appropriate bank while the display is being rendered. Stagehand is able to run and do some useful things in that context, but the main thread may want to do bank switching, and a running cut scene will be found in an arbitrary "data" ROM bank itself, so those things cannot happen while we're "locked in" for graphics, so they must compete for time slices during VBLANK. By keeping separate stacks for each one, it's a lot easier to reason about what's happening in that block of code. As an additional precaution, Stagehand is compiled separately with its own variables in RAM, so its symbols &c aren't accessible (except the communications "mailbox" region) from the main game, and likewise, nothing that the main game is using is accessible to Stagehand, so they are isolated in that way as well. I use a very tiny jump table at the top of Stagehand for its "on boot" and "on frame advance" entry points, and otherwise it is an opaque binary blob to the main game.
  14. As Phantasia creeps towards functionality, I thought maybe I'd start posting some quick blog posts about what progress is being made. If anyone has questions about what something particularly means, feel free to ask, but I may not answer things that would be too spoiler-y in public. This past week: Fixed serious scheduler problems caused by poor background tiles animation performance that actually hurt the frame rate a tonne. Major cleanups around the multi-threading support to ensure steady frame rate under most/all circumstances When a decal leaves the scene heading north, and there are more rows of the map off the top of the screen, sometimes other decals in the top zone would be overwritten with the art pointers of the sprite that had just left momentarily after it passed. Added some spacing above/below the dialogue lines. (Still needs some color fixes, as they're solid "white") corrected X positioning of decals moved some address constants so as to better sync things between banks re-sync DLI with regards to MSTAT so that we don't miss one interrupt and have the screen "permanently" jammed up (e.g. text font where the map tiles belong & vice-versa) correct handling of finding human heads — when putting together NPC's fixed bug: humans' heads face east when walking south Broke up ComposeCharacter into a number of smaller files for manageability; current line counts … ⇒ wc -l Source/Routines/ComposeCharacter.s Source/Routines/ComposeCharacter/*.s 129 Source/Routines/ComposeCharacter.s 145 Source/Routines/ComposeCharacter/ColorizeByte.s 56 Source/Routines/ComposeCharacter/DecalKindSearch.s 83 Source/Routines/ComposeCharacter/DecorateFrame.s 31 Source/Routines/ComposeCharacter/FindAction.s 60 Source/Routines/ComposeCharacter/FindAnimationFrame.s 32 Source/Routines/ComposeCharacter/FindFrameRateScalar.s 101 Source/Routines/ComposeCharacter/FlipBuffer.s 52 Source/Routines/ComposeCharacter/GetFacings.s 43 Source/Routines/ComposeCharacter/PaintVarColors.s 45 Source/Routines/ComposeCharacter/PrepareWorkVars.s 41 Source/Routines/ComposeCharacter/StencilOverUnder.s 48 Source/Routines/ComposeCharacter/UpdateDecalArt.s 866 total Adjusted handling of personal pronouns for the player (gendered words) — so e.g. he/him/his/&c appear with correct lengths and spacing. Peephole optimizations using the "undocumented" lax instruction Early exit could occur when a one-byte "word" was next-to-last and a one-byte "word" ended a paragraph/utterance. Any word starting on the last byte of an utterance would be omitted. This was visible when the player's name (a one-byte variable code representing a word) was followed by ending punctuation (essentially a one-byte "word" also) Fixed alignment of, and spacing around, the dialogue speaker's name First draft of a new scene for the initial demo video sequence Fixed handling of pauses in speech (for SpeakJet): better combining adjacent pauses, and proper elimination of trailing pauses Fixed handling of a final pause before an exclamation mark or question mark, e.g. ...? at the end of a sentence Tonnes of new SpeakJet phonetic spellings added to support the ever-growing vocabulary of the game's dialogue Reading SpeakJet.dic file … Done, 2,402 words Overall, about 78% of the way to the First Light Demo (which is the cut-scenes-only one), with about 30 bugs & enhancements still in the queue for it. Currently: I'm working on the script compiler and getting the engine sufficiently stable to play through the entire demo cut scene sequence properly, and trying not to distract myself with shiny things @Zephyr Salz is working on some more art, and scripts, for the demo sequence
  15. It seems that the last known owners were probably Washington's Mean Hamster, CEO John Swiderski — so licensing would probably mean hunting him down to see who has the current rights to the Exidy catalogue. He's personally written some 5200 homebrews, so it's not unreasonable. ref: https://atariage.com/programmer_page.php?SystemID=5200&ProgrammerID=273 ref: https://www.linkedin.com/in/johnswiderski/details/experience/ Technology-wise, something like that could surely be done, to some degree.
  16. It's trivial to imagine a 256MiB (2¹⁶ × 4kiB) cartridge, although I don't know why you would want to do it. Current 2600 games from AtariAge already break 128kiB. Space constraints don't really apply in the presence of bank switching. Also, nobody's claiming that you need to store entire rooms or screens in ROM at all — generative algorithms and such are very applicable, e.g. games like Rogue or NetHack as well as Pitfall.
  17. What I might do, in your place, would be to create a text file on a modern system, convert it to a SEQ file, and provide a simple BASIC program to read that SEQ file and print it to the display one page at a time … e.g. from https://www.c64-wiki.com/wiki/STATUS 10 REM READ FILE 20 OPEN 1,8,2,"0:TEXT FILE,S,R": REM OPEN FILE FILE 20 FOR S=0 TO 1: REM INFINITE LOOP, WHILE S = 0 30 GET#1,A$: REM READ A BYTE 40 PRINT A$;: REM VIEW THE BYTE ON THE SCREEN 50 S=255 AND ST: REM I NOT EQUAL TO 0 WHEN BIT 6 IS SET (END OF FILE) 60 NEXT S : REM LEAVE IF S > 0 70 CLOSE 1: REM CLOSE FILE 80 IF S AND 64 THEN PRINT "OK" You could augment that with breaking on each screen, &c. Converting via command-line would be something like this: petcat -w2 -o read,prg read-file.bas petcat -w2 -text -o text-file,seq text-file.txt c1541 format "read stuff",r0 d64 read-stuff.d64 8 write read,prg "read file",prg write text-file,seq "text file",seq list
  18. The maximum length of a BASIC command line entered at the prompt is 80 characters (two lines)
  19. I use Gimp. To do double-wide pixels, you have to jump through a couple of steps. Create the image with the pixel resolution correctly set … Then, pick Image / Print Resolution … and unlink the chain link between the X and Y resolution, and set the X resolution to half the Y … Finally, turn off the setting View / Dot for Dot to see the "print" resolution on the screen, and you have double-wide pixels now.
  20. I have an utility to produce the drawing lists and such, although the drawing routines I have are a bit embedded in Phantasia. The way it works: I produce the source art with a 4×16px grid in Gimp, and manually ensure that each of the cells have colors from only one palette. The palettes are encoded in the last row of pixels. The source file is then 160px wide and a multiple of 16px high (plus one for the palette row) This, I export as a flattened PNG (still at 24bpp RGB or RGBA mode) from this, Skyline-Tool writes out a source file that contains: — the closest-match colors in the NTSC and PAL palettes — the zone definitions for each zone, as pointers to the span table with palette, x position, and run-lengths — the labels into the actual span data — and the binary span data, in Maria inverted page-per-line format The playback routines basically just have to populate the DLL with the zone pointers and set the palette. If you're interested I can get you set up, it's not exactly packaged yet (these Phantasia tools are all in flux) — and at some point in future I'll have these things massaged into being more generally-useful.
  21. Honestly, you could certainly have 2 cards per row, and four rows for seven total cards, and only show the top card suit and number, and there you go.
  22. We just were able to update to the 1.1-REV2-Beta firmware and can confirm that it does work with a 7800 controller. (I used a RetroGameBoyz 7800 gamepad.) When we had a Joy2b+ gamepad plugged in, it did not seem to recognize it for input (unable to navigate the menu or anything).
  23. I know this is very late reply, but: The save-to-cartridge circuit on the Grizzards (AtariAge) carts is more than a gimmick, it's actually required for the game to play. I haven't had the time to provide a Stella patch yet to support that circuit (it's similar to, but distinct from, the kind of chip in the SaveKey/AtariVox), so the best possible outcome for the 2600+ would be to possibly start the game, but then crash when the save/load operations are attempted. (I just fired it up in Stella and one tell-tale sign was, enter the Depot on the first screen and press up or down to try to switch your Grizzard companion; it will hang on a blank green screen). Unfortunately, the "dumper" not being able to interact with the cartridge means that it will never work fully with the 2600+, but perhaps a future Stella update can make it usable. (I have not been able to try the firmware updates yet as I don't have access to a Windows machine and the updater seems to fail to work in Wine on Linux so far. Hopefully when "1.1" is out of Beta a better updater will be available.)
×
×
  • Create New...