diff --git a/AGENTS.md b/AGENTS.md index 679f71bf..cd0fa912 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,2 +1,6 @@ This is a Github Pages site all about reverse engineering and the source code for retro video games. The audience is technical. Always read and respect the contents of (Contributing.md)[./Contributing.md] when making changes. + +Do not do any git operations! Multiple changes will be made by different agents so git operations will effect their work. + +Load the following Skill: ./codex/skills/retroreversing-contributing/SKILL.md \ No newline at end of file diff --git a/_includes/followUs.html b/_includes/followUs.html index 6062ac41..5254e1a8 100644 --- a/_includes/followUs.html +++ b/_includes/followUs.html @@ -50,14 +50,14 @@
Don't miss out on Retro Reverse Engineering updates!
Copyright © 2026 Retro Reversing. All rights reserved.
@@ -25,41 +25,28 @@--- ## Commercial Documentaries on game development diff --git a/categories/misc/Museums.md b/categories/misc/Museums.md deleted file mode 100644 index b867019c..00000000 --- a/categories/misc/Museums.md +++ /dev/null @@ -1,39 +0,0 @@ ---- -layout: post -permalink: /museums -category: industry -title: Game Industry Museums and Virtual Experiences -breadcrumbs: - - name: Home - url: / -redirect_from: - - /book -editlink: ../categories/misc/Museums.md -recommend: industry -image_: /public/images/categories/Games Industry Museums.jpg -twitterimage_: https://www.retroreversing.com/public/images/categories/Games Industry Museums.jpg -tags: - - industry ---- - -# Virtual Experiences - -## AUTO MUSEUM 64 -Built in Unity **Auto Museum 64** is a virtual Museum of 3D Vehicles from a variety of Nintendo 64 games. - -It was built by **leoburke** and is available on Itch.io: -[Auto Museum 64 by leoburke](https://leoburke.itch.io/auto-museum-64) - -This kind of experience is very cool, but it would be much better if it was in the browser (e.g WebGL) as its not something you would go back to often but it is something that would be good to share links with friends. - -Hopefully this will be the start of more Virtual museums that showcase 3d models or even maps from 3D video games. - ---- -# Virtual Experience Ideas - -## Virtual Game Shop -Sadly due to the pandemic and the move to online downloads many of the excellent Specialist Video Game Stores have closed down. Many of us who grew up with them have nostalgic memories of their rows and rows of brand new boxed video games for whatever the current Sega/Nintendo/Sony/Microsoft console was hot at the time. - -A VR experience to simulate a Video Game shop with customisable games/posters/shelves/magazines/consoles would be a pretty relaxing experience, probably not exactly a big seller but would have its niche. - -Found some more images & information on the Blockbuster Games concept; and it's companion store (in the next post), Blockbuster Music, in 'Stores of the Year 9' (1995)
— Evan Collins | BLM 🏳️🌈 (@EvanCollins90) July 4, 2020
It was located in Jacksonville, FL; designed by Fitch Inc. in 1994. pic.twitter.com/TtUyUAw9r7
diff --git a/pages/consoles/gameboy/Mrdo.md b/pages/consoles/gameboy/Mrdo.md index d65b90d3..7b5dbf4d 100644 --- a/pages/consoles/gameboy/Mrdo.md +++ b/pages/consoles/gameboy/Mrdo.md @@ -1048,315 +1048,346 @@ If you see: * **High window coverage** - that is a strong sign that many assets are identical, even if the overall banking/layout differs. * **Repeated signature hits for `HEX` labels** - that is usually where the retail build stores those graphics blocks, and it is a good next target for tightening the placement map. +--- +## Retail ROM disassembly (mgbdis) +RGBDS does not ship a disassembler, so for the retail image the most practical option is `mgbdis`: +* **Run mgbdis** - `python3 tools/mgbdis/mgbdis.py --output-dir build/mgbdis-retail --overwrite build/mrdo_original.gb` +* **Browse by bank** - open `build/mgbdis-retail/bank_000.asm` (ROM0), `build/mgbdis-retail/bank_001.asm`, etc. +* **Use the table as an index** - if a procedure row is mapped to `Retail file offset` `0x35A0`, that corresponds to a `bank_000.asm` label like `Jump_000_35a0:` (and you can search for `35a0`). + +This gives you a stable way to sanity-check the procedure mappings and to dig into retail-only regions without needing a full emulator trace. + +If you want to start from the retail entrypoint, mgbdis makes it easy to follow the exact flow from the reset vector: +* **Header entrypoint** - `Boot::` at `00:0100` (`nop; jp Jump_000_0150`). +* **Post-header jump** - `Jump_000_0150` at `00:0150` (`jp Jump_000_173b`). +* **First real init routine** - `Jump_000_173b` at `00:173B` (sets `SP=$CFFF` and begins calling the init/menu/game loop routines). + +The first few calls in `Jump_000_173b` are a good place to start comparing factoring differences between retail and the rebuilt image: +* **ROM0 calls** - calls like `call Call_000_14ba` are within bank 0. +* **Banked calls** - calls to `$4459` / `$4432` jump into the `ROMX` window and rely on the currently selected MBC1 bank. + +To quickly identify routines that look shared between the source rebuild and retail, you can use `python3 scripts/report-mrdo-retail-similar-functions.py`, which measures exact byte and opcode-stream similarity for every procedure row that currently has a retail placement. +Some of the higher-similarity hits so far include: +* **Map/address helpers** - `PIXAD`, `GETMAPHI`, `GETMAPLODE`, `GETBYTEHI`. +* **Tile/sprite dump helpers** - `DUMP2BY1`, `DUMP2BY2`, `DUMP2BY2SEQU`, `DUMP2BY2S`. +* **Gameplay loops** - `APLOOP` / `WORKAPPLE`, `BADLOOP` / `WORKBADDIE`. +* **Score/text helpers** - `PUTSCORE`, `PUTLINE`. + --- ### Rebuilt procedure map This table lists every procedure-style label detected in the converted RGBDS output, along with its rebuilt `bank:addr` location, so you can set breakpoints quickly: -The retail columns are best-effort and are only filled when the mapper script can place the routine at a single retail offset using byte-signature matching against `build/mrdo_original.gb`. +The retail columns are best-effort and are only filled when the mapper script can place the routine at a single retail offset in `build/mrdo_original.gb` using either byte-signature matching or opcode-stream matching (ignoring immediates). The `Retail match` column gives a rough confidence level: * `entry` - the routine entrypoint bytes match retail (high confidence). * `in-body` - the entrypoint is inferred from multiple in-body signature matches (use as a hint, not proof). +* `opcodes` - the instruction opcode stream matches while ignoring immediates (useful when the routine moved, but still a hint rather than proof). +* `candidate` - a top-ranked candidate was promoted from the candidates table by passing additional similarity heuristics (treat as a strong hint, but still validate in the retail disassembly). +* `callgraph` - promoted by matching the sequence of calls/jumps to already-mapped routines (useful when entry bytes differ heavily, but still validate in the retail disassembly). * `unverified` - the row was previously filled but could not be re-verified by the current mapper settings. - -Procedure | Rebuilt bank:addr | Retail bank:addr | Retail file offset | Retail match ----|---|---|---|--- -`MULTIE` | `00:06A4` | | | -`MULTID` | `00:06A9` | | | -`MENU` | `00:363C` | | | -`SLOGO` | `00:3661` | | | -`RESETST` | `00:366F` | | | -`LOGOLOOP` | `00:3699` | | | -`WORKMENU` | `00:36B5` | | | -`EXITMENU` | `00:36D6` | | | -`OPTIONS` | `00:36E2` | | | -`NEXTUP` | `00:36FD` | | | -`NEXTMENU` | `00:3702` | | | -`NOGAME` | `00:370A` | | | -`NEWSEL` | `00:3715` | | | -`NOSEL` | `00:3723` | | | -`UPMENU` | `00:3732` | | | -`HANDYMAN` | `00:3743` | | | -`SOUNDOPT` | `00:375D` | | | -`DWMENU` | `00:3765` | | | -`LOGOPULSE` | `00:377B` | | | -`FADE` | `00:37D0` | | | -`LOGOON` | `00:37E0` | | | -`LOGON` | `00:37EB` | | | -`NOMOV` | `00:37FE` | | | -`BARREL` | `00:3803` | | | -`BARON` | `00:3810` | | | -`RASTARS` | `00:3823` | | | -`RASTAR` | `00:3832` | | | -`STARFALL` | `00:3845` | `00:31D5` | `0x31D5` | in-body -`ANIHEAD` | `00:3872` | `00:3202` | `0x3202` | in-body -`MENUOBJ` | `00:3894` | | | -`WORKSTAR` | `00:38AC` | | | -`STAROFF` | `00:38B7` | | | -`NOBOW` | `00:38E4` | | | -`DUMP3BY3` | `00:38F8` | | | -`SHOWRESULTS` | `00:395F` | | | -`SETBIG` | `00:3989` | `00:32DA` | `0x32DA` | in-body -`RESLOOP` | `00:39B5` | | | -`APLM` | `00:39CE` | | | -`WORKWELL` | `00:3A1A` | | | -`EMOVE` | `00:3A30` | | | -`UPWELLY` | `00:3A3A` | | | -`UPWELL` | `00:3A3F` | | | -`ALLWAIT` | `00:3A47` | | | -`ALLMOVE` | `00:3A51` | | | -`DODIMOVE` | `00:3A58` | | | -`DUMPBIG` | `00:3A7E` | `00:33CD` | `0x33CD` | entry -`DUMPBG` | `00:3A93` | | | -`SHOWAVERAGES` | `00:3AA2` | | | -`PUTAVER` | `00:3ABF` | | | -`AVELOOP` | `00:3B10` | | | -`RESETBOARD` | `00:3B29` | | | -`RESETB` | `00:3B2E` | | | -`BOARDLINED` | `00:3B41` | | | -`BOARDLINE` | `00:3B61` | | | -`PUTSCORE` | `00:3B73` | `00:35A0` | `0x35A0` | in-body -`TOTOTAL` | `00:3B9C` | | | -`UPTOTAL` | `00:3BA1` | | | -`DIGITADD` | `00:3BA6` | | | -`DUMPENDOBJ` | `00:3BB8` | `00:35F6` | `0x35F6` | unverified -`DUMP2BY2SEQU` | `00:3BBD` | `00:35FB` | `0x35FB` | entry -`CHECKHIGH` | `00:3BE9` | | | -`CHECKLINE` | `00:3BEE` | | | -`CHECKCHR` | `00:3BF4` | | | -`NEXTLINE` | `00:3BFF` | | | -`ISBIG` | `00:3C08` | | | -`SHUNTLINE` | `00:3C11` | | | -`PUTDIG` | `00:3C20` | | | -`PRHIGHSCORES` | `00:3C39` | | | -`PRHIGHS` | `00:3C41` | | | -`PRHGH` | `00:3C85` | | | -`DMATRANS` | `01:40E9` | | | -`DMAL` | `01:40EF` | | | -`SYSETUP` | `01:40F4` | | | -`RESETV` | `01:4101` | | | -`TOINTRAM` | `01:4114` | | | -`GAMESETUP` | `01:4122` | | | -`LEVELSETUP` | `01:4141` | | | -`ISMISTER` | `01:4165` | | | -`RESETSP` | `01:4198` | | | -`SETAPPLES` | `01:41AB` | | | -`RESETEX` | `01:41BD` | | | -`SETET` | `01:420E` | | | -`START` | `01:4219` | | | -`MAINLOOP` | `01:4228` | | | -`EXITLEVEL` | `01:426A` | | | -`NOMAPR` | `01:4288` | | | -`NOLEVR` | `01:42A4` | | | -`WAITISH` | `01:42AA` | | | -`WINHOW` | `01:42B2` | | | -`EXTRALIFE` | `01:42BE` | | | -`SETEXTRA` | `01:42C8` | | | -`RESETET` | `01:42D3` | | | -`PAUSEGAME` | `01:42DE` | | | -`NOSTRT` | `01:42F3` | | | -`WAITNOK` | `01:4303` | | | -`SPLITSCREEN` | `01:430A` | | | -`PRAPPLES` | `01:434C` | | | -`PRALOOP` | `01:4352` | | | -`APPLEPIE` | `01:437F` | | | -`APLOOP` | `01:4388` | | | -`WORKAPPLE` | `01:439A` | | | -`NOAPPLE` | `01:43AD` | | | -`NOLFALL` | `01:43B0` | | | -`GOSPLIT` | `01:43B2` | | | -`APPLEWAIT` | `01:43BA` | | | -`APPLEJIG` | `01:43D5` | | | -`APPLEFALL` | `01:43E4` | | | -`LEEV0` | `01:4419` | | | -`LEEV1` | `01:442B` | | | -`FLOUT` | `01:442D` | | | -`HLOUT` | `01:443E` | | | -`REPBACK` | `01:4440` | | | -`STOPAFALL` | `01:444B` | | | -`APPLESPLIT` | `01:4455` | | | -`NOASPL` | `01:4461` | | | -`LEEV2` | `01:4493` | | | -`LEEV3` | `01:44A5` | `00:1ABA` | `0x1ABA` | entry -`BRINGON` | `01:44BE` | | | -`GETDINO` | `01:44D2` | | | -`GETSP` | `01:44D8` | | | -`GETAPPLE` | `01:44E3` | | | -`GETAP` | `01:44E9` | `00:1BE4` | `0x1BE4` | unverified -`FLAGS` | `01:44F4` | `00:1BEF` | `0x1BEF` | entry -`NOT3` | `01:451B` | | | -`COLLISIONS` | `01:451F` | | | -`BALLCP` | `01:4522` | `00:1F9D` | `0x1F9D` | in-body -`BALLCPL` | `01:4535` | `00:1FB0` | `0x1FB0` | in-body -`NBALLCP` | `01:4551` | | | -`MRDOCATCH` | `01:455A` | | | -`GHOSTDIE` | `01:4563` | | | -`NOTLASTG` | `01:4574` | | | -`EXDIE` | `01:4582` | | | -`GAPPLE` | `01:45D6` | | | -`GOAPPLE` | `01:45DF` | | | -`GOBALLBANG` | `01:45FE` | | | -`BALLSCORE` | `01:4606` | | | -`DUFKILL` | `01:462B` | | | -`EATCHERRY` | `01:462D` | | | -`NOCHSEQU` | `01:4651` | | | -`RESCHSEQU` | `01:4656` | | | -`EATWALL` | `01:4668` | | | -`EATFOOD` | `01:4675` | | | -`GETLET` | `01:46A0` | | | -`GOTLET` | `01:46AB` | | | -`ISOUT` | `01:46D1` | | | -`PUTGHST` | `01:46D8` | | | -`SETGHST` | `01:46E1` | | | -`DECODE` | `01:46F5` | | | -`NOGODEL` | `01:4700` | | | -`NODECBON` | `01:470A` | | | -`DECODER` | `01:4734` | | | -`ISSLOW` | `01:4749` | | | -`NOSLOW` | `01:4751` | | | -`INVALIDX` | `01:4776` | | | -`NEWMOVE` | `01:4790` | | | -`NOWRAP` | `01:479D` | | | -`NOSCROLL` | `01:47C4` | | | -`INVALID` | `01:47DD` | | | -`DOBALL` | `01:47E7` | | | -`BADDIES` | `01:480E` | | | -`BADLOOP` | `01:4813` | | | -`WORKBADDIE` | `01:4835` | `00:2153` | `0x2153` | entry -`NOBAD` | `01:4847` | | | -`CIRCLE` | `01:484C` | `00:216A` | `0x216A` | unverified -`MOVEBADF` | `01:4876` | | | -`MOVEBAD` | `01:487B` | | | -`FINDEXITS` | `01:4889` | | | -`NOUP` | `01:48A4` | | | -`NORT` | `01:48B0` | | | -`NODW` | `01:48C7` | | | -`NOLF` | `01:48D3` | | | -`WORKEXITS` | `01:48D6` | | | -`CHANGEDIR` | `01:48EA` | | | -`FINDEX` | `01:48F4` | | | -`GOEXIT` | `01:4902` | | | -`DINODE` | `01:4907` | | | -`DINO` | `01:4909` | | | -`DINOMOVE` | `01:491A` | | | -`DINOEAT` | `01:492A` | | | -`DINOPUSH` | `01:492C` | | | -`EXDANCE` | `01:492E` | | | -`NOEXFL` | `01:4941` | | | -`UPTYPE` | `01:4973` | | | -`EXUP` | `01:4979` | | | -`EXEAT` | `01:4985` | | | -`EXWALK` | `01:4987` | | | -`EXMOVE` | `01:4998` | | | -`EXOUT` | `01:49A1` | | | -`GHOST` | `01:49A3` | | | -`GHOSTMOVE` | `01:49B4` | | | -`GHOSTR` | `01:49C0` | | | -`GHOSTEAT` | `01:49C7` | | | -`CARRYBALL` | `01:49C9` | | | -`THROWBALL` | `01:49EE` | | | -`CDEL0` | `01:49F8` | | | -`ISCHN` | `01:4A06` | | | -`NOCHWL` | `01:4A16` | | | -`BCHECK` | `01:4A24` | | | -`NRNDB` | `01:4A3A` | | | -`NOBHIT` | `01:4A3D` | | | -`NOCHN` | `01:4A41` | | | -`OUTBALL` | `01:4A50` | | | -`GOINBALL` | `01:4A7D` | | | -`INBALL` | `01:4A87` | | | -`INBALL0` | `01:4A91` | | | -`INBALL1` | `01:4A9B` | | | -`POINTS` | `01:4AC3` | | | -`DUMPOBJ` | `01:4ACF` | `00:27C2` | `0x27C2` | in-body -`MPLEX` | `01:4AEE` | | | -`DUMPL` | `01:4B14` | | | -`DUMP2BY1` | `01:4B29` | `00:283A` | `0x283A` | entry -`DUMP1BY1` | `01:4B4F` | `00:2861` | `0x2861` | in-body -`DUMP2BY2` | `01:4B73` | `00:2884` | `0x2884` | entry -`DUMP2BY2S` | `01:4B86` | `00:2897` | `0x2897` | in-body -`MRDOCHEW` | `01:4BCA` | | | -`GOCHEW` | `01:4BE1` | | | -`CHEWS` | `01:4BF2` | | | -`CHEWUP` | `01:4C14` | | | -`CHU0` | `01:4C21` | | | -`CHU1` | `01:4C32` | | | -`CHU2` | `01:4C49` | | | -`CHU3` | `01:4C5A` | | | -`CHEWRT` | `01:4C61` | | | -`CHR0` | `01:4C6E` | | | -`CHR1` | `01:4C7F` | | | -`CHR2` | `01:4C96` | | | -`CHR3` | `01:4CA7` | | | -`CHEWDW` | `01:4CAE` | | | -`CHD0` | `01:4CBB` | | | -`CHD1` | `01:4CCC` | | | -`CHD2` | `01:4CE3` | | | -`CHD3` | `01:4CF4` | | | -`CHEWLT` | `01:4CFB` | | | -`CHL0` | `01:4D0A` | | | -`CHL1` | `01:4D1B` | | | -`CHL2` | `01:4D32` | | | -`CHL3` | `01:4D43` | | | -`CHRDUMPER` | `01:4D4A` | | | -`CDUMP` | `01:4D59` | | | -`PRSCORE` | `01:4D64` | | | -`SCOREADD` | `01:4D81` | | | -`UPSCORE` | `01:4D97` | | | -`NOSCRP` | `01:4DA3` | | | -`CLOCK` | `01:4DA5` | | | -`UPCLOCK` | `01:4DC0` | | | -`STATUS` | `01:4DC5` | | | -`STATSP` | `01:4DDE` | | | -`PUTSSP` | `01:4DF4` | `00:2B44` | `0x2B44` | in-body -`ONSTAT` | `01:4E1A` | | | -`DRAWMAP` | `01:4E22` | | | -`FILLMAP` | `01:4E28` | | | -`FILLBYTE` | `01:4E3F` | | | -`PUTFOOD` | `01:4E76` | | | -`DRAWBLOCK` | `01:4E91` | | | -`DRWBLOCK` | `01:4EA1` | `00:2C17` | `0x2C17` | in-body -`DOTUNNEL` | `01:4EB9` | | | -`DRAWREP` | `01:4ED2` | | | -`ENDTUNNEL` | `01:4EE6` | | | -`PUTCHERRY` | `01:4EEF` | | | -`PUTAPPLE` | `01:4F1F` | | | -`COPYMAP` | `01:4F41` | | | -`COPYM` | `01:4F4A` | | | -`COPYLETTER` | `01:4F53` | | | -`PUTLINE` | `01:4F80` | `00:2CFB` | `0x2CFB` | entry -`KEYS` | `01:4FB6` | | | -`PIXAD` | `01:4FED` | `00:2D63` | `0x2D63` | entry -`GETMAPHI` | `01:5004` | `00:2D7A` | `0x2D7A` | entry -`GETMAPLODE` | `01:501B` | `00:2DBA` | `0x2DBA` | entry -`GETMAPLO` | `01:502D` | `00:2DA8` | `0x2DA8` | entry -`GETBYTEHI` | `01:503F` | `00:2DCC` | `0x2DCC` | unverified -`GETBYTELO` | `01:504D` | | | -`LOWAD` | `01:5059` | `00:2DE6` | `0x2DE6` | in-body -`WAITSC` | `01:5070` | | | -`RESETOBJ` | `01:5078` | | | -`RESETOB` | `01:5087` | | | -`RESETO` | `01:508B` | | | -`RAND` | `01:5097` | | | -`PRINTEXT` | `01:50B1` | `00:2E45` | `0x2E45` | unverified -`TEXTL` | `01:50B9` | `00:2E4D` | `0x2E4D` | unverified -`PRINTSHAPE` | `01:50C1` | | | -`YROWS` | `01:50C5` | | | -`XROWS` | `01:50C7` | `00:2E5B` | `0x2E5B` | entry -`DIVIDE` | `01:50DA` | | | -`DIVE` | `01:50DE` | | | -`CREATESET` | `01:50E6` | | | -`CLEARSET` | `01:50FB` | | | -`SHUNT` | `01:5106` | | | -`DISPBIN` | `01:510F` | | | -`DOBIN` | `01:5114` | `00:2EDA` | `0x2EDA` | unverified -`ISNONE` | `01:511B` | `00:2EE1` | `0x2EE1` | unverified -`CLEARSTAT` | `01:5120` | `00:2EE6` | `0x2EE6` | unverified -`CLR` | `01:512B` | | | -`HEXBYTE` | `01:5134` | | | -`HEXWORD` | `01:5139` | | | -`PRHEX` | `01:5143` | | | -`PRDEC` | `01:5158` | | | -`PRDECDIGITS` | `01:5160` | | | -`PRDEC1` | `01:516B` | | | +The similarity columns are a quick way to see "how close" the mapped routine looks: +* `Retail byte prefix` - number of identical bytes from the mapped entrypoint (capped and limited to the routine span within the rebuilt bank). +* `Retail opcode prefix ops` - number of matching decoded instruction opcodes (immediates ignored), starting at the mapped entrypoint. + +Procedure | Rebuilt bank:addr | Retail bank:addr | Retail file offset | Retail match | Retail byte prefix | Retail opcode prefix ops +---|---|---|---|---|---|--- +`MULTIE` | `00:06A4` | | | | | +`MULTID` | `00:06A9` | | | | | +`MENU` | `00:363C` | | | | | +`SLOGO` | `00:3661` | | | | | +`RESETST` | `00:366F` | | | | | +`LOGOLOOP` | `00:3699` | | | | | +`WORKMENU` | `00:36B5` | | | | | +`EXITMENU` | `00:36D6` | | | | | +`OPTIONS` | `00:36E2` | | | | | +`NEXTUP` | `00:36FD` | | | | | +`NEXTMENU` | `00:3702` | | | | | +`NOGAME` | `00:370A` | | | | | +`NEWSEL` | `00:3715` | | | | | +`NOSEL` | `00:3723` | | | | | +`UPMENU` | `00:3732` | | | | | +`HANDYMAN` | `00:3743` | | | | | +`SOUNDOPT` | `00:375D` | | | | | +`DWMENU` | `00:3765` | | | | | +`LOGOPULSE` | `00:377B` | | | | | +`FADE` | `00:37D0` | | | | | +`LOGOON` | `00:37E0` | | | | | +`LOGON` | `00:37EB` | | | | | +`NOMOV` | `00:37FE` | | | | | +`BARREL` | `00:3803` | | | | | +`BARON` | `00:3810` | | | | | +`RASTARS` | `00:3823` | | | | | +`RASTAR` | `00:3832` | | | | | +`STARFALL` | `00:3845` | `00:31D5` | `0x31D5` | in-body | 3 | 27 +`ANIHEAD` | `00:3872` | `00:3202` | `0x3202` | in-body | 3 | 27 +`MENUOBJ` | `00:3894` | | | | | +`WORKSTAR` | `00:38AC` | | | | | +`STAROFF` | `00:38B7` | | | | | +`NOBOW` | `00:38E4` | | | | | +`DUMP3BY3` | `00:38F8` | | | | | +`SHOWRESULTS` | `00:395F` | | | | | +`SETBIG` | `00:3989` | `00:32DA` | `0x32DA` | in-body | 20 | 15 +`RESLOOP` | `00:39B5` | | | | | +`APLM` | `00:39CE` | | | | | +`WORKWELL` | `00:3A1A` | | | | | +`EMOVE` | `00:3A30` | | | | | +`UPWELLY` | `00:3A3A` | | | | | +`UPWELL` | `00:3A3F` | | | | | +`ALLWAIT` | `00:3A47` | | | | | +`ALLMOVE` | `00:3A51` | | | | | +`DODIMOVE` | `00:3A58` | | | | | +`DUMPBIG` | `00:3A7E` | `00:33CD` | `0x33CD` | entry | 21 | 12 +`DUMPBG` | `00:3A93` | | | | | +`SHOWAVERAGES` | `00:3AA2` | `00:340A` | `0x340A` | opcodes | 1 | 13 +`PUTAVER` | `00:3ABF` | | | | | +`AVELOOP` | `00:3B10` | | | | | +`RESETBOARD` | `00:3B29` | | | | | +`RESETB` | `00:3B2E` | | | | | +`BOARDLINED` | `00:3B41` | | | | | +`BOARDLINE` | `00:3B61` | `00:358E` | `0x358E` | opcodes | 2 | 12 +`PUTSCORE` | `00:3B73` | `00:35A0` | `0x35A0` | in-body | 18 | 28 +`TOTOTAL` | `00:3B9C` | | | | | +`UPTOTAL` | `00:3BA1` | | | | | +`DIGITADD` | `00:3BA6` | | | | | +`DUMPENDOBJ` | `00:3BB8` | `00:35F6` | `0x35F6` | unverified | 5 | 4 +`DUMP2BY2SEQU` | `00:3BBD` | `00:35FB` | `0x35FB` | in-body | 44 | 37 +`CHECKHIGH` | `00:3BE9` | | | | | +`CHECKLINE` | `00:3BEE` | | | | | +`CHECKCHR` | `00:3BF4` | | | | | +`NEXTLINE` | `00:3BFF` | | | | | +`ISBIG` | `00:3C08` | | | | | +`SHUNTLINE` | `00:3C11` | | | | | +`PUTDIG` | `00:3C20` | | | | | +`PRHIGHSCORES` | `00:3C39` | | | | | +`PRHIGHS` | `00:3C41` | `00:3AA7` | `0x3AA7` | opcodes | 2 | 44 +`PRHGH` | `00:3C85` | | | | | +`DMATRANS` | `01:40E9` | | | | | +`DMAL` | `01:40EF` | | | | | +`SYSETUP` | `01:40F4` | | | | | +`RESETV` | `01:4101` | | | | | +`TOINTRAM` | `01:4114` | | | | | +`GAMESETUP` | `01:4122` | | | | | +`LEVELSETUP` | `01:4141` | | | | | +`ISMISTER` | `01:4165` | | | | | +`RESETSP` | `01:4198` | | | | | +`SETAPPLES` | `01:41AB` | | | | | +`RESETEX` | `01:41BD` | | | | | +`SETET` | `01:420E` | | | | | +`START` | `01:4219` | | | | | +`MAINLOOP` | `01:4228` | `00:175D` | `0x175D` | callgraph | 1 | 13 +`EXITLEVEL` | `01:426A` | | | | | +`NOMAPR` | `01:4288` | | | | | +`NOLEVR` | `01:42A4` | | | | | +`WAITISH` | `01:42AA` | | | | | +`WINHOW` | `01:42B2` | | | | | +`EXTRALIFE` | `01:42BE` | | | | | +`SETEXTRA` | `01:42C8` | | | | | +`RESETET` | `01:42D3` | | | | | +`PAUSEGAME` | `01:42DE` | | | | | +`NOSTRT` | `01:42F3` | | | | | +`WAITNOK` | `01:4303` | | | | | +`SPLITSCREEN` | `01:430A` | | | | | +`PRAPPLES` | `01:434C` | | | | | +`PRALOOP` | `01:4352` | | | | | +`APPLEPIE` | `01:437F` | | | | | +`APLOOP` | `01:4388` | `00:1942` | `0x1942` | opcodes | 2 | 15 +`WORKAPPLE` | `01:439A` | `00:1954` | `0x1954` | opcodes | 11 | 17 +`NOAPPLE` | `01:43AD` | | | | | +`NOLFALL` | `01:43B0` | | | | | +`GOSPLIT` | `01:43B2` | | | | | +`APPLEWAIT` | `01:43BA` | | | | | +`APPLEJIG` | `01:43D5` | | | | | +`APPLEFALL` | `01:43E4` | | | | | +`LEEV0` | `01:4419` | | | | | +`LEEV1` | `01:442B` | | | | | +`FLOUT` | `01:442D` | | | | | +`HLOUT` | `01:443E` | | | | | +`REPBACK` | `01:4440` | | | | | +`STOPAFALL` | `01:444B` | | | | | +`APPLESPLIT` | `01:4455` | | | | | +`NOASPL` | `01:4461` | | | | | +`LEEV2` | `01:4493` | | | | | +`LEEV3` | `01:44A5` | `00:1ABA` | `0x1ABA` | entry | 25 | 23 +`BRINGON` | `01:44BE` | | | | | +`GETDINO` | `01:44D2` | | | | | +`GETSP` | `01:44D8` | | | | | +`GETAPPLE` | `01:44E3` | | | | | +`GETAP` | `01:44E9` | `00:1BE4` | `0x1BE4` | unverified | 11 | 10 +`FLAGS` | `01:44F4` | `00:1BEF` | `0x1BEF` | in-body | 39 | 20 +`NOT3` | `01:451B` | | | | | +`COLLISIONS` | `01:451F` | | | | | +`BALLCP` | `01:4522` | `00:1F9D` | `0x1F9D` | in-body | 18 | 13 +`BALLCPL` | `01:4535` | `00:1FB0` | `0x1FB0` | in-body | 20 | 22 +`NBALLCP` | `01:4551` | | | | | +`MRDOCATCH` | `01:455A` | | | | | +`GHOSTDIE` | `01:4563` | | | | | +`NOTLASTG` | `01:4574` | | | | | +`EXDIE` | `01:4582` | | | | | +`GAPPLE` | `01:45D6` | | | | | +`GOAPPLE` | `01:45DF` | | | | | +`GOBALLBANG` | `01:45FE` | | | | | +`BALLSCORE` | `01:4606` | | | | | +`DUFKILL` | `01:462B` | | | | | +`EATCHERRY` | `01:462D` | | | | | +`NOCHSEQU` | `01:4651` | | | | | +`RESCHSEQU` | `01:4656` | | | | | +`EATWALL` | `01:4668` | | | | | +`EATFOOD` | `01:4675` | | | | | +`GETLET` | `01:46A0` | | | | | +`GOTLET` | `01:46AB` | | | | | +`ISOUT` | `01:46D1` | | | | | +`PUTGHST` | `01:46D8` | | | | | +`SETGHST` | `01:46E1` | | | | | +`DECODE` | `01:46F5` | | | | | +`NOGODEL` | `01:4700` | | | | | +`NODECBON` | `01:470A` | | | | | +`DECODER` | `01:4734` | | | | | +`ISSLOW` | `01:4749` | | | | | +`NOSLOW` | `01:4751` | | | | | +`INVALIDX` | `01:4776` | | | | | +`NEWMOVE` | `01:4790` | | | | | +`NOWRAP` | `01:479D` | | | | | +`NOSCROLL` | `01:47C4` | | | | | +`INVALID` | `01:47DD` | | | | | +`DOBALL` | `01:47E7` | | | | | +`BADDIES` | `01:480E` | | | | | +`BADLOOP` | `01:4813` | `00:2131` | `0x2131` | opcodes | 4 | 26 +`WORKBADDIE` | `01:4835` | `00:2153` | `0x2153` | entry | 18 | 17 +`NOBAD` | `01:4847` | | | | | +`CIRCLE` | `01:484C` | `00:216A` | `0x216A` | opcodes | 8 | 34 +`MOVEBADF` | `01:4876` | | | | | +`MOVEBAD` | `01:487B` | | | | | +`FINDEXITS` | `01:4889` | | | | | +`NOUP` | `01:48A4` | | | | | +`NORT` | `01:48B0` | `00:21DD` | `0x21DD` | opcodes | 9 | 15 +`NODW` | `01:48C7` | | | | | +`NOLF` | `01:48D3` | | | | | +`WORKEXITS` | `01:48D6` | | | | | +`CHANGEDIR` | `01:48EA` | | | | | +`FINDEX` | `01:48F4` | | | | | +`GOEXIT` | `01:4902` | | | | | +`DINODE` | `01:4907` | | | | | +`DINO` | `01:4909` | | | | | +`DINOMOVE` | `01:491A` | | | | | +`DINOEAT` | `01:492A` | | | | | +`DINOPUSH` | `01:492C` | | | | | +`EXDANCE` | `01:492E` | | | | | +`NOEXFL` | `01:4941` | | | | | +`UPTYPE` | `01:4973` | | | | | +`EXUP` | `01:4979` | | | | | +`EXEAT` | `01:4985` | | | | | +`EXWALK` | `01:4987` | | | | | +`EXMOVE` | `01:4998` | | | | | +`EXOUT` | `01:49A1` | | | | | +`GHOST` | `01:49A3` | | | | | +`GHOSTMOVE` | `01:49B4` | | | | | +`GHOSTR` | `01:49C0` | | | | | +`GHOSTEAT` | `01:49C7` | | | | | +`CARRYBALL` | `01:49C9` | | | | | +`THROWBALL` | `01:49EE` | | | | | +`CDEL0` | `01:49F8` | | | | | +`ISCHN` | `01:4A06` | | | | | +`NOCHWL` | `01:4A16` | | | | | +`BCHECK` | `01:4A24` | | | | | +`NRNDB` | `01:4A3A` | | | | | +`NOBHIT` | `01:4A3D` | | | | | +`NOCHN` | `01:4A41` | | | | | +`OUTBALL` | `01:4A50` | | | | | +`GOINBALL` | `01:4A7D` | | | | | +`INBALL` | `01:4A87` | | | | | +`INBALL0` | `01:4A91` | | | | | +`INBALL1` | `01:4A9B` | | | | | +`POINTS` | `01:4AC3` | | | | | +`DUMPOBJ` | `01:4ACF` | `00:27C2` | `0x27C2` | in-body | 18 | 9 +`MPLEX` | `01:4AEE` | | | | | +`DUMPL` | `01:4B14` | | | | | +`DUMP2BY1` | `01:4B29` | `00:283A` | `0x283A` | entry | 37 | 30 +`DUMP1BY1` | `01:4B4F` | `00:2861` | `0x2861` | in-body | 28 | 21 +`DUMP2BY2` | `01:4B73` | `00:2884` | `0x2884` | entry | 19 | 14 +`DUMP2BY2S` | `01:4B86` | `00:2897` | `0x2897` | in-body | 13 | 59 +`MRDOCHEW` | `01:4BCA` | | | | | +`GOCHEW` | `01:4BE1` | | | | | +`CHEWS` | `01:4BF2` | | | | | +`CHEWUP` | `01:4C14` | | | | | +`CHU0` | `01:4C21` | | | | | +`CHU1` | `01:4C32` | | | | | +`CHU2` | `01:4C49` | | | | | +`CHU3` | `01:4C5A` | | | | | +`CHEWRT` | `01:4C61` | | | | | +`CHR0` | `01:4C6E` | `00:2916` | `0x2916` | candidate | 13 | 14 +`CHR1` | `01:4C7F` | | | | | +`CHR2` | `01:4C96` | | | | | +`CHR3` | `01:4CA7` | | | | | +`CHEWDW` | `01:4CAE` | | | | | +`CHD0` | `01:4CBB` | | | | | +`CHD1` | `01:4CCC` | | | | | +`CHD2` | `01:4CE3` | | | | | +`CHD3` | `01:4CF4` | | | | | +`CHEWLT` | `01:4CFB` | | | | | +`CHL0` | `01:4D0A` | | | | | +`CHL1` | `01:4D1B` | | | | | +`CHL2` | `01:4D32` | | | | | +`CHL3` | `01:4D43` | | | | | +`CHRDUMPER` | `01:4D4A` | | | | | +`CDUMP` | `01:4D59` | | | | | +`PRSCORE` | `01:4D64` | | | | | +`SCOREADD` | `01:4D81` | `00:2AAA` | `0x2AAA` | opcodes | 3 | 15 +`UPSCORE` | `01:4D97` | | | | | +`NOSCRP` | `01:4DA3` | | | | | +`CLOCK` | `01:4DA5` | `00:2ACE` | `0x2ACE` | opcodes | 1 | 13 +`UPCLOCK` | `01:4DC0` | | | | | +`STATUS` | `01:4DC5` | | | | | +`STATSP` | `01:4DDE` | | | | | +`PUTSSP` | `01:4DF4` | `00:2B44` | `0x2B44` | in-body | 23 | 30 +`ONSTAT` | `01:4E1A` | | | | | +`DRAWMAP` | `01:4E22` | | | | | +`FILLMAP` | `01:4E28` | | | | | +`FILLBYTE` | `01:4E3F` | | | | | +`PUTFOOD` | `01:4E76` | | | | | +`DRAWBLOCK` | `01:4E91` | `00:2C07` | `0x2C07` | opcodes | 5 | 12 +`DRWBLOCK` | `01:4EA1` | `00:2C17` | `0x2C17` | in-body | 1 | 22 +`DOTUNNEL` | `01:4EB9` | `00:2C2F` | `0x2C2F` | opcodes | 10 | 19 +`DRAWREP` | `01:4ED2` | `00:2C48` | `0x2C48` | opcodes | 11 | 15 +`ENDTUNNEL` | `01:4EE6` | | | | | +`PUTCHERRY` | `01:4EEF` | `00:2C65` | `0x2C65` | opcodes | 12 | 26 +`PUTAPPLE` | `01:4F1F` | | | | | +`COPYMAP` | `01:4F41` | | | | | +`COPYM` | `01:4F4A` | | | | | +`COPYLETTER` | `01:4F53` | `00:2CCE` | `0x2CCE` | opcodes | 3 | 26 +`PUTLINE` | `01:4F80` | `00:2CFB` | `0x2CFB` | in-body | 54 | 41 +`KEYS` | `01:4FB6` | | | | | +`PIXAD` | `01:4FED` | `00:2D63` | `0x2D63` | entry | 23 | 13 +`GETMAPHI` | `01:5004` | `00:2D7A` | `0x2D7A` | entry | 23 | 13 +`GETMAPLODE` | `01:501B` | `00:2DBA` | `0x2DBA` | entry | 18 | 13 +`GETMAPLO` | `01:502D` | `00:2DA8` | `0x2DA8` | entry | 18 | 13 +`GETBYTEHI` | `01:503F` | `00:2DCC` | `0x2DCC` | unverified | 14 | 10 +`GETBYTELO` | `01:504D` | | | | | +`LOWAD` | `01:5059` | `00:2DE6` | `0x2DE6` | in-body | 18 | 13 +`WAITSC` | `01:5070` | | | | | +`RESETOBJ` | `01:5078` | | | | | +`RESETOB` | `01:5087` | | | | | +`RESETO` | `01:508B` | | | | | +`RAND` | `01:5097` | | | | | +`PRINTEXT` | `01:50B1` | `00:2E45` | `0x2E45` | unverified | 8 | 8 +`TEXTL` | `01:50B9` | `00:2E4D` | `0x2E4D` | unverified | 8 | 6 +`PRINTSHAPE` | `01:50C1` | | | | | +`YROWS` | `01:50C5` | | | | | +`XROWS` | `01:50C7` | `00:2E5B` | `0x2E5B` | entry | 19 | 16 +`DIVIDE` | `01:50DA` | | | | | +`DIVE` | `01:50DE` | | | | | +`CREATESET` | `01:50E6` | `00:2EAC` | `0x2EAC` | opcodes | 15 | 18 +`CLEARSET` | `01:50FB` | | | | | +`SHUNT` | `01:5106` | | | | | +`DISPBIN` | `01:510F` | | | | | +`DOBIN` | `01:5114` | `00:2EDA` | `0x2EDA` | unverified | 7 | 4 +`ISNONE` | `01:511B` | `00:2EE1` | `0x2EE1` | unverified | 5 | 4 +`CLEARSTAT` | `01:5120` | `00:2EE6` | `0x2EE6` | unverified | 11 | 4 +`CLR` | `01:512B` | | | | | +`HEXBYTE` | `01:5134` | | | | | +`HEXWORD` | `01:5139` | | | | | +`PRHEX` | `01:5143` | `00:2F09` | `0x2F09` | opcodes | 4 | 15 +`PRDEC` | `01:5158` | | | | | +`PRDECDIGITS` | `01:5160` | | | | | +`PRDEC1` | `01:516B` | | | | | --- ### Retail offsets for known verbatim code blocks diff --git a/pages/consoles/n64/Bung-Doctor-v64.md b/pages/consoles/n64/Bung-Doctor-v64.md deleted file mode 100644 index 957d8afe..00000000 --- a/pages/consoles/n64/Bung-Doctor-v64.md +++ /dev/null @@ -1,44 +0,0 @@ ---- -layout: post -tags: -- n64 -- devkit -- hardware -title: Bung Doctor v64 (N64) -category: n64 -videocarousel: - - title: MVG Doctor V64 - image: https://img.youtube.com/vi/HrQYdr0FY70/0.jpg - youtube: 'HrQYdr0FY70' - - title: Hard4Games Doctor V64 - image: https://img.youtube.com/vi/8Za3DNGeP5Y/0.jpg - youtube: '8Za3DNGeP5Y' -image: https://i.ytimg.com/vi/8Za3DNGeP5Y/hqdefault.jpg -permalink: /Bung-Doctor-v64 -redirect_from: - - /Bung-Doctor-v64/ -breadcrumbs: - - name: Home - url: / - - name: Nintendo 64 - url: /n64 - - name: Bung Doctor v64 - url: # -recommend: n64 -editlink: /consoles/n64/Bung-Doctor-v64.md -updatedAt: '2020-06-27' ---- - -# Bung Dr V64 -The Doctor V64 was a 3rd Party Development kit and Piracy device that was much cheaper than the official nintendo development kits [^1]. It is the original Creator of .v64 files (it has functionality to dump carts) and even came with a CD full of N64 roms. - -## Development Studios known to have used it -* Acclaim/Iguana (Turok series) - -# Emulation Cartridge -The Bung Dr V64 required a cartridge to be placed in the cartridge slot in order to interrupt the signal coming from the official game cartridge and instead send the data from the V64. The original cartridge that you put in the top was just used for the CIC anti-piracy check. -Found some more images & information on the Blockbuster Games concept; and it's companion store (in the next post), Blockbuster Music, in 'Stores of the Year 9' (1995)
— Evan Collins | BLM 🏳️🌈 (@EvanCollins90) July 4, 2020
It was located in Jacksonville, FL; designed by Fitch Inc. in 1994. pic.twitter.com/TtUyUAw9r7
- ---- -# References -[^1]: [Bung Doctor V64! A 3rd-Party N64 Development System - H4G - YouTube](https://www.youtube.com/watch?v=8Za3DNGeP5Y) diff --git a/pages/consoles/n64/OfficialN64Devkit.md b/pages/consoles/n64/N64DevelopmentKitHardware.md similarity index 85% rename from pages/consoles/n64/OfficialN64Devkit.md rename to pages/consoles/n64/N64DevelopmentKitHardware.md index ba711c16..226ebb16 100644 --- a/pages/consoles/n64/OfficialN64Devkit.md +++ b/pages/consoles/n64/N64DevelopmentKitHardware.md @@ -4,7 +4,7 @@ tags: - n64 - devkit - hardware -title: Official Nintendo 64 (Ultra 64) Development Kit Hardware +title: Nintendo 64 (Ultra 64) Development Kit Hardware (Official & Unofficial) category: n64 videocarousel: - title: Ultra64 Development Hardware & Prototype Ultra64 Controller @@ -24,6 +24,7 @@ twitterimage: https://www.retroreversing.com/public/N64/N64 Development Kit Hard permalink: /official-n64-devkit redirect_from: - /official-n64-devkit/ + - /Bung-Doctor-v64/ breadcrumbs: - name: Home url: / @@ -34,7 +35,7 @@ breadcrumbs: - name: Official Nintendo 64 (Ultra 64) Development Kit Hardware url: # recommend: n64 -editlink: /consoles/n64/OfficialN64Devkit.md +editlink: /consoles/n64/N64DevelopmentKitHardware.md references: - archive.org updatedAt: '2020-01-11' @@ -299,10 +300,41 @@ SN Systems also released an unofficial development kit created specifically for {% include_cached link-to-other-post.html post="/maestro64" description="For information about SN Systems's Maestro64 development cartridge check out this post." %} ## Bung DoctorV64 -There was also a device created by Bung which advertised itself as a development kit but many consumers used it for backing up game cartridges. +The Doctor V64 was a 3rd Party Development kit and Piracy device that was much cheaper than the official nintendo development kits [^19]. It is the original Creator of .v64 files (it has functionality to dump carts) and even came with a CD full of N64 roms. -{% include_cached link-to-other-post.html post="/Bung-Doctor-v64" description="For information about Bung's v64 development hardware check out this post." %} + +### Development Studios known to have used The V64 +* Acclaim/Iguana (Turok series) + +### Technical Specifications +* **Manufacturer:** Bung Enterprises Limited +* **Release Date:** 1997 +* **Launch Price:** $450 USD [^20] +* **Onboard CPU:** MOS Technology 6502 (8-bit) +* **System Memory:** 128 megabits (16 MB) DRAM initially; later revisions included 256 megabits (32 MB) to accommodate larger games. +* **Storage Media:** IDE CD-ROM drive (initial runs featured 8x speed; later models were upgraded to 16x and 32x). +* **Interfacing & I/O:** + * Connects to the N64 via the bottom EXT expansion port (which shares the same connector pinout as the top cartridge port) [^20]. + * Pass-through cartridge adapter to mount a retail N64 cartridge, acting solely as a donor to satisfy the console's PIF (Peripheral Interface) and CIC security handshake. + * Standard Parallel Port located on the rear for PC data transfer. + +#### Pass-through Cartridge Adapter +The Bung Dr V64 required a cartridge to be placed in the cartridge slot in order to interrupt the signal coming from the official game cartridge and instead send the data from the V64. The original cartridge that you put in the top was just used for the CIC anti-piracy check. +Doctor V64 emulation cartridge adapter; 50-pin connector and PCB with solder across pin 9 and 10 #N64dev pic.twitter.com/tqrdJB9wZU
— Shane Battye 🎮 (@shanebattye) January 30, 2018
+ +### Core Functionality +* **Cartridge Dumping:** Capable of copying native N64 cartridge data directly into its internal DRAM. This data can be transmitted to a PC over the parallel connection. The ubiquitous `.v64` ROM file extension originated directly from this hardware. +* **ROM Execution:** Loads binary game files from a CD into DRAM, allowing the console to boot them as if they were genuine cartridges. +* **Media Playback:** Operates as a standalone external Video CD (VCD) player. +* **System BIOS:** Utilized a custom BIOS that could be updated or replaced by pushing a new firmware file over the PC transfer cable. + +### Connecting a Doctor V64 to a Windows PC for N64 Development +[BehindTheCode](https://www.youtube.com/watch?v=BgYMihpfnjo) has a detailed video demonstrating how to configure a Doctor V64 backup device with Windows 98 and Windows 7 PCs to create a complete Nintendo 64 development test station. The video explores the device's internal PCBAs and demonstrates using software like TPC2 and RTOOL64 for loading ROMs into the DrV64's internal SRAM and dumping cartridge data directly to a PC. Additionally, it highlights a rare Acclaim "ArtSend" development cartridge setup that was utilized during the creation of Turok 3. + + + +--- ## Rareware custom cartridges ### RAREWARE N64 security dongle @@ -346,4 +378,6 @@ The full n64 development kit was used by Sound designer Grant Kirkhope at Rare t [^15]: [Duke Nukem Prototype](http://www.nintendoplayer.com/prototype/duke-nukem-64/) [^16]: [NEXT Generation Issue #14 February 1996](https://archive.org/details/nextgen-issue-014/page/n7) [^17]: [Gamasutra - Postmortem: Angel Studios Resident Evil 2 N64 Version](https://www.gamasutra.com/view/feature/131556/postmortem_angel_studios_.php?page=3) -[^18]: [(1998) BTC #3 RARE Nintendo N64 "IS-VIEWER 64" Development Cartridge - NOW WORKING!! - YouTube](https://www.youtube.com/watch?v=FbyHw3BDJJs) +[^18]: [BTC #3 RARE Nintendo N64 "IS-VIEWER 64" Development Cartridge - NOW WORKING!! - YouTube](https://www.youtube.com/watch?v=FbyHw3BDJJs) +[^19]: [Bung Doctor V64! A 3rd-Party N64 Development System - H4G - YouTube](https://www.youtube.com/watch?v=8Za3DNGeP5Y) +[^20]: [The Doctor V64 - Nintendo 64 DevKit or Piracy Device - MVG - YouTube](https://www.youtube.com/watch?v=HrQYdr0FY70) \ No newline at end of file diff --git a/public/css/post.css b/public/css/post.css index 76f8c64e..1712ccdb 100644 --- a/public/css/post.css +++ b/public/css/post.css @@ -461,6 +461,37 @@ h5 + .emoji { /* #region Table of contents */ +.post-directory-nav { + margin-top: 0.5rem; +} + +.post-directory-list { + padding-left: 0; + margin: 0; +} + +.post-directory-list li { + list-style: none; +} + +.post-directory-list a { + display: block; + padding: 6px 8px; + border-radius: 6px; +} + +.post-directory-list a:focus-visible { + outline: 2px solid #0085b6; + outline-offset: 2px; +} + +.reversefootnote { + display: inline-block; + padding: 6px 8px; + margin-left: 4px; + border-radius: 6px; +} + .jumper { font-weight: 500; color: #0085b6; @@ -551,4 +582,4 @@ h5 + .emoji { } /* #endregion Link to other post */ -/* #endregion Includes */ \ No newline at end of file +/* #endregion Includes */ diff --git a/public/css/theme.overrides.css b/public/css/theme.overrides.css index 75e0d7a4..c15b14f9 100644 --- a/public/css/theme.overrides.css +++ b/public/css/theme.overrides.css @@ -362,6 +362,40 @@ rr-sandpack { text-align: center; } +.post .mermaid.rr-mermaid-zoom { + position: relative; +} + +.post .mermaid.rr-mermaid-zoom .rr-mermaid-canvas { + overflow: auto; + -webkit-overflow-scrolling: touch; +} + +.post .mermaid.rr-mermaid-zoom .rr-mermaid-controls { + position: absolute; + top: 0.5rem; + right: 0.5rem; + z-index: 2; + display: flex; + gap: 0.25rem; +} + +.post .mermaid.rr-mermaid-zoom .rr-mermaid-controls button { + border: 1px solid rgba(0, 0, 0, 0.25); + background: rgba(255, 255, 255, 0.9); + color: #111; + border-radius: 6px; + padding: 0.2rem 0.4rem; + font-size: 0.85rem; + line-height: 1; +} + +.dark .post .mermaid.rr-mermaid-zoom .rr-mermaid-controls button { + border-color: rgba(255, 255, 255, 0.25); + background: rgba(17, 17, 17, 0.9); + color: #fff; +} + .post .mermaid svg { max-width: 100%; height: auto; diff --git a/public/js/generateTOC.js b/public/js/generateTOC.js index 377eaf21..5dd65fad 100644 --- a/public/js/generateTOC.js +++ b/public/js/generateTOC.js @@ -15,12 +15,14 @@ $(document).ready(function(){ if (!id) return; var tagName = $this.prop("tagName").toUpperCase(); + var $list = $(".post-directory .post-directory-list"); + if (!$list.length) return; + if (tagName === topLevel) { - $(".post-directory dl").append("Doctor V64 emulation cartridge adapter; 50-pin connector and PCB with solder across pin 9 and 10 #N64dev pic.twitter.com/tqrdJB9wZU
— Shane Battye 🎮 (@shanebattye) January 30, 2018