/* IO.c ---- Definitions for XPR_IO-functions (C) 1990 Oliver Wagner, All Rights Reserved */ #include #include #include #include #include #define print(s) Write(Output(),s,strlen(s)) #include "xproto.h" void plog(char,char*,...); /* external Intuition functions */ extern int xpr_opendisplay(void); extern int xpr_closedisplay(void); extern int xpr_displayupdate(struct XPR_IO*); extern int xpr_chk4abort(void); extern long xpr_windowsig; /* Global IO-Request for XPR */ extern struct IOExtSer *xpr_serio; /* external filename array */ extern char *xprfilearray[]; /* static Data */ static struct timerequest treq; static struct MsgPort *tport; static char timeropen; extern short nowindow; /* The timer functions */ static long opentimer(void) { tport=CreatePort(0,0); if(!tport) return(-1); treq.tr_node.io_Message.mn_ReplyPort=tport; if(OpenDevice("timer.device",UNIT_VBLANK,&treq,0)) return(-1); timeropen=1; return(0); } static void closetimer(void) { if(timeropen) CloseDevice(&treq); if(tport) DeletePort(tport); } static void qtimer(long micros) { int secs=0; if (micros > 1000000) { secs = micros / 1000000; micros = micros % 1000000; } treq.tr_time.tv_micro=micros; treq.tr_time.tv_secs=secs; treq.tr_node.io_Command=TR_ADDREQUEST; /* printf("QTIMER s=%ld m=%ld\n",secs,micros);*/ SendIO(&treq); } /* the finfo-function */ static long __saveds xpr_finfo(char *name,long type) { struct FileInfoBlock *fib=AllocMem(sizeof(struct FileInfoBlock),0); BPTR lck; long result=0; plog('+',"FINFO: %s (%ld)\n",name,type); if(!fib) return(0); if(!(lck=Lock(name,SHARED_LOCK))) goto xit; Examine(lck,fib); UnLock(lck); result=fib->fib_Size; if(type==2) result=1; else if(type!=1) result=0; xit: FreeMem(fib,sizeof(struct FileInfoBlock)); /* printf("result=%ld\n",result);*/ return(result); } /* the serwrite function */ static long __saveds xpr_swrite(char *buffer,long size) { /* printf("SWRITE: buffer=%lx size=%ld\n",buffer,size);*/ xpr_serio->IOSer.io_Length=size; xpr_serio->IOSer.io_Data=buffer; xpr_serio->IOSer.io_Command=CMD_WRITE; DoIO(xpr_serio); return((long)xpr_serio->IOSer.io_Error); } long chk4cd(void) { xpr_serio->IOSer.io_Command=SDCMD_QUERY; DoIO(xpr_serio); return(!(xpr_serio->io_Status&(1<<5))); } /* the serread function */ static long __saveds xpr_sread(char *buffer,long size,long timeout) { long flag=xpr_windowsig|(1<IOSer.io_Message.mn_ReplyPort->mp_SigBit); long len,nflag; /*printf("SREAD() buffer=%lx size=%ld timeout=%ld\n",buffer,size,timeout);*/ SetSignal(0,flag); if(timeout) { flag|=1<mp_SigBit; /*printf("Starting timer...\n");*/ qtimer(timeout); } else { xpr_serio->IOSer.io_Command=SDCMD_QUERY; DoIO(xpr_serio); if(!(len=xpr_serio->IOSer.io_Actual)) return(0); else { if(len>size) len=size; xpr_serio->IOSer.io_Command=CMD_READ; xpr_serio->IOSer.io_Data=buffer; xpr_serio->IOSer.io_Length=len; DoIO(xpr_serio); /*printf("Fastread return %ld\n",xpr_serio->IOSer.io_Actual);*/ return((long)xpr_serio->IOSer.io_Actual); } } SetSignal(0,flag); xpr_serio->IOSer.io_Command=CMD_READ; xpr_serio->IOSer.io_Data=buffer; xpr_serio->IOSer.io_Length=size; SendIO(xpr_serio); nflag=Wait(flag); if(nflag&xpr_windowsig) { AbortIO(&treq); AbortIO(xpr_serio); WaitIO(&treq); WaitIO(xpr_serio); return(-1); } if(nflag&(1<IOSer.io_Message.mn_ReplyPort->mp_SigBit)) { AbortIO(&treq); WaitIO(xpr_serio); WaitIO(&treq); /*printf("Normal read returns %ld (error %ld)\n",xpr_serio->IOSer.io_Actual,(long)xpr_serio->IOSer.io_Error);*/ return((long)xpr_serio->IOSer.io_Actual); } /*printf("TIMEOUT:\n");*/ AbortIO(xpr_serio); WaitIO(&treq); WaitIO(xpr_serio); return((long)xpr_serio->IOSer.io_Actual); } /* sflush - flushes serial port */ static long __saveds xpr_sflush(void) { xpr_serio->IOSer.io_Command=CMD_FLUSH; DoIO(xpr_serio); return((long)xpr_serio->IOSer.io_Error); } /* setserial; stolen from TERM by Olsen */ #define ST_PARTYON (1 << 0) #define ST_PARTYODD (1 << 1) #define ST_7WIRE (1 << 2) #define ST_QBREAK (1 << 3) #define ST_RADBOOGIE (1 << 4) #define ST_SHARED (1 << 5) #define ST_EOFMODE (1 << 6) #define ST_XDISABLED (1 << 7) #define ST_PARTYMARKON (1 << 8) #define ST_PARTYMARK (1 << 9) #define ST_2BITS (1 << 10) #define ST_READ7 (1 << 11) #define ST_WRITE7 (1 << 12) static long __saveds xpr_setserial(long Status) { STATIC LONG XprBauds[12] = { 110, 300, 1200, 2400, 4800, 9600, 19200, 31250, 38400, 57600, 76800, 115200 }; LONG Return,i; xpr_serio -> IOSer . io_Command = SDCMD_QUERY; DoIO(xpr_serio); Return = xpr_serio -> io_SerFlags & 0xFF; if(xpr_serio -> io_ExtFlags & SEXTF_MSPON) Return |= ST_PARTYMARKON; if(xpr_serio -> io_ExtFlags & SEXTF_MARK) Return |= ST_PARTYMARK; if(xpr_serio -> io_StopBits == 2) Return |= ST_2BITS; if(xpr_serio -> io_ReadLen == 7) Return |= ST_READ7; if(xpr_serio -> io_WriteLen == 7) Return |= ST_WRITE7; for(i = 0 ; i < 12 ; i++) { if(xpr_serio -> io_Baud == XprBauds[i]) { Return |= (i << 16); break; } } if(Status != -1) { xpr_serio -> IOSer . io_Command = SDCMD_SETPARAMS; xpr_serio -> io_SerFlags = Status & 0xFF; xpr_serio -> io_ExtFlags = 0; if(Status & ST_PARTYMARKON) xpr_serio -> io_ExtFlags |= SEXTF_MSPON; if(Status & ST_PARTYMARK) xpr_serio -> io_ExtFlags |= SEXTF_MARK; if(Status & ST_2BITS) xpr_serio -> io_StopBits = 2; else xpr_serio -> io_StopBits = 1; if(Status & ST_READ7) xpr_serio -> io_ReadLen = 7; else xpr_serio -> io_ReadLen = 8; if(Status & ST_WRITE7) xpr_serio -> io_WriteLen = 7; else xpr_serio -> io_WriteLen = 8; DoIO(xpr_serio); } return(Return); } /* EOT [end of theft] */ /* The ffirst() and ffnext() functions */ static long __saveds xpr_ffirst(char *buffer,char *pattern) { strcpy(buffer,xprfilearray[0]); plog('+',"FFIRST: returning %s\n",buffer); return(1); } static long __saveds xpr_fnext(long oc,char *buffer,char *pattern) { if(!xprfilearray[oc]) { plog('+',"FNEXT: end of array\n"); return(0); } else { strcpy(buffer,xprfilearray[oc++]); plog('+',"FNEXT: returning %s\n",buffer); return(oc); } } static long __saveds xpr_gets(char*b,char*p) { /* print("GETS: ");print(b);print(" - ");print(p);print("\n");*/ return(0); } /* the stub routines for a4 loading :-( */ static long __saveds xpr_fopen(char*a1,char*a2) { long h; plog('+',"FOPEN: %s,'%s'\n",a1,a2); switch(*a2) { case 'r': return(Open(a1,MODE_OLDFILE)); case 'w': return(Open(a1,MODE_NEWFILE)); case 'a': if(h=Open(a1,MODE_OLDFILE)) { Seek(h,0,OFFSET_END); return(h); } return(Open(a1,MODE_NEWFILE)); } return(0); } static long __saveds xpr_fclose(long *a1) { if(a1) Close(a1); return(0); } static long __saveds xpr_fread(char*a1,long a2,long a3,long*fpt) { /* printf("fread(%lx,%ld,%ld,%lx)\n",a1,a2,a3,fpt);*/ if(!a2) return(0); return(Read(fpt,a1,a2*a3)); } static long __saveds xpr_fwrite(char*a1,long a2,long a3,long*fpt) { /* printf("fwrite(%lx,%ld,%ld,%lx)\n",a1,a2,a3,fpt);*/ if(!a2) return(0); return(Write(fpt,a1,a2*a3)); } static long __saveds xpr_fseek(long*a1,long a2,long a3) { long h=-1; /* printf("fseek(%lx,%ld,%ld)\n",a1,a2,a3);*/ switch(a3) { case 0: h=OFFSET_BEGINNING; break; case 1: h=OFFSET_CURRENT; break; case 2: h=OFFSET_END; break; default: return(-1); } return((Seek(a1,a2,h)!=-1)?0:-1); } static long __saveds xpr_unlink(char*a1) { plog('+',"UNLINK: %s\n",a1); return(DeleteFile(a1)); } /* init the xprIO and build everything */ long init_xpr(struct XPR_IO *IO) { IO->xpr_fopen = xpr_fopen; IO->xpr_fclose = xpr_fclose; IO->xpr_fread = xpr_fread; IO->xpr_fwrite = xpr_fwrite; IO->xpr_sread = xpr_sread; IO->xpr_swrite = xpr_swrite; IO->xpr_sflush = xpr_sflush; IO->xpr_update = xpr_displayupdate; IO->xpr_chkabort = xpr_chk4abort; IO->xpr_setserial = xpr_setserial; IO->xpr_ffirst = xpr_ffirst; IO->xpr_fnext = xpr_fnext; IO->xpr_finfo = xpr_finfo; IO->xpr_fseek = xpr_fseek; IO->xpr_gets = xpr_gets; IO->xpr_unlink = xpr_unlink; /* xpr_sflush();*/ if(xpr_opendisplay()) return(-1); return(opentimer()); } void close_xpr(void) { xpr_closedisplay(); closetimer(); }