;D:KIO.ACT ›; I/O routines for kermit›; (C) 1983 John Howard Palevich››DEFINE STRING = "BYTE ARRAY"››STRING iocb›CARD filenumber››STRING dname(20), fname(20)››;WAIT T 60THS OF A SECOND››PROC WAIT(INT T)› BYTE I› WHILE T > 255› DO› I = RTCLOCK-1› WHILE I <> RTCLOCK DO OD› T ==- 255› OD› I = RTCLOCK + T› WHILE I <> RTCLOCK DO OD› RETURN››PROC STRCPY(STRING A, B)› CARD I› FOR I = 1 TO B(0) DO› A(I) = B(I)› OD› A(0) = B(0)› RETURN››BYTE FUNC MStatus(BYTE ch)› iocb = $340 + ch LSH 4› RETURN (iocb(3))››PROC CIO=$E456(BYTE a, x)››PROC CIOV(BYTE ch, cmd› CARD adr, len› INT ax1, ax2)›› iocb = $340 + ch LSH 4› iocb(2) = cmd› iocb(4) = adr › iocb(5) = adr RSH 8› iocb(8) = len› iocb(9) = len RSH 8› IF ax1 >= 0 THEN› iocb(10) = ax1› FI› IF ax2 >= 0 THEN› iocb(11) = ax2› FI›› CIO(0, CH * 16)› RETURN››;Do a Get Status Command›BYTE FUNC MDevStat(BYTE ch› STRING adr)› CIOV( ch, $0D,› adr + 1, adr(0), -1, -1)› RETURN(iocb(3))››; -- file locking, unlocking, etc.›; -- directory hacking functions››;Returns 0 if EOF, else the file name›CARD FUNC GetNext(CHAR ch)› INT I, J› STRING DSPEC(20)› Close(ch)› Open(ch, dname, 6, 0)› IF mstatus(ch) >= 128› THEN› RETURN(0)› FI›› FOR i = 0 TO filenumber› DO› INPUTMD(ch, DSPEC, 20)› IF mstatus(ch) >= 128 THEN› Close(ch)› RETURN(0)› FI› OD› IF DSPEC(0) <> 17 THEN RETURN(0) FI› filenumber ==+ 1› Close(ch)› ;Convert dspec into file name› I = 1› DO› FNAME(I) = DNAME(I)› I ==+ 1› UNTIL› DNAME(I-1) = ':› OD›› J = 3› DO› FNAME(I) = DSPEC(J)› I ==+ 1› J ==+ 1› UNTIL› J > 10 OR DSPEC(J) = 32› OD› FNAME(I) = '.› I ==+ 1› J = 11› WHILE› J <= 13 AND DSPEC(J) <> 32› DO› FNAME(I) = DSPEC(J)› I ==+ 1› J ==+ 1› OD›› FNAME(0) = I-1› RETURN(fname)››;Get the first name››CARD FUNC GetFirst(BYTE ch› STRING name)›› STRCPY(dname, NAME)› filenumber = 0› RETURN(GetNext(ch))››;FIND CHAR C IN STRING A››BYTE FUNC FindC(STRING a› BYTE c)› CARD i,l› l = a(0)› FOR i = 1 TO l DO› IF a(i) = c THEN› EXIT› FI› OD› RETURN(i)››;Normalize a file name string to Dn:<0..8>.<0..3>›;where n is the value of diskn›;name should be at least 3+8+1+3+2=17 bytes long›;returns 0 if not a valid name››BYTE FUNC Normalize(STRING name)› CARD i, len› BYTE C››› len = name(0)› IF len = 0 THEN› RETURN(0)› FI››;first, check if ():›› i = FindC(name,':)› IF i > len THEN› FOR i = 1 TO len DO› name(len-i+4) = name(len-i+1)› OD› name(1) = 'D› name(2) = '0 + DISKN› name(3) = ':› len ==+ 3› FI››;fixup length› name(0) = len››;and convert to upper case›› FOR i = 1 TO len DO› c = name(i)› IF c >= 'a AND c <= 'z THEN› name(i) = c - 32› FI› OD›› RETURN(1)››BYTE FUNC INSET(BYTE C STRING S)› CARD I› FOR I = 1 TO S(0)› DO› IF C = S(I) THEN› RETURN(I)› FI› OD› RETURN(0)››; --- END OF D:KIO.ACT››