mirror of https://github.com/wwarthen/RomWBW.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
180 lines
4.0 KiB
180 lines
4.0 KiB
; Macro Definitions for CP/M3 BIOS Data Structures.
|
|
|
|
; dtbl <dph0,dph1,...> - 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 aset 0
|
|
irp ?drv,<?list>
|
|
?n aset ?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
|
|
dw ?csv ; checksum vector
|
|
else
|
|
dw 0FFFEh ; checksum vector allocated by
|
|
endif ; GENCPM
|
|
if not nul ?asize
|
|
dw ?alv ; allocation vector
|
|
else
|
|
dw 0FFFEh ; alloc vector allocated by GENCPM
|
|
endif
|
|
dw 0fffeh,0fffeh,0fffeh ; dirbcb, dtabcb, hash allocd
|
|
; by GENCPM
|
|
db 0 ; hash bank
|
|
|
|
if not nul ?csize
|
|
?csv ds ?csize ; checksum vector
|
|
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 aset 0
|
|
?n aset ?psize/128
|
|
?psm aset ?n-1
|
|
rept 8
|
|
?n aset ?n/2
|
|
if (?n = 0)
|
|
exitm
|
|
endif
|
|
?psh aset ?psh + 1
|
|
endm
|
|
?spt aset ?pspt*(?psize/128)
|
|
|
|
?bsh aset 3
|
|
?n aset ?bls/1024
|
|
rept 8
|
|
?n aset ?n/2
|
|
if (?n = 0)
|
|
exitm
|
|
endif
|
|
?bsh aset ?bsh + 1
|
|
endm
|
|
?blm aset ?bls/128-1
|
|
?size aset (?trks-?off)*?spt
|
|
?dsm aset ?size/(?bls/128)-1
|
|
|
|
?exm aset ?bls/1024
|
|
if ?dsm > 255
|
|
if ?bls = 1024
|
|
.'Error, can''t have this size disk with 1k block size'
|
|
exitm
|
|
endif
|
|
?exm aset ?exm/2
|
|
endif
|
|
?exm aset ?exm-1
|
|
?all aset 0
|
|
?n aset (?ndirs*32+?bls-1)/?bls
|
|
rept ?n
|
|
?all aset (?all shr 1) or 8000h
|
|
endm
|
|
?al0 aset high ?all
|
|
?al1 aset low ?all
|
|
?drm aset ?ndirs-1
|
|
if not nul ?ncks
|
|
?cks aset ?ncks
|
|
else
|
|
?cks aset ?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 aset ?m ;;variable for m
|
|
?gcdn aset ?n ;;variable for n
|
|
?gcdr aset 0 ;;variable for r
|
|
rept 65535
|
|
?gcdx aset ?gcdm/?gcdn
|
|
?gcdr aset ?gcdm - ?gcdx*?gcdn
|
|
if ?gcdr = 0
|
|
exitm
|
|
endif
|
|
?gcdm aset ?gcdn
|
|
?gcdn aset ?gcdr
|
|
endm
|
|
endm
|
|
|
|
skew macro ?secs,?skf,?fsc
|
|
;; generate the translate table
|
|
?nxtsec aset 0 ;;next sector to fill
|
|
?nxtbas aset 0 ;;moves by one on overflow
|
|
gcd %?secs,?skf
|
|
;; ?gcdn = gcd(?secs,skew)
|
|
?neltst aset ?secs/?gcdn
|
|
;; neltst is number of elements to generate
|
|
;; before we overlap previous elements
|
|
?nelts aset ?neltst ;;counter
|
|
rept ?secs ;;once for each sector
|
|
db ?nxtsec+?fsc
|
|
?nxtsec aset ?nxtsec+?skf
|
|
if ?nxtsec >= ?secs
|
|
?nxtsec aset ?nxtsec-?secs
|
|
endif
|
|
?nelts aset ?nelts-1
|
|
if ?nelts = 0
|
|
?nxtbas aset ?nxtbas+1
|
|
?nxtsec aset ?nxtbas
|
|
?nelts aset ?neltst
|
|
endif
|
|
endm
|
|
endm
|
|
|