// Copyright 2009 The Go Authors.  All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package proc

import (
	"os";
	"strconv";
	"syscall";
)

type _386Regs struct {
	syscall.PtraceRegs;
	setter	func(*syscall.PtraceRegs) os.Error;
}

var names = [...]string{
	"eax",
	"ebx",
	"ecx",
	"edx",
	"esi",
	"edi",
	"ebp",
	"esp",
	"eip",
	"eflags",
	"cs",
	"ss",
	"ds",
	"es",
	"fs",
	"gs",
}

func (r *_386Regs) PC() Word	{ return Word(r.Eip) }

func (r *_386Regs) SetPC(val Word) os.Error {
	r.Eip = int32(val);
	return r.setter(&r.PtraceRegs);
}

func (r *_386Regs) Link() Word {
	// TODO(austin)
	panic("No link register")
}

func (r *_386Regs) SetLink(val Word) os.Error	{ panic("No link register") }

func (r *_386Regs) SP() Word	{ return Word(r.Esp) }

func (r *_386Regs) SetSP(val Word) os.Error {
	r.Esp = int32(val);
	return r.setter(&r.PtraceRegs);
}

func (r *_386Regs) Names() []string	{ return &names }

func (r *_386Regs) Get(i int) Word {
	switch i {
	case 0:
		return Word(uint32(r.Eax))
	case 1:
		return Word(uint32(r.Ebx))
	case 2:
		return Word(uint32(r.Ecx))
	case 3:
		return Word(uint32(r.Edx))
	case 4:
		return Word(uint32(r.Esi))
	case 5:
		return Word(uint32(r.Edi))
	case 6:
		return Word(uint32(r.Ebp))
	case 7:
		return Word(uint32(r.Esp))
	case 8:
		return Word(uint32(r.Eip))
	case 9:
		return Word(uint32(r.Eflags))
	case 10:
		return Word(r.Cs)
	case 11:
		return Word(r.Ss)
	case 12:
		return Word(r.Ds)
	case 13:
		return Word(r.Es)
	case 14:
		return Word(r.Fs)
	case 15:
		return Word(r.Gs)
	}
	panic("invalid register index ", strconv.Itoa(i));
}

func (r *_386Regs) Set(i int, val Word) os.Error {
	switch i {
	case 0:
		r.Eax = int32(val)
	case 1:
		r.Ebx = int32(val)
	case 2:
		r.Ecx = int32(val)
	case 3:
		r.Edx = int32(val)
	case 4:
		r.Esi = int32(val)
	case 5:
		r.Edi = int32(val)
	case 6:
		r.Ebp = int32(val)
	case 7:
		r.Esp = int32(val)
	case 8:
		r.Eip = int32(val)
	case 9:
		r.Eflags = int32(val)
	case 10:
		r.Cs = uint16(val)
	case 11:
		r.Ss = uint16(val)
	case 12:
		r.Ds = uint16(val)
	case 13:
		r.Es = uint16(val)
	case 14:
		r.Fs = uint16(val)
	case 15:
		r.Gs = uint16(val)
	default:
		panic("invalid register index ", strconv.Itoa(i))
	}
	return r.setter(&r.PtraceRegs);
}

func newRegs(regs *syscall.PtraceRegs, setter func(*syscall.PtraceRegs) os.Error) Regs {
	res := _386Regs{};
	res.PtraceRegs = *regs;
	res.setter = setter;
	return &res;
}
