index.a68
; Copyright (C) 1984 by Manx Software Systems, Inc.
; :ts=8
;
	public _index
_index
	move.l	4(sp),a0
	IF INT32
	move.l	8(sp),d0
	ELSE
	move.w	8(sp),d0
	ENDC
.1
	move.b	(a0)+,d1
	beq	.2
	cmp.b	d0,d1
	bne	.1
	move.l	a0,d0
	sub.l	#1,d0
	rts
.2
	move.l	#0,d0
	rts
;
ldiv.a68
; Copyright (C) 1984 by Manx Software Systems, Inc.
;:ts=8
;
	public	.divs
.divs:		;long divide	(primary = primary/secondary)
	movem.l	d1/d4,-(sp)
	clr.l	d4			;mark result as positive
	tst.l	d0
	bpl.s	prim_ok
	neg.l	d0
	add.w	#1,d4			;mark as negative
prim_ok:
	tst.l	d1
	bpl.s	sec_ok
	neg.l	d1
	eor.w	#1,d4			;flip sign of result
sec_ok:
	jsr	comdivide
chksign:
	tst.w	d4
	beq.s	posres
	neg.l	d0
posres:
	movem.l	(sp)+,d1/d4
	tst.l	d0
	rts
;
	public	.mods
.mods:		;long remainder	(primary = primary%secondary)
	movem.l	d1/d4,-(sp)
	clr.l	d4			;mark result as positive
	tst.l	d0
	bpl.s	rprim_ok
	neg.l	d0
	add.w	#1,d4			;mark as negative
rprim_ok:
	tst.l	d1
	bpl.s	rsec_ok
	neg.l	d1
rsec_ok:
	jsr	comdivide
	move.l	d1,d0
	jmp	chksign
;
	public	.modu
.modu:		;unsigned long remainder	(primary = primary%secondary)
	move.l	d1,-(sp)
	jsr	comdivide
	move.l	d1,d0
	move.l	(sp)+,d1
	tst.l	d0
	rts
;
	public	.divu
.divu:		;unsigned long divide		(primary = primary/secondary)
	move.l	d1,-(sp)
	jsr	comdivide
	move.l	(sp)+,d1
	tst.l	d0
	rts

; divide (dx,ax) by (bx,cx):
;	quotient in (dx,ax)
;	remainder in (bx,cx)
comdivide:
	movem.l	d2/d3,-(sp)
	swap	d1
	tst.w	d1
	bne	hardldv
	swap	d1
	move.w	d1,d3		;get divisor
	move.w	d0,d2		;save second part of dividend
	clr.w	d0		;get first part of dividend
	swap	d0
	divu	d3,d0		;do first divide
	move.l	d0,d1		;copy first remainder
	swap	d0		;get first quotient
	move.w	d2,d1		;get back second part of dividend
	divu	d3,d1		;do second divide
	move.w	d1,d0		;get second quotient
	clr.w	d1		;remainder is small
	swap	d1		;get it
	movem.l	(sp)+,d2/d3
	rts			;and return

hardldv:
	swap	d1
	move.l	d1,d3		;save divisor
	move.l	d0,d1		;copy dividend
	clr.w	d1		;set up remainder
	swap	d1
	swap	d0		;set up quotient
	clr.w	d0
	move.l	#16-1,d2		;do 16 times
1$
	add.l	d0,d0		;shift the quotient
	addx.l	d1,d1		;shift the remainder
	cmp.l	d1,d3		;check if big enough to subtract
	bhi	2$
	sub.l	d3,d1		;yes, so subtract it
	add.w	#1,d0		;and add one to quotient
2$
	dbf	d2,1$		;and loop till done
	movem.l	(sp)+,d2/d3
	rts

lmul.a68
; Copyright (C) 1984 by Manx Software Systems, Inc.
;:ts=8
;
	public	.mulu
.mulu:		;unsigned long multiply	(primary = primary*secondary)
;
	movem.l	d1/d2/d3,-(sp)
	move.w	d1,d2
	mulu	d0,d2		;d0.l * d1.l
	move.l	d1,d3
	swap	d3
	mulu	d0,d3		;d0.l * d1.h
	swap	d3
	clr.w	d3
	add.l	d3,d2
	swap	d0
	mulu	d1,d0		;d0.h * d1.l
	swap	d0
	clr.w	d0
	add.l	d2,d0
	movem.l	(sp)+,d1/d2/d3
	rts
;
makefile
.a68.o:
	as -o $@ $*.a68
.a68.o32:
	as -EINT32 -o $@ $*.a68
.a68.l:
	as -cdo $@ $*.a68
.a68.l32:
	as -EINT32 -cdo $@ $*.a68

ASM=index.o ldiv.o lmul.o movmem.o peek.o\
	rindex.o setjmp.o setmem.o strcat.o strchr.o\
	strcmp.o strcpy.o strlen.o strncpy.o strrchr.o\
	swapmem.o toupper.o
ASM32=index.o32 ldiv.o32 lmul.o32 movmem.o32 peek.o32\
	rindex.o32 setjmp.o32 setmem.o32 strcat.o32 strchr.o32\
	strcmp.o32 strcpy.o32 strlen.o32 strncpy.o32 strrchr.o32\
	swapmem.o32 toupper.o32
LASM=index.l ldiv.l lmul.l movmem.l peek.l\
	rindex.l setjmp.l setmem.l strcat.l strchr.l\
	strcmp.l strcpy.l strlen.l strncpy.l strrchr.l\
	swapmem.l toupper.l
LASM32=index.l32 ldiv.l32 lmul.l32 movmem.l32 peek.l32\
	rindex.l32 setjmp.l32 setmem.l32 strcat.l32 strchr.l32\
	strcmp.l32 strcpy.l32 strlen.l32 strncpy.l32 strrchr.l32\
	swapmem.l32 toupper.l32

all:	16 32 l16 l32

16:		$(ASM)

32:		$(ASM32)

l16:	$(LASM)

l32:	$(LASM32)

movmem.a68
; Copyright (C) 1984,85,86 by Manx Software Systems, Inc.
; :ts=8
;
	public _movmem
_movmem
	movem.l	4(sp),a0/a1
	move.l	#0,d0
	IF INT32
	move.l	12(sp),d0
	ELSE
	move.w	12(sp),d0
	ENDC
	cmp.l	a0,a1
	bne	.1
	rts
.1
	bls	move_forward
	add.w	d0,a0
	add.w	d0,a1
	bra	.3
.2
	move.b	-(a0),-(a1)
.3
	dbra	d0,.2
	IF INT32
	sub.l	#$10000,d0
	bpl	.2
	ENDC
	rts
;
.4
	move.b	(a0)+,(a1)+
move_forward
	dbra	d0,.4
	IF INT32
	sub.l	#$10000,d0
	bpl	.4
	ENDC
	rts
;
peek.a68
; Copyright (C) 1984 by Manx Software Systems, Inc.
; :ts=8
;
	public _peekl
_peekl
	move.l	4(sp),a0
	btst.b	#0,7(sp)
	bne	1$
	move.l	(a0),d0
	rts
1$
	move.l	#0,d0
	move.w	#3,d1
2$
	lsl.l	#8,d0
	move.b	(a0)+,d0
	dbra	d1,2$
	rts
;
	public _peekw
_peekw
	move.l	#0,d0
	move.l	4(sp),a0
	btst.b	#0,7(sp)
	bne	1$
	move.w	(a0),d0
	rts
1$
	move.b	(a0)+,d0
	lsl.w	#8,d0
	move.b	(a0),d0
	rts
;
	public _peek
	public _peekb
_peekb
_peek
	move.l	4(sp),a0
	move.l	#0,d0
	move.b	(a0),d0
	rts
;
	public _pokel
_pokel
	move.l	4(sp),a0
	lea	8(sp),a1
	move.w	#3,d1
.2
	move.b	(a1)+,(a0)+
	dbra	d1,.2
	rts
;
	public _pokew
_pokew
	move.l	4(sp),a0
	IF INT32
	move.b	10(sp),(a0)+
	move.b	11(sp),(a0)+
	ELSE
	move.b	8(sp),(a0)+
	move.b	9(sp),(a0)+
	ENDC
	rts
;
	public _pokeb
	public _poke
_pokeb
_poke
	move.l	4(sp),a0
	IF INT32
	move.b	11(sp),(a0)
	ELSE
	move.b	9(sp),(a0)
	ENDC
	rts
;
rindex.a68
; Copyright (C) 1984 by Manx Software Systems, Inc.
; :ts=8
;
	public _rindex
_rindex
	move.l	4(sp),a0
	move.l	a0,a1
.1
	tst.b	(a0)+
	bne	.1
	sub.l	#1,a0
	IF INT32
	move.b	11(sp),d0
	ELSE
	move.b	9(sp),d0
	ENDC
.2
	cmp.l	a0,a1
	beq	.3
	cmp.b	-(a0),d0
	bne	.2
	move.l	a0,d0
	rts
.3
	move.l	#0,d0
	rts
;
setjmp.a68
; Copyright (C) 1984 by Manx Software Systems, Inc.
; :ts=8
;
	public _setjmp
_setjmp
	move.l	(sp)+,a1
	move.l	(sp),a0
	movem.l	d3-d7/a1-a7,(a0)
	move.l	#0,d0
	jmp	(a1)
;
	public	_longjmp
_longjmp
	move.l	4(sp),a0
	IF INT32
	move.l	8(sp),d0
	ELSE
	move.w	8(sp),d0
	ENDC
	bne	.1
	move.l	#1,d0
.1
	movem.l	(a0),d3-d7/a1-a7
	jmp	(a1)
;
setmem.a68
; Copyright (C) 1984 by Manx Software Systems, Inc.
; :ts=8
;
	public _setmem
_setmem
	move.l	4(sp),a0
	IF INT32
	movem.l	8(sp),d0/d1
	ELSE
	movem.w	8(sp),d0/d1
	ENDC
	bra	.2
.1
	move.b	d1,(a0)+
.2
	dbra	d0,.1
	IF INT32
	sub.l	#$10000,d0
	bpl	.1
	ENDC
	rts
;
strcat.a68
; Copyright (C) 1984 by Manx Software Systems, Inc.
; :ts=8
;
	public _strcat,_strncat
_strcat
	move.w	#$7fff,d0
	bra	catcommon

_strncat
	IF INT32
	move.w	14(sp),d0
	ELSE
	move.w	12(sp),d0
	ENDC
;
catcommon
	move.l	4(sp),a0
.1
	tst.b	(a0)+
	bne	.1
	sub.w	#1,a0
	move.l	8(sp),a1
	sub.w	#1,d0
.2
	move.b	(a1)+,(a0)+
	dbeq	d0,.2
	beq	.3
	clr.b	(a0)
.3
	move.l	4(sp),d0
	rts
;
strchr.a68
; Copyright (C) 1986 by Manx Software Systems, Inc.
; :ts=8
;
	public _strchr
_strchr
	move.l	4(sp),a0
	IF INT32
	move.l	8(sp),d0
	ELSE
	move.w	8(sp),d0
	ENDC
.1
	move.b	(a0)+,d1
	cmp.b	d0,d1
	beq	.2
	tst.b	d1
	bne	.1
	move.l	#0,d0
	rts
.2
	move.l	a0,d0
	sub.l	#1,d0
	rts
;
strcmp.a68
; Copyright (C) 1984 by Manx Software Systems, Inc.
; :ts=8
;
	public _strcmp,_strncmp
_strcmp
	move.w	#$7fff,d0
	bra.s	cmpcommon

_strncmp
	IF INT32
	move.w	14(sp),d0
	ELSE
	move.w	12(sp),d0
	ENDC
;
cmpcommon
	sub.w	#1,d0
	bmi	equal
	move.l	4(sp),a0
	move.l	8(sp),a1
cmploop
	cmp.b	(a1)+,(a0)+
	bne	notequal
	sub.w	#1,a0
	tst.b	(a0)+
	dbeq	d0,cmploop
equal
	move.l	#0,d0
	rts
;
notequal
	bls	less
	move.l	#1,d0
	rts
;
less
	move.l	#-1,d0
	rts
;
strcpy.a68
; Copyright (C) 1984 by Manx Software Systems, Inc.
; :ts=8
;
	public _strcpy
_strcpy
	move.l	4(sp),a0
	move.l	a0,d0
	move.l	8(sp),a1
.1
	move.b	(a1)+,(a0)+
	bne.s	.1
	rts
;
strlen.a68
; Copyright (C) 1984 by Manx Software Systems, Inc.
; :ts=8
;
	public _strlen
_strlen
	move.l	4(sp),a0
	move.l	a0,d0
.1
	tst.b	(a0)+
	bne.s	.1
	sub.l	d0,a0
	move.l	a0,d0
	sub.l	#1,d0
	rts
;
strncpy.a68
; Copyright (C) 1984 by Manx Software Systems, Inc.
; :ts=8
;
	public _strncpy
_strncpy
	movem.l	4(sp),a0/a1
	move.l	a0,d0
	IF INT32
	move.l	12(sp),d1
	ELSE
	move.w	12(sp),d1
	ENDC
	bra	.2
.1
	move.b	(a1)+,(a0)+
.2
	dbeq	d1,.1
	beq	.4
	add.w	#1,d1
	bra	.4
.3
	clr.b	(a0)+
.4
	dbra	d1,.3
	rts
;
strrchr.a68
; Copyright (C) 1984 by Manx Software Systems, Inc.
; :ts=8
;
	public _strrchr
_strrchr
	move.l	4(sp),a0
	move.l	a0,a1
.1
	tst.b	(a0)+
	bne	.1
	IF INT32
	move.b	11(sp),d0
	ELSE
	move.b	9(sp),d0
	ENDC
.2
	cmp.l	a0,a1
	beq	.3
	cmp.b	-(a0),d0
	bne	.2
	move.l	a0,d0
	rts
.3
	move.l	#0,d0
	rts
;
swapmem.a68
; Copyright (C) 1984 by Manx Software Systems, Inc.
; :ts=8
;
	public _swapmem
_swapmem
	movem.l	4(sp),a0/a1
	IF INT32
	move.l	12(sp),d0
	ELSE
	move.w	12(sp),d0
	ENDC
	bra	.2
.1
	move.b	(a0),d1
	move.b	(a1),(a0)+
	move.b	d1,(a1)+
.2
	dbra	d0,.1
	IF INT32
	sub.l	#$10000,d0
	bpl	.1
	ENDC
	rts
;
toupper.a68
; Copyright (C) 1984 by Manx Software Systems, Inc.
;:ts=8
;
	public _toupper
;
_toupper
	move.l	#0,d0
	IF INT32
	move.b	7(sp),d0
	ELSE
	move.b	5(sp),d0
	ENDC
	cmp.b	#'a'-1,d0
	bls	tu_done
	cmp.b	#'z',d0
	bhi	tu_done
	sub.b	#'a'-'A',d0
tu_done:
	rts
;
;
	public _tolower
;
_tolower
	move.l	#0,d0
	IF INT32
	move.b	7(sp),d0
	ELSE
	move.b	5(sp),d0
	ENDC
	cmp.b	#'A'-1,d0
	bls	tl_done
	cmp.b	#'Z',d0
	bhi	tl_done
	add.b	#'a'-'A',d0
tl_done:
	rts
;
