// 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;
}
