100 ! SAVE FYSOS30 110 ! *------------------------------ 120 ! * Namn: FYSOS30.BAC 130 ! * Syfte: Fysisk hantering av skivminnen (ej LUXNET) 140 ! *------------------------------ 150 DATA v3.0 1986-12-25 BEN 160 ! 170 D=FNVariabel 180 ! 190 ON ERROR GOTO 300 200 ; CHR$(12) Stf$ Vers$ 210 ; CUR(6,0) STRING$(Conbredd,61) 220 IF FNEnhet D=FNL{nk 230 D=FNFellista 240 WHILE -1 250 D=FNBlockl{s 260 WHILE FNKommando : WEND 270 D=FNFellista 280 WEND 290 ! 300 ; Fef$ 'Felkod' ERRCODE 310 D=FNL{nk 320 ! 330 ! ## Variabler 340 DEF FNVariabel 350 POKE 65266,5 ! ATTRIBUTE 5 360 Stopsave=PEEK2(65413) : POKE 65413,0,0 370 DIM Vers$=20 : Vers$='* Fysos v3.0 *' 380 DIM Volnamn$=120 390 DIM Enhet$=10 400 DIM Lenhet$=4,Utenhet$=4 410 DIM Status$=80,S|k$=60 420 DIM Fel$(0:13)=50,Felrubr$=80 430 DIM Getque$=60,L{nk$=16 440 DIM Stf$=6,Inf$=6,Maf$=6,Syf$=6,Fef$=6 450 Stf$=CHR$(137,140,139,156,130) ! STDY+NRML+NULN+BLBG+GRN 460 Maf$=CHR$(137,140,138,156,134) ! STDY+NRML+ULN+BLBG+CYA 470 Inf$=CHR$(137,140,139,156,134) ! STDY+NRML+NULN+BLBG+CYA 480 Syf$=CHR$(137,140,139,156,131) ! STDY+NRML+NULN+BLBG+YEL 490 Fef$=CHR$(137,140,139,156,129,7) ! STDY+NRML+NULN+BLBG+RED+BEL 500 DIM Avsl$=10,Bavsl$=20,Mavsl$=20 510 Avsl$=CHR$(13,192,196,198,161,163) 520 Bavsl$=CHR$(13,18,20,136,137,161,163,192,194,196,198,210) 530 Mavsl$=CHR$(13,18,20,27,136,137,161,163,192,195,196,198) 540 Liblen=16*80 : DIM Lib$=Liblen : Libadr=VARPTR(Lib$) 550 Conbredd=PEEK(65364) 560 Mrad=7 : Mh|jd=16 570 Mbredd=Conbredd/5 : Mant=Mh|jd*Mbredd : Tknant=Mh|jd*Conbredd 580 DIM Obj$=100 : Objadr=VARPTR(Obj$) 590 Obj$=CHR$(33,0,245,14,16,6,16,229,126,35,0,0,254,127,48,4) 600 Obj$=Obj$+CHR$(254,32,48,2,62,32,18,19,16,238,225,6,16,197,235) 610 Obj$=Obj$+CHR$(14,32,113,35,113,26,19,254,100,56,12,14,47,12,214) 620 Obj$=Obj$+CHR$(100,48,251,198,100,113,14,48,35,254,10,56,9,14,47) 630 Obj$=Obj$+CHR$(12,214,10,48,251,198,10,113,35,198,48,119,35,235) 640 Obj$=Obj$+CHR$(193,16,207,13,32,180,201) 650 Redmode=1 660 RETURN 0 670 FNEND 680 ! 690 ! ## Enradiga funktioner 700 DEF FNPos(Redmode,Libidx) 710 IF Redmode=0 RETURN 80*(Libidx/16)+(Libidx AND 15)+1 720 IF Redmode=1 RETURN 80*(Libidx/16)+4*(Libidx AND 15)+18 730 FNEND 740 DEF FNRedlen(Mode)=1-2*(Mode=1) 750 DEF FNV{rde(Libidx)=VAL('0'+FNSkip$(MID$(Lib$,FNPos(1,Libidx),3),' ')) 760 DEF FNH|ger$(In$,Ant)=RIGHT$(SPACE$(Ant)+In$,LEN(In$)+1) 770 DEF FNV{nster$(In$,Ant)=LEFT$(In$+SPACE$(Ant),Ant) 780 DEF FNChr$(Ch) 790 IF 32<=Ch AND Ch<=127 RETURN CHR$(Ch) ELSE RETURN ' ' 800 FNEND 810 ! 820 ! ## Matrishuvud 830 DEF FNMatrishuvud 840 ; CUR(0,0) Stf$ Vers$ 850 ; CUR(1,0) Stf$ SPACE$(400) CUR(23,0) TAB(Conbredd-1); 860 ; CUR(4,0) FNV{nster$(Lenhet$,4); : IF Msekt.<>-1 ; FNV{nster$(NUM$(Msekt.),5) 870 ; CUR(4,17) NUM$(Lfree.) ' av ' NUM$(Lavail.) ' sektorer lediga (' NUM$(100-INT(Lfree./Lavail.*100+.5)) '%)' 880 ; CUR(5,0) FNV{nster$(Volnamn$,Conbredd) 890 ; CUR(6,0) STRING$(Conbredd,61) 900 D=FNPr25(Status$) : Status$='' 910 RETURN 0 920 FNEND 930 ! 940 ! ## Visning av sektorer 950 DEF FNBlockl{s LOCAL Sekt$=5,Sektnr.,Clbyte,Clbit,Dadr 960 D=FNMatrishuvud 970 Lib$=SPACE$(Liblen) 980 WHILE -1 990 WHILE Msekt.<>-1 1000 ; CUR(4,0) Stf$ FNV{nster$(Lenhet$,4) NUM$(Msekt.) 1010 D=FNRw(Lsel,Msekt.,0) 1020 WHILE Felant 1030 IF Felant>1 D=FNFellista 1040 Felant=0 1050 GOTO 1110 1060 IF 0 WEND 1070 D=CALL(Objadr,Libadr) ! Skapa blankett 1080 IF 0 WEND 1090 ; CUR(Mrad,0) Stf$ LEFT$(Lib$,Tknant); 1100 ! 1110 Sekt$=FNInmat$(23,0,'Sektor ',5,NUM$(Msekt.+1),Bavsl$) 1120 IF Exit=192 RETURN 0 1130 Mpos=0 1140 IF INSTR(1,CHR$(196,161,18,136),CHR$(Exit)) Msekt.=Msekt.+(Msekt.>0) : GOTO 1330 1150 IF INSTR(1,CHR$(198,163,20,137),CHR$(Exit)) Msekt.=Msekt.+1 : GOTO 1330 1160 IF LEFT$(Sekt$+' ',1)='.' Sekt$=RIGHT$(Sekt$,2) : Dadr=-1 ELSE Dadr=0 1170 WHILE Exit=13 1180 Sektnr.=FNDefval.(Sekt$) 1190 IF NOT Dadr Msekt.=Sektnr. 1200 WHILE Dadr 1210 Sekt$=FNInmat$(23,15,'',3,'',Avsl$) 1220 ; CUR(23,15) Stf$ TAB(Conbredd-1); 1230 IF Exit=192 RETURN 0 1240 IF Exit=196 OR Exit=161 GOTO 1110 1250 Clbyte=Sektnr. 1260 Clbit=FNDefval.(Sekt$)/32 1270 Msekt.=Cl*(8.*Clbyte+Clbit) 1280 IF 0 WEND 1290 GOTO 1330 1300 IF 0 WEND 1310 IF Exit=194 OR Exit=210 D=FNS|k : GOTO 1330 1320 ! 1330 WEND 1340 FNEND 1350 ! 1360 ! ## S|kning av information i sektorer 1370 DEF FNS|k LOCAL Dbuf0$=0,Chrs|k$=60,Temp$=60,Chrlen,Chridx 1380 POKE VAROOT(Dbuf0$),0,1,0,245,0,1 1390 ; CUR(23,0) TAB(Conbredd-1); 1400 IF Exit=194 S|k$=FNInmat$(23,0,'S|kbegrepp: ',60,S|k$,Avsl$) 1410 IF INSTR(1,CHR$(192,196,161),CHR$(Exit)) OR S|k$='' 1580 1420 Chrs|k$=S|k$+',' : Chrlen=0 1430 WHILE Chrlen<>LEN(Chrs|k$) 1440 Chridx=INSTR(Chrlen+1,Chrs|k$,',') 1450 Temp$=FNChrstr$(MID$(Chrs|k$,Chrlen+1,Chridx-Chrlen-1)) 1460 Chrs|k$=LEFT$(Chrs|k$,Chrlen)+Temp$+RIGHT$(Chrs|k$,Chridx+1) 1470 Chrlen=Chrlen+LEN(Temp$) 1480 WEND 1490 D=FNPr25('S|kningen kan avbrytas med PF2') 1500 Felrubr$='S\KNING:' 1510 IF 0 WHILE FNRw(Lsel,Msekt.,0)=0 AND INSTR(1,Dbuf0$,Chrs|k$)=0 AND St<>2 1520 IF SYS(5) IF ASCII(FNGet$)=193 GOTO 1580 ELSE D=SYS(6) 1530 Msekt.=Msekt.+1 1540 ; CUR(4,0) Stf$ FNV{nster$(Lenhet$,4) NUM$(Msekt.) 1550 WEND 1560 IF St=2 Felant=Felant-1 1570 ! 1580 D=FNFellista 1590 ; CUR(23,0) TAB(Conbredd-1); 1600 RETURN 0 1610 FNEND 1620 ! 1630 ! # Del av s|kbegrepp 1640 DEF FNChrstr$(In$) 1650 ON ERROR GOTO 1660 : RETURN CHR$(VAL(In$)) 1660 RETURN In$ 1670 FNEND 1680 ! 1690 ! ## Kommandomeny 1700 DEF FNKommando 1710 D=FNPr25(Status$) : Status$='' 1720 IF Lenhet$='' WHILE FNEnhet : WEND : RETURN 0 1730 ; CUR(1,0) Stf$ SPACE$(160); 1740 ON FNMenyget(1,0,'Enhet Kopiera Radera Skriv Testa Volymnamn [ndra .','EKRSTV[.')+1 GOTO 1750,1760,1770,1780,1790,1800,1810,1820,1830 1750 RETURN 0 1760 RETURN FNEnhet 1770 RETURN FNKopiera 1780 RETURN FNRadera 1790 RETURN FNSkriv 1800 RETURN FNTesta 1810 RETURN FNVolymnamn 1820 RETURN FN[ndra 1830 RETURN FNAvsluta 1840 FNEND 1850 ! 1860 ! ## Byt aktuell enhet 1870 DEF FNEnhet LOCAL Namn$=4 1880 D=FNFellista 1890 ; CUR(2,0) Stf$ TAB(Conbredd) 1900 Namn$=FNVersal$(FNInmat$(2,0,'Ny enhet: ',4,Lenhet$,Avsl$)) 1910 Status$='' : IF INSTR(1,CHR$(192,196,161),CHR$(Exit)) RETURN -1 1920 Status$='Ingen enhet angiven' : IF Namn$='' RETURN -1 1930 Felrubr$='NY ENHET:' 1940 Lenhet$='' 1950 IF FNInitenhet(Namn$) Status$=Namn$+' {r ol{sbar' : RETURN -1 1960 Lenhet$=Enhet$ 1970 Lsel=Sel : Lcl=Cl : Ldrold=Drold 1980 Lbitmap=Bitmap 1990 Msekt.=-1 : Mstart=0 : Mpos=0 2000 Volnamn$=FNV{nster$(FNL{svolnamn$,80) : IF St Volnamn$='Volymnamn ol{sbart!' 2010 D=FNBitmap 2020 IF (Lsel AND 3)<=1 AND Lsel<=17 Utenhet$=FNSelkodenhet$(Lsel XOR 1) 2030 Status$='Ny enhet' 2040 RETURN 0 2050 FNEND 2060 ! 2070 ! ## Initera ny enhet 2080 DEF FNInitenhet(Namn$) 2090 IF Namn$='' RETURN -1 2100 IF INSTR(1,Namn$,':')=0 IF FNInitenhet(Namn$+':')=0 RETURN 0 2110 IF FNInitselenhet(Namn$)=0 RETURN 0 2120 Enhet$=FNVersal$(Namn$) 2130 Sel=FNSelkod(Enhet$) : IF Sel=-1 RETURN -1 2140 IF FNInitaccess(Sel) RETURN -1 2150 RETURN 0 2160 FNEND 2170 DEF FNInitselenhet(Namn$) 2180 ON ERROR GOTO 2210 2190 Enhet$=FNSelkodenhet$(VAL(LEFT$(Namn$,INSTR(1,Namn$,':')-1))) 2200 RETURN FNInitenhet(Enhet$) 2210 RETURN -1 2220 FNEND 2230 DEF FNBitmap LOCAL Bit$=40,Bitadr 2240 Bitadr=VARPTR(Bit$) 2250 Bit$=CHR$(17,0,0,58,19,253,103,46,0,14,2*Conbredd,6,8,203,6) 2260 Bit$=Bit$+CHR$(56,1,19,16,249,35,13,32,243,235,201) 2270 IF FNRw(Lsel,Lbitmap,0) RETURN 0 2280 Lfree.=1.*CALL(Bitadr)*Lcl 2290 IF FNRw(Lsel,Lbitmap+1,0) RETURN 0 2300 Lavail.=1.*CALL(Bitadr)*Lcl 2310 RETURN 0 2320 FNEND 2330 ! 2340 ! ## Kopiera sektorvis 2350 DEF FNKopiera LOCAL Start$=5,Slut$=5,Volnamn$=120,Buf$=8447,Bufpage,Bufmax,Done 2360 Bufpage=VARPTR(Buf$)/256+1 2370 Start$='0' : Slut$='99999' 2380 ; CUR(7,0) Stf$ SPACE$(1359); 2390 ; CUR(8,0) 'F Y S I S K K O P I A' 2400 ; CUR(9,0) '-----------------------' 2410 ! 2420 Utenhet$=FNInmat$(12,0,'Kopiera fr}n '+Lenhet$+' till ',4,Utenhet$,Avsl$) 2430 Utenhet$=FNVersal$(Utenhet$) 2440 IF INSTR(1,CHR$(192,196,161),CHR$(Exit)) RETURN -1 2450 IF Utenhet$='' Status$='Ingen enhet angiven' : RETURN -1 2460 IF FNInitenhet(Utenhet$) Status$=Utenhet$+' {r oanv{ndbar' : RETURN -1 2470 Utenhet$=Enhet$ 2480 IF Utenhet$=Lenhet$ Status$='Enheterna m}ste vara olika' : RETURN -1 2490 Utsel=Sel : Utcl=Cl : Utdrold=Drold 2500 ! 2510 ON ERROR GOTO 2510 2520 Start$=FNInmat$(14,0,'Fr}n sektor ',5,Start$,Avsl$) 2530 IF Exit=192 RETURN -1 2540 IF Exit=196 OR Exit=161 GOTO 2420 2550 Start.=VAL(Start$) 2560 ! 2570 ON ERROR GOTO 2570 2580 Slut$=FNInmat$(14,18,'till sektor ',5,Slut$,Avsl$) 2590 IF Exit=192 RETURN -1 2600 IF Exit=196 OR Exit=161 GOTO 2510 2610 Slut.=VAL(Slut$) 2620 ! 2630 Volnamn$=FNL{svolnamn$ : IF St Volnamn$='Volymnamn ol{sbart!'+CHR$(7) 2640 ! 2650 ; CUR(16,0) Stf$ 'Tidigare information i ' Utenhet$; 2660 IF LEN(Volnamn$)>0 ; ', som heter ' Volnamn$ ','; 2670 ; ' kan komma att f|rst|ras.' 2680 S$=FNInmat$(20,0,'Starta med utropstecken eller avbryt med punkt! ',1,'',Avsl$) 2690 IF Exit=192 RETURN -1 2700 IF Exit=196 OR Exit=161 GOTO 2570 2710 IF S$='.' RETURN 0 2720 IF S$<>'!' 2680 2730 ! 2740 D=FNPr25('Kopieringen kan avbrytas med PF2') 2750 Status$='Kopieringen AVBRUTEN' 2760 FOR Sektbas.=Start. TO Slut. STEP 32 2770 Bufmax=0 2780 FOR Sektoffs=0 TO 31 2790 IF SYS(5) IF ASCII(FNGet$)=193 RETURN 0 ELSE D=SYS(6) 2800 Sel=Lsel : Cl=Lcl : Drold=Ldrold : Enhet$=Lenhet$ : Rad=22 2810 GOSUB 3020 2820 WHILE St<>0 AND St<>2 2830 IF FNNyfel(Lenhet$+NUM$(Sektor.),FNDiskfel$(St)) RETURN 0 2840 POKE 64769,Utsel : Cl=Utcl : Drold=Utdrold 2850 POKE 64787,Bufpage+Sektoffs 2860 St=FNL{ssekt(Sektbas.+Sektoffs) 2870 POKE 64787,245 2880 IF St IF FNNyfel(Utenhet$+NUM$(Sektor.),FNDiskfel$(St)) RETURN 0 2890 IF 0 WEND 2900 Done=(St=2) 2910 IF NOT Done Bufmax=Sektoffs : NEXT Sektoffs 2920 FOR Sektoffs=0 TO Bufmax 2930 IF SYS(5) IF ASCII(FNGet$)=193 RETURN 0 ELSE D=SYS(6) 2940 Sel=Utsel : Cl=Utcl : Drold=Utdrold : Enhet$=Utenhet$ : Rad=23 2950 GOSUB 3020 2960 IF St IF FNNyfel(Utenhet$+NUM$(Sektor.),FNDiskfel$(St)) RETURN 0 2970 NEXT Sektoffs 2980 IF NOT Done NEXT Sektbas. 2990 Status$='Kopiering slutf|rd'+CHR$(7) 3000 RETURN 0 3010 ! 3020 Sektor.=Sektbas.+Sektoffs : IF Sektor.>Slut. RETURN 3030 ; USING '&&&#####' CUR(Rad,0) Stf$ Enhet$ Sektor.; 3040 POKE 64769,Sel 3050 POKE 64787,Bufpage+Sektoffs 3060 IF Sel=Lsel St=FNL{ssekt(Sektor.) ELSE St=FNSkrivsekt(Sektor.) 3070 POKE 64787,245 3080 RETURN 3090 FNEND 3100 ! 3110 ! ## Radera skiva 3120 DEF FNRadera LOCAL Dbuf0$=0,Fil$=16,Clnr 3130 IF PEEK(24688)=8 D=FNPr25(Fef$+'VARNING: Kan ej radera LUXNET-enheter') 3140 IF (Lsel AND 28)=4 D=FNPr25(Fef$+'VARNING: Aktiv enhet {r en h}rddisk') 3150 S$=FNInmat$(2,0,'HELA skivan kommer att raderas, {r det OK? ',3,'Nej',Avsl$) 3160 Status$='' : IF INSTR(1,CHR$(192,196,161),CHR$(Exit)) RETURN -1 3170 S$=FNVersal$(LEFT$(S$+' ',1)) 3180 IF S$='N' RETURN 0 3190 IF S$<>'J' 3150 3200 D=FNPr25('Skivan raderas!') 3210 POKE VAROOT(Dbuf0$),0,1,0,245,0,1 3220 POKE 64769,Lsel 3230 Cl=Lcl : Drold=Ldrold : Bitmap=Lbitmap 3240 Maxsekt=Libsize-1 : Libstart=Bitmap+2 3250 IF FNRw(Lsel,Libstart,0) RETURN 0 3260 Fil$=MID$(Dbuf0$,17,16) 3270 Dbuf0$=STRING$(16,0)+Fil$+STRING$(224,255) 3280 IF FNRw(Lsel,Libstart,-1) RETURN 0 3290 Dbuf0$=STRING$(256,255) 3300 FOR Sektor=Libstart+1 TO Libstart+Maxsekt 3310 IF FNRw(Lsel,Sektor,-1) RETURN 0 3320 NEXT Sektor 3330 IF Lsel<>29 IF FNRw(Lsel,0,-1) RETURN 0 ! Ej radera sektor 0 i RAM: 3340 IF FNRw(Lsel,Bitmap+1,0) RETURN 0 3350 MID$(Dbuf0$,240,17)=CHR$(2)+STRING$(Maxsekt,0)+STRING$(15-Maxsekt,255)+CHR$(0) 3360 Clnr=SWAP%(CVT$%(Fil$))/32 : Adr=62720+Clnr/8 : Bit=Clnr AND 7 XOR 7 3370 POKE Adr,PEEK(Adr) OR 2^Bit 3380 IF Cl=1 Adr=Adr-(Bit=0) : Bit=Bit-1 AND 7 : POKE Adr,PEEK(Adr) OR 2^Bit 3390 IF FNRw(Lsel,Bitmap+1,-1) RETURN 0 3400 IF FNRw(Lsel,Bitmap,-1) RETURN 0 3410 D=FNPr25(Lenhet$+' {r rensad') 3420 IF FNEnhet+FNFellista D=FNL{nk 3430 RETURN 0 3440 FNEND 3450 ! 3460 ! ## Skriv aktuell sektor till godtycklig sektor 3470 DEF FNSkriv LOCAL Utenhet$=4,Sekt$=5 3480 Utenhet$=Lenhet$ : Sekt$=NUM$(Msekt.) 3490 ! 3500 Utenhet$=FNVersal$(FNInmat$(2,0,'Skriv till enhet ',4,Utenhet$,Avsl$)) 3510 IF INSTR(1,CHR$(192,196,161),CHR$(Exit)) RETURN -1 3520 IF Utenhet$='' Status$='Ingen enhet angiven' : RETURN -1 3530 IF FNInitenhet(Utenhet$) Status$=Utenhet$+' {r ol{sbar' : RETURN -1 3540 ! 3550 ON ERROR GOTO 3550 3560 Sekt$=FNInmat$(2,0,'Skriv till enhet '+Enhet$+', sektor ',5,Sekt$,Avsl$) 3570 IF Exit=192 RETURN -1 3580 IF Exit=196 OR Exit=161 GOTO 3500 3590 Utsekt.=VAL(Sekt$) 3600 FOR Libidx=0 TO 255 : POKE 62720+Libidx,FNV{rde(Libidx) : NEXT Libidx 3610 D=FNRw(Sel,Utsekt.,-1) 3620 Status$='Skrivit till sektor '+Utenhet$+NUM$(Utsekt.) 3630 RETURN 0 3640 FNEND 3650 ! 3660 ! ## Testa skiva 3670 DEF FNTesta LOCAL Sekt.,St 3680 D=FNPr25('Testningen kan avbrytas med PF2') 3690 Status$='Testningen AVBRUTEN' 3700 Felrubr$='TESTNING:' 3710 Sekt.=0 3720 POKE 64769,Lsel 3730 IF 0 WHILE (St AND 2)=0 3740 IF SYS(5) IF ASCII(FNGet$)=193 RETURN 0 ELSE D=SYS(6) 3750 ; USING '&&Nu testas sektor #####' CUR(2,0) Stf$ Sekt. 3760 St=FNL{ssekt(Sekt.) 3770 IF St AND 253 IF FNNyfel(Lenhet$+NUM$(Sekt.),FNDiskfel$(St)) RETURN 0 3780 Sekt.=Sekt.+1 3790 WEND 3800 Status$='Skiva testad' 3810 RETURN 0 3820 FNEND 3830 ! 3840 ! ## [ndra volymnamn 3850 DEF FNVolymnamn LOCAL S$=120 3860 S$=FNInmat$(5,0,'',Conbredd,Volnamn$,Avsl$) 3870 IF INSTR(1,CHR$(192,196,161),CHR$(Exit)) RETURN -1 3880 POKE 64769,Lsel : St=FNSkrivvolnamn(S$) 3890 IF St D=FNNyfel(Lenhet$+'0',FNDiskfel$(St)) : RETURN 0 3900 Volnamn$=S$ 3910 Status$='Volymnamn {ndrat' 3920 RETURN 0 3930 FNEND 3940 ! 3950 ! ## Redigering av sektor 3960 DEF FN[ndra LOCAL Gammalv{rde$=3,Nyv{rde$=3,Nyv{rde 3970 D=FNMatrishuvud 3980 IF FNRw(Lsel,Msekt.,0) D=FNFellista : RETURN 0 3990 D=CALL(Objadr,Libadr) ! Skapa blankett 4000 ; CUR(Mrad,0) Stf$ Lib$; 4010 WHILE -1 4020 IF Mpos<0 Mpos=0 4030 IF Mpos>255 Mpos=255 4040 WHILE Mpos=Mstart+Mant : Mstart=Mstart+Mbredd : WEND 4060 ; CUR(Mrad,0) Stf$ MID$(Lib$,FNPos(0,Mstart),Tknant); 4070 Offs=FNPos(Redmode,Mpos)-FNPos(0,Mstart) 4080 Rad=Mrad+Offs/Conbredd : Kol=MOD(Offs,Conbredd) 4090 Gammalv{rde$=MID$(Lib$,FNPos(Redmode,Mpos),FNRedlen(Redmode)) 4100 WHILE Redmode=0 4110 ; CUR(Rad,Kol) Stf$; : Nyv{rde$=FNGet$ 4120 IF ' '<=Nyv{rde$ AND Nyv{rde$<='' Exit=13 ELSE Exit=ASCII(Nyv{rde$) : Nyv{rde$=Gammalv{rde$ 4130 IF Gammalv{rde$<' ' OR Gammalv{rde$>'' Nyv{rde$=Gammalv{rde$ 4140 Nyv{rde=ASCII(Nyv{rde$) 4150 GOTO 4240 4160 IF 0 WEND 4170 WHILE Redmode=1 4180 Gammalv{rde$=FNSkip$(Gammalv{rde$,' ') 4190 ON ERROR GOTO 4190 4200 Nyv{rde$=FNInmat$(Rad,Kol,'',FNRedlen(Redmode),Gammalv{rde$,Mavsl$) 4210 Nyv{rde=VAL(Nyv{rde$) 4220 IF 0 WEND 4230 ! 4240 WHILE Nyv{rde$<>Gammalv{rde$ 4250 MID$(Lib$,FNPos(0,Mpos),1)=FNChr$(Nyv{rde) 4260 MID$(Lib$,FNPos(1,Mpos),3)=FNH|ger$(NUM$(Nyv{rde),3) 4270 ; CUR(Mrad,0) Stf$ MID$(Lib$,FNPos(0,Mstart),Tknant); 4280 IF 0 WEND 4290 IF Exit=8 OR Exit=172 Exit=18 4300 IF Exit=9 OR Exit=164 Exit=20 4310 IF Exit=20 OR Exit=137 OR Exit=13 Mpos=Mpos+1 : GOTO 4380 4320 IF Exit=18 OR Exit=136 Mpos=Mpos-1 : GOTO 4380 4330 IF Exit=198 OR Exit=163 Mpos=Mpos+Mbredd : GOTO 4380 4340 IF Exit=196 OR Exit=161 Mpos=Mpos-Mbredd : GOTO 4380 4350 IF Exit=192 RETURN -1 4360 IF Exit=27 OR Exit=211 Redmode=Redmode XOR 1 : GOTO 4380 4370 ! 4380 WEND 4390 FNEND 4400 ! 4410 ! ## Sluta? 4420 DEF FNAvsluta 4430 ; CUR(2,0) TAB(Conbredd); 4440 L{nk$=FNInmat$(2,0,'Nytt program: ',16,L{nk$,Avsl$) 4450 IF INSTR(1,CHR$(192,196,161),CHR$(Exit)) RETURN -1 4460 ; CHR$(12) Stf$ : D=FNL{nk 4470 FNEND 4480 ! 4490 ! # L{ser sektor 4500 DEF FNRw(Sel,Sektor.,Skriv) 4510 POKE 64769,Sel 4520 IF Skriv=-1 St=FNSkrivsekt(Sektor.) ELSE St=FNL{ssekt(Sektor.) 4530 IF St RETURN FNNyfel(FNSelkodenhet$(Sel)+NUM$(Sektor.),FNDiskfel$(St)) ELSE RETURN 0 4540 FNEND 4550 ! 4560 ! # L{gg till fellistan 4570 DEF FNNyfel(Txt1$,Txt2$) 4580 Getque$='' ! Avbryt komplext kommando 4590 Fel$(Felant)=FNV{nster$(Txt1$,15)+FNV{nster$(Txt2$,35) 4600 Felant=Felant+1 4610 IF Felant=(14+(Felrubr$<>'')) Status$='Fellistan full' : RETURN -1 4620 D=FNPr25(Fef$+FNV{nster$(Txt1$,15)+Txt2$) 4630 RETURN 0 4640 FNEND 4650 ! 4660 ! # L{gg till BASIC-fel i fellistan 4670 DEF FNNybacfel(Txt1$,Ec)=FNNyfel(Txt1$,FNFeltext$(Ec)) 4680 ! 4690 ! ## Redovisar fellistan 4700 DEF FNFellista 4710 IF Felant=0 Felrubr$='' : RETURN 0 4720 D=FNPr25(Status$+CHR$(7)) : Status$='' 4730 ; CUR(2,0) TAB(Conbredd); 4740 S$=FNInmat$(2,0,NUM$(Felant)+' fel. Vill du se listan? ',3,'Ja',Avsl$) 4750 S$=CHR$(ASCII(S$) OR 32) 4760 IF INSTR(1,CHR$(192,196,161),CHR$(Exit)) OR S$='n' RETURN 0 4770 IF S$<>'j' 4740 4780 ; CUR(7,0) Stf$ SPACE$(1359); 4790 ; CUR(8,0) Stf$ FNV{nster$('Position',25) FNV{nster$('Fel',35) 4800 ; CUR(9,0) Stf$ STRING$(60,45) 4810 IF Felrubr$<>'' ; CUR(10,0) Stf$ Felrubr$; 4820 FOR Idx=0 TO Felant-1 4830 ; CUR(10-(Felrubr$<>'')+Idx,0) Stf$ Fel$(Idx); 4840 NEXT Idx 4850 Felant=0 : Felrubr$='' 4860 D=FNConfirm('Tryck RETURN f|r }terg}ng',CHR$(13)) 4870 RETURN 0 4880 FNEND 4890 ! 4900 ! ## Standardfunktioner 4910 ! #OBS# Special 4920 DEF FNL{nk 4930 ; Stf$; 4940 POKE 65413,Stopsave,SWAP%(Stopsave) 4950 CLOSE : ON ERROR GOTO 4970 4960 IF L{nk$<>'' CHAIN L{nk$ 4970 END 4980 FNEND 4990 DEF FNInitaccess(Sel) LOCAL Fyssel 5000 Fyssel=Sel 5010 IF Sel=27 Fyssel=PEEK(PEEK2(24697)+2) 5020 IF Sel=30 Fyssel=PEEK(PEEK2(24685)+2) 5030 IF Sel=31 Fyssel=PEEK(PEEK2(24695)+2) 5040 POKE 64769,Fyssel 5050 Drold=0 : Bitmap=14 : Libsize=16 5060 WHILE PEEK(24678)=195 ! ABC832/ABC838/UFDDOS/SUPERDOS 5070 IF PEEK2(PEEK2(24681)+2)<>ASCII('D')+ASCII('R')*256 Cl=4 : RETURN 0 5080 ! UFDDOS/SUPERDOS 5090 Cl=Fyssel AND 28 : IF Cl=0 Cl=PEEK(64994) : IF Cl=0 Cl=16 ! SF_: 5100 Cl=PEEK(64995+Cl) : IF Cl AND 64 Drold=-1 : Cl=Cl-64 5110 Cl=2^Cl : RETURN 0 5120 WEND 5130 Drold=-1 5140 OUT 1,45 : IF INP(1)<>255 GOTO 5210 5150 OUT 1,44 : IF INP(1)<>255 GOTO 5220 5160 POKE 64769,255 : D=CALL(24678,105) 5170 POKE 64787,246 : D=CALL(24678,114) : POKE 64787,245 5180 FOR S=62720 TO 62975 5190 IF PEEK(S)<>PEEK(S+256) 5220 5200 NEXT S 5210 Cl=1 : Bitmap=6 : Libsize=8 : RETURN 0 ! ABC830 5220 Cl=4 : RETURN 0 ! DD88 5230 FNEND 5240 DEF FNSkip$(In$,Tkn$) LOCAL Str$=200,Idx 5250 Str$=In$ 5260 Idx=INSTR(1,Str$,Tkn$) 5270 WHILE Idx 5280 Str$=LEFT$(Str$,Idx-1)+RIGHT$(Str$,Idx+1) 5290 Idx=INSTR(1,Str$,Tkn$) 5300 WEND 5310 RETURN Str$ 5320 FNEND 5330 DEF FNPr25(Text$) LOCAL Cursave,Asave,S$=40 5340 OUT 56,6,57,25 : Cursave=PEEK2(65362) : Asave=INP(53) 5350 S$=SPACE$((PEEK(65364)-LEN(Text$))/2) 5360 POKE 65362,0,24 5370 ; Stf$ S$ Syf$ Text$ Stf$ S$; 5380 POKE 65362,Cursave,SWAP%(Cursave) : OUT 53,Asave 5390 RETURN 0 5400 FNEND 5410 DEF FNConfirm(Text$,Exit$) LOCAL S$=40,Key$=1 5420 S$=SPACE$((PEEK(65364)-LEN(Text$))/2) 5430 IF 0 WHILE INSTR(1,Exit$,Key$)=0 5440 POKE 65362,0,24 5450 ; Stf$ S$ Syf$ Text$ Stf$ S$; : POKE 65362,0,24 : ; Stf$ S$ Syf$ Text$; 5460 Key$=FNGet$ 5470 WEND 5480 Exit=ASCII(Key$) 5490 RETURN 0 5500 FNEND 5510 DEF FNMenyget(Rad,Kol,Txt$,Init$) LOCAL Key$=1,Nr 5520 ; CUR(Rad,Kol) Stf$ SPACE$(160) CUR(Rad,Kol) Stf$ Txt$; 5530 POKE 65363,255 5540 WHILE Nr=0 5550 Key$=FNVersal$(FNGet$) 5560 IF Key$=CHR$(192) 5670 5570 WHILE Key$=CHR$(13) ! Komplext kommando 5580 Getque$='' 5590 ; CUR(Rad,Kol) Stf$ SPACE$(160); 5600 Getque$=FNInmat$(Rad,Kol,'Komplext kommando: ',60,'',Avsl$) 5610 IF Exit<>13 GOTO 5520 5620 Getque$=FNSubs$(FNSubs$(Getque$,'!',CHR$(192)),'<',CHR$(13)) 5630 GOTO 5520 5640 WEND 5650 Nr=INSTR(1,Init$,Key$) 5660 WEND 5670 ; CUR(Rad,Kol) Stf$ SPACE$(LEN(Txt$)); 5680 RETURN Nr 5690 FNEND 5700 DEF FNVersal$(Text$) LOCAL In$=160,Ut$=160,Tkn 5710 In$=Text$ 5720 WHILE In$<>'' 5730 Tkn=ASCII(In$) 5740 IF Tkn>95 AND Tkn<127 Tkn=Tkn-32 5750 Ut$=Ut$+CHR$(Tkn) 5760 In$=RIGHT$(In$,2) 5770 WEND 5780 RETURN Ut$ 5790 FNEND 5800 DEF FNGet$ LOCAL Key,Key$=1 5810 IF SYS(5) Getque$='' 5820 IF Getque$='' GET Key$ ELSE Key$=LEFT$(Getque$,1) : Getque$=RIGHT$(Getque$,2) 5830 Key=ASCII(Key$) 5840 IF ASCII(Key$)=6 D=FNPr25('Free: '+NUM$(SYS(4))) : GOTO 5810 5850 IF INSTR(1,CHR$(247,254),Key$) D=FNBilddump : GOTO 5810 5860 D=FNPr25('') 5870 RETURN Key$ 5880 FNEND 5890 DEF FNS(S)=-(Drold=0)*S-(Drold=1)*(S/Cl*32 OR S AND (Cl-1)) 5900 DEF FNL{ssekt(S)=CALL(24678,FNS(S))*0+PEEK(64789) 5910 DEF FNSkrivsekt(S)=CALL(24675,FNS(S))*0+PEEK(64789) 5920 DEF FNSelkod(In$) LOCAL Dr$=3,S|k,S|k$=0,Adr 5930 Dr$=LEFT$(In$+SPACE$(3),3) 5940 S|k=VAROOT(S|k$)+2 : POKE S|k-2,3,0,0,0,3 5950 Adr=PEEK2(65403) 5960 WHILE Adr 5970 POKE S|k,Adr+2,SWAP%(Adr+2) 5980 IF Dr$=S|k$ RETURN PEEK(Adr+7) 5990 Adr=PEEK2(Adr) 6000 WEND 6010 Ec=21 : RETURN -1 6020 FNEND 6030 DEF FNInmat$(Rad,Kol,Led$,Max,Default$,Avsl$) LOCAL Inmat$=160,Key$=1,Key,Ipos,Editing ! # 6040 ! # 6050 ! # 6060 ! # 6070 Inmat$=FNV{nster$(Default$,Max) 6080 WHILE 1 6090 ; CUR(Rad,Kol) Stf$ Led$ Maf$ Inmat$ Stf$; : D=FNPutattr 6100 ; CUR(Rad,Kol) Stf$ Led$ Maf$ LEFT$(Inmat$,Ipos); 6110 Key$=FNGet$ : Key=ASCII(Key$) 6120 WHILE INSTR(1,Avsl$,Key$) 6130 Exit=Key : GOTO 6620 6140 WEND 6150 WHILE Max>0 6160 WHILE Key>=32 AND Key<=126 6170 IF NOT Editing Inmat$=SPACE$(Max) 6180 Ipos=Ipos+1 6190 MID$(Inmat$,Ipos,Max-Ipos+1)=Key$+MID$(Inmat$,Ipos,Max-Ipos) 6200 IF Ipos=Max Ipos=Max-1 6210 GOTO 6590 6220 WEND 6230 WHILE INSTR(1,CHR$(8,172,173,175),Key$) 6240 IF Ipos=0 IF INSTR(1,Avsl$,CHR$(18))>0 Exit=18 : GOTO 6620 ELSE 6590 6250 Ipos=Ipos-1 6260 GOTO 6590 6270 WEND 6280 WHILE INSTR(1,CHR$(9,164,165,167),Key$) 6290 IF Ipos0 Exit=18 : GOTO 6620 ELSE 6590 6340 Ipos=0 6350 GOTO 6590 6360 WEND 6370 WHILE INSTR(1,CHR$(5,180,181,183),Key$) 6380 Ipos=Max 6390 WHILE Ipos>1 AND MID$(Inmat$,Ipos,1)=' ' : Ipos=Ipos-1 : WEND 6400 IF Ipos=1 AND LEFT$(Inmat$,1)=' ' Ipos=0 6410 IF Ipos=Max Ipos=Max-1 6420 GOTO 6590 6430 WEND 6440 WHILE INSTR(1,CHR$(1,127),Key$) 6450 WHILE RIGHT$(Inmat$,Ipos+1)<>SPACE$(LEN(Inmat$)-Ipos) 6460 MID$(Inmat$,Ipos+1,Max-Ipos)=MID$(Inmat$,Ipos+2,Max-Ipos-1)+' ' 6470 GOTO 6590 6480 WEND 6490 WHILE 1 ! Mitt i 6500 IF Ipos>0 MID$(Inmat$,Ipos,1)=' ' : Ipos=Ipos-1 6510 GOTO 6590 6520 WEND 6530 WEND 6540 IF Key=24 Inmat$=SPACE$(Max) : Ipos=0 : GOTO 6590 6550 IF Key=4 Inmat$=FNV{nster$(Default$,Max) : Ipos=0 : GOTO 6590 6560 ; CHR$(7); : GOTO 6590 ! Ok{nd tangent 6570 WEND 6580 ! 6590 Editing=-1 6600 WEND 6610 ! 6620 ; CUR(Rad,Kol) Stf$ Led$ Inf$ Inmat$; 6630 RETURN FNPacktail$(Inmat$) 6640 FNEND 6650 DEF FNPutattr LOCAL Attr,Adr,Byte 6660 Attr=INP(53) 6670 Adr=30720+80*PEEK(65363)+PEEK(65362) : Byte=PEEK(Adr) 6680 IF INP(53)=0 OUT 53,Attr : POKE Adr,Byte 6690 RETURN 0 6700 FNEND 6710 DEF FNSelkodenhet$(Sel)=MID$('DR0DR1DR2 HD0HD1HD2HD3MF0MF1MF2 MO0MO1MO2 SF0SF1SF2 PFD RAMUFDLFD',1+3*Sel,3)+':' 6720 DEF FNSubs$(In$,Fr}n$,Till$) LOCAL Ut$=200,Idx 6730 Ut$=In$ 6740 Idx=INSTR(1,Ut$,Fr}n$) 6750 WHILE Idx 6760 MID$(Ut$,Idx,LEN(Fr}n$))=Till$ 6770 Idx=INSTR(1,Ut$,Fr}n$) 6780 WEND 6790 RETURN Ut$ 6800 FNEND 6810 DEF FNFeltext$(Felnr) LOCAL Byte$=1,Byte,Offs,Fel,Fel$=80,Sekt,Maxfel,Store 6820 ON ERROR GOTO 7050 6830 OPEN 'BASICINI.SYS' AS FILE 99 6840 POSIT #99,3 : Sekt=1 6850 Offs=128 6860 GET #99 Byte$ : Maxfel=ASCII(Byte$) 6870 WHILE Maxfel<=Felnr 6880 IF Maxfel>=128 Offs=0 6890 Sekt=Sekt+1 6900 GET #99 Byte$ : Maxfel=ASCII(Byte$) 6910 WEND 6920 POSIT #99,Sekt*253 6930 GET #99 Byte$ : Byte=ASCII(Byte$) 6940 WHILE Byte>=128 AND Fel31 AND Tecken<128 OR Index=0 7210 Index=Index+1 7220 Tecken=ASCII(RIGHT$(Volnamn$,Index)) 7230 WEND 7240 IF Tecken<>13 RETURN '' 7250 RETURN LEFT$(Volnamn$,Index-1) 7260 FNEND 7270 DEF FNSkrivvolnamn(Volnamn$) LOCAL Port$=0 7280 St=FNL{ssekt(0) 7290 POKE VAROOT(Port$),121,0,135,245 7300 Port$=Volnamn$+CHR$(13,10) 7310 RETURN St OR FNSkrivsekt(0) 7320 FNEND 7330 DEF FNPacktail$(In$) LOCAL Length 7340 FOR Paloop=1 TO LEN(In$) 7350 IF MID$(In$,Paloop,1)<>' ' Length=Paloop 7360 NEXT Paloop 7370 RETURN LEFT$(In$,Length) 7380 FNEND 7390 DEF FNBilddump LOCAL Cursave,Tsave$=80,Asave$=80,Nr,Key,Asave 7400 Cursave=PEEK2(65362) : Asave=INP(53) 7410 Nr=0 : WHILE Nr<80 7420 Tsave$=Tsave$+CHR$(PEEK(32640+Nr)) : Asave$=Asave$+CHR$(INP(53)) 7430 Nr=Nr+1 : WEND 7440 ! 7450 D=FNPr25('RETURN=utskrift PF2=Ange skrivardata') 7460 Key=ASCII(FNGet$) 7470 GOSUB 7720 7480 IF INSTR(1,CHR$(192,196,161),CHR$(Exit)) GOTO 7580 7490 IF Key=193 GOTO 7620 7500 IF Key<>13 GOTO 7450 7510 ON ERROR GOTO 7580 : PREPARE Skrivpar$ AS FILE 8 7520 IF Skrivlit$='J' ; #8 CHR$(15); 7530 ; #8 STRING$(80,45) 7540 FOR S=0 TO 24 7550 PRINT #8 FNL{ssk{rm$(S,0,80) 7560 NEXT S 7570 ; #8 STRING$(80,45) : IF Skrivlit$='J' ; #8 CHR$(18); 7580 GOSUB 7720 7590 CLOSE 8 : POKE 65362,Cursave,SWAP%(Cursave) : OUT 53,Asave 7600 RETURN 0 7610 ! 7620 D=FNPr25('') : IF Skrivpar$='' Skrivpar$='PR:VSA30A72.77B' 7630 Skrivpar$=FNInmat$(24,0,'Skrivarnamn: ',16,Skrivpar$,CHR$(13,192,196)) 7640 IF Exit=192 GOTO 7580 7650 IF Exit=196 OR Exit=161 GOTO 7450 7660 D=FNPr25('') : IF Skrivlit$='' Skrivlit$='J' 7670 Skrivlit$=FNInmat$(24,0,'Liten text? ',1,Skrivlit$,CHR$(13,192,196)) 7680 IF Exit=192 GOTO 7580 7690 IF Exit=196 OR Exit=161 GOTO 7620 7700 GOTO 7450 7710 ! 7720 Nr=0 : WHILE Nr<80 7730 OUT 53,ASCII(RIGHT$(Asave$,Nr+1)) : POKE 32640+Nr,ASCII(RIGHT$(Tsave$,Nr+1)) 7740 Nr=Nr+1 : WEND 7750 RETURN 7760 FNEND 7770 DEF FNL{ssk{rm$(Y,X,L{ngd) LOCAL Sk{rmadr,Port$=0 7780 Sk{rmadr=30720+Y*80+X 7790 POKE VAROOT(Port$)+2,Sk{rmadr,SWAP%(Sk{rmadr),L{ngd,SWAP%(L{ngd) 7800 RETURN Port$ 7810 FNEND 7820 DEF FNDefval.(N$) 7830 ON ERROR GOTO 7840 : RETURN VAL(N$) 7840 RETURN 0. 7850 FNEND