115 lines
1.5 KiB
ArmAsm
115 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"
|