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