file reading and writing fixes

This commit is contained in:
April Ayres-Griffiths 2018-05-12 11:00:57 +10:00
parent 4479f21f0b
commit 0a4cc590d8
4 changed files with 53 additions and 14 deletions

View File

@ -205,8 +205,10 @@ func (fd *FileDescriptor) TotalSectors() int {
} }
func (fd *FileDescriptor) SetTotalSectors(v int) { func (fd *FileDescriptor) SetTotalSectors(v int) {
fmt.Printf("Call to set sector count to %d\n", v)
fd.Data[0x21] = byte(v & 0xff) fd.Data[0x21] = byte(v & 0xff)
fd.Data[0x22] = byte(v / 0x100) fd.Data[0x22] = byte(v / 0x100)
fmt.Printf("Sector count bytes are %d, %d\n", fd.Data[0x21], fd.Data[0x22])
} }
func (fd *FileDescriptor) SetTrackSectorListStart(t, s int) { func (fd *FileDescriptor) SetTrackSectorListStart(t, s int) {
@ -901,6 +903,15 @@ func (dsk *DSKWrapper) AppleDOSWriteFile(name string, kind FileType, data []byte
return err return err
} }
fmt.Printf("Writing file with type %s\n", kind.Ext())
if kind == FileTypeBIN {
l := len(data)
fmt.Printf("Length is %d\n", l)
header := []byte{byte(l % 256), byte(l / 256)}
data = append(header, data...)
}
if kind != FileTypeTXT { if kind != FileTypeTXT {
header := []byte{byte(loadAddr % 256), byte(loadAddr / 256)} header := []byte{byte(loadAddr % 256), byte(loadAddr / 256)}
data = append(header, data...) data = append(header, data...)
@ -932,6 +943,7 @@ func (dsk *DSKWrapper) AppleDOSWriteFile(name string, kind FileType, data []byte
} }
// 2nd: check we can get a free catalog entry // 2nd: check we can get a free catalog entry
sectorCount := len(dataBlocks)
// 3rd: Write the datablocks // 3rd: Write the datablocks
var block int = 0 var block int = 0
@ -1010,7 +1022,8 @@ func (dsk *DSKWrapper) AppleDOSWriteFile(name string, kind FileType, data []byte
fd.SetName(name) fd.SetName(name)
fd.SetTrackSectorListStart(tsBlocks[0][0], tsBlocks[0][1]) fd.SetTrackSectorListStart(tsBlocks[0][0], tsBlocks[0][1])
fd.SetType(kind) fd.SetType(kind)
fd.SetTotalSectors(len(dataBlocks)) fd.SetTotalSectors(sectorCount)
fd.Publish(dsk)
return nil return nil

View File

@ -102,11 +102,11 @@ func analyzeDOS13(id int, dsk *disk.DSKWrapper, info *Disk) {
Modified: time.Now(), Modified: time.Now(),
} }
_, _, data, err := dsk.AppleDOSReadFileRaw(fd) size, addr, data, err := dsk.AppleDOSReadFileRaw(fd)
if err == nil { if err == nil {
sum := sha256.Sum256(data) sum := sha256.Sum256(data)
file.SHA256 = hex.EncodeToString(sum[:]) file.SHA256 = hex.EncodeToString(sum[:])
file.Size = len(data) file.Size = size
if *ingestMode&1 == 1 { if *ingestMode&1 == 1 {
if fd.Type() == disk.FileTypeAPP { if fd.Type() == disk.FileTypeAPP {
file.Text = disk.ApplesoftDetoks(data) file.Text = disk.ApplesoftDetoks(data)
@ -124,8 +124,8 @@ func analyzeDOS13(id int, dsk *disk.DSKWrapper, info *Disk) {
file.TypeCode = TypeMask_AppleDOS | TypeCode(fd.Type()) file.TypeCode = TypeMask_AppleDOS | TypeCode(fd.Type())
file.LoadAddress = 0x0000 file.LoadAddress = 0x0000
} else if fd.Type() == disk.FileTypeBIN && len(data) >= 2 { } else if fd.Type() == disk.FileTypeBIN && len(data) >= 2 {
file.LoadAddress = int(data[0]) + 256*int(data[1]) file.LoadAddress = addr
file.Data = data[2:] file.Data = data
file.TypeCode = TypeMask_AppleDOS | TypeCode(fd.Type()) file.TypeCode = TypeMask_AppleDOS | TypeCode(fd.Type())
} else { } else {
file.LoadAddress = 0x0000 file.LoadAddress = 0x0000

View File

@ -136,11 +136,11 @@ func analyzeDOS16(id int, dsk *disk.DSKWrapper, info *Disk) {
} }
//l.Log("start read") //l.Log("start read")
_, _, data, err := dsk.AppleDOSReadFileRaw(fd) size, addr, data, err := dsk.AppleDOSReadFileRaw(fd)
if err == nil { if err == nil {
sum := sha256.Sum256(data) sum := sha256.Sum256(data)
file.SHA256 = hex.EncodeToString(sum[:]) file.SHA256 = hex.EncodeToString(sum[:])
file.Size = len(data) file.Size = size
if *ingestMode&1 == 1 { if *ingestMode&1 == 1 {
if fd.Type() == disk.FileTypeAPP { if fd.Type() == disk.FileTypeAPP {
file.Text = disk.ApplesoftDetoks(data) file.Text = disk.ApplesoftDetoks(data)
@ -158,8 +158,8 @@ func analyzeDOS16(id int, dsk *disk.DSKWrapper, info *Disk) {
file.TypeCode = TypeMask_AppleDOS | TypeCode(fd.Type()) file.TypeCode = TypeMask_AppleDOS | TypeCode(fd.Type())
file.LoadAddress = 0x0000 file.LoadAddress = 0x0000
} else if fd.Type() == disk.FileTypeBIN && len(data) >= 2 { } else if fd.Type() == disk.FileTypeBIN && len(data) >= 2 {
file.LoadAddress = int(data[0]) + 256*int(data[1]) file.LoadAddress = addr
file.Data = data[2:] file.Data = data
file.TypeCode = TypeMask_AppleDOS | TypeCode(fd.Type()) file.TypeCode = TypeMask_AppleDOS | TypeCode(fd.Type())
} else { } else {
file.LoadAddress = 0x0000 file.LoadAddress = 0x0000

View File

@ -1060,15 +1060,42 @@ func shellPut(args []string) int {
return 1 return 1
} }
data, err := ioutil.ReadFile(args[0]) parts := strings.Split(args[0], ",")
data, err := ioutil.ReadFile(parts[0])
if err != nil { if err != nil {
return -1 return -1
} }
if formatIn(commandVolumes[commandTarget].Format.ID, []disk.DiskFormatID{disk.DF_DOS_SECTORS_13, disk.DF_DOS_SECTORS_16}) {
addr := int64(0x0801) addr := int64(0x0801)
name := filepath.Base(args[0]) name := filepath.Base(args[0])
reTrailAddr := regexp.MustCompile("(?i)^([^,]+)([,]A(([$]|0x)[0-9a-f]+))?([,]L(([$]|0x)[0-9a-f]+))?$")
if reTrailAddr.MatchString(name) {
m := reTrailAddr.FindAllStringSubmatch(name, -1)
name = m[0][1]
saddr := m[0][3]
slen := m[0][6]
if saddr != "" {
if strings.HasPrefix(saddr, "$") {
saddr = "0x" + saddr[1:]
}
addr, _ = strconv.ParseInt(saddr, 0, 32)
}
if slen != "" {
if strings.HasPrefix(slen, "$") {
slen = "0x" + slen[1:]
}
nlen, _ := strconv.ParseInt(slen, 0, 32)
if int(nlen) < len(data) {
data = data[:int(nlen)]
}
}
}
if formatIn(commandVolumes[commandTarget].Format.ID, []disk.DiskFormatID{disk.DF_DOS_SECTORS_13, disk.DF_DOS_SECTORS_16}) {
kind := disk.FileTypeAPP kind := disk.FileTypeAPP
reSpecial := regexp.MustCompile("(?i)^(.+)[#](0x[a-fA-F0-9]+)[.]([A-Za-z]+)$") reSpecial := regexp.MustCompile("(?i)^(.+)[#](0x[a-fA-F0-9]+)[.]([A-Za-z]+)$")
ext := strings.Trim(filepath.Ext(name), ".") ext := strings.Trim(filepath.Ext(name), ".")
if reSpecial.MatchString(name) { if reSpecial.MatchString(name) {
@ -1106,8 +1133,7 @@ func shellPut(args []string) int {
saveDisk(commandVolumes[commandTarget], fullpath) saveDisk(commandVolumes[commandTarget], fullpath)
} else if formatIn(commandVolumes[commandTarget].Format.ID, []disk.DiskFormatID{disk.DF_PRODOS, disk.DF_PRODOS_800KB, disk.DF_PRODOS_400KB, disk.DF_PRODOS_CUSTOM}) { } else if formatIn(commandVolumes[commandTarget].Format.ID, []disk.DiskFormatID{disk.DF_PRODOS, disk.DF_PRODOS_800KB, disk.DF_PRODOS_400KB, disk.DF_PRODOS_CUSTOM}) {
addr := int64(0x0801)
name := filepath.Base(args[0])
ext := strings.Trim(filepath.Ext(name), ".") ext := strings.Trim(filepath.Ext(name), ".")
reSpecial := regexp.MustCompile("(?i)^(.+)[#](0x[a-fA-F0-9]+)[.]([A-Za-z]+)$") reSpecial := regexp.MustCompile("(?i)^(.+)[#](0x[a-fA-F0-9]+)[.]([A-Za-z]+)$")
if reSpecial.MatchString(name) { if reSpecial.MatchString(name) {