// Copyright Terence J. Boldt (c)2021-2022 // Use of this source code is governed by an MIT // license that can be found in the LICENSE file. // This file provides conversion to and from ProDOS time format package prodos import ( "time" ) // DateTimeToProDOS converts Time to ProDOS date time // 49041 ($BF91) 49040 ($BF90) // // 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 // +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+ // DATE: | year | month | day | // +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+ // // 49043 ($BF93) 49042 ($BF92) // // 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 // +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+ // TIME: | hour | | minute | // +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+ func DateTimeToProDOS(dateTime time.Time) []byte { year := dateTime.Year() % 100 month := dateTime.Month() day := dateTime.Day() hour := dateTime.Hour() minute := dateTime.Minute() buffer := make([]byte, 4) buffer[0] = ((byte(month) & 15) << 5) + byte(day) buffer[1] = (byte(year) << 1) + (byte(month) >> 3) buffer[2] = byte(minute) buffer[3] = byte(hour) return buffer } // DateTimeFromProDOS converts Time from ProDOS date time func DateTimeFromProDOS(buffer []byte) time.Time { if buffer[0] == 0 && buffer[1] == 0 && buffer[2] == 0 && buffer[3] == 0 { return time.Time{} } twoDigitYear := buffer[1] >> 1 var year int if twoDigitYear < 76 { year = 2000 + int(twoDigitYear) } else { year = 1900 + int(twoDigitYear) } month := int(buffer[0]>>5 + (buffer[1]&1)<<3) day := int(buffer[0] & 31) hour := int(buffer[3]) minute := int(buffer[2]) parsedTime := time.Date(year, time.Month(month), day, hour, minute, 0, 0, time.Local) return parsedTime }