standard_gen.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. package mz700_tape_wav_gen
  2. import (
  3. "fmt"
  4. "io"
  5. "math"
  6. )
  7. type StandardTapeWaveGenerator struct {
  8. InnerWaveGen *MZ700TapeWavGen
  9. LastError error
  10. }
  11. func NewStandardTapeWaveGenerator(f io.WriteCloser, machineType MachineType, invertPolarity bool) (*StandardTapeWaveGenerator, error) {
  12. iwg, err := NewMZ700TapeWavGen(f, machineType, invertPolarity)
  13. if err != nil {
  14. return nil, err
  15. }
  16. g := &StandardTapeWaveGenerator{
  17. InnerWaveGen: iwg,
  18. }
  19. return g, nil
  20. }
  21. func (g *StandardTapeWaveGenerator) WriteStandardFile(f *StandardTapeFile) error {
  22. g.InnerWaveGen.WriteGAP(true)
  23. g.InnerWaveGen.WriteTapeMark(true)
  24. g.InnerWaveGen.WriteLongPulse()
  25. g.writeTapeHeader(f)
  26. g.InnerWaveGen.Write256S()
  27. g.writeTapeHeader(f)
  28. g.InnerWaveGen.WriteGAP(false)
  29. g.InnerWaveGen.WriteTapeMark(false)
  30. g.InnerWaveGen.WriteLongPulse()
  31. fchksum := GetByteSliceChecksum(f.File)
  32. _, _ = g.InnerWaveGen.Write(f.File)
  33. g.InnerWaveGen.WriteUint16BigEndian(fchksum)
  34. g.InnerWaveGen.WriteLongPulse()
  35. g.InnerWaveGen.Write256S()
  36. _, _ = g.InnerWaveGen.Write(f.File)
  37. g.InnerWaveGen.WriteUint16BigEndian(fchksum)
  38. g.InnerWaveGen.WriteLongPulse()
  39. return g.LastError
  40. }
  41. func (g *StandardTapeWaveGenerator) writeTapeHeader(f *StandardTapeFile) {
  42. var hdr_chksum uint16
  43. hdr_chksum = 0
  44. hdr_chksum += GetSingleByteChecksum(f.FileAttribute)
  45. g.InnerWaveGen.WriteFileAttribute(f.FileAttribute)
  46. fdata := ConvertFilename(f.Filename)
  47. hdr_chksum += g.InnerWaveGen.WriteFilenameRaw(fdata)
  48. filelenRaw := len(f.File)
  49. if filelenRaw > math.MaxUint16 {
  50. g.LastError = fmt.Errorf("file too long (%d/%d bytes)", filelenRaw, math.MaxUint16)
  51. }
  52. filelen := uint16(filelenRaw)
  53. hdr_chksum += g.InnerWaveGen.WriteUint16LittleEndian(filelen)
  54. hdr_chksum += g.InnerWaveGen.WriteUint16LittleEndian(f.LoadAddress)
  55. if f.ExecuteAfterLoad {
  56. hdr_chksum += g.InnerWaveGen.WriteUint16LittleEndian(f.ExecuteAddress)
  57. } else {
  58. hdr_chksum += g.InnerWaveGen.WriteUint16LittleEndian(0x00AD)
  59. }
  60. if f.IsStringComment {
  61. ctw := ConvertStringCommnet(f.StringComment)
  62. hdr_chksum += g.InnerWaveGen.WriteCommentRaw(ctw)
  63. } else {
  64. hdr_chksum += g.InnerWaveGen.WriteCommentRaw(f.BinaryComment)
  65. }
  66. g.InnerWaveGen.WriteUint16BigEndian(hdr_chksum)
  67. g.InnerWaveGen.WriteLongPulse()
  68. }
  69. func (g *StandardTapeWaveGenerator) WriteSilent1Second() {
  70. g.InnerWaveGen.WriteSilent1Second()
  71. }
  72. func (g *StandardTapeWaveGenerator) Close() error {
  73. err := g.InnerWaveGen.Close()
  74. if err != nil {
  75. return err
  76. } else {
  77. return g.LastError
  78. }
  79. }
  80. func (g *StandardTapeWaveGenerator) GetLastError() error {
  81. return g.LastError
  82. }