Oziphantom
Oziphantom
  • 134
  • 39 165
128 Fast Scroll Example
This light grey bar is a full screen shift, then the light blue is drawing new row/column data
Переглядів: 188

Відео

Functions - 64Tass Deep Wizardry
Переглядів 1753 роки тому
Pressing on and converting the X and Y to a screen address with the help of a custom 64tass function
Adventures in Millfork 2 - C64 complete onto Mega65
Переглядів 1213 роки тому
I got the C64 version feature complete, with a couple of stalls. I take a look at the optimiser's handiwork and some other issues I have with the language. Then thanks to Shallan and MonstersGoBoom I was able to the Mega65 booting.
Adventures in Millfork 1 - Shallan Compo
Переглядів 1003 роки тому
This is a VLog style video where I document my adventure into Millfork as part of Shallan's Monthly compo.
Lists in Lists REDUX - 64Tass Deep Wizardry
Переглядів 803 роки тому
So after my last video, Soci got in contact as well there is a better way, a much better way.
Elements of a SNES Engine 8 - VRAM DMA SYSTEM
Переглядів 4613 роки тому
In the final common component of a SNES engine, I look at how ideas and techniques for buffering your VRAM updates to then be DMA'd to VRAM in VBlank.
Lists in Lists - 64Tass Deep Wizardry
Переглядів 883 роки тому
Having covered iteration, slicing, now we unlock the true power with lists in lists.
Elements of a SNES Engine 7 - VRAM Allocation
Переглядів 5973 роки тому
This episode I talk the alignment restrictions for various parts of VRAM, backgrounds, tiles and sprites. And give some common layouts for Mode 1. I also cover sprite tile allocation and layout.
Slicing - 64Tass Deep Wizardry 2
Переглядів 1133 роки тому
Following on from ep 1 I now demonstrate the power of slicing.
Iteration - 64Tass Deep Wizardry
Переглядів 4613 роки тому
Baffled by the insane power of 64TASS? This quick and simple concept by concept video will help you unlock its dark powers.
Elements of a SNES Engine 6 - Taming the 65816
Переглядів 1,2 тис.3 роки тому
The 65816 can be a bit of a monster with traps at every turn. Are the registers the right size,really? Are you in the right data bank? Did you make the right JS call? I talk about Best practices and offer techniques to mitigate these issues. Ozi's Hacked Mesen-S github.com/oziphantom/Mesen-S
Elements of a SNES engine 5 - Sprites
Переглядів 9463 роки тому
In an Earlier video I didn't cover "clearing" OAM, so this video its time. I look how why you need to set sprites off screen, how to set up DMAs. I explain Meta sprites and show two methods of dealing with sprite frames. Then for the experienced I show the Reverse Stack Allocator for Sprites for those whom like to code with SWAG and speed.
Intermediate 6502 - 4 Dialogs
Переглядів 2693 роки тому
With the simpler warm tasks out of the way, onto the more complicated Dialog and Widget system. The main lessons this time are : Slot based allocation, and Upper 3 bit branch trees.
Elements of a SNES engine 4 - 64tass LOROM project
Переглядів 4783 роки тому
The second part of original 3rd video. Here I introduce 64tass, and provide a walk through on how to set up a LOROM project in it. 64tass binaries are here sourceforge.net/projects/tass64/files/binaries/ Documentation here tass64.sourceforge.net/ Source files from the video are here github.com/oziphantom/ElementsSnesEngine/tree/main/Vid4
Elements of a SNES Engine 3 - Mapping
Переглядів 4793 роки тому
In this video I talk about how the SNES sees the ROM, LoROM and HiROM, then how the emulator ROM file is mapped. Then I look at the SNES Internal ROM header format.
Intermediate 6502 - 3
Переглядів 1183 роки тому
Intermediate 6502 - 3
Elements of a SNES Engine 2 - Booting the SNES
Переглядів 8103 роки тому
Elements of a SNES Engine 2 - Booting the SNES
Intermediate 6502 - 2
Переглядів 2433 роки тому
Intermediate 6502 - 2
Elements of a SNES Engine 1 - Main Loops
Переглядів 2 тис.3 роки тому
Elements of a SNES Engine 1 - Main Loops
Intermediate 6502 - 1
Переглядів 1,3 тис.3 роки тому
Intermediate 6502 - 1
Fire Emblem Gilmore Girls - 2 Prep School Princess
Переглядів 453 роки тому
Fire Emblem Gilmore Girls - 2 Prep School Princess
Fire Emblem Gilmore Girls - 1 - Coffee Coffee Coffee
Переглядів 943 роки тому
Fire Emblem Gilmore Girls - 1 - Coffee Coffee Coffee
C128 Banking - It's not that hard really.
Переглядів 5283 роки тому
C128 Banking - It's not that hard really.
Grid Pix Advent : Day 24
Переглядів 643 роки тому
Grid Pix Advent : Day 24
Grid Pix Advent : Day 23
Переглядів 93 роки тому
Grid Pix Advent : Day 23
Grid Pix Advent : Day 22
Переглядів 103 роки тому
Grid Pix Advent : Day 22
Grid Pix Advent : Day 21
Переглядів 93 роки тому
Grid Pix Advent : Day 21
Grid Pix Advent : Day 20
Переглядів 103 роки тому
Grid Pix Advent : Day 20
Grid Pix Advent : Day 19
Переглядів 113 роки тому
Grid Pix Advent : Day 19
Grid Pix Advent : Day 18
Переглядів 93 роки тому
Grid Pix Advent : Day 18

КОМЕНТАРІ

  • @MartinGoodwell
    @MartinGoodwell 9 місяців тому

    Is this on the VIC-II or on the VDC?

    • @oziphantom9465
      @oziphantom9465 9 місяців тому

      This is VIC-II, the VDC can shift a screen in "lines" of VBlank, while it can shift a bitmap in ~2.5 frames. If you want to see how fast VDC bitmap scrolling is, have a look at Bucket Wars 1.3 128 on CSDB. Then compare it to the +4 and C64 versions.

    • @MartinGoodwell
      @MartinGoodwell 9 місяців тому

      @@oziphantom9465will do, thanks! Great stuff on your channel. And I also highly value your contributions on the c128forum. Thanks!

  • @MartinGoodwell
    @MartinGoodwell 9 місяців тому

    I really like how you clearly differentiate bank from block. But I never came across the term „block“ before. Did you come up with this or did I just miss it?

    • @oziphantom9465
      @oziphantom9465 9 місяців тому

      Blocks of RAM are used, typically you use it with a separate not overlapping RAM. so for example on a more modern computer you would have a Block of VRAM and Block of Main RAM so they don't Bank over each other. But the Compute's Mapping the Commodore 128 book ( top read if you don't know it ) also refers to the two 64K "Banks" as "blocks" as they are "generally" not overlapping RAM that is not continuous.

  • @jrpgaddict7726
    @jrpgaddict7726 Рік тому

    This LP is not finished, thanks for trying though!

  • @michaellinke6448
    @michaellinke6448 Рік тому

    I don't understand what's happening at... LDA #$FF00 STA $4201 Shouldn't this put FF in $4201, and 00 in $4202? That's IO Port Write and "Multiplicand Registers" on the wiki, with the Interrupt enable at $4200. Your commentary says this is supposed to set controller port off, and vblank enable off. Should this be like this instead... LDA #$FF00 STA $4200 ; i think that puts the 00 in 4200, and then the high byte goes into the next address? ?

    • @michaellinke6448
      @michaellinke6448 Рік тому

      I also can't figure out what DMAZero is.

    • @oziphantom9465
      @oziphantom9465 Рік тому

      LDA #$FF00 STA $4201 puts 00 at 4201 and FF at 4202 which as you have noted is incorrect and it should be LDA #$FF00 STA $4200 which puts 00 at 4200 and FF at 4201

    • @oziphantom9465
      @oziphantom9465 Рік тому

      @@michaellinke6448 DMAZero is a label in memory that points to a 0 byte/word that is in the ROM. I.e it a memory location the DMA engine can read from that will cause it to read a 0. You can't give the DMA engine a Value it needs a source address that holds the value you want.

    • @michaellinke6448
      @michaellinke6448 Рік тому

      ​@@oziphantom9465 so it's labelling an address where you can find $00 00? In my case, LDA #loword(ZeroAddr) STA $4302 ... ZeroAddr: BRK BRK ZeroAddr happens to live at $8129 right now. I want to send the address, of $8129 to $4302, if I understand you? Eg LDA #$8129 STA $4302 in my debugger?

    • @oziphantom9465
      @oziphantom9465 Рік тому

      @@michaellinke6448 DMAZero .word $0000 I didn't put anything up for Vid2 as you kind of need to get to vid4 for anything useful but whole code and other examples can be found here github.com/oziphantom/ElementsSnesEngine

  • @ramakrishnamishra8179
    @ramakrishnamishra8179 Рік тому

    I have been using hungarian notation without even knowing about it.. thank you!

  • @tay3177
    @tay3177 Рік тому

    SNES is limited to displaying a maximum of 16kb for sprites per frame?

    • @oziphantom9465
      @oziphantom9465 Рік тому

      simple answer yes more complex answer, no, you can change the sprite base address at any point, you can also switch the sprites "upper bank" to 1 of 4 positions at any point. However this is rarely practical and needs careful planning.

  • @ecernosoft3096
    @ecernosoft3096 Рік тому

    And remember: The CX16 is only 8 bit!!! So, you've gotta give it that.

  • @ecernosoft3096
    @ecernosoft3096 Рік тому

    Corrections: 6502 processors has TAX, TAY, and the origonal has SAX and LAX (Illegal, go to jail if you use there!)

  • @ecernosoft3096
    @ecernosoft3096 Рік тому

    The vera has a 16 channel PSG, and it has stereo, as well as 2 DMA channels. YM2151 is correct w/ the 8 4 moderator FM stuff.

  • @ecernosoft3096
    @ecernosoft3096 Рік тому

    Also, CX16 is 8 bit. Minus the TG16, all machines are 16 bit here. CX16 is by far, the MOST poweful 8 bit compy. (Like, maybe, just maybe, the Mega65 could beat it, but it doesn't have the sprites, nor two layers, etc etc.)

    • @oziphantom9465
      @oziphantom9465 Рік тому

      A Mega 65 utterly destroys a CX16, its not even a fight. The Mega 65 has extra tricks that on paper don't show the true power. The Raster Rewrite Buffer tech is Amiga 1200 melting power, in that you can use more pixel time per line to make as many layers or sprites as you can fit in the pixel fill time. See this video for details ua-cam.com/video/00bm5uBeBos/v-deo.html on top that it has a programmable DMA engine that gives you better than a Atari Lynx bliter object drawing as well, and the engine runs at the full speed. Then it has insane amounts of CPU power, lots more RAM, a MMU, hardware multipliers and 32bit maths operations, and the Video RAM is memory mapped like a C64 not stuck through a port making it easier and faster to access.

  • @ecernosoft3096
    @ecernosoft3096 Рік тому

    By the way... The Final CX16 has 256 sprites, making it the most powerful sprite throwing machine! (Almost as good as scratch!!!)

    • @oziphantom9465
      @oziphantom9465 Рік тому

      256 sprites is a nice update, however if you watch my other videos, I think it was the Ports one, been a couple of years. Updating all 128 sprites via the port with manual loops is an issue, doubling that is going to take twice as long, that might not even fit inside NTSC VBlank, and sadly there is no PAL mode.

  • @logannosleep5
    @logannosleep5 Рік тому

    The expansion ports on the CX16 could be used for upgrades like "accelerator cards", GPUs, and other co-processors, right?

    • @oziphantom9465
      @oziphantom9465 Рік тому

      not seen the actual expansion port layout to see if it has the DMA/AEC/HALT pin available to stall the 65C02 and let an external CPU take over the bus, but I would imagine it is there or some other mechanism is.

  • @wiggel2161
    @wiggel2161 Рік тому

    11:38 (`*<<16) will (almost) always be 0. It's basically just taking the lower byte (<*) ((`*)<<16) this would work, as the order of operations for the bit string extraction operators is weird Extract from the 64tass Manual "Please note that these prefix operators are not strongly binding like negation or inversion. Instead they apply to the whole expression to the right. This may be unexpected but is required for compatibility with old sources which expect this behaviour."

    • @oziphantom9465
      @oziphantom9465 Рік тому

      Excellent catch, the github code has been updated. Thank you.

  • @wiggel2161
    @wiggel2161 Рік тому

    7:27 Is there a reason you use dummy labels in the struct? If you omit the labels, it seems like it compiles to the same bytecode.

    • @oziphantom9465
      @oziphantom9465 Рік тому

      I feel it is neater and shows the intent more clearly, i.e this is a dummy byte used for alignment rather than just an unknown byte just hanging in the struct. It's a style thing mostly.

  • @jefflinahan5853
    @jefflinahan5853 Рік тому

    audio cuts out at 1:19. What does this result in?

    • @oziphantom9465
      @oziphantom9465 Рік тому

      =($0400,$0828,$0999) and the rest of the assembly. I probably should have put the 'This results in' audio a bit later. But I'm showing you the 64rass commands and then it scrolls to show you the assembler output.

  • @ecernosoft3096
    @ecernosoft3096 2 роки тому

    Thanks.

  • @inceptional
    @inceptional 2 роки тому

    Why not just build the fighters in street Fighter out of say a couple of 64x64 sprites instead, since they're clearly larger than tiny 8x8 sprites? What's the disadvantage of going with the larger sprites to make these larger characters?

    • @oziphantom9465
      @oziphantom9465 2 роки тому

      empty space. Say for example you punch, then you have a lot of empty space above and below the arm. Apply this to every animation frame across the entire game, and you just wasted a lot of ROM space. The arcades do this because the machine is a few thousand and who cares, but for the high volume product for a lower price, every chip counts. So pack the parts of the frame down as much as you can, pack as many frames as you can and maximize profit. Every 50c saved on the cart is few million dollars extra profit. Then you also have the DMA the empty space, wasting crucial DMA time that they already had to Letterbox the game to handle worse case frames for NTSC.

    • @inceptional
      @inceptional 2 роки тому

      @@oziphantom9465 But if the characters do take up most of the space and the machine can get them onto the screen, which I expect is all entirely possible, it's just down to mostly saving the pennies then?

    • @oziphantom9465
      @oziphantom9465 2 роки тому

      @@inceptional they mostly do, but then you can't also share the pieces across all the frames, so you could end up with a 64x64 and then 8x8 to patch fix it, but its probably a net loss overall. 8x8 and 16x16 gives you the highest piece reuse. I do agree that 8x8 and 16x16 was an odd choice, personally I think 32x32 and 8x8 probably would have been a better one. But its one of those things that until you get all the sprite data and try and cut it up, you can't quite be sure. In that is might be fine until you get to Sagat or something and he just breaks it for everything. And the SNES can only have 2 types of sprites, so it one character is built with 8x8+32x32 and another is 8x8+16x16 your screwed. It sold 6.3 million, so if you save 1 penny per cart, you just made $63,000.

  • @ByteMeCompletely
    @ByteMeCompletely 2 роки тому

    Why didn't you compare the 6502 with the z80?

    • @oziphantom9465
      @oziphantom9465 2 роки тому

      because it's "Machine vs Machine" and there is no machine anywhere near powerful enough with a Z80 in it to compare. Then a 3.58mhz Z80 kinda trades blows with a 1mhz 6502, a 65c02 and 8mhz is just a bloodbath.

  • @bradywb98
    @bradywb98 2 роки тому

    Calling Python a typeless language is not very accurate. Python has a strong type system. It will not quietly perform conversions like JavaScript will. Python’s type system *is* dynamic - but that is not to say that it’s weak at all.

  • @dangducthangg1013
    @dangducthangg1013 2 роки тому

    google api ? whats google no thing api = 29 ? 23/08/2009 ?

  • @InsaneFirebat
    @InsaneFirebat 2 роки тому

    9:15 I'm not a fan of writing it incorrectly just so that assembler can make dumb assumptions instead of assembling my code as I wrote it. I'll be sure to avoid 64TASS.

    • @oziphantom9465
      @oziphantom9465 2 роки тому

      You are talking about the long addresses? You don't have to do it the way I'm doing it, you could add the addresses to the local memory map or tell the assembler with @w that you want it to take the value as a 16bit address. The problem is the SNES has a lot of mirroring which doesn't make sense in a 65816 context, to the 65816 each 64K bank is unique. I've just forced it to be this way so its harder for a beginner to make a mistake and not write to the raw register when then mean to write to the mirror label.

    • @InsaneFirebat
      @InsaneFirebat 2 роки тому

      ​@@oziphantom9465 Yes, the STZ longs. I've run into errors from the assembler trying to interpret `PEA label` as a long address, even though PEA can only use a word address. It seems even less intuitive for the assembler to allow it with the address specified. Maybe this makes more sense if you've programmed for other systems. I've only learned assembly for SNES so far.

    • @oziphantom9465
      @oziphantom9465 2 роки тому

      Ok so the disconnect is. On a Snes 802100 is the same address as 002100 and you tell the assembler you want to write to 2100 and that is the same if it is 80 or 00. Of cause 402100 and C02100 are not the same as 002100 or 802100. This is because the SNES does mirroring, this is a SNES feature not a 65816 feature. On a 65816 002100 is 002100 and 802100 is 802100 and 402100 is 402100 and C02100 is C02100 those are 4 different addresses that access different things. So if you are in bank 802100 and you just tells 64tass you want 2100 it sees that as 002100, which is a problem because you are in 80XXXX. The Assembler is helping you, just on the SNES this is "not important". If you look at historic snes code you will see all kinds of odd symbols to "fix this issue". #!Label etc 64tass has multiple ways to solve this issue. stz@w $2100 ; tell 64tass to only take 16bits and use ABS addressing mode stz $2100,b ; tell 64tass that this is Databank relative and should only use 16bits stz <>$2100 ; tell 64tass to take the lower word of the passed param alternatively you can have a label defined in each bank, so when the label data bank and your current set data bank match, it will auto optimize the bank byte away for you. Basically the assembler is doing exactly as your code tells it to, and it is double checking you are doing what you want to do. I.e you tell it PEA LABEL and it say "no no no, LABEL is not in this bank, that won't work, this is not doing what you think it is doing, i.e you can't push the label from this databank, it needs 24bits to specify that actual memory location". Other assemblers that are designed only for the SNES will handle internal mirroring for you, but the rest of the assembler is under powered compared to the 64TASS and its extensive feature set. I would like 64tass to get SNES mirroring built in, but Soci/Singular will only add it if enough people are actually using it. Making a Chicken and Egg problem.

  • @jumhig
    @jumhig 2 роки тому

    Thanks for the info about modifying the VSCode millfork extension.

  • @allbundy432
    @allbundy432 2 роки тому

    Greetings. I have been watching your videos and I would like you to answer a few questions. Expanding the background using mode 7, does it take up more space in the VRAM? Is the 16 kb of storage for sprites always fixed regardless of the graphics mode used? If I only need 8 kb for sprites in the VRAM, can I use the rest of the space to put more details on the backgrounds? Many thanks. I will recommend your channel.

    • @oziphantom9465
      @oziphantom9465 2 роки тому

      by expanding the background, you mean zooming using the Mode7 Param? No, there is no "frame buffer" so the zoom is done as it draws it down the screen live. This changes the size of each pixel, but each pixel is only stored once in VRAM still. So you can zoom or compress it as much as you want it still looks the same in VRAM. you can have upto 16K you are free to use as little as you like, no VRAM is hard allocated to be anything ( well Mode 7 is ) so if you only need 4 sprites then you can only alloc 4 sprites worth and use the rest of the data for something else. See the charset for BG3 hidden in the bottom rows of the screen example for ideas on how to pack data in and around places.

    • @allbundy432
      @allbundy432 2 роки тому

      @@oziphantom9465 Many thanks! It was my understanding that the space available for Sprites in VRAM was limited to 16 kb. Hmm, I'm going to rephrase the question: Could you use more space for sprite tiles? If I wanted to use 32kb of space for sprites, could I do it? Sorry for asking so many questions, recently I became interested in these topics

    • @oziphantom9465
      @oziphantom9465 2 роки тому

      @@allbundy432 The SNES can only see 16KB of sprite data at once, if you want 32K you can but you can only choose sprites from a 16K chunk. You can split the upper 8K of sprites into 4 banks, so you can have a fixed 8K and then 3 upper 8K banks that move through frames. But any sprites you want to have on the screen at one time will have to be in either the fixed bank or the upper 8K bank you choose. You can swap the sprite base pointer to toggle between two 16K banks if you want per frame.

    • @allbundy432
      @allbundy432 2 роки тому

      @@oziphantom9465 Thanks for your quick response. Could this be a limitation to be able to display several different sprites? Limited to a maximum of 16KB of sprite data to display, repeating the same tiles could add more elements but these being repeated. I am in a project in which I have to show 5-6 different enemies, each one made up of 10 sprites (between 8x8 and 16x16), and I am having a hard time showing them on the screen.

    • @oziphantom9465
      @oziphantom9465 2 роки тому

      @@allbundy432 now you understand why Final Fight on the SNES only has 2 different enemies on the screen at once. Why the Turtles games have foot men with different palettes only. You could put a couple on a BG as long as they don't overlap on the Y. You can also sort sprites and switch 8K banks down the screen, this will get more on screen but you will have Y placements and overlapping limits. Which may or may not work for you.

  • @joel230182
    @joel230182 2 роки тому

    "these limits will haunt you, I promise" :'(

  • @jefflinahan5853
    @jefflinahan5853 2 роки тому

    16:38 What is screen 3 (or screen 2 for that matter?) I play my snes games on one screen. 😅

  • @jefflinahan5853
    @jefflinahan5853 2 роки тому

    9:37 how are the odds of 99.5% safe derived?

    • @oziphantom9465
      @oziphantom9465 2 роки тому

      a complex algorithm based on heuristics of how many banks you have on average in a snes title (0.03) combined with how often you want to use more than 8K to which I average screen map plotting, decompression, text building and then rounded to the nearest 0.5%

    • @jefflinahan5853
      @jefflinahan5853 2 роки тому

      @@oziphantom9465 cool thx, I'd be curious to learn more about that but it sounds quite esoteric

  • @jefflinahan5853
    @jefflinahan5853 2 роки тому

    2:10 what is dropout?

    • @oziphantom9465
      @oziphantom9465 2 роки тому

      the sprite or part of the sprite will disappear, if you have ever played a Konami game, you will have noticed flicker on the explosions. That is the sprites "dropping out"

  • @jefflinahan5853
    @jefflinahan5853 2 роки тому

    0:51 oh joy 😂

    • @oziphantom9465
      @oziphantom9465 2 роки тому

      people who program Commodore 64s know the pain of 9bit maths.. since a Commodore 64 is 320x200 pixels.

  • @jefflinahan5853
    @jefflinahan5853 2 роки тому

    2:23 I notice FAST is right after LoROM not FastROM. Is choosing between {Slow,Fast}ROM orthogonal to {Hi,Lo}ROM?

    • @oziphantom9465
      @oziphantom9465 2 роки тому

      sorry I didn't get emails for these. Yes you can have SLOW LOROM, FAST LOROM, SLOW HIROM or FAST HIROM the ROM speed doesn't determine the layout.

  • @jefflinahan5853
    @jefflinahan5853 2 роки тому

    What are there 64 of?

    • @oziphantom9465
      @oziphantom9465 2 роки тому

      I need more context, do you mean as in the 64tass name? 64 stands for Commodore 64.

    • @jefflinahan5853
      @jefflinahan5853 2 роки тому

      @@oziphantom9465 yeah the name 64tass. So it was developed for C64 but supports 16-bit snes as well.

    • @oziphantom9465
      @oziphantom9465 2 роки тому

      @@jefflinahan5853 in the beginning there was Turbo Assembler (TASS) for the C64, then expanded to have macros Turbo Macro Pro, then it got ported to the PC as TMPx and 64tass, then it got expanded. The Commodore 64 and 128 have what is known as the SuperCPU 64 and SuperCPU128 which adds 128K and 20mhz 65816 to either, to 64tass support the 65816 for those platforms. Hence it doesn't natively support the weird SNES bank mirroring as its not a "SNES" assembler per se.

  • @jefflinahan5853
    @jefflinahan5853 2 роки тому

    1:34 Do you know of any linkers that use a random number generator to place things?

    • @oziphantom9465
      @oziphantom9465 2 роки тому

      no, that would be a horrible bug producing mess, or a great testing system depending on how you look at it. Somebody did write a system ( for nes I think it was ) that will randomize the positions of functions. The problem with code is you need to know exactly how big each function is and what it also needs etc Data can be easier but then also does have cases that rely upon some data following other data directly which makes the process messy

    • @jefflinahan5853
      @jefflinahan5853 2 роки тому

      @@oziphantom9465 ok, I don't think "random placement" is a good term then for the linker's strategy. What would give more insight?

    • @oziphantom9465
      @oziphantom9465 2 роки тому

      @@jefflinahan5853 so you mean "put this in bank X and I don't care where" "random", Ca65 and WLA-DX will both do this. I think WLA-DX goes one further with "put this in some bank somewhere" however this comes with the cost of "you will need to tell the assembler exactly what size you want everything to be, i.e lda.b lda.w lda.l so it can use the correct DP, ABS, Long format for address, as the linker can't modify the opcodes and adjust all the other code to shrink or expand to accommodate the change in param size. It will just push it through and you will get a lovely crash. using sections you can basically get this, just .section bank80 ; what ever you want here .send and that will put it somewhere in bank80 for you. You will need to handle moving thing between banks but it is usually a good idea to do that manually as you will want to make sure anything that is set up to do it with ABS has the right data bank address set and you don't break things.

  • @jefflinahan5853
    @jefflinahan5853 2 роки тому

    What IDE is that at 2:53?

  • @WillisZzz
    @WillisZzz 2 роки тому

    Hi, thanks for this. In your conclusion do you say the Action Replay's emulation is NOT supported by the pi1541? If so, what's the next best fast loader emulation for pi1541 users?

    • @oziphantom9465
      @oziphantom9465 2 роки тому

      No, the pi1541 full emulates the 1541 in "disk mode" so you can use the AR cart with it just fine.

  • @retrodev9003
    @retrodev9003 2 роки тому

    The talking is hard to understand,sounds like its a chore for you.Good content though from what I can understand.

  • @DamianYerrick
    @DamianYerrick 3 роки тому

    Be careful when combining DMA to WRAM with HDMA to the PPU. This is because DMA finishing too soon before HDMA will make the CPU of a launch SNES (revision 1/1/1) behave unpredictably, usually crashing the program.

  • @Nikku4211
    @Nikku4211 3 роки тому

    Most of this video went over my head, but nice.

    • @oziphantom9465
      @oziphantom9465 3 роки тому

      yeah this is a "in the trenches" video.

  • @awanderer5446
    @awanderer5446 3 роки тому

    Pure dynamic mode and using MVN to set up DMA registers is quite an interesting idea, never considered that. Will have to play around with that and see if I can squeeze a couple of bytes of VRAM transfers more out of my Vblank handler, thanks!

    • @oziphantom9465
      @oziphantom9465 3 роки тому

      the MVN/P works best when you are doing "from ROM" as you will want to set and update the SRC pointer as well. While "from buffer" it is more optimal to leave the SRC alone. If only Nintendo made the order setup, dest, length, src. So unrolled loops of DP load (not index) and then an abs store still gets you 7 clocks, but you skip 3 bytes. If you do it in words, then it will take 9 clocks per 2 bytes.

  • @mikerobertson4057
    @mikerobertson4057 3 роки тому

    Great, I learned so munch in these 3 minutes Dan.

  • @aaendi6661
    @aaendi6661 3 роки тому

    The sprite VRAM is only 128x256 pixels big, not 128x512 pixels big.

    • @oziphantom9465
      @oziphantom9465 3 роки тому

      Thanks, I did my maths with 2bit not 4bit (/)_.

  • @BubblegumCrash332
    @BubblegumCrash332 3 роки тому

    After watching this series and Retro mechanics explained SNES series I think I can built a SNES blindfolded. Great work I have watched these videos over and over lol

  • @realtrisk
    @realtrisk 3 роки тому

    From an (amateur) musician's standpoint, I can sure tell you I'd rather write music any day of the week on a programmable FM synthesizer than try to use the cheap, crappy sounding samples of the SNES. Even if you make your own samples, there is far too little RAM to make any kind of sweeping or evolving sound, everything must be very static and boring. And don't get me started on that laughable "reverb" that makes ANY song that uses it sound way worse...

    • @oziphantom9465
      @oziphantom9465 3 роки тому

      yeah but are you using an actual MD or an emulated one?

    • @realtrisk
      @realtrisk 3 роки тому

      @@oziphantom9465 What are you talking about?

    • @oziphantom9465
      @oziphantom9465 3 роки тому

      are you comparing FM vs SPC-700 or 'FM as implemented in the MD' vs SPC-700? FM is basically vector music, so in an emulator you can build the music at a much higher resolution, while the SPC-700 is basically raster music, you get what you get, you can fudge this and that here and there but basically it doesn't get much better.

    • @realtrisk
      @realtrisk 3 роки тому

      @@oziphantom9465 I'm not comparing Megadrive anything. I never said I was. FM is still used a lot in modern music production, but nobody uses a sampler with 64k of RAM, save for a few retro composers. I have no clue about the FM in the Megadrive, but I know the Adlib/OPL2 of the PC world sampled at around 50khz, which is far beyond human hearing already, and beyond most modern music production, which is done at 48khz. I'm very happy the X16 has an FM chip instead of a sample synthesis cripplingly limited by RAM. :)

    • @oziphantom9465
      @oziphantom9465 3 роки тому

      I forgot the YM2151 wasn't culled from the machine, so the CX16 does still have some FM and not just sample + PSG. OPL2 is leagues ahead of the YM2151, the OPM is a massive step down. Even with only 64K the SPC-700 easily outclass it. Nobody uses the OPM/OPL/OPL1 or OPN anymore either. the SPC-700 was upgraded and used in the PS1 and PS2.

  • @jeffreyhullekes6866
    @jeffreyhullekes6866 3 роки тому

    I just released my version of the demo remake on the X16 here: www.commanderx16.com/forum/index.php?/files/file/187-stniccc-commander-x16-demo-remake/ And here is a video of it running: ua-cam.com/video/l_B1PRhdqSY/v-deo.html The laptime is 1:39:96 ... (not a typo!) And here without audio: ua-cam.com/video/AQ_YQL9IBJY/v-deo.html So maybe you want to update your "laptimes comparison"...

    • @oziphantom9465
      @oziphantom9465 3 роки тому

      Nice work, you don't have VSync enabled, which I think mine does, due to its origins. I spent 3~4 days on mine I think, its only purpose was to put into the video ;) Sadly I can't modify the video or even add an Annotation these days on you tube. But I will pin it and add a link to the insert video of the ST-NICC.

    • @jeffreyhullekes6866
      @jeffreyhullekes6866 3 роки тому

      @@oziphantom9465 Thanks! Indeed VSync is not enabled. If I did it would probably be around 15 seconds slower. Thanks for pinning it!

  • @awanderer5446
    @awanderer5446 3 роки тому

    The mesen s hacks are lifesafers! I implemented these as macros and handled them in assembly before, but your solution is much more elegant. Also thumbs up for the fast trip to pain town. That's my experience with the Snes in a nutshell.

  • @aaendi6661
    @aaendi6661 3 роки тому

    I think you forgot to mention that the sprite sizes depend on both the oam size bits and the sPPU register settings.

    • @Nikku4211
      @Nikku4211 3 роки тому

      Yeah, he forgot to mention the sprite size modes themselves.

    • @oziphantom9465
      @oziphantom9465 3 роки тому

      I'm covering more how to design the engine, for the details on each register etc I feel people might as well just watch the RetroGameMechanicsExplained videos about them. But point taken. I want do a video on DougFF's meta sprite maker program, so I will talk about it then, in a design decision context.

  • @aaendi6661
    @aaendi6661 3 роки тому

    I forgot there was a reversed bit on the dma, since I never thought about using it before.

    • @oziphantom9465
      @oziphantom9465 3 роки тому

      I think this is really the only practical use for it. Given it has to go to a port and ports are always inc, so you can't use it to shift ram up either.

  • @awanderer5446
    @awanderer5446 3 роки тому

    Very insightful as always, thank you!

  • @basicforge
    @basicforge 3 роки тому

    Would the game be fun if you only managed 20fps?

    • @oziphantom9465
      @oziphantom9465 3 роки тому

      probably not. smooth controls are mostly what makes the game fun. 1 frame of lag is known to be death on the original version.

    • @basicforge
      @basicforge 3 роки тому

      @@oziphantom9465 I suppose, but there are many games which don't have high frame rates on vintage computers, and these games are still fun.

  • @Phaze101
    @Phaze101 3 роки тому

    Not sure what to say here. I like what you did but at the same time I got confused when I thought I knew how it works. Maybe it would be nice if you do this at a slower pace and at more detail. Anyway good work. First time I saw someone explaining this with diagrams and I like your concept. Good Job.

    • @oziphantom9465
      @oziphantom9465 3 роки тому

      which part do you think needs more detail, or what have I failed to explain it would benefit from? I'm happy to do it again ;)

    • @Phaze101
      @Phaze101 3 роки тому

      @@oziphantom9465 Hi, can you please get in touch with me on my discord. Check it on my UA-cam channel front page or info. I tried to find how to get in touch with you over here but couldn't locate it.

  • @desertfish74
    @desertfish74 3 роки тому

    Why wouldn’t *=$80800 work?

    • @oziphantom9465
      @oziphantom9465 3 роки тому

      well you need an extra 0 but where are you putting the *=$808000 and what do you want to achieve? are you saying why can't we just put *$808000 and avoid the * = 0 .logical ? Because the assembler will start at *=$808000 but then when you want to go the next bank at $818000 it will fill in the 32K between the banks for you as it sees it as a single block. You could do the first one as just *=$808000 and then start doing logical to pack the next banks in if you wanted to.

    • @desertfish74
      @desertfish74 3 роки тому

      @@oziphantom9465 yes that was what I meant. I’m not familiar with this kind of banking, I’ll read up some on the .logical in the manual as well I think

  • @desertfish74
    @desertfish74 3 роки тому

    64tass wizardry i don’t understand all of it yet :)