// CMPS 320 Task 6: Disk Controller // // This Java solution corresponds to the behavior that your circuit should exhibit. There is no guarantee that it is correct in all cases, but it should provide at least some guidance // in addition to the task document. public class DiskController { public static void main(final String[] args) { System.out.println("CMPS 320 Task 6: Disk Controller\n"); new DiskController(); } private static final int ROM_SIZE = 2048; private final int[] _disk = new int[ROM_SIZE]; private int _headCurrent; private int _trackCurrent; private int _sectorCurrent; private int _byteCurrent; private int _clusterCurrent; private int _load; private int _address; private int _data; public DiskController() { reset(); load(); clock(); clock(); clock(); clock(); clock(); clock(); clock(); clock(); clock(); clock(); clock(); clock(); clock(); clock(); clock(); clock(); } private void reset() { for (int iMemory = 0; iMemory < ROM_SIZE; ++iMemory) { _disk[iMemory] = 0xFF; } // program 1: head=0 track=0 sector=0 _disk[0] = 65; _disk[1] = 66; _disk[2] = 67; _disk[3] = 68; _disk[4] = 69; _disk[5] = 70; _disk[6] = 71; _disk[7] = 0xFF; // program 2(a): head=1 track=0 sector=0 _disk[0 + 16] = 65; _disk[1 + 16] = 66; _disk[2 + 16] = 67; _disk[3 + 16] = 68; _disk[4 + 16] = 69; _disk[5 + 16] = 70; _disk[6 + 16] = 71; _disk[7 + 16] = 0x02; // program 2(b): head=2 track=0 sector=0 _disk[0 + 32] = 72; _disk[1 + 32] = 73; _disk[2 + 32] = 74; _disk[3 + 32] = 75; _disk[4 + 32] = 76; _disk[5 + 32] = 77; _disk[6 + 32] = 78; _disk[7 + 32] = 0xFF; } private void load() { _headCurrent = 1; _trackCurrent = 0; _sectorCurrent = 0; } private void clock() { _clusterCurrent = ((_sectorCurrent << 5) | (_trackCurrent << 3) | _headCurrent); _address = ((_clusterCurrent << 4) | _byteCurrent); _data = _disk[_address]; ++_byteCurrent; if (_byteCurrent == 8) { _headCurrent = (_data & 0x03); _trackCurrent = (_data & 0x1C); _sectorCurrent = (_data & 0xE0); _byteCurrent = 0; if (_data == 0xFF) { System.out.println("done"); System.exit(0); } } else { output(); } } private void output() { System.out.println("current: cluster=" + _clusterCurrent + " head=" + _headCurrent + " track=" + _trackCurrent + " sector=" + _sectorCurrent + " byte=" + _byteCurrent + " address=" + _address + " data=" + _data + "/" + (char) _data); } }