221 lines
2.9 KiB
ArmAsm
221 lines
2.9 KiB
ArmAsm
|
#
|
||
|
! $Source$
|
||
|
! $State$
|
||
|
! $Revision$
|
||
|
|
||
|
! Declare segments (the order is important).
|
||
|
|
||
|
.sect .text
|
||
|
.sect .rom
|
||
|
.sect .data
|
||
|
.sect .bss
|
||
|
|
||
|
.define .trp
|
||
|
.define earray, erange, eset, eiovfl, efovfl, efunfl, eidivz, eidivz
|
||
|
.define efdivz, eiund, efund, econv, estack, eheap, eillins, eoddz
|
||
|
.define ecase, ememflt, ebadptr, ebadpc, ebadlae, ebadmon, ebadlin, ebadgto
|
||
|
.define eunimpl
|
||
|
|
||
|
.sect .text
|
||
|
|
||
|
! Trap routine
|
||
|
! Expects trap number on stack.
|
||
|
! Just returns if trap has to be ignored.
|
||
|
! Otherwise it calls a user-defined trap handler if provided.
|
||
|
! When no user-defined trap handler is provided or when the user-defined
|
||
|
! trap handler causes a new trap, a message is printed
|
||
|
! and control is returned to the monitor.
|
||
|
|
||
|
EARRAY = 0
|
||
|
ERANGE = 1
|
||
|
ESET = 2
|
||
|
EIOVFL = 3
|
||
|
EFOVFL = 4
|
||
|
EFUNFL = 5
|
||
|
EIDIVZ = 6
|
||
|
EFDIVZ = 7
|
||
|
EIUND = 8
|
||
|
EFUND = 9
|
||
|
ECONV = 10
|
||
|
ESTACK = 16
|
||
|
EHEAP = 17
|
||
|
EILLINS = 18
|
||
|
EODDZ = 19
|
||
|
ECASE = 20
|
||
|
EMEMFLT = 21
|
||
|
EBADPTR = 22
|
||
|
EBADPC = 23
|
||
|
EBADLAE = 24
|
||
|
EBADMON = 25
|
||
|
EBADLIN = 26
|
||
|
EBADGTO = 27
|
||
|
EUNIMPL = 63 ! unimplemented em-instruction called
|
||
|
|
||
|
earray: lxi h,EARRAY
|
||
|
push h
|
||
|
call .trp
|
||
|
ret
|
||
|
|
||
|
erange: lxi h,ERANGE
|
||
|
push h
|
||
|
call .trp
|
||
|
ret
|
||
|
|
||
|
eset: lxi h,ESET
|
||
|
push h
|
||
|
call .trp
|
||
|
ret
|
||
|
|
||
|
eiovfl: lxi h,EIOVFL
|
||
|
push h
|
||
|
call .trp
|
||
|
ret
|
||
|
|
||
|
efovfl: lxi h,EFOVFL
|
||
|
push h
|
||
|
call .trp
|
||
|
ret
|
||
|
|
||
|
efunfl: lxi h,EFUNFL
|
||
|
push h
|
||
|
call .trp
|
||
|
ret
|
||
|
|
||
|
eidivz: lxi h,EIDIVZ
|
||
|
push h
|
||
|
call .trp
|
||
|
ret
|
||
|
|
||
|
efdivz: lxi h,EFDIVZ
|
||
|
push h
|
||
|
call .trp
|
||
|
ret
|
||
|
|
||
|
eiund: lxi h,EIUND
|
||
|
push h
|
||
|
call .trp
|
||
|
ret
|
||
|
|
||
|
efund: lxi h,EFUND
|
||
|
push h
|
||
|
call .trp
|
||
|
ret
|
||
|
|
||
|
econv: lxi h,ECONV
|
||
|
push h
|
||
|
call .trp
|
||
|
ret
|
||
|
|
||
|
estack: lxi h,ESTACK
|
||
|
push h
|
||
|
call .trp
|
||
|
ret
|
||
|
|
||
|
eheap: lxi h,EHEAP
|
||
|
push h
|
||
|
call .trp
|
||
|
ret
|
||
|
|
||
|
eillins:lxi h,EILLINS
|
||
|
push h
|
||
|
call .trp
|
||
|
ret
|
||
|
|
||
|
eoddz: lxi h,EODDZ
|
||
|
push h
|
||
|
call .trp
|
||
|
ret
|
||
|
|
||
|
ecase: lxi h,ECASE
|
||
|
push h
|
||
|
call .trp
|
||
|
ret
|
||
|
|
||
|
ememflt:lxi h,EMEMFLT
|
||
|
push h
|
||
|
call .trp
|
||
|
ret
|
||
|
|
||
|
ebadptr:lxi h,EBADPTR
|
||
|
push h
|
||
|
call .trp
|
||
|
ret
|
||
|
|
||
|
ebadpc: lxi h,EBADPC
|
||
|
push h
|
||
|
call .trp
|
||
|
ret
|
||
|
|
||
|
ebadlae:lxi h,EBADLAE
|
||
|
push h
|
||
|
call .trp
|
||
|
ret
|
||
|
|
||
|
ebadmon:lxi h,EBADMON
|
||
|
push h
|
||
|
call .trp
|
||
|
ret
|
||
|
|
||
|
ebadlin:lxi h,EBADLIN
|
||
|
push h
|
||
|
call .trp
|
||
|
ret
|
||
|
|
||
|
ebadgto:lxi h,EBADGTO
|
||
|
push h
|
||
|
call .trp
|
||
|
ret
|
||
|
|
||
|
eunimpl:lxi h,EUNIMPL
|
||
|
push h
|
||
|
call .trp
|
||
|
ret
|
||
|
|
||
|
.trp:
|
||
|
pop h
|
||
|
xthl
|
||
|
push h ! trap number and return address exchanged
|
||
|
mov a,l
|
||
|
cpi 16
|
||
|
jnc 3f ! jump if trap cannot be ignored
|
||
|
|
||
|
! check if trap has to be ignored
|
||
|
xchg ! de = trap number
|
||
|
lhld .ignmask
|
||
|
push h ! hl = set to be tested
|
||
|
push d
|
||
|
call .inn2 ! de = 1 if bit is set, 0 otherwise
|
||
|
mov a,e
|
||
|
rar
|
||
|
jnc 3f ! jump if trap should not be ignored
|
||
|
pop h ! remove trap number
|
||
|
ret ! OGEN DICHT EN ... SPRING!!!
|
||
|
|
||
|
3:
|
||
|
lhld .trapproc ! user defined trap handler?
|
||
|
mov a,l
|
||
|
ora h
|
||
|
jz 1f ! jump if there was not
|
||
|
xra a
|
||
|
sta .trapproc ! .trapproc := 0
|
||
|
sta .trapproc+1
|
||
|
lxi d,2f
|
||
|
push d
|
||
|
pchl ! call user defined trap handler
|
||
|
2:
|
||
|
pop d
|
||
|
ret
|
||
|
1:
|
||
|
lxi h, 1
|
||
|
push h
|
||
|
lxi h, text
|
||
|
push h
|
||
|
lxi h, 6
|
||
|
push h
|
||
|
call _write
|
||
|
jmp EXIT
|
||
|
|
||
|
.sect .rom
|
||
|
text: .ascii "TRAP!\n"
|
||
|
|