proto-expanded
auproto-*
gui-plan-bot
+selectors.h
layoutinfo.h: ../layout/ours.layout-data.c Makefile
sed -e '/^#include/,$$d' $< $o
-%.c: layoutinfo.h
+selectors.h: selectors.h.gen
+ ./$< $o
+
+%.c: layoutinfo.h selectors.h
safety: safety.o utils.o trackloc.o ../layout/ours.layout-data.o
$(LINK)
clean:
- rm -f *.o *.d $(TARGETS)
+ rm -f *.o *.d $(TARGETS) selectors.h
include $(wildcard *.d)
}
static void new_client(int fd, OutBufferError error,
- char *desc, const char *default_selectors) {
+ char *desc, Selector default_selectors) {
Client *cl;
int r;
cl= mmalloc(sizeof(*cl));
- cl->selectors= mstrdup(default_selectors);
+ cl->sel= default_selectors;
cl->ch.desc= desc;
cl->ch.fd= fd;
cl->ch.error= error;
}
void stdin_client(void) {
- new_client(0, stdin_error, (char*)"stdin", "pP");
+ new_client(0, stdin_error, (char*)"stdin", sel_picio|sel_picioh);
}
const PicInsnInfo *pii;
PicInsn pi;
long arg;
+
+ if (ps->remain && ps->remain[0]=='=') {
+ ps->remain++;
+ pi.l= sizeof(pi.d);
+ if (!ps_needhextoend(ps, pi.d, &pi.l)) return;
+ } else {
+ pii= some_needword_lookup(ps,pic_command_infos,"pic command");
+ if (!pii) return;
- pii= some_needword_lookup(ps,pic_command_infos,"pic command");
- if (!pii) return;
-
- if (pii->argbits) {
- if (!ps_neednumber(ps, &arg, 0, (1L << pii->argbits) - 1,
- "pic object number"))
+ if (pii->argbits) {
+ if (!ps_neednumber(ps, &arg, 0, (1L << pii->argbits) - 1,
+ "pic object number"))
+ return;
+ } else {
+ arg= 0;
+ }
+ if (!ps_neednoargs(ps))
return;
- } else {
- arg= 0;
+ enco_pic_anyinsn(&pi, pii, arg);
}
- if (!ps_neednoargs(ps))
- return;
- enco_pic_anyinsn(&pi, pii, arg);
serial_transmit(&pi);
}
/*---------- from output.c ----------*/
-typedef char Selector;
+typedef unsigned long Selector;
+#include "selectors.h"
void oovprintf(Selector sel, const char *fmt, va_list al)
__attribute__((format(printf,2,0)));
struct Client {
OutBufferChain ch;
Client *back, *next;
- char *selectors;
+ Selector sel;
oop_read *rd;
};
#include "hostside.h"
#include "auproto-pic.h"
-#define FOR_OOS(s) do{ \
- Client *cl, *next_cl; \
- for (cl= clients.head; \
- cl; \
- cl= next_cl) { \
- OutBufferChain *ch= &cl->ch; \
- next_cl= cl->next; \
- if (!strchr(cl->selectors, sel)) continue; \
- s; \
- } \
+#define FOR_OOS(s) do{ \
+ Client *cl, *next_cl; \
+ for (cl= clients.head; \
+ cl; \
+ cl= next_cl) { \
+ OutBufferChain *ch= &cl->ch; \
+ next_cl= cl->next; \
+ if (!(sel & cl->sel)) continue; \
+ s; \
+ } \
}while(0)
void oovprintf(Selector sel, const char *fmt, va_list al) {
void serial_transmit(const PicInsn *pi) {
const PicInsnInfo *pii;
- pii= lookup_byopcode(pi->d[0], pic_command_infos);
- if (!pii) {
- ooprintf('p', "pic-out unknown\n");
- } else {
+ unsigned val;
+
+ pii= pi->l > 0 ? lookup_byopcode(pi->d[0], pic_command_infos) : 0;
+
+ if (pii) {
+ val= pi->d[0];
+ if (pii->argbits <= 6) {
+ if (pi->l != 1) pii= 0;
+ } else {
+ if (pi->l == 2) { val <<= 8; val |= pi->d[1]; }
+ else pii= 0;
+ }
}
- output_hex('P', "pic-out-h", pi->d, pi->l);
+
+ if (!pii)
+ ooprintf(sel_picio, "picio out unknown\n");
+ else if (!pii->argbits)
+ ooprintf(sel_picio, "picio out %s\n", pii->name);
+ else
+ ooprintf(sel_picio, "picio out %s %u\n", pii->name,
+ val & ((1u << pii->argbits) - 1));
+
+ output_hex(sel_picioh, "picioh out", pi->d, pi->l);
serial_transmit_now(pi->d, pi->l);
}
return 1;
}
-int ps_needhextoend(ParseState *ps, Byte *d, int *remain_io) {
- Byte *d_end;
+int ps_needhextoend(ParseState *ps, Byte *d, int *len_io) {
+ Byte *d_begin, *d_end;
char buf[3], *ep;
- d_end= d + *remain_io;
+ d_begin= d;
+ d_end= d + *len_io;
buf[2]= 0;
if (!ps->remain) { badcmd(ps,"need hex data block"); return 0; }
for (;;) {
- if (!ps_word(ps)) return 0;
+ if (!ps_word(ps)) break;
while (ps->lthisword > 0) {
if (ps->lthisword & 1) {
badcmd(ps,"hex data block with odd number of digits in part");
}
}
- *remain_io= d_end - d;
+ *len_io= d - d_begin;
return 1;
}
--- /dev/null
+#!/usr/bin/perl
+$bit= 1;
+foreach $f (qw(
+ picio
+ picioh
+ )) {
+ printf "#define sel_%-10s 0x%08lxLU\n", $f, $bit;
+ $bit <<= 1;
+}