SCMedia.java
     1: //========================================================================================
     2: //  SCMedia.java
     3: //    en:SCSI hard disk media
     4: //    ja:SCSIハードディスクメディア
     5: //  Copyright (C) 2003-2019 Makoto Kamada
     6: //
     7: //  This file is part of the XEiJ (X68000 Emulator in Java).
     8: //  You can use, modify and redistribute the XEiJ if the conditions are met.
     9: //  Read the XEiJ License for more details.
    10: //  https://stdkmd.net/xeij/
    11: //========================================================================================
    12: 
    13: //----------------------------------------------------------------------------------------
    14: //  SCSIハードディスクのメディアの種類
    15: //----------------------------------------------------------------------------------------
    16: 
    17: package xeij;
    18: 
    19: import java.lang.*;  //Boolean,Character,Class,Comparable,Double,Exception,Float,IllegalArgumentException,Integer,Long,Math,Number,Object,Runnable,SecurityException,String,StringBuilder,System
    20: import java.util.*;  //ArrayList,Arrays,Calendar,GregorianCalendar,HashMap,Map,Map.Entry,Timer,TimerTask,TreeMap
    21: 
    22: public class SCMedia extends HumanMedia {
    23: 
    24:   public int scmBytesShiftRecord;  //1レコードあたりのバイト数のシフトカウント
    25:   public int scmBytesPerRecord;  //1レコードあたりのバイト数(2の累乗)
    26:   public int scmDiskEndRecord;  //ディスクのレコード数
    27:   public int scmPartitionStartSector;  //ディスクの先頭からパーティションの先頭までのセクタ数
    28:   public int scmDiskEndSector;  //ディスクのセクタ数
    29: 
    30:   public SCMedia (int bytesPerRecord, int diskEndRecord) {
    31:     super (1024,  //bytesPerSector
    32:            -1,    //sectorsPerCluster
    33:            2,     //fatCount
    34:            1,     //reservedSectors
    35:            512,   //rootEntries
    36:            0xf7,  //mediaByte
    37:            0xf7,  //fatID
    38:            -1,    //fatSectors
    39:            (long) bytesPerRecord * diskEndRecord,   //diskEndByte
    40:            32768L,                                  //partitionStartByte
    41:            (long) bytesPerRecord * diskEndRecord);  //partitionEndByte
    42:     scmBytesShiftRecord = Integer.numberOfTrailingZeros (bytesPerRecord);  //1レコードあたりのバイト数のシフトカウント
    43:     scmBytesPerRecord = 1 << scmBytesShiftRecord;  //1レコードあたりのバイト数(2の累乗)
    44:     scmDiskEndRecord = diskEndRecord;  //ディスクのレコード数
    45:     scmPartitionStartSector = (int) (humPartitionStartByte >> humBytesShiftSector);  //ディスクの先頭からパーティションの先頭までのセクタ数
    46:     scmDiskEndSector = (int) (humDiskEndByte >> humBytesShiftSector);  //ディスクのセクタ数
    47:   }  //new SCMedia()
    48: 
    49:   //success = media.scmMakeFormatData (bb, partitioningOn, copySystemFiles)
    50:   //  SCSIディスクのフォーマットデータを作る
    51:   public boolean scmMakeFormatData (byte[] bb, boolean partitioningOn, boolean copyHumanSysOn, boolean copyCommandXOn) {
    52:     Arrays.fill (bb, (byte) 0);
    53:     //SCSIディスクIDを作る
    54:     System.arraycopy (SPC.SPC_DISK_ID_1, 0, bb, 0x00000000, SPC.SPC_DISK_ID_1.length);
    55:     ByteArray.byaWw (bb, 0x00000008, scmBytesPerRecord);  //1レコードあたりのバイト数(2の累乗)
    56:     ByteArray.byaWl (bb, 0x0000000a, scmDiskEndRecord);  //ディスクのレコード数
    57:     ByteArray.byaWw (bb, 0x0000000e, 0x0100);
    58:     System.arraycopy (SPC.SPC_DISK_ID_2, 0, bb, 0x00000010, SPC.SPC_DISK_ID_2.length);
    59:     //SCSIディスクIPLを書き込む
    60:     System.arraycopy (SPC.SPC_DISK_IPL, 0, bb, 0x00000400, SPC.SPC_DISK_IPL.length);
    61:     //パーティションテーブルを作る
    62:     ByteArray.byaWl (bb, 0x00000800, 'X' << 24 | '6' << 16 | '8' << 8 | 'K');  //X68Kマジック
    63:     if (partitioningOn) {
    64:       ByteArray.byaWl (bb, 0x00000804, scmDiskEndSector);  //ディスクの先頭から確保されている最後のパーティションの末尾までのセクタ数
    65:     } else {
    66:       ByteArray.byaWl (bb, 0x00000804, scmPartitionStartSector);  //ディスクの先頭から確保されている最後のパーティションの末尾までのセクタ数
    67:     }
    68:     ByteArray.byaWl (bb, 0x00000808, scmDiskEndSector);  //ディスクのセクタ数
    69:     ByteArray.byaWl (bb, 0x0000080c, scmDiskEndSector);  //ディスクのセクタ数
    70:     if (partitioningOn) {
    71:       ByteArray.byaWl (bb, 0x00000810, 'H' << 24 | 'u' << 16 | 'm' << 8 | 'a');  //Humaマジック
    72:       ByteArray.byaWl (bb, 0x00000814, 'n' << 24 | '6' << 16 | '8' << 8 | 'k');  //n68kマジック
    73:       ByteArray.byaWl (bb, 0x00000818, scmPartitionStartSector);  //(0=自動起動,1=使用不可,2=使用可能)<<24|ディスクの先頭からパーティションの先頭までのセクタ数
    74:       ByteArray.byaWl (bb, 0x0000081c, humPartitionSectors);  //パーティションのセクタ数
    75:     }
    76:     //SCSIデバイスドライバを書き込む
    77:     System.arraycopy (SPC.SPC_DEVICE_DRIVER, 0, bb, 0x00000c00, SPC.SPC_DEVICE_DRIVER.length);
    78:     if (partitioningOn) {
    79:       //SCSIパーティションIPLを書き込む
    80:       System.arraycopy (SPC.SPC_PARTITION_IPL, 0, bb, (int) humPartitionStartByte, SPC.SPC_PARTITION_IPL.length);
    81:       //SCSIパーティションIPLにBPBを埋め込む
    82:       ByteArray.byaWw (bb, (int) humPartitionStartByte + 0x12, humBytesPerSector);        //7bd4  0000.w  1セクタあたりのバイト数(2の累乗)
    83:       ByteArray.byaWb (bb, (int) humPartitionStartByte + 0x14, humSectorsPerCluster);     //7bd6  0002.b  1クラスタあたりのセクタ数(2の累乗)
    84:       ByteArray.byaWb (bb, (int) humPartitionStartByte + 0x15, humFatCount);              //7bd7  0003.b  FAT領域の個数
    85:       ByteArray.byaWw (bb, (int) humPartitionStartByte + 0x16, humReservedSectors);       //7bd8  0004.w  予約領域のセクタ数(FAT領域の先頭セクタ番号)
    86:       ByteArray.byaWw (bb, (int) humPartitionStartByte + 0x18, humRootEntries);           //7bda  0006.w  ルートディレクトリに入るエントリ数
    87:       ByteArray.byaWw (bb, (int) humPartitionStartByte + 0x1a, 0);                        //7bdc  0008.w  全領域のセクタ数(0のとき000c.lを使う)
    88:       ByteArray.byaWb (bb, (int) humPartitionStartByte + 0x1c, humFatID);                 //7bde  000a.b  FATID
    89:       ByteArray.byaWb (bb, (int) humPartitionStartByte + 0x1d, humFatSectors);            //7bdf  000b.b  1個のFAT領域に使用するセクタ数
    90:       ByteArray.byaWl (bb, (int) humPartitionStartByte + 0x1e, humPartitionSectors);      //7be0  000c.l  パーティションのセクタ数
    91:       ByteArray.byaWl (bb, (int) humPartitionStartByte + 0x22, scmPartitionStartSector);  //7be4  0010.l  ディスクの先頭からパーティションの先頭までのセクタ数
    92:       //FAT領域の先頭にFATマーカーを書き込む
    93:       humWriteFatMarker (bb);
    94:       //システムファイルを転送する
    95:       //if (copySystemFiles) {
    96:       //  if (!humCopyHumanSys (bb) ||
    97:       //      !humCopyCommandX (bb)) {
    98:       //    return false;
    99:       //  }
   100:       //}
   101:       if (copyHumanSysOn) {
   102:         if (!humCopyHumanSys (bb)) {
   103:           return false;
   104:         }
   105:         if (copyCommandXOn) {
   106:           if (!humCopyCommandX (bb)) {
   107:             return false;
   108:           }
   109:         }
   110:       }
   111:       if (false) {
   112:         humDumpFat (bb);
   113:       }
   114:     }
   115:     return true;
   116:   }  //media.scmMakeFormatData(byte[],boolean,boolean)
   117: 
   118: }  //class SCMedia
   119: 
   120: 
   121: