
	name	'PLIBIOS'
	title	'Direct BIOS Calls From PL/I-80'
;
;***********************************************************
;*                                                         *
;*	bios calls from pl/i for track, sector io          *
;*                                                         *
;***********************************************************
	public  seldsk	;select disk drive
	public	settrk	;set track number
	public	setsec	;set sector number
	public	rdsec	;read sector
	public	wrsec	;write sector
	public  sectrn	;translate sector number
;
;
	extrn	?boot	;system reboot entry point
	extrn	?bdos	;bdos entry point
;
;***********************************************************
;*                                                         *
;*        equates for interface to cp/m bios               *
;*                                                         *
;***********************************************************
cr	equ	0dh	;carriage return
lf	equ	0ah	;line feed
eof	equ	1ah	;end of file
;
base	equ	0
wboot	equ	base+1h	;warm boot entry point stored here
sdsk	equ	18h	;bios select disk entry point
strk	equ	1bh	;bios set track entry point
ssec	equ	1eh	;bios set sector entry point
read	equ	24h	;bios read sector entry point
write	equ	27h	;bios write sector entry point
stran	equ	2dh	;bios sector translation entry point
readc	equ	1	;read character from console
writc	equ	2	;write console character
rdrf	equ	3	;reader input
punf	equ	4	;punch output
listf	equ	5	;list output function
diof	equ	6	;direct i/o, version 2.0
getiof	equ	7	;get i/o byte
setiof	equ	8	;set i/o byte
printf	equ	9	;print string function
rdconf	equ	10	;read console buffer
statf	equ	11	;return console status
versf	equ	12	;get version number
resetf	equ	13	;system reset
seldf	equ	14	;select disk function
openf	equ	15	;open file function
closef	equ	16	;close file
serchf	equ	17	;search for file
serchn	equ	18	;search next
deletf	equ	19	;delete file
readf	equ	20	;read next record
writf	equ	21	;write next record
makef	equ	22	;make file
renamf	equ	23	;rename file
loginf	equ	24	;get login vector
cdiskf	equ	25	;get current disk number
setdmf	equ	26	;set dma function
getalf	equ	27	;get allocation base
wrprof	equ	28	;write protect disk
getrof	equ	29	;get r/o vector
setatf	equ	30	;set file attributes
getdpf	equ	31	;get disk parameter block
userf	equ	32	;set/get user code
rdranf	equ	33	;read random
wrranf	equ	34	;write random
filszf	equ	35	;compute file size
setrcf	equ	36	;set random record position
rsdrvf	equ	37	;reset drive function
wrrnzf	equ	40	;write random zero fill
;
;	utility functions
;
;***********************************************************
;***********************************************************
;*                                                         *
;*       general purpose routines used upon entry          *
;*                                                         *
;***********************************************************
;
;
getp:	;get parameter
	mov	e,m	;low (addr)
	inx	h
	mov	d,m	;high (addr)
	inx	h
	push	h	;save for next parameter
	xchg		;hl = .char
	mov	e,m	;to register e
	inx	h
	mov	d,m	;get high byte as well
	pop	h	;ready for next parameter
	ret
;
;
;***********************************************************
;*                                                         *
;***********************************************************
seldsk:	;select drive number 0-15, in C
	;1-> drive no.
	;returns-> pointer to translate table in HL
	call getp
	mov c,e		;c = drive no.
	lxi d,sdsk
	jmp gobios
;
;***********************************************************
;*                                                         *
;***********************************************************
settrk:	;set track number 0-76, 0-65535 in BC
	;1-> track no.
	call getp
	mov b,d
	mov c,e		;bc = track no.
	lxi d,strk
	jmp gobios
;
;***********************************************************
;*                                                         *
;***********************************************************
setsec:	;set sector number 1 - sectors per track
	;1-> sector no.
	call getp
	mov b,d
	mov c,e		;bc = sector no.
	lxi d,ssec
	jmp gobios
;
;***********************************************************
;*                                                         *
;***********************************************************
rdsec:	;read current sector into sector at dma addr
	;returns in A register:	0 if no errors 
	;			1 non-recoverable error
	lxi d,read
	jmp gobios
;***********************************************************
;*                                                         *
;***********************************************************
wrsec:	;writes contents of sector at dma addr to current sector
	;returns in A register:	0 errors occured
	;			1 non-recoverable error
	lxi d,write
	jmp gobios
;
;***********************************************************
;*                                                         *
;***********************************************************
sectrn:	;translate sector number
	;1-> logical sector number (fixed(15))
	;2-> pointer to translate table
	;returns-> physical sector number
	call getp	;first parameter
	mov b,d	
	mov c,e		;bc = logical sector no.
	call getp	;second parameter
	push d		;save it
	lxi d,stran
	lhld wboot
	dad d		;hl = sectran entry point
	pop d		;de = .translate-table 
	pchl
;***********************************************************
;***********************************************************
;***********************************************************
;*                                                         *
;*       compute offset from warm boot and jump to bios    *
;*                                                         *
;***********************************************************
;
;
gobios:	;jump to bios entry point
	;de ->  offset from warm boot entry point
	lhld	wboot
	dad	d
	pchl
;
	end

