FE3 RAM Disk
Moderator: Moderators
FE3 RAM Disk
After sucessfully implementing a Task Switcher for the FE3 last year, I finally spent some time on another idea I had for making use of the extra 512K RAM of the Final Expansion 3: A RAM disk.
Download
As a proof of concept implementation it is not yet fast enough.
Not so impressive results for loading 87 blocks:
SD2IEC without SJLOAD: 39s
SD2IEC with SJLOAD: 3.5s
Loading from RAM: 4s
It is of course possible to make the RAM disk faster, but I wanted to share the current results before I go on
(Source code on Google Code)
Download
As a proof of concept implementation it is not yet fast enough.
Not so impressive results for loading 87 blocks:
SD2IEC without SJLOAD: 39s
SD2IEC with SJLOAD: 3.5s
Loading from RAM: 4s
It is of course possible to make the RAM disk faster, but I wanted to share the current results before I go on
(Source code on Google Code)
Buy the new Bug-Wizard, the first 100 bugs are free!
- Diddl
- Vic 20 Afficionado
- Posts: 426
- Joined: Wed Jun 10, 2009 3:18 am
- Website: https://oe7twj.at/
- Location: Austria
- Occupation: software engineer
Sorry, I could have written more.orion70 wrote:Cheers Kananga, but I don't get exactly what is this .
Yes, it is a virtual device in RAM and if you turn of the VIC all is lost.orion70 wrote:I see it's a (huge) virtual drive seen as device 13, is that right?
Just like you would do with any other device, for example you can use:orion70 wrote:If so, how can I save stuff in it?
SAVE"TEST",13
Or save stuff (here "ABC") with:
OPEN1,13,1,"mydata":PRINT#1,"ABC":CLOSE1
The directory is available with:
LOAD"$",13
You can use the drive for writing data you can not keep in the VICs memory to the extra RAM and read it on demand. That is what I want to do with the VIC-GUI, where I also work on a dynamic loader+linker, but as long as SJLOAD+SD2IEC is faster, it is not necessary to use the RAM drive.
But, as I wrote above, it is just a demonstration how it could work and it should be possible to improve the performance significantly.
BTW, you can't use SJLOAD together with the RAM drive yet, because it uses the same RAM area ($0400). I intend to make both programs co-exist, but I can't find SJLOAD 8 anywhere.
EDIT:
You could also write a program that copies a whole disk in one go, by storing the image in the RAM drive! But who does still use real 5 1/4'' disks?
Buy the new Bug-Wizard, the first 100 bugs are free!
If you keep all of the code in the unbanked area ($0400-$0FFF) it should be easy, but I wanted to leave room for SJLOAD.Diddl wrote:Yes, Jiffy is very fast for a serial stream. But normally a RAM Disk should be much faster. Even if a memory management is nessecary.
Having code on one of the banks gives 32K for code. You could implement channel 15 disk commands with that much space.
In addition, the present implementation is slow because:
- data is copied between banks through a buffer in the unbanked area.
- CHKIN/CKOUT is almost ignored and should be used to setup BASIN/BSOUT
- every call to BASIN/BSOUT jumps to the code in BANK 2.
- LOAD and SAVE uses OPEN/BASIN/BSOUT/CLOSE
Should be easy to make it faster
Buy the new Bug-Wizard, the first 100 bugs are free!
- Diddl
- Vic 20 Afficionado
- Posts: 426
- Joined: Wed Jun 10, 2009 3:18 am
- Website: https://oe7twj.at/
- Location: Austria
- Occupation: software engineer
It would be nice to have it integrated in FE3FIRMWARE.
It wouldn't be nessecary to hold SJLOAD and RAMDRIVE code at $0400, it could stay in ROM also. Only a small code part for fetching bytes from RAM would be nessecary to execute in non banked area.
But since VC-20 has a small RAM area, speed is never a problem. A speed near to jiffy is fast enough normally.
I also thought about a disk copy program using FE3 RAM and OpenCBM diskcode. But there are not many people who have a FE3 and most people doesn't use 5 1/4" disks ...
I think it would be better to have a fast copy from 1541 to SD card (D64 image).
It wouldn't be nessecary to hold SJLOAD and RAMDRIVE code at $0400, it could stay in ROM also. Only a small code part for fetching bytes from RAM would be nessecary to execute in non banked area.
But since VC-20 has a small RAM area, speed is never a problem. A speed near to jiffy is fast enough normally.
I also thought about a disk copy program using FE3 RAM and OpenCBM diskcode. But there are not many people who have a FE3 and most people doesn't use 5 1/4" disks ...
I think it would be better to have a fast copy from 1541 to SD card (D64 image).
True, but the footprint in unbanked memory of the current release is around 1.6K.Diddl wrote:It wouldn't be nessecary to hold SJLOAD and RAMDRIVE code at $0400, it could stay in ROM also. Only a small code part for fetching bytes from RAM would be nessecary to execute in non banked area.
But I am working on it, stay tuned!
Buy the new Bug-Wizard, the first 100 bugs are free!
I changed the way the driver copies data to and from RAM banks and managed to improve speed slightly. It is now faster than SD2IEC+SJLOAD.
Current transfer rate for loading is 9.3KB/s.
Results for loading 87 blocks:
- SD2IEC without SJLOAD: 39s
- SD2IEC with SJLOAD: 3.5s
- Loading from RAM: 2.3s
I also moved the unbanked code to $990 which allows to load SJLOAD to $0400 (at least the last version I have, which is 7).
For you convenience (and easier usage in the FE3 menu) FE3RD loads and initializes SJLOAD, if it finds it in the same directory under the name "SJLOAD$04".
Download
Current transfer rate for loading is 9.3KB/s.
Results for loading 87 blocks:
- SD2IEC without SJLOAD: 39s
- SD2IEC with SJLOAD: 3.5s
- Loading from RAM: 2.3s
I also moved the unbanked code to $990 which allows to load SJLOAD to $0400 (at least the last version I have, which is 7).
For you convenience (and easier usage in the FE3 menu) FE3RD loads and initializes SJLOAD, if it finds it in the same directory under the name "SJLOAD$04".
Download
Buy the new Bug-Wizard, the first 100 bugs are free!
- Diddl
- Vic 20 Afficionado
- Posts: 426
- Joined: Wed Jun 10, 2009 3:18 am
- Website: https://oe7twj.at/
- Location: Austria
- Occupation: software engineer
Very nice work. I would like to see this inside the FE3 firmware integrated. Maybe inside the FE3WEDGE.
If it would be reset resistant, it would be nice for developing on the VC-20.
And another nice idea would be a backup/restore to SD card as a big file.
This RAM disk would be very useful for scener. Big demo files could be played back from RAM disk easyli.
If it would be reset resistant, it would be nice for developing on the VC-20.
And another nice idea would be a backup/restore to SD card as a big file.
This RAM disk would be very useful for scener. Big demo files could be played back from RAM disk easyli.
Should be possible.Diddl wrote:Very nice work. I would like to see this inside the FE3 firmware integrated. Maybe inside the FE3WEDGE.
Perhaps, the Task Switcher is more useful for developers, because you can save and load machine state at any time (almost ) and it is reset resistant unless you press the red reset button on the FE3 cartridge or the RAM at $A000 is overwritten.If it would be reset resistant, it would be nice for developing on the VC-20.
And you could run debugging tools in one of the available virtual environments.
Take a look at the memory map:And another nice idea would be a backup/restore to SD card as a big file.
Code: Select all
Segment list:
-------------
Name Start End Size
--------------------------------------------
ZEROPAGE 0000FA 0000FD 000004
LTABLE 000990 0009A3 000014
LCODE 0009A4 000F98 0005F5
LDATA 000F99 000FE4 00004C
BASIC 0011FF 00120C 00000E
BOOT 00120D 001472 000266
TABLE 002000 002003 000004
CODE 002004 0026EB 0006E8
RODATA 0026EC 00272B 000040
DATA 00272C 002CF1 0005C6
My intention was to have a disk for loading parts of a bigger system (e.g. a modular VIC GUI) that is unaffected by directory changes on the boot drive (the SD2IEC card).This RAM disk would be very useful for scener. Big demo files could be played back from RAM disk easyli.
The program would copy its modules/data to the RAM drive and is then free to navigate through the file system on the SD card without caring about the original location of the modules.
I was also thinking about using D64 format for the RAM disk, which would allow to initialize the RAM disk with a prepared D64 file, but I am not sure, if that is possible with a footprint in unbanked memory that is small enough to co-exist with SJLOAD and not too slow.
Buy the new Bug-Wizard, the first 100 bugs are free!
- Diddl
- Vic 20 Afficionado
- Posts: 426
- Joined: Wed Jun 10, 2009 3:18 am
- Website: https://oe7twj.at/
- Location: Austria
- Occupation: software engineer
D64 would be great!
But this would take much code. Much code would be no problem, we have 512KB Flash memory ...
... but this much code must be written by anyone. This D64 code would be very complex, nearly as complex as a 1541 DOS.
It should be possible within 8 to 12 KB. It could be DOS compatible, with a command channel #15 which does accept DOS commands to delete and rename files, formatting D64 buffer space, allocate blocks and so on.
---
SJLOAD changes vectors from lower RAM. Same vectors are needed for RAM disk. By checking unit number we can decide if RAM disk is choosen.
If any ROM is available, vectors could directly point into this ROM. If no ROM is selected, a small stub in lower 3K memory is needed to switch on ROM and switch of after finishing procedure.
another idea would be a special kernel ...
no space in any RAM would be needed by a changed kernel. Both SJLOAD and RAMDISk could run seemless.
The problem is changing the kernel, if no socket is in your VC-20.
But this would take much code. Much code would be no problem, we have 512KB Flash memory ...
... but this much code must be written by anyone. This D64 code would be very complex, nearly as complex as a 1541 DOS.
It should be possible within 8 to 12 KB. It could be DOS compatible, with a command channel #15 which does accept DOS commands to delete and rename files, formatting D64 buffer space, allocate blocks and so on.
---
SJLOAD changes vectors from lower RAM. Same vectors are needed for RAM disk. By checking unit number we can decide if RAM disk is choosen.
If any ROM is available, vectors could directly point into this ROM. If no ROM is selected, a small stub in lower 3K memory is needed to switch on ROM and switch of after finishing procedure.
another idea would be a special kernel ...
no space in any RAM would be needed by a changed kernel. Both SJLOAD and RAMDISk could run seemless.
The problem is changing the kernel, if no socket is in your VC-20.
There is a new version of the RAM Disk available for download.
A few bugs are fixed (thanks to Mike for the feedback) and the program prints the address of the device number used on startup. Some programs require to use an address in the range 8..11 for saving or loading, so now you know where to POKE it.
Still not everything is working as it should.
From the README:
"At present, the RAM drive stops programs like FB20 (file browser) and
VIN/Diskmenu (graphical file browser) from working for unknown reasons.
Debugging is in progress..."
Cheers!
A few bugs are fixed (thanks to Mike for the feedback) and the program prints the address of the device number used on startup. Some programs require to use an address in the range 8..11 for saving or loading, so now you know where to POKE it.
Still not everything is working as it should.
From the README:
"At present, the RAM drive stops programs like FB20 (file browser) and
VIN/Diskmenu (graphical file browser) from working for unknown reasons.
Debugging is in progress..."
Cheers!
Buy the new Bug-Wizard, the first 100 bugs are free!
I removed a few bugs and added support for wildcards to the RAM Driver. You can use '?' and '*' for filenames (for loading).
It is now possible to replace an existing file by prepending the filename with "@:", e.g. SAVE"@:name",13
Download RAM DISK 0.6 here
Current performance for a file of 22051 Bytes:
Save: 3306Kcycles (PAL: ~3s)
Load: 2354Kcycles (PAL ~2.1s)
Verify: 2405Kcycles (PAL ~2.2s)
Unbanked memory is almost full, but I plan to add a command channel (15) in a future version in order to support deleting files, etc.
It is now possible to replace an existing file by prepending the filename with "@:", e.g. SAVE"@:name",13
Download RAM DISK 0.6 here
Current performance for a file of 22051 Bytes:
Save: 3306Kcycles (PAL: ~3s)
Load: 2354Kcycles (PAL ~2.1s)
Verify: 2405Kcycles (PAL ~2.2s)
Unbanked memory is almost full, but I plan to add a command channel (15) in a future version in order to support deleting files, etc.
Buy the new Bug-Wizard, the first 100 bugs are free!
There is a new release of the RAM DRIVE that adds support for the command channel (15). You can now read the status of the last operation, and scratch and rename files.
The driver should survive a reset, if the module area remains untouched.
Download RAM DISK 0.7 here
Running on real hardware as device 9 with the GUI:
EDIT: unnecessary quotes removed.
The driver should survive a reset, if the module area remains untouched.
Download RAM DISK 0.7 here
Running on real hardware as device 9 with the GUI:
EDIT: unnecessary quotes removed.
Buy the new Bug-Wizard, the first 100 bugs are free!