123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220 |
- #
- ! $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"
|