13e12c5d1SDavid du Colombier /*
23e12c5d1SDavid du Colombier * code to keep track of registers
33e12c5d1SDavid du Colombier */
43e12c5d1SDavid du Colombier
53e12c5d1SDavid du Colombier #include "defs.h"
63e12c5d1SDavid du Colombier #include "fns.h"
73e12c5d1SDavid du Colombier
83e12c5d1SDavid du Colombier /*
9219b2ee8SDavid du Colombier * translate a name to a magic register offset
103e12c5d1SDavid du Colombier */
11219b2ee8SDavid du Colombier Reglist*
rname(char * name)12219b2ee8SDavid du Colombier rname(char *name)
133e12c5d1SDavid du Colombier {
143e12c5d1SDavid du Colombier Reglist *rp;
153e12c5d1SDavid du Colombier
16219b2ee8SDavid du Colombier for (rp = mach->reglist; rp->rname; rp++)
17219b2ee8SDavid du Colombier if (strcmp(name, rp->rname) == 0)
18219b2ee8SDavid du Colombier return rp;
19219b2ee8SDavid du Colombier return 0;
203e12c5d1SDavid du Colombier }
21219b2ee8SDavid du Colombier
22*4de34a7eSDavid du Colombier static uvlong
getreg(Map * map,Reglist * rp)23219b2ee8SDavid du Colombier getreg(Map *map, Reglist *rp)
24219b2ee8SDavid du Colombier {
25*4de34a7eSDavid du Colombier uvlong v;
26*4de34a7eSDavid du Colombier ulong w;
27*4de34a7eSDavid du Colombier ushort s;
28219b2ee8SDavid du Colombier int ret;
29219b2ee8SDavid du Colombier
307dd7cddfSDavid du Colombier v = 0;
31219b2ee8SDavid du Colombier ret = 0;
32219b2ee8SDavid du Colombier switch (rp->rformat)
33219b2ee8SDavid du Colombier {
34219b2ee8SDavid du Colombier case 'x':
35*4de34a7eSDavid du Colombier ret = get2(map, rp->roffs, &s);
36*4de34a7eSDavid du Colombier v = s;
37219b2ee8SDavid du Colombier break;
38219b2ee8SDavid du Colombier case 'f':
397dd7cddfSDavid du Colombier case 'X':
40*4de34a7eSDavid du Colombier ret = get4(map, rp->roffs, &w);
417dd7cddfSDavid du Colombier v = w;
427dd7cddfSDavid du Colombier break;
43219b2ee8SDavid du Colombier case 'F':
447dd7cddfSDavid du Colombier case 'W':
457dd7cddfSDavid du Colombier case 'Y':
467dd7cddfSDavid du Colombier ret = get8(map, rp->roffs, &v);
47219b2ee8SDavid du Colombier break;
48219b2ee8SDavid du Colombier default:
49219b2ee8SDavid du Colombier werrstr("can't retrieve register %s", rp->rname);
50219b2ee8SDavid du Colombier error("%r");
51219b2ee8SDavid du Colombier }
52219b2ee8SDavid du Colombier if (ret < 0) {
53219b2ee8SDavid du Colombier werrstr("Register %s: %r", rp->rname);
54219b2ee8SDavid du Colombier error("%r");
55219b2ee8SDavid du Colombier }
567dd7cddfSDavid du Colombier return v;
57219b2ee8SDavid du Colombier }
58219b2ee8SDavid du Colombier
59*4de34a7eSDavid du Colombier uvlong
rget(Map * map,char * name)60219b2ee8SDavid du Colombier rget(Map *map, char *name)
61219b2ee8SDavid du Colombier {
62219b2ee8SDavid du Colombier Reglist *rp;
63219b2ee8SDavid du Colombier
64219b2ee8SDavid du Colombier rp = rname(name);
65219b2ee8SDavid du Colombier if (!rp)
66219b2ee8SDavid du Colombier error("invalid register name");
67219b2ee8SDavid du Colombier return getreg(map, rp);
683e12c5d1SDavid du Colombier }
693e12c5d1SDavid du Colombier
703e12c5d1SDavid du Colombier void
rput(Map * map,char * name,vlong v)717dd7cddfSDavid du Colombier rput(Map *map, char *name, vlong v)
72219b2ee8SDavid du Colombier {
73219b2ee8SDavid du Colombier Reglist *rp;
74219b2ee8SDavid du Colombier int ret;
75219b2ee8SDavid du Colombier
76219b2ee8SDavid du Colombier rp = rname(name);
77219b2ee8SDavid du Colombier if (!rp)
78219b2ee8SDavid du Colombier error("invalid register name");
79219b2ee8SDavid du Colombier if (rp->rflags & RRDONLY)
80219b2ee8SDavid du Colombier error("register is read-only");
81219b2ee8SDavid du Colombier switch (rp->rformat)
82219b2ee8SDavid du Colombier {
83219b2ee8SDavid du Colombier case 'x':
847dd7cddfSDavid du Colombier ret = put2(map, rp->roffs, (ushort) v);
85219b2ee8SDavid du Colombier break;
86219b2ee8SDavid du Colombier case 'X':
87219b2ee8SDavid du Colombier case 'f':
88219b2ee8SDavid du Colombier case 'F':
897dd7cddfSDavid du Colombier ret = put4(map, rp->roffs, (long) v);
907dd7cddfSDavid du Colombier break;
917dd7cddfSDavid du Colombier case 'Y':
927dd7cddfSDavid du Colombier ret = put8(map, rp->roffs, v);
93219b2ee8SDavid du Colombier break;
94219b2ee8SDavid du Colombier default:
95219b2ee8SDavid du Colombier ret = -1;
96219b2ee8SDavid du Colombier }
97219b2ee8SDavid du Colombier if (ret < 0)
98219b2ee8SDavid du Colombier error("can't write register");
99219b2ee8SDavid du Colombier }
1003e12c5d1SDavid du Colombier /*
1013e12c5d1SDavid du Colombier * print the registers
1023e12c5d1SDavid du Colombier */
1033e12c5d1SDavid du Colombier void
printregs(int c)1043e12c5d1SDavid du Colombier printregs(int c)
1053e12c5d1SDavid du Colombier {
1063e12c5d1SDavid du Colombier Reglist *rp;
1073e12c5d1SDavid du Colombier int i;
108*4de34a7eSDavid du Colombier uvlong v;
1093e12c5d1SDavid du Colombier
1103e12c5d1SDavid du Colombier for (i = 1, rp = mach->reglist; rp->rname; rp++, i++) {
111219b2ee8SDavid du Colombier if ((rp->rflags & RFLT)) {
112219b2ee8SDavid du Colombier if (c != 'R')
1133e12c5d1SDavid du Colombier continue;
114219b2ee8SDavid du Colombier if (rp->rformat == '8' || rp->rformat == '3')
115219b2ee8SDavid du Colombier continue;
116219b2ee8SDavid du Colombier }
117*4de34a7eSDavid du Colombier v = getreg(cormap, rp);
1187dd7cddfSDavid du Colombier if(rp->rformat == 'Y')
119*4de34a7eSDavid du Colombier dprint("%-8s %-20#llux", rp->rname, v);
1207dd7cddfSDavid du Colombier else
121*4de34a7eSDavid du Colombier dprint("%-8s %-12#lux", rp->rname, (ulong)v);
1223e12c5d1SDavid du Colombier if ((i % 3) == 0) {
1233e12c5d1SDavid du Colombier dprint("\n");
1243e12c5d1SDavid du Colombier i = 0;
1253e12c5d1SDavid du Colombier }
1263e12c5d1SDavid du Colombier }
1273e12c5d1SDavid du Colombier if (i != 1)
1283e12c5d1SDavid du Colombier dprint("\n");
129219b2ee8SDavid du Colombier dprint ("%s\n", machdata->excep(cormap, rget));
1303e12c5d1SDavid du Colombier printpc();
1313e12c5d1SDavid du Colombier }
132