aboutsummaryrefslogtreecommitdiff
path: root/SrcShared/Hardware/TRG/EmTRGCFIO.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'SrcShared/Hardware/TRG/EmTRGCFIO.cpp')
-rw-r--r--SrcShared/Hardware/TRG/EmTRGCFIO.cpp236
1 files changed, 236 insertions, 0 deletions
diff --git a/SrcShared/Hardware/TRG/EmTRGCFIO.cpp b/SrcShared/Hardware/TRG/EmTRGCFIO.cpp
new file mode 100644
index 0000000..d1ec47e
--- /dev/null
+++ b/SrcShared/Hardware/TRG/EmTRGCFIO.cpp
@@ -0,0 +1,236 @@
+/* -*- mode: C++; tab-width: 4 -*- */
+/* ===================================================================== *\
+ Copyright (c) 2000-2001 Palm, Inc. or its subsidiaries.
+ All rights reserved.
+
+ This file is part of the Palm OS Emulator.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+\* ===================================================================== */
+
+#include "EmCommon.h"
+#include "EmTRGCFIO.h"
+
+
+//-------------------------------------------------------------------------
+// This file implements card I/O emulation by performing read and write
+// operations on a file on the PC. Note that this file doesn't know
+// anything about ATA registers ... it's more of a state machine for
+// a continuous series of reads and writes
+//
+// These functions will create a disk file on the PC ... if one doesn't
+// exist, it will create it in a formatted state.
+//
+// The code should work even if the disk file is replaced by an image
+// from a real card ... there is no additional info stored with the card
+// however, the tuple info won't agree with the card
+//---------------------------------------------------------------------------
+
+// ---------------------------------------------------------------------------
+// ¥ EmCFIO::EmCFIO
+// ---------------------------------------------------------------------------
+EmCFIO::EmCFIO (void)
+{
+}
+
+// ---------------------------------------------------------------------------
+// ¥ EmCFIO::~EmCFIO
+// ---------------------------------------------------------------------------
+EmCFIO::~EmCFIO (void)
+{
+}
+
+// ---------------------------------------------------------------------------
+// ¥ EmCFIO::~EmCFIO
+// ---------------------------------------------------------------------------
+void EmCFIO::Reset(void)
+{
+ State.NumSectorsRequested = 0;
+ State.NumSectorsCompleted = 0;
+ State.SectorIndex = 0;
+ State.Status = DIO_SUCCESS;
+ State.Error = 0;
+}
+
+// ---------------------------------------------------------------------------
+// ¥ EmCFIO::Initialize
+// ---------------------------------------------------------------------------
+void EmCFIO::Initialize (EmDiskTypeID ID)
+{
+ DiskTypeID = ID;
+ DiskIO.Initialize(ID, CF_DRIVE);
+ Reset();
+}
+
+// ---------------------------------------------------------------------------
+// ¥ EmCFIO::Dispose
+// ---------------------------------------------------------------------------
+void EmCFIO::Dispose (void)
+{
+ DiskIO.Dispose();
+}
+
+
+// ---------------------------------------------------------------------------
+// ¥ EmCFIO::ReadSector
+// ---------------------------------------------------------------------------
+DiskIOStatus EmCFIO::ReadSector(void)
+{
+ if ((DiskIO.ReadSector(State.Lba, (char *)State.Sector.Bytes)) != 0)
+ return DIO_ERROR;
+
+ return DIO_SUCCESS;
+}
+
+// ---------------------------------------------------------------------------
+// ¥ EmCFIO::WriteSector
+// ---------------------------------------------------------------------------
+DiskIOStatus EmCFIO::WriteSector(void)
+{
+ if ((DiskIO.WriteSector(State.Lba, (char *)State.Sector.Bytes)) != 0)
+ return DIO_ERROR;
+
+ return DIO_SUCCESS;
+}
+
+// ---------------------------------------------------------------------------
+// ¥ EmCFIO::ReadNextDataByte
+// ---------------------------------------------------------------------------
+void EmCFIO::ReadNextDataByte(uint8 * val)
+{
+ // this first statement will likely not be called except when someone's
+ // dumping memory at our address range
+ if (State.NumSectorsCompleted >= State.NumSectorsRequested)
+ *val = 0;
+ else
+ {
+ *val = State.Sector.Bytes[State.SectorIndex++];
+ if (State.SectorIndex >= SECTOR_SIZE)
+ {
+ if (++State.NumSectorsCompleted < State.NumSectorsRequested)
+ {
+ State.Lba++;
+ State.SectorIndex = 0;
+ State.Status = ReadSector();
+ }
+ }
+ }
+ if (State.Status != DIO_SUCCESS)
+ State.Error = IDE_ERR_01_GENERAL_ERROR;
+}
+
+// ---------------------------------------------------------------------------
+// ¥ EmCFIO::WriteNextDataByte
+// ---------------------------------------------------------------------------
+void EmCFIO::WriteNextDataByte(uint8 val)
+{
+ State.Status = DIO_SUCCESS;
+ if (State.NumSectorsCompleted < State.NumSectorsRequested)
+ {
+ State.Sector.Bytes[State.SectorIndex++] = val;
+ if (State.SectorIndex >= SECTOR_SIZE)
+ {
+ if (WriteSector() == DIO_ERROR)
+ State.Status = DIO_ERROR;
+ else if (++State.NumSectorsCompleted < State.NumSectorsRequested)
+ {
+ State.Status = DIO_SUCCESS;
+ State.Lba++;
+ State.SectorIndex = 0;
+ }
+ }
+ }
+ if (State.Status != DIO_SUCCESS)
+ State.Error = IDE_ERR_01_GENERAL_ERROR;
+}
+
+// ---------------------------------------------------------------------------
+// ¥ EmCFIO::GetSectorCount
+// ---------------------------------------------------------------------------
+uint32 EmCFIO::GetSectorCount(void)
+{
+ return State.NumSectorsCompleted;
+}
+
+// ---------------------------------------------------------------------------
+// ¥ EmCFIO::StartDriveID
+// ---------------------------------------------------------------------------
+void EmCFIO::StartDriveID(void)
+{
+ CurrDisk.GetDriveID(DiskTypeID,
+ &State.Sector);
+ State.NumSectorsRequested = 1;
+ State.NumSectorsCompleted = 0;
+ State.SectorIndex = 0;
+ State.Status = DIO_SUCCESS;
+ State.Error = 0;
+}
+
+// ---------------------------------------------------------------------------
+// ¥ EmCFIO::StartRead
+// ---------------------------------------------------------------------------
+void EmCFIO::StartRead(DiskIOParams * params)
+{
+ State.Lba = params->Lba;
+ State.NumSectorsRequested = params->SectorCnt;
+ State.NumSectorsCompleted = 0;
+ State.SectorIndex = 0;
+ State.Error = 0;
+ State.Status = ReadSector();
+}
+
+// ---------------------------------------------------------------------------
+// ¥ EmCFIO::StartWrite
+// ---------------------------------------------------------------------------
+void EmCFIO::StartWrite(DiskIOParams * params)
+{
+ State.Lba = params->Lba;
+ State.NumSectorsRequested = params->SectorCnt;
+ State.NumSectorsCompleted = 0;
+ State.SectorIndex = 0;
+ State.Status = DIO_SUCCESS;
+ State.Error = 0;
+}
+
+// ---------------------------------------------------------------------------
+// ¥ EmCFIO::GetStatus
+// ---------------------------------------------------------------------------
+void EmCFIO::GetStatus(DiskIOStatus * status,
+ DiskDataStatus * dataStatus)
+{
+ *status = State.Status;
+ if (State.NumSectorsCompleted == State.NumSectorsRequested)
+ *dataStatus = DIO_DATA_COMPLETE;
+ else
+ *dataStatus = DIO_MORE_DATA;
+}
+
+// ---------------------------------------------------------------------------
+// ¥ EmCFIO::GetError
+// ---------------------------------------------------------------------------
+DiskIOError EmCFIO::GetError(void)
+{
+ if (State.Status == DIO_SUCCESS)
+ return(0);
+ else
+ // at this point, all errors are pretty much the same ... we can't
+ // create our emulation file ... we probably will need to include
+ // some more refined error codes at some point
+ return(State.Error);
+}
+
+
+void EmCFIO::SetError(DiskIOError error)
+{
+ State.Status = DIO_ERROR;
+ State.Error = error;
+}
+
+void EmCFIO::ClearError(void)
+{
+ State.Status = DIO_SUCCESS;
+ State.Error = 0;
+}