114 lines
		
	
	
	
		
			1.5 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			114 lines
		
	
	
	
		
			1.5 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
| .sect .text ; .sect .rom; .sect .data; .sect .bss
 | |
| .define .trpdivz
 | |
| .define .trpilin
 | |
| .define .trpcase
 | |
| .define .trprang
 | |
| .define .trpset
 | |
| .define .trpnofp
 | |
| .define .trpheap
 | |
| .define .trp
 | |
| .define .stop
 | |
| 
 | |
| .sect .text
 | |
| .extern .trpdivz
 | |
| .extern .trpilin
 | |
| .extern .trpcase
 | |
| .extern .trprang
 | |
| .extern .trpset
 | |
| .extern .trpnofp
 | |
| .extern .trpheap
 | |
| .extern .trp
 | |
| 
 | |
| .trpdivz:
 | |
| mov ax,6
 | |
| mov dx,.Mdivz
 | |
| jmp .Trp
 | |
| .trpilin:
 | |
| mov ax,18
 | |
| mov dx,.Milin
 | |
| jmp .Trp
 | |
| .trpcase:
 | |
| mov ax,20
 | |
| mov dx,.Mcase
 | |
| jmp .Trp
 | |
| .trprang:
 | |
| mov ax,1
 | |
| mov dx,.Mrang
 | |
| jmp .Trp
 | |
| .trpset:
 | |
| mov ax,2
 | |
| mov dx,.Mset
 | |
| jmp .Trp
 | |
| .trpnofp:
 | |
| mov ax,18
 | |
| mov dx,.Mnofp
 | |
| jmp .Trp
 | |
| .trpheap:
 | |
| mov ax,17
 | |
| mov dx,.Mheap
 | |
| jmp .Trp
 | |
| 
 | |
| .Trp:
 | |
| xor     bx,bx
 | |
| .extern .trppc
 | |
| xchg    bx,(.trppc)
 | |
| test    bx,bx
 | |
| jz      2f
 | |
| push    ax
 | |
| call    (bx)
 | |
| pop     ax
 | |
| ret
 | |
| 2:
 | |
| mov bx,22
 | |
| push bx
 | |
| push dx
 | |
| mov ax,2
 | |
| push ax
 | |
| call _write
 | |
| .stop:
 | |
| call _exit
 | |
| 
 | |
| .trp:
 | |
| mov dx,ax
 | |
| cmp dx,21
 | |
| jae 1f
 | |
| sal dx,1
 | |
| mov bx,.Mtable
 | |
| add bx,dx
 | |
| mov bx,(bx)
 | |
| test bx,bx
 | |
| jz 1f
 | |
| mov dx,bx
 | |
| jmp 2f
 | |
| 1:
 | |
| mov bx,.Mtrp+14
 | |
| mov cx,6
 | |
| mov dx,ax
 | |
| 1:
 | |
| and dx,7
 | |
| add dx,'0'
 | |
| movb (bx),dl
 | |
| dec bx
 | |
| sar dx,1
 | |
| sar dx,1
 | |
| sar dx,1
 | |
| loop 1b
 | |
| mov dx,.Mtrp
 | |
| 2:
 | |
| jmp .Trp
 | |
| 
 | |
| .sect .rom
 | |
| .Mtable:
 | |
| 	.data2 0,	.Mrang,	.Mset,	0,	0,	0,	.Mdivz,	0
 | |
| 	.data2 0,	0,	0,	0,	0,	0,	0,	0
 | |
| 	.data2 0,	.Mheap,	.Milin,	.Milin,	.Mcase
 | |
| 
 | |
| .Mdivz: .asciz "Error: Division by 0 \n"
 | |
| .Milin: .asciz "Illegal EM instruct'n\n"
 | |
| .Mcase: .asciz "Err in EM case instr \n"
 | |
| .Mrang: .asciz "Variable out of range\n"
 | |
| .Mset:  .asciz "Err in EM set instr  \n"
 | |
| .Mnofp: .asciz "Floating pt not impl.\n"
 | |
| .Mheap: .asciz "Heap overflow        \n"
 | |
| 
 | |
| .Mtrp:	.asciz "EM trap 0000000 octal\n"
 |