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]    X1혀4¿|HÞï þÿÿ[ú«4ÿ;ßïöëÿÿÝûÿIßkûÿ(Ÿ«ûÿ&ûÿ'( «á«ôÑk ß«Hûÿ&ú«PïŠú«`ï‚ßï®ëÿÿŸ« ûÿüÐ\žËàïR™rP �P2PPzPP{�PPP÷PP2P~ûÿ®ñ�ÿÿÿÿ\ÐÿŸ«ûÿªŸ«$ûÿ ûÿ�Ð\Ã\T‘D«á �0D«áó \ìÎ~ûÿŠŸ« ûÿhûÿi) «ô«á+Ô\ ^( «án ^( ïëÿÿn°«pÀ\Ð^«tú«xÿYÀ\^úË€ÿÐ\ßïÎêÿÿÝûÿ!ßkûÿŸ«ûÿþûÿÿÐVÕk<Ý\ÝûÿñžFË×ï˰<�Ë´ßˬûÿÇûÿÌÖ\À�VÑVkÆ”úˤÿ—1`þ@ÐïlüÿÿP ABCDEFGHIJKLMNOPQRSTUVWXYZ$.?0123456789<@<¼SЬTЬ UÔQÕS><„PÑP�ÿùÐ�å¹P×S'{�@PRP�B¯ …×S{(PRP�B¯’…×S�@¯‰…¾@@Œ˜ ("@$$Ø#0$è#$8$%˜$%(%è$! @"FORRTLLIBRTL7-./% <=2&?'@O{[lP}M]\Nk`Kaðñòóôõö÷øùz^L~no|ÁÂÃÄÅÆÇÈÉÑÒÓÔÕÖרÙâãäåæçèéJàZ_my�‚ƒ„…†‡ˆ‰‘’“”•–—˜™¢£¤¥¦§¨©ÀjС???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????ÿ\ \\\\ \\\\\\\\\\ \\\\\\\\\\\\\\\\ \\\\\\\\\[.<(+!&\\\\\\\\\]$*);^-/\\\\\\\\|,%_>?\\\\\\\\\`:#@'="\abcdefghi\\\\\\\jklmnopqr\\\\\\\~stuvwxyz\\\\\\\\\\\\\\\\\\\\\\{ABCDEFGHI\\\\\\}JKLMNOPQR\\\\\\\\STUVWXYZ\\\\\\0123456789\\\\\ÿ  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~€�‚ƒ„…†‡ˆ‰Š‹Œ�Ž��‘’“”•–—˜™š›œ�žŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏðÑÒÓÔÕÖרÙÚÛÜÝþÿ@ïgïgï†h<ïi|ï¿o<ïËm<ï4p<ï’p<ïêk|ïZn<ïÁl ïfr ï†rï“wïšx<ï¯x<ïµx<ï¦xïÞº<ïæºï…w@ï]¿@ï¿@ï–¿ïfÉïjÉïnÉïrÉïŠÉüïúÎüï�Ñüï]æïéï¦êïZêïæìüïîïòîïöîïïïeð@ïñ@ïÚð|ï>ñ ï†ñ|ï òüïÆò|ïÒýïÑv<ïHÿïï¢|ï€ ï‚ |ï® ï´ |ïxïz|ï ï |ïzï€ït ïf ïr ï’ ïÎ <ïò ï&ïüï^ ü@ïâ&ü@ïŽ'üï*/üïV,ï"?ïLhï:hïÒmïBmüïz|ï¼zï±{üïäxüï`yüï²~|ïf�ïN‚|@ï@ƒ|@ïÍ‚|@ï ƒüïôƒüï݃üïÆƒ<ïn�ïs�<ïê�ïó�|ïÅŽï �|ïˆ�ï¸�|ïeŽïpŽ|ïuŽ|ïŽï-Ž@率üïî›|üïæ±<ï¾²üï2³üïš»üïÖ»üïr¾ï�¾|ïªÂ|ïÃüïªÃïZÈïÉüïRÄïMÆüïšÉï ÉüïÊï Ê|ïžÓï³ÓüïÔïÔüïšÔüïÙï ÙüïnÛïtÛüïÞÛüïºÜüïBÞ|ï·xï±yüïÞvüïZw|ïJ=|ïR>|ïJ?ï† ïÎnïÎnï–aïäa|ï–bï²dïºdüïfn. & ! & !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