| |
TWW
Registered: Jul 2009 Posts: 545 |
Cartridge - C64 Game System, System 3 Memory Management
Does these cartridges allow memory management in terms of normal ROM/RAM/IO? I.E. Can I use the RAM under $a000-$bfff, $d000-$dfff and $e000-$efff?
Reason I ask i coz I made a frame for this cartridge in CRT format and it loads and executes fine. However I am only able to access ROM and IO.
http://vice-emu.sourceforge.net/vice_15.html#SEC319 |
|
| |
chatGPZ
Registered: Dec 2001 Posts: 11386 |
works exactly the same as with a regular 8k Game cartridge |
| |
TWW
Registered: Jul 2009 Posts: 545 |
Please help me get some clarification;
15.11.3.1 0 - Normal cartridge
Size 8Kb
GAME active (1)
EXROM inactive (0)
Load address $8000-9FFF
15.11.3.16 15 - C64 Game System, System 3
Size 512Kb (64 banks of 8Kb each)
GAME inactive (0)
EXROM active (1)
Load address $8000-9FFF (all modules)
The GAME/EXROM lines are inverted. From what I understand is that the System 3 cartridge uses the ultimax format which is crypticly described as "open" (as opposed to "RAM") in the programmers ref. manual. so I am curious what exactly this means? |
| |
JackAsser
Registered: Jun 2002 Posts: 2014 |
Tww: just check https://www.c64-wiki.com/index.php/Bank_Switching specifically the mode table section |
| |
Mr. SID
Registered: Jan 2003 Posts: 424 |
I find this easier to read than the mode table:
http://www.harries.dk/files/C64MemoryMaps.pdf
Btw, the better option is to use the EasyFlash format, because it's a more powerful and flexible standard. |
| |
TWW
Registered: Jul 2009 Posts: 545 |
Yes, it's the same table you guys show and it's based on the C64 Prog. Ref. Man. info.
Basically if EXROM is high and GAME is low, you are in ultimax mode and the loram/hiram get's ignored. In fact the only C64 RAM memory available is from $0000 to $0fff and everything else is hidden from the CPU except the cartridge @ $8000 (or $e000 or both).
Assuming I haven't misunderstood this completely, how does games based on the System 3 cartridge format (like "last ninja 3 remix") manage in this mode? Something is missing. |
| |
chatGPZ
Registered: Dec 2001 Posts: 11386 |
*both* carts use regular 8k mode, not ultimax (i havent seen a game cart that uses that, except the actual ultimax carts) - the years old VICE doc you are looking at is simply wrong. (also generally those flags for GAME and EXROM in crt images is pretty meaningless, and emulators ignore them anyway - its a relict from the days when ppl thought a generic cartridge emulation could handly all the different cartridges) if you want to see how a certain cartridge works, its a much better idea to look at the actual VICE source, it usually contains a short description: https://sourceforge.net/p/vice-emu/code/HEAD/tree/trunk/vice/sr.. |
| |
TWW
Registered: Jul 2009 Posts: 545 |
Alright GPZ, I will check out the source when I sober up, meanwhile, here is the simple frame-setup (I checked it with a hex-editor and it's identical headers for the cartridge and the chips to the original described in the docs):
/*---------------------------------------------------------
C64 Game System Cartridge, System 3
512Kb (64 banks a 8Kb located at $8000-$9fff)
Cartridge Header File is set up 100%, no need to touch.
Chip Header File needs to be repeated for each chip
only update is 'CartridgeChipNumber' which is updated
automatically when the header data is copied into the
chip in question.
Bank switching:
Write to address $de00 + x, where x is the bank number.
Kickass Compiling:
-aom
-binfile
-maxaddr -1
Output as "file.crt"
VICE Autostart:
x64sc.exe -cartcrt "${outputFilePath}"
---------------------------------------------------------*/
// Functions
// ------------------------
.function _SwitchEndian16(argument) {
.return floor(argument / $100) + floor([argument/$100-floor(argument / $100)]*256)*256
}
.function _SwitchEndian32(argument) {
.return floor(argument / $1000000) + [floor(argument / $10000) - floor(argument / $1000000)*256]*256 + [floor(argument / $100) - floor(argument / $10000)*256]*$10000 + [argument - floor(argument / $100)*256]*$1000000
}
// Variables
// ------------------------
.var i = 0
// Cartridge Parameters
// ------------------------
// Cartridge Header File
.const CartridgeHeaderSize = $40 // #$40 is default Double Word (Big endian)
.const CartridgeVersion = 1.000 // High/Low Order Fixed Point Word
.const CartridgeType = 15 // 15 = C64 GS System 3. Word (Big Endian)
.const CartridgeEXROM = 1 // 0 = Inactive & 1 = Active.
.const CartridgeGAME = 0 // 0 = Inactive & 1 = Active.
.const CartridgeName = "C64GS C" // Maximum 32 bytes.
// Chip Header File
.const CartridgeChipHeaderSize = $10 // Size of Bank Header Integer (#$10 is default)
.const CartridgeChipSize = $2000 // Size of Cartridge Banks Integer
.const CartridgeChipType = 0 // 0 = ROM, 1 = RAM, 2 = Flash. Word (Big Endian)
.var CartridgeChipNumber = 0 // ID Number for the Chips
.const CartridgeLocation = $8000 // Cartridge ROM address on the C64 Word (Big Endian)
// Cartridge Header File
// ------------------------
.pc = $0000 "Cartridge Header"
.text "C64 CARTRIDGE "
.dword _SwitchEndian32(CartridgeHeaderSize)
.byte CartridgeVersion, round([CartridgeVersion-floor(CartridgeVersion)]*1000)
.word _SwitchEndian16(CartridgeType)
.byte CartridgeGAME
.byte CartridgeEXROM
.fill 6,0
.text CartridgeName
.byte $61,$72,$74,$72,$69,$64,$67,$65 // Ugly hack due to string handling...
.fill 32-CartridgeName.size()-8,0
// Chip Header File - 01
// ------------------------
.text "CHIP"
.dword _SwitchEndian32(CartridgeChipHeaderSize + CartridgeChipSize)
.word _SwitchEndian16(CartridgeChipType)
.word _SwitchEndian16(CartridgeChipNumber) .eval CartridgeChipNumber++
.word _SwitchEndian16(CartridgeLocation)
.word _SwitchEndian16(CartridgeChipSize)
!Begin:
.pseudopc CartridgeLocation {
.word CartridgeColdStart
.word CartridgeWarmStart
.byte $c3, $c2, $cd, $38, $30 // CBM80
CartridgeColdStart:
CartridgeWarmStart:
sei
lda #$35
sta $01
!: inc $d020
jmp !-
}
!End:
.fill CartridgeChipSize - [!End- - !Begin-], $00
.for (i = 0 ; i < 127 - CartridgeChipNumber ; i++) {
// Chip Header File - NN
// ------------------------
.text "CHIP"
.dword _SwitchEndian32(CartridgeChipHeaderSize + CartridgeChipSize)
.word _SwitchEndian16(CartridgeChipType)
.word _SwitchEndian16(CartridgeChipNumber) .eval CartridgeChipNumber++
.word _SwitchEndian16(CartridgeLocation)
.word _SwitchEndian16(CartridgeChipSize)
!Begin:
.byte $00
!End:
.fill CartridgeChipSize - [!End- - !Begin-], $00
}
Runs perfectly but only problem is how do I access RAM under $a000 or $e000 (when I enter monitor, I only see C64 ROM @ these locations when CPU is banked (meaning LoRam/HiRam is ignored as it was set in the code executed during autostart))? |
| |
JackAsser
Registered: Jun 2002 Posts: 2014 |
Are you saying #$35 in $01 doesn't give you access to RAM? Did you try "bank ram" in the VICE mon? |
| |
TWW
Registered: Jul 2009 Posts: 545 |
What I mean is that when I enter the monitor, the default bank is CPU (as it sees it) and normally this means (if You set #$35 to $01) you should see ram under $a000 and $e000. but when I enter the monitor I see C64 BASIC and KERNAL ROM.
Surely I can BANK into RAM by monitor command but that does not help me access (read) RAM in the code (by manipulating Hi/LoRAM bits). |
| |
oziphantom
Registered: Oct 2014 Posts: 490 |
Dumb Question. What are you initialising $00 to? If it is set to inputs, then you will always be $37 on the pins. I really recommenced you put a proper C64 boot up sequence in the code and then test. |
... 12 posts hidden. Click here to view all posts.... |
Previous - 1 | 2 | 3 - Next |