	title	'MP/M II V2.0 CLBDOS Procedures'
	name	'clbdos'
	dseg
@@clbdos:
	public	@@clbdos
	cseg
@clbdos:
	public	@clbdos

;/*
;  Copyright (C) 1979,1980,1981
;  Digital Research
;  P.O. Box 579
;  Pacific Grove, CA 93950
;
;  Revised:
;    14 Sept 81 by Thomas Rolander
;*/


		;  open:
open:
		;    procedure (fcb$adr) byte reentrant public;
	public	open
		;      declare fcb$adr address;
		;      declare fcb based fcb$adr fcb$descriptor;
		;  
	mov	d,b
	mov	e,c
	mvi	c,15
	jmp	mon2
		;      return mon2 (15,fcb$adr);
		;    end open;
		;  
		;  close:
close:
		;    procedure (fcb$adr) reentrant public;
	public	close
		;      declare fcb$adr address;
		;      declare ret byte;
		;  
	mov	d,b
	mov	e,c
	mvi	c,16
	jmp	mon2
		;      ret = mon2 (16,fcb$adr);
		;    end close;
		;  
		;  readbf:
readbf:
		;    procedure (fcb$adr) byte reentrant public;
	public	readbf
		;      declare fcb$adr address;
		;  
	mov	d,b
	mov	e,c
	mvi	c,20
	jmp	mon2
		;      return mon2 (20,fcb$adr);
		;    end readbf;
		;  
		;  init:
init:
		;    procedure reentrant public;
	public	init
		;
	mvi	c,13
	jmp	mon1
		;      call mon1 (13,0);
		;    end init;
		;
		;  set$dma:
setdma:
		;    procedure (dma$adr) public;
	public	setdma
		;      declare dma$adr address;
		;
	mov	d,b
	mov	e,c
	mvi	c,26
	jmp	mon1
		;      call mon1 (26,dma$adr);
		;    end set$dma;
		;
		;  flshbf:
flshbf:
		;    procedure public;
	public	flshbf
		;
	mvi	c,48
	jmp	mon1
		;      call mon1 (48,0);
		;    end flshbf;
		;
		;  lo:
lo:
		;    procedure (char) reentrant public;
	public	lo
		;      declare char byte;
		;
	mov	e,c
	mvi	c,5
	jmp	mon1
		;      call mon1 (5,char);
		;    end lo;
		;
		;  co:
co:
		;    procedure (char) reentrant public;
	public	co
		;      declare char byte;
		;
	mov	e,c
	mvi	c,2
	jmp	mon1
		;      call mon1 (2,char);
		;    end co;
		;
		;  ci:
ci:
		;    procedure byte reentrant public;
	public	ci
		;
	mvi	c,1
	jmp	mon2
		;      return mon2 (1,0);
		;    end ci;
		;
		;  rawci:
rawci:
		;    procedure byte reentrant public;
	public	rawci
		;
	mvi	c,6
	mvi	e,0ffh
	jmp	mon2
		;      return mon2 (6,0ffh);
		;    end rawci;
		;
		;  rawlst:
rawlst:
		;    procedure (string$address) reentrant public;
		;      declare string$address address;
		;      declare char based string$address byte;
	public	rawlst
		;
		;      do while char <> '$';
	ldax	b
	cpi	'$'
	rz
	push	b
	mvi	c,6
	mov	e,a
	call	mon1
		;        call mon1 (6,char);
	pop	b
	inx	b
	jmp	rawlst
		;      end;
		;    end rawlst;
		;
		;  print$buffer:
printb:
		;    procedure (bufferadr) reentrant public;
	public	printb
		;      declare bufferadr address;
		;
	mov	d,b
	mov	e,c
	mvi	c,9
	jmp	mon1
		;      call mon1 (9,bufferadr);
		;    end print$buffer;
		;
		;  read$buffer:
readbu:
		;    procedure (bufferadr) reentrant public;
	public	readbu
		;      declare bufferadr address;
		;
	mov	d,b
	mov	e,c
	mvi	c,10
	jmp	mon1
		;      call mon1 (10,bufferadr);
		;    end read$buffer;
		;
		;  crlf:
crlf:
		;    procedure reentrant public;
	public	crlf
		;
		;      call co (0DH);
	mvi	c,0dh
	call	co
		;      call co (0AH);
	mvi	c,0ah
	jmp	co
		;    end crlf;
		;

terminate	equ	143

	public	endp
endp:
	push	psw
	push	b
	push	d
	push	h
	mvi	c,terminate	;143
	lxi	d,0
	call	xbdos
	pop	h
	pop	d
	pop	b
	pop	psw
	ret

	public	exitr
	extrn	indisp
exitr:
	lda	indisp
	ora	a
	jz	exitregion	;exit region only if not in dispatcher
	ret

xiosoffset	equ	33h

	public	xiosms
xiosms:
	jmp	$-$
	public	xiospl
xiospl:
	jmp	$-$
	public	strclk
strclk:
	jmp	$-$
	public	stpclk
stpclk:
	jmp	$-$
;	public	exitr
exitregion:
	jmp	$-$
	public	maxcns
maxcns:
	jmp	$-$
;	public	sysinit
;sysinit:
	jmp	$-$
	public	xidle
xidle:
	jmp	$-$

	extrn	sysdat,datapg
	public	syinit
syinit:
	mvi	l,252
	lxi	d,datapg
	mov	m,e
	inx	h
	mov	m,d		; datapg[252] = system data pg adr
	lxi	h,mpmtop
	mvi	l,-6
	lxi	d,xjmptbl
	mvi	b,6
moveloop:
	ldax	d
	mov	m,a
	inx	d
	inx	h
	dcr	b
	jnz	moveloop
	inx	h
	mov	e,m
	inx	h
	mov	d,m
	xchg
	shld	xbdosadr
	xchg
	inx	h
	inx	h
	mov	e,m
	inx	h
	mov	d,m
	inx	h
	push	h
	lxi	h,xiosoffset
	dad	d
			; copy XIOS jump table
	mvi	b,24	; 8 entries * 3 bytes
	lxi	d,xiosms
mvxiostbl:
	mov	a,m
	stax	d
	inx	h
	inx	d
	dcr	b
	jnz	mvxiostbl

	extrn	dspsvz80,dsprsz80

	lxi	h,-3
	dad	d
	mvi	a,0c3h
	cmp	m	;is XIOS idle routine present?
	jz	idleok
	mov	m,a
	lxi	d,pdisp
	inx	h
	mov	m,e
	inx	h
	mov	m,d
idleok:
	lhld	sysdat
	mvi	l,5
	mov	a,m
	ora	a
	jz	notz80	;test z80 flag in sys dat page
	xra	a
	sta	dspsvz80
	lxi	h,0
	shld	dspsvz80+1
	sta	dsprsz80
	shld	dsprsz80+1
notz80:

	lhld	sysdat	;passed parameter, HL = sysdat
	ret

	public	nfxdos
nfxdos:
	extrn	xdos,pdisp
xjmptbl:
	jmp	xdos
	jmp	pdisp

	public	xbdos
xbdos:
	public	mon1,mon2
mon1:
mon2:
	lhld	xbdosadr
	pchl

	dseg
xbdosadr:
	ds	2

	ds	3	; make room for BDOS external jump table
	ds	3

mpmtop:
	db	0	; force byte at end of mpm nucleus module

	end
