mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-26 18:04:07 +00:00
Upload
Digital Research
This commit is contained in:
203
CONTRIBUTIONS/z80em86/bios/cpm3.lib
Normal file
203
CONTRIBUTIONS/z80em86/bios/cpm3.lib
Normal file
@@ -0,0 +1,203 @@
|
||||
; Macro Definitions for CP/M3 BIOS Data Structures.
|
||||
; Corrected by Lindsay Probyn for over flow checks
|
||||
; in dph macro (12 August 1983)
|
||||
; Copyright 1983 SME Systems
|
||||
; 22 Queen St Mitcham.
|
||||
|
||||
|
||||
; 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 set 0
|
||||
irp ?drv,<?list>
|
||||
?n set ?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 alloc'd
|
||||
; 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,?spb,?x,?y,?z
|
||||
;; physical sector mask and physical sector shift
|
||||
?psh set 0
|
||||
?n set ?psize/128
|
||||
?psm set ?n-1
|
||||
rept 8
|
||||
?n set ?n/2
|
||||
if ?n = 0
|
||||
exitm
|
||||
endif
|
||||
?psh set ?psh + 1
|
||||
endm
|
||||
?spt set ?pspt*(?psize/128)
|
||||
|
||||
?bsh set 3
|
||||
?n set ?bls/1024
|
||||
rept 8
|
||||
?n set ?n/2
|
||||
if ?n = 0
|
||||
exitm
|
||||
endif
|
||||
?bsh set ?bsh + 1
|
||||
endm
|
||||
?blm set ?bls/128-1
|
||||
?size set (?trks-?off)*?pspt
|
||||
?spb set ?bls/?psize
|
||||
?dsm set (?size/?spb)-1
|
||||
|
||||
?exm set ?bls/1024
|
||||
if ?dsm > 255
|
||||
if ?bls = 1024
|
||||
.'Error, can''t have this size disk with 1k block size'
|
||||
exitm
|
||||
endif
|
||||
?exm set ?exm/2
|
||||
endif
|
||||
?exm set ?exm-1
|
||||
|
||||
if ?ndirs > ?bls/2
|
||||
.'Error, increase block size or decrease directory entries'
|
||||
exitm
|
||||
endif
|
||||
?all set 0
|
||||
?x set ?ndirs
|
||||
?y set ?bls-1
|
||||
?z set ?bls
|
||||
|
||||
rept 16
|
||||
if ?x > 2047
|
||||
?x set ?x/2
|
||||
?y set ?y/2
|
||||
?z set ?z/2
|
||||
else
|
||||
exitm
|
||||
endif
|
||||
endm
|
||||
?n set (?x*32+?y)/?z
|
||||
rept ?n
|
||||
?all set (?all shr 1) or 8000h
|
||||
endm
|
||||
?al0 set high ?all
|
||||
?al1 set low ?all
|
||||
?drm set ?ndirs-1
|
||||
if not nul ?ncks
|
||||
?cks set ?ncks
|
||||
else
|
||||
?cks set ?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 set ?m ;;variable for m
|
||||
?gcdn set ?n ;;variable for n
|
||||
?gcdr set 0 ;;variable for r
|
||||
rept 65535
|
||||
?gcdx set ?gcdm/?gcdn
|
||||
?gcdr set ?gcdm - ?gcdx*?gcdn
|
||||
if ?gcdr = 0
|
||||
exitm
|
||||
endif
|
||||
?gcdm set ?gcdn
|
||||
?gcdn set ?gcdr
|
||||
endm
|
||||
endm
|
||||
|
||||
skew macro ?secs,?skf,?fsc
|
||||
;; generate the translate table
|
||||
?nxtsec set 0 ;;next sector to fill
|
||||
?nxtbas set 0 ;;moves by one on overflow
|
||||
gcd %?secs,?skf
|
||||
;; ?gcdn = gcd(?secs,skew)
|
||||
?neltst set ?secs/?gcdn
|
||||
;; neltst is number of elements to generate
|
||||
;; before we overlap previous elements
|
||||
?nelts set ?neltst ;;counter
|
||||
rept ?secs ;;once for each sector
|
||||
db ?nxtsec+?fsc
|
||||
?nxtsec set ?nxtsec+?skf
|
||||
if ?nxtsec >= ?secs
|
||||
?nxtsec set ?nxtsec-?secs
|
||||
endif
|
||||
?nelts set ?nelts-1
|
||||
if ?nelts = 0
|
||||
?nxtbas set ?nxtbas+1
|
||||
?nxtsec set ?nxtbas
|
||||
?nelts set ?neltst
|
||||
endif
|
||||
endm
|
||||
endm
|
||||
Reference in New Issue
Block a user