Revision 69
Added by markw over 11 years ago
| firmware/diskio_sectorrequest.c | ||
|---|---|---|
|
#include "diskio.h"
|
||
|
|
||
|
#include "regs.h"
|
||
|
|
||
|
void mmcReadCached(u32 sector);
|
||
|
u32 n_actual_mmc_sector;
|
||
|
unsigned char * mmc_sector_buffer;
|
||
|
|
||
|
void mmcReadCached(u32 sector)
|
||
|
{
|
||
|
//debug("mmcReadCached");
|
||
|
//plotnext(toatarichar(' '));
|
||
|
//plotnextnumber(sector);
|
||
|
//debug("\n");
|
||
|
if(sector==n_actual_mmc_sector) return;
|
||
|
//debug("mmcReadREAL");
|
||
|
//plotnext(toatarichar(' '));
|
||
|
//plotnextnumber(sector);
|
||
|
//debug("\n");
|
||
|
|
||
|
//u08 ret,retry;
|
||
|
//predtim nez nacte jiny, musi ulozit soucasny
|
||
|
// TODO mmcWriteCachedFlush();
|
||
|
//az ted nacte novy
|
||
|
//retry=0; //zkusi to maximalne 256x
|
||
|
/*do
|
||
|
{
|
||
|
ret = mmcRead(sector); //vraci 0 kdyz ok
|
||
|
retry--;
|
||
|
} while (ret && retry);
|
||
|
while(ret); //a pokud se vubec nepovedlo, tady zustane zablokovany cely SDrive!
|
||
|
*/
|
||
|
|
||
|
*zpu_out4 = (sector<<8)|0xa5;
|
||
|
while (*zpu_in4 != *zpu_out4)
|
||
|
{
|
||
|
// Wait until ready
|
||
|
}
|
||
|
|
||
|
n_actual_mmc_sector=sector;
|
||
|
}
|
||
|
|
||
|
|
||
|
/*-----------------------------------------------------------------------*/
|
||
|
/* Initialize Disk Drive */
|
||
|
/*-----------------------------------------------------------------------*/
|
||
|
|
||
|
DSTATUS disk_initialize (void)
|
||
|
{
|
||
|
DSTATUS stat;
|
||
|
|
||
|
n_actual_mmc_sector = 0xffffffff;
|
||
|
//do
|
||
|
//{
|
||
|
// mmcInit();
|
||
|
//}
|
||
|
//while(mmcReset()); //dokud nenulove, tak smycka (return 0 => ok!)
|
||
|
|
||
|
//set_spi_clock_freq();
|
||
|
|
||
|
// no longer in ram (yet!), misuse will break us...
|
||
|
mmc_sector_buffer = (unsigned char *)0x8000; // 512 bytes in the middle of memory space!
|
||
|
|
||
|
stat = RES_OK;
|
||
|
|
||
|
return stat;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
/*-----------------------------------------------------------------------*/
|
||
|
/* Read Partial Sector */
|
||
|
/*-----------------------------------------------------------------------*/
|
||
|
|
||
|
DRESULT disk_readp (
|
||
|
BYTE* dest, /* Pointer to the destination object */
|
||
|
DWORD sector, /* Sector number (LBA) */
|
||
|
WORD sofs, /* Offset in the sector */
|
||
|
WORD count /* Byte count (bit15:destination) */
|
||
|
)
|
||
|
{
|
||
|
DRESULT res;
|
||
|
|
||
|
/*debug("readp:");
|
||
|
plotnextnumber(sector);
|
||
|
debug(" ");
|
||
|
plotnextnumber((int)dest);
|
||
|
debug(" ");
|
||
|
plotnextnumber(sofs);
|
||
|
debug(" ");
|
||
|
plotnextnumber(count);
|
||
|
debug(" ");
|
||
|
plotnextnumber(atari_sector_buffer);
|
||
|
debug(" ");
|
||
|
plotnextnumber(mmc_sector_buffer);
|
||
|
debug("\n");
|
||
|
*/
|
||
|
// Put your code here
|
||
|
mmcReadCached(sector);
|
||
|
for(;count>0;++sofs,--count)
|
||
|
{
|
||
|
unsigned char x = mmc_sector_buffer[sofs];
|
||
|
//printf("char:%02x loc:%d", x,sofs);
|
||
|
*dest++ = x;
|
||
|
}
|
||
|
|
||
|
res = RES_OK;
|
||
|
|
||
|
return res;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
/*-----------------------------------------------------------------------*/
|
||
|
/* Write Partial Sector */
|
||
|
/*-----------------------------------------------------------------------*/
|
||
|
|
||
|
DRESULT disk_writep (const BYTE* buff, DWORD sc)
|
||
|
{
|
||
|
DRESULT res;
|
||
|
|
||
|
|
||
|
if (!buff) {
|
||
|
if (sc) {
|
||
|
|
||
|
// Initiate write process
|
||
|
|
||
|
} else {
|
||
|
|
||
|
// Finalize write process
|
||
|
|
||
|
}
|
||
|
} else {
|
||
|
|
||
|
// Send data to the disk
|
||
|
|
||
|
}
|
||
|
|
||
|
return res;
|
||
|
}
|
||
|
|
||
| firmware/Makefile | ||
|---|---|---|
|
MINSTARTUP_SRC = mycrt0.s
|
||
|
MINSTARTUP_OBJ = $(patsubst $(STARTUP_DIR)/%.s,$(BUILD_DIR)/%.o,$(MINSTARTUP_SRC))
|
||
|
|
||
|
MAIN_PRJ = JustStartAtari
|
||
|
MAIN_SRC = main.c regs.c freeze.c joystick.c fileutils.c fileselector.c atari_drive_emulator.c pokey/uart.c hexdump.c printf/printf.c fat/pff_file.c fat/pff.c common/utils.c sd_direct/diskio_mmc.c sd_direct/spi.c sd_direct/mmc.c
|
||
|
#gcc -g -O0 -DLITTLE_ENDIAN test_drive.c atari_drive_emulator.c native/uart.c hexdump.c printf/printf.c fat/pff_file.c fat/pff.c common/utils.c native/diskio_image.c -I. -Iprintf -Ifat -Icommon
|
||
|
#MAIN_SRC = stuff.c
|
||
|
MAIN_OBJ = $(COMMON_OBJ) $(patsubst %.c,$(BUILD_DIR)/%.o,$(MAIN_SRC))
|
||
|
MCC_PRJ = MCC216
|
||
|
MCC_SRC = main.c regs.c freeze.c joystick.c fileutils.c fileselector.c atari_drive_emulator.c pokey/uart.c hexdump.c printf/printf.c fat/pff_file.c fat/pff.c common/utils.c sd_direct/diskio_mmc.c sd_direct/spi.c sd_direct/mmc.c mcc/dirs.c
|
||
|
MCC_OBJ = $(patsubst %.c,$(BUILD_DIR)/%.o,$(MCC_SRC))
|
||
|
|
||
|
MIST_PRJ = MIST
|
||
|
MIST_SRC = main.c regs.c freeze.c joystick.c fileutils.c fileselector.c atari_drive_emulator.c pokey/uart.c hexdump.c printf/printf.c fat/pff_file.c fat/pff.c common/utils.c mist/diskio_sectorrequest.c mist/dirs.c
|
||
|
MIST_OBJ = $(patsubst %.c,$(BUILD_DIR)/%.o,$(MIST_SRC))
|
||
|
|
||
|
LINKMAP = ./standalone_simple.ld
|
||
|
|
||
|
|
||
| ... | ... | |
|
|
||
|
|
||
|
# Our target.
|
||
|
all: $(BUILD_DIR) $(MAIN_PRJ).bin $(MAIN_PRJ).rpt
|
||
|
all: mcc mist
|
||
|
|
||
|
install:
|
||
|
cd ../common/romgen && ./createall && cd ../../firmware
|
||
|
|
||
|
mcc: $(BUILD_DIR) $(MCC_PRJ).bin $(MCC_PRJ).rpt
|
||
|
|
||
|
mist: $(BUILD_DIR) $(MIST_PRJ).bin $(MIST_PRJ).rpt
|
||
|
|
||
|
clean:
|
||
|
rm -f $(BUILD_DIR)/*.o *.hex *.elf *.map *.lst *.srec $(MAIN_PRJ).rom *~ */*.o *.bin
|
||
|
rm -f $(BUILD_DIR)/*.o *.hex *.elf *.map *.lst *.srec $(MIST_PRJ).rom $(MCC_PRJ).rom *~ */*.o *.bin
|
||
|
|
||
|
|
||
|
# Convert ELF binary to bin file.
|
||
| ... | ... | |
|
|
||
|
# Link - this produces an ELF binary.
|
||
|
|
||
|
$(MAIN_PRJ).elf: $(MINSTARTUP_OBJ) $(MAIN_OBJ)
|
||
|
$(MCC_PRJ).elf: $(MINSTARTUP_OBJ) $(MCC_OBJ)
|
||
|
$(LD) $(LFLAGS) -T $(LINKMAP) -o $@ $+ $(LIBS)
|
||
|
|
||
|
$(MIST_PRJ).elf: $(MINSTARTUP_OBJ) $(MIST_OBJ)
|
||
|
$(LD) $(LFLAGS) -T $(LINKMAP) -o $@ $+ $(LIBS)
|
||
|
|
||
|
$(BUILD_DIR)/%.o: %.c Makefile
|
||
|
mkdir -p `dirname $@`
|
||
|
$(CC) $(CFLAGS) -o $@ -c $<
|
||
| firmware/atari_drive_emulator.c | ||
|---|---|---|
|
//printf("appears valid\n");
|
||
|
}
|
||
|
|
||
|
struct SimpleFile * get_drive_status(int driveNumber)
|
||
|
{
|
||
|
return drives[driveNumber];
|
||
|
}
|
||
|
|
||
|
void init_drive_emulator()
|
||
|
{
|
||
|
int i;
|
||
| firmware/atari_drive_emulator.h | ||
|---|---|---|
|
// For a read-only disk, just have no write function!
|
||
|
struct SimpleFile;
|
||
|
void set_drive_status(int driveNumber, struct SimpleFile * file);
|
||
|
struct SimpleFile * get_drive_status(int driveNumber);
|
||
|
void describe_disk(int driveNumber, char * buffer);
|
||
|
|
||
| firmware/fileselector.c | ||
|---|---|---|
|
|
||
|
extern int debug_pos; // ARG!
|
||
|
extern int debug_adjust; // ARG!
|
||
|
extern char USER_DIR[];
|
||
|
|
||
|
// TODO!
|
||
|
#define MAX_PATH_LENGTH (9*5 + 8+3+1 + 1)
|
||
| ... | ... | |
|
char dir[MAX_PATH_LENGTH];
|
||
|
if (file_name(file)[0] == '\0')
|
||
|
{
|
||
|
strcpy(&dir[0],"/atari800/user");
|
||
|
strcpy(&dir[0],USER_DIR);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
| firmware/main.c | ||
|---|---|---|
|
|
||
|
#include "atari_drive_emulator.h"
|
||
|
|
||
|
extern char ROM_DIR[];
|
||
|
|
||
|
// FUNCTIONS in here
|
||
|
// i) pff init - NOT USED EVERYWHERE
|
||
|
// ii) file selector - kind of crap, no fine scrolling - NOT USED EVERYWHERE
|
||
| ... | ... | |
|
void
|
||
|
reboot(int cold)
|
||
|
{
|
||
|
set_reset_6502(1);
|
||
|
set_pause_6502(1);
|
||
|
if (cold)
|
||
|
{
|
||
|
clear_64k_ram();
|
||
|
}
|
||
|
set_reset_6502(1);
|
||
|
// Do nothing in here - this resets the memory controller!
|
||
|
set_reset_6502(0);
|
||
|
set_pause_6502(0);
|
||
|
}
|
||
| ... | ... | |
|
// 0x410000-0x41FFFF (0xc10000 in zpu space) = directory cache - 64k
|
||
|
// 0x420000-0x43FFFF (0xc20000 in zpu space) = freeze backup
|
||
|
|
||
|
struct SimpleFile * files[5];
|
||
|
struct SimpleFile * files[6];
|
||
|
void loadromfile(struct SimpleFile * file, int size, void * ram_address)
|
||
|
{
|
||
|
ram_address += 0x800000;
|
||
| ... | ... | |
|
}
|
||
|
}
|
||
|
|
||
|
void loadosrom()
|
||
|
{
|
||
|
if (file_size(files[5]) == 0x4000)
|
||
|
{
|
||
|
loadromfile(files[5],0x4000, (void *)0x704000);
|
||
|
}
|
||
|
else if (file_size(files[5]) ==0x2800)
|
||
|
{
|
||
|
loadromfile(files[5],0x2800, (void *)0x705800);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
int main(void)
|
||
|
{
|
||
|
/* disk_initialize();
|
||
|
{
|
||
|
char buffer[512];
|
||
|
|
||
|
freeze_init((void*)0xc20000); // 128k
|
||
|
|
||
|
debug_pos = -1;
|
||
|
debug_adjust = 0;
|
||
|
baseaddr = (unsigned char volatile *)(40000 + atari_regbase);
|
||
|
set_pause_6502(1);
|
||
|
set_reset_6502(1);
|
||
|
set_reset_6502(0);
|
||
|
set_turbo_6502(1);
|
||
|
set_rom_select(1);
|
||
|
set_ram_select(0);
|
||
|
|
||
|
init_printf(0, char_out);
|
||
|
reboot(1);
|
||
|
// for (;;);
|
||
|
wait_us(5000000);
|
||
|
|
||
|
set_pause_6502(1);
|
||
|
freeze();
|
||
|
debug_pos = 0;
|
||
|
|
||
|
printf("Hello world 3");
|
||
|
debug_pos = 40;
|
||
|
int i;
|
||
|
for (i=0;i!=512; ++i)
|
||
|
{
|
||
|
buffer[i] = i;
|
||
|
}
|
||
|
int volatile * x = (int volatile *)0x4000;
|
||
|
int volatile * y = (int volatile *)&buffer[0];
|
||
|
for (i=0;i!=128; ++i)
|
||
|
{
|
||
|
x[i] = y[i];
|
||
|
}
|
||
|
hexdump_pure(0x4000,8);
|
||
|
hexdump_pure(0x41f8,8);
|
||
|
debug_pos = 120;
|
||
|
|
||
|
printf(" Writing sector ");
|
||
|
n_actual_mmc_sector = 30;
|
||
|
disk_writeflush();
|
||
|
printf(" Wrote sector ");
|
||
|
|
||
|
for (i=0;i!=128; ++i)
|
||
|
{
|
||
|
x[i] = 0;
|
||
|
}
|
||
|
n_actual_mmc_sector = -1;
|
||
|
disk_readp(&buffer[0],30,0,512);
|
||
|
hexdump_pure(0x4000,8);
|
||
|
hexdump_pure(0x41f8,8);
|
||
|
debug_pos = 200;
|
||
|
|
||
|
disk_readp(&buffer[0],0x103,0,512);
|
||
|
hexdump_pure(0x4000,8);
|
||
|
hexdump_pure(0x41f8,8);
|
||
|
debug_pos = 280;
|
||
|
|
||
|
disk_readp(&buffer[0],0,0,512);
|
||
|
hexdump_pure(0x4000,8);
|
||
|
hexdump_pure(0x41f8,8);
|
||
|
debug_pos = 360;
|
||
|
|
||
|
printf("OK...");
|
||
|
|
||
|
//for (;;);
|
||
|
wait_us(10000000);
|
||
|
}*/
|
||
|
|
||
|
/* spiInit();
|
||
|
set_spi_clock_freq();
|
||
|
mmcReadLoop();*/
|
||
| ... | ... | |
|
}*/
|
||
|
|
||
|
int i;
|
||
|
for (i=0; i!=5; ++i)
|
||
|
for (i=0; i!=6; ++i)
|
||
|
{
|
||
|
files[i] = (struct SimpleFile *)alloca(file_struct_size());
|
||
|
file_init(files[i]);
|
||
| ... | ... | |
|
debug_pos = -1;
|
||
|
debug_adjust = 0;
|
||
|
baseaddr = (unsigned char volatile *)(40000 + atari_regbase);
|
||
|
set_pause_6502(1);
|
||
|
set_reset_6502(1);
|
||
|
set_reset_6502(0);
|
||
|
set_turbo_6502(1);
|
||
|
set_rom_select(2);
|
||
|
set_rom_select(1);
|
||
|
set_ram_select(2);
|
||
|
|
||
|
init_printf(0, char_out);
|
||
| ... | ... | |
|
init_drive_emulator();
|
||
|
|
||
|
|
||
|
struct SimpleDirEntry * entries = dir_entries("/system/rom/atari800");
|
||
|
struct SimpleDirEntry * entries = dir_entries(ROM_DIR);
|
||
|
|
||
|
loadrom_indir(entries,"xlorig.rom",0x4000, (void *)0x704000);
|
||
|
loadrom_indir(entries,"xlhias.rom",0x4000, (void *)0x708000);
|
||
|
//loadrom_indir(entries,"atarixl.rom",0x4000, (void *)0x704000);
|
||
|
if (SimpleFile_OK == file_open_name_in_dir(entries, "atarixl.rom", files[5]))
|
||
|
{
|
||
|
loadosrom();
|
||
|
}
|
||
|
|
||
|
/*loadrom_indir(entries,"xlhias.rom",0x4000, (void *)0x708000);
|
||
|
loadrom_indir(entries,"ultimon.rom",0x4000, (void *)0x70c000);
|
||
|
loadrom_indir(entries,"osbhias.rom",0x4000, (void *)0x710000);
|
||
|
loadrom_indir(entries,"osborig.rom",0x2800, (void *)0x715800);
|
||
|
loadrom_indir(entries,"osaorig.rom",0x2800, (void *)0x719800);
|
||
|
loadrom_indir(entries,"osaorig.rom",0x2800, (void *)0x719800);*/
|
||
|
|
||
|
loadrom_indir(entries,"ataribas.rom",0x2000,(void *)0x700000);
|
||
|
|
||
| ... | ... | |
|
printf("Ram:%s", get_ram());
|
||
|
debug_pos = 160;
|
||
|
debug_adjust = row==2 ? 128 : 0;
|
||
|
printf("Rom bank:%d", get_rom_select());
|
||
|
{
|
||
|
printf("Rom:%s", file_name(files[5]));
|
||
|
}
|
||
|
debug_pos = 240;
|
||
|
int i;
|
||
|
for (i=1;i!=5;++i)
|
||
| ... | ... | |
|
break;
|
||
|
case 2:
|
||
|
{
|
||
|
int rom_select = get_rom_select();
|
||
|
rom_select+=joy.x_;
|
||
|
if (rom_select<1) rom_select = 1;
|
||
|
if (rom_select>6) rom_select = 6; // TODO
|
||
|
set_rom_select(rom_select);
|
||
|
if (joy.x_ || joy.fire_)
|
||
|
{
|
||
|
filter = filter_roms;
|
||
|
file_selector(files[5]);
|
||
|
loadosrom();
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
case 3:
|
||
| ... | ... | |
|
}
|
||
|
else if (joy.fire_)
|
||
|
{
|
||
|
struct SimpleFile * temp;
|
||
|
temp = files[0];
|
||
|
files[0] = files[row-3];
|
||
|
files[row-3] = temp;
|
||
|
set_drive_status(row-3,temp);
|
||
|
set_drive_status(0,files[0]);
|
||
|
{
|
||
|
// Swap files
|
||
|
struct SimpleFile * temp = files[row-3];
|
||
|
files[row-3] = files[0];
|
||
|
files[0] = temp;
|
||
|
}
|
||
|
|
||
|
{
|
||
|
// Swap disks
|
||
|
struct SimpleFile * temp = get_drive_status(row-3);
|
||
|
set_drive_status(row-3, get_drive_status(0));
|
||
|
set_drive_status(0,temp);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
| firmware/mcc/dirs.c | ||
|---|---|---|
|
char USER_DIR[]="/atari800/user";
|
||
|
char ROM_DIR[]="/system/rom/atari800";
|
||
| firmware/mist/dirs.c | ||
|---|---|---|
|
char USER_DIR[]="/atari800/user";
|
||
|
char ROM_DIR[]="/atari800/rom";
|
||
| firmware/mist/diskio_sectorrequest.c | ||
|---|---|---|
|
#include "diskio.h"
|
||
|
|
||
|
#include "regs.h"
|
||
|
|
||
|
#include "printf.h"
|
||
|
extern int debug_pos;
|
||
|
|
||
|
void mmcReadCached(u32 sector);
|
||
|
u32 n_actual_mmc_sector;
|
||
|
unsigned char * mmc_sector_buffer;
|
||
|
|
||
|
void mmcReadCached(u32 sector)
|
||
|
{
|
||
|
//debug("mmcReadCached");
|
||
|
//plotnext(toatarichar(' '));
|
||
|
//plotnextnumber(sector);
|
||
|
//debug("\n");
|
||
|
if(sector==n_actual_mmc_sector) return;
|
||
|
//debug("mmcReadREAL");
|
||
|
//plotnext(toatarichar(' '));
|
||
|
//plotnextnumber(sector);
|
||
|
//debug("\n");
|
||
|
|
||
|
//u08 ret,retry;
|
||
|
//predtim nez nacte jiny, musi ulozit soucasny
|
||
|
// TODO mmcWriteCachedFlush();
|
||
|
//az ted nacte novy
|
||
|
//retry=0; //zkusi to maximalne 256x
|
||
|
/*do
|
||
|
{
|
||
|
ret = mmcRead(sector); //vraci 0 kdyz ok
|
||
|
retry--;
|
||
|
} while (ret && retry);
|
||
|
while(ret); //a pokud se vubec nepovedlo, tady zustane zablokovany cely SDrive!
|
||
|
*/
|
||
|
|
||
|
//printf("Reading sector:%d", sector);
|
||
|
*zpu_out4 = sector|0x01000000;
|
||
|
while (!*zpu_in4)
|
||
|
{
|
||
|
// Wait until ready
|
||
|
}
|
||
|
*zpu_out4 = 0;
|
||
|
//printf(" RD1 ");
|
||
|
while (*zpu_in4)
|
||
|
{
|
||
|
// Wait until ready cleared
|
||
|
}
|
||
|
|
||
|
//printf(" RD2 ");
|
||
|
|
||
|
n_actual_mmc_sector=sector;
|
||
|
}
|
||
|
|
||
|
|
||
|
/*-----------------------------------------------------------------------*/
|
||
|
/* Initialize Disk Drive */
|
||
|
/*-----------------------------------------------------------------------*/
|
||
|
|
||
|
DSTATUS disk_initialize (void)
|
||
|
{
|
||
|
DSTATUS stat;
|
||
|
|
||
|
n_actual_mmc_sector = 0xffffffff;
|
||
|
//do
|
||
|
//{
|
||
|
// mmcInit();
|
||
|
//}
|
||
|
//while(mmcReset()); //dokud nenulove, tak smycka (return 0 => ok!)
|
||
|
|
||
|
//set_spi_clock_freq();
|
||
|
|
||
|
// no longer in ram (yet!), misuse will break us...
|
||
|
mmc_sector_buffer = (unsigned char *)0x4000; // 512 bytes in the middle of memory space!
|
||
|
|
||
|
stat = RES_OK;
|
||
|
|
||
|
return stat;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
/*-----------------------------------------------------------------------*/
|
||
|
/* Read Partial Sector */
|
||
|
/*-----------------------------------------------------------------------*/
|
||
|
|
||
|
DRESULT disk_readp (
|
||
|
BYTE* dest, /* Pointer to the destination object */
|
||
|
DWORD sector, /* Sector number (LBA) */
|
||
|
WORD sofs, /* Offset in the sector */
|
||
|
WORD count /* Byte count (bit15:destination) */
|
||
|
)
|
||
|
{
|
||
|
DRESULT res;
|
||
|
|
||
|
/*debug("readp:");
|
||
|
plotnextnumber(sector);
|
||
|
debug(" ");
|
||
|
plotnextnumber((int)dest);
|
||
|
debug(" ");
|
||
|
plotnextnumber(sofs);
|
||
|
debug(" ");
|
||
|
plotnextnumber(count);
|
||
|
debug(" ");
|
||
|
plotnextnumber(atari_sector_buffer);
|
||
|
debug(" ");
|
||
|
plotnextnumber(mmc_sector_buffer);
|
||
|
debug("\n");
|
||
|
*/
|
||
|
// Put your code here
|
||
|
mmcReadCached(sector);
|
||
|
for(;count>0;++sofs,--count)
|
||
|
{
|
||
|
unsigned char x = mmc_sector_buffer[sofs];
|
||
|
//printf("char:%02x loc:%d", x,sofs);
|
||
|
*dest++ = x;
|
||
|
}
|
||
|
|
||
|
res = RES_OK;
|
||
|
|
||
|
return res;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
/*-----------------------------------------------------------------------*/
|
||
|
/* Write Partial Sector */
|
||
|
/*-----------------------------------------------------------------------*/
|
||
|
|
||
|
DRESULT disk_writep (const BYTE* buff, DWORD sofs, DWORD count)
|
||
|
{
|
||
|
DRESULT res;
|
||
|
|
||
|
int i=sofs;
|
||
|
int end=sofs+count;
|
||
|
int pos = 0;
|
||
|
|
||
|
/* debug_pos = 0;
|
||
|
printf("WP:%x %d %d"),buff,sofs,count;
|
||
|
debug_pos = -1;*/
|
||
|
|
||
|
for (;i!=end;++i,++pos)
|
||
|
{
|
||
|
unsigned char temp = buff[pos];
|
||
|
|
||
|
unsigned int volatile* addr = (unsigned int volatile *)&mmc_sector_buffer[i&~3];
|
||
|
unsigned int prev = *(unsigned int volatile*)addr;
|
||
|
((char unsigned *)&prev)[i&3] = temp;
|
||
|
*addr = prev;
|
||
|
|
||
|
//mmc_sector_buffer[i] = buff[pos];
|
||
|
//printf("char:%c loc:%d,", buff[pos],i);
|
||
|
}
|
||
|
|
||
|
/* debug_pos = 40;
|
||
|
printf("WP DONE:%x %d %d"),buff,sofs,count;
|
||
|
debug_pos = -1;*/
|
||
|
|
||
|
res = RES_OK;
|
||
|
|
||
|
return res;
|
||
|
}
|
||
|
|
||
|
void disk_writeflush()
|
||
|
{
|
||
|
/* // Finalize write process
|
||
|
int retry=16; //zkusi to maximalne 16x
|
||
|
int ret;
|
||
|
//printf(":WSECT:%d",n_actual_mmc_sector);
|
||
|
do
|
||
|
{
|
||
|
ret = mmcWrite(n_actual_mmc_sector); //vraci 0 kdyz ok
|
||
|
retry--;
|
||
|
} while (ret && retry);
|
||
|
//printf(":WD:");
|
||
|
*/
|
||
|
|
||
|
/*debug_pos = 0;
|
||
|
printf("WF");
|
||
|
debug_pos = -1;*/
|
||
|
|
||
|
//printf(" WTF:%d:%x ", n_actual_mmc_sector, ((unsigned int *)mmc_sector_buffer)[0]);
|
||
|
|
||
|
*zpu_out4 = n_actual_mmc_sector|0x02000000;
|
||
|
while (!*zpu_in4)
|
||
|
{
|
||
|
// Wait until ready
|
||
|
}
|
||
|
*zpu_out4 = 0;
|
||
|
//printf(" PT1 ");
|
||
|
while (*zpu_in4)
|
||
|
{
|
||
|
// Wait until ready cleared
|
||
|
}
|
||
|
|
||
|
//printf(" PT2 ");
|
||
|
|
||
|
/*debug_pos = 40;
|
||
|
printf("DONE");
|
||
|
debug_pos = -1;*/
|
||
|
}
|
||
|
|
||
| firmware/native/screen.c | ||
|---|---|---|
|
void clearscreen()
|
||
|
{
|
||
|
}
|
||
|
|
||
| firmware/test_drive.c | ||
|---|---|---|
|
putc(c, stderr);
|
||
|
}
|
||
|
|
||
|
struct SimpleFile * files[5];
|
||
|
|
||
|
int main(void)
|
||
|
{
|
||
|
init_printf(NULL, char_out);
|
||
| ... | ... | |
|
entry = dir_entries("");
|
||
|
entry = dir_next(dir_next(dir_next(entry)));
|
||
|
fprintf(stderr, " Name:%s", dir_filename(entry));
|
||
|
struct SimpleFile * file = alloca(file_struct_size());
|
||
|
int i;
|
||
|
for (i=0;i!=5;++i)
|
||
|
{
|
||
|
struct SimpleFile * file = alloca(file_struct_size());
|
||
|
file_init(file);
|
||
|
files[i] = file;
|
||
|
}
|
||
|
//file_open_dir(entry,file);
|
||
|
file_open_name("GUNPOWDR.ATR",file);
|
||
|
if (SimpleFile_OK == file_open_name("GUNPOWDR.ATR",files[0]))
|
||
|
{
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
fprintf(stderr,"\nARG\n");
|
||
|
}
|
||
|
|
||
|
int read = 0;
|
||
|
char buffer[1024];
|
||
|
//file_seek(file,100);
|
||
|
file_read(file,&buffer[0],1024,&read);
|
||
|
int i;
|
||
|
file_read(files[0],&buffer[0],1024,&read);
|
||
|
for (i=0; i!=read; ++i)
|
||
|
{
|
||
|
fprintf(stderr,"|%02x", (unsigned char)buffer[i]);
|
||
| ... | ... | |
|
|
||
|
init_drive_emulator();
|
||
|
|
||
|
set_drive_status(0,file);
|
||
|
//set_drive_status(0,files[0]);
|
||
|
for (i=1;i!=5;++i)
|
||
|
{
|
||
|
char buffer[20];
|
||
|
describe_disk(i-1,&buffer[0]);
|
||
|
fprintf(stderr, "Drive %d:%s %s\n", i, file_name(get_file_status(i-1)), &buffer[0]);
|
||
|
}
|
||
|
|
||
|
int row = 6;
|
||
|
{
|
||
|
// Swap files
|
||
|
struct SimpleFile * temp = files[row-3];
|
||
|
files[row-3] = files[0];
|
||
|
files[0] = temp;
|
||
|
}
|
||
|
|
||
|
{
|
||
|
// Swap disks
|
||
|
struct SimpleFile * temp = get_drive_status(row-3);
|
||
|
set_drive_status(row-3, get_drive_status(0));
|
||
|
set_drive_status(0,temp);
|
||
|
}
|
||
|
for (i=1;i!=5;++i)
|
||
|
{
|
||
|
char buffer[20];
|
||
|
describe_disk(i-1,&buffer[0]);
|
||
|
fprintf(stderr, "Drive %d:%s %s\n", i, file_name(get_file_status(i-1)), &buffer[0]);
|
||
|
}
|
||
|
|
||
|
start_time = now();
|
||
|
run_drive_emulator();
|
||
|
|
||
Mist read/write support added/debugged. Single OS ROM + file selector. Fix bug when using "move to drive 1" which reinstated empty drives! Never access Atari system while reset.