Kaynağa Gözat

Adapted to new assembler and made re-entrant.

ceriel 38 yıl önce
ebeveyn
işleme
399a46eb92

+ 1 - 2
mach/m68k4/libem/LIST

@@ -1,4 +1,4 @@
-tail_em.a
+libem_s.a
 ari.s
 ara.s
 cvf.s
@@ -30,4 +30,3 @@ trp.s
 dia.s
 printf.s
 dvu.s
-sav.s

+ 26 - 10
mach/m68k4/libem/Makefile

@@ -1,17 +1,33 @@
 # $Header$
-install:
-	../../install tail_em.a tail_em
-	../../install end.s end_em
+MACH=m68k4
+install: 	all
+		../../install head_em.o head_em
+		../../install libem_o.a tail_em.rt
+		../../install end.o end_em
 
-cmp:
-	-../../compare tail_em.a tail_em
-	-../../compare end.s end_em
+cmp:		all
+		-../../compare head_em.o head_em
+		-../../compare libem_o.a tail_em.rt
+		-../../compare end.o end_em
 
-clean :
+all:            head_em.o libem_o.a end.o
 
+end.o:		end.s
+		$(MACH) -I../../../h -c end.s
+
+head_em.o:      head_em.s
+		$(MACH) -I../../../h -c head_em.s
+
+libem_o.a:	libem_s.a
+		ASAR=aal ; export ASAR ;\
+		march . libem_o.a
+
+clean:
+		rm -f *.o
 opr :
-	make pr | opr
+		make pr | opr
 
 pr:
-	@arch pv tail_em.a | pr -h `pwd`/tail_em.a
-	@pr `pwd`/end.s
+		@pr `pwd`/head_em.s
+		@arch pv libem_s.a | pr -h `pwd`/libem_s.a
+		@pr `pwd`/end.s

+ 8 - 5
mach/m68k4/libem/aciaio.s

@@ -1,9 +1,13 @@
 .define	.outch1,.outch2,.inch1,.inch2
+.sect .text
+.sect .rom
+.sect .data
+.sect .bss
 
-	! a0,d4 used
+	! a0,d0 used
 	! character in d1
 
-	.text
+	.sect .text
 .inch1:
 	move.l	#acia1,a0
 	bra	.inch
@@ -23,11 +27,10 @@
 .outch2:
 	move.l	#acia2,a0
 .outch:
-	move.b	(a0),d4
-	asr	#2,d4
+	move.b	(a0),d0
+	asr	#2,d0
 	bcc	.outch
 	move.b	d1,2(a0)
 	rts
 
-
 .align 2

+ 25 - 30
mach/m68k4/libem/ara.s

@@ -1,15 +1,18 @@
 .define .sar
 .define .lar
 .define .aar
+.sect .text
+.sect .rom
+.sect .data
+.sect .bss
 
 	!register usage:
 	! a0 : descriptor address
 	! d0 : index
 	! a1 : base address
-	.text
+	.sect .text
 .aar:
-	movem.l d0/d1/a0/a1,.savreg
-	move.l	(sp)+,.retara	! return address
+	move.l	(sp)+,d2	! return address
 	move.l	(sp)+,a0	! descriptor address
 	move.l	(sp)+,d0	! index
 	move.l	(sp)+,a1	! base address
@@ -19,85 +22,77 @@
 	jsr	.mlu
 	add.l	d1,a1		! address of element
 	move.l	a1,-(sp)	! returned on stack
-	move.l	.retara,-(sp)
-	movem.l	d0/d1/a0/a1,.savreg
+	move.l	d2,-(sp)
 	rts
 
-
 .lar:
 	! register usage: like .aar
-	! d2 : # bytes / element
 
-	movem.l d0/d1/d2/a0/a1,.savreg
-	move.l	(sp)+,.retara	! return address
+	move.l	(sp)+,d2	! return address
 	move.l	(sp)+,a0
 	move.l	(sp)+,d0
 	move.l	(sp)+,a1
 	sub.l	(a0),d0
-	move.l	8(a0),d2	! # bytes / element
 	move.l	d0,-(sp)
-	move.l	d2,-(sp)
+	move.l	8(a0),d0
+	move.l	d0,-(sp)
 	jsr	.mlu
 	add.l	d1,a1		! address of element
-	add.l	d2,a1		! a1++ because of predecrement
+	add.l	8(a0),a1	! a1++ because of predecrement
 	clr.l	d1		!?nodig?
-	asr	#1,d2
+	asr	#1,d0
 	bne	3f
 	move.b	-(a1),d1	! 1 byte element
 	move.l	d1,-(sp)
 	bra	5f
 3:
-	asr	#1,d2
+	asr	#1,d0
 	bne	4f
 	move.w	-(a1),d1	! 2 byte element
 	move.l	d1,-(sp)
 	bra 	5f
 4:
-	sub.l	#1,d2
+	sub.l	#1,d0
 1:
 	move.l	 -(a1),-(sp)	! 4n byte element (n = 1,2,...)
-	dbf 	d2,1b
+	dbf 	d0,1b
 5:
-	move.l	.retara,-(sp)
-	movem.l	.savreg,d0/d1/d2/a0/a1
+	move.l	d2,-(sp)
 	rts
 
 
 .sar:
 	!register usage: same as lar
 
-	movem.l	d0/d1/a0/a1,.savreg
-	move.l	(sp)+,.retara
+	move.l	(sp)+,d2
 	move.l	(sp)+,a0
 	move.l	(sp)+,d0
 	move.l	(sp)+,a1
 	sub.l	(a0),d0
-	move.l	8(a0),d2	! # bytes / element
 	move.l	d0,-(sp)
-	move.l	d2,-(sp)
+	move.l	8(a0),d0	! # bytes / element
+	move.l	d0,-(sp)
 	jsr	.mlu
 	add.l	d1,a1
 	clr.l	d1		!?nodig?
-	asr	#1,d2
+	asr	#1,d0
 	bne	3f
 	move.l	(sp)+,d1
 	move.b	d1,(a1)		! 1 byte element 
 	bra	4f
 3:
-	asr	#1,d2
+	asr	#1,d0
 	bne	5f
 	move.l	(sp)+,d1
 	move.w	d1,(a1)		! 2 byte element 
 	bra	4f
 5:
-	sub.l	#1,d2
+	sub.l	#1,d0
 1:
 	move.l	(sp)+,(a1)+	! 4n byte element (n = 1,2,...)
-	dbf	d2,1b
+	dbf	d0,1b
 4:
-	move.l	.retara,-(sp)
-	movem.l	.savreg,d0/d1/a0/a1
+	move.l	d2,-(sp)
 	rts
-.data
-.retara:	.long 0
+
 .align 2

+ 15 - 15
mach/m68k4/libem/ari.s

@@ -1,36 +1,36 @@
 .define .sari
 .define .lari
 .define .aari
+.sect .text
+.sect .rom
+.sect .data
+.sect .bss
 
-	.text
+	.sect .text
 .aari:
-	move.l	(sp)+,.retari	! return address
+	move.l	(sp)+,d0	! return address
 	cmp.l	#4, (sp)+	! size of descriptor elements
 	bne	9f
-	jsr	.aar
-	move.l	.retari,-(sp)
-	rts
+	move.l	d0,-(sp)
+	jmp	.aar
 
 
 .lari:
-	move.l	(sp)+,.retari	! return address
+	move.l	(sp)+,d0	! return address
 	cmp.l	#4, (sp)+	! size of descriptor elements
 	bne	9f
-	jsr	.lar
-	move.l	.retari,-(sp)
-	rts
+	move.l	d0,-(sp)
+	jmp	.lar
 9:
 	move.w	#EILLINS,-(sp)
 	jmp	.fat
 
 
 .sari:
-	move.l	(sp)+,.retari	! return address
+	move.l	(sp)+,d0	! return address
 	cmp.l	#4, (sp)+	! size of descriptor elements
 	bne	9b
-	jsr	.sar
-	move.l	.retari,-(sp)
-	rts
-.data
-.retari:	.long 0
+	move.l	d0,-(sp)
+	jmp	.sar
+
 .align 2

+ 6 - 3
mach/m68k4/libem/cii.s

@@ -1,8 +1,11 @@
 .define	.cii
+.sect .text
+.sect .rom
+.sect .data
+.sect .bss
 
-	.text
+	.sect .text
 .cii:
-	movem.l	a0/d0/d1,.savreg
 	move.l	(sp)+,a0	! return address
 	move	(sp)+,d0	! destination size
 	sub	(sp)+,d0	! destination - source size
@@ -19,6 +22,6 @@
 	dbf	d0,2b
 3:
 	move.l	a0,-(sp)
-	movem.l	.savreg,a0/d0/d1
 	rts
+
 .align 2

+ 8 - 5
mach/m68k4/libem/cmi.s

@@ -1,12 +1,15 @@
 .define	.cmi, .cmi_
+.sect .text
+.sect .rom
+.sect .data
+.sect .bss
 
 	! NUM == 4
 	! result in d1
-	.text
+	.sect .text
 .cmi:
 .cmi_:
-	move.l	(sp)+,.savret
-	move.l	d0,.savd0
+	move.l	(sp)+,d2
 	move.l	#1,d1
 	move.l	(sp)+,d0
 	cmp.l	(sp)+,d0
@@ -16,7 +19,7 @@
 	ble	2f
 	neg.l	d1
 	2:
-	move.l	.savd0,d0
-	move.l	.savret,-(sp)
+	move.l	d2,-(sp)
 	rts
+
 .align 2

+ 8 - 5
mach/m68k4/libem/cmp.s

@@ -1,9 +1,12 @@
 .define	.cmp
+.sect .text
+.sect .rom
+.sect .data
+.sect .bss
 
-	.text
+	.sect .text
 .cmp:
-	move.l	(sp)+,.savret	! return address
-	move.l	d0,.savd0
+	move.l	(sp)+,d2	! return address
 	move.l	#1,d1
 	move.l	(sp)+,d0
 	cmp.l	(sp)+,d0
@@ -13,7 +16,7 @@
 	bcs	2f
 	neg.l	d1
 	2:
-	move.l	.savd0,d0
-	move.l	.savret,-(sp)
+	move.l	d2,-(sp)
 	rts
+
 .align 2

+ 5 - 1
mach/m68k4/libem/cms.s

@@ -1,8 +1,12 @@
 .define	.cms
+.sect .text
+.sect .rom
+.sect .data
+.sect .bss
 
 	! d0 contains set size
 
-	.text
+	.sect .text
 .cms:
 	move.l	(sp)+,a2	! return address
 	move.l	sp,a0

+ 10 - 7
mach/m68k4/libem/cmu.s

@@ -1,12 +1,15 @@
 .define .cmu
+.sect .text
+.sect .rom
+.sect .data
+.sect .bss
 
 	! d0 : # bytes of 1 block
-	.text
+	.sect .text
 .cmu:
-	movem.l	d2/a0/a1/a2,.savreg
-	move.l	(sp)+,a2	! reta
 	move.l	sp,a0		! top block
-	move.l	sp,a1
+	add.l	#4,a0
+	move.l	a0,a1
 	add.l	d0,a1		! lower block
 	move.l	d0,d2
 	asr.l	#2,d0
@@ -22,8 +25,8 @@
 	neg.l	d1		! less
 3:
 	asl.l	#1,d2
+	move.l	(sp)+,a0
 	add.l	d2,sp		! new sp
-	move.l	a2,-(sp)
-	movem.l	.savreg,d2/a0/a1/a2
-	rts
+	jmp	(a0)
+
 .align 2

+ 6 - 3
mach/m68k4/libem/csa.s

@@ -1,8 +1,11 @@
 .define .csa
+.sect .text
+.sect .rom
+.sect .data
+.sect .bss
 
-	.text
+	.sect .text
 .csa:
-	movem.l	d0/a0/a1/a2,.savreg
 	move.l	(sp)+,a0	! case descriptor
 	move.l	(sp)+,d0	! index
 	move.l	(a0)+,a1	! default address
@@ -21,9 +24,9 @@
 	beq	2f
 	move.l	a1,-(sp)	! jump address
 3:
-	movem.l	.savreg,d0/a0/a1/a2
 	rts			! not a real rts
 2:
 	move.w	#ECASE,-(sp)
 	jmp	.fat
+
 .align 2

+ 5 - 3
mach/m68k4/libem/csb.s

@@ -1,8 +1,11 @@
 .define .csb
+.sect .text
+.sect .rom
+.sect .data
+.sect .bss
 
-	.text
+	.sect .text
 .csb:
-	movem.l	d0/d1/a0/a1,.savreg
 	move.l	(sp)+,a0	! case descriptor
 	move.l	(sp)+,d0	! index
 	move.l	(a0)+,a1	! default jump address
@@ -23,6 +26,5 @@
 	move.l	(a0)+,a1	! get jump address
 4:
 	move.l	a1,-(sp)
-	movem.l	.savreg,d0/d1/a0/a1
 	rts
 .align 2

+ 6 - 1
mach/m68k4/libem/cuu.s

@@ -1,8 +1,12 @@
 .define	.ciu
 .define	.cui
 .define	.cuu
+.sect .text
+.sect .rom
+.sect .data
+.sect .bss
 
-	.text
+	.sect .text
 .ciu:
 .cui:
 .cuu:
@@ -18,4 +22,5 @@
 	clr	-(sp)
 	dbf	d0,2b
 	jmp	(a0)
+
 .align 2

+ 6 - 1
mach/m68k4/libem/cvf.s

@@ -1,6 +1,10 @@
 .define	.cfi,.cif,.cfu,.cuf,.cff
+.sect .text
+.sect .rom
+.sect .data
+.sect .bss
 
-	.text
+	.sect .text
 
 	! this is a dummy float conversion routine
 .cfi:
@@ -13,4 +17,5 @@
 	sub	(sp)+,d0	! diff. in sizes
 	sub	d0,sp
 	jmp	(a0)
+
 .align 2

+ 7 - 3
mach/m68k4/libem/dia.s

@@ -1,12 +1,16 @@
 .define	.diagnos
+.sect .text
+.sect .rom
+.sect .data
+.sect .bss
 
 space	= 040
 del	= 0177
 
-	.text
+	.sect .text
 .diagnos:
 	move.l	hol0,-(sp)
-	move.l	hol0+FILN_AD,d2
+	move.l	hol0+4,d2
 	beq	1f
 	move.l	d2,a0
 	move.l	#40,d0
@@ -31,7 +35,7 @@ del	= 0177
 	move.l	#unknwn,d2
 	bra	2b
 
-	.data
+	.sect .data
 fmt:	.asciz "%s, line %d: "
 unknwn:	.asciz "unknown file"
 .align 2

+ 13 - 11
mach/m68k4/libem/dvi.s

@@ -1,12 +1,15 @@
 .define .dvi
+.sect .text
+.sect .rom
+.sect .data
+.sect .bss
 
  ! signed long divide
-	.text
+	.sect .text
 .dvi:
-	movem.l	d0/d4,.savdvi
-	move.l	(sp)+,.retdvi
-	move.l	(sp)+,d0
-	move.l	(sp)+,d1
+	move.l	4(sp),d0
+	move.l	8(sp),d1
+	move.l	d4,-(sp)
 	clr.l	d4
 	tst.l	d0	! divisor
 	bpl	1f
@@ -32,11 +35,10 @@
 	bpl	6f
 	neg.l	d2	! remainder
 6:
-	movem.l .savdvi,d0/d4
-	move.l	.retdvi,-(sp)
+	move.l	(sp)+,d4
+	move.l	(sp)+,a0
+	add.l	#8,sp
+	move.l	a0,-(sp)
 	rts
-.data
-.savdvi:	.space 12
-.retdvi:	.long 0
-.text
+
 .align 2

+ 13 - 7
mach/m68k4/libem/dvu.s

@@ -1,4 +1,8 @@
 .define .dvu
+.sect .text
+.sect .rom
+.sect .data
+.sect .bss
 
  ! unsigned long divide
  ! register usage:
@@ -6,12 +10,11 @@
  !         d1 dividend
  ! exit  : d1 quotient
  !         d2 remainder
-	.text
+	.sect .text
 .dvu:
-	movem.l	d0/d3,.savreg
-	move.l	(sp)+,.savret
-	move.l	(sp)+,d0
-	move.l	(sp)+,d1
+	move.l	4(sp),d0
+	move.l	8(sp),d1
+	move.l	d3,-(sp)
 	tst.l	d0
 	bne	0f
 	move.w	#EIDIVZ,-(sp)
@@ -28,7 +31,10 @@
 	add	#1,d1
 4:
 	dbf	d3,3b
-	movem.l .savreg,d0/d3
-	move.l	.savret,-(sp)
+	move.l	(sp)+,d3
+	move.l	(sp)+,a0
+	add.l	#8,sp
+	move.l	a0,-(sp)
 	rts
+
 .align 2

+ 10 - 9
mach/m68k4/libem/end.s

@@ -1,15 +1,16 @@
-.define	endtext,enddata,endbss
-.define _end, _etext, _edata
+.define	endtext,enddata,endbss,_etext,_edata,_end
+.sect .text
+.sect .rom
+.sect .data
+.sect .bss
+.sect .end ! only for declaration of _end and endbss.
 
-	.text
+	.sect .text
 endtext:
 _etext:
-	.align	4
-	.data
+	.sect .data
 enddata:
 _edata:
-	.align	4
-	.bss
-	.align	4
-endbss:
+	.sect .end
 _end:
+endbss:

+ 7 - 5
mach/m68k4/libem/exg.s

@@ -1,10 +1,13 @@
 .define .exg
+.sect .text
+.sect .rom
+.sect .data
+.sect .bss
 
 	! d0 : exchange size in bytes
-	.text
+	.sect .text
 .exg:
-	move.l	(sp)+,.savret
-	movem.l	d1/a1/a2,.savreg
+	move.l	(sp)+,d2
 	move.l	sp,a1
 	sub.l	d0,sp
 	move.l	sp,a2
@@ -21,6 +24,5 @@
 	sub	#1,d1
 	bgt	1b
 	move.l	a1,sp
-	movem.l	.savreg,d1/a1/a2
-	move.l	.savret,-(sp)
+	move.l	d2,-(sp)
 	rts

+ 5 - 1
mach/m68k4/libem/fat.s

@@ -1,6 +1,10 @@
 .define	.fat
+.sect .text
+.sect .rom
+.sect .data
+.sect .bss
 
-	.text
+	.sect .text
 .fat:
 	jsr	.trp	
 	jmp	EXIT

+ 11 - 8
mach/m68k4/libem/inn.s

@@ -1,16 +1,19 @@
 .define .inn
+.sect .text
+.sect .rom
+.sect .data
+.sect .bss
 
 ! d0 : set size in bytes
 ! d1 : bitnumber
 
-	.text
+	.sect .text
 .inn:
-	movem.l	d1/d2/a0/a1,.savreg
-	move.l	(sp)+,.savret
+	move.l	(sp)+,a1
 	move.l	(sp)+,d1
-	move.l	sp,a1
-	add.l	d0,a1
+	move.l	d0,-(sp)
 	move.l	sp,a0
+	add.l	#4,a0
 	move.l	d1,d2
 	asr.l	#4,d2
 	!bchg.l	#0,d2
@@ -25,7 +28,7 @@
 1:
 	clr.l	d0
 2:
-	move.l	a1,sp
-	movem.l	.savreg,d1/d2/a0/a1
-	move.l	.savret,-(sp)
+	move.l	(sp)+,d1
+	add.l	d1,sp
+	move.l	a1,-(sp)
 	rts

+ 5 - 1
mach/m68k4/libem/lfr.s

@@ -1,6 +1,10 @@
 .define .lfr
+.sect .text
+.sect .rom
+.sect .data
+.sect .bss
 
-	.text
+	.sect .text
 .lfr:
 	move.l (sp)+,a0
 	cmp #2,d7

+ 7 - 6
mach/m68k4/libem/los.s

@@ -1,11 +1,14 @@
 .define .los
+.sect .text
+.sect .rom
+.sect .data
+.sect .bss
 
 	! d0 : # bytes
 	! a0 : source address
-	.text
+	.sect .text
 .los:
-	movem.l	d0/a0,.savreg
-	move.l	(sp)+,.savret
+	move.l	(sp)+,a1
 	move.l	(sp)+,d0
 	move.l	(sp)+,a0
 	cmp.l	#1,d0
@@ -30,7 +33,5 @@
 	sub.l	#1,d0
 	bgt	4b
 3:
-	movem.l	.savreg,d0/a0
-	move.l	.savret,-(sp)
-	rts
+	jmp	(a1)
 .align 2

+ 13 - 12
mach/m68k4/libem/mli.s

@@ -1,12 +1,15 @@
 .define .mli
+.sect .text
+.sect .rom
+.sect .data
+.sect .bss
 
 
-	.text
+	.sect .text
 .mli:
-	move.l	d5,.savmli
-	move.l	(sp)+,.retmli
-	move.l	(sp)+,d1
-	move.l	(sp)+,d0
+	move.l	4(sp),d1
+	move.l	8(sp),d0
+	move.l	d5,-(sp)
 	clr	d5
 	tst.l	d0
 	bpl	1f
@@ -26,11 +29,9 @@
 	neg.l	d1
 	negx.l	d0
 3:
-	move.l	.savmli,d5
-	move.l	.retmli,-(sp)
-	rts
-.data
-.savmli:	.long 0
-.retmli:	.long 0
-.text
+	move.l	(sp)+,d5
+	move.l	(sp)+,a0
+	add.l	#8,sp
+	jmp	(a0)
+
 .align 2

+ 16 - 11
mach/m68k4/libem/mlu.s

@@ -1,20 +1,24 @@
 .define .mlu
+.sect .text
+.sect .rom
+.sect .data
+.sect .bss
 
  ! entry : d0 multiplicand
  !         d1 multiplier
  ! exit  : d0 high order result
  !         d1 low order result
 
-	.text
+	.sect .text
 .mlu:
-	move.l	(sp)+,.savret
-	move.l	(sp)+,d1
-	move.l	(sp)+,d0
+	movem.l	d3/d4/d6,-(sp)
+	move.l	16(sp),d1
+	move.l	20(sp),d0
 	cmp.l	#32768,d0
 	bgt	1f
 	cmp.l	#32768,d1
 	bls	2f
-1:	movem.l	d2/d3/d4/d6,.savreg
+1:
 	move.l	d1,d3
 	move.l	d1,d2
 	swap	d2
@@ -36,12 +40,13 @@
 	swap	d2
 	swap	d3
 	add.l	d2,d0
-	add.l	d3,d0
-	movem.l	.savreg,d2/d3/d4/d6
-	move.l	.savret,-(sp)
-	rts
+	add.l	d3,a0
+	bra	3f
 2:	mulu	d0,d1
 	clr	d0
-	move.l	.savret,-(sp)
-	rts
+3:
+	movem.l	(sp)+,d3/d4/d6
+	move.l	(sp)+,a0
+	add	#8,sp
+	jmp	(a0)
 .align 2

+ 8 - 3
mach/m68k4/libem/mon.s

@@ -1,12 +1,17 @@
 .define .mon
-	.text
+.sect .text
+.sect .rom
+.sect .data
+.sect .bss
+
+	.sect .text
 .mon:
 	move.l	(sp)+,a0
 	pea	fmt
 	jsr	.diagnos
-	add	#6,sp
+	add	#8,sp
 	jmp	EXIT
 
-	.data
+	.sect .data
 fmt:	.asciz "system call %d not implemented"
 .align 2

+ 6 - 2
mach/m68k4/libem/nop.s

@@ -1,6 +1,10 @@
 .define .nop
+.sect .text
+.sect .rom
+.sect .data
+.sect .bss
 
-	.text
+	.sect .text
 .nop:
 	pea	4(sp)
 	move.l	hol0,-(sp)
@@ -9,6 +13,6 @@
 	add.l	#12,sp
 	rts
 
-	.data
+	.sect .data
 fmt:	.asciz "test %d, sp %d\n"
 .align 2

+ 123 - 76
mach/m68k4/libem/printf.s

@@ -1,78 +1,125 @@
+.sect .text;.sect .rom;.sect .data;.sect .bss
+.define _printn
 .define _printf
-.define _putchar
-.define _getal
-.define _char
-.bss
-_getal:
-	.space	12
-_char:
-	.space	1
-	.align  2
-.data
-sav:
-	.long	0
-.text
-_printf:
-	movem.l	d0/d1/d2/a0/a1/a2/a3/a4/a5/a6,.savreg
-	move.l	(sp)+,sav	!return address
-	move.l	sp,a6		!a6 <- address of arguments
-	move.l	(a6)+,a5	!a5 <- address of format
-	clr.l	d0		!d0 <- char to be printed
-next:	move.b	(a5)+,d0
-	beq	out
-	cmp.b	#'%',d0
-	beq	procnt
-put:	move.l	d0,-(sp)
-	jsr	_putchar	!argument is long en op de stack
-	tst.l	(sp)+
-	jmp	next
-
-procnt:	move.b	(a5)+,d0
-	cmp.b	#'d',d0		!NOTE: %d means unsigned.
-	beq	digit
-	cmp.b	#'s',d0
-	beq	string
-	cmp.b	#'%',d0		!second % has to be printed.
-	beq	put
-	tst.b	-(a5)		!normal char should be printed
-	jmp	next
-
-string:	move.l	(a6)+,a2	!a2 <- address of string
-sloop:	move.b	(a2)+,d0
-	beq	next
-	move.l	d0,-(sp)
-	jsr	_putchar	!argument is long en op de stack
-	tst.l	(sp)+
-	jmp	sloop
-
-digit:	move.l	(a6)+,d1	!d1 <- integer
-	move.l	#_getal+12,a3	!a3 <- ptr to last part of buf
-	move.b	#0,-(a3)	!stringterminator
-dloop:	move.l	d1,-(sp)
-	move.l	#10,-(sp)
-	jsr	.dvu		!d1 <- quotient d2 <- remainder
-	add.l	#'0',d2
-	move.b	d2,-(a3)
-	tst.l	d1		!if quotient = 0 then ready
-	bne	dloop
-	move.l	a3,a2
-	jmp	sloop		!print digitstring.
-
-out:
-	move.l	sav,-(sp)
-	movem.l	.savreg,d0/d1/d2/a0/a1/a2/a3/a4/a5/a6
-	rts
-
-
+.extern _printf
+.sect .text
 _putchar:
-	movem.l	d0,.savreg
-	move.l	4(sp),d0
-	move.b	d0,_char
-	move.l	#1,-(sp)
-	move.l	#_char,-(sp)
-	move.l	#1,-(sp)
-	jsr	_write
-	add.l	#12,sp
-	movem.l	.savreg,d0
-	rts
-.align 2
+move.l	#1,-(sp)
+pea	9(sp)
+move.l	#1,-(sp)
+jsr	_write
+add.l	#12,sp
+rts
+_printf:
+tst.b -56(sp)
+link	a6,#-16
+!Local -4 into d7
+!Local -12 into d6
+!Local -8 into a5
+!Local 8 into a4
+!Local -16 into a3
+movem.l d7/d6/a5/a4/a3,-(sp)
+move.l 8(a6),a4
+lea 12(a6),a1
+move.l a1, a5
+I0014:
+move.l a4, a0
+add.l #1,a4
+clr.l d0
+move.b (a0),d0
+move.l d0, d7
+cmp.l #37,d7
+beq I0015
+tst.l d7
+beq I0012
+move.l d7,-(sp)
+jsr _putchar
+add #4,sp
+jmp I0014
+I0015:
+move.l a4, a0
+add.l #1,a4
+clr.l d0
+move.b (a0),d0
+move.l d0, d7
+cmp.l #100,d7
+beq I0018
+cmp.l #117,d7
+bne I0017
+I0018:
+move.l a5, a0
+add.l #4,a5
+move.l (a0), d6
+cmp.l #100,d7
+bne I0019
+tst.l d6
+bge I0019
+clr.l d2
+sub.l d6,d2
+move.l d2, d6
+pea 45
+jsr _putchar
+add #4,sp
+I0019:
+move.l d6,-(sp)
+jsr _printn
+add #4,sp
+jmp I0014
+I0017:
+cmp.l #115,d7
+bne I0014
+move.l a5, a0
+add.l #4,a5
+move.l (a0), a3
+I001c:
+move.l a3, a0
+add.l #1,a3
+clr.l d0
+move.b (a0),d0
+move.l d0, d7
+tst.l d7
+beq I0014
+move.l d7,-(sp)
+jsr _putchar
+add #4,sp
+jmp I001c
+I0012:
+movem.l (sp)+,d7/d6/a5/a4/a3
+unlk a6
+rts
+.extern _printn
+_printn:
+tst.b -44(sp)
+link	a6,#-4
+!Local -4 into d7
+move.l d7,-(sp)
+.sect .data
+_14:
+.data4	808530483
+.data4	875902519
+.data4	943259648
+.sect .text
+move.l 8(a6),-(sp)
+pea 10
+jsr .dvu
+move.l d1, d7
+tst.l d7
+beq I0023
+move.l d7,-(sp)
+jsr _printn
+add #4,sp
+I0023:
+pea _14
+move.l 8(a6),-(sp)
+pea 10
+jsr .dvu
+move.l (sp)+,a1
+add.l d2,a1
+clr.l d0
+move.b (a1),d0
+move.l d0,-(sp)
+jsr _putchar
+add #4,sp
+move.l (sp)+,d7
+unlk a6
+rts

+ 8 - 6
mach/m68k4/libem/rck.s

@@ -1,9 +1,12 @@
 .define .rck
+.sect .text
+.sect .rom
+.sect .data
+.sect .bss
 
-	.text
+	.sect .text
 .rck:
-	movem.l	d0/a0,.savreg
-	move.l	(sp)+,.savret
+	move.l	(sp)+,a1
 	move.l	(sp)+,a0	! descriptor address
 	move.l	(sp),d0
 	cmp.l	(a0),d0
@@ -14,7 +17,6 @@
 	move.l	#ERANGE,-(sp)
 	jsr	.trp
 2:
-	movem.l	.savreg,d0/a0
-	move.l	.savret,-(sp)
-	rts
+	jmp	(a1)
+
 .align 2

+ 5 - 1
mach/m68k4/libem/ret.s

@@ -1,6 +1,10 @@
 .define .ret
+.sect .text
+.sect .rom
+.sect .data
+.sect .bss
 
-	.text
+	.sect .text
 .ret:
 	beq 3f
 	cmp #2,d0

+ 8 - 8
mach/m68k4/libem/set.s

@@ -1,11 +1,14 @@
 .define .set
+.sect .text
+.sect .rom
+.sect .data
+.sect .bss
 
 	! d0 : setsize in bytes
 	! d1 : bitnumber
-	.text
+	.sect .text
 .set:
-	movem.l	d1/d2/a1,.savreg
-	move.l	(sp)+,.savret
+	move.l	(sp)+,a0
 	move.l	(sp)+,d1
 	move.l	d0,d2
 	asr.l	#2,d2
@@ -20,13 +23,10 @@
 	cmp.l	d0,d2
 	bcs	1f
 	move.w	#ESET,-(sp)
-	move.l	.savret,-(sp)
-	jmp	.trp
+	jsr	.trp
 1:
 	add.l	d2,a1
 	move.l	(a1),d2
 	bset	d1,d2
 	move.l	d2,(a1)
-	movem.l	.savreg,d1/d2/a1
-	move.l	.savret,-(sp)
-	rts
+	jmp	(a0)

+ 7 - 6
mach/m68k4/libem/shp.s

@@ -1,9 +1,12 @@
 .define	.strhp
+.sect .text
+.sect .rom
+.sect .data
+.sect .bss
 
-	.text
+	.sect .text
 .strhp:
-	move.l	d0,.savreg
-	move.l	(sp)+,.savret
+	move.l	(sp)+,a0
 	move.l	(sp)+,d0	! heap pointer
 	move.l	d0,.reghp
 	cmp.l	.limhp,d0
@@ -14,9 +17,7 @@
 	cmp.l	d0,sp
 	ble	2f
 1:
-	move.l	.savreg,d0
-	move.l	.savret,-(sp)
-	rts
+	jmp	(a0)
 2:
 	move.w	#EHEAP,-(sp)
 	jmp	.fat

+ 7 - 6
mach/m68k4/libem/sig.s

@@ -1,13 +1,14 @@
 .define	.sig
+.sect .text
+.sect .rom
+.sect .data
+.sect .bss
 
-	.text
+	.sect .text
 .sig:
-	movem.l	a1/a2,.savreg
-	move.l	(sp)+,.savret
+	move.l	(sp)+,a0
 	move.l	(sp)+,a1	! trap pc
 	move.l	.trppc,-(sp)
 	move.l	a1,.trppc
-	movem.l	.savreg,a1/a2
-	move.l	.savret,-(sp)
-	rts
+	jmp	(a0)
 .align 2

+ 7 - 6
mach/m68k4/libem/sts.s

@@ -1,11 +1,14 @@
 .define .sts
+.sect .text
+.sect .rom
+.sect .data
+.sect .bss
 
 	! d0 : # bytes
 	! a0 : destination address
-	.text
+	.sect .text
 .sts:
-	movem.l	d0/a0,.savreg
-	move.l	(sp)+,.savret
+	move.l	(sp)+,a1
 	move.l	(sp)+,d0
 	move.l	(sp)+,a0
 	cmp	#1,d0
@@ -27,7 +30,5 @@
 	move.l	(sp)+,(a0)+
 	dbf	d0,3b
 4:
-	movem.l	.savreg,d0/a0
-	move.l	.savret,-(sp)
-	rts
+	jmp	(a1)
 .align 2

+ 8 - 4
mach/m68k4/libem/sys1.s

@@ -1,18 +1,22 @@
 .extern _errno
-.data
+.sect .text
+.sect .rom
+.sect .data
+.sect .bss
+.sect .data
 _errno:
 .extern _lseek
 .short	0
-.text
+.sect .text
 _lseek:
 link	a6,#-0
-.data
+.sect .data
 _13:
 .short	29561
 .short	29489
 .short	11875
 .short	0
-.text
+.sect .text
 move.l #_13,.filn
 move.w #8,.lino
 move.w #0,-(sp)

+ 5 - 1
mach/m68k4/libem/sys2.s

@@ -1,7 +1,11 @@
 .extern _exit
+.sect .text
+.sect .rom
+.sect .data
+.sect .bss
 ! Fake system call for 68000 running MACSBUG
 
-.text
+.sect .text
 
 _exit:
 	jmp 0x0200f6

+ 18 - 8
mach/m68k4/libem/trp.s

@@ -1,31 +1,41 @@
 .define	.trp
+.sect .text
+.sect .rom
+.sect .data
+.sect .bss
 
-	.text
+	.sect .text
 .trp:
-	move.l	(sp)+,a2	! return address
-	move.l	(sp)+,d0	! error number
-	move.l	a2,-(sp)
-	move.l	d0,-(sp)
-	cmp.l	#16,d0
+	cmp.l	#16,4(sp)
 	bcc	1f
+	move.l	d0,-(sp)
+	move.l	8(sp),d0
 	btst	d0,.trpim
 	bne	3f
 1:
+	move.l	a0,-(sp)
 	move.l	.trppc,a0
 	move.l	a0,d0
 	beq	9f
 	clr.l	.trppc
+	move.l	12(sp),-(sp)
 	jsr	(a0)
+	add.l	#4,sp
+	move.l	(sp)+,a0
 3:
-	add	#4,sp
+	move.l	(sp)+,d0
+	move.l	(sp)+,(sp)
 	rts
 9:
+	move.l	(sp)+,a0
+	move.l	(sp)+,d0
+	move.l	4(sp),-(sp)
 	pea	fmt
 	jsr	.diagnos
 	add	#4,sp
 	jsr	__cleanup
 	jmp	EXIT
 
-	.data
+	.sect .data
 fmt:	.asciz "trap %d called\n"
 .align 2