ack/mach/6500/libem/trap.s
1991-08-30 15:19:38 +00:00

136 lines
2 KiB
ArmAsm

.define Trap
.sect .text
.sect .rom
.sect .data
.sect .bss
.sect .text
! This subroutine performs the trap instruction.
Trap:
txa
cmp #64
bcc 1f
2: jmp Dotrap
1: bmi 2b
pha
lda IGNMASK ! get bitmask (lowbyte)
sta ARTH
lda IGNMASK+1 ! get bitmask (highbyte)
2: lsr a
ror ARTH ! shiftright bitmask n times
dex
bne 2b
lda #1
and ARTH
bne 3f
pla ! clear hardware_stack
jmp Dotrap
3: pla ! clear hardware_stack
rts
Dotrap:
sta TRAPVAL
lda #0
cmp ERRPROC+1
bne 1f ! ERRPROC <> 0 (highbyte)
cmp ERRPROC
bne 1f ! ERRPROC <> 0 (lowbyte)
jmp Mtrap
1: lda #0
ldx #RETURN
jsr Ldi ! save return area
lda hol0+5
ldx hol0+4
jsr Push ! save filename pointer
lda hol0+1
ldx hol0
jsr Push ! save linenumber
lda ERRPROC
sta ADDR ! address of errorhandler (lowbyte)
lda ERRPROC+1
sta ADDR+1 ! address of errorhandler (highbyte)
lda #0
sta ERRPROC ! reset ERRPROC (lowbyte)
sta ERRPROC+1 ! reset ERRPROC (highbyte)
ldx TRAPVAL
jsr Push
jmp (ADDR) ! proceed with errorhandler
Mtrap:
cpx #0
bne 1f
lda #[EARRAY].h
ldx #[EARRAY].l
jsr Mprint
jmp errorend
1: cpx #1
bne 1f
lda #[ERANGE].h
ldx #[ERANGE].l
jsr Mprint
jmp errorend
1: cpx #2
bne 1f
lda #[ESET].h
ldx #[ESET].l
jsr Mprint
jmp errorend
1: cpx #3
bne 1f
lda #[EIOVFL].h
ldx #[EIOVFL].l
jsr Mprint
jmp errorend
1: cpx #10
bne 1f
lda #[ECONV].h
ldx #[ECONV].l
jsr Mprint
jmp errorend
1: cpx #16
bne 1f
lda #[ESTACK].h
ldx #[ESTACK].l
jsr Mprint
jmp errorend
1: cpx #17
bne 1f
lda #[EHEAP].h
ldx #[EHEAP].l
jsr Mprint
jmp errorend
1: cpx #19
bne 1f
lda #[EODDZ].h
ldx #[EODDZ].l
jsr Mprint
jmp errorend
1: cpx #20
bne 1f
lda #[ECASE].h
ldx #[ECASE].l
jsr Mprint
jmp errorend
1: cpx #25
bne 1f
lda #[EBADMON].h
ldx #[EBADMON].l
jsr Mprint
jmp errorend
1: cpx #26
bne 1f
lda #[EBADLIN].h
ldx #[EBADLIN].l
jsr Mprint
jmp errorend
1: cpx #27
bne errorend
lda #[EBADGTO].h
ldx #[EBADGTO].l
jsr Mprint
errorend:
ldx TRAPVAL
jsr Push
jsr __exit