332 lines
		
	
	
	
		
			8.6 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			332 lines
		
	
	
	
		
			8.6 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
| 	.define ignmask
 | |
| 	.define itoa
 | |
| .sect .text
 | |
| .sect .rom
 | |
| .sect .data
 | |
| .sect .bss
 | |
| .sect .text
 | |
| !---------------------------------------------------------------------------
 | |
| !		MISCELLANEOUS
 | |
| !----------------------------------------------------------------------------
 | |
| ass_z:		mov	(sp)+,d0 ;	bra	5f
 | |
| ass_l:		move.b	(a3)+,-(sp) ;	move.b	(a3)+,1(sp)
 | |
| 		move.w	(sp)+,d0
 | |
| 5:		checksize
 | |
| 		bra	e_oddz
 | |
| 4:		move.l	(sp)+,d0 ;	bpl	3f
 | |
| 		asr.l	wmu,d0	;	bra	8f
 | |
| 2:		move.w	(sp)+,d0 ;	bpl	3f
 | |
| 		asr.w	#1,d0	;	ext.l	d0
 | |
| 		bra	8f
 | |
| 
 | |
| asp_1W:		asp_2W:		asp_3W:		asp_4W:		asp_5W:
 | |
| 		sub.w	#176,d0
 | |
| #ifndef	lword
 | |
| 		asr.l	#1,d0
 | |
| #endif
 | |
| 3:		add.l	d0,sp	;	jmp	(a4)
 | |
| asp_w0:		move.l	d6,d0	;	move.b	(a3)+,d0
 | |
| 5:		asl.l	wmu,d0 ;	bra	3b
 | |
| asp_lw:		move.b	(a3)+,-(sp) ;	move.b	(a3)+,1(sp)
 | |
| 		move.w	(sp)+,d0  ;	ext.l	d0
 | |
| 6:		bmi	8f
 | |
| 		asl.l	wmu,d0	;	bra	3b
 | |
| 8:		neg.l	d0	;	sub.l	#1,d0
 | |
| 1:		mov	und,-(sp) ;	dbra	d0,1b
 | |
| 		jmp	(a4)
 | |
| asp_qw:		move.l	(sp)+,d0 ;	bra	6b
 | |
| 
 | |
| !-----------------------------------------------------------------------------
 | |
| bls_z:		mov	(sp)+,d0 ;	bra	0f
 | |
| bls_l:		adroff		;	move.w	(a5),d0
 | |
| 0:		checksize
 | |
| 2:		move.w	(sp)+,d0 ;	bra	0f
 | |
| 4:		move.l	(sp)+,d0 ;	bra	0f
 | |
| 
 | |
| blm_q:		move.l	(sp)+,d0 ;	bra	0f
 | |
| blm_l:		adroff		;	move.w	(a5),d0
 | |
| 		bra	0f
 | |
| blm_s0:		move.l	d6,d0	;	move.b	(a3)+,d0
 | |
| 0:		move.l	d0,d2	;	asr.w	wmu,d2
 | |
| 		beq	5f	;	move.l	a5,d1
 | |
| 		sub.w	#1,d2	;	move.l	(sp)+,a0	!dest. address
 | |
| 		move.l	(sp)+,a5 ;	cmp.l	a0,a5
 | |
| !a5 contains source address. beware of overlap of pieces
 | |
| 		beq	3f	;	bcs	2f
 | |
| 1:		mov	(a5)+,(a0)+ ;	dbra	d2,1b
 | |
| 3:		move.l	d1,a5
 | |
| 5:		jmp	(a4)
 | |
| 2:		add.l	d0,a5	;	add.l	d0,a0
 | |
| 4:		mov	-(a5),-(a0) ;	dbra	d2,4b
 | |
| 		bra	3b
 | |
| 
 | |
| !----------------------------------------------------------------------------
 | |
| csa_z:		mov	(sp)+,d0 ;	bra	0f
 | |
| csa_l:		adroff		;	move.w	(a5),d0
 | |
| 0:		sub.l	wrd,d0	;	bne	e_illins
 | |
| csa_1W:		move.l	(sp)+,a0 ;	mov	(sp)+,d0
 | |
| 		add.l	#4,a0	;	subt	(a0),d0
 | |
| 		blt	6f
 | |
| 		comp	word(a0),d0 ;	bhi	6f
 | |
| 		extend	d0
 | |
| 		asl.l	#2,d0	;	add.l	wrd,d0
 | |
| 		move.l	a0,a1	;	add.l	d0,a1
 | |
| 		move.l	word(a1),d1 ;	bne	5f
 | |
| 6:		sub.l	#4,a0	;	move.l	(a0),d1
 | |
| 		beq	e_case
 | |
| 5:		move.l	d1,a3	;	jmp	(a4)
 | |
| 
 | |
| csb_z:		mov	(sp)+,d0 ;	bra	0f
 | |
| csb_l:		adroff		;	move.w	(a5),d0
 | |
| 0:		comp	wrd,d0 ;	bne	e_illins
 | |
| csb_1W:		move.l	(sp)+,a0 ;	mov	(sp)+,d0
 | |
| 		move.l	a0,a3
 | |
| !Use a3 as a general register
 | |
| 		mov	4(a0),d1 ;	sub.l	#1,d1
 | |
| 		blt	2f
 | |
| 		move.l	wrd,d2 ;	add.l	#4,d2
 | |
| 1:		add.l	d2,a0	;	comp	(a0),d0
 | |
| 		dbeq	d1,1b	;	bne	2f
 | |
| 		move.l	word(a0),d1 ;	beq	e_case
 | |
| 		move.l	d1,a3	;	jmp	(a4)
 | |
| 2:		move.l	(a3),d1	;	beq	e_case
 | |
| 		move.l	d1,a3	;	jmp	(a4)
 | |
| 
 | |
| !-----------------------------------------------------------------------------
 | |
| dch_z:		move.l	(sp)+,a0 ;	move.l	(a0),-(sp)
 | |
| 		move.l	ml,a0	;	cmp.l	(sp),a0
 | |
| 		bls	e_badptr ;	jmp	(a4)
 | |
| 
 | |
| lpb_z:		add.l	#0+l0,(sp) ;	jmp	(a4)
 | |
| 
 | |
| !----------------------------------------------------------------------------
 | |
| 
 | |
| dup_1W:		mov	(sp),-(sp) ;	jmp	(a4)
 | |
| dup_l:		adroff		;	move.w	(a5),d0
 | |
| 		bra	1f
 | |
| dus_z:		mov	(sp)+,d0 ;	bra	0f
 | |
| dus_l:		adroff		;	move.w	(a5),d0
 | |
| 0:		checksize
 | |
| 2:		move.w	(sp)+,d0 ;	bra	1f
 | |
| 4:		move.l	(sp)+,d0
 | |
| 1:		ble	e_oddz ;	bclr	#0,d0
 | |
| 		move.l	sp,a0	;	add.l	d0,a0
 | |
| 		asr.l	wmu,d0	;	sub.l	#1,d0
 | |
| 3:		mov	-(a0),-(sp) ;	dbra	d0,3b
 | |
| 		jmp	(a4)
 | |
| !We do not test if d0 is a word multiple indeed .
 | |
| 
 | |
| !-----------------------------------------------------------------------------
 | |
| exg_z:		mov	(sp)+,d0 ;	bra	0f
 | |
| exg_l:		adroff		;	move.w	(a5),d0
 | |
| 		bra	0f 
 | |
| exg_s0:		move.l	d6,d0	;	move.b	(a3)+,d0
 | |
| 0:		move.l	d7,d1	;	move.l	d0,a0
 | |
| 1:		asri	#1,d0	;	dbcs	d1,1b
 | |
| 		bcs	e_oddz	;	sub.l	#1,d0
 | |
| 		add.l	a0,sp	;	add.l	sp,a0
 | |
| 2:		mov	-(sp),d1 ;	mov	-(a0),(sp)
 | |
| 		mov	d1,(a0)	;	dbra	d0,2b
 | |
| 		jmp	(a4)
 | |
| 
 | |
| gto_q:		move.l	(sp)+,a0 ;	bra	3f
 | |
| gto_l:		move.l	d6,a0	;	move.b	(a3)+,-(sp)
 | |
| 		move.b	(a3)+,1(sp) ;	move.w	(sp)+,a0
 | |
| 3:		add.l	a6,a0	;	move.l	(a0)+,a3
 | |
| 		move.l	(a0)+,sp 
 | |
| #if count+prof+flow
 | |
| !To find the procedure descriptor of the procedure we go to ,we cannot use
 | |
| !the memory place curproc . We need to find the last time this procedure
 | |
| !called. In the frame of that procedure we find the pointer to the procedure
 | |
| !descriptor we need.
 | |
| 2:		move.l	(a2),d0
 | |
| 		cmp.l	(a0),d0
 | |
| 		beq	1f
 | |
| 		move.l	d0,a2
 | |
| 		bra	2b
 | |
| 1:		move.l	8(a2),a2	!a2 ponts at procedure descriptor.
 | |
| 		move.l	8(a2),d0	!countptr in d0.
 | |
| 		move.l	d0,countptr	!initially assume first line
 | |
| 		sub.l	12(a2),d0
 | |
| 		move.l	d0,countfld
 | |
| #endif
 | |
| 		move.l	(a0),a2
 | |
| 		jmp	(a4)
 | |
| 
 | |
| lim_z:		clr.l	d0; move.w ignmask, d0
 | |
| 		mov	d0,-(sp) ;	jmp	(a4)
 | |
| sim_z:		clr.l	d0; mov (sp)+, d0
 | |
| 		move.w	d0,ignmask ;	jmp	(a4)
 | |
| 
 | |
| 	.sect .bss
 | |
| ignmask:  .space 2
 | |
| 	.sect .text
 | |
| 
 | |
| !---------------------------------------------------------------------------
 | |
| lor_s0:		move.l	d6,d0	;	move.b	(a3)+,d0
 | |
| 		bne	1f	;	move.l	a2,-(sp)
 | |
| 		jmp	(a4)
 | |
| 1:		sub.w	#1,d0	;	bne	2f
 | |
| 		move.l	sp,-(sp) ;	jmp	(a4)
 | |
| 2:		sub.w	#1,d0	;	bne	e_illins
 | |
| 		move.l	hp,-(sp) ;	jmp	(a4)
 | |
| 
 | |
| str_s0:		move.l	d6,d0	;	move.b	(a3)+,d0
 | |
| 		bne	1f	;	move.l	(sp)+,a2
 | |
| 		jmp	(a4)
 | |
| 1:		sub.w	#1,d0	;	bne	2f
 | |
| 		move.l	(sp)+,sp ;	claimstack
 | |
| 		jmp	(a4)
 | |
| 2:		sub.w	#1,d0	;	bne	e_illins
 | |
| 		move.l	(sp)+,d1 ;	cmp.l	nd,d1
 | |
| 		bcc	3f					!break
 | |
| 		cmp.l	tblmax,d1 ;	bcs	4f
 | |
| 5:		move.l	d1,hp	;	jmp	(a4)
 | |
| 3:		move.l	d1,-(sp)
 | |
| 		move.l	d1,-(sp) ;	add.l	#1280,(sp)
 | |
| 		bsr	_Xbreak ;	testen	(sp)+
 | |
| 4:		beq	1f ;		testen	(sp)+ ; bsr	e_heap ;
 | |
| 		move.l	(sp)+,d1 ;	jmp	(a4)
 | |
| 1:		move.l	(sp)+,d1 ;	bra	5b
 | |
| 
 | |
| !----------------------------------------------------------------------------
 | |
| rck_z:		mov	(sp)+,d0 ;	bra	0f
 | |
| rck_l:		adroff		;	move.w	(a5),d0
 | |
| 0:		sub.l	wrd,d0	;	beq	rck_1W
 | |
| 		sub.l	wrd,d0	;	bne	e_oddz
 | |
| 		move.l	(sp)+,a0
 | |
| 		mov	(sp),d0	;	comp	(a0),d0 ;	blt	9f
 | |
| 		add.l	wrd,a0	;	bra	1f
 | |
| rck_1W:		move.l	(sp)+,a0
 | |
| 		mov	(sp),d0	;	comp	(a0),d0 ;	blt	9f
 | |
| 1:		comp	word(a0),d0 ;	bgt	9f
 | |
| 		jmp	(a4)
 | |
| 9:		bra	e_range
 | |
| !Temp. solution until trp_z is implemented
 | |
| 
 | |
| !--------------------------------------------------------------------------
 | |
| nop_z:
 | |
| lblnop:		lea	nopln+16,a0 ;	clr.l	d1; mov	(a6),d1
 | |
| 		bsr	itoa	
 | |
| 		lea	nopln+33,a0 ;	move.l	sp,d1
 | |
| 		bsr	itoa
 | |
| 		move.l	#45,-(sp)
 | |
| 		pea	nopln 	;	mov	#1,-(sp)
 | |
| 		bsr	_Xwrite
 | |
| 		add.l	wrd+4,sp
 | |
| 		jmp	(a4)
 | |
| 
 | |
| 	.sect .data
 | |
| nopln:	.asciz	"line number nop              sp             \n"
 | |
| 	.align 2
 | |
| 	.sect .text
 | |
| !unsigned to ascii for integers  , a0 is address of first character
 | |
| ! d1 contains integer. Output is 11 characters of which the first is a space.
 | |
| 
 | |
| 	.sect .text
 | |
| 
 | |
| itoa:		move.l	#9,d4	;	add.l	#11,a0
 | |
| 		move.l	#10,d0
 | |
| 0:		bsr	dvu4	;	add.w	#48,d3
 | |
| 		move.b	d3,-(a0) ;	tst.l	d1
 | |
| 		dbeq	d4,0b
 | |
| 1:		move.b	#32,-(a0) ;	dbra	d4,1b
 | |
| 		rts
 | |
| 
 | |
| !------------------------------------------------------------------------------
 | |
| fil_q:		move.l	(sp)+,a0 ;	bra	3f
 | |
| fil_l:		adroff		;	move.w	(a5),d0
 | |
| 		move.l	d0,a0
 | |
| 3:		add.l	a6,a0	;	cmp.l	4(a6),a0
 | |
| 		beq	0f
 | |
| #if	flow+count+prof
 | |
| 		move.l	curproc,a1
 | |
| 		move.l	8(a1),d0
 | |
| 		sub.l	12(a1),d0
 | |
| 		move.l	d0,countfld		!START COUNTPTR FOR THIS PROC
 | |
| 		move.l	a0,20(a1)		!FILE POINTER IN PROC DES
 | |
| #endif
 | |
| 		move.l	a0,4(a6)
 | |
| 0:		jmp	(a4)
 | |
| 
 | |
| !-----------------------------------------------------------------------------
 | |
| lni_z:		ad	#1,(a6)
 | |
| #if	count+flow+prof
 | |
| 		add.l	#1,countptr
 | |
| #if	prof
 | |
| 		add.l	#4,profile
 | |
| #endif
 | |
| #endif
 | |
| 		bra	8f
 | |
| lin_l:		adroff		;	clr.l	d0
 | |
| 		move.w	(a5),d0 ;	bra 1f
 | |
| lin_q:		move.l	(sp)+,d0 ;	bra	1f
 | |
| lin_s0:		move.l	#0,d0	;	move.b	(a3)+,d0
 | |
| 1:		comp	(a6),d0 ;	beq	9f
 | |
| 		mov	d0,(a6)
 | |
| #if	count+flow+prof
 | |
| 		move.l	countfld,d1
 | |
| 		add.l	d0,d1
 | |
| 		move.l	d1,countptr
 | |
| #if	prof
 | |
| 		asl.l	#2,d1
 | |
| 		add.l	ltime,d1
 | |
| 		move.l	d1,profile
 | |
| #endif
 | |
| #endif
 | |
| 8:
 | |
| #if	last
 | |
| 		bsr	nexttab	;
 | |
| 		move.l	4(a6),(a1)+	!store new line
 | |
| #if	lword
 | |
| 		move.l	(a6),(a1)	!number in buffer lasttable
 | |
| #else
 | |
| 		mov	(a6),d0
 | |
| 		extend	d0
 | |
| 		move.l	d0,(a1)
 | |
| #endif
 | |
| #endif
 | |
| #if	count
 | |
| 		move.l	countptr,d1	!LINE NUMBER IN d1
 | |
| 		asl.l	#2,d1		!MULTIPLY BY 4
 | |
| 		move.l	lcount,a0
 | |
| 		add.l	d1,a0
 | |
| 		add.l	#1,(a0)		!ADD 1 TO THE CORRESPONDING COUNT
 | |
| #endif
 | |
| #if	flow
 | |
| 		move.l	countptr,d1	!LINE NUMBER IN d1
 | |
| 		move.l	#8,d0
 | |
| 		bsr	dvu4 		!QUOTIENT IN d1 REST IN d3
 | |
| 		move.l	lflow,a0
 | |
| 		add.l	d1,a0
 | |
| 		bset	d3,(a0) 	!ATTENTION BIT 0 CORR TO LINE 0
 | |
| #endif
 | |
| !9:		bra	nop_z
 | |
| 9:		jmp	(a4)
 | |
| !----------------------------------------------------------------------------
 | |
| mon_z:		mov	(sp)+,d0 ;	bmi	e_badmon
 | |
| 		cmp.l	#64,d0	;	bge	e_badmon
 | |
| 		move.l	a4,-(sp) ;	asl.l	#2,d0
 | |
| 		add.l	#syscal,d0 ;	move.l	d0,a0
 | |
| 		move.l	(a0),a0	;	jmp	(a0)
 | |
| 
 | |
| 	.sect .data
 | |
| syscal:
 | |
| .data4 e_badmon,	hlt_z,		_Xfork,		_Xread
 | |
| .data4 _Xwrite,		_Xopen,		_Xclose,	_Xwait
 | |
| .data4 _Xcreat,		_Xlink,		_Xunlink,	e_badmon
 | |
| .data4 _Xchdir,		e_badmon,	_Xmknod,	_Xchmod
 | |
| .data4 _Xchown,		_Xbreak,	_Xstat,		_Xlseek
 | |
| .data4 _Xgetpid,	_Xmount, 	_Xumount, 	_Xsetuid
 | |
| .data4 _Xgetuid,	_Xstime, 	_Xptrace, 	_Xalarm
 | |
| .data4 _Xfstat,		_Xpause, 	_Xutime, 	e_badmon
 | |
| .data4 e_badmon,	_Xaccess,	_Xnice, 	_Xftime
 | |
| .data4 _Xsync,		_Xkill, 	e_badmon,	e_badmon
 | |
| .data4 e_badmon, 	_Xdup,		_Xpipe, 	_Xtimes
 | |
| .data4 _Xprofil, 	e_badmon,	_Xsetgid,	_Xgetgid
 | |
| .data4 _sigtrp, 	e_badmon,	e_badmon,	_Xacct
 | |
| .data4 e_badmon, 	e_badmon, 	_Xioctl, 	e_badmon
 | |
| .data4 e_badmon, 	e_badmon,	e_badmon,	_Xexece
 | |
| .data4 _Xumask, 	_Xchroot, 	e_badmon,	e_badmon
 | |
| 
 | |
| 	.sect .text
 |