341 lines
		
	
	
	
		
			7.4 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			341 lines
		
	
	
	
		
			7.4 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
e_array:	cl	-(sp)	 ;	bra	error
 | 
						|
e_range:	mov	#0x1,-(sp) ;	bra	error
 | 
						|
e_set:		mov	#0x2,-(sp) ;	bra	error
 | 
						|
e_iovfl:	mov	#0x3,-(sp) ;	bra	error
 | 
						|
e_fovfl:	mov	#0x4,-(sp) ;	bra	error
 | 
						|
e_funfl:	mov	#0x5,-(sp) ;	bra	error
 | 
						|
e_idivz:	mov	#0x6,-(sp) ;	bra	error
 | 
						|
e_fdivz:	mov	#0x7,-(sp) ;	bra	error
 | 
						|
e_iund:		mov	#0x8,-(sp) ;	bra	error
 | 
						|
e_fund:		mov	#0x9,-(sp) ;	bra	error
 | 
						|
e_conv:		mov	#0xA,-(sp) ;	bra	error
 | 
						|
e_stack:	mov	#0x10,-(sp) ;	bra	fatal
 | 
						|
e_heap:		mov	#0x11,-(sp) ;	bra	fatal
 | 
						|
e_illins:	mov	#0x12,-(sp) ;	bra	fatal
 | 
						|
e_oddz:		mov	#0x13,-(sp) ;	bra	fatal
 | 
						|
e_case:		mov	#0x11,-(sp) ;	bra	fatal
 | 
						|
e_memflt:	mov	#0x15,-(sp) ;	bra	fatal
 | 
						|
e_badptr:	mov	#0x16,-(sp) ;	bra	fatal
 | 
						|
e_badpc:	mov	#0x17,-(sp) ;	bra	fatal
 | 
						|
e_badlae:	mov	#0x18,-(sp) ;	bra	error
 | 
						|
e_badmon:	mov	#0x19,-(sp) ;	bra	error
 | 
						|
e_badlin:	mov	#0x1A,-(sp) ;	bra 	error
 | 
						|
e_badgto:	mov	#0x1B,-(sp) ;	bra	error
 | 
						|
 | 
						|
flnim:		mov	#0xB,-(sp) ;	bra	error
 | 
						|
no8bar:		mov	#0xC,-(sp) ;	bra	error
 | 
						|
	.define e_memflt
 | 
						|
!---------------------------------------------------------------------------
 | 
						|
!		ERRORS AND TRAPS
 | 
						|
!----------------------------------------------------------------------------
 | 
						|
fatal:		clr.l	-(sp)			!dummy return address
 | 
						|
		pea	hlt_z			!RETURN FROM FATAL HALTS
 | 
						|
		mov	8(sp),-(sp)
 | 
						|
 | 
						|
error:		movem.l	d0/d1/d2/d3/d4/d5/d6/d7/a0/a1/a2/a3/a4/a5/a6,-(sp)
 | 
						|
		mov	60(sp),d0		!ERROR NUMBER IN d0
 | 
						|
		lea	retsize,a5
 | 
						|
		move.l	#16,d1
 | 
						|
1:		move.w	-(a5),-(sp)
 | 
						|
		dbra	d1,1b
 | 
						|
		cmp.w	#0xB,d0
 | 
						|
		bge	0f		!FATAL ERROR , START ERROR HANDLING
 | 
						|
		move.l	#0x1,d1
 | 
						|
		asl.l	d0,d1
 | 
						|
		move.w	ignmask,d2
 | 
						|
		not.w	d2
 | 
						|
		and.w	d2,d1
 | 
						|
		bne	0f
 | 
						|
		move.l	#16,d1
 | 
						|
		lea	retsize,a5
 | 
						|
1:		move.w	(sp)+,(a5)+
 | 
						|
		dbra	d1,1b
 | 
						|
		movem.l	(sp)+,d0/d1/d2/d3/d4/d5/d6/d7/a0/a1/a2/a3/a4/a5/a6
 | 
						|
 | 
						|
		add.l	wrd,sp		!REMOVE ERROR NUMBER
 | 
						|
		rts
 | 
						|
 | 
						|
0:		move.l	uerrorp,a0
 | 
						|
		cmp.l	#-1,a0
 | 
						|
		beq	notrap
 | 
						|
		mov	d0,-(sp)
 | 
						|
		move.l	uerrorp,-(sp)
 | 
						|
		move.l	#-1,uerrorp		!USER MUST SET TRAP AGAIN
 | 
						|
		bra	cai_z
 | 
						|
 | 
						|
!-----------------------------------------------------------------------------
 | 
						|
rtt_z:		move.l	a2,sp
 | 
						|
		add.l	#0x10,sp		!REMOVE RETURN STATUS BLOCK
 | 
						|
		add.l	wrd,sp			!REMOVE  ERROR NUMBER
 | 
						|
		move.l	#16,d0
 | 
						|
		lea	retsize,a5
 | 
						|
1:		move.w	(sp)+,(a5)+
 | 
						|
		dbra	d0,1b
 | 
						|
		movem.l	(sp)+,d0/d1/d2/d3/d4/d5/d6/d7/a0/a1/a2/a3/a4/a5/a6
 | 
						|
		add.l	wrd,sp
 | 
						|
		rts
 | 
						|
 | 
						|
trp_z:		sub.l	#4,sp
 | 
						|
		mov	4(sp),(sp)		!COPY ERROR NUMBER
 | 
						|
		move.l	a4,word(sp)		!RETURN ADDRESS TO MAIN LOOP
 | 
						|
		bra	error
 | 
						|
 | 
						|
sig_z:		move.l	(sp),d0
 | 
						|
		move.l	uerrorp,(sp)
 | 
						|
		move.l	d0,uerrorp
 | 
						|
		jmp	(a4)
 | 
						|
 | 
						|
	.data
 | 
						|
uerrorp:	.long	0x-1
 | 
						|
	.text
 | 
						|
 | 
						|
!-----------------------------------------------------------------------------
 | 
						|
!FIRST INFORMATION ABOUT THE KIND OF THE ERROR
 | 
						|
notrap:		add.l	#38,sp
 | 
						|
		movem.l	(sp)+,d1/d2/d3/d4/d5/d6/d7/a0/a1/a2/a3/a4/a5/a6
 | 
						|
notrap1:	comp	#28,d0			!ERROR NUMBER STILL IN d0
 | 
						|
!still to make a routine that prints the number of a user set error
 | 
						|
1:		mulu	#21,d0
 | 
						|
		lea	emerr,a0
 | 
						|
		move.l	#20,-(sp)
 | 
						|
		pea	0(a0,d0)
 | 
						|
		mov	#2,-(sp)		!STANDARD ERROR
 | 
						|
		bsr	_write
 | 
						|
		add.l	wrd+4,sp
 | 
						|
!NEXT INFORMATION ABOUT THE LINE NUMBER
 | 
						|
		move.l	(a6),d1
 | 
						|
		lea	emess+14,a0
 | 
						|
		bsr	itoa
 | 
						|
		move.l	#30,-(sp)
 | 
						|
		pea	emess
 | 
						|
		mov	#2,-(sp)
 | 
						|
		bsr	_write
 | 
						|
		add.l	wrd+4,sp
 | 
						|
!NOW INFORMATION ABOUT THE FILES
 | 
						|
2:		move.l	4(a6),a0
 | 
						|
		cmp.l	#0,a0
 | 
						|
		beq	5f
 | 
						|
		move.l	a0,a5
 | 
						|
		sub.l	#4,sp
 | 
						|
		move.l	a5,-(sp)
 | 
						|
		move.l	#-1,d0
 | 
						|
1:		add.l	#1,d0
 | 
						|
		tst.b	(a5)+
 | 
						|
		bne	1b
 | 
						|
		move.l	d0,4(sp)
 | 
						|
		mov	#2,-(sp)
 | 
						|
		bsr	_write
 | 
						|
		add.l	wrd+4,sp
 | 
						|
5:		move.w	#0x0A,-(sp)
 | 
						|
		move.l	#2,-(sp)
 | 
						|
		pea	4(sp)
 | 
						|
		mov	#2,-(sp)
 | 
						|
		bsr	_write
 | 
						|
		add.l	wrd+6,sp
 | 
						|
		comp	#0xB,(sp)
 | 
						|
		beq	1f
 | 
						|
 | 
						|
		move.l	#-1,argc
 | 
						|
		clr.l	-(sp)		!dummy return address
 | 
						|
		bra	hlt_z
 | 
						|
 | 
						|
1:		add.l	wrd,sp
 | 
						|
		jmp	(a4)
 | 
						|
 | 
						|
!---------------------------------------------------------------------------
 | 
						|
!		EXIT HANDLING
 | 
						|
!--------------------------------------------------------------------------
 | 
						|
hlt_z:		add.l	#4,sp		!remove return address
 | 
						|
#if	prof
 | 
						|
	.data
 | 
						|
emprof:	.asciz	"em_profile\0"
 | 
						|
	.align 2
 | 
						|
	.bss
 | 
						|
profile: .space 4
 | 
						|
ltime:	.space 4
 | 
						|
profsiz: .space	4
 | 
						|
	.text
 | 
						|
		mov	#0x1B6,-(sp)
 | 
						|
		pea	emprof
 | 
						|
		bsr	_creat
 | 
						|
		testen	(sp)+
 | 
						|
		mov	(sp)+,d0
 | 
						|
		move.l	profsiz,-(sp)
 | 
						|
		move.l	ltime,-(sp)		!LTIME IS POINTER AT TABLE
 | 
						|
		mov	d0,-(sp)
 | 
						|
		bsr	_write
 | 
						|
		add.l	wrd+4,sp
 | 
						|
#endif
 | 
						|
#if flow
 | 
						|
		mov	#0x1B6,-(sp)
 | 
						|
		pea	emflow
 | 
						|
		bsr	_creat
 | 
						|
		testen	(sp)+
 | 
						|
		mov	(sp)+,d0
 | 
						|
		move.l	flowsiz,-(sp)
 | 
						|
		move.l	lflow,-(sp)
 | 
						|
		mov	d0,-(sp)
 | 
						|
		bsr	_write
 | 
						|
		add.l	wrd+4,sp
 | 
						|
	.data
 | 
						|
emflow:	.asciz	"em_flow\0"
 | 
						|
	.align 2
 | 
						|
	.bss
 | 
						|
lflow:	.space 4
 | 
						|
flowsiz: .space 4
 | 
						|
	.text
 | 
						|
#endif
 | 
						|
#if	count
 | 
						|
		mov	#0x1B6,-(sp)
 | 
						|
		pea	emcount
 | 
						|
		bsr	_creat
 | 
						|
		testen	(sp)+
 | 
						|
		mov	(sp)+,d0
 | 
						|
		move.l	countsiz,-(sp)
 | 
						|
		move.l	lcount,-(sp)
 | 
						|
		mov	d0,-(sp)
 | 
						|
		bsr	_write
 | 
						|
		add.l	wrd+4,sp
 | 
						|
	.data
 | 
						|
emcount: .asciz	"em_count\0"
 | 
						|
	.align 2
 | 
						|
	.bss
 | 
						|
lcount: .space 4
 | 
						|
countsiz: .space 4
 | 
						|
#endif
 | 
						|
#if opfreq
 | 
						|
	.data
 | 
						|
emopf:	.asciz	"em_opfreq\0"
 | 
						|
	.align
 | 
						|
	.bss
 | 
						|
counttab:  .space	1884
 | 
						|
	.text
 | 
						|
		mov	#0x1B6,-(sp)
 | 
						|
		pea	emopf
 | 
						|
		bsr	_creat
 | 
						|
		testen	(sp)+
 | 
						|
		mov	(sp)+,d0
 | 
						|
		move.l	#1884,-(sp)
 | 
						|
		pea	counttab
 | 
						|
		mov	d0,-(sp)
 | 
						|
		bsr	_write
 | 
						|
		add.l	wrd+4,sp
 | 
						|
#endif
 | 
						|
#if count+flow+prof
 | 
						|
	.bss
 | 
						|
countfld: .space 4			!COUNT NUMBER - NUMBER OF LINE 1 OF PROC
 | 
						|
countptr: .space 4			!COUNT NUMBER OF CURRENT LINE
 | 
						|
#endif
 | 
						|
#if	last
 | 
						|
	.text
 | 
						|
		mov	#0x1B6,-(sp)
 | 
						|
		pea	emlast
 | 
						|
		bsr	_creat
 | 
						|
		testen	(sp)+
 | 
						|
		mov	(sp)+,d6	!d6 contains file descriptor
 | 
						|
		cmp.l	#-1,linused-4	!test if buffer is fully used
 | 
						|
		beq	0f
 | 
						|
		bsr	nexttab
 | 
						|
		bra	1f
 | 
						|
0:		lea	lasttable,a5
 | 
						|
1:		tst.l	(a5)
 | 
						|
		bne	2f		!exists entry in table
 | 
						|
		move.l	#22,-(sp)	!here case no lines processed
 | 
						|
		pea	mess1
 | 
						|
		mov	d6,-(sp)
 | 
						|
		bsr	_write
 | 
						|
		add.l	wrd+4,sp
 | 
						|
		bra	9f
 | 
						|
2:		move.l	#7,-(sp)	!announce new file name
 | 
						|
		pea	mess2
 | 
						|
		mov	d6,-(sp)
 | 
						|
		bsr	_write
 | 
						|
		add.l	wrd+4,sp
 | 
						|
		move.l	(a5),d7
 | 
						|
		move.l	d7,a0		!keep file pointer in d7
 | 
						|
		clr.l	(a5)+		!this will stop the printing
 | 
						|
		move.l	#-1,d1		!d1 will contain length of file name
 | 
						|
3:		add.l	#1,d1
 | 
						|
		tst.b	(a0)+
 | 
						|
		bne	3b
 | 
						|
		move.l	d1,-(sp)
 | 
						|
		move.l	d7,-(sp)
 | 
						|
		mov	d6,-(sp)
 | 
						|
		bsr	_write
 | 
						|
		add.l	wrd+4,sp
 | 
						|
4:		move.l	(a5),d1		!next print line numbers
 | 
						|
		lea	mess3,a0
 | 
						|
		bsr	itoa
 | 
						|
		move.l	#12,-(sp)
 | 
						|
		pea	mess3
 | 
						|
		mov	d6,-(sp)
 | 
						|
		bsr	_write
 | 
						|
		add.l	wrd+4,sp
 | 
						|
		bsr	nexttab
 | 
						|
		tst.l	(a5)		!in case 0 no more lines
 | 
						|
		beq	9f
 | 
						|
		cmp.l	(a5),d7
 | 
						|
		bne	2b		!new file name
 | 
						|
		clr.l	(a5)+		!skip file name
 | 
						|
		bra	4b		!only new line
 | 
						|
9:
 | 
						|
	.data
 | 
						|
emlast:	.asciz	"em_last"
 | 
						|
mess1:	.asciz	"no line processed yet\n"
 | 
						|
mess2:	.asciz	"\nfile :"
 | 
						|
mess3:	.asciz	"           \n"
 | 
						|
	.align 2
 | 
						|
	.bss
 | 
						|
lasttable:  .space  128
 | 
						|
linused:    .space  4
 | 
						|
#endif
 | 
						|
	.text
 | 
						|
halt:		bsr	_exit
 | 
						|
 | 
						|
	.data
 | 
						|
emerr:
 | 
						|
.asciz	"ARRAY BOUND ERROR  \n"
 | 
						|
.asciz	"RANGE BOUND ERROR  \n"
 | 
						|
.asciz	"SET BOUND ERROR    \n"
 | 
						|
.asciz	"INTEGER OVERFLOW   \n"
 | 
						|
.asciz	"FLOATING OVERFLOW  \n"
 | 
						|
.asciz	"FLOATING UNDERFLOW \n"
 | 
						|
.asciz	"INT. DIV. BY ZERO  \n"
 | 
						|
.asciz	"DIVIDE BY 0.0      \n"
 | 
						|
.asciz	"UNDEFINED INTEGER  \n"
 | 
						|
.asciz	"UNDEFINED FLOAT    \n"
 | 
						|
.asciz	"CONVERSION ERROR   \n"
 | 
						|
.asciz	"NO FLOATING POINT  \n"
 | 
						|
.asciz	"NO 8 BYTE ARITH.   \n"
 | 
						|
.asciz	"NO LOAD FILE       \n"
 | 
						|
.asciz	"LOAD FILE ERROR    \n"
 | 
						|
.asciz	"PROGRAM TOO LARGE  \n"
 | 
						|
.asciz	"STACK OVERFLOW     \n"
 | 
						|
.asciz	"HEAP OVERFLOW      \n"
 | 
						|
.asciz	"ILLEGAL INSTRUCTION\n"
 | 
						|
.asciz	"ILLEGAL SIZE ARG.  \n"
 | 
						|
.asciz	"CASE  ERROR        \n"
 | 
						|
.asciz	"ADDRESS NON EX. MEM\n"
 | 
						|
.asciz	"BAD POINTER USED   \n"
 | 
						|
.asciz	"PR COUNT. OUT RANGE\n"
 | 
						|
.asciz	"BAD ARG. OF LAE    \n"
 | 
						|
.asciz	"BAD MONITOR CALL   \n"
 | 
						|
.asciz	"ARG OF LIN TOO HIGH\n"
 | 
						|
.asciz	"GTO DESCR. ERROR   \n"
 | 
						|
.asciz	"BAD RETURN SIZE    \n"
 | 
						|
emess:
 | 
						|
.asciz	"ON SOURCE LINE             OF\n"
 | 
						|
.align 2
 | 
						|
!-----------------------------------------------------------------------------
 | 
						|
!	SUBROUTINES FOR THE INTERPRETOR
 | 
						|
!------------------------------------------------------------------------------
 | 
						|
	.text
 | 
						|
#if	last
 | 
						|
nexttab:	move.l  linused,a5
 | 
						|
		add.l	#8,a5
 | 
						|
		cmp.l	#linused,a5	!top of buffer reached?
 | 
						|
		bne	1f		!if so back to bottom
 | 
						|
		sub.l	#128,a5
 | 
						|
1:		move.l	a5,linused
 | 
						|
		rts
 | 
						|
#endif
 |