1000 ! UDEVIN   (c) LID@N DATA
1010 ! 
1020 ! - Utvecklat
1030 ! - av:  LID@N DATA
1040 ! -
1050 ! - Projekt:     Inl{nkning egna enheter under UFD-DOS
1060 ! - Konstrukt|r: Mikael Lid`n
1070 ! - Vers:        1.2
1080 ! - P}b|rjat:    850401
1090 ! - [ndring:     850524
1100 ! 
1110 ! 
1120 INTEGER : EXTEND 
1130 ! Inneh}ller funktioner f|r att l{nka in egna enheter pekande till
1140 ! olika UFD:n, man kan {ven l{nka in enheter som pekar p} driven direkt,
1150 ! tex man vill alltid h{mta programmen fr}n enheten PRG:, den kan d}
1160 ! peka direkt p} MF0:.
1170 ! 
1180 ! De h{r funktionerna f}r anv{ndas fritt bland medlemmar i ABC-Klubben
1190 ! f|r icke kommersiella syften, f|r kommersiella syften kontakta
1200 ! LID@N DATA  tel: 0171-247 51.
1210 ! 
1220 ! Exempel p} anv{ndning:
1230 ! 
1240 ! Dev$(0)='PRG' : Ufd$(0)='MF0:'     ; H{r pekare PRG: p} MF0:
1250 ! Dev$(1)='D' : Ufd$(1)='HD0:DATA'   ; H{r pekar D: p} bibl DATA p} HD0:
1260 ! Dev$(2)='OBJ:' : Ufd$(2)='HD2:SLASK/ASM/OBJEKT'
1270 ! Z=FNUdevin(3)    ; Antalet enheter anges som argument.
1280 ! CHAIN ....       ; Nu b|r man g|ra chain p} n}gonting
1290 ! 
1300 ! 
1310 ! Den vanliga UFD: enheten kan anv{ndas som vanligt.
1320 ! Assemblerkoden laddas p} stacken och upptar 39+11*antal enheter.
1330 ! 
1340 ! *
1350 ! 
1360 ! L{s sektor
1370 ! 
1380 DEF FNL{ssekt(Dev,Sekt)
1390   POKE -767,Dev
1400   Z=CALL(24678,Sekt)
1410   RETURN PEEK(-747)
1420 FNEND 
1430 ! *
1440 ! 
1450 ! L{s fil ur bibsekt
1460 ! 
1470 DEF FNL{sfil(Fil,Fi$,Cluster) LOCAL F$=0,Size,Sect,Adr
1480   Adr=62720+Fil*16
1490   POKE VAROOT(F$),16,0,Adr,SWAP%(Adr),16,0
1500   Sect=PEEK(Adr)*8*Cluster+PEEK(Adr+1)/32*Cluster
1510   IF Sect=-1 RETURN 0
1520   IF Fi$=MID$(F$,5,11) RETURN Sect
1530   Size=PEEK2(Adr+2)
1540   RETURN 0
1550 FNEND 
1560 ! *
1570 ! 
1580 ! S|k UFD
1590 ! 
1600 DEF FNUfds|k(Dev,Ufd$,Bibsect,Cluster) LOCAL I,J,A
1610   WHILE I<16
1620     Z=FNL{ssekt(Dev,I+Bibsect)
1630     J=0
1640     WHILE J<16
1650       A=FNL{sfil(J,Ufd$+'Ufd',Cluster) : IF A RETURN A
1660       J=J+1
1670     WEND 
1680     I=I+1
1690   WEND 
1700   RETURN 0
1710 FNEND 
1720 ! *
1730 ! 
1740 ! Selektkod f|r enhet
1750 ! 
1760 DEF FNDevsel(Dev$)
1770   RETURN INSTR(1,'HDMFMOSF',LEFT$(Dev$+'  ',2))/2*4+ASCII(RIGHT$(Dev$+'   ',3))-44
1780 FNEND 
1790 ! *
1800 ! 
1810 ! Klusterstorlek f|r enhet
1820 ! 
1830 DEF FNClusize(Dev)
1840   IF Dev>3 AND Dev<8 Cluster=32
1850   IF (Dev>7 AND Dev<12) OR (Dev>15 AND Dev<20) Cluster=4
1860   IF Dev>11 AND Dev<16 Cluster=1
1870   RETURN Cluster
1880 FNEND 
1890 ! *
1900 ! 
1910 ! S|k efter UFD sektor
1920 ! 
1930 DEF FNS|kufd(Dev,Cluster,Ufd$) LOCAL U$=100,A$=20,P,Bibsect,Sect
1940   U$=Ufd$ : IF U$='' RETURN 0
1950   P=INSTR(1,U$,'/')
1960   IF Dev>1 Bibsect=16 ELSE Bibsect=8
1970   WHILE P<>0
1980     A$=LEFT$(U$,P-1) : U$=RIGHT$(U$,P+1)
1990     Bibsect=FNUfds|k(Dev,A$+SPACE$(8-LEN(A$)),Bibsect,Cluster)
2000     IF Bibsect=0 RETURN 0
2010     Bibsect=Bibsect+2
2020     P=INSTR(1,U$,'/')
2030   WEND 
2040   Sect=FNUfds|k(Dev,U$+SPACE$(8-LEN(U$)),Bibsect,Cluster) : IF Sect=0 RETURN 0
2050   Sect=Sect+2
2060   RETURN Sect
2070 FNEND 
2080 ! *
2090 ! 
2100 ! L{nka in egen enhet
2110 ! 
2120 DEF FNDev(A,D$,Ufdoffset,Ufdselect,Selcode)
2130   POKE A,PEEK(65403),PEEK(65404)
2140   POKE A+2,ASCII(D$),ASCII(RIGHT$(D$,2)),ASCII(RIGHT$(D$,3))
2150   POKE A+5,Drivrut,SWAP%(Drivrut),Selcode
2160   POKE A+8,Ufdoffset,SWAP%(Ufdoffset),Ufdselect
2170   POKE 65403,A,SWAP%(A)
2180   RETURN 0
2190 FNEND 
2200 ! *
2210 ! 
2220 ! Drivrutin f|r egna device
2230 ! 
2240 DEF FNDrivrut(A) LOCAL B,Ufd
2250   B=PEEK2(65403)
2260   WHILE CHR$(PEEK(B+2),PEEK(B+3),PEEK(B+4))<>'UFD'
2270     B=PEEK2(B)
2280     IF B=0 RETURN -1
2290   WEND 
2300   Ufd=PEEK2(B+5)
2310   Drivrut=A
2320   POKE A,205,A+6,SWAP%(A+6),205,Ufd,SWAP%(Ufd)
2330   POKE A+6,229,213,197,245,221,110,4,221,102,5,17,247,255,6,3
2340   POKE A+21,35,35,35,26,78,119,235,113,35,19,16,247,241,193,209,225
2350   POKE A+37,201
2360   RETURN 0
2370 FNEND 
2380 ! *
2390 ! 
2400 ! L{nka in egen enhet
2410 ! 
2420 DEF FNUdevin(Ant) LOCAL A,J
2430   A=PEEK2(65302)-39-11*Ant : POKE 65302,A,SWAP%(A) : POKE 65294,A-630,SWAP%(A-630)
2440   Z=FNDrivrut(A+1) : A=A+39
2450   WHILE J<Ant
2460     IF FNUfddev(A,Dev$(J),Ufd$(J)) RETURN E9
2470     J=J+1 : A=A+11
2480   WEND 
2490   RETURN 0
2500 FNEND 
2510 ! *
2520 ! 
2530 ! L{nka in egen UFD enhet
2540 ! 
2550 DEF FNUfddev(Adr,Dev$,Ufd$) LOCAL D$=100,A,D,Sect,Selcode
2560   A=INSTR(1,Ufd$,':') : IF A=0 E9=21 : RETURN E9
2570   D$=LEFT$(Ufd$,A-1)
2580   D=FNDevsel(D$)
2590   Sect=FNS|kufd(D,FNClusize(D),RIGHT$(Ufd$,A+1))
2600   IF Sect=0 Selcode=D ELSE Selcode=30
2610   Z=FNDev(Adr,Dev$+'   ',Sect,D,Selcode)
2620   RETURN 0
2630 FNEND 

