123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- 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
- }
|