xref: /plan9-contrib/sys/src/cmd/aux/realemu/arg.c (revision ccaec48a6a7d481d90233fb80c88e608b0a02604)
1*ccaec48aSDavid du Colombier #include <u.h>
2*ccaec48aSDavid du Colombier #include <libc.h>
3*ccaec48aSDavid du Colombier #include "dat.h"
4*ccaec48aSDavid du Colombier #include "fns.h"
5*ccaec48aSDavid du Colombier 
6*ccaec48aSDavid du Colombier #define ause(cpu) (cpu->abuf + (cpu->iabuf++ % nelem(cpu->abuf)))
7*ccaec48aSDavid du Colombier 
8*ccaec48aSDavid du Colombier Iarg*
adup(Iarg * x)9*ccaec48aSDavid du Colombier adup(Iarg *x)
10*ccaec48aSDavid du Colombier {
11*ccaec48aSDavid du Colombier 	Iarg *a;
12*ccaec48aSDavid du Colombier 
13*ccaec48aSDavid du Colombier 	a = ause(x->cpu);
14*ccaec48aSDavid du Colombier 	*a = *x;
15*ccaec48aSDavid du Colombier 	return a;
16*ccaec48aSDavid du Colombier }
17*ccaec48aSDavid du Colombier 
18*ccaec48aSDavid du Colombier Iarg*
areg(Cpu * cpu,uchar len,uchar reg)19*ccaec48aSDavid du Colombier areg(Cpu *cpu, uchar len, uchar reg)
20*ccaec48aSDavid du Colombier {
21*ccaec48aSDavid du Colombier 	Iarg *a;
22*ccaec48aSDavid du Colombier 
23*ccaec48aSDavid du Colombier 	a = ause(cpu);
24*ccaec48aSDavid du Colombier 	a->cpu = cpu;
25*ccaec48aSDavid du Colombier 	a->tag = TREG;
26*ccaec48aSDavid du Colombier 	a->len = len;
27*ccaec48aSDavid du Colombier 	a->reg = reg;
28*ccaec48aSDavid du Colombier 	return a;
29*ccaec48aSDavid du Colombier }
30*ccaec48aSDavid du Colombier 
31*ccaec48aSDavid du Colombier Iarg*
amem(Cpu * cpu,uchar len,uchar sreg,ulong off)32*ccaec48aSDavid du Colombier amem(Cpu *cpu, uchar len, uchar sreg, ulong off)
33*ccaec48aSDavid du Colombier {
34*ccaec48aSDavid du Colombier 	Iarg *a;
35*ccaec48aSDavid du Colombier 
36*ccaec48aSDavid du Colombier 	a = ause(cpu);
37*ccaec48aSDavid du Colombier 	a->cpu = cpu;
38*ccaec48aSDavid du Colombier 	a->tag = TMEM;
39*ccaec48aSDavid du Colombier 	a->len = len;
40*ccaec48aSDavid du Colombier 	a->sreg = sreg;
41*ccaec48aSDavid du Colombier 	a->seg = cpu->reg[sreg];
42*ccaec48aSDavid du Colombier 	a->off = off;
43*ccaec48aSDavid du Colombier 	return a;
44*ccaec48aSDavid du Colombier }
45*ccaec48aSDavid du Colombier 
46*ccaec48aSDavid du Colombier Iarg*
afar(Iarg * mem,uchar len,uchar alen)47*ccaec48aSDavid du Colombier afar(Iarg *mem, uchar len, uchar alen)
48*ccaec48aSDavid du Colombier {
49*ccaec48aSDavid du Colombier 	Iarg *a, *p;
50*ccaec48aSDavid du Colombier 
51*ccaec48aSDavid du Colombier 	p = adup(mem);
52*ccaec48aSDavid du Colombier 	p->len = alen;
53*ccaec48aSDavid du Colombier 	a = amem(mem->cpu, len, R0S, ar(p));
54*ccaec48aSDavid du Colombier 	p->off += alen;
55*ccaec48aSDavid du Colombier 	p->len = 2;
56*ccaec48aSDavid du Colombier 	a->seg = ar(p);
57*ccaec48aSDavid du Colombier 	return a;
58*ccaec48aSDavid du Colombier }
59*ccaec48aSDavid du Colombier 
60*ccaec48aSDavid du Colombier Iarg*
acon(Cpu * cpu,uchar len,ulong val)61*ccaec48aSDavid du Colombier acon(Cpu *cpu, uchar len, ulong val)
62*ccaec48aSDavid du Colombier {
63*ccaec48aSDavid du Colombier 	Iarg *a;
64*ccaec48aSDavid du Colombier 
65*ccaec48aSDavid du Colombier 	a = ause(cpu);
66*ccaec48aSDavid du Colombier 	a->cpu = cpu;
67*ccaec48aSDavid du Colombier 	a->tag = TCON;
68*ccaec48aSDavid du Colombier 	a->len = len;
69*ccaec48aSDavid du Colombier 	a->val = val;
70*ccaec48aSDavid du Colombier 	return a;
71*ccaec48aSDavid du Colombier }
72*ccaec48aSDavid du Colombier 
73*ccaec48aSDavid du Colombier ulong
ar(Iarg * a)74*ccaec48aSDavid du Colombier ar(Iarg *a)
75*ccaec48aSDavid du Colombier {
76*ccaec48aSDavid du Colombier 	ulong w, o;
77*ccaec48aSDavid du Colombier 	Bus *io;
78*ccaec48aSDavid du Colombier 
79*ccaec48aSDavid du Colombier 	switch(a->tag){
80*ccaec48aSDavid du Colombier 	default:
81*ccaec48aSDavid du Colombier 		abort();
82*ccaec48aSDavid du Colombier 	case TMEM:
83*ccaec48aSDavid du Colombier 		o = ((a->seg<<4) + (a->off & 0xFFFF)) & 0xFFFFF;
84*ccaec48aSDavid du Colombier 		io = a->cpu->mem + (o>>16);
85*ccaec48aSDavid du Colombier 		w = io->r(io->aux, o, a->len);
86*ccaec48aSDavid du Colombier 		break;
87*ccaec48aSDavid du Colombier 	case TREG:
88*ccaec48aSDavid du Colombier 		w = a->cpu->reg[a->reg];
89*ccaec48aSDavid du Colombier 		break;
90*ccaec48aSDavid du Colombier 	case TREG|TH:
91*ccaec48aSDavid du Colombier 		w = a->cpu->reg[a->reg] >> 8;
92*ccaec48aSDavid du Colombier 		break;
93*ccaec48aSDavid du Colombier 	case TCON:
94*ccaec48aSDavid du Colombier 		w = a->val;
95*ccaec48aSDavid du Colombier 		break;
96*ccaec48aSDavid du Colombier 	}
97*ccaec48aSDavid du Colombier 	switch(a->len){
98*ccaec48aSDavid du Colombier 	default:
99*ccaec48aSDavid du Colombier 		abort();
100*ccaec48aSDavid du Colombier 	case 1:
101*ccaec48aSDavid du Colombier 		w &= 0xFF;
102*ccaec48aSDavid du Colombier 		break;
103*ccaec48aSDavid du Colombier 	case 2:
104*ccaec48aSDavid du Colombier 		w &= 0xFFFF;
105*ccaec48aSDavid du Colombier 		break;
106*ccaec48aSDavid du Colombier 	case 4:
107*ccaec48aSDavid du Colombier 		break;
108*ccaec48aSDavid du Colombier 	}
109*ccaec48aSDavid du Colombier 	return w;
110*ccaec48aSDavid du Colombier }
111*ccaec48aSDavid du Colombier 
112*ccaec48aSDavid du Colombier long
ars(Iarg * a)113*ccaec48aSDavid du Colombier ars(Iarg *a)
114*ccaec48aSDavid du Colombier {
115*ccaec48aSDavid du Colombier 	ulong w = ar(a);
116*ccaec48aSDavid du Colombier 	switch(a->len){
117*ccaec48aSDavid du Colombier 	default:
118*ccaec48aSDavid du Colombier 		abort();
119*ccaec48aSDavid du Colombier 	case 1:
120*ccaec48aSDavid du Colombier 		return (char)w;
121*ccaec48aSDavid du Colombier 	case 2:
122*ccaec48aSDavid du Colombier 		return (short)w;
123*ccaec48aSDavid du Colombier 	case 4:
124*ccaec48aSDavid du Colombier 		return (long)w;
125*ccaec48aSDavid du Colombier 	}
126*ccaec48aSDavid du Colombier }
127*ccaec48aSDavid du Colombier 
128*ccaec48aSDavid du Colombier void
aw(Iarg * a,ulong w)129*ccaec48aSDavid du Colombier aw(Iarg *a, ulong w)
130*ccaec48aSDavid du Colombier {
131*ccaec48aSDavid du Colombier 	ulong *p, o;
132*ccaec48aSDavid du Colombier 	Cpu *cpu;
133*ccaec48aSDavid du Colombier 	Bus *io;
134*ccaec48aSDavid du Colombier 
135*ccaec48aSDavid du Colombier 	cpu = a->cpu;
136*ccaec48aSDavid du Colombier 	switch(a->tag){
137*ccaec48aSDavid du Colombier 	default:
138*ccaec48aSDavid du Colombier 		abort();
139*ccaec48aSDavid du Colombier 	case TMEM:
140*ccaec48aSDavid du Colombier 		o = ((a->seg<<4) + (a->off & 0xFFFF)) & 0xFFFFF;
141*ccaec48aSDavid du Colombier 		io = cpu->mem + (o>>16);
142*ccaec48aSDavid du Colombier 		io->w(io->aux, o, w, a->len);
143*ccaec48aSDavid du Colombier 		break;
144*ccaec48aSDavid du Colombier 	case TREG:
145*ccaec48aSDavid du Colombier 		p = cpu->reg + a->reg;
146*ccaec48aSDavid du Colombier 		switch(a->len){
147*ccaec48aSDavid du Colombier 		case 4:
148*ccaec48aSDavid du Colombier 			*p = w;
149*ccaec48aSDavid du Colombier 			break;
150*ccaec48aSDavid du Colombier 		case 2:
151*ccaec48aSDavid du Colombier 			*p = (*p & ~0xFFFF) | (w & 0xFFFF);
152*ccaec48aSDavid du Colombier 			break;
153*ccaec48aSDavid du Colombier 		case 1:
154*ccaec48aSDavid du Colombier 			*p = (*p & ~0xFF) | (w & 0xFF);
155*ccaec48aSDavid du Colombier 			break;
156*ccaec48aSDavid du Colombier 		}
157*ccaec48aSDavid du Colombier 		break;
158*ccaec48aSDavid du Colombier 	case TREG|TH:
159*ccaec48aSDavid du Colombier 		p = cpu->reg + a->reg;
160*ccaec48aSDavid du Colombier 		*p = (*p & ~0xFF00) | (w & 0xFF)<<8;
161*ccaec48aSDavid du Colombier 		break;
162*ccaec48aSDavid du Colombier 	}
163*ccaec48aSDavid du Colombier }
164