/* * mbx-inbyte.c -- inbyte function for targets using the eppcbug monitor * * Copyright (c) 1998 Cygnus Support * * The authors hereby grant permission to use, copy, modify, distribute, * and license this software and its documentation for any purpose, provided * that existing copyright notices are retained in all copies and that this * notice is included verbatim in any distributions. No written agreement, * license, or royalty fee is required for any of the authorized uses. * Modifications to this software may be copyrighted by their authors * and need not follow the licensing terms described here, provided that * the new terms are clearly indicated on the first page of each file where * they apply. */ #include "ppc-asm.h" int inbyte(void) { struct { unsigned clun; unsigned dlun; char *data; unsigned len; unsigned rsrvd; char buf[4]; } ipb, *inpb; struct { int status; int cnt; } opb, *outpb; inpb = &ipb; outpb = &opb; do { inpb->clun = 0; inpb->dlun = 0; inpb->data = ipb.buf; inpb->len = 1; inpb->rsrvd = 0; asm volatile ( "mr 3,%0\n" "mr 4,%1\n" "li 10,0x200\n" "sc" : /* no outputs */ : "r" (inpb), "r" (outpb) : "3", "4", "10" ); } while (outpb->status == 0 && outpb->cnt == 0); if (outpb->status == 0) return ipb.buf[0] & 0xff; return -1; }