1000 ! * LIB .BAC * 1010 ! +------------------------------+ 1020 ! ! LIB.BAC ! 1030 ! ! Biblioteksprogram ! 1040 ! ! f|r alla diskenheter & RAM: ! 1050 ! ! (C) Luxor Datorer AB / ! 1060 ! ! Tillh|r Systemdisk, UFD-DOS ! 1070 ! +------------------------------+ 1080 ! * 1090 ! * Because of the size of this programme, it should be squeezed when 1100 ! * running, to perform well. 1110 ! * 1120 ! * Ver date / VerRev / Sign / Note 1130 ! * 83-03-17 / 6.00 / LDAB / Orig. LIB Ver 5.0 f|r RAM/skiva 1140 ! * 83-06-23 / 6.01 / LDAB / CE or CR clears error message 1150 ! 1160 EXTEND : INTEGER 1170 ! *********************************************************************** 1180 ! * * 1190 ! * M A I N P R O G R A M * 1200 ! * * 1210 ! *********************************************************************** 1220 ! * 1230 Q7=FNInit 1240 Q7=FNSetlin(T) 1250 ! * 1260 IF Scan THEN GOTO 1320 1270 IF FNEnhet THEN Q7=FNFel('Enheten ej klar',T) : GOTO 1450 1280 IF Fil THEN IF FNPrlist THEN Q7=FNFel('Skrivaren ej READY.',T) 1290 IF Fil=F THEN Q7=FNScroll 1300 GOTO 1450 1310 ! * 1320 ! * Scan sequence 1330 ! * 1340 Devnr=0 ! First device 1350 ! * 1360 WHILE Devnr>=0 AND Devnr'RAM:' THEN Selcod=Selcod OR VAL(MID$(Dev$,3,1)) 2390 IF Dev$='RAM:' THEN Selcod=Selcod OR 1 2400 Clusi=2^(PEEK(Table+Entry+1) AND 7) 2410 Dirbeg=16 2420 RETURN F 2430 FNEND 2440 ! * 2450 DEF FNUdesc LOCAL Qselcod 2460 Qselcod=PEEK(-7) 2470 Entry=Qselcod AND 16+8+4 2480 Selcod=30 2490 Clusi=2^(PEEK(Table+Entry+1) AND 7) 2500 Dirbeg=PEEK2(-9) 2510 IF Dirbeg=0 THEN RETURN T ! UFD not active 2520 RETURN F 2530 FNEND 2540 ! * 2550 ! +---------------------------------+ 2560 ! ! Huvudrutin f|r en drive el. RAM ! 2570 ! +---------------------------------+ 2580 DEF FNEnhet 2590 Q7=FNVolname 2600 IF Dev$='UFD:' THEN Q7=FNMfd ELSE Q7=FNVolshort 2610 IF FNBitmap THEN RETURN T 2620 Q7=FNReadfil 2630 RETURN Q7 2640 FNEND 2650 ! * 2660 ! ********************************************************************** 2670 ! * * 2680 ! * S U B F U N C T I O N D E C L A R A T I O N P A R T * 2690 ! * * 2700 ! ********************************************************************** 2710 ! * 2720 DEF FNUnsign.(X)=-(X AND 32768)*2.+X 2730 ! * 2740 ! +-----------------------------+ 2750 ! ! Meny ! 2760 ! +-----------------------------+ 2770 DEF FNMeny LOCAL I 2780 ! * 2790 ; Huvud$ CUR(8,0); 2800 ; TAB(Widcomp1) '1 - Skrivare (Printer)' 2810 ; TAB(Widcomp1) '2 - Storlek' 2820 ; TAB(Widcomp1) '3 - Filstatus' 2830 ; TAB(Widcomp1) '4 - Viss drivenhet' 2840 Q7$=FNCon$('V{lj (1,2,3,4) ',13,Widcomp1+3) 2850 I=1 2860 WHILE I<=LEN(Q7$) 2870 IF INSTR(1,'1234',MID$(Q7$,I,1))=0 OR LEN(Q7$)>4 THEN 2780 2880 I=I+1 2890 WEND 2900 IF INSTR(1,Q7$,'1') THEN Fil=T ELSE Fil=F 2910 IF INSTR(1,Q7$,'2') THEN Storlek=T ELSE Storlek=F 2920 IF INSTR(1,Q7$,'3') THEN Filstatus=T ELSE Filstatus=F 2930 IF INSTR(1,Q7$,'4') THEN Scan=F ELSE Scan=T 2940 IF Scan THEN RETURN F 2950 ! * 2960 Q7$=FNCon$('Enhet ? ',16,6) 2970 IF FNDevname(Q7$) OR FNDesc THEN Q7=FNFel('Felaktigt enhetsnamn',T) : GOTO 2950 2980 RETURN F 2990 FNEND 3000 ! * 3010 ! ******************************** 3020 ! * 3030 ! * Skriv ledtext och h{mta svar 3040 ! * 3050 DEF FNCon$(Text$,Rad,Kol) LOCAL S,S1,T$=160 3060 ! * 3070 S=160 3080 ; CUR(Rad,Kol) Text$; 3090 WHILE S1<=S AND (PEEK(65362)4 OR LEN(N$)<3 THEN RETURN T 3360 IF LEN(N$)=4 THEN N$=LEFT$(N$,3) 3370 IF INSTR(1,Devs$,N$)=0 THEN RETURN T 3380 Dev$=N$+':' 3390 RETURN F 3400 FNEND 3410 ! * 3420 ! +------------------------------------+ 3430 ! ! Scroll rutin ! 3440 ! +------------------------------------+ 3450 DEF FNScroll LOCAL Mxname,Index,Lin,I,Opt 3460 ; Huvud$ 3470 ; Dev$ Volshort$ FNUnsign.(Rsize) 'kvar av' FNUnsign.(Osize) TAB(Wid) 3480 ; 'VOLYM: ' Volname$ 3490 ; CUR(4,0); 3500 ; TAB(Widcomp2+1) Lhead1$ 3510 ; TAB(Widcomp2+1) Lhead2$ 3520 Q7=FNHelp 3530 Mxname=LEN(Summa$)/20-1 ! Max filename nr 3540 WHILE Index+Mxlin<=Mxname 3550 Lin=0 3560 WHILE Lin<=Mxlin 3570 I=20*(Index+Lin)+1 3580 ; CUR(Lin+6,Widcomp2); 3590 ; MID$(Summa$,I,12)+' '+MID$(Summa$,I+12,6)+' '+MID$(Summa$,I+18,1)+' '+MID$(Summa$,I+19,1); 3600 Lin=Lin+1 3610 WEND 3620 Opt=FNKey(CHR$(13,32,196,198,212,214)) 3630 IF Opt=1 THEN RETURN T 3640 IF Opt=2 OR Opt=4 THEN Index=Index+1 3650 IF Opt=3 THEN Index=Index-1 : IF Index<0 THEN Index=0 3660 IF Opt=5 THEN Forw=F : RETURN F ELSE Forw=T 3670 IF Opt=6 THEN RETURN F 3680 WEND 3690 RETURN F 3700 FNEND 3710 ! * 3720 ! ******************************* 3730 ! * 3740 ! * List filenames on pr: 3750 ! * 3760 DEF FNPrlist LOCAL Mxname,Name,I,Tabul 3770 ON ERROR GOTO 3950 3780 PREPARE 'pr:' AS FILE 1 3790 ; #1,Prhead$ 3800 ; #1 3810 ; #1,Dev$ Volshort$ ',' FNUnsign.(Rsize) 'lediga av totalt' FNUnsign.(Osize) 'sektorer.' 3820 ; #1,'VOLYM: ' Volname$ 3830 ; #1 3840 ; #1,Lhead1$ TAB(41) Lhead1$ 3850 ; #1,Lhead2$ TAB(41) Lhead2$ 3860 Mxname=LEN(Summa$)/20-1 3870 WHILE Name<=Mxname 3880 IF Tabul=1 THEN Tabul=41 ELSE Tabul=1 3890 I=20*Name+1 3900 ; #1,TAB(Tabul); 3910 ; #1,MID$(Summa$,I,12)+' ' MID$(Summa$,I+12,6)+' '+MID$(Summa$,I+18,1)+' '+MID$(Summa$,I+19,1); 3920 LET Name=Name+1 3930 WEND 3940 RETURN F 3950 ! * 3960 RESUME 3970 3970 RETURN T 3980 FNEND 3990 ! * 4000 ! ******************************* 4010 ! * 4020 ! * Read volume name 4030 ! * 4040 DEF FNVolname 4050 Volname$='' 4060 IF FNRdsec(0) THEN RETURN T 4070 I=-2681 4080 WHILE I<-2560 4090 IF PEEK(I)=13 AND PEEK(I+1)=10 THEN RETURN F 4100 IF PEEK(I)<32 OR PEEK(I)>127 THEN Volname$='' : RETURN F 4110 Volname$=Volname$+CHR$(PEEK(I)) 4120 I=I+1 4130 WEND 4140 Volname$='' 4150 RETURN F 4160 FNEND 4170 ! * 4180 ! ******************************* 4190 ! * 4200 ! * Read short volume name in sysdir 4210 ! * 4220 DEF FNVolshort 4230 ON ERROR GOTO 4280 4240 OPEN Dev$+'sysdir.sys' AS FILE 2 4250 GET #2,Q7$ COUNT 11 4260 Volshort$=LEFT$(Q7$,8)+'.'+RIGHT$(Q7$,9) 4270 RETURN F 4280 ! * 4290 RESUME 4300 4300 Volshort$=SPACE$(12) 4310 RETURN F 4320 FNEND 4330 ! * 4340 ! ******************************* 4350 ! * 4360 ! * Find MFD device 4370 ! * 4380 DEF FNMfd LOCAL Mfdcod,D$=3 4390 Mfdcod=PEEK(-7) 4400 D$=CVT%$(PEEK2(Table+(Mfdcod AND 16+8+4)+2)) 4410 IF (Mfdcod AND 16+8+4)=PEEK(Table) THEN D$='DR' 4420 D$=D$+NUM$(Mfdcod AND 2+1) 4430 IF Mfdcod>=28 THEN D$='RAM' 4440 Volshort$=' ('+D$+':) ' 4450 RETURN F 4460 FNEND 4470 ! * 4480 ! +------------------------------+ 4490 ! ! Sortera in filnamn i listan ! 4500 ! +------------------------------+ 4510 DEF FNSort(Filnamn$) LOCAL Bottom,Mitten,Top 4520 Top=LEN(Summa$)/20-1 4530 WHILE Bottom<>Top 4540 Mitten=(Bottom+Top)/2 4550 IF Filnamn$'UFD:' AND PEEK(Dosbuf+3)<>255 THEN Mxdirsec=7 ELSE Mxdirsec=15 4830 Osize=CALL(VARPTR(Bitmap$))*Clusi 4840 ! * 4850 IF FNRdsec(Sec-1) THEN RETURN T 4860 Rsize=CALL(VARPTR(Bitmap$))*Clusi 4870 IF Dev$='UFD:' THEN IF FNRdsec(Dirbeg-1) THEN RETURN T 4880 WHILE Index<16 4890 Antal(Index)=PEEK(-2577+Index) 4900 Index=Index+1 4910 WEND 4920 RETURN F 4930 FNEND 4940 ! * 4950 ! +------------------------------------+ 4960 ! ! Omvandlar sm} bokst{ver till stora ! 4970 ! +------------------------------------+ 4980 DEF FNUpcase$(Text$) 4990 IF LEN(Text$)=0 THEN RETURN '' 5000 IF ASCII(Text$)>95 AND ASCII(Text$)<127 THEN RETURN CHR$(ASCII(Text$) AND 95)+FNUpcase$(RIGHT$(Text$,2)) 5010 RETURN LEFT$(Text$,1)+FNUpcase$(RIGHT$(Text$,2)) 5020 FNEND 5030 ! * 5040 ! +-------------------------------------+ 5050 ! ! H{mta filnamn ur DOSBUF 0 ! 5060 ! +-------------------------------------+ 5070 DEF FNFilnamn$(Index) LOCAL Filnamn$=12 5080 Filnamn$=MID$(Dosbuf$,Index+4,11) 5090 Filnamn$=LEFT$(Filnamn$,8)+'.'+RIGHT$(Filnamn$,9) 5100 RETURN Filnamn$ 5110 FNEND 5120 ! * 5130 ! +-------------------------------------+ 5140 ! ! Skriv- och rad`rskydd ! 5150 ! +-------------------------------------+ 5160 DEF FNProt$(Index) LOCAL Prot$=4,Protbyte 5170 IF Filstatus=0 THEN RETURN ' ' 5180 Prot$=' ' 5190 Protbyte=ASCII(MID$(Dosbuf$,Index+1,1)) 5200 IF (Protbyte AND 1) THEN MID$(Prot$,1,1)='S' 5210 IF (Protbyte AND 2) THEN MID$(Prot$,2,1)='R' 5220 RETURN Prot$ 5230 FNEND 5240 ! * 5250 ! +-------------------------------------+ 5260 ! ! Filens storlek ! 5270 ! +-------------------------------------+ 5280 DEF FNStorlek$(Index) LOCAL Ribad,Filesize,Storlek$=6 5290 IF Storlek=F THEN RETURN ' ' 5300 Filesize=CVT$%(MID$(Dosbuf$,Index+2,2)) 5310 Storlek$=NUM$(FNUnsign.(Filesize)) 5320 IF Filesize THEN RETURN SPACE$(6-LEN(Storlek$))+Storlek$ 5330 ! * 5340 ! * Old DOS file size computing 5350 ! * 5360 Ribad=Clusi*(SWAP%(CVT$%(MID$(Dosbuf$,Index,2)))/32) 5370 Filesize=Clusi*CALL(VARPTR(Stor$),Ribad) 5380 Storlek$=NUM$(FNUnsign.(Filesize)) 5390 RETURN SPACE$(6-LEN(Storlek$))+Storlek$ 5400 FNEND 5410 ! * 5420 ! +-----------------------------------+ 5430 ! ! Huvudrutin f|r l{sning av filnamn ! 5440 ! +-----------------------------------+ 5450 DEF FNReadfil LOCAL Status,Index,Filnamn$=20,Dirsec,Rad 5460 Summa$=SPACE$(20) 5470 WHILE Dirsec<=Mxdirsec 5480 IF Antal(Dirsec)=0 THEN GOTO 5590 5490 IF FNRdsec(Dirsec+Dirbeg) THEN RETURN T 5500 Index=1 5510 WHILE Index<=250 5520 Q7=ASCII(RIGHT$(Dosbuf$,Index)) 5530 IF Q7=0 OR Q7=255 THEN GOTO 5560 5540 Filnamn$=FNFilnamn$(Index)+FNStorlek$(Index)+FNProt$(Index) 5550 Q7=FNSort(Filnamn$) 5560 ! * 5570 Index=Index+16 5580 WEND 5590 ! * 5600 Dirsec=Dirsec+1 5610 WEND 5620 IF LEN(Summa$)<20*(Mxlin+1) THEN Summa$=Summa$+SPACE$(20*(Mxlin+1)-LEN(Summa$)) 5630 RETURN F 5640 FNEND 5650 ! * 5660 ! +----------------------------------+ 5670 ! ! L{s ett tkn ! 5680 ! +----------------------------------+ 5690 DEF FNKey(Opt$) LOCAL Key$=1 5700 ; CUR(23,Wid-2) '*'; 5710 GET Key$ 5720 ; CUR(23,Wid-2) ' '; 5730 RETURN INSTR(1,Opt$,Key$) 5740 FNEND 5750 ! * 5760 ! +----------------------------------+ 5770 ! ! Fler utskrifter ?? ! 5780 ! +----------------------------------+ 5790 DEF FNMore 5800 IF Wid<80 THEN ; CUR(22,0) SPACE$(Wid); 5810 Q7$=FNCon$('Fler utskrifter (J/N) ? ',23,0) 5820 IF (ASCII(Q7$) OR 32)=ASCII('j') THEN RETURN T ELSE RETURN F 5830 FNEND 5840 ! * 5850 ! +------------------------------------+ 5860 ! ! Skriv ut hj{lptext ! 5870 ! +------------------------------------+ 5880 DEF FNHelp 5890 IF Wid>=80 THEN GOTO 5940 5900 ; CUR(22,0) 'PF5=F|reg}ende SH+PF5=F|reg}ende enhet'; 5910 ; CUR(23,0) 'PF7=N{sta SH+PF7=N{sta enhet >'; 5920 ; CUR(21,0);STRING$(Wid,ASCII('=')); 5930 RETURN F 5940 ! * 5950 ; CUR(23,0);'PF5=F|reg}ende PF7=N{sta SH+PF5=F|reg}ende enhet SH+PF7=N{sta enhet >'; 5960 ; CUR(22,0);STRING$(Wid,ASCII('=')); 5970 RETURN F 5980 FNEND 5990 ! * 6000 ! ******************************** 6010 ! * 6020 ! * Felfunktion 6030 ! * 6040 DEF FNFel(Skriv$,Kvittera) 6050 ; CHR$(7); 6060 ; CUR(23,0);SPACE$(Wid);CUR(23,0);Skriv$; 6070 IF Kvittera=F THEN Q7=5000 : WHILE Q7 : Q7=Q7-1 : WEND : GOTO 6130 6080 ; ' - Tryck '; 6090 Q$=' ' 6100 WHILE INSTR(1,CHR$(24,13),Q$)=0 6110 GET Q$ 6120 WEND 6130 ! * 6140 ; CUR(23,0);SPACE$(Wid); 6150 RETURN F 6160 FNEND 6170 ! *