Date: Thursday, 22 August 1985 From: Bruce Conroy To: info-cpm at AMSAA.ARPA Re: dBaseII machine language interface Here is a sample dBaseII file which loads and calls a machine language program. * dBase II file to read diskcat files into dBase format * 85.0212 BLC *--!---!---!---! * modified to load and use diread.z80 * 85.0403 BLC * uses variable for catalog name, to allow several catalogs * 85.0405 BLC set delete on set talk off accept 'Date' to today set date to &today load diread accept 'Catalog to Use' to diskcat use &diskcat do while T text options are: isk ID order xtention order ull Printout ame order ualified Printout earch for File pdate catalog endtext wait to command store !(command) to command if command='D' index on disk:id+name+ext to disk endif if command='E' index on ext+name+disk:id to ext endif if command='F' store 'T' to qual do printout endif if command='N' index on name+ext+disk:id to name endif if command='Q' accept 'Selection Function? ' to qual store !(qual) to qual do printout endif if command='S' accept 'Search for? ' to qual find &qual disp endif if command='U' * directory read * 85.0403 BLC ? 'Put new disk in B and press ' wait reset copy stru to dir use dir store 'UNKNOWN' to d:id store 'xxxxxxxxxxx' to entry set call to 41984 call entry set call to 41987 do while entry # 'NO DATA' if $(entry,9,3)="DID" store $(entry,1,8) to d:id else append blank replace name with $(entry,1,8) replace ext with $(entry,9,3) replace cat:date with date() endif call entry enddo if d:id = 'UNKNOWN' ? 'No ID present' use &diskcat else replace all disk:id with d:id use &diskcat delete all for disk:id=d:id append from dir endif enddo The machine language program is created by: ; diread.z80 ; directory reading program to call from dBase ; 85.0403 BLC ;---!---!---!---! ; buffer added ; 85.0403 BLC public one, two cseg .z80 bdos equ 5 findf equ 17 ;find first funct findn equ 18 ; " next " dmaf equ 26 one: jp first ;a400h=41984 two: jp next :a403h=41987 fcb: db 2 ; code for drive B db "???????????" ;for name and ext ds 24,0 ;rest of fcb all zeroed psave: dw 0 ;save the passed parameter empty: db "NO DATA " buffer: ds 128 ;reserve a buffer first: ld c,findf jp endup next: ld c,findn endup: inc hl ;skip the length byte of dBase string ld (psave),hl ;save the address push bc ;save the function ld de,buffer ;set dma to buffer ld c,dmaf call bdos pop bc ; first or next back ld de,fcb call bdos cp 255 ;flag for no match jp z,nomore ;A has directory code ;file name is at buffer+1+32*A ld hl,buffer+1 ld de,32 again: and a ;to set z flag jp z,gotit dec a add hl,de jp again gotit: ld de,(psave) ;address of dBase string ld bc,11 ;length of name+extention ldir ;move it into the string ret nomore: ld hl,empty ;no data message ld de,(psave) ld bc,11 ldir ret end After assembly, (with M80) the HEX file is created by linking such that,the laod address is A400H (41984, above the limit of memory used by dBase) as follows: L80 /PA400,DIREAD,DIREAD/X/N/E This is a pretty primative example, but it does exercise the dBase machine language interface functions. If anybody has any information regarding the defaults, I would also be interested. Bruce Conroy (BLC@JPL-VLSI.ARPA)