t & ! 6010 GOSUB 10000 7000 ! & !another account & ! 7010 GOTO 3000 8000 ! & !another disk & ! 8010 GOTO 1000 9000 ! & !normal exit & ! 9010 CLOSE #1% 9990 GOTO 32767 10000 ! & ! & ! SUBROUTINE: Data from GFD & ! & ! & !save the cluster map & ! 10010 FOR I% = 0% TO 7% 10020 CLUSTER.MAP%(I%) = FNWORD%(249%+I%) & !these are the last eight words of the block 10030 NEXT I% 10100 ! & !get correct cluster, block and offset for this link & ! 10110 OFFSET% = FNLINK%(LINK.NB%) \ & !the function GETs the right cluster and finds the offset \ & BYTE.OFFSET% = OFFSET% \ & WORD.OFFSET% = OFFSET%/2% 10200 ! & !save the values of the other links (in case we leave this & !cluster) & ! 10210 LINK.DTB% = FNWORD%(WORD.OFFSET% + 0%) 10220 LINK.AB% = FNWORD%(WORD.OFFSET% + 6%) 10300 ! & !data from the name blockette & ! 10310 PROJ% = FNBYTE%(BYTE.OFFSET% + 3%) \ & PROG% = FNBYTE%(BYTE.OFFSET% + 2%) \ & PRINT "Account [";PROJ%;",";PROG%;"]" 10320 PROT% = FNBYTE%(BYTE.OFFSET% + 9%) \ & PRINT "Protection:";PROT% 10330 STAT% = FNBYTE%(BYTE.OFFSET% + 8%) \ & PRINT "Status";STAT% 10340 LOGINS% = FNBYTE%(BYTE.OFFSET% + 11%) \ & PRINT "Logins:";LOGINS% 10350 OPENS% = FNBYTE%(BYTE.OFFSET% + 10%) \ & PRINT "Opens:";OPENS% 10360 DCN.UFD% = FNWORD%(WORD.OFFSET% + 7%) \ & PRINT "DCN of UFD is"; DCN.UFD% 10400 ! & !data from accounting blockette & !(only some of the data is being printed) & ! 10410 OFFSET% = FNLINK%(LINK.AB%) \ & !the function GETs the right cluster and finds the offset \ & WORD.OFFSET% = OFFSET%/2% 10420 CONNECT% = FNWORD%(WORD.OFFSET% + 2%) \ & PRINT \ & PRINT "Connect time is "; FNTIME$(CONNECT%) 10430 QUOTA% = FNWORD%(WORD.OFFSET% + 6%) \ & PRINT "Quota:";QUOTA% 10500 ! & !data from date/time blockette & !(including link to password blockette) & ! 10510 OFFSET% = FNLINK%(LINK.DTB%) \ & !the function GETs the correct cluster and finds the offset \ & BYTE.OFFSET% = OFFSET% \ & WORD.OFFSET% = OFFSET%/2% 10520 KB.LAST% = FNBYTE%(BYTE.OFFSET% + 3%) 10530 IF KB.LAST% <> 0% & THEN PRINT "Last signed in at KB"; NUM1$(KB.LAST%);":"; \ & PRINT " on ";DATE$(FNWORD%(WORD.OFFSET% + 2%)); \ & PRINT " at ";TIME$(FNWORD%(WORD.OFFSET% + 3%)) 10540 LINK.PB% = FNWORD%(WORD.OFFSET% + 0%) 10600 ! & !data from password blockette & ! 10610 OFFSET% = FNLINK%(LINK.PB%) \ & !the function GETs the correct cluster and finds the offset \ & BYTE.OFFSET% = OFFSET% 10620 PASS$ = CHR$( FNBYTE%(BYTE.OFFSET% + 3%) ) 10630 FOR I% = 4% TO 15% 10640 PASS$ = PASS$ + CHR$( FNBYTE%(BYTE.OFFSET% + I%) ) 10650 NEXT I% 10660 !PRINT \ & !PRINT "Password: "; PASS$ 10700 ! & !print a couple of blank lines & ! 10710 PRINT \ PRINT 10900 ! & !return & ! 10990 RETURN 18000 ! & ! & ! FUNCTIONS & ! & ! 18100 ! & !pull a word from the buffer & !for convenience, the words are numbered as words even though & !the buffer is character (and hence byte) oriented. Words are & !normally numbered starting at zero, but the characters in the & !buffer must be numbered starting at one, so another adjustment & !is needed. & ! 18110 DEF* FNWORD%(W%) 18120 FIRSTBYTE% = W% * 2% + 1% 18180 FNWORD% = ASCII( MID(BUFF$,FIRSTBYTE% ,1%) ) & + SWAP%( ASCII( MID(BUFF$,FIRSTBYTE%+1%,1%) ) ) 18190 FNEND 18200 ! & !pull a byte from the buffer & !Since the bytes are generally numbered starting at zero but & !the characters are numbered begining at one, an adjustment is & !needed. & ! 18210 DEF* FNBYTE%(B%) 18280 FNBYTE% = ASCII(MID(BUFF$,B%+1%,1%)) 18290 FNEND 18300 ! & !convert a link & !If the link indicates another cluster, the correct cluster is & !GETed by the functioGFD BAS[.050020]GFD .BAS[.050020]    X14|H [4;Ik(&'( k ߫H&P` \RrPP2PPzPP{PPPPP2P~\$\\TD 0D \~ hi) +\ ^( n ^( np\^txY\^ˀ\!kVk<\F˰<˴ˬ\VVkˤ1`@lP ABCDEFGHIJKLMNOPQRSTUVWXYZ$.?0123456789<@<SЬTЬ UQS>?\\\\\\\\\`:#@'="\abcdefghi\\\\\\\jklmnopqr\\\\\\\~stuvwxyz\\\\\\\\\\\\\\\\\\\\\\{ABCDEFGHI\\\\\\}JKLMNOPQR\\\\\\\\STUVWXYZ\\\\\\0123456789\\\\\  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~@ggh<i|o<m<4p<p<k|Zn<l fr rwx<x<x<x޺<w@]@@fjnr]Ze@@|> | |v<H|  |  |xz|  |zt f r   < &^ @&@'*/V,"?Lh:hmBmz|z{x`y~|fN|@@|@͂|@ ݃ƃ<ns<|Ŏ |️|ep|u|-@率|<ᄇ2ֻr||ZRM | ntB|xyvZw|J=|R>|J? nnaa|bddfn. & ! & !In a link word the bits have the following meaning: & ! & ! 0 - 8 byte within the block & ! 9 - 11 cluster (16 blocks) number & ! 12 - 15 block within the cluster & ! 18310 DEF* FNLINK%(LINK%) 18320 CLUSTER.NUMBER% = ( LINK% AND 3584% ) / 512% \ & BLOCK.NUMBER% = SWAP%( LINK% AND -4096% ) / 16% \ & BYTE.NUMBER% = LINK% AND 511% 18330 IF CLUSTER.NUMBER% <> CURRENT.CLUSTER% & THEN GET #1%, BLOCK CLUSTER.MAP%(CLUSTER.NUMBER%) \ & CURRENT.CLUSTER% = CLUSTER.NUMBER% 18380 FNLINK% = BLOCK.NUMBER% * 512% + BYTE.NUMBER% 18390 FNEND 18400 ! & !convert a number to time & ! 18410 DEF* FNTIME$(T%) 18420 IF T% = 0% & THEN T$ = "none" \ & GOTO 18480 18430 HOURS% = T% / 60% \ & MINUTES% = T% - HOURS% * 60% 18440 T$ = NUM1$(MINUTES%) \ & IF LEN(T$) = 1% & THEN T$ = "0" + T$ 18450 IF HOURS% > 0% & THEN T$ = NUM1$(HOURS%) + ":" + T$ 18480 FNTIME$ = T$ 18490 FNEND 32767 END