| |
AlexC
Registered: Jan 2008 Posts: 299 |
Detecting REU + VICE
I'm looking for reliable method of detecting REU on different machines (c64/128) and VICE. Either I'm doing something wrong or the only really stable method (without actually writing to REU banks like shown here: http://www.codebase64.org/doku.php?id=base:reu_detect) is this one:
lda #$00
sta $df00
cmp $df00
beq noreu
The following code fails on my C128D:
http://www.willcox.de/index2.htm
At this point I don't need the size of REU as I assume that every single one will provide me with 128KB at least and this is as much as I need.
Thanks in advance
|
|
... 32 posts hidden. Click here to view all posts.... |
| |
TWW
Registered: Jul 2009 Posts: 545 |
I really have no experience with programming REU but in my head, Commodore should have documented with the original REU units if there is a reliable way to detect them.
Further if this is not the case, I would probably write some data to the REU and then verify the same data is being fed back. Then repeat for N banks to determine the size of the REU. |
| |
JackAsser
Registered: Jun 2002 Posts: 2014 |
What's wrong with n2c's suggestion?
1) Do a read from REU memory
2) Write some stuff to the address you read from
3) Read back the stuff
4) If they differ => no REU
5) If they do not differ => REU, restore memory corrupted using the backup from 1) |
| |
AlexC
Registered: Jan 2008 Posts: 299 |
Somehow I can't belive that through all those years nobody came up with definitive solution for the problem. Agree with JA: what is wrong with this solution? |
| |
chatGPZ
Registered: Dec 2001 Posts: 11386 |
i'd do this:
- write $ff to some location
- set up DMA REU->C64 for a single byte, target on the choosen location
- trigger DMA
- check if still $ff, no -> REU present
(need to repeat incase the byte in reu was $ff)
- write $00 to that location
- trigger DMA
- check if still $00, no -> REU present
- else -> no REU present
or you could do what eg wheels does, i extracted the check once: https://sourceforge.net/p/vice-emu/code/HEAD/tree/testprogs/REU.. (this also detects the amount of REU RAM, i think) |
| |
Bamse
Registered: Apr 2013 Posts: 7 |
Just thinking:
Set up a dma for some bytes, no fixed address, execute with autoload off, then reload $df04 (or was it?). Increased value = REU present. |
| |
lft
Registered: Jul 2007 Posts: 369 |
Another option is to run some non-destructive operation such as REU compare, and measure if there were lost cycles, and how many.
There's one thing I don't quite see, however. What is the point of detecting a REU if you aren't planning to use it? And when you use it, you'll trash whatever ramdisk was there. So why exactly do programs in general need non-destructive REU detection?
I think it makes more sense to warn the user that the REU is about to be used (whether it exists or not), and wait for a go-ahead. Also, REUs are often virtual these days, and this approach would provide an opportunity to enable the REU while the program is running. |
| |
chatGPZ
Registered: Dec 2001 Posts: 11386 |
or pop it into the c64! (rock'n'roll!) |
| |
CRT
Registered: Oct 2012 Posts: 87 |
I read several clever methods here.
In Globe I just filled the REU registers and read them back, not my invention but does the trick.. "roughly". It does give a false positives with my EF3.
Could REU detection cause more serious trouble with other carts in the DF00 area? Like system freeze-up, etc. Poking wildly into an unknown device might not always be the best idea. |
| |
Trash
Registered: Jan 2002 Posts: 122 |
I wrote some REU code a while ago and I tested for the reu by lda $d012, doing a compare of 256 bytes, sbc $d012 and comparing if the result was greater than 3...
But as CRT mentions, poking wildly into an unknown device could yield some unwanted results, you're better off just stating that a REU is required and have a manual confirmation or warn that you will be trashing the registers @df00... |
| |
chatGPZ
Registered: Dec 2001 Posts: 11386 |
crashes are expected when there is some cartridge - like FC3 :) |
Previous - 1 | 2 | 3 | 4 | 5 - Next |