
;****************************************************************
;*								*
;*	CP/M-Z8K Interface module for the Loader BDOS		*
;*		For "C" version of CP/M-Z8K    			*
;*								*
;*	Copyright (c) 1982 Digital Research, Inc.		*
;*								*
;*	Version 0.2 -- September 22, 1982			*
;*	Z8000 version -- 830728					*
;*								*
;****************************************************************

__text:	.sect

;****************************************************
;*
;*  Globals
;*
;****************************************************


	.global	_bios1		; 6 BIOS entry points from BDOS
	.global	_bios2
	.global	_bios3
	.global	_bios4
	.global	_bios5
	.global	_swap		; byte swapper
	.global	_udiv		; unsigned divide routine

;****************************************************
;*
;* Externals and Constants
;*
;****************************************************

	.global	_bios		; The Loader BDOS calls the BIOS direct

;****************************************************
;*
;* BIOS Interface Routines
;*
;*  Note - there are 5 BIOS entry points from the BDOS, 
;*	labelled BIOS1 - BIOS5, depending on the 
;*	parameters passed.
;*
;****************************************************

_bios5:
; For BIOS functions sectran and set exception vector
; (funct, word, long) 	offsets 2, 4, 6

	ldl	rr6,6(r15)	; get 2nd param (long)
	jp	_bios2		; join common routine

_bios4:
; For BIOS function seldsk
; (func, word, word) 	offsets 2, 4, 6
	ld	r7,6(r15)	; get 2nd param (word)
	clr	r6		; extend to ulong
	jp	_bios2		; join common routine

_bios3:
; For BIOS function set dma
; (func, long)		offsets 2, 4
	ldl	rr4,4(r15)	; get 1st param (long)
	subl	rr6,rr6		; clear second
	jp	_bios1		; join common routine

_bios2:
; For all BIOS functions with a word parameter
; (func, word)		offsets 2, 4
	ld	r5,4(r15)	; get 1st param (word)
	clr	r4		; extend to ulong

_bios1:
; For all BIOS functions that have no parameter 
; other than function number
	ld	r3,2(r15)	; get function number
	sub	r15, #10	; adjust sp...
	ldm	@r15, r3, #5	; ... and push args on stack
	call	_bios		; do BIOS call as a call...
	add	r15, #10	; ...and readjust sp
	ret			; returns value in rr7

;****************************************************
;*
;*  Utility Subroutines
;*
;*  swap(word)		swap bytes of a word
;*
;*  uword udiv((long)   dividend, 
;*	       (uword)  divisor, 
;*	       (uword *)rem    )
;*
;****************************************************

_swap:
	ld	r7,2(r15)
	exb	rh7,rl7
	ret

_udiv:
	ldl	rr2,2(r15)	;long dividend
	subl	rr0,rr0		;  as unsigned quad
	ld	r5,6(r15)	;word divisor
	clr	r4		;  as unsigned long
	ldl	rr6,8(r15)	;->result

	divl	rq0,rr4

	ld	@r7,r1		; store remainder
	ld	r7,r3		; return quotient
	clr	r6


	ret


