; Macro Definitions for CP/M3 BIOS Data Structures. ; dtbl - drive table ; dph translate$table, - disk parameter header ; disk$parameter$block, ; checksum$size, (optional) ; alloc$size (optional) ; skew sectors, - skew table ; skew$factor, ; first$sector$number ; dpb physical$sector$size, - disk parameter block ; physical$sectors$per$track, ; number$tracks, ; block$size, ; number$dir$entries, ; track$offset, ; checksum$vec$size (optional) ; Drive Table. Contains 16 one word entries. dtbl macro ?list local ?n ?n defl 0 irp ?drv, ?n defl ?n+1 dw ?drv endm if ?n > 16 .' Too many drives. Max 16 allowed' exitm endif if ?n < 16 rept (16-?n) dw 0 endm endif endm dph macro ?trans,?dpb,?csize,?asize local ?csv,?alv dw ?trans ; translate table address db 0,0,0,0,0,0,0,0,0 ; BDOS Scratch area db 0 ; media flag dw ?dpb ; disk parameter block if not nul ?csize if ?csize = 0 dw 0 ; permanently mounted, no checksum vector else dw ?csv ; checksum vector endif else dw 0FFFEh ; checksum vector alloc'd by GENCPM endif if not nul ?asize dw ?alv ; allocation vector else dw 0FFFEh ; alloc vector allocated by GENCPM endif dw 0fffeh,0fffeh,0fffeh ; dirbcb, dtabcb, hash alloc'd ; by GENCPM db 0 ; hash bank if not nul ?csize if ?csize <> 0 ?csv ds ?csize ; checksum vector endif endif if not nul ?asize ?alv ds ?asize ; allocation vector endif endm dpb macro ?psize,?pspt,?trks,?bls,?ndirs,?off,?ncks local ?spt,?bsh,?blm,?exm,?dsm,?drm,?al0,?al1,?cks,?psh,?psm local ?n ;; physical sector mask and physical sector shift ?psh defl 0 ?n defl ?psize/128 ?psm defl ?n-1 rept 8 ?n defl ?n/2 if ?n = 0 exitm endif ?psh defl ?psh + 1 endm ?spt defl ?pspt*(?psize/128) ?bsh defl 3 ?n defl ?bls/1024 rept 8 ?n defl ?n/2 if ?n = 0 exitm endif ?bsh defl ?bsh + 1 endm ?blm defl ?bls/128-1 ?size defl (?trks-?off)*?spt ?dsm defl ?size/(?bls/128)-1 ?exm defl ?bls/1024 if ?dsm > 255 if ?bls = 1024 .'Error, can''t have this size disk with 1k block size' exitm endif ?exm defl ?exm/2 endif ?exm defl ?exm-1 ?all defl 0 ?n defl (?ndirs*32+?bls-1)/?bls rept ?n ?all defl (?all shr 1) or 8000h endm ?al0 defl high ?all ?al1 defl low ?all ?drm defl ?ndirs-1 if not nul ?ncks ?cks defl ?ncks else ?cks defl ?ndirs/4 endif dw ?spt ; 128 byte records per track db ?bsh,?blm ; block shift and mask db ?exm ; extent mask dw ?dsm ; maximum block number dw ?drm ; maximum directory entry number db ?al0,?al1 ; alloc vector for directory dw ?cks ; checksum size dw ?off ; offset for system tracks db ?psh,?psm ; physical sector size shift ; and mask endm ; gcd macro ?m,?n ;; greatest common divisor of m,n ;; produces value gcdn as result ;; (used in sector translate table generation) ?gcdm defl ?m ;;variable for m ?gcdn defl ?n ;;variable for n ?gcdr defl 0 ;;variable for r rept 65535 ?gcdx defl ?gcdm/?gcdn ?gcdr defl ?gcdm - ?gcdx*?gcdn if ?gcdr = 0 exitm endif ?gcdm defl ?gcdn ?gcdn defl ?gcdr endm endm skew macro ?secs,?skf,?fsc ;; generate the translate table ?nxtsec defl 0 ;;next sector to fill ?nxtbas defl 0 ;;moves by one on overflow gcd %?secs,?skf ;; ?gcdn = gcd(?secs,skew) ?neltst defl ?secs/?gcdn ;; neltst is number of elements to generate ;; before we overlap previous elements ?nelts defl ?neltst ;;counter rept ?secs ;;once for each sector db ?nxtsec+?fsc ?nxtsec defl ?nxtsec+?skf if ?nxtsec >= ?secs ?nxtsec defl ?nxtsec-?secs endif ?nelts defl ?nelts-1 if ?nelts = 0 ?nxtbas defl ?nxtbas+1 ?nxtsec defl ?nxtbas ?nelts defl ?neltst endif endm endm