//go:build tkey

// This file implements target-specific things for the TKey.

package runtime

import (
	"device/tkey"
	"machine"
	"runtime/volatile"
)

type timeUnit int64

//export main
func main() {
	preinit()
	initPeripherals()
	run()
	exit(0)
}

// initPeripherals configures peripherals the way the runtime expects them.
func initPeripherals() {
	// prescaler value that results in 0.00001-second timer-ticks.
	// given an 18 MHz processor, a millisecond is about 18,000 cycles.
	tkey.TIMER.PRESCALER.Set(18 * machine.MHz / 100000)

	machine.InitSerial()
}

func putchar(c byte) {
	machine.Serial.WriteByte(c)
}

func getchar() byte {
	for machine.Serial.Buffered() == 0 {
		Gosched()
	}
	v, _ := machine.Serial.ReadByte()
	return v
}

func buffered() int {
	return machine.Serial.Buffered()
}

var timestamp volatile.Register32

// ticks returns the current value of the timer in ticks.
func ticks() timeUnit {
	return timeUnit(timestamp.Get())
}

// sleepTicks sleeps for at least the duration d.
func sleepTicks(d timeUnit) {
	target := uint32(ticks() + d)

	tkey.TIMER.TIMER.Set(uint32(d))
	tkey.TIMER.CTRL.SetBits(tkey.TK1_MMIO_TIMER_CTRL_START)
	for tkey.TIMER.STATUS.Get() != 0 {
	}
	timestamp.Set(target)
}
