package mz700_tape_wav_gen import ( "fmt" "io" "math" ) type StandardTapeWaveGenerator struct { InnerWaveGen *MZ700TapeWavGen LastError error } func NewStandardTapeWaveGenerator(f io.WriteCloser, machineType MachineType, invertPolarity bool) (*StandardTapeWaveGenerator, error) { iwg, err := NewMZ700TapeWavGen(f, machineType, invertPolarity) if err != nil { return nil, err } g := &StandardTapeWaveGenerator{ InnerWaveGen: iwg, } return g, nil } func (g *StandardTapeWaveGenerator) WriteStandardFile(f *StandardTapeFile) error { g.InnerWaveGen.WriteGAP(true) g.InnerWaveGen.WriteTapeMark(true) g.InnerWaveGen.WriteLongPulse() g.writeTapeHeader(f) g.InnerWaveGen.Write256S() g.writeTapeHeader(f) g.InnerWaveGen.WriteGAP(false) g.InnerWaveGen.WriteTapeMark(false) g.InnerWaveGen.WriteLongPulse() fchksum := GetByteSliceChecksum(f.File) _, _ = g.InnerWaveGen.Write(f.File) g.InnerWaveGen.WriteUint16BigEndian(fchksum) g.InnerWaveGen.WriteLongPulse() g.InnerWaveGen.Write256S() _, _ = g.InnerWaveGen.Write(f.File) g.InnerWaveGen.WriteUint16BigEndian(fchksum) g.InnerWaveGen.WriteLongPulse() return g.LastError } func (g *StandardTapeWaveGenerator) writeTapeHeader(f *StandardTapeFile) { var hdr_chksum uint16 hdr_chksum = 0 hdr_chksum += GetSingleByteChecksum(f.FileAttribute) g.InnerWaveGen.WriteFileAttribute(f.FileAttribute) fdata := ConvertFilename(f.Filename) hdr_chksum += g.InnerWaveGen.WriteFilenameRaw(fdata) filelenRaw := len(f.File) if filelenRaw > math.MaxUint16 { g.LastError = fmt.Errorf("file too long (%d/%d bytes)", filelenRaw, math.MaxUint16) } filelen := uint16(filelenRaw) hdr_chksum += g.InnerWaveGen.WriteUint16LittleEndian(filelen) hdr_chksum += g.InnerWaveGen.WriteUint16LittleEndian(f.LoadAddress) if f.ExecuteAfterLoad { hdr_chksum += g.InnerWaveGen.WriteUint16LittleEndian(f.ExecuteAddress) } else { hdr_chksum += g.InnerWaveGen.WriteUint16LittleEndian(0x00AD) } if f.IsStringComment { ctw := ConvertStringCommnet(f.StringComment) hdr_chksum += g.InnerWaveGen.WriteCommentRaw(ctw) } else { hdr_chksum += g.InnerWaveGen.WriteCommentRaw(f.BinaryComment) } g.InnerWaveGen.WriteUint16BigEndian(hdr_chksum) g.InnerWaveGen.WriteLongPulse() } func (g *StandardTapeWaveGenerator) WriteSilent1Second() { g.InnerWaveGen.WriteSilent1Second() } func (g *StandardTapeWaveGenerator) Close() error { err := g.InnerWaveGen.Close() if err != nil { return err } else { return g.LastError } } func (g *StandardTapeWaveGenerator) GetLastError() error { return g.LastError }