chiark / gitweb /
sane handling of incoming detections
[trains.git] / hostside / startup.c
index 2e9ed335067b290c5cd6b13de13f3530d428e11b..f6a318ce030eac1a77b4b8600a12bf037e6b32a0 100644 (file)
@@ -207,10 +207,23 @@ void on_pic_spurious(const PicInsnInfo *pii, const PicInsn *pi, int objnum) {
          " detection interrupts\"", objnum);
 }
 
-void on_pic_detect1(const PicInsnInfo *pii, const PicInsn *pi, int segn) {
-  Segment *seg;
-  if (segn >= NUM_SEGMENTS) die("PIC sent detect @#%#x out of range",segn);
+static SegmentNum on_pic_detect_prep(int detyn, int objnum) {
+  SegmentNum segn;
+
+  if (objnum >= info_segmentmaplen ||
+      (segn= info_segmentmap[objnum]) < 0)
+    die("PIC sent detect%d @#%#x not in map",detyn,objnum);
 
+  oprintf(UPO,"picio in detect%d %s\n",detyn,info_segments[segn].pname);
+
+  return segn;
+}
+
+void on_pic_detect1(const PicInsnInfo *pii, const PicInsn *pi, int objnum) {
+  SegmentNum segn;
+  Segment *seg;
+  
+  segn= on_pic_detect_prep(1,objnum);
   seg= &segments[segn];
   
   switch (sta_state) {
@@ -239,6 +252,7 @@ void on_pic_nmradone(const PicInsnInfo *pii, const PicInsn *pi, int objnum) {
 }
 
 void on_pic_detect0(const PicInsnInfo *pii, const PicInsn *pi, int objnum) {
+  on_pic_detect_prep(0,objnum);
 }
 
 void choreographers_all_abandon(void) { }