Page 1 of 1

Is it possible to get a list of all (normal) device drivers?

Posted: Thu Jan 03, 2019 8:25 pm
by ql_freak
Is it possible to get a list (e.g. in a string array) of NORMAL device drivers?

For directory device drivers this is quite easy:

Code: Select all

10140  REMark create string array with list of directory device drivers:
10150  __sys__dirdevs%=0:DIM __sys__dirdev$(19,10)
10160  dd=PEEK_L(VER$(-2)+72):REMark get pointer to list of directory device drivers
10170  FOR i%=0TO 32767:REMark "endless" loop
10180    IF NOT dd:__sys__dirdevs%=i%:__sys__dirdev$(i%)='':EXIT i%
10190    l=PEEK_W(dd+36):__sys__dirdev$(i%)=FILL$('xy',l)
10200    FOR c=1TO l:__sys__dirdev$(i%,c)=CHR$(PEEK(dd+37+c))
10210    PRINT __sys__dirdev$(i%)
10220    dd=PEEK_L(dd)
10230  END FOR i%
But I'm afraid there is no way, to do similar for normal device drivers, as they use the IO.NAME vector in the open routine to decode the device name. And the only location, where the device name seems to be stored is 6 bytes after the IO.NAME call in the open routine (see description in Technical Guide, the description in Adrian Dickens "Advanced User Guide" is not sufficient[!]).

Re: Is it possible to get a list of all (normal) device drivers?

Posted: Thu Jan 03, 2019 9:06 pm
by tofro
Peter,

I also cannot see an obvious way, just a kludge:

If you spend a bit of time ;) , you can maybe do it the same way QDOS does it:

The list of possible permutations of max. 4 * 26 characters, an optional number, and an underscore seems manageable.

Trying to FOPEN all possible permutations and collecting those that do not return "not found" (indicating the OS has found a driver that recognised the name, but couldn't handle the attributes) should give you a list of all possible base names in a few seconds. You obviously need to remove the names you have identified as directory device drivers, and you obviously cannot identify the possible channel arguments.

Tobias

Re: Is it possible to get a list of all (normal) device drivers?

Posted: Thu Jan 03, 2019 9:26 pm
by ql_freak
Thank you,

would be a way, but I find it too cumbersome. Perhaps I try to write a Machine code program, which scans the open routine of all device drivers for vector 122 (IO.NAME) and afterwards looks for the next jsr call and look 6 bytes afterwards for the name. Will most probably be more complicated but in principle this could work.

Re: Is it possible to get a list of all (normal) device drivers?

Posted: Thu Jan 03, 2019 11:13 pm
by pjw
Is this the sort of thing you mean?

Code: Select all

100 REMark SMSQ/E Version
110 :
120 DEFine PROCedure GetDevS
130 LOCal gdl, p, dd$
140 p = PEEK_L(!! 72): REMark SMSQ/E only
150 REMark QDOS: p = PEEK_L(163840 + 72)
160 REMark Minerva/SMSQ/E p = PEEK_L(VER$(-2) + 72)
170 REPeat gdl
180  dd$ = PeekStrg$(p + 36)
190  IF LEN(dd$) > 0: PRINT dd$
200  p = PEEK_L(p): IF p = 0: EXIT gdl
210 END REPeat gdl
220 END DEFine GetDevS
230 :
240 REMark PEEK$ is SMSQ/E or toolkit only
250 DEFine FuNction PeekStrg$(adr)
260 LOCal l%
270 l% = PEEK_W(adr)
280 SELect ON l%: = 1 TO 4: RETurn PEEK$(adr + 2, l%)
290 RETurn ''
300 END DEFine PeekStrg$
310 :
This is SMSQ/E only, but it should be easy enough to make it universal.

Re: Is it possible to get a list of all (normal) device drivers?

Posted: Thu Jan 03, 2019 11:31 pm
by pjw
Sorry, I misread your question. To get the non-directory drivers is not easy, as programmers can pretty much define these as they like. I dont think theres any way you are guaranteed to get them all.

Re: Is it possible to get a list of all (normal) device drivers?

Posted: Sat Jan 05, 2019 11:58 pm
by mk79
As you have noticed in theory there is no way to do this reliably as the OPEN code decides what to handle. In real life a bit of heuristic works fine in most cases. This is the program I use to list drivers for debugging etc.

Code: Select all

2000 :
2010 IF VER$ == "HBA": JOB_NAME "LSD_bas"
2020 OPEN#3,"con_512x240a0x16": INK#3,7: BORDER#3,4,4: CLS#3
2030 Lsd#3
2040 INPUT#3," > ";a$; : CLOSE: STOP
2050 :
2060 DEFine PROCedure Lsd(ch%)
2070   IF ch%=0: ch%=2
2080   PRINT#ch%
2090   sv_drlst=HEX('44')
2100   link=PEEK_L(!!sv_drlst)
2110   IF link=0: PRINT#ch%,'Kein IO-Device gefunden': RETurn
2120   PRINT#ch%,'Serielle IO-Treiber:'
2130   PRINT#ch%,'Link       IO        OPEN      CLOSE     INT2      POLL      SCHD      NAME'
2140 :
2150   REPeat lsd_loop
2160     link_next = PEEK_L(link)
2170     io_adr    = PEEK_L(link+4)
2180     open_adr  = PEEK_L(link+8)
2190     close_adr = PEEK_L(link+12)
2200     int2_adr  = PEEK_L(link-24+4)
2210     poll_adr  = PEEK_L(link-24+12)
2220     schd_adr  = PEEK_L(link-24+20)
2230     str_adr = open_adr: io_name$="---"
2240     FOR n = 1 TO 64
2250       slen = ABS(PEEK_W(str_adr))
2260       str_adr = str_adr + 2
2270       IF slen > 0 AND slen < 8 THEN
2280         io_name$ = ""
2290         FOR i = 1 TO slen
2300           c$ = CHR$(PEEK(str_adr + i - 1))
2310           IF c$(1) < "A" OR c$(1) > "Z": io_name$="+++": NEXT n
2320           io_name$ = io_name$ & c$
2330         END FOR i
2340         EXIT n
2350       END IF
2360     END FOR n
2370 :
2380     PRINT#ch%,HEX$(link,32)!!!HEX$(io_adr,32)!!HEX$(open_adr,32)!!HEX$(close_adr,32)!!HEX$(int2_adr,32)!!HEX$(poll_adr,32)!!HEX$(schd_adr,32)!!io_name$
2390     IF link_next=0:EXIT lsd_loop
2400     link=link_next
2410   END REPeat lsd_loop
2420 :
2430   PRINT#ch%,'fertig'
2440 END DEFine Lsd

Re: Is it possible to get a list of all (normal) device drivers?

Posted: Mon Jan 07, 2019 8:35 pm
by ql_freak
Thank You Marcel!

Very nice program, lists even the name of the REDIR device from Phil Borman.