mirror of
https://github.com/paleotronic/diskm8.git
synced 2024-12-21 18:29:43 +00:00
Added setvolume for prodos disks
This commit is contained in:
parent
e38cb58d37
commit
a6d47bbafa
@ -74,6 +74,10 @@ func (fd *VDH) GetNameLength() int {
|
|||||||
return int(fd.Data[0] & 0xf)
|
return int(fd.Data[0] & 0xf)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (fd *VDH) SetNameLength(l int) {
|
||||||
|
fd.Data[0] = (fd.Data[0] & 0xf0) | byte(l&0x0f)
|
||||||
|
}
|
||||||
|
|
||||||
func (fd *VDH) GetStorageType() ProDOSStorageType {
|
func (fd *VDH) GetStorageType() ProDOSStorageType {
|
||||||
return ProDOSStorageType((fd.Data[0]) >> 4)
|
return ProDOSStorageType((fd.Data[0]) >> 4)
|
||||||
}
|
}
|
||||||
@ -82,6 +86,21 @@ func (fd *VDH) GetDirName() string {
|
|||||||
return fd.GetVolumeName()
|
return fd.GetVolumeName()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (fd *VDH) SetVolumeName(s string) {
|
||||||
|
if len(s) > 15 {
|
||||||
|
s = s[:15]
|
||||||
|
}
|
||||||
|
l := len(s)
|
||||||
|
for i := 0; i < 15; i++ {
|
||||||
|
if i < l {
|
||||||
|
fd.Data[1+i] = byte(s[i])
|
||||||
|
} else {
|
||||||
|
fd.Data[1+i] = 0x00
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fd.SetNameLength(l)
|
||||||
|
}
|
||||||
|
|
||||||
func (fd *VDH) GetVolumeName() string {
|
func (fd *VDH) GetVolumeName() string {
|
||||||
|
|
||||||
l := fd.GetNameLength()
|
l := fd.GetNameLength()
|
||||||
@ -883,6 +902,20 @@ func (d *DSKWrapper) PRODOSGetVDH(b int) (*VDH, error) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (d *DSKWrapper) PRODOSSetVDH(b int, vdh *VDH) error {
|
||||||
|
|
||||||
|
data, e := d.PRODOSGetBlock(b)
|
||||||
|
if e != nil {
|
||||||
|
return e
|
||||||
|
}
|
||||||
|
|
||||||
|
for i, v := range vdh.Data {
|
||||||
|
data[4+i] = v
|
||||||
|
}
|
||||||
|
|
||||||
|
return d.PRODOSWrite(b, data)
|
||||||
|
}
|
||||||
|
|
||||||
func (d *DSKWrapper) PRODOSGetCatalogPathed(start int, path string, pattern string) (*VDH, []ProDOSFileDescriptor, error) {
|
func (d *DSKWrapper) PRODOSGetCatalogPathed(start int, path string, pattern string) (*VDH, []ProDOSFileDescriptor, error) {
|
||||||
|
|
||||||
path = strings.Trim(path, "/")
|
path = strings.Trim(path, "/")
|
||||||
|
51
shell.go
51
shell.go
@ -262,6 +262,20 @@ func init() {
|
|||||||
"Mounts disk and switches to the new slot",
|
"Mounts disk and switches to the new slot",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
"setvolume": &shellCommand{
|
||||||
|
Name: "setvolume",
|
||||||
|
Description: "Sets the ProDOS volume name",
|
||||||
|
MinArgs: 1,
|
||||||
|
MaxArgs: 1,
|
||||||
|
Code: shellVolumeName,
|
||||||
|
NeedsMount: true,
|
||||||
|
Context: sccNone,
|
||||||
|
Text: []string{
|
||||||
|
"setvolume <volume name>",
|
||||||
|
"",
|
||||||
|
"Set ProDOS volume name. Truncated to 15 chars if too long.",
|
||||||
|
},
|
||||||
|
},
|
||||||
"unmount": &shellCommand{
|
"unmount": &shellCommand{
|
||||||
Name: "unmount",
|
Name: "unmount",
|
||||||
Description: "unmount disk image",
|
Description: "unmount disk image",
|
||||||
@ -820,10 +834,15 @@ func shellCat(args []string) int {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bs := 256
|
bs := 256
|
||||||
|
volumename := "no-name"
|
||||||
if info.FormatID.ID == disk.DF_PASCAL || info.FormatID.ID == disk.DF_PRODOS ||
|
if info.FormatID.ID == disk.DF_PASCAL || info.FormatID.ID == disk.DF_PRODOS ||
|
||||||
info.FormatID.ID == disk.DF_PRODOS_800KB || info.FormatID.ID == disk.DF_PRODOS_400KB ||
|
info.FormatID.ID == disk.DF_PRODOS_800KB || info.FormatID.ID == disk.DF_PRODOS_400KB ||
|
||||||
info.FormatID.ID == disk.DF_PRODOS_CUSTOM {
|
info.FormatID.ID == disk.DF_PRODOS_CUSTOM {
|
||||||
bs = 512
|
bs = 512
|
||||||
|
vdh, err := commandVolumes[commandTarget].PRODOSGetVDH(2)
|
||||||
|
if err == nil {
|
||||||
|
volumename = vdh.GetVolumeName()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pattern := "*"
|
pattern := "*"
|
||||||
@ -833,6 +852,8 @@ func shellCat(args []string) int {
|
|||||||
|
|
||||||
files, _ := globDisk(commandTarget, pattern)
|
files, _ := globDisk(commandTarget, pattern)
|
||||||
|
|
||||||
|
fmt.Printf("Volume Name is %s\n\n", volumename)
|
||||||
|
|
||||||
fmt.Printf("%-33s %6s %2s %-23s %s\n", "NAME", "BLOCKS", "RO", "KIND", "ADDITONAL")
|
fmt.Printf("%-33s %6s %2s %-23s %s\n", "NAME", "BLOCKS", "RO", "KIND", "ADDITONAL")
|
||||||
for _, f := range files {
|
for _, f := range files {
|
||||||
add := ""
|
add := ""
|
||||||
@ -1042,6 +1063,36 @@ func shellMkdir(args []string) int {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func shellVolumeName(args []string) int {
|
||||||
|
|
||||||
|
fullpath, _ := filepath.Abs(commandVolumes[commandTarget].Filename)
|
||||||
|
|
||||||
|
_, err := analyze(0, fullpath)
|
||||||
|
if err != nil {
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
name := strings.ToUpper(args[0])
|
||||||
|
|
||||||
|
if formatIn(commandVolumes[commandTarget].Format.ID, []disk.DiskFormatID{disk.DF_PRODOS, disk.DF_PRODOS_800KB, disk.DF_PRODOS_400KB, disk.DF_PRODOS_CUSTOM}) {
|
||||||
|
vdh, err := commandVolumes[commandTarget].PRODOSGetVDH(2)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Printf("Failed to get Volume Directory Header: %v\n", err)
|
||||||
|
return -1
|
||||||
|
}
|
||||||
|
vdh.SetVolumeName(name)
|
||||||
|
commandVolumes[commandTarget].PRODOSSetVDH(2, vdh)
|
||||||
|
fmt.Printf("Volume name is now %s\n", vdh.GetVolumeName())
|
||||||
|
saveDisk(commandVolumes[commandTarget], fullpath)
|
||||||
|
} else {
|
||||||
|
fmt.Println("Do not support setvolume on " + commandVolumes[commandTarget].Format.String() + ".")
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
func isASCII(in []byte) bool {
|
func isASCII(in []byte) bool {
|
||||||
for _, v := range in {
|
for _, v := range in {
|
||||||
if v > 128 {
|
if v > 128 {
|
||||||
|
Loading…
Reference in New Issue
Block a user