/* * AppleCommander - An Apple ][ image utility. * Copyright (C) 2002-2022 by Robert Greene * robgreene at users.sourceforge.net * * 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. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package com.webcodepro.applecommander.storage.os.dos33; import com.webcodepro.applecommander.storage.StorageBundle; import com.webcodepro.applecommander.storage.physical.ImageOrder; import com.webcodepro.applecommander.util.TextBundle; /** * Manages a disk that is in UniDOS format. * This is basically DOS 3.3 except that the disk has two volumes of * each 400K. *
* Created on Dec 13, 2002. * @author Rob */ public class UniDosFormatDisk extends DosFormatDisk { private TextBundle textBundle = StorageBundle.getInstance(); /** * Use this indicator to work with logical disk #1. * It is essentially the track offset into the disk image. */ public static final int UNIDOS_DISK_1 = 0; /** * Use this indicator to work with logical disk #2. * It is essentially the track offset into the disk image. */ public static final int UNIDOS_DISK_2 = 50; /** * Indicates which logical disk to work with (by offset * into the disk image itself). */ private int logicalOffset; /** * Constructor for UniDosFormatDisk. */ public UniDosFormatDisk(String filename, ImageOrder imageOrder, int logicalOffset) { super(filename, imageOrder); this.logicalOffset = logicalOffset; } /** * Create a UniDosFormatDisk. */ public static DosFormatDisk[] create(String filename, ImageOrder imageOrder) { UniDosFormatDisk disk1 = new UniDosFormatDisk(filename, imageOrder, UNIDOS_DISK_1); UniDosFormatDisk disk2 = new UniDosFormatDisk(filename, imageOrder, UNIDOS_DISK_2); disk1.format(); disk2.format(); return new UniDosFormatDisk[] { disk1, disk2 }; } /** * Answer with the name of this disk. * @see com.webcodepro.applecommander.storage.FormattedDisk#getDiskName() */ public String getDiskName() { if (logicalOffset == UNIDOS_DISK_1) { return textBundle.format("DiskNameN", super.getDiskName(), 1); //$NON-NLS-1$ } else if (logicalOffset == UNIDOS_DISK_2) { return textBundle.format("DiskNameN", super.getDiskName(), 2); //$NON-NLS-1$ } else { return super.getDiskName(); } } /** * Returns the logical disk number. This can be used to identify * between disks when a format supports multiple logical volumes. */ public int getLogicalDiskNumber() { if (logicalOffset == UNIDOS_DISK_1) { return 1; } else if (logicalOffset == UNIDOS_DISK_2) { return 2; } else { return 0; } } /** * Format the disk as UniDOS. * @see com.webcodepro.applecommander.storage.FormattedDisk#format() */ public void format() { final int tracksPerDisk = 50; final int sectorsPerTrack = 32; final int firstCatalogSector = 31; // We can't use the ImageLayout to format this disk since that actually wipes the entire // 800K volume (that is, both disk1 and disk2 get cleared). byte[] data = new byte[SECTOR_SIZE]; for (int t = 0; t < tracksPerDisk; t++) { for (int s = 0; s < sectorsPerTrack; s++) { writeSector(t, s, data); } } // Lay down the catalog track... format(firstCatalogSector, tracksPerDisk, sectorsPerTrack); } /** * Retrieve the specified sector. */ public byte[] readSector(int track, int sector) throws IllegalArgumentException { return getImageOrder().readSector(track+logicalOffset, sector); } /** * Write the specified sector. */ public void writeSector(int track, int sector, byte[] bytes) throws IllegalArgumentException { getImageOrder().writeSector(track+logicalOffset, sector, bytes); } }