From 99ba0525972fdf8909dc65a44303a8ef4713983e Mon Sep 17 00:00:00 2001 From: Ian Flanigan Date: Mon, 20 Jun 2022 04:52:06 +0200 Subject: [PATCH] Add tests for WOZ disks (#136) * Add a test for the dirty callback on writes This new test just checks that a clean disk becomes dirty after a write _and_ that the dirty callback is fired. * Add tests for WOZ disks The new tests verify the basic read behavior of the state sequencer on well-behaved disks, including sync bytes and so on. Write tests are still to come. There's also a change to the Woz format to return the info chunk data as well. --- js/cards/disk2.ts | 30 ++- js/formats/types.ts | 2 + js/formats/woz.ts | 8 +- test/js/cards/data/DOS 3.3 System Master.woz | Bin 0 -> 234496 bytes test/js/cards/disk2.spec.ts | 195 +++++++++++++++++++ test/js/formats/woz.spec.ts | 16 +- 6 files changed, 229 insertions(+), 22 deletions(-) create mode 100644 test/js/cards/data/DOS 3.3 System Master.woz diff --git a/js/cards/disk2.ts b/js/cards/disk2.ts index d17a19b..9b58473 100644 --- a/js/cards/disk2.ts +++ b/js/cards/disk2.ts @@ -1,4 +1,4 @@ -import { base64_encode} from '../base64'; +import { base64_encode } from '../base64'; import type { byte, Card, @@ -28,7 +28,7 @@ import { createDiskFromJsonDisk } from '../formats/create_disk'; -import { debug, toHex } from '../util'; +import { toHex } from '../util'; import { jsonDecode, jsonEncode, readSector } from '../formats/format_utils'; import { BOOTSTRAP_ROM_16, BOOTSTRAP_ROM_13 } from '../roms/cards/disk2'; @@ -201,7 +201,7 @@ interface NibbleDrive extends BaseDrive { type Drive = WozDrive | NibbleDrive; -function isNibbleDrive(drive: Drive): drive is NibbleDrive { +function isNibbleDrive(drive: Drive): drive is NibbleDrive { return drive.encoding === ENCODING_NIBBLE; } @@ -395,12 +395,18 @@ export default class DiskII implements Card { this.lastCycles = this.io.cycles(); this.bootstrapRom = this.sectors === 16 ? BOOTSTRAP_ROM_16 : BOOTSTRAP_ROM_13; this.sequencerRom = this.sectors === 16 ? SEQUENCER_ROM_16 : SEQUENCER_ROM_13; + // From the example in UtA2e, p. 9-29, col. 1, para. 1., this is + // essentially the start of the sequencer loop and produces + // correctly synced nibbles immediately. Starting at state 0 + // would introduce a spurrious 1 in the latch at the beginning, + // which requires reading several more sync bytes to sync up. + this.state = 2; this.initWorker(); } private debug(..._args: unknown[]) { - // debug.apply(this, arguments); + // debug(..._args); } // Only used for WOZ disks @@ -422,7 +428,7 @@ export default class DiskII implements Card { if (this.clock === 4) { pulse = track[this.cur.head]; if (!pulse) { - // More that 2 zeros can not be read reliably. + // More than 2 zeros can not be read reliably. if (++this.zeros > 2) { pulse = Math.random() >= 0.5 ? 1 : 0; } @@ -440,9 +446,7 @@ export default class DiskII implements Card { const command = this.sequencerRom[idx]; - if (this.on && this.q7) { - debug('clock:', this.clock, 'command:', toHex(command), 'q6:', this.q6); - } + this.debug(`clock: ${this.clock} state: ${toHex(this.state)} pulse: ${pulse} command: ${toHex(command)} q6: ${this.q6} latch: ${toHex(this.latch)}`); switch (command & 0xf) { case 0x0: // CLR @@ -461,11 +465,13 @@ export default class DiskII implements Card { break; case 0xB: // LD this.latch = this.bus; - debug('Loading', toHex(this.latch), 'from bus'); + this.debug('Loading', toHex(this.latch), 'from bus'); break; case 0xD: // SL1 this.latch = ((this.latch << 1) | 0x01) & 0xff; break; + default: + this.debug(`unknown command: ${toHex(command & 0xf)}`); } this.state = (command >> 4 & 0xF) as nibble; @@ -473,7 +479,7 @@ export default class DiskII implements Card { if (this.on) { if (this.q7) { track[this.cur.head] = this.state & 0x8 ? 0x01 : 0x00; - debug('Wrote', this.state & 0x8 ? 0x01 : 0x00); + this.debug('Wrote', this.state & 0x8 ? 0x01 : 0x00); } if (++this.cur.head >= track.length) { @@ -544,6 +550,10 @@ export default class DiskII implements Card { this.cur.phase = phase; } + // The emulator clamps the track to the valid track range available + // in the image, but real Disk II drives can seek past track 34 by + // at least a half track, usually a full track. Some 3rd party + // drives can seek to track 39. const maxTrack = isNibbleDrive(this.cur) ? this.cur.tracks.length * 4 - 1 : this.cur.trackMap.length - 1; diff --git a/js/formats/types.ts b/js/formats/types.ts index c52d484..80a7f73 100644 --- a/js/formats/types.ts +++ b/js/formats/types.ts @@ -1,5 +1,6 @@ import type { byte, memory, MemberOf, word } from '../types'; import type { GamepadConfiguration } from '../ui/types'; +import { InfoChunk } from './woz'; export const DRIVE_NUMBERS = [1, 2] as const; export type DriveNumber = MemberOf; @@ -70,6 +71,7 @@ export interface WozDisk extends FloppyDisk { encoding: typeof ENCODING_BITSTREAM; trackMap: number[]; rawTracks: Uint8Array[]; + info: InfoChunk | undefined; } export interface BlockDisk extends Disk { diff --git a/js/formats/woz.ts b/js/formats/woz.ts index 12eeb60..dd3b4a1 100644 --- a/js/formats/woz.ts +++ b/js/formats/woz.ts @@ -155,6 +155,9 @@ export class TrksChunk2 extends TrksChunk { const end = start + trk.blockCount * 512; const slice = bits.slice(start, end); const trackData = new Uint8Array(slice); + if (trackNo === 0) { + // debug(`First bytes: ${toHex(trackData[0])} ${toHex(trackData[1])} ${toHex(trackData[2])} ${toHex(trackData[3])}`); + } for (let jdx = 0; jdx < trk.bitCount; jdx++) { const byteIndex = jdx >> 3; const bitIndex = 7 - (jdx & 0x07); @@ -284,9 +287,9 @@ export default function createDiskFromWoz(options: DiskOptions): WozDisk { debug('Invalid woz header'); } - debug(chunks); + // debug(chunks); - const { meta, tmap, trks } = chunks; + const { meta, tmap, trks, info } = chunks; const disk: WozDisk = { encoding: ENCODING_BITSTREAM, @@ -296,6 +299,7 @@ export default function createDiskFromWoz(options: DiskOptions): WozDisk { readOnly: true, //chunks.info.writeProtected === 1; name: meta?.values['title'] || options.name, side: meta?.values['side_name'] || meta?.values['side'], + info }; return disk; diff --git a/test/js/cards/data/DOS 3.3 System Master.woz b/test/js/cards/data/DOS 3.3 System Master.woz new file mode 100644 index 0000000000000000000000000000000000000000..2f09782450a81844c33a5241c610a807aadd1321 GIT binary patch literal 234496 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 literal 0 HcmV?d00001 diff --git a/test/js/cards/disk2.spec.ts b/test/js/cards/disk2.spec.ts index d328483..62269b2 100644 --- a/test/js/cards/disk2.spec.ts +++ b/test/js/cards/disk2.spec.ts @@ -1,7 +1,10 @@ /** @jest-environment jsdom */ +import fs from 'fs'; + import Apple2IO from 'js/apple2io'; import DiskII, { Callbacks } from 'js/cards/disk2'; import CPU6502 from 'js/cpu6502'; +import { byte } from 'js/types'; import { VideoModes } from 'js/videomodes'; import { mocked } from 'ts-jest/utils'; import { BYTES_BY_SECTOR_IMAGE, BYTES_BY_TRACK_IMAGE } from '../formats/testdata/16sector'; @@ -248,6 +251,7 @@ describe('DiskII', () => { diskII.ioSwitch(0x83); // coil 1 on diskII.ioSwitch(0x80); // coil 0 off diskII.ioSwitch(0x85); // coil 2 on + diskII.ioSwitch(0x82); // coil 1 off diskII.ioSwitch(0x87); // coil 3 on diskII.ioSwitch(0x84); // coil 2 off diskII.ioSwitch(0x81); // coil 0 on @@ -499,5 +503,196 @@ describe('DiskII', () => { expect(track0[0]).toBe(0x80); expect(track0[1]).toBe(0x81); }); + + it('sets disk state to dirty and calls the dirty callback when written', () => { + const diskII = new DiskII(mockApple2IO, callbacks); + diskII.setBinary(1, 'BYTES_BY_TRACK', 'po', BYTES_BY_TRACK_IMAGE); + let state = diskII.getState(); + state.drives[0].dirty = false; + diskII.setState(state); + jest.resetAllMocks(); + + diskII.ioSwitch(0x89); // turn on the motor + diskII.ioSwitch(0x8F, 0x80); // write + diskII.ioSwitch(0x8C); // shift + + expect(callbacks.dirty).toHaveBeenCalledTimes(1); + expect(callbacks.dirty).toHaveBeenCalledWith(1, true); + + state = diskII.getState(); + expect(state.drives[0].dirty).toBeTruthy(); + }); + }); + + describe('reading WOZ-based disks', () => { + const DOS33_SYSTEM_MASTER_IMAGE = + fs.readFileSync('test/js/cards/data/DOS 3.3 System Master.woz').buffer; + + it('accepts WOZ-based disks', () => { + const diskII = new DiskII(mockApple2IO, callbacks); + diskII.setBinary(1, 'DOS 3.3 System Master', 'woz', DOS33_SYSTEM_MASTER_IMAGE); + + expect(true).toBeTruthy(); + }); + + it('stops the head at the end of the image', () => { + const diskII = new DiskII(mockApple2IO, callbacks); + diskII.setBinary(1, 'DOS 3.3 System Master', 'woz', DOS33_SYSTEM_MASTER_IMAGE); + setTrack(diskII, 33); + + diskII.ioSwitch(0x89); // turn on the motor + diskII.ioSwitch(0x85); // coil 2 on + for (let i = 0; i < 5; i++) { + diskII.ioSwitch(0x87); // coil 3 on + diskII.ioSwitch(0x84); // coil 2 off + diskII.ioSwitch(0x81); // coil 0 on + diskII.ioSwitch(0x86); // coil 3 off + diskII.ioSwitch(0x83); // coil 1 on + diskII.ioSwitch(0x80); // coil 0 off + diskII.ioSwitch(0x85); // coil 2 on + diskII.ioSwitch(0x82); // coil 1 off + } + diskII.ioSwitch(0x84); // coil 2 off + + const state = diskII.getState(); + expect(state.drives[0].phase).toBe(2); + // For WOZ images, the number of tracks is the number in the image. + // The DOS3.3 System Master was imaged on a 40 track drive, so it + // has data for all 40 tracks, even though the last few are garbage. + expect(state.drives[0].track).toBe(40 * STEPS_PER_TRACK - 1); + }); + + it('spins the disk when motor is on', () => { + let cycles: number = 0; + mocked(mockApple2IO).cycles.mockImplementation(() => cycles); + + const diskII = new DiskII(mockApple2IO, callbacks); + diskII.setBinary(1, 'DOS 3.3 System Master', 'woz', DOS33_SYSTEM_MASTER_IMAGE); + + let state = diskII.getState(); + expect(state.drives[0].head).toBe(0); + + diskII.ioSwitch(0x89); // turn on the motor + cycles += 10; + diskII.tick(); + + state = diskII.getState(); + expect(state.drives[0].head).toBeGreaterThan(0); + }); + + it('does not spin the disk when motor is off', () => { + let cycles: number = 0; + mocked(mockApple2IO).cycles.mockImplementation(() => cycles); + + const diskII = new DiskII(mockApple2IO, callbacks); + diskII.setBinary(1, 'DOS 3.3 System Master', 'woz', DOS33_SYSTEM_MASTER_IMAGE); + + let state = diskII.getState(); + expect(state.drives[0].head).toBe(0); + + cycles += 10; + diskII.tick(); + + state = diskII.getState(); + expect(state.drives[0].head).toBe(0); + }); + + it('reads an FF sync byte from the beginning of the image', () => { + let cycles: number = 0; + mocked(mockApple2IO).cycles.mockImplementation(() => cycles); + + const diskII = new DiskII(mockApple2IO, callbacks); + diskII.setBinary(1, 'DOS 3.3 System Master', 'woz', DOS33_SYSTEM_MASTER_IMAGE); + + diskII.ioSwitch(0x89); // turn on the motor + diskII.ioSwitch(0x8e); // read mode + + // The initial bytes in the image are: FF 3F CF F3 + // making the bit stream: + // + // 1111 1111 0011 1111 1100 1111 1111 0011 + // + // That's three FF sync bytes in a row. Assuming + // the sequencer is in state 2, each sync byte takes + // 32 clock cycles to read, is held for 8 clock + // cycles while the extra zeros are shifted in, then + // is held 8 more clock cycles while the sequencer + // reads the next two bits. + cycles += 40; // shift 10 bits + const nibble = diskII.ioSwitch(0x8c); // read data + expect(nibble).toBe(0xFF); + }); + + it('reads several FF sync bytes', () => { + let cycles: number = 0; + mocked(mockApple2IO).cycles.mockImplementation(() => cycles); + + const diskII = new DiskII(mockApple2IO, callbacks); + diskII.setBinary(1, 'DOS 3.3 System Master', 'woz', DOS33_SYSTEM_MASTER_IMAGE); + + diskII.ioSwitch(0x89); // turn on the motor + diskII.ioSwitch(0x8e); // read mode + + // The initial bytes in the image are: FF 3F CF F3 + // making the bit stream: + // + // 1111 1111 0011 1111 1100 1111 1111 0011 + // + // That's three FF sync bytes in a row. Assuming + // the sequencer is in state 2, each sync byte takes + // 32 clock cycles to read, is held for 8 clock + // cycles while the extra zeros are shifted in, then + // is held 8 more clock cycles while the sequencer + // reads the next two bits. This means that 3 sync + // bytes will be available for 3 * 40 + 8 cycles. + for (let i = 0; i < 3 * 40 + 8; i++) { + cycles++; + const nibble = diskII.ioSwitch(0x8c); // read data + if (nibble & 0x80) { + // Nibbles are only valid when the high bit is set. + // eslint-disable-next-line jest/no-conditional-expect + expect(nibble).toBe(0xFF); + } + } + }); + + it('reads random garbage on uninitialized tracks', () => { + let cycles: number = 0; + mocked(mockApple2IO).cycles.mockImplementation(() => cycles); + + const diskII = new DiskII(mockApple2IO, callbacks); + diskII.setBinary(1, 'DOS 3.3 System Master', 'woz', DOS33_SYSTEM_MASTER_IMAGE); + + // Step to track 0.5 + diskII.ioSwitch(0x89); // turn on the motor + diskII.ioSwitch(0x81); // coil 0 on + diskII.ioSwitch(0x83); // coil 1 on + diskII.ioSwitch(0x80); // coil 0 off + diskII.ioSwitch(0x82); // coil 1 off + diskII.ioSwitch(0x8e); // read mode + + // Read 5 nibbles + const nibbles: byte[] = []; + let read = false; + while (nibbles.length < 5) { + cycles++; + const nibble = diskII.ioSwitch(0x8c); // read data + const qa = nibble & 0x80; + if (qa && !read) { + nibbles.push(nibble); + read = true; + } + if (!qa && read) { + read = false; + } + } + // Test that the first doesn't equal any of the others. + // (Yes, this test could fail with some bad luck.) + let equal = false; + for (let i = 1; i < 5; i++) { + equal ||= nibbles[0] === nibbles[i]; + } + expect(equal).not.toBeTruthy(); + }); }); }); diff --git a/test/js/formats/woz.spec.ts b/test/js/formats/woz.spec.ts index c40fd09..673fd6b 100644 --- a/test/js/formats/woz.spec.ts +++ b/test/js/formats/woz.spec.ts @@ -19,7 +19,7 @@ describe('woz', () => { rawData: mockWoz1 }; - const disk = createDiskFromWoz(options) ; + const disk = createDiskFromWoz(options); expect(disk).toEqual({ name: 'Mock Woz 1', readOnly: true, @@ -31,9 +31,7 @@ describe('woz', () => { 1, 0, 0, 1, 0, 1, 1, 0, ])], tracks: [new Uint8Array([0xD5, 0xAA, 0x96])], - }); - expect(console.log).toHaveBeenCalledWith(expect.objectContaining({ - info: { + info: { bitTiming: 0, bootSector: 0, cleaned: 0, @@ -47,7 +45,7 @@ describe('woz', () => { version: 1, writeProtected: 0 } - })); + }); }); it('can parse Woz version 2', () => { @@ -58,7 +56,7 @@ describe('woz', () => { rawData: mockWoz2 }; - const disk = createDiskFromWoz(options) ; + const disk = createDiskFromWoz(options); expect(disk).toEqual({ name: 'Mock Woz 2', side: 'B', @@ -71,9 +69,7 @@ describe('woz', () => { 1, 0, 0, 1, 0, 1, 1, 0, ])], tracks: [new Uint8Array([0xD5, 0xAA, 0x96])], - }); - expect(console.log).toHaveBeenCalledWith(expect.objectContaining({ - info: { + info: { bitTiming: 0, bootSector: 0, cleaned: 0, @@ -87,6 +83,6 @@ describe('woz', () => { version: 2, writeProtected: 0 } - })); + }); }); });