home *** CD-ROM | disk | FTP | other *** search
- ; CP/M 2.0 disk re-definition library
- ;
- ; Copyright (c) 1979
- ; Digital Research
- ; Box 579
- ; Pacific Grove, CA
- ; 93950
- ;
- ; Modified by:
- ; Copyright (c) 1980
- ; Robert M. White
- ; H & W Computer Systems, Inc.
- ; 8530 Stonehaven
- ; Boise, Idaho
- ; 83704
- ;
- ;
- ; This set of macros provide necessary table
- ; definitions for the use of the new BIOS
- ; routines.
- ;
- ;
- ; * * * Disk Parameter Block * * *
- ; each parameter-list-i takes the form
- ; dfc,ssc,nsc,bls,dks,dir,cks,ofs,xlt,[0]
- ; where
- ; dfc is the Disk Format Code defined by DFOCO
- ; ssc is the physical host sector size
- ; (128,256,512,1024)
- ╗ nsπ i≤ thσ number of physical sectors per track
- ; bls is the data block size (1024,2048,...,16384)
- ; dks is the disk size in bls increments (word)
- ; dir is the number of directory elements (word)
- ; cks is the number of dir elements to checksum
- ; ofs is the number of tracks to skip (word)
- ; xlt is the optional Sector Translation Table adr
- ; (should be 0 if none)
- ; [0] is an optional 0 which forces 16K/directory entry
- ;
- ddb macro data,comment
- ;; define a db statement
- db data comment
- endm
- ;
- ddw macro data,comment
- ;; define a dw statement
- dw data comment
- endm
- ;
- ;
- DPB macro dfc,ssc,nsc,bls,dks,dir,cks,ofs,xlt,k16
- ;; generate the block shift value
- blkval set bls/128 ;;number of sectors/block
- blkshf set 0 ;;counts right 0's in blkval
- blkmsk set 0 ;;fills with 1's from right
- rept 16 ;;once for each bit position
- if blkval=1
- exitm
- endif
- ;; otherwise, high order 1 not found yet
- blkshf set blkshf+1
- blkmsk set (blkmsk shl 1) or 1
- blkval set blkval/2
- endm
- ;; generate the extent mask byte
- blkval set bls/1024 ;;number of kilobytes/block
- extmsk set 0 ;;fill from right with 1's
- rept 16
- if blkval=1
- exitm
- endif
- ;; otherwise more to shift
- extmsk set (extmsk shl 1) or 1
- blkval set blkval/2
- endm
- ;; may be double byte allocation
- if (dks) > 256
- extmsk set (extmsk shr 1)
- endif
- ;; may be optional [0] in last position
- if not nul k16
- extmsk set k16
- endif
- ;; now generate directory reservation bit vector
- dirrem set dir ;;# remaining to process
- dirbks set bls/32 ;;number of entries per block
- dirblk set 0 ;;fill with 1's on each loop
- rept 16
- if dirrem=0
- exitm
- endif
- ;; not complete, iterate once again
- ;; shift right and add 1 high order bit
- dirblk set (dirblk shr 1) or 8000h
- if dirrem > dirbks
- dirrem set dirrem-dirbks
- else
- dirrem set 0
- endif
- endm
- ;;
- hstblk set ssc/128 ;;number of CP/M sectors
- ;; ;; in a host sector
- cpmspt set hstblk*nsc
- ;;number of CP/M sectors
- ;; ;; per track
- secmsk set hstblk-1 ;;host sector mask
- secrem set hstblk
- secshf set 0
- rept 8
- if secrem=1
- exitm
- endif
- ;; not complete, iterate once again
- ;; shift right one position.
- secrem set (secrem shr 1)
- secshf set secshf+1
- endm
- ;;
- ;;
- ;; generate the DPB.
- ddw %cpmspt,<;# of CP/M sec/trk>
- ddb %blkshf,<;block shift>
- ddb %blkmsk,<;block mask>
- ddb %extmsk,<;extnt mask>
- ddw %(dks)-1,<;disk size-1>
- ddw %(dir)-1,<;directory max>
- ddb %dirblk shr 8,<;alloc0>
- ddb %dirblk and 0ffh,<;alloc1>
- ddw %(cks)/4,<;check size>
- ddw %ofs,<;offset>
- ddb %dfc,<;Disk Format Code>
- ddw %ssc,<;host sector size>
- ddb %secmsk,<;host sector mask>
- ddb %secshf,<;host sector shift value>
- ddw %xlt,<;Sector Xlat Table>
- endm
- ;
- ;
- ; * * * Register Address w/disp * * *
- rxad macro base,disp
- if not nul base
- lhld base ;get base address.
- endif
- if not nul disp
- push d ;add in disp.
- lxi d,disp
- dad d
- pop d
- endif
- endm
- ;
- ;
- ; * * * Load Register w/disp * * *
- rxld macro reg,base,disp
- rxad base,disp
- mov reg,m ;get the value.
- endm
- ;
- ;
- ; * * * Load Double Register w/disp * * *
- rxdld macro regpr,base,disp
- rxad base,disp
- mov regpr+1,m ;get low byte.
- inx h
- mov regpr,m ;get high byte.
- endm