477 lines
		
	
	
	
		
			10 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			477 lines
		
	
	
	
		
			10 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
| 	.define e_memflt
 | |
| .sect .text
 | |
| .sect .rom
 | |
| .sect .data
 | |
| .sect .bss
 | |
| .sect .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	error
 | |
| e_illins:	mov	#0x12,-(sp) ;	bra	fatal
 | |
| e_oddz:		mov	#0x13,-(sp) ;	bra	fatal
 | |
| e_case:		mov	#0x14,-(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:		bra	e_illins
 | |
| no8bar:		bra	e_oddz
 | |
| !---------------------------------------------------------------------------
 | |
| !		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,a1
 | |
| 		move.l	eb,a6			!JUST TO BE SURE
 | |
| 		move.l	#16,d1
 | |
| 1:		move.w	-(a1),-(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,a1
 | |
| 1:		move.w	(sp)+,(a1)+
 | |
| 		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,a1
 | |
| 1:		move.w	(sp)+,(a1)+
 | |
| 		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)
 | |
| 
 | |
| 	.sect .data
 | |
| uerrorp:	.data4	0x-1
 | |
| 	.sect .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	#29,d0			!ERROR NUMBER STILL IN d0
 | |
| 		blt	1f			!START PRINTING ERROR
 | |
| 		extend	d0			!NUMBER.
 | |
| 		move.l	d0,d1
 | |
| 		lea	erno+5,a0
 | |
| 		bsr	itoa
 | |
| 		move.l	#609,d0
 | |
| 		bra	2f
 | |
| 1:		mulu	#21,d0
 | |
| 2:		lea	emerr,a0
 | |
| 		move.l	#20,-(sp)
 | |
| 		pea	0(a0,d0)
 | |
| 		mov	#2,-(sp)		!STANDARD ERROR
 | |
| 		bsr	_Xwrite
 | |
| 		add.l	wrd+4,sp
 | |
| !NEXT INFORMATION ABOUT THE LINE NUMBER
 | |
| 		clr.l	d1
 | |
| 		mov	(a6),d1
 | |
| 		lea	emess+14,a0
 | |
| 		bsr	itoa
 | |
| 		move.l	#30,-(sp)
 | |
| 		pea	emess
 | |
| 		mov	#2,-(sp)
 | |
| 		bsr	_Xwrite
 | |
| 		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,a1
 | |
| 		sub.l	#4,sp
 | |
| 		move.l	a1,-(sp)
 | |
| 		move.l	#-1,d0
 | |
| 1:		add.l	#1,d0
 | |
| 		tst.b	(a1)+
 | |
| 		bne	1b
 | |
| 		move.l	d0,4(sp)
 | |
| 		mov	#2,-(sp)
 | |
| 		bsr	_Xwrite
 | |
| 		add.l	wrd+4,sp
 | |
| 5:		move.w	#0x0A,-(sp)
 | |
| 		move.l	#2,-(sp)
 | |
| 		pea	4(sp)
 | |
| 		mov	#2,-(sp)
 | |
| 		bsr	_Xwrite
 | |
| 		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
 | |
| 	.sect .data
 | |
| emprof:	.asciz	"em_profile\0"
 | |
| 	.align 2
 | |
| 	.sect .bss
 | |
| profile: .space 4
 | |
| ltime:	.space 4
 | |
| profsiz: .space	4
 | |
| 	.sect .text
 | |
| 		tst.l	firstp
 | |
| 		beq	lhalt
 | |
| 		pea	emprof
 | |
| 		bsr	_Xunlink
 | |
| 		testen	(sp)+
 | |
| 		blt	1f
 | |
| 		mov	#0x1B6,-(sp)
 | |
| 		pea	emprof
 | |
| 		bsr	_Xcreat
 | |
| 		testen	(sp)+
 | |
| 		blt	1f
 | |
| 		mov	(sp)+,d0
 | |
| 		move.l	ltime,a4	!a4 points at bottem of prof table
 | |
| 		bsr	tabprint
 | |
| 1:
 | |
| #endif
 | |
| #if flow
 | |
| 		tst.l	firstp
 | |
| 		beq	lhalt
 | |
| 		pea 	emflow
 | |
| 		bsr	_Xunlink
 | |
| 		testen	(sp)+
 | |
| 		blt	1f
 | |
| 		mov	#0x1B6,-(sp)
 | |
| 		pea	emflow
 | |
| 		bsr	_Xcreat
 | |
| 		testen	(sp)+
 | |
| 		blt	1f
 | |
| 		mov	(sp)+,d0
 | |
| 		move.l	flowsiz,-(sp)
 | |
| 		move.l	lflow,-(sp)
 | |
| 		mov	d0,-(sp)
 | |
| 		bsr	_Xwrite
 | |
| 		testen	(sp)+
 | |
| 		blt	1f
 | |
| 		add.l	#4,sp
 | |
| 	.sect .data
 | |
| emflow:	.asciz	"em_flow\0"
 | |
| 	.align 2
 | |
| 	.sect .bss
 | |
| lflow:	.space 4
 | |
| flowsiz: .space 4
 | |
| 	.sect .text
 | |
| 1:
 | |
| #endif
 | |
| #if	count
 | |
| 		tst.l	firstp
 | |
| 		beq	lhalt
 | |
| 		pea	emcount
 | |
| 		bsr	_Xunlink
 | |
| 		testen	(sp)+
 | |
| 		blt	1f
 | |
| 		mov	#0x1B6,-(sp)
 | |
| 		pea	emcount
 | |
| 		bsr	_Xcreat
 | |
| 		testen	(sp)+
 | |
| 		blt	1f
 | |
| 		mov	(sp)+,d0
 | |
| 		move.l	lcount,a4
 | |
| 		bsr	tabprint
 | |
| 1:
 | |
| 	.sect .data
 | |
| emcount: .asciz	"em_count\0"
 | |
| 	.align 2
 | |
| 	.sect .bss
 | |
| lcount: .space 4
 | |
| countsiz: .space 4
 | |
| #endif
 | |
| #if opfreq
 | |
| 	.sect .data
 | |
| emopf:	.asciz	"em_opfreq\0"
 | |
| 	.align
 | |
| 	.sect .bss
 | |
| counttab:  .space	1892
 | |
| 	.sect .text
 | |
| 		pea	emopf
 | |
| 		bsr	_Xunlink
 | |
| 		testen	(sp)+
 | |
| 		blt	1f
 | |
| 		mov	#0x1B6,-(sp)
 | |
| 		pea	emopf
 | |
| 		bsr	_Xcreat
 | |
| 		testen	(sp)+
 | |
| 		blt	1f
 | |
| 		mov	(sp)+,d0
 | |
| 		move.l	#1884,-(sp)
 | |
| 		pea	counttab
 | |
| 		mov	d0,-(sp)
 | |
| 		bsr	_Xwrite
 | |
| 		testen	(sp)+
 | |
| 		blt	1f
 | |
| 		add.l	#4,sp
 | |
| 1:
 | |
| #endif
 | |
| #if count+flow+prof
 | |
| 	.sect .bss
 | |
| countfld: .space 4			!COUNT NUMBER - NUMBER OF LINE 1 OF PROC
 | |
| countptr: .space 4			!COUNT NUMBER OF CURRENT LINE
 | |
| #endif
 | |
| lhalt:
 | |
| #if	last
 | |
| 	.sect .text
 | |
| 		pea	emlast
 | |
| 		bsr	_Xunlink
 | |
| 		testen	(sp)+
 | |
| 		blt	halt
 | |
| 		mov	#0x1B6,-(sp)
 | |
| 		pea	emlast
 | |
| 		bsr	_Xcreat
 | |
| 		testen	(sp)+
 | |
| 		blt	halt
 | |
| 		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,a1
 | |
| 1:		tst.l	(a1)
 | |
| 		bne	2f		!exists entry in table
 | |
| 		move.l	#22,-(sp)	!here case no lines processed
 | |
| 		pea	mess1
 | |
| 		mov	d6,-(sp)
 | |
| 		bsr	_Xwrite
 | |
| 		testen	(sp)+
 | |
| 		blt	halt
 | |
| 		add.l	#4,sp
 | |
| 		bra	9f
 | |
| 2:		move.l	a1,-(sp)
 | |
| 		move.l	#7,-(sp)	!announce new file name
 | |
| 		pea	mess2
 | |
| 		mov	d6,-(sp)
 | |
| 		bsr	_Xwrite
 | |
| 		testen	(sp)+
 | |
| 		blt	halt
 | |
| 		add.l	#4,sp
 | |
| 		move.l	(sp)+,a1
 | |
| 		move.l	(a1),d7
 | |
| 		move.l	d7,a0		!keep file pointer in d7
 | |
| 		clr.l	(a1)+		!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	a1,-(sp)
 | |
| 		move.l	d1,-(sp)
 | |
| 		move.l	d7,-(sp)
 | |
| 		mov	d6,-(sp)
 | |
| 		bsr	_Xwrite
 | |
| 		add.l	wrd+4,sp
 | |
| 		move.l	(sp)+,a1
 | |
| 4:		move.l	(a1),d1		!next print line numbers
 | |
| 		lea	mess3,a0
 | |
| 		bsr	itoa
 | |
| 		move.l	a1,-(sp)
 | |
| 		move.l	#12,-(sp)
 | |
| 		pea	mess3
 | |
| 		mov	d6,-(sp)
 | |
| 		bsr	_Xwrite
 | |
| 		testen	(sp)+
 | |
| 		blt	halt
 | |
| 		add.l	#4,sp
 | |
| 		move.l	(sp)+,a1
 | |
| 		bsr	nexttab
 | |
| 		tst.l	(a1)		!in case 0 no more lines
 | |
| 		beq	9f
 | |
| 		cmp.l	(a1),d7
 | |
| 		bne	2b		!new file name
 | |
| 		clr.l	(a1)+		!skip file name
 | |
| 		bra	4b		!only new line
 | |
| 9:
 | |
| 	.sect .data
 | |
| emlast:	.asciz	"em_last"
 | |
| mess1:	.asciz	"no line processed yet\n"
 | |
| mess2:	.asciz	"\nfile :"
 | |
| mess3:	.asciz	"           \n"
 | |
| 	.align 2
 | |
| 	.sect .bss
 | |
| lasttable:  .space  512
 | |
| linused:    .space  4
 | |
| #endif
 | |
| 	.sect .text
 | |
| halt:		bsr	_Xexit
 | |
| 
 | |
| 	.sect .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"
 | |
| erno:
 | |
| .asciz	"ERRNO              \n"
 | |
| emess:
 | |
| .asciz	"ON SOURCE LINE             OF\n"
 | |
| .align 2
 | |
| !-----------------------------------------------------------------------------
 | |
| !	SUBROUTINES FOR THE INTERPRETOR
 | |
| !------------------------------------------------------------------------------
 | |
| 	.sect .text
 | |
| #if	last
 | |
| nexttab:	move.l  linused,a1
 | |
| 		add.l	#8,a1
 | |
| 		cmp.l	#linused,a1	!top of buffer reached?
 | |
| 		bne	1f		!if so back to bottom
 | |
| 		sub.l	#512,a1
 | |
| 1:		move.l	a1,linused
 | |
| 		rts
 | |
| #endif
 | |
| #if count+prof
 | |
| !SUBROUTINE FOR PRINTING TABLES . EXPECTS BOTTOM OF TABLE IN a4 AND FILE
 | |
| !DESCRIPTOR IN d0 .IN maxcount NUMBER OF 4 BYTE WORDS IN THE TABLE.
 | |
| 	.sect .text
 | |
| tabprint:	mov	d0,-(sp)	!KEEP FILE DESCRIPTOR FOR WRITING
 | |
| 		lea	buffer,a3
 | |
| 		move.l	firstp,a1	!IN a1 POINTER TO CURRENT PROC.
 | |
| 		move.l	#0,a2		!IN a2 POINTER TO FILENAME .
 | |
| 2:		move.l	16(a1),d0
 | |
| 		beq	9f		!LAST PROCEDURE , EXCEPTION .
 | |
| 		move.l	d0,a6		!IN a6 POINTER TO NEXT PROCEDURE .
 | |
| 7:		move.l	8(a6),d7	!COUNTPTR OF NEXT IN d7
 | |
| 		bne	8f
 | |
| 		move.l	16(a6),d0
 | |
| 		beq	9f
 | |
| 		move.l	d0,a6
 | |
| 		bra	7b
 | |
| 8:		move.l	8(a1),d6	!COUNTPTR OF CURRENT IN d6.
 | |
| 		move.l	12(a1),d5	!FIRST LINE NUMBER IN d5.
 | |
| 		beq	1f		!NO LINES : GO ON.
 | |
| 		cmp.l	20(a1),a2	!START PRINTING FILE NAME .
 | |
| 		beq	6f		!NO NEW NAME.
 | |
| 		move.l	20(a1),a2	!NEW FILE NAME.
 | |
| 		cmp.l	#0,a2		!NO FILE NAME .
 | |
| 		beq	6f
 | |
| 		move.l	#0,d1		!START SCANNING FILE NAME
 | |
| 5:		move.b	(a2),d0		!d1 WILL CONTAIN NUMBER OF SYMBOLS.
 | |
| 		beq	4f
 | |
| 		add.l	#1,d1
 | |
| 		add.l	#1,a2
 | |
| 		bra	5b
 | |
| 4:		sub.l	d1,a2
 | |
| 		move.l	d1,-(sp)
 | |
| 		move.l	a2,-(sp)
 | |
| 		mov	8(sp),-(sp)	!WRITE FILE NAME.
 | |
| 		bsr	_Xwrite
 | |
| 		testen	(sp)+
 | |
| 		blt	3f
 | |
| 		add.l	#4,sp	!CLEAN STACK.
 | |
| 6:		sub.l	d6,d7		!IN d7 NUMBER OF LINES OF CURRENT PROC.
 | |
| 		asl.l	#2,d6
 | |
| 0:		move.l	a3,a0
 | |
| 		move.l	d5,d1		!SET UP FOR CALLING itoa.
 | |
| 		bsr	itoa
 | |
| 		lea	11(a3),a0
 | |
| 		move.l	0(a4,d6),d1
 | |
| 		bsr	itoa
 | |
| 		move.l	#23,-(sp)
 | |
| 		pea	buffer
 | |
| 		mov	8(sp),-(sp)
 | |
| 		bsr	_Xwrite		!PRINT LINE NUMBER AND INTEGER .
 | |
| 		testen	(sp)+
 | |
| 		blt	3f
 | |
| 		add.l	#4,sp	!CLEAN STACK.
 | |
| 		add.l	#1,d5		!NEXT LINE NUMBER .
 | |
| 		add.l	#4,d6		!NEXT COUNT.
 | |
| 		sub.l	#1,d7		!ONE LINE LESS TO GO.
 | |
| 		bhi	0b
 | |
| 1:		move.l	a6,a1
 | |
| 		cmp.l	#0,a1
 | |
| 		bne	2b
 | |
| 		add.l	wrd,sp		!REMOVE FILE DESCR.
 | |
| 		rts			!READY.
 | |
| 9:		move.l	maxcount,d7
 | |
| 		move.l	#0,a6		!NO NEXT PROCEDURE.
 | |
| 		bra	8b
 | |
| 3:
 | |
| 		testen	(sp)+
 | |
| 		testen	(sp)+
 | |
| 		rts
 | |
| 
 | |
| 	.sect .data
 | |
| buffer: .asciz "                      \n"
 | |
| 	.sect .text
 | |
| #endif
 |