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, 6
|
|
push h
|
|
lxi h, text
|
|
push h
|
|
lxi h, 1
|
|
push h
|
|
call _write
|
|
jmp EXIT
|
|
|
|
.sect .rom
|
|
text: .ascii "TRAP!\n"
|
|
|